x
 
1
module svge.build {
2
3
  export function buildEmbedFiles(drive: persistence.Drive) {
4
5
    var svgeBase = '/svge-embed/editor/';
6
7
    var htmlinput = drive.read(svgeBase + 'svg-editor.html');
8
9
    var pars = new DOMParser();
10
    var docu = pars.parseFromString(htmlinput, 'text/html');
11
12
    // embed linked CSS
13
    var linkElems = docu.getElementsByTagName('link');
14
    for (var i = 0; i < linkElems.length; i++) {
15
      processLinkElem(linkElems[i]);
16
    }
17
18
    // embed src scripts
19
    var scriptElems = docu.getElementsByTagName('script');
20
    for (var i = 0; i < scriptElems.length; i++) {
21
      processScriptElem(scriptElems[i]);
22
    }
23
24
    var resultHTML = docu.body.parentElement.outerHTML;
25
26
    var decoratedHTML = resultHTML.
27
      replace(/\-\-(\**)\>/g, '--*$1>').
28
      replace(/\<(\**)\!/g, '<*$1!');
29
30
    var wrappedHTML = '<' + '!' + '-- /shell/index.html\n' + decoratedHTML + '\n --' + '>';
31
32
    return wrappedHTML;
33
34
    function processLinkElem(lin: HTMLLinkElement) {
35
      var href = lin.href || lin.getAttribute('href');
36
      if (!lin.rel || lin.rel.toLowerCase() !== 'stylesheet' || !href) {
37
        console.log('skip lin ', lin);
38
        return;
39
      }
40
41
      var path = svgeBase + href;
42
      var txt = drive.read(path);
43
      var sty = docu.createElement('style');
44
      if ('text' in sty) (<any>sty).text = txt;
45
      else if ('textContent' in sty) sty.textContent = txt;
  • boot
    • base.d.ts
      declare function getText(element: Element): string;
      declare function getText(fn: Function): string;
      
      declare function setText(element: Element, text: string): void;
      
      declare function elem(tag: string): HTMLElement;
      declare function elem(tag: string, style: {}, parent?: Element): HTMLElement;
      declare function elem(tag: string, parent: Element): HTMLElement;
      declare function elem(elem: HTMLElement, style: {}, parent?: Element): HTMLElement;
      
      
      declare function on(obj: Node, eventName: string, handler: (evt: Event) => void);
      declare function on(obj: Window, eventName: string, handler: (evt: Event) => void);
      declare function on(obj: Node, eventName: string, handler: (evt: Event) => void);
      declare function off(obj: Window, eventName: string, handler: (evt: Event) => void);
      
      declare function createFrame(): createFrame.LoadedResult;
      
      declare module createFrame {
        export interface LoadedResult {
          global: Window;
          document: Document; 
          iframe: HTMLIFrameElement;
          evalFN(code: string): any;
        }
      }
    • base.ts
      function base(window: Window) {
      
        return {
          getText,
          setText,
          elem,
          on, off,
          createFrame,
          apply
        };
      
        function apply() {
          (<any>window).getText = getText;
          (<any>window).setText = setText;
          (<any>window).elem = elem;
          (<any>window).on = on;
          (<any>window).off = off;
          (<any>window).createFrame = createFrame;
        }
      
        function getText(obj) {
      
          if (typeof obj === 'function') {
            var result = /\/\*(\*(?!\/)|[^*])*\*\//m.exec(obj + '')[0];
            if (result) result = result.slice(2, result.length - 2);
            return result;
          }
          else if (/^SCRIPT$/i.test(obj.tagName)) {
            if ('text' in obj)
              return obj.text;
            else
              return obj.innerHTML;
          }
          else if (/^STYLE$/i.test(obj.tagName)) {
            if ('text' in obj)
              return obj.text;
            else if (obj.styleSheet)
              return obj.styleSheet.cssText;
            else
              return obj.innerHTML;
          }
          else if ('textContent' in obj) {
            return obj.textContent;
          }
          else if (/^INPUT$/i.test(obj.tagName)) {
            return obj.value;
          }
          else {
            var result: string = obj.innerText;
            if (result) {
              // IE fixes
              result = result.replace(/\<BR\s*\>/g, '\n').replace(/\r\n/g, '\n');
            }
            return result || '';
          }
        }
      
        function setText(obj, text) {
      
          if (/^SCRIPT$/i.test(obj.tagName)) {
            if ('text' in obj)
              obj.text = text;
            else
              obj.innerHTML = text;
          }
          else if (/^STYLE$/i.test(obj.tagName)) {
            if ('text' in obj) {
              obj.text = text;
            }
            else if ('styleSheet' in obj) {
              if (!obj.styleSheet && !obj.type) obj.type = 'text/css';
              obj.styleSheet.cssText = text;
            }
            else if ('textContent' in obj) {
              obj.textContent = text;
            }
            else {
              obj.innerHTML = text;
            }
          }
          else if ('textContent' in obj) {
            if ('type' in obj && !obj.type) obj.type = 'text/css';
            obj.textContent = text;
          }
          else if (/^INPUT$/i.test(obj.tagName)) {
            obj.value = text;
          }
          else {
            obj.innerText = text;
          }
        }
      
        function on(obj, eventName, handler) {
          if (obj.addEventListener) {
            obj.addEventListener(eventName, handler, false);
          }
          else if (obj.attachEvent) {
            obj.attachEvent('on' + eventName, handler);
          }
          else {
            obj['on' + eventName] = function(e) { return handler(e || window.event); };
          }
        };
      
        function off(obj, eventName, handler) {
          if (obj.removeEventListener) {
            obj.removeEventListener(eventName, handler, false);
          }
          else if (obj.detachEvent) {
            obj.detachEvent('on' + eventName, handler);
          }
          else {
            if (obj['on' + eventName])
              obj['on' + eventName] = null;
          }
        };
      
        function elem(tag, style, parent) {
          var e = tag.tagName ? tag : window.document.createElement(tag);
      
          if (!parent && style && style.tagName) {
            parent = style;
            style = null;
          }
      
          if (style) {
            if (typeof style === 'string') {
              setText(e, style);
            }
            else {
              for (var k in style) if (style.hasOwnProperty(k)) {
                if (k === 'text') {
                  setText(e, style[k]);
                }
                else if (k === 'className') {
                  e.className = style[k];
                }
                else if (!(e.style && k in e.style) && k in e) {
                  e[k] = style[k];
                }
                else {
      
                  if (style[k] && typeof style[k] === 'object' && typeof style[k].length === 'number') {
                    // array: iterate and apply values
                    var applyValues = style[k];
                    for (var i = 0; i < applyValues.length; i++) {
                      try { e.style[k] = applyValues[i]; }
                      catch (errApplyValues) { }
                    }
                  }
                  else {
                    // not array
                    try {
                      e.style[k] = style[k];
                    }
                    catch (err) {
                      try {
                        if (typeof console !== 'undefined' && typeof console.error === 'function')
                          console.error(e.tagName + '.style.' + k + '=' + style[k] + ': ' + err.message);
                      }
                      catch (whatevs) {
                        alert(e.tagName + '.style.' + k + '=' + style[k] + ': ' + err.message);
                      }
                    }
                  }
                }
              }
            }
          }
      
          if (parent) {
            try {
              parent.appendChild(e);
            }
            catch (error) {
              throw new Error(error.message + ' adding ' + e.tagName + ' to ' + parent.tagName);
            }
          }
      
          return e;
        }
      
        function createFrame() {
      
          var ifr = elem(
            'iframe',
            {
              position: 'absolute',
              left: 0, top: 0,
              width: '100%', height: '100%',
              border: 'none',
              src: 'about:blank'
            },
            window.document.body);
      
          var ifrwin = ifr.contentWindow || ifr.window;
          var ifrdoc = ifrwin.document;
      
          if (ifrdoc.open) ifrdoc.open();
          ifrdoc.write(
            '<!' + 'doctype html' + '>' +
            '<' + 'html' + '>' +
            '<' + 'head' + '><' + 'style' + '>' +
            'body,html{margin:0;padding:0;border:none;height:100%;border:none;}' +
            '*,*:before,*:after{box-sizing:inherit;}' +
            'html{box-sizing:border-box;}' +
            '</' + 'style' + '>\n' +
      
            '<' + 'body' + '>' +
      
            '<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
      
            // it's important to have body before any long scripts (especialy external),
            // so IFRAME is immediately ready
            '<' + 'body' + '>' +
      
            '</' + 'html' + '>');
          if (ifrdoc.close) ifrdoc.close();
      
          var ifrwin_eval = ifrwin.__eval_export_;
          try {
            delete (<any>ifrwin).__eval_export_;
          }
          catch (weirdIEFailure) {
            // no big deal if it fails
          }
      
          ifrdoc.body.innerHTML = '';
      
          if (window.onerror) {
            ifrwin.onerror = delegate_onerror;
          }
      
          return {
            document: ifrdoc,
            global: ifrwin,
            iframe: ifr,
            evalFN: ifrwin_eval
          };
      
          function delegate_onerror() {
            window.onerror.apply(window, arguments);
          }
      
        }
      
      }
    • bootUI.js
      function bootUI(document, window, base) {
      
        base.elem(document.body, {
          background: 'rgb(3,11,61)',
          color: 'cyan',
          border: 'none',
          overflow: 'hidden',
          fontFamily: 'Segoe UI Light, Segoe UI, Ubuntu Light, Ubuntu, Toronto, Helvetica, Roboto, Droid Sans, Sans Serif'
        });
      
        base.elem('div', {
          innerHTML:
          	'<table style="width:100%;filter:blur(2.5px);-webkit-filter:blur(2.5px);-ms-filter: DXImageTransform.Microsoft.Blur(PixelRadius=\'2.5\');" width=100%><tr><td style="width:50%;" width=50% valign=top>'+
          	'<div style="color: white">'+
              '<div style="background: darkcyan; width: 33%; margin-top:0.5em;padding-left:0.5em;">######</div>'+
              '<div style="margin-left:0.5em;">'+
                '##### <br>'+
                '###'+
              '</div>'+
              '<div style="margin-left:0.5em;">'+
                '******* <br>'+
                '*********** <br>'+
                '*********** <br>'+
                '************ <br>'+
                '************* <br>'+
                '**************** ** <br>'+
                '*************** <br>'+
                '************' +
              '</div>'+
            '</div>'+
          	'</td><td style="width:50%; padding: 0.5em;" width=50% valign=top>'+
          	'<div style="color: white">'+
          	'-- <br>'+
          	'#### <br>'+
          	'####### <br>'+
          	'#### <br>'+
          	'#### <br>'+
          	'#### #### <br>' +
          	'######## <br>' +
          	'##### <br>'+
          	'####### <br>' +
          	'#######' +
          	'</div>'+
          	'***** ** <br>'+
          	'**** **** <br>'+
          	'*********' +
          	'</td></tr></table>'
        }, document.body);
      
      
        var progressContainer = base.elem('div', {
          position: 'absolute',
          left: 0, top: 0,
          padding: '3em'
        }, document.body);
      
        var header = base.elem('h2', {
          text: 'Mini portabled shell',
          color: 'white',
          fontWeight: '100',
          fontSize: '500%',
          marginBottom: 0, paddingBottom: 0,
          textShadow: '1px 1px 3px black'
        }, progressContainer);
      
        var smallTitle = base.elem('div', {
          fontStyle: 'italic',
          paddingLeft: '1em',
          textShadow: '1px 1px 3px black',
          text: 'Loading...',
          opacity: 0.8
        }, progressContainer);
      
        var bootBar = base.elem('div', {
          marginTop: '2em',
          background: 'gold', color: 'gold',
          height: '2px',
          width: '3%',
          fontSize: '10%',
          innerHTML: '&nbsp;'
        }, progressContainer);
      
        var darkBottom = base.elem('div', {
          position: 'absolute',
          bottom: 0,
          width: '100%',
          height: '3em',
          background: 'black'
        }, document.body);
      
        return {
          title: function(t, ratio) {
            setText(smallTitle,t);
            if (typeof console !== 'undefined' && typeof console.log === 'function')
              console.log(t);
            if (ratio) {
              bootBar.style.width = (ratio*100) + '%';
            }
          },
          loaded: function() {
            setText(smallTitle, 'Loaded.');
          }
        };
      }
    • earlyBoot.ts
      function earlyBoot(window: Window) {
      
        base(window).apply();
      
        (<any>window).__boot_times.earlyBootStart = (+new Date());
      
        document.write(
          '<' + 'style' + ' data-legit=mi>' +
          '*{display:none;background:black;color:black;}' +
          'html,body{display:block;background:black;color:black;}' +
          '</' + 'style' + '>' +
          (document.body ? '' : '<body>'));
      
        elem(document.body, {
          height: '100%',
          margin: 0,
          padding: 0,
          overflow: 'hidden',
          background: 'black', color: 'black'
        });
        elem(document.body.parentElement, {
          overflow: 'hidden',
          background: 'black', color: 'black'
        });
      
        var allStyleElements = document.getElementsByTagName('style');
        var addedStyle = allStyleElements[allStyleElements.length - 1];
      
        var bootFrame: any = createFrame();
        bootFrame.iframe.style.zIndex = <any>2000;
        bootFrame.iframe.style.display = 'block';
      
        base(bootFrame.global).apply();
      
        var bootUI = (<any>window).bootUI;
      
        var bootAPI = bootUI(bootFrame.document, bootFrame.global, { elem: (<any>bootFrame.global).elem });
        bootFrame.api = bootAPI;
        bootFrame.earlyStartTime = (<any>window).__boot_times.onerror_start;
        bootFrame.bootStartTime = (<any>window).__boot_times.earlyBootStart;
      
        var uniqueKey = deriveUniqueKey(location);
      
        var shellLoaderInstance = null;
        var shellLoadInterval = setInterval(function() {
          if ((<any>window).shellLoader === 'undefined') return;
          if (!shellLoadInterval) return; // protect against old Opera's super-async habits
          shellLoaderInstance = shellLoaderInstance ? shellLoaderInstance.continueLoading() : (<any>window).shellLoader ? (<any>window).shellLoader(uniqueKey, document, bootFrame) : null;
        }, 1);
      
        window.onload = function() {
      
          clearInterval(shellLoadInterval);
          shellLoadInterval = 0;
      
          removeSpyElements();
          bootFrame.iframe.style.zIndex = <any>1000;
          if (addedStyle.parentElement)
            addedStyle.parentElement.removeChild(addedStyle);
          bootFrame.iframe.style.display = '';
      
          (shellLoaderInstance || (<any>window).shellLoader(uniqueKey, document, bootFrame)).finishLoading();
      
        };
      
        function deriveUniqueKey(locationSeed) {
          var key = (locationSeed + '').split('?')[0].split('#')[0].toLowerCase();
      
          var posIndexTrail = key.search(/\/index\.html$/);
          if (posIndexTrail > 0) key = key.slice(0, posIndexTrail);
      
          if (key.charAt(0) === '/')
            key = key.slice(1);
          if (key.slice(-1) === '/')
            key = key.slice(0, key.length - 1);
      
          return smallHash(key) + '-' + smallHash(key.slice(1) + 'a');
      
          function smallHash(key) {
            for (var h = 0, i = 0; i < key.length; i++) {
              h = Math.pow(31, h + 31 / key.charCodeAt(i));
              h -= h | 0;
            }
            return (h * 2000000000) | 0;
          }
      
        }
      
        function removeSpyElements() {
      
          removeElements('iframe', function(ifr) { return ifr !== bootFrame.iframe; });
          removeElements('style', function(sty) { return sty.getAttribute('data-legit') !== 'mi'; });
          removeElements('script', function(sty) { return sty.getAttribute('data-legit') !== 'mi'; });
      
          function removeElements(tagName, predicateToRemove) {
            var list = document.getElementsByTagName(tagName);
            for (var i = 0; i < list.length; i++) {
              var elem = list[i] || list.item(i);
              if (predicateToRemove(elem)) {
                elem.parentElement.removeChild(elem);
                i--;
              }
            }
          }
        }
      
      }
    • onerror.js
      window.__boot_times = window.__boot_times || {};
      window.__boot_times.onerror_start = +new Date();
      
      window.onerror = function onerror() {
      
        var msg = [];
        for (var i = 0; i < arguments.length; i++) {
          var a = arguments[i];
          if (a && (typeof a === 'object')) {
      
            if (a.stack) {
              msg.push(a.stack);
            }
            else {
              var msg1 = [];
              for (var k in a) {
                var r = a[k];
                if (typeof r === 'function' || (typeof r === 'object' && !r)) continue;
                msg1.push(k+':'+r);
              }
              msg.push(msg1.join(', '));
            }
          }
          else {
            msg.push(a===null ? 'null' : a);
          }
      
        }
      
        alert(msg.join('\n'));
      
      }
  • isolation
    • noapi
      • imports
        • base64-js
          • b64.js
            var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
            
            ;(function (exports) {
              'use strict'
            
              var Arr = (typeof Uint8Array !== 'undefined')
                ? Uint8Array
                : Array
            
              var PLUS = '+'.charCodeAt(0)
              var SLASH = '/'.charCodeAt(0)
              var NUMBER = '0'.charCodeAt(0)
              var LOWER = 'a'.charCodeAt(0)
              var UPPER = 'A'.charCodeAt(0)
              var PLUS_URL_SAFE = '-'.charCodeAt(0)
              var SLASH_URL_SAFE = '_'.charCodeAt(0)
            
              function decode (elt) {
                var code = elt.charCodeAt(0)
                if (code === PLUS || code === PLUS_URL_SAFE) return 62 // '+'
                if (code === SLASH || code === SLASH_URL_SAFE) return 63 // '/'
                if (code < NUMBER) return -1 // no match
                if (code < NUMBER + 10) return code - NUMBER + 26 + 26
                if (code < UPPER + 26) return code - UPPER
                if (code < LOWER + 26) return code - LOWER + 26
              }
            
              function b64ToByteArray (b64) {
                var i, j, l, tmp, placeHolders, arr
            
                if (b64.length % 4 > 0) {
                  throw new Error('Invalid string. Length must be a multiple of 4')
                }
            
                // the number of equal signs (place holders)
                // if there are two placeholders, than the two characters before it
                // represent one byte
                // if there is only one, then the three characters before it represent 2 bytes
                // this is just a cheap hack to not do indexOf twice
                var len = b64.length
                placeHolders = b64.charAt(len - 2) === '=' ? 2 : b64.charAt(len - 1) === '=' ? 1 : 0
            
                // base64 is 4/3 + up to two characters of the original data
                arr = new Arr(b64.length * 3 / 4 - placeHolders)
            
                // if there are placeholders, only get up to the last complete 4 chars
                l = placeHolders > 0 ? b64.length - 4 : b64.length
            
                var L = 0
            
                function push (v) {
                  arr[L++] = v
                }
            
                for (i = 0, j = 0; i < l; i += 4, j += 3) {
                  tmp = (decode(b64.charAt(i)) << 18) | (decode(b64.charAt(i + 1)) << 12) | (decode(b64.charAt(i + 2)) << 6) | decode(b64.charAt(i + 3))
                  push((tmp & 0xFF0000) >> 16)
                  push((tmp & 0xFF00) >> 8)
                  push(tmp & 0xFF)
                }
            
                if (placeHolders === 2) {
                  tmp = (decode(b64.charAt(i)) << 2) | (decode(b64.charAt(i + 1)) >> 4)
                  push(tmp & 0xFF)
                } else if (placeHolders === 1) {
                  tmp = (decode(b64.charAt(i)) << 10) | (decode(b64.charAt(i + 1)) << 4) | (decode(b64.charAt(i + 2)) >> 2)
                  push((tmp >> 8) & 0xFF)
                  push(tmp & 0xFF)
                }
            
                return arr
              }
            
              function uint8ToBase64 (uint8) {
                var i
                var extraBytes = uint8.length % 3 // if we have 1 byte left, pad 2 bytes
                var output = ''
                var temp, length
            
                function encode (num) {
                  return lookup.charAt(num)
                }
            
                function tripletToBase64 (num) {
                  return encode(num >> 18 & 0x3F) + encode(num >> 12 & 0x3F) + encode(num >> 6 & 0x3F) + encode(num & 0x3F)
                }
            
                // go through the array every three bytes, we'll deal with trailing stuff later
                for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
                  temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
                  output += tripletToBase64(temp)
                }
            
                // pad the end with zeros, but make sure to not forget the extra bytes
                switch (extraBytes) {
                  case 1:
                    temp = uint8[uint8.length - 1]
                    output += encode(temp >> 2)
                    output += encode((temp << 4) & 0x3F)
                    output += '=='
                    break
                  case 2:
                    temp = (uint8[uint8.length - 2] << 8) + (uint8[uint8.length - 1])
                    output += encode(temp >> 10)
                    output += encode((temp >> 4) & 0x3F)
                    output += encode((temp << 2) & 0x3F)
                    output += '='
                    break
                  default:
                    break
                }
            
                return output
              }
            
              exports.toByteArray = b64ToByteArray
              exports.fromByteArray = uint8ToBase64
            }(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
            
        • buffer
          • index.js
            /*!
             * The buffer module from node.js, for the browser.
             *
             * @author   Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
             * @license  MIT
             */
            
            var base64 = require('base64-js')
            var ieee754 = require('ieee754')
            var isArray = require('is-array')
            
            exports.Buffer = Buffer
            exports.SlowBuffer = SlowBuffer
            exports.INSPECT_MAX_BYTES = 50
            Buffer.poolSize = 8192 // not used by this implementation
            
            var kMaxLength = 0x3fffffff
            var rootParent = {}
            
            /**
             * If `Buffer.TYPED_ARRAY_SUPPORT`:
             *   === true    Use Uint8Array implementation (fastest)
             *   === false   Use Object implementation (most compatible, even IE6)
             *
             * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
             * Opera 11.6+, iOS 4.2+.
             *
             * Note:
             *
             * - Implementation must support adding new properties to `Uint8Array` instances.
             *   Firefox 4-29 lacked support, fixed in Firefox 30+.
             *   See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
             *
             *  - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
             *
             *  - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
             *    incorrect length in some situations.
             *
             * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they will
             * get the Object implementation, which is slower but will work correctly.
             */
            Buffer.TYPED_ARRAY_SUPPORT = (function () {
              try {
                var buf = new ArrayBuffer(0)
                var arr = new Uint8Array(buf)
                arr.foo = function () { return 42 }
                return arr.foo() === 42 && // typed array instances can be augmented
                    typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`
                    new Uint8Array(1).subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`
              } catch (e) {
                return false
              }
            })()
            
            /**
             * Class: Buffer
             * =============
             *
             * The Buffer constructor returns instances of `Uint8Array` that are augmented
             * with function properties for all the node `Buffer` API functions. We use
             * `Uint8Array` so that square bracket notation works as expected -- it returns
             * a single octet.
             *
             * By augmenting the instances, we can avoid modifying the `Uint8Array`
             * prototype.
             */
            function Buffer (arg) {
              if (!(this instanceof Buffer)) {
                // Avoid going through an ArgumentsAdaptorTrampoline in the common case.
                if (arguments.length > 1) return new Buffer(arg, arguments[1])
                return new Buffer(arg)
              }
            
              this.length = 0
              this.parent = undefined
            
              // Common case.
              if (typeof arg === 'number') {
                return fromNumber(this, arg)
              }
            
              // Slightly less common case.
              if (typeof arg === 'string') {
                return fromString(this, arg, arguments.length > 1 ? arguments[1] : 'utf8')
              }
            
              // Unusual.
              return fromObject(this, arg)
            }
            
            function fromNumber (that, length) {
              that = allocate(that, length < 0 ? 0 : checked(length) | 0)
              if (!Buffer.TYPED_ARRAY_SUPPORT) {
                for (var i = 0; i < length; i++) {
                  that[i] = 0
                }
              }
              return that
            }
            
            function fromString (that, string, encoding) {
              if (typeof encoding !== 'string' || encoding === '') encoding = 'utf8'
            
              // Assumption: byteLength() return value is always < kMaxLength.
              var length = byteLength(string, encoding) | 0
              that = allocate(that, length)
            
              that.write(string, encoding)
              return that
            }
            
            function fromObject (that, object) {
              if (Buffer.isBuffer(object)) return fromBuffer(that, object)
            
              if (isArray(object)) return fromArray(that, object)
            
              if (object == null) {
                throw new TypeError('must start with number, buffer, array or string')
              }
            
              if (typeof ArrayBuffer !== 'undefined' && object.buffer instanceof ArrayBuffer) {
                return fromTypedArray(that, object)
              }
            
              if (object.length) return fromArrayLike(that, object)
            
              return fromJsonObject(that, object)
            }
            
            function fromBuffer (that, buffer) {
              var length = checked(buffer.length) | 0
              that = allocate(that, length)
              buffer.copy(that, 0, 0, length)
              return that
            }
            
            function fromArray (that, array) {
              var length = checked(array.length) | 0
              that = allocate(that, length)
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            // Duplicate of fromArray() to keep fromArray() monomorphic.
            function fromTypedArray (that, array) {
              var length = checked(array.length) | 0
              that = allocate(that, length)
              // Truncating the elements is probably not what people expect from typed
              // arrays with BYTES_PER_ELEMENT > 1 but it's compatible with the behavior
              // of the old Buffer constructor.
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            function fromArrayLike (that, array) {
              var length = checked(array.length) | 0
              that = allocate(that, length)
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            // Deserialize { type: 'Buffer', data: [1,2,3,...] } into a Buffer object.
            // Returns a zero-length buffer for inputs that don't conform to the spec.
            function fromJsonObject (that, object) {
              var array
              var length = 0
            
              if (object.type === 'Buffer' && isArray(object.data)) {
                array = object.data
                length = checked(array.length) | 0
              }
              that = allocate(that, length)
            
              for (var i = 0; i < length; i += 1) {
                that[i] = array[i] & 255
              }
              return that
            }
            
            function allocate (that, length) {
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                // Return an augmented `Uint8Array` instance, for best performance
                that = Buffer._augment(new Uint8Array(length))
              } else {
                // Fallback: Return an object instance of the Buffer class
                that.length = length
                that._isBuffer = true
              }
            
              var fromPool = length !== 0 && length <= Buffer.poolSize >>> 1
              if (fromPool) that.parent = rootParent
            
              return that
            }
            
            function checked (length) {
              // Note: cannot use `length < kMaxLength` here because that fails when
              // length is NaN (which is otherwise coerced to zero.)
              if (length >= kMaxLength) {
                throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
                                     'size: 0x' + kMaxLength.toString(16) + ' bytes')
              }
              return length | 0
            }
            
            function SlowBuffer (subject, encoding) {
              if (!(this instanceof SlowBuffer)) return new SlowBuffer(subject, encoding)
            
              var buf = new Buffer(subject, encoding)
              delete buf.parent
              return buf
            }
            
            Buffer.isBuffer = function isBuffer (b) {
              return !!(b != null && b._isBuffer)
            }
            
            Buffer.compare = function compare (a, b) {
              if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
                throw new TypeError('Arguments must be Buffers')
              }
            
              if (a === b) return 0
            
              var x = a.length
              var y = b.length
            
              var i = 0
              var len = Math.min(x, y)
              while (i < len) {
                if (a[i] !== b[i]) break
            
                ++i
              }
            
              if (i !== len) {
                x = a[i]
                y = b[i]
              }
            
              if (x < y) return -1
              if (y < x) return 1
              return 0
            }
            
            Buffer.isEncoding = function isEncoding (encoding) {
              switch (String(encoding).toLowerCase()) {
                case 'hex':
                case 'utf8':
                case 'utf-8':
                case 'ascii':
                case 'binary':
                case 'base64':
                case 'raw':
                case 'ucs2':
                case 'ucs-2':
                case 'utf16le':
                case 'utf-16le':
                  return true
                default:
                  return false
              }
            }
            
            Buffer.concat = function concat (list, length) {
              if (!isArray(list)) throw new TypeError('list argument must be an Array of Buffers.')
            
              if (list.length === 0) {
                return new Buffer(0)
              } else if (list.length === 1) {
                return list[0]
              }
            
              var i
              if (length === undefined) {
                length = 0
                for (i = 0; i < list.length; i++) {
                  length += list[i].length
                }
              }
            
              var buf = new Buffer(length)
              var pos = 0
              for (i = 0; i < list.length; i++) {
                var item = list[i]
                item.copy(buf, pos)
                pos += item.length
              }
              return buf
            }
            
            function byteLength (string, encoding) {
              if (typeof string !== 'string') string = String(string)
            
              if (string.length === 0) return 0
            
              switch (encoding || 'utf8') {
                case 'ascii':
                case 'binary':
                case 'raw':
                  return string.length
                case 'ucs2':
                case 'ucs-2':
                case 'utf16le':
                case 'utf-16le':
                  return string.length * 2
                case 'hex':
                  return string.length >>> 1
                case 'utf8':
                case 'utf-8':
                  return utf8ToBytes(string).length
                case 'base64':
                  return base64ToBytes(string).length
                default:
                  return string.length
              }
            }
            Buffer.byteLength = byteLength
            
            // pre-set for values that may exist in the future
            Buffer.prototype.length = undefined
            Buffer.prototype.parent = undefined
            
            // toString(encoding, start=0, end=buffer.length)
            Buffer.prototype.toString = function toString (encoding, start, end) {
              var loweredCase = false
            
              start = start | 0
              end = end === undefined || end === Infinity ? this.length : end | 0
            
              if (!encoding) encoding = 'utf8'
              if (start < 0) start = 0
              if (end > this.length) end = this.length
              if (end <= start) return ''
            
              while (true) {
                switch (encoding) {
                  case 'hex':
                    return hexSlice(this, start, end)
            
                  case 'utf8':
                  case 'utf-8':
                    return utf8Slice(this, start, end)
            
                  case 'ascii':
                    return asciiSlice(this, start, end)
            
                  case 'binary':
                    return binarySlice(this, start, end)
            
                  case 'base64':
                    return base64Slice(this, start, end)
            
                  case 'ucs2':
                  case 'ucs-2':
                  case 'utf16le':
                  case 'utf-16le':
                    return utf16leSlice(this, start, end)
            
                  default:
                    if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
                    encoding = (encoding + '').toLowerCase()
                    loweredCase = true
                }
              }
            }
            
            Buffer.prototype.equals = function equals (b) {
              if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
              if (this === b) return true
              return Buffer.compare(this, b) === 0
            }
            
            Buffer.prototype.inspect = function inspect () {
              var str = ''
              var max = exports.INSPECT_MAX_BYTES
              if (this.length > 0) {
                str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
                if (this.length > max) str += ' ... '
              }
              return '<Buffer ' + str + '>'
            }
            
            Buffer.prototype.compare = function compare (b) {
              if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
              if (this === b) return 0
              return Buffer.compare(this, b)
            }
            
            Buffer.prototype.indexOf = function indexOf (val, byteOffset) {
              if (byteOffset > 0x7fffffff) byteOffset = 0x7fffffff
              else if (byteOffset < -0x80000000) byteOffset = -0x80000000
              byteOffset >>= 0
            
              if (this.length === 0) return -1
              if (byteOffset >= this.length) return -1
            
              // Negative offsets start from the end of the buffer
              if (byteOffset < 0) byteOffset = Math.max(this.length + byteOffset, 0)
            
              if (typeof val === 'string') {
                if (val.length === 0) return -1 // special case: looking for empty string always fails
                return String.prototype.indexOf.call(this, val, byteOffset)
              }
              if (Buffer.isBuffer(val)) {
                return arrayIndexOf(this, val, byteOffset)
              }
              if (typeof val === 'number') {
                if (Buffer.TYPED_ARRAY_SUPPORT && Uint8Array.prototype.indexOf === 'function') {
                  return Uint8Array.prototype.indexOf.call(this, val, byteOffset)
                }
                return arrayIndexOf(this, [ val ], byteOffset)
              }
            
              function arrayIndexOf (arr, val, byteOffset) {
                var foundIndex = -1
                for (var i = 0; byteOffset + i < arr.length; i++) {
                  if (arr[byteOffset + i] === val[foundIndex === -1 ? 0 : i - foundIndex]) {
                    if (foundIndex === -1) foundIndex = i
                    if (i - foundIndex + 1 === val.length) return byteOffset + foundIndex
                  } else {
                    foundIndex = -1
                  }
                }
                return -1
              }
            
              throw new TypeError('val must be string, number or Buffer')
            }
            
            // `get` will be removed in Node 0.13+
            Buffer.prototype.get = function get (offset) {
              console.log('.get() is deprecated. Access using array indexes instead.')
              return this.readUInt8(offset)
            }
            
            // `set` will be removed in Node 0.13+
            Buffer.prototype.set = function set (v, offset) {
              console.log('.set() is deprecated. Access using array indexes instead.')
              return this.writeUInt8(v, offset)
            }
            
            function hexWrite (buf, string, offset, length) {
              offset = Number(offset) || 0
              var remaining = buf.length - offset
              if (!length) {
                length = remaining
              } else {
                length = Number(length)
                if (length > remaining) {
                  length = remaining
                }
              }
            
              // must be an even number of digits
              var strLen = string.length
              if (strLen % 2 !== 0) throw new Error('Invalid hex string')
            
              if (length > strLen / 2) {
                length = strLen / 2
              }
              for (var i = 0; i < length; i++) {
                var parsed = parseInt(string.substr(i * 2, 2), 16)
                if (isNaN(parsed)) throw new Error('Invalid hex string')
                buf[offset + i] = parsed
              }
              return i
            }
            
            function utf8Write (buf, string, offset, length) {
              return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
            }
            
            function asciiWrite (buf, string, offset, length) {
              return blitBuffer(asciiToBytes(string), buf, offset, length)
            }
            
            function binaryWrite (buf, string, offset, length) {
              return asciiWrite(buf, string, offset, length)
            }
            
            function base64Write (buf, string, offset, length) {
              return blitBuffer(base64ToBytes(string), buf, offset, length)
            }
            
            function ucs2Write (buf, string, offset, length) {
              return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
            }
            
            Buffer.prototype.write = function write (string, offset, length, encoding) {
              // Buffer#write(string)
              if (offset === undefined) {
                encoding = 'utf8'
                length = this.length
                offset = 0
              // Buffer#write(string, encoding)
              } else if (length === undefined && typeof offset === 'string') {
                encoding = offset
                length = this.length
                offset = 0
              // Buffer#write(string, offset[, length][, encoding])
              } else if (isFinite(offset)) {
                offset = offset | 0
                if (isFinite(length)) {
                  length = length | 0
                  if (encoding === undefined) encoding = 'utf8'
                } else {
                  encoding = length
                  length = undefined
                }
              // legacy write(string, encoding, offset, length) - remove in v0.13
              } else {
                var swap = encoding
                encoding = offset
                offset = length | 0
                length = swap
              }
            
              var remaining = this.length - offset
              if (length === undefined || length > remaining) length = remaining
            
              if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
                throw new RangeError('attempt to write outside buffer bounds')
              }
            
              if (!encoding) encoding = 'utf8'
            
              var loweredCase = false
              for (;;) {
                switch (encoding) {
                  case 'hex':
                    return hexWrite(this, string, offset, length)
            
                  case 'utf8':
                  case 'utf-8':
                    return utf8Write(this, string, offset, length)
            
                  case 'ascii':
                    return asciiWrite(this, string, offset, length)
            
                  case 'binary':
                    return binaryWrite(this, string, offset, length)
            
                  case 'base64':
                    // Warning: maxLength not taken into account in base64Write
                    return base64Write(this, string, offset, length)
            
                  case 'ucs2':
                  case 'ucs-2':
                  case 'utf16le':
                  case 'utf-16le':
                    return ucs2Write(this, string, offset, length)
            
                  default:
                    if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
                    encoding = ('' + encoding).toLowerCase()
                    loweredCase = true
                }
              }
            }
            
            Buffer.prototype.toJSON = function toJSON () {
              return {
                type: 'Buffer',
                data: Array.prototype.slice.call(this._arr || this, 0)
              }
            }
            
            function base64Slice (buf, start, end) {
              if (start === 0 && end === buf.length) {
                return base64.fromByteArray(buf)
              } else {
                return base64.fromByteArray(buf.slice(start, end))
              }
            }
            
            function utf8Slice (buf, start, end) {
              var res = ''
              var tmp = ''
              end = Math.min(buf.length, end)
            
              for (var i = start; i < end; i++) {
                if (buf[i] <= 0x7F) {
                  res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
                  tmp = ''
                } else {
                  tmp += '%' + buf[i].toString(16)
                }
              }
            
              return res + decodeUtf8Char(tmp)
            }
            
            function asciiSlice (buf, start, end) {
              var ret = ''
              end = Math.min(buf.length, end)
            
              for (var i = start; i < end; i++) {
                ret += String.fromCharCode(buf[i] & 0x7F)
              }
              return ret
            }
            
            function binarySlice (buf, start, end) {
              var ret = ''
              end = Math.min(buf.length, end)
            
              for (var i = start; i < end; i++) {
                ret += String.fromCharCode(buf[i])
              }
              return ret
            }
            
            function hexSlice (buf, start, end) {
              var len = buf.length
            
              if (!start || start < 0) start = 0
              if (!end || end < 0 || end > len) end = len
            
              var out = ''
              for (var i = start; i < end; i++) {
                out += toHex(buf[i])
              }
              return out
            }
            
            function utf16leSlice (buf, start, end) {
              var bytes = buf.slice(start, end)
              var res = ''
              for (var i = 0; i < bytes.length; i += 2) {
                res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)
              }
              return res
            }
            
            Buffer.prototype.slice = function slice (start, end) {
              var len = this.length
              start = ~~start
              end = end === undefined ? len : ~~end
            
              if (start < 0) {
                start += len
                if (start < 0) start = 0
              } else if (start > len) {
                start = len
              }
            
              if (end < 0) {
                end += len
                if (end < 0) end = 0
              } else if (end > len) {
                end = len
              }
            
              if (end < start) end = start
            
              var newBuf
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                newBuf = Buffer._augment(this.subarray(start, end))
              } else {
                var sliceLen = end - start
                newBuf = new Buffer(sliceLen, undefined)
                for (var i = 0; i < sliceLen; i++) {
                  newBuf[i] = this[i + start]
                }
              }
            
              if (newBuf.length) newBuf.parent = this.parent || this
            
              return newBuf
            }
            
            /*
             * Need to make sure that buffer isn't trying to write out of bounds.
             */
            function checkOffset (offset, ext, length) {
              if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
              if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
            }
            
            Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkOffset(offset, byteLength, this.length)
            
              var val = this[offset]
              var mul = 1
              var i = 0
              while (++i < byteLength && (mul *= 0x100)) {
                val += this[offset + i] * mul
              }
            
              return val
            }
            
            Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) {
                checkOffset(offset, byteLength, this.length)
              }
            
              var val = this[offset + --byteLength]
              var mul = 1
              while (byteLength > 0 && (mul *= 0x100)) {
                val += this[offset + --byteLength] * mul
              }
            
              return val
            }
            
            Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 1, this.length)
              return this[offset]
            }
            
            Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              return this[offset] | (this[offset + 1] << 8)
            }
            
            Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              return (this[offset] << 8) | this[offset + 1]
            }
            
            Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return ((this[offset]) |
                  (this[offset + 1] << 8) |
                  (this[offset + 2] << 16)) +
                  (this[offset + 3] * 0x1000000)
            }
            
            Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return (this[offset] * 0x1000000) +
                ((this[offset + 1] << 16) |
                (this[offset + 2] << 8) |
                this[offset + 3])
            }
            
            Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkOffset(offset, byteLength, this.length)
            
              var val = this[offset]
              var mul = 1
              var i = 0
              while (++i < byteLength && (mul *= 0x100)) {
                val += this[offset + i] * mul
              }
              mul *= 0x80
            
              if (val >= mul) val -= Math.pow(2, 8 * byteLength)
            
              return val
            }
            
            Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkOffset(offset, byteLength, this.length)
            
              var i = byteLength
              var mul = 1
              var val = this[offset + --i]
              while (i > 0 && (mul *= 0x100)) {
                val += this[offset + --i] * mul
              }
              mul *= 0x80
            
              if (val >= mul) val -= Math.pow(2, 8 * byteLength)
            
              return val
            }
            
            Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 1, this.length)
              if (!(this[offset] & 0x80)) return (this[offset])
              return ((0xff - this[offset] + 1) * -1)
            }
            
            Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              var val = this[offset] | (this[offset + 1] << 8)
              return (val & 0x8000) ? val | 0xFFFF0000 : val
            }
            
            Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 2, this.length)
              var val = this[offset + 1] | (this[offset] << 8)
              return (val & 0x8000) ? val | 0xFFFF0000 : val
            }
            
            Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return (this[offset]) |
                (this[offset + 1] << 8) |
                (this[offset + 2] << 16) |
                (this[offset + 3] << 24)
            }
            
            Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
            
              return (this[offset] << 24) |
                (this[offset + 1] << 16) |
                (this[offset + 2] << 8) |
                (this[offset + 3])
            }
            
            Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
              return ieee754.read(this, offset, true, 23, 4)
            }
            
            Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 4, this.length)
              return ieee754.read(this, offset, false, 23, 4)
            }
            
            Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 8, this.length)
              return ieee754.read(this, offset, true, 52, 8)
            }
            
            Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
              if (!noAssert) checkOffset(offset, 8, this.length)
              return ieee754.read(this, offset, false, 52, 8)
            }
            
            function checkInt (buf, value, offset, ext, max, min) {
              if (!Buffer.isBuffer(buf)) throw new TypeError('buffer must be a Buffer instance')
              if (value > max || value < min) throw new RangeError('value is out of bounds')
              if (offset + ext > buf.length) throw new RangeError('index out of range')
            }
            
            Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
            
              var mul = 1
              var i = 0
              this[offset] = value & 0xFF
              while (++i < byteLength && (mul *= 0x100)) {
                this[offset + i] = (value / mul) & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              byteLength = byteLength | 0
              if (!noAssert) checkInt(this, value, offset, byteLength, Math.pow(2, 8 * byteLength), 0)
            
              var i = byteLength - 1
              var mul = 1
              this[offset + i] = value & 0xFF
              while (--i >= 0 && (mul *= 0x100)) {
                this[offset + i] = (value / mul) & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
              if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
              this[offset] = value
              return offset + 1
            }
            
            function objectWriteUInt16 (buf, value, offset, littleEndian) {
              if (value < 0) value = 0xffff + value + 1
              for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; i++) {
                buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
                  (littleEndian ? i : 1 - i) * 8
              }
            }
            
            Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = value
                this[offset + 1] = (value >>> 8)
              } else {
                objectWriteUInt16(this, value, offset, true)
              }
              return offset + 2
            }
            
            Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 8)
                this[offset + 1] = value
              } else {
                objectWriteUInt16(this, value, offset, false)
              }
              return offset + 2
            }
            
            function objectWriteUInt32 (buf, value, offset, littleEndian) {
              if (value < 0) value = 0xffffffff + value + 1
              for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; i++) {
                buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff
              }
            }
            
            Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset + 3] = (value >>> 24)
                this[offset + 2] = (value >>> 16)
                this[offset + 1] = (value >>> 8)
                this[offset] = value
              } else {
                objectWriteUInt32(this, value, offset, true)
              }
              return offset + 4
            }
            
            Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 24)
                this[offset + 1] = (value >>> 16)
                this[offset + 2] = (value >>> 8)
                this[offset + 3] = value
              } else {
                objectWriteUInt32(this, value, offset, false)
              }
              return offset + 4
            }
            
            Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) {
                var limit = Math.pow(2, 8 * byteLength - 1)
            
                checkInt(this, value, offset, byteLength, limit - 1, -limit)
              }
            
              var i = 0
              var mul = 1
              var sub = value < 0 ? 1 : 0
              this[offset] = value & 0xFF
              while (++i < byteLength && (mul *= 0x100)) {
                this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) {
                var limit = Math.pow(2, 8 * byteLength - 1)
            
                checkInt(this, value, offset, byteLength, limit - 1, -limit)
              }
            
              var i = byteLength - 1
              var mul = 1
              var sub = value < 0 ? 1 : 0
              this[offset + i] = value & 0xFF
              while (--i >= 0 && (mul *= 0x100)) {
                this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
              }
            
              return offset + byteLength
            }
            
            Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
              if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)
              if (value < 0) value = 0xff + value + 1
              this[offset] = value
              return offset + 1
            }
            
            Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = value
                this[offset + 1] = (value >>> 8)
              } else {
                objectWriteUInt16(this, value, offset, true)
              }
              return offset + 2
            }
            
            Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 8)
                this[offset + 1] = value
              } else {
                objectWriteUInt16(this, value, offset, false)
              }
              return offset + 2
            }
            
            Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = value
                this[offset + 1] = (value >>> 8)
                this[offset + 2] = (value >>> 16)
                this[offset + 3] = (value >>> 24)
              } else {
                objectWriteUInt32(this, value, offset, true)
              }
              return offset + 4
            }
            
            Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
              value = +value
              offset = offset | 0
              if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
              if (value < 0) value = 0xffffffff + value + 1
              if (Buffer.TYPED_ARRAY_SUPPORT) {
                this[offset] = (value >>> 24)
                this[offset + 1] = (value >>> 16)
                this[offset + 2] = (value >>> 8)
                this[offset + 3] = value
              } else {
                objectWriteUInt32(this, value, offset, false)
              }
              return offset + 4
            }
            
            function checkIEEE754 (buf, value, offset, ext, max, min) {
              if (value > max || value < min) throw new RangeError('value is out of bounds')
              if (offset + ext > buf.length) throw new RangeError('index out of range')
              if (offset < 0) throw new RangeError('index out of range')
            }
            
            function writeFloat (buf, value, offset, littleEndian, noAssert) {
              if (!noAssert) {
                checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
              }
              ieee754.write(buf, value, offset, littleEndian, 23, 4)
              return offset + 4
            }
            
            Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
              return writeFloat(this, value, offset, true, noAssert)
            }
            
            Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
              return writeFloat(this, value, offset, false, noAssert)
            }
            
            function writeDouble (buf, value, offset, littleEndian, noAssert) {
              if (!noAssert) {
                checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
              }
              ieee754.write(buf, value, offset, littleEndian, 52, 8)
              return offset + 8
            }
            
            Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
              return writeDouble(this, value, offset, true, noAssert)
            }
            
            Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
              return writeDouble(this, value, offset, false, noAssert)
            }
            
            // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
            Buffer.prototype.copy = function copy (target, targetStart, start, end) {
              if (!start) start = 0
              if (!end && end !== 0) end = this.length
              if (targetStart >= target.length) targetStart = target.length
              if (!targetStart) targetStart = 0
              if (end > 0 && end < start) end = start
            
              // Copy 0 bytes; we're done
              if (end === start) return 0
              if (target.length === 0 || this.length === 0) return 0
            
              // Fatal error conditions
              if (targetStart < 0) {
                throw new RangeError('targetStart out of bounds')
              }
              if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
              if (end < 0) throw new RangeError('sourceEnd out of bounds')
            
              // Are we oob?
              if (end > this.length) end = this.length
              if (target.length - targetStart < end - start) {
                end = target.length - targetStart + start
              }
            
              var len = end - start
            
              if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
                for (var i = 0; i < len; i++) {
                  target[i + targetStart] = this[i + start]
                }
              } else {
                target._set(this.subarray(start, start + len), targetStart)
              }
            
              return len
            }
            
            // fill(value, start=0, end=buffer.length)
            Buffer.prototype.fill = function fill (value, start, end) {
              if (!value) value = 0
              if (!start) start = 0
              if (!end) end = this.length
            
              if (end < start) throw new RangeError('end < start')
            
              // Fill 0 bytes; we're done
              if (end === start) return
              if (this.length === 0) return
            
              if (start < 0 || start >= this.length) throw new RangeError('start out of bounds')
              if (end < 0 || end > this.length) throw new RangeError('end out of bounds')
            
              var i
              if (typeof value === 'number') {
                for (i = start; i < end; i++) {
                  this[i] = value
                }
              } else {
                var bytes = utf8ToBytes(value.toString())
                var len = bytes.length
                for (i = start; i < end; i++) {
                  this[i] = bytes[i % len]
                }
              }
            
              return this
            }
            
            /**
             * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
             * Added in Node 0.12. Only available in browsers that support ArrayBuffer.
             */
            Buffer.prototype.toArrayBuffer = function toArrayBuffer () {
              if (typeof Uint8Array !== 'undefined') {
                if (Buffer.TYPED_ARRAY_SUPPORT) {
                  return (new Buffer(this)).buffer
                } else {
                  var buf = new Uint8Array(this.length)
                  for (var i = 0, len = buf.length; i < len; i += 1) {
                    buf[i] = this[i]
                  }
                  return buf.buffer
                }
              } else {
                throw new TypeError('Buffer.toArrayBuffer not supported in this browser')
              }
            }
            
            // HELPER FUNCTIONS
            // ================
            
            var BP = Buffer.prototype
            
            /**
             * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
             */
            Buffer._augment = function _augment (arr) {
              arr.constructor = Buffer
              arr._isBuffer = true
            
              // save reference to original Uint8Array set method before overwriting
              arr._set = arr.set
            
              // deprecated, will be removed in node 0.13+
              arr.get = BP.get
              arr.set = BP.set
            
              arr.write = BP.write
              arr.toString = BP.toString
              arr.toLocaleString = BP.toString
              arr.toJSON = BP.toJSON
              arr.equals = BP.equals
              arr.compare = BP.compare
              arr.indexOf = BP.indexOf
              arr.copy = BP.copy
              arr.slice = BP.slice
              arr.readUIntLE = BP.readUIntLE
              arr.readUIntBE = BP.readUIntBE
              arr.readUInt8 = BP.readUInt8
              arr.readUInt16LE = BP.readUInt16LE
              arr.readUInt16BE = BP.readUInt16BE
              arr.readUInt32LE = BP.readUInt32LE
              arr.readUInt32BE = BP.readUInt32BE
              arr.readIntLE = BP.readIntLE
              arr.readIntBE = BP.readIntBE
              arr.readInt8 = BP.readInt8
              arr.readInt16LE = BP.readInt16LE
              arr.readInt16BE = BP.readInt16BE
              arr.readInt32LE = BP.readInt32LE
              arr.readInt32BE = BP.readInt32BE
              arr.readFloatLE = BP.readFloatLE
              arr.readFloatBE = BP.readFloatBE
              arr.readDoubleLE = BP.readDoubleLE
              arr.readDoubleBE = BP.readDoubleBE
              arr.writeUInt8 = BP.writeUInt8
              arr.writeUIntLE = BP.writeUIntLE
              arr.writeUIntBE = BP.writeUIntBE
              arr.writeUInt16LE = BP.writeUInt16LE
              arr.writeUInt16BE = BP.writeUInt16BE
              arr.writeUInt32LE = BP.writeUInt32LE
              arr.writeUInt32BE = BP.writeUInt32BE
              arr.writeIntLE = BP.writeIntLE
              arr.writeIntBE = BP.writeIntBE
              arr.writeInt8 = BP.writeInt8
              arr.writeInt16LE = BP.writeInt16LE
              arr.writeInt16BE = BP.writeInt16BE
              arr.writeInt32LE = BP.writeInt32LE
              arr.writeInt32BE = BP.writeInt32BE
              arr.writeFloatLE = BP.writeFloatLE
              arr.writeFloatBE = BP.writeFloatBE
              arr.writeDoubleLE = BP.writeDoubleLE
              arr.writeDoubleBE = BP.writeDoubleBE
              arr.fill = BP.fill
              arr.inspect = BP.inspect
              arr.toArrayBuffer = BP.toArrayBuffer
            
              return arr
            }
            
            var INVALID_BASE64_RE = /[^+\/0-9A-z\-]/g
            
            function base64clean (str) {
              // Node strips out invalid characters like \n and \t from the string, base64-js does not
              str = stringtrim(str).replace(INVALID_BASE64_RE, '')
              // Node converts strings with length < 2 to ''
              if (str.length < 2) return ''
              // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
              while (str.length % 4 !== 0) {
                str = str + '='
              }
              return str
            }
            
            function stringtrim (str) {
              if (str.trim) return str.trim()
              return str.replace(/^\s+|\s+$/g, '')
            }
            
            function toHex (n) {
              if (n < 16) return '0' + n.toString(16)
              return n.toString(16)
            }
            
            function utf8ToBytes (string, units) {
              units = units || Infinity
              var codePoint
              var length = string.length
              var leadSurrogate = null
              var bytes = []
              var i = 0
            
              for (; i < length; i++) {
                codePoint = string.charCodeAt(i)
            
                // is surrogate component
                if (codePoint > 0xD7FF && codePoint < 0xE000) {
                  // last char was a lead
                  if (leadSurrogate) {
                    // 2 leads in a row
                    if (codePoint < 0xDC00) {
                      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                      leadSurrogate = codePoint
                      continue
                    } else {
                      // valid surrogate pair
                      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
                      leadSurrogate = null
                    }
                  } else {
                    // no lead yet
            
                    if (codePoint > 0xDBFF) {
                      // unexpected trail
                      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                      continue
                    } else if (i + 1 === length) {
                      // unpaired lead
                      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                      continue
                    } else {
                      // valid lead
                      leadSurrogate = codePoint
                      continue
                    }
                  }
                } else if (leadSurrogate) {
                  // valid bmp char, but last char was a lead
                  if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
                  leadSurrogate = null
                }
            
                // encode utf8
                if (codePoint < 0x80) {
                  if ((units -= 1) < 0) break
                  bytes.push(codePoint)
                } else if (codePoint < 0x800) {
                  if ((units -= 2) < 0) break
                  bytes.push(
                    codePoint >> 0x6 | 0xC0,
                    codePoint & 0x3F | 0x80
                  )
                } else if (codePoint < 0x10000) {
                  if ((units -= 3) < 0) break
                  bytes.push(
                    codePoint >> 0xC | 0xE0,
                    codePoint >> 0x6 & 0x3F | 0x80,
                    codePoint & 0x3F | 0x80
                  )
                } else if (codePoint < 0x200000) {
                  if ((units -= 4) < 0) break
                  bytes.push(
                    codePoint >> 0x12 | 0xF0,
                    codePoint >> 0xC & 0x3F | 0x80,
                    codePoint >> 0x6 & 0x3F | 0x80,
                    codePoint & 0x3F | 0x80
                  )
                } else {
                  throw new Error('Invalid code point')
                }
              }
            
              return bytes
            }
            
            function asciiToBytes (str) {
              var byteArray = []
              for (var i = 0; i < str.length; i++) {
                // Node's code seems to be doing this and not & 0x7F..
                byteArray.push(str.charCodeAt(i) & 0xFF)
              }
              return byteArray
            }
            
            function utf16leToBytes (str, units) {
              var c, hi, lo
              var byteArray = []
              for (var i = 0; i < str.length; i++) {
                if ((units -= 2) < 0) break
            
                c = str.charCodeAt(i)
                hi = c >> 8
                lo = c % 256
                byteArray.push(lo)
                byteArray.push(hi)
              }
            
              return byteArray
            }
            
            function base64ToBytes (str) {
              return base64.toByteArray(base64clean(str))
            }
            
            function blitBuffer (src, dst, offset, length) {
              for (var i = 0; i < length; i++) {
                if ((i + offset >= dst.length) || (i >= src.length)) break
                dst[i + offset] = src[i]
              }
              return i
            }
            
            function decodeUtf8Char (str) {
              try {
                return decodeURIComponent(str)
              } catch (err) {
                return String.fromCharCode(0xFFFD) // UTF 8 invalid char
              }
            }
            
        • ieee754
          • index.js
            exports.read = function (buffer, offset, isLE, mLen, nBytes) {
              var e, m,
                  eLen = nBytes * 8 - mLen - 1,
                  eMax = (1 << eLen) - 1,
                  eBias = eMax >> 1,
                  nBits = -7,
                  i = isLE ? (nBytes - 1) : 0,
                  d = isLE ? -1 : 1,
                  s = buffer[offset + i]
            
              i += d
            
              e = s & ((1 << (-nBits)) - 1)
              s >>= (-nBits)
              nBits += eLen
              for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
            
              m = e & ((1 << (-nBits)) - 1)
              e >>= (-nBits)
              nBits += mLen
              for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
            
              if (e === 0) {
                e = 1 - eBias
              } else if (e === eMax) {
                return m ? NaN : ((s ? -1 : 1) * Infinity)
              } else {
                m = m + Math.pow(2, mLen)
                e = e - eBias
              }
              return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
            }
            
            exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
              var e, m, c,
                  eLen = nBytes * 8 - mLen - 1,
                  eMax = (1 << eLen) - 1,
                  eBias = eMax >> 1,
                  rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
                  i = isLE ? 0 : (nBytes - 1),
                  d = isLE ? 1 : -1,
                  s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
            
              value = Math.abs(value)
            
              if (isNaN(value) || value === Infinity) {
                m = isNaN(value) ? 1 : 0
                e = eMax
              } else {
                e = Math.floor(Math.log(value) / Math.LN2)
                if (value * (c = Math.pow(2, -e)) < 1) {
                  e--
                  c *= 2
                }
                if (e + eBias >= 1) {
                  value += rt / c
                } else {
                  value += rt * Math.pow(2, 1 - eBias)
                }
                if (value * c >= 2) {
                  e++
                  c /= 2
                }
            
                if (e + eBias >= eMax) {
                  m = 0
                  e = eMax
                } else if (e + eBias >= 1) {
                  m = (value * c - 1) * Math.pow(2, mLen)
                  e = e + eBias
                } else {
                  m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
                  e = 0
                }
              }
            
              for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
            
              e = (e << mLen) | m
              eLen += mLen
              for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
            
              buffer[offset + i - d] |= s * 128
            }
            
        • is-array
          • index.js
            /**
             * isArray
             */
            
            var isArray = Array.isArray;
            
            /**
             * toString
             */
            
            var str = Object.prototype.toString;
            
            /**
             * Whether or not the given `val`
             * is an array.
             *
             * example:
             *
             *        isArray([]);
             *        // > true
             *        isArray(arguments);
             *        // > false
             *        isArray('');
             *        // > false
             *
             * @param {mixed} val
             * @return {bool}
             */
            
            module.exports = isArray || function (val) {
              return !! val && '[object Array]' == str.call(val);
            };
            
      • HostedProcess.ts
        module noapi {
        
          export class HostedProcess {
        
            process: Process;
            mainModule: Module;
            global: Global;
            coreModules: { fs: FS; path: Path, os: OS; };
        
            private _scriptPath: string;
            private _drive: persistence.Drive;
            private _console: any;
        
            exitCode: number = null;
            finished = false;
        
            private _context: isolation.Context;
            private _waitFor = 0;
        
            constructor(options: {
              window: Window;
              drive: persistence.Drive;
              scriptPath: string;
        
              argv?: string[];
              cwd?: string;
              env?: any;
              console?: any;
            }) {
        
              this.global = <any>{};
        
              this.coreModules = {
                fs: <FS>null,
                os: <OS>null,
                path: <Path>null
              };
        
              var noopt = {
                argv: options.argv || ['/node', options.scriptPath],
                cwd: options.cwd,
                env: options.env || {}
              };
        
              this._scriptPath = options.scriptPath;
              this._drive = options.drive;
        
              if (!noopt.cwd)
                noopt.cwd = dirname(options.scriptPath);
        
              this.global.process = this.process = createProcess(this.coreModules, noopt);
              this.global.module = this.mainModule = createModule('repl' /*id*/, null /*filename*/, null /*parent*/, require);
        
              var noapicontext = this;
              function require(moduleName: string) { return noapicontext.requireModule(moduleName, dirname(options.scriptPath), null); }
        
              this.global.require = <any>(moduleName => require(moduleName));
              this.global.require.resolve = id => this.resolve(id, noopt.cwd);
              this.global.__filename = options.scriptPath;
              this.global.__dirname = dirname(options.scriptPath);
              if (options.console)
                this.global.console = options.console;
              this._console = options.console;
        
              this.coreModules.fs = createFS(options.drive, this.coreModules);
              this.coreModules.os = createOS(this.global);
              this.coreModules.path = createPath(this.global);
        
              this._context = new isolation.Context(window);
        
              this.process.exit = code => {
                this.finished = true;
                this.exitCode = code || 0;
                this.dispose();
              };
        
              this.process.abort = () => {
                this.finished = true;
                this.dispose();
              };
        
              var timeouts: Function[] = [];
              (<any>this.global).setTimeout = (fun: Function, time: number, ...args: any[]) => {
                if (this.finished) return 0;
                var wait = this.keepAlive();
                var complete = () => {
                  delete timeouts[result];
                  wait();
                  fun();
                };
        
                var passArgs = [];
                passArgs.push(complete);
                passArgs.push(time);
                for (var i = 0; i < args.length; i++) {
                  passArgs.push(args[i]);
                }
                var result = setTimeout.apply(this.global, passArgs);
        
                timeouts[result] = wait;
                return result;
              };
        
              (<any>this.global).clearTimeout = (tout: number) => {
                var wait = timeouts[tout];
                if (wait) wait();
                delete timeouts[tout];
                clearTimeout(tout);
              };
        
              var intervals: Function[] = [];
              (<any>this.global).setInterval = (fun: Function, time: number, ...args: any[]) => {
                if (this.finished) return 0;
                var wait = this.keepAlive();
        
                var passArgs = [];
                passArgs.push(fun);
                passArgs.push(time);
                for (var i = 0; i < args.length; i++) {
                  passArgs.push(args[i]);
                }
                var result = setInterval.apply(this.global, passArgs);
        
                intervals[result] = wait;
                return result;
              };
        
              (<any>this.global).clearInterval = (intv: number) => {
                var wait = intervals[intv];
                if (wait) wait();
                delete intervals[intv];
                clearTimeout(intv);
              };
        
              this.process.nextTick = fun => {
                var wait = this.keepAlive();
                setTimeout(() => {
                  wait();
                  fun();
                }, 1);
              };
        
            }
        
            eval(code: string) {
              var wait = this.keepAlive();
              try {
                return this._context.run(code, this._scriptPath, this.global);
              }
              finally {
                wait();
              }
            }
        
            resolve(id: string, modulePath: string) {
              if (id.charAt(0) === '.') {
                return this.coreModules.path.join(modulePath, id);
              }
              else if (id.charAt(0) === '/') {
                return id;
              }
              else {
                var tryPath = this.coreModules.path.normalize(modulePath);
                var probePatterns = [
                  '../' + i, '../' + id + '.js', '../' + id + '/index.js',
                  '../node_modules/' + id + '/index.js'];
        
                while (true) {
                  tryPath = this.coreModules.path.basename(tryPath);
                  if (!tryPath || tryPath === '/') return null;
                  for (var i = 0; i < probePatterns.length; i++) {
                    var p = this.coreModules.path.join(tryPath, probePatterns[i]);
                    if (this._drive.read(p)) return p;
                  }
                }
              }
            }
        
            requireModule(moduleName: string, parentModulePath: string, parentModule: Module) {
        
              if (this.coreModules.hasOwnProperty(moduleName))
                return this.coreModules[moduleName];
        
              var resolvedPath = this.resolve(moduleName, parentModulePath);
              if (resolvedPath) {
                var content = this._drive.read(resolvedPath);
                if (content) {
                  var loadedModule = createModule(moduleName, resolvedPath, parentModule, moduleName => this.requireModule(moduleName, resolvedPath, loadedModule));
                  var moduleScope = (() => {
        
                    var ModuleContext = () => { };
                    ModuleContext.prototype = this.global;
        
                    var moduleScope = new ModuleContext();
        
                    moduleScope.global = moduleScope;
                    moduleScope.require = function(moduleName) { return loadedModule.require(moduleName); };
                    moduleScope.exports = loadedModule.exports;
        
                    moduleScope.global.__filename = resolvedPath;
                    moduleScope.global.__dirname = dirname(resolvedPath);
                    if (this._console)
                      this.global.console = this._console;
        
        
                    moduleScope.module = loadedModule;
        
                    return moduleScope;
                  })();
        
                  this._context.run(content, resolvedPath, moduleScope);
        
                  return loadedModule.exports;
                }
              }
            }
        
            dispose() {
              this._context.dispose();
            }
        
            keepAlive() {
              this._waitFor++;
              return () => {
                this._waitFor--;
                if (this._waitFor <= 0) {
                  setTimeout(() => {
                    if (this._waitFor <= 0)
                      this.dispose();
                  }, 1000);
                }
              };
            }
          }
        }
      • apply.ts
        module noapi {
        
          export function apply(
            global: any,
            drive: persistence.Drive,
            options?: {
              argv?: string[];
              cwd?: string;
              env?: any;
            }) {
        
            var apiGlobal = {
              process: <Process>null,
              module: <Module>null
            };
        
            if (!options) options = {};
        
            var cleanOptions = {
              argv: options.argv || ['/node'],
              cwd: options.cwd || '/',
              env: options.env || {}
            };
        
            var coreModules = {
              fs: <FS>null,
              os: <OS>null,
              path: <Path>null
            };
        
            apiGlobal.process = createProcess(coreModules, cleanOptions);
            apiGlobal.module = createModule('repl' /*id*/, null /*filename*/, null /*parent*/, module_require);
        
            coreModules.fs = createFS(drive, coreModules);
            coreModules.os = createOS(apiGlobal);
            coreModules.path = createPath(apiGlobal);
        
            global.process = apiGlobal.process;
            global.module = apiGlobal.module;
            global.require = global_require;
        
            function global_require(moduleName: string) {
              return module_require(moduleName);
            }
        
            function module_require(moduleName: string): any {
              if (coreModules.hasOwnProperty(moduleName)) return coreModules[moduleName];
        
              throw new Error('Cannot find module \'' + moduleName + '\'');
            }
          }
        
          export function nextTick(callback: Function): void {
        
            function fire() {
              if (fired) return;
              fired = true;
              callback();
            }
        
            var fired = false;
            setTimeout(fire, 0);
            if (typeof requestAnimationFrame !== 'undefined') {
              requestAnimationFrame(fire);
            }
            else if (typeof msRequestAnimationFrame !== 'undefined') {
              msRequestAnimationFrame(fire);
            }
        
          }
        
          export function wrapAsync(fn: Function): () => void {
            return function() {
              var args = [];
              for (var i = 0; i < arguments.length - 1; i++) {
                args.push(arguments[i]);
              }
              var callback = arguments[arguments.length - 1];
        
              nextTick(function() {
                try {
                  var result = fn.apply(null, args);
                }
                catch (error) {
                  callback(error);
                }
                callback(null, result);
              });
            }
          }
        
          export function wrapAsyncNoError(fn: Function): () => void {
            return function() {
              var args = [];
              for (var i = 0; i < arguments.length - 1; i++) {
                args.push(arguments[i]);
              }
              var callback = arguments[arguments.length - 1];
        
              nextTick(function() {
                try {
                  var result = fn.apply(null, args);
                }
                catch (error) {
                  callback(error);
                }
                callback(result);
              });
            }
          }
        
        }
      • def.d.ts
        declare module noapi {
        
          export interface RequireFunction {
            (id: string): any;
            resolve(id: string): string;
            cache: any;
            extensions: any;
            main: any;
          }
        
          export interface Global {
            module: Module;
            process: Process;
            require: RequireFunction;
            exports?: any;
            __filename?: string;
            __dirname?: string;
            console?: { log: Function; };
          }
        
          export interface ErrnoError extends Error {
          }
        
          export interface Buffer {
            [index: number]: number;
            write(string: string, offset?: number, length?: number, encoding?: string): number;
            toString(encoding?: string, start?: number, end?: number): string;
            toJSON(): any;
            length: number;
            copy(targetBuffer: Buffer, targetStart?: number, sourceStart?: number, sourceEnd?: number): number;
            slice(start?: number, end?: number): Buffer;
            readUInt8(offset: number, noAsset?: boolean): number;
            readUInt16LE(offset: number, noAssert?: boolean): number;
            readUInt16BE(offset: number, noAssert?: boolean): number;
            readUInt32LE(offset: number, noAssert?: boolean): number;
            readUInt32BE(offset: number, noAssert?: boolean): number;
            readInt8(offset: number, noAssert?: boolean): number;
            readInt16LE(offset: number, noAssert?: boolean): number;
            readInt16BE(offset: number, noAssert?: boolean): number;
            readInt32LE(offset: number, noAssert?: boolean): number;
            readInt32BE(offset: number, noAssert?: boolean): number;
            readFloatLE(offset: number, noAssert?: boolean): number;
            readFloatBE(offset: number, noAssert?: boolean): number;
            readDoubleLE(offset: number, noAssert?: boolean): number;
            readDoubleBE(offset: number, noAssert?: boolean): number;
            writeUInt8(value: number, offset: number, noAssert?: boolean): void;
            writeUInt16LE(value: number, offset: number, noAssert?: boolean): void;
            writeUInt16BE(value: number, offset: number, noAssert?: boolean): void;
            writeUInt32LE(value: number, offset: number, noAssert?: boolean): void;
            writeUInt32BE(value: number, offset: number, noAssert?: boolean): void;
            writeInt8(value: number, offset: number, noAssert?: boolean): void;
            writeInt16LE(value: number, offset: number, noAssert?: boolean): void;
            writeInt16BE(value: number, offset: number, noAssert?: boolean): void;
            writeInt32LE(value: number, offset: number, noAssert?: boolean): void;
            writeInt32BE(value: number, offset: number, noAssert?: boolean): void;
            writeFloatLE(value: number, offset: number, noAssert?: boolean): void;
            writeFloatBE(value: number, offset: number, noAssert?: boolean): void;
            writeDoubleLE(value: number, offset: number, noAssert?: boolean): void;
            writeDoubleBE(value: number, offset: number, noAssert?: boolean): void;
            fill(value: any, offset?: number, end?: number): void;
          }
        
        }
      • events.d.ts
        declare module noapi {
        
          export interface EventEmitter {
            //static listenerCount(emitter: EventEmitter, event: string): number;
        
            addListener(event: string, listener: Function): EventEmitter;
        
            on(event: string, listener: Function): EventEmitter;
        
            once(event: string, listener: Function): EventEmitter;
        
            removeListener(event: string, listener: Function): EventEmitter;
        
            removeAllListeners(event?: string): EventEmitter;
        
            setMaxListeners(n: number): void;
        
            listeners(event: string): Function[];
        
            emit(event: string, ...args: any[]): boolean;
        
          }
        
        }
      • events.ts
        module noapi {
        
          export function createEventEmitter(): EventEmitter {
        
            var _listeners: { [eventKey: string]: Function[]; } = {};
        
            var result = {
              addListener, removeListener, removeAllListeners,
              on, once,
              setMaxListeners,
              listeners,
              emit
            };
            return result;
        
            function addListener(event: string, listener: Function): EventEmitter {
              var key = '*' + event;
              var list = _listeners[key] || (this._listeners[key] = []);
              list.push(listener);
              return result;
            }
        
            function removeListener(event: string, listener: Function): EventEmitter {
              var key = '*' + event;
              var list = _listeners[key];
              if (list) {
                for (var i = 0; i < list.length; i++) {
                  if (list[i] === listener) {
                    list.splice(i, 1);
                    break;
                  }
                }
              }
              return result;
            }
        
            function removeAllListeners(event?: string): EventEmitter {
              var key = '*' + event;
              delete _listeners[key];
              return result;
            }
        
            function setMaxListeners(n: number): void {
              // too complicated for now, ignore
            }
        
            function listeners(event: string): Function[] {
              var key = '*' + event;
              var list = _listeners[key];
              if (list)
                return list.slice(0);
              else
                return [];
            }
        
            function emit(event: string, ...args: any[]): boolean {
              var key = '*' + event;
              var list = _listeners[key];
              if (!list) return false;
              for (var i = 0; i < list.length; i++) {
                var f = list[i];
                f.apply(null, args);
              }
              return true;
            }
        
            function on(event: string, listener: Function): EventEmitter {
              return addListener(event, listener);
            }
        
            function once(event: string, listener: Function): EventEmitter {
              return on(event, listener);
            }
        
          }
        
        }
      • fs.d.ts
        declare module noapi {
        
          export interface FS {
        
            rename(oldPath: string, newPath: string, callback?: (err?: ErrnoError) => void): void;
            renameSync(oldPath: string, newPath: string): void;
        
        
            truncate(path: string, callback?: (err?: ErrnoError) => void): void;
            truncate(path: string, len: number, callback?: (err?: ErrnoError) => void): void;
            truncateSync(path: string, len?: number): void;
        
            ftruncate(fd: number, callback?: (err?: ErrnoError) => void): void;
            ftruncate(fd: number, len: number, callback?: (err?: ErrnoError) => void): void;
            ftruncateSync(fd: number, len?: number): void;
        
        
            chown(path: string, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
            chownSync(path: string, uid: number, gid: number): void;
        
            fchown(fd: number, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
            fchownSync(fd: number, uid: number, gid: number): void;
        
            lchown(path: string, uid: number, gid: number, callback?: (err?: ErrnoError) => void): void;
            lchownSync(path: string, uid: number, gid: number): void;
        
        
            chmod(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
            chmod(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
            chmodSync(path: string, mode: number): void;
            chmodSync(path: string, mode: string): void;
        
            fchmod(fd: number, mode: number, callback?: (err?: ErrnoError) => void): void;
            fchmod(fd: number, mode: string, callback?: (err?: ErrnoError) => void): void;
            fchmodSync(fd: number, mode: number): void;
            fchmodSync(fd: number, mode: string): void;
        
            lchmod(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
            lchmod(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
            lchmodSync(path: string, mode: number): void;
            lchmodSync(path: string, mode: string): void;
        
        
            stat(path: string, callback?: (err: ErrnoError, stats: Stats) => any): void;
            lstat(path: string, callback?: (err: ErrnoError, stats: Stats) => any): void;
            fstat(fd: number, callback?: (err: ErrnoError, stats: Stats) => any): void;
            statSync(path: string): Stats;
            lstatSync(path: string): Stats;
            fstatSync(fd: number): Stats;
        
        
            link(srcpath: string, dstpath: string, callback?: (err?: ErrnoError) => void): void;
            linkSync(srcpath: string, dstpath: string): void;
        
            symlink(srcpath: string, dstpath: string, type?: string, callback?: (err?: ErrnoError) => void): void;
            symlinkSync(srcpath: string, dstpath: string, type?: string): void;
        
        
            readlink(path: string, callback?: (err: ErrnoError, linkString: string) => any): void;
            readlinkSync(path: string): string;
        
        
            realpath(path: string, callback?: (err: ErrnoError, resolvedPath: string) => any): void;
            realpath(path: string, cache: { [path: string]: string }, callback: (err: ErrnoError, resolvedPath: string) => any): void;
            realpathSync(path: string, cache?: { [path: string]: string }): string;
        
        
            unlink(path: string, callback?: (err?: ErrnoError) => void): void;
            unlinkSync(path: string): void;
        
        
            rmdir(path: string, callback?: (err?: ErrnoError) => void): void;
            rmdirSync(path: string): void;
        
        
            mkdir(path: string, callback?: (err?: ErrnoError) => void): void;
            mkdir(path: string, mode: number, callback?: (err?: ErrnoError) => void): void;
            mkdir(path: string, mode: string, callback?: (err?: ErrnoError) => void): void;
            mkdirSync(path: string, mode?: number): void;
            mkdirSync(path: string, mode?: string): void;
        
        
            readdir(path: string, callback?: (err: ErrnoError, files: string[]) => void): void;
            readdirSync(path: string): string[];
        
        
            close(fd: number, callback?: (err?: ErrnoError) => void): void;
            closeSync(fd: number): void;
        
        
            open(path: string, flags: string, callback?: (err: ErrnoError, fd: number) => any): void;
            open(path: string, flags: string, mode: number, callback?: (err: ErrnoError, fd: number) => any): void;
            open(path: string, flags: string, mode: string, callback?: (err: ErrnoError, fd: number) => any): void;
            openSync(path: string, flags: string, mode?: number): number;
            openSync(path: string, flags: string, mode?: string): number;
        
        
            utimes(path: string, atime: number, mtime: number, callback?: (err?: ErrnoError) => void): void;
            utimes(path: string, atime: Date, mtime: Date, callback?: (err?: ErrnoError) => void): void;
            utimesSync(path: string, atime: number, mtime: number): void;
            utimesSync(path: string, atime: Date, mtime: Date): void;
        
            futimes(fd: number, atime: number, mtime: number, callback?: (err?: ErrnoError) => void): void;
            futimes(fd: number, atime: Date, mtime: Date, callback?: (err?: ErrnoError) => void): void;
            futimesSync(fd: number, atime: number, mtime: number): void;
            futimesSync(fd: number, atime: Date, mtime: Date): void;
        
        
            fsync(fd: number, callback?: (err?: ErrnoError) => void): void;
            fsyncSync(fd: number): void;
        
        
            read(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: ErrnoError, bytesRead: number, buffer: Buffer) => void): void;
            readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number;
        
            readFile(filename: string, encoding: string, callback: (err: ErrnoError, data: string) => void): void;
            readFile(filename: string, options: { encoding: string; flag?: string; }, callback: (err: ErrnoError, data: string) => void): void;
            readFile(filename: string, options: { flag?: string; }, callback: (err: ErrnoError, data: Buffer) => void): void;
            readFile(filename: string, callback: (err: ErrnoError, data: Buffer) => void): void;
            readFileSync(filename: string, encoding: string): string;
            readFileSync(filename: string, options: { encoding: string; flag?: string; }): string;
            readFileSync(filename: string, options?: { flag?: string; }): Buffer;
        
            write(fd: number, buffer: Buffer, offset: number, length: number, position: number, callback?: (err: ErrnoError, written: number, buffer: Buffer) => void): void;
            writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number;
        
            writeFile(filename: string, data: any, callback?: (err: ErrnoError) => void): void;
            writeFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            writeFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void;
            writeFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void;
        
        
            appendFile(filename: string, data: any, options: { encoding?: string; mode?: number; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            appendFile(filename: string, data: any, options: { encoding?: string; mode?: string; flag?: string; }, callback?: (err: ErrnoError) => void): void;
            appendFile(filename: string, data: any, callback?: (err: ErrnoError) => void): void;
            appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: number; flag?: string; }): void;
            appendFileSync(filename: string, data: any, options?: { encoding?: string; mode?: string; flag?: string; }): void;
        
        
            watchFile(filename: string, listener: (curr: Stats, prev: Stats) => void): void;
            watchFile(filename: string, options: { persistent?: boolean; interval?: number; }, listener: (curr: Stats, prev: Stats) => void): void;
        
            unwatchFile(filename: string, listener?: (curr: Stats, prev: Stats) => void): void;
        
            watch(filename: string, listener?: (event: string, filename: string) => any): Watcher;
            watch(filename: string, options: { persistent?: boolean; }, listener?: (event: string, filename: string) => any): Watcher;
        
        
            exists(path: string, callback?: (exists: boolean) => void): void;
            existsSync(path: string): boolean;
        
        
            createReadStream(path: string, options?: { flags?: string; encoding?: string; fd?: string; mode?: number; bufferSize?: number; }): ReadStream;
            createReadStream(path: string, options?: { flags?: string; encoding?: string; fd?: string; mode?: string; bufferSize?: number; }): ReadStream;
        
            createWriteStream(path: string, options?: { flags?: string; encoding?: string; string?: string; }): WriteStream;
        
          }
        
          export interface Stats {
            isFile(): boolean;
            isDirectory(): boolean;
            isBlockDevice(): boolean;
            isCharacterDevice(): boolean;
            isSymbolicLink(): boolean;
            isFIFO(): boolean;
            isSocket(): boolean;
            dev: number;
            ino: number;
            mode: number;
            nlink: number;
            uid: number;
            gid: number;
            rdev: number;
            size: number;
            blksize: number;
            blocks: number;
            atime: Date;
            mtime: Date;
            ctime: Date;
          }
        
          export interface Watcher extends EventEmitter {
            close(): void;
          }
        
          export interface ReadStream extends Readable {
            close(): void;
          }
        
          export interface WriteStream extends Writable {
            close(): void;
          }
        
        }
      • fs.ts
        module noapi {
        
          export function createFS(drive: persistence.Drive, modules: { path: Path; }): FS {
        
            var fs: FS = {
        
              renameSync: renameSync,
              rename: wrapAsync(renameSync),
        
              statSync: statSync,
              lstatSync: statSync,
              stat: wrapAsync(statSync),
              lstat: wrapAsync(statSync),
              fstat: null, fstatSync: null, // TODO: implement fstat using fstab
        
        
              existsSync: existsSync,
              exists: wrapAsyncNoError(existsSync),
        
              openSync: openSync,
              open: wrapAsync(openSync),
              close: null, closeSync: null,
              fsync: null, fsyncSync: null,
        
        
        
              readFileSync: readFileSync,
              readFile: wrapAsync(readFileSync),
              createReadStream: null,
        
              writeFileSync: writeFileSync,
              writeFile: wrapAsync(writeFileSync),
              appendFile: null, appendFileSync: null,
              createWriteStream: null,
        
        
              readSync: readSync,
              read: wrapAsync(readSync),
        
              writeSync: writeSync,
              write: wrapAsync(writeSync),
        
        
        
              truncate: null, truncateSync: null,
              ftruncate: null, ftruncateSync: null,
        
              chown: null, chownSync: null,
              fchown: null, fchownSync: null,
              lchown: null, lchownSync: null,
        
              chmod: null, chmodSync: null,
              fchmod: null, fchmodSync: null,
              lchmod: null, lchmodSync: null,
        
              link: null, linkSync: null,
              readlink: null, readlinkSync: null,
        
              symlink: null, symlinkSync: null,
              unlink: null, unlinkSync: null,
        
              realpath: null, realpathSync: null,
        
              mkdir: wrapAsync(mkdirSync), mkdirSync: mkdirSync,
              rmdir: null, rmdirSync: null,
        
              readdir: null, readdirSync: null,
        
              utimes: null, utimesSync: null,
              futimes: null, futimesSync: null,
        
        
              watch: null, watchFile: null, unwatchFile: null
            };
        
            return fs;
        
            function existsSync(file: string): boolean {
              var content = drive.read(file);
              if (content || (content !== null && typeof content === 'undefined'))
                return true;
        
              var files = drive.files();
              var normPath = modules.path.normalize(file);
              if (normPath.slice(-1) !== '/') normPath += '/';
              var leadMatch = getStartMatcher(file);
              for (var i = 0; i < files.length; i++) {
                if (leadMatch(files[i])) return;
              }
        
              return false;
            }
        
            function mkdirSync(path: string, mode?: any): void {
              var normPath = modules.path.normalize(path);
              if (normPath.slice(-1) !== '/') normPath += '/';
        
              if (existsSync(path)) throw new Error('Directory \'' + path + '\'');
        
              drive.write(normPath, '');
            }
        
            function renameSync(oldPath: string, newPath: string): void {
        
              var oldContent = drive.read(oldPath);
              if (oldContent !== null) {
                // TODO: check if directory is in the way
                // if (nofs
                drive.write(newPath, oldContent);
                drive.write(oldPath, null);
                return;
              }
        
              if (drive.read(newPath) !== null) {
                // node actually reports oldPath here, but let's be reasonable
                throw new Error('ENOTDIR, not a directory \'' + newPath + '\'');
              }
        
              var norm_oldPath = modules.path.resolve(oldPath);
              if (norm_oldPath === '/')
                throw new Error('EBUSY, resource busy or locked \'/\'');
              else
                norm_oldPath += '/';
        
              var norm_newPath = modules.path.resolve(newPath);
              if (norm_newPath === '/')
                throw new Error('EBUSY, resource busy or locked \'/\'');
              else
                norm_newPath += '/';
        
        
              var files = drive.files();
        
        
              var startAsOld = getStartMatcher(norm_oldPath);
        
              for (var i = 0; i < files.length; i++) {
                var fi = files[i];
                if (startAsOld(fi)) {
                  var oldContent = drive.read(fi);
                  var restPath = fi.slice(norm_newPath.length);
                  var newFiPath = norm_newPath + restPath;
                  drive.write(newFiPath, oldContent);
                  drive.write(newFiPath, null);
                }
              }
        
            }
        
        
        
            function statSync(path: string): Stats {
              // TODO: implement
              throw new Error('Not implemented');
            }
            /*
              stat(path: string, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
              lstat(path: string, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
              fstat(fd: number, callback?: (err: no_ErrnoError, stats: nofs_Stats) => any): void;
              statSync(path: string): nofs_Stats;
              lstatSync(path: string): nofs_Stats;
              fstatSync(fd: number): nofs_Stats;
            */
        
        
        
            function readFileSync(filename: string, options?: { encoding?: string; flag?: string; }): any {
        
              // TODO: handle encoding and other
              return drive.read(filename);
        
            }
        
            function readSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number {
        
              // TODO: consider also std handles
              //var path = nofs_fdtable()[fd];
        
              throw new Error('Buffer-aware API fs.readSync is not implemented.');
            }
        
        
        
            function writeFileSync(filename: string, content: string) {
        
              drive.write(filename, content);
        
            }
        
        
            function writeSync(fd: number, buffer: Buffer, offset: number, length: number, position: number): number {
        
              if (fd === 1) {
                if (typeof console !== 'undefined')
                  console.log(buffer);
        
                return length;
              }
        
              var path = get_fdtable()[fd];
        
              throw new Error('Buffer-aware API fs.writeSync is not implemented.');
            }
        
        
        
        
            function openSync(path: string, flags: string, mode?: number): number;
            function openSync(path: string, flags: string, mode?: string): number;
            function openSync(path: string, flags?: string, mode?: any): number {
        
              var fdtable = get_fdtable();
        
              for (var fd in fdtable) {
                var fpath = fdtable[fd];
                if (fpath === path) {
                  return Number(fd);
                }
              }
        
              var newFD = _fdbase_++;
              fdtable[newFD] = path;
              return newFD;
            }
        
            var _fdbase_;
            var _fdtable_: string[];
        
            function get_fdtable() {
              if (!_fdtable_) {
                _fdtable_ = [];
                _fdbase_ = 34957346;
              }
              return _fdtable_;
            }
          }
        
        
        
        
        
          function getStartMatcher(oldPath: string) {
        
            if (!oldPath) return (txt: string) => !txt;
        
            return (txt: string) => {
              if (!txt) return false;
              if (txt.length < oldPath.length) return false;
              return txt.slice(0, oldPath.length) === oldPath;
            };
          }
        
        
        }
      • module.d.ts
        declare module noapi {
        
          export interface Module {
            exports: any;
            require(id: string): any;
            id: string;
            filename: string;
            loaded: boolean;
            parent: any;
            children: any[];
          }
        
        }
      • module.ts
        module noapi {
        
          export function createModule(
            id: string,
            filename: string,
            parent: any,
            requireForModule: (moduleName: string) => any): Module {
        
            var module: Module = {
              exports: {},
              id,
              filename,
              loaded: false,
              parent,
              children: [],
              require
            };
        
            return module;
        
            var _moduleCache: any;
            var _resolveCache: any;
        
            function require(moduleName: string): any {
              var key = '*' + moduleName;
              if (_moduleCache && key in _moduleCache)
                return _moduleCache[key];
        
              var mod = requireForModule(moduleName);
              (_moduleCache || (_moduleCache = {}))[key] = mod;
              return mod;
            }
        
          }
        
        }
      • os.d.ts
        declare module noapi {
        
          export interface OS {
            tmpdir(): string;
            hostname(): string;
            type(): string;
            platform(): string;
            arch(): string;
            release(): string;
            uptime(): number;
            loadavg(): number[];
            totalmem(): number;
            freemem(): number;
            cpus(): { model: string; speed: number; times: { user: number; nice: number; sys: number; idle: number; irq?: number; }; }[];
            networkInterfaces(): any;
            EOL: string;
          }
        
        }
      • os.ts
        module noapi {
        
          export function createOS(global: { process: Process; }) {
        
            return {
              EOL: '\n',
              tmpdir: () => '/.tmp',
              hostname: () => 'localhost',
              type: () => 'Linux',
              arch: () => global.process.arch,
              platform: () => global.process.platform,
              release: () => '3.16.0-38-generic',
              uptime: () => global.process.uptime(),
              loadavg: () => [0.7275390625, 0.65576171875, 0.4658203125],
              totalmem: () => 3680739328 + ((Math.random() * 1000) | 0),
              freemem: () => 2344873984 - ((Math.random() * 1000) | 0),
              cpus: () => [
                { model: 'AMD A4-1250 APU with Radeon(TM) HD Graphics', speed: 800, times: { user: 8058000, nice: 29600, sys: 1079400, idle: 128185400, irq: 0 } },
                { model: 'AMD A4-1250 APU with Radeon(TM) HD Graphics', speed: 800, times: { user: 7779400, nice: 33000, sys: 1069200, idle: 127970900, irq: 0 } }
              ],
              networkInterfaces: () => {
                return {
                  lo: [
                    { address: '127.0.0.1', family: 'IPv4', internal: true },
                    { address: '::1', family: 'IPv6', internal: true }
                  ],
                  wlan0: [
                    { address: '192.168.1.3', family: 'IPv4', internal: false },
                    { address: 'fe80::8256:f2ff:fe04:3d29', family: 'IPv6', internal: false }
                  ]
                }
              }
            };
          }
        
        }
      • path.d.ts
        declare module noapi {
        
          export interface Path {
        
            normalize(p: string): string;
            join(...paths: any[]): string;
            resolve(...pathSegments: any[]): string;
            isAbsolute(p: string): boolean;
            relative(from: string, to: string): string;
            dirname(p: string): string;
            basename(p: string, ext?: string): string;
            extname(p: string): string;
            sep: string;
            delimiter: string;
        
            // new apis? definitely not in v0.10.38
            parse?(p: string): { root: string; dir: string; base: string; ext: string; name: string; };
            format?(pP: { root: string; dir: string; base: string; ext: string; name: string; }): string;
        
          }
        
        }
      • path.ts
        module noapi {
        
          export function createPath(global: { process: Process; }): Path {
        
            var result: Path = {
              basename, extname,
              dirname,
              isAbsolute,
              normalize,
              join,
              relative, resolve,
              sep: '/',
              delimiter: ':'
            };
            return result;
        
            function isAbsolute(p: string): boolean {
              return /^\//.test(p);
            }
        
            function extname(p: string): string {
        
              var base = basename(p);
              var lastDot = base.lastIndexOf('.');
              if (lastDot >= 0)
                return base.slice(lastDot);
              else
                return '';
        
            }
        
            function join(...paths: any[]): string {
              return join_core(paths);
            }
        
            function join_core(paths: any[]): string {
              var parts: string[] = [];
              var trailSlash = false;
              for (var i = 0; i < paths.length; i++) {
                var part = paths[i];
                if (!part) continue;
        
                if (parts.length) {
                  var wlead = part;
                  part = part.replace(/^\/*/, '');
                  if (!part) continue;
                  if (wlead.length > part.length)
                    parts.push('');
                }
                var wtrail = part;
                part = part.replace(/\/*$/, '');
                if (!part) continue;
                parts.push(part);
        
                trailSlash = wtrail.length > part.length;
              }
        
              if (trailSlash)
                parts.push('/');
        
              return parts.join('/');
            }
        
            function relative(from: string, to: string): string {
              throw new Error('path/relative is not implemented');
            }
        
            function resolve(...pathSegments: any[]): string {
        
              var res = join_core(pathSegments);
        
              if (!/^\//.test(res))
                res = global.process.cwd() + res;
        
              return res;
            }
          }
        
          export function basename(p: string, ext?: string): string {
        
            p = normalize(p);
            if (p === '/')
              return '';
        
            var result: string;
        
            var lastSlash = p.lastIndexOf('/');
            if (lastSlash === p.length - 1) {
              var prevSlash = p.lastIndexOf('/', lastSlash - 1);
              if (prevSlash < 0)
                prevSlash = 0;
              result = p.slice(prevSlash + 1, lastSlash);
            }
            else {
              result = p.slice(lastSlash + 1);
            }
        
            if (ext && result.length >= ext.length && result.slice(-ext.length) === ext)
              result = result.slice(0, result.length - ext.length);
          }
        
          export function dirname(p: string): string {
            var p = normalize(p);
            if (p === '/') return '/';
            var lastSlash = p.lastIndexOf('/');
            if (lastSlash === p.length - 1)
              lastSlash = p.lastIndexOf('/', lastSlash - 1);
            return p.slice(0, lastSlash + 1);
          }
        
          export function normalize(p: string): string {
            return p;
          }
        
        }
      • process.d.ts
        declare module noapi {
        
          export interface Process extends EventEmitter {
        
            stdout: WritableStream;
            stderr: WritableStream;
            stdin: ReadableStream;
        
            argv: string[];
        
            execPath: string;
        
            abort(): void;
        
            chdir(directory: string): void;
            cwd(): string;
        
            env: any;
        
            exit(code?: number): void;
        
            getgid(): number;
            setgid(id: number): void;
            setgid(id: string): void;
        
            getuid(): number;
            setuid(id: number): void;
            setuid(id: string): void;
        
            version: string;
            versions: {
              http_parser: string;
              node: string;
              v8: string;
              ares: string;
              uv: string;
              zlib: string;
              openssl: string;
            };
        
            config: {
              target_defaults: {
                cflags: any[];
                default_configuration: string;
                defines: string[];
                include_dirs: string[];
                libraries: string[];
              };
              variables: {
                clang?: number;
                host_arch?: string;
                target_arch?: string;
                visibility?: string;
              };
            };
        
            kill(pid: number, signal?: string): void;
        
            pid: number;
        
            title: string;
        
            arch: string;
            platform: string;
        
            memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; };
        
            nextTick(callback: Function): void;
        
            umask(mask?: number): number;
        
            uptime(): number;
            hrtime(time?: number[]): number[];
        
            // Worker
            send?(message: any, sendHandle?: any): void;
          }
        }
      • process.ts
        module noapi {
        
          export function createProcess(
            modules: { fs: FS; path: Path; },
            options: {
              argv: string[];
              cwd: string;
              env: any;
            }): Process {
        
            var evt = createEventEmitter();
        
            return {
              abort, exit, kill,
              nextTick,
              chdir, cwd,
        
              title: 'node',
              arch: 'ia32',
              platform: 'linux',
              execPath: '/usr/bin/nodejs',
        
              getgid, setgid, getuid, setuid,
        
              stdout: load_stdout(), stderr: load_stderr(), stdin: load_stdin(),
        
              memoryUsage,
        
              uptime: load_uptime(),
              hrtime: <any>function() { throw new Error('High resultion time is not implemenetd yet.'); },
        
              pid: load_pid(),
              umask: load_umask(),
              config: load_config(),
              versions: load_versions(),
              version: load_versions().node,
        
              argv: options.argv,
              env: options.env,
        
              addListener: evt.addListener,
              on: evt.on,
              once: evt.once,
              removeListener: evt.removeListener,
              removeAllListeners: evt.removeAllListeners,
              setMaxListeners: evt.setMaxListeners,
              listeners: evt.listeners,
              emit: evt.emit
        
            };
        
            function abort() {
            }
        
            function exit(code?: number) {
            }
        
            function kill(pid: number, signal?: string) {
              // when we emulate processes, implement process termination
            }
        
        
        
        
            function chdir(directory: string) {
              var dirStat = modules.fs.statSync(directory);
        
              if (dirStat && dirStat.isDirectory()) {
                if (directory !== cwd()) {
                  var normDirectory = modules.path.normalize(directory);
                  if (cwd() !== normDirectory) {
                    options.cwd = normDirectory;
                  }
                }
              }
              else {
                // TODO: throw a node-shaped error instead
                throw new Error('ENOENT, no such file or directory');
              }
            }
        
            function cwd(): string {
              return options.cwd;
            }
        
        
        
            function getgid() {
              // taken from node running on ubuntu
              return 1000;
            }
        
            function setgid(id: any) {
              // TODO: use node-shaped error
              throw new Error('EPERM, Operation not permitted');
            }
        
            function getuid(): number {
              // taken from node running on ubuntu
              return 1000;
            }
        
            function setuid(id: any) {
              // TODO: use node-shaped error
              throw new Error('EPERM, Operation not permitted');
            }
        
        
        
            function load_uptime() {
              var _uptime_start_ = typeof Date.now === 'function' ? Date.now() : +(new Date());
              return uptime;
        
              function uptime() {
                var now = typeof Date.now === 'function' ? Date.now() : +(new Date());
                return now - _uptime_start_;
              }
            }
        
        
        
            function load_stdout() {
              return <WritableStream>{
              };
            }
        
            function load_stderr() {
              return <WritableStream>{
              };
            }
        
            function load_stdin() {
              return <ReadableStream>{
              };
            }
        
        
        
            function memoryUsage(): { rss: number; heapTotal: number; heapUsed: number; } {
              return {
                rss: 13225984 + ((Math.random() * 3000) | 0),
                heapTotal: 7130752 + ((Math.random() * 3000) | 0),
                heapUsed: 2449612 + ((Math.random() * 3000) | 0)
              };
            }
        
        
        
            function load_pid() {
              return 32754 + ((Math.random() * 500) | 0);
            }
        
            function load_umask() {
              var _umask_;
              return umask;
        
              function umask(mask?: number): number {
                if (typeof _umask_ !== 'number') {
                  _umask_ = 2;
                }
        
                if (typeof mask === 'number') {
                  var res = _umask_;
                  _umask_ = mask;
                  return res;
                }
        
                return _umask_;
              }
            }
        
            function load_versions() {
              // real node running on ubuntu as of Friday 22 of May 2015
              // (these might not be properly implemented when hosted in browser)
              return {
                http_parser: '1.0',
                node: '0.10.38',
                v8: '3.14.5.9',
                ares: '1.9.0-DEV',
                uv: '0.10.36',
                zlib: '1.2.8',
                modules: '11',
                openssl: '1.0.1m'
              };
            }
        
        
            function load_config() {
              return {
                target_defaults:
                {
                  cflags: [],
                  default_configuration: 'Release',
                  defines: [],
                  include_dirs: [],
                  libraries: []
                },
                variables:
                {
                  clang: 0,
                  gcc_version: 48,
                  host_arch: 'ia32',
                  node_install_npm: true,
                  node_prefix: '/usr',
                  node_shared_cares: false,
                  node_shared_http_parser: false,
                  node_shared_libuv: false,
                  node_shared_openssl: false,
                  node_shared_v8: false,
                  node_shared_zlib: false,
                  node_tag: '',
                  node_unsafe_optimizations: 0,
                  node_use_dtrace: false,
                  node_use_etw: false,
                  node_use_openssl: true,
                  node_use_perfctr: false,
                  node_use_systemtap: false,
                  openssl_no_asm: 0,
                  python: '/usr/bin/python',
                  target_arch: 'ia32',
                  v8_enable_gdbjit: 0,
                  v8_no_strict_aliasing: 1,
                  v8_use_snapshot: false,
                  want_separate_host_toolset: 0
                }
              };
            }
          }
        }
      • stream.d.ts
        declare module noapi {
        
          export interface ReadableStream extends EventEmitter {
            readable: boolean;
            read(size?: number): string|Buffer;
            setEncoding(encoding: string): void;
            pause(): void;
            resume(): void;
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
            unpipe<T extends WritableStream>(destination?: T): void;
            unshift(chunk: string): void;
            unshift(chunk: Buffer): void;
            wrap(oldStream: ReadableStream): ReadableStream;
          }
        
          export interface WritableStream extends EventEmitter {
            writable: boolean;
            write(buffer: Buffer, cb?: Function): boolean;
            write(str: string, cb?: Function): boolean;
            write(str: string, encoding?: string, cb?: Function): boolean;
            end(): void;
            end(buffer: Buffer, cb?: Function): void;
            end(str: string, cb?: Function): void;
            end(str: string, encoding?: string, cb?: Function): void
          }
        
          export interface Stream extends EventEmitter {
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
          }
        
          export interface ReadableOptions {
            highWaterMark?: number;
            encoding?: string;
            objectMode?: boolean;
          }
        
          export interface Readable extends EventEmitter, ReadableStream {
            readable: boolean;
            //constructor(opts?: ReadableOptions)
            _read(size: number): void;
        
            read(size?: number): string|Buffer;
        
            setEncoding(encoding: string): void;
        
            pause(): void;
        
            resume(): void;
        
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
        
            unpipe(destination?: WritableStream): void;
        
            unshift(chunk: string): void;
        
            unshift(chunk: Buffer): void;
        
            wrap(oldStream: ReadableStream): ReadableStream;
        
            push(chunk: any, encoding?: string): boolean;
        
          }
        
          export interface WritableOptions {
            highWaterMark?: number;
            decodeStrings?: boolean;
          }
        
          export interface Writable extends EventEmitter, WritableStream {
            writable: boolean;
            // constructor(opts?: WritableOptions)
        
            _write(data: Buffer, encoding: string, callback: Function): void;
        
            _write(data: string, encoding: string, callback: Function): void;
        
            write(buffer: Buffer, cb?: Function): boolean;
        
            write(str: string, cb?: Function): boolean;
        
            write(str: string, encoding?: string, cb?: Function): boolean;
        
            end(): void;
        
            end(buffer: Buffer, cb?: Function): void;
        
            end(str: string, cb?: Function): void;
        
            end(str: string, encoding?: string, cb?: Function): void;
        
          }
        
          export interface DuplexOptions extends ReadableOptions, WritableOptions {
            allowHalfOpen?: boolean;
          }
        
          /**
           * Note: Duplex extends both Readable and Writable.
           */
          export interface Duplex extends Readable {
            writable: boolean;
            // constructor(opts?: DuplexOptions);
        
            _write(data: Buffer, encoding: string, callback: Function);
            _write(data: string, encoding: string, callback: Function): void;
        
            write(buffer: Buffer, cb?: Function);
            write(str: string, cb?: Function);
            write(str: string, encoding?: string, cb?: Function): boolean;
        
            end(): void;
            end(buffer: Buffer, cb?: Function): void;
            end(str: string, cb?: Function): void;
            end(str: string, encoding?: string, cb?: Function): void;
        
          }
        
          export interface TransformOptions extends ReadableOptions, WritableOptions { }
        
          /**
             * Note: Transform lacks the _read and _write methods of Readable/Writable.
             */
          interface Transform extends EventEmitter {
            readable: boolean;
            writable: boolean;
            // constructor(opts?: TransformOptions)
        
            _transform(chunk: Buffer, encoding: string, callback: Function): void;
            _transform(chunk: string, encoding: string, callback: Function): void;
        
            _flush(callback: Function): void;
        
            read(size?: number): any;
        
            setEncoding(encoding: string): void;
        
            pause(): void;
        
            resume(): void;
        
            pipe<T extends WritableStream>(destination: T, options?: { end?: boolean; }): T;
        
            unpipe(destination?: WritableStream): void;
        
            unshift(chunk: string): void;
        
            unshift(chunk: Buffer): void;
        
            wrap(oldStream: ReadableStream): ReadableStream;
        
            push(chunk: any, encoding?: string): boolean;
        
            write(buffer: Buffer, cb?: Function): boolean;
            write(str: string, cb?: Function): boolean;
            write(str: string, encoding?: string, cb?: Function): boolean;
        
            end(): void;
            end(buffer: Buffer, cb?: Function): void;
            end(str: string, cb?: Function): void;
            end(str: string, encoding?: string, cb?: Function): void;
        
          }
        }
    • nobrowser
      • HostedWindow.ts
        module nobrowser {
        
          export class HostedWindow {
        
            constructor(private _window: Window, private _drive: persistence.Drive) {
              
        
            }
        
          }
        
        }
      • overrideLocalStorage.ts
        module nobrowser {
        
          export function overrideLocalStorage(drive: persistence.Drive, cachePath: string) {
        
            var cachePathDir = cachePath + (cachePath.slice(-1) === '/' ? '' : '/');
        
            return LocalStorageOverride;
        
            class LocalStorageOverride {
        
              private _keys: string[] = null;
              length = 0;
        
              constructor() {
                var files = drive.files();
                for (var i = 0; i < files.length; i++) {
                  var f = files[i];
                  if (f.length > cachePathDir.length && f.slice(0, cachePathDir.length) === cachePathDir)
                    this._keys.push(f.slice(cachePathDir.length));
                }
                this.length = this._keys.length;
              }
        
              clear() {
                for (var i = 0; i < this._keys.length; i++) {
                  var f = cachePathDir + this._keys[i];
                  drive.write(f, null);
                }
                this._keys = [];
              }
        
            	key(index: number) {
                return this._keys[index];
              }
        
            	getItem(key: string): string {
                var keypath = cachePathDir + key;
                return drive.read(keypath);
              }
        
            	setItem(key: string, value: string): void {
                var keypath = cachePathDir + key;
                drive.write(keypath, value);
                for (var i = 0; i < this._keys.length; i++) {
                  if (key === this._keys[i]) return;
                }
                this._keys.push(key);
                this.length++;
              }
        
            	removeItem(key: string): void {
                var keypath = cachePathDir + key;
                for (var i = 0; i < this._keys.length; i++) {
                  if (key === this._keys[i]) {
                    this._keys.splice(i, 1);
                    this.length++;
                    drive.write(keypath, null);
                    return;
                  }
                }
              }
            }
        
          }
        }
      • overrideXMLHttpRequest.ts
        module nobrowser {
        
          export function overrideXMLHttpRequest(readCache: (url: string, callback: (content: string) => void) => void) {
        
            return XMLHttpRequestOverride;
        
            // urlBase - 'https://rawgit.com/jeffpar/pcjs/master'
        
        
            class XMLHttpRequestOverride {
        
              private _url: string = null;
        
              status = 0;
              readyState = 0;
              responseText = null;
              onreadystatechange: () => void = null;
        
              open(method: string, url: string) {
                this._url = url;
              }
        
              send() {
                var completed = false;
                this.readyState = 0;
                readCache(this._url, content => {
                  this.status = 200;
                  this.readyState = 4;
                  this.responseText = content;
                  if (completed)
                    this.onreadystatechange();
                  return;
                });
        
                if (this.readyState === 4) {
                  setTimeout(() => this.onreadystatechange(), 1);
                }
        
        
              }
        
              setRequestHeader() {
              }
        
            }
          }
        
        	export module overrideXMLHttpRequest {
        
            export function withDrive(drive: persistence.Drive, cachePath: string, realXMLHttpRequest: typeof XMLHttpRequest) {
              return overrideXMLHttpRequest(
                (url, callback) => {
                  var existing = cachePath + (cachePath.slice(-1) === '/' ? '' : '/') + (url.charAt(0) === '/' ? url.slice(1) : url);
        
                  var existingContent = drive.read(existing);
                  if (existingContent) {
                    callback(existingContent);
                    return;
                  }
        
                  var xhr = new realXMLHttpRequest();
                  xhr.open('GET', url);
                  xhr.onreadystatechange = () => {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                      var response = xhr.responseText || xhr.response;
                      drive.write(existing, response);
                      callback(response);
                    }
                  };
                  xhr.send();
                });
            }
        
          }
        
        }
    • Context.ts
      module isolation {
      
        export class Context {
      
          private _frame;
          private _obscureScope: any = {};
          private _disposed = false;
      
          constructor(private _window: Window) {
            this._frame = createFrame(this._window);
            defineObscureScope(this._obscureScope, this._frame.global);
            defineObscureScope(this._obscureScope, this._frame.window);
            this._obscureScope.global = void 0;
            var setGlobal = this._frame.evalFN('(function() { return function(global) { window.global = global; }; })()');
            setGlobal(this._obscureScope);
          }
      
          run(code: string, path: string, scope: any) {
            path = path || typeof path === 'string' ? path : createTimebasedPath();
            this._obscureScope.global = scope || {};
            var decoratedCode =
              'with(window.global){with(global){   ' + code +
              '\n }}  //# sourceURL=' + path;
            var result = this._frame.evalFN(decoratedCode);
            this._obscureScope.global = null;
            return result;
          }
      
          dispose() {
            if (!this._disposed) {
              document.body.removeChild(this._frame.iframe);
              this._disposed = true;
            }
          }
      
        }
      
        function createTimebasedPath() {
          var now = new Date();
          var path = now.getFullYear() +
            (now.getMonth() + 1 > 9 ? '' : '0') + now.getMonth() +
            (now.getDate() > 9 ? '' : '0') + now.getDate() + '-' +
            (now.getHours() > 9 ? '' : '0') + now.getHours() +
            (now.getMinutes() > 9 ? '' : '0') + now.getMinutes() + '-' +
            (now.getSeconds() > 9 ? '' : '0') + now.getSeconds() +
            '.' + ((now.getMilliseconds() | 0) + 1000).toString().slice(1) +
            '.js';
          return path;
        }
      
        function createFrame(window: Window) {
          var ifr = window.document.createElement('iframe');
          ifr.style.display = 'none';
          window.document.body.appendChild(ifr);
      
          var ifrwin: Window = ifr.contentWindow || (<any>ifr).window;
          var ifrdoc = ifrwin.document;
      
          if (ifrdoc.open) ifrdoc.open();
          ifrdoc.write(
            '<!' + 'doctype html' + '>' +
            '<' + 'html' + '><' + 'body' + '>' +
            '<' + 'script' + '>window.__eval_export_=function(code) { return eval(code); }</' + 'script' + '>' +
            '<' + 'body' + '></' + 'html' + '>');
          if (ifrdoc.close) ifrdoc.close();
      
          var ifrwin_eval: typeof eval = (<any>ifrwin).__eval_export_;
          try {
            delete (<any>ifrwin).__eval_export_;
          }
          catch (weirdIEFailure) {
            // no big deal if it fails
          }
      
          ifrdoc.body.innerHTML = '';
      
          return {
            document: ifrdoc,
            window: ifrwin,
            global: ifrwin_eval('this'),
            iframe: ifr,
            evalFN: ifrwin_eval
          };
        }
      
        function defineObscureScope(scope: any, pollutedGlobal: any) {
      
          var natives = defineAllowedNatives();
      
          var dummy;
      
          // normal properties
          for (var k in pollutedGlobal) {
            if (scope[k] || natives[k]) continue;
            scope[k] = dummy;
          }
      
          // non-enumerable properties directly on global
          if (Object.getOwnPropertyNames) {
            var props = Object.getOwnPropertyNames(pollutedGlobal);
            for (var i = 0; i < props.length; i++) {
              if (scope[props[i]] || natives[props[i]]) continue;
              scope[props[i]] = dummy;
            }
      
            // non-enumerable properties on global's prototype
            if (pollutedGlobal.constructor
              && pollutedGlobal.constructor.prototype
              && pollutedGlobal.constructor.prototype !== Object.prototype) {
              props = Object.getOwnPropertyNames(pollutedGlobal.constructor.prototype);
              for (var i = 0; i < props.length; i++) {
                if (scope[props[i]] || natives[props[i]]) continue;
                scope[props[i]] = dummy;
              }
            }
          }
        }
      
        var allowedNatives = null;
      
        function defineAllowedNatives() {
          return {
            setTimeout: 1, setInterval: 1, clearTimeout: 1, clearInterval: 1,
            eval: 1,
            console: 1,
            undefined: 1,
            Object: 1, Array: 1, Date: 1, Function: 1, String: 1, Boolean: 1, Number: 1,
            Infinity: 1, NaN: 1, isNaN: 1, isFinite: 1, parseInt: 1, parseFloat: 1,
            escape: 1, unescape: 1,
      
            Int32Array: 1, Int8Array: 1, Int16Array: 1,
            UInt32Array: 1, UInt8Array: 1, UInt8ClampedArray: 1, UInt16Array: 1,
            Float32Array: 1, Float64Array: 1, ArrayBuffer: 1,
      
            Math: 1, JSON: 1, RegExp: 1,
            Error: 1, SyntaxError: 1, EvalError: 1, RangeError: 1, ReferenceError: 1,
      
            toString: 1, toJSON: 1, toValue: 1,
      
            Map: 1, Promise: 1
          };
        }
      }
  • load
    • shellLoader.ts
      //declare var showCommanderInContext;
      
      function shellLoader(uniqueKey: string, document: Document, boot: shellLoader.BootModuleAPI): shellLoader.ContinueLoading {
      
        var driveMount = persistence.bootMount(uniqueKey, document);
      
        return continueLoading();
      
        function continueLoading(): shellLoader.ContinueLoading {
          driveMount = driveMount.continueLoading();
      
          boot.api.title('Loading files: ' + progressText('dom'), 0.05 + 0.8* driveMount.loadedSize/driveMount.totalSize);
          return { continueLoading, finishLoading };
        }
      
        var timings;
        var prevStage;
        var prevStageStart;
        var prevTimeText;
        function progressText(stage) {
      
          var fileText = driveMount.loadedFileCount + ' (' + driveMount.totalSize + ' total)';
      
          var now = +new Date();
      
          if (!prevStage) {
            timings = [
              {stage: 'boot ui', time: boot.bootStartTime - boot.earlyStartTime}
            ];
            prevTimeText = ' boot UI ' + (boot.bootStartTime - boot.earlyStartTime) + 'ms init ' + (now - boot.bootStartTime) + 'ms';
            prevStageStart = boot.bootStartTime;
            prevStage = stage;
            return fileText + prevTimeText;
          }
          else if (prevStage !== stage) {
            timings.push({
              stage: prevStage,
              time: now-prevStageStart
            });
            prevTimeText += ' ' + prevStage + ' ' + (now - prevStageStart) + 'ms';
            prevStageStart = now;
            prevStage = stage;
            return fileText + prevTimeText;
          }
          else {
            return fileText + prevTimeText + ' ' + prevStage + ' ' + (now - prevStageStart) + 'ms';
          }
      
        }
      
        function finishLoading() {
      
          boot.api.title('Loading modifications: ' + progressText('local'), 0.85);
          driveMount.finishLoading(drive => {
      
            if (typeof boot.api.drive === 'function') {
              boot.api.drive(drive);
            }
            boot.api.title('Loading application: ' + progressText('ui-init'), 0.9);
      
            var uiframe = createFrame();
            uiframe.iframe.style.opacity = '0';
            uiframe.iframe.style.filter = 'alpha(opacity=0)';
            var uiframeBase = (<any>window).base(uiframe.global);
            uiframeBase.apply();
      
      
            var wasResized = false;
            var resizeHandlers: any[] = [];
            on(window, 'scroll', global_resize_detect);
            on(window, 'resize', global_resize_detect);
            on(document.body, 'resize', global_resize_detect);
            on(document.body, 'scroll', global_resize_detect);
            if (document.documentElement) on(document.documentElement, 'resize', global_resize_detect);
            if (document.documentElement) on(document.documentElement, 'scroll', global_resize_detect);
            on(uiframe.document.body, 'touchstart', global_resize_detect);
            on(uiframe.document.body, 'touchmove', global_resize_detect);
            on(uiframe.document.body, 'touchend', global_resize_detect);
            on(uiframe.document.body, 'pointerdown', global_resize_detect);
            on(uiframe.document.body, 'pointerup', global_resize_detect);
            on(uiframe.document.body, 'pointerout', global_resize_detect);
            on(uiframe.document.body, 'keydown', global_resize_detect);
            on(uiframe.document.body, 'keyup', global_resize_detect);
      
      
            (<any>uiframe.global).require = shell_require;
            boot.api.title('Loaded: ' + progressText('ui'), 0.95);
      
            global_resize_delayed();
      
            // TODO: do this concurrently with drive loading
            try {
      
              var indexHTML = drive.read('/shell/index.html');
              if (indexHTML) {
                uiframe.document.write(indexHTML);
              }
      
              var files = drive.files();
              var shellScripts: string[] = [];
              for (var i = 0; i < files.length; i++) {
                if (!/^\/shell\//.test(files[i])) continue;
                var content = drive.read(files[i]);
                if (/\.js$/.test(files[i])) {
                  uiframe.document.write('<' + 'script' + '>' + content + ' //# sourceURL=' + files[i] + '</' + 'script' + '>');
                }
                else if (/\.css$/.test(files[i])) {
                  uiframe.document.write('<' + 'style' + ' type="text/css">' + content + ' //# sourceURL=' + files[i] + '</' + 'style' + '>');
                }
              }
            }
            catch (error) {
              alert('Shell initialisation failed ' + error.message+'\n'+error.stack+'\n'+error);
            }
      
            if (uiframe.document.close)
            	uiframe.document.close();
      
            function shell_require(moduleName): any {
              switch (moduleName) {
                case 'nowindow': return window;
                case 'noui': return uiframe;
                case 'nodrive': return drive;
                case 'uniqueKey': return uniqueKey;
                case 'resize': return { on: onresize, off: offresize };
                case 'timings': return timings;
              }
              throw new Error('Module ' + moduleName + ' is not supported.');
            }
      
            function onresize(handler) {
              if (typeof handler !== 'function') return;
              resizeHandlers.push(handler);
            }
      
            function offresize(handler) {
              if (typeof handler !== 'function') return;
              for (var i = 0; i < resizeHandlers.length; i++) {
                if (resizeHandlers[i] === handler) {
                  resizeHandlers.splice(i, 1);
                }
              }
            }
      
            function global_resize_detect() {
              if (wasResized) return;
              wasResized = true;
      
              if (typeof requestAnimationFrame === 'function') {
                requestAnimationFrame(global_resize_delayed);
              }
              else {
                setTimeout(global_resize_delayed, 5);
              }
            }
      
            var lastMetrics: any = null;
            var lastScroll: any = null;
            function global_resize_delayed() {
      
              var scrollPos = getScroll();
              if (!lastScroll || (scrollPos.x !== lastScroll.x || scrollPos.y !== lastScroll.y)) {
                lastScroll = scrollPos;
                uiframe.iframe.style.left = scrollPos.x + 'px';
                uiframe.iframe.style.top = scrollPos.y + 'px';
              }
      
              wasResized = false;
      
              var metrics = getMetrics();
              if (!lastMetrics || (metrics.windowWidth !== lastMetrics.windowWidth
                && metrics.windowHeight !== lastMetrics.windowHeight)) {
                lastMetrics = metrics;
                var w = metrics.windowWidth + 'px';
                var h = metrics.windowHeight + 'px';
                if (boot && boot.iframe) {
                  boot.iframe.style.width = w;
                  boot.iframe.style.height = h;
                }
                if (uiframe) {
                  uiframe.iframe.style.width = w;
                  uiframe.iframe.style.height = h;
                }
                document.body.style.width = w;
                document.body.style.height = h;
                if (document.body.parentElement) {
                  document.body.parentElement.style.width = w;
                  document.body.parentElement.style.height = h;
                }
      
                for (var i = 0; i < resizeHandlers.length; i++) {
                  var f = resizeHandlers[i];
                  if (f)
                    f(metrics);
                }
              }
            }
      
            function getScroll() {
              var x = window.scrollX || window.pageXOffset || document.body.scrollLeft || (document.body.parentElement ? document.body.parentElement.scrollLeft : 0) || 0;
              var y = window.scrollY || window.pageYOffset || document.body.scrollTop || (document.body.parentElement ? document.body.parentElement.scrollTop : 0) || 0;
              return { x, y };
            }
      
            function getMetrics() {
              var metrics = {
                windowWidth: window.innerWidth || (document.body.parentElement ? document.body.parentElement.clientWidth : 0) || document.body.clientWidth,
                windowHeight: window.innerHeight || (document.body.parentElement ? document.body.parentElement.clientHeight : 0) || document.body.clientHeight
              };
              return metrics;
            }
      
            boot.api.title('Preloaded: ' + progressText('ui'), 0.98);
      
            (<any>uiframe.global).shell.start(() => {
              var msg = 'Completed: ' + progressText('ui');
              boot.api.title(msg, 0.99);
      
              var start = new Date().valueOf();
              var fadeintTime = Math.min(500, ((+new Date()) - boot.bootStartTime) * 0.9);
              var animateFadeIn = setInterval(function() {
                var passed = new Date().valueOf() - start;
                var opacity = Math.min(passed, fadeintTime) / fadeintTime;
                boot.iframe.style.opacity = (1 - opacity).toString();
                if (uiframe.iframe.style.filter)
                  boot.iframe.style.filter = 'alpha(opacity=' + ((opacity * 100) | 0) + ')';
                uiframe.iframe.style.opacity = '1';
      
                uiframe.iframe.style.filter = 'alpha(opacity=100)';
      
                if (passed >= fadeintTime) {
                  clearInterval(animateFadeIn);
                  if (boot.iframe.parentElement) // old Opera may keep firing even after clearInterval
                    boot.iframe.parentElement.removeChild(boot.iframe);
                }
              }, 20);
      
              return msg;
            });
      
      
          });
      
        }
      
        function createFrame() {
      
          var ifr = <HTMLIFrameElement>elem(
            'iframe',
            {
              position: 'absolute',
              left: 0, top: 0,
              width: '100%', height: '100%',
              border: 'none',
              src: 'about:blank'
            },
            window.document.body);
      
          var ifrwin: Window = ifr.contentWindow || (<any>ifr).window;
          var ifrdoc = ifrwin.document;
      
          ifrdoc.write(
            '<!' + 'doctype html' + '>' +
            '<' + 'html' + '>' +
            '<' + 'head' + '><' + 'style' + '>' +
            'body,html{margin:0;padding:0;border:none;height:100%;border:none;background:black;}' +
            '*,*:before,*:after{box-sizing:inherit;}' +
            'html{box-sizing:border-box;}' +
            '</' + 'style' + '>\n' +
            '</'+'head'+'>'+
            '<' + 'body' + '>');
      
          return {
            document: ifrdoc,
            global: ifrwin,
            iframe: ifr
          };
      
        }
      }
      
      module shellLoader {
      
        export interface BootModuleAPI extends createFrame.LoadedResult {
          api?: any;
          earlyStartTime?: number;
          bootStartTime?: number;
        }
      
        export interface ContinueLoading {
      
          continueLoading(): ContinueLoading;
      
          finishLoading();
      
        }
      
      }
  • pcjs-embed
    • boot
      • bootUI.ts
        function bootUI(document: Document, window: Window, base) {
        
          base.elem(document.body, {
            background: 'black',
            color: 'silver',
            border: 'none',
            overflow: 'hidden',
            fontFamily: 'FixedSys, System, Terminal, Arial, Helvetica, Roboto, Droid Sans, Sans Serif',
            fontWeight: 'bold'
          });
        
          var monitorBack = base.elem('div', {
            position: 'relative',
            width: '100%', height: '100%',
            padding: '3em',
            background: '#101010',
            opacity: 0,
            transition: 'all 0.1s ease-in',
            webkitTransition: 'all 0.1s ease-in',
            mozTransition: 'all 0.1s ease-in',
            oTransition: 'all 0.1s ease-in',
            msTransition: 'all 0.1s ease-in'
          }, document.body);
        
          var hostHeight = Math.max(document.body.offsetHeight, document.body.parentElement.offsetHeight);
          var hostWidth = Math.max(document.body.offsetWidth, document.body.parentElement.offsetWidth);
        
          var totalWidth = Math.min((hostHeight - 40) * 640 / 350, hostWidth - 10);
          var totalHeight = totalWidth * 350 / 640;
        
          shake(lazerAppear);
        
          function shake(callback) {
            var shakeStart = Date.now();
            var shakeTotal = 700;
            var shakeAni = setInterval(function() {
              var passed = Date.now() - shakeStart;
              var phase = passed / shakeTotal;
              if (phase > 1) {
                monitorBack.parentElement.removeChild(monitorBack);
                clearInterval(shakeAni);
                if (callback)
                  callback();
                return;
              }
        
              if (phase < 0.1) {
                monitorBack.style.opacity = phase * 10;
                monitorBack.style.width = (100 - phase) + '%';
                monitorBack.style.height = (100 - phase) + '%';
              }
              else {
                var fadePhase = (Math.sin((phase - 0.1) * 8) + 1) / 2;
                monitorBack.style.opacity = fadePhase * 0.5;
                var shakePhase = Math.sin((phase - 0.1) * 5);
                monitorBack.style.top = shakePhase * 100 + 'px';
              }
            }, 1);
          }
        
          var lazer: HTMLElement;
          var lazerAni;
          var bootBar: HTMLElement;
        
          function lazerAppear() {
            console.log('ani: lazerAppear');
            var lazerStart = Date.now();
            var lazerTotal = 1000;
        
            lazer = elem('div', {
              position: 'absolute',
              background: 'orange',
              top: totalHeight / 2 + 'px',
              left: totalWidth / 2 + 'px',
              width: '1px',
              height: '1px',
              filter: 'blur(10px)',
              webkitFilter: 'blur(10px)',
              mozFilter: 'blur(10px)',
              oFilter: 'blur(10px)',
              msFilter: 'DXImageTransform.Microsoft.Blur(PixelRadius=\'10\')',
              transition: 'all 0.1s ease-in',
              webkitTransition: 'all 0.1s ease-in',
              mozTransition: 'all 0.1s ease-in',
              oTransition: 'all 0.1s ease-in',
              msTransition: 'all 0.1s ease-in'
            }, document.body);
        
            lazerAni = setInterval(function() {
              var lazerPhase = (Date.now() - lazerStart) / lazerTotal;
              console.log('ani: lazerPhase ' + lazerPhase);
              if (lazerPhase > 1) {
                clearInterval(lazerAni);
                if (lazer) {
                  lazer.style.opacity = <any>1;
                }
                console.log('ani: create bootBar');
                bootBar = base.elem('div', {
                  position: 'absolute',
                  top: (totalHeight / 2 - totalHeight / 140) + 'px',
                  background: 'white', color: 'white',
                  height: totalHeight / 70 + 'px',
                  width: totalWidth * 0.3 + 'px',
                  left: totalWidth * 0.48 + 'px',
                  filter: 'blur(10px)',
                  webkitFilter: 'blur(5px)',
                  mozFilter: 'blur(5px)',
                  oFilter: 'blur(5px)',
                  msFilter: 'DXImageTransform.Microsoft.Blur(PixelRadius=\'5\')',
                  fontSize: '10%',
                  innerHTML: '&nbsp;',
                  transition: 'all 0.6s ease-in',
                  webkitTransition: 'all 0.6s ease-in',
                  mozTransition: 'all 0.6s ease-in',
                  oTransition: 'all 0.6s ease-in',
                  msTransition: 'all 0.6s ease-in'
                }, document.body);
        
                return;
              }
        
              if (lazerPhase < 0.5) {
                var appearPhase = lazerPhase * 2;
                console.log('ani: appearPhase ' + appearPhase);
                var bigDiameter = Math.min(totalHeight, totalWidth) / 20;
                var diameter = bigDiameter * appearPhase;
                lazer.style.width = diameter + 'px';
                lazer.style.left = (totalWidth - diameter) / 2 + 'px';
                lazer.style.height = diameter + 'px';
                lazer.style.top = (totalHeight - diameter) / 2 + 'px';
              }
              else {
                var widenPhase = (lazerPhase - 0.5) * 2;
                console.log('ani: widenPhase ' + widenPhase);
                var bigDiameter = Math.min(totalHeight, totalWidth) / 20;
                var height = bigDiameter - (bigDiameter * 0.7) * widenPhase;
                lazer.style.height = height + 'px';
                lazer.style.top = (totalHeight - height) / 2 + 'px';
                var width = bigDiameter + (totalWidth * 0.95 - bigDiameter) * widenPhase;
                lazer.style.width = width + 'px';
                lazer.style.left = (totalWidth - width) / 2 + 'px';
              }
            }, 1);
          }
        
          function lazerStop() {
            if (lazer && lazerAni) {
              clearInterval(lazerAni);
              lazer.parentElement.removeChild(lazer);
              lazer = null;
              lazerAni = 0;
            }
          }
        
          var _ratio;
        
          var _splash: HTMLImageElement;
          var _splashStartRatio;
        
          return {
            drive: function(drive) {
              try {
                var dt = drive.read('/splash.img');
                if (dt) {
                  _splash = document.createElement('img');
                  _splash.width = 640;
                  _splash.height = 350;
                  _splash.src = dt;
                  elem(_splash, {
                    position: 'absolute',
                    top: totalWidth / 2 + 'px',
                    left: totalHeight / 4 + 'px',
                    height: '1px',
                    width: totalWidth / 2 + 'px',
                    opacity: 0.1,
        
                    filter: 'blur(10px)',
                    webkitFilter: 'blur(10px)',
                    mozFilter: 'blur(10px)',
                    oFilter: 'blur(10px)',
                    msFilter: 'DXImageTransform.Microsoft.Blur(PixelRadius=\'10\')',
        
                    transition: 'all 0.6s ease-in',
                    webkitTransition: 'all 0.6s ease-in',
                    mozTransition: 'all 0.6s ease-in',
                    oTransition: 'all 0.6s ease-in',
                    msTransition: 'all 0.6s ease-in'
        
                  }, document.body);
                  _splashStartRatio = _ratio || 0;
                }
              }
              catch (errorLoadImage) {
              }
            },
            title: function(t, ratio) {
              _ratio = ratio;
              // setText(smallTitle,t);
              if (typeof console !== 'undefined' && typeof console.log === 'function')
                console.log(t);
              if (ratio) {
                if (bootBar) {
                  console.log('ani: bootBar there ' + ratio);
                  var width = totalWidth * ratio * 0.8;
                  bootBar.style.left = (((totalWidth - width) / 2)|0) + 'px';
                  bootBar.style.width = width + 'px';
                }
                else {
                  console.log('ani: bootBar not there ' + ratio);
                }
                if (_splash) {
                  var canvPhase = (ratio - (_splashStartRatio || 0)) / (1 - _splashStartRatio || 0);
                  var width = totalWidth * 0.499 + canvPhase * totalWidth / 2;
                  var height = canvPhase * totalHeight * 0.999;
                  _splash.style.top = (totalHeight - height) / 2 + 'px';
                  _splash.style.height = height + 'px';
                  _splash.style.left = (totalWidth - width) / 2 + 'px';
                  _splash.style.width = width + 'px';
                  _splash.style.opacity = <any>canvPhase;
                  var blurRadius = (1 - canvPhase) * 10 + 2;
                  _splash.style.filter = 'blur('+blurRadius+'px)';
                  _splash.style.webkitFilter = 'blur('+blurRadius+'px)';
                  (<any>_splash.style).mozFilter = 'blur('+blurRadius+'px)';
                  (<any>_splash.style).oFilter = 'blur('+blurRadius+'px)';
                  (<any>_splash.style).msFilter = 'DXImageTransform.Microsoft.Blur(PixelRadius=\''+blurRadius+'\')';
        
                }
              }
            },
            loaded: function() {
              //setText(smallTitle, 'Loaded.');
            }
          };
        }
    • demos
      • 10mb-ega.json
        [[[{"sector":1,"data":[-1900006406,2080423120,122745995,-50651312,-1190788929,-1510801152,400874,129940992,1015022771,-2112981888,477429820,-32455037,-839944757,-1961587944,-292879796,-32455037,-2112129845,-193724356,839289790,-930435859,129717932,-854674432,-186491376,96468715,2080422656,1459749304,1935610829,-843042036,-311079149,-351886402,113426130,2113814145,-948589995,15398283,385876092,1635151433,543451500,1953653104,1869182057,1635000430,509963362,1869771333,1869357170,1852400737,1886330983,1952543333,543649385,1953724787,1293446501,1769173865,1864394606,1634887024,1735289204,1937339168,1097688436,1869116533,539828338,1769365828,1766596708,1852798068,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8388608,50397186,77905,1359151104,-1437270016]},{"sector":2,"data":[1234185451,538987842,3157554,67586,50462722,587857,262161,8388609,620945162,-14022398,33617488,872028621,-1127182656,-661750784,-956269917,553678854,332266364,-1779891341,-1608577536,-141001712,58463782,58465286,-1552151034,329481219,2144380,2081498871,-1157497083,-201915904,2081621505,1912635112,2081661363,-1199735133,-1064435600,12310670,329330176,11987068,2081988654,352725550,851508860,45371620,1476444648,674117746,1987846150,100740622,-147948525,58460966,248441816,-804139745,633393344,24444931,-930398144,2082342646,855799168,2115931072,60029,-910294928,190589,-1406206229,1299480356,129699508,-351220480,5290225,521060494,2080612654,-1157610520,28835840,5826562,-13423502,637537209,639634816,538987904,871686727,2111815423,-67105863,242591475,-1107287873,196705771,1973875456,-2134981887,-5838723,382533812,236897273,-137219297,-25421770,353798338,-137219204,-2005132746,-1552146666,-1021346808,135695150,-771313284,906637030,-896828395,-1959859834,-847503850,49939,1867385357,2035494254,1835365491,1936286752,1919885419,1936286752,1919230059,225603442,1885688330,1701011820,1684955424,1920234272,543517545,544829025,544826731,1852139639,1634038304,168655204,1141509376,543912809,1953460034,1767990816,1701999980,1761610253,1768058210,1663049839,1764781423,1868852578,1663049843,3173743,0,-1437270016]},{"sector":3,"data":[-8,1610940495,19924736,184594431,-268500800,16781056,-4079,1611989327,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-533921088,50343682,855842865,1614086976,58734339,990093369,-532872256,67124995,1124343873,1879048176,76545796,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,100687621,1661345889,1617233472,109078278,1795596393,-529725760,117468934,1929846897,1618345968,-1018105,-16277383,-260241457,134250495,-16240641,-259717041,142641151,-1962368887,-268498752,152043272,-3951,1620379983,159422217,-1677725543,-526579264,167812873,-1559617375,1621491696,176203530,-1425366871,-268498240,-1003766,-1275072335,1622477632,192984843,-1156865863,-524481600,-999669,-1022611457,-255521728,209766399,-888364855,-523432768,218156812,-754114351,1624575296,226547469,-619863847,-522321936,-991475,-485613343,1625624128,243328782,-15818519,-268435457,251719438,-217112335,1626672960,260110095,-82861831,-520286272,268500751,51388673,1627721793,276891408,185639177,-519237439,285282064,319889681,1628770625,293672721,454140185,65521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":4,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":5,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":6,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":7,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":8,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":9,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":10,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-970063872,3069190,1978000104,-1331671016,-398392276,984613079,1476449000,785596041,785712838,1965964288,-704184823,-720976338,1060962094,-813694091,1965702146,47153189,1048577972,1946169046,-1342000126,-718919105,-2041417170,-2046172191,9562337,-136126074,-1998003834,-2145749531,-940178225,-1992526590,-13708482,-970009850,-13708026,785778374,6940672,-316282708,1961472744,1947024424,-1543095772,975074348,1008366787,-964266694,-350159036,694663696,-371004951,-13440971,-107126962,787173059,-2130587776,-394264371,1011280243,-387484659,-521666525,1364657900,884934414,375044]},{"sector":11,"data":[-8,1610940495,19924736,184594431,-268500800,16781056,-4079,1611989327,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-533921088,50343682,855842865,1614086976,58734339,990093369,-532872256,67124995,1124343873,1879048176,76545796,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,100687621,1661345889,1617233472,109078278,1795596393,-529725760,117468934,1929846897,1618345968,-1018105,-16277383,-260241457,134250495,-16240641,-259717041,142641151,-1962368887,-268498752,152043272,-3951,1620379983,159422217,-1677725543,-526579264,167812873,-1559617375,1621491696,176203530,-1425366871,-268498240,-1003766,-1275072335,1622477632,192984843,-1156865863,-524481600,-999669,-1022611457,-255521728,209766399,-888364855,-523432768,218156812,-754114351,1624575296,226547469,-619863847,-522321936,-991475,-485613343,1625624128,243328782,-15818519,-268435457,251719438,-217112335,1626672960,260110095,-82861831,-520286272,268500751,51388673,1627721793,276891408,185639177,-519237439,285282064,319889681,1628770625,293672721,454140185,65521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":12,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":13,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":14,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":15,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":16,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":17,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}],[{"sector":1,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-970063872,3069190,1978000104,-1331671016,-398392276,984613079,1476449000,785596041,785712838,1965964288,-704184823,-720976338,1060962094,-813694091,1965702146,47153189,1048577972,1946169046,-1342000126,-718919105,-2041417170,-2046172191,9562337,-136126074,-1998003834,-2145749531,-940178225,-1992526590,-13708482,-970009850,-13708026,785778374,6940672,-316282708,1961472744,1947024424,-1543095772,975074348,1008366787,-964266694,-350159036,694663696,-371004951,-13440971,-107126962,787173059,-2130587776,-394264371,1011280243,-387484659,-521666525,1364657900,884934414,375044]},{"sector":2,"data":[1145981271,542332751,270540832,0,0,2424832,131105]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[538976302,538976288,270540832,0,0,2424832,131105,0,538979886,538976288,270540832,0,0,2424832,33,0,827214167,538980400,541873743,0,0,759234560,199535,217712,542001495,538976288,541675081,0,0,3473408,524321,1950,1330597971,542262604,541415493,0,0,760217600,592751,13216,1330530647,1346454604,541347661,0,0,760217600,854895,19392,1330530647,1346454604,541217351,0,0,760152064,1182575,1213,1329877837,538976339,541415493,0,0,3145728,4456481,1,542001495,538976288,541937475,0,0,759234560,4524911,4867,827214167,538980400,542001474,0,0,759234560,4655983,182816,1381322563,538976322,542003014,0,0,760545280,7605103,12304,1447839048,538976322,542003014,0,0,760545280,7867247,10480,1381190996,538976322,542003014,0,0,760676352,8063855,10784,1381322563,538976321,542003014,0,0,760479744,8260463,8720,1447839048,538976321,542003014,0,0,760545280,8457071,8032,1381190996,538976321,542003014,0,0,760676352,8588143,8208]}],[{"sector":1,"data":[1095585618,538976334,542003014,0,0,760610816,8784751,27264,1230127955,538989648,542003014,0,0,760610816,9243503,5744,1162104653,538988114,542003014,0,0,760610816,9374575,9680,541278785,538976288,542398548,0,0,760938496,9571183,42,1129070915,538976288,541415493,0,0,761004032,9636719,24992,1162625347,1380009038,541415493,0,0,761004032,10095471,37360,1146241347,1162627398,541415493,0,0,761004032,10750831,36528,1346980931,541348418,541415493,0,0,761004032,11340655,9696,1129270339,538976331,541415493,0,0,761004032,11537263,7920,1414418243,541871954,541415493,0,0,761004032,11668335,53360,1213484868,538989385,542398548,0,0,761004032,12585839,493,1163153230,541344080,541415493,0,0,761004032,12651375,18544,1313423696,538976340,541415493,0,0,761004032,12979055,89584,1163281746,541676370,541415493,0,0,761004032,14420847,14816,1297237332,1279348297,541415493,0,0,761069568,14682991,43968,1128354384,1162037588,541282116,0,0,763691008,15403887,2944]},{"sector":2,"data":[1145128274,538985805,541282116,0,0,763691008,15469423,2922,1414091351,538976325,541415493,0,0,763691008,15534959,188464]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[1465662019,1329876553,1465668439,808537673,1448029744,76,0,0,1667845426,1869836146,1461744742,1868852841,1260417911,1701737061,1850286188,1718773108,543515489,544370534,544747058,543452769,7876147,1279724544,1279345231,1330400853,1264451,1413826316,1380274252,1146047826,117465925,1381258060,1482248259,1281296128,1397705795,167792965,1112493127,1330400321,1198915,1397637385,1464814665,5263941,1397310474,1162625601,710102852,1281295872,1313165391,1124401237,1212372033,1192034359,1094864716,1163019852,1280065861,1091043354,1313428302,1297373253,1281296128,1095062083,268456788,1280065859,1129271888,1414745673,1162038849,1292894261,1346718529,1229147986,1096045390,860177230,1281296128,1162171212,251679819,1262702412,1381127491,1414811205,558584641,1162284288,1146045268,1312901189,1564822596,1380323328,1380992325,1313424207,1312904275,3425603,1129270281,1380338753,476485,1129270281,1230195777,673114,1330398989,1129070914,1095781711,1659971,1514754830,1380339525,1431262021,1095058258,1330383104,1280065859,139150159,1330383872,1129070915,1095781711,873539,1230521610,1380272980,38552910,1162087936,1163150668,1213481296,1162690894,1275658316,1279345487,1414090313,1460207620,1163151681,1414415702,1444151326,1145654337,1128617025,1397048399,1162692421,1683182670,1162284544,1381319508,1414415698,1263747412,1275789348,1279541583]},{"sector":9,"data":[1095909961,6248786,1330398986,1397506370,340089417,1430390784,1346653257,2900548,1413826321,1414742348,1263749444,1312901187,6440263,1129270283,1314212929,1262702412,1275789321,1397441359,1162692421,1528910,1413826316,1263747412,1430607185,184558405,1112493127,1279675457,374556481,1381437952,1346720841,1229344594,1414743372,1196312914,1192034363,1430475845,1313165906,1111773268,1325924389,1179534672,1246055497,1163070208,1230131284,1414091343,301998169,1414808915,1229673281,1380275278,1312901187,2639175,1380471813,3692367,1163019787,1112099909,1498562898,1225588832,1096042830,1414352724,1162625601,1393295428,1096045637,1431391059,574969157,1162284800,1146047828,1212501077,1279544897,201338693,1414808903,1146113349,1163282770,1191903324,1413567557,1095650639,4736333,1330398994,1296843074,1163154241,1312901202,474303556,1162285056,1330794580,1162627398,1230132307,3819342,1413829393,1263747412,1313294675,1380994113,2507599,1128481038,1381192517,1431262021,1078281042,1162284544,1330794580,1145323843,1397966162,1275527218,1280463955,5918277,1413826319,1347241300,1162627398,1162690894,1275723873,1296318799,1280656463,201338181,1094930252,1095062092,1129270348,1275789318,1279345487,1145979208,738636,1414745095,1413563218,1191968857,1094864716,1312901196,356863044,1281296128,1414091351,167794245,1094930252,1280065868,344911,1413826314,1397900630]},{"sector":10,"data":[55463753,1162284800,1397639508,1129202004,1413563461,201340481,1129534281,1313162578,1111577159,1192034347,1413567557,1095257423,1162626126,1141506121,1413827653,1330921797,117458765,1381258060,1464880451,1163072000,1397051988,1129469263,1312901189,1380273220,1275854915,1380204879,1431262021,1027949394,1313409024,1096045641,5983059,1413826317,1179603536,1229278281,3757134,1163019786,1146047813,776293461,1229326336,1413563470,4541775,1129270283,1330531393,1497778516,1091043342,1346982734,1314276690,1330383872,1163021123,1381322579,4080963,1397706761,1163281748,2053198,1330398989,1380729154,1280065861,1065807,1330398986,1179402562,289752402,1313147136,1162625601,693325636,1095108864,1162625364,22301016,1347357696,1095781957,1095649364,4932941,1413826321,1430540109,1229342028,1095648588,3229005,1163019788,1397051973,1129469263,285228869,1414808915,1397445441,1129597271,1330794568,167782211,1094930252,1095517772,807751,1413829387,1346459475,1263488840,1090977819,1413563460,4607311,1280065805,1163019087,1381322579,4343107,1280201997,1397441359,1162692421,1594446,1330398987,1095516482,1129270348,1091108879,1430868814,1380274256,1493499983,1145849161,1192099869,1330467909,1162630468,1195463509,285225029,1229342020,1095255374,1162626126,1279410516,100687429,1163021407,5391425,1313424908,1397051972,1129469263,15429]},{"sector":11,"data":[1667845438,1869836146,1461744742,1868852841,1394635639,1702130553,1868767341,1734960750,1952543349,544108393,1969516397,1713399148,1226863215,1345277250,1415065411,5521711,1380126976,1163149637,1414748499,1230261573,38946125,1313410816,1380537681,1313819717,1414416711,218107219,1431391817,1397051977,1163154265,251658573,1280067915,1414748499,1230261573,55723341,1313149440,1162625601,1414748499,1230261573,1397900621,1142095876,1111577417,1498629452,1296389203,1162692948,349010,0,0,0,1768838424,543450484,1952543827,673215333,1851880531,1685217636,117440553,1095977284,54873154,1313408768,1380537681,100663621,1111576133,148812,1296387849,1312902996,411987,1095717895,1229538131,1091108868,1414091598,1296387919,5,0,1667845404,1869836146,1293972582,1702065519,1967269920,1699950451,1818323314,117440553,1095977284,54873154,1313408768,1380537681,100663621,1111576133,148812,0,1397310535,1497451600,824195616,539767603,539768377,975188535,1095189792,1869424672,1948280178,544104808,692794422,1953068832,1850024040,1668178280,1126196325,1919904879,1936278560,2036427888,1141309440,1111577417,279884,1447379978,1296384841,222643279,1229063680,1414283860,1393098753,1430475845,1380930386,1376583782,1229734213,1112491354,1413694794,1225195530,1230328142,6636882,1431192839,1245859661,1392902151,1279414868]},{"sector":12,"data":[100666196,1111576133,345420,1313817351,1280266836,1325793283,1431327829,83888212,1163413840,100665676,1312899923,807500,1280262921,1313428047,151366,1431192842,1330005069,106124366,1212353280,1129005893,1330860629,167798866,1163284301,1397904707,6771279,0,0,0,3,2097152,262176,-12648448,-14680065,-15728641,-16252929,-16515073,-16646145,-16711681,2130771967,1057030143,520159231,251723775,-16711681,-16711681,2131820543,2134441983,1065156607,1073545215,536805375,536805375,1073741823,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,4194304,6291456,7340032,7864320,8126464,8257536,8323072,-2139160576,-1065418752,8257536,7733248,6684672,4390912,196608,-2147418112,-2147418112,-1073741824,-1073741824,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196611,2097159,262176,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},{"sector":13,"data":[-1,-1,-1,13041663,3670016,1048576,1048576,1048576,1048576,1048576,1048576,1048576,1048576,1048576,1048576,1048576,3670016,12976128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2097167,262176,-65536,12648447,12584704,12584704,12584704,16254720,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,12599040,12584704,12584704,12584704,-63744,-1,-1,-1,-1,65535,-12648448,2160895,2099200,-1623455744,-1627096846,-1627111182,-1627111182,-1627111182,-939245326,-939245530,-469483482,-234602418,-117161826,-234602434,-419151714,-838582066,-1643888410,-1677442830,-1744551822,-2147205070,-2147205118,-2147205118,-2143535102,2127874,2099200,-12646400,63743,0,0,0,0,0,983043,2097167,262176,-65536,-1,-1,-1,-1,-1,-50331649,-117440705,-117440737,-117440737,-117440737,-117440737,16580383,16269056,16260864,16260864,16260864,16523008,-117489920,-117440737,-117440737]},{"sector":14,"data":[-117440737,-117440737,-50331873,-193,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,16777216,16777344,16777344,16777344,16777344,16777344,-16711552,-16678657,16810239,16777344,16777344,16777344,16777344,16777344,128,0,0,0,0,0,0,0,0,0,0,458755,2097152,262176,2147352576,2147418111,1073545215,1073545215,536412159,536412159,267452415,267452415,132186111,132186111,62980095,62980095,25231359,25231359,25231359,25231359,267452415,267452415,267452415,267452415,267452415,267452415,267452415,267452415,267452415,267452415,267452415,267452415,-1,-1,-1,-1,65535,0,0,0,-2147418112,-2147418112,-1073545216,-1073545216,-536412160,-536412160,-267452416,-267452416,-132186112,-132186112,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,0,0,0,0,0,0,0,524291,2097158,262176,16777216,16842751,16842751,16842751,16842751,16842751,16842751,16842751,16842751,16842751,16842751,16842751,16842751]},{"sector":15,"data":[16842751,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,-130088960,-130088960,-130088960,-130088960,2013265920,2013265920,2017329152,2017329152,2017329152,2017329152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,524291,2097160,262176,-65536,-1,65535,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,-193,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,-31522816,102236160,102236160,102236160,102236160,102236160,102236160,102236160,-31522816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,851988,16842756,0,-1,-1,-4097,-6145]},{"sector":16,"data":[-7169,-65040,-65296,-65040,-7169,-6145,-4097,-1,-1,0,0,0,2,851988,16842756,0,-1,-1,-32769,-32770,-32772,-65288,-65296,-65288,-32772,-32770,-32769,-1,-1,0,0,0,2,1048591,16842754,0,-1,-65537,1073250300,266346480,2147254268,2147254268,-32772,-1,2,1048591,16842754,0,-1,2147287039,2147254268,2147254268,535826400,2147237880,-2,-1,2,1048592,16842754,0,-134219777,-268441601,-537407489,-1074159629,2147368956,-1,-1,-1,2,917519,16842754,0,2088501248,2088533116,2088533116,2080406528,-58721153,-58721153,64639,0,2,917517,16842754,0,-1,-1,-1,-16711936,-458760,-458760,-458760,0,2,917530,16842756,0,-1,-1,-16769344,-16769344,-16711937,-16711937,-16769344,-16769344,-16711937,-16711937,-16769344,-16769344,-1,-1,0,0,2,2752568,16842760,0,0,-16777216,-1056966529,-16777216,-1551894145,-522241,1673525631,-783361,-471926401,-1307137,-470943361,-2355457]},{"sector":17,"data":[-470550145,-12840961,-470550145,-12840961,-470943361,-2355457,-471926401,-1307137,1673525631,-783361,-1551894145,-522241,-1056966529,-16777216,0,-16777216,-1998856,-14680441,2124324839,-16254975,-1132466209,-1838728,-639502657,-15112450,-641665345,-16161538,1669396863,-16512769,1669396863,-16512769,1669396863,-16512769,1669396863,-16512769,-641665345,-16161538,-639502657,-15112450,-1132466209,-1838728,2124324839,-16254975,-1998856,-14680441,251723007,-16727809,-1347748609,-16727809,1331035647,-11221505,-1398115141,-5715337,1263889851,-11221577,-1414898533,-5715209,1280654763,-11221641,-1347789645,-5715273,1263889851,-11221577,-1398115141,-5748112,1331035647,-11221505,-1347748609,-5715201,1331035647,-16727809,251723007,-16727809,2,655390,16842756,0,-1,-8390401,-12586783,530507742,530507742,530507742,530507742,-12586783,-8390401,-1,0,0,1,2097152,262176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-12648448,-12583681,-12583681]}]],[[{"sector":1,"data":[-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,-12583681,64767,0,0,0,1,2097184,262176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,50331776,1929379968,1929379996,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930311836,-15763204,-15763204,-15763204,-15730436,-15732483,-15732481,-15736577,-16260865,-16269057,-16547585,-16580353,-16711426,-16711426,-16711428,-16711428,252,0,1,2097184,262176]},{"sector":2,"data":[0,0,0,0,0,0,0,0,2130706432,2130706684,-16580356,-536624897,-536625145,-536625145,-536625145,49159,49159,49159,49159,117489671,117489919,117440766,117440766,117440704,117440704,192,0,117440512,117440704,117440704,117440704,117440704,192,0,0,0,1,2097184,262176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117440512,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,117440704,192,0,117440512,117440704,117440704,117440704,117440704,192,0,0,0,1,2097184,262176]},{"sector":3,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,50331840,50790592,50847936,-1023156032,-1023164221,-218054461,-218103601,1056964815,1056964860,-14745348,-14681857,-14681857,-14681857,1057028351,1056964860,-218103556,-218103601,-1023213361,-1023164221,50839747,50847936,50389184,50331840,192,0,0,0,0,1310738,131074,65537,65536,16711681,-16777216,64,1077936383,-65336,-65536,255,0,0,-65536,255,0,0,0,0,0,524300,0,0,33619712,1700004098,1852403058,201354337,2304,0,0,33685504,1970225921,1919248754,150998016,0,0,0,1208091138,7760997,524303,0,0,33554432,2035482882,1835365491,0,0,0,1852397332,1937207140,1970230048,1142973550,1702259058,234881138,1414086999,1314213715,1096045380,738644,1413829390,1128877910,1128481093,89411141,1163071744,1229936212,1431389507,1397052741,54876745,1163070720,1229936212,1330857283,138694229,1414727936,1330860111,172248661,1162285312,1380471892,1330139973,1447380044,240406085,1163070464,1229936212,1330529603,279892,1413829389]},{"sector":4,"data":[1314213715,1229934148,476499,1096045322,1330861138,155471445,1163071744,1229936212,1213482307,1213416786,272911439,1279461888,1397052239,1145984335,1141243906,1162166863,251662672,1314213699,1229936212,1330529603,223561044,1163071488,1229936212,1313162563,1330398550,410960,1162891017,1431262030,83022,1314476813,1280065859,1128877910,807749,1413826322,1163020372,1280264275,1096045380,257119572,1498221312,1313165391,1314213715,4676,0,0,16777114,117848832,-661863680,-1957345904,-661774612,-404203690,-1875413505,70838286,-18347600,-1547685115,163250183,68061696,-1947389440,38046707,292864011,1364395147,-26032,1532559360,1149878323,130253570,1583342050,-1962742397,1297948645,-1864856373,-326412987,-1579643362,-1073020921,-286719116,104960,-1073020928,-488045707,500480,-1628962384,-385649915,44171477,303616,206472,158655498,-1057037262,-33553246,163270856,-1949791488,-768388621,1375789240,-6664110,1493172479,58048523,-1996450071,14727172,-1342028663,71600248,1149763760,-2082567419,-807270461,-164433013,267914,-801419176,1381179252,-1598500301,1347572224,45978,190536192,-1990560576,10532868,-352172919,132875011,-1957432437,-527806270,45141246,-1962779509,84404236,860901976,-1873719095,60811278,1213225560,-4464502,-402345729,1532495085,1242033027,244370037,-1341919256,81520650,1476396451,-1962742397]},{"sector":5,"data":[1297948645,-401698613,-21430608,-1192367105,-387186689,1167120524,518818645,1465309326,1979616744,138840921,263738,1996443767,-401698808,-1073020042,1183538549,-1983316472,163252294,-167268096,-1950153759,1342475248,17050,105286400,184697993,856716480,1347572434,61850,1958742784,-1962637024,-527824826,1552614064,-401831166,-1070398379,-310157729,535137026,80366941,-1983892736,-21495228,-1192629249,-454295555,1167120524,518818645,1465309326,1979581928,205949705,263738,-1142357130,-1144455680,129040393,-1023155722,1586229387,172395272,-1965847984,-487193532,29018251,1996535808,-1072958985,1963351691,11659523,309648139,-372127605,-1946454709,64564184,-385649725,190382224,-352094775,-1554935682,1284112384,33128453,62592372,49905664,-880147340,-470415437,-1072961325,-1958739595,1413306576,-352094720,1141018723,1985231878,1213475842,-201978701,-939599733,853510739,-2115776257,771943107,-1319434357,-741660154,5608,-896804725,5771,1183568171,-18839028,-402411316,359793505,1583333427,-1962742397,1297948645,-1962932022,-337955888,11004125,-1202132757,-487849990,-335545416,-622110499,290656346,326242907,366220442,411047712,461380085,517872931,1167120524,518818645,1465309326,1979510248,239504203,263738,-922860937,-1325397573,65140231,-1947169853,1183517278,-18839026,-402345780,1114768105,-1962129781,1451952206,1977879046,1914715184,71600172]},{"sector":6,"data":[1996683651,88901663,2001992323,106203154,1583333427,-1962742397,1297948645,-1207956790,-286523404,-335546696,-476951,48817387,853535488,-523155228,1443074821,-1959858037,-54305276,-134220801,-218106369,-1929383425,1430622424,-1910575989,-396929320,829815890,1023821451,225705984,1946157373,146726,1827352948,69634704,-1328742912,-6664178,1476395263,38529104,1977289560,1977879280,-1707152408,975,-1276637552,1958742784,-1976636430,855639054,-906084160,-523172748,1347483627,1927810704,-1957340928,-459648536,1493172227,989879947,1576170969,2145914512,1606431488,49120094,1562371467,182861,-335548232,-1864856338,-326412987,1457032734,-71505833,112199029,855759080,-2090967104,-443874579,-884122337,1167120524,518818645,1465309326,1979423208,-402149371,-1070399051,-310157729,535137026,-1932833443,1430622424,-1910575989,-396929320,74775414,99336243,-1946155615,-2090967078,-443874579,-884122337,1167120524,518818645,1465309326,1962627560,-339725564,-401887225,-1014300311,-310157729,535137026,-1932833443,1430622424,-1910575989,-396929320,360053546,973620875,1996489734,106859276,-527775490,921177264,1606431489,49120094,1562371467,313933,1167120524,518818645,1465309326,1979381224,105286409,263738,-1070398346,-922874901,246472842,-1962868504,-2090967101,-443874579,-900899553,-661913598,-1957345904,-661774612,-1075292330,-1978436102,-1342176218,1355611656,1912657128]},{"sector":7,"data":[-469084142,-1070337163,-310157729,535137026,-389329571,-346489315,-1864856337,-326412987,1457032734,-91690921,1586171253,139365126,-1628959312,856650240,-2090967104,-443874579,-900899553,-353894396,-1930499075,1430622424,-1910575989,-396929320,544602710,973883019,1996489734,173968151,-527775490,-620035152,1317738868,-388877562,326238297,1583333427,-1962742397,1297948645,855640266,-387388471,-353632863,1167120524,518818645,1465309326,1979321832,172395290,263738,1586172279,105810696,-855711606,384304560,856650240,-2090967104,-443874579,-900899553,1659371526,1458498557,-18599344,-1948200504,-13739792,1577465236,1795576259,990297862,1611107591,319559179,940080135,1929919496,1359449864,-2012822008,-1259863808,-387698174,74711768,-855703632,-654916354,1355021304,-997566894,263382066,-1984240906,-1950219520,172788208,855792777,105155008,-1995946871,71600388,-1017619874,142052182,1174702118,1963095867,48643,-16222327,-1017248697,38243152,956303405,2002256967,-1329334270,-87820031,43509843,1929373160,-1072998329,-922010764,-1558668,-398953984,-897122068,-16717848,28332039,1493151208,-402589208,-997523546,-1946181144,-6494014,-1746353014,-389968897,-997523566,-335573528,1220555525,1408814315,-2134639781,16831294,-1007156620,37480531,38243152,1476675385,28312946,-99947527,-385896368,-78053538,1405311992,32958545,-397196683,1676149269,963795455,1225290817]},{"sector":8,"data":[1997535619,-1190925517,-162332664,264339673,-58670710,-1978829821,-771378692,-1863876377,49006346,1348202508,401081008,333994239,239569151,-1017423368,-336002128,-1195116296,-957874173,133792513,266872695,-2027851009,2287818,-337115984,-389903618,-1047789850,-1963007512,-19076924,13969024,-133693449,-117002045,-1957627157,65589697,-1190956088,-1017577473,1912612157,2147433733,45089910,-1007107079,-1957604526,2099677896,-2130933248,16831294,314182772,886880256,-930352649,28979435,-1260144640,-12717577,-1207732733,609223679,-1310207985,-2132291068,-813666073,-1966667136,-265987848,-1964453117,2145747176,-1047801974,-1017488551,-1023356488,13909632,-402426622,512426960,113705169,209,-2133118013,54334,1048582260,1963065556,62056453,-219673365,-1959294208,1977289694,-1950137599,14936267,-1022603383,2114373126,-386269184,-55049290,1763328,-1057043202,-100642328,-469701881,-335666143,-81664512,8914630,-1914125568,168326400,-31886108,-117279548,-754530621,15401216,269246948,1642463467,401277872,13829830,2114373120,15400960,-282828316,1642463467,-1275037024,-1021653632,1962954728,1961101832,1959067142,-1262225148,2049345538,-750878720,108331008,-2135636858,12786381,0,-4520448,650350335,-1577054560,-1341718394,-63589368,-1993465395,772344094,151717516,119442478,50915337,1048626171,-1006829434,-1302965680,-1159530993,-1039990647,-1070337909,-1996077943]},{"sector":9,"data":[76089412,1577337993,1354979418,8201864,263439498,-1984175114,-1948777728,-1064433081,-1957248168,-1977219465,2000373252,-1107069694,2005467136,72351494,1397801822,1465274961,-1909586402,-1945565410,-960459048,16809734,13909632,859337730,-1175417920,1048576004,1946222803,-981190383,-16354304,1962984844,4253726,-2076632597,259260630,12944441,-1929443724,57999557,1174415848,-957881786,32518,8130302,8136320,1595868959,1532582494,777520757,151596799,15409328,-816307994,-963948463,-527767343,-2080420632,1946158207,7137322,1048602482,1946222803,-423523828,-339375550,-347937280,-1047900148,-980762394,-430391066,-980121152,-2143098112,16831294,-2067322507,214,-527776117,78708996,-1894981422,-321863450,28626058,638108882,1048576213,1947140309,-971838718,54534,13436614,26929152,13895366,-1017554942,8426635,1215681035,1023337448,1007580161,1011512575,-385649404,-1779892091,-19994624,-907491190,-387413250,-796197180,-1963016216,-1175956752,-388986114,-259326284,8426633,1976109914,-2137748730,-1979323648,1793789511,8422599,314114048,-352276480,-855179678,-851542016,309592832,14058695,-288292864,13534406,-102313727,113657579,-956301107,16832006,-670644480,-956301056,16833030,-838416640,-973078528,53254,-400430087,-930415028,1172892978,-388986114,-259326400,971507947,239569150,268371435,-134216984,1381060803,-372191605,-754974280]},{"sector":10,"data":[207064032,74782521,13698569,-1017620134,1381061456,-469701638,-352252895,-2145262080,16831294,1048592757,1946222798,-704198901,-2147483392,-33499866,13581952,-955550719,16832518,-718897152,1048640768,1946222800,-637090037,-2147483392,-83831514,14419655,645922817,-2131296043,16811838,113657972,503382151,145760014,-1274443078,567147557,-737753569,12058880,-436147448,-339441088,-2143230464,16831294,1048583284,1946222718,-340348907,-347871744,207741952,-436147453,2114373217,15401216,-31186460,568721643,1532582651,-956644520,54534,13436614,15421440,17572324,568721643,-352317976,606200832,-436147202,-1017578719,1364414714,519903464,-1547685113,-979173162,8888832,-386078232,1165360352,-1070377385,-1090518087,-201588520,309675,-218053185,244139,-218050881,13476522,-1058627664,-1058619472,-1058611280,-1058603088,-2046819912,-53745440,-1477917562,1019281148,1592817155,2118025311,208929024,1642332395,15465508,216752614,498073835,11551462,1122369771,8339072,1394439169,860888658,-1327984960,382021128,632555785,1478610428,-737753569,1532624896,15450163,15417574,1532575974,-1006897064,16973828,65973,16973839,65953,16973841,66575,16973853,65650,36]},{"sector":11,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,65537,1,1852397341,1937207140,1836008224,1768846701,1769234787,544435823,1986622020,29285,1279476487,1263682130,1392902158,1431393349,100664133,1129140820,478543,1413829382,38620995,1396901632,1380078661,50335051,106452035,1162020608,1128682584,67111246,1414939971,1124532235,1196709445,808005,1128616454,72175427,1414727168,1297040193,1392902152,1329808462,100664653,1146373447,1000003,1279673094,172512085,1313408512,1297040201,1,0,0,1313818157,1397051988,858992928,741751084,975188535,1937330976,745366900,1919243296,1634625901,1395138668,589329509,10547,0,0,0,0,1835010,184353024,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775174201,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718623,655456,131072,-1879048192,524289,134217740]},{"sector":12,"data":[536872960,-536846081,0,718336,0,2035482624,1835365491,7680,812801,694364160,1886339872,1734963833,1109423208,1953723497,1835099506,1668172064,959520814,539898936,543976513,1751607666,1914729332,1919251301,778331510,0,520093696,1090525952,2560,0,26214400,201328895,536576,-33488888,16654111,0,3166,0,1919243264,1634625901,108,0,184353024,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775174201,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718623,655456,131072,-1879048192,524289,134217740,536872960,-536846081,0,718336,0,30208,469762048,806888556,806099000,0,203294208,2117090364,1010597388,0,410795008,2121809020,1013333118,1667261958,1014774883,1719549052,1717986150,1012939902,3670032,393312,408944670,7888908,0,0,0,1880624640,115,0,0,0,0,0,0,0,0,1711291392,2120629784,60,3964542,1866872,402653247,1080033340,242221280,1013332796,242236447,242247228,997746236,993791600,1879244902,241581070,242235488,476461884,242221056,477128252,1986817080,993791600,1879048294,241581070,469788256,1763189868,404232300]},{"sector":13,"data":[0,473105920,1613784678,1717962264,393216,1015178848,1617716838,409364064,1667261958,1717986915,1712875110,1717986150,207630342,1572920,393312,6291504,1597440,0,3145728,0,404232192,2122219227,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,32382,1724081688,-1016699368,6,6684867,1579020,2013266046,-1059061658,404226096,1711304294,404252220,404252262,1852571750,1852184600,406748672,402679320,404253792,912682598,404226048,806905446,-600282004,1852184600,402685542,409363992,469788256,1799234668,404232300,0,2083982336,1613760102,1717962288,786432,1719797296,1617323622,409364064,2002807814,1717986931,1712875110,1717986150,204484620,786540,393312,6291504,1597440,0,3145728,0,404232192,2122219214,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,1717985304,-2130681832,6,409337985,3160076,402653438,-1067450266,404232288,1712848896,2122212972,1010565120,6700032,1010580540,1717993020,1717960806,27772,905969664,0,0,7077888,0,228864,0,469762144,912293484,204478572,6198,204934144,1614153222,1719012400,2115509276,1721632280,1617322086,409362528,1801481222,1717986939,1712873574,1714709350,204484620,1006633158,1010711676,2021408304]},{"sector":14,"data":[2115528252,1048329340,1719549542,1717986150,404232318,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,1715232828,-1660930024,62,409338041,1711279128,402653438,-1067450266,1010571312,1010580540,1616928876,404258430,1667635260,1717986918,1717993062,1717986918,1010592870,2084322364,1010580734,2021145660,2081192056,1010580540,1715371580,1717986918,134243964,207627264,204472376,6172,204937216,2083920902,1715211388,3152924,1723206668,2087084156,410935392,1801484294,1717986927,1712863334,1712876390,202911768,100663296,1717986918,409364094,1796761100,1717986918,1714446446,1717988198,202911750,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,32382,1013342310,-1325372392,13158,2117861541,1711279152,402660606,-563622810,1717960759,1717986918,1616928879,404250720,1945507864,1717986918,1718517350,1717986918,101084262,101058054,1717986843,404252262,1715345432,1717986918,1717993062,1717986918,134243942,406594560,204472431,2113961599,205199360,107349516,1044125798,6291456,1723209734,1617322086,409366140,1801481318,1719428711,1712856188,1008233318,202911768,100663296,1717985382,409364016,1796762636,1717986918,1714446448,1715235686,102260748,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,32382,2120678496,-1325373952]},{"sector":15,"data":[2122212966,402653349,1711306876,402660478,-1016109466,1717960943,1717986918,2088525948,404250720,2070288408,1717986918,1719565926,1013343846,101082726,101058054,1717985307,404252262,1717966872,1717986918,1718517350,1717986918,26214,906395136,204472422,6172,205205504,107349528,208541798,2117074944,2125856780,1617322086,409364064,1801481318,1717593699,1712850540,405564262,202125360,1040187392,2120638566,409364016,1796765708,1717986918,1714437216,1712876390,202911768,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,268467838,409362528,-1325373928,445502,402653369,1711276032,62,52114236,1717966875,1717986918,1616928876,404257916,1868961816,1717986918,1719041638,409364070,1044276838,1044266558,2122211455,404258430,1717966872,1717986918,1719041638,1717986918,26214,1829118976,204472422,6198,205205504,108987952,208023654,1572864,1721630744,1617323622,409364064,1667262054,1717593699,1712875110,409351782,202125360,1711276032,1617322086,409364016,1796762636,1717986918,1714423392,1715235686,404232240,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,268467838,2117886054,-1325386216,445440,169,1711276032,6,104018688,2122199059,2122219134,1616930412,404250720,1734744088,1717986918,1717993062,409364070,1717986940,1717986918,1616928984]},{"sector":16,"data":[404250720,1717966872,1717986918,1717993062,1717986918,469788262,1299981312,404226150,1835008,204693532,1711695456,409350246,793628,1719670832,1617716838,409364064,1667262054,1717593699,1712875110,409351740,201732192,1711276032,1617323622,409353776,1796761100,1717986918,1714423392,1013331516,404232288,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,409387068,-1660937192,419328,2113929381,1711276032,1572870,205481472,1717985311,1717986918,1616930412,404250720,1668028440,1717986918,1717993062,409364070,1717986912,1717986918,1616930520,404250720,1717966872,1717986918,1717993062,1013343846,469777510,102245376,404226107,786432,203317276,1007041662,943468604,396316,1719670880,2121809020,1013333600,1669228092,1012939875,1008221286,409351704,201732222,1040187392,1044266108,2120615472,1669228044,1048329318,1042185312,208025112,404232318,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,415497752,-2130704872,13182,129,2063597568,1835014,520342654,1717985283,1717986918,2122202223,1010597502,1668824124,1010580540,1014791740,406600764,1044278368,1044266558,1044266223,2122202686,1715240574,1010580540,1048346172,205405758,3196,1572864,806092800,786432,0,0,0,3072,8126464]},{"sector":17,"data":[0,201326592,0,0,1006648320,0,0,1536,12,106954752,0,402653184,1880624640,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,24,-1023384040,0,195,1610612736,393222,0,26112,0,6144,0,0,0,12615168,0,0,0,6144,0,0,0,12615168,402653184,6240,0,0,1572864,0,0,0,6144,0,0,0,0,100663296,0,0,0,65280,0,31744,120,106954752,0,-268435456,0,0,0,0,0,0,0,0,0,939524096,0,2113960960,0,126,-1073741824,3932166,0,15360,0,30720,0,0,0,0,0,0,0,30720,0,0,0,0,-268435456,2035544160,1835365491,0,208077056,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775174201,1819033888,1734963744,544437352,1702061426,1684371058,46,0,1769503,655425,0,-1879048192,589569,137363468,16779264]}],[{"sector":1,"data":[-31514626,0,810496,0,30208,0,406591554,-16711936,1058028544,402800664,4079462,1579032,0,1813774336,942676004,3148828,0,1007435270,478031932,3947774,0,2081979452,2122217532,104621628,1667457126,2084338748,1717993020,2120640099,272392252,1610627072,503318016,202924032,30816,0,0,0,1936726030,241581080,477128252,1885748224,1718630508,520097340,1013999164,1717986928,2019965952,236719630,1010529806,60,24640,1834296320,1712855064,1717960704,409363968,1579008,404226072,1711302246,1711302144,26136,6246,1579110,267387135,2117861631,32256,1044119552,30,1879048192,1576462,15360,7895047,417824382,-16761730,1713372988,1620652824,2120629254,1010565222,24,0,405040156,403467369,24,1661337600,812017180,1711675488,100663398,-2107219968,1818650172,1717985376,1617298968,1717986147,409364070,1717790310,1613760102,805320716,100687872,1610625024,408944640,0,805306368,0,404226048,1712904984,1717966950,1711289880,1819023462,409337880,1717976064,1712875032,1712848896,404243558,-602400720,6686318,-524288000,-1845493760,404282282,26136,1711302246,402659430,1572888,1717966872,1711302144,1712875008,409337856,409337856,16711704,16715760,1610638950,201326592,3171174]},{"sector":2,"data":[3939843,454563840,1711282200,1812201472,-3997684,2117876967,-1015087360,1058825735,2114875518,6356582,270040702,402653192,1813774591,1818967588,1579020,0,1719428876,811610118,6710790,805309440,1717993990,1616930406,102262374,1937203308,1717986918,1717966950,208037475,1812738096,1610625024,805307904,24576,6240,0,12288,0,-837281768,26172,905969664,0,402653184,1811971686,0,1715208192,1147559960,24,100663296,6246,3694784,-1235924736,1712855064,1717960704,409363968,1579008,404226072,1711302246,1711302144,26136,6246,1579110,267387135,1717960959,12288,1667632128,809399856,202931814,404233008,26227,1007447044,2130680193,-1019445736,1711768039,2019963678,-26863586,404226104,1612191768,16717860,1618897948,806906934,1586700,1728839680,906364428,1980510304,404495462,-1643767682,1717593702,1717592160,1617692184,1717992299,408970854,878929510,808455270,402703884,1044151356,2084450364,409353336,2084338814,2118018622,1717790310,404258406,1612972056,1010580582,1010596924,2021145660,1614560376,1010593022,1717986876,1614571110,1008223334,2087074936,409353827,1623195648,603979832,404254122,26136,1711302246,402659430,1572888,1717966872,1711302144,1712875008,409337856,409337856,16711704,1006571504,822042726,1048471103,-619158682,6709351]},{"sector":3,"data":[408946200,1725628440,1812201472,-1717224424,-2359297,-1715240578,857433613,406748226,7143014,471341080,1013342264,524414,940335140,470560768,24,101477144,2088515100,476462092,201338908,2087106060,1618765408,102268512,1869308024,1717986918,1717966904,409344107,792624,1711669248,2120640102,202925670,1718294630,1852204646,1717973088,107374187,792624,1717985382,101058054,1717986918,1712855064,1864065126,1717986918,1717986918,2017222758,1712850494,1718838886,102,855664606,-615148852,1727535128,1726412800,-127473922,1579008,521666584,-411080858,-402692097,16738047,2039654,1638246,267387135,1617719295,1717835878,1669229360,1617943356,209584230,1579056,1850574,1009806340,-91,-2122383361,1014611395,2126721817,2120620158,404258406,1619000856,8273151,1008992264,805334808,8290060,1796735102,1711672332,1008231942,1610612798,-1239939584,1717593702,1718516832,1617716760,2087085931,404520038,409691750,405805116,12,1717593606,1717973094,409734168,1717986923,811626598,1013671526,6294630,1617297414,101082726,1717569030,404252262,2087085592,1717992475,1717986918,-60791194,102255486,1717986840,6710907,1875082878,1231447552,2014885546,419358232,101082630,536353022,-14680065,1617369343,1610612832,-16777216,411041536,15171352,16719864,1727991792,409362534,1798334054,-614046874,2120646267,404232216]},{"sector":4,"data":[32280,1816401948,-8307588,-33154,-1111260802,857217228,406748355,2120629760,471341080,2120638520,60,1714816638,470560768,24,403469104,1711695366,814616,209596416,1719580160,1616930400,1712875110,1667981420,1818648678,1717966854,806890603,789552,1715339264,813590112,202925670,1718294648,1617323622,1717973052,409344107,792624,2120638659,1044266558,2122219104,1712855064,1820287078,1717986918,1717986918,1578655840,1712864792,1047488102,106960956,-871359741,1834296371,1712855064,1711675494,402654726,402653208,404226072,6316134,24576,1711276032,1712855040,402653286,267452415,1617323520,1717973094,912681776,1618205542,1880621158,1579022,115,1006633188,1014939069,-2122425637,416061891,2017605400,100669470,410943030,1612191768,3964452,103022592,805332589,1586700,1932525568,2131111948,1714447878,402653196,-1644161024,1717986918,1717985376,1617323544,1617322851,409364070,1714841190,204484632,12,1717593702,1717973088,409734168,1717986923,805724262,1013671526,404238438,1724055576,1717985382,1616930406,404250720,1618902552,1717988568,1717986918,1617323622,1712868222,1717986840,805306471,856032864,-1842099184,404282282,-127506696,-18454810,1636352,1579008,2137399064,1743257447,16771071,520120063,-10066401,-59392,1711280112,812015718,1798334054,1852192358,6709310,402653184,14352408]},{"sector":5,"data":[7602176,-2120664064,404232252,-2115517636,2004385484,403599462,2115765862,276699196,-16744696,1835032,1716354084,1579008,469769216,1611424608,1712064102,471361072,805309468,1717993496,1616931942,1712875110,1667457126,1717985382,1013323878,1612211766,788016,1717960704,811624038,202925630,1718294630,1617323622,1013329926,1614571062,1579032,1617323715,1717986918,1616928870,1712855064,1826119782,1717986918,1717976166,1226358844,1712875032,6514278,106979328,1714962188,-1235924634,1712855064,1717966950,102,402653208,404226072,6684774,1711302246,1712848896,1712848896,402659430,267452415,1617325824,1717985382,912670256,811597926,2122219110,404232318,206,1006633020,404276163,-16771048,416072574,1618900728,107380230,404258310,60,1638144,405012508,402668294,201326616,1046486016,104627724,1009794168,101456952,-2145886208,2017229926,1715363966,2120629308,1614570339,406611516,1714821180,103841304,12,1044151358,1711681598,2120617086,2084333155,511467582,1714821182,404258316,1023344664,1044266558,1044135486,2122202686,2120640126,1010593775,205405756,-31966148,1047546648,1715354750,1618902627,52363264,617362232,404254122,409363992,6710886,1572864,1579008,6690840,1717960806,26112,26136,409363992,-59392,989859824,2120441980,404519740,3962684,6692352,402653184,6360,1835008]},{"sector":6,"data":[2122202112,2122186752,-12779776,1626872012,1006780569,6686208,1579008,0,0,6144,3148800,3072,0,0,0,12,31744,0,0,0,786432,0,0,3932220,0,0,201326598,0,417792,0,1572864,7346190,6144,0,24,0,0,0,6144,24,0,0,26112,3670016,-615149056,1712855064,1717966950,102,402653208,404226072,6684774,1711302246,1712848896,1712848896,402659430,267452415,6291456,1610612736,6144,0,0,14161920,0,12,0,-16777216,7929600,1572976,100669440,8257660,0,0,0,0,402653184,0,0,0,1572864,0,0,0,0,0,6,0,0,16711680,0,8126464,30720,1610612736,6,0,240,2013265920,0,7864320,0,0,0,-268435456,0,0,0,1006632960,0,1224736824,404272810,409363992,6710886,1572864,1579008,6690840,1717960806,26112,26136,409363992,-59392,4080,96,49152,0,0,402653184,112,262144,1700003840]},{"sector":7,"data":[1852403058,27745,0,0,1667845419,1869836146,1461744742,1868852841,1193309047,1752195442,544433001,1769366852,1226859875,1919251566,1701011814,1124728832,1229081935,1196574030,167784270,1380275537,1329742169,10179666,1129270282,1280202059,-1840561329,1480919296,1128354388,-397324204,1162283776,1431454292,1380927571,117478727,1415071060,559174991,1163070976,1447970132,1313821257,1414415693,1393623172,1414747205,1129596242,1414283848,1162104653,1125122055,1413563730,1413564485,1380075587,977818453,1095763456,1414283860,1107689501,1279415369,251667028,1397114447,1230459973,1464812622,256332367,1163070208,1431454292,1380927571,134255687,1095062083,1128547668,1158086709,1346980940,1590611,1413826322,1297369410,1229213761,1397638477,-1571926199,1414531584,1163021897,1313818951,1292239009,1229212757,251691094,1347700039,1180257359,1296845897,1413825615,1162284800,1095061076,1414743378,1330401091,134257234,1162626372,1128547668,1141440580,1413827653,1112492613,1124860148,1297698895,1178686533,-1757066167,1162286336,1480938580,1095254868,1413693778,1480938053,1497453140,1162283776,1413827924,1279870529,201358405,1397114447,1230394437,1313296979,1124860006,1413563730,1414087237,810565965,1162283520,1346456916,1162104653,1107951697,1095586889,1414087248,151006803,1163284041,1196577874,117451342,1280067910,676218706,1313411328,1397900628,1129595717,1380993356]},{"sector":8,"data":[374620997,1313409024,1414677843,15290704,1330463752,1431327829,100716628,1330925644,6508612,1414546438,1129335887,1163072000,1414087252,1146110285,1313164617,1313818963,1376911523,1448037701,1313818181,1397051988,1129469263,167807045,1229538375,1096042830,9982032,1397051916,1163022933,1330205763,251689550,1347700051,1180257359,1296845897,105202767,1163004672,1230394435,1279412563,218130501,1431391817,1447383625,1196577609,201360206,1465140551,1329876553,1196576599,1125122145,1413563730,1280266309,1313818457,1062094674,1296304128,1112820034,13194316,1413829397,1415071060,1380010051,1163150145,1415071058,541010,1313426693,15159632,1163019016,1229280321,218143043,1414743378,1447383631,1196577609,167805518,1297368403,1330466881,214340,1413826313,1095517522,5657410,1413826318,1464158550,1414680400,1598509647,1380321280,1380273473,2707015,1163019028,1111839809,1095586889,1145981264,1128616521,184562004,1414091351,1095320645,-230207668,1397162752,201361750,1162626387,1230394435,1313296979,1141309545,1481199693,13716549,1413826316,1145981271,1480939343,100687956,1163284301,1331028,1413829388,1145981271,1380931407,150997831,1330596934,1279870532,268441932,1163152969,1128616786,1397315156,1413694802,1191772258,1112495173,1413694794,1191837778,1262638149,1330401091,234900306,1398031687,1262702420,1162494543,5723203,1163019030,1128617025,1095781711]},{"sector":9,"data":[1279412564,1414087237,860897613,1380124928,1163149637,1028539728,1163069696,1279611476,89342529,1279462656,1296388943,1178686533,2118470729,1162284544,1480938580,1413827924,1396918610,1125122141,1413563730,1280267077,1380074569,1112036181,1163070976,1162434132,1380929623,1196576596,1125711885,1413563730,1280066885,1230262345,1313296963,1229213257,1413694802,1141440567,1431192909,1245859661,1392902351,1346722377,201386577,1465140563,1329876553,1415071063,1426587660,1129270350,-1857862581,1163070720,1313429332,1464158550,-1957406651,1162284288,1480938580,1415071060,1532251717,1163072512,1480938580,1398098516,1229343060,1230258499,675407,1129270278,-1874639797,1162283264,1313296980,-2041032894,1163069952,1129005652,1380928591,1393164289,1413829204,1279412291,151003988,1397114447,1380930629,218140487,1146373447,1128879685,1346454341,117461075,1280856132,-1975167935,1330644736,1330075980,83895374,1414877762,201381189,1162626372,1112491348,1413694794,1342701637,1414416705,726550354,1480920576,1146440771,1397315141,1413694802,1124335689,-94810033,1162284544,1162434132,1380929623,1415071060,1393033310,1162625347,-1940629435,1313147904,1094929749,1094863948,10373955,1397051913,1163022164,2573124,1129137163,1380928591,1330007625,1158021322,1346454355,167781957,1129596231,1112557900,5068879,1163019029,1380275265,1381253957,1313427015,1163020612,4281411,1163019016,1346720833]},{"sector":10,"data":[268494417,1279345491,1162434117,1380929623,1415071060,1392902162,1280196931,167806802,1414091351,1330664261,15813711,1179012873,1381254483,6639175,1413826327,1414418243,1230327369,1163151182,1480938584,1414415700,1141375096,1413827653,-346992571,1163070976,1162434132,1380929623,1415071060,1376321550,1398031173,1179014484,1191772302,1262638149,1162104653,1125253196,1413563730,1313818181,1145981268,1128616521,268450132,1347243843,1112101953,1229079884,1346456916,1191903389,1347638341,1246515023,16073295,1145980172,1330597971,1195462732,151058245,1230394448,1279412563,318793541,1095062083,1380074836,1229476693,1380533326,844383045,1379992320,251664195,1279481925,1128612949,1380993356,357843781,1162283776,1480938580,1128351316,201350213,1414808903,1129601093,1380928591,1393164378,1447384641,1196577609,117473614,1381254471,1429360719,1179585792,1413829446,1346980931,542000978,1296305920,1279346002,1329945161,1128614466,251712084,1178879041,1381256783,1431262021,2001027922,1145506816,1095130953,1095910994,9651533,1095058437,7948372,1279611660,1330922309,1128614466,50343252,440748368,1129516544,1464159297,1329876553,1415071063,1393426448,1414676820,1330597971,1195462732,134280773,1397705795,1112492613,1125253363,1413563730,1297040197,1230258512,1145392194,151008323,1112819027,1146047819,117441093,1162758476,1681998916,1331103488,1163084882,201362772,1414808915]},{"sector":11,"data":[1129601093,1380928591,1191706633,1230001221,1397507416,1280314368,1162697025,1229341012,8078668,1413829383,844123986,1376321540,1145984335,1413694802,1225785372,1380275278,1129070926,1413563730,1984119877,1380127232,1163149637,1414807888,1112429125,1213420882,1141375036,1094931277,-732804018,1163070720,1413694796,1346980931,743327570,1431373824,1247367749,16269903,1413826319,1096041805,1162627398,1398032706,1342701727,1280920655,625299017,1229981952,1280267352,-1538961847,1296304128,1112691795,13849676,1380865295,1229734213,1112491354,1413694794,1125580950,1413563730,1397310533,1146241347,1162625601,1297369410,10244161,1413829384,1163413840,285220684,1095062083,1279608148,1414547788,1196573513,100677198,1163280723,1983300,1162891015,1112492622,1326514416,1163085382,1162434132,1380929623,1196576596,1124990993,1413563730,1413827909,1279870529,302021957,1129596231,1163022933,1330664526,1230260563,5131855,1413829391,1096041805,1162627398,1398032706,1158152352,1279350097,1213089618,1162284288,1414087252,1112555853,1246975049,1162283008,1329808468,5195602,1163019018,1178948673,945049167,1162087936,1163150668,1096041805,1162627398,1125187711,1413563730,1313165381,1229213257,1413694802,1141637182,1431192909,1330005069,-833399730,1313147648,1112493397,1413694794,184567635,1381256516,1347636801,-599436465,1162284544,1447970132,1313821257,1414415693,1158217861,1179473230]},{"sector":12,"data":[1398033999,1376321606,1096041285,1162626894,1192296475,1414747205,1129596242,1414283848,1162104653,1275461720,1413828169,218108751,1112819027,1095586889,1414087248,218131027,1095062083,1163019604,1196577859,134234190,1146373459,1196576579,117,0,1167120524,518818645,-326903666,-1990765016,855704638,1346036672,-6663856,-486539009,-1547685072,983760952,23717888,561299467,1946167784,20899868,-1706027148,65535,-1898410920,3981248,855663801,-139725888,-2090967088,-443874579,-884122337,11208333,-6664162,-1560280833,109903888,512557248,244121800,1988952273,2669270,1394495518,1444303134,-26030,1444282368,25498,1221376,1326733,-1959856589,-486449268,-14790362,96931381,-13762560,1493260692,309641227,1195836809,529258635,-2147266688,1179049954,516150507,-6670849,184549631,-1946979136,-1289843216,-1190228736,1394497024,-6663906,184549631,1457222848,-26032,-1073020928,1347473524,16777114,-1959664896,113413872,-6662650,117440767,-1073019511,-661971340,1333796747,-964460541,855082770,-17984,-142102798,-8304825,-746717136,1462072415,16777114,-6662400,-1207959297,1344143512,67482,1958742784,3318539,529258635,-2147266688,1812031427,16871681,67110400,-369098752,65535,16777194,-5632,163053568,-6664192,-1560280833,-1073020876,163057268,2073710592,184549377,3580864,-326412861,1342204344,115610]},{"sector":13,"data":[60072704,74825739,803979307,-1728030024,-6664110,-1560280833,-1073019916,146336372,-1952821248,-1560281087,-1073020006,582539892,-1706025471,65535,-1962933832,298016229,1744831232,2097152257,453051146,67109120,-117374208,301990144,889258752,318767361,1006633728,-1811939072,-1291844842,754974977,-889126122,788529408,-2046754048,973078784,-486472960,1006633216,-301923584,1023410432,989922048,1056964865,1828717312,-1056964351,-1929313528,1174405376,1157628672,-419430143,-738196727,1996553985,1912603392,1912602881,-1660943608,-167771903,1702258965,1701137940,1167087646,518818645,-326903666,209617678,721712384,-1955599424,126553182,-1946794359,138933976,-15961024,-6681482,184549631,-1948224320,1200354910,911706932,-1980217719,1589967446,1200301816,-1983708377,1451881030,-62470156,468385792,653418180,1946173312,-230228197,-1006138842,1191118430,126363142,-1946401025,994576966,-595592122,637951684,-1962932282,-310117306,535137026,147475805,-1873273344,-326412987,-2082959842,-1070920980,-1979955575,1183447110,105286646,-375159,1183647862,-1202710794,-1706033150,261,737822347,1183446598,2109737734,-2082932990,-443874579,-900899553,1478361092,-1957345904,-661774612,722136195,-96040512,-1980217719,1183577670,-62486266,-1928825089,1343682118,1342177976,16777114,-62485760,-1980217813,-1073019322,-654900611,-1962742397,1297948645,503317706,1430622296,-1910575989,988578776]},{"sector":14,"data":[1752440891,1763734377,543236211,1835888483,745827941,1697540384,543236142,1701734764,1701998624,1701078371,2036473956,1931501856,1667853669,1852796015,540740109,1835888483,1937010277,1869116192,543452277,542396238,1953394531,544106849,1696624225,1818326385,1734964000,218762606,1769429770,2003788910,168648051,1699946555,1886593140,1701605231,1869881458,544173600,1881173876,1702258034,1814066286,1768186223,1864394606,1886593126,1701605231,1930038642,1819242352,2034070117,168653669,1651863364,1816356204,1399546729,1684366704,808465725,1967327757,1919906674,1852402754,1952535147,892681573,990514480,1869762592,1835102823,1852121203,544830068,1702126948,1852403058,1998615397,1751345512,1818846752,2019893349,1936614772,1936617321,1701994784,1936286752,2036427888,168649829,2036473915,1397703712,1702389024,1769239907,1444963702,544695657,1735357008,544039282,1835888483,224685665,1881160458,1830839913,1952999273,1936482592,1700929647,544104736,1702131813,1869181806,1869881454,1684300064,1919945229,1634887535,1664971629,1696623983,1646290296,168653921,1968054331,1867541612,1696625778,2037544046,1952801824,1768780389,544433518,543516788,1769108595,1965057902,543450483,1679847284,1953459813,1752440933,1847730277,577530997,1919905824,990514548,1919903264,1852793632,1952671086,1936617321,1702043692,1868767333,1869771886,1634738284,661415278,1699946611,1866670196,1667591790]},{"sector":15,"data":[1852795252,1868767347,1851878765,1309281636,1349282933,1031041647,1701736270,540740109,1684107084,1953391904,1931508082,1768121712,1936025958,1634236192,1885413492,1667853424,1869182049,1931506542,1819635560,1700929636,1634692128,543450468,1763734369,1936617315,1869351437,222127201,1377843978,1696624245,2037544046,1701868320,1768319331,1998615397,544498024,1819308129,1952539497,1936617321,1869116192,543452277,1914725730,539913845,1702057248,1836016416,1948279149,990514543,1635021600,1629516914,2003136032,1819239200,544107893,1948280431,1684368489,1886413088,1633905004,1852795252,1696607347,539911982,544175988,1970040675,779316845,1816207392,168652659,1869488187,1701013876,1634235424,1851859060,1886413088,1633905004,1852795252,2036428064,543515168,1818587760,1701077359,1696607332,539911982,1752461156,1949201257,1931506808,1953653108,990514547,1414483488,1145131077,1163412782,1913261358,222129781,1527385354,1702131813,1869181806,224228206,1818321674,1818321725,1633971813,2019896946,777920613,225206627,1685218058,1918985021,1818846820,2019896933,777920613,224686691,1836217354,1919251517,1634625901,2019896940,777920613,225276532,1954051082,1953459773,1684107365,1702389038,1949195808,168653944,1030319721,1702129518,778330480,543520869,1852386910,1829375337,1883074675,1953392993,1702389038,1831755296,168652915,1029926756,1953067639,2019896933,777920613,224620388]},{"sector":16,"data":[1527385354,1869377379,224228210,1527385354,1566992752,2004027917,1768190049,1060989811,2004027917,1769173089,809330042,1935739405,1852270963,1836016430,168636733,1920234593,1697538665,859661688,1644825906,1969972065,1868770928,875969901,1751321101,1802724459,1836016430,221525565,1836016394,1684955501,1836016430,221393725,1836016394,1868770928,875969901,1768163853,1868786547,1663987821,909995375,1678380340,1667986281,779710575,1030582115,168637494,1768711269,1868770926,875969901,1768294925,1697539182,909993336,1779043636,778987887,1030060133,168636466,1701080941,1836016430,168636733,1701998445,1836016430,221525565,1769107466,1663988846,826109295,1701972493,1702260579,1868770930,875969901,1701972493,1919906931,1868770917,875969901,1869810189,1697543282,909993336,1930038580,1953718901,1702389038,221262397,1852405514,1836016430,168636733,1885014541,1937011311,990514525,544175136,1886680431,1948284021,543236207,1701603686,1801547040,1851859045,1953391904,1763735922,1752440942,1931506537,1769235301,1864396399,1752440934,1868963941,168652146,1768300603,1634624876,1345217901,1713393234,1869376623,543450487,1696624225,1818326385,1734964000,990514542,1701344288,1818846752,1835101797,1769414757,1629514860,1634037872,1852383346,1701344288,1852785440,1819243124,1851871264,1126198373,1701736047,1869182051,1679848302,1869373801,1851859047,990514532,2037276960,1769107488]},{"sector":17,"data":[1919251566,2036428064,1701344288,1700929646,1852793632,1952671086,1948279909,1752440943,1713402729,543517801,543452769,543976545,1852404336,1735289204,1818851104,990514540,543515168,1701736292,544175136,1936287860,1818846752,1275727205,976311376,1275727165,976376912,1275727165,976442448,1124732221,976309583,808595773,745417776,221326392,1297040138,826096178,741355570,741878894,218762545,1868978954,1567847534,1866664461,1701409397,741875826,824979505,1395138610,589329509,1128081715,1112692047,1699219981,941651564,741355820,673198641,544499027,1026110243,1447839048,1409944898,1377858413,941649517,741355820,673198641,544499027,1026110243,1381190996,1124732226,1769108847,941650533,741355820,673198641,544499027,1026109987,1381322563,1208618305,544631909,808528952,540160300,1952797480,691151648,1279608893,168640854,544435540,544107858,808528952,540160300,1952797480,691151648,1397576765,168640850,1634561874,1395138670,589329509,1379739953,1312902479,1666386445,1953524082,1699948576,824385652,1129528617,1414547794,1867319821,1852990820,1699948576,824385652,1330461993,1314014532,2573]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[27679309,22,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":6,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":7,"data":[279886,1048808,191649315,131078,268436456,73996,131072,196610,4194366,12976208,14090449,1272,262146,0,0,0,592773204,592834928,12976822,40894481,-2147287036,1,46333952,-265289663,96,-2147221504,1,50593792,-265289723,104,-2147155968,1,50921472,-265289715,112,-2147090432,2,51773440,-265289704,32769,53346304,-265289716,32770,0,1330664199,1380273231,1330664199,1380273231,1329742085,1392989269,1280266064,21061,134217984,3072,1380272902,55330126,71910471,1380275029,-855507198,27787583,20958465,0,1667845409,1869836146,1461744742,1868852841,1344303991,1953393010,1394635365,1819242352,29285,1329742085,152661,1330664206,1380273231,1346653783,21188434,1953300480,1819506547,1668115310,1167087646,518818645,2122438798,1963004172,242679569,1342177720,16777114,112640,2122385899,1946226700,-2084555788,-443874579,-900899553,-1957363702,485262316,1183536727,16687884,687747,-1070393228,964688,271628368,1354771280,451995728,-397361101,99099262,81181,-1070397835,577824848,1342177720,1075661544,-1070397835,576776272,-401836289,748886840,-18432,1392508858,209125200,44442,19047168,19142281,-1157627976,1347616767,16660223,16777114,19309312,19404425,2897663,-1710983425]},{"sector":8,"data":[65535,2897663,937954960,741801756,-26112,-13434880,2097741699,-773878920,381127651,1962281728,142377745,-2096401408,158597180,-16483197,-347667596,-1813489957,1975520010,141885429,16777114,-465139456,-2082056567,1962869884,1347573257,1074617576,1962879349,21993992,1962868736,266725384,-187263,141885270,1343226552,-401547800,922684555,-1545076692,-5248250,-6682508,-352321281,339641253,443809792,384583309,1354773328,28856400,-6664192,184549631,-384666176,1183711072,860886764,1347440832,16777114,-293698816,856061202,1340625088,-330920671,-6664170,-1929379585,1343679558,16777114,-13702912,1167087646,518818645,-326903666,205949734,1962999869,28043523,-2014772362,998659,753468277,-385649151,37552983,-385649408,87884463,-385649408,104661582,-385649408,-1394015774,242679553,-15960321,1996425846,108461832,856208872,-1746298432,290973699,-1962700311,-472840610,1490819,-1543168,-6681994,184549631,1913747410,3947781,1996425843,-26102,-873791488,2768515,-14912512,1996426870,-26098,113704960,42,856585983,1285181632,-1962934269,-472840610,1482635,956974731,578095175,-788111733,379554787,41418496,-873984368,106859286,-1618222127,1204224022,-369099004,1996488565,243656714,13635327,-788111733,381649891,57999360,-1946198807,-472840610,1488895,-16091393,1743260790,108347407,-369098824,216596291]},{"sector":9,"data":[-62470389,-56557567,-62506752,1340670844,-60912894,1183572945,814168330,-1961528063,-472777634,19840899,-1962315000,-794559418,36497664,-335788289,242679757,383403661,-26032,1996423168,81848334,-1928431873,1343674950,16777114,-18618112,-1559607669,1183514922,138808070,-756481163,1354773502,1342181560,1343230136,-16222465,199755382,-21239528,-1207011585,-1706033151,65535,1183487,-1494678668,112894,-26032,113704960,655378,-92951,1996426870,-401698806,-2031546200,242679806,-16091393,244319862,185725160,-385649216,-1880490383,172395265,1946412861,242679575,-15960321,1996425846,108461832,16777114,32303360,16660223,503328440,242679632,19150591,19019519,16777114,-30152448,687747,2122518132,141885448,-1710328065,65535,16533191,-60912896,-1081875503,1946157078,-60912883,-1618222127,662765590,1191182331,-58817540,-2082571256,10814,-286719115,242679805,-1710328065,578,2754247,1996423168,1354773262,152474,-36706048,17464963,-957807755,242679805,-16353537,1659373686,-38278911,-15829249,1996425846,25815046,-1191335703,-397406208,-1595335869,1354773501,186333928,-1207536192,-1863778303,1423613,1354771280,84974160,1996423168,-26098,1994981376,1354773501,16777114,-43259648,-401967361,1996430918,108461832,503329976,79534672,1183383552,1958743034,142016276,-1207535873,1344143420,16777114]},{"sector":10,"data":[1975520000,-62470343,1586167808,-2082221572,5823,1586175860,-1948003844,-16771425,244318839,-1961619224,-472777634,1482635,-33404985,-62455809,150765187,2122566780,57934074,-1191380759,726663196,-1706012480,65535,-397361101,1183389863,145615100,-401705217,-689372474,1064444,820577141,1129983,518587253,1195519,1407779701,1719807,1374225269,-28448257,1963005245,-31069949,289217399,-385649407,306052842,-385649407,322829867,-385649407,686423510,33635838,1961427829,268516860,334037877,268582397,-2098658443,268647932,-1947663499,268713469,1827210101,-33691140,-1962742397,1297948645,1426066122,1996483723,112648,1354773328,-150930271,989921326,125764678,16400003,-1207602176,48955492,860930099,-6664000,-1962934017,113401317,-326413056,10939521,105286486,1023412781,58064909,50459369,-13724736,-1593325145,104399100,58458320,-1962811671,-788475874,814189539,71731457,1929381949,30009603,13645567,1342177976,-16015384,-1207894474,-1924136957,385833606,5290064,105880144,922681344,-1070399234,-1337553584,1354256406,-6664192,-16776961,161088630,-1996488703,1451863110,1518767534,-1957685505,235252806,-1706012160,65535,-1710983425,294,-1928825089,385833606,-1337553584,565727254,-6664192,1023410431,242483201,13645567,1358953912,-385145880,-164429505,-472785269,1490819,-1959758848,-1948003874,-1962928481,1194918982]},{"sector":11,"data":[-1960807160,-1948003874,-16771425,244318839,-1961725464,-1948003874,-956295521,-64441,1174471401,2080964227,-801701953,-149504,181594192,13635327,32241203,-803304634,-773969152,817857507,-260634623,-402360577,512428547,-567607088,-1618222127,-472841936,1488895,-1207666945,-397406206,-1662514450,142016262,-385829400,922681515,2122514640,91558918,-352321096,-83965,175564880,1048829931,1962934310,9038083,-1710721281,1910,702544,571472,126065232,1996423168,127572488,-1202716672,860880907,-1466281792,-956301305,9734,-2091455744,9790,1996443509,129014280,-1202716672,-1202716661,-1706033144,1981,-1710721281,65535,702544,1354773328,16777114,637978368,-352321280,-1895345636,-452467449,-452467449,-452467449,-452467449,973552135,-83368697,-443851259,442973,-2081649835,1448567532,-150929247,-28931624,-1929087233,1343682118,719258,74907392,1342177720,-1588543437,787939580,1178272000,-2096660484,64062,1689781620,855829248,-1070378816,97753680,1183645696,-1706027274,65535,57982987,-16620055,-375782282,-1996488694,95987782,-1868935168,1375731720,-26032,1183383552,-1468596310,-26032,1996423168,1354773416,-92864688,-1191414017,-256245727,-1706012160,2949,-1196919041,-1706033144,65535,-6664110,-16776961,28878966,-6664192,-16776961,-1207894474,-1924136955,1343673926,1342185656,577434,-29950208]},{"sector":12,"data":[440320,-1303999152,548950038,1637502976,-1962934262,-1952842682,-150929394,-1505326599,-1711520117,-770967049,1191117684,16556454,16385579,2108048955,16556298,16385579,-945404279,44102,-788464991,19924448,-371964279,1586168045,-1995994156,138269254,-385650176,-661978991,-1081351215,915079190,45154606,1996482259,10573480,-28966655,-1912703233,1344160837,-1704692225,2442,1080313227,19803895,1586229251,-1948003886,-2097146209,91488319,-338278771,-1303999229,1183437452,-1537832542,1453881087,1392408319,-1706012080,2453,162634320,1996423168,-1569259612,649882,787955712,-268238546,1453881087,-1912703233,1344169541,8828415,651418,-12195072,1469764214,-1996488698,1451863622,-1468596304,-1325322591,1356911363,16842913,1996488262,-1371108354,1375735301,-1371108528,1375735301,176069200,-1706033152,2692,-1697483009,1656,-2085861633,-1962748858,1178183238,-385647188,1048837896,1946157308,16556301,13633081,-1555561348,1996423376,186554884,-1202716672,-1957691369,-788475874,817857507,74844161,65781811,1342177720,736410,-25263360,-12878592,-1207894474,-1924136959,1343673926,1342185656,408218,-1468596480,-1325322591,1356911363,-1924087757,1343673926,383141517,-26032,-1706033152,65535,1996427243,-801701976,-92864768,-1092088176,74907392,-1700235521,2893,-1700104449,65535,-443850914,180829,-2081649835,2122386668,1946288394]},{"sector":13,"data":[9300227,-1727641973,16780939,100923895,1183383802,16556532,2113160761,13672820,1962165817,209125228,16777114,-163149568,-1928562945,1343682630,16777114,-159973632,13645567,-1862502657,4974606,-624897,1996485750,-401698564,1996423229,123771404,-1202716672,-1957691369,-472779682,19971971,855930376,-1207702592,-1706033151,65535,-1544272245,1996423376,-159973620,16777114,1575324416,503319234,1430622296,-1910575989,16425432,-16234967,-1070396810,138840912,16789239,108461904,16791295,-1174402632,1347551317,16777114,49120000,1562371467,445005,-2081649835,1448550124,-1962647925,1194006599,-96040682,58048523,-2097058583,1979647103,23324931,294787,-1897331852,-26112,104529920,1098121260,-2147197301,28836879,-526757888,-1207959541,-1706033151,862,2768515,-14912256,-16765898,-1207948234,-11533836,-16701386,-1711200714,65535,-1207948637,636026881,73304833,-971473013,34945,33968000,2897663,-2012888181,-1957683712,4457923,28856350,1352290304,1023410189,141885442,-956014965,-64441,-2130420085,-194969,-1962881815,2005599326,-2114780394,-2097116986,76350,1048774517,1946157094,-96040151,-1946270071,2139292766,1081474562,1141228427,-1873797632,191293454,1039943305,292945918,-369473909,2122514592,-780269318,-352319304,-58817585,-1962248705,1204225118,-335544572,73304942,-1979955573,166396487,-1962647925,1183384135]},{"sector":14,"data":[-59310084,1344194187,-1862371585,160557070,-1444657527,1265926144,-1202667469,-1202716661,-1957687275,1141179462,-397402624,37555806,-1960020736,1204225118,-134217980,76806,-16223224,244382838,-15975960,244382838,-1962154776,1204225118,872414722,-2146178112,-1954552474,1183515742,373752292,737822347,1600054342,-1034033781,-1957363710,741801964,13809664,45633566,-1202708991,-1706029008,1679,-1017256565,-2081649835,-1000996116,-1960441762,1979058999,-1933341899,1181122,-1014280110,1375734277,-1476216752,263625296,-259325952,-1207601856,988545023,106859350,-15697921,-1070395785,-26032,-1957298176,-2012936634,-11526656,-6683530,989855999,-747305914,638082756,1962950531,-1550166522,-1962934256,-1956772794,146955749,-326413056,1443556483,16139975,-28915968,-164429520,2097741443,-773944467,381649891,561250304,-472785269,1482635,4358019,-561310091,-1618222127,1207369750,1962934534,1860720135,-856996335,-2080481653,-1996292538,-28931273,-561295330,-2020875311,436535318,-1957683712,-1948003874,-1962928481,-523156921,96921680,-472785269,1482635,-784185461,-28966432,1183563755,19934718,-56362799,1958742784,104548366,125632762,1208024225,-1962870109,130547294,-1956773888,1438866917,-326898549,1187468818,-1962934018,1992558686,1149969924,172439810,-561311115,17299238,-385649408,-4717987,40299007,-1962385781,-422507913,637820612,-1993457525,1586231366,74877704]},{"sector":15,"data":[38046502,2131380025,-125926632,-15567872,563804278,-1996488687,1451880006,1975651312,1354773279,1342179512,1342189752,1347469355,-1962124824,2013202526,-401698814,-1561654714,653156036,637945739,1963476747,29092099,-1962385781,1468731975,239545108,-1995417829,1451883078,1926368252,1023768334,125173888,-2131605817,-1962480896,1183447622,-226589710,-1005751040,-1960382882,187041351,712312903,-1018113,1996484214,-227082488,1006500328,58061382,-1962870807,1204226142,-252,-207947658,-385875952,1586233191,209683208,-1958120192,-1715457037,-1995291511,1200165972,274172174,-1006352503,-2144932258,1946159999,-1933341919,1181122,-1014280110,1375734277,-1476216752,-26032,1589903360,126428910,1589910507,130492142,300613632,-1962385781,306482163,-1995156341,1468599879,140413712,-787724405,65065440,1452011078,9045488,-1980479863,2139354710,427098372,653549252,-1727903861,17325707,1460736583,71812884,-68616192,140413950,-1962129409,1589906503,1195058926,-1961135612,1988823134,1149970158,1418405382,306678024,-954968183,3143,1589907947,1200301812,1586206980,306678024,-1961601143,1204226142,-385875708,1586233010,373802760,1183514624,407341554,1191301675,274141454,653162180,637944971,956847243,91557975,1947092793,-295779315,105351974,138873638,1589931637,1065559790,638088192,-6670337,-1006632705,-1960382882,-1960442297,1589905495,1193879044,1461265930,1816588]},{"sector":16,"data":[43771984,2056933458,-1962934268,1452011078,1181168,-6664110,-1962934017,2005600350,172490506,1589962449,1086793220,-16777170,144373878,-16777199,781908086,-1962934270,183238214,-1694992641,2552,-1956711957,113401317,-326413056,1460464771,74907478,637850,-96040704,872175241,-1002837002,-561251714,-1960385583,1183395393,1958743038,748310566,-1996488685,1451882054,1181176,-677752750,-16777200,-1801781642,-16777199,-1499791754,1174405137,653942468,2097313593,650130366,638338953,-1207285879,-397410277,1347551709,1099674,-94452736,34570278,-1710983425,4928,653942468,67575,1996425844,284924420,317390848,-1207666945,1385758722,537049168,-26032,1599995904,-1034033781,-1957363710,49054700,956365985,125568582,1055637555,-1962520833,-472840610,19971971,-1947110648,-472840610,19957643,-2080487799,2113930366,-774337777,379554787,71731968,250283785,-771858805,379554787,71731968,-443873503,311901,-2081649835,-950661908,62534,17071745,-1959430896,2139293790,410784834,-1202667469,-1202716663,726667280,-397389632,-4716286,17361407,-1962385781,1207911031,-1947807422,1082721862,8972570,-2096603509,1962803839,41911062,-15698689,244318839,-1962509080,1204226142,-1946157566,436537414,-28931840,16139975,140413696,972441227,176046663,-1946263925,121177670,1586175349,1112538888,16154243,1204225397,-1962934264,1183055430,1183384318]},{"sector":17,"data":[-14750724,1183053382,-974454018,-2080612725,-1962738618,1183055478,76219134,1191118729,140413942,972441227,-528530873,-2096603509,1962936447,1115652943,-951487488,2631,804807,-1946973440,1200167492,105285896,-1986412493,1418269252,239569172,-1995417719,1200166983,71797014,-1710852353,5030,-1980217719,1381431894,-79697840,-1710852353,5061,17071745,-16354032,-352316410,336527108,112640,1575324510,1426065090,-326898549,861296398,-28931648,-1946401143,150897648,-561290371,-1081875503,1946157078,-1946209454,-1948003874,956307103,1132348031,-472785269,1482635,-523122805,1200347139,-163149542,248748624,1183383552,-195655182,653418180,638207883,17586059,1444019270,-159973378,1012634,-228670464,17299238,1174631680,-347628565,-62485590,1593726603,1575324511,-326412861,-1958477640,567084126,8438519,-164492684,-1205810560,567100417,-1034033781,-1957363710,-1957210388,2126775374,108446986,1583326451,-1034033781,1478361098,-1957345904,-661774612,1460726915,-801731754,105286400,1946159421,2506016,675088500,-385125376,189661476,-380600842,-1589247716,-264568580,300500341,1095681,-26032,-1073020928,189666941,-385647114,-561315588,-1081875503,1913127216,-219460062,16556358,243134523,-1958346261,-2082221602,134295743,909767799,58654972,956354537,1962987574,13035779,-1928825089,1343682118,1413018,-62485760,953241,-1946552575,-97109512]}],[{"sector":1,"data":[-1589739776,-956104454,897500731,-1710721281,2123,1358186121,13645567,-1862633729,-160176114,-1980467457,1442893878,-1862633729,-161224690,-16222465,-1600457610,-352321526,-97109726,184844032,-1996065281,-352257482,734432008,-89964345,-801732352,142016256,-865816,647628918,1342177290,1342183352,-472785269,956305569,1979789447,-339725564,112643,172333648,1996423168,112648,6600784,16396023,-66155623,-101234432,112720,374184528,1599995904,-1962742397,1297948645,503317706,1430622296,-1910575989,283935704,1996445271,-230257398,93999126,-1962934264,-1952843706,-150929394,-1578071047,-1991769860,1183579206,343304,-1073537673,-1476448621,-90106329,-62506752,117378430,1877672186,16400003,855995648,8710592,16387839,1048796651,1946157306,-97113618,-96566528,1266483200,16385735,1139474432,956365473,-747307962,1178322435,-1962377988,-89916346,19720960,-352257482,105286438,-1711509769,-150969159,1006144505,1946221118,-96564822,-1005786368,-703220203,219541525,-15332074,28838518,1689800704,-97585408,1317771520,1358559228,1342177720,16777114,112640,-310157474,535137026,113921373,-1873273344,-326412987,-2082959842,1187450604,-1962934030,133631070,594804737,-16615425,1996425846,108461832,16777114,-230258432,1946568251,-212959228,-230257792,-1962852119,2013203550,175570690,-16222465,-6683018,-1996488449,-1072958906,48825214,-1982269695]},{"sector":2,"data":[-1072958906,1586170740,-1983892724,1200162375,207522564,-1929218049,1343681606,16777114,19702528,19662583,259260431,-15966581,28836471,1587171328,-150994919,268512262,-2147191786,-142544050,76806,-1706396664,6028,-1980086647,1586232406,71797516,1946568459,-96040155,453265195,-771029417,92219260,1916442685,-212959200,207522688,1200209971,71796998,1586171883,-96040180,-1979951477,1468597319,738653958,1962999809,-13244157,720651914,636015076,1451884545,-1309267212,-2115316989,184549858,-196179262,123265,58048779,-1694560535,65535,-1980086647,1586232406,71797516,1946568459,-96040148,453265195,-771029417,-387382403,1023967230,57913288,-2130780439,-1954483378,-1070396322,-1996077175,-857144249,207522814,-1946532213,1200225366,106400004,-2080458007,-443874579,-900899553,1478361096,-1957345904,-661774612,1461906563,-16520362,1589904966,1065362950,116683808,1095763,3192912,-26032,-259325952,1962931773,-246482,-29534604,1024357631,611647487,1652422155,-352318529,1359619,1464909875,1343238328,-16222465,65537654,-1087313149,-387252202,-16222465,-1070397834,-26032,-259325952,696055307,1342193848,1342179512,1625242,-498693888,141934603,-1191919640,1793851391,-77469610,-941465973,-352321273,1556304,-1923701013,1343677510,16777114,142016256,-1928956161,1343677510,184603112,-1928039232,1343677510,16777114,1958742784,1425158]},{"sector":3,"data":[-1191217687,-1202716608,-1706033144,65535,199378569,-1952353088,509912,41388288,1200209971,71796998,1600045963,-1962742397,1297948645,503317706,1430622296,-1910575989,108954584,-2093845249,1962804862,108954412,-1960414208,133629534,175374337,-1711114241,3519,1586170859,41418502,16777114,108461824,16777114,49120000,1562371467,182861,1167087646,518818645,1586223246,17299206,-15043328,-1070398857,-26032,1586167808,41418502,1342179256,16777114,49120000,1562371467,182861,-2081649835,-950649620,51782,16008903,-163148544,1996443670,142016266,16777114,-193557760,-2131474689,1962997370,-193557516,16138950,-1946923265,1120334966,1136147190,-1924129280,1343682118,503333560,-867791536,683167766,-6664192,184549631,855995840,19982784,-1983101299,1452066374,-901331000,334168065,650534596,1965834112,130426375,-901316864,-993638657,-2144942498,-462094273,637820612,286148550,256362022,1333798419,1183645965,-968455732,-943171956,62534,-1006577943,-2144942498,913571903,200558219,1025078464,997457921,1946157629,212327,71137908,-385649408,384499850,-3639553,-1226258826,200313600,-1006144266,-1993997218,1589903735,-968425530,4161574,-2048326795,-990909696,-2144942498,108293695,1312784422,-1070463883,1589908971,1065363142,637957231,1968127872,-352210940,-1006456830,-2010774434,-1091894201,-3639553,1592313462,200313600,-995134218]},{"sector":4,"data":[-2010774434,-1494547641,650534596,1966161792,-339725820,-1006456830,-2010774434,-1897200313,637820612,542663,1204233728,637534218,411591,1333798400,-2144991220,-384824241,1191182188,-901346316,2113160761,-14685949,1575324510,1426065602,-326898549,-28915966,384499712,-150992200,1183448686,126494462,3157400,-113151,1589904454,1065362948,-1948158720,-443810234,311901,-2081649835,-11109652,-16712138,1183648886,-1202710824,-1706033112,7033,16660223,-1928694017,1343653958,1342197944,571802,71731968,1946568203,-2081060068,32209134,3964998,-963904907,1996443678,74907398,1677722,741801728,-2008642304,1183666198,-11528488,865732726,1577058316,-1034033781,-1957363702,753697772,-1207666945,-1924136953,1343673414,1342187704,1829274,74907392,-1202667469,1344143618,1342185656,1834650,74907392,1342181816,503370424,2668624,459577936,1996423168,16955396,244338718,-1207933208,1344143618,-1070378978,1375784122,1347440720,1342203064,1347469363,1342469887,-26032,1183383552,-1070378756,-26032,1183383552,-1070378754,-1202696112,-1202715673,-1706030848,7272,872314623,1183666368,-1202710828,-1202715673,-1706032896,65535,-1946401141,46292453,-1873273344,-326412987,-2082959842,-1202322196,-1202716608,-1706033126,7880,-1070337909,2130753616,-1706012007,65535,-15842167,1996425846,108461832,16777114,205818112,-1962522997,1149831254,341084434]},{"sector":5,"data":[-1995815285,1183517252,373590278,-954706807,397380,-1593686841,71616256,-963968860,-6664162,184549631,855930304,1443490752,2067610,112640,49120094,1562371467,445005,1167087646,518818645,-326903666,108461864,1364122,-666466048,-632910512,-6664170,-16776961,1996424822,352033496,1183514624,-532282406,-1962868573,782492742,-804862207,-956301312,64006,1423360,1354771280,-1710852353,7644,-2081394968,-443874579,-900899553,-1957363710,1357677548,503337912,4962384,1253593118,-1924129280,1343664198,1342197944,1692570,1958742784,-1337553622,1538805782,-1706025472,1190,393592843,-1202667469,-1202716654,726667264,-397389632,28900758,855829248,1575324608,-326412861,-1593643901,1183383568,75400190,-1205177344,726663197,-1706012480,7686,427610635,138216831,856847872,263737536,817385472,-1070903280,1340624976,1685757,1354771280,511285840,279117824,2143292160,-25263354,-402426880,1048772678,2113929232,112645,279000299,-28952320,2122516085,594804740,961593395,1946161158,178181,28836843,817385472,-1070903280,-68661168,-804861956,-1207959552,-443809793,180829,-2115204267,1442974444,-34044217,347603456,-2037559296,1343684088,1148314,-125399808,-158955011,-129579011,2122514432,58460408,-1962874903,-1979844986,-1634993594,-2030043658,1065418230,-1946979072,-2130839906,57999423,-1962900247,-472778658,1490819,-1205701376]},{"sector":6,"data":[-1202716608,-1706032888,6253,-772252021,377981411,1975520000,-295770104,-336050433,-128021591,-1215568943,1150091286,-1957683610,519960198,522689104,-2037710848,1344208374,2035610,-2038134528,-96040192,-2070261730,-1996488695,1149894214,-28377244,507790477,-96040112,-1650831330,-956301285,-130492,17188039,-1959662848,-472778658,1490819,-1960479744,-472778658,1482635,4358019,1586172020,-1948003848,-956295521,1607,1996424939,1566968,-34169205,-34175233,1962950528,-10163965,-1956712725,1438866917,1586228363,-1847036,-1711270217,6453,-788242805,377997283,-1962934272,46292453,-326413056,1450503299,-24906189,-1956152056,-2082221602,5823,-561286028,-1618222127,2139291670,1718878274,16660223,1342178488,378291853,5290064,535796304,922681344,-1070399234,-565801648,548950038,-711307264,-16777189,-1929368522,1343654982,383665805,71732048,-1706024692,7091,1946157373,-373279995,-164429637,2080964227,11266307,-472785269,1490819,1174893824,-381228309,-561250440,-1618222127,2139291670,763232258,-472785269,1482635,-1878886401,-118167538,-472785269,1482635,-1878886401,-124262386,-472785269,1482635,-33404985,-773944321,379554787,105379584,276037634,-472785269,1482635,-1710721025,4443,-472785269,1490819,-1953205248,-1948003874,-2097146209,1946174079,-773944442,379554787,440896256,-1946270071,-1846818,1342183095,1343226552]},{"sector":7,"data":[-960024,1290337910,-389944336,28896511,-443851264,180829,0,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,1845937963,-1996488704,1459642382,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-553981945,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,8567,-1017256565,-1192457387,-1957691328,1861682246,-1365618682,-1962934239,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,8637,-1017256565,736922453,1996443840,478976516,-443875328,-1957313699,74907628,1896858,1575324416,-326412861,-1710983425,8742,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,1671038582,-1996488687,-628294074,-1070870389,-1017256565,-1275051,463079030,-1962934270,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443875162,-1094991011,-990150400,1393062656,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1073779343,-1007912629,567095476,-1023380317,7210638,741772070,889239552,512303565,109838434,521011300,-1171980104,567091456,-1274115274,908256000,11929285,-617358708,-1306591434,-385649920,-986251703,-1946109434]},{"sector":8,"data":[244698,-1306591434,-1021372928,855643321,-1836583205,74711296,567099060,-1007492541,-387151019,1996423243,1042436,-1017256565,115600690,-657331503,1438907106,1122561163,-29235200,175432714,294528,1187382389,-987824636,-1207934442,567092480,-1274115297,-1157111040,520028162,1183514802,-850611196,12892961,12909441,-11335565,1128487703,-1144786197,-75431740,141754566,1528299347,-219462845,50354371,51107585,50358272,50604289,50358528,51666433,50358784,50571521,50359040,50430209,50359296,50424577,50359552,35477505,50394368,50435841,50360576,18941953,50331904,50438401,50360832,18964481,50332928,18976001,50333184,18979841,50333440,34120449,50332160,18992129,50334208,50385409,50363392,18998273,50335488,17938945,50335744,19005185,50336000,52430849,50331904,34117377,50333952,17908481,50336256,18909185,50336512,19011329,50336768,52506881,50332928,50629889,50333184,19022081,50338048,51118081,50334208,50599937,50334720,18950913,50339328,51843073,50335488,34112513,50339072,50584577,50337280,34163713,50340096,52187137,50370816,50818561,50371072,51725825,50371328,52181505,50371584,51717889,50371840,51686657,50340096,16815361,50344704,34105857,50343168,50528769,50341632,50533633,50341888,52178433,50342144]},{"sector":9,"data":[50380801,50342400,18712833,50346496,52206593,50375936,52210945,50376192,52419073,50376704,50878209,50377728,50627073,50345216,52224769,50346240,34102785,50348544,17661441,50350592,51102209,50347008,17912577,50351104,34252801,50349312,51734017,50347520,50868737,50348032,18423809,50352384,52237569,50348544,17672961,50352640,18373121,50352896,52243969,50349056,17668609,50353152,18254081,50353664,18717697,50353920,18806273,50354176,51909121,83937280,-14887168,50331904,17199105,50354432,51950849,83937536,-16741888,50332160,18809089,50354688,51943681,50383360,50871297,50350848,51830017,50383616,18943233,50354944,51818241,50384128,51981569,50384640,35463937,50355456,51997953,50386432,50578689,50353920,51836673,50386688,50338049,33576960,-14885888,33554688,-16741120,1828717056,1937208180,1835757164,0,5,0,0,0,0,0,0,0,0,0,1650524160,7632239,1769366884,7562595,1953656688,1879048307,1937011311,1929379840,1819242352,1996517989,1868852841,1845523319,111,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921]},{"sector":10,"data":[0,0,0,0,0,0,0,576716800,578822776,1953309388,1819506547,1668115310,257,4194304,524352,-1057030144,50331648,-1056964609,50331648,-1056964609,50331648,-1056964609,50331648,-1056964609,0,-1056964801,0,-1056964801,0,-1056964801,0,-1056964801,0,-1056964861,0,-1056964861,0,-1056964861,0,-1056964861,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,-1056964864,0,65280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12582912]},{"sector":11,"data":[0,12583680,0,12583680,0,12583680,0,66847488,-1,66863040,-1,66863040,-1,134102976,-1,32736,0,0,0,0,0,0,0,251658240,1023410175,251658240,1023410175,251658240,1023410175,251658240,1023410175,251658240,1073741628,251658432,1073741628,251658432,1073741628,251658432,1073741628,251658432,16777215,251658240,16777215,251658240,16777215,251658240,16777215,251658240,-4,251658492,-4,251658492,-4,251658492,-4,251658492,-1,251658492,-1,251658492,-1,251658492,-1,251658492,1020261180,251658492,1020261180,251658492,1020261180,251658492,1020261180,251658492,-1,251658492,-1,251658492,-1,251658492,-1,251658492,1020261180,251658492,1020261180,251658492,1020261180,251658492,1020261180,251658492,-1,251658492,-1,251658492,-1,251658492,-1,252,0,0,0,0,0,0,0,-12648448,-1,-12583681,-1,-12583681,-1,-12583681,-1,1060961535,-1,1060912335,-1,1060912335,-1,1060912335,-1,-12632881,-1,-12583681,-1,-12583681,-1,-12583681,-1,64767]},{"sector":12,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,1769099280,1953067631,168296569,2003782656,753664,1751607624,1866698752,1869771886,29548,1632632852,6648693,1375737088,1836413797,101,394330112,1919243264,1634625901,1828742516,1937208180,1835757164,-2143289344,285218310,1258328064,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,1869632386,1919249519,0,9437198,-65528,1342308353,1869632386,1919249519,2490368,4194338,-65528,1342308353,1919243906,1852795251,808333600,83886129,-2080362752,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989870336,234889216,16777472,-2142240000,27471,2004055149,1802398835,1802134381,1869632263,1919249519,544165398,1852404336,1936876916,1852793632,1952671086,825123941,1701998413,1634235424,1852776558,1919950949,1702129257,1868767346,1667591790,543450484,1948282740,1931502952,543518049,1953656688,1700009262,1852403058,543519841,1869574259,1869226092,572537442,1836213588,1952542313,1818304613,2019893356,1769239401,1881171822,1953393010,1651468832,1527332723,1937072464,979199077,1665227529,1702259060,1091058269]},{"sector":13,"data":[1953853282,657337902,1953724755,1696623973,1919906418,1634038304,1735289188,1869640480,1919249519,1835365408,1768300656,674129260,1852727619,1931506799,1819242352,1919905056,1752440933,840986209,1869226032,1881174882,1881174629,779383407,1631784960,1953459822,1769109280,1948280180,1326456943,1864397941,1634738278,544367984,388001391,1769366852,1847616867,1931506799,1667591269,543450484,455110255,1869574227,544367980,544432488,1852138850,1936615712,1819042164,791569509,544173908,2037277037,1919905824,1814066036,1702130537,1853169764,544367972,1919905883,542995316,1461743209,1227771465,1831749966,1953451551,1869505824,543713141,1802725732,1634759456,1948280163,1919950959,544501353,1953451546,1869505824,543713141,1869440365,1948285298,1919950959,510946921,776882519,541675081,1953394531,1936615777,1884496416,1701605231,1867398514,318778914,1953656656,1919705376,2036621669,1701867296,522205806,1868787273,1667592818,1868767348,1881173357,544502383,1953785203,543649385,237006447,1881173838,1953393010,1864397413,1225662574,1818326638,1881171049,980709999,32,0,1937009920,1852601207,1784900971]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[4217421,1,-65532,65535,0,0,64,0,0,0,0,0,0,0,0,64,279886,1966298,191455491,131078,268436056,81516,131072,262146,4194382,11272272,12583096,312,262144,0,0,0,1051066393,1051066624,68158519,69206273,-2147155964,3,75235328,-265289723,32769,75563008,-265289709,32770,76808192,-265289712,32771,-2147090432,3,77856768,-265289713,32769,78839808,-265289722,34817,79233024,-265289725,36864,0,1313429256,1094995023,80,524289,1114124,1162544640,1279610450,1229211395,1163089156,1162545234,1095713369,16925778,16963585,33951466,183040,100663546,26607617,116736,402,1667845424,1869836146,1461744742,1868852841,1327526775,1092641900,1768714352,1769234787,1394634351,1869639797,1293972594,1819632751,167772261,1279347012,1380992847,148303,1498698762,1346653783,21188434,1953300480,1819506547,1668115310,7959668,1458342741,1988885591,1962281738,2799910,1442986687,-6663849,-1912602369,-2144991162,32830,516164213,1586037312,138841094,-393185813,616445823,47104,-26032,983760896,272926978,1342178488,17050,37528320,1342180024,20890,37659392,856317068,2130753791,-1706010793]},{"sector":4,"data":[65535,856573065,205818304,-1157479239,146276384,508567040,-6663343,-1207959297,1149829120,407669782,-670939961,72125442,197831,-6662626,-1006632705,914949750,109838912,-1310195134,-365494489,-399048959,670033921,58048523,-402592023,-6681293,-1560280833,-1849753528,48640,-54869965,-1176816896,1443758180,1347573534,1364415315,1393972051,-26029,1151533056,12969984,1464926003,16777114,4629248,-1962887448,1252197446,-155176192,536934406,-1885273228,1930443776,974172162,-1274907680,717828880,1103923936,243917265,-108330632,-466425903,-523116335,1459714723,-2065114317,-150538752,108369152,-1157580824,861867936,2082376128,1962607361,1464881163,16777114,5629952,-1560064349,-1064435330,-372125813,856105144,-2136214529,-16594114,770179957,46972429,503380671,687978503,113189325,687978497,-645127731,31987396,-1342086469,457762944,4470527,16777114,-850611200,-1956749535,180510181,1975520000,-402083833,-521459026,1144425411,653034240,-26026,-125108224,1043791703,-26110,-594870272,-1705830825,65535,-6662314,-1962934017,1200305884,1876746,-1559786698,-998047718,-922827994,-855711606,-402435677,-768402877,-1206208536,178455030,34382594,4601483,855704249,-17472,1347440726,-6663853,-1342177025,1042675,183038640,-386879488,-1595408379,-1728991223,721428665,1358728161,1461080094,9149009,-1185415168,1347813632,1364219670]},{"sector":5,"data":[146330,549749504,4035,33685762,33619714,67073,83952641,335615233,369168897,16778497,117444612,318769152,167776512,-1912602624,-771375613,1896204293,67506438,-1290805242,1259314959,1980919314,755176453,-1458492143,-452538362,825358086,-1794976468,-1023299579,1167120524,518818645,1465309326,-1899459332,205949888,44409646,-1191020097,-1343094761,-1960026739,2126776910,242649862,1595408174,49120094,1562371467,707149,-1207959365,1048637536,1946157088,148301829,-823655445,-150538744,57971968,-1207812119,1048838129,1963000716,146270222,-385879368,-206042959,-1153569793,1048576000,1962934304,144893957,-1696070677,47880,-1946160200,184724238,1946331406,143321093,-2098723861,47880,-2130709832,158526,1978140277,32172296,-385323800,1049297380,1044054538,343147020,1954547190,205424911,1459565314,-1705552041,65535,1442977983,-6662370,-1560280833,-259325922,-1593549427,-1073020020,20777080,-402230016,-1192687159,-11119872,-1711129034,486,-1962439845,-1962928586,50338878,-550458,-150978397,-1547293721,1200292332,406227714,437160704,-1715076352,1050933751,736229120,32416710,-150583509,1220608984,-1174800487,237699097,-1053097922,-1047854466,184677027,-1957003584,103482439,-956104212,-550584,721440955,989872158,-1962770749,32547779,-1962918239,-1962917858,-754667056,-775386144,65065440,-774372415,-1946973213,-16650226,1442966582]},{"sector":6,"data":[1577068520,32245391,10536577,16784033,-16650746,1963061774,35176414,4470527,-6662370,-385875713,109969624,-1960443058,285114388,-25148558,1363047312,1049231155,109969908,-1960443058,285114388,-25162894,-150572144,-197228073,506920705,-1705552128,65535,922736631,1465319454,16777114,1309052416,344663555,-59448487,-1962863937,-2001918247,-432388347,796194785,1090589375,-293349077,1876226,100918263,1364197868,1980159,32257791,32388863,-1705814242,65535,-335114407,729869057,506920955,-331940096,-298385663,1398218241,336026,-197227776,1962871553,506891030,1465341440,318874,1456994048,-795191465,-1023410172,184917992,-1962183488,114424,-402340376,-1070397894,-41892967,-2145749505,544535289,1961949568,-235306789,32047989,-201752571,250151797,1364219403,-6662394,-1023409921,-946929869,113661702,-402587030,854066686,1778828806,-588774910,1191665418,-1040841237,-402426879,-1427438016,-1710552856,65535,1443274987,16777114,116786944,1971323494,-396950000,123669229,40503038,2013308648,96004306,-1962545944,1442858038,16777114,-9508608,-402648389,-1988558706,1948318080,1799258244,259260418,1962952936,1795606083,-1024983038,-2143687926,33712702,854069877,-2144504576,57937401,-385927959,552274581,40240886,-401967744,91553822,-351969816,540967146,141885440,34606729,34750089,-2130767895,141823481,1946417536,469336067]},{"sector":7,"data":[-18237,34750080,-1593609216,-1031011824,1027026664,175439871,185490664,-402426625,-571928009,1096702,1392922960,16777114,198740736,1482229723,540967107,57999360,-14319895,-1711258570,437,55457535,16777114,1354773248,16777114,-22877952,2113152,-972327680,16786182,-402435679,-1914104453,587646718,-6684672,-385875713,-92012928,-1959430655,-1341999330,-1732040112,678875195,-1957507029,2156752,-1205433766,-20958718,1357546436,1380977778,-402632518,1482293261,-1031541269,-1023118000,-1962756191,989989942,1946290742,238979898,-2147092990,1698312565,-1960020735,67056157,-1958018467,65876680,-650425910,-645201293,41289018,731383178,92816344,-1023255159,-1962875672,-1962800074,31779070,34223675,-756545163,204901120,-1980962046,39160069,34487945,34354825,13297859,4472459,16320246,-1911065328,855854598,131119579,-1977212748,46367495,-152969158,-320338571,-1104679938,1153827091,1304111359,1444828928,-26029,-268238848,2688199,1459688126,-6662626,-402652929,434700031,1358686989,-1974316717,-1966765360,217549542,204901248,171870978,1962359554,1963276614,58013754,1300903285,49905666,-788386445,1981414016,-2011581950,361431637,-2021662080,19982583,510981947,-1073085301,-432344200,-499454089,1291774834,-387519743,1499135782,-389851045,1499135781,1354979419,-397258413,1340604432,1532582403,1464910680,1593840872,178373464,201734914]},{"sector":8,"data":[-394824702,-76215114,-1308413464,571901441,1976699392,335988452,915144448,909836810,1366557196,1284183179,12642306,34223753,59522691,-152865791,376799426,2080439936,339098329,973501952,1979716918,3467469,-1031026453,-1054161270,-1979706205,872254145,-2132112695,1337098213,2236150,-167734552,-352312802,570869413,1048576000,1946157904,328067434,-628403886,-1315387510,-1948200188,-773795384,851510240,-774372353,915100643,-1705639868,65535,31103574,513998848,1475906304,37631743,252058,1515806208,-167765343,403057638,32416512,-167764831,369503202,32285440,-307224,-16759754,-1711268298,503,-1022155032,-2130393469,1912736510,32947715,-162311997,-352314842,-162312184,-150988250,-388461608,1381040292,855665384,1144425417,32292608,508776790,-1705566633,65535,-26026,-521666560,1532582418,1397801816,1448563281,-385964824,915079280,-940178886,-1962642320,-402506698,922681387,446300228,-1962934263,32291064,1448091223,16777114,1144454912,1419400960,-402653175,1600000667,1482381658,1745347,103540214,-291307496,1745153,-420034818,1574443,-1593707869,-503971812,1443371,-1593709405,-1023541220,103539446,-257753066,1397801729,922702417,345636932,1509949449,-1017619623,4470527,16777114,-26112,1465253888,16777114,-26112,-389873664,225706000,168688257,-1991376524,184686134,346145782,1958742786,15226660,-1950183935]},{"sector":9,"data":[637670966,-907521875,-771073536,-768405899,34870919,113351250,-768409600,-13384865,34881081,-1705613195,2617,35012233,-6662329,-1962934017,1962871800,-6662324,-1157627649,-259325886,-1706012077,361,-1554630685,-1706032620,65535,-929409198,117440522,-1910614183,872362970,866448374,106366719,-26025,-1709244416,65535,34879231,715930,172661248,-1070399488,-1070349415,40255107,-398232321,-164494741,-1014279597,-150994427,1088962786,1310625280,-1896379645,1526238146,1456180059,-52254035,-1425404488,-1597603490,-311080448,-391462861,1049296909,-1705573784,2805,381929355,117388063,-1705572777,65535,1119590851,1347572512,703642,1958742784,40411916,181377616,201064448,-396901422,-1746402965,-1014801663,136243206,1191309032,44508810,44578442,643287947,-1004403318,1202374154,-2124417566,-33513273,-1008110134,40255104,1345287423,1448235347,113641047,-973077848,2130880262,40240886,-1089964672,92996219,-956323864,-16620026,117446376,1499094623,-960276389,16935430,201407208,40280960,81782979,-1140854600,922681345,1397751878,16777114,1048625920,1946157674,1711732452,628391938,113661702,-964689240,-16603386,604137121,40280959,-402490433,12320588,-1001472,1610597352,15329287,41616955,-967808652,174086,44500678,-13047681,-1090356319,-1863843191,2076137472,9037826,-1191018053,-1749417329,508698114,-1705959853]},{"sector":10,"data":[65535,1459659240,43464447,43595519,43726591,43857663,16777114,42973440,-1705959849,65535,44566214,-1492728192,-2118385918,-19011582,-402490463,-1073020748,100863100,103481372,41878191,-770981837,369298044,371916826,226362029,404095824,-1308980480,91482116,1958742872,369492747,-1309111552,92727556,119471299,1713277867,1993882114,987268610,-2046658820,-1957647364,1575529411,-1416451328,5695576,1836547,100897451,-1012203494,4470411,164076118,-125108224,63409091,-1728047610,1842827,-930350089,100909196,-1952907240,-150988258,-1947694341,2097167553,-2147438590,41746684,1337524404,2126592536,985762306,-1979547931,-796146715,1847030,1443371,-154891630,721426990,-1845487610,2132708291,568873730,-1896117495,1493388806,41754251,-939599573,-678771714,-1950089422,1144455163,-1705566720,65535,-16757272,72220421,-1207941656,1347813377,16777114,1947110144,1876226,512485585,-338624486,-1169953839,401080942,1980664576,1876226,1569450193,39660294,1711659,41466443,508776534,1033523538,-1023410171,-11067818,-1711129546,65535,5160899,-6662378,369099007,490072071,1856177547,38112002,-1157467997,-2143027201,-92983751,1912863619,244483,40798151,-2017067008,-1996488080,-1711115234,65535,-779304306,68586278,1959869184,-2116383180,1124077630,-1591052976,993395310,1963093510,40935712,1879456566,-1592363774,993395318]},{"sector":11,"data":[1963095558,212236,-13234061,-352160250,378218170,-771031040,521582197,245699,503334376,922703697,1347551300,16777114,-1192195328,1347813377,16777114,-1701161472,-352321527,180222,29295595,1632256,1360941138,1144454999,-1706012160,65535,-6621045,-1023409921,40124041,235858619,-6676909,855638271,-661863479,-1957345904,-661774612,1988843350,205949710,1963003965,9550147,40124032,1443525889,-543534818,-352321529,1681817722,343212546,1442843320,-1705959856,65535,-26026,1609236480,1443012543,-6662370,503316735,-26025,1273692160,-1962864323,12061278,172127488,-2143390209,175374843,1946352512,133922821,-1014288523,40124032,-1206029055,-843382774,-12073470,8304928,1394495574,-26031,283639808,112665,-6664106,-1342177025,1583323393,-1962742397,1297948645,-2097149238,17009726,-108844172,858158354,114633,-2097111319,17009726,314251124,-153556992,-108851335,-2096466912,91491833,1963587971,516238863,1065366607,1964971520,-172627709,40582784,-385649664,1048576584,1963065962,-157161399,-880019061,2030200481,41656579,-8142594,-31493081,-32934712,637502408,-1057090444,-8141570,-32803800,-27102004,654279628,971529077,-1896313859,2045577922,-70064122,-385755671,-108792470,-1156680342,1407713298,-402228746,-1075248416,-1967092735,302434024,313524226,-1979700760,-401493772,-321912798,280032266,-805299736,183292140]},{"sector":12,"data":[16759028,4470527,1465012560,16777114,25749760,-1739435693,110991952,-461373440,1532582528,-2046709565,167930886,-1336052288,-1341330446,1795589633,1975519746,-1728860081,-1191112002,1344143392,-1705945570,610,1975519916,-12269829,-385971424,314507311,-1339954431,1778812416,1963080706,-2046775265,167930886,-1089112896,283640082,2105558784,-109764353,-1705566634,3855,1144425411,23247616,509009707,-828746921,-1023410169,326425355,309642043,-135792816,-137219085,-1948125199,868440264,-812923959,112835,1963260291,-1945729264,59679491,-1560146783,-941030902,66683648,-1902049163,59548419,243919595,-935656564,116843124,1972699383,-1194947359,243990608,-503906276,721596323,1220608967,-134613095,2109737961,700461826,-1962758394,-1560106210,1049297579,2145910806,370051583,1958951680,1829160466,12255234,23586816,40713856,-27167488,-1207800570,243990553,-503906278,721595811,1220608966,-134613095,2109737961,700461826,-1962758906,-1560106722,1049297577,870842392,403606015,-397193216,1482358798,544523067,-402652741,418054425,721594785,-1728047098,1718007,721426874,-1323922992,175499266,-1013333965,38,65576,16777253,16842791,196642,131105,16973859,16908324,118358016,-1391325506,-1053053658,-1073019532,650376565,180915117,-1960610332,-1962928098,-1962927562,-1593661162,1508377261,-391285760,413398528,113408,-91762125,512434155]},{"sector":13,"data":[915079190,378208284,-1348402517,3598338,-571962764,1483765,855638203,113106,4470411,1347638866,-26031,861536256,1381455561,1364283729,627866,-1348839936,-385875954,-1014038722,1962998144,-337761532,33128490,-570227339,-2138037781,74777337,401332267,1963194752,-338164988,-773944562,-2132868117,57935097,-1933328333,1962617799,2145061657,-339725564,2128231181,-1948611838,-151545405,-947067145,-1950091221,1375749142,861032787,1364415177,1975520080,-1705950975,65535,1219226,1776861952,134592512,1962420968,-1896314015,1310625474,871772931,168671442,-12800597,-1073085324,548405877,-2134704470,-311275270,-8552410,1325626656,-956369173,-25112014,-1193905639,-276624883,87631362,-947652492,-1070355710,-386430038,-1108805683,1472214007,-1706011056,65535,-402652738,2145973918,44022777,1394497107,893082,509041408,211065427,1465253888,647066,360170240,397678056,397744052,406132746,429463651,469637598,474422332,485498062,486612216,501751042,513089165,484777684,518332126,874323760,171868214,57933828,1170983219,518818645,-164407721,-1959862642,-2026617034,1442905142,1228311342,-29980876,521557504,46610175,-997568260,-1952915247,-1942060048,125108483,594816572,1478200040,46597831,113704960,713,1954596086,-953251575,2811906,-13761166,-1961642860,-402470642,-310173229,921013004,46597775,-561056205,16647823,16516751]},{"sector":14,"data":[1562337118,1397803853,1460032081,127723606,-92268172,-2146536429,259326970,-402414360,-336002106,60549127,-133981976,1510432606,-1017619623,1946160360,1501193,58138249,-1950098677,990082846,1946383646,186092292,-1014774821,1979416834,-1157402109,784532309,757401334,777352194,757401334,-397576956,-361487194,-1962933825,-1962707682,-2955021,58138171,76090228,58007177,199783759,-164707338,36513030,-164753548,70067462,1944586101,-335842268,4253899,1364219422,-26030,-1073020928,535501940,-1291833880,1347821057,-1705815471,65535,460636171,302152835,12060021,505531724,-26026,1444806656,16777114,-1007285504,-768358093,1328989230,1015031348,-1190759424,129630463,58310145,-389824461,-397409605,-1017642900,1108801601,-482142480,384517142,1243002952,1783306037,381183511,1847004013,-42788941,386168086,117440512,67698433,-16449032,1895303040,503351304,-132185864,49815556,570882081,-131923464,66593797,671610917,-1893138289,546253376,744525611,-1892872049,814689872,-9400529,-164707702,70067462,-796260491,567084724,45465283,456926463,80155252,154932734,-873921675,-1020884480,38922498,370738375,1968913603,755288037,46120470,45954697,1223,-1122071613,1966816258,-75414766,57803459,-1996307781,-972899042,1019412487,1007645232,738948921,-1274575312,15005194,1027392263,1060961140,2109732724,63406869,4030510,942599028]},{"sector":15,"data":[-1141738235,394920639,-896797134,24496395,-33241279,1711222293,1948727297,-502857724,-1222734856,714754,55320201,55576262,-947207423,-754667112,-775386144,65065440,67056321,-1008479784,1998190976,24087066,41217290,1336987134,41347130,-846796662,-779366914,-1023016983,243976499,-914357577,-1193675016,-1212461311,-1197544702,-152370945,-1156054600,-1846869320,-352256072,45588982,-1023231581,45684363,-1962554391,721599758,126501323,362987075,771999363,1962884224,70790673,-1959857547,102760772,638059203,-555613501,1976237763,-1223259375,-28331518,858488526,5236937,-889314069,-919401867,855654888,92203474,45551243,-973158094,1931083136,2943007,-889316629,378210933,-292945225,350996786,141937406,45551243,82561330,45551243,1337128330,855641832,91154880,-401059910,2129199107,-1019311611,-32766,109972597,-1977220274,-2146500290,-1010597913,1392151491,46478987,527824395,119428870,-2046787399,-1174189266,233308875,-1106813182,-1073085749,-922876556,-2147267678,108337724,436586022,-1431564309,58002748,1007289542,1978916874,-401952761,-164428857,46478985,734497626,367576002,67954688,-303561867,-231216900,-2014837387,-1946979076,-164707390,70067462,904460148,45588976,871659753,-1070378816,46401158,192266250,184535016,-2012973632,1526907942,309985034,175423499,175440700,-402433560,117310010,-1262288183,45596415,1735855420,1048780402]},{"sector":16,"data":[1946157767,-67180532,780863347,-756481337,-1962636293,-1979666216,8776184,611650108,-989985653,1914305664,8710403,-150974277,7203035,45164090,117311346,-1427569999,-273225472,225773628,-1073085301,-922872716,-352320837,1963408462,3192842,-26032,-960299008,177158,-990719512,-2147267522,108331004,-1417681792,1202324203,55328393,-402652742,-1214124548,1019280898,-1340575152,-2134573568,259135996,-1207953944,1354438656,702796032,-1560064994,113640119,-1023343792,11862448,109975734,-1977220274,-401669826,-2135363911,10534407,1877540659,-1899459598,503533086,-2132309497,-561283100,-150737967,-880040461,-1410129744,-2084364522,17009726,99104372,-1579469841,100728858,-654901224,4470411,1397773142,-1705815213,4777,313498198,29032448,112640,922702678,-1706033128,4901,-1961434173,479062258,440183846,1443236724,-62003119,-502833575,-1010725908,1396395328,1027423804,1381124927,438714689,464001834,448994216,447224728,459545391,458890037,456792890,-397075537,48766027,-1950130944,-940405766,181510,851544832,1958742765,-1965345864,1992506076,947922438,855798797,1255181275,-1576880224,-1084882245,113640139,-1224736068,-402606592,171704761,-1293417611,1946565633,1946172665,1954495545,1946696748,1947024424,1946827849,1947941985,1945254499,1191544858,1676199678,-1136754687,-831193086,-898368710,-339214778,-1335825467,22931463,106413291,-1946063640]},{"sector":17,"data":[-1178497335,-1262551026,-777063911,132746209,-1493225889,92805570,1593916136,-876689666,1372490242,-1017600781,686296496,-385175551,-202899165,-8459777,417881264,-404201983,1364414719,243976499,652739259,1482381820,184502761,-401574666,92930126,124985404,343148860,-2147466008,179262,-16119947,-805436556,-12654258,-829796521,-1286397776,974054151,-2146994683,158599485,-498086914,-1155650830,48114178,132219083,1952406524,518342,-1075053598,-1336946946,10872840,-1595400016,-385306624,11534491,-1962993943,-338744629,3598343,28377835,45876934,1962031616,1962621458,-2001983986,1676166917,-20447744,-370810170,-80019764,-939591308,-20780730,50333672,-369556751,1793654456,1962949632,6547462,-1970267413,1959733963,276056339,1207864151,1969204978,47314439,-1009833269,-24188579,686309552,-396927232,-1973485844,-16324130,45881078,-1325500439,-23992038,225708348,158539836,-396447664,72876035,1364414528,106387026,46608011,133830632,1499094623,1405311067,1465274961,-953251066,-393759742,1048640587,1946157769,-58267389,119158504,1499094623,468239195,1968328704,-1270972404,91488258,-352266520,-66131965,45352646,-1017619967,46405258,326488586,1978547176,-125310962,-1628960395,-1326352904,-1341986048,-1010824449,1962925544,-70129659,-1950091541,55813057,-1979681560,-389707064,-527826835,1369686410,953889539,1946166046,1393462109,1926052355,-20698539]}],[{"sector":1,"data":[922720448,-11337660,1342184502,16777114,1394510592,1927232003,1745209,2303544,653668468,103482040,-617414632,55713418,480368643,-1222183424,369502978,-1705816064,65535,4470527,16777114,1342621184,616759299,438760975,-166808832,-25115661,-2147257831,-628418066,45553287,989443816,1946335286,116797149,1946430757,-344266486,-1962716255,-1023232234,1397838342,47310928,-410991677,1976109695,1341816888,1337078642,1981349504,169391618,-401508928,1642654856,1309052416,-1960791293,-1012141117,-1276461848,1357117008,1577077736,-422457813,-102121077,1975519995,-1873286397,1381061456,-352065451,1459691240,-315431434,-523124477,-796133237,-167751496,65065443,1489931216,-1158509741,-756547504,-320316160,1516108800,-380085415,-25105425,-1241353703,5290008,-523115018,1354299531,717684224,-1947797771,-397032504,417917956,1309052416,-1960791293,2145681603,-880027253,-100422669,1576498509,5290179,-162402165,65876709,-1948200511,-1031120392,-1057046230,-772789352,718703334,851640021,-1947563018,-1010267178,176154496,-2146077239,275927290,-25145166,-1241352680,1975519768,-15210233,-1770733558,1381061456,-364648363,1459642088,-164436234,-523124221,-796133237,-167751496,736154083,-829686280,-225750184,-150974278,1042650,-385971363,1576796199,1482381658,518726377,55451275,-1014047858,-645143855,1465305995,1583326707,-100404733,535917901,1472957379,56601587,-176861702]},{"sector":2,"data":[-1276890429,-1974430944,-1732171070,-1963947200,-1731908922,736660288,1599123691,1279182019,93005315,-805731901,1008169479,-2095876832,177982,-1070396299,1337641267,-369391080,183041641,-2132571648,-1410105372,-991415319,-1962718146,65720791,-789937711,721581575,-1009677366,-1426069272,-369302969,110028820,-1070398642,-1221132349,-18644990,-388906101,-218738510,-2013087582,-1962756314,-1896117295,1124290054,2133295142,-2114395581,1913114874,1979648786,1144454926,1465341696,239770,-402068736,113698764,-1895759024,-1023232250,-208976413,-225778038,-804265344,-789655314,-1126162,1342355254,1493011432,91602954,-352307480,1976106512,3008517,-922827942,333974901,-1224306944,1342621186,-20774653,-402426424,-1017511934,639021800,1364592301,1509483240,-253622434,379709635,1443277862,-790081455,1582913784,-1007754745,1329877837,1229979731,1162674246,1498566477,1297040128,1230258512,4541506,1296912195,776228417,5066563,1397575491,1027818832,1347241300,-326412995,12643457,-1594075306,1183318263,16359678,-1577236856,1183383570,13605626,1183383552,-1547684872,-1633483882,60990211,-15960321,127535734,-1962934258,-1275049954,-1960719024,1183319110,1954588927,12773635,591298606,1014300717,369522373,23248647,-1197103707,-1934950334,-1070355504,2126818219,97118218,775780980,-2127727261,1970106362,176079911,638250728,1230454145,-2128190859,776864381,-1665639819,-1706029537,65535]},{"sector":3,"data":[-1070346101,753653902,1970286141,1778024710,373126246,1891011871,1073789183,-15960321,1444809334,-26032,-1958739968,494142020,-8874355,503407288,-1706027438,65535,1912619069,84470019,1946159933,84142339,1996431126,175570700,185067752,-1964608320,101252678,-876936969,-12615678,130483317,-106951424,457041920,-639040653,176079873,-1006298392,775752318,-2128120464,1969646074,-1155590623,2139095118,225720833,-2147120346,91568892,-1996469061,207522823,-1005953399,-387446146,-385649660,548929665,-148471808,-207360256,15835904,8449153,-57997546,-1422974792,-1423940680,-1274382651,1008848176,-2146209021,1966735740,-2018792190,-402186498,-142145053,-1431566570,-92983748,-12204506,106873888,41403686,1204233798,637717250,369383308,-2117301497,721453249,-1952123953,46972916,2142838550,-2119896320,-402620220,635963123,207522827,-16091511,1996426358,537369098,521535488,-2147438402,1232339004,-401965372,1460013439,-1098053866,2088828792,158611969,567089588,984891652,178957483,-1191545408,642723676,1962886456,1698178567,-1442745089,-1431560354,-92946422,-1769136362,12124024,1931595069,1891011874,-155175937,1954611014,671135747,-15960321,1444285046,546740816,-12779520,-1995541249,-1191219578,567100416,1954595574,178182,-989818135,-1058535818,1585891077,369099007,2013471,-9527669,-12544371,567099316,1491796851,1981840,-2037707147,1295908672,1024750682]},{"sector":4,"data":[259280218,-2037792717,-789053622,-11762039,-1962853655,-1308670842,736154373,-1979758458,-151033210,1946353478,108971080,-1996125402,654269574,-1996339829,-335582074,145788995,-150538698,41156864,-466482256,1855884112,-851528449,521558049,-2130753802,-1410854796,-12126711,906458240,2098887,-488046591,55240706,-1640249228,-1032650902,-9664887,-12020085,-754667182,212949218,-930354989,-9527669,-851312456,1788775201,16482815,-1157402096,-1641476128,-1319895190,-1948003580,1855884235,1553895167,1372730367,567099316,1539849049,-1644098699,-1098645668,1962999658,1821281224,1317440511,-1983839233,-1946196858,-1979756410,-989896058,-1979755386,-1929419130,-1983839296,872376454,1486261193,1855884287,1107343615,57876941,-1946206743,1392461462,-12544371,-1962926919,385838750,-851463137,-462267871,-1929377863,-1946206018,201288886,-385649198,-986316657,64523293,-1948741946,-1983511801,80184071,-337321398,-12126526,-989170686,-1985149322,-335586170,39774233,-639040651,283870206,268499841,-1014298509,-523041615,-4717589,-1635036929,-919339154,12112267,-1960719038,1509912222,-10707314,-1269706189,1579273535,58050107,-151085079,1963130694,1552321312,1060351,-9927031,-10058041,-1991376640,-1979751754,-1895865210,313304,1855884032,-851528449,-12126687,-385649662,-1634860678,1183776606,512501496,503709766,-16222465,-1224800650,-6619296,1342177535,-1544534389,1183514696,4891634]},{"sector":5,"data":[1946257384,-196703482,905981091,-1560276319,-2135424956,697125,790156,-1030827469,8954662,-1978758106,8436224,567089844,871646862,108447231,-164422514,613067436,-126500853,112804,2025229739,-1407248641,1975519914,1190549754,578028031,-10307899,637959876,1309695372,639404366,-988908151,654272134,638868876,-384678519,521535698,135522384,-1962222616,-1895866722,-850348861,1183732513,-161575948,-850742197,512439841,-75300623,-1962641921,-1258332002,1528941896,238852691,-1098186752,-1903427742,-1232339100,-1769210008,-661717146,1376671835,-2095688379,646516460,-611450878,891598928,109846989,512294932,-1906835438,-100657658,806784038,646522368,-2094661586,402665006,5117580,4990601,-410267250,1443307259,-874826926,1192674606,624932916,-291888691,-1912602593,-1260876864,639749456,4589198,378414842,-1960443826,-83866586,521061507,-998027939,259254276,-1543879029,1256718354,179890183,385875896,1183469599,16229118,-1560459638,1183514873,1221626,-1258791285,-1205744304,515571857,1144454912,1397759488,1117082,1583306752,-1034033781,-1004666870,1156057726,-1105261051,196681656,531034880,-4588349,-222285057,1166747310,550273275,-44725466,539019905,1969368637,1643806980,521585524,-1476331616,-1474005867,-385649663,1206386956,-166563061,1971388230,-1009044733,-402652744,1541998151,112191707,-401880600,451413479,-1309439227,-216626426,-1948069120,201280158]},{"sector":6,"data":[51016923,1006594718,-1962773549,15835603,-1635000109,512360268,-75300623,51279103,-1979749730,989917470,-1962772776,135838659,66477571,50566686,50568734,50569758,198706131,-1962773056,1943682014,-1982166270,-788466922,13009390,1927166728,-91532531,134279041,1527686632,-622315149,990438161,1912664854,-388330750,192086361,15932987,1323849842,-162303487,335607558,-2125458059,-2088763154,1085866207,1448562688,327981649,-1957167104,-2081883554,76736525,-1930404215,-1907821986,1183400128,-163183628,107302,-10582391,-1996484603,654269574,204427,-1980342741,201285790,1190577115,276070655,757243950,587598382,101330477,57945380,-1698440397,65535,-193675253,2433690,-1900006656,-1960427326,184549398,1022653906,-2082638078,33573438,-68626828,-166956279,1954611014,112843,-1191267095,314468352,209125121,369784575,580538454,1073741858,-380107659,-1952776694,-1912602587,109979330,-1960443882,771817534,-1423103583,757834030,16097707,16359595,-1105258838,1085866266,-979045632,1959069302,8435970,-1527514741,2098887,1290272769,1354773252,-26032,1541996544,186420223,-1911917093,-1960380346,-1996477410,870026780,-1396100106,188818570,385381824,2025229599,172076287,-2080737856,-372174143,-372119087,-511645231,-1992211970,1405351502,-208993103,-959186037,-427702317,-410910736,1085865999,1448562976,746906,-1072997632,-628423819,-843070471,-12204542]},{"sector":7,"data":[651899680,1191545004,-143278070,-1406738805,158646282,-160101828,-12270042,-400652032,-368669695,46906113,1124075462,1948270467,1065370374,-956664576,-343864057,512230092,1438843595,-326898549,-1604889086,1183318263,-1895380993,-956366848,536934406,16058055,-1070399481,-1577013086,-106823433,531021568,-956157976,872477446,15835904,-1379942349,35579935,91602955,16189126,108461968,-1710983425,8626,-402358588,-1849818569,-1948349696,92939983,1179059336,74788412,-812917109,-311050230,1968193408,25133328,158680649,-108268661,-349699911,508646206,9551367,-1409265985,1975519914,-18182,-402615873,1583284670,1962934077,-150551012,20777216,-1559268352,-240975629,-150551040,1153826816,837353727,-976669951,96928854,1170688336,-1207941630,567098624,-1995142346,1418409493,39160066,259202838,1229980871,1174553799,9551616,-1962866200,1047871704,-402358588,-1250624425,1970286141,1778024710,774272102,757284480,-1609075456,1183187191,16229119,-2082152728,225837823,-1560328566,1153827063,-1041694465,-373280000,-919404354,45666867,186764610,1023768018,57803490,-1174363159,-104923037,112896,-1174333976,-239140832,309504,-1174337048,1321140260,4176128,-402588184,1706688778,11583232,-402636615,-68681490,47038208,16678272,-1514528651,4241664,-2147427864,108347197,-113210,1170607339,-672653057,887640832,-407217154,9420544,-402652487,-306577226]},{"sector":8,"data":[16105216,-402652487,1874460842,16236289,-402652487,-140509026,-1963973632,-2147419866,-1005973532,-1174341726,-1849753598,2013440,-402619928,1051984014,28320205,-443851169,311901,536920567,-397342092,1029242919,1299578879,-2131984047,517769984,1364399703,2599834,-2134605568,-12756736,-147687937,1965031617,508974892,5892103,118380294,-399005761,526254159,-1073042772,521075317,-1204312134,567098624,57876246,1593835448,521061215,236954299,1347886675,16777114,-1021372928,-1194773679,567099904,-1260942503,-1021194945,-117242082,548425537,-961612803,-67108283,-1070400317,-1946157127,1101984479,1339684673,309649211,-12219866,175397948,108277564,41171516,1405348331,1394606267,1570394194,1526726696,868466699,-1705815077,65535,-2097148155,78708946,-892090157,-2146442112,-661917466,-1312564725,-1946973436,-741878789,-253328954,266830335,-1960393984,1308624950,-72063,-2130550899,-1912602909,-31128505,-958492929,1509949446,67271,111411199,137791744,50775808,503316736,-968828786,1291845638,401033,538249,-936653173,200329,-958689720,1291845638,67271,512557055,144900102,734563072,243878347,1126039555,-617358450,-956151809,136775,50612167,105352960,1074284431,2138563,192266251,-1107295048,1541935168,-1715457280,-1085058877,92995760,695517194,1966800000,740297744,-1261401503,-2145268466,1946157693,-1260942572,1931595067,-12126708]},{"sector":9,"data":[-1207536512,-689438717,-1017619463,539984,1153370997,3194370,-352309528,2025851658,178179,1476395752,3194563,5290832,-57941205,373131318,1398216272,1096858,387072,1481688195,9550275,374390835,1448154711,16777114,-994065664,572959,1946160872,-1105261051,-1077731400,96346060,666343936,-661782528,2891406,-829749490,1464989235,1499440883,179047540,-2131003968,-294322116,868469003,16228544,-2130753802,-989986188,1313429443,1094995023,1380396624,66,0,0,1048587776,-134206173,1838822004,-1912602585,-1948807976,71187444,-385649408,-1896218134,-1962933226,-83885530,-981209973,-672653808,646520577,-1896218622,-68777001,516159939,932859986,-1912602579,-1940236072,71186903,-1960676352,378469108,646643716,-1946484734,281379820,1474825872,36080102,-678495744,536602251,-401698621,-1021319610,61259347,846577675,116787939,1948254455,886938371,16189174,777418133,757481088,-397511424,57933966,-1912577560,-1946152442,104408792,913571840,249772011,16189174,856126496,-1678711104,116794589,1972699383,302419488,651725824,1593,-2144463499,2958910,1273498485,-402426880,-555220953,1540053760,67845763,-1995737856,-1711011042,11490,-389293429,376700970,267110707,1946165736,67565069,108266244,-402128711,1642332192,109502602,-461372412,167978236,-1016994108,-946929869,574524198,-499238144,568640257,15401228]},{"sector":10,"data":[-1047911962,15417574,1088865674,2116297188,568721643,-436096829,-1342117054,-1019025920,-1464090573,1393446957,16777114,-1145031936,240129004,-26029,1891303424,-1898279935,-485520422,41389007,855932868,-2082959680,-1510799165,-13374997,-1705552041,11929,-1705552041,11942,24165372,-628172148,-1595732085,-946929869,-989692021,-1014823817,-1510737400,-35132421,24165371,-628172148,769855371,-946929869,-989692021,-1047853961,65065288,-2081422344,-1477244733,-1946492812,-2027552188,1149829701,-204217598,-336562777,-1006830899,-986818730,-1976284362,918892036,67777615,1979260694,135456866,-402649154,1399980124,59508423,11534337,587630126,-386248659,485031825,-20715265,57141499,771952872,757335806,3025050,-628404224,567103668,1526740712,567103668,604962350,25880621,-23009030,-67150616,597831256,1228333,-402651160,1610090441,113558366,-1031011430,60294798,-1494614221,1381061377,1038636550,-1942060059,-160169725,1499072350,521585499,-1962695517,-1962916810,-167753154,-1794923514,-2144456843,2958142,-30518923,-2144525818,238910,1465279092,960922,-2103814656,-402653159,1558773683,-706222074,-352146200,1048587844,1962945827,180002,-40216746,956301359,1962953278,117321234,-1998050012,251539199,954740004,-387026431,96075996,112900,1085593995,-1070390835,939756707,1946395910,-30087165,-854851400,-155176159,-2147419898,-1834810508,-116984319]},{"sector":11,"data":[57950208,-1023306589,-1532813546,-1899416829,-1844561471,638153985,67112587,26349193,26492547,638153984,67243659,26480265,-2146934040,238910,434635636,-1543047426,192255235,-402509848,-1603010525,-388573463,57999387,-393206549,-1070399456,55445127,108314635,176593488,-739704832,-1522630448,91488259,2098886,-30489855,1965892366,31713324,16320246,-1106742000,-963969015,-402628376,-1070399107,771985571,757335608,-2027025547,1345136902,3200666,-30489856,774710022,757284480,-397839103,-6684225,-402652929,521538254,-1962833176,-486303730,32040969,-1191048728,-1705967615,65535,-1962933314,-486305778,-1845050341,-1899852797,788476865,757544585,689868334,520039981,521547047,16359619,1930078952,-1945712886,-402652925,-1007027466,959365171,1965893894,59810787,-2127751750,-1962901268,671135948,1360417294,718379600,-998178816,-12779392,1114962431,-768358093,-851311944,1379365409,-106436528,1515778187,774599929,757675657,-105846701,723421486,-919381203,12112435,1914817858,-561111535,872415161,-851462958,-851528671,-1329389791,-150538751,578065664,1929668328,271629832,-335900184,67221523,-8388421,1342194742,-1705815213,4221,-1013333965,-1874951344,544538627,477431976,28836520,1073837056,-402652994,-1834746075,-1810462461,-113448957,60169865,1961101912,1964288049,-1740733651,645201923,-1559956504,-173997150,1064192,1912603064,213794817]},{"sector":12,"data":[-17831936,-1996252509,-402416618,512358662,784532382,757466878,16777114,-26112,-2144468992,2957886,585630580,251538944,-806867674,-2013318400,-2096888258,-764280321,163055223,-102635264,67647115,-388532759,1743257670,116796928,1963011365,105637897,621707310,-1094516435,1048772614,1946157968,-25171956,-30537749,1965892110,2811930,-402633752,-164757396,19735814,1055394164,645934598,-1006752475,621213230,158663725,772242152,757403264,-164707580,70067462,-1259861644,645934599,-1006949083,621213230,158663213,772156136,757403264,-164707582,36513030,854067572,645934598,-1006818011,621213230,158664749,772181992,757403264,-164707576,137176326,-1746400908,645934598,-1007211227,59772555,-1047603741,34507558,-942873856,263686,915088896,1951268864,77669965,512435712,-1960443898,637536270,661131,-2097148737,58000126,1342181567,106058067,-26025,-1073020928,-125087884,-1107100029,997523458,59770510,922691159,-14286836,-1711272394,65535,-1047845397,-679876544,-1030871180,512686219,46007184,-930370304,-970545933,1390936069,-683480873,-1996488258,-1996224458,-352057794,101121796,-1878618620,113714691,2,796498627,-628424704,567103668,-151081752,-1794923514,-1986393484,-1711275982,12942,1071271657,0,0,0,0,1258291200,1162760773,76]},{"sector":13,"data":[0,0,0,0,0,0,0,0,0,0,0,-1912597853,378283712,-1993998336,-1962933730,117319384,48758792,637920004,263934,-2097036413,237118,-31060620,-1996487418,50567198,-2096914914,235070,-31060620,-1996487162,50565150,-2096916962,238142,-31060620,-1996486906,50569246,1208197662,1355006094,179280464,-1962475520,-54512680,-770965709,12128372,-1934888064,12681665,1254198800,-880022805,-1933333773,302419651,734039040,-1547684904,-1557790702,942014464,1946158342,60334851,117848102,-1560054784,942015392,1946158598,-2144991719,16779326,988286071,1448543990,655268432,132644864,-31062018,1962936334,429524486,-1023410127,1514045486,-143507148,1912641000,762288882,-617414656,-1030818253,-1960390260,989856790,-1908575023,272531930,1968194304,302943027,-1909595392,953305,990634752,-2145684022,1086,-661908364,1087934024,204347,512427635,-259325949,244045966,-773128190,1477414,1976699648,-101315667,-561107084,695394107,47900755,1976699739,1925397252,2001692,1960512256,10676229,922685298,-661913592,1493101800,-1946154846,-1021372712,-150538504,141889536,16320246,-117345088,1048786627,1946158091,1364414711,106387026,-400615906,1048629792,1962934307,-558438395,417920235,-123475968,920335355,67837575,567103668,1583286047,1482381658,168230595,303992324]},{"sector":14,"data":[2001664,1003523072,186545347,-402098981,95944744,-1944292864,137822163,8054784,565848,1912605368,34507530,-1912282368,382659545,168754719,-561200380,-1101799885,1810381824,-398412800,1935343624,6154476,-2095135751,1962541051,508776511,3474074,-1946514688,-1185391632,-15994880,-247789963,-829750669,-850341325,1489058593,-1944881671,12747226,735743503,14648305,-687090037,-1264790155,-1658729154,-561200353,-1101799885,199769344,-398478336,1918631848,1090567732,118380318,-1707177170,309556,254067595,-777371388,-773074453,-487861781,-1172369681,-919391142,567133835,-4717709,1608027135,-1590770913,251999299,-754667264,244040680,249758624,-1909538418,-399227618,-1070399450,-1950141491,-486301682,786009849,876938894,855642600,869413833,-1191234570,869072912,60825230,872363004,244002550,-372165565,-73010182,1405296406,1148215671,7041897,1885435731,1702521171,-1900006656,512435904,-1960443700,-1962881514,-473297973,5093398,-2128202803,1970225981,512306698,-1993460669,-1087093482,-1480908894,876591415,234881722,240324183,1381043793,16777114,-1094700288,521024602,1448545872,-6662626,-1593835265,1060910143,594682228,104521508,393491546,1346797580,508974862,940284502,76218368,-956349303,190579012,-972589614,3430918,1017912555,-2080672386,914949062,-1070386022,-399003457,112325308,-1557208877,1069036609,773967157,877076105,1225165870,-852184012]},{"sector":15,"data":[512306721,-1943129013,-1707848442,65535,877634350,1360431406,877901876,1822052366,-1090519008,-1984350297,1355754296,-1705945330,65535,-1662515442,1230026994,1548138667,-1430244437,868425494,-150538551,225776640,16320246,772175296,876680843,-1976646847,-2144052714,917782762,-372170291,-372119087,-372119087,-470294025,195,0,0,0,0,0,0,568654336,568780580,521061371,567092660,50775598,516096057,3415706,378088960,314063105,773967157,955326089,-217674706,961329720,-773320016,516104191,-250165970,-401428424,-1021313082,-1705881314,14621,44161166,-754536192,525949672,381165263,773967157,955850377,-83456978,966965816,-1779951952,516104191,-115948242,-401166280,-1021313142,-1275010328,780289,11798644,-2147482392,-1664941621,-115409106,-1957313736,74353644,19806510,1560704569,-114360530,-58655944,116683778,1364350806,33325139,196350837,183738600,1539476416,1583307353,46816519,1977879040,-402213883,1499198345,123625306,-1205940387,567096585,-383874770,109850168,297416939,-402018246,-1021313268,382021150,162543849,536805864,860888771,-153579840,134485766,525862773,-382795986,1012982840,1006924815,-1662028516,-383844562,-326413000,106058067,3756186,-2082959872,17470,-970056844,20513542,1913144889,172304,1929922105,-78162424,1593840360,1499072350,525884763,1048587983]},{"sector":16,"data":[1946171651,-435441641,-469701856,1975519776,-223746037,-970062222,3736326,280501955,773967157,955063945,-284783570,890615864,-1993465395,775484702,955713164,-1338298694,-27596784,-1338249798,-28121067,-661733325,-2024798280,772032774,-1590100061,-1557265392,806107389,520360099,-986833213,-1338446570,-30611440,-183057106,-401231816,-1070334430,-1590765426,279132413,-6214140,71934776,998687519,1000946582,1000291231,1000553405,1000291234,1003043743,1000291231,1000487842,1000160162,1000487888,1000487842,-1957348390,74353644,19806510,505312825,-577835725,-47281362,271485240,780873220,780744959,1562313801,-315687122,-58655944,-2147126765,544407292,1381434966,1347441489,-778517366,990297824,-2141655037,-13759292,1499158548,1577541466,414502749,-1947082520,1532516600,1583241817,431287787,-823533685,-385305359,868479433,-346334272,302037205,1337641267,-402147560,-768347723,-1360458060,-240391951,1482213515,-346071205,-241178440,-1360307365,-1219491912,1499027712,-422533653,-422517040,-703928624,-578030710,2129205940,270679537,-4520843,876466175,-1157335792,785317889,955592447,689868334,1424941,1978219648,-179312381,807670221,62394428,-1207732992,281870337,-1896467517,-2147369018,125075624,3553574,-1089571836,1084784642,958799732,1963196982,1019225112,638481856,637796513,67241483,62850933,-104363136,12843203,-16843264,-16843010,-16843009,-16843146]},{"sector":17,"data":[-16843146,-16843146,-16843146,-16843146,-16843146,-16843146,-16843146,-16843146,-16843146,-16843146,-16843146,-33489153,-16843009,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843009,-16843009,-1,-16843009,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843009,-16843009,-1,-16843009,-16843009,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843264,-16843009,-16843009,-1,1006567167,-1,-16843009,-2,588905983,588905773,588905773,588905773,588905773,588905773,588905773,588905773,588905773,588905773,-16777427,-16777217,817364479,-4653569,1002044927,-16908801,682950143,-4849921,666303999,-16908801,649199103,-5046785,632552959,-5177857,-22086145,-1965345793,1425768669,-472831113,-1014897711,-695583644,-1024011530,-2147256896,-489603098,-783611022,1258713826,24306385,1066020427,1979711360,-18428,-16809789,-12777099,-1963821825,-2145260571,225836543,-12728014,-1979550465,-339637304,617056783,-2132440449,594772223,-419250126,460645386,393379900,-1157581744,-1993458593,240324103,182884947,777519104,-1019453536,0,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114]}],[{"sector":1,"data":[1958742784,939968299,-1996488702,1459884046,1381172822,868479464,-6664000,1459618047,16777114,1958742784,-1050089465,-1021712304,-850591816,6734625,416153859,6815747,277479683,6946819,94044419,7012355,354550019,7077891,355991811,7143427,840696067,7208963,357433603,7405571,1047003395,65537,357892355,7471107,89194755,65538,229966083,131074,805503235,8126467,521994499,8192003,728957187,983041,895877379,1048577,89850115,589826,896991491,1114113,751108355,65539,192020739,1179649,670957827,131075,189268227,1245185,876085507,196611,919404803,1310721,825164035,262147,1049690371,327683,113836291,393219,177733891,8978435,729809155,1638401,184156419,9043971,171835651,9109507,172294403,9240579,1043202307,327684,210305283,1376258,178454787,9306115,190316803,393220,1049297155,1966081,255721731,1048579,97845507,1179651,97255683,1245187,898236675,2359297,977076483,2424833,100466947,1441795,785121539,2555905,785645827,2621441,40960259,10027011,233767171,2162690,875757827,2686977,827064579,2752513,201392387,10158083,660865283,2818049,869794051,10682370,17105155,10223619,610205955,2883585,548143363,2949121,948896003,3080193,255262979,2097155,329318659,2162691]},{"sector":2,"data":[950010115,3211265,249757955,3342337,477954307,10682371,116064515,10747907,636289283,2359299,248709379,3407873,153682179,2949122,284688643,2424835,481296643,10813443,1769731,3538945,170590467,10878979,62062851,2555907,481886467,10944515,76742915,2621443,867565827,3145730,16122115,2686979,723321091,3735553,807600387,2752515,939065603,3801089,7340291,11337731,749535491,11534339,112722179,3473411,10944771,3735555,832962819,4849665,254411011,12320771,427557123,3997699,429129987,4063235,688128259,5177345,320864515,4194307,220070147,4325379,330367235,4456451,1047331075,5963777,6095107,5701634,208666883,5177347,164954371,5308419,942276867,6356993,329908483,5373955,234619139,5439491,947650819,6488065,32506115,6094850,248250627,5701635,260768003,5767171,245170435,5832707,254017795,6029315,259916035,6094851,2004055149,1802398835,0,5,0,0,20547,65535,524288,8,0,0,0,0,0,0,0,0,131072]},{"sector":3,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65535,65535,65535,82837529,65535,0,0,524304,65535,67108866,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-65536,0,0,0,3,-13750738,255,0,0,16776960]},{"sector":4,"data":[0,0,0,0,0,2130706432,128,0,6400,1441281,0,0,-16777216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201326592,11,0,0,0,0,0,0,0,1426281728,3,0,0,0,0,65537,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2048,0,0,196614,131432,196858,131436,196870,131468,197010,131444,197014,131460,197064,131428,1953301195,1819506547,1668115310,1936485226,-1866465280,587211523,805359104,0,524292,524328,131092,1350717442,1835102817,1919251557,805306483,-1711274496,167775232,-2130706432,33104,1572951]},{"sector":5,"data":[917536,65537,1333809153,1828716651,-1866465280,754986248,1308675072,1392508928,1702130553,1633099885,1852403314,2097255,2883592,720904,1342308352,1851868034,544501614,1684957542,5242880,8519688,655368,1342308352,536871042,-1275064320,335546368,33554432,1866695248,1852404846,1998611829,543716457,1851880563,1685217636,1717920800,1953264993,16243,2097184,524468,30,1182945282,1763734127,1919903342,1769234797,1931505263,1461740901,1868852841,1428190071,661808499,1967595635,979723369,2097152,11796520,2621448,1342308352,1667585154,1902734952,544433525,544370534,1851880531,1685217636,1886404896,1633905004,1852795252,134217843,5120,838860800,768,67076688,8257663,2097208,65550,1342373889,1851868032,7103843,939536128,234889216,1792,-2142240512,27471,2004055149,1802398835,-1866465280,754986245,973130752,1342177280,1159743049,1919906418,134225920,134263808,2560,-2108685824,1735357008,544039282,1701996900,2037150819,1685024032,1701406313,1701650532,2037542765,536870958,-1275064320,335546368,33554432,1631814224,1953459822,1852793632,1970170228,1919950949,1936024431,1735289203,536870958,-1275060224,503318528,33554432,1866891856,1852383346,1836216166,1869182049,1702043758,1767317605,2003788910,1934958707,1931965029,1769293600,3827044,671096832,134263808,10240,-2108685824]},{"sector":6,"data":[1751344468,1970366830,1713402725,1394635375,1684955508,543453793,1819308097,1952539497,1936617321,524288,20,3276800,1342177283,2130837378,1937009920,1852601207,1699619328,1461740645,1280265801,542130500,1701603686,1869881459,1853190688,1869770784,1835102823,1851867938,544501614,544109938,1752459639,1752461088,1629516389,1768714352,1769234787,460549743,1953066569,543973737,1701996900,1919906915,1869488249,1868963956,409235061,1819308097,1952539497,544108393,1818850419,1667309676,1702259060,1701137940,1869422692,1679844722,543912809,1667330163,402653285,544501582,1970237029,1830840423,1919905125,1869881465,1853190688,1953451551,1869505824,543713141,1869440365,1713404274,1126199919,1651534188,1685217647,1851867931,544501614,1701012321,1344303987,1931494985,544235895,1701603686,0,1937009920,1329796352,1763717453,1869488243,1986076788,1634494817,358968418,843927363,544434464,544501614,1767994977,1818386796,1329799013,1629499725,1126196334,540167503,543519329,544501614,1767994977,1818386796,101,0,0,1937009920,1852601207,1886339844,1632634233,73757811,1802658125,1919111942,7105647,0,0,1828716544,1937208180,1835757164,1818978915]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[-342872853,1458278454,-1872761968,-385659927,-873921699,3,0,0,0,0,-1207959295,20783104,134789120,280494964,-1983145664,-1946151106,50338054,1418183,-852162120,471763233,503745536,20167168,-853210696,-987837663,-1207952362,567092489,-1265513697,1007734031,1006924807,188445444,1961659081,-1261292765,-1273967358,1007734024,-2146077408,-717618494,-956371598,-494872950,436109313,317448562,-1279387978,7071744,-402626328,-1070399387,-624224563,-993737532,-993737532,-993737532,-993737532,-993737532,-993737532,-993737532,-1279277884,1701990432,1629516659,1797290350,1948285285,1868767343,1852404846,774792565,-1062002642,-993737532,-993737532,-993737532,-993737532,-993737532,-993737532,-993737532,1373226180,549049738,1372662272,281871028,-1190153300,162791425,-1023536947,-18029991,516118982,-1900006576,386332376,125110276,-13754536,-469754834,1966554208,-13722381,-83878882,1465255509,240341330,28376095,1771142,494256138,281874356,121434251,209128308,91358268,-352277016,1042435,1771206,1515805440,1560763999,-1261494440,-1961833213,-990737458,637540158,67015,38127398,-947716096,-1194183932,-391443955,-12844963,-1073085324,548405877,985857706,653030101,553614720,-347143307,851902198,436109522,230217074,49251082,1946499366,46629880,-1430244437,585683507,985857536,-1292406059,-2134442496,-294512130,45405835]},{"sector":10,"data":[516165837,-276627433,1049175556,1371734018,281871028,281872564,2012512336,28957834,-855002112,-1017554928,-956241944,-16769018,570869759,872414976,605981147,639535360,-389467392,-12779297,992507135,1929388574,572426500,639515392,-1996196352,989865502,1929388046,537823492,604912384,-1996196352,-2097142770,-108982079,-948829568,-923041469,-2084670976,-16768450,-3997323,-2097142266,268444678,1523396,-1426062408,-1582579661,103481380,-1582628832,103481382,-1196752862,-1414856703,-1962929985,-1962925538,-402644978,1001062499,1929385278,281117458,2362939,994307442,1912612382,722070498,637542942,401033,1515204,637792131,147081,-1157107528,-148503936,-150993882,212018931,99923968,637585595,403191,-1557728265,-1960968178,-1912591346,855648798,1175779318,536535622,1392924611,-773205679,-1947610647,-1966896135,-754964466,5290728,-133963017,102941579,229703721,-133963565,2754190,1493535526,-1017182373,20774912,270514176,532153204,-53765824,-1560273107,-389872808,-1070333963,1237244046,1030404,12166643,48816,1006930470,1999401991,-401690546,12124385,524303800,-523166345,84290342,652792064,79606,-617364346,421431846,652464384,-1912125559,244002521,992346968,1912603406,-1074384106,-108986338,91439104,87460646,-202780416,-389285723,-872873810,117409000,871861023,-1077899584,263783497,866513664,41152,12062925,4096176]},{"sector":11,"data":[41158400,515815604,868257280,244002559,-108985512,74661888,343691,-1510741551,1511051,281870772,-1979704928,-855264056,-1965346032,-1948003879,-108394665,281871028,16000,-1977387259,-1224729314,-478129408,-854871009,1048599312,1963261952,551780366,-338491983,196397054,-1194651443,-617410557,-1966403379,977120,-997568276,99139838,-1973752832,-725957662,-1019023869,1139193520,-435866696,-423327166,-469701822,216042081,-1184766461,-18734080,-1979305031,-1975327039,-1186797883,-18729984,1642513546,57972163,-1207812119,1048838129,1963000716,146270222,-385879368,-206042959,-1153569793,1048576000,1962934304,144893957,-1696070677,47880,-1946160200,184724238,1946331406,143321093,-2098723861,47880,-2130709832,158526,1978140277,32172296,-385323800,1049297380,1044054538,343147020,1954547190,205424911,1459565314,-1705552041,65535,1442977983,-6662370,-1560280833,-259325922,-1593549427,-1073020020,20777080,-402230016,-1192687159,-11119872,-1711129034,486,-1962439845,-1962928586,50338878,-550458,-150978397,-1547293721,1200292332,406227714,437160704,-1715076352,1050933751,736229120,32416710,-150583509,1220608984,-1174800487,237699097,-1053097922,-1047854466,184677027,-1957003584,103482439,-956104212,-550584,721440955,989872158,-1962770749,32547779,-1962918239,-1962917858,-754667056,-775386144,65065440,-774372415,-1946973213,-16650226,1442966582]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[310281046,721777920,54979008,-1727899208,-6664110,-1996488449,-1072966586,-1705973388,584,-1980086647,1589967958,105286650,638080651,-1993996407,1183515223,206998282,71797030,106400038,138921766,1183514624,1200170514,-1948742902,-532248313,16777114,-530674944,-14125057,1996433015,242679568,-1157627976,1347616767,-231681,1603009142,341835562,-1697495415,65535,13794947,1187448949,-385875746,1996423845,242679568,16777114,-834238208,13125319,-565786880,1187512319,-1962934040,126554718,-1948236151,207588312,1183385483,-1948742710,1183411783,1975520214,-530674932,-1960157301,1183396935,-899773482,-1994242165,1190648902,1965031644,112645,-1070923029,-941472119,53318,-1711137815,622,20856451,-756480,-16696314,-1711016906,65535,-1980479863,1183446614,-296318484,-150983240,1174524014,-195115788,4162342,-907474827,-26111,1048772608,1962934594,1074200564,-195116031,-1707606234,65535,1019627144,-1207339521,-1705967618,65535,60438271,16777114,-967407104,61994538,-805051693,-1947576695,75465690,-14713088,-1711039946,731,20987523,-16091648,-1593753586,-1863777984,-373282048,922681483,-6683750,-2097151745,81982,251595126,1084293440,721611521,-195115840,138906406,197936777,-1962249024,1178195526,-349866804,-195115944,206015270,-1996487899,-1072962490,2122516085,1098186978,48529027,2122529652,896795620,31999687]}],[{"sector":1,"data":[239504128,1964000779,-195115913,105351974,-942782839,63558,969426571,863893574,-772245877,-94452506,651052683,1963737145,-197722339,71014915,1048772608,1996489020,14018819,20713215,-385794911,1191117005,-1949963272,1191168118,-991505976,1183578718,1082730190,-2017057268,1342177818,-1030962293,1375869445,2078800,-26032,1391132672,-1946919228,958844486,2054489671,15091399,239504128,-1995417973,1451880518,-96039950,100423307,1183384090,-631862824,-1024316,-1977159610,-664878073,651708159,-1073084536,1191121012,-427916314,-1948158689,-970532770,1996423175,-193527818,-1946532213,134610006,-1957670398,973470278,-11513342,1996427894,175570700,-16222465,1642595958,-565802752,393592843,922690539,-6683660,-2097151745,80958,736691062,-4183041,782356550,-800704255,-538377357,-394361859,-1005554432,-2094597538,1946159231,-767128826,-2210167,966448246,-16777209,-6630282,-1962934017,-2090934714,-443874579,-900899553,-1957363698,49054700,375309398,575114022,638738116,1589905289,1200301590,308200485,38242598,-1005816065,-14281122,244327031,-990110744,-1993993634,209125127,41418534,-1058533744,308200699,38242598,71812902,-953810944,1607,639000260,-1004714101,-1993993634,1589905479,1200236054,308200474,172460070,639000260,-1004845174,-2010770850,1589906247,1200236054,308200476,206014502,639000260,-1004583030,-2010770850,1589906759,1200236054]},{"sector":2,"data":[1006838796,-1341885183,-1341986045,308200449,239568934,256362022,1204168194,1589903632,1207313942,74711332,48956080,1589903792,1334453782,-253657052,1589952778,1200104978,126559761,638475972,1589905289,1200301590,241091604,38242598,639000260,639780747,-1005304021,-1993994658,1589904455,1200301590,241091606,105351462,639000260,-1005041781,-1993994658,1589905479,1200301586,241091586,172460326,639000260,-1004058741,-1993994658,1996426311,2013210124,-401698814,1589967612,1200170510,209125122,74972966,-370667888,241091834,71797030,638351103,-1878624257,-86579186,638475972,-16365687,-14283658,244320375,-990198808,-1993994658,1996425287,2013210124,-401698804,1589967463,1200170510,308200460,138906406,638475972,-1005697143,-1977216418,1589905991,1200104974,308200464,189237798,638475972,-1005500536,-1977216418,1589906503,1200104974,375309330,692554278,638475972,-1005369464,-1977215394,1589914183,1200104974,375309332,726108710,638475972,638797570,-1005238392,-1977215394,1589914695,1191323150,1200104979,375309334,142574374,-1341885440,704834305,-771509824,375309536,206539302,-805052032,650185441,-2145103990,-1056247327,638475972,-1005107320,-1977216418,1589906759,1200104974,1204233752,-1006632935,-1960438178,1589907527,1200170510,375309339,306678566,638475972,-1004714103,-2094655906,1946159231,178181,-1070923029,-1961468220,1207314160,91554572,-352321096,197143298]},{"sector":3,"data":[-28931642,66336511,222874,1010729728,158728193,20713215,-352240479,-4183294,1996428406,276234002,-15829249,1996488310,74907398,1577606911,-1034033781,1478361110,-1957345904,-661774612,1443163267,637951684,1443526539,638607044,244332543,-990295064,-1993994146,-14264825,244318839,-990317848,-1993994146,-1000996281,-14283682,-401698761,1589967144,126428684,2013210198,-401698814,1589967128,1200170508,-14264830,244319351,-990312472,-1993995170,643171399,-1878624257,-118036466,638344900,1443252105,142081830,-437776752,207537400,138905894,2013210198,-401698804,1589966987,1200170508,-14264820,244320887,-990348568,-1993995170,643172935,-1877379073,-127277042,638344900,-2145826935,-1006499250,-953809314,67655,17450742,-1070988172,28312299,1589960912,1334453772,-236879849,135053578,390563878,-15567105,1392906358,-1005947137,-14285218,-14286217,1610556983,-310157820,535137026,248139101,50336000,16946177,50331904,16948481,50333696,16956417,50333952,-16612352,50404864,17070849,50336000,16863233,33559040,-16669696,50372096,17068801,50336512,16889856,51811328,16921601,50339072,16859904,51784960,16788224,53199360,16896257,50349312,17017345,50350080,16825344,53661184,16878848,85352960,-16670464,40448,0,1167087646,518818645,-326903666,-2091493606,1962936958,-373282043,1586168519,-164132086]},{"sector":4,"data":[1950353476,-6663414,184549631,-1947831104,1418409028,-129595082,-1946528119,1552626300,-1960867060,1183392327,600897510,1183387461,-398002200,91488768,-352321096,-1983894782,1187511366,-1006632718,-1977157538,1006838791,640775425,639846283,1965377291,-431584473,-1947187575,529208924,-2011805814,1190652486,1950351590,1963146250,-431557109,-955943678,127558,1183384971,-128006922,373787430,653149833,-16222209,-1705970058,217,637951684,-1962784887,1589964358,1194010360,1996443656,-294191114,62106,106873856,71797030,653811396,-16091137,1996486262,17537774,1589903360,1200170502,-128007162,209190694,-624897,714796662,-1006632959,-1993996706,2122516551,1567883506,-231681,1589903989,2013210360,22256153,1183383552,106874108,653674123,1166739337,-62520574,172460326,653811396,-14977025,-14286219,-23455369,50331649,1589967942,1200170502,256243468,158598144,731448715,-336014910,62925570,-1528169402,175570688,-1695123713,402,637951684,1996425097,2013210122,27630082,1589903360,1200170502,175570690,74972966,112794,106873856,71797030,638220031,-1710852097,459,637951684,-16365687,-14284170,-6682505,-1006632705,-1993996706,1996425287,38112010,1358710275,133018,106873856,172460326,-1005947137,-14223266,1979652983,2013210114,-26087,1174601728,429543676,-1006632958,-1993996706,1996426311,292945674,16777114,106873856]},{"sector":5,"data":[424118566,638076299,-1978775671,-2010772923,1166676039,1200104971,205883921,306677798,653811396,-1004714102,-2010773922,1589908295,1200236280,106873886,340232230,653811396,639584138,-1004714238,-2010773922,1589908807,1200236280,1191323168,106873885,373786662,653811396,639846283,1948600075,-352210940,-1312806398,-991899133,-1977157538,65110031,-1056251440,407865894,183624064,106874049,390563878,653811396,-1005369462,-2010773922,1589909575,1200301816,106873860,457672998,653811396,-1006221429,-1993996706,28843335,-2090902016,-443874579,-900899553,262150,12320771,763494401,31522819,18153727,25165827,18219263,2555907,734134273,1167087646,518818645,-326903666,142016284,-1710852353,65535,-1981004151,1854139990,1585660652,1187447022,-2097151772,1962936958,1144946751,460587009,1344274616,-1149185,-1130697610,-1996488704,-1073018298,-1070916235,-16660503,1996425334,-294191354,-1695779073,65535,185222793,-941394752,-7098,-1710590209,214,-1980086647,-1039401898,1996428149,-294191350,736917247,-2070261568,-352321535,-461470766,-385649664,1048576236,1962934596,9890051,17450742,-1914109068,536918016,-294191280,-1695779073,65535,199640713,-16026176,496634486,-385875967,1996488572,37198566,1183383552,-195655182,-1981266295,1183574614,-61436934,-1996471803,1451882054,-330920968,-336574839,-161561582,653674239,1589905290,-398000152,-1962440666]},{"sector":6,"data":[1325396038,1975520240,175570916,131482,175570688,16777114,-230257920,-1980475765,1451883078,-431584260,-385202551,1183514763,-61436934,-1981266295,1107683926,-163149568,-1946659191,1183444038,-1005392912,1191179870,126494454,-1548604,-2010716090,-263812345,200298239,-1804864,1996425846,-327745554,-1705983957,65535,1996439531,108461832,16777114,-465139456,-385649344,1996488489,4372708,-1202695527,-1706033151,65535,-1804545,1996487798,-327745542,16777114,-461963520,16777114,-94452736,661619494,1602430530,-165281751,175440903,795837222,1602430530,1589903409,1200301818,1191912995,638219301,1109618563,627016486,175570688,165018,1144946688,192151553,21235398,172395264,-1962696541,-310179258,535137026,113921373,-1873273344,-326412987,-2082959842,922686188,-6683660,-1996488449,1451882566,-164777734,1174604390,-230258184,-990620023,-1960381858,-62486265,829800459,705316490,1996443876,108461832,16777114,1958742784,-228670455,71797542,-1070923029,-637303,-1711016906,65535,-336181621,-228670410,38243110,-940685687,61510,-231681,1996487798,146297072,1347590400,16777114,-6664192,-1996488449,1589966406,1200170738,-2084771068,-443874579,-900899553,-1957363706,1122796524,1187403351,1048837868,1996489006,306613010,1964262923,102754563,-1292602,-1006233367,-1977215394,1183322183,442403786,1183385483,-1948742678,931859551,-1989262197]},{"sector":7,"data":[-1072963514,1586170997,710904810,-1993062517,1150017606,-431584990,15091447,-1961986784,1207364190,91554056,-352321096,-1983894782,1150021190,-398030552,-1993718645,1589961286,2139104790,292814866,-1030962293,1375736325,162981968,-339720567,-1069103355,1589903360,126559766,197019273,-1958120000,1175130694,-1005882348,-1960440226,-1102673657,716715755,1962889216,108330762,392346,179935488,-1980107008,138264134,-955941632,572998,556675,1996426869,-1099497702,16777114,138840320,-506169,-96024577,1589936127,126559754,39291686,-1982052727,-1070866858,-1979824503,1183448134,31779300,16777114,1111393024,-193658879,20973311,651976388,-16040053,-947190668,1589909483,1200301788,-465163518,-150983239,64523241,-1960387490,-6664185,-2013265665,-12795322,-21493387,-6663937,-16776961,-1711039946,65535,717379210,-754732554,-1982856222,-628361642,294787,922689407,2056913818,-2097151996,81982,251595382,1084293440,22669569,1424605227,-1707671807,-26109,1048772608,1979711808,1074724617,21012737,-1070923029,651976388,-1995946101,-1072970170,1183517556,-968476192,552152948,-597769215,206015270,-1996487899,-1072959418,2122516853,57934062,-2097084695,1963126910,16640259,66092675,-186055819,-597769216,575114022,651052681,-1995028597,-1960390586,1183393095,1200301778,-733574883,440896038,651576968,-2011478134,-1977166010,1183325255,410451928,-1927907585]},{"sector":8,"data":[1343667782,1183666950,726669006,1178161344,638744006,51136502,2122320757,91488970,-352321096,1354771202,-1673473,1996482678,-461963294,-16222465,-51902858,-230258425,-2081139063,1962985086,-360170,2081455999,-134267643,1182861687,-2096627470,-1962871722,1452013638,-195675654,92212604,1995589177,75399942,-1958579200,1452013638,-195675654,92212604,1928480313,75399942,-1960151808,1452012102,-129594892,-1946528119,1183441990,-599356476,-1981917557,1451883590,-834237442,-1949546871,1183437382,-599358502,-465109203,956378785,57926726,-1946282263,1175130694,-385649388,1589903556,126559758,-993114487,-14282146,642779767,-1709803521,65535,-992983415,-1960440226,1183384135,1200301778,-733574904,172460582,651576968,-2012526710,-1977166010,1183321159,410451928,-1927907585,1343667782,-15436033,1183650422,-1202710834,726663169,1996443840,-394854426,1357018879,-186101680,-230258426,-1946921335,1452013638,-195675654,92030079,2012366393,-230230211,427032832,15091447,-1005423358,-2144989602,637669455,738740097,1207903745,-230230255,57999872,-990095895,-1960440226,731465735,653840834,-384743679,1183579202,-28963844,1458111349,-129567230,-10980289,-1711016906,203,-1966835969,-466945978,-1325385691,736678659,-1957674798,119928902,-1706016768,65535,1022117512,-15960578,-1711016906,1788,-16640791,-1711016906,116,-1982052727,766565974,65824502,1589959750]},{"sector":9,"data":[-1978668278,1183368262,173982956,-1946401141,-1993933226,1468605959,173982722,639616038,604784522,1963015171,173982747,639616038,556931,1589907061,-867792114,-1962440410,501996102,638213828,-1960435772,1589912135,126428686,638213828,-1960435772,1589912903,1200170510,375309314,71797542,638475972,-1006352503,-1960438178,1589904967,1200170510,173982726,639616038,-1004714101,-1993994658,1589905479,2139104790,930349066,15091447,-163744508,1963255366,173982775,639616038,51136502,1589907572,532948490,206015014,20710180,1589906805,532948490,142574374,-1005751296,-1004139938,2139104799,74711066,48955824,19185706,638475972,-1005959288,-1977215394,1589906247,1200104974,375309323,206015014,638475972,-1005828216,-1977215394,1589907015,1200104974,375309325,256346662,638475972,638470024,1001415,2139104768,125108749,223313958,-1005589759,-2144989602,1963134335,1333798405,1589904141,2139104782,91554318,240091174,241091588,289916710,1190592512,1946222840,1333798422,-2128215536,19662919,15091447,637826306,-1005500417,-2144989602,1946159743,173982806,639616038,1736576,1589922165,1333798414,1589904400,532948490,206015014,20710180,1589907829,532948490,142574374,721712384,-1207702592,-768933887,-1961992508,126559944,731503243,-1177347135,-101253118,638475915,-166639871,1950414918,241091592,273645606,-129567224,-1006078848,-2144989602,-1978658737,-466949050]},{"sector":10,"data":[-443850914,1622621,1167087646,518818645,-326903666,-1705617568,65535,20725379,-2096663296,81470,379193204,-352321524,1040646123,19702017,20055609,922698871,-2053504108,-2097151989,83964422,60045055,-150989384,1342255654,35927807,16777114,1975520000,841909009,922682625,-1952840812,-385875959,922681873,-1768291436,-1996488695,1996426822,176724500,1183383552,525758,-1916123511,1183435846,-967406396,11945671,-1000422400,-1950071041,1191168638,637897418,1191118728,-1233222730,-1914274766,1183435846,-1269396302,13401731,28837245,721611520,-1203336768,11159239,-1404647680,1183514624,-1371108914,-1983101301,1996468294,-1438216924,45633558,-6664192,-1962934017,1177267782,-834238038,732972683,1183427654,-830569524,-1962574848,99339846,-137476469,-834237992,13401731,1183516028,-1962546228,-654848954,-2083764599,1946204286,-1982269691,1586220102,678952738,-1205438465,-11534333,1996469366,1354771378,-1957670832,1610558047,-1538881244,1342182328,16777114,106873856,185043238,-385649216,-1706032887,1084,-1935260023,2122557534,1232339108,-11485141,-6642570,-1006632705,-1993995682,1975520007,13494531,183409232,1183383552,-1135179334,-14524789,2013210743,243750,-1267269808,1387427583,-4557057,1996466294,710904742,-349937665,-1983894776,1183431750,-197722182,116431363,1183383552,-1034516032,-14387457,1996469366,-1133051982,-4557057,1996466294,-1069118042]},{"sector":11,"data":[1586188310,142081982,688003,1200293244,-1962349814,1200340574,1356396298,1342180792,16777114,340146944,1586172789,710904610,956305569,91567175,-352321096,1354771202,-1997046808,-29571002,1183535477,-1136260166,1589908084,1066083850,192518743,-1705574400,3015,66336511,768922,106873856,1463782182,758682,-6662400,-16776961,-2120608650,-2097151988,81470,1676215159,1041170177,20881665,-1962845207,1175173702,-1005030212,-1960441250,-1835378881,-2147483636,1962920062,630871814,-2147483647,1979697278,10873091,650141380,294787,1183454581,1357130440,-5736705,244360822,200685288,-998148928,-1960394658,1589904455,126428682,650141380,-2096478209,81982,1048774517,1946157378,65903111,-336920576,21104383,650141380,-16040053,-947190668,1589910507,1200301760,-934376958,-1054085846,-150983239,64523241,-1960394658,597315591,-2013265916,-466967994,-26032,-1073020928,-21493387,865751295,-2097151996,82494,251595126,1117847874,721611521,106874048,1463782182,821658,343342848,285594,-197722368,113285635,1048772608,1979711806,1041170185,20881665,-1070923029,-1592887669,117375276,364445996,65140480,507939824,-1994369397,39094532,-1994635637,1183515716,105154842,-1994897781,1183516740,172263702,-1961867637,1149833814,240421132,638213828,1149831051,310151440,-2000140662,127538244,-1207959539,166395905,-6635477,721420543,-2090901824]},{"sector":12,"data":[-443874579,-900899553,-1957363680,49054700,-16353537,-6683530,-1996488449,-1072955834,1996426869,74907398,16777114,-28931840,-1946270069,79846885,-326413056,1444867203,639131332,1962950531,310280198,-1207602176,48955393,1183432747,1975520238,543081491,276791334,-1207339774,-4521985,114485631,1183432747,-431584792,1212032,1183516788,441879320,1183517163,441879320,-1996485627,1451883078,310280444,-1005947648,-2094655394,1946159231,112645,-1070923029,-990493047,-1977157026,1589908295,1194862112,-2130021363,-536811962,-1813490047,543081476,289928742,641037315,605112202,1963015171,-94452714,407369254,-2127268863,1610671686,-353872255,-1003951360,-165217698,1963006023,-431587042,1451456512,334169576,653942468,18368502,1182861684,-2096889626,-1006573482,-2094654370,1946157695,310280242,-1005423616,-1960379810,-1023203513,1347601036,-335622168,408863751,105351974,639393476,1946306361,-431587062,1451311104,-1006592792,-165273506,1961890119,-94452684,407341606,1183379492,543081698,289901094,1178267684,-2145749790,1946215038,-431587060,1451335680,-352285464,-431586552,-396983552,-330905731,1589903361,2139104800,527695886,243236902,-1000442621,-1977157026,1006838791,-2096728831,1946220158,239531526,-1000377342,-1977157026,1006838791,-385649663,2122514716,57934070,-1962863639,1183385158,341755134,-1995994330,2122572870,1048379646,-28931248,-1957635849,723969094,-1706032569]},{"sector":13,"data":[921,-350986556,-94452693,604473894,1963015171,-159480914,-139954944,1073745478,1182900597,-2116026138,19458134,1589941739,-28931308,-1006139098,-1960438690,-462014153,1183517310,-1715065884,216730545,638869188,1177225099,179411428,16777114,-431619840,-2081925615,1946158206,341754893,637814411,-385595511,1183515514,1347590412,-1713092981,1589923922,1200301818,1347590406,1025178,-1706012160,4046,1183535186,1347590410,638869188,1385760651,-94452656,71797542,-1001368935,-1960438690,1385759815,265656912,1347551232,1039514,-1706012160,4206,-6664110,-1006632705,-1993993122,-1073019833,199820158,1204233731,-385875708,2122515202,192151568,15629955,28837236,721611520,273058240,639393476,1183385483,341755134,-1995994330,2122572870,259850494,-134330741,-28931624,38243110,-2082191831,1946161278,-465138861,1178329297,-1958117378,-1952842170,-101194674,1038763657,92143624,149571271,1342224384,-1957670247,1385818694,280205904,1174470656,-397012506,-135641461,1183442030,-364475420,-523041871,-1728051155,166086153,99346518,32130759,-465138944,2113816121,1476442142,1375732410,-465138864,-1711389141,-778416046,83886096,-763142144,-1206457591,45766656,-1957670400,1177288262,1347590628,16777114,-431619840,-991406575,-1960435618,1183384135,1975520254,8644867,638869188,-1996208245,2122572870,1416888336,-775804007,-465173512,2113816123,112711,-25755824]},{"sector":14,"data":[-1696303361,4474,1038894729,92143621,99370695,1342224384,-1957670247,1385819206,300194384,1174470656,-397012506,-135510389,1183442030,-330920988,1175034184,-397014554,738096779,12117110,1389505480,2096499536,-372864251,1183514837,-28955676,-1207907095,-11534236,1996425846,294754828,1183383552,6600948,-94452656,108527398,74972966,1155482,-129595136,112720,-361300144,1164954,-129595136,1080963,731466612,66638274,1178335302,-1203864076,-11534335,1996485750,302619384,1183383552,343532,1187448190,-1207958036,1385779200,-330921136,-1706012007,4671,300303873,1183574102,161040620,1443489350,6600936,-94452656,108527398,74972966,1185946,-129595136,-327745712,-1695910145,4846,-1191688567,1385789440,-129594544,2096383545,-196703480,-336050645,-129594618,-1712044501,-1617276846,16777234,1444013638,-293698584,-1957006080,1589905478,1194010136,2996482,-880025097,-936655988,-1980739959,12120670,1347590480,638869188,-996604021,-1960382370,-101244337,-991279479,-930409378,71797542,-262224743,627018534,1183448055,-1715403796,-157659054,16777234,1444013638,-360807448,-2096726271,2114055294,-431587063,1451476992,1183514856,-364496404,1178155636,-1206747414,1385763840,6600784,-361300144,-336824577,335591440,-1202695527,-11534236,1996483702,326408938,1385758720,326933072,1174470656,-397012506,638869188,-1996077173,1589961798,1200301600]},{"sector":15,"data":[-28931832,947175435,98846347,1178271894,-2130084354,19719238,31936128,738096779,12117110,1347590412,1342177720,75298315,116115083,736380555,-1202651578,585826314,721522872,-259267514,-1727266632,28856402,-167030784,-963967876,-963967765,-1202661129,-1706033132,3856,-1706012007,3997,300303873,1589962838,2139104800,1031012362,638869188,556928,1190605685,1963196430,239531551,-1004964604,-1977157026,-2013060089,-1073028538,20710516,2122519413,225771766,935671,-2145422076,-352131250,341754905,138906150,639655620,1946830648,-431587063,1451429888,1589903592,2139104800,276037643,638869188,622464,1317013109,434847974,638869188,-1006024822,942022750,158600007,15091329,-396983540,543081472,209682470,-1005554688,-2144988066,1962936959,-431063034,-1004934272,-1977215906,1589905991,1194862112,-2130086900,201385542,15226499,-1947842933,-1956714410,549608933,50340864,17588993,50331904,17896448,53314048,-16532224,50402816,17394945,50333184,17533697,50333440,17399553,50333696,17388289,50333952,-16619264,50404608,-15971584,50404864,16794369,50335488,-16326656,50405120,16813825,50335744,17526785,50336000,-15968768,50405632,17478145,50336256,17525249,50336512,17627904,51811328,17904128,54401024,17382145,50339072,17473280,51784960,16952577,50347008,16954113,50347264,17787136]},{"sector":16,"data":[54476288,16879873,50348032,16782337,50348288,16801793,50348544,17639169,50349312,17643777,50349568,16893185,50352384,17510656,53432576,16891137,50352640,17434368,53662464,16886785,50353152,17377280,51798528,17818368,54355712,17462528,1439232,0,-2081649835,1448548588,15222471,943620864,125108225,20594307,-1710787584,53,117435371,1048772922,1962934588,1044284167,125042689,55706,-1316096,-16695802,-1711041482,65535,-1980086647,1187508806,-385875724,2122514809,326434820,-1947050357,1451951686,240597256,1194919285,-2094959604,1962935422,22079747,-1947050357,1451951686,39270664,1072235380,1946630401,20506883,-2131599733,1979651199,14608643,15236739,922686581,-6683660,-1996488449,1451883590,-398014466,766509057,-151888245,1174606951,-27882500,-1980873079,1048834134,1962934592,1111393031,125042689,16777114,-1316096,-1006550522,-1960382882,1962281783,-339309820,2996242,653156036,-1962776585,-58800936,-1996387546,1589963334,1342121710,2139301386,931069962,637771937,1946437433,-295779312,74972966,16777114,1975520000,-295779088,71812902,-2094661632,259326015,-1963827573,-467004345,1448538251,-16361240,244378230,705199848,-1947709212,1975520007,-83959,-26032,1048772608,1979711810,1108279049,21143809,-1070919701,1586170859,276299762,16777114,-228685056,-1710065665,632]},{"sector":17,"data":[19664639,-1191105375,-503906283,-1980086781,1183578182,-330921486,16139975,-159481088,-1961067243,1191177310,-126448660,-1963440385,-16283644,-437520826,368199299,-1577826561,1178140972,-385649676,2122579580,158597352,66336511,16777114,-1808335104,-26109,849412096,738601729,343297,748758646,20095745,1929381181,839304966,-16775935,-1207725002,653721621,-11534030,-1711135690,65535,20856451,-16157184,-1593754098,48955710,1048821803,1979711802,974061321,20619521,-1070923029,1577058744,1575324511,503318210,1430622296,-1910575989,82609112,106859350,2013208459,74972934,-397361109,-259261042,-1710852353,65535,-2090940789,-443874579,-900899553,1478361090,-1957345904,-661774612,-16222465,28837494,1609060352,49120253,1562371467,313933,1167087646,518818645,-326903666,-11118824,1996425334,-26106,1183383552,2113004,-1070922377,-2096970519,80958,1048774517,1946157374,50043399,-336920576,20842239,20987523,-2096663296,82494,479856500,-352321536,1107754987,-197722367,59611651,-930414592,-1962922568,774305754,-1983380735,1586100302,-1707671558,70687235,-259325952,1187511947,-352321304,956664623,578153542,-16497153,1166672453,-1964758521,-316012979,-1992244949,922743366,-1600519270,-385875965,-947715601,-398000376,956379297,-915216314,-1280257,-960959370,-1202708991,1385758727,-26032,-1706033152,65535,1358710409,321178]}]],[[{"sector":1,"data":[-297367296,200300169,-13732414,-1711039946,998,66336511,257690,-327745792,16777114,1111393024,58130433,-16662295,-1593753074,-1192689342,-295779327,-1995994330,1191178822,-297336850,19793411,1979776317,-1707671781,67803651,1996423168,77372156,1996423168,81435388,-1460994048,956379297,1996568070,-1707671753,75930115,117374976,922681654,916521882,-754732799,922702048,546964004,184549378,-16353856,-352242162,-1707671623,4495875,-259325952,-1192462593,1385758728,-18352,1392508858,-26032,815857664,805764865,-1309111551,65524483,-330920962,1170670985,-956301054,66629,-2013188448,1183450693,105186034,1166592254,-1707671801,32414211,1183514624,772146162,872823553,-10062335,-1711016906,1234,32654987,-16698362,-1207700426,653721645,-919928524,922701905,-6684130,184549631,-14780992,-1962856434,103412294,1996423476,88185596,1996423168,88709884,-857145344,-197722114,10983939,-930414592,-1962922568,774305754,-1983380735,1586100302,-196687878,837484544,-362753,1996486774,-260636692,-387025153,1183383694,-262764050,242598411,19926783,703874699,-385798650,1183055548,1191128568,-230257676,1928611385,-59310137,348826,-59310336,75162,-197722368,31824387,1048772608,1979711810,1108279049,21143809,-1070923029,20856451,-16157184,-1593754098,48955710,1183563819,723053554,1044284352,175505409,20844287,-385794399]},{"sector":2,"data":[-1070858948,1593653225,49120095,1562371467,313933,-2081649835,-1000994068,1182991454,-1960443388,173982727,38242598,637820612,16793473,-1070922124,12773785,-1962260853,201657430,-129595136,-1946528119,1451951174,4326662,-1979955575,1183579734,172370936,-150983379,-336557096,-60898286,654067455,1589905290,-129564680,-1962440666,-1073000762,1589962613,138840842,638028070,280519,73319424,1699187494,1732709158,1182994293,1589932292,1204233738,-352321528,71729942,108461937,-1710983425,1636,638213828,-1006090359,1191117918,1065362948,116684032,-1710983425,65535,638213828,-1006221431,1191117918,1065362948,-990612224,-953808290,2631,19793663,-1962654069,-1956772266,180510181,-1873273344,-326412987,-2082959842,-11138324,1996425334,46307846,1183383552,2113016,-1070922377,-16720663,-1315243914,-956301309,64582,20463235,-2096663296,80446,-258341004,-352321530,973537259,1010729729,125108225,20856451,-1710787584,1801,117435371,1048772926,1962934592,1111393031,125042689,189082,-1316096,-16694778,244381814,-2013088024,-12782010,-466996876,61993099,922740435,647627674,50331651,75269104,-14123520,922682444,1754923930,-1979711481,-466946490,26536016,-2080618871,82494,251597942,1117847874,-15865087,-1711039946,855,-1070864917,20856451,-16157184,-1593754098,48955710,1048821803,1979711802,974061321,20619521]},{"sector":3,"data":[-1070923029,1593591435,-1962742397,1297948645,1426064586,-326898549,1183471128,-1947981308,105286384,-12128213,-1711041482,2045,-939899255,62534,1586175467,71731962,1981040440,343900171,-1962576641,340207814,368723587,-1577826561,1178140972,-2395404,-1711041482,2098,60438271,588698,-364476160,16008903,-1961170176,1183509086,105330692,-963966858,671500072,1182992199,1191119082,19964404,1928611385,-1707671586,153590275,922681344,177865716,-1996488701,1451883590,-263812610,-940419447,62534,1589911531,1065559792,-1978698496,-467008442,38222118,690357366,1182990967,1191128560,19833332,1928611385,-164777767,1174602854,-27882500,-1996477179,1451882054,-164777736,1174603366,-330921476,-1578215799,1317667118,736963076,2996673,-1054088713,-336312695,-161561582,653674239,1589905290,-330891284,-1962440666,1325397062,1975520244,775301604,-197722367,61446659,28835840,-443851264,311901,-2081649835,-2141844756,1979647102,-373282043,922681486,-1516633190,-1996488695,1183512134,-1310447100,65065731,1183446598,-2585606,2139292239,108986370,294787,922685054,-1097202790,-1207959543,1424687105,-1963303285,-467007929,122128976,-27006896,-369013,-26057,1183514624,806289398,806783745,-754732799,-1983773726,1183579718,-129594886,16533191,-58817792,-1951171320,1191180382,-25785352,-1963047169,-16283644,-437519290,1575324510,503317186,1430622296]},{"sector":4,"data":[-1910575989,2122340056,74841862,636207147,60438271,648090,-1948742912,-427751818,61931775,1090512595,-1707671806,169187843,28835840,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,922683116,798622618,-1996488697,1187445318,300613884,-1946526069,121177670,1182996084,1191053562,-62485764,104588330,-462290640,-244026,60438271,476058,-62486016,-310123478,535137026,46812509,83891200,-16497152,50406656,16867841,50331904,17048321,50333184,16878593,50333440,17284097,50333696,17298433,50333952,17087233,50335744,16875777,50336000,17316609,50336256,17356289,33559296,-16496384,50406656,17225473,50339072,17384961,50343424,17006081,50347008,17007617,50347264,17036801,50347776,17059329,50348800,17188865,50349568,17213953,50355968,17219329,24576,0,1960512339,35621658,14123225,74771722,48957320,-651556983,-1962877056,1541597983,-1864856381,-326412987,-2116514274,1442878188,308185943,2139103115,125110530,16777114,-1962531328,-16051586,898304116,17319158,870908788,712805123,118521475,1589910901,637194,1149945342,637602825,1962950531,-1946278910,-2014834082,-2094273537,1963528318,308185887,-1962896711,1944586822,-1958657537,1810369606,308186623,-1945477495,116067414,100826243,-1159134347,276726530,-2093845503,1963135102,23259395,34635395,-1070339979]},{"sector":5,"data":[1343387391,16777114,172264192,242532363,-1710590721,65535,-369473911,-605486865,41714433,-352160505,308186045,-1207958855,199753735,-3001345,-1705897354,197,-1710590721,212,-375159,-6679946,-16776961,-6679946,-1929379585,1586359886,678756338,-14256897,369172534,-11332015,-1073018787,1552643956,-148927732,271943,1183518324,-1669035538,-263812352,10388617,200427147,1175188550,-129627146,-1937025932,1859322012,-160508942,10390667,-738955565,1996486766,-227082478,-755969,1996486262,-25864,-1070399488,-15567105,-6620554,184549631,857109696,309788626,16554578,1996423168,-26094,1592328192,273074175,1996423170,27695634,-1070399488,10257545,10388617,1343387391,106138,-92864768,16777114,-6662400,855638271,288787913,1824427265,1444827391,-1705568687,65535,-6662378,1593835775,-1961730421,702775,-131608,261755510,-1962934271,45683294,571392,-369235480,1149960521,1958742794,77221937,1342177281,119194,308185856,855640761,-37164864,-1207958855,-1075314681,1405105149,29989456,1996423168,34052626,1996423168,28744210,1996423168,18323986,1996423168,-26104,-1924136960,1962929742,645201704,18888447,1996443926,108461832,-1995940353,1721433158,-1996488702,1552615510,-148927732,271943,1183518324,-1669035538,-263812352,10388617,637951684,187041675,187040327,187040839,1601504839,10257545]},{"sector":6,"data":[10388617,120730,-1916194048,-1929309898,1358916798,374429214,32283223,1461059584,127898,308185856,-402650439,-1070334702,1184518227,-16777214,1318720118,-1962934270,45683294,571392,-1946356248,-62485705,34635395,2089510261,642313002,1183385483,1200301810,-196703998,71797542,653674121,-1996077173,-1936983994,1859322012,-160508942,10390667,-738955565,1996486766,-227082478,-755969,1996486262,25336568,1183514624,-15143940,1962879092,276234022,-15960321,1996425846,108461832,1594383871,49120094,1562371467,969293,-269762509,1167120524,518818645,-1070344050,185097867,-1961397029,-1886699489,-1895104366,175374484,-16222465,-1610676618,-310181742,535137026,80366941,-1864856576,-326412987,1457032734,-4181161,1996426870,-6664180,184549631,994211008,1962938886,175570703,-1710721281,65535,762626059,16777114,47104,2139825013,-6662398,-486539009,-1948611048,105810928,2126831499,-1527514104,-26029,1183514624,-2090967290,-443874579,-900899553,-661913590,-1957345904,-661774612,1443163267,-2000669865,1996487494,209125134,64461392,-1073020928,104543348,326434834,33244870,-16091393,-325449610,184549379,-1961134912,66427640,309657600,126468147,-1711114241,65535,-26025,1988820992,1962281734,112729,940334788,58063686,101211844,1251627091,184549380,-1956940608,1354773496,-26026,1222836224,1358710409,263066,-1909071104]},{"sector":7,"data":[-1948808254,-1698679816,1134,394861685,1183567499,38242812,142001438,530904060,68852304,28311552,-91546901,-1694730497,1250,-1694730497,1148,75668055,-1070399488,-310157729,535137026,181030237,-1864856576,-326412987,1457032734,-1070334889,185366155,-1957333770,39619380,1041281,-620536460,-2146806133,1618217211,2131164032,-1961657266,-1898410754,449283008,16777114,314671872,179907051,50036736,146350452,142377728,991458563,-1005290287,62391934,-1070355712,1150004139,-1047811308,-997191189,-784660866,-779681155,-1962359165,1604645825,49120094,1562371467,576077,1443394699,309658,-1947671808,-1948610850,108971248,-1190504821,-784662518,-896859523,-201535189,868912036,1403712448,323738,172395264,1478409707,-1957345904,-661774612,-2095911805,1962938494,-339727612,105286490,-1995942261,1451881030,172395508,-1995680117,1451882054,239504376,-1946532215,1183387718,-1948742660,-297367289,16777114,-295793920,-14125057,1996433015,-18418,1392508858,-230257328,1602965526,408944426,-1695529335,65535,-2081405301,-443874579,-900899553,1478361100,-1957345904,-661774612,637951684,17334147,-14274187,1589906039,2013210122,-26110,1589903360,1200170506,106873858,175636262,638213828,-1710983169,65535,638213828,-16496759,1996426358,106873866,41418534,641204006,-2096865281,-443874579,-900899553,1835016,107872259,18153727,109576195]},{"sector":8,"data":[18219263,83362051,1114113,94437635,1179649,97059075,1245185,3997699,932446209,104595459,378798081,39190531,110428161,42402051,1376257,103153669,21233919,50003971,85852161,78512131,372047873,103350274,21233919,56229891,272433153,80216067,784596993,49479683,96796673,73597187,4521985,83755267,4653057,77529091,785711105,88932355,366542849,39714819,106692609,47841539,6356993,102039555,375521281,26148867,8061183,46465027,16580863,48300035,8192255,35848195,8257791,36241411,16646399,0,0,0,1167087646,518818645,-326903666,775848218,1912667393,16693254,-1593774871,994050350,1979790342,872842024,922681857,767034356,874968832,1372138241,506920784,-26110,-1073020928,780339061,-352190156,-197722168,19503619,1183383552,-229209616,-150983240,1174604390,-229209104,-1981004151,782364246,772210433,-196703999,-150983240,1174664294,-229209104,-1980348791,1183578198,-296317972,-1981266295,1183574614,-128545802,-1980086647,1187511382,-352309786,-396442606,652756735,1589905290,-96010246,-1962440666,1325393478,1975520230,-161561372,509734,172395264,38242598,172476198,-1014300672,201704076,-11513344,1996484214,108462060,-402098433,1589904284,1204233974,-16777212,-1711016906,425,-2081143157,-443874579,-900899553,1478361094,-1957345904,-661774612,-952701821]},{"sector":9,"data":[63558,66336511,16777114,-431585024,-1326950775,174519853,-1981397501,1451879494,2996462,653024964,50489335,1452009030,-565802520,652236425,-1725806709,652107460,-148746357,-364475911,653024964,-1725610101,652107460,-148549749,-666465799,172490534,75465510,-1003784960,-14226338,1996423799,108461832,16777114,1975520000,-564214763,173014822,66336511,16777114,-373282048,1589904081,2013210334,38443524,1183383552,-61437446,652107460,-1710983169,65535,-1981659511,1589961814,1200301818,1347590422,558336806,-1957670247,1385818694,-666465456,-1706012007,513,-2097151699,1347551450,133274,-1706012160,65535,-1982970231,1174523990,-464121374,14974595,2122516087,242679778,30965379,-1612119169,-665911552,1996460779,-495517724,16777114,-329333760,71797030,-596328437,-26032,1183383552,-866743862,652107460,-148748405,1589963374,1200170732,-899759070,373786918,637951684,1589905289,1200301790,-663816411,653024964,-1004189815,-1993946530,1589909831,1200170502,-96040190,-1979951477,1451873350,-901346346,-1983097205,1451880518,-767113230,1183514676,-766574638,661962763,-2859324,-1977166778,-262224889,653281023,-487913592,32145027,1325336190,-18028054,19795711,-16687895,1996475510,-529072182,-2197761,1996478582,26929386,-992459125,-148452770,-1993989777,-165273273,1946228807,-96040107,100423307,1183383603,-598308390,-1030962293,-1996475643]},{"sector":10,"data":[1451881542,-94452490,508004902,-1977162710,-316007089,1077985579,-338540919,-631323625,47859331,-150500570,1589958758,-196705292,126428674,-2996597,-1072967090,1589960565,-1715459126,726108454,760711462,591890726,626493734,653942468,53430155,-1983738685,1451873350,-899758890,793217830,-1030962429,-1980742007,1996485206,-730398762,1589923922,2013210362,2013210145,-663290090,-387287297,1589903757,1200301818,1468737063,-899759063,658999590,693602598,653942468,640632715,640767883,1915311929,637957913,1982285625,-899759087,-1949415797,19320918,287713095,1589913943,1200301818,-1933376729,-733574718,-992586103,-1960392098,-1023203513,1183433356,-229209616,-2859324,-1977166778,-262224889,653281023,-1073084536,1589963381,2013210348,71539204,1187446784,-1006632456,-14229922,2090468471,-1006632956,-14229922,-2094658993,2130709119,60858658,71776550,1589907572,2013210334,-26108,-1073020928,1589964917,1204233950,-16777212,-1711016906,256,-2080881013,-443874579,-900899553,-1957363706,140428524,239569702,-1006342409,-1993995170,1589903943,1200301576,74381072,638344900,-1006352503,-1960441762,1861685831,207537158,105351462,638082756,-149665909,1589904494,1200170508,140428296,373787430,-1006342409,-1993995170,1589905991,1200301576,74381080,638344900,-1005828215,-1960441762,1861689415,207537158,340232486,638082756,-148748405,1589904494,1200170508,140428310,625445670]},{"sector":11,"data":[-1006211337,-1993995170,1589909831,1200301576,107935527,638344900,1562068873,1426066626,-326898549,509040138,-1005553979,1586236542,-96039682,-1962254709,140965827,1727524867,73856774,1330575363,105286653,-796138505,2080919295,-125925061,1183566731,1946303494,1946369085,1946238050,1946434609,14608643,-1996451863,1317796982,-729921276,-973713783,-896796554,1325376755,-973635594,-1058276234,1583292412,-1034033781,-1527578608,-1968384533,-790048288,-790048264,-790048264,-790048264,-388912392,-388892464,-388892464,-388892464,-492111664,-1397953575,-388898678,-120522544,-120526639,-388892464,-794101552,-790048264,-772222728,-788999960,-1427582472,-120522544,-120526639,-388892464,-120522544,-372710742,-1968373903,-790048288,-788999944,-790048264,-788999944,-388912392,-120522544,-388892464,-120522544,-777324336,-788999960,-772222728,-788999960,-1426534152,-120526639,-120522544,-120526639,-120522544,-373824854,-1968373979,-790048288,-788999944,-772222728,-788999960,-120542472,-388892464,-120522544,-120522544,-794105647,-788999944,-772222728,-788999960,-1426534152,-388892464,-120522544,-120522544,-120526639,-789000022,-772222728,-788999960,-788999944,-1495094536,167692521,1040253696,268435712,1375798016,301990144,838927104,318767364,-872348928,335544577,-201325824,402653441,-1795161282,671153921,956302081,754974978,-1174338794,1040187649,1711342336,1056964868]},{"sector":12,"data":[1167120524,518818645,-326903666,-1957210614,529205342,134381440,-6682756,134217983,-18431,185104011,-1958316810,142016308,-1705872129,65535,734147481,-196703806,-1064382324,871792269,-1951683648,866846278,-276583488,178440,-1711275589,65535,737822347,865728070,-1983763518,1183535684,-2090967052,-443874579,-900899553,-661913596,-1957345904,-661774612,-1946157128,-620034466,529207924,-16353537,882528887,-1728053248,-1037319629,-1962742397,1297948645,-1946156342,1430622424,-1910575989,149717976,1586190166,-2145416438,2080899711,1808903,34209792,1988870195,1962281738,-1959490717,1175128134,-1941277690,-1916760368,-1070336386,1183558571,-1070355704,149914539,-1157627207,1553596417,-1962934272,1177287238,-1036805642,2089665067,-1898345400,-1952863295,-101251506,105286571,-1421805359,-1951677813,-341113274,-1898345460,1216122305,-1414812757,112811,-310157729,535137026,113921373,-1873273344,-326412987,-2082959842,1448560364,13125319,-901331200,1586167808,-147354868,33557062,28837236,721611520,-498693696,673527,-1207602172,48955393,1183432747,172423122,91490304,-352321096,-1983894782,1190640198,1947205642,112645,-1070923029,-2082191735,1946215038,1380253443,106873942,175636262,142081830,209190694,-1705983957,65535,-1981266295,-1937053098,-120389476,-1949022583,-1634956606,-1980181760,1589955654,-733574394,205994278,2122517365,91488482,13911751,1044679424]},{"sector":13,"data":[-2081143159,1946215038,146704,2122517365,91488468,-352321096,-1983894782,-1072972730,2122517621,108331194,14974595,2122517364,91488468,-352321096,-1983894782,-1072956346,2122531188,745799868,1347469355,-11111169,2006602868,-1996488700,-1072969146,-303496331,209125123,70031952,1183383552,1975520200,64153859,-1207142657,-1706033139,65535,-992459127,-1960442274,1183387207,1200301762,-1102673648,-1981659509,2045367878,-498693375,1960199737,112645,-1070923029,197150345,-955943744,81476,12615299,2122518900,192217844,13926019,28837236,721611520,-1002010176,13794947,-1125579915,-96024832,1183514624,-96060980,451478396,-998341887,-1958120448,1174650438,-599356934,1221346955,2130331195,178181,28836843,-1102707968,-1980086781,1183572038,-96064564,-1037330104,1174665425,-565802558,-2472311,1183648886,-1202710822,-1706033150,961,15484615,-1102673152,-1980086781,1552674374,273124140,-1947187575,1077997126,-1947056503,1177275462,731465978,66638274,1174651462,106874070,239569190,-1205046017,-1924136957,1343679558,-1174145352,1347552249,1392923398,67344982,1182990336,1240007418,-998341633,-1960414208,1183432262,-867826724,-1948236151,1183433286,-632911394,-1928562945,1343674950,1342177976,16777114,-1983894784,1183444550,744262636,-1995421813,1200353350,-230258414,-1962516796,1174651462,1200170710,745864974,1342178232,384583309,-18352,1392508858,106104400]},{"sector":14,"data":[-6662573,-2097151745,1946206334,-196703482,-12696439,2122569294,58458326,-2080473367,1946208894,209125144,-1698138369,1162,-1698007297,65535,13256391,-1166114048,-2096532224,1962992766,30992643,13926019,-806812811,-864124159,-1962181108,-1181103034,-101253108,28836843,-431585024,1347469355,-10849025,-6662028,-1996488449,-1072969146,-907476107,209125121,-26032,1183383552,1975520200,28240131,640965828,-1962379265,939471452,640965771,-1709803521,65535,-1963571575,-754934132,-834237960,12222083,-1511455883,-431584512,-775804007,-1946645512,1174654534,1178288358,-1962377268,-956051898,-1961825472,-1723799994,-120470997,1183565963,-1983829044,1183565382,-968490050,1183434539,-431584262,-1037330112,1174665425,-968490050,2130331195,-867792043,66733611,731496006,-1946627646,-763460616,721581312,-1035598912,-2082847095,1946210942,-339244284,62925570,1174651462,-733608990,-1948367223,1183447622,-599356960,-1928562945,1343674950,1342177976,400282,-96010496,2122553323,57999588,-1006587415,-14273444,1552616055,-1959264462,-14273444,-1399187849,-1996488700,1183578182,-129618954,-1181097775,-101253117,-1963440637,-754934132,-968455688,-1712961909,-120470997,733892235,-967965752,-1946530167,-1723799994,-120470997,62801411,1178322502,-1957331206,1177275462,-1102707718,-775804007,-2080863240,1962988158,62925570,1183433286,-763460646,-1962642432,721611719,-1035598912,65160707]},{"sector":15,"data":[1183437894,-96039970,-1981790583,1996479558,-632910580,45633558,949637120,-16777213,-1746142650,16547459,1996432500,-663290100,162970,-897678592,-15502336,1996426358,40278728,1996423168,70556362,2122514432,57934050,-1202565889,1599995905,-1962742397,1297948645,854218,92733443,763494401,10158083,18153727,105512963,303169537,90243075,19071231,38993923,143917057,103874563,823459841,13238275,924319745,58982402,640745473,104988675,313917441,59637763,506920961,58785797,640745473,16711683,861667329,29884419,678166529,1167087646,518818645,-326903666,-62470396,-1070923776,209125200,-16091393,1996425334,138840838,1342981675,721831563,-1924134330,1343683654,16777114,1958742784,-62485755,-1070923029,-1962742397,1297948645,503318730,1430622296,-1910575989,106874072,641204006,637695999,637827071,-1878624257,-7280626,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,16533191,1354771200,-15960321,1996425846,108461832,385631885,-26032,-1073020928,1183516020,721611772,49120192,1562371467,34130509,889193216,855703296,-1577057535,1124138752,1,1167087646,518818645,-326903666,-62470396,2122514432,896794634,556675,2122526580,695468038,-1962254709,41911071,-1207206904,-1706032600,137,1996429035,142016266,-1207535873,-397410303,1183383736,-62485508,-1962742397,1297948645,503318218,1430622296]},{"sector":16,"data":[-1910575989,82609112,16533191,142508800,-2094042112,1946158718,140413737,2139299723,192677890,1342254008,56986,-15275264,1996425334,1354771206,1342177720,-1996463128,1183579206,49120252,1562371467,313933,1167087646,518818645,-326903666,-62470396,2122514432,745799688,425603,1586177652,-2095084792,2080899711,19576843,48798288,334168064,-16222465,-1070922122,300437584,-62486272,-2080618869,-443874579,-900899553,-1957363708,485262316,16008903,142508800,-1207536384,-2065104895,75399937,-2095221760,1946158718,175570711,-1710852353,662,200165001,721778112,23194048,-1962254709,-163149561,1200347275,-129595092,-33005941,126550855,-1947974007,1200355422,-62486262,58048523,-1962862871,1200350302,-263812854,58048523,-2097084695,1964902527,75400012,-15240192,2013203062,242745100,-15697921,932844151,-385875966,1996423390,-463566070,-15960065,1200295543,205990672,306678608,1343113003,1347469355,637008,1375753658,40016464,-1343684608,-465138944,-1996483579,-1763050938,-94467328,49956483,1183385483,-94467074,49956483,1183385483,-94467094,49956483,1183385483,-398014490,1183514624,-1037329922,1178335441,-1956610328,1183054430,126550778,-1947056503,1183054430,126550778,-2081667447,1946158206,175570708,-887041,-11474314,-6625674,-352321281,175570729,-887041,1183574646,-230282260,-431584432,1357530667,1347469355,637008,1375753658]},{"sector":17,"data":[-26032,1191116800,-1953240088,1325396038,1958743024,-10622717,32786119,140413696,-2096934914,1946158206,108954385,-16026624,1996425846,-25874,1183514624,1575324660,503318722,1430622296,-1910575989,1122796504,1187468887,-956301100,57926,15091399,243172096,-2096335872,1946160254,176063238,721777920,94431680,-1961992565,41911071,-1207141368,-1706032087,65535,-1962571287,1207831646,-1995994365,1187510342,-956301112,51782,-1995946357,1183566918,-834238202,-1928431873,1343670342,1342177976,16777114,-867792128,-1983363541,1183516742,-901370930,-2096740727,2097154174,138840840,1183439095,108954376,-1962377984,-654899642,-1962522999,1200355422,-800683766,2097152317,84928771,16777114,-330921728,58048523,-1962606359,2139355230,57941512,-1962891287,1183386695,239569886,-1948760439,1183387719,306678746,-1948891511,1979965046,-327745784,-2197761,1983502454,-1962640166,-1962677306,-11478458,-560277898,184549379,-385649216,2123039913,142486490,971798271,75357822,65783691,1356744331,-2590977,1996479094,-25898,-1073020928,2129199989,-327745788,-663290026,-666465449,1342588419,267418,1975520000,73656579,1458337535,735463051,1464862278,-1697220865,1375,57982987,-385618967,1183515717,1312248,-940554615,63046,-3127669,-1072967602,-1444347020,-163149056,-523116335,117283408,1183383552,1975520226,68413699,1207883915,-1995994365,1183579206]}],[{"sector":1,"data":[65065462,1183448134,-968439840,1586167809,172461048,-1949284727,1312195,-940554615,49734,1183045771,126550768,-1947711863,1183051870,126550768,-1948760439,1183051870,126550768,-942258551,56390,-1712830837,-120470997,2145142331,54651139,-2081399157,-1962741690,-562656969,-2081399157,-1962741690,-629241537,50873995,-1069119034,58640187,-385830423,1586167984,-263814160,-1995994366,1183574086,-398050826,1183516286,-163149336,-2081399157,-1962741690,-666466041,-2081399157,-1962741690,-700020473,14436039,-398030080,-775804007,-599376904,65602431,-262239233,49301123,1988704139,-262239266,49301123,2122923915,138841050,1183434243,-327745600,-663290026,41862971,-11483253,-2070227338,184549381,-385649216,-947191043,-1995946453,1996471878,2143697900,1355188994,1473804031,-1697220865,1522,58048523,-16590615,-1981031354,1586218891,-1035534398,1577313233,-1962440196,138816455,1002325641,-1962770490,-1033991226,-775796993,-60947485,1191118729,-18290212,13008515,1187461492,-1962934052,1178190406,-1960018468,-422454154,-231933,889187446,-2590977,1183515252,105251800,114268752,-1073020928,1189675893,-599358718,-2083722494,1962987646,9693443,-2081399157,-1962741690,-398030585,-2081399157,-1962741690,-196703993,-2081399157,-1962741690,-230258425,16402119,-599341312,1183514624,-1037329944,1178335441,-1957134628,1183051870,931857136,-1948354935,1183051870,1066074864,-1948615031]},{"sector":2,"data":[-972879802,1002456713,-1962770745,-94467129,-772126977,-530709533,-947189879,-1995946453,-969163194,-963967875,1183515627,-94467138,-772126977,-530709533,1191118729,-2086933540,1946210430,-196703480,1960199737,-599341247,720044032,-774080885,-59374618,-1280257,-700019916,1342588459,-16616193,1922750070,184549383,-385649216,1182990697,1183515356,-599377470,1187499644,-385875514,1183514841,-96074814,-523116335,1342178309,16777114,-733574912,58048523,-1962854167,55049944,1183385483,-1035564078,-772127229,-767163424,1183400000,-59310140,-4032769,1996480630,-763953158,21882960,-2083365237,-1962749370,-364476153,-2084282741,-1962752954,-465139449,14436039,-1960121600,-422454154,-2984445,889187446,735463051,-11532730,1996423796,128686806,-1073020928,-957807755,-599358720,-364475646,2094810681,-599341106,720044032,-774080885,-998898714,-1280257,-193528012,-1962773249,1174664262,-1281732602,184549379,-385649216,1182990477,1183515356,-599377436,1187499644,-2097151802,1946210430,-196703440,-1948760439,1183445574,-599341098,317390848,-774080885,-530674714,1586167947,-16741892,1183571014,-599377414,1183442556,-800683070,198201087,-385649472,1637547450,-1996488701,-1072959930,-11522700,1996483702,112652,-26032,-1073020928,1996427636,-294191346,-1878362369,-137828338,-1685879,1369108086,-2097151992,1946211454,-732001524,1392726014,549786,-495025408,-1962118144,1342104158]},{"sector":3,"data":[1805275907,-16777208,-6624138,-1962934017,1342049374,-431584509,-310157474,535137026,181030237,-326413056,1443687555,1183432747,-28931590,-1980217719,28900422,-196704000,-369736055,1183514923,-129615608,1206453116,-128021759,1988879313,-1962898678,-472777634,957249163,-2091877120,1946221182,-60912862,-771995905,-1962898461,1191179358,-1948003852,8979574,16678531,28845429,-1960645888,1191181406,-1948003844,9113206,-631157,-472779194,-1996065141,-25263360,735802368,-28931648,-1962886423,-472778658,-1962248565,-60912896,1988879313,2113943822,-25263291,-1961200384,1191180382,-1948003848,9112182,-762229,-472779706,-352029045,-128021736,-772258049,175541219,1586167947,-163119114,1988879313,-2097116922,1962998398,112735,1183538411,-96062466,1586181748,-62455812,1988879313,-1962898674,1191179870,-1948003850,8980086,-500085,-472778682,-1962248565,-195130624,-772520193,74877923,116064393,-243969,2122577990,91554046,-352321096,-1983894782,2122579526,-1586233094,1183432747,205949946,2113685049,-20256509,1586174699,-62455812,1988879313,-1962898674,1191179870,-1948003850,8980086,957105803,-562234298,1586174699,-129564680,1988879313,-1962898678,1191179358,-1948003852,8979574,956843659,-562235322,-1962516853,-1991707066,73304839,1223968395,-1956771959,214064613,-1873273344,-326412987,-2082959842,-950661908,63558,687747,1586175860,-1959294198,1183385670]},{"sector":4,"data":[105286644,1458980489,385107597,-26032,1183383552,-129594376,49120094,1562371467,184994381,1057030912,117440776,486540032,134217987,-1040186573,134217985,1845494563,167772426,570426141,-1946156792,-117439686,1090584323,-1828715775,1107361537,738198273,-1241513727,872416018,-1207959296,184550198,1660944648,1174405948,-167771900,21,-2081649835,1448548588,-1962641781,38046524,1006126729,-385646649,-947191506,-523116335,1183434243,-1948742678,-956102585,-62486208,2096645691,17885443,-523116335,1183434243,172461032,-1946270071,1195108446,-385649654,2134442230,721779720,15854016,1090274955,-940554615,64070,16008903,-1960580352,1191178334,-773598736,138447843,-1962258293,1191180894,-773598726,138447331,-16101239,1183577158,-60912652,-472783919,2131247161,-773878834,-1948003869,1586169920,-773598724,138413027,-1947449719,-1991706042,1183576646,1183402236,-263812114,-96040632,16008903,-2091783424,2080436862,-293717725,1183516789,-229703694,1586175211,-773598738,172002275,-772645237,971231715,-494990784,-1161589,1183444558,-774337552,-1948003869,1351288896,-94467318,-772124929,-1981558301,1351157824,-196673782,971785867,-1484983226,-1946517877,-773795385,-1983511584,-661919162,-1981004149,1183516743,172460542,28851337,-1956684288,46292453,-326413056,1460595843,141986646,65748107,-16496897,-11138442,1183516278,-1202700284,-397410302,1183384783,105266168]},{"sector":5,"data":[1996481140,1996445194,74907398,1342178232,-1996179736,1178203718,-16220424,1183515718,-13308936,-11138442,1183516278,726679556,-1796714304,-28931836,1443526399,-16353537,28836982,-2132258816,-62486268,2113816121,71761675,-1979824501,-1947531706,2114125699,-947171525,-523116335,1183434243,-1948742668,-1992231354,1183516743,172460540,-775451825,65065440,-230258234,1204279435,-1962934008,1200161862,-1203992310,48955393,1600045099,-1034033781,-1957363704,518816748,1988843095,-398014716,76218368,-772520311,65065440,-498693690,1200347275,1183401994,-297351172,2123038720,1200310260,-196738296,972703369,58587774,-1962862103,-773598753,138447843,-1423735,1347815030,-1191414017,-397410301,1183384519,-364475420,1038370347,813563906,1443264255,1223313035,-62485680,45633600,-1528279040,-330921725,971261579,276753478,737957515,-2084568128,1175126482,33614316,-472785013,1082909649,-129595126,1443264255,1996443720,112892,57534544,737560201,1183447110,2109737954,-129594618,1039549995,1518206977,1443264255,-1946650881,1346436166,-397361109,1183384387,-163148820,2112636473,-92391146,1183554174,-773878804,971231715,-1937830848,1201269575,2096791097,-775451871,65065440,-498693690,1183570059,138885622,960498559,58591815,-335579671,1183535066,-297387532,1191126141,-297366556,-523116335,1183434243,-1948742686,1200219206,-163149048,-16103543,-381161914,-4653339,20965887]},{"sector":6,"data":[-772514165,-1948003869,20973632,-269880250,-297366784,-523116335,1183434243,-1948742686,1183385671,172461034,972572297,58518086,-16724503,1213597302,-59310256,1342177976,-1996323096,1317795398,-1053079048,-1992293251,1996486726,1996445190,-59310102,-397361109,1183384167,-364495900,1183384446,-129594390,2095728185,8972547,1443264255,1996443720,243964,37873744,-1946794359,1178200646,-2094301706,2130769022,-10557181,-1946923265,-523111354,-972824367,-1948105079,-364475432,-1962391671,1200224326,-398000374,2122531563,58654964,-52247,1183577166,-773795340,-1983511584,-661921210,1089881739,-1962391671,1200224326,108461834,-159973546,-1191414017,-397410302,-1992293933,1191180358,-9573912,-2081534209,2080435838,-16389885,15236739,2122524276,58654964,-73751,1183577166,-773795340,-1983511584,-661921210,-1981266293,1183516743,172460540,-1980479861,-1715459324,-443850914,311901,1167087646,518818645,-326903666,-950642924,63046,949891,15270773,241076993,2139299723,209455106,1342446008,16777114,15526144,-1995684213,1183576646,-196703990,-1928431873,1343681094,1342177720,16777114,134789120,-26032,-125108224,58064651,-1711228183,65535,-1996357448,38111493,-1961992565,207391543,1183385483,-2082960392,1946223231,9103619,36063222,1156974196,2121531656,-14125825,1996433012,108461832,503596429,710708048,1443127295,-227082409,-1191938305,-397410301]},{"sector":7,"data":[1178271943,1448310002,-227082409,-386631937,-1072956477,1465271412,1459641064,200958440,1446474944,-58791849,-1981004151,-92017066,1023768063,578093055,200033931,242544198,-1981004149,1183576646,-196703762,93043179,2130855225,-163133503,-6684671,1459618047,16777114,-163149056,-310157474,535137026,181030237,-326413056,1459940483,108432214,-1962639733,-28931835,-472786805,1099817937,-62486264,-14125825,79177332,1586188288,1074236412,516131664,1354771280,809798480,1150111774,726670908,-1957670720,1610558044,-1956684260,79846885,-326413056,1460989059,-330905770,1187446784,-1962934024,1200295006,-28931796,1200347275,-62486262,1601486859,-947651701,-1957762284,1161365062,960331522,947782725,32261831,-2080929024,92997318,-1947187575,1325396038,1958743024,-263258328,-196703827,-297367123,956843659,-478153658,2129544761,-129579042,334168065,-523172469,50333189,-62485512,201084671,-156731968,1946223686,-125926555,-1957006336,2013203550,645398312,-16222465,1586169462,108527370,-16484353,1586168950,710904588,-1993580545,1190591046,343147012,972310155,108853830,-360829,1183521397,300632308,971916939,109050438,-360829,1183516277,-96040466,-335919477,138840934,2122539499,1299448044,1586183147,678952716,-14256129,1996425334,173968134,-16353281,1996424311,207522564,-14000245,1183394911,561266938,1476032255,184596200,-1950779968,1183447622,142016264]},{"sector":8,"data":[1459910399,-1996481304,1967130694,71759541,-1207602174,65765376,1585446840,1575324511,1426066114,-326898549,-1957275900,76219510,-151107959,1946289734,146751,-24443787,2123041515,-2081959426,-33356561,-1962489981,1325399622,1958743038,-28377275,956450187,58460230,-1959072952,138819845,1183516028,-2094077176,-672463633,-947650933,-15340794,93060686,2080917049,38112024,2080917049,80184285,-113013,-1072955826,-4660875,-1956684033,113401317,-326413056,1459940483,74877782,16533191,46564096,-1946256245,46564294,-964442485,1327229698,-1962752381,1144587846,-2096136194,1144586950,-955810050,130118,-947189781,1975520079,-62485538,-443850914,311901,1167120524,518818645,-326903666,-1957210616,-16052098,1962934200,-1942647973,-1916760368,1183577726,1183558414,-276583668,112900,-6628557,1342177535,339098,1586321408,712805370,-14125825,1996433012,142016266,1577014038,678756100,-14256897,1996486262,-59310088,-362753,1576994422,-610643924,1476395013,-310157729,535137026,214584669,16973831,67041,196615,66837,209672,67815,202388,66805,210616,67755,209756,67761,202338,66846,5615,0,0,0,1167087646,518818645,-326903666,-950642932,63558,738197438,10533119,-1706012007,873,-15992693,-2065104011,-426092800,-1996488704,1451883078,142016508,84309759]},{"sector":9,"data":[1347551254,1348468920,26778,-49920,1996438132,108461832,-1946532213,369491030,-1202695680,-1705992190,265,-24907637,1444508927,-231681,28899958,-1751494656,184549379,-955943744,129094,1962933891,-1298508282,-1006632957,-953746850,1459618311,70042,-125926656,1460040960,72090,-125926656,-1962642432,721611719,-2090901824,-443874579,-900899553,1478361092,-1957345904,-661774612,-955716477,63558,425603,1996439668,26057222,1183383552,-61437446,779403787,100288139,1347551262,100288139,1347551254,1344405688,215962,108461824,179866,108461824,85146,-129579264,1183514625,49120248,1562371467,182861,1167087646,518818645,-326903666,-129579256,2122514432,225705990,-1710852353,65535,33048263,-129594624,-1962742397,1297948645,503317194,1430622296,-1910575989,518816728,-431569066,-1070923775,-1980873079,1183444038,105265660,971572085,108461825,228250,-230258432,200562313,-385649214,1589903652,1200301810,-163149558,343326731,1077993681,-26032,1183383552,1975520252,16443651,-1962385781,-361330377,-1995291509,1150018630,-129595116,-1995029365,1150021702,-96040690,-755969,1996485238,-327745554,-397361109,1183383775,-296318484,1014284811,-1947574645,184586887,1946195079,142016360,-11485141,-1996451169,-1072961978,1996445557,-227082252,-1149185,28896374,-1528279040,142016256,-1705983957,65535,-16222465,1251665014]},{"sector":10,"data":[-16777214,1996425334,39164664,1996423168,-260636920,157338,-92372224,-16026624,1996425334,-25862,1187446784,-352321304,142016303,-231681,1996484214,-159973396,-385736472,1586233178,-1948003864,9174134,199378569,1342600384,16777114,-398000384,-1947050300,958851142,-629732793,16547459,1996425332,-25860,1996423168,-26106,1183514624,-310157594,535137026,80366941,-326413056,-1006441341,-2094658978,963969343,184960651,376768582,-1030962293,-1996484091,1451820614,105286408,-385329525,1589903775,126559750,1174528209,106859270,75465510,736261376,-2065065536,173982721,37716774,2122576245,57933828,-1962853911,1175127622,-385649656,-1014300544,503693964,-1957670400,1443267,45633618,-6664032,-1996488449,-12714426,-994282241,-1960441250,-1960440761,-523170217,1347605201,16777114,173982720,-1635284698,1958742784,-6664131,-1996488449,1451820614,173982728,654198411,1343375241,314069766,-6664192,-1006632705,-1993995682,-953805753,637534727,1539968,1996425333,-25858,1183514624,138808070,887686005,173982975,394231846,-1959496448,96636099,1347551262,369476491,-1202695680,-1705992190,73,1040074377,2020933631,173982800,642826283,1343518719,16777114,-1005917440,-1960441250,1183388231,-25755650,-16222465,79169142,1033523200,-1006632956,19270238,1996428359,105286654,84432523,1347551236,637951684,-523171957,1342178349,32666]},{"sector":11,"data":[173982720,340197670,394231846,-16222976,1939537526,-1006632956,-2094660002,1946158207,-23992061,638213828,1539968,-14284428,-1818619273,-1006632960,-14284194,-1711235401,161,638213828,10401791,44442,173982720,306693926,1994981376,1575324670,1426066114,-326898549,-1000974552,-1960442274,1183384647,50085366,1609106293,-385649150,758973517,-385649407,58065242,1023655913,57999658,1023611113,57999659,-385686295,1589904332,126559750,39291686,-2097151699,1586168026,-754404874,1003039723,995259857,-1957792317,1183386694,-293698578,-385649408,2122383589,1946755830,10610947,-1005816065,-14285218,-14281609,-14282121,-14282633,1996426871,2013210350,2013210124,1468737034,650128136,1376143243,-26032,-1494679552,209125120,16777114,-297367296,58048523,-2130447127,153286270,1183517557,139889414,-352315899,105286409,84432523,1183383578,-229209616,653287108,637695999,637827071,705185674,-1977200412,-1957689017,656835,-6664110,-1996488449,-1072960954,1996450676,161108206,-1996488698,1290403398,209125375,637951684,639137791,639006719,638875647,-15566849,-14225802,-14282633,-14283145,-14283657,-1960441225,-1070921641,105351974,-6664110,-1962934017,1178143814,-385649170,1996424021,-25755666,410010,1958742784,-361300216,464282,-294191360,16777114,53733632,637951684,-788111477,175541219,1183383691,1975520232,52160771,1342994175]},{"sector":12,"data":[147354,51374336,-1962522997,100993110,-1706012160,65535,200558217,-385649216,1996423925,1996443658,49539076,-1962743575,1451951686,394504,-6664110,-352321281,106874071,243239718,-26025,1183383552,1975520226,46131459,931911819,16271047,-1961366784,-472778658,-1912185341,-1960441786,76088903,-16595325,1166932038,971559169,-546113466,-16091393,-1695817098,-1962522997,100993110,-565802752,-991930743,537255518,1200170496,1468605962,-1705815540,65535,198985353,-385649216,-1706032547,65535,200558217,-16091968,-11531658,1323828342,-596181246,170394,37480704,-1962522997,100993110,-1706012160,65535,-54807,1183517814,139889414,1375733765,106873936,108527398,16777114,34334976,-1962117377,1451951686,525576,1589923922,2013210118,-26106,-286720000,106873857,-788034778,-1933376544,-666465854,-2468215,1589906550,2013210328,2013210366,105286652,1375733765,106873936,108527398,16777114,28829952,-1005816065,-14285218,-14285193,-1014298505,168149644,726684160,-1706012480,65535,-1006529303,-1960442274,-472840609,-1962248565,-62486272,58048523,-16679703,-1706029962,65535,-1006538519,-1960442274,-472840609,-1962248565,-62486272,58048523,-16688919,-1706029962,65535,-1006547735,-1960442274,-472840609,-1962248565,-62486272,58048523,-1962855191,-1960442274,-472840097,1183383691,1975520250,18868483,-15960321,-1705968522]},{"sector":13,"data":[65535,-1006563095,-1960442274,-472840609,-1962248565,-62486272,58048523,-1962870551,-1960442274,-472840097,1183383691,1975520250,14936323,-15960321,-1957626762,-14285218,-14283657,-6681993,-385875713,-113442615,-385649407,675151414,-385649406,-96600211,-385649406,-79823454,-385649406,1183514049,-1947981066,-1308718096,-2115513598,-1962918713,39160581,-1982314871,-1039410602,922687605,-1070923516,-6662576,-1996488449,39160069,-1982314871,1183570518,-632943656,1996450164,-629735668,-1948748033,145880646,-1957631789,1451951686,394504,-2014818222,1028188942,58000673,2013156073,52706587,736691061,52772350,115934069,69811710,384369525,-8721921,1963337277,-26941181,1963392829,-46274301,1963532861,-73996029,1963664189,-74520317,1593792489,1575324511,1426066114,-326898549,-1957275902,-13957002,-1958280725,-2082221601,-160104392,1980005945,105286411,-472785013,48955529,-947126485,-443850914,442973,1167087646,518818645,-326903666,-1957275876,1996425846,236382222,199640713,-385649216,-661978765,-2047459445,1946222760,20572419,17333635,-1897331852,1150113536,-96040701,142993488,201082505,1349416128,12186,-398030592,-1947576695,-523167163,99108355,1183383570,-396442392,82331267,653936267,-953809015,583,-2081923445,-1962743738,-1993995194,-330905849,401276928,-2096734524,637666886,1589905291,-398031896,126428674,971785983,-462230410,33179275]},{"sector":14,"data":[1996429893,75537148,-1326907392,-129579264,1996423168,26601702,-2097099031,1946290301,10086659,-1996274547,2105604678,158597149,10913163,-337361271,608537897,1166888990,-1202708964,-1705992190,3146,1038370441,-1099628545,1354771280,178256,66689616,1183514624,-297367046,15746759,205949696,-899447,1996426870,440548,-297366192,1961381910,1975520000,-428409078,721493736,190442432,-15174410,1996426870,-775517212,1996443872,108461832,184569576,-2133166912,1962941821,-461963512,800666,-96040192,1429983787,1997697558,340081413,1183517558,340101626,1459655,-96040192,1157747243,274010382,33048263,-129594624,-310157474,535137026,181030237,-326413056,1443556483,-955746677,64070,-16091393,1996424822,-694528508,-1996488693,-969148858,-2098658443,734432000,1183446598,-163148808,-1962654207,126553182,-1946270071,41911256,-1207599863,48955393,1183432747,1958743036,-27358382,9602955,9733899,1183532404,1003629560,1996688406,990278202,1996687878,209125170,1358953656,-106869,1023447711,594870273,184748705,1963133958,175570916,-16353537,1996424310,-25864,1178271744,721712376,-1207702592,-1956773887,180510181,-326413056,1443032195,-1962647925,-1467187145,-1132265216,1946157228,-1397424375,45521408,2088960000,309657864,11189379,-13405184,-1711232332,1165,2088970475,578093576,1932416,-1258354316,1402601638,-1929379836,1344152644]},{"sector":15,"data":[505169037,570472528,65051216,-1956773888,46292453,-1873273344,-326412987,-2082959842,1448572652,16533191,205949696,1979917629,78113027,1912808509,22145283,1963011389,72280323,2145977206,19545348,725448050,-9406719,1996426870,175570700,-787855733,105251808,755521163,1347551234,-1996184344,2122574406,527827210,-15829249,1996426358,172395274,1174659281,139889414,1375732781,75491408,-2081667447,1979845246,106873872,-1995994330,-1960382906,1183384135,242679792,-15960321,1183648374,-1873799446,-57350130,-1946925431,1038742598,241076996,2139299723,309659650,-1005684993,-14285218,-14286217,-26057,1996423168,209125134,-16091393,1996425334,-1950029050,1451951686,105284360,106873860,67520131,638028582,-1996335221,1451875910,106859488,33965699,-1995994330,1077992006,28482128,-259325952,-15991157,-1070922379,-1006383127,1182991966,-1960443386,-2096789241,1183515335,-2096789030,1187447495,-352321294,-564214769,652101375,92800906,-230228153,970606219,-378342842,-15829249,-784331658,1346388200,1344194187,-739766640,-196703749,202021462,921239552,106874111,33965699,-1995994330,-523119546,-1946663287,-523119546,1077993681,240228944,-259325952,-15991157,2045313909,106874111,67520131,638028582,-1996335221,1451872326,-733574190,-947714679,-230242558,317390848,-2083496252,637718598,92866443,-16595069,1183576646,-230278664,1996482162,209125134,-989890583]},{"sector":16,"data":[1182991966,-1960443386,-96040697,1342179333,878234,-1947170048,1979649022,-15537917,-1980086645,46629637,-2096734524,637797958,-1960441973,1183384151,-900298296,15877831,-1005393152,1183041630,-1960443192,-2096789241,1191117511,-96039950,1005113664,-478678458,-2096734524,637666886,92866443,-1996306557,1586218054,105284358,126559746,-947714679,-1035564798,-15829249,1183517814,-388939526,1342178053,1344194187,-1209528688,-196703750,-1961992565,-966883041,134381443,-739703948,1216316414,-385649408,-6619446,-16776961,1183649398,-1202710846,-1706033151,65535,-3776885,2013210743,-1032388826,734295807,-11513664,1996474998,-96039992,-11478793,2013214327,96701236,1344143420,506611595,710904656,-1708630017,65535,-939624983,46150,12076743,172395264,-1951512951,-991505936,-1960442274,1183446592,239483318,1187448949,-385875532,1586168048,-1995994186,-661934010,17319926,-437714059,407342077,-1951250807,1468737095,-1136228056,-994158967,-1977172898,-467007417,241694502,-2084944247,723630662,1996443840,2136762,1183383552,1975520184,-39130877,165780048,1183383552,-396981786,-1981659511,2122441814,1963532812,309253,112722923,-1975088896,15877831,-1005065472,1182991966,-1960443386,-429997049,48645763,-16283354,1183576646,-230278774,1183572338,139889414,33965699,-340898049,106873879,33965699,-1006138586,1183049310,-1993997594,-230228217,967722635,-512560570]},{"sector":17,"data":[-2082060604,-1961957818,1586216022,-1946645570,-611442958,-234879047,1183522725,-2084401946,-1962744210,1854137926,2122515174,309592244,-15829249,1996426358,-461963346,-371034369,1996487801,1354771378,-4557057,1996482678,-25882,1996423168,209125134,61752971,570800710,1357435136,-1804545,244376182,-1980177944,2122576966,57999544,-244503,1184544886,-16777206,547010678,-385875956,1589967921,1065559558,-385649408,1996487717,209125134,101349119,6809683,1039550089,58064895,-230423,767037046,28856321,1183666176,-68032010,1963070269,-67507965,1963075645,-75765501,1039919337,58000425,1039888617,58000673,1039996137,58000934,1039926505,58001698,1040061673,58002211,-369226519,1600060349,-1962742397,1297948645,1426066122,-326898549,-1000974576,-1960442786,-263812857,1342994175,385369741,27191376,1039550089,58064895,184605417,-1957595712,1207890014,338074115,1586167808,-1976071184,1183318596,1038363378,292814849,1946157629,212316,87898484,-348097536,209125144,1342372536,1342178744,503858317,-401698736,1183446994,-262239242,-1711058946,5293,-1996488264,-1072957882,1183545460,-8983560,-71824266,431509506,-3347712,-4715402,1149980678,-120504312,-339309744,142377918,-15961085,-55047050,79187970,-5707008,479858292,-1996488683,1451883590,1958874110,-60898140,138906150,-148446166,-125104537,-1207142657,-1924136455,-388947643,-1873607088]}],[{"sector":1,"data":[-145692658,-637303,-1013313932,-385875952,-4653197,-1956684033,180510181,-326413056,1460202627,108432214,-956006773,65094,11189379,-2092796672,91448575,-352295752,-1983411454,-523110330,721424901,-1706012215,4026,11175049,292864011,-1980217717,-956259196,6724,33441479,-25263360,-1957596160,-352277884,440699725,-2076457213,-462028636,1935998851,6600709,-947191061,-1946663287,16819332,-1258293178,1183514794,98619896,-919928814,922701905,-6684130,-1996488449,184593028,-1951238976,-2071332794,-1528102748,1600045099,-1034033781,-1957363708,216826860,1187468887,-4,-1578628490,172394756,58048523,-1962883607,55049944,1586182027,-1995994360,-2071201722,1183383724,1958743028,-1948742849,-163133633,1183514624,306461174,1586179702,71797752,-1962518645,-472779170,1362748369,957641986,-1005554431,1183515742,126428918,33310407,-9704704,-890505658,16023171,79172213,-1969598464,-1996488698,-2071333818,451608748,-1946913025,-523169212,67494097,922701824,-6684124,-1996488449,2122576966,779354356,-1946919285,73319487,-15580021,-1993993660,-128021753,-1962653813,1586169431,529212932,-472783919,1367933321,-62470398,1586167808,55574026,1593591435,1575324511,503318722,1430622296,-1910575989,149717976,-62470314,922681344,-1363672536,-6664192,-1996488449,-1072957370,-1930886283,251369984,1586167808,-952661000,590404,151667911,205833984,1153892608]},{"sector":2,"data":[-956298994,4164,184960651,1383336006,34096327,142016256,-1928956161,1344150596,1343226552,690330,-1501263616,-49920,-1957685132,-1202708794,-1706033134,2899,1962938941,-62470395,-1132265471,1962868902,494698523,-15371008,-1711233356,2809,1153895147,-956301048,130118,1001626,-58817792,-1962576896,49018950,-2090942421,-443874579,-900899553,1478361092,-1957345904,-661774612,1460989059,108432214,16271047,-330905856,-167051264,803799925,-1070901759,1347440720,-1679290736,1975520244,18671875,1207885451,-163607805,16820357,15270772,142443265,-10521343,-1711232331,4042,-1980873079,1589964886,-1923655954,-74774411,-234878535,-1956749403,-523170235,-1996484091,-2054425018,1183383722,-40218388,-16777195,1183575158,1347590646,35534591,1522330,-129595136,57982987,-16738583,1369107574,-385875946,-1598553973,1347590400,1216666,-330921728,2037694475,378247760,1183383552,-61437446,1459248836,141921623,163183499,1604710912,138790750,2105540609,2004090909,10913163,-899447,-1070861706,-1706012592,2718,-1913489665,1344145477,1342182072,1342618,1195264,1187448181,-1006632456,1465317982,-1927514739,1152980607,1604710912,-227082402,1350810,-327745792,1460634,-1396866304,158597120,11318783,1448090,-18969856,-1705639089,3526,16285315,1183529588,-1925714964,1344152645,505169293,-1610434480,342202960,1183383552,-49678]},{"sector":3,"data":[1927873396,-327745537,1526682,-327745792,1100698,-18969856,-1058340017,1600045099,-1962742397,1297948645,503317194,1430622296,-1910575989,216826840,1988843095,-1983894774,1183446598,1962281972,362436193,-1996488681,1451882566,1958874106,142016337,-1878624513,-44570610,-15992693,1996439668,-126418950,-624897,-1070861194,-334108592,-1980479863,-1039403434,-1000924044,-14224290,-1960442761,1346914311,101041035,-1873784320,-223025138,-1873295125,-35461106,-947128181,-310157474,535137026,113921373,-1873273344,-326412987,-2082959842,-1957295892,1187448438,184549624,1446802678,1184666,-96040704,201086601,-1003719486,-2094597538,494207295,2040157782,1375731735,540475216,394566146,-259325952,91551243,33048263,1268405760,-2097151982,1946220670,-339309820,-129594621,49120094,1562371467,182861,1167087646,518818645,-1957242738,1448478326,16777114,-11513344,-1711137226,4847,49120094,1562371467,182861,1458342741,242679639,185093771,-1944816439,74892763,-1064382324,-517218005,-201524085,-2388315,1583286878,-1034033781,-1957363700,73305068,-619986037,529206132,151158656,1200292724,1575324426,2818754,94568451,192479233,116129795,175964161,89456643,1,337051907,327681,330236163,393217,369950979,458753,88735747,587726849,252444675,856162305,358416643,1048577,359596291,1114113,361365763,1179649,102039555,303169537]},{"sector":4,"data":[357236995,1245185,123863043,2359551,298582019,378798081,388956419,1310721,121962499,2425087,129761283,2490623,127467523,613810177,278003715,798425089,138412035,2621695,143065091,2687231,134479875,2752767,132120579,2818303,360513539,372047873,220332035,816840705,148308227,3276801,117178371,162791425,95617027,313917441,120061955,146866177,99811331,591527937,36962307,96796673,372637955,4849665,368378115,5308417,68616451,5373953,364904707,5505025,366018819,5636097,293994499,375521281,108724227,166133761,102563843,115867649,233439235,367984641,106168323,141688833,328138755,368443393,0,0,-2081649835,-1957295892,126551134,-1946270071,142082008,16777114,-129595136,-990226807,537262174,1200170496,1468605962,106859276,1183385483,-153580548,1946224711,643810320,306678566,341281574,-336044348,-128007156,-1946388853,1418405444,1200170536,1468605970,-129594604,1593464459,-1034033781,-1957363708,49054700,-1962647925,-28931833,2013255819,-26104,-443875328,180829,1167087646,518818645,-327034738,1448542338,15746759,-230242560,1187446784,-1929379694,1988992638,503780884,-1515905258,-1960860251,1183424070,-1605989454,-1951119735,1177264710,-1236891234,732186251,1183424582,172395448,-1950726519,1183386694,239504316,-1995815381,1183563334,205925136,-1950333303,126557278,-1949415799]},{"sector":5,"data":[126554718,-1949284727,1207357022,74711304,65781803,-1996488264,1586230342,138933968,721712129,-1207702592,1183383553,-193035268,186086400,-1961659200,1988873822,272927696,1947223865,-373282043,1183516022,-1236911682,-739703937,-1069118719,2142783033,29944067,-1716107637,-138522997,1959922681,28895491,-1715976565,-138391925,1959922681,27846915,12484227,-1612119169,2143881985,26798339,-2133827957,1946255231,26011907,25067392,-2081881228,142508289,494207180,537296515,1183520629,-196724228,-208991627,957891723,91494471,-352321096,-1983894782,1183551558,1317771702,-1980106818,1183564358,1317771704,-1980106816,2122564678,376766608,-15567105,-1705918858,525,193873545,-385649216,1996424379,-1099497710,1342177720,140698,-1941534464,58048523,-16711959,1996427894,-998834250,232090,-1975088896,58048523,-2097094935,1946194046,-799110389,-1960425589,166406231,-15567105,-1276604810,-599356931,-2206071,1996427894,-39524212,-1981790583,1996481110,-1971912942,-1979869720,1451877446,-1870756890,-12421888,1996480118,1354771420,-799110320,-14125057,1996433015,-1133051974,-4294913,548978806,13416960,-1070903214,1183535184,3933646,1602965534,-954204374,47686,12338887,105286400,-1995942261,1451872838,-832664620,-1205045249,-1924136957,1343659590,-1157627976,1347616767,378947213,-1773761200,-1705816042,65535,32523975,-1870757120,-16354048,1911066230,-1938358275]},{"sector":6,"data":[-168984,1709738614,-1971912707,202138,-1938358528,16777114,-1870757120,-385649664,1996424091,59828622,966936203,310287942,-1986115957,1183552582,-1639544414,-1986771317,1183556166,-1606010460,1183519358,-1807316576,-1985722741,1183555654,-1538881132,12615299,1183516028,-1962546240,-654852026,-2081012087,2080421502,-1236890875,1183516139,-1982269514,1996487238,1996443666,-25866,1183383552,1975520130,52816131,1343387391,-1979948568,1451879494,-832664594,-1988343925,37615686,1377203456,736917247,-202878784,-767113466,1187446918,-352260396,-125926609,-15108863,1996484214,-18196,114616400,-959297849,-733559040,283836552,66616963,1187449461,-956292910,13423686,-1980348789,1187490886,-956300886,43078,-1984149877,2122559558,108855488,29378187,1183559750,-968455750,-1984018941,2122566214,226295990,-1980086645,1187498054,-352321332,-934885621,1183514624,-867792458,-1949278581,1183394375,642223062,-1993844853,1451878470,-965279766,-3639553,1996474998,-18228,1392508858,-1773761200,-694530026,-956301307,109638,11959939,1183516028,-1962546250,-654854586,-2085992823,2080421502,-1303999739,1183516395,-1236925518,-945404279,44614,12615299,1187450236,-1962934074,1183432774,-1962153014,1183446598,-901331002,1586167808,2122285264,-2147060479,1946255231,112645,-1070923029,-1947056503,2139147870,108331390,25132928,28837236,721611520,-1840870976,15892099,-1073018508]},{"sector":7,"data":[1183516021,-1962677296,1007013446,-666466048,-2082840948,2080424062,-1069118715,1183516139,-1948715072,-1199668240,-1962574848,99334214,-138918261,2093366232,17361155,10897095,-1199668480,-955417600,51270,-1984412021,418106438,12091011,1183516028,-1962546248,-654854074,-943176055,52294,-1947449717,1183444566,-363427352,-15567105,1996487286,32807670,1183383552,1975520128,18868483,1343387391,-1980077592,1451879494,-125926418,1376154882,-339727536,-125926641,-15895295,1996484214,-18196,83159120,-3770625,1996474486,-864616502,-1157627976,1347616767,378947213,-26032,2122514432,108855478,28722827,2122560070,108855480,28853899,1183560774,139889414,-1982708087,2122568790,158597364,-1949409653,1183394375,-832664618,-1205045249,-1924136957,1343659590,-1157627976,1347616767,378947213,-1773761200,-1705816042,1702,-394234113,1996487220,112827008,1726676992,-1947449717,1183444566,-363427352,-1949409653,1468737095,-330921688,-1947314551,1183429702,-1203371064,-1949546871,1451951686,-767129336,-2083236215,1946219646,709331718,-1948891511,2013253214,243756,-1639543472,-4698090,-17665,1183666258,-1924131178,1343657542,48798291,1187446784,-16776720,-1175944586,-2106130439,200090,-263812352,-310157474,535137026,415911261,-1873273344,-326412987,-992440802,-14285218,-14264201,1996445303,2013210122,2013210130,2013210196,209125202,444071718,343408422,376962854]},{"sector":8,"data":[1048051494,1014497062,1347469355,977767206,503331845,1602954832,-2095055040,-443874579,-900899553,1478361096,-1957345904,-661774612,637951684,643332095,727087103,1996443840,2013210122,2013210196,1996443730,2013210124,2013210132,2013210134,2013210174,642797628,87705483,1344143420,1080003366,-310173697,535137026,147475805,-1873273344,-326412987,-2082959842,-1957294356,1187448438,-956301062,64582,-1006564375,-1960441762,1183390791,1200301810,-62520546,653543049,52447115,1183445574,1200301814,-196738258,-1913108855,1343681094,384976525,242679632,-1710459137,2357,58048523,-1006585111,-14284706,-14267273,-1070904713,-14266288,-14268297,-14268809,-1960434569,1174611527,-14266118,28846199,548950016,13416960,-1070903214,1150111824,642784828,-1959108725,536816223,638082756,642545663,642414591,642807807,642676735,640448511,-399607809,1962869221,645201704,-887041,1589965942,2013210120,2013210192,-230257842,138881830,-196703408,172436262,1334519449,1392113454,737560203,-1957629370,1177286726,-14266124,-14270857,1149975671,-1924129232,1344158788,945785638,-14000245,-96010465,638082756,19810187,1589967942,-96040184,709310758,-420936834,112894,49120094,1562371467,707149,1167087646,518818645,1589958798,2013210120,2013210160,2013210162,2013210164,-18378,1392508858,-1705834928,1139,-2097151560,-443874579,-900899553,1478361098,-1957345904]},{"sector":9,"data":[-661774612,-1005917053,-1960442274,1183387719,172395510,653805193,51660683,1183446598,-129594374,-62486208,385238669,-163148464,1392922646,16777114,1958742784,106873941,1484259110,1450704678,-624897,-14284170,-14265225,-1960422793,723916871,1174603847,1996443894,-96040180,1358317099,1342177720,1048051494,1014497062,945785638,506480523,106859344,1148714790,1115160358,1080003366,-310173697,535137026,147475805,-1873273344,-326412987,1457032734,638344900,1586182027,678952710,1445361663,638344843,-1006471169,-14284706,-14264201,-963946889,138881830,207537232,38243110,638082756,1342850859,638344900,721700747,-1960423226,723912263,-1001389497,-14284706,-14270857,1586183287,809995014,1586188318,2013210120,2013210180,1602954818,1579155264,-1962742397,1297948645,1426066122,1465314443,2126782204,209110280,-2096739189,-947707706,-773730016,-2082352671,1963460222,130151955,-1968438411,-792710432,-1430250796,803991522,-1040809805,-1409190649,-779366192,1929793163,487073292,-679228464,-336141824,-151287282,1025517271,-679228464,-1947016704,-1949048118,-1001847730,-1960441730,-947714491,-973602016,-964491146,-1949201632,-1952123960,535880394,-443851169,836189,1475119957,108971260,239438630,139823654,-487066062,-372127605,-2096871797,-1410129721,1575324511,1246914,149422083,17432831,47710210,17236223,110493698,17301759,131072003,494665729,102760450,17367295]},{"sector":10,"data":[97255426,17498367,73990146,17563903,148963330,17694975,104726531,303169537,1376515,1179649,8519939,1245185,103809027,506920961,47513605,17236223,110297093,17301759,102563845,17367295,97058821,17498367,92405763,199491585,73793541,17563903,148766725,17694975,1167087646,518818645,1448597646,-1962117493,-167049602,-1070922635,-561304085,2139299723,192677890,1342383288,97178,1444473600,-16091393,1448544374,16777114,-1070903296,244338768,1577061864,49120095,1562371467,576077,1167087646,518818645,-326903666,-1957275874,-24966026,-1207534334,-655818751,-297351424,-963969024,-523116335,1342181893,16777114,-431585024,91602955,-1192640469,-430011648,-1962719234,-163149561,-1996486139,1183572550,274107150,-1981266295,1589963350,126559758,-506343797,-654057007,-62441178,1586173557,1200301582,-774993150,65130977,1194927833,1308718590,669777707,-2081923388,637724742,1586169739,-498695198,-1962440446,1183049822,-1960443160,-497120505,48383619,994510729,-1948943106,1175127622,-15633144,1183519350,656886,-1705619426,65535,-1980342645,309788471,175570771,-16222465,-6683018,-1996488449,1586228806,55574246,-26029,1183514624,-2090901778,-443874579,-900899553,1478361102,-1957345904,-661774612,242649942,74839563,971751467,529260171,134381443,414714748,-694530044,-352321535,1996445220,175570700,-16222465,1183516278]},{"sector":11,"data":[205925128,105286480,1342850603,1347469355,128154,-310157824,535137026,181030237,-1873273344,-326412987,1457032734,185759371,721712630,-1959662656,-2095084578,2080899711,102545419,36280912,485163008,276234070,-15829249,1996426358,142016266,721843967,-1706012480,65535,49120094,1562371467,969293,1167087646,518818645,-1957242738,-167045514,-1070922635,-561301525,2139299723,192677890,1342708408,164506,-1205671168,1448083457,-15436033,1996427894,242679568,-15960321,1996425846,108461832,173466,-310157824,535137026,315247965,-1873273344,-326412987,1457032734,186021515,721712630,-1959334976,-2095084578,2080899711,135772171,-26032,569049088,1448132651,-15436033,1996427894,242679568,-15960321,1996425846,108461832,16777114,-310157824,535137026,315247965,16973832,65858,196615,65820,209672,16711987,196898,16712269,196914,16712097,196915,65593,208935,65577,210616,65665,5622,0,0,1167087646,518818645,-326903666,-1957275900,2089487990,142443308,-1960479458,1161366598,-1961001204,1161366086,-1961525490,1161365574,-1962050032,1161365062,-1207599598,65732610,1577058744,49120095,1562371467,707149,1167087646,518818645,-326903666,106859276,1183385483,-1948742666,529208415,-1962260597,1183386711,-94991880,-1202667477,1380974593,-1694992641,65535,200558217,721712576]},{"sector":12,"data":[-14160960,1996424822,11967220,1183383552,1975520252,-193528054,244634,-2036992,1996424822,-25860,-310181888,535137026,46812509,-1873273344,-326412987,1473809950,242649942,-15958389,1962879092,1996445478,175570694,-1962379521,1344155204,506479755,1011125584,-1070903266,1552633936,476053290,-310157474,535137026,181030237,-1873273344,-326412987,-2082959842,1448558828,185497227,721778166,86436288,529260171,134381443,465046652,-6664188,-385875713,1183515920,205928712,1183516788,172374278,28837493,83552512,13649607,-1001994496,1187446784,-956301072,52294,1183432747,-330921490,1123567303,4372480,-26032,1183383552,1958743000,-19362914,126550855,-1996487675,436586566,-901347072,126606987,-1948367223,138933976,1443263520,16777114,-933328128,-1995684213,172395271,-1962784887,1200162886,105286404,1443252105,1344193419,1342177976,16777114,-933328128,1183385483,71776706,1200292733,205949188,-1949802869,1194967622,-1962705916,1183384647,-933328120,956712843,92209735,-352172149,-933328122,-1996077173,1586170438,105352136,2114078521,38243077,1586169579,105352136,-1962522999,1603001950,-1995994356,1586226246,308251614,1183385483,-1948742702,1183385671,343514,-1070920331,-1982577015,1183440966,-1959007282,-1081876898,2113994880,-2138600698,-1207702784,1183383553,146912,1187448189,-1962933776,-1081876898,2113994882,-2105046266,-1207702784,1183383553]},{"sector":13,"data":[-834222124,1586167809,341806046,1183385483,-1948742666,1183385671,81402,1187448693,-352321292,-196688094,1586167809,41911268,-2095811328,1963129470,-1001994482,1586167809,239569910,-1948105079,-120463290,-1962129879,-783753146,138805752,-774617461,172370424,1221871243,1174534353,-562626810,-15960321,1996425846,108461832,-202895728,-867825156,49432263,-193035520,-2147191808,-2088701362,1946209918,-528579814,-2147189247,-2096041394,1946540670,-629243126,-2147191808,-1960775090,1200350302,-230284512,1978811963,-867764675,-1959300094,1183565918,-1962440436,1200163398,138840834,-1962653815,1200162374,63347206,1996423168,440542,-934900912,45633566,244338688,-369279256,2122515115,896794820,-401698730,1183448250,1975520236,-800667896,-1696006144,-461963518,-1696434433,65535,200165001,-16091712,-6624138,-352321281,-867270436,-26048,2122514432,57999604,-1962873111,1207362654,1651769638,-2082578805,1946238591,-998341799,-162302720,1946340422,205949773,-1981790717,1183574598,-532272376,-1947842935,1174604358,-398030380,721831563,1183437894,-431584292,2095728185,10610947,970737291,58517574,1392547561,-1411329,1996482678,244338918,-385631768,1586167939,205949896,-1981790717,138840839,-1981790677,126550599,2114078521,176065334,-338395645,-562626780,214713995,1183535112,-1202708792,1464860674,516572811,-294191280,-1863551233,82110478,105286471,1003767339,-2083356729]},{"sector":14,"data":[1946207358,1996445228,79010540,1183383552,-562626564,-1192331521,-1706033151,65535,-59310250,39578,-327745792,43418,-830569728,-385649408,2122514795,1366556912,-1949802869,126422086,-1995815285,1183515207,1200179208,172395268,-1962522743,1200161863,105286408,172460360,-1995684213,1200294983,239569162,-1995684213,1183518791,306678026,516131670,374864,-26032,350814208,-933328127,-1995684213,-532282617,-1950202231,1178142790,-1962573886,65782342,-1962391925,1200212062,138840834,-1981790677,1183563846,-1069139700,1183516030,-1962677312,1586170950,71797192,-1995946357,2123040327,-729939190,1996432107,-867791906,-1957690356,1344194630,1342178488,-901346473,-1070903266,244338768,1191433704,721831563,-952380346,1586222207,105352136,-1962784887,-1991768506,1183564358,-733609206,-1950333303,1178190406,-1962573888,65781830,-1983756661,2123093574,-14488822,1183571574,1342442700,516441739,178256,1183536976,726671050,-1873784640,58255374,-696370873,1183570303,-733598970,-1950202231,1178195526,-1962705726,-125058490,1996432107,-867791906,-1957690356,1344194630,1342177976,-901346473,-1070903266,244338768,1191393768,2131131961,-25895,1187446784,-1962933808,1342101598,-6663421,-1962934017,1600049222,-1962742397,1297948645,1426066122,-326898549,-1957275886,2123042934,172264206,201213577,721778112,24439232,956581515,-209777084,2115126329,-196687890,1150091264,-62486252]},{"sector":15,"data":[-113013,-1072955826,1586177396,-62487556,-1995994366,1586228806,-62487556,71731970,-1082194119,-2080612725,956496966,-999719417,1182992990,-1960443382,-96040697,-2096472437,637667910,1183385483,-60912654,50087555,1183385483,-60912648,50087555,1183385483,1979649008,15853827,15629955,-387382411,-129594624,2113029689,173982762,34227843,-1995994330,1586231878,172393226,126559746,-2081274231,-907345169,-772913525,-62520864,-1946198551,1178204742,-1960935952,1183054942,126550780,-1946663287,1183054942,126550780,-2081405303,-352129426,-129594472,2130331193,-96040187,1183515627,106874104,33965699,-1962440410,1178202182,-1962573838,65794630,-990886261,1182991966,-1993997818,-196705529,-230257918,-1946794359,1178202182,-1004699662,1182992990,-1960443382,-96040697,-2096472437,637667910,1183385483,49251318,972048011,477950534,-2080612725,-1962738618,-129595129,-2080612725,-1962738618,-263812857,49180291,-1980348789,149549638,-196703233,-443850914,967261,1167087646,518818645,-1957242738,1962872438,645201704,-15960321,-1070921098,1347440720,721962635,-1957688250,1177224774,1552633866,-773598916,1287127011,1253572354,809798402,1150111774,-1957683652,536816220,49120094,1562371467,707149,1167087646,518818645,1448597646,-1961986421,1465257086,-1962248449,-953481146,105286480,1342850603,1347469355,-6662576,-1962934017,-773598760,1287127011,1253572354,-26110,1599995904]},{"sector":16,"data":[-1962742397,1297948645,1426066122,-326898549,-1957275890,45679734,-1715041536,-259261961,16271047,-369153280,1589903514,-775451898,65065440,1200301784,-62486270,-1962516853,-773729841,651756513,1317605259,2126593022,-125926542,-1961986816,-472778658,1577313233,-339637498,-129594553,-523116335,-1962523133,36505686,-196704000,-990488951,-1960381346,-230258425,972834443,931000902,972965515,142406214,654067339,669714313,-772252021,65262051,1183712862,-28931320,-1962440410,1191180382,-773598728,106824675,654067339,1191331721,58588731,-1946198039,-523110330,-443850914,442973,1167087646,518818645,-326903666,-1957275884,2123044982,343342864,1460827903,-1946217240,373749752,376701184,-16222465,1996424822,309788436,242679639,-385793816,1150091568,-297367236,-152019316,1946424902,-295779312,38243110,653674121,33703879,373749248,-1959365631,1451952710,-129595124,-990226807,-953747362,-1962934265,-1993994682,1962869319,1996445484,309788436,67486603,-11513344,1592266358,-336032772,306613022,756307595,1183383556,-94991880,653811396,1991,638469771,-2097002615,58655231,-167731223,1950357062,373749324,-1958317048,1183448644,1996443884,175348230,1183383552,1996445436,-92864760,-1913096449,731447877,1358483906,-2146023690,-4717196,-1207702529,-1706033151,65535,-1280257,-1701118858,-352321532,678756173,-1205439233,-1924136956,731447877,1358483906,-362753]},{"sector":17,"data":[1190590582,125043734,-1943124853,721677274,1347590592,68568822,-1070922380,-1962546279,-628346812,1996443730,-294191120,1347469355,-14001013,1190534239,175375382,-1947312444,-1993935290,1599996487,-1962742397,1297948645,1426068682,-326898549,1187468808,-1006632450,-2094658466,326434879,16777114,207537152,185043238,721712576,-950080576,64582,1183534315,65065468,1451952198,-129595126,-990226807,-1960440738,1589925431,939468536,637826815,-1962772481,1346372678,803737232,1975520000,1201296917,-1006632954,-953807778,-956301305,65094,1182993643,1183515388,-62506746,1183558780,-443851010,836189,1167087646,518818645,-326903666,-129579256,2122514432,74776590,1860943915,957105803,1719535686,956974731,1585317446,1342994175,-16222465,-6683018,-1996488449,-1072956346,-107330188,-1996488694,-1072956858,-11521676,1996426870,178428,199268944,-1073020928,1996428660,-92864754,-1191545089,-1706033147,65535,-506231,-207947146,-16777205,1201339510,-1962934261,-310118330,535137026,181030237,196627,68519,16989311,68587,196615,66001,209672,67722,205576,68554,211596,66749,201234,65961,203282,16712986,196899,65668,198804,67126,202388,16712620,196910,16712876,196911,16714344,196913,67703,208932,68158,201398,65847,210616,66414,202338]}],[{"sector":1,"data":[68531,212067,65914,5622,1167087646,518818645,-327034738,1448542392,722486923,1178276934,-1961724660,1177226822,172374802,1187448693,-352321146,-2042181883,1183514624,340146448,1183516788,306592014,28837493,186116352,818819,1191117685,176063244,-16550656,1187449414,-956301180,52806,12207815,1619445504,-956301057,34886,-9271609,-1070923776,-129594983,-1980082551,1451873862,-230242344,1186463814,-744861696,-1996488701,201291910,-385649216,-661976390,-1962719234,1686538503,1050111,98715273,-2037841906,1183580006,138808070,1183524724,139889414,-1980217719,1183447638,-665417258,25708231,1938718720,-1070923265,-1986902391,65647686,375294721,1173766027,108273672,-26029,1569390592,-1995994356,1569439814,-1995994350,-661939642,-1995946101,87924806,722367744,-1840870976,-1984674167,-335579514,-2135063754,108921088,8422795,28836843,-1270445824,1962934589,-834222331,-1115488255,2113994882,-2105177338,-1207702784,1183383553,1988544402,-1962933761,126555229,-1947187575,138906584,1039550089,125108225,14698183,-953947392,122950,-2084544885,1962934911,-159481067,-955288318,33513606,-262239488,-1995552885,-1635008954,1183580004,-1962440428,1200165446,273058562,-1962653815,1200164422,205949702,-1995160061,1183516743,306578186,-16103543,-1014294922,62410782,-6664192,-1962934017,-1946196834,120260679,-1962129783,1194003015,172394754,818819]},{"sector":2,"data":[1183516541,-338102516,205949699,-2096347511,2097154686,172395271,65788151,-1995815285,2122517062,678690952,957367947,159257670,-1995147637,1988695110,239504144,2131904057,10283267,-1995278709,1988694598,9496846,-10183029,-2037839989,1194983240,-1962705660,-930413497,-1716238709,-120470997,1317652523,1688111892,1216777215,71776767,1200292732,-1949791484,-1723288506,-120470997,1317652483,1688111888,105352191,2130855737,38243077,-1635055637,1200357220,-1949791482,731484742,737726914,307136968,-10183029,956712843,92144199,-352172149,1688111879,105352191,1183565963,731465874,66638274,240028104,28591755,1183517766,172360082,8945283,-11069835,1996428406,276234002,-1710328065,65535,-9271799,8945283,-1779891340,-2038529280,-385649408,-2030698356,1963130738,8579331,150226631,-528579840,-2147191808,-2088700850,16742078,2122521204,75366836,284446336,94404227,2122517108,74711200,552881792,8814211,1586187380,474450880,1005864483,1047917638,-10183029,-1995159925,306612999,-1962784887,1200164934,239504132,-1710864503,65535,505943,1686539088,-1202708737,-1706033150,65535,16777114,-1169766656,2122514433,57934010,-2096649239,16742078,2122545012,1903427790,-2037792725,1183448944,-1136227888,-10320247,722355851,731451974,1090048450,2055637312,-754601473,-6663968,-1996488449,-1072980922,1860764533,-19363065,126550855,-8616311,-8747381]},{"sector":3,"data":[-523116335,-12024183,-8616445,-1949153655,67061894,1183437382,1216777192,-398064641,-1953872247,67061894,1183418950,273058772,-1995160021,-1946204026,-2043081658,125697864,-12024181,-1962129783,1177226822,1216776466,172395519,-12024263,-2037708931,1183448904,273058570,722748971,-2037838778,1183580014,306588430,-1995815381,-1946198906,1174606918,273058060,51529355,1183386182,273058574,1075070507,-775804007,-465139208,722355851,-1723854266,-120470997,-1948498295,1177281606,-1740207692,735856267,1183420998,340167552,-1981528573,1183439430,-1236891242,722486923,1183441990,1954974154,2122746367,1623098367,1685324031,-1709803777,65535,-1980217719,-1072966074,1187448949,-385875836,1996424801,-1099497536,332186,-666466048,175489035,-1697220865,1312,1996479723,-1099497536,16777114,-96040704,393592843,-1694992641,65535,-663290025,1342177720,16777114,-2135692544,1090482830,226458,-1983894784,1183425606,-1572434526,1771720726,-1962934267,1385815110,1347590480,365722,-1471772416,-1918216567,1343662150,369818,-1923656192,1989001854,503781032,-1515905258,1583292325,381830797,96574032,1183514624,1347590628,-1706012007,1531,-1987295607,1183682134,-1706027380,1517,2123192150,-1938387538,371066646,-1515870945,-1923195105,1343663686,405146,-1941533440,1996443670,-1938358386,-774093173,-1706014496,1666,-2037792725,-2037776564,-2037514422,1343684426,396954]},{"sector":4,"data":[-2142860544,-1722789223,1016746066,-1996488698,-1979756410,-1912647018,385831046,105683536,1465253888,-9912691,-11487603,371066646,-1515870945,-1923195105,385837190,107715152,1183514624,1347590552,-1706012007,65535,-1981135223,1183706198,-1706027286,65535,-1098033322,1989017430,503781098,-1515905258,1583292325,-11106675,-6664170,-1929379585,1343679046,-1280257,1183574646,1222693248,-26032,1183514624,-565802602,-8485237,734807689,58780150,379733645,-1941533360,-1298509802,-1929379834,1343654982,380520077,116693584,636157952,379733645,-1471771312,-761638890,-1929379834,1343662150,381830797,118987344,1325334528,1955004342,-1501658113,970292224,1367315062,-11893107,1183666198,-1706027286,1796,384452237,1451658576,-1706027265,65535,-2037569301,1343684426,-11499891,681201686,-1929379833,385831046,1753648464,-1706027265,65535,-2470145,-1098659258,2080440142,-1773761583,2128234041,-632911091,-1953085815,-2037790138,1183580030,-1983511790,-1946198394,-2046620090,-970195108,-2109306552,8945283,1586187380,-1236890654,-2037708919,-2046558348,1200226158,-2037688574,135069554,516131664,178256,1589051216,1720093695,-11526401,1996478582,-25898,-1957232640,218067590,1183535240,-1202708766,-380633086,2122514994,1819541728,966149771,2130673286,-497120413,-2037708919,-2046558338,1200226158,-2037688574,135069554,516131664,178256,1589051216,1720093695,-11526401]},{"sector":5,"data":[1996478582,136616662,-2037710848,1178206046,1462072450,-9271669,-1957656564,1344201286,1342177976,-1954384129,520054406,-92864688,-1694992641,2507,-1948098933,126465606,966149771,2130673286,38242592,-8485237,-9533949,-1962653815,67073158,-1979748730,1187448391,-352320364,-497120493,-9140597,-9533949,-956151927,169030,-8995197,-385649408,2122514822,57999566,-2097075223,1946326142,10610947,-1948098933,1654557447,-773598721,2090730467,-1962440193,-40290,-771792250,65262051,-1946190690,-1979752826,1586168391,38243298,-1134654648,-472783919,-1982702077,-1134654713,-776190209,65262051,-2037656994,1200226142,-497120510,1586169739,-773598768,-396491805,1586169737,-800653360,-472783919,-1947705853,1200194118,-497120510,1208108939,-9396597,-472783919,-1987420669,1889438471,1887895551,-773598721,-1973550109,-1987950965,-739704249,-497120512,1208108939,-10314101,-472783919,-8610301,-1635055735,-2030043294,-472776862,-1643912239,-2037645444,1200226142,-497120510,-1962653813,-472794018,1577313233,-1962440238,1191165022,-773598788,-765590557,-10582389,-1962784887,1200349790,1586186242,-773598768,-396491805,1586169737,-800653360,-472783919,-1947705853,1200194118,-497120510,-385595509,-1957167270,218067590,1183535108,-11526430,-1224764298,-2037645474,1344208742,-2590977,-124070282,-1962934263,973037190,611615302,1921420119,1342442751,518145675,-1804140720,-1954384129,520054406]},{"sector":6,"data":[-92864688,-1694992641,2653,-1986640245,-2037653946,1183448958,-1236890676,-1953085815,-1979747194,1191149190,2128377401,-59184893,-1948098933,126475846,63719051,-1979748730,2122515015,796131552,-10570101,-1957223445,218067590,1183535112,-1202708766,1448083458,-10058101,1996443678,-696844328,736154,1983464960,-2083029118,16736446,1996438388,-696844522,695706,-62486272,-663290025,1342177720,692890,1996445440,-18182,86874704,1996423168,-59310314,16777114,-696844544,328858,1992196864,57999615,-2097114391,1946209918,2092367674,-763953153,-1542401,-1224766858,1996488546,10283220,-10320247,-1961462017,1344197702,-10307841,16777114,-1671525632,1392726014,743578,-1957500160,1183572574,-1962440266,1200217670,-867792126,-9533949,-1962653815,67073158,-1979748730,-1232402873,602668894,1921420119,1342442751,518145675,309328,-2037688752,1344208742,-2590977,-1634019722,1174405127,2139256377,59611863,1187446784,-1962933884,-16811874,-1705835697,65535,1585727115,49120095,1562371467,1231437,-2081649835,1448542956,-1962510709,1586168958,-1995994356,38243077,-947658869,38242564,16664263,-1961235712,126553694,1182991753,1200292878,-2082501886,1200161991,-28901630,2097051193,-775517214,769708512,1174470660,-28915958,434831360,-1962254709,-2096789241,-1962669458,-544538041,-1996175485,1191117383,-25806338,1187504764,-352321282,140413721,92866443]},{"sector":7,"data":[67651203,-1962784885,80184287,-16627831,1983512134,-1948091138,-773795386,273888,-955496959,65094,1586174443,-1995994356,208569093,38243076,-947658869,38242564,972965631,-495124874,-523123061,1581310161,1575324511,1379522,183304451,458753,30605315,856162305,16121859,437387265,178585603,303169537,182517763,19071231,189136899,378798081,89718787,1041760257,83165187,19792127,176488451,19857663,111345667,396361729,59244547,20185343,49283075,20250879,133562371,20316415,81264643,20709631,175439875,313917441,88801283,391053313,92667907,399507457,87621635,375521281,113442819,393216001,98041859,401801217,9633795,368443393,-2081649835,1448542956,-16222581,-963966346,95965214,-6664192,-1962934017,71579908,-125105539,-1996209013,75270404,-1727641973,-120470997,1183515689,731465734,33083842,1149961284,38025478,2089486718,38045954,-1962509175,731448390,704172482,1183515204,731465732,33083842,1599997508,-1034033781,-1957363704,49054700,105286486,1963607609,138840850,2097956409,-2147371003,-4710421,-1961170049,1177226310,1183535112,172370692,172395344,1342588459,65434,-28931840,818819,-4712834,205925247,1983508619,-1962573826,300678726,233555595,729809336,-259322810,2147382841,205915114,1593722505,-1034033781,-1957363702,49054700,209125206,722093707,-1957689274,1177224262,-6664186]},{"sector":8,"data":[-1962934017,-2147467792,189137269,-1962508810,-1948715066,-97808,-1962639493,-1207702586,1174633471,-443851250,836189,-1947432107,731448902,33083842,1183518278,731465734,1090048450,-1962260951,731448390,33083842,1183517766,731465732,1090048450,-1962392023,1178143302,-1962380274,1178142790,-1207601908,48955393,-443826133,836189,-2081649835,1448545516,-1962248565,1183516798,-1037330170,1183447249,440795638,373696832,-1727773045,-120470997,32786057,692066374,1183519814,407255316,-2081881228,273058560,1947747897,309758214,-1961853303,1178143814,-1996065768,2122911350,239504140,2131904057,306612997,1183515627,440810254,1183516029,-1961825510,1178144326,-1962574062,65737286,-1995553141,1183578182,-96040680,957236875,92148294,-351123829,239504131,2081834555,373721861,1183518955,306592014,1183516030,-1962677486,-1992290746,1183579206,8448276,957499019,108272198,-1995278711,1183518846,440809742,1988691572,209619214,-1994766709,1183578182,273037580,1183516031,-1962677488,1178274886,-1962574568,283842630,957105803,92213318,-351254901,205949699,-1946532215,1183389254,205949948,2114995769,273058565,1183515627,340146956,1183516028,-1961825516,1178143814,-1962574320,65736774,1074546315,-113015,1183652982,-1202710792,-1706033150,65535,-443850914,1753693,-2081649835,1448545516,637951684,819075,-14285188,132845127,637951684,-1005694977,-1960442274,-523170233]},{"sector":9,"data":[1174659281,656644,100550281,1183383556,-1948742662,-27358409,1183385483,-1947194380,2139880030,-27358462,-1962770645,-2094660002,2080377983,-94467307,-1962784885,-1993996706,1183519815,126428916,1586177259,38243326,637951684,-1961605239,126614110,637951627,-963967095,-259270409,-654850165,1589966987,2139694598,1204233736,184549382,-1961724673,-550458,38242598,-140917109,1468606207,-1956684284,113401317,-326413056,637820612,637683595,-1960442111,19268679,-1073019321,-1960438916,958793799,595330631,105326886,-351797466,73319450,138906406,992401655,192677447,138906406,105316646,-1961885914,79846885,-1873273344,-326412987,-2116514274,1459667692,273058646,1947485753,239504136,1964131897,112646,-955610903,36422,-1098252501,-1070858406,-163149415,-1980213623,1451870278,375294922,1187461003,-1207916814,-1706032986,65535,194791049,-385649216,-661976498,-1962719234,1753647367,1836543,-9795959,-1996478459,100625542,1183383556,263558,98846345,1183383600,138737346,-16223200,-6678922,-1962934017,126553180,-1950726519,126554716,-1952561527,138906584,1033389705,175439877,1183432747,-1270445680,-1132254485,2113994880,-2138797306,-1207702784,1183383553,-2101574732,108921088,8553611,28836843,-1874425600,1101697,-1961599861,-62486265,1200347275,-196703992,1946157373,550469921,-1168209152,163715,37557365,-955288320,33512070,-60912896,-1995552885]},{"sector":10,"data":[-1635010490,1183580008,-1962440428,1200165446,273058562,-1962653815,1200164422,205949702,-1962391671,1200163398,138840842,-1962129527,1200162374,178190,-1957670247,-1952903098,340167624,60414603,768807873,-628948991,-1706012160,1406,-9920885,-1206892663,1385758722,239504208,-1949791335,-628420026,331416473,77267,1375787651,-26032,-1635057664,1200226152,376897298,-1267269805,-393185537,-1634993558,126615400,-1961605495,1183384135,71797522,-1961867639,1183385159,138906382,-1962129783,1183386183,206015242,-1962391927,1183387207,273124102,-1948498295,1183388231,1996445394,309788436,-15698177,-6680970,184549631,-532232200,-940113918,175374368,1605251,1317012596,-940080928,443809808,28606083,1317012606,2122518752,175375768,9993859,1317012596,1586176224,474450874,1004553763,997580870,182263,-1635043980,1204289384,-956301296,4679,463514,2122536448,91488280,-352315464,243715,1753647952,-1202708737,-1706033147,65535,-16247831,1996428406,276234002,-15829249,1996469366,-89069424,812957707,-15304961,1996428406,276234002,-15829249,1996426358,142016266,-16353537,1996479606,-1267269678,-393185537,1183447762,131393934,-10830205,-10849280,-6678922,-1996488449,1183446598,1975520200,129558787,-4557057,-258295690,-1996488698,-1072969146,1996426101,-25912,-1679228928,-1166606585,-1699186945,65535,200820361,1444050368,-1194690817]},{"sector":11,"data":[-1706033151,65535,-336169217,1087341012,-26112,1183514624,172374482,1183522686,205925340,-1982052861,1183517766,172370898,-1982708221,1187449414,-352321322,-700004603,1183514625,105265618,1183522686,138816476,-1982052861,1183516742,105262034,-1982708221,1187448390,-352321332,-867776763,1996423169,175570700,-2328833,1996477046,-118298606,-10582391,-16222465,1996424822,-763953188,-401443073,1183447260,-696844308,-3377409,1358913206,-1996031512,1996461638,-1871249484,971785867,2147442310,1585875718,-1962677249,-11473850,1996479606,309788626,-1980164120,-40826,1996469366,-330921072,-10582471,-2037709186,65797982,1357661835,-2328833,1996477046,-118560750,-1947318647,130531934,-2037710844,1200226142,172460310,-1995290997,1200165959,407341324,-1982052725,1183518279,273123794,-1981004149,-1957490105,1344201798,383010445,178256,-26032,1183514624,340142864,-1037330112,1183447249,239504346,1074939435,-775804007,-800683528,735725195,1183429702,-800683116,-1987033557,1183547462,-632945900,-1982970231,1183420998,273058742,-1982183893,-2037791674,-2037776518,-1070858370,-1985722743,1183687238,-1706027358,2234,-1714403701,1385779282,149264976,1183383552,-1437169240,380126861,150313552,1465253888,-1917026675,118925430,-1524689378,1595909541,-1136226978,312102934,-1962934263,1385814598,1347590480,609434,-2008643328,-1920313719,1343653958,605850,-1923656192,1988996734]},{"sector":12,"data":[503781000,-1515905258,1583292325,380520077,159357520,1183645696,-11528568,1996458614,-800683128,1346953425,643994,-1983894784,-1979757946,-1912649594,385828998,157260368,1183514624,1347590528,-1706012007,2445,-11630967,-11495799,-11630963,-1650831338,1442840585,1891536215,1320586751,503781119,-1515905258,1583292325,-9402739,-1130737642,-1962934263,1385796678,1347590480,16777114,-431585024,-1914153335,1343678022,16777114,-1923656192,-1912646466,118941302,-1524689378,1595909541,1418104158,-1706027265,65535,384190093,-394854576,-1947830529,-523141050,-6664120,-956301057,55366,-1929097495,1343660614,378029709,167352912,1183645696,-1924131192,1343663686,671386,-1926894848,1343660614,380126861,169450064,1183645696,-1924131160,1343667270,680346,-1236336896,-8747265,10911363,1183569276,-666486384,-2037558916,1343684424,384190093,172923472,1183645696,-1924131098,385832070,-26032,686489600,-12024179,-2037559274,1343684430,684698,1317440768,-1924131073,385839238,-26032,1325334528,-1001979954,-11747709,-1949205504,1178178118,-1962049842,1183436358,-1002009710,-8485239,1085687435,-12155255,965887627,2130658950,1183222534,-1962677249,1183420998,2055637906,-2037823233,-2037645500,-2043019394,75366212,-12286325,-8485239,51529355,-2037786554,1183579996,-666490098,-2109306552,12994247,-465138944,-946190711,16737414,-1958089984,-2037671330,1194983260]},{"sector":13,"data":[959807248,813568583,-1014297877,1996443678,-138090302,-1952817525,973036678,-360836025,1586169739,-968425530,-1643912239,126484332,513427083,-127801264,412763779,-10189057,970213003,2097112198,1822329774,-1995994113,973031046,343736903,-1996339317,-1946192250,-1979758970,-2037710265,126484342,-1948498293,738159774,1174602311,-2040624164,-1635055735,126615404,-12155255,-1954128245,-2043945914,1174667078,38242780,-10451317,-775804007,-2075751944,-10451317,178585,1443101175,2090240388,-297366529,-775804007,2022083064,-297366529,66713497,-1979746154,-1946196330,-13794234,1149667711,1183201791,-1962508545,-335591802,1149668100,-2075776001,-9009527,729808824,-1979745146,973030022,2147436166,1183222534,-1962611713,67060358,-1979745146,-1946197370,771717254,-2037809153,-1634992320,1194983276,-1962574334,82510407,-12548469,-8878549,-1192212855,-2043969537,-2037776538,-1634992322,1194983276,-1962574078,82510407,-12679541,-10058237,-2082584951,2097451134,-800683186,-666485944,1183532405,1988508124,957709823,2130666118,1652984582,-1962677249,-2037785530,132906850,-1982052725,-1946192250,1178197062,957513438,92139590,-336574837,-599356669,-336574839,-599356666,1457407625,-6916353,-1224796042,-1224736932,-1224736906,1996488546,-562626576,-4819201,-1224764810,-1224736898,-2037645446,1344208746,-898171049,-389515521,1183384100,-2109305962,-10713543,669582197,-2040624383,-2037839989,-2037645498]},{"sector":14,"data":[-13762696,1149667711,1183201791,-1962508545,-335591802,1149668100,2022059007,1988528639,2147465471,-10058197,-12417399,-12155335,-2037709185,82575174,-12417397,-10058237,-10320247,763643531,-2037809153,1586233152,38222214,1200293246,-1962611966,738148486,1183417414,2147465456,-8616405,-12679543,965107339,92209735,-352172149,1049004804,2089157631,-565802497,76578435,1183535485,1552296834,146943,1183532415,1988508124,957709823,2130666118,1652984582,-1962677249,-2037785530,132906850,-1982052725,-1946192250,1178197062,957513438,92139590,-336574837,-599356669,-336574839,-599356666,1457407625,-6916353,1996429430,1991704450,1656160255,-260636673,-2197761,1996469878,2125922194,2058813439,1787202559,-1957683457,1350569159,-493825,-236390794,-1773762304,-1984543093,-2037673402,-2037776518,1191182206,-800683048,2111325753,-72881917,-10830205,-12880896,1996428918,242129608,1183383552,1996445434,112842,241408592,-11141120,-4654986,77222143,-16777209,1996428918,-25862,1996423168,115514056,-6684672,-956301057,101958,-23306613,-1705835697,65535,1586382475,49120095,1562371467,1362509,-2081649835,1448542956,-1962248565,1178141766,-1207599610,48955393,-125059029,578090507,556675,-16052620,146277748,-1204557056,787152903,91553547,-352317768,309285,2122522859,242483208,91553547,-352318536,112657,-16053013,45614452,-1207702784]},{"sector":15,"data":[1599995917,-1034033781,-1957363704,183272428,611748694,119701123,-11126914,1996431990,511115040,-14911745,1996429942,376897304,-15436033,1996427894,242679568,-15960321,1996425846,108461832,-402360577,1776878963,2144261,70556240,1183383552,1975520250,-373282043,1586169172,55049978,67438475,-62486272,621299339,1183383568,138841078,-1996480475,1183579718,81186,37559156,-385649408,71106964,-385649408,121438701,-385649408,1877541707,545161985,-1956744192,1178147398,-1962574314,65738310,991577739,92082758,-351123829,440830736,2115388985,373721861,1183515627,-60912870,1183516553,38242576,16678531,-1957289100,135006278,516131664,178256,511115088,-15960321,1996425846,74907398,1088154,545161984,-385649408,1183514760,407255324,1183516030,-1962677480,1178278982,-1962574572,283841606,958154379,92149830,-350730613,474385155,-1979949429,440830727,2115388985,373721861,1183515627,273038106,1183516028,-1961825520,1178147398,-1962574314,65738310,-1961212277,1200225374,-159481086,1445164032,201868939,-1014280188,45633566,1996443648,209125150,-16091393,1996424822,286562820,1183514624,340146456,1183516030,-1962677484,1178277958,-1961722340,1178146886,-1962574316,149623878,-350730613,474385155,-1979949429,306612999,-1962784887,1178146886,-1962574320,65736774,-1961343349,1200225374,239504132,-2096740471,1946220158,1183536675,1342442504,1344193419]},{"sector":16,"data":[1342178488,-14780673,1996426358,108461834,-1710983425,4480,-17146229,-1705835697,3724,-383629685,2122515344,1416888352,957892235,92148294,-351123829,407276291,-1979949429,440830727,2131772985,273058565,1183515627,-60912870,-2097002615,1946220158,1183536675,1342442504,1344193419,1342177976,-14780673,1996426358,108461834,-1710983425,4590,136464071,-2087851264,1946165374,-60912799,-1995290997,407276295,2132559417,474385157,1183515627,273038104,1183516028,-1961825520,1178146886,-1962574052,65739846,-1961343349,1200225374,-25263358,1445164032,201868939,-1014280184,45633566,1996443648,209125150,-16091393,1996424822,309041668,1586167808,340167676,1183516553,306592026,1183516031,-1962677486,1586174534,38242812,-1995422069,1183515719,239483162,1183516031,-1962677490,1178278470,-1961722090,1178147398,-1962574066,149622342,-350599541,373721859,-1979949429,2122516039,594804982,138840918,-1957690356,-1202708797,-11534332,1996430966,175570700,-16353537,1452934262,-2097151981,1962942590,-23009021,957892235,92216390,-350468469,407276291,2098349627,306612997,1183518955,474364184,1183516031,-1962677476,1586174022,-1962440196,1178146374,-1962574054,65739334,991315595,92016198,-351385973,373721872,2132428345,440830725,1183515627,-60912874,-2097002615,1962997374,-29824765,138840918,-1957690356,-1202708797,317259778,545162238,-1956416512,1183579230,-1962440430]},{"sector":17,"data":[1178147910,-1962574064,65736774,-1961081205,1200225374,373721858,2115126841,306612997,1183515627,-60912874,-1962653815,1200164934,-25263354,1445164032,201868939,-1014280184,79187998,1996443648,209125150,-16091393,1996424822,-26108,2122514432,57999392,-1962887959,1178147910,-1962574318,65737286,-1961081205,126483550,957761163,92215878,-350599541,373721859,2081441339,273058565,1183518955,440809750,1183516031,-1962677478,1586173510,38242812,958154379,92149830,-350730613,474385155,2098349627,306612997,1183518955,407255324,1183516030,-1962677480,1586175046,71797244,957761163,92213318,-351254901,373721859,-1979949429,2122516039,594804982,138840918,-1957690356,-1202708797,-11534332,1996430966,175570700,-16353537,-1365638026,-1962934252,1183579230,-1962440428,1178147398,-1962574062,65737286,-1961212277,1200225374,407276290,2115257913,340167429,1183515627,-60912872,-1962653815,1200165446,273058566,-1962391671,1178147398,-1962574066,65736262,-1961212277,1200225374,407276298,2114995769,273058565,1183515627,-60912872,-1962129527,1200164422,-159481074,1445164032,201868939,-1014280188,146296862,1996443648,209125150,-16091393,1996424822,360356356,1187446784,-385872606,-1956709282,583163365,-326413056,1460333699,611748694,1342185656,1005210,-96040704,91602955,-823541717,-94467323,-1962719234,263431,-1946401143,270862406,-163149568,621299339,1183383584]}]],[[{"sector":1,"data":[575048702,1946159165,736539,-605486219,867585,1055458165,933123,1256784757,28764420,2129539,1183536244,306592026,1183516030,-1962677486,1586174534,-1962440196,1178146886,-1962574064,65736774,-1961343349,1200225374,-25263358,1445164032,201868939,-1014280184,45633566,1996443648,209125150,-16091393,1996424822,374446596,2122514432,57999392,-1962881303,1178147910,-1962574318,65737286,991708811,92016710,-351254901,474385168,2115126841,306612997,1183515627,-60912868,1183516553,440809750,1183516031,-1962677478,1178277446,-1962574832,283840582,957761163,92215878,-350599541,373721859,-1979949429,1183515207,474364184,1183516030,-1962677476,1178277958,-1962574574,283841094,957892235,92150854,-350468469,407276291,-1979949429,1183515719,273037590,1183516031,-1962677488,1586173510,105351676,16154243,-1957289100,67897414,516131664,309328,511115088,-15960321,1996425846,74907398,1495450,474385152,2115257913,340167429,1183515627,-60912868,1183516553,306592022,1183516031,-1962677486,1586173510,38242812,958154379,92147782,-351254901,474385155,-1979949429,1183515719,239483158,1183516031,-1962677490,1586173510,105351676,16154243,-1957289100,67897414,516131664,309328,511115088,-15960321,1996425846,74907398,1051034,575063808,1586167810,55574266,287349331,1183514624,63170850,2129539,1183538804,440809750,1183516031,-1962677478]},{"sector":2,"data":[1178277446,-1962574574,283841094,957761163,92215878,-350599541,373721859,-1979949429,273058567,-2097002615,1946222206,1183536675,1342704648,1344193419,1342177976,-14780673,1996426358,108461834,-1710983425,6076,958154379,92148806,-350992757,474385155,-1979949429,474385159,2115126841,306612997,1183515627,-60912868,-1962784887,1178147910,-1962574320,65736774,-1961081205,1200225374,239504132,-2096740471,1946220158,1183536675,1342442504,1344193419,1342178488,-14780673,1996426358,108461834,-1710983425,6224,2129539,300483445,407276543,2132559417,474385157,1183515627,306592536,1183516029,-1961825518,1178146886,-1962574052,65739846,-1961343349,126483550,957761163,92215878,-350599541,373721859,2081441339,273058565,1183518955,440809750,1183516031,-1962677478,1586173510,38242812,16154243,-1444347019,1183536894,1342442504,1344193419,1342177976,-14780673,1996426358,108461834,-1710983425,6332,-2080472087,1946165374,-60912797,-1995290997,407276295,2131772985,273058565,1183515627,-60912872,-1962784887,1178147398,-1962574318,65737286,-1961212277,1200225374,273058564,-2096740471,1946222206,1183536675,1342704648,1344193419,1342178488,-14780673,1996426358,108461834,-1710983425,6495,1586233131,1204259836,-670834479,-1995159925,-60912889,-783825013,-1948777504,126423622,2129539,1183529076,340146456,1183516030,-1962677484,1586174022,1204784124,-654057007]},{"sector":3,"data":[1183516553,239483162,1183516031,-1962677490,1586174534,1204784124,-654057007,1586169737,1204259836,-670834479,-1995422069,-60912889,-783825013,-1948777504,126422598,16154243,-1957289612,67897414,-62485680,-11055074,1996430966,175570700,-16353537,-828767114,-956301287,467526,-2080542743,1946165374,-60912799,-1995290997,474385159,2115520057,407276293,1183515627,273038108,1183516028,-1961825520,1178147910,-1962574312,65738822,-1961081205,1200225374,-25263358,1445164032,201868939,-1014280184,45633566,1996443648,209125150,-16091393,1996424822,439458308,1586167808,340167676,1183516553,306592022,1183516031,-1962677486,1586173510,38242812,-1995422069,1183515719,239483158,1183516031,-1962677490,1586173510,105351676,16154243,-1957289100,67897414,516131664,309328,511115088,-15960321,1996425846,74907398,1315738,545161984,-385649408,1183579292,407255324,1183516030,-1962677480,1178278982,-1962574574,283841094,958154379,92149830,-350730613,474385155,-1979949429,440830727,2115388985,373721861,1183515627,273038106,1183516028,-1961825520,1178147398,-1962574314,65738310,-1961212277,1200225374,-159481086,-385649408,-1957233612,67897414,1593673961,1575324511,1581762,11075587,763494401,383910147,458753,1507331,856162305,242614275,303169537,74907651,437387265,46923779,19071231,242941955,378798081,145358851,1041760257,114491395,19792127]},{"sector":4,"data":[240517123,19857663,166330371,396361729,106954755,20185343,98762755,20250879,390856707,20316415,112918531,20709631,138018819,20840703,239468547,313917441,144441347,391053313,148307971,399507457,104923139,375521281,89391107,1030160385,168427523,393216001,153681923,401801217,349241347,368443393,0,0,-2081649835,1448545516,638082756,-1014284405,1183433356,-61437446,-1962654069,36505174,-163149568,-336046455,-96042236,-94452734,2084518182,-2096829452,-1006438802,958854750,-1946910913,969051331,544733766,653942468,1589917579,126559990,653942468,1589905289,931735286,49956483,49704579,-1946794357,1178204246,-1950976262,1451951174,142598,1996113467,-59310323,1392146175,-402360577,1183580014,-128545802,1929922105,175570702,84440831,1347551234,1593791976,1575324511,1426065602,-326898549,1589925392,931866120,-1030962293,-1980086647,1183579222,106334980,-1996487123,1451882054,-2096829448,-1006175674,958855774,-336298953,-160529660,-161561594,2134325542,-1933341708,-96060990,1589927543,126559994,653280905,-1996339317,-1960381882,1183384647,-161561356,-1006138586,-1993934242,-161561593,38243110,653942468,-1006483575,-1960380834,1589904455,1200170746,-161561596,653280907,1183516553,1200170738,-196703486,71797030,117065347,116813443,-1946794357,1178204246,-385648646,1183580021,106334980,989857325,225901126,-231681,-11339146]},{"sector":5,"data":[786957430,-163148801,972576395,242419782,-16091393,100993142,-397389312,-1956708587,146955749,-326413056,1460726915,73304918,1183385483,146928,28837245,-949884160,63558,-1962647925,1183386695,-2081190922,1187450566,-1090518274,1022033921,-964436341,38243076,-1946925431,1178203718,-955810060,64582,1183518187,-196724234,1187453309,-1962933764,1178205254,-16354050,1183447110,-196703234,1207322249,2146467385,-129594433,-443850914,180829,1167087646,518818645,-327034738,1448542376,-1962123637,-1203336953,168149899,1921419520,-1303984129,1187479551,-947912804,-2147382202,25315015,-335598720,1922992981,1921418239,126550783,-1946532215,-2080410978,50295430,1183385483,-1303999510,2113553977,-96040186,-1951250807,1178176582,-1962508550,1183447622,-1673098356,2112505401,-364475642,-1952692599,1178174022,-1962508566,1183443526,2117683074,-1952022600,168102982,-398030592,1183045771,126550760,-9265525,-9271677,-1962440446,1183049822,126550760,-9265525,-9271677,-16283390,1586214982,-1203336436,1183516553,38242738,-1986247029,1183515719,105351564,-1987950965,1187448903,-956301180,42054,-10320185,1187446784,-956301178,16741510,-1983894784,1183432262,105286588,1946699275,105286436,-1995942261,1451867206,-2042181698,-1904214015,-956170379,16744070,-599341312,-1712783359,241076992,1156986763,108273672,-26029,1552613376,-1995994356,1552654918,-1995994350,-661941178]},{"sector":6,"data":[-1995946101,87924294,-955419392,46662,-8485177,434831360,8436867,-1962508799,-352288636,112643,-944355703,33521286,341609216,1183385483,-1948742672,1183385671,81404,1187448693,-352321316,-599341271,1586167809,41911202,-2095352576,1946356350,-58817771,-955288318,33514118,-262239488,-1995552885,2122560582,427098246,207522646,-16615425,2013201527,142081798,16777114,1954941184,207522815,1183385483,-2038529096,-385649664,2122514569,58000138,-167739159,50295942,2122545524,91554058,-352321096,309251,-2082847095,1946213502,-632389628,2126414720,443810047,28737155,1317012606,2122518746,175375774,10387075,1317012596,1586176218,541559714,1004160547,796252742,447898,2122536448,91554058,-352315720,1357827,205949776,503319045,-1200160944,16777114,-26112,1187446784,-2097151580,1946199166,105244931,-401836289,-768869145,318767365,-230258222,-1191946615,1385758744,-193527984,-1695385857,1291,-628373365,-1947056501,-1903561642,-1635123364,61996894,16777114,833792,1364450091,-755969,-2037779850,-1769341096,-6619302,50331903,335501446,67066518,335502470,-1979752810,1451869254,-1706011962,1501,194135689,-385649216,-1706031646,1515,-1981528439,-1039407530,-941030539,1619973,66219767,1452008518,-901346842,-1949542775,-523111866,97142275,-2037841916,-1769341078,112787308,-227608832,-9796093,-9660789,-1982708087]},{"sector":7,"data":[112776278,-227608832,-1949153789,1183437910,-799634994,-8470909,-385649408,2122514616,57934346,-1962889239,-523126714,-2037825472,1861746552,1585875384,1620223,-1179095305,-796196854,-10582389,-628367151,-1023153673,-1728048123,-1983625591,1347602006,16777114,1619429632,1958743039,-6664089,-1996488449,1451853894,702602,-10572041,-1954003453,168135254,2055637248,2090240511,-1203336193,-523116335,-8747517,-1996487675,1451873862,-2008642600,-9533815,-9398647,2117730091,-1004306760,654274206,-63545,38258470,179896319,2024732416,1854276095,-555005953,-8485177,1996423168,-428409076,-1914407169,1343675974,-1695385857,65535,51019395,-2033775499,327528,-8485237,-2033776149,589672,-1982052725,2122564166,91488390,29509319,1656652544,947126527,-1710328065,65535,196888201,-955746880,33862,-16494615,1996464758,-25932,1183383552,1975520190,-1133052150,16777114,-2133005568,1090483342,16777114,-2142845184,1187446784,-1962934026,1200295006,-934901496,-1996208245,-369138554,1187447566,-1962934086,1452001862,-1471772212,-1951770999,-1946195322,-1979749226,1451876422,-465138718,-1981393269,1451857990,1720108954,-385875713,1589903752,1686539160,1194927871,-385647088,958792048,58659399,-385783831,1589903562,2139301528,108789772,239599398,1589905387,1342121624,-1738619890,239569702,-523116335,84690435,1183383562,263672,-1951381879,126613598,-10582391]},{"sector":8,"data":[-1951375733,1585851143,-1773762049,-1962784885,1194063966,1988528386,-1738634241,209683238,-1961460736,1200336990,-1738634494,340232486,-10582389,-351827674,-128021718,-1006483573,-1993959330,1586172999,-1962439760,-1993959330,-1773761785,1183439095,1988529046,-1982269441,-989890938,-2037671842,-1993932938,-953808825,1607,410304523,-1718204789,-9007477,-1993934345,1183515207,-101213802,72845606,-1952948540,654271622,2132035385,-14227197,17464963,-1960440715,-1470184441,44582531,1589915627,126559896,-2082447676,637722694,1589905289,1200301720,-530660330,48252547,-1006139098,-1960404898,1589907015,-532249632,126428674,-994425089,-1960404898,19268167,1200301575,1191257604,2092960518,1200301587,1194927624,639859718,637945641,451610623,647519940,-150452341,1195058904,638286854,638076811,637945601,1182994431,-2030102376,1183580006,1720072670,-385647105,2122579564,58655162,-2097071639,1963002494,-864616679,-1949665537,-523126202,-1949678077,1347603542,-369680920,-1224802068,-1224736916,112787306,-1167132928,-9796093,-9660789,-1293397934,1823932407,1790377983,-1166606337,-1996351000,-1098663354,1946222462,176063287,-13535998,-33610,-34122,1996477558,-2139684910,-9652481,-9783553,1689714512,-1971912705,-7833857,-34634,1021900406,-163149565,-1949677941,1183435862,-1437169240,-9795957,-9660789,-1981790583,1183572566,-732525614,-1985198455,-13914538,1589923307,126559968]},{"sector":9,"data":[-2086117692,637708358,1589905289,-532249632,126559746,-2085855548,637709382,1589905289,-532249632,126559746,-2085855548,637709382,1589905289,-532249632,126559746,-2085855548,637709382,960956297,-1367360898,-1984280949,2122547270,678691010,1954974550,1753615359,1996443903,-898170932,-4557057,-39754,1996476534,-1099497522,-1698924801,65535,-10189057,969426571,2113889414,-51975933,-10305917,-13732864,1996426870,171547324,1183383552,1996445422,112830,-26032,1996423168,-294191346,16777114,-1133052160,444826,78027264,-1098711040,1962999678,11135235,51019395,-1595341963,-2038529280,-385649664,2122514583,2020934154,-8603905,-8734977,-2853121,1996477046,1823932288,1790377983,1354771455,-10176769,-7702785,-1224767370,1996488568,32368886,-336181623,242679569,-2590977,1996478070,184130214,1996423168,-2005467254,-2590977,-1224747402,1996488568,132507894,1034307209,-780206079,-10438913,724122,1622605568,185899775,434831360,28868227,1996428158,205949710,503319045,-1200160944,16777114,-2075736320,2122514433,276103332,-1701677313,65535,-1701677313,65535,1585727115,49120095,1562371467,707149,-2081649835,1448545004,1183432747,737709054,14477814,16678531,112745333,-990972160,-670890402,-1962439898,440520,1586229239,651690758,112725897,-1947273472,-670890402,38243110,112773259,-1947207936,-670890402,38766886,-150993224]},{"sector":10,"data":[106859502,-1960388605,-930413497,-1152923765,-336134138,1577310347,1334388230,440324,1589964535,651690758,16926710,1191118196,-16520194,2122579534,1534394622,-150993224,106874094,-1960388605,-1194816761,-269025274,50749067,260646616,-150993224,106859502,-1960388605,-930414009,-150993224,106859503,-1993943037,112722511,-1947273472,-670890402,71797542,-947140469,441159,-661918729,637951491,1174687625,1208239755,58639931,-1191241239,1861681158,105251588,-1995942261,1451882054,-161561352,-95974618,112773259,-990906624,-670890402,-1005614810,-1960380834,-930350009,-150993224,106874095,-1993943037,1589903951,1200301814,-1949791234,112936903,-1947470080,106824664,638076558,-1962651767,-1956684089,113401317,-326413056,1463217283,-364460202,1340669952,440321,65695479,1451955782,263448,-1982970231,1589956694,1065428686,91586561,509734,440320,65695479,1451955782,263448,-1982970231,1589956694,931866318,125695499,-654850421,-1207465690,1861681158,373687274,-1994893685,1451871814,-832650032,71797542,651708041,1183385483,-96024580,1187446784,-385875736,1183514826,-398051058,-924253316,440320,65564407,1451954246,-834238190,-992979319,1183567454,1194927832,-385649660,1187446939,-1962933766,-773598760,443991267,637569830,-1996337013,1451873350,702678,651452100,50622455,-1983738685,1451879494,-832650002,-1727558874,653024964,-1993996407,1183515223]},{"sector":11,"data":[1200170508,440324,65695479,1451955782,263448,-1983232375,1589955670,126559946,-1993942793,1975520007,130491909,112754689,-395380992,-1961867773,67441238,-834238208,-992979319,-1960391074,651753223,-1073018999,-953808267,-343932665,-398000381,16416387,770245493,-364445697,957630091,58583622,738109161,-398030400,-1947580791,1178145862,-1960674070,1178144326,-385647384,367723532,-150993224,-259265938,639000260,292995,1191119741,340167658,2095728185,340167651,1978287673,440359,-1947570441,376882392,-16726234,-1206523009,1861681158,-990868504,-2094657442,2097153144,-398000373,957236875,-478353338,957236875,276162630,-150993224,-661919634,638613188,2147418311,1183432747,-767129090,957630091,192735814,957236875,58517574,-1191222039,1861681158,373687274,-1994893685,1451871814,-832650032,-1962439898,440520,-1947701513,276219096,2114468134,-832650168,71797542,1183565963,-28965934,-150993221,-1980724245,1317658698,-364475408,-1947580673,-1947600949,376882392,-1962898650,-767128632,64112383,112983622,-1947470080,-599094800,-338014583,440423,-1947701513,274646256,71338790,1183565963,-28965934,-150993221,-1980724245,1317658698,-398029864,-1947711745,-1947600949,276219096,-1962898650,-767128632,-108917,-1039925690,-150993221,-1980724245,1317657674,-1206522884,1861681158,-990868502,-2094655906,2097153144,-364445941,957630091,-478352826,957630091,662039110]},{"sector":12,"data":[-150993224,-661919122,639006404,2147418311,112727531,-395380992,1589964939,2021860880,192741380,-1947711745,1178144326,-1948025624,1178144326,-1206880792,1861681158,-992441368,-953806730,-1199571200,1861681158,373687274,-1994893685,1451871814,-832650032,-1962439898,440520,-1947701513,276219096,2114468134,-832650168,71797542,1183565963,-28965934,-150993221,-1980724245,1317658698,-364475408,-1947580673,-1947600949,376882392,-1962898650,-767128632,64112383,112983622,-1947470080,-599094800,-338014583,440400,-1947701513,274646256,71338790,1183565963,-28965934,-150993221,-1980724245,1317658698,-398029864,-1947711745,-1947600949,276219096,-1962898650,-767128632,-108917,-1039925690,-150993221,-1980724245,1317657674,-763460612,-1958054654,-472784802,1992614865,9119258,38832934,-1980348791,1586231382,-773598746,9119459,38832934,-1980610935,1589965910,1200170742,1468605958,-228670456,-1946794357,-1993934762,-1993996729,585697367,-25263107,-385649662,1183514778,107935492,-150992199,138806249,-1995811189,1451873350,-529072170,-2328833,1347554422,-1207886104,1861681162,-990868730,-1014246306,-972832116,638028070,-1962780791,-472784802,2126832593,-733574374,637634854,16929161,1996477558,-495517722,1376548607,-388729089,179831007,107935488,-1949020533,-936651170,651460292,-1993994871,1586168413,-773598746,444515555,-1949022581,-1993943466,1367942657,71729922,-58726142,-772776309]},{"sector":13,"data":[-991702557,-1960437130,1351296512,-733574910,-1193912695,1589903370,1878468308,-1933376764,-330921534,-1947314551,-996550586,-1993937826,-1993996729,1589905495,1199777492,1182990852,1183517420,1589942780,126428908,39291174,638338699,637814665,637945739,-2096605301,-1962218426,-1952842682,-1993937826,1468605959,205949698,71797030,105351974,139954982,-774349173,-1897672221,1183521862,-698971180,637569318,-385724279,1183579105,-1956684284,448945637,-326413056,-1006310269,-953809826,132167,-1727248757,105351462,139954470,-1030962293,-1996486139,1451883590,172395518,-60898151,638028070,-1962780791,-1993996218,1589904455,1200301572,1468737030,-60898296,105351462,139954470,184305283,-1727379829,654073483,-1993996407,1183515223,1200170504,73319428,105351974,139954982,654073540,637945737,-1962387575,180510181,-326413056,-1960907645,1451953222,-129595122,-939895159,59974,956581515,1702750790,653811396,163715,-1014280836,1183433356,-396981786,652631748,-63545,38258470,1187512319,-956301070,60486,-1962391925,1183386198,-27883012,15498883,-672595084,-431584512,99112587,1183383562,-262764050,15353543,-1204032768,1861681162,-129629946,-336967937,-373281901,1589903648,126559982,654073540,1589905289,1200301806,-60898300,83641987,38242598,-2081274113,-16060858,1589963334,-364475418,71776550,-1960391553,-1960442297,1183385687,-396981786,-1006630216,-148445602]},{"sector":14,"data":[-1023212433,1183433356,-262764050,15353543,-1003558144,-1960382882,-60898297,-1995994842,1589966406,1200301806,-60898300,83641987,38242598,-768375,1854140998,1191119598,-429996822,652887691,2130986809,126559942,39291686,-1981659511,-92019626,1024095743,91619327,-336443765,-429996947,-16267482,1204233983,-1946157310,1452008006,-431584796,-1947707767,1452013638,-397002246,-202833036,-431605250,-337050764,140428542,653674123,158664505,653543051,1946306361,140428321,-1006138586,-1993933730,140428295,38243110,-2080612668,637860934,-16627831,1187508806,-385875476,-443810130,319603293,-570359040,285212938,1778385664,301990147,1090519834,301990154,939590418,301990149,-721353984,318767370,-1375730944,587267850,1174405889,-1811939062,-671087850,402653444,-1174404290,771817222,771752705,788594442,-1593834751,872480516,218104577,889257732,-67108095,906034953,-1610611967,1006698246,671089409,754974981,1744831254,1040252678,503317249,-1241513718,-251657454,1040187652,-2130705601,1644167428,22,0,0,1167087646,518818645,-326903666,-1957275888,-1070919562,-1980217719,76282438,-990886263,-953808802,-1962934009,1451953222,-230258418,-990620023,-953748898,2631,-1995815795,-13894586,1223706251,192857915,-1962385724,958793286,-2094826489,1962997886,11725059,653418180,722093963,1200170695,2139694604,1204233738,-385875434,1586167979,38243324]},{"sector":15,"data":[2114340665,-125926592,-1003260928,-14284706,-228670457,172460838,-1993947349,-1993995193,-953808257,136775,-396995834,1182990478,1589909746,2139694834,-129579254,1187446784,-352321030,-60912827,956450699,981272135,16416387,1589915508,134161928,-1947050300,1194010311,1200170506,1204233740,100663574,1206408787,-230259968,-228670440,176130342,16402119,-129579264,-2092498943,-385549242,1589968690,650611698,638207787,638338953,18237383,-193528064,1458730751,1577061864,49120095,1562371467,838221,-2081649835,1448545004,637951684,638220171,819075,-1070922628,28836843,-990893312,-1993996706,-1960440201,-472839585,1577313233,206015236,637951627,638601097,638338955,51011467,-773598760,73270243,-1962129525,-1993996706,2123043399,-775517436,65065440,172329976,-1949791335,-628421051,465644441,-96040493,-1946397047,-1952904123,272993224,731503243,-1982653503,1451882054,106859512,209683238,-1962378240,-1993995707,-1002575097,-1960442274,-422506889,1586226897,239110916,637951627,1183516553,-61436934,-763111177,-1982138624,1451883078,-163148804,-134719861,13796312,1183439607,-128546314,637951684,51398539,-1993935290,1183519815,1200170742,1204233736,184549382,812972102,-493825,1996486262,-92864516,16777114,106873856,38242598,-493825,1996486262,-92864516,16777114,106873856,71797030,-443850914,33997405,1560281856,-1979711230,1157628734,1728053506]},{"sector":16,"data":[61,0,0,0,-1296313805,-1864856575,-326412987,-2082959842,1465256172,-1961867637,28906590,2109942528,-136775932,-62486055,-1946530167,1586171462,112914,125682475,-638068489,-1996454167,1317664838,-129594378,1006395019,-1959035709,198216698,50623743,-774689838,343313402,-1961722229,535033934,1465274961,-16222465,1593771638,56187402,1445721726,50757116,1979971670,-371072262,-91553600,-16002165,-771554188,-86912981,-1961593205,1317737086,1361044476,-11053486,1996425334,173997830,1979930970,-128570374,1443038845,-159513604,-2048269854,-129595136,-1946792311,1586231366,2093169660,-1946514628,1962871760,735183620,-86949165,-1961593205,1317737086,1361044472,-11053486,1996425334,173997830,2114148698,-61461514,1443038847,-92929032,988537314,-1946514544,1962871763,735183620,-86949168,-1961593205,1317737086,1361044476,-11053486,1996425334,173997830,1979930970,-128570374,1443038847,-159513604,1583342050,-1962742397,1297948645,-1946152758,1430622424,-1910575989,149717976,1586190166,-2145416434,2080899711,-26105,69140480,185499275,-1955040001,-796066763,2123219086,-1948808202,-1951724474,-1951724986,113146,-6628557,-1929379585,1962931838,-1705568724,65535,1198833675,1358581389,16777114,2089506816,678756138,-14256897,1996425334,-11463162,1284310109,678756156,-14256897,1996486262,-59310088,519730943,543031121,-26032,-1957167104]},{"sector":17,"data":[1452014150,-1207636996,1603928063,49120094,1562371467,707149,1167120524,518818645,-326903666,-1957210620,-16053634,898328180,-1064382324,-1946517875,-1951725498,-1918171578,28965502,-1696910592,411,-360819,1461070964,108698,1958742784,-1248178121,1476395009,858422411,678756306,-14256897,1996487286,1381126908,543031122,1962920243,645201704,1364283474,1342463487,125594,82532352,-1711276104,-310157729,535137026,113921373,196613,66117,204042,65906,210836,66173,202388,66104,209756,66127,5730,-2081649835,1465268460,1988874803,41714450,-2147257086,1183518926,1975520006,71600910,-1949809015,1183385156,-1995117622,1183566406,-934901500,1183432755,440830236,871360128,-330921536,639663812,1183384971,1166747366,-465139454,-1996175485,1183522942,-1982821866,1451884118,209619960,-1993456245,-1991709114,1166801990,-263812820,-1993849461,1166799942,-230258390,1226722955,-335788405,954830855,508463875,-1980269495,-1957683634,-149254,-16353537,1347421302,-3508481,1996474486,309788436,552078992,1490520838,1948305142,-96040176,-1946401143,1183447110,-338654466,-62486269,-1981397365,1586227782,-396457500,639663812,1317604747,1972053734,-461993726,-1996175485,-427810690,-1141691434,159318017,-830470540,1272903456,-1194841269,159318017,-830470540,1222244097,2127444808,-1815181562,-167195008,125051078,-604514057,-1996360064]}],[{"sector":1,"data":[1317658742,-599356966,-1948361079,-956895162,722433032,1183446086,-196703242,-336836983,1177260045,-163149326,-1980610933,-963908538,1183443153,549910242,-1991900812,-956901258,-2141096928,-92258098,-1957595905,1220971482,1861736695,-1949660180,-632910864,1861736695,331744246,-62520367,-1962880381,-528770,-134457719,1317796958,-1983249426,-745801138,-638072693,132219201,-1983655424,134608990,119883776,-758609152,-27883062,-1947836789,116122702,-1947574645,-830412722,410422020,-1995815797,-964439482,-1878136044,-1946246423,197892,-268181295,2094157567,71601135,-344014533,990004363,-1962771007,-867792447,-1948879223,-1946579981,1183572558,-165811204,108339398,343523339,-1073019669,1174605439,-155004690,74719430,-892286256,2094550783,-864142510,1183404149,83263740,1963247350,-698446986,-1996208245,126602310,-2133834103,-956955954,1211266049,-670834479,-1962491005,1325352967,2112895952,49709126,2094026495,29816390,1263208308,-347601013,-1958526204,-371004665,1860959739,113476496,1325336459,2129673168,49709082,2094026495,29816346,1263208308,-347601013,-1958526204,-1981617401,1183437918,-2143491122,1325335758,-1950057262,126604894,-670834479,-1996045437,1200346718,-867792638,208992315,1946273526,108477194,267113852,-1946201367,-523155449,2000410627,-1950057210,-956892090,992965892,712363638,-1946401143,1183568990,49709262,2094026495,29816486,1263208308,-347601013,-1958526204]},{"sector":2,"data":[-732002041,-1949415799,-956892090,173307206,-1994229294,1317665862,-27883038,-15698177,1465257590,-14911745,1996429942,309788436,-351772929,281474597,1183394164,-498169348,-108919,1996427382,-11053554,1996474998,343343048,-15567105,1183516766,-498168836,-2130815349,-956907546,51868680,1177280118,-632411156,2114128253,-163173412,-371175933,2114190957,-330945570,2111458859,-596245518,66471467,1458167886,-149250,-16353537,1347421302,-3508481,1996474486,309788436,-186118512,112642,-443851169,2146909,-458561537,-768409366,-1946045765,1430622424,-1910575989,720143320,2123061078,-1959425268,529207900,-2096607349,1149044217,200822409,-2094304046,1946253436,142525464,-1962520949,1418419292,84092510,52859819,-493638907,142525684,856051339,-25893,1156972544,259268616,-1710459137,65535,58048523,-2097069591,16810172,1996427646,175570700,-16222465,870844022,-1947866364,529206364,-1960552565,1187458164,-947912728,2147478086,15484615,-297351296,1317765120,142525446,184618728,-385648183,-1706032902,65535,710708056,-1962115957,-1958943939,937631309,16285315,-1040775564,729022496,-1925415795,1962928214,645201704,18364159,-16353537,1996425846,1962876424,1962876462,374808110,476053330,-1962891543,887292493,-1961722741,-95515331,-14125825,1979655796,242614032,1610567958,643089412,-1930406263,1552675398,542622762,16008903,-163133696,921370624]},{"sector":3,"data":[383024781,-149497,-1414812757,-1423031157,-1951672180,-1951720377,-1951719865,-1951717820,-2085935036,2122913007,-162099980,-1930396023,382005846,2089615636,-128021700,-259028434,207391491,1996431243,142016266,-16353537,1996487798,745865210,-11067823,1996485238,1376146416,-624897,1676211318,-6663942,1476395263,-310157729,535137026,147475805,147227392,1981869,149488500,-1072976639,-68615307,-24699392,-661733236,-398050387,1183384445,-330941464,1183384444,1178316268,-1996259862,1178331718,-1996260114,-589107642,-1161473,-2027951034,1001210359,92203078,870860425,1178316233,-1996128534,-919344570,-330941523,1183384957,-1379322900,2112767547,-297367291,1183566131,-398054420,1183521406,-364499986,1988825726,187992844,-150506039,1946157506,2011906309,2123069163,1979649016,2122531077,2104820230,638090948,-1960442485,-1960442787,992346709,628426325,142394171,92874387,73238822,2129419835,-329872633,72714534,2112374331,-396981450,-350910170,1975728942,1569400384,2094217990,651396874,637687177,990272905,125759070,653149835,990266761,125692502,652887691,-1023261303,-335544391,209095674,2089497739,-1958900974,2122909821,-339135496,-1864856346,-326412987,-2082959842,1465256172,-1944947003,1975520216,10676483,185353867,-352095040,1183551523,106728206,2084619051,146711,1183519359,73173776,2084619051,146695,1793786495,-46332789,-1957137153,73173764,159367995]},{"sector":4,"data":[1140213385,-335913335,-161576697,-96040640,-1962785653,-1019541924,1183385983,1586054136,-1995969540,-1992230818,1183710278,140297462,-1174404423,1962868754,276102930,1444827474,1392923398,-16222465,1343620726,-1962124033,76091462,-1995553141,1183515204,71600400,-1995553141,1583285828,-1962742397,1297948645,-1946152758,1430622424,-1910575989,149717976,1586190166,-2145416438,2080899711,-26105,34799616,2123087923,1962871562,-1942648009,-1916760368,-964430210,-1515848612,-1425521013,-1425652085,-1175028083,-293404670,138840928,-1956887415,1149830726,175570782,-1873717482,-67770354,-310157729,535137026,113921373,-1864856576,-326412987,-2082959842,1465264876,-1962123637,41910303,-1710785528,1982,1317733157,-1955470580,-108853682,-2090238974,276761337,-1064382324,1473674893,1183432755,-1876956204,-506338863,-26031,1183383552,1975520212,-1874728189,-661849973,-1957183346,-611580338,-1962379579,-203304495,1608224421,101480191,244339287,-1946456344,-16001922,-1705572748,65535,1593835960,49120094,1562371467,576077,-269762509,-2081649835,-2091510548,2097284222,112646,-956212247,60998,-788248949,1356911072,597658,-129595136,91602955,1038729259,-128021759,-1962719234,-28931833,15746759,-1960645888,45215862,1589962451,9119238,-1979818357,106859264,37784358,-1979818357,1191117376,71732208,2096121401,4241622,156211792,1183383552,1975520244,14674179,1207883915]},{"sector":5,"data":[-1995994365,1996487750,-454537206,243712,-1996198153,-523110842,235266257,-1516613632,-1996488695,-1072960442,-1561787531,-19363072,126550855,-375159,1996488310,656644,-163148976,-523116335,-59310256,-1996368920,-1072957882,1586188157,55574252,167483987,1183514624,1087961078,-163149504,-523116335,1342180869,16777114,-330921728,1333051403,1207883915,-1995994365,1996487238,74907646,1342179845,-772389237,1356911072,-386107649,1183383936,-94467082,-1980348789,175570695,243795,1354771280,-26032,1187446784,-1962933778,1342106718,127554307,-1962934262,1342108766,328880899,-1962934262,1342109790,-1801825533,-1962934264,-1956712890,146955749,-326413056,1443425411,-1962516853,-28931833,1207359627,141828104,-1710852353,1112,-2080481653,16810175,-2020931970,65732736,-1996488264,1586232390,-2101378050,108921088,8554379,28836843,-96040704,100433539,1187469950,-1962934024,-422446986,21411071,-1191414017,-1706013152,2717,-1996202357,1219821312,-92864767,1347297464,713370,73304832,-2097004407,-2096957370,2082535550,-1946973242,1177230404,1011321340,1149962121,-96064718,-1995290743,2095779399,16271047,-126448896,-1258297647,1996423558,1310767356,183999056,1586167808,-16742140,-16676684,548993654,-6664114,-1962934017,1082721374,-129596670,-125926654,-1949926368,474254323,-1979955669,1200176199,877103416,-1993324663,1200163911,71797000,1149962121,-96064718]},{"sector":6,"data":[-1994504311,1200167495,306678038,-1995552887,1200163399,38242566,1577058744,-1034033781,-1957363708,216826860,-1070377130,-1930148215,-1950314792,1183385670,105251838,1183402056,-96040452,-1241221493,-1958745089,2123103350,-95515650,-372126165,-1510783418,721962635,-774309945,1223217640,200564363,-150702885,1606626264,1575324510,855640770,-1963660352,147226866,-351279488,-695562151,-1946354037,-1985147786,-930351034,-163149395,-15960439,-613152178,-164452996,732813451,2111436744,265191429,-2136090121,-1020590090,92135633,-150473088,2109815768,66486276,1005113745,-2147254847,-771096074,-695596931,-2146909568,-141881374,-315424974,-903164278,-2146385536,-109047839,-385647096,-1946419070,-628425090,-472783919,-58836159,1191118194,-1962021900,260166,-163148885,-1425915901,-2130394237,-503300893,-25261600,-58815491,-1014965622,266567688,-472783919,2013167163,-196673787,1183518187,37749750,-129594453,984285187,-1977387818,147030238,-787487872,1004786147,91750014,-336312577,-163149043,-1425915901,66602635,2122951424,-15799812,-25261060,-472786294,2117854161,-16420100,233567302,66602635,1183558400,37749750,-773944661,1004786147,91421822,-336312577,-129594611,-1951727613,1074001478,2122951426,2123103742,-2116421636,-1979707423,147030234,-787487872,1105449443,2013167163,-196673787,1183518187,37749750,-129594453,-2085945341,-478083861,-522059716,-369328503,720528,176685059]},{"sector":7,"data":[763494401,160301315,458753,171704323,437387265,166330371,19005695,94306307,378798081,137101315,932446209,71958531,861667329,78381059,375521281,140115971,367984641,147652611,368443393,0,1167087646,518818645,-326903666,1988843018,-754798330,180782054,1385809547,-26032,1183383552,1975520252,-18427,1996437739,12229372,1183383552,-128546314,-1946788156,-1993996730,-1993997753,-953809801,1607,17286950,1204233728,-16777208,1939537014,-1962934271,-2090927034,-443874579,-900899553,1478361090,-1957345904,-661774612,-1207535873,-397410303,-310181847,535137026,46812509,-1873273344,-326412987,-2585058,-1070922122,780368,-1962742397,1297948645,1426064074,-326898549,1996445208,33790470,1183383552,-195655182,108380683,-369098824,1589903644,126559986,81224,1187448957,-369098762,1589903501,1200301810,-773795576,-1933376544,394690,-1980086647,1589967958,1200301818,-163149562,294531,1589929333,268379890,20939558,-953807243,2119,105367334,1273692160,653418180,425857,637957184,-351778817,-228670406,-1995994330,-661917626,-472783919,653948612,-1960443765,29033040,-128022272,-472783919,637569318,-1962782583,-523110330,-1946270071,1178202182,-15893250,1234830966,-1962934270,1860957766,1090406027,2112898619,-28931294,-523116335,-1946532349,1183448150,-296318484,653024964,958793611,58524743,-1946269953,-523110330,1174659281]},{"sector":8,"data":[-61436934,-1981004151,1183575638,-773795330,-96074784,-1981266295,1589963350,126559980,652762820,159188793,-11381934,-387388298,-28931327,-369604983,-1956708491,79846885,-1873273344,-326412987,-2082959842,-11138836,-1600518026,-1996488702,1451882566,1975651322,-18427,2122534891,158662662,653811396,-352172149,-128007104,41388838,637957635,-578865351,-523123061,67494097,1200170496,2005476868,142016258,181402,142016256,653811396,-1727772789,45633618,-6664192,-1962934017,-310157626,535137026,80366941,-1873273344,-326412987,-2585058,-6683018,-2097151745,-443874579,-900899553,1478361090,-1957345904,-661774612,1443818627,-1710590209,65535,-1980610935,-1039403946,-4716939,17426943,653418180,958793611,175964743,-1710590209,880,1589961963,126559986,-1995964634,-1960379322,52824135,1195058695,640646658,-787986549,-1981754912,-1014237626,101040780,-1957670400,-1023150522,1375733253,-159973552,16777114,-228670464,138921766,1589903360,1200301810,-773795576,-1933376544,394690,-1980217719,1586231894,-773598724,-126434077,637945483,1988821129,-773402116,-128021530,638076555,-1006485367,1183576670,1194927622,637959942,-351910007,-228670449,105367334,2122530816,225772028,-1710590209,65535,-352321096,-62485692,1183447249,-60912650,-472783919,653817540,1586167947,-773598730,3745507,1183568510,-773795338,-1933179936,-1957670206,-523109306,-972824367]},{"sector":9,"data":[350769234,-163149056,-335788407,-310157655,535137026,113921373,-326413056,-1006310269,-1960441762,1468737031,-62486270,-989964663,-1960442786,1468737031,140428290,638028070,-1006479479,1183515742,-27882500,638028070,-1962780791,146955749,16973830,66143,16973840,66175,16973841,65586,16973842,65631,196627,65566,202285,16712453,250,0,1167120524,518818645,-326903666,-61385210,-1005816123,1183516798,-1036805882,1183433259,-126449156,460640779,-523112405,-523116335,1988751363,-15930376,1501494350,1190688395,-1191676279,1183383560,106335226,-234683254,-234675062,-234668918,-234677110,-234673014,-234681206,1979921546,-1961588218,-2061584,-1015219634,-422461231,-405745456,-472854320,-439299888,-506408752,-422522672,-489631536,-341126960,-2090967078,-443874579,-900899553,347668490,-1188566272,585836563,-352056647,537704733,314120427,-1189876964,250291213,-905969224,196673552,-1190925544,-661902325,-1957210480,-1898476300,552371143,-768344949,-1523127674,910556386,-1927647863,1586240109,-1881633026,1183835718,38178792,-1996208497,1992616534,-1130526,184573416,-1005488686,864672374,-1946008692,1959136192,5171203,-1961205877,-2489569,-2585825,393865806,-1930002748,1959201728,-96040178,306546982,654067339,-1005304439,1183575678,1166616306,-196703470,340101414,1720566667,-2090967066,-443874579,-884122337,-1942779396,-1070398909]},{"sector":10,"data":[1963211046,136219621,639601409,-1995291513,1200292931,1149707792,105089300,-1022834813,1167120524,518818645,1465309326,-1006219637,1992625278,1604645640,49120094,1562371467,707149,1167087646,518818645,-326903666,205949738,1947092491,207537161,4161574,-4716939,23063039,50478723,-2096663552,197694,117379189,28836610,-6664192,-1560280833,1048773578,1962869706,242679765,-1928562945,1343673926,16777114,-700019456,-6664170,1342177535,602410640,-163149558,-1961987008,-472779170,-1081875503,1946157988,3979425,-1706012007,659,201082505,-1207536192,-286654469,-59310336,153754,-129595136,-990226807,-953747362,83886087,1347551246,-15829249,548932726,635981824,-128007157,653674123,1074153353,-2144991115,-381681329,1709703298,104760075,1081344003,383141517,-26032,1589903360,1200170744,2109737776,-59310311,106650,-59310336,206490,-128007168,809995046,1589934571,2139170552,1950351408,1333798581,954957825,-1946663285,235272790,-1957670400,1175128134,-1005620214,-2144991138,108265535,-1030962293,-122157589,1390054402,2144336,177662032,653811396,536956800,653811396,149447,105286400,138905894,-1993949133,-1993995193,-1993995705,-953799097,459847,-1694730497,554,-2080618869,-443874579,-900899553,1478361098,-1957345904,-661774612,1449192579,33310407,108461824,144794,2144471808,1023769613,108199996,-369099336,1996423614]},{"sector":11,"data":[173795334,-1980742007,-1039404458,-4716939,27847167,653287108,1073743863,-2094657420,1946157695,25815299,38272806,1048775403,1946157830,24766723,653287108,1073891211,71777062,1996440693,52140550,1996423168,108461830,244634,1049856,1375785603,178256,-26032,-1073020928,-71825803,21555711,-1710852353,688,-1980742007,1589965398,1199777520,1589905412,2005608176,652660994,3162311,1200301568,65065218,96636099,1183383598,-94991880,-1728015688,-6664110,-1006632705,-1993934754,1975520007,-62470392,-387317765,-128007168,-1707606234,65535,-1980479863,1589966422,133637872,359940096,379602573,-1933341872,918978,-6664110,-352321281,-401698791,1352140651,503517368,1354773328,379602573,-26032,1183645696,-1957685600,1452012614,656886,28856402,-6664176,-1006632705,-1993935778,762658823,653811396,-1919272961,-1006632957,-14223266,-26057,1589903360,1736451824,1589960449,130492152,1187446784,-335544324,-195115952,-1204289754,1344144148,-1705983949,65535,653549252,753536,-14284683,-26057,1589903360,1204233972,637534468,33703879,-2016991744,138,-1993949133,-1993996217,1589904967,939468536,234906,108461824,16777114,-62485760,49120094,1562371467,182861,1167087646,518818645,-326903666,-11118830,-6681482,184549631,2081259474,3947781,-38271373,16968191,-401836289,1183385705,-162100748,108380683]},{"sector":12,"data":[-369098824,1589903596,133637876,125116416,522022,-999066560,-1960381346,-405732737,776047398,1358710409,385178,-129595136,1392137865,175570768,-16222465,-1092090250,-1012992,1117453430,956301316,779355766,712832523,653549252,536872951,1996431476,73570828,1996423168,175570700,-16222465,-1070397834,112368208,-259325952,1996425451,80452108,-963969024,1589930219,133637876,1316257792,637959819,556931,619395444,863305483,653549252,-13600769,1996425846,-6662392,-1962934017,13039600,723744128,141951486,653549252,856193023,-6664000,184549631,197752256,-955484929,-129466,1187448299,-250,10095734,-1962934266,1599997510,-1962742397,1297948645,1426065610,-326898549,-1000974588,-2144990626,1946159999,931866119,1031140875,-1962260853,302320726,-1957670400,168102470,-1202695680,-1705990142,775,1967190155,-18427,1589923563,931735050,2013210198,2013210120,1354773254,16777114,1996445184,108461832,-1710983425,848,2117859467,-1961921276,-996604858,19270238,287704647,1589905495,2139104778,108331019,124623446,-947191808,-443850914,705117,1167087646,518818645,-326903666,-11118834,244976758,184549383,2081259474,3947781,-38271373,21948927,-401836289,1183385245,-162100748,108380683,-369098824,1589903672,133637876,141836288,411335,18606336,653549252,536872951,-337050763,2139825664,652726530,-1993457269,-1705968570]},{"sector":13,"data":[1594,-1980217719,1589967446,1200301816,1194927618,642610436,134367107,-1694730497,1676,-990087425,-1960380322,-523173305,-1845108527,1372138240,178256,38181456,-1073020928,1187450997,-989857018,-2094598050,-385351057,1996423337,123050748,1183383552,-94991880,-362753,1996486774,142016266,-402229505,-259260791,1963357755,-128007125,105351974,637945387,-788234357,652726759,9077129,75467558,71827238,-405674031,637945483,9208201,-1694730497,1684,-1710459137,1763,477951499,1946580537,209125143,-16091393,1996425334,112646,-26032,-259325952,787203723,653549252,-2147481609,-1070392972,175570768,-1962379521,96636099,1347551246,-11485133,-16542178,-1818620810,-1962934265,1599997510,-1962742397,1297948645,503318730,1430622296,-1910575989,317490136,-62470314,1996423169,29989382,-771031040,92015999,1929395261,-149498,-16705047,384304758,-263812859,200431241,-1207536190,65667071,-262224895,522022,-385649536,-1960443669,-422509961,775981862,1358579337,48538,-196704000,-990488951,-2144930722,1946159999,939468304,221850,-195116032,509734,-195116032,105351974,139954982,653287108,638207745,-15968495,429587062,-1006632959,-148443042,1965031431,9300227,50609795,-401705728,-1073019728,1187448693,-335544324,-262224776,38272806,522022,-14125808,-1207761866,-11530239,-1960442250,1385760327,-1675690160,-359677]},{"sector":14,"data":[-12778123,-993299201,-2144931746,-1005584049,-1960382370,-422509961,775997222,1048772608,1946157828,70713132,268744707,1354773328,520048720,178455452,202803459,70713091,268744707,112720,1354771280,-736166064,108461827,575130,-62485760,49120094,1562371467,182861,1167087646,518818645,-326903666,1996445192,153328134,-771031040,92018047,1929395261,108461838,573082,-149504,-2097115415,2113930878,108461842,608922,-129595136,200955529,-1207601726,1911291903,653811396,-2147481609,-14283916,2023370871,-352321527,-128007143,522022,639726656,-788367477,1895769830,147757614,1996423168,149330438,1996423168,154573318,787152896,653811396,-2097082496,197694,1996431476,163682822,922681344,79168260,-1070378992,-11513776,-1560044514,378077962,28836620,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,-11139348,-2019948426,184549381,2081783762,3947781,1996426867,170105352,28835840,9955584,556675,1996427902,168008200,1183383552,-61437446,91603467,-335544392,-94452614,522022,638940288,-1708099585,65535,653942468,-1708099585,65535,653942468,-553556096,41388838,-2094602543,1946168952,142016264,1592266384,-94452483,522022,639988752,-16707712,-1207761866,-11530238,-1960441738,1385760327,-736166064,142016259,662426,-9246464,-16222465,1996487798,1042682,1593795561,-1962742397,1297948645]},{"sector":15,"data":[1426064586,-326898549,861296392,-1002837002,-561314690,-1960385583,1183395393,1958743038,161108006,-1996488700,1451883078,1181180,-6664110,-16776961,899350134,-16777206,1033567862,1174405130,637820612,2097313593,142016446,272282,142016256,74138,-1956684288,113401317,-1873273344,-326412987,-2082959842,-2141825812,67134,465060981,-1202708989,1344144150,503518648,-1404662448,1354256406,-6664192,184549631,-954698560,64582,1191117803,-59339780,548174464,1116402804,856222636,-6664000,-1577058049,111149318,-2090952703,-443874579,-884122337,1167087646,518818645,-326903666,-2091493626,1962935934,-18427,-164420885,-2096913729,-243463426,1178142091,-1962183418,60960199,-120457007,-2092562709,-471137081,-310157474,535137026,46812509,-1873273344,-326412987,-2082959842,1187448556,-1962934020,339544646,1029207040,1618214933,1946163517,1785114,473788276,1031369728,980746269,16777114,50897664,-2089358439,197182,1048774516,1962935044,50503963,50464511,91602955,-352321096,1354773250,763034,63611648,-1996240223,1183579206,-3544068,1996425334,-26106,-286588928,-1559869813,-1073020156,-1070397323,-1560081245,1187447562,-352321028,105286613,-1559734645,378077962,-957676788,-1705983949,95,-352073053,49120185,1562371467,445005,1167087646,518818645,1183570062,1981702,71108468,-350194672,142508839,-14584577,1520044150,184549384]},{"sector":16,"data":[2132114642,3947781,28839538,-1593054464,378209034,65733388,-2087075789,-443874579,-900899553,-1957363708,106874092,637945599,1589905290,172424970,168265766,-1962249024,1325335622,1975520004,75400160,-16091904,1589905998,130426378,1575324416,1426066114,-326898549,75399940,855997696,149658048,-1710983425,2177,-1034033781,-1957363710,351044588,51265155,855929856,-1200231488,1344144163,16777114,1975520000,-28915892,1187450112,-956300564,192070,15746759,-28930816,-1930279287,1183708246,-163149332,871913100,-62486080,-1191557495,1344144171,384845453,-26032,540868608,-1207602432,48955393,111394867,104760067,292880387,50609795,-1207601920,48955393,111394867,50635011,-1017256565,196636,16712879,16973979,67102,16973840,67693,16973841,68692,16973842,67637,16973843,68571,196628,65704,16979501,68790,16973869,68725,196655,16711942,196933,16711801,196934,16714585,196935,16712790,196936,16712851,196937,16714610,16974154,68215,196666,16714541,196939,16713891,196940,16714092,16974157,65667,16973893,66832,16973898,68115,16973900,66918,16973905,66865,16973908,66880,16973910,66259,16973912,68251,16973916,66286,97,0,1167087646,518818645,-327034738,1187447074]},{"sector":17,"data":[-2097151868,1962935934,24570115,503527608,-26032,1183383552,1975520136,571401,-26032,1996423168,7256200,-1706012007,85,-1996237661,-16525802,1874364534,1347590400,27290,60596992,60692105,-1199016193,1385758721,8362576,-1767702528,-1743353597,-2005467389,-1728001864,-1801826222,-1560281088,378078096,1996424082,13219976,-1706012007,169,-1996230493,-16518634,-893876106,1347590400,48794,64791296,64886409,-1199016193,1385758923,13867600,-526188544,-501839613,-2005467389,-1728000840,-392540078,-1560281088,378078184,1996424170,13482120,-1706012007,253,-1996236637,-16524778,-809990026,1347590400,70298,64004864,64099977,-1199016193,1385758934,19372624,-459079680,-434730749,-2005467389,-1727998024,1016746066,-1560281087,378078188,1996424174,1030280,-1706012007,65535,-1996239709,-2096902634,198718,244319605,-1207818520,1344144198,503529144,54376528,-2037559266,1343684324,1342197944,116378,1958742784,-460944099,-1202710786,1344144206,16777114,1975520000,112649,-1560082781,1187447566,-1962934138,-472807842,-2016943151,932,-2088352001,2081064574,55752938,-1070903266,1371033680,-1924129277,385803398,10532944,36018768,-2037579776,-2037776668,-1769144610,-2033713440,65250,-1631317269,-2030043426,-2144928034,-227213249,-18708737,-18964796,4161574,-2037521291,-2037776668,-1769144610,-1024852256,56342528,-1224781794]}],[{"sector":1,"data":[-1224737056,1522073310,-1924129277,1343663686,1342197944,237722,1975520000,9038083,-1985067379,1452051014,638184332,1949056896,-1975058676,646602436,1962950528,-1973500690,646596351,1965834112,-16520352,1589938758,1065363082,116683808,-1907978925,244338710,-1929271576,1343655494,16777114,-6664192,-1996488449,1950385734,-2040624197,-472783919,61128579,-1207602176,1022099455,-18827521,-18958593,16777114,-2040624384,-472783919,61114249,-343652609,-560020341,-561577986,1065363198,-887552,-2080447858,16704190,887686004,-2075751425,-1962742397,1297948645,503317194,1430622296,-1910575989,149717976,106873942,-1995994330,1187510854,-956301060,63558,-772252021,-1846813,-1962696009,1174535238,142016262,688289535,1996487238,55679738,1183383552,-992441348,-970586506,1191116800,-128021508,-472783919,61126655,33310347,-16382394,1177093750,-92864518,16777114,-62486272,1992611979,12985862,-62456064,-2080880897,2081093758,-310157673,535137026,80366941,-1873273344,-326412987,-2116514274,-1207915796,1344144228,1347469355,503538616,1518767440,-1202710785,-1706033072,65535,-1918220663,-1979753850,-1929423226,-939566954,61013062,1183531755,60960252,-120457007,2097154621,1488387901,1454833663,-1404662273,244338710,-1929363736,1343663174,173466,-60912896,-1631320183,-2030043306,-2144927914,-227213249,83641987,-11100476,4161574,1183560821,60960252,-120457007]},{"sector":2,"data":[-1962742397,1297948645,-1873273141,-326412987,-338129378,1065362971,639530028,1948270464,172424984,-1006138842,1191118430,126363142,638213828,1962950528,106874076,509478,-1962520833,-2144991650,74791487,509478,-1962742397,1297948645,503318730,1430622296,-1910575989,250381272,-1710328065,1249,-1980348791,1589966934,1200301814,-196703992,522022,184841480,-15829568,-1248194954,-1207959548,1676279804,-161561599,21987366,242679560,331418,242679552,16777114,-230258432,58572811,-1962851863,999884870,1912802326,990279491,1979910662,242679611,387994,-163149568,-2080876919,197694,922724724,62391044,28856336,1183535104,919030,520048722,1996424092,101030414,-55050240,16050623,-1710328065,65535,200427145,-385647168,922681570,62391044,28856336,-1070903296,520048720,178324436,201722627,-1587907581,378209034,1183384332,-61437446,-1946532213,103545942,370869002,-771030260,91372407,1934499901,51028276,51119627,1996434292,-214796,-26032,-1073020928,451478389,242679807,16777114,2144471808,1023769791,-1200422852,-335544904,70713195,268679171,1354773328,520048720,2122515412,326434822,-15829249,1996426358,142016266,16777114,-15602944,1996426870,175570700,-1710721281,65535,-1947056503,1178142790,-14518798,-6680970,-1996488449,1451882054,1958874104,-161561584,23560230,242679799,16777114,-230257920,-1962742397]},{"sector":3,"data":[1297948645,1116874,3277059,65537,92143619,10158335,75235587,1179649,77529347,1245185,93126915,1310721,2228483,3080193,4194563,3276801,23920899,3801089,41877507,21889279,41484547,4521985,65077507,4587521,52560131,4718593,25231619,5701633,96796675,15794431,98041859,15859967,85721091,16122111,79495171,16187647,1167087646,518818645,-326903666,1187468816,-1962934030,2013203550,175570690,-16222465,520029814,1183384536,2126515186,16574723,1183439095,1958743026,207522571,1200209971,71796998,-15966581,1183646327,-11528460,-1962680290,264697840,-1961987072,2013203550,112642,-333512880,281474819,-2147191786,-142544050,1946681542,-870383799,-96040701,-1946397047,1200295006,105319172,1183524212,71773178,184964891,2133294290,983055621,1317019762,1586200819,-1983892724,1200162375,-1961891068,1183517790,-61436934,-1996208247,-956889513,1869873408,720651914,636015076,1451884545,-1309267212,-2115316989,184549858,-196179262,123265,1265942795,63708927,-1980086647,1586232406,71797516,1946568459,-96040166,453265195,-771029417,92219772,1924122685,-212959198,-1961759872,1183517790,-61436934,-1996208247,199951959,856448651,105351616,-1962653815,-2090929594,-443874579,-900899553,1478361096,-1957345904,-661774612,1444998275,-16222465,280495734,817385472,520048640,-259325040,1962933309,-49901]},{"sector":4,"data":[-167048844,-4714627,-1202525185,1307262976,-335545416,1183667784,-11528476,-16524258,1996425334,-465138426,-1427615722,1958742784,-465138419,520048662,-1073019920,1085851765,146296832,-6664192,-1996488449,-661921210,855799689,105351616,-1962653815,-310157629,535137026,80366941,-1873273344,-326412987,-1948742114,1950352966,108954374,-1207601920,367788031,-16359797,520028791,1996424144,-26106,28835840,49120000,1562371467,182861,1167087646,518818645,-326903666,106859268,855799807,520048832,1586168812,41418502,1342179256,65281791,-1962742397,1297948645,1426064074,-326898549,1187468860,-956301110,62534,385238669,175570768,-1710721281,65535,-756085,2055271494,-193658634,-957057397,-16714174,1988883534,-163395852,57391162,1183666206,-1202710794,1344144234,382486157,2668624,-26032,-1073020928,-1070398091,-1929302295,1183435846,-933851962,30033607,-1005327616,-2144942498,125119551,509478,-3520769,1589954118,1065363142,-991660800,-970587042,638651975,319768518,223313958,-867791615,-1933162871,1187498070,-1962934028,1178192454,-385647372,1589903575,1065363142,-1959234560,-1072958394,20781428,1027437568,1769209858,1946157885,277886,-1897331851,-15144192,1996474486,-401698618,-259325782,125105675,637820612,-1006536823,1191167582,1065363142,-385649408,-269811583,650534596,1953382272,1065362950,839152974,-1005196352,-2144942498,108293951]},{"sector":5,"data":[1329561638,28312693,45089515,637820612,-352041080,-931725378,-1866041601,5302286,-166989685,1589947764,1200104964,-995824893,-2144942498,74789183,49004594,1589904048,1200104964,-997397755,-953809826,2119,172476198,-2144993280,638061647,269242240,-36631,518648902,-443851009,574045,1167087646,518818645,-326903666,-62470396,384499712,-150992200,1183448174,126494460,3157400,-244223,1589904966,1065362950,-1948158720,-310117306,535137026,80366941,16973828,65975,16973829,66050,16973831,66206,16973882,66148,88,0,0,0,1167087646,518818645,-327034738,1448542434,12863175,274631424,1149974411,911510324,-1982183799,2089540694,38112050,-991279479,-1960388002,1183390023,-1996125280,-1960387002,-2037836217,1166802770,-465139441,14960375,-1205963774,-11534335,1996483190,34642592,1183383552,81360,1187449981,-352321072,-800667899,1183514624,67118564,-1952168311,2483270,579242248,-465138689,-1995440091,1979699782,251783172,-5618039,-119011723,1350994190,-1438217217,-11499989,250210384,-2865527,1358909622,-1995292184,-1946201978,-2043958714,-397344944,1183387343,-834222124,-1070923776,-1984018807,1183431750,-1203336774,651845316,-2011347062,-1977158074,1183325767,1200236224,-163184097,651576968,-2011150454,654269574,706234250,75236,-941603191,55366,1347469355,-10849025,-6662028]},{"sector":6,"data":[-1996488449,-1072976826,719913845,276233988,24746576,1183383552,1975520174,68151555,-1206880513,-1706033139,65535,-2083764599,1963081340,276234034,-11111169,-6663052,1375731967,-26032,1183383552,1975520250,63301891,1343256319,16777114,-62486272,58048523,-956060951,115782,-1992407925,-2098595770,-1983894781,1183425094,-1639544378,-1950988663,1183403076,105286626,-1950202231,1451952198,-431585014,-991406455,-1977162146,1317439495,-163149057,-11631048,1183451506,1317419200,-1979222273,-2037852602,1183514446,1317415158,-528579585,-1978240000,721374878,-773598721,-631372829,651970190,-348829813,-631323641,424119078,-361300144,-1700759809,687,-372750711,1149960741,-901346990,4750467,-2037766796,-2043084964,460717902,21644427,1150011974,-498718386,14843523,1191119231,1346669514,-1948159,1996427382,-25910,1183383552,-1031896118,-1000770560,-1977162146,1183318343,-163149132,1924417080,-1069118968,1991525944,-700020218,-1967896952,1177089606,-528579660,-1978305536,-13978530,-472783919,-1898291709,-1960387514,132855111,651845316,1343833995,-1411329,-6643594,-1996488449,99347526,15484615,-965280000,-4819201,1996477558,-327745592,-2197761,1996474998,-1505325616,-2037559274,1343684436,-2096742424,1963063422,-934900881,63981059,58051142,-16725783,1996427382,-629735460,51267211,-1957649850,1174604870,-2037755746,-466944178,-361300144,-6260993,-1224745354]},{"sector":7,"data":[-1224736942,1996488528,-797507640,-5998849,-56650,1996477046,1421771722,92012799,-352321096,1354771202,-10582387,1183666198,-397404456,1743455938,968377995,2113885318,1418103559,-1203336705,968509067,2113885830,1451657991,-1169782273,968640139,2130663558,1485212423,-1136227841,968771211,2130664070,1518766855,-1102673409,13532803,-2037702283,1183448916,1451658222,-263812609,-10975605,-1947056503,-1979753850,1187509318,-2097151538,1946206846,-1505326217,-1949940087,1183426630,1354662838,578027775,-3770625,-1694543690,1055,-4819201,-1979756362,-1694556026,1039,-14645757,1183515627,-1572435514,-11485565,-14519296,-1224751498,-6619312,-16776961,-1224755594,-2037776560,-6619362,721420543,-335602042,-1236890877,-1969338743,-2037861306,1183579982,-934901268,-1947842817,1325384262,1958742978,-36771581,49839747,-1830222988,242679552,-1928562945,1343680070,51267211,-1957640634,1174604870,-2037559114,1343684436,-1914800385,1343666246,-3508481,1996476534,-1435041884,-11487489,-1915455745,385819782,-1337553584,-2037559274,1343684420,-1962205720,973031558,1962886278,1250331495,1183201791,-10652417,146280566,-6664192,1342177535,319898,276233984,-14383475,1996443670,-25936,1996423168,-1401487600,339354,-2094142720,2080561278,276234018,-10582387,1996443670,-25896,1996423168,1585876240,-11528449,-6629258,-956301057,55366,-2080878849,2080503934,-59381501]},{"sector":8,"data":[37649539,1996428149,-59310320,347034,-92864768,349082,276233984,-1697876225,328,-15698177,848998006,-16777215,-6640522,-1962934017,1600046150,-1962742397,1297948645,503319754,1430622296,-1910575989,-1964211752,-1957275904,931860062,-1959508853,1183397460,-531199522,-1993194357,-661926330,-1996339317,1589964358,1200301790,-1337554663,-1949409653,-498693881,652107403,-1995028597,1586209350,256347086,-135772535,33613894,28843636,1996443648,-1334378514,460954,-666466048,2097152317,-666450164,99287041,14173895,-398030080,-1996226523,1586213958,74973134,-1995857176,1586215494,108527566,-1995860248,1183555654,-1606014022,160032848,-2472311,-397369226,1183386850,-1169781856,1352681003,-1995869464,2122570310,594870280,1183432747,-1706653290,-1952954743,1183441478,-1773761124,1996443670,1354771360,196995152,-956124951,54854,12863175,-968440064,1187446784,-956301112,51782,652107460,-2011347062,-1977157050,1183325767,1200236236,-96075233,651970184,-2011150454,-1977177018,-467003321,-1996488411,-1070865338,-1984805239,1183436870,-1035564626,-1991490421,1183573574,206998282,-1981135223,1589963862,126494442,-1969338744,1178139206,-1979157858,1178127430,-1979287906,1183374406,-96040290,-2086779352,1946215550,-1635874028,16770945,-405674031,652107460,-348831349,-564214777,424119078,-294191280,-1699711233,1956,-372095351,1149960593,-733574830,4750467,1183458164]},{"sector":9,"data":[-1639565140,1149967221,-733609654,692995211,2122573382,159318246,-1949022465,1174491204,242679782,-1697351937,594,-2083240311,1946159230,-362888104,21465638,-1967110520,1178139206,-1979157824,1178127430,-1979287872,1183374406,-96040256,-2084551128,1946215550,-1065448684,16770945,-405674031,652107460,-348831349,-564214777,424119078,-294191280,-1699711233,94,-336574839,-263796987,1996423168,-1032388656,-2459905,1996477046,-495517712,-2853121,1183701110,-1924131146,1343661126,-1962849304,1178190918,-1962508892,1183425606,-968455228,2108048953,-1505326330,-1949940087,1178191942,-1962508632,1183426630,-901346360,2125088313,-1438217466,-2083895671,1962989182,-1538880739,-1947056503,1183426118,-1471771660,-1946794359,1183427142,-700004360,2122514433,1752432648,-1984543093,1183567942,-1035564616,10518147,1996430452,-1602814000,558746,-1032388864,-1952418049,142187256,-956104704,1183515627,-1304000048,10518147,1996430452,-1602814000,258202,-1032388864,-1952418049,65051384,-953483264,1183515627,-1371108926,-2000664950,1183555142,-767129104,-1947580673,1325336646,1958742792,-27072253,1347469355,384976525,-797507760,-1916635393,1343661126,-1914538241,1343669318,-2853121,1996478582,-1166606412,-6260993,-2037523850,1343684470,381437581,-1773761200,-806858730,1216119558,-2096335872,1946158718,-431584506,-1957935991,1177263174,735087512,-1706128448,-1953083861,-2090901823,-443874579,-900899553]},{"sector":10,"data":[-1957363702,373722092,359972875,1946387517,117980541,-1942139788,-385649398,-773259091,140428288,52053643,1174606918,239469324,-1962440410,-1993992122,1589903943,130491908,1183514624,205914900,638469635,-1006352503,-953809826,583,638600843,-385464439,1589903504,440830728,722617899,1177226310,126428686,639125131,-1006483575,1183515742,651753230,1183516553,205914900,1589951979,440830728,-1962440410,1177229382,239479568,38242598,-1962647868,-654897594,38242598,638600843,-1006221431,-953809826,-1962934265,1174606918,1200170508,-1004016892,1183516766,126428698,51922571,1174605894,1200170510,73319426,38258470,1183514624,239469328,-443825685,1622621,-2081649835,1448556780,640310980,18368502,1183458676,-773576156,65065440,96636099,1183383603,-698971692,651452100,1183385483,1200301784,-1977357564,-467000250,1174659281,743869226,-1996475643,1451872326,-799095598,-1995994330,-1960388538,1177223751,-163149352,640310980,640370571,53303179,1183438918,-396981786,377454886,142540928,461340966,92143744,-352321096,-1983894782,1183571526,-297367274,15629955,1374225277,-163149054,-1948629367,1452009030,-230258200,737433225,-532248128,-2081798519,1962990206,35645699,14581379,12062068,-1207178368,1177092097,-1195250706,1183448960,-562134070,-1005816832,1183052382,-1960443150,-1005917433,1191178846,126494450,1005620120,57985606,-2097086487,1946214014,-228670452]},{"sector":11,"data":[49432195,-351827162,-228670454,653412095,26740618,2122574406,208928990,-2081268028,637727302,183175051,-893244,-1977159098,1174509575,-361300000,-14518529,1889149046,-1996488693,1996488262,511115232,-1709410561,3138,-1946663287,1178148422,-16550408,2122577998,225706004,723404427,731510854,-336014910,-1950340350,-25295880,-1147389,2122526326,477364250,444006231,779162,-126419200,-1994754305,-711275962,50331659,49007174,1174652811,2122534952,477364250,444006231,827034,-126419200,-1994754305,-1868904378,721420300,65783878,66602635,-11524538,1996425846,108461832,-402360577,2122516263,91488478,-352319816,243715,-371571159,1979842233,-562134038,-1005816832,1183052382,-1960443150,-1005917433,1191178846,126494450,-532282984,-1411329,1996431990,206805536,1183383552,-529072130,-14780673,-845538186,-1996488699,1183578182,-129615586,1325335413,343835640,-1962052608,1177230918,-1037329928,49019089,-125059029,67010051,1996484222,444498734,1461482496,-1709541633,3270,-493825,1183390326,213424842,1174601728,-1962742838,675677127,444498768,1461482496,-1709541633,2142,-493825,1183390326,139565768,1177223168,-1962677304,1174665286,1996443686,142016266,-16353537,-1511521162,-562134266,-1207536640,535363588,178431,-2080433687,1962940030,-35395325,-384416117,2122579424,158662674,1080963,2095645557,209617666,-955223040,56390]},{"sector":12,"data":[51922571,1174607430,-1961956594,-654897594,-1948498295,1174607942,-263812842,640310980,-16222209,1996430966,224762396,1183383552,310281210,-385649408,45613341,1996443648,477560606,954010,-465139456,2097152573,-465123579,1988820994,-462027782,2082371129,-339309820,507939587,-2081667447,1946162302,507939597,-1712568789,-120470997,-1070923029,-1948023,2122526326,544473114,64767627,-11476410,-191227274,-16777203,1996483702,-1694987494,3559,116115203,64767627,1174659654,2122534952,544473114,64767627,-11476410,865737334,-16777202,1996483702,-1694987494,3622,65783595,65816203,-11524538,1996425846,108461832,-402360577,1988822295,-495582224,-2094106881,1946163838,1996445210,240753178,1996423168,444006380,1285224587,50331662,-1962742841,675677126,444498768,1444574208,-1709541633,3809,-1280257,-125101450,972442,-339268864,-330921213,1344685571,-16091393,1996425334,74907398,-2096819224,1962938494,17950979,640310980,-16091137,1996430966,190814748,1183383552,-96039940,-771996117,62495200,-1946552576,-59374608,-2081655159,1946162302,507939596,731498027,-336014910,-1983894782,1996481094,444498734,-1960938496,1174658118,1996443874,252680730,-11141120,-125101450,984218,-339279104,-599356666,65160707,-2091898810,1946163838,-599356642,1357006339,-1709541633,3917,444006230,1083897995,721420303,-1962742841,642122694,175570768]},{"sector":13,"data":[-16222465,1996424822,66971652,66090635,1996481142,444498734,1444574208,-1709541633,3955,-1280257,-125101450,1009306,-339279104,63343362,-2091898810,1946163838,1996445210,196844058,1996423168,444006380,-1382352757,721420299,-1962677305,1174662214,1996443686,142016266,-16353537,-102235018,-1956684285,750935525,-326413056,1853949419,-2129784828,235930750,99349629,268715649,75399950,-1946846208,-443874234,180829,-2081649835,1448545004,185616011,1025144000,58000260,1023524329,58001160,1023511273,58002060,-352198167,73319482,640697995,2122516361,175374358,-1725938037,-120470997,-1070923029,639786692,50611971,1589913670,1200170500,776375044,38242598,639649283,-1006221431,-1960442786,1183385159,1200301818,-28931838,-1995994330,-1960380346,1183384647,-11335940,1996427894,779550512,-1929265432,1343682630,-15567105,1996435574,28174382,637820612,1589905291,126428684,637820612,-1006483573,-1993995170,1183515207,1200170748,-28931324,105351462,637820612,-1006352501,-1993995170,1589905479,1200301572,207537158,172460326,653805195,-1962129527,-1993934266,1589907015,130491912,1183514628,-2068211436,200931075,-1962052142,-140963258,1976699897,20048131,637820612,2147420103,71812902,-953778176,2147418695,105367334,1187479552,-2097151754,2080700030,17426691,-772383093,-991702557,-1960440706,73319473,2117548326,931735043,-772383093,-991702557,-1960440706]},{"sector":14,"data":[73319473,74922278,-1993997187,2123039863,-773336586,207537383,40995622,637820612,2114090809,2005476868,-159479038,-405674031,638344900,-1006472821,958792798,75302519,108497190,-336181505,377389962,-1962249216,731455558,-336014910,-994039038,52832862,1174602823,73319472,-1006139098,-1960435106,-25695993,-1962647868,1174613574,1200170528,576635906,38243110,-1004124669,-1993997218,1183516231,126428720,1474179,1183527284,-1037330144,703330513,-1962647868,-1993986490,1589903943,1200301602,642122502,637820612,-1962522743,-1993985978,377389831,735016192,475972800,71762726,-1003469309,-1993997218,518587463,-1956684034,784489957,-326413056,1460726915,173982806,725060390,-1960442250,2116747903,142508804,1444574208,-1710721281,4708,142016343,-1695136119,4696,-336181757,63343362,1183385158,142509048,1444574208,-1710721281,4765,142016343,-1695267191,4753,-336312789,63408898,1183384646,173982970,74943270,637957675,721846155,2122515582,443809800,142016342,1230234,1996445440,-230258424,1227162,-230292736,-963968277,-1996077565,2122579014,443809800,142016342,902298,1996445440,-263812856,898970,-263836928,-947191061,-1996208637,1589968454,-129594614,-1962440410,-1993934266,1183515207,1200170748,-28931324,105351462,-443850914,705117,-2081649835,-1957297428,-1181154234,-101252220,-25038197,159252930,50742923,-339661882,105286405]},{"sector":15,"data":[-1956723197,79846885,-326413056,73319510,-2093511898,595329790,-15698177,1996425846,-90548728,-16777212,1996427382,142016266,637820612,194656255,-1006632955,-953809826,-1006632953,1183516766,126428686,637820612,-14272629,-773402361,140428518,638338699,1577205897,-1034033781,-1957363698,149717996,1988843095,209619726,637820612,-523171957,1174659281,173443848,-1980217719,1589967446,2000234232,637957628,1962835769,73319493,-786461914,65262051,1183713374,931735050,637820612,-14284917,-774337785,65262051,1183713374,2139694602,73319426,272597798,1996427388,-11053552,1996425846,-397212152,1600061223,-1034033781,50335246,17648128,53314048,-16300032,50402560,18039552,53676032,17118464,51515904,-15509760,50406144,16850688,50893824,-16460288,50340864,17121280,53548288,17089792,51557888,-15585280,50417408,-15582208,50417664,17088256,53432576,16867072,51272960,16868864,617728,0,11468800,34275677,57148090,79889429,102499696,125044424,147458079,169609587,191630020,213388306,234884444,256052898,276959203,297537824,317723223,337515400,356914355,375920088,394401526,412424205,429988124,446962211,463412003,479337497,494607623,509287916,523378376,536879002,549658722,561783072,573186516,583934589,593961756,603268015,611853368,619652277,626730279,633021837,638592487,643311157]},{"sector":16,"data":[647308920,650454703,652879577,654452472,655238922,-661903600,-1957345904,-661774612,1183568435,-2116515066,2114159851,117976376,-2125844098,2114390251,117976364,-661903893,-1957345904,-661774612,1183568435,58993926,-1958080130,-2064940584,755662339,58459912,-150803646,-1722330408,-150992199,-774337551,-1081397533,-1959919616,721420935,1364218567,16777114,-1178139904,1996433168,-1705947128,289,-1036821921,-310132181,535137026,80366941,196609,65840,11650,1167087646,518818645,-326903666,-1957275892,1187448950,721420534,108954623,1446016260,1342177720,-672657776,200838143,-385649153,727056627,244338880,-1979726360,1958742789,14805251,59152983,-13959168,-2097096983,1963263614,45635097,244338688,-1946181144,1979649016,12445955,243798,62441451,141358848,72125337,1183447543,243964,-1727369993,-150582133,-96040455,425603,2122523508,192807174,-1727380341,-134590837,721611769,-1949791296,-1952905148,-67634082,1317652483,-163148810,302375121,-6664192,-1962934017,1962871800,-62485668,-1962392183,1166670406,108954378,-1962576637,48958020,1166655531,38127372,1183580158,239438086,16154243,1183526772,1166625014,106859268,-2020875311,1166606616,-196688122,233504768,-772514165,272746467,1191182335,71666676,2096383545,1590135787,49120095,1562371467,313933,1167087646,518818645,-326903666,-1957275884,2123042934,172395278,-1995680117]},{"sector":17,"data":[1451882566,138841082,-990886263,1182992990,-1960443382,-62486265,-2096472437,637667910,1183385483,243106812,-1724156672,-150319733,1959922681,19261699,-14125825,79177332,1996443648,-92864760,-1946650881,1344155204,1347469355,507266189,1354771280,710708048,-384016385,1325334775,38112008,990266883,561314886,16008903,1444080384,-193527977,50480523,-397408698,1191117024,71666676,2096383545,-62485530,-1006484087,1182992990,-1960443382,-163149561,-2096472437,637667910,1183385483,139395058,16008903,-1954878720,1844966470,-1949791480,1844968518,734528262,1317604429,-2094797842,2113931390,173982757,34227843,-1995994330,1586230854,172393226,126559746,-899447,1183516750,-297387534,1183569277,-297387530,1183523196,-297387534,1586174333,-1914449420,1183387713,-2082960404,309722943,-1979955573,1443621639,-193527977,-386107649,1191116852,71666676,2113160761,-8656637,1946172803,905926164,-362753,1996486774,108462064,-2014835056,-2090901762,-443874579,-900899553,-1957363700,216826860,1988843095,142510858,-788111733,272731107,200689289,-1956086592,1844905542,-196703992,-134855029,1174603373,205859828,-1946663287,1183446598,71732218,50753015,1160508486,-62486260,-1996208501,1962933830,645201704,1342182072,1342177976,385369741,776244048,-1070903266,1150111824,726670908,-1957670720,1610558044,106859292,1103619025,1593835280,1575324511,503318722,1430622296,-1910575989]}],[{"sector":1,"data":[82609112,1988843095,-335598840,175570704,1149982550,105251586,-11605936,75249991,1015278463,-15895552,889129590,-1878624513,-3938290,-26026,1599995904,-1962742397,1297948645,132810,4587779,458753,12517379,367984641,0,0,1667845408,1869836146,1461744742,1868852841,1428190071,544367987,1702129225,1667327602,167772261,1145130828,1297369410,11489345,1145980169,1279347012,5785423,1413829393,1163018563,1229734484,1230261070,11027789,1413829394,1346980931,1380011842,1162434116,-1823324841,1279462144,1464161103,1329876553,201337687,1129596231,1397965132,1162690894,1393164346,1095649097,1330794572,335624771,1279871043,1313429316,1180127044,1347243858,1414416719,1393361087,1230459973,1464812622,1196314444,1225261192,1397641027,1447385673,1162282496,843274068,1393033534,1330009157,374560067,1145375488,1314346057,1330794564,318844227,1465140551,1329876553,1480938583,1313164372,642274375,1414728960,1128879169,1346653783,776163154,1330646017,1498633299,1381123411,21123663,1162170379,1397050699,1162297683,1343094893,1096045391,1162694736,1195463507,151024709,1297436229,1347375696,318774099,1414743364,1415139154,1464554305,1329876553,1093817175,1380321537,1380273473,1398031173,1380125184,1163149637,1431192909,1393098903,1230263365,844252493,1192034632,1230459973,1464812622,1146244951,1124860037,1413563730,1313429317,693587780,1313148416]},{"sector":2,"data":[1162625601,1431192909,1296389193,1191837851,1279546437,1163151687,369122125,1129596243,1163284047,1230459986,1464812622,1195984200,11293768,1413826319,1414418243,1112297298,1213420882,1225261382,1313429331,794251076,1163069696,1381319508,1163022163,1163068928,843274068,1376321855,1095060549,1128547667,1124991044,1380009292,1296912195,1095062082,251712331,1414745936,1414092113,1397966157,105203521,1229457664,1094927684,-1504426670,1480919808,1230459977,1464812622,167772755,1397966157,1111836481,88143,1414744339,1497517911,1212368212,1380995649,1481197125,1124794419,1413563730,1380008773,10703941,1146115340,1464161345,1329876553,167803991,1145130828,1230132307,11552590,1163019027,1128617025,1163284047,1230459986,1464812622,1326252202,1129203024,1112557900,1146241359,1191510153,1128551493,1191968834,1230263365,1329810243,223628885,1163070720,1313429332,1465339716,-2042342833,1162283776,1313429332,1146572612,167789379,1145523268,1229738569,6575187,1431257877,1279480910,1329745993,1178882625,1095586383,9392980,1229018891,1397050708,1162297683,1225457776,1464749891,1380992078,20005711,1413826318,1381127491,1414811205,256200009,1398082816,1180652101,1380340289,742739265,1313146625,1313164612,184597333,1163023177,1296389187,1264145488,1162284288,1397050708,1162297683,2001948496,1163003904,1329808449,13389133,1330397966,1279477075,1329745993,-1975233983,1162284032]},{"sector":3,"data":[1095517012,1330402131,8603470,1413826321,1297307987,1279345743,1145981271,12408655,1095910411,1313164631,1380008533,1342767264,1414416705,1413694802,1292501317,1162891097,1297040206,167827533,1497453127,1230132307,12142414,1279870472,1128616524,167792980,1397114447,1163023429,5067843,1397050635,1162297683,1346716994,1292566632,1465208389,1380992078,20071247,1095715848,1329809732,167816782,1145130828,1397904707,11358799,1413826317,1431192909,1230132307,10569550,1195725325,1163154249,1095517010,3756883,1413826316,1296912195,1413567571,234932805,1398031699,1163154265,1296651341,741957,1229867271,1347436884,1192034309,1498633285,1296389203,1431192909,1225457820,1095517774,1163019604,5133379,1279871754,1296651340,1194480197,1397035521,1162887491,1296912195,1129207110,1313818964,1377108182,1397311301,1465009492,1329876553,1397050711,1162297683,1225719926,1313429331,1448562500,1112101705,3229004,1313166091,1397050692,1162297683,1158348911,1464685902,1329876553,3560279,1095715848,1313164612,201365077,1129596243,1397965132,1196314444,1141375108,1230455122,1414418243,1162087680,1330795603,1313429337,894914372,1163071744,1398362964,1094995789,1313429324,-1135128764,1145114624,1414747466,1145981271,1163024207,6706243,1413826319,1230259009,1230456150,1464812622,1158152252,1095779406,676613705,1162087424,1330795603,1380008793,10769477,1279870474,1313429324]},{"sector":4,"data":[1146572612,1162284033,1297040212,1381123405,13324879,1146308882,1430406988,1313821780,1128613955,1648641355,1163070464,1297040212,1096045389,13190484,1095914512,1095521102,1162691924,1195463507,167801157,1414418243,1330791251,20335692,1296388618,1346721359,407916370,1094913536,1112819026,1263421772,1129271888,1191838007,1162695749,1195463507,234908741,1398031687,1280266819,1312903756,4277575,1329809679,1296125518,1145984837,1129271888,1191838016,1431524421,1313164610,234921813,1128613955,1196180555,1414812994,6377039,1313424906,1313429316,844582724,1312884736,1347375193,3428437,1397048331,1498370644,1431192909,1342701720,1380862292,1280590661,1162285568,1296651348,1163022917,1431064403,1313818964,1376649230,1095060549,1094927699,1381323856,201331525,1279874370,1297040196,1111704653,1192034517,1347769413,1163149636,1413694802,1393295550,1498633285,1280262995,-1252830641,1162285056,1229734740,1095713360,1094992978,9322836,1413826316,1396788291,1380931411,201359684,1398031687,1280266819,1397706828,1393492031,1128354885,1163282772,1145981271,3888975,1163019020,1145394241,1330397513,151017799,1330204245,1128616526,167792724,1346980931,1397904707,1069647,1096241935,1431260496,1430406483,1313821780,1158545594,1498697805,1346980931,1380011842,251693892,1145981271,1380341583,1330662735,508841545,1095568640,1095320656,1380405068,1733575493,1229458944,1163151692]},{"sector":5,"data":[1431192909,1296389193,1124663458,1163087692,1296912195,1325924559,1229866320,743329603,1129516032,1280069458,1145981271,4020047,1413826313,1163018576,3036238,1413826320,1414748499,1162693957,1128878676,369144659,1129596231,1112557900,1146241359,1297239878,1095652417,9585997,1279350283,1413563465,1313296965,1393426560,1129534533,1280069458,1196310866,251674693,1229214537,1196379201,1397966157,1514489665,1329793024,1163024720,4871235,1413829383,1413694802,1393295432,1296322117,1095979845,942818631,1212353793,1296778053,1230327365,-1706212012,1229654272,1230261324,206718285,1313149952,1279479125,1329745993,1178882625,1095586383,9458516,1413829392,1346980931,1380011842,1413563460,201362753,1129596243,1397965132,1146244951,1393295490,1129534533,1280069458,1045647184,1314196736,1129596231,1129139535,-732806840,1381435648,1128617033,-850571953,1397295104,1313817417,2048841,1313164557,1163151701,1096045389,21579092,1329744910,1280590680,1346653783,860049234,1347356673,1329811013,13126989,1397310479,1129595216,1397050696,1162297683,1476853874,1330926403,20665156,1413829386,1414545731,306532949,1162285056,1297040212,1163281741,1095586894,13716307,1413826311,1347375696,1124991001,1431326031,1413563472,1128616517,201407572,1229734230,1163149636,1413694802,1141702783,1230456389,1464812622,1129271888,1192296555,1279480901,1329745993,1329877569,1380273751,1393623180]},{"sector":6,"data":[1129795400,1163284047,1230459986,1464812622,1393164459,1465339720,1329876553,117451351,1297368391,-1655353787,1094913536,1230457932,1464812622,1129271888,1175126138,1213415756,1145981271,6903631,1129531674,1112557900,1146241359,1297239878,1447121985,1095518529,-1052423102,1397296896,1145981271,1313167183,1162625601,285221700,1397966157,1111836481,1314347087,1330794564,335623491,1312903764,1413565523,1128481093,1380273221,1380930625,1393098930,1129795400,1413829185,1393295527,1163023429,1296389187,1230591056,1162284288,1229734740,1381256773,559170373,1163070976,1313429332,1398230852,1263488840,1225654393,1279350350,1413563465,1128616517,302021972,1146373447,1279415631,1229734725,1230261059,1393997,1196180492,1397901636,1128614981,251683668,1280067915,1414748499,1230261573,-1236122291,1163071488,1297040212,1163281741,1095586894,13650771,1413829383,1347375696,1342898202,1297371983,1095979845,7226695,1413829384,1162692948,218106450,1163087433,1162691662,1195463507,117489733,1297368403,-1638576571,1163004928,1297697872,1095979845,7554375,1413826316,1397904707,1330664015,150999379,1398099014,1297040200,302045005,1145980243,1229409348,1296909652,1095979845,6636871,1162363664,1095912259,1112492356,1330926677,167796814,1229407554,1229017166,2577486,1413826317,1229409348,1229800788,6247502,1414873613,1464749908,1380992078,19874639,1330139914,1381319511,1196576595]},{"sector":7,"data":[1381240832,1297305153,1329812553,1212370253,13521473,1095254794,1296385870,-1722462651,1163072000,1431258196,1128614978,1262700876,1162692948,1141374996,1415004498,1431590981,1397294848,1279871043,218116164,1465140551,1329876553,1128616535,184557652,1129596231,1413829185,-1219276976,1313148928,1212370261,1464093769,1329876553,3625815,1413829388,1296912195,1095062082,201380427,1129596243,1330860629,1397706834,1124925510,1296845889,1229342547,1380275276,1141440635,1330397513,1481589319,1141833815,1111577417,1162822988,1497451597,283205,1448037642,1313429317,945246020,1129516544,1313162578,1279479636,1414415689,1124991005,1313163596,1397707860,1162170947,218111054,1146373459,1414088524,1313426757,268459604,1145130828,1162036033,1095910732,1397903188,1158414513,1279410510,1313429317,576147268,1313148416,1162625601,1280132431,1380276545,1124925443,1431326031,1413563472,1313296965,1393230141,1094931525,1347700050,10834767,1397706764,1397050708,1162297683,234961202,1297368391,1095979845,1230259527,7882061,1413826317,1145981271,1163155279,2380888,1413826318,1229409348,1414350164,1565808709,1498614528,1396787283,1246642507,167819337,1163284041,1163023442,5395523,1413826315,1129535827,1380928591,1393098932,1145984834,1129271888,1192296752,1094931525,1112819026,1263421772,1162692948,1192362153,1279480901,1329745993,1447318081,1163347273,184587346,1263813959,1414748485]},{"sector":8,"data":[1782928449,1163007744,1414744391,1279480389,1329745993,1178882625,1095586383,218141012,1465140551,1329876553,1313819735,218138439,1096175177,1094994252,1196574036,134250062,1179927879,1398096719,1108344855,1196312914,1145981271,1330927439,760237908,1279527424,1145984839,1129271888,1225589044,1380275278,1413694803,1413694802,1191903311,1162695749,1195463507,21180997,1413829389,1145981271,1163155279,2446424,1095254804,1128613710,1112557900,1146241359,1229015107,234919246,1146373459,1414088524,1163152709,6050904,0,0,0,0,-2081649835,1448548588,-1710983425,773,-141821813,-15939965,28837494,748310528,-16777216,-1207717322,-1706033151,481,15353543,26667264,1612973194,863313980,1946224118,108461870,63452927,33178,108461824,721831051,1342471686,-11485141,-16482762,565708405,15776256,-1533390766,-2097152000,1962937980,108461874,63452927,96410,108461824,-1962511105,-120518588,1342456835,-1207274241,-1202716671,-256245727,-1706012160,404,-167698967,1148454916,1946224118,138709823,72484395,200296073,-955941440,61510,-16353537,-16528842,-16495050,1183516276,66638320,-11533244,-16494538,721703478,-1202696000,-1706033151,65535,32261831,604277248,1963015171,108461878,63583999,-1157627976,1347616767,-768882805,-1070870389,1347602059,1342177720,-16354049,1962869876,141885194,16777114]},{"sector":9,"data":[1975520000,-955913373,60486,-16353537,-16516042,-1711015370,65535,-16353537,-16519114,-1711018442,65535,1460041471,108330838,-402361089,2122514608,678691052,-16353537,-1710927818,608,-16353537,1962870388,175439620,-1207405313,-88473463,-1706012160,65535,1954546934,-230257365,1962889238,74776326,50742411,-1957688764,1141048388,1067077640,-16777213,1183647350,-1706027278,65535,-15677821,1166797382,-364496630,1609106301,108462078,1342177976,16777114,74907392,253082,-1956684288,113401317,-1873273344,-326412987,-2585058,1996426358,142016266,1347469355,-2097148952,-443874579,-900899553,-1957363704,149717996,-167223669,58000391,-1593796887,1183384498,205929466,-1706028427,65535,200951433,721778112,9365952,-1878493441,327411726,-1979955575,1996488278,140413946,-1710327809,683,200820361,-12290880,1586170998,17298954,1352729972,-1593447676,-120519600,50880139,-11532729,1996424311,-25755652,737834751,-1202696000,-860225504,-1706012160,65535,-362753,-6621066,-1593835265,1178141618,-14912244,-6620554,-352321281,209125138,-16091393,1996425334,74907398,-1207819032,-443875327,705117,-2081649835,1448547564,-1962647925,1586168391,541534984,-1947318647,126551134,721968779,1183391303,108462060,16777114,-1946645760,214336503,-768313,140413951,607340426,1971338432,73370427,-2146809866,1183658612,726669046]},{"sector":10,"data":[-4697920,1979666687,105220872,-2053484480,-1929379837,1343682118,-1149185,-1785009034,184549379,-949848896,-68538,15746759,172329728,2112898617,-163148464,1962889238,74776326,50742411,1346374212,50611339,1346373700,16777114,-163148544,1996443670,-327745554,16777114,1958742784,50656788,1187448692,-335544588,-263812305,-336312695,-263782617,-351222141,142016424,-16490869,939459191,16777114,212224,100010613,-955943679,-134074,-1710852353,65535,1593067147,1575324511,1426065090,-326898549,1996445204,825864,1183383552,-2082960386,1946159231,109019910,-15829760,-1070921610,1347440720,16777114,173968128,540231670,1200295028,-27358432,-1996077269,1586168902,138906622,990266883,2114260998,84975881,-1995946197,2122516038,92078086,411335,75399936,-955941632,1094,384714381,108461904,-1962641665,1200356958,105251592,105352016,1342457347,300954,142016256,125338,-163148544,-1070903274,922701904,922682640,-1214642930,-1929379839,1343680070,384714381,-163148464,-6664170,-1207959297,-768901120,-1070903214,-2001055664,-11513216,1996484214,-230257680,-1947318741,-788234738,1354826721,737429131,100921414,726664320,-11513664,1342414902,-26032,-259325952,1575324510,1426065602,-326898549,-11118794,1183648886,-1706027310,65535,31082123,1586168902,243237640,-385649408,1586168065,17298954,1352729972,-1593251068,731448400]},{"sector":11,"data":[66638274,1183385158,140413938,-1995683957,1200354886,-1992278002,-1072968634,-823590027,-1706025472,65535,200558217,-385649216,1183514813,-1202708788,-1873805303,255191054,1183576203,-1202708788,-1873805304,254142478,-15992693,2117685876,-11701004,1996426358,74907634,516703883,-241543344,-1929379835,-969211579,1996443517,209125132,-1915986293,1344143681,-953432437,-6664120,-1962934017,-936642994,74907473,-1915986293,1344143681,-953432437,418074696,427095563,1978957369,209125140,-887041,1183515766,1448091340,400282,-196703488,2126920520,209125154,66471563,1342521862,-1962641665,1083034718,-1957683711,-970197946,-6664120,1577058559,1575324511,1426066114,-326898549,1589925378,931866116,38243110,1946288445,33701166,1048790645,1979646006,-1202301317,-11534335,-402638282,-1202713609,-1001390079,-14285730,-14284681,-1830287753,-2091259133,-16763330,-1202317708,-11534335,-402638282,-1073017905,113706612,-65482,3554947,-1003129345,-2128214946,33555071,-2128205198,34144895,-1960435081,883099207,1200301573,87466760,-1070901674,976682832,194111488,87341136,518224,1575324510,1426064578,-326898549,-1957275896,2123040886,-1427614204,-1070903285,204990544,112726,976682832,190703616,1459373705,990613736,91618374,-352321096,-1547687166,1187446842,-2080374790,12350,922697332,922682202,-396951504,1183447998,-59310086,542874,-28931840,1603000459]},{"sector":12,"data":[-754667262,-153615389,1946356807,-92372213,-955941888,-67002,-1694730497,2357,540230902,-1444347020,-92372224,-385647616,2122514592,58064634,-402614295,-11138776,-396886922,1183447910,2109737978,1007077211,1023410176,225837053,3802823,1187446785,-352321286,-286763476,105265930,-11132044,-396949898,1183447862,2109737978,1077838599,225771520,3802823,1048772608,1946157120,-92372218,1443986432,-1191414017,-397410303,113705728,64,16416387,1048783484,1946157120,1007077155,-16777216,-16557514,-1207947210,-397410303,113705801,64,113706731,65600,4210307,-402426880,-11138911,1996424822,780538,1577613288,1575324511,1426065090,-326898549,-1957275898,1996424310,112648,976682832,168683520,-1996077431,-1705968570,1014,-2080487799,13374,882969716,-28931840,-1996476255,1586232390,41368062,-991362187,876512000,359923712,56243967,3159807,1342177720,-16596760,-352101834,142016272,-1207535873,-397410303,1996423740,-59310328,8435798,-401698736,-167048133,-4717187,-1962742785,-27358266,184698761,-1955562250,-1312388101,65065732,214402040,1963984374,50722317,113707125,65596,113706731,60,3161731,-162892544,1165234181,-1207404801,-11534057,378208885,-1070923718,1347602059,16777114,142016256,-1560132213,-1957691344,1200293982,105186078,541559632,50611459,-397408187,1520696005,-955847933,15366]},{"sector":13,"data":[108461824,295322,-1956684288,113401317,-326413056,1460857987,-28915882,2122579967,159186948,-1962385781,-347600313,-1983894782,548991558,-163149490,-1946663287,78710398,2114185171,214401800,-1996077685,1166798406,-62486268,2123060971,-754667258,142476263,-1962096765,1965816950,-297366780,-1996077781,-166988730,-963967363,-259270409,16023171,1183516797,-1982269452,1983509574,-2095218954,1946219646,-129594601,2146715193,-196703473,-1980217719,1183577718,-28931834,-16222465,1996424822,133425156,990267017,-1770655162,1593722507,1575324511,1426065090,-326898549,1017206280,138813696,4064967,-1070923776,-26032,-6684672,-956301057,13830,175570688,742554,-96040704,1200347275,-129595134,-1710590209,2955,-15960321,-1070921098,9103440,983691403,-28931840,292864011,-15960321,1996425846,1354771448,2095582864,973522698,-956301312,12806,142508800,-2094566400,1946222206,209125136,1342247608,108461910,-352028929,209125132,1342247352,1354771286,151099984,1996423168,-26100,-1073020928,1586176372,860326412,1077723172,2139297140,259260468,880279379,737703679,244338880,1577719528,-1034033781,-1957363702,49054700,1074186070,-956301312,16791558,1007077120,721420288,1513503222,-399281149,922682784,922682202,28835888,1055412224,-1012992,-1711056330,65535,816037931,56271616,-16222465,1996424822,2091012,2122519787,242483206,-16222465]},{"sector":14,"data":[1996424822,780292,-963907445,1575324510,1426065090,-326898549,-950642938,64582,-1710852353,3176,1972107403,2096499458,-1310815476,-1948003580,1183387201,75400188,-15764480,1996425334,-1070901754,-401698736,1170671967,-254,1201276534,-1962934259,1600060486,-1034033781,-1957363706,49054700,73319510,74943270,38243110,1946222653,16923938,71124596,1025012737,125042949,1946224189,-1002443977,-2094660514,1964115071,-1005917387,-2094660514,1947337855,73319465,74972966,-286781808,200313604,-15895050,1996424822,-26108,183173120,112726,-401698736,-1956773881,79846885,-1873273344,-326412987,-2082959842,1448553196,3554947,-385649153,1048773345,1946222646,112645,-1070923029,-1292663,-1207933898,-11534335,-402638282,1183385095,1975520216,45607171,1023952523,1903427597,1967980861,1010729735,1702166528,-1697089793,1829,-1980742007,1187510854,-2097151758,14398,854077301,1958742788,874416936,41911040,-1961329408,1603006558,-754667262,-262274077,51136502,1187448180,-1593835022,1183383604,-16390,-1946526069,2122383991,1951072264,142508295,443893760,-335544392,1681325848,-663290112,3946239,1347469355,-369286936,28836393,-62486272,1023952523,1651769376,-756481154,1958742785,1785163,1048785268,1962934328,-226589946,-1959168768,-167746530,1948267335,943620871,678756352,-362753,518522998,1090030340,1206453108,-954864895,15366]},{"sector":15,"data":[1681325824,-663290112,1347469355,-54794160,-16559128,1285216374,-385875961,1048773049,1962934330,-663289877,3815167,1342177976,184725992,735671488,11004415,6561419,540231670,-135724172,943620864,1333067776,1962933891,-92864750,-59310250,-1946438936,57950456,-402597399,1183515388,-96040464,-1948742832,-11140489,787020918,1975925508,-663290091,3815167,1342177976,184702440,-385649216,-4194438,939968511,-2097151744,14398,-1746336907,-94467328,1208633227,1408648841,-59310250,-1962675992,-58817544,990150144,-2096464130,2097216638,2097036147,-663290001,3815167,1342177976,184681960,-1587710784,1183383610,-663289864,112720,32565328,-1577826679,1178140730,-12487432,-16751562,28891254,-1779937280,-196703236,1356351113,1100186,-96040704,-335544386,809403155,57999360,-2080446999,1946219134,-19076861,1459255039,-386107649,-125107347,58064443,-2080454167,1946217598,906413850,-16776960,-1207933898,-1706033148,3917,6567679,-16503064,-16751562,-396896138,1586231685,-1312322566,65065732,206042840,-1959758576,133626462,-953649919,16791558,1025960704,-1988868096,1967849533,-23271165,1967980605,-23795453,1968177213,-9311997,-939649047,14342,27977728,-1697089793,4233,15498883,-4715148,2147465983,244338770,1577061864,49120095,1562371467,313933,1167087646,518818645,-326903666,1040631576,-1962934016,1451951686,-297367288]},{"sector":16,"data":[-2114955639,1971322874,-49915,113717108,-65482,6567679,1342178488,16777114,1681325824,57534464,32130759,6594818,-337099127,-398029489,-1159180266,1044284406,57999360,-1929342231,1343678534,-1202667477,-1202716160,-1202716151,-1706033151,4012,200951433,-1927449152,1343678534,-1202667477,-1202716416,-1202716409,-1706033151,65535,695517195,384321165,178256,-26032,-1073020928,1048815477,1962999862,-92372072,-1919781632,1343678534,-335822872,1514046352,494141443,56237707,271796214,-1202515083,-1706033148,65535,56243967,16777114,-26112,1692991488,49120255,1562371467,313933,-2081649835,1187448044,-2097151746,1963000958,138840837,-1070923029,-2080618871,14910,512434293,1207304292,645138482,1077102582,1187455093,1392509438,1342177720,33155152,512429547,2139291748,108265524,-1993062517,2122579014,561316100,972965515,427034182,-16762205,-16751562,28838006,1307070464,142016506,1090970,-62485760,-1034033781,-1957363706,876512236,259260416,3159807,669850,872859392,-1962934272,1438866917,1048833163,1962934324,809403155,208928768,3159807,664986,3449600,-1962920799,516120037,1430622296,-1910575989,82609112,-1946801322,456984134,1998877696,212268,305995124,-350391296,1208008195,803980939,-347078466,1258340087,12514027,-1091703987,-387252197,-347274818,2440675,641591156,1037464576,-495714265,1946167357]},{"sector":17,"data":[1590553555,-1962742397,1297948645,1426064074,-326898549,727078668,1996443840,296720900,-467009536,-1962654071,2139817566,2113866498,175606532,108461902,112727,7071824,1183578251,-1311274234,65196804,787906,-939637111,64582,133617803,-1960217340,1077939783,-1946532215,1191180894,-1744336134,1039943305,-277610464,-11485141,-6620042,704643327,-62486044,956581515,74775622,-1586104517,956581515,91552838,-335544392,1590135554,1575324511,1426064578,-326898549,-1957275900,2122516598,276627462,294531,1149961854,132859914,65781803,-1996077429,1183579206,105251076,956974219,125568582,411335,-2096239872,2097153662,172264199,105285960,-1324974453,65524484,214402046,972834443,91555398,-351910261,243106568,-339774464,-1956684045,113401317,-326413056,-1962742653,1200293982,-28931788,359972875,607340426,1950366912,75399948,-2096139264,1946158718,142016265,-1996485400,1183579718,1575324670,1426065090,-326898549,-28915966,1586167808,860326404,1077723172,-593427083,-1961432317,1207305310,276039730,-1995290741,-1072955834,547423861,-28931836,-1946270069,46292453,-326413056,3278535,-6684671,-16776961,-1710880714,65535,-1979425141,-1071369401,611598396,-401698733,1996423354,18266116,74907472,-11485141,-402638282,726728523,-1706012480,2714,1342177720,660122,1575324416,1426064066,-326898549,2122536452,1148452870,294531,1187448692]}]],[[{"sector":1,"data":[-351997700,-62470395,1996424088,239442438,-259325952,-1946394997,1149829703,-1995994352,1200296516,38218502,-1961606007,1143669831,373590290,-1710852353,3824,1575324510,503317698,1430622296,-1910575989,1007077336,-16777216,-16751562,-1207933898,-11534335,-402638282,726728375,1347440832,-2081006360,-443874579,-884122337,1167087646,518818645,-326903666,-1957275890,-397015434,-125042999,58064651,1459671529,-1705983957,65535,1048836235,1962934362,-339727612,112643,-1980086647,1183446598,-196703748,15877831,860157440,-2094565952,17112126,512434293,2139292892,376766730,32786119,373195520,175440128,33179335,-62470400,1156972545,91496499,32786119,-1103742720,-955615999,128070,33179335,860129792,-2143502300,1156978037,91554866,32786119,-62470400,1187446785,1459618294,1357906104,-1695254785,5229,-266291113,-59310256,1342106,817387264,1996443888,344431350,-1202257920,-11472800,-1801784714,1459617812,1357910200,-1694861569,65535,-310157474,535137026,46812509,-1864856576,-326412987,-2082959842,-950598932,64582,-1962260850,-1977218946,1004810757,175375942,108314634,-62455993,1183575275,-310157316,535137026,113921373,-1864856576,-326412987,-2082959842,1465257196,556675,-840367235,209125120,1358792936,1342177720,-125720,1050282614,-1962934253,138841072,-1962764056,1207307358,57942067,-1962896663,8398085,1963345467,8775939]},{"sector":2,"data":[-1962117377,75012,-6681996,-1996488449,686553670,16777114,-96040704,-1962123637,104531013,343672070,723797899,103489607,1161364742,1208316424,65788043,-1928831605,1343681094,-16353793,1166738549,172294918,71666512,-1705983229,1145,-1912965377,1343681094,115866,621054720,225705985,-15960321,-6620554,-352321281,-92864760,16777114,2133164288,105286655,1996424457,325622282,1583284224,-1962742397,1297948645,-1946154806,1430622424,-1910575989,1022133208,-1983892649,1183441478,108956644,78185867,-1705806592,65535,-1946401143,1200426589,-1202708990,-1873805303,-23468018,-506231,1183710326,-1706027326,1288,63063691,1183435334,-59310108,-1928438389,1344143943,-1694992641,1467,-1948023,-1315242890,-352321515,1979682851,1226766,1183651408,-6663962,-1929379585,-1959336354,1183384135,1200305890,-465139452,-1948105077,-2090867626,-443874579,-900899553,-661913598,-1957345904,-661774612,1443556483,142510935,-1707837953,5387,-1070337909,-1070447114,111215476,-62486267,1144635443,956658694,393545796,1463055871,-231681,-1962639818,1160456773,362434598,-1929379836,1394013278,75370123,-62485679,139199312,105120593,361273936,243990528,854066116,-96040192,75499051,-1946794359,-402405362,1996423201,108461832,-399215105,1979705594,365074996,1583284224,-1962742397,1297948645,-16775990,-1927936394,1364259910,16777114,-661863680,-1957345904]},{"sector":3,"data":[-661774612,1444867203,242649943,252477059,1586318965,1393972960,-1705830826,65535,1474330251,63190783,19866,-1070377216,1149980752,642001706,742689616,1344816171,1342238904,1342185912,28570,-11053568,-402640842,-6625158,855638271,317430208,209125206,-16091393,1996425334,-26106,1583284224,-1962742397,1297948645,-1325397302,-1914571248,-134017924,50345155,17808896,56654080,18168576,53999872,134396673,50349056,118574593,50352128,17826304,52592640,18026752,56853504,117789697,50354688,18171136,54004224,135680769,50352640,-15441920,50371328,-15479808,50372352,18319104,52073216,135665665,50355456,18196224,54008320,18304000,52009472,18324992,57121536,18191616,57058048,17024256,55649792,17099264,50475520,118919169,83888128,-16709376,50421760,17796096,52606976,118950401,50333952,134305793,50331904,134225665,50332160,18275840,56900864,18232320,55754240,18024448,52772608,17825024,53788416,134301697,50333952,17561088,52675072,17822720,51266304,17474048,56804608,16838656,55496192,18215936,37277952,-16708608,50421760,-15285504,50422784,135756033,50339072,134389761,50340352,18012160,53959168,18294016,57039360,16994048,56942080,18235136,54059264,16854272,55403008,135747841,50343168,17144576,55764224,17501184]},{"sector":4,"data":[50849024,17083136,56978176,134363137,50344960,18009856,56880128,17438464,53637888,17730560,2618368,0,1167087646,518818645,-326903666,-11118816,-6680970,-1996488449,-661914554,1963001846,209617676,-1962511360,1200162374,-1983894776,1183441990,-163149334,-1995815285,-125047738,-1995946357,1988884550,214336508,15091399,22931712,949379,-1705633932,65535,-1980610935,100922454,1149830224,-339571958,172279560,1386283008,138709252,15105667,1183384437,-60912658,1963001846,12511491,1613038730,-96040704,209043467,1088833163,1946830649,9496835,-1980348789,1586225734,-431584260,172439872,1183518325,172243446,1149961854,-498693878,-15829249,2122574454,74711290,65781803,50332088,-11475386,1996481142,183298296,-2082322807,1946221182,2114323253,-129595132,-1995815797,2123101766,-431584276,1089095305,-1948236151,1194982494,-15502070,1996426870,1996443878,-126418954,-1995787800,1586225734,-431584260,172439872,1183516277,138906082,-1962640247,1149892678,142344966,2112126521,-461469380,83245035,-1961593504,1141110854,-60912886,2114471739,-427916523,51344384,1183575678,-129595128,-1995946869,2089414214,-129594620,-1962523511,1174473284,172264440,2113291833,-163149565,956843147,58584646,-1947318647,133626974,-1962380031,-956043706,-2082191735,1191121094,-60912666,971392651,58591815,-1946249751,1177281606,-2147089654,105351428,-1948023]},{"sector":5,"data":[-6680970,-1962934017,1600053830,-1962742397,1297948645,1426066122,-1957237621,1149895798,1019225139,-166235072,1965044548,860157452,1443263504,16777114,112640,-1070923029,1575324510,503317186,1430622296,-1910575989,1988843224,1654281736,184549378,-1978305344,-1071369404,208945212,-1996077429,-397003708,49020837,-2090942421,-443874579,-900899553,1478361092,-1957345904,-661774612,108432214,47028822,-1073020928,-397015948,-2090926215,-443874579,-900899553,1478361090,-1957345904,-661774612,-15930237,1996425846,108461832,-1728050760,-6664110,-1996488449,1996485702,-6664182,-1996488449,-310117818,535137026,113921373,-1873273344,-326412987,-2082959842,-1957290260,1187449974,1442840814,16777114,1975520000,29747459,637951684,637695999,638089215,-1710852097,65535,1039287945,175374592,1946223165,-373282018,1187447202,-16776724,-6681994,-1996488449,1451876934,1975651300,-941430007,60486,1589962219,126494434,1183441962,75238,1961641531,22341891,637951684,-1006352501,958849630,57934151,-1962851863,203810374,277760,-605486219,539904,-655817867,-297351424,-1070923775,-1980348791,1589962822,1200301794,-96040701,876907350,1358186121,-362753,669574774,-163149567,896909323,-1995291509,-1072958394,1156977269,208930866,-1996218207,-1705577402,65535,-193527978,-362753,-135731594,-163149568,91537419,31999687,860129792,136700970,-129595136,695582731]},{"sector":6,"data":[15236739,1190536053,494207718,16154243,1048778612,1962934378,1996445200,-92864524,1342210232,-270004592,-163121663,-2091158271,1946220158,860157452,-2096729056,1946216574,-159481015,-2096270336,27198,2122529909,913637624,-394362026,-1206094848,451608850,-352317256,1161219,-26032,-1073020928,417923965,-1203639297,-11534063,-1070859658,1375732154,82221648,2122514432,678756600,15236739,1190535797,477430502,16154243,1048778356,1962934378,1996445199,-92864524,-1873756117,23128078,98715267,-2132392202,-1981217931,175570942,16777114,-297366784,49120094,1562371467,576077,-2081649835,1187450092,-2097151750,1962936446,11069699,-16222465,1911031414,-196703999,-385649344,1187446934,-16776454,381160054,1996443649,1354771208,85826128,1996423168,105945608,1183383552,-196703234,-523041615,100550147,1183383564,-153580554,359927815,-1207273729,-11534057,1183515255,1347590644,16777114,-161576192,52758410,-62486272,-1710721281,1364,-16222465,-1070922122,-401698736,1183384631,-1965519882,206087,-506231,-1710870986,1493,16285315,2122516085,74711292,33181312,-1946532213,146955749,-1873273344,-326412987,-2082959842,1448543980,1183577643,139394824,1299496971,-15698177,1183518326,67118342,-401698736,-125107237,896859915,1963197942,241011495,1983461259,-1962705656,1166739574,507527182,209125200,1443526399,476570,173982720,50726]},{"sector":7,"data":[103692031,437402,1590070016,49120095,1562371467,838221,1167087646,518818645,-326903666,209125124,141210,1958742784,176063278,-148343808,67110470,1996426357,142016266,-1996479512,1996425286,175570700,-1962379521,-2145057210,-6664192,-2097151745,-443874579,-900899553,-1957363704,183272428,1187468887,-939524104,63046,-1710852353,19,-113015,1996424822,1354771204,350752400,200837891,-1958382337,1200356958,-129595126,78770315,-293345581,-2081225968,468389062,-2080878849,2080438398,1962359578,268760598,1149961844,-163149566,-1592725885,1178142254,-2263562,-1710870986,1716,-1710852353,1883,1593329291,1575324511,503317698,1430622296,-1910575989,283935704,1187468887,-2097151752,1962938494,-373282043,1190593027,1946681350,-1983894776,1183386694,105314058,91488512,-15841593,276234239,-1961986305,2426438,244338692,-1962775832,105314296,1551106560,-1049297141,105789067,69724247,1149878315,105154824,504382861,516393808,172264272,-523041615,-953432573,1342178349,16777114,172818176,268725379,-1996209013,922742854,-744880594,-16777215,-16372170,-1070862218,-26032,28835840,24242432,15877831,172395264,1946961419,105313804,-1960217596,1183386182,105314034,188773504,-1971751681,8398085,1475888777,-1962694424,-1593422282,1183385134,14936336,-15960321,1894255222,-230258430,-847921141,58064651,-59671,-1710870986,2042]},{"sector":8,"data":[201263849,-15960577,1083838582,-1962934264,-1593119760,1183385134,1312197392,71600902,-1996484603,1996484678,148281872,1996423168,-260636912,-1705983957,1898,343261195,67520246,-991362188,-227082242,16777114,-21370624,-15698177,1183518326,67118342,-401698736,-125107901,209059595,-1710196993,2246,183234699,-1996083551,915083334,1183516238,71600624,185222399,-1960872705,-1924129081,1344147525,-1324727157,65065732,768027590,-1706033148,1477,2122520043,259391246,-1324712821,-2081959164,-33353489,-1962096765,2133132870,-129627392,2122515849,108331250,-2147277440,-1070923251,-1995946871,1183516228,239438322,-1995946357,1190527557,376705030,82745936,1183383552,-2133292038,1996423439,148806152,1996423168,87071248,-1981218816,-2090901762,-443874579,-900899553,1478361100,-1957345904,-661774612,1988843095,108956424,100244054,-1073020928,-16035212,2088967540,896794642,956571809,762581572,-1877838593,25552910,1197255,-2095125760,1962939004,843380248,-15567864,-1207721930,1385758721,-26032,1149829120,310149906,-15895552,-1070919052,-401698736,48955932,1600045099,-1962742397,1297948645,-1325398838,-1914571248,-134017924,-1864856381,-326412987,-2082959842,1465255148,-16220541,-1070398091,-16741911,-610661770,-1962934265,108954608,-1961724928,-1073018810,1144775804,-402230518,1189871549,172264336,-335563544,621120331,1183383568,-14387974,1996423797,1354773256]},{"sector":9,"data":[-1528295792,-62486017,1946157069,175570702,511130,-62485760,-2121256213,64078,1166743157,138820354,1183518325,103719690,105789065,350996363,-1928269949,-130347964,1996467059,165779978,-1070399488,-310157729,535137026,113921373,-326413056,105286486,1946437131,108461875,-1710983425,65535,1086058635,50680576,-6664192,184549631,1343583424,931780747,1394492227,-16353537,-6683530,1476395263,1575324510,-1946155838,1430622424,-1910575989,4372696,1882192,172726864,-1073020928,1347426932,160930384,-661979136,470042567,38258432,379256831,1476395018,-1962742397,1297948645,-1864856373,-326412987,1457032734,105286487,745848843,-1706012592,2702,1150021771,-23074806,-396950293,-276627339,205819152,-227280837,696218,136157696,28311552,-310157729,535137026,46812509,243968,146342891,-1864856576,-326412987,1373146654,-16091393,1183516790,67118342,-401698736,190447195,555578560,-661977522,-1054668917,567408464,105286415,922683145,-509999570,1476395018,-1962742397,1297948645,1426065098,-1957172085,1166738558,1958742798,67499788,1342600448,714394,268826368,-16223232,244318837,1610562280,-1034033781,-661913598,-1957345904,-661774612,1443032195,-62470313,1317076992,1946157064,142016303,705690,-1947170048,1144718918,1024815882,276561920,-1946304280,1058053,1166739060,-62486270,-1710721281,2875,1610368651,49120094,1562371467]},{"sector":10,"data":[313933,-2081649835,1465256684,16271047,71731968,-16366079,-1717957514,-1962934261,-25872,1183383552,172264438,2081048121,13232387,2131248697,172395512,-171800,922744438,922681420,28835918,-6664192,-1560280833,1183515970,-28931830,-946836757,64070,-1996077429,92998725,1962935333,241011520,963959563,503465869,637008,-26032,1183383552,241011708,561252155,-1913227521,1174602311,1344159996,1177225099,-1706014468,3103,88212995,-335919479,105286400,-1946532351,1178335814,-1996261640,-947652538,-28901616,956843659,41811526,1352764907,-129629948,-401979765,1317797057,72231928,-1995815285,166460998,-2096476791,1191121095,-28931074,1913144891,-159973393,16777114,209125120,770202,-129594624,-443851169,705117,196633,66618,208504,67704,217732,16714054,16973974,461411,16973912,461372,196698,66280,208402,67846,16998546,461442,16973829,460808,16973830,461665,16973831,461803,16973832,462041,196617,68724,217790,66646,16983359,459929,196627,66053,216268,68594,211153,16712612,196970,16711772,196973,16713259,196975,16714834,196977,68817,16988385,459415,16973884,459427,16973885,459527,62,0,0,0,1167120524,518818645,1465309326,350470195]},{"sector":11,"data":[-1705947056,65535,-1709307165,65535,780375,-310157729,535137026,1439386973,-326898549,71731970,-402415453,-119010729,95807492,-402527000,820512403,9037825,-402285592,-51902216,571403,-26032,1085800448,-157200384,1049861,17406544,379781120,73328644,16777114,88776960,-1588528943,-120519348,-26032,922681344,-6683128,-402652929,28839480,1389505408,1354771280,-805258672,-1588572078,103482638,-11533208,-16445386,721709110,-11513664,1342414902,-26032,883097600,172877830,-1962933832,46292453,-326413056,1460071555,84975958,1645120409,-1543899388,171771362,-955875840,168157702,4241408,964688,98709239,1342195205,16777114,-2081387776,-761065786,-2084140283,-1566372154,-2084140285,-1163718970,-2084140283,-626848058,-600405755,85112836,-1070903266,922701904,245433616,1745234693,-6664188,721420543,-1592595457,1149830420,-2082567422,413208262,105351429,-499238585,-941064443,580,-964436341,84844814,1577469833,1575324511,-326412861,1444211843,15615687,-294221056,1438181073,-296842752,-754851456,-264074784,-2081536257,2080960126,571620,28856400,-1924116480,1343680582,16777114,-330921728,-26032,1352859648,-327745787,16777114,1354771200,122266,104243968,1342177720,125338,100967168,1342178488,16777114,68985600,1575324510,-326412861,1460726915,74877782,1347469355,-1710852353,65535,-125107063]},{"sector":12,"data":[964695,-263811760,-6664170,-1962934017,1149891654,-230257916,1577206921,1575324511,1426064578,-326898549,-1202301134,-4584427,-1706011905,65535,1342575779,-1728052808,1790464082,40745474,1922715730,-16777214,-1207561162,1385758723,-18352,1392508858,-26032,922681344,28837396,1347590400,-1173611080,1347616767,16777114,-834238208,101988095,-26032,1183383552,-6663984,-1996488449,1451883590,-60898050,50087555,-1559786714,1586168928,-62487556,126559746,-1207673181,-1952907200,1183054942,-1960443140,1846446351,-1543899388,1085801578,1586206976,-62487556,260777474,74452617,1822685687,-1556070396,1788937320,525572,-1207671133,-1952907232,1183054942,-1960443140,1980664079,-1543899388,548930674,1586206976,-62487556,260777474,74976905,1956903415,-60912892,50087555,-1559786714,1586168954,-62487556,126559746,-1962639709,1183054942,-1960443140,75539207,-556251449,-767113469,451608586,-2082972021,-1006315450,-1960379266,1435182597,-1995994878,1182990935,1183515900,-766574638,-596262901,-1697614081,65535,-1697614081,65535,-1962597912,-16363490,1186464887,-11526651,-1711030730,65535,1342180792,119194,75801344,62011135,383403661,-26032,1183514624,99394522,-1545320821,616432674,2147465220,-964471216,-32118778,1350565560,113673046,-1191310616,1448116221,-402209149,-54985217,-2091495297,-186120506,2147203325,-964471216,-35002362,1350564536]},{"sector":13,"data":[113673046,-1191321880,1448116217,-402209149,-122094125,-2091495297,-924318010,2146941181,-964471216,-37885946,1350563512,1342519480,-1577209112,-523172736,69731843,-331940016,-26107,111345664,72786181,-120457007,-1593550173,-1181154216,-101253117,-788243293,-1207687618,1344144624,75380479,721749665,721692678,1342472198,50603681,1342471686,721749665,1342472198,308122,60340224,-1070903266,648106064,2114323204,922701828,1201276166,-1593835519,100861190,1688405120,69640452,69993987,-150993991,73573353,-443850914,-1957313699,49054700,52954766,637934241,-1906664541,-1593628154,-1557789156,-1070900579,-6664112,-1962934017,1438866917,-326898549,1354771202,-1157627976,1347616767,336282,1354771200,-1157627976,1347616767,16777114,738627072,113714691,1400919200,16777114,1575324416,-326412861,-1191198488,-4584397,-1706011905,580,899152,-1706012007,65535,53347982,1519887142,-1726576346,1354771290,-26032,-727515136,-703166203,99792901,-6664162,1023410431,158597132,1342180536,386714,-1073297664,-956301311,17071110,104773632,-6664162,-2147483393,409150,113708149,-65088,75237063,2090926080,28615428,53479054,637944993,-1906656861,-1593626106,-1557789114,448289467,-1706025466,65535,1946158141,964617,-26032,-443875328,-1957313699,1644611564,1560281088,-326412861,1459940483,1354771286,-1706012592,1558,721796259]},{"sector":14,"data":[1347440832,103062096,44236800,1354771206,-1706012592,1744,-955961181,413702,78561024,1352791595,-1207596794,1069157397,726684162,1347440832,-1706012592,65535,-972798583,-956299451,66117,-947665013,105947912,100565830,-661926788,-1710983169,65535,-1962691933,-16363490,146277495,-1634054144,-1560281082,109970704,-1557789900,512449205,2013202000,702468,-26032,245563392,906399237,-1214044669,88520794,-1070903266,922701904,922682640,-1717959410,721420292,-11513664,-16445386,-1710944714,65535,1577327267,1575324511,-326412861,-1207767933,112856122,-1202695673,-4584367,-1202695425,-1706032652,1814,-26032,985137152,119847436,1924681810,-17908,-1070903214,-26032,-1706033152,65535,-1173603656,1347616767,-1173593672,1347616767,-1173598280,1379991551,-28930736,45633558,-6664192,-1912602369,-1979500538,942079558,1946963718,1335895570,1385797644,-26032,1178075136,-1207601666,48955393,110018603,-1557789894,-1070900573,2130753616,-1706012007,1937,721815715,28856512,1347590527,500378,106341120,-1202667477,1385791236,129210960,-291307520,1354771205,-1719697224,-996519854,-1560281081,-1070922256,2139207760,-1706012007,65535,721746083,12079296,1347590527,517786,103588608,-1202667477,1385791233,133667408,-626851840,1354771203,-1719729480,144330834,-1560281080,-1070922612,2130950224,-1706012007,2073,721663651]},{"sector":15,"data":[79188160,1347590527,16777114,98083584,60831487,-1728052808,1033523282,-1560281080,922682400,45613984,1347590400,16777114,64791296,-1017256565,-2081649835,-1923739924,1183446598,-27882244,1187444267,1589903610,1065362948,-14781152,-219478970,972193408,179314815,-990220554,1191117918,117581316,1183330348,73319674,-2012771802,809300550,1589959293,-62455812,653936266,-2092562552,-1233386498,654073483,-1962932282,1452013126,-443851016,311901,-2081649835,1448551660,-956056385,64938054,1119417899,-17908,109989970,-1977220292,705422492,-2088268289,-17908,-457682862,-17822,1183666258,-1202710812,-1706033127,1859,-1948230005,39291655,-1982052727,2122374742,242483428,384059021,-13572016,-1982052727,1996480086,-596181026,16777114,-1982166016,46629637,-2082447733,-1962614714,1452006470,-1995994658,-2092563881,-2105799938,-443850914,-1957313699,585925612,16777114,-565802752,-532247216,-1030074346,-16777213,-6627722,-1593835265,-1901918902,88908033,-1593732957,-1834810318,71737601,-1593731933,-1767701242,75407617,-1593730909,-1700592512,374785,75378423,-1207853917,787939333,-1633483648,73441537,-1593728861,-1566374818,74096897,-1593727837,-1499265940,74621185,-1593726813,-1432157068,-532247807,65553923,-1559986170,1252065708,28222213,721767585,-1559951866,2057372080,28484356,-1560005471,1151402422,28877572,28968647,109969409,-1591344322,-1130145117]},{"sector":16,"data":[1575324417,-1873273149,-326412987,-2082959842,-1957295380,-6683018,-956301057,6150,470220544,81568005,314069022,-1706025467,2656,3687622,-600375466,1354771204,16777114,-163148544,314069014,-1706025467,65535,688160417,1174533702,1183667962,-1706027274,65535,-26026,-1705639936,65535,16777114,-310157824,535137026,46812509,-326413056,-16061309,-1207721930,1385758721,440400,-1706012007,649,200689289,-10324800,1342414902,169626,-1617276928,-1560281086,378078378,1183384748,-27883012,1098170891,654073540,-467007606,-939899255,63558,-500085,1183579206,-27882500,78251562,101353352,33179275,1589967942,126494460,1183441962,663234298,-2080880897,2081028222,1575324623,-326412861,1461644419,-196688042,1187446784,-352244490,4241529,-159973552,28314,-1192195328,-1078326199,726684171,-1202696000,-876977436,-1957670389,-11526458,-644155786,-1996488693,-1072963002,-24428684,1183523819,1002832886,-2145356089,343212093,97664,1183518325,1002832866,-955943225,128070,-193035449,-2083032064,1962996862,1268405777,-2097151988,-345704890,-196688123,2122514433,-2123104012,14843523,-1863777419,-1191277824,-4584375,-1957670145,-1202708793,-356883740,-1924115960,1343677510,1342181304,587930,1958742784,-465138347,-1929754999,938212438,4161574,1191128693,130426618,-94467282,653936383,-1958344762,1191180894,130426618,-94467249]},{"sector":17,"data":[653936383,-1957820474,-970524066,216727559,-990230785,-2144929186,-1066062273,384059021,-26032,-2142830592,1962999677,-498693127,-952383997,1927873398,-6662401,1577058559,1575324511,-326412861,-402645016,-739770229,24700928,-402579480,-219676138,77785091,-402373912,-443874888,-1957313699,49054700,84975958,1712229273,-1543899388,748881194,671532805,-1207959291,-1202716608,-1706033126,3320,1153953931,-947912426,6212,-1996162911,1153896004,-939524350,-64444,-1996250975,80153156,1153892363,-1962933744,-1706025274,3364,221026902,113704960,1588,1575324510,-326412861,-1207767933,-1202716608,-1706033126,3395,-1946270071,373802968,1204256768,-956301288,-956268537,-64953,-16496697,60858879,-1962260599,-1706025277,3446,-1694599425,3454,-1017256565,-2081649835,1085801196,448286720,-1785049088,-1996488691,-661914042,-1996093279,1204227655,-955519466,-59321,-16627769,71813119,1204289535,-1593834232,1200161696,516131594,231512656,1996423168,232037118,-443875328,-1957313699,49054700,1342193848,1342184120,912282,-28931840,144824459,239569158,35014599,407357312,1204224000,-939524350,-64441,403195847,60858624,-955627639,-1962932217,-1706025277,3614,-1694599425,3622,-1017256565,-2081649835,1085801196,448286720,1033523200,-1996488690,-661914042,-1996093279,1204227655,-955516394,-59321,-16627769,71813119,1204289535]}],[{"sector":1,"data":[-1593833976,1200161696,516131594,242260560,1996423168,242785022,-443875328,-1957313699,49054700,1342193848,1342184120,954266,-28931840,144824459,239569158,51791815,407357312,1204224000,-939524350,-64441,-1996250975,1204226631,-1962923000,-1706025277,3778,-1694599425,3786,-1017256565,-2081649835,1085801196,448286720,966414336,-1996488693,-661914042,-1996073311,1204227655,-955517674,-59321,-16627769,71813119,1204289535,-1593833976,1200161696,516131594,-26032,1996423168,194747134,-443875328,-1957313699,518816748,16777114,146688,1994982260,204060673,1376737978,1354771280,16777114,-297367296,-385649344,1996423517,1354771438,178256,255433296,1183383552,-229209616,1342194360,-260636846,16777114,-465139456,-26032,1183383552,-363427352,737048319,1347440832,16777114,-294191360,-1411329,1996482678,-25872,1996423168,-25874,699924480,-17908,-6664110,-1006632705,-1960384418,-431585017,38243110,-1946925431,20833862,1024488448,58523650,1023465705,1149108227,-1962880791,1452009542,263658,-11382702,-6625162,-16776961,-2003114890,-1962934269,1183441990,537315322,-956301312,16786438,-428409088,-1694861569,65535,16777114,9431296,652762820,-1996208245,-1960385978,1183385159,1200301822,-330921720,172460838,653674121,-1995683957,-1960379322,1183387207,-427916296,-1207601917,65732616,-788527432,-398065184,-1935617]},{"sector":2,"data":[1996488310,-159973396,-1411329,-1248139146,-1996488703,2122578502,208995302,-59310256,-1694992641,65535,-1696303361,4003,-1696303361,65535,2098887,113704960,65572,1342177976,-1946197527,1438866917,-326898549,4241410,1751120,281320016,1183383552,-1579643906,1200162312,373802766,1204227073,-939524328,-64953,-16496697,134727679,60858624,-955627639,133191,1344193419,1111706,-25755904,1113754,1575324416,-326412861,-1207767933,-1202716608,-1706033126,4427,-1946270071,373802968,1204256772,-1593835496,1200162358,50841360,38258432,1204289535,-1577058556,1200161696,516131594,293771856,1996423168,294296318,113704960,1458,106432199,-443875328,-1957313699,49054700,-1559994207,1587610852,96903940,-1560005471,1050739942,97035012,-1559986527,-324860464,75538692,-1559900509,1085801710,448286720,-1600499712,-1996488692,-661914042,-1996093279,1204227655,-955512554,294787143,-16627769,71813119,1204289535,-956299256,-1593832697,1200161696,516131594,215259728,1996423168,215653118,163053568,-17908,-6664110,-1560280833,-443873756,7717725,38993925,27263231,101187843,4194312,153420035,4325384,264568835,9044223,250675459,4915207,257884419,4980743,29950211,4521992,98042115,6619140,264241155,9240831,277151746,201392129,230031362,1661075457,149028866,209911809,123601155,5242887,90833155]},{"sector":3,"data":[65537,257032451,5308423,235667458,1661272065,85000451,131073,256508163,5373959,241041410,1912995841,252313859,5505031,213778434,1661468673,291635202,201916417,137035779,9830655,292290562,1661665281,109248771,5242888,91947267,65538,35324163,5373960,171966467,1686765569,246415362,1661861889,219283461,20054271,224657410,1662058497,261816579,393218,61931779,5701640,176160771,403701761,277807106,1662255105,104792066,202702849,94306563,65539,39190530,27263231,157483267,6094856,170328067,328597505,283377669,20971775,42205186,203227137,229703685,1661075457,125829123,11337983,235339781,1661272065,131399683,11403519,240713733,1912995841,34078723,11469055,213450757,1661468673,83296259,1562509313,291962885,1661665281,84672514,1420296193,250150914,204013569,7929859,28705023,246087685,1661861889,219611138,20054271,279248899,3735807,224329733,1662058497,277479429,1662255105,88276994,204668929,204603651,7798792,87097347,1571880961,92864771,65543,12976131,36831233,1310979,262151,283705346,20971775,275644675,327687,115802114,205127681,279773443,458759,113180675,1681719297,147718146,205651969,253559043,983047,84475909,1420296193,272892163,1114119,254148867,1179655,272367875,1245191,175374339,323223553,188940290]},{"sector":4,"data":[206110721,1835267,1572871,120848386,206503937,72482819,1380712449,116326402,206635009,117309443,-2033188863,119275523,777060353,156565507,953221121,6160387,1574109185,9633795,928645121,175767555,945487873,249102595,2818055,271843587,10682376,120324098,207683585,88604931,3080199,85524741,6815748,189726722,1659109377,158007299,954269697,89391363,3276807,173080579,291766273,61341699,24576255,270467331,3145736,116916483,3735559,190513411,3801095,224002050,200146945,179044611,3932167,108003587,3407880,180158723,3997703,105644291,3473416,180551939,4063239,118358018,208797697,59769091,4128775,9043971,879755265,85721346,6815748,245760002,200605697,39518467,4390919,29229315,3932168,176488451,980680705,295108867,4521991,235012098,200933377,0,1167120524,518818645,-326903666,-11053562,1996425846,108461832,-1728052040,-6664110,-1996488449,1996487750,-6664182,184549631,-1959496512,-6663952,-1962934017,1959398344,-1924115930,-397346746,-1073020886,1979205259,-6664184,855638271,-1705619264,65535,-26026,1599602688,49120094,1562371467,445005,-2081649835,1465256172,16777114,1958742784,-129595058,-1912177013,-1070397370,-1962571226,279463920,-1960441739,-96040699,-812955833,-2144943476,74776637,-768358093,-1979953527,-1977156010,-1073068283,-956827531]},{"sector":5,"data":[309592080,1183667974,-1477947142,200838143,-1727826494,1996436971,1354773496,-100609,1996487798,8108282,902691,-6664191,184549631,-136547136,1946190022,73304974,922240651,1451952009,1606912776,1575324510,1426065090,-326898549,509040132,209110524,-1962377532,1183515742,-1981230842,19267142,-62486272,2085353515,-28406988,-1375961597,-1059991413,-1031090141,-523181871,-523181871,-523181871,-963977007,-523181871,-523181871,-523181871,-997531439,-338369878,1583292361,-1034033781,-1957363700,149717996,-65120426,-1005685051,1586170494,33260292,1183532926,-137219322,-28931597,1258835595,-1946657143,-1981679677,-779355066,1579933323,-11842564,763166286,-1946395133,-1981230654,1325398598,1139571962,-1946973373,-129070332,69464579,-341050654,105286633,-787978505,-204960792,1583292325,-1034033781,-1957363698,49054700,176063318,-15043584,1996425846,108461832,-11485141,630850678,-1962934270,1979059184,102015258,1342850697,-16222465,-1070922122,74907472,181146,200313600,-16026378,-1705637258,723,-963907445,1575324510,503318722,1430622296,-1910575989,175570904,-16222465,28837494,-1914155008,49120255,1562371467,445005,1167087646,518818645,1996478606,142016266,-1207535873,-397410301,-310116504,535137026,113921373,-1873273344,-326412987,-2082959842,1448545516,-1962510709,-1073000762,-1070922379,721456105,242679807,-1324595573,1089000196,1347605035,-1728051528]},{"sector":6,"data":[530206802,-1996488704,-1072958394,1996445812,731533326,-1996488704,-1705969082,1454,-1980348791,-1039402922,1719745652,-1006629108,1191179870,126494454,-125049814,-15972725,-1073017778,-29676683,-24444290,-493825,1996486262,142016266,70949463,1996423168,67345146,1589903360,29763080,-339244288,-159514363,1600043499,-1962742397,1297948645,503319242,1430622296,-1910575989,485262296,-16222465,-6683018,-1996488449,1187511366,-2097151770,1962936958,142016288,721843967,-1706012480,65535,185222793,721778112,32762304,-1685817,175570943,16777114,-364476160,200038025,-15370814,-1070921098,-59310256,91265616,-1073020928,-722742924,15105667,1996434804,108461832,16777114,-431585024,-13994944,1996482166,-361299988,-1694730497,65535,-15305664,-73734538,-1006632957,-2144933282,510984511,-352321096,-427916517,-16222977,-6625674,-16776961,1637485174,-385875963,-1070858379,-990886263,-2144933282,1946157439,112645,-1070923029,-2080881015,-1962738578,1452010054,132588,-11382702,1996483190,-25860,2122514432,779354352,-1996198239,1889663558,-163149564,-1996199263,1822553158,-230258428,-1947574588,-120458170,-1962440410,-120458682,38242598,1990269163,-96040700,-1996195679,1923216966,-196703996,-1996196703,1183576646,984564,61992996,1317796051,-136195598,787945,-2080618871,1962997886,11659523,66733707,37615174,-385646848,2122514595,494207216]},{"sector":7,"data":[-1947574588,-1960379826,-101213945,-1962440410,-1960380850,-140967353,1200170745,-362888190,71797542,653149833,-788117621,-398030368,138906406,-1947974007,-1993935802,1183515719,1200170738,-196703482,603983621,-754732560,1200170744,-92372216,-1961264126,96636099,1347551244,201704331,-11513344,1996481654,-69211928,49708675,1183523708,-329872406,1375734789,-364475568,1375734789,-362888112,142081830,-1542401,434697846,175570940,23706,175570688,-11485141,-1705968522,65535,-2096478581,-443874579,-900899553,1478361094,-1957345904,-661774612,-14488445,1996425846,108461832,1342177976,-1979954200,1183445062,1975520252,30730499,3643984,1183383552,-94991880,653811396,251742198,28837236,721611520,-230258240,-1946663285,33946198,-129595136,653811396,-1996339317,-1960385466,1183384647,1200236256,-1981535736,-1977160634,1183385927,1207314164,460685313,-1804545,1996480630,-1014279956,1375735301,113613392,1183383552,-12850180,-16534986,1996481654,-25888,1183383552,1183535356,-194054172,603983621,-754732560,-328271880,-1713344777,1183535186,-94991368,1375735301,-26032,1996423168,52599536,1996423168,6462192,2122514432,57999612,-2097081879,1962996350,17361155,50622113,1023700998,58654722,-1962870295,-1952848826,-150704626,-364475911,-1713355125,74452619,1183447543,-1305018392,-26109,1183383552,1975520238,12642563,-1411329,1996482678,-193527828]},{"sector":8,"data":[1347469355,16777114,-431585024,58048523,-16741399,1342419510,453530,-498693888,2054471691,-1149185,916126838,-1996488697,-1072957882,922708084,1183515570,-196738068,1342178232,16777114,-1305018624,1354771203,-361300144,-1542401,1347481206,-1804545,548986998,13416960,-6664110,-16776961,1996484214,121805558,922681344,1996424114,-25886,1996423168,124820206,1996423168,124295932,1183514624,-62486042,2122523371,141820134,-1696172289,1912,-1695648001,65535,-1694730497,65535,65781803,-2080618869,-443874579,-900899553,1638406,122290435,4456456,122814723,4521992,64946435,5308423,64225539,5373959,52035587,1384382465,8192003,9896191,5439491,9961727,15663107,10027263,106037507,6946824,117768451,458760,61210883,1048583,59572483,1179655,106561795,1245191,103153923,10223624,120258819,2293768,114884867,2949128,101843203,3145736,34013443,3932167,111542531,3407880,36962563,3997703,47972611,4063239,107086083,4128775,62718211,4194311,56033539,4259847,57934083,4325383,0,0,1167087646,518818645,1996478606,209125134,1347469355,1384155322,245452880,2047224581,922701828,922682640,-1070922630,1996443728,142016266,-1710852353,65535,184953507,-1593412416,1285750868,103457031,-1962742397,1297948645,503319242,1430622296,-1910575989]},{"sector":9,"data":[142016472,16777114,1958742784,103457041,1963476537,1996443657,-26106,-310181888,535137026,80366941,-1873273344,-326412987,-2082959842,1183517420,75145990,103431811,-14715904,721824310,245452992,2047224581,922701828,922682640,-1070922630,-26032,-310181888,535137026,46812509,-1873273344,-326412987,-1596420578,1178076658,-1610056698,1178076659,-1609531898,1178076660,-1609729018,1178076659,-1207599354,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2116514274,-16387522,-2130151938,-16387010,-1207601922,48955393,-310132693,535137026,80432477,1694499584,-1845493504,939524960,838861056,2046821122,1124073728,-1107295474,1241514240,32,0,0,1167087646,518818645,-326903666,-1202301174,-1001390016,-1960442274,604309063,2090487808,-1962934272,1979059184,-373282043,1996423326,108461832,503989389,1751120,-26032,1962868736,544538402,16777114,71600384,980729867,1149878315,541362466,-1961081717,1183391316,-61437446,1098174987,1342193848,-92864686,16777114,-1706016768,65535,-15992693,1962872949,37526020,-1705639936,586,-947153941,1996443678,-92864516,16777114,-1983411456,1552686148,38061854,-1070904498,343211856,136858,340035840,-1996483423,339118340,112640,-310157474,535137026,80366941,-1873273344,-326412987,-2585058,-6681482,184549631,-1961265984,1602948190,74972932,-16091393,1996425334]},{"sector":10,"data":[-26106,48955392,-310132693,535137026,147475805,-326413056,16968833,73304918,-351504501,176063322,-1962183680,1183515740,71776522,1183532917,138808070,-963967883,1996440555,23173640,1183383552,-2037557752,1343684352,1342242744,16777114,142016256,16777114,-1983739136,-11532218,-2037578122,1343684352,16777114,1958742784,187993025,732067318,-443851072,574045,1167087646,518818645,-326903666,-1957275894,1175128646,721712396,-15995968,1996426358,-26102,1183383552,473861114,96961285,-1996107103,434895942,-362753,1996425334,-59310330,251414147,-1946206488,1979059184,1338477321,-529154037,1600045099,-1962742397,1297948645,503318730,1430622296,-1910575989,116163544,1996445271,-26106,20774912,726889728,1996443840,-26106,1183383552,1359622,1183529707,340015366,2088972405,141819910,-1710852865,65535,-1710983937,65535,1997955,1962870900,39098908,76218368,-1705638519,65535,-24444181,-167037557,1600045173,-1962742397,1297948645,503317194,1430622296,-1910575989,173968344,957106059,796198470,556675,-1705834380,65535,1586176491,1011336970,1204289535,1409285950,-1174222408,1347551948,-16222465,-6683018,-2097151745,-443874579,-900899553,1478361094,-1957345904,-661774612,-1174217544,1347551967,-11485141,-291895690,-1207959550,-4521985,-1957670145,-768932282,1375849088,-26032,-310181888,535137026,46812509,-1873273344]},{"sector":11,"data":[-326412987,-2082959842,1448543468,-351897973,1463126795,-1705983957,65535,-15991157,1600057205,-1962742397,1297948645,402653898,33620736,1207961345,872481536,1140852738,1040188160,-2080374528,1963000658,1459619585,-1593769216,1476396800,1963000576,1509951232,-687865088,201326850,-419429502,-1845493504,-1660943776,-1694498558,-1593834137,1090584322,-1358953727,603980034,-1744829054,-1694498558,-1543503257,1090584322,520160001,83887872,-1878981888,117442304,402653952,-1040187133,1174471432,352323329,1493172992,-603979519,-1191115935,788530944,100729600,805308162,-1946156288,-452984574,-1375665401,1157629697,1224803072,1174406912,-1979645184,1191184128,0,0,0,0,-2081649835,1448543468,-1962641781,956676158,92146805,-352172661,205884199,990528771,-1962573882,418055237,721700235,-1957690811,205859782,175505232,120218,38077184,-443850914,311901,-2081649835,1448545516,-1962510709,1183386180,75400190,-2096860160,1443298886,385238669,-26032,1183645696,-1957685514,-654893500,541363024,-1705977609,713,294531,2089497460,545008424,158662411,103532427,1174471808,843380472,-1593215984,103482432,48956544,1177141291,-96039940,70387243,-336181623,-62485730,71304747,-151501175,1948267076,70426889,75367979,-1070923029,-1912977879,1343682118,-106869,41418551,-16484353,149423222,-1956684288,79846885,-326413056,1460071555]},{"sector":12,"data":[71732054,184788131,-1004112704,-1960440738,-358415801,1200301573,104375046,-1559786714,-1960442928,379782215,81706502,-352026463,207537188,-1559786714,-1960442390,950207559,1200301574,64004866,105351974,-1106897245,2124481984,-96040700,95958665,-1995815285,138840836,-1962785655,1149830726,943622916,-365024506,-1946169083,-130348988,-125107586,-1577419261,1143670250,-1983446256,1149963332,105130768,51135531,721827846,172263879,50719393,78029767,2114485305,104374287,99223082,74777000,77991679,721828001,102933447,1143669899,1962889218,71600906,1342325803,16777114,205783808,-1962560349,100861508,1151534516,-1956684283,214064613,-1873273344,-326412987,-2082959842,-1957295892,145820742,37546195,246968181,-11526652,1996425334,-26106,-1073020928,915080821,904595278,61095555,-1962576896,65734726,-1962522997,506856432,-1205957884,209139973,2005599102,-1205957876,206015237,990529283,-1962508346,1996688503,242679562,1354771286,-2130697496,33688702,1996426101,1354771214,233311888,171346193,-310157819,535137026,181030237,-326413056,-1962611581,103482950,1183384842,1958743038,75400036,-16354048,1592264822,67549184,1048793118,1946157988,-339727612,-28931325,-1539407024,91488259,-335657333,1354771202,16777114,75399936,-13994752,719849590,142016256,-402229505,1183448350,61383164,1962690105,374800,-59310256,-1962702872,-1465648058,1575324419]},{"sector":13,"data":[1426065090,-326898549,74907394,16777114,-28931840,67549264,79187998,-6664192,-16776961,-6619530,-1962934017,46292453,-1873273344,-326412987,-2082959842,1448545004,-2096341365,1946160767,-1070902518,-6664112,-956301057,479238,-569981184,-939524347,-16392186,839305215,-1962934266,1084427334,108954373,-1961135104,508005336,-1962392023,1177100359,-1547465974,113705894,1620,1183516395,106210060,425603,1996426612,105286412,1342178861,-1090740760,-24443654,-2096969853,238654,-141884043,-2096959613,238654,1183516020,-1962677494,1183385670,64004600,-358546295,-1593472763,1149830678,104374532,-1593555575,1178141862,-955679240,403462,16443648,956703393,192739398,103286471,92864513,-1593775383,1178142132,-954434056,33957894,78029056,95952523,-1995421909,273124101,95684099,-1593785367,1178142020,-385647368,580976791,-1509545210,-1205957884,105331461,-1506433,671532800,-1593834490,547554212,68073478,-88584162,-1706025468,1210,503582392,571472,309328,86219344,-1264517120,-1593472763,1166607684,-569981180,-939524347,-16392186,95724031,-1559802205,512427274,126551480,-1560038237,1319175080,-129619193,-1207689565,1344144390,503642808,84777552,1996423168,-29366260,1342178744,62142207,-352210968,102932772,2113422905,671532828,-1593834746,512427332,1194001848,-1962571504,100864071,1166607906,675185412,729023494,-1560042335]},{"sector":14,"data":[246941216,-1202708988,1344144634,16777114,68073472,2124501022,1356396292,-150699871,-6663976,-16776961,62393462,79187968,922701824,922682848,28837342,-1070903294,175570768,-1710721281,65535,-310157474,535137026,147475805,-1873273344,-326412987,-2082959842,-1957296404,-6680970,-1996488449,1451883078,507808764,-1946532311,1177100356,-1070901508,1996443728,-92864516,1021841040,-2012821760,-2097139196,406078,-1202314380,-1202651138,-1202716622,1471809108,-1706012154,1628,-16297821,721823798,-1108848448,-310157824,535137026,181030237,-1873273344,-326412987,-2082959842,2122516204,242483212,-1324595573,1021891336,-385649662,246939781,-11526652,1996425334,35035654,1183383552,103981562,1962559033,242679558,-1962615576,4000838,1025733634,309592577,1963065917,242679628,-1873756117,223799310,113721323,1872,76023495,2122514632,762577146,956707489,628423238,-1207011585,-11468802,-1207662538,-4521985,-1706011905,65535,-16297821,721823798,300437696,-96040192,-2096745821,-443874579,-900899553,-1957363702,82609132,1049318999,915080100,922682920,-16055386,364381556,-1207702783,-11534060,1183516278,-1949160700,721835038,1389595593,-26032,914948096,1049167400,1599996836,-1034033781,1478361092,-1957345904,-661774612,-16091393,1877476982,175570937,-402098433,-310181877,535137026,113921373,-326413056,1461775491,104374614,99223083,1183447249]},{"sector":15,"data":[2143292406,41675011,-16353537,28836982,1843941376,-398030588,95952523,972441227,108857415,-1995946101,-88148410,-2080470268,1048773319,1962935204,-2080929019,-794754321,-1593538301,92866026,-1996089695,950076484,71665926,61095555,-952536064,70316102,921454279,83796228,83494443,-1578482039,1183384628,83534310,75367939,-1946925431,100922950,1183384828,-364475406,-1578875255,938148992,1123043015,-330905852,1151403068,-364476156,721748129,-1996162042,1183573574,-100269066,-196703996,50658465,-1996193786,2124542534,-465139452,-1981397365,922738758,1586168754,-1707606032,2023,-1161591,922682486,1855587272,-1996488696,1048837190,1946157988,74907428,83506943,83638015,-1411329,922744438,-1070922830,1586188368,41418736,-336169217,74907426,83506943,83638015,-624897,922740342,-1070922830,1996443728,-262239242,-1207666689,-860225504,-1706012160,2232,-16484609,1996485750,-461963278,-1193249025,-256245727,-1706012160,2356,62011135,-1286517,155228727,1048772608,1946157988,74907482,-1996238687,-1588534714,1177224760,-28931594,83796304,83494443,-159973552,62011135,-1957642197,1200352350,-163173628,41418576,-1191807233,-860225504,-1706012160,2322,-16484609,1183577206,-2147079170,1996443652,-2143879196,-10949884,950076534,-163173626,1357006473,-1996238687,-11469242,10614390,-66704635,922701828,1586168754,38243308,1358317099]},{"sector":16,"data":[-11485141,2013263478,2144260,1375784122,-26032,1996423168,-498693372,75367979,-227082416,75380479,-1193249025,-256245727,-1706012160,65535,62011135,-1695648001,2379,-16484609,-6620042,-16776961,921175158,74907392,503642808,1354771280,631450,108461824,-16484609,-1930893194,74907392,-16771864,1996424822,1354771204,1577189352,1575324511,1426064578,1048833163,1963197992,74907409,503580344,309328,177642064,-443875328,180829,-2081649835,-11139860,1996424822,-158537724,-1710852353,781,1996484747,28857862,-1310175232,-62486271,-4986794,1443264255,-386107649,-397017061,1996488613,-1070901754,26404944,52927062,-1956773888,79846885,-326413056,1459940483,104374614,99223097,-756481156,83541504,-947650933,-1539407102,91488259,-964428149,-1205957886,239569669,63964675,379651465,239545094,-1593555575,76088486,-1996086623,1996424260,83539974,1996443678,-401698812,512426228,1200293304,17115406,-1264516027,-1593538299,1149830468,102932740,77989419,2114340667,108461857,503642808,-969474224,-401698813,1996423360,83539974,-1070903266,52402768,1084293120,138819845,547438965,-1543096058,-1103596285,1048773646,1946157988,46564099,1023813793,125042690,1946157885,-1591940329,1149830580,108461828,503582392,-401698736,132841531,-1996143455,1592453892,1575324511,1426065090,-326898549,74907402,639130,-163149568,68073552]},{"sector":17,"data":[244338718,-16773400,-224725386,-1962934263,46292453,-1873273344,-326412987,-2082959842,1183648492,-11528458,1996425334,191076870,1996423168,-163148534,-6664170,-2097151745,-443874579,-900899553,1478361094,-1957345904,-661774612,-1928663933,1343682118,-16091393,1687816310,-16777212,1183648886,-11528458,-6683018,-2097151745,-443874579,-900899553,-1957363704,49054700,294531,1586186612,73370376,956703905,460588103,-1207404801,-11534311,1183516278,-2133710072,1347552714,16777114,-15734016,1996425334,374790,-26032,1183383552,108462078,199203408,1721958400,-15930621,922682998,-660995226,-1962934265,-443810234,442973,-1947432107,1178141766,-1962574586,65734214,-1962654069,79846885,-326413056,956581515,92145222,-351910261,71731971,-1034033781,1478361092,-1957345904,-661774612,1464003715,242649942,-1996249951,681704006,-1002010362,-1996249439,1419888198,-196703994,707806346,-62486044,-410912629,1183514632,16792844,1625883509,-385649150,20775778,1025733632,57999367,1023481321,57999368,1023500265,57999375,1023500009,57999495,-385762327,1589904234,1200301574,-330921712,205980454,653280905,-1995552885,52883014,1183386183,1979649010,126559779,39291686,-1983887735,1149878870,1078233410,1149878923,809798212,19260458,1178896640,117196534,-1897331851,1962871552,-62458320,-1961593852,103542854,1183384650,-230257684,72091179,-1947318647,100920390]}],[{"sector":1,"data":[1183384650,-297366544,72091139,-336443767,-62458307,-165776383,1946352710,-330921204,70387203,-336574839,-263812315,70387243,-336836983,-62458343,-1962314750,100920902,-924122042,737298059,-1996208634,-11080122,1996483702,-263812114,1357661739,737298059,726724166,-6664000,-1962934017,-1532757434,-1002009853,-1962530653,-1499216314,-196703485,721835171,12708288,112726,1182565200,-1962380288,1143677508,-1593578722,243990946,-506395522,-1054088751,1182565200,-1593478144,116064672,723797131,243998788,-506395520,-1054088751,-26032,-397017088,-397016503,-1705638554,65535,-6647317,-352321281,172395402,199902857,1443788224,382355085,-26032,1183383552,1979649002,384325133,1996445186,-119150358,1149904363,635710002,1183383556,843874494,1996445188,1354771434,16777114,-1099005184,-2147191552,-2080689564,1946159742,-13375229,-901345962,-6664170,-385875713,28901157,-372102400,1187447228,200290550,187790847,-165120513,1946235460,-6662650,1442840831,1016730,-1494723072,1996445185,108461832,-1873756117,-189667314,-939595543,-268372410,50873995,280045636,1317789907,642515718,1183432971,138856198,-1705639936,3841,18004048,-163148976,-11533300,1996425334,112368134,-1427570688,172395518,1023418669,58064903,67017961,-13724736,-955310425,395846,1187455467,-352319734,172410650,334168066,51005127,-955454720,2630,1187448299,1442840842]},{"sector":2,"data":[16777114,61252352,106182281,-1555676021,1996424100,1354771210,-369663000,249953869,249433836,250810071,251268851,988352250,1078234110,13822361,725898379,1111788480,-1962883095,1149831750,105286464,-351648119,138840844,-1958460279,1149830726,1081409346,-398166785,-11469690,-1729609100,1078233596,10741846,687747,-286719115,-1209510147,-6662653,1442840831,16777114,-364476160,28856406,-370651136,-129594885,-387287297,-11077143,1996483190,-95295240,-387287297,-11077159,-1070863754,-70850480,-361300138,16777114,-32839424,1963065661,-24647421,1963066173,-25761533,1963196477,-10229501,1963196733,-11933437,1963196989,-10360573,1963197245,-12523261,209125206,-16091393,1996425334,196188678,1599995904,-1962742397,1297948645,1426066122,-326898549,1988843016,1183667716,-1706027272,65535,245668438,-1499267072,-129594109,1962889238,1114963776,-12290817,-1326954892,-443851024,180829,1167087646,518818645,1448597646,1443395211,1097114,1958742784,108954419,1443984642,1342439864,1347469355,283023952,518717440,687235,2122520180,91488262,-352320581,-774165758,175934435,48955787,1600045099,-1962742397,1297948645,503317706,1430622296,-1910575989,1988843224,209125128,1119130,1975520000,-339727612,176063276,-15371006,12061814,-1957277692,1385760326,288266832,300613632,-15960321,-1070921098,-11119024,-337115530,-310157824,535137026,147475805]},{"sector":3,"data":[-1873273344,-326412987,-2082959842,-11138836,-1768288138,184549393,-2091813696,1963069054,276234023,1342440376,1347469355,297376336,1183383552,-94991880,638213828,1589905289,650283782,887818121,-1961861493,-167048585,2122521204,57933838,-1006188925,1149962846,126428674,-1962516796,-672463804,638213828,1991,637951684,1991,49120094,1562371467,838221,1167087646,518818645,1996478606,-26098,-1073020928,2122528628,460653068,-1207011585,-11533310,1451951734,-1950340344,1347553862,965274,-15275264,1996426870,112652,175570768,-16222465,199755382,49120000,1562371467,707149,-2081649835,1448547564,-955353461,61510,707937418,-330921500,818819,539297140,-1962480896,270920774,1958742784,112645,-1070923029,-2081012087,1962936958,1975520007,17623299,687747,1183519092,105265416,28837236,721939200,-1962677312,1183446598,209617902,-2146536448,199176804,-2146143040,-350211508,845447182,-293698577,-2147191808,-2096090548,1946218110,175934279,141950731,-26026,-125108224,818819,-947715212,-1996125434,2122575942,242483210,-1995946357,1183515205,71665926,1183516139,-16414456,41287477,1358520040,-402360833,92928318,294531,1156978292,192225331,271795446,28837236,721611520,71731648,871777931,695529030,707937418,-330921500,-1962930139,-511579058,-1056243680,1962871669,-26102,1149829120,-6662646,-352321281,-293698768]},{"sector":4,"data":[-2094369792,1946158206,776243748,1183441962,209617900,621114368,116064258,636241547,-1073020924,-11139212,2145913974,-263812106,-443850914,836189,-1578333355,1178140770,-1959168764,2139292766,91488326,-352071519,95723779,75370123,-1056710191,73304912,4620163,-1264515724,-1593578747,243991504,-506395520,-1705983741,65535,-1034033781,1478361090,-1957345904,-661774612,-1593250685,1178140778,-385649656,-559873831,-536474875,-385649403,113705165,1576,16777114,-532774656,1963233029,-566329044,1963231493,108954404,-15830016,922683510,28837710,-1326952448,142016494,-1192285976,-11534332,-352081866,-532774541,1963156229,-566328978,1963154693,1346274150,208928775,-1207404801,-1705967618,65535,355226,-96040704,-239991,1183647862,-1706027270,65535,503582392,-59310256,-1694861569,1530,200820361,-16354112,-1360525194,108954614,-15830016,922683510,28837710,887640064,571630,-126419120,-2081283096,414782,922683764,-728103340,721420301,98608064,-2096767325,-443874579,-900899553,3145732,260636675,939065345,237043715,1275133953,334561285,27984127,331153413,28180735,342294531,-2054815743,183828483,940179457,187564035,1686765569,3735555,1376452609,94896133,20316415,241369091,781254657,274792451,1620180993,239009795,445841409,8388611,1695875073,231079939,-2087387135,264306691,941228033,233963523,429522945]},{"sector":5,"data":[268828675,1738211329,55508995,1167851521,336134147,849149953,334036994,27984127,271056899,1629552641,330629122,28180735,188416003,1721958401,95420419,1428619265,95092738,20316415,197263363,464257025,335806467,1437990913,317587715,458759,326631427,-2068316159,309460995,163446785,276430851,624885761,88604675,675282945,74842115,1698693121,271450115,482672641,224854019,541720577,318177283,1288437761,241762307,-2058289151,337379331,1624440833,140509443,1900552,192086019,1717174273,138674435,2293768,338427907,1692270593,185270275,954269697,157351939,1172635649,198050051,2949128,232456195,-2072903679,6946819,1634926593,330104835,846397441,1167087646,518818645,-326903666,209617158,2138374658,16777114,637978368,-1962934266,1183385670,1812892668,-772157180,-1950274567,1195052638,-15303640,1996424822,-401698808,726664361,244338880,-352285464,-401698746,-1073020852,922682997,-404028124,86253195,-2020875311,1183384914,108462074,1342732031,16777114,6463744,1962559033,-92864746,1342179000,1342177720,-11485141,-979699082,-2097152000,-443874579,-900899553,1478361098,-1957345904,-661774612,1443163267,86253195,-1215568943,-167049902,-1202318988,726663187,1347440832,104602,721611520,-310157632,535137026,516640093,1430622296,-1910575989,142016472,-1207535873,-397410303,-310181877,535137026,80366941,-326413056,1460071555]},{"sector":6,"data":[89309014,425603,1988822388,-1591547130,-523172572,1183434499,-1948742662,509751,140413696,964944849,-1593412608,1183384868,140413704,831120337,29137494,-11141120,-18347914,1149982210,642001694,541363024,1344816171,16777114,642026752,1150111774,-1706025442,65535,112726,30513744,2122514432,611581958,374870,112720,608471888,723534891,735087570,575441856,-1960948693,-1706011967,65535,294531,727058804,244338880,1577446888,1575324511,1426065090,-1957237621,-1705638794,65535,-1993980789,1149971012,742689064,1354771286,16777114,-443851264,180829,1167087646,518818645,-326903666,-1957275844,1187450486,-1962934024,4000838,-385649406,58065030,1023544297,1483997199,1946162237,2047258,-11132044,1996426358,142016266,-1710852353,65535,-16642071,-1070921098,-6664112,-352321281,641631197,393478150,103167743,1342309048,-1705983957,65535,244338770,-1694650904,748,190362,30664960,-800682666,-6664170,-16776961,-2132225930,1183667717,-1706027312,65535,-956189463,129094,-1559607669,1996424494,108461832,1172835984,200837895,-385649153,1173750165,359925811,16285315,-2031549579,1095681,-26032,2062090240,205949697,1946288445,33766763,1793655668,28858113,848973824,184549379,-385649216,244318553,201179112,-385649216,1369047373,-1711276029,830,67782390,-1873341836,101181454,112727]},{"sector":7,"data":[-26032,116064256,-401698729,1043924595,57999458,1459690729,1342179000,1342177720,1464909867,36762,17295616,112727,-26032,-1073020928,-152501387,-26112,-396951552,-1202192787,-1873805311,71886862,5530,-26112,109969408,-1591344362,1183406757,403082950,103491075,1157847721,1779338022,66703620,-934901311,51775118,1520935206,-1899739511,637736966,1521157675,-1960295165,-788239346,-1983839239,-759628730,-1957683709,1177274438,1183535302,-1002034180,-26032,1996423168,-59310136,16777114,73239296,-1995028597,-1072956858,748750453,-96040698,-362753,-1711023562,65535,16777114,641632512,79189510,-1202696192,-4521985,-11513089,1996426358,-61437174,1183563819,-1706011960,65535,19736043,539906,-102169738,-1816132611,564657966,-2080211196,2130870018,2130842114,302153474,721583874,1600035264,-1962742397,1297948645,1426066122,-326898549,-1957275896,2123040374,-129594108,-396931050,1755381824,1812343556,-1037330172,1174665425,541362682,721708705,-1727763962,-120470997,-1980217853,1149967940,1812333344,608471300,52315275,-1996199418,1600004676,-1034033781,-1957363708,1988843244,-1715041532,86642315,788003319,243991656,-936704692,637951684,-1962520695,244029894,-101251798,787989131,-1993997210,1200301575,1745234694,1200170500,126559746,73795075,71797030,1575324510,503318210,1430622296,-1910575989,82609112,1988843095,108956424]},{"sector":8,"data":[-244025,874417151,545208582,-947181441,-1725937877,73928331,-930350601,721758369,787957953,-930413270,-1952856437,-150706658,-1983380485,1183579214,-2090901764,-443874579,-900899553,1478361092,-1957345904,-661774612,85985023,956640417,2114265094,671547154,86679813,86771201,73938687,-2097149464,-443874579,-884122337,1458342741,-1962641781,688272414,1999186039,-137983200,-6663976,-956301057,17114630,-26112,-1956773888,46292453,-1873273344,-326412987,-2082959842,1448545004,86783627,721758881,537853936,86024453,1417015355,-1996149599,915012678,-13957844,-544525333,-1081875503,1962935634,956754727,208993398,-773944506,1388282851,-277610491,1962702393,1187416854,1459954851,-1873756117,-87037938,742275399,-3703035,-1593497586,-654900120,-10688432,-310157474,535137026,516640093,1430622296,-1910575989,216826840,876019542,129997318,-259325952,104085247,385107597,-26032,1183514624,1745224694,-96040700,-196702890,922701846,161088446,1442840583,512922,-310157824,535137026,516640093,1430622296,-1910575989,82609112,641108822,637978373,-1962934267,-310157626,535137026,516640093,1430622296,-1910575989,86548952,73936631,-1962742397,1297948645,-326412853,1460333699,175541078,-1928823157,1343682118,-402229505,512490956,1200293428,-129619680,1476150825,385238669,-26032,-1073020928,-1545010315,1183667968,-162523402,1950363204,75399947,-1593477888]},{"sector":9,"data":[65734198,1342422689,16777114,75399936,1467839744,16777114,1962891008,678756134,493210,1962891008,544538398,-14519041,-6675340,-1962934017,1200292956,-28931818,259309579,1354771287,-25755824,16777114,1444276992,-26025,727056384,-1202696000,-1706033151,65535,-2144451338,1686113396,512458542,1333790260,-1957199826,-16370658,2013208183,-26080,-1705574400,65535,-443850914,574045,1167087646,518818645,-326903666,-1957275896,-13957002,1392002759,-1960056059,926546014,922689397,-6683084,-1996488449,1347877958,108461911,-71960,-6620042,-352321281,1183008523,1043923704,-813759188,-310157474,535137026,80366941,-326413056,1459940483,-1074386090,367723858,1946172803,-13238516,727057526,-1528278848,-947697922,741751042,1592098565,1575324511,503317186,1430622296,-1910575989,149717976,1988843095,243041032,-15895039,-6680972,-956301057,3652,-768147626,1354771205,16777114,944015872,-956807544,-2130757564,-2145373364,-1971376540,-466994876,-1577433463,1178141996,-1961329158,-472778146,89309059,-15960832,-11077002,1827145334,-1337725960,-126945778,503568523,126551260,73795075,244029768,-101251994,737822345,742275583,-1591771643,1178141996,-955943430,64070,-772120949,1388282851,-1217134587,1207584511,1600052203,-1962742397,1297948645,503317706,1430622296,-1910575989,1988843224,28857862,244338688,1593781480,-1962742397,1297948645]},{"sector":10,"data":[503317194,1430622296,-1910575989,82609112,1988843095,-1305069306,-1710918395,596,-768147626,-26107,1686110208,-1202266317,-1873805311,-27203570,-14781185,244326516,-1946441496,960792824,-472785013,89294791,1599995904,-1962742397,1297948645,503317194,1430622296,-1910575989,1988843224,-773944570,1384614883,-310157819,535137026,46812509,-1873273344,-326412987,-2082959842,1448543980,1443264139,1459100904,1726484112,81568255,737953417,-1961890817,1183054942,1149964028,71776550,-947189377,470170439,1458076677,1358906765,1342177720,16777114,-2090902016,-443874579,-900899553,1478361090,-1957345904,-661774612,1460202627,-1946211498,-1472841225,-9014012,512427638,1200293428,138806056,-401698736,1183447781,-49672,-661973644,86253193,-1215568943,1048577362,2097152146,972983042,1946530366,1480491840,175374342,597146,39426560,-16056320,-1873400972,3467278,106444543,1342178488,16777114,1479999232,-26106,882966528,1778792710,1342600192,16777114,1590070016,49120095,1562371467,313933,1167087646,518818645,-326903666,1988843088,1183667718,-397404482,1183383877,876019638,-26106,1183383552,1183666354,-11528514,-6637962,-1996488449,1451866694,-1300824132,420250,-1169782016,-1996486651,1183561798,-1270445636,-1715976565,-120470997,723405963,73834952,-775804007,-1983380488,512471118,-1047853516,2115913529,508005126,-1951381879,1174646854,874417080]},{"sector":11,"data":[575093510,1200294270,-1203360990,-1196407159,-768901116,-1070903214,-2001055664,-11513208,1150005366,-1270469856,1342178349,-1950845185,50705478,-1070903296,922701904,1347421088,16777114,106472192,74760203,95565449,49120094,1562371467,182861,1167087646,518818645,-326903666,205949798,1962938173,242679623,379209357,40344144,922681344,1183647154,-397404484,1183383629,-1703477318,1342178232,1342177720,381437581,-1166606512,16777114,242679552,379209357,41458256,28835840,350984448,-15829249,1996426358,142016266,-1710852353,544,-1962742397,1297948645,1426066122,-326898549,142016258,-16353537,1069024374,-6664192,-1996488449,-1072955834,1996433525,74907398,705039008,-1442446364,-1407808764,-1706012156,65535,-16353537,-6683530,-1996488449,1183579718,1575324670,872416962,-822082816,2030043394,-1711275217,-117440246,1057030967,1157629960,-1308622080,2130706690,1895826275,-1862205696,1442841345,-2130706173,-1895824585,-1811874043,201392897,1476396812,-1711275264,-1996488443,1677722424,-1979711231,-218103196,-1778319613,973079297,167772422,385942328,1509951244,1426064128,-1946156799,-1375730915,-1828716277,-1308622054,352321795,2046821221,-1711275765,855704345,1644169223,-939523328,-1694498549,1207960423,-1660944126,-503250126,1744832518,1241514752,553648390,637535073,-1392508663,553714449,1962936327,1090519808,838861067,-922746110,838861065,-603978995,922747139]},{"sector":12,"data":[1677722423,-1207959289,352387860,-2130704377,-1946090752,-2113927161,-1426062592,-1107295990,620757842,1056964867,1442841381,-1090518774,134218548,1073742084,33555240,1392574211,1291846401,1124073738,1291846414,-922746617,788595509,-1811937278,1660945152,1509949702,1694499686,1509949706,973079346,1526726913,-352320712,-603979509,-1191181471,-520093430,1358955320,1677721864,-1593834735,-452984565,1845494610,1761607937,-520092869,1778385155,822084407,-335544054,1442841443,1828716807,-268434149,-1778319613,-1124072703,1879048451,905970484,1929380106,50,0,1167087646,518818645,-326903666,503760648,-1207959296,-397410302,-1073020830,28837236,721611520,-96040512,5302352,16416387,113709173,30,5899975,-1070923776,-6672405,-402652929,512426257,2013202000,-26108,2122514432,141885448,-1996077429,99350598,33048263,-126419200,16777114,49120000,1562371467,313933,-1192457387,-4521985,-1957670145,1385759814,-26032,-443875328,180829,1167087646,518818645,-326903666,1988843014,173968134,956322977,91556935,-352321096,175570723,1963130499,1161221,381158379,727076864,-1706012480,65535,-2080618871,-663420162,49120094,1562371467,445005,1167087646,518818645,-326903666,-6662652,-1107296001,132841858,-956109181,-2130706428,1962967806,-18189,1392508858,8566864,-6664162,-1912602369,-1610412026,-2145124204,-1574535116,109991891]},{"sector":13,"data":[-1818229998,880813056,-727570816,2084471639,225705988,-1157627976,1347616767,16777114,-310157824,535137026,1439386973,-326898549,2084471570,91488260,16777114,-26112,-6684672,-1912602369,637735942,1473591039,384714381,1354771280,-18352,112720,-26032,-1073020928,-443818635,1478411101,-1957345904,-661774612,17306,-5511168,105913995,-1710983169,82,-1962742397,1297948645,-1873273141,-326412987,-2082959842,512427244,2013202000,1354771204,1347440720,-26032,244318208,738131432,1347440832,-26032,-6684672,-2097151745,-443874579,-884122337,196629,65961,16988033,65783,16973828,65907,16973829,131355,16973826,131438,196611,65678,17007116,196941,16973826,196969,327683,16711808,16974164,524728,16973945,458861,16973826,524770,131194,65864,220098,65744,206143,66034,153411,16711811,131412,65809,350170,65861,220098,66039,210794,65938,351982,65806,22490,1167087646,518818645,-326903666,-950642922,64070,-1124710713,-297351421,-164953122,1589932779,105284358,126559748,39291686,-1980742007,1589965398,172393226,1066083842,-1962933832,165729231,-8127930,-1959887606,-947128738,-670834479,1183385483,1958743018,-6664186,-16776961,1996485238,-25872,1586167808,-774927370,-1982266399,-295793913]},{"sector":14,"data":[-523122805,-670834479,-1947187573,126480982,1174558601,2131654201,-18295,1423440,1354771280,-6664112,-150994689,18938438,95947892,-1070903296,112720,1190596331,1946344954,374797,1354771280,15440464,1190526976,661914362,29245059,-1205832448,726663170,28856512,-6664192,-2097151745,334910,314050933,-6664187,1577058559,49120095,1562371467,84593229,1845560064,1107298304,1661010688,1157629952,-83885312,1241579264,-1493171455,1056964864,-838859995,-486539008,24,0,0,1167087646,518818645,113760398,65616,29245059,-2093255424,334910,-6679436,-402652929,-1070923721,473366352,539748357,314051051,244338693,-2096682008,1946158718,-26107,1048772608,1946158364,-26107,-310181888,535137026,46812509,-326413056,1459940483,-600405162,-335598844,-964471288,911374,473839943,1592950533,1575324511,-326412861,74877782,722236671,922702016,413205780,335948549,-396996603,-1956773881,46292453,-326413056,1444605059,1183432747,-364475920,-1946925431,384502902,556163,1191119732,138709994,-336574975,-196673789,1983460491,-1578797814,-120519552,-1947318647,1174664262,-230258198,-134330743,-1962646482,-936704434,200822409,-1593475383,166397028,-1727641973,-135115125,-96040455,15222471,-263812352,2130200121,112645,-1070923029,199640713,-2095024960,1946219646,-196703462,73674487,1183565963,734079750,-1952845754]},{"sector":15,"data":[-101190578,-1947711863,1183385670,209095676,1442877417,1347469355,160410,-62485760,-15186807,1098183246,16285315,2088971646,527695880,15105667,1149961588,-14685432,1996425332,-260636680,16777114,1678115584,-1962153212,1174661190,-1962677254,1183447622,407145452,-336837117,138840838,-1996077565,1183521860,-62520852,1224623755,1962034747,-297366778,-2095561687,1946219134,75538697,32392747,1150098500,1996443670,12380164,1983460491,-385649654,-1956708503,180510181,-326413056,-11485141,-16442314,-1593503178,103482646,-397409006,-443875324,-1957313699,183272428,1988843095,138840838,-1995815381,-1072957882,1183542900,1317771524,-1980106762,1183578182,-1983511804,247004230,175044352,81528323,-335657335,-27358399,2122528649,91554038,-335788405,-129594619,-259275261,-1979818357,2139817079,1461185292,505300365,-26032,1166868480,1996443670,1894654,-16040565,1183049077,1183518462,-162594826,-1250574325,-443850914,574045,-2081649835,1448542956,-1962641781,-788234690,3965951,-1070922635,-947191061,103482371,1586168958,-1593341690,1144587542,-1593477884,48956542,1141098379,106859268,1577338761,1575324511,1426064578,-326898549,-1957275900,189662326,721583606,75402230,85737019,1049298300,-11598564,1465255030,-397361109,1599995960,-1034033781,-1957363708,82609132,1988843095,1962281732,2123058689,1086819076,85722683,-12123788,1465255030,-402229505,1599995912]},{"sector":16,"data":[-1034033781,-1957363708,116163564,1988843095,142510858,254208087,-113015,1183385206,253159674,-1980086741,-1952842682,-819263922,1006237505,2097439238,85106968,738084489,85762559,105285960,721753761,1183448646,1183537148,-11517946,1996488310,-26285828,294531,1586169716,778534916,1183536879,-397393914,1448549541,1578946280,1575324511,1426065602,1448602763,-1962248565,-16054146,1586169461,209685260,1963065219,209125131,68131414,-125108224,1460434687,1996436735,74907398,1577073384,1575324511,1426066114,-326898549,-1957275902,1996424822,1436177928,-1962934268,1979649016,-95486,1448544374,-11485141,149423222,-1956684288,113401317,-326413056,1460333699,209095510,33310407,176065280,1191118315,960334844,-160102274,175570774,16777114,1475906304,-1995548952,2122577478,225705992,-1962385781,1183392839,-348156934,105155336,737822345,-96039937,-1980348885,-1952842170,-101188530,73664059,1149965949,38570758,737562249,-28931647,-1995684725,-13956538,1460303615,-624897,-396951946,2122578927,125042694,-2147066229,-2081477017,1946158206,1996445191,458024970,1577731723,1575324511,503319234,1430622296,-1910575989,183272408,1988843095,108956424,404378,944015872,1022903944,-1609861825,-922876644,-1996994936,246429764,66612982,-1996170234,1352334406,-1996488698,2122381894,175898872,-1728559478,85722683,2122343292,175964408,-1963440386,-654903226,1183452651]},{"sector":17,"data":[104569080,108791068,-2012930912,1183512646,944015608,-369750351,66471561,-1996170234,1183513670,-397371144,-1957291063,100922950,726664412,-1751494464,1442840581,503648952,94542416,-1974075392,1352202310,-335706136,1996445243,-6662148,1442840831,519849611,22649424,2122514432,326369530,-2131054872,737095268,922702016,-1628961508,-15865062,1465318518,112726,-34084784,271469696,-26026,2122514432,91488506,17050,118331904,1599995904,-1962742397,1297948645,503317706,1430622296,-1910575989,216826840,1988843095,-1103199480,427032577,29242937,-51838092,-129579264,-6684671,687866111,-351987706,-129579259,530186240,-1962934272,1149916732,-196704200,-369750351,81528323,1358710409,16777114,-1106852096,-1711276031,65535,-1980217845,1586230854,176129020,-1972800256,1352201286,-2095427864,334910,113714037,65552,1342509752,-437776752,-125926656,-1704233984,65535,1342177976,-347029461,-159481065,-400133120,-1125581997,-125926407,-1206881280,1448083459,1342177720,16777114,-1975784704,1352201286,-350650136,1183471153,-397371148,652999705,16154243,-1998056076,-125926407,734819584,922702016,1994917148,-15996135,-1202193290,-397410303,2122579213,343212038,-125926570,-1207601920,48955393,-1705983957,65535,20122,-2090902016,-443874579,-900899553,1478361092,-1957345904,-661774612,1460071555,108432214,29245059,17069312,-1593501642,1183384796]}],[{"sector":1,"data":[-335598596,-60912885,251414147,1191606017,705028768,2009545700,-2090901780,-443874579,-900899553,1478361090,-1957345904,-661774612,1459940483,108432214,16777114,1475906304,16777114,922703616,922682642,922682644,922682646,-6683368,1459618047,-1705983957,65535,-1103691945,-26109,-11075584,41221940,721699979,1149980676,38021894,2209872,1375793338,-26032,-1705574400,65535,-26025,1599995904,-1962742397,1297948645,503317194,1430622296,-1910575989,82609112,141986646,-1103199402,91488257,-352320328,178179,-26032,-241565696,-2097151996,114238,26877557,16777225,-1962600442,1554187846,-1103722237,150641153,-397017088,132841498,108461910,-1711234840,1506,49120094,1562371467,313933,-2081649835,-1957295892,1589118070,-1924129277,1344151108,16777114,1342621440,-1929379840,1343682630,721766049,1342471686,88618751,50678433,1342471686,50678945,1342472198,16777114,1183667712,-1706027272,2338,56376963,1445688320,-1705983957,65535,85737091,721843456,1994936512,922703384,-1070922532,91724368,-1705639936,1490,-1705638165,2344,1575324510,1426064066,-326898549,1988843010,1547600646,276037635,1354771286,16777114,153983488,1340801024,400282,403056896,-1106852091,-2097151999,20542,1156056436,1443621879,503537336,92445264,-1705639936,65535,428186,473858816,158662661,1342509752,635965072]},{"sector":2,"data":[243966,28857936,-1315287040,1577058310,-1034033781,-1957363708,351044588,1988843095,-330920696,1150111766,-1706025442,2662,294531,2122516853,57999366,-1342126615,946664974,81528323,-1946401143,1143678020,105251616,-1996208637,2122516548,1131675652,17057419,1149969476,-2147079388,-28931836,1166752907,608447268,1006126729,2114216966,-2147089650,-196703996,1183384971,-1592857606,1177224472,-196703746,16402119,1996445440,-1957303302,1143539270,-59310304,65182294,-125108224,723534987,1183391813,1678130168,-1961525756,1183391813,-129594370,75499011,-1980479863,485227134,-1996155743,1150025286,-28955872,75499011,-1946925431,1200356446,-96040692,1459255039,-100609,1996485750,-161355524,507809110,-1667608546,-1962934264,1149837380,608471832,-1927527287,1344151108,384583309,140876368,1183514624,-1956684038,113401317,-326413056,1460595843,207522646,723797899,104538183,310183012,556675,-1310129292,176063232,-385649664,1586167976,608668428,52447019,1174603846,1678129930,-385647356,1200291984,507980578,50611715,104531526,2122056802,822426,209125120,-16353537,-169343882,209125126,-16091393,1911031926,-62486018,-141820117,1946580537,108411149,-1983969923,-1107039456,2122522715,242483204,294531,1539245437,-1107039456,-167042935,922684532,922682686,-963967562,1996476671,175570700,-16222465,501808246,1962871552,1043791628,-1237909755,-3699963]},{"sector":3,"data":[138451664,1599995904,-1034033781,-1957363702,82609132,1988843095,-166809590,-125093780,81542659,185091723,745801286,556675,2122516092,125698054,-100907321,-955913441,534314054,556675,1996425076,-348848380,1996445188,-61407484,722236927,937971904,-1956684268,146955749,-1873273344,-326412987,-2082959842,1448543980,-16353653,1996425846,1354771208,71166038,-15992693,-167041163,-1628896395,860157440,-385649376,1962868885,544538398,16777114,102277888,-6662576,-352321281,860129918,539354154,-96040704,326418443,1946288003,-605530616,1958742787,-6662558,-1962934017,81351,71117428,-2095680512,1946221182,922703422,922682880,-6683164,-352321281,922703418,1996424676,-25862,736821248,-2012866400,2122529092,141820154,-26026,401276928,1354771286,587162,1443687168,100677375,98842367,1577061864,49120095,1562371467,445005,-2081649835,1448549612,-1710721397,2063,-2009578358,246544966,-125048330,81542659,1183384715,964860,50753271,-1996170234,1187511878,-2097151756,2097153662,-196688080,1183514625,1222178566,-1207548279,1861681166,-603585786,-28931836,-1728428406,2080785979,247956230,-375042,1189611126,-1705552364,1605,-25755818,-1710983425,2246,-2012854646,2122528836,762577140,687491,-588765324,-25755660,1475569384,-2131533080,737095268,1996443840,321906694,-16353537,-402318282,1609110355,175997697,-385649664]},{"sector":4,"data":[92995749,-1996208853,1183512134,1183422714,1692946674,-230257901,2114340409,-26311929,105840398,16023171,1183475060,1183422714,-263812626,-1996077429,1178202694,1074953966,-1947187575,1183444550,-163148814,1183439095,-260636682,-1192069377,-11468801,-18286986,1150113281,-1706025442,3715,-402229505,1586169036,-16283138,-1108867466,-27358460,-16496759,1150092918,2095599638,-402003199,1996485663,-223745794,-282172288,-1728428406,308013136,-1979665943,999881286,829687366,1459517183,721712895,-397389632,1183446469,1996445678,1354771452,-1980369688,1996483654,-294191106,1460798952,-387156225,-2115431938,608471808,723534891,-1996193786,1996482630,75622404,2116043835,-62485733,-1981528439,1586226758,-1995994364,1183574598,-1982269464,250341446,1183384715,-62485532,-1981135223,1996482118,-361299996,-11485141,1055451254,778338304,1996445679,295758054,507809110,-476426210,-16777202,686294134,407144708,602420479,474253572,271469696,147626582,1117388800,1577058315,1575324511,1426065090,-326898549,-1957275896,2123041398,-1924601082,1343682630,505300109,158112336,1183645696,1464866552,-1710983425,4034,-129594026,1268404246,-2097151990,1946158206,1150113288,535318550,1962871552,944015884,1150111896,1156075542,959744768,-1284175754,-443850914,574045,-2081649835,-1957297428,-2136931210,-1980182268,2089025094,92210178,148679,85500160,956302381,108791364,-1996154719]},{"sector":5,"data":[-1956772284,79846885,-326413056,1459809411,74877782,-150991176,-125106578,81542659,425603,2124482932,66638084,-1962743035,2114333445,-1593538300,961021212,225707590,-1962654325,-788234738,-339672071,71666439,75367939,1577337993,1575324511,1426064578,-326898549,-1957275902,246942326,-1947273472,-599915528,-1960711420,-11526457,-1070922634,-26032,-544538624,-15808637,-1070920585,108461904,-19404720,960939659,-680196026,-443850914,574045,1458342741,1443133067,1342182328,1347469355,-26032,-1956773888,46292453,-326413056,1048794966,1946157502,-373279995,1183515021,7906058,-1962391925,8037336,184964747,-1979157038,-1979422186,-788239306,404655082,2093169413,-2134496721,-1019543332,922690428,922681464,-442892166,-1560281077,-1706031592,65535,57982987,-1207878167,988348417,8037121,2050424658,2016870144,-1547685120,1347421696,16777114,-459056640,200313605,-385649216,-1070399219,-1556593526,2057373184,718834432,14450886,2099266619,100704276,1342323176,166632022,-919470080,-351935325,33665361,14123230,2099534907,-1581121979,-661979016,-595541462,507788032,10552701,-32314618,46369729,13926594,2082620475,100704524,-654884800,-351928157,-155058667,1946694468,-1547685112,-1628895772,309248,62391275,10217472,58048523,-1962898199,-16055170,-2098658443,860222976,-352095200,-109014918,991657218,174945527,185234889,990147830,-345934795]},{"sector":6,"data":[71732058,1483998267,-109030933,-1958579196,1837761662,-389707208,-661978742,973464224,1946491910,172460603,460703998,990150283,-1976732418,-980797348,1963129216,-20906492,986250944,857306307,98870208,-352320840,74857234,79170164,-1207375104,65732611,1593835704,1575324510,1342179522,2080569728,83460123,-492824972,470170117,185431301,-167480065,1478505285,-1023409992,-1957313704,-1957210388,-1070397322,-1959246710,17098968,881717387,-16483187,-1959395532,-1073019322,69804660,-1070396277,-1974415222,734104563,104591940,930874466,-745879413,-10958082,736883316,184829579,22181056,-1959395579,721753614,-19690995,473336514,239438597,104531243,125568098,-209008501,-1962752384,990128901,2097439238,93280263,535495823,1396921183,-1974455041,1042188762,-561360123,95821449,-397322413,-1578569820,1599625455,1575324510,-1962932542,-768471971,28443371,-1947432107,-930479034,-1962911256,1959922392,-163083508,326486282,-351989087,239569678,238731774,58000668,-1962600799,46292453,29270272,32241859,-326412807,1912888971,197145359,-1961397029,103490631,250283136,413260555,-1962445819,100868167,-443874176,180829,-166808239,-603585563,516118788,1430622296,-1910575989,82609112,276204374,16777114,108954368,1444180992,-15829249,1996426358,142016266,1760038544,-161813760,1958753092,1996445202,209125134,-16091393,199755894,-163386612,1948267332,641108238]},{"sector":7,"data":[28857862,-6664192,-1962934017,1200292956,-62486250,108380171,-1996084063,1996487750,-633929732,-26109,-11141120,-4714890,-17665,1021857874,-310157815,535137026,214584669,-1873273344,-326412987,1457032734,-1961986421,-2036136378,-1547687165,-2069691528,59417347,1443073187,-167430680,1950364484,58505236,1149980702,2491704,-1046851554,-352321514,58505241,28856350,-1588572160,1346897174,1208293537,143759952,1156972544,175472691,503545016,-26032,113704960,878,59246279,922681347,-6683152,1442840831,-1207142657,-4521985,-397389057,-2090989405,-443874579,-900899553,1478361098,-1957345904,-661774612,1461120131,205949782,1946222653,16858408,-1461124235,17054979,87890804,-385649407,3998619,-385649406,37552535,-385649406,-1997995633,172395267,1946160445,-385649139,54329700,-385649664,1996424051,58386446,16777114,59417344,59512457,-91492213,755648139,1183383589,2109737972,24635651,2113930045,24111363,32786166,1187448692,-352320788,-330905851,1183514625,-2012863508,-330941693,-1243020428,1845937920,-2097150205,230974,113713012,902,-1961992565,1191387719,-1543974626,1200292746,541524772,-1935410991,-196676093,-1592495103,1183384458,241077238,52578187,-120512953,-16545117,1996426870,89647114,59389579,59522699,837568139,-167540730,1946285126,-160003286,49039047,-193035520,957251073,2114159166,-2079930537,-335544573]},{"sector":8,"data":[2118007119,-951485181,17007622,-951981312,126022,32800387,909708926,813564800,58197703,686555135,58471993,113713789,66424,1724979947,-195130380,50235274,-523368,1586230342,-24671500,-268199934,-166830453,1975530311,1882652460,1949761283,-1181067773,1342177301,1425306,-1012992,-16551370,1459844662,16777114,-6664192,-1962934017,-1705552136,65535,456999403,-385649408,624819868,-385649920,675086855,-385648896,-51773812,242679553,-1962802200,-768931770,1044117643,74711948,59250313,990279307,1946389046,-2012821754,-1962934269,-947188130,-1994111189,1200356422,-1983436000,1200352838,-1983501538,-963907514,-1994242261,1996486726,175570700,-1996029464,-1072958906,-169278603,2143292160,26863875,58998403,-2096466688,227390,-1997995147,241076993,-1070381066,1048792437,2097611630,24504579,-2076277933,92143619,-336705909,1354771202,58998403,-1962574592,49019974,-2091859925,227390,1183516030,721611760,1048793280,2097152888,-129594619,-1070923029,-205133744,-1207880983,1344144252,84821643,1344143390,969370,-2076278016,108920835,58605193,1048775659,2097152900,-2109830908,2017362691,108920835,58472073,1048775659,2097152888,-2143909628,-2143909117,58499331,1654779947,2112895748,14543107,58867339,721649313,73703928,58587195,-16725271,-2115498378,242679559,58472191,58603263,28858198,-6664192,-385875713,1048772779,2097480558]},{"sector":9,"data":[1845952263,10348803,57556611,-16483065,-2096927226,2113990270,-2079930616,-352321277,-58817780,-955875840,-16546810,-260144129,-955744768,17004550,-2096305408,2113992830,2013710086,-1979711741,-1996256194,-1962702282,1207307870,645251123,58998403,-1593019392,2124612466,58106115,-2096921949,227390,1889602676,58499843,-1560054623,1048773504,1962935172,2017362695,427032579,-401705217,1586167840,860354062,-1207274112,1344144252,1305242,-2090902016,-443874579,-900899553,-1957363702,216826860,74877782,385369741,507809104,-1080405986,-2097151981,230462,1048775285,1962935160,12445955,58998403,-2095746048,230462,-1935603586,-96040701,-1935603989,-28931837,58211971,-1591839744,1183384458,2017362932,92143619,-336050551,59416844,-1577302391,1177093246,125410036,1183383552,1183666422,-1202710792,-1706033148,65535,-1070381834,1048794997,1946157944,-159973552,89143039,502426,-159973632,-755969,-16444362,-1962639818,103545414,-1202715372,1522139209,-1706012160,6349,-624897,1996485750,2117533694,85500164,1358841387,-1174386248,1347551322,510618,-159973632,513690,-443851264,180829,-2081649835,-1957295892,1207305310,57983027,-1979669527,1183332423,-166809094,-603585559,-28931836,2005653643,-62470644,-33166591,881589318,1963226681,-1976267786,-140968890,50660910,-1559948282,1187382130,65733116,-1946401026,1979058996,-62485769,103741336]},{"sector":10,"data":[403606277,-1983370491,-1962707442,1200227422,-62486472,58048522,-1963178242,-140968890,50618926,50663942,-1559986170,480248688,-96065019,1183369470,1975519996,-62456317,-1728297334,73543415,85331595,237750315,243860608,-1956773004,46292453,-1873273344,-326412987,-2082959842,1448543468,-1962117493,2040138366,-1560281068,378078090,1465254796,-1996260888,-1072956346,1586185332,511180558,-1709148161,4175,-955901789,402950,-58817792,-15565312,-16545226,-16544714,244321910,-336481560,241077089,540231670,922703988,-1705834984,3055,-25080597,108265728,17104513,1996439669,1189631758,272039680,-1976107259,1354771203,1419674,-1550168064,-1560281067,-11533430,-16445898,721652790,-342208320,1342177307,1871770,59548416,488020560,1599995904,-1962742397,1297948645,1426066122,-326898549,-1588177130,1183384856,-129593874,-1070903274,922701904,922682640,-627440370,-1929379821,1343682630,59520767,59389695,16777114,1975520000,31189251,59522699,59389579,2129559097,112645,-1070923029,200033929,-1957202752,1207305822,175423539,503694219,-263812864,922692843,922682252,-1070922870,2107265104,-1996488688,-1073019322,2092490869,-1202708989,1344144658,1574810,-263796992,1586168700,71797744,-120518909,-1947056503,1191380551,-1980182270,1183577158,2440452,641552500,-385649408,658309251,1024160768,57999400,-385826327,2122514761,494141676,425603]},{"sector":11,"data":[988349301,-227133183,1988822654,19917298,-1947181429,652805239,73834753,104580611,58590486,50403561,-385587658,2122514705,561250540,425603,48825205,-262239487,74790713,14608718,2096264761,-262239299,-353814645,734432000,184837638,-385647168,908787933,-689372058,-327253248,-2094238720,1946158718,-262239456,1963097913,-1511436540,-193054464,1586170236,41913328,-1962888983,-1427508098,-193033472,973041641,-579539330,103532427,-11533208,-1986335114,-1962934244,9169400,15498883,2122525300,527695878,2146729529,-262239286,721831819,990150662,-1962311993,1043007103,1676346496,-1958220985,1542188670,-1962602847,-788240370,1002515449,961314503,460713598,-1952856437,-150706674,-775844871,-137352200,-775844902,66638328,972162000,125169278,-788240223,-1593578504,-134019992,914954731,1049166730,1996424076,74907398,-1946291992,-1962702282,-1962701762,1346960454,1459123967,1876122,-1499836416,-1560281060,1183515530,-11515650,-1705510282,6701,439589456,-1935474688,-1956684285,79846885,-326413056,1988843095,142510858,1342177720,1936282,-1577090816,-162827264,1948267332,507808549,74059403,-1056704047,74059403,-103679535,-1968979709,874416899,541559558,74188331,1149965291,507773730,-1968965423,608471811,-786414589,59548664,59389695,365468240,-1202323456,-1202716668,-11534329,1996424822,-1070901500,-1706012592,65535,-443850914,574045,-2081649835]},{"sector":12,"data":[1448543468,-1962510709,1187447934,-1996488452,-25035146,326369794,16842369,-8175243,-1995934707,-8127362,-13339365,-1710880714,5119,16777114,1354771200,400661072,-6684672,721420543,-6664000,-2097151745,1946221694,-18427,28837867,721611520,-1956684096,79846885,-1873273344,-326412987,-2082959842,-1957294356,-167048074,-706149515,242679552,-1711206936,6579,-1980348791,-11077546,1676151414,-196703745,125091851,1115537419,-2130661399,1963000062,172395321,-1996479187,-1072956858,54337916,-786661632,1586231910,-24671494,1174509570,-96010248,-1963303285,-1744634233,-637439,1996486262,531077880,2092433408,-1957683709,103544390,-1957690486,103544902,-1706032244,7880,-1544141173,1183515530,59548664,16023171,1586183796,860354062,722039872,-1706012480,8026,-401705217,1996423224,2083979022,2117533443,58761475,58459691,58892624,58590763,112720,389257808,116064256,-401705217,-2090991554,-443874579,-900899553,-1957363702,49054700,1988843095,860157444,-1961266112,2092447868,-1957683709,-654891451,675646288,-1705977609,3800,-443850914,180829,-2081649835,1448543468,-1710983541,6238,738084489,860157695,1445229632,16777114,-488704,-2120548746,-16777209,1979711094,678821670,-13994497,-1751503755,-16777209,2092498550,-1202708989,-1706033148,6256,141885195,-1694599425,2000,-1694599425,6357,-443850914,180829]},{"sector":13,"data":[1475119957,209095510,-167084405,1950364484,944016141,503326213,494836304,2092433408,-1924129277,1344151108,1766810,1676170752,112895,482712144,-8323072,242548897,-1559869813,1183515532,59417348,1149970155,507773730,-1968965423,1149980675,541328164,-1935410991,1452953603,-16777190,-1710886858,7536,309334,505936,-18352,1392508858,1354771280,-1706012592,7472,-443850914,705117,1475119957,108432214,-352026997,278550024,-1962934240,1979136820,-1956684044,79846885,-326413056,1988843095,75401990,208992059,-396937985,-1705574421,2260,-443850914,311901,1458342741,-1962641781,2013202014,-857188852,1962281983,-1070901753,-6231984,1575324510,1426064578,-1070863221,74907472,-16761112,922682486,115868956,1575324416,1426064066,1448602763,-1962510709,367723646,-150991176,64523246,-16458722,-1070920585,-10688432,2096577350,-1956684057,79846885,-326413056,1988843095,75401990,246945003,-1947207936,-602012712,209190660,-397361109,-947126482,2143697743,-1956684059,79846885,-326413056,1460071555,964694,50622199,-1996170234,-125043642,-1961965693,-347732874,-2084074717,1344147143,519849611,964688,560241232,1996423168,-62487556,-18418,1435728,994494091,1963269126,470745044,-1956684283,46292453,-326413056,1443032195,-1962516853,149621879,280202,881539140,-193595893,1575324510,1426064578,-326898549,-1957275898,-1207624650]},{"sector":14,"data":[-285802482,1040447627,1166869724,-28931598,1183523307,-26311682,-1957683698,-1202708793,-1706033138,65535,250577751,1342177720,-1946181912,1178160838,-2655228,-1207624698,1861681166,-603585788,-1202708988,726663182,-6664000,-1207959297,1861681166,66620164,-1962615746,-1202708793,1344144658,2058650,-1956684288,46292453,196671,16718344,197004,16718292,197005,73077,210817,73590,222084,73962,152196,16716811,131603,16716658,197140,67630,145545,16719809,197141,74157,222346,65929,217611,73703,202254,69278,202768,73276,222485,68297,201622,68705,16977304,532239,196706,67594,201242,73160,209565,16715864,197042,73312,220450,72415,217004,68848,201133,68659,199986,70502,16987959,532219,16973953,532268,196738,72269,217660,72327,222269,16712983,196943,69626,206143,73676,206912,16714771,196945,16714838,196946,69032,201540,73457,203973,68674,198342,73354,204874,72263,217676,16716615,197084,73440,16988369,530604,196637,73648,210778,67756,200027,74131,217692,72345,222430,73524,211169,67915,202979,68860]},{"sector":15,"data":[16978276,530569,196653,73504,214501,70401,210794,16713181,328059,16716808,197139,67488,343276,16716655,328212,16719806,197141,16713480,196990,73250,210032,16713755,196994,73091,209523,69283,211572,69806,4983,0,0,0,1167087646,518818645,-326903666,1996445286,242679568,-1207142657,1385758725,-26032,1183383552,1975520176,-373282043,1996424208,-1334378736,16777114,-230258432,-26032,1183383552,-1269397070,-579550709,649223876,-1960441973,1183384151,-61437446,16533239,-1207602160,48955393,1183432747,-25928,1183383552,1183666358,-1706027334,65535,-1699318017,65535,-1984280949,1589947974,1200301746,-1639544571,122129190,653674121,-1995880565,-1960402874,1183386439,1200236280,-1572435955,16533239,-385649216,-1070923521,-1981921655,1190583366,309658106,1946830393,175570701,383534733,-26032,1996423168,-998834274,1342178488,64410,-599392000,-624897,146321014,228216832,16777217,1996480070,-998834272,1342178488,74394,-599391488,-2079095,1996486774,571566,46701136,1174601728,-498693666,383534733,-59310256,-1963297025,-466967994,-401698736,1048774713,1946157502,84844805,512428011,1200293428,-163149536,84179617,1177092100,-163148810,2128758329,-599356140,-1070903274,-163148976,1357006379,105370,84975872]},{"sector":16,"data":[956302381,394190918,383534733,84975952,769672747,726663172,-6664000,-1962934017,1183439942,-565802082,-1946794359,1177280582,-1605989924,736249483,1183440454,-1983894536,-259267514,10649216,1996435060,-1568767984,-1005881857,-1960398242,-768930233,1183517163,-1269396558,1375735045,-26032,1183383552,1975520228,37021955,-1951250805,218477654,-397389312,1183385228,-262764050,-2115481518,-1538881274,1386632841,108456016,-1981135223,1589963862,1065363182,-1962511360,-339571517,-2147305467,1347605035,-5867777,1183556726,-61436934,1391453824,-1636368560,-624897,1996464246,175570936,-1804545,-1070919562,-1298509744,-1962934269,1979059184,29157635,649223876,704923530,-398030364,653156036,91563832,-352321096,-1983894782,-1072961978,1122567029,1413793537,1183514624,1279560132,-1985067381,1183534660,139889414,-1992014711,1153910356,-385875886,1589903645,939468522,-1195084033,-1706033148,734,-996260215,-14226850,1996423799,571566,49584720,1183383552,-362887946,74972966,-1195084033,-1706033148,778,-996129143,-14226850,1996424823,571566,-26032,1183383552,-362887944,172460838,207063846,-1980086647,-1960379306,1183385671,-1933341780,918978,-1980873079,1589964886,126494446,-157661560,1954585158,1086556966,-1985722743,1586144854,-1895880038,637747206,190809994,-301603798,-297367285,-1030457,-15733761,1996484726,85911790,-1985722743,1996465750,-1535705178]},{"sector":17,"data":[-1996156952,1451862086,-260636758,-1149185,1996465782,-59310172,-362753,1996463734,-1602813962,1459123967,-5474561,1379930230,-26032,-1073020928,-1705637259,65535,1760294443,648568516,-467007606,-1030962429,-364476096,-1947445623,1325393990,1958743016,-19470077,15105667,-397007244,1183383701,280516340,1996443649,1354771444,106889040,208977931,5405827,1996424821,3860724,12091011,2088965748,276103250,112726,-26032,-1705639936,65535,-1695385857,65535,-1695385857,65535,-2090940789,-443874579,-900899553,-1957363700,1988843244,-2017962492,-1070903296,-1706012592,1138,309594280,67221590,1354771280,1384120250,93755984,-1705639936,65535,1575324510,1426064066,-326898549,-1957275902,2089485430,1962871554,-336098530,843380238,-166955775,1963471684,187992838,200177142,-1962641930,-1962742841,-1956684090,46292453,-1873273344,-326412987,1457032734,1443395211,16777114,1958742784,41192215,1183517419,876886278,881526388,-227150325,49006219,-2090942421,-443874579,-900899553,1478361092,-1957345904,-661774612,209095510,175570774,-1394078064,200313855,1443656950,-16222465,-6683018,1577058559,-1962742397,1297948645,503318730,1430622296,-1910575989,1988843224,1996445198,-401698804,-259260553,292877835,175570774,-16222465,-6683018,-352321281,1589652226,-1962742397,1297948645,503319242,1430622296,-1910575989,1988843224,1996445200,-401698802]}]],[[{"sector":1,"data":[-259260613,343209483,209125206,-16091393,1996425334,97884678,65732608,1587134507,-1962742397,1297948645,503319754,1430622296,-1910575989,1988843224,1996445194,-401698808,-259260677,292877835,67221590,108461904,1347469355,396698,-310157824,535137026,113921373,-1873273344,-326412987,1457032734,1443395211,-1878624513,-20846578,-166989685,-1202318988,726664192,1347440832,16777114,721611520,-310157632,535137026,80366941,-1873273344,-326412987,-2082959842,-1957294356,1183647862,-230258186,-2081139060,1946158718,197561108,-1005683264,1191178846,130426610,-1948715219,1183667952,-397404430,1589903395,130426610,209125120,-1928694017,1343682118,-2048389488,-310157570,535137026,147475805,-326413056,1988843095,184451848,-963961230,179950123,1358034688,-16353537,-521665418,702975,-768883061,-225709577,637820612,-14270581,1200498183,80120578,92808752,-443850914,442973,1167087646,518818645,-326903666,-950642896,64582,185091723,141822534,638082756,1991,-15829249,1183648886,-1202710820,-1873805281,-30414834,-1982052723,1452070982,-16520230,1589958726,1065363160,-940280800,53318,425603,-2144989580,141897023,-942127361,118854,837547563,2134507395,-62470339,1988689921,-1178170414,-503906294,808306435,-2081387776,1946158718,-764004087,-1070920834,-963953173,2010269241,-664877835,651708159,-1952970870,822051832,2122563197,108265680,-654850421]},{"sector":2,"data":[-15994741,2122517365,91488508,-352321096,-994039038,-1993996194,1590070023,49120095,1562371467,707149,1167087646,518818645,-326903666,-1957275868,2123042422,-1983894772,1149846084,1145342784,1950761995,-11053550,1996425846,108461832,189029631,-1957923392,409031,272452980,1031304192,125042708,1946163261,1451158294,175570774,1342178488,16777114,112640,-2089096295,1962936958,1350337294,-1593281280,1149829218,-2091455664,1946158718,1383891792,-1958054912,1418412100,-2091717822,1946159742,1350337301,-1281024,2023379060,-956301308,20548,1048829419,1946157154,1350337494,-1580174080,1149829218,1456008016,1342247352,1342177976,1347469355,-347841281,-11053386,1996425846,108461832,16777114,-2090902016,-443874579,-900899553,-1957363702,73319660,-12615642,-1014298251,50709132,-1005458688,1191117918,1065362948,-1946913536,-1031011258,-1034033781,1478361092,-1957345904,-661774612,175541078,80583254,-1073020928,1589927284,939468294,-1202948865,-1706033148,2298,637951684,-14284919,1962869879,309324,152148560,1589903360,1200170502,2013210116,1316290306,1342179512,600218,106873856,38242598,108527398,-1202817793,-1706033144,233,637951684,1577469833,-1962742397,1297948645,503318218,1430622296,-1910575989,-1957275688,2123041398,-15275258,995495030,-1207601673,48955393,-1873756117,-62658546,141965638,1600054653,-1962742397,1297948645,503318730,1430622296]},{"sector":3,"data":[-1910575989,116163544,915101271,1049298046,2122515584,175374342,-1593024828,690356652,1183515207,12592394,1946173501,8404263,-1069739148,-1003653888,111217758,-2147079419,1193879044,242679554,1443657471,-26025,283836416,-150993480,-1192195090,-269025275,-504629109,-310157474,535137026,181030237,-1873273344,-326412987,-2082959842,1448546028,1443526283,577178,1975520000,-373282043,1589903589,1066083846,192216635,-6662314,184549631,-941198144,62022,49825479,106873856,38243110,1962999869,-2017962216,-1070903296,-1706012592,2748,-151632247,1946482246,142016280,-1710852353,65535,-16222465,-6683018,-352321281,106873891,71797542,1946160445,1028093745,796131331,1962936637,-163121456,1456108802,24963159,-352321096,-230242462,1190526977,-1250622986,1996445526,6088946,1187505899,1442841080,1342247352,737703679,-1706012480,1116,455986923,1064192,-1073509513,-1476448621,179243730,173345365,173345365,173345365,173345365,177539669,177867413,173345434,178915925,1593794281,49120095,1562371467,445005,-2081649835,-11140372,1996425334,23062534,-1962522999,75400176,-16157696,-397014922,132841565,1443395327,-1962926360,108411376,1156975732,-579532749,271795446,-396961932,-1956710140,113401317,-326413056,1459809411,74877782,1443264255,-1962909464,-396929288,-1073020608,1996427124,1827165958,-151483648,1946300997,1590135793,1575324511]},{"sector":4,"data":[1426064578,-326898549,-1957275900,1156973686,477364786,1443264255,-1962924824,74907640,16967767,74760203,200001163,-454297717,1443264255,1577068264,1575324511,1426064578,1448602763,-1962510709,1032520830,58064651,-1962771317,-1956684089,79846885,-326413056,1459940483,-1946801322,1996424318,-823634170,972590079,141886590,74774027,82560651,-420743285,-443850914,311901,-2081649835,1448543468,-1207667061,-1706033136,65535,92127243,-352321096,-1983894782,1996487750,1055413766,-1947170048,-58817538,-16157696,-396949898,132906903,1460041471,-1946193688,1962818552,843445778,-153193471,1963471685,860223192,1473410064,1593303016,1575324511,1426064578,-326898549,-1957275902,2123040374,-1948284156,1183397959,1958742788,1959148303,-1965520117,-1071369401,-495697860,1600046987,-1034033781,-1957363708,73305068,36849654,-1014298763,1963345465,112645,-1070923029,-1034033781,50339076,17570816,53377024,17458944,52722688,17112832,56753408,17301760,52100864,-16651776,50370048,17359872,55708416,17318656,53383424,17433856,56660480,16873728,56956160,134249473,50355456,17334528,57121536,16933632,50475520,17440512,56865792,17451008,52772608,17049600,53788416,17419776,56967168,17456128,52675072,117714945,50336512,17048064,51266304,16805376,54055168,17127168,56744960,16811008,54059264,17021952,34071808]},{"sector":5,"data":[17000192,51113472,16833024,56683008,117448193,50347008,117454081,50347264,117456385,50347520,117716993,16128,1167087646,518818645,-326903666,-1957275822,111350342,-6664186,-1996488449,1451883078,104267772,-26106,1183383552,-1302951504,75892423,1183514625,-1337576454,1954545833,-2046376186,-939524348,17074694,-62485760,-1447934413,108298240,76154567,1190658047,1962999814,-364475047,1996443670,142016266,16777114,309788416,384452237,178256,-26032,1996423168,-26094,1183383552,-1168733768,384452237,-1200160944,-26030,1996423168,-26094,1996423168,-361300206,-1280257,1996484214,-25872,1589903360,1200301576,120268292,75902711,184867491,-385649216,2122514951,57999372,-2097021207,1979649150,276233998,-1710328065,65535,-15972727,1183650422,-1706027318,65535,411383,-1962576894,49009222,1174650923,-1976633398,-1136228092,-2147072266,1183517556,-754405114,-337368344,571395,-1982574965,-150770674,84452321,638082756,-1331492981,2139825667,205949698,-1961998845,1183387734,-1235842636,537282294,1183533684,795910,1946158141,539941,-1960440459,1183516287,-1976633398,737684228,-11054912,1996427382,-1233715442,-374049025,1589903693,1200301576,-901371130,-120469717,76164855,38208294,-739510133,2122970667,239504318,-1995417973,1451869766,-230258232,-1980475767,1183577718,-1235842124,1964004921,239483144,-186055819]},{"sector":6,"data":[276233984,-15829249,1996469878,105286580,1342181413,-1996231448,1451868742,-968455740,1455969929,-11485141,1996427382,1996444174,-18238,15853648,1190588555,913575942,81409593,1183527037,-195654670,1964004921,239483141,1589911668,1065362958,-16550624,1183518278,274107150,-1983756663,1183433814,-933852730,1589914603,126494402,-1069119080,1946160445,670981,1191125365,-1033976638,-1744336346,-2134880629,-1053095951,1191117685,-163133502,-164954111,-1950581245,1451999814,239503812,-2096081271,1962997374,-13702909,-11485141,1996471926,-227082252,-3639553,1996473974,5367814,-1950450039,1451953734,-968455920,-1983359351,1451881030,-163133452,-102170624,1354771454,-4294913,1996485750,-931725326,-3770625,484968054,105314048,141885696,-1710065921,65535,-310157474,535137026,248139101,-326413056,1460071555,276204374,61881995,-16482685,1190539892,745800452,81411723,1347469355,-15960321,1996425846,108461832,1358954424,738183912,71731960,20710180,-3079563,61881859,-16482685,1190529396,58015748,-16740887,1996426358,142016266,-402229505,1183383721,-27883012,-16482685,922689908,-2036267514,65992452,1996443847,209125134,-1962248449,1177287750,-6664182,-16776961,-16382410,1996426358,-62485750,1342850603,16777114,-1947204864,1451951686,-62506744,1589923699,1065363196,-15305463,1822555206,66638083,244029894,-101251832,-1947601088,-62485520]},{"sector":7,"data":[-1979820405,1451821638,-9180916,101070591,-150698335,1355219950,-15829249,1996426358,105286410,1342850603,231322,1590070016,1575324511,1426067138,1183575179,106334980,1929922105,140428322,-1744336346,102865488,-1073020928,1191118964,138870536,1589959915,1065362952,-1947044599,1451952198,1575324426,503318722,1430622296,-1910575989,485262296,176063318,-14126080,2107247222,184549381,721778112,16509376,-1979031925,-466996409,-1996486619,726923334,-1332064064,-16777212,1996427382,209125134,-16091393,1996425334,-26106,-259325952,511047179,687747,2122519156,208994552,-1207273729,-1706033151,1436,-369098824,1996423337,-26102,1183514624,1413777912,708002954,1058276,-2080749943,1962955388,-465138373,-1070903274,-1202696112,-1706033151,65535,511033355,16416387,1187451253,1442841082,1342177720,374426,-1697846528,65535,2122565099,292885222,-1990835061,-1705575354,65535,-335788405,-465138370,-1070903274,-26032,-1073020928,-1923734667,1343677510,16777114,1975520000,-465138412,-6664170,-1929379585,1343677510,16777114,-427917056,-1770782440,1593798889,-1962742397,1297948645,503319754,1430622296,-1910575989,142016472,16777114,1958742784,140413763,3702659,2139300212,460652628,-1204258817,-1706033151,65535,-16228725,62404727,-6664176,-16776961,-1070921610,-26032,1586167808,1380435720,1183514625,1447528710,-1962742397,1297948645]},{"sector":8,"data":[1426064586,-326898549,29251074,105286400,956847755,1215760966,638213828,1033373578,561774601,2113931837,867596,540870516,-351505408,172395280,51140235,-2094470202,1962935422,173982960,638207743,1352140682,16777114,1958742784,172424963,-1377044949,-1962260853,1581780054,-1034033781,50338570,17148672,53442816,17116672,56654080,17070848,53738496,17126656,52722688,17106944,52592640,134253057,50351872,117500929,50354688,16806144,56920576,17062656,56660480,134454529,50354944,134282241,50355456,16817664,56956160,134223617,50355712,134227457,50356224,134265345,50356736,134251009,50356992,-16507392,50344704,17098752,52606976,134260225,50364672,134408193,50364928,17124096,52675072,17105152,51266304,-16477696,50354432,-16433920,50354688,134478081,50340096,17088000,58939904,17112064,517376,0,0,1167120524,518818645,-326903666,-1957210616,1156974198,158727946,-26026,434831360,105182864,-1928170488,-397347258,1996425785,-126418954,16777114,41221888,16777114,-2090967296,-443874579,-900899553,-661913598,-1957345904,-661774612,1988843350,209619726,51135627,105314247,376766463,34030838,1156976757,175439626,2116568123,-339725563,960532603,577973316,1342185477,860894463,-6664000,184549631,192239808,-402325313,-1070396885,-1987029269,1996434500,-26102]},{"sector":9,"data":[-11403264,889129078,16777114,306447104,1344163870,1344194307,722224267,-1073016252,-998046091,-1878529272,-26032,-1705574400,218,17595393,1149964924,272926994,-15448951,-26060,-947191808,-310157729,535137026,181030237,-1864856576,-326412987,-2082959842,1465256172,-1928956277,1962931838,-1705568766,65535,1461081878,504775821,-26032,1996423168,-163149048,-2147072778,1149961844,1223217438,-126419120,-362753,-6620042,-16776961,1962870902,-26060,1583284224,-1962742397,1297948645,-1946155830,1430622424,-1910575989,1988843224,38046470,-6664112,-1711275777,65535,-1873391536,-9050098,-310157736,535137026,46812509,-1864856576,-326412987,-2585058,1033504886,-16777216,1996425334,-26106,-310181888,535137026,80366941,-1864856576,-326412987,-2082959842,1465262316,1443264139,-1897394544,41222143,1183666256,-1706027298,65535,-1394078064,-565801985,-152666485,1979648580,-1983446270,1183518276,507808232,-1929218817,1344149060,74906,105182720,-1927383936,1344149060,-773306741,-654882584,239373136,-388896559,1356396360,16777114,239373056,52585719,1149835332,507808540,52978935,-1992288700,1583290948,-1962742397,1297948645,335545034,-2113896192,134219520,218138368,167775744,16973824,50528771,134479875,302254340,262660,16843009,352588544,-134217724,2047027714,-586960125,-100403965,822356995,1057242884,1057242884,1225032452]},{"sector":10,"data":[1694783236,-1643869180,436510212,-1543287037,-1878739708,1430622352,-1910575989,-11053352,-1070395786,-26032,-259325952,235689611,-1916630265,-1191025858,-1343094760,-1962258805,243174367,778567470,-1207011585,-1705967624,726,242679632,-1207273729,-1706033151,65535,-385875528,-1202257770,-1705967624,768,-385596279,1589903494,1200301574,2005607960,1958742806,-1365618682,-1996488704,1988692038,30861318,1685372939,1358958009,16777114,876906752,-401698730,1183579755,1958742792,1996445199,108461832,53864462,-150510464,-352321096,-167014345,76231284,645185547,-26032,1156972544,443940618,188236939,1342600384,231066,910461696,108314635,60398160,-1705639936,934,-158316821,1963460164,105676857,124026888,-1070376965,-11517872,-6680972,-402652929,-1873410362,-64428018,-352255809,105182741,-401640440,1686111922,-6621434,-1090518785,300483072,636929,-1957275413,-1706012668,185,1225412235,990665867,-2029881653,-990868533,-645200258,-1070357261,-1695315030,246,-768358773,15067486,-351517557,107249697,1959332831,105676825,1444145952,-26030,-1293352960,-155176192,1947207236,-768393215,-2147435799,200214116,-2131528503,-351271348,142016493,-1710852353,65535,142016342,1342600959,-1710197505,65535,-1953465877,1418399812,8775954,-16222465,1150092918,-6664170,-352321281,417894516,-1871779068,-16104202,-108984716,58134528]},{"sector":11,"data":[-349156215,1364350556,-2096597249,208932090,67369601,-92207500,108332036,211866,1996443648,1979058950,920423181,-1710719095,65535,1149971435,1958742794,-26105,166395904,16777114,855829248,50380754,134694134,1686113140,1347614471,1476771560,-2090967206,-443874579,-900899553,1085800458,985157632,-6664192,184549631,-1023314496,1686171787,861402887,-1705619264,65535,-1207796599,860880962,105155008,1149837488,664424492,184549381,855864768,76137408,-1001385,52468304,78184448,-972458752,-956233148,268447812,1946189993,122454020,-2134706430,-2147191808,-1451227572,74711296,268913792,-16104202,1381370997,-26032,-1073020928,-6680716,184549631,-2147191616,-31455412,-661863488,-1957345904,-661774612,1443556483,209095511,-401698730,1962933153,1347833858,-1946925431,1317735006,2128165640,1004111618,159255628,990661771,-1962770727,306985945,-1957622658,310152147,-352158232,1962905612,-1949201646,1877479548,1464884994,-16104202,-11139980,1547433078,1393327376,2089537931,38529040,-7336725,-745861004,-401441653,-1991245251,1284051036,172291602,-1710394113,65535,410778,-1878594816,16777114,-401698816,1190656839,1962934022,244340230,1610193384,49120094,1562371467,576077,1167120524,518818645,1465309326,-1962510709,861274740,1196906495,-26025,-1705639936,65535,-310157729,535137026,46812509,-1864856576,-326412987,1457032734]},{"sector":12,"data":[175541079,-401698730,2126838543,-845543930,-1912602620,-1178586174,-218300417,1239021486,205818185,1444037769,142016337,856061695,244338880,-2131138584,-2131818908,856164172,608471488,1583333630,-1962742397,1297948645,-1946155318,1430622424,-1910575989,-1957210408,1451952758,172291590,1443722751,1376286463,16777114,-1877480704,1413201971,-1844478954,-149535701,-796189068,-401834869,1156972853,125050887,-6664106,1593835775,49120094,1562371467,445005,16777729,33882626,33554689,1040,134875118,135464979,137037858,140904497,1167120524,518818645,-326903666,-1957210614,2122386550,1963065354,41221939,385107597,34970192,1183514624,105266164,1183516797,105266168,1183384445,-163149050,2097694267,-96040184,2097694267,138840323,507808598,1174661329,142016262,-401698736,1183448877,39095292,235554443,1480494343,571655,-13717518,1283460709,1686110470,-91489529,-26025,-1705574400,387,1074152694,1183524725,340036092,-158326805,1946224196,-26035,1686110208,-1873347066,-136779762,-158319381,1946224196,121959989,1445950724,-15436545,-1873347466,-42801138,17464961,-1710263038,65535,108316475,-26025,1156972544,108396298,-26026,1583284224,-1962742397,1297948645,-1962932022,2126986178,-1010332926,-952384885,-947191171,620761283,637544192,603990016,754983680,201338368,553656832,503316480,1141456649,1510561801,1829330697,2114549001]},{"sector":13,"data":[-1425439735,-1106662647,-326413047,-2130383741,1963000058,284787461,-91553676,-62485167,26470480,509381465,-2129767285,1963000319,105182764,-2094828480,510988537,67585270,-1202319243,-11534079,1996488310,-401698564,1686175350,1283505926,1458111495,-1962471935,-2059498047,899336,-13717518,1156978789,57950214,-167691031,1946421060,124026887,-1878660101,67587200,1074154624,-150919959,-1877939237,537347318,1398147444,16777114,869829376,-1871516718,-617358601,-1953469461,1579882076,-27882500,1575738103,1610660752,1441518131,-6662512,-352321281,1157009430,158613510,-26026,132841472,-6662512,-167771905,1979648580,1654281734,-1090519032,686293760,-18431,-167730199,1979648580,573396490,-6664192,-352321281,1686147081,1686159110,-1695941881,121959936,-1960807420,1144721476,1393849618,12080722,1996443649,-59310082,-1880617328,-2141496579,33228644,1442970718,172291838,-2129562113,1952448763,1183667723,-1706027268,65535,68204630,1074152694,12059509,1996443649,-59310082,1407717008,105182973,1443919168,1342243256,-100609,244382838,-1912783384,-397345722,-11141083,1996488310,-401698564,1347878069,-16104202,-6682508,-352321281,-6647802,-1962934017,1438866917,-1957237621,1144721476,-1962705900,-162524604,1979648580,1996428812,-26108,183173120,1996428944,-26108,-443875328,180829,268911862,-1873400203,-154408946,1342338303,1962889302,309657360]},{"sector":14,"data":[-16104202,1234831476,-352321530,-1070362614,1369067600,-1879048186,-153753586,74776515,1342247352,-1207798529,-1705967628,1382,1962891088,-26110,952303616,-2013265152,-117440255,268436279,-16776957,-536870118,-2080374528,-1358953646,-2046820095,1275069317,-2013265656,1812005678,1509951236,-1761606912,-1979711228,1359020900,1459619843,1442841344,-1862270712,-335477970,1560283137,-889191680,-1795161853,-1174404221,436207873,-536870088,-1694498556,-1711275161,553648391,-603978911,553648394,-1493171358,-1207894267,1392575232,83887877,-1828650240,100665088,-1409219840,117442307,889193216,-1207959296,66436,134219524,536937216,150996740,-1811938560,-1090518778,-436206796,1056964874,956302117,1073742082,-1912601755,1124073734,-1090452649,352323334,1392575232,369100801,768,1358954760,436208517,-419365120,1006633729,1459618053,1107297122,-402587900,2080375553,-385810684,-301989119,-369033468,-100662527,1509949703,-184548558,-352256252,-1644166399,-335479035,-1224735999,-318701814,-1023409407,-301924598,553648897,-285147385,1191183105,-268370169,-1694498047,-251592951,1291846401,-234815735,1996489473,-218038519,-2046819583,-201261303,1577124609,754976769,-1895824640,-184484087,-1224735999,-167706871,134218497,-150929654,1459618561,-134152438,1593836289,-117375222,-2113928447,-100598006,838861569,1795162369,-1912601755,-83820790,-352320767,1912602883,436208516,1929380104,50]},{"sector":15,"data":[1167087646,518818645,-326903666,-1957275846,2123042422,-1983894774,1183447622,38046712,-1946794359,255659078,-385649408,58065082,1023512041,326369285,1962937149,23128323,1962937405,18671875,-16676887,1183708790,-1706027322,65535,-2147072778,1183657844,-1957685562,731455044,771281346,-654901247,239373136,734147481,178626,-1036781357,19776043,1356396288,16777114,-901346560,-1715059157,-149009269,675580409,410871,958493954,192819268,-1993325429,1149968452,-2096174296,1946165372,541362955,2083013689,809798125,19023047,675580672,52325623,-1992243642,1149966916,239338264,-1961081719,1452013638,18475514,67519734,-947129995,200296073,-15698496,1183708790,-1706027314,65535,-1030519,1962930294,-26060,1996423168,-25866,1996423168,-6662416,1442840831,737179391,-1873784640,50653198,-1695123713,65535,-1552548085,-1913227521,1343671878,16777114,1452600064,12511319,-11104789,1996426358,108461832,16777114,-8656640,1354771286,1290276496,1996445186,108461832,16777114,1975520000,-10491645,-26026,1458110464,1183536895,340035846,142016336,1342177720,184474,-12588800,91619083,-352321096,633350914,-523173887,1284235473,-69107706,1149878539,-14685946,1996620349,33570088,37587059,-385649407,1996488569,209125366,142016343,-1710852353,65535,-1980217719,-219547050,33832446,87941234,-385648894,20840280,-343247868]},{"sector":16,"data":[-2090901807,-443874579,-900899553,-1957363702,518816748,1988843095,-297351418,1187446785,-956301084,58950,-1710983425,65535,242532363,-16616193,-6683530,-1996488449,-1705638842,65535,-2132130167,-2146433460,-1962408116,1183518844,539908,222103412,-344165376,340036479,1964000313,306481925,1149961195,-28931824,1342181560,16777114,2092960512,-25263326,-1958969856,-1957691778,1183448646,105183206,729030656,-1147513002,-1962934270,-1960776712,-1992229306,2123097670,105183230,259268608,-6664106,989855999,57992774,1457932031,-428409001,-1705983957,65535,-401698730,1183384116,-948769810,3015750,537165443,2088984434,242483248,722224267,1141051972,809777936,1149979507,205797648,1187448181,1442841060,-35123568,1183399937,71732718,-1929886071,-1709770154,65535,1459242633,280311,-1207601665,65732609,1342177976,-362753,28899446,-6664192,-352321281,1354771208,16777114,1996445184,1996445674,-401698588,-11140906,244322932,-16755992,1996423796,-25878,1599995904,-1034033781,1478361092,-1957345904,-661774612,1443294339,-1962117493,1727471172,373555978,-1946532215,1183389764,106874108,-1946532213,-1993933738,1468605959,-310157822,535137026,147475805,-1873273344,-326412987,-2082959842,1448543468,-2096597365,1979647614,272927494,-1962522999,2083194494,2113866538,347624984,112742401,1149980676,62495016,737801984,-338102329,105183016,661914112]},{"sector":17,"data":[721845899,2083203708,2130643752,347624986,112742401,1149980676,62495016,66713344,-6663993,1577058559,49120095,1562371467,313933,1167087646,518818645,-326903666,-1957275882,2123041910,-1923656184,1343682118,635965072,-129594369,-1995553789,1187511366,-8584966,1996423796,112650,-26032,1183383552,-1923655958,1989013118,503781110,-1515905258,1595909541,-293698722,-955941632,60998,425603,1962874485,41221892,-16091393,1183705718,-1706027282,65535,-1207273729,-1706033151,65535,798635263,-1996488699,1996483654,-159973622,66615039,-1957683513,-953480124,-26032,889126912,351130,105182976,108335104,134628598,-11137164,1962871414,309657360,2028474000,-2090902016,-443874579,-900899553,1478361096,-1957345904,-661774612,1443294339,-1962510709,1143673412,-62486256,1014284299,-6671105,-1996488449,1150024262,-96074990,1149980702,-96074992,1149980702,306457356,-26032,1183514624,205793788,-6671105,-1962934017,1149833284,340035858,-134461813,-310157608,535137026,46812509,-1873273344,-326412987,-2082959842,-1957295380,1156975734,1198851078,134628598,1157039989,1947205638,1996445242,-163148536,244338710,1459474408,-1928956161,1343683142,-1041756528,239373309,-244223,1183648374,-1706027274,65535,-362753,-6621066,1577058559,-1962742397,1297948645,2099402,41746435,779616257,55377923,1669267457,88997891,1384382465,20185091]}],[{"sector":1,"data":[-2054815743,21299203,445841409,16777219,429522945,31457283,1738211329,5505027,1629552641,36438019,3342591,96993283,1721958401,74317827,464257025,78381059,456392705,97714179,-2068316159,79626499,524295,81854723,589831,79167747,131080,8978435,1698693121,52429059,1376263,18219011,-2058289151,81395971,2162696,43974659,32506111,17694979,2949128,57540611,33292543,54722563,33358079,26804227,33423615,38010883,33489151,37421059,33554687,25296899,33620223,24444931,33685759,22872067,33751295,18808835,33816831,69402627,33882367,0,0,0,1167087646,518818645,-326903666,-1957275844,2123042422,-1983894774,1183448134,38046714,-1946794359,20778054,-385649404,58065284,1023617001,57999616,1979752425,47638787,1962935613,45345027,1962937149,21162243,1962937405,14870787,1946160957,46917891,1183434635,1975520236,-159973616,382224013,-26032,1183383552,1996445420,-898170900,619187856,1962871555,51046659,-1913227521,1343670342,16777114,49998080,18200662,67549264,108461904,47770,347624960,112742401,1996443652,13277704,-706150400,1996445186,1996445452,-26106,1183383552,-61437446,-369867127,-8191300,-385649651,1465254580,-385598744,1156973228,57999622,-1962761239,1284184644,-103724770,1183433003,105266158,1183384445,474254086,-787592053]},{"sector":2,"data":[-1983828999,1178332742,-1996260088,-11139002,1996426358,108461832,16777114,-4696576,244338943,-385396504,727056988,244338880,1443316968,-16222465,-6683018,184549631,1446409408,1444655592,1347469355,1443612136,-1202667477,-1873772545,334161934,-1983894698,1347425348,1342177720,122010,105182720,1443263748,16777114,244340224,-384099864,-16055804,28837237,721611520,75200,-523116335,-2147070837,-1056179231,-385465207,1149960676,105265420,1183516019,-1962677498,1183386692,-1873783062,112977934,-364475562,1343505545,-1207404801,-1706033151,65535,1150003179,1183422752,-61437446,-2097043479,192282623,276102998,-2115498352,-1962743035,-968455737,958416011,243123782,-775528821,945554403,-768931957,-4666133,1455877119,-401698729,-1108670237,1996445526,108461832,-16359797,413591607,1996467179,-26104,-1031077888,-1928837495,1344149060,-16222465,-6683018,1442840831,1347469355,-2130000408,67308670,770245492,-159973631,1342177720,16777114,18802944,1354771286,115871376,1463585030,16777114,-398030592,-6664162,-1996488449,1149832260,-6662356,-150994689,1073743428,-397015948,889133662,84690059,1183383584,-1070903048,-26032,-1073020928,1183516276,742689272,-284793728,1354771286,173074512,1354771286,1350565816,1978142352,-1070901742,1343505545,-18093744,-628358005,1459549161,442820695,1459546857,-16353537,-270006154,9365766,410183766,1459541737]},{"sector":3,"data":[-384060440,356384463,1025865473,57803028,1040031465,57999618,-149527,1996486262,1996445452,108461832,16777114,-22615808,1963065405,-39655165,1963065661,-39589629,1963065917,-40703741,53334507,1391876,-1073493641,-1476448621,37356394,53150266,53149852,53150507,32440802,49021560,53150507,35586859,53150507,53150248,50856719,1183515379,-61436934,-310157474,535137026,181030237,-1873273344,-326412987,-2082959842,1448550124,-167092597,1946420807,11397379,-1711114241,65535,-16097653,1996423799,112648,-26032,1183383552,108954602,-1961724928,2013203038,41418500,1342732031,16777114,142016256,-1710590209,65535,-1928825089,1343681094,16777114,-196703488,722099851,-1952901049,-101249457,-166989685,-1070922627,-963968277,-1947449719,2005600862,1183534624,407317496,1334548808,-1946552562,2130590712,-339309820,-1983411454,1996484678,142016266,1089238783,1354771280,-401698736,1586169645,41418506,16777114,-2090902016,-443874579,-900899553,1478361094,-1957345904,-661774612,175541078,621168267,1149829123,105313800,-1207602112,48955393,19251243,-754405120,105679840,201254272,105155009,410871,-1207601918,48955393,19251243,-754011904,105679840,197125504,105155009,1342193848,1342178488,327066,944015616,18891975,-942109952,-956301305,66119,1342194360,1342179512,16777114,910461184,3701891,-1073018508,28837236]},{"sector":4,"data":[721611520,-310157632,535137026,113921373,-326413056,1461906563,108432214,14698183,-498678016,1149960192,-565802736,244338774,-1996342296,1283518534,1283461126,1996425223,-26108,-1073020928,1962872436,74907394,16777114,71731456,1023690379,326369288,1962936637,18344195,1962937661,21686531,1442926825,535301776,340036375,1964000313,306481925,1149961195,-28931824,-2053491457,-1996488702,280558150,-6664192,184549631,-2091746112,2130771582,9758979,1224623755,-1948367223,1183448646,105183202,208936960,-562626730,401050,-565802752,64898699,1346959942,-1995538200,-1072963514,1325359732,-565802018,1224361475,241952848,1349828619,-337752321,-28931253,-498693824,-1979824501,1157094982,1948254214,1996445201,-25886,1178271744,-16550686,1183572550,-96074786,238282832,199247497,-15371072,1183572550,-96074786,518541376,1958742798,-498663677,-1684392705,1442840578,-2197761,-1070865802,24746576,-11141120,244375158,-1996419096,1187508294,1442840810,-1018113,1996482678,-361299994,134512259,28864629,-949032192,64582,-956531061,-14618045,2122579014,-260306692,-1948367221,-472780706,725122187,-330921727,603981829,-330945544,-1914026359,1183445574,-396981018,1283501547,1187447302,-2096493308,1931478142,1354771210,16777114,-148837632,-16776122,28837237,-1207702784,1183383554,71732714,45664491,244338688,1577838568,1575324511,503317698,1430622296]},{"sector":5,"data":[-1910575989,149717976,1988843095,1996445196,-401698806,1183383640,373591036,-1946663287,1178148932,1444838908,-386107649,-930412113,-1962260853,-472777634,725122187,509933313,1174520067,239373304,66875127,1183389764,106874106,-1946663285,-1993934250,1468605959,-2090902014,-443874579,-900899553,1478361096,-1957345904,-661774612,1460202627,141986646,-2094105461,1979647614,-339727612,105286484,1930183737,541362949,-16037909,-1957749900,1144594500,-1961853138,-947177380,-670834479,956712587,721581575,944016383,-506343541,1077985539,-1929754999,32242782,-94452665,49956483,637945483,-260700359,-1959887735,-2090901817,-443874579,-900899553,-1957363708,283935724,1988843095,1996445198,24635404,-787718517,945554403,-939323509,-1947185527,-472839074,-1959240701,176044351,1183516022,-1962743030,172394951,956843659,58191942,-1980742005,1178142790,1446146826,-16091393,1996424822,-401698812,1589968561,1200301572,239338242,105351462,721962635,1693911622,117646878,71797030,-352321096,1589652226,1575324511,503319746,1430622296,-1910575989,183272408,140413782,-1711114241,65535,58048523,-2097097495,1979647614,140413705,-1995421813,1996424774,108461832,-1108865392,-163149314,-1962385781,1191388231,-96040670,-1959239797,-422447498,721831563,-62486272,972703371,343733830,-1207404801,-1202716395,-1957690362,1177286214,451625210,-1962385781,1194980934,1393917476,1342248376,1342441144]},{"sector":6,"data":[737560203,-1706023865,2423,-150446453,33556039,1183536500,709307388,-1993849045,-1072957370,-1202513794,-1202716396,-1957690362,-1181145017,-101253117,1358448131,1183525099,140413948,-1993717973,-1072957370,-1202512515,-1202716396,-1957690362,-1181145017,-101253117,737693323,-1449504312,1577058304,-1962742397,1297948645,1426064586,-326898549,-1957275900,2123040374,65523972,1166751868,-1996150014,889192006,368538,38077184,1183402056,-1293397764,1958742794,-26311917,-62485758,-1561833400,1958742794,-28377341,1402615039,-1962934266,994582596,58655814,-2080485633,2097217150,-339727612,-28931325,-443850914,311901,-2081649835,1448545004,-16222581,1183646324,-1706027274,65535,-1980348789,2123103814,511454202,2098887737,440699653,-947191061,-637303,1183646324,-1202710794,-1706033151,2662,-1979824501,1183577670,-28931592,737967755,2084114044,-1962574564,48962628,1183434635,41222136,385238669,112720,183867984,1183514624,-129594882,-2147072778,1183657844,-1957685514,731455044,771281346,-654901247,239373136,734147481,178626,-1036781357,19776043,1356396288,16777114,-96040192,1224099371,508332953,1149893111,65664808,-1992231354,1183521348,-129618948,239897497,1149893111,1975520034,574932741,1149960193,577566478,-1980217853,1157045316,1950351366,41221904,1347469355,1342177720,16777114,-1070901760,602427472,-1956684286,113401317,-1873273344,-326412987]},{"sector":7,"data":[-2082959842,1448544492,-2096597365,1962870398,-11119085,244319862,1358713832,-1979819800,1340865606,276102998,1105727120,-96040452,309657430,904400528,-129594884,1979336249,1996445199,-30414598,51528747,-806678460,-126419114,-1946279704,1586171980,-1948003846,153827452,-772252021,50922467,306981832,-1946399095,1600060486,-1962742397,1297948645,503317706,1430622296,-1910575989,317490136,1988843095,41221904,-1207011585,-1706033151,986,-1030519,-1706029450,3177,-244087,161847860,1183383552,-1954812942,1178148932,1446738956,-1913356659,118888052,-1515870811,541363038,17722615,2122577478,92078324,16008903,74776320,-16616193,28839542,1183666176,-1706027276,65535,1586185195,-1948004084,25901180,-1995946493,1150021190,205928736,1996427901,-227082482,209125206,-1863420161,174647310,425603,1187448180,-16777208,1183517766,205928714,2062091133,-1707802625,2511,-401698730,1996425245,-59310322,16777114,-2090902016,-443874579,-900899553,-1957363700,49054700,74877782,1309046275,-1207142657,-1706033151,65535,1947024512,171737093,-11663755,-253033394,-1005816065,-14284706,2013210167,105286402,1996443678,-26108,-1956773888,180510181,-1873273344,-326412987,-2082959842,1448545004,-955484533,64582,309657430,-1712845168,-129594886,-1961737077,-472778658,725122187,-163149567,2116437051,642025731,16402119,1996445184,142016266,721843967]},{"sector":8,"data":[-6664000,1577058559,49120095,1562371467,576077,-2081649835,1448546540,-1962379637,1183391812,105286648,-62486208,-2081405303,1962944636,-373282043,2122514818,91553798,2507975,106859264,2089542609,-1996387528,889192006,1067674,-28966144,-940423543,63046,66485891,-1092025476,-96024832,2122514432,292880886,49956551,-228685056,218201984,1191117685,-92371974,-150113024,1073743428,2122539636,1551106294,-1962522881,1178204230,1444249094,-402229505,-1073018700,889129589,931226,9890048,33179275,1174532678,108956670,2080630737,956664632,1081409094,1074153099,-1946401143,92929606,-788103541,947651559,1160447371,-196703746,2116437051,642025731,-28930730,-230257328,106859344,2089542609,-399376584,1183384499,-11474442,294531,1183565428,105265648,889175678,933530,-9245952,207133236,1191116800,105286406,-1960819575,1144649798,-1958904288,1183385158,-397388036,-1073018860,1183526517,205818366,-1207667457,-11534063,-189267340,-6663937,1342177535,721568907,97419474,-6664110,-1207959297,1022099455,-788103541,947651559,-1946269953,-28952315,1183517556,-62486266,-1979824501,108956421,2080630737,721783608,1183448645,642006004,1149830014,107249702,-62485507,-443850914,442973,1167087646,518818645,-326903666,-1957275880,1156976758,57934854,-167724311,1963460164,105182986,58003456,-16733463,1183646324,-1706027274,2568,385238669]},{"sector":9,"data":[-163148464,1150111766,-1706025450,3933,52708491,1183392324,541363188,2129937977,-196703997,-349930357,-11053461,1996425334,-330920698,-1243066346,1958743032,-330920671,1183666198,-1924131092,1343682118,1020570,242679552,384583309,262117968,1465253888,-15960321,1183648374,-397404436,-1072957312,1183654260,-1924131092,1343679558,385238669,-26032,1996423168,-330920690,-6664170,1191182591,2146729529,-2090901872,-443874579,-900899553,1478361100,-1957345904,-661774612,141986646,1015024619,-1207601907,233504769,105286470,184962815,736853952,-310157632,535137026,80366941,-1873273344,-326412987,-2082959842,1448545516,-1962248565,1178146884,721779976,14215616,721962635,-1952901052,-101249460,-1946532215,995041404,-1962181433,1183386692,-92370444,-11135253,1458109046,-94467079,2089542609,50957112,-196179512,410871,-12684224,197564980,1174601728,-163149324,250105920,1975520004,-161576159,553615232,666376309,-1768271872,184549393,-1962181440,1178143812,-16548364,889189454,902554,-94467328,2089542609,-1996387528,1150023750,105265430,1183516029,1447160824,-386238721,-930414521,721831563,373566401,508332953,1174665719,-62486024,410871,1443525664,97884752,1183383552,-196703236,2147239481,-129594613,2096907833,-62485571,-310157474,535137026,113921373,-326413056,1460071555,108432214,-1995946869,-1072955834,-1070922635,2123052011,65523972,1166751868]},{"sector":10,"data":[-1996150014,1828191302,441223966,1277937707,-95516394,33455747,45681781,-96040192,-1980106855,1183578694,-1956684038,79846885,-1873273344,-326412987,-2082959842,-1957295380,1157040246,1946222598,-129594004,-6664170,1442840831,1342248376,425603,45614452,-1207702784,726663171,412766400,1442840585,-362753,-6621066,-1996488449,1183446598,1095932,95132240,-1073020928,2122520445,141819910,-1995291509,116127302,-1995422581,1149893702,1996445204,-159973380,1342177720,418458,-310157824,535137026,80366941,-326413056,1460464771,175541078,-1962516853,140413759,1183385483,71707636,-1946663287,1183446086,71732222,1978943033,112645,-1070923029,-939768183,64070,957105291,108852294,-385875016,1157038280,1967128582,222134395,1187448949,-385875462,92930212,-2137370472,184549394,-16485184,-12059066,-381157818,2122514572,494141692,958940299,578615366,957105291,92143174,-352320840,243715,-335919479,675580744,2130200121,178181,1031826667,-1976142816,-1705994235,1362,175423499,-129594553,-506113,-1958216122,1191180358,-28901384,957105291,226360902,29354071,-1703624693,33179335,675580672,2146977337,-92372040,-351046400,205818636,2113816121,1191134985,540901630,1586229108,-28931320,1586169737,-1958770426,1600059974,-1034033781,1478361096,-1957345904,-661774612,1460464771,276204374,638213828,-1986525302,1150023750,-96040672,-26026]},{"sector":11,"data":[1183383552,272927734,-134986103,1073743428,2122524532,394199304,553156227,2122322292,192155128,722617483,1178275908,1443526152,-401705217,1183385603,1996445198,209125134,-16091393,1996425334,-401698810,1183384654,2092960764,541363009,2130331193,608471817,-1994243069,-11076538,1996486262,-59310322,737953419,20778566,721714688,-1962021952,1586230342,-1948004082,19609724,112720,-401698736,1962932205,-159973630,16777114,-4696576,244338943,1593101544,49120095,1562371467,838221,1167087646,518818645,-326903666,-1957275898,1149961846,272902930,201082505,-9538368,348494388,-125108224,51397771,1996443847,-401698564,-1072956488,1283458164,1149960710,516358930,272927568,1344194307,722224267,-1706028476,65535,704398987,889130052,1366170,742689536,1024214059,343801888,84690059,1149829136,1345650476,-1705983957,5772,-1995422581,1149833796,-62485740,1600051447,-1962742397,1297948645,1426064074,1586228363,222265348,28837237,721611520,1575324608,503317186,1430622296,-1910575989,216826840,1988843095,105182726,-385649400,1149960367,272906516,1149961589,-1962677486,1183387716,-1873783044,-221583346,-939899255,63558,16547459,889144180,1418906,-62520576,-397391800,1183448981,-1707802632,5628,16285315,1157047157,1950351366,-94467300,2089542609,-62485704,225771833,958416011,92142150,33048263,1996445184,-196702724,244338710]},{"sector":12,"data":[-135137048,33556036,1149965429,-196724454,1149963390,-196703978,17712267,1150023238,574882596,2147108411,-163133691,1996455680,-159973388,16777114,-2090902016,-443874579,-900899553,1478361090,-1957345904,-661774612,1461775491,175541078,-1995291509,1183709254,-465139218,-1947838836,-1991761852,1183572038,-532268794,1183516285,105286112,1137114923,-2092490514,-159643649,-1696172289,574,-1685879,371497524,1183383552,105286626,1141104849,-364476104,-1962900759,1854138974,126550762,-398030520,-1947574645,-159479489,2095611449,-497120408,-1986526838,155056710,-1958054656,-163173433,603981829,-163183624,-1991719125,29813830,-1707802848,5710,-1996405363,-11136444,1996483702,-461963290,-1705983957,3347,-1947435517,1174531142,-1707802648,3429,-337492343,-92864755,1192858,1958742784,-347650303,105286547,990269183,58591302,-36631,276929076,1183514624,272927224,1444037769,721975039,-1075294016,-2090901770,-443874579,-900899553,-1957363706,49054700,108432214,-1959234305,-523172794,-1202700224,-1706033086,698,201213577,-1996262208,1183529028,-443851010,311901,1167087646,518818645,-326903666,-1957275876,2123042422,138775306,201082505,-1962052416,-472840098,-1959240445,105285895,142016343,-1980583704,1586229830,65261832,260782173,1317652483,105286630,91736123,1183433099,1996445446,-364475130,244338710,-1947203352,1183390277,-330920978,-1995553533]},{"sector":13,"data":[1166798918,-297402082,-1981135221,2122572870,91488508,15353543,74841987,1443001855,1342177720,384452237,202152528,1183514624,-364475932,15892099,-1923737730,1343679046,50742923,-1957688250,1177282118,434655238,105248757,108335104,134628854,1166750068,-431605488,1183525238,306526470,-11067022,1979648118,309722896,384452237,-261167024,192200715,-364475050,1788497942,1577058319,49120095,1562371467,707149,1167087646,518818645,-326903666,1988843024,272927504,-2081012087,1963067006,306481933,1964000313,112645,-1070923029,1459373705,-1877838593,-275060722,-129595072,425603,1149966196,1144733712,-1005686254,-2144990626,91491647,-352321096,-1983894782,1996484678,438278668,1183383552,1996445196,108954376,-1207601918,48955393,-397361109,1183383777,1975520244,13166851,-401698730,1183447950,1996445426,209125128,-1878362369,-193337330,-151894527,1963066948,1183536654,-11517938,244380278,-150561304,1073743428,2122517621,108265478,33965302,-11134092,1996426870,-190519056,-1946532215,1178204230,-1962508550,1183447622,108954616,1443722496,-1207011585,-1873772545,-55384050,410871,-1961134847,1144595012,958496544,242556996,541363030,-957853624,675560432,2088963711,812908592,959464587,679349316,-193527978,-231681,-353892234,-1070901760,1005080656,-129579020,-1070858241,115186256,-1873412096,61663246,1593329291,-1962742397,1297948645,1426066634,-326898549]},{"sector":14,"data":[1988843016,306481928,-1995422677,1962933830,422353462,1183383552,-1707802630,6524,-1946663287,1183054430,126550778,-1946401143,1183054430,1149960954,-16283376,-1231407500,-2097151975,1946158206,272927496,1979467321,913637209,100550283,726663176,1218072768,-1996488684,-1073007036,-1706016652,6637,-1996487675,-661915066,49956483,-1979824501,-94467321,49956483,-1996077429,272927495,519587331,-96040112,1996443678,456366846,1962868736,431856182,889126912,1722522,910461696,1575324510,1426065090,-326898549,1988843018,108954378,-1961987072,1143538758,244340240,-335945240,142016355,1767834,-129595136,49825411,49825411,-2080874869,-1962739642,-28931833,-2080874869,-1962739642,272902407,-1980217717,1586297414,-1667621124,-1996488683,-1873347514,-107157490,-25755818,-231681,244382326,-1947039000,1177227844,272927230,-1710721281,6970,1575324510,503318722,1430622296,-1910575989,116163544,1988843095,340036362,1964000313,306481925,1149961195,-62486256,244338774,-1980956696,1589967430,373590790,2097625382,-92372203,1446933504,-772120949,947686371,1346896267,1149970155,-62506740,-11131011,-689374602,510457838,637951684,360515387,-92370090,1552672721,41025336,108461830,988286608,-2090901780,-443874579,-900899553,-1957363706,116163564,1988843095,-62470388,1149960192,172374304,889145469,1305242,173968128,2089542609,-1995863240,-939262386,1459244681]},{"sector":15,"data":[-401967361,1183444593,71711228,1183516275,-62486268,519718539,142016336,-16353537,479919222,-16777196,338270772,1183514624,-1956684036,180510181,-326413056,1988843095,75399942,-1961069568,-405732226,-1959232509,1157834820,-1962595330,220926028,58507579,-1962651905,1599996998,-1034033781,-1957363708,283935724,1988843095,-163133692,1962868736,469473846,1183383552,-2082960398,1979646591,15853827,49432195,1183385483,-228684804,49432195,1183385483,-228684808,49432195,1183385483,-228684812,49432195,1183385483,-129594374,2130462265,-62486269,1342194360,-1695254785,1245,201213577,-385649216,1183514787,-11526414,1251671670,-1996488676,1344204870,-1695254785,7661,-1707707137,7262,-59310250,66602635,726727238,2056933568,-2147483620,1442973260,276102998,1239944848,1183535339,-11526416,-1070861194,-401698736,1962931876,482187830,1183383552,-1948742670,38112248,1996425097,479828734,1996423168,-25858,1183514624,340036092,1962889302,112658,297900624,-1202323456,-1873739777,-335550450,268848256,134696064,32917191,913637120,1898650,-163149056,-443850914,180829,1167087646,518818645,-326903666,1988843012,913637126,1906330,-62486272,880066571,1183045771,1149960956,-1962440432,1183054942,130482940,1586233343,-62487556,509698,-60912896,50087555,1991,-1707707137,7504,49120094,1562371467,182861,-2081649835,1448543980]},{"sector":16,"data":[-16490869,500013623,-125108224,-166987893,1586180724,206015236,1183434243,-2129204226,1947012412,92843014,-2096436409,1586168774,208634628,-25806589,1586226551,-1707606268,7853,-443850914,180829,-2081649835,1448548076,294531,1996428661,-6756346,721843967,-397389632,-1070862422,-1962852375,1207371358,1950351366,243953,-1994362889,939521094,51136395,1200223302,-1070903252,426744400,-1073020928,1854132340,1586168820,945785606,-1996339317,1586232390,206015238,-1979955669,-1072959418,939503742,2020250,-364476160,1988884619,-1947204612,-1957683514,-972819386,519980681,-260636848,2001562,106859264,722225035,1174666310,-163149314,66879115,1187506814,-385875462,1602945158,65065272,721914840,1183448134,66096108,2105671286,1946815998,958065453,444003958,1352139914,1454490,1958742784,1191134724,1191134956,540836076,96919924,96880397,96880397,1586185994,945785606,-772127093,-1948777504,1177223751,-62510100,-1946663287,1200293470,1178290208,-16550406,-963905458,-947171298,1996443678,430873336,2114125824,-96010248,-1962516853,1194981958,-385647072,-947126420,-1981135317,939461703,2028442,108461824,1347469355,-1192334872,1599995905,-1034033781,-1957363708,82609132,-16490869,580531831,-1996488679,-661914554,-16613501,28837236,721611520,-28931648,-16490869,1335506551,-1962934247,-443810234,180829,1167120524,518818645,1465309326,-1962246517]},{"sector":17,"data":[1972045398,138840888,-268177405,-1960817269,1090985726,108447787,-1413348435,1583348450,-1962742397,1297948645,3081930,275447811,779616257,418512899,1669267457,66387971,452919297,470286339,1384382465,67961091,5046280,74252291,-2054815743,42926339,5898247,38993923,1686765569,9764867,445841409,144441347,236126209,7471107,429522945,54067203,1738211329,252182531,1629552641,242679811,1646329857,506789891,3342591,396034051,1721958401,196083715,464257025,389677059,456392705,467927299,327687,497156355,393223,476446979,458759,462553347,524295,356843523,-2068316159,470810883,589831,210764035,131080,291438595,-2059730943,243728387,624885761,178323459,1698693121,40960003,239271937,171180035,1464008705,403570947,1376263,63438851,-2058289151,213516547,2162696,281411587,32506111,196870403,2949128,253493251,1701511169,330104835,33292543,370409475,33358079,472055811,33423615,319684611,33489151,90243075,33554687,25493507,33620223,21692419,33685759,19464195,33751295,67108867,33816831,293273603,33882367,294060035,33947903,0,0,0,1167087646,518818645,-326903666,1988843012,105286408,1946353725,50412829,37555316,1025209347,510919427,-397015061,1183383596,-62485508,-1873405717,12969998,-1873350421,20703246,-1873352469,14739470,-2090934037]}],[{"sector":1,"data":[-443874579,-900899553,-1957363708,183272428,1988843095,306481924,-1995422677,1962932294,28350978,-1073020928,-1070922635,-6652949,-1207959297,-1957691326,-1723795386,-6664110,-1996488449,-1072957882,-224786571,-352321536,-159973415,122266,-62486272,-108919,-26060,1141047296,-96040688,1996443678,-59310082,-1694992641,65535,-990355829,-970523522,889126913,16777114,-159973632,131482,112640,-159973552,16777114,30251520,28835840,-1956684288,46292453,-1873273344,-326412987,-2082959842,-1957296916,-397015434,-1072955580,-1873410444,845838,49120094,1562371467,182861,1167087646,518818645,-326903666,1988843014,175932166,1443853312,165274,-62486272,25356374,1448483307,-1710197505,421,-62485168,-1070903274,-1164292016,-2147483646,-2146433460,1577584460,-1962742397,1297948645,503317194,1430622296,-1910575989,283935704,108432214,-1995422581,2089022534,74711050,166445099,-193527978,174234,-163149568,-1711115009,65535,74825739,1324073003,1342177720,16777114,-230258432,125157387,132762,1457908480,16777114,-227082496,16777114,-96040704,1459377801,1347571794,16777114,1996443648,-401698572,1183383580,-227082256,16777114,-26112,-2090991616,-443874579,-900899553,1478361090,-1957345904,-661774612,1443556483,-2096204149,1946159740,138840949,-1946663287,1451952710,-96040692,-939764087,2118,972572299,208865350,-368956]},{"sector":2,"data":[-2144929210,460655935,51135627,1143670854,272892690,1982874683,1354771215,16777114,-11801856,-857012154,-1710459137,65535,1443645065,16777114,1996445184,209125128,-1207273729,-1706033151,65535,3336278,1448484075,-1710197505,65535,209125200,-16091393,-1070921610,-26032,1283457024,1283461126,-2090989561,-443874579,-900899553,-1957363702,49054700,74877782,-26026,1183383552,726685438,-1706012480,65535,-16616193,-6619530,1577058559,-1034033781,50337282,-16685312,50464768,-16689152,50465024,-16748032,50366720,-16694016,50465280,-16737536,50366976,-16744704,50367232,-16716544,50367744,-16662272,50368000,16936192,56852224,16828416,55739392,117566721,50354688,117486081,50333696,117496065,50333952,117477121,50335488,117482753,50336256,117498113,50336512,117603329,50337024,-16657152,50458880,-16582912,50461696,-16607232,50461952,-16589312,50462464,-16585728,132864,0,0,0,1167087646,518818645,-326903666,1988843084,-196688116,1187446784,-956301070,46150,336232065,-1207602175,48955393,1183432747,-733558804,1187446784,-956301090,46662,13780679,175932160,-1962511360,1149832260,138840870,1946157629,-385646986,-1073020709,20798836,-385649664,1187447011,-16776780,1183646324,-1706027292,65535,384059021,-465138352,1150111766,-1706025450,65535]},{"sector":3,"data":[67665539,-420936843,176062720,57934101,-1962888983,1174611012,541887412,-1053079223,-1108802691,541362944,1210336299,-956256279,-19386,1150003691,1183402018,-1197413452,1143668737,1458826018,-16353537,971566198,-230258429,353009281,-1962576639,65736268,-1960948597,-654839226,-335939687,105286605,196363913,-385649216,2122448741,1963005194,2668549,666371051,-1236891392,11828867,1256784764,-1234271233,-12326654,-327745706,-1996273176,-940985274,212226,71141492,1033139200,-1250687994,1946422845,-1715459105,-2130527255,18090622,1149966453,-1270480086,1227246731,175948091,723928203,-1991759292,-11094970,1996469366,55568394,-899447,2122515060,91488492,-352321096,1354771202,-327745706,1342367208,1342177720,16777114,-327253248,-1962183424,1183445574,-230242316,-6684672,184549631,-150506048,536872516,28837236,721611520,-532248128,141934603,-1711115009,595,32786059,1183520324,407110130,67519734,334037876,74776322,1342247352,-1207798529,-1705967628,65535,-327253168,-1207602176,65734146,721813944,735087570,38046656,-6664110,-2097151745,1946214526,105182773,-1962118016,731455044,1224266178,-1816951,1996423796,-227082252,384059021,-465138352,-6664170,-16776961,-6684044,-385875713,2122514686,158662868,-26026,1183383552,-730398764,65291915,-1957628858,1174660678,1183535346,-465163288,-364475568,1357268523,-2853121,1996481654]},{"sector":4,"data":[2144486,1375784122,-26032,2088960000,276037642,-730398890,1347469355,16777114,10807552,15892099,1149964669,574882596,737166985,1183429702,-1962087442,1183392836,-1270469650,-2081405303,1946219646,608471888,-1994243069,1996484678,-25900,1183383552,-193035310,-1960936192,1141058116,-1270469848,-2210167,1183569014,-196738072,-428409008,-337086721,-730398960,-1804545,1183573622,-196738076,-361300144,16777114,1996445184,-294191148,-1018113,-1070866826,-26032,2122514432,276037842,-2853121,-6630794,-956301057,53830,1342177720,16777114,2109737728,-1069118177,-1070903274,33601616,34191440,1354771280,16777114,1975520000,-48895741,-390695169,-1073020522,1149986676,272906516,1149961589,-1962677486,1183387716,175932412,1443787776,-1169781424,-6664170,-352321281,1996445198,-1169781252,-6664170,-1962934017,1177154630,-230257734,1455179305,1074152694,280495476,-1207702780,-11534080,1996471414,-25926,1962868736,-26110,-1528233984,41222140,-1697351937,65535,733234827,30048466,-1980348791,-2090928042,-443874579,-900899553,-1957363704,82609132,141986646,294531,1149969780,-62486236,1210074251,108461904,1342203064,287386,608471296,737953419,1828136004,-1960580338,1183394372,642026492,1996443720,6600710,79731280,1149829120,-62485718,-148224981,1183391340,-443851010,442973,-2081649835,-1957296404,2122516086,376700932,52460675]},{"sector":5,"data":[-1070922627,1149972203,-62486236,1210074251,2088964075,-360971738,-1993718645,1150024774,1183402022,-59310086,1342203064,-1694861569,65535,1575324510,1426064578,-1957237621,2122385526,1946227716,105286433,-2094775295,2097161340,608471819,-955890135,9284,-150583669,242022360,1183522795,709099782,2784387,1149963133,105261354,2770119,105286400,1828182263,-443851234,442973,-2081649835,1996428012,56465924,-1073020928,-1070922628,1183663339,726669038,12079296,28856321,-1070903295,91462224,-1073020928,2122392948,1946223088,71732185,1978811961,-297366063,-1070903274,16824400,28856400,2040156160,-1207959549,-443875327,386056797,704643840,2013266181,1040188206,184614659,1258291970,150995202,1023411015,184549636,-67108014,553648385,2013266786,553648384,-1660943519,1040252673,1241514752,-1207959291,-738196702,-1090518783,452985652,1056964866,687932197,369100803,-301989120,1358954755,-369032315,503318530,-1291844864,-671088383,-1711209721,570427394,1325466368,654313475,-1090518272,-100598013,-1358953727,-83820797,-1946156287,1795162368,-67107995,-67043581,1644167937,-16711934,-436206847,50396931,-1392508158,117505794,2,0,-2081649835,1448542956,1443133067,16777114,1958742784,-6662633,1442840831,74394,1459129088,976983,49006475,1600045099,-1034033781,-1957363710,-1957275668,2123040374,-1202235900,-1706033149,65535,1460032163]},{"sector":6,"data":[1342177720,16777114,-1956684288,79846885,-326413056,108432214,22911574,-11141120,1050281078,1577058305,-1034033781,1478361092,-1957345904,-661774612,1462692995,242649942,-1962246517,4000838,-385649407,58065108,1023551465,1953759239,1962936381,11790595,1962936893,31385859,1962937405,30075139,1946160957,8666379,-1276574859,35121408,1183434635,1975520244,1183667726,-1706027310,65535,1458849417,-386631937,-11075768,1996485750,39774420,192282379,-767128234,-6664170,721420543,250190272,1996445186,142016268,-402229505,-336919725,138431616,-26026,1183383552,-397388044,1996488456,28858100,-337096704,1996445189,-25868,1156972544,-1082847168,70286464,1156975989,125109056,1354771286,1443277288,181146,1453648640,-2147232280,-1695072156,65535,-8153621,1452307744,-397361109,-2014641284,120618112,1592329076,-18431,-2080408855,276111615,71320822,1793655669,-840411393,-10229501,60090454,-1979630359,-466993084,1726599723,1078233601,69592106,-230258432,108330763,71322752,1686111467,-396952768,1183448622,1975520244,-13899517,137395328,190190453,-1207601921,65732610,1342178232,-351923736,-193528054,-227082410,1443093480,-386631937,-18219429,1078233854,52814890,-1969362176,-466997180,1929380413,-18355965,1979712317,277795,87887988,-385649920,104726229,-384141824,-15991091,1283458676,82510130,-30251904,225771275,-352321089]},{"sector":7,"data":[50299656,46072694,1078233600,52814890,1975991040,-23074557,608191626,181373948,1078233281,-41359274,200558217,-385649216,1448148613,-385630744,-11075723,1996425334,-26106,-397017088,1183448422,1975520244,-27006717,28856406,-1444392960,1078261248,-385649400,1996488521,28858100,1676169216,-6662652,-385875713,37617461,1026193154,57803264,1040070377,57999617,1040101609,57999621,1459529961,1460434687,-16222465,-6683018,-352321281,67124514,149488501,67190271,183042933,67255807,-1696005259,67321342,-1662450827,1590488062,49120095,1562371467,707149,1475119957,108432214,-1979416949,-466993084,989856805,1443853511,1342440376,1354771287,-26032,1599995904,-1034033781,-1957363708,183272428,1988843095,108956424,294531,2088768628,242485040,1448132651,1379336023,-26106,-11075584,-1710861770,65535,-1963571575,-466997180,1979713597,12904707,781434883,72001535,-1070901673,58517584,-1070901673,36366416,-129594026,-6664170,1459618047,385369741,809798224,726721578,-6664000,-385875713,1448542346,-397361109,1448543050,-352164376,28857979,468209664,1078261252,1443394564,1342177976,-167506456,1946694468,79189599,-1552384,1448471299,-129594025,79187990,367546368,1183667972,726669048,-6664000,1442840831,-129594025,62410774,-102215680,1183667971,-11528456,-1711028682,65535,-1070901673,48031824,60822251,64095136]},{"sector":8,"data":[64095186,64095186,65078279,-159973545,230554,-1956684288,113401317,-326413056,1444080771,-2146797941,1963405436,2145932830,-163149317,1183666262,-1202710792,-397410301,-11140200,-924256650,1443621883,385369741,102537808,1183645696,-11528456,1996424822,-26108,-1073020928,1183528308,33570056,20779124,1025012738,661979650,10414166,28844523,-6664192,184549631,-2146140736,1946628220,28857870,233328640,1443162880,1577077224,-1034033781,-1957363704,1988843244,1078261254,724464900,395989184,-2147483648,1443905612,16777114,1080328192,79189743,65556480,75400190,-2146798592,1444954188,16777114,-443851264,311901,1458342741,-167479669,1946435652,-1070901738,-36116400,541082870,2056915316,-2147483643,736051300,-828747584,1577058309,-1034033781,-1957363710,49054700,1988843095,-26108,727056384,-1545056064,809798397,54387754,1023767552,796196870,708854922,-2114417692,1191183335,103840896,45614453,-1207702784,-952434687,-13958531,67221590,-1070901424,1251627088,1442840579,-397361109,-1070923206,6986320,1599995904,-1034033781,-1957363710,149717996,1988843095,108956424,294531,1187448180,-1979710460,-466993083,989856805,1014236230,707806602,1925188580,81198,121440118,-349604864,1183668002,-1706027272,951,-129594026,1166692374,1357130288,1342177720,248730,1443228416,583767,-443850914,442973,-2081649835,1448547564,1443133067]},{"sector":9,"data":[-1928956161,1343682118,1342177720,-956183576,65094,707806346,277988,87886964,1024225792,309723142,1187448299,-167771650,1946435652,178199,1187452139,-2147482882,1946304636,-28915734,-471138304,-125059029,54543606,28837236,721611520,-137950272,-1996203474,1183575622,1546582014,-330921724,385238669,-159973552,-1946650881,100922950,-1957690278,100923462,-1706032036,65535,1446540543,-16353537,-1928965578,1343682118,16777114,108461824,-11485141,-16493514,1996486262,1513553912,1547108100,-294191356,-1192462593,-1706033151,65535,-443850914,311901,-2081649835,1448548076,-1979287925,-14012324,33720202,-62486120,142016342,384845453,-59310256,-1962876952,1344157252,16777114,-297367296,-1962379521,1344157252,-1695648001,65535,-1980217719,2123102806,-58817552,-1962118142,1177285702,-775476232,-1946680344,1177285190,-163183622,-772651477,-28931608,294531,727063924,1996443840,-6663944,1459618047,66733707,1346960966,16777114,-163190016,1946694468,142016287,1347469355,910461776,1996443678,1996445678,1354771454,-26032,552271872,-1207404801,-1706033150,85,1460172543,-1946257665,1344157252,-1695648001,65535,-443850914,442973,1458342741,-16353653,297285748,1962889217,72780596,-963919829,-1080405934,1577058309,-1034033781,-1957363708,116163564,1988843095,176065292,142016342,-1710852353,1186,184829579,-385649216,20775100]},{"sector":10,"data":[1024816128,678690818,1946157885,277809,-2081881227,10676480,637951684,637945739,721569579,-788243450,1191257848,9103618,-1593418044,67437658,117515776,1149992171,-1706025418,1873,1476019849,506872971,-92864688,587418,-62486272,1476286089,-1173613640,1347553517,1342177720,16777114,-2147079424,106873860,637993254,1174603659,263676,71797030,654198411,84035331,-1993998332,585827911,202618967,1392508858,112720,124033616,1183383552,-27883012,-1962516796,-370617918,1600061295,-1034033781,50340618,17094400,53377024,16784640,53999872,17005056,52100864,17182976,58656256,17130240,59082240,16945664,57411840,118002689,33577472,17347584,51122944,17110272,53383424,16843520,52073216,16780544,51254016,134790401,50354944,17277696,58955008,16806656,54008320,16834560,52009472,16970496,57121536,17317888,56697088,16795648,52145152,17232128,52114432,17281280,59029504,134734849,50332160,17226752,56900864,17343744,55754240,17309440,52772608,17242112,55496192,17107712,59068672,17117440,53631488,17054720,57039360,17084928,56942080,17290752,55403008,134504705,50343168,17047296,54912256,17299456,55764224,16870400,59011584,17127168,3306240,0,1167087646,518818645,-326903666,-1957275862,1149898358,-1947981264,205949944,1962937405]},{"sector":11,"data":[15198467,568918902,81153,37571188,-385649408,171770018,-385649408,501809390,172395265,200689289,1443788224,383141517,-26032,1183383552,1996445430,-663289866,-2097072408,1962936958,1183667723,-1706027306,65535,2112602155,-1072971733,-8128907,-990808829,-1960442274,-1960438201,1183389783,-94991880,653811396,1979662208,1200301580,-129595135,16402119,980745984,-362753,-6621066,-1996488449,-1000979388,-14285218,-14282633,922685047,922682474,-1070922644,-26032,-1662320640,-1072971733,-8153483,-7244541,-6667148,-352321281,67076999,28863602,-372102400,-8191854,-385650173,1525415794,-1711276104,-2097118743,57803775,1459577321,-16222465,-6683018,1442840831,16777114,1975520000,-11998973,-26026,1183383552,-1202694410,-397410303,-11141029,-6621578,-385875713,255721258,-385649408,511180527,1912606013,933125,-11101066,1996426358,142016266,-1710852353,65535,-2126701845,-385649408,-2109866125,-385649408,-2076311688,-385649408,-756285574,-310157474,535137026,181030237,-326413056,1460989059,141986646,707806346,-62486044,-230257322,-6664170,1442840831,-1207535873,-1706033146,65535,-2081536375,1946158206,-62485712,-767831509,121439607,-1961987584,-768869306,91738683,1979713853,1354771220,108461904,-1913751809,1343681094,16777114,108461824,-1695648001,548,-113015,28837494,-6664192,-2097151745,1946173564,108461835]},{"sector":12,"data":[-1707051777,803,1039943307,58064905,50391529,-13724736,-2096953177,1962948220,14215427,1358954424,16777114,860157440,-13798392,-1070922122,44611664,1375906746,-230257328,727076886,-1957670720,1143679556,1149980710,675556140,46504528,250281984,-1928956161,1343681094,-401698730,-4718431,-6663937,-385875713,2088960130,2087977028,-16353537,-1207710666,-4521985,-1957670145,1344160836,1358954424,1347469355,74069759,74200831,16777114,-1957565696,-352073666,-1103197430,-1962611965,-2147236290,1929851004,108461840,384976525,-6662320,-352321281,-1405187797,108461827,384976525,374864,-26032,350945280,37421627,43647547,47252171,46858967,47645393,-16353537,-6619530,1577058559,1575324511,503318210,1430622296,-1910575989,108954584,-15501825,-1070920586,1996443728,-26104,-1070923776,1996433131,106859276,506873739,-18352,175570768,-1979156737,-466997177,1342263309,16777114,112640,-1962742397,1297948645,1575114,19791875,939065345,18546691,1812529153,18939907,236126209,7340035,445841409,21168131,941228033,5373955,429522945,23855107,1738211329,11730947,11403519,28508163,1629552641,29360131,464257025,33095683,456392705,34799875,131080,39452677,31785215,57737219,5570815,38338819,1507335,43188483,1572871,55181315,902365185,13762563,541720577,39649282,31785215,48955395]},{"sector":13,"data":[1717174273,41549827,1298268161,33816835,2949128,50462723,1172635649,15139075,4128775,0,0,0,16777236,33554689,33686017,18350595,983298,458754,18153480,65671,655371,67240961,68027395,67568646,67699720,67830794,67961868,328709,14221312,49480435,23265587,23265635,49938727,26476911,28705197,29884863,35652046,36569640,38208059,39912013,42074740,44368534,47514302,15794907,50397380,1167120524,518818645,-326903666,-11053530,-1070395786,-26032,-259325952,185353867,1023768054,2020933633,235822731,4099335,2210048,1317777394,1457489674,1080557358,-397361101,1149834097,1996445198,142016262,-351826200,889150997,-16616193,45615734,-6664192,-1207959297,-857145343,1284201984,1361961756,16777114,474253568,-1709280001,249,85846102,1347862579,172263760,-1996077943,1149833284,-401698798,-1070394753,-1207920919,-11533824,1962879092,1345841958,-1929218817,1461115006,16777114,-11069952,1996425334,-26106,-1073020928,1482166901,-1995946357,1183524932,642025734,1351637995,-16222465,1256719990,1582230284,2123192151,-1705568544,65535,-529072298,-1914538241,1343677510,369640424,-26025,703266816,477429598,66714,510983936,104858,-6662656,-352321281,370075664,364832854,-370669589,904418837,1365240598,-402229505,1458241954,112734,1465798891]},{"sector":14,"data":[1342399976,1342178744,16777114,-1192195328,-1706033146,473,1465567371,637951684,722487179,-1960423226,-1054142905,1200301648,65458444,-1960423226,-628422073,-135006311,65130979,-1070378815,-26032,1391132672,-1999828386,1256927564,31713361,1996440811,108461832,-538440048,-13112571,1996425334,1491620102,1361832708,-352197144,1996443941,-26104,-11534336,-6683018,-352321281,1996443921,41347078,1354773334,-401698736,1609240879,41221969,16777114,318498816,-1201778197,-921960449,1278994546,1457749776,330426449,-1201783317,2088828927,-764084173,-351779701,1978159406,1959922432,-11513306,1996425334,-1706012154,65535,-397341973,-771030948,1347554676,16777114,-396996608,-346554230,1149984315,-13243632,1996425334,28856582,28332032,301459536,-1964486570,1344138002,142665809,1364203499,-351727128,1347902992,142016337,-1710852353,65535,-2090967143,-443874579,-900899553,-1957363702,1988843244,-1194183930,1317797887,273431300,1962877821,-26084,1586167808,-1898249468,939468482,-1709411073,65535,-1709280001,822,-443851176,311901,-11510952,1218059895,-1023410173,-2081649835,1448543468,-2096597365,1962938492,9169155,-1962509173,121439814,54818560,-13724736,1191426983,2083207659,53799694,803933820,722486411,1861684804,1689884932,-1946552576,2113866744,-335598822,276597526,-1206850737,-1845260541,-1677486333,-1325151485,-1962691325,1143672900]},{"sector":15,"data":[-28931826,41797435,-396953461,1465258948,-1962018840,1144587844,51739658,1346899524,-1710197505,65535,1006519945,58526276,1443513481,1578331112,1575324511,1426065090,-326898549,1988843020,826590726,-1070901759,244338768,722434792,-443851072,311901,-2081649835,1448545516,-2096728437,2080375934,272927496,2080654905,-18426,-16742423,2089488460,75377424,2088822737,108265523,1074807947,1962932227,121084444,1183383552,-27883012,-788248949,-62520352,-1980348791,33945686,1380995584,1475770111,309914,863797248,-1960348672,-523169724,50611715,1452014662,-163149314,1090016905,-11382702,1150023286,71707408,-26032,1962868736,56859164,-1202323456,-11534335,244319350,-1961963800,1600000068,-1034033781,-1957363708,49054700,1988843095,863797256,-2096204800,2097087614,272927496,2114209337,-18427,2122526443,309722884,2084175659,1444249104,108461911,1192285672,-11079445,1996424310,281602054,1354771286,-401698736,-1070920077,-443850914,442973,-2081649835,1448553196,-1207667061,-1202716608,-1706033096,65535,-15992693,-1070922379,1442891497,1464909867,16777114,-1070901760,91658832,-125108224,-477098,92641872,92864512,1443001737,1358951608,365210,71665920,-1001386,10132048,1183383552,-62458116,-1341885180,704834305,826640576,620512906,843417602,620512906,876972033,620512906,860194824,1852871,-1983894784,1166607941,-2000672246]},{"sector":16,"data":[1166554693,138790709,-396886017,-1705639861,65535,1356351113,383403661,-26032,-11141120,-6629258,-1962934017,1166662214,-1070901468,238282832,-15841911,28836469,-1070903296,112720,-26032,1166737408,-1956684252,46292453,-326413056,1443163267,721712779,574917056,-1205844855,726663234,-1706012480,1737,1579041929,-1034033781,-1957363710,49054700,1988843095,310151940,-947656751,863797312,-1962380288,537203268,-523520,-947184524,726684313,530206912,-1996488697,-1073013692,-1070922635,1149437931,28844050,-1956684288,46292453,-326413056,1460595843,175541078,-2096857461,1962941564,1962871602,-31989,-4716940,22079999,1342194360,1347469355,16777114,474253568,-16235321,-1983894529,1149830724,306481424,-2096479095,58064895,-1961853813,272906695,1996474482,108461832,182682,1183399936,574882810,1005733513,662052932,-998244316,-230258431,723416319,1996443840,-6663950,184549631,-1207536192,-471203842,-230257920,-14662519,1352277620,-1996488701,1451883590,142016510,-1962510593,1174610500,-11513092,-1248134538,-16777209,-6676876,-1962934265,1144590916,1443396624,201254888,-4688704,1788484724,-1996488700,1451883590,-196703746,-1946790263,-953479100,1183441105,863797490,-1962511360,1174474820,-775451662,-196738592,-624897,1183577206,-162100236,1375732229,-227082416,519578,-195116032,639779979,1183516553,574882298,3374208,1149971060]},{"sector":17,"data":[65065232,1452014662,-1983446018,1451881542,1079005942,1149980754,1355229968,298394,-195116032,509478,-15710977,-1030087564,1442840580,1342177720,-401698729,-947188845,-443850914,574045,1167087646,518818645,-326903666,1988843012,-62470390,2088828927,410255410,142016342,-1207535873,-1202651137,726663170,-1696051008,-62486260,142016342,-16353537,1156119670,-310157570,535137026,113921373,-326413056,1444473987,-955746677,65094,16533191,-263796992,1187446784,-1962934022,-1952906170,-101243828,58053131,-1962884375,1207304796,208961586,-1996384095,-1700659642,-62486271,-1979556725,-1071369657,158711868,721524385,1183448134,39619578,540166134,-1834940044,-28955903,-1030519,1183646324,-1706027278,2298,-1929218817,1343681094,591514,39619328,1077102582,889136244,384321165,20814416,889126912,384321165,-26032,1183514624,-230282776,703219339,1962931270,-230257918,1358841387,737429131,1177287750,1183535354,65065470,1174603334,1183535344,1284217092,-134613212,-61961239,-1056710191,1358579203,1342177720,137882,-443851264,442973,1458342741,184841867,-1207599626,65798143,1577058744,-1034033781,-1957363710,1988843244,2113276676,-137983226,-1962742824,-443851066,180829,1458342741,-1744550262,1614606475,2067530878,1183456892,-549611516,-1744404992,2080438077,71731727,16203160,1033374590,92078335,-337623923,1590070018,-1034033781,-1957363710]}],[{"sector":1,"data":[1424786412,1988843095,-1002009332,-1933818231,79216214,-6664192,-1996488449,-166986170,2078868341,175570689,-16616193,45615734,-6664192,1342177535,748698,-1304000256,-1207273729,-1706033151,65535,226682966,1962882303,175570690,1342177976,59290,830242816,-385649408,2088960295,58654736,-16703767,1183646324,-1706027274,2264,112726,165931088,272927568,1342587947,259226,-1270445824,2117730091,-385646668,1183514863,608437240,1459373705,50742411,-1712828217,-1069118984,-2084415863,91619322,1962934077,39619407,137578486,1996432245,178186,-126419120,-4032769,1996472438,-1065943102,457114,-6664192,-352321281,175570719,1347469355,-1032388784,1354790655,1342177976,737703679,-1706012480,65535,-126293930,105155414,1183434499,1424511158,-1404663541,968246923,226437700,959202443,92255814,-352321096,-1983894782,2088811078,208994357,3177600,2122516085,712310956,3505280,2088765045,729022512,3046528,2122524020,108331194,11304579,2122517621,326369466,3112064,1996426612,-163148534,-6664170,-1962934017,1183448134,166283256,233330431,175570700,-1699580161,65535,-443850914,705117,-2081649835,1448542956,-2096597365,1946161276,71732095,1946165565,1027241737,645136400,1149988587,-1948715250,108954104,1081409792,602429270,-1957041407,-303362436,-335544385,114664,2122441707,1963000070,779911235,-348294144,2243885]},{"sector":2,"data":[624811380,1026650624,-663355354,1912612669,2637095,552326006,3505280,2088765045,343146544,3046528,-1202319755,-11533309,1962879092,28305446,-443850914,442973,-2081649835,1448545004,-2096597365,1962938492,10807555,537165443,2088770677,292814899,175439702,1443195880,-401967873,-2014771930,-1070901760,280522987,1654280192,184549388,-1207599680,48955393,1183432747,1161462,216635984,-1073020928,28837245,721611520,-129594944,276086795,294531,2122517106,74653700,1074022019,-1996208501,1187445318,-1923743492,1343683142,-1207274241,-2091909119,1946220158,1354771202,-1962395416,-31752,727062132,-397407676,-1202323434,-11533309,1962879092,15722534,-443850914,442973,-2081649835,1448545004,-2147060085,1946170748,13363459,1342181560,852122,2109737728,112645,-1070923029,-1191426423,-1706033135,65535,92127243,-352321096,-1983894782,2122579526,1249116412,3374208,2088780916,1047855152,1443527819,74901591,15226710,1448564230,151906391,91602955,-352321096,1354771202,1443407336,161474647,-1980217719,1153890902,-1202323152,1380975617,-386369793,-11141035,1996425844,154134532,1465317515,-2096877592,1946222206,813465613,1443329280,81979479,1465264619,-1995874072,1451882566,813465850,1443263488,-352058696,809813512,28857857,1996443652,-126418950,1577060584,1575324511,1426064578,-326898549,-1957275890,2088962678,57999376,-1962730263,37554246]},{"sector":3,"data":[-385649406,58589822,1023601897,57999872,1023470569,208929281,-2147287831,1946170748,49539377,-1711115009,633,3046528,-488045708,813465602,-385649664,1153827545,1962869045,-26110,1962868736,-26110,2122383360,1963066120,-352210940,-2000672254,1962882884,340036866,1285181470,1442840586,-16353537,-756546442,742689032,-1205189495,-1706033136,3147,176013323,3374208,28312692,-1070988565,170804360,1445098944,-399870721,28379087,707742856,1958820845,1962890759,78243882,712310614,-352062488,1962890779,128837674,74825739,48955824,1149812778,1962890799,75884586,712310614,-2130463768,67176574,1962873972,112642,26261584,1354771280,256744016,2122383360,1963196936,813465611,-1207208704,149618689,3505280,-1070860940,57982987,-1962805015,1183388740,106334980,-1993980791,-771020716,1149962876,2144353050,9562371,556673,-2093058814,2097153662,105286407,116119799,721831563,-125101500,-523041615,-150892499,-129594920,2097152317,-129579259,1962868737,112642,-126419120,1347469355,16777114,108954368,-2096530176,1962935932,25684227,958022795,209585734,1209025675,1963344955,24373507,108954454,721714432,-1207702592,726663169,-538423104,108954611,-1207599872,116064258,723141771,1183392836,1996445190,74907398,-1996404504,1150025286,-28952276,854131573,779911169,1444246784,57796688,-1979824501,1149840452,-397388246,1810563939]},{"sector":4,"data":[959202443,108341828,712310614,1149981163,742665002,-109778864,724192395,-1991115186,1743319622,-230278151,-11137932,1962879604,46852140,1150014187,742665002,-110696368,724192395,-1991115186,1508438598,-230278151,-11138691,1962933878,1443359532,-13863681,-1712783754,-28931326,1445741705,-385976577,-1561787868,813465600,-385649408,1153826969,367722544,3505280,-1964440715,41221888,1342177720,16777114,893699584,776259072,-26112,1962868736,745865002,16777114,1183399936,712310776,-1708362497,2657,216791179,1149917014,1357130287,1191529960,2146991673,880574703,1446802432,1342177720,2112360080,930906112,1445753856,1342177976,1843924624,1025567488,57999875,1040000489,58000385,1039996137,58000386,1040052201,58000387,1593794281,1575324511,1426065602,-326898549,1988843010,340036872,1996443678,74907398,84634,1958742784,105286427,608996249,1183447543,273452030,990268459,50691521,65734212,1593835448,-1034033781,1478361094,-1957345904,-661774612,141986646,297284863,1962889217,106334980,1150009387,-1706012158,65535,49120094,1562371467,313933,1475119957,108432214,1443135115,29222999,1465276246,184863464,-1207601728,48955393,-397361109,2088764514,175374388,112726,-401698736,1600061336,-1034033781,-1957363708,-1957275668,2123040374,108804356,1465255038,-397010453,-952433391,727061629,-947171136,1074676779,301111888,-397410304]},{"sector":5,"data":[1599995912,-1034033781,-1957363708,49054700,1988843095,75401990,1209025675,1354771280,317364823,-1706033152,4857,2084173963,1448834054,-1962566680,-953481660,-1994101513,2089418310,41221894,1342177720,957236363,276697156,-150969160,1284217327,239872784,49019383,-1202667477,-1706033151,5156,721581311,1996443840,1347440894,-26032,1962868736,234396162,-397017088,1599997204,-1034033781,-1957363708,1988843244,837309958,71731973,1443513481,1577383912,-1034033781,-1957363708,82609132,1988843095,105155334,1074676739,738084489,958852095,410256510,2131131449,-25282285,1465257596,184784616,1443198144,7989335,-1070901418,53274704,276576583,1600050559,-1034033781,-1957363708,116163564,1988843095,105155336,1074676739,-113015,1996424822,276666884,-1992294400,1996487238,74907398,1084570,-336033024,108935459,2084117876,957906694,326958718,820533078,793545219,-1053037270,1465255284,1191186152,2147122745,-1956684072,113401317,-326413056,1460333699,108432214,956595851,1434388092,58976342,1300023099,3243136,1962887028,-129594110,-644198378,-1962934253,105130951,-1994101513,1141111366,-28931804,70182998,-1711115009,5089,1358317193,385369741,190028368,1962868736,-159973630,1310106,-639085056,-1956684285,79846885,-1873273344,-326412987,-2082959842,-1957294868,2088766070,2004090929,556675,2088964724,208928784,50742411,994053700,1601963590]},{"sector":6,"data":[-1929218817,1343682118,1330842,41221888,385178,-196704000,28856406,1183666176,-397404426,1962931672,-193528062,391066,41221888,1342177720,2114995257,6600719,-1727632137,1225804939,49019383,-1202667477,-1706033151,1562,141885270,1577143528,-1962742397,1297948645,1426065098,-326898549,1988843016,41221894,385369741,238787152,2122514432,91488260,-352321096,-1950340350,-28931128,610044825,-1056703497,1575324510,1426064578,-326898549,-1004934394,1191118942,1065362952,-2146798336,1962999422,-339727539,71761740,637820612,-467007606,1347537195,1357978,-28932096,638082756,-316010614,1364382251,-1694873975,65535,989611656,-1217070522,91602954,-352321096,-28931568,2113685048,178181,62391275,1575324416,1426065602,-326898549,-1957275898,1183518326,205916938,1589905780,1065362954,-1207601920,1877737471,1191739019,2131786809,75399952,721712128,-1962611776,-1958211516,75400184,-1962642432,721611719,-96040512,1209025675,2131248699,75399942,-2084277248,2080444540,209125310,1443526399,-304945065,585650258,-28931585,-301668266,956712587,75497030,267110283,276576583,-13958539,1979350585,1586293712,1575324511,1426066626,-326898549,1988843010,-28915962,2088828927,1383399475,-16482685,1149979772,71710992,-396999555,2088960512,242548488,74907478,1459352552,-402098945,2122579323,393543428,74907478,-1946427416,1149830214,172263688,1625837654]},{"sector":7,"data":[-955913219,-63420,-1995946869,-396951994,1183515024,-443851010,311901,-2081649835,-1957296916,2088765558,242548787,294531,1183530100,138709254,1962882283,376150556,1284177920,65130768,64654280,1317602894,-27358724,294531,28312692,-1070988565,654073540,1962870664,378378780,-1956773888,113401317,-326413056,1459940483,108432214,-2147189109,1962947452,142358798,28837237,724626176,-13833280,1939479668,-1962934265,-506392500,-628373501,1317654275,-27358724,654073540,-1952970870,477429752,482202,1590135552,1575324511,1426064578,-1957237621,1183516790,105251076,425603,1187448701,-352321530,272927500,2080785977,1183401988,105286406,1575324510,1426065090,-1957237621,1149961334,239338246,1149980744,-1706014704,5985,1575324510,1426064066,-1957237621,2088961654,92143908,-352321096,-1950340350,71732168,-150584277,-1056758684,-796143061,135053355,1575324510,1426064578,-326898549,1988843020,41221896,385107597,399612496,2122514432,92078086,-351910773,105286446,1006519945,108984902,-1980086645,1183579718,1284217342,1358559012,722486411,1346897476,1177754,105120512,1593591433,-1034033781,-1957363706,1988843244,914128900,723284992,1149980864,105130762,611120960,-6664120,-16776961,-6684044,1577058559,-1034033781,-1957363710,1988843244,914128900,-16223232,-6684044,1577058559,-1034033781,-1957363710,149717996,74877782,-1929218817,1343682630]},{"sector":8,"data":[1268634,41221888,1342177720,737965823,-6664000,-973078273,1577137732,-1034033781,-1957363710,1988843244,813465604,1443656704,1342440376,1347469355,-2131383064,1946170748,45635084,-1070903294,-1696051120,914129141,-1710656512,65535,3556550,1575324510,3343042,240386051,779616257,326631427,939065345,39518211,34341119,170721283,452919297,346095875,5177351,122880003,1384382465,395771907,-2054815743,45613315,5767175,307101699,1191772161,179634435,5898247,166134019,5701640,236847107,781254657,26083331,445841409,99483907,6094856,400752643,-2087387135,24641539,429522945,328269827,941228033,51118083,1738211329,90832899,1646329857,388890627,1629552641,327548931,1721958401,248119299,1428619265,167968771,464257025,305922051,4063487,88867075,327687,275054595,1437990913,27721987,458759,395247619,-2068316159,169345283,131080,383778819,1379663873,307625987,884932609,105120003,983047,290717699,624885761,108986627,1048583,27328771,1114119,370016515,1179655,372900099,1245191,38928643,1376263,156303363,541720577,298450947,1380712449,397606915,-2058289151,90243075,1649868801,180027651,2162696,236322819,844759041,285540355,1692270593,182190083,1298268161,168362243,2949128,31719427,1667825665,149225475,1625948161,405012483,-2072903679,275906563,846397441]},{"sector":9,"data":[1167087646,518818645,-326903666,108461828,16777114,1975520000,-339727612,1354771246,16777114,-62486272,956309665,208930374,2375299,-1593478144,-571801564,-1559869813,1183514656,2401276,-2097151560,-443874579,-900899553,1478361090,-1957345904,-661774612,2375299,-954502144,8198,604423936,-2097152000,11838,870843252,112644,-1070923029,-1962742397,1297948645,-1873273141,-326412987,-2082959842,1448543980,2375299,-2089651200,9790,922686068,129499174,-1070903293,-1706012592,319,2244227,-12487680,-1711267274,328,1049358475,250282028,-6671105,1442840831,-402340221,-947190771,1975520079,574029803,25532928,922681344,-6684638,-1560280833,113704994,44,3016391,547422209,2532096,-352321096,1589652226,49120095,1562371467,1478413133,-1957345904,-661774612,1460333699,641138518,50771968,1354771280,-275099568,-16777214,-1711267274,589,-24383349,16402119,2924800,-336050551,41714457,-15698944,76282438,-1996335989,39160069,-2096838781,1183515846,-129040392,-579485685,2242303,169370,637978368,-1593835520,1178140716,-955878150,16788998,-96040192,-2097140573,11838,65536884,-2090902013,-443874579,-884122337,1167087646,518818645,648140942,49120000,1562371467,1478413133,-1957345904,-661774612,1460202627,141986646,2375299,184841216,721778166,11725248,56485974,-15992693,1048799861,1962934306]},{"sector":10,"data":[4372501,309328,-26032,1183383552,2270204,922688235,748748834,-773795584,263648,1354771280,16777114,-62486272,16547459,-1705593484,65535,200951433,-1962576704,38272984,2242303,233370,-1577547008,117375020,-523173844,-133963567,82523529,42461271,-1996077429,-396950971,-1073020102,37554804,1024818176,276758531,721581567,-1202696000,-1706024832,65535,2242303,195482,772196096,-1962934016,1599997510,-1962742397,1297948645,503317706,1430622296,-1910575989,116163544,-13937065,2375225,1996437876,42330118,-166989685,2088971636,460652546,2506371,-15436800,-1207949770,-11533563,-1070922122,-6664112,-1962934017,922681980,1033502754,-1962934269,-2090901817,-443874579,-900899553,1478361090,-1957345904,-661774612,-2097140575,-443874579,-884122337,1167087646,518818645,1996478606,35514374,242532363,2242303,236954,112640,-1070923029,-1962742397,1297948645,503317194,1430622296,-1910575989,82609112,608076630,125042688,2244227,721712384,-2092962880,1946158718,108461841,-1962814744,1962281968,80118762,922685163,-6684638,-1560280833,-259325910,2242303,16777114,2924800,-523116335,2754051,-1082735045,-2090990453,-443874579,-900899553,1478361090,-1957345904,-661774612,-16222465,-6683018,-2097151745,-443874579,-900899553,1478361092,-1957345904,-661774612,-15958399,721712063,-15602752,1996426358,142016266,-1710852353]},{"sector":11,"data":[65535,-1962742397,1297948645,503318730,1430622296,-1910575989,82609112,108461910,288410,1958742784,674663185,105286400,-402642781,-963968902,-1070923029,49120094,1562371467,182861,1167087646,518818645,1448597646,-1962379637,-1705638274,65535,292864011,1153623,-1073020928,1048774516,1962934312,-339727612,674642218,957510912,1962944574,112645,-1070923029,-352321096,674692882,51230720,-1070901680,-778414256,1577058308,49120095,1562371467,313933,-940799147,11782,675185408,359923712,2635519,1342376120,2504447,1347469355,47258,1575324416,-1873273149,-326412987,-1579643362,-310181848,535137026,1439386973,-326898549,1988843012,41714436,1447785472,184592872,1027830976,913571841,1946157629,212263,1962882165,-26110,1183383552,-27883012,654073540,-1710852097,65535,-1711115009,65535,-1711115009,65535,1962871019,-26110,-1956773888,46292453,-326413056,1459940483,973024086,1962943038,-339727612,75399999,-625664,-1711267274,200,-166989685,915007348,1049296938,250282028,1178141835,-1962642172,-2095715386,-947190586,1975520079,574029803,15636992,-1108672512,-443850914,180829,1458342741,-1962641781,146692,54335860,1025078272,427032704,1946190397,8600842,45615732,-1207112960,132841473,-352320584,1589652226,-1034033781,50336514,117702657,50350080,117585921,50350336,134563329,50349312]},{"sector":12,"data":[17047808,56659200,17062912,56660480,117574145,50332928,117582081,50333184,117503745,50333440,134556673,50364160,117796865,50333696,117808641,50333952,17080064,52772608,117607425,50335744,117783553,50336000,117774849,50336256,117781505,50336512,117448961,50340608,117690113,50349568,117495553,18176,1167087646,518818645,-326903666,-11118812,1996426358,113502218,1088177801,-4716939,13101567,-388204801,-259324040,1946223862,-83962,-167725847,1954602054,48412696,1183666206,-1873799454,62580750,-1201441472,-1763049477,47364096,1183666206,-1873799454,61007886,-1947700160,63407102,-402098433,92866396,184702345,-1207601726,1810628604,-402229505,1166608200,139823366,175489547,-16615937,123004981,1183572459,71665928,-1996077429,1996425797,516393948,-26032,1183449088,-498693924,383927949,-26032,1183383552,1958743008,-599329252,-15633024,905904757,-16312856,1979648117,118286342,-337623413,17596422,1591494283,49120095,1562371467,576077,1167087646,518818645,1589958798,126494214,-1779937128,-153580794,91554055,-335544904,142016267,-1710852353,65535,-1962742397,1297948645,503317706,1430622296,-1910575989,149717976,-401967361,-661977504,1963001846,-149499,1996438763,-26102,1183383552,-61437446,661963275,435701447,-1005393152,1191180894,126494458,-16359740,-2010773946,-129594617,200822527]},{"sector":13,"data":[736392640,-1207702592,-310116353,535137026,113921373,-1873273344,-326412987,-2082959842,-2141845780,-2097148570,1946158718,209617670,721712649,-1200231488,1727463439,-153580788,16912007,1187507572,-1207959302,1727463439,-152007924,33689220,-1535109772,-990051826,1191118942,277121544,126363138,-939899137,64582,956712587,259914310,-1710459137,65535,201082505,-2096267328,2097216638,-96040168,351000823,-16228668,1183451206,126363388,-335919361,-96039989,49120094,1562371467,576077,1167087646,518818645,-2141792114,-2097149594,1997080702,1030159,-1962383625,243791576,91488770,-335544392,1030181,-1962383625,243791576,-327941886,-150990920,-259323802,34507904,105286146,34636936,-2090942421,-443874579,-900899553,1478361092,-1957345904,-661774612,-2147160957,-167768730,1954548806,178181,163054571,206473984,8380801,74694971,1206632491,-401836289,-661977892,1963001846,-18427,1187460587,-352321284,209125153,-16228668,-1977219002,-1705994233,65535,125091851,-134461813,-15668264,1183579206,105840390,-713703413,-2080618869,-443874579,-900899553,1478361096,-1957345904,-661774612,1443294339,484992,-2147072266,45614452,-1207702784,1317732361,2145485062,1942043392,-18427,1996438507,73066502,83292299,-1149951,-6683018,-1996488449,4061766,-2132904832,1190592036,309690374,-16419585,2078802804,192216836,-402033409,1183515762,-310157574]},{"sector":14,"data":[535137026,46812509,-1873273344,-326412987,-2082959842,1719665900,1996423179,142016266,-1710852353,65535,1039943305,343179264,-401967361,-661978132,1946290166,106873863,21495590,-2080618869,-443874579,-900899553,1478361094,-1957345904,-661774612,1443163267,263779883,-1947273472,243791576,108265730,-401698730,-2092499172,-428077570,49120094,1562371467,1478413133,-1957345904,-661774612,-1956975485,1451951686,-1505326840,-945269111,1702982,1589906155,-1505296474,509478,-244085,-1072956338,1996483701,175570700,380389005,35055696,-1995815287,1183648854,-397404500,1183384197,108347562,-369098824,1589903857,-1438217722,-167278554,1954589254,48740361,-1945483639,1996426334,175570700,380389005,30861392,-1995815287,1183648854,-1706027348,65535,2080375357,-1404663105,-754404968,-1966568480,194555206,-61961784,876462475,2137682994,825310589,842861684,1029141553,1031024949,1187484395,-1006604548,1183516254,1200170748,1204233729,637536784,168970183,1333798400,1996423436,175570700,380389005,23521360,-1995815287,-1039463338,1290357621,-62470399,-1008009066,754730695,-943920383,39386182,1187493355,-352014084,-62470226,-1477768864,-1057208633,-945755374,629210182,809343467,1037136947,-395037640,1949642813,959856078,266986868,-1404663041,1958742936,4537618,1312623988,1027175424,762576975,-939592215,195654,-1979294012,-2010710970,1996424263,175570700,380389005]},{"sector":15,"data":[14346320,-1995815287,-1039463338,-1058467467,-62470400,-722796543,16533191,-1966216448,194554950,1024292032,141819959,1946171453,-22484692,133973703,106873856,654067338,-16562296,1996426358,-1404662518,-1914154986,172394752,185357961,-351701566,-62470284,-706019320,-1733540214,225755147,1946169661,3292475,1676217716,106874110,25133862,-953584274,195654,-1979294012,-2010710970,1996424519,175570700,380389005,4122704,-1995815287,-1039463338,636160373,16533191,-2133464320,1951444094,-31397629,637951684,-16365625,1204233983,654311176,-16103481,-2084557825,-443874579,-900899553,-1957363704,49054700,185091723,91556422,-342245333,140428388,4161574,1589965428,126494216,184436360,-12225344,540805190,977012852,742130804,1589912437,130426372,-16520448,1589905478,1065362952,653554720,1946173312,138841019,-351644021,-28931556,887640216,73319426,637814527,-1360328824,637820612,-352319546,1575324636,1426065602,-326898549,1187468808,-956300804,65094,637820612,1352140682,-1744699672,1946173757,4406549,1279079284,1026782208,947126352,-369098824,-222429047,-62470398,1015021568,-1003523023,1191117918,126494212,-924299112,1144669697,-337152769,47365847,-490807061,-28915966,-689241984,-956106562,8453702,2122565611,276037884,-16490812,-1977220026,825071623,-96040704,637820612,1966751616,71761667,16416387,1589941884,1065362948,-2087881472]},{"sector":16,"data":[1946222206,178181,163054571,-96060672,2011759485,-28931073,1593460227,-1034033781,-1957363708,71759596,-1190103936,1183514639,8332548,-1543118345,-1190270206,1183449103,-136041980,34473441,-1034033781,-1957363710,4241644,1354771280,-1710983425,65535,-796143061,-443826133,180829,-1275051,-6683018,-1962934017,79846885,-1873273344,-326412987,-2133291490,-16774810,1183451254,-1705994234,65535,-1962742397,1297948645,503317706,1430622296,-1910575989,157712600,142016256,-1710852353,65535,-1962742397,1297948645,503317706,1430622296,-1910575989,157712600,142016256,-1710852353,65535,-1962742397,1297948645,503317706,1430622296,-1910575989,124158168,108461824,16777114,49120000,1562371467,182861,1167087646,518818645,1719720078,1996423175,-26106,-310181888,535137026,46812509,-1873273344,-326412987,-2133291490,-16774810,1996425334,-26106,-310181888,535137026,80366941,-1873273344,-326412987,-2133291490,-16774810,1996425334,-26106,-310181888,535137026,80366941,-326413056,71731798,1022397336,-1207599775,48955393,-1072971733,-963967884,1150092267,-443851040,302170717,-1811873024,1509951236,-1107229952,16778752,536937216,33555969,-1375665408,50333184,66304,67110402,-402586880,83887618,335610624,100664840,1392575232,117442051,-1543437568,134219267,-436141312,150996488,-1040121088,167773704,939590400,184550920,1543570176]},{"sector":17,"data":[201328136,2097218304,218105352,-1644100864,234882568,1375798016,251659777,-603913472,251660039,-218037504,285214471,0,1167087646,518818645,-326903666,-1957275852,1183518326,17841420,289215348,-385649407,322765149,-385649407,-706150149,-1607008511,112643,-1202695527,1385758722,-26032,-125108224,58064651,-16722711,1459855414,16777114,200837888,-385649153,-1705574207,65535,-1996480507,1451871814,1975651280,11266307,-1982970229,1451875398,-700004642,-597769139,651576970,-1977219280,-700043257,1021069055,1458205978,1342177720,-3115265,-1030041994,-16777216,1996476534,15768270,20971520,-1202270650,-11534235,1996476534,-25906,569049088,34342654,6600790,19634768,-1202716672,726664193,1996443840,-831062064,85658,-797507840,-1697745153,65535,-834272960,651058884,1964654464,-6662201,1459618047,16777114,28857856,-390574080,-1070903293,-6664112,-1207959297,-538378239,1689802240,-6664192,-1996488449,1654773830,-666486528,1996481908,67811544,34381904,1346954282,383796877,23435856,1996423168,67352792,34381904,1346954282,1347469355,96666,-663290112,1342440120,-1924087765,1343676486,16777114,-1952388352,20777542,1033400832,125173762,1946182717,1452075801,1342177720,16777114,28857856,-6664192,-385875713,2122579829,57934344,-37655,-1207721930,1385758721,-26032,-1706033152,65535,1456227977,16777114]}]],[[{"sector":1,"data":[-767129344,-864616624,16777114,-763953408,1342177720,1354771280,-26032,-11141120,-6630794,-16776961,-6632330,-385875713,-1070858467,-310157474,535137026,181030237,-1873273344,-326412987,-2133291490,134206,922690677,28836768,1347590400,-1202667477,-4521985,-1706011905,65535,34342598,218547712,-310181886,535137026,382422365,-855637248,-117440255,-83819721,1157629953,-1375665408,1509951232,-218103040,436207873,-1107295432,-1358889215,452985600,587202817,-1728052395,-1308622591,805307733,-436142334,-452984063,1056964864,50397989,318768897,939524864,1459683074,-1560280320,1476460289,-771751168,1526791936,-1560280320,1543569152,-369032448,419432449,855638528,-436142334,-654245119,754976769,1040253696,1006634752,1359020800,1023411968,1610679040,1040189184,151061248,1056966401,-1006566656,1006635009,0,0,0,0,1167087646,518818645,-326903666,205949822,-1995549045,1451852870,-1907964026,-1039466496,-2031549579,-401698815,1183385368,-1773761150,1183535126,-1873788798,113895438,91537419,350863403,-2074164222,25133094,641168698,211289994,6368544,1351108233,1692929680,1958742790,-2075753509,-1773761278,1183535126,-1873788792,109963278,175423499,-1870498049,104982542,1187494635,-1207959148,1203375140,1183399938,-1839822448,646209220,1962950528,16181507,-1399172346,-1996488702,1996458566,-2072576122,719851152,1975520006,14346499]},{"sector":2,"data":[9717447,-1975088384,-1954265597,1183417942,-1839822448,646995652,1560248192,28837237,721611520,-1807316544,-7715189,-1072985522,1589918068,1200236176,-1941534465,74721852,91569980,26494663,-1937866752,-2146667428,1949273214,-1937866746,-2095483590,1962969726,112645,-1070923029,-2087827831,1962972286,-11998968,-342864129,-1904311377,-16550912,2122551366,108331150,9076355,1325349500,-1872837488,-2012771802,-970552250,1589903367,1065363076,102069248,-401698733,-1073019531,28837237,721611520,-1807316544,-7315772,1183486022,126363276,9731715,-337050763,-1904311298,-16550912,1996460110,209125134,-7178497,-6647690,-1879047937,93513742,-1971173751,1090814534,-963230072,-1925540026,1343658054,1082279563,-401698736,2122515767,460587016,-15698177,1996425334,142016272,378947213,8185936,-6664110,-2097151745,1946195070,176063329,-10783744,1996427382,67483658,1354771280,664424528,-16777214,1996427382,68073482,105286480,1354755877,-15829249,1385827446,-2130706430,1074792038,1996432500,175570704,1342443192,-2147072373,-1202683700,-4584412,67071,1375785603,59087440,1183514624,49120148,1562371467,838221,-2081649835,1187452140,-16776962,1996425846,-26104,1183383552,1183666428,-1706027276,65535,737691275,1183446086,-59310100,16777114,-297367296,-1149185,1996424822,108461828,-1710983425,952,1357923977,186522,-330941696,2122524534]},{"sector":3,"data":[2138374398,637820612,-1986525302,1996485190,-1202518290,-1706033145,65535,-2081667543,1962994814,-59310246,-1695648001,65535,16678531,1325351284,72285956,637820612,-13760570,1586168910,130426372,72285998,637820555,-13760570,1586168910,130426372,72286044,637820555,-12974138,1586168910,-230258172,-1962440666,1451951174,-2094863610,-1962474426,1325396038,2126515184,73319436,637814527,1968979840,-28915734,1005125633,1575324671,503318722,1430622296,-1910575989,2028766168,209125206,-1207535873,726664201,1347440832,239770,-163149568,92127243,-957759445,209125120,-1207535873,-11533302,1183708790,-1706027374,65535,-1986902387,1452051014,-1706027380,65535,-2138552695,1968935550,112645,-1070923029,193873545,-13863744,1325369926,-2005496952,646602436,1560232134,764640896,1191140725,-2008088694,646602379,973162438,38258214,-1958155520,1451985478,-129594996,1392137865,84122192,1183383552,-1004934256,-2144929698,661925439,110120703,-26029,1183383552,-94991880,9469571,1589961087,-129564680,772261414,653811339,-16775226,1996425846,-1938358520,-1702201601,423,1586382475,-1962742397,1297948645,503318730,1430622296,-1910575989,1022133208,-62470314,1996488703,-26104,-1031077888,1342719625,1342600959,-1710852353,65535,-972267893,-1929367225,1343671366,-16222465,1183516278,2145681418,-401698736,-1073020496,-1813445772,1354771200,-1719729480]},{"sector":4,"data":[-6664110,1342177535,346266,-96040704,516179655,-360807680,-11176914,1183648374,-397404468,-1073020737,1190545012,762581217,-1950068993,1120322678,1988844492,-868053564,-1483059178,50331648,1183433798,-1012794,1120323142,1988845004,-868038970,209125120,-1916504437,1343671362,408474,-62486272,-229757,1183649404,-1873799476,22603790,-1938505717,-1694861569,65535,-17006973,1190596724,1950351370,209125129,-1996459544,2122579014,209059580,-1207142657,-1705967618,65535,-972267893,1392587079,1347469355,16777114,142016256,-16353537,1996425334,-26106,1183514624,-310157572,535137026,147475805,-326413056,-150803325,-2147481530,1589907828,1200236036,-1981535723,1183186502,-1207602168,48955393,-443826133,442973,-2081649835,244322028,-1996382488,-1070861754,-401698736,1183383925,-129579274,-112802213,-96025043,-79247840,-62470611,-45693347,-196688128,1105920000,-1863026945,21751822,1692929680,-196723967,28847221,1996443648,-25868,-1073020928,1183456372,-2009004812,1996487238,-129594108,-6664170,-1996488449,-1072955834,1191119740,-163148812,2096383545,-227082313,48762512,-28931327,-1034033781,-661913598,-1957345904,-661774612,-1960945834,1586367574,-853887986,105810721,-1912056181,1320421982,41034189,1595916339,49120094,1562371467,707149,1167120524,518818645,1465309326,106335006,-1274519922,-1272853222,1914817871,532689666,-310157729,535137026]},{"sector":5,"data":[80366941,-1864856576,-326412987,-1948742114,246679126,-467000883,-1962742397,1297948645,-1946156342,1430622424,-1910575989,1455759064,-851725306,855798305,-310173760,535137026,80366941,-1864856576,-326412987,1457032734,2126782039,-65075704,168183435,-1274645056,-31339239,-1328510272,-141841828,567101364,-1070398862,-2090967265,-443874579,-900899553,-661913594,-1957345904,-661774612,567089588,-310123478,535137026,-1932833443,1430622424,-1910575989,106335192,567086772,-310123478,535137026,46812509,-1864856576,-326412987,-1260876258,706858265,49120228,1562371467,1362765,43319299,939065345,69599491,5046279,86573059,34537727,92340227,34603263,102891779,65537,91226115,34668799,72614147,5767175,68026627,5898247,76546307,327682,93454595,393218,45416707,5963784,49020931,941228033,79888387,11337983,9371650,203685889,42205187,1629552641,75366659,1376263,41287683,5964031,32178179,6029567,34275331,6619391,80281603,928645121,0,0,0,1167087646,518818645,-326903666,-1957275894,2088962166,74711050,317456171,108461910,16777114,-774337792,945554403,2122923915,-1707802628,142,1183434499,-94466824,2122915051,-128021508,-467007606,10525264,-1073020928,1191117940,1191135224,2117683192,-2130682,11639348,1183514624,-2090901764,-443874579,-900899553,1478361092,-1957345904]},{"sector":6,"data":[-661774612,1443163267,-16222581,-26060,1141047296,-62486254,126539915,-1705974742,65535,108314635,18760843,889128518,16777114,105286400,49120094,1562371467,313933,1167087646,518818645,-326903666,1988843030,-62470392,250281994,1979469567,-339727612,-26073,1183645696,1448089322,1342243512,112720,-26032,-1073020928,1183570548,-754404882,105253856,49120094,1562371467,100977229,553648896,151060224,1308623618,855703296,-100662528,-1207959296,872481570,134219520,1711342336,150996736,-436141312,486541056,0,0,2,524296,16842754,0,7012414,8323179,6488157,62,1745838350,2081389338,1628003677,443753476,142545012,1779391355,677799435,1749558349,2050036031,1677818645,978913802,1968513365,1697188135,1778611216,557845773,1545091155,1728467570,1864200734,675556719,1260741700,1261980207,424299044,461244525,1947760955,1645245720,575088738,1394688002,1496734262,393614169,1383208825,1964602640,30996,660483149,1177177863,778915107,978395970,1930583903,155871745,208342117,1768496489,1345608251,1061816617,557852747,1897996621,688481552,326765677,1530028128,930304824,1583231582,1811968531,239823621,426446434,1077041689,1031428649,625616456,811479362,1964733488,259792213,2105348988,1210862911,843128936,641806150,1628656981,621112832,1092098157,1428575008,1014256701,844966237]},{"sector":7,"data":[1730750784,1913350150,243013970,1281431677,1846245660,828249108,1545025369,1445281849,376642646,2048163126,743251229,1578448217,1379228466,690576190,1113721965,2081908494,896561173,1430024529,640046393,142348401,1695180072,896692759,1934833236,1244616765,4868646,1164247909,2081911829,626474876,1327447884,1228627498,527448634,1765349751,1762028038,862019850,1327316306,1244022570,241642283,2064859232,644705562,2035889479,1378967082,511392057,1828999280,811885571,576405329,1260672514,724261180,140906081,1830715176,67397894,809902935,1294103893,1548109346,2004055149,1802398835,1802134381,8336,1767108608,25978,1867378704,25974,1665789984,28271,1868230704,-2147455633,1816391776,6648687,2004055149,552624256,1937009920,1852601207,1784900971,-1874853888,486555652,1124109568,0,262148,3932240,65636,8605858,134242560,402661376,25856,-2108686080,6225920,2228230,6619164,1342308359,1509949570,771762176,16782592,16777216,32848,2004055149,1802398835,1802134381,1953387784,1701606505,1917126244,561147762,107695874,1668178243,1090874469,1953656674,1952797189,1225161074,1919905383,1700332389,1867383411,0,1828716544,1937208180,1852397343,1937207140,1146309920,1293964111,1768448865,1142973806,1852141669,1953391972,1174798336,1095586383,50331988,39016787]},{"sector":8,"data":[1167087646,518818645,-326903666,1187468840,-956301080,63046,1183432747,-599356962,-1980610935,1183439430,135063768,705709706,-1058516764,273057799,705578634,-1259843356,239503367,940590730,108334662,-385873992,-1779956778,-330921721,705578634,-330941468,45614706,62974208,1342202040,-1727790920,312102994,-1996488703,-1072957882,1187448949,-385875480,1996424035,19503862,1183383552,-564753956,-428555765,705578634,182997220,-49911,-1073018500,20778366,-948866048,583750,-1207749911,1183383555,1292792,387575,-364476160,705578634,-1070903068,112720,-362902704,-15894529,1996480118,133425372,292864011,-1996488008,330954822,99219200,1183383552,6338794,-128021680,-2020875311,151322720,-754732800,1372138472,-26032,1183383552,1975520242,-10557176,-352320328,-227082298,16777114,-666466048,198858377,-385649214,1586233156,138906602,2012729899,-96040691,722552715,225966034,-1947318647,-768929465,-1995606025,931914838,704989066,191363044,1200343179,-1311667450,65065733,-896841530,-151530965,1325647875,-61961981,166217415,12904704,705578634,1996443876,-461963282,-1417589,1996426615,-596181026,185020648,-385649216,1183514755,138808070,1183518836,1356396526,184966911,-385649216,1586168355,222792682,65955575,1183441990,-62485516,1945388601,-398014712,82378756,-196703486,-337230199,-362902730,704792458,-1949791260,1177282118,-137221124]},{"sector":9,"data":[-1992277775,-768872378,-150992711,-1328903183,-1948200447,61993054,1992616915,534232,-1947842817,1200351838,-196738291,2011579963,-95486020,-1417589,1183573062,256326116,1187455863,-16776988,2122575430,359923962,184960651,225708102,-1149185,-1073019298,-2065104011,-92372223,-385649664,1187512094,-1979711256,-467005882,-361300144,1342226616,-1207584024,-397410302,-1061680911,1996443648,-596181026,-1957642197,1200286302,-2132530678,-397344828,-12777006,-1206225665,-11534144,1996480118,112860,-18352,163113040,1979711293,-398014712,485031943,-431569151,1156251650,1342226616,-2197761,1996479606,-431584282,146395691,-1947076864,112842,1586225363,-754732570,-663304981,705202726,1959298541,-542715,-1070923029,157870160,1962934077,-431554640,-772252021,1619495907,994066432,-1401428410,1342226616,-2197761,1575541878,-49912,1187482484,-1962934042,1452006470,-532248098,-337488247,-530660339,652232447,-16775226,2122442310,1912733926,-431568916,619380736,705578634,1996443876,-596181026,1342177720,65422987,1342230534,1074081000,1021903733,-431554561,-1947574645,105351991,-523041359,726189571,1006041042,-998775226,185222795,527699014,1342226616,705578634,1996443876,175570700,-2197761,-1612129162,58015750,-1963001111,-467005370,239503952,-361300144,-2197761,300473462,91570183,65554119,-599356672,1960723979,-159973624,267162,-159481088,-16223232]},{"sector":10,"data":[563803766,-1962934268,1175181382,-16223014,-6622602,-2097151745,1946219134,-227082488,16777114,-398030080,49120094,1562371467,838221,1167087646,518818645,-326903666,-950642912,60486,15746759,-1983894784,1183441990,138840802,-397351894,1183318935,105286152,-397351894,1183318923,1357130246,-955959064,-983994,1342202040,-11485141,1939537014,-1996488704,-1072959418,1859193205,-58817540,-2115930880,67173502,1996427890,9083632,1183383552,-464090654,141935115,32261831,43182336,-24906197,-1202160381,-1202716520,-397410144,-998044471,-773944572,-1900544029,10532864,210298960,-1979399037,100665414,-1598553952,-1070903296,147253328,1038632585,158728191,-1989917555,1240067142,1979058946,-394854647,-1995803160,1996485190,164817128,-1968968890,-467007418,105286224,1354771280,-1804545,-974593418,1958742789,-330905848,300482563,105286146,1346429994,1342226616,-1996286232,-1072960442,-102169740,105286145,1346429994,-1996305944,-12715450,-955746817,191558,-1962811415,1174663750,-768915206,-1980074249,1183510086,1357130246,-1804545,28893814,922701824,-152567600,141901826,132925127,28240128,1342177720,-1006249752,-1977163170,-532248569,74760202,896918844,652369604,2129792,-2144991372,1977950335,-1946801372,-297387578,-957807753,12630016,-461963440,-1914538241,-397409724,-1073019348,-347721611,-1908998178,-461963520,-387811585,-998047358,1975520006,-1875443943]},{"sector":11,"data":[-498693376,98850443,1347551264,-2097059352,-1073019196,1187448948,-385874452,1589903660,1200301794,-196703974,977767206,736511625,969313270,1601629766,-1980479861,1183578182,-163149338,-1962785651,-125945352,2117666164,1174631926,2122570731,326434808,1342226616,-1804545,1996481142,94562552,-2080881015,1962931838,12630035,-461963440,-1935617,-1981221258,-163149563,-491901,2122561141,-1334444042,738164713,10008822,10532944,183494736,-1962621821,-1846818,-1207923017,-397410144,-998045010,105286148,10487296,1342218424,1174897128,2080636547,-2081018932,1987904510,1342216376,1342218424,-2096450328,-561314620,-1207966767,-1598553970,1944604672,79987466,542346,-1207918586,-1202716520,-397410128,-998045043,-773944572,-1900544029,11581440,172812368,-1979399037,100664902,-1598553936,-1330098176,-2071310336,-467009388,-461963440,-1935617,-974586762,1958742791,2017758470,1191032041,1183548907,-465171486,1996425332,66427632,2122514432,141820144,-1695516929,1027,1592542859,49120095,1562371467,313933,-2081649835,1187448556,-2097151748,2097937534,73319499,637814527,1183319946,140413950,-1979169025,-96040953,678768188,2122520043,360516604,-16490812,-1977220026,-28932089,-2130950401,1948319358,140413925,-1979169025,-96040953,955926154,192216646,201096835,28838516,-16258304,-1611924410,-443826133,298697565,-1060060976,1073742629,-326412861,1175109683,-1274710780]},{"sector":12,"data":[1075957017,1575324488,-1275067710,841075993,-1957313564,72780524,567086772,-443816910,180829,-1259566251,72780342,41034189,-443817481,180829,567086516,-326412861,108432214,1317668638,1854625032,1317545476,-850152448,-1956750047,113401317,-326413056,-1944168618,-1976388391,567084630,1975520152,-1896641779,75402177,-67100487,1595909363,1575324510,1426064578,1465314443,205949470,-1962385723,1451951694,634213636,-796172965,486539448,1595867136,1575324510,1426066114,1465314443,205949470,-1962385723,1451951694,650990852,-796172965,486539448,1595867136,1575324510,1426066114,-326898549,509040136,567095476,-990165368,872154238,139365065,326566460,1622692126,869830144,-203304458,857692581,-1983869185,1183644798,33602558,-1978906998,-22345114,-1817472061,-164366110,918937230,1686765688,-110721020,-1979425656,1720190820,-2142194440,41226235,1686656180,-96025081,-1979337724,1589905478,208571132,1451884977,175540750,12063693,-1273335296,138840580,-1963172156,28380270,-1978771830,332204662,1929380024,-95486456,-4667531,-111244545,-1979425656,1552480350,-75595769,-988842238,2126775414,-1966525444,-506394546,1595909619,1575324510,1426066626,1451945099,369080324,-58715187,1948152321,66879521,397678451,-1341892982,1930677507,117211143,-286587019,-352321096,178189,12060907,-1207702784,-443809793,180829,-2081649835,1465275628,-1927342562,-678701442,-972522099]},{"sector":13,"data":[-1269366779,-14562022,-387447178,-1928915203,-678712194,-16398810,105236006,130515720,-1430192388,-919388240,-1426912335,567087540,75402078,-617350137,-1409283143,41164860,178970507,-502434624,-1430244366,74767115,-1442742387,-947183866,1208239659,-443851169,311901,1458342741,241077079,-16776776,1996426358,74907398,276299600,1979582696,-52055959,-1442545980,-1440757885,505399171,-1190627643,179044363,-1442614080,82049250,-1426906960,-1442271201,-1274361981,-1960719060,-790572863,-754732576,-1413084448,567093940,129821057,78766474,-963975470,-1039474479,-1413467221,1586211755,1996439566,108461836,1342469887,-401573889,1583349189,-1034033781,-1957363700,861361900,21466587,-15960321,1996424822,-397193212,1249246589,185104011,-1272744458,173443894,567132926,12466290,6339328,-1946157128,992731919,-2096663350,1128469446,2126836203,192777476,-67103815,-1070357261,113578,-16091393,1996424822,-397389052,1583349081,-1034033781,-768409590,2105655691,1913648653,-136261369,132842101,-1056708399,50492919,1438844485,113765515,-65380,604259978,10396163,-1034033781,-1957363710,49054700,-1667147946,1718894592,10356470,-1268812798,-2011050704,915144518,1586167964,-1965935864,-1292203241,-11054334,1996424822,-396996092,1968962789,-24947911,-2145553151,1912864638,-1260811241,1121422130,119415245,194566542,637892032,-15251514,-1965935781,-234680489,-11074894,1996424822]},{"sector":14,"data":[-396996092,1583348905,-1034033781,-1957363706,-1957210388,1317735038,-12392444,104460939,661913756,1996445520,108461832,1509909480,92943477,1358955194,142016336,1376155391,-62658479,-1994427047,-1006593010,-1960442274,226328832,242421750,17057527,-1325108224,636015364,-796192769,1930249529,-18429,-443851169,574045,1458342741,209619799,-402239861,-225706280,10225209,1464870772,-16091393,-102233994,1198873086,45745546,-11513600,1996425846,-397323768,1968831449,-1676768974,71731968,2105659955,1930425869,-1241206505,105314288,108265473,-522992941,-755562773,-755514845,638082756,153489441,1606431488,1575324510,1426066114,-1957237621,384304246,-1270807301,1174702394,6076486,-1270479735,-1205744313,41091071,-1956720393,46292453,-326413056,-1274784117,-1205744325,343080959,-628371209,973176704,126487157,-397393620,-1070335268,-1034033781,-1957363710,72780780,-851246920,-167415263,192221377,567097780,-4717197,855829503,1575324608,1426064066,1452010635,-851790844,-18399,-789118350,-1034033781,-1957363710,72780780,567089844,1317788467,139889414,567103156,24363915,1575324488,1426065090,1452010635,-853887996,-1260702943,-1960719025,1208054723,-1034033781,-1957363710,106335212,1183464884,1931595012,-18429,-1034033781,-1957363708,106335212,-851246920,-2146602463,1317660641,-1194773756,567100161,-1962518901,-1040841650,-2147257216,1018461921,275915213,-919349109]},{"sector":15,"data":[567099572,125027211,567099060,-1946157128,79846885,-326413056,567095476,1451973556,1929591814,1124120585,326312397,1317747892,1914817796,-1260877046,857853246,-1207702592,-443809793,311901,-1947432107,-919403434,-851246664,-1962184159,1102316630,41034189,-443826125,180829,-1947432107,1317735006,106334984,1183466164,1931595012,-18427,-443821941,574045,518818645,-989176181,1068762710,-855355765,855798561,-443867200,574045,518818645,-989176181,1085539926,-855355765,855798561,-443867200,574045,-1947432107,1317733462,140413702,-851312456,856322593,-851397431,1942063905,-18429,-1034033781,-1957363706,73305068,1946437375,-851528695,-1157402079,-1014235137,-1034033781,-1957363710,-1101572372,-24379393,1996472371,-1578610674,-1957399810,209125360,-401967361,1198718636,-987826037,1317733974,-1260483836,1914817855,-473396439,-1260418290,1914817856,1958820637,521661413,12115595,1914817879,-1193309426,567105281,-1070398094,1461653739,-1946188824,209125368,-1191256600,1448148991,1476359144,1493135336,-443851169,836189,1458342741,73304919,-768358093,-851312200,-1960545759,872057840,-1194183735,567099906,-896854670,-695742325,12111751,1914817858,-1949922554,-1207571497,-796131329,-443851169,180829,1458342741,140413783,-1958608712,1317733462,1914817798,859878408,1931595209,-18429,-443851169,442973,-1947432107,12059742,-1960719017,-1207602239,-796131329]},{"sector":16,"data":[-1034033781,-1957363710,140413932,-1962652021,28837462,-1205744297,57868288,-1946157128,113401317,-326413056,-1958543176,567084118,57917835,-1946157128,46292453,-326413056,-1958542920,1451951182,1931595014,-18429,-1034033781,-1957363708,1431787244,-1962510709,119407742,-2131938308,1966735740,205958152,-345953248,-853953532,-19887583,-1270807358,-1151882438,76164956,812959546,745849658,-1934965878,-1929934887,-1260876096,1914817863,-2015785405,-1178586377,-1359806465,1166681679,1959213823,1958951431,-1430025725,-678704845,1958951596,1975990788,-851819226,1508056181,1959394895,1341819879,-12219866,-596327622,-210421188,-339725480,-1014329230,181267370,1011184832,1022195232,1021932603,1021670444,1021408380,1021146155,1020884028,1020621886,1020359714,1020097627,1019835485,1019573309,1007055457,67270522,-1430126880,-1871368644,-510999042,-1997812482,1946287488,-1968867580,92808929,-930364282,-544498973,-651437525,-802465717,50546573,1572996033,-443851169,311901,1475119957,-1962467754,-678755202,-4603853,1336865535,2123102091,-1176532218,-1359806465,-1948649663,-202142722,1589808036,1438866783,1448602763,2123040542,871860998,-17984,-146690318,75402201,-1527523445,1600045707,312157,75694339,983041,123994371,1114113,77725955,1179649,123076867,1245185,0,0,16843264,4194816,33423680,16779264,0,66050,-2147454974,130818]},{"sector":17,"data":[131080,33554432,33554689,23593024,150995708,256,33685504,1879179265,-50147328,589826,2,16843264,14680576,133761376,33558272,0,20644153,23200095,2371,1112359497,1127108425,1224756559,1329876290,1329802835,1329791053,1312902477,1329802820,7077965,8519799,1799,6044225,65535,1667845421,1869836146,1461744742,1868852841,1293972343,1397703763,1702380832,1769239907,1092642166,1768714352,1769234787,28271,1397052175,1313818963,1297436229,1129271888,1141506056,1314345545,1330794564,184550467,1213481296,1346653783,54742866,1313213184,1380926017,1330794580,184551747,1263749444,1346653783,37965650,1313213952,1380926017,1196180564,1129271888,1192099847,1313428549,1314344774,1330794564,234882371,1397966163,1464749897,1380992078,82767,1145980421,411468,0,0,0,-1020541813,-1996153181,-1996485594,-1560277466,-1598554102,856051983,1347572434,16777114,190383872,-352094784,-1598320557,-795936241,1409016715,-6683055,-1912602369,378283712,-1993998332,117441062,-6661287,184549631,-1993771840,1459621902,1381172822,-1705983949,65535,-26025,-1073020928,244321908,185125352,-368741184,65535,-850591816,-1873273311,-326412987,-2082959842,401081580,-838416638,-956301056,64582,184960651,712247366,637951684,1946173312,4241441,8435792,-26032,1183383552,1958743036]}],[{"sector":1,"data":[-11526643,1996425334,-26106,1183514624,49120252,1562371467,313933,-2115204267,-956264212,65094,503369912,18528336,431509534,-1924129279,385840774,8435792,33790544,-1073020928,-588709003,-129579264,-2037579775,-2037776522,-1769144462,-1142292620,1923007488,126494463,-9402744,74719292,108342332,-9271553,-1631262741,-2144927886,57999423,-1962895895,-1983738685,1451883078,-2146767876,754938046,1191121780,-94452486,-2012771802,-1728089978,1996496957,-94452506,-2012771802,-1073023418,1191118708,130426618,1958149888,1924595711,-125926401,-1207602176,65797950,1358905272,164506,1958742784,-129579249,1187446784,-352321026,-96010493,653942468,1948270464,1065363188,-972786388,-2144537018,1965880958,-129579259,1183514625,-61436934,-9271671,-9136503,-9265468,4161574,954794868,13678847,532172830,-1202708991,1344143646,-9009523,-2135404522,-6664192,184549631,-385649216,-2037579629,-2037776522,-1769144462,2028732276,-9265468,-2012771802,1023373446,1006924832,-16354004,-335580538,1923007719,1065363199,-1957334016,-1983738685,1451883078,-2146767876,754938046,1191121780,-94452486,-2012771802,-1728089978,1996496957,-94452506,4161574,1191118708,130426618,1958149888,1924595711,178431,-26032,1183514624,-61436934,-9271671,-9136503,-9265468,4161574,2078868340,-28931073,-1017256565,-2081649835,1448553708,-1705983957,704,-1207837021,-1706033148]},{"sector":2,"data":[65535,721735331,-6664000,-1996488449,-1705978810,65535,735463049,1996443840,-25900,1996423168,571606,50174544,-459079680,-696844542,1342180024,199834,48931584,-1193904385,-1706033138,794,-1177127169,-1957625844,-25872,-972881920,2097152829,-905525498,-16777216,1183700598,-1706027304,65535,-1546107253,1183515422,13149152,52299265,-1545451893,513869090,263427,-16556381,62445174,573503232,-1037330171,-930350895,-150991432,-1727716818,-120470997,1346421035,1073946273,-6664128,-1560280833,1996423878,-6663978,-1929379585,1343682630,1347469355,-150993992,-1727716818,-120470997,230213771,573503232,-1037330171,-1054082863,52339024,-56995776,-16777213,1183700598,-11528456,-1711153610,65535,385369741,1354771280,243792,86126327,-775804007,-1194816520,787939341,731448610,737726914,513888449,-1706016765,1104,-1915324673,1343682630,80623359,16777114,52338944,-775804007,-1578071048,731448610,-1946627646,-129593864,1448562710,-150993992,-1727716818,-120470997,230213771,573503232,-1037330171,-1054082863,-1924085973,-1706032828,65535,-1915324673,1343682630,80623359,308378,52338944,-775804007,-1947169800,-788192706,-129593881,-1923657706,-1202651324,787939331,731448610,-1946627646,899272,86126327,-775804007,734079992,1150111943,-1147514878,-16777213,1183700598,-11528456,-1710961098,972,-1697220865,65535]},{"sector":3,"data":[1342182328,410266,1975520000,112645,-1070923029,184554147,-955747136,189958,722594560,12079296,1347590527,327322,48669440,-1202667477,1385791234,-26032,-1834811392,1173507,74825739,65781803,1577058744,1575324511,-326412861,1443163267,16664263,4241408,1751120,129407568,-259325952,-1996298591,1153896004,-1593835504,1149829594,16300042,-1944697719,1153898588,-939524350,-64444,1344194187,361626,1975520000,11856131,-1996431176,1552684612,184862488,38061824,1153957887,-1946157308,-1706025274,1451,58048523,-1207923223,1149829354,408718358,132295,-16628537,71616511,-963903489,-811970530,184549381,-1201048384,1149829348,408718358,-16628537,71616511,80216063,-963969013,261771294,184549382,-1203407680,1149829336,408718358,31078143,-1728052808,-6664110,-1996488449,80153668,1153892355,-939524350,-64444,17974471,340051712,-963969024,-6664162,184549631,-955943744,130630,-26026,1183514624,-443851010,1478411101,-1957345904,-661774612,-951915389,16829446,440320,105814608,1319305216,374786,-26032,614662144,-633929982,1226753,-1102672560,515395606,-694530048,184549382,-385649216,1996423654,1354771206,16777114,-599357184,1354771280,-4698032,12079359,-1365618679,184549382,-385649216,1996423614,1354771420,381568653,131119184,16824400,-26032,-1073020928,-1612119179,105286401,-1878859101]},{"sector":4,"data":[65988622,31078143,1342183608,503490232,2013264,116628048,-1073020928,2011759477,-633929983,1882113,32946256,683167774,278548480,184549383,-385649216,922681690,498598362,649613312,-1202708989,-1706033102,1837,58048523,-16695831,-1207838154,-1202716649,1344144224,1342190264,477850,1975520000,18934019,31078143,1342182584,503498936,3323984,124230224,-1073020928,65602421,-633929983,1161217,78952528,347623454,-2070261760,184549383,-385649216,922681574,616038874,-1866969088,-1202708991,-1706033087,65535,58048523,-1711224343,65535,77596358,-704198912,-956301311,16969734,-2113485056,-1207959551,-1588592576,-523173698,11967056,-1633484800,1975520004,9758979,503376568,19183696,-1070903266,1380974778,1347440720,108461904,-633929904,-1706012671,2063,184882851,-1201048384,1344143588,503391672,-1161811120,1347571712,1347440720,1342600959,31078143,983191632,-1560281080,-1073019702,-524796300,-1202708992,1344143654,817545259,1347441232,-11513776,-11532682,1342298678,-26032,-995950592,1958742786,-26093,-6684672,-956301057,52230,112640,-1962742397,1297948645,1426064074,1996483723,31373316,178256,142776912,1996423168,80656388,178256,143825488,1996423168,48674820,178256,144874064,1996423168,59947012,178256,145922640,1996423168,52344836,178256,146971216,1996423168,86161412,178256]},{"sector":5,"data":[148019792,1996423168,13154308,178256,149068368,1996423168,48543748,178256,150116944,1996423168,48936964,178256,151165520,1996423168,46577668,178256,152214096,1996423168,56539140,178256,153262672,1996423168,1226756,178256,154311248,1996423168,13285380,178256,-26032,-443875328,180829,1167087646,518818645,-326903666,-62470364,1183514624,31105806,16402119,209617664,-954895104,67142,-16091393,244320374,-1980296472,116128326,-401836289,-4653335,-17665,1996443730,161323534,245563392,269912325,-18427,1392508858,242679632,636058,38839040,38934153,-1157627976,1347616767,-1710328065,65535,-1996154205,-1593500650,101385486,58000656,-1593784087,101384784,57999954,-16728855,-1207838154,-1924136938,1343675462,1342185144,419738,1975520000,10479875,503371960,-599356080,-1070903274,1375784122,1347440720,1342203064,1347469355,1343125247,132422224,1183383552,1958743036,-868318389,1148518400,818819,-1410846347,1958743030,105301765,2122514434,527696122,519718539,112720,26843728,-1073020928,1187448180,-16776698,513473142,-16777210,1996487798,-26106,669712384,-1202667477,726663192,1347440832,-26032,1048772608,1946157260,-58817778,-16223232,-6620042,-2097151745,1946221694,-868318452,91553792,-352321096,-2084558078,-443874579,-900899553,1478361098,-1957345904,-661774612,-16061309]},{"sector":6,"data":[-1711087050,65535,-1191557495,1344143568,503378104,19380304,1183666206,-1202710794,-1706033150,2887,209043467,-1191545089,-1202716620,166395905,-1191545089,726663220,-6664000,-1207959297,1344143626,503392440,1354771280,731802,78553856,503384760,19839056,-1070903266,-26032,-291307520,17479682,884494366,-1202708991,1344143632,62410782,1637502976,-1207959541,1344143626,503397048,18135120,1344163870,1342178232,753306,17479680,1119375390,-1202708991,1344143680,385631885,178256,195140176,1183449088,18326268,503384760,21674064,1220038686,-1924129279,1343683654,1342177976,66202,-62486016,-2097080158,-443874579,-884122337,131130,16713085,131076,16713046,131077,16714110,131078,16714133,131079,16714156,196617,65656,196608,16714314,196626,16714362,16973843,197934,16973829,199259,196615,16713616,196650,16713803,196651,16713798,16973868,196637,131087,67070,16973863,327782,16973829,196704,16973854,196663,16973860,329359,16973977,330499,16973979,329337,16973980,330436,327837,67065,16973863,199046,16973875,263051,16973869,198770,16973878,330262,16973865,199445,16973881,199396,16973882,330342,16973866,263039,16973875,262868,16973876,328941,16973997]},{"sector":7,"data":[329195,16973998,330217,16974000,328901,16974003,330383,16973877,329053,327737,16713119,327682,16713151,327683,16713080,16973828,263356,327748,16713041,327685,16714107,327686,16714130,327687,16714153,16973833,328395,16973890,328418,16973892,328867,16973896,262894,16973904,196810,16973912,196683,16973915,262836,16973911,328801,16973905,328717,16973907,262964,131165,16713124,131074,16713156,3,0,0,1167087646,518818645,-326903666,-633929978,-26111,20774912,-2092532224,52798,-4706956,-17665,922701906,-6684198,-1996488449,1451883078,726684412,-1706012480,65535,-231681,-6620554,-16776961,-6683018,721420543,-6664000,-352321281,6809603,-1962742397,1297948645,503317194,1430622296,-1910575989,384599000,-1928694017,1343679046,1342182584,16777114,48406784,1946830393,-364475096,-659009514,-1706025472,791,360038411,-1207273729,726664196,1347440832,16777114,-339727616,112643,-1962742397,1297948645,1426065098,922741899,1622672098,-1202708989,1344144072,1343238584,151706,81152,-1070921355,-6664112,-1962934017,516120037,1430622296,-1910575989,1894548440,-1987033459,1452078662,172395512,1946961419,-1960842437,-986974650,1023438853,461176931,-16097596,-1977218490,-161561593]},{"sector":8,"data":[653674239,1589905288,1065362954,-992447232,-970525090,1183645703,-1706027376,544,284444359,239504128,1946163261,1850680,490563700,-950111232,3208262,31078143,-126419120,-1946781953,-986974650,-134220755,-6663976,-1962934017,1452013126,-96040456,-335784311,44480521,-1929754999,1589967966,1065363194,-1960283136,-986974650,1023438853,461176931,653936383,1589905290,-163119114,-351827930,52869337,-155660565,-993400063,-970525090,1183514631,138808070,-1014282636,1183433356,-61437446,1183522795,96807926,1664942192,-1004831488,1191118430,126494214,-631100,-2010712506,106873863,4161574,1589958773,130426614,-59310336,-1694861569,65535,12992131,721712128,-2096174144,1946161278,273058565,-492764181,1183666178,-1202710896,1344144564,-2131474805,-1706028852,65535,1962934589,112645,-1070923029,-1962742397,1297948645,503319754,1430622296,-1910575989,621078744,1342479523,-1559855896,-1511521076,77374244,-472786805,36091903,-2096731928,-443874579,-884122337,1167087646,518818645,-326903666,1187468900,-1879047940,79489038,-397361109,-6678390,989855999,1963123206,-401698811,2122394437,1963196678,18934019,-1996174175,244379718,-1577087768,1178141900,-15633168,721753654,-1202696000,-1706033151,65535,379602573,85893456,798642206,-1879048189,308471822,379602573,85893456,1134186526,184549379,-955943744,130118,379602573,31504464,-6664162]},{"sector":9,"data":[-1879047937,293791758,379602573,31504464,-6664162,184549631,-955943744,130118,-1985984883,1452055622,-1671510882,-1952692481,-788227018,646220518,641795074,1586169736,-1673068644,973588006,-1996153183,300675654,-6529340,1988860998,-230227982,-2010774390,-228685049,1962950528,-1605988889,1996443670,-1669922914,16777114,-1898411264,1065363138,-1005947812,1191156830,130426524,-1671510948,647775999,-1960179770,1191156830,130426524,-1671525586,647775999,-1960179770,-970548130,1183645703,-1873799520,598599694,-1878173720,188737550,132648592,-1375287538,-16777216,-1929190858,1343681606,16777114,-126419200,-1862633729,136636430,46413567,1347469355,1342177720,279450,-58817792,-2130217728,67176062,922685813,-1070922550,28856400,-191213568,-2130706430,67110526,113706613,188,1312455,-1147535360,989855746,1963123206,112649,-401698736,244328753,1577278440,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,108432214,993904267,-385649408,58589321,755114985,138215474,-385649152,-1073544595,-1476448621,384304816,39840252,503469240,85893456,60444702,1442840579,323226,38267136,6831747,737181185,280514752,-1070903296,1347440720,250089104,36432380,-26026,1183383552,1975520250,35383555,-26032,-1073020928,922686068,12059362,-1070903292,-1706012592,1364,-1694861569,65535,-2097023767,31806,-353827980,-26111]},{"sector":10,"data":[-488046592,1488897,1354771280,16777114,-603535616,-16777215,28838006,-1070903292,-1706012592,65535,-956187415,16899078,142016256,370586,-62486272,4372560,1354771280,361626,-59310336,1342194104,-1705983957,1428,-1191414017,-1202716611,-1706033144,1463,909749739,57999390,-16681751,765069430,-1996488698,-11469754,721428022,-929410880,-1996488699,-16769482,-1202258826,-1706033144,1597,-397361109,244323698,724056296,12624832,-16463709,-1207778250,-397410303,922688444,-1070923068,28856400,-2003152896,-1207959546,-1873805311,664528910,25312899,-385649408,922681609,-1070922552,346482768,956366057,1962983990,15984899,1206390416,142016257,16777114,-62486272,-1036583088,1354771200,413338,-1036613376,-59310336,571478,-26032,244318208,-1878467352,195356686,-397361109,922686690,922682052,-1070923656,112720,-26032,244318208,-14183192,721601590,-1202696000,-1706033151,1061,1342177720,182980240,-939079897,-2097151996,98878,-1070921868,367546448,-401698796,1743454496,80151751,80151788,79168720,80151730,1111295175,-385649408,528481789,1962949949,-24647421,2080390717,4144446,-1175911553,4275710,1290339189,1026354174,394199113,2080393277,-36706045,2080392253,4668698,384369535,1024519167,57999434,1040040425,58001360,1593684201,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112]},{"sector":11,"data":[425603,244319605,-14232344,-1711094730,65535,1358710409,-14868760,-16595914,-6620042,-2097151745,1946158718,1354771208,988286608,49120038,1562371467,182861,1167087646,518818645,-326903666,306086662,796131328,-1727953759,-120470997,-1577433463,731448096,-1980182078,922745926,1183646434,-1706027270,65535,-362753,-6620042,-16776961,-1711041994,2021,1342177720,515226,49120000,1562371467,1478413133,-1957345904,-661774612,-1705983957,65535,48641791,16777114,49120000,1562371467,1478413133,-1957345904,-661774612,17464963,1048785012,1946157240,-1140406510,-956301056,47110,335988480,-1962934016,-2069690810,138840833,-16572253,-1873803658,67954702,113713899,65720,12861059,-16157696,-1711225802,65535,-397361109,113709814,196,-1962742397,1297948645,-1946155318,1430622424,-1910575989,49054680,-1957341354,1988824190,-1950338294,-1175942184,-422510560,-392833071,-1818951574,-1828690456,-287178732,1432210827,-1962508604,403749353,3664018,1960083,1697941,-1070350285,2116771242,-947171578,-310157729,535137026,147475805,-729133056,1509949928,-355405174,-355407152,48818896,-2133423616,41160674,-838991695,-897528542,-2133775824,57942266,-1012219254,-2044215278,666899140,1438893190,1452010635,-854674428,-1947981279,46292453,-1864856576,-326412987,-2585058,1996426870,242679564,-1710459137,65535,106349854,567089844]},{"sector":12,"data":[-989180277,1320422486,41034189,1344258099,-15829249,1996426358,209125134,16777114,-310159360,535137026,181030237,-1864856576,-326412987,517508638,-1274652987,-1272853222,1914817871,532689666,-1962742397,1297948645,1426064586,1465314443,72795422,567089844,-1274521915,-1742615279,-1956749537,146955749,-1864856576,-326412987,1457032734,2126782039,1183579144,1975519750,-853953530,-1967063519,-1436766000,-141877498,567101364,1996428146,142016266,-16091393,1301940342,855638025,1583292352,-1962742397,1297948645,1426065098,-987829109,1589905494,1258338308,-1960894003,146955749,-326413056,1443949699,1183516247,-1073337590,922196224,1183384314,-1983892496,-1897267642,505318144,-1947994365,1124124702,-1023153199,-1946532215,512487494,-470351120,-1996486651,1183579206,-98661392,65271554,100924998,-523173696,77465091,76279947,-150989125,-1898411037,28837446,662709760,1073837072,-2081143159,1586039235,-129594122,1460075403,16777114,-230258432,-15960321,1996487798,-126418950,-624897,-6622602,-16776961,1325399110,-2001420,1325399622,-1961724920,104595014,57869050,-39191,1491726406,1583286271,-1034033781,-1957363702,183272428,2007302,1962950205,73319446,-1727558874,49290891,512488439,-470351110,-997191189,-1960442786,-397409721,-1073013627,55050612,-1996439546,513932870,4078848,1589911157,1200301572,120268292,49290891,-1723284733,-1958677513,-150799842,-1877873693]},{"sector":13,"data":[637820612,637945739,1342326571,1075594472,25304715,1929272875,2126723928,-1983673598,-1072956346,-996062348,1958742784,-129595068,1183432755,112886,1342994175,16777114,507413248,360005120,-15960321,1996488310,-126418948,-386500865,367787643,209125264,-100609,1996487798,-159973384,16777114,-443873536,705117,1167087646,518818645,-326903666,142016274,385238669,67738192,95944704,-6664192,1375731967,-26032,1183383552,-6663952,-956301057,62022,16008903,142016256,384976525,128227920,1996423168,-227082490,-1695254785,65535,-16353537,630911094,-1996488692,1996484166,-163148538,1996443670,-25872,1996423168,-294191354,16777114,-260636928,16777114,49120000,1562371467,313933,1167087646,518818645,-327034738,1448542336,-150680415,-1325063634,98620163,1183383560,52339074,734147481,178626,-1036781357,1183433259,138841084,2105689657,80519441,-1962601821,1183416902,56533498,1183532011,535816,572427161,-754732795,-1946421277,33457136,28837245,-1962743040,85107654,86126327,-523041871,-1996486651,-861799866,302383876,-1952888827,-150662642,1580136441,-62521085,503439544,221813328,1183383552,787955960,514000162,-128021758,31492038,-1807315712,513888278,-1706025467,1219,77610624,-2094042112,121918,512436341,2139096350,259260417,378816141,2144336,781864990,-1929379827,1343657030,503619768,-26032]},{"sector":14,"data":[1183645696,-1706027372,2693,86126327,35522051,-1551874423,1183515168,-2142895230,989857797,746391622,-1727848799,-1037319629,-754974023,734147576,-1580692542,103482206,731448094,66638274,-2042197567,-1980086645,233538630,1090274955,-2042197696,142886599,-2008627456,1183514632,-2008643320,59131531,-1996284410,-157185466,-96061182,-123664267,-62506750,922702708,-222821662,-1202708990,-1706033151,3670,-1727848799,-1037319629,-754974023,734147576,-190625598,-234436862,-1962932222,-157025722,-62485758,-16582493,-1207626186,-11534328,-16583626,1996487286,1354771452,952986,-1975088384,-1996487675,1183551046,-1840871162,-150854495,-1941534248,50873995,-1996348410,1319211078,-1840905982,956503713,276137030,956504737,141920326,956504225,1182041670,48379647,503518904,112720,246717008,381616128,-2072605437,371066654,-1515870945,922689445,922682570,922682134,446759704,369502979,480333827,403057411,-1070903293,249862736,-1969160192,-1908000511,-1902047115,-1840891647,-1935603595,-1874446079,922700148,-2001206558,-1202708991,-1706033151,1527,-1929279297,119442550,-1524689378,530949541,46413567,-7571713,1183551094,-1941558384,-1840870576,1351501355,-1705983957,65535,80230143,1579107816,49120095,1562371467,313933,-1275051,-1711094730,65535,-1710983425,1856,-1034033781,-1957363710,108462060,-1710983425,1875,46413567,16777114,1575324416]},{"sector":15,"data":[-1946155838,1430622424,-1910575989,451707864,-1593419946,1183383746,12886522,192200715,-1946401143,184669726,-352094757,-1960931234,-1947479557,1443621875,-59310249,-386238721,-2092040107,-277020418,-544522773,872177294,-1928915210,196732030,514191872,-1946209529,1489347,-259268105,-1510807087,521599115,-1176209779,-1510866933,-1070335093,1996445520,-92864516,1325404392,119521397,-310157729,535137026,1439386973,-326898549,106386968,106860062,-1156954485,-470351850,118943883,-1175945587,-1510866933,-787855733,1183400160,140413950,1450427195,1958951755,1489689,-670833673,1394495518,-402360577,3997791,-16548608,118947398,-1947697523,381419078,115603200,-11526569,1088947318,15616,1183521917,1489162,-125050377,1183516446,172395006,-259268105,-1510807087,119446251,1988960022,172395496,-150989127,-789017631,530969321,-1956749561,146955749,-326413056,503732054,-1005947195,344589918,638640768,1947207670,112649,292934154,-4707349,1976699647,71732004,1962951741,164004639,839500675,975613156,1124562183,-176832502,28313579,-5242249,8448408,1962952253,112668,638012555,1913081659,-1962314260,992347468,-512621233,-335544392,4537820,28843381,55347968,55524134,-394933390,637619339,1912688443,870152128,-2084901952,-829748794,1017963570,168064046,-1946716736,-2081190954,-24442426,775728166,-1073085324,-561252747,648868491,208996154,1975519811]},{"sector":16,"data":[-1947104267,-9704993,-1744360922,1583286047,-1034033781,-1957363702,183272428,12861059,-950111232,65094,12850827,1183432747,-128546314,-1577433463,1178141142,-1958248966,1452013126,591352,1183535186,591350,-610643886,-1962934263,1452013126,-163150856,591126,-694529966,-1996488692,1183579206,-62506498,1183516286,-28931588,-335919361,-28915786,1183514625,573503486,-1194816763,787939333,731448610,66638274,-267482680,-1715369214,-1037319629,-754973767,734147576,-754732606,49325024,-150991688,-1559944658,163054316,573503232,56402693,-1017256565,1167087646,518818645,-326903666,-950642934,98822,-1073297664,-956301312,313350,-599883008,829685761,1342193848,1342210232,16777114,-62486272,494190603,503369912,16824400,683167774,-1957683712,1344207942,1342210232,16777114,-1002536192,1299447808,12850827,1183432747,-128546314,938210859,653680324,1963984886,-1933341926,591298,-1598533550,-11526652,244382838,184571880,-1089506112,495649154,-472840705,77479563,1183003017,960894710,2130826806,-599882813,242483201,16547459,1996425332,85760764,1048772608,1946157442,1354771207,133097552,46413567,1342177720,1578028008,49120095,1562371467,1478413133,-1957345904,-661774612,-2096436093,121918,-1310129291,108954368,-955222784,2623046,2122320363,276049654,-1005828353,-1977217954,-163149817,-361381878,638344900,1962950528,19130627,-1962129665]},{"sector":17,"data":[1183385158,-128021512,1962950528,17819907,1191117803,-128021512,1948270464,4161781,1183572852,240552716,-1980086647,485227606,720782986,1372138468,21797456,1589903360,121120506,1191121525,-129564678,-1963434357,-163149817,-663412676,-1963434357,-163149817,74719292,158711818,-385875528,1191116979,-128021512,1033373578,-227082208,1589938155,1065362952,-991857664,-1977218978,-163149817,1987362826,2768280,775765108,1029338112,276037695,638344900,1937049400,-15972609,-739571642,-1006090497,-1977217954,-163149817,1534377994,-1082905028,-351516929,-159481670,-15698898,1589906502,126494220,183912072,-991267392,-1977218978,-163149817,-1753956342,-1821102532,-351779073,207537386,775913510,-2144949644,393543743,1589945835,1065362956,-1005816576,-2144991138,57999423,738150889,49120192,1562371467,707149,-2081649835,-1667148052,-62486268,-1560000885,-661977956,-1207966767,-2098724314,-1438216716,-1070903274,-401698736,-1072958181,1183520116,77374460,-472786805,36091903,737435880,-15340608,-1207770570,726664192,1347440832,332954,112640,-1034033781,1478361092,-1957345904,-661774612,10415233,31506006,77340299,-2020940847,1090781734,-968489848,-968476156,1187381252,1187446678,1187383452,1183645853,-1202710882,1344143428,1416090,-1773761280,-2037559274,1343684452,200571112,-1923779136,-1979746682,1452066886,-1928401974,-1929417594,-934921263,1325337715,-933313336,541032486]}],[{"sector":1,"data":[1589963124,1065363144,-16550880,-2037528506,1183448940,-61436678,-1949809013,1178192470,-1005685766,1191180894,126494458,-347732856,313063,49120094,1562371467,1478413133,-1957345904,-661774612,-1923945341,1343663686,-1873756117,-199628786,74760203,317440043,503652001,-1371108016,-124104682,-1207959540,-310181887,535137026,1439386973,-326898549,138840864,1946288189,33635668,37555060,-385649406,803799238,-499712254,-26110,1048772608,1946158258,35449091,956440737,58459206,-16641559,1183517302,503720708,417878018,30974723,58189904,6555335,1996423169,-26102,-337051648,1681818369,57999360,-2097028631,307774,-672595084,75399937,-1588888576,1178141216,-2092729084,2080376446,52339005,2131117625,71732021,35522091,46524496,-1577564535,1178141144,-385649160,-12779102,-16288513,-397407626,1996423953,-129594614,1342298275,-385678104,1048772998,1962869208,175570698,30947071,-956108568,-16656378,23915007,6569603,-385649408,113705314,100,16777114,-666991872,58064641,-16691735,922684022,-1092091432,108954370,-1593082624,1178141470,-385647098,1421345074,-1588584958,1344144670,1374618,-196688128,1048773205,1946157528,30974254,-1946532215,1065415774,-350194688,-528580599,-15764480,1586230342,-2012771596,1547493446,1325394805,-92371974,-1955171072,130479198,388995584,1183383552,-27883012,16777114,-163149568,78776007,-6684671]},{"sector":2,"data":[721420543,1444674630,-1949791234,-628361658,2128231321,10610947,-935655556,-1729559694,-498692864,-1070903274,-1202696112,-1706033151,6056,-965427189,65306241,-1926794238,1343676998,16777114,-498692864,-6664170,-352321281,-195130455,1962950528,-11015933,-369867009,1183711057,726669026,45633728,-1202696190,-1706033151,65535,-428556277,78776007,244318208,737129960,1421365440,726670850,-1706012480,65535,309641227,48379647,1342439608,1347469355,346921552,244318208,-336599064,-1308178673,-1207959548,-1706033097,1225,-1034033781,-1957363704,1793885164,-1136753834,175374336,1326723,-385649408,1996423408,74907398,16777114,1958742784,14608643,-1207404801,-1706033144,3015,-6664110,-16776961,28838006,1838829568,-1929379829,1183422022,-61436678,-520206649,-1005458687,1191180894,-25785350,-1963047169,126363140,-2130813301,-411762625,-368956,-970524090,513875975,-28931835,1589907947,-96010246,-100725,76217926,-1962440666,1065418334,-2132314880,303166,1048787828,1962934748,505318196,25133061,-1005947904,1191180894,130426618,-28915876,300614816,-368956,1988885062,-28901378,-2010774390,-27358457,1962950528,-94452505,509478,721975039,-928952128,731463680,1358483906,378947213,-1916564656,-1054108082,178231888,-1956773888,146955749,-326413056,-1593381757,1178141986,721714436,-951129152,130630,1074077345,-1946401143,1065417822]},{"sector":3,"data":[-349867008,1952201735,-62456049,-1963172213,-96040953,-311050230,737953419,-150659578,990192174,92144710,-335657333,-60912880,1946173312,-62456061,-335657217,1575324606,1426064066,-326898549,75399956,-1593281280,1183384866,-1587090434,-1992293090,1183576134,-230258428,2122328555,259260652,-1947187457,126546014,1022117512,-1346212,2122576462,326369522,-2131730805,57933887,-1947187457,1065414750,-1948748544,103542854,787940638,1183384866,-226589698,-1206750208,1344144544,1152922,787955712,1174471970,-28931074,35522051,-1913370999,1343682118,35534591,-11485141,922743926,-6683874,-16776961,-404224394,-297367052,-163148464,-6664170,-16776961,1996424822,-185931538,-1034033781,1478361092,-1957345904,-661774612,-1960645501,255659078,1026454528,477364244,1912733757,33766734,1996441975,1996443662,108461832,737888488,1273731520,-15829249,244320886,-336513560,242679790,383665805,-26032,1996423168,-562626802,383927949,-43063216,-1928431873,1343675974,16777114,-3872000,1996426870,175570700,-16222465,-6683018,-2097151745,-443874579,-900899553,-1957363702,108462060,-1962840088,-1073019834,1996424820,5105670,-1034033781,-1957363708,-1962518548,-1962907634,512314329,-472842136,1715374931,-1948318976,71731991,-1343092962,-1031057585,45832363,1714880256,-1705816064,65535,-16750941,149423222,-1956706560,46292453,-326413056,-1003028650,-204412926,-11472757]},{"sector":4,"data":[1676149878,-1003028736,-639085054,-443851021,180829,-2081649835,1465255148,-486257013,-1003028693,-207296510,-1946270071,-486512626,-1946580207,-1392482762,1358853887,1325410792,922744181,1996423876,-207951618,6819467,-1070395677,-16750429,-1711249866,4798,-443851169,180829,-2081649835,106369772,-956021109,588870,1982083,-1724877506,49946251,1183446007,-162100744,-1728003935,1586230263,-1579668488,-470351120,-1946401279,512489030,378209008,-634714846,730863595,1912651782,-1194816695,653721643,33883426,-1948742912,505870273,-28931837,-2080612861,1586037443,-1928915206,1183575678,142844,-28931157,-96040021,-28931157,52299267,-293696085,101086975,438278743,1594294272,-1034033781,-1957363708,6857196,259375115,-1157627208,1347616832,1192346,1074916096,45867217,1714880256,-1705816064,6924,393527307,-1962907997,-788502498,-1948777501,126420038,6817535,-1962907487,46292453,-1864856576,-326412987,1473809950,1745783558,119423232,6700683,-234469749,130124719,49120095,1562371467,182861,-2081649835,1448547052,-16353537,496632950,184549400,721777856,19327424,-1207404801,-1706033144,7395,932859986,-16777192,95946870,815419392,1375731736,-26032,1996423168,112648,407083600,1996423168,-26104,1183383552,922702078,127533766,721420300,12052982,-1461059797,-230257920,104580867,58459340,-1593793559,-285801634,1183400000]},{"sector":5,"data":[86155764,61992951,1077993683,-1191819639,787939331,731448610,-1980182078,1996484166,-163183864,-193527984,-150991432,-1727716818,-120470997,1357792811,1073946273,-25755824,1347469355,13239865,548931700,13416960,1723336427,10074624,-6664110,-1962934017,-553389474,-2020940847,1090781734,-506232,1996425334,13148662,-775804007,-196738056,1183666240,-1202710792,-1706033151,6402,306067783,-385647099,-1589182641,-285801198,1005733513,2097466374,-13047549,-1694599425,65535,-16222465,-402351050,1599995912,-1034033781,-1957363704,216826860,-1727773045,85069451,788003319,1077936990,-1946925431,-140966842,-138245127,-1325063634,1088475907,-163149504,385369741,-163148976,1342178349,1223968395,230182984,573503232,-1037330171,1174665425,263670,-196703408,52299267,1342178053,1706906,108461824,385369741,472554064,-443875328,311901,-2081649835,1183516396,33570056,20791412,1023964162,578028034,-956264983,16807430,-499712256,365861378,1996423168,369531402,-1667170304,80782084,1048779755,1946157174,1980155751,-1711276032,5789,1048774635,1946157174,74907475,-402229505,1183383760,-28931588,108904459,-1996186463,-794690490,-62506748,1996424820,3336444,16678531,2122393212,1963065864,-401698785,1996482678,-801702134,-178722812,125157387,77346559,-1879045144,-390404082,-1034033781,-1957363704,49054700,85341951,-1980770840,-11469242,-402337738]},{"sector":6,"data":[1996488388,71732222,1342492835,-83992,-16443850,-840368522,1575324655,503317186,1430622296,-1910575989,116163544,33310407,108461824,-1862290456,-402331634,85341951,80754431,200599016,-15960640,-402351050,1187512216,-1879047940,-398268402,-2080618869,-443874579,-900899553,-1957363710,49054700,85107030,86126327,-523041871,2114340411,108954428,-2093581312,2080375934,71732016,1578011545,-134613245,-1962601938,105286600,572427161,-1309570299,-136064253,-1980759045,-861798794,2112895748,-339309820,-18429,1575324510,503317698,1430622296,-1910575989,585925592,1024214667,812908559,20797559,-1587383040,-794622820,-1715459324,1996450795,209125134,-16222465,1072170614,-1381378,1996426870,-401698806,-571741330,-1928431873,1343675974,1736346,242679552,-1914800385,1343676998,-240152,1183649398,-1706027298,6809,339588075,1036284928,91357696,1979843133,242679721,-15960321,1996425846,108461832,1748890,49120000,1562371467,707149,-2081649835,1448554220,1024083595,141820417,1946288957,15919455,48379647,2003610,74907392,-402229505,1183384232,-49666,-706149505,80257792,224716880,-1862371585,-72751090,443924491,67651318,28837749,1541951488,-25755654,1342177720,-369505304,1190527144,58000392,-16736279,-706150794,9890297,-16484609,1441269366,-28931838,2147483453,8579331,1342177720,-384536,28900982,-1847046144,-330920455]},{"sector":7,"data":[-1070903274,33732688,28856400,1620725760,184549399,-2082048832,50238,378228852,-1070923580,-1982708087,381211734,-27358464,915137489,687277214,-1949153791,1452003910,-696349228,118943883,-1176859106,-1510866933,-700019425,280514582,-6664192,184549631,-1207599680,48955393,-397361109,1599999242,-1034033781,-1957363702,384599020,1048794711,1946157178,27715843,7997127,1996423169,112646,1354771280,507413328,91569664,-352321096,1354771202,2225562,108461824,1347469355,507413328,91569920,-352321096,1354771202,2266778,2013710080,-256,1183647350,-1706027276,9229,385107597,602511952,-1073020928,113708916,66298,1836743,803799041,-96040191,38667819,504269721,-1543899389,20775674,-1207730432,-89980927,507413250,57949696,-1962899991,-1952843706,-150802418,1876985,2097152317,470206214,-1593835264,787939356,104530682,914162050,50430625,1208154630,-99710055,737801986,-1996481530,1996483142,1354771206,-361300144,586783312,1048772608,1979646072,2013710094,-385875968,1187512149,-1593835286,1183383744,-364475410,49950455,-1063128949,244029696,-101252358,-125048329,1031732795,1005307531,1836743,-2103377919,-100255487,734493954,-1996293626,1996483142,112646,1354771280,1357543167,16777114,2017362688,-1418330368,7866055,-219611135,-1547203586,1178140864,-15633170,721601590,-1202696000,-1706033151,3524,7880323,-2094432513]},{"sector":8,"data":[1040195134,-1063187339,244029696,-101252358,-1063189525,-330921728,-16353537,1342208054,-1710983425,1650,7997127,1599995904,-1034033781,-1957363708,49054700,1982083,-1590266562,787940126,1178272506,-1960477180,-1952905658,-150802418,-97585159,-1949791486,-1952906170,-150790626,63439867,-1996439538,384564814,-335544392,71731996,504269721,66713347,-1996439546,-2103312826,-28952319,1183572605,1575324670,1426064578,-326898549,-1136753906,2037710848,11419267,-385649664,1996423297,74907398,1883034,1975520000,175570754,1342179512,1888410,-1706012160,7383,-1928562945,1343682630,769690,175570688,385369741,108461904,-402360577,1536878252,989855748,1963123206,175570694,-2097137944,47678,1048783220,1946157524,209125154,993690,-737753344,-352321535,-499712238,67155970,1354771280,-560312240,-1962934249,180510181,-326413056,-1593512829,1183383654,-62470146,317390848,-1962641665,1183055454,939459326,-586264,1755446342,-62506752,-443816324,180829,-2081649835,-2091510548,-16746434,-1696005259,142016257,385238669,570989136,614531072,-163184382,1982083,690582846,-90047930,-230258430,737822347,-1952844218,-150802418,-97585159,-196703998,695582731,-1996293471,569111622,688017057,1187511366,-1962933774,-1952842682,-150790642,-196703751,91602955,32786119,12624128,-940554615,65094,184960651,1024881856,796131329,1946157629,212271]},{"sector":9,"data":[71118708,-349211648,-230257912,1183439095,-28931074,12584449,12598915,-953123584,49158,-1955599616,-487853498,-336312693,-196703269,1048828139,1966997534,71731981,49950455,12584491,1183565035,-2081035516,30782,-2103367819,-100269311,-1952888830,-150799858,736753657,1183446086,12624366,2112767545,-297366751,-352272221,2017362713,309657856,25310859,49952299,12596793,914949246,-1063190336,-263836928,201213577,-2089978688,16807998,1996431989,112648,-1070137520,312102912,-16777178,-1070921610,-28931248,787994871,820708126,721975039,-1063169856,244029696,-101252358,112720,592747088,1996423168,-28931320,-99710055,-134613246,-265357352,-1070903294,1354771280,-1706012592,65535,-1710721281,65535,80230143,1577577960,-1034033781,1478361094,-1957345904,-661774612,1461906563,242649942,-1962115445,998855,58087284,1023444457,141819905,1946158397,9562420,112726,1354771280,-1818603440,1442840614,1347469355,-644198320,721420321,-2132174400,-11053568,1996425846,108461832,-335943192,-1070901526,-84744112,-11083285,244320886,-337319448,1183667926,-1706027298,8261,-562626730,-1914669313,1343676998,1459417320,383665805,543201872,-1343553536,175570774,-402229505,-1544815190,1946162237,18103741,356323186,1038448129,91357696,1979843389,-11053424,1996425846,108461832,2131354,-2090902016,-443874579,-900899553,-1957363702,82609132]},{"sector":10,"data":[-1980353706,-396951946,1072226753,1975925504,112678,-6662576,184549631,991458496,1963236406,-28931322,-1946401143,1191181918,-1981558274,1174546103,80492091,1183565948,80520190,1593591435,-1017256565,567089588,1438901290,1183575179,505318148,1220739843,-1946945639,46292453,-1864856576,-326412987,-2082959842,1465265900,-1983892730,-996017082,1958742784,1150963718,-1207959544,-1096613868,1489664,1086055415,1347572480,16777114,12886784,58048523,-1207918359,45809704,-1640562944,-1705816060,7260,58048523,-1560246039,817562782,-1912655104,1996476534,108461832,-1873406381,-519968754,-1962898967,104594502,661848254,507808310,326381116,12846734,-2095114722,381228486,-5967360,-1927283642,1444335734,552078992,-1587942431,335872190,1489664,-1147542537,922681346,1347551428,-26029,-1073020928,-995943052,12493056,-788524027,179168,77477631,-392539312,184549415,-1156418112,-1070399459,1347441488,244338768,-338137880,77505295,12453507,-8918764,-109789173,-1543747957,-996081194,1958742784,30843162,-1157579101,-470351850,-2411623,1375781942,1452954448,-1593835480,-1073020458,-784334475,-2411552,1342479926,678664787,1594294272,49120094,1562371467,313933,1167087646,518818645,-326903666,-2091493508,5182,12061044,244338692,-1193699864,-1706033135,10531,92127243,-352321096,-1983894782,280557638,664424448,184549420,-1207599680,48955393]},{"sector":11,"data":[1183432747,80257498,-1948760439,3999814,1024160769,57999617,-385731607,1183515305,2112774,-840367243,-385649151,138215934,-385649408,222101802,-385649408,-2031549995,-1003028734,178178,1354771280,-369418776,922681973,62390980,-1947342080,624756294,1031500800,259260454,1962944317,8710403,1946167357,-2096370855,313406,251593844,-928971576,-666486524,988349301,1776832514,-935919869,74246148,14319235,-1394015371,-663290112,-1461186928,1975520242,8644867,80230143,-1729622384,1958743026,34072835,80230143,1342177720,-370097176,-928972295,104546308,-1434648190,80217855,1048814827,1966997534,49979805,80217657,103388284,-1897200440,1982083,-1584958146,100861128,104530682,175964546,16972449,-385562618,-928907408,244029700,-101252358,-1056708105,25298491,1508443004,25338367,80257864,-45079,-1878734794,-233445362,58048523,-16677655,-402339786,2062151776,-125926655,-385649664,28836209,-1209511936,-10425872,-1987557747,1452049478,85893510,-335919479,-2074164207,-1954265345,1191180918,637831930,1586169736,4161786,1589962613,130426500,-1928467712,-779319226,1988380217,-2075197684,646209220,1968979840,-2008642070,1312412044,956855686,58033222,-997964033,-970554274,244318215,735869416,1183666368,726668936,-1706012480,6088,309641227,48379647,1342439608,1347469355,610245200,244318208,-371414040,1048772817,1962934658,13101315]},{"sector":12,"data":[80230143,1223167632,1975520241,-21960445,-2080427799,34878,-1427569804,-2012821760,-1962934016,-2036082106,10217728,1962942781,-32642813,1962943037,-32052989,1929389373,8644867,1996499005,-32511741,2122545643,1937050886,8928899,-949193728,34822,-2109832448,1601437697,80230143,-521662832,1975520240,-935919861,112644,-284235696,12861059,-1958710272,721470486,-196703808,-1191815543,512426006,-472841016,77477515,1174481143,-196703244,-1913235829,-259268994,-1910634730,768474,-1927305742,1343675974,8795903,1577234920,49120095,1562371467,313933,1167087646,518818645,-326903666,1048794640,1946157076,67155977,-401698736,297326202,-1952821248,184549409,-1207599680,48955393,1183432747,80257532,-1963964791,-467007930,1347537195,1272474,-1981535744,2122516038,1098121468,2097152317,12314883,2113935933,11790595,-955887873,63046,956615841,58521158,-1962893079,-472779170,956712587,1963075207,-159973621,-1092088176,8907250,-336181505,-1002535977,2121531392,12850827,1183432747,-94991880,-336181623,-939065542,-939116284,-955878140,313350,1488896,80223883,915137489,687277214,-1946663421,1183447638,-195655182,-1963827516,942016070,192153927,-1577695489,1178141058,-1581351690,1178141896,-1205832464,-397410303,922742338,568853704,-935919872,19195908,80230143,1342177720,-1192385560,-2090991615,-443874579,-900899553,-1957363710,49054700]},{"sector":13,"data":[956350625,276563014,-150987615,50526766,989904902,1367278662,1982083,-1591446210,1178140864,-1962115836,-1952906170,-150799858,-1960449031,-1952906170,-150799858,470166521,-1592464640,1178140864,-1962574588,149619782,721700491,1073936902,-113015,-1207778250,-11534332,65601142,1575324663,503317186,1430622296,-1910575989,82609112,25312899,-950963200,16824838,507413248,209010176,721612961,84222470,183173124,-150983752,84222510,1183383557,-1003028484,112642,-59310256,-26032,922681344,1139279048,105286400,184669347,-16157248,-1711094730,9285,-1962742397,1297948645,503317194,1430622296,-1910575989,-1170308136,192151552,12191431,-6684672,-2097151745,-443874579,-884122337,-2081649835,1048773868,1946157242,-2109832351,1517551617,117196487,507413248,896876032,956350625,175965254,-150802271,-62486056,1183520235,-1073337596,244029696,-101252358,49295095,-1946401279,-1962739186,-140966842,-339571719,71731975,12584491,506394432,1183401987,-59310082,-26032,-443875328,180829,-2081649835,1589905132,133572102,-1875217392,-659232754,-1588543445,1344144670,-1962522997,151324758,-1706012160,11012,309641227,48379647,1342439608,1347469355,723163728,244318208,-338108440,105286508,84432523,1183383561,-27883012,2122320363,276049658,-990099713,-1977156514,-96040953,-361381878,654073540,1962950528,1354771229,1342184376,1347469355,-1962522997]},{"sector":14,"data":[151324758,-1873784320,-776214514,1183522795,139889414,1375734021,75400016,-1207602176,65732610,1342366369,2095582864,1575324418,503318210,1430622296,-1910575989,149717976,-1962522997,1183385686,-61437446,1234849874,-352321492,105316099,637951684,1962950528,-2146112524,1949235326,-96040165,972838539,276170310,-1006219521,-1977219490,-129595385,-545956804,-16359740,-2144991674,1316302399,108461830,503351992,803117648,-1073020928,1996439668,108461832,503353016,804428368,-1073020928,1996434548,108461832,503354040,805739088,-1073020928,1996429428,108461832,503355064,10525264,-1073020928,-1070922636,28836843,49120000,1562371467,313933,-2081649835,1465266924,1187445790,1992622286,75416584,792505004,1547437172,1191052149,1975519950,1170679535,640298751,369182088,-732525281,567089844,13780679,72795392,1320470835,57811405,-2147437591,1946209918,9103619,16777114,-1898410496,-1946145762,-164375970,1946172544,1346219381,-1391758015,1967674429,1027386373,179046260,-335841856,-797537821,-1408991548,1950039210,1975519749,1555058422,994828171,58000478,638315343,1979598136,-2010755327,1988755269,-765555504,-2146928955,1966735740,-1404680702,1975519914,1170679546,640298751,-989772408,-919403434,567103156,1992632435,3965136,1992664693,75416584,-1073042772,-953746827,1160707909,21350182,-970570408,-385875131,1187381426,521535695,-1393396083,-76206532,1480932481]},{"sector":15,"data":[2088963189,108348674,147803776,1015100651,209014595,1292008579,1317013109,585827535,1094859905,2088963189,108352514,47140480,1015099883,175458640,1174568067,1317012597,1337197007,-1435295283,13598336,2122323317,57934030,-2080409623,1962988158,-18552573,-973118487,1017906294,1325102378,-1731246454,1094845639,1409434823,1963108352,1124386595,38061903,78118989,80156277,1153914949,-1476377342,-955681528,-951496700,4588100,-1956749537,146955749,-1873273344,-326412987,-2116514274,1442894572,16533191,175570688,-1710721281,13302,2113961789,140428296,2135410214,175570688,3297690,172394752,1342193848,1342210232,3288474,-632911616,343195659,1342193848,1342210232,1853850,-1136228096,360038411,-1202667477,726663192,1347440832,-401698736,-1259745619,175570692,16777114,-1983739136,244320838,-338357784,138870531,638082756,1948270464,981896692,105912063,859740755,-2033778688,65334,638082756,973176704,-1977215115,736373255,-1706012215,13140,1076749354,914786560,-632910849,-1224781794,244383542,-1982401816,-1072972218,255660148,-385649408,244318830,-371913752,1589904443,1065362952,639333678,1543602048,-2144988044,1949172095,38594819,41910310,-385649572,1183515202,173443848,-1983363447,434883158,578039612,510926908,58010172,1006773737,-385649345,1191117342,-933313336,-2012771802,-1073029050,1183570549,-900297784,-1981528439,1177282134,814123272]},{"sector":16,"data":[981896703,-11528449,1996425846,880515592,1988820992,141962184,-12942650,981896448,-1706027265,13619,-12941683,434655254,1975520004,29681923,-1098902037,1952251694,138840860,956978827,292997190,-993505537,-1977169826,780568583,1965964543,-933313315,775913510,1183541876,948341210,138841087,-1995811189,1451870278,-2145260598,805252798,-1098897292,1948319534,949914401,948371455,-931740417,650659583,126354570,650665668,-2037905526,-1073021138,-1635004043,130481976,-632911104,-2037559266,1343684410,-1912851992,385825414,895916624,-2037841920,1307311920,-12941683,-1933293943,1183565398,173443848,-1983363447,552323670,-13713792,-2144898001,553594558,1589911668,-934871096,-1006138842,1191167070,126363332,650665668,-2037905526,-1073021138,1589957237,130426564,814123776,982420991,-1933507585,-1002010158,-339323255,-1001455869,650403524,1965965184,-1001979916,-13465971,-16363498,-1013267338,-1207959500,1344143697,-13465971,1354256406,-1957683711,1344199238,1342210232,1201562,1958742784,-1136227460,-1950726519,-2037786042,1139539768,-13713792,-1960151714,1344191046,-12941683,1553616918,-352321483,-1169752317,-2135269749,-176881601,-2135269749,326381119,-340111617,-1168208909,-1950726401,-1962985290,-16283644,-1946208122,-1962985314,780568583,1975519999,-1168208977,-1962932282,-2037793722,1183579960,-1136227878,-13072757,-338016631,981896515,-1873799425,-96737266,611696651,-12941683]},{"sector":17,"data":[2140819478,721420335,465064128,-1070903296,-2037559216,1343684410,-1427632496,-43062837,517621387,981896528,-1706027265,5841,517621387,896834128,1183383552,-428408862,-1696303361,6625,1038239235,192807039,736386756,-970530210,-1962901689,1344199238,-1673473,530244726,-1962934259,1183439430,-2146309190,805252798,-1098901644,1948319534,-1169752304,-1967497589,780568583,1975519999,-1169781790,-13072759,1191117803,-1168208966,1948270464,516131829,838113872,1586167808,-1962440516,1088064707,1183535186,-1706025286,12918,-1967366517,-259287033,218185926,-13066613,-13070593,-956299322,187462,-1996077429,1187503686,-1962934068,1183431750,-799109938,-1982052723,1452069446,-1983894572,1183438918,-2146112554,1560227518,1183521652,948320730,-15567105,-1946208114,-1962985314,780568583,1966750975,949914590,-2012771585,1023356550,1006924892,-16485062,-1191233402,1344143568,503407800,22853712,1183666206,-1202710808,-1706033132,13465,517621387,848599632,113704960,65898,384321165,948341584,-1706025217,12234,326483979,721541793,-1924115758,1343671366,16777114,-1962022144,1344199238,382486157,-752883632,-939768183,92678,-401698816,2122567920,158663164,-1982183797,1586235462,-58817782,-15830210,1996487798,142016266,904400528,-629243136,-16223232,429578870,-2097151945,1946205310,-1133052152,1805466,-58817792,-1207602626,48955393,-2090942421,-443874579]}],[{"sector":1,"data":[-900899553,1478361094,-1957345904,-661774612,185222795,1024095424,594804738,1962936381,1354771208,-352314184,1354771206,1342184376,1347469355,-16222465,244319862,-2083944216,-443874579,-900899553,-1957363706,183272428,71732054,-1996073333,1451883590,-16520194,1589967942,1065363196,-1946913536,1451951174,-62506746,1589909106,126494460,1022772872,1007252538,-16419748,-538182578,-1946401025,1452014662,-129594882,-335915383,-159481847,-15698898,1589967942,126494460,183912072,-1947568704,1982594166,150897656,-167050113,-1070922635,1589916651,1065363196,-16550610,1183579206,-27882500,-1980217719,65796694,-990099713,-2144928674,-193658817,1177273227,212472,28888191,-443851264,311901,1167087646,518818645,-326903666,172422664,-954043264,93190,1916206848,1882652417,945789441,922681344,922681718,1268384116,-352321536,1812383564,-1962934015,1856178758,138840833,1358710409,16777114,-129595136,-990226807,1183053918,-1960442632,1468737031,24158978,24254089,653811339,-1960441973,1956840023,1981188353,-59310335,16777114,49120000,1562371467,445005,1167087646,518818645,1996478606,175570700,-16222465,922682998,520028526,-310181516,535137026,147475805,-1873273344,-326412987,-2585058,-16683466,-2097057762,-443874579,-884122337,196699,16713021,131083,16711718,196616,16713006,196620,16712958,196621,16717812,196622,16714653]},{"sector":2,"data":[16973840,75591,196609,16723664,16973847,338188,16973930,337689,16973931,336191,16973933,339686,16973934,327861,16973935,333685,16973937,333695,16973938,209433,16973829,207062,16973830,210699,16973831,269546,16973825,269558,16973826,337468,16973948,336676,16973949,206797,16973839,207039,16973840,327905,16973825,206775,16973841,271360,16973833,327919,16973826,211065,16973842,211117,16973843,209417,16973845,327771,16973830,265212,16973972,395556,16973829,397699,16973830,265175,16973974,333590,16973839,335514,16973842,335540,16973843,333601,16973845,209013,16973861,336049,16973846,336931,16973847,269756,16973857,329077,16973978,269707,16973858,330734,16973852,329061,16973981,210621,16973869,196626,16973872,337078,16973857,196655,16973875,339430,16973987,211026,16973876,339495,16973988,269579,16973869,339614,16973989,331524,16973990,339456,16973991,337608,16973863,337634,16973864,210568,16973882,269566,16973876,328067,16974000,336889,16974004,327763,16973877,327744,16973878,331269,16973880,327817,16973882,265166]},{"sector":3,"data":[16973890,269792,16973892,265261,16973893,337460,16973885,197541,16973902,337383,16973886,210578,327759,16711715,16973832,337543,16973888,331532,16973890,331552,16973892,329656,16973893,329647,16973894,210600,16973911,329665,16973895,210416,16973912,335445,16973896,210327,16973913,210394,16973914,336402,16973899,330778,16973905,335458,82,0,-1192457387,1586185216,-2128491260,-1845460766,-1034033781,-1957363710,209125356,-16091393,1996426358,-26102,-987889664,448005206,1317741005,173458696,567103156,-1070398862,1996443679,175570700,-15960321,-6681994,1476395263,-1034033781,-1957363702,1455759084,-853887996,-850414559,855798305,-443867200,311901,-1192457387,1586190080,-1960719098,28836958,-1960719017,79846885,-326413056,-18345,-26032,-1070399488,-6664112,-1006632705,820511870,-18432,-26032,-1956708352,79846885,-326413056,-1261292713,-148779722,1893988321,47619,-402358588,-1956708345,79846885,702720,-657331503,1376189154,-1705572784,65535,-1191705849,-1012203445,-1964209323,2050753606,1631323767,539755122,-1034033781,-1957363710,108462060,-16484609,1996424822,2529796,-987889664,968098902,41034189,1344258099,-16353537,1996424310,74907398,20378,-443852800,311901,518818645,-1274784059,706858262]},{"sector":4,"data":[1975520228,-854543354,532689697,-1034033781,-1957363708,1455759084,-854084604,535046689,-1034033781,-1957363708,108462060,-16484609,1996424822,18520580,-987889664,1001653334,41034189,1344258099,-16353537,1996424310,74907398,80282,-443852800,311901,1458342741,175570775,-16222465,1996425846,25598472,1996423168,74907398,-16353537,-1030093706,503316481,-1006086459,1454638206,41034189,1344258099,-16091393,1996425334,142016266,107930,108461824,-16484609,1996424822,32872964,1599602688,1575324510,1426065602,1996483723,74907398,-16353537,-744881034,503316481,-1274784059,1914817857,532689666,108461904,-16484609,1996424822,33987076,-1957167104,79846885,-326413056,-16353537,1996424310,74907398,140186,1455758848,-851790844,855798305,-11526208,1996424822,108461828,-1710983425,578,1575324504,503317698,1430622296,-1910575989,988578776,1988843095,205949710,12584491,52309751,-1194441079,787939338,100861218,134546156,51553024,-150992456,-1996152274,100910662,134546194,25207552,63325835,83984390,-761069560,13148417,-1037330112,1174665425,-230258226,48889643,1488898,-787718517,-774927389,64553953,-150692322,105251631,-1995942261,1451870278,591306,-1982314871,1183439446,-698971692,775686123,1191121012,-731986732,-2012771802,-1073035706,-1202262923,-11534328,1996485238,-663289894,735331979,1183438918,1754943732,-2097151997]},{"sector":5,"data":[1140900414,-1202317707,-11534327,1996485238,-663289894,-1695254785,909,56402262,1342179333,-887041,1996478070,-696844332,-1697351937,1004,1358186121,241050,-1036090624,427116288,56402262,1342179589,-887041,1996478070,-193527852,265882,-933313536,268957222,-1588193420,134546156,1996443648,3455218,129519646,317280256,-933313535,125304614,91750182,384190093,93952592,1183645696,-1706027290,1095,-134986103,-1996152274,-1588147130,1177223954,1996443852,-431583758,1996443670,70163188,1048772608,1967521986,312563225,-867816701,1996443712,-431583758,1996443670,74029812,1589903360,2013210312,-599356157,-1008185322,-599356160,-1566945258,-1996488700,788001862,1183384866,-2136910132,-867816703,-227082416,383534733,-193527984,297370,-1036090624,427115776,25207126,1087129131,-227082416,383534733,-193527984,312474,-933313536,24641318,385238669,23586896,385238669,-26032,1183383552,573503476,-867792635,30581078,1355564587,-1913489665,1343682118,-1695254785,1252,12729987,1444508997,721539745,1346423878,-1913489665,1343682118,-1695254785,65535,16981665,961016390,58591870,1593702121,49120095,1562371467,707149,-2081649835,1183518956,31466760,-388823631,-1946401143,522520646,-263812864,-1324857717,99144457,1183383632,78553592,208977931,1946157373,146715,820715892,-1979955573,1183578694,-230258192,-1980217717]},{"sector":6,"data":[485228102,-1980742005,1183578694,-1947538436,1183447110,-62485510,-1947056503,-538185658,-1962654069,1183385174,-162100748,184188547,1589906045,-196673548,537380390,-1711651189,1996443730,-193527818,379290,-196738816,-762172,396424262,126363137,183664259,1586170493,-196673548,805815846,-1712175477,1996443730,-193527818,391578,-196738816,-762172,396424262,126363137,184450691,1586170493,-196673548,805815846,-1711389045,1996443730,-193527818,59546,1575324416,1426065090,-326898549,138840842,-388822095,-1946663287,-534443962,-754601721,-163149336,-1962654069,1183385174,-61437446,1023297223,-297893120,561315842,285099719,-125926655,-2096530420,-955451282,18153030,16285315,1187453045,-352318216,-125926639,-2096401152,1962997374,-129579259,2122514456,175966968,-368956,-970524090,1183522823,1347590648,-231681,-1214580106,16777222,1589967430,-96010246,637606048,2122516360,175966966,-369013,-970524090,1183526919,1347590646,-231681,-493159818,16777219,1996487238,-92864516,519980683,-26032,-443875328,442973,1167087646,518818645,-326903666,1183536690,17841420,289213300,-385649407,-991362509,537315072,-2130706427,-805038530,-1925679865,1343672390,-413976,179834486,1183666176,-1706027312,1841,382748301,-110499760,-1207011585,-1924136949,1343672390,486042,112640,-16551703,-6680970,-2097151745,1208227390,1048774516,1967719446]},{"sector":7,"data":[-783890865,77111296,1183334660,242679760,1342179512,382748301,126523984,1048772608,2113995516,77242393,1183334660,242679760,1342179768,382748301,133798480,1996423168,571406,112720,176396880,-1779761152,1342193848,-150991432,1073768494,161847888,1183383552,1975520250,-373282043,379650797,3620100,960324468,1030059008,1735655482,1946174013,3423506,1048798325,1962934376,85893469,-956233751,77656134,-1207011585,-1957691388,1344204870,16777114,-92864768,16777114,373195520,175387140,68566659,-385649611,1048772830,1962934376,13953283,-1207011585,-773259258,-263796992,-1125449132,1055934151,-944379136,31649862,1586212587,509690,12861059,-385649408,378208413,-1070923580,-1980610935,1721889878,-163149568,15222471,-1956451584,1183053406,529203958,915137489,381158558,53016320,1452012102,591348,-1981135223,1048833110,1951007766,373195527,259339780,-1280257,-6624650,184549631,-1960872768,1344207430,-1280257,-1030034826,-1962934264,1344207430,503332792,-26032,1191116800,6857192,2095597113,-96040042,-2070261730,-1996488701,-1072956346,-259323532,-956670325,-1962868928,1183447622,-17241616,-1207011585,-1706033148,2384,1355695753,16777114,-831062272,1342439864,-1169113045,1347552232,16777114,-26112,-1796669440,172395518,1946157373,146715,417923957,539905,820577141,605441,1323893621,-26089215,-1207011585,-1706033151]},{"sector":8,"data":[2445,-26032,-1073020928,-722926731,537315325,-956301051,188422,373195008,1963446276,242679561,1342177720,1048794859,1966343190,242679639,1342178488,653722,-6664192,-1996488449,1085861446,1191137280,-294191122,16777114,-129595136,510967819,-1207011585,-1957691388,1344206918,-1695648001,65535,519587467,-26032,1996423168,-126419186,16777114,-44439296,68566659,-2096204750,855905854,1048774516,1966408726,242679573,1342177720,16777114,-1070903296,-26032,1996423168,41084942,-2082060663,906237502,485032821,373195773,58018308,201134825,-385649216,1187512139,-2096889628,1107564094,1191117685,-499712028,-461963518,1347469355,-26032,686358528,373195263,1946669060,-536426666,-2097151742,335934,-790035596,242679804,250200107,675185663,57934082,-213271,146280054,28856320,-1617276928,-16777206,163057270,-1070903296,-195095,163057270,28856320,-6664192,-16776961,146280054,1591929600,-1962742397,1297948645,503319242,1430622296,-1910575989,283935704,-62470314,1183514624,68592390,1946175549,4799759,-1986459020,1451882566,8514042,-1157627976,1347616767,16777114,48014080,1358448327,-96024832,2122514432,175458566,1392002759,-96024832,113704960,764,16008903,-1959531776,-422448010,1342177720,36091135,16777114,146688,512432501,-472841476,36078731,77105033,50071295,50085507,-16023807,-861801402]},{"sector":9,"data":[-196724476,1048823164,2113995516,-129596664,-94993663,-633929984,112641,-1202695527,1385758726,-26032,1183383552,-633929742,-6664191,-1996488449,-1705970106,65535,-1996269405,-956081642,16794118,1958873856,-633929951,-92864767,-493825,-16588234,-16445386,-1710944714,65535,1090274953,-1070917771,1620048,1354771280,-1706012592,65535,16533191,1107740416,-1593835520,101385048,141820762,-1695123713,65535,1593591435,-1962742397,1297948645,1426064074,-326898549,56140040,56235659,-1980217719,1187510870,-352321284,-128007149,653805311,-1986525302,1174535750,-62455816,956974731,-444793786,-500028,-1977157562,1183422471,71732222,2097038905,1183401988,-62470146,367722496,-500028,-1977157562,106873863,637945599,1191118728,-28931076,2096907833,106874083,509478,-1034033781,-1957363704,317490156,-96024746,1187446784,-956301064,65094,68566659,-385649335,1048772784,1967653910,10938627,-1207666945,-1706033148,3341,219388496,1183383552,4241654,-163119280,-1695123713,3365,200951433,-14322496,79168630,1183535104,-11526406,1083897462,-2097151987,906237502,1183517300,-1706025222,3402,1023678113,91488306,1962947901,74907465,1342179000,588954,-1818603520,-1996488695,1085863494,1191137280,-159973386,503450,-129595136,510967819,-1207666945,-1957691386,1344206918,-1695123713,2496,519587467,164272720,379650048]},{"sector":10,"data":[3288324,1979717693,47114499,781434883,267954175,-2131075445,57999423,-16598039,-1014299530,-1070903266,244338768,186288616,-385649216,1187447460,-385875458,1996423836,1354771204,644506,-94467328,1962950528,42395907,1344193419,68566659,-1593477834,65733346,1342177976,16777114,40560896,16416387,1642660725,-94467326,1962950528,39250179,16285315,1307116405,1996444418,74907640,-1996303896,1038745158,-92372222,-385649408,1586168372,4161786,703136629,1996444418,281077764,2122571243,57999610,-1962797079,1065417310,-385649408,2122514956,57999608,-1962802199,1065416798,-385649408,1996423672,1996444666,175564804,2122557931,57999610,-16653335,1996487286,-401698812,1183388400,-603535362,-385875967,2122514892,57999610,-1962818583,1065417310,-385649408,-11337288,937952374,-9705196,597658,1958742784,74907398,-2097035800,1962998398,26667267,-362753,1760035958,-12064489,-1996187487,1048837190,2113995516,74907414,1342179768,16777114,1958742784,77242630,-244087,1187511366,-1593835276,1178141900,-1206419980,-1957691391,-472779682,36091903,731546,212224,-861857931,-196724476,915096181,960890008,175438966,-336693623,-196673780,-1700674069,1183399940,-297366802,1183334404,-247019792,-230242758,74907392,1342177720,1347469355,384845453,259037776,233504768,-772514165,646417379,1183399938,-25874,2107244544,184549390,-16354112]},{"sector":11,"data":[-68680586,-600375552,-26110,-1039466496,1996428661,1619972,1354771280,-1706012592,4054,-16731159,-1711088586,3052,68566659,-15895223,1996484214,-25860,300613632,-1149185,-1070859146,1347440720,16777114,-28931840,16777114,-28931328,645185547,1946157373,74907407,68566659,-1205242551,116064290,-1207666945,726663192,1347440832,198220368,-526385152,1093507073,-61961472,1976056649,-40179448,-352312392,-28915747,854261760,233639360,235540522,224660878,241045546,271191676,271192106,271192106,271192106,271191614,271192106,271192106,245370528,2122517902,141820154,-1694861569,4162,16285315,1996425332,134322936,1183514624,-443851010,180829,-1275051,-1866988426,-1202708991,1344144564,1343230136,16777114,1575324416,1426064066,-326898549,1988843012,-2146702588,192159804,1949056128,1015039494,-1980730112,1015086710,-16550912,80150086,-27358464,1183319946,1948269820,1965833220,-28901627,1183575019,-443851010,180829,-2115204267,1442925292,11421383,-964245760,-956301058,2097205318,-21461305,1187446784,-973078338,-956256186,118342,1342193848,1342198200,1114778,-1199142656,1958743038,4241475,5355600,214473296,1183383552,1958742974,-960593105,1031078142,1342194360,-1714403701,-6664110,-1996488449,201246342,-1176341056,1183514626,-101213744,1037059721,-780337052,-1207666945,726663192,1347440832,316971600,-1008140288]},{"sector":12,"data":[-961085695,257596158,1183383552,-1135179334,-1979294069,-1232697337,1948269822,1965833220,105316101,1996483307,-17569786,-1951250807,4161752,1996425332,1685508,-1533365013,184549394,-955550528,52806,-402360577,1183579822,-1957683706,1344192070,-20412787,-1444392938,-1132033783,-1102672898,848973854,-1996488686,1183563846,-11526466,468238454,-934901499,-1098904085,1965883062,138840851,-1962391809,126486622,-21592440,-428597188,-402098433,1183448697,-2133292110,57999423,-2097084695,16694462,-51838092,74907392,-385869128,1183579948,-1957683704,520009862,1354771280,154593360,-1950988663,520009862,306223696,-2037841920,1183579834,-1706025464,4717,2080395325,140413703,5195718,-10582387,1183535126,-1706025464,1738,11959939,-2037571468,1343684446,1226138,4996352,-2037575555,1343684446,503337144,329423440,-2037579776,1343684446,1342185656,382879373,-310450096,-20674935,58048523,-1711083031,4841,11959939,-2037570444,1343684446,579482,-957314304,16734850,-1207666945,-1924136927,385834630,1354771280,1996427499,440324,1354771280,1585876304,-1706027265,3886,1289626,1958742784,-834222325,1996423168,-44767228,-1984805237,-397408186,1183448425,140413874,1946173312,-16586493,-21447037,-16157696,-1694582602,4910,12484227,1996425332,271882942,-1098711040,1946222278,-961085678,259824382,-1224802304,-6619450,-2097151745,1962978942]},{"sector":13,"data":[48425219,13139587,-639040651,112642,-1962748439,218480710,5258496,-2037573507,1343684296,384845453,-1102673072,1174657676,-397389120,-1070922706,-628716208,-1202710786,-397410274,-2037516183,1343684314,384845453,145988176,2122514432,729022670,1295514,74907392,1342179256,-19233139,412766230,-1711276025,3911,192200715,13518535,74907392,-1946387992,520009862,1585876304,-397404417,-1073020231,28841588,-2037755904,765001566,-1706033087,5170,309706763,-1207666945,726663174,-1957670720,-383907770,1183579446,-1924129090,385813638,41936976,376750091,1342177720,-15956342,4271512,249666128,-1073020928,1996427381,964612,1354771280,105286480,2122564843,225706190,-402360577,-1073020439,-1209465996,-1199141890,508567294,343054928,1183514624,508567230,39688784,-2037579776,1343684446,-15956339,-6664170,184549631,-16157248,230163574,-55645952,-21461365,-1070903266,-26032,1183383552,2109737926,74907417,1342179000,1347469355,-21461365,1251627038,-385875951,1183514797,726671038,-6664000,-1996488449,-1072973754,1996429693,358849222,1996423168,964612,1354771280,-1102673072,-57367,1996473974,-1166606404,-1697614081,65535,-10713463,1064747019,1962934077,-1200160966,-4425985,-1705985418,65535,-19364215,-10713461,-19364295,-1635007116,1992621784,947922618,-385649638,1996423378,-356456264,58048523,-16726551,-1276594058,1975520234]},{"sector":14,"data":[-965279986,-390564097,1187506970,-16776786,1805301878,-16777195,278578806,-1962934250,1344192070,-2070261730,-1962934251,520009862,-1706025392,5545,382879373,-355801008,-20674935,-20660605,-385649664,1183710558,-1924131088,1343680582,1498010,-263811840,-426094570,50331669,1040104070,377290832,-21461365,-2046567796,1347616442,384845453,369465936,-1098711040,1962999484,-41686781,384845453,297769552,1174601728,5258688,-1847000196,-1102672899,1174657676,-1924115776,1343680582,1493658,-42276608,-1698269441,5656,-1699186945,65535,515786379,-336598960,-1207666945,726663183,-1957670720,-369182586,-1070858792,1575324510,1426065090,-326898549,-1959204078,1178141766,-15895314,-6623626,989855999,259327046,-1929087233,1343680070,16777114,-1928008960,1343680070,16777114,-297366272,-6664170,-1929379585,1343680070,1347469355,112720,-26032,-1073020928,-526274187,1575324418,1426064066,-327029621,1996423296,142016266,377505421,16824400,-26032,-1073020928,1996433020,74907398,378029709,308058704,1996423168,74907398,-16353537,2090468470,-1207959550,48955393,-443826133,574045,-2081649835,-2091513108,1946158206,75399951,-1005619967,-2144991650,108342847,-385875528,1183514783,139889414,-1980348791,1589966934,2139105014,611662337,-1744336346,-372709296,-526333813,-935618559,-1070922636,1183020011,1854079734,2122514948,-1066139644,653680324,1968979840]},{"sector":15,"data":[72286181,-940161281,64070,1074077345,-1946270071,1178141766,-1005552134,-2144930210,292903999,25133094,-1962248960,1065418334,-340560640,-27358333,-1963047169,-397371385,1589963106,-163119114,-1977169781,-1957652473,-380573455,-1904884165,-335919361,-443851082,442973,-2081649835,1183516396,240552716,-1979955575,-857080234,708679680,1030321152,57999406,1023445225,661913663,-237884,-1977156538,73319431,637814527,1589905288,126494216,184174216,-385649216,775684247,-1006596631,-2144991138,259272255,638076671,1589905290,71761668,-16283610,1978399814,788168320,1589911412,138870536,-1006138842,1191117918,126363140,638082756,1183319946,1975519994,-60898085,-2012771802,-1073022394,775701364,-1014284428,1191166604,-991499268,1191181406,126494460,-16490812,-2010774458,-2146833657,1949235838,138870544,638082756,1183319946,1975519994,140428522,4161574,1191117684,-60898296,-2012771802,-1073022394,619250548,73319679,509478,-1034033781,-1957363700,-655588884,-1035548928,1187446784,-1207959090,-1202716608,-1706033072,6369,-12679543,343195659,1342193848,1342197944,1109402,-800683776,1215676427,-1207666945,726663192,1347440832,440572496,-1098711040,1946222398,1052180233,421042943,2122514432,141820112,-1697614081,4896,12746371,837354357,-864124158,-385649408,28836392,35973376,-402098433,1183446837,-2133292092,141819967,-1207666945,-1494548464,-402229505]},{"sector":16,"data":[1183446813,-2133292092,141819967,-1207666945,-1897201639,1715354,1958742784,-834222325,1996423168,-153556988,503858827,1049004880,726671103,-397389632,-2037710380,1344208702,1684122,679905536,105286655,1183535134,-1924129072,385822854,28502096,516966027,446208592,1183383552,1049004998,-11526401,-385931082,-1072956122,1183518581,-11526448,401131126,1958743037,112645,-1070923029,-1949546871,1344145478,1342185656,382879373,-433919920,-13728119,1786036235,503858827,3192912,-767128240,166219798,1975520230,74907410,1342179512,1347469355,503858827,-76311,112723062,-1695749376,6727,-1207666945,726663176,-1957670720,520044166,347839056,110755840,184549403,-955550528,52806,-402360577,1183708662,-397404462,-2037783048,-1098645714,1946222382,-24188669,13532803,1996426612,-71047164,57982987,-1912701975,1343680582,384845453,360159824,1183645696,-1706027280,7228,-14121469,2097172541,1049004822,64654591,1392453766,-263811760,-1885712362,-1962934245,218482246,5258496,-2037573507,1343684400,384845453,-800683184,1174657676,-397389114,45677782,-2037559296,1343684418,1342210232,-1913581336,385827462,-263811760,-2103816170,-2097151982,1946209918,454924843,1996423168,505860,1116114256,-1706027265,5055,1150874,1958742784,-834222325,1996423168,-182392828,-12679541,1183535134,-397402416,87942770,-385649408,289275621,-385649408,1187512029]},{"sector":17,"data":[-385875518,-1070858492,-1034033781,-1957363706,887915500,638344900,1946173312,-1933341931,1347567810,503338424,344169040,-1073020928,1996429173,142016266,-15829249,-275116938,-1207959525,-1343684607,138840834,-1995811189,1451871814,207537360,25133094,639268154,1589905290,-834207794,-1962440666,1191169630,130426574,205947706,207537154,775913510,-504822924,2139104768,125066241,25133094,-14387968,1996476534,85893582,832196638,-16777188,1589906502,1065363150,-385649408,1191116980,-990909490,-2144990114,1949172095,10676483,41910310,638219356,163712,-1847000204,-797507840,-1580304641,1344144670,1430170,175570688,-1710721281,5555,-1962392061,1183386198,-799634994,34358915,1325335531,-832650034,1547665446,1589965941,1065362956,-1961855744,1451952198,-799655670,1178142069,-1961003826,1451952198,132362,1976587835,-834258127,1589914741,2139104776,578107905,-338802945,-834237667,1023952427,461176911,-15966524,-1977217978,-832650233,651052799,1589905288,1065362956,-992316160,-970535330,1183514631,173443848,-1982970231,267112534,718044800,2122323572,276037836,-993114369,-1977168290,-867792889,-462078148,-16091393,1471678582,-1706025472,7446,58048523,-1946252055,1451952198,1347567626,503339448,461019728,-1073020928,1927873397,-832649986,4161574,1996450165,142016266,1342189752,383010445,-488970160,1400225803,283723510,1183534452,173443848,-1982970231]}]],[[{"sector":1,"data":[65785942,-993114369,-2144940450,-193658817,-1949413633,-2144940450,58022975,-1946278679,138816451,2080395069,-31987453,-1949415681,-970535330,1191140359,-832664626,509478,-1946287895,1451952198,-834238198,-338667895,-834207997,651058884,1962950528,138841076,956978827,376884806,651058884,1183319946,1949973708,1952201737,-833683707,1589960683,126494414,1020020360,1006924892,-1957595846,1452002886,1347567824,-16353537,1575486582,-832650240,977240102,1191117685,-832650034,-2012771802,-970534330,1547436039,1996437621,142016266,2053018,5192960,1996433533,142016266,503340216,540580432,384499712,-3115265,1996476022,74907398,-1006628888,-970535330,-1070923769,-1034033781,-1957363700,82609132,71732054,1946568203,-990499996,-1977218978,-62486521,561299466,494153276,-1006090497,1191117918,126363140,150897478,166452604,788299392,1191121012,140428296,-2012771802,-1073021882,-164894091,638082756,1946173312,138870549,-1006138842,1191117918,126363140,83788614,1589961340,130426372,-443851264,574045,-2115204267,-956251412,51782,1342193848,1342197944,1625242,1082558720,1975520255,74907413,1342183608,1347469355,-1281732528,-385875937,1586168363,-2012771834,1023360646,1006924832,-16419540,-353696186,-402229505,1183445333,530488008,-1073020928,-169278603,-800667903,1996423168,-249763836,-1962809367,1344144966,-12548469,-1070903266,367546448,-834237956,-12548469]},{"sector":2,"data":[-90550242,-1996488673,1187511878,-1962870836,-2037840314,-1634992316,1065418564,-1978436608,1049004039,1950301439,1965702148,-867776689,1183514656,-11526650,1183698038,-397404462,-2037784444,-1072955582,1793655669,532191745,1996423168,440324,1354771280,105286480,-90550242,-1711276008,6501,58048523,-16691479,-2014837642,21359088,-12286209,2122552555,225706192,-402360577,-1072957855,1156121460,-263811839,1183666198,-1706027280,6798,384845453,428972624,1174601728,5258750,-2037705347,-628293824,1392395779,-263811760,-1214623722,-1207959526,-1924136957,385828486,8435792,-338433968,-12155251,1183666198,-1706027280,6907,13663875,1520053108,-16777184,129500278,-2037559296,1343684422,1775770,544512512,-1073020928,1187449716,-16777008,-471333770,-830569489,-1706003456,8359,503727755,-506599344,1946158397,1064204,1187458420,-352321078,74907413,1342179768,503727755,1354771280,519543376,-778436608,184549408,-11766592,-1679293322,-12260369,179831926,-1070903296,-1948652720,520044678,-515381168,376750091,2039450,74907392,1342180280,1347469355,384845453,-2037662997,1344208704,-385976577,-1072957958,1187448180,-1929379382,1343672902,-1981851672,-2080423290,16728766,-1041693835,-934900738,1342588553,-1980803864,1586219078,4161542,250151796,1086227454,158597375,-12536065,1641114,-901346560,-1034033781,1478361092,-1957345904,-661774612,1460464771]},{"sector":3,"data":[-196688042,1183515808,-96040696,1183516395,-96010246,-2131075445,-227270593,1191117803,-94467078,2132819840,541032693,65743221,-1946532097,1065417310,-2131397600,393478207,-1207535873,726663184,1347440832,584555088,-1070923776,-16712471,-1711087050,65535,1183576203,-1202708984,1344143454,1899674,1958742784,140413723,1965703040,25133062,-1962052608,1065355358,-1207602176,48955393,1183432747,1958743032,-163133580,1586167808,775913480,1191125364,705137160,1372138468,575183440,1586167808,-196673548,1191118728,-159480842,-1948812280,1065355358,-1961855698,1191179358,142511092,-1979169025,-955807739,63046,-2146935157,561250367,-1979169025,736373255,-1706012215,3316,-762229,126415942,-2081011969,2080634494,-195130409,1442842566,1342194360,16285315,146277748,721611520,-1885712192,1442840610,1342194104,16285315,146277749,721611520,-1667608384,1442840610,1342193080,-1705983957,65535,1577058744,49120095,1562371467,313933,-2115204267,1442876140,-402229505,-2037781071,-661913736,1946173312,74907415,1342183864,1347469355,-1566945200,721420320,29223360,1342178744,-8747379,-2135404522,250105856,105286633,77221918,-1929379805,385841806,-1695511727,9355,-2143435261,-1927119616,385841798,105286480,714756126,-16777186,129500278,-2037559296,1343684474,2119066,541301248,-1073020928,1996424820,-317659132,-1996077429,-335579002,2022113028,2023656447]},{"sector":4,"data":[4161791,351007605,956712587,1929345158,1992196121,309607167,-8876289,-8872309,-2037905526,1547501430,-2030051723,-2037645448,1183448952,-1961432066,-1962968930,1988528135,1958742783,1949187092,2022113040,2022083583,-28955649,2080376893,2022083550,-28931585,-1098904853,1949237110,-28901616,-1963041141,1988528135,1975519999,2022083561,-1957683457,1344208454,2103194,2023656192,4161791,-2030107532,-2037645448,1183448952,-1962152962,1065418334,-15764480,1183579718,2022059006,212479,1586227580,509694,503727755,-587798448,309641227,-1207666945,726663200,-1957670720,-383908282,1183579819,-1924129274,385841798,-228071344,58048523,-1912693527,-1979745658,1452079686,-16520196,1589967430,1065363194,-336300800,-95486205,653942468,1968979840,2089192948,970034431,125172814,58054715,-990230785,-970524066,-2037579769,1343684474,-8747379,362434582,1342177310,200432104,-385649216,28900929,-443851264,311901,1167087646,518818645,-326903666,1748927280,92080640,-352294751,702467,-2080881015,26686,803799925,2734081,86126327,-1996484603,79230534,-6664192,-1962934017,-129594424,52309751,-930365181,-1727848799,-120470997,-1048328189,-196179709,435046087,-263796992,922681369,1183646434,-1706027282,65535,721609889,422442566,-230258432,2112767545,-297366779,1183515627,-297367054,721611425,170783814,-230258432,2112898617,-263812347,1183515627,-230258190]},{"sector":5,"data":[2097154621,702469,1183515627,-263812622,956328097,91551814,-352321096,-1547687166,1187447586,-956301062,-1865876410,74760203,553406080,31078143,1342182840,382748301,2013264,-26032,1755381760,48145152,1342194360,-150989128,-1727865298,530206802,-1560281071,-1073020184,-1070918539,1620048,1354771280,-1706012592,9796,-122147093,-1924129280,1343672390,-231681,1996487286,-260636690,-624897,922743926,-1070923038,-633929904,-1706012671,65535,-1962742397,1297948645,-326412853,-1962480509,1344144966,2291610,736512,1586169726,189253126,105286400,-335788407,-2012771802,1060961862,708576372,1996428917,2013188,1354771280,-1706012592,10081,720093227,-1946401025,1065417822,-2133691136,123454,1996427124,31635460,108461904,-352316952,74907401,-402229505,-443875076,311901,-2081649835,1187398380,1187446730,1187383504,1183645905,-968455726,-1916250484,1183441478,-1000960830,-1933162869,-1102673454,-1950329207,1183385158,-27357956,1183522283,-968479810,2097154877,-60898265,654067455,1589905290,-1102643266,-1006139354,-2144928674,-629866433,1589906155,-1102643266,537380390,733890187,188597830,-1947501568,1451999814,-1102673468,-1950329207,1183384646,-27357956,1183522283,-1035588674,2097154877,-60898265,654067455,1589905290,-1102643266,-1006139354,-2144928674,-629866433,1589906155,-1102643266,537380390,733890187,188596806,-1913947136,1343670854,198841320]},{"sector":6,"data":[-15305536,515377270,-1070903296,1347440720,2619290,-339727616,112643,-1034033781,-1957363706,1055687660,-3520826,147867334,13715142,-1982708083,1452066374,-1982690104,1451868742,71732164,-1929623927,502005342,734152331,188597830,-1004045056,1191181406,126494460,-4038972,-2010725818,-60898297,4161574,183229045,-4038972,-970538426,1183522823,-968479806,2080377661,-901345813,1609060374,1958743001,108461846,1342185144,1347469355,-1634054064,721420321,-1207702592,-443875327,311901,1167087646,518818645,-326903666,77373788,-1913370999,1183425606,-61436678,1183522795,96807930,1329397852,-1004831488,1191119454,126494218,-368956,-2010711482,173982727,4161574,1589958773,130426618,105286400,1946699275,-1538880165,1656246294,-1706025472,8637,947175435,737822347,6030789,2097172029,-94452693,653936383,-346290234,-96040161,1543882027,5192960,1589910397,105316102,-1006138842,1191180894,126363386,637951684,1962950528,-94452520,509478,-637241,-1518436097,-1974635206,-466967482,1347537195,2228890,769927680,1183383617,-129579018,-861863936,-129615612,1586171517,-1948003848,-2026244538,963969574,956615841,1149106246,956603553,208992326,-1694992641,10556,1165279243,-622973,2122319486,208928934,379864717,-665655216,175489035,-352321096,-129564886,2122558699,142540790,-1695254785,65535,-1207011585,726663199,-1924116288,1343661126]},{"sector":7,"data":[2476186,-2084558080,-443874579,-900899553,-1957363702,250381292,1183536727,8168196,12861059,-385649408,113705112,390,52575875,1343714304,1342177720,-1588543445,170722014,-1070903296,-26032,922681344,-2036727064,-1996488662,1451883590,-1005155330,-1983894784,1451882054,-96040456,1996440555,-25862,-1073020928,381170804,-94467328,915137489,687277214,-1946794493,1183447126,-195655182,-2080618812,-1961427898,1586229846,-1946645516,-611442958,-234878023,1191124901,25338362,2096776761,-399048779,741448194,1599995904,-1034033781,-1957363710,753697772,1996445271,112644,-26032,1996423168,571396,-26032,1347551232,16777114,56402176,-1996486651,163110470,573503232,-1577547003,-956103956,-1560279035,-956103918,50430115,30581703,-788192607,-335150112,525570,-2082978167,190526,-1259797643,-399048959,290888194,1183383552,-162100748,1988752939,25946586,25572921,2112422782,25600257,989858309,-385646650,1183514992,506394586,-1580692733,-645201122,734147481,178626,-1036781357,-670842325,-1946657143,1452012614,591350,-1981790583,1183441494,-229209616,775686123,1191121012,-262224656,-2012771802,-1073032122,1996483701,571396,-126419120,-1935617,1183572086,-532272144,726047312,1183514624,-229209104,-1979955575,65797718,-990099713,-2144928674,-193658817,-16484609,1996480118,-227082248,-1947175169,-263836733,731748944,1589903360,133572340]},{"sector":8,"data":[-15371248,1996424310,-126418984,503348920,505936,11462992,653549252,638023679,-1929021441,1343677510,427930,-96040704,86126327,-2734455,312542326,-700044541,-126419120,384059021,-92864688,2874010,-195116032,58195750,384059021,-648746928,384059021,737385040,1183383552,573503482,-700020475,-1593542913,1177223552,1996443862,-465138184,1996443670,739744506,1589903360,2013210356,-465138431,384323606,-465138214,295325718,-1996488666,788003398,1183384866,74907606,721539745,-11479482,1183709302,-11528476,1268447862,-16777213,-2092508602,957805638,2114117174,-26416893,48772863,1261210,-1956684288,79846885,-326413056,1443687555,-1996388703,1187509830,-1962934028,-1073018810,20780660,1025012736,443809794,1946157885,277788,652942964,-768313,-954209281,128070,1187453163,-335546636,-196688111,183173130,721700491,-1996388858,1183577158,-2046426636,-566850815,183403266,25572921,914949246,1048772998,2097152390,-2046376186,-1962934271,103544390,1183383942,1958743028,175570787,385369741,-26032,513867776,-1036805885,45728299,871944960,-1983763518,179894854,506394368,-96075005,-113015,28838518,922701824,-1706032762,65535,722106111,1183535296,506394612,-1070903293,1183666256,-1706027272,65535,-1710590209,65535,1575324510,1426065602,1183575179,867588,456999540,1027437568,292814881,1946165821,2506012,675094388]},{"sector":9,"data":[-350129152,108461871,1342177976,1347469355,-335619352,108461855,-352320584,108462062,-403980245,-1207535873,-538247167,-1710852353,65535,-1034033781,1478361092,-1957345904,-661774612,-1960514429,20778054,1025864704,1316225026,1962938173,8710403,1946162237,16792946,-1377238155,18169088,-1796668555,11462912,48379647,3012506,-62486272,3913808,112720,772250192,1996423168,-75569138,-1710328065,2309,-375799765,922681492,-1399192862,-1996488671,-1202652090,726663227,-6664000,-2097151745,190526,922683764,1201275624,-956301293,31750,-3544320,1996426870,-26102,-1125449728,-1928431873,1343675462,16777114,242679552,-388204801,1996487636,-599356146,-6664170,-352321281,242679703,-16091393,1996425334,-36050938,1996457707,175570702,-369180440,1996488570,209125134,-16091393,1996425334,-26106,-310181888,535137026,181030237,-1873273344,-326412987,-2116514274,-956238100,41030,217728710,-1979294069,176588807,1948269823,1965833220,105316101,1586227947,4161542,-1070922379,-1207753751,1344143568,503378104,11253840,-2037559266,1343684374,1342210232,16777114,377916672,-1773762049,-342337908,180256778,292826367,-996784385,-1977182626,176588807,1975519999,-1772174104,4161574,1191122548,130426518,-1978799360,-1728116090,1996496957,-1773732079,647388868,-2037905526,-1073021174,1183573365,-1739158634,-1985722743,350987862,-16073088,-1977912276]},{"sector":10,"data":[-1728116090,1979719741,-1773732079,647388868,-2037905526,-1073021174,1589960309,1065363094,-15043584,-970549690,300613639,-16087414,2112920,742130806,1191121269,-1772174186,-2012771802,184486534,-1948158528,1451988550,277252504,311855615,-1978799105,-1728116090,1979719741,-1773732079,647388868,-2037905526,-1073021174,1589962101,130426518,-1537293312,4161574,-1098895500,1946222358,278840360,1065363199,-14781440,1996465782,377916836,105912063,1354771283,-26032,1183383552,1975520156,1354771221,1342180536,1347469355,-1013297072,-385875919,1996423636,-700019300,-6664170,-1962934017,1174656582,51684318,-1545582965,1996423844,702620,-26032,-2037841920,-1952841972,-150793202,344361465,335988735,-956301308,205830,-499712256,1354771202,3193498,108461824,-1981808408,1586208326,4161542,1048785012,1962935316,-633929868,6600705,-11513191,-16588234,-16625098,-1711124426,65535,184816803,-1204193856,-397344773,1048774623,1962935076,-499712227,112642,167942736,1048772608,1946158100,339148553,763402756,1996423168,-25956,1183514624,18016672,-1197705473,726663177,922702016,922682652,1347421466,3220378,339148544,309252,105286480,765087774,-16777181,179870838,1183535104,-1706025466,12841,105286480,-1070903266,1939492944,-1996488655,-1072956346,1978205053,105286655,-1952299383,1065394782,-1975028736,176588807,1948925183,1967078404,108461876]},{"sector":11,"data":[-6523137,-385936202,1048772767,1946157860,-12130045,-1197705473,726663179,1347440832,-6664112,-1962934017,1183424070,-337031162,-1572405250,1183560171,-1571881210,-1969070453,176588807,1952201983,1949973561,105286453,817385502,1183666176,-397404502,-1072968088,-1070917772,440400,1354771280,105286480,1570394142,-352321486,-1085868399,-385649392,1996488571,-1669923066,-15419649,184747752,-385649216,1187512180,-385875552,-310116500,535137026,46812509,-326413056,30076033,590518870,-1073020928,-1070922124,-566171568,503858827,1049005392,726669054,-397389632,-2037520068,1343684158,2864794,-62486272,503858827,2144336,-867791536,-706195434,981895629,1975520254,42526979,-1202667477,726663174,-1957670720,1344145478,2707866,40954112,384452237,-364475056,-258322410,-1962934241,-1903297466,-1056702914,1347605132,384452237,601201232,-2037579776,1343684158,-29456755,1721389078,-1929379820,385760902,1354771280,1351322,1015449856,1049005566,-1924131074,385760902,846174800,-2033778688,65078,16664263,-129579264,-1293352960,-92372223,-385649153,1988821446,-897399046,-2037579522,-2037776694,-1769144636,-2033713466,65080,16416387,-2031549579,-997815551,-963212290,-1064924674,-1030321666,-1063336706,126494462,-20412792,1165279242,1098123836,913639740,-29981045,-1542550631,66713346,234764422,-654835720,-11893111,-11893109,-11890945,58048523,-1962885655,-116554]},{"sector":12,"data":[-956417914,553602178,-1098849557,1964703432,108461947,-29968641,-1912703233,385830022,951517008,874879742,-2037710848,788004408,-2046754140,-2033713610,65080,-20398464,-385649654,346095795,-28966653,-29980985,-2030108672,1191182016,71732216,1962427961,9824515,16271047,-28915968,1996423168,112646,1354771280,1347440720,3452826,-1098479360,2109737982,14674281,-20398464,-1961921268,-1991769018,-2033780666,-385155384,-2037710993,1033436872,208797728,-29837685,-29849857,-11763064,-29835647,729088128,-16353537,-117066,-2037514634,1343684428,1342210232,2822810,948341504,-1540425730,914751746,948357118,-16776962,-369180538,1048837835,1962935076,-1064924298,-997839874,-96065026,-20937077,-20801909,-20674935,-20539767,-20930876,4161574,2122516085,745865466,-20930876,440369190,1944650612,-14816258,-1912718154,385796742,8370256,352098896,1183383552,1992297466,-30283517,-1207535873,726663169,1347440832,-241545136,-1996488656,201244294,1342471616,-16528664,-1694614346,5338,382486157,-880089008,-29718903,-29704573,-385649408,-1956708986,113401317,-326413056,17886337,-91830442,-1929379586,-1979744634,-1929447802,-335611754,-158954719,96807934,2067595394,-1004831488,-67938,-1946225018,1191118966,637831688,1586169736,4161544,-2037655691,-986972426,-1996455419,-1631257018,-2144928010,1952251775,2139104783,141835007,-17398017,1544013350]},{"sector":13,"data":[-17391932,-17398017,705152550,-17391989,-17398017,772261414,-17391989,-17398017,705152550,-17391989,509478,-8485235,-2037559274,1343684348,199300328,-1962445376,-369165690,-2037579520,1343684348,-385976577,-1072963254,28837237,721611520,-91846208,1975520254,13822211,11404999,-2037579775,1343684348,16777114,-26112,113704960,386,31211139,-1204587520,-1202716608,-1706033024,7901,-8616311,510967819,503369912,16824400,683167774,-1957683712,520060038,8435792,786799184,1048772608,1946157252,-1005155490,-1983894784,-1979780986,-1979780458,-335612794,-258030527,133572350,-1961134832,96636099,1347551241,503619768,2092367696,-25857,-1073020928,-2101472396,-14906623,-1948004092,-1962631626,-1979779962,-259620096,-2030102786,-694026508,-192530175,-2085192450,121918,-1098706828,1946222460,2092367625,557161215,1996423168,74907398,-385873176,-1956708615,113401317,-326413056,11594881,-1002536106,57999360,-1962814487,721470486,1686538688,1721141759,-196703745,-1979824503,-369142650,381157773,1419676416,-1948003841,-150692298,1686504232,1721142271,1350994431,1385597439,1954975231,-1957685505,100618374,1347551241,3616410,1954974976,-1588586753,1344143532,2300826,1352582144,133572351,-1928563696,1343652422,503361720,-1929328919,1343652422,503360673,929602128,-1631322112,-14221488,-14284937,-2037578377,1343684456,2849178,1753648384,-1706027265]},{"sector":14,"data":[14227,-9138547,-936651892,1394000259,1753648465,-1706027265,14199,378160781,11313488,-1415950306,-1006632905,654266526,-1929152513,385833094,-847714224,-10975603,-728084458,-1929379785,-1929415538,-2084033581,1364402369,-10975603,-1164292074,-1929379785,1343657030,503360673,938187344,-1631322112,-14221488,1183646071,-397404426,1183698485,-1706027274,14326,-9138547,-936651892,1395310979,-163148463,-2036707306,-1929379790,385840262,823433808,-2037841920,1996488546,1354771206,-1912703233,385840262,1656160080,863410943,346095616,-28966653,-1946925313,1178141766,-953387532,62534,16664263,108461824,1342177720,1347469355,-1706012592,14450,-11106679,847036427,52706947,-13667072,-1577102202,-2043084414,58589012,-104471,28837494,-1070903296,1347440720,869112400,-2037841920,-1072955562,-397409155,-1956773881,79846885,-326413056,280311,-1958841280,-79887290,1025012991,678756348,2097151293,-115451,922691454,213386260,-16258304,-1207692234,726663205,1347440832,806591056,166395904,68433663,-352311624,1575324649,503317186,1430622296,-1910575989,351044568,1183663339,726669036,1347440832,1342177720,1478298,1958742784,339641140,309592068,68433663,384583309,375757392,-1073020928,1183650933,-1706027284,5745,384583309,377199184,1048772608,1946157860,608076725,91553795,-352321096,-2084558078,-443874579,-900899553,1478361092,-1957345904]},{"sector":15,"data":[-661774612,1024214667,846463248,1946227005,18234631,1374371956,52692679,922681345,28836578,1704611840,-16777168,-895873418,-956301264,267270,112640,1996434923,1354771214,16777114,35824384,-1710328065,11752,922739691,1622671906,28856560,-627421184,-352321491,-2084557872,-443874579,-900899553,50355210,84776193,50354176,87070721,50354432,87625217,50354688,84717569,50354944,87098113,50355200,84730625,50355456,-13155072,50335488,84384257,50356480,-16212224,50336000,18085889,33554688,34269185,50331904,-15877888,50336256,84849921,50356736,-13057536,50336512,-15750912,50336768,-15777280,50337024,-14088192,50337280,-14040576,50337792,34578689,50331904,-13751808,50338048,34573825,50332160,-13220352,50338304,86934017,50359040,-13252096,50338560,-13253376,50338816,87618817,50359552,84559361,50359808,84482305,50360064,87628801,50360576,87631361,50360832,53863425,50332928,53904897,50333440,69872129,50332160,86844417,50363392,52801281,50335488,84960513,50331904,53352193,50336000,69876993,50333952,53060353,50336256,53087745,50336512,50376193,50337536,50370049,50337792,50372353,50338048,103978753,50332928,103987713,50333184,87662593,50337280,70783489,83894528,34268417,50331904,86144769,50371072]},{"sector":16,"data":[87667457,50371328,86316033,50338816,87659777,50371584,86886657,50371840,70795265,50341376,86822401,50340096,87652097,50340352,84497921,50340608,84719105,50341376,86915329,50341632,86920961,50341888,86374401,50342144,53873153,50346496,51082753,50347008,51086081,50347264,70253057,50345216,51088385,50347520,85349121,50343424,86349313,50376704,86302465,50377472,86652417,50377728,87654145,50345216,51820033,50350592,84360961,50379776,70308353,50349056,86842369,50347264,86835201,50347520,53005569,50351872,86612481,50348032,53789697,50352384,53776897,50352640,51694337,50352896,53650689,50353408,51714049,50353664,52979713,50353920,53934337,50354176,70270465,50352128,53938433,50354432,53956609,50354688,51047681,50355456,53608961,50356736,70263553,50355456,84654081,22272,0,0,0,5,0,0,0,1,0,4063237,774504540,2228266,541937475,541415493,5521730,1144791072,4084297,536870912,0,1061109567,1061109567,4144959,707668572,1543518720,6044160,774504540,6029354,0,1998585856,1701540463,1852776548,32,65535,538968064,1380533308,62,1480916992,1329791045,1229979725,1094844486,538968148,538976288]},{"sector":17,"data":[538976288,538976288,8224,154,1380533308,62,1,1310720,4456448,0,65536,0,1684957527,7567215,1936942419,7237481,7498052,1752457552,1766064128,27507,1769366852,25955,1232364871,7300718,1735357008,1936548210,1850277888,27764,28001,788557168,1968308282,1275068526,6578543,0,1952531561,1416167525,6647145,892416371,846397497,3749171,1148387375,6648929,1416822842,6647145,1954047232,1769172581,7564911,776882519,5066563,1818585203,108]}],[{"sector":1,"data":[]},{"sector":2,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097409,4194337,524352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65281,0,65281,0,65281,0,65281,0,65281,0,65281,0,0,0,0,0,0,0,0,14688000,0,15744768,0,16285440,0,16580352,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16580352,0,16285440,0,15744768,0,14688000]},{"sector":3,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463]},{"sector":4,"data":[0,0,0,0,0,0,0,0,0,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,1953300480,1818838544,905969765,1853182464,3026478,1275087360,778330479,11822,1866661938,774797680,989855790,1952794368,1718503712,855638127,1818575872,778400869,11822,1917845556,779382377,-2147471826,1699872821,1701667182,3026478,1701402128,1040711799,1869107968,29810,1867251775,26478,134217728,1816199233,1107296364,1918980096,1818323316,3026478,1342192896,1919381362,7564641,0,1107313672,1632510073,25965,2034368581,1952531488,1174405221,544817664,1702521171,4685824,1260419394,6581865,1701860240,1818323299,3670016,543452741,1936942419,7237481,1124088064,1952540018,1766072421,1952671090,779711087,11822,1749221431,1701277281,1919501344,1869898597,774797682,1207959598,1919895040,544498029,1635017028,1936278560,774778475,4784128,1701536077,1937330976,544040308,1802725700,3026478,1392523904,1444967525,1836412015,1632510053,774792557,1953300526,-2143289344,419436805,1006681600]},{"sector":5,"data":[524292,524316,131075,1149390850,1952803941,14949,393252,786582,8388612,8474755,402654208,134264320,1792,-2108685824,2883584,2097192,65550,1342373889,7032704,671117824,234889216,512,-2142240000,1668178243,27749,2004055149,1802398835,1802134381,-2143289344,419436804,738230784,0,524292,524320,131075,1350717442,1769239137,3828833,100673536,201348608,1024,-2125430016,1245184,2097176,65550,1342373889,7032704,402673408,234889216,512,-2142240000,1668178243,27749,2004055149,1802398835,1802134381,-2143289344,419436804,738246144,0,524292,524312,3,1350717442,1953393010,536870970,-1711274496,67111936,-2097119232,33104,1572908,917536,65537,1333809155,1912602731,536877056,33558016,50331648,1631813712,1818583918,1953300480,1819506547,1668115310,1936485226,-2143289344,419436805,1006681600,0,524292,524356,131075,1132613634,1952540018,1766072421,1952671090,981037679,4980736,7208966,262156,1350762624,67108993,-1241507840,117442560,33554432,33360,2621484,917536,65537,1333809155,1912602731,536881152,33558016,50331648,1631813712,1818583918,1953300480,-2143289344,419436804,738246144,0,524292,524328,131075,1132613634,1735287144,1867784293,805306426,-1979709952]},{"sector":6,"data":[67111936,-2097119232,33104,1572908,917536,65537,1333809155,1912602731,536877056,33558016,50331648,1631813712,1818583918,1953300480,1819506547,1668115310,-2143289344,419436805,1006681600,0,524292,524336,131075,1451380738,1836412015,1632510053,3827053,100677632,201359872,1024,-2125430016,262144,11927576,458760,1342308352,738197634,536881152,16780800,50331904,1800372304,7471104,2097192,131086,1342373888,1851868032,7103843,1937009920,1852601207,-2143289344,419436804,738246144,0,524292,524304,131075,1384271874,3829365,100669440,201368064,-2147482624,-2125430016,2883584,2097176,65550,1342373889,7032704,402682368,234889216,512,-2142240000,1668178243,27749,-2143289344,419436804,738246144,0,524292,524308,131075,1283608578,979657071,1835008,10354694,262156,1350762624,738197633,536877056,16780800,50331904,1800372304,7471104,2097176,131086,1342373888,1851868032,7103843,1937009920,1852601207,1784900971,1685285995,-2143289344,419436807,1275117056,0,524292,524308,131075,1132613634,981037167,1835008,10354694,262156,1350762624,67108993,335550464,83888128,33554944,1867809360,469762106,-1644161536,100666368,-2097119232,33104,2621444,524470,7,8540162,939535360]},{"sector":7,"data":[234889216,16777472,-2142240000,27471,3670130,917536,2,1132482563,1701015137,1828716652,1937208180,1835757164,-2143289344,419436807,1275117056,0,524292,524320,131075,1384271874,1835101797,14949,393256,786578,8388612,8474755,402654208,134225920,33555712,-2108685824,3829588,369108992,201363968,-2147482112,-2125430016,262144,11927592,458760,1342308352,738197634,536885248,16780800,50331904,1800372304,7471104,2097208,131086,1342373888,1851868032,7103843,1937009920,1852601207,-2143289344,419436804,1006668800,0,655380,524388,65546,1401049090,1667591269,1919164532,543520361,1713401716,1634562671,1073741940,671094272,134220800,50332672,4292688,671094784,234889216,16777472,-2142240000,27471,2621524,917536,2,1132482563,1701015137,1828716652,1937208180,1835757164,1818978915,-2143289344,419436805,1006668800,0,655380,524388,65546,1401049090,1667591269,1919164532,543520361,1713401716,1634562671,738197620,503322112,134220800,50332672,4292688,369120256,201334272,67111168,-2142240512,402653250,536881152,16780800,50331904,1800372304,5505024,2097192,131086,1342373888,1851868032,7103843,1937009920,1852601207,1784900971,-2143289344,419436805,1275104256,0,655380,524388,65546,1401049090]},{"sector":8,"data":[1667591269,1919164532,543520361,1663070068,7958639,335549440,134243328,16780288,-2108685824,1953724787,1948282213,1073741935,671097600,134220800,50332672,4292688,939530240,234889216,16777472,-2142240000,27471,3670100,917536,2,1132482563,1701015137,1828716652,1937208180,-2143289344,419436806,1275104256,0,655380,524388,65546,1401049090,1667591269,1919164532,543520361,1663070068,7958639,335549440,134243328,16780288,-2108685824,1953724787,1948282213,738197615,503325440,134220800,50332672,4292688,587224064,201334272,67111168,-2142240512,402653250,536885248,16780800,50331904,1800372304,5505024,2097208,131086,1342373888,1851868032,7103843,1937009920,-2143289344,419436811,1795201536,0,327680,524442,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,130946,234881024,134257152,33554176,-2108685824,1143821133,1159746383,1969448312,1702259060,1966080,6160418,-65528,1342308353,1919243906,1852795251,808333600,49,-1711264000,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989871360,234889216,16777472,-2142240000,27471,5046272,131226,262145,8540162,1392517376,134234112,16776960,-2108685824,1802725700,1634751264]},{"sector":9,"data":[1176528227,979723634,6750208,2621523,655368,1342308352,553648258,1073766144,-16775168,33554687,1699578448,2037542765,1701987872,14949,6226023,524328,11,8540162,1937009920,1852601207,-1865940992,335549444,1073764864,1291845632,1329868115,2017796179,1953850213,6649449,2883613,917536,65538,1132482563,1701015137,108,1509951488,-16775168,33554943,1699971664,1852400750,103,1509954048,67110912,33554688,33360,1835008,524378,131071,1954697218,1919950959,544501353,1869574259,779249004,1953300480,1819506547,1668115310,1936485226,1886339848,1735289209,1817191200,1702060389,1936615712,544502373,1143821133,1679840079,543912809,1679847017,1702259058,1699875104,1768776046,153118574,1701602628,1735289204,1125318688,1952540018,543649385,1701996900,1919906915,1124868217,1869508193,1768300660,371221614,1852727619,1998615663,1702127986,544175136,1986622052,1124999269,1869508193,1701978228,1701667182,1679824928,1667592809,2037542772,544434464,544501614,1953525093,1126444665,1869508193,1701060724,1702126956,1701344288,1920295712,1953391986,1919509536,1869898597,237926770,1852727619,1679848559,1952803941,1124868197,1869508193,1919950964,460615273,1852727619,1663071343,544829551,1701603686,544175136,1702065257,237921900,1852727619,1663071343,1952540018,1310597221,1696625775,1735749486,1768169576,1931504499]},{"sector":10,"data":[1701011824,544175136,2037411683,1937009952,1819626779,1819306356,1768300645,544433516,544501614,1869376609,778331511,760433926,139677508,1970233921,774778484,1176521478,191194482,543452741,1936942419,141455209,544499015,1868983881,760433936,542330692,1667594309,1986622581,1750344549,1998615401,543976553,543452773,1920298873,1852397344,1937207140,1936028448,1852795251,1867387438,1852121204,1751610735,1835363616,779711087,1819626786,1819306356,1701060709,1852404851,1869182049,1847620462,1629516911,2003790956,858678373,1852727619,1663071343,544829551,1953265005,1701605481,1818846752,1948283749,543236207,1735289203,1679844716,1769239397,1769234798,187592303,1852727619,1914729583,421555829,544501582,1970237029,1830840423,1919905125,1869881465,1853190688,1867394592,1852121204,1751610735,1835363616,544830063,1679847284,1819308905,1696627041,1919513710,1768169573,1952671090,779711087,1851867927,544501614,544499059,1970040694,1847616877,778399073,1851867931,544501614,1851877475,1679844711,1667592809,2037542772,544175136,1851867928,544501614,1634038371,1679844724,1667592809,2037542772,1746932768,1847620449,1768300655,544433516,1763733097,1126772340,1869508193,1970282612,1397563508,1397703725,1937339168,544040308,1948282479,1679844712,1701540713,778400884,1851867927,544501614,1836216166,1679848545,1701540713,778400884,1701597241,543519585,1667590243,1752440939]},{"sector":11,"data":[1948284001,1679844712,1936421737,1701994784,1952805664,1713401973,1948283503,544434536,1919250543,1869182049,1310404206,1696625775,1735749486,1701650536,2037542765,544175136,1852404336,1310666356,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,1852404336,11892,0,1828716544]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[538976451,538976288,270540832,0,0,2424832,131105,0,538979886,538976288,270540832,0,0,2424832,33,0,827214167,538980400,541873743,0,0,759234560,199535,217712,542001495,538976288,541675081,0,0,3080192,524321,1683,1330597971,542262604,541415493,0,0,760217600,592751,13216,1330530647,1346454604,541347661,0,0,760217600,854895,19392,1330530647,1346454604,541217351,0,0,760152064,1182575,1213,1329877837,538976339,4544581,0,0,3145728,33]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[114409,53,1936607488,544502373,609439556,1702063689,1092646002,1768714352,1769234787,1227124335,1919251310,1767317620,2003788910,1951604851,1970565729,1679828080,543912809,1679847017,1702259058,221935648,1701990410,1629516659,1797290350,1998616933,544105832,1684104562,220471417,604638474,1735357008,544039282,544173940,543648098,1713401716,1763734633,1701650542,2037542765,1953451520,1869505824,543713141,1802725732,1634759456,1713399139,1931506287,1701147235,2019893358,1851877475,1124099431,1869508193,1768300660,1461740654,1868852841,1931506551,1953653108,1713401973,1936026729,1547321600,1296912195,776228417,5066563,1397575491,1027818832,1413566464,1459633480,808537673,1229073968,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1751349340,606350951,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143703040,-402357272,113706009,41550080,567095476,-402496862,1488454604,40084311,42010310,20113408,1491619996,1939691524,1765703721,292880386,91555900,-855580696]},{"sector":10,"data":[29081120,-855581976,1963473952,54847493,-974600725,14870529,113688043,-2147417495,164158,-1763114123,41281536,184712865,-1106283328,-1930952704,43640834,-402652226,-2118516093,19851266,37560947,-1173654272,-2118254316,10872834,138275051,-2146667264,50487870,-337115789,-103290110,8390343,-2086925056,163390,113116788,38135808,-402230371,1374224472,45869311,-1962931778,855827398,-2147027264,58003458,-402512152,1369178734,-402500632,-1655110757,1203242610,-14030505,-1849817373,2484225,-1157686295,1102316120,-474078771,17950726,1001707147,1303650765,1286873549,138158541,1891500917,-1073042431,-796260236,567083700,229831659,-1308622104,-855460854,666551073,-1576760575,162791757,1052385741,-855002111,201898017,1807360461,-855002111,385663777,40083719,-1107231069,230228475,1765703680,242483202,-1962801474,-17922,-1359822797,-2134912521,-1967115520,96535045,2116878339,671251968,-1967115515,-134002939,-1951789648,1048619713,1962934889,-853953524,-1270807519,-377246918,-1163595006,-661913082,113754254,8389228,40771212,40896199,512491612,113705586,7078516,41295500,-1090485826,28835932,-1088303831,28835948,-1155412695,119407210,-1996477279,106044935,2877523,1763523,-1073042346,1555168117,1963735118,313083,-851725222,-1962112991,113165298,-2146137598,246694378,1438851533,-326898549,-973332908,118884470,-1951498611,792505567,1547438196]},{"sector":11,"data":[977011828,-544537739,-1073042877,1586097013,139904428,-402366780,1601372264,74711612,1450509116,1963023336,142525521,973175936,431229300,1090789837,-1398064460,1950039210,1975519749,1555058422,-29018074,642711925,520045960,-1960896938,-1431524234,-92946422,-1006086459,434635870,1931435520,1946303502,1963146244,3964933,536457077,-1034033781,519569416,378285653,-1993473787,-1207892186,567102208,85364270,646655489,526188807,-1960966461,-1962771426,-850873141,-2017423839,-1912440314,871773144,-773729793,-52309535,119514611,914955971,512623224,-13237638,520255518,252006595,-754667264,-1260876824,1914817864,868257300,-1547684865,109838949,-1414856089,-1949158568,244040698,65208935,-1962932504,-486376946,-1262383610,-1021194935,-486525720,-1041752535,39369470,1018480947,376578509,382064779,-91553179,-2097001077,1085539521,1051992525,-1323359795,1488634625,-851332094,-993789663,-1946000066,637854657,-1023259253,-1191056193,736624648,235238400,31309343,76275596,21865006,-695476338,-851246920,1931415073,17414664,-335707160,-171981845,375041,-1910110442,855649310,-212381194,1952014246,-1073042420,1015085941,200176896,519881673,33996551,567089588,-1196801788,-1951704006,-1261292553,-1105081017,-474021370,178957318,-1325763136,-29083556,-2008153739,-24379580,-1409156162,1975519914,96729338,78710943,-661919533,1253312278,-4513331,-850873089,507194913,158531843]},{"sector":12,"data":[-402636056,-1226179368,1048653564,555745409,724447861,771818270,8521414,784347936,738231200,1997093936,113651223,-1323302781,199283468,-1207732800,-1019542528,-668268941,567101620,507843,79629803,-2143387648,57933824,516145203,-1615278452,-754667256,-1896872984,868234206,1279033846,-2129693361,1330053756,-1207039883,508561278,-1021326505,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1330073420,855687401,-1597993280,-1574567911,413139984,-888091392,5242880,94373280,1073741824,236959744,1919117645,1718580079,1767317620,2003788910,253821043,1936876886,544108393,825241137,1125582848,1920561263,1952999273,694364192,1667845408,1869836146,1126200422,1869640303,1769234802,539782767]},{"sector":13,"data":[892877105,1092624430,1377856620,1952999273,1699881075,1987208563,3040357,1766660109,1936683619,544499311,1629516649,1734701600,1702130537,543450482,1684107892,1918987621,1718558827,1667845408,1869836146,1126200422,779121263,-67108864,-1912534808,-402643962,-890765127,437684992,1139441664,2102827,2102827,1049350659,1122500636,473860864,507380480,2269440,-133961519,6154319,-52202166,-1979701570,3932484,115869044,-1191908608,-53805030,869305261,-1258310693,-1408185086,108314634,281874100,-54266389,-1093520814,-288292828,1707659,-1960384047,-775649787,-1966550584,-1058635532,171959424,-2032760094,-421352508,1524462926,844299715,2408146,244051665,-372178918,-2046457050,-775892540,-2131719488,-64748570,-695549430,-492059514,-562737433,-1094452134,313524743,1713910,1040447627,314245152,-1340019968,438760978,438209280,1139507200,512475907,-338624478,-125058301,2113067,-1593830725,1127022618,4438272,-218086471,1274545060,-1262226571,-1575957233,-1070399464,-1608073074,430048272,-1462700544,-167217872,653206736,-1207693150,281870342,-1223688008,-1206858495,28774401,12783821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-12648448,192,-1006682368,49407,-50393344,50331648,-251658241,0,-49408,49407]},{"sector":14,"data":[-15794176,240,-15794176,252,-256,-3841,-1,-251707408,0,-3932161,-16777024,-1,-16580416,-50331649,0,0,0,-253,192,-1,49407,-1,-16,-251658241,16580415,-16580608,-1056979969,-49408,-1,-64768,-1056964609,-61696,-12648256,1057014015,-50331649,-12648448,-1,-16776961,-251658241,-1,1072758783,65535,-61696,62980035,64767,-251719936,12648195,15793935,0,0,-65536,16777215,16580355,-15794176,-251723536,0,16715520,-12648448,49407,-1006633153,-12599041,0,67059456,49407,-16515841,192,-62980096,16580352,1057029903,255,-12648448,15793920,0,65295,-49408,-16776976,-3932161,15794112,0,-3932413,1056964800,252,0,0,65535,-251723776,0,-1057029376,61695,251658240,255,-50331841,-64768,-1006648321,49407,0,-1056979969,-50397184,64575,0,1069612803,64767,12648192,0,-4129024,240,-15794176,1056964608,16777212,-786673,-3932221,192,0,12648195,15793935,0,0,-15794176,50397183,49407,0,-3841,15794175,16715520,-62980096,1069612863,-1006648321,-1056979969]},{"sector":15,"data":[0,50331648,-1,-16129,49407,-49408,-65296,-16518913,192,-16777216,-16,61695,65295,268189440,-3841,-3932413,12648387,0,-16580608,-50331649,0,0,0,-65536,-1057029121,0,-251723776,-1,251658480,255,-16516033,66912255,-1056979969,49407,0,-64768,16777215,64575,0,12648195,-12648448,12648384,0,-4129024,240,-15794176,1056964608,-65284,-16518913,-4128829,240,-16580608,12648387,12648255,0,0,-1057029376,-1057029376,61695,50331648,-251674369,0,16715520,-62930881,-49408,-1006697536,-12599041,0,67059456,50381055,-16518913,192,-62980096,15793923,1069612815,255,-12648448,15793920,0,261903,16531212,16776975,-3932413,-50396224,251658240,-16518913,-16777024,252,0,50331648,-1,-16531201,252,15793935,61695,251658240,-1020261121,50396223,50396415,-1056979969,-49408,-1,-1057029376,-62980096,-61696,-12648256,1056964863,-50331649,-12648448,-1,-16776961,240,-15794176,1057174284,-16776964,-16580368,12648387,-256,12648447,12648195,16531200,0,0,-16580608,12648447,-65536,-1056964609,-251723776]},{"sector":16,"data":[0,67047168,-62977024,-1069613056,-1006697728,49407,-50393344,50331648,49407,64575,-49408,49407,-15794176,240,-15794176,252,15793920,0,1057029903,192,0,0,0,0,0,0,0,-251658496,0,0,0,0,0,0,0,0,12648255,1056964608,-1056979969,-16580608,15794175,-64768,65535,-15794176,-1,0,16777215,50331648,-251658241,-16777216,-251658241,-1,1072758783,61695,-65536,12648387,-253,15794175,-253,64767,-253,-50331649,-15794176,15794175,-64768,-251658241,-65536,-983041,-1,-12586753,252,-1006633213,-16727809,50393343,62980095,-1,1057014015,61695,-1056964864,-49408,65535,15794175,-1056964861,-256,-3841,-1,-49168,251658240,-3932161,-251719744,50331648,-16515841,-16777024,-64528,-1,16580607,-4128769,-15744769,240,16580355,61695,251658240,255,-1056964801,-12648448,-1056979969,64575,251658240,-1057029121,-62980096,65295,0,-16711921,-15793924,16531200,0,-16711921,240,-15794176,1056964608,15794175,-256,-4128829,240,-16580608,12648387,1073495808,16777215]},{"sector":17,"data":[-61696,-12599041,192,61695,50331648,-251674369,0,16715520,-62980096,50396415,-1006636033,-1056979969,0,50331648,49407,-264244993,0,-16777216,-49216,-16580368,192,-16777216,-16,61695,65295,1073495808,-15793921,-3932221,12648387,0,-16580608,-1,15794112,0,-251723776,-253,-1057029184,0,-251723776,-1,251658480,255,-15729601,67059648,-1006648321,49407,0,-64768,16777215,61695,0,15793920,-50331889,12648195,0,-983296,-251658241,-15794176,1056964608,-251722756,-16515841,-3932221,192,0,-253,1057029375,240,0,49407,67108611,49407,0,-3841,15794175,16715520,-62980096,-256,-1006697488,-251674369,0,50331648,-16727809,-12648193,65535,-241,192,-4129009,240,-16580608,15794112,0,65295,16531200,-1056964801,-3932413,16531392,0,-16515313,-15793984,16715712,0,67047168,50393343,-62930689,0,16715520,61695,251658240,817889535,251722815,50397183,-1056979969,15793935,-16580608,-1057029124,-251723776,-253,-1,-16515841,-12648196,-251719744,50331648,-16712449,240,-15794176,1057177356,-16580356,-16580356]}],[{"sector":1,"data":[12648387,15794175,-1056964861,12648195,16580352,15793983,-65536,-65344,16777215,-251658496,-64768,-251723584,0,218042112,-62979265,-251723776,-1006697728,50381055,-1,50393343,49407,50396223,-1,16580607,-61696,61695,-253,15794175,15793920,0,806158095,16531395,12599040,-3932413,50331840,-251658241,-16580608,1056964800,251658492,-1,255,-49408,0,-253,240,61695,251658240,817889535,0,0,0,0,0,0,0,0,15794175]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[2120269,358,32,720896,-164822912,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":9,"data":[817766158,-3768063,15106305,1312588286,-1938918075,-795936040,-1946425717,2085293660,-773598939,65262051,9118300,3308675,1153893749,-1962931918,-377277876,-1931422972,552567759,1552676867,897338134,-472783919,1543758801,-1962898654,-377277876,-1931422972,552240074,-11350013,-544336780,-1048457589,216728064,0,0,0,2025675,1314014539,1112888403,1917132858,544370546,1769108836,1646290798,225734511,240788490,-855002081,1275181089,4858317]},{"sector":10,"data":[279886,19923026,1991,32772,512,91365,0,1,4195800,4718664,5374034,2,262144,0,0,0,1994326105,1994391616,1380272902,4998478,23330816,23341313,1895905501,1390215425,21984257,822169562,1367933265,22129921,-754888359,1366294865,22146561,-301903335,1645805921,23217409,520184593,1659371875,23252737,-738106622,1658716514,23276289,-687775129,1667236193,20327425,-1677642258,920977718,20153089,-1493092648,811139382,20986113,-1224657231,917766454,20412161,1224816641,1061290304,16923393,1140920456,366936345,18193409,872486218,382533910,18448641,-1593764353,804651311,21282049,453068047,627507528,19303425,855714467,708051243,19646721,134293792,1112146216,21137921,-268352889,1144717635,21240577,-318694868,434438425,21715457,-251573457,1259340106,21627905,-469677514,1243021641,21618945,-1476310471,1250623818,21666561,-1123988901,517341476,18132225,-1744758372,277348628,18821633,1409359566,627441977,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8978431]},{"sector":11,"data":[0,0,0,0,0,0,0,65536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1230438400,1313418830,1767309385,2003788910,2035490931,1835365491,1936607488,544502373,1768169472,1763732339,1749221486,1701277281,1936278560,218562667,1952531978,2017815649,1663071337,543515759,536879165,1667331187,1986994283,1818653285,168654703,112640,-326412853,-1962349437,-1070922154,-1980217719,1589967446,1200301816,1191912980,640381974,950147,642917492,-15828993,1996424310,214558724,309706763,-16482685,1996425332,-401698812,-1070905270,1996453867,74907398,-1996044824,1451883590,75400190,-16222977,244319350,-1958204952,1175190598,-1002146562,-148440994,-2147480505,1996428404,175570694,-16222465,1996488310,570222844,1996436459,119597062,1996443730,142016266,1323830928,1996443694,108461836,-100609,317258870,-1005655262,-148440994,-2147480505,1183549556,1575324422,503319234,1430622296,-1910575989,-1561558568,1183536640,198322956,-385649214,1996423353,175570700,-85455216,-163149497,-1962260989,1183386710,-229209616]},{"sector":12,"data":[-637301,-1072957874,1589908852,126494448,-10582392,74734652,1500854844,-940554497,63046,-1024316,-1977159610,-62486521,74760202,1114975804,-10189171,1996443670,62253302,199902857,-10652224,1996426358,1686539530,-1202710785,-1873795072,391964686,-10320247,-2092862144,16737982,-2037699724,2028601190,-263258365,2122352363,175268348,2063367808,1182794871,1988878588,-163119114,-1996732790,-335584126,112779,-16560407,-890762634,-364476155,15367811,2028536692,1656160002,1656160255,1686539775,-397404417,-2037834413,-1072955552,-1224798347,244383586,-1203322392,350814219,1623098115,242549247,-10307841,-1410855280,-373281978,-1769274625,-1070858400,-1981528439,1589962326,1207379684,1971322892,1333798423,2122514956,477495048,-16351613,-397273483,-991230359,652500676,34359286,-1224800652,-336855200,-10438913,-1995683096,-1072960954,250151797,-463551487,38258470,-1960411136,-768923577,-10445173,-745813717,-1980217719,1317665366,14084584,15367811,-1108802699,-128007168,188189478,-385649162,-1224802128,-1224736928,-396951710,1183385364,-229209616,-1024316,-1977159610,1183422471,1996444406,1558728944,-364476158,1836433419,-10189171,-1945483639,317394006,-1024316,-1977159610,173982727,638207743,1183516552,-162594826,-462045173,-16097596,-970585530,1586179591,172424970,1158137382,-16097653,-970585530,1586190343,172424970,1158137382,638213771,-1929377850,385836166]},{"sector":13,"data":[-18352,-1873784167,-37754866,-336968055,-361300218,-2096934424,1946217086,-361300215,-1996206872,1589963334,-129596424,-364475646,-16283354,1589962822,-398029852,507984166,468255606,1204233983,-2097151742,1946217086,-463551375,478118694,-9997312,-385916746,1183385304,2126515176,1620478798,-994038785,-1960385442,1183392327,-296318484,31999687,-463551488,652756619,1914455865,-329333707,71824934,-15240128,1358913718,-10307841,-10307841,-1995875608,-1072960954,1191122036,-330923032,-2083853558,1962993790,-364460283,2122514432,192151786,-10438913,-10307841,-2094596632,1946217086,142508845,-2096204289,1979647614,-1983894776,1183385670,1354771206,-16222465,-1224800650,-1224736928,82378594,-364475908,-1224799765,244383586,-12286488,-385916746,2122522194,57934058,-16725015,-385916746,-1041691990,-364475648,-10451319,15353543,735087360,-465139264,-2082056567,1979648126,108954394,-1005292033,-148446114,-2147480505,-1863777419,138840573,-1006221687,-165223330,1946291271,1622605647,47835391,-768375,-385916746,-1224801810,-1175912608,-163149563,1962934589,-193528026,-16222465,-1224800650,-4653216,1760055551,-364475909,1182121995,-10438913,1810370192,-12850422,-385916746,854262277,652500676,950147,-1224796300,-14221472,-4714889,-397389569,-1073018833,283706229,1622605821,25749759,-10438913,-1996332312,1183574598,-310157590,535137026,147475805,-326413056,-1960945834]},{"sector":14,"data":[-1590819746,-1073020920,-1064428428,641633062,490219008,-985200011,-880081290,108308211,434470,1595924715,1575324510,1426065090,1465314443,-1962522994,954401870,915088969,-1070399484,-1072976858,-1053087116,-936692353,-1406740341,-361496516,141885244,-472780029,-554962173,-472792181,-670833711,-670833711,-823397629,1342440376,1021841040,869413725,641526720,1946172588,1020890091,52393215,652464627,-1191087989,1342636031,1625837905,198324999,-1949469504,-339309616,-1014263790,-472783919,-472786941,-1030957053,1593917581,1575324510,1426064578,1465314443,637826756,587299968,-1910622860,915081310,872153126,-268194624,-1409104253,-1962639676,641655752,276104504,1973875527,-611537653,140392735,1357602420,-964431613,652012290,852003500,860244461,651201472,1009790124,850884361,-1327985692,65206026,-336928061,534481971,1963482681,-17633,-1207417202,-1960443860,100671510,-397258669,-1910635922,200313818,529298882,2930768,1342732031,1476591592,-443851169,442973,1475119957,-486257013,650219075,132855,947224576,4096294,1967476224,117384751,-1960443902,637544510,1969803,-2128208157,526,-14265984,-3872715,71732825,-503134333,914433776,-2147483646,1575324511,1426064066,-1957172085,-1070398386,-1047638045,34010918,1971322880,1048651332,1162739712,-14271627,637534734,2637451,504269606,640344832,134785,106004480,-399114458,1963458497,-14285301]},{"sector":15,"data":[130869301,92874247,46629721,-2128157470,566,-443850880,180829,1475119957,-1090107762,-768409580,38112038,309641227,104696614,74907472,-402360577,48432579,-1956657269,79846885,-326413056,637814414,-1459614559,-1064566781,-1960440460,184551454,637826267,-1962391669,1575324616,1426064066,1996483723,16377860,880066571,-2128166770,1308622910,1210414149,-1591295858,-1073020927,-1064428940,4096294,1950699008,-1195363569,-1873804282,1527900174,82559027,-277561333,-443823989,180829,1458342741,637814414,788215,729120768,440304422,594804736,406749990,460652544,303467302,512435712,-620036088,52823156,-494860713,-1993932802,637540374,1709707,1614118,-905197429,-1185935756,1376190463,-186101423,65755140,1578107064,-1034033781,-1957363710,139365356,-1054734416,602931387,-787516199,-773074453,1022087659,-2147257088,20711627,-880802955,281146884,-880802956,-1949158654,1317733958,-788077820,-489500192,1347572730,501747344,27807832,-397409163,-1957036025,113401317,-326413056,-1878755585,1491331086,1575324562,1426064066,1317792907,1361044228,201319144,1209496768,1346420878,84342310,125043712,1381028403,-401791000,1996446189,-401698812,-443852765,180829,1458342741,172396119,-1962510709,-1960441762,-2094661036,57999420,1133537515,-1960437131,-1157625322,1376166912,-1873587706,265611278,1124746894,1475019381,344663627,38570790,-851312456,-1958186463]},{"sector":16,"data":[67437638,-1152186880,-919404521,-397324205,-1940127992,-1907286055,872362944,-1425766464,1149747851,1317776130,1377764868,1068816267,526000589,-1053093518,1381174645,1543451368,79220875,855960320,1003523008,108267614,-851528624,1583306785,-1034033781,-1957363704,-1906878740,2123040326,650130180,637685131,1962950019,1360519961,-17438639,105287257,869830174,530949622,-401698735,1583306567,-1034033781,-1957363708,-1906878740,-1031010234,2793766,1594115587,1575324510,1426065090,-1000936309,-1960442762,-1960442788,992347716,1962936374,1048587815,1962934414,116860428,8388620,-880802956,100869648,124911634,268829478,855995136,-1874269248,1963115510,113849148,-397324205,185073184,640971968,638080137,-83598208,72122406,1220643842,-1993949042,-1912602354,-1036304191,-165277836,1963983940,-1873803768,1463347214,1149969927,1589644040,-1034033781,-1957363708,49054700,1183733590,915088900,-13434846,1207860873,37651238,410255616,137792294,1686119936,1443297540,201279720,-10652480,2146172486,473840422,645428992,-167486325,913653955,1963115510,281278013,-919390092,1364284166,134055912,812962315,139757862,73695270,1283467003,-1064566268,33984046,651856640,-1064433783,1443237099,201258216,-16157504,-964428218,-1460975862,1183432755,661934078,638250627,33834230,-1960382860,1342572612,134062312,138709286,74743846,-1948652798,-1072955834,1598554485,1575324510,1426064066]},{"sector":17,"data":[-326898549,-950577656,129094,101349060,141885222,134044392,695582731,650130182,1342731519,108330790,-401698736,638014843,1946698809,9103619,1962878470,-47060984,1958742791,-28931600,639522310,-1962771317,1580795486,1461875716,-2114290039,1047142,-271383375,2122971907,-611427844,872302222,-50383882,1340843251,76228240,-1960390093,-788516338,-489500192,-1949660166,1107343568,728900045,1586417547,-1261292546,1914817855,1975597854,1157047834,1946222596,-1927342566,45742678,-851463168,990147105,520647873,-1070397602,-1962856215,-1907818938,60892864,-754667264,1959209952,-28930550,-1070348149,531297276,-1960442018,19203140,-385649664,-1960443725,184551486,638153983,-402098689,-125043601,519980686,207523414,276107,-1392721869,1726204043,1946172588,768758,276102972,956302266,460589126,-506334973,-538185469,1963719299,108822542,-1973783318,1178142788,189953288,-1958906625,-27751462,507478310,638022744,-661897343,-2144982411,1972372095,33879587,116790901,1946288140,17102359,-953806220,-342847481,552308747,-1207450074,25135398,1946417795,105170444,-2017227542,1552484700,-487455993,-9180777,1577862798,1283466783,-148503548,67652,-1960440459,50347550,-970586018,637599559,2498187,1418405443,-2118110460,1946157538,116794894,1946288140,44049926,-1949762048,105449550,1996443987,-397258498,1451971920,-95515652,201213579,-1956749376,180510181]}]],[[{"sector":1,"data":[-326413056,1443556483,-1983892649,-789054394,-1895938423,1988823622,958811656,1979718710,-1947807413,-773402146,653460454,2242051,71628582,544474112,136219430,1207313920,343229444,-17658,922691078,1397948430,134196968,343195659,73173798,1963115510,1443255053,1543260392,292929547,-1007272725,638219268,-1995946869,-655755194,105286400,1208513600,1963214393,638905124,661131,111411387,1376145926,-401698733,-1996027106,1183448646,-49916,-1326906507,1443235328,1342732031,-402360577,1381104965,-89003952,1526224521,-1073019047,-1960398732,-1007221668,-1502347008,123777,116809353,-27358378,-1911851709,653364162,-96040531,-1991558421,-506332594,-506338863,582504787,1356542720,244339027,-1991084056,-397345722,1532623459,276086795,869830174,-851462958,829562657,762691899,-963709389,-16091393,1443298422,-362753,1996486774,-25755658,1342280168,-1862502657,1385031694,185032280,-351374144,-339725564,1996424938,-99227400,-28407033,1225815105,1946570297,-1948677366,-851528504,-1950250207,-1956749368,146955749,-326413056,134647342,244000256,81985542,-169098866,637814411,-1912600925,1048784576,1962934282,1048782348,1946157104,178466308,71731968,942594867,1962970654,-1873587439,1392240654,185597416,-1962707776,-443874234,180829,-1897100459,-1960442810,771753494,956303521,125109318,135694638,185920256,-1911524160,111224512,71710976,-1993936523,-1912601066]},{"sector":2,"data":[-953809850,6,244319744,-397285144,-443871314,180829,-326412987,49054494,1996445526,-129505274,611631115,-244087,-2031551370,-1910606345,-1960379322,184551454,638022875,-402098177,1996486969,-8328964,1726726195,-62484848,201782822,-260832768,654067342,532107,142081830,-402229505,962263313,1114965590,33984046,244000256,-1910112252,855639558,-61436965,22493478,-165276555,1946420551,1200301581,1975520010,1086360589,-1910109973,-522057657,1183760435,512435964,-1993998328,-1070397369,244338768,1599207656,49120094,1562371467,182861,-2081649835,1465258220,-1962117493,1309347406,856978704,-1949748270,28836958,1914817858,-94992071,-1946663287,-1073017274,1183530101,1975520016,-95515855,-1946659189,12059742,1914817858,521543189,-1175431539,1308688392,-94993416,-851463168,1920081697,1853210939,-225748970,-397409045,-1064372169,41716518,105155366,1317652787,637776380,-486454238,1552623186,32211716,-472824718,306613766,673055526,529212928,-27358969,434832098,-15567105,-397409162,1996486940,-397389058,1586230597,1958743038,-397389035,-1030818655,4096294,1967476224,-62455974,-1070377493,637601257,-486257526,308186101,1962932608,-1950118184,958811097,1979718686,-472821535,-472792181,-670833711,572392230,1207313920,259276804,-689417466,1963043064,-1863823343,101444599,74907473,-402360577,-796132333,1353442136,239504210,192266251,1317785740]},{"sector":3,"data":[1359274768,-1896387864,638038976,-919397342,572916913,1364394316,-402098433,-1064372397,1482316633,1946352512,66813998,-75479948,-1206815739,-964493311,172949256,-1226243202,-1872368642,19269091,-1947669755,495396568,1967389579,-1948455946,1579416670,-483494650,352396805,-628371989,-1960999130,-160087045,165921259,637862182,-352168703,651725750,-1993990777,-74775979,-336431805,638182310,19272961,-1679032763,-2027496821,1166616093,1140558846,-1947471243,-443851169,1098333,0,0,0,0,0,110046876,-13757646,773007926,321783439,741801774,110046739,-13757648,521348662,604423982,-352321517,-617377759,1342504888,-1058533744,110046800,-1892805842,773009414,322045583,774800174,1430585875,102689931,1347637586,516173563,-919399634,38767142,-1152369181,1359413247,-1125625005,-196704000,539920686,-87693293,1515725795,74760763,-165025710,1499158608,1562314586,922693197,-13757646,773009462,321795839,646704079,-486322294,-2084555968,958792899,653817095,-1157478514,1359413247,-1590799533,61936430,-31135533,788416135,-15520093,1827143758,785048570,-15519581,-790036874,-28931595,-352303361,66879648,1532730231,520575577,856651101,922693357,-13757648,101920310,-315372717,125166602,820514448,-32117779,101283276,-401698733,149619958,-1873607086,15919118,774831918,-1064417261,651899712,1967996800,1334519342,640213761]},{"sector":4,"data":[67454966,-1960435339,-771028393,-1047651980,1312784678,638612805,185098123,638088411,1963480889,-1010660606,-4629928,1381061119,-308811440,-1962742397,1297948645,-1957345845,1465261804,637951684,16001,963986766,69090086,1259172608,471743270,-1960152320,367739339,775913766,1260287440,109019174,856847594,1334453961,-17912,1381126406,-335970584,1606690321,-454556153,1249437940,-398283032,-1031058819,-310157729,535137026,80366941,-326413056,142001238,-1190764917,1451950143,179054084,-16223040,-2009709614,921887239,83910,1586217867,918760198,-1956771960,146955749,1430635264,-2095125365,-11124500,-2031613322,-472763405,-2081387729,1962936446,105286405,1586306539,16759486,-15382086,1996425334,-397257978,1586364311,1393972926,1458680040,-250353584,-905197429,49120094,1562371467,445005,-326412987,-11053538,921177206,-1910119437,171346904,-1966525696,149521164,-1006078835,1312491646,-1962640378,-62323122,-1527529077,378406,1583335563,-1962742397,1297948645,1157630154,518818645,-402229505,115602165,-1591295858,-930414590,-1962742397,1297948645,1157628618,518818645,-14788778,-722990474,-1073018893,-661777548,-1962379637,105286654,98814091,111473660,1606978335,49120094,1562371467,445005,-326412987,-1590798562,-1073020916,-256167307,541112577,-1873588143,1268705294,-1959870322,771755038,788108,2001190,441088,-1929364039,-1993996201,-488994025]},{"sector":5,"data":[260646646,-1960394610,184550942,638219739,184549537,-336759360,126559929,434982,-1946517619,1183579742,1958742790,-397408760,-1962413249,-678691624,-1951745872,-357520445,138841002,172395435,-1933407317,197692354,-310157366,535137026,113921373,-1957346048,777461484,184552609,-1910410048,138820544,-1591343500,-269811712,856063627,-1414792000,650611627,394887,-18261,-2090874741,-443874579,-900899553,-1957363708,1381061612,73319430,-1203797978,-2144991628,343264319,926492227,-695529867,-1007233229,-2046659583,1065953010,1532582407,-1034033781,-1957363708,777475820,931583,1361634137,-1947036952,1451951686,922691076,-1960443892,637537854,-2096083573,-521989433,1974465276,1435051739,-1946948610,2123040374,1220971268,-1977171826,637535518,184552097,-1962773056,109979334,-2128216063,1308622910,-165907131,1165296835,572427046,244000256,199426076,138885414,-1014822796,-369761782,-1960443518,-1024064425,653554692,1838635,1396824567,209059595,1042189094,651756288,-47162,29554267,-135724171,-13761024,1493175350,-1047642909,3604262,-1176816896,-1014824899,1065362952,639858104,1963030329,2139694621,1979648769,870287125,-1414792000,650611627,394887,-2082502741,-756938517,638042603,269963,-15997902,-397003915,-91491929,204901158,244002304,-818216946,-1993471883,-352317898,316903445,-242620335,202279718,1976515328,914958065,-739704820,260777472,-160118518]},{"sector":6,"data":[-2147302525,-244055811,1962933632,-578137282,-315424974,-1948004021,-773598765,651822051,2235907,-165227981,1946289223,1468737028,-165258488,208929287,141873675,2013210194,-27858943,-503069821,850324457,133572333,638743554,-368672896,-14283915,-14284425,904398711,197362686,-1913920542,91619083,73891878,651267067,269963,168790822,-2092337975,-41942333,-2131659776,175439869,-654054094,-654057007,-315432213,109019174,639792618,1963554617,1979648796,1200301588,1204233735,641715462,638080904,-351713399,2139694596,197362441,-1326722334,-443851169,311901,-326412987,1089241886,556675,1586306164,1269283518,-16222465,1381172854,-1912884504,1393999710,-318904240,1996424939,-278140922,-310130549,535137026,80366941,651725824,283316107,1963042961,-1909550325,-1962933730,-644967649,40894246,-326412987,-400664802,-1072959429,-1070387340,84342310,628360192,1460043403,201734438,773158144,923271,202803494,1300964864,310218000,1085010940,235310886,-310157568,535137026,46812509,-1202103552,1364214016,-1957345965,-326951188,-984132016,1183516758,1977879046,-1958890494,1124120824,108143053,567134091,1183648627,374480558,786978640,1608026884,49120094,1562371467,445005,-326412987,1424786206,1183536982,281343494,41172404,1183399092,122091260,-966560640,-989726138,-167049098,1015094645,393561422,136220206,171346688,173968384,-1945602423,1187450446]},{"sector":7,"data":[-402579956,1418532783,-1949748472,782040134,8003327,-2115435661,-1193768192,567105280,119456651,67585782,1413024372,956855556,58000972,-1274966551,-383660738,1992622263,142525452,1426619789,-1962783768,1190551037,41157639,2122972979,1958743034,142001473,772306061,5455488,503936000,777395798,7479039,17254134,-617413260,-1962846231,122091222,-1207470832,567100160,-919401358,-839104885,-385650143,71041262,-907476110,-92372992,-1924238080,1183558238,374480636,652759123,-49917,-1175911564,244002304,836960264,915134862,1955397642,-1928915448,-1431524738,-92946422,-391479667,1992622482,178957324,385512896,-1437168353,1183566131,1931595260,142001605,-167218035,1948256070,1048587881,1946157139,-1965345951,1105952796,-74753934,1962991336,-92372984,-348818176,122091040,-2146732672,1946221182,13821957,-4245269,-1125627905,-1946520320,-2009004857,142525444,-1962181235,19196151,-1431505017,-92946422,1946204648,142001425,856183949,-62485559,544416205,1992657899,38045960,-335544392,2126811251,142445832,1988960022,-397061974,1482490128,142001232,-1190626163,-1070399489,-638079246,637976963,-2144465784,21310,-1977215884,537659460,-1952947924,4319480,41156789,-2010724866,-1201995412,567105280,105679142,72648998,1107773174,1051989108,1190535629,175374855,-1928825147,1102317652,-1014292019,-310157729,535137026,181030237,113408,-13740205,1006660126]},{"sector":8,"data":[-843398398,3729473,-1186873157,703270960,-402575942,521011242,-402573894,-1514527328,630908993,-398349152,1052448316,269531393,134694646,297337716,627107856,-1023409480,-400617732,1589912945,142052616,-1576760794,-1574026836,-1064566706,957120196,108334662,41286459,132710027,-1960901120,625928663,-1178586372,-544473089,1094823666,-549725705,-1977216140,1547501381,792464244,977012596,-347143308,872203241,24936685,-1408273094,740297798,1006924385,-385386983,431227012,-796253747,1090831102,1470839476,-1976607557,1959213572,1958951472,-1430025684,-142091892,-661733236,567101364,-644982926,-1070401657,-218103879,-1977200722,-952434875,-1019607180,-1014365324,-1949748310,-1019564841,-952499084,-2144978315,1950023549,1948006408,1950103588,-851819232,1994596725,1996683648,-906080492,-91499660,1166681679,1958951679,1966750920,-1070376717,-1979669527,-1175737661,1987362826,-311287748,179047287,1013675200,-336104416,1950039264,1949973724,1949056216,1954299092,1948990672,1950104780,1950235848,1948400836,1952136384,1952267452,1950170296,1918975156,2004499462,-18873342,2012840129,1017815927,-33131218,-18773307,16613580,-109047692,-1977256180,1019488961,-383944956,-108986549,-384469240,-41877693,1996780545,652315147,-997849720,58048523,1040148201,-126418936,-1915737256,-1056767161,1438892547,-326898549,176079876,-1979807256,1183644798,918892286,479068216,2891406,1015084595,-1386843136]},{"sector":9,"data":[1967214653,1413328139,-1408928440,125058364,1975519916,-991695877,-1431566722,91503420,-160055286,643608654,1979598136,-2010755327,1444872005,-1392740667,1975519914,106350074,-851246920,-1962577375,567084102,141762398,1962949760,-18238,-1034033781,-1070399478,1309050414,-594818304,-1959372970,2133066823,431228533,1090789837,-164208860,1971323975,-1740559329,-13373301,1023240936,113155,-2092496268,-260695553,-24391117,1090832267,1583299252,-1979710774,-771444256,266633448,1009790981,67270201,972849159,-998243466,1430635271,-2095125365,1465255148,-1877969153,-7149554,-990226807,-1951725954,-2136469434,-986826379,-1912588234,740199964,-1376374016,745848842,1967477821,1295887627,-1408928432,125058364,1975519916,-2132481029,1966735740,-1404088574,141869066,-1325864022,199993982,645815480,1979663672,-978628863,62458998,-1073042432,-492174476,173444088,108384779,567094452,1451872563,1107523068,-963970837,-1409329944,1323877002,783854591,1303948116,-1070355632,172374442,1455768437,1048587782,1912799312,861647886,1931595209,1951415330,-1205474551,567100160,-276625038,-61437175,1018424130,856782082,-851659575,-1962315231,-851528488,-1878594783,1183432755,-62485508,1610241675,49120094,1562371467,838221,-1607548877,-1073020786,-13743499,1493174326,-1047642141,104267558,512435712,-1960443870,-486532082,1207379690,1962934532,1207379485,1961885700,1468737045,264405766,-355341615]},{"sector":10,"data":[-355341615,41140795,-1014775157,-338238966,1064757438,-326412861,1447488643,-1983892649,1178205254,-989432826,76153974,-28931776,956980875,125044830,-164373618,378555371,-1166635745,1085920907,173968128,567099316,-1053085070,1015098994,678779469,-1958851445,-1047839660,477413899,-851312456,-1189776863,-695533504,567099316,-1053095310,1015088757,91505998,-672546765,-94467838,50625675,1284179580,-772209892,-2080832543,-506395967,1284241667,-772209872,65130977,281510905,-1191281149,-617414649,-397191344,-1072961444,2116760436,-62486018,-1946369906,1580857950,-1959889656,1141048388,-1174918394,-1054146496,-930372365,-678748410,567099316,1972176754,1958820800,-59310324,870877416,1609121984,205846274,-311091200,67271808,-13375620,-67092295,-1960401677,855645198,1049175744,132317218,-1515870811,653910699,2494091,604908326,1049175552,-1527578588,672041766,237708800,-1993998298,-1409276354,735611818,-391362101,1269443041,-1527515019,705596198,237708800,-1993998296,-218093506,1049175716,-1960443842,-1342170098,648737791,3948169,470715174,-1207049472,-617398323,-1817458690,-119368789,-1934901197,-1960399936,637535246,2756139,708741414,-217914624,1049175716,-1414725628,-930428621,-58707741,-2131528704,175439868,-506347125,-1527527421,-1263737621,-793203922,-1070355650,-33405814,100869832,-1515519938,-421354076,-617363221,35555622,512304640,-1993998330,637536798,3284537]},{"sector":11,"data":[-953809035,151007750,-28407040,-1993995549,-989853122,-1527577482,236882726,1960512256,-472823024,-472790133,-654056495,572392230,512304640,-1960443896,855646750,992362953,1979718670,12577027,572916144,712246343,73892134,958795775,1946159134,1333798410,-2144976892,-370211737,-2144468841,36414,-2128209035,4195407,-165276693,1947206727,1333864169,653262852,790144,116795008,1963065356,116794988,1946222604,915088996,-466485244,-1072976858,-796174476,3976230,-12782988,-1053156748,-234682252,-234626351,-165223701,477430276,1241761411,-722733963,139212838,-165280139,141885956,1242285699,-1058279819,72319270,-165280768,1950352455,-1960422640,184551454,637891803,1074024320,180585307,654259945,1449611,762632971,-1948004021,-773402125,653460454,2242051,72122406,1048782400,1946157070,1283532304,637796356,538251,72122406,116860480,-2147483636,-2094657675,4670,-953809035,4614,1254263824,109894286,-1064566783,-443851169,574045,-1897100459,-1070398394,4096294,1967476224,2930701,1342469887,-1947804696,-443874234,180829,1458342741,205950551,-458102778,272039718,-488704,-857209226,105286117,-440014761,-1000744818,-1004140426,1593770612,1958742788,1606912770,1575324510,1426066114,861400203,209598975,-14786188,1894254710,-1896313884,279120990,108461824,199592680,-1991150400,-396949946,1183769983,35570952,176130304,-1961998455]},{"sector":12,"data":[1334381134,312550924,38242560,1089830,-1006221431,1200358470,306678036,521160703,-1908506578,192217088,-402098433,244383546,-1961784856,-443850809,705117,503348899,504183272,-1930948976,-335596739,911890662,796297,237406518,-136566016,-1765572133,512308736,-315424758,1391233877,-1957345968,249765612,1342619699,244339024,120450792,-768380957,-1911126482,1959922432,-1877080541,1037756430,872098280,-1873653038,1042016270,1381159475,317197968,244325950,121484776,-1962901317,1060775627,641932660,540805002,154990708,-880020364,1959001675,1065362954,653686029,-1962932282,244004569,28966922,1048782336,1963065436,378217989,28835934,1575324416,516672333,1430622296,-1910575989,485262296,242679638,-1981586200,-796138426,1183432747,-396981786,652631748,639911819,1965442873,-373282043,1451950310,-994038812,-1960384930,1183392839,-229209616,-16222465,-85457290,-330921722,-15960321,-286782858,-297367290,-1947187573,33944150,-196704000,-990488951,-1960381346,1962281783,525603,-1980217719,2122578518,527761644,-887041,-11079562,1996425334,116647942,192200715,653549252,1962950531,-997528801,1183577182,121186028,213445236,1744250368,-129629950,-1946663285,-1511261610,15353543,-195116032,652887691,1979860793,-293698772,-15043328,1996485238,-128006928,108527398,-15960321,-1696069002,1975520006,-128007156,653149835,1963345721,-195116017,652887691,1963083577]},{"sector":13,"data":[-14554868,-2081798401,-351471546,-129594448,49120094,1562371467,707149,1167087646,518818645,-326903666,2122536480,57999366,-16698647,921176182,-532248094,58048523,-1962859799,-1983894576,1451878982,-362887956,608668454,642201894,149488501,-1950340351,1183385158,-61437446,653942468,688003,216597364,2139301377,57999368,637575913,67389430,-14279564,244320375,188486376,-1005620030,-14222754,244320375,-381939480,1451950303,-994038816,-1960383906,1183392839,-195655182,-1996488187,1451882054,-161561352,4162342,-1662450827,525568,-1981397367,-1960384426,-1960442809,1183385175,-464090654,1802813963,15746759,-161561600,653280907,1979860793,-96040089,1978025529,-94452663,142081830,-16222465,1593771638,200313826,-1003522826,-1993934242,-2144991113,-352058289,-94452640,71825190,58060800,654275561,-16484353,1139335286,-94452735,138905894,-963952661,1191134955,-431586320,-1197806836,1589903372,1744250614,-431619838,-1947842933,1391061078,1979059199,-531199212,1183432747,-329872918,1342506168,1021841040,-339727556,-94452725,172490534,138906406,49120094,1562371467,313933,1167087646,518818645,-326903666,1996445210,-524031986,-1947842935,-1983894576,1451878470,-396442390,608668454,642201894,-1070922123,10807705,736515723,-396442432,608668454,-1980873079,1996484694,175570700,-1996203800,1183575110,-262763538,-1996488187,1451881030,-228670220,188189478]},{"sector":14,"data":[86209782,1183383560,-128546314,15498883,1996439925,-294191120,209125206,-401967361,-1073019811,1589914996,1065559794,647459840,637814667,-1996073077,1451883078,105286652,638080651,637814665,-1962518647,1452014150,-1004672004,1183576670,121186028,213436532,1744250368,-163184382,-1946794357,-2081687466,49120094,1562371467,707149,871140181,106859456,1393019776,-1914154928,29554400,-1909582219,-1962933754,1207314138,141836290,637814411,15402889,-443825525,311901,-326412987,1996445214,-541857780,2020917259,-1962491762,-1960441226,-880802724,-14265593,-1960443276,637543454,1451954059,139856646,1364858996,856184459,-741279808,64026592,-355400122,-85796655,-2094641063,1946159228,861558820,-788077614,-489500192,650720250,1376285951,244339024,1345883880,1055395472,99324473,-236433008,-1072997921,-1907881356,-1993981760,-1845493490,-2090940277,-443874579,-900899553,-1957363704,49054700,-1070377130,-16091393,1347422326,1407717008,142001407,-1946270071,512435906,-1960443868,1418405391,970666754,58064478,-779074837,-489434654,-896852230,956718731,326370398,-1014178930,-13371853,-201539442,-1898410332,856615875,-1260876078,1914817855,1975597834,1183522566,-1945506818,-397205541,-1070342199,-443851169,574045,-326412987,142016286,-1898012440,106859456,41418534,641204006,637814667,661131,605981478,260777472,12256849,106038948,244339538,133153256,1967151705]},{"sector":15,"data":[-4498937,-1876825089,-783171533,-489631262,-1194816518,567099904,-428713383,-489570253,-85798703,-1014249333,-1962742397,1297948645,1157629130,518818645,105286486,1937031179,-401698736,-922011557,1586195829,29619718,-1909563019,637534726,-1014095989,4096294,1967476224,512435790,958791716,1946166814,106335042,637715331,930350905,637826957,-2097000565,958793923,125044823,-502479997,652536821,162947,1392908660,642975314,-1873797889,939124750,132319067,72319014,855960324,1589654482,-1962742397,1297948645,1157628618,518818645,105286486,2054471691,-560076720,393592843,35556910,106859264,1963049974,38270562,-1906543552,1208609567,-1070344050,73358,16001,1064650062,2367115,2498105,1451963764,46367494,729024313,-2097000565,1463355587,-2096663544,-152957757,2139351787,326369290,2131382271,71825177,259387392,-2146941047,-326553,244319862,-1992913176,1183516230,-310157818,535137026,46812509,-1957346048,1996431084,-586422264,1586217102,1200301574,651309826,2367115,-787510490,-489500192,49120250,1562371467,313933,-326412987,-11053538,-622327690,1958743004,-1012950,244320886,188136680,1444705746,-1878624513,-32184306,-11077493,1465321078,1358793704,-401698729,1599610322,49120094,1562371467,445005,1458342741,105287255,607554342,909714944,1400111142,-2093184218,-2094660922,1198784572,38570790,71616294,-1943655432,-964491700]},{"sector":16,"data":[-1960423160,1084752964,-1960434316,-1950338284,-773664305,-1946492208,1107343560,-855351669,1398146593,-48306093,637945486,-2096610167,-497480506,1605626828,1575324510,1426064578,-1000936309,-829750154,-1072971636,-919395468,1017915132,639268131,1958742700,1009789972,839808777,-1327985692,65140490,-339178557,-473855002,-2147480317,1575324510,1426064578,509013131,51017413,-1070397322,-930370308,637820612,172165002,-401115968,-527819111,1977629356,871162381,121120448,-789117835,-1070398741,-443851233,705117,-1880555520,-326413056,1988843350,75401990,372703022,784937728,757862025,-1897667751,922691265,-1591345152,-969211900,-1993996939,-1946155970,651705299,138891,1964007309,786270983,757870217,-1014251378,-1070344053,17298982,958804852,326435959,-1004121338,-2128215457,1530907967,637826055,637829001,1979610937,642975251,637689796,1070415745,74712923,-25196250,120792640,-1019507084,-1192523146,959372083,1965894686,-796110075,1583325163,-1034033781,1392902148,-27817178,359977483,1120046666,4096038,158682368,168725286,-1962745088,-963752239,244000326,551747594,-1910050421,637534470,2236043,470715174,2000233984,-2095942648,-169735485,74943270,-695793829,38767398,237708995,-638124004,-506338863,1007551270,-1930261760,-1022927934,1435523051,-1957237621,-13761418,855643702,243871433,-480694996,650219239,14079,70662438,-1941801984,77670099,651705088]},{"sector":17,"data":[138891,1964007309,786270983,757870217,-1014251378,-1070344053,17298982,858143349,1002664967,-339773757,786117611,757866041,-796129931,-1898779821,-1933341757,15395266,-25741018,1392906101,39830566,-851476186,1963416383,-957660956,74922278,1392960117,39830566,-851476186,1946639167,-17372973,72825126,-956841100,-1116348415,1392963281,507063888,812913440,-2027503221,-1993997745,-265945521,-754667009,63319016,1030352,38216486,-972298541,38242598,72845606,-1962452136,-1645542282,-796081268,-1959869637,1964187678,1048784579,1946161956,109981225,-1959914716,773005854,638790817,772032393,638790305,771901321,638789281,385763209,512437767,-1943137504,773006342,321003145,71797542,321692462,38243110,321561390,-28865754,321299246,72322086,38258470,118362932,-384620357,-1956708514,46292453,-1957346048,1465261804,-401698794,-1030868191,-14230133,-1960421833,-14285705,367526519,106874110,273123622,239570726,209160486,176130342,138907430,105352998,73894182,638552358,855791497,-2090967104,-443874579,-900899553,-594870268,75467574,108512566,-1877969665,851961870,-1949135110,-1946483612,113607660,-1895402241,1962868806,-62484728,-1895140097,1962932806,-401698804,1451831969,639419646,1070415745,-919399051,55544358,117440443,-397192367,-1064378841,-1945215861,1586037830,-339244286,413216400,378220032,1170931734,518818645,1988843350,209617674]}],[{"sector":1,"data":[855798784,142509046,-2130414592,-2130640698,855674822,564145856,-2114977024,-1946160922,-754667010,-1177406482,1381048384,-401698729,-1073008308,-454491275,-661764096,107328,1183570062,206998282,393597451,78759563,-628301613,1311492235,168724746,959232,754977955,44236822,82334208,304089,-1006632514,-1064565122,1450493707,-1607548877,-1895497695,-754667264,64916712,378220272,-544538608,1375797433,1364395606,837291664,-1899590898,109522624,-1557790702,2126774338,643177990,-1090095675,-1945698212,1959660505,1091341070,620331841,616104822,-1935346944,777002950,2178688,-955878400,-2147471354,1139285504,1105731074,1962281728,842434820,37667840,3318016,138776358,71665958,273008422,113704960,8388660,-956287325,16778758,2114373376,-1941679104,-2090967080,-443874579,-900899553,-1957363704,1183719148,379661828,1975520000,109850119,300613656,-1977165682,973080606,2130708510,10692107,109850112,501940246,10606734,1958742784,650153481,532026,1183772287,429060,10692096,-443867392,180829,518818645,772036235,-1912596831,1975663576,41225,1483566,-661776661,184549537,990737600,-1896647230,10561216,41728,-1960852853,46292453,1364414464,106387026,516173342,-1959919544,-1207940034,-1004142590,-294113,2005735796,1334519302,652280324,1962949760,1959329284,-487128200,-2132808718,1836316156,-523122805,-523116335,-1728051707,773865657]},{"sector":2,"data":[1580686,1044109196,561250308,378467467,646643716,-326434814,1360053635,244338770,-1993384984,-1912602074,-337212457,1347571976,1239944848,774300463,4726468,654311353,958799812,653817103,1991,38242598,-953761650,525383,952614,1594302208,1532582494,-1269775528,1478610189,-2144452308,50352190,-1057095053,1209975854,651309824,-75292732,-1914800897,-1960442249,-788331441,3964966,-2144439692,50352190,-148499854,-2139093692,-987340171,87689084,233527925,457504294,642872704,1963148346,1364350539,-785756077,943637806,775290624,-1912597855,1245610968,527761408,-1191176002,984350740,-1944947248,-850348837,-2082567391,1051990507,1291723213,-1578638593,-1073020862,-1269051019,1478610256,1582979419,1278608174,-377363968,-1950089363,1200305884,1958742788,413216260,446901760,182784,1458342741,-1946411433,-1064434618,-661733325,-1107287873,-1515913216,-1515870811,-1526662978,73305765,1719939,855995392,19065024,740213806,126559744,637547683,-1560131701,-1003618250,637547550,950208394,516173312,-1977221056,3908103,941540398,126559744,-167759197,-2147468794,431234933,-796253747,-1072905474,-1929364830,-973062858,-1268973756,1931595079,-12270076,809405184,1962871552,-1207493113,1741508096,1595922572,1575324510,1426064066,1465314443,1586428958,105286406,549378190,-1900006656,49088,-1515870811,-121657947,782607616,3415748,637548705,-1003616376,-1610596322]},{"sector":3,"data":[-2010775493,873907463,-1675971584,2048851758,106860032,3810944,72256447,-1047647773,3842086,527712424,3810954,977223461,-1928038972,-1962918594,192259831,16743552,243332981,-1958739910,-2097139170,6718,28312948,-1275059224,-13722544,-1962903010,184561718,-1207601930,1741508097,1452005516,1583292164,-1034033781,513277956,-1047602804,269966,504269614,520037888,-1021378536,-326412987,1347900958,1483054,74825739,-185915187,10606734,104760064,-327942144,-1959862388,989861942,1476883966,1562336863,777112397,1707659,-818215709,1392931701,807322670,1065362944,772502784,4202180,4161574,123405684,783412057,2098942,134676050,-2081939968,770187004,135200508,-963708416,-2128153037,1409318462,638612804,267916,36079910,1455852544,519965160,-22550442,267918,140939,404655150,251538944,-2080702432,5694,1532627829,1599625479,1297948510,1095883,-981209973,112912,396935,1344164169,922702166,520028178,22609940,184550926,516912320,519834088,1526445032,-380041381,1430650650,-1960907637,-2048391610,869830144,-353088,2097153550,101107477,-352321536,-401682687,-38207493,-380629451,32243430,-68677937,49120255,1562371467,182861,-326412987,784347934,2098744,-1909577355,-2130700258,1409318462,-1207143100,117388892,1343094790,-1191268887,-1873804543,768469006,397055,-2080374856,-443874579,-884122337,-1959338869]},{"sector":4,"data":[-1959393209,116065887,-1959338869,-1073019321,-1590819723,-1064435688,2118025510,1967412224,28885761,244338691,-1020424472,654301672,395007,-402652470,-1591279666,46792722,-1156271872,-1313137487,920423192,-402110581,-1959329860,-1959394233,-617413033,-2027497078,1468474887,444930,-1946185240,109520579,80347154,-8067072,136184358,-520388608,-525139331,2114976640,1393537794,512239171,101056520,1358620136,133861352,135200294,-895985664,4,0,0,154971394,-1639957357,1023229499,1161624898,-45728515,1023235900,104660316,1628126238,998065212,138172679,1862941889,1005521980,1060921601,-888259663,1021000508,1211953189,1850293586,1024936509,4032843,1984708197,972566846,1446678528,-1959321410,914829014,-231000298,2011890549,516173456,-1070399436,772245030,771772322,3677892,775421734,1056395,567103668,-5110092,520040092,-193658758,-850348965,1006534945,-1273400265,-1205744302,-2027536306,-1557263289,-930348918,239568678,9216814,-852155208,512306721,-1943142274,503349254,1924800270,623163456,-1155587635,-1070399486,-13741997,1577085470,-1957345845,45817580,112640,-13741997,771779102,924190407,-986826949,-1207927274,567092516,1326877230,855750656,2122326477,410320902,369542958,-1271441865,773967186,9045701,206014758,241142822,-1962742397,1297948645,-1342176566,109456897,-1073086381,244329333,872354024,-1144811813,653918336]},{"sector":5,"data":[967051207,38767654,71812902,-1943651930,-953809329,966728775,508529702,-1070349317,1392936494,1958742528,-1070335421,-401698736,-617349281,-2135178354,1990274560,378220032,-1993998216,1468605959,2057383426,378220032,-1993998212,-1993997241,-1590819241,-1959919486,637568022,639387529,-81897591,921996227,855929995,-1145008448,-1590820612,-1993998202,-2002702841,1200170496,1048784386,1946157180,-7673853,-854851400,512437793,-1014104046,567103668,-1962928967,1052003289,-136175155,1109297958,1977289472,516173541,-1047789500,-953807901,654311175,149447,1048784384,1946157062,1354773257,520040016,-963969020,567102644,4235566,1108773678,1428081408,871140176,-1898410304,-1962899938,-1543895994,1183528732,924492552,-1559607669,1566062360,-1677147005,924464895,924333823,436651806,-12999113,-1908991434,-80274402,-1194598006,48967936,1430634547,646458910,-1959905420,-2093541842,-981269523,1715088899,787969280,-1962838273,80053228,788186107,924321423,1347618386,-2141759919,788399718,924333823,-87819268,403083054,1499356983,1510431576,776822047,924329727,65739700,511757440,512634375,1048641560,1146355838,1048799349,1946157086,1003981921,1962935358,471793414,1428286208,-1896156021,-1962933226,-83885530,-981209973,471793424,36079872,-678495744,1576789643,-396873501,-1993408615,-852025818,-1892770781,775362566,924722747,-998042252,641412610,141899550,406257454,57908535]},{"sector":6,"data":[-380895048,1355022128,-352283928,-1070378993,-352285464,28856327,8644608,535262296,1915354240,821854213,-1909560714,-167765986,1073756678,1048663669,1146355838,1397771893,-30538158,855646214,-1145008448,1924661392,126297664,650677328,1342326663,3806858,-2143296896,1073756686,781979316,8003327,3937933,781990836,8003327,38244134,772247334,2100990,1482381831,1966996608,-148772861,-95593185,2049900334,113478400,516173395,-1910112200,651725575,1008224138,638088702,186140670,776989632,4726468,-2095070170,-277544965,71772710,36106867,1603077191,1958742538,503524873,-922877876,-2144405643,50352190,-165276814,1971323463,499352345,1363050542,24379392,1065428555,108351299,41910566,123412558,1946565827,1912880143,1946631190,1946827794,-16062194,-385948440,196410932,-385823511,703070559,-9836290,1317609077,-402017034,99221070,-32053247,1979668200,-402279413,1183448638,15919606,941540654,-1910535424,1245610971,326369280,1912888889,35556110,73283840,397673843,-386000664,-13697543,-402621906,-706150773,-397389059,1515781637,11591818,1946287232,184320098,-58692748,-2144177146,1047791612,-1274479488,-380865529,-2127691624,540481086,-2146929609,57999354,-385952279,-1779892653,-360195,45352820,-335691544,105807989,-401886144,-1073021515,1719671924,129285894,-335697688,-31332335,-335713304,-31856399,-386047000,1183382930,-397939722]},{"sector":7,"data":[1441332747,-1896182787,227278430,-402472317,2123103610,-27357444,41205770,1166592254,-400299263,837352943,-1897952003,-1174762553,615579647,-638079246,-352130685,-36313082,-386066456,1583349062,123426905,1297948506,-38147889,-1258486808,1386015495,781982132,8003327,-1036382540,772961370,1580686,8273537,91571284,3810944,-39130753,1011703071,-821988063,2049900334,777455104,3686084,637898278,-31948928,-31062923,123672647,-386011671,-1030947664,1121619530,269892398,-1962445056,-352320738,129536049,4096000,125062400,16000,-1960479398,771752206,3684037,410324027,-350087704,1978175495,570681596,209043467,1586092683,571640,17190528,-369736055,1508441928,-389903108,-1073012233,-320084107,1330530647,1346454604,1146047790,-62986240,403082798,1048782336,1946157086,11135235,-1174634812,-1070399489,-638079246,1166747209,550273275,-44201178,539020161,1969434173,1878753542,1026585709,108356142,1952578433,775759220,-2130283152,1952868859,-126434022,508692049,-401698730,1029293141,41025600,188575979,-1956154112,8435921,118939691,1992686731,41207288,210431282,-217923197,-976581724,-1527513994,-12204506,654084874,1992627456,41716216,-1174125428,1376664956,244340254,-2117859096,1023443140,577962048,1962934845,-350769127,-163149035,-1929879868,-61422143,-1427631948,4210171,1317012595,1183383814,-75503370,784348111,3684037,1983591563]},{"sector":8,"data":[-385649660,-986776434,-1962919882,-1948545508,771768854,1183371,125163835,303466798,-485299456,650219024,4329099,-210384069,1108773158,512634368,1048772632,1962934302,-164391103,-401698730,909714349,309592086,503324859,922703699,922681360,520028178,914948116,-400686978,-1959857390,-486533618,784764506,2760331,520603430,1334584895,-986802430,-1912588234,371101212,109981184,-1960443882,-2097151434,914954478,-1960443858,-1996487626,-1275056074,-13722548,-1962903010,281379820,404655662,272039680,244325888,-1876749592,-783226866,1458949609,520040022,1430585446,-2095125365,1465254636,567089588,246730890,520040092,1183318138,1053044476,-14286792,241077045,781996212,8003327,-1962125685,1437861494,-1269095987,-13722544,-1912571362,-1947073598,-1557787066,-1993998314,-1962933706,-12777914,-1207732721,271388671,-1312060416,962509316,-288099701,-668213757,-494804781,-1039990769,434982,136218918,1369646592,512304640,-953810861,520096262,244065855,-919404532,1208912166,243869184,-973340598,1959069814,440582,-1979687745,866513684,-978605120,1959069814,7126794,112276618,-1414814221,-989301051,-2135358860,-201749760,868387748,-59340078,-494213574,-855768458,-1031092678,-922877322,-310157729,535137026,181030237,777395712,3684037,378220205,526254096,480325323,51968,-2147287040,1080246360,1310624046,109850176,516636752,516238931,1204240462,1526923267]},{"sector":9,"data":[-30487777,771760134,2113152,-385649663,-50659177,1364330014,-577874093,772033675,9383560,-1212217586,571713,-217418611,-326410332,236744331,9616927,12859017,-1398652668,1098038849,1946273014,1099152899,-466434165,-1174368093,-1073004198,-1816524428,1946762305,-388592894,1048576340,1946747024,1102035472,9373430,-1174178432,1038631333,512026625,-402504193,-571990391,511240192,-402502145,37559933,45125632,28312180,123361627,1912749087,771993659,5244472,813109874,1363050542,678627840,-1895369170,544505856,1077331246,312832,1317072011,-998047460,1515805448,526212958,-1868485113,1246464,537853486,1918357248,543519849,1953460848,1702126437,1768169572,1763732339,1631780974,1953459822,1634038304,1919295588,1124101487,1869508193,1920409716,543519849,1342205812,1953393010,1847620197,1914729583,2036621669,1919164416,543520361,536885848,1769366884,2123107,0,0,1953724755,1159753061,1919906418,1851867904,544501614,1684957542,-1061486560,269859137,404655662,1003981824,1946158142,-84636897,267918,140939,-2081649669,199758021,36079872,-678495744,-1006901621,942587955,1946178310,-1173467119,240255122,-13741741,1023435294,784531458,12846791,1465254034,-946942068,-1002534098,-1393390848,1975519914,-1993453574,1593885758,1430635358,-1591808885,-1073020920,1586176373,1977289478,1394979586,-1193029309,1397751872,132648592,132340237]},{"sector":10,"data":[-1962932061,-1961391656,49120200,1562371467,182861,-1313144143,11647745,-326412987,82608926,1317558102,139365371,-1873710365,539748366,-990099831,-2144991626,1131684668,104448051,427098120,-401698736,1625554828,-470004085,244338953,-1994390296,1992558678,868233990,-53333047,-1073042394,-1040300172,-1024967052,-774206712,64619459,63623640,1189473235,-1406744269,393527306,154939436,-466432905,179361931,-1023155721,-420755317,-486125941,16351499,-1962576960,12839361,-1091977165,-1829117184,532107,1603090423,65196290,-1932424230,-1950314800,1962281783,72628265,2126782581,91524358,316918411,1390980169,652249608,1256719754,-533051640,931916916,479003764,-919350805,-470069622,185197159,-14781194,1558905412,1668609547,2130857215,-2013318388,1447004476,-1595404656,-336186611,1392216899,-1157184893,1381171264,-806875504,-259303157,745862667,1157576073,72124418,-470004085,244338953,-1994452760,-561313706,2089617182,-1966525691,-985594804,-1527576970,-208986362,-388905333,57993425,1606418445,49120094,1562371467,313933,-326412987,106859294,-1073677439,-472838030,1603134417,-1873601019,-25630706,-1070398741,-1962742397,1297948645,1157628618,518818645,1023821451,108183552,-523116335,-1070398741,-1962742397,1297948645,1157628618,518818645,2126796630,650720008,1586171272,16482572,-785878336,971231715,460587599,-486256758,105789718,1317733503,2005747974,-205419771]},{"sector":11,"data":[96872100,859106048,187755456,-1325894437,-1014257117,-1962931525,-768407986,1230173175,74760203,-219479325,-1962521047,72877646,-85808592,-1951743950,1598031430,49120094,1562371467,576077,168648027,-1957345987,1465261804,1996431118,209125134,-16091393,1793591414,-1947170047,-108853690,505312511,-1070343538,-1979708742,820740124,-75493774,1175024394,-13442313,-387792125,-219656161,1583306754,-1962742397,1297948645,1157630666,518818645,521033558,-1961867637,-1039461802,1996429173,343342870,-16091393,1996425334,7530502,468409971,376897424,-15436033,1996427894,16246800,1962932611,240552198,-1005828471,2045250686,1166681604,209634559,1912797571,629810707,209051706,74721084,74785340,1191373187,1241929355,41339451,102681227,1375177503,-217547068,650130084,525862280,39577680,-2090967208,-443874579,-900899553,-1957363694,509040364,602472243,-919396863,-1039402869,2028667765,72286096,-2144943474,192240445,175555911,-471310925,-1341099008,-18166,-1977176334,1975519749,-1336808479,-18166,1992666866,-1949158650,92939999,1950170183,1946827790,1952136434,1975519786,-1960514580,92940027,1966947399,-2000670206,994460164,41026646,-1073067442,179365749,-218103879,851766190,-1962637120,32241858,1595875321,1575324510,1426066114,1465314443,-385928418,-1189216118,-125042689,1450492427,-2144943474,192240445,142001479,1340628403,-1341099008,-18166,-1977176334]},{"sector":12,"data":[1975519749,-1340937247,-18166,-1977176334,1958742533,1968913412,-18171,1992629483,-398609660,-545980386,-1950184377,-1190285089,-1359806465,-638107327,522175371,-443851169,574045,973441574,-1979288125,-339736060,83290130,-1048179574,-2046496792,977749704,-1008634687,580984590,1958742784,17033229,-636757877,-389873292,-947191693,41221899,381292724,13024001,1946173312,18790917,1377738932,-1873784034,-752818162,1073752227,45633908,16312386,-2097151227,1119551698,1347572512,-974647664,2269978,863289355,-402607896,-987889449,-1207950314,-1957289952,1577355762,-1258291271,1914817855,533236493,2097346947,178435,-1763174165,244340224,857400040,-1546505280,614662178,639011072,-1004616960,-989846466,-1409276874,41164860,-136246980,1095645411,1011460780,-485329859,1948269613,1946762483,1946828015,-337671202,-1426355225,1017911523,1006793760,-470294263,-1405006323,108284330,-1082914244,642774507,1947876736,230180857,-1070355702,915087274,-1873412062,457697294,1347862579,244338775,-1961216280,244338928,-1558501656,378077220,-1950154714,1442849334,585633424,-17637,2629255,1258648643,567099060,1107343555,2629259,-768358093,1170416077,518818645,1443425411,857673303,570853312,244338688,-1088810264,-1679294462,200838142,-385649214,-1910636175,-3807038,1530757158,-985199755,1572015734,1962827240,-1190481899,-1359806465,168135206,-941525568,194630,179319531]},{"sector":13,"data":[-218103879,-988681298,1035143798,1962817000,-1190481895,-1359806465,1006996006,168064091,-941328960,325702,-951646485,129094,33062531,642715508,222037386,171767924,-947653516,-1960960253,-2097141730,561381371,855709370,-851659575,2663201,141744267,1085589811,158540237,-15210465,-756432845,-1983302912,2122970702,-62485254,520540043,-873934285,-125926656,522941698,1153088030,-402652487,-1195769670,112964,-1006587416,-1108865410,240567552,520136168,1153022494,-402652231,2122514586,393478648,-401965372,1455751328,8972298,-1128653281,112964,-1006600728,-1981282690,106349824,520122856,1153088030,-402652487,2126774374,-125926406,-1341688575,-18166,-678711566,-4603854,-2085686529,-97844241,-921972853,-225761666,1443090827,-1194773514,567099904,803785011,-162100480,12110131,102878530,-1949332705,1894614,401131827,1189617408,-38934274,1593835960,49120094,1562371467,838221,567099572,-1053095822,1308689525,-380058634,-812908794,-2144975025,-109638339,-821831177,-1153583677,-594854731,1468741150,1603155462,1334457864,851544836,1931595245,-18429,444959,-1959338869,1051984991,-4709939,1073836799,-1962933558,1468741340,1334523398,1200305672,1602958852,-851266550,-1207667935,-895877121,1068564488,-1958694469,-511041828,106400566,140480054,72321846,174033718,57876941,536870840,-1962932022,-1003071524,872154239,-17984,-1047810318,1212733687]},{"sector":14,"data":[313951,517770074,-986294442,-1003092873,-259969,526278626,-402650934,-1431502874,-92946422,-1941387381,-387257406,-1070333994,-218103879,-420786258,872401384,1946433728,87565879,-391368844,91357459,-347724662,16181253,-661920718,1191545382,1912667880,629810694,-402265273,-466485024,-881540293,1912602808,132857865,4030502,-347602572,1474071444,2143565398,-1950249980,11004103,1927809507,918719488,1577338763,313951,1448598667,75482166,-947142260,-486499352,7071753,-1959345524,1599996999,-402651958,-147062974,776870772,6372992,-2028833792,-695515138,8775852,994443634,-1946979593,-1933145102,-13768230,-594833264,2143565399,92939780,125091850,6416455,-1958280846,1606585543,-67107638,-1406732405,1912622824,1195853317,518583531,-1073042944,-54268811,-1406732405,1912616680,1195853317,434697451,-1073042944,1019473013,1007579745,1007187578,1007055584,738359294,1094501152,1513885298,-1069807498,-566491534,537133687,1048587971,1912668257,244002341,-851836843,-1053156489,-986053518,-1959915146,973100814,973764557,973566657,-134055995,-3933757,1602946125,52920578,-1992881920,-775749028,-66642199,-108308541,192138027,860936695,-1316672,1599646707,1397774019,-1476113013,-2092206846,-18348861,106793730,-1962933570,17298944,-1020589963,527680059,-661978997,1005120994,1942108929,-617394158,-389379181,1532625669,-1049272744,-1195130829,143327236,-1962350205]},{"sector":15,"data":[1005716467,1397715953,-1014810901,45344774,-1962386037,1963042823,41388809,-230952149,-64745609,-337454965,989917672,-1950977342,440560,-829689301,-108793085,1444377096,1334300299,-1994618622,-242810292,205953,1174342665,-1023190268,1510018944,1086518874,-930412428,-402497653,190775095,-208944192,779417099,244306,389093155,1946346112,-2016267515,2005599319,17102338,-561576075,-1946224408,-164131874,57999620,-1946227480,-167027982,38570947,-251408853,990019467,-1961659149,767634375,-1019543544,-947189645,-117179509,-947191061,1330597454,119466449,-56232963,1195853382,1381061571,-1957235149,-752156073,27789195,44574580,2005607284,58490884,-1961200384,-1020591545,259506747,1962281822,1002832647,41288260,-1957235829,-1946409977,1590551256,-1017423526,172345174,2105741313,57933826,1376407038,-1957642189,1300957277,-1475900668,610366465,-489124868,-1957012492,1958742979,38218510,1308547319,990149642,1577218754,-28093757,-512488627,856311294,102623478,-1320082316,-561278718,1493270760,-311115765,-343729013,-17897466,76136499,1073892480,-2146808448,1173805035,-1384873974,-2146798208,-1880401317,163203,-259305611,1946289398,74746733,228480,1464951925,-320278389,-2143974914,-661978355,-2130551415,150995751,41716031,-1946409856,1166869597,1594329350,1284309424,18081798,-1948349607,17102391,-1628961675,1323911677,-214212865,133634164,309657601,208991755]},{"sector":16,"data":[721568907,969081798,41288263,-1957235829,-52199393,-1058481941,1962281982,-11054636,-25040841,1960786777,-1983149307,227082879,-1996288640,-2120809915,150995749,1301124869,-1948304634,75336671,1482624391,-12581772,1347617861,1602945456,9955332,-47939495,1979702923,-33101820,74787678,-346304981,-1950338146,-472824871,-397286447,1952054583,-2015851758,-1957228963,1192069624,79095879,-1956700791,1049347016,28901382,441288448,-1070396445,1342259384,216534672,1049346837,-919404538,-484815481,1085850369,244338689,1930753768,-214269,-2147264627,-751043358,-54918285,-919354369,44615307,-164425867,141869067,-478095221,82543612,75688131,-2084310411,1946163325,1357132296,1577013587,-1010824426,-326412987,-396929506,1183580040,1947248648,38141699,184966795,621901275,712245250,-2147224856,1333789239,518733826,1962705640,46331417,-588770188,-1992848637,1283522116,-427818246,-2013039601,1190593143,1946161160,38665987,-1946201112,-2090967096,-443874579,-900899553,1430585348,1444867211,-14489513,268846839,-16550912,1988821573,-11343862,1190615156,1962967046,-1946973378,140379096,-1946211096,2122515036,1517617160,-1070397981,-150929687,132678,45151348,1586219315,-12851190,-1070339980,-1377247605,-1989380868,38567940,-1956517056,-167049658,1686133364,-461324286,40110143,-1040822549,-1958120384,-1202321314,1175126018,-70916090,-2135985058,-381681036,-751107935,-1957284745]},{"sector":17,"data":[139759090,1935397691,-2016507101,478741071,612495751,108265475,-352041473,1955303432,52723970,-2029254400,38570481,-351648117,133599348,991327489,293012055,1256770443,105314299,57933888,-335849752,106335153,-486538565,1976796423,-12130045,1585828619,-2063108854,-244054434,-1031023821,-402104693,-445318333,-1949791408,28314206,-1946258200,1374161526,1492159486,721571723,-83105586,-201815209,-706191451,-1995803397,1283495428,1149829882,105314302,57933840,-402502145,-930349572,-310157729,535137026,113921373,-1957346048,1465261804,-1946301464,99092086,-402426626,-2132214888,-36509694,-310157729,535137026,46812509,-192195072,108301110,1962796008,38218501,-930359049,182878,921996118,-402230133,-829686324,1284178915,-1949465086,46816961,920423168,-1962647669,46397123,1207307636,91570178,1946372094,-1962439929,182984,-352104450,920423412,855924619,46397120,1334514804,1088520194,-838988683,1946090880,57640965,-930364533,-1962933558,1602959068,46396932,-1014297740,972971915,855798791,-893154341,1430585346,1444867211,-49354665,-133800309,-386059032,-1072956534,103613300,-49092608,-310157729,535137026,46812509,920423168,906250123,-1962518645,-2030041570,1468470855,313880,-326412987,-1957210594,-1073018298,-1877072267,277604366,477413387,1458604881,-1746399600,1174625040,13796102,-2095299325,108265682,-919355341,-919377173,116471,-8386443]}],[{"sector":1,"data":[-2147257087,1448280777,-1873719214,261744654,1397613403,-401698736,-661974946,-2147161213,1049361635,1972043782,39815432,260061065,39618817,-16228983,-561314747,-1191563288,-2141519871,410321407,-401698786,-1070395360,244338768,504390888,132648592,112656,-310157729,535137026,113921373,-1957346048,1465261804,-485863797,-1948676606,-620033954,-645130379,650219081,204427,-472709967,106858315,-150577621,652802267,-1915057156,-1070398337,990269067,727675865,-118757169,1605104471,-971088499,-970976699,-1996291003,1170671189,-1940770794,1170675789,-951131884,33561669,-68425480,1586229899,82543366,-1979915392,1049167965,2106261510,-1992521466,1602814556,21269762,1971914633,21335298,-1877080695,257746958,-930414160,-310157729,535137026,113921373,274565888,259316491,1334430003,-1995995390,-1014296507,1355008139,307071826,1442778083,-1962482924,-346531112,1522545631,509068122,1166932999,-4674812,-152916993,1492929929,1962281923,-18416,1073890439,-963966348,-1995422329,-1010814204,-1070349496,1090669707,-2142697356,41238753,-1073019765,1979059139,239438635,-166989685,-1951588492,38046664,1209627712,753024,1084755828,254021237,1963672888,1977879047,-1007285501,-503024499,-789860900,1468861298,-18710527,24302395,-83261,-1949748285,1946265794,200684318,-1961397056,-1014084648,1295876134,958797429,276105845,24983846,-1950152076,-8722190,478928245,-1950105549]},{"sector":2,"data":[29619928,-620024203,-1007265420,-1957399550,-1019539875,260787574,-506338863,-1019487997,-661962381,1090670475,-162973324,980762817,-661977205,106772811,1564027251,-1910213112,1031808707,639399245,1946254649,1569400342,1960512266,1963407632,38767370,-770977653,868467595,-1949748288,-1070349360,1954595318,104410856,-344719354,1398001911,520040016,190513156,-372083520,-619970699,-158260875,359924417,-25040815,-2146507942,2005418190,1244326658,703120014,869413637,-400626752,427033645,1946338038,-27400172,931915235,650546766,-2012586615,-722992521,-1010267390,1357679445,-397192878,1586233075,-142969608,8453702,-620020107,132345205,-768360397,-150896151,196166,45150836,1586219315,1994917628,-462158069,637719784,1342273023,1493483496,210307188,1073892480,861419499,22079936,-1946270069,-166987178,-1360520332,40140802,837058814,-167615480,158613697,1949353206,-350975728,39184396,1949353206,1435051524,-345117951,1086453324,-619992972,45638260,-28964096,-2147332982,-1056305951,145285386,17564276,-1962195576,1592284684,510942723,1073902720,1820984457,-1907452414,1166616262,216367114,91064358,-385744152,-1880555310,66292480,-32446248,140348198,376951611,1111683723,141808443,-1912435224,68085958,-369342837,-1912209238,2100897475,723940609,1474844371,494034436,-1940270333,44624065,1090406135,-1962380288,1238010841,637713384,-351773301,1451952059,146994942]},{"sector":3,"data":[45812085,-2060328192,-382896685,1586233054,29619964,529203829,650350155,637748619,638076302,1963031865,1157834245,-1036304381,-796196234,-1880375245,1190646539,1946157564,-2049756400,158727774,1793643059,-338654459,-1950184515,-389116962,510919301,-1946388853,29816776,-1962642176,1211403214,-397492082,-1047853334,-443823989,1586217821,29619964,529203829,-1907637365,-128021565,736679939,1569400573,650350088,1963031865,-388814044,494011278,-1047735549,-150871576,4259398,-645199756,-397817205,-1960443404,-202831779,-388877314,-796195599,1375683561,1526529768,-771028364,115870837,49735681,-1946387736,958841800,-294387371,-335544392,105221874,637816203,1963021625,14936073,-402467864,-1910047657,-337508283,1300821555,-59381749,1156976500,-176930814,-243985351,-335791384,-973159444,1871184756,-838941949,1946090880,55574029,-1040840075,-402426879,-919404541,1381041859,442317142,1207325300,1282670850,1073891318,-745847179,-1907679349,-1960442173,-1960440227,260770933,650219081,-1962117751,-1047639796,241010982,1569184395,1225755418,-225721970,209028902,-1907815285,1435051713,-1993996530,-1993995147,-628421027,123296350,1569400515,38270474,-1959562239,442337235,186402303,-1960872741,-1912190705,653429697,-1962117753,-1047639796,240486694,1971922439,1569269260,-1993948402,-1993995179,1455623765,1300964945,-1958681846,38270681,-164072447,1967129159,1569400370,1972053518,260769292]},{"sector":4,"data":[650219081,-1962117751,-1047639796,241010982,474873607,172854054,1964657977,442337546,58054971,1494900009,-167001250,1972045429,474843930,-1958145053,-963752396,209029926,1073890550,-167050379,-1007275069,1443120639,651070214,-1912058489,1971922625,650546694,721964425,1323235313,58034470,1300833881,2106140166,2106140161,96871946,650219085,-150450901,-1993979431,-1017248947,637816319,637957515,638076302,101086601,-1893284210,723912773,-554235787,1971922510,1464910595,734236166,1138489305,990904505,-1962642471,723051467,-773729831,870437345,-50383936,-1064522765,-1911503744,131984320,1371756639,29590352,-1946495512,1166935117,572166,91488680,-1291303538,126756358,24983846,-1960424332,-75494795,187790600,944665846,1232405372,44585048,-1960426635,994050885,1379562178,-370618229,-1072997888,-14274700,-963901835,602456206,-1058339068,1948155193,1962281756,1173759517,376702981,-538439701,958690048,91496061,1946614656,126756357,-397174046,995820113,-1962118206,1959922640,1498958337,650362931,1073956235,-903100277,501478963,1946614656,63343625,-21174030,-1960439829,-232060811,-1895910936,1972053702,-1893311994,-1070399163,205883686,239438118,-1037955920,88442918,-163528564,175390914,139299622,-388461751,-963707164,184550376,-963853376,930412043,25004326,651309906,638211463,637957631,638076302,1963031865,-23533565,2100897287,638022913,-402111090]},{"sector":5,"data":[-225706358,2100897370,637826049,185091470,1359397878,24983846,333974645,1941998592,117145612,-1910110860,870965767,-1022928448,54889254,511523136,1173764212,846530571,1166943750,1031808520,638022746,134563318,-1962467468,1965754485,1966810654,638808840,-150440661,1992702942,-339334396,-339725563,-1036318975,195,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1465255424,1381061456,-494807413,-1945763839,29982913,-1036794229,-226443122,1426269697,28856835,1569400320,1977289482,1136888835,89122822,1599750489,1003523102,47553,-812969611,771869056,1533486729,-1139339526,788224869,1533349513,-972832117,-553395573,74643259,-544487797,990904505,-1962642479,724558794,-772699183,-773729823,1925397473,-661718003,-972831858,-164372989,738004715,-1948374074,-422490383,-1014048626,-1510736245,959366891,1952146702,-1909523956,777741590,1533486731,1499078651,1583306843,1455684615,511523154,1166936436,572166,-1912592408,112920645,2025472,197168730,-402295616,276037206,806045174,2100890229,-402295550,-864747036,1301005150,1354773252,24983846,-1910110348,1492509191]},{"sector":6,"data":[189134531,957314320,175440509,1962959336,17230064,-75437195,1591702790,-264519540,958801268,527761789,427095563,1948155193,189134342,101741832,-1960393074,637993797,1912816953,1455852546,-1960398613,-167048587,2084051316,638874883,134563318,-75496332,2100937480,-2147060706,868419323,-1007285258,126756358,-1960394612,-840432811,24446975,1123060675,1946745728,1166747159,-1037348856,926492240,-351927436,-1064413695,418103347,1949776166,1979655686,50588424,-1064546110,105955843,105220902,-1929494808,-1073018938,-1993997196,643302981,-1945614967,650153666,1476810121,138774822,-1064385908,106268966,-1960393074,-167048587,-1064565388,637831488,-1960441970,-963901371,642303531,637748617,642581958,345542,175999270,209553702,243108134,201112552,1359397824,-1960380877,958792533,628359549,-14751658,639530078,1996707129,1962281752,-963770866,54889254,1161373191,-1945733629,1166747334,126756355,123326690,57996811,-1023409688,-1064545711,55413542,24983846,-1960393074,477430613,410307131,-963919730,-16390058,-1945876993,1307051968,197168892,-1874793536,1300899398,1979655685,1979655681,1979655692,650153486,638469519,638338447,637617551,1074089352,1156104334,-963752195,1224480744,188792974,-1995934474,1971922436,1526084362,1342620505,172344914,-1982846208,1166937173,968985608,594812541,134956534,-1910104715,958793285,125043069,88471078,737113352,992353869]},{"sector":7,"data":[58067021,-1995944565,-164424115,434657622,-352094726,-2142138302,1962935164,375229424,-378332103,45145739,1963086056,-1948325118,-1064417276,242614054,653894888,637629951,-402434677,76544908,1073892480,17450438,206907742,-2141603977,1509952125,1505953624,28922126,855829248,1465261769,512634450,238616578,1433731096,171376430,1306745088,-14237298,637535798,1848971,1044286246,651070208,16001,-512408242,-1070342173,1974399740,-1438625832,-651436405,1943944011,-775713844,65262051,652464600,2235907,140479270,-385928361,-346032009,1583307471,-986789089,-1912588226,869895197,1241921984,-987401216,-16758722,-389867451,-1712783388,-1876890635,-385885208,401339862,-2955120,-957822669,-1878201353,35556910,-52480,-3991483,1388517453,39291702,-1189115082,-1014824956,13796111,1263141491,-606999855,1079704290,239620980,72235353,-232521100,-167033464,359989698,74830347,225706664,2100887820,-1475972066,872576264,264566273,-461371788,30179568,-1322130304,180888076,818214625,1317735284,-1047639804,21859110,918826691,-1960443848,1461633804,1090484712,603980037,-2016375810,995106373,186611408,1073968576,1170610411,417857547,-1961921280,48766549,911612,1167000693,-396733922,526384977,441283,855920011,138776274,200949736,1170654144,-622329845,1959922683,9103619,105221714,1513979942,-1910080140,958793797,460587389,175475494,-394988021]},{"sector":8,"data":[228480,1157030517,-596377342,88471078,114652424,54889254,637816203,638076302,1946254649,1031808563,639333466,185234827,-2144570122,1962935164,38073894,639529985,134563318,-963898764,-150440661,510995422,1959134016,132859914,54854438,129819200,-2072591813,106483851,134184425,-1072971125,1950876788,-31176703,851694131,-1957210396,-1949791239,29619955,931857013,1465261794,1443029480,-869668777,837310294,1004113078,1464563150,512503327,1122697218,-74759966,518534655,1958874061,-339725564,1048784433,1946157062,38112020,-13741993,184550430,-2147060544,-343932339,38139398,856650753,-396929281,1465254542,-1196039192,1583284225,-1933328373,115888600,1651792371,-1070346101,-1961992821,-654097633,-472783919,1913543939,264471373,78727282,1702947795,-1343686901,-1959009293,-224007984,-1960430476,78709597,-343677997,-52199421,-1324458709,-1947479294,241011651,126339211,1128515627,-523116335,-544745469,-1980633112,-1946449139,-919354424,1958742979,-1950104831,1200305884,1468741124,109522438,-2027028476,-905968106,1430585348,1444867211,-41883561,1183568435,106859786,-386038552,2062086900,-3806979,-310157729,535137026,113921373,-1957346048,1465261804,-1946331672,1183517782,140414214,-386049816,1323889422,-6690563,-310157729,535137026,147475805,-1957346048,1465261804,-1946342936,-919402922,-386603800,1583349033,-1962742397,1297948645,1157628618,518818645,132667222]},{"sector":9,"data":[106335229,141939211,943113262,344663552,-1962523250,958792781,192217429,1363198092,1927827538,643389953,-502774386,-188880663,1610408168,49120094,1562371467,182861,920423258,1074022283,508039540,512634455,-13434878,1377322495,-1930320663,-387126312,904658910,1962924520,-189339600,-806867989,-400132865,569111732,201311720,639268050,1342391691,79286835,-773795584,1509614290,-1410856981,-1949464833,407764929,46800735,-6494208,2045248372,-1950338060,-387257398,-109772914,-1946913816,1172237249,518818645,1139300182,-18180,-402235763,-386335671,32043242,309757,-773795504,1509614290,1610363112,49120094,1562371467,313933,41262,35031854,16501504,1163067392,1111835719,1442858837,-1070397865,-1960394610,-1912599010,16826307,-1184665922,-201588727,376809006,1813940526,44117603,62410752,-13742080,-2090636770,1594295492,-1957313698,-2094135572,6515774,1190601588,1979710470,74907420,-16353537,1996425334,205964298,-1070379002,520040016,-998022294,-443873522,836189,787254101,1668038275,-15567872,1996424310,112646,520040016,-998022294,1575324422,1426064578,772205707,1668038275,-15764480,45614198,-13742080,-2090636770,-1962474300,46292453,-1957346048,-326951188,-1155592694,1253703681,1358081,567099572,1107711627,1606028405,1161473,567099572,373963755,-193032953,-1418186568,-1962933063,992706,-355341615,-355341615,960245764]},{"sector":10,"data":[285475446,-1192697174,866847245,1452124864,-1189144844,29032456,-851397632,112673,-401698736,54343,0,0,0,0,0,131072,1,184613560,-1156877120,240148183,520040019,-401211282,-768357086,2115406134,378088960,-1766260712,1364332132,146280018,887705653,109850365,-1943142384,637538822,4327111,-1047855104,-388823887,1687855918,78765195,-796070957,-1557216509,-930323304,-1099669317,-215255328,-338492239,-1993424125,-94064098,-427044722,921515003,931465,203852086,15630592,914961922,-1591345142,1480392958,1024095319,276125511,470220590,117386752,854261788,33614224,-54512866,268865070,8437248,-268194778,234978445,1734129951,728191422,79793102,431270402,1090789837,-206882124,788275108,1050254,268812428,512437760,-1960418152,-1912602098,378218179,1397882896,244339024,-485622552,-1767690584,-37754780,-1156958488,-1993459491,771778078,6819468,-1899459554,2014936,1020912603,76218603,1023639333,74711935,1223,109981215,-2135031792,650130176,1190134700,-268194778,-62601434,-970566065,726466116,-2131983888,-1141077248,101072896,1398216278,333975184,1963409588,83764760,104857787,1461081606,-401698733,1074246654,669582197,-1191408895,-13697025,1348769846,1088968470,-2134605382,1958742784,784371429,637536419,2242187,105152806,-14284800,100663814,782582760,525966,-1207959106]},{"sector":11,"data":[-13697025,1442842678,-186101746,1975520167,14215427,-1099669319,-248809760,134268545,134647342,785943296,1689394691,1963049974,-1896199423,-68777005,868453968,8436223,-201539533,-315402070,238455094,646526464,-293535732,-1992947200,-2097149386,-1942612244,905970710,140937,269388590,243873280,-952762318,-2147470330,243873280,-952762314,16778758,113718784,1146355838,35570742,1871259136,1871259152,263737358,382423143,785155560,1578636,370576430,-1900006656,16563136,638806456,-1557264505,-930348922,38242086,8954670,-1744400850,1048782436,1962934282,1689565191,43837776,-850656840,1313429281,774910001,5130562,-1873804880,-780539890,0,0,0,0,1458342741,-68680105,105286647,1023696523,477495312,637826756,637813899,637951115,538171,52824693,637538846,1056259,-1324366973,-2081697020,2078802371,72190956,-1157216882,279445512,1166935668,441096,24983846,-1960440203,994050885,855995074,9169353,1687724334,121185864,-1910110092,-337780217,-1590783878,20801380,-2141882880,1249117947,24983846,-31177611,1678125358,100740711,19293338,1461584709,140348966,637748521,638076161,856180110,-1174457354,-201588728,-1910087771,1166805085,-1960435962,-1064564131,772245824,-379283293,1156120379,-13244159,958841228,326369661,-756493773,512438003,126575766,1687724846,-385934615,1594357533,1575324510,1426064578]},{"sector":12,"data":[1465314443,-990445080,-1960441738,-1590819252,-1907858280,651899840,637761535,638089215,638220287,638351359,-1961986049,-1064434618,638473867,637622153,637886344,638214025,638345097,-2096210039,-645197887,-338492239,-402537597,860547942,1468606171,62950403,-1993981232,-1002436521,-2144991114,637666380,-1962392439,53349470,778344478,1687821867,-72,1996425846,108461832,1860718675,142001315,73173798,16827383,-1030874252,-930352757,866985724,-17701,1393456895,1364219398,401101395,71732904,-1960387789,-1030879145,239570726,206016294,172461862,-1993975464,-1064433593,106400038,-1037319538,1200170568,784870147,1687817729,637818507,637949833,-16693305,1602758399,130426373,1602954829,1086360586,-1557264503,48784536,-1956749322,214064613,1465255424,1687724334,650153544,202379,868257344,512175835,19818340,-1939564002,-1947008058,735587294,-1910615341,73787614,79255583,-774753536,-489500192,922693370,1347576982,-401698735,-13699001,-396061130,-1557225465,1583309976,49927,0,-2081649835,-1909585172,644126726,771754145,1687815723,1734648622,-1774780626,-1613109148,-1744402642,103493220,19817624,1348953094,1493135080,-1710872274,1776467812,771752633,1688092291,1090614272,-1207957829,-768409599,-1873784237,-139532274,-1425600772,1776877441,82372210,-1734267388,100871780,-1064409244,-1960378573,1183385669,1049306876,52822020,637535806,1838731]},{"sector":13,"data":[-506332925,-1048315645,65130754,244000505,-117243856,-506338863,-919340797,-471312559,857072636,-1873784640,-124786674,-1774780626,-1623332764,1687724846,1687724334,1678115630,-18073,1364262707,-924297385,-1983869259,101121606,128263912,33998630,864026624,1049306870,1022033960,117440440,905913936,-1902107672,198740930,856454338,126494400,1347618371,194736872,856520128,67221723,-401698736,-1070335709,-50444658,-397408597,1174904006,506870566,649949696,132807,-1960443903,184551478,642413814,-167486325,1098137795,1964033014,-397015540,1443298358,-341844760,-1145031888,62482914,121187840,1128465525,-2026965022,1149838855,1283466760,-400686588,-661916654,384311179,-611431436,67212,654258975,2242187,-1911886205,-964428218,992364298,1979718718,15984899,73173798,1967178742,46396978,-1007230603,870085648,1364395721,-1646335919,1418274311,1686119944,-2144929020,-1946024884,109981376,-628424702,-1912108762,649391040,-1007221621,276164608,201783078,1946157568,909714962,192217096,38046502,105154342,-1996191962,724499014,778344966,644310179,33834230,1443243381,-470061592,1156982295,276107268,-100609,1443297910,1390956887,-10491396,-85436922,653685918,538169,-165270155,1947206724,-397015514,-1960379590,52823620,637538822,1050115,45732403,-14285312,1347553396,-401698735,772273599,1687566079,782073576,-1956341597,53410374,778344454]},{"sector":14,"data":[1687815723,-71,1347944054,-1577981871,-50397975,654198414,2373259,641088294,-385649408,-1390018412,-369670520,-1390018429,653805193,737674439,38571046,637847171,1074021623,643986432,1376130187,71600934,637538341,-1979556725,-472647858,-1545055408,639689722,268715254,123339892,-1070384149,244338768,787891432,1687566079,782037736,1516542115,651309831,638080135,-1590815609,724460696,56924678,-4520254,1347815167,-1130174381,1149838855,214336264,1979207423,195896974,-385649472,-402194572,1183561386,1975520252,-1874203901,-1710871762,1688415844,922693223,-1729600362,-1734136164,100871780,-1064409244,953126,1324974336,-385649339,484703467,236914206,179719,-60332353,-1673623250,109850212,-1527552866,531284019,-1774780626,-401698716,-1557203781,904422550,-893130751,778346683,1050254,38258478,-1943142272,-953285561,1689126471,139430958,172476206,-1943142292,-1591342009,-1993474004,109981191,-14286840,1493173814,-1047646237,104267558,650130176,1443385,-617353868,-148450765,3078,-1157270144,-896768864,1358954425,1359369042,-342656280,1048784590,1946182814,1688255252,-1640562898,922693220,1393452188,585633424,1575324564,-1311077437,-3964660,871093007,-50383882,-360638485,12128256,-1935281280,268436952,-1064511346,-1911554043,-428520512,-489487439,-1510749557,1465261763,-402652993,-1763125126,526278617,-928593725,-928659291,505356197,522133023]},{"sector":15,"data":[522067742,1481461061,811096152,1868787273,1667592818,1329864820,1702240339,1869181810,168633454,-1957310684,162799340,-855353659,-443867359,311901,1380275029,1398362880,5064020,587215139,1162543154,1095713369,587220050,1465253941,548937486,-1994273483,-1946126818,-1207928826,567096609,8003209,8128140,-852155208,2115930401,-2147054592,891795456,512303565,109838466,1387528324,-1960435251,-1960440761,-1969025449,-1944680192,1856551680,244339470,-1951782424,1857338352,-1873605034,-1507661810,-1996463453,-1157602282,240545463,-401698733,1722000912,1746307328,1856879360,244339470,-1951794712,1857338352,-1873605034,-1510807538,-1996461405,-1157600234,240545463,-401698733,1856218592,1880525056,1857731328,244339470,-1951807000,1858321392,-1873605034,-1513953266,-1996459357,-1157598186,1393426517,242198459,1857338195,-1873605034,-1515788274,-1093971886,984416341,-1392150844,74957882,6358782,516120159,-661733325,27016900,1958616846,704366,-218101575,-1273203290,174574912,-1206618652,1741508099,125101066,1972370560,773304326,520102306,106387139,-1205924322,567096609,8003209,8128140,567095476,74580540,57803836,-1576886039,646447184,512229457,683343954,1912814592,3717899,1946221696,3521283,4988553,567104180,-1996202099,-1946138594,637553158,-2094653500,-143261889,4464265,4589196,581973428,632562125,-1782963536,857853294,-1931964736,915091145,339279914]},{"sector":16,"data":[1278805365,-1106349054,339280832,1278805365,855798786,-1899983626,-1261204520,-853364699,-1899459551,1979059160,35121411,2766473,5258880,-2143260157,167792958,-1205963406,567106822,-1994401652,-1560264650,-964493246,741771532,3056384,-1996175741,-1560266698,-964493254,1010206982,4104960,875989318,3580672,-2147448855,419451198,1387541877,-1064558131,2885319,782434530,1007077120,-1560206592,113705022,19267648,-956284253,-1912588282,3842817,3409607,916652331,-1270093056,-1960719057,-1262318389,-2094936750,1232413435,113688716,-955973551,889211910,1074185984,-1560175872,113705026,28442668,-956289373,335558662,3842816,3933895,1050870204,872859392,-1560185856,884211766,512303565,109838384,-18284494,468419328,1963931942,1463363078,-2094566398,958794435,637957391,1946310457,1346273305,259326720,33735553,1963931942,1463363078,-385649662,512295169,109838380,884211758,512303565,109838384,867434546,567083184,5258880,-2129890045,637642987,242489144,-2097097495,942015939,-385649641,512295113,109838388,-343736266,1346273282,91489024,3153604,1075743043,1107725312,807322624,96699136,5258880,-2096925693,512297195,109838396,516161598,-1946419148,-926776877,-633650432,2146108274,-1090810992,163147361,1973875456,1790855148,702830,-512383245,279043979,1346273280,276038400,1946630950,79921942,1946630950,-1874007282,637634747,57935675]},{"sector":17,"data":[-1987034645,-1946142690,-1006618106,-1593821154,958791696,-1003719417,637550622,1962950528,-853953502,-1261401567,1008848142,-2046069996,1008649410,121120256,250087797,-18179,1351621355,242121912,-69539760,-397406632,-1833370668,-397406610,-1070335028,1583286047,24612291,-72063,-2130543475,-2080375065,-372174911,-372119087,-903091759,-511649289,-494908674,-31176450,-617357682,-951253050,66375,-16693305,90147071,-1996071028,1602816127,-628220406,-950401082,66375,-16693305,140479743,-1996136568,-1994519969,-645003697,721966985,130435793,56068429,-16693305,90147071,-1995808887,1602817119,1377718286,-1912191095,139430360,-968243157,1334398215,21481219,1602813951,174033157,-1995677815,2139688543,-1981837818,-953481145,1292355144,-1996398711,2005467975,174033158,-506373543,-506338863,-1030864303,-13385677,-628184077,1491194201,1170430810,518818645,1183536982,140413706,-1962127733,283641430,512503551,-13434878,-1996071543,1170671701,-1996487420,2106137213,511543576,538068423,340117248,1569546595,-52199389,-2096210551,-511704087,-775214084,-1981165079,-1992080625,-74772387,870297576,-13390912,2028525708,1208454111,-1993949042,-1993471395,637534238,-1945746034,-402243392,638050143,-1962254967,-2090967096,-443874579,-900899553,8,704642893,0,0,0,687865677]}],[{"sector":1,"data":[]},{"sector":2,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,279886,1900626,2065,32772,0,0,0,1,4194485,4718664,5374034,96,262144,0,0,0,68683726,68682048,1398362886,5064020,17104896,16779777,1711342358,47055107,117635585,16843264,738198440,1,65536,0,1430585344,-1960907637,-1073018810,12192117,-695355392,1208008425,298666101,-388823375,194511652,-1173719616,2122514433,812908806,105265984,1912603577,178435,567089588,973495947,1343648963,246731659,431235533,-125165107,-854674342,1979398689,-768372364,1967682539,516173420,-1064566784,1912602941,-402294944,-303365300,425603,-340249995,126232064,303662,-1064386509,67536422,94514693,-852446208,212257,12071797,650153712,-115072,-400132612,569049138,303150,856131622,784371392,637535648,772080802,399045,98818444,-853208136,869413665,49120192,1562371467,313933,-852159560,512306721,-1943142394,234883078,16955935,-853208136,-58670303,-2145357310,460786940,1954595574,113651222,-83885507,520040092,-970063866]},{"sector":3,"data":[16923910,771752650,405247,65535,0,65535,0,65535,0,65535,0,65535,0,65535,0,65535,0,65535,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65535,0,771752192,36712191,1027506222,-210501630,1010729006,-344653566,1007091246,-13722622,-100519906,974556206,646524418,386794040,-83742532,-435441584,-469701856,1975519776,102651199,1448235347,787297111,36976325,1967173116,1950395657,80118559,1950937835,1947008777,113672965,76146411,1150109254,-2095251460,-655686458,1499094623,1562314587,-30475688,771898382,37361294,942050094,-2144415998,146494,900998005,567085232,807307566,109850114,632554034,236849328,38058527,773792205,37488326,-2144417023,146494,-970058892,146438,145761716,382021150,567083568,1430637343,773778571,36970181]},{"sector":4,"data":[185222795,-1190497088,-503905304,-136933959,-12614671,2139298421,427097860,-1962520949,1334380630,106400004,-1996339319,-1878463737,-351747197,-1948568612,-2083812413,-443874579,-900899553,1430585350,1461644427,876528686,105286402,-12745946,-2094658955,1979647101,-1877480684,225835067,-18180,-1412368469,116108203,147293072,-930358549,49120095,1562371467,182861,37593390,-523515765,84158086,1959016991,939852987,520587271,637863028,-2010773704,1444836359,521075799,-1912573765,33998787,-1207959552,535298991,-1206881280,401081272,-1207405568,266863553,1326019840,16009,132748,-1021354401,-2126259405,1931477243,-1946449140,637424,-294279437,-1009054781,196609,66100,300,0,0,0,279886,1441884,2177,163845,0,0,0,2,4194395,5242960,6029404,108,262144,0,0,0,56887321,56950848,50792528,50987073,1497713416,1380011842,68,196870,2622208,50385923,453181712,53609219,0,0,0,0,1167120524,518818645,1465309326,-1106870588,213385589,-204961024,1606495140,49120094,1562371467,313933,1167120524,518818645,1465309326,-1945477436,-2128705088,-2096722943,-1791065343,1198850049,162543028,512303565,109838725,381157767,-1994273483,-1946054370,-1274965242,-1173770203,567083417,-402227516]},{"sector":5,"data":[900988970,567090096,25763465,25888396,464528820,-855454278,-1794717919,1610612481,49120094,1562371467,576077,382534324,62161074,-402648901,78905378,468193715,-1291275264,1370130,280232370,199791027,-1289702400,321680,347291828,57984132,-1022261210,1167120524,518818645,1465309326,26558083,-1273072640,503951397,25499333,-1273028147,505131045,25761477,-954261043,103686,-2090967296,-443874579,-884122337,1167120524,518818645,1465309326,-1961736565,274631632,662559499,510988860,856194756,134645440,624436739,-1073082252,1460013429,244340486,-385750040,-1070399322,-1006590743,-2135618442,309101606,-2077867404,1014305132,275547174,1190606453,1962934534,1408991279,-343922061,841314887,-54555905,-32766,2126781044,638234632,-470409846,-2010724606,1975728645,134661813,-1360330493,-1157558110,-1014759428,1963407364,55020281,309657404,292324390,-1073083276,2133075577,275547174,1200299637,1820599809,-2046659568,1156982468,208929044,1916926592,1526366215,-997850505,-12786638,401081973,-10557184,-1425506620,1593835960,49120094,1562371467,969293,1085332275,384308403,-1290752000,1042577,-1867308880,-1275066136,520068097,-993853039,-165278602,12452096,1959169536,101197318,-154991593,102770384,549651479,261921709,571833501,-1431394717,-127962579,657718769,754586854,-1397774543,1101553579,-1908326079,1166054031,1229276560,1145653577,1330597797]},{"sector":6,"data":[1331665231,-1705683627,-2048827559,-2073984096,-1970826874,-1920366462,1686867105,-1818061404,1868534895,-2120834153,-946315399,-454891012,-353901088,-286267157,-909785876,-151730458,-394254,-1549607722,-513380187,-235211795,-1078285615,-1128420257,549170081,729554976,724249387,724270123,724249387,757803819,724249387,724249387,724249405,724249387,724249387,538979115,1595940896,1605787615,1600107871,1600085855,1600085855,1600085937,-1335926945,1851766711,-400512846,-1682243541,-1606636543,-684850062,178970658,-336431680,350785579,35371776,1921006764,584527364,-1073042720,351007349,-594847088,911693342,906524613,-66814012,-486539340,1606585241,147464030,0,0,0,50529027,2131232776,-16185079,168627469,454761243,538976288,168627499,-14077904,-14601935,-2143276494,-14470349,-14404556,-14338763,-1637992906,-14272713,-14010312,-14141127,21061953,37904962,54747971,71590980,88433989,105276998,122120007,138963016,155806025,172649034,189492043,206335052,223178061,240021070,256864079,273707088,290550097,307393106,324236115,341079124,357922133,374765142,391608151,408451160,425294169,442137178,-13619104,-13553311,-13487518,-13421725,-13355932,-13290139,-13224346,-13158553,-13092760,-13026967,-13750674,-13943365,-12833604,-1621152323,-12702018,-12960838,-12636225,-8494912,461069275,477912284,494755293]},{"sector":7,"data":[-14538786,-14013846,-13816467,-13948053,-1,842079231,909456435,809056311,151567293,1380276049,1230330196,-572829617,1396773133,1212630596,-1169405110,-602881826,1447254106,-1135784382,1779482558,1880367122,1953722993,2021095029,613519481,627908902,594224908,774709800,1835624551,1801872740,1617125985,-65682,167774462,184549120,0,0,0,0,0,0,857624576,-455569728,1945123936,1971365947,403109438,812976132,71908992,-1976995324,1006901030,-167414459,477430980,225727292,158615100,393557820,1963181302,388401675,-153815548,125111492,-13740001,1392608558,-1973296048,-427815712,-421493151,-2135664543,-1003298782,-434065328,-823633888,1968454656,2028210722,10676483,771754657,1023512483,-243994624,771754145,1526828451,-13740001,771853614,26754688,-385649664,-30539646,-83781626,68617974,1008432132,773289286,26674886,-388461824,61866090,-1757511634,1366622209,-617392917,-5187446,1934949248,-2020987324,-13500140,1917320064,1408991288,116798327,1948255255,386332204,225772292,-1073035382,-1976688779,-352247417,-1202499560,917733392,-2128675026,777542401,25239295,-1291841352,520039990,-970063487,104454,-816308389,1448235347,-850065833,1594318107,1532582494,117321411,-1278279273,1948924930,1006744338,-1291029450,1948072964,1007203078,168785208,-167282204,387850451,503890692,12780567,-16185337]},{"sector":8,"data":[-16382716,197121,0,0,279886,852067,2269,163845,0,65536,0,65538,4194365,5242960,5963865,114,262144,0,0,0,42862728,42860864,44501170,44695617,1431260421,17747,256,1380272902,55330126,25428737,50441219,564,1167120524,518818645,1465309326,149143603,-1705947056,65535,1734,3139584,125157387,184590568,-2129038144,1929431289,-1074754797,-661913530,-1527529330,1734,-1878922241,-310157729,535137026,-1161081507,28901948,-1850715648,-301743485,-360490320,-301929726,1022099691,158620250,-503004541,-339725340,236357969,268879360,113641472,-2080505839,-1964244286,655407584,854392626,-1963193632,-1309154592,29881861,-16116619,45158516,1963509750,-155058679,41223367,234930686,114425872,113704977,2228228,-1191112008,-1094516545,1048773279,1962934300,245607704,279096320,295873536,238977792,91553792,-1695956941,378229248,-1031602162,-293556221,839051907,-301929536,-345984950,-1031541248,-352145405,-360452608,-339725822,-1956975104,-2097148394,28312770,236358638,-322358528,378273250,-1031602162,-301223932,-1962933573,-2097148394,-919403070,1963043052,1979310596,99255173,1951218924,-478196986,-1946191895,1107299862,-1947336272,855641622,-1145008448,958792704,-2096597993,958792387,-1996196585,-956294114,671089670,31111168]},{"sector":9,"data":[-1023359559,1167120524,518818645,1465309326,-1106870588,246939648,-204961024,1606495140,49120094,1562371467,313933,1167120524,518818645,1465309326,-1996071228,-1946151906,-2097146362,4670,646602101,-722075631,568654492,568771594,248447467,-2080375832,7230,-555216524,471763966,-1900006656,126297792,-1275060573,1089589,512303565,109838360,632553498,-1174400864,567083040,568654492,1115682,113713638,-65518,248447467,1610611688,49120094,1562371467,313933,1167120524,518818645,1465309326,1048836764,1946157074,-1977490381,-167767770,-339473708,-1960712704,184556574,856323291,-1581216064,-1993998306,-1608141817,-987889648,-855631850,113712929,18,248447467,1610611688,49120094,1562371467,117581,1310979,262145,0,0,131072,131072,2,0,0,0,0,0,1381061456,508909398,-1899459578,1501400,141869067,136843,1318655,1599938311,1532582494,53080]},{"sector":10,"data":[0,0,0,0,0,0,0,0,0,0,0,0,1049296896,-141885426,-1962752381,-292507434,15456139,-1978718996,-1328116760,-678695248,-1309933333,182506244,-661940027,-793717109,-338195474,254077952,-695474038,-1947275088,-335483945,-523041615,-989136757,-695512936,-1544634317,-947191538,-729100041,-355335247,587203001,600963025,184619022,269912017,269891841,1997435905,235831303,99288065,17698432,178434,-1054620534,237228535,-1056243440,17827463,17827385,125242996,17698432,-2147095792,134286862,-434065319,-1014236384,91537675,17698432,17735937,195,0,378208256,-1460928498,-352094912,-768372614,30545545,95539338,28961490,-137288960,-737270831,-2016343295,956421142,1946276886,-2146994418,67228174,243271147,-1979579950,-771509808,178666,-772288221,30674467,377999627,372834772,242483668,243271543,-351272494,-770801659,-661977087,-523041615,-677199836,-754536191,-1058832157,30809736,30934726,605350657,-666992577,192020737,101191031,113639894,855769560,169929664,-1744709882,-694105973,-661940223,30934726,197364480,-2147126079,16896526,1342296737,551952560,-121373864,-118027518,15666179,0,0,279886,3867052,3103,163845,0,0,0,2,4194565,27328592,28049836,118]},{"sector":11,"data":[262144,0,0,0,674236668,674234432,24841087,24903745,-2147418108,7,194445312,5242897,8912640,9961472,-265289711,65281,195559424,-261095407,11140866,12189696,-265289711,65283,13303808,-265289711,65284,14417920,-265289711,65408,196673536,-261095407,15597441,-2147352576,10,197787648,5242885,16711675,198115328,5242885,17039354,198443008,5242883,17367037,198639616,5242883,17563644,198836224,5242883,17760248,199032832,5242883,17956857,199229440,5242883,18153470,199426048,5242885,18350079,199753728,5242902,18677751,201195520,5242884,20119542,-2147287040,5,20316160,-265289711,65280,201457664,5242897,21495553,22544384,-265289711,65282,23658496,-265289711,65283,24772608,-265289711,65284,21233664,2,202571776,5242885,25919489,202899456,5242887,26214731,0,1296387846,89016642,1414418246,1229195091,1095520339,89,503513357,597492486,52683011,-201120203,535626533,52430083,1946360198,550699799,51348739,-603777530,67131173,616366849,52749315,-167565737,38,0,0,1077936128,-1061126016,-100401153,-803739264,-2131225653,-100456727,-803739264,-2131225653,-100456727,-803739264,-2131223613,-100456727,-803739264,-2131223613,-875550999,-377423853]},{"sector":12,"data":[-2131098867,-875548439,-377423853,-2131098867,-1009766167,-377423845,-2131098867,-1009766167,-377423845,-2131098867,667881,2228246,3801134,5374022,1769566,2555931,5832743,5832805,84213861,117900549,202114823,202116108,117902348,84215559,-1610611451,22938240,16973904,-1610612736,0,0,0,0,16777216,15728641,41943215,65886,-65533,40,524288,34,524322,8196,2490369,3997744,157286522,41944790,1572929186,41960540,24641186,16646394,245825409,16648644,353959809,16649744,6356865,262216,0,0,1082130432,67637280,12058882,-1441739505,-855633736,251705360,272371917,1962934456,-1899459565,25672384,-854588744,63879696,-284751944,541362883,281928754,12779952,-16777216,0,-16776961,255,-16711936,65280,-16711681,65535,960379452,4143933,960379452,4143933,2670588,166264752,13156096,-1574518734,280559632,-1431984896,-492132955,-661863432,-61489010,-402432536,1458045563,9496577,-402635288,-689437860,57534465,1048626013,1962999825,285656597,-661913600,1442627726,-402443800,1357381637,-1077715709,312569184,339118848,-397388288,-142146832,-1191162952,549257221,28371200,-1962928479,-402646986,-24444565,367528116,-1610565629,-544489330,-402642754,414449677,-1962736664,2144763,-67057474,637535418]},{"sector":13,"data":[648283530,648283530,648283530,648283530,61080970,-1008147718,-1064380276,379586483,583213568,-1577054178,-1020657648,1283254644,683604106,387072,-927021174,1929591808,-1948743137,5290494,-528087669,-528033583,-1963597141,-791621628,-33257272,-1008437813,-24393590,838901946,-1967115301,183030565,-1965520157,1967827652,-1021572880,-125118218,-402642754,-947257339,-50280258,762512188,-24389494,50372793,49251321,-372123765,-528087669,-528035631,-1946819925,21334778,-1060054832,-33471096,-52988469,-1161262397,-234684256,855542606,-1967115301,182506245,-1428387133,150107466,-1077674980,379678048,406227712,1221376,1324681,1115846,5367809,79358417,-1193571328,-1064394752,-1532700530,61121700,-1532713742,-234642268,-611389214,1835057091,-1962929503,-402648010,-372178909,-2030041926,-1193571081,-1064394752,-1532700530,61121700,-1532713734,-100424540,-611389214,436612035,-772222720,737726968,-1962927050,-773402162,65458662,-2114976783,-1183973178,-1195180000,12451911,608078702,637184,1977995,1849087,1718015,243913099,780730400,-315424734,-772157095,200921593,-150438455,66651097,50981873,-2097143794,192827625,-1056708213,58708267,1502627051,310233355,-645146121,2110979,-100403197,-880019742,235080427,-377421790,108921182,2231849,915021182,-1189216222,-1047617536,-315434610,-1527526774,-184289277,-193605890,-967195873,4358,5433539]},{"sector":14,"data":[297517107,1946630144,185042953,-402164499,149487009,82363136,-17176576,4700355,1969803,-1946562239,-1946147786,-1610563622,-946937970,-1536294721,-1532713820,-1532713820,-1532694525,-1532713820,61121700,-1897340176,-315374630,1130112,-1590660096,512426006,-1019543534,-2137849475,-1020528413,2097162301,438208794,1614080,1318539,-1020540789,-654900099,540924299,-1592754688,-131858410,-1962927453,855644190,-1982466112,83893278,513998880,1745152,99152779,607553792,-778648832,-771829250,62915582,62915520,66061248,62915520,63882224,63832067,63832069,63241992,1794,-1173945672,-1192295484,-826605816,62451459,63879680,17152239,61916143,-284963142,-285211208,244002499,232981786,-66778434,-796152530,-487609042,115703,16777473,65537,65793,257,402653192,524312,4112,16,1799,458759,460544,7,117442311,0,1792,1950942976,-527767293,-955595485,-14287734,-1429992705,-661726836,570884792,63224547,-284019549,78703824,-284963142,1183570318,38176516,-1996470649,2147419206,118431551,-1065352957,-50794272,16777214,-66847231,-267388921,-1069555681,-789151617,84542770,-1020132062,-1003306446,-1022704078,-1005927926,-1021131254,-1004355038,2058012194,1840675303,-1431655766,1194936101,-661895623,-1957345904,-661774612,-402638664,1465262548,-337050765,12188679,-833713919,1183432755]},{"sector":15,"data":[239504336,1946165309,-816936855,-2046771014,-2050621719,-33262398,-772984127,1944244706,-1459244304,74711072,-1023490562,721347968,-178878251,-478029685,-338624484,-75496668,-2147257851,-779484479,-922564606,245336878,-1983655162,-208938402,255617,-875443247,-20036866,-152078902,1946275398,-373279995,-919402651,939524538,729075534,1992622517,-1036276454,-1378496267,1183428013,20819426,1023833089,-713752317,-1378496263,-1390786935,-1390655863,-974895479,1001202294,-707725886,-1985106515,1034804294,158597377,1025559936,-1451949821,-1378496263,-1390262647,-1390131575,-153205111,225710277,86295946,87295860,-847248524,-143751040,1959884344,-145850285,175555872,18906243,1149911924,-129595358,1014556112,2126786419,1569400326,1435182596,-1898935290,-964784704,-1409283911,856122506,-1965028670,-1020129468,-789134326,-1930632534,1972177990,415663072,-351635831,-13768445,185890443,-1946782474,-16051586,1330573172,620185226,-1957596150,1451958350,1946724382,-1962760161,-1948611647,1451956302,990999574,-1862172984,41866043,-268184697,82574083,-100404989,-1206099992,-826671101,212020739,113651205,-284949222,788465848,-284879709,771753400,-284880733,1242846859,-1960812917,132350459,952601344,125095806,-971487605,-1962739130,468464,763164475,1187431210,-1976696327,1996869295,-96025084,604505089,-1948646649,132350419,-1886769664,-662043178,-1959863549,-351936865,-110720971,-829453778]},{"sector":16,"data":[63046405,66716634,634620914,-478085113,-1976696825,705025711,-972787005,67238470,-1979243512,-1144485151,-472710913,1183370378,-295794179,-355341615,91613905,-919410398,1451838018,-1965192472,-1982728471,-74780594,1586090998,-772812302,32494063,1586176638,-2134144226,1946210174,-772878068,32428526,1317739126,306613014,-885325386,55052157,-1228405800,-60913409,-1946454392,-947135362,1174529015,-79235550,-150834048,-528578081,13598336,2123044212,-137917470,440795617,-2131015946,-537460108,-1964605815,1183512438,1964812302,1946396751,-128021958,108650704,1187415987,-620068616,-1007283080,-1909099456,96013406,-1730097152,-594881290,-523235861,852817560,132350172,-167639623,343147206,-167396119,1979710790,182878219,1963654784,81389827,-402552648,57876136,-2096842519,-57990972,-1930789239,-1983869232,-930288570,-919349106,-1191747958,-156543151,57938115,-156608848,510919107,-156609616,376703683,-1934968656,-1463899192,899333,109946355,-1993997032,-1007226043,-1337101280,1183558328,-1146049780,172395434,-645089109,-661735253,2005579947,-1965585493,129498182,-1196767454,-1951686610,78687170,-151296374,125059267,1451821236,-1423984686,615573386,-1573996373,-1413313621,-1411805512,1980420659,-1341426435,1183558333,850963438,2122951679,-816444712,-437714059,1927532544,10742019,16139974,-1928956219,1350042740,1947255798,-163133922,-1966437504,-461372572,-1174228985,-1192295474]},{"sector":17,"data":[-1557264379,-1947269872,-1200297007,-1951693686,-1951669178,-1193606184,-1951685494,900770755,21269418,-536168277,883734699,179872939,-155669564,1256958928,-2147261302,1678395380,-972655353,-339675578,73697846,-1983630676,1686816326,-1003312124,-1966586231,850134116,-901346876,-1422480200,-1425661256,-1413069171,917559435,103987370,21466539,-1341920341,-930305364,-919349106,443872778,-793194870,100237504,-638187662,-1274494592,-1096027192,78710170,1325311475,-1961921286,-663320585,-835989621,-661733236,-164453133,-2096214389,58007801,-788484631,-1947610647,1451940470,-813793035,1963880961,616991496,1946237955,-796215292,-797015893,-1341492734,-1967609306,-830428379,633768706,1967652867,29816333,-427790732,-1031096066,-1203214869,1551222410,-154891592,1416954566,-1196808528,1290470794,-372119087,-478029429,-155713524,-784501552,-1949380146,206278,-159377291,80147972,-1967648652,-506352680,-825105967,-1023488303,-670325781,1962934845,46593548,649070453,-773074518,786105323,99518347,-1425944960,-1401042178,-153715063,125108934,-1196808528,-1934940790,-1093103928,-1515911774,-230257755,-1993940858,2122971973,-1899983660,-396981288,1903481355,-166830454,1802837187,1946403830,-5195746,1946272758,-963987453,-527779669,11189931,1965081590,-789071845,-166335573,1979710790,10796610,-2131278090,1190528628,863273206,57928401,1957349003,987444008,125172062,-1420865864,-2092480837,175374842]}]],[[{"sector":1,"data":[-494224976,-1262056789,-963925005,-619992512,-1014299788,-1954681941,1579931230,79578072,-2096975616,57811195,994701009,-1340178730,-1031034183,-743708461,1958882272,1174349328,-154795010,-1329034269,-1047811351,-1949594709,2128493530,736004866,-663319594,-1527529077,-265554037,-12204506,-154403158,-204960797,200289188,-1961001262,1036463046,158531459,-527826388,-341056848,93765131,-1523669714,-1426061779,183522955,-1961921290,1988875342,-204592168,-1980594524,-930284715,2123028622,29882103,1538261876,281540266,1588593524,1499445418,29882027,-2014772363,2046757376,-163121640,-1339787968,1183689405,915254214,112788930,-341445888,281540114,-940176012,-1207405304,-1951676799,-156507066,141886151,-1412988488,-1411496309,-1411133256,736777867,-2080734249,-360707470,-1327330814,233548659,-1425837384,-2085951056,-1031076374,565426347,549975723,783818356,1451994016,-1413313582,1720321200,418152699,119847083,-1573996373,-1413313621,1947256822,-964577253,-431584341,-478093430,99844109,1451952501,-775803932,-1413338142,-1412988488,-1965013365,65241311,1963062144,-564753655,-489569749,-1951677909,-953423290,1929347901,-1979569143,-1411206944,-1765930517,765830405,-1330970618,2116790987,-940156950,-989629424,2126781046,307137314,-109149956,-50236415,-11198029,1532881502,23643265,-67108424,438732846,378726405,-310157729,535137026,550128989,-396457216,-768357493,-247035325,334823740,-109149990]},{"sector":2,"data":[-50105343,-81011721,-1073029237,-1057093516,1183319157,1720336881,1975844595,-211384316,-397506239,-974240119,2126781046,63879714,1854589235,-402398221,1317732428,-1305353240,117618884,85500718,-1194413329,-1557266171,-1192295152,-1557201144,-202439404,-296863324,-217903499,1317796611,307167208,300674421,-470716790,976899,-83627261,1964134143,-371510353,-443875506,-1557264208,-1192295148,-1557266427,-1175517936,132842498,653919370,-1946483322,784642753,-284878685,-321859918,-789642064,-1394248211,629810938,-1950090326,-394908681,-2147291517,-2097024642,-994443050,117618691,436651566,-1292959227,784436174,-284880733,-970817852,-972492218,-2012680122,1183513950,-129566979,-1978436224,-1006699426,-17015160,132350411,173933312,-662042830,-84785525,92940015,-72694902,-471314805,-16205816,-205288721,-263812182,158655498,-1977159686,-1430025723,-130053,-1300950450,-1880499405,-1864856322,-326412987,-1193767394,1843920954,1918326296,306613012,-775801959,98619872,-930414560,1930975208,88664323,1720312067,410437112,856587972,306613202,1383383051,-654899329,1586092851,-96040680,558730022,652889737,-1995160181,-166994874,1149974388,735087362,-661971898,-752155523,1451875123,-531199518,374704934,377346619,721831051,-1036313530,-1031077252,108969995,41861947,-739699989,475958020,-1981653367,-617357218,373656358,1183433515,-532282914,-503856381,727026470,-1991720445,-1014241210]},{"sector":3,"data":[-628362357,-1023155721,-330921656,1992672907,-666450166,-2094661632,1946162301,355318342,-2081401207,1946160252,357808675,-1947183479,1451822676,307530714,-1948887415,1451823188,341085144,869553801,-598308398,-1105832821,-771025647,197022068,-766080747,1451872819,-1169888292,1451824526,209486832,-1172081664,1451824447,240421872,-1948625271,1451823700,273976278,-1948756343,1451824212,-1982712876,1418452054,360103446,192205323,-1995083586,-768355754,-1982048631,-159255946,1988695471,544654830,-1996073845,1174664278,-974981348,1586174070,1962281758,-1995666573,-74717618,-1996204917,-785652650,159177003,-1947828599,869477327,-2114352165,-2097149977,-537458449,-771981687,-773205527,-1983839255,-633604538,1992652669,243188756,2129811199,1958743035,734069534,734759875,-1972404774,-775386391,-773271064,-511684376,1459572999,65727474,633547713,-880082937,-571745749,-1981391223,-880024482,-410912373,-276627449,-1981810936,-472777602,-472783919,1183433475,343328246,856587972,-229179429,-930420342,-388896559,-2142181167,-347011103,53537260,1510083305,1354773342,1381388360,-886366485,-376828034,-388904822,-388896559,132218960,-127517871,2122569588,-680261412,1213251635,307137360,444582155,-472363381,175555846,-1961868151,1177281606,-531199002,-371042773,1992622814,-485717216,-431060135,-1948100981,2123097206,302180576,-1174404168,-1557265458,-970062580,33888774,33929455,84976430,-1195068689]},{"sector":4,"data":[-1557264638,-974191336,1149897334,-2012797941,-1111833530,41714453,-1978829823,119801668,-1178057080,1726681875,-372222327,1149960539,142377230,1992622339,-1977584630,-523236540,-999913320,-2095722566,1946223228,121932507,-2003246896,1471793254,-1993086189,-661926330,-1023164413,-1980479997,1150012486,-1002010360,-2012593014,-591739322,41714453,-1951828991,1183384644,105155272,-1177926008,1451824010,1317753296,-775844890,-773271064,-2113948952,-771749919,-464614422,-774272183,-773074453,-2113947925,-2097149983,-638122007,725673682,570588632,-430011946,639663812,51019204,-1950091650,-215223178,-1962742141,63879898,145810314,-1977159686,-934901243,1317796778,2093550566,-1207340007,-1963983096,-1426864058,145811338,-1977159686,-934901243,-33293398,2145275647,-1972180021,1988872294,1324559348,652107403,-1003354742,807846434,1317750533,2093550566,-205223410,92939946,-970800078,50671654,-612414466,1183530987,62915534,179960,1653268363,92939976,-1037908942,1191522342,199642763,-1978762039,648737732,-1003354742,807847458,737905413,2035207806,-864156717,2145275647,242664904,-1003785019,-1004134274,2114128509,-159479306,33587945,-1964977202,-799604786,-638187338,-248904076,-522982018,1997077888,1961691665,197145114,-1409190666,-315437686,-1070406421,24442379,705212844,1272441833,931870283,-1959376053,2026441231,197145115,50623734,-760419210,149520608,-383067658,-855460749,-1360270030]},{"sector":5,"data":[-1964214781,-1781042,1988874326,-361364500,1944614459,-327775972,66354827,2122970750,-128021514,1988804659,-595688452,-351964152,-1871058010,-829765325,-1959376053,1962281783,-327810206,-28341450,-757037396,149520612,-247801354,-830075777,-836058925,145828725,-1059910933,803982890,-1393789437,1459602566,-2084272432,-1959394069,1979058999,52751339,613084278,-377437997,-2032536056,-799604796,-1059863418,-167188096,82543577,188189494,1272739318,-1964996021,-13899279,788031115,85591750,263907328,-310157729,535137026,516574557,1166681600,-1961301217,1311895118,1325378802,639532282,1998472506,1160390376,652374557,638864779,1948271930,98694671,-654114808,-463601213,-56497832,854615807,1407242724,-1960388469,-1960430783,-936692407,52655195,1183570510,-700044328,1174602879,1183400404,62927832,-1977170983,418062149,837701259,-5442994,746388046,507853350,707192951,-495837883,541407782,-466440588,-1957437231,1099638488,1233856051,97004341,1952120840,-1009187887,1491361281,-1946407191,1311895118,-766604302,-654065613,145772739,-100413766,92940015,-1429977462,650336507,1446122890,651436740,-1018751696,-832664749,840272422,-735919018,638922790,1446121866,651436741,-620555984,840010278,-735918506,1192308774,-661863589,-1957345904,-661774612,1443163267,276219223,-1979169654,210439014,-1996327797,820247158,-1341660032,63879682,134592751,84976430,436651566,-1947270651]},{"sector":6,"data":[-91550634,240028494,33965814,-242547596,-773273293,1073854477,1023231624,50754563,1451858368,276743176,175490342,638338699,-150569589,-1947204633,-645198258,-372119087,-251401775,-1064380276,132350273,-1618334208,-872546006,113405,33965814,-788787595,-154927389,-137417773,-621329959,-405679114,-405674031,66944640,-1957211275,276743379,241011494,-1962379638,9046398,545970947,-536164557,180761260,-152816956,1946224198,852295170,1975657156,477382943,-773092523,-1965782293,579485184,-536164557,180761260,1975661252,1575805442,-349604513,138840930,17188598,-789117836,850188278,1975722692,1237617171,-142128780,1131720435,66553665,-1003311886,-506338863,1190584785,292880902,-638070997,-523222711,1312553843,-350192134,-388937467,-1047790733,113651452,-402651878,1583287632,-1962742397,1297948645,-1207955766,-454295553,1167120524,518818645,1465309326,2112405555,-385649904,1992622434,-485717230,273582864,-1961994613,-386233359,1992625288,-2130595566,16975996,1183452020,-1732194291,-1324718456,105155332,-1961990409,1959071316,-1947204854,-661974970,-388896559,-268179247,516993,716147246,108956417,-1962385781,1975978947,12445955,-1960393842,-478065891,-771031025,-164729483,17127047,-1976679308,-1341823321,63879683,84714286,436651566,-1192295675,-1557265915,-1964047088,772321509,-284879709,45663410,1183510279,-2027803123,841876854,604341895,613087751,-369425272]},{"sector":7,"data":[62390433,212020736,113716741,328976,436651566,-571997179,-16205588,85238574,-1915603985,-782955906,-1349832989,-771021396,-511044235,-994442576,413347331,78704389,-321859918,919745519,-125172342,-704699254,-987577294,76071986,-789445817,146929345,-346174348,83460158,-768405899,746897459,-1169673868,736839679,-125116534,209048075,-826669904,-790525437,-768348180,746897459,55050612,-155070222,-596375359,-1014247285,-401980184,-970060852,334342,-310157729,535137026,281693533,-1427636480,-1962874140,-288274706,-947247734,75033866,305438774,142208266,-1021131726,92849202,91865139,-797261440,-25211451,1925959883,-109097724,2118993867,150832123,629862268,92850058,149783367,-791941249,1292137163,1204550015,-2080670131,-277083907,-1157691208,-268827698,1032324490,-310163461,-873955576,343534858,63879762,-661986422,-268826448,495453578,1524402939,-661864397,-1957345904,-661774612,-402604872,1465257580,-2132212877,1187445760,1992687595,71600906,-1948498295,1183385156,38046686,-1947908472,-478065892,1586036751,376882670,-989707125,2093227638,139234058,16906625,-108983948,913637635,-1962750080,1317604940,33129442,2122899408,106204136,-135506295,-1980234782,1183642238,474385396,1946161725,277797,-1326905227,112643,-1070398741,772447208,85591750,-2090967296,-443874579,-900899553,-940179428,859993216,-1949158455,-1957755780,-984743308,-661911970]},{"sector":8,"data":[192201483,1468731275,74943234,-402227317,62392788,212020736,113716741,328976,436651566,-840432635,-16205590,85238574,309773807,1183384715,38046680,-1948629367,-75299748,1955299077,-398002556,-1978567423,-1730096956,-1965529464,-523182266,-597260136,-106460626,-25513960,-163149368,-989761304,-1951590794,-930370096,-271451509,-271454255,-1947042301,132350426,-1618334208,1183514922,58673178,1358903017,2122929694,-362903310,2089485451,735785730,-1291553854,-1948715262,-1949856816,1187441782,-2033811991,730922820,-149916735,30114008,1187438327,-2033811479,-1958281404,1925856200,80445445,1988741767,1976699888,-226587895,-370516342,-930348828,2123094158,1976110076,147554333,1963246582,-142704619,940537343,1635052382,1391156872,1510054888,-1007265813,-1206225656,-1951666559,-1976652863,-2147448153,1183450308,-2118603799,-1031033914,-346146645,1585984372,-1886769429,-315490158,-1959863549,-1962906953,-1096485921,78715173,-557440,515769716,-217337575,-129594460,101041963,1166550528,-531199490,568805062,-2115469696,1720326005,132415719,-994442576,413347331,-321851643,-827194192,-226572817,-1963960693,2123033182,-162624552,1440773771,1576558335,31999734,1183523188,-599357475,-1948367224,1183308102,-632911656,31610507,1188098646,-777423897,-1980093470,526317134,-796152324,1489537965,-1912687895,-1929428290,-1983803695,1317664894,-1899393798,419413721,-218101319,-142704476,-1978305281]},{"sector":9,"data":[37545286,146673269,-217796327,-596210267,-25851610,-152150389,1954605126,-2013909399,1946223958,-549025183,1988567598,-2026754555,1183319430,-616133924,1988567598,-2026754555,1183319430,-1484116264,61867366,772001466,-284881757,771884472,-284880733,-2132261178,45663410,413347335,1891561221,1489177,-557440,2122321012,108266213,-1189516098,-1527578598,-1976687381,52808847,-1215615269,-1527568980,-1323756354,-142704635,1007252735,-1106938878,129046800,2122950131,-2037529604,-953417913,-2132246912,700337268,1423641,2532595,2552133,-1007223995,638219266,-1007925818,-213531098,-1948022193,-1976635810,-1977234289,786105281,632076171,-1527522166,-1323745602,-156962039,91488963,-112867802,1160259151,1203684350,2472217,2532595,2548037,-1007228091,638546946,1340294598,-112867802,1170613839,-1329347620,63879688,629862394,1207647624,-477490973,85238574,-87586065,-72735350,-963905054,-268826448,1032332682,-192230405,629801394,-1003305078,-1003305438,1976699562,-695481599,629861603,-1003305078,-1003306206,-336338262,-2134378771,1589983860,39291670,1334573707,443976452,-783253938,-1947807258,1239941744,243718,84714286,268879662,771753221,85591750,-415045628,788465848,-284879709,-1961984373,-930410426,145870603,2126847861,75334418,-1961659387,39160581,-847188342,-756625280,-382866434,-336987156,376882683,-2130551669,-1912600605,541428696,1996489533,81382]},{"sector":10,"data":[1837818996,-1979610590,1368000609,410094096,-1982314871,1854462550,-2130726684,1946346878,-398002651,-1978371071,1177737286,-580504868,182343218,1958873796,-1978930259,-523182266,-969738030,1183359092,-295793690,-2132261130,1190547060,1215594724,1451750958,1081344261,-1994560584,1317861446,-465138950,1988567598,-2026754555,1183319430,-1484116261,61867366,772001466,-284881757,771884472,-284880733,-2132261178,45663410,413347335,1340862213,-12403059,-1047604852,-1980203383,-913507762,146397582,496418304,-1976654605,-1960457073,786105281,632076171,347710707,496942592,673621235,-930350267,-1397257426,-1180372187,-1296170997,648344349,654132520,-1946204888,1992628806,80118550,-385646776,-1387201841,514709643,735087446,-385649197,-1958084455,-772812293,66048495,1586426494,-196702476,516993,-827356626,-1948646651,132350419,-1886769664,-355400234,-355341615,-383646347,1245890866,585522826,-1966398741,854166245,-1963881527,-896803970,1190535600,91554280,-336044289,1347835714,-1957670573,-770973098,-527820171,-1341660032,63224322,85500718,-1326657297,-271666684,-523189110,52816080,2055902720,1492159448,1509449471,1600018523,-790462973,1589539776,1273583647,-1864856321,-326412987,-1193767394,-310181887,535137026,281693533,-1864856576,-326412987,-2082959842,1465257708,-2080610679,1946226302,243172140,-1203801086,1720385537,-2090967044,-443874579,-900899553,1183645710,-11528464,1996425334]},{"sector":11,"data":[173997830,-562774005,-1980353597,1988751990,-260666892,-386498931,-2092564390,-244185602,-1070349077,-1980742007,180287046,704256,771754683,-97142,-22705618,-230258177,-24671698,-1981533441,-397151162,-1168375896,-634716158,-97788555,-232008075,1187499893,-1107295504,1988689925,-226587146,1308624360,-1393822599,1883734,1736739630,92874241,1770294062,1166616065,-9771006,2097475203,-1933353241,1430622424,-1910575989,720143320,-1946396842,-620031394,585696121,242664706,50037579,-472836225,185222795,91491398,-1851261138,-2020921821,149496727,33810690,-108852085,-2096204795,1912734332,47363,2131097987,108301816,-1006503960,-1951724930,-1047811134,30927275,-946940020,-1949008243,66814748,12256126,786105088,592553983,-1155498611,568918017,41192705,1284163891,1284133122,210391297,-1996376088,2123233374,-1898541868,-1946799162,103475409,103213146,102951002,594867723,1947598467,721322762,-24967820,51672383,132547062,-2071253504,414786001,-772199680,-1951665175,-1097205690,-151584765,-164376437,184937448,51279094,-2071253258,-276618799,-1414812920,48043,-2013222935,-581588446,41207159,1241928843,-1274127221,142376963,175424771,-617414028,-1174636919,61079560,-1946426638,-217842570,1996614784,185955051,-1310362405,1166681608,1159866104,1159866096,-236803352,-352320581,105679705,2114320771,-13768445,-402099059,-1924005648,-370607500,-729131008,-472786549]},{"sector":12,"data":[-472783919,593600397,-402647832,250085393,-771510016,-389360946,45809669,-1961104640,571891,-892285232,848873098,-1107068734,-1406262439,-492125134,1972225017,176080096,-1962932294,-903739826,543000870,-1274519925,906540292,600363692,25700058,1976434243,147293170,-378155778,-1931447155,1473810128,-768353485,146407219,-1967115456,-670887868,50873482,-133976880,1144700852,973567239,41226052,-333261578,-579483138,185071800,990147803,186873304,990147794,186349008,990147839,-2129431048,184615143,48660687,-410980854,-2131817980,643793101,-1342018168,855829249,-2090967104,-443874579,-900899553,76218386,1359107210,-617351630,-511260365,-637282301,-510994173,-86898511,-53291312,-120400176,-75376944,58458494,1497419392,1344362947,-652074719,33,0,-256,-65281,-134744065,-134744073,-541097993,-33818641,-67240194,-1075843081,-134744193,-134807305,-608338185,-1109661721,941691006,102961953,8960,-1864856576,-326412987,1473809950,-1962260853,1586170966,140380934,1860701044,108971263,-1993954308,243188757,142442534,-1979157501,-1730096954,851610521,-310157322,535137026,214584669,-1864856576,-326412987,1457032734,-2084555945,1946422910,243172102,-987859707,898304638,1997012611,-773402348,1741062630,-1899459583,108971224,-1331321348,-2090967295,-443874579,-900899553,-1909587954,-2144996066,-830342943,243859463,378077546,914948460,1049166190]},{"sector":13,"data":[113639792,-1325334167,-1577411392,512426006,635961368,1947955968,-2033634535,1359051278,23594694,1843985216,512634589,-1571281419,32178554,-68677937,-1909537793,-2077887202,1963026446,952709932,1946249486,1845902113,52133633,989865478,2080467462,1881029393,-2129953023,989863875,2080467998,-922009343,-1909537799,-970590946,92422,-1864856381,-326412987,1457032734,108971095,-1207956290,-930414588,1604645884,49120094,1562371467,313933,1167120524,518818645,1465309326,243714355,1709375866,23594694,872062080,1980139456,1912996097,-2017447167,16873478,-83790842,-52641816,-184119762,108447013,-972302196,12528244,440576,1743300083,512634588,-1577441803,1990393856,1913006337,172289,687962275,-972983290,1073833990,248447467,654310376,24774342,-2090967295,-443874579,-900899553,-1070465020,584120003,-789134396,584382147,-1009453372,-1966881654,-1009715516,851690546,-1009715516,583255074,-1009715516,-1005924106,181728963,-1009453372,180601866,-1009715516,-1010565200,631448938,628237677,629089653,630138244,629613964,630465916,630793643,631776672,33817602,67240966,67240962,33687040,1167120524,518818645,-4663154,49120255,1562371467,838221,1167120524,518818645,1465309326,-661731188,343852284,17983105,-1928432384,-1191140810,-1527578592,-337963032,-1036612341,6863104,-1527529077,-310157729,535137026,315247965,-1864856576,-326412987,1457032734]},{"sector":14,"data":[108447063,-1193601304,1583349759,-1962742397,1297948645,-1946155830,1430622424,-1910575989,-1671997736,138841082,24512043,-1962839389,506136158,512295288,-919404172,24776326,248447467,-469763096,1483616,1580681,-437731151,1947759613,1745780765,-73646079,-337955864,-401682687,-1909522437,-970590946,16873990,-73649173,-337970200,-401682687,-1909522437,-1675234018,-1593724422,512426354,104530292,-1468727274,1580603,243835509,32178554,-68677937,-2090967041,-443874579,-900899553,-661913596,-1957345904,-661774612,856053590,2047772361,-1604066559,-1073610392,2038004594,1923218076,1948158721,-821957887,-268274,-74714997,1307101491,-1992198659,-1996483018,-1677715394,-629479173,248447467,788528104,636821134,23594694,-1577411584,512426354,104530292,-1049296874,1580603,113687413,-352255622,-401682687,585891835,23594742,-1676249792,-631576325,248447467,788528104,636821134,23594694,2047264320,1594294529,49120094,1562371467,16829261,16777217,-930348800,-1070344050,-1414812757,839446403,317378815,-1226125104,-2147373053,158601466,-92273744,855798832,-773402176,-17822746,858225866,-1966175552,-1964977686,48112349,36150951,-802708857,-487730963,-1965520148,-763318068,17311464,-947661333,727433992,-149326908,104412888,276234250,201734454,906262016,-1962931037,-469763872,696630,828214,12238899,-469763712,0,0,0,131073]},{"sector":15,"data":[0,0,0,4194304,0,2097152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,20971520,175,65536,0,3,2097152,262176,-12648448,-14680065,-15728641,-16252929,-16515073,-16646145,-16711681,2130771967,1057030143,520159231,251723775,-16711681,-16711681,2131820543,2134441983,1065156607,1073545215,536805375,536805375,1073741823,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535]},{"sector":16,"data":[4194304,6291456,7340032,7864320,8126464,8257536,8323072,-2139160576,-1065418752,8257536,7733248,6684672,4390912,196608,-2147418112,-2147418112,-1073741824,-1073741824,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,2097167,262176,-65536,12648447,12584704,12584704,12584704,16254720,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,16269056,12599040,12584704,12584704,12584704,-63744,-1,-1,-1,-1,65535,-12648448,2160895,2099200,-1623455744,-1627096846,-1627111182,-1627111182,-1627111182,-939245326,-939245530,-469483482,-234602418,-117161826,-234602434,-419151714,-838582066,-1643888410,-1677442830,-1744551822,-2147205070,-2147205118,-2147205118,-2143535102,2127874,2099200,-12646400,63743,0,0,0,0,0,524291,2097160,262176,-65536,-1,65535,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,-193,-1,-1,-1,-1,-1,-1,-1,-1,-1]},{"sector":17,"data":[-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,-31522816,102236160,102236160,102236160,102236160,102236160,102236160,102236160,-31522816,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,851988,16842756,0,-1,-1,-4097,-6145,-7169,-65040,-65296,-65040,-7169,-6145,-4097,-1,-1,0,0,0,2,851988,16842756,0,-1,-1,-32769,-32770,-32772,-65288,-65296,-65288,-32772,-32770,-32769,-1,-1,0,0,0,2,1048591,16842754,0,-1,-65537,1073250300,266346480,2147254268,2147254268,-32772,-1,2,1048591,16842754,0,-1,2147287039,2147254268,2147254268,535826400,2147237880,-2,-1,2,1048592,16842754,0,-134219777,-268441601,-537407489,-1074159629,2147368956,-1,-1,-1,2,917519,16842754,0,2088501248,2088533116,2088533116,2080406528,-58721153,-58721153,64639]}],[{"sector":1,"data":[2,917517,16842754,0,-1,-1,-1,-16711936,-458760,-458760,-458760,0,2,917530,16842756,0,-1,-1,-16769344,-16769344,-16711937,-16711937,-16769344,-16769344,-16711937,-16711937,-16769344,-16769344,-1,-1,0,0,2,2752568,16842760,0,0,-16777216,-1056966529,-16777216,-1551894145,-522241,1673525631,-783361,-471926401,-1307137,-470943361,-2355457,-470550145,-12840961,-470550145,-12840961,-470943361,-2355457,-471926401,-1307137,1673525631,-783361,-1551894145,-522241,-1056966529,-16777216,0,-16777216,-1998856,-14680441,2124324839,-16254975,-1132466209,-1838728,-639502657,-15112450,-641665345,-16161538,1669396863,-16512769,1669396863,-16512769,1669396863,-16512769,1669396863,-16512769,-641665345,-16161538,-639502657,-15112450,-1132466209,-1838728,2124324839,-16254975,-1998856,-14680441,251723007,-16727809,-1347748609,-16727809,1331035647,-11221505,-1398115141,-5715337,1263889851,-11221577,-1414898533,-5715209,1280654763,-11221641,-1347789645,-5715273,1263889851,-11221577,-1398115141,-5748112,1331035647,-11221505,-1347748609,-5715201,1331035647,-16727809,251723007,-16727809,2,655390,16842756,0,-1,-8390401,-12586783,530507742]},{"sector":2,"data":[530507742,530507742,530507742,-12586783,-8390401,-1,0,0,1,2097184,262176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,50331776,1929379968,1929379996,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930297500,1930311836,-15763204,-15763204,-15763204,-15730436,-15732483,-15732481,-15736577,-16260865,-16269057,-16547585,-16580353,-16711426,-16711426,-16711428,-16711428,252,0,1310738,131074,65537,65536,16711681,-16777216,64,1077936383,-65336,-65536,255,0,0,-65536,255,0,0,0,0,0,524300,0,0,33619712,1700004098,1852403058,201354337,2304,0,0,33685504,1970225921,1919248754,150998016,0,0,0,1208091138,7760997,524303,0,0,33554432,2035482882,1835365491,0,0,0,279886,4194411,3124,229381]},{"sector":3,"data":[0,0,0,65539,4194616,5767256,6488161,407,262144,0,0,0,217055659,217055488,9178154,9240896,14484093,14548993,1431261957,17486,256,1380272902,21775694,393474,167969039,23331584,50457603,-469564668,90768133,50699011,1476592693,60752644,50672131,2063795452,77595396,17090307,4456706,1560477953,0,0,1314213715,-661913532,-1957345904,-661774612,12080982,-1706029568,65535,1342177723,-26029,-930414592,-469762376,951586315,-1202630656,-883949475,-310157729,535137026,13323613,-30490573,771769094,4406912,-1338870527,-1203509578,1122370867,1122419850,1642332395,51175562,12149222,-1174478300,-1047919053,-980794650,12141286,-1963007436,-1335761212,251538945,46792771,16973826,65560,16973871,65570,93,279886,3211362,3319,163845,0,0,0,65538,4194471,5242960,5898328,651,262144,0,0,0,175115326,175112512,16518375,16711745,1297040132,77,100663297,1414748499,17780037,50331651,906166299,5505792,50363651,-1190985573,13894400,50394627,906166548,22283009,50426371,-1341980271,1,0,0,0,1167120524,518818645,1589958798,29616134,-1962742397,1297948645,-1946155830,1430622424]},{"sector":4,"data":[-1910575989,106874072,-2096880408,-443874579,-900899553,-661913596,-1957345904,-661774612,-1005951350,1558709854,49120006,1562371467,445005,1167120524,518818645,1720375438,126674950,4000373,-1207471104,49020927,-310123470,535137026,46812509,-1864856576,-326412987,-1965519330,1183451238,39446534,-1962742397,1297948645,-1946155830,1430622424,-1910575989,140937944,-402241910,-310181356,535137026,80366941,-1864856576,-326412987,-1965519330,1726482022,49120002,1562371467,182861,1167120524,518818645,1465309326,-1005951350,266864222,-2090967290,-443874579,-900899553,-661913594,-1957345904,-661774612,-1962383734,1709704798,49120006,1562371467,313933,1167120524,518818645,1465309326,-1979160950,1223165566,-2090967289,-443874579,-900899553,-661913596,-1957345904,-661774612,-1962383734,-2115500450,49120005,1562371467,313933,1167120524,518818645,1720375438,106859272,-2096793112,-443874579,-900899553,-661913596,-1957345904,-661774612,1720342358,96462854,-310157729,535137026,46812509,-1864856576,-326412987,1457032734,107383383,1594205672,49120094,1562371467,182861,1167120524,518818645,1465309326,-402233718,1583285790,-1962742397,1297948645,714,1442840576,663365207,1929682664,-18426,503373033,-820081618,511478529,-1895825480,958680,-644953805,-1575023225,-155713284,-1981946881,-940106676,896794632,-1207811864,1048576030,1962672380,702467,-402588253]},{"sector":5,"data":[460456870,-494857078,62390275,-1204826878,801964545,1552664883,-644997602,-350285943,-13433223,817874830,144882176,-2146692936,158598141,-1174393665,146278556,1212451083,169993466,15419460,653992422,2089369028,1279560778,-997581305,632561422,-1960894003,1119892433,63078638,116261099,2089617182,440626,-2012763149,1149846084,28305442,-397408396,-346554071,568654358,-163027830,-423353644,1153891105,-1070399426,1595557001,-396967074,443679667,484968825,1975520000,-166860013,1967144516,-85947893,-83658264,-1017200589,1581252792,-396929341,863110027,-315488391,-352128536,-303542230,712333312,993021067,511588428,-1960018748,-2010760100,-650427647,-617414030,-12821367,1055406148,1606431491,1283507038,1149960475,1458891546,-389467305,1416758083,-2142221704,-1988083124,1284053580,78178354,-482849653,65583158,1342563003,-6663410,-1962934017,400767052,-788084946,956311553,-277530548,-784432338,-209911807,201326265,1359508672,-26032,1482227712,-400796533,-1047855099,180575839,-400918044,275907122,-494857078,45613059,-1204826878,801964548,-350464885,-1070382543,79855854,619446507,1969241184,-1070445831,82477294,169993466,15419460,519774694,-985054070,632572500,-1960894003,1552620628,-1070391778,394909838,861389599,768511,1149957682,1178870341,1950762034,1004571214,124913276,57926864,998297216,158468732,-321852208,-830471309,142359360,-321910926]},{"sector":6,"data":[-830471309,1979058720,-63012837,74775552,233553634,-919382189,-1274812230,1595264390,-1444198565,-963976142,169493512,1455644608,663365207,-1207819544,124977151,-1343747463,197145344,-1017225280,-486481688,16574710,1418457458,-1070382564,9758958,-1545019765,-1983609344,-471316924,1111642112,-1997635572,-947175324,-2012453856,-1360511164,65699840,-1964064374,15418053,1480737518,1149911790,-796777460,350802112,887130624,1149955595,-792670195,616616128,584381955,1128564932,-804502390,-2010110752,1149977668,306457386,-2145368951,-919403286,-487849749,113410299,-336854805,1149824000,99254341,-285602384,-352009600,-360649728,-335484155,-11408901,-1946252458,-661911821,-1178563041,-1527578599,-1017194354,-919355341,-167770136,-2035276592,958810592,41223759,958824460,41224271,958795788,41224783,1388519436,21990182,-108806093,-2129759694,1934295545,113160,-138280776,-1194816527,-1017446412,55020326,1996815488,-14762162,74834954,67434369,980879420,913442092,41214978,-456078082,-456071984,67945482,90671654,595125258,-327152780,2030597122,1963173914,1392190486,55544358,-754909254,1525058274,-172440584,-1195116033,-1007026181,-852492104,1963146273,-1207912433,-1073074227,-1007221132,24379588,-13712391,-889073394,1049304663,1418395901,-1898237156,-1965258021,-1981558555,-1962669929,183161299,-1859553820,399311540,1965606134,281343521,-469099404,1968117112,143116267]},{"sector":7,"data":[520093700,1723521,1112309761,-1849467096,-2016995379,1032,1113882655,956310999,-535630640,1946743936,459540493,35996918,1283458164,-1017183707,1077824640,-1958648696,-1031791532,539290629,-360706444,44624900,34342517,-301929490,-2097381181,-591519113,-2146601984,192348668,1946177214,48643,-1094458358,-58720100,-1091210112,-260636484,-109051720,-396929341,460521423,102635896,2089617183,-1175221466,-1070399482,-1510737156,-1510799695,1595868923,861324126,-5642030,175293067,1552484472,574917924,-1017193844,-6952874,242352308,-1946547080,-738778556,1552537635,-1017185502,-8525738,-1047772302,947178251,-768358093,-1047796726,1149903736,1145315909,-1320926158,-1964453372,-461356444,-1966863848,-461357468,-1950086560,1418408524,126363192,21989670,56068390,1149747251,-1178378726,65797952,1455358137,1929325288,-99190757,138570784,1418412620,63078428,180691692,-301929535,440699899,-396967074,527630087,-75495559,-350915321,475302664,1929902976,67056139,-13698341,-83389033,1578779787,-1526229821,-1324897785,-989349113,-653799673,1112309767,1686160136,-1360398526,79855870,-352187156,-2134643200,619447490,-301929475,79855811,-352252692,-2134643200,619447490,-301929474,28703683,-1006761496,-388877482,-1031012717,-963967886,-1017193844,-2065148074,2020963070,1111815793,-1959496686,1144730180,-1960020208,1686772820,1284176451,1961101890,79855628,-339473684,-511644160]},{"sector":8,"data":[281147133,-914355852,-270434300,-1996607256,872104524,440667072,1141584501,-1004768206,1552623228,25830964,710687555,-617414030,-13345655,-469028276,-154968481,1963002948,356813321,540951798,-1070338955,1583335731,-396929341,561184259,112794744,847023360,41287434,519895299,-88067577,184265459,-402426625,1150025562,-1017225446,5160534,-1101658901,773718016,30350990,1381061456,1418397271,46301212,-329645589,175440296,-125049806,-1510003118,1149962462,574890276,1499094791,-434065317,525925152,171495262,149555654,1283459302,-1031765982,-527766525,-360646518,-990450683,-2147191792,574628428,1678262116,1945096218,575438914,843877121,2099924027,1044706866,-164858592,192152263,67978486,1149896052,574810900,108347460,135087350,1156978037,309657868,1964327994,1045200909,-2147161312,-385803700,1157037932,427032845,1963934778,1112309766,988605192,158666308,-146643840,-335743768,373570270,1283458165,1156973090,-814383038,-1960411964,-2010761636,1547387649,855798314,912034267,843876673,1914719291,1112312362,1964229110,1130662434,208987146,-335232384,-1004350218,-301807232,34424054,-914356620,-56629247,-381531000,-1031733516,547941379,-360685452,1113885189,1969276150,96794201,-990504076,-2146733055,-863961372,256150032,-461371669,239373035,-347970424,2143614513,1156985973,158613566,-1086430080,-348044150,944540445,2093227235,979143468,1124174374,1915771963]},{"sector":9,"data":[-1982123262,-1991689636,-370263988,1283522188,-331217886,-219415260,-335232384,-1975171960,-773813528,-790048280,-754732564,20456936,-1977465847,-1073068988,-400419980,108324922,541215872,1686112235,-219619518,-28644869,16973826,66391,16973826,66430,3,0,0,0,0,0,0,0,0,0,0,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67633152,0,0,0,0,0,0,0,67764224,0,0,0,0,0,0,0,67895296,0,279886,131209,3520,32772,0,0,0,0,4194353,8388672,8978569,662,262144,0,0,0,-2147024892,1,218103808,5242896,43647032,-2146959360,2,219152384,6291632,44728348,56229888,-265289529,32798,0,1313818119,1380533332,1313818117,21332]},{"sector":10,"data":[1835010,184353024,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775174201,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718623,655456,131072,-1879048192,524289,134217740,536872960,-536846081,0,718336,0,2035482624,1835365491,7680,812801,694364160,1886339872,1734963833,1109423208,1953723497,1835099506,1668172064,959520814,539898936,543976513,1751607666,1914729332,1919251301,778331510,0,520093696,1090525952,2560,0,26214400,201328895,536576,-33488888,16654111,0,3166,0,1919243264,1634625901,108,0,184353024,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775174201,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718623,655456,131072,-1879048192,524289,134217740,536872960,-536846081,0,718336,0,30208,469762048,806888556,806099000,0,203294208,2117090364,1010597388,0,410795008,2121809020,1013333118,1667261958,1014774883,1719549052,1717986150,1012939902,3670032,393312,408944670,7888908,0,0,0,1880624640,115,0,0,0,0,0,0,0,0,1711291392,2120629784]},{"sector":11,"data":[60,3964542,1866872,402653247,1080033340,242221280,1013332796,242236447,242247228,997746236,993791600,1879244902,241581070,242235488,476461884,242221056,477128252,1986817080,993791600,1879048294,241581070,469788256,1763189868,404232300,0,473105920,1613784678,1717962264,393216,1015178848,1617716838,409364064,1667261958,1717986915,1712875110,1717986150,207630342,1572920,393312,6291504,1597440,0,3145728,0,404232192,2122219227,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,32382,1724081688,-1016699368,6,6684867,1579020,2013266046,-1059061658,404226096,1711304294,404252220,404252262,1852571750,1852184600,406748672,402679320,404253792,912682598,404226048,806905446,-600282004,1852184600,402685542,409363992,469788256,1799234668,404232300,0,2083982336,1613760102,1717962288,786432,1719797296,1617323622,409364064,2002807814,1717986931,1712875110,1717986150,204484620,786540,393312,6291504,1597440,0,3145728,0,404232192,2122219214,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,1717985304,-2130681832,6,409337985,3160076,402653438,-1067450266,404232288,1712848896,2122212972,1010565120,6700032,1010580540,1717993020,1717960806,27772,905969664]},{"sector":12,"data":[0,7077888,0,228864,0,469762144,912293484,204478572,6198,204934144,1614153222,1719012400,2115509276,1721632280,1617322086,409362528,1801481222,1717986939,1712873574,1714709350,204484620,1006633158,1010711676,2021408304,2115528252,1048329340,1719549542,1717986150,404232318,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,1715232828,-1660930024,62,409338041,1711279128,402653438,-1067450266,1010571312,1010580540,1616928876,404258430,1667635260,1717986918,1717993062,1717986918,1010592870,2084322364,1010580734,2021145660,2081192056,1010580540,1715371580,1717986918,134243964,207627264,204472376,6172,204937216,2083920902,1715211388,3152924,1723206668,2087084156,410935392,1801484294,1717986927,1712863334,1712876390,202911768,100663296,1717986918,409364094,1796761100,1717986918,1714446446,1717988198,202911750,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,32382,1013342310,-1325372392,13158,2117861541,1711279152,402660606,-563622810,1717960759,1717986918,1616928879,404250720,1945507864,1717986918,1718517350,1717986918,101084262,101058054,1717986843,404252262,1715345432,1717986918,1717993062,1717986918,134243942,406594560,204472431,2113961599,205199360,107349516,1044125798,6291456,1723209734,1617322086,409366140]},{"sector":13,"data":[1801481318,1719428711,1712856188,1008233318,202911768,100663296,1717985382,409364016,1796762636,1717986918,1714446448,1715235686,102260748,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,32382,2120678496,-1325373952,2122212966,402653349,1711306876,402660478,-1016109466,1717960943,1717986918,2088525948,404250720,2070288408,1717986918,1719565926,1013343846,101082726,101058054,1717985307,404252262,1717966872,1717986918,1718517350,1717986918,26214,906395136,204472422,6172,205205504,107349528,208541798,2117074944,2125856780,1617322086,409364064,1801481318,1717593699,1712850540,405564262,202125360,1040187392,2120638566,409364016,1796765708,1717986918,1714437216,1712876390,202911768,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,268467838,409362528,-1325373928,445502,402653369,1711276032,62,52114236,1717966875,1717986918,1616928876,404257916,1868961816,1717986918,1719041638,409364070,1044276838,1044266558,2122211455,404258430,1717966872,1717986918,1719041638,1717986918,26214,1829118976,204472422,6198,205205504,108987952,208023654,1572864,1721630744,1617323622,409364064,1667262054,1717593699,1712875110,409351782,202125360,1711276032,1617322086,409364016,1796762636,1717986918,1714423392,1715235686,404232240,2122219008,2122219134,2122219134]},{"sector":14,"data":[2122219134,2122219134,2122219134,2122219134,2122219134,268467838,2117886054,-1325386216,445440,169,1711276032,6,104018688,2122199059,2122219134,1616930412,404250720,1734744088,1717986918,1717993062,409364070,1717986940,1717986918,1616928984,404250720,1717966872,1717986918,1717993062,1717986918,469788262,1299981312,404226150,1835008,204693532,1711695456,409350246,793628,1719670832,1617716838,409364064,1667262054,1717593699,1712875110,409351740,201732192,1711276032,1617323622,409353776,1796761100,1717986918,1714423392,1013331516,404232288,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,409387068,-1660937192,419328,2113929381,1711276032,1572870,205481472,1717985311,1717986918,1616930412,404250720,1668028440,1717986918,1717993062,409364070,1717986912,1717986918,1616930520,404250720,1717966872,1717986918,1717993062,1013343846,469777510,102245376,404226107,786432,203317276,1007041662,943468604,396316,1719670880,2121809020,1013333600,1669228092,1012939875,1008221286,409351704,201732222,1040187392,1044266108,2120615472,1669228044,1048329318,1042185312,208025112,404232318,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,415497752,-2130704872,13182,129,2063597568,1835014,520342654,1717985283,1717986918,2122202223]},{"sector":15,"data":[1010597502,1668824124,1010580540,1014791740,406600764,1044278368,1044266558,1044266223,2122202686,1715240574,1010580540,1048346172,205405758,3196,1572864,806092800,786432,0,0,0,3072,8126464,0,0,0,201326592,0,0,1006648320,0,0,1536,12,106954752,0,402653184,1880624640,2122219008,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,2122219134,939556478,24,-1023384040,0,195,1610612736,393222,0,26112,0,6144,0,0,0,12615168,0,0,0,6144,0,0,0,12615168,402653184,6240,0,0,1572864,0,0,0,6144,0,0,0,0,100663296,0,0,0,65280,0,31744,120,106954752,0,-268435456,0,0,0,0,0,0,0,0,0,939524096,0,2113960960,0,126,-1073741824,3932166,0,15360,0,30720,0,0,0,0,0,0,0,30720,0,0,0,0,-268435456,2035544160,1835365491]},{"sector":16,"data":[279886,89260361,5606,2064389,10000,131072,0,65567,4196939,20447544,21037375,1057,262270,0,0,0,1079774762,1079836992,31396421,80146800,142676588,82702704,49156861,92205424,341381934,95416688,170464390,117961072,112334131,129298800,113969198,114028848,107350176,107475248,12257549,12382512,176359706,176484656,150473160,150597936,400427612,400552240,181799920,181924144,45354151,45478192,201592023,201716016,205917601,206041392,448138864,448262448,341512232,341635376,40833400,40956208,43258273,43381040,220860877,220918064,67637925,67760432,26219241,26275888,216535810,216592688,102110175,102232368,69211209,69333296,336139406,336261424,21239254,21360944,60167659,60289328,58987949,66453841,1229211395,16777216,1258684416,1162760773,50399052,704712348,828638001,19993857,469840177,824377649,-855376127,2367,-16580351,67043598,-1358348339,50399232,1442918975,847250189,17653249,-335465994,838729997,17686785,1070400511,50832150,812909313,17845505,-16379834,255839491,-855440803,22417215,205507843,-855440184,33820479,272616707,-855441139,28380991,-1140653822,85852962,-855376127,22484287,1778581764,613810985,52627459,-16571582,255839491,-855441408,135337535,121621763,16842785,67486979]},{"sector":17,"data":[1070400511,50331659,-1559543859,1070400258,50376715,1527463885,50399744,-1241313390,798753554,54168579,2097351545,146866954,51110913,1375797248,67043840,671693,1070400256,50351882,169083649,50980611,67984,-1274871549,143917833,17330691,1070400511,100694794,1014956801,53022979,-838792851,115868466,34738691,1070400511,50406147,-771276851,50399749,1073818459,798425360,19930627,1610821680,810025233,53492737,755052391,67043888,285687757,1070400261,84019221,807862529,19932161,1359163443,808059183,-855376127,8259903,553844994,646382384,-855376126,831,71290115,17170432,19940609,1107374137,808845616,17841409,-16698669,356502787,17170432,53030659,704850401,713032490,17825539,667546,-956104446,5767948,-855376127,44828223,-1375534845,779420454,86938115,1070400511,50422541,868301,1070400256,51641101,-905101363,1070400276,67186701,763495169,50748419,198293,67043863,772227021,1070400260,17023239,382337793,-855376126,142085183,104844547,17696405,53496323,1677931222,234160909,53532163,67309652,344916274,51678209,-603777903,463536959,53493505,-16704563,222285059,16979563,18293763,1560477782,67043598,-1945681971,16843267,-385676313,67044363,1845706701,1070400263,51837197,1745698765,1070400279,34225419,212009729,17594627,1070400511,604428566,33489408]}],[{"sector":1,"data":[-1575469107,1070399744,50375704,33490944,-1072152627,1070399744,16827928,-1239924787,1070399744,16822552,-1156038707,1070399744,16819992,-887603251,1070400256,100716056,67043584,1589197,100665600,1070400511,50331671,1914126285,1070400256,50368791,-1911078963,1070400258,50458903,1897349069,150995970,1070400511,50340889,-1474740275,1070400259,50689049,1209614285,1070400264,50925849,-115785779,1070400266,50442777,-149340211,1070400262,17545241,67043584,1654733,66048,-167766380,16712469,1226391501,1070399498,51725,-1979301939,66818,302003036,375521306,3642368,-16706065,104844544,16843347,102643456,1070399743,489742,-1072807987,1070399496,630030,51724237,1070399488,468494,-854704179,65798,-16704132,239062272,16845050,35790848,1070399743,35854,1225342925,65793,-16505295,473943296,-855638016,90643519,54512896,-855637871,14287679,-1040187132,924319787,3344384,-16697672,88067328,16845080,51784960,1070399743,70152,-788119603,1070399497,16777224,487194625,-855572733,160106047,322948352,-855637464,66459199,1811939585,16711976,344013,66048,402665648,16711998,621101005,66306,-1006620971,366542894,-855572732,206900543,222285056,-855635564,7743,507497728,16843591,104620800,1070399743,78878,-451788851,1070399491,17,-988790835,1070399488]},{"sector":2,"data":[16,1745895373,66825,-1610606736,401801239,1560576,-16705713,272616704,16842832,20801280,1070399743,33554452,1061027841,272534016,1070399743,749584,1276133325,1070399496,21519,1309097933,1070399494,83483,421150669,1070399492,26,1796882381,1070399492,27,-484818995,1070399490,227610,-652525619,1070399489,136219,-1340522547,1070399498,56861,-1239597107,100663296,1364197868,1167120524,518818645,-1957242738,-167049610,915080309,881525000,1418444851,441223948,100826243,2088968316,444532738,529259147,19286007,-1290832896,1347440641,1347440720,-401698736,-2090991598,-443874579,-900899553,-617480190,-2135751957,1167120524,518818645,1381226638,-1460895407,-11053568,1996428406,72476690,-637303,1996427382,71690254,-1191950711,1996423169,175570700,-401698736,1183395395,1958743026,302398220,-2146863872,1946221694,-196703457,-1913895287,-796075394,163168398,-205507840,10533035,-1996205336,58055238,-2147212567,1963064446,61335566,1988826740,-92369928,-393211413,149094729,-386380151,57999846,-1962677527,-13333545,1149972548,-297367244,-661899893,-1946369906,-812918146,1149975947,272992626,-1981921653,-2097116027,112722631,1586146048,31687164,1950649088,-1951677693,1406532,-1014256896,61571084,1782644699,-1410972021,-2085895541,346098375,1183558400,1183558648,-947672100,899102,-1425887061,1210369923,-947672149]},{"sector":3,"data":[-2085901564,-1414855481,-2002015317,1183517253,-947672080,-163149034,-196703317,-230257749,-397505621,-1705965853,65535,1457157771,-85455216,1958742802,-18343,1442906042,244338770,185398760,1447524562,244338768,185421032,1446738130,1455871,-169341296,1958742800,-1589867731,1166606372,244340242,186138600,-1592036160,1178271760,3187182,849412980,373655808,-401698730,-1073010220,-1125642891,244340226,855961064,-2145653824,-1954609051,283371086,-401698730,-1073020144,478929012,134367174,1583335051,-1962742397,1297948645,-1962929974,1049359942,-812973814,1032522723,-1959508677,-227198851,3848387,-1996304664,930406470,-401441084,-1048374401,-18776059,-517210997,1444344971,309788422,16777114,17611008,1360942614,16777114,-1705634304,65535,540927883,855864064,1183433673,-528577558,-617351629,1406284614,1391097599,-26026,-1940193280,-54423847,-654111349,-1834222713,737904555,821789657,-654058891,-947651701,-163149052,-364475477,-531723349,109560203,-1012203254,1183576459,-229733388,2106277003,1962871602,-1977775306,-1024041897,-164858623,208929986,1963115254,25421828,-1010224189,1195056523,990737774,141914191,39602166,-370415756,191397771,-1192921601,-119013256,-498693887,-1830222987,-1948742912,3711263,-1586215031,1200160826,939950966,377684480,-1962934214,1577780830,-1960676088,-1072960442,244325236,1965782504,41913108,-26025,1451819008,105285896]},{"sector":4,"data":[2122908643,317319400,-18710901,92996421,28957324,14608384,-402436610,1747784453,-1959758592,504269597,269912834,-162120960,243993461,1451950626,135694810,-11513599,-6677897,-1996488449,495707206,192038793,-1961200192,316926542,17440395,1200299915,17474360,-26031,-1070399488,11004099,495706484,36063223,-2144177152,1954610302,-1705617620,65535,915261747,-1098055407,508624720,1461080406,16777114,-1705568768,65535,1592149641,1958742879,-14840922,1452962423,-486539261,-389467371,-1957691336,1920466717,100506,-1072998400,-2132277899,-1954485504,-1898410793,478936256,1032570763,-1993193593,-947689403,-196703378,-230257749,200969131,1854587894,-2132442884,1347558539,276234065,-15829249,1996426358,142016266,-16353537,-1195175841,-919404287,1178128947,-1978501892,1737100871,-58818548,-1962511232,1468729423,-263812854,1398004531,244339281,-1992827672,-1072964026,333973108,-599357171,-431060029,1996426979,-25882,-1706033152,65535,1343117507,16777194,1343117312,16777194,-629764864,-402651713,1317732386,1359406052,16777114,-159973632,-8472,-655821706,-227082241,872403688,-48567872,195901180,1342600384,16777114,-243970304,674693059,-6664190,184549631,-661863488,-1957345904,-661774612,1443294339,106859351,2139103115,125569026,-605548912,855645745,108432320,1886713355,118895755,-125923844,-1951683669,-1073017276,1676150900,-129595124]},{"sector":5,"data":[1149979508,207153180,1962559113,10532928,277538896,201082505,-1959627584,507350008,-561251321,-218083143,-1962440283,1200224326,-96040178,-1994635383,-1962898801,-16742209,-16742265,244319862,-351345432,-126448375,-402652225,-947126454,-310157729,535137026,46812509,-1864856576,-326412987,1457032734,140413783,2139103115,125569026,937954960,855713585,142511040,1668611851,1317748107,2110327558,-2004024570,-2091615232,-938278407,8949049,-950976130,16812677,142016256,2011696784,242614030,-1961069057,881546805,1186531102,-1510736896,62911627,-19863552,-1962490749,1015744630,268977654,-397014924,1702890192,-1957040376,989890693,1605466049,49120094,1562371467,313933,1167120524,518818645,1465309326,184972939,-1961265930,-1937274084,-386364672,208931654,881580171,1065951115,9208969,-310157729,535137026,46812509,-1864856576,-326412987,1457032734,108432215,578090507,-1131727733,495648908,-1946157128,-1995185393,1459653772,330138,1304576,-402229505,1583286856,-1962742397,1297948645,-1962933558,186616798,-1962380069,139427871,-1007490288,1167120524,518818645,-326903666,861361692,108432320,309655051,1183399051,38636520,1946614147,150569761,971572084,175505153,309914,1958742784,-1063628559,-1962934268,38127420,-1070399482,-1947777400,1347815030,-1998057840,244340478,-1962062616,209488692,1166753163,-498693772,-1988737653,1552606278,31686920,-1948581120]},{"sector":6,"data":[2018142801,1783728387,184742784,108292689,-352261912,1552650293,678756138,-14256897,-689435553,-414285824,206867328,-1926603637,389624415,529205620,1603084171,-1946948760,394881109,-1988999797,2089543750,-12743910,645214285,-1707706881,966,1088900736,-1962865989,1060706940,529205620,1603084171,-1946948808,947751741,-1258340471,-1258356586,-1258356584,-57999206,-33137013,-11336881,1962872436,-1934295268,-414779904,-16550784,1190530164,57950439,-1961200385,-30713868,-337055791,1317756156,1361634280,320922,-495547648,1474592395,888399958,-6662569,1174405375,1459672963,887351382,798643799,-402653176,-2065105785,-58595076,1583284656,-1962742397,1297948645,-1962933558,478873206,9078727,-1873412095,203483150,-1962720002,-661863628,-1957345904,-661774612,29251414,704256,1594079464,49120094,1562371467,313933,1167120524,518818645,1996478606,108461832,-11485133,1996425846,381979404,-401698736,-310116420,535137026,147475805,-1864856576,-326412987,-2082959842,1465256684,-1090518338,1726480398,-1962380285,142443327,1594717187,49120094,1562371467,313933,-1946663287,2122911357,197145588,-1947962113,138775357,1358710409,267162,-1909726464,653298626,-922022773,537204853,1149838848,1150035466,-1873410548,22145038,41205771,1996428523,69573372,1996423168,113089272,-1070399488,-259285525,2106277003,1050300424,-16777207,916126838,-1962934263,-661915578]},{"sector":7,"data":[2139692939,-193033458,-350978167,-1864856361,-326412987,-1193767394,-617414656,-1962389877,1374160470,49120000,1562371467,313933,1167120524,518818645,45668494,173968128,-1962389877,770180694,49120000,1562371467,445005,1167120524,518818645,62445710,106859264,-768358093,-2097148952,-443874579,-900899553,1364393986,-997502894,244338710,-2080448792,-1933375292,1430622424,-1910575989,-1000909096,-947714434,198305810,-1961705085,245497,1593981160,49120094,1562371467,313933,1167120524,518818645,1465309326,108971260,1091282664,738124160,519867361,-1945733435,-205484336,1720328100,205949450,241601104,1343243914,-1978505590,-1974463418,1183454822,1996443672,477560602,-14780673,1996431478,381979426,-401698736,-410255495,-310157729,535137026,516574557,-1864856576,-326412987,-2082959842,1465254636,637959876,184698251,642479296,-486257269,93005381,997572619,105220902,863306152,795927031,872171145,1300899529,-1948125432,2098680,1962988163,572427034,337000706,-1962642432,1392647710,-1550167982,184549379,-385256000,346095763,-1870927104,-1705971573,2313,-1910604317,-1948873790,-973567025,-1510209930,-1515870811,-1409530229,-1070355541,-1414812757,-1414812757,-1378317395,-670305397,-661780876,-1510741551,1458735903,612250,1226752,181069904,-611567133,-661929074,-1070383221,309419,3711403,3842475,939951019,377684224,-1962934214,-1070355514,-1414812757]},{"sector":8,"data":[1583334283,-1962742397,1297948645,1442841802,531866,-339725568,-1864856343,-326412987,-2082959842,-1940451604,-1916760368,872214654,1183558592,-1411871984,-1425127797,839536266,-138179603,984545,-788475261,-774319638,-774319638,-785811990,-1409407784,-1978906998,1183558625,1183558406,2123213576,-1873340688,-22419442,49120095,1562371467,838221,-252985293,-1313093325,-1864856575,-326412987,1373146654,-1715457194,185228939,-1959496485,2135394847,863917962,142016502,1376155391,-1873390000,-10360818,393539595,-470004085,-14906606,1381107831,36321023,16777114,1590070016,-1962742397,1297948645,-1962932534,147031007,162981971,-661967645,1066127243,-1030825332,-1409499085,-1582578037,-1582628808,-2085945286,16791558,3806851,108446976,-628185869,-1072970869,-1864856381,-326412987,-1948742114,-620033442,529206900,-1962391925,1200031318,274171662,-1962742397,1297948645,-1946155318,1430622424,-1910575989,106859480,141875979,1200299915,274172686,-1962742397,1297948645,-1946156342,1430622424,-1910575989,149717976,176065367,1853161227,1586183563,-2017228024,-1996452195,-1020527522,-1946663287,-745863586,9477511,737828489,-162100781,1032521451,268979584,50876043,1300852813,105810792,-1988997885,468216397,-129594588,-1946790261,1959398344,239962895,141871371,1343124991,249817170,-16040565,1996473461,63891466,-1946401141,-2090861994,-443874579,-900899553,213450758,6601474,247006955]},{"sector":9,"data":[7125762,1167120524,518818645,1448335502,173968215,2139103115,125569026,244367755,858365672,-1950338094,-16053634,1032537716,-485994869,108432191,947189259,-1946394997,38898433,108297603,159984254,-1962774135,529207901,-485863541,-2145341182,1292386505,1954382600,1342862599,175570770,1512052968,595060824,-310157729,535137026,113921373,7125760,-1174138183,166399326,-1191156549,1455031296,-1864856563,-326412987,1406701086,-1957210542,529206878,134381440,-1047853188,216534672,242649897,880080395,-1959490730,9174110,1342337163,-15960321,244320886,-1960882200,1996443896,108461832,1105727120,-1085253857,2089222150,1459555842,41716218,-310157729,535137026,181030237,-1864856576,-326412987,-2082959842,861275372,-2147435840,185235083,-1961265930,-95515340,-14001013,1962879092,142016294,369522431,73400145,49120094,1562371467,445005,1167120524,518818645,-326903666,-1957210618,529205854,134381440,244320124,19422696,4242178,12238899,175541120,645199371,2089497739,1962871572,-1958900969,-108853171,1074623746,-1992274805,1284241486,-95516350,-386120055,1583284304,-1962742397,1297948645,-1946155318,1430622424,-1910575989,116163544,1586190166,-2145416438,2080899711,-401698809,34154490,12238899,172919680,1153108963,-1983892736,233372742,-2090967296,-443874579,-900899553,1988820998,-399209718,-24443129,1552677635,678756138,-14256897,1996425334,-11067898]},{"sector":10,"data":[2122515551,510918908,1312361867,-1962379784,1312358989,1343190266,175570770,-1877707521,53667854,-544516006,-2028714105,-219670953,-661863674,-1957345904,-661774612,1586190166,-2145416440,2080899711,-401698809,19736426,1988870195,1962281736,-1959490759,-1073017276,1183519093,1958742790,32827433,1149838452,1342958350,-402229505,-1073009725,1962873972,-1900740850,-1867186432,204466176,-402098433,1583284512,-1962742397,1297948645,-1946155830,1430622424,-1910575989,-1957210408,881526902,9215115,1032535947,108461907,-1960083736,-1962898276,-398489313,1996486317,14870536,-310157729,535137026,80366941,-1157517056,-1934293839,28380907,-352053574,-1174097659,246744085,1167120524,518818645,1364318350,1996445526,142016262,-16091393,-41939850,-1958120308,529206878,134381440,-1031075972,-1662513520,-1950338266,-167047562,881555316,-1962933575,856102652,584509659,1141620787,-1961265906,529206364,2013220944,175636232,-890761584,1958742827,239372617,1461124235,187370216,-1959037760,-60912648,-544810190,-1961986421,-1979675852,-315426226,1364676688,-1477964144,1958742825,242679567,-2147474456,1972173950,-169875453,-1705512821,2383,-997996917,-2090967288,-443874579,-900899553,-1957363702,-1957210388,881525878,-31687541,-1070398643,1947091979,112915,1344042239,9221375,-401698735,183183698,-14912257,-402617164,1174284887,-1994552573,-1073009572,1962870388,5105692,-443851169,180829]},{"sector":11,"data":[1167120524,518818645,1465309326,1988870195,1962281738,1446284067,-2094238581,2126777542,-1515848698,-276585051,-617390584,-402652487,1962877676,911388,-310157729,535137026,113921373,-326413056,-1962647925,243743,503873411,1200292991,-443858934,180829,-1947169962,142081820,-486263832,1448103943,1479133928,-1010824354,1167120524,518818645,1183570062,-2562042,-1962742397,1297948645,1426064074,-1957237621,881525878,1593104616,-1034033781,311820290,312152710,312611406,-661908817,-1957345904,-661774612,1586190166,197145350,-1961397029,41257791,460912139,-24966028,50822409,-1795215626,1583288836,-1962742397,1297948645,1073742538,507244779,779354132,2106323851,-325429496,-486539254,-1898411228,529213122,697980755,1526726667,-619986893,-1705570443,2929,284990038,28835840,2105787136,175440648,242614099,1210522,484989696,1407707908,16777114,-1705786624,4734,-696991733,1405337651,870846096,-661863436,-1957345904,-661774612,1443163267,140413783,2139103115,125569026,1139281552,855715108,108956608,561315595,1602952587,-1867518,83592063,-1930886283,100369152,192244863,1460172543,-1847062896,-1956647940,-167049098,881588084,-75242543,-2095090684,1634861819,276334419,1996425845,-401698808,1206585068,-1878493441,412280846,1996439019,719869704,1958742789,545032997,57999115,-1996272130,-125099964,-1962719746,180847421,-1959756663,1149699654,1975520020]},{"sector":12,"data":[1583300609,-1962742397,1297948645,1526727882,-947142645,2022172533,-339725552,-1983892507,1586231878,-473199864,-165704720,1946224711,209161192,1149908107,207915534,1044067723,292814868,-1995417717,2089024086,91488266,1963740219,-1946645564,1988692084,1536841468,-486539246,-1748857164,185961254,638481874,-2130152053,1946223102,1961900814,-59310326,1207194,110291712,-768360397,-470135157,-1705946862,5055,1364218457,1302938,123361280,306546982,341149990,-1962385781,1405104927,-1934098682,642797568,637695487,-402360833,1527195793,-1954646135,2139686518,675777574,-1961330809,549618647,173377830,205884454,-166986101,881528180,-1710721793,5117,-1962259201,881526390,-1962261249,1149831238,1458604812,-1310191984,1347573275,669519504,244340474,1444652776,244338770,1459256552,-1946383384,-19797561,-1313093325,-1864856575,-326412987,1457032734,108956503,-1070385781,-2096997237,276039419,1946680195,150700811,-1125579148,13035776,9145011,-1992230941,57952256,-33512983,1962869573,334797328,1149829120,676628774,-150438773,1946157511,408718142,1207902091,142081802,1364634,-1904614656,-1948742718,2098632,172460326,207063334,-2027533177,1149970516,335952664,855930112,651310025,638734217,-1156294775,-940113918,745865344,-1708886785,65535,-1993063287,-1960954284,-1948610856,1334521671,67630641,-1023212427,1200212483,760187179,572191,-31819637,1032520517]},{"sector":13,"data":[-1010891986,712542485,-327595189,99287472,855854590,-2090967104,-443874579,-900899553,-1073020926,-1991708812,-1411840,1352279156,-16777196,-1885728652,-167772139,1946224708,408718096,1342119819,142081802,1415066,55442944,-1962932037,1308498552,2034977539,11135990,167772160,2560,-18176,-218316749,1239021486,-1864856381,-326412987,-388461026,-310116377,535137026,-1949610659,-352180714,378245125,1499136548,378210283,-1940192732,1347573961,401232721,-1962934267,-352180714,-326412819,35534591,-16353537,-677772170,-1962934262,79846885,-1864856576,-326412987,-2585058,-16638410,1996425334,371431942,-310181888,535137026,80366941,1364414464,-1709308334,65535,1532582407,-661863592,-1957345904,-661774612,106058067,374905374,1510408192,-310158503,535137026,1355500893,106058067,-26082,1510408192,-1017619623,1167120524,518818645,1364449422,-1709308334,5770,1532582407,-1962742397,1297948645,200510411,-1961986826,-1959490602,-1533390284,-352321518,-661863442,-1957345904,-661774612,-1070377130,185235083,1444181238,-1946500376,214336308,-66683196,-1515870811,1593835960,49120094,1562371467,445005,1167120524,518818645,-1070344050,184966795,-1962511141,-1937274081,49120000,1562371467,182861,1167120524,518818645,12114062,674692880,194662402,-486539242,-1013297143,-1207959530,-310181887,535137026,-1932833443,1430622424,-1910575989,106874072,38243110]},{"sector":14,"data":[1468606105,49120004,1562371467,313933,1167120524,518818645,-1000941426,1992624734,637831942,1149961985,1192306178,71600898,71766310,49120094,1562371467,576077,1167120524,518818645,-1000941426,1992624734,637831942,1149962025,1192830466,71600898,71768358,49120094,1562371467,576077,1167120524,518818645,1589958798,668018182,39309606,72864038,-1962742397,1297948645,-1946155830,1430622424,-1910575989,650720216,-1006350455,1183517790,2109737738,140441355,-150319591,-772339106,184960651,-150635072,-772340130,-150452597,-1993996698,1468605959,172395266,637953783,637683457,184833809,857044169,1610032841,1610032644,1327048194,536290820,38738214,-1962742397,1297948645,1426066122,-326898549,-1957210588,881526390,-1962115957,272993085,1049346059,930349110,-1962654581,529204318,-2096607349,1317602025,-1949070370,1962871615,991791907,-210435513,199118475,-1961855543,1329283148,-1947962106,1329283660,-1948486392,21948871,8686731,-1946792311,-1996454260,1284241486,-263288512,-1992143733,1284239950,-1930261718,-1916694831,-2080577410,-1515910970,-293362267,872057616,-28931648,-2080749943,1963133052,239373137,1358841481,1372570,-364476160,-1897113975,198740930,-385649200,537198829,1200170496,1200367114,108432140,1149973643,676104998,17319158,1392906356,-1047603061,306678566,340757286,-1993996453,-1993993657,2123174991,-50468632,-1962510709,710708020,855638712]},{"sector":15,"data":[678756297,1344697599,1364285206,-493825,1610610294,1975520036,84667138,-397410294,-1072956292,1844118389,-661958512,-1962719234,710707975,168153227,178432,678756178,1361474815,1344165654,-493825,1610610294,190536228,-1962576448,-1876038669,-1962654581,-225769908,-1962639733,38046013,-1962652535,1149890630,-230257914,-1995946871,-880018850,478748039,-645138893,184766462,1443263734,1523610,-57939968,201213579,-16223040,-1382351242,-1962934251,1583348294,-1034033781,-661913596,-1957345904,-661774612,1444605059,106859351,2005606283,-1959490804,-1073016252,3423883,1702163339,-1995278453,881584246,-1962359165,2123170388,-1898935060,702912,-1918569476,-141822338,-1414807501,866894475,45722560,108461824,-397322730,1183520975,-163173382,-654900615,-1947318647,881526390,-1962652533,529262686,-1947318645,1962871615,991791889,-210435505,1963345723,-372798482,-1070399290,-1947580791,28977756,-1916194048,1962929278,645201704,1364661842,-11447983,-1073011617,-1813445771,656640,-80811952,58048523,1342211561,1207883915,-402158845,1988885359,87329542,28901386,710707968,-14125825,374417012,508567127,610271056,1543209192,91602955,1139536779,-362903152,1149968267,38242564,-1996077941,1183515719,105351662,-1962115957,-11513027,1979656309,-401698774,-1990520244,2123040839,-1959425046,529262686,1065865099,-164414327,-18194805,-167050417,-1705638284,6641,199902859]},{"sector":16,"data":[-1959693120,881526390,186539147,-33327909,1149829967,-17265890,495649605,-1996073077,-1962901356,-1802958761,-1014824830,777816330,-553098112,-310157729,535137026,46812509,-1864856576,-326412987,-1948742114,-620033442,529207412,-1962391925,-2021194154,-1752760188,-310181754,535137026,113921373,-1864856576,-326412987,1457032734,108956503,930414347,1435188619,2027031298,49972014,495659381,208984843,17006464,529210739,-253026421,-1326965365,-1983892486,1583300613,-1962742397,1297948645,855638730,1441786816,-326898549,-1957275896,931858526,-1995815797,-1072956346,1183534196,239337732,-1961737215,1140917830,272892172,-947650933,-1960187116,46629637,-2080881015,1183515335,-29032188,16959363,1183579717,-129040392,141869067,-1962752125,-336918970,-244085,-1072956338,28888437,-1956684288,113401317,-1873273344,-326412987,-2082959842,1448547052,16271047,176063232,-1957202944,1200294494,-62486262,1249165323,-964430965,-2093356268,2089484998,1183428094,1183428080,1338477556,611631115,1183427919,1183428078,-297366030,1996443670,108461832,1223167632,1958742784,-129579044,183173121,-244085,-1072956338,1183563125,-2090901768,-443874579,-900899553,1478361094,-1957345904,-661774612,-16091393,1996425334,-401698810,-310116505,535137026,113921373,-1873273344,-326412987,1457032734,637951684,1589917579,926492170,958800767,494797943,38243110,637951684,2080524089,173982736,105351974]},{"sector":17,"data":[637951684,2080524089,-339727612,112643,49120094,1562371467,576077,1167087646,518818645,1448597646,637951684,-1006483573,958794334,58655303,637951684,-1006483573,-1993994658,1589903943,931866118,638213828,-29671541,-947190658,-963968277,638475972,1589905289,1200301574,173982726,105330982,1589904254,1200301574,241091590,105351462,637951684,-1006352501,958794334,58590279,637951684,-1006352501,-1993994658,-1960442809,1194927623,638221828,637683595,2131117881,241091606,-1993949141,-1993996729,-1993997241,-1993997753,-1207702777,1599995905,-1962742397,1297948645,-1946153782,1430622424,-1910575989,250381272,-661891242,-1944815931,-1916563757,-1515850114,-661740123,-1961199989,-1073018300,1183403636,309490,18368247,-150833920,-263812648,-150184252,137286,1946355061,-2096567544,1325339846,-12850190,545059406,35145463,-1960413952,443976702,-1961572733,98619652,-268238842,-210372805,384561195,-310157729,535137026,382356829,-788231424,394720,1418457091,-129594622,41799739,1150013579,-61961468,41730363,-801390197,-1993954947,-1993997737,-24443321,-1962489981,-1981230844,1190655046,1962934552,-523155449,-133963567,-1016277,58586190,67075305,361492606,1005995659,-1962770480,38112208,1006259851,-1962771263,2110798785,1200170714,394864132,1996444422,142016266,-16353537,-1073016738,1743324021,207537407,-1957316117,1122796524,1187468887,-956301060,64070]}],[{"sector":1,"data":[12863175,-1102657792,1187446784,721421302,-230258240,972048009,58005574,-1962763799,529209438,134381443,582487164,244338697,-384358936,-1192754558,408849398,1156986763,91554056,-352321096,-1983894782,1150153798,-398030532,-1947574644,1183389254,340167630,-1949284727,1174607430,-767129326,51660427,1183387718,75400148,-15764480,1183651958,-1202710834,-397410302,1183519571,-834262062,201213577,-1961722432,1183436358,-767128638,-1949415799,1183433286,-733574190,-1982839253,-1072957370,1183519357,-1035564592,-1982577013,1183567942,-733574718,-1995553141,-1072964026,-2098658443,-1948742911,-62486265,-1995684213,1183569478,-666466038,294531,-823590027,205949696,-1995291133,1183570502,273023754,1406944905,383141517,178256,315484240,16678531,1183517053,-700055278,-2082847231,2097215614,273058569,30950913,1183571014,-632931882,1183387517,-632910910,-1948891511,1183433286,-666465318,2111587897,-1035564785,-1982052725,1183569990,-599356990,735856267,1317787718,-800183340,276152635,735725195,1317787206,-833737774,1131725115,-2095548673,-1923741460,-57946506,369280899,521543175,-1515870811,1996447263,149717774,-696873642,-947651445,521543170,-1515870811,1996447263,108461832,16777114,-532248320,-1962871831,1178193478,-2147189290,-1946225050,1178193990,-2147189288,-1946290586,1200356446,676825894,-1980742007,2139157078,108331390,25132928,28837236,721611520,-1002010176,25066624]},{"sector":2,"data":[2088765045,91488639,-352321096,-1983894782,2122563142,276037828,209043467,100419211,1183383612,-362902296,-151232885,1963001927,112645,-1070923029,-2080749943,1946219646,1958742806,-60912878,958022795,125049415,14698183,-1956910336,1418405444,-330921688,-2081532279,1962996862,-92372204,-1962380288,1200356446,-2096501974,1962984574,709135346,-1947842935,1451951686,-498693880,-1812855,1996434548,-834236938,-4698090,-17665,1183666258,-1924131130,1343669830,-401698730,1860762661,-532247564,-443850914,1491549,1167087646,518818645,-326903666,-1957275898,1589905014,2139301384,494141464,273124134,138881830,-1996029146,-1960379322,52826695,723911239,1183386183,140428538,641698598,640186367,1462138879,41418534,746061606,712507174,-231681,-1960379786,-953482169,1200301648,1194010118,-14266366,-14279049,1149967479,642784816,639924223,639793151,-14655605,140428319,440895782,1577058744,49120095,1562371467,707149,1167087646,518818645,1586223246,-2095084782,2080899711,102610955,-401698736,569054174,-15567105,1996427382,209125134,722106111,1347440832,-16222465,28837494,1374179328,49120252,1562371467,969293,1167087646,518818645,1996478606,376897304,-15436033,1996427894,242679568,-15960321,1996425846,108461832,1342177720,-2080630808,-443874579,-900899553,1478361108,-1957345904,-661774612,1461513347,-263796906,2122514432,57999388,-2097076247]},{"sector":3,"data":[1962939006,18802947,-1961075061,41911071,-1207141368,-1873802461,322758670,-1962865943,1183390278,407276530,-1946925431,1174608454,-163149546,51922571,1183388742,273058808,-1947711863,1183387206,273058794,-1995684349,1183575110,172360462,-1161591,1183652982,-1202710798,-397410302,1996427123,-398029550,45633558,1692946432,-163149041,-1980611029,1183573574,-196727816,-1947974007,1177283654,-62486040,737035915,1183443526,1958743034,-58817774,-2096335872,1946216062,-461470970,-955812608,127046,1183542507,-431605252,1183526517,-465159686,1996433013,-227082468,-755969,1996482166,309788644,-1542401,1996483190,108461832,-397361109,871103232,-2095286529,1988954348,385649650,521543175,-1515870811,309788447,-1928795005,-57939850,-1524689378,530949541,-16222465,362415734,-1996488671,1183576134,-2090901776,-443874579,-900899553,1478361112,-1957345904,-661774612,1445522563,1080963,-1070922379,-2097056023,1962935934,112646,-1962841367,529207390,134381443,565709948,244338693,-384701976,1586168147,-164132080,1950353476,244339466,184999912,-1950124864,1418409028,-96040650,-990095735,-1977157026,1006838791,642479361,639846283,1965377291,207391553,1200299915,-599357150,-1961468789,373787167,-136690040,1073798214,54266484,1190535285,443876060,-15698177,1996426870,175570700,-16222465,-6683018,-385875713,82313435,138841073,-1995811189,1451878470,105286634,-1947449719]},{"sector":4,"data":[1183387206,205949934,-1030519,1183649910,-1202710802,-397410303,1552616899,-1960867060,-789110201,590503051,1183387463,-666437672,108273152,17384694,1187462516,-956301070,62534,-1960026997,1183387719,306678774,1408779913,1342178232,384976525,-18352,1392508858,-532247216,1183666198,1448089312,1659375248,-15668232,1996427382,-532247080,-6664170,-2097151745,1946175612,678756146,-14256897,1996426870,1354771212,175570768,-1962379521,-654899642,913637200,-1925942017,1344158788,506610827,710708048,-400007169,-1863716767,-310157570,535137026,214584669,-1873273344,-326412987,1457032734,-16353653,1962879092,140428326,242745126,276299558,-15829249,-14283658,-14284169,-14284681,1962871927,880082742,507266189,843352912,1552633886,677379882,1577058744,-1962742397,1297948645,503319242,1430622296,-1910575989,209125336,-16091393,1996425334,1354771206,-2097138712,-443874579,-900899553,1478361096,-1957345904,-661774612,-15960321,1996425846,108461832,1342177720,-2097148952,-443874579,-900899553,-1957363704,686588908,2122536535,108331020,-375799765,1586168186,-164132084,1950353476,244339466,184862696,-1947896640,1418409028,-62486218,-989964663,-1977156514,1006838791,642282753,639846283,1965377291,207391550,1200299915,-364476126,-1961468789,373787167,-136558968,1073801798,54266484,1190534517,393544426,-15960321,1996425846,108461832,-1710983425,65535,-1962867223]},{"sector":5,"data":[1552626300,-1960867060,-789110201,-1995487965,-11085242,1996425846,108461832,-1878755585,15263758,-1980479863,2122577494,712245254,14305015,-1962511358,-348125626,-1983894782,1190656070,1946419418,1208322826,-775804007,721611768,-96040512,1187449579,-956301064,64070,1183432747,-532248094,-1980479861,-1072962490,1183517044,-96074760,-1947974143,1183446598,-532247578,2112112185,112645,-1070923029,-1947056503,1178198598,-1207599642,48955393,1183432747,209125360,383796877,178256,-401698736,1183517364,-498717722,198723209,-1962508864,1177281094,-398030362,15761027,-654899852,-1947711863,1177281606,-666465824,108904459,736118411,1183441990,-226589714,-150637568,-297367080,736646795,-297366592,-443850914,705117,1167087646,518818645,-326903666,-1957275888,1149963894,911510324,-1980217719,2089548374,142508850,-1955761152,1183402052,1958743026,108954380,-1962511104,1183403076,-401698564,1962929588,645201704,1347469355,1996443728,175570700,-150452597,1996443864,-126418950,507266189,516393808,710708048,-1993842689,1451881542,-401698570,2122575278,208929010,425603,1183516277,1279560188,-1946925429,82572886,-1070918261,-310157474,535137026,181030237,-1873273344,-326412987,-2585058,1996425334,313124870,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,16533191,176063232,-15371264,1996425846,108461832,-866072,1290275446,-62486040,-2080618869]},{"sector":6,"data":[-443874579,-900899553,1478361094,-1957345904,-661774612,1443949699,16533191,176063232,-1957727232,931859038,-1995553653,-1072959418,-1070907276,-1980479863,1183576646,-163149560,-1996077429,-1923876794,1343681094,1342177976,-16151832,1183576182,-230282250,-129594544,1358186027,1726484112,175570943,-1981332504,1183579206,-310157572,535137026,113921373,-1873273344,-326412987,-2082959842,-950663444,64070,687747,1586176372,-13137142,-16741196,1996425334,-233838586,-401967361,1996482529,-419764214,-1946532215,-2090927546,-443874579,-900899553,1478361094,-1957345904,-661774612,1443687555,16271047,176063232,-1959889920,931859038,-1995946357,1183577158,-163149562,-196702893,28856342,-588754944,745864968,385107597,-401698736,1183445531,-129594376,49120094,1562371467,445005,1167087646,518818645,-326903666,-950642910,63558,687747,-1360460939,173968128,1183385483,-1948742676,931863647,-1962522997,1465256022,-1947304307,503781104,-1515857266,1595909541,175570782,384714381,178256,141158480,-1995815797,-1072956346,-24416908,-350959741,-2096788644,1183384263,-2096788502,1183384263,-2096788512,1183384263,-364475420,199905023,-12946240,93055566,-1996306557,93052486,-1996306557,1183572550,-498714130,1183570814,-565822990,1183568765,-465159696,1183566718,-532268556,1187496829,-352321032,-62485750,201084671,-1952811584,1600059462,-1962742397,1297948645,503318218,1430622296]},{"sector":7,"data":[-1910575989,183272408,1187468887,-2097151748,1946159230,108954429,-1959300096,931858526,-1962516853,-62470337,1149960193,-96040696,-351779525,-96040170,200953599,-1961659200,516326342,-947662965,1958820638,-62470168,1183514624,-2090901764,-443874579,-900899553,1478361092,-1957345904,-661774612,1462168707,106859350,1149974411,106203908,-1980348791,1150023766,-565802652,-1989786485,1150016582,-465139348,-1989262197,1150017606,-263812842,529258635,-1962653813,1183385175,-396981786,20463235,-2096663296,80446,-6682764,-352321281,973537259,-1808335103,757570051,1183383552,-940012566,60486,1166760171,240487180,1978160697,-431605433,1166754421,-565823228,1166752373,-599377658,1166750325,-465159928,1166748277,-532268790,93004405,956454283,410384470,1979074105,272993043,-1948105079,1183388229,-96024580,1122697217,-15349885,748809286,-330942207,1996464242,1996445190,-159973384,-2197761,1996479606,-529072156,-1018113,1996482678,-361299994,383927949,-62485168,-6664170,-1996488449,2122578502,2138308858,-1696434433,5424,-1980610935,-1039403946,1187448693,-352321286,612139878,-16223232,60433524,-2097151974,1946165884,578092808,2972826,-498693376,-1960557431,1452012102,876906996,-1959373687,1149893702,-6664158,-1996488449,1589916228,1200301810,1468737071,1200170545,1468605995,133572141,-1962117884,650284227,640370433,-2144512239,-4257692,-1711041482,65535]},{"sector":8,"data":[20594307,-16157184,-1593755122,48955706,1183563819,-2090901766,-443874579,-900899553,-661913598,-1957345904,-661774612,-1962516853,2044398539,-1948518654,-936179130,41533451,1452005623,197800712,-150832686,-1964836902,66834891,13796291,-653597743,443798331,-1072958473,-922020744,-654900615,-2097151558,-443874579,-900899553,-768409594,192937912,-135497271,1441328080,-326898549,-1957210622,881525878,-1962115957,675646269,-1946270071,1284188765,1397772652,1978142352,1683786751,1348881547,244339537,-1711314968,-1037319629,1150015627,-1036805778,-1019493845,-1014297476,-1037319629,-345095031,1183551540,1850510334,1361730955,244338771,-1946208280,1284203612,1364414566,703073936,-1036805633,-661929429,-1720957813,-1036794997,1149878827,-1956749460,46292453,291825664,-1070399232,184966795,-1961986853,712477471,-14125057,1560225399,1206436620,856096785,308186048,594860811,2005606283,-3591382,2013210743,1996443942,242679568,-15960321,1996425846,108461832,-1022337793,-1191063877,121307156,-1014823308,1106764292,-1864856373,-326412987,1457032734,142525527,-955531124,-521643404,-11448346,1996425846,-1705572856,65535,-1950183847,1065363160,1092711738,-1946230400,-1931400228,-1950314800,-975532804,-1527576458,-2010719602,-57934259,99349387,-1962377532,105810932,1460013539,313754,101182208,-26025,-427098112,-310157729,535137026,113921373,277407744,1586168064,-2084556026,108204027]},{"sector":9,"data":[-2020877565,-1933377514,1430622424,-1910575989,-2084555816,2003175038,140413715,208984843,1602953099,52398860,126551646,-1962742397,1297948645,-1325398838,-919422207,1167120524,518818645,1448204430,-1950338217,-620032418,529227124,1200354867,2147427586,1962935357,142576460,419797591,1138950144,-628166517,1150016307,139233806,-503845582,1317742448,1992375050,-1950250238,-1948742712,544509399,-167346492,1963064390,-1929935095,-1899983144,-201586594,1391692708,2947994,868649728,-2090967086,-443874579,-900899553,1420886026,-1151815237,-1313129295,2092022650,-1149980229,-1313128783,1622260600,-1150242373,-1313108303,1689369476,-1150504517,-661889871,-1957345904,-661774612,-1952858061,-620034466,529206132,-654054094,1468729227,49120002,1562371467,182861,1167120524,518818645,1586223246,-2145416438,2080899711,-401698809,34866826,185228939,-1961986853,138840863,-2029627765,1468488775,49120094,1562371467,445005,1167120524,518818645,1586223246,-1960867062,1451952198,1548191494,-2090969209,-443874579,-900899553,-661913594,-1957345904,-661774612,140413778,2139103115,125569026,244367755,856043240,140413888,242539275,-315482229,66866826,105286617,-310179961,535137026,80366941,17086720,-1158988622,-1308555591,-1179391110,2092040455,45722859,-348212735,17152421,-1628735310,728259979,1569284189,1784515384,-1990042325,-2134689187,-1946257819,1563651165,-1962117788,1563651677,-2147191450]},{"sector":10,"data":[-1023314355,1167120524,518818645,1465309326,-1962385781,41910303,-1878557688,93906958,2123038979,859671304,105810880,-108835613,-1958250744,1951238105,141871931,537415040,1074285952,133923665,58469503,-1929379141,1258433590,1972056436,-2093708532,-472831802,-472783919,-1985088765,-1985125307,-1985124795,-1985123259,-396857787,1583349617,-1962742397,1297948645,1124074698,-1989911159,1569285725,1851623788,263839979,6339074,297338603,7387650,1167120524,518818645,1465047182,-1962254709,41910303,-1962443768,-401698623,2123039999,-1958900982,25951326,-1962392063,1442906689,1895531270,1642791797,-1944196208,1430622424,-1910575989,1586190296,-2145416438,2080899711,-401698809,34276542,185237131,-1961790209,138840893,-1956625017,1434912342,-20649886,49120095,1562371467,445005,1167120524,518818645,-1957177202,529205854,134381440,244320124,218398184,176065282,-797638901,1317748107,-2017359096,-1929154491,1300824206,105810792,1434964363,-1869806734,1783466240,907717611,911226421,-1816512917,-1174148300,-661900363,-1957345904,-661774612,-1070377130,185366155,-1961855754,142525492,-1157214581,-755040255,1593835960,49120094,1562371467,576077,-348949830,880720387,1167120524,518818645,1465309326,-1962117493,142525492,856051339,1607663579,49120094,1562371467,576077,-348881222,863156739,1458342741,175541079,2126787723,72256262,-754984141,-443851169,574045,1167120524]},{"sector":11,"data":[518818645,166254734,49120000,1562371467,-2071213235,-2079653732,963903646,887641937,866105856,-1962933064,-486498676,1398497032,-12105897,-1956945966,-486499188,652410645,-134005293,871920971,-752434231,1274544933,-919343755,-388877373,1450508782,721783590,963665988,-1955828489,-1948611608,-120495036,-751578997,-654900615,331678617,-1960939309,-67672996,326945035,1885881347,1313778448,1963049462,80118531,-138165534,93005529,1685389136,-9669377,1962893428,20441192,-1960387605,1615080197,1828141424,-1947694228,1682213850,-796133167,41538355,60414199,1892881349,1683786526,-921961481,1141052284,-1424986000,-1040822706,-2096925439,-1025375034,651818947,-11532917,1962894452,1618280300,-395283201,-605355807,1167120524,518818645,166254734,49120000,1562371467,-2071213235,-2079653732,192151710,115890001,866826752,-1157697047,266928127,643200257,1143670155,-147230616,-393517972,1150016139,-1946627732,2043884496,-1713834238,-753679101,1552621168,201062252,51608777,275800132,-162640213,57999809,-503003517,-638073918,1342540582,-9669377,1962894452,1618280296,-352298776,93005531,1886405675,1684862777,-628365173,-781433717,869305336,-150832685,-989619752,510710547,-143893365,2093550587,1615069971,1319833712,29488718,-964492427,-1010638332,-1960388105,1962889221,1685389164,-9407233,48783476,1440475904,1448209547,1996424791,142016262,-1878362369,-131667954,729076235]},{"sector":12,"data":[209125200,-16222465,244320886,1542984680,393531915,-1962652021,2026910675,63122182,50785217,721580225,118124739,-1957077409,180510181,-226387712,-1031045120,-638063125,29086259,-809487616,24528118,-628344203,-661733325,922745432,922681346,244056064,113704962,899547136,1457164027,190177745,1573978075,869960798,-86470976,1679,132751,-1009086725,-315402920,1150016267,979143480,-2077551500,74514574,183681,9477163,-847182735,-1036845055,-634142165,-1959863765,1563608726,19325695,1191997445,486614599,1195838064,-389811998,-269811624,-352300056,83961585,1195838576,1897726246,-498645238,1038664688,-386929920,-236257224,1896153382,642205452,175119617,-253606073,2287811,501805035,653388544,208733441,19285831,1191866653,-1007623609,-352319512,190703,12251627,1241610624,-1021998810,529149531,1989017394,67013380,1272941563,-1898869685,-1523122751,1610392886,49120094,1562371467,-874280115,1167120524,518818645,1465309326,-1945745781,-1916629286,-1191037890,-218365926,-2032628817,-1946209541,-1948580909,-947715970,964900357,-483822592,838809102,1461080656,16777114,906816256,1380987391,-6662378,1593835775,49120094,1562371467,182861,-269762509,-1960442021,105071367,-1957345965,1465261804,-1030825332,36978317,-67102023,-661934094,-13436026,-620506229,-1929347445,-208992899,3769142,283329140,838809171,1461080656,3601818,250305280]},{"sector":13,"data":[838809171,1461080656,3605402,1499093760,-1962742397,1297948645,-1961260234,41911071,1359508488,39619922,-1946219543,-873362438,-622084045,-1960442021,-1940433401,-1916629286,-1191037890,-218365926,-2032628817,-1946209541,-1915026477,-208992642,3769142,249766516,1345453878,-1705568686,14169,-13234965,374493233,929667671,1552744448,-21567230,-152321997,1167120524,518818645,-326903666,-1957210618,2123042934,240552716,-1995815285,1183579206,-96040696,1183432755,106859512,3203969,-203904,377289806,-882771,679279182,612107323,1178997887,390017,1325339371,-13927174,-695731130,1246365163,-1375975681,-209594745,166395914,1191171719,99844602,-1900052480,-1200357374,-129564757,1183560427,-2090967048,-443874579,-900899553,-661913588,-1957345904,-661774612,1444211843,209095511,-787856245,-62486048,-964442485,-260667110,-1996483067,1988883526,172264202,1183441105,-2084140038,1988696774,1443310,519194249,243174151,-654850165,-1425487997,-1414807501,-1985238101,2122971262,-364475914,-2130157941,-788516637,114000363,-329348864,-1946913141,1586229886,-363951124,-667696757,745849635,1946158249,-95122666,-234626351,-1031547253,-262764282,44648006,-1961790464,-489555371,-678692349,-1996045693,1195896406,871128713,-61931575,-2018699908,-95485961,70985340,327099004,-243251642,-15537404,696056398,-2013509889,1325788158,-62455985,-2130802771,149619441,1191181959,82936058]},{"sector":14,"data":[-1980467575,1317663358,-827850774,243174146,50873739,1166669382,-2090967288,-443874579,-900899553,-1070399478,1988882411,-1962677264,2123099766,71666166,1946305849,113738589,-1946532725,62915528,105266119,-1047799689,2123081203,-1958286346,1166669438,38091012,-947701644,-260666618,-1947312501,1334573636,63998970,64029650,1003946961,-1502149034,1347900246,142016337,-135786864,116360189,158711819,-385596021,-471269239,-1962571266,-147064714,70986612,-930398603,990010763,880084060,-1962650229,113673182,-217659517,-1994033753,2123039831,172883726,-336038261,241077060,-1996335989,-4583849,207063423,1468652279,307726608,-1980334453,-141821826,-788084861,-1980234784,-544475522,-1961984373,1161559623,-1996259824,1149964357,205863686,1166607229,71600908,2115126587,306546947,-1962260993,1166669438,-27989758,1167120524,518818645,-326903666,861361668,172919744,1988827363,1962281740,108954385,1443789829,-401967361,-397016857,-991308053,139365120,1183578339,-523155450,-523116335,1183441105,-62470394,1996423424,-618469124,200951433,-385649216,1988821160,-1959490806,1032521854,-1072965493,-1014292597,771507715,1448280068,108461911,-401698736,-1072956056,1182865781,-1962868484,-11273634,922745974,-6684124,-486539009,1035987817,58523678,-1962926408,2123102838,-11512052,-1711135690,15135,881544419,503860363,-1958900985,-1995076641,38061844,-1527578619,-1593540723,-1582628808]},{"sector":15,"data":[-2085945286,16791558,3806851,-92864768,1792154,209125120,-1948898584,2123041398,-2090967288,-443874579,-900899553,1317732360,1359406074,3895706,-339725568,-326412834,1988843350,-1959490812,1996425340,922703622,1016726052,-486539205,-1949332724,1032521342,-201586914,-1956749404,79846885,-1144442112,-1957363279,-1940433172,74892763,38026157,1001196413,92078660,-352313665,1359619,-1031021682,158714123,49690367,-472252440,-1949332646,-1949266952,-1898214339,-1070334781,374955,3711403,3842475,939951019,377684224,-1962934214,-108811327,-1205767148,-978649087,-1515912074,45655461,1150003968,1150004218,1150004222,1150004216,132885500,179945523,-1901333760,1606585307,1575324510,-1946155838,1430622424,-1910575989,-299987496,-397206014,-310116521,535137026,-1932833443,1430622424,-1910575989,149717976,2123234391,-1962469642,-1951724474,-1951724986,-1951725498,-2085943738,1461061871,1610556136,-1962742397,1297948645,1426065610,-326898549,-1912842488,118945918,-1425389941,-1425521013,-1425652085,-1425783157,-2096343413,1461061871,1610543592,-1034033781,-661913590,-1957345904,-661774612,180078899,172395264,-201862605,1378927232,1975520065,-993948685,643434078,-498919544,260581113,-1962742397,1297948645,1426065098,1465314443,280941107,379357952,-1960867072,-1960647921,-1958900743,1161495622,-1961724670,1161496134,-1962248956,-1995994875,-338588907,-338064418,49185752,-628371591,1608079080]},{"sector":16,"data":[1575324510,-1946155838,1430622424,-1910575989,1465275352,1183579955,2109737736,-1948780782,-654899626,1956599,138840320,-1962518903,-1073017786,-671673731,-150317429,500889560,1183383552,173443340,376815627,-1962258805,-768407482,-661917193,-150583669,-338457615,-661942210,-1962258805,1183516758,-773074682,-773140007,1977289688,-1947076620,1389507568,209125200,-1878362369,37611534,1997035067,990409223,58066502,855764611,197561298,-150506241,-2082932774,1583284442,49120091,1562371467,576077,1167120524,518818645,1465309326,1183570739,2109737736,-1949042926,-654899626,1956599,138840320,-1962518903,-1073017786,-738782595,-150317429,500889560,1183383552,173443340,-150581621,-1946645535,-259323322,-100408841,140965782,-678692861,-619985269,-621344908,-628893449,-2090967296,-443874579,-900899553,-661913592,-1957345904,-661774612,-13412525,185091723,-149783104,106335191,-621291273,-1996488675,1451821126,205949702,276676619,-150317429,500889560,1183383552,173443340,443924491,-1962258805,-768407482,1183576567,-1947076858,198325186,-347638273,-661942196,-1962258805,1183516758,-773074682,-773140007,1977289688,871495668,-11513134,1996426358,-401698806,1446707483,1913091848,105265931,1177224822,206969610,453396011,-16054186,-621344907,-628893449,-2091163904,-443874579,-900899553,1430585352,840887435,-788077587,-489500192,49120250,1562371467,52045]},{"sector":17,"data":[-1003791781,-654894733,168180022,907048704,788025,-1556741002,-527761396,-1949609134,1107525654,788464756,-5241984,-1140936517,1352203696,16777114,-1957340416,394997484,-1070382269,-523124086,745784363,959895799,1996491270,104412707,74842124,828214,1465311371,-963985357,-11476783,1583307219,1532880267,-469769981,-1140871191,1536219276,1125616430,-1957345981,-661774612,-1031094221,-1003757359,-654843277,168180022,920221440,788025,-1556741002,-527761396,-1070377130,-523123062,1507065680,-310157729,535137026,123424093,1392959747,-1864856373,-326412987,1457032734,-1962129781,-503904690,1183570059,-135230710,-1764097055,50882295,-1949070376,-310157626,535137026,147475805,196650,16721023,196880,16721379,16974097,81813,196609,16721219,196883,16721752,16974100,71479,16973829,80819,16973830,80789,16973831,76846,16973832,77065,196617,16723147,16974107,71234,16973839,68653,16973840,70289,16973841,77766,16973842,77833,16973843,71282,16973847,71332,131096,74238,205344,16725960,16974124,76831,196637,16725974,131373,75201,16983601,66198,327730,74235,16982560,77020,16973886,77630,16973893,77621,16973894,66769,327751,75198,16983601,77560,16973902,66145,16973912]}]],[[{"sector":1,"data":[66157,16973913,66164,16973919,67512,16973920,66553,196705,16712676,196861,16712704,196733,16713497,196734,16713507,196862,16713791,196863,16716445,8519941,1167120524,518818645,-326903666,-1990765016,855704638,1346036672,-6663856,-486539009,-1547685072,983760952,23717888,561299467,1946167784,20899868,-1706027148,65535,-1898410920,3981248,855663801,-139725888,-2090967088,-443874579,-884122337,11208333,-6664162,-1560280833,109903888,512557248,244121800,1988952273,2669270,1394495518,1444303134,-26030,1444282368,25498,1221376,1326733,-1959856589,-486449268,-14790362,96931381,-13762560,1493260692,309641227,1195836809,529258635,-2147266688,1179049954,516150507,-6670849,184549631,-1946979136,-1289843216,-1190228736,1394497024,-6663906,184549631,1457222848,-26032,-1073020928,1347473524,16777114,-1959664896,113413872,-6662650,117440767,-1073019511,-661971340,1333796747,-964460541,855082770,-17984,-142102798,-8304825,-746717136,1462072415,16777114,-6662400,-1207959297,1344143512,67482,1958742784,3318539,529258635,-2147266688,1812031427,16871681,67110400,-369098752,65535,16777194,-5632,163053568,-6664192,-1560280833,-1073020876,163057268,2073710592,184549377,3580864,-326412861,1342204344,115610,60072704,74825739,803979307,-1728030024]},{"sector":2,"data":[-6664110,-1560280833,-1073019916,146336372,-1952821248,-1560281087,-1073020006,582539892,-1706025471,65535,-1962933832,298016229,1744831232,2097152257,453051146,67109120,-117374208,301990144,889258752,318767361,1006633728,-1811939072,-1291844842,754974977,-889126122,788529408,-2046754048,973078784,-486472960,1006633216,-301923584,1023410432,989922048,1056964865,1828717312,-1056964351,-1929313528,1174405376,1157628672,-419430143,-738196727,1996553985,1912603392,1912602881,-1660943608,-167771903,1702258965,1701137940,1167087646,518818645,-326903666,209617678,721712384,-1955599424,126553182,-1946794359,138933976,-15961024,-6681482,184549631,-1948224320,1200354910,911706932,-1980217719,1589967446,1200301816,-1983708377,1451881030,-62470156,468385792,653418180,1946173312,-230228197,-1006138842,1191118430,126363142,-1946401025,994576966,-595592122,637951684,-1962932282,-310117306,535137026,147475805,-1873273344,-326412987,-2082959842,-1070920980,-1979955575,1183447110,105286646,-375159,1183647862,-1202710794,-1706033150,261,737822347,1183446598,2109737734,-2082932990,-443874579,-900899553,1478361092,-1957345904,-661774612,722136195,-96040512,-1980217719,1183577670,-62486266,-1928825089,1343682118,1342177976,16777114,-62485760,-1980217813,-1073019322,-654900611,-1962742397,1297948645,503317706,1430622296,-1910575989,988578776,310281046,721777920,54979008,-1727899208]},{"sector":3,"data":[-6664110,-1996488449,-1072966586,-1705973388,584,-1980086647,1589967958,105286650,638080651,-1993996407,1183515223,206998282,71797030,106400038,138921766,1183514624,1200170514,-1948742902,-532248313,16777114,-530674944,-14125057,1996433015,242679568,-1157627976,1347616767,-231681,1603009142,341835562,-1697495415,65535,13794947,1187448949,-385875746,1996423845,242679568,16777114,-834238208,13125319,-565786880,1187512319,-1962934040,126554718,-1948236151,207588312,1183385483,-1948742710,1183411783,1975520214,-530674932,-1960157301,1183396935,-899773482,-1994242165,1190648902,1965031644,112645,-1070923029,-941472119,53318,-1711137815,622,20856451,-756480,-16696314,-1711016906,65535,-1980479863,1183446614,-296318484,-150983240,1174524014,-195115788,4162342,-907474827,-26111,1048772608,1962934594,1074200564,-195116031,-1707606234,65535,1019627144,-1207339521,-1705967618,65535,60438271,16777114,-967407104,61994538,-805051693,-1947576695,75465690,-14713088,-1711039946,731,20987523,-16091648,-1593753586,-1863777984,-373282048,922681483,-6683750,-2097151745,81982,251595126,1084293440,721611521,-195115840,138906406,197936777,-1962249024,1178195526,-349866804,-195115944,206015270,-1996487899,-1072962490,2122516085,1098186978,48529027,2122529652,896795620,31999687,239504128,1964000779,-195115913,105351974]},{"sector":4,"data":[-942782839,63558,969426571,863893574,-772245877,-94452506,651052683,1963737145,-197722339,71014915,1048772608,1996489020,14018819,20713215,-385794911,1191117005,-1949963272,1191168118,-991505976,1183578718,1082730190,-2017057268,1342177818,-1030962293,1375869445,2078800,-26032,1391132672,-1946919228,958844486,2054489671,15091399,239504128,-1995417973,1451880518,-96039950,100423307,1183384090,-631862824,-1024316,-1977159610,-664878073,651708159,-1073084536,1191121012,-427916314,-1948158689,-970532770,1996423175,-193527818,-1946532213,134610006,-1957670398,973470278,-11513342,1996427894,175570700,-16222465,1642595958,-565802752,393592843,922690539,-6683660,-2097151745,80958,736691062,-4183041,782356550,-800704255,-538377357,-394361859,-1005554432,-2094597538,1946159231,-767128826,-2210167,966448246,-16777209,-6630282,-1962934017,-2090934714,-443874579,-900899553,-1957363698,49054700,375309398,575114022,638738116,1589905289,1200301590,308200485,38242598,-1005816065,-14281122,244327031,-990110744,-1993993634,209125127,41418534,-1058533744,308200699,38242598,71812902,-953810944,1607,639000260,-1004714101,-1993993634,1589905479,1200236054,308200474,172460070,639000260,-1004845174,-2010770850,1589906247,1200236054,308200476,206014502,639000260,-1004583030,-2010770850,1589906759,1200236054,1006838796,-1341885183,-1341986045,308200449]},{"sector":5,"data":[239568934,256362022,1204168194,1589903632,1207313942,74711332,48956080,1589903792,1334453782,-253657052,1589952778,1200104978,126559761,638475972,1589905289,1200301590,241091604,38242598,639000260,639780747,-1005304021,-1993994658,1589904455,1200301590,241091606,105351462,639000260,-1005041781,-1993994658,1589905479,1200301586,241091586,172460326,639000260,-1004058741,-1993994658,1996426311,2013210124,-401698814,1589967612,1200170510,209125122,74972966,-370667888,241091834,71797030,638351103,-1878624257,-86579186,638475972,-16365687,-14283658,244320375,-990198808,-1993994658,1996425287,2013210124,-401698804,1589967463,1200170510,308200460,138906406,638475972,-1005697143,-1977216418,1589905991,1200104974,308200464,189237798,638475972,-1005500536,-1977216418,1589906503,1200104974,375309330,692554278,638475972,-1005369464,-1977215394,1589914183,1200104974,375309332,726108710,638475972,638797570,-1005238392,-1977215394,1589914695,1191323150,1200104979,375309334,142574374,-1341885440,704834305,-771509824,375309536,206539302,-805052032,650185441,-2145103990,-1056247327,638475972,-1005107320,-1977216418,1589906759,1200104974,1204233752,-1006632935,-1960438178,1589907527,1200170510,375309339,306678566,638475972,-1004714103,-2094655906,1946159231,178181,-1070923029,-1961468220,1207314160,91554572,-352321096,197143298,-28931642,66336511,222874,1010729728]},{"sector":6,"data":[158728193,20713215,-352240479,-4183294,1996428406,276234002,-15829249,1996488310,74907398,1577606911,-1034033781,1478361110,-1957345904,-661774612,1443163267,637951684,1443526539,638607044,244332543,-990295064,-1993994146,-14264825,244318839,-990317848,-1993994146,-1000996281,-14283682,-401698761,1589967144,126428684,2013210198,-401698814,1589967128,1200170508,-14264830,244319351,-990312472,-1993995170,643171399,-1878624257,-118036466,638344900,1443252105,142081830,-437776752,207537400,138905894,2013210198,-401698804,1589966987,1200170508,-14264820,244320887,-990348568,-1993995170,643172935,-1877379073,-127277042,638344900,-2145826935,-1006499250,-953809314,67655,17450742,-1070988172,28312299,1589960912,1334453772,-236879849,135053578,390563878,-15567105,1392906358,-1005947137,-14285218,-14286217,1610556983,-310157820,535137026,248139101,50336000,16946177,50331904,16948481,50333696,16956417,50333952,-16612352,50404864,17070849,50336000,16863233,33559040,-16669696,50372096,17068801,50336512,16889856,51811328,16921601,50339072,16859904,51784960,16788224,53199360,16896257,50349312,17017345,50350080,16825344,53661184,16878848,85352960,-16670464,40448,0,1167087646,518818645,-326903666,-2091493606,1962936958,-373282043,1586168519,-164132086,1950353476,-6663414,184549631,-1947831104]},{"sector":7,"data":[1418409028,-129595082,-1946528119,1552626300,-1960867060,1183392327,600897510,1183387461,-398002200,91488768,-352321096,-1983894782,1187511366,-1006632718,-1977157538,1006838791,640775425,639846283,1965377291,-431584473,-1947187575,529208924,-2011805814,1190652486,1950351590,1963146250,-431557109,-955943678,127558,1183384971,-128006922,373787430,653149833,-16222209,-1705970058,217,637951684,-1962784887,1589964358,1194010360,1996443656,-294191114,62106,106873856,71797030,653811396,-16091137,1996486262,17537774,1589903360,1200170502,-128007162,209190694,-624897,714796662,-1006632959,-1993996706,2122516551,1567883506,-231681,1589903989,2013210360,22256153,1183383552,106874108,653674123,1166739337,-62520574,172460326,653811396,-14977025,-14286219,-23455369,50331649,1589967942,1200170502,256243468,158598144,731448715,-336014910,62925570,-1528169402,175570688,-1695123713,402,637951684,1996425097,2013210122,27630082,1589903360,1200170502,175570690,74972966,112794,106873856,71797030,638220031,-1710852097,459,637951684,-16365687,-14284170,-6682505,-1006632705,-1993996706,1996425287,38112010,1358710275,133018,106873856,172460326,-1005947137,-14223266,1979652983,2013210114,-26087,1174601728,429543676,-1006632958,-1993996706,1996426311,292945674,16777114,106873856,424118566,638076299,-1978775671,-2010772923]},{"sector":8,"data":[1166676039,1200104971,205883921,306677798,653811396,-1004714102,-2010773922,1589908295,1200236280,106873886,340232230,653811396,639584138,-1004714238,-2010773922,1589908807,1200236280,1191323168,106873885,373786662,653811396,639846283,1948600075,-352210940,-1312806398,-991899133,-1977157538,65110031,-1056251440,407865894,183624064,106874049,390563878,653811396,-1005369462,-2010773922,1589909575,1200301816,106873860,457672998,653811396,-1006221429,-1993996706,28843335,-2090902016,-443874579,-900899553,262150,12320771,763494401,31522819,18153727,25165827,18219263,2555907,734134273,1167087646,518818645,-326903666,142016284,-1710852353,65535,-1981004151,1854139990,1585660652,1187447022,-2097151772,1962936958,1144946751,460587009,1344274616,-1149185,-1130697610,-1996488704,-1073018298,-1070916235,-16660503,1996425334,-294191354,-1695779073,65535,185222793,-941394752,-7098,-1710590209,214,-1980086647,-1039401898,1996428149,-294191350,736917247,-2070261568,-352321535,-461470766,-385649664,1048576236,1962934596,9890051,17450742,-1914109068,536918016,-294191280,-1695779073,65535,199640713,-16026176,496634486,-385875967,1996488572,37198566,1183383552,-195655182,-1981266295,1183574614,-61436934,-1996471803,1451882054,-330920968,-336574839,-161561582,653674239,1589905290,-398000152,-1962440666,1325396038,1975520240,175570916,131482]},{"sector":9,"data":[175570688,16777114,-230257920,-1980475765,1451883078,-431584260,-385202551,1183514763,-61436934,-1981266295,1107683926,-163149568,-1946659191,1183444038,-1005392912,1191179870,126494454,-1548604,-2010716090,-263812345,200298239,-1804864,1996425846,-327745554,-1705983957,65535,1996439531,108461832,16777114,-465139456,-385649344,1996488489,4372708,-1202695527,-1706033151,65535,-1804545,1996487798,-327745542,16777114,-461963520,16777114,-94452736,661619494,1602430530,-165281751,175440903,795837222,1602430530,1589903409,1200301818,1191912995,638219301,1109618563,627016486,175570688,165018,1144946688,192151553,21235398,172395264,-1962696541,-310179258,535137026,113921373,-1873273344,-326412987,-2082959842,922686188,-6683660,-1996488449,1451882566,-164777734,1174604390,-230258184,-990620023,-1960381858,-62486265,829800459,705316490,1996443876,108461832,16777114,1958742784,-228670455,71797542,-1070923029,-637303,-1711016906,65535,-336181621,-228670410,38243110,-940685687,61510,-231681,1996487798,146297072,1347590400,16777114,-6664192,-1996488449,1589966406,1200170738,-2084771068,-443874579,-900899553,-1957363706,1122796524,1187403351,1048837868,1996489006,306613010,1964262923,102754563,-1292602,-1006233367,-1977215394,1183322183,442403786,1183385483,-1948742678,931859551,-1989262197,-1072963514,1586170997,710904810,-1993062517]},{"sector":10,"data":[1150017606,-431584990,15091447,-1961986784,1207364190,91554056,-352321096,-1983894782,1150021190,-398030552,-1993718645,1589961286,2139104790,292814866,-1030962293,1375736325,162981968,-339720567,-1069103355,1589903360,126559766,197019273,-1958120000,1175130694,-1005882348,-1960440226,-1102673657,716715755,1962889216,108330762,392346,179935488,-1980107008,138264134,-955941632,572998,556675,1996426869,-1099497702,16777114,138840320,-506169,-96024577,1589936127,126559754,39291686,-1982052727,-1070866858,-1979824503,1183448134,31779300,16777114,1111393024,-193658879,20973311,651976388,-16040053,-947190668,1589909483,1200301788,-465163518,-150983239,64523241,-1960387490,-6664185,-2013265665,-12795322,-21493387,-6663937,-16776961,-1711039946,65535,717379210,-754732554,-1982856222,-628361642,294787,922689407,2056913818,-2097151996,81982,251595382,1084293440,22669569,1424605227,-1707671807,-26109,1048772608,1979711808,1074724617,21012737,-1070923029,651976388,-1995946101,-1072970170,1183517556,-968476192,552152948,-597769215,206015270,-1996487899,-1072959418,2122516853,57934062,-2097084695,1963126910,16640259,66092675,-186055819,-597769216,575114022,651052681,-1995028597,-1960390586,1183393095,1200301778,-733574883,440896038,651576968,-2011478134,-1977166010,1183325255,410451928,-1927907585,1343667782,1183666950,726669006,1178161344]},{"sector":11,"data":[638744006,51136502,2122320757,91488970,-352321096,1354771202,-1673473,1996482678,-461963294,-16222465,-51902858,-230258425,-2081139063,1962985086,-360170,2081455999,-134267643,1182861687,-2096627470,-1962871722,1452013638,-195675654,92212604,1995589177,75399942,-1958579200,1452013638,-195675654,92212604,1928480313,75399942,-1960151808,1452012102,-129594892,-1946528119,1183441990,-599356476,-1981917557,1451883590,-834237442,-1949546871,1183437382,-599358502,-465109203,956378785,57926726,-1946282263,1175130694,-385649388,1589903556,126559758,-993114487,-14282146,642779767,-1709803521,65535,-992983415,-1960440226,1183384135,1200301778,-733574904,172460582,651576968,-2012526710,-1977166010,1183321159,410451928,-1927907585,1343667782,-15436033,1183650422,-1202710834,726663169,1996443840,-394854426,1357018879,-186101680,-230258426,-1946921335,1452013638,-195675654,92030079,2012366393,-230230211,427032832,15091447,-1005423358,-2144989602,637669455,738740097,1207903745,-230230255,57999872,-990095895,-1960440226,731465735,653840834,-384743679,1183579202,-28963844,1458111349,-129567230,-10980289,-1711016906,203,-1966835969,-466945978,-1325385691,736678659,-1957674798,119928902,-1706016768,65535,1022117512,-15960578,-1711016906,1788,-16640791,-1711016906,116,-1982052727,766565974,65824502,1589959750,-1978668278,1183368262,173982956,-1946401141]},{"sector":12,"data":[-1993933226,1468605959,173982722,639616038,604784522,1963015171,173982747,639616038,556931,1589907061,-867792114,-1962440410,501996102,638213828,-1960435772,1589912135,126428686,638213828,-1960435772,1589912903,1200170510,375309314,71797542,638475972,-1006352503,-1960438178,1589904967,1200170510,173982726,639616038,-1004714101,-1993994658,1589905479,2139104790,930349066,15091447,-163744508,1963255366,173982775,639616038,51136502,1589907572,532948490,206015014,20710180,1589906805,532948490,142574374,-1005751296,-1004139938,2139104799,74711066,48955824,19185706,638475972,-1005959288,-1977215394,1589906247,1200104974,375309323,206015014,638475972,-1005828216,-1977215394,1589907015,1200104974,375309325,256346662,638475972,638470024,1001415,2139104768,125108749,223313958,-1005589759,-2144989602,1963134335,1333798405,1589904141,2139104782,91554318,240091174,241091588,289916710,1190592512,1946222840,1333798422,-2128215536,19662919,15091447,637826306,-1005500417,-2144989602,1946159743,173982806,639616038,1736576,1589922165,1333798414,1589904400,532948490,206015014,20710180,1589907829,532948490,142574374,721712384,-1207702592,-768933887,-1961992508,126559944,731503243,-1177347135,-101253118,638475915,-166639871,1950414918,241091592,273645606,-129567224,-1006078848,-2144989602,-1978658737,-466949050,-443850914,1622621,1167087646,518818645]},{"sector":13,"data":[-326903666,-1705617568,65535,20725379,-2096663296,81470,379193204,-352321524,1040646123,19702017,20055609,922698871,-2053504108,-2097151989,83964422,60045055,-150989384,1342255654,35927807,16777114,1975520000,841909009,922682625,-1952840812,-385875959,922681873,-1768291436,-1996488695,1996426822,176724500,1183383552,525758,-1916123511,1183435846,-967406396,11945671,-1000422400,-1950071041,1191168638,637897418,1191118728,-1233222730,-1914274766,1183435846,-1269396302,13401731,28837245,721611520,-1203336768,11159239,-1404647680,1183514624,-1371108914,-1983101301,1996468294,-1438216924,45633558,-6664192,-1962934017,1177267782,-834238038,732972683,1183427654,-830569524,-1962574848,99339846,-137476469,-834237992,13401731,1183516028,-1962546228,-654848954,-2083764599,1946204286,-1982269691,1586220102,678952738,-1205438465,-11534333,1996469366,1354771378,-1957670832,1610558047,-1538881244,1342182328,16777114,106873856,185043238,-385649216,-1706032887,1084,-1935260023,2122557534,1232339108,-11485141,-6642570,-1006632705,-1993995682,1975520007,13494531,183409232,1183383552,-1135179334,-14524789,2013210743,243750,-1267269808,1387427583,-4557057,1996466294,710904742,-349937665,-1983894776,1183431750,-197722182,116431363,1183383552,-1034516032,-14387457,1996469366,-1133051982,-4557057,1996466294,-1069118042,1586188310,142081982,688003,1200293244]},{"sector":14,"data":[-1962349814,1200340574,1356396298,1342180792,16777114,340146944,1586172789,710904610,956305569,91567175,-352321096,1354771202,-1997046808,-29571002,1183535477,-1136260166,1589908084,1066083850,192518743,-1705574400,3015,66336511,768922,106873856,1463782182,758682,-6662400,-16776961,-2120608650,-2097151988,81470,1676215159,1041170177,20881665,-1962845207,1175173702,-1005030212,-1960441250,-1835378881,-2147483636,1962920062,630871814,-2147483647,1979697278,10873091,650141380,294787,1183454581,1357130440,-5736705,244360822,200685288,-998148928,-1960394658,1589904455,126428682,650141380,-2096478209,81982,1048774517,1946157378,65903111,-336920576,21104383,650141380,-16040053,-947190668,1589910507,1200301760,-934376958,-1054085846,-150983239,64523241,-1960394658,597315591,-2013265916,-466967994,-26032,-1073020928,-21493387,865751295,-2097151996,82494,251595126,1117847874,721611521,106874048,1463782182,821658,343342848,285594,-197722368,113285635,1048772608,1979711806,1041170185,20881665,-1070923029,-1592887669,117375276,364445996,65140480,507939824,-1994369397,39094532,-1994635637,1183515716,105154842,-1994897781,1183516740,172263702,-1961867637,1149833814,240421132,638213828,1149831051,310151440,-2000140662,127538244,-1207959539,166395905,-6635477,721420543,-2090901824,-443874579,-900899553,-1957363680,49054700]},{"sector":15,"data":[-16353537,-6683530,-1996488449,-1072955834,1996426869,74907398,16777114,-28931840,-1946270069,79846885,-326413056,1444867203,639131332,1962950531,310280198,-1207602176,48955393,1183432747,1975520238,543081491,276791334,-1207339774,-4521985,114485631,1183432747,-431584792,1212032,1183516788,441879320,1183517163,441879320,-1996485627,1451883078,310280444,-1005947648,-2094655394,1946159231,112645,-1070923029,-990493047,-1977157026,1589908295,1194862112,-2130021363,-536811962,-1813490047,543081476,289928742,641037315,605112202,1963015171,-94452714,407369254,-2127268863,1610671686,-353872255,-1003951360,-165217698,1963006023,-431587042,1451456512,334169576,653942468,18368502,1182861684,-2096889626,-1006573482,-2094654370,1946157695,310280242,-1005423616,-1960379810,-1023203513,1347601036,-335622168,408863751,105351974,639393476,1946306361,-431587062,1451311104,-1006592792,-165273506,1961890119,-94452684,407341606,1183379492,543081698,289901094,1178267684,-2145749790,1946215038,-431587060,1451335680,-352285464,-431586552,-396983552,-330905731,1589903361,2139104800,527695886,243236902,-1000442621,-1977157026,1006838791,-2096728831,1946220158,239531526,-1000377342,-1977157026,1006838791,-385649663,2122514716,57934070,-1962863639,1183385158,341755134,-1995994330,2122572870,1048379646,-28931248,-1957635849,723969094,-1706032569,921,-350986556,-94452693,604473894]},{"sector":16,"data":[1963015171,-159480914,-139954944,1073745478,1182900597,-2116026138,19458134,1589941739,-28931308,-1006139098,-1960438690,-462014153,1183517310,-1715065884,216730545,638869188,1177225099,179411428,16777114,-431619840,-2081925615,1946158206,341754893,637814411,-385595511,1183515514,1347590412,-1713092981,1589923922,1200301818,1347590406,1025178,-1706012160,4046,1183535186,1347590410,638869188,1385760651,-94452656,71797542,-1001368935,-1960438690,1385759815,265656912,1347551232,1039514,-1706012160,4206,-6664110,-1006632705,-1993993122,-1073019833,199820158,1204233731,-385875708,2122515202,192151568,15629955,28837236,721611520,273058240,639393476,1183385483,341755134,-1995994330,2122572870,259850494,-134330741,-28931624,38243110,-2082191831,1946161278,-465138861,1178329297,-1958117378,-1952842170,-101194674,1038763657,92143624,149571271,1342224384,-1957670247,1385818694,280205904,1174470656,-397012506,-135641461,1183442030,-364475420,-523041871,-1728051155,166086153,99346518,32130759,-465138944,2113816121,1476442142,1375732410,-465138864,-1711389141,-778416046,83886096,-763142144,-1206457591,45766656,-1957670400,1177288262,1347590628,16777114,-431619840,-991406575,-1960435618,1183384135,1975520254,8644867,638869188,-1996208245,2122572870,1416888336,-775804007,-465173512,2113816123,112711,-25755824,-1696303361,4474,1038894729,92143621]},{"sector":17,"data":[99370695,1342224384,-1957670247,1385819206,300194384,1174470656,-397012506,-135510389,1183442030,-330920988,1175034184,-397014554,738096779,12117110,1389505480,2096499536,-372864251,1183514837,-28955676,-1207907095,-11534236,1996425846,294754828,1183383552,6600948,-94452656,108527398,74972966,1155482,-129595136,112720,-361300144,1164954,-129595136,1080963,731466612,66638274,1178335302,-1203864076,-11534335,1996485750,302619384,1183383552,343532,1187448190,-1207958036,1385779200,-330921136,-1706012007,4671,300303873,1183574102,161040620,1443489350,6600936,-94452656,108527398,74972966,1185946,-129595136,-327745712,-1695910145,4846,-1191688567,1385789440,-129594544,2096383545,-196703480,-336050645,-129594618,-1712044501,-1617276846,16777234,1444013638,-293698584,-1957006080,1589905478,1194010136,2996482,-880025097,-936655988,-1980739959,12120670,1347590480,638869188,-996604021,-1960382370,-101244337,-991279479,-930409378,71797542,-262224743,627018534,1183448055,-1715403796,-157659054,16777234,1444013638,-360807448,-2096726271,2114055294,-431587063,1451476992,1183514856,-364496404,1178155636,-1206747414,1385763840,6600784,-361300144,-336824577,335591440,-1202695527,-11534236,1996483702,326408938,1385758720,326933072,1174470656,-397012506,638869188,-1996077173,1589961798,1200301600,-28931832,947175435,98846347,1178271894]}],[{"sector":1,"data":[-2130084354,19719238,31936128,738096779,12117110,1347590412,1342177720,75298315,116115083,736380555,-1202651578,585826314,721522872,-259267514,-1727266632,28856402,-167030784,-963967876,-963967765,-1202661129,-1706033132,3856,-1706012007,3997,300303873,1589962838,2139104800,1031012362,638869188,556928,1190605685,1963196430,239531551,-1004964604,-1977157026,-2013060089,-1073028538,20710516,2122519413,225771766,935671,-2145422076,-352131250,341754905,138906150,639655620,1946830648,-431587063,1451429888,1589903592,2139104800,276037643,638869188,622464,1317013109,434847974,638869188,-1006024822,942022750,158600007,15091329,-396983540,543081472,209682470,-1005554688,-2144988066,1962936959,-431063034,-1004934272,-1977215906,1589905991,1194862112,-2130086900,201385542,15226499,-1947842933,-1956714410,549608933,50340864,17588993,50331904,17896448,53314048,-16532224,50402816,17394945,50333184,17533697,50333440,17399553,50333696,17388289,50333952,-16619264,50404608,-15971584,50404864,16794369,50335488,-16326656,50405120,16813825,50335744,17526785,50336000,-15968768,50405632,17478145,50336256,17525249,50336512,17627904,51811328,17904128,54401024,17382145,50339072,17473280,51784960,16952577,50347008,16954113,50347264,17787136,54476288,16879873,50348032,16782337]},{"sector":2,"data":[50348288,16801793,50348544,17639169,50349312,17643777,50349568,16893185,50352384,17510656,53432576,16891137,50352640,17434368,53662464,16886785,50353152,17377280,51798528,17818368,54355712,17462528,1439232,0,-2081649835,1448548588,15222471,943620864,125108225,20594307,-1710787584,53,117435371,1048772922,1962934588,1044284167,125042689,55706,-1316096,-16695802,-1711041482,65535,-1980086647,1187508806,-385875724,2122514809,326434820,-1947050357,1451951686,240597256,1194919285,-2094959604,1962935422,22079747,-1947050357,1451951686,39270664,1072235380,1946630401,20506883,-2131599733,1979651199,14608643,15236739,922686581,-6683660,-1996488449,1451883590,-398014466,766509057,-151888245,1174606951,-27882500,-1980873079,1048834134,1962934592,1111393031,125042689,16777114,-1316096,-1006550522,-1960382882,1962281783,-339309820,2996242,653156036,-1962776585,-58800936,-1996387546,1589963334,1342121710,2139301386,931069962,637771937,1946437433,-295779312,74972966,16777114,1975520000,-295779088,71812902,-2094661632,259326015,-1963827573,-467004345,1448538251,-16361240,244378230,705199848,-1947709212,1975520007,-83959,-26032,1048772608,1979711810,1108279049,21143809,-1070919701,1586170859,276299762,16777114,-228685056,-1710065665,632,19664639,-1191105375,-503906283,-1980086781]},{"sector":3,"data":[1183578182,-330921486,16139975,-159481088,-1961067243,1191177310,-126448660,-1963440385,-16283644,-437520826,368199299,-1577826561,1178140972,-385649676,2122579580,158597352,66336511,16777114,-1808335104,-26109,849412096,738601729,343297,748758646,20095745,1929381181,839304966,-16775935,-1207725002,653721621,-11534030,-1711135690,65535,20856451,-16157184,-1593754098,48955710,1048821803,1979711802,974061321,20619521,-1070923029,1577058744,1575324511,503318210,1430622296,-1910575989,82609112,106859350,2013208459,74972934,-397361109,-259261042,-1710852353,65535,-2090940789,-443874579,-900899553,1478361090,-1957345904,-661774612,-16222465,28837494,1609060352,49120253,1562371467,313933,1167087646,518818645,-326903666,-11118824,1996425334,-26106,1183383552,2113004,-1070922377,-2096970519,80958,1048774517,1946157374,50043399,-336920576,20842239,20987523,-2096663296,82494,479856500,-352321536,1107754987,-197722367,59611651,-930414592,-1962922568,774305754,-1983380735,1586100302,-1707671558,70687235,-259325952,1187511947,-352321304,956664623,578153542,-16497153,1166672453,-1964758521,-316012979,-1992244949,922743366,-1600519270,-385875965,-947715601,-398000376,956379297,-915216314,-1280257,-960959370,-1202708991,1385758727,-26032,-1706033152,65535,1358710409,321178,-297367296,200300169,-13732414,-1711039946]},{"sector":4,"data":[998,66336511,257690,-327745792,16777114,1111393024,58130433,-16662295,-1593753074,-1192689342,-295779327,-1995994330,1191178822,-297336850,19793411,1979776317,-1707671781,67803651,1996423168,77372156,1996423168,81435388,-1460994048,956379297,1996568070,-1707671753,75930115,117374976,922681654,916521882,-754732799,922702048,546964004,184549378,-16353856,-352242162,-1707671623,4495875,-259325952,-1192462593,1385758728,-18352,1392508858,-26032,815857664,805764865,-1309111551,65524483,-330920962,1170670985,-956301054,66629,-2013188448,1183450693,105186034,1166592254,-1707671801,32414211,1183514624,772146162,872823553,-10062335,-1711016906,1234,32654987,-16698362,-1207700426,653721645,-919928524,922701905,-6684130,184549631,-14780992,-1962856434,103412294,1996423476,88185596,1996423168,88709884,-857145344,-197722114,10983939,-930414592,-1962922568,774305754,-1983380735,1586100302,-196687878,837484544,-362753,1996486774,-260636692,-387025153,1183383694,-262764050,242598411,19926783,703874699,-385798650,1183055548,1191128568,-230257676,1928611385,-59310137,348826,-59310336,75162,-197722368,31824387,1048772608,1979711810,1108279049,21143809,-1070923029,20856451,-16157184,-1593754098,48955710,1183563819,723053554,1044284352,175505409,20844287,-385794399,-1070858948,1593653225,49120095,1562371467]},{"sector":5,"data":[313933,-2081649835,-1000994068,1182991454,-1960443388,173982727,38242598,637820612,16793473,-1070922124,12773785,-1962260853,201657430,-129595136,-1946528119,1451951174,4326662,-1979955575,1183579734,172370936,-150983379,-336557096,-60898286,654067455,1589905290,-129564680,-1962440666,-1073000762,1589962613,138840842,638028070,280519,73319424,1699187494,1732709158,1182994293,1589932292,1204233738,-352321528,71729942,108461937,-1710983425,1636,638213828,-1006090359,1191117918,1065362948,116684032,-1710983425,65535,638213828,-1006221431,1191117918,1065362948,-990612224,-953808290,2631,19793663,-1962654069,-1956772266,180510181,-1873273344,-326412987,-2082959842,-11138324,1996425334,46307846,1183383552,2113016,-1070922377,-16720663,-1315243914,-956301309,64582,20463235,-2096663296,80446,-258341004,-352321530,973537259,1010729729,125108225,20856451,-1710787584,1801,117435371,1048772926,1962934592,1111393031,125042689,189082,-1316096,-16694778,244381814,-2013088024,-12782010,-466996876,61993099,922740435,647627674,50331651,75269104,-14123520,922682444,1754923930,-1979711481,-466946490,26536016,-2080618871,82494,251597942,1117847874,-15865087,-1711039946,855,-1070864917,20856451,-16157184,-1593754098,48955710,1048821803,1979711802,974061321,20619521,-1070923029,1593591435,-1962742397,1297948645]},{"sector":6,"data":[1426064586,-326898549,1183471128,-1947981308,105286384,-12128213,-1711041482,2045,-939899255,62534,1586175467,71731962,1981040440,343900171,-1962576641,340207814,368723587,-1577826561,1178140972,-2395404,-1711041482,2098,60438271,588698,-364476160,16008903,-1961170176,1183509086,105330692,-963966858,671500072,1182992199,1191119082,19964404,1928611385,-1707671586,153590275,922681344,177865716,-1996488701,1451883590,-263812610,-940419447,62534,1589911531,1065559792,-1978698496,-467008442,38222118,690357366,1182990967,1191128560,19833332,1928611385,-164777767,1174602854,-27882500,-1996477179,1451882054,-164777736,1174603366,-330921476,-1578215799,1317667118,736963076,2996673,-1054088713,-336312695,-161561582,653674239,1589905290,-330891284,-1962440666,1325397062,1975520244,775301604,-197722367,61446659,28835840,-443851264,311901,-2081649835,-2141844756,1979647102,-373282043,922681486,-1516633190,-1996488695,1183512134,-1310447100,65065731,1183446598,-2585606,2139292239,108986370,294787,922685054,-1097202790,-1207959543,1424687105,-1963303285,-467007929,122128976,-27006896,-369013,-26057,1183514624,806289398,806783745,-754732799,-1983773726,1183579718,-129594886,16533191,-58817792,-1951171320,1191180382,-25785352,-1963047169,-16283644,-437519290,1575324510,503317186,1430622296,-1910575989,2122340056,74841862,636207147]},{"sector":7,"data":[60438271,648090,-1948742912,-427751818,61931775,1090512595,-1707671806,169187843,28835840,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,922683116,798622618,-1996488697,1187445318,300613884,-1946526069,121177670,1182996084,1191053562,-62485764,104588330,-462290640,-244026,60438271,476058,-62486016,-310123478,535137026,46812509,83891200,-16497152,50406656,16867841,50331904,17048321,50333184,16878593,50333440,17284097,50333696,17298433,50333952,17087233,50335744,16875777,50336000,17316609,50336256,17356289,33559296,-16496384,50406656,17225473,50339072,17384961,50343424,17006081,50347008,17007617,50347264,17036801,50347776,17059329,50348800,17188865,50349568,17213953,50355968,17219329,24576,0,1960512339,35621658,14123225,74771722,48957320,-651556983,-1962877056,1541597983,-1864856381,-326412987,-2116514274,1442878188,308185943,2139103115,125110530,16777114,-1962531328,-16051586,898304116,17319158,870908788,712805123,118521475,1589910901,637194,1149945342,637602825,1962950531,-1946278910,-2014834082,-2094273537,1963528318,308185887,-1962896711,1944586822,-1958657537,1810369606,308186623,-1945477495,116067414,100826243,-1159134347,276726530,-2093845503,1963135102,23259395,34635395,-1070339979,1343387391,16777114,172264192,242532363]},{"sector":8,"data":[-1710590721,65535,-369473911,-605486865,41714433,-352160505,308186045,-1207958855,199753735,-3001345,-1705897354,197,-1710590721,212,-375159,-6679946,-16776961,-6679946,-1929379585,1586359886,678756338,-14256897,369172534,-11332015,-1073018787,1552643956,-148927732,271943,1183518324,-1669035538,-263812352,10388617,200427147,1175188550,-129627146,-1937025932,1859322012,-160508942,10390667,-738955565,1996486766,-227082478,-755969,1996486262,-25864,-1070399488,-15567105,-6620554,184549631,857109696,309788626,16554578,1996423168,-26094,1592328192,273074175,1996423170,27695634,-1070399488,10257545,10388617,1343387391,106138,-92864768,16777114,-6662400,855638271,288787913,1824427265,1444827391,-1705568687,65535,-6662378,1593835775,-1961730421,702775,-131608,261755510,-1962934271,45683294,571392,-369235480,1149960521,1958742794,77221937,1342177281,119194,308185856,855640761,-37164864,-1207958855,-1075314681,1405105149,29989456,1996423168,34052626,1996423168,28744210,1996423168,18323986,1996423168,-26104,-1924136960,1962929742,645201704,18888447,1996443926,108461832,-1995940353,1721433158,-1996488702,1552615510,-148927732,271943,1183518324,-1669035538,-263812352,10388617,637951684,187041675,187040327,187040839,1601504839,10257545,10388617,120730,-1916194048,-1929309898]},{"sector":9,"data":[1358916798,374429214,32283223,1461059584,127898,308185856,-402650439,-1070334702,1184518227,-16777214,1318720118,-1962934270,45683294,571392,-1946356248,-62485705,34635395,2089510261,642313002,1183385483,1200301810,-196703998,71797542,653674121,-1996077173,-1936983994,1859322012,-160508942,10390667,-738955565,1996486766,-227082478,-755969,1996486262,25336568,1183514624,-15143940,1962879092,276234022,-15960321,1996425846,108461832,1594383871,49120094,1562371467,969293,-269762509,1167120524,518818645,-1070344050,185097867,-1961397029,-1886699489,-1895104366,175374484,-16222465,-1610676618,-310181742,535137026,80366941,-1864856576,-326412987,1457032734,-4181161,1996426870,-6664180,184549631,994211008,1962938886,175570703,-1710721281,65535,762626059,16777114,47104,2139825013,-6662398,-486539009,-1948611048,105810928,2126831499,-1527514104,-26029,1183514624,-2090967290,-443874579,-900899553,-661913590,-1957345904,-661774612,1443163267,-2000669865,1996487494,209125134,64461392,-1073020928,104543348,326434834,33244870,-16091393,-325449610,184549379,-1961134912,66427640,309657600,126468147,-1711114241,65535,-26025,1988820992,1962281734,112729,940334788,58063686,101211844,1251627091,184549380,-1956940608,1354773496,-26026,1222836224,1358710409,263066,-1909071104,-1948808254,-1698679816,1134,394861685]},{"sector":10,"data":[1183567499,38242812,142001438,530904060,68852304,28311552,-91546901,-1694730497,1250,-1694730497,1148,75668055,-1070399488,-310157729,535137026,181030237,-1864856576,-326412987,1457032734,-1070334889,185366155,-1957333770,39619380,1041281,-620536460,-2146806133,1618217211,2131164032,-1961657266,-1898410754,449283008,16777114,314671872,179907051,50036736,146350452,142377728,991458563,-1005290287,62391934,-1070355712,1150004139,-1047811308,-997191189,-784660866,-779681155,-1962359165,1604645825,49120094,1562371467,576077,1443394699,309658,-1947671808,-1948610850,108971248,-1190504821,-784662518,-896859523,-201535189,868912036,1403712448,323738,172395264,1478409707,-1957345904,-661774612,-2095911805,1962938494,-339727612,105286490,-1995942261,1451881030,172395508,-1995680117,1451882054,239504376,-1946532215,1183387718,-1948742660,-297367289,16777114,-295793920,-14125057,1996433015,-18418,1392508858,-230257328,1602965526,408944426,-1695529335,65535,-2081405301,-443874579,-900899553,1478361100,-1957345904,-661774612,637951684,17334147,-14274187,1589906039,2013210122,-26110,1589903360,1200170506,106873858,175636262,638213828,-1710983169,65535,638213828,-16496759,1996426358,106873866,41418534,641204006,-2096865281,-443874579,-900899553,1835016,107872259,18153727,109576195,18219263,83362051,1114113,94437635]},{"sector":11,"data":[1179649,97059075,1245185,3997699,932446209,104595459,378798081,39190531,110428161,42402051,1376257,103153669,21233919,50003971,85852161,78512131,372047873,103350274,21233919,56229891,272433153,80216067,784596993,49479683,96796673,73597187,4521985,83755267,4653057,77529091,785711105,88932355,366542849,39714819,106692609,47841539,6356993,102039555,375521281,26148867,8061183,46465027,16580863,48300035,8192255,35848195,8257791,36241411,16646399,0,0,0,0,5,0,0,0,3932298,4980804,6029396,7077988,8388726,11206784,0,0,0,0,-65536,255,-1061158912,192,-2139095040,128,1077936128,64,0,0,1,0,0,-65536,255,0,0,5,-65536,255,65537,16842754,0,0,0,0,0,1140850688,1280332617,1711298881,1937010287,1835364096,7235938,1684957559,7567215,1819047278,1953656688,1852796416,101,0,0,0,0,0,0,0,0,0,0,0,0,0,1987208238,4607232,65535,18,131071,1329987587,777213006,5132102]},{"sector":12,"data":[327680,65538,0,0,0,-655359999,-538511672,-388175652,-154607642,154720496,388290800,538632166,655419612,655423176,538577208,388241188,154673178,-154654960,-388225264,-538566630,-655354076,-655357640,-655304464,-655304464,-655304464,655415536,655415536,655415536,655415536,655415536,655370000,655370000,655370000,-655350000,-655350000,-655350000,-655350000,1868965648,1768191086,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,537001984,536870914,4194306,260046914,65537,65537,186845474,52691749,19727649,36176171,69796138,34801190,4325376,11075584,53018629,65546,52756495,589904,4784213,15269978,13172831,6619296,2687141,36241578,2162863,35979504,8978677,6422778,255,256,16777217,16777216,16777473,16777473,0,1,16777472,16777217,16777217,16777217,16777217,16777216,257,256,968294401,981678723,968309379,965687690,968309379,965687690,968309379,981678474,14979,0,1966080,1769238101,1684368500,0,0,0,0,7106675,1702100992,1677750381,1667855973,1929409381,1819242352,1392538213,1819242352]},{"sector":13,"data":[1697542757,25976,1919251317,1886584832,1701605231,1769406578,2003788910,1869480051,1701052416,1701013878,1677721715,1667855973,29541,1953656688,1879048307,1937011311,0,0,0,0,-1,196609,16711956,164,279886,136446413,9895,1867781,5120,262144,0,524316,4197985,25166112,26739080,5670,262333,1187250176,42201088,4325376,-1997793659,-1997799104,398008149,386789744,216539371,413397360,295838151,427815280,126755612,450163056,20128674,458944880,53420984,460386672,343811064,464580976,203892056,487649648,33826357,502133104,17505816,17625392,565714476,565834032,214245480,214364464,104669507,104788272,183181749,183234864,98706048,98824496,523903727,524022064,50406651,50524464,92218679,92336432,152118683,152236336,58861118,58978608,405939843,406057264,98904096,99021104,152774792,152891696,38742307,38793520,127019348,127070512,18295256,18411824,54666848,122814801,-2147352572,1,703397888,1048609,32769,-2147221504,2,647954432,-261095421,705593345,648151040,-261095423,705789954,-2147155968,1,705822720,-265289722,32769,-2147090432,1,648216576,6291460,706248705,0,1163089156,82,524289,1507345,2424863,3211306,1498613248,1296389203]},{"sector":14,"data":[1497713416,1380011842,1330447684,121983829,1347635524,89735500,1314213715,1329792068,1258704205,1162760773,1145504588,50397513,-16549690,171953411,-855441408,29690431,171953411,16908702,53674243,209595,587399464,1428620117,55947779,335762698,1456866133,56435203,1510159522,846398258,53367043,-1862062481,780665646,51042307,268634775,188678922,56683011,-1056743184,1637090144,56718083,-66887391,1637352243,56744963,-1090297347,429523809,52073219,1124270642,218563342,51177475,-989650919,1657078556,56865795,-16642541,121621763,-855441012,13436479,-670891771,132449031,58854403,1241743908,67043872,475085,1070400256,50387207,842793729,57563907,-16496887,138398979,-855437141,273680447,138398979,-855436920,285280319,-117243629,940180279,54008323,1879258970,933102388,56900867,-1979489176,1689322340,56942083,1073964309,1701512037,57003011,-1560058278,1733952358,20302083,1070400511,16777230,924582657,-855376111,71503423,239062275,-855440017,3391,222285059,-855438863,79498559,222285059,-855440134,86969663,222285059,-855439839,113773887,222285059,-855439041,95096127,222285059,-855439899,57088575,440388867,-855441408,90901823,222285059,-855438981,146672959,2130903309,1292043107,53377027,-1140627557,582484770,52541955,-2147277505,599917346,52722691,-1241308630,318767393,871039745,53648643]},{"sector":15,"data":[-1375522176,617939750,56654083,1124283583,1463747415,56046339,604198703,1650066274,56763395,553869927,1649869666,56762627,-15441308,390057219,-855441408,5642047,390057219,-855441267,28841791,390057219,-855440946,45029183,390057219,-855440626,55777087,390057219,-855440450,64886591,390057219,-855440369,81336127,390057219,-855440312,1343,54512899,-855438737,179110719,54512899,-855439677,184419135,54512899,-855438599,150078271,117637377,67044708,386088909,1070400258,51083779,1375944653,1070400258,50688259,-402440243,50398981,1912832917,-2068315260,59068675,-805075578,-2029255802,-855376119,1599,104844547,-855441321,8980031,88067331,-855440829,40371519,88067331,-855439998,42796351,54512899,-855440774,45417279,1761804546,775684963,-855376127,2879,-1241317118,-2059730091,-855376127,17368639,1644364034,1679491917,-855376127,326304319,-1509752571,1656423266,52159235,1174622052,67043623,605503437,16778755,-2014248191,-855376112,16259135,406834435,-855441105,59316287,406834435,-855441003,43128895,406834435,-855439363,51517503,406834435,-855439325,138876991,406834435,-855439253,143398975,406834435,-855440840,67508287,406834435,-855439151,145561663,406834435,5439488,-1627193087,67045512,-1022410803,1070400258,50331669,2115256269,1070400256,51125768,-603373619,1070400257,51849730]},{"sector":16,"data":[-2078916659,1070400256,17278989,1912996609,-855376127,89720895,-754777847,630129541,52545539,-687660862,1464795991,56071171,1761829414,67043938,1544110029,1070400267,117600007,853869313,52609795,872618751,464257819,55949571,-15968982,54512899,-855635199,124128319,155176192,-855636666,50136895,390057216,-855637726,3135,155176192,-855636361,94701887,155176192,-855635709,148834623,205507840,-855635993,9964095,-2130706165,1473511479,5755648,-637510718,1473577047,3631616,-1929355538,1620181088,22095360,1070399743,50459906,1322123265,5432576,-16690498,54512896,17104896,6521856,-335534092,954269795,20500736,1070399743,34842626,772931585,21810176,1070399743,18207490,1384382465,-855572735,350290495,318767361,16712972,-1526579251,1070399508,389900,352600013,1070399498,318220,-2130100275,65801,-16707070,138398976,16976714,1262592,1946178059,16711994,654917581,66054,-335539306,16711996,587808717,66312,-1996482333,296550456,-855572735,110823743,268435721,291766296,1275648,-1744824818,224067597,1186304,838862534,16712205,-687259699,1070399488,50653961,996737025,3693312,-16704116,205507840,16911273,5941504,-16688475,205507840,16844574,19415040,1070399743,67108873,926351361,3111168,1828721848,16712219,-1106821171,1070399490,50459399,642711553,2529792]},{"sector":17,"data":[-16699610,88067328,16974659,3503872,352342908,16713740,822624205,1070399491,988162,218251213,1070399500,620803,-284409907,1070399506,443912,2046967757,1070399510,33934600,1167851521,21357824,1070399743,50458888,1275133953,638464,-16686893,155176192,16845151,21998592,1070399743,16912665,203227137,-855572735,15206975,-754974427,1380712541,5938432,-1610589541,1571881044,5548032,-1191159109,1519845466,799488,-1258267977,1520631898,806656,973081697,208797708,807168,-469759004,209911906,803328,687869001,1661861900,783616,-100637947,1661075467,6492416,134220782,201916515,6490880,16802580,16712204,-1744224307,1070399495,18055688,1841299457,-855572735,175638847,-1392508667,-2091253670,777984,151027462,16722028,789921741,1070399491,25,2131836877,1070399508,18,370294733,1070399490,16,1130445,1070399488,294417,2031108045,1070399493,971793,-384745523,1070399503,27,-1475264563,1070399516,31259,2131902413,1070399489,76818,17973197,1070399489,1130769,1393639373,1070399514,243984,-2028912691,1070399496,461585,2047885261,1070399491,106767,1309622221,1070399488,374287,1863270349,1070399489,50203,1947156429,1070399494,435471,2014265293,1070399495,67855,1261517,1070399488,459535,873480141,1070399492,1239569,2115059661]}],[{"sector":1,"data":[1070399495,331280,-1827586099,1070399499,33842970,1379663873,51127296,1070399743,530454,-1592377395,1070399507,17904150,146931713,-855572733,337513535,205507840,-855631459,497617983,1543504129,82,76044776,108432130,-1962639733,-2096776674,1946159743,112645,-1070923029,-385871709,1156972675,2071273523,360054539,-167486325,1969228359,776271372,-161778560,1965044548,-129594027,1150111766,-1588584930,1344144208,384306832,1958742885,1183667762,726669048,-397389632,1149899734,1019225139,-2096663488,101438,1283459700,1283459119,199951407,112726,1354771280,-2088305944,4158,1686111349,2088992558,125042690,1459778815,-1946198552,1962281780,-8984317,-2018711357,1183515394,55616262,1064579,-2096728832,1946158206,473858900,141885445,-1710852353,65535,185104011,1443329270,-402360577,1049362206,300614876,185365899,1443329270,-402360577,-947650806,964622,85733111,81528323,-529152197,104087171,-16092160,-16370634,-404224906,1072219134,-1593506681,1178141794,-1996260090,1688274502,71710980,1183384445,207522564,271796214,-1014290315,503324165,175570768,-1962379521,1174604358,1183535110,71697160,-401698736,1996448479,-2043680756,1387814379,-1957683709,503647302,-1873797632,1662183438,-397361109,-1679290773,-129593979,1996443670,142016266,51005067,-1957689786,1174603846,244338692,-10314008,1183648886,-397404424,1996457463,-2053249012]},{"sector":2,"data":[-15966581,55752759,112720,-17962928,-1014663704,59169000,108432129,96083595,1946974009,860157532,-396987376,-1202289346,-397410298,1183398825,1958743036,808910607,-26107,1183514624,87073788,-11125621,-402277834,-11106903,721795638,-1041739584,1150113413,-397402594,1686144391,-396894417,-397013561,266896679,62412421,15224832,1793639301,-15790458,244321910,190729960,721778112,52160960,-1995028853,1183575622,-364476140,622478987,4046848,-2096728768,1946160766,578224094,-400525569,1183385460,1958743016,-63011890,91488257,-351905090,-396457201,85084043,-397410240,-259305335,-1351289333,-1705983957,65535,-1962130295,1149888582,407276292,-1994762613,1418276932,-465123534,1149894656,635710003,1183383568,-907520276,1975520057,23062787,607339658,1967144128,241077050,539905920,-550280064,1077103744,70468854,1207305845,192152627,-2146541941,-2147208369,-1962658996,1200295518,-297402074,19416971,1187506758,-167771674,1975530308,540967723,58011653,-956232471,2116,-281844608,-1058781497,944031232,98214144,-939768183,58950,1443583,607339658,1971338432,-327253226,-955943680,536929350,-1996113247,1187511366,-1979710746,-1071369404,259375164,-13089594,-1996250463,1187511366,-1962933274,1141498950,910477106,2122514432,880082956,31882883,1586179700,474450920,1948141323,343408419,1998723,1200293748,-337998820,-396457207,-1961080949]},{"sector":3,"data":[1347558999,16777114,205949184,-1995684213,1183528004,977570058,-1947705717,1468730439,1011124494,-2093067127,1946216062,843380282,-1592364028,1178141794,-1996260078,1688277574,273037572,1183384445,507809040,1996443678,-361299986,65947275,-1957686714,1174661702,244338704,1449141992,1342210488,-1924087765,1343620678,186706920,1443722688,1342177720,-1914171760,-32773884,31882883,1586177141,41913102,125173515,-352159863,-2093118711,-109772739,80164233,1183514624,944015630,2122527467,376767206,949891,1996426100,411101198,-348633975,944031493,-2091515904,1946217598,-62485755,-626981909,-1070903291,-2093029296,15105667,1183657588,-1924131086,1344151108,-504885616,-2085071265,-1070903296,-230257328,1508397078,642026784,1183666206,-1873799438,1606608910,112726,1354771280,369510029,540731472,15105667,-1202314892,726663173,1149980864,675556140,-796143061,1284227115,642525994,1347600779,-2095049752,1946217598,860651583,-431584496,292864011,1946157373,146745,54341236,-348228608,862224419,343835631,-2096204796,1946293374,28857864,-118992896,1996445313,112660,2156624,468436619,164423766,1586231019,860354062,1458402320,-350768408,384325351,-1008604286,25359848,141986563,184974987,-385649153,-947191533,3997732,-1959823873,8332743,-134330743,1946190023,179979,-1996601718,720058692,1090406134,1317078388,-1962966786,1149828678,114488,1048777963]},{"sector":4,"data":[1946157502,33522445,-8190604,-1090292477,-947191806,1946157373,146724,54334836,-1961200640,860354271,-385649376,46071955,-2087458048,16782910,29295477,860157440,-385649648,-11140973,-402269642,-6651471,-2097151745,762643199,6569603,1443394816,1342178232,-2139022616,-1710214324,1746,158646283,1342177720,450458,-1801824768,-352321529,67076948,1048779637,1962934718,944031287,860651520,28857872,-6664192,-352321281,62412340,-722972672,860651648,1149916688,-11495368,244319350,-351878168,-1103199464,108265473,1181383,1465253889,-956299288,4614,-806829312,-1962802303,2123040374,244340484,190511592,-165251648,1963995972,860223008,1444574224,98187007,-1702822680,1535,271797376,28858198,-1410838528,-689388672,-1962734719,2123041398,140352008,-1073020928,28838260,1771720704,-2147483640,1458516836,1342177720,-2139077912,-1978649780,1183332421,108954620,-1977518848,1183332420,-166809362,100920942,1183384796,-396996372,1183416438,1996445418,-2138052372,1861619376,-603585540,-96040700,1541953360,-263812736,384976525,507874640,244338718,1465731048,-386238721,1183481957,944015612,-92864682,-386894081,2122547320,779419654,-1971315736,1166601798,1150113592,-397402594,2117697583,1460106730,1458337535,-11073557,1996483702,-2142574358,2143414359,-396945685,-1705572827,65535,-62485930,-1159180136,2145052799,29244985,914949237,-1923743298]},{"sector":5,"data":[1343681094,1451223784,1451212008,1342177720,-2088795160,1962935934,28858120,1978159104,1376175999,-1023410176,8439016,-1172403456,172460805,-2135430973,1988821251,244340230,190357480,721778112,9759168,16402119,-1930930688,860129792,-2143502300,-397015435,1676347398,607339658,1967144128,233330182,-950736107,129606,6567481,-1202321291,-397393917,1157005051,863244339,540230902,1486491509,1442840584,1342177720,-343970072,-6662618,-1711275777,65535,16777114,1958742784,1354771218,16777114,1443425024,98187007,1451178216,-1873756117,4384782,16416387,251594612,468189206,112651,2143873219,512426241,1200293306,-28931828,494190603,-1946263925,1194918982,1392932152,820514448,-27358209,1183385483,1975520254,-622279709,-1962800257,1686112374,-396955853,-396984688,-397014932,909713155,108331098,5899975,909705216,91553830,16777114,1177958656,-955878137,476678,-30000896,-955878139,392710,1354771200,1291446358,2122516203,494146284,-1928563457,1343679046,1354771286,1358954424,1342177720,-1108865392,1975520085,108954589,1443722496,1342177976,1347469355,466282576,8566870,1354771280,-1108848560,674642203,-955878144,10246,41714432,-16223232,-6684044,-1979711233,-1071369404,477380668,3439747,1962870900,160471604,2088960000,141819922,-1710066433,65535,2110449750,1080451,1962870900,-26096,1153826816,-397017031,1153892826]},{"sector":6,"data":[-2130706428,1946573566,2028492292,-555170999,-1962868098,213386870,1256738816,-1980200119,-16053636,1689782644,172329216,-1962654327,2011743175,-16645506,1996424822,-26108,-259325952,359986699,1326731,91553547,1963226425,-339244284,-348288250,-1010816017,8293608,138840836,1946830347,209095545,-401698730,1853118060,184974475,-1206159873,-397410289,-1073002276,1149852788,-17265914,898302789,1223,1174285291,-1003123965,1625819206,-1959562240,1074039605,-1073496061,1308508224,1460603907,1220143184,-1962719746,1958742837,175570718,-1710721281,65535,-16479408,21948420,28837007,106859264,-33399671,-389872819,50363909,-401973621,276037912,-402241852,1149960203,855798786,55443136,197364931,101676251,166632016,-1073020928,20776053,210486016,65750598,990168707,-1007034364,8242408,173968131,1946212328,105301081,1962920680,55442951,1256964147,-6671105,-16776961,495649396,268371851,1308496245,686315267,175541064,1149878323,-1926829306,898303060,-2029996056,82574550,-96171603,-126488005,-360508117,55442948,1034881,-387427753,-1933354937,1430622424,-1910575989,15499736,173968129,1946183656,1359776552,-1929096053,-65890,1393953398,1393971794,1342243000,16777114,106888960,80118617,1308548578,49120003,1562371467,445005,8180200,73304833,1946167272,-1928557788,1065419356,292716544,-2130690175,1397820279,1342326667,1531414248]},{"sector":7,"data":[79922009,1308550370,-1873558781,1423108110,2139819892,1962871558,54918664,-16042613,871773123,-523123776,-268181295,12797510,454233095,555026944,1195062319,1967283024,1852798068,1768178944,1951596660,1667855457,1936280576,2020557428,1919111936,1114401903,805335649,1397310464,1497451600,1296387840,5130562,707668572,1129864192,607012680,1392518180,1163154265,1769406541,2003788910,1868759155,1936879468,1852794368,1493201780,1920287488,1114795891,1802398060,1702125906,1635209984,1970228592,1967285619,1852798068,1866727539,1701601909,1667853379,1701860203,1392534629,1819243107,1918984812,1667318272,1869768555,6581877,1769235265,1767138678,6646900,1667329609,1702259060,1819568468,1699545189,1459647854,1868852841,1767309431,2003788910,1835102790,1699545189,1700033902,1459647608,1868852841,2019906679,1767112820,1415933044,7632997,8107240,108432129,309655051,-1070381834,1156975733,108273715,-26026,-389873664,16808853,-167348597,1975530308,860157446,-1978698720,-1071369404,225804348,271795446,727058292,-1930932032,1793639290,-1962737541,2123041398,-396929528,1048803865,1962934296,1996445195,-26106,116064256,-26026,-389873664,33585985,1443395211,1342183608,1342177720,1347469355,-890761584,862224407,862224607,62412527,-1628942336,860651641,862224400,105286367,1446528136,-1022989848,8062184,141986562,1304662,108461910,16777114,108954368]},{"sector":8,"data":[-402426624,-389872142,16808610,1443133067,1342183608,1347469355,-401698736,1156978545,108380211,540232832,1686115307,-1202262221,726663177,1347440832,1390939792,-1103742697,-2096139007,4670,-1202321291,-397410300,-1202292447,-397410303,-396986087,-397016268,-389872118,16808585,1443264139,1911033488,1975520082,-339727594,860157465,-151620592,1965044548,-1561831696,200313614,-1192593930,-389873663,33847897,-1962379637,-1873410434,1379854350,91602955,-1159086037,860157440,-1207602160,48955393,1183432747,860130042,-2143502300,-2098658444,1962871552,112645,-1070923029,1962559035,1962871646,98214171,-1577564535,1183385018,83854332,-1202316684,-397410303,283867275,-1996113247,-626919354,-62486267,12249174,540232832,-281844608,141885195,271797376,-550280064,-126419114,1450761448,737965823,-169324352,1962871672,870864435,187558656,959018495,1962959926,62412323,954749056,-1978012808,-1071369404,125124668,-1796712618,1443490576,112727,-162469808,-1007008117,7946728,74877697,271797376,1064579,-1962314752,1207305308,108298250,16640086,1153893867,1442840596,1342179768,1342177720,1347469355,-286781808,-1410836971,73173764,-2146809866,-1142422667,317216375,73173880,-2146809866,-941096075,-404176009,-1962867848,-397015946,1552678457,172460548,-125049814,8447873,-1947728523,1443162999,192400360,-1593149953,1183383568,1975520254,1962890762,18343956,1459504777]},{"sector":9,"data":[-1962920216,-62486268,-1170800810,2012211205,108330763,16678531,1996427380,507809276,-25755824,-386869528,909735774,141885540,-2147239850,2001332304,2020665539,1988821249,-1172403452,209685253,2105743851,225706004,-1709935105,498,1328583,1962818304,188582662,-1008503297,7881192,74877697,271795446,-11138443,-402269642,82540417,-12654506,2015684803,1988821254,574917380,-1994505173,1150022726,541338404,-1946401143,119873092,-28931840,-1988686104,-13896122,-28931248,1358185987,-1694730497,65535,-15992693,922698612,-1705573454,4277,200820361,-13470528,-16534986,-1070858634,-193527984,-231681,1962931830,544538398,-1174396744,1347551436,16777114,-1305018624,-126419197,16777114,343705856,-386500865,-389843240,33716118,-2096728437,1946158206,-1305018605,74907395,1126810,-28931840,91602955,-352321096,1987962968,-1705510773,65535,1541953111,1962891126,544538398,723666059,-1957683644,1143678020,922701856,1149961138,468254,1354771280,-1174396744,1347551436,1091994,-1305018624,-25755901,1080474,-6662400,1459618047,729177064,401130432,-1962868617,909706358,141885538,-1873756117,490334222,76428857,244319605,-1015869464,41367784,175540995,-1962508661,81351,1586174325,206015240,-1946401143,-15991682,92998004,201082505,200308160,-1962380033,-1996191483,-1962153163,1200293982,-1996191476,1586170999,172490504,1995434179]},{"sector":10,"data":[1988821506,108956424,-351484029,1949645062,188582662,200701439,-1962248961,-1962571516,1342113374,-2081897718,-1962803082,-1202321802,-11534331,1149961334,675556140,-796143061,1284227115,642525994,1347600779,1055395472,-1696021741,-1962737546,1178143302,1342665736,-402229505,28901312,-2098674944,-1962801034,1207306334,208977971,607340426,1954561216,17819907,50757251,28837234,721611520,-129594944,2122577451,57999878,-2097150786,1963198078,245251,16285315,512427636,82511322,96083595,-385056885,92995763,-1946401143,1183397957,-96040458,443858955,1586171883,947880950,-1961921536,1183397959,-161575946,-1070381066,1569450101,172488196,964392196,1987315838,16416387,-167050123,-167042443,28837237,721611520,139365312,972048009,91617870,-352321096,1002449666,1249243206,16154243,-167050123,2122519925,259326982,-151626101,1948267335,860354054,-2094304248,1946220670,793114118,-2095090624,1962997886,860222982,1460892688,1342183608,737703679,1996443840,-401698810,2123043361,1962871804,-12130045,393541131,-1157627976,1347616767,721966731,1388743616,1354771280,-1016131864,7690472,175540995,271533302,1183521909,138808070,1150095476,-11526634,1996425334,-401698810,1283477792,1283461167,1283461166,-389865425,33781029,1586230827,209685256,2117667307,-1962380282,188582903,-1946978817,115917766,-1593835403,1386414164,1354771200,-1023037208,7647720,373195520]},{"sector":11,"data":[1232404736,100548227,722367744,-1202696000,-397410303,-22849362,-29457659,678690821,100546303,266866320,1648264185,410320896,100546303,1342179000,1342177720,-11485141,-1878655434,289925134,-351928671,-1010816254,7625192,74877697,-352160629,862224394,-337094945,187993087,-1007520266,7618024,74877697,-352160629,367547918,860651773,-404204000,187993087,-1007782410,108273128,209095429,762705419,-1988944152,-1202654138,1344144710,62797567,16777114,-193528064,-1200408600,726663175,28856512,244338688,-352030488,-1946211518,1175128134,-1927056374,1343682630,-16091393,1150093430,-1873797602,1356326926,527745035,385369741,104851536,1465317515,-16353537,2112357494,1962871666,-593864954,-1023410156,74704104,209095428,1443528331,184623848,-385649216,-16056038,2088969333,141951246,-1710328577,5496,411383,-385649536,1153892512,-2147483378,-369414300,2088960153,175440142,411383,-385649280,2088960137,225771790,505300109,97249360,-351386487,243041048,722629888,1347440832,-26032,1149829120,795115534,242548731,1460565247,411383,-1207601792,65732610,1342178488,1404058,1183401984,1958743034,507809063,-2098704354,-129595131,-15829761,-1202712972,-1706033151,6027,-96040632,-1694992641,5510,16416387,1962872181,380279310,1153892352,-2097151986,1946159230,793542660,105313796,-2096466942,1946160764,793542660,243041032,-955878400]},{"sector":12,"data":[17124870,105313792,-164793343,1946420806,860157446,-148802302,-2147482042,1317012597,1955267334,1443752706,142016343,-402229505,881553736,-277481973,1920002243,1988821248,860157444,-166431728,1948267332,73173769,1474435,28837237,721611520,-1897348160,-1962863246,1156974198,58003502,-2147356439,1458515556,1450261480,1342183096,-1993907992,1686173254,1183706927,-1924131102,1344153156,1172835984,507809102,1150111774,-1873797610,1312221198,1354771286,-1959994648,1284236870,642525994,735465097,-498717759,-1948760439,1284237382,676080428,737824393,-465163327,-1948236151,1183384644,-153580580,1946290759,-662797562,-1961921280,1207360606,359923978,14712451,1996427124,393452278,-397017088,854159557,381179393,-756527104,-565802714,-1989105944,-11478458,1704648310,-1962934249,1143726662,-62486234,736380555,1183393860,-364474888,1150111766,-1873797594,1301997582,384452237,-59310256,-1862764801,1310058510,384452237,-364475056,1183666198,-1873799454,1314383886,384452237,-364475056,1186484246,-1873797627,1313073166,-1948616961,1177283142,1183535356,-129618964,-297366704,1357530667,737166987,-11473850,1996479094,-327745558,-1174396744,1347551436,1123738,-629735680,68826879,16777114,-629735680,-9425944,-929374602,-1929379817,1343676998,-1962712856,1996445688,28858358,-1231400960,1459617815,723928203,-1957633466,1177233476,-6663964,-1929379585,1344153156,-1996278552,1347482694]},{"sector":13,"data":[309335,403020368,-11141120,28898422,-397389824,-1705545884,6096,-1695254785,6104,-1695123713,6155,1354771286,1342177720,-160456984,1975530308,507809058,-353873890,-488702,-16437194,1459957814,1342178488,16777114,77223680,-1023410160,7376104,108461825,1342177720,-1023409688,7354856,108432130,1865869398,271533302,1686115188,1150152495,-1924129250,1344149060,1172835984,778338380,860130031,1077723172,727058292,-588754752,75399978,1443656704,-1202667477,1347420161,1450098664,1342177720,1863444560,294531,1955272309,1443752706,-1202667477,-397410303,881553147,-277481973,1875437763,1988821248,62412292,-1070903296,676629328,1378239627,-401698736,961940625,1963048502,178181,-1070923029,-115939248,1872292035,1988821761,140413702,-351502453,1962818317,1996445447,-12261372,-16040565,-389812363,50556857,17450742,-13951372,81540747,-2091512341,1996426950,108461832,-1946173720,104548295,-360970980,34227958,922684788,1996424098,108461832,-151018776,1946421830,-1170800883,142016261,-402229505,-389808241,33582886,-2096728437,1946158206,860651526,-2147161328,1458516836,1450054632,-397361109,-389845520,17067778,-2096859509,340030,922683764,798623024,-1929379814,1343682630,503662264,1962281808,642026757,1186464747,-1873797627,1272965134,385369741,452631120,815988736,48808709,-1962735761,-1873409418,1189799950,91602955,-504774613]},{"sector":14,"data":[793048576,-2146667512,1459040100,1347469355,-999439640,-953809314,3655,-401698730,-125100505,637951684,2088976265,91488526,-352321096,-994039038,-1993996706,-1073017785,-1705557644,4336,949379,727125621,1347440832,-26032,669712384,1460565247,16777114,1962889216,112654,357145168,-11075584,-879096204,-16777194,-1281749388,-956301292,3652,105286487,84432523,1347551236,16777114,-1909049088,-1961528060,1207305308,108355594,-26025,-1873346560,1795549198,637951684,149447,793048576,1444508676,-401698729,-1073020685,28837237,721611520,106874048,38242598,-80780160,-389822581,50490889,1443526283,-236450160,1958742853,106873913,960465702,1963232822,73173785,1611286518,-1202255243,-1705967617,65535,-401698729,1589930708,2139301382,108265484,288856663,-396951552,-389845828,33844602,385369741,108461904,-1878755585,1234626574,385369741,-26032,-389873664,67464605,818819,1183516277,205949194,-1928694017,1343682118,82316944,209125190,-16091393,1996425334,-163148538,244338710,-1023409688,91056360,176063238,-14912760,431493238,1996443648,173443852,1183563819,-1873784306,166193166,-16103799,1996426358,108461832,-1878362369,1257170958,1831856323,-1902050814,138819844,1996425333,-401698810,1996450279,1357832,108461904,1347469355,-1427632496,-62486263,956599969,141887558,-1878624513,1777788942,-1006877045,40693992]},{"sector":15,"data":[173968131,-1992800373,1207368774,158629939,91602955,1183433611,-59310084,1342183864,-1962379521,-1070922154,1376405131,-401698736,-389871267,67267769,-1878231297,1151526926,58048523,-2097107479,1962937470,12708099,425603,1586187380,793245196,-2143456248,1408708455,1347469355,-1955894552,2139294814,678822158,637911947,-397402624,1183448753,207522812,-15828993,-1202712969,-1706033151,6686,-1694730497,6507,-401836289,1586178329,243237644,-2091355135,1946160767,242745155,-16091393,-6682506,-16776961,1996425846,175570696,-1962379521,637865030,-1873797632,1222895630,-16091393,1586169974,642222860,-1957635849,-654890937,-401698736,501958771,-16091393,244320374,726120936,-15602752,1996426358,142016266,1625820816,112708,1809311939,1988821248,860157446,-1962576704,48969796,-389824469,16804734,-1979418997,-1071369404,91570236,-348633973,-1010816254,7038440,74877697,1955267563,860129848,1077723172,-963906444,1800202435,1988821248,862224388,163075807,28856320,-1070903296,-370651056,1256740359,736674666,-1962868117,2089485430,163075640,-1070903296,-397389744,-397015092,1183383745,1958743036,-1948742904,-351827708,-1996190971,-397016507,-1073020110,1173759348,108331571,70468854,-396948620,727149036,-907521856,1150113641,-1202708962,1347420161,-1007242776,7016680,141986563,-2096726389,1946159742,173968237,17727363,2013203062,-1705552370,6047]},{"sector":16,"data":[-1962254709,1273692743,84559499,1344143390,244340566,-1958261016,637864518,1448091136,-401698729,1996441407,-396929526,-963942047,443860747,-1207273729,726663171,1586188480,676825866,1378240395,-401698736,1586169665,-1995994358,-1073018298,-389829003,16935502,-1962647925,1972058239,1978874626,-339727603,956599055,108266566,-167037813,-963906699,1781065923,1988822536,947686158,52839819,1183386694,138806262,-1946532215,1174612037,-129595126,-1996077565,-396886970,2122541316,57999364,1442879209,184691176,-385649216,1187446923,1442840816,1342177976,-1994452760,-1070858682,-87037872,-163148458,283660310,-1192733079,244340328,-1994821656,-1072958394,2122516084,292880638,-260636841,1342177720,1342178232,-345476120,-28931293,1357923977,-193527984,1708442,79187968,1083854848,184549404,1037139136,-864092159,-386631937,2122541240,141820158,-1694599425,8011,1354771287,1449676776,-335964440,507809050,1183666206,-1873799434,1165944846,1753475158,1354771286,-1016582168,74007016,74877697,-401698730,-125043297,-18880426,201082505,1466528960,1459233000,1342183096,-1994501912,-1072955834,922685300,1218053424,-1962934244,816053830,1150113285,-397402594,1686136899,1586224943,-1996190724,38112007,1971913865,860157442,1445295120,401084048,1975520066,860157467,1460761604,1449646056,1466416872,-397361109,82536368,1742465110,1757210819,1988821505,860157446,-1207602160,48955393]},{"sector":17,"data":[1178320939,-2090765308,1946289278,862224475,75400175,-2147191808,-1961872564,-16041860,1173767796,1081417779,271795702,-397002124,2122540928,108331268,1737222230,-1923674389,1344151108,1342177720,-197072816,1354771286,-161004568,1946301253,1441289995,-1070901401,1731389520,-126228394,1753475267,1988821248,244340230,188771304,-1977715520,-1071369404,108347452,-18814890,1149898731,1019225139,1443263872,2078805648,1390986209,-1962540952,-1873407882,1077602318,930398219,607339658,1967144128,1996445205,209125134,-16091393,1996425334,-38148090,1149901291,1019225139,1443919232,-15829249,1996426358,142016266,-1008695320,6800872,74877697,1149902059,1019225139,-166234816,1947218756,860157446,721712160,-1962218560,-167036812,28893301,-661863680,-1957345904,-661774612,1024214667,1098186784,-1559869813,-1557266348,512449963,1195050548,773027084,1571624587,125157947,-1960394098,-1996488682,1347423319,-397361101,-6671097,-16776961,-6682506,-402652929,-1763099336,1064192,1183578229,5546758,1571529518,-661780706,244039731,149094428,1232528201,283837155,1376684838,644670208,5508667,1642816884,-1057075194,-26032,-1070399488,-26032,-1962475520,1358968334,1359349987,16777114,251594496,512426012,-11337698,-16768970,-16768458,-16767434,-2097142730,-6669629,-402652929,109969598,-14286822,-1207958986,-1705967617,8526,1359405913,16777114,-2097041408,-443874579]}],[{"sector":1,"data":[-900899553,28377098,-919400725,-2093556597,1979649151,79227139,1167120524,518818645,1183570062,165892110,170138,-339135744,-1873784818,1051060238,-399215528,1348011267,922693200,-13739349,777693494,1400780543,2083979054,142016339,-16353537,1996425846,-2065149684,238770492,57999484,-2097119581,-443874579,-900899553,-661913590,-1957345904,-661774612,-1962387829,512624198,199753812,49120000,1562371467,313933,1851011,-1559530238,378077220,251592742,-1899823076,1048782528,1946288156,2080783120,638612736,989862049,1962966534,2080818950,-1023410176,1167120524,518818645,110024846,-1943142316,861777670,104345280,326458794,939931942,638350592,919238,1452953601,-2097151967,-443874579,-884122337,132892979,28400216,-1940893103,1430622424,-1910575989,-11053352,244321398,1966978792,11987203,2122578315,57999368,-1593291009,-259325868,872378600,-1432211776,650546781,1442855075,-15698177,1996426870,175570700,-16222465,-401734026,-1073005604,1996446069,175570700,-402098433,-1073019284,-1964455563,-6664192,1476395263,956331496,1946504710,1030162,1946181864,209125130,185725928,-1197181504,1323827475,-16092160,166202486,1975520051,1962871698,5236785,401083984,1005082879,780200704,648560259,1343058944,-15698177,-13758858,1478927902,175439627,638475972,889341835,1583284242,-1962742397,1297948645,-1962930998,1451952718,56879368,560306768,1451819008]},{"sector":2,"data":[-16192752,-6680458,-1912602369,916661958,-661863680,-1957345904,-661774612,2126796630,650130182,-2130555509,1946222841,33128725,-2129693695,1946223865,100237577,-352095231,642879614,637826559,503870975,1342210744,372703006,898311684,620950504,101384208,-1706033102,65535,1952038923,138841680,2030109370,-2133264635,-511639102,-1073020924,-1960439180,-478084515,-75366405,74711296,-269951,-930361077,68558475,1448235347,-952631470,-1912602617,-14284730,-14284683,-401734027,1499135316,-498908325,1593946335,49120094,1562371467,313933,1167120524,518818645,-980232050,126551646,-2130554997,1946227705,419004682,184841217,1345025216,74973009,-16222209,-108984713,108265752,18086273,1334513013,105843464,1610548596,-1912083706,-401697854,-310181805,535137026,80366941,-1864856576,-326412987,-1948742114,-1873605026,1001056270,-11330188,1996426358,142016266,-1962510593,1183398471,-1928915442,-2019946914,-2097151967,-443874579,-900899553,240648206,920423248,504127371,1048784391,1946166956,-594849006,1342620547,777197062,648683263,-2091165689,65682115,-1946157019,-594833192,207588150,1979710339,-372536571,-1064435410,1602954835,1960512260,2139170312,1951092226,-1715457276,-1960420413,637555726,1946963771,1048784552,1946166956,-594849006,1342620547,777197062,648683263,-396666873,83911437,5521035,-1911660917,480316511,1958742784,1946303499,590060039,-286588928]},{"sector":3,"data":[-1559345525,1183514654,2138892,-1559607669,1183514658,2401030,-1559738741,922681382,-1909587954,643291142,8140543,2117533478,440305408,62412544,470189824,922701824,-4718590,-1667608321,-16777183,-1711275466,65535,2468506,473858816,-193658624,-28262349,-140881728,-1895825371,-1895818234,771758598,1473775246,2114359078,110044672,190316668,-2096073536,3646,922683765,10092546,-1593835482,378208292,-389873626,50356813,-16359797,-13235594,-13236617,-13237129,-13237641,142508855,235304192,-335853592,-957870588,-1023299330,65535,6429928,106859781,2117533486,922693158,1397827196,1944587920,50011,0,0,0,0,-286785536,855834721,1586207168,-294134,109971829,-1014824876,-2096108749,611517947,-620504317,647676801,1183516430,139889414,126297850,39290662,1977289723,113716743,88017,1419875267,33260288,1200292726,-1957444852,126551132,1515963227,995317849,990607306,990868161,202078146,-1036270847,-1053034126,-1070336649,1532582595,-486428590,1959475990,33129234,-620034187,-1070397068,240341443,188510696,-1909537856,861776646,1048782528,1963065372,-876544510,39911912,1781959427,1979058944,108461922,-1207404801,-397408710,-259315576,1023818913,292880382,678739979,1946157373,1711720231,-352321280,71732026,1946288445,33832202,121439604,-1207339774,-1873805296,1004005390,468448811,6686407]},{"sector":4,"data":[1552613376,407341828,201213577,1342731456,101201663,-1990204952,184572982,-16026122,-16381898,-402257866,-963944498,1618798787,1554055424,71710976,113707381,92,-1019891480,39889128,141986562,-401698730,882981003,1778792710,-2096335616,130110,244319605,188470760,-2096466442,27198,2129134452,1745274677,-1996488704,184576566,-1962511114,1755515972,105286400,-1023383901,241196264,376867593,621954699,1183383553,306613242,-1996488155,1183578182,271634,1457800841,-401312001,2122538849,125042936,1342177720,-2090906136,1946215550,1996445203,175570700,-16222465,1593771638,16050446,209125206,-16091393,1996425334,240582406,-2097094167,1946220670,-431583929,-1070903274,33601616,34191440,112720,-401698736,-1072956938,2122530933,494141690,384190093,1354771280,1342243000,1342244792,1342177720,-739766640,1975520249,-401698787,-1175717486,384190093,1354771280,244338768,200916456,-385649216,2123038855,318735336,1983479668,-1962248730,-754404921,1946303720,16744716,-2126808063,2130774015,-394854603,-1149185,244378742,-1996170264,2122573894,242483428,1996443734,-294191126,-370379009,-11075780,1996482678,-294191126,-370379009,1996488511,17086696,17283152,-40179632,343261195,384190093,-401698736,1183709768,-1873799450,-84350962,6960697,384369525,-873937921,-1929178274,1343679046,-16353537,1256719478,1975520047,-373282043,1183515702,-163149334]},{"sector":5,"data":[1912668221,16858389,-706149513,17054978,87885938,-385648895,2122384072,1963065590,-330921202,-1947842935,1183444550,-1911297048,637737478,643475873,1521161867,-1981397367,1996482646,-428408856,-387287297,-259261094,662042123,52037262,-1947842933,-1557731242,-1993975127,-1923437802,1343679046,-953192984,31750,112640,1443083753,5912319,201126632,-2067264,-1075311500,1958742837,-360808183,-814415360,1962916587,899409932,259375115,8390343,113704960,124,-1895873815,-1962731002,1452009030,-1448925464,378087002,1183537835,33635830,71110004,1023964162,57934343,-1962895127,1207305308,175441930,6700675,-385649663,1218510981,1242991367,-229230329,91371383,2012235321,-1204405968,-1205177085,1344144338,-1542401,244377206,188356584,-1592363840,1178141614,-2096204298,721614406,122332096,-351844189,-163148990,-1962692957,1452011590,1577452530,13796096,-1996011357,-1996010986,-1207715786,1344144338,770066059,-1957691388,1212737606,-431584432,1342178309,1088964235,244338752,-1590093080,-1073020826,20790132,1024226304,829685762,1946157885,-2130056390,-23005626,104611467,-624897,1996424822,-71899132,58048523,1459551721,-402098433,-1072956473,-269935499,642026494,-1947843031,1177102404,-1949176856,1177099844,541363174,1183707371,-397404438,1183526406,33635818,71109236,1023767554,1031078407,6700675,1446411522,-1980673560,-661915578,1077037046,-2091899020]},{"sector":6,"data":[26174,163054965,-1207702784,-397410303,-1072997521,-588709003,-128021507,137578486,-169278604,-159481347,946995712,1048641323,2097152131,114435,8666752,-2130412288,-2147482929,34366,-813628291,1048576016,2097152146,80707844,-1824620544,75300864,577409,184571553,1946179590,-63012005,1416953857,14829255,-497120512,5685120,-1908640768,637737990,1473591039,52037262,-1422459098,922691162,1996446377,-260636686,-1542401,-1202198922,-336134141,1342308869,6960895,-1959644440,-2017009058,-16777130,2122572358,-1317272606,-159973546,-394854569,-1673473,1996485238,22407408,-385843549,1183514003,-1947981076,-1811482888,91521024,-350224200,734014210,-565802542,-153069943,-2147450235,12060020,721611584,-1982714944,1451874886,-163121444,-1207602175,48988160,-768884693,-1948629493,1317723222,200092397,-565834815,-1948232181,-1950340144,1183444550,-27883012,33308291,-1910803200,637738502,648298115,1460630528,-14266286,187081246,-385649472,915143937,-167051166,1048781941,1962934372,-51386109,6567563,-1191807233,-1202716416,-397410045,-1072956980,1182991476,1149961462,-465139444,1513553750,-103421952,58048523,-212759,-1612127114,1958742834,-55318269,-387680513,-1073007999,-471268491,1996445436,-106043384,58048523,-1912810007,1343679046,1445725672,1475770111,-100609,1996487798,-260636686,-1560262936,882966654,1543911686,-385649664,-8127365,-385649648]},{"sector":7,"data":[1048837235,1946158248,-60167933,-624897,1996488310,-401698564,3997768,-385647359,20839507,-385647103,-957809589,-62527185,1517873347,1988822784,1412890384,436637184,922691075,-14263637,-10835658,1996424822,175570692,-16222465,1996426358,-1998039538,-1964457168,-16580518,79170166,129519617,-504868863,1958743032,138868495,141893632,755648139,65732612,-1022736757,5923048,106859265,-472783919,64915339,65050507,1514924227,2122514688,91488262,-351910261,32815107,1342202019,-1557627928,-389873570,23085,-1023385439,5907688,106859009,-2020933846,-1013448574,5903592,6463744,1510729923,1988821250,244340230,187821800,1443656950,484970128,1975520052,-1946801406,989880894,191657214,1460630783,1342179512,1354771286,-401698736,-166988171,-397006732,1448144418,-2091361560,25150,1043929204,309592162,6436607,1342179512,1354771286,-401698736,915011145,-167051166,-1202313868,1464860679,1347469355,854068880,708740086,259260422,17414230,1354771280,244338768,-1946805016,1994965959,-1962736295,1149962870,105265420,1187450485,-1962933768,-768931770,283900043,957105291,695535686,16271047,108956416,823912535,-1980086647,-1202258858,-11534308,1589966966,1354771450,41418534,-890761584,112885,1495525571,1988821509,1979058952,105301765,1183522819,-2147277562,1954546493,105286433,1027605285,376717315,621168267,54337539,-1962183648,52758086]},{"sector":8,"data":[268647696,1183534965,1073947910,1950352189,-1103199445,611581953,621168267,54362115,956724608,1946271286,-1103692013,36628481,141934603,-1560166751,267061062,621168267,54333443,-1989315312,-1962457546,-955824586,476678,1681275136,-385649408,113705468,954,6569603,-385649408,1183449346,1006969862,-385649403,922681556,-2034761628,-1070903296,860129872,539354154,-1949160704,-1950340144,-1873784122,-185341938,57983499,-1979667479,52692550,58000188,721461225,27912640,607339658,1971338432,947191568,184654824,-1962510912,1793669188,1178009599,25880583,58048523,1459581161,-1996390424,-1072957882,1183518325,537076998,1965032253,-11278077,16154243,1149901941,635710003,1183383560,105286648,1025508133,141828099,137579648,-164953365,1354771286,621168267,54345731,-1207602112,48955393,-397361109,1185102738,-125926649,-385649664,2122579725,57934070,-2130770711,-369675420,922746621,112722020,-1070903296,860129872,539354154,-1949160704,-1950340144,-1873784122,-199235570,-1560255327,914949958,1048772708,1946157086,1513523460,105313792,-1962380031,1654851142,722004736,244338880,201148136,-385649162,1149894809,1019225139,1443263872,-1192751472,-63011858,712310785,956329121,578030660,-1157627976,1347616767,722224267,1813941202,-1949750528,-1873784109,1350625294,-1559477109,1183449196,1006969862,1445032965,1342211768,1342177720,708002954,2106852,-796143061]},{"sector":9,"data":[1185005611,-1873784313,-209459186,440406,105286224,154929444,45614453,-1207702784,-1974468607,-466996412,721428517,735087570,122069440,244338770,972248296,1962959926,-1170308340,91553795,-352321096,-1983894782,113769542,66490,28836843,1273545472,-2097086378,1946158206,74907419,-1528295792,1958742832,73304847,271796214,1207305844,91490355,-352321096,-1010816254,39215336,108461825,1239944848,1681296174,108461824,1342177720,-1957373208,1122550726,-1593769386,1183383658,108462076,1342177976,-1957339928,-389809082,22057,1347469355,-1017819928,55975144,1412890368,770172928,-1980086647,1589967958,2013210362,611837968,1442834627,922681347,-890765228,-96040659,-990095735,-1960379810,-1960438713,-389867945,16995809,5519103,-1993495320,1451883078,-94452484,679445286,638416128,19417031,105286400,709331238,1438116035,1996423936,1554442,108461904,1347469355,-1108865392,112878,1436281027,1048772868,1946157166,1354771243,104078987,-1710458881,65535,104078987,-401836033,1183395149,-61437446,16777114,-94452736,38242598,-1694599425,9143,-1202667477,1343103170,16777114,108461824,-1728052808,1840795730,863025715,1973047378,-16777165,62391926,1347590400,-1157627976,1347616767,16777114,540967680,494743301,1342193848,1343226040,16777114,-129595136,158646283,16777114,1975520000,-18409,1392508858,571472,-1873784167,1314711566]},{"sector":10,"data":[921419819,7224963,-1207077632,-1873805304,705685518,-713768949,16285315,1996425332,-25864,1996423168,-25858,1223163904,1845937968,-1207959552,-389873663,33576113,-16222465,2090468982,-1023410166,55877864,141986562,-401698730,1149906056,635710003,1183383560,108954620,-164793088,1963471684,112645,-1070923029,-396953461,-1873349713,1327949838,6436409,-1070921611,-401698736,1283521103,267061299,708002954,-2114417692,-2147481369,200749924,1443984639,1342180024,721843967,-1873784640,-254547954,-1006877045,5516520,142016258,-402229505,109979848,-1591344352,-1960420699,-1906661610,637739526,643475875,1521161865,6031047,48758784,-85408983,-1912471469,637740038,643474849,1520899723,637951684,-1993996407,-389873065,16995293,1443264139,-974647664,239373099,1459242633,-2097137944,1946221182,-59340497,2088968427,443809806,36914422,-1957290379,503708742,-1202708992,-1202716671,-397377536,-396959942,-259266603,-696912373,1397549251,1988821248,243041028,1443853312,1342181304,1347469355,-401698736,1955328021,1443293954,-1946166552,1979058996,535348214,-956235693,347654,876019456,71731974,244338718,184558824,-1206356800,-4521985,-1957670145,1344144454,1342177720,189627112,-1207601728,48955393,-389824469,50352933,-2096466293,1962937980,793048582,-952470520,17124870,208994048,187323624,1445622976,-402229505,-1072959101,-1202315404,726663183,1347440832]},{"sector":11,"data":[52823694,2117533478,922691155,552096636,-339727368,112643,1389619395,1996424192,175570700,-16222465,28837494,-960999424,8960512,468209746,209125120,-16091393,1996425334,1354771206,-1174387016,1347551334,-1023409688,139613672,175570695,3658650,-263812864,200431241,-385649214,1589903571,2013210352,2013210116,112646,2122534992,74711048,199999531,653287108,638076811,50753527,1452011590,787954,-6664110,-1996488449,-1072956858,-1930886283,-1305018624,-1046851581,-1996488650,1996486726,1354771216,919575120,1183383552,-162100748,-1206880513,-4521985,-1706012160,14045,-1979955575,1996488278,242679568,-1005816065,-14225314,-14285705,922682999,-1070922830,1996443728,74907398,1530266,-1305018624,-126419197,1104282,276233984,-624897,-6622090,-16776961,1996427382,-59310082,16777114,-92864768,2026650,175570688,3667098,-263812352,1962034699,-92372218,-14912256,1996427382,209125134,74069759,74200831,-1728036168,-6664110,-1023409921,5341416,1813416704,-1581241596,-389872534,16797998,-402360577,-389866497,33706341,-1996459871,1178205254,-1961921528,1923286598,138840832,-402624349,1183514716,1122550780,-16711599,922682998,1072170504,854115152,-16777135,-2097037306,114750,904397692,29401344,1360783555,1048772608,1962934720,1354771209,935631440,251592704,-1063190080,-18300159,-2097086384,1946158718,1345644549,686293995]},{"sector":12,"data":[-1477917872,-1962933424,184578102,722171382,-1706012480,14318,1048784619,2080375232,-6662617,-1996488449,1451883078,1975651324,1916177158,-1381632,1996487798,-25862,-1705639936,8613,1352919235,1988821248,28857862,216551424,-1830239487,-16711600,45614710,-51884032,-2098674944,-16645552,244320374,187197160,-13798208,1776813686,1975520079,142508830,-1961004032,1602947166,172460548,-151239032,1965096006,-62458362,-1207602112,48955393,-389824469,16797761,1443264139,-16763672,31982196,-337067264,-1962868657,216728694,2091094,-402492161,881590252,-260704757,1343482051,-1070923776,518224,-397361109,-389816131,16863166,-956008821,23558,620226560,105922187,-167044373,1966671220,-2146470654,1962936189,38127369,1170604032,1032520198,-495583477,1338763459,-1070923776,112720,3532880,1337714883,1988821250,1346276102,958393094,410322037,490880,1170608756,727056391,-1063628608,-1207959526,149618689,-16040565,-1070867083,1329916099,1988821507,244340230,187132648,721778112,9169344,17057526,-167041164,1190536052,494215172,-167486325,1948256839,272927493,1552641515,172488196,1443263552,-352257048,1996445278,5826564,-1946401143,184963134,-1975683648,1166541894,41257222,208991755,74841942,-402360577,619381691,721712639,-1706012480,15187,721712639,-1706012480,65535,-16484865,-1711007178,15173,-1710983681,6746]},{"sector":13,"data":[17253830,-1023130229,89039336,1344178946,125796358,-1961396992,1194919494,-1978698494,-467007929,1963214395,112645,1187476459,-1090518790,-1070922160,-1980217719,898364998,494204427,490624,1183529845,38025478,1149904245,1004808710,460653638,33179335,1979058944,-125924570,494272267,200703627,722892287,-2094339136,1962934908,-125925115,2122908651,-335639562,959810485,1946570806,-1996190963,105947397,914949257,1183516240,132695034,-1962868402,2089485430,141900036,-11137420,28837493,-790081536,141920514,-1022999157,55453928,5171200,96083595,-1207142401,-397410303,1049297138,-164952868,-544534293,-15808637,28839031,-605532160,909723136,-360774372,97656459,-1207142401,-397410303,512426182,2013201882,1354771212,-956253720,20998,-1880571136,-1962932915,-385462218,2088763531,57999367,-16744215,-1113979788,1073741883,1962931573,-26108,1183383552,-61437446,1347469355,647647312,-1996488683,1962933830,992844292,1183383552,41222134,-1979419393,-467007932,35514448,17188086,1996435829,74776574,2016666,1996443648,112886,516921936,1962868736,-25755900,1714074,74776320,-362753,-6620042,-16776961,-442827146,-1962934218,1962281780,-9508605,1295247555,1988821504,-11081720,108461910,-1023403544,5037544,108432130,-11138581,132646006,187992832,-1007454730,21808616,108432130,-167486325,1948256839,276597509,1552617963,172488196]},{"sector":14,"data":[958035008,359991415,1460043659,1758874,-143310848,28858198,1894273024,41221889,-397361109,2122579878,343146500,539968758,1686113908,1157029679,74784819,-593369002,1281943747,1988821505,243041030,721712384,-2089948224,1946158206,73173806,537544694,2089485684,-1961891056,1207305308,292831242,-1962379383,1465255551,1342177720,-352252184,28857872,1443162880,1342177976,-1946364184,243041272,1462203905,1701018,-1137246464,177886981,1342177339,-1207012097,-1706033151,16000,-1137246377,1026595333,-947191808,1273555139,1586168320,243237638,-16222719,-476445578,-16777158,233309302,-873938101,-1962868405,1552614518,172488196,-401705952,1149829167,1975520016,-339727580,73173795,1074415606,-74770572,425347,283643765,105220352,-512442357,542151,112640,1267263683,364380160,-17908,-1070903214,1347440720,-6664112,-1023409921,38514920,-1172403454,176128773,-1958644736,1194919494,-1204194292,1344144710,-1981950744,-1072956346,-1070917772,88520784,-59310256,96083595,-15960065,-521664906,142016257,-1694730497,15704,-1694730497,15712,1260185795,1988821762,1996445192,4450308,201213577,-15633216,-1706031498,14756,-1694599425,16218,17057526,1150092660,-1929123034,-125100476,-16353537,41287477,3771546,108461824,1979659775,966302210,-389873664,34097866,1443264139,198725352,722367936,1347440832,989829712,1541996544,-196702975]},{"sector":15,"data":[1190547478,91488516,-349813619,507809027,519063177,-401698736,1183655616,-1924131084,1343681606,503662264,-401698736,-24434803,1173758187,-1217130445,540231158,1183691125,-1924131084,1343681606,505824653,-401698736,2122917737,-756525070,200838110,-2083293697,114238,-1096738956,-230278911,1586171764,860326642,-2143502300,1927873396,71759615,-2096532476,1963003516,-10229501,134498038,2088962420,57999374,-1912646423,1343681606,4144282,-62486272,58048523,-2097109271,1979780732,71759391,1343845388,242548560,134498038,28837236,-1207702784,-1706033148,16025,268715766,1996428148,-59310084,87045887,1342177720,4149146,-1172403456,176128773,1444180992,-1018113,2013265014,-227082484,184570600,-162892608,1946223686,860157504,-163941374,1965032518,1354771252,-1018113,1962933366,753422338,1958742784,1444866852,-1948388120,860157688,722498564,1996443840,-59310096,1443001855,-1962931480,1979059191,-62485538,1230039235,1988822279,963701510,1869874294,271795446,1183671156,-1957685514,1344145990,505300109,-401698736,-1073011143,1183665012,-1706027274,6546,-899447,1996425334,79187976,983191552,-1996488645,1996488262,995859186,2122514432,225705996,-2146673013,-947900849,16781318,-25263360,-2096729087,1962999422,-339727612,187992841,-1198754314,-389873663,84560078,-1962117493,922684030,244319752,-940065816,-5050,755517067,87883778,-385649152]},{"sector":16,"data":[-1073545064,-1476448621,-947175362,1946198333,10697999,-2115435660,-330905856,2062282784,283920071,-1955337232,10567111,-1556278668,-160992000,1975530308,-330905759,1525411888,15484615,-2125206544,1946198527,-1543536378,-1958251264,54331462,1024553984,427032581,1946158653,474395,787160436,10747777,1187448693,-336568084,-330905823,451670160,-2131999033,-954995728,-261034938,1069157611,1071071223,1073168375,1183530999,-266322452,809306740,1023767792,913698912,8601216,1445952768,1342178232,-347643672,-297366247,-1070903274,33601616,34191440,112720,-401698736,1048633906,2080374915,-401698592,2122576353,393543660,18004054,138840912,1357661707,-16353537,244319350,-1008430872,105359848,175540996,-1962377589,992711,738084489,108954616,-2096204543,1962935422,-1983894776,1183385158,104112388,6948409,-1202712715,726663199,1347440832,1323830928,1782481892,57933824,-167636759,1946694468,34072835,5914243,-1959627776,-268419641,-152501387,-267371263,-286719115,-266322687,-420936843,-265274111,-555154571,-264225535,-689372299,-263176959,-823590027,860157441,-1207601728,48955393,1183432747,-196687882,-947191808,1978679357,22997251,-1981217922,-268419839,-1461124235,-267371264,-1511455883,-266322688,809306228,-380341008,2122514829,57999606,-2097052439,16782910,2062091125,860157441,1445950496,184644072,-385649216,-1705639575,3330,6436409,1525220213]},{"sector":17,"data":[112743937,28856320,-1070903296,244340304,-370967320,-1873411771,-885266418,-2097070871,1962997374,20179203,708002954,2106852,200820361,1444312256,184623592,-385649216,244318489,1445066216,545690,1996445184,105880312,2122514432,57999608,-352256791,-196687977,2122514433,343146742,29245059,-385649664,1048772837,1962999830,14412035,184829579,91489862,-352280129,-28915963,1465253888,-100609,1996424822,-193528060,16777114,1647720704,-385649408,1156972717,57942067,-385833751,1187512135,-2097151748,1946161788,309657394,-1705983957,65535,-262096816,1354771280,16777114,-96040704,326418443,126539915,-1996487899,922745926,-6683090,-2097151745,1962998910,280516190,-1070903296,-380612528,1172897540,-11736275,-1070922634,-26032,1072365568,-16353537,-6683530,-352321281,1996445234,74907398,-1694599425,65535,1346183659,1036743920,58060896,1040151529,-579538832,1961918525,-258982440,4048500,-1011583759,4541928,74877697,1292374,1354771280,244338768,-1008591640,4552936,108432129,112726,125008,1160046787,1988821510,-196702970,1150111766,-1873797602,557770766,8632406,1354771280,385107597,-401698736,2089542113,675580710,-1912846711,1344153156,385107597,-401698736,2122522900,880017412,1978957369,-62485752,1962296889,62412309,-1070903296,-162100400,1391740555,-401698736,961995169,1963048502,178181,-1070923029,-836310960]}]],[[{"sector":1,"data":[-196703402,-1957640405,1177286214,2129154300,417879619,-1813462044,-1962736316,1686112374,1183707182,-11528458,1996424822,-401698812,1183522984,-28931592,707937418,12592612,1946173501,8404328,-1069740172,-1591708416,103482630,1174471808,-163148296,2124501014,1356396292,-150699871,244338904,-1977540120,-1071369404,1316241468,3439747,1283475572,1962869038,1183536692,-28955656,2117533520,-96040188,1358317099,16777114,-129629952,972834443,511506502,-336050551,-163148439,2124501014,-1176963324,-369688571,75538768,-369633033,1157014507,645140530,737953419,104593478,444466240,70143104,-2144189194,-2136930956,721611524,1074695104,700984068,1157037134,443818034,36588672,-2144189194,2124481908,721611524,839814080,700984068,1283521102,1996425262,74907398,385238669,-401698736,-389865548,17122178,-167479669,1975530052,776271366,1451193351,-397361109,-125044993,1920270091,19809526,1465255796,16777114,843380224,1444377792,385369741,469297232,-129594025,-1070903274,-401698736,1156972739,91504690,937973590,776271364,-166628350,1946431044,-1202235893,-1873805311,113109006,36586742,1465256820,1342177720,4546970,776271360,1443525636,1354771287,16777114,-396929536,-389810425,16859886,-167479669,1946431300,28857890,1894273024,200838134,1444181247,-401698729,-1072966177,1686111348,1465318191,-1007233304,37945576,175540995,-800987050,947175435,-1995553653]},{"sector":2,"data":[2122579014,91488262,17712327,-2051516928,-1070903296,-1873784752,-546052082,-1979955573,2122518084,208928776,141869067,70208640,-7870378,1119348931,1589904398,931866120,41913126,71797542,1183434283,1200301808,-1983436026,2124540486,-431585020,-1996193631,1187510854,-956292628,15789638,-1996240735,1183579206,1958742790,81238,37563252,1025602560,208928771,1946158141,343338,1005270900,-1996239199,45218886,-738564397,736880230,-352075103,62955779,-771996023,1725032038,-1592202246,1183384912,-330905604,1187446857,-352298258,61645062,-1946401143,-523109818,-1423831,1996426358,912497404,1183383552,209125372,1996445526,-92864528,-1149185,-979702666,50331718,1996487294,1183536652,1355219946,-1018113,1996487286,-327745554,4643738,209125120,1996445526,-361299994,-1149185,-107287434,-16777146,1183517814,-431608848,1464911363,-1673473,1996483190,-327745554,3610522,209125120,-1694730497,18062,1100212419,1988822802,273058578,1963869707,38267139,-401698730,-1073014416,988349301,-1909049086,1444705540,484970128,172395326,1963738635,273058574,76940801,17712779,1443141638,185222795,192220230,36914422,565708148,-1207702784,-397410303,-125046353,-1995422069,1183576134,-230258418,-263811753,28856342,-962965504,1459617863,383665805,440769104,1183645696,-1924131098,1343675974,-303559024,105286428,1946699275,-1332062393,-1929379766,1343682118]},{"sector":3,"data":[-16222465,244319862,1461506024,385238669,178256,1210292816,1183645696,-11528458,1962878580,-401698776,-11068101,1996486262,-92864520,-1694730497,19154,185222795,1718881350,383665805,-565801648,1996443670,175570700,1659375248,-163148515,1183666198,-1873799458,477292558,-163148457,45633558,-6664192,-1929379585,1343682118,-14256897,244328564,-1927487768,1343682118,4084122,-196704000,1721390928,1342177352,-1191938305,-1706033151,18556,-11136021,1996484726,1054599410,1012111959,1183383552,-1137246220,-193528059,-1202667477,-1706033147,18591,96220927,-1018113,-1399131530,-16777187,-16401354,922743926,79168956,1620725760,-1962934212,1175128646,-16223220,949679222,-1929379779,1343675974,-15698177,244321910,-1927523608,1343675974,383665805,-431583920,244338710,1461490920,-2197761,1183572086,-565826590,-465138864,1356875307,-565802153,1343243819,736118411,-1202713018,-860225504,-1706012160,14005,184960651,108267590,1256036951,-396951552,1183530624,205916938,2088970357,578027522,36914422,-397013644,727072304,233328832,-15733954,770179700,41222127,-397361109,909767218,108332174,-401698730,-11125712,-1207583690,1347420161,-1019361304,926873064,108432130,-1979416949,-466997692,-1996472283,-1923700154,1343658054,-1927837208,1343658054,-150700383,-2136911656,1356396292,-1477964144,843352603,1077723172,-1923661195,1343658054,1342178232,887623312]},{"sector":4,"data":[-1740206596,2124501014,1356396292,-150699871,244338904,1461418472,379078285,-1434549424,-1207602176,65732609,1342177976,82316944,35449340,721749665,721692678,-1996193786,1183552582,-2147079270,101057284,-1639544571,-1740206761,922701846,244319176,-1591981080,1177093248,922703770,922682372,-2003172350,1459617846,66598655,66467583,3568282,843380224,-952011768,41542,607339658,1967144128,69640454,1470252681,63846143,69482239,-6785281,922719350,922682406,1996424232,1354771362,-401698736,648086624,2114323204,-1740242684,70403318,648097908,2114323204,-1673123580,-835256489,708247299,-1673098492,75367939,-1804140720,69613311,69744383,1347469355,-401698736,-1705573344,15433,-1740207273,1344160771,60442251,-1957683132,1141087302,1183535134,541328286,436640336,20774912,1460237568,3965850,18671872,731661963,1183422534,1183667858,-1202710868,-1873805232,383838222,194397833,-385649216,-1923678062,1343663174,-1701415169,65535,-1985722743,1183557206,-1740231780,69602955,-1053040175,111242876,1086466821,1183447249,2109737982,-28915963,1183514624,-1538905188,-778549717,-1840870920,69600827,648087677,-1980182268,-11038138,-16513994,-1711013322,19984,112727,1268030032,-1957232640,1174640710,1183535250,-28965990,-1404662448,1996443670,-25962,-1202257920,-1706033150,65535,11173507,-1063189132,-1593578749,1183384514,-6664032,1459618047]},{"sector":5,"data":[4788890,-1807316224,-1583724919,1177093248,-1673098338,-1951906167,1174640710,2114333586,-1673099004,-1740206761,1996443670,-401698656,1183521400,-1673098840,59917867,-1996194298,-1923639226,1343658054,-1868531969,442165262,1016850627,1988821764,142510858,723666059,103489092,1183384626,608472056,723534891,-1996210170,1157036614,611648562,-126419113,70426960,75367979,71344464,75499051,6469712,1375797178,1283299920,2078998528,-935919785,1283889667,1183383552,1996445692,-92864520,721695393,1342471686,721698977,1342472198,-1174396488,1347551472,5112986,1996445440,1307024124,-11075584,-16527818,-16496586,1996486774,108954618,-1593478144,48956542,244039723,-936704974,108954449,-1593478144,48956544,244039723,-936704960,1354771281,244338768,-1023278104,3920104,106859265,540231670,-397203339,1996438148,-864819194,-1962510593,503645766,-397402624,1996438191,978708486,-1207535873,-397410303,-389858748,33700761,-1878493441,327346190,1265942539,-1979162997,-466997689,-1996472283,648150086,1960327942,78160177,712300603,8829011,108954448,-2096401408,1962998910,112653,1688275691,138819840,-1070861452,1354771280,-401698736,1183569893,721611772,988332992,722143035,-163149376,-1980479863,1178204230,-15829746,1996427894,-26096,1183383552,142508814,-2096729088,1962935934,-1305018592,309788419,-15698177,244321910,-1996153880,1451883078,138840572,1183433355]},{"sector":6,"data":[142016262,-1207535873,1347420161,1347469355,3559322,-129595136,58048523,-16719895,-1711033802,65535,200558217,-385649216,-11534132,1369110646,-1996488626,1996485190,1354771444,142016336,-1207535873,-4587422,-1706012160,20075,737441535,-1706012480,18989,185878155,292820550,-755969,1996427894,242679568,-350986497,-193528043,1347469355,-15567105,1996427382,-401698802,1183384739,1958743030,-193528026,89143039,5142170,-193528064,1347469355,-16222465,-1984428426,16431616,-1483059118,-16777146,1996485750,1191484146,2122514432,108331254,-15827325,2122516084,578027766,-15042817,1996429430,209125368,-16091393,1996425334,1354771206,112720,-401698736,2122514464,141820148,-1695254785,2466,16285315,1996425332,1219468024,1183514624,-823606282,-2096495303,1962940030,63742214,-15317367,-1070917514,1687834704,-16777141,-4712330,16759551,530206802,-16777142,1996429430,1326553622,1183383552,-1305018372,343342851,5199002,-96040704,-15173889,1996427894,242679568,-15960321,-16534986,1996425846,108954376,-1207405568,-1195767990,-1207506176,-491124922,-1706012160,18692,62011135,-1694861569,20319,-15173889,1452997750,-1023410100,37304552,175540995,105286998,244338710,-1928236056,1344153156,-16222465,244319862,185948136,-14781248,1996423796,108461832,-1202667477,-397410303,1183383735,1975520252,-339309818,-1010816254,54063336]},{"sector":7,"data":[964612,85733111,906227851,418055388,-15960833,1996426358,142016266,-402229505,-125108093,561381131,-293353845,-603571442,-1948420860,-16539106,1996426359,175570700,-16222465,1558709878,1609089792,-1962736840,1183385670,105286650,-1946401143,-16401890,-11531145,1996487286,112644,3532880,-166989685,922692725,1996423614,-92864516,-1207666945,-397410303,-259325884,309720587,-231681,1996487286,112644,918939728,-963907445,939845827,1988822273,1444473612,-16091393,1996425334,74907398,-1962930200,1979649016,187992840,736392694,-605502528,-1962606025,-167048074,1156987508,880021555,505300109,175570768,-1878493441,339666958,544522251,1513553750,-696653824,91602955,-335544641,860157536,-1978829816,-1071369404,-327860164,1575731243,294531,1150113140,-11526618,1996425846,-401698808,-1073015808,1962875252,175570690,-16222465,1996424822,-10360828,201213577,1445623232,1342211256,-11485141,1996425846,-401698808,-125053903,1962934147,108954543,-1962380288,931726942,-1962770551,1994965958,-1962737097,1149962870,138819880,-1964440708,541362944,-1963178359,-1071369660,1752547388,17106593,1183579206,138820092,1156995709,963905586,52315275,50603526,990150150,696124998,689849483,1149961798,138815776,503552184,142016336,-1878624513,324462606,91537419,-352320584,-339727498,843380338,-1961855996,103490116,103482412,1178272894,-1204519418,1475018754]},{"sector":8,"data":[19809526,1183570804,138820092,95998844,-1958417664,1178152004,-165774328,1946431044,709135296,2080785977,843380235,-1196264444,602603524,-352319816,709135134,2080785977,776271371,-1207602174,199950343,958809227,-1921251770,-1023409736,-1940910504,1430622424,-1910575989,172395480,184962699,-149982007,-372176786,-763117309,105810688,-310117897,535137026,113921373,1343117312,1498962523,-1053076654,-1047854468,1343117515,1498962523,-1053076654,-1047854465,1343117515,1167120524,518818645,509073550,-1962246460,1183516750,-1426850810,-310157537,535137026,147475805,1343117312,1167120524,518818645,1465309326,105810718,1992628963,142525452,225703739,55099787,-34077712,-335764237,-1527514109,-2090967265,-443874579,-900899553,-555220982,-1929101259,385842878,142001415,-1207546229,-935657344,-7274122,1461062774,-1700465839,19216,901245123,-1098054080,118947710,-1962379579,-2135423410,1992833792,1996460289,242679568,369915647,-1527557801,4950682,1119601408,-1157371136,1515716672,-1705880752,13193,1515804867,-1202630064,-1706033088,65535,1348098243,869440082,-1073020928,-1202713740,-1706033149,65535,1532609368,192273163,309328,1397267024,-27787264,126550855,1532617215,192273163,374864,1398446672,-27787264,-503381169]},{"sector":9,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,521012766,1400637183,117376117,512447358,-75410272,645157760,-1961825405,-220002225,1963347967,105875949,753536,-11279243,188344375,189267547,1419904767,-1532898069,-1508471980,197692244,185889994,1241609664,1420075848,1420170889,58049035,118178792,-1590768865,-1959898244,-883720682,-1903110004,-727636288,378217989,868943318,-1190925367,1927806977,-16449485,244321910,1946900200,-947336,-1511519626,1975520001,1354825218,5519103,1317740302,206998286,1946214376,192905228,-13798400,-346775026,-1145031897,-1014803600,1979058960,-2131001082,-2130384044,1918148859,-346466044,138885424,-921967499,-745864587,119470987,-1047811240,-1413313621,-1951683752,1183558598,1183558406,1044097800,74601632,1419787913]},{"sector":10,"data":[-919354477,28902379,853796864,1996423680,-401698808,359926471,-242540786,-1962389877,1642595926,-402230272,31981597,512475904,1194939552,-2096531976,-75427605,-227060864,-1608611538,868455252,138906048,1946896186,189237255,1419906815,1499093955,521018963,1419779723,1400961921,-343730314,956621584,185168911,971863250,-394984873,-335558424,-5576477,512475935,-1070377824,1400961921,-343728778,138885392,1329328756,1005417730,-394984361,986090320,1968704071,197197535,1482277824,521018961,-125085866,104448051,1584682146,1419785867,1400962689,-293383050,192708624,-953344,157280308,-395001845,-1962779509,-795744049,2088820340,330825738,67269633,189595141,1419906815,1571501823,1521170175,1521039103,1400780543,1400649471,-15829761,1962871924,1962889220,130672642,1583284656,-661863649,-661774704,2083979054,3139667,-1957311713,-1202235668,1727464424,-736195836,1943223045,-772540656,1926446059,1048788993,1946158550,1606431490,1575324510,1426064066,-189141877,97820929,-1056714189,-922496493,1727525367,1575324420,855638722,-1325208631,861559553,95965376,856419200,-1325208631,-1202038015,1380974597,-398073005,83898701,-1961992565,2123041398,1962871564,-1957275868,-930404793,-1957635849,-796186553,1464916215,-1873653418,228190222,-1879046424,227665934,242679747,1996445271,108461832,-1011045912,3213544,209095428,185237131,1461875967,-1960426357,1356396488,-1960295285]},{"sector":11,"data":[1356396496,-1705881257,18571,-1711274264,22456,-11053373,1996425334,794486790,-2147483453,503316608,1364234328,-1966568878,-1193014549,41484544,29016318,321536,-883402406,1342578428,240275795,-1606515937,1567948838,1963065405,1473356549,20795627,1023767553,963969280,1964112256,1473552901,-109045013,-1576700654,132863955,1473461888,-2146863872,5755966,67371636,292929546,2418718,255527541,1207895669,250289924,-784432353,57933911,-402640664,-370671525,1532582407,-1021376680,1473584782,409219,184775936,512476096,-75300854,-1962641606,721423390,989856798,516096583,1364205326,-788084910,-1207959465,243991040,378231461,-1008182617,-1995934209,-16774626,234882574,387103,525883738,-717815869,1347440727,2117533520,2083979091,1364218451,184929000,957838784,1952094470,-1759576314,-1207180454,-1706033151,65535,1438892083,244051083,-1070399404,8128057,238618228,947191932,8130185,959365171,1948688390,175570733,772306687,1400780543,2083979054,-13741997,774282782,777299107,1420170889,197145489,-29264438,8430528,-1070379797,-717816018,175570775,1342732031,-16353537,240125046,-1559913496,-1073020800,959324021,1951912198,33601555,-1962520949,-1628961706,-402295603,-957612263,-352289629,140428301,638552870,637685639,-443871351,574045,871140181,-2147075648,-385649408,959316215,1948688390,1347440675,1354825296,-1642135762,73319462]},{"sector":12,"data":[4161830,638285058,637695999,-402360321,686490500,959365171,1948687366,108461835,772044543,647634687,8396427,512634398,119429077,-1494722730,526278405,637820612,-108982389,57999872,-2130669335,1946223097,16351542,-2127531007,1946224121,83460394,-1205570559,-109051903,-32932860,117014720,78643838,1946548608,49905676,-109049996,-1274907640,839773056,29488868,-2135686539,38242854,-661988557,8569729,19138442,108643338,41428770,126353716,8579969,-1962986861,973179678,1946256007,-16796926,-1960933181,167477249,113643900,-2097151605,130110,-6683275,-956301057,32774,1575324416,1218]},{"sector":13,"data":[0,0,0,0,508952576,117317390,1048599489,1963023297,-1089041387,-1121547941,1539161691,-72063,-1961362930,1048837094,1962944160,1364414517,28873106,33864450,1520647811,-1828621312,1224801512,-355396236,-392959279,1950941425,-773140214,34060522,1493230824,27809883,-924253323,2042628864,-1247728102,-1981548710,777692438,-145049695,-1491695135,18671706,-1962900247,-1189704765,13035610,378210675,-1047831877,1359002600,-619984589,-1616825484,-1715272870,1520115339,100924407,104553125,92101293,861580705,-1324991534,-1593410470,860379825,-1625912878,-2016900262,727360774,-1072998200,100872052,-768386399,1520895491,1521419835,-1348401795,1003631450,2086318854,1521721606,-1949158584,-1592358440,-1492744358,198716250,-1205410869,243991040,378231461,535321255,-1723956229,175374426,520049233,1482316439,1380976611,16777114,251591168,141908929,1539249806,1539122827,-154444257,57934530,-151327256,91489474,-471285506,-1072970758,-654900611,91669051,-506338351,2062074872,-100532181,-1945743676,1975585728,-1190715899,-1207040698,105929389,1239944785,1632263,240698363,1532647760,-95333800,-83881240,-375762096,-889192356,1520804142,-1491170514,521018970,1521288763,-1381956739,-1324991654,-1593541542,-1555539279,507206309,75324079,1521426059,1521688123,512427388,-1991550285,861579038,-1626437175,-1592882854,784539482,1473316550,49921]},{"sector":14,"data":[-1864856576,-326412987,-1193767394,-1202716612,-397410294,-1557266372,-310159403,535137026,-389329571,16788169,-1207535873,-397410286,-1543897056,-1557266348,122707371,-1392081106,10692189,-1070397952,412747344,1476395059,-1957313541,765089772,1342177331,-1962522997,-503905202,1342192133,1361068217,1347537203,16777114,1505791488,1958742875,-1073966314,-1951727614,1202390086,3848263,-1047811157,1606454443,-1034033781,-1957363708,5546476,-1391555794,1959332701,-1047594436,2001702,1958820608,-1949201658,787147723,1571620411,-1993472139,-346182370,650284551,7817,512351027,-1993473924,-77746402,-26032,-1243086848,1575324417,-326412861,-90417322,373721886,-1064380274,671371,540219,-1070397323,394811,-1957223307,-1929378802,371065974,-1527514081,-397190369,512295177,117374986,-400687098,-1554513605,-350289864,-401682687,1583349755,-1034033781,-661913580,-1957345904,-661774612,1996445526,-1070391534,2629259,578077498,175492094,394811,117382773,1589968936,38258446,130482194,715194368,71796992,104552171,1383333894,538251,1317739659,-940709876,242540171,-1962785653,1451952718,-943724536,-2031613579,870413568,-1003754560,243994238,-1527578620,-1089933693,119406608,-1515870811,-2085895285,1962935934,403097352,-352321280,1042435,1583334283,-1962742397,1297948645,-100659510,251594526,77660166,137792256,171870976,2012429056,-880018145,-208941525,67013454]},{"sector":15,"data":[1201992696,802363,985596786,138316032,-1006896128,66292732,735022064,-201618482,171870628,63175424,989856798,1912605726,3848963,663099,1506014091,992891224,1952295686,484986886,-1010814208,109992027,-2094661548,33561662,992348021,1946163718,-4181246,1364744675,-1425654994,772044125,-1906464094,113649344,855703608,104539840,359923726,959270,922691078,1134166018,117440550,184549816,-970013760,22915590,1571791150,125091851,-924270450,773027327,190688673,-1911851840,-4593472,41254,1539567988,-4181158,1409715939,882976256,1958742784,788473349,113901618,28397824,860947435,-594848823,140479286,74832651,250288355,184835979,-2129693477,1263403647,1499138165,-905969395,1499136002,46841907,668723200,1996423680,142016262,-397361101,-389812440,50341833,-970056015,694224134,134661678,417868129,649184000,82510256,699410097,1627759150,1627955758,2597096,5564419,637862182,-1023259391,1475119957,515460429,1173504,-1956690619,113401317,2537728,2586856,176065283,-401698729,594870112,1183578371,105810696,1364218192,244340510,-1962720280,1356396293,-150846069,244338904,-1023164696,1393188491,837291664,-1911589633,2123040838,65876486,-1962439719,-389873073,50341673,1393188491,300420752,-15698689,1996425334,-1014817274,244339486,-1023215640,49006899,48759217,-1962868697,-1873607074,-18159602,-1070394252,1207306467]},{"sector":16,"data":[141822003,1207306475,41164851,-389824258,16787165,1392926347,-974647664,1393325310,1342181048,1347469363,-1019155632,2539752,207522564,-401698733,276102824,899155,108461904,-16091393,535496822,648014019,1586168576,244339466,1962837992,213406483,-1070379008,142016336,-1878624513,-1021319154,-1194773565,-661913167,-1957345904,-661774612,1393057419,1508380304,-485395202,73370374,65323907,1200293470,1113033536,-1962742397,1297948645,855639242,-2135836471,1381653336,-1202695342,-1313341007,-1864856447,-326412987,-1948742114,-1873605538,-32053234,-922083980,1602946681,-456948988,-1962254845,1200031302,1944703296,139889414,-2092804217,-443874579,-900899553,-152567800,-1962868699,-1873607074,-35723250,512164980,-1933377446,-1064398632,5939494,-1864856373,1515831438,860967515,1602954944,1960512260,2139170314,1967869442,-876544510,-62208,-65536,-65536,-65536,-65536,-65536,-65536,11599872,-1157516869,-1313144143,78756611,-1157254725,-594868559,173509430,33616513,-1909578891,643291142,8590904,942026364,2080412182,1468741159,372975116,477364330,-1878763287,-2064481904,-2146339582,125108729,-1711276104,-2147480886,-462092807,-645211341,-620504317,-424673490,624158818,-1070399232,-2096734581,108993275,-2020875311,-356318834,22756,2431208,108954369,-1592232960,-1073020804,104534388,192151636,1095760,1400019536,-1957167104,-1935473082,-6664191]},{"sector":17,"data":[-1023409921,1519442060,106519303,-661774766,-401698733,578092231,-401698735,443874500,-619986893,1468666996,-1058897869,1967192704,945785609,-361379013,-887111426,2404584,106471680,192200715,-401698736,-1070357529,-1559865181,-389872206,16786581,1392926347,2112360080,-1962707716,784544839,1532666785,110046727,1392925347,521019083,1681331853,-853213000,-71098591,-850657096,-1864856543,-326412987,1473809950,243188988,-1425258869,-1425389941,-1425521013,-1425652085,49120095,1562371467,838221,1167120524,518818645,-1000875890,79234686,-54512896,-2090882061,-443874579,-900899553,-661913596,-1957345904,-661774612,-987867306,2126775926,309514,530969596,-310157729,535137026,147475805,-1864856576,-326412987,517508638,1589969328,72321798,176033595,990269323,41812559,-2095071181,-443874579,-900899553,-661913596,-1957345904,-661774612,-1950338274,1451951694,173982984,2080528187,106380048,255527805,1329268604,-33391356,-310173760,535137026,147475805,-1864856576,-326412987,517508638,-1962254651,117508166,-1962653951,1191249478,105316610,49120031,1562371467,576077,1167120524,518818645,-987834226,1183517278,17246472,1183515719,38217990,520505089,-1962742397,1297948645,-1946154806,1430622424,-1910575989,-984131880,-1174664586,1353515012,-990153399,-2080567682,1992623815,113672966,-1386543951,25024571,49905811,-1416429185,-2081458871,1460011719,82316944,1958743039]}],[{"sector":1,"data":[-1873345013,-21960690,49004595,1610351024,49120094,1562371467,838221,1167120524,518818645,1465309326,-1006209339,1996426878,175570700,-924316016,1444827390,-1058533744,1958743038,-1072998373,1460013940,1743261328,-339725314,509019719,-401698730,988544636,1958742872,-11074033,1996426358,-401698806,653000296,309756,1967739053,1992687099,113672970,-1324955773,1001216772,-1828618813,2130901376,1235981057,28372853,-2090967044,-443874579,-900899553,1122500620,-1962672094,1347423302,-1710852353,20226,142001232,2113936104,-1036598254,209125121,1347572051,1251628550,-1711275956,26216,520494787,-661934596,-1379365971,92193579,732811403,-389865535,50340345,-402229564,310312927,30029508,1393194751,105927249,1719900758,-389873664,100802966,1343112843,142016336,6719642,1992577024,-1326950902,1954438911,-1996488257,1183448662,1996444668,1381061390,108461911,-1710983425,26302,175555675,105679654,1996444489,-11447538,-11010442,1996424822,1727568388,-1000669184,-1960441226,-11468212,1364397686,-59310249,-16353537,379192438,1493172327,638219972,1258577035,1393456895,1996445521,108462076,-1710983425,26419,6738330,1122550528,-1006370783,-16661986,1996426358,142016266,101086975,-11540397,-326412861,1354773278,16777114,-971062272,142016257,-16353537,105907318,-13637549,1575324447,-402651454,85467393,-1961986421,-1873409410,-119085042,125157387]},{"sector":2,"data":[-768884693,-1962651159,423431238,-385649408,58065682,755223785,305987590,65107712,-13724736,1449880999,1342177720,16777114,1781938432,-1865845504,-897062898,1157022443,175386674,-401698730,-1072979516,-1000951180,-14285218,-14280585,244323959,-1727792408,-2096892439,1946171004,913637126,-2081745176,1946159740,175439755,-336917784,1996445315,108461832,-371486744,-11075722,1996425334,-401698810,1149895619,1019225138,-385649472,-1873346722,-1514412018,58048523,1459573225,-1511518576,-230258225,-1070447370,-1923737228,1343682118,-485912,1183707766,726669046,244338880,1457348328,-386763009,1996480726,520546546,-939582999,62534,3570819,-16042892,1149972596,-1706025418,26859,-12219056,-377362352,-1946925431,1344157252,-16222465,1996424822,-373954316,50749124,-970525602,1183514631,-13374988,3570819,-873921675,910461950,2124042270,-385875891,-1873346787,-1628575730,1459533289,1460434687,-16222465,-2098723210,-22746666,142016342,-1878624513,-401676274,1459549417,382879373,-401698736,-1923698572,1343672902,1659375248,-25368143,-610277290,-1946257943,1200292956,-800683750,58048523,1040082409,192348170,-472786805,62556043,-3127671,530239606,1442840683,1996445526,-401698608,28881297,-29431552,1996445526,108461832,-371772952,1048837678,1946158630,-31135485,542455,-385649376,1048837658,1962934372,-32446205,155043723,1025537024,57933837,-130583]},{"sector":3,"data":[-1207933898,-1202716398,726724656,-1873784640,-1149507570,-136727,-1207933898,-1202716398,-1873805296,-996087794,92127243,-336576328,-263145255,1190647019,1965031432,-37689085,58064651,1459468777,1342247608,1357971640,1464909867,1157020139,58015794,201285609,-2147060481,-348115380,778338308,860157631,-385649392,-8126648,-385649406,-1873346752,-144644082,208977931,1354771286,16777114,-13965056,-401698730,1183436224,-397388046,1996480274,490924274,201266153,-385649153,2122579278,57933832,1459439081,552078992,-46339644,-1159178410,-46863954,425603,736691061,860130045,-2143502300,535364468,1962871805,860157455,-167152368,1967140676,-49485565,158727947,271795446,-1506443,1962871804,795115526,-2147161153,1447046988,91553547,-352320328,1354771202,1927810704,-52631133,84442755,-11067020,-16518090,-1711017418,27397,3604311,-29950204,1796446723,-962527232,1461709571,67385087,67254015,5175194,922703616,922682360,-409336842,-1593835442,1183384508,-1415950128,1459617867,-14256897,-1969608588,-1962934211,-628305850,-2097098263,404030,1877541749,-63011844,57933825,-236055,721824310,245452992,2047224581,922701828,922682640,-1070922630,-401698736,1139389664,-1335206916,-1335381913,1952952423,-1754776982,459857000,1852371561,1852289129,-1335280791,-1335381913,1030388839,57999493,2013108713,2047275,854131573,8470012,1105789813,8535548]},{"sector":4,"data":[1592329077,8601084,1894318965,8666620,1206453109,-68621827,1963000893,-38606589,-2042815625,-385649408,-1606549972,-385649920,-1556218930,-385648896,-1008075503,17186299,-236387467,17382909,988349301,17972735,1877541749,-72816131,479455427,1988821763,914129674,-16157696,417871476,910461415,184960651,1215563846,-16222465,-1399191946,-1962934168,1996441592,1817877000,1183383552,-756525304,-96040474,74825739,602652715,-1980086645,1996437060,-26104,-1031077888,1342719625,-1962510593,1344157252,-435034025,-1023409736,52159976,141986563,-1996374367,2122579526,108331012,29230791,1156972544,141901875,271795446,-164953483,-1980074359,-11076490,837289590,-2081387776,1946221182,860157459,-2096269888,114238,909706868,-613088834,137577718,1983448948,735081980,-28931082,-1962819933,2145960902,-1962802917,-167049610,-11138699,1541932150,-161944832,1954558788,947684121,-1961659392,1207318620,175378483,74907478,23193683,2122529259,561250308,74907478,-1962922520,1354771448,1459910399,-1962823960,1979137008,-339244284,-335639786,1354771432,1443133183,-1962830104,1962871800,-1008276575,1774056,108432130,-1560000885,113706114,67102,105645767,113704960,1048,87176841,-1167228488,1347579268,1347469355,349562960,829734923,-1167222856,1347579290,184590056,-1960676160,-16401890,-4715401,-17665,-1070903214,-397389744,-1073015567,1048774516,1962935320]},{"sector":5,"data":[1279165371,74776582,65783435,-1022997343,1760488,175540995,271795446,1156974196,91570226,-352321096,860157519,-2096139136,1946171516,945589001,271796214,1048831605,1962935602,1278642440,-339727610,842414379,-2096204539,295486,1048778356,1962935884,403097576,-1996488444,-1593422794,149620254,102631111,-1393885184,439412931,1388184066,742296325,-2095453435,292814908,-1070910209,1593790544,1975520004,-339727612,46564109,189777803,-1193249344,-389873663,6721,6567679,619187856,6595058,434956483,1988821761,75401992,425603,-1070903691,-396996528,1183383631,1958743038,-28931323,727073515,-396930880,1183383611,1975520254,-2095387668,1946171517,-1070901478,947257168,-1996479768,-1072955834,2106315637,860223032,1474328000,-402229505,149683838,108461910,125015,428140739,1996423937,108461832,-1962641665,-16401890,568855671,-28931840,376815627,-16222465,1996424822,-635532540,209190661,-1996486680,1183579718,1273545726,-1962671079,2123041398,1979058950,142508811,-1207601920,48955393,1183432747,-129579010,-16056320,-963967627,-1962883351,1183384646,1975520252,11659523,29245059,-1960610816,947880920,-1207601920,48955393,104579115,57999806,-1962898711,1207368798,544542771,1586200555,860354300,-166365936,1950363463,947880816,-1962314752,1207318623,-555022285,972840587,91568255,-352321096,-1983894782,2122578502,259325960,16678531,-1073018508]},{"sector":6,"data":[1183516020,-2092241924,1962999422,-59361019,28837237,721611520,-28931648,359972875,556675,2122518388,91488504,-336050549,-339244256,-92372196,-1962511360,1183448134,-60912648,1172899723,142509055,735540480,1474872256,-16771560,-1878749642,356640782,6567679,1342178488,-954748696,64582,31999687,1681296128,-1472820992,-398014716,-1202323456,-1873805296,-1103304690,58507275,-1207914263,-1394016255,1480491776,678756358,-401698730,-1072959170,-1705632140,65535,106444543,1342178488,-689434992,1479999389,-401698810,99337289,65539728,-700019278,-1070903274,-1202696112,-1873805311,-1305942002,-1250639861,16533191,-398014720,1183514625,17120728,-1259797643,-385649152,3997889,-385649919,20775131,1024882177,427032836,-1207906583,-1873805311,-223090674,50087623,-398014720,-1192689664,-398014720,1183514624,605658,1156121461,1064447,-1595341963,729148160,28856512,2011713536,-28931589,58050107,-1879012631,-220141554,8829014,1354771280,-1963041141,-466996409,721428517,735087570,1388547008,-401698736,-1039420399,1996447604,8829182,112720,860129872,539354154,-1949160704,-1950340144,-1873784122,-1276385266,-1979812213,-352016330,-398014668,2122514432,695538394,33310407,757263104,138215936,52066048,-13724736,-781090905,-1016020112,-1015967376,-1854880912,-1016020111,-394362000,-1928039424,1343673926,568856208,-700019278,244338710,-2085432856,1962998910]},{"sector":7,"data":[-20322045,-1159197040,95966912,1894273024,-401698795,922743334,244319374,-2095859736,1963064446,1679723306,206015232,1342209187,-1673473,1996481654,-529072158,-2197761,1996479606,-663289894,-325195693,-956268893,305158,-1763130624,-1962602986,-24441226,1447085955,384059021,49473616,1024214667,57999522,2113988841,21948675,1946157629,408902,255676532,-385649408,339542325,-385649664,2105737550,208928806,14974593,-1207602160,48955393,1183432747,645267450,175570774,74760203,65781803,1342424737,-1964503408,-2125337688,268493950,1979665012,-525211638,2122531563,326369290,-401698730,-1202275329,726663172,-840412992,-1876301054,298772494,2122523371,58001674,-2097093143,-167506834,1971383878,209617167,343212289,956431009,108268102,-375799765,113705204,506,175570774,17596033,-1207601919,48955393,-397361109,-1073019720,2122439284,1962999820,172395475,-352191837,608565195,-998932480,-2145104512,83642055,-165418240,1954554949,608565171,-1401585664,2133091712,150750919,-166991104,1954606662,-62470245,1187446800,-352321290,-330921189,1996443678,108461832,-1779954032,1975520241,-163119345,149702275,972441227,-578817978,2377207,-385649536,-11075742,1996486262,5499132,1459574249,-385875528,87949084,1026129665,58458372,1040130025,142344448,2130772285,-14685949,209125206,-16091393,1996425334,-401698810,451671029,1963065405,-8918781]},{"sector":8,"data":[1963065661,-12195581,1963065917,-11540221,-389819669,51123350,-1928825089,1343678534,-1962853400,-964491146,71732032,1946157373,146714,-51838091,277760,138243700,1028355072,1853095952,-1962863895,-461311418,106335104,-489486159,1149878795,-230258140,2133189674,-196723968,1996428404,178184,-126419120,-956218392,263238,1996467179,309256,1354771280,-385798168,1157038287,1954578468,12970243,652742288,142016446,1342178488,-397361109,183173392,-1207404801,-397410302,1187451749,-1946158082,1178142278,-1959887116,1178203206,-2094629384,1963459710,-129594612,-1946270071,1183446086,608499206,-1961986944,1178142278,-1962511112,1183446086,105286406,1962427961,-196724432,1183516031,-1962677256,1183385158,-754404872,608996320,-2139037311,1175175435,608471302,-1207404801,-11534334,-1847003018,-25263360,-1959889669,1183448646,-401698810,244366729,-1961917464,1586230910,-763262458,1149868033,675596074,1048772609,1946157550,-301007100,1273545473,-1962737133,-947713922,73319488,621168011,-1993986048,108366599,1042049,41388326,637945227,621168521,145821440,-1993938733,1166869575,1200170508,608537352,172460326,637566757,-1978644599,-1744706940,206014758,31229066,1200170648,-269958386,-956093934,-268218,-2096597365,1996439750,-1404662520,-1981263850,108331007,-1995881496,2122577478,175374598,-1878493441,-1034033138,1187452395,-16776984,1183647862,-1873799490,-1544886258]},{"sector":9,"data":[-1984018805,2089016902,527695910,11304577,1343779856,1342732031,-1873756117,-1512249330,1977850448,1183383552,-14685190,922738294,1436156870,-1996488601,1996487238,3604446,-29950204,1794284035,1996423168,112862,1265539664,2122514432,1366622470,16154243,1996437108,-868810786,1984207363,1183383552,-562626564,69613311,69744383,737572607,1253593280,12106247,-941076398,-562626625,-1694730497,30594,-2197761,889129076,503989387,74776400,-1998057840,-465123364,199819264,-1168209151,-1618290685,-14024208,101353354,100918314,378209450,1183384748,-195655182,1390311167,-1706012080,31097,1358841481,635965072,-532248100,-1948100983,1066120286,721700747,-532272185,1183443153,108954616,-15239935,-956047754,41221968,-755969,1996485238,-401698562,2122570775,1450443014,632702603,145850112,1178331347,-1874364956,227207182,956327073,980748358,721975039,1996443840,244338912,-1962109208,126596190,1358448131,65160843,1346896452,-1545073008,108954381,-150506238,-2139048378,1996425333,-401698808,2122518108,326435334,956581515,91612230,-352321096,-280573,-2081929591,1962666110,-562626784,515131019,-465138864,1974486585,112645,-1070923029,-394854576,-1645736304,-465109241,146032259,971261579,58636358,-70935,1996480118,1976736506,2122514432,259326214,-1928825089,1343667782,-85455216,-16323678,-102179210,-1209482481,-1090319088,1183580155,4195592]},{"sector":10,"data":[-506231,1183647862,-397404442,1183579472,2130716144,-388822863,-1946532215,54330950,1025209344,1500774409,1946160445,1785161,540871796,1025733632,980680747,2122522603,208994308,-1964482933,-1744705401,233568395,-2132255093,-83760961,2123039604,-67140614,-1360460939,108954368,-2090634231,1962935422,-2147436467,2122533611,-562757628,-336953717,75400156,-1193904896,-1873805296,-1237784562,92127243,-335544392,112643,2123100299,201196538,-1962508801,-347082114,-226608889,-13958529,1979350585,-278620,-1070882837,-1946657141,-444586929,-1983378561,1996432463,2122536712,427034886,720389770,8332772,309643067,720389770,8332772,1962034747,112645,2122518251,91488260,-352319304,309251,-83105712,151420547,28837236,721611520,-689388608,-16363249,244322422,199736040,-955943488,4166,621168267,1183416320,105286652,-1996484827,-1946194810,-494433576,-2037803007,1183580022,251667718,-388822863,-9533815,-8616249,1183514624,805315846,-9795959,1963982909,105286179,-2037845980,272432990,-1073078668,-2033771916,65386,-821598592,-8616249,149618689,-1877969153,169011214,1080963,1996425588,-1549735920,-1961867639,1175128134,-1609337590,-467007989,78251523,78386827,-1995946359,1996425814,209125134,7973786,-196704000,-1995577624,-11489210,1996426870,-193528052,703073936,-1572435495,-6007159,1996468342,142016266,-16091393,798623862,1342177388]},{"sector":11,"data":[166203024,-1505326631,-1599580535,-467007987,78251523,78386827,-1982314871,1996479062,1380995760,1988926032,-1873805312,-656480242,-1982970231,1996476502,202619056,1392508858,112720,-401698736,-523118396,-3258879,-1779912586,-1983894771,1183424070,108461952,184859624,-1592757056,100860966,1183384682,74228126,-1954527607,-1493709242,-930349194,-9009525,640612168,-1983380732,-1946197874,244033094,-506395610,-11484925,-118971786,-1224781609,-253165728,-1639578665,69602955,-1056710191,-8239479,1996465270,-673585024,112773259,674166528,-1983380732,-1577098098,787940390,-930414098,721767073,731480646,66638274,-230258239,-150722399,-1962807762,88908232,-10189269,-775804007,-1983839240,-1098788282,268500842,1085806708,1183535104,-1706016524,21280,200951433,-385649472,113705115,66044,-9781631,91557888,-352321096,-1950340350,-461371834,281837775,-955890039,113703494,-1996112223,-1900494778,-1924129276,1343675462,1342183096,1944587920,-1912158249,-1593835516,378208342,1183383640,-128546314,309707275,-2013232224,-2069825978,-146372608,-2013231456,1183709254,-1202710846,-4564307,-1873784065,-381753330,1347469355,-840429936,6988257,-1582152055,1183383654,6857140,-10058103,115871376,242679735,-1962117377,1344207430,1089750667,-687740848,30033607,276726528,-1960938496,1200230494,635710003,1183383560,-63011894,158662657,1354771283,1407717008,-230257736,998393347]},{"sector":12,"data":[2114260998,84975889,-1954396629,-788234738,-1983829023,1183576646,1686504402,235289599,-1592623611,-2044001010,244055908,-506395520,1183433003,-2147239726,1347605035,-16091393,-1070921610,1384169658,-227082416,-2984193,-1224768906,1996488548,922701840,1347421088,501747344,-2081387642,130110,1688290676,-1605990144,-1996463455,-1070871482,-1560255325,914948194,-1063190438,-1371109119,28589699,-1207602176,49020927,-1063010261,1958742785,137821961,-401698810,922729216,244318644,-1950663704,1086817278,-150991176,61984870,1183443155,709135276,723928107,-1711316858,-120470997,-8485239,-1960033141,-372125618,1143718187,1652984104,-1535705089,-394234113,1177277863,65589668,-1996216314,-196703483,-1962654327,1177267270,65589712,738157190,1166650438,105286402,-1962523255,100900422,1166607398,1988528904,608537087,-9533813,-523040591,-1960557303,1166670406,273058570,-953793143,10309,1787202902,-397404417,1187510284,-352321366,1922992948,2122746879,-1962440193,-2046570938,1200226174,1652984580,105351679,-1985198549,1200292423,637928196,2122746116,-1438187521,-9271677,-1438217464,-9009607,117425023,-2091515410,1946221694,309253,28836843,244338688,-2087656216,16743614,914949236,1187446874,-2130706218,16739006,-955222768,31750,112640,172025936,1456895625,854068880,-1925452873,1343654982,735475455,-1873784640,-1524832242,745848843,378291853,112720,-401698736]},{"sector":13,"data":[-1072962873,1183650933,-1873799540,-1509758962,378291853,-401698736,2105779890,-1082916824,33308291,-1958185984,1789112902,-1270445312,-1962907997,-1543543162,1048772712,1946157086,-1605989627,-1070923029,-1962911069,1654901830,-1605989632,-1962908509,-1063014842,2092960513,-1180768251,-1070921237,-1835380656,-1962934217,1183394373,-897678422,-2095876864,130110,1996426357,112656,-401698736,-1873365570,-1985878002,25968259,721843200,1944604864,-63012087,1819541505,381830797,-401698736,1183571648,96379840,383534733,76462160,381177886,244338688,-942405144,130054,-1173960960,-956301053,16738438,1755220736,-829977857,-661940223,8554378,-2144042972,-9920885,574020867,-1634994617,-2021064856,-1073086378,-353893516,1753677790,1757316095,-914619393,33162951,1183514624,-1947679830,-1962868727,-266009530,1064192,540873076,1024553984,292814896,1946173501,-1592464623,300614618,-352023391,62300428,-660535317,721611525,-1763130432,-1962601207,1183649398,-11528482,1996426358,-401698806,1183704428,-11528474,1996426358,-401698806,983688540,112826629,-1543899392,1017184766,-1037330171,10746065,-431583998,-22982634,1356396289,-150863711,244338904,736486888,108935679,1049299572,45154814,216786899,17333891,1049298549,-405732866,-130613418,-164167933,2146867715,1183383552,-598308390,943128406,-562626811,736130815,1464881344,-402229505,-11140706,-16435146,1996483190,-29949984]},{"sector":14,"data":[1354771201,108461911,1442940392,87570175,-2197761,-1070863242,3604304,1996445442,23914502,943128406,-361300219,-1280257,-16646602,1459748918,-402229505,-11140782,1996479606,1979095770,2122514432,91553800,-352321096,178179,-1578088823,-523173378,953241,-1980107006,1183438406,142509052,-955747072,127046,-2080604463,1946158718,10807555,-935919786,-2133681661,1183383552,1996445434,-532247578,1089488427,1183535168,-431608854,-260636848,-1174396488,1347551472,8423066,1183536640,-700054562,1358710315,-1542401,1183579254,-398054420,2209872,1375793338,-2136434096,-1957298176,1177281094,1996443862,-59310104,736904843,-1202657210,-256245727,-1706012160,32969,-428409002,1222919819,1183535176,-431608854,-260636848,-1174396488,1347551472,6770842,1996445184,-2125030662,1743454208,384976525,-428409008,1088439947,1996443712,-465138710,-1873786808,-481695730,-230257322,244338710,-1947884312,1183443014,-330920972,-1946663287,1174658630,-230258218,-1981397365,-1923680698,1343681094,2129137296,-364475419,-1947056503,1177281094,-163149354,-230257322,244338710,-1008376600,50797032,75399944,-385649408,922681490,1996424114,1981454864,1183383552,309788666,1342181048,16777114,81152,1187449972,-939524100,16776774,-1070921493,-1979824503,1996487750,-25755886,-1694730497,27364,-1961724161,1452014662,-51714,1392505472,2139265616,1996423168,242679570,-15960321]},{"sector":15,"data":[-16646602,-16646090,-1962692042,1174603334,1996443658,6731784,1375771066,1330158160,922681344,1996424114,-2143642886,736821248,-15567105,-16529354,1996427382,209125134,33437439,33568511,50742923,-11531706,28838006,244338688,-1009990680,430312,209125124,-16091393,1996425334,1354771206,-1023360280,424168,242649861,-401698730,-1072964000,1962874996,209125122,-16091393,1996425334,112646,4974672,-1070923029,101247171,915080451,1049298204,787154140,-1996153695,1979710022,209125132,-16091393,1996425334,74907398,184556776,721712576,-1592529984,1178141980,-2096925190,189664967,-1194492426,-389873663,100730306,-351373685,1463126842,-16222465,1593771638,1975520010,-339727612,75399983,-2095025152,1946157693,41287450,-15960321,1996425846,108461832,1342177720,201310440,-1948879680,1979649022,112832,91547843,1988822272,209125124,-16091393,1996425334,1424512518,1958743039,-769750186,209190661,-15960321,1996425846,108461832,-8394666,997507083,96083595,-15960065,1996426358,142016266,1443264255,201286888,-1960807232,-16393698,1996426359,175570700,-16222465,-397015434,-1072955575,28837236,721611520,1122550720,-2097086459,27198,1788942196,105265408,-1202712716,726663199,1347440832,-1024979312,108954529,-15633408,532153974,-1070903296,-1873784752,-1582569458,84404419,1996424200,-401698804,-1072964368,-1880554635,-1908505856,57933828]},{"sector":16,"data":[-1962880280,-1901917114,-1811495164,-956301052,17076742,-1878604032,-1711276028,33874,-2096775517,1962935934,75538694,-2096740727,1962936446,75407622,-1962391927,-1633482170,81156,-1202709642,-1924136946,1343680582,16777114,-196703488,-1962522999,1183445574,105286408,-1962632541,-1667037114,209125124,1358954424,77608703,-1165686088,1347585293,-219672944,77767632,69265603,1996423424,-401698812,-1072964537,1048782196,1946158222,1577556510,104529920,326436286,294531,-1902049164,71710980,28837237,721611520,719897536,721420292,-1125625664,1958743039,124931,64284867,-1070923776,-401698736,922681559,-4717426,244338943,-942598168,303622,-1912158464,-956301308,302598,-1811495168,-1023410172,255208,1354771202,201291496,-1586268992,1178141846,-1593281272,1178141848,-2090634234,299070,-1070922124,18147408,-1559738741,1183515798,77112070,76429055,1358954424,-1175974256,-1908998192,-18428,-1607008432,-18428,1392508858,-401698736,-1566322671,-1845049596,-2097151740,300094,28837237,721611520,76587968,108314635,-397361109,-389873474,33555297,-1593418044,-1993997162,77111559,38242598,55306435,1996423424,-19011578,141869067,-1873756117,124942,53733571,1048772864,1946158224,108461830,-956269080,299014,-1811480832,384353028,-16711677,-1461189002,1958743038,1354771208,31985296,-18300160,-2097086462,300094,1048775797,1962935440]},{"sector":17,"data":[112651,251594987,-176946028,-1072971733,-1834938252,76587780,108314635,-402229505,-389873626,83886793,956599969,393547334,76691072,-1807842559,192217092,76560000,1354771201,-1023409688,16933352,74877697,76430987,-401698729,-1072986103,-167042188,-1873340555,-1310595058,-1873350517,1632270,244340311,-340659224,244340238,-352319000,-1878604026,-1023410172,67265768,108432129,77479555,-12618239,-16534986,-1710973386,33242,1459242633,76953343,77084415,77346559,77215487,62011135,1347469355,-1174387016,1347551334,8507034,-1305018624,-92864765,922698987,1603929424,1442840681,77479555,-1593477887,65733968,1342584481,8833946,-62486272,-1774780586,-1741226236,-1674117372,-1707671804,4831236,1375754938,-2141087152,-11141120,1352334454,-1023410042,117992,105286401,-2096848733,298558,922691956,-4717426,244338943,-3225624,-1207661002,-11468801,-1207656394,750421033,-1873784188,-836769778,-1023106397,102632,77635840,-1407283773,13363535,948510349,-1929329431,-384689634,512557245,-1226238792,2032045312,11528495,980688525,-1929336599,-383939554,512557217,-1695990935,236883200,9693462,1022107277,-1929343767,-385000674,512557189,2146121819,-786526832,-1871123656,113647245,-1919913493,-350744546,512594026,1676350358,-1675719280,-1872958651,326573709,-1919920661,-347921378,512593998,1206597857,1142853008,-1874793709,926359181,-1919927829]}],[{"sector":1,"data":[-351163106,512593970,736831552,-1742828144,-1876628723,1669602957,-1919934997,-349703138,512593942,267063652,-2128704112,-1878463689,929701517,1485832683,-469807090,1296912195,-1864856576,-326412987,-1193767394,1343129580,16777114,113408,-6663344,-2097151745,1562313453,1975520077,-215034,-369096502,65535,0,0,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,25506,-326412965,1125616430,-1967115453,736154050,-148081724,104412888,595001354,201734454,906262016,-1962931037,861361888,-775517504,-738242336,-1956749479,56319461,-370933791,-1933836369,777752792,1128470411,-326412987,869830174,-775779648,1942236128,920188898,656953,959895927,1979714566,212022788,1457556224,-1967115433,1356911046,1599722495,49120094,1562371467,50813773,-883751199,16973953,461677,16973896,540070,327744,16724823,16974240,542781,16973889,544440,16973892,544454,327749,78750,144101,70448,16978434,294427,16973926,286039,16973927,542602,196685,16712629,16973974,539374,196687,16714114,16973976,557413,16973904,489942,16973914,558081,196690,16720131,197019,16720139,16974236,140308,16973828,493579,327773,79192,210295,16728700,16973983,550781,131159]},{"sector":2,"data":[96749,134163,81114,16976917,545504,131163,16724826,197024,16728804,197028,16728787,197029,16728774,197030,16728713,197031,16728657,197032,16729425,328105,70445,16978434,542696,196706,16729345,16974250,542591,16973923,546752,196709,16737014,196909,16737002,196910,16737018,196911,16737010,16974128,539754,196713,16737006,131377,78196,208678,16737022,196915,16734855,197044,16736998,131380,97091,16997037,540029,16973941,493656,16973825,353152,16973841,490180,16973829,480048,16973830,480058,16973831,542631,16973953,557452,16973825,475811,196617,16711888,16974154,543665,16973954,554498,196610,16713396,16974155,542791,196739,16714091,131404,93552,224704,16713965,196941,16713257,16974158,531563,327814,78193,208678,16713244,16974159,482849,196623,16713795,196944,16728569,16974161,557474,16973833,482958,196625,16713263,16974162,467882,196626,16728578,16974163,472813,16973843,486458,16973845,472026,16973847,471868,196632,16746528,16974040,551723,196756,16738877,16974300,468485,196637,16738269,16974301]},{"sector":3,"data":[467627,16973854,558731,16973974,483391,196639,75388,206415,16740444,131551,100095,17008083,468503,16973856,537493,16973976,484271,16973857,482811,16973858,467417,16973859,528492,16973980,492492,196644,16729161,16974180,558786,16973853,539052,16973854,471881,327718,93549,17001920,545549,16973857,558713,16973858,538883,16973863,493569,131119,78753,209637,16715177,196978,16715094,196979,16715086,16974196,558753,196653,16728484,16974197,468283,16973877,542804,196655,16716889,16974199,544193,327728,100092,17008083,544212,16973876,539879,16973877,472589,16973886,471903,131139,79195,16987511,461502,16973893,472055,16973894,461559,71,0,0,-2081649835,1448548588,-1710983425,773,-141821813,-15939965,28837494,748310528,-16777216,-1207717322,-1706033151,481,15353543,26667264,1612973194,863313980,1946224118,108461870,63452927,33178,108461824,721831051,1342471686,-11485141,-16482762,565708405,15776256,-1533390766,-2097152000,1962937980,108461874,63452927,96410,108461824,-1962511105,-120518588,1342456835,-1207274241,-1202716671,-256245727,-1706012160,404,-167698967,1148454916]},{"sector":4,"data":[1946224118,138709823,72484395,200296073,-955941440,61510,-16353537,-16528842,-16495050,1183516276,66638320,-11533244,-16494538,721703478,-1202696000,-1706033151,65535,32261831,604277248,1963015171,108461878,63583999,-1157627976,1347616767,-768882805,-1070870389,1347602059,1342177720,-16354049,1962869876,141885194,16777114,1975520000,-955913373,60486,-16353537,-16516042,-1711015370,65535,-16353537,-16519114,-1711018442,65535,1460041471,108330838,-402361089,2122514608,678691052,-16353537,-1710927818,608,-16353537,1962870388,175439620,-1207405313,-88473463,-1706012160,65535,1954546934,-230257365,1962889238,74776326,50742411,-1957688764,1141048388,1067077640,-16777213,1183647350,-1706027278,65535,-15677821,1166797382,-364496630,1609106301,108462078,1342177976,16777114,74907392,253082,-1956684288,113401317,-1873273344,-326412987,-2585058,1996426358,142016266,1347469355,-2097148952,-443874579,-900899553,-1957363704,149717996,-167223669,58000391,-1593796887,1183384498,205929466,-1706028427,65535,200951433,721778112,9365952,-1878493441,327411726,-1979955575,1996488278,140413946,-1710327809,683,200820361,-12290880,1586170998,17298954,1352729972,-1593447676,-120519600,50880139,-11532729,1996424311,-25755652,737834751,-1202696000,-860225504,-1706012160,65535,-362753,-6621066,-1593835265]},{"sector":5,"data":[1178141618,-14912244,-6620554,-352321281,209125138,-16091393,1996425334,74907398,-1207819032,-443875327,705117,-2081649835,1448547564,-1962647925,1586168391,541534984,-1947318647,126551134,721968779,1183391303,108462060,16777114,-1946645760,214336503,-768313,140413951,607340426,1971338432,73370427,-2146809866,1183658612,726669046,-4697920,1979666687,105220872,-2053484480,-1929379837,1343682118,-1149185,-1785009034,184549379,-949848896,-68538,15746759,172329728,2112898617,-163148464,1962889238,74776326,50742411,1346374212,50611339,1346373700,16777114,-163148544,1996443670,-327745554,16777114,1958742784,50656788,1187448692,-335544588,-263812305,-336312695,-263782617,-351222141,142016424,-16490869,939459191,16777114,212224,100010613,-955943679,-134074,-1710852353,65535,1593067147,1575324511,1426065090,-326898549,1996445204,825864,1183383552,-2082960386,1946159231,109019910,-15829760,-1070921610,1347440720,16777114,173968128,540231670,1200295028,-27358432,-1996077269,1586168902,138906622,990266883,2114260998,84975881,-1995946197,2122516038,92078086,411335,75399936,-955941632,1094,384714381,108461904,-1962641665,1200356958,105251592,105352016,1342457347,300954,142016256,125338,-163148544,-1070903274,922701904,922682640,-1214642930,-1929379839,1343680070,384714381,-163148464,-6664170,-1207959297]},{"sector":6,"data":[-768901120,-1070903214,-2001055664,-11513216,1996484214,-230257680,-1947318741,-788234738,1354826721,737429131,100921414,726664320,-11513664,1342414902,-26032,-259325952,1575324510,1426065602,-326898549,-11118794,1183648886,-1706027310,65535,31082123,1586168902,243237640,-385649408,1586168065,17298954,1352729972,-1593251068,731448400,66638274,1183385158,140413938,-1995683957,1200354886,-1992278002,-1072968634,-823590027,-1706025472,65535,200558217,-385649216,1183514813,-1202708788,-1873805303,255191054,1183576203,-1202708788,-1873805304,254142478,-15992693,2117685876,-11701004,1996426358,74907634,516703883,-241543344,-1929379835,-969211579,1996443517,209125132,-1915986293,1344143681,-953432437,-6664120,-1962934017,-936642994,74907473,-1915986293,1344143681,-953432437,418074696,427095563,1978957369,209125140,-887041,1183515766,1448091340,400282,-196703488,2126920520,209125154,66471563,1342521862,-1962641665,1083034718,-1957683711,-970197946,-6664120,1577058559,1575324511,1426066114,-326898549,1589925378,931866116,38243110,1946288445,33701166,1048790645,1979646006,-1202301317,-11534335,-402638282,-1202713609,-1001390079,-14285730,-14284681,-1830287753,-2091259133,-16763330,-1202317708,-11534335,-402638282,-1073017905,113706612,-65482,3554947,-1003129345,-2128214946,33555071,-2128205198,34144895,-1960435081,883099207,1200301573,87466760]},{"sector":7,"data":[-1070901674,976682832,194111488,87341136,518224,1575324510,1426064578,-326898549,-1957275896,2123040886,-1427614204,-1070903285,204990544,112726,976682832,190703616,1459373705,990613736,91618374,-352321096,-1547687166,1187446842,-2080374790,12350,922697332,922682202,-396951504,1183447998,-59310086,542874,-28931840,1603000459,-754667262,-153615389,1946356807,-92372213,-955941888,-67002,-1694730497,2357,540230902,-1444347020,-92372224,-385647616,2122514592,58064634,-402614295,-11138776,-396886922,1183447910,2109737978,1007077211,1023410176,225837053,3802823,1187446785,-352321286,-286763476,105265930,-11132044,-396949898,1183447862,2109737978,1077838599,225771520,3802823,1048772608,1946157120,-92372218,1443986432,-1191414017,-397410303,113705728,64,16416387,1048783484,1946157120,1007077155,-16777216,-16557514,-1207947210,-397410303,113705801,64,113706731,65600,4210307,-402426880,-11138911,1996424822,780538,1577613288,1575324511,1426065090,-326898549,-1957275898,1996424310,112648,976682832,168683520,-1996077431,-1705968570,1014,-2080487799,13374,882969716,-28931840,-1996476255,1586232390,41368062,-991362187,876512000,359923712,56243967,3159807,1342177720,-16596760,-352101834,142016272,-1207535873,-397410303,1996423740,-59310328,8435798,-401698736,-167048133,-4717187,-1962742785]},{"sector":8,"data":[-27358266,184698761,-1955562250,-1312388101,65065732,214402040,1963984374,50722317,113707125,65596,113706731,60,3161731,-162892544,1165234181,-1207404801,-11534057,378208885,-1070923718,1347602059,16777114,142016256,-1560132213,-1957691344,1200293982,105186078,541559632,50611459,-397408187,1520696005,-955847933,15366,108461824,295322,-1956684288,113401317,-326413056,1460857987,-28915882,2122579967,159186948,-1962385781,-347600313,-1983894782,548991558,-163149490,-1946663287,78710398,2114185171,214401800,-1996077685,1166798406,-62486268,2123060971,-754667258,142476263,-1962096765,1965816950,-297366780,-1996077781,-166988730,-963967363,-259270409,16023171,1183516797,-1982269452,1983509574,-2095218954,1946219646,-129594601,2146715193,-196703473,-1980217719,1183577718,-28931834,-16222465,1996424822,133425156,990267017,-1770655162,1593722507,1575324511,1426065090,-326898549,1017206280,138813696,4064967,-1070923776,-26032,-6684672,-956301057,13830,175570688,742554,-96040704,1200347275,-129595134,-1710590209,2955,-15960321,-1070921098,9103440,983691403,-28931840,292864011,-15960321,1996425846,1354771448,2095582864,973522698,-956301312,12806,142508800,-2094566400,1946222206,209125136,1342247608,108461910,-352028929,209125132,1342247352,1354771286,151099984,1996423168,-26100,-1073020928,1586176372,860326412]},{"sector":9,"data":[1077723172,2139297140,259260468,880279379,737703679,244338880,1577719528,-1034033781,-1957363702,49054700,1074186070,-956301312,16791558,1007077120,721420288,1513503222,-399281149,922682784,922682202,28835888,1055412224,-1012992,-1711056330,65535,816037931,56271616,-16222465,1996424822,2091012,2122519787,242483206,-16222465,1996424822,780292,-963907445,1575324510,1426065090,-326898549,-950642938,64582,-1710852353,3176,1972107403,2096499458,-1310815476,-1948003580,1183387201,75400188,-15764480,1996425334,-1070901754,-401698736,1170671967,-254,1201276534,-1962934259,1600060486,-1034033781,-1957363706,49054700,73319510,74943270,38243110,1946222653,16923938,71124596,1025012737,125042949,1946224189,-1002443977,-2094660514,1964115071,-1005917387,-2094660514,1947337855,73319465,74972966,-286781808,200313604,-15895050,1996424822,-26108,183173120,112726,-401698736,-1956773881,79846885,-1873273344,-326412987,-2082959842,1448553196,3554947,-385649153,1048773345,1946222646,112645,-1070923029,-1292663,-1207933898,-11534335,-402638282,1183385095,1975520216,45607171,1023952523,1903427597,1967980861,1010729735,1702166528,-1697089793,1829,-1980742007,1187510854,-2097151758,14398,854077301,1958742788,874416936,41911040,-1961329408,1603006558,-754667262,-262274077,51136502,1187448180,-1593835022,1183383604,-16390]},{"sector":10,"data":[-1946526069,2122383991,1951072264,142508295,443893760,-335544392,1681325848,-663290112,3946239,1347469355,-369286936,28836393,-62486272,1023952523,1651769376,-756481154,1958742785,1785163,1048785268,1962934328,-226589946,-1959168768,-167746530,1948267335,943620871,678756352,-362753,518522998,1090030340,1206453108,-954864895,15366,1681325824,-663290112,1347469355,-54794160,-16559128,1285216374,-385875961,1048773049,1962934330,-663289877,3815167,1342177976,184725992,735671488,11004415,6561419,540231670,-135724172,943620864,1333067776,1962933891,-92864750,-59310250,-1946438936,57950456,-402597399,1183515388,-96040464,-1948742832,-11140489,787020918,1975925508,-663290091,3815167,1342177976,184702440,-385649216,-4194438,939968511,-2097151744,14398,-1746336907,-94467328,1208633227,1408648841,-59310250,-1962675992,-58817544,990150144,-2096464130,2097216638,2097036147,-663290001,3815167,1342177976,184681960,-1587710784,1183383610,-663289864,112720,32565328,-1577826679,1178140730,-12487432,-16751562,28891254,-1779937280,-196703236,1356351113,1100186,-96040704,-335544386,809403155,57999360,-2080446999,1946219134,-19076861,1459255039,-386107649,-125107347,58064443,-2080454167,1946217598,906413850,-16776960,-1207933898,-1706033148,3917,6567679,-16503064,-16751562,-396896138,1586231685,-1312322566,65065732,206042840]},{"sector":11,"data":[-1959758576,133626462,-953649919,16791558,1025960704,-1988868096,1967849533,-23271165,1967980605,-23795453,1968177213,-9311997,-939649047,14342,27977728,-1697089793,4233,15498883,-4715148,2147465983,244338770,1577061864,49120095,1562371467,313933,1167087646,518818645,-326903666,1040631576,-1962934016,1451951686,-297367288,-2114955639,1971322874,-49915,113717108,-65482,6567679,1342178488,16777114,1681325824,57534464,32130759,6594818,-337099127,-398029489,-1159180266,1044284406,57999360,-1929342231,1343678534,-1202667477,-1202716160,-1202716151,-1706033151,4012,200951433,-1927449152,1343678534,-1202667477,-1202716416,-1202716409,-1706033151,65535,695517195,384321165,178256,-26032,-1073020928,1048815477,1962999862,-92372072,-1919781632,1343678534,-335822872,1514046352,494141443,56237707,271796214,-1202515083,-1706033148,65535,56243967,16777114,-26112,1692991488,49120255,1562371467,313933,-2081649835,1187448044,-2097151746,1963000958,138840837,-1070923029,-2080618871,14910,512434293,1207304292,645138482,1077102582,1187455093,1392509438,1342177720,33155152,512429547,2139291748,108265524,-1993062517,2122579014,561316100,972965515,427034182,-16762205,-16751562,28838006,1307070464,142016506,1090970,-62485760,-1034033781,-1957363706,876512236,259260416,3159807,669850,872859392,-1962934272]},{"sector":12,"data":[1438866917,1048833163,1962934324,809403155,208928768,3159807,664986,3449600,-1962920799,516120037,1430622296,-1910575989,82609112,-1946801322,456984134,1998877696,212268,305995124,-350391296,1208008195,803980939,-347078466,1258340087,12514027,-1091703987,-387252197,-347274818,2440675,641591156,1037464576,-495714265,1946167357,1590553555,-1962742397,1297948645,1426064074,-326898549,727078668,1996443840,296720900,-467009536,-1962654071,2139817566,2113866498,175606532,108461902,112727,7071824,1183578251,-1311274234,65196804,787906,-939637111,64582,133617803,-1960217340,1077939783,-1946532215,1191180894,-1744336134,1039943305,-277610464,-11485141,-6620042,704643327,-62486044,956581515,74775622,-1586104517,956581515,91552838,-335544392,1590135554,1575324511,1426064578,-326898549,-1957275900,2122516598,276627462,294531,1149961854,132859914,65781803,-1996077429,1183579206,105251076,956974219,125568582,411335,-2096239872,2097153662,172264199,105285960,-1324974453,65524484,214402046,972834443,91555398,-351910261,243106568,-339774464,-1956684045,113401317,-326413056,-1962742653,1200293982,-28931788,359972875,607340426,1950366912,75399948,-2096139264,1946158718,142016265,-1996485400,1183579718,1575324670,1426065090,-326898549,-28915966,1586167808,860326404,1077723172,-593427083,-1961432317,1207305310,276039730,-1995290741]},{"sector":13,"data":[-1072955834,547423861,-28931836,-1946270069,46292453,-326413056,3278535,-6684671,-16776961,-1710880714,65535,-1979425141,-1071369401,611598396,-401698733,1996423354,18266116,74907472,-11485141,-402638282,726728523,-1706012480,2714,1342177720,660122,1575324416,1426064066,-326898549,2122536452,1148452870,294531,1187448692,-351997700,-62470395,1996424088,239442438,-259325952,-1946394997,1149829703,-1995994352,1200296516,38218502,-1961606007,1143669831,373590290,-1710852353,3824,1575324510,503317698,1430622296,-1910575989,1007077336,-16777216,-16751562,-1207933898,-11534335,-402638282,726728375,1347440832,-2081006360,-443874579,-884122337,1167087646,518818645,-326903666,-1957275890,-397015434,-125042999,58064651,1459671529,-1705983957,65535,1048836235,1962934362,-339727612,112643,-1980086647,1183446598,-196703748,15877831,860157440,-2094565952,17112126,512434293,2139292892,376766730,32786119,373195520,175440128,33179335,-62470400,1156972545,91496499,32786119,-1103742720,-955615999,128070,33179335,860129792,-2143502300,1156978037,91554866,32786119,-62470400,1187446785,1459618294,1357906104,-1695254785,5229,-266291113,-59310256,1342106,817387264,1996443888,344431350,-1202257920,-11472800,-1801784714,1459617812,1357910200,-1694861569,65535,-310157474,535137026,46812509,-1864856576,-326412987,-2082959842]},{"sector":14,"data":[-950598932,64582,-1962260850,-1977218946,1004810757,175375942,108314634,-62455993,1183575275,-310157316,535137026,113921373,-1864856576,-326412987,-2082959842,1465257196,556675,-840367235,209125120,1358792936,1342177720,-125720,1050282614,-1962934253,138841072,-1962764056,1207307358,57942067,-1962896663,8398085,1963345467,8775939,-1962117377,75012,-6681996,-1996488449,686553670,16777114,-96040704,-1962123637,104531013,343672070,723797899,103489607,1161364742,1208316424,65788043,-1928831605,1343681094,-16353793,1166738549,172294918,71666512,-1705983229,1145,-1912965377,1343681094,115866,621054720,225705985,-15960321,-6620554,-352321281,-92864760,16777114,2133164288,105286655,1996424457,325622282,1583284224,-1962742397,1297948645,-1946154806,1430622424,-1910575989,1022133208,-1983892649,1183441478,108956644,78185867,-1705806592,65535,-1946401143,1200426589,-1202708990,-1873805303,-23468018,-506231,1183710326,-1706027326,1288,63063691,1183435334,-59310108,-1928438389,1344143943,-1694992641,1467,-1948023,-1315242890,-352321515,1979682851,1226766,1183651408,-6663962,-1929379585,-1959336354,1183384135,1200305890,-465139452,-1948105077,-2090867626,-443874579,-900899553,-661913598,-1957345904,-661774612,1443556483,142510935,-1707837953,5387,-1070337909,-1070447114,111215476,-62486267,1144635443,956658694,393545796]},{"sector":15,"data":[1463055871,-231681,-1962639818,1160456773,362434598,-1929379836,1394013278,75370123,-62485679,139199312,105120593,361273936,243990528,854066116,-96040192,75499051,-1946794359,-402405362,1996423201,108461832,-399215105,1979705594,365074996,1583284224,-1962742397,1297948645,-16775990,-1927936394,1364259910,16777114,-661863680,-1957345904,-661774612,1444867203,242649943,252477059,1586318965,1393972960,-1705830826,65535,1474330251,63190783,19866,-1070377216,1149980752,642001706,742689616,1344816171,1342238904,1342185912,28570,-11053568,-402640842,-6625158,855638271,317430208,209125206,-16091393,1996425334,-26106,1583284224,-1962742397,1297948645,-1325397302,-1914571248,-134017924,50345155,17808896,56654080,18168576,53999872,134396673,50349056,118574593,50352128,17826304,52592640,18026752,56853504,117789697,50354688,18171136,54004224,135680769,50352640,-15441920,50371328,-15479808,50372352,18319104,52073216,135665665,50355456,18196224,54008320,18304000,52009472,18324992,57121536,18191616,57058048,17024256,55649792,17099264,50475520,118919169,83888128,-16709376,50421760,17796096,52606976,118950401,50333952,134305793,50331904,134225665,50332160,18275840,56900864,18232320,55754240,18024448,52772608,17825024,53788416,134301697,50333952,17561088]},{"sector":16,"data":[52675072,17822720,51266304,17474048,56804608,16838656,55496192,18215936,37277952,-16708608,50421760,-15285504,50422784,135756033,50339072,134389761,50340352,18012160,53959168,18294016,57039360,16994048,56942080,18235136,54059264,16854272,55403008,135747841,50343168,17144576,55764224,17501184,50849024,17083136,56978176,134363137,50344960,18009856,56880128,17438464,53637888,17730560,2618368,0,1167087646,518818645,-326903666,-11118816,-6680970,-1996488449,-661914554,1963001846,209617676,-1962511360,1200162374,-1983894776,1183441990,-163149334,-1995815285,-125047738,-1995946357,1988884550,214336508,15091399,22931712,949379,-1705633932,65535,-1980610935,100922454,1149830224,-339571958,172279560,1386283008,138709252,15105667,1183384437,-60912658,1963001846,12511491,1613038730,-96040704,209043467,1088833163,1946830649,9496835,-1980348789,1586225734,-431584260,172439872,1183518325,172243446,1149961854,-498693878,-15829249,2122574454,74711290,65781803,50332088,-11475386,1996481142,183298296,-2082322807,1946221182,2114323253,-129595132,-1995815797,2123101766,-431584276,1089095305,-1948236151,1194982494,-15502070,1996426870,1996443878,-126418954,-1995787800,1586225734,-431584260,172439872,1183516277,138906082,-1962640247,1149892678,142344966,2112126521,-461469380,83245035]},{"sector":17,"data":[-1961593504,1141110854,-60912886,2114471739,-427916523,51344384,1183575678,-129595128,-1995946869,2089414214,-129594620,-1962523511,1174473284,172264440,2113291833,-163149565,956843147,58584646,-1947318647,133626974,-1962380031,-956043706,-2082191735,1191121094,-60912666,971392651,58591815,-1946249751,1177281606,-2147089654,105351428,-1948023,-6680970,-1962934017,1600053830,-1962742397,1297948645,1426066122,-1957237621,1149895798,1019225139,-166235072,1965044548,860157452,1443263504,16777114,112640,-1070923029,1575324510,503317186,1430622296,-1910575989,1988843224,1654281736,184549378,-1978305344,-1071369404,208945212,-1996077429,-397003708,49020837,-2090942421,-443874579,-900899553,1478361092,-1957345904,-661774612,108432214,47028822,-1073020928,-397015948,-2090926215,-443874579,-900899553,1478361090,-1957345904,-661774612,-15930237,1996425846,108461832,-1728050760,-6664110,-1996488449,1996485702,-6664182,-1996488449,-310117818,535137026,113921373,-1873273344,-326412987,-2082959842,-1957290260,1187449974,1442840814,16777114,1975520000,29747459,637951684,637695999,638089215,-1710852097,65535,1039287945,175374592,1946223165,-373282018,1187447202,-16776724,-6681994,-1996488449,1451876934,1975651300,-941430007,60486,1589962219,126494434,1183441962,75238,1961641531,22341891,637951684,-1006352501,958849630,57934151,-1962851863,203810374,277760]}],[{"sector":1,"data":[-605486219,539904,-655817867,-297351424,-1070923775,-1980348791,1589962822,1200301794,-96040701,876907350,1358186121,-362753,669574774,-163149567,896909323,-1995291509,-1072958394,1156977269,208930866,-1996218207,-1705577402,65535,-193527978,-362753,-135731594,-163149568,91537419,31999687,860129792,136700970,-129595136,695582731,15236739,1190536053,494207718,16154243,1048778612,1962934378,1996445200,-92864524,1342210232,-270004592,-163121663,-2091158271,1946220158,860157452,-2096729056,1946216574,-159481015,-2096270336,27198,2122529909,913637624,-394362026,-1206094848,451608850,-352317256,1161219,-26032,-1073020928,417923965,-1203639297,-11534063,-1070859658,1375732154,82221648,2122514432,678756600,15236739,1190535797,477430502,16154243,1048778356,1962934378,1996445199,-92864524,-1873756117,23128078,98715267,-2132392202,-1981217931,175570942,16777114,-297366784,49120094,1562371467,576077,-2081649835,1187450092,-2097151750,1962936446,11069699,-16222465,1911031414,-196703999,-385649344,1187446934,-16776454,381160054,1996443649,1354771208,85826128,1996423168,105945608,1183383552,-196703234,-523041615,100550147,1183383564,-153580554,359927815,-1207273729,-11534057,1183515255,1347590644,16777114,-161576192,52758410,-62486272,-1710721281,1364,-16222465,-1070922122,-401698736,1183384631,-1965519882,206087,-506231]},{"sector":2,"data":[-1710870986,1493,16285315,2122516085,74711292,33181312,-1946532213,146955749,-1873273344,-326412987,-2082959842,1448543980,1183577643,139394824,1299496971,-15698177,1183518326,67118342,-401698736,-125107237,896859915,1963197942,241011495,1983461259,-1962705656,1166739574,507527182,209125200,1443526399,476570,173982720,50726,103692031,437402,1590070016,49120095,1562371467,838221,1167087646,518818645,-326903666,209125124,141210,1958742784,176063278,-148343808,67110470,1996426357,142016266,-1996479512,1996425286,175570700,-1962379521,-2145057210,-6664192,-2097151745,-443874579,-900899553,-1957363704,183272428,1187468887,-939524104,63046,-1710852353,19,-113015,1996424822,1354771204,350752400,200837891,-1958382337,1200356958,-129595126,78770315,-293345581,-2081225968,468389062,-2080878849,2080438398,1962359578,268760598,1149961844,-163149566,-1592725885,1178142254,-2263562,-1710870986,1716,-1710852353,1883,1593329291,1575324511,503317698,1430622296,-1910575989,283935704,1187468887,-2097151752,1962938494,-373282043,1190593027,1946681350,-1983894776,1183386694,105314058,91488512,-15841593,276234239,-1961986305,2426438,244338692,-1962775832,105314296,1551106560,-1049297141,105789067,69724247,1149878315,105154824,504382861,516393808,172264272,-523041615,-953432573,1342178349,16777114,172818176,268725379]},{"sector":3,"data":[-1996209013,922742854,-744880594,-16777215,-16372170,-1070862218,-26032,28835840,24242432,15877831,172395264,1946961419,105313804,-1960217596,1183386182,105314034,188773504,-1971751681,8398085,1475888777,-1962694424,-1593422282,1183385134,14936336,-15960321,1894255222,-230258430,-847921141,58064651,-59671,-1710870986,2042,201263849,-15960577,1083838582,-1962934264,-1593119760,1183385134,1312197392,71600902,-1996484603,1996484678,148281872,1996423168,-260636912,-1705983957,1898,343261195,67520246,-991362188,-227082242,16777114,-21370624,-15698177,1183518326,67118342,-401698736,-125107901,209059595,-1710196993,2246,183234699,-1996083551,915083334,1183516238,71600624,185222399,-1960872705,-1924129081,1344147525,-1324727157,65065732,768027590,-1706033148,1477,2122520043,259391246,-1324712821,-2081959164,-33353489,-1962096765,2133132870,-129627392,2122515849,108331250,-2147277440,-1070923251,-1995946871,1183516228,239438322,-1995946357,1190527557,376705030,82745936,1183383552,-2133292038,1996423439,148806152,1996423168,87071248,-1981218816,-2090901762,-443874579,-900899553,1478361100,-1957345904,-661774612,1988843095,108956424,100244054,-1073020928,-16035212,2088967540,896794642,956571809,762581572,-1877838593,25552910,1197255,-2095125760,1962939004,843380248,-15567864,-1207721930,1385758721,-26032,1149829120,310149906]},{"sector":4,"data":[-15895552,-1070919052,-401698736,48955932,1600045099,-1962742397,1297948645,-1325398838,-1914571248,-134017924,-1864856381,-326412987,-2082959842,1465255148,-16220541,-1070398091,-16741911,-610661770,-1962934265,108954608,-1961724928,-1073018810,1144775804,-402230518,1189871549,172264336,-335563544,621120331,1183383568,-14387974,1996423797,1354773256,-1528295792,-62486017,1946157069,175570702,511130,-62485760,-2121256213,64078,1166743157,138820354,1183518325,103719690,105789065,350996363,-1928269949,-130347964,1996467059,165779978,-1070399488,-310157729,535137026,113921373,-326413056,105286486,1946437131,108461875,-1710983425,65535,1086058635,50680576,-6664192,184549631,1343583424,931780747,1394492227,-16353537,-6683530,1476395263,1575324510,-1946155838,1430622424,-1910575989,4372696,1882192,172726864,-1073020928,1347426932,160930384,-661979136,470042567,38258432,379256831,1476395018,-1962742397,1297948645,-1864856373,-326412987,1457032734,105286487,745848843,-1706012592,2702,1150021771,-23074806,-396950293,-276627339,205819152,-227280837,696218,136157696,28311552,-310157729,535137026,46812509,243968,146342891,-1864856576,-326412987,1373146654,-16091393,1183516790,67118342,-401698736,190447195,555578560,-661977522,-1054668917,567408464,105286415,922683145,-509999570,1476395018,-1962742397,1297948645,1426065098,-1957172085]},{"sector":5,"data":[1166738558,1958742798,67499788,1342600448,714394,268826368,-16223232,244318837,1610562280,-1034033781,-661913598,-1957345904,-661774612,1443032195,-62470313,1317076992,1946157064,142016303,705690,-1947170048,1144718918,1024815882,276561920,-1946304280,1058053,1166739060,-62486270,-1710721281,2875,1610368651,49120094,1562371467,313933,-2081649835,1465256684,16271047,71731968,-16366079,-1717957514,-1962934261,-25872,1183383552,172264438,2081048121,13232387,2131248697,172395512,-171800,922744438,922681420,28835918,-6664192,-1560280833,1183515970,-28931830,-946836757,64070,-1996077429,92998725,1962935333,241011520,963959563,503465869,637008,-26032,1183383552,241011708,561252155,-1913227521,1174602311,1344159996,1177225099,-1706014468,3103,88212995,-335919479,105286400,-1946532351,1178335814,-1996261640,-947652538,-28901616,956843659,41811526,1352764907,-129629948,-401979765,1317797057,72231928,-1995815285,166460998,-2096476791,1191121095,-28931074,1913144891,-159973393,16777114,209125120,770202,-129594624,-443851169,705117,196633,66618,208504,67704,217732,16714054,16973974,461411,16973912,461372,196698,66280,208402,67846,16998546,461442,16973829,460808,16973830,461665,16973831,461803,16973832,462041,196617,68724]},{"sector":6,"data":[217790,66646,16983359,459929,196627,66053,216268,68594,211153,16712612,196970,16711772,196973,16713259,196975,16714834,196977,68817,16988385,459415,16973884,459427,16973885,459527,62,0,0,0,1167120524,518818645,1465309326,350470195,-1705947056,65535,-1709307165,65535,780375,-310157729,535137026,1439386973,-326898549,71731970,-402415453,-119010729,95807492,-402527000,820512403,9037825,-402285592,-51902216,571403,-26032,1085800448,-157200384,1049861,17406544,379781120,73328644,16777114,88776960,-1588528943,-120519348,-26032,922681344,-6683128,-402652929,28839480,1389505408,1354771280,-805258672,-1588572078,103482638,-11533208,-16445386,721709110,-11513664,1342414902,-26032,883097600,172877830,-1962933832,46292453,-326413056,1460071555,84975958,1645120409,-1543899388,171771362,-955875840,168157702,4241408,964688,98709239,1342195205,16777114,-2081387776,-761065786,-2084140283,-1566372154,-2084140285,-1163718970,-2084140283,-626848058,-600405755,85112836,-1070903266,922701904,245433616,1745234693,-6664188,721420543,-1592595457,1149830420,-2082567422,413208262,105351429,-499238585,-941064443,580,-964436341,84844814,1577469833,1575324511,-326412861,1444211843,15615687,-294221056,1438181073]},{"sector":7,"data":[-296842752,-754851456,-264074784,-2081536257,2080960126,571620,28856400,-1924116480,1343680582,16777114,-330921728,-26032,1352859648,-327745787,16777114,1354771200,122266,104243968,1342177720,125338,100967168,1342178488,16777114,68985600,1575324510,-326412861,1460726915,74877782,1347469355,-1710852353,65535,-125107063,964695,-263811760,-6664170,-1962934017,1149891654,-230257916,1577206921,1575324511,1426064578,-326898549,-1202301134,-4584427,-1706011905,65535,1342575779,-1728052808,1790464082,40745474,1922715730,-16777214,-1207561162,1385758723,-18352,1392508858,-26032,922681344,28837396,1347590400,-1173611080,1347616767,16777114,-834238208,101988095,-26032,1183383552,-6663984,-1996488449,1451883590,-60898050,50087555,-1559786714,1586168928,-62487556,126559746,-1207673181,-1952907200,1183054942,-1960443140,1846446351,-1543899388,1085801578,1586206976,-62487556,260777474,74452617,1822685687,-1556070396,1788937320,525572,-1207671133,-1952907232,1183054942,-1960443140,1980664079,-1543899388,548930674,1586206976,-62487556,260777474,74976905,1956903415,-60912892,50087555,-1559786714,1586168954,-62487556,126559746,-1962639709,1183054942,-1960443140,75539207,-556251449,-767113469,451608586,-2082972021,-1006315450,-1960379266,1435182597,-1995994878,1182990935,1183515900,-766574638,-596262901,-1697614081,65535,-1697614081]},{"sector":8,"data":[65535,-1962597912,-16363490,1186464887,-11526651,-1711030730,65535,1342180792,119194,75801344,62011135,383403661,-26032,1183514624,99394522,-1545320821,616432674,2147465220,-964471216,-32118778,1350565560,113673046,-1191310616,1448116221,-402209149,-54985217,-2091495297,-186120506,2147203325,-964471216,-35002362,1350564536,113673046,-1191321880,1448116217,-402209149,-122094125,-2091495297,-924318010,2146941181,-964471216,-37885946,1350563512,1342519480,-1577209112,-523172736,69731843,-331940016,-26107,111345664,72786181,-120457007,-1593550173,-1181154216,-101253117,-788243293,-1207687618,1344144624,75380479,721749665,721692678,1342472198,50603681,1342471686,721749665,1342472198,308122,60340224,-1070903266,648106064,2114323204,922701828,1201276166,-1593835519,100861190,1688405120,69640452,69993987,-150993991,73573353,-443850914,-1957313699,49054700,52954766,637934241,-1906664541,-1593628154,-1557789156,-1070900579,-6664112,-1962934017,1438866917,-326898549,1354771202,-1157627976,1347616767,336282,1354771200,-1157627976,1347616767,16777114,738627072,113714691,1400919200,16777114,1575324416,-326412861,-1191198488,-4584397,-1706011905,580,899152,-1706012007,65535,53347982,1519887142,-1726576346,1354771290,-26032,-727515136,-703166203,99792901,-6664162,1023410431,158597132,1342180536,386714,-1073297664]},{"sector":9,"data":[-956301311,17071110,104773632,-6664162,-2147483393,409150,113708149,-65088,75237063,2090926080,28615428,53479054,637944993,-1906656861,-1593626106,-1557789114,448289467,-1706025466,65535,1946158141,964617,-26032,-443875328,-1957313699,1644611564,1560281088,-326412861,1459940483,1354771286,-1706012592,1558,721796259,1347440832,103062096,44236800,1354771206,-1706012592,1744,-955961181,413702,78561024,1352791595,-1207596794,1069157397,726684162,1347440832,-1706012592,65535,-972798583,-956299451,66117,-947665013,105947912,100565830,-661926788,-1710983169,65535,-1962691933,-16363490,146277495,-1634054144,-1560281082,109970704,-1557789900,512449205,2013202000,702468,-26032,245563392,906399237,-1214044669,88520794,-1070903266,922701904,922682640,-1717959410,721420292,-11513664,-16445386,-1710944714,65535,1577327267,1575324511,-326412861,-1207767933,112856122,-1202695673,-4584367,-1202695425,-1706032652,1814,-26032,985137152,119847436,1924681810,-17908,-1070903214,-26032,-1706033152,65535,-1173603656,1347616767,-1173593672,1347616767,-1173598280,1379991551,-28930736,45633558,-6664192,-1912602369,-1979500538,942079558,1946963718,1335895570,1385797644,-26032,1178075136,-1207601666,48955393,110018603,-1557789894,-1070900573,2130753616,-1706012007,1937,721815715,28856512,1347590527]},{"sector":10,"data":[500378,106341120,-1202667477,1385791236,129210960,-291307520,1354771205,-1719697224,-996519854,-1560281081,-1070922256,2139207760,-1706012007,65535,721746083,12079296,1347590527,517786,103588608,-1202667477,1385791233,133667408,-626851840,1354771203,-1719729480,144330834,-1560281080,-1070922612,2130950224,-1706012007,2073,721663651,79188160,1347590527,16777114,98083584,60831487,-1728052808,1033523282,-1560281080,922682400,45613984,1347590400,16777114,64791296,-1017256565,-2081649835,-1923739924,1183446598,-27882244,1187444267,1589903610,1065362948,-14781152,-219478970,972193408,179314815,-990220554,1191117918,117581316,1183330348,73319674,-2012771802,809300550,1589959293,-62455812,653936266,-2092562552,-1233386498,654073483,-1962932282,1452013126,-443851016,311901,-2081649835,1448551660,-956056385,64938054,1119417899,-17908,109989970,-1977220292,705422492,-2088268289,-17908,-457682862,-17822,1183666258,-1202710812,-1706033127,1859,-1948230005,39291655,-1982052727,2122374742,242483428,384059021,-13572016,-1982052727,1996480086,-596181026,16777114,-1982166016,46629637,-2082447733,-1962614714,1452006470,-1995994658,-2092563881,-2105799938,-443850914,-1957313699,585925612,16777114,-565802752,-532247216,-1030074346,-16777213,-6627722,-1593835265,-1901918902,88908033,-1593732957,-1834810318,71737601,-1593731933,-1767701242,75407617]},{"sector":11,"data":[-1593730909,-1700592512,374785,75378423,-1207853917,787939333,-1633483648,73441537,-1593728861,-1566374818,74096897,-1593727837,-1499265940,74621185,-1593726813,-1432157068,-532247807,65553923,-1559986170,1252065708,28222213,721767585,-1559951866,2057372080,28484356,-1560005471,1151402422,28877572,28968647,109969409,-1591344322,-1130145117,1575324417,-1873273149,-326412987,-2082959842,-1957295380,-6683018,-956301057,6150,470220544,81568005,314069022,-1706025467,2656,3687622,-600375466,1354771204,16777114,-163148544,314069014,-1706025467,65535,688160417,1174533702,1183667962,-1706027274,65535,-26026,-1705639936,65535,16777114,-310157824,535137026,46812509,-326413056,-16061309,-1207721930,1385758721,440400,-1706012007,649,200689289,-10324800,1342414902,169626,-1617276928,-1560281086,378078378,1183384748,-27883012,1098170891,654073540,-467007606,-939899255,63558,-500085,1183579206,-27882500,78251562,101353352,33179275,1589967942,126494460,1183441962,663234298,-2080880897,2081028222,1575324623,-326412861,1461644419,-196688042,1187446784,-352244490,4241529,-159973552,28314,-1192195328,-1078326199,726684171,-1202696000,-876977436,-1957670389,-11526458,-644155786,-1996488693,-1072963002,-24428684,1183523819,1002832886,-2145356089,343212093,97664,1183518325,1002832866,-955943225,128070,-193035449]},{"sector":12,"data":[-2083032064,1962996862,1268405777,-2097151988,-345704890,-196688123,2122514433,-2123104012,14843523,-1863777419,-1191277824,-4584375,-1957670145,-1202708793,-356883740,-1924115960,1343677510,1342181304,587930,1958742784,-465138347,-1929754999,938212438,4161574,1191128693,130426618,-94467282,653936383,-1958344762,1191180894,130426618,-94467249,653936383,-1957820474,-970524066,216727559,-990230785,-2144929186,-1066062273,384059021,-26032,-2142830592,1962999677,-498693127,-952383997,1927873398,-6662401,1577058559,1575324511,-326412861,-402645016,-739770229,24700928,-402579480,-219676138,77785091,-402373912,-443874888,-1957313699,49054700,84975958,1712229273,-1543899388,748881194,671532805,-1207959291,-1202716608,-1706033126,3320,1153953931,-947912426,6212,-1996162911,1153896004,-939524350,-64444,-1996250975,80153156,1153892363,-1962933744,-1706025274,3364,221026902,113704960,1588,1575324510,-326412861,-1207767933,-1202716608,-1706033126,3395,-1946270071,373802968,1204256768,-956301288,-956268537,-64953,-16496697,60858879,-1962260599,-1706025277,3446,-1694599425,3454,-1017256565,-2081649835,1085801196,448286720,-1785049088,-1996488691,-661914042,-1996093279,1204227655,-955519466,-59321,-16627769,71813119,1204289535,-1593834232,1200161696,516131594,231512656,1996423168,232037118,-443875328,-1957313699,49054700,1342193848]},{"sector":13,"data":[1342184120,912282,-28931840,144824459,239569158,35014599,407357312,1204224000,-939524350,-64441,403195847,60858624,-955627639,-1962932217,-1706025277,3614,-1694599425,3622,-1017256565,-2081649835,1085801196,448286720,1033523200,-1996488690,-661914042,-1996093279,1204227655,-955516394,-59321,-16627769,71813119,1204289535,-1593833976,1200161696,516131594,242260560,1996423168,242785022,-443875328,-1957313699,49054700,1342193848,1342184120,954266,-28931840,144824459,239569158,51791815,407357312,1204224000,-939524350,-64441,-1996250975,1204226631,-1962923000,-1706025277,3778,-1694599425,3786,-1017256565,-2081649835,1085801196,448286720,966414336,-1996488693,-661914042,-1996073311,1204227655,-955517674,-59321,-16627769,71813119,1204289535,-1593833976,1200161696,516131594,-26032,1996423168,194747134,-443875328,-1957313699,518816748,16777114,146688,1994982260,204060673,1376737978,1354771280,16777114,-297367296,-385649344,1996423517,1354771438,178256,255433296,1183383552,-229209616,1342194360,-260636846,16777114,-465139456,-26032,1183383552,-363427352,737048319,1347440832,16777114,-294191360,-1411329,1996482678,-25872,1996423168,-25874,699924480,-17908,-6664110,-1006632705,-1960384418,-431585017,38243110,-1946925431,20833862,1024488448,58523650,1023465705,1149108227,-1962880791,1452009542]},{"sector":14,"data":[263658,-11382702,-6625162,-16776961,-2003114890,-1962934269,1183441990,537315322,-956301312,16786438,-428409088,-1694861569,65535,16777114,9431296,652762820,-1996208245,-1960385978,1183385159,1200301822,-330921720,172460838,653674121,-1995683957,-1960379322,1183387207,-427916296,-1207601917,65732616,-788527432,-398065184,-1935617,1996488310,-159973396,-1411329,-1248139146,-1996488703,2122578502,208995302,-59310256,-1694992641,65535,-1696303361,4003,-1696303361,65535,2098887,113704960,65572,1342177976,-1946197527,1438866917,-326898549,4241410,1751120,281320016,1183383552,-1579643906,1200162312,373802766,1204227073,-939524328,-64953,-16496697,134727679,60858624,-955627639,133191,1344193419,1111706,-25755904,1113754,1575324416,-326412861,-1207767933,-1202716608,-1706033126,4427,-1946270071,373802968,1204256772,-1593835496,1200162358,50841360,38258432,1204289535,-1577058556,1200161696,516131594,293771856,1996423168,294296318,113704960,1458,106432199,-443875328,-1957313699,49054700,-1559994207,1587610852,96903940,-1560005471,1050739942,97035012,-1559986527,-324860464,75538692,-1559900509,1085801710,448286720,-1600499712,-1996488692,-661914042,-1996093279,1204227655,-955512554,294787143,-16627769,71813119,1204289535,-956299256,-1593832697,1200161696,516131594,215259728,1996423168,215653118,163053568]},{"sector":15,"data":[-17908,-6664110,-1560280833,-443873756,7717725,38993925,27263231,101187843,4194312,153420035,4325384,264568835,9044223,250675459,4915207,257884419,4980743,29950211,4521992,98042115,6619140,264241155,9240831,277151746,201392129,230031362,1661075457,149028866,209911809,123601155,5242887,90833155,65537,257032451,5308423,235667458,1661272065,85000451,131073,256508163,5373959,241041410,1912995841,252313859,5505031,213778434,1661468673,291635202,201916417,137035779,9830655,292290562,1661665281,109248771,5242888,91947267,65538,35324163,5373960,171966467,1686765569,246415362,1661861889,219283461,20054271,224657410,1662058497,261816579,393218,61931779,5701640,176160771,403701761,277807106,1662255105,104792066,202702849,94306563,65539,39190530,27263231,157483267,6094856,170328067,328597505,283377669,20971775,42205186,203227137,229703685,1661075457,125829123,11337983,235339781,1661272065,131399683,11403519,240713733,1912995841,34078723,11469055,213450757,1661468673,83296259,1562509313,291962885,1661665281,84672514,1420296193,250150914,204013569,7929859,28705023,246087685,1661861889,219611138,20054271,279248899,3735807,224329733,1662058497,277479429,1662255105,88276994,204668929,204603651,7798792,87097347]},{"sector":16,"data":[1571880961,92864771,65543,12976131,36831233,1310979,262151,283705346,20971775,275644675,327687,115802114,205127681,279773443,458759,113180675,1681719297,147718146,205651969,253559043,983047,84475909,1420296193,272892163,1114119,254148867,1179655,272367875,1245191,175374339,323223553,188940290,206110721,1835267,1572871,120848386,206503937,72482819,1380712449,116326402,206635009,117309443,-2033188863,119275523,777060353,156565507,953221121,6160387,1574109185,9633795,928645121,175767555,945487873,249102595,2818055,271843587,10682376,120324098,207683585,88604931,3080199,85524741,6815748,189726722,1659109377,158007299,954269697,89391363,3276807,173080579,291766273,61341699,24576255,270467331,3145736,116916483,3735559,190513411,3801095,224002050,200146945,179044611,3932167,108003587,3407880,180158723,3997703,105644291,3473416,180551939,4063239,118358018,208797697,59769091,4128775,9043971,879755265,85721346,6815748,245760002,200605697,39518467,4390919,29229315,3932168,176488451,980680705,295108867,4521991,235012098,200933377,0,1167120524,518818645,-326903666,-11053562,1996425846,108461832,-1728052040,-6664110,-1996488449,1996487750,-6664182,184549631,-1959496512,-6663952,-1962934017,1959398344]},{"sector":17,"data":[-1924115930,-397346746,-1073020886,1979205259,-6664184,855638271,-1705619264,65535,-26026,1599602688,49120094,1562371467,445005,-2081649835,1465256172,16777114,1958742784,-129595058,-1912177013,-1070397370,-1962571226,279463920,-1960441739,-96040699,-812955833,-2144943476,74776637,-768358093,-1979953527,-1977156010,-1073068283,-956827531,309592080,1183667974,-1477947142,200838143,-1727826494,1996436971,1354773496,-100609,1996487798,8108282,902691,-6664191,184549631,-136547136,1946190022,73304974,922240651,1451952009,1606912776,1575324510,1426065090,-326898549,509040132,209110524,-1962377532,1183515742,-1981230842,19267142,-62486272,2085353515,-28406988,-1375961597,-1059991413,-1031090141,-523181871,-523181871,-523181871,-963977007,-523181871,-523181871,-523181871,-997531439,-338369878,1583292361,-1034033781,-1957363700,149717996,-65120426,-1005685051,1586170494,33260292,1183532926,-137219322,-28931597,1258835595,-1946657143,-1981679677,-779355066,1579933323,-11842564,763166286,-1946395133,-1981230654,1325398598,1139571962,-1946973373,-129070332,69464579,-341050654,105286633,-787978505,-204960792,1583292325,-1034033781,-1957363698,49054700,176063318,-15043584,1996425846,108461832,-11485141,630850678,-1962934270,1979059184,102015258,1342850697,-16222465,-1070922122,74907472,181146,200313600,-16026378,-1705637258,723,-963907445,1575324510]}]],[[{"sector":1,"data":[503318722,1430622296,-1910575989,175570904,-16222465,28837494,-1914155008,49120255,1562371467,445005,1167087646,518818645,1996478606,142016266,-1207535873,-397410301,-310116504,535137026,113921373,-1873273344,-326412987,-2082959842,1448545516,-1962510709,-1073000762,-1070922379,721456105,242679807,-1324595573,1089000196,1347605035,-1728051528,530206802,-1996488704,-1072958394,1996445812,731533326,-1996488704,-1705969082,1454,-1980348791,-1039402922,1719745652,-1006629108,1191179870,126494454,-125049814,-15972725,-1073017778,-29676683,-24444290,-493825,1996486262,142016266,70949463,1996423168,67345146,1589903360,29763080,-339244288,-159514363,1600043499,-1962742397,1297948645,503319242,1430622296,-1910575989,485262296,-16222465,-6683018,-1996488449,1187511366,-2097151770,1962936958,142016288,721843967,-1706012480,65535,185222793,721778112,32762304,-1685817,175570943,16777114,-364476160,200038025,-15370814,-1070921098,-59310256,91265616,-1073020928,-722742924,15105667,1996434804,108461832,16777114,-431585024,-13994944,1996482166,-361299988,-1694730497,65535,-15305664,-73734538,-1006632957,-2144933282,510984511,-352321096,-427916517,-16222977,-6625674,-16776961,1637485174,-385875963,-1070858379,-990886263,-2144933282,1946157439,112645,-1070923029,-2080881015,-1962738578,1452010054,132588,-11382702,1996483190,-25860,2122514432]},{"sector":2,"data":[779354352,-1996198239,1889663558,-163149564,-1996199263,1822553158,-230258428,-1947574588,-120458170,-1962440410,-120458682,38242598,1990269163,-96040700,-1996195679,1923216966,-196703996,-1996196703,1183576646,984564,61992996,1317796051,-136195598,787945,-2080618871,1962997886,11659523,66733707,37615174,-385646848,2122514595,494207216,-1947574588,-1960379826,-101213945,-1962440410,-1960380850,-140967353,1200170745,-362888190,71797542,653149833,-788117621,-398030368,138906406,-1947974007,-1993935802,1183515719,1200170738,-196703482,603983621,-754732560,1200170744,-92372216,-1961264126,96636099,1347551244,201704331,-11513344,1996481654,-69211928,49708675,1183523708,-329872406,1375734789,-364475568,1375734789,-362888112,142081830,-1542401,434697846,175570940,23706,175570688,-11485141,-1705968522,65535,-2096478581,-443874579,-900899553,1478361094,-1957345904,-661774612,-14488445,1996425846,108461832,1342177976,-1979954200,1183445062,1975520252,30730499,3643984,1183383552,-94991880,653811396,251742198,28837236,721611520,-230258240,-1946663285,33946198,-129595136,653811396,-1996339317,-1960385466,1183384647,1200236256,-1981535736,-1977160634,1183385927,1207314164,460685313,-1804545,1996480630,-1014279956,1375735301,113613392,1183383552,-12850180,-16534986,1996481654,-25888,1183383552,1183535356,-194054172,603983621,-754732560,-328271880]},{"sector":3,"data":[-1713344777,1183535186,-94991368,1375735301,-26032,1996423168,52599536,1996423168,6462192,2122514432,57999612,-2097081879,1962996350,17361155,50622113,1023700998,58654722,-1962870295,-1952848826,-150704626,-364475911,-1713355125,74452619,1183447543,-1305018392,-26109,1183383552,1975520238,12642563,-1411329,1996482678,-193527828,1347469355,16777114,-431585024,58048523,-16741399,1342419510,453530,-498693888,2054471691,-1149185,916126838,-1996488697,-1072957882,922708084,1183515570,-196738068,1342178232,16777114,-1305018624,1354771203,-361300144,-1542401,1347481206,-1804545,548986998,13416960,-6664110,-16776961,1996484214,121805558,922681344,1996424114,-25886,1996423168,124820206,1996423168,124295932,1183514624,-62486042,2122523371,141820134,-1696172289,1912,-1695648001,65535,-1694730497,65535,65781803,-2080618869,-443874579,-900899553,1638406,122290435,4456456,122814723,4521992,64946435,5308423,64225539,5373959,52035587,1384382465,8192003,9896191,5439491,9961727,15663107,10027263,106037507,6946824,117768451,458760,61210883,1048583,59572483,1179655,106561795,1245191,103153923,10223624,120258819,2293768,114884867,2949128,101843203,3145736,34013443,3932167,111542531,3407880,36962563,3997703,47972611,4063239,107086083,4128775]},{"sector":4,"data":[62718211,4194311,56033539,4259847,57934083,4325383,0,0,1167087646,518818645,1996478606,209125134,1347469355,1384155322,245452880,2047224581,922701828,922682640,-1070922630,1996443728,142016266,-1710852353,65535,184953507,-1593412416,1285750868,103457031,-1962742397,1297948645,503319242,1430622296,-1910575989,142016472,16777114,1958742784,103457041,1963476537,1996443657,-26106,-310181888,535137026,80366941,-1873273344,-326412987,-2082959842,1183517420,75145990,103431811,-14715904,721824310,245452992,2047224581,922701828,922682640,-1070922630,-26032,-310181888,535137026,46812509,-1873273344,-326412987,-1596420578,1178076658,-1610056698,1178076659,-1609531898,1178076660,-1609729018,1178076659,-1207599354,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2116514274,-16387522,-2130151938,-16387010,-1207601922,48955393,-310132693,535137026,80432477,1694499584,-1845493504,939524960,838861056,2046821122,1124073728,-1107295474,1241514240,32,0,0,1167087646,518818645,-326903666,-1202301174,-1001390016,-1960442274,604309063,2090487808,-1962934272,1979059184,-373282043,1996423326,108461832,503989389,1751120,-26032,1962868736,544538402,16777114,71600384,980729867,1149878315,541362466,-1961081717,1183391316,-61437446,1098174987,1342193848,-92864686,16777114,-1706016768,65535]},{"sector":5,"data":[-15992693,1962872949,37526020,-1705639936,586,-947153941,1996443678,-92864516,16777114,-1983411456,1552686148,38061854,-1070904498,343211856,136858,340035840,-1996483423,339118340,112640,-310157474,535137026,80366941,-1873273344,-326412987,-2585058,-6681482,184549631,-1961265984,1602948190,74972932,-16091393,1996425334,-26106,48955392,-310132693,535137026,147475805,-326413056,16968833,73304918,-351504501,176063322,-1962183680,1183515740,71776522,1183532917,138808070,-963967883,1996440555,23173640,1183383552,-2037557752,1343684352,1342242744,16777114,142016256,16777114,-1983739136,-11532218,-2037578122,1343684352,16777114,1958742784,187993025,732067318,-443851072,574045,1167087646,518818645,-326903666,-1957275894,1175128646,721712396,-15995968,1996426358,-26102,1183383552,473861114,96961285,-1996107103,434895942,-362753,1996425334,-59310330,251414147,-1946206488,1979059184,1338477321,-529154037,1600045099,-1962742397,1297948645,503318730,1430622296,-1910575989,116163544,1996445271,-26106,20774912,726889728,1996443840,-26106,1183383552,1359622,1183529707,340015366,2088972405,141819910,-1710852865,65535,-1710983937,65535,1997955,1962870900,39098908,76218368,-1705638519,65535,-24444181,-167037557,1600045173,-1962742397,1297948645,503317194,1430622296,-1910575989,173968344,957106059]},{"sector":6,"data":[796198470,556675,-1705834380,65535,1586176491,1011336970,1204289535,1409285950,-1174222408,1347551948,-16222465,-6683018,-2097151745,-443874579,-900899553,1478361094,-1957345904,-661774612,-1174217544,1347551967,-11485141,-291895690,-1207959550,-4521985,-1957670145,-768932282,1375849088,-26032,-310181888,535137026,46812509,-1873273344,-326412987,-2082959842,1448543468,-351897973,1463126795,-1705983957,65535,-15991157,1600057205,-1962742397,1297948645,402653898,33620736,1207961345,872481536,1140852738,1040188160,-2080374528,1963000658,1459619585,-1593769216,1476396800,1963000576,1509951232,-687865088,201326850,-419429502,-1845493504,-1660943776,-1694498558,-1593834137,1090584322,-1358953727,603980034,-1744829054,-1694498558,-1543503257,1090584322,520160001,83887872,-1878981888,117442304,402653952,-1040187133,1174471432,352323329,1493172992,-603979519,-1191115935,788530944,100729600,805308162,-1946156288,-452984574,-1375665401,1157629697,1224803072,1174406912,-1979645184,1191184128,0,0,0,0,-2081649835,1448543468,-1962641781,956676158,92146805,-352172661,205884199,990528771,-1962573882,418055237,721700235,-1957690811,205859782,175505232,120218,38077184,-443850914,311901,-2081649835,1448545516,-1962510709,1183386180,75400190,-2096860160,1443298886,385238669,-26032,1183645696,-1957685514,-654893500,541363024,-1705977609]},{"sector":7,"data":[713,294531,2089497460,545008424,158662411,103532427,1174471808,843380472,-1593215984,103482432,48956544,1177141291,-96039940,70387243,-336181623,-62485730,71304747,-151501175,1948267076,70426889,75367979,-1070923029,-1912977879,1343682118,-106869,41418551,-16484353,149423222,-1956684288,79846885,-326413056,1460071555,71732054,184788131,-1004112704,-1960440738,-358415801,1200301573,104375046,-1559786714,-1960442928,379782215,81706502,-352026463,207537188,-1559786714,-1960442390,950207559,1200301574,64004866,105351974,-1106897245,2124481984,-96040700,95958665,-1995815285,138840836,-1962785655,1149830726,943622916,-365024506,-1946169083,-130348988,-125107586,-1577419261,1143670250,-1983446256,1149963332,105130768,51135531,721827846,172263879,50719393,78029767,2114485305,104374287,99223082,74777000,77991679,721828001,102933447,1143669899,1962889218,71600906,1342325803,16777114,205783808,-1962560349,100861508,1151534516,-1956684283,214064613,-1873273344,-326412987,-2082959842,-1957295892,145820742,37546195,246968181,-11526652,1996425334,-26106,-1073020928,915080821,904595278,61095555,-1962576896,65734726,-1962522997,506856432,-1205957884,209139973,2005599102,-1205957876,206015237,990529283,-1962508346,1996688503,242679562,1354771286,-2130697496,33688702,1996426101,1354771214,233311888,171346193,-310157819,535137026]},{"sector":8,"data":[181030237,-326413056,-1962611581,103482950,1183384842,1958743038,75400036,-16354048,1592264822,67549184,1048793118,1946157988,-339727612,-28931325,-1539407024,91488259,-335657333,1354771202,16777114,75399936,-13994752,719849590,142016256,-402229505,1183448350,61383164,1962690105,374800,-59310256,-1962702872,-1465648058,1575324419,1426065090,-326898549,74907394,16777114,-28931840,67549264,79187998,-6664192,-16776961,-6619530,-1962934017,46292453,-1873273344,-326412987,-2082959842,1448545004,-2096341365,1946160767,-1070902518,-6664112,-956301057,479238,-569981184,-939524347,-16392186,839305215,-1962934266,1084427334,108954373,-1961135104,508005336,-1962392023,1177100359,-1547465974,113705894,1620,1183516395,106210060,425603,1996426612,105286412,1342178861,-1090740760,-24443654,-2096969853,238654,-141884043,-2096959613,238654,1183516020,-1962677494,1183385670,64004600,-358546295,-1593472763,1149830678,104374532,-1593555575,1178141862,-955679240,403462,16443648,956703393,192739398,103286471,92864513,-1593775383,1178142132,-954434056,33957894,78029056,95952523,-1995421909,273124101,95684099,-1593785367,1178142020,-385647368,580976791,-1509545210,-1205957884,105331461,-1506433,671532800,-1593834490,547554212,68073478,-88584162,-1706025468,1210,503582392,571472,309328,86219344,-1264517120,-1593472763]},{"sector":9,"data":[1166607684,-569981180,-939524347,-16392186,95724031,-1559802205,512427274,126551480,-1560038237,1319175080,-129619193,-1207689565,1344144390,503642808,84777552,1996423168,-29366260,1342178744,62142207,-352210968,102932772,2113422905,671532828,-1593834746,512427332,1194001848,-1962571504,100864071,1166607906,675185412,729023494,-1560042335,246941216,-1202708988,1344144634,16777114,68073472,2124501022,1356396292,-150699871,-6663976,-16776961,62393462,79187968,922701824,922682848,28837342,-1070903294,175570768,-1710721281,65535,-310157474,535137026,147475805,-1873273344,-326412987,-2082959842,-1957296404,-6680970,-1996488449,1451883078,507808764,-1946532311,1177100356,-1070901508,1996443728,-92864516,1021841040,-2012821760,-2097139196,406078,-1202314380,-1202651138,-1202716622,1471809108,-1706012154,1628,-16297821,721823798,-1108848448,-310157824,535137026,181030237,-1873273344,-326412987,-2082959842,2122516204,242483212,-1324595573,1021891336,-385649662,246939781,-11526652,1996425334,35035654,1183383552,103981562,1962559033,242679558,-1962615576,4000838,1025733634,309592577,1963065917,242679628,-1873756117,223799310,113721323,1872,76023495,2122514632,762577146,956707489,628423238,-1207011585,-11468802,-1207662538,-4521985,-1706011905,65535,-16297821,721823798,300437696,-96040192,-2096745821,-443874579,-900899553,-1957363702]},{"sector":10,"data":[82609132,1049318999,915080100,922682920,-16055386,364381556,-1207702783,-11534060,1183516278,-1949160700,721835038,1389595593,-26032,914948096,1049167400,1599996836,-1034033781,1478361092,-1957345904,-661774612,-16091393,1877476982,175570937,-402098433,-310181877,535137026,113921373,-326413056,1461775491,104374614,99223083,1183447249,2143292406,41675011,-16353537,28836982,1843941376,-398030588,95952523,972441227,108857415,-1995946101,-88148410,-2080470268,1048773319,1962935204,-2080929019,-794754321,-1593538301,92866026,-1996089695,950076484,71665926,61095555,-952536064,70316102,921454279,83796228,83494443,-1578482039,1183384628,83534310,75367939,-1946925431,100922950,1183384828,-364475406,-1578875255,938148992,1123043015,-330905852,1151403068,-364476156,721748129,-1996162042,1183573574,-100269066,-196703996,50658465,-1996193786,2124542534,-465139452,-1981397365,922738758,1586168754,-1707606032,2023,-1161591,922682486,1855587272,-1996488696,1048837190,1946157988,74907428,83506943,83638015,-1411329,922744438,-1070922830,1586188368,41418736,-336169217,74907426,83506943,83638015,-624897,922740342,-1070922830,1996443728,-262239242,-1207666689,-860225504,-1706012160,2232,-16484609,1996485750,-461963278,-1193249025,-256245727,-1706012160,2356,62011135,-1286517,155228727,1048772608,1946157988,74907482,-1996238687]},{"sector":11,"data":[-1588534714,1177224760,-28931594,83796304,83494443,-159973552,62011135,-1957642197,1200352350,-163173628,41418576,-1191807233,-860225504,-1706012160,2322,-16484609,1183577206,-2147079170,1996443652,-2143879196,-10949884,950076534,-163173626,1357006473,-1996238687,-11469242,10614390,-66704635,922701828,1586168754,38243308,1358317099,-11485141,2013263478,2144260,1375784122,-26032,1996423168,-498693372,75367979,-227082416,75380479,-1193249025,-256245727,-1706012160,65535,62011135,-1695648001,2379,-16484609,-6620042,-16776961,921175158,74907392,503642808,1354771280,631450,108461824,-16484609,-1930893194,74907392,-16771864,1996424822,1354771204,1577189352,1575324511,1426064578,1048833163,1963197992,74907409,503580344,309328,177642064,-443875328,180829,-2081649835,-11139860,1996424822,-158537724,-1710852353,781,1996484747,28857862,-1310175232,-62486271,-4986794,1443264255,-386107649,-397017061,1996488613,-1070901754,26404944,52927062,-1956773888,79846885,-326413056,1459940483,104374614,99223097,-756481156,83541504,-947650933,-1539407102,91488259,-964428149,-1205957886,239569669,63964675,379651465,239545094,-1593555575,76088486,-1996086623,1996424260,83539974,1996443678,-401698812,512426228,1200293304,17115406,-1264516027,-1593538299,1149830468,102932740,77989419,2114340667,108461857,503642808]},{"sector":12,"data":[-969474224,-401698813,1996423360,83539974,-1070903266,52402768,1084293120,138819845,547438965,-1543096058,-1103596285,1048773646,1946157988,46564099,1023813793,125042690,1946157885,-1591940329,1149830580,108461828,503582392,-401698736,132841531,-1996143455,1592453892,1575324511,1426065090,-326898549,74907402,639130,-163149568,68073552,244338718,-16773400,-224725386,-1962934263,46292453,-1873273344,-326412987,-2082959842,1183648492,-11528458,1996425334,191076870,1996423168,-163148534,-6664170,-2097151745,-443874579,-900899553,1478361094,-1957345904,-661774612,-1928663933,1343682118,-16091393,1687816310,-16777212,1183648886,-11528458,-6683018,-2097151745,-443874579,-900899553,-1957363704,49054700,294531,1586186612,73370376,956703905,460588103,-1207404801,-11534311,1183516278,-2133710072,1347552714,16777114,-15734016,1996425334,374790,-26032,1183383552,108462078,199203408,1721958400,-15930621,922682998,-660995226,-1962934265,-443810234,442973,-1947432107,1178141766,-1962574586,65734214,-1962654069,79846885,-326413056,956581515,92145222,-351910261,71731971,-1034033781,1478361092,-1957345904,-661774612,1464003715,242649942,-1996249951,681704006,-1002010362,-1996249439,1419888198,-196703994,707806346,-62486044,-410912629,1183514632,16792844,1625883509,-385649150,20775778,1025733632,57999367,1023481321,57999368,1023500265,57999375]},{"sector":13,"data":[1023500009,57999495,-385762327,1589904234,1200301574,-330921712,205980454,653280905,-1995552885,52883014,1183386183,1979649010,126559779,39291686,-1983887735,1149878870,1078233410,1149878923,809798212,19260458,1178896640,117196534,-1897331851,1962871552,-62458320,-1961593852,103542854,1183384650,-230257684,72091179,-1947318647,100920390,1183384650,-297366544,72091139,-336443767,-62458307,-165776383,1946352710,-330921204,70387203,-336574839,-263812315,70387243,-336836983,-62458343,-1962314750,100920902,-924122042,737298059,-1996208634,-11080122,1996483702,-263812114,1357661739,737298059,726724166,-6664000,-1962934017,-1532757434,-1002009853,-1962530653,-1499216314,-196703485,721835171,12708288,112726,1182565200,-1962380288,1143677508,-1593578722,243990946,-506395522,-1054088751,1182565200,-1593478144,116064672,723797131,243998788,-506395520,-1054088751,-26032,-397017088,-397016503,-1705638554,65535,-6647317,-352321281,172395402,199902857,1443788224,382355085,-26032,1183383552,1979649002,384325133,1996445186,-119150358,1149904363,635710002,1183383556,843874494,1996445188,1354771434,16777114,-1099005184,-2147191552,-2080689564,1946159742,-13375229,-901345962,-6664170,-385875713,28901157,-372102400,1187447228,200290550,187790847,-165120513,1946235460,-6662650,1442840831,1016730,-1494723072,1996445185,108461832,-1873756117,-189667314]},{"sector":14,"data":[-939595543,-268372410,50873995,280045636,1317789907,642515718,1183432971,138856198,-1705639936,3841,18004048,-163148976,-11533300,1996425334,112368134,-1427570688,172395518,1023418669,58064903,67017961,-13724736,-955310425,395846,1187455467,-352319734,172410650,334168066,51005127,-955454720,2630,1187448299,1442840842,16777114,61252352,106182281,-1555676021,1996424100,1354771210,-369663000,249953869,249433836,250810071,251268851,988352250,1078234110,13822361,725898379,1111788480,-1962883095,1149831750,105286464,-351648119,138840844,-1958460279,1149830726,1081409346,-398166785,-11469690,-1729609100,1078233596,10741846,687747,-286719115,-1209510147,-6662653,1442840831,16777114,-364476160,28856406,-370651136,-129594885,-387287297,-11077143,1996483190,-95295240,-387287297,-11077159,-1070863754,-70850480,-361300138,16777114,-32839424,1963065661,-24647421,1963066173,-25761533,1963196477,-10229501,1963196733,-11933437,1963196989,-10360573,1963197245,-12523261,209125206,-16091393,1996425334,196188678,1599995904,-1962742397,1297948645,1426066122,-326898549,1988843016,1183667716,-1706027272,65535,245668438,-1499267072,-129594109,1962889238,1114963776,-12290817,-1326954892,-443851024,180829,1167087646,518818645,1448597646,1443395211,1097114,1958742784,108954419,1443984642,1342439864,1347469355,283023952,518717440]},{"sector":15,"data":[687235,2122520180,91488262,-352320581,-774165758,175934435,48955787,1600045099,-1962742397,1297948645,503317706,1430622296,-1910575989,1988843224,209125128,1119130,1975520000,-339727612,176063276,-15371006,12061814,-1957277692,1385760326,288266832,300613632,-15960321,-1070921098,-11119024,-337115530,-310157824,535137026,147475805,-1873273344,-326412987,-2082959842,-11138836,-1768288138,184549393,-2091813696,1963069054,276234023,1342440376,1347469355,297376336,1183383552,-94991880,638213828,1589905289,650283782,887818121,-1961861493,-167048585,2122521204,57933838,-1006188925,1149962846,126428674,-1962516796,-672463804,638213828,1991,637951684,1991,49120094,1562371467,838221,1167087646,518818645,1996478606,-26098,-1073020928,2122528628,460653068,-1207011585,-11533310,1451951734,-1950340344,1347553862,965274,-15275264,1996426870,112652,175570768,-16222465,199755382,49120000,1562371467,707149,-2081649835,1448547564,-955353461,61510,707937418,-330921500,818819,539297140,-1962480896,270920774,1958742784,112645,-1070923029,-2081012087,1962936958,1975520007,17623299,687747,1183519092,105265416,28837236,721939200,-1962677312,1183446598,209617902,-2146536448,199176804,-2146143040,-350211508,845447182,-293698577,-2147191808,-2096090548,1946218110,175934279,141950731,-26026,-125108224,818819,-947715212]},{"sector":16,"data":[-1996125434,2122575942,242483210,-1995946357,1183515205,71665926,1183516139,-16414456,41287477,1358520040,-402360833,92928318,294531,1156978292,192225331,271795446,28837236,721611520,71731648,871777931,695529030,707937418,-330921500,-1962930139,-511579058,-1056243680,1962871669,-26102,1149829120,-6662646,-352321281,-293698768,-2094369792,1946158206,776243748,1183441962,209617900,621114368,116064258,636241547,-1073020924,-11139212,2145913974,-263812106,-443850914,836189,-1578333355,1178140770,-1959168764,2139292766,91488326,-352071519,95723779,75370123,-1056710191,73304912,4620163,-1264515724,-1593578747,243991504,-506395520,-1705983741,65535,-1034033781,1478361090,-1957345904,-661774612,-1593250685,1178140778,-385649656,-559873831,-536474875,-385649403,113705165,1576,16777114,-532774656,1963233029,-566329044,1963231493,108954404,-15830016,922683510,28837710,-1326952448,142016494,-1192285976,-11534332,-352081866,-532774541,1963156229,-566328978,1963154693,1346274150,208928775,-1207404801,-1705967618,65535,355226,-96040704,-239991,1183647862,-1706027270,65535,503582392,-59310256,-1694861569,1530,200820361,-16354112,-1360525194,108954614,-15830016,922683510,28837710,887640064,571630,-126419120,-2081283096,414782,922683764,-728103340,721420301,98608064,-2096767325,-443874579,-900899553,3145732]},{"sector":17,"data":[260636675,939065345,237043715,1275133953,334561285,27984127,331153413,28180735,342294531,-2054815743,183828483,940179457,187564035,1686765569,3735555,1376452609,94896133,20316415,241369091,781254657,274792451,1620180993,239009795,445841409,8388611,1695875073,231079939,-2087387135,264306691,941228033,233963523,429522945,268828675,1738211329,55508995,1167851521,336134147,849149953,334036994,27984127,271056899,1629552641,330629122,28180735,188416003,1721958401,95420419,1428619265,95092738,20316415,197263363,464257025,335806467,1437990913,317587715,458759,326631427,-2068316159,309460995,163446785,276430851,624885761,88604675,675282945,74842115,1698693121,271450115,482672641,224854019,541720577,318177283,1288437761,241762307,-2058289151,337379331,1624440833,140509443,1900552,192086019,1717174273,138674435,2293768,338427907,1692270593,185270275,954269697,157351939,1172635649,198050051,2949128,232456195,-2072903679,6946819,1634926593,330104835,846397441,1167087646,518818645,-326903666,209617158,2138374658,16777114,637978368,-1962934266,1183385670,1812892668,-772157180,-1950274567,1195052638,-15303640,1996424822,-401698808,726664361,244338880,-352285464,-401698746,-1073020852,922682997,-404028124,86253195,-2020875311,1183384914,108462074,1342732031,16777114,6463744,1962559033,-92864746]}],[{"sector":1,"data":[1342179000,1342177720,-11485141,-979699082,-2097152000,-443874579,-900899553,1478361098,-1957345904,-661774612,1443163267,86253195,-1215568943,-167049902,-1202318988,726663187,1347440832,104602,721611520,-310157632,535137026,516640093,1430622296,-1910575989,142016472,-1207535873,-397410303,-310181877,535137026,80366941,-326413056,1460071555,89309014,425603,1988822388,-1591547130,-523172572,1183434499,-1948742662,509751,140413696,964944849,-1593412608,1183384868,140413704,831120337,29137494,-11141120,-18347914,1149982210,642001694,541363024,1344816171,16777114,642026752,1150111774,-1706025442,65535,112726,30513744,2122514432,611581958,374870,112720,608471888,723534891,735087570,575441856,-1960948693,-1706011967,65535,294531,727058804,244338880,1577446888,1575324511,1426065090,-1957237621,-1705638794,65535,-1993980789,1149971012,742689064,1354771286,16777114,-443851264,180829,1167087646,518818645,-326903666,-1957275844,1187450486,-1962934024,4000838,-385649406,58065030,1023544297,1483997199,1946162237,2047258,-11132044,1996426358,142016266,-1710852353,65535,-16642071,-1070921098,-6664112,-352321281,641631197,393478150,103167743,1342309048,-1705983957,65535,244338770,-1694650904,748,190362,30664960,-800682666,-6664170,-16776961,-2132225930,1183667717,-1706027312,65535,-956189463]},{"sector":2,"data":[129094,-1559607669,1996424494,108461832,1172835984,200837895,-385649153,1173750165,359925811,16285315,-2031549579,1095681,-26032,2062090240,205949697,1946288445,33766763,1793655668,28858113,848973824,184549379,-385649216,244318553,201179112,-385649216,1369047373,-1711276029,830,67782390,-1873341836,101181454,112727,-26032,116064256,-401698729,1043924595,57999458,1459690729,1342179000,1342177720,1464909867,36762,17295616,112727,-26032,-1073020928,-152501387,-26112,-396951552,-1202192787,-1873805311,71886862,5530,-26112,109969408,-1591344362,1183406757,403082950,103491075,1157847721,1779338022,66703620,-934901311,51775118,1520935206,-1899739511,637736966,1521157675,-1960295165,-788239346,-1983839239,-759628730,-1957683709,1177274438,1183535302,-1002034180,-26032,1996423168,-59310136,16777114,73239296,-1995028597,-1072956858,748750453,-96040698,-362753,-1711023562,65535,16777114,641632512,79189510,-1202696192,-4521985,-11513089,1996426358,-61437174,1183563819,-1706011960,65535,19736043,539906,-102169738,-1816132611,564657966,-2080211196,2130870018,2130842114,302153474,721583874,1600035264,-1962742397,1297948645,1426066122,-326898549,-1957275896,2123040374,-129594108,-396931050,1755381824,1812343556,-1037330172,1174665425,541362682,721708705,-1727763962,-120470997,-1980217853,1149967940]},{"sector":3,"data":[1812333344,608471300,52315275,-1996199418,1600004676,-1034033781,-1957363708,1988843244,-1715041532,86642315,788003319,243991656,-936704692,637951684,-1962520695,244029894,-101251798,787989131,-1993997210,1200301575,1745234694,1200170500,126559746,73795075,71797030,1575324510,503318210,1430622296,-1910575989,82609112,1988843095,108956424,-244025,874417151,545208582,-947181441,-1725937877,73928331,-930350601,721758369,787957953,-930413270,-1952856437,-150706658,-1983380485,1183579214,-2090901764,-443874579,-900899553,1478361092,-1957345904,-661774612,85985023,956640417,2114265094,671547154,86679813,86771201,73938687,-2097149464,-443874579,-884122337,1458342741,-1962641781,688272414,1999186039,-137983200,-6663976,-956301057,17114630,-26112,-1956773888,46292453,-1873273344,-326412987,-2082959842,1448545004,86783627,721758881,537853936,86024453,1417015355,-1996149599,915012678,-13957844,-544525333,-1081875503,1962935634,956754727,208993398,-773944506,1388282851,-277610491,1962702393,1187416854,1459954851,-1873756117,-87037938,742275399,-3703035,-1593497586,-654900120,-10688432,-310157474,535137026,516640093,1430622296,-1910575989,216826840,876019542,129997318,-259325952,104085247,385107597,-26032,1183514624,1745224694,-96040700,-196702890,922701846,161088446,1442840583,512922,-310157824,535137026,516640093,1430622296,-1910575989]},{"sector":4,"data":[82609112,641108822,637978373,-1962934267,-310157626,535137026,516640093,1430622296,-1910575989,86548952,73936631,-1962742397,1297948645,-326412853,1460333699,175541078,-1928823157,1343682118,-402229505,512490956,1200293428,-129619680,1476150825,385238669,-26032,-1073020928,-1545010315,1183667968,-162523402,1950363204,75399947,-1593477888,65734198,1342422689,16777114,75399936,1467839744,16777114,1962891008,678756134,493210,1962891008,544538398,-14519041,-6675340,-1962934017,1200292956,-28931818,259309579,1354771287,-25755824,16777114,1444276992,-26025,727056384,-1202696000,-1706033151,65535,-2144451338,1686113396,512458542,1333790260,-1957199826,-16370658,2013208183,-26080,-1705574400,65535,-443850914,574045,1167087646,518818645,-326903666,-1957275896,-13957002,1392002759,-1960056059,926546014,922689397,-6683084,-1996488449,1347877958,108461911,-71960,-6620042,-352321281,1183008523,1043923704,-813759188,-310157474,535137026,80366941,-326413056,1459940483,-1074386090,367723858,1946172803,-13238516,727057526,-1528278848,-947697922,741751042,1592098565,1575324511,503317186,1430622296,-1910575989,149717976,1988843095,243041032,-15895039,-6680972,-956301057,3652,-768147626,1354771205,16777114,944015872,-956807544,-2130757564,-2145373364,-1971376540,-466994876,-1577433463,1178141996,-1961329158,-472778146,89309059]},{"sector":5,"data":[-15960832,-11077002,1827145334,-1337725960,-126945778,503568523,126551260,73795075,244029768,-101251994,737822345,742275583,-1591771643,1178141996,-955943430,64070,-772120949,1388282851,-1217134587,1207584511,1600052203,-1962742397,1297948645,503317706,1430622296,-1910575989,1988843224,28857862,244338688,1593781480,-1962742397,1297948645,503317194,1430622296,-1910575989,82609112,1988843095,-1305069306,-1710918395,596,-768147626,-26107,1686110208,-1202266317,-1873805311,-27203570,-14781185,244326516,-1946441496,960792824,-472785013,89294791,1599995904,-1962742397,1297948645,503317194,1430622296,-1910575989,1988843224,-773944570,1384614883,-310157819,535137026,46812509,-1873273344,-326412987,-2082959842,1448543980,1443264139,1459100904,1726484112,81568255,737953417,-1961890817,1183054942,1149964028,71776550,-947189377,470170439,1458076677,1358906765,1342177720,16777114,-2090902016,-443874579,-900899553,1478361090,-1957345904,-661774612,1460202627,-1946211498,-1472841225,-9014012,512427638,1200293428,138806056,-401698736,1183447781,-49672,-661973644,86253193,-1215568943,1048577362,2097152146,972983042,1946530366,1480491840,175374342,597146,39426560,-16056320,-1873400972,3467278,106444543,1342178488,16777114,1479999232,-26106,882966528,1778792710,1342600192,16777114,1590070016,49120095,1562371467,313933,1167087646,518818645]},{"sector":6,"data":[-326903666,1988843088,1183667718,-397404482,1183383877,876019638,-26106,1183383552,1183666354,-11528514,-6637962,-1996488449,1451866694,-1300824132,420250,-1169782016,-1996486651,1183561798,-1270445636,-1715976565,-120470997,723405963,73834952,-775804007,-1983380488,512471118,-1047853516,2115913529,508005126,-1951381879,1174646854,874417080,575093510,1200294270,-1203360990,-1196407159,-768901116,-1070903214,-2001055664,-11513208,1150005366,-1270469856,1342178349,-1950845185,50705478,-1070903296,922701904,1347421088,16777114,106472192,74760203,95565449,49120094,1562371467,182861,1167087646,518818645,-326903666,205949798,1962938173,242679623,379209357,40344144,922681344,1183647154,-397404484,1183383629,-1703477318,1342178232,1342177720,381437581,-1166606512,16777114,242679552,379209357,41458256,28835840,350984448,-15829249,1996426358,142016266,-1710852353,544,-1962742397,1297948645,1426066122,-326898549,142016258,-16353537,1069024374,-6664192,-1996488449,-1072955834,1996433525,74907398,705039008,-1442446364,-1407808764,-1706012156,65535,-16353537,-6683530,-1996488449,1183579718,1575324670,872416962,-822082816,2030043394,-1711275217,-117440246,1057030967,1157629960,-1308622080,2130706690,1895826275,-1862205696,1442841345,-2130706173,-1895824585,-1811874043,201392897,1476396812,-1711275264,-1996488443,1677722424,-1979711231,-218103196,-1778319613]},{"sector":7,"data":[973079297,167772422,385942328,1509951244,1426064128,-1946156799,-1375730915,-1828716277,-1308622054,352321795,2046821221,-1711275765,855704345,1644169223,-939523328,-1694498549,1207960423,-1660944126,-503250126,1744832518,1241514752,553648390,637535073,-1392508663,553714449,1962936327,1090519808,838861067,-922746110,838861065,-603978995,922747139,1677722423,-1207959289,352387860,-2130704377,-1946090752,-2113927161,-1426062592,-1107295990,620757842,1056964867,1442841381,-1090518774,134218548,1073742084,33555240,1392574211,1291846401,1124073738,1291846414,-922746617,788595509,-1811937278,1660945152,1509949702,1694499686,1509949706,973079346,1526726913,-352320712,-603979509,-1191181471,-520093430,1358955320,1677721864,-1593834735,-452984565,1845494610,1761607937,-520092869,1778385155,822084407,-335544054,1442841443,1828716807,-268434149,-1778319613,-1124072703,1879048451,905970484,1929380106,50,0,1167087646,518818645,-326903666,503760648,-1207959296,-397410302,-1073020830,28837236,721611520,-96040512,5302352,16416387,113709173,30,5899975,-1070923776,-6672405,-402652929,512426257,2013202000,-26108,2122514432,141885448,-1996077429,99350598,33048263,-126419200,16777114,49120000,1562371467,313933,-1192457387,-4521985,-1957670145,1385759814,-26032,-443875328,180829,1167087646,518818645,-326903666,1988843014,173968134,956322977]},{"sector":8,"data":[91556935,-352321096,175570723,1963130499,1161221,381158379,727076864,-1706012480,65535,-2080618871,-663420162,49120094,1562371467,445005,1167087646,518818645,-326903666,-6662652,-1107296001,132841858,-956109181,-2130706428,1962967806,-18189,1392508858,8566864,-6664162,-1912602369,-1610412026,-2145124204,-1574535116,109991891,-1818229998,880813056,-727570816,2084471639,225705988,-1157627976,1347616767,16777114,-310157824,535137026,1439386973,-326898549,2084471570,91488260,16777114,-26112,-6684672,-1912602369,637735942,1473591039,384714381,1354771280,-18352,112720,-26032,-1073020928,-443818635,1478411101,-1957345904,-661774612,17306,-5511168,105913995,-1710983169,82,-1962742397,1297948645,-1873273141,-326412987,-2082959842,512427244,2013202000,1354771204,1347440720,-26032,244318208,738131432,1347440832,-26032,-6684672,-2097151745,-443874579,-884122337,196629,65961,16988033,65783,16973828,65907,16973829,131355,16973826,131438,196611,65678,17007116,196941,16973826,196969,327683,16711808,16974164,524728,16973945,458861,16973826,524770,131194,65864,220098,65744,206143,66034,153411,16711811,131412,65809,350170,65861,220098,66039,210794,65938,351982,65806,22490]},{"sector":9,"data":[0,5,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1867513856,544241008,1970169165,65535,0,0,0,0,0,0,0,65536,0,2361869,0,-65536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,454164480,454761234,531227,0,0,0,0,0,0,0,0,0,0,0,0,0,2162688,4784368,589914,33620053,33619972,100992003,33817095,84017152,33622021,33686275,50004475,507,84148994,50857734,773,327680]},{"sector":10,"data":[5,33686018,770,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1329790976,960115021,741355574,741813317,1347158065,960115028,741355574,741878862,1430323249,12632,827216464,-134217728,134217976,8,0,0,-1,-1,51970047,-64748,52036374,-64736,-1,-1,-1,-1,-1,54198271,1376255,52822018,1400635393,4980739,202571777,53346306,1519845377,52297730,647626753,52953090,1520107521,53084162,1520238593,53215234,1419771905,54394882,1520631809,52690946,1520762881,52559874,1521025025,53739522,1521811457,53870594,1521942529,53477378,1522073601,53608450,1522204673,54001666,206503937,51380226,1473445889,51511298,1473511425,52166658,1473576961,54525954,199163905,54263810,199491585,0,0,0,8336,1767108608,25978,1867378704]},{"sector":11,"data":[25974,1665789984,28271,1868230704,-2147455633,1816391776,6648687,2004055149,552624256,1937009920,1852601207,1784900971,1953387784,1701606505,1917126244,561147762,107695874,1668178243,1090874469,1953656674,1952797189,1225161074,1919905383,1700332389,1867383411,0,1828716544,1937208180,279886,1048676,9903,163845,0,0,0,65538,4194354,5242960,6029402,10780,262146,0,0,0,297151008,297201968,10365758,14680081,1146309894,4477775,65536,1162544640,1279610450,-855376126,319,20958467,1076,0,0,0,279886,17564101,11393,327686,8389608,131072,327680,393221,4194485,25690216,27066769,11080,262186,0,0,0,34023133,34079040,196355848,726987120,956311521,741208432,969224171,969339184,86256543,867627089,-2147287036,1,737280000,-261095359,873037825,-2147221504,1,741539840,-261095403,877297665,-2147155968,16,878641152,-265289720,32819,879165440,-265289721,32834,879624192,-265289721,32820,880082944,-265289720,32825,880607232,-265289721,32823,881065984,-265289720,32826,881590272,-265289722,32822,881983488,-265289721,32842,882442240,-265289718,32818,883097600,-265289718,32821]},{"sector":12,"data":[883752960,-265289720,32848,884277248,-265289719,32849,884867072,-265289719,32850,885456896,-265289718,32851,886112256,-265289708,34768,887422976,-265289719,32868,-2147090432,3,742916096,-261095405,888045569,744161280,-261095401,889290754,745668608,-261095409,890798083,0,1146309893,21327,134217984,369102592,520100352,1392902144,1163154265,1397556813,1146310468,1380272902,55330126,71910471,1380275029,1497713416,1380011842,16843076,-16252889,54512897,-855564297,439485247,54512897,-855562674,764019775,71290113,-855570732,961152063,54512897,-855572369,953615423,257,16720384,1107574733,1070399521,2401284,-1861992499,1070399534,702212,1594048461,1070399496,165636,1661157325,1070399535,3266819,-150782003,1070399488,511491,1879261133,1070399495,2051843,134496205,1070399528,1868035,-1476182067,1070399499,1238531,855850957,1070399503,2595075,2130919373,1070399492,3618307,-1308475443,1070399498,467715,-1677508659,1070399490,520707,-402440243,1070399528,2884611,212941,1070399488,403970,805519309,1070399544,3728643,-1140637747,1070399544,158467,-1174192179,1070399508,1404419,0,0,0,0,855834814,1347821248,-6664112,184549631,504394944,-26026,1444806656,16777114,-1260328192,505531724,1430622296,-1910575989]},{"sector":13,"data":[82609112,23871107,-14584832,1996426358,142016266,-1710852353,65535,16777114,1975520000,734014215,27388370,1024214667,57999386,1979763433,20506883,1023410477,58064918,50418153,-13724736,-16681305,1996425846,108461832,16777114,112640,1996473835,-26098,-1175781376,12861059,-5082112,-1711225802,65535,1996466155,-26098,-1645543424,-1710590209,65535,1996461035,175570700,16777114,-7935232,1996426870,9890058,-16091393,1996425334,-26106,1827209216,242679807,-1710590209,65535,-41239,-6681482,-385875713,1996488531,11974666,1335513118,-385875967,113770307,65742,-2080425239,1963396222,112645,-1070923029,-26032,619249664,-25857,485031936,-834763777,427032576,12977863,1996423169,12040202,-6664162,-956301057,50694,13541632,10348953,-804618623,-10390265,-793244042,-6664185,-385875713,9633503,29884572,14156232,18547144,29884699,29884872,29884872,29884872,29884590,29884872,29884649,20513224,1946227261,1026783159,410124544,1996554557,-16062205,1963000381,-17241853,1963004221,-16258813,-15829249,1996426358,142016266,-1710852353,65535,-13819925,343299,-1073487241,-1476448621,8323566,16187639,16908744,1491665170,49120254,1562371467,319474253,-268434688,419495680,-671022336,1795163393,184615680,1811940608,1862271744,486604545,184550144,503381761]},{"sector":14,"data":[838861568,520158977,704643840,536936193,369165056,1895826688,-83885312,553713408,486605568,1912603904,-503315712,570490624,-922746112,587267840,-1140849920,604045056,-1308622080,620822272,-1778384128,637599488,-1996487936,654376704,1291846400,671153920,1207960320,687931136,-1476328704,285213440,0,0,0,0,-1020541813,-1996153181,-1996485594,-1560277466,-1598554102,856051983,1347572434,16777114,190383872,-352094784,-1598320557,-795936241,1409016715,-6683055,-1912602369,378283712,-1993998332,117441062,-6661287,184549631,-1993771840,1459621902,1381172822,-1705983949,65535,-26025,-1073020928,244321908,185125352,-368741184,65535,-850591816,-1873273311,-326412987,-2082959842,401081580,-838416638,-956301056,64582,184960651,712247366,637951684,1946173312,4241441,8435792,-26032,1183383552,1958743036,-11526643,1996425334,-26106,1183514624,49120252,1562371467,313933,-2115204267,-956264212,65094,503369912,18528336,431509534,-1924129279,385840774,8435792,33790544,-1073020928,-588709003,-129579264,-2037579775,-2037776522,-1769144462,-1142292620,1923007488,126494463,-9402744,74719292,108342332,-9271553,-1631262741,-2144927886,57999423,-1962895895,-1983738685,1451883078,-2146767876,754938046,1191121780,-94452486,-2012771802,-1728089978,1996496957,-94452506,-2012771802,-1073023418,1191118708,130426618]},{"sector":15,"data":[1958149888,1924595711,-125926401,-1207602176,65797950,1358905272,164506,1958742784,-129579249,1187446784,-352321026,-96010493,653942468,1948270464,1065363188,-972786388,-2144537018,1965880958,-129579259,1183514625,-61436934,-9271671,-9136503,-9265468,4161574,954794868,13678847,532172830,-1202708991,1344143646,-9009523,-2135404522,-6664192,184549631,-385649216,-2037579629,-2037776522,-1769144462,2028732276,-9265468,-2012771802,1023373446,1006924832,-16354004,-335580538,1923007719,1065363199,-1957334016,-1983738685,1451883078,-2146767876,754938046,1191121780,-94452486,-2012771802,-1728089978,1996496957,-94452506,4161574,1191118708,130426618,1958149888,1924595711,178431,-26032,1183514624,-61436934,-9271671,-9136503,-9265468,4161574,2078868340,-28931073,-1017256565,-2081649835,1448553708,-1705983957,704,-1207837021,-1706033148,65535,721735331,-6664000,-1996488449,-1705978810,65535,735463049,1996443840,-25900,1996423168,571606,50174544,-459079680,-696844542,1342180024,199834,48931584,-1193904385,-1706033138,794,-1177127169,-1957625844,-25872,-972881920,2097152829,-905525498,-16777216,1183700598,-1706027304,65535,-1546107253,1183515422,13149152,52299265,-1545451893,513869090,263427,-16556381,62445174,573503232,-1037330171,-930350895,-150991432,-1727716818,-120470997,1346421035,1073946273,-6664128]},{"sector":16,"data":[-1560280833,1996423878,-6663978,-1929379585,1343682630,1347469355,-150993992,-1727716818,-120470997,230213771,573503232,-1037330171,-1054082863,52339024,-56995776,-16777213,1183700598,-11528456,-1711153610,65535,385369741,1354771280,243792,86126327,-775804007,-1194816520,787939341,731448610,737726914,513888449,-1706016765,1104,-1915324673,1343682630,80623359,16777114,52338944,-775804007,-1578071048,731448610,-1946627646,-129593864,1448562710,-150993992,-1727716818,-120470997,230213771,573503232,-1037330171,-1054082863,-1924085973,-1706032828,65535,-1915324673,1343682630,80623359,308378,52338944,-775804007,-1947169800,-788192706,-129593881,-1923657706,-1202651324,787939331,731448610,-1946627646,899272,86126327,-775804007,734079992,1150111943,-1147514878,-16777213,1183700598,-11528456,-1710961098,972,-1697220865,65535,1342182328,410266,1975520000,112645,-1070923029,184554147,-955747136,189958,722594560,12079296,1347590527,327322,48669440,-1202667477,1385791234,-26032,-1834811392,1173507,74825739,65781803,1577058744,1575324511,-326412861,1443163267,16664263,4241408,1751120,129407568,-259325952,-1996298591,1153896004,-1593835504,1149829594,16300042,-1944697719,1153898588,-939524350,-64444,1344194187,361626,1975520000,11856131,-1996431176,1552684612,184862488,38061824,1153957887,-1946157308]},{"sector":17,"data":[-1706025274,1451,58048523,-1207923223,1149829354,408718358,132295,-16628537,71616511,-963903489,-811970530,184549381,-1201048384,1149829348,408718358,-16628537,71616511,80216063,-963969013,261771294,184549382,-1203407680,1149829336,408718358,31078143,-1728052808,-6664110,-1996488449,80153668,1153892355,-939524350,-64444,17974471,340051712,-963969024,-6664162,184549631,-955943744,130630,-26026,1183514624,-443851010,1478411101,-1957345904,-661774612,-951915389,16829446,440320,105814608,1319305216,374786,-26032,614662144,-633929982,1226753,-1102672560,515395606,-694530048,184549382,-385649216,1996423654,1354771206,16777114,-599357184,1354771280,-4698032,12079359,-1365618679,184549382,-385649216,1996423614,1354771420,381568653,131119184,16824400,-26032,-1073020928,-1612119179,105286401,-1878859101,65988622,31078143,1342183608,503490232,2013264,116628048,-1073020928,2011759477,-633929983,1882113,32946256,683167774,278548480,184549383,-385649216,922681690,498598362,649613312,-1202708989,-1706033102,1837,58048523,-16695831,-1207838154,-1202716649,1344144224,1342190264,477850,1975520000,18934019,31078143,1342182584,503498936,3323984,124230224,-1073020928,65602421,-633929983,1161217,78952528,347623454,-2070261760,184549383,-385649216,922681574,616038874,-1866969088,-1202708991]}],[{"sector":1,"data":[-1706033087,65535,58048523,-1711224343,65535,77596358,-704198912,-956301311,16969734,-2113485056,-1207959551,-1588592576,-523173698,11967056,-1633484800,1975520004,9758979,503376568,19183696,-1070903266,1380974778,1347440720,108461904,-633929904,-1706012671,2063,184882851,-1201048384,1344143588,503391672,-1161811120,1347571712,1347440720,1342600959,31078143,983191632,-1560281080,-1073019702,-524796300,-1202708992,1344143654,817545259,1347441232,-11513776,-11532682,1342298678,-26032,-995950592,1958742786,-26093,-6684672,-956301057,52230,112640,-1962742397,1297948645,1426064074,1996483723,31373316,178256,142776912,1996423168,80656388,178256,143825488,1996423168,48674820,178256,144874064,1996423168,59947012,178256,145922640,1996423168,52344836,178256,146971216,1996423168,86161412,178256,148019792,1996423168,13154308,178256,149068368,1996423168,48543748,178256,150116944,1996423168,48936964,178256,151165520,1996423168,46577668,178256,152214096,1996423168,56539140,178256,153262672,1996423168,1226756,178256,154311248,1996423168,13285380,178256,-26032,-443875328,180829,1167087646,518818645,-326903666,-62470364,1183514624,31105806,16402119,209617664,-954895104,67142,-16091393,244320374,-1980296472,116128326,-401836289,-4653335,-17665]},{"sector":2,"data":[1996443730,161323534,245563392,269912325,-18427,1392508858,242679632,636058,38839040,38934153,-1157627976,1347616767,-1710328065,65535,-1996154205,-1593500650,101385486,58000656,-1593784087,101384784,57999954,-16728855,-1207838154,-1924136938,1343675462,1342185144,419738,1975520000,10479875,503371960,-599356080,-1070903274,1375784122,1347440720,1342203064,1347469355,1343125247,132422224,1183383552,1958743036,-868318389,1148518400,818819,-1410846347,1958743030,105301765,2122514434,527696122,519718539,112720,26843728,-1073020928,1187448180,-16776698,513473142,-16777210,1996487798,-26106,669712384,-1202667477,726663192,1347440832,-26032,1048772608,1946157260,-58817778,-16223232,-6620042,-2097151745,1946221694,-868318452,91553792,-352321096,-2084558078,-443874579,-900899553,1478361098,-1957345904,-661774612,-16061309,-1711087050,65535,-1191557495,1344143568,503378104,19380304,1183666206,-1202710794,-1706033150,2887,209043467,-1191545089,-1202716620,166395905,-1191545089,726663220,-6664000,-1207959297,1344143626,503392440,1354771280,731802,78553856,503384760,19839056,-1070903266,-26032,-291307520,17479682,884494366,-1202708991,1344143632,62410782,1637502976,-1207959541,1344143626,503397048,18135120,1344163870,1342178232,753306,17479680,1119375390,-1202708991,1344143680,385631885,178256,195140176]},{"sector":3,"data":[1183449088,18326268,503384760,21674064,1220038686,-1924129279,1343683654,1342177976,66202,-62486016,-2097080158,-443874579,-884122337,131130,16713085,131076,16713046,131077,16714110,131078,16714133,131079,16714156,196617,65656,196608,16714314,196626,16714362,16973843,197934,16973829,199259,196615,16713616,196650,16713803,196651,16713798,16973868,196637,131087,67070,16973863,327782,16973829,196704,16973854,196663,16973860,329359,16973977,330499,16973979,329337,16973980,330436,327837,67065,16973863,199046,16973875,263051,16973869,198770,16973878,330262,16973865,199445,16973881,199396,16973882,330342,16973866,263039,16973875,262868,16973876,328941,16973997,329195,16973998,330217,16974000,328901,16974003,330383,16973877,329053,327737,16713119,327682,16713151,327683,16713080,16973828,263356,327748,16713041,327685,16714107,327686,16714130,327687,16714153,16973833,328395,16973890,328418,16973892,328867,16973896,262894,16973904,196810,16973912,196683,16973915,262836,16973911,328801,16973905,328717,16973907,262964,131165,16713124,131074]},{"sector":4,"data":[16713156,3,0,0,1167087646,518818645,-326903666,-633929978,-26111,20774912,-2092532224,52798,-4706956,-17665,922701906,-6684198,-1996488449,1451883078,726684412,-1706012480,65535,-231681,-6620554,-16776961,-6683018,721420543,-6664000,-352321281,6809603,-1962742397,1297948645,503317194,1430622296,-1910575989,384599000,-1928694017,1343679046,1342182584,16777114,48406784,1946830393,-364475096,-659009514,-1706025472,791,360038411,-1207273729,726664196,1347440832,16777114,-339727616,112643,-1962742397,1297948645,1426065098,922741899,1622672098,-1202708989,1344144072,1343238584,151706,81152,-1070921355,-6664112,-1962934017,516120037,1430622296,-1910575989,1894548440,-1987033459,1452078662,172395512,1946961419,-1960842437,-986974650,1023438853,461176931,-16097596,-1977218490,-161561593,653674239,1589905288,1065362954,-992447232,-970525090,1183645703,-1706027376,544,284444359,239504128,1946163261,1850680,490563700,-950111232,3208262,31078143,-126419120,-1946781953,-986974650,-134220755,-6663976,-1962934017,1452013126,-96040456,-335784311,44480521,-1929754999,1589967966,1065363194,-1960283136,-986974650,1023438853,461176931,653936383,1589905290,-163119114,-351827930,52869337,-155660565,-993400063,-970525090,1183514631,138808070,-1014282636,1183433356,-61437446,1183522795,96807926]},{"sector":5,"data":[1664942192,-1004831488,1191118430,126494214,-631100,-2010712506,106873863,4161574,1589958773,130426614,-59310336,-1694861569,65535,12992131,721712128,-2096174144,1946161278,273058565,-492764181,1183666178,-1202710896,1344144564,-2131474805,-1706028852,65535,1962934589,112645,-1070923029,-1962742397,1297948645,503319754,1430622296,-1910575989,621078744,1342479523,-1559855896,-1511521076,77374244,-472786805,36091903,-2096731928,-443874579,-884122337,1167087646,518818645,-326903666,1187468900,-1879047940,79489038,-397361109,-6678390,989855999,1963123206,-401698811,2122394437,1963196678,18934019,-1996174175,244379718,-1577087768,1178141900,-15633168,721753654,-1202696000,-1706033151,65535,379602573,85893456,798642206,-1879048189,308471822,379602573,85893456,1134186526,184549379,-955943744,130118,379602573,31504464,-6664162,-1879047937,293791758,379602573,31504464,-6664162,184549631,-955943744,130118,-1985984883,1452055622,-1671510882,-1952692481,-788227018,646220518,641795074,1586169736,-1673068644,973588006,-1996153183,300675654,-6529340,1988860998,-230227982,-2010774390,-228685049,1962950528,-1605988889,1996443670,-1669922914,16777114,-1898411264,1065363138,-1005947812,1191156830,130426524,-1671510948,647775999,-1960179770,1191156830,130426524,-1671525586,647775999,-1960179770,-970548130,1183645703,-1873799520,598599694,-1878173720]},{"sector":6,"data":[188737550,132648592,-1375287538,-16777216,-1929190858,1343681606,16777114,-126419200,-1862633729,136636430,46413567,1347469355,1342177720,279450,-58817792,-2130217728,67176062,922685813,-1070922550,28856400,-191213568,-2130706430,67110526,113706613,188,1312455,-1147535360,989855746,1963123206,112649,-401698736,244328753,1577278440,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,108432214,993904267,-385649408,58589321,755114985,138215474,-385649152,-1073544595,-1476448621,384304816,39840252,503469240,85893456,60444702,1442840579,323226,38267136,6831747,737181185,280514752,-1070903296,1347440720,250089104,36432380,-26026,1183383552,1975520250,35383555,-26032,-1073020928,922686068,12059362,-1070903292,-1706012592,1364,-1694861569,65535,-2097023767,31806,-353827980,-26111,-488046592,1488897,1354771280,16777114,-603535616,-16777215,28838006,-1070903292,-1706012592,65535,-956187415,16899078,142016256,370586,-62486272,4372560,1354771280,361626,-59310336,1342194104,-1705983957,1428,-1191414017,-1202716611,-1706033144,1463,909749739,57999390,-16681751,765069430,-1996488698,-11469754,721428022,-929410880,-1996488699,-16769482,-1202258826,-1706033144,1597,-397361109,244323698,724056296,12624832,-16463709,-1207778250,-397410303,922688444,-1070923068]},{"sector":7,"data":[28856400,-2003152896,-1207959546,-1873805311,664528910,25312899,-385649408,922681609,-1070922552,346482768,956366057,1962983990,15984899,1206390416,142016257,16777114,-62486272,-1036583088,1354771200,413338,-1036613376,-59310336,571478,-26032,244318208,-1878467352,195356686,-397361109,922686690,922682052,-1070923656,112720,-26032,244318208,-14183192,721601590,-1202696000,-1706033151,1061,1342177720,182980240,-939079897,-2097151996,98878,-1070921868,367546448,-401698796,1743454496,80151751,80151788,79168720,80151730,1111295175,-385649408,528481789,1962949949,-24647421,2080390717,4144446,-1175911553,4275710,1290339189,1026354174,394199113,2080393277,-36706045,2080392253,4668698,384369535,1024519167,57999434,1040040425,58001360,1593684201,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,425603,244319605,-14232344,-1711094730,65535,1358710409,-14868760,-16595914,-6620042,-2097151745,1946158718,1354771208,988286608,49120038,1562371467,182861,1167087646,518818645,-326903666,306086662,796131328,-1727953759,-120470997,-1577433463,731448096,-1980182078,922745926,1183646434,-1706027270,65535,-362753,-6620042,-16776961,-1711041994,2021,1342177720,515226,49120000,1562371467,1478413133,-1957345904,-661774612,-1705983957,65535,48641791,16777114,49120000,1562371467]},{"sector":8,"data":[1478413133,-1957345904,-661774612,17464963,1048785012,1946157240,-1140406510,-956301056,47110,335988480,-1962934016,-2069690810,138840833,-16572253,-1873803658,67954702,113713899,65720,12861059,-16157696,-1711225802,65535,-397361109,113709814,196,-1962742397,1297948645,-1946155318,1430622424,-1910575989,49054680,-1957341354,1988824190,-1950338294,-1175942184,-422510560,-392833071,-1818951574,-1828690456,-287178732,1432210827,-1962508604,403749353,3664018,1960083,1697941,-1070350285,2116771242,-947171578,-310157729,535137026,147475805,-729133056,1509949928,-355405174,-355407152,48818896,-2133423616,41160674,-838991695,-897528542,-2133775824,57942266,-1012219254,-2044215278,666899140,1438893190,1452010635,-854674428,-1947981279,46292453,-1864856576,-326412987,-2585058,1996426870,242679564,-1710459137,65535,106349854,567089844,-989180277,1320422486,41034189,1344258099,-15829249,1996426358,209125134,16777114,-310159360,535137026,181030237,-1864856576,-326412987,517508638,-1274652987,-1272853222,1914817871,532689666,-1962742397,1297948645,1426064586,1465314443,72795422,567089844,-1274521915,-1742615279,-1956749537,146955749,-1864856576,-326412987,1457032734,2126782039,1183579144,1975519750,-853953530,-1967063519,-1436766000,-141877498,567101364,1996428146,142016266,-16091393,1301940342,855638025,1583292352,-1962742397,1297948645,1426065098]},{"sector":9,"data":[-987829109,1589905494,1258338308,-1960894003,146955749,-326413056,1443949699,1183516247,-1073337590,922196224,1183384314,-1983892496,-1897267642,505318144,-1947994365,1124124702,-1023153199,-1946532215,512487494,-470351120,-1996486651,1183579206,-98661392,65271554,100924998,-523173696,77465091,76279947,-150989125,-1898411037,28837446,662709760,1073837072,-2081143159,1586039235,-129594122,1460075403,16777114,-230258432,-15960321,1996487798,-126418950,-624897,-6622602,-16776961,1325399110,-2001420,1325399622,-1961724920,104595014,57869050,-39191,1491726406,1583286271,-1034033781,-1957363702,183272428,2007302,1962950205,73319446,-1727558874,49290891,512488439,-470351110,-997191189,-1960442786,-397409721,-1073013627,55050612,-1996439546,513932870,4078848,1589911157,1200301572,120268292,49290891,-1723284733,-1958677513,-150799842,-1877873693,637820612,637945739,1342326571,1075594472,25304715,1929272875,2126723928,-1983673598,-1072956346,-996062348,1958742784,-129595068,1183432755,112886,1342994175,16777114,507413248,360005120,-15960321,1996488310,-126418948,-386500865,367787643,209125264,-100609,1996487798,-159973384,16777114,-443873536,705117,1167087646,518818645,-326903666,142016274,385238669,67738192,95944704,-6664192,1375731967,-26032,1183383552,-6663952,-956301057,62022,16008903,142016256,384976525,128227920]},{"sector":10,"data":[1996423168,-227082490,-1695254785,65535,-16353537,630911094,-1996488692,1996484166,-163148538,1996443670,-25872,1996423168,-294191354,16777114,-260636928,16777114,49120000,1562371467,313933,1167087646,518818645,-327034738,1448542336,-150680415,-1325063634,98620163,1183383560,52339074,734147481,178626,-1036781357,1183433259,138841084,2105689657,80519441,-1962601821,1183416902,56533498,1183532011,535816,572427161,-754732795,-1946421277,33457136,28837245,-1962743040,85107654,86126327,-523041871,-1996486651,-861799866,302383876,-1952888827,-150662642,1580136441,-62521085,503439544,221813328,1183383552,787955960,514000162,-128021758,31492038,-1807315712,513888278,-1706025467,1219,77610624,-2094042112,121918,512436341,2139096350,259260417,378816141,2144336,781864990,-1929379827,1343657030,503619768,-26032,1183645696,-1706027372,2693,86126327,35522051,-1551874423,1183515168,-2142895230,989857797,746391622,-1727848799,-1037319629,-754974023,734147576,-1580692542,103482206,731448094,66638274,-2042197567,-1980086645,233538630,1090274955,-2042197696,142886599,-2008627456,1183514632,-2008643320,59131531,-1996284410,-157185466,-96061182,-123664267,-62506750,922702708,-222821662,-1202708990,-1706033151,3670,-1727848799,-1037319629,-754974023,734147576,-190625598,-234436862,-1962932222,-157025722,-62485758,-16582493]},{"sector":11,"data":[-1207626186,-11534328,-16583626,1996487286,1354771452,952986,-1975088384,-1996487675,1183551046,-1840871162,-150854495,-1941534248,50873995,-1996348410,1319211078,-1840905982,956503713,276137030,956504737,141920326,956504225,1182041670,48379647,503518904,112720,246717008,381616128,-2072605437,371066654,-1515870945,922689445,922682570,922682134,446759704,369502979,480333827,403057411,-1070903293,249862736,-1969160192,-1908000511,-1902047115,-1840891647,-1935603595,-1874446079,922700148,-2001206558,-1202708991,-1706033151,1527,-1929279297,119442550,-1524689378,530949541,46413567,-7571713,1183551094,-1941558384,-1840870576,1351501355,-1705983957,65535,80230143,1579107816,49120095,1562371467,313933,-1275051,-1711094730,65535,-1710983425,1856,-1034033781,-1957363710,108462060,-1710983425,1875,46413567,16777114,1575324416,-1946155838,1430622424,-1910575989,451707864,-1593419946,1183383746,12886522,192200715,-1946401143,184669726,-352094757,-1960931234,-1947479557,1443621875,-59310249,-386238721,-2092040107,-277020418,-544522773,872177294,-1928915210,196732030,514191872,-1946209529,1489347,-259268105,-1510807087,521599115,-1176209779,-1510866933,-1070335093,1996445520,-92864516,1325404392,119521397,-310157729,535137026,1439386973,-326898549,106386968,106860062,-1156954485,-470351850,118943883,-1175945587,-1510866933,-787855733,1183400160]},{"sector":12,"data":[140413950,1450427195,1958951755,1489689,-670833673,1394495518,-402360577,3997791,-16548608,118947398,-1947697523,381419078,115603200,-11526569,1088947318,15616,1183521917,1489162,-125050377,1183516446,172395006,-259268105,-1510807087,119446251,1988960022,172395496,-150989127,-789017631,530969321,-1956749561,146955749,-326413056,503732054,-1005947195,344589918,638640768,1947207670,112649,292934154,-4707349,1976699647,71732004,1962951741,164004639,839500675,975613156,1124562183,-176832502,28313579,-5242249,8448408,1962952253,112668,638012555,1913081659,-1962314260,992347468,-512621233,-335544392,4537820,28843381,55347968,55524134,-394933390,637619339,1912688443,870152128,-2084901952,-829748794,1017963570,168064046,-1946716736,-2081190954,-24442426,775728166,-1073085324,-561252747,648868491,208996154,1975519811,-1947104267,-9704993,-1744360922,1583286047,-1034033781,-1957363702,183272428,12861059,-950111232,65094,12850827,1183432747,-128546314,-1577433463,1178141142,-1958248966,1452013126,591352,1183535186,591350,-610643886,-1962934263,1452013126,-163150856,591126,-694529966,-1996488692,1183579206,-62506498,1183516286,-28931588,-335919361,-28915786,1183514625,573503486,-1194816763,787939333,731448610,66638274,-267482680,-1715369214,-1037319629,-754973767,734147576,-754732606,49325024,-150991688,-1559944658]},{"sector":13,"data":[163054316,573503232,56402693,-1017256565,1167087646,518818645,-326903666,-950642934,98822,-1073297664,-956301312,313350,-599883008,829685761,1342193848,1342210232,16777114,-62486272,494190603,503369912,16824400,683167774,-1957683712,1344207942,1342210232,16777114,-1002536192,1299447808,12850827,1183432747,-128546314,938210859,653680324,1963984886,-1933341926,591298,-1598533550,-11526652,244382838,184571880,-1089506112,495649154,-472840705,77479563,1183003017,960894710,2130826806,-599882813,242483201,16547459,1996425332,85760764,1048772608,1946157442,1354771207,133097552,46413567,1342177720,1578028008,49120095,1562371467,1478413133,-1957345904,-661774612,-2096436093,121918,-1310129291,108954368,-955222784,2623046,2122320363,276049654,-1005828353,-1977217954,-163149817,-361381878,638344900,1962950528,19130627,-1962129665,1183385158,-128021512,1962950528,17819907,1191117803,-128021512,1948270464,4161781,1183572852,240552716,-1980086647,485227606,720782986,1372138468,21797456,1589903360,121120506,1191121525,-129564678,-1963434357,-163149817,-663412676,-1963434357,-163149817,74719292,158711818,-385875528,1191116979,-128021512,1033373578,-227082208,1589938155,1065362952,-991857664,-1977218978,-163149817,1987362826,2768280,775765108,1029338112,276037695,638344900,1937049400,-15972609,-739571642,-1006090497,-1977217954,-163149817]},{"sector":14,"data":[1534377994,-1082905028,-351516929,-159481670,-15698898,1589906502,126494220,183912072,-991267392,-1977218978,-163149817,-1753956342,-1821102532,-351779073,207537386,775913510,-2144949644,393543743,1589945835,1065362956,-1005816576,-2144991138,57999423,738150889,49120192,1562371467,707149,-2081649835,-1667148052,-62486268,-1560000885,-661977956,-1207966767,-2098724314,-1438216716,-1070903274,-401698736,-1072958181,1183520116,77374460,-472786805,36091903,737435880,-15340608,-1207770570,726664192,1347440832,332954,112640,-1034033781,1478361092,-1957345904,-661774612,10415233,31506006,77340299,-2020940847,1090781734,-968489848,-968476156,1187381252,1187446678,1187383452,1183645853,-1202710882,1344143428,1416090,-1773761280,-2037559274,1343684452,200571112,-1923779136,-1979746682,1452066886,-1928401974,-1929417594,-934921263,1325337715,-933313336,541032486,1589963124,1065363144,-16550880,-2037528506,1183448940,-61436678,-1949809013,1178192470,-1005685766,1191180894,126494458,-347732856,313063,49120094,1562371467,1478413133,-1957345904,-661774612,-1923945341,1343663686,-1873756117,-199628786,74760203,317440043,503652001,-1371108016,-124104682,-1207959540,-310181887,535137026,1439386973,-326898549,138840864,1946288189,33635668,37555060,-385649406,803799238,-499712254,-26110,1048772608,1946158258,35449091,956440737,58459206,-16641559,1183517302,503720708]},{"sector":15,"data":[417878018,30974723,58189904,6555335,1996423169,-26102,-337051648,1681818369,57999360,-2097028631,307774,-672595084,75399937,-1588888576,1178141216,-2092729084,2080376446,52339005,2131117625,71732021,35522091,46524496,-1577564535,1178141144,-385649160,-12779102,-16288513,-397407626,1996423953,-129594614,1342298275,-385678104,1048772998,1962869208,175570698,30947071,-956108568,-16656378,23915007,6569603,-385649408,113705314,100,16777114,-666991872,58064641,-16691735,922684022,-1092091432,108954370,-1593082624,1178141470,-385647098,1421345074,-1588584958,1344144670,1374618,-196688128,1048773205,1946157528,30974254,-1946532215,1065415774,-350194688,-528580599,-15764480,1586230342,-2012771596,1547493446,1325394805,-92371974,-1955171072,130479198,388995584,1183383552,-27883012,16777114,-163149568,78776007,-6684671,721420543,1444674630,-1949791234,-628361658,2128231321,10610947,-935655556,-1729559694,-498692864,-1070903274,-1202696112,-1706033151,6056,-965427189,65306241,-1926794238,1343676998,16777114,-498692864,-6664170,-352321281,-195130455,1962950528,-11015933,-369867009,1183711057,726669026,45633728,-1202696190,-1706033151,65535,-428556277,78776007,244318208,737129960,1421365440,726670850,-1706012480,65535,309641227,48379647,1342439608,1347469355,346921552,244318208,-336599064,-1308178673,-1207959548]},{"sector":16,"data":[-1706033097,1225,-1034033781,-1957363704,1793885164,-1136753834,175374336,1326723,-385649408,1996423408,74907398,16777114,1958742784,14608643,-1207404801,-1706033144,3015,-6664110,-16776961,28838006,1838829568,-1929379829,1183422022,-61436678,-520206649,-1005458687,1191180894,-25785350,-1963047169,126363140,-2130813301,-411762625,-368956,-970524090,513875975,-28931835,1589907947,-96010246,-100725,76217926,-1962440666,1065418334,-2132314880,303166,1048787828,1962934748,505318196,25133061,-1005947904,1191180894,130426618,-28915876,300614816,-368956,1988885062,-28901378,-2010774390,-27358457,1962950528,-94452505,509478,721975039,-928952128,731463680,1358483906,378947213,-1916564656,-1054108082,178231888,-1956773888,146955749,-326413056,-1593381757,1178141986,721714436,-951129152,130630,1074077345,-1946401143,1065417822,-349867008,1952201735,-62456049,-1963172213,-96040953,-311050230,737953419,-150659578,990192174,92144710,-335657333,-60912880,1946173312,-62456061,-335657217,1575324606,1426064066,-326898549,75399956,-1593281280,1183384866,-1587090434,-1992293090,1183576134,-230258428,2122328555,259260652,-1947187457,126546014,1022117512,-1346212,2122576462,326369522,-2131730805,57933887,-1947187457,1065414750,-1948748544,103542854,787940638,1183384866,-226589698,-1206750208,1344144544,1152922,787955712,1174471970,-28931074]},{"sector":17,"data":[35522051,-1913370999,1343682118,35534591,-11485141,922743926,-6683874,-16776961,-404224394,-297367052,-163148464,-6664170,-16776961,1996424822,-185931538,-1034033781,1478361092,-1957345904,-661774612,-1960645501,255659078,1026454528,477364244,1912733757,33766734,1996441975,1996443662,108461832,737888488,1273731520,-15829249,244320886,-336513560,242679790,383665805,-26032,1996423168,-562626802,383927949,-43063216,-1928431873,1343675974,16777114,-3872000,1996426870,175570700,-16222465,-6683018,-2097151745,-443874579,-900899553,-1957363702,108462060,-1962840088,-1073019834,1996424820,5105670,-1034033781,-1957363708,-1962518548,-1962907634,512314329,-472842136,1715374931,-1948318976,71731991,-1343092962,-1031057585,45832363,1714880256,-1705816064,65535,-16750941,149423222,-1956706560,46292453,-326413056,-1003028650,-204412926,-11472757,1676149878,-1003028736,-639085054,-443851021,180829,-2081649835,1465255148,-486257013,-1003028693,-207296510,-1946270071,-486512626,-1946580207,-1392482762,1358853887,1325410792,922744181,1996423876,-207951618,6819467,-1070395677,-16750429,-1711249866,4798,-443851169,180829,-2081649835,106369772,-956021109,588870,1982083,-1724877506,49946251,1183446007,-162100744,-1728003935,1586230263,-1579668488,-470351120,-1946401279,512489030,378209008,-634714846,730863595,1912651782,-1194816695,653721643,33883426]}],[{"sector":1,"data":[-1948742912,505870273,-28931837,-2080612861,1586037443,-1928915206,1183575678,142844,-28931157,-96040021,-28931157,52299267,-293696085,101086975,438278743,1594294272,-1034033781,-1957363708,6857196,259375115,-1157627208,1347616832,1192346,1074916096,45867217,1714880256,-1705816064,6924,393527307,-1962907997,-788502498,-1948777501,126420038,6817535,-1962907487,46292453,-1864856576,-326412987,1473809950,1745783558,119423232,6700683,-234469749,130124719,49120095,1562371467,182861,-2081649835,1448547052,-16353537,496632950,184549400,721777856,19327424,-1207404801,-1706033144,7395,932859986,-16777192,95946870,815419392,1375731736,-26032,1996423168,112648,407083600,1996423168,-26104,1183383552,922702078,127533766,721420300,12052982,-1461059797,-230257920,104580867,58459340,-1593793559,-285801634,1183400000,86155764,61992951,1077993683,-1191819639,787939331,731448610,-1980182078,1996484166,-163183864,-193527984,-150991432,-1727716818,-120470997,1357792811,1073946273,-25755824,1347469355,13239865,548931700,13416960,1723336427,10074624,-6664110,-1962934017,-553389474,-2020940847,1090781734,-506232,1996425334,13148662,-775804007,-196738056,1183666240,-1202710792,-1706033151,6402,306067783,-385647099,-1589182641,-285801198,1005733513,2097466374,-13047549,-1694599425,65535,-16222465,-402351050,1599995912]},{"sector":2,"data":[-1034033781,-1957363704,216826860,-1727773045,85069451,788003319,1077936990,-1946925431,-140966842,-138245127,-1325063634,1088475907,-163149504,385369741,-163148976,1342178349,1223968395,230182984,573503232,-1037330171,1174665425,263670,-196703408,52299267,1342178053,1706906,108461824,385369741,472554064,-443875328,311901,-2081649835,1183516396,33570056,20791412,1023964162,578028034,-956264983,16807430,-499712256,365861378,1996423168,369531402,-1667170304,80782084,1048779755,1946157174,1980155751,-1711276032,5789,1048774635,1946157174,74907475,-402229505,1183383760,-28931588,108904459,-1996186463,-794690490,-62506748,1996424820,3336444,16678531,2122393212,1963065864,-401698785,1996482678,-801702134,-178722812,125157387,77346559,-1879045144,-390404082,-1034033781,-1957363704,49054700,85341951,-1980770840,-11469242,-402337738,1996488388,71732222,1342492835,-83992,-16443850,-840368522,1575324655,503317186,1430622296,-1910575989,116163544,33310407,108461824,-1862290456,-402331634,85341951,80754431,200599016,-15960640,-402351050,1187512216,-1879047940,-398268402,-2080618869,-443874579,-900899553,-1957363710,49054700,85107030,86126327,-523041871,2114340411,108954428,-2093581312,2080375934,71732016,1578011545,-134613245,-1962601938,105286600,572427161,-1309570299,-136064253,-1980759045,-861798794,2112895748,-339309820,-18429]},{"sector":3,"data":[1575324510,503317698,1430622296,-1910575989,585925592,1024214667,812908559,20797559,-1587383040,-794622820,-1715459324,1996450795,209125134,-16222465,1072170614,-1381378,1996426870,-401698806,-571741330,-1928431873,1343675974,1736346,242679552,-1914800385,1343676998,-240152,1183649398,-1706027298,6809,339588075,1036284928,91357696,1979843133,242679721,-15960321,1996425846,108461832,1748890,49120000,1562371467,707149,-2081649835,1448554220,1024083595,141820417,1946288957,15919455,48379647,2003610,74907392,-402229505,1183384232,-49666,-706149505,80257792,224716880,-1862371585,-72751090,443924491,67651318,28837749,1541951488,-25755654,1342177720,-369505304,1190527144,58000392,-16736279,-706150794,9890297,-16484609,1441269366,-28931838,2147483453,8579331,1342177720,-384536,28900982,-1847046144,-330920455,-1070903274,33732688,28856400,1620725760,184549399,-2082048832,50238,378228852,-1070923580,-1982708087,381211734,-27358464,915137489,687277214,-1949153791,1452003910,-696349228,118943883,-1176859106,-1510866933,-700019425,280514582,-6664192,184549631,-1207599680,48955393,-397361109,1599999242,-1034033781,-1957363702,384599020,1048794711,1946157178,27715843,7997127,1996423169,112646,1354771280,507413328,91569664,-352321096,1354771202,2225562,108461824,1347469355,507413328,91569920,-352321096]},{"sector":4,"data":[1354771202,2266778,2013710080,-256,1183647350,-1706027276,9229,385107597,602511952,-1073020928,113708916,66298,1836743,803799041,-96040191,38667819,504269721,-1543899389,20775674,-1207730432,-89980927,507413250,57949696,-1962899991,-1952843706,-150802418,1876985,2097152317,470206214,-1593835264,787939356,104530682,914162050,50430625,1208154630,-99710055,737801986,-1996481530,1996483142,1354771206,-361300144,586783312,1048772608,1979646072,2013710094,-385875968,1187512149,-1593835286,1183383744,-364475410,49950455,-1063128949,244029696,-101252358,-125048329,1031732795,1005307531,1836743,-2103377919,-100255487,734493954,-1996293626,1996483142,112646,1354771280,1357543167,16777114,2017362688,-1418330368,7866055,-219611135,-1547203586,1178140864,-15633170,721601590,-1202696000,-1706033151,3524,7880323,-2094432513,1040195134,-1063187339,244029696,-101252358,-1063189525,-330921728,-16353537,1342208054,-1710983425,1650,7997127,1599995904,-1034033781,-1957363708,49054700,1982083,-1590266562,787940126,1178272506,-1960477180,-1952905658,-150802418,-97585159,-1949791486,-1952906170,-150790626,63439867,-1996439538,384564814,-335544392,71731996,504269721,66713347,-1996439546,-2103312826,-28952319,1183572605,1575324670,1426064578,-326898549,-1136753906,2037710848,11419267,-385649664,1996423297,74907398,1883034,1975520000]},{"sector":5,"data":[175570754,1342179512,1888410,-1706012160,7383,-1928562945,1343682630,769690,175570688,385369741,108461904,-402360577,1536878252,989855748,1963123206,175570694,-2097137944,47678,1048783220,1946157524,209125154,993690,-737753344,-352321535,-499712238,67155970,1354771280,-560312240,-1962934249,180510181,-326413056,-1593512829,1183383654,-62470146,317390848,-1962641665,1183055454,939459326,-586264,1755446342,-62506752,-443816324,180829,-2081649835,-2091510548,-16746434,-1696005259,142016257,385238669,570989136,614531072,-163184382,1982083,690582846,-90047930,-230258430,737822347,-1952844218,-150802418,-97585159,-196703998,695582731,-1996293471,569111622,688017057,1187511366,-1962933774,-1952842682,-150790642,-196703751,91602955,32786119,12624128,-940554615,65094,184960651,1024881856,796131329,1946157629,212271,71118708,-349211648,-230257912,1183439095,-28931074,12584449,12598915,-953123584,49158,-1955599616,-487853498,-336312693,-196703269,1048828139,1966997534,71731981,49950455,12584491,1183565035,-2081035516,30782,-2103367819,-100269311,-1952888830,-150799858,736753657,1183446086,12624366,2112767545,-297366751,-352272221,2017362713,309657856,25310859,49952299,12596793,914949246,-1063190336,-263836928,201213577,-2089978688,16807998,1996431989,112648,-1070137520,312102912,-16777178,-1070921610]},{"sector":6,"data":[-28931248,787994871,820708126,721975039,-1063169856,244029696,-101252358,112720,592747088,1996423168,-28931320,-99710055,-134613246,-265357352,-1070903294,1354771280,-1706012592,65535,-1710721281,65535,80230143,1577577960,-1034033781,1478361094,-1957345904,-661774612,1461906563,242649942,-1962115445,998855,58087284,1023444457,141819905,1946158397,9562420,112726,1354771280,-1818603440,1442840614,1347469355,-644198320,721420321,-2132174400,-11053568,1996425846,108461832,-335943192,-1070901526,-84744112,-11083285,244320886,-337319448,1183667926,-1706027298,8261,-562626730,-1914669313,1343676998,1459417320,383665805,543201872,-1343553536,175570774,-402229505,-1544815190,1946162237,18103741,356323186,1038448129,91357696,1979843389,-11053424,1996425846,108461832,2131354,-2090902016,-443874579,-900899553,-1957363702,82609132,-1980353706,-396951946,1072226753,1975925504,112678,-6662576,184549631,991458496,1963236406,-28931322,-1946401143,1191181918,-1981558274,1174546103,80492091,1183565948,80520190,1593591435,-1017256565,567089588,1438901290,1183575179,505318148,1220739843,-1946945639,46292453,-1864856576,-326412987,-2082959842,1465265900,-1983892730,-996017082,1958742784,1150963718,-1207959544,-1096613868,1489664,1086055415,1347572480,16777114,12886784,58048523,-1207918359,45809704,-1640562944,-1705816060,7260,58048523]},{"sector":7,"data":[-1560246039,817562782,-1912655104,1996476534,108461832,-1873406381,-519968754,-1962898967,104594502,661848254,507808310,326381116,12846734,-2095114722,381228486,-5967360,-1927283642,1444335734,552078992,-1587942431,335872190,1489664,-1147542537,922681346,1347551428,-26029,-1073020928,-995943052,12493056,-788524027,179168,77477631,-392539312,184549415,-1156418112,-1070399459,1347441488,244338768,-338137880,77505295,12453507,-8918764,-109789173,-1543747957,-996081194,1958742784,30843162,-1157579101,-470351850,-2411623,1375781942,1452954448,-1593835480,-1073020458,-784334475,-2411552,1342479926,678664787,1594294272,49120094,1562371467,313933,1167087646,518818645,-326903666,-2091493508,5182,12061044,244338692,-1193699864,-1706033135,10531,92127243,-352321096,-1983894782,280557638,664424448,184549420,-1207599680,48955393,1183432747,80257498,-1948760439,3999814,1024160769,57999617,-385731607,1183515305,2112774,-840367243,-385649151,138215934,-385649408,222101802,-385649408,-2031549995,-1003028734,178178,1354771280,-369418776,922681973,62390980,-1947342080,624756294,1031500800,259260454,1962944317,8710403,1946167357,-2096370855,313406,251593844,-928971576,-666486524,988349301,1776832514,-935919869,74246148,14319235,-1394015371,-663290112,-1461186928,1975520242,8644867,80230143,-1729622384,1958743026,34072835]},{"sector":8,"data":[80230143,1342177720,-370097176,-928972295,104546308,-1434648190,80217855,1048814827,1966997534,49979805,80217657,103388284,-1897200440,1982083,-1584958146,100861128,104530682,175964546,16972449,-385562618,-928907408,244029700,-101252358,-1056708105,25298491,1508443004,25338367,80257864,-45079,-1878734794,-233445362,58048523,-16677655,-402339786,2062151776,-125926655,-385649664,28836209,-1209511936,-10425872,-1987557747,1452049478,85893510,-335919479,-2074164207,-1954265345,1191180918,637831930,1586169736,4161786,1589962613,130426500,-1928467712,-779319226,1988380217,-2075197684,646209220,1968979840,-2008642070,1312412044,956855686,58033222,-997964033,-970554274,244318215,735869416,1183666368,726668936,-1706012480,6088,309641227,48379647,1342439608,1347469355,610245200,244318208,-371414040,1048772817,1962934658,13101315,80230143,1223167632,1975520241,-21960445,-2080427799,34878,-1427569804,-2012821760,-1962934016,-2036082106,10217728,1962942781,-32642813,1962943037,-32052989,1929389373,8644867,1996499005,-32511741,2122545643,1937050886,8928899,-949193728,34822,-2109832448,1601437697,80230143,-521662832,1975520240,-935919861,112644,-284235696,12861059,-1958710272,721470486,-196703808,-1191815543,512426006,-472841016,77477515,1174481143,-196703244,-1913235829,-259268994,-1910634730,768474,-1927305742,1343675974]},{"sector":9,"data":[8795903,1577234920,49120095,1562371467,313933,1167087646,518818645,-326903666,1048794640,1946157076,67155977,-401698736,297326202,-1952821248,184549409,-1207599680,48955393,1183432747,80257532,-1963964791,-467007930,1347537195,1272474,-1981535744,2122516038,1098121468,2097152317,12314883,2113935933,11790595,-955887873,63046,956615841,58521158,-1962893079,-472779170,956712587,1963075207,-159973621,-1092088176,8907250,-336181505,-1002535977,2121531392,12850827,1183432747,-94991880,-336181623,-939065542,-939116284,-955878140,313350,1488896,80223883,915137489,687277214,-1946663421,1183447638,-195655182,-1963827516,942016070,192153927,-1577695489,1178141058,-1581351690,1178141896,-1205832464,-397410303,922742338,568853704,-935919872,19195908,80230143,1342177720,-1192385560,-2090991615,-443874579,-900899553,-1957363710,49054700,956350625,276563014,-150987615,50526766,989904902,1367278662,1982083,-1591446210,1178140864,-1962115836,-1952906170,-150799858,-1960449031,-1952906170,-150799858,470166521,-1592464640,1178140864,-1962574588,149619782,721700491,1073936902,-113015,-1207778250,-11534332,65601142,1575324663,503317186,1430622296,-1910575989,82609112,25312899,-950963200,16824838,507413248,209010176,721612961,84222470,183173124,-150983752,84222510,1183383557,-1003028484,112642,-59310256,-26032,922681344,1139279048]},{"sector":10,"data":[105286400,184669347,-16157248,-1711094730,9285,-1962742397,1297948645,503317194,1430622296,-1910575989,-1170308136,192151552,12191431,-6684672,-2097151745,-443874579,-884122337,-2081649835,1048773868,1946157242,-2109832351,1517551617,117196487,507413248,896876032,956350625,175965254,-150802271,-62486056,1183520235,-1073337596,244029696,-101252358,49295095,-1946401279,-1962739186,-140966842,-339571719,71731975,12584491,506394432,1183401987,-59310082,-26032,-443875328,180829,-2081649835,1589905132,133572102,-1875217392,-659232754,-1588543445,1344144670,-1962522997,151324758,-1706012160,11012,309641227,48379647,1342439608,1347469355,723163728,244318208,-338108440,105286508,84432523,1183383561,-27883012,2122320363,276049658,-990099713,-1977156514,-96040953,-361381878,654073540,1962950528,1354771229,1342184376,1347469355,-1962522997,151324758,-1873784320,-776214514,1183522795,139889414,1375734021,75400016,-1207602176,65732610,1342366369,2095582864,1575324418,503318210,1430622296,-1910575989,149717976,-1962522997,1183385686,-61437446,1234849874,-352321492,105316099,637951684,1962950528,-2146112524,1949235326,-96040165,972838539,276170310,-1006219521,-1977219490,-129595385,-545956804,-16359740,-2144991674,1316302399,108461830,503351992,803117648,-1073020928,1996439668,108461832,503353016,804428368,-1073020928,1996434548,108461832,503354040]},{"sector":11,"data":[805739088,-1073020928,1996429428,108461832,503355064,10525264,-1073020928,-1070922636,28836843,49120000,1562371467,313933,-2081649835,1465266924,1187445790,1992622286,75416584,792505004,1547437172,1191052149,1975519950,1170679535,640298751,369182088,-732525281,567089844,13780679,72795392,1320470835,57811405,-2147437591,1946209918,9103619,16777114,-1898410496,-1946145762,-164375970,1946172544,1346219381,-1391758015,1967674429,1027386373,179046260,-335841856,-797537821,-1408991548,1950039210,1975519749,1555058422,994828171,58000478,638315343,1979598136,-2010755327,1988755269,-765555504,-2146928955,1966735740,-1404680702,1975519914,1170679546,640298751,-989772408,-919403434,567103156,1992632435,3965136,1992664693,75416584,-1073042772,-953746827,1160707909,21350182,-970570408,-385875131,1187381426,521535695,-1393396083,-76206532,1480932481,2088963189,108348674,147803776,1015100651,209014595,1292008579,1317013109,585827535,1094859905,2088963189,108352514,47140480,1015099883,175458640,1174568067,1317012597,1337197007,-1435295283,13598336,2122323317,57934030,-2080409623,1962988158,-18552573,-973118487,1017906294,1325102378,-1731246454,1094845639,1409434823,1963108352,1124386595,38061903,78118989,80156277,1153914949,-1476377342,-955681528,-951496700,4588100,-1956749537,146955749,-1873273344,-326412987,-2116514274,1442894572,16533191,175570688]},{"sector":12,"data":[-1710721281,13302,2113961789,140428296,2135410214,175570688,3297690,172394752,1342193848,1342210232,3288474,-632911616,343195659,1342193848,1342210232,1853850,-1136228096,360038411,-1202667477,726663192,1347440832,-401698736,-1259745619,175570692,16777114,-1983739136,244320838,-338357784,138870531,638082756,1948270464,981896692,105912063,859740755,-2033778688,65334,638082756,973176704,-1977215115,736373255,-1706012215,13140,1076749354,914786560,-632910849,-1224781794,244383542,-1982401816,-1072972218,255660148,-385649408,244318830,-371913752,1589904443,1065362952,639333678,1543602048,-2144988044,1949172095,38594819,41910310,-385649572,1183515202,173443848,-1983363447,434883158,578039612,510926908,58010172,1006773737,-385649345,1191117342,-933313336,-2012771802,-1073029050,1183570549,-900297784,-1981528439,1177282134,814123272,981896703,-11528449,1996425846,880515592,1988820992,141962184,-12942650,981896448,-1706027265,13619,-12941683,434655254,1975520004,29681923,-1098902037,1952251694,138840860,956978827,292997190,-993505537,-1977169826,780568583,1965964543,-933313315,775913510,1183541876,948341210,138841087,-1995811189,1451870278,-2145260598,805252798,-1098897292,1948319534,949914401,948371455,-931740417,650659583,126354570,650665668,-2037905526,-1073021138,-1635004043,130481976,-632911104,-2037559266,1343684410,-1912851992]},{"sector":13,"data":[385825414,895916624,-2037841920,1307311920,-12941683,-1933293943,1183565398,173443848,-1983363447,552323670,-13713792,-2144898001,553594558,1589911668,-934871096,-1006138842,1191167070,126363332,650665668,-2037905526,-1073021138,1589957237,130426564,814123776,982420991,-1933507585,-1002010158,-339323255,-1001455869,650403524,1965965184,-1001979916,-13465971,-16363498,-1013267338,-1207959500,1344143697,-13465971,1354256406,-1957683711,1344199238,1342210232,1201562,1958742784,-1136227460,-1950726519,-2037786042,1139539768,-13713792,-1960151714,1344191046,-12941683,1553616918,-352321483,-1169752317,-2135269749,-176881601,-2135269749,326381119,-340111617,-1168208909,-1950726401,-1962985290,-16283644,-1946208122,-1962985314,780568583,1975519999,-1168208977,-1962932282,-2037793722,1183579960,-1136227878,-13072757,-338016631,981896515,-1873799425,-96737266,611696651,-12941683,2140819478,721420335,465064128,-1070903296,-2037559216,1343684410,-1427632496,-43062837,517621387,981896528,-1706027265,5841,517621387,896834128,1183383552,-428408862,-1696303361,6625,1038239235,192807039,736386756,-970530210,-1962901689,1344199238,-1673473,530244726,-1962934259,1183439430,-2146309190,805252798,-1098901644,1948319534,-1169752304,-1967497589,780568583,1975519999,-1169781790,-13072759,1191117803,-1168208966,1948270464,516131829,838113872,1586167808,-1962440516,1088064707,1183535186,-1706025286]},{"sector":14,"data":[12918,-1967366517,-259287033,218185926,-13066613,-13070593,-956299322,187462,-1996077429,1187503686,-1962934068,1183431750,-799109938,-1982052723,1452069446,-1983894572,1183438918,-2146112554,1560227518,1183521652,948320730,-15567105,-1946208114,-1962985314,780568583,1966750975,949914590,-2012771585,1023356550,1006924892,-16485062,-1191233402,1344143568,503407800,22853712,1183666206,-1202710808,-1706033132,13465,517621387,848599632,113704960,65898,384321165,948341584,-1706025217,12234,326483979,721541793,-1924115758,1343671366,16777114,-1962022144,1344199238,382486157,-752883632,-939768183,92678,-401698816,2122567920,158663164,-1982183797,1586235462,-58817782,-15830210,1996487798,142016266,904400528,-629243136,-16223232,429578870,-2097151945,1946205310,-1133052152,1805466,-58817792,-1207602626,48955393,-2090942421,-443874579,-900899553,1478361094,-1957345904,-661774612,185222795,1024095424,594804738,1962936381,1354771208,-352314184,1354771206,1342184376,1347469355,-16222465,244319862,-2083944216,-443874579,-900899553,-1957363706,183272428,71732054,-1996073333,1451883590,-16520194,1589967942,1065363196,-1946913536,1451951174,-62506746,1589909106,126494460,1022772872,1007252538,-16419748,-538182578,-1946401025,1452014662,-129594882,-335915383,-159481847,-15698898,1589967942,126494460,183912072,-1947568704,1982594166,150897656,-167050113]},{"sector":15,"data":[-1070922635,1589916651,1065363196,-16550610,1183579206,-27882500,-1980217719,65796694,-990099713,-2144928674,-193658817,1177273227,212472,28888191,-443851264,311901,1167087646,518818645,-326903666,172422664,-954043264,93190,1916206848,1882652417,945789441,922681344,922681718,1268384116,-352321536,1812383564,-1962934015,1856178758,138840833,1358710409,16777114,-129595136,-990226807,1183053918,-1960442632,1468737031,24158978,24254089,653811339,-1960441973,1956840023,1981188353,-59310335,16777114,49120000,1562371467,445005,1167087646,518818645,1996478606,175570700,-16222465,922682998,520028526,-310181516,535137026,147475805,-1873273344,-326412987,-2585058,-16683466,-2097057762,-443874579,-884122337,196699,16713021,131083,16711718,196616,16713006,196620,16712958,196621,16717812,196622,16714653,16973840,75591,196609,16723664,16973847,338188,16973930,337689,16973931,336191,16973933,339686,16973934,327861,16973935,333685,16973937,333695,16973938,209433,16973829,207062,16973830,210699,16973831,269546,16973825,269558,16973826,337468,16973948,336676,16973949,206797,16973839,207039,16973840,327905,16973825,206775,16973841,271360,16973833,327919,16973826,211065,16973842,211117]},{"sector":16,"data":[16973843,209417,16973845,327771,16973830,265212,16973972,395556,16973829,397699,16973830,265175,16973974,333590,16973839,335514,16973842,335540,16973843,333601,16973845,209013,16973861,336049,16973846,336931,16973847,269756,16973857,329077,16973978,269707,16973858,330734,16973852,329061,16973981,210621,16973869,196626,16973872,337078,16973857,196655,16973875,339430,16973987,211026,16973876,339495,16973988,269579,16973869,339614,16973989,331524,16973990,339456,16973991,337608,16973863,337634,16973864,210568,16973882,269566,16973876,328067,16974000,336889,16974004,327763,16973877,327744,16973878,331269,16973880,327817,16973882,265166,16973890,269792,16973892,265261,16973893,337460,16973885,197541,16973902,337383,16973886,210578,327759,16711715,16973832,337543,16973888,331532,16973890,331552,16973892,329656,16973893,329647,16973894,210600,16973911,329665,16973895,210416,16973912,335445,16973896,210327,16973913,210394,16973914,336402,16973899,330778,16973905,335458,82,0,0,5]},{"sector":17,"data":[0,1,0,4063237,774504540,2228266,541937475,541415493,5521730,1144791072,4084297,536870912,0,1061109567,1061109567,4144959,707668572,1543518720,6044160,774504540,6029354,0,1998585856,1701540463,1852776548,32,65535,538968064,1380533308,62,1480916992,1329791045,1229979725,1094844486,538968148,538976288,538976288,538976288,8224,154,1380533308,62,1,1310720,4456448,0,65536,0,1684957527,7567215,1936942419,7237481,7498052,1752457552,1766064128,27507,1769366852,25955,1232364871,7300718,1735357008,1936548210,1850277888,27764,28001,788557168,1968308282,1275068526,6578543,0,1952531561,1416167525,6647145,892416371,846397497,3749171,1148387375,6648929,1416822842,6647145,1954047232,1769172581,7564911,776882519,5066563,1818585203,108]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2097409,4194337,524352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65281,0,65281,0,65281,0,65281,0,65281,0,65281,0,0,0,0,0,0,0,0,14688000,0,15744768]},{"sector":3,"data":[16285440,0,16580352,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16580352,0,16285440,0,15744768,0,14688000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463]},{"sector":4,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,1953300480,1818838544,905969765,1853182464,3026478,1275087360,778330479,11822,1866661938,774797680,989855790,1952794368,1718503712,855638127,1818575872,778400869,11822,1917845556,779382377,-2147471826,1699872821,1701667182,3026478,1701402128,1040711799,1869107968,29810,1867251775,26478,134217728,1816199233,1107296364,1918980096,1818323316,3026478,1342192896,1919381362,7564641,0,1107313672,1632510073,25965,2034368581,1952531488,1174405221,544817664,1702521171,4685824,1260419394,6581865,1701860240,1818323299,3670016]},{"sector":5,"data":[543452741,1936942419,7237481,1124088064,1952540018,1766072421,1952671090,779711087,11822,1749221431,1701277281,1919501344,1869898597,774797682,1207959598,1919895040,544498029,1635017028,1936278560,774778475,4784128,1701536077,1937330976,544040308,1802725700,3026478,1392523904,1444967525,1836412015,1632510053,774792557,1953300526,1886339848,1735289209,1817191200,1702060389,1936615712,544502373,1143821133,1679840079,543912809,1679847017,1702259058,1699875104,1768776046,153118574,1701602628,1735289204,1125318688,1952540018,543649385,1701996900,1919906915,1124868217,1869508193,1768300660,371221614,1852727619,1998615663,1702127986,544175136,1986622052,1124999269,1869508193,1701978228,1701667182,1679824928,1667592809,2037542772,544434464,544501614,1953525093,1126444665,1869508193,1701060724,1702126956,1701344288,1920295712,1953391986,1919509536,1869898597,237926770,1852727619,1679848559,1952803941,1124868197,1869508193,1919950964,460615273,1852727619,1663071343,544829551,1701603686,544175136,1702065257,237921900,1852727619,1663071343,1952540018,1310597221,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,2037411683,1937009952,1819626779,1819306356,1768300645,544433516,544501614,1869376609,778331511,760433926,139677508,1970233921,774778484,1176521478,191194482,543452741,1936942419,141455209,544499015,1868983881,760433936,542330692]},{"sector":6,"data":[1667594309,1986622581,1750344549,1998615401,543976553,543452773,1920298873,1852397344,1937207140,1936028448,1852795251,1867387438,1852121204,1751610735,1835363616,779711087,1819626786,1819306356,1701060709,1852404851,1869182049,1847620462,1629516911,2003790956,858678373,1852727619,1663071343,544829551,1953265005,1701605481,1818846752,1948283749,543236207,1735289203,1679844716,1769239397,1769234798,187592303,1852727619,1914729583,421555829,544501582,1970237029,1830840423,1919905125,1869881465,1853190688,1867394592,1852121204,1751610735,1835363616,544830063,1679847284,1819308905,1696627041,1919513710,1768169573,1952671090,779711087,1851867927,544501614,544499059,1970040694,1847616877,778399073,1851867931,544501614,1851877475,1679844711,1667592809,2037542772,544175136,1851867928,544501614,1634038371,1679844724,1667592809,2037542772,1746932768,1847620449,1768300655,544433516,1763733097,1126772340,1869508193,1970282612,1397563508,1397703725,1937339168,544040308,1948282479,1679844712,1701540713,778400884,1851867927,544501614,1836216166,1679848545,1701540713,778400884,1701597241,543519585,1667590243,1752440939,1948284001,1679844712,1936421737,1701994784,1952805664,1713401973,1948283503,544434536,1919250543,1869182049,1310404206,1696625775,1735749486,1701650536,2037542765,544175136,1852404336,1310666356,1696625775,1735749486,1768169576,1931504499,1701011824,544175136]},{"sector":7,"data":[1852404336,11892,0,1828716544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[8084045,3,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":12,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":13,"data":[279886,131221,190350734,32772,0,0,0,0,4194352,9175104,9765013,1175,589824,0,0,0,-2147024892,1,5046272,5242904,68,-2146959360,3,6619136,-265289580,32780,16318464,-265289531,32781,29229056,-265289405,32782,0,1313818119,1380533332,1431257861,16978,738197504,1414418246,542328146,741552945,925644345,540680242,1920298819,544367977,808528952,540160300,1952797480,691217184,0,0,0,786435,155058432,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718600,589920,2,-1879048192,524289,137363466,536872960,-536846081,0,603648,0,1866661888,1701409397,852082,206438656,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718602,655456,2,-1879048192,589825,154140684,536873216,-67084033,0,804352,0,1866661888,1701409397,917618,338559232,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352]},{"sector":14,"data":[1702061426,1684371058,46,0,4718604,786528,3,-1879048192,786433,204472335,536873984,1342202111,1,1320448,0,1866661888,1701409397,114,0,0,155058432,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718600,589920,2,-1879048192,524289,137363466,536872960,-536846081,0,603648,0,30208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65280,0,0,0,68157440,472004872,68157440,68166152,956310024,956826640,268435490,69339140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1048596]},{"sector":15,"data":[524288,0,0,0,0,0,0,0,0,0,0,1040187400,24,62,268312,402653184,1616904216,134742112,335564308,134742016,134742036,1308622868,1309935624,134217728,134222856,68157440,469776648,68157440,68157448,956301320,956826640,268435456,67110916,134217728,554174996,268699672,0,136052992,1040456732,471612940,262144,943594512,2138840702,1047993983,1669100318,478026855,2004827774,2004318071,473963647,524322,393312,140509196,1597444,0,0,0,805832192,471604273,471604252,471604252,471604252,471604252,471604252,471604252,471604252,134224924,1996495872,1092754952,4,135790657,525316,134217791,555810852,943196177,473446456,2139037247,1044283263,1736195646,471604252,1998396444,2004318071,134749280,337923604,134742016,134750740,1312498196,1309935624,134224930,136451080,134226528,1377700372,134744096,2102,941752832,537666082,572662288,524288,138486280,555884833,136454433,907026948,572596770,575226145,572662306,69210178,0,131104,2097168,532480,0,1048576,0,134744064,471604297,471604252,471604252,471604252,471604252,471604252,471604252,471604252,7196,572662280,1291854344,28,136577113,2056,134217850]},{"sector":16,"data":[572653604,134742050,134744072,555819289,134750497,572655624,572662306,572660770,572662306,8766,469762048,0,0,786432,0,72704,0,134217760,606093056,68157456,2076,136446976,538182146,572654624,1041235968,340591108,539050017,136462368,705700868,1092698418,570966049,336863778,68161540,1006632960,1044266558,942423868,1946691132,1065238124,1715224438,2000058231,134744190,471604294,471604252,471604252,471604252,471604252,471604252,471604252,471604252,134224924,1998327838,1358974984,4067620,1041760341,570426384,134217850,606356516,336857108,336860180,538984488,134750240,841025544,1094795585,574954561,337781282,1010573857,1010580540,1044266550,943210046,1815492664,1044266558,1715346494,2003199590,134248254,136057856,68157481,1040203391,136448000,1008995332,505153596,2099208,341115906,1008812094,138297404,705705988,1094598954,570965566,134752788,67637256,33554432,1094861089,137511440,705176580,1109475634,571490329,571744802,101199940,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,134224924,136461344,1358964736,1040327196,134217817,570431516,469764154,2121867800,336859241,336860180,1010581583,134757436,712574984,1094795585,575216705,136454690,33697313,33686018,1094795529,134758721,842991624,1094795585,574954561]},{"sector":17,"data":[572662306,134226465,302153216,68157510,2076,136450048,37618184,35784738,1041235968,1046349828,539050017,136464160,571483204,1092632870,570949924,135539220,67375120,1040187392,2135048225,136462864,705181700,1109475618,571489808,570960418,134744088,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,134224924,2132938784,1291850760,148480,134217813,570425344,10,286462208,1044258835,1044266558,538984568,134750240,639698952,1094795585,575740993,136454690,1044259134,1044266558,2139045951,134774655,574687240,1094795585,575216705,572662306,8737,624699392,68157508,2102,136454144,570696208,69341218,524288,574619656,555884833,136454432,571548228,572531234,570966306,136451080,67244065,1107296256,1078083873,136461840,705176580,1109475618,638714128,336860180,134744098,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,134224924,136056862,1090521608,8764,65,570425344,10,572858940,572662309,572662306,555819337,134750497,572655624,572662306,572660770,136454690,1111630112,1111638594,1077952840,134758464,574687240,1094795585,642849857,338044454,134222910,1107830784,134742075,524288,1042038792,470686782,404492316,264200,2000422928,2138840702,1047993976,2004841272,477633650,471613043,477565960]}],[{"sector":1,"data":[67178623,1023410176,1044332158,1047986748,1799250692,1044266615,453803644,137761800,805832318,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,134224924,472006152,1040204808,4352,1040187454,1006632960,524298,1146045440,2004294735,2004318071,2139037263,1044283263,1920745022,471604252,475798556,471604252,1027436144,1027423549,1044266550,1044266558,2000567870,1044266558,457055294,135994139,2080,0,268697600,1048576,0,0,0,4096,0,0,0,0,452984832,0,0,469769216,65280,0,15360,56,35651584,0,805306368,524288,0,0,0,0,0,0,0,0,0,0,30728,0,0,536870912,1572891,117506048,1,0,3072,0,0,0,0,0,0,0,6144,0,0,0,4194304,805306368,1866674272,1701409397,114,206438656,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718602,655456,2,-1879048192,589825,154140684,536873216,-67084033,0,804352]},{"sector":2,"data":[30208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16711680,0,0,0,0,34603008,539100930,134217952,1090650882,1142956032,8657920,-2000125568,17301504,538968577,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1048576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,7864320,0,16384,0,0,67633152,29362437,67108880,8389636,5259392,16918272,7356929,33816576,1073774594,34603008,2098946,268435520,16777730,6299648,137472,13140352,17301504,536870913,67108864]},{"sector":3,"data":[-2128576252,34631812,8,16777216,-2096692706,955785664,990846,0,471743488,-1012432097,-482673415,-403831905,941494150,-2028007810,-1893728337,-546211897,-536820543,524336,1610612760,1610627072,51118340,128,0,1,0,-1065304064,236730564,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,398590721,306061340,34576,8650752,16973836,-33521536,117702656,67699328,473434306,-2147285234,2134540000,-472932545,2096689377,63398268,1893777537,-126804680,490700540,67647616,549587205,134217888,1074005252,1217413248,16852502,-2005908991,33816632,1092649474,67126400,-500989692,68192328,65540,33554432,1141378593,1073766688,-2146426558,2097152,69288512,560088072,1095140360,1115947012,1141119235,1208488225,67734120,-1876942206,536871553,72,536870920,536888320,262144,128,0,1,0,562036737,236730404,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,14448,-501152767,4333576,8405030,7995648,-2113666030,-201260992,135004160,152241728,67633188,-2147483390,558248512,541362192,270549120,-2071453662,-2012208830,-1876942280,135406664,17536,0,64,0,0,8,0,312,0,67108992,301238020,135299216]},{"sector":4,"data":[8457474,67108864,1073742369,-2147442400,-2096094974,4227073,-1975516640,287459336,1099075616,-2105278460,-2105235198,1216880673,-2012708320,17896594,536871169,503316612,-1600060661,745947376,-536606948,951114118,-946008724,-583932985,-1623492649,562036929,236730392,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,656507907,10493980,545343273,4849920,66578,-200736384,134479872,270631492,169085000,1082196485,612520096,-2147219182,270549120,1217409057,67703332,-1876933320,269558856,507266296,-1048377585,507174113,-1014823153,1893777537,50804276,1893777537,422780472,-1201420660,67170032,4456960,134234144,67330,134217728,-2130705887,-1192222271,-2096030204,-125730815,-1974598640,285378575,2139156704,42270724,-2109454078,1200103457,-2012708352,34211986,562036737,16777218,1667681292,848097288,-2147221244,-959944573,671494963,-2012217055,269558418,545259649,236730368,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,536953356,5251232,1199720488,7471600,33693452,-200736448,134479896,961626690,169087028,1082196485,1015061664,-2147021026,270549120,1217407225,67703332,-1876932296,-1609554872,16930948,541097984,1640374800,541890608,270549120,-870835938,-1944505498,135358264,270615172,67126412,-532479488,134259264,-523297022,268498945]},{"sector":5,"data":[66081,-1006100446,-2146557688,256,-1856894968,285362184,1099927584,-2105147388,-2111567614,-2138103746,1342735040,67373140,541065217,520093696,587483144,579092728,327940,-2104997758,117711137,1343226113,50994346,411041798,236730368,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,-410974456,2621692,-2143008983,4913425,-2130246656,-200801920,118358040,1689330305,287449324,558007304,612429841,-2147219182,270549120,1217405985,67703332,-1876932296,1074799688,524174468,-507279601,2139160305,-523264193,270549120,1209012579,67703332,135350584,-1608498556,67119236,283119360,134223001,67330,536870912,131617,-2079789021,-2147475184,-125763584,-1622011888,285362184,1099071488,1115951108,-2112616190,-2004344800,1342734880,134485100,538968065,553648128,570705928,579616768,-2147090172,-2104997758,270625,1343226305,67771562,545259521,236730368,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,268567048,1310784,1073889318,4849936,1024,336068864,0,-2008006398,524173396,-507279601,545263857,264208,270549120,1217405473,67703332,-1876930248,1074799688,557990648,574916624,1082138642,528416,270549120,1209012545,67703332,135350584,-1608498556,10372,293864448,134219813,8457474,1076887744,67371553,-2079842016]},{"sector":6,"data":[50405664,4227073,541917216,555893896,1094877192,579080196,1141639442,1275597088,537428512,268706372,537919553,553648128,1667681292,578043928,1074004228,-964147070,134492979,540021025,134488644,545259585,236730368,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,16908,663616,549555984,8650752,0,336068864,251658240,284787396,541147838,304367760,557978121,541362192,270549120,-2071453406,-2012208830,-1876942280,1074799688,557990528,574916624,1673929234,1624021041,270549120,-870837917,-1944505498,152269624,1080083076,67113100,-494730240,67171864,65540,-2144337728,-1014034658,2029023424,51256864,2129921,1897926720,-1010334753,-482549511,923668383,952377335,1797000824,552649153,521041732,537395393,503316480,-1333722213,1996812512,-485617377,953970151,119475500,551084224,520386372,545259713,236730368,-1065286905,473460960,-2130508018,946921664,50794012,1893777537,118365240,-524254973,67123312,14714627,8659168,15,7864320,7936,351535360,0,1024590848,-236766204,1065286904,2134687263,-472932545,2096689377,59209852,1893777537,253713464,-505363577,507370688,-777828465,473488617,-2096953586,2096689377,59194140,1893777537,-2045952968,1085301187,4336,-2147483648,33554432,8,128,0,0,0,1]},{"sector":7,"data":[2031616,0,0,0,0,1536,0,0,-536821759,0,0,8650752,4352,0,288,0,524288,-1065304064,0,0,0,0,0,0,0,0,0,0,1,16261120,0,0,0,905969920,1024,0,0,0,524288,0,0,0,0,0,0,0,0,524288,0,0,0,0,16384,-2147483648,8320,0,0,0,0,0,0,0,0,0,0,0,0,0,8395008,0,0,0,65281,0,7864320,3584,0,8390520,0,3145728,8388608,0,0,0,0,0,0,0,0,0,0,1,8192,0,0,0,512,6144,0,0,0,3145728,0,0,0,0,0,0,0,0,3145728,0,0,0,0,0,16973824,1866711232,1701409397,114,338559232,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189]},{"sector":8,"data":[824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718604,786528,3,-1879048192,786433,204472335,536873984,1342202111,1,1320448,0,30208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,786432,-335474896,15761433,786432,-1744761296,254803980,16816129,805309676,434897167,128,-268434496,3178521,0,0,15728640]},{"sector":9,"data":[100663296,1572864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65295,0,32769,0,0,0,393216,2021857632,9994521,393216,-1744757920,425721862,50370689,1610614392,427328281,128,-1744763296,6324249,1572864,-1006566376,9961728,1572864,1560,102236184,16777216,402659524,12845318,16777216,1619001728,1572864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251658240,786432,28672,117489665,7340224,459616,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2145845248,8396544,0,2031616,-268431616,3,0,8396640,0,0,0,524544]},{"sector":10,"data":[0,0,0,0,0,786432,1812139568,9994545,786432,-1744761040,254803980,-2093377535,805309548,426509071,128,-268434496,1882226713,38913,-864020128,260441862,-2147393536,1728,0,983808,-125755552,66880259,-2128610109,248,402685953,-2095056895,-92241952,1073514367,-478546719,-1629024260,1929842303,-1052772127,-192839688,-258021505,-277241857,-119505137,435159488,393344,12288,201375744,3145728,197472,6,0,0,12,0,939524096,482345222,-2146437056,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-134216864,986880,-2129036288,12583160,520093696,-2144272256,411113728,520093702,16777440,12595424,2013266736,54419456,-536658208,1066926398,-947914000,-54034436,1073529663,-2021655357,-125755586,536379679,-1491076992,-1628997218,940568441,454657,939662176,15761457,393216,-1736369824,425721862,34510977,1610614328,423133721,63616,-1744763296,811630617,38913,-864020128,416058399,221184,12596832,0,-2129066496,214118624,234914567,-1020261373,12,201326595,-1070593021,-2034159376,402965296,-1070592989,209912160,806225688,1662520515,214118412,1611408198,-969931162,-1061142522,3145824,0,12288,201375744]},{"sector":11,"data":[3145728,196608,6,0,0,12,0,1610612736,912261126,-2146436928,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-1946090656,101107248,33606656,12590852,536870912,-2144272320,1887437056,1040187392,192,12595296,201328496,1007616,-268431376,267386895,1127253521,71512068,106954758,-1020239872,214118412,806142768,-1020200768,214118412,403097136,6147,0,0,0,0,0,3342336,0,0,1610676224,0,805306368,0,-24962720,416861232,417792,1623211824,0,-1070593024,213909600,402686733,-1020261376,12,100663302,1616907264,46346480,402940720,-1070595034,411238752,949880600,1712850630,79900678,806101830,-2095511866,-1065336564,3145776,50331648,-92260360,1073266974,-2127040831,1006845920,2009861638,-2122844031,-188646418,2031929151,-952524817,1623211934,593494022,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-2136928416,101682975,67158017,12595442,1593835520,-2144272352,402657120,1040974592,192,12595296,2013266736,983040,-268431376,267386895,1127219715,71512068,106954758,1664114688,107372684,1611032160,-480118688,214118412]},{"sector":12,"data":[520930096,-2093016893,-125616136,2113438527,-2128610592,-125755400,517996830,-2029920255,-125755528,536379679,-954206080,482832668,933152625,40583,-1736369824,212862768,417792,1610616624,0,-1070589952,209715552,821592857,-1020258304,1610614284,66847500,-513599488,12791960,403727152,-1070595962,813891936,1022756376,1712850630,-2134822906,806093574,17786566,-1073740904,3145752,100663296,-2031929332,202295153,-1070064633,402850656,947259142,-415756601,207821852,806093580,-2095511866,1619009804,6291462,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-1067435936,110674224,83910659,12591002,1493172224,2031776,402724960,1040974592,192,8396640,205308720,-2129043360,-1736369768,462979353,53542979,268644624,106954758,1664114688,107372748,1611032160,1667496032,214118412,412664112,-966780829,214327308,-972241312,-412056013,250048526,106954758,-1021353984,250048652,1880024944,-479069984,214118412,940360496,3299,-1744764832,375423039,393280,1619007792,0,-1070583808,2013266784,1057784625,-2128668544,1610614524,16777240,1634087040,8601496,535847728,-1069612922,1619198304,912655896,-971045178,-260030714,420217606,419462,-1073740048,3145740,0,40054796,201770592,-1070593018,805503840,811992582,1714423494]},{"sector":13,"data":[-2080172020,806093580,51340998,1610613516,6291462,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-131911584,117428016,83898371,-1744764798,1493221439,50331808,-260038660,504103680,16801984,805503224,208061233,-2129018656,-1736369768,462979353,54460611,-268222480,106954758,1669095424,107372652,1611032160,1667692640,214118412,418431024,-1073729437,213909516,101498880,1717568051,107372550,106954758,-479174656,107372556,1611032160,1667496032,214118412,806142768,3171,-1744764832,870236191,393280,-24700624,16515840,-1070571520,201328224,806125665,-1070583616,12,50331660,1667653632,6500604,403727152,-1070588282,-259849888,856032792,102237894,402666246,420217606,1046150,-1073738656,3145734,50331648,6500604,218023776,-1070593018,-536673440,811992582,1714423494,-268429300,806093580,50751174,-1073674740,3670022,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-1073729440,6340656,83924993,818102146,1610400512,32,96,101450496,24768,-1732165888,2030486322,-1019248543,-54312964,1073529663,53542979,268644624,106954758,1664114688,107372604,1611032160,1668085856,214118412,526434352,-1019275069,-54312964,2147271487]},{"sector":14,"data":[-411107085,-18382850,106954758,1667260416,107372556,1611032160,1667692640,214118412,806142768,3171,-66650112,817086720,393408,1610612784,0,-1070546944,201329760,806150271,-1070583616,24,117179142,1667629056,6500364,402940720,-1070593018,411263328,822486552,102237894,209858822,252445446,-2145805309,-1071638432,3145731,100663296,6500364,201377376,-1070593018,805503840,811992582,1714423494,469899276,420217612,17823366,1610615960,6291462,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-1073729536,6324255,83938304,1611006106,1526775808,32,96,101450496,192,-872415232,37535748,-1020264349,214118412,856474416,1127219203,71512068,106954758,1664114688,107372572,1611032160,1668872288,214118412,408993840,-966783997,214327308,-972241312,106954755,417792,106954758,1667260416,107372556,1611032160,1668085856,214118412,815317296,39009,805503072,808698672,393344,1610612784,100663303,-2145812479,214112352,806126337,-1070571328,1879049840,201326595,1717985280,-2040451066,402965296,-1070593021,209936736,805709336,51907779,214118412,101450502,-1070593021,-1071632288,3178497,100663296,-2031929332,202295153,-1070588921,402850656,811992582,-415756601,201529372,253510412,-2145805309,1614813424]},{"sector":15,"data":[6291462,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-2141112224,107003952,67136512,805503218,1493221376,160,0,109839104,192,-1744764928,56680455,1717570787,107372550,1661363808,1127253521,71512068,106954758,-1020239872,214118412,806142768,-1020200768,214118412,408993840,-966783997,214327308,-972241312,-412056013,250048526,106954758,-479174656,250048524,1880024944,-478611232,482554140,955301937,61664,805503072,522094111,393312,1610612784,100663302,51314691,-121552900,536396039,-2095095680,1610614464,402685953,-278700032,-54493425,1056737151,-478546943,-2029568004,2081419135,20904129,-126715656,116949279,-512161791,-1059029000,3194880,50331648,-58689546,1073275166,-478548799,503776252,2037894975,-2127038239,-125665300,116293895,-1070004223,1623211872,6291462,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-54325408,116391936,33568768,-1744764924,536870912,50331712,252,108397312,262336,805502976,8306688,-984991,268431375,-149946384,-947913488,-54034436,1073529663,-2021655357,-125755444,536379679,-2124416896,-125755400,1022918943,1665087495,-161267722,2079744831,-2128610080,-125755400,1073529663,-2027946813]},{"sector":16,"data":[-125755490,536379679,-2126514048,-287236370,929095710,24704,0,6,196608,96,12,6,0,0,0,-1073741824,0,6291456,0,0,0,0,0,0,96,0,0,-1073741824,3170304,0,0,0,3072,768,0,3145728,12,0,0,1610612928,6291462,0,0,0,0,0,0,0,0,0,0,0,0,0,768,100663296,16789507,248,520093696,128,0,100664064,393408,0,0,0,0,0,12288,0,0,0,0,0,0,0,0,0,0,0,12288,0,0,0,0,0,6291456,0,817889280,49152,0,0,-2147418112,192,0,12,0,0,0,0,0,3145728,0,0,0,0,0,16777216,156,0,0,-134217728,15741184,65295,0,0,6144,768,0,3145728,12,0,16777216,1610612864,6291462]},{"sector":17,"data":[0,0,0,0,0,0,0,0,0,0,768,100663296,57347,0,0,0,0,234881792,196832,0,0,0,0,0,6144,0,0,0,0,0,0,0,0,0,0,0,6144,0,0,0,0,0,0,0,813695232,32769,0,0,0,0,0,0,0,0,0,0,0,-2145452032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61441,15872,0,8126464,62,0,117440512,939524288,12583174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,917504,0,0,0,0,0,28672,0,0,0,0,0,0,0,0,0,0,0,28672]}],[{"sector":1,"data":[2025850624,1866711047,1701409397,114,-1194816518,567099904,-428713383,-489570253,-85798703,-1014249333,-1962742397,1297948645,1157629130,518818645,105286486,1937031179,-401698736,-922011557,1586195829,29619718,-1909563019,637534726,-1014095989,4096294,1967476224,512435790,958791716,1946166814,106335042,637715331,930350905,637826957,-2097000565,958793923,125044823,-502479997,652536821,162947,1392908660,642975314,-1873797889,939124750,132319067,72319014,855960324,1589654482,-1962742397,1297948645,1157628618,518818645,105286486,2054471691,-560076720,393592843,35556910,106859264,1963049974,38270562,-1906543552,1208609567,-1070344050,73358,16001,1064650062,2367115,2498105,1451963764,46367494,729024313,-2097000565,1463355587,-2096663544,-152957757,2139351787,326369290,2131382271,71825177,259387392,-2146941047,-326553,244319862,-1992913176,1183516230,-310157818,535137026,46812509,-1957346048,1996431084,-586422264,1586217102,1200301574,651309826,2367115,-787510490,-489500192,49120250,1562371467,313933,-326412987,-11053538,-622327690,1958743004,-1012950,244320886,188136680,1444705746,-1878624513,-32184306,-11077493,1465321078,1358793704,-401698729,1599610322,49120094,1562371467,445005,1458342741,105287255,607554342,909714944,1400111142,-2093184218,-2094660922,1198784572,38570790,71616294,-1943655432,-964491700]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[7887437,3,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":10,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":11,"data":[279886,131221,190350844,32772,0,0,0,0,4194349,9175104,9765013,1175,589824,0,0,0,-2147024892,1,5046272,5242903,68,-2146959360,3,6553600,-265289598,32776,15073280,-265289551,32777,26673152,-265289480,32778,0,1313818119,1380533332,1279608837,16982,687865856,1414418246,542328146,741552945,925644345,540680242,1986815304,824981536,842083376,1699948576,857940084,41,0,0,0,524291,135856384,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718600,589920,2,-1879048192,1,119603210,536873728,-1778360065,0,529408,0,1699217408,151025260,218169344,671088651,1126181219,1920561263,1952999273,1953055264,1701999731,1226861921,539911022,892877105,1816207406,1769087084,1937008743,1936028192,1702261349,11876,0,1207962112,167796736,512,0,400,553651200,851976,6356768,188,185073664,0,1207959552,7760997,16777226,3963,539583272,2037411651,1751607666,1765941364,1920234356,544039269,778268233,943272224,1092628021,1914727532,1952999273,1701978227,1987208563]},{"sector":12,"data":[3040357,0,786432,6291528,196620,0,102400,983040,268438049,1627332608,57856,1979711488,15,0,1986815304,0,135856384,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718600,589920,2,-1879048192,1,119603210,536873728,-1778360065,0,529408,0,145408,33554432,134218752,335547904,587209728,671098112,822094592,956315392,1040202752,1224753920,1426083584,1627413248,1828742912,2030072576,-2130673920,-1979677952,-1761570816,-1476354816,-1258246656,-989807360,-771699712,-503260672,-385817600,-184488192,117505792,369168129,620830209,838937601,1073822209,1359038977,1560368897,1711366401,1879140865,2046915841,-2046722047,-1845392383,-1694394367,-1493065471,-1425954559,-1291734783,-1023296255,-821966591,-654191359,-519971327,-318642431,-100535039,84017153,218237698,419566338,520231938,620896770,721561602,822226434,922891266,1023556098,1124220930,1224885762,1325550594,1426215426,1526880258,1627545090,1728209922,1828874754,1929539586,2030204418,2114092034,-2046656510,-1845326846,-1711106046,-1543332094,-1342002174,-1174227710,-989676286,-821900798,-654125822,-503128830,-318576638,-217911550,-83691774,134414338,402853891,604184067,805513731,1006843395]},{"sector":13,"data":[1275281923,1526944771,1761829379,1912827907,2047047171,-2046591485,-1778151933,-1509712381,-1241272829,-1056720637,-788281085,-519841533,-301734141,-100404221,100925443,302255108,537139204,738469380,939799044,1074019844,1208239108,1376013316,1577342980,1778672644,1980002308,2130999556,-1962638076,-1761308412,-1576756220,570730244,0,0,0,0,0,0,0,0,0,0,0,1024,0,0,0,0,0,0,0,0,0,0,49159,536870912,0,-1556839296,16842880,-1803283962,272656384,5269536,168034824,4,262144,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,167772160,2,0,0,0,0,0,0,0,0,100663296,0,8400899,538984452,172032000,4195416,623104,-1342160823,-1336926176,67371008,524298,-804257278,-2147483638,1180292,220274701,1111490560,8192,333654037,8408329,-1049556953,484930366,1879048192,-202305028,-1865418765,42115664,-101155710,1372645361,-81637052,119201,541065280,2140192,0,0,-1241093376,-608801317,1843115629,-1318200394,1313989632,49553,-1994388256]},{"sector":14,"data":[-1609811968,274817377,1125123137,-270011520,-2008498209,-117963527,-1611007752,-1600085856,79790242,8675881,688537856,278286885,-2144758206,1142195488,689242130,663397460,-1205338104,-2011159670,41512,285378816,67766794,-1538240496,-2101213565,285869445,1363431696,1075841570,4194304,136331328,32,256,-2013265920,1843082891,-1234314314,-608801317,319402093,587354257,303038720,1879052321,572694532,71368722,-2080292592,537921556,-2054846392,84215045,-1600085755,-106782560,32,0,16777216,0,32769,1024,1145273616,8925058,621316168,-1572306884,174120864,34220345,269485066,-1971148720,92635810,1360003339,303319620,234897424,1741611896,1940891836,-1115996985,1380616866,914393208,-608801317,1843115629,-1318200394,1279951928,33608964,150605032,-1610338286,270804004,-1574401374,134513794,-2008539120,84231557,-1576729339,-1600085856,-1910274668,915333944,965665592,949887522,-1640395037,-1750980470,672137362,654476256,-2008547266,-266155760,204423,692654616,-418708750,-1328488559,-2104339838,-504297991,-2077603312,1074799112,340066560,-1448982447,-1574401496,-1977474678,134959690,1843082848,-1234314314,-608801317,-1002065555,319099460,13163051,303214627,774457860,-1969086439,-461069784,1050660615,635799880,84215045,-1600084987,-2054643552,268714336,340068673,589448529,1360283089,680175173,5412002,1683061776]},{"sector":15,"data":[814230946,790661256,-2113369726,570826508,34241865,1343226890,578988112,629244554,1242575112,1107855914,251674632,1214186565,-1977045342,428515880,-1834382814,914393136,-608801317,1843115629,-1318200394,312443712,1112592388,2097320,83890194,1098060051,-142745609,134513871,-2008539120,84219269,-1476066043,-1600085856,-820774520,1070592828,2111829825,1162945570,-1438297836,-1801312118,687865938,549622866,-2004353016,-1994251966,238088,1161167384,67766794,-1537978352,-2105146750,285873537,286344208,1074299400,340070656,-1448982704,-1574401496,1361184138,-2009052142,1843082880,-1234314314,-608801317,71676269,654462020,1048872,269615104,572910080,1360282917,-2075126715,537921556,226854984,84215045,-1600081915,-2121752416,340087060,71649361,606224656,1360282961,680178245,5006498,1675896848,-2063589342,-1040644089,470249756,559988896,-202291968,-804260621,49947219,-109020030,-2079334135,-100134639,251674628,1087300472,-1968658270,1014643751,1209147806,914393208,-608801317,1843115629,-1318200394,1107619897,49153,16253152,4198429,960971847,340087060,-270011568,-2008498209,-117963527,-1074136840,522133279,-815562488,919597884,965665592,949035810,-1137078557,1201596281,136,1073807424,257,0,4194304,16515072,0,0,0,1024,0,-1065024768,248,536874752,536870912,8,1795174400]},{"sector":16,"data":[0,0,0,2097152,23552,0,1048576,117506240,1,16777216,128,0,0,0,0,0,3145728,0,0,0,3179521,1986815304,0,0,185401600,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718602,655456,2,-1879048192,1,136380428,536874240,-1140825857,0,722944,0,145408,50331648,184550912,452989696,805316352,922759936,1140865792,1342196992,1459639296,1660967680,1929407232,-2097120512,-1828680960,-1560241408,-1375687936,-1191137024,-939474944,-620704000,-318708736,-16714240,268503040,604051969,771827457,1023489537,1375815681,1677810689,1996582401,-2046722303,-1744728319,-1392401151,-1107184127,-972963327,-788411903,-553527295,-285087999,-33425919,151127553,402788610,503454466,671229186,973222658,1241661954,1442992642,1610767618,1845651202,2097313538,-1979546622,-1878881022,-1677552894,-1543331838,-1409112062,-1274892286,-1140672510,-1006452734,-872232958,-738013182,-603793406,-469573630,-335353854,-201134078,-66914302,67305474,201525251,335745027,469964803,587407363,771958275,1040397827,1224951299,1459834883,1694719747,1912826627,2114156035,-1962703613,-1778150909,-1593599485]},{"sector":17,"data":[-1358714877,-1190940157,-1023165181,-771503869,-469509373,-201069821,100924675,402919172,755245316,1057240580,1359235076,1560566276,1661231108,1862559236,-2096858876,-1761309436,-1425759996,-1190875388,-888880636,-586886140,-284891644,-33229308,235210244,503649797,822420997,1074083845,1342523397,1527076869,1627741701,1812292613,2063954693,-1962573051,-1694133499,-1492803835,-1257918971,-1023034363,-771372539,570808581,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,248,0,0,1073742336,138732608,1073741824,554764296,137494612,1902133248,134217737,537002241,32,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,536870912,0,0,0,0,0,0,0,0,0,0,0,0,0,33554432,0,0,-2147483392,335558817,536870912,301995024,72089760,-1903132672,67108864,8389122,1073741888,13131808,268435600,-2063591416]}],[{"sector":1,"data":[21103360,4195843,-2145370112,1,104940041,-2143012856,654311424,-2138634367,-946878641,32903,20920320,-252583929,270434302,34146596,-2021179390,2046353889,-2105408259,-117109748,268469475,134250496,1226866688,2,33554432,0,646318592,1717986918,1717986918,1717986918,1717986918,183566344,2017729545,-268435360,-2078703615,285228032,202449536,-2147450559,135274496,-51253233,-2143322114,260173833,1022410755,540871695,337922192,544210949,-1875865280,134217824,1243882512,42026195,-1937471228,1145118720,1118274,-1992080887,1078477840,671088640,1078462535,1212156104,16456,-2126494720,134811908,270614656,51448100,1149788166,-2080108270,-2105408479,151523850,35360,134250496,18874369,2,33554432,0,642322944,1717986918,1717986918,1717986918,1717986918,-234352384,-2080366071,134283408,1076249090,838890496,305226304,-2147483328,135274560,590092,304103552,281086025,1107829124,541232144,304367760,8912905,0,0,0,32768,201326592,4,4096,1239764745,1179141152,1207992512,1094715457,-2013263800,215368,1116619872,67441284,-1874837376,35719460,613437578,-2080110316,1162085409,286269713,37136,-394741640,1227660787,260790546,-409727465,170101316,-968322521,1717986918,1717986918,1717986918,1717986918,-1862209272,838932497,-469630864,-2146942462,302019618]},{"sector":2,"data":[68297792,1082196609,338186400,328212,304103552,547423305,-2130439608,545606688,287590544,-259459055,-252645136,1008660208,1228684348,-2021178079,-1937275001,605194616,1152840,109380616,1124612160,1207992448,-2105343935,-2021618865,1041023112,1116866584,67232391,524320508,37816804,613435474,1610877204,1162085409,564183056,32784,428196996,1228022537,-1874041310,312054168,-1843230140,104895008,1717986918,1717986918,1717986918,1717986918,-1820317687,1107371257,-1803399279,1083346689,310408226,-766368694,1082196625,338186400,-134094313,306151164,546423883,-2130439608,545868832,270813328,162596001,151587081,1109463305,1229079106,1212737059,1279805512,605194636,9541704,-2138897400,1325953176,-1997475609,1140851009,138497096,3162183,1150423046,67179076,-1874640768,44108068,663766050,418908644,673711137,1094762656,32776,159483004,1226973689,-1874312126,-1030713200,1632915780,102769217,1717986918,1717986918,1717986918,1717986918,-253746935,1107366464,-457277326,-2143485440,285226018,768944261,557974578,574916624,66084,304103552,545850441,-2130439608,546393120,270813328,-125303743,-117901064,2116091896,1233026686,1212687396,1279805512,605194644,9048133,1103175432,1124633124,-2013233024,1325400641,138496224,1040990272,1200754712,67441348,-1874837376,34703652,613433858,-2080102140,673711137,-2126503775,32776,159483012,1226973441]},{"sector":3,"data":[-1874312030,579899536,1632915780,104862274,1717986918,1717986918,1717986918,1717986918,193019913,838929656,-1811775486,512,5154,1094977797,-507295916,1048377584,328252,304103552,545588297,-2130439608,547441696,270813328,160036929,151587081,1075843081,1228947520,1212687396,1279805512,605194660,9048133,1107626240,1174963236,134316224,1074267201,138561608,213064,-2004025248,134811940,-1876868992,34179364,1149780226,-2080108286,269485089,21041218,32772,428196996,1226973961,-1874312174,311529880,-1870127028,104862340,1717986918,1717986918,1717986918,1717986918,18697,-2080366015,134299889,0,50336802,-2100816950,304367860,1099039753,590148,304103552,277022793,1107829124,541232144,270813328,159973441,151587081,1109463305,1229079106,1212687396,1279805512,1681037764,8657090,-2080175864,1074297368,117768704,-2134438015,125994823,35207,138416128,-252583897,-1877065474,-100306652,-2071511038,2013456641,269547552,-113178556,32772,-394741638,1226972657,-1891089398,-510652905,143204404,104895111,1717986918,1717986918,1717986918,1717986918,16314632,2013273153,-268435456,8392448,5181,-498528256,304384019,1099039753,-51253177,-1841332226,260173897,1022410755,532417551,-524056817,-189792191,-185273100,1008660212,1228684348,-2025339869,-1937275001,-1546557320,268098,65536,1074266112,512]},{"sector":4,"data":[0,256,4128768,0,0,0,0,0,0,16777216,32768,0,134217984,0,8388624,16777216,4198912,0,0,0,0,32768,1,0,0,262176,0,0,0,2097152,0,0,0,0,0,0,0,262144,0,0,0,128,528388,0,-2147221504,1024,0,0,512,0,0,0,0,0,0,0,16777216,8356035,0,268443136,0,8388624,100663296,8391168,0,0,0,0,0,1,0,0,786464,0,0,0,6291456,0,0,0,0,0,0,0,786432,0,0,0,0,3149848,1986815304,0,259719424,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718604,786528,3,-1879048192,1,169934863,536875008,-503291649,0,1013248,0,145408,67108864,251660288,553654272,973090560,1124089344,1375750144,1610636288]},{"sector":5,"data":[1761633536,2013294336,-1979678464,-1677683968,-1375689472,-1073694976,-855586560,-637480704,-335486208,33616896,385944577,771826433,1090598913,1510034945,1711365633,2030137345,-1828616447,-1442734079,-1040075007,-738079743,-385753343,16905985,352455426,537008642,755115266,1023554818,1342326274,1644320770,1862429442,-2113767166,-1979546110,-1778216446,-1392335870,-1073564158,-821900798,-637348350,-352132350,-16582910,251856642,419632387,688070403,855846403,1023621123,1191395843,1359170563,1526945283,1694720003,1862494723,2030269443,-2096923133,-1929148413,-1761373693,-1593598973,-1425824253,-1258049533,-1090274813,-922500093,-771502589,-553396733,-251402237,-33293821,235144707,537139460,805578756,1074017540,1292126212,1510233348,1728339716,1996779268,-2096858364,-1895528444,-1559980284,-1157320956,-855325948,-519776508,-184227068,235208452,604314117,939863557,1174749701,1308969477,1560629765,1980066053,-1878686971,-1442472699,-1140478203,-771373307,-402268923,-66719227,235275525,537270022,839264518,1225145094,1510363398,1812357894,2030466310,-2130281210,-1912175354,-1610180858,-1308186362,-1006191866,-771307258,-469312762,-167318266,134675974,570888199]},{"sector":6,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1009778691,-262093282,100663296,863526912,4250160,100665078,1612636160,16777414,-2130508160,1676,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16711680,786432,0,0,-2147418112,-2043189664,39009,-1073741056,-1508297780,62652736,-1342108672,13025331,213909504,210551046,-2147418112,4120,7,8454424,0,67526656,0,-2134900724,6144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2147368960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8126464,-134217728,0,24]},{"sector":7,"data":[0,0,-268435456,0,0,0,0,0,0,0,0,942718976,-2138230469,51118080,456558083,820772936,-871494132,17170528,806929281,1812358656,404490258,7870524,201326592,253693052,-235853952,4095228,50331648,117701824,-1055973384,-1048084482,-2045142911,-1072943008,-2088767295,-821035040,-511635978,1876984199,-521021197,-2147368960,109052160,-1743179776,24,0,32769,0,963719219,-409177138,-1670132167,1942895079,-835065956,954702963,8126488,-1712220063,7299,805307907,3185671,939917438,214327296,-2147368080,17176672,-132161408,-102293698,-1717993474,117670815,-268353856,477921295,-1056160225,-1073335400,1625293784,829320288,135,-972683770,-1312082893,454564024,6786075,1661141763,1719689496,1043753990,409350198,204,1019612160,1723897905,-972285949,99,-2023553536,1611433479,1619014092,-1736363752,945851417,214360092,-1055339424,226910616,-1014570623,406044720,12339,16809985,805309568,1579008,0,-2147418112,0,409141248,1942895001,-835065956,971480179,-409177138,-1670132167,67123431,-1721670714,906074521,33685504,-436189184,15990784,-520066034,-2137450354,1022410755,-255851761,-1732181962,1619001606,1670945049,-1053812605,1630538886,-966779773,865648908,110649606,48]},{"sector":8,"data":[49152,0,7,16777216,1812332672,1614179327,869013606,201326595,-1741615930,255680,862176792,1884161,-2046346397,426557452,422600832,-1743153023,-264487840,-664795444,1637400844,868420742,-2145818932,3151971,-1192165120,-1634788034,-1743177925,-507069991,-1709328143,2027477107,-58292281,965613667,-409177138,-1670132167,1942895079,-835065956,954702963,1052833816,46143539,34360,1208021252,-872379199,1812332788,805724928,-1073544397,51330288,20377792,17225856,-1726390144,818099096,114065433,-1677642912,-1056151871,856044440,-265173473,524188920,534677263,-1014558945,1630745571,524188856,533169935,862375064,-1011348197,1747189766,19185692,204422,214308864,-406781949,-971476765,471907,1707474951,-1072904564,1619007756,-1736376016,912306201,114088044,-1056122784,210108824,1020015555,214106127,50331696,862178329,963103896,-828794471,-870763673,-1730569165,-842630952,409144454,1942894848,-835065956,971480179,-409177138,-1670132167,-1944504089,-1736493472,-1101004064,-654049229,650326016,-1057698816,1721265414,60710918,1721262342,-1738439143,411042150,1619001606,865638681,-2145832861,861931212,1724029953,865648908,1712856582,-963896861,-862441117,-1733217949,859006668,-959696592,-862441117,-862441113,219886438,443340,-2147403668,2139488632,402653315,117836998,-1741462397,6782000,-1044308196,-947073658,420266232,-114262020]},{"sector":9,"data":[-266757889,-859032736,-1736505652,-1055916276,912657542,17176684,3148931,-2045181952,-862428832,-1684459069,862358553,-1738439143,-640902975,416053478,956307555,-409177138,-1670132167,1942895079,-835065956,954702963,922521625,45095180,2120660576,50393596,-872358665,1812381940,-121213236,1627833214,-2045155688,-244869023,-238608512,-1726382084,808661950,114065433,-1677642912,-1056151868,201733016,405825048,16975372,811843712,1724684337,-248433869,828622476,862440600,862375064,1720097049,239599622,-2117322749,-534831482,214309112,1623588876,-969926605,7340091,-846827264,-1072929128,1619007756,-1736369872,828430361,114083468,-1056171936,210133376,1014505062,201523974,16777264,1633715961,834915487,-1944478055,-2045168794,-1737385887,820825548,415445196,1942894848,-835065956,971480179,-409177138,-1670132167,-1877395225,-2122367392,-1640496488,-654047540,12582912,7654400,510015494,-971076415,-1022610676,204721200,411042246,1619001606,865638681,-2145832933,861931212,1724423169,865648908,1712851974,2130507825,-946921665,-1623248641,871622607,-963897037,-862441117,-862440089,-1726401690,16803462,1812335614,864453069,805306371,404229318,406058703,247392,-1061085412,-434123514,426557452,422600832,-1944479103,-1022611360,408946380,1637400940,507251846,101082744,3147267,-2045181184,211312992,-1684459069,862358553,-1738439143,-1882744807,1618507836,956304483]},{"sector":10,"data":[-409177138,-1670132167,1942895079,-835065956,954702963,1667276825,30933004,107347969,514,-872415040,20,415446732,-217068490,-817889284,33488115,17225856,-1726390144,806302616,114065433,-1677642912,-1056151856,201733016,422823455,828622476,811650200,101455920,422785795,828622476,963103896,862375064,1015476504,1809317894,29846540,100860038,214315011,1723865136,-966780877,471907,1988493575,1611413040,1619014092,-1686030056,811632153,214352140,-1053291424,411263384,-1020261316,100862982,50331696,862178361,828886168,-1936090727,-870763674,-1713792973,-870840637,409190448,1942894848,-835065956,971480179,-409177138,-1670132167,-1407633177,403439808,1048772976,100859955,0,1362944,1738046720,-865652538,-2130239784,119437536,-1732181882,1619001606,1670945049,-1053812729,1630538886,-1017111421,1628201752,102239372,-828622541,-862375065,-1733217949,859006668,-963897037,-862441117,-862375577,1631089638,399564,941112976,8814973,805504515,-1891693444,-253664384,859733088,18661377,925892739,-1055973384,-653827842,-2081318527,-1072910209,56684737,-1043349256,202961025,260473137,3147507,-1193737984,-1936777922,-1734790853,828804313,-1742882575,113495664,-63928807,956307555,-409177138,-1670132167,1942895079,-835065956,954702963,16709912,3151884,124,50395136,-167771920,20,2093793280,513329088,2027979015,-125368546]},{"sector":11,"data":[-102293698,-1717993474,117670815,-268353856,477921295,1055916383,217628679,-656341480,490436332,532596622,-1014558945,-248433693,524188812,1070040847,-1318861042,414736856,134217728,0,33554636,0,0,0,256,-2046623744,0,0,0,0,0,786432,0,0,196608,48,0,196608,32769,-2147418112,32769,0,409141344,0,0,0,0,0,1073741824,419430400,152,0,0,50380800,0,0,0,0,1572864,0,0,0,0,0,0,0,0,0,3072,0,0,0,0,-1056964608,12416,0,13369344,1024,0,0,33554432,0,64512,0,0,0,0,0,0,0,0,120586243,248,0,-2147417917,0,-2147385343,0,6291456,6243,0,0,0,0,0,0,15734784,0,0,-1073741824,8388864,0,0,0,0,12,0,0,0,0,0,0,0,0,100663296]},{"sector":12,"data":[813744384,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,-1073545216,240,0,8257536,3,-2147418112,32769,0,808648896,0,0,0,0,0,0,402653184,0,0,0,117440512,0,0,0,0,3670016,0,0,0,0,0,0,0,0,0,7168,0,0,0,0,-2130640896,1699242112,30316,0,83938304,1611006106,1526775808,32,96,101450496,192,-872415232,37535748,-1020264349,214118412,856474416,1127219203,71512068,106954758,1664114688,107372572,1611032160,1668872288,214118412,408993840,-966783997,214327308,-972241312,106954755,417792,106954758,1667260416,107372556,1611032160,1668085856,214118412,815317296,39009,805503072,808698672,393344,1610612784,100663303,-2145812479,214112352,806126337,-1070571328,1879049840,201326595,1717985280,-2040451066,402965296,-1070593021,209936736,805709336,51907779,214118412,101450502,-1070593021,-1071632288,3178497,100663296,-2031929332,202295153,-1070588921,402850656,811992582,-415756601,201529372,253510412,-2145805309,1614813424]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[8084045,3,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":17,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]}]],[[{"sector":1,"data":[279886,131221,190350958,32772,0,0,0,0,4194352,9175104,9765013,1175,589824,0,0,0,-2147024892,1,5046272,5242904,68,-2146959360,3,6619136,-265289593,32813,15466496,-265289546,32814,27394048,-265289472,32815,0,1313818119,1380533332,1397576709,16978,738197504,1414418246,542328146,741552945,925644345,540680242,544435540,544107858,808528952,540160300,1952797480,691217184,0,0,0,2949123,141295872,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718600,589920,2,-1879048192,1,135331850,536873728,-1644142337,0,549888,0,1834221568,1834098803,3014766,190316800,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718602,655456,2,-1879048192,1,168886284,536874496,-1040162561,0,741376,0,1834221568,1834098803,3080302,267780352,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352]},{"sector":2,"data":[1702061426,1684371058,46,0,4718604,786528,3,-1879048192,1,185663503,536875008,-369065985,0,1043968,0,1834221568,1834098803,110,0,0,141295872,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718600,589920,2,-1879048192,1,135331850,536873728,-1644142337,0,549888,0,145408,33554432,167773440,385880576,704651520,822095104,973092096,1140867328,1224754944,1358973952,1526748672,1694523392,1862298112,2030072832,-2130674176,-1962900480,-1728015872,-1493131776,-1258246656,-973030144,-721367552,-436151040,-268375296,-16713728,268503040,503388161,771827201,989934593,1258374145,1543590913,1778475777,1879141633,2046915329,-2080276735,-1895724799,-1711172607,-1576952063,-1375623167,-1274957567,-1123960319,-872299007,-670969343,-503194111,-368974079,-184422399,16907265,184681986,352456706,570563074,704783874,839003650,973223426,1107443202,1241662978,1375882754,1510102530,1644322306,1778542082,1912761858,2046981634,-2113765886,-1979546110,-1845326334,-1711106558,-1576886782,-1476221438,-1342002430,-1157450494,-956120574,-788345854,-570238462,-368909566,-167580414,-16581886,167970306,318967299,503519491,637739267,771959299,1023619843]},{"sector":3,"data":[1359169283,1560499715,1795384323,2030268931,-1962704893,-1694264573,-1425825021,-1207717117,-1039942397,-805058813,-536619005,-268179453,260099,218366980,520361476,822355972,1040463876,1225016324,1392791044,1560565764,1778672132,1946447620,2114222340,-2046524668,-1945859836,-1794863356,-1593533692,-1392204028,-1190874364,-1006322428,-804992508,-603662844,-419110652,-1039864828,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-536674304,0,0,-2147483648,143296067,131072,294126721,271712276,607262728,276824064,270864,16777216,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8388608,0,0,0,0,0,0,0,0,0,0,0,0,64,0,1233403904,5120,-2147352319,8397316,605030476,76,2629696,268697608,8389261,-1609557951,1661486083,67371040,288,-1039629038,-2145119972,-1945037312,820418839,402653184,-203349520,-201721375,1903413177,-130234493,-823660303,1853258988,12754159,-2147393472,808239424]},{"sector":4,"data":[0,203555328,-1717986919,-1717986919,-1717986919,-1717986919,1566851224,269411784,148897792,478162947,639111171,1074823689,134480513,-808466625,1909379023,1019738140,1010580540,-591795357,-1065912338,1364599234,622985216,-2103092695,818517008,575735810,-2062376848,304227357,419430419,557077042,18473,1359488256,-2012212974,-2112876150,1657151522,-1995946686,1229210661,-1807203294,536870981,1082163200,4100,-2147483648,67108864,-1726409951,-1717986919,-1717986919,-1717986919,77109657,9013395,16779281,-2013260784,671168512,1141916168,-2059230976,1209275402,1145324612,1141383492,1111638626,828654146,574916624,2126114,0,0,64,12288,2097152,681647888,68354594,1108355328,1229529172,102285344,17977716,25329672,539263504,1161974470,67209480,1109543236,-2142760319,-1939654650,-714837042,841794482,-1651706164,2213061,-1717987047,-1717986919,-1717986919,-1717986919,1166298264,-1742290936,149422592,939530273,-1844959231,-1592735448,336233794,67373076,553911300,1112687112,1111638594,-2012196508,1226056260,1670132006,409144347,-2044367653,830890264,1759229661,168825017,-1038297576,687899668,949191696,251869254,-1986786682,-267910686,-2098185758,1252663352,-267880126,-1975384895,310543009,604045376,1234342548,608768549,-1840232046,1212454228,-1726382048,-1717986919,-1717986919,-1717986919,1385732505,549543780,-2108708568,150601928]},{"sector":5,"data":[687937801,1363415625,1210323489,-2010701167,-2021161209,-502783612,1111638602,-1855700414,574916624,138496276,-1836838846,606709140,-1843115678,-1838927287,279259209,688144144,521175586,34679054,143238384,-1845428212,18020756,293765128,539263504,1094863530,69308424,1101171266,4198916,-1635507193,304564626,1234314313,1381339676,2196520,-1717987047,-1717986919,-1717986919,-1717986919,-2109517672,-1708777463,11057792,134852643,1386909699,-213801591,1050660839,67373116,553911300,1112162824,1111638594,-2012212891,1896358468,1942894887,-1107849057,1234314473,843682340,625578660,335585316,35735844,1224737808,-1542172142,251857033,90768006,-2012212974,-2112876158,1183982114,-1995947710,71369761,-1861729982,604569664,1234079876,608801316,-1845216868,68232482,-1726414815,-1717986919,-1717986919,-1717986919,1385732505,-1073200564,20971793,16,16779273,1192259908,806882378,1212465504,1145324612,1141383492,1111638598,291914306,574916624,1244217608,279221330,604578180,-1843115630,-1843121335,1077420617,-2045242352,68190750,-868497888,830871571,286834720,-471757567,-473826847,2138299577,-532880749,-2084319759,1665533057,4231567,-865921017,-609849918,152089453,757222808,2213009,-1717987047,-1717986919,-1717986919,-1717986919,128994456,940449800,14680064,-2012348168,302528528,506691868,-470714308,-812660793,1942933455,1021507740,1010580540,1893785707,-518251464]},{"sector":6,"data":[1942894919,409144475,1717810893,897999128,-768324157,16416,16777232,1075839008,0,2097152,15728640,0,0,0,3670016,0,419430400,16064,786432,64,6168,35651584,34,0,0,0,134217728,-1073676288,0,0,3145736,0,0,50331648,0,0,0,0,0,0,469762048,0,0,0,-2144336896,544435540,7236946,0,190316800,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718602,655456,2,-1879048192,1,168886284,536874496,-1040162561,0,741376,0,145408,50331648,184550912,469767424,855648256,973092352,1157643776,1358974464,1476416768,1660967936,1895852544,2130737152,-1929345536,-1694460928,-1526685184,-1342134272,-1056917248,-721369088,-419373568,-67047168,234947840,604051713,788605185,1090598913,1476480513,1812030209,-2130610431,-1862170623,-1526621183,-1140739583,-821967615,-687746303,-503194879,-301864959,-66980607,167904001,352456962,587340802,721561346,906113538,1208107266,1442991874,1644322050,1778542338,1996648706,-2046656510,-1845326846,-1643996926,-1392335614,-1258114814,-1123895038,-989675262]},{"sector":7,"data":[-855455486,-721235710,-587015934,-452796158,-318576382,-184356606,-50136830,84082946,218302723,352522499,486742275,620962051,755181827,872624387,1040398083,1292059907,1526945283,1745052163,2013491971,-2029814269,-1778152701,-1610376189,-1392269053,-1224494845,-972833021,-821835517,-670838013,-368845309,33814019,302254340,604248836,906243332,1292123908,1610897156,1912891652,-2147190012,-1979415292,-1710977276,-1358650364,-989545980,-620441596,-368779516,324868,369429253,654647045,889531909,1124416517,1359301125,1661294597,1896180229,2131064837,-1979349499,-1845129723,-1660578299,-1425693691,-1190809083,-955924475,-771372283,-536487675,-301603067,-83495931,570818821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-268238848,0,0,0,50399232,1879089281,536870912,-2013002236,100668433,50626624,1140864,268435968,270533124,0,524288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,536870912]},{"sector":8,"data":[0,0,0,0,0,0,0,0,0,0,0,0,8,0,67108864,-1052638206,34832,151523328,-2145254400,1082132736,-1337981944,16777216,663552,8192,-2147073664,134217748,67178500,27394432,6660,1049608,64,-2095038199,-1861739516,318767184,68947586,-2015136776,0,1098915612,-2025898504,947583219,1894653159,529406256,-51330801,-298287330,-287557313,-1026491333,397312,202932225,1595396,0,0,268566528,36993,0,0,0,262144,119281634,925458,81789696,1074688,9306236,-2129590143,16777220,1883242496,-17502177,-828424321,419306608,4124897,2031616,-1905025986,-1908683151,-2109706016,526987,671613952,-1571518128,738853569,134479912,160190504,1091108864,579388449,1088423945,289805312,-2105537502,8407076,539099136,1132740672,135348752,138547334,806887492,579084484,1226981896,269632528,135414920,17808,-2147483646,134218784,8,-2147483648,0,1665273860,858993459,858993459,858993459,858993459,-502202112,545294344,67108994,285215248,31981568,411173258,67125792,-2147483390,285876288,270615052,-2010954616,138546241,-121632959,138513440,-2078276575,-2009070575,0,0,0,16384,-1073741824,0,4]},{"sector":9,"data":[-1527642360,134292112,603996320,335806794,1212416129,805308032,-1608497374,571507076,268575041,541591618,1084502040,1107567684,1108346912,-2105268190,1216876576,-1008598912,-177107321,1720437132,-156223124,-1150815283,277100495,858981184,858993459,858993459,858993459,151270195,-2045763327,5131776,80218368,8968,9044200,-1002436476,33884676,1352679553,1208238610,67703332,-1975515103,-2004876220,1279263777,69306498,-2012183520,-1008629636,991694471,941362823,647534961,470714307,1718863672,-1724539955,34078848,337675074,1074792929,21111808,-521067508,412256323,1225002111,-2131189728,-507436272,146939648,1343496304,608452772,135283204,690045456,541065475,16520,-1857543149,1245980194,1144166665,-1857023031,340398403,54530180,858993459,858993459,858993459,858993459,545353732,1342212512,167520586,1098842184,6850560,143216778,168053168,1082196485,-1038921568,507279360,136381455,71600880,34771072,-2004071360,-2078276575,-1874702320,-2126503920,-1857551358,-2004335582,1210377096,-918281583,-1975246191,8409110,-1069481464,138487884,611907587,1140982338,1199837193,50356352,270616840,571506820,268902721,541591618,1083461652,2080687175,1091569676,214337,1082671232,619839488,606248712,285822532,310985762,-1843097336,268968241,858981152,858993459,858993459,858993459,-1727777997,150528993,1347309696,8972549,-2013235704,701366569]},{"sector":10,"data":[-1861673519,-2079846136,-2012208830,1207976482,67703332,-1992292319,-1870658492,1279263250,69306512,537953312,-470710206,1058967495,2084446152,311003384,579946532,579979844,1227131204,252182528,1150460128,1073744001,71451648,269057538,411058308,1191709823,-2138771423,16851472,138547202,-1877860284,71581844,134366212,1161904400,-2139062268,16793732,-1878514670,1229243425,1143083273,-1862004087,573680164,54530052,858993459,858993459,858993459,858993459,276996100,1317012544,151277632,72,2656256,35989504,521217296,-507279601,37681392,270548992,136381448,71600448,34771072,-2002760640,-2078276575,-1988354032,-1857543150,268977186,-2004860896,1210323593,-901504367,-1992023407,18724,-1585314816,134300434,1140867072,69339458,1090785673,805307904,146939904,1108361604,276955153,557992002,546082834,1107821188,1074792482,1074299520,1082393729,605159680,69374280,294209604,310985762,1142461188,277136456,858981184,858993459,858993459,858993459,-939248845,-2092957560,680402944,1049600,-2013265793,1343094824,1193280583,1217404945,67703332,1107562818,1149767713,138479649,138479810,-1944058847,69273665,537953312,605194560,1143116104,1143116104,311003272,579946532,647220292,1187289164,67633152,1007469185,1090521281,-1617984766,-512752612,1216003,470286336,1056447751,-2131523777,1894201468,960069607,17702852,473752560,-2105507825]},{"sector":11,"data":[-54271716,16514,-1903705103,1282336305,951303133,-854002704,-2016656232,54530180,858993459,858993459,858993459,858993459,7368964,528517344,50331648,224,2684416,142671872,1896775992,1065286904,-253260257,1065352952,-1670132065,-264168194,-121632962,129895455,52426944,-1327468320,-1882725391,243743518,-579782628,-2026642468,-684188658,1815517965,33927,-2147483648,-1879048192,-2147483392,0,0,2,0,0,0,0,0,6291456,0,0,-1061027840,0,268566528,16385,276824064,0,268730368,64,0,0,0,-2147483648,-2030043136,0,0,-2147483648,2048,0,0,0,2097152,0,0,0,0,0,0,0,0,2,0,0,0,75759616,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,4128768,0,-2147360767,16777216,14528,196608,8392706,0,0,0,0,0,0,0,0,939556864,0,0,0,0,224,0,0,0,0,0,0,0,917504]},{"sector":12,"data":[0,0,50331648,6158,544435540,7236946,0,0,267780352,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718604,786528,3,-1879048192,1,185663503,536875008,-369065985,0,1043968,0,145408,67108864,251660288,570432000,1056977408,1224753920,1442860800,1644191232,1795188480,1996517120,-2030010624,-1761571072,-1493131520,-1224691968,-1023361280,-805255424,-520038400,-117380864,268502272,671161089,1023488769,1459702273,1677810945,2046914561,-1778284287,-1375624447,-956187903,-637415423,-217979135,235012865,620894722,771893762,1006777090,1275216898,1560433666,1828873218,2030204162,-1979547390,-1845326334,-1643996670,-1291671038,-989676542,-738013694,-553460990,-268244990,50527234,318966531,587406083,872622851,1040398595,1208173315,1375948035,1543722755,1711497475,1879272195,2047046915,-2080145661,-1912370941,-1744596221,-1576821501,-1409046781,-1241272061,-1073497341,-905722621,-737947901,-586950397,-385621757,-83627773,251922179,520361732,839134212,1107573252,1409566468,1627675652,1845782788,2063889156,-1929083644,-1727753980,-1559978492,-1174099196,-670775036,-335224828,67434500,470093829,939862021,1308967685,1678072069,1963290373,-2130347259,-1811577083,-1375362811,-939148539]},{"sector":13,"data":[-502934267,-200939771,235274501,671488774,1040593926,1325811462,1594251014,1862690566,-2096728314,-1845065210,-1576625658,-1375294970,-1207520762,-955859450,-653864954,-351870458,-49875962,185008646,487003143,788997639,1074214663,570902535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120586246,-2146571264,112,118259713,-809461631,-335544218,786435,-960491808,1610612736,18776065,920,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61455,0,0,0,196608,-1199501984,14188557,-1073741824,-1732178920,15112545,-2147371007,464519448,50816]},{"sector":14,"data":[208896,110625075,0,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,-872415232,0,0,-2147418112,0,0,0,0,0,112,0,0,0,0,0,0,0,0,2014863360,7130230,117638656,-857821159,51934720,811828999,-1073741056,1608929,1812332646,109514523,281182211,33554464,2021142576,-63423480,30840,52297728,-125631496,2146455311,511570127,-1628966596,939990648,-535871944,987762494,-249782657,536836318,-1577852957,-2147417919,1879048206,426803201,14520,0,0,0,101090049,32,0,0,0,0,251659008,3985200,119524472,520093696,855639552,-268369789,213922048,1879840774,464920,1879050096,527433735,-112259074,-51953665,-12791821,-1073281273,267387198,520125568,960268071,-133247007,821592311,-857945040,50331704,-1718022906,-591344461,-854850036,16789699,-1934524031,6733873]},{"sector":15,"data":[438004742,1611435148,11016390,1883767296,1075350668,-859009952,0,117837363,-969898367,289812492,1612188803,238028995,-1055908850,-2034165626,-1941125608,814505992,-1866462898,-2134761421,393216,208896,404226096,0,201326592,0,50528256,958859523,-409177138,-1670132167,1942895079,-835065956,65510515,101652736,13381656,8437856,163602432,12605440,1895866371,940317760,405805080,267386895,1044480,813829616,415303878,-2040462301,-2101125096,-2034159592,-2090782708,46358556,-2034233320,19099652,140,0,0,0,104,50331648,128,-1073741824,1812332544,-1743250917,147087372,100663544,135016652,-2000621512,13421772,405995520,-2034170622,805717600,201397062,281239576,504237872,432439313,-1038563712,1611172940,273100940,811798753,50348228,-1329471290,1001885671,1001642905,-606040445,-137437261,-276923153,134415299,1942895047,-835065956,971480179,-409177138,-1670132167,402784487,806913561,1196294240,1577058432,420219200,-1610416000,205533440,808458264,-2146893728,-1736439400,160989193,138829954,69408961,1612220001,422625891,1611058304,-1046740685,270008931,939820736,2022498627,2021161080,126057336,990316295,-592351076,50794012,1552401281,-1657047058,16243950,-1702925306,-1073336295,1617956044,818676736,408424460,-859039496,1879051980,216600579,106989249,1124479238,1612188672]},{"sector":16,"data":[187703491,-2146363626,-964683322,202174488,939929864,7512195,549982403,828835328,322138466,429627705,-943416099,1289107761,644244166,63129804,956760067,-409177138,-1670132167,1942895079,-835065956,65510515,-2095497697,16265264,-1064557415,102798080,12595212,822125315,406031449,416028774,429424921,-2129028991,1619532184,415506438,-2040459133,-496869352,-864020176,20144134,40092316,-2034233320,428022788,-858993524,-858993460,-1987475003,814520713,321316376,1673692169,862358665,-423326695,393314,1728974646,202152967,67133656,940060876,281808024,939576440,822484094,-119469925,1057359456,-1895316729,-524066568,328600368,-507019119,1022412672,822610956,-1065265146,277020988,192,856044390,-1724828877,-1734796898,422799052,1724255367,-1043569050,197507,1942894855,-835065956,971480179,-409177138,-1670132167,405930983,821825295,664273100,-1635737703,1614741536,-1547629376,-859033344,432740451,-1055903604,213979148,520929552,-536387336,-259842052,-132610463,422605410,1611058304,-996409037,270008931,251954880,211294467,202116108,432802828,-1717986919,-956813172,-862441117,-862375066,-1944505498,6735564,87425030,-930493312,-125236212,818678812,217844752,2093756620,117497856,521216780,106989281,1124479238,1612188675,154153155,-2133782106,-964689466,202116656,1292048904,51961858,12589059,870711552,854799110,429627697,1724684441]},{"sector":17,"data":[-1937565389,1131361478,51282822,956809217,-409177138,-1670132167,1942895079,-835065956,65510515,-1070592972,13369536,20127897,2134940,209746700,2013307072,1036746246,1613525891,1073529663,-1019216701,1619538428,415506438,-2040459133,979525656,-864020176,20144134,40093852,-2034233320,419628548,1010580620,1060912188,-1616961588,831297951,828622476,862375064,862375066,-966226919,52,-1736374785,202174616,134242304,203698380,550243352,939527372,587209854,-2039410637,805701216,201524038,415457304,283543856,29786353,-2045196672,503843852,1879363331,135464472,100663488,856044390,-1724834813,-1734796901,422799052,1019661441,-2033727941,197379,1942894855,-835065956,971480179,-409177138,-1670132167,204735463,12582912,1196294268,1367376281,786496,-1598026752,-1043595008,101090191,-501193154,249700366,554623520,134635650,69408961,1612220001,422583906,1611058304,-795082445,270008931,100959936,-863182589,-858993460,403492044,421009432,-963890804,-862441117,-862178458,-1944505498,3982968,359399430,1880627587,1627393036,810076288,-937899964,416047308,1879051980,820916492,1177585201,21377036,1712852099,-2010116925,-1049620282,-2034171770,101500440,-2046751728,202913800,12584979,593888768,806581030,-1717987023,1204197529,-863749853,-2043602738,54725827,956760067,-409177138,-1670132167,1942895079,-835065956,65510515,8404793,1585344]}],[{"sector":1,"data":[-1072906144,12607488,201326592,41168,100893465,1712065548,1611032160,1717569126,813850886,415303750,-2040462301,247619608,-2034159592,-2090782708,-2067701732,56696844,16975368,-858993492,-858993460,-1734830004,831297944,422758028,591627788,1944489100,-466576327,393240,235282284,202152975,-662699776,1895594032,1618505752,13398136,269221888,-126126080,2146471695,511443151,-1618480324,953130111,998960,-1198780610,216007454,2082244097,217259836,50331840,-1312570957,-583295005,-572662371,-641628445,410486471,258182193,197571,1942894855,-835065956,971480179,-409177138,-1670132167,924713959,819986688,2031820,520093696,4128768,-1603268864,100663296,403639299,-1033204,268431375,-217055248,-108064770,-51953665,-12791821,-1073281529,267387198,-1625523072,-1073219584,267387198,1989705991,1987475062,260536182,487526159,-268945202,50794012,127386497,-287524493,1628208,74186752,0,2052,4224,0,0,4,1580032,0,0,0,0,0,917504,0,0,0,12583939,0,1627389952,8388992,100663296,6144,0,50528258,3,0,0,0,0,0,16,7876608,0,0,201326592,786432,0,0,0,0,100663296]},{"sector":2,"data":[0,0,0,0,0,0,0,0,2,0,0,0,0,-1071644672,48,0,403046400,268435712,0,0,524288,117440512,224,0,0,0,0,0,32771,0,0,67305472,192,0,25190656,128,402654720,0,1179648,197379,0,0,0,0,0,0,805306368,0,0,0,3072,6,0,0,0,0,768,0,0,0,0,0,0,0,0,0,196608,0,0,0,0,16777216,11583520,0,0,4098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,264274179,240,1040187392,768,251658240,15360,0,-2097086436,6,0,0,0,0,0,0,0,0,0,0,1835008,0,0,0,0,234881024,0,0,0,0,0,0,0,0,0,0,14]},{"sector":3,"data":[0,0,-524222208,1834221792,1834098803,110,0,0,-125825032,267943951,-2146436992,-125825032,267943951,63616,-2141112224,107003952,67136512,805503218,1493221376,160,0,109839104,192,-1744764928,56680455,1717570787,107372550,1661363808,1127253521,71512068,106954758,-1020239872,214118412,806142768,-1020200768,214118412,408993840,-966783997,214327308,-972241312,-412056013,250048526,106954758,-479174656,250048524,1880024944,-478611232,482554140,955301937,61664,805503072,522094111,393312,1610612784,100663302,51314691,-121552900,536396039,-2095095680,1610614464,402685953,-278700032,-54493425,1056737151,-478546943,-2029568004,2081419135,20904129,-126715656,116949279,-512161791,-1059029000,3194880,50331648,-58689546,1073275166,-478548799,503776252,2037894975,-2127038239,-125665300,116293895,-1070004223,1623211872,6291462,-2146437120,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,-2146436992,-125825032,267943951,63616,-54325408,116391936,33568768,-1744764924,536870912,50331712,252,108397312,262336,805502976,8306688,-984991,268431375,-149946384,-947913488,-54034436,1073529663,-2021655357,-125755444,536379679,-2124416896,-125755400,1022918943,1665087495,-161267722,2079744831,-2128610080,-125755400,1073529663,-2027946813]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[8084045,3,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":7,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":8,"data":[279886,131221,190350716,32772,0,0,0,0,4194352,9175104,9765013,1175,589824,0,0,0,-2147024892,1,5046272,5242904,68,-2146959360,3,6619136,-265289636,32772,12648448,-265289594,32773,21430272,-265289510,32774,0,1313818119,1380533332,1431257861,16722,738197504,1414418246,542328146,741355570,875312697,540680248,1920298819,544367977,808528952,540160300,1952797480,691151648,0,0,0,262147,96338176,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145736,327776,0,-1879048192,524289,137363462,536872960,-536846081,0,374272,0,1866661888,1701409397,327794,140378368,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145738,458848,1,-1879048192,589825,154140680,536873216,-67084033,0,546304,0,1866661888,1701409397,393330,228458752,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352]},{"sector":9,"data":[1702061426,1684371058,46,0,3145740,589920,2,-1879048192,786433,204472330,536873984,1342202111,1,890368,0,1866661888,1701409397,114,0,0,96338176,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145736,327776,0,-1879048192,524289,137363462,536872960,-536846081,0,374272,0,30208,402653184,1712862774,403445816,0,943588096,2114879038,1044283196,458752,471743600,2138980222,2120433535,1098412831,1048460899,1669217918,1667457891,1012932223,786456,393328,408944654,7893004,0,1572864,0,806880768,59,0,0,0,0,0,0,0,201326592,1667436044,1043734040,28,406650686,801852,939524159,1616904254,103812336,473316124,238567231,242234908,981362236,974915440,943652918,238427150,56630384,473316124,56623104,106968604,991639064,991691616,1610612790,53877763,402667120,205422390,202905696,6172,409142784,1612579683,1667434080,1042028568,910231068,808674099,409165872,1664103942,1664312179,1666867251,909534051,204478470,1008205884,1044266814,2020491032,1981298236,1065238126,1669209719,1667457891]},{"sector":10,"data":[404229247,471604334,471604252,471604252,471604252,471604252,471604252,471604252,471604252,7196,910039103,1291859992,102,2120613977,1712852486,402653306,1616904291,471597168,907832931,2139054876,2122219391,1664319102,1044266558,1667701822,1667457891,202913342,905997923,202915638,404226147,1712062566,1717767192,406789120,201326604,402653246,408958464,202899515,2130738815,409144320,2117475852,1061031038,7340032,1667046407,1009999934,411004732,1999649798,1665033067,1662533182,471624502,202905628,1711276134,2003198003,410215998,1796750348,1714643827,1662529595,907832118,202905606,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,201333788,2137209952,1358982144,2134782779,406585429,1711277592,402659386,1852204606,909515830,473306140,808476727,404238384,1937446936,1667457891,1667964003,912483171,471610931,471604252,909533195,2021144118,1849587832,1044266558,1667701822,1667457891,25395,805732096,202899558,6198,409147392,58655536,56825955,1042022400,2136932380,808674099,409166640,1798321766,1664115559,1662518070,137772572,202119216,1711276032,1617322035,409157144,1796748812,1714643811,1729627696,473316892,404229168,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,201333788,138285119,1358968344,419328,89,1711291454,1006632970]},{"sector":11,"data":[1668166400,2139042030,1048526398,1044276092,404241982,1798510616,1667457891,1668488291,140731235,1717973822,1717986918,1616928872,404250720,1936070680,1667457891,1668488291,912483171,402667059,1719416320,202899515,1572864,2118004760,2114354815,507392062,464920,1665144944,2138979966,2120433528,1669296956,1048067683,1044135547,476255240,201726079,989855744,1044332414,2120418878,1803449100,1044266595,990854268,409146376,404229247,471604224,471604252,471604252,471604252,471604252,471604252,471604252,471604252,201333788,476265996,1291852824,13183,2113929301,2063597568,786442,102721151,1667440159,1667457891,2139045479,2122219391,1736343166,1044266558,1048452158,473841214,993752688,993737531,1010712374,2122202172,1664908926,1044266558,1065229374,473907007,7230,1572864,403439616,1048576,24576,0,0,4096,1835008,0,0,0,452984832,0,0,1006837248,65280,0,7168,56,124780544,0,1879048192,806880768,0,0,0,0,0,0,0,0,0,0,1040218112,0,62,1610612736,3932187,252051456,6,0,7168,0,0,0,0,0,0,0,7168]},{"sector":12,"data":[1879048192,1866690672,1701409397,114,140378368,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145738,458848,1,-1879048192,589825,154140680,536873216,-67084033,0,546304,0,30208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1572912,0,0,12582918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,855638016,0,-16711680,0,24576,0,0,19922944,808649603,805306608,1661371137,1714427904,13372416,-858996640,1572864,405832641,19922944,808649603,805306608,1661371137,1714427904,13372416,-858996640,1572864,405832641,100689408,-1017068020,102264856,12585996,100663296,-2096685538,2029547968,990846,0,102644736,-203962593,1635647229,2012119967,2126908867,-945873025,-2045903897,-542088765,-268384541,786552,1879048220,1879063552,51249152,192,0,32769,0,-1061036032]},{"sector":13,"data":[0,0,0,0,100663296,836993281,4141208,36639,16515072,118423582,-33505152,118358016,16974720,101456064,29412364,209665688,12585990,13394112,16987007,3158915,59129600,1627414534,101465280,29412364,201326744,12585990,13394112,16986907,3158915,59113728,1627414534,100663488,-202256628,202948656,8390406,201326592,-972290509,-1065291424,-2145832186,3145728,-2040437056,422800396,1640219268,-1010433914,-1008296701,1825353777,-2045916364,-1877396541,805307331,520093900,-1309423857,914055416,818286366,2128140738,-941941137,-2034631705,-542084157,1623228641,253639926,-524188921,507279600,-1048377585,1014558944,-2096689378,2029052097,118431292,-253705853,15480,-519978233,6500504,8405280,131328,-2130639309,-201260864,201719808,197568,101449952,-1065352957,2143516912,-202383425,2130508017,-942688207,-50794013,-659528900,203097696,524183292,-524056817,1065348337,-473460961,2029052097,-946915572,-50794013,-1657061572,208922574,100713468,6489600,402679392,-2132730109,402653184,-2147416525,-118443583,-2095505908,-121536511,-1889072080,419679247,2143353072,-2084110202,-1011417853,1741467697,-871578752,17768155,813695363,16777216,1932946572,1002895372,-523894778,-1007878973,1821159729,-2036760319,-802147365,1640005825,253639868,-524188921,507279600,-1048377585,1014558944,-2096689378,2029052097]},{"sector":14,"data":[118431292,-253705853,100678776,818087692,14168304,1619417383,7995648,8789790,-191299136,201719808,222150,253630560,-524188921,817946352,270945432,405823680,1826143357,-2045961418,-659527876,-1743178132,17002182,811647104,1640182296,812439728,405823680,1826109494,-2045961418,-1936103620,204694470,100713414,-530512384,402717888,-528021757,805369857,394803,-870829981,-2146487528,768,-1720903668,419654796,1641005184,-1010427770,-1013027581,-2133905345,-871578656,101069787,817889283,520093696,856059020,868638972,-2134441978,-1010012989,126660913,-862420511,-2095505701,952107015,253639680,-524188921,507279600,-1048377585,1014558944,-2096689378,2029052097,118431292,-253705853,100678776,-520027380,6684920,-1010020820,7535089,-2029058560,-191364736,118423576,2033398659,422785228,828622476,1052809369,-1064890593,405823680,1826141745,-2045961418,-659523268,-266848660,524248006,-236730481,2143354616,-252715073,405823680,1826107423,-2045961418,-1936102084,-1741593658,26310,837816064,402693273,-2134832125,1610612736,101451315,-862391965,-2147405008,-121569280,-1620639696,420703372,1640218756,1673926790,-1014100725,-859033552,2014102320,210133350,811597859,822083584,859204748,863920128,-523894778,-1010012989,9220401,2025357617,202322790,1623228449,253639680,-524188921,507279600,-1048377585,1014558944,-2096689378,2029052097,118431292,-253705853]},{"sector":15,"data":[100678776,805552903,1781856,1611022375,4849968,0,345506048,0,206594054,-1082169836,-67637281,818018557,270945432,405823680,1826140977,-2045961418,-659525316,1612199532,828597244,862375064,1623404569,792624,405823680,1826140209,-2045961418,-1919190724,-261037114,100678854,-480049664,201389592,6,-1070595904,-1014030562,2029007040,51322416,3178497,811604160,-202913825,1635774717,932155295,2122714619,1738415996,821621219,529490278,808452323,503316480,-639383589,2064054520,869171359,2129554931,127803199,819788000,528905062,1623228641,253639680,-524188921,507279600,-1048377585,1014558944,-2096689378,2029052097,118431292,-253705853,100678776,14714625,12988656,12607264,131328,8396544,351011072,251659776,821559488,-1335804866,456551640,2139004429,-202383425,2130508017,-942722689,-50794013,-1893761220,-235871289,-1640108352,-642553905,1065279213,-473460961,2130508017,-942723041,-50794013,-972210372,1622700515,6396,-1073741824,100663296,16777228,128,0,0,0,3,2031616,0,0,0,0,12586496,0,0,-268386301,65281,0,3932160,8392448,0,12583280,0,3932160,-1061036032]},{"sector":16,"data":[16527360,32799,16515072,0,905970432,7168,2083520512,12,0,3670016,0,0,0,0,0,0,0,0,3670016,0,0,0,0,24576,-1056768000,1866723520,1701409397,114,228458752,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145740,589920,2,-1879048192,786433,204472330,536873984,1342202111,1,890368,0,30208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65295,0,0,0,0,0,1572864,-872413672,15761433,1572864,-1744763368,102236184,38913,402659532,432799750,16777344,1619001728]},{"sector":17,"data":[1605657,0,0,15728640,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,786432,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,50331648,4092,1056964608,192,-268366080,3,0,4064,2013267824,393216,813898080,9961728,393216,8395104,425721862,50331776,1610614320,3179289,0,-1744763296,6291456,1572864,-872413672,9961728,1572864,1560,102236184,0,402659532,13369350,16777216,1619001728,1572864,0,1719671136,529269510,221184,192,0,-2128671744,-125755424,267944711,-2128610173,248,805355520,-2128611327,-226459680,2147354495,-478547232,-1629024260,1896287868,-2139098912,-58490896,-258021505,-411459585,-253722722,267386928,393216,28672,117489665,7340224,8847712,30]}],[{"sector":1,"data":[0,0,0,939524096,12583174,0,0,0,0,0,0,0,0,0,0,0,0,0,-134217632,111068976,-2078671359,8388866,1073741824,983072,411048288,520093702,192,8395104,201327408,24576,0,535822366,64225,-33095680,0,8387587,0,251658240,1611595776,0,1879105657,454657,813898080,15761433,393216,-1736369824,425721862,-1022453631,1610614320,422609689,128,-1744763296,1885372441,38913,-864020128,836273695,417920,1619007840,0,-1070589952,214118496,402686733,-1020261373,1610614284,201326595,1616907267,247672928,805749552,-1070592413,411238752,940443440,1664093379,107360268,1611424614,-2095511962,-1059037172,422576152,128,12288,201375744,3145728,196608,6,0,0,12,0,1610612736,509607942,1044672,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,61440,-1946090752,101450511,67110403,8392698,1593835520,-2145845216,-268434592,1006632960,128,8395104,402654000,393216,1610614368,241172486,-411103645,115572734,1073529663,-953130816,-268431458,821035023,-953028416,-1628997218,1067370288,6339]},{"sector":2,"data":[0,0,0,196608,0,0,1610674176,0,805306368,0,-33357728,414237488,786432,1610616624,0,-1070583808,213909600,813204249,-1020258304,1610614284,66847500,-530117632,113651952,858809136,-1070594554,813891936,1016989488,1714423494,6762502,806093574,17786566,-1065352296,3145740,16777216,-20758536,1073529663,-2127038845,478355424,2010909958,-1016071037,-54313994,2031929151,-411496465,1623211934,929038342,1044608,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,61440,-2134831264,111052569,83935238,-864020094,1493221439,-2028404576,402656510,1006632960,24704,813898080,201327408,1007616,-268431376,519045135,1664091654,811806726,106954758,1664114688,214118604,1611449136,1667493984,214118412,806142768,-2128668573,-125755400,1039696159,-1019216189,-54312964,517996830,-955391999,-54313096,1073529663,-952110912,482832668,1067370353,40647,-1744764832,1012924446,786624,-18383056,16253184,-1070571520,2021654880,1066173233,-2128668544,252,48,1634482368,8798104,1072718640,-1069613050,-528285344,922093104,-2042689850,-260030714,806093574,419526,-1073740048,3145734,0,107360268,201770592,-1070068730,813891936,946210310,1714423494,6691852,806093580,-2095511866,-1065275124]},{"sector":3,"data":[3670022,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,61440,-264038304,15728655,83898371,-1732178302,1610137856,983072,-259973280,470549248,24704,-1744760848,2034025265,-2129018687,-1736369768,932741401,54460614,-268222480,106954758,1669226496,107372652,1611032160,1667690592,214118412,815317296,-1073729437,213909516,101498880,1717569126,107372550,106954758,-482385920,107372684,1611032160,1667493984,214118412,806142768,3171,-66650016,1725726727,786624,1610616624,0,-1070546944,201328224,806142015,-1070583616,12,66847500,-479764480,6697212,858809136,-1070588154,813916512,862324272,103810758,243282182,420217606,1047683,-1073734560,3145731,50331648,6697212,218023776,-1070593018,-528285344,811992582,1714423494,-66906100,420217612,17788035,1610614424,6291462,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,61440,-1073735584,117360432,67161088,805503226,1493221376,160,96,67896064,128,-872415232,57065475,-1019281213,-54312964,2130494271,53477382,805515264,106954758,1664114688,107372604,1611032160,1668083808,214118412,821084208,-1019278237,-54312964,1073529663,-411107098,-18382850,106954758,1667260416]},{"sector":4,"data":[107372556,1611032160,1667690592,214118412,815317296,39009,805502976,1672921392,786560,1619007792,100663303,-1070563327,201529440,806126337,-1070583616,1879049752,201326595,106954752,107163654,805749552,-1070594557,411263328,822502960,53480643,113651724,252445446,-2145806335,-1067421600,3178497,100663296,107360268,201377376,-1070531581,948109664,811992582,1714423494,100669452,253494028,-2145780733,1623202032,6291462,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,61440,-2134831264,106954752,67122688,-1732174078,1073741824,32,0,76284672,128,-1736368384,101498886,1717570755,107372550,1711695456,1664091747,107163654,106954758,-1020239872,214118428,806142768,-1019678528,214118412,1063305264,-966783805,214327308,1712113248,106956294,417792,106954758,1667260416,107372556,1611032160,1668083808,482554140,1072742449,61632,1611006048,1042055967,393440,96,100663302,-2095120381,-121552900,536396039,-2128650112,1610614512,805355520,-1893769216,-121602289,2097022847,-478545408,-1912127492,2014310271,8188096,-59541264,116949279,-512124927,-1059029000,3194880,50331648,-54300682,1073505087,-478606208,243728892,2037894975,-1019216669,-66896132,116310279,-528902143,1623211872,6291462,1044480,-268431376,267386895]},{"sector":5,"data":[1044480,-268431376,267386895,1044480,-268431376,267386895,1044480,-268431376,267386895,61440,-66911392,116391936,50334726,-872414980,1056964608,117440704,254,74842880,196736,805502976,254861327,-984863,268431375,-149946384,-411042591,-18382850,1073529663,125828291,-268431476,267386895,24113152,-125755400,1894809631,1665103879,-161267722,1006003007,-1019216669,-54312964,1073529663,-954204989,-54313058,1073529663,-1052774208,-287236370,811655198,24576,0,6,196608,192,12,0,0,0,0,-1073741824,0,0,0,0,0,0,0,16777216,156,0,0,-268435456,15728640,65295,0,0,63489,16128,0,7340032,14,0,117440512,939524288,12583174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,63495,0,0,0,0,201328128,917696,0,8306688,192,0,0,28672,0,0,0,0,0,0,0,0,0,0,0,57344,0,0,0,0,0,6291456]},{"sector":6,"data":[1891632896,1866711047,1701409397,114,939929864,7512195,549982403,828835328,322138466,429627705,-943416099,1289107761,644244166,63129804,956760067,-409177138,-1670132167,1942895079,-835065956,65510515,-2095497697,16265264,-1064557415,102798080,12595212,822125315,406031449,416028774,429424921,-2129028991,1619532184,415506438,-2040459133,-496869352,-864020176,20144134,40092316,-2034233320,428022788,-858993524,-858993460,-1987475003,814520713,321316376,1673692169,862358665,-423326695,393314,1728974646,202152967,67133656,940060876,281808024,939576440,822484094,-119469925,1057359456,-1895316729,-524066568,328600368,-507019119,1022412672,822610956,-1065265146,277020988,192,856044390,-1724828877,-1734796898,422799052,1724255367,-1043569050,197507,1942894855,-835065956,971480179,-409177138,-1670132167,405930983,821825295,664273100,-1635737703,1614741536,-1547629376,-859033344,432740451,-1055903604,213979148,520929552,-536387336,-259842052,-132610463,422605410,1611058304,-996409037,270008931,251954880,211294467,202116108,432802828,-1717986919,-956813172,-862441117,-862375066,-1944505498,6735564,87425030,-930493312,-125236212,818678812,217844752,2093756620,117497856,521216780,106989281,1124479238,1612188675,154153155,-2133782106,-964689466,202116656,1292048904,51961858,12589059,870711552,854799110,429627697,1724684441]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[7887437,3,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":14,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":15,"data":[279886,131221,190350825,32772,0,0,0,0,4194349,9175104,9765013,1175,589824,0,0,0,-2147024892,1,5046272,5242903,68,-2146959360,3,6553600,-265289635,32769,12648448,-265289597,32770,21233664,-265289550,32771,0,1313818119,1380533332,1279608837,16726,687865856,1414418246,542328146,741355570,875312697,540680248,1986815304,824981536,842083376,1699948576,841162868,41,0,0,0,65539,96534784,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145736,327776,0,-1879048192,1,119603206,536874496,-1778360065,0,375808,0,1699217408,33584748,755040256,671088648,1126181219,1920561263,1952999273,1953055264,1701999731,1226861921,539911022,892877105,1816207406,1769087084,1937008743,1936028192,1702261349,11876,0,805308928,117465088,256,0,400,553650176,1245193,6356768,190,136839168,0,1207959552,7760997,16777219,2833,539583272,2037411651,1751607666,1765941364,1920234356,544039269,778268233,943272224,1092628021,1914727532,1952999273,1701978227,1987208563]},{"sector":16,"data":[3040357,0,786432,6291504,131081,0,102400,655360,318769697,1627332608,57856,201326592,11,0,1986815304,0,96534784,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145736,327776,0,-1879048192,1,119603206,536874496,-1778360065,0,375808,0,145408,33554432,134218752,318770688,570431744,671098112,822094592,989870336,1073757696,1224754176,1392528896,1560303616,1744855552,1946185216,2080406016,-2063565312,-1811903232,-1577018880,-1342134016,-1090471936,-889142016,-620702976,-503259904,-301930240,63488,251725825,503387905,721495297,989934337,1291929345,1493259009,1627479297,1778476289,1946251009,-2147386879,-1962834687,-1811836671,-1610507775,-1543396863,-1409177087,-1140738559,-939408895,-771633663,-637413631,-436084735,-217977343,-33425151,100795393,302124034,402789634,503454466,604119298,704784130,805448962,906113794,1006778626,1107443458,1208108290,1308773122,1409437954,1510102786,1610767618,1711432450,1812097282,1912762114,1996649730,2114091266,-2013101310,-1895658238,-1727884286,-1509777150,-1342002430,-1157451006,-989675518,-821900542,-670903550,-469574398,-352131582,-201134334,16972034,285411587,503518979,738403587,973288195]},{"sector":17,"data":[1258504451,1493390083,1694719747,1828940547,1963159811,-2130478845,-1862039293,-1593599741,-1325160189,-1140607997,-872168445,-603728893,-385621501,-184291581,17038083,218367748,486806276,671359492,872689156,1006909956,1141129220,1308903428,1510233092,1711562756,1912892420,2063889668,-2029747964,-1828418300,-1627088636,570729732,-1907611627,278545,1406011667,-2132575026,-1895628008,2084454022,686352379,1627496784,-126059458,673769723,-1171289534,276856889,269492224,4180,-2147483648,0,1834713909,-1234314314,-608801317,-1999063443,-1619162501,-553189348,31624240,274728176,1611151376,-817044687,214361863,-1617792909,235080733,-239914738,1623408896,574626960,12638234,-515504120,47330341,81319440,543236868,2081751256,705827297,-1206648700,84955681,-127708140,558452932,142754369,558966792,1111576963,-2013231742,1363290152,1074405953,-415654333,-1761288669,1033823161,625332686,1162132520,-608801381,1843115629,-1234314314,1385045208,547694208,-498360309,214977380,405811353,-1050660864,134874755,-369377745,-1615851479,522133279,-1802226636,576656660,19154208,281309479,156242592,1613300769,1342759449,15362,243411216,-1942018302,1397131300,-1042085730,-1758396288,1111539280,-386938637,1229267294,-125141951,1210353904,562176162,1358954504,1370762562,340071511,-1860680367,-1983372219,1830498436,-1234314314,-608801317,-1579633043,678437098,-1595256930,1226867760]}],[{"sector":1,"data":[-1838938924,1217923731,-1992023407,537454611,1007749506,-1600085848,-726294368,303305748,-411452272,-622823010,-759796453,-1897710302,-1466244296,-1574401374,2080374920,713175396,-2010906492,290551937,-127713264,-1579214912,142754369,558967848,1078019369,-2012706682,1343522082,532868,675467526,-1806380765,1162941509,-668430074,1078202565,-608801509,1843115629,-1234314314,1921948888,562112736,234889227,72370400,-1164963319,-134480478,146726895,-906806225,-1599729647,-1600085856,336860342,572461332,-1969084278,1091601004,1159860740,340087060,-1969051558,5251621,-1630983920,553918530,334367043,-1797054322,268501784,2084486672,736626682,1125236112,-2055585730,46237680,-1601206264,1577255048,1361110841,323310676,-820232802,1008896272,1830502468,-1234314314,-608801317,-1982286227,638591739,-1609957188,1879105539,66076752,-2053373055,1344803850,-1093671005,521267707,522166049,-482926817,-505158685,-1503058416,1906796954,-1830602546,-1911342814,-946085064,1021475230,32,1073807488,4210688,0,2048,8392448,0,0,0,0,0,1052260352,0,2146311,68157440,0,-2144010228,0,0,0,0,8160,49159,-1073725440,-2138898432,128,50331648,128,0,0,0,0,0,8388864,0,0,0,12591116,1986815304]},{"sector":2,"data":[0,0,0,0,137167104,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145738,458848,1,-1879048192,1,153157640,536875776,-1107271425,0,534528,0,145408,50331648,201328128,469767424,855648256,973092352,1191198208,1392529408,1509971712,1711300352,1946184960,-2113897728,-1879013120,-1644128512,-1476352768,-1308579072,-1056916992,-721369088,-419373568,-117379072,151060736,486609665,654385153,922824705,1275150849,1593923073,1912695041,-2113832191,-1811838207,-1459511039,-1174294015,-1006518527,-805189375,-570304767,-318642943,-66980863,134349569,386011138,486676994,654451714,922890242,1191329538,1409437442,1593989634,1828873730,2097313282,-1962769406,-1811771134,-1576887806,-1442667006,-1308447230,-1174227454,-1040007678,-905787902,-771568126,-637348350,-503128574,-368908798,-234689022,-100469246,33750530,167970307,302190083,436409859,570629635,688072195,855845891,1090730499,1258506243,1493389827,1778607107,2030268931,-2013037309,-1778151677,-1576821501,-1375492349,-1123830269,-956055549,-771503101,-519841277,-284956669,-16517629,285476867,587471364,923020292,1208238084,1476677636,1694785540,1862560260,2114221060,-1845196796,-1509647356,-1174097916,-939213308,-637218556,-335224060]},{"sector":3,"data":[-66784252,168100612,402985221,637869829,939863301,1174748933,1409633541,1610963717,1778738437,1980067589,-2063237883,-1794798331,-1526358779,-1325029115,-1090144251,-855259643,-620375035,-1039801851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1610615808,0,-671088640,0,0,0,0,0,0,0,0,0,-1894187008,49363,50396925,6364,109064960,1610645020,-870441460,49347,1662780976,9489504,-1073735437,-2144209952,-2097074173,6316038,906756870,61644,1824921696,-654278631,-605998976,103809048,204511281,-1290993472,948749104,13424652,1668810240,-1633696793,15759486,253624320,2130207168,-1614856321,-1023009844,870113632,1065286905,1826148239,-1330577098,-1278746913,202752,208896,394080,0,3072,50331648,-585301833,-572662307,-572662307,-572662307,819781085,1739823459,-1067444096,8782080,1623588984,-167708672,235675328,1630541872,1611038903,403472126,303759459,111081731,-1642527997,217979904,29363206,-1933507706,-1744737229,1662517248,1382155056,-1017073555,-2147258341,13375500,198,-151406835,-1945277224,100669560,1731256525,-855232360,415260827,-248500173,-1335770234,460075056,-211760122,-2045954338,64532673,20343832,-1736369765,32961]},{"sector":4,"data":[-203165197,-612614202,2088564278,-554467588,-1687315507,-1909332425,-572662307,-572662307,-572662307,-572662307,-807009316,922774579,50380982,1640759419,-392625780,113260032,805307916,50727960,-1011826429,2139062143,224627761,-477151293,-1656750344,-659529329,-429443476,1008635751,1021243768,-1058803336,-248446976,-235802127,1723047923,-868771071,51118272,414237490,419335425,1623985152,1050660193,60324108,1728497183,-1057187431,809484129,-267977969,920378976,-1329494515,1813562319,260976950,-2141120509,454754304,1668232758,-614016154,-960051610,-1681060666,-969870484,-576873679,-572662307,-572662307,-572662307,920444381,1730021830,-869058944,8094687,17234809,855697560,2113963673,507279408,-1014823153,1616953406,-1942921120,1625541991,-2096285992,1637604704,913103024,-1044367514,403441283,-1681037773,-1942919626,454794201,-1222960357,-1681037645,12610614,-533658868,-1933494674,202309496,1874878668,-870796351,16780536,-35951476,-1335771002,468463664,-866062330,-66210087,1660993485,2070111768,403047950,32865,923147259,-614046746,-966337594,-1933326650,1668062157,-1070560207,-572662499,-572662307,-572662307,-572662307,-1882245412,935332876,-1149167184,1660944491,731382236,-1072943104,-866123714,-1944505498,-1057986618,2122219134,224627761,920150203,-580877555,-659529293,918958956,1050660711,1627388284,-419955715,-1686270927,454761243,1723053339,1815518157,117440704]},{"sector":5,"data":[1641795832,416058497,1640765440,-1283366528,51956784,1728103967,-1014624909,808497249,-865723540,-153567136,-1312325619,1662542720,102485955,-2144266228,463143168,1057371702,-614016154,-960051610,-238236480,115601816,-585269199,-572662307,-572662307,-572662307,870112733,1740577254,-865658752,8782272,16777216,117450904,1720162777,2147483341,-152051777,1616954160,-1942921120,1619987811,-2096285992,1642323296,829216944,-647174521,-1681037645,-2084477392,-1942944250,454794189,-1122297061,-1714592077,8415206,-516750580,-1939784050,-664791040,-1040751752,2016419487,415260915,218312716,1065320184,468459440,-1065434308,-2131135528,-1008783233,-2038316785,-669022671,32817,-203165189,-614071354,2087115574,-1899528452,-1734778500,-2144213305,-572662499,-572662307,-572662307,-572662307,-1064357412,264265740,192,-134151940,686555392,520093708,-2038858088,-659529277,2118006380,2139062143,-110916559,-477151353,-1673527560,-1893777410,109502919,1050660839,1021245820,-958140040,-1720087503,-235802127,1042268147,-1010304900,0,49152,55296,32,0,536870912,251658240,224,0,0,0,-2147418112,0,0,-2147017216,254,2113929216,12288,113246208,0,58721024,183,0,0,0,0,1728053248,128,0,16777216,1572992,113180928]},{"sector":6,"data":[6144,0,0,0,8388864,0,0,0,6144,0,0,0,50331648,3718,1986815304,0,185663744,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145740,589920,2,-1879048192,1,169934858,536875776,-503291649,0,723968,0,145408,67108864,251660288,570431744,1006645248,1157644288,1409305088,1644191232,1795188480,2030071808,-1962900992,-1660906496,-1358912000,-1056917504,-838809088,-620703232,-301931264,100726272,453054465,822158849,1140931329,1543589889,1744920577,2080469505,-1778284031,-1409179135,-1023297535,-721302271,-368975871,33683457,369232898,537008898,755115266,1023554818,1325549058,1610766082,1845651714,-2147322110,-2013101054,-1811771390,-1425890814,-1123896318,-889010686,-687681022,-402464766,-66915326,201524226,369299971,604183555,771959043,939733763,1107508483,1275283203,1443057923,1610832643,1778607363,1946382083,2114156803,-2013035773,-1845261053,-1677486333,-1509711613,-1341936893,-1174162173,-1006387453,-855389949,-637284093,-335289597,-117181181,151257347,520361988,755246596,1090793988,1359235332,1560566020,1761894660,2030334212,-2063303420,-1878750972,-1576757500,-1207653116,-905658364,-570108924,-234559484]},{"sector":7,"data":[184876036,537204229,872753669,1107639813,1241859589,1493519877,1896178949,-1996129019,-1593469691,-1308252667,-939148027,-570043643,-234493947,67500805,369495302,671489798,1057370374,1342588678,1644583174,1862691590,1996911366,-2063172858,-1761178106,-1459183610,-1157189114,-922304506,-620310010,-318315514,-33098490,570885638,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32895,0,0,0,-1061158864,-2147011594,-1073741824,855835395,251700237,-1073692576,-866119888,786432,805703180,12,0,0,0,0,0,0,0,0,0,3072,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1073741824,49152,0,0,0,0,0,0,24,0,0,0,0,0,0,117440515,14576,63491,423680,-1677656064,17588224,51118304,12333315,49164,202125312]},{"sector":8,"data":[1083834816,817896192,466354179,192,456130563,3145728,805309440,503377120,-1073741824,402656771,-654245780,488375936,805306496,8438528,48,1063676934,102635550,30,104727296,-473921777,1056864504,31,1072693248,-2122370880,-817891103,1717631216,110649606,1008245761,2146484255,117171975,1640231104,-117885008,1610670321,100696065,-1073734656,6316134,0,0,0,-2133131008,1942894855,-835065956,971480179,-409177138,-1670132167,251659239,523463820,202119219,101449728,419438080,-2143354740,-536824313,405799708,-1073741044,-2130244560,-18759169,-119038081,955777280,-2146994128,2021656440,865615160,466378758,-2096144381,-1196310272,13254,453783552,601082904,408973411,-837273802,100862976,29569222,1812332696,817062246,204670515,50380992,-870834589,-1073683615,-1724816634,-2130460543,2016460952,-2045131168,100863024,1661363808,-1643968744,857260824,818700300,-255850813,1612198851,808687665,-2147418112,805307904,1610661888,96,0,24,50331648,968345368,-409177138,-1670132167,1942895079,-835065956,15178867,-959997952,822095971,27878,855700249,13056,-1241448323,811008,119406688,511238273,103842567,408977433,-1718025978,-2043593594,411459864,-952596895,1611019032,1619401164,49176,503316480,0,0,8388864,0,3584,0,3]},{"sector":9,"data":[1627324422,3366942,-1065318559,107152896,1667481600,1661763585,260544817,-1894129424,-866071400,204505857,1717567494,119039494,-2129028217,1611019928,113443020,518429025,-1939750900,16777264,2122119409,-50561986,-546871706,-507017441,-960567303,1815529155,-854006985,1942895079,-835065956,971480179,-409177138,-1670132167,404685799,519270156,1007039232,-1692860416,1628184064,4010880,1610652673,405799692,818089011,-1022610484,-2147414992,17176672,914594201,858784563,53686275,865635641,416047110,-954695732,-118431293,-132235652,524188796,-959673329,2096689347,-1911611586,-862441153,-216320410,393228,-1073725594,-1621032930,104790247,-2097084829,-118398010,-2145436136,939524124,-2036754127,-2097050497,1055297343,1845945983,-1714616808,-962625127,-536379642,-1721694525,-2147021594,3181761,-1944518656,828622534,1818674828,-862441114,-1944505498,-960248296,-835662797,956788760,-409177138,-1670132167,1942895079,-835065956,65510515,-1056465101,855651200,-137560058,62425,855670591,-2147405819,-510827572,-1738460946,1636178278,-1942002024,528481281,-1684409913,53687267,805516080,-1724316877,1611019160,1635260620,811630747,50727960,-960066559,-862441117,425967820,828622476,828886680,912706712,793371,33488902,1617141377,-1065318559,107154432,-261685241,1664125977,252149761,-1721638672,-866058599,204505857,1717569030,102265606,-2116446087,1614153368,113455296]},{"sector":10,"data":[507252531,-2038365949,16777264,-960459527,-963890817,828800102,862375064,-971471079,-2040434842,-1072135327,1942894855,-835065956,971480179,-409177138,-1670132167,204735463,519270156,2112237824,-1692847976,786432,805647104,124141056,1612591235,-102260865,-408977410,-2147414800,17176672,830708121,858784691,53686275,865644857,416047110,-954695888,-50794013,-65060994,1065352896,-942879585,-963896845,-828886685,-862441109,422785894,152,864248166,-1939750815,-863977024,202114659,-1944493984,419652400,-2147237759,57904897,-2045131168,235080752,1634100832,-1741617512,51954552,818700300,102631107,50541336,3180033,-1944517888,811648710,1718011644,-862441114,-2129054874,2034026136,63161315,956809240,-409177138,-1670132167,1942895079,-835065956,65510515,16813113,402654083,13369356,1548,855638016,5,1619004876,-255826378,-1073541316,103824624,408977433,-1718025978,-2031013754,411459864,-482834847,1611019032,1613764812,862374936,1673956377,-1060732879,202911840,422825164,828622476,829673112,828820632,15735011,1063649286,1614749190,16777267,104781952,1673578271,1043396848,8395038,-1067450368,-2122382589,-868222751,1717630464,-153132996,1010341889,1626538008,-54402969,1628964364,-2080831613,16777264,2122119405,-972279746,828793702,-507000936,2114883577,1640378392,-2133073529,1942894855,-835065956,971480179,-409177138,-1670132167]},{"sector":11,"data":[522126311,1048773056,15730432,-134021120,4128768,8731904,520093792,1014923393,255652032,1022410755,-18759361,-102260865,821598617,-2146994064,2021656440,-519062471,-259571716,-2028249040,-84612653,2023702141,524188796,-942896113,2096634083,-1911611586,-946921602,-255594269,96,3072,1966080,411041792,0,0,0,128,14696192,0,0,0,0,0,0,0,0,133227265,248,16777216,786680,0,1572870,0,3840,24,0,0,0,0,0,32,3,0,0,1610612736,14680320,-259849984,6,0,16777216,192,0,0,0,0,0,0,0,0,3670016,0,0,0,0,117440512,12583811,1986815304,0,0,0,0,1072742449,61632,1611006048,1042055967,393440,96,100663302,-2095120381,-121552900,536396039,-2128650112,1610614512,805355520,-1893769216,-121602289,2097022847,-478545408,-1912127492,2014310271,8188096,-59541264,116949279,-512124927,-1059029000,3194880,50331648,-54300682,1073505087,-478606208,243728892,2037894975,-1019216669,-66896132,116310279,-528902143,1623211872,6291462,1044480,-268431376,267386895]},{"sector":12,"data":[8084045,3,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":13,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":14,"data":[279886,131221,190350944,32772,0,0,0,0,4194352,9175104,9765013,1175,589824,0,0,0,-2147024892,1,5046272,5242904,68,-2146959360,3,6619136,-265289632,32809,12910592,-265289596,32810,21561344,-265289544,32811,0,1313818119,1380533332,1397576709,16722,738197504,1414418246,542328146,741355570,875312697,540680248,544435540,544107858,808528952,540160300,1952797480,691151648,0,0,0,2686979,99877120,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145740,327776,0,-1879048192,1,135331846,536873728,-1644142337,0,388096,0,1834221568,1834098803,2752622,138412288,1663565824,1866670121,1769109872,544499815,1919117645,1718580079,1866670196,539914354,892877105,1816207406,1769087084,1937008743,1936028192,1702261349,11876,0,3145738,458848,1,-1879048192,1,168886280,536874496,-1073716993,0,538624,0,1834221568,1834098803,2818158,192413952,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352]},{"sector":15,"data":[1702061426,1684371058,46,0,3145740,589920,2,-1879048192,1,185663498,536875008,-335519489,0,749568,0,1834221568,1834098803,110,0,0,99877120,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145740,327776,0,-1879048192,1,135331846,536873728,-1644142337,0,388096,0,145408,33554432,167773440,385880576,704651520,822095104,973092096,1140867328,1224754944,1358973952,1526748672,1694523392,1862298112,2030072832,-2130674176,-1962900480,-1728015872,-1493131776,-1258246656,-973030144,-721367552,-436151040,-268375296,-16713728,268503040,503388161,771827201,989934593,1258374145,1543590913,1778475777,1879141633,2046915329,-2080276735,-1895724799,-1711172607,-1576952063,-1375623167,-1274957567,-1123960319,-872299007,-670969343,-503194111,-368974079,-184422399,16907265,184681986,352456706,570563074,704783874,839003650,973223426,1107443202,1241662978,1375882754,1510102530,1644322306,1778542082,1912761858,2046981634,-2113765886,-1979546110,-1845326334,-1711106558,-1576886782,-1476221438,-1342002430,-1157450494,-956120574,-788345854,-570238462,-368909566,-167580414,-16581886,167970306,318967299,503519491,637739267,771959299,1023619843]},{"sector":16,"data":[1375946755,1577277187,1812161795,2047046403,-1945927421,-1677487101,-1409047549,-1190939645,-1023164925,-788281341,-519841533,-251401981,17037571,218367236,520361476,822355972,1040463876,1225016324,1392791044,1560565764,1795449348,1963225092,2130999812,-2029747196,-1929082364,-1778085884,-1576756220,-1375426556,-1174096892,-1006322172,-804992508,-603662844,-419110652,-502993916,-1004763886,-2145119970,-1945037312,820418871,941146112,-471784968,-470156815,1903413177,-130226301,-823660303,1857453036,12754159,-2147458880,808239424,0,32768,203555328,-1717986919,-1717986919,-1717986919,-1717986919,1484014744,404743624,-386727680,482357283,1125650435,1075364360,-1907834079,12837663,155501251,404651722,303963654,817942577,-1072950216,1368199364,1210056704,-500607592,-1729857276,554763284,-1626169248,304097449,419431443,559174194,253970729,1359218054,-2012737262,-2112880246,1388716068,-1995946686,1229210629,340345890,939982917,1888259171,-1011706620,-153341396,-993682036,-1726409951,-1717986919,-1717986919,-1717986919,244881817,624003,37792038,-1728572216,687945737,1679593800,-2059394944,604636290,-404232409,567163367,505323105,859184670,1673956377,555907427,112919126,-1476094960,524560,149035008,3670568,-703067632,-1626029538,-2079315698,944126099,-1711210484,31623476,971169800,540574448,2034387626,79818760,-2103342526,-2142760318,-1835785215,308759506,1234314313]},{"sector":17,"data":[1381339728,-2145367996,-1717987047,-1717986919,-1717986919,-1717986919,1600410776,-1641504576,145275535,420022305,1370034177,1352149538,176505505,33719315,268567042,556890500,555819297,-2012163786,1158947396,835065923,1516996996,-1020086563,432222220,1759229485,1056968869,35727636,687866896,-1527770607,251857033,-42139002,-2012737262,-2112876158,1183982116,-2012724926,-2076048351,-1845214910,604307520,1234079876,608801316,-1845216868,69805394,-1726414815,-1717986919,-1717986919,-1717986919,1419286937,1074365003,-2109701848,-1341980472,-2130507767,-750489270,-403441248,608083919,-2088533213,562303106,555819309,288825633,574916624,690321672,144986698,-1836838846,1234314313,-1843095260,-1606933175,1178080272,1081886,-868497888,830871575,421052448,-471792383,-473826831,2138299577,-532880765,-2084319759,1665533057,4231567,-865921017,-609849982,152089453,757255580,2213009,-1717987047,-1717986919,-1717986919,-1717986919,1202998936,-1138352120,11010560,-2012348168,268711944,110960782,1613764620,-406330397,971499495,509837006,505290270,1893785654,-1055122376,1942894919,-1942944069,-1288578202,432222220,-768324157,16416,16777232,1075839008,0,2097152,15728640,0,0,0,3670016,0,419430400,16064,786432,64,6168,35651584,34,0,0,0,67108864,-1073676288,16777247,240]}]],[[{"sector":1,"data":[3670024,0,0,50331648,128,0,0,0,0,0,234881024,0,0,512,-2144336896,544435540,7236946,0,0,0,138412288,1663565824,1866670121,1769109872,544499815,1919117645,1718580079,1866670196,539914354,892877105,1816207406,1769087084,1937008743,1936028192,1702261349,11876,0,3145738,458848,1,-1879048192,1,168886280,536874496,-1073716993,0,538624,0,145408,50331648,201328128,486544896,872425984,989869824,1157644032,1358974464,1476416768,1660967936,1895852544,2130737152,-1929345536,-1694460928,-1526685184,-1358911488,-1090471936,-754924032,-436151040,-117379328,167838208,503387137,687940353,989934337,1375815681,1677810689,2013359617,-2013167871,-1677618687,-1308513791,-1023296767,-889075967,-704524543,-503194623,-268310271,-50203135,117572353,352456194,486676738,671228930,973222658,1208107266,1409437442,1560434946,1778541570,2046981122,-2063433726,-1862104318,-1627220222,-1492999422,-1358779646,-1224559870,-1090340094,-956120318,-821900542,-687680766,-553460990,-419241214,-285021438,-150801662,-16581886,117637890,251857667,386077443,520297219,637739779,805513475,1040398083,1292060419,1493390083,1761829635,2013491203,-2046591997,-1878815741,-1643931389,-1459379453,-1207717629,-1056720125,-872167933,-553397501]},{"sector":2,"data":[-150738173,168033795,570693124,973352452,1409566212,1711561988,2013556484,-2046525180,-1845195772,-1576757244,-1241207804,-905658364,-570108924,-335224316,325124,335874565,637869317,872754437,1107639045,1342523653,1644517125,1845848069,2047177733,-2080014331,-1945794555,-1761243131,-1526358523,-1291473915,-1056589307,-872037115,-637152507,-402267899,-184160763,570817285,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,805502976,0,0,0,0,0,0,0,0,0,-2146631680,7,61443,0,57344,0,1046478896,23310339,16777408,857476224,3355488,209740039,-1340013810,109052160,811600902,1660945152,1618700,456351744,1694525891,1501966720,-2046753152,1610812470,1641590797,671482818,318767272,203296707,-940313604,128,-2097135752,1073740536,-1109930017,250592487,-405835513,1056766435,939293183,-270738279,103845614,402681856,125829894,14,805306368,0,1982883328,-286331154,-286331154,-286331154,-286331154,-2061597983,266363374,16810113,956303344,2031843,268873753,806358881,1803550728,50913286,-386711712,6500448,2143341592,811647117,29393969,409002191,-1023377383,-1933447040,2359507,-1060366336,-1741385668,-2140551584]},{"sector":3,"data":[428212536,8401792,-69685235,1149633636,369123440,481499495,1815511169,1610614464,-1044266868,-1738439027,406018124,126228675,865613838,1657146422,328741017,1208782104,24676044,2014854799,1945581004,-2015634122,-843906,-213978308,-603158919,-286331154,-286331154,-286331154,-286331154,2016419552,268460996,33587271,202114312,3801292,537833529,2098914,482345244,18661377,454431680,2147483389,807330749,-17271844,-102527169,-409094184,427286137,-941385223,2065178255,-2040457082,-1202065690,-2017205904,-1065550280,1626787187,-2114125044,-969931832,637559000,746979683,-865865479,419371227,1633852697,-1637777159,-134014961,84286403,865610902,952503350,562835480,-2130311507,13387404,-1725123815,865848686,-915642810,869689011,-1718200010,820761,-286331154,-286331154,-286331154,-286331154,1216132321,666919272,75471661,-1736505372,1614427744,1187427865,809943909,643826214,36069378,29762400,811713156,2081211288,-2096290098,221698144,-1039649831,-1591636944,1815524237,-865684519,-877515573,-871602586,-916180327,-647203143,547055027,-256900852,-962556653,641268739,1275266659,1734776845,100688064,-244862159,-1738440563,418584588,75898307,865609446,486280422,1099313176,50529197,17932,-1688095993,865848812,-647207226,868443827,446929718,394803,-286331154,-286331154,-286331154,-286331154,2033235169,744489982,1946400295,1024196804,1717952]},{"sector":4,"data":[-1234771140,1622568552,2146436991,125825031,17203184,1014558944,806142744,-2096257333,221698144,-1039649830,-1054831568,-470706035,1058967495,-537428520,-851548570,-647219557,-647219525,1083926963,418907904,-960440282,1174429696,2125663331,1623627981,419371200,432577281,-1738439027,406001740,616962243,865608518,1187777542,-2138886120,109249990,9772,-1687834087,865828108,-647207322,-1279181252,-1899688909,820833,-286331154,-286331154,-286331154,-286331154,-2077181727,666919216,67115808,164,669184,1052837376,-1002520304,-2129098623,-2004805496,420905752,811713156,806142872,-2096240952,221698144,-1039649828,-1054831568,1815518201,-865684519,411459865,-848927130,-1723062637,-647190981,-1058981453,-262077684,1148227395,1132683520,211722183,-943460232,1610614427,991739952,1073741048,-1108930594,-286311954,-410029809,2095509891,73532,-1882777146,9964,-113730545,-1281684020,-831756745,434570800,-993719053,820857,-286331154,-286331154,-286331154,-286331154,8298209,274751608,33587279,-2139160568,25836288,100855809,2030494241,-1019355965,-591184420,-202127555,2147483389,2141120445,-17276004,-102527169,2096161231,-473888993,-403459711,2067701711,-1897711474,-868452489,243778529,-806894789,-2139090529,1616904960,671088640,8388608,0,0,1,15872,0,0,0,0,14336]},{"sector":5,"data":[-268235250,0,1610643456,0,3640,939524096,3171840,0,0,0,0,4096,264266496,16777344,240,117452800,0,0,0,0,-1073741824,0,0,0,0,0,0,0,0,12,0,0,0,13099264,544435540,7236946,192413952,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775239737,1819033888,1734963744,544437352,1702061426,1684371058,46,0,3145740,589920,2,-1879048192,1,185663498,536875008,-335519489,0,749568,0,145408,50331648,234882816,570432000,1056977408,1224753920,1442860800,1677746176,1828743424,2030072064,-1996455680,-1728016128,-1459576576,-1191137024,-989806336,-771700480,-452928512,-50270976,352389632,755048449,1107376129,1543589633,1761698305,2114024449,-1727951615,-1325292031,-905855487,-587083007,-150869503,302122753,671227394,822226178,1057109506,1325549314,1610766082,1879205634,2080536578,-1929214974,-1794993918,-1593664254,-1241338622,-939344126,-687681278,-503128574,-217912574,100859650,369298947,637738499,939732483,1107508483,1275283203,1443057923,1610832643,1778607363,1946382083,2114156803,-2013035773,-1845261053,-1677486333,-1509711613,-1341936893,-1174162173,-1006387453,-838612733]},{"sector":6,"data":[-670838013,-536617725,-335289341,-50072573,285477123,553916676,872689156,1174682628,1476676356,1694785540,1946447620,-2130413308,-1828418812,-1627089148,-1459313660,-1073434364,-570110204,-217782780,218431492,654645765,1141191685,1510297349,1879401733,-2130347259,-1895463163,-1576692475,-1157255675,-721041403,-284827131,17167365,453381638,889595910,1258701062,1543918598,1812358150,2080797702,-1878621178,-1626958074,-1358518522,-1157187834,-989413626,-737752314,-435757818,-133763322,168231174,403115783,705110279,1007104775,1292321799,-1039706873,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16777216,0,0,0,0,402677760,15925255,7936,3145728,-1743161152,9986310,6303751,-218101992,12294,196614,213912816,0,50331648,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24576]},{"sector":7,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,0,0,0,1610618880,110002445,8401200,51118080,100715520,40473,1630220,-1899947936,0,17596417,805306520,196608,112247651,1610612832,-2046740468,-1325203216,993791104,805306368,1795,96,36952076,-1073542137,2105537,210501888,252059166,505298702,0,-2139103231,2059411216,2147386239,-403576701,-2115552113,126317504,-1056441151,-212924420,-418399037,970908559,1882748670,-1073670144,805309952,121045774,0,0,0,805306368,1944502368,-835065956,971480179,-409177138,-1670132167,1892563431,333710176,857672911,12640527,16253696,416153952,12584704,808452295,-1061133984,1073743968,1048578,-16769152,-1610615584,-813695245,-51183556,20854812,2088767472,-102703101,-807323332,-948733938,-1044379848,1676043910,402653376,2037148720,-532257890,1852190816,201366553,1636568332,11534734,255055884,1611045004,11276738,479330560,269361955,858989336,0,1619013891,-2043605960,813850928,-1017112436,8591622,415424992,806929200,-1849091901,-1023141759,286028036,-669489652,-1073741824,1610614272,50528262,0,16777216,128,1610612736,1939628384,-835065956,971480179,-409177138]},{"sector":8,"data":[-1670132167,1892563431,-517782016,3214470,6295568,263168,6488208,25169408,1617985741,-2141077280,-536863744,20447239,1476398784,-1939862493,1177584145,-2090733544,-2034167794,-2090782708,115546124,-2034233320,-2111754236,6327327,0,0,0,8388864,0,7168,0,6,-1694509044,-1073532903,812652742,204669184,1041629699,858981936,125829939,-1341312256,36899916,848310576,-1017116648,203526,811753905,405848856,-2130634557,1661471873,537279112,-1944493544,-596115456,-249809384,863233990,2037442414,2071338940,-805511431,1626922447,1929404512,-835065956,971480179,-409177138,-1670132167,1892563431,537052003,1838284,14731559,15862016,13000800,8392243,-969899827,415479905,805381728,38567945,-1728048288,207881222,103977089,-2124324840,-864022133,20144134,468061336,-2034233320,-1004523516,-1016869864,-1010580541,941153475,-600229832,-523337501,507279600,-415425521,-270747277,12117879,258342924,-1677236466,819468294,204669696,52825602,522061374,-518058496,271803328,12783494,1055928624,-1015087080,204550,808608154,405863448,-2130638852,1695549057,1073945736,1598256,-422838272,1713786412,1127428967,-1936182477,-1053137978,-1001599848,-1070495527,1929394272,-835065956,971480179,-409177138,-1670132167,1892563431,599943014,3342591,1734552364,1707000,8649987,9176627,-1238255923,-664400797]},{"sector":9,"data":[402801600,75939856,528556336,259784710,104788097,-513581032,-863989367,20144134,602279064,-2034233320,1746939908,1724304664,1717986918,1277978214,-867414964,835159905,591825944,1666096145,1724684337,1061670,100598028,-929510272,-33482746,204702479,54461196,53677107,14336,828818288,3345663,848310576,-1017103336,8591622,807035276,405848088,-2118057786,874513281,-2147407920,1598304,-969146368,1719584352,-483183770,-1944505549,1898996678,1754121880,1616957552,1929404512,-835065956,971480179,-409177138,-1670132167,1892563431,-536640666,3345456,-1058666196,15919899,15622400,25166387,1048255463,-104064522,-58196096,268427583,-104628232,207880198,103977089,-2124324840,-863972984,20144134,-1008333672,-2034233320,807415812,-513700833,-505290271,-60752159,-855835396,862358625,1673956377,1675009073,1674352689,10498374,365690880,1880660353,805312518,202506752,839267089,104008755,-518058496,-499317824,-2043573247,813850928,-1017112564,147003446,403595648,806928432,-2134828861,952107458,-2139012112,1597890,-993263616,1667288676,858993638,-2011614413,422592504,948422553,1623224536,1929404512,-835065956,971480179,-409177138,-1670132167,1892563431,280232807,920624,1610860583,1706752,0,8405555,101070336,421015564,113770649,-1878969792,409239564,-1939862493,1177584145,-2090770408,-2034143224,-2090782708,115546124,56696844]},{"sector":10,"data":[809506824,1717963800,1717986918,-1067163546,-859782976,862358625,1657047057,1743002673,-506685133,14729415,533463052,-602993149,805310466,504116832,470162495,471731230,125829939,125878528,2025905923,2029945727,-403574781,-101237352,126284736,-1056448319,-1073506335,411041916,-1044127391,9986558,2020999168,1883010616,-1682752665,-258163781,-264764480,822535118,1626874268,1929404512,-835065956,971480179,-409177138,-1670132167,1892563431,14730851,2296952,14684944,263168,64515,8438332,101482511,405814296,268206579,-133988384,1073659935,-1610616608,-813695245,-51122116,20852764,2088767472,-119218173,20889607,2021658608,-1279058628,-1280068685,2016984243,-294094728,969394033,1014558944,997727518,1894239901,4194438,67108864,0,8193,1568,0,0,1,8126464,0,0,0,0,0,1879048192,0,0,0,28864768,254,50331648,6291584,0,2016,0,805355521,49248,0,0,0,0,0,2,4063232,57359,16253696,0,939524144,0,0,0,0,0,57344,0,0,0,0,0,0,0,0,0,3670016,0,0,0,0,117440512,8389383]},{"sector":11,"data":[544435540,7236946,0,0,-268431376,267386895,1044480,-268431376,267386895,61440,-66911392,116391936,50334726,-872414980,1056964608,117440704,254,74842880,196736,805502976,254861327,-984863,268431375,-149946384,-411042591,-18382850,1073529663,125828291,-268431476,267386895,24113152,-125755400,1894809631,1665103879,-161267722,1006003007,-1019216669,-54312964,1073529663,-954204989,-54313058,1073529663,-1052774208,-287236370,811655198,24576,0,6,196608,192,12,0,0,0,0,-1073741824,0,0,0,0,0,0,0,16777216,156,0,0,-268435456,15728640,65295,0,0,63489,16128,0,7340032,14,0,117440512,939524288,12583174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,63495,0,0,0,0,201328128,917696,0,8306688,192,0,0,28672,0,0,0,0,0,0,0,0,0,0,0,57344,0,0,0,0,0,6291456]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[7952973,3,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":3,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":4,"data":[279886,131233,189692143,32772,0,0,0,0,4194350,9961536,10551457,1187,589824,0,0,0,-2147024892,1,5111808,5242911,80,-2146959360,4,7143424,-265289426,32769,26935296,-265289407,32770,47972352,-265289238,32771,80084992,-265289246,32772,0,1313818119,1380533332,1297043973,20033,704643072,1414418246,542328146,1414418243,1330990665,1129534293,1313426497,540680263,1634561874,1395138670,589329509,10545,1918979328,776216683,2036421664,7499628,65540,315883776,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1879048192,65281,319881248,536879360,24190,0,128256,0,1867644928,7233901,16777218,5121,539575080,2037411651,1751607666,1766662260,1936683619,544499311,892877105,0,0,0,0,0,0,0,0,2359297,196610,262169,65538,-16674816,2097152,553653009,1585324032,0,-184549376,1,0,1634561874,196718,513212672,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624]},{"sector":5,"data":[0,0,0,0,0,0,65536,131108,1638403,131076,-1140850688,65282,319881248,536879616,24190,0,128256,0,1867644928,7233901,16777220,7703,539575080,2037411651,1751607666,1766662260,1936683619,544499311,892877105,0,0,0,0,0,0,0,0,2359297,196610,262169,65538,-16598016,2097152,587207697,1585324032,0,-184549376,1,0,1634561874,1632436334,1142975346,315883776,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1879048192,65281,319881248,536879360,24190,0,128256,0,130048,268435456,167772160,268442368,352333568,335561472,402690816,419483648,167849728,234962432,234972160,268536320,436312320,167879424,436318720,167884544,369213952,335660800,335680512,335685376,335707392,335730432,335736064,335754752,335778560,335793152,335823872,168075520,168081152,402968832,436525056,402973184,302311680,453322240,335909376,369471488,352715776,369508864,352745984,335978496,386318848,403115264,185022976,252136960,369586944,302489600,419936256,386394624]},{"sector":6,"data":[369626368,369648128,369661696,369693184,336160000,319399680,403292928,336194816,403310080,336211456,352997632,336229120,235572992,235578112,235579392,369802240,707072,168479232,336255232,353051392,319512576,353080832,319543296,218895104,319568640,369929472,185392640,185400576,353184512,185423872,554527744,369998336,336456448,353251328,336491008,286174976,286185472,252646912,370094848,302998528,403668224,336569600,319801344,303034112,235932416,135288832,235953408,403745280,1103872,1836012032,28257,-16513664,17563906,-2130771980,100663808,-16056192,16843009,-2130706433,134153220,-17235328,-116817913,41945087,-2146959623,486081547,-102494848,-268795876,-243269618,-2147480058,486539272,14877824,-368803811,16843263,-16711935,-131330,33358076,33555198,16843265,33947906,33685762,49803904,100729346,16843266,131329,-50135548,-50267135,16711423,33489407,-2147352831,367920149,48956800,-16646142,-33423870,16711168,50201086,33555199,50397953,50266880,251429119,50266622,33686016,-16646142,-33489407,16711422,-15985280,16843009,-65281,-16711681,-33358079,-33292795,-50201086,-768,33358078,50071294,16646654,-16842754,-16646401,16908290,84083203,50463239,16777473,-2130771713,-130319,-50266369,-33358335,33161344,34277378,-2147417598,-63995]},{"sector":7,"data":[16908033,50266624,192938495,-33358336,-16450045,17039365,33817093,-2147352061,83813118,100598783,83952640,67240705,33555328,33751554,327940,-33161468,-33292796,-503152638,50398210,67110145,67044863,142607614,-2146697212,101382139,-151388032,118325254,-142601728,-2147478793,-59131,16908033,50266624,75497983,-2147479024,33494789,-16711423,343998463,-2145325568,33358857,100598782,83952384,16974594,-16580606,-83755774,-67109632,-131586,8388862,-16646656,-16580863,16973829,16908549,-2147417599,-16646142,-33423615,-50267391,-16778241,-65537,34080384,16581631,-318799851,-58715136,-2147481344,16844804,-65025,-33423616,-16515327,16973828,33620225,50266624,50004733,50201086,50332671,48957824,16843009,-16646142,-66913022,133922818,196353,197125,-16646398,83948928,16778243,16646655,134512894,33489153,-16711681,-16646655,327427,33620227,50266880,16581117,49742720,131329,-33358077,32769,33685762,50332161,33489663,16515581,-3,-16711937,16908033,192938495,197114,-16580861,-2147353087,318768652,15401344,-352288747,1052661,117897088,67469312,8391422,66978304,50332671,16908801,-16646141,-50135549,-50266879,-1,33489150,-16711169,-167280639,33685762,33555201,50201599,-92274178,-2147480853,328182]},{"sector":8,"data":[260112133,16908039,16711937,-16842753,-50266625,-16581119,327426,33751302,33620738,50266880,16581118,-16908289,-514,-33424128,-2147221758,33485318,50266878,100664575,33686273,41943298,50266624,16581118,-16908289,-2130706690,100664323,33423488,50201342,33752320,33489152,49512702,196354,75497989,-16580355,-16385021,261890,-251232251,50267643,83887103,-50067328,196353,50462979,50332673,16646655,-33619971,-2147418881,33423360,50332415,16908801,33555584,16646655,-16842755,167543039,33489405,67109631,16843265,262403,-16646397,-67043839,-257,-58654723,-16646656,196353,16908548,-2147417599,-16646140,-33423615,-16778240,-65537,-16052096,-50135549,-50266367,-65793,33489149,66978557,50332415,16908801,-16383997,-33358076,-50201342,-512,33489150,-16711169,-83591167,-16842754,-16712193,-33358591,42008322,33620480,196866,-16449786,-33358334,184909825,16843263,-255,-15990656,16843009,-2130706433,33491717,-16711423,8454143,33554190,66047,-16580862,118784001,152046064,302843008,116293632,75497490,-267841529,134512649,33489153,-16711681,-16646655,261890,16843011,33554945,33489663,50332412,49414528,16843009,-16646142,-2147287550,33491454,-16711423,310444031,-16842996,-33489409,-16646399]},{"sector":9,"data":[16973827,50397698,33489408,-117735170,67044094,33620736,125829377,589813,33620482,33423872,-130819,-16842755,-33554690,-50266625,-33423871,-16580862,16973827,33685763,50397698,50332417,33489663,-201424641,33556735,176161025,-2146043644,352840455,116324736,-84574190,-209715191,-2147482106,393222,263552,-352223211,-58714880,50334955,16843009,-16646142,-50200830,-167739391,16843010,33554945,33489663,-125828610,50333696,16843009,-16580606,-50200830,-2147421183,16971020,33620225,50266880,33423871,17240448,-393213,-33620477,-50266369,-16581119,261890,16974085,50463234,50332161,33424127,-252149506,50201086,67044095,50398464,33686017,92274946,-2146107388,352381697,183237760,33620736,16908546,-16449533,-33358077,-167641854,-351633408,33685762,50397697,67044608,50201343,92275198,-2146107388,352381697,15795840,-218726392,100663312,-176096513,-2147482102,1051638,117438976,263552,-352223211,109057280,-2146959119,1110774,-83950080,101381504,200704000,293601287,196871,-33292294,-16777730,-33424128,-16580862,17104899,33685763,33620738,50266880,-285638402,50201086,67044095,50398464,33686017,125829378,-2146959112,134281217,133758080,67469312,25171200,-2146107157,352381708,15401344,-336625643,109051911,-2147481856,789232,118222976]},{"sector":10,"data":[425984,92274695,-2146107388,352381697,132906112,368672768,176160775,-15663100,-33423869,-512,33423614,-16711169,-284786687,67047680,-8388097,-2147481621,352322565,15401344,-351436779,92278259,-2146694916,201913591,132903040,425984,-310378490,-2147481835,393222,263552,-352223211,-58714880,-2147481621,988665,117438976,263552,-352223211,-109047290,-2146105362,368700167,15402880,-352223211,-293595904,-2147482389,262157,102099840,557056,92274695,-2146107388,319613697,217052288,-352288749,-260041472,-2147482389,393225,102100352,67796992,50201085,83821311,67175168,33686017,131331,-33358077,-66978303,-50332416,-16843009,16711677,-33554304,-16581119,327426,17039619,33686018,163841,-33358078,-66978303,-50332416,-16843009,92340222,-2146107388,352381697,216792192,16843520,131329,-16580861,-134087423,-183992320,16843010,50332161,33489663,-192937474,-2147481846,33358858,50266878,50332927,33620993,16974338,-16580606,-33423870,-50267135,-16777985,-131330,8388862,-33423872,-16580862,16973828,33685764,-2147417598,-16646142,-33423870,-50267135,-16777985,-65794,1309568,50201087,33554943,16908545,33620231,16646400,-67403521,33620993,65793,92339969,-2146107388,352381697,216792192,16843520,131329,-16580862,-134087423,-167215104]},{"sector":11,"data":[16843010,33554945,33489663,-192937474,-2147481845,16971010,117637377,65793,-108986623,33686008,33620231,16646400,118522111,100728065,-16843265,16646141,50201085,33620480,16908545,16908806,-226491902,33686263,33687041,16843009,-33292286,-50201342,-16777984,16646142,-2130902778,352322569,15401344,-335970283,-100661505,100663311,-159319297,-2147481835,251659269,33686273,131331,-33358077,-251593471,62336,33751311,-2147417598,519159,100665216,67338240,-92269305,-2146302229,368700935,116127616,425984,75497478,-2146106364,268692477,-51379072,-352026603,-41937660,-2146434069,368898052,132903296,622592,58720262,-2146104060,353233908,-219479936,-335642603,109051910,-2147482112,398830,100664960,67338240,167774983,132905600,-2146828277,200928007,116782720,491520,-209715194,-2147481835,368247824,-202699136,-352288747,-100661505,-226492402,3605,-2147024902,536870916,14680448,-520126432,-109051897,-2147481824,403571712,2432,-536772576,-109043712,-2147481632,467193,135398272,-2147153669,-66584336,109052936,-16646396,16908290,-65279,218464511,16711936,-16646400,327426,16843010,117441025,16843265,16055680,33685769,-2147483391,33552124,33358330,33555199,16974337,-16646141,-108986878,-16646405,16908290,-2147417598,352322565,15401344,-184516587,-16581118]},{"sector":12,"data":[16973826,50397698,67043840,33358590,-130818,109117182,33620725,196866,-33292542,-2147353086,322550,-15855744,16843009,-16842497,-33554690,-33424128,261890,33751298,33620738,50266880,-168197890,50201086,33555455,33686273,260047106,-2146107388,352381697,-17432704,-16777474,-33424128,261890,33751298,33620738,50266624,-168132354,50201086,33555455,33686273,58720514,-2147482389,267775,202441856,-131072,-16777218,-50266625,-16581119,16908291,50463235,50332161,-2130836737,-50267137,-75432193,-33423617,261890,33751298,-2147417598,33490186,-16711423,-256,33423614,301990655,-1375360,196353,-218333166,-125829112,-2147481842,33426184,50266623,33620480,16908545,-16646142,-33423615,-16777728,-65537,-25165570,196353,-2147352316,-33488890,-16778240,16843136,16712447,-2147418623,33490935,16777983,16974337,16973829,-209714943,50397691,50332929,131329,-50135295,-50267647,16711679,66978303,67469567,25171200,-2146107157,-33360640,196355,33620227,-58717440,16843506,-2146762750,322546,118881408,294912,92274695,16908036,-65279,117473535,25169408,-2146565902,324348,118422656,67534848,16843263,-255,459136,-33358062,-16712191,33489151,-16711169,-335249407,50270720,-8388097,-2147482389,352322565,15401344]},{"sector":13,"data":[-234192875,92277494,-2146957572,134674681,82571904,117932032,-276824058,-2147481842,393220,263552,-352223211,-58714880,-2147482389,464380,722304,-234782706,8392192,66978549,50332415,131329,-218333173,33620226,25168640,66978549,50332415,131329,-218333173,33620226,-411038976,-2147482382,462588,117441664,294912,92274695,-2146566133,234942977,49610880,50267134,16843520,-2146762750,16970492,184549889,83030656,251428864,75497479,-2147481856,33360649,67044094,50397696,16974338,-16580606,-50201086,-33554944,-131330,8388862,-33423872,261890,33751298,-2147417598,-16646142,-50201086,-33554944,-65794,722304,-352223211,8393984,50201326,50332415,16908801,-16646141,-50135549,-33489407,-2130772225,16971014,50397698,67043840,33424126,83031680,368869376,260046855,-2146107381,352381697,-17891456,-16777474,-33424128,261890,33751298,33620738,50266624,-168132354,50201086,33555455,33686273,58720514,-2147481849,234883845,15860096,-134184946,-33358591,261890,16777473,-65025,-192872703,-2147482369,462588,17632640,-16514818,-16777218,-33489665,130817,33620226,33686785,-2147417855,16906741,33882370,16843010,33489664,16515582,-2,67174143,92339713,17891332,33620483,33489408,-285638402,50401536,-92274431,-2147481358]},{"sector":14,"data":[184552197,16974337,-16580606,-159318526,17498357,-2147417598,234942983,15860096,-219054066,125829124,-2147482624,265983,101385088,-218398706,109054981,-2146501900,455416,100664448,184844288,-41939452,-2146761742,251458820,82969728,-218267634,75500291,-2146501387,520945,100665728,184844288,-159379957,-2146563086,250933760,116588160,294912,-260046842,-2147482098,393220,101385344,-218398706,109054981,-32572684,-33358332,-16711935,33489407,-318865407,75497478,-2147482112,250940174,-168686464,-234848242,-67107585,-192937972,3086,-2147155972,33423369,50266623,33620480,33620225,50201088,-917120,16908290,16843010,-16646142,67304450,131330,-16580862,196353,-2147352318,33747711,50266624,50266623,33620480,16908545,1152,360480,16843010,33554945,33489663,33555199,-8388094,131570,-16580862,196353,67240194,-16581630,16908290,16843010,-16646142,-234782718,33555198,16843265,33554945,33489663,58720766,33423379,50266877,67174912,33620483,33489408,49185022,-16581119,16908290,16909060,-16646142,-33489663,1802658125,539903008,1819894100,335610112,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076]},{"sector":15,"data":[-1879048191,65281,319881248,536879360,24190,0,128256,0,130048,268435456,167772160,268442368,352333568,335561472,402690816,419483648,134295296,234961152,234970880,268535040,436311040,167878144,436317440,167883264,369212672,335659520,335679232,335684096,335706112,335729152,335734784,335753472,335777280,335791872,335822592,168074240,168079872,235195392,436523776,235199744,302310400,453320960,335908096,403024640,352712448,386283776,386298112,369530624,369539328,436668672,218576384,302467584,386363648,336043520,453490176,419948544,369625856,386423808,369659136,403243520,386486016,352948992,420065024,336190720,436860416,369761792,352993536,369779456,235568896,235574016,235575296,369798144,702976,168475136,353028352,319492864,302732800,353076736,302765312,252446464,336349696,353147904,218944768,218957312,336413440,202211584,554541568,386794496,302926336,353273600,336516608,286200576,286213120,235895296,386898688,336584960,487592704,336617728,353415424,336658176,236009472,135365888,236030464,403822336,1180928,1836012032,28257,-16513664,17563906,-2130771980,100663808,-16056192,16843009,-2130706433,134153220,-17235328,-116817913,41945087,-2146959623,486081547,-102494848,-268795876,-243269618,-2147480058,486539272,14877824,-368803811,16843263]},{"sector":16,"data":[-16711935,-131330,33358076,33555198,16843265,33947906,33685762,49803904,100729346,16843266,131329,-50135548,-50267135,16711423,33489407,-2147352831,367920149,48956800,-16646142,-33423870,16711168,50201086,33555199,50397953,50266880,251429119,50266622,33686016,-16646142,-33489407,16711422,-15985280,16843009,-65281,-16711681,-33358079,-33292795,-50201086,-768,33358078,50071294,16646654,-16842754,-16646401,16908290,84083203,50463239,16777473,-2130771713,-130319,-50266369,-33358335,33161344,34277378,-2147417598,134153220,-17235328,753671,66978558,100599038,83952640,50463746,-25165310,-16449822,392963,17105156,-2147220989,33685507,67240706,67110145,83756543,50201598,48366208,16974084,-16515067,-33292539,67665924,-75494400,-2147087625,116849152,462208,-134774766,92274706,33554201,66047,-16580862,268730369,92274706,16908055,-65279,1343743,159391982,-33424124,392963,33882371,33620739,50266880,16450045,-17039363,-16777731,32768,33489406,100598527,83952384,16843265,41943298,33489408,33423871,-196357,-65541,-2130706689,-16644090,352386307,15531904,16547860,75497481,-16711416,16776961,33423871,83821567,16843520,131329,-50135294,-33359102,-16581119,-2147287037,16968457,33620225]},{"sector":17,"data":[50266624,50070269,17300352,83886847,33555202,-2130771457,50659573,-16711676,-33489407,17302656,-16646399,33489151,67043838,50332927,131329,-50135293,-2147418879,16971523,50332161,33424127,33554560,16908801,-16580606,-50200830,-50267135,-1,33489150,-16711169,-99909631,50332417,33489663,209715710,-2146238458,352381697,-169148288,-2147479537,460535,-33290880,32778,-16515582,16973827,50397698,67043840,33358590,-196355,-16777217,-16646400,33489153,49678208,16908801,-16646141,-33358333,-335904767,-159383542,83887361,118456575,16843263,-16711935,-65793,33358077,50266878,100664575,33686273,131331,-33358077,-16712447,-16843265,16777213,50201085,109052927,-33423630,-16580862,17170436,33686019,163841,-33358078,-16712447,-16843265,58785790,-2147090428,-33423872,196098,131845,-33423615,33747840,83886847,-50036734,67044096,50267644,83887103,-68090240,-16580859,-2147155965,33358856,50332415,16974337,-16580604,-50266623,-131329,8388860,-16646656,16973826,-2147417598,-16646140,-50266623,-65793,-49677184,-16646399,17039362,50397442,50332673,33489407,-261890,-33554434,16548095,33489406,67109631,16843265,75497730,33489408,16646655,-65540,-2130706689,67046160,33358590,-196353,-33554690,-50200832]}],[{"sector":1,"data":[-16515582,16973826,50397698,83822080,50201343,16581117,-16777218,-16646400,33489153,-17103744,-65793,33489149,50201341,164095,33685762,100664065,50267391,33424126,-16054912,16843009,-2130706433,33491968,-16711423,92340223,16908043,-65279,234914047,-16646145,33554689,33489663,-117437824,-2146433264,1182980,302444160,294912,284758023,17302656,-16646399,33489151,50266622,50332671,16843009,-16646142,-66978046,-2147287038,16970241,33620225,50266624,-25165058,16908041,-65279,202539263,-65793,33423613,67043839,33620736,196866,-33423614,-17237120,261890,16908547,-184057855,33556735,131330,-50201086,-33554944,-16843009,-131074,33358077,50201086,67044095,50397952,33686017,16974082,-16580605,-16646398,-786816,16908296,67993601,226498035,-2146106901,318893566,167442304,116490240,109051910,-2147482112,368706569,-85260416,-352157675,16973835,33554945,33489919,25166333,16843510,-16646142,-33423613,16220161,16908297,33554945,50201599,15991292,32837760,131329,-33292542,-2147353342,67090,117440001,-16777728,-65537,33358077,66978558,83821567,50397952,16974081,-16646141,-33423870,-17761152,-33358335,-16515325,16973828,33620227,67731457,125834746,-2146043157,649986,16843011,67109633,83756287]},{"sector":2,"data":[33424126,16187900,48959360,16843009,-16515069,-33227260,-50201086,67731457,125834746,-2146043157,150925578,267582080,458496,183730426,-209715194,33558283,-2147090949,368706569,-85260416,-250970091,-92272386,-16773134,-2131099642,396019,118223744,101875712,-33488895,-33552641,-257,16646142,50201085,67044350,50332927,16843521,131331,-33358077,-75432958,-33423630,-16515582,327427,16974083,-2147417599,-16646142,-66912766,117505408,67731456,125834746,-2146043157,368765714,-85260416,-336232427,109051911,-2147481856,789229,118222208,425984,159383559,-2146043388,368765703,132842112,368279552,260046855,-15598844,-33423614,-33489407,16711679,33489406,-2147352831,301723404,50201343,132842880,67731456,125834746,-2146043157,233827091,83625856,-184844276,-159380476,-2147481621,393222,118876032,425984,159383558,-2146043388,368765703,132842112,368279552,-100532209,159385341,-2146043388,352447238,32178304,-317947885,226498035,-2146043157,368765703,82572416,884736,-444596220,-2147482091,458760,-100398720,-351895531,-109047289,-2146301967,368765702,65795712,688128,-411041786,-2147482091,33358860,66978558,83821567,50397952,16908545,-16580605,-50135550,-66978559,-33555200,-65537,8388861,-33423872,-16515582,327427,33751299,229378,-33358078,-50201342]},{"sector":3,"data":[-50267135,-16843265,-100398720,-351829995,41948666,50334955,131329,-33292542,-134087678,-183795712,33620226,67043840,33358590,118157696,67928064,50201085,67044350,50332927,16843521,196866,-33358077,-50201342,-50267135,-513,16646142,-33554304,-33358335,-16515325,16973828,-2147352061,-16646141,-50135550,-66978559,-33555200,-159318274,33488915,33489662,16843264,17235970,16777729,-2130771714,100793340,65793,159448833,-2146043388,368765703,199950976,16843520,-16646142,-50200829,-2147420415,16971274,33554945,33489919,-58719746,16843264,17301761,16777729,-2130771714,117635835,65793,-327090431,-2147481854,67091,117440001,-16777728,-131073,33358076,33555198,16843265,33686535,49804672,17041154,131329,-16580861,-66978559,-768,16711679,17235966,-2147483138,368706573,-85260416,-335577067,-100530435,117374991,-259982848,-2147481835,201131016,50332927,16974337,-16580604,-50201086,-209653500,-15991552,16973828,-2147417598,519165,100665216,67534848,8393985,-2146237973,368307468,116129152,425984,142606342,-2146042364,335473411,-152237696,-351633387,58725886,-2146173205,368504073,132904832,622592,125829126,-2146105596,352840698,-320141696,-352026603,109051910,-2147482112,398824,100664960,67534848,201132548,82509952,-2146697974,183954189]},{"sector":4,"data":[116849024,491520,-310378490,-2147481835,367854612,-303360896,-351895531,-100530435,-327155698,33558037,-2147025414,536870916,14680448,-520126432,-109051897,-2147481824,403571712,2432,-536772576,-109043712,-2147481632,467193,135398272,-2147153669,-66584336,109052936,-16646396,16908290,-65279,185630975,83822590,16843264,-33423357,-41878015,-16253194,16908292,-100696063,-33555200,16711678,66978301,50332671,16843265,131330,-50135294,-75432703,-33423623,261891,-2147352316,234619912,50397952,58720513,-2146566932,-50266112,-16581118,16908290,33620225,67044096,33358846,-130818,-67043841,33229184,-16515070,-33292797,-335839231,243269636,16842766,-65536,-33554690,-33424128,261891,16908547,33620481,50266880,-151289603,66978302,67109887,310379009,-15795196,16908292,33555201,-2130836994,251457535,33555711,-8388351,-196359,-16777475,-33424128,261891,16908547,33620481,50266624,-2130902531,33487355,67044350,33620992,82578048,335839232,-16515324,-33423869,-65793,33358077,67044350,33620736,16908545,-16580606,-75432446,-33423627,261891,-2147352316,33490191,-16711423,-256,33423614,50266623,251462655,50267391,-18544000,-16580862,-16122364,-16515324,-33423614,-16712191,33489151,-16711169,-335183871,293601290,-15795189,-50070013]},{"sector":5,"data":[-33489663,16777215,33489407,-2147352831,251456782,66978815,125829630,-196366,-16777475,-33424128,261891,16908547,33620481,50266624,-2130902531,33487355,67044350,33620992,-100398976,-351829995,41948666,50070265,50266878,16843264,-33423359,16973830,-218202111,33554946,50333438,196865,-33423870,82833792,67731456,16843263,-255,17561728,66978558,65792,458243,-2147417853,16904959,117310208,16843520,-33423357,176225793,16908036,-65279,200835327,-33358335,16842755,184353536,50267135,33423871,-65282,-16646400,33489153,32245888,-50135039,-16515318,-2147287550,368706568,-85260416,-217219051,16843263,-16711935,16777215,83624446,16646654,33555072,17170945,-117735423,100794625,131329,-50135294,82834560,67665920,83824380,16843264,-33423357,-8323583,-15794961,16908292,-352288767,25165828,50200847,16778238,-16646143,-2146959868,16904705,83821056,58722302,50070265,50266878,16843264,-50200575,-234848246,33554946,58723069,50070265,50266878,16843264,-33423359,16973830,-218202111,33554946,50333438,196865,-33423870,17760640,66978558,65792,-33227006,-234782713,33554689,134087935,49873792,50201340,33555199,65793,458242,-2147417853,33747710,117309952,16843520,-33423357,159448577,-33424117,261891]},{"sector":6,"data":[16908547,33620481,50266880,16581117,-65539,-16777473,32768,66978302,67109887,75497985,50266625,16581117,-2130771972,-33485055,261634,33554689,251397375,32179072,-16646143,-2146501628,-50204155,-16581374,16908290,33620225,67044096,33358846,-130818,-50266625,33163648,-16515070,-33292797,133398529,276824071,-2146043381,368765703,15860608,-16908291,-50266369,-16515583,16973827,33620226,33554945,33358591,-100957955,66978302,67109887,41943553,-2147481848,-33485055,261634,33554689,134087935,32637312,-16646143,-2146959868,-66914045,-16581118,16842754,33489152,-16646145,855680,257,-33554433,-50266625,130817,117506306,-2147417852,16906743,16843783,33489664,16581117,-3,130816,159383808,-15795196,16908292,33555201,-2130836994,251457535,33555711,-41942783,-2147481102,-33485055,261634,50331905,33556222,-25165310,66034,458243,33620226,33554945,50201343,-117276420,83822590,16843264,-33423357,-41878015,-16253194,16908292,251756545,-33358335,16842755,117310208,33686016,32702080,-33357823,16908294,16843265,50266880,33358590,-261892,-2147352320,-33485055,261634,50331905,33556222,-25165310,66034,458243,33620226,33554945,33424127,-150830850,50334206,16908545,-16646142,-33423870,-83821567]},{"sector":7,"data":[33620223,-16844672,33751049,251887618,-16581374,33619971,-25165056,131579,-16449789,-33358334,-16711935,33489151,-16711169,-66682879,33620736,-16646141,8453378,16908279,16711937,-1,-33423872,-16580862,16973828,251756546,-33358335,16842755,117310208,33686016,32702080,-33357823,16908294,33620481,50266624,-2130967810,251459843,66978815,16581117,-2,-16646400,33489153,-51573120,-33292530,-2147353085,50268945,116916990,50266878,32899456,66978558,-2147351552,-16645897,17039363,-192937982,67109386,33555201,16220415,197124,-33423870,-33552000,-16646399,16908290,16843010,-33423358,-234782718,33555199,16843265,33554945,50070271,33620484,50266624,50266623,33620480,49479552,-16646142,-16646398,16908290,33620226,294913,92282880,16843264,131329,-16580862,196353,-2147352062,33682175,50266624,50266623,33620480,50070020,33555199,16843265,33554945,25166591,196338,16908546,131329,-16580862,-2147353087,-33549565,-16581375,16908290,16909060,-16646142,-293536255,50200834,33555199,33752065,33554945,16581119,1918979582,776216683,2036421664,7499628,513212672,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624]},{"sector":8,"data":[65536,131108,1638403,131076,-1140850688,65282,319881248,536879616,24190,0,128256,0,130048,268435456,184549376,302005760,352347136,335575040,402711296,436281344,184658944,235001856,235014912,268582400,419595008,184721152,419613440,184736000,386070272,335742208,335766528,335778560,335808512,335845376,335857408,335883776,335917568,335937792,335975680,185014528,185029888,403152640,419931648,403161600,319277312,453520128,336107264,369677056,352935424,369730816,352981760,336240384,386602240,403407616,202115584,269241088,369925120,302845696,437085696,403558144,370020352,370046720,370073088,370110464,336592384,336614144,403747328,336658688,403782144,336697088,370274560,336740864,236095232,236100352,236101632,370324480,1229312,185778688,336784896,353588224,320055808,353626880,320096512,236230144,320134400,387286272,202765568,219561472,370575360,202829312,571941376,387436032,337133056,353932544,337182720,286876416,286895616,253361920,387589888,303723264,404399872,337310464,320553728,303794432,236703232,136059648,236724224,404516096,1874688,1836012032,28257,-16513664,16908289,-184516600,69120,32702336,-2146566144,16904704,150929920,-16253056,16842753,16777473,-65281,-2147418113,16777472,-16777215,92274943,130820]},{"sector":9,"data":[-100564986,25167615,-33488391,-116752378,100663807,-392832,-117342202,117309697,-117437568,-535986144,-92266247,-2147479827,919281,2176,-486244323,75504896,-65300,33685504,-131072,-33554434,-50266881,196097,50462979,33687042,131329,-2147287293,33682165,33947906,33620226,-789120,16908290,100729346,16909058,-16580606,-50200830,-50267135,-1,50200830,-16646144,-2130771968,367920149,48956800,-16646142,-33423870,16711168,50201086,33555199,50397953,50266880,251429119,50266622,33686016,-16646142,-33489407,16711422,857728,65535,514,-2,-16646400,-33161726,-33358333,-33489919,16711679,117309949,33424124,-130818,-16777474,196353,33751299,50660355,33620483,16646400,49250559,-50266369,-16646655,33228416,33587452,-58655489,-2147156224,50463489,50529540,-176160510,-511,33358078,-2130967298,67238653,84149251,16909059,-16711679,-16382080,-16711935,33489151,16777727,-16580607,-2147353086,16841217,-16777215,25166079,-2147417854,83885568,-33551744,-33292798,392964,33882372,33751556,-419659774,83821567,67175936,41943809,-16580632,458499,17170694,-2147352317,33685508,67240706,67110145,83756543,50201598,31851648,262403,-16449786,-385974269,50397697,100664833,67045119,142607103,33685252]},{"sector":10,"data":[-2147352822,201389056,32768128,17497601,-134512639,101187585,-159383551,-2147087622,16841462,16778250,-393088,-16320512,-99975168,176162550,-167706374,-2147418108,285214476,-8388607,495,-134774767,16777233,16772992,-2147479295,33495047,-65281,-16646400,16842753,50266880,25166334,16843002,-65536,33652736,8388865,-2147155970,1117956,-276823808,285278463,369459200,16777727,65793,-16711935,16777215,65664,257,-2147418113,552468500,293601281,-301989408,67731488,66978301,50333183,50464001,131331,-50135293,-50267391,-33620993,16711677,-16581248,327426,17039621,557058,-66978303,-50332928,-75432193,-16646402,392962,17105157,-2147417598,-16646142,-83755519,-67110144,-65793,395648,-318668781,25170432,-2146107156,66972416,-8388098,-2147481071,33488890,-130432,-33325054,-8388095,-2147417345,16779268,-16777215,8388863,16777727,-16711679,-16711935,33489151,67043838,50332927,16843009,-16646142,-83690238,-33423870,261890,-317947901,33554945,-41942273,16843512,-16646141,-66912766,133922818,196353,262405,-176095486,67241216,-2130771712,50724854,-16711676,-33489407,525440,257,-2147418113,130816,16777473,16712191,-16711681,-16646655,327427,33620227,50266880,41943549,131576,-2147287293,16972029]},{"sector":11,"data":[50332161,33424127,50396800,33620480,131330,-16580861,-66978559,-768,16711679,33489407,65792,-16646399,-99909632,50332161,-58719489,16843510,196865,-33292541,-67600383,65792,16776960,461696,-318668782,25170432,-2146107156,267774720,-159383536,-2147481594,33488891,-130432,-33325054,-8388095,-2147417345,184419333,-16515582,16973827,50397698,67043840,33358590,-196355,-16777217,-16646400,16842753,33489152,192938239,131576,-2147287292,16971260,50397441,67044352,33423871,16513408,257,-2147418113,716801,134346368,33062912,-16515068,243334914,16842759,-65536,-16678912,33489151,16843008,-16711679,-16777472,16646142,50201085,83821311,50398720,16974338,-16580606,-50201086,-33554688,-131330,33423614,50266623,-589440,327426,16974086,-16154623,-50266623,-75432193,-16646411,-16580863,17235972,33685763,163841,-16646398,-50266879,-513,58785790,-2147090428,50395662,100402175,83821311,25166848,-16580617,-2147221501,100397319,67044350,132096,32504192,50201342,33752320,33489152,49578238,196353,-109051646,50266370,83886847,67665921,50266621,33620736,262403,-33423613,-16777984,16580605,-16646528,16973826,557058,-50266623,-92209409,-16646145,16973826,-2147417854,-16711676,-50266623]},{"sector":12,"data":[-257,-49677184,-16646399,17039362,50397442,50332673,33489407,-261890,-33554434,49905919,67109631,176161281,16646400,-2130771972,33488633,67109887,16909057,33555584,16581119,-16908292,352682239,65792,16776960,-521600,-33423614,-50266623,-65793,33489149,66978557,50332415,16908801,-16383997,-33358076,-50201342,-512,33489150,16777727,-16711679,-2147418367,-16779520,-33424128,33491328,196865,-16449786,-67403774,-2,-50266625,-16646911,42008322,16843264,196866,-16449785,-33423614,184909825,16777727,65793,-16711935,16777215,65664,257,-2147418113,33491456,16843008,-16711679,-256,8388863,16842753,-65536,184909824,16777727,65793,-16711935,16777215,65664,257,-2147418113,33491970,-65281,-16646400,16842753,50266880,25166334,16843002,-65536,33652736,8388865,-2147155970,166725396,75499792,4363,-1081343,1114368,285732736,-2147418112,16842735,75497489,-267841529,151289865,130816,16646656,-33423872,-16580863,16973828,33620225,50266624,50070015,32965760,-16515071,-117604351,33620226,50267136,-41942529,16973825,-196608,117473280,16777727,65793,-16711935,16777215,65664,257,-2147418113,-16839662,16646142,33489406,50332671,16908801,-16646141]},{"sector":13,"data":[-75432447,-16580872,16973827,-2147417854,150992135,16908800,-33423358,-33489663,-16777729,-65794,16646141,33423869,50266878,50332671,33620737,16908802,196867,-16580861,-25100543,589811,-2147417854,351863818,116328064,-285507566,-92270074,-2146105365,654068,101118848,360448,-260046841,-2147352577,16973569,-16840064,-33390591,41943807,-2147351810,352322565,15466880,-335445997,-75492096,50334955,16843009,-16646142,-50200830,-133988351,33554945,-41942273,16843512,-16515070,-2147353086,459001,16843011,50332161,33489663,15991293,32968576,-16580606,-134381566,33620226,50267392,-176160258,-2147417365,33685503,-130176,-33390590,-25165314,-2147353069,50331138,33424256,-32766,293601538,16580871,-16908538,-33554690,-33424128,-16580862,17104899,33685763,50397954,50266624,-2130836994,50328564,83887103,33620737,-17955712,-16515583,17104900,33751556,67469313,25171200,-2146238228,352381953,183237504,33620736,16908546,-16449533,-33358077,-167641854,-301039616,50397697,67044608,-58719489,33620718,262403,-33227003,-2147353085,16968695,33554304,-33325054,41943807,-2147352834,33428478,-130432,-33325054,-8388095,-2147417345,352322565,15466880,-335445997,-75492096,4331,83197958,8388614,-2146959108,1050613,-243205632,-2147417359,33685503]},{"sector":14,"data":[-130176,-33390590,109052414,-2147416577,33816573,50265728,-33587197,-75495935,17104640,-100630524,33686270,-50528128,-2147417087,33425912,-130432,-33325054,-8388095,-2147417345,-16449532,50462080,50233598,-8323838,-2131099389,352322565,15466880,-335445997,-75492096,4331,83197958,8388614,-2146959108,526325,49019264,-32767,58720769,-2147287042,33488386,100599424,-163839,-25165309,-2147286274,100793855,-16712832,-2147221244,50264576,8389122,67239165,167280641,41943550,-2147287042,33684995,50331520,118587393,100728065,-16843265,16646142,50201085,67044095,50398464,33686017,196867,196354,-134217471,-592768,261890,16974085,-301694974,66978302,83887359,50463745,125829378,-2147155719,100727551,-25165313,-2147481351,16908537,33554304,-33325054,41943807,-2147352834,352322565,15466880,-335445997,176166144,-2146107157,318827521,15466880,-336625643,75497480,-2147481600,658161,135000448,294912,-310378488,-2147417365,33685503,-130176,-33390590,142606846,-2147417345,33685503,-130176,-33390590,-226491906,-2147353069,50331138,33424256,-32766,142606594,-2147352833,50331138,33424256,-32766,92274946,-2146107388,318827521,15466880,-335839211,-125829112,-2147481579,16968697,33554304,-33325054,41943807,-2147352834,33428478,-130432,-33325054]},{"sector":15,"data":[-8388095,-2147417345,285213705,33489919,15467392,-2147221744,285273090,33358847,-130818,-33489153,130817,16777473,16712191,16646272,257,-2147418113,585731,33618304,-32767,58720769,-2147287042,33488386,263552,-335445995,25170688,-2146107156,200666123,134087552,-168132597,-109049081,-2146629389,584687,100664704,367886336,75497480,-2147481856,16968686,33554304,-33325054,41943807,-2147352834,16908042,-16842112,334725121,41943550,-2147287042,33684995,50331520,-32997375,41943806,-2147351554,352322565,15466880,-335445997,-75492096,-2147481365,988664,-226428416,-2147417359,33685503,-130176,-33390590,-25165314,-2147353069,50331138,33424256,-32766,58720514,-2130770688,-33357315,33750656,67076349,92338689,-2146172924,352840704,116128384,-285507566,109056518,-2146043410,352381703,15466880,-335445997,-310373120,-2147482133,327692,102099584,557056,-343932920,-2147417365,50331409,-16907648,334528513,41943550,-2147417345,33488652,-130432,-33325054,-8388095,-2147417345,335545349,250347648,-336363499,-176156148,-2146300690,335605504,99348352,622592,-327155706,-2147482091,16968699,50269312,-16613375,-226491906,-2147353069,16973570,-50066816,-16581119,327426,17039619,50463234,50332161,33424127,16515582,-196611,-33620226,-2147418369,50267132,83887103]},{"sector":16,"data":[33620737,16779904,16581118,-131077,-33914626,66978302,83887359,50463745,41943298,50266624,16515581,-16973829,-2130706691,352322565,15466880,-335445997,-75492096,50334955,16843009,-16580606,-50200830,-2147419903,33683210,50266880,49806720,131329,-33358075,183795713,-109051896,-2147417365,33685503,-130176,-33390590,-25165314,-2147353069,50331138,33424256,-32766,176161026,-33424124,-16580862,16973828,33685764,33620738,50266880,33423870,-196356,-16842756,-16777730,66879488,67044095,50398464,176161281,33423616,-327427,-2130771971,33488378,83821566,67175680,16909058,33555072,33358591,-327428,-16908548,318472447,-16581119,16908289,100729345,131585,-33489407,16841856,16843010,-100892672,16844034,-16711679,263552,-335445995,25170688,-2146107156,846843,16843011,33554945,33489663,16318973,33032832,-16646142,-117604350,33620226,50267136,-41942530,16843264,17170946,16777730,-2130837250,33620220,65793,33028736,17171201,16777473,65962239,-109051896,-2147417365,33685503,-130176,-33390590,-25165314,-2147353069,50331138,33424256,-32766,276824322,16580871,-16908538,-33554946,-33424128,16973826,100795138,16843266,-16580606,-218791934,16908801,16908806,-176160255,196595,33685762,50464257,131330,-16580861]},{"sector":17,"data":[-50201343,-16777984,16646142,-2130902778,100664322,16385920,-335445995,25170688,-2146107156,100723463,284881024,368345088,-176160760,-2147024917,67041794,-33750144,-33193982,192938491,-2147416577,33816573,50265728,-33587197,-142604799,-2147353074,50331138,33424256,-32766,92274946,17760260,50463235,50332161,33424127,-2131623683,251658483,8389121,17826030,33620227,-336101375,109051912,-2147482112,16908525,33554304,-33325054,41943807,-2147352834,16973578,-16842112,67338241,-92269305,1181419,-335839229,109056518,-2146108945,519159,100664704,15695872,41943554,-2147287042,33488386,50268800,-16678911,75497983,-2146106364,268692477,-25164544,-2146434069,285077507,75499007,-2146106133,268692477,-25164544,-2146434069,268300547,-243268097,-2147481365,131075,100664192,15433728,-25165565,-2147351809,50331138,-16907648,-15958015,41943298,-2147352833,353108995,216790400,-336232427,-8383220,-2146175764,519421,100664704,367951872,92274694,-2147481856,33811439,-130688,-33390590,159384062,-2147417345,33488642,-32246656,-16613375,159383810,-2147352833,50331138,66978176,67338242,167774983,132905600,-2146893813,185068794,109054464,-2146764052,521717,100665216,368214016,-209715192,-2147417365,33488643,50269056,-16613375,-125828610,-2147353069,50331138,33424256,-32766,293601538]}],[{"sector":1,"data":[61956,-99844090,226498036,-2146044693,368372493,234946176,-2131099648,117436915,-17169792,-50102269,92275453,-2147353602,-16444407,50462080,50233598,-8323838,-2131099389,536870916,14680448,-520126432,-109051897,-2147481824,403571712,2432,-536772576,-109043712,-2147481632,467193,135398272,-2147153669,-66584336,125830152,-16646652,16973826,16777473,-65281,-16711681,98305,65792,16776960,-262016,-33521660,92274945,33488910,-33423360,33423360,83821311,16843264,131329,16908551,-184778751,117441025,-58719743,16843251,17301506,16843522,-134512640,33227263,50266621,33620224,196867,-33423614,-132992,16842754,-116948990,33423868,16777983,16843265,263552,50266389,-302088192,-58715648,1517,-167739372,-16581119,16973826,50397698,67043840,33358590,-130818,159448831,131576,-2147287292,16971260,50397441,67044352,33423871,49018752,-32767,260047361,-65521,33685504,-16908288,-33554690,-33424128,261890,33751298,33620738,50266880,-118128386,67109631,75497985,-16646411,261889,16974084,-2147417599,352322574,-58720251,-2146238228,388348,-25160448,-16842763,-50266369,-16581119,16908291,50463235,33554945,-2130836993,50329847,33620992,-17496960,-16646399,17039363,33620227,-352092159,-8388350,-2147352065,33624322]},{"sector":2,"data":[50331520,285573121,-33554421,-257,16711677,50201085,33555455,33686273,131331,-33358077,16449408,-2130771969,50266615,33620992,16451968,-16842755,16679167,33489406,67109887,16843521,209715458,-65530,33685504,-131072,-33489409,-16646399,-2146435069,67104002,58724096,-16646164,-2146303998,652027,135198592,-294912,41943550,-2147287042,33684995,50331520,202342401,-16711423,16777215,33489406,-16843648,-16646399,16908290,33620226,33554945,33489407,-130818,-16777218,-2147418369,50266878,33620480,16778880,-130818,-17006338,50266623,33620992,41943297,33489152,-261890,-2130706434,33491195,16777983,16843265,262403,16843011,66909568,50332673,-51085311,16974081,16973829,16777729,33358591,-196358,-16711937,-16515583,-33095552,16711679,50201087,67469567,25171200,-2146238228,388348,8393984,33423862,67044095,16843264,196865,-184647671,134218497,32767360,196865,15892490,58720264,-2147481600,16968686,33554304,302022658,41943550,-2147287042,33684995,50331520,-16285695,41943550,-2147287042,33684995,50331520,67469313,131584,16711168,384,-32766,-25165822,-2146566138,201388801,99875968,-2146566144,524539,49478016,-32767,8389121,-2147353077,50331138,33424256,-32766,125829378,33685508]},{"sector":3,"data":[-16908288,98304,-8388096,-2147482881,285214462,33489919,15467392,-2147221745,388605,67047424,33423871,-65283,196096,16712192,58785536,-2147417363,33685503,263552,-335445995,-58715392,1516,-217481195,75500023,-2146957316,117897721,117045632,-218267641,-293601273,-2147481586,458755,49016704,-32767,159384065,-2147417595,33423107,-32705152,-33390591,58721023,-2147352066,16973823,-16906368,-33456126,92275204,-2146107388,318827521,99417216,-2146107392,524539,49019264,-32767,8389121,-2147353070,50331138,33424256,-32766,92274946,-2146566133,201388801,99875968,-2146566144,-33425920,-16580863,16908291,50397441,-25163520,197108,-201490424,50397441,41945600,33423862,67044095,16843264,196865,-184647671,134218497,32767360,196865,15171594,58720264,-2147481600,524291,49472384,-32767,8389121,-2147353077,50331138,33424256,-32766,125829378,-2147352833,50331138,33424256,-32766,125829378,-2147352833,50331138,33424256,-32766,92274946,-2146566133,201388801,99875968,-2146566144,-33425920,-16580863,16908291,50397441,-25163520,197108,-201490424,50397441,-226489856,-2147481600,524291,49475200,-32767,8389121,-2147353077,50331138,33424256,-32766,125829378,-2147352833,50331138,33424256,-32766,159383810,-33424117]},{"sector":4,"data":[261890,33751298,33620738,50266880,16581118,-16908290,-16777730,66879488,67109631,176161281,16646400,-2130771972,33488378,67043839,50398208,16908545,33555072,33489407,-261891,-16777219,184910079,25171200,-2146238228,388348,8393984,50201070,50332415,16908801,-16646141,-50135549,-33489407,-2130771969,33683465,50267136,49675392,16843009,-16515069,-33423613,133595137,-109051896,-2147417365,33685503,-32374656,-33390591,58721023,-2147352066,16973823,790144,-318668780,-25161216,16777965,-2146107137,-16781570,16711678,50201085,33555455,33686273,131331,-33423614,-460928,17039362,-184254462,33489406,67109887,16843521,41943298,-2147481593,33488891,-130432,-33325054,-8388095,-2147417345,234883845,15925632,-201555956,234881029,15992704,65535,514,-16777218,-33423872,-2147221758,526587,49478016,-32767,8389121,-2147353077,50331138,33424256,-32766,226492674,16646413,-65788,-50331905,-16646656,16908289,83952130,16843265,-168394749,25166847,83952129,-2147417599,83820801,32896640,83952130,16843265,-16580606,-66978303,-512,16711679,-2130837244,234882565,16843521,131330,-33423614,15792256,-2147352305,-33361922,50401536,-109051647,-2147481102,150997765,16843521,196866,-16646398,-159318527,17367287,-184844286]},{"sector":5,"data":[167772165,16843521,15861632,-2147482354,201389052,99875968,-2146566144,16970481,33554304,168656898,-8388095,-2147417345,235277059,99810176,-184778740,92277765,-15991819,-218595326,58720263,-2147482112,33751281,-16907648,-16220159,25166082,-2147352577,235145988,66256256,-167870453,58723075,-15991307,-234586109,-41939452,-2146761742,194044,58723075,-16056842,-219054077,142606344,-2147482112,16974059,-16841856,-15958015,41943298,-2147352833,235539204,183695232,-218660850,-8385014,-2146633997,521213,100664192,250642432,58720262,-2147481856,16970481,-16841856,-16285695,41943298,-2147352833,33426678,50266752,-16285695,58720766,-2147417345,235277060,99810176,-184778740,92277765,-49546251,-33358330,-16712191,50200831,-16646144,-2130771968,519424,100664192,15826944,41943555,-2147352834,16973576,-65152,185434113,192941814,-2146502926,251064843,-185464192,-2147221504,788992,-176096256,-2147155978,67042306,-33750144,-33193982,125829627,-2130770675,-33357315,33750656,67076349,159448065,-16646656,196353,16908546,131329,-2147287550,50328065,33620480,33620225,50266624,33817340,33554945,33489663,33555199,-8388095,131826,-16580862,196353,16908546,-2147417599,536870916,33555840,16843009,-16646142,-16646398,33685506,-218136574,33554945,33489663,33555199]},{"sector":6,"data":[33817089,50266876,33620480,33620225,50266624,-17694336,16908290,16843010,-16646142,-33423614,318996481,-50201088,196354,50594050,131330,-33423614,16969344,50266878,67174912,33620483,33489408,1308492029,543912545,1411395140,504824064,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1140850687,65282,336658464,536879872,24190,0,128256,0,130048,268435456,184549376,335560192,352347136,352352256,402709248,436279296,184656384,268552960,268568320,285360896,419596288,184722432,419613952,184736512,386070784,352519936,352548352,352557312,352582400,352613632,352620288,352643584,352673536,352691712,352740608,184998400,185013760,403135744,419914752,403144704,352814848,453506816,336093952,403219200,352923136,386497792,386526464,369783808,369814016,436953600,235661568,319564288,386694912,336393984,470632704,420330240,370017024,386821632,370071296,403663616,386921728,370166272,420520960,336656640,437335040,370251008,370274048,370296064,236093440,236098560,236099840,370322688,1227520,185776896,370337536,320029952,303277568,370403072,303321856,269783552,353691648,370496512,219520512,219536896]},{"sector":7,"data":[370553344,202803968,588691968,404171520,337082624,370659328,353913088,303607808,286844928,236536064,404318976,337230080,505016320,370821632,370846464,337315584,236670464,136026880,236691456,404483328,1841920,1836012032,28257,-16512640,-33423616,-217808883,234684671,15926400,-2146632703,16904708,217776384,-16449920,16842753,16777473,-65281,-2147418113,16777472,-16777215,142606591,-33423612,-100433914,58722045,-67042823,-116555770,117309951,-33946752,-117211130,117178625,-117437568,-535986144,-92266247,-2147479827,919281,-134214528,-485654499,159391224,-65300,33685504,-131072,-33554434,-50266881,196097,33685763,16975362,-16580606,-218595326,67568129,-125828607,196595,100794626,16908803,-16580606,-50200830,-50267135,-1,50200830,-16646144,-2130771968,367920149,48956800,-16646142,-33423870,16711168,50201086,33555199,50397953,50266880,251429119,50266622,33686016,-16646142,-33489407,16711422,857984,65535,514,-2,-33423872,-32965886,-50201086,-768,33423614,50266622,50202111,33424127,-130818,-16777474,196353,17170691,33685763,33620483,16646400,66289919,25231356,16711424,33423870,-2130771201,50462212,16909827,-16648832,16711679,33423870,100598527,-33718019,50397953,50463746,65794,159448833]},{"sector":8,"data":[-16711929,33489151,16777727,-16646143,-33423614,-100499455,65792,16776960,131456,-2147287295,33423376,66913021,83756030,83887359,50398209,41943810,-33292570,392964,-435388408,66913021,50267134,83821567,8391167,17367544,-2147352317,50462729,67175169,83821824,66979070,50136061,209715710,-16252698,-33227259,-436043773,50397697,8390913,-16121864,-16515324,-50070014,-2147287805,33489930,33491458,15990912,-201293812,184418561,-75497215,134218231,-2147483386,101382902,16447104,264705,-100630527,116916479,176161023,-2147027206,16841226,16778486,461952,-2147483375,126975,-142601984,4599,-1081343,1114368,-15137664,16776960,33489407,65792,-16580862,-2147353087,16841218,-16777215,25166079,-16711678,251953154,16777233,16772992,-2147479295,33494531,16843008,-16711679,-256,8388863,16842753,-65536,1605632,73958,31463808,-2145327616,33358860,66978558,83821567,50397952,16908545,-16580606,-50135550,-66978559,-33555200,-65537,-41942786,-16581118,-16515326,17039364,491522,-33423870,-66978559,-16778240,-16843648,-16515583,-16515326,17104900,-2147417854,-16646142,-33424126,-66978559,-16778496,209780735,34732808,-351895552,301663486,-85260416,-351895531,50136061,92275198,-50200834,151486465,130816,16646656]},{"sector":9,"data":[-33423872,-16515327,16973827,33554945,50201343,50202358,260048126,131564,-33358078,-2147287806,16905475,33554945,50201343,-41941256,50266372,83952896,-2130771712,33882357,-159383547,50529790,33489408,-2130771714,-16774905,33554433,-33554178,-16646655,261891,33620227,50266624,33423871,92275197,131575,-16580862,-117473279,33620225,50266624,33424126,33619584,16843520,131329,-33358077,-50201343,-768,16711679,766,65282,-66354945,50332161,-41942273,16843511,-16515070,-33423614,135233537,135675,-18151808,-2146305276,368765703,-253032832,-2147479537,184222729,183895424,32931840,-142606328,67110145,-2130771201,-16708879,261891,16843011,50332161,50201599,16581116,-2,-33489153,33554434,-16776961,33164160,-16580606,-2147287549,16971007,67109377,50201599,293601790,-65528,33685504,-131072,-33554690,-33424128,-16515582,327427,16974083,50397697,50266880,16646654,-65539,-33554689,-16646656,-2147287295,67040771,83821567,33620992,33491328,-196354,-167870210,66978302,67044095,83887359,16843265,33555328,33489407,-261891,-2130706434,117310470,-389248,-66847229,-16515579,-2147156221,83818498,159384831,-33096975,-16580861,-2147483132,-50073859,50659330,67041408,-2147351296,-16645898,17104899,-16711678]},{"sector":10,"data":[193003009,-16646908,196353,33685763,50332417,33489663,-196354,-50331906,163840,8389115,196353,-2147417852,16974079,67109248,-16678657,-50266623,25231103,-2130707456,50200830,67109631,58720769,33489408,16646655,-2130771972,33295098,50266878,33620736,262403,-16646396,-50266623,-257,-25100290,-2147353856,50200577,50332415,-8388095,100730112,-16744193,-50266623,8453887,-2130706945,33423614,50266878,33620736,75497729,33489408,16646655,-65540,202408191,33489663,16581118,-2,-50266369,-33358335,261891,16843010,50332417,67044607,50201598,16581117,-16777218,196096,16712192,58785536,16711673,-2130836995,33685257,83821568,66978815,-328576,16711679,33358332,-2130771201,16842755,83886593,67044607,66978559,109052414,130827,16843009,16711936,-1,16809984,65792,16776960,-16056960,16842753,16777473,-65281,-2147418113,16777472,-16777215,109052159,130827,16843009,16711936,-1,16809984,65792,16776960,-15860096,16776960,33489407,65792,-16580862,-2147353087,16841218,-16777215,25166079,-16711678,118784002,152046064,285934720,-2147418112,16842735,-276824047,4359,-1081343,1114368,268895360,-2146832375,-16774905,33554433,-33554178,-16646655,327427,33620227,50266624]},{"sector":11,"data":[33423871,33423868,16908800,25165825,-2147416590,33620223,50266624,33423871,32964992,131329,-16580862,-16581631,16908289,83722241,16777727,65793,-16711935,16777215,65664,257,-2147418113,-16839662,16646142,33489406,50332671,16908801,-16646141,-75432447,-16580872,16973827,-2147417854,150992135,16908800,-33423358,-33489663,-16777729,-65794,16646141,33423869,50266878,50332671,33620737,16908802,196867,-16580861,-25100543,589811,-2147417854,351536141,32508544,-318734319,8393217,16908524,-2147352559,588534,101118592,360448,-243269625,-2147352833,16973570,-16840320,-33390591,58721023,-2147352066,368706569,-85260416,-351829995,25171450,50334699,131329,-16515326,-2147353343,33683203,67043840,-8388097,16843255,-16646142,-2147287549,524536,33620226,67043840,33293054,293601524,131574,-33292542,-167673854,50332161,50201599,-75496962,-2147417109,33685502,-16907392,-33325054,-92274179,-2147353325,50265603,33424256,-98302,310378755,16777478,458750,-65538,-33554689,-33424128,-16515582,327427,16974083,50397953,50266624,-2130836994,50262777,67044095,67110143,125829633,-33423635,-16580861,327427,33685765,67731457,125834746,-2146043157,368765703,166396288,16843520,196865,-33227004,-33358332,-150864895]},{"sector":12,"data":[-334397440,50397441,83821568,50201854,49086848,196866,-33227004,-50070268,-335642623,-25165565,-2147352065,50265603,-33684608,335183873,58720765,-2147287298,33684995,67108480,67731457,125834746,-2146043157,368765703,-17757568,-218529784,117374991,100988032,200441856,-83754993,66123392,-98303,58720769,-2147287298,33422851,67045248,-98303,-8388094,-2147286530,100728064,-33490048,-2147221500,50264577,25166337,33684989,167215105,58720765,-2147287298,33684995,67108480,229377,-41877755,-2130836735,-50200576,-100398720,-351829995,125834746,-2146043157,150925578,267581824,-2147025152,394484,135000704,-335577088,-25165565,-2147352065,50265603,-33684608,-16285695,-25165565,-2147351809,50462463,16580736,16482310,67110142,-17170048,-2147352318,33422593,-142606078,-2147353335,50265603,33424256,-98302,310378755,16777478,458750,-65538,-33554689,-33424128,-16515582,327427,16974083,33620737,50266880,-2130967810,50263288,67044095,67110143,159384065,33489407,-218332931,66978302,67044095,83887359,16908801,33555072,33358591,16613629,-109051896,-2147417600,50462719,-16972928,-33325054,159384061,-2146043388,368765703,-85260416,-351240171,125834746,-2146043157,368765703,149681536,294912,-310378488,-2147480566,527341,134218880,-336363520,-25165565,-2147352065]},{"sector":13,"data":[50265603,-33684608,-16154623,-25165565,-2147352065,50265603,-33684608,334397441,58720765,-2147287298,33684995,67108480,-16154623,58720765,-2147287298,33684995,67108480,67731457,125834746,-2146043157,368765703,149619072,368214016,-8388600,-2147417109,33685502,-16907392,-33325054,-92274179,-2147353325,50265603,33424256,-98302,243269891,-15598844,-2147287550,234679049,50267135,-51509376,-33161715,-33423870,-512,33423614,16777727,-16711679,-2147418367,16842240,-16777215,159383807,-2147481360,16974073,33554048,-33325054,58721022,-2147353090,368706569,-85260416,-351829995,293606906,-2146700820,201653508,83164544,-201490420,-176157692,-2147481364,393221,135653248,294912,-192937977,-2147417109,33685502,-16907392,-33325054,176161277,-2147417345,33488642,-49025408,-33325055,58721022,-2147352066,17039358,-16840576,-33390591,41943807,-2147351810,368706569,-85260416,-351829995,25171450,-2147481365,988658,-159319550,-2147417103,33685502,-16907392,-33325054,-92274179,-2147353325,50265603,33424256,-98302,58720515,-2130770688,-50068995,50593408,67731706,109057274,1180141,-352288766,8393473,-2146303507,318107147,226493438,-2146043157,368765703,-85260416,-336363499,209715205,-2147482368,398820,134219904,-336494592,-8388350,-2147352065,50265617,-33684608,334200833,41943550]},{"sector":14,"data":[-2147417345,33423117,-16907392,-33325054,-25165311,-2147417089,351929353,132908672,-335904747,-75492858,-2146302226,301723397,-159382529,-2147482133,393224,102098816,-352223232,-25165565,-2147351809,16973322,-16842112,334331905,41943550,-2147417345,33358860,66978558,83821567,50397952,16908545,-16580605,-50135550,-66978559,-33555200,-65537,-58720003,-16515581,327427,-2147352316,-50135287,-66978559,-16778240,-16843904,-16515583,-16515326,17104900,-2147417854,-16646141,-33424126,-66978559,-16778496,159449087,-2146043388,368765703,-85260416,-352223211,16973836,33554945,50201599,16253436,32902528,-16646142,-2147287549,16905728,33554945,50201599,-243269122,-2147481590,17034239,33554048,-33325054,58721022,-2147353090,33362938,-16907392,-33325054,-25165311,-2147417089,33358860,66978558,83821567,50397952,16908545,-16580605,-50135550,-66978559,-33555200,-65537,-58720003,-16515581,327427,-2147352316,-50135287,-66978559,-16778240,-16843904,-16515583,-16515326,17104900,-2147417854,-16646141,-33424126,-66978559,-16778496,-159318017,50200850,33554943,16908545,16843013,-2130771712,16843261,-41943039,17236217,16777729,-2130771715,368706569,-85260416,-351829995,25171450,50334699,131329,-16515326,-134087423,-150241280,33554945,33489919,33030016,131329,-33292542]},{"sector":15,"data":[16547842,16843010,16844290,-16711679,16907648,-2147483391,134347004,131329,-16712447,134540416,-335577088,-25165565,-2147352065,50265603,-33684608,335183873,58720765,-2147287298,33684995,67108480,101941249,-33488895,-33552641,-257,16580605,50201085,33620736,50725378,50332161,-125828353,117572082,-2147352316,50328568,33620480,33686278,50332161,33489663,16515581,-3,-33489153,-33487105,226492417,-2146043388,368765703,-85260416,-335708139,310380286,-2147024902,1112817,135655040,-335839232,92276477,-2147222278,33291526,67046528,-98303,-8388094,-2147286530,100728064,-49351808,-33325055,58721022,-2147352066,17039358,-50067328,327435,50462979,50332673,33424127,-2131622659,201195507,67110143,75497729,-15991316,33816580,-335708158,109051912,-2147482112,16974061,33554048,-33325054,58721022,-2147353090,16973579,-16842112,67534849,285278720,8389120,-2146369044,285339136,-185595264,-335708140,92274695,-2147482112,33620207,-130176,-33390590,176161277,-2147417345,33488642,264320,1179138,-335314942,58724862,-2146304274,301526792,176162046,-33423125,-2147352559,301919235,-17955968,-267878383,83759352,149682048,229376,58720258,-2147482112,16974059,33554048,-33325054,58721278,-2147353091,16973581,-16842112,67600385,-75492090,-2146105621,352775163]},{"sector":16,"data":[-286521984,-335314925,92274695,-2147482112,398824,117441920,-336232448,41943554,-2147287042,33488386,50268544,-16613375,-293600770,-2147353069,16973570,-16840320,-33390591,41943807,-2147351810,168035334,8391677,-49675029,-352288757,201132548,-135525248,-151486455,125829127,-2147482112,529900,49019264,-16613375,41943807,-2147353090,16973580,-16842112,334725121,58720765,-2147287298,33684995,67108480,68386817,327161326,-2146046229,367979283,-219475328,-2147025408,921596,-142542334,-2147025423,66976260,-50526848,335839233,-25100540,-2130902271,-100465666,1152,-536772576,-8380416,-2147481632,467193,235143296,622616,25174016,-2145386272,516345,119601536,302219264,84474632,134279296,-2147219204,33424391,50332415,65793,-16711935,16777215,25166335,16842752,-65536,-67076096,8389887,-2147417602,134089488,33620992,131329,-33423870,-17367936,-2147090425,193281,83822590,16580480,-16908291,-50266369,-16515583,16908291,33620227,33554945,33489407,-2130902530,67042041,50332671,75497985,-16580876,261890,16974083,67600385,117377022,33620992,16908545,-16580606,-50201342,-33554944,-65537,33423614,50266623,58721279,-16253198,17170436,-16285693,-50201087,-16777984,100136576,-33030656,117800967,-33423870,-50266879,-513,66713984,-98303]},{"sector":17,"data":[243270145,-65521,33685504,-131072,-33554690,-33424128,261891,16974082,33620481,50266880,-117931779,67044095,33620736,-17562496,-16580862,16973827,-2147417853,201131026,50332927,16843265,-33423358,-25100799,-15991313,-2147155964,388096,83824380,16580480,-16908291,-50266369,-16515583,16908291,33620227,33554945,33489407,-2130902530,50330616,50332671,75497985,-16580876,261890,16974083,-351698943,-25165565,-2147352065,-16509948,-33292541,-16777727,16646142,66978301,33555455,16843521,131330,-33358077,-526208,261890,-2147352317,50263044,67044095,50397952,276824321,-65530,33685504,-131072,-33489153,-16581119,-16515326,-16122364,-33358077,-402030590,100598783,67045886,-18347648,-16580862,-33161469,-16515320,-33358334,-16712191,50200831,-16646144,-2130771968,781573,-66383744,-33292530,-2147353085,251456266,92275966,-67108114,-33227250,-50201342,-512,50200831,-16646144,-2130771968,-50268916,-66049,33358078,67044350,50397696,16908545,-16646142,-33423615,-125764351,-16580613,16973827,-201031678,50266878,50332671,16843521,-100398976,-2147483115,368765701,99287680,-2146043392,-66914046,-16581118,16908290,50332161,25167358,-16514826,-2147221500,100595201,33620736,131329,-33423870,66056576,-98303,142606849,33685508]}]],[[{"sector":1,"data":[-16908288,98304,-8388096,-2147482881,-33486089,196098,33620225,100532992,16122240,327428,-167673852,50333182,16843265,-33423358,176225793,33685508,-16908288,98304,-8388096,-2147482881,-33486090,196098,33620225,134087424,50267135,33424126,-65282,196096,16712192,159448832,-33226514,-16515321,-251363326,134087935,50267135,142607102,34994692,-351961088,41948666,-100661781,-200376299,16776960,131584,-512,33423614,33424636,33619584,16843264,17039873,-2147483135,67304442,-75497215,33620473,33620230,50266624,-269188867,-25165565,-2147352065,201131016,50332927,16843265,-33423358,-25100799,-15991313,-2147155964,388096,83824380,65929600,-98303,25166337,50200847,16777982,131329,-2146894333,83948289,41945342,-33226763,-2147483129,-50137086,-16581118,16908290,50332161,25168126,-33226509,-184385528,134087935,41943042,50135800,50266878,16843264,-33357822,-167673851,83821568,25166848,392950,16908547,33554945,-2130836994,-33485055,196098,33620225,150864640,15925632,-2146894331,83883266,133118,49808000,50201341,33555199,131329,-2147090941,67171841,67110143,-17432192,16973829,33620226,33423872,185172222,66978301,33555455,16843521,196867,-50135293,-33489663,-513,16646141,-16581248,261890]},{"sector":2,"data":[-2147352317,-33488887,-50266879,-92209409,-16580866,261890,33751299,229377,-33423870,-50266879,-66049,17760640,50201342,16843008,-16580606,-2146697980,83946499,201131263,-1178496,-2146501628,-50204154,-16646655,196354,16843010,33555201,66978815,16646653,-33554434,159448320,131579,-16515325,-184582142,50397441,67044096,50201343,134738560,-229376,58720765,-2147287298,33684995,67108480,185630721,125834746,-2146043157,191237,41948666,-196366,-16777475,-33424128,261891,16974082,33620481,33489408,33423871,-67600131,67044095,33620736,-17562496,-16580862,16973827,-2147417853,526080,-33555328,-33325055,58721022,-2147352066,17039358,17760640,50201342,16843008,-33292286,-218005497,134088192,-720256,34078212,-200638464,16776960,131584,-512,33423614,83755774,921216,65535,514,-33554434,-50266625,130817,33685762,33620737,-2147352319,67106552,33620352,33620737,16875521,-125827841,33686005,33620737,131329,-50135294,-50266879,16777215,766,65282,67731711,83823613,33620736,131329,-33423870,-34603392,327435,-335314939,251396098,-41941761,-2147480843,-33485055,196098,33620225,100532992,16122240,327428,-167673852,50333182,16908801,-16646142,-50135550,-17300864,16973832,33620226]},{"sector":3,"data":[33423872,-151224066,83888382,49480064,-16253440,251756548,-33358335,16842754,50332161,25167358,-16514826,-2147221500,100595201,33620736,131330,-33358078,-66978558,16776192,33620224,17760640,50201342,16843008,-33357822,-167673851,83821568,25166848,392950,33685763,33554945,33424127,-134053635,50333950,16908801,-16646142,-50135550,-67044351,16777471,-142605823,589565,-218005499,134086658,58721535,50135567,33555199,131329,-67272702,67109121,50267391,33424126,-65282,196096,16712192,159448832,-16580362,-2147287036,-16714231,33554687,-33554430,16711679,50201086,83821311,16843776,16514432,33685762,33554945,-2130902273,-33485055,196098,33620225,100532992,16122240,327428,-167673852,50333182,16908801,-16646142,-66912766,-50789760,-33292530,-2147353085,251456266,92275966,-67108114,-33227250,-50201342,-512,50200831,-16646144,-2130771968,50268945,116916990,50266878,-135000704,-16646656,-49643518,16646140,142606847,-33620992,-16581120,117473283,-16646135,-159318527,50398211,-2130771712,33816824,-33423357,159448321,-16646656,196353,16908546,131329,-2147287550,50328065,33620480,33620225,50266624,33817340,33554945,33489663,33555199,-8388095,131826,-16580862,196353,16908546,-2147417599,536870916,33555840]},{"sector":4,"data":[16843009,-16646142,-16646398,33685506,-218136574,33554945,33489663,33555199,33817089,50266876,33620480,33620225,50266624,-17694336,16908290,16843010,-16646142,-33423614,318996481,-50201088,196354,50594050,131330,-33423614,16969344,50266878,67174912,33620483,33489408,1308492029,543912545,1411395140,4327111,-1047855104,-388823887,1687855918,78765195,-796070957,-1557216509,-930323304,-1099669317,-215255328,-338492239,-1993424125,-94064098,-427044722,921515003,931465,203852086,15630592,914961922,-1591345142,1480392958,1024095319,276125511,470220590,117386752,854261788,33614224,-54512866,268865070,8437248,-268194778,234978445,1734129951,728191422,79793102,431270402,1090789837,-206882124,788275108,1050254,268812428,512437760,-1960418152,-1912602098,378218179,1397882896,244339024,-485622552,-1767690584,-37754780,-1156958488,-1993459491,771778078,6819468,-1899459554,2014936,1020912603,76218603,1023639333,74711935,1223,109981215,-2135031792,650130176,1190134700,-268194778,-62601434,-970566065,726466116,-2131983888,-1141077248,101072896,1398216278,333975184,1963409588,83764760,104857787,1461081606,-401698733,1074246654,669582197,-1191408895,-13697025,1348769846,1088968470,-2134605382,1958742784,784371429,637536419,2242187,105152806,-14284800,100663814,782582760,525966,-1207959106]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[8084045,3,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":8,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":9,"data":[279886,131198,189692135,32772,0,0,0,0,4194351,7602240,8257662,1152,589824,0,0,0,-2147024892,1,4915200,5242888,44,-2146959360,1,5439488,-265289452,32769,0,1313818119,1380533332,1380143878,5525577,0,1313818155,1397051988,1313817376,1431193940,1397970255,1229734211,975193934,1919111968,544501865,1952797480,691086112,1291845632,65537,288555264,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1879048192,65281,289472549,536879360,24190,0,128256,0,1666383872,1953524082,1918979328,288555264,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1879048192,65281,289472549,536879360,24190,0,128256,0,130048,268435456,167772160,268439552,352328192,335556096,402678016,436248064,167830272,234942976,234948352,268508160,436284160,167851264,436291072,167856896,369186304,335633152,335642112,335644416,335651840,335659776,335662848,335671808]},{"sector":10,"data":[335683840,335686400,335701504,167941376,167947008,402835200,436391424,402839552,302178048,453183232,335770368,386112000,335800832,386144512,335830528,335844608,386189824,402981632,285560064,252018176,403025664,319158784,554054400,403081728,352765952,419889408,369573376,419921152,336054272,319291136,403189504,386428672,470330880,403233792,386474496,352939008,235518720,235523840,235525120,369747968,652800,185202176,269099520,235556096,185235968,269128960,168477440,134931456,252384000,252397824,118194432,118202112,235652352,135005184,420226816,302802432,235704832,252493568,252505088,218963968,185416960,151870208,252540928,252550144,353221632,269347584,252580096,235814144,235825664,135182080,235846656,403638528,997120,1919111936,7630953,263552,83918862,16843263,-255,263296,-116883449,192939776,-2145322752,553246733,250477184,116490240,142606350,-2145583104,486597380,-18217600,-50332162,-33424128,16908290,33620226,33687041,16843009,-33357822,-66978558,-16777984,68518142,92280302,131819,-33358078,-33489407,33423614,50266878,50397696,50332417,-2130771201,33427196,33555199,131586,-33423614,-16843264,394264830,-65523,-16711681,-33358079,-33292795,-66978302,-512,16711679,33423870,33294335,16646655,-16842754,-16646401,16908290]},{"sector":11,"data":[84083203,33686023,16777729,-2130771713,-63995,16908033,50266624,192938495,-33358336,-16450045,17039365,33817093,-2147352061,33685507,67240706,67110145,83756543,50201598,657536,-134512628,8390154,-2147027206,301991693,318240640,403079168,-65025,16908033,50266624,75497983,-2147479024,33494789,-16711423,343998463,-2145325568,33358857,100598782,83952384,16974594,-16580606,-83755774,-67109632,-131586,109052158,67043848,-2146107139,-16774908,-16646655,327426,16843010,33554945,66978559,920310,184812928,50919936,16843264,196865,-33292542,-50201342,-768,-2130771969,251003917,-75497457,-2146107150,16122895,-16709121,261891,33685763,33555201,50201599,16581117,-3,276889343,-33620217,-50266369,-16515583,17104901,50463236,50331905,33424127,-65283,-33620227,-50266113,-16581119,68255747,-58714634,-2147479829,33358856,33555199,16908801,16974084,33620482,50266880,33358335,-196356,-16777217,-33424128,-16515582,-16580860,-33489407,-131329,276824316,-33292533,-16646910,-16777984,16646142,50135551,33489918,33620736,262402,-33161467,-33424125,-768,184910078,16843263,-255,-15990656,16843009,-2130706433,33491717,-16711423,25231359,-16646387,33489407,-16646143,-2147352830,166725396,75499792,-2147479027]},{"sector":12,"data":[1181422,268895360,-2146832375,-16774909,-16646655,327426,16843010,33554945,33489663,50332412,-16449408,16843009,-2130706433,-16839662,16646142,33489406,50332671,16908801,-16646141,-75432447,-16580872,16973827,-2147417854,150992135,16908800,-33423358,-33489663,-16777729,-65794,16646141,33423869,50266878,50332671,33620737,16908802,196867,-16580861,-25100543,589811,-2147417854,-16639744,-66847485,-100402940,-33614592,-16843266,16711421,33554943,33686017,16974339,226492421,65798,-16449789,-33358077,-33358333,-16711935,33358079,33358331,50135806,67044094,33555455,131329,-16580862,-50201087,16744449,16973825,33620225,50266880,33423871,-130819,209780479,16842762,33554945,16646655,-16842754,-50266625,-33358335,-16580861,17039364,33620227,50332161,33424127,67993854,50266622,117376255,50267135,33424126,-65282,-16646656,16908290,16974338,-16580605,-66912766,-67044607,-513,16646142,33555198,50463489,33751554,243269890,16842760,16777729,-130817,-50332162,-16646912,16973826,50397442,-50266879,-16646399,16973826,50397442,50332417,33424127,168460542,-130818,-33423617,261891,196868,-75432190,-33030655,-33227258,-33423870,-512,33423614,33555199,-100433919,8388617,83821081,33227772]},{"sector":13,"data":[16515581,-3,-16646400,16973826,67174914,33489664,16646655,-16384250,-50135550,-50267135,-65793,-2130837250,-128249,-16711937,-16581119,16908289,33554945,117310719,50201854,-65282,109116928,50137594,50201599,16646654,-1,-33358336,-16318972,16973829,33554689,50266623,336494845,-33620226,-33554689,-33424128,196353,33620225,100598528,50267646,33424126,-130818,-33489153,196353,176161026,-16908772,16449531,50135546,16777983,196865,-49938685,-16318967,-33358077,16776961,50135550,66978557,-2130836226,-128249,-16711937,-16581119,16908289,33554945,117310719,50201854,-65282,394329600,-130831,-33488897,-33358335,-33358333,-2147418623,33619970,33621760,65793,-16646398,75562242,67109392,50201599,16646654,-16842755,-16646400,-16384254,-16515323,-33358334,-16712191,33423615,33555199,50463489,50332161,-2130836737,-128251,-16711937,-16581119,16908289,33554945,83822079,41945086,49808377,50266620,33554943,131329,-16384254,-2146959868,-133957374,-16647166,130818,33620226,100598272,50333694,65793,-16646398,92339458,-501,33489150,33489662,16843264,-16646142,-33227003,-117276665,-66914301,-16580863,16908290,33554945,134088191,16843520,-16646143,-50135295,-50066304,-33358335,-16580861]},{"sector":14,"data":[17039364,33620227,50332161,50201343,33423869,-261892,-16777219,-33489153,16973826,33751555,33686274,101548033,50331905,67044607,66978559,33424126,-65281,-83755776,-33424127,-33358590,-16515326,16908293,33620225,50266880,33423871,-130819,226557951,-16580854,-33423871,16711424,50135550,67044350,16843264,-16515070,-66847229,-33358588,-33424127,16776960,50266622,50397696,50397954,50266880,101548286,50331905,67044607,66978559,33424126,-65281,-83755776,-33424127,-33358590,-16515326,16908292,33620225,50266880,33423871,-196355,33620225,33621248,-16645886,-50135295,35192960,66978559,50135804,16581116,-3,-16646400,16908290,50463234,16908802,-16646142,-50200830,-50267135,-65793,-2130837250,16648714,-16777218,-16515583,17039363,-16646141,-33424512,-33096185,-33358332,-33489407,16711679,50266622,-2147417600,-128251,-16711937,-16581119,16908289,33554945,67044607,33555711,16908801,-16646142,-66912511,-117245949,-16253312,458500,16843011,33489408,-2130902273,-128251,-16711937,-16581119,16908289,33554945,67044607,50332927,131585,-50069758,-66913022,-66978559,-512,33489151,33555199,33686273,92274946,-501,33489150,33489662,16843264,-16580606,-351633393,176166390,-2146042133,33483534]},{"sector":15,"data":[83690493,134022909,-32896896,16776960,50201086,33555199,131329,654851,33685763,33554945,16646655,-16777218,-200835072,-512,33423614,66978558,66980348,33424126,-65282,92339712,-501,33489150,33489662,16843264,-16646142,-16515324,16908292,33620226,50266624,33358590,-2131098882,134150402,117312253,83756542,-65026,-50201088,-50070270,-49938941,-16118400,-33423614,-16712191,33423614,66978557,33555455,131329,-33292540,-66847484,-50201085,16776960,67043838,16843264,131329,-16515325,-33292798,16776961,50135550,66913277,-2130901250,536870916,14680448,-520126432,-109051897,-2147481824,403571712,2432,-536772576,-109043712,-2147481632,467193,135398272,-2147153669,-66584336,125830152,-16646652,16973826,16777473,-65281,-16711681,98305,65792,16776960,-262016,-33521660,159383809,-16842989,-33489153,-16646399,16908290,33620482,33489408,-392450,16973829,33554689,50266623,335577341,-83624702,-50201087,-512,50266622,134153471,16844288,-16646143,-50201086,67239168,131329,125894402,-65518,-33489153,-16646399,16908290,50397698,50201344,319389949,-65793,33423614,50266623,33620480,131330,-33423614,-58659322,392972,16843011,33489408,-2130902273,-16640255,-33423615,-512,33423615]},{"sector":16,"data":[50332415,16908801,-16646142,-50135295,68419712,33358587,16581118,-16777218,-33358079,-49677048,261895,33620226,33358335,33620471,33489408,-2130902273,-16837879,16711678,33489406,33555199,16908801,-16646142,42008321,-66584839,-33358069,16776961,66912766,50201597,66978815,335577341,-83624702,-50201087,-512,50266622,117376255,8390911,33358080,50135806,16777983,-16646143,16908291,33554689,50266623,184779005,65792,16776960,34209152,458492,16843010,33489408,-2130902273,16780035,-16777215,-41942785,-84147703,-33358062,16776961,66912766,50201597,66978815,335577341,-83624702,-50201087,-512,50266622,117376255,8390911,33358080,50135806,16777983,-33423359,-2147418879,16908288,16843521,-16646143,-50135295,34865280,33227773,16581118,-16777218,-16580863,524036,16843014,33489408,-2130902273,-50195456,16908034,83820800,25166847,50201085,50266877,65792,-16449791,-50233341,-50135551,196354,33554689,33555455,65793,-16646398,8453378,50135572,66047,-16449791,-50233341,-50135551,196354,33554689,33555455,65793,-16646398,109116674,-33489392,-16646399,16908290,33620482,33489408,16646655,-16842754,131071,33685762,33555201,-2130771457,-50195456,83885569,109056762,50201070,33555199]},{"sector":17,"data":[131329,-16580862,-2147353087,16973820,-16580605,-50069758,-15529600,-16777474,-16646656,196353,33685762,33554945,-133988097,100533247,67045373,16843264,-50200830,-16582400,-50070013,34865280,16646653,16777986,-16646143,16842755,33554689,50266623,335577341,-33424126,50463232,33554945,-58719746,67175167,33489408,-2130902273,-50195456,58784770,1243895,33620226,33489408,-2130902273,522488,34865280,458492,33620226,50266624,-2130902274,117374209,16843264,-16646143,-50135295,34865280,393212,16843011,50266880,16581118,33021,16843777,-16646142,-32504960,261890,33685762,50266624,-100499202,33556222,131329,-33358078,-50266879,16777344,33620228,-2130771456,-50195456,196354,117440769,196865,-50135549,-131712,-16711937,-16253951,-16712191,335577343,117373954,16843264,-16646142,-50135550,-84082304,-33358062,16776961,66912766,50201597,66978815,335577341,-16581374,33685506,50266624,33358590,33620226,67044096,33424127,-33488897,-50070271,-50004477,159448323,-16646656,196353,16908546,131329,-2147287550,50328065,33620480,33620225,50266624,33817340,33554945,33489663,33555199,-8388095,131826,-16580862,196353,16908546,-2147417599,536870916,33555840,16843009,-16646142,-16646398,33685506,-218136574]}],[{"sector":1,"data":[33554945,33489663,33555199,33817089,50266876,33620480,33620225,50266624,-17694336,16908290,16843010,-16646142,-33423614,318996481,-50201088,196354,50594050,131330,-33423614,16969344,50266878,67174912,33620483,33489408,1308492029,543912545,1411395140,1869379937,-411038976,-2147482382,462588,117441664,294912,92274695,-2146566133,234942977,49610880,50267134,16843520,-2146762750,16970492,184549889,83030656,251428864,75497479,-2147481856,33360649,67044094,50397696,16974338,-16580606,-50201086,-33554944,-131330,8388862,-33423872,261890,33751298,-2147417598,-16646142,-50201086,-33554944,-65794,722304,-352223211,8393984,50201326,50332415,16908801,-16646141,-50135549,-33489407,-2130772225,16971014,50397698,67043840,33424126,83031680,368869376,260046855,-2146107381,352381697,-17891456,-16777474,-33424128,261890,33751298,33620738,50266624,-168132354,50201086,33555455,33686273,58720514,-2147481849,234883845,15860096,-134184946,-33358591,261890,16777473,-65025,-192872703,-2147482369,462588,17632640,-16514818,-16777218,-33489665,130817,33620226,33686785,-2147417855,16906741,33882370,16843010,33489664,16515582,-2,67174143,92339713,17891332,33620483,33489408,-285638402,50401536,-92274431,-2147481358]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[8084045,3,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":7,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":8,"data":[279886,131210,189692122,32772,0,0,0,0,4194351,8388672,9044106,1164,589824,0,0,0,-2147024892,1,4980736,5242896,56,-2146959360,2,6029312,-265289547,32769,17891328,-265289396,32770,0,1313818119,1380533332,1146047750,5132869,0,1313818155,1397051988,1313817376,1431193940,1397970255,1229734211,975193934,1685015840,544109157,1952797480,691086112,1291845632,543912545,65538,189137152,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1879048192,65281,288423968,536878592,24190,0,128256,0,1867317248,1852990820,512,1357825,692267008,1886339872,1734963833,1293972584,1869767529,1952870259,943272224,53,0,0,0,0,0,0,0,603980032,50332160,67115264,512,45875200,536871167,1192192,2116026399,94,0,501,0,1685015808,7238245,1802658125,539903008,189137152,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624]},{"sector":9,"data":[65536,131108,1638403,131076,-1879048192,65281,288423968,536878592,24190,0,128256,0,130048,268435456,167772160,268439552,352328192,335556096,402678016,436248064,167830272,234942976,234948352,268508160,436284160,167851264,436291072,167856896,369186304,335633152,335642112,335644416,335651840,335659776,335662848,335671808,335683840,335686400,335701504,167941376,167947008,402835200,436391424,402839552,302178048,453183232,302215936,352551424,352562944,352572416,319025664,302253568,352589056,369377536,134500352,268719360,352610816,285505792,402948864,369399552,369403392,352637184,369421056,352656128,335886848,268788480,369454336,302350848,403016704,335912960,302361088,335918592,235259136,235264256,235265536,369488384,393216,168165376,319164160,319172864,302404352,319188992,302420480,201766144,319210752,319222016,134677760,168236288,285682432,134691328,503791360,319250944,319256064,319265024,319273728,218619136,285732096,201854976,319299584,268973056,369638912,285757952,268983296,285765120,235437312,134793728,235458304,403250176,608768,1685015808,7238245,263552,83918862,16843263,-255,263296,-116883449,192939776,-2145322752,553246733,250477184,116490240,142606350,-2145583104,486597380,-18217600,-50332162,-33424128]},{"sector":10,"data":[16908290,33620226,33687041,16843009,-33357822,-66978558,-16777984,68518142,92280302,131819,-33358078,-33489407,33423614,50266878,50397696,50332417,-2130771201,33427196,33555199,131586,-33423614,-16843264,394264830,-65523,-16711681,-33358079,-33292795,-66978302,-512,16711679,33423870,33294335,16646655,-16842754,-16646401,16908290,84083203,33686023,16777729,-2130771713,-63995,16908033,50266624,192938495,-33358336,-16450045,17039365,33817093,-2147352061,33685507,67240706,67110145,83756543,50201598,657536,-134512628,8390154,-2147027206,301991693,318240640,403079168,-65025,16908033,50266624,75497983,-2147479024,33494789,-16711423,343998463,-2145325568,33358857,100598782,83952384,16974594,-16580606,-83755774,-67109632,-131586,109052158,67043848,-2146107139,-16774908,-16646655,327426,16843010,33554945,66978559,920310,184812928,50919936,16843264,196865,-33292542,-50201342,-768,-2130771969,251003917,-75497457,-2146107150,16122895,-16709121,261891,33685763,33555201,50201599,16581117,-3,276889343,-33620217,-50266369,-16515583,17104901,50463236,50331905,33424127,-65283,-33620227,-50266113,-16581119,68255747,-58714634,-2147479829,33358856,33555199,16908801,16974084,33620482,50266880]},{"sector":11,"data":[33358335,-196356,-16777217,-33424128,-16515582,-16580860,-33489407,-131329,276824316,-33292533,-16646910,-16777984,16646142,50135551,33489918,33620736,262402,-33161467,-33424125,-768,184910078,16843263,-255,-15990656,16843009,-2130706433,33491717,-16711423,25231359,-16646387,33489407,-16646143,-2147352830,166725396,75499792,-2147479027,1181422,268895360,-2146832375,-16774909,-16646655,327426,16843010,33554945,33489663,50332412,-16449408,16843009,-2130706433,-16839662,16646142,33489406,50332671,16908801,-16646141,-75432447,-16580872,16973827,-2147417854,150992135,16908800,-33423358,-33489663,-16777729,-65794,16646141,33423869,50266878,50332671,33620737,16908802,196867,-16580861,-25100543,589811,-2147417854,368575497,149620864,-101482475,75497482,-2146107388,649984,16843011,33554945,33489663,-142605827,50333952,16843009,-16580606,-50200830,-2147420415,-16840430,-65794,33423612,50266878,83887103,33620737,16908802,-16646140,-33423870,263296,-352288747,16973831,33620482,83886849,50267135,33358590,75497721,-2146107388,912128,134935424,200835072,75497485,-2146107388,912128,134935424,152207360,-16843009,16580606,50201086,67044095,50398464,33686017,262402,-33358078,-50266623,83950464,67403776]},{"sector":12,"data":[243275008,-2146107157,980466,263296,67928085,67047424,33423871,-130818,-33554433,75562496,-2146107388,250800910,167445888,67403788,8393984,-2147480576,352322564,149618816,-351764459,142611960,-2146107157,352322564,250282112,-352288747,159388928,-33423868,-16580862,17104899,33685763,67174914,50266624,33423870,-327427,-16842755,-50331906,67403776,8393984,50334187,16843009,-16580606,-50200830,-2147420415,33424393,50266878,83887103,33620737,16908802,-16646140,-33423870,-83821311,-16777729,-65794,58720508,-2147088879,352322564,166396032,16843520,131329,-16580862,-150864639,491520,293604103,-33620473,-50266881,196097,16908546,100729345,16843266,131329,-50135549,-50267135,-2130772225,352322568,250345856,67403776,50401024,16974338,-16580606,-50201086,25227520,-2146105340,368634632,84148864,-351961067,92280315,-2146105877,368831237,235144064,-352288747,25171442,657412,-351764469,293604088,-2146045436,977664,236319360,294912,25174016,-2145386272,516351,119601536,67141632,159389710,-2145386496,536928257,132184448,553222144,58720263,150669330,15761413,67697672,-16513408,196353,16843010,-2130706433,234883855,-17497984,-33554690,-33423872,261890,33751298,50397698,50266624,67404030,8393984,50201333,33555455,16908801]},{"sector":13,"data":[-16646141,-33358333,-33489663,-2130772225,-16904689,16646142,50201086,33555455,33686273,196866,-33358078,266112,-184516587,-65794,33423613,67044094,50397696,16908802,-16646141,58785282,3089,-65538,-33554689,-33423872,261890,33751298,50397698,50266624,67797246,33423614,285213695,133365120,185565184,67047424,33423871,-130819,-17888896,-33554690,-33423872,261890,33751298,50397698,50266624,67404030,8393984,50136054,33555455,196865,67338250,-16711423,33554431,459136,67469326,-16711423,33554431,459136,-33292527,-2147418623,352322564,-151909760,-66813942,75499527,-2146107388,234883844,66453632,67044093,16843264,-2146828285,-50072064,261890,50397442,75500032,-2146566133,-50072064,261890,50397442,142608896,-33423861,261890,33751298,50397698,50266624,16581118,-16908290,-33554690,184844288,8393984,50201326,33555455,16908801,-16646141,-33358333,-33489663,-2130772225,352324367,-17956736,-33554690,-33423872,261890,33751298,50397698,50266624,184844542,8392192,50135544,67044094,235831296,-131329,33358077,33620735,17105154,33620226,50266368,16581117,-16777219,263552,33751313,-2147483135,520952,722048,33751306,33555201,-2130902017,234944000,101384832,-234455026,58724090,-2146565109]},{"sector":14,"data":[251458052,82969728,-234586098,58724092,-2146563317,250999296,101384832,-234455026,83758842,33424126,243269887,-2146503413,782848,185529728,622592,33489406,33555199,16843265,33554945,25166590,196594,16908546,131329,-66912510,16909314,-16646142,-16646398,16908290,-218136574,33554946,33489663,33555199,16843265,75497730,-2145386496,16908293,33620225,50266624,50266623,33686016,32702336,-16646142,-16646398,16908290,-66976766,196354,16908546,131329,-2147287294,50262529,33620480,33620225,50266624,33423871,1246080,50135550,33555199,33752065,33554945,-2130836993,-33488146,196354,50594050,131330,-50200830,1632501248,1142975346,1632903214,347603200,1126694912,1866670121,1769109872,544499815,1919117645,1718580079,959520884,13624,0,0,0,0,0,0,0,65536,131108,1638403,131076,-1140850688,65282,305201184,536878848,24190,0,128256,0,130048,268435456,184549376,302001152,352342528,318793216,402704128,419496960,184651008,234993920,235005696,268571904,419584512,184710656,419602944,184725504,386059776,335731712,335751936,335757568,335773952,335796480,335804416,335829248,335859200,335864576,335898112,184933120,184948480,403071232,419850240,403080192]},{"sector":15,"data":[319195904,453441280,336028416,336037120,352835328,352854272,319315200,302549760,352890624,369689856,151595776,285817088,352935680,285836544,403283200,369740032,369748736,336214272,369781504,336250624,336266496,285956352,369849088,336306432,436975872,336323840,319553792,336338688,235684096,235689216,235690496,369913344,818176,185367552,336373760,336391168,302854144,336424448,302887424,235796480,336470784,336494336,151956736,151968000,319751424,151988992,521091328,336561920,319796480,336591616,336609024,235963136,286304512,185664768,336666880,269569792,403793664,303141632,269594368,303156480,236056320,135412736,236077312,403869184,1227776,1685015808,7238245,263552,-2147483378,127743,-8385024,130820,16843009,16711936,-1,16809984,65792,16776960,-16513664,-2147090431,117438977,33096064,-2147025407,33552650,25167360,-2147024902,16906497,192939774,-2145322752,553246733,250477184,116490240,159383566,18677760,-469794816,486539265,48891008,-33620480,-50266625,196097,16908546,17041409,131329,-50135294,-33489663,-2130706433,-3831,16646142,33489405,33620480,33686536,33554945,33489663,16581117,-16842755,176160770,-2147287808,367920149,48956800,-16646142,-33423870,16711168,50201086,33555199,50397953,50266880,251429119,50266622]},{"sector":16,"data":[33686016,-16646142,-33489407,16711422,-32827776,-16646656,-16318974,-33423614,-33489919,16711679,33423870,50136575,16646654,-16842754,-33488897,196353,33751298,50726147,33620483,-234848256,16646400,25166334,-33357825,-33358074,-66978302,-512,16711679,50201086,33359358,16646655,-2130771970,-130815,33423615,-65152,16908290,84083203,33686022,513,101154817,16712191,-16711681,130817,50331905,33424127,16384384,257,-2147418113,16843265,-130944,688132,66978558,100599038,83952640,50463746,66050,31522688,-33358336,-16450045,17039365,33817093,-2147352061,33685507,67240706,67110145,83756543,50201598,-8388607,33554912,33751554,327940,-33161468,-33292796,67665922,167903743,8389119,-2146696972,16905216,16845566,33028992,17172480,-84508672,-159382006,167837946,-2147418108,16775680,16713464,-151385472,-99975162,83230976,209715456,17891335,-268468224,285212673,301463424,-2147418112,16842735,125829137,-16646376,16776960,33489407,65792,-33358077,-100564991,65792,16776960,16908672,-33521663,75498751,4367,-1081343,1114368,-15334016,16842753,16777473,-65281,-2147418113,16777472,-16777215,343933183,18935296,-535724032,552468481,-50067072,-16515583,16973829,50528773,50332161,33358591]},{"sector":17,"data":[-196357,-33685765,-2147418369,66978302,50333183,50464001,67108736,50332161,33521919,-83755774,-67109632,25230846,-16777983,-2147353344,-16644090,352386307,15727488,50266625,18022654,151289856,-33423616,-16580863,16908292,33620225,50266624,183960574,32505984,33488896,83821310,16843264,-16646142,-150733310,-16678902,16777229,234943104,67469312,167313419,16252032,-2147481087,167378688,50266496,33620736,196866,-33292543,-50201342,-768,33488895,-133922816,16973827,-58719486,16909308,-16711677,-2147287805,67042308,16581117,-16777219,-50134144,118325502,70144,15401088,-352288747,987381,-135005312,-16744435,16777230,-16513664,-134053879,8390655,2808,16220161,-159383543,67044103,33620736,196866,-33292542,-50201342,-768,33488895,-134184960,-16646143,16973828,-58719486,16909308,-16646141,-2147287805,67042308,16581117,-16777219,-50134144,84836606,66049,-131329,33358078,100598782,67175680,16974338,-16580607,-50201086,-33554688,-131330,33358079,176161534,-16777737,-2147353344,67043073,83887615,33752065,50134144,16843523,50266880,83656957,-50201085,-33554688,75562749,-33686012,-50266113,-2147222015,50199556,58721279,-167768572,-335773675,852224,-151060352,-2147483371,33358856,33555199,16843265,17039618]}],[{"sector":1,"data":[16843010,50332161,33358591,-196356,-50266369,-16646655,-16449790,-16646398,-33489407,-131329,-25165572,196353,33685762,33620993,16908801,-16580606,-50200830,-50267135,-1,33358078,50201342,50267391,16646655,-2130771970,-196351,33358076,51445632,425986,260111875,-50135538,-50266367,-65793,33489149,66978557,50332159,16908801,-16449532,-50070011,-50266623,33488895,-2147352320,67105545,75498237,-50069764,-50266367,-2130837761,-16972796,-16712193,-33293055,33881216,33489917,33620736,-50561021,67174915,100599040,25166846,-33423873,-2130707200,33491717,16843008,-16711679,-256,8388863,16842753,-65536,167804928,16777727,65793,-16711935,16777215,65664,257,-2147418113,33491717,16843008,-16711679,-256,8388863,16842753,-65536,201490432,16712191,-16711681,130817,50331905,33424127,16384384,257,-2147418113,16843265,-130944,118784004,152046064,285934720,-2147418112,16842735,-276824047,4359,-1081343,1114368,268895360,-2146832375,-16774909,-16646655,261891,16843011,33554945,33489663,33358334,33225344,33488896,67044350,16843520,-16646142,-50201086,-100958207,92339715,-2147351808,66847744,65152,260,150962428,16777727,65793,-16711935,16777215,65664,257]},{"sector":2,"data":[-2147418113,-16839662,16646142,33489406,50332671,16908801,-16646141,-75432447,-16580872,16973827,-2147417854,150992135,16908800,-33423358,-33489663,-16777729,-65794,16646141,33423869,50266878,50332671,33620737,16908802,196867,-16580861,-25100543,589811,-2147417854,368575498,-101840768,-2147418350,302509576,-125829119,-2146105109,719603,201454976,67403776,25171200,-2146238228,584959,16843011,50332161,33489663,-109051395,50333686,131329,-50135293,16351233,16973831,33620225,50266880,33358335,25166072,50333686,131329,-50135293,-2147419903,-16840430,-65794,33423612,50266878,83887103,33620737,16908802,-16646140,-33423870,-720768,-65792,-50331905,-33423872,261891,33751301,67174915,33489408,33423871,67403776,25171200,-2146238228,519423,33685763,50397697,67044608,50201343,16318973,116130176,16843520,16908545,-16449533,-16580861,-100532991,67403776,25171200,-2146238228,847103,184677760,-2130771968,396021,-92274432,-2147482112,723450,-192937728,-2147480576,352322564,15466880,-2147418348,846592,184677760,-2130771968,396021,-92274432,-2147482112,-16840430,-65794,33423612,50266878,83887103,33620737,16908802,-16646140,-33423870,16514048,-457344,-65792,-50331905,-16646656,-16580863,17104899,16908547]},{"sector":3,"data":[67174913,33489408,16646655,64765,67404031,8393984,491,-2147418347,16771854,70912,15401088,-168591339,-192937972,-2147480575,352322564,-8388607,491,67928085,67047424,16646654,-33554434,159383807,496,-16515312,-33423871,-512,-2130837505,352322564,-8388607,491,-351436779,217317631,-202109568,-66879475,68617,167049088,67403788,8393984,491,32788,16777227,201389184,67403776,25171200,-15728400,-268337152,-125825017,-2146301717,318303752,-101513344,-267943920,69632,15401088,67403797,25171200,-15597330,-301891584,-226487795,-2146300437,302050816,32374912,-2146107392,33424393,50266878,83887103,33620737,16908802,-16646140,-33423870,-83821311,-16777729,-65794,25166076,-33424127,261891,33751301,33620739,50266880,16581117,-16908293,-16777731,67403776,25171200,-15466260,-352288768,16908297,33620225,50266880,33423871,8388856,33556726,131329,-33358077,-2147420159,33424393,50266878,83887103,33620737,16908802,-16646140,-33423870,-83821311,-16777729,-65794,25166076,-33424127,261891,33751301,33620739,50266880,16581117,-16908293,-16777731,285376512,66821,33290880,-2147154688,352322564,15466880,-2147418348,584448,16843011,50332161,33489663,16318973,133562496,16843520,-16580606]},{"sector":4,"data":[-117310206,17137664,68102,116849280,118587402,-131330,33358076,33555198,16843265,33882370,16843010,50332161,33358335,-130820,16711679,-17756544,-16777472,-50266881,130817,33685762,33686785,16908801,-33357822,-66978558,-16777984,84443390,25170944,-15466260,-335904768,16777229,16774016,-2147480319,251659268,33686273,131331,-33358077,-251593471,16839296,17760256,50397443,50332161,33489407,32571645,67272704,-125823736,117441003,-301432814,318308607,-118617984,67272725,-92269306,83886571,-301629422,92279547,-2146239503,302378501,99351424,-301563886,318439679,-85064064,67338261,70925,32240256,-2146104064,16771840,243275251,-15338517,67272704,184551943,-125829119,117441003,-167280630,184090879,-101316480,-2146762742,368247824,-202699136,-335577067,-226492402,218169344,334790656,16777229,234943104,294912,25174016,-2145386272,516351,119601536,67141632,159389710,-2145386496,536928257,132184448,553222144,58720263,150669330,15761413,67697672,-33290368,196353,16843011,16711936,-1,-2147352832,16777217,-16777215,8388863,-2147155972,16907776,724864,-2147483378,127743,-8385024,-16843019,-33489409,-16581119,16908291,33686019,33555201,-2130836737,-16975872,33423613,67043839,50397696,16908545,-33292285,263296,-2147483371]},{"sector":5,"data":[125951,8393984,50201333,33555455,16908801,-16646141,-33358333,-33489663,-2130772225,-33228800,16908291,50397441,67043840,33423871,-17039107,-32632960,-33554690,-33423872,261890,33751298,50397698,50266624,-134184706,-16842241,16646142,33489406,33555455,16843521,196866,-33423614,260047105,18153476,-335577088,352321537,-17432704,-33554690,-33423872,261890,33751298,50397698,50266624,-134184706,16645884,33489406,33555455,16843521,196866,75562500,2834,-65539,-33554689,-33423872,261890,33751298,50397698,50266624,-67796738,-33554422,-65793,33423613,67043839,50397696,16908545,-16646141,16907777,-33289344,-16646656,17891331,-352026624,16646400,25166334,262143,-218333167,16777223,16775552,-2147481855,16714512,67047168,33423871,-130818,16711679,15600768,-33292529,-50201086,-16777728,-250904322,-65794,33423613,67044094,50397696,16908802,-16646141,8453634,-33620744,-16646656,261889,16974082,50397697,-2130836480,352322564,-8388607,491,-167739371,-16581373,16908291,167772929,66516352,50266878,16843264,17432578,67403776,16777727,65793,-16711935,16777215,65664,257,-2147418113,234882560,-8388607,498,67403790,16777727,65793,-16711935,16777215,65664,257]},{"sector":6,"data":[-2147418113,352323072,-8388607,491,67403797,70912,32243584,-2146107392,16773643,192940790,-2146699786,117898243,-109051902,-2146957320,352322564,-8388607,491,184844309,69120,32702336,-2146566144,-50072064,261890,50397442,-176158208,50201590,33555199,131329,-2147483382,-50072064,261890,50397442,-176158208,50201590,33555199,131329,-2147483382,234883844,-8388607,498,-167739378,-16581373,16908291,167772929,66516352,50266878,16843264,17432578,185106432,50201086,33555455,33686273,196866,-33358078,-33489663,-16843265,16646142,-33488768,-16646399,16908291,33620227,33555201,33489407,-130819,-16777219,-2147418625,352324356,-8388607,491,-301957099,-16581118,16908291,50397698,67043840,33424126,-130819,8453886,66979064,16843264,196865,-16515326,-50201087,-2130772992,352324367,-8388607,491,-285245419,-65794,33423613,67044094,50397696,16908802,-16646141,8453634,-33620744,-16646656,261889,16974082,50397697,-2130836480,234883844,-8388607,498,-134184946,-33358591,261890,17234048,50201342,1023,235831551,-131329,33358077,33620735,33882370,-8388350,131583,-2147287295,33423105,-196355,-16711296,-2147418114,16775179,25231103,-33555199,-2147353344,50331393,-8388095,83952383]},{"sector":7,"data":[16843266,-16711678,-50201342,-768,67469566,70912,32243584,-2146107392,520956,-109051648,117506303,184844288,50399744,196866,-50069758,32961920,17432576,33620482,67043840,-167739138,69120,32702336,-2146566144,235277058,32701056,-2146695936,16774150,109055227,-2146501900,235211523,32701312,-2146761728,201127172,-50854784,-184254453,-58717436,-2146761486,16774405,92277756,-2146501643,235604739,-192937983,184549874,-234848242,250937599,-168686464,-2147418354,235277058,32701056,-2146695936,16774150,167513339,-85259648,-16253682,202211328,209718774,-2146568462,848894,62592,-2147481087,658680,-192937728,-2147480576,33423369,50266623,33620480,33620225,50201088,-917120,16908290,16843010,-16646142,67304450,131330,-16580862,196353,-2147352318,33747711,50266624,50266623,33620480,16908545,1152,360480,16843010,33554945,33489663,33555199,-8388094,131570,-16580862,196353,67240194,-16581630,16908290,16843010,-16646142,-234782718,33555198,16843265,33554945,33489663,58720766,33423379,50266877,67174912,33620483,33489408,49185022,-16581119,16908290,16909060,-16646142,-33489663,1802658125,539903008,352840698,-320141696,-352026603,109051910,-2147482112,398824,100664960,67534848,201132548,82509952,-2146697974,183954189]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[1936287828,544434464,543516788,1953394531,1937010277,543584032,543516788,1701603686,1128415520,1415074862,2573]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[30169677,45,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":5,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":6,"data":[279886,1704183,190934735,131078,268436480,74332,131072,196610,4194370,14155856,15073504,1297,262147,0,0,0,1281949782,1282011440,96601417,185467153,-2147418108,1,94765056,-265289711,32769,-2147352576,2,95879168,1048582,32769,96272384,1048579,32770,-2147287040,1,96468992,-265289663,32769,-2147221504,1,100728832,-265289726,32769,-2147155968,1,100859904,-265289708,32771,-2147090432,1,102170624,-265289725,32769,0,1279345412,67,524289,100663308,1314014539,1191398469,1426344260,22168915,1070399999,17398273,33489408,1744912333,1070399489,2647809,1766664192,1936683619,544499311,1684957527,544438127,1668047171,1952541813,1092645487,1768714352,1769234787,28271,1279345419,1145984835,1129271888,1090846721,1414876994,3,0,0,0,-2081649835,-1202320148,1344144900,16777114,-96040704,100941440,-1207601875,65732618,-1996486216,783874118,79187968,-397402618,-998042738,1958742790,-129564925,185218815,16777114,1458604800,-150993224,50740270,1342866950,-150993992,-1727498706,-120470997,176686595,899152,104607479,1983315792,6469640,1375797178,22387280,1048772608,1946159744,297293364,1009710848,-1580692730,787940924,-936703220,176557571,243793]},{"sector":7,"data":[141962999,-775804007,-2012871688,-591900662,-11526646,-351597514,1183536716,-96060936,1183516029,-1962677254,788002886,-930412996,-150990152,721828910,-2046426175,62410762,1982789376,-1037330168,100923601,-1202713976,1344144900,972572299,92142150,-335919477,-129594621,-26032,1048772608,1946157072,112744008,1009710848,-2046426362,1990283274,62494984,-1946552576,243912,141962999,-775804007,62981112,1342867462,-1727644511,-120470997,141992272,-775804007,1119375608,1347590400,16777114,171376384,-6662645,1577058559,-1017256565,1167087646,518818645,2122438798,1963004172,242679569,1342177720,16777114,112640,2122385899,1946226700,-2084557836,-443874579,-900899553,-1957363702,183272428,1187468887,721420542,245503,16678531,-8167563,-1957004026,126551646,-1577564535,-269023684,-150993223,-1194816535,787939342,-1147599300,-67698678,1317652483,768246,104607479,244121,1174665719,-2046426122,-129615094,1183520894,-2046426122,-129615094,1187448701,-352321026,-373281885,-347668345,-25263205,-940411904,65094,1451030027,-150440287,-1948200466,702664,141962999,-930365141,-150988872,-1727498706,-150969157,-1983370245,-1047791538,141954699,-1056710191,176686595,990273163,327025223,66602635,990545926,-1585642937,33441479,1308748544,16678531,2122557044,-1921777410,-1996071285,106859319,1459781513,74907478,-2097148696,28837572,-1956684288,1438866917]},{"sector":8,"data":[-326898549,-11118844,922682486,-6681848,-16776961,179831926,-6664192,-1962934017,787941446,112789052,-1947601152,964848,104607479,702873,-268174857,-150744648,-1727498706,-150969159,-1946645511,787940934,-523171722,1996486699,-2043280636,1040406026,-1202255224,787939339,-1181153732,-101253117,-1202665981,787939335,865667190,-1178457150,-120389630,-1037319629,-1588541693,-523172292,1983315792,57842184,1996423168,-1202235900,787939339,-1181153732,-101253117,-1202665981,787939335,865667190,-1178457150,-120389630,-1037319629,-1588541693,-523172292,1983315792,-26104,1599995904,-1017256565,-387151019,922689010,-6681898,-1962934017,1438866917,-1957237621,731448390,-1946627646,1226992,104607479,909766699,92145212,-351912799,-1547269374,1183517318,-1037330170,-259262255,-150993224,721974830,1983265264,-1593475576,48957558,-2002532725,102540042,-150991688,50886190,-1559590906,-2036267488,102408970,-150985544,50740270,-1559591418,-1956772322,1438866917,-326898549,-1588177104,1183386246,833750,141962999,64243337,1208649734,-1579661687,100862598,1183385148,-666465318,-1948498295,1183439430,141992414,-775804007,-767129096,64767627,1183437382,2406624,104607479,63981193,1208649222,-1579006327,1183386248,-498693148,-1947842935,1174660166,-398030382,65160843,-1996080122,1183574598,-330921496,-1593542913,-523172292,176555523,176726352,141952515,-797537456,-729904298]},{"sector":9,"data":[4372567,-1706012007,1249,-1207666945,-1706033151,1322,87071312,1996423168,176595204,104596995,141992272,-775804007,-2012871688,1465274378,-1174396488,1347551472,398746,2406400,104607479,213446795,1982789376,-488696,906167414,55970438,1460308030,16777114,74907392,50740385,1990283462,-1037330168,-956041007,-26032,1996423168,571396,95918672,-1706033152,1451,-1929087233,1343673926,1342178232,348826,74907392,383927949,243792,-26032,922681344,-6682538,-1207959297,787939342,-1181153732,-101253110,176555523,-1192081783,787940305,-1181153162,-101253020,176686595,-768375,-1928656330,1343681094,16777114,74907392,-887041,-6622090,-16776961,922682486,-1113978794,-16777211,129500278,-6664192,1342177535,455834,176595200,-1577564535,1183386248,-59340294,-1912701303,1343682630,1342177720,-26032,1996423168,-129594108,922701846,-6681848,-16776961,922682486,922684038,-963966328,176555563,734497616,1342867462,-1174396488,1347551472,31386,74907392,-2096668440,196608708,1009710848,96049414,-1946552576,833776,141962999,1996486795,-2043280636,330847754,1982789376,179935496,66713344,-1962244034,1372072911,503334840,178256,109484624,1996423168,666392068,1982789376,179935496,737801984,1356396487,503335608,178256,111843920,1996423168,1001936388,1982789376,179935496,737801984,1356396487]},{"sector":10,"data":[503336376,178256,114203216,1996423168,1337480708,1982789376,179935496,737801984,1356396487,503337144,178256,17209936,1996423168,-26108,1183383552,100835822,953241,1039791878,1232994305,-1149185,-1710571466,1853,-1207666945,787939488,-1181153732,-101253115,176555523,2799696,141962999,702873,100923895,-1588589944,-523172292,1983315792,-294191352,1347469355,-352318280,-294191289,142096127,176026,74907392,-150953800,-1727644626,-150993479,-2046426119,733499402,1982789376,179935496,66713344,1342867462,-788120415,922702048,1996425334,1354771438,1030224,548950096,13416960,-6664110,-16776961,-207950218,1577058314,1575324511,-326412861,178929283,-385649408,113705099,2730,104347391,102905599,510874,1446444800,170433032,922681344,922682936,-224786346,-16777209,721827894,-1202696000,1347420210,-1174396488,1347551472,305306,943128320,1412890374,79337992,922681344,-1070922184,196628560,1009710848,62494982,1358558976,-150992968,-1727498706,-1037319629,-754974023,734147576,1017204930,1356910854,141965055,210586,74907392,-150452597,-1190773714,-369688570,246990987,1009710848,180066566,66844416,-2045901880,1183535370,1982789382,-1948200696,64075976,141962999,6601625,-1054082057,176686595,768080,104607479,244121,-1588528649,-523171722,943128400,1354771206,2144336,1375784122,-26032,-443875328]},{"sector":11,"data":[-1957313699,149717996,-164932009,351815367,75399936,-1610123922,-1986524542,1303905350,-6664192,184549631,-1960280640,725419078,1027830784,1165230125,1946174269,5389585,1664953716,1023898624,594804850,1187448299,184550404,-1959954954,1065416798,-14322688,126548038,71711640,29288821,-941298944,197702,1187503595,-352321020,71747542,-806682623,1249179147,-1576335712,2123041406,351240696,922701568,1100614410,-1996488704,-947127738,440729,-1957496329,-101213753,-92864688,-2080814872,922683076,1996425994,23042810,-2054553600,1352138772,-2095719960,-963968316,-443850914,1478411101,-1957345904,-661774612,-1959859069,4000838,-385649407,58065501,1023614441,1215561729,1962934845,21686531,1946158397,408853,255664756,-385649408,339542287,-379882496,1996423379,142016266,-402229505,-997983803,52881670,687747,501810037,242679555,16777114,51570944,-401705217,-997983854,50784514,503716536,142016336,-1710852353,65535,208977931,178796287,231322,48687360,181810943,1996485355,-196702962,-6664170,-16776961,-1710735818,1371,-1928694017,1343681606,138295039,16777114,45541632,1195651,-385649664,1996423852,108461832,-401705217,1911096010,-2143386625,57933834,-2096983063,4670,-1981217932,172395266,1946157373,146696,2045315444,304211970,-402492439,1843990844,172395266,1946412861,242679575,-15960321,1996425846,108461832]},{"sector":12,"data":[16777114,38725888,104478463,-1728052296,1996443730,2083979022,2050424584,-26104,837353472,242679554,382879373,-26032,1996423168,-114562862,-16595837,1183649398,-1706027310,65535,-369814040,922681864,-6683080,-16776961,-1710874058,2835,104478463,16777114,81152,922690677,479856726,-16777205,-1710735818,2853,142096127,732826,-1070137600,-26102,-1070923776,-26032,-1175912448,-230242559,1996423168,-26098,-1073020928,28840308,-6664192,-1996488449,-6622650,-16776961,614076022,-1996488692,-1202652090,-2091909118,1946219134,-339727612,112643,194353744,1048772608,1962934290,23783683,-1191414017,1347420161,763290,-59310336,1342177976,1342177720,16777114,21686528,1195651,-385649664,1996423488,200514062,-1073020928,837354356,176063233,-2096270783,2002389630,172395271,65740812,-1995815285,-397407674,-997983040,1975520002,17492227,-67095,-6680970,184549631,-385649472,1183514872,2964746,1211960692,1031762944,980680817,-2097093655,4670,-639040652,242679552,-1710328065,3136,178256,8435792,208247376,-1981284352,242679567,-1710328065,3163,178256,1048786411,1946157074,10676483,-15829249,2006584950,1342177292,1342177720,1342210232,820378,271706112,-15829249,-6680970,1342177535,1342177720,-1705983957,65535,1048800491,1962934290,354216037,2122539243,1517635594,1181383]},{"sector":13,"data":[79167488,-1202708986,1344145472,16777114,-30086912,1963004221,-39982845,20780407,1037267969,57999618,1040114153,-965476091,1040039657,57999634,1040035561,57999638,1040079593,57999872,1039992297,57999873,-369275415,-310116965,535137026,181030237,-326413056,1443163267,-150993224,-259324818,-1979288061,-2013260668,1587084870,-1017256565,-2081649835,1448543980,-1710983425,2363,-1923682165,1343620678,1342177720,16777114,184983552,-1928692062,1448085062,-2081140760,-125107004,1443133183,615066,1962871552,142016277,-402229505,-997982313,1357130244,-2095983128,-2014838076,-1956684046,1438866917,-326898549,-11118836,922682486,-1248196524,721420295,1476340726,74907478,-2080769304,1996424900,104636676,112848887,-1947601152,1882312,104607479,703385,-939262985,176557571,141992273,-523112713,213436555,1982789376,-1950274808,1292488,141962999,737933209,-2012347448,112742666,65992448,3016135,28856350,1654280192,1191182342,2080833411,-24951150,-7701500,95945846,1009710848,-2046426362,62410762,1982789376,-2012871928,347623434,1009710848,-2046426362,-2002694134,1980105482,1017204744,1356910854,-787974495,765087968,1577058312,1575324511,-326412861,1461120131,205949782,-402244957,-1073020227,-1070922379,-2097015831,1962936958,209125138,-2097016856,-1073020220,1105789812,-1840383,1991772790,45633544,-1617276928,-16777202,1018694262,45633542,-1348841472]},{"sector":14,"data":[-16777202,-659027338,45633546,-1080406016,-16777202,12061302,45633542,-811970560,-16777202,45615734,45633542,-543535104,-16777202,1421347446,45633544,-275099648,-16777202,146279030,45633547,-6664192,-16777202,1454901878,45633544,261771264,-16777201,1052248694,45633544,530206720,-16777201,-692581770,45633546,-6664192,-16776961,-1464333706,45633546,1067077632,-16777201,2025327222,45633544,1335513088,-16777201,-1061680522,45633546,1603948544,-16777201,-1061680522,45633546,1872384000,-16777201,-2101867914,45633546,-1885712384,-16777202,-1207551434,-1202716671,1344146058,1342185144,1022874,976682752,178182,182237264,515395614,-1097183232,-1207959537,1344146140,3482,185377536,104478463,1342178232,504033464,1357904,-26032,113704960,68266,111305648,176071179,-1157627976,1347616767,104478463,16777114,142254848,142349961,503337912,176863312,-1070903266,1375784122,1347440720,-11513776,1347423350,16777114,-1980724480,1443564086,-1705983957,65535,727185547,1347440832,1342433208,1342767288,1064858,-1070901504,183547984,-407351266,12079107,-6664191,1442840831,-1710983425,65535,-26026,350945280,384452237,-26032,1183645696,-1706027286,65535,384452237,1354771280,-6664112,184549631,-1948682816,1600056902,-1034033781,-1957363702,82609132,184606440,721778112,8645056,184633320,-1191938880]},{"sector":15,"data":[-1202716608,-1706033126,65535,-244087,28836982,1347590400,16777114,-60912896,-1962129527,1204288606,-956301038,5191,-1191420277,1200160856,408914966,-1577296245,1200162878,-60912880,-1996208501,1586170439,50841596,-60912896,-16627769,71813119,1183580159,-1706025220,65535,-2089500661,-1694730497,65535,-1962933832,1438866917,-326898549,1354771202,1144986,-28931840,74825739,837533739,-1694599425,1750,-16369501,850984566,-1706012672,65535,-2096749917,407614,-1072965004,-1070868876,-25755824,1169818,1575324416,-326412861,1445129347,-1705983957,3372,-166989685,-1070922635,-1923721237,1343676486,16777114,-532247808,-1962379613,1017375302,414733830,-1063628800,1023410193,142475266,181929671,116064257,181929671,-1202323456,-1706033112,4557,1443233955,1342188216,16777114,100836096,1448132651,874906,-443851264,-1957313699,49054700,1354771286,1178010,139764480,1342178488,308378,185115392,181943939,-1206750208,-4554881,-1706012160,4704,-351775069,571429,28856400,-1202696192,1344143454,16777114,1458604800,16777114,139895552,184326742,1048772608,1962936406,-373282043,1048772871,1946159832,16758790,-1207506023,1085964288,-1706012160,65535,185089699,735737024,12079296,1347590527,1214362,181838592,104478463,-1728052808,-6664110,-1560280833,922684072,28837434,1347590400,1223578,142123776]},{"sector":16,"data":[104478463,-1728052552,-6664110,-1560280833,1048775360,1946159784,2017362828,-2055995384,-2123055093,104478463,1342177720,504007352,2013264,317954640,-1073020928,1692992373,976683007,178182,182237264,515395614,278548480,184549395,-385649216,922746695,62391866,-256356352,-1202708982,-1706033132,4909,58048523,-54551,-1207551434,-1202716668,1344146050,1342177976,1017242,1975520000,-15865597,-1576369504,396492849,182237184,-1516613602,-1560281073,28838668,-443851264,-1957313699,116163564,-164932009,-16353537,-828767114,-1962934253,-1004868616,-1977220002,1183422464,25831166,-1979676634,1589968454,25699844,-147108026,1600053628,-1017256565,1475119957,149717846,-1962641779,-1526262020,-1197103707,-1202716562,-397407550,-998035993,180533260,1600051852,-1017256565,-2081649835,-11140372,1996424822,323459588,-259325952,1589908459,71761668,638076554,91555640,-352321096,1321634569,-427835381,-1956724693,1438866917,-326898549,-1202301158,-11534290,1996424822,-4921340,184992899,-15698496,1996424822,7583748,848973854,-1207959530,-11534291,1996424822,-7280636,184992899,-1089964864,1191116801,721611524,108462079,-1710983425,5492,512618635,-1175976574,-161575665,-1928270360,-402292194,1586302892,283175148,1589917931,126494212,1021855368,-1741720530,-1914288503,-622270882,-161575665,-1928362008,-402290146,-974646712,-1843491566,302966789,-386507123,1191121066]},{"sector":17,"data":[-167031292,1191167103,-167031292,1488480372,-11526648,1996424822,361536004,1488453632,-397402616,-997982576,-196688124,820709464,-1963696501,1183422471,-396456472,-1928364824,703130718,-1709273841,300607493,-1928173592,-402288098,1586303408,273475820,-196673714,-864029173,93986445,-1928395800,-397153186,-396684860,1586303026,250800364,1408654989,1527905256,185606632,-1928366849,-571935138,275572750,-386507123,1586302990,248441078,-402444101,817369090,-1956684285,1438866917,-326898549,71204884,192228614,503710904,101038160,-2144146658,805700670,79171445,-1706025466,5584,2113929789,-330906078,-314143443,79187990,-1706025466,5531,503710904,-330920624,-1382395882,-1962934260,1438866917,-326898549,-1084860666,1048576009,1965884932,783828737,79187968,-397402618,-997982722,1958742790,79185665,-1706025466,4967,-147066741,-24958092,-2146929407,805700670,-1974599307,-2071460794,1150092804,-96040703,2097154877,-338130172,768771,100960198,-1956684288,1438866917,2122378379,611659268,1342189240,503710904,-39786416,184992899,-1205307968,1344144900,503346872,-26032,401276928,-1325105536,250086773,-1978864641,-467008442,-11016112,-1962752893,1438866917,-326898549,-2141825240,1024097854,1961427829,100972547,-1964486626,79987709,-1946648947,-1526262032,-1197103707,1344144900,-2080541464,2123171012,384863216,-1515870969,103069861,1592283166,79987709,-1947697523]}]],[[{"sector":1,"data":[-1526262032,-1599756891,1033373208,57999402,1023540969,326369323,1962945853,10807555,1962946365,20310275,-1929193751,1038674014,-2111927027,221702149,2115010792,-262238932,-1928516632,-402292194,1860701476,-1923318256,434694238,-1575056115,264431621,-386900339,1458048268,-347833072,-396456644,-1928527896,-402292194,1122503928,-1926202096,-303501218,-2111927028,216459269,2098213096,-396456674,-1928537112,-402281954,1586302852,214886640,2114984168,-2147039482,-2097151734,688190,1290339188,-396456702,-1928547352,-1108807586,37218575,-387424627,512560292,-1645738622,266856460,1586310269,210954480,92413581,-401830936,1551765461,-387424627,512560256,-1981282910,-262238961,-401837080,1149046717,1586314475,208070888,92413581,-401842200,813567913,-386900339,512560212,1307051394,261613580,1586306685,205711592,94510733,-1928408088,904458334,260040716,113706622,68224,176176771,-385649664,1586299315,203090152,-386900339,-1628893524,-262238975,-1928590360,-402292194,1323830276,-385649393,1586299008,200730856,92413581,-401870872,947785529,-386900339,512560100,-571996798,254273547,1586302078,198371560,94510733,1586316011,197585128,95035021,-1928421400,-1175916450,251914251,921386621,-386900339,512560044,-1511520894,250603531,1586302077,194701544,94510733,1586352875,193915112,95035021,-1928435736,-2115440546,248244235,113706622,68224,176176771,-385649664]},{"sector":2,"data":[1586299135,191293672,-386900339,-353825216,-262238976,-1928636440,-402292194,-1696068784,-385649394,1586299155,188934376,-1928539672,1944641630,-396456692,-1928645656,-402292194,1994918700,-1929020402,65792094,-387948915,512559900,367527346,241166347,-2014772353,-262238976,-401930264,1586302102,205056216,-386900339,512559864,-236452478,238807050,1586300284,-1929122832,-504833954,-1306620662,182118405,2114856168,-1575056049,181331973,-387424627,512559816,-1041758846,235661322,1586300284,-1929122840,-1310138274,233629706,-386900339,512559784,-1578629758,233564170,1586300284,-1929122832,-1847011234,232515594,113706621,68224,176176771,-1928170240,2045306974,-262238966,-1928512536,-1477904290,-2143386869,779419658,-1928795005,-57935754,-1515911402,-605510235,147096569,79188050,703090694,113541928,1342571704,1342579896,-2094523416,1458046148,-1956684287,1438866917,-326898549,-1202301176,1344144900,-2080765720,2123171012,384863224,-1515870969,-128021083,-1928721432,-402292194,1323829764,-955679475,17465350,10086656,-386376051,512559600,-370670206,221505545,-2065104011,2118025216,309686538,-386376051,512559572,-840432206,219670537,-326931596,-126448376,118946955,-1515870811,-2096270360,2123172036,384863224,-1515870969,149717925,-1946650995,-1515870724,-115283803,1376306307,100972624,661579856,-1207516029,1344144900,-2080805656,-661977916,-1928758296,-402292194,-1092089484,-1206946548]},{"sector":3,"data":[1344144900,503347384,450009680,2129133568,-1956684288,1438866917,1048833163,1946159876,67553047,-1207959541,1344144932,503710904,452565584,65732608,-1963231000,413271110,1575324422,-326412861,182060743,79167488,-1202708986,1344143483,1358490,-2143386880,125108234,176045696,-954567325,17499142,103069696,2126008350,-1706025472,6980,102237894,-2147039488,-1962934262,1438866917,-326898549,727078682,-398029313,79187990,-1706025466,7034,384321165,-123213744,-1962621821,146204888,92413581,-402083864,443812857,55041931,-394297123,-1191873488,1344144900,384254861,485071440,783810560,79187968,-397402618,-997984202,1958742790,100972587,1218072606,-1962934252,-1132441872,1949304324,21270008,1038501513,75300875,65788043,-973075525,394375,-443850914,-1957313699,250381292,922703447,-1382413558,184549404,-385649216,28836015,-6664192,-1962934017,1979059184,10348803,483498582,1183383552,-61437446,-1980348791,1589966934,126494454,183649928,645428416,2084650880,1065362954,67403610,-1979454688,1183380038,1970093310,-163119303,653680324,-1952970870,2084650232,2136620041,541428997,-947191061,1946168125,2964780,1664946292,1026454528,594804850,553535174,1187382507,1191117310,-28931338,971526296,46433260,-337407512,-28916083,-957879550,-352059834,-28915999,1457253124,1896346,486447616,1035468800,233328640,46433260,1591961064,1575324511]},{"sector":4,"data":[-326412861,1443294339,185218815,738970,1958742784,-26035,1119354880,347623424,1347590400,16777114,200313600,1446212854,16777114,-96040704,201086601,1378055362,-1191545089,1344144900,1747610,-6662656,-1207959297,1448083457,16777114,190552576,-1956773888,1438866917,-326898549,-1202301160,1344146092,-2080972568,2123171012,384863208,-1515870969,100972709,-890744802,79987702,-1947173235,-1526262032,-1918523995,-840374178,-2111927034,113698821,2114588904,-262238932,-1928938520,-402292194,-18348364,-1923318263,-1444353954,-1575056122,156428293,-386900339,-421001572,-347833079,-396456644,-1928949784,-402292194,-756545912,-1926202103,2112417886,-2111927034,108455941,2097791208,-396456674,-1928959000,-402281954,1586301204,106883312,2114562280,-2147039482,-2097151734,688190,1586311797,105310440,-386900339,1586301264,125102328,-1928795005,-57935754,-1515911402,-1343707739,147096565,-1397206958,-35106806,113541923,-386376051,512558612,233309570,156755974,113707125,16,113706731,65552,-443850914,-1957313699,8501484,179091536,600238160,-955988861,4102,1575324416,-326412861,1461251203,179091542,-1293397986,79987701,-1947697523,-1526262032,-1197103707,1344144900,-2081055512,2123171012,384863216,-1515870969,-396456539,-1929011224,-402292194,-488110696,-1926464248,-1914113954,-2111927035,92727301,2114506984,-396456612,-1929020440,-402284002,1586301060,91154672]},{"sector":5,"data":[2097723624,-1925387452,1642653790,-2111927035,89843717,2114495720,-262238928,-1929031704,-402292194,-1830288056,-1927381752,1038674014,-1575056123,131000325,-386900339,2062026032,-955875832,17465350,-2143386880,846528522,-387424627,1586300184,128641264,-386376051,-326957498,-126448376,118946955,-1515870811,-2081127960,1347553476,1342876856,-2094870552,1586300612,82241784,92413581,-402333720,141887529,1050311,116064256,1050311,1599995905,-1017256565,-1964209323,111281222,1038363147,578027566,-722926730,212224,58097012,1023454185,57999361,1023447017,57999362,-385842455,1048772861,1962937050,75399189,-1206946639,1344144900,503350456,535468624,1183449088,1357130244,-2081002264,2122318532,58044676,-956248855,17488390,12839168,704923274,-85438236,46433274,182060743,-1360461824,-637090048,-402653174,113702529,-385874408,48758941,-1193153542,1344144900,504016056,454859344,113704960,2778,-335857432,-49551234,887681259,-387191810,1877736980,-352292632,-86644557,624780779,2012312576,277767,1475077492,1912613437,2833746,759007862,-343575552,6503750,527947636,1962946365,-9115389,1912614973,3751218,770245495,4013567,1961427829,1025567743,57999470,1040129001,57999472,1040141801,57999473,1040149481,57999537,-1946221591,1438866917,-326898549,-1202301160,1344144900,-2081198872,-661977916,-1929151512,-402277858,1586300500,78178544]},{"sector":6,"data":[503719096,-212866992,-1929067389,-259266434,-1515911402,1586341285,55765224,92413581,-402437144,142345877,-387424627,166396736,-387424627,-941096136,-1306620668,53405701,2114353384,-262238899,-1929174040,-402292194,1726481180,-1928823802,300478558,-1928729853,166260830,77129731,95559309,-402456600,511575625,94510733,-1929186328,-840374178,-262238971,-402462744,108856881,176162503,1048772609,1962936960,-396456654,-1929195544,-1847005090,-128021243,-2096890392,1988954348,385649656,-1515870969,-231151451,1376306307,100972624,545712208,-402209661,1600059841,-1017256565,-940799147,711174,-2147039488,-956301302,17499142,403097088,79167494,-1202708986,1344143494,2205850,179091456,-1984409570,-1706025472,8647,-1017256565,-2081649835,113706220,65554,503857336,100972624,-1835380706,-1207959521,1344144900,-2081282840,-661977916,-402508824,1183384471,-27883012,-1934077870,79187968,-1461170170,147096351,16678531,1183516796,-27882500,1183518187,-27882500,-763111177,-2082801920,159318522,-1073019780,-471334029,1575324637,195,0,0,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,939968299,-1996488701,1459654670,1381172822,857605352,-6664000,1459618047,16777114,1958742784,-339351545,511567952,-850591816,-1957313759,-18196,-1957313699]},{"sector":7,"data":[-18196,-1957313699,1354771436,-1710983425,8903,-1017256565,-1192457387,-1957691328,1861682246,-23441402,-1962934238,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,8973,-1017256565,736922453,1996443840,279484932,-443875328,-1957313699,74907628,1119386,1575324416,-326412861,-1710983425,9078,-1017256565,-2081649835,-1070923028,71732048,-1706012007,7365,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443867504,-796081315,1465303182,512488331,-1014824408,-1929671924,-1898345280,-52916543,-644962907,384562059,-208971946,36183691,-1962097789,-1898345221,-1515848511,-75369589,1584661024,36183689,-956532855,1594097223,-796081314,1465303182,512488331,-1014824408,-1929671924,-1898345280,-52916543,-1515870811,-208938610,1465260267,512488331,-1014824408,-1929671924,-54423847,-1515870811,-75369589,242483744,36183689,134105030,1610381193,-186006690,-1898935293,126559936,39291686,-796125973,-1960394610,183212295,1468729227,-1962677502,1465293063,-796140917,-2145073270,-604567687,-612115721,675187456,214401794,35716993,1049214068,2106130984,-1898345220,16744641,1170607221,-1632369666,1594472424,1170654046,-1118500866]},{"sector":8,"data":[-880048288,-74720461,1561136872,1455644255,-1898410921,675187648,-59405566,-2080488054,-8319801,-1267465696,36191881,-1996718711,-1510146491,1946369189,1604691202,-796081314,-661912853,1465303182,-1946354805,-2097010658,201467910,-796126741,-661912853,1465303182,-1946354805,-2147342306,1963196031,-59274483,780379557,1594622504,-1990868130,-1962888154,-396886921,-1956707328,-454337058,49008780,-1064380276,-74754218,673090556,671515394,300616706,49008780,-1064380276,-74754218,673090556,-25198590,-1961921273,-1515848585,780379557,1594622504,-544750754,-1962724120,-337672201,1431787241,11806345,915099987,-293404120,674662668,175931394,141855491,-1243085451,-402396412,1532560565,-1017225379,1049319254,1569325608,-59405314,141948731,830537522,-1017225344,-1929609847,-54423847,66814117,-2136143755,1605075188,-1515863202,-2131459923,-1017225301,-796108970,49004686,-2065148074,1443162882,-1191998633,1995112456,-796108970,49004686,1827166038,1443162882,-1191998633,1592459268,-796108970,49004686,1424512854,1443162882,-1191998633,1189806092,-796108970,49004686,1021859670,1443162882,-1191998633,787152916,-796108970,49004686,619206486,1443162882,-1191998633,384499728,-796108970,49004686,216553302,1443162882,-1191998633,-661979136,36191883,-1047602804,134118784,2106003572,646534652,-1744895820,1599930514,-1014774946,11976450,-1962797080,675187703,1457515266,-1898935209,1443032000]},{"sector":9,"data":[31189079,1465255147,179893131,1450633984,-1898935209,1443032000,29616215,1465255147,112784267,1449061120,-1898935209,1443032000,28043351,1465255147,247001995,1447488256,-1898935209,1443032000,26470487,1465255147,381219723,1445915392,-1898935209,1443032000,24897623,1465255147,314110859,1444342528,-1898935209,1443032000,23324759,1465255147,45675403,-1948742912,-1946015682,-2134798631,1946680957,1592284677,971595265,310271,146480363,-1156060416,317390860,-352317253,1358605,12257515,-1157371136,1465253912,36191883,134118784,2105559924,1031014386,-1995640957,-1946015682,-1950314792,2106195061,142445564,1931017091,646534413,-1744895820,1599930514,780387166,-15990232,-1627352425,-784269275,182767848,1583324896,46367683,-352262936,46367675,133332352,-276581772,675186956,13625346,-1346654741,924629504,-2129762327,1986939143,1684630625,1766067075,1701079414,544825888,1325958192,1718773110,-1971884180,1635013390,1864395619,1718773110,225931116,1920099594,840987247,976236593,1869366816,1852404833,1869619303,544501353,1869771365,-1105184142,233514985,-349709122,670285320,-742521877,1444871207,45817614,2406656,-1272446022,1176620352,-1953392468,-851397418,-1161065695,1085548547,-1403117107,1357132319,-132681496,-1074558005,-1064566602,-1047602804,-1510156146,-1093038427,-1950154570,11976691,-645087092,-661732978,-1515870724,-1093038427,-1950154570,2106195061,-28981508]},{"sector":10,"data":[-1962677497,872217717,-1962112064,-1023999404,628391808,-86964855,-657335855,-640550191,-86910767,-657335855,-1996339831,-427817907,12747151,106268984,-1996125757,1166606917,105220356,675187651,210500610,855790731,-2134706240,-785812353,-774254086,-772091432,-774319655,-774254086,-1880719144,939573889,1479,-1996339831,1435042893,-1007187194,-796211061,1049357035,-1375993304,179161227,-1378579768,-594874230,-772240723,-774647326,-774647326,181653986,-2147257139,-2135883318,-326436598,-265950942,1205878143,2964855,-784633288,-773795360,2010200800,-166366713,276038086,-2097035648,141754579,1023442949,393510784,376750091,176154496,-1981478201,-477494715,92915338,-373033077,-1070334327,1166607753,-1007187198,-628370893,-1014247285,-796189205,-770974925,-621341319,-628420117,-1014247285,125419531,-621290505,-1979655293,-1266670396,74901918,-628370893,-1014249333,-930406933,-921969869,-638118535,-628420117,-1014249333,125419531,-638067721,-1979655293,864036036,-1110297601,-1393982112,3860487,736628203,-402068736,65732661,-788519192,13796288,-925801355,10086595,1055395307,-402068736,65732698,184564200,-1018464814,-352310040,2942989,2028472555,-402396416,-919404482,226098955,-755510793,-2081040137,-779943726,-2084384512,510984401,-389821743,65732691,855644648,570537435,-2134045973,334856697,1925387227,-1695956223,10873341,-703950163,-1850895443,-293367379,-1225159928]},{"sector":11,"data":[-2131680753,-444591922,-773205633,-773205527,1959332841,-18251304,-2089192957,-897638151,-349836925,-1965935824,-125129510,-1396143443,-293355130,-1947629052,2145485305,-790310912,-590284335,1299499275,1920919936,553222983,-377251713,-2133199072,444336377,-184419712,-494873904,-1965880831,-1963423009,853969604,149520630,367256043,-1308493184,14319617,-657330480,-623846447,-503262592,-1949660429,-1010594864,-2147438087,-1070399279,-373043061,1760099557,-402149376,915079477,2080571944,284132102,-427763829,-252018305,-1981779073,-24443268,-54531645,-1342141976,17819651,36189835,-2130543613,-1962901265,2145812695,2139159169,2089410419,-1006728446,-1962926360,-2097010634,2080444655,-1006728442,-1962912280,-2130565066,16810223,-24444292,1049361603,-1064566232,-1047602804,-1515870811,915128462,280625704,105679616,-511575669,-905314289,-2130293623,-1946160921,2145747151,-788515400,-773205527,-2115382807,2097427433,-338036988,8710465,675187708,-1933538302,-1514041639,-1950314843,-1174263754,1284178048,-2114352382,167804897,38570442,-8329343,-444543093,1620095,-846536239,-377361102,1216151702,-935601673,343732107,-2147424383,-935593461,-930411916,-444469365,-366247936,-108998093,-2146141176,-1292566022,13795328,80090122,149520384,-1964512442,-1156783308,-1047920086,586058455,-1020491544,-779368141,-1144834934,-276168703,115597706,-674174255,-687146270,-754262494,-1300104576,14319617,-41221516]},{"sector":12,"data":[-489436022,36179595,734528408,-1997405490,1174856500,-503311232,-1007172614,1282703232,-1007299631,-2131005463,-456097844,38046659,39684902,1954513065,-1445922847,-789086336,-738729356,2139145207,-663432201,-281875318,-472787592,192143569,-1929934957,-1898345278,1004179137,-1962576445,87762436,-255592509,-782338945,-373033517,-863962340,-1008414593,637944971,-1459200629,-512458768,-257306377,1959851903,-137103390,-142610237,-1965525805,2028942060,-773598763,-1827965984,-1030948985,-1047602804,-1019487602,1149966197,1161504260,-1961986812,992346692,91554373,992347275,-142097659,-2147334773,65765620,-1962785397,898236765,-813694798,38570880,-1946190709,-410975884,-830341376,-1043234816,-318062383,-469080716,-331719820,-209255053,714209927,-2133002523,1232541948,-388970032,-1970153008,-486492723,251232341,-771026308,-880802956,869501697,283738331,1047797106,2114320768,1959922219,30310403,-209004918,-41230454,1997072768,-786205673,-19672606,-336038463,-1948349671,-792622121,9955816,1950335734,550141955,-623776815,-1024001310,-2147257281,-523231030,-687664016,1349770771,-623780911,-58669826,-381323777,-97781267,-678694117,175365771,-621292553,13861877,-619982602,-327152779,-2023066096,1960512474,1979648612,149717007,-74818698,-225780086,-16068046,-855766408,-489600140,-160312367,36847232,-385649664,-92274316,1913091968,29816340,-964685964,13861633,-989984909,1962933376]},{"sector":13,"data":[-773795782,2139138520,-2145118348,176154496,675187655,38111490,-963976310,-141884023,842956995,57933826,855733993,675187648,38111490,-141884023,-370771517,-1375930039,-778685301,181981408,-1948879644,-506396083,-318055984,1032571764,-1053632373,-2139034496,-452821011,-998190224,-229248,844156276,-2131784961,-914325301,-1947497600,-1947732026,-1950348326,-403202875,-763111421,-1946514688,65468353,-1644555304,-880802956,-154825983,-1949891615,173577171,-787777281,181653986,-385190428,-989921429,1962933376,-14882385,1301018503,-790507262,38046681,-657399599,1450503434,-613096438,-327106254,2146271361,-2140084950,-2139044736,-2139815940,-1979622005,-2134298067,1048608975,1946157618,-773074680,842924761,1418416130,841255425,-2133950272,-657331503,-1962927384,1173742,-695483893,-897580172,-371356927,1609170812,1943223288,-1762396387,367247411,-963904885,-654843401,-678692325,55445363,1943212993,-4275207,62991359,1942064080,113689581,-1979710926,167916590,-2146994963,-331739411,-469091209,922695796,113705512,37028392,861033296,-388287790,1532690006,671532888,1342322946,-13479341,1526601704,110057563,1005126184,868234238,-1563282469,922681906,113705512,37290536,-397257904,-1070334430,-1560136285,-739573193,1837889415,16089350,-1960973440,675187703,-1515870974,2145681581,176219776,915123174,-24444376,107842499,105155580,-556735023,-623845167,1962926117,-521829934]},{"sector":14,"data":[2011708415,-1778940151,-1072966010,-986988172,-1606559497,-793217274,-790769178,1474154978,-1059995439,-528039727,-1968375669,-1832897824,-1817341523,266633389,185650304,-2090633985,410783487,57987595,-1962817152,-1949594671,-2084555816,-411627281,594692212,2080833411,1959922219,30310403,-242559350,-343224950,-125116534,-466434934,1997074307,-786205681,-774778398,1204867539,384562549,-1024012409,-2147257281,-388947766,-539894831,-152905007,-1755394169,1950335734,550141955,930145745,-657398319,1276326914,56365825,91523996,268428929,268488321,-134343779,1948254407,-773861101,-774254117,549815258,1977679235,-157030141,-788494103,-153562907,456403664,1545273676,91523843,-1670753,13533455,-31744496,-164424845,-671624970,-772287497,334879479,333321166,79625470,1979648768,-523766248,-310307979,1081475584,-1958906802,-1948677125,-338545718,-523765788,-2129103585,1979777261,-527788249,-74791030,-376775286,-225784182,-141098830,1963983047,552436498,-489590412,-741223983,-336865327,-57645589,38420096,-385649664,-92273787,1913091968,29816351,-964683148,13730561,-2097097853,-940113705,141828096,-2095004285,812966141,1049360267,-561577432,-411008988,1961742607,853575202,180685760,105220551,-1979359864,-1047811386,-1413051477,-1962545277,58311671,-51006231,38420096,-385649664,-1070398601,36191883,-1414793333,-24400981,1150024899,634424070,-613122064,856051083,-253656623]},{"sector":15,"data":[-774867841,769774048,-377389056,-1056735264,375920,-2081408,-422529420,-397354799,57934209,1560398464,-657398319,268486647,-489615755,-741223983,-317990959,-1813312907,-2095004285,-2005606147,-369154839,-142084802,105745404,-511585909,-277577744,856048779,2146444752,-523134092,539877841,-521567872,1891707775,-2147482213,1962926141,-773402469,-1968418600,-1379323160,-1382896237,-2146442112,1351749836,-964429941,38321925,-461328899,281837583,1185260971,-956521401,1048576005,1946157642,1220541727,-1376285950,-388896629,38413826,-1376923221,-1381246767,-1381246767,-55846703,-773140136,-774123048,4188377,3926103,3663959,3401815,-1056193781,-678706677,1952406361,30048259,1946665718,147488771,-606998575,-623781423,-606998575,-623781423,-606998575,-623781423,-1946220311,855787574,1943419903,1976699740,2012232452,1391916859,-1947389033,37921269,74760203,-225712137,38052176,108314635,-268179465,1185016339,1958742786,65533704,13796328,-621323630,-585380325,-1779950755,1939050898,235097875,504562242,101909060,370344518,-311229880,237719491,505086530,102433348,235078214,504562244,-1038941626,37885579,-1966478347,-466483644,269225764,-1979564381,254019141,1084428300,-1948568830,-485717013,227250458,-503904029,-896800629,1435174027,1959922434,65206022,1440355272,1150020915,1958742786,185961230,-150440750,331875298,1490407898,-1957641973,-1073020348,1435176308]},{"sector":16,"data":[1959922434,65206022,870978520,184847305,-1961921344,-771029931,-487126924,-367798269,1150013905,1958742788,185961231,-150375214,332923874,13730794,1354959704,-1073019765,653723764,-402456000,93047315,141869067,37627639,-904665085,1150016307,1958742786,72715023,141873675,-402398473,-741225965,184829067,-1961855808,-771030443,-487126668,-904665085,1426117507,1166798131,1958742786,1042741000,331875074,38046682,141869067,37758711,-636237821,184829067,-1961200448,-771029931,-487126156,-636237821,1150014929,1076295428,332923650,71666666,141869067,37627639,-367798269,-167625056,50479142,-782592059,-774778398,-774385197,-774778398,-774385197,-774778398,1591202259,-960236021,150022,38483595,141882891,79752833,1350038843,1282731275,36189951,36177607,1364197965,1465209682,-919348429,1055445555,1532846076,-950511270,1426204678,1381060610,861361491,-70129409,1515937119,110057561,451478056,868234236,869413833,871183323,38445823,36189951,36177607,1364197973,1465209682,-1074005784,-1070398899,-1414812757,-1957312789,-61384980,1988953886,40550156,-1523145418,-1523145418,-1957361429,-61384980,1988953886,40025860,-1523145418,-1523145418,-1090362690,922681962,113705512,41026088,-755018413,110058333,158466600,1593995960,1575324510,-1966525501,1612614088,41074434,1946418304,1946631186,1946369036,-1413467368,-341070933,-1107054313,-1515912498,243312037]},{"sector":17,"data":[-343932295,47103495,-1515870811,39718537,1589178763,-555200510,46433028,-1401569269,1048781232,1912799838,-1742557182,-788317533,-1967879194,1962281730,1612614547,350767874,43563776,-1962930456,649438,-402482245,2011758595,-1744336129,-1202502832,-397410302,-998044877,28885766,-1950091003,-1962792906,-1178586114,-1410138108,-1007092085,49201148,-1979300725,2146478584,-265952908,769095935,1552564192,55347973,1442927755,-774774063,-489565231,-741223983,-774774063,-813640751,1947248768,1049865,-640554031,-120464687,-1992302587,-75299259,-117214466,-1202571541,-470306895,56088765,-1123847190,-745799681,-168312781,-573446141,-1047800949,335148535,-1948397080,-138310701,1492159477,-578030089,-570177397,-506347469,-791555119,-741219887,-506343215,-791555119,-741219887,1158205649,73238790,-956150391,1577058309,-81729449,-122296225,268856707,-1957313544,82609132,1988843095,76170756,-153580648,67337095,-1952910475,772065016,-1744532922,-1946401143,-1962637113,-2142831490,1962999676,-1956684052,1438866917,-326898549,-1957275902,116065398,1949187200,1015039494,1190491392,16743552,199962484,1952791680,1161592843,-2142894476,-260767684,-1957771637,1308748792,1949318272,775717114,1179517301,-2008611446,1975519748,-1956684042,1438866917,1586228363,-400585468,512617372,-1779956286,-287315733,28837244,721611520,1575324608,-326412861,2122536535,443809796,-402098433,-997991587,106859266]}],[{"sector":1,"data":[-74768501,119468171,-1515870811,1996429547,-616306680,-1962752893,-346887976,-1962516853,-400585441,1600056372,-1017256565,-2081649835,1448544492,-2096871797,1465256172,-57937781,369411971,-1515870969,-396468315,-998047131,-96040696,138840912,2122534976,92143624,-352321096,-1950340350,1183447646,759137272,28837237,721611520,-129629248,1342588419,-2096698648,1988822724,-94467322,1965899651,755287556,142508870,-1979089408,76022084,772064838,1342350520,-1928831349,-397409984,-998045540,-2081387772,1946159742,1157940739,-94467258,-2147065973,1198796863,-1946526069,189727359,-1962312193,-1948715065,755287800,1694466886,-947187332,6601113,67172855,-140916853,1190824953,2081095555,-1714975983,-150992199,-1962671879,-101213753,-1958282613,-1962671929,1599997510,-1017256565,-2081649835,1448543980,-2096871797,-1957295892,-2080601104,118883015,-1515870811,24635486,-1995914109,-1957627322,38243288,1342719491,1965899651,112645,-1070923029,1342588419,-2096754968,1988822724,-94467322,1965899651,755287556,-94467258,163715,28840319,-396996608,-998047473,805619204,-1962480826,1996749406,142508802,-1203470848,1448083457,-2097089816,80086212,1586185774,41911290,-1960018688,-654900665,2117728395,-1962574584,48957510,1183434635,-396996600,-998047545,142016260,1342189752,116582486,-1962490749,1599997510,-1017256565,-2081649835,1448543468,-2096871797,-259323668,118946955,-1515870811,-2097105688]},{"sector":2,"data":[1183385796,-1948742660,-1991769529,-63046074,-1962377985,1178142790,-15433986,1996425846,108461832,-402360577,-997982718,-15734008,1996425334,74907398,-2080448024,1599997636,-1017256565,-2081649835,1952778366,142508806,-15633083,1996426358,108461834,-402360577,653000138,1711832707,1996427637,108461834,-402360577,-997982554,-15537402,1996426358,108461834,-402360577,-997982374,1575324424,-326412861,74877782,114681942,1073923203,1183536720,1355154182,-2096770328,-1956772156,1438866917,1465314443,-1898410756,74878400,906146495,916797093,-1096468827,-397081934,-1084423717,-1733557574,-1851460719,44744618,495583026,-1996335735,1170670661,-1962755578,-1956749369,1438866917,-1070338933,-1017256565,36189835,-385683777,915141855,-289471960,-189601534,36189835,-385683777,915142351,-289471960,-148313854,36191883,-385683778,1049359508,-289537496,-149624574,-1070377136,675187708,-1414812926,-1017618517,36191883,141948731,49200835,36191883,-1515870811,36189835,674663363,49200898,-1515870811,-1022824829,-1526532417,-2086296155,-1094514450,82510574,36189835,108330840,-16485121,889127540,-289480449,-1962611966,1476536374,1150223503,71601922,-16366449,674663392,49200898,-1515870811,-1850870901,91867403,-346952398,675187479,-1515870974,1360847781,674663254,49200898,1593185000,675187542,-200939518,-964470434,-1947934200,-1962792898,1150010359,635996678,729055216,1027588141]},{"sector":3,"data":[595002224,-388823887,-511653750,-389005049,-388962096,-136803432,281903323,-1979290490,-523106752,-1022989176,1686787667,1200238089,-2139085559,376816698,-2096445821,96012995,49185536,-1962742909,121318916,1532949473,-1783802173,-1817341267,-1174457427,-388956155,-623780911,-539894319,-472779550,20828369,-606997248,1577319981,1820933257,72648962,-1996071799,1724057668,-4,16777215,-858993408,-858993460,-1090519604,80085770,21284353,-1950338256,123420880,-661911869,-1073954674,-1185479938,-1510801404,105679710,2131190912,-1040768845,108298224,41535755,-397201997,-13369477,-1409088066,-1149992792,95287434,-930398210,-145944390,1303417314,-939268874,-1699686637,-939268106,-377357805,-545189132,-145288381,50249439,-1157495576,333987111,158490623,834361159,9300029,-1750247585,-1834117715,-1850895443,-141829641,216252467,-623776815,-556671535,-186458928,-2125020032,319003350,332469225,51101657,838865081,1381192128,-800041387,-774450716,-774712875,-791621421,-774450716,-774712875,1506857171,324658434,-384607759,1506874201,1366291,-690887472,-758000175,-791620655,1504325636,1229962722,-201510736,-1048314706,51035666,28839048,123427328,52215235,-1962932039,-205507587,1200303787,138674440,-1207957569,-953483260,-1003823070,-654916566,-1952971772,727077832,-2082526247,-251459389,-964430037,772049670,20850679,289275974,-2093088170,-2097150890,-1014824210,1592189442]},{"sector":4,"data":[46498651,-2084801201,-175698195,195924397,-938758712,-1834103542,-1750216438,-1817341523,200641453,-15894336,-489617332,-774776879,-791555119,587203005,869600239,33194477,-49023616,-585904877,-707672813,-787977215,-1983575091,38570300,-1996202871,12781124,0,77594624,0,0,1992,0,245121024,0,-1138753536,7102,-1090256896,915282889,1890950656,-978474965,-721392739,1241501606,-708675553,-376643584,-1169700480,-1912493421,-73532962,1403682539,-858993405,-858993460,184548812,1030792151,-89925878,426061055,-1223206686,-33557551,293888462,-424948617,1306614783,-1785413948,-1157641242,-1387972204,-1764773602,971613695,2146052005,-1577112408,2086976740,1474154566,2048473854,826484067,-1141068096,-16040193,1505428857,-2082474177,-1014822165,1962871562,1945096461,-396930059,1533017723,1438903531,1005120651,-491395068,175432714,294528,1187382389,-987824636,-1207751658,567092480,1846446879,-1157111035,520028162,1183516012,-850611196,-326413023,1459940483,74877782,-1962385781,80086655,317408816,1946172800,1191545349,816841451,-12188536,2122516046,-394330106,-2097150778,2080376446,893222930,65736060,1311769798,1949908096,-1962606857,1065354334,-1962379983,1207896158,-1961956606,1346372678,-402360577,-998047364,-1956684284,-1144824347,-75430536,141755774,1528299347,-219462845,310211,-851181384,-167087583,91521218,56397696]},{"sector":5,"data":[-327595200,-852446013,54436641,939953859,915088899,12058668,-1994273483,-1945949154,235089414,620804127,-853389126,244004385,585303406,1879491894,869960709,520042203,57869676,920743145,91489989,62642828,520041984,521536876,1358275,-2013865165,1946223452,-851528700,-220052703,-326412861,-16583704,-1092090762,1575324670,-326412861,119428695,-1962639733,-678754698,990400139,-1961593090,1002505158,51147768,1324942321,-1527513777,-1960973316,-775550009,-1962249240,-775539769,-1528073496,-202780343,-1979354203,92808708,1600045707,-1957313699,119429100,-1962639733,139365343,1183455971,-1948218874,1944768983,-1958106622,-202780207,1944768939,92808707,1566557067,-326412861,1460464771,-2080535722,1170606831,1183531526,71665924,1170670985,-1920991486,-11532218,-396949898,-998047056,-1012986,2105737805,209453058,495697970,126354943,183231530,1354773335,-2097076760,-963967804,-443850914,-1957313699,508975084,108956423,-1070336117,-218103879,-638107218,-1962639733,-1952123945,1566531266,-326412861,-1962467753,-1070398338,-218103879,1086426030,1608054592,-315440291,-355399965,-85796655,-326412861,-167485813,537091207,45616756,-1949748414,1931595217,31648003,56395766,-385649280,1317732481,106334984,-1070397666,-1957275652,-470119440,1074444389,846573298,735021905,283331018,60563917,74685936,1240140212,796180491,178502,-1274774342,1931595072,-351685628,1958742836]},{"sector":6,"data":[-678733542,-1957575189,-842388529,-268198879,-1274776675,186313481,-166300224,1073962119,1586170740,440369158,-336067723,12122372,41048348,1600046731,-1962846231,1451952206,-851397626,-1274776799,-470947063,1975520235,1552414439,175390723,1065409163,-133991142,-1191586069,-789898240,-2081649835,1448543468,-1979287925,-1449654716,108265603,1074152694,-4716940,14215679,17188086,1283458676,-286580730,33967232,-284793728,1149878323,-1980200190,1157037694,259328006,-1744354166,-472786805,87984118,-1959758847,75246396,310312715,74776407,-1744354166,-20584368,-1996045181,1150025286,76103684,-16628537,73173761,-2012985718,-160896249,1963198020,-1493270196,-1976863484,1352140612,-2096653592,-1073020220,117388149,1153893736,-1979302396,-1952970940,-958148136,17120903,104793287,12106475,-571977726,46433246,184829065,-2147060544,-351795636,105676957,114436,71732567,121932368,1223184536,113542142,972965513,57998974,-1962986519,-467008442,-443850914,2126234461,-2131001083,1393062661,1130043391,-1007490237,-2130345797,1929741051,402608904,-347913381,141738994,-443826125,108249949,-1207955992,-443809793,-466435235,-1023409688,167986850,-2145159708,50544190,574360946,540806515,95421810,1016072171,-1342015981,75414291,983800023,-997539069,-1957300245,23247084,1474147816,108432214,-22903155,-1962550109,-660404154,71731973,-955919197,387590,-402209024,-2147483643]},{"sector":7,"data":[57999420,-2147399191,57943356,-956232983,17162758,-1547685120,-794622496,98870021,-1559898461,-761068070,99525381,-955912029,537255430,-2144146688,108342588,99616511,1015031787,-15960789,-955916282,381446,-2145981696,225779772,98582147,-16091904,-351940090,-301531388,76170757,15224984,46433030,-1082802165,99006550,92923984,-1962621821,775717104,117379701,1447429594,1342563000,-2096794904,-259324732,1970027648,-704198905,1174405637,1962949760,10545411,-1986526070,1040096902,175374405,1946175293,5782789,117377397,-2038233648,-1960771938,771661446,356319331,54425344,-13724736,-12206681,-955915258,388614,702464,8906832,-352140157,571472,280556267,871230208,-1595387712,-1192629503,-169148415,-23152897,-352182552,-335639589,-2025477311,-1337610171,-1186615227,-1186612923,-1186612923,-1186612923,-1186621115,-1186612923,-1186618555,-1186626747,-1639597755,-365001915,91488261,-351934303,-1494661600,624787710,-2142828940,-176881603,-970209397,518542928,79987459,-1964378229,-1956684034,1438866917,414772363,-603133952,2122536535,74713604,98830079,97926787,-1961462784,-1962551266,39291655,-1980217719,109312598,-352057896,-465665239,276037637,98049675,1183385483,-96024584,233504768,98049675,-1986459765,1451882566,-670661638,1048773125,1946158574,-129594611,1962558987,71731973,-1070398741,-1962546013,-2096767946,386110,2122525301,612172026]},{"sector":8,"data":[168066691,80090997,1183532589,-94991368,-763111177,-1982138624,1451882566,-163133446,99287041,16139975,-2080535808,1996429551,1996445444,-126418950,-2096857368,1048774852,1946158554,686315296,46433275,98700939,1317652523,-972755970,-1958334460,1325399622,2143292414,-2012902670,-801209596,125042693,58483004,1176513664,-8552377,-2082048768,386110,-526314379,-771355899,-2096401403,1962997374,112645,-1070398741,39184464,1577239683,1575324511,-326412861,-402650952,1448598238,98436807,2122514464,276037636,-1593835074,109250008,-1996356136,871103558,98049675,1183385483,-670661636,-1073020411,1187448181,-16477444,-2065105802,46433274,1048834187,1946158554,-502908662,-1962642683,-1962548682,721806910,-264338434,125108229,17754199,1443021955,-386107649,-998047379,-264338684,125042693,16181335,1577239683,1575324511,-326412861,-402652488,-660481454,-28931835,98188931,-955878144,101048838,-801702144,-499712251,74907397,98318079,-385976577,-997985570,75399946,-2096728985,1967588478,-297893096,292880389,98713219,-16092160,-402269130,-997986327,-297893118,292814853,98713219,-16091904,-402269130,-997986408,-670661886,113707013,1516,184934561,1946538502,-25755886,-2081421080,-1073020220,28837236,855829248,619204800,1575324417,-326412861,-1276592077,1048794841,1962935786,-736195784,38797061,163715,1183453564,-736195836,-13137147,704940039]},{"sector":9,"data":[-15864860,-16395210,1541932150,79987706,-16353984,-351933946,-402194684,-443851259,-1957313699,178412,1473865192,-365001898,1366622213,184841867,-347439370,-736195789,38797061,163715,-559935108,-736195835,-12612859,705005575,-15799324,-16395210,-402268618,-997983742,74792964,99223295,189712011,-2084143168,387646,1183516533,-402259708,-1956684283,1438866917,45673611,-654514176,1988843095,108956420,99237507,-347310848,-736195787,38797061,163715,76157564,97787531,134156171,126409099,250340394,97793791,1352139914,-2080794136,1967129796,-368640252,-947173883,1975520079,-365001788,125108229,17188491,1577445382,1575324511,-326412861,-402650440,1448597650,98317963,1183432755,-129594884,98975371,-128063402,-1996307325,-131335610,-2096857557,389182,1015027061,-2096073427,805690942,-1733555851,-23205808,-2096970621,805690942,-16053388,1048774526,1946158576,75399961,-16354304,1592326214,-331447552,108265477,-386119937,1048772720,1962935792,-1310173402,46433278,294531,2122516852,57999608,-2097138456,388158,2122516852,57999612,-16759832,-396952970,-997982479,-264338684,225705989,98436807,-396951520,-997982604,-1956684286,1438866917,-1070338933,-2083008024,385086,733480308,-1207702784,-397410272,-443810301,-1957313699,-390056980,817420210,-253210624,46433277,99368579,-2095680240,380990,1488455028,-1207702784,-397410184]},{"sector":10,"data":[-997982765,1575324418,-326412861,-402652488,1448597374,-2147060085,242559548,98049675,98043523,1178569474,-13419797,2083536000,960266291,1043934847,192218586,1966095488,-569981178,-1409273851,-774927464,65130977,65130959,820609992,1015085451,-2147124176,-478267076,-1996202357,1590070079,1575324511,-326412861,-402652488,-1101605098,233505945,1178076298,-1207601916,149618689,3964998,-1070338443,1575324510,-326412861,-2096865653,293410043,2080439171,1552414220,91504643,-352321096,1572877058,-326412861,887685299,-326413056,1459940483,77512278,401342259,-1744419702,1946190761,1978160651,46433024,1191277632,956876419,1929733686,1590135779,1575324511,-1957275709,1183517262,106334980,1460174475,-1812199650,326418442,1963653507,2043808526,-1439846390,-763110409,-1948584192,-768371977,41205771,-141299209,-746089743,960245764,654574198,197299114,-1998424637,-2035527931,-12285947,1928805199,1600018677,-1957313699,82609132,1988843095,1459565316,-2097128728,1149895364,1006838790,-163810046,1963460164,121932303,-774337640,1049097955,661913861,1143669899,-62486268,461291531,74776400,-1744354166,-168171440,990299267,125107270,537283712,-1946157121,76088388,148679,1590135552,1575324511,-326412861,-2147197301,1573848679,50354115,50905857,50358784,51028225,50359040,51409665,50359296,51403265,50360576,19027969,50331904,51405825,50360832,19050497]},{"sector":11,"data":[50332928,19062017,50333184,19065857,50333440,19078145,50334208,33733377,50332672,51400193,50363392,19084289,50335488,19091201,50336000,18607617,50336256,18646273,50336512,19097345,50336768,52592897,50332928,51066369,50333184,52154113,50366720,19108097,50338048,52201985,50366976,33889793,50336512,52213249,50367232,33922817,50369536,33883393,50336768,52230401,50367744,34061825,50370048,52158209,50368000,19036929,50339328,34490113,50338816,34071809,50339072,50978049,50337280,34470657,50340096,51390721,50370816,34118145,50340352,34047745,50340608,51084801,50371328,50696449,50338816,33898753,50340864,51385345,50371584,51077889,50371840,51100161,50339584,17499393,50343936,50994945,50340096,51130881,50373120,17816833,50344704,34443009,50343168,17772289,50345472,51039745,50341632,51045377,50341888,34744577,50343936,51381505,50342144,51398657,50342400,34688001,50344704,34683905,50344960,51541249,50375936,51427585,50376192,51550465,50376448,51566081,50376704,34746625,50347008,51447809,50346240,34738177,50348544,34422017,50348800,34049793,50349056,34748929,50349312,51073793,50381056,51456257,50348544,51471617,50349056,50989313,50349312,18979073]},{"sector":12,"data":[50354176,34710273,83906560,-15664384,50331904,18095873,50354432,18585345,83909120,-15740672,50332416,19029249,50354944,50985985,50351104,50716161,50351616,34729217,50353920,51001601,50352384,50720513,50352896,34704641,50355456,51035649,50353920,50430209,33576960,-15663104,33554688,-15739904,768,0,0,0,0,5,0,0,0,-1322373119,822230315,1663906610,909456387,923018538,1898920248,807403520,1026273582,858927392,874529581,623523381,959985440,1291853871,726466605,5393664,1124090701,6515809,1668047171,11141120,11141205,11141205,11141205,774176853,771778104,3014704,805318192,774897710,3026944,774897712,3026944,30757,763101184,762589321,762458214,786313316,794964621,794833648,751645422,1929653536,7631473]},{"sector":13,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16842556,-521078532,32960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1141243904,1229016399,1230177358,1409632078,1397968716,42009210,0,646,119552514,1920099616,684655,808463205,48,0,0,0,0,0,0,0,0,-65536,-1,32751,0,16352,0,16368,0,16384,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25264513,1]},{"sector":14,"data":[0,0,536870912,538976288,538976288,673720360,538976296,538976288,538976288,538976288,1210064928,269488144,269488144,269488144,-2079322096,-2071690108,-2071690108,269488260,269488144,-2122219135,16875905,16843009,16843009,16843009,16843009,269484289,269488144,-2105376126,33718914,33686018,33686018,33686018,33686018,269484546,2101264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,369101325,219677186,202116105,-63481,302846719,1848180482,694971509,539831040,142475299,142475264,1,0,258,0,518,0,900,0,1026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,0,0,0,0,0,0,0,87425024,0,65535]},{"sector":15,"data":[0,0,1084571789,1264664749,16633,0,0,0,16420,0,-1717944248,-1717986919,16313,-849019008,16845,-849019008,49613,0,16368,0,82009,90963971,262399,0,852227,2097165,262176,-65536,-1,-1,-1,-1,-1,-1,-1056964609,-2130706625,536870687,1073741711,1073741775,1073741775,1073741775,1073741775,1073741775,536870863,-2130706545,-1056964833,-193,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,520093696,536871040,1073741888,1073741856,1073741856,1073741856,1073741856,1073741856,536870944,520093760,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1310740,16842756,0,254,15794173,15794173,15794077,15794141,15794141,15794155,15794155,15794155,15794155,15794167,15794175,15794175,15794175,15794175,15794175,15794175,15794175,15794175,15794175,2,786447,16842754,0,-17104644,-25428229,-19398985,-16777489,-16777473,-16777473]},{"sector":16,"data":[257,4194304,524352,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16580607,0,16580383,0,15793951,0,15793927,0,15793927,0,15793927,0,15793927,0,15793927,0,82902791,8772,82902791,8772,133172992,65279,82841344,8772,82841344,8772,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,15732480,0,16518912,0,16518912,0,-520155392,0,-520155392,0,-520155392,0,-520155392,0,-520155392,0,-520155392,0,-520155392,0,-61696,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},{"sector":17,"data":[-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16580608,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-536674080,-8454144,-536674080,-8454144,-536674080,-8454144,-536674080,-8454144,-536674080,-8454144,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-251461408,529516515,-251461408,529516515,-251461408,529516515,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-251461408,529516515,-251461408,529516515,-251461408,529516515,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,-16580384,-1,224]}],[{"sector":1,"data":[0,0,0,0,1768179088,16777332,1886339840,843450745,163840,1953718608,1850280293,115,-2143289344,285218313,1946198016,0,327680,524448,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,130946,234881024,134258688,33554176,-2108685824,1668047171,1952541813,29295,2228254,524382,131071,1451380738,1769173605,824209007,3223598,788529152,151035904,33554176,-2108685824,2037411651,1751607666,547954804,892877105,1766662188,1936683619,544499311,1886547779,973078574,536886016,-1711272448,50331906,1800372304,0,10879052,65538,1342308356,130,-1610590720,16780288,33554688,542212688,1901273149,1701994869,1869566496,538976372,541990944,1749229629,1701277281,1734955808,110,-1610587136,16780288,33554688,1917878864,544437093,539446567,543452769,757083179,743579692,544370464,1868963907,1699553394,2037542765,0,1631783424,1819632492,1919906913,1920091397,1091072623,1953853282,19803694,177,0,0,0,0,67600385,117377022,33620992,16908545,-16580606,-50201342,-33554944,-65537,33423614,50266623,58721279,-16253198,17170436,-16285693,-50201087,-16777984,100136576,-33030656,117800967,-33423870,-50266879,-513,66713984,-98303]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[15751757,64,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":10,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":11,"data":[279886,17957335,191459723,655366,268445696,66684,655360,196618,4194514,28573840,29753792,1769,262189,1187250176,42463232,113573888,113574012,113635696,82379003,82506032,1477902677,1477964080,23987992,24051984,25626419,25624848,34539342,34603024,51054447,51118352,20318113,20381968,35522486,35586320,33949660,101581073,-2147352572,1,134283264,1048585,32769,-2147287040,1,134873088,-265289663,32769,-2147221504,1,139132928,-265289709,32769,-2147155968,11,140378112,-265289719,32779,140967936,-265289720,32769,141492224,-265289717,32770,142213120,-265289717,32771,142934016,-265289721,32772,143392768,-265289717,32773,144113664,-265289719,32774,144703488,-265289710,32775,145883136,-265289716,32776,146669568,-265289722,32777,147062784,-265289720,32778,-2147090432,5,147587072,-265289699,32769,149487616,-265289707,32770,150863872,-265289710,32771,152043520,-265289720,34815,152567808,-265289725,34816,-2146893824,1,152764416,1048580,32769,0,1279345416,1094995525,82,524289,100663308,1314014539,1191398469,1426344260,760366419,1070399999,22531843,-2063450163,1070399744,22533379,-620544051,1070399831,22536451,-419217459,1070399831]},{"sector":12,"data":[22539523,-217890867,1070399831,22542595,-16564275,1070399831,22545667,184762317,1070399832,5771523,973291469,1070399567,368131,-1526513715,1070399516,2080259,-754761779,1070399517,1235971,-1291632691,1070399496,818691,-1492959283,1070399508,611331,1426276301,1070399558,4709123,-2147270707,1070399557,93953,606157,1070399488,5,1292255181,1070399488,8,475085,1070399488,71174,-217628723,1070399488,173569,278477,1070399488,296706,67387341,1070399489,2,1795243981,1070399491,215041,369704909,1070399489,236545,-1056555059,1070399489,152583,1766662656,1936683619,544499311,1684957527,544438127,1701601603,1918985326,1869762592,1835102823,1174929408,1296388686,88430159,1313213184,1095451457,1297236300,117443411,1111576134,173299023,1313212928,1414418243,1397509970,1141440519,1313228620,1313165391,1175453698,1330794574,1329742147,1380996178,223628873,1313212416,1163280723,217921,1145980422,105206849,1313212160,1313428048,218104916,1094995526,1413829465,1196312916,218106195,1347636806,1095320389,1296651340,251660357,1279544902,1329742151,1380996178,206851657,1094912512,1145984844,1129271888,1,0,151252200,209125125,-16091393,1996425334,74907398,16777114,1975520000,-339727559,-297366194,4778064,712359947,39991039,72103679,384714381,-26032,-1073020928]},{"sector":13,"data":[1183650933,-1706027282,65535,384714381,-26032,1183645696,726669038,1347440832,16777114,1975520000,-227082312,-1023024664,33783016,73304833,-2130413685,18023039,-1070920075,-401698736,28836069,14608640,-2130420085,16777855,-806812812,48668928,544540473,1946812035,12642563,1851011,-16026368,-1711089098,65535,922733803,-202702214,1851011,-385649408,-963968866,1946160445,1031698186,1920204809,-1593799191,104399940,242549322,1342177720,-1705983957,65535,1252103403,-1706016766,65535,1048807659,1962934858,112656,1354771280,-26032,1911095296,38445567,-1193546936,-1706033135,65535,1081917451,47855359,1342248376,1965227651,243717,45614059,-1070903296,-6664112,-385875713,922746684,1659437798,2178559,574427762,1036023296,-1636564954,1962944573,-9180925,-389824469,17433253,4734595,-15895552,-1207803338,-1706033151,65535,4865667,722236416,-6664000,-16776961,-1929360882,-1924076474,-1873742266,32827406,956456609,460715590,956453025,326495302,956453537,192278086,956454049,58060870,-1593779479,378208860,1183384158,-94991880,-1544141173,922681950,-6684062,184549631,-385649472,922681479,-6684032,-1996488449,-1705971130,65535,1357661837,16777114,-196704000,39585339,1554208628,38846210,518813325,521543175,530949541,1851011,-12684032,1354297974,-6664190,-1593835265,104399398,158663248]},{"sector":14,"data":[956443297,1946309638,36086032,1978418745,36348184,1978680889,49069840,503457470,-1515870969,16777114,-2143879424,-227082494,16777114,108954368,-1205505024,-1924136356,-1873741754,14936078,343195659,5113543,1554055169,1578535682,58368770,58463881,31985296,1860748032,-1593834751,378208860,1183384158,-61437446,1358579341,49821439,-2081943920,-96039680,58374224,-401698736,-12779367,-2089779457,164926,-1070920076,26450512,113704960,196682,40648323,-1591708161,378209146,1822622588,1846970626,-26110,104529920,125108834,16777114,-1204491520,-1706033151,65535,-1962706271,-1996260330,1451883078,-96039428,112720,-401698736,2058878994,1183666179,-1070903046,-6664112,-1023409921,52456,140413698,17188491,2139161159,2114297602,140413709,-1610453119,140413701,-389871617,33751209,-1962379637,92997246,91423801,-335544392,956664602,-1207601660,267059201,956450187,-394526140,2130854969,-1010816018,1167120524,518818645,1465309326,-1275058456,-1339962068,48625212,13926593,-1996071285,1978206727,911363,-310157729,535137026,80366941,-852839424,140413729,-963976142,126470398,-922828150,-2130557047,-1995981591,1539507279,787254101,1128470411,-1031094221,-533995311,-1070377130,-523123062,1507065680,-443851169,-519873699,-1933843457,777752792,1128470411,-326412987,869830174,-775779648,1457531872,-1967115433,1356911046,1599722495,49120094]},{"sector":15,"data":[1562371467,50813773,-883751199,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,-1375287509,-1996488703,1459724302,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-78321657,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,1255,-1017256565,-1192457387,-1957691328,1861682246,513429510,-1962934267,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,1325,-1017256565,736922453,1996443840,-26108,-443875328,-1957313699,74907628,16777114,1575324416,-326412861,-1710983425,1430,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443875162,-21249187,83591425,1393062658,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1073861263,-1007912629,567095476,-1023298397,28182158,741772070,889239552,512303565,109838754,521011620,-1171980104,567084144,-200373450,908256001,32900805,-617358708,-232849610,-385649919,-986251703,-1946027514,244698,-232849610,-1021372927,855643321]},{"sector":16,"data":[-762841381,74711297,567099060,-1007492541,-387151019,1996423243,1042436,-1017256565,115600690,-657331503,1438907106,1122561163,-29235200,175432714,294528,1187382389,-987824636,-1207852522,567092480,-200373473,-1157111039,520028162,1183515122,-850611196,33864481,33880961,-11335565,1128487703,-1144786197,-75431420,141754886,1528299347,-219462845,50341059,50520577,50358272,50430977,50358528,50406401,50358784,50356481,50359296,-16771840,50335232,-16730112,50335488,50415361,50360064,-16707072,50335744,50350081,50360576,-16712704,50336000,17070081,50331904,50352641,50360832,-16715776,50336256,-16644864,50336512,-16647168,50336768,-16649472,50337024,17092609,50332928,-16620288,50337280,17104129,50333184,-16633088,50337536,17107969,50333440,-16563456,50337792,-16574464,50338048,-16577280,50338304,17120257,50334208,17126401,50335488,17133313,50336000,17139457,50336768,50635009,50332928,17150209,50338048,17079041,50339328,50455297,50339584,50346497,50377216,50528769,50347008,50491649,50349056,17071361,23296,0,0,1167087646,518818645,-326903666,340167432,-1962790237,-89976250,273058562,-1962771293,-22868410,205949698,-1560279251,1183515168,59548426,-1559738741,1183515208,39232262,723154687,1996443840,410451734,-1157627976]},{"sector":17,"data":[1347616767,-1709541633,65535,-1980217719,1347615318,16777114,-62486272,-362753,-6621066,-1962934017,-310117306,535137026,382356829,-1873273344,-326412987,-2116514274,1442910444,-244025,205949951,1946226749,17906952,-387359628,242679554,36845311,1073938081,-761638882,-16777215,922685046,364380722,922701828,-1070923232,-6664112,-16776961,-22999434,1344159746,49952511,41694975,1346375864,109978,1975520000,242679563,-1705983957,594,-385875528,-90111343,172374274,1187448693,-352318966,36872461,1963607609,172410629,1183514635,81162,37559156,-385649408,171770141,-385649408,188547363,-385649408,1357447748,242679554,1342177720,243866,-6664192,184549631,-385649216,1996423735,842465038,59547906,922701854,2124022304,-1929379838,385809542,59547984,-1046851554,-1929379839,1358888070,1342177720,-1929224728,1358888070,184758504,-12421952,-2037576074,1343684348,49952511,41694975,1346375864,226458,1958742784,59547940,-2037559266,1343684348,16777114,242679552,36845311,503549089,-26032,-1192689664,-1942552831,1354771203,-16644632,-402420682,-1073020199,-1070920844,-26032,-1729560576,59547905,-6664162,-1929379585,1358888070,2062028432,1958742786,-62470350,-1935605759,-1588584957,1344143944,1344798904,16777114,1444842240,1023904002,259391487,38280843,163715,1187448181,-4,1996426870,-16323588,-1070920074]}],[{"sector":1,"data":[-26032,954793984,138840833,1946157373,146699,-152501387,19261696,-15829249,-1929235914,385809542,540475216,-26110,1996423168,59547918,922701854,-6683910,184549631,-385649216,-1935540437,-1706025469,687,-17529207,-17004915,-6664170,-1996488449,-1946224506,-58552848,-158955010,-2133292034,91499071,1966751616,112645,-1070923029,-17660279,-17004915,-17398215,-2037560202,1343684348,-17398133,-6664162,-1996488449,-1946225018,-2012771624,1023340678,1006924842,-955878081,33485446,-157381888,-2012771586,1023340678,1006924892,-1950780102,520025734,-26032,-2037841920,-1098645770,1946222322,-192509164,-1945203714,-1933507837,-1957670182,-335612282,-192509166,-1945203714,-1933507837,-1588571430,507511550,-106263,-1935602058,-11526653,-16582090,-1207796682,-1706016752,65535,58048523,-369198359,1996488259,842465038,142016258,250089104,1589652224,-1962742397,1297948645,503319242,1430622296,-1910575989,108954072,762643200,-1207273729,-1706033151,964,175570768,-1710721281,65535,964688,1354771280,-6664112,1342177535,16777114,49120000,1562371467,445005,-2081649835,1448545004,16402119,105286400,1344163870,172186,-163149568,503727619,73701968,-259325952,1015086731,-2146208466,1966014332,-159481075,-955812606,63558,1015038699,-2147126180,125123132,33048263,-2093880576,1946158206,-339727612,178179,972572297,477300350]},{"sector":2,"data":[1949187456,1547534378,1183519348,-1957683706,-1706025273,751,-538183541,503399565,-129594544,50202115,2073710622,1577058305,1575324511,503317698,1430622296,-1910575989,-2098429480,1988843008,516328198,2122747216,-1202710785,-1706032896,549,91602955,-352321096,1589652226,-1962742397,1297948645,1426064074,-1957237621,283837558,1948925056,1060929541,28837237,1174989568,1962949760,1589652459,-1034033781,50337282,50459137,50358272,50582273,50360064,50583809,50340352,50417409,50340608,16799745,50344704,16806657,50344960,17082369,50350592,16983553,50351360,17041921,50351616,16908033,50351872,17070849,50354176,17038593,83909120,-16757504,50332160,50357505,50353920,50395137,50354176,50415873,50354944,50378497,50355200,50424577,50355456,50499329,50356992,50391297,50357248,50384641,33580288,-16756736,512,0,123170792,40018180,1946830393,19720451,16777114,2047228672,-402426622,1183523478,1958742788,146696,266929012,1714880257,80996354,1358448265,-1996154136,-11471290,-16498634,721700918,-6664000,-1593835265,1183384130,108432382,737572395,990003254,-1996259642,1084358262,1241918212,-230258428,721974923,-969148298,1988690814,-633929742,1354771202,37762815,-887041,-1705968010,75,-1946270069,-788246002,734079969,-1996262394,1956772934,-96040702,-1711520117]},{"sector":3,"data":[99094155,1956903415,1975520002,1946615556,41197826,71607112,-1711520117,99094155,-1031013897,-775804007,1419985144,-1580692732,787939956,-939325976,58199689,1851011,-398167040,1956716406,-96064766,200558217,-348881216,1144425247,-193582332,-422378831,51295487,302368395,-102215677,1958742809,-196149495,16023171,1996479349,112884,244338768,-1206161688,48955393,-389824469,85284440,-1962933826,-768931770,1183578251,1457420,58091892,755185129,322764802,-385649152,-1073545011,-1476448621,-1070922648,823846992,158646283,39991039,16777114,1979058944,57338115,-375799765,28836728,-102215680,-1577850064,1178141282,-385649650,726663313,-6664000,-402652929,45626593,1307070464,1354771285,16777114,-2084377856,1946159742,885516476,1996470251,108461838,-16222465,669518454,-336557058,2050424740,-26110,1996423168,-666465010,-6664170,-16776961,-1679239050,242679562,-2590977,1290328694,242679557,383272589,-26032,922681344,-6684038,-385875713,-8126621,-16156927,1996426870,14936330,1460303615,723785192,-11933194,336232067,146339189,-236433408,-12981975,-1705983957,65535,-1191235863,-219480063,39991039,16777114,1975520000,-15079165,1851011,-15961088,1996425846,429713414,-41239,1996425846,319154182,-1577102615,1183384168,47882746,1963869753,473858831,141819904,956583585,275973702,956458657,242552390,956490401]},{"sector":4,"data":[108398662,-1996257119,1996487238,-25862,-1125580800,40280574,1963869753,48406811,1980253753,37527827,-1593424343,1177092678,-432603384,9693442,956465313,1198853702,1851011,-1589611520,1178142186,-1592364538,1178141252,-15830266,-1207803338,-397410292,1827219066,59810302,1913013817,49586449,1929791033,1647771401,899074,922738923,179831394,-1579685120,1178141402,-385649650,1048837873,1946157084,937973568,-129595108,38405691,922685812,-6684062,-16776961,244381814,-1591978008,1177093198,1245118214,469755906,-16234967,-16614858,1996426358,142016266,-351897857,142016341,-2130282753,33754238,28837237,721611520,1810387136,-35788527,-15829249,1996425846,108461832,-384675352,2122579491,57999370,201225449,-2096138753,1963002494,1345781513,-401698816,1996423628,73709582,1354771280,-6664112,-385875713,244383131,-381577752,-626917997,239483138,988349300,473859070,57933824,1358835945,-1588543445,-523172770,1354771280,16777114,233826304,47855359,137114,47882496,-385855325,-626918057,239483138,-18283660,473859069,57933824,-1694632727,65535,-386057495,2078803917,-47060729,-15829249,-186119562,-47847161,-385788696,-2115437281,-48633598,36897175,30016051,65930166,36897834,36897331,36897331,31261235,26083694,36897331,71763024,1963004733,-38737661,440215671,1036219392,57999390,1040035049,57999616,1040119273]},{"sector":5,"data":[57999633,1040017385,57999634,-369264151,356384113,-385649407,373161358,1032680449,57999872,1040036073,57999873,1040049897,57999875,1040047849,58000484,-369166359,1996488001,209125134,-16091393,1996425334,-26106,-389873664,479848,39991039,385369741,90479184,1084293120,-230258428,737953419,1183447110,-196687882,1183514624,-163169806,1183518334,-230282250,-775804007,-196703752,956587681,92206150,-336312693,73310467,1377495235,922681350,1183646306,-1706027274,65535,737953419,1183447110,-28915724,1218510848,-196724476,1183518590,1208364020,-1037330172,1183447249,72524286,2130593337,-28931323,1386284011,-102186236,-2097086383,191038,1996425333,-26106,-389873664,414140,39991039,16777114,-28931840,-1962933825,47882743,5244473,922701940,12058704,-1070903292,-1706012592,65535,-1980086647,-801375146,-164953484,39991039,16777114,1958742784,-129579227,183173120,33062531,-13958027,1996427243,-25864,1183383552,1975520248,-25881,1996423168,440574,949638736,-16777210,129564278,-1705619456,1605,-1191282945,1464860680,16777114,572928,1043988267,91553820,146798123,-25755904,1342179768,107977302,1996423168,702718,-6662320,-1107296001,-13959167,956463777,1962954758,-644336,-402503114,-1073005330,146735988,-25755904,1342181304,115448406,1996423168,1030398,-929409200,721420294,673090550]},{"sector":6,"data":[1646134018,-1836583420,57966595,-16774978,297336438,-1705619456,1634,-2097151554,7230,-164953484,-1191282945,1448083474,404378,-1981234432,-16776112,-1711119818,1469,-1694611831,65535,201082505,-15958592,79232630,28856320,-15602944,-6620042,-16776961,79232630,-1070903296,110795344,922681344,1048773724,1946158150,2144261,280495083,-6664192,-16776961,721576502,-1202696000,-1706033151,65535,1344202947,1721828098,138819842,1996431221,1354771206,48379647,37107455,72496895,-1174396488,1347551472,16777114,41984256,1963476537,108461932,652742288,38845953,1851011,-1957727232,-391969210,112742402,-6664192,1375731967,-26032,922681344,922681438,-1679292950,-365494528,13559813,38024959,-16726040,-16752586,-402419658,-190775166,1241918210,-1310175228,108461824,-1106988568,1996423718,244340230,-352229912,47882594,1963476537,108461914,1347469355,37238527,72496895,-1174396488,1347551472,537754,108461824,-1588543445,103481922,-11533230,-16631754,-1207676362,-256245727,-1706012160,1913,1851011,-16223232,-873986442,-15930608,669517430,108461830,-1022974744,5184488,1547108098,108461824,16777114,-399048960,74907394,72496895,99497727,35796735,6043391,1347469355,-1174396744,1347551436,16777114,-504839424,-16711602,-16586698,-1070922634,1245118288,1077346052,2209794,1375793338,135371344]},{"sector":7,"data":[-389873664,17256164,39728895,1358055053,-16768536,922682998,922682462,1183646580,-1924131086,1343681094,16777114,-6664192,-1023409921,38702056,105286402,3979673,1451817463,105286654,-1996884071,1183711046,1996443900,833540,-26032,-389873664,33574496,705054346,-1309635612,82966026,73304880,-2012985601,-154760441,818184433,-2012979573,971555623,-1962803122,1191118430,74877702,-1979431169,168265732,-1947437632,-1018689978,642663400,108461826,1354122893,-1207935768,-1706033147,1955,-6664110,-1996488449,-1072974778,922690676,1183646336,-1706027274,1302,-1996209503,1996486214,-163148536,1996443670,-25932,1996423168,1110900488,1949761284,-1236890365,1183666198,-1706027338,2265,148871760,-389873664,33770928,-375098,-1962516853,-1140521913,-45709049,-1057093750,-1963178360,-1057095097,-1912912248,-11470266,112723062,-6664192,-1023409921,5077992,-1962153213,1191118942,71731720,1183516552,105840390,-344604661,-1022867829,38624232,-62470397,1183524624,-137221368,1183448182,138841086,1995952683,139889148,16678531,2122517621,108331012,33324675,1586172533,105316102,83773066,-955807696,66630,-1962931527,-768869306,1183445495,2009074684,105286581,1292036291,648020227,-2000617982,681638982,-2000617982,715258694,129762562,-1912781175,-11470266,28836982,-6664192,-1023409921,55366632,-96039678,108461904,16777114,-28931840]},{"sector":8,"data":[376815627,1727413424,-61961475,-1056707286,-1996202357,112647,1183515627,-1578580994,-352255924,73304837,1586169855,-2145416444,-244047809,1284171971,1183646212,1996443898,-26106,1183383552,1975520248,73304867,721176202,126437604,-1979425141,-466945210,38242632,-1962647925,-1137836730,71796999,-1007139189,55331816,105286402,-1246113237,-772671739,-1948200480,1200161886,105286404,-235417045,-1106880887,216727918,-1962510807,1207895134,23969284,1178191499,736981766,1862173183,-2096466687,91554303,-352321096,-1967117566,704647309,-1983839251,1178336838,688289542,-347666874,73305048,1586184073,105286404,-1023260791,4970472,108461826,1342180536,-1957642197,1344144454,770970,108461824,1342439864,-1202667477,-796164097,-526757806,-1023410171,4958184,2130753536,1375797178,200383056,547553280,1975520000,-339727612,374833,201431632,1347551232,788634,2269952,-445333493,1342179000,616602,-1706012160,2415,184557219,-1194429248,-389873663,19288,2113155,-16157696,-1711267786,3128,2244227,-16157696,-1711267274,3144,1982083,-16157696,-1711268298,65535,1260579011,1996423685,-129594106,-2070261738,-1962934263,-1593827274,1178141282,-1962642426,-16768458,1183646838,1448089336,629402,434684672,-16711093,-6683018,-1962934017,65558256,-1010398464,4905960,74907393,1342179512,832666,-1706012160,1962,-1207666945]},{"sector":9,"data":[-1706033147,3050,-6664110,-16776961,922682486,-627441634,-1023410164,4891624,1547108098,1647771392,140614144,1996423168,171376390,74907395,50870015,51132159,6043391,1347469355,-1174396744,1347551436,559514,1776861952,-16711606,244319350,1074121192,-1177408704,-235470841,-389823861,16861776,-1962647925,277318175,-1947981312,73305072,721700747,309714,-770969097,1065551477,1174500609,-389822837,346660,1342411448,1342188216,-397361109,649657494,-1159180286,57844735,-1091010931,118882854,-945445467,64070,1358448269,-1543534616,1923155042,1644561155,394500,129618475,-1544423680,1654719568,59901188,-939637111,128582,1586171627,-28901378,-1997126006,-163119353,956527265,-361302458,956442273,1963085830,36348182,39061049,915082613,512426578,-2004876190,-398457966,-389872299,346512,50477217,-1727772154,-150992967,-62486023,-150713695,-28931624,16402119,-94467328,1183572945,-259552770,-62485755,-113151,2122578502,-444856326,-772120949,37265891,99649417,721576097,-1727770106,72355467,1183447543,40149494,-940030327,64070,1586173419,-1948003846,-2021001146,1183516160,-129629706,-1577433345,1178141776,-1948025606,-472778146,721568417,-1996205562,-1023016825,38337512,-10229759,-1996095304,244055110,-506395568,1183432963,-14357506,-1070922634,-60912816,922695679,922681912,565707858,15776256,-426094510,-2097151986]},{"sector":10,"data":[-1962738618,1178205766,-1194036484,1183385074,787964,-335657335,74907429,-237941,1681325879,1245118210,1614216964,2209794,1375793338,145660496,1182990336,1183515388,-62506498,-389819534,20138104,84028065,1183385532,36085999,1183367422,-330920466,-1404662448,702544,166697552,1183383552,1580136354,-1580692732,-1054145992,-775804007,-1471772168,44320455,74907392,178256,-1404662448,1996443670,163224226,1187446784,-956067082,100705862,16664263,21031168,-2086248821,-1962760634,-230258425,-1952031093,-230282489,-940292471,99658310,16533191,-1436644608,44713603,1183385483,-1436644360,1177225099,-96040456,16678531,922701941,1183515388,2146633212,-1639543472,79187990,-6664192,-1996488449,787978822,-930413474,737822347,-1037329983,1174665425,-1471772168,721577121,-1996101626,1996465222,-1468596476,-1639543472,1996443670,256547482,1586167808,4161782,-1779891339,-1572419840,126484482,1059382314,-1404662448,1352418953,-1946615576,1065393246,-16354000,1191158350,-1572435044,73281271,1183565963,-1715393542,-120470997,-1980217853,1183557702,1611017204,-1037330172,1174665425,1376125938,-1538881276,-151626101,225722375,-16484609,-11470730,1189673590,-161576191,1954547702,74907407,-493825,1996465270,4909306,-16484609,1996466294,-1673098332,1996443678,267033250,1191116800,-163119108,133987971,-454491267,-28901378,956584097,58588742,-84503,922682486]},{"sector":11,"data":[904397352,47882497,5244473,1189610357,-1377254655,-1962671034,-788242890,71732198,731498027,66638274,243992646,-506395574,1183433003,243960,71970551,66602499,-96040506,-1962522997,-788246002,-1983829023,915144262,908788818,-167050510,-963967874,-1070923029,50742787,-1996201978,1996487750,-126419190,-1946257665,1177287238,-11517704,-1207676362,-256245727,-1706012160,4446,-16091393,1996486774,-96039940,1090012715,1379336016,2209796,1375793338,293640784,1996423168,-126419190,-100609,-1962653130,1177287750,-1202700034,-256245727,-1706012160,4514,-16091393,1996487286,1245118462,-62485756,1090405931,2209872,1375793338,246127184,-389873664,67126728,-1962248449,67438662,1996443648,6600710,28856350,-442871808,-16777199,1183517302,71697160,73270827,1342178093,-1207535873,1344143462,1342177720,1084058,-2048343296,-16644539,1183646838,1156075764,108461824,385107597,-26032,-389873664,410984,36189951,1358186125,-1962924312,1174664262,-1037329928,103545041,1183384670,-96039938,72484395,-244087,-1705968010,65535,1160964291,1183515139,1644561158,-28931836,506265,1451882999,-28931076,-1980106855,1586231878,-59340028,-2071206191,100861424,126420042,-1962647925,-422445962,99779723,-1962653815,1988822110,-1947807238,50724996,-1996205562,1586168391,-92894460,-2071206191,1200162306,-840383738,-1962672060,130483294,535494656]},{"sector":12,"data":[-1962385781,121178694,1182998399,1586168328,2080848136,112645,1586172395,-1962410236,1183515742,2080848134,-1010816041,38058984,23967745,-150577525,1183384679,75465724,-1962118144,-783809465,1088999912,-1946401279,529204830,-2020875311,1174470760,106859516,721700747,309714,-770969097,1065551989,-16550399,1586232390,38243078,-1946401279,-389809082,541756,-1091273075,118882854,-945445467,63046,1358186125,-1947726192,-263812609,57804291,-375159,1183707254,-639086338,584837152,213436555,-26282240,1183432963,-1960252420,126614622,1005733513,594803270,163715,-259322252,-1947175381,-2147196386,-2147249528,217859715,-1577171201,1178141290,-388989698,-389864792,345028,1851011,729576448,244338880,-940449816,7174,-633929984,112642,1354771280,1342545848,-1705983957,65535,47855359,1342177720,-150991688,50473510,1342318086,1342177720,16777114,2050424576,1354771202,16777114,-2143879424,1354771202,112720,122460752,681639936,42377986,-2031612272,48668928,5244473,-626982028,244338690,-1007588376,4406248,-331447552,108265474,49024767,1048778219,1962935024,-339727612,-267452659,-335100158,-1207956734,-389873663,17168,49036931,-16354293,-352130042,-264338667,74807042,233553963,49284863,49022663,28835840,-437730560,-2097086398,1946158206,-3676155,-1746402325,1958743039,-401698811,-389873663,17136,1342368952]},{"sector":13,"data":[1224240360,42337851,-323483021,1592283138,65751288,-1560115551,-152567058,1958742786,36093754,503508158,-1515870969,47855359,1342177720,-150991688,50473510,1342318086,1342177720,1308058,-128980992,-16601624,-1711089098,859,-1022289432,54682600,108461827,1342566584,1342179256,1358710413,201162728,-10390336,12060790,922701830,1183646800,1776832762,1958743037,505931,-1946521865,-60947496,-2130813303,234175,-323013004,36093442,-1515911394,734235557,1342464518,-1711166744,17,47842875,922683764,244318938,-2081414168,1946158206,36091911,39839824,1105651907,-323026432,36093442,-1515911394,105286565,376750091,1946157373,146716,54336628,1026388992,896794628,-1070917653,-19994544,-352321096,112706,1048834795,1962935024,-339727612,-267452622,-401698814,-521404723,49299075,-1411977,-352129018,71732204,213504555,-1544423680,1183515376,-137221372,-334067215,-1009587454,21064680,473858820,57933824,-1593771031,1178141402,-385649654,-1084882704,649986796,-1526260222,-1956731483,574425158,-385649408,58065061,1023457769,57999369,1023450601,57999373,1023451369,57999393,-385842967,1048772792,1946157806,49193223,1558925384,201182696,-1207143232,-397409556,1346959021,-1207901208,-1813446655,-298415360,1923171842,2096118531,-36444106,-411779061,-538197973,49165963,185069187,-400523786,-1072956014,-323432076,1927827458,-339344394]},{"sector":14,"data":[-298415166,130450178,990081697,1443266032,-352301336,1916152754,-40638461,-1485520885,732031830,-1310175040,-1197675523,-169148415,48641791,-1243083120,-1198724114,-397409754,-2081750795,1962943805,-10819325,1946166845,2571667,1961427829,2637311,-1070881932,1079961795,1183514881,49193732,184591592,-13208384,-1878861258,-179116018,1358841481,36189951,-347160,1183579766,36217604,1342342819,-351256,-16590282,-6619530,-402652929,-873923919,367575822,-1962868672,-291306426,6023170,192200715,-1560000885,244318854,-1006817048,20969448,73304833,-1593673845,121176614,715198069,71776514,-397015435,334233467,1443120779,-1962742593,-1526259984,1449043365,-1006653464,71287784,-633929984,1354771202,112720,336763472,-389873664,147372,1403034,-1192195328,-1873804564,-83564530,555149392,-1873348469,-306518002,-389822581,17383304,1851011,-948931328,16784390,1354771200,-1645736304,48669165,5244473,2057373300,5284610,47855359,385369741,207329872,1386283008,-28956412,47855359,1374162576,-263812620,-129594032,922701846,2040135714,-16777204,-16590282,1335554166,-16777193,-1207797194,-397410176,922743618,28836474,26890240,-16777196,31982710,99140352,-16711361,244319350,1358587368,186677224,-1959693120,648086622,1963407618,36348168,1946437433,112645,-1070923029,1183576203,650073604,519080706,-1515870969,1962281822,-191109117]},{"sector":15,"data":[36714239,721524712,244338880,-1593376792,104399590,108331088,-401698736,-1679233840,-18425,133228624,41957119,1347469355,1342177720,1556122,-2143879424,352623106,922681344,-1070923046,28856400,-442871808,-16777192,-1711089098,6382,-1022552600,322854888,198567937,-1577695607,1183384654,58106344,736904841,18213375,105113687,-396889973,-1073010110,1996425076,-1947707900,-773878797,-1948003869,-1996288377,-1924074938,-397353914,1183444878,1962871792,-226590452,91488976,99632839,74907392,38680319,-599356074,1996443670,298031856,-396951552,1183385073,1611006954,-297367292,-2114042169,-773879040,-1948003869,-1996287865,-12714938,50951423,67499590,-28931840,-1962641665,1344208454,1358954424,384321165,2144336,-26032,1043922944,1953825354,41563903,1347469355,16777114,2050424576,768002,1354771280,-107327408,-16777191,-1207797194,726664192,1347440832,1708442,-129595136,-371063,-1207797194,726664193,1347440832,1713818,2050424576,768002,112720,1354771280,440179280,922681344,28836474,-1070903292,-92864688,-1694992641,2989,1950234951,-385647102,-1125581086,568902410,-1962867907,1346372678,1342377656,-1207882008,1183384334,1141804030,-773730044,-1983839263,384563782,-106869,96701239,-397410300,-1073020780,1182993524,1183515902,-28952070,1183572594,-28955654,-120457007,201082505,1345093312,-1962923544,-523109306,235266257]},{"sector":16,"data":[-28931837,1586172651,-1959264258,273859,13232208,83783299,251559553,-1008240893,3973096,51296257,71732048,-523116335,1342377477,721581217,-523172794,-397352751,-389866821,16792700,-788248949,98619872,-1202715890,-1588591858,1177223796,-773795580,-1729605408,1508426522,-16645316,-270006666,-28915962,-739768928,-1982297335,1688336990,138885380,-397209484,-259323388,73670283,-1996341109,-1058472378,108461833,990289640,92208710,-335657333,108461830,-1996058904,-1606613434,721712389,-1960711232,1183515742,-1962440442,1178205766,-1593477882,65733732,-1946157128,1200161886,112642,1004726467,1996423682,108587014,-112953,1883145215,309657346,-1962326296,1881050096,37784322,-385988983,1183517011,1183401990,108954620,-1726974976,39325323,1445591543,-58817540,-955941632,-954,972834443,92208710,-335657333,-62485757,1074153097,-1070922635,1586176491,105286404,1183516553,105265662,1889600885,-1207702782,1586233343,38242564,-1023409736,70999016,105286402,376750091,1946157373,146726,54341748,1026651136,846462980,28863723,28856320,-1070903296,-401698736,28835935,-1202066688,-1202716671,-1873805311,24897550,922741995,-622132156,71579391,2057431531,1342585090,721974528,244338880,-1497112,-1528298378,-840413180,1354771453,904400528,74907395,-16500248,721607222,-1202696000,-1706033151,6399,-1070881557,988997827,2057372427,1342585090]},{"sector":17,"data":[721974528,244338880,-1578572824,1183384334,-336188432,238485284,-330920701,-21108656,443858955,1342177720,-1946290712,1452010566,51291118,51385993,175520070,-166996097,2122411892,1946341616,-633929934,-401698814,1183444860,922702066,922682454,-2101869484,-1588584960,103613530,2056933376,-16777191,-16590282,1201336950,-16777192,-1929192906,1343682118,1579674,72655104,-1577564535,1183384440,-633929732,1354771202,-150607711,1183666414,-1924131082,1343682118,16777114,973024000,393480318,50481825,1141259206,-1593344764,-972881334,1151402987,1475906308,971509392,2097036034,108954374,1459909632,184650216,-12880650,-1711089098,7630,-654850421,54978640,16777114,1958742784,2050917153,443809794,41563903,1347469355,1342177720,1875098,2050424576,419994114,-389873664,34355652,956463777,1962954758,1354771208,-1243083120,-336188441,1142852405,-773598972,246939619,-297366269,-48830384,594853899,1342177720,-1946359576,-788249570,-1948003869,1452011078,243763696,278366467,1983464963,197558024,-385649162,922681477,1183646426,-1706027274,7477,-1996204895,2023880774,-62486269,47855359,-1957642197,-136775738,1342564398,385238669,-163148464,1570394134,-2097151971,280126,922699125,244318938,-1980889112,1048703558,47186702,850920829,-1207702783,1183383864,-227082262,72759039,72627967,1344163870,636058,463097856,-16777187,-16590282,664466038]}]],[[{"sector":1,"data":[-1962934243,-2096872386,1946158718,38445328,1183434283,2143292392,-1950340350,244340728,-1593775128,-970259388,75351867,3991639,930412043,47855359,2037658,-35105280,497654273,-1073020928,1048781172,1946157690,2050424602,1354771202,112720,499489360,922681344,-1667628422,-1023410147,70800360,74907393,-1996469016,100923974,1183384672,72262142,-1577564535,1183384438,-633929732,-129594110,28856342,1855606784,-1929379809,1343682630,-11485141,-1711128522,65535,40253183,385369741,112720,521050704,-389873664,16791548,-150714741,50718766,-1023126522,3664872,74877697,72627755,75429387,49006219,-1952858069,-150607858,1141259257,185826564,-1962639626,721611718,244029888,-101251608,1151402987,-639057148,-1593768905,104399482,141885520,-1873756117,-439687154,-1559869813,922681930,922681978,-397409202,-1588527219,103482230,-11533234,721707062,-1868934976,-402653184,-259324689,-1962899009,-472840610,-2020875311,1183384336,-49670,-125106316,-947651069,2050424580,768002,1354771280,1218072656,-16777184,1459780150,-1351192,-1207797194,-1202716661,726663169,-1706012480,6631,41563903,1347469355,1693082,78505984,956463777,1962954758,244338694,-1008389144,3605480,-633929984,112642,1354771280,1342546104,721454568,1342338054,-1705983957,8387,920578243,922681602,28836570,1183666176,-1924131074,1343683654,16777114,-633929984]},{"sector":2,"data":[112642,1354771280,66864779,726664262,-660975424,-1023410157,3581928,74877697,1979711107,238485257,2942979,922742923,28836570,1347833856,1373594,-2115452160,-16711626,-1207772618,-1706033151,65535,1342457347,-1006648856,20342760,-28915967,1183711231,1183666180,417878270,-28931328,911141059,1183645953,1183666430,82333700,-28931328,909830339,1586168328,-12614908,28837237,721611520,-163149376,125091851,-1962516853,-1207702777,1183384992,60614908,1358186121,-1996236824,1586229830,138871796,-1912977783,-11472314,1357445750,737708800,-25785866,1586178539,-28931324,611583801,5892182,-147066741,1183650428,1996443890,2746618,-29624181,-141884803,972965631,-763364234,-2096934168,1946220158,73304842,-1979824501,-1962546425,931726942,899868867,-1598094846,106859269,1983592331,-1962183932,76153468,-972823510,-947189879,897771715,1988821249,1480493828,-1715041534,-101199989,-33293781,94371713,-1598094466,-1010332923,120938472,48556033,-1191688567,2024013823,40936194,-1946657141,1688406087,233329412,-62486269,-1946270071,1191442526,-196703992,16402119,-196703488,1946043961,-27358422,-467007606,1183433475,71732210,1963083577,734235439,2024012870,-230257918,-1543748053,1187447908,-1962933766,1178205254,-1962314498,1177286214,40936444,-1962770712,602667590,-1946263925,1194918982,-1962246654,-62510141,-352033629,-28931118,-1946794359,1183445574]},{"sector":3,"data":[-1013781506,859093992,1245088512,2050424578,899074,2734160,-1471771312,731533334,-1996488672,1187421254,1187446998,-402653030,1183384075,-773944364,-1948003869,-1996287865,-12725690,-1961200385,-729938952,-467008118,-1996487379,1183685190,1166889174,635981828,-1673098266,1973044793,-700019432,1183666198,-1706027352,65535,91602955,-352321096,-1983894782,-790060986,-1602321663,-385649664,-1209532223,-1193768191,2124611585,71796995,-2097039640,1979699838,-1520009193,-1520008963,-773944322,-1948003869,-1996288377,871081542,50428648,-1924083130,-1202674618,-397410300,-2065165781,-763953407,-1962892824,-773598754,277333987,1459617539,715409034,1356396516,-1979686424,84188230,1317790762,14778532,1183432971,-1669430364,-150047488,16819270,1190594421,1946288292,-763460806,-1961658881,-773598754,246939619,-30087165,-1996200799,1996476998,-1538880046,8775760,-472785269,1183572945,277318098,1183471107,1357130404,-1023409688,3369960,-1961497854,45155958,-964565293,1015218960,-1962576641,67175494,-1593424129,1178141300,-1008698362,87245800,13166593,1358448265,-1996422168,1174665798,-62486268,126539915,1183441962,-1983708170,1397816902,-1946657141,1174603847,-28955654,290056272,-1946657141,1193932358,10086408,855566531,-2081947130,-1946645760,126485598,1183441962,120502772,990399787,-1207601215,48955393,1183432747,1958743036,73304891,50423680,9889879,-1946663287,108397552]},{"sector":4,"data":[66340491,-96040506,1166757974,-129629432,-397359573,1996427495,1996445188,282978548,32786059,250284101,46020351,-1202667477,-397410256,552078581,-62485760,847440067,132644865,1458604800,-1023392792,3306472,-2110324992,976898,845605059,922681344,367526530,1508426496,-1962868686,-472841122,50509823,16777114,1172882176,-1962868686,-472841122,50509823,16777114,837337856,-1962868686,1200292958,96666374,-389873654,6959648,-1996453192,-1979765114,-385930106,-125042790,425347,1166870388,780568842,-432603137,68728834,112720,1354771280,630692432,1183383552,-432603140,964610,1354771280,-1231400880,-1962934235,1962281968,1345781529,899072,-1923725744,-1979763578,385821830,584030800,-963969024,-1996077781,201273990,-1961527872,520040070,747014992,-1706025217,8996,745848843,-10557353,1508398928,847643647,1979666687,264103944,-13846785,1342850445,263317590,-1207536247,2124611585,71665923,-2080440600,1946221694,-432603374,68728834,1354771280,-2103816112,-1023410139,36785128,9158144,-1946235416,108889080,-1962576896,180782071,48641791,-447420330,-1006714136,53553128,108954370,-1207601820,48955393,-125059029,158727947,1694924419,-873921676,71731968,1946222653,33570069,4025716,-385649405,3997833,-378244091,-16056146,2057390964,5284610,-1946261016,120174832,-1559739349,512426124,-472841654,-2020875311,1183384336,-49666]},{"sector":5,"data":[-397012620,-661913976,-1963041277,31730183,-402617338,1048837699,2097152140,-1945712793,-352321536,48669023,-956280669,-1056928762,-950932736,-16741370,1962871679,-70981627,1525170923,-12719106,721591350,817385664,-689418240,187558666,-1593477889,65733242,990045857,1962954758,1345781531,964608,1354771280,530206800,989855782,2113965062,124931,809167043,922681447,230162512,-927444992,-2037559296,1343684408,2566042,-2114614528,-352270098,847678227,881232383,516328447,-26032,-259325952,-986986869,-1996437499,1006580358,2113965062,884902876,948160255,922681599,-2037579696,-397344968,922739718,922682046,817365696,988303360,-169295094,-1962603985,272436294,1023898625,1014235409,1183538923,5022478,33179334,33113798,-1124383033,-129594105,-330920624,112720,177707600,1996423168,440334,-330920624,-6664170,-1207959297,652935169,1024083595,125042689,1946157629,-1250550,317197942,-1774848,-1070920074,-26032,-672464896,-389824469,17772376,-1207666945,-1924136954,1343678534,1342180280,2638490,74907392,1342179256,385107597,768080,-26032,-1073020928,1183648629,1183666420,-504868632,-398029344,-498692784,-494540720,1450557451,1358186125,1342368952,199390952,-1203276352,-1873804564,-362747890,-1929183069,-1957567922,-401698576,-2036077998,2009479939,-155693015,-1511501822,3604235,59422723,194701392,74760203,59377407,-1207666945]},{"sector":6,"data":[-1706033151,10254,922685163,-1070923122,4241488,152299600,782690499,-2031615998,1354771200,-974647664,1458973660,-1946404888,59154936,1912751417,50372877,1996637497,38127365,-396951553,-2092499920,-612629506,49690367,721652385,1342371334,-1207157016,1347421050,1342177720,-1873756117,490072078,1851011,-1207340032,-397409754,502001468,5256959,1709706896,-1084795172,649986796,-1526260222,1583326629,1525157520,2114373611,-402652925,-389873631,77336,39466751,2721690,-1578071296,117375118,-1073020786,914949237,-389872580,11768,9309951,922683765,-1097202628,-1023410174,154002408,-1084795390,649986796,-1526260222,1583326629,1023690379,58064917,50498281,-13724736,724306343,-706195264,1975520008,41281795,1342177720,-384347160,-1070923157,146729040,58048523,-402497815,1491670986,977175298,510918658,1558938,-297367296,1342422200,1342177720,-15616280,-1365578122,-385875963,28836403,770199552,36301058,1342177976,184689640,-385649216,1642594843,34990367,1342178232,184684520,-385649216,-1729625593,33679870,2745754,-297367296,47842875,-253164683,12079105,-1070903292,-1706012592,10915,-1980479863,-801376682,-722926731,1095681,712219216,-1073020928,783814013,-6664192,184549631,-11961152,-16621002,-1711119818,10928,440400,8435792,717068880,1996423168,50378990,1354771280,1301958736,-16777177,-16621002,-1711119818]},{"sector":7,"data":[1776,440400,1354771280,16777114,24242432,-1192331521,726663939,1347440832,2773146,22931712,2811034,12079104,-1696077053,10991,50444368,899341547,1342177322,-352124232,-391124783,-2097072407,7230,1354237300,-1200428286,-397409712,552201318,473858817,494141440,1342318264,-1209528688,200838119,-385649153,1464795399,1342368952,-337646104,1354771265,-370586648,1048772851,1946157084,36091927,-401698736,-125048950,-1422524543,-655817867,-806664448,-352321096,309462,13297744,58048523,-2097102103,7230,-323483020,-370651134,11659756,-352129864,405072005,-1207916823,-397410299,-1073020768,-1729559691,-26112,113704960,66430,-402617623,-2065102849,440320,8317008,2037694475,72892035,-402295808,1844124723,-350457368,505960,6482000,1567932427,58590919,922681345,244318848,-1948215320,244340464,-2308888,1443004470,2011034,473858816,896794624,1342318264,-336863000,-903236820,36298025,539626538,-483731414,2813482,-13960916,1110119722,-1993644757,-1423208661,-852774613,875312427,971555626,-16711381,721706038,1996443840,1647771396,73304834,-472783919,2275327,2144255,16777114,-940537088,19462,837337856,-1962589397,272436294,1023898625,544473361,1183528683,5022478,243792,374864,73971792,-26032,28835840,15853824,1024083595,359923713,1962934845,13297923,1962935101,13232387]},{"sector":8,"data":[-722878421,242679552,1342177720,16777114,1570394112,184549378,-3705664,62393974,-2037559296,1343684474,1342210232,2633114,2055638272,-1706027265,65535,-8747379,86501456,-8747379,-26032,-1073020928,922686325,-2037579064,-1202651270,-397410256,2112423113,2055638527,726669055,-6664000,-1962934017,91504888,-352321096,-1950340350,1962281968,-6662370,-16776961,-1929206730,1358920326,1342252216,1023709416,57999367,-1912651799,1358920326,240248918,58048523,-53271,28839542,-1264955392,-385875928,1996488480,-339727602,242679792,1342177720,-402098433,166266062,233358335,-1962604502,272436294,1023898625,477364497,1183543787,5022478,505936,9484368,-409317346,-1207959513,1508573185,1024083595,125042689,1946157629,-1250499,129502838,1183666176,-1202710798,-1706033141,11485,1358055053,1342368952,-1982005528,-1072959418,1996425333,112654,28840427,1996443648,84470000,1996468715,1354771214,2976666,732228352,-2048343104,-1962606039,272436294,1023964161,913572113,-1962881047,1285754438,163074048,-2069803008,34775810,-26032,1996423168,571406,49848656,1342312611,-1705983957,65535,-385875528,1183514782,81162,37555316,1028486144,1433665545,1996482283,571406,-62485168,-1070903274,-26032,279117824,-58817790,1023767552,276168714,44971775,-1202667477,-397410240,-1259666627,-1560145247,278987396,49849090,-1207011585]},{"sector":9,"data":[99287041,722368255,161108160,-352321490,242679699,1342179768,1343125247,16777114,1975520000,112645,-1070923029,775592528,1048772608,1962934802,112645,-1070923029,-385740125,-1070858402,681502915,1183515914,17841420,289212532,-379751423,1183514911,5022478,38411915,-472783919,51298187,-1952856181,-150841330,1959922681,1183667993,-1343729428,242679769,1342178232,384583309,766483024,1996423168,702478,50378832,50391120,-1207011585,-1202716661,-397409536,28836594,13101312,1024083595,913571841,1946157629,212266,171773044,1025995776,779354123,1996479723,702478,142016336,-16596504,196611702,1996443648,-4134136,-1070920074,113737451,66648,45364875,113707755,1112,45233803,-1207011585,-1924136957,1343679558,1342180536,3004570,-330920704,36485200,-624891824,200820361,722238912,1996443840,52226296,-1577094167,-1952906708,-150841330,1976699897,-1338573050,-15799550,-402510794,104067590,242549848,1354771286,1342193848,-385761048,1996488516,112654,784046672,904462336,-1010816001,153577448,205949701,1946226749,17906951,1391155572,-1559345525,-1202716596,-1202716657,-1588592624,251987014,34906880,-26032,922681344,1183646256,2011713774,242679768,1342181816,384714381,792894032,1996423168,41066766,-1560278011,-1706032618,11453,-401698736,-1070869240,-1962866199,19728966,998656,-118946954,-1816132864,-2119696594]},{"sector":10,"data":[242679601,1342181816,384714381,833616,802003536,1183645696,817385710,-873967614,-96040487,209567755,-11485141,669579894,12445954,755111073,1183383567,71737852,1962690105,-62485732,-16496989,184835126,-1207601984,65732640,1342181560,474010,35037440,-1560277971,-1073020302,20778100,1024816128,410255362,113706731,983640,-1207011585,367722497,39323335,-253034466,39323335,-387252164,722368255,647647424,-352321488,242679628,1342180536,1342181048,-1559607669,-1706032618,12382,1996436459,1030158,1095760,172395344,-352185181,1211150821,-1590582991,-1590582991,-1590582991,-1590582991,1429315889,1429296433,1848733233,112689,636676291,1183515904,17841420,289212276,-351439871,239504159,-1207939933,384499713,17464963,1996426869,112654,827300432,-404029440,-389824469,58860948,-16742771,142016336,-1948824600,108954608,1443329024,-402229505,1049351996,-16056244,1049298037,-1923677598,385810566,42639696,1996443678,-26108,-389873664,16852308,-956008821,65094,1015028971,-2146667218,1965949308,24936478,-1961331364,-1706025274,10086,1015083147,1457485056,1342214584,-1009327128,2431976,75399427,762643200,-16222465,1956251254,1342177330,-1207404801,-1706033149,12428,964688,1354771280,-778416048,1342177322,16777114,-504839424,-402587612,1048772689,1946157950,-1506345146,62699522,75400016,-1207602176,48959488]},{"sector":11,"data":[588038187,-14423984,1946157629,408866,1048781173,1946157626,62699533,112720,148498512,28840171,1508397056,721939449,-1207702592,-389873663,74888,2808218,1005619968,1963124278,-229382139,909707755,57999994,-1007702552,1143236584,71731970,1962933565,-115444,-12775308,-350128897,47358333,-8878455,2122544363,91488262,-352311621,2603779,-2020875311,-454360440,-8747379,108954448,-1593478144,65733260,1342345377,-1982472216,-2080409466,1946158718,36085804,1183367422,36217084,1183367422,36348411,-1995981819,1183710534,-1224781574,28901240,-694530048,-352321497,1580662539,2025258754,-716379905,-8747379,-1224767765,-1070858376,3192912,-30414768,599976131,649592839,244338690,-1948311064,1183667952,2045268214,833536,-1946784009,41150712,2105800707,91553794,-352321096,-1983894782,1843921477,673090306,1646134018,-1833467900,1048805379,1962934300,674692893,-129594110,-566630320,47855359,385369741,112720,525048400,113704960,66430,592636099,922681344,-1070922260,178256,-26032,-324861952,-1547687163,1789068004,837337858,-402520541,1183384061,73305076,931788331,40517259,-1983894705,1183448134,-2091717640,1962997886,-62470320,-963969024,731498243,-1946627646,126420062,-1962931016,804717662,1577310347,-1995994124,1178334790,-955812602,129094,1183521771,105265654,1187450230,-1962933764,931857502,-1962480826,1066075230]},{"sector":12,"data":[2130131791,26929322,16547459,1586169204,-1962410236,-389810106,33759912,-1593543029,-268238230,33619585,922686078,-1070923076,3192912,-51124144,1626062891,48510521,-24435075,-16201853,-1207571402,-269025268,178256,875469392,-1073020928,922682997,-890568036,48512649,-1962858264,833736,50753271,-28931647,833616,50622199,-1588527546,1177223786,833798,-397350409,233308267,1781958913,112642,572713155,213385730,107935488,-420941685,-1192230144,1861681164,1355154180,40542550,721831467,213451846,1357510400,-1962921240,103351366,-840433046,1782483712,147292930,990045345,-15106568,-1996100554,-1962744770,833991,-1202656777,-1706033150,13574,566421699,1988821761,108397316,956712587,477235270,-16497013,-1073019826,1586182004,105316102,-16220533,92932166,-454359160,17057419,1988692038,-15668474,1586169422,139394822,-1979154805,-1962440699,1325335622,1975520004,-1010398234,35744744,833537,-1962643721,3139824,2089021443,292880386,-16352125,2088962933,91619080,-352321096,-1950340350,2025720,175439627,-1207666945,-397410303,-389808373,8492,99366655,2434458,501793536,-16777183,-1710887882,9529,554625219,652738560,1275512576,-1207959550,726663169,820531392,5415680,242597899,43136767,-1202667477,-397410256,-389809331,8416,5389955,-955419648,20998,112640,160950352,549906627,1183449665]},{"sector":13,"data":[1357130244,503355064,1354771280,-8485235,-6664170,184549631,-1926335296,385842822,105286480,-523040847,503605253,178256,-26032,1183383552,225722622,-1694599425,11575,-352321096,-1010816254,18904040,106859266,294787,1586170997,-33044732,112895,1586191851,105351942,1963476739,73304841,-63545,1048831979,1962934354,-1808335088,1354771202,1342189752,-335897368,38576585,-1988047744,28900934,-11513856,535299702,1958742784,73304842,-1979824501,-5313785,721589814,280514752,1793609728,-1010816006,85982184,-129579261,2122515558,91554054,1291339463,142508802,-15633408,45614710,-605531992,1975520008,8710403,-788111733,-2138600477,-96040701,-1962647925,1191380551,4785416,-388823375,-940161399,-1962934265,-522979770,-113015,1586231926,-754480136,1347590624,-1705983957,65535,1979710083,-49915,1996428660,74907642,-385976577,-1073018855,28837236,721611520,-62486080,-16222465,-253229450,1958742792,-58817773,-1962052608,1183578206,-1207500298,48955393,-389824469,50667336,16271047,71731968,-1988107136,1190655558,1954545668,-129579259,2122514433,292814856,-1191676161,-397367294,-1073018850,-1830222987,-128021760,-2020875311,1183384448,1183535354,-754535946,1372138464,1354771280,3660954,-359680,-12778123,-15305473,1183578742,-1202708986,-1706033142,65535,1946159677,142016267,-386369793,1206585431,-1962516853,1191380551]},{"sector":14,"data":[-62486264,-1946519809,98208963,1347551242,-1694730497,14484,1979467323,112645,-1070923029,-113015,1996425334,136177912,192200715,16678531,28837236,721611520,2112406464,-1711207650,13037,736904841,244338880,-3368984,1183646838,770199802,1975520251,-92864683,1342177720,201042152,-15895104,244378742,734819304,27060672,-1946349336,833736,66744055,-163149375,1183570059,-1962440444,1204287070,-1962934270,1204287070,-1962934268,1204287070,-1946157306,1204287070,-385876216,-689373976,-1194816516,1861681164,64523258,-161576487,-1996077173,1200352838,-364476152,-2080585752,1962928766,-364475636,-1207795037,803799041,234481665,-939768183,259142,-766209,1709765750,-1948742677,1183384135,-193527810,-1947505688,1178205254,-1579059980,1178141276,-2082900738,1962933886,-193528014,-1981072408,-1924075450,-397346746,-1072956138,1996427125,-348460812,-386238721,719977486,-262239233,280519,-193528064,-1367064,166263926,-263812629,-1147261,-1847000204,-1948742912,-1983894544,1200162884,-262239482,-1996208501,1586168391,71813104,1996423168,-353441540,-1946417944,833752,-1946521865,-62485520,-402112375,2122578944,1282736126,-386631937,-661919048,-16627769,-193527809,-1392664,1183710838,-907521798,-70522631,213436555,-93391104,-654059381,-940155255,-63417,-17269117,1586170228,-129594378,-402241655,1996487604,-77534982,-369342837,28901098,1996443648]},{"sector":15,"data":[-294191120,201158888,-385649472,1586233191,38258672,1996488703,-14554628,480438467,2122515459,125108234,37371523,-2096270336,1963002494,1379828493,108331008,-385875528,1996423354,-1476216822,91809872,309706763,-401967361,45614011,-1259843584,-373282045,45613210,45633536,1474842752,1975520005,112645,-1070923029,-166989685,1996426612,59631626,1342177976,-1962703128,1525352062,-32866941,1166758261,-96040698,1946156605,-96012474,108298240,17464963,1190595956,1971323130,176063282,1445754112,-16222465,-1293354378,1958743036,-96040057,-1593162359,1166607462,45635078,1996443648,-68884472,58048523,-2080413207,2117668039,-6195452,484969078,178179,51767376,465758403,-1561853431,105286637,45633566,530206720,-1996488659,-1072957882,1183518845,726670854,-6664000,-1996488449,2122577478,578683126,-1695123713,14064,-1191772952,-11534334,266864246,1350568962,200978152,-384207424,922681746,1996423896,3192838,-171186096,736978152,25618880,-150991688,84044334,865665087,-1178457150,-120389626,-1037319629,73835328,-1946546968,-1194816528,787939340,-939326870,-335786359,172279560,-964427778,-59361012,-102173833,30206201,-386251127,1183447521,-1194816528,787939340,-939326870,-2080616823,1962998398,-260666594,2013034041,16836867,-1995815797,-29495738,-1996262145,-964491708,-387585268,1183386367,1978159358,-1191670808,1464860673,-1018113,485031030]},{"sector":16,"data":[1958743038,1354771222,-260636841,-386107649,-1072955893,28837236,721611520,-96040512,-16628281,-25755649,-2081927192,1946221182,-260636776,184682216,-393317184,28899684,-1427615744,105286400,1756909598,-1202708988,-1706022910,14050,1090012809,1996427124,1004837624,1891106816,233328644,178202,-1476216752,55371856,-1191557495,-397410302,2122514831,242483450,1342533816,-402229505,-1073014269,1187452021,-16420858,-1207787978,-1202715280,-397410256,1183577217,-1202708986,1344144488,1346371768,3998874,-118364160,58590919,1996423168,53209094,-1192494872,451608577,-1191654424,-397410302,-1070923087,780368,44054271,-380583893,-389808533,17045968,-396954069,-125048980,-16614013,1979656820,-62485246,-159193008,-1946647320,833736,-1946390793,-1982266408,-2115499913,75400184,-955943936,1093,-414521258,67011398,-124075908,-1996488648,649656390,244338690,1356129768,-329752,244381814,-1010328600,18443240,71731969,-1912715639,-397345210,1586220216,25133310,-1979353798,65771527,-1021755672,85542888,-28915968,1187446784,-352321028,-58817669,-8489984,-773259658,-2081387546,1962869372,41221982,1358579341,-1191843864,1861681164,-386364422,-133957663,-16235065,105155583,1963475971,38061846,-4653057,105220607,-16104055,2145974902,-2094928905,1946158204,105220891,-1593162359,1166607462,112646,178256,-806857136,-62486024,-546840,2045312630]},{"sector":17,"data":[-28901402,67010179,2095645565,-62485505,414116035,1586168065,-1948004092,-1962704713,91570374,-352321096,73304851,-2016943151,-64640,1024629334,-387252224,411232451,45613347,45633536,2011713704,1958742785,59023673,1358579337,-1728036680,-1070903214,947493456,-92078080,1023768063,443875327,-362753,213386358,1781462784,-555200510,1958742784,112645,-1070923029,-15992693,-1276574859,-1169781504,4241488,1354771280,-1194679832,-1924136876,-1202668986,-397410296,-259262901,1342335672,178262,-163714992,-122097525,-1202302974,-397410302,-259262929,1342342328,178262,-165550000,1924722827,-1202302974,-397410302,-259262957,1342331064,178262,-167385008,1186525323,-1202302972,-397410302,-259262985,1342320824,178262,-169220016,1996484747,1354771450,312102992,-2097151937,91619322,1962934077,-92864745,1354385037,1342193848,184558824,-1207601984,48955393,-125059029,1342177976,201245416,185169088,-1207601921,48955393,-389824469,50337632,-1962379521,1344144966,-1710983425,65535,1963214395,112645,922685675,-1070923102,271628368,-241178544,-389824469,16848688,-1207666945,-397367294,-259325914,-402360577,-166986133,1183520628,-754470652,74450400,381872208,91537419,-352321096,-1010816254,1506280,108432130,-2071206191,1344144066,-1324988789,98620167,1344144488,-1710983425,15721,58754185,-1207602112,48955393,-389824469,17569480,1342422200]}],[{"sector":1,"data":[-402360577,-2002663296,71710978,28837236,721611520,37397440,175423499,503596683,753441360,1183645696,922702056,1441268408,1996443848,-26108,-397410304,922732616,1183646306,-1706027288,65535,376629443,2122514944,175374342,-402360577,-1072955981,28837236,721611520,1441317824,-402587370,-1070864331,-401698736,113755252,894,-1543503944,2057503340,1458973443,-1948002328,38258648,-396951553,-2092506144,-344194050,-940389656,194566,-2079930624,-956301054,33714694,1476839168,-16761854,721706038,228217024,-1593835471,1185087810,805750532,-16654334,-402487242,-722927843,75400180,-955419648,201467398,38844416,-699930544,-1008216856,1075170280,1547108096,1647771396,768002,243792,309328,374864,10139728,8435792,-2142859952,73971792,58767440,-26032,-1073020928,31982452,-1914125568,-402643691,-1070864531,-13965232,58736267,1967179659,-1472790767,1354771202,1342189752,-370158360,727122269,1347440832,4181914,-359680,-12778123,1461286143,381306509,4241488,952408656,1077739520,-1207601920,48955393,1183432747,1975520252,15788291,-2071267797,1110966356,-16288582,-385701322,-2092564254,-360969986,1354909325,1358841485,1342177976,737362664,1996443840,-229381890,58048523,-1929328663,-1202666426,-1202715912,-397410302,1183707939,-2068295482,45633538,350769152,-934900237,41072720,178256,-217716656,1355433613,1342331064]},{"sector":2,"data":[1342177976,-1913456920,-1202664378,-1202715578,-397410302,1183707879,817385678,45633538,-655863808,1547108338,1178501892,91488260,-352313160,1095683,1098095184,213385216,-26282240,1471563401,519260392,-1233715376,4336282,-1236911360,28837237,721611520,-62486080,737360872,-1528278848,-58817541,-16026624,-402498506,-1072958008,-1070916491,-35198896,44840703,-1202667477,-397406160,-1070862695,-75896752,1555570155,-1202696190,726663169,244338880,-1711080728,11166,1342468280,-939704088,201467398,38844416,-730601392,-1008336664,34863080,-28915967,1586167808,-773598972,277318627,-62486269,1962934077,-514463721,1988876427,-1325364228,636015368,1183383553,-513939202,-1006745973,320061416,1245612800,-775451902,-1981754912,-661923258,51414923,1039156873,1316356095,618677899,-1996157952,1317068870,1187447265,-2147483138,-1946295962,-1996288377,1183444550,-465123614,401100800,1681326046,-532247292,-529668016,58048523,-1962838807,-773598753,73703907,51414921,374871,-857184533,66096096,83357814,91554048,-352321096,633350914,1183383553,-754404902,-2146661408,-1056178459,1183515785,-28931622,276152331,33555703,1015024245,-1207601915,48955393,1183432747,-526259980,16023171,1996429940,-541529872,-472785013,-2016943151,-64752,-280489,-545462192,-622335913,66602633,-1996101626,178388038,-163149565,50857475,-375159,-1929192906,1343682118,1342177720]},{"sector":3,"data":[3412634,-633929984,518625794,1005060096,-1982297120,28896350,58630912,-1962653815,1200352350,-364476158,-2085144,1183705718,1508397298,-25263121,-1207602176,65732609,-1979711560,1256774214,-1194816527,1861681164,64523250,-632910887,-402372863,1183576388,-431584790,-472785013,-2020875311,1183384334,-25263128,-1925811200,-1202657722,-1706032262,17728,-1924631232,-1202657722,-1706032548,17766,2130706237,-431584458,-1545054581,378078074,1553597308,-352321469,-431583966,58374224,-26032,-1073020928,1555566965,-1202696190,726663169,244338880,-1023355160,1185768,-1572961536,1567948800,10618567,1223360513,-1873756117,37742606,5127811,-13470720,721604150,817385664,719867904,1309067244,-1207959552,1347420764,1342177720,-1873756117,9299982,40634055,1469775871,-352321467,636935,-430249904,40648323,-944671233,41478,-1377254656,-1962605807,272436294,1024029697,1148453137,1424736299,-1559345525,1554055244,1578535682,-96040702,-1912842615,-1588528570,1346372344,16777114,40679424,-96039600,112720,242679632,552078992,1812383488,-1191182590,350945281,17464963,1996469877,112654,835885648,-404029440,289597635,-85457878,207522786,1468729227,-1270445822,-1950984567,126552670,-1996335221,1451868230,2047264706,-385876221,1183383831,-1267269692,1354516109,-370298904,-1360527112,-1194816529,1861681164,-1983839300,-661931450,1183385483,71797680,-1950464375]},{"sector":4,"data":[1183385159,142052268,-2081450008,1962983038,12839171,-12728693,-2095876609,1962936446,12708099,1455715979,-391350529,-397016871,-397353420,-1880498600,390912,-385649407,1325334656,38112190,-1917696375,-1924091834,-1705987002,18196,-1922599872,-1924091834,-1705983930,17712,-1961659328,1451995206,58368946,58463881,-570496938,2122541035,1047789574,-1929218561,-397359546,1183433126,64523192,1204172509,1183523014,767886264,-1924136903,-397409211,1996472796,309254,67221584,1354771280,382092941,-26032,92930048,-956046294,2122578059,57934014,1459578601,-2251800,1788984390,-1136248574,-35060867,-505419522,265742531,62783490,-396997120,-661922448,1443004299,-2082636824,-311033857,-389822837,33623992,-402229505,-259269292,1342177720,74907478,-940549912,-64956,-402229505,-389817008,16781244,956319905,276039238,39991039,-1559869813,-1706033080,65535,259451075,-1070923773,-401698736,1183563160,201336058,-96040699,-17078656,50024064,-1996346207,1187445830,922681598,1183646820,1156075770,1958743004,112650,-665196464,-1023373336,84882408,1354771200,1441271440,-592385859,-396887925,-661922580,41426435,145819531,-259266349,124545,-1996339829,-1662454202,2016870364,-608638974,1198847499,-1913227521,-397345722,-1092031556,-1194816531,1861681164,64523260,72351705,-1578255384,1183384108,-163148296,58374224,1191483984,-1073020928,1555566965]},{"sector":5,"data":[-1202696190,726663169,244338880,-1191340312,-397344769,32036811,-1511472384,-402652914,-661922774,-1560280648,1200161662,-601233404,36452095,735143912,1174531062,-472785269,748807121,243742978,-1578075133,1352860282,244340224,-1193887768,-397344769,922736570,-1070923046,28856400,-1315287040,-1023410108,118388712,205949701,1946226749,17906951,1206592884,-1559345525,1183645772,753422578,242679745,1342179000,384976525,813341264,28835840,-1960383744,20777542,1023898624,175374338,1996483819,-559159282,1996481771,1354771214,4607642,735570688,-236403776,-402647283,-1073020026,-4715907,1793609983,15264005,48248575,383534733,-26032,1183514624,-465173540,-16589661,-1207771082,-1706033142,65535,-603026535,-1543899390,-722992514,-62486019,41289415,-157220864,-632911614,37633667,-385649664,-1969160044,-632932093,-1981217924,-329783296,213436555,-630262016,1183432963,-1948742696,-733574905,-1996077173,1200345670,-28931832,-2081668120,1979711102,-763460845,-1960545025,1183448134,1996443902,-40900398,-100609,-1070869386,4843600,1148502027,59653763,-16419584,-1863591354,41303683,-1592495104,100860534,104530830,125698686,184711912,-14846784,1996488310,112852,1173584,-814366709,1625819883,1958742786,56289283,217245891,1183515462,71213828,-9140595,-956156765,232966,142016256,-1982170136,1187508806,-956300804,126534,-627906480,1586229387]},{"sector":6,"data":[138871794,972310153,58193014,-150944279,1962999812,71073800,-1394015371,108461824,184631784,-385649216,922681475,2008547892,548950016,199774208,325567,-1962445823,-972934114,1962879495,37003522,-397393856,1183432162,-58817552,-2094893824,1946218110,41713927,360514256,84030625,-1957691385,86896710,548950016,-941076480,-263812162,36963843,1183400000,-2585610,130479686,-161576160,-2147481658,175506492,-1913227521,-397409212,803782112,1975520001,142016267,735692776,11266496,16533191,41713920,92013264,15615687,704940544,-1949957148,-13374992,-2081268085,1946158719,-1908505731,225705987,1342177720,184600296,-351504960,108462012,184577512,-1951238976,-947654018,-1923945718,-1979747194,1187511878,-1979710982,1586185989,-28901378,194512776,1025537216,57933837,-2142822421,-93057731,-947190805,171802695,1586231412,-12073218,1325525760,16402119,-92372224,-389778176,-1073020790,1491665781,4030719,1996466549,-652548088,-1023409736,51076072,-1908505855,1031077891,41303683,-1206946816,-397410302,-1073020877,-1070922635,1996434155,-96039676,-1092294576,1358579341,36976383,-390236952,-1073020870,28893300,149442560,1958742784,112853,185526467,512426240,130417204,-401872128,-1073020906,-1070922635,1183518187,72285956,-344604661,-1023409736,714728,1044284160,963903492,956464801,2080536070,3532811,74825739,753647659,48248575,-1588543445]},{"sector":7,"data":[787939958,-1588591908,1344143924,-1650831330,1342177310,2007962,1980169984,-1912144126,112643,177924291,922681345,28836576,-1070903296,1347440720,-26032,1183383552,2109737982,14608397,-385976577,-1070923267,113707499,630,-1023409736,604660712,116955648,-526188544,2109737730,-18426,-402607383,113761329,574,48248575,1342179768,-1202667477,-4521985,-11513089,-1710990282,19897,-1070903214,-2103816112,-16777139,-1929223626,1343666246,1342183608,16777114,-533266688,702466,-1203335856,-1080405994,1342177356,381175437,1354771280,1290443344,1183383552,2109737942,-533266671,118725122,-555220992,-700019749,922695659,179831900,1347590400,39991039,-1157627976,1347616767,73152255,16777114,-1706012160,65535,-16589149,721576502,-1986375488,721420338,-1712798784,-2097151991,147006,922687349,196608736,-1070903296,1347440720,1297062480,-521666560,-533266688,1301453314,1927806976,-1847016485,-352187895,-330920636,-1070903274,-1202696112,-1706033151,65535,880066571,48119427,-15567872,-1929191882,1343679558,16777114,1975520000,-330920684,-6664170,-1929379585,1343679558,16777114,1044284160,-1250689022,37633667,-1207601920,48955393,-389824469,83888432,1024214667,544473360,1946227005,18234631,1458259316,37619399,1357381633,-569981184,-1207959550,1156251649,722368255,-6664000,-1560280833,1996423704,374798,62699600,1088854608]},{"sector":8,"data":[1344143360,4804250,242679552,-571994480,-3347530,-1207822282,-1202655136,-1706033151,1826,-1070876181,144107715,922681344,28836450,-811970560,-16777139,-1711088074,381,48105159,-389873664,16844916,-66814333,1187448693,-352312834,75399954,-955812357,2293318,1187448299,-1962928130,-472777122,42514431,1342422200,5156506,817385472,-1561833472,1575535586,-1962592504,1554189894,1174849284,1342177284,1342181560,4385434,1095680,-26032,1085800448,12079104,-666466040,-26032,1183383552,-934901286,91602955,-823541717,-644346,-1957294474,1344194630,-1697089793,4019,-767129280,2080375357,-773944353,-934900765,42502025,30557835,1177143366,-662797352,1187347968,2083126915,-629735482,721944760,-1202661306,-1706033088,13736,184974824,-391809856,-1072972814,-1070921355,119728208,721840361,12079296,1347590527,5243546,40411904,-495665141,-1202667477,1385791233,1343724112,-2002583552,1958742787,1354771405,-1719729480,-6664110,-1560280833,-1073020326,2122561652,2121596940,1353598605,1342184120,-397361109,1996470718,112654,-1706012007,65535,196757129,-946899776,114758,12732103,10795008,-1933293943,1183565406,-1203336946,195970759,-1337538816,1187512319,-1912602702,1343663686,16777114,1975520000,-11081469,1183432747,-1069119038,-1996443720,1586283590,-1371107898,2040156182,184549456,-385649216,-164888780,-523123061,604365009]},{"sector":9,"data":[-1673099008,2013255819,-13107454,1150946934,-1962934195,126458974,184702857,-385649214,-2092499192,-797177346,-1207011585,1385758721,-26032,1285750784,1975520004,-18159357,-401705217,-1073019516,28837493,-19076864,-1705983957,3207,1352550025,383534733,1235130960,1996423168,-25954,1554186240,1958742784,1354771413,-1700890881,11253,-1545845109,1183515744,73311206,-1545582965,1183515378,57975780,611696651,-1727766367,-1037319629,-754973767,734147576,-1673098814,2097152317,112645,1183515627,57975708,50558113,-1559994362,95946216,-1952821248,-1560281007,112723018,-1751494656,-1560281007,45614162,-1550168064,-1560281007,364380718,-1348841472,-1560281007,62391790,-6664192,-1560280833,922681890,246939746,1183666176,-1706027360,65535,-1549646197,1183515400,51159972,-788245855,-1673098784,50558113,-1996101626,1183554118,570819484,-1740207870,966411915,58497094,-1550301557,-392101312,65065221,50614790,-1560054778,1386283620,-234476796,-1773762302,41926667,-930365397,-150993224,-1962651090,63015888,1611006914,440580,100919799,1621296210,1611071234,40149250,39847427,-1207811421,787939331,1183385064,37790154,37881347,50520739,1174653510,1946551196,1376125699,71869188,84171425,787939372,100861022,100861002,100860680,1183384110,35955092,73008643,-150993915,-1962648018,243912,71970551,-291387389,65065221,-1840346680,999573131]},{"sector":10,"data":[-1962639672,-1962677311,1084462150,1242467076,736219396,37135297,36570667,71960067,-1593689949,755303514,1580136192,1241907972,-800683772,1074027169,1580136256,99263236,99485187,50480291,-1559999994,100860816,-190642706,1577452290,71475972,-1559994719,100860682,100860680,1319306334,440322,73281271,38667779,-1207675229,787939331,100861022,1319306326,-1194816764,787939368,-939326370,71962115,58068617,37895819,-788245855,737684448,-1962707906,244029895,-101251608,1208120483,-1962654557,-101213753,731497099,1090048450,-1962650461,41198024,99102455,243910659,-1179122824,726670848,-1169141568,1347551436,-1588572080,-523172782,71828995,1354771280,242679632,-342208432,-1560281005,-1073020318,45614709,-65214208,503366840,1354771280,1082178128,921194578,-2132258639,922702001,922682432,922682440,-1070923166,242679632,630870096,-1560281004,-1073020314,922684533,-258342302,-385875890,-826737802,726670848,-1169141568,1347567616,922701904,922681910,922681920,-11533722,1347423862,5528730,41984768,-965427189,503371960,1354771280,1075886672,-11513774,-1593688010,103482432,-11533238,-16629194,721577526,1996443840,-1706012658,65535,184736419,-1198558016,1344143586,1347469355,-1174403912,1347571712,721565345,731500614,-1543974462,-1588592068,1177224264,1376685002,736219396,38183873,-797507760,-3508481,-1207802314,-11534235,-1070920074,-543535024]},{"sector":11,"data":[-1560281004,-1073020186,971572085,15186175,-1070903266,12210256,1347441216,-11513776,-1207772618,-11534236,-1070920074,-1348841392,-1560281005,-1073020294,166265717,-1946801153,-941370914,-16547705,-24951041,-1192199165,726663170,1788498112,-1560281009,1354237420,1589137410,-6664190,-1207959297,-1873804720,-1111955442,-16622429,721576502,-390573888,-1070903293,-6664112,184549631,-15632960,721604662,280514752,-1897377776,-22615588,39991039,-1705983957,20123,1356220041,1347469355,1357904,151042128,1434884688,1996423168,1354771414,503495329,1357904,16824400,-26032,2122514432,91554310,-352321096,-1547687166,1239941866,140428465,4161574,28838261,1843941376,-15078421,1996425846,73971720,-1070903266,1083480656,-2136801280,-333780989,48905859,-1593019392,1352860282,-368654592,-16777214,-16621002,-107346314,-16777131,-1711119818,22018,40253183,1342177720,5640090,1714880256,1444452866,922681344,28836480,630870016,-16777130,-1711112138,22062,47855359,1342177720,5651354,-633929984,1153079810,922681344,28836582,1603948544,-16777192,-1711086026,21996,-1023409736,16851944,-1191826688,-1202716606,-1706031104,21767,-472785269,50497417,74825739,166445099,67011398,28892540,-169295104,-16711680,28836982,1347590400,5675674,6464256,-1202667477,1385791482,-26032,1587740672,1354771200,-1719665736,-1986375598,-1560281002]},{"sector":12,"data":[1048772704,1946157154,1581155088,158597120,91537419,-352321096,-1010816254,41960,1648263936,158597120,6436607,5696922,1581155072,158597120,6174463,5701018,1614709504,158597120,6305535,796826,1843970816,-1962868736,-1073019834,20780660,1024357376,259325954,6043391,5111450,-5707776,733278440,-1957313600,-1957210388,1102316630,28844493,855798528,-1956749376,46292453,-326413056,1451972438,-1962467834,1454638206,28844493,855798528,-1956749376,79846885,-1269344768,69324057,1593881665,1432077150,-1959859061,860046103,-775779648,1457531872,-1967115433,1356911046,1599722495,1575324510,-2030757,-661865501,-1959896176,1162035991,518818645,-1070344050,-523124086,1465311275,-963985357,-11476783,1583307219,-1962742397,1297948645,-519895205,-1144302842,-346881726,745126852,-1145115821,-346863325,665172920,-1145902253,-346870387,773176236,-1146688685,-346870020,808696736,-1147475117,-346869336,1173207956,-1148261549,-346861974,1309260680,-2105349293,-201260288,1761608519,1711342336,1778385706,33620736,1795162885,469828352,1828717390,-553581824,1845494531,-2097085696,1862271794,-1342176768,201391949,989856256,218169165,1124139776,1895826254,1291911936,1912603470,1543570176,83886422,-939457792,100663631,1291911936,134218038,-1157561600,16777740,1543570176,150995254,1275069184,453050114,1140916992,2080375638,1358955264,469827407,453051136,2097152841]},{"sector":13,"data":[301990656,486604621,167772928,503381769,436208384,520158991,1426129664,2130707232,-1459617024,536936202,-1476328704,150995468,-2030042368,553713459,369165056,16778034,-234880256,570490634,-822082816,587267909,-1912601856,604045100,-100662528,620822316,-1191116032,100664065,754975488,637599567,-704642304,654376769,-1509948672,671153992,-184483072,-1996487931,486540032,687931206,503382784,-1979710714,1509950208,704708431,922813184,167773013,385876736,721485653,-1493105920,201327361,302056192,-1879047418,1006699264,486539793,-83819776,369099561,-419364096,385876797,-989789440,553648716,1845560064,-1728052395,-1493105920,-1711275258,16843520,570425869,-805240064,-1694497970,1476461312,-1677720747,-2080308480,-1660943574,-234814720,637534797,939590400,553648926,-1845427456,-1577057494,-419364096,570426190,-1023343872,587203372,285278976,-1560280316,-1090452736,855638352,1073808128,-1543503100,1627456256,603980621,-956235008,754975244,939590400,-1526725870,-134151424,620757824,-503250176,-1509948671,486605568,-1493171452,-285146368,654312193,234947328,671089410,-1358888192,687866708,-486472960,704643925,436273920,872415825,-318700800,-1392508081,1073808128,-1375730864,-1425997056,-1358953642,-1946090752,-1342176433,-503250176,-1325399216,2130772736,-1291844783,-1593769216,-1275067636,-234814720,872416030,-83819776,889193299,-150928640,939524895,-1694432512,956302160]},{"sector":14,"data":[-704576768,1107296779,-1107229952,1241514325,486605568,1140851287,-587136256,1157628502,1661010688,1023410974,1073808128,1291845938,-385809664,1040188192,-67042560,1056965408,-771685632,1325400384,-1946090752,1073742624,-1459551488,1090519840,-436141312,1358954814,67175168,1107297105,16843520,1375732035,-754908416,1392509243,738263808,1140851537,285278976,1409286466,1627456256,1157628713,-1090452736,1426063675,536937216,1442840896,-738131200,1459618085,-1275002112,1342177865,1811940608,16842576,1929446144,1509949773,-1006566656,1375732305,1543570176,1291846431,989922048,1358955288,-1023343872,1627390262,33620736,1375732498,-1392507648,201391949,-1040121088,1426064153,302056192,1560281681,939525376,218169165,1493238528,1459618604,1963000576,1476395849,-1073675520,1493173069,889258752,1509950286,1728119552,1526727474,-1258224896,1543504718,-1040121088,1560281904,1342243584,1577059118,2113995520,1593836334,1744896768,1610613553,-570359040,1627390766,-855571712,1644167982,1845560064,1694499655,1895825920,16842576,0,0,1167087646,518818645,-327034738,-11140960,-1070920586,-11513776,-1706030986,65535,425603,-1159134347,209125120,-1928825089,385837190,8435792,-26032,-2037841920,-259260574,-9979264,-972721060,1560242306,-10320129,-10307957,-9927994,105286400,-1996486651,-1946196858,134547014,244338688,-1996451352,-1912641914,-1979750266,-1946197882]},{"sector":15,"data":[973039238,1946117254,1688111886,1622576127,939821823,-1959758841,973039238,1979671686,1621003017,4161791,1183517300,525574,-10189175,-15960321,-2037708170,1344208740,16777114,-1959662848,520053894,14522960,-2037841920,-2037645468,1344208736,86938,-6755584,28839030,-6664192,1342177535,-1705983957,65535,49120094,1562371467,576077,1167087646,518818645,-326903666,105286406,1344163870,16777114,105251584,932859934,-1996488703,820771910,503727755,-62485680,-6664162,-1996488449,-661914554,1183319946,1952201978,1966750724,-62485745,-6664162,-1996488449,149683270,956712587,-931660730,-1962742397,1297948645,525002,15991043,2228227,13500675,5046273,19071235,5111809,18415875,5898241,15401219,5963779,12648707,6029315,3801347,6094851,1835267,6553603,1167087646,518818645,-327034738,79167634,-1202708991,1344143613,503381176,1954975056,-1202710785,-1706033024,65535,108380171,-369098824,-2037579448,1183448948,-162099980,-1098901269,1949106030,-159973601,-1695254785,136,-1980479863,1589966422,126494452,-9533816,-629817334,653549252,1946173312,-196673759,509478,-1098901269,2132868974,-159973601,-1695254785,195,-1980479863,1589966422,126494452,-9533816,-629817334,-1946925429,1183446614,-61437446,-1098899477,1949106030,1857978406,528359679,-624897,43709558,-1996488703,1451881542,-195115786]},{"sector":16,"data":[-2012771802,184512134,-992774720,-2144930722,678690879,653543167,-352319546,1857978399,125706495,-9519488,-14715604,1996486262,20486900,1183383552,-162100748,653549252,-2037905526,-1073021074,1183568757,-162100236,-9402743,-9267575,-1098901269,2116091758,-159973601,-1695254785,65535,-1980479863,1589966422,126494452,-9533816,-629817334,653549252,-16775226,1996487798,1954975226,-11528449,-36170,738160822,-1706012480,65535,200820361,-385649216,-310116686,535137026,63655261,671154944,973078784,1879114496,889192961,1342243584,1291845888,0,0,0,0,1167120524,518818645,1465309326,567094452,-1996071285,38766871,-310157729,535137026,46812509,-1864856576,-326412987,1457032734,-852839337,106859297,1468598152,55544065,-310157729,535137026,46812509,-1873273344,-326412987,-2082959842,-1957295892,1988692086,-96024584,1586167808,55020042,1183441962,1111393276,544538625,2080377917,-59866357,-96024820,99287352,855262919,-58817791,-955943680,851014,1459386111,21249667,-167348992,1946420806,112645,-1070923029,-401698736,-259325685,-2013187680,1586185732,38242826,1448141866,1342177720,-253227376,-2081387776,1946221182,537183768,1586170603,-96010246,76023690,-94467258,1962950528,105314029,-1962183672,1065416798,-972851920,80093191,734432000,-2090928058,-443874579,-900899553,1478361094,-1957345904,-661774612]},{"sector":17,"data":[1460595843,141986646,-1947044215,1200294494,1040591619,-1177408767,-235470748,-1979492471,-467008953,-1963178359,-125107897,-1946517879,-129594942,20987523,-1994755072,1200290942,-1981535742,1048836678,1963065664,-1983739128,2122972230,-59310088,1144454998,-401698815,-259325889,-2013187936,1996441092,922703610,244318532,-1962923288,19964144,-12188536,-11077514,-1878965194,1435662,80146571,-230282496,-310157474,535137026,113921373,-1873273344,-326412987,-2082959842,1448543468,-1962248565,-963966850,702873,1183447543,1975520252,108954374,-1979157504,805633094,-1958279800,179935686,-2131101952,361246914,1590135623,49120095,1562371467,445005,1167087646,518818645,-326903666,1988843020,1183667718,-756526856,200313601,-1207536138,-1024851969,832587264,-12306431,-1923681931,-397347770,-259325515,-478874101,16139975,3964928,1344157044,16777114,-2012968448,849410630,-96061439,1187448693,-352242948,20488210,1979336248,-163133514,1187446785,-1962854148,1065417822,-2095942400,82494,2122531189,410914040,-335544648,3965018,1586204020,-62455812,1946630316,-8394282,16154243,2122517877,393547000,16271047,-2096043264,1946220670,-125926449,-2096857844,-2096302010,2098788478,-193035329,-1950778052,1183451230,55019768,-1997257078,1204159047,130416641,1589652224,-1962742397,1297948645,503317706,1430622296,-1910575989,216826840,1988843095,1183667718,-555200268,200313600]}],[{"sector":1,"data":[-1207536138,-1813381121,815814144,-397371391,-259325801,-344656373,-96039594,12314704,-166989685,-1604919948,1352139056,-1962902808,1962281968,1183667918,-1628942084,200313600,-2134870794,-1149960132,1023492257,125042689,1946157629,-1962087620,1183577214,-196703750,-1577419127,1174470974,-58817540,-2130346652,124582982,-1979162997,1200157766,-62485758,-1979496567,1200159302,244339457,-352274968,-58815733,-1980479861,-1091830714,-310157474,535137026,80366941,-326413056,-1962742653,126486110,-1963047288,1178076230,-2146667266,1949171326,-25264122,-16222929,1183516230,721611526,1575324608,1426064578,-326898549,-1957275898,32179830,540835910,1988754036,-28915716,76152832,1475906456,16777114,1975520000,822051614,-8185476,-1206616263,1727463434,768017406,1183383600,-1203943682,970158603,91618422,283885611,540835910,1586231924,-28931324,-963967095,-443850914,311901,1167087646,518818645,-326903666,-1957275898,2139096670,108265474,201490304,-21494154,8907263,-1962516853,-276757633,-8190020,-1207601545,1944846333,-1979294069,-14024097,19105674,-259267542,247799,1586170485,41910278,1174500610,-1979294069,-467009209,2009480008,39815865,-472776918,17479563,-150901320,200279015,-1928694529,-388890811,54585553,63436784,-1962248960,2139096670,24510978,106859334,704726922,1086718948,129618475,-1997408512,1589652247,49120095,1562371467,33737293,218170112]},{"sector":2,"data":[855638786,1224803072,1325400320,0,1167087646,518818645,-326903666,-1957275888,1988692086,114672,2114256771,14608643,20979339,-472783919,21332362,-1072962518,20780148,1028813824,1634992130,1962935101,8513795,1190543595,980681734,-2146804085,259391295,-26029,-1073020928,-1070922371,1442882537,-1979031925,98839047,-397377556,-259325791,1963065219,738510340,83854150,80086132,-347650528,1586189967,38242826,-553262038,2062045311,-336557312,105314021,-1948027640,1200228958,1357130241,1144454998,14653953,-259325952,20987523,-960269056,-347722748,173968317,721635211,-1996407290,-1181090746,-101253020,28857936,-174436352,-1962934272,-62485520,6601113,1448278519,1342177720,16777114,-370111744,80150399,734432000,1600057414,-1962742397,1297948645,1426065098,-1957237621,922682998,1996423932,516328196,2013264,-26032,-972881920,1575324510,197826,11665411,2883839,5636099,2949375,19529987,11534339,1167087646,518818645,-326903666,138840836,-1207763805,1344143758,503403192,1354771280,21146,21013248,537282294,113707124,65858,1190536171,141824006,21104327,367722496,503418552,22591568,-1070903266,7707216,1117978624,105313793,-955747324,16860166,-1206523136,1344143758,503406264,1354771280,35482,21275392,503418552,23443536,-1070903266,-26032,1050869760,26130433,1907904542,-1202708991,1344143666]},{"sector":3,"data":[112742430,-1046851584,-1207959552,1344143758,503412664,20494416,1344163870,1342179000,56986,26130432,2142785566,-1202708991,1344143741,385631885,178256,16882256,1183449088,19964668,503418552,25671760,-2051518434,-1924129279,1343683654,1342177976,16777114,-62486016,-2097073758,-443874579,-900899553,1478361092,-1957345904,-661774612,-1205539709,-397408258,-4718423,-1561833465,604423936,-1207958014,-1202683936,-397377557,109248593,-1207631324,-1202683924,-397377550,1187446849,-2097151748,82494,951592309,-1706025471,369,-1191426423,1344143666,16777114,73048832,2130462265,-62485754,-2096866653,100948486,-1962742397,1297948645,1426064074,-326898549,727078690,-14619658,-16581578,1191118454,-532247290,515395606,-6664192,-1962934017,2130590712,-1946711294,1178141766,30963206,1577198646,1575324511,1426064578,-326898549,-63504638,134133762,-1202695527,1385758726,-26032,-1073020928,922687604,1996423932,-25858,1183383552,1958743038,112645,-1070923029,201213577,1342600384,16777114,1575324416,459458,34930947,1179649,2162947,3735553,10944771,3801089,32112899,3932161,33161475,3997697,28508419,11534339,23331075,5898241,0,0,0,5,0,0,505355295,522133023,522067742,0,0,65535,65535,65535,65535,65535,65535,65535]},{"sector":4,"data":[65535,65535,0,0,0,-1280269643,-1247629133,0,0,3932222,2031616,5898299,9896056,13893813,17891571,21889328,538968064,538976288,0,32767,1094921728,1094910028,710672460,1279345454,0,1466720579,1632461934,1124101737,1851223137,1651856228,1818313472,1298427479,7235937,1466720579,1968399470,1631780962,1684952940,6452563,1466720579,1968399470,1682243682,1157657705,7629156,1529830434,1014774365,993864510,8236,1986348032,6644585,1684957559,7567215,2031616,5898299,9896056,13893813,17891571,21889328,505355295,522133023,522067742,1296120367,0,19792,0,0,16777216,33555202,16974593,1147731970,6648929,1835619433,1281949797,1869768058,1700358400,1716482657,1952805734,825324288,1929394485,959787826,1929391872,1702125892,1929394688,1701669204,1852375040,27764,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,97517568,99616232,591420,3670019,524543,3932163,590079,4194307,655615,4456451,721151,2359299,196863,2621443,262399,2883587,327935]},{"sector":5,"data":[3145731,393471,3407875,459007,258,2097184,16842756,0,-12584705,-12584705,-16269057,-16269057,-1863681,-1863681,-507906,-507906,-507906,-507906,-507906,-507906,-507906,-507906,1073676280,1073676280,-1879048221,-1879048221,-469762161,16777216,16777216,-12584705,-12584705,-12584705,-8389377,-1,-1,-1,-1,-1,-1,-1,257,4194304,524352,0,0,16128,0,16128,0,16128,0,16128,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768]},{"sector":6,"data":[0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,768,0,15729408,0,15729408,0,15729408,0,15729408,0,-64768,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,-12648448,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,255,0,0,0,0,0,0,0,1061093376,1061109567,1061093439,1061109567,1061093439,1061109567,1061093439,1061109567,63,0,0,0,0,0,0,0,1061093376,1061109567,1061093439,1061109567,1061093439,1061109567,1061093439,1061109567,63,0,0,0,0,0,0,0,1061093376,1061109567,1061093439,1061109567,1061093439,1061109567,1061093439,1061109567,63,0,0,0,0,0,0,0,1061093376,1061109567,1061093439,1061109567,1061093439]},{"sector":7,"data":[1061109567,1061093439,1061109567,63,0,0,0,0,0,0,0,1061093376,1061109567,1061093439,1061109567,1061093439,1061109567,1061093439,1061109567,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1818838544,101,2003127808,65536,1852141647,3026478,1392509440,6649441,1392509696,543520353,774796097,67108910,1769099264,774796398,92274734,1835356672,778401391,268447278,1953064005,393216,158627139,7103812,1124075264,158953583,-2147470778,1632632840,157643891,7564873,1701402128,150995063,2036417536,3753481,1291848320,1752460911,808535561,1750274048,30575,1867776011,158949732,1701670728,786432,1986359888,1937076073,1733320201,7361824,1308626176,158627941,543641694,-2147455420,1631846414,774792564,877005102,1816203264,7172705,1392512768,1175024741,276824117,1852785408,1819243124,774778483,1884262400,1852795252,285212787,1918979328,910559595,1179648,1667592275,543973737,1701669204,154021422,-2147469498,1631846419,1699946617,1852404852,774796135,46,-1874853888,335549446,1342215168,0,131118,786532,8388611,8474755]},{"sector":8,"data":[335545344,939542016,50332672,-2091867392,5701632,3276840,65550,1342373889,1701859200,1459617902,838875648,33558016,50331648,1631813712,1818583918,5111808,3932180,327692,1342308352,33554562,671089152,-16774144,33555199,1766228560,1847616876,979725665,0,0,-1874853888,335549445,805348864,0,983052,786536,8388611,8474755,33557504,201341952,16776960,-2108685824,1702256979,1818846752,1935745125,1342177338,1207960064,83889152,33554944,33360,983160,917539,65537,1400918019,6649441,553678848,234889984,512,-2142240000,1668178243,27749,0,-1874853888,335549447,1006664704,0,524292,524360,65535,1350717442,1953393010,1886404896,1953393007,1953391981,67108979,335550976,-16775168,33554687,1917223504,3829103,704644096,134220800,16776960,-2108685824,3829588,402660352,201338368,1536,-2125430016,1835008,3014696,458764,1350762496,1409286273,587208448,16780800,50331904,1800372304,5505024,2293799,131086,1342373888,1851868032,7103843,0,0,-1874853888,335549447,1006664704,0,524292,524364,65535,1384271874,1987013989,1883316325,1852403568,1852140916,29556,1703940,524308,65535,1182945282,980250482,262144,786474,-65528,1342308352,980374658,1835008]},{"sector":9,"data":[3014680,393228,1350762496,469762177,771762176,117443584,-2097152000,33104,1507412,917539,65537,1333809155,1409286251,587212544,33558016,50331648,1631813712,1818583918,0,0,-1874853888,335549444,738234368,0,655364,524328,65535,1401049090,544698216,1702125892,805306426,771753984,117443584,-2097152000,33104,458856,917539,65537,1333809155,1744830571,587208704,33558016,50331648,1631813712,1818583918,0,0,0,-1874853888,335549446,939563520,0,524292,524344,65535,1099059202,1836212588,1852785440,1819243124,67108979,1342183424,-16775168,33554687,1631945296,544828530,1735289170,540026912,808525869,14889,1441880,786448,8,8474755,637535232,201334784,33556736,-2142240000,1853189971,1912602724,587207936,16780800,50331904,1800372304,7471104,2293797,131086,1342373888,1851868032,7103843,0,0,0,-1874853888,335549445,738229248,0,524292,524340,65535,1401049090,1768121712,1411411041,979725673,3932160,2621447,196620,1350762496,67108993,587208704,167775744,50331904,1850310736,1953654131,2883584,2293784,720910,1342373888,1818576000,6648933,402674688,234889984,512,-2142240000,1668178243,27749]},{"sector":10,"data":[-1874853888,335549452,1208001536,0,524292,524336,65535,1149390850,1394637153,1769239653,7563118,402654208,134225920,16776960,-2108685824,1702129225,1818326642,3407872,1310742,786444,1342373892,3486080,369118208,201331712,67112192,-2142240768,12339,1441892,786452,262158,914378752,67108912,738207744,-16775168,33554687,1867022928,1176531573,1634562671,872415348,335554048,251661312,50332672,842104912,4980736,1310758,1048588,1342177284,3420800,939525120,134232064,16776960,-2108685824,1918989395,1735289204,1835619360,14949,3604544,786472,17,8474755,671120384,234889984,16777472,-2142240000,27471,3670140,917539,2,1132482563,1701015137,108,0,-1874853888,335549446,1308662272,0,327680,524442,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,130946,234881024,134257152,33554176,-2108685824,1701601603,1918985326,1966080,6160418,-65528,1342308353,1919243906,1852795251,808333600,49,-1711264000,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989871360,234889216,16777472,-2142240000,27471,-1874853888,335549443,1879101440,0,524310,524360,65535,1350717442]},{"sector":11,"data":[1935762796,1701978213,1651336557,774795877,1459617838,587225600,16780800,50331904,1800372304,262144,13107226,262200,1352859651,7032707,0,0,-1865940992,335549444,1073764864,1124073472,1852140641,7496036,2883613,917536,65538,1132482563,1701015137,108,1509951488,-16775168,33554943,1699971664,1852400750,103,1509954048,83888128,33554688,33360,1835008,524378,131071,1954697218,1752440943,1919950949,544501353,1869574259,779249004,0,1853171722,1819568500,136930405,1701601603,1918985326,1952531478,1752375397,1684829551,1869573152,1768693867,404776299,1919970633,1919250543,1851879968,1864394087,1633951846,779314548,1835619350,1752375397,1684829551,1869573152,1768693867,924869995,1852727619,1663071343,1952540018,1751326821,1701277281,1818846752,539828325,1953064037,1769414771,1847618668,1646294127,1701978213,1685221219,724460645,1663070030,1735287144,1768300645,757097836,1768187168,1629516660,1646290290,1735289189,1936286752,1685217635,523134053,1702130753,544501869,1914728308,1919902565,1684349028,544437353,1818845542,640574565,1702130753,544501869,1914728308,543449445,1702125924,1869768224,1768300653,1713399148,1701603681,1126641252,1735287144,1768300645,1763730796,1969627251,757099628,1701605408,543519585,1629515620,1986089760,1309814373,1696625775,1735749486,1701650536,2037542765]},{"sector":12,"data":[1631791918,544483182,1634624882,1847616877,1713403749,543517801,1768300589,1763730796,1869488243,1633886327,1684368492,1950424096,1886217588,1869881460,1986097952,1768300645,1713399148,1701603681,1141714532,543912809,1713402729,778857589,1885688337,1701011820,1769497888,1852404851,1393959015,543520353,1920103779,544501349,1851877475,980641127,32,0,0,0,1818838543,1869488229,1868963956,778333813,1953451546,1981833504,1684630625,1818321696,1633971813,1768300658,422471020,661545283,1701978228,1663067233,1852140641,544366948,1701603686,1833507630,1886351984,1696625253,2037150305,1852404256,1701847143,1685023090,1867387694,543236212,1667592307,543973737,1701669236,1884494126,1718182757,543450473,1701669236,1953459744,1970234912,506356846,1667592275,1701406313,1769218148,1629513069,1634038380,1763735908,1937055854,1124937317,1869508193,1919950964,544501353,1818313483,1633971813,539828338,1868710152,774796405,1867781678,1634541679,1679849838,1936028769,544106784,778400629,1952531469,1936269413,1819633184,537996908,2019906592,1920213108,1633906293,778331508,1769107222,1634625895,1631789164,1684956524,1713402465,342191209,1701601603,1918985326,1634231072,543516526,1701603686,2003136017,1818313504,1633971813,1768300658,25964,0,0,1953451541,1981833504,1684630625,1818846752,1835101797,1310662757,1696625775,1735749486]},{"sector":13,"data":[1768169576,1931504499,1701011824,544175136,1852404336,1310400628,1696625775,1735749486,1701650536,2037542765,544175136,1852404336,1395925108,1702130553,1818435693,543908719,544432488,1852138850,1634231072,1684367214,1684086828,1953723754,543649385,1954047342,1634492704,439250290,544173908,2037277037,1869374240,544435043,1948283503,1919249769,1143352947,543519841,1953723757,543515168,1914728041,1701277281,543584032,808991025,544175136,960049202,1631853870,1919885433,1852796192,1713399924,1684825449,1869575200,1918987296,556688743,1920298824,1919885427,1852402976,1936028789,1701406240,1948279916,1814065007,1701278305,1631784494,1953459822,1701995296,543519841,0,0,1851869703,2037539189,1650804232,1918989682,1632437625,90727282,1769107521,1632437100,1967785081,1241802094,108620917,1969714497,1393128563,1702129765,1919246957,1952665351,1919246959,1987005960,1700949349,1698957426,1651336547,1392931429,1633971829,1867318905,2036425838,1702188039,2036425843,1684363017,1685284206,31073,0,0,1969771528,1633973106,1917191801,2036425833,1952535304,1633972853,22217081,22282573,22282583,5439814,0,0,117469441,7864576,2030108681,16779776,720932,201335049,2230528,1929445389,16780800,983156,285242625,7733504,771817490,-2130701056,524333,0,-1962736664,2144763,-67057474,637535418]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[11164237,64,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":5,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":6,"data":[279886,15204743,191784445,458758,262145000,65836,458752,196615,4194433,23330936,24510832,1647,131110,1187250176,34074624,720896,57999804,57999680,104858316,104919408,289998011,290058608,728631610,728691056,295638220,295694640,371202475,371257648,22421392,85590033,-2147287036,1,133824512,-265289663,32769,-2147221504,1,138084352,-265289707,32769,-2147155968,10,139460608,-265289719,32774,140050432,-265289719,32769,140640256,-265289720,32770,141164544,-265289721,32771,141623296,-265289722,32773,142016512,-265289709,32779,143261696,-265289721,32775,143720448,-265289721,32776,144179200,-265289713,32777,145162240,-265289720,32778,-2147090432,3,145686528,-265289717,32769,146407424,-265289697,32770,148439040,-265289714,32771,-2146893824,1,149356544,1048580,32769,0,1380008712,1279870532,69,524289,100663308,1314014539,1191398469,1426344260,642925907,1070399999,16777220,537280461,1070399751,16777222,-955891763,1070399747,17178374,570703821,1070399774,17349125,1191526349,1070399752,532998,-754761779,1070399504,2118660,805584845,1070399513,316419,-469549107,1070399503,344579,503660493,1070399490,204549,-217759795,1070399498,644357,201736141]},{"sector":7,"data":[1070399501,752902,1074151373,1070399506,731651,-804962355,1070399503,1018117,822427597,1070399503,861701,2047033293,1070399501,1087749,-754696243,1070399513,2048004,318914509,1070399489,2,755122125,1070399492,1546756,1057243085,1070399528,229635,212941,301989888,1701080649,1631789176,1210082418,1818521185,29285,1397638662,71652929,1094912768,1314341970,1330794564,201328195,1162104393,1145984856,1129271888,1174863873,1329742158,349269,1095648779,1414680386,1129271888,1175322632,1329742158,1279546450,1330794567,100665155,1229213254,609345,1196180487,1129271888,1174798338,1162891086,846,-2081649835,1183519980,24027916,687747,-6681483,184549631,-384928320,1996423361,-26102,-998047744,74907394,-16222465,1996424822,-26100,-998047744,1975520008,10217731,40908543,16777114,1958742784,-330920629,922701846,12059248,129519617,-1070903295,-26032,-1073020928,1048784501,1946157194,1882652455,-26110,1183383552,-6663938,-2097151745,922682052,1996423792,-25858,113704960,138,384583309,1354771280,-6664112,184549631,-12225344,-16622538,-1929106890,1343679558,16777114,1958742784,-8591101,384583309,-26032,1183645696,-1706027284,65535,738158057,-1732751168,726670849,-1202696000,-1706033104,65535,-443826133,705117,0,1942235995,920188696,656953,959844215]},{"sector":8,"data":[1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,-33110229,-1996488704,1459679246,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-22747129,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,407,-1017256565,-1192457387,-1957691328,1861682246,-828747770,-1962934271,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,477,-1017256565,736922453,1996443840,-26108,-443875328,-1957313699,74907628,16777114,1575324416,-326412861,-1710983425,582,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443875162,1320928093,1425768705,1393062657,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1073816207,-1007912629,567095476,-1023343453,16647822,741772070,889239552,512303565,109838578,521011444,-1171980104,567083296,1141803830,908256001,21366469,-617358708,1109327670,-385649919,-986251703,-1946072570,244698,1109327670,-1021372927,855643321,579335899,74711297,567099060,-1007492541,-387151019,1996423243,1042436,-1017256565]},{"sector":9,"data":[115600690,-657331503,1438907106,1122561163,-29235200,175432714,294528,1187382389,-987824636,-1207897578,567092480,1141803807,-1157111039,520028162,1183514946,-850611196,22330145,22346625,-11335565,1128487703,-1144786197,-75431596,141754710,1528299347,-219462845,50338243,50374401,50359296,50357761,50359552,50384385,50360576,16852993,50331904,50386945,50360832,16875521,50332928,16887041,50333184,16890881,50333440,16903169,50334208,-16743680,50339584,16909313,50335488,-16763392,50339840,50393089,50331904,-16768512,50340096,16916225,50336000,-16772352,50340352,16922369,50336768,50417921,50332928,16933121,50338048,16861953,50339328,50350337,50343680,50380033,50377216,50362881,50348544,50369025,50349056,16854273,1828739840,1167087646,518818645,1996478606,30455814,178256,2529872,1996423168,72923142,178256,3578448,1996423168,30586886,178256,4627024,1996423168,68204550,178256,5675600,1996423168,40679430,178256,6724176,1996423168,64403462,178256,7772752,1996423168,85243910,178256,8821328,1996423168,26392582,178256,9869904,1996423168,40024070,178256,10918480,1996423168,68597766,178256,11967056,1996423168,81704966,178256,13015632,1996423168,23377926,178256,14064208,1996423168,26261510]},{"sector":10,"data":[178256,15112784,1996423168,62306310,178256,16161360,1996423168,69908486,178256,17209936,1996423168,11450374,178256,-26032,-310181888,535137026,516640093,1430622296,-1910575989,-1796439592,-950642944,16740998,108461824,1342182072,503421112,3323984,21994064,1996423168,440326,24295504,515395614,1687834624,-16777215,129500790,817385472,-1202708988,-1706033112,377,-1207535873,-1202716664,1344144608,1342185144,102042,108461824,1342179768,503560376,2013264,27499088,1996423168,1226758,26785872,850939934,-6664192,184549631,-385649216,-4718208,-17665,1996443730,30513670,1721958400,1746307330,-18430,1392508858,108461904,125082,85369600,85464713,-1157627976,1347616767,-1710852353,511,-1996327261,-1207797738,-4521985,-11513089,379192950,-1560281086,378077810,-4717964,-17665,1996443730,36542982,-895287296,-870938367,-18431,1392508858,108461904,148890,2055637248,2090240511,-18177,1392508858,108461904,154778,42115840,42210953,-1157627976,1347616767,-1710852353,65535,-1996396381,184642070,-385649214,1119355072,884494336,1347590400,16777114,26649344,58048523,-956258327,273414,805750272,113704963,65894,65472198,134661888,-973078523,17032710,-26032,-2037841920,-1769341076,-1631256722,-74711188,-1190929218,-1510866918,26621695,16777114,9746432]},{"sector":11,"data":[-1330098146,726670848,16562880,1347440722,6600784,1354771280,108461904,-6664112,-1996488449,201290374,-1204587328,1344143538,503361976,309328,1380974778,1354771280,-11513776,-1191218506,-11534136,-1070922122,-275099568,-1560281086,-1073020304,-1224795275,-1732706446,726670849,-1202696000,-1706033104,65535,-638992341,1882652416,68532226,29603920,1354771280,-26032,922681344,-55049616,-6663937,-1560280833,378078478,922682640,-55049616,-1224781569,-1224736900,-6619270,-16776961,-36170,-6681482,-16776961,-6683018,-2097151745,1183515332,173443848,-9009527,-8874359,-2030107413,-1631256714,-2144927882,-227270593,-9140537,-2033777872,65392,-9003324,541032486,-1635049346,-2030043276,-1232339084,-2030043274,-1977155722,-16283644,-2080411514,2147446974,-1635002756,130482036,53524480,-6664162,-2147483393,208958,817370484,-6664189,-2097151745,-1073020220,113640821,-1207958736,1599995905,-1962742397,1297948645,-1873273141,-326412987,-2082959842,727069420,1268404416,-1560281084,79167952,1469730816,-1560281084,45614168,-6664192,-1560280833,-1202716206,-1924136952,1343672902,16777114,-767128320,-6664170,-1560280833,-1073020462,-794753419,30581505,-4538325,-1706012160,1188,184800931,-1593412160,-693960240,16758787,-1706012007,65535,184815779,-1593412160,279118936,12040196,-1070903266,1347440720,-6664112,-1996488449,-1072965050,-1070922379]},{"sector":12,"data":[-16686103,246995574,-375762944,-16777212,213506678,-259305216,16777114,1036387072,192741379,-1560161631,1486947604,-955258108,16821766,64397568,-1593502557,1822622736,-629735678,383534733,-26032,1996423168,-25894,1183514624,-465173540,-1962831197,1688462406,-431584510,-1593679197,-1556086382,683148310,1647245056,197890,-1207640413,787939339,100860306,84214162,23372544,-1202667477,1385791232,91986512,-1868365824,1354771201,-1719729480,-6664110,-1560280833,922682294,28836206,1347590400,16777114,-62486272,24000255,-1728052808,-6664110,-1560280833,1048773674,1962934672,-14751485,62275203,-385649408,2122579732,57999612,201264105,-385649216,1085865732,448286720,-6664192,-1996488449,-1072968122,-303496331,-1193767938,1200160916,408914966,-1996386143,1183518279,206014972,1066951,151504640,38258432,1204289535,-1577058556,1200161134,306693898,1204224001,-1962934252,-1706025277,65535,58048523,-89111,-6631818,-1207959297,-2090991615,-443874579,-884122337,131119,16712160,131076,16712206,131077,16712229,131078,16712276,131079,16712253,131080,16712183,196617,16712599,16973838,197466,16973935,67027,16973829,67119,16973831,66169,16973839,197440,16973825,66218,16973842,66249,196627,16712719,16973860,197479,16973959,197507,16973960,132291]},{"sector":13,"data":[16973977,65978,16973875,65558,16973878,197411,16973865,132211,16973874,197519,16973866,197994,16973997,198029,16973998,196922,16974000,198047,16974001,198176,16973881,132236,16973890,132386,16973892,66559,16973903,132315,327760,16713220,327681,16712111,16973826,132201,327762,16712134,327683,16712157,327684,16712203,327685,16712226,327686,16712273,16973831,132159,327767,16712250,327688,16712180,16973833,132378,131165,16713225,131073,16712114,131074,16712137,1953300483,1167087646,518818645,-327034738,-950664920,64582,-19102067,108461904,-1276637552,79987460,-19102067,-2037559274,1343684474,1344798904,163226,1552320768,2109737983,-373282043,-2033843407,-1207894157,-1924136957,1358917766,-10701057,-2096061208,-2037578044,1343684464,503323320,-26032,-1073020928,515379060,-6664192,-2097151745,-353828156,178178,-662270640,-1224781570,1860763484,113541904,26621695,-19364213,23463427,-150981447,1372138465,178256,-26032,-1073020928,-1224796299,1889206108,-1207959549,1344144408,1342182072,16777114,4372480,29603920,-1706012007,484,-10582391,-764100597,32807504,-2037841920,-1769341068,-2033713290,65384,-1207810327,-1202716620,-11533348,-385917770,-998043659,1555496710,1354771455]},{"sector":14,"data":[112720,20355664,-2037841920,-1769341088,-1224736926,922746716,922682340,-1070922782,35494480,113704960,1288,1342177976,1342506680,-10701057,-2096123672,1048774340,1962935558,22145283,1342177976,1342504632,-10701057,-2096130840,45614788,12079104,-1224781819,-2098659492,113541903,1342177976,-8878451,1555496784,258992383,-1962490749,-134252410,-1727897042,-1037319629,-754973767,734147576,84059074,1342177976,-8878451,1555496784,256108799,-1962490749,-134252410,-1727950290,-1037319629,-754973767,734147576,84190146,1342194360,-11485141,-1710946762,65535,200951433,-385649216,-1706032985,65535,-9795959,-9660791,84293375,-1224781742,-655818916,147096334,-10701057,1347469355,1342177720,155290,1686538496,1721141759,-29949953,3604228,112645,-1224781744,-1224736916,-6619286,-1996488449,201289350,-1560054592,-1224801016,-1224736932,-1224736922,-1070858396,44669520,-92078080,1025537535,460718079,-19102067,-2037559274,1343684474,1352663224,243610,1552320768,-3675137,1402665590,-16777213,1553660534,-352321533,1555496724,1354771455,84293375,1342177720,209562,178176,-628716208,-1224781570,1122565980,113541902,-19218815,108134851,-19233081,-1224801854,-1224737062,-1224736906,-1224736908,82378588,147096334,-19226997,-9128252,50726,-21473786,-591900668,244338691,-2096616472,-2037839676,-1072955686,-6682508,-1560280833,1048772632]},{"sector":15,"data":[1946158344,137821961,-26107,-1224802304,-1224736932,-1224736926,-1070858400,-26032,-1098711040,1946222298,1753677614,-662270977,1753627134,-385649665,-1224737363,-6619298,-16776961,-1694540106,65535,1181383,1187446785,-16776708,-1694540618,65535,1593591435,-1962742397,1297948645,-1873273141,-326412987,-2116514274,1459688172,-62470314,-2037579776,-11468944,244319862,-2097073688,-2037578556,1343684464,-17791347,12079126,-6664152,-1996488449,-1072959418,-1070922371,-973012247,-1207895226,-1924136957,-11470778,652800118,113541901,385369741,2144336,2073710622,184549381,-1206946624,-1706033122,1571,-385694589,45613248,-2037559296,-11469074,-219615114,113541900,26621695,-150981448,738127526,-1202695735,-1706033150,174,376815627,-1695516929,1218,503584952,1226832,13212240,-2037710848,1722023662,-1774780671,121805313,1183383552,-162100748,15877831,-1205474560,-1202716620,-11533348,-1830227850,113541900,-2081143100,-1959463866,64798456,-234874183,-230228059,-17922421,1928480313,-1774780462,42703361,113704960,18,-1929258817,520024246,4241671,817407474,-1202708989,1344143840,338586,-62470400,1996423169,108567280,1183514624,-2090901764,-443874579,-884122337,1167087646,518818645,-326903666,1183536648,-62486266,-1995946357,384563782,788037248,1586175092,-96010246,-231797,76217414,1586169736,-2012771588,-1073022906,1586224757]},{"sector":16,"data":[4161788,1187448181,-1962924804,1344207430,519849611,96442960,1183514624,-1706025464,65535,49120094,1562371467,1478413133,-1957345904,-661774612,40955009,-1070901673,-26179959,-26311031,-1912846711,1358799494,-1878624513,-9902066,-1929067389,385720966,53524560,1788497950,184549376,-1207601728,48955393,-2037792725,-1072955862,815800436,-2146658301,2734160,-1070903266,1921420624,-1706027266,65535,326483979,-2037551893,1343684210,-39680371,-6664170,-1929379585,385774214,-226063024,-1202710786,-1706029056,1544,-9271671,53493376,-955747328,821966982,-955847933,821966982,507413252,645201920,-29849973,-2034741218,-1202708990,-1705992190,1612,-40466807,91602955,-352321096,1086335746,397939061,2006601728,-2097152000,-1070923068,-2096828183,16741054,1048594044,1946157872,53524503,-659009506,-1202708991,-1705992192,53,-40335735,-9259265,1347469355,118135376,-92078080,1029797375,1551237119,53493376,-16157696,-1694656330,1665,-40454401,48026,1849097984,2471937,1921420624,-1202710786,-1706033024,65535,-26048883,-2037559274,1343684002,16777114,1547108096,1921420546,-1202710786,1344144312,1342189752,16777114,-10295040,-1202667477,-11534291,-385912138,-998045093,243718,3061840,1924595536,172615935,-1207516029,-1202716670,-11533978,-385912138,-998045129,1924595462,1354771455,112720,128162384,-930414592,-1962920776]},{"sector":17,"data":[1714354138,-1056728831,-2037787885,-1769341394,1119419952,-1011331072,1347590401,55450,679905536,1975520254,22079747,122919504,-2037841920,-1769341068,922746742,-426114666,-1996488704,-1979814266,-1979813738,-1979833722,-939645802,16657542,23503104,-30636487,1776878450,1855898626,1207314174,108266506,-40466805,-2037709589,-2037777000,-1001325018,654208670,638089215,721844223,446320832,-1962934271,-1946259834,-2080477034,889089670,-29704563,118943883,-1176859106,-1510866918,1149683231,-2037710594,-1769210322,-2037776848,-1769341376,884538946,-2037559296,1343684154,-9259265,-2096550680,876415172,-385647360,-1224801919,-1070858382,28856400,530206720,-1996488696,-1979871098,-159082,-36170,-118602,738078390,-1147514688,-1207959543,-1924136958,1358919814,-31017217,-2096575256,45614788,-2037559296,-11468936,-385912138,-998045461,2025751302,57999615,-1207908375,-1924136952,1358797446,-31017217,-2096587544,146278084,-2037559296,-11469414,-385912138,-998045509,4372486,1354771280,-8866049,471450,-96040704,913686539,-9259265,564890,-1732837632,145201917,-1224802304,2090532246,-1929379831,1358852742,518524560,46433032,503584952,1226832,71211600,1996423168,72260346,-2037841920,-1769341388,-1224737226,1347616632,-31017217,-2096626968,-1224800060,-1224736904,-1224737226,-1224737228,518586226,147096328,-30243191,-1694861569,2812,-1694861569,2821,-8878453]}]],[[{"sector":1,"data":[-30243271,45636978,-2037559296,-11469420,-385997130,-998045739,178182,-1803121328,-1224781571,-186056846,113541895,2080375357,-1799946446,1991704573,1958150143,649527295,126740734,-16202621,-158538,-35146,-35658,-385912138,-998045783,-1803142392,-13143043,-1694534986,2437,-40323329,626330,-1766392064,166173437,-2037579776,-1873740174,121104398,-1207778173,-1706033129,2925,-385694589,-1224801982,-1070858382,28856400,-677752832,-1996488695,-1979830650,-118634,-36170,-159050,738037942,93999296,-16777206,-369218426,-1224737397,-140837006,-2147483639,208958,-1224799884,530251160,-16777206,738039478,1347440832,691354,1354771200,1342190264,-40454401,-2096686360,-1224800572,-509936234,-2097151990,16657086,-2037570700,-1873740382,111142926,-1929198461,1358799494,-26048883,108456016,-1929067389,-335699322,53524494,882528286,-1929379835,385774214,30980176,45633566,1587171328,-1996488693,-1191339898,1344144176,503439544,79010384,-1224802304,96009624,1347590400,-1705983957,2949,-31291765,-31156597,-26311031,-26175863,-30636345,736821248,1342190776,-29718899,-1732837552,105375997,-1006189437,-2080477562,889089670,-1232209781,448396858,-5901824,-1577177978,-2043084442,-864879060,-40323329,274586,302434048,-956301312,130118,-30884221,-15567872,-1694619466,2840,-30886145,168858,1854311168,1887833086,-16157442]},{"sector":2,"data":[-1711172042,1170,1593591435,49120095,1562371467,1478413133,-1957345904,-661774612,-954012541,57926,53493376,-955812864,53539398,1187448299,-1962659598,1344205382,503482040,-1476216752,97819216,1183383552,292896992,1342184376,259226,46433024,-118898645,-529072383,1347469355,1342177976,417434,-163149568,-1946659191,2139293790,57999370,-1207871767,726663234,2013221056,245668360,1183383552,1975520252,19917059,246717008,1183383552,-363427352,1342177976,84428427,-11534328,1625874550,113541893,1342177976,-16222465,1357439094,113541893,1342177976,1074284171,1996443712,87943392,1023853699,58523650,-1962846487,1200293982,-754732796,244029920,-101252510,-1191557495,-1924136958,-11470266,283697270,113541893,-1962385781,61933127,-1952849709,-150892018,-96040455,1342177976,1358579341,-387942657,-998046485,146694,82379645,-529072383,1347469355,1342177720,822170,-465139456,-1947838839,2013202526,1354771210,-16222209,1996483190,-25880,1996423168,-428408864,736392959,-56995648,-2097151987,494272506,1979711293,-230257896,-2034741218,-1202708990,-1705992190,3559,-337623415,140413901,-16222209,1996483190,-529072152,-2096868120,1586170052,138885384,-2065104010,-59310336,1011354,-59310336,1013402,-14685440,1234886774,-1207959539,2062090265,178430,-498692784,-529072304,-2096876824,1996424900,175570700,16777114,-565802752,1912718141]},{"sector":3,"data":[-565786875,45613506,1183666176,1996443870,67758304,1023853699,628883458,-2197761,1996426358,-529072374,-2096899864,1183385796,-529072140,562586,-565802240,1945388601,1751046,-1946283799,1333790302,1183515658,-128545802,-1996077175,28837975,49120000,1562371467,1478413133,-1957345904,-661774612,1444736131,33310407,140413696,673735,106859264,17450998,867700596,172394752,-1207148916,770244609,106859266,67782646,1048584820,1946157872,-230242553,99287856,821184199,-230257916,-2034741218,-1202708990,233545730,503525560,30980176,12079134,1385844896,-1996488689,-1957632442,2013202014,108527368,-1705983957,3803,1342177976,84428427,-11534328,-286726538,113541890,-2096603509,1962936447,24570115,1342177976,-428409005,-2096966424,45614788,1183535104,1346387976,-387549441,-998047039,178182,-163148464,-428409008,-2096975640,1183516356,1647245302,-1036805886,62505515,871944960,-1950209086,1200162910,178180,-163148464,-428409008,-2096986904,1183516356,-1842415626,-1036805887,62505515,871944960,-1950209086,1200162910,4372486,1354771280,-1710721025,2181,200951433,-385649216,-1706032950,2250,-1981004151,1586228822,142081800,1996443730,35252454,-16202621,-1070864778,28856400,429543424,-1996488689,1451878470,140413930,2013214719,112642,1996443728,-327745554,147354,140413696,185223049,-955943488,64582,-1673473,1996483190]},{"sector":4,"data":[1354771432,525210,-359680,-12760971,-1958513153,1207305822,729023498,53493376,-955812864,53539398,1187448299,-1962659598,1344205382,503482040,-1610434480,174561872,1183383552,-1196299290,1344144176,503437496,-1610565552,1996482283,151296762,1996423168,151821050,451608576,-1947830529,-1070921634,142081872,1342177720,810394,-62470400,45613056,1183666176,1996443876,22800614,-2130262909,29615230,1187448178,-16661788,1996481654,175570700,-387549441,-998047453,-463566072,638219972,-16777018,681240182,-1962934256,-2090927034,-443874579,-884122337,1167087646,518818645,-326903666,53518340,884494488,726670848,1589137600,-1706025468,1448,578076683,503602872,42383440,12079134,-1466281968,-1996488692,-1072956346,-1706030980,3303,414716651,-1533390848,-2097151991,113705668,65566,-1962742397,1297948645,-326412853,1443687555,-1980479859,1187511366,-1962934022,254084166,-28931840,1859323057,670980,1586170483,-28931332,149630980,-1963172213,923074118,1191118728,-62455814,83525251,1325387132,-96024580,1586167808,105316102,-231797,76217422,1191118728,-92371974,-1947763708,130418270,-443851264,-1957313699,1451972588,-1962467836,1454638718,41034189,-1956659149,1438866917,1452010635,-851332090,855798305,1575324608,-326412853,73304862,-1274652987,172919615,41099725,-1960853453,1438866917,1586228363,106334980,1317748660,1931595016,-1950338302]},{"sector":5,"data":[1438866917,-1960907637,1455752286,-1958693882,567085646,-1070398861,1575324447,-326412861,-1962647925,1085539926,-855093621,855798561,1575324608,50337475,-16577792,50334464,-15715584,50334720,17540609,50335488,17048577,50335744,17620225,50336000,50774273,50331904,17544705,50336256,17618177,50336512,34535681,50343936,17351169,50345984,50763777,50376704,17832705,50350592,33758721,50349312,17453825,50351872,17814273,50352384,34372097,50350592,17796353,50353152,17032961,50353920,17463809,50354176,17213697,50354432,17631489,50354688,17826817,1828741376,1167087646,518818645,-326903666,205949798,1962939965,11921667,552141686,77059,1979716413,54520067,781434883,51750911,-1559345525,244318812,-15064088,-1070920074,-26032,1183383552,-1070903054,-1202696112,-1202651137,-1706030848,134,24000255,1342178232,379471501,2013264,-26032,1996423168,1354771442,379471501,582465616,16824400,-26032,585629696,242679577,1347469355,1208051361,1354771280,44698,242679552,1342177720,1347469355,-26032,-1070923776,1996441323,108461832,-16091393,1996426358,358606862,-351615869,176063461,-1193315328,-1706032034,285,-352140157,112849,672524368,184730755,-3967808,-402646986,-998039147,112642,-1360408021,1354771202,-2094532888,-1073020220,1996483444,-26098,-504692736]},{"sector":6,"data":[1342463672,16777114,46433024,24000255,16777114,81152,922688373,1083834834,-16777215,-1711009738,329,64370431,16777114,1354771200,16777114,-391976192,1441337915,40935935,1963345465,142508307,208995584,1342182072,-1142419824,-10163945,-938836351,-385649664,1048772996,1962934294,142508301,108331776,9045703,113704961,22,-1577118743,1178141296,-385649658,1996423613,-18422,1375797178,-26032,1996423168,1354771210,-26032,-794755072,-13571839,-16091393,-437776778,20441345,-1928431873,1343672902,16777114,272531712,1962970624,-700019440,1996443670,242679762,-352004888,-700019442,1996443670,242679762,-2097000728,1996425412,-767128306,-6664170,-385875713,2122579604,57999626,-95255,1996425334,242679558,-2096698904,2045314756,108462078,-16091393,-1561850250,-1250536,1996424822,242679562,-350603288,175570910,-383671064,1996488318,242679562,-383523352,2122514597,57999370,-2080489495,1946159230,-29955837,1064577,108331149,40908543,922682603,-6684068,-385875713,244383260,-384318488,1048706580,9306128,166265716,1547108350,-26110,1183383552,1614270,39847467,26357495,-1912846711,1343681606,-11485141,716766326,1647245056,1183535106,-1845099524,-6664191,-16776961,1183694454,-1706027276,65535,39597823,-1698793729,65535,-2114079767,582421118,1996448117,242679562,-2096725784,-1645673276,402665725]},{"sector":7,"data":[1728276225,1778523651,-1643995646,1728276226,1728276227,1728276227,16898051,1728110849,-872192253,17906945,417923957,1026979838,57999385,1040077033,57999386,1040138217,57999616,1040121833,57999618,-69911,1996426870,175570700,-16222465,-6683018,-352321281,17972530,2062091125,18103807,-1394015371,18169342,-1293352075,18234878,-1159134347,33635837,300483445,33766909,166265717,-2085032963,-443874579,-900899553,-1957363702,283935724,-1929087233,1343682630,450202,272531712,1962970624,374802,118856272,1347551232,16777114,-1593578752,1183384852,1958743026,-6664092,-956301057,62534,16139975,74907392,385107597,-26032,1996423168,-193528058,-1695123713,65535,-16353537,1100673654,-1996488700,1996484678,-129594106,1996443670,97426162,1996423168,-260636922,16777114,272531712,1962970624,-227082488,79770,1575324416,-326412861,1445391491,1457795,-385649664,1889600096,535809,770459273,104529928,75367646,149712515,-1996156255,137225286,1678129920,-2096857599,-955718546,126534,-1560280648,212009560,73179397,2128889401,369492762,-1952888828,-150727154,1476788729,73179394,33159065,-1962603514,103541830,1183384798,2126515166,244029708,-506396062,1174534647,-465138706,370051993,-1980107004,1721884742,1476802817,-1560052222,1721827928,201734401,-1560052219,1183515916,-297387552,1183516030,-1962677266,1183440966,23503330]},{"sector":8,"data":[2145535545,-498693373,-1545451895,922682386,-107347562,-1996488698,1451874886,305564636,379670020,-1947273468,721705998,-129070648,-150838623,65065454,-1996203514,413268550,302383872,-1952888828,-150903282,-61437447,-150981448,-632945686,-1982048629,1451878470,-431568918,-941031424,-263811840,1996443670,-126418950,66733707,1342496262,66602635,1342268422,423322,108461824,384845453,1479999312,-26108,1183645696,-1202710800,1347485695,16777114,108461824,384845453,-801702064,109484545,1996423168,112646,120101456,1996423168,-96040186,1688293440,-1037330174,1174665425,-1957674760,1452009542,722410,1183535186,722408,1671057490,1342177287,485786,40018176,1177149649,68592122,-2080881151,-13309842,2122579022,427622652,1208051361,-1191426423,1861681204,-632945668,-1982048629,1451878470,-431554582,956568225,58582598,-1946210583,50617398,-1929276874,1343680582,73021183,1342260365,50616993,1342496262,1342325901,437402,108461824,384845453,1815543632,113089026,915079168,906167388,1183646098,-11528464,-1929094602,-1588591804,100861018,-1924135714,-1706032060,735,-1928956161,1343680582,40646399,16777114,-1774780672,126327297,-1956773888,1438866917,-326898549,74907410,385238669,-26032,1183514624,-1845099524,-1952888831,-150892018,-230258183,26621695,16777114,-297367296,-1192208759,787939380,1174471264,108462062,1342179512,16777114]},{"sector":9,"data":[-1706012160,450,-1207535873,-1706033151,65535,16664263,-196688128,1122697216,66340491,990011398,2097243654,108461885,39991039,-1946257665,1452011078,722416,1183535186,722414,-6664110,1342177535,16777114,26386688,-2080487935,-13308346,1183577158,-196724238,922728060,-6684266,-1711275777,65535,39585339,413219701,1611016960,-1842415870,-28931839,385238669,1354771280,-1191282945,787939370,-1957690782,100924998,-1706032750,2156,-1928956161,1343682118,191642,1575324416,-326412861,1444736131,26621695,338842,-465139456,-1947838839,1308776502,-150727007,1544457198,-1983370492,1654779982,-772868350,1510343648,-62486268,50337953,1208113158,1712229273,-1980107007,884537942,65730304,1452008518,-330921498,-1157495,-1711121354,686,199771785,-385649216,1187446988,-385875734,1183645869,-1957685518,1346436166,1089488523,-62485680,81659395,1183535176,-1845099536,-1706016767,1437,-1914145025,1343681094,30422783,276122,-394854656,1342177720,383642,-394854656,1090274955,40149328,-775804007,-263846920,1183535168,-296317972,1375734533,-330921136,1375734533,101161552,-1706033152,1549,-788372831,-62510624,17045153,1854140486,1325348076,-92371974,-1592165120,-1991769754,884537926,-93391104,-1947974141,1183442518,-296318484,-1578481921,1178141272,-385647126,922746696,1996423772,49847016,922681344,-962985578,1577058310]},{"sector":10,"data":[-1017256565,-2081649835,-1957297428,1889732166,138840833,721752739,755065862,1554186248,26386692,-775804007,972065784,2080660534,73179395,-956015453,134502918,-1845099776,263425,-2080487799,159806,922690676,163054192,1996443648,2668798,39988983,196628544,-1842415872,-1070903295,-26032,-1956773888,1438866917,-327029621,1448542490,503584952,-26032,-2037841920,-1072955530,305995892,-385649664,1996425576,26785796,-1070903266,817385552,496652288,-385875956,1183517008,7552262,-722926731,-385647100,1697450210,867584,904463222,-1816132855,-1599602898,636946,153938000,-2097072151,7742,434701172,1354771209,-2095122712,-1073020220,166265717,-1237909751,179935747,113639424,-973077712,198662,-1206941464,-1706032034,3217,-16595837,-1711182282,3229,-16595837,-1207855562,1385758772,178256,-26032,113704960,65894,1574599,113704960,608,-401401368,922685219,-510000746,-1996488697,-1979783546,-989927274,-1946229090,64798459,-234874183,-1774780507,152279553,1048641536,9306128,922684021,-1008205800,46433046,721712895,-1202696000,-1706033151,65535,26228479,802202,302434048,-2130706432,-1929375682,-385649664,-1070921652,182164048,922681344,-1885732240,-385875966,-1070921672,504752208,184730755,-385649216,28837928,669536256,46433032,-9664887,594853899,-401698736,-998040267,1975520002,406257418,393472000]},{"sector":11,"data":[-16595837,-1694536522,2995,-16256023,-402646986,-998041763,132573442,-384023320,28837856,216748032,1064577,192217229,23475967,16777114,-1696863488,65535,-2146975767,208958,-2033776268,53542766,-1207906839,-397410302,-998045778,1820756226,1975520255,127592707,1183666206,-1202710912,-1706032896,65535,-9402743,-1987557747,-2080412026,16740542,347608948,244338688,-2096265752,-1224801596,882573164,-352321524,1820756914,726671103,-6664000,-1996488449,1040149126,1602158591,-26032,922681344,330826094,-2037559296,1343684330,1342210232,28314,1820756736,-1706025217,65535,-18184563,-2037690346,1344208748,16777114,1547108096,-360280830,-1202710786,1344144608,1342252216,16777114,474368,922716276,-6684068,-16776961,-1694536522,65535,62273279,840602,272531712,1962970368,1882652442,67155970,1354771280,-895856560,-1996488692,-1979747706,-2113964906,-1912598466,-15830016,-402646986,-998042382,1958742786,1857486677,-25857,-998047744,1958742786,220456987,1342463672,55450,46433024,24000255,16777114,46433024,1064577,578093197,1586943,-2095720216,922682052,28836464,-1070903292,1958149968,1924595711,-25857,922681344,-6684272,-385875713,278988352,105265408,904463221,108953862,292880526,1586943,-2095812120,-1073020220,501812597,406257414,361228288,-1962752893,279119430,74907392,1962970685,-339727612]},{"sector":12,"data":[112643,1354771280,-1650831280,-16777216,-2130546634,9307774,-1070922635,28836843,-6664192,-16776961,-1207799754,-2125463541,9242238,28837237,721611520,-1070903104,26890320,-2130706418,9307774,922703733,-2037579172,1343684472,1014426,2122746624,244029951,-101252718,-9402743,108380171,-9402681,915079169,-1238695578,1049362288,-2037710824,-1723269264,-120470997,-29624277,-947190659,-963968277,184705187,-955875904,155654,264300544,-1912177023,-1593477888,65733212,1342337185,974234,74907392,1347469355,1342177720,946330,87222528,1064577,57933965,-16439319,-1207799754,726664215,1347440832,808858,85125376,1064577,343212174,1586943,-2095811352,922682052,1139277848,46433043,1342178232,-2096826904,-2037841212,-1072955540,-504822923,65517572,-2037690338,1344208748,1005210,406257408,296937472,-1878866813,301787150,-402646877,113708834,65554,721712895,-1202696000,-1706033151,2736,-2080594711,329790,922685300,1369048328,-956301308,329734,406257408,335013888,-16595837,-385716170,1996488506,-26106,-2048327680,-25860,1776877568,1351940,1963345465,73328899,1963359875,922685045,-711327344,-1560281074,166396258,23213823,661146,1354771200,1041050,105286400,-385870685,96009196,803753984,46433028,-9664887,58048523,-16507927,-1207855562,787939380,872743270,1347590400,1342177976,675482]},{"sector":13,"data":[1975520000,68728849,314069022,-6664192,-385875713,1048706029,9306128,922685812,669515800,46433042,58048523,-386149143,-407369149,-1957683709,520055942,-26032,243269632,-1878850586,284223502,-2130700125,-1912598466,-11045632,-1929225162,385841286,63543888,-2037710848,-1952841858,-150892018,1887865337,1975520255,1887880966,-1962933761,721511990,-1946193738,-1962928066,1224700038,-775804007,1006119928,-1962639874,-1962742841,39887814,108904459,39847623,-1209532416,272531725,1962970624,406257421,294447104,-385694589,-1070858618,267098704,922681344,-761658768,-385875958,1048706674,9306128,922686581,-1964507112,46433042,1586943,-2096014872,922682052,-1070923410,-360280752,-1202710786,-1706033024,3049,-18184563,1891127318,-1706025472,4160,-18184563,-407351274,-1706025469,4176,-18184563,1924681750,-1706025472,3077,39597823,-18184563,-524791786,-1202708988,-1706032863,2499,1946157373,44493059,84426371,-15764480,-1710946250,3715,84412103,1048772608,2113995110,406257492,258664448,-1593654141,104399206,326434840,1064577,74776717,82559019,1208051361,-402646877,1048644806,9240592,922684021,-1024983016,46433041,26621695,-150981448,-1727961554,45633618,1100632064,-352321519,145090621,26621695,683930,-427390720,-392787458,-425802498,-1090810882,448332764,-5901824,-1711172042,2702,1064577,175440014]},{"sector":14,"data":[1586943,-2096085528,113705668,65554,-218391,-1207855562,787939380,872743270,1347590400,1342177976,988570,1975520000,68728849,314069022,664424448,-385875953,1048641984,9306128,922685812,-68681704,46433039,58048523,-16668695,-402646986,-998043375,-435257342,244318979,-1559310872,1048641560,9306128,-397386123,-998043698,1547108098,2022083842,-1706027265,3441,-8485237,-1844540519,-1980107007,201289862,-955877952,33517702,1714850560,1890986753,406752255,1887865600,731465983,737726914,2113813496,-339244284,-1547269374,-1073020320,113706621,608,-16019992,-1070922634,28856400,-509980672,-956301299,16781830,17754368,1064577,343212174,1586943,-2096074520,922682052,1072168984,46433039,1342180280,-2097090072,-2037841212,-1072955540,-571931787,-6664192,-385875713,129562834,-739749888,46433024,-9664887,58048523,1342226409,16777114,-122361600,50871936,-1710722048,4761,-1207916567,-397410296,-998047578,1820756226,1975520255,9627907,503515320,1820756816,-1706025217,3653,16777114,-126097152,182585847,191564635,188746554,320473908,320475930,242683400,245239454,1962965821,-26744573,1949113983,408832,-1073525641,-1476448621,246485718,233311921,320475930,267521770,1946190909,1024622474,57999484,1040128489,57999491,-335590423,8731933,1609106293,9256447,-1908600708,-385646848,-1220675128,-385649374]},{"sector":15,"data":[1600059091,-1017256565,-2081649835,1183515884,40542980,1946157373,146717,104677492,1024685056,1064566793,1946159933,40280387,40375947,379652075,404130565,-62486267,-108919,-1962840522,1385759814,1547108176,-25755902,-1694730497,65535,1990269931,2014743298,-1579750654,378208714,-840236596,-1962773855,-352160746,1575324612,-326412861,-16061309,-1711121354,65535,1358841481,1342213560,1050169,146277749,721611520,-711307072,-16777197,-1900478858,104419328,91553808,-352319304,1354771202,1306522,-25755904,1342207160,1312313,146277749,721611520,161108160,-16777196,1975058038,104419328,91553812,-352319304,1354771202,16777114,272531712,1946193152,22014211,1326723,-14584460,-1207799754,726664214,1347440832,1384090,1958873856,-25755893,1342207672,183222315,-1191282945,-1202716554,-1706033151,5279,33310407,1547108096,-26110,-1073020928,1187459700,-16776966,-6620554,-1996488449,-1072956858,1048779124,1970602004,178181,28836843,-96060672,1187503477,-1711275780,65535,-1191282945,-11534221,-1365574538,-16777196,1958280822,-1070903296,347970128,1996423168,7715070,1354771280,1363098,-25755904,1342206136,-1705983957,5339,-1191282945,726663300,-358985536,-16777196,-2051473802,-1070903296,352688720,1996423168,6928638,1983808336,74711040,65781803,1342177720,1390746,339641088,896889856,40908543,1342439608]},{"sector":16,"data":[1347469355,224107088,1183383552,-128546314,544591931,-1191282945,-1202716559,-1706033151,5463,-1191282945,-1192689550,138314496,-529268731,-1191282945,726663281,1939493056,-16777195,1924726390,-1070903296,-16737559,1991835254,28856320,-2087038976,-16777195,1958280822,28856320,-1818603520,-16777195,1975058038,28856320,-1550168064,-16777195,1891171958,28856320,-1281732608,-16777195,1907949174,28856320,-1013297152,-16777195,1924726390,28856320,-744861696,-16777195,1941503606,28856320,-476426240,-16777195,-2068251018,28856320,-207990784,-16777195,-2051473802,28856320,60444672,-16777194,1773731446,28856320,-6664192,-1962934017,1438866917,113765515,65558,40908543,-16353537,-6683530,-1962934017,1438866917,-326898549,272531744,1962970368,209125235,-401967361,-998047231,-532248316,17202817,1027110146,58720255,-1593752599,1178140696,-385649184,1996423480,375008,1547108176,75229186,-16333693,79224950,922701824,1793589852,113541892,-1593764887,1178140696,-1915521568,1343677510,-1202667477,1347420674,1342177720,16777114,1958742784,14805478,-1727248757,26349195,100923895,1183384160,108954080,192152065,956307617,58056774,-1593795351,1178141030,-385647392,413204672,1611016960,-1842415870,-28931839,-1710983425,2100,-1914550647,1343682118,-11485141,716766838,1647245056,1183535106,-1845099522,1234849793,-16777193,1183703670,-1706027274]},{"sector":17,"data":[5974,-1545582965,103481368,787939936,1183383954,-163148290,-1070903274,-25755824,-150984008,1342333486,66995851,1342280198,508058,-495517952,385238669,130914896,1996423168,-495517948,1572506,-1590695168,1178141030,-1926791712,1343677510,-1202667477,1347420674,1342177720,1482138,1958742784,7321830,74907472,-2081293080,-443874108,1478411101,-1957345904,-661774612,-2129728381,-1912598466,-1956285184,103482950,787939936,1183383954,1547108348,384342530,1183383552,-196702734,-1070903274,-59310256,-150984008,1342333486,66864779,1342280198,1614746,-227082496,385107597,387488336,922681344,1996423772,151689970,1183514624,1614600,224389200,-1207778173,585826305,-1207404801,-11534331,-402498506,-998047035,142016262,1342178488,39597823,-2096974616,-310180156,535137026,1439386973,-326898549,915101200,-1588722670,-285801450,73141899,1317652523,40018418,-523112713,73008643,-1577171319,100859928,-1723333614,23465611,1451882999,-263796740,-1662451712,-196702976,1183535126,-1957674754,1346433606,66995851,1208278534,-230257840,26347011,-543535040,-1929379816,1343681606,-16353537,-275118986,184549400,-1925417536,1343681606,-1946663285,-788372978,1086401505,1996443712,-126418954,66471563,1208050694,194662472,-1929379817,1343681606,-16353537,-6683530,184549631,-1962576704,803994694,-788372831,-28956192,17045153,1325396550,-58817540,-1593344768,-1991769754]}],[{"sector":1,"data":[1191181382,68329968,2112898617,-10884861,1593835448,-1017256565,1167087646,518818645,-327034738,2122514562,309662214,-8485235,-1732751338,-1706025471,6635,922687211,1996423534,2122747142,-1202710785,-1706033024,4128,39597823,-8485235,-524791786,-1202708988,-1706033104,4200,-1962742397,1297948645,-326412853,65472198,134661888,-1207959547,1344143480,-2080610072,113640644,-1962867738,1438866917,-326898549,-666464984,-401698736,-998047723,1547108098,-666465022,530206742,-1962934250,516120037,1430622296,-1910575989,149717976,503727755,9746512,-1801826274,-1962934254,1344144966,503347640,441555536,1048576000,1946157872,-129579199,1187447600,-352112390,-129564925,-2131206517,-176881601,1586170859,1547665656,1325337460,-96039944,2012759609,-128021523,1968979840,-129564925,503727755,-129594544,1183516907,-1202708986,1344143730,1061018,49120000,1562371467,1478413133,-1957345904,-661774612,-16192381,-1711121354,5024,-1191426423,1344143518,503359160,8239184,1183666206,-1202710792,-1706033150,65535,578142219,7734983,1996423168,6928636,112720,449550928,1996423168,6994172,112720,113712875,65654,-1191414017,726663273,-627420992,-16777190,1790508150,-1070903296,340564560,-310181888,535137026,1439386973,-326898549,1614096,-940423543,130630,23477891,-1207534334,-2115436543,-2143386879,108331008,-1560274783,113705734,65664]},{"sector":2,"data":[1023821451,1115095048,781434883,470198271,1576703,1588867,-385647616,1721827554,413353985,14215424,1574655,956393121,1946163206,13166851,1574599,-1075249152,23503104,84674105,1183516277,18803198,688196769,-2097145850,6206,-1612119172,23503104,1574401,-1593797143,104399206,-697039604,17108129,-1593829370,104399206,2088501272,1574441,111245035,403060995,1344435200,-2096777752,-1073020220,922684532,-823656424,46433030,111217643,1614595,16664263,74907392,-11485141,-1207953354,-1706033151,7292,40908543,1347469355,1342177720,1179546,2114373376,-956301312,32774,-10295040,-385333621,455671604,458824512,463608707,459414528,463608674,956307617,58061382,-2080423959,32318,922697077,-1030094224,-1996488681,922742854,1183646320,-1706027274,7328,-1913620737,1343682118,30422783,556442,1882652416,-260636926,1532314,2114373376,-2097151744,1946486398,74907411,-11485141,-1207953354,-1706033151,7458,-370453784,-443810084,-1957313699,283935724,39887190,-113015,1183646838,-1706027276,7576,-1711651189,26349195,1183447543,-263796740,1183514624,1958742790,81179,37565812,1027044352,1014235139,1946158141,343365,99301236,-1030457,-263812097,39847425,23475851,972846635,2114084918,1614186807,-952177918,127046,1183571947,-1982269444,-705957818,-335788405,138841078,39847467,1996484075]},{"sector":3,"data":[112644,142016336,492214864,1407909888,39861891,-955876096,155654,-28931328,39847467,200296073,-2093452096,1946486398,74907409,1342177720,39859967,505059920,1996423168,1354771204,-135248245,1342280238,1347469355,-6664112,-16776961,731513974,1577058316,-1017256565,-2081649835,1048644844,9306128,922696565,1183646300,-1706027274,4516,-1711520117,26349195,1183447543,1711684606,-955810815,62534,2122521323,91554046,33441479,23503104,-335657429,23503108,-196703928,39597823,1064577,91553934,-352321096,1354771202,-11485141,-1705970570,3363,39597823,1064577,91553934,-352321096,1354771202,1064577,91553934,-352165727,1614083,112720,-26032,-443875328,1478411101,-1957345904,-661774612,-1960645501,255659078,1985901568,12577027,1962936125,10152195,1962936381,10545411,-2097100311,1962939454,-1075248268,142016256,-16353537,1996425846,242679564,16777114,180650752,-375799765,1996423359,92530698,1996424939,83879946,184730755,-2082114112,1946162238,-2081825163,373195520,-730529792,-1928431873,1343675974,123290,272039680,238485253,1882652421,209125122,735999743,-1706012480,7985,-1864468737,7661582,-16595837,1183649398,-1706027298,535,1048810219,1953759252,-26061,-2064973824,1326723,-1708821388,65535,1040152041,57999616,1040153577,57999618,1040149481,141689344,1996620349,-13113085]},{"sector":4,"data":[84948735,84817663,40908543,-15960321,1996425846,108461832,16777114,49120000,1562371467,707149,1167087646,518818645,-326903666,272531732,1962970624,10610947,494746,-62486272,84426371,-1586203648,1178141296,721974780,-677752640,-16777185,-6683018,-1996488449,-1072957370,-11516044,-1710946250,8129,-375159,922682998,922682626,922682628,922682622,1996424448,1354771448,13023312,1375766714,-26032,1996423168,-92864520,271258,-126419200,16777114,40935680,1979467321,-778416122,-2097151987,1962939454,1889605493,-62506750,2058882933,1996443650,-26106,-998047744,49120004,1562371467,-1957311667,82609132,1712258902,-1774780671,543726081,1183383552,-27883012,-150981448,-259324818,721512097,884540486,1357510400,-1912840508,1342583872,-1030962293,1347601923,-2096693272,922684100,865730966,1577058337,-1017256565,1167087646,518818645,-326903666,-11118830,-1711172042,8631,-1980873079,1183445078,-162100748,15877831,-948704512,65534022,-1946925429,184940118,-96040704,-1946397047,1065416798,-1004309504,-1977157026,-397371385,-998047581,-128021758,126535819,-242528104,-2097114392,-969211196,1589912948,126494458,-2132258664,46433024,-1946657141,-1744336184,-386823344,-998047633,2143697666,-15209718,1191180358,-2086081542,-13306810,1721889350,-230278911,1721861500,-230278911,1177231220,3455474,-11474441,1996486262,-196703244,66475659]},{"sector":5,"data":[-397389119,-998046147,-195116022,-591463541,1751299,922723826,211419542,-16777199,-1962842618,1600057926,-1962742397,1297948645,-326412853,1627684480,2122320508,75463172,537161344,-1744550262,-1017256565,-2081649835,1448545004,65406710,-15108861,-1207799754,726664200,1347440832,2228122,1975651072,14739715,1342194360,-1727937608,-6664110,-1996488449,-1072956858,431493493,244338688,-2080930328,-1070923068,-16723223,-308610442,-1996488688,1451883590,1882652670,-1202695678,-1706032701,65535,-100609,-21431178,-591900668,-6664189,-2097151745,-1073018684,116835444,1963066342,1882652438,67680258,1354771280,765087824,184549396,-955878206,16781830,1882652416,67745794,1354771280,-2120593328,-973078495,255494,65406662,-435257344,922682371,-1113980522,-1996488670,1451882054,3455224,17067767,1589966406,-1090810890,448332764,-5901824,-1711172042,8800,-1694861569,8939,-1694861569,9015,84426371,-15764480,-1710946250,4224,84412103,28835840,-1956684288,1438866917,-326898549,-1202301174,-1202716606,1385759171,563583568,1183383552,1975520250,2144271,-401698736,-997984642,12970242,26621695,2290586,-163149568,-1191684471,1861681204,-163184380,-1946794357,-591398826,519080707,-628220409,-234874183,922689445,798622102,-16777181,312146550,-1996488672,1451883590,-1202695426,-1202715394,-1706032164,65535,185123971,-1207142976,-1873805284]},{"sector":6,"data":[-166402034,-16595837,1996488310,-219944708,-16464765,1268447862,-16777184,-6620554,-2097151745,329790,2058886772,-11526654,-16448970,-1593506762,100861186,-1588591362,100861188,401278208,503478968,374864,1654739024,328962,26386768,1342178565,1566106,-1956684288,1438866917,1183575179,2174212,1996490557,-1816132791,-341311698,1354771235,-352320072,23503121,737471304,116084928,-1202667477,-11534335,-402498506,-997984467,1354771206,1342179512,39597823,-2080957208,28837572,-2094470400,1946162238,-1070922635,1996430827,-26108,-998047744,-1478235390,-1591497693,-752641757,-752626909,-1960586461,1438866917,-326898549,1161248,-26032,-1073020928,28837245,721611520,-330921536,108314635,537165443,-1070922372,-2097070871,-12581818,-1711172042,8755,-1981659511,413262934,1183399936,3455208,65564407,1452008006,-96040476,-939764087,59974,956393121,712895046,1978156601,-398014703,1183514624,-464090142,-1980086647,1589967958,1200236282,-397371381,-997983037,71711490,922694005,1486487958,-1593835486,1178141030,-385647382,1048641730,9306128,922691444,-1276641256,46433276,-387418369,-997982767,-10228990,1183574598,-61436934,888817283,-337099009,1614219,39847467,26357495,-1912715639,1343681094,-11485141,716766838,1647245056,1183535106,-1845099522,-1298509823,-16777179,-1711121354,9659,1357268617,384976525,633969232,922681344]},{"sector":7,"data":[1996423772,634755814,1183514624,1614824,1064577,712310925,39597823,-11485141,-1207953354,-1706033151,9759,-1929496,721580086,-1202696000,-1706033151,7149,922684139,182976536,46433024,-1962933832,1438866917,-326898549,1547108112,-196702974,1536839702,-1962934234,-1952843194,-150892018,-62486023,721700491,-150839290,-28931607,385107597,1354771280,-1191282945,787939370,-1957690782,-1056702906,654940752,922681344,295305820,-1996488665,-1924075450,1343681606,2563994,1547108096,-260636926,2566810,39887104,2080654905,-62485747,39847427,71711560,1621187197,71710978,1183517053,1611016964,-1962153214,1177224262,1611017212,1183399938,1611006450,1547108098,112642,1614217040,-593866750,-16777189,721574966,1183535296,-136775694,1342280238,1347469355,1872384080,-16777187,-1711121354,7543,-1017256565,-2081649835,1996427500,-230257404,1083854870,-1962934244,-1952843706,-150892018,-62486023,1023821451,863240225,1946165821,2309401,607993204,1026651136,947126310,1946167357,-373281992,1183514796,403047420,-96040704,956393121,679279174,-1591547064,1177223192,-96040452,410894347,16402119,-1592661248,-454360730,-352315231,1614303,-96040640,16416387,1721854332,-96061183,413229437,-96061184,103504244,787939936,1183383954,-230257154,-1070903274,-25755824,-150984008,1342333486,66995851,1342280198,2324890,74907392,1847194,-263812864]},{"sector":8,"data":[-230257328,-224767978,-16777193,1996424310,475896560,1183514624,1614842,-30152624,-1207778173,-443875327,-1957313699,509040364,75416828,-1962379579,-1527641010,-1956749537,1438866917,1465314443,2126839070,142001412,51138187,1324942321,-56298929,-1956749537,1438866917,-327029621,1048772740,1946157086,11528451,1342179000,-2081714712,1183384260,1975520252,10217731,-2037559266,1343684476,1342243000,2646682,-28931840,376750091,1342182584,1877479056,46433265,-1694730497,10286,922709483,932840374,-2130706392,-1912598466,-15830016,-402646986,-997983874,1958742786,-59310275,16777114,46433024,779403275,413384747,39887616,-2114618904,-1929375682,-16091904,-402646986,-997983627,1547108098,1354771202,112720,685742672,1996423168,679320316,922681344,-1969618544,-1962934232,516120037,1430622296,-1910575989,-2031320616,-62470400,1183514624,-1924129274,385841798,16824400,708614736,1183383552,1958743034,1357848,-401698736,-997986118,108461826,2778010,-339727616,-1237909649,686660099,1996423168,-26106,-998047744,1958742786,-250615733,1342463672,666778,46433024,24000255,669850,46433024,413384747,39887616,-737816,-402646986,-997983807,-435763710,922681347,-1070923172,28856400,1419399168,-956301275,130118,26228479,968602,-62485760,-1962742397,1297948645,-326412853,17755265,1195651,-165645056,33809926,922687861,146276976]},{"sector":9,"data":[-1070903292,-1706012592,8731,58049035,-16653335,-1207865802,-1924136958,385806982,8435792,714709584,1048576000,1962935088,8448259,-9140537,82510640,-9140481,-9134453,1962950528,-1962021901,-2130742114,208952383,-9138433,-9126271,-344521936,-9134453,1968979840,1955004164,-226062849,2089191934,-16454657,-1946190714,-2130740066,-210436033,-1635050261,-2030043276,126549876,-1662496616,46433271,-8610165,-8616193,-1635055736,1065418612,-1948551936,-956334946,283836423,-17660275,1924681750,-1706025471,10933,39597823,-17660275,-1195880426,-1202708989,-1706033117,10957,-8485239,1946158653,17295619,1586943,-2080940568,-1073020220,-622263435,809402368,57933827,-1207905047,-397410302,-997988098,1988528386,1975520255,11659523,1183666206,-1202710912,-1706032896,2956,-8747383,-1987557747,-2080409466,16743102,347608948,244338688,-2081499672,-1224801596,-610599050,-352321494,1988529074,726671103,-1013296960,-1996488693,1040151174,1451163647,198351440,922681344,330826094,-2037559296,1343684338,1342210232,2835354,1988528896,-1706025217,3060,-17660275,-2037690346,1344208758,1702554,1547108096,-226063102,-1202710786,1344144608,1342252216,1671322,474368,-1224767372,547028854,-352321525,406257428,-140253184,721601667,-952570944,822048902,2025258755,209623807,-998047744,1975520002,-2082149601,50298558,1048829300,1946158344,137821967]},{"sector":10,"data":[578329093,113704960,1288,-1962933832,1438866917,-327029621,922681472,1996423534,-2142860028,-2135404522,1754943488,-16777191,-1929225162,1343651910,503727755,2209872,703634000,20774912,-1207601920,48955393,-443826133,6013789,681902083,655615,604635395,6946819,58130691,7012355,394330371,7143427,682688515,917759,689963267,7274499,721027075,983295,190054403,1048831,189595651,1114367,246022147,1179903,245497859,1245439,309067779,1310975,308084739,1376511,306118659,1442047,667418883,458753,568262659,1507583,535953411,1573119,28705027,65538,519307267,1638655,143196419,131074,515899651,7995395,518389763,1704191,510197763,1769727,641990915,8126467,587726851,1835263,673579267,8192003,602013699,1900799,580780291,983041,283050243,1048577,119275779,589826,727318787,65539,577241347,1114113,607387907,1179649,613613827,1245185,680656899,2425087,22085891,393219,670105603,2490623,341442819,8978435,344981763,9043971,68681987,9699330,66257155,9830402,342556931,9437187,527630595,1441795,525926659,1507331,5767427,10027011,146538755,2162690,331022595,10092547,532021507,2228226,447348995,10158083,4325635,10223619,67764483,1835011,443547907,10289155,19464451,3145729]},{"sector":11,"data":[628818179,2162691,567017731,2359299,529268995,2949122,432734467,2424835,514130179,2555907,161349891,3604481,517472515,2621443,290652419,3670017,221970691,2752515,445645059,3801089,528154883,3407874,691929347,11534339,64618755,11796483,17957123,3473411,159777027,3670019,65077507,4325378,665649411,4849665,533266691,4456450,723124483,4521986,641401091,3997699,624951555,4063235,715391235,5177345,502006019,4194307,713163011,5308417,621019395,4325379,622723331,4456451,668139779,4521987,712179971,5570561,620429571,4718595,424673539,5767169,702021891,5832705,146145539,5898241,414384387,4980739,96272643,5111811,475070723,5308419,621936899,5373955,95289603,5439491,326107395,5701635,-2115204267,-1207905556,1344143518,503359160,8566864,-2037559266,1343684402,1342187704,16777114,847678720,-632911361,-1098904853,1949105966,-632881392,-1965400437,780568583,1975519999,-631338007,1946173312,-632881390,-352319546,784236554,276766975,-1948629249,126540382,-13728120,-378159094,-1982183797,300670022,-13713792,-2145946580,553594558,1191121022,-631338022,-2037905526,-1073021138,1586225781,4161754,1191123316,509658,-1098903061,2116091694,784236551,276114687,-1948629249,126540382,-13728120,-495599606,-1982183797,-335597434,784236554,276701439]},{"sector":12,"data":[-1948629249,126540382,-13728120,-378159094,-958767477,1183514631,-1924129060,385823366,814123856,726671103,-1706012480,65535,199116425,-2095090240,1946214014,-562626808,136858,2209792,55286352,-998047744,-373282046,1996423342,-532247074,-6664170,-1962934017,1174659142,30712808,-1545058677,1183515568,40805354,-1193380097,726663177,922702016,922681988,1347420802,100762,-1303999232,-26032,-998047744,-562626814,1342180024,380782221,44931664,-1924136960,1343664710,1347469355,129178,2109737728,-9180925,39716551,113704960,470,24000255,-1728050504,922701906,922681948,922681706,-6684312,-1560280833,-1073020564,1122567029,1547108351,1354771202,132506,-565802240,-1017256565,-2081649835,120382,1048785013,1962934878,74907411,1342180280,1347469355,-1706012592,734,39597823,1342177720,16777114,1815543552,-26111,1996423168,-26108,-443875328,1478411101,-1957345904,-661774612,-401150845,1183448530,1975520244,14608643,571472,38640208,1183383552,-193527824,1342180024,16777114,-364476160,-737244263,-1980107007,-1072957370,1191117685,-1774780424,62691841,1183383552,-296318484,16139975,-947983616,64070,15877831,-1589581056,1178141030,-12550666,922743926,1996423790,-330920966,99505803,1347551243,99370635,1347551243,16777114,-6664192,-1593835265,1174471124,-330923014,-163119308,-1947056385,1178204230,-4686606]},{"sector":13,"data":[28898422,-1070903296,1347440720,-26032,1183383552,2109737980,-1511501815,46433030,1048777451,1962934742,23503115,2113291833,-8918781,26621695,16777114,-193528064,-2080455192,-310181180,535137026,516640093,1430622296,-1910575989,-1091796520,-1202301184,-1202716606,1385759171,-26032,-2037841920,-1072955530,314052469,-6664192,-2097151745,-202833212,8697858,-2085072866,-1202708992,12189700,726684224,-1202696000,787939368,1346372194,-150991944,1342280238,39597823,-11485141,1342271030,-26032,1183383552,1975520194,1991704331,61905663,-1494548480,-1979949592,201293446,-15960640,-1694533962,65535,-16608791,-1694533962,65535,-1986771319,683185750,1848571648,-1556070398,196608462,-735119616,-737803519,328961,-16686941,-1191215434,-1706033147,65535,103586384,1183383552,2125922298,-25857,1183383552,1921435544,-2097151745,1963001470,1975520091,138314515,208928773,1342186680,337818,46433024,40908543,1342504632,1342430392,-11485141,-1224763274,317259646,214205186,-8472833,1342177720,1347469355,-1706012592,1514,201082505,-385647424,-397409880,-998046420,27191554,-8472833,1342179512,296602,1954973952,2125922303,702719,37657168,-2037841920,-1952841876,50421774,-150875122,-1840870919,58048523,-946714881,36934,-956214039,50246,-8747321,367591424,105286401,2089829945,18278659,956307617,1685360710,26621695]},{"sector":14,"data":[158362,1854310656,1888913919,3455231,26242807,-1946194298,-1946194298,-1912639338,-259275138,-1910634730,1751514,-14703118,-1711172042,1559,-6916353,1183683702,1183666306,-6663994,-2097151745,-1073018684,297286005,-2053484544,-2097151995,736821956,-1094287731,118883292,-234874183,-2105635419,-1190854978,-1510866937,40908543,-6916353,-1011313546,-6664191,-16776961,1996472950,-1804140650,16777114,-1736539392,-2095221504,1946193022,1925088023,276103423,-9271553,1342186680,481434,46433024,-1916635393,-1924103610,-11483578,1996473462,2125922200,11528447,-1592998781,1178140696,-2096204656,1946193022,-1938358520,16777114,23109888,30672387,-3914239,-2030071738,1183580026,2055616914,-385647105,-1224737057,28901246,-1070903296,1347440720,22911568,1183383552,2109737980,-26547965,30817923,-1962183424,1178142278,-385647216,1996488353,34511554,-1224802304,161152886,-16777213,-1694533962,922,-8472833,-1694861569,1764,-8472833,-2080661016,2122515140,141820056,-1701284097,273,-310157474,535137026,1439386973,-326898549,1996445248,112644,-26032,1996423168,112644,61907280,-775804007,138806264,1183535168,722186,1183535134,722186,2056933406,1342177281,177050,207522560,688003,-722926731,108954368,-385649408,1996423371,-26108,1183383552,74907624,1342177720,50873995,84005894,-1588592636,1346896334,50873995]},{"sector":15,"data":[1208049670,-26032,1996423168,207522566,-1710589953,1894,-1946270071,931859550,-1962641665,787940423,-1952906642,-150838770,1200312569,-735119610,244029697,-101252718,50873859,84005894,-1588592636,-285801874,1645120409,1358558978,-150845557,-1727933394,26349195,-11470345,-1070922122,-11120560,548930167,13416960,-6664110,184549631,-1207142976,-1706033135,282,-16595837,1996424822,-25858,1996423168,-394854652,16777114,61907200,-775804007,138806264,30672387,-1996487675,1996487750,67811342,1354771280,-1113960368,-1996488697,1187510854,-352321302,-1069103553,-1052326360,242679552,1342444728,-1914013953,1343668294,16777114,-330921728,-1207666945,-11534335,1183710326,-11528512,-1852117898,-1593835514,1174471124,-364445700,972703371,-1182995898,721712895,1996443840,-835256568,138840833,23070211,136354384,1988820992,-734657784,74907393,-1924087765,-11534012,-1929261514,-1706032572,2110,50886283,-16657354,-1070922634,54824272,-835256496,71601409,-26032,-1956773888,516120037,1430622296,-1910575989,351044568,1183663339,726669036,1347440832,1342177720,16777114,1958742784,1816036148,309592065,23869183,384583309,-26032,-1073020928,1183650933,-1706027284,65535,384583309,-26032,1048772608,1946157526,-700546123,91553793,-352321096,-2084558078,-443874579,-900899553,1478361092,-1957345904,-661774612,-1962349437,272436294,1027044353]},{"sector":16,"data":[192151825,1963005501,9824515,-956258583,16897542,1547108096,112642,30251600,1996423168,101620238,113704960,364,-385875528,1996423297,1354771214,16777114,70165248,53493376,-1204063232,1344144176,428954,53413120,-335919479,-94467309,1183319946,1952201976,1949973518,-95486198,821722753,-1674493,1996487238,309262,-96040112,1996425963,309262,24295504,-6664162,-16776961,-6680970,-352321281,775356303,-262096892,112720,-26032,2078867456,-2084557825,-443874579,-900899553,-1957363702,1577502700,-150994686,1073742918,1183526772,-312060,-63105932,1025340671,92078077,2130705981,2209816,649593835,563761152,-2097151996,99287748,-352311368,1575324656,-1873273149,-326412987,-2082959842,1048779500,1970536468,1882652448,108954370,-1207601807,65733376,1342374328,1347469355,185965136,-504823808,138314496,57999365,-16721943,-1711121354,2868,58048523,-1711224855,65535,-1996158815,2122576966,1031107078,964688,-431583920,1570394134,-1929379829,-11475386,-402323402,-998047237,84452100,2071314443,-1544272245,314049800,630870016,-2097151989,1187447492,-352321292,-163148446,922701846,922682626,-23001852,33948420,77680645,393989,-1600499707,-1929379829,1343682118,1342177720,-26032,922681344,1183646320,-1202710794,-1706033151,2994,84412103,243269632,-1593703450,100860540,-2136800878,41591042,39978499]},{"sector":17,"data":[-2096988509,1946219646,178188,-193527984,16777114,205298176,-310181888,535137026,516640093,1430622296,-1910575989,451707864,1326723,-14125708,-1207799754,726663938,1347440832,497562,1958873856,18934019,1342182840,799898,46433024,-16707095,-1711121354,65535,58048523,-1207893527,-1706033150,65535,200558217,-385649216,-1202716451,-1924136946,1343678022,16777114,-431584000,-193527984,-2097094936,1183384772,1975520244,1226758,-2097104919,329790,1183661428,-11528458,-16448970,-1593506762,100861182,-1588591358,100861188,-1706031872,3090,40908543,385238669,112720,203725392,922681344,-90569464,-1962934260,-22812602,-364475644,-150667101,111406190,41591045,-1593507165,77791868,-196703483,721750179,-258322240,-16777205,-1711116234,2411,385238669,37158736,70713093,83796229,84018691,84189520,83887619,-26032,922681344,1183646320,-1202710794,-1706033151,65535,65408640,-1207112958,-1706033118,2499,-1711094653,65535,-1962742397,1297948645,-326412853,-955716477,64582,16402119,-28915968,922681344,-6684068,-1996488449,-1705969594,3191,-375159,-23398282,-1996488701,922746438,1996423772,-25864,2122514432,1936982266,16678531,1996451188,74907642,837786,1958742784,106859358,-16615425,28836983,726683648,-1706012480,65535,201082505,-12553024,-1705968010,1010,645185547]}],[{"sector":1,"data":[738096895,-1957670720,2013202014,74972930,1358591743,2144336,1375784122,-26032,-1073020928,1996426613,218995452,1187446784,-2097151748,1946221182,-92864760,859034,-25263360,-16223232,-1181024650,-1962934267,-443810746,1478411101,-1957345904,-661774612,1443949699,1023952523,57999872,1023473641,141820417,1946288701,31189337,503478968,242679632,-1710459137,65535,58048523,-16661271,-6683018,-16776961,1183647350,-1706027274,65535,737822347,-1560124922,1183515570,-1845089284,62169857,68421319,1183514625,240552716,-1996236637,-385623530,1048772997,1962935316,24897795,16777114,84189440,41682489,44108149,2047228165,-1923189758,1343682118,84031231,84162303,50660001,1342504454,50660513,1342504966,1014170,41591040,-1593507165,77791868,1882652421,-163148542,28856342,295325696,-16777202,-1207799754,1344143994,1342177720,700570,138314496,91488261,65408640,84058370,-1593583453,-626850556,335988483,-385875964,1048772849,1962935316,15198467,51136139,721582598,-1996236794,-1298009018,-196724477,103484030,100860538,451609560,39990923,41825835,41563651,2113173049,64528652,41551403,1183434243,239504140,41682435,64620075,-1577826679,1178141620,722108148,50494470,-352069114,-1841919206,-2143933695,2083914498,-193578750,-626979715,2080779011,-1983511806,-660533690,205928707,-626980747,239483139,922705268,-1432747408]},{"sector":2,"data":[-1996488689,2058940998,1996443650,-401698574,-998047506,41596932,1183535134,-670684404,1183535107,-637129970,-6664189,-1962934017,1451953222,64529166,64624265,1342339768,-1863158017,12118030,-16464765,-16617418,-929369482,1577058319,-1962742397,1297948645,-1873273141,-326412987,-2082959842,329790,2058886772,-11526654,-16448970,-1593506762,100861186,-1588591362,100861188,401278208,503478968,374864,1654739024,328962,26386768,1342178565,692122,2091008,-1962742397,1297948645,-1873273141,-326412987,-388461026,-310181879,535137026,1439386973,-326898549,1882652418,207854082,1183383552,41597182,-25755824,333975184,79987456,40908543,-1694599425,3206,-1017256565,1167087646,518818645,-326903666,108461834,30422783,826778,140413696,-1962653813,-129070833,1183433003,105352182,-1996337269,-1054082482,-244087,1996424822,1996444152,112886,4831312,1375754938,272865872,1586167808,105351944,-96040632,-16353537,-11470730,28898934,1236815872,5945856,1738166354,-1962934256,1200293982,-96040702,-16353537,-1202653066,-11534335,1236860022,5945856,-1936043950,-1962934256,1200293982,1183401988,108462072,-92864688,1342177720,-1191414017,1522139209,-1706012160,65535,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-1588197652,1183384186,41722362,-1946401143,624756294,1026716672,259260454,1946167101,2637104,-1070916748,-1593784599]},{"sector":3,"data":[1177092498,2603260,39988983,1983508619,-350585094,26386729,-335788543,40018408,-335919575,40018400,-335919615,1647741912,2117479170,2050360066,-92915454,1988690813,702714,26357495,1983508619,-1961787396,721523254,50495542,956464182,58588278,-1577290103,1178141306,-1593281030,1178141308,-11897604,-1207799754,1344143994,1342177720,1149338,-96040192,-1962605917,77855814,41596933,1183535134,2047224826,1183535106,2080779260,-73773054,-16777202,-1207799754,1344143994,1342177720,917402,-435257344,28836355,-310157824,535137026,1003179357,1660945152,201391882,1694565120,1828717320,33620736,1862271754,-1946090752,1895826184,-1778318592,1912603400,1644233472,33554950,385876736,469827333,1359020800,2097152785,1711276800,503381761,973144832,251658499,536937216,285212934,-788462848,301990148,67175168,318767365,402719488,-1996487926,-436141312,-1979710710,604046080,-1962933494,-520027392,-1929379062,-704576768,369099270,1140916992,-1912601845,1728119552,301990669,33620736,452985352,-1392442624,318767885,503382784,486539792,-1375665408,503316998,-419364096,369099531,-687799552,553648647,-301923584,570425868,1258357504,587203079,2113995520,-1694498039,218170112,-1677720823,1409352448,637534724,1895891712,654311943,1946223360,553648909,-301923584,570426120,1459684096,603980549,-452918528,754975247,1694565120,620757765,-1207893248,805306892]},{"sector":4,"data":[-1979645184,687866627,553714432,973078784,1812005632,872415756,-67042560,889192960,-167705856,889193224,1140916992,1140851206,-1157561600,1157628427,-822017280,1107297038,587268864,1140851471,1963000576,1342177796,-520027392,1207960333,553714432,1509949705,1057030912,1375732234,1476461312,1275069197,1996555008,1291846417,-1644100864,1308623626,-335478016,1459618307,788595456,1560281601,-1224670464,1493172993,2113995520,1509950216,1661010688,1543504649,1937009920,1167087646,518818645,-327034738,1187446930,-1962934022,272436294,1023898625,1249116433,1996450027,768014,3717200,1150963742,-16777215,196611702,364400640,-2135404540,-1070903296,-6664112,-16776961,1052249718,-1202708992,-1202716660,-1202716662,-1706016752,302,-385875528,1183515286,81162,37559668,-385649408,188547335,-385649408,205324911,-385649408,-1070923515,-16616983,28839542,-1332064256,1342177280,16777114,1975520000,13756675,-1207011585,-1706033141,426,28351056,117768192,-62486272,1342193848,-1694730497,450,200951433,-385649216,1996423331,768014,-96040112,1996443678,31496956,-2037579776,1343684466,519718539,44866128,28835840,-2037559296,-397344910,-998047227,1921420548,-1847045889,46433026,863289355,-1928431873,385839750,833616,702544,1074837584,48470608,-1073020928,1996428660,768014,1921420624,-1706027265,702,738138601,1996443840,28829946]},{"sector":5,"data":[-16464765,1172896374,46433026,192200715,-1705983957,65535,-1946225175,1344207430,16777114,242679552,-335907073,242679558,-1705983957,65535,-1946233367,20777030,1024160768,57999362,-385798423,1996488386,768014,-26032,-1706033152,65535,-1191426423,-11534272,1996487750,-25860,1183383552,1975520250,-23795453,-1207011585,-1957691381,1344207430,-1694730497,65535,-1928431873,385839750,833616,-26032,-1073020928,-1276574859,1921420544,-1706027265,529,-1947056503,1344207430,204954,-163149568,-1980086781,-661916602,1948925824,977240069,28837237,721611520,1887865280,-96039937,1995720249,-1957683645,1344205894,208282,-196704000,126539915,-9533816,74721852,108347196,-9402681,1586167809,-2012771596,1023372934,1006924892,-1950190278,1344205894,16777114,-196704000,-9388413,-1961724928,-1903300026,-1056702606,1347605132,-336312693,-230257904,-9269619,-762527485,1152929874,-1706025472,920,-1207011585,-1924136949,385839750,-26032,1996423168,-25862,-1746337792,242679805,-9271667,213405718,179851264,280514560,-6664128,184549631,-385649216,1172962721,142016510,-401705217,-998046999,-43718396,-1962742397,1297948645,1426066122,-326898549,-950642934,64070,503596683,-1706025392,65535,66471561,1344144454,230042,-1947170048,977043710,1015026036,-2146208466,1966014332,-159481075,-955812606,63558,1015036139]},{"sector":6,"data":[-955812516,129094,2122525931,74711046,65781803,-1996488008,2117728326,-2145946876,611593789,503596683,516393808,-26032,-125108224,1150149867,-1957683711,1275459654,-1706025472,65535,-443850914,-1957313699,1988843244,-2146374908,91499068,1967078528,112645,-2142893845,-344653764,-1956724693,516120037,1430622296,-1910575989,-1930657320,1183536640,17841420,289213300,-385649407,15270123,242679553,1347469355,702544,1354771280,24730,809402368,57999363,-16732183,179834486,-2037559296,1343684476,1342210232,345242,-62486272,-1165954933,1952251771,2088945168,1191140607,-59339780,-8617274,1988544256,-1207750401,-397409488,-998047420,2022082818,2089192959,1954974207,2022083583,1988508159,-1961987073,-1946192226,-1962969930,1946630148,1956547373,4161791,-2037708171,-2043019400,108265334,-9009465,1996423984,768014,1988528976,-1706025217,1663,-2037698069,1344208758,307354,1988528384,1954974719,-1706025217,1493,1996463083,112654,83270224,726663168,395989184,-1207959546,-1377239039,172395264,1946157373,146709,-2031549579,736512,-2031549579,-373282048,1996423312,112654,84712016,-1706033152,157,-948649973,-1207011585,-1706033141,1525,11967056,67436544,-62486272,1342193848,-243969,-929366922,-1996488704,201292422,-14322496,196611702,-2037690368,1344208762,-1694730497,230,-8734977,-8734977,16777114]},{"sector":7,"data":[79987456,-15829249,-1694532938,1692,-39703,-1070920074,-988336,1996425334,7071758,-385563517,-2090926259,-443874579,-900899553,-1957363702,82609132,503596683,-1706025392,516,503596547,96049744,1183383552,71732222,1996375609,-1957683669,1344208454,148890,-28931840,126539915,1023166088,1006924892,-1948617414,1344208454,162202,-28931840,-1946270069,1438866917,2122443915,1963130886,74907438,1342177720,393882,1996443648,768004,125016656,-1202716672,726663182,1347440832,16777114,-6664192,-1962934017,516120037,1430622296,-1910575989,787252184,209617238,1416954128,1355957901,23475967,-2097122840,1183384772,1715373052,125108481,100288199,-955913472,326214,24000255,-1946519809,1116601462,-1202710830,-970260440,-26032,1996423168,309262,-767128240,1738166294,-1207959545,485163009,286031489,-2095876863,1963002494,242679565,-1705983957,392,-1070865941,49120094,1562371467,707149,-2081649835,-1957296404,1183385158,71732218,179950123,-2131626240,1586180290,-96010246,1183520648,-137221372,71731697,-579354613,737822347,1183385158,-94467074,-956674305,485163015,-1979294069,-62486521,-1962522881,76216950,-561313912,-1963307265,126417990,972703371,-596507066,1593722507,-1017256565,1167087646,518818645,-326903666,205949734,1946226749,17906951,2028693620,1023568545,292814851,1946159165,736570,1187462260,-352300070]},{"sector":8,"data":[-632895739,1996424167,309262,-632911024,798642206,-16777216,79171190,-1751494656,1342177280,16777114,112640,-956263191,50911814,1183699179,-632911394,1342185144,1356744333,-605548912,79987464,1187494123,-1962934052,20777542,1024029696,1433665538,1609285675,-1207011585,-1706033148,2157,181836368,1183383552,1975520252,1782481678,125043458,40517251,-1205177083,-11534272,1996487750,184195836,1183383552,1958743004,242679572,1342178488,517752459,-59310256,726426,242679552,-1696827649,2848,-2080413975,-443874579,-900899553,1478361098,-1957345904,-661774612,-1958417277,272436294,1024291841,57999633,721532137,53406144,1342187704,1356088973,669519504,79987464,-1207011585,-1924136956,1343673414,300186,242679552,1342180280,648090,28856320,-1070903292,-733573808,-1734717418,721420293,735087570,-1706011968,1553,4865667,-385649664,-1632108319,-1202708992,1344143445,503338168,-1069118128,683167766,-6664192,184549631,-385649216,1183645885,-1102673472,2122321899,359935164,549224064,1191120756,-1101100098,1183319946,1975519932,-1101100059,1946173312,-1102643450,-1929377850,1343668294,503339960,-26032,-1073020928,113706612,192,-1967235445,-1136228345,74722364,91562044,-339851521,-1101100053,1183319946,1951415484,1970289668,-1039743215,-352321536,-1132560375,-15764436,1586216518,-2012771650,-1073038266,1586228085,-2012771650,742177862]},{"sector":9,"data":[540804212,1191118197,-1947472962,126533214,1018971784,1006924870,-955878074,16827398,1241958144,-16776960,112725622,129519616,1048793088,1946157250,440325,129500139,-1214623744,-16777207,163057270,179851264,1048793088,1946157248,636933,179831787,-677752832,-16777207,213388918,230182912,1048793088,1946157252,833541,230163435,1318735872,-16777205,79171190,-795193344,1342177290,489882,112640,-956203031,53830,755648139,205324289,-385649152,-1073480135,-1476448621,1996426069,440334,171547216,1183383552,12755408,1959806521,1241958150,-1962934272,-1029451706,242679552,1342179768,679066,-800683776,956350625,108318790,4851399,1183514624,12624848,-1207011585,-1706033140,65535,-1580185975,1178140868,-955878192,18950,-800683264,-2097101661,19006,1183664757,-1202710848,1344143456,63130,-1069645056,74711040,834881222,12729987,-972786688,-2091596474,50238,1187382388,-1632090425,-1202708992,1344143465,381699725,-26032,113704960,65610,-1207011585,-1706033148,1214,85105232,1183383552,1975520252,1782481678,125043458,40517251,-1205177083,-11534272,1996487750,86481660,1183383552,1958742994,242679572,1342178488,517097099,-59310256,268698,242679552,-1697483009,1376,-80151,112725622,129519616,-15275264,163057270,179851264,-16061696,213388918,230182912,1996443648,-26102,-1729560576]},{"sector":10,"data":[420089598,1057505035,654851848,1057695499,856371976,1057505035,-385138933,-310116741,535137026,181030237,-1873273344,-326412987,-2116514274,-16737044,-1711172042,3407,-10058103,-9922935,-150981448,50337838,-1946196346,100624534,1183383604,-195655182,32523975,10938624,66078347,989861894,1963025926,1720093454,1754696703,-230258177,-1946921335,1452012102,722420,-1980086647,1187511382,-2097151762,2099834494,-94452630,4161574,-1014275724,1183433356,-329872918,-1996077429,1586231366,4161784,1589916020,1065363178,640185344,-467007606,1347537195,801178,-128021760,-316010614,1364382251,-10189175,900762,1686518272,-1961855745,1065416798,-14519296,1191180870,-6755346,1191180358,-2085622806,-13307322,1721888838,-263833343,1340670847,-1774780417,240556545,1721827328,-263833343,1183524479,403047408,-163149568,956393121,58521158,-637399,922744438,-40239080,-2097151986,1609237700,24000255,1342185400,-9795955,-2135404522,1855606784,-1929379834,385837702,9222224,-677752802,-1929379828,385837702,105286480,-409317346,-1929379828,385837702,9353296,-6664162,-16776961,-1929225162,385837702,62437456,817385502,1150963712,-2097151987,-443874579,-884122337,1167087646,518818645,-327034738,1448542434,1342194360,-1727937608,-6664110,-1996488449,-1072976826,922687861,-1732771236,726670849,-1202696000,-1706033104,65535,-16571671,664448118,-1996488690]},{"sector":11,"data":[1451868230,-1337538622,922681344,1347551856,1342292920,16777114,1882652416,67155970,1354771280,999968848,-1962934257,-1505326654,-1996482399,-1946213242,1174644294,-1034515520,-14645623,-14510455,1187469035,-1962735420,-1983738685,1451869766,-1000436792,1946173312,705137192,1372138468,231971408,1589903360,260712134,-768873174,-2037821102,-1181024482,973078542,1962876550,-1000436981,1962950528,16312587,-3913985,-1108621754,-14645505,-14639420,4161574,-2030067595,1721892644,612776193,-955877889,16721030,-1371093248,1721827328,1178159105,-385647442,922681673,-6684266,-1996488449,1451862086,3455146,-14373129,-1951906303,1451993158,-897675862,118943883,-1176859106,-1510866918,-1774780641,-26111,1996423168,-1065943102,1353860749,1355433613,16777114,147096320,12353155,1996425332,-25924,1183514624,-1034515520,-14645623,-14510455,-14639420,4161574,-1175911563,-1001994496,-1014299896,1183433356,-933852730,-2134614389,678690879,-467007606,1347537195,970394,-966867968,705661478,1389505517,512133457,24484607,-2043019264,1786052382,-2134614389,1802829887,28329671,-1333886208,-385649408,413204752,612776192,-15436545,1358898358,16777114,79987456,58048523,-120855,-1207799754,726664193,146297024,-1706025469,2175,-14643573,62934571,-1948570680,-1949750311,738140294,-930365370,-1936043693,-385875960,1191117083,-968425532,-41495,-369155962,-2030043334]},{"sector":12,"data":[1721892644,612776193,-955877889,16721030,-1371078912,-87063,-16617418,1996472950,29604032,225024592,1183514624,-1034515520,-14645623,-14510455,-14639420,4161574,1290339189,734235647,1178320966,-385647450,1187512127,-1962735420,-1983738685,1451869766,-1000436792,1946173312,705137192,1372138468,266050128,1589903360,260712134,-768873174,-2037821102,630914846,973078540,1962876550,-1000436981,1962950528,-17766133,-3913985,-1108621754,-14645505,922717931,532152686,-2037559296,1343684390,1342210232,833434,646352128,-1202710785,1344143504,1061274,646352128,-1202710785,1344144136,1065370,646352128,-1202710785,1344143506,837530,1547108096,646352130,-1202710785,1344144312,1342189752,851866,-1401487616,815770,-1401487616,16777114,-2090902016,-443874579,-884122337,1167087646,518818645,-326903666,1187468818,-16776972,-1207799754,726664192,1347440832,883610,-263812864,1005737609,-12749360,-1711172042,4357,884525195,-136672512,50337838,-162625080,-500087,1996425334,-1950250234,722387,-1326952366,147096320,-768375,-1711172042,4451,16023171,-2098658444,4372480,29603920,-1706012007,3367,200165001,1349285056,757914,-96040704,-239991,1375891510,29603920,259693136,1183514624,-230278672,1996432500,-92864516,-1946532349,1347615830,1202586,-230257920,-661925333,-990880213,-970524042,1996423168,108461832,-231681]},{"sector":13,"data":[753465974,147096320,-768375,1637543542,-16777200,1771761270,-2097151984,1962996862,106859270,1577060294,-1962742397,1297948645,-326412853,-1961956221,1451951174,-62486266,-369207671,1183514772,-129595128,-1030962293,-1980610935,1183577174,138816504,2097825339,-228670368,653412095,1183319946,1965898998,-96024817,1586167809,-129564680,-689240184,821460608,2122319484,612252150,1089896064,2122325620,410266870,687242880,2122322548,208939510,720797312,2122319476,192226294,-500085,1183512646,-1950225418,130480222,-92372224,-1961856000,1177286726,343304,28837246,-15602944,1589967942,1065363196,-385649664,-1070858400,-1017256565,1167087646,518818645,-327034738,1183645878,-1202710796,1344143558,1273754,-1069645056,74711040,838289094,385107597,16824400,-6664112,-1996488449,-1072981434,1357448061,-2065149951,46433025,-1919256833,1343659078,1226138,108461824,1342197944,-11893107,40953936,-1996045181,619442758,-1919256833,1343659078,1243546,-1703477504,-1705983957,4812,-1197836545,-1706033151,4912,-1919256833,385829510,-227082416,1279642,2126514944,318675655,1183383552,-61437446,-1919256833,1343659078,1283994,-26112,1177223168,-61465606,377278987,-1203960449,-1206946293,-1706033117,65535,-385694589,2122514597,-931856225,-1197836545,-1706033151,5026,24000255,1342180024,-11893107,1354256406,-459649024,-16777197,-1929225162,385829510]},{"sector":14,"data":[9746512,565727262,-56995840,-1929379821,385829510,13350992,1083854878,-973078508,234835590,-1919256833,385829510,374864,-26032,-1073020928,1996433023,-1673097830,-1113960426,-16777197,-1070884234,330209872,1996423168,112794,-26032,-991232000,-1919256833,1343659078,16777114,-1619098880,-1215232,-6645130,-352321281,1849098031,1095681,1250331984,-1202710785,-1706033072,4113,39597823,-11893107,-1799860202,-1202708992,-1706033104,4185,-1962742397,1297948645,-326412853,-12391293,1183646838,-1706027290,65535,-385649344,1048772846,1946157252,-414791929,99288240,753354439,-532247295,-793227242,-1706025472,2697,67389066,-481916879,503374008,-532247216,-692563946,-1924129280,1343668806,1342185144,570266,-1035563776,-339720567,-1099005943,-15764436,1586217030,-2012771648,-1073037754,1586228085,-2012771648,742178374,540804212,1191118197,-1947472960,126533726,1019102856,704935278,-2146636864,1970257534,-352210940,-2013089790,2122377798,57934014,-1950333185,126533726,1019102856,1022456876,1022194720,-1341885128,-1341986040,-381253625,12484224,1191117684,-1067545664,1183319946,1949056190,1948269809,1966226669,-352145404,-2000672254,1183705926,-1706027290,65535,-1017256565,-2081649835,-1923720980,1343663174,503375544,370448976,1183645696,-62486100,1191117803,-60912644,1962950528,-1036090379,74711040,48977072,1586188464,-62455812,1183516552]},{"sector":15,"data":[-28931832,2122342891,108802218,967474816,2122336894,1148464298,598376064,2122333812,947137194,1084915328,1586175349,-62455812,-1960048698,1191181406,738707196,-237941,130481222,-2145326292,1951443582,-1434550266,-1961593516,1191181406,1141360380,-237941,1183513670,-1962440534,1191181918,-2012771586,-1073042874,1586204789,-62455812,-1959065658,1191181406,218613500,-956539253,1183645703,-1706027348,3868,-1951906167,-986973114,989877253,226362950,-972654965,-1962890174,1183385158,71732136,1183666206,-1706027348,4405,1588086411,-1017256565,16973870,196968,196712,16716568,196620,16713041,16973837,200857,16973935,67562,16973829,66246,196615,16715369,16973852,69880,16973839,201567,16973825,69995,16973841,69804,196626,16714907,16973859,69856,16973843,201446,16973839,199145,16973846,197831,16973858,197884,16973859,200986,16973860,198598,16973862,70757,16973882,68286,16973883,201543,16974000,66721,16973901,134778,16973893,66978,16973902,69574,16973903,67834,16973911,70950,16973912,201331,16974024,69665,16973913,201996,16974025,71144,16973914,201752,16974026,201361,16974027,201437,16974029,201675,16974031,201408,16974039,198672,16973912]},{"sector":16,"data":[198592,16973915,198753,16973916,198661,16973917,199063,16973920,199190,16973922,197106,16973923,197625,16973924,196679,1953300581,0,5,0,0,141,116,1196228608,67,4409165,1146241838,1146241792,1196228608,67,4477507,1380134442,774504516,4477507,1380134442,68,1127098972,17490,1685015808,1124101477,3231055,843927363,1395413036,1685015808,28005,1059192866,0,539828224,0,0,1953064005,0,2228258,2228258,1685217603,1701603686,1767309312,2003788910,1698955379,1701013878,0,1682243584,1140880489,1280332617,22849,65537,1329790977,1090531917,3164244,827150147,808648762,745417776,3222584,1953656656,1413546099,68,0,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,41943040,44040856,1953301228,1819506547,1668115310,257,4194304,524352,-65536,-1,-1,-1,-1,-1,-1,-1,-1,240,-65536,240,-65536,240,-65536,240,-65536,240,-65536,240,-65536]},{"sector":17,"data":[240,-65536,240,-251723776,0,-251723776,0,-251723776,0,-251723776,0,-251723776,0,-251723776,0,-251723776,0,-251723776,0,16515072,0,16515072,0,16515072,0,16515072,0,16515072,0,16515072,0,16515072,0,16515072,0,0,0,0,0,0,0,0,0,0,0,256,0,256,0,256,0,256,0,768,0,768,0,768,0,768,0,1792,0,1792,0,1792,0,1792,0,3840,0,3840,0,3840,0,3840,0,7936,0,7936,0,7936,0,7936,0,16128,0,16128,0,16128,0,16128,0,32512,0,32512,0,32512,0,-33024,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-256,61695,-256,61695]}],[{"sector":1,"data":[-256,61695,-256,61695,0,0,0,0,0,0,0,16777216,-1,16810239,-1,16810239,-1,16810239,-1,33023,0,0,0,0,0,0,0,2130706432,-1,2130706686,-1,2130706686,-1,2130706686,-1,254,0,0,0,0,0,0,0,-12648448,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,-12648196,-1,252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,1818838544,1694498917,2003127808,6684672,1852141647,3026478,1392535296,6649441,1392535552,543520353,774796097,1761607726,1769099264,29806,1917845610,544501353,7105601,1291873152,1701278309,3026478]},{"sector":2,"data":[1768178960,1979711604,1684952320,1750272367,1668498735,7274496,1701080649,774778488,3556873,1124102400,1141470325,27749,1866662002,1175026032,1929379890,1935757312,1225352564,29550,1699872880,1919906931,101,1946681344,2019906560,1971322996,1667846144,1701999988,1767247872,30565,1631781005,158557298,-2147468986,1766588558,1175024755,268447793,1685217603,7929856,778331201,1175006766,2046820407,1818575872,157643877,14406,1967390843,1667853424,6648929,1090550912,1685025909,778854761,1175006766,1401946165,1668440421,-2097151896,544163584,774795092,877005102,8650752,1684957510,3026478,1174439296,543452777,1954047310,3360265,2004055149,1802398835,-1874853888,167774726,1442878464,0,131118,786532,8388619,-8302461,67108864,1174410240,201340928,-1560280320,16745296,5701632,3276840,65550,1342373889,1919241600,25959,3801175,917554,2,1132482563,1701015137,1308622956,1006638080,167775232,33554432,33360,131074,786472,196607,1182945282,1852140649,979725665,1953300480,-1874853888,167774726,1442878976,0,131118,786532,8388619,8474755,335545344,939542016,50334720,-2091867392,5701632,3276840,65550,1342373889,1701859200,1459617902,838875648,33558016,50331648,1631813712,1818583918,5111808,3932180,655372,1342308352,33554562]},{"sector":3,"data":[671089152,-16774144,33555199,1766228560,1634624876,3827053,1937009920,1852601207,-1874853888,419436805,788571648,0,983052,786536,8388619,8474755,33557504,201341952,16776960,-2108685824,1702256979,1818846752,1935745125,1342177338,1207960064,167775232,33554944,33360,917624,917539,65537,1400918019,6649441,536901632,234889984,512,-2142240000,1668178243,27749,2004055149,-1874853888,419436804,738253824,0,524292,524332,131075,1233276930,2019910766,1852394528,14949,393268,786596,4,8474755,402668544,234891264,16777472,-2142240000,27471,1572984,917544,2,1132482563,1701015137,1828716652,1937208180,1835757164,-1874853888,419436804,738246656,0,524292,524304,131075,1099059202,3826788,100669440,201368576,1024,-2125430016,3014656,2621464,65550,1342373889,7032704,402680320,234891264,512,-2142240000,1668178243,27749,-1874853888,419436813,1543553024,0,524292,524308,131075,1149390850,980181353,1835008,10485766,262156,1350762496,67108993,603985920,83888128,33554432,1766097488,1411411041,6647929,369112576,201336832,67110400,-2142240000,1701736276,6946816,2621462,458764,1342177284,1819627648,25971,2621444,524304,8,1350717442,7631471]},{"sector":4,"data":[637548032,201336832,67111168,-2142240000,827150147,6946816,2621478,655372,1342177284,1297040256,67108914,603994112,184551424,33554432,1631748688,1377854581,6648929,905983488,201336832,67111936,-2142240000,808464945,6946816,2621494,851980,1342177284,808465280,3538944,2097224,65550,1342373889,7032704,1207986688,234889216,512,-2142240000,1668178243,27749,2004055149,1802398835,-1874853888,419436804,738224128,0,524292,524312,131075,1199722498,1867784303,536870970,1140852224,67111936,-2097152000,33104,1572871,917544,65537,1333809155,956301419,671094784,33558016,50331648,1631813712,1818583918,1953300480,1819506547,1668115310,1936485226,-1874853888,419436804,738224128,0,524292,524308,131075,1182945282,979660393,1835008,4718598,262156,1350762496,117440641,671094784,16780800,50331904,1800372304,3735552,2621464,131086,1342373888,1851868032,7103843,1937009920,1852601207,1784900971,1685285995,-1874853888,335549448,1711315456,0,327680,524442,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,130946,234881024,134257152,33554176,-2108685824,1685217603,1701603686,1966080,6160418,-65528,1342308353,1919243906,1852795251,808333600,49,-1711264000]},{"sector":5,"data":[-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,1275068416,33593856,67109120,-2108685824,0,10092630,262152,1342308353,1023410306,536886016,16780800,50331904,1800372304,1953300480,1819506547,1668115310,1936485226,-1865940992,335549444,1073764864,1124073472,1717858913,6646889,2883613,917536,65538,1132482563,1701015137,108,1509951488,-16775168,33554943,1699971664,1852400750,103,1509954048,67110912,33554688,33360,1835008,524378,131071,1954697218,1919950959,544501353,1869574259,779249004,1953300480,1819506547,1818575879,543519845,543903510,1663070068,1952540018,1752440933,1768300645,373253484,1702256979,1920295712,1953391986,1634231072,1936025454,1091051578,1953853282,103689774,1918976800,537228132,1685217603,1853171722,1819568500,220816485,1685217603,1701603686,1952539680,1631783009,1768318066,1124623724,1717858913,711289961,1634036816,1881171315,543908713,1948282997,1881171304,1701736296,1327505454,1869881451,1852793632,1970170228,16229,1828716544,1937208180,1835757164,1851867923,544501614,1818323300,1836412448,779248994,1953451555,1869505824,543713141,1869440365,1948285298,1919950959,544501353,1952672112,778400373,1953451538,1869505824,543713141,1869440365,288258418,1819305298,543515489,1936291941,1735289204,1867388192]},{"sector":6,"data":[543236212,1768710518,1768300644,1634624876,573465965,1919248468,1936269413,544173600,1954047348,544106784,543516788,1885957219,1918988130,1309945444,1702109295,1763734648,1702043763,1952671084,590242917,544501582,1970237029,1679845479,543912809,1667330163,1869881445,1986097952,1768300645,841901420,1852727619,1663071343,1952540018,1702109285,1713401965,778398825,1868111904,1633886325,1953459822,1801547040,1751326821,1701277281,1310928499,1696625775,1735749486,1701650536,2037542765,1126178862,543453793,544501614,1702257011,1311452772,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,1702257011,1920295712,1953391986,1918984992,1126641252,1869508193,1886330996,1948282469,544238949,1701603686,1126178862,543453793,544501614,1702257011,1310862948,1696625775,1735749486,1701650536,2037542765,544175136,1684104562,1667854368,1701999988,1867391534,1852121204,1751610735,1835363616,544830063,1914728308,1126198901,1717858913,778398825,1953451542,1981833504,1684630625,1918984992,1768300644,204367212,1852727619,1713402991,543452777,2004055149,1802398835,1802134381,1953451551,1869505824,543713141,1869440365,1948285298,1701978223,1663067233,778334817,1851867917,544501614,1852404336,1411722868,1701995880,544434464,1881173870,1970561897,1763730802,1752440942,1818435685,1868722281,778334817,1701336092,1763730802,1869488243,1685024032,1663069541,1701736047,1684370531]},{"sector":7,"data":[1867389742,1650532468,1948280172,1919950959,544501353,1952672112,1936028277,1631784494,1953459822,1701995296,543519841,1953451547,1869505824,543713141,1869440365,1948285298,1919950959,779382377,1953451551,1869505824,543713141,1802725732,1634759456,1948280163,1919950959,779382377,0,0,1895837185,2949376,1895891059,16806400,8716402,-2097122559,7602432,1962999932,16805632,7929974,2046850817,7864576,2030108813,-2063561216,7733275,2004055149,1633971813,1768300658,422471020,661545283,1701978228,1663067233,1852140641,544366948,1701603686,1833507630,1886351984,1696625253,2037150305,1852404256,1701847143,1685023090,1867387694,543236212,1667592307,543973737,1701669236,1884494126,1718182757,543450473,1701669236,1953459744,1970234912,506356846,1667592275,1701406313,1769218148,1629513069,1634038380,1763735908,1937055854,1124937317,1869508193,1919950964,544501353,1818313483,1633971813,539828338,1868710152,774796405,1867781678,1634541679,1679849838,1936028769,544106784,778400629,1952531469,1936269413,1819633184,537996908,2019906592,1920213108,1633906293,778331508,1769107222,1634625895,1631789164,1684956524,1713402465,342191209,1701601603,1918985326,1634231072,543516526,1701603686,2003136017,1818313504,1633971813,1768300658,25964,0,0,1953451541,1981833504,1684630625,1818846752,1835101797,1310662757,1696625775,1735749486]},{"sector":8,"data":[2513485,17,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":9,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":10,"data":[279886,1179861,190284719,131078,268436480,70684,131072,196610,4194347,10092624,12845246,1255,262146,0,0,0,401801298,401801488,9830910,14155793,-2147287036,1,34078720,-265289663,64,-2147155968,1,38338560,-265289715,32769,-2147090432,1,39190528,-265289720,32769,0,1229734665,1095713360,1124549714,1112557900,17490,1329742085,87125,1229734670,1146241616,1346653783,37965650,65536,786440,1162544640,1279610450,1229211395,1163089156,33489490,81869,1070399744,16899585,654311424,1919117645,1718580079,1767317620,2003788910,1816338547,1868722281,543453793,1819308097,1952539497,7237481,0,0,0,0,1167087646,518818645,2122438798,1963004172,242679569,1342177720,16777114,112640,2122385899,1946226700,-2084557836,-443874579,-900899553,-1957363702,1022133228,209095510,702550,10532944,515395614,2090487808,-2097152000,1946159742,4241474,2013264,20093520,1183383552,1958742998,213407273,1183535104,-1202708778,-1706033122,349,-1957642197,1344198214,503357624,269531216,-26032,-1070923776,1442921705,-2096834072,-1073020220,-1598492556,508567040,-1161811120,1347555580,74907472,6600784,1354771280,1347442256,16777114,-62486272,-26032,1183383552,230183130,-6664192,1342177535]},{"sector":11,"data":[16777114,-629735680,383534733,-26032,1996423168,-629735428,16777114,-431584512,-1962880861,1174658118,13542372,-788475743,13804520,-788476255,-1545023000,1996423380,-25860,279117824,4241408,702544,-26032,1183383552,1975520216,8513795,737965823,-6664000,-1996488449,-1202258362,-1957691381,1344198726,1342180024,16777114,-25755904,1347469355,65517648,151042128,25860688,1996423168,1354771454,517490315,112720,16824400,-26032,1996423168,-25896,-4718592,-17665,-1705619374,65535,-1996438877,-352271338,-1002009324,-6664170,-1929379585,1343669318,16777114,-1002009344,-1070903274,-1706012592,65535,-646594549,1590183563,-1034033781,1478361098,-1957345904,-661774612,1446440067,-1961986421,356322374,-385649408,58589941,1023621865,57999362,1023499497,57999365,1023488489,57999366,1023443945,57999375,1023542249,57999380,-352131095,172395272,1946157373,1996445205,175570700,-16222465,-6683018,-385875713,922682150,28836030,1347590400,-1003028650,-1036583168,-26112,132841472,1064579,721908992,-372102208,278987518,172374272,1183517557,1090310,-352321096,272039912,51230720,175570768,-16222465,-157677962,-385875966,2122515154,-948699126,556675,-1705590411,65535,-1217085429,-26026,-1343553536,1024083595,611581986,155019127,1027896320,292814881,-939564311,64582,1187451883,-352321028,-62470388]},{"sector":12,"data":[99287042,66864839,364402176,1996443649,1354771452,61774416,1793654784,-62470145,535494656,33310407,-1206326528,-1706033136,65535,92127243,-352320840,243715,1459373705,-352250696,2440644,641585012,1033663488,-864813017,1946167357,-17700455,17464963,-2081881228,440304384,57999360,738137321,1347440832,-269986224,180650767,1459553513,1062655,16777114,440304384,225705984,1347469355,-396996528,-998043698,-701038838,-26112,-1070923776,-26032,-756482048,272532478,376700928,1062655,1342376120,-16091393,1996425334,-26106,-1923743744,1343681606,16777114,1183667712,-1202710796,-1706033151,65535,-1543503944,312672278,28857856,-1070903296,6600784,1354771280,264858,28857856,-1070903296,1342182563,1342177720,269210,-1070901760,1689800784,-1070903296,-26032,727056384,413356224,28856320,1033523200,-385875961,-1705574843,65535,58048523,1459501289,382879373,-26032,1996423168,899282,14391888,-1706033152,1313,-1194166529,-1706033147,1127,-6664110,-16776961,146330230,-40218624,1375731716,-26032,1183645696,-396996398,-998046700,1183667716,-1706027310,65535,-2080514839,1963264638,-36443901,1719939,-1961856000,-1070922154,1376405131,179852880,-13702397,1996424822,1139299850,113541889,-2080527127,1963264638,-39589629,1719939,-1961331712,-1070922154,1376405131,246961744,-370651133,147096334]},{"sector":13,"data":[-162583,1996424822,1508398602,-3740926,-1711221194,902,1342178744,361370,-1706012160,1418,-385821021,-1923678887,1343670854,244122,175570688,14038783,57754,175570688,382355085,-701038768,-26112,787021824,16793085,2011759477,17972733,-521600139,18103804,1793655669,18169343,854131573,50871807,887686005,51199486,-135724171,-54138372,49120094,1562371467,707149,-2081649835,95951596,-6664192,1375731967,-26032,-693960704,1354771200,-1719729992,-6664110,-1996488449,1996485702,10532868,-6664162,-1996488449,-1598492090,-62486272,-939630964,63046,65423047,-1983894784,1183447622,71732216,-940554615,-6074,-1423673,-330905601,1187446784,-1560280850,1183645886,-1706027290,65535,-1017256565,-2081649835,-1957292308,-1593830346,103481548,1183383752,105286650,1979712573,19523843,781434883,108242943,13514283,906188779,1374355662,-1728027464,312561746,1347590400,-11485141,1625819254,-397389296,-259321926,1183527915,-838456326,-364476160,956354209,57928262,-2081798519,1963067006,-364475641,65788151,65685131,537586672,1241916934,738609670,2096499462,306086663,75431936,736884267,1193529,915080829,535494674,-768883061,13514487,200038025,-1592757038,-388955954,74895419,13514243,-1578338773,-970260460,200689289,184975296,-142967360,-28931624,1324681,721472673,989906950,327155270,-1207666945]},{"sector":14,"data":[1344143558,1342177720,247962,-15340800,-1070922634,-159973552,503367352,-1706025392,65535,-1710983425,65535,-1207666945,-2091909119,4670,-1070922625,312547819,1347590400,-1728027464,-963948462,-397389159,1347555382,1343213288,1342177720,16777114,-443851264,-1957313699,384599020,406227798,13279488,12977707,-1946401143,71108166,-385649152,-1073544925,-1476448621,908789697,1475018960,13645315,1689801195,1347590400,-1728047455,-1070903214,142016336,1376719592,242018384,871100555,737953419,-1996435450,-794695098,-364496640,1183384435,108954602,-1962445566,-654841274,1183515627,-336591894,1946643978,-1744332793,185039367,-2096661258,5694,-164952961,909716459,108855318,1455755,-963960853,922210859,1451819216,1959922670,13672720,-801380143,906167414,1982529744,1614318,1183434283,2143292408,2109737734,-1982269580,915008582,-895418344,-972674304,-330941696,1996428159,13023236,28856350,-375762944,-352321530,74907413,737703679,-960999232,508567040,117480016,1996423168,118004228,1996423168,1354771204,1443385,379656574,1347590400,-1728027464,-963948462,-397389159,1347555054,1343129320,1342177720,260506,-443851264,-1957313699,-2098429460,-1957275904,76220022,-1161591,-1070922634,-6664112,-2097151745,1946157692,-294191343,503596173,-701038768,87202304,1996423168,-129594108,362434582,-1962934267,100923974,1144717340,-385646842,1183515211]},{"sector":15,"data":[-771357704,-498693888,-1560226655,113704988,26,16777114,-465139456,57982987,-16725271,-1207910858,-1202716657,1344143520,1342185144,657050,-532248320,-1149185,922739318,-1598554084,-11526656,1905975414,-1593835510,100860110,50659540,470155520,-294191360,-1946650881,100923974,53280796,1183535104,-129618948,112720,637008,1375753658,160275024,1996423168,-126418962,66733707,1207966726,-62485680,1358448171,1342177720,-1174402632,1347551317,16777114,13023232,1183666206,-1706027272,65535,16784545,-2097100794,6718,1659437941,-868811007,-902365440,-935919872,-969474304,74907392,-2096527896,1558776516,-599341311,1187446784,-956301176,99910,971261579,58623558,-45847,-6649738,-1996488449,87918662,-15370496,1342225974,378291853,2013264,5216848,854261760,1032341131,57999488,1023463657,141688961,1996522301,15329539,-1920436481,1343654982,1342197688,16777114,-1975088896,1137113227,1187381388,1183645915,-1706027380,65535,-2088089975,1946213502,-2075736524,-2058959316,-294191328,-1935617,-1929372618,1343652934,1342177976,710298,-294191360,377767565,178256,177576528,1174470656,-294191134,378291853,-1971912880,16777114,-565802752,65160843,1317789254,-770823172,1925266176,-125924586,13778435,1994554937,-495023862,16830113,-16770042,1996484214,473366498,-1941533440,1996443670,-25974,1183514624,-498728482]},{"sector":16,"data":[31213255,-953750784,16783878,-1941518848,-1941533440,1337479190,213405696,-974630909,147096328,9207424,837354356,-2042167297,-1191261719,1344143558,-150941023,-727625512,1356396288,16777114,440304384,1970536448,1342177976,-1728044872,-6664110,-1996488449,-1072987578,-1360460939,-6664192,-1996488449,-1979744634,-1039433642,-1696005259,2124334080,-74754305,-234876743,-1014276443,1375732741,71601488,-960999394,-1706025472,65535,-1702725889,65535,-11485141,1996456566,50968580,137291856,-16202621,-6651274,-352321281,-263811758,1150111766,-1202708988,1344143558,752794,13017344,-1947187575,1178202694,-1959756042,1178202182,-1960280332,103543366,100860104,-1957691372,103542854,100860102,-1924136936,-11472826,1996484214,976900,-1710570365,65535,-443850914,-1957313699,250381292,-28915882,1187446785,-1107293962,-1696006114,-1707802880,65535,201082505,-385649216,76218502,1946157885,1029601094,141819905,1946157629,8448279,-15960321,1996487798,108461832,-2096859416,1827342532,-15960321,1996425846,142016508,-402229505,569049202,1342181048,-402229505,-998046720,-11932924,1996426358,-59310326,-16222465,921175670,180650753,-335657335,8469807,209169012,1912603709,343331,485213814,1946190397,8601003,283887988,-1962752381,1325397574,1958743030,-10884861,16678531,230165877,1996443648,61007878,1577370755,-1017256565,-2081649835,1448548588]},{"sector":17,"data":[-16353653,-6683530,-1996488449,-1072957882,-1070922379,-16727319,1996486262,71866888,1996423168,964616,-398029488,-6664170,-2097151745,-16772546,1183520885,-872010772,-939130112,1221376,108904459,1181383,1048772608,1979645974,-364475624,13239851,12977667,184555171,-955875904,5638,71600896,1183384619,105155582,-1996340181,2123103302,176040938,2113830457,-28931323,-947191061,-1946532215,2116807806,-58836724,1183516029,-1962742788,-129594937,-16484609,41221940,1358591743,-624897,1996425846,2144268,1375784122,-26032,1996423168,-25866,28835840,-1956684288,1438866917,-326898549,-1957275868,1149961846,-1996215548,1150024774,38021894,-939899255,63558,-1710721281,2891,-1981135223,-1039405994,-1796668555,-364475647,-595686058,118943883,-1512403426,530949541,142016350,754842,74907392,16777114,-398030592,58048523,-1962842391,121494598,1023769600,1618870280,-1207666945,-1706033148,3653,74907472,1342179512,944282,1996443648,-596181026,-2097070104,1183385796,1975520228,18802947,-1207666945,-1706033146,3701,74907472,1342180024,16777114,1996443648,-596181024,-2097082392,1183385796,1975520254,15657317,1181383,113704960,22,721472161,-1996438010,-861805498,-939119872,-28931840,-16484609,41221940,-16485121,-6683020,-16776961,1996424310,-25892,1996423168,721718020,-1957688762,1177223748,-6664180]}]],[[{"sector":1,"data":[-1962934017,121494598,1028158464,1567883272,1048799723,1979645974,-465138920,13239851,12977667,184555171,-955875904,5638,306086656,-1737097472,738084491,50383878,-1560229882,-1073020910,113739389,18,-2080408087,1946214014,-528579820,-15830016,1996424310,-529072162,16777114,74907392,-1804545,-6619530,-16776961,1183515766,1342450442,722224779,-1706032572,65535,-16484609,-6626698,-1996488449,1996486726,-394854652,16777114,-129594624,-443850914,-1957313699,283935724,-375097,-62470273,1187446784,-956300812,130630,687747,-1293352075,71731968,1023410477,58064903,50373865,-13724736,-955253337,720454,1187462123,-352295682,-196688076,1187447038,-348634882,-196688088,1187449324,-349761282,-196688100,-219479810,-351910261,-888145807,-451948017,-653266673,1729128207,1354771216,-1946257665,1385761350,122480720,-1980742007,1347613270,-11485141,1183577206,1347590408,-1727641973,803754066,-397389305,1174603562,-229239824,-2097151699,1347551450,-1996048664,1451882054,-96039944,972838539,192084054,1178142071,721712886,-1962677312,-443812282,-1957313699,335988716,-956301312,6150,-1103692032,108461824,503357624,2013264,152410704,1996423168,13023236,922701854,-1097203498,-16777208,-1598552970,-1202708992,-1202651137,1344143558,1342185912,16777114,1575324416,-326412861,9104513,1183536727,-1837200122,118943883,-1515870811,731137675]},{"sector":2,"data":[721471494,-835258414,-1806292736,731399819,-768895930,13514487,193484425,-1592363822,-1037369138,-1583856127,1178140876,-1593409896,1177092302,-1807316072,2140685881,26077443,721472161,721470982,-801703982,-28931840,629063691,731399819,-768895930,13514487,193349257,-15565120,-459667338,-1996488691,1451854918,1975651214,899088,74907472,-2080436248,1156121796,-25263359,-955941276,6618694,-7440641,1218088054,50331658,1451985990,-2109306482,-2088479095,-16771522,113706613,22,1195651,-1955170817,1451985990,2122746254,-2141812225,-8747321,-861863936,-939119872,-137221376,-1996435914,-1946190714,1451983430,2122725764,-14781441,1996488310,2125922176,-1706652161,13887568,17351811,-33146,-335578490,2055637974,2089167871,-836306945,1221376,108904459,1181383,-2037710848,653787004,100860110,-861732664,172395264,922210859,1183383758,-1960776816,1325371462,1958742928,-25755873,-7440641,1183681654,1994936474,147096320,-997439999,-2144957346,-680198081,-1986771317,1206618694,-1954396533,1178174550,-12160116,1996488310,-1938358386,1352287885,-2097134360,-2037839676,-1769341066,1996488568,-1837695228,-1920305409,1343658566,154114642,-2037710848,1174536054,13541772,-1953872383,1325368902,1975520134,142016431,920986,-1956684288,1438866917,-326898549,727078666,-1946211338,1183384646,176044538,1589932670,1187416838,-1977165821,-62486521,1958742936,605535]},{"sector":3,"data":[171780980,1024750592,259260429,-1962647925,-670873657,-1996732790,-993334521,-2144991650,108268856,171474982,-347721099,-1714975953,-150992711,-137286663,-162100774,-956054901,2097825339,-163149033,200691455,-1953073984,-947190690,-958921913,-370466809,-768882805,-1070870389,1600046731,-1017256565,-2081649835,45614828,146296832,1347590400,736154,-96040704,1517600779,290167376,1183383552,-27883012,1114948107,-1946394940,-1993996218,1589903943,205949948,105351462,-1946394940,-1993996730,-60898297,638207627,-16496759,-1449461130,721420306,1996443840,74907642,1342376888,-2097147928,1996425412,195009274,-443875328,-1957313699,49054700,16777114,-28931840,309641227,74907472,-16353537,1996425846,43227656,-443875328,50013,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,1040631595,-1996488704,1459630094,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-336926713,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,5255,-1017256565,-1192457387,-1957691328,1861682246,-1097183226,-1962934252,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,5325,-1017256565,736922453,1996443840,6461956,-443875328,-1957313699,74907628,103066,1575324416,-326412861,-1710983425,5430]},{"sector":4,"data":[-1017256565,-2081649835,-1070923028,71732048,-1706012007,4957,-1929492855,735087578,1575324608,-326412861,-16585597,-1097202058,-1996488685,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443874764,-1900297379,-1795456768,1393062656,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1073767055,-1007912629,567095476,-1023392605,4064910,741772070,889239552,512303565,109838386,521011252,-1171980104,567088144,-2079421642,908256000,8783557,-617358708,-2111897802,-385649920,-986251703,-1946121722,244698,-2111897802,-1021372928,855643321,1653077723,74711296,567099060,-1007492541,-387151019,1996423641,27125764,-1017256565,1475119957,-13413546,184960651,-149783104,72780759,-621291273,-1996488675,1451820614,172395268,310231051,1452005367,-136775928,7642,-1995815287,-1073018794,1317738101,105286408,-235417037,1183570059,-1947076860,-1875055661,1317787787,106334984,-788248949,-774254101,198758890,-134973989,871402481,-11513134,1996425846,15525896,1996903995,990409223,58065990,855764611,197561298,-150506241,-2082932774,1583022298,146955615,-326413056,-617392553,184960651,-149783104,72780755,-621291273,-1996488675,1451820614,172395268,310231051,1452004343,-136775928,7642,-1995815287,1317734486,-1948125436]},{"sector":5,"data":[138841080,-503844725,-141100541,-134019482,-963913845,125098763,-654845193,1577114243,146955615,-326413056,1183536723,1975520010,139365142,856049291,-1947076654,71732184,-745803273,-1953481493,140413896,-1962518901,-372177850,-355345455,-921970479,-201853835,-768348021,1996443730,142016266,989862376,125240918,1178273906,-2096925180,-768409106,1532937867,574045,1458342741,-1962260853,-503905202,1183570059,-135230712,-1764097055,50751223,-1949070376,-1034068282,-315490296,-355399965,-85796655,-326412861,-402636056,-469041997,2122320500,74776580,-33274170,840353054,620804096,-1960894003,-486505458,178951,8527615,-1274788213,-1155412660,-75431788,141754516,1528299347,-219462845,9747395,9894785,-11335565,1128487703,1506013931,268501760,1778385667,1057030912,1795162882,-872348928,1811940097,-436141312,1862271763,-1291779328,1895826177,402719488,16777492,-1124007168,1912603393,1996555008,2063598095,1879114496,83886356,-1660878080,100663572,-1409219840,117440788,1526792960,16777732,-603913472,167772436,-905903360,50332174,1442906880,2080375560,922813184,2097152776,-201260288,251658516,-1493105920,2130707208,-1845427456,16777984,1845560064,150995460,251724544,285212949,1778451200,301990163,-1560214784,318767379,1224803072,201327119,654377728,335544597,-553581824,218104334,1090585344,83886868,-1912536320,100664067,1459684096,234881551,604046080]},{"sector":6,"data":[-1996487932,1359020800,419430677,-134151424,-1979710709,1812005632,-1811938801,-855571712,-1946156269,-1090452736,369099278,469828352,-1912601844,989922048,503316756,-184483072,-1895824632,-352255232,-1879047415,822149888,-1845492982,570491648,-1828715775,1761673984,-1795161341,1711342336,486539785,-1308556544,369099522,352387840,503317006,1912668928,-1728052479,-1979645184,553648658,-1442774272,570425869,1191248640,-1677720831,-2063531264,654311951,-889126144,553648904,-1476328704,587203330,-1610546432,855638273,-33488128,754975244,906035968,654312196,-2080308480,671089412,-989789440,687866624,-419364096,872415756,-1694432512,-1392508155,-1425997056,-1375730939,-1845427456,-1342176496,1409352448,-1275067644,-268369152,956302085,67175168,1107296773,-1308556544,1140851213,-201260288,1157628420,1308689152,1023410952,-2063531264,1040188168,-452918528,1073742595,-838794496,1107297024,-117374208,1140851456,939590400,1342177806,-1761606400,16842497,-704641792,33619717,2063663872,1509949713,-1677655296,1241514761,251724544,1375732237,486605568,1526726932,620823296,1308623627,1107362560,1459618308,-1258224896,1325400843,-1560214784,1358955280,-2113862912,1526727178,-301923584,1560281600,-1124007168,1426064144,1510015744,1459618562,419496704,1476395776,-1711275520,16842497,-620756480,33619717,0,0,5,0,0,-65536,-65536,0,8454145]},{"sector":7,"data":[8585346,196609,262146,5,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,359661568,361764232,5596,0,0,257,4194304,524352,-65536,-1,-1,-8390401,-1,-12586753,-1,-14688001,-1,-15744769,-1,-16285441,-1,-16285441,-1,-16285441,-1,-16285441,-1,-16285441,-1,-16711426,-1,2130706680,-1,520093920,-1,117440640,14745599,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000]},{"sector":8,"data":[0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,14688000,0,-57600,-1,65535,0,0,0,0,0,0,8390400,0,12586752,0,14688000,0,15744768,0,15744768,0,15744768,0,0,0,16285440,0,16711425,0,-2130706681,0,-520093921,0,-117440641,-116981760,-16777217,-150503297,-1,-150503265,-1,-284720913,-1,-284720913,-1,-553156361,-1,-553156361,-1,-536379145,0,-418938865,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673]},{"sector":9,"data":[-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-418938673,-1,-536379185,0,-16285681,-1,-16285441,-1,-16285441,-1,-16285441,-1,-16285441,-1,33023,0,0,0,0,0,0,-2143289344,285218310,1258328064,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,1768711042,1634689648,25714,917504,524432,131071,1132613634,1651534188,1685217647,2490368,4194338,-65528,1342308353,1919243906,1852795251,808333600,83886129,-2080362752,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989869312,234889216,16777472,-2142240000,27471,0,0,1700004864,1107719288,1634563177,1766852464,1920300131,2035483749,1141074796,17993,1124663296,1651534188,1685217647,1868710152,774796405,1816205870,1684104562,1970413689,1852403310,1816338535,1868722281,778334817,1917139975,1047687026,1765948429,2037539182,1952531488,1125334625,1651534188,1685217647,544434464,1953525093,11897,0,112642,-1360408021,1354771202,-2094532888,-1073020220,1996483444,-26098,-504692736]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[7756365,13,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":16,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":17,"data":[279886,1179884,191191628,131078,268435968,69084,131072,196610,4194343,11862096,14352597,1278,262146,0,0,0,290455635,290455824,8782214,13893649,-2147287036,1,26148864,-265289663,84,-2147155968,1,30408704,-265289716,32769,-2147090432,1,31195136,-265289724,32769,5898240,1,31457280,1048591,95,0,1330397957,1141132099,88167489,1129270339,1279460683,4932431,1111557376,22304079,1279462400,1464550223,1380992078,148303,134217984,3072,1380272902,55330126,71910471,1380275029,-855507198,319,20958465,65590,1294139392,1869767529,1952870259,1852397344,1937207140,1869366048,1092643683,1768714352,1769234787,28271,1937009920,1852601207,1784900971,1167087646,518818645,2122438798,1963004172,242679569,1342177720,16777114,112640,2122385899,1946226700,-2084557836,-443874579,-900899553,1478361098,-1957345904,-661774612,-1959990141,255659078,-385649408,58065026,1023470569,1416888321,1946157629,343386,-169268620,172395264,1946413373,15395075,10499839,-1728052808,1996443730,-1338573042,-1372127488,-26112,451608576,-16091393,1996425334,242679558,-2096988952,1996425412,-26098,-1070923776,12773785,-401705217,-998047405,-1053950,922685046,1067057172,-402653181,-1070923500,-26032,-689242112]}],[{"sector":1,"data":[-1928431873,1343675974,16777114,1354771200,-2197761,-102232458,113541890,-1928431873,1343675974,16777114,-5510400,1996425846,42788878,-352009085,13559965,-352294168,242679701,383010445,-26032,1996423168,-969474294,-26112,1996423168,-733573878,922701846,-6684474,-385875713,339607400,1036940288,-1049362411,1946164797,17972654,283706229,18038271,1996464500,209125134,-16091393,1996425334,-26106,-310181888,535137026,181030237,-326413056,1342179512,103578,-1706012160,411,-1207910237,-1706033147,430,-6664110,-1560280833,-1070923578,112720,571472,29923920,1347551232,118682,10658560,-1202667477,-1202716671,-1706033147,65535,-6664110,-1560280833,-443875142,-1957313699,-1070137364,32217600,922681344,-191233850,-16777215,-1711234506,509,12203775,16777114,1575324416,-326412861,-15930237,-1130757002,-1996488701,-1202654138,-1706033142,555,-16727389,146338934,983191552,-1560281086,1996423364,440564,38378064,1183383552,-193527810,1342178488,16777114,-62486272,-16484609,-6622090,-1962934017,1385823814,6600784,-1588571495,1385758914,233957456,1273516114,13411085,13506185,-1711520117,1689800786,1347590400,-1728002911,-790081454,-397389299,-928838358,-904492800,-19273728,1064579,-10128384,-1711232458,65535,-1996435293,-956247530,64070,-772127093,65065440,-1962881018,-1996434922,1451882054]},{"sector":2,"data":[-902365192,-935919872,-835256576,-868811008,-161561600,38243110,-397389159,1347554675,-1005793816,-1993935266,1191117383,-92371974,-4621252,-1711232458,65535,1342219448,-1962252056,1438866917,-1296503669,726670848,-11513664,1996424822,-26104,1978138624,176063239,-14125823,922682486,1855586324,-16777213,922682486,2025324564,-1070903066,-2103816112,-956301309,16781830,-2094142720,4670,1996433012,339148548,-26112,1996423168,339148548,65583104,1354771280,-26032,113704960,18,-1017256565,-2081649835,1183647980,-555200262,46433033,956344481,276168262,956343969,141950022,956343457,645200454,-1710983425,65535,-1191688567,-11534335,1996486774,1239044,-16333693,1996424310,39295736,-443875328,-1957313699,250381292,11155199,175258,13673216,13768329,-1207535873,-1706033151,65535,556675,1996452213,11712518,922701854,1771700422,-16777209,-186120586,46433025,1342177720,10630911,-150993480,-1962892242,10920392,834457,-939262985,108461905,-2096890904,-1070921532,-1573454000,-1506345216,108461824,-2096896024,1048774852,1946157074,27322627,1342179000,1342197944,12203775,11024127,-2097052439,1946224766,25487619,1358579341,-2096566040,1048773316,1962934290,11051297,1962821177,440345,5290064,-1170800816,-1472790784,108461824,-2096963352,-1499395388,-62506752,-1532949643,-96061184,350815093,306086657,57999360]},{"sector":3,"data":[-1207922711,-1202716659,-11534256,-16729546,-16734666,-1427634570,180650754,1342180792,1342194104,12203775,-150993480,-1962892242,10920392,834457,-939262985,108461905,-2096987928,230165188,1354256384,922701824,1183514786,10920956,108461904,-2096995096,230165188,1102598144,922701824,1183514786,10789882,-150993479,-1580692503,-1147600730,-67698676,-11417597,921175670,180650754,-1070892053,-1170800816,-1506345216,108461824,-2096967704,28838084,922701824,95944890,-1540425984,-1580692736,-1147600730,-67698676,-11417597,-1444411786,147096322,-11485141,-1962892746,-1499202490,1996443648,43182086,-1207384957,-11534335,-1962892746,-1532757434,375040,-930354697,-1728010591,-150991685,1372062715,-402229505,-998047128,306086664,611647488,956344481,477429318,1342179000,1342197944,12203775,-1543616885,-11534168,-1897396618,180650753,11155199,198810,1575324416,-326412861,-1189679997,-1230962663,-1308218624,-1712720128,12848779,1183447543,-902365190,-935919872,-835256576,-868811008,1347590400,1376393960,158656592,1039681161,92078082,33048263,-92372224,-955941630,195142,503362232,-129594544,-654837551,-96040112,-654837551,-26032,-1230962688,-1308218624,-1543974656,-1197408084,-1274664192,66638080,-1560235002,-1298071362,-1408892160,12362496,16139975,-163149056,-523116335,13633027,13768331,-1980610935,1085862998,1347590431,-1728009055,1589923922,1200301810]},{"sector":4,"data":[1347590402,1376357096,149219408,12453379,-1192474999,1385766720,11313488,-1001368935,-1960381858,1347590407,1376347880,146860112,12322307,-1947580791,-1181092282,-101253115,477417995,49970819,2122535806,1299972856,1089095307,-1947318647,-1992233914,753659974,65685131,1183447622,-330920978,-1980217853,1183707206,-1957685526,-120456634,-1957635849,-120457146,-1705977609,65535,-1929087233,1343679046,12596991,79770,-163119360,1022787203,820577149,11712767,1183535134,1358483960,-772127093,2056933624,-1962934266,1438866917,-326898549,74907398,12334847,12465919,619674,6600704,-1588571495,1385758892,172395344,-397389159,1347553443,-1995964952,1183578694,-773795578,-804912160,-770274560,-62486272,-108919,1996424310,139500044,1996423168,142016260,547738,74907392,-1726005064,1183535186,1347590650,654073540,1385760651,139847760,-1343729582,-1140456697,1085820928,1347590431,-1711651189,1589923922,1200301820,1347590402,1376269032,126675024,12453379,160209488,-443875328,-1957313699,518816748,-1207666945,-1706033139,65535,-16484609,647628918,-2097151999,1946159742,505861,95945707,-62486272,84297355,-1181155313,-101253060,-1946265975,788003910,-1181155156,-101253020,-1947187575,-523108794,100917457,378208464,1183383762,-329872918,-1726005064,1183535186,1347590640,652893892,-1727903861,-1528278958,-397389305,1183385342,524335350,-1957670247,1385820230]},{"sector":5,"data":[-362888112,-1727558874,-2065149870,-397389305,1183385310,176063476,-1207602176,65732673,-1996468040,1183579206,-773795578,-804912160,-770274560,-431585024,-1192733047,1385766720,-429996976,38243110,-1957670247,788003910,-1181155156,-101253020,-397389159,1347553075,-1996059160,1085864518,1347590431,652631748,1385760651,-62485680,11284215,6601113,1385822711,118089808,1676169298,-129595130,-1962641665,100922438,-1957691204,100922950,-1706032962,2466,-1962641665,100923462,-1957691204,100923974,-1706032962,2490,-1593542913,1177223356,-1096724236,-163173632,173578832,1996423168,-129594620,12322307,-96040112,12453379,175151696,2122514432,91488266,-352317512,1357827,-1946401143,503645766,1018796288,-1980107008,1183579734,-1406208004,1689884928,-1980107008,1183576134,-773795330,-804912160,-770274560,-498693888,-1192995191,1385766720,-263812272,-1001368935,-1960385954,1385759303,105244752,-1612165038,-96040699,-1726005064,1183535186,1347590640,652369604,1385760651,103147600,2145931346,-129595131,-1962641665,100922438,-1957691204,100922950,-1706032962,2694,-1962641665,100923462,-1957691204,100923974,-1706032962,2718,-1593542913,1177223356,-1096724236,-163173632,-26032,1996423168,-129594620,12322307,-96040112,12453379,-26032,-443875328,-1957313699,216826860,721467041,-1996443130,-1197343162,-1274664192,-62486272,13514495,13383423,13252351,13121279]},{"sector":6,"data":[-397389159,1347552651,-1996167704,1451881542,-28931082,-162120807,92218748,1995720251,-196703458,-1946532215,1177288262,33083898,-1962888698,100923974,-1230831438,-13112576,-16725450,-16725962,-16724426,-1962881994,1385823814,87681104,-1813491630,-129595132,737953419,-120457146,11798017,66602635,-1560235002,-443875144,-1957313699,418153452,-1207142657,-1202716670,1344143504,1342181304,782490,176063232,-15567616,1307053174,46433025,460701707,1005174827,175570689,1342220984,1342177976,16777114,268879616,-1207959552,1344143504,-1070903266,1375784122,1347440720,1342203064,1347469355,1342994175,-26032,1183383552,922702074,-390594540,-1070903293,1402622032,184549379,-1203669568,-1202716608,-1706033112,3277,-113015,79170678,1183535104,-1202708738,-1706033112,3134,-1957642197,1344208454,503353528,269531216,-26032,-840433664,-9901579,-1559476597,-4718432,-17665,1996443730,-26100,-1365049344,-1340700416,209125120,1342177720,503353528,1030224,223058512,1996423168,1354771450,16777114,-62486272,1354771280,-407351216,12079107,2006601737,-16777204,-1070859146,9484368,-373796834,12079107,-6664191,-16776961,1996487286,-26108,350945280,384321165,-26032,1183645696,-1706027288,65535,384321165,1354771280,-6664112,184549631,-2525760,-68621194,46433026,-1034033781,-1957363702,183272428,1342193848,1342184120,16777114]},{"sector":7,"data":[-62486272,-1866934133,373786880,-1961336948,1204288606,-1962934256,130546782,1586167811,71732220,-1962260599,1204288606,-939524350,-64441,-1202667477,1385791232,-26032,1586167808,239569404,-939762037,3143,519849611,-26032,-1073020928,-1070922635,1996441067,-25860,1996423168,243716,-163148464,95965206,-6664192,-16776961,-1866988426,-1924129280,1343682118,16777114,-28931840,-965427189,1342469887,16777114,11182848,-1962933832,1438866917,12119179,-1960719060,-41941922,-2147255284,-1070396179,126469514,1200210314,-1983477246,-443874233,50013,0,0,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,772196139,-1996488704,1459625998,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-46209017,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,3655,-1017256565,-1192457387,-1957691328,1861682246,2124042246,-1962934258,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,3725,-1017256565,736922453,1996443840,198744580,-443875328,-1957313699,74907628,865946,1575324416,-326412861,-1710983425,3830,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018]},{"sector":8,"data":[-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443874901,2126234461,-2063892224,1393062656,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1073762959,-1007912629,567095476,-1023396701,3016334,741772070,889239552,512303565,109838370,521011236,-1171980104,567086544,1947110198,908256000,7734981,-617358708,1914634038,-385649920,-986251703,-1946125818,244698,1914634038,-1021372928,855643321,1384642267,74711296,567099060,-1007492541,-387151019,1996423504,18147332,-1017256565,1475119957,-13413546,184960651,-149783104,72780759,-621291273,-1996488675,1451820614,172395268,310231051,1452005367,-136775928,7642,-1995815287,-1073018794,1317738101,105286408,-235417037,1183570059,-1947076860,-1875055661,1317787787,106334984,-788248949,-774254101,198758890,-134973989,871402481,-11513134,1996425846,14477320,1996903995,990409223,58065990,855764611,197561298,-150506241,-2082932774,1583022298,146955615,-326413056,-617392553,184960651,-149783104,72780755,-621291273,-1996488675,1451820614,172395268,310231051,1452004343,-136775928,7642,-1995815287,1317734486,-1948125436,138841080,-503844725,-141100541,-134019482,-963913845,125098763,-654845193,1577114243,146955615,-470994432,-773140218,-1006968104]},{"sector":9,"data":[-387151019,1021837416,1961102077,75399178,-972786432,519963718,2234053,-853213000,243998497,132317300,-16776517,-1962905058,1286865990,-2068110899,-2063892224,1393062656,1130043391,-1007490237,1458342741,-1962260853,-503905202,1183570059,-135230712,-1764097055,50751223,-1949070376,-1034068282,-2068119544,-2030337792,1393062656,1130043391,-1007490237,16973883,196970,16973931,199847,16973932,199822,16973937,69080,16973825,199832,16973938,69168,16973829,69213,16973830,69228,16973831,132096,16973826,69276,16973834,196770,16973948,133090,16973828,69300,16973839,199686,16973825,69327,16973841,66541,16973842,67085,16973843,69351,16973844,200193,16973829,196810,16973830,69393,16973849,199623,16973834,133178,16973843,196799,16973836,133029,16973844,69115,16973854,199775,16973977,199753,16973980,196890,16973857,68642,16973875,133101,16973869,68489,16973878,196825,16973863,196853,16973864,199602,16973865,199810,16973866,68957,16973884,68973,16973885,199950,16973997,199521,16974000,196993,16974004,131509,16973885,199974,16973881,131464,16973890,131554,16973893,197135,16973890,197594,16973892,197418]},{"sector":10,"data":[16973896,131612,327760,16714775,327681,16715005,16973826,69085,16973915,198488,16973901,198539,16973902,197655,16973905,196742,16973911,196633,131160,16714778,131073,16715010,1953300482,1819506547,0,5,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,254803968,256905032,1953304476,1819506547,1668115310,257,4194304,524352]},{"sector":11,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-12583169,-1,-12583169,-1,-1,-1,-1,-1,-469762105,-1,-469762105,-1,-1,-1,-1,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,536870911,-8388609,536870897,-8388609,-15,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-1,-8388609,-923649,-8388609,-923649,117506047,-1,-1,-1]},{"sector":12,"data":[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,536870911,-1,536870897,-1,-15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-469762105,-1,-469762105,-1,-1,-1,-1,-1,-12583169,-1,-12583169,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1953366015,-2143289344,285218310,1258328064,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,1869374338,27491,917504,524432,131071,1132613634,1801678700,2490368,4194338,-65528,1342308353,1919243906,1852795251,808333600,83886129,-2080362752,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989869312,234889216,16777472,-2142240000,27471,1648429056,779384175,1124412974,1801678700,1952539652,1867782753,1634541679,1663072622,1801678700,1919885427,1835627552,779317861,0,0,1828716544,1937208180]},{"sector":13,"data":[-524222464,-521403580,-512817537,-498595416,-478933835,-454029409,-424144290,-389606167,-350808263,-308143800,-262137072,-213181300,-161997384,-108978543,-54780140,8000,54796052,108994193,162012600,213195916,262150928,308156744,350820153,389616873,424153694,454037407,478940341,498600360,512820863,521405252,524222464,521469116,512883073,498660952,478999371,454094944,424209826,389671703,350873799,308209336,262137072,213246836,162062920,109044079,54845676,57537,-54730516,-108928657,-161947064,-213130380,-262085392,-308091208,-350754617,-389551337,-424088158,-453971871,-478874805,-498534824,-512755327,-521339716,-1375730939,-1845427456,-1342176496,1409352448,-1275067644,-268369152,956302085,67175168,1107296773,-1308556544,1140851213,-201260288,1157628420,1308689152,1023410952,-2063531264,1040188168,-452918528,1073742595,-838794496,1107297024,-117374208,1140851456,939590400,1342177806,-1761606400,16842497,-704641792,33619717,2063663872,1509949713,-1677655296,1241514761,251724544,1375732237,486605568,1526726932,620823296,1308623627,1107362560,1459618308,-1258224896,1325400843,-1560214784,1358955280,-2113862912,1526727178,-301923584,1560281600,-1124007168,1426064144,1510015744,1459618562,419496704,1476395776,-1711275520,16842497,-620756480,33619717,0,0,5,0,0,-65536,-65536,0,8454145]},{"sector":14,"data":[1464909,89,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":15,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":16,"data":[279886,19399208,191785539,655366,402653984,71148,655360,262154,4194580,33226896,34472454,1872,262192,0,0,0,406126727,406188400,129368629,129495408,128254674,128315696,597754712,597881136,113575346,113701168,383976998,384102704,426379175,426504496,281610581,281735472,64883314,65007920,103156406,229507089,-2147287036,2,186187776,-265289663,336,190447616,-265289663,344,-2147221504,1,194707456,-265289716,355,-2147155968,11,195493888,-265289692,32776,197853184,-265289720,32775,198377472,-265289717,32774,199098368,-265289712,32769,200146944,-265289708,32777,201457664,-265289719,32778,202047488,-265289676,32779,205455360,-265289710,32771,206635008,-265289719,32772,207224832,-265289719,32773,207814656,-265289715,32770,-2147090432,11,208666624,-261095414,32769,209321984,-261095413,32770,210042880,-261095411,32771,210894848,-261095414,32772,211550208,-261095413,32773,212271104,-261095412,32774,213057536,-261095413,32775,213778432,-261095412,32776,214564864,-261095418,32779,214958080,-261095371,32777,218431488,-261095422,32778,0,1313817351,1280266836,1296126730,1229278288,122572611,1414418243,122441554,1414418243]},{"sector":17,"data":[5001042,65536,786440,100663313,1314014539,1191398469,1426344260,139609427,1113146699,1146241359,-855507187,56623423,104844545,-855569387,149619007,121621761,-855572480,146080063,71290113,-855572480,61998143,71290113,-855569613,297731135,71290113,-855566340,1599,104844545,-855568082,2111,-14483455,71290113,-855572412,67044415,71290113,-855569545,302777407,71290113,-855566266,125305151,37735680,-855637803,52562239,155176192,-855637479,575,155176192,-855637107,831,54512896,-855637459,65798975,54512896,-855637085,21889855,37735680,-855637061,98960191,20958464,-855632921,206438719,20958464,-855633757,324075839,20958464,-855632984,343540031,20958464,-855632560,46205247,155176192,-855638016,360382783,88067328,-855636704,1343,88067328,-855636658,5571903,88067328,-855636794,27919679,88067328,1398,1852397333,1937207140,1852793632,1819243124,1851879456,27749,1145323788,1414418246,1279537201,201330503,1178879041,844385871,1196180528,1091305488,1330005060,808670286,289885252,1145113344,1414680644,1279537201,117442119,1296912195,205999172,1145113344,1414680644,1279537202,184551239,1346651201,808670290,138890308,1380976128,1196180564,1124728834,1162759759,1279546435,201329479,1179403588,827608655,1196180528,1141637138,1330007109,808604750,323439684,1162087168]}],[{"sector":1,"data":[1414680652,1279537201,184551751,1347175748,808604754,172444740,1095763968,1145849166,214860,1329742088,1279546453,134219079,1330401091,1196180562,1124990980,1381256783,1314344015,1330794564,134218051,1398099789,1196180549,1124728852,1414419791,1279547730,3399,2004055149,1802398835,1802134381,-2081649835,1996450028,1354771212,504001208,5290064,2857552,1996423168,112652,221821008,1354256414,1083854848,-16777216,95947894,381177856,-1202708981,-1706033072,85,-1207142657,-1202716665,1344145794,1342197944,27290,209125120,1342179512,504139448,5290064,8362576,1996423168,636940,228505680,146296862,-1801826304,-16777216,179833974,-524791808,-1202708982,-1706033144,175,687747,1996435572,178188,-1404662448,1354256406,932859904,721420289,1183666368,-1202710868,1344146744,1343238328,73626,-373282048,1996423820,-26100,-1073020928,1183527796,149332748,503320760,221821008,-1070903266,1375784122,1347440720,1342203064,1347469355,1342994175,-26032,1183383552,1975520170,1354771225,504001208,221821008,817385502,-6664176,-385875713,1996423630,243724,-1404662448,1354256406,-1936044032,-16777215,-1070880138,-26032,1183383552,-1070903042,-1202696112,-1202716660,-1706032832,368,738096895,1183666368,-1202710868,-1202716660,-1706032896,439,210517635,-12553216,79170678,1183666176,-1202710868,-1706033072,644]},{"sector":2,"data":[-1700104449,460,178256,40606288,1183383552,-1070903042,-1404662448,196628502,12079104,-1667608575,-1207959550,-1706033127,515,913686539,-1700104449,527,1358841481,1342178232,1342177720,125594,-25755904,1342177720,33200720,1996423168,309502,112720,35691088,565706752,-6664192,184549631,-15108672,1637526134,-1996488702,-1202651578,-1202716662,-1706033151,65535,503329208,2799696,666390558,-1924129280,1343663174,1342179768,16777114,-1404662528,-26032,1183645696,-1202710868,1344143414,16777114,1975520000,-1435041981,16777114,45633536,-6664192,-1996488449,922746438,196610278,1183666176,-1202710868,-1706033072,65535,738096895,1183666368,-1202710868,-1202716664,-1706032896,65535,-5605633,-6683530,-352321281,-1740206796,244338710,185295080,-14256704,-1928714698,1343658054,16777114,1975520000,-1740206828,-6664170,-1929379585,1343658054,16777114,-1740206848,-1070903274,-1706012592,65535,-1183465461,168312451,-16157696,-1710618570,800,120864387,-16157696,-1710803914,65535,124403331,-16157696,-1710790090,816,168836739,-16157696,-1710616522,832,164904579,-16157696,-1710631882,851,209731203,-385649408,922746235,-6681472,-385875713,-443810449,705117,1167087646,518818645,-326903666,205949732,1946158653,-385649029,20775227,1024291840,477364226,1946158397,14805284,-16222465]},{"sector":3,"data":[1996424822,-26098,-1070923776,20572569,721502696,-6664000,-352321281,242679789,-16353537,1996425334,20506634,1996479723,-565801714,-6664170,-16776961,1183649398,-397404450,1996423743,-565801714,-6664170,-352321281,242679733,-401967361,-1427439053,204226179,-16223232,-6681994,-2097151745,1946159742,142508949,-7375616,-1710471626,65535,922715371,10095112,-16777213,-6680970,-1996488449,-1202660282,-1706033147,65535,-6664110,1375731967,-26032,144900096,242679562,-1696827649,65535,170276607,1342182840,1347469355,-26032,904462336,172395519,1946160189,242679574,-15960321,1996425846,108461832,16777114,-11080960,-1207376330,1385758722,242679632,185087743,184956671,-555217264,-17110768,687747,-236387467,641138686,82614794,-437714944,998910,32047989,1392127,1374225269,1457663,289265268,-385649407,306052883,-342985727,49120148,1562371467,707149,-1275051,-1710610890,65535,-1017256565,-2081649835,1187448556,-1962934020,-995948986,138840838,-1962345821,-1073019834,20787316,1023964160,645136386,-16715543,-1207294410,-1706033150,1333,170276607,1342177720,16777114,973522688,-385875712,1889599693,-1037330169,-930350895,-1727510901,-120470997,1183433003,159162878,-775804007,-1949791240,731448902,737726914,-96040511,16678531,1187448189,-2097151746,2097216126,-96024827,922681344,1996425766,-92864514]},{"sector":4,"data":[124794623,159135487,-1705983957,65535,3817091,-2090306560,-16732610,922690421,45615654,-390574080,-1070903293,-459648944,184549381,-1207601728,48955393,1183432747,641138684,112650,-26032,726663168,-1706012480,65535,108314635,16547459,922687348,381159246,-1202708981,1344146744,1342189752,50586,973522688,-1962934272,146955749,-326413056,-1962742653,113401317,-326413056,-1962611581,19727430,670976,1038680950,-1816132863,1554513710,-432603385,440328,-11513191,922682998,922683918,244320780,-384883480,922681624,62392550,1347590400,-16353537,-16197578,-351742410,-432603167,309256,-11513191,922682998,922684004,-890566046,149305087,-1728052296,1996443730,540475142,506920712,-4986104,-1207376330,1385758724,108461904,170538751,170407679,922721515,129501414,1347590400,-16353537,-16154570,-351699402,-432603259,571400,-11513191,922682998,922683628,1843988714,-432603137,636936,-11513191,922682998,922684448,1441336350,-432603137,702472,-11513191,922682998,922683178,1038681896,108462079,103578,-28931840,505936,-25755824,1354771280,474778,1975520000,112645,-1070923029,-26032,787152896,149305087,-1728050248,1996443730,1949761286,1916206855,-17372921,106563133,112592497,115672781,121898773,111085192,-443873539,311901,1167087646,518818645,-326903666,205949702,1946226749,17906952]},{"sector":5,"data":[334047860,112641,128162384,1183383552,-6663942,-16776961,-1766322570,1996443648,-25862,28835840,15657216,1024083595,729022465,1962934845,13560067,1962972733,242679781,1342215864,1343125247,532122,1975520000,112645,-1070923029,-2084377776,822334,28839029,204251904,140352080,-1070923776,2130884688,-1706012007,2155,141662800,1996423168,9877518,-26032,1183383552,-1701162758,-1207959545,1344143444,503333816,-92372144,-1207602176,65732668,-1946140488,-1706011942,65535,-2080618871,822334,-1070920843,1342975139,261018,1354771200,-1719729992,-6664110,1342177535,16777114,-58817792,-16091904,-6680970,-352321281,-18411,1751120,1354771280,503340216,73308752,1996423168,1354771214,577178,-15800064,-310132693,535137026,181030237,-1873273344,-326412987,-2116514274,17894526,1996427637,112654,-26032,28835840,-2130056448,17828990,-1070861196,-1962742397,1297948645,503319242,1430622296,-1910575989,619480024,1024214667,427032848,-924253322,146689,255663220,1025864704,57999381,-352255767,242679560,16777114,-373282048,1996423623,-26098,28835840,28961024,170276607,504207032,1354771280,16777114,242679552,383665805,63412816,1996423168,-562626802,-1864337665,26798094,-1928431873,1343675974,253850,-1195382016,1344145184,-16222465,-6683018,184549631,-13142848,-1097200010,-1996488695,-2091852730]},{"sector":6,"data":[47166,28837237,721611520,12100544,-401698736,1996423720,-596181234,647578,-1137246464,68196870,1996423168,168270350,1183383552,1996443868,142016270,-1710852353,65535,-26032,1996423168,-596181234,281754,-12130048,-15829249,1996425846,142016262,16777114,-1371634944,58064640,-54295,1838812790,-1996488694,-11477946,-4714890,-4330497,-1710631882,2616,1342179000,672154,-1706012160,2639,-16132957,-1710456778,1051,1342178744,678810,174891776,174986889,1050300498,-1560281084,146279552,815419392,-1560281084,378079478,-974583560,242679806,271258,-599357184,17464963,-1202702475,1344146304,209729279,779674,-1237417216,225705984,-1193511169,1344146304,798362,-1237417216,91553792,-352321096,-1547687166,703135926,176063487,-385649662,-957808864,-401698808,1996425359,-401698596,233374084,18038271,339580788,-385649407,20840206,-385649406,54394584,-385649406,887750277,49120254,1562371467,707149,1167087646,518818645,-326903666,142016260,150484735,150353663,783770,142016256,1342177720,786842,-62470400,1996423168,124565512,-4698082,1183535359,-754732548,180618720,632836126,1687834624,-16777205,-155711370,-1202708982,-1957625857,61996102,1510334675,-1202708985,-1706033115,3099,-2080618753,2080570494,-1371634763,141950720,-1878521624,131196942,16533191,-60912896,-2016943151,-62604]},{"sector":7,"data":[-2080618753,2080832638,142016492,-1377300848,142016256,12072703,568856208,-1371634944,259325696,-16222465,922684022,244318382,-2096832280,-443874579,-900899553,1478361094,-1957345904,-661774612,-1207404801,1344145184,209729279,16777114,142016256,150484735,150353663,16777114,142016256,1342177720,16777114,142016256,503825080,-18352,119584848,632836126,-6664192,-2097151745,1946158718,142016269,503783608,-26032,1996423168,119584776,922701854,244320724,-2096613400,-443874579,-900899553,1478361092,-1957345904,-661774612,1443949699,11419267,-15567617,-1710796746,3185,183514879,16777114,121020672,-1578088823,1183385408,809403388,427032582,120995459,-2096792052,201799214,120995459,-955878144,201799174,121020672,192153145,1996444788,-130613498,-164167928,228956680,1996423168,181712902,922701854,-1986392960,-16777203,28837494,-1785049088,-16777203,2122516086,92081392,-351841608,205436931,1347607180,1358954424,504026296,2472016,231119440,1689845760,121676032,-1980106855,-955826154,62022,-772639093,1954843622,914635019,-1593084665,1178140846,-385649422,1586167996,-1846798,-1928907081,-1873742778,111929358,-772645237,918520803,763169287,385369741,12236880,1905938462,-1929379827,1343682630,385107597,-26032,1183645696,-1924131084,1343682630,16777114,108461824,-1309522293,98620163,1344145104,209729279,689562,108461824]},{"sector":8,"data":[1342177720,728474,108461824,150484735,150353663,725402,108461824,385107597,-18352,-230257840,-523041871,503762949,2472016,188979792,-1365180416,-230278912,1996428405,-230257914,-523041871,503762949,177838672,1988820992,-1947807246,-1996015996,-16026492,2122576454,58525426,-1946218007,916713542,-62485753,1577533603,-1962742397,1297948645,503317194,1430622296,-1910575989,149717976,637951684,163713,-385649663,-2094661396,1946748031,14870787,11419267,-11176705,-1710610890,3989,1358448265,170276607,11417343,16777114,-1373730048,-941371136,-16026489,-1375287297,-256,244381814,-141336,-1207294410,-1202716670,726664168,-1706012480,1471,170276607,-1694992641,2477,956780705,1963738630,1095711,248420944,11075584,-2096335744,822334,178340213,-1587811574,1458244336,957018273,1963738630,1095696,250059344,11075584,-337677184,168468794,205915705,280500853,177885184,-1459617777,-881491968,210517635,-1591970816,451610300,956742817,1963738630,1095700,-26032,11075584,-1583123072,1185089360,-373282036,1589903738,2139170310,1962999810,122724848,205915705,-257881740,1174812938,-1579256564,1183383726,106874106,71797542,1962943805,10676483,1946166845,2571535,-1394015371,2637056,-1242863500,11419267,-1592691201,104400720,58002502,-1207922967,300613635,956780705,1963738630,440325,146277355,-96040704]},{"sector":9,"data":[170276607,624538,-129595136,16533191,106873856,654067339,1996900153,14280963,75465510,-385649627,1325334660,122724858,205915705,-1070900107,1048796139,1979646126,122724622,205915705,95961716,-1582372096,104400720,91556934,-352319560,637088,1048812523,1979646126,122724759,205915705,1927873396,-339727361,-1371634812,57999104,-1577091607,104400720,-1099625402,-385875272,62455659,-96060672,1352733822,1174812935,-1207601908,65732610,-1996487240,1589967430,2139301382,745875204,-1577433345,104400720,91556934,-352320840,374787,2113553979,122724627,205915705,-1070922635,62391275,-96040704,-493825,-16112074,-694486410,-16777207,417987654,641138687,-126419190,955546,112640,-1962742397,1297948645,503317706,1430622296,-1910575989,216826840,-1207273729,-1706033143,4305,-6664110,-1996488449,1451881542,175570934,1342179000,664986,-1706012160,3254,-1980217719,1996487254,-734593270,288135689,1183383552,108954620,-385647360,2122514693,58589702,-1711211287,4626,303602256,104529920,259328550,122697471,1189786,122724608,-15972701,-16305098,-1710790090,4461,-16091393,-16318410,-16317898,-1593359818,103483142,-11532542,721892406,-11513664,-16301514,-1207483338,-860225504,-1706012160,4513,120862463,168834815,1194650,175570688,117978879,118109951,121779967,721882785,1342638598,120862463,1347469355]},{"sector":10,"data":[121779967,121911039,-1174396744,1347551436,1207962,175570688,721880225,1342706694,117585663,135542527,721882785,1342636550,-1174396488,1347551472,1174938,175570688,117454591,117585663,135542527,721882785,1342636550,-1174396488,1347551472,1234842,175570688,117454591,117847807,-2097083415,2097350270,18344195,84311683,250151806,-26111,-1706033152,65535,170264123,922685301,-1231418640,-1593835511,1185090288,876019468,1781989127,310090247,1996423168,272039690,305594119,1110900487,118923527,118621739,876019536,1354771207,1110900560,1144454919,2144263,1375784122,313498192,922681344,922683188,-6682096,-16776961,922684022,922683160,922683162,513869634,436611847,922701831,-1070921932,922701904,922683202,548931396,13416960,-6664110,-16776961,346098294,335948551,922701832,922683154,513869844,302394119,565727239,15776256,-6664110,-16776961,922684022,922683152,922683154,513869844,302394119,565727239,15776256,463097938,-16777197,922684022,922683152,922683158,922683202,565708972,15776256,-912633774,-16777199,1996425846,-193527818,1097626,175570688,-362753,-660932490,-16777200,1996425846,283810556,-310181888,535137026,113921373,-1873273344,-326412987,-958886370,738564358,1139281552,94216192,121021336,-1744462688,-1610139485,-1550318177,-310180038,535137026,1439386973,113699979,-1876294247,1632270]},{"sector":11,"data":[-1744461920,-1610138461,-1550318178,-1667168450,121676549,-1017256565,1167120524,518818645,1465309326,-1962567519,-1962567138,-1962566642,-133849578,-1734139443,-1709274875,-1676769019,-1642690299,47109,-789118349,-310157729,535137026,516640093,1430622296,-1910575989,82609112,-1996077429,1183579206,179935496,-2131101952,1586180290,-15234820,1183579206,-101213944,185091721,-1948287040,130481246,108461824,-2097148952,-443874579,-900899553,-1957363708,116163564,71732054,519849609,-26032,1174601728,1183402236,-1961038854,126549086,-113016,1988885574,-2012968198,-2192633,1183513166,-1962440450,1178204742,1591505660,-1034033781,1478361090,-1957345904,-661774612,1443425411,638082756,-1960429685,-970259385,653805193,637945739,-1996339413,1996487238,108461836,1392794,-62486272,1443657471,638082756,-16615425,922744950,565708972,15776256,-275099566,-16777196,-1000993674,-1960441762,103482951,-11532116,922744950,565708972,15776256,244994130,-16777195,-1000993674,-14284706,922681975,1996425236,2210042,1375793338,355834448,1996423168,140428300,71797542,135530027,2013210192,339148546,-92864760,-1174396488,1347551472,1244058,209125120,-1694730497,4930,49120094,1562371467,576077,1167087646,518818645,1996478606,175290374,951603230,-1202708979,-1706029008,1541,-1962742397,1297948645,503317194,1430622296,-1910575989,82609112,-15698177,1996426870]},{"sector":12,"data":[175570700,-16222465,-6683018,-1996488449,-12714938,721974783,244338880,-1946181144,-310117306,535137026,214584669,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,-838416597,-1996488699,1459994638,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-370874361,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,5719,-1017256565,-1192457387,-1957691328,1861682246,-1902489594,-1962934250,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,5789,-1017256565,736922453,1996443840,-26108,-443875328,-1957313699,74907628,16777114,1575324416,-326412861,-1710983425,5894,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443875162,515621725,620462342,1393062662,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1074131599,-1007912629,567095476,-1023028061,97388174,741772070,889239552,512303565,109839810,521012676,-1171980104,567088608,336497462,908256006,102106821,-617358708]},{"sector":13,"data":[304021302,-385649914,-986251703,-1945757178,244698,304021302,-1021372922,855643321,-225970469,74711301,567099060,-1007492541,-387151019,1996423243,1042436,-1017256565,115600690,-657331503,1438907106,1122561163,-29235200,175432714,294528,1187382389,-987824636,-1207582186,567092480,336497439,-1157111034,520028162,1183516178,-850611196,103070497,103086977,-11335565,1128487703,-1144786197,-75430364,141755942,1528299347,-219462845,50353347,51291649,50358784,50625793,50359040,50523137,50359296,50894337,50360064,50516737,50360576,18212865,50331904,50519297,50360832,-16542208,50337024,18235393,50332928,-16628224,50337280,18246913,50333184,-16662528,50337536,18250753,50333440,-16723456,50337792,-16220416,50338048,34810113,50331904,34394881,50332160,18263041,50334208,-16124672,50338560,51144705,50363392,-15696128,50338816,-16134144,50339072,50938113,50363648,-16176640,50339328,-16179968,50339584,18269185,50335488,-15836928,50339840,51735553,50331904,34813697,50333952,18276097,50336000,18282241,50336768,51777793,50332928,50571009,50333184,18292993,50338048,51283969,50334208,50669569,50334720,18221825,50339328,33830657,50371072,34917121,50339072,51452161,50337280,51446785,50337536,50419713,50370816,50801921,50371072]},{"sector":14,"data":[50453761,50371328,34693121,50340608,50414081,50371584,50796801,50371840,50437633,50372352,34908417,50343168,50941441,50341632,50948353,50341888,50397697,50342144,50715137,50374912,50505473,50342400,16923905,50346496,17319937,50346752,50859009,50375936,51448321,50343424,50337281,50376704,51427329,50377728,50638337,50345216,50699265,50345984,50865921,50379264,34221057,50348544,33755137,50349056,34216961,50349312,51267585,50348544,51417345,50349056,50860545,50349312,16930049,50353920,50855425,50349824,17650433,50354176,17654273,50354432,18104833,50354688,18214145,50354944,50952961,50351104,51169025,50352384,51241473,50352640,51182081,50353408,51747585,50353920,50897153,50354176,50513153,50354688,50835969,50356480,50846977,1828741632,1937208180,1835757164,1167087646,518818645,-326903666,309252,1940048,-2136801280,1354771207,10650,206873344,1342179256,13722,210412288,1342179000,16794,148546304,1342179512,16777114,183411456,1342193848,1342184120,16777114,-62486272,74825739,1793835051,-1202667477,1385791232,-26032,1586167808,239569404,-1207535873,1344143460,16777114,-60912896,-1207154807,1200160876,341806098,-1996077429,1204226631,-956299760,-956300537,-64953,-16496697,7649535,-1944696951]},{"sector":15,"data":[-1014294433,-6664162,184549631,-6458176,-6620042,-1207959297,-310181887,535137026,46812509,-1873273344,-326412987,-2082959842,-4709140,-17665,922701906,127535334,-1560281087,378079978,-4715796,-17665,922701906,530188518,-1560281087,378079614,-4716160,-17665,922701906,932841702,-1560281087,378079016,-4716758,-17665,922701906,1335494886,-1560281087,378080286,-4715488,-17665,922701906,1738148070,-1560281087,378080006,-4715768,-17665,922701906,2140801254,-1560281087,378079090,-4716684,-17665,922701906,-1751512858,-1560281087,378079446,-4716328,-17665,922701906,-1348859674,-1560281087,378079470,-4716304,-17665,922701906,-946206490,-1560281087,378079566,-4716208,-17665,922701906,-543553306,-1560281087,378079842,-4715932,-17665,922701906,-140900122,-1560281087,378079846,-4715928,-17665,922701906,261753062,-1560281086,378079262,-4716512,-17665,922701906,-6682394,-1560280833,378079396,-4716378,-17665,922701906,1067059430,-1560281086,378079400,-4716374,-17665,922701906,1469712614,-1560281086,378079784,-4715990,-17665,922701906,1872365798,-1560281086,378079788,-4715986,-17665,922701906,-2019948314,-1560281086,378079756,-4716018,-17665,922701906,-275117850,-1560281088,378079466,95946988,-1550168064,-1560281086,112723988,-1348841472,-1560281086,45615276,-1147514880]},{"sector":16,"data":[-1560281086,347604802,-946188288,-1560281086,330827588,-6664192,-1560280833,-1070920564,2147334224,-1706012007,745,721906339,-55029568,1347590527,16777114,168862464,-1710852353,787,1358710409,16777114,120890112,-16353537,748354678,721420291,1419399360,-1996488701,-1924072378,1343675462,16777114,1354771200,-1694730497,893,-1545845109,1183517296,206742504,-150991432,-1559597010,683149692,1378809600,124822284,-1710852353,65535,1358710409,1342178744,275098,-1706012160,65535,966414418,-1560281084,1996425736,-59310330,16777114,105286400,-16298333,-1207376330,1385758721,108461904,183252735,183121663,16777114,170304256,1979711293,-339727612,112643,-1962742397,1297948645,503318218,1430622296,-1910575989,82609112,-1207535873,-1706032752,991,-16297821,-1699215754,-291876863,-1560281085,1996425968,27572230,66951760,178454528,108461834,1342290104,16777114,113025792,-1559801695,1048775750,1962937484,-1137246436,-1001466,-1137246384,-6664186,-2147483393,1347615970,16777114,440320,71670352,1347551232,283546,164930304,1342178744,286618,174891776,174986889,-6664110,-1560280833,146279552,-6664192,-1560280833,378079478,330828024,124035840,-1559798621,-1264384068,128754439,-1560272968,1621297000,130065159,-1559775069,113706928,6424490,-1560253768,-1365047462,7256071,-1559776605,1991771998,123904768,-1207454045]},{"sector":17,"data":[-1163722630,124166919,129894087,-1900543870,119317248,-1207495517,413335686,118530823,118621895,113704972,2230046,-1560275016,379782938,108461831,503818936,83597904,1996423168,123385862,144330782,-16777211,-1296562570,-1706025465,1301,-1207535873,1344145250,336538,108461824,503823032,87005776,1996423168,118536198,1016746014,-16777211,414713462,-1706025465,1532,721884321,-1559805434,279119640,145531143,118621697,50796193,1208527878,-1593369949,103352492,330827550,181838592,-1559572829,-492631354,114991878,-1207512413,-626851809,181576458,-1559573853,-559741210,114729734,114296519,414711824,180658944,-1207511901,-660406244,180921094,-1560271688,-593294644,2668550,-1559830365,113707728,3147492,181667527,113705010,4066008,-1560262472,77793036,4241415,-1559820125,113706752,788226,118359751,397934626,118137600,-16316765,-793246090,-1706025466,1545,-1207535873,1344146116,399002,108461824,503765176,102996560,1996423168,181188614,815419422,-16777210,-524810634,-1706025466,1597,-1207535873,1344146132,412314,108461824,503775416,106404432,1996423168,118011910,-6664162,-1593835265,103483140,144901954,117482247,17345697,-1593376250,103483146,-1556084564,-1398733050,235284744,227981319,922701854,922683088,922683090,922683108,-1315305754,-1207959546,1344146304,1342187960,1342197432,1342188216,1342199480]}],[{"sector":1,"data":[16777114,108461824,504070328,115579472,113704960,6948640,119801543,113705090,4982562,119932615,1996423256,119584774,-291876834,-16777212,-1207376330,-1202716666,1344145346,1342197944,16777114,-26112,-1917321216,-1202708992,1344143485,1342356664,470170,91761920,312727799,10926091,-1783082978,-1202708992,-1706032652,65535,-150738899,113157080,168441599,1342177976,1342228664,1342484664,-1705983957,1892,112998143,1342177976,1342203064,1342407864,-1705983957,65535,168441599,1342177976,185743103,1342177720,495258,-1137246464,178182,-1103691952,112646,-26032,2025324544,302394117,-6664181,-1207959297,103482344,-1706031426,65535,-1962742397,1297948645,4391626,19791874,262399,21364738,327935,24510466,393471,26083330,459007,27656194,524543,29229058,590079,30801922,655615,40239106,721151,41811970,786687,22937602,852223,32374786,983295,33947650,1048831,5308675,327681,35520514,1114367,37093378,1179903,12779779,458753,38666242,1245439,18219010,1310975,117309443,1704191,69140739,8847363,69796099,8912899,57147651,10092546,128450819,1310723,36110595,3342337,127598851,11010051,118554883,3735553,50135299,3407874,6947075,11337731,8192259,11403267,47710467,11468803,116982019,11534339]},{"sector":2,"data":[43450627,11730947,56688899,11796483,11993347,3735555,57606403,4325378,125370627,4063235,122421507,4194307,49545475,4325379,51052803,4456451,110559491,4718595,10616837,65791,16449541,131327,14876677,196863,19595269,262399,21168133,327935,24313861,393471,25886725,459007,1179907,5701634,27459589,524543,29032453,590079,30605317,655615,40042501,721151,41615365,786687,22740997,852223,52494595,6094850,32178181,983295,33751045,1048831,35323909,1114367,60621059,5832707,36896773,1179903,63963395,5963779,38469637,1245439,18022405,1310975,10944514,65791,16646146,131327,15073282,196863,113115395,6750211,1167087646,518818645,-326903666,12761172,-1128771554,726670848,-1298509632,-1996488704,-1072976826,28837237,721611520,103850944,503369656,13219920,-944222178,-1202708992,1344146166,1342178232,26266,14465024,-692563938,-1202708992,1344143572,503803064,243792,8624720,-357040128,-1202708992,1344143588,503374264,122861648,129519646,-1600499712,-1207959552,1344143608,503378616,15710288,1052266526,-1202708980,-1706033145,65535,503382968,16627792,-1070903266,-26032,1183383552,1958742956,81162,37558644,-1203538944,1344145128,503818936,15112784,-256376832,-1206719738,1344145136]},{"sector":3,"data":[503818936,16095824,-390594560,-1202708986,1344145330,66714,116963328,-1162325986,-1706025465,277,-122149909,-1202708986,1344145322,74906,115914752,-1296543714,-1706025465,65535,-351866696,641631183,292814858,170276607,1347469355,1342177720,16777114,49120000,1562371467,1478413133,-1957345904,-661774612,-15668093,28837494,1872384000,-16777215,45614710,-6664192,-2097151745,-16732610,922691188,-6682074,-1996488449,-11472826,-16112074,-1879003594,72542222,170276607,-1695516929,65535,721778872,1342902790,1358055053,120218,18397184,146296862,-1924129279,1343681094,126874,-62486272,721676472,1342619142,1358055053,16777114,-58817792,-1206029312,1344143665,503390392,-230257328,-6664170,184549631,-1207601984,48955393,1183432747,1975520252,108461832,16777114,-18432,1751120,1354771280,503396792,-26032,-310181888,535137026,46812509,-1873273344,-326412987,-1948742114,138218054,-385649152,-1073544983,-1476448621,178324249,105265418,780343669,-2129392878,-938798530,-385647616,113705161,13110034,-2097102615,268877358,113131139,-385647516,113705137,6555326,-1593792279,1178143242,-2095483642,336269830,185745025,58655920,-956264215,-1341451770,8907012,113116803,-1103199984,2114159622,-1106851974,-352091130,168468850,1963345465,305037576,-352257525,-1104248434,-352270330,168468895,1963345465,302416136,-352257525]},{"sector":4,"data":[-1106869841,-352270330,168468928,1963345465,138840840,-351595869,138840882,-351879517,168468778,1963345465,-11081469,-1577096215,1178143242,-343641082,-2097001832,-788350718,-1744639742,251855107,-1962698749,1185089094,45633548,178343936,105265418,312542581,-1593578741,-1202714946,-1706033151,65535,956959393,863307334,-1207142657,-1706033151,1049,-1207142657,-1202716671,103482744,726666002,-1706012480,1472,721778872,1342902790,16777114,-1207047424,103482344,-1706031426,65535,-1962742397,1297948645,503318730,1430622296,-1910575989,82609112,16533191,-62485760,-523041871,503762949,142016336,-1710852353,65535,91537419,-335788405,-62456052,184319619,-4663428,49120255,1562371467,313933,1167087646,518818645,-1957242738,154994246,-385649152,-1073544834,-1476448621,1048774086,1979646126,142016284,1342177976,91034,175570688,-16222465,1637484150,-352321532,-1371634876,830210816,11419267,-13992187,1996425846,-1372127480,-401698816,-6684260,-16776961,2056915574,-16777211,1996425846,108461832,16777114,-1373730048,-941371136,-16026489,105286655,-385831261,1048772860,1962868910,-1371634800,-579076096,11419267,-2719998,1996425846,-1372127480,-401698816,-1209335480,11419267,-2090566656,33599038,1996447103,105286410,-523041871,503762949,87792208,2122514432,208995846,11411083,-2013273135,183174966,11411083,-1879055407,915081014]},{"sector":5,"data":[-422510418,11568267,121013305,-2067331458,1846,11417227,-1132206383,2097153846,-1333490847,914655488,-11015417,1996425846,-18424,-401698736,-1108738350,-1371634944,-411303168,11419267,-2064635,1183517302,-754732794,114296288,1922715678,-2097151995,1963460222,-1373730036,-1847040,-351848825,-1373730038,-1847040,-16304497,-402608586,1996423457,105286410,-523041871,503762949,-26032,1996423168,95197706,1525350400,11419267,-11307777,1996425846,-1372127480,-401698816,512426064,-472842066,192186311,113770495,-65362,-1710590209,65535,-1207404801,-1202716670,726664168,-1706012480,65535,67769579,67765258,75105402,77595770,85787808,-2090990307,-443874579,-900899553,1478361094,-1957345904,-661774612,-16091393,-1710456778,65535,425603,2122529660,897516038,-1207872280,-1202651137,726663198,1347440832,138906,175570688,117454591,117585663,721880225,721879046,1342706694,721882785,-351862266,108954413,-2093646845,2131035774,20375599,-16091393,-16314314,-1593372106,103483156,103483152,-1588590572,103483166,-1202714862,-256245727,-1706012160,65535,-1962742397,1297948645,1426065098,1183575179,212228,71110772,1026520064,57999365,-385835799,1048772795,2114717500,1007077126,-2097151737,17251390,113706621,788284,1342178488,-369113880,1084293271,79272199,200931072,-1592953390,-1181153472,-101253020,225825291,-1727577951]},{"sector":6,"data":[-150892359,1976699897,1010729763,477430279,121519747,-955875811,17251846,1044284160,1434255623,121505479,1307246621,121380491,1050797009,1116158215,-955876095,17251846,1044284160,830275847,121380491,-2020875311,1050870082,-2128418041,856113214,-955875832,-1140375546,1077838087,2080881671,-9901821,121636551,1609107507,1575324671,1426064066,113699979,-1607662183,-1650325706,121151493,-1610244958,-1616771270,127769093,-443875328,-1957313699,-1727609108,1017129733,94347783,-1576583520,1084294558,94151431,16777114,1575324416,50337731,50731265,50360064,-16643840,50338048,50413825,50363648,-16667392,50340096,-16493824,50340352,-16505088,50340608,-16495872,50340864,-16287232,50341120,50558977,50334208,50552833,50334720,50566145,50336768,33977345,50339072,33945601,50343168,50562305,50374656,16784129,50346240,16795905,50346496,16892161,50346752,50547713,50347520,50429697,50348544,50437121,50349056,50385409,50350592,50579457,50351104,50642433,1828737536,1167087646,518818645,1183570062,17841420,289212276,-351177727,242679582,1342181560,-1207933464,300613633,-15829249,280496758,-605532160,736946945,49120192,1562371467,707149,1167087646,518818645,1183570062,17841420,289212276,-351177727,242679582,1342189752,-1207950872,300613633,-15829249,817367670,-1746382848,736946945,49120192]},{"sector":7,"data":[1562371467,707149,-2081649835,1187469036,-16776962,-16193994,1183646838,-1202710868,-1706033072,224,91602955,-352321096,-1983894782,1996488262,15120390,-1404662448,-6664170,-2097152000,1962999422,-432603365,71731976,1183666240,-1202710868,-1706033072,607,91602955,-352321096,-1983894782,1996488262,16431110,-1404662448,429543446,-1929379839,-1705989050,65535,-1207535873,-1924136720,1343663174,80282,-1404662528,1689800726,-1706025469,852,-1207535873,-1924136934,1343663174,16777114,-432603392,309256,-1202695527,1385758725,27040336,1183383552,-432603222,-1449504760,-1560281087,2122517812,175440126,28875344,-1039466496,28837237,721611520,-28931648,149305087,-1727773045,-1037319629,-754973511,734147576,1385775298,440400,-1706012007,65535,-5618039,1342760502,16777114,229417728,16678531,-1706030475,65535,91603467,-352321096,-1983894782,-4653498,-17665,-476426158,-1560281087,-4715936,-17665,-6664110,-1560280833,2122516712,242483454,-1207535873,-1705967617,666,1996426475,112646,-26032,-443875328,311901,-2081649835,1187468524,-2097151746,1946224254,23456003,-1207404801,-1202716646,-1202716659,-1202716558,1344145442,16777114,1614216960,-26102,-1039466496,922708341,1183516902,591108,-1404662448,1354256406,-375762944,184549378,-1207601728,48955393,1183432747,1958743038,142016264,-335544392,142016283]},{"sector":8,"data":[380389005,221821008,817385502,479875072,-16777213,-1070921610,61381200,922681344,-1399190220,-16777214,-1710379978,696,-16713239,-1710596042,916,1342710456,16777114,574521344,1467285512,149305087,268729987,649594229,-1207702784,-1924136890,1343663174,1342210232,16777114,1975520000,112645,-1070923029,201213577,-16026432,-6682506,-385875713,1996423330,-1404662520,951603222,-1202708979,-1706033104,65535,-1207924247,1344145442,212122,-2133292288,1544036799,582492788,-1706025464,65535,-1082074997,1949960225,136493071,1740132382,-1706025469,65535,149305087,-1728052040,1996443730,75399944,-1593215696,378210468,132843686,-1962348895,1376317462,-26032,-1073020928,183051892,108954623,-14846718,-1710410698,925,229390079,16777114,142016256,-1705983957,65535,-1034033781,1478361094,-1957345904,-661774612,-1960645501,272436294,1023898625,292815121,1996432619,1095694,7661648,-352321096,242679575,-16091393,1996425334,1095686,36497488,-1070864661,-1962742397,1297948645,503319242,1430622296,-1910575989,585925592,1024214667,125042960,1946227005,-14357743,817368694,669536256,112640,1996429291,175570702,-16222465,817366646,-538423296,736553729,49120192,1562371467,707149,-2081649835,1187470060,-1207959298,-1202716670,-1706033151,65535,185232035,-15174208,-1650850186,-1996488700,1996466758,1354771206,306074]},{"sector":9,"data":[-11015424,1996424822,43051012,1853210635,174733055,460442,108461824,328346,-1438217984,721843967,563761344,-16777211,-1962351050,50660422,1183666176,-1202710868,-1706033072,1367,91602955,-352321096,-1983894782,-1072955834,1996426100,50567850,837353472,-1435042047,380389005,221821008,817385502,-1885712384,-385875966,1996423448,-26106,1183383552,108461990,1358952632,122566399,16777114,-1502150912,1342177720,394394,1312227072,1354771207,16777114,108461824,1342233784,504114872,91658832,922681344,1183516902,263428,-1404662448,1354256406,-1785049088,184549381,-1207601728,48955393,1183432747,108462078,1342236344,380389005,95722064,2122514432,494207230,149305087,84166283,-1924136955,1343663174,1342197944,381850,1975520000,112645,-1070923029,-113015,-88603018,1183666176,-1706027348,1522,16678531,922688885,1183516902,394500,-1404662448,1354256406,-1533390848,184549376,-1207601728,48955393,1183432747,108462078,1342177720,380389005,110598736,2122514432,242483454,-1207535873,-1705967617,1810,1996426475,112646,33987152,-443875328,311901,-2081649835,1183536876,81162,37581684,-385649408,339542223,-385649664,2122514652,1567949064,-1207535873,726664201,1347440832,16777114,-1438217984,1979711293,12249347,174733055,16777114,-1194816768,1861681281,-1983839318,783854662,-1957683700,1344187462,483738]},{"sector":10,"data":[1781989120,-26102,1996423168,14465036,204388432,-1013297122,-352321536,209125241,1342182584,1342441912,1347469355,114203216,1183383552,-49750,1996429428,1357836,67811408,-1435041968,504094392,37329488,922681344,95946982,1347590400,-2096335105,1963983998,156147977,156243595,-1465841685,-1441363192,-1706012152,894,1946157629,1781989141,-26102,1996423168,112652,33069648,-443875328,705117,-2115204267,-956129556,65094,210517635,-1207143168,748879873,-6664180,721420543,45633728,1347590527,16777114,-6664192,-956301057,16687238,2122747136,-1202710785,1344145442,16777114,2122747136,-1202710785,1344144233,495258,2122747136,-2091903233,1966081150,182499333,-1632107541,1390054413,19438160,-2037579776,1343684478,-8485235,-6664170,-16776961,-1710692298,578,57983499,-2097115159,822334,-1070920843,1342975139,725402,1354771200,-1719729992,530206802,1342177291,730522,-432603392,71731976,1342179589,-14121331,1354256406,-996519936,184549380,-1207601728,48955393,1183432747,108462078,290714,105285888,112720,86874704,2122514432,175374590,-1710852353,2597,1996429291,679906566,-1202710785,1344146744,1342189752,325530,-373282048,922682091,-1550186264,-1929379838,1358921350,1342240696,-25917811,-26032,-2037841920,-2037514372,-1202651266,-1706032277,2344,130472075,40233216,-43874675,-2037559274]},{"sector":11,"data":[1343684478,588442,1652985088,-1924131075,385782406,124885584,-2033778688,-401,-43874675,-26032,-1073020928,518587253,75399938,-972589776,16640390,-2033842709,-1929314842,385737350,75400016,-1207601904,65733485,-1945931080,-1706011942,65535,57982987,-2097026839,16687294,783817333,-1924129268,385782406,159357520,783810560,-1706025460,2533,268729987,468255604,-410612479,646351357,-1667608321,-16777207,-1191237962,-1706032262,2445,-26048887,130472075,647924480,4161791,-1897331851,1921420033,1926773758,25422083,174733055,-150961736,100573358,-1202716543,-1706033150,2624,-8747383,58048523,-1560235287,-2037577110,1343684258,-14252405,-627421154,-1929379831,1358865030,1342405816,655258,-958887168,-2037579769,-1705967966,2586,-1207535873,-1202716652,726664193,-2037559104,1343684258,691866,1781989120,177707530,-930414592,-150961736,67018926,612796865,-1924129025,385782406,179542608,-2037710848,1344208676,704154,1781989120,180853258,-2030108672,-1224737120,2126053158,1570394115,-1996488694,-1946212730,4161752,619250549,646381567,649527295,175479551,350814208,108462079,319130,12314880,174733055,-150961736,100573358,-1202716543,-1706033150,65535,-8747383,-713768949,-1928697181,-1979848058,1358898822,1342406840,16777114,646351104,-2133292033,74711103,-14252289,-14240001,180634,108461824,1342182584]},{"sector":12,"data":[1342439864,-1957642197,520038022,184523344,922681344,1637485162,-1962934266,8501448,-23023881,-2037792509,1344208676,-23951731,2107265046,-1962934266,520037510,-26032,922681344,-2036725142,-16777210,-1912692602,1358853254,16777114,2089191680,2092860415,57999615,-2080534039,16687294,1996428660,1357830,67614800,1354771280,-1365618608,-2097151994,822334,-1070920843,1342975139,472986,1354771200,-1719729992,1167741010,1342177287,478106,-1601795328,1575324670,503317698,1430622296,-1910575989,205949912,1946226749,17906951,518721908,-1207011585,-397410288,28835941,-15602944,1996426870,1095690,24963152,-1070863125,-1962742397,1297948645,503319242,1430622296,-1910575989,205949912,1946226749,17906951,518721908,-1207011585,-397410256,28835873,-15602944,1996426870,3192842,20506704,-1070863125,-1962742397,1297948645,1426066122,-327029621,-950665082,65094,149305087,84166283,-1924136953,385841798,8435792,204380752,-1073020928,28837237,721611520,-28931648,-8747379,783831062,-1706025460,3731,-1207535873,-1924136710,385841798,206477904,2122514432,510984446,149305087,84166283,-1924136952,385841798,8435792,238787152,-1073020928,28837237,721611520,-28931648,-1207535873,-1924136700,385841798,214800976,2122514432,242483454,-1207535873,-1705967617,3560,-2101839893,-1706025469,65535,2055638352,-1202710785,-1706033024,65535]},{"sector":13,"data":[-8747379,1721389078,-1962934258,2055376368,-62486017,1586171371,1547665660,130418037,-1927484672,385841798,-62485680,-6664162,-1996488449,-2037515194,1178206074,-2656772,448267894,-2037559296,1343684474,343706,108461824,1342177720,397978,-443851264,311901,-2081649835,1183515372,81158,37557620,-385649408,104661223,1023964160,1853095943,-2097093143,822334,28839029,204251904,223648336,-1070923776,2130884688,-1706012007,3426,224959056,1996423168,75399944,-1207601904,65732640,1342193848,-1996443672,1048837702,1962937484,-1547687157,-1706030036,3457,-1202667477,1385791232,227514960,-1706033152,3477,16678531,1048803956,1962937484,112652,1342975139,902042,1354771200,-1719729480,-778416046,1342177293,907162,75399936,-15895280,115869814,-28915966,166395905,-402098433,1183388281,-1942060034,192217100,748929067,-1046851572,721420295,12079296,1347590527,511898,-711307264,-2097151993,1946222206,142016267,-1710852353,1149,-1034033781,-1957363706,-2098429460,1996445185,1751046,899152,7518288,2122747216,-1706027265,2485,-8485235,152803920,-1098907648,1962999678,-432603334,71731976,1342178821,-16873843,-2135404522,-627421184,184549390,-1207601728,48955393,1183432747,1975520254,10479875,-1710852353,2080,-1929335831,385842822,242915920,-259325952,-8537472,-1926990756,385842822,53058128,-259325952]},{"sector":14,"data":[-8537472,-1928301510,385842822,59357264,-1550168034,-1929379826,385842822,204388432,1016746014,-1929379825,385842822,-24736432,-1706027266,3917,1400225803,149305087,537165443,431490421,-1207702784,-1924136903,385810054,8435792,133143120,-1073020928,28837237,721611520,-28931648,57982987,-40471,-2037578122,1343684350,504182968,3192912,137992784,-1070923776,-1929341463,385842822,-24736432,-1706027266,3884,-25262451,582504470,-1706025464,3938,-25262451,783831062,-1706025460,2198,-25262451,-2037559274,1343684350,16777114,1958742784,2122747317,-1924131074,385810054,142973520,-2037579776,1343684222,-25262451,-1617276906,-1929379833,385842822,2122747216,-1706027265,3955,-1928956161,1358855814,-8485235,-26032,-1073020928,1776878453,112895,1575324510,1426064578,-327029621,-1799880486,-1202708989,1344144267,503939768,-1404662448,1354256406,-375762944,-1207959537,1344144285,504094392,60602448,-2037559266,1343684392,1342210232,1099930,679906560,-1514647297,983191555,-1996488688,-1946212730,4161752,-2030107532,-1224736986,580583206,-1962934256,-2130762082,359923775,-14121331,282237520,-2037579776,1343684392,-352081992,204388405,61454416,141335120,-661979136,-1207957562,1344146478,591002,679906560,-1202710785,1344146478,1109146,679906560,-1202710785,1344144299,1079706,679906560,-1924131073,1343663174,1113242,61716480]},{"sector":15,"data":[-558346210,-1924129269,385820806,289905232,1183383552,1958743038,-18411,1751120,1354771280,503559608,292461136,-977797120,-1202708989,1344144318,503561656,679906640,-1202710785,-1706033024,65535,-14121331,236624464,-1098907648,1946222376,9627907,-14121331,-558346218,-1706025461,3868,-14121331,-843558890,-1706025469,4364,-14121331,783831062,-1706025460,4380,-14121331,-810004458,-1706025469,4396,-14121331,1183666198,-1706027348,3068,16678531,-659022220,-1202708989,1344144337,-14121331,-6664170,184549631,-1207601984,48955393,1183432747,1958743038,-18411,1751120,1354771280,503570616,313498192,2122514432,175440126,-1710983425,65535,922695659,-6682802,-1996488449,-1202673082,726663171,-1499836224,-16777199,28879478,-1070903296,297114192,1996423168,309418,1354771280,16777114,1575324416,503317186,1430622296,-1910575989,585925592,1024214667,125042960,1946227005,-14357743,548933238,1961381888,112640,1996429291,175570702,-16222465,548931190,921194496,736553730,49120192,1562371467,707149,1167087646,518818645,-326903666,205949730,1946226749,17906951,619385204,-1207011585,-397410240,28835879,-15209728,1996426870,142016266,-1207535873,-397410240,-420806167,-310132693,535137026,181030237,-326413056,-949687165,65094,537165443,1996433269,1357830,-26032,1183383552,-6664032,184549631]},{"sector":16,"data":[-15305280,-1070922122,207657552,-1662451712,108461825,-351379736,75400166,-385649632,1996423398,67614880,1354771280,1301958736,-16777210,-1207376330,-1924136928,1343662662,1342197944,1245338,1975520000,112645,-1070923029,-113015,-424147338,1183666176,-1706027350,4895,16678531,922688117,565709030,1183666176,-1202710870,-1706033072,4923,91602955,-352321096,-1983894782,1996488262,16431110,-1438216880,1520062486,-2097151981,1962999422,-432603366,2275336,-1438216880,1354256406,-560312320,184549387,-1207601728,48955393,1183432747,108462078,1342177720,380257933,202283600,2122514432,158597374,-1207535873,468320255,108462079,1342185656,-16658712,-591919498,783831040,-1706025460,5235,-1928956161,1343660614,16777114,243712,175124215,-1985722877,28875846,-577089536,-1962934253,-936662962,-150993992,51015726,145531336,-939269935,201084553,-1962574135,-1673123391,-150993224,51139118,1183425094,1354771358,16777114,-1504802048,112773163,1378809600,-1580727540,-523171820,1317652483,2127105020,700549893,1996463686,-1636368634,-1952680193,1177265734,1183535266,-1538905176,1354771280,16777114,108461824,1342177720,842138,1575324416,1426064578,-327029621,1187446914,-1962934018,20777542,1026782208,57999362,1023469033,57933844,-2097092375,1963001982,209125149,-402360577,1996423391,14465036,204388432,-459648994,-385875950,1996423365,74907404]},{"sector":17,"data":[-2097102104,1948255358,9562371,1023531496,2138374143,1517600779,1946157373,10479875,-401836289,922683651,599263462,-2037559296,1343684478,1342209208,1230234,1975520000,112645,-1070923029,201213577,-16091968,395971702,-352321515,209125211,-8485235,951603222,-1202708979,-1706033088,3846,922698475,95946982,1347590400,-15960321,-16095178,-1710594506,1784,1946157629,-14554322,1486490742,-352321522,-432603358,374792,-11513191,922684534,922683950,-739571156,722237183,-1969598272,-1962934254,180510181,-326413056,-11080573,347604598,163074048,-1070903292,-1706012592,5503,1034569353,58064895,-16713751,347604598,179851264,1996443652,-1371107926,278548502,-2097151986,1965032574,-1371108073,210679888,368548432,1183383552,-958886996,166395911,1353598605,1451162,199145472,1183666206,-1706027346,5581,537165443,1183007861,-1934097236,-1957683701,1344187462,1071514,65648640,1183666206,-1202710866,1344144360,504114872,899152,370907728,783810560,-239579124,999968771,-1962934250,509656,-189260309,-1924129277,1343663686,503575480,204388432,230182942,-828747776,-1207959530,-1706030034,5936,504114872,389782096,783810560,-88584180,563761155,-1962934249,4161752,783817845,-2091901428,1965032574,228505605,-524811285,1390054410,275356240,-443875328,311901,-2115204267,-956266260,64070,-1202667477,-1706032511,1120]}]],[[{"sector":1,"data":[-8878455,108380171,-369098824,1048772970,1962937484,112652,1342975139,857754,1354771200,-1719729480,614092882,1342177293,862874,66959360,-1070903266,-55029680,-1957683709,520059014,41990224,385718864,-2037710848,1183448952,-27358210,1962950528,8907011,503580344,516131664,67483728,-2037559266,1343684474,1342209976,1035162,-28931328,-558346210,-1706025461,2268,58048523,-1929344791,1358920326,1342443192,1046426,-958887168,-2037579769,-1705967750,4111,-8747379,1234849814,-1929379824,385841798,228505680,-778416098,-1929379816,385841798,204388432,211439646,184549399,-385649472,1187446914,-2097151494,822334,-1070920843,1342975139,1482138,1354771200,-1719729992,-1415950254,1342177302,1487258,2025258752,76913407,1183514624,-1923486726,1358920326,1342443704,1557146,-62486272,1065408651,-16550912,1996487750,68335868,361929296,1183383552,-2133292036,57933887,-243969,1251671158,-1962934246,1065417822,-955943936,129606,-106869,1065418310,-385649408,-252969245,-1017256565,1167087646,518818645,1183570062,17841420,289212276,-351177727,242679588,1342185656,-1207930392,401276929,-15829249,1996425846,108461832,1342185656,-352204312,-2084557850,-443874579,-900899553,1478361098,-1957345904,-661774612,1024214667,125042960,1946227005,-14357743,1085804150,669536256,112640,1996429291,175570702,-16222465,1085802102,2145931264]},{"sector":2,"data":[736553729,49120192,1562371467,707149,-2115204267,1442908396,16664263,-432603392,71731976,1342178309,-8747379,-2135404522,60444672,184549401,-1207601728,48955393,1183432747,2055638526,-1202710785,1344146478,1693594,108461824,1342241464,-8747379,597315606,-2097151975,1962999422,-432603362,71731976,1342178565,-8747379,-2135404522,1805275136,184549402,-1207601728,48955393,1183432747,108462078,1342244024,-8747379,-375762922,-2097151975,1946222206,108461839,1358954424,1391514,12445952,504114872,-125399728,-1202710786,-1706016768,6937,-8878455,2130706237,2055638350,-1924131073,385810566,431200848,-2037579776,1343684474,1687194,-1913615616,-1979745662,-2037515194,1343684474,519849611,212834896,1183383552,2055638524,-62506497,1586175348,1547665660,130473077,-1928271104,385841798,68466768,93999134,-1929379813,385841798,446995024,-259325952,-8799616,-1928301254,385841798,68532304,-811970530,-16777190,448267894,-2037559296,1343684474,1279130,108461824,1342177720,1321370,-443851264,311901,-2115204267,-956233492,65094,1024083595,410255361,1962934845,47704323,1946158653,474379,1424556917,47376642,-1207142657,-1202716646,-1202716659,-1202716544,1344145442,1399962,136493056,363174480,1048576000,1962936354,-432603319,71731976,1342178821,-8747379,-2135404522,-1181069312,184549396,-1207601728,48955393,1183432747,1958743038]},{"sector":3,"data":[15526147,-1928562945,385841798,221821008,817385502,-325431296,-385875948,582484576,-1706025464,6839,-1082074997,1952188449,136493090,-2019930082,-1962934260,566198488,259275272,503849656,68663376,-560312290,-1207959526,1344145442,504114872,375298640,582483968,-1924129272,385841798,246717008,-1073020928,99156853,136493058,-2037559266,1343684474,1422490,136493056,-2037559266,1343684344,1346371768,16777114,2022082816,2109737983,-432603306,71731976,1342179077,-8747379,-2135404522,1234849792,184549405,-1207601728,48955393,1183432747,136493310,60444702,-1929379812,385841798,136493136,1905938462,-2097151971,1962999422,-15406845,-1710459137,7551,-2097052695,822334,28839029,204251904,474651216,-1070923776,2130884688,-1706012007,7256,475961936,2122514432,276111364,-1207142657,-397410272,1183383890,8710652,-401836289,1996425054,4241420,20768848,201082505,-1200785984,1344145442,16777114,2055638272,-1202710785,1344146478,1871514,2055638272,431509759,-459649020,-1962934243,509656,-8747379,1637502998,-1207959523,1344144411,504094392,2055638352,-1706027265,7884,175489035,-1710459137,4476,-4713749,448286975,-1070903296,-1706012592,7912,210517635,722171136,204252096,480352848,-1070923776,2130753616,-1706012007,7343,481663568,2122514432,57999612,-2097114135,1967129726,209125132,1342179000,1899162,75399936]},{"sector":4,"data":[-1206946496,1344145442,504114872,504470096,1048772608,1962937484,112652,1342975139,1891226,1354771200,-1719729480,-375762862,1342177308,1896346,75399936,-16222944,-454554506,-16323840,1340607606,-1942060282,192217100,748929067,2040156172,721420311,12079296,1347590527,1542042,-1919266816,-16777193,1996426358,422943242,-443875328,705117,-2115204267,-956234516,65094,503849656,-24736432,-1706027266,3972,-16873843,-6664170,-1996488449,201260166,-9603904,-1962351050,134546502,-2037559296,1343684478,1342209976,1618842,1975520000,112645,-1070923029,-1191295351,1344145442,1453722,2122747136,-1202710785,1344145442,1997722,-25263360,-16092160,-744880522,-352321516,108461847,-8485235,951603222,-1202708979,-1706033104,6807,65781803,-1962933832,79846885,-326413056,26274945,-26179897,-2033778688,65140,503587512,199145552,565727262,-1924129276,385777286,16758864,367696464,-2037579776,-1202651522,-1706032086,7718,-25524599,1065408651,-16288768,-956401018,-2037579769,-1705968002,7745,-8485235,-2037559274,1343684222,2013082,8448256,-25524597,-26048887,70039632,396991056,-2037841920,-661913990,1946173312,2055667463,509694,-25512193,1985178,1924595456,400005886,-2037710848,1344208498,504073400,391879248,-1073020928,-1098709131,1946222196,1887881001,-1929379330,385842822,70170704,-1936044002,-1929379810]},{"sector":5,"data":[385842822,1921420112,-1706025218,5963,-2033776917,130676,-25518453,1946173312,-9115389,-26165629,-1928301312,385842822,70301776,1721389086,-1207959527,1344144433,504094392,2122747216,-1706027265,4238,201213577,-1206553408,-1202651137,726663194,968380608,-1706025468,4266,503597496,71481424,1102598174,-1924129276,385777286,16758864,559061584,-2037579776,-2037776770,-2037514634,-1202651522,-1706032047,7995,-25655671,1065408651,-13995008,-956401530,-1224802297,1404632696,2006601732,-1996488672,-1946257274,4161752,1344146292,16777114,2022082816,1991704574,526621438,-1224802304,-1365574024,-1962934239,519992966,199145552,-2019930082,184549407,-1957333568,519993478,193771600,1520062494,184549406,-2092862016,1946222206,73250845,1454919710,-1202708988,1344144469,2136730,1958742784,112645,-1070923029,201213577,-1206553408,-1202651137,726663194,1706578112,-1706025468,8381,16678531,1996425333,547789316,1840775168,-6664188,184549631,-12945984,-1710797258,8408,-25393527,243792,112720,537958992,-1224802304,28900988,-1706012672,8225,-25381121,1342178488,1342177720,2156698,1575324416,1426064066,-327029621,-2037579646,1343684478,503849656,468032080,-2037579776,1343684478,504114872,459512400,-2037579776,1343684478,1824154,1975520000,74907405,2175386,-373282048,783810689,1975013388,-207990780,-1962934245,509656]},{"sector":6,"data":[504114872,458463824,2008547328,-1202708988,1344146398,504114872,471374416,-1073020928,1996425845,472160772,-1108672512,1358954424,1342184120,-1202667477,1344144509,2150298,-18432,1947728,1354771280,949637200,-16777188,-1710797258,4487,1358841481,1342180024,-1705983957,4503,-1962933832,46292453,-326413056,-949949309,63046,16664263,1354771200,1342382520,1473690,-1605990144,578142219,-1710983425,8686,1342457481,1342177720,2227098,74907392,2230682,-373282048,-2068315684,726670852,-1202696000,1344144515,513820299,52475984,564501072,1183514624,-129594976,-2131206517,678756415,16154243,-1008139404,-432603392,4241416,-1572434608,1354256406,1469730816,184549410,-1201769024,1542127617,503614392,-129594544,-1967632354,-1924129276,1343683142,1342177976,1955482,-96039680,503355984,2122317824,494141690,32917191,74907392,1342182584,1342439864,-1957642197,1344206918,2245018,-128021760,-2131212545,57999423,-335578647,-1983894544,1996488262,134584836,1183383552,28856324,312102912,-2097151992,1946222206,74907402,1799322,-15275264,1183646838,-1202710878,1344146744,1342189752,1939610,-1602814208,1545882,-16389888,-1207666945,-1202716652,726664199,1347440832,1720730,-432603392,4306952,-1572434608,1354256406,-1835380736,184549410,-1207601728,48955393,1183432747,74907646,1342236344,379733645,582064720,2122514432,443875582]},{"sector":7,"data":[149305087,1342194360,379733645,5290064,583899728,-1073020928,28837237,721611520,-28931648,-1207666945,-1924136710,1343660614,1631130,-25263360,-15043328,-1207376330,-1924136893,1343660614,1342197944,1784730,1975520000,112645,-1070923029,-113015,28836982,1183666176,-1706027358,8967,-1207666945,-397410240,1996485195,14465028,204388432,1989824542,-16777182,697999478,-1207959518,-443875327,180829,-2081649835,582484716,-1706025464,65535,503616184,199145552,-1850191842,-1706025468,8101,175489035,-1710983425,8154,-4708373,448286975,-1070903296,77117520,1905938462,-1207959517,-1202651137,726663197,1347440832,2083994,77510656,535009872,-1073020928,922688117,-258341042,-1996488673,-1202651578,-1202716662,-1706033151,8194,-1034033781,50347778,52649729,50360064,35674369,83916544,-16655616,50342656,18943233,50332928,-14722560,50337280,17391617,50333184,19074817,50333440,-14452224,50337536,17415681,50333696,17427969,50333952,-14465024,33560832,-16658944,50337280,35858433,50366464,52568321,50331904,17278977,50336256,17319681,50336512,50664705,50365952,-14654208,50341632,-14738432,50341888,-15566080,50342144,-15398912,50342400,-16229888,50342656,-16709632,50342912,69016577,50332928,-16067328,50343168,-16210432,33566208,-16654848,50342656,-15012352]},{"sector":8,"data":[50343680,-15755776,50343936,-14866688,50344192,52664321,50371328,52659969,50371840,17591297,50343680,51613953,50339840,17595393,50344192,52504833,50340352,52032769,50342400,18810369,50346496,19086337,50346752,16862721,50347008,16866049,50347264,52140033,50375936,16869889,50347520,52501505,50343424,52526849,50376704,51619585,50377472,51649793,50345984,18435073,50350592,18828545,50351360,18450945,50351616,18908673,50351872,52141569,50349312,52136449,50349824,18838273,50353920,18890241,50354176,18894337,50354432,18444545,50354688,16896769,50355456,52197633,50354176,51540481,50354944,52620289,83909632,-16659712,50337280,52547841,1828742400,1937208180,1167087646,518818645,-326903666,-129579512,-129594815,-6664040,-1996488449,1451883078,1959922684,-129594872,1962559032,106859274,-1996994934,-32511225,2122381382,-780248328,-972661109,1204175111,-310181887,535137026,46812509,-1873273344,-326412987,-2116514274,1442915052,16533191,105286400,-2037559266,1343684320,-1705983957,742,-9140599,2147483453,18082051,1988529488,-1202710785,-1873805248,83945486,-8995199,376789581,196232843,242529350,-1951250805,1183429718,-94991880,-1070921493,-1980086647,-1224738746,1996488564,-126418950,-1705983957,257,-9128193,381044365,4241488,-401698736]},{"sector":9,"data":[2122384566,1950699190,10938627,-9128193,735856267,-129629230,1392137747,1354771280,84378,1958149888,-163148289,28856342,244338688,-16481816,-1946192714,17106502,-1974460927,1352201798,1810370192,-163149308,-1947169896,-2134505890,-16776959,-35658,1996481654,1354771426,16777114,1958149888,-163148289,28856342,244338688,-1979434520,1033434694,41681024,1183350960,1958150134,105286655,503349253,-163149232,244338840,-1962666520,106859504,8421574,-62470400,-1224802303,244383604,-1962652184,-2090927034,-443874579,-900899553,1478361090,-1957345904,-661774612,40168577,16533191,138840832,-2037559266,1343684126,-102232432,1958742786,105286420,-2037559266,1343684476,-437776752,1975520002,-373282043,-2037579055,1343684126,-8616307,-6664170,184549631,-11766336,-1207376330,-1924136880,385785990,5290064,43162192,-1073020928,28837237,721611520,-62486080,175423499,-1710590209,684,1996469227,-1601794806,-1202710786,1344146744,1342189752,181658,-946148608,1090484870,-2096239716,16743102,-1367269772,327745402,1342177976,-11485141,-1694532938,65535,-17660279,-613105653,-8733053,-11111168,-1207376330,-1924136879,385785990,5290064,62888528,-1073020928,28837237,721611520,-62486080,175423499,-1710590209,65535,1996429291,-1601794806,-1202710786,1344146744,1342189752,16777114,-222888192,-25858,283705344,512134655,-1924131074,385719430]},{"sector":10,"data":[536918096,50633296,-2037841920,-12714120,-1915322625,385842310,-1668903600,-1202710787,-1706029055,65535,-31684983,2147483453,19785987,-17647873,16777114,-192509696,-157906434,2025259006,-155779073,-189333506,2058813438,-401698561,-2037841314,-1072955746,-1224789387,-1224737252,244383608,1375942120,-401698736,-1224801459,244383260,-16610840,-1694567754,65535,-8866049,2011696784,20703490,-31672577,-17385729,-17516801,-23152897,937954960,-1635370238,-6916866,-1862394698,38856718,-8616307,244338710,-16657432,-1862305610,37545998,149305087,1342198456,-23034227,1354256406,-6664192,184549631,-1207601728,48955393,1183432747,-125399556,-1924131074,385785990,-26032,-2037579776,1343684476,296858,-125399808,-1924131074,385842310,67803728,-2037579776,1343684344,503620792,77109840,2122514432,175374588,-1710590209,556,1996429291,-125399798,-1202710786,1344146744,1342189752,148890,-222888192,56924926,-1997996032,2025259006,-401698561,922681758,1404569830,-2037559296,1343684256,1342197944,135834,1975520000,112645,-1070923029,-1912846711,385808518,-1601794736,-1706027266,1273,-8616307,-6664170,-1929379585,385808518,2089192784,-1706027265,65535,16547459,65602420,175570942,-17267059,-128279,-1694567754,718,-2097151560,-443874579,-900899553,1478361094,-1957345904,-661774612,8580225,-15960321,-2037577098,1343684478]},{"sector":11,"data":[1342243000,30874,2092960512,142016294,-1928956161,1343653446,253594,142016256,-16353537,1996425334,-26106,28835840,721611520,49120192,1562371467,576077,1167120524,518818645,1465309326,-1274653045,-1960719078,1451952206,-850480118,855798305,-2090967104,-443874579,-900899553,-661913594,-1957345904,-661774612,1451972438,-853887994,-850414559,855798305,-2090967104,-443874579,-900899553,-661913598,-1957345904,-661774612,106349854,567099828,-1070398862,49120031,1562371467,313933,1167120524,518818645,-1960912754,1455754334,-1958759416,567084622,-1070398861,49120031,1562371467,576077,1167120524,518818645,-1960912754,1455754334,-1958693880,567084622,-1070398861,49120031,1562371467,576077,1167120524,518818645,1465309326,-1274650997,1931595070,1606431490,49120094,1562371467,182861,1167120524,518818645,-987834226,1001653846,41034189,-2095071181,-443874579,-900899553,-661913596,-1957345904,-661774612,567089588,-310165244,535137026,-1932833443,1430622424,-1910575989,509040344,-66552124,168183435,-1274645056,-31339239,-1328510272,520530524,1203042187,41034189,1595916339,49120094,1562371467,445005,1167120524,518818645,12114062,106859351,-1047846451,-1962742397,1297948645,-1946156342,1430622424,-1910575989,1459730648,-1962254709,1451951694,-2094936824,-443874579,-900899553,50335494,16935937,50335488,17085441,50336000,50606337,50331904]},{"sector":12,"data":[16980225,50336256,17054209,50336512,-16508928,50341632,67439105,50333184,50617601,50376704,17097985,50350592,17033473,50351872,16829441,50353152,16905985,50353920,17071105,50354176,17037825,50354432,16783105,1828740096,1167087646,518818645,-327034738,1448542382,1024214667,192151824,1963004221,8841475,-2096991511,822334,28839029,204251904,6462032,-1070923776,2130884688,-1706012007,112,7772752,1996423168,39118862,-11368823,210517635,722171136,204252096,38705744,-1070923776,2130753616,-1706012007,604,40016464,-1098711040,1962999634,242679569,-1705983957,65535,-385875528,1996423685,112654,-26032,1996423168,105310222,1183573739,81162,-2115435659,146689,742247284,1024095233,57999670,-352243223,242679751,1342256824,198554,-96040704,67745872,1354771280,-6664112,-1962934272,1421249008,-97281,-24404364,1996482513,67745798,1354771280,664424528,-1996488703,1024021637,158728191,156534215,2011758592,-92864513,1342442168,-11225345,-11106675,1704611862,-1929379839,1358911110,1343000248,16777114,-62486272,504139448,-26032,-661979136,-956533109,1996423168,67811334,1419676496,-1846785,-1928768329,1343662150,99994,1451658496,-1924131073,1343662150,16777114,-92864768,1342180280,1347469355,26909264,1996423168,67352826,1421279056,1354771455,28351056,1996423168]},{"sector":13,"data":[67287290,1421279056,1451658751,-1706027265,452,-1191545089,-11533305,738153654,-1706012480,472,-1191545089,-1202716661,726663169,-1706012480,513,737834751,1347440832,16777114,-92864768,16777114,-23533312,-1207535873,726664201,1347440832,238746,1418103040,-49665,2078868341,242679806,1342254264,1342441400,-11231605,-1207966767,-1070921388,-6664112,-385875713,1996488282,78833678,58048523,-2080485911,822334,28839029,204251904,41589328,-1070923776,2130884688,-1706012007,648,42900048,1996423168,110356494,210517635,722171136,204252096,-26032,-1070923776,2130753616,-1706012007,65535,-26032,-320274432,1589652477,49120095,1562371467,707149,-2115204267,1442907884,-1202667477,-1706032511,65535,-17135991,578142219,-1710983425,878,1342457481,1342177720,228250,74907392,232602,-373282048,263717889,-1202708990,1344143878,503939768,216184912,1354256414,949637120,-16777213,750257270,395988993,-1996488701,-44410,918029430,-6664191,-1996488449,-1191226234,1344143896,1347469355,503453624,-91845808,-1202708738,-1706032512,976,-17129845,1962950528,-432603314,5814280,1451658576,-1202710785,-1706033072,65535,91602955,-352321096,-1983894782,1996488262,-26108,1183383552,28856324,-6664192,-2097151745,1962999422,38070531,-1710983425,65535,-16625431,-1191226698,726664193,-491237184]},{"sector":14,"data":[-1706025460,65535,-17135989,-1951906167,1065396318,-1204587264,1344143903,1347469355,503455416,-91845808,-1202708738,-1706032512,65535,-17004857,-2037710848,1183448826,-24721496,-385875714,-1224801907,28901202,-1070903292,-1471771824,-124104674,-1962934268,1191159902,4161704,-202660492,503457976,-1471771824,666390558,-1924129278,385810566,5290064,101292624,-2037579776,-1705967872,1123,-16728448,-385649408,-2033778386,130814,-16742771,36747344,79993424,1183383552,-2133292036,192151615,-243969,-1751450506,-1962934268,1065417822,-385649664,-1014300433,-491237346,-1706025460,1166,-1929322775,1343662662,514344587,79075920,1183645696,-744861526,-1929379836,1343662662,504139448,82025040,-2037579776,1343684438,519849611,105028176,-2037579776,-1202651306,-1706032590,1352,130472075,1451658496,1570394367,-1929379835,1343662662,-11106675,1385844758,-16777210,-1191226186,726664193,1183666368,-1706027350,1307,-16990589,-1958904556,-771818314,1387724774,68008191,1354771280,-11106675,-1717940202,-1996488698,1024021636,108396543,156533959,-1232404480,-422445316,156533899,145654921,-17004801,-1191414017,-1706032588,1559,-1946401143,4161752,1191119732,-59310084,405914,-60912896,1946173312,-15210237,-5742965,1065396294,-1946848000,1065396318,-385649664,-1098645878,1962999550,-432603290,5879816,1451658576,-1202710785,-1706033072,1934]},{"sector":15,"data":[91602955,-352321096,-1983894782,1996488262,46438916,1183383552,28856324,-778416128,-2097151998,1946222206,-37951229,-1929087233,385832582,221821008,817385502,-6664192,-16776961,-1694565706,1756,-1191383319,1344143934,503461816,37140560,-2037559266,1343684352,1342197944,195482,8817920,1186484479,1587171330,-1996488698,-661936058,1946173312,-1471742202,-1929377850,1358889094,422810,1451658496,-1924131073,385810566,-26032,-2037579776,1343684438,504139448,109288016,1996423168,38320296,128621136,1183383552,-2133292120,57933887,-5748993,-1181046666,-1929379833,385832582,-1471771824,1973047326,-16777215,-1191226186,726664205,-2037559104,1343684438,440474,-58291968,-49666,-1224796555,129564500,-1070903292,-17004919,-1706012592,1747,-11356417,1342441400,-16998773,-1207966767,-1070921388,1234849872,-16777209,-1694565706,65535,1577058744,-1034033781,-1957363710,1592558060,-950642943,33481350,74907392,1342256824,463002,-96040704,-1207666945,-1706032852,205,-939768183,16704646,-457798912,-427636994,-2030043138,-1098645788,2081750756,-460929044,-16776962,179894902,-1224781820,-2037514524,1343684258,57242,-359680,-12777355,-385649153,-1635057255,-472776988,156546955,58062347,-2147389463,-72006,1709769589,-494483711,-16776962,-1207376330,-1924136870,385841798,5290064,56138320,-1073020928,28837237,721611520,-28931648]},{"sector":16,"data":[-22903155,210679888,20290128,-661979136,-1929377850,1358865030,16777114,2055638272,-1924131073,385786502,134650448,2122514432,460652798,149305087,1342200760,-17135987,1354256406,-1667608576,184549381,-1207601728,48955393,1183432747,2055638526,-1924131073,385809030,139893328,1996423168,67811578,-459371696,-1948003842,-1979099969,-1728125309,-91845296,-1706027266,2178,-17135987,210679888,155032144,-661979136,-1929377850,1358887558,560282,2055638272,-1924131073,385809030,140941904,-2037579776,1343684474,504139448,144546384,1996423168,67811580,-459371696,-1846786,-1928768329,385809030,191470160,-2037579776,-1705967878,2351,-8747379,-2037559274,1343684346,568730,2055638272,-1202710785,1344143946,678298,-25263360,-16092160,-644217738,-352321534,74907435,-8747379,951603222,-1202708979,-1706033104,1503,-1635052821,-472776988,156546955,-18577782,-18447736,-18577665,-1946270487,1593762438,1575324511,1426064066,-327029621,1187447346,-1207959042,1344143956,503467448,38582352,-2037559266,1343684288,1342197944,664986,-1064923904,1503285502,-1929379831,1358872710,1342332088,620698,-1098479360,-2133292034,125042751,-21068033,-1929377850,1358872710,627610,-1061257216,1634992382,-10975545,-2037710847,-2037776706,-1202651462,-1706032546,2562,-21068151,1065408651,-16288768,-956383610,-1224802297,-1667563846,-16777207,-1694581066,2624]},{"sector":17,"data":[-21068149,-21199223,1065408651,-14912256,-1946239866,520010886,216184912,-191213538,-352321526,1485227782,-956301057,16666246,74907392,1342256824,1342442168,-28395777,-28277107,2040156182,-2097151990,141950970,1979711293,32827651,-28277107,210679888,171088464,-661979136,-1207957562,1344143969,-28277107,1622691862,-1924129278,1343663174,1342197944,272026,-1404662528,40482896,195009104,-661979136,-1929377850,-1705989050,1072,380389005,-26032,1183645696,-1202710868,1344143979,690586,74907392,1342254264,1342442168,-28402037,-1207966767,-2037577388,1343684258,698778,-1404662528,-2037559274,1343684258,722074,74907392,1342254264,1342442168,-28402037,-1207966767,-2037577554,1343684416,755610,1488880384,57999615,-1929333015,385765510,-1064923824,-1706027266,2780,57982987,-1929339159,385826950,-1132033200,-1706025218,65535,57982987,-1929345303,385732230,-1064923824,-1706027266,1148,-36796787,1840795670,-1706025470,2837,-36796787,-2037690346,1344208570,730522,-830042880,-1202710787,1344143983,734874,-830042880,-1924131075,385786502,78027344,2025324544,-1202708990,1344143985,-36796787,-6664170,184549631,-955943488,65094,1358954424,1342184120,-1202667477,1344144000,261018,1317469952,74907646,1342256824,1342442168,-28395777,-10844531,731533334,-2097151998,91619322,1962934077,1518767403,-1900523265,1318735884]}],[{"sector":1,"data":[-1962934268,509656,-10844531,-2037559274,1343684176,705690,1975520000,-24188669,16678531,-2001199500,-1924129278,385765510,-1404662448,1268404246,184549387,-1207601984,48955393,1183432747,-35264002,16678531,1996425333,-26108,-4718592,448286975,-1070903296,43038800,77221918,-1962934259,46292453,-1873273344,-326412987,-2116514274,-1962890516,272436294,1024160769,57999633,-385816855,1996423412,1357838,223976016,-2037841920,-1705967786,65535,242597899,722368255,2056933568,-385875955,-1598553906,-1202708990,1344144025,503486648,-1438216880,1354256406,-23441408,-1929379827,-1202673082,-1706032472,3273,-1946401143,4161752,1191118452,509692,1353336461,843418,1485212928,-1924131073,1343662662,965018,1485212928,-1202710785,1344146574,847514,-59310336,1342352056,903834,-62486272,1065408651,-16550912,1996487750,138779388,-2037579776,1343684440,519849611,244030032,-1224802304,230227798,-1070903292,1485213008,-1706027265,3480,-1207011585,-1706033151,154,-352321096,242679571,-16091393,1996424822,1042440,-1070863637,-1962742397,1297948645,1426066122,1183575179,81160,37555316,1026323456,343146516,1996435691,175570698,1342182584,459162,216748032,33848963,1996429429,108461834,184554984,-16026432,-1070921098,8952400,-443875328,574045,-2115204267,-16702228,163054710,-1070903292,-1706012592,3516,-19102071]},{"sector":2,"data":[1979711293,-373282043,1996424062,67811332,-591986864,1854311934,-1706027265,2088,-9533811,210679888,241277520,1183383552,-958886918,-1900543993,-1706025460,322,-1191557631,1344144045,-9533811,-1397207018,-1924129278,385801862,5290064,153459280,-1098907648,1962999518,-432603314,6338568,-561607344,-1202710786,-1706033072,3820,91602955,-352321096,-1983894782,-1072956346,1996426100,146512390,1760100352,108462079,-18970995,951603222,-1202708979,-1706033104,2260,-1912647959,1358880390,1342354872,947354,-958887168,-2037579769,-1202651426,-1706032457,2102,1065408651,-1928301312,385801862,45725776,-711307234,-1929379826,385801862,247765584,-2037579776,1343684318,16777114,814123264,1975520255,1854311797,-1202710785,1344144062,1004442,-561607424,-1706027266,3934,-9533811,-2037559274,1343684318,986010,-432603392,6404104,-561607344,-1202710786,-1706033072,2023,91602955,-352321096,-1983894782,-2037515194,1343684462,-18970995,1872384022,-2097151985,1946221694,-15013629,-1928956161,-369135994,-1098645726,1998651184,-25564925,-13584641,503496888,-26032,1183383552,-128546314,57983499,-1929341463,385838726,46905424,-1080405986,-1929379831,385801862,172661328,-2037579776,1343684462,-18970995,-895856618,-16777209,-1207376330,-1924136863,385801862,5290064,315660880,-1073020928,28837237,721611520,-62486080,-9533811,-2037559274]},{"sector":3,"data":[1343684318,1077658,-58817792,-16092160,-593885578,-352321518,108461847,-9533811,951603222,-1202708979,-1706033104,4852,-13584641,16777114,-37099264,503502520,47036496,-2101850082,-1202708983,1344146658,1342197944,1260954,108461824,-13584641,-9533811,1183535126,-11526406,1183446622,817299444,-25857,2122514432,57999604,-2097085719,822334,28839029,204251904,286104144,-1070923776,2130884688,-1706012007,4379,287414864,-2037579776,1343684402,-9533811,-1382395882,-1929379828,1358901894,1263258,847678720,-1202710785,1344144094,1089690,-561607424,-524791554,1452953602,-1962934253,509656,-18970995,-1768271850,-1929379826,385823366,-561607344,-1706027266,4272,-13465971,-491237354,-1706025470,4288,-13465971,1183535126,-1706025222,3261,503507896,48543824,-2037559266,1343684402,776090,-28931840,175489035,-1710852353,3062,-4712981,448286975,-1070903296,49526864,194662430,-2097151988,822334,-1070920843,1342975139,1163162,1354771200,-1719729992,-845524910,1342177297,1168282,-196703488,-1034033781,1478361092,-1957345904,-661774612,1024214667,125042960,1946227005,-13046977,1052249718,28856323,-6664192,-16776961,1052249718,-1343729661,242679553,1342389944,802458,-6664192,-16776961,28839542,278548480,721420301,16509376,1024083595,393478145,1946157629,52706674,1996454515,52541454,52672592]},{"sector":4,"data":[-16734999,-504885642,1975520000,13428995,210517635,-1207143168,748879873,-342208500,721420305,45633728,1347590527,1178010,-6664192,-16777199,1978142326,-1942060285,192217100,748929067,848973836,721420288,12079296,1347590527,16538,1184518144,-16777216,-1070920074,207067728,1827340288,688553601,-15961341,616042102,683167747,-2128286973,53217918,1996426355,53065742,53196880,2122387947,1996696842,242679573,1342385336,1342385592,-1710590209,4719,2122394347,1912815114,176062755,477561663,-1207011585,-1202715842,-11533505,-6681994,-16776961,1996426870,9758730,-2097151560,-443874579,-900899553,-1957363702,1458340844,-1207666945,-1202715852,-1202716659,-1924136880,1343663686,649114,-1371108096,-341031287,-2012771762,809282118,960234620,922697342,1689782502,1183666176,-1202710866,-1706033072,3612,175489035,-1710983425,3638,1996429035,-1371108092,951603222,-1202708979,-1706033104,3664,250331179,-1951643905,1065397342,-1196788480,-443875327,180829,-2081649835,146299116,-2125455869,54396030,-55048843,-1207702782,-628358398,-71806894,-1924129278,1343663686,1342197944,817050,-1371108096,211655248,1183645696,-1438217810,51296336,210016848,1183383552,-2133292116,108265535,-961788161,1996423175,330996394,1586167808,4161706,1996426100,53786630,-339506352,108461834,1342387384,503517368,-26032,1183514624,-1438217812,51755088]},{"sector":5,"data":[335583824,1183383552,-2133292116,108265535,-961788161,1996423175,337156778,1586167808,-1744336214,1946182973,7224699,1866270068,-15895552,565708406,599281667,250302467,-1207535873,-1202715871,-1202715869,-1706032350,5217,-1985198453,-1202673082,-1706032361,5233,-1951644023,4161752,1191118452,509612,-1700104449,5257,-1968546165,875403271,-1471772416,679264267,2130707517,108461859,1342383288,1342384312,94914187,468386596,-1207535873,-1202715871,-1202715869,-1695874271,-1207535873,-1202715868,1347420968,1355930,-1404663040,1353336457,1342380472,1360026,-1404663552,1065408651,-16354304,130460742,-1435042048,1366170,-1438217472,465063966,-1706025469,5375,1417003019,-1207535873,-1202715863,-1202715861,-1706032343,5448,-1985198453,-1202673082,-1706032349,4223,-1951644023,4161752,1191118452,509612,-1700104449,4193,-2136318325,1467314239,-1207535873,-1202715860,-1202715859,1391133484,514475659,52279376,580538398,184549397,-15698496,699926134,733499395,716722179,-1952978173,1344186950,503521720,196450896,-1073020928,1944650612,108462079,1342384568,1342385080,-35863,750257782,767053827,-1706012669,4684,-1034033781,-1957363708,720143340,-1207666945,-1202715852,-1202716659,-1924136942,1343680070,1222042,-330905856,1996423969,-327745788,1471130,1975520000,13297923,770459275,205325089,-385649152,-1073545043,-1476448621,1183651369]},{"sector":6,"data":[-1202710810,1344144165,1479834,9693440,384190093,53000272,1183706347,-1202710810,-487914709,384190093,53393488,1183701227,-1202710810,-823459023,384190093,53786704,1183696107,-1202710810,-1159003337,384190093,54179920,1183690987,-1202710810,-1494547651,384190093,54573136,1183685867,-1202710810,-1830091963,384190093,55097424,1183680747,-1202710810,2112422731,-1340760321,-1005209067,-669659627,-334110187,1439253,336988694,-1927930346,1343680070,384190093,262511184,1191116800,-327253524,58655533,-939583511,54455366,1072463489,-13795581,1996424310,-25876,-1073020928,1183533684,54410732,1060964212,-348949501,-700019441,1287147542,-1706025469,4183,503535800,-700019376,1183666198,-1706027282,4309,427147275,-1710983425,4324,1183655147,-1202710826,-840236206,-336836865,-18277,1751120,1354771280,503537336,284924496,-443875328,620937821,-637467904,1862271766,-1275002112,83886338,1845494528,369164051,-402586880,117440773,-1275067648,419495702,-318700800,2080375553,-452918528,2097152769,-872348928,16777999,-1291844864,654376719,-1577057536,671153939,1207960320,687931148,1862337280,369099537,369165056,771752208,-1090452736,570426117,906035968,838861071,-184483072,973078799,2063663872,704643857,-1476328704,989856022,1073808128,-1392508144,-1308556544,771752709,-2046754048,-1342176497,-1895759104,1325400336,1174471424,1157628688,838927104]},{"sector":7,"data":[1191183120,-1744764160,1459618068,-1459551488,1476395285,1308689152,1493172502,-603913472,1509949709,-1593769216,1593835790,-721353984,1610613007,167838464,1476395794,1761673984,1526727441,-1845427456,1543504659,-268369152,1610613523,1392575232,1627390737,2097218304,1644167957,1828782848,1694499605,1937009920,1167087646,518818645,-326903666,205949730,1962938173,8841475,1946226749,17906967,339557236,1028092929,1400111617,1946289213,9627982,-401705217,-1073020775,1996427637,-18418,-26032,28835840,-8787200,28839542,-6664192,-352321281,242679789,-16091393,1996424822,165079048,1996479723,175570702,-16353537,-1847064458,-1194595572,1344146562,-16222465,-6683018,184549631,-1195936576,-1706033104,65535,1996467435,-565801714,-6664170,-16776961,1996426870,-529072162,-15824664,1183649398,-1706027298,65535,-1070889749,-1962742397,1297948645,1426066122,-327029621,1448542350,1342178744,16777114,156410624,16533191,-59340032,-422378831,-771989877,1555562467,-26111,-2071396352,-1802958974,-2071394428,-1802958288,1191119410,-58817540,-2982902,-1207376330,-1924136848,385841286,8435792,25729616,-1073020928,28837237,721611520,-28931648,594919435,-1207666945,-1202716652,726664193,-2037559104,1343684472,111514,-359680,-29554059,-1207601665,48955393,1183432747,1975520254,-432603365,7452680,2022083920,-1202710785,-1706033024,482,91602955]},{"sector":8,"data":[-352321096,-1983894782,-1072955834,1996432245,1357828,67221584,1354771280,-8878451,228216854,-2097151998,175505402,1979711037,112645,-1070923029,201213577,-14977600,-1207376330,-1924136846,385841286,8435792,37526096,-1073020928,28837237,721611520,-28931648,594919435,-1207666945,-1202716652,726664193,-2037559104,1343684472,157594,-359680,-29554059,-1207601665,48955393,1183432747,1975520254,-432603365,7583752,2022083920,-1202710785,-1706033024,662,91602955,-352321096,-1983894782,-1072955834,1996432245,1357828,67221584,1354771280,-8878451,-1046851562,-2097151998,175505402,1979711037,112645,-1070923029,201213577,-14977600,-1207376330,-1924136844,385841286,8435792,49322576,-1073020928,28837237,721611520,-28931648,594919435,-1207666945,-1202716652,726664193,-2037559104,1343684472,203674,-359680,-29554059,-1207601665,48955393,1183432747,1975520254,-432603365,7714824,2022083920,-1202710785,-1706033024,842,91602955,-352321096,-1983894782,-1072955834,1996432245,1357828,67221584,1354771280,-8878451,1973047318,-2097151997,175505402,1979711037,112645,-1070923029,201213577,-14977600,-1207376330,-1924136842,385841286,8435792,61119056,-1073020928,28837237,721611520,-28931648,594919435,-1207666945,-1202716652,726664193,-2037559104,1343684472,249754,-359680,-29554059,-1207601665,48955393,1183432747,1975520254]},{"sector":9,"data":[-432603365,7845896,2022083920,-1202710785,-1706033024,65535,91602955,-352321096,-1983894782,-1072955834,1996432245,1357828,67221584,1354771280,-8878451,-6664170,-2097151745,175505402,1979711037,112645,-1070923029,201213577,-14977600,-1207376330,-1924136840,385841286,8435792,72915536,-1073020928,28837237,721611520,-28931648,594919435,-1207666945,-1202716652,726664193,-2037559104,1343684472,295834,-359680,-29554059,-1207601665,48955393,1183432747,1975520254,-432603365,7976968,2022083920,-1202710785,-1706033024,1651,91602955,-352321096,-1983894782,-1072955834,1996432245,1357828,67221584,1354771280,-8878451,513429526,-2097151995,175505402,1979711037,112645,-1070923029,-113015,-1128790922,-1298509822,-1560281084,1996425764,47233028,79796816,77791232,74907402,1342359224,16777114,221684480,170145535,1342177976,-1202667477,726663215,-224767808,-16777212,-1207303114,726663170,817385664,-1070903296,84515408,922681344,45616438,-1070903296,3192912,1354771280,16777114,74907392,1342182584,1342441400,1347469355,22649424,113704960,2930,-1207648536,-1706033148,1344,145491459,-1207302493,-1706033137,1360,145491499,-1207470429,-1706033132,1372,-1207483229,-1706033143,1384,-1207376733,-1706033141,1396,-1207072093,-1706033140,1408,-1207069533,-1706033149,1420,-1191557495,-1706033131,1433]},{"sector":10,"data":[-9009527,1342180024,16777114,-1037330176,-2046691119,922746742,1891109094,-1706025471,65535,-1207154525,787939364,865668178,-1178457150,-120389630,-1037319629,-9009661,-1559810909,-89979212,206741770,-523040847,734147481,178626,-1036781357,-2043952597,816054134,112763655,-1207239005,787939404,865667696,-1178457150,-120389629,-1037319629,145491459,722141347,-56362426,6600714,175124215,734147481,871945154,63056834,-1559712762,1177224890,112632826,-150963016,-1727369170,-1037319629,-1036781357,100909611,849545388,-96064761,-2096681309,1962999422,-432603366,8042504,207009872,683167774,-1684385792,184549382,-1207601728,48955393,1183432747,1975520254,-432603366,8108040,165328976,683167774,-1013297152,184549382,-1207601728,48955393,1183432747,1975520254,-432603366,8173576,150779984,683167774,-342208512,184549382,-1207601728,48955393,1183432747,1975520254,-432603366,8239112,153466960,683167774,781864960,184549377,-1207601728,48955393,1183432747,1958743038,-373282043,1996423899,-26108,-2037841920,-1202651276,1344146518,949637150,1342177287,474778,165061376,165156489,-9128193,503962296,-1706025392,65535,-26032,-1063059456,-1038710522,74907398,-9128193,16777114,-2113485056,-956265460,302810118,209887488,-1560250363,-2069820282,6161676,-15955805,-2101869450,-1706025460,65535,-150990152,-1324715986,-1543974141,1822624844]},{"sector":11,"data":[169648907,50992291,-1559624186,1889733712,169911051,-1207297885,787939468,-120517550,312735953,17086474,206712567,-120457007,-1962271069,-787999690,7911654,206712567,-2885493,-787884383,302394360,64550666,-1547293753,346098538,-773795576,1921419744,165061119,-9271805,191497731,-1593086301,-120518976,168953387,-956049161,1252247083,113287436,-9271805,206177795,-1593028957,-972878998,-1593123677,103484272,103484268,731449968,66638274,51080198,-1559712762,1252068062,-1547304180,1352731378,1275472652,1879452428,-1037330166,100923601,100863052,-190642004,335988490,-1593835253,103484270,446892052,191537418,135529987,-1593174365,1185090066,169779463,-1593357661,103483928,1218644140,145531143,100917457,100861768,1285752694,1921420039,1174799359,229155591,721898657,721897478,-1727369210,-120470997,122160643,145491459,-1592939869,103483934,379782978,169779464,-1593304413,103483212,413337772,1141244680,-1408892153,136094472,-1559620959,513869510,-895268854,7387142,175124215,-861669165,-1811535098,-1408881907,208136,-1593390941,-523171820,100917457,-1935472954,-1979317491,227582733,1208405153,227713864,227804715,-1592947037,1487079446,135962890,-1593156445,1587742408,1141254922,-1408881913,173712136,-1559620959,379652874,335938312,185508616,721898657,-1559712762,1587612428,185639690,-1559751007,2023951394,148677383,-1559749983,2091060262,148939527]},{"sector":12,"data":[721951905,-1559712762,1520503006,-1408892150,125739784,-1727470431,-120470997,2124531851,-570021113,-1037330168,-1054082863,148768259,51127459,-1559698426,614534184,-1408892148,149070600,722217121,-1559712762,28837754,-1956684288,46292453,-326413056,192028299,-472783919,171096063,170964991,-15947800,-1207294922,-11534334,-1207162314,-1706033151,2597,168048383,1342177976,205272831,1342177720,670362,909573888,178189,-533266608,112652,-26032,-443875328,-1957313699,116163564,138840918,1946157373,146715,-1729559691,1326336,-404159627,1391872,-1763114123,26798336,722106111,-124104512,-2097151990,822334,28839029,204251904,180722256,-1070923776,2130884688,-1706012007,2771,182032976,179830784,1555582976,-1202708991,1344145968,16777114,175570688,-2097064728,822334,-1070920843,1342975139,16777114,1354771200,-1719729992,-6664110,1342177535,16777114,-25263360,-385649664,1996423454,-26102,334036992,175570689,-1705983957,70,-956234263,64582,-1308854645,-1947806974,-1962442108,-1995996012,-1995820924,-16108908,2122579014,-528741636,-81176,-1550185866,-1996488693,-1202652602,-397344769,1996424836,-92864758,770970,12380416,-1207535873,726664201,1347440832,751514,192062208,1979711293,1913046810,-16774901,129500790,163074052,-1070903296,-6664112,-402652929,1048837739,1963133810,335988546,-1593835253,103484270]},{"sector":13,"data":[446892052,191537418,135529987,-16116061,177867382,-1996488697,-1202652602,-397410301,1996424716,375034,100853840,-16091393,1369111158,-2097151993,67859006,113718901,133908,722226849,-1559751674,1252067866,335938316,169255688,-1710590209,3796,1358579337,1342178488,-16399384,96008822,-13440768,1575324510,1426065602,-326898549,-28915944,1187446785,-1962934026,-472779170,-2020940847,-467006928,-129594032,207854160,1183645696,-1924131096,1343682630,16777114,-398029568,-524791786,-1706025471,3186,-772383093,-1964781085,705311111,1183666404,-1734717192,-1929379828,1343678534,385369741,209820240,1183645696,-1202710808,1344143842,829338,-161576192,-472783919,171083658,-1924078550,-1705969594,65535,384321165,-129594032,-6664170,-2097151745,1946222206,31766563,1586188318,-1948003850,503444103,-398029488,-6664170,184549631,-1207601984,48955393,1183432747,-163119106,183926403,921240445,-18177,1751120,1354771280,503442360,190159440,2122514432,141885694,-1710983425,2794,-1034033781,-1957363710,49054700,138840918,1979713597,23324931,781434883,242329599,956966049,393544774,204082943,204095107,-385647616,113705285,3114,-1593754391,1178143236,-16354044,-351519730,-535888008,-532774132,58458124,-956227351,843782,18344192,956966049,393544774,204080895,204095107,-385646801,113705217,3083306,-1593771799,1178143236]},{"sector":14,"data":[-16354044,-351519738,-536412316,-532774132,58667020,-956244759,806150150,13887744,956966049,141886534,204091011,-9115380,956957857,292881478,205270659,1010729740,58458124,-352277271,-533822606,2028538892,170172927,1963214393,705069831,-1997861876,956957857,242549830,205260419,1010729740,2138976268,109274091,-351531808,170172816,1963214393,105286408,-351524189,168075622,1963214393,105286408,-351519581,105286486,-351477597,170172750,1963214393,-16848637,956957857,57934918,-939583255,801798,-1590629632,1178143268,-385649404,77725476,71710986,1055458164,1007077375,-352309236,1812801554,-519196659,219024653,1393440014,-15779826,45614198,614551552,71710986,715195765,-1592726772,1178143236,-1593477884,65735740,1343021217,1342177720,659610,708247296,1010237196,-533266676,163964940,192028299,-472783919,170952585,171087753,-1710590209,2859,-2080487799,750142,1048781684,1946225522,1916699420,359925003,192036483,-1207012344,-1706033136,65535,1954545833,1916177182,-754798325,818315750,-25755894,-16616193,-26060,76087296,-16624503,922746486,-1847063694,175570690,-1694599425,2881,1575324510,1426065602,-326898549,184459534,135532171,-1054088751,184157739,-1577302391,1183386364,184590836,-940030327,65094,-134330741,-1181090706,-101253072,184157699,135529987,-1947056503,-146735546,-140903314,-100269063,335938314]},{"sector":15,"data":[-163149560,-1191282945,-1957691368,-454537023,-1706012152,4082,-375159,1183647350,-11528462,-73729418,-16777201,60488310,-16777200,2122579526,-1669582850,-1980348789,-22941114,-163149558,-1928956161,1343681094,1342189496,1342183608,1342189752,1376294632,275618384,1183383552,-2137370374,-16777200,-2003109258,-2097151984,644158,1996427636,184203270,922701854,-509998636,-1593835504,1183385270,112894452,-940030327,65094,-134330741,-1181090706,-101253071,112461315,135529987,-1947056503,-146735546,-140903314,-1274674183,335938310,-163149560,1342185656,-1191282945,-397410256,1347553307,1095834,-96040704,-1928956161,1343681094,-1694861569,4289,-1694861569,4297,-2080487681,2083585662,-163148901,-1577957751,1183385272,108462070,384976525,2144336,3192912,-790081456,-1706012153,4403,1358579337,1132186,-92864768,1134234,-734100736,292814857,-1207535873,1344145076,164902655,1157786,120496384,-1577826679,1183385394,-28915720,1183514624,-59836418,3258777,100923895,100861740,1183385620,-28931086,-59836608,66713497,50801670,-1995959290,548992582,414732288,1996443648,123070718,-2120593326,-1996488687,1996487238,-230257402,1996443670,294296314,1996423168,294820602,1191116800,-25263106,-1952744400,1183446598,120627698,-637303,1183647350,-1202710798,-1202716640,-1202716648,-397410256,1347553031,1169818,-96040704,304192080,1996423168]},{"sector":16,"data":[311007994,1048772608,1946159572,108461841,503786680,-734593200,-26103,1996423168,-18426,452688,-1034033781,-1957363706,317490156,-1207535873,-1706033151,65535,172635903,172504831,1183386,-163149568,755254923,171835391,-385649152,-1073544022,-1476448621,1996428930,-1976107258,310483468,1183383552,1446445054,1412890378,312056330,1183383552,108462076,503760568,-59310256,16777114,108461824,113653503,113784575,16777114,108461824,113653503,114046719,1200538,108461824,113915647,114046719,1204890,108461824,113915647,1208404129,-26032,1996423168,-1942552826,-1908998387,1211563789,-26100,1996423168,-25755898,16777114,-59310336,16777114,67692800,171063039,170931967,16777114,-62486272,-1207535873,1344146186,-1694730497,4812,-1207535873,1344146186,-1695123713,4828,-1207535873,1344146466,-1694730497,4933,-1207535873,1344146466,-1695123713,4949,-1694730497,4957,-16353537,-16107978,-1710607306,4898,-1980217719,1996487254,153466886,-4698082,179851519,-1202708981,-1706033115,65535,-16353537,1996487286,325950200,1877540864,1312227075,1278672650,330275338,1183383552,108462076,503793336,-59310256,1295002,108461824,503793336,-159973552,1299098,-59310336,1032090,108461824,173160191,173029119,1312154,-129595136,-371063,922682998,922684840,-55046742,508567048,344562256,-1706033152]},{"sector":17,"data":[5263,2122547947,175440644,171849471,171718399,922683627,922683970,412748352,-1996488684,1996487750,168998918,1996443678,333617916,1996423168,168998918,1996443678,334666486,1996423168,169523206,1996443678,338860796,1996423168,169523206,1996443678,339909366,-1930887168,108462078,172373759,172242687,1357210,-129595136,-371063,-16103882,-1710603210,4004,-2080618871,17503294,1996435573,191543302,1996443678,342006518,1996423168,191543302,1996443678,343055094,1996423168,-600375546,-566821110,207009802,1996435179,206223366,1996443678,263690998,1996423168,206223366,1996443678,352164598,1996423168,-231276794,-197722358,165328906,1344163870,465818,-6664192,-16776961,922682998,922683974,1620707908,-1996488683,1451880006,108462064,172635903,172504831,16777114,876019456,1781989127,353016327,1183383552,108462068,135673599,135804671,121779967,121911039,120862463,1347469355,-1174396744,1347551436,1390234,108461824,503846584,-159973552,1394330,876019456,272039687,357734922,1996423168,1479999238,173711626,145491459,1110900560,1144454919,876019463,1354771207,2144336,1375784122,-26032,1996423168,173586438,1996443678,270244598,922681344,1996425012,301898484,1996423168,-260636922,-1695648001,65535,-16353537,1996487286,318020344,283705344,976683005,943128330,322083338,1183383552,108462076,503897272,-59310256]}],[{"sector":1,"data":[1421722,108461824,503897272,-159973552,1428122,108461824,503806136,-59310256,1223834,108461824,-385386312,1996488238,185251846,1996443678,366648054,1996423168,122075142,1996443678,367696630,1996423168,168998918,1996443678,368745206,1996423168,169523206,1996443678,369793782,1996423168,148682758,1996443678,370842358,1996423168,125351942,1996443678,371890934,1996423168,203601926,1996443678,314350326,1996423168,374790,-75044784,1048796907,1963002644,108461832,-352320584,108461830,1342178488,-300056,95946358,1642614784,108462075,1342177976,-305176,129500790,1307070464,108462075,-397361109,1996487492,636934,372945643,317198992,328602997,335090582,321459646,301339489,-1695123713,4836,-1034033781,-1957363708,317490156,1183471191,-1947981308,-126449168,-1962588534,-92370440,-1996077430,-147063226,-963967882,-947191061,1996375611,1995913996,-339309820,-339244281,-28931581,1005864584,-1962642441,-1962742842,-28951609,-147125133,-963967885,-947189781,1183450091,-163149570,-1979699015,-466947002,720787082,-138279946,16713185,-21376469,-1544423679,1183452220,-196724490,113708917,3296,204080839,-454492128,1010729728,629086220,720782986,-1963947036,-125045690,721432761,-1948125242,-775027761,734069737,63933394,-336463922,-163149269,-259267542,-1946925430,767951864,-654900738,-1175566711,-947191760,-503855573,-772911477,734069737]},{"sector":2,"data":[-294193198,-1978867549,-466947002,1183510667,-138007562,-772240424,-297367064,1177273995,-754732552,-297401376,-134753749,-1947187575,-96064570,1174659283,-137221138,-230258185,1177273995,65065982,-768872890,1183447031,-126469636,1177224565,-1977685006,-466947002,1979336251,-263812341,100419115,166395920,737298059,537260102,204120832,92127243,204080771,708739888,92155916,204091011,-1956684240,79846885,-326413056,294531,1182991475,2122526724,74854404,805596803,134512259,1183520115,138816262,84174583,61931524,1174661331,-2094732536,1930953854,105286405,2122521067,275980292,721428665,1183515726,138816262,-739515913,-1962391925,113401317,-326413056,-2096436093,1962935422,16758809,721839863,3193298,1183445495,-129594882,-369736055,2122514596,410458118,84166283,1727463472,1574150,817484331,-1980631296,468449862,-150583669,402981990,-1177408768,-235470800,721833611,72221640,-1946530167,-523172282,-1980086741,-11469754,1183578742,1049864,-13768624,-150929479,1574369,817484331,-1980631296,1996486214,-92864516,-402098433,-4587761,98694912,-768933864,-150982471,-129594895,-231681,1183578742,1060104,-17962928,-150929479,1574369,817484331,-1980631296,1183579718,-754404866,-129627168,-225783253,-527772534,1175175210,1575324662,3016386,9961731,6815747,251396355,6946819,217448707,7274499,218365955,1638655,345964803]},{"sector":3,"data":[65538,298582275,131074,204341251,2162943,359530755,589826,362872835,2490623,306249987,1245186,305201411,1310722,253362435,10092546,328204547,2162690,351076611,2228226,348258563,2949122,10944771,2555907,12583171,2621443,5701891,2752515,214368515,3866625,177471747,11337731,95420675,11403267,66978051,11534339,87032067,11730947,16646403,11796483,179110147,11862019,360579331,4325378,379322627,4521986,246219011,4063235,81461507,4194307,200016131,4325379,255066371,4456451,177864963,4521987,176554243,4653059,205324547,5767169,206307587,5832705,327811331,5898241,9109763,4980739,14745859,5701634,361824515,5308419,119603459,5963778,309723395,5505027,320078083,5570563,175309059,5767171,77791491,5963779,69796099,6619139,125567235,6750211,2004055149,1167087646,518818645,-326903666,205949730,1946226749,17906951,954935668,-401705217,-1073020865,1996426357,-18418,41130576,1996423168,112654,-26032,28835840,-15471872,1996426870,108461834,-402098433,-353697426,-310132693,535137026,181030237,-326413056,-400495485,113706908,1742,16664263,-25263360,-14584576,-1593252298,117376718,-2147154226,850939904,-1202708986,-1706033025,271,91602955,-352321096,-1983894782,850984518,-1202708986,1344144758]},{"sector":4,"data":[16777114,1975520000,-837877828,1354771206,-150975816,1342623278,16777114,170042112,108314635,16678531,-1070922380,-16720919,-1710611914,65535,-1996049757,1187505222,-956301088,57926,922713323,1183516902,8390114,103987280,2142785566,-6664192,-1962934017,1344201798,-16441368,347604086,28856320,-1070903292,-465138864,1620725790,-2097151999,175505402,1979711037,-28915963,1586167809,86548964,1964525369,74907426,1342182584,1342441400,736261887,-1706012480,424,31475399,-498693376,-2096404317,-11869114,-828251578,-498714362,2045313917,-25263105,-385649664,2122579792,477429984,191406920,-1207666945,-1202716652,-11533305,722167862,-1706012480,665,-1207666945,1344144656,-1207798296,-443875327,180829,-2081649835,1183516396,59456776,149488501,-385647103,20775459,1025537024,2054422530,1962939453,12118275,1963165245,29944067,1963165501,30533891,-2097009687,822334,28839029,204251904,37919312,-1070923776,2130884688,-1706012007,592,39230032,1996423168,131262474,58048523,-1711147031,65535,210517635,722171136,204252096,-26032,-1070923776,2130753616,-1706012007,65535,-26032,922681344,-6682078,-16776961,-1710611914,65535,722106111,-6664000,-385875713,1996423596,84981770,-1477947362,175570689,1342182584,1342441400,191379199,1347469355,16777114,25618688,-1207535873,726664201,1347440832,211098]},{"sector":5,"data":[71731456,1979711293,84981765,1253575403,74381056,112330243,-1929623927,1996488286,-397402614,1307115862,175570689,1342409656,1342410168,1342409656,204186,20375808,-1207273729,-1202715765,-1202715763,-404028532,-1207273729,-1202715765,-347077747,175570906,1342410680,1342410936,1342410680,235162,175570688,1342182584,16777114,163074048,-1070903292,-1706012592,65535,1023690377,91619327,-351989576,4896778,50622199,-1996049914,1586297926,175570942,1342411704,-1929623925,2360794,-2103816110,-16777213,-1799878026,1183535107,-27882500,1375742469,61315664,-1645674496,175570688,1342410680,1342410936,-26032,1996423168,60012554,91797584,-6664162,-16776961,-1799878026,2042122243,-924115451,-1207273729,-1202715770,-1202715769,518587270,175570943,1342408376,-385644616,1996488500,60143626,175570768,-26032,-1073020928,28837237,721611520,513429696,-352321531,59522349,-269941899,59588094,-135724171,59719166,-51838091,59784702,1894318965,60112383,-1757562764,-385649405,-443810220,574045,-2081649835,1996425452,59291656,73319504,511180582,-1705983957,65535,-1207404801,-1957690478,1451951174,3540230,1922715730,-16777212,-1984427914,1183535107,106334980,1375746565,76126800,1996423168,59422728,71732048,84301451,1347551302,303258,142016256,1342410424,-1962654069,1040516694,-1706012160,1207,-1207404801,-1957690479,1451951174]},{"sector":6,"data":[4326662,-694529966,-1006632956,-2094660514,1962942591,142016296,1342411704,-1030962293,1375740933,83532368,1996423168,60078088,71732048,84301451,-346947542,142016284,1342411704,503675576,84646480,1996423168,60078088,91994192,815419422,-16777210,-1783101322,1589923843,2013210116,-26078,1589903360,2139301380,276103200,-1207404801,-1202715761,-1202715760,199951247,-1207404801,-1202715761,1347421072,357530,73319424,440896294,208977931,1946157373,146794,350975348,-1207404801,-1202715765,-1202715763,-1706032245,1454,385369741,71732048,84301451,1347551280,395930,73319424,478118694,638022656,35422083,1996441205,59160584,59226192,59160656,99719760,1589903360,2139301380,1735721500,385369741,92059728,-11080930,-1950873482,-1917300733,-1934077949,-6558973,-1950873482,-1917300733,-1897181181,-1207404801,-1202715770,1347421063,190874,73319424,478118694,-1926990589,1343682630,503676600,-26032,1183645696,-1957685512,1451951174,3147014,-6664110,-16776961,-2051536778,1183666179,-1706027272,875,-1034033781,-1957363706,351044588,-1559874888,512494472,1996426122,74907398,-1929326872,1343679558,-1006582040,-1993997218,1183651911,-397404436,1589903543,1200170500,-330920678,-1461170154,73319424,474450214,384583309,10086480,637820612,-1927395447,1343679558,-1006597400,-1993997218,1183653959,-397404436,1589903483,1200170500,-1933341918]},{"sector":7,"data":[2360770,1760055378,71731968,84301451,1347551274,-1962911000,1451951174,3147014,1290293330,71731968,84301451,1347551286,-1962918168,1451951174,3802374,820531282,71731968,84301451,1347551294,-1962925336,1451951174,4326662,350769234,71731968,84301451,1347551302,-1962932504,79846885,-326413056,-1962218365,1451951174,-62486266,-939633015,64070,193470148,541032486,1187452277,-1006632454,638289950,1965047680,-2012807345,-990844149,638289950,1965834112,-2012807361,-2144474357,1946220158,-96024767,2122317824,276111862,-16490812,-970587066,117374983,418057096,193470091,193464063,193595022,-1006138842,1191117918,126363140,193470148,-2012771802,742192710,117422453,2122517384,175374586,-16490812,-970587066,1589911559,130426372,-129579264,552271872,972455552,179840895,-126945536,-237884,-930350010,-1744336346,-377239549,-129070800,654073540,1183319946,2100313334,-129594413,-1034033781,-1957363708,116163564,-1996128072,1586297414,-28915716,1344143360,-106869,-472777146,89819019,922701854,1335493928,-1560281080,1996424488,-92864516,-106869,-472777146,89819019,922701854,1872364842,-1560281080,1996424490,-92864516,-106869,-472777146,89819019,922701854,-1885731540,-1560281080,1996424492,-92864516,-106869,-472777146,89819019,922701854,-1348860626,-1560281080,1996424494,-92864516,-106869,-472777146,89819019,922701854,-811989712]},{"sector":8,"data":[-1560281080,1996424496,-92864516,-106869,-472777146,89819019,922701854,-6683342,-1560280833,1996424498,-92864516,-106869,-472777146,89819019,884494366,508567045,440400,152738384,1996423168,-92864516,-106869,-472777146,89819019,985157662,508567045,440400,155097680,1996423168,-92864516,-106869,-472777146,89819019,1085820958,508567045,440400,157456976,1996423168,-92864516,-106869,-472777146,89819019,1186484254,508567045,243792,159816272,1996423168,-92864516,-106869,-472777146,89819019,1253593118,508567045,243792,162175568,1996423168,-92864516,-106869,-472777146,89819019,1320701982,508567045,243792,164534864,1996423168,-92864516,-106869,-472777146,89819019,1387810846,508567045,243792,166894160,1996423168,-92864516,-106869,-472777146,89819019,1454919710,508567045,243792,-26032,-443875328,-1957313699,-1091796500,-2033756672,130894,-1207666945,-1202716652,726664201,1347440832,77722,-96040704,1962934077,4896805,66744055,-1996049914,-1929426298,-989901666,654264990,-1927776257,385827462,101574736,-2037575445,1343684418,503678392,180460112,1996423168,59488260,175807056,-1073020928,-2033776524,65394,1996431083,59553796,186423888,-1073020928,-2033776524,130930,-2033776917,196466,-9259265,-12024179,-1192734698,74907397,1342408120,378029709,440400,-26032]},{"sector":9,"data":[-2037841920,1183711056,-1924131162,1343653958,362906,-2008642304,-26032,2122317824,1081409672,149305087,1342218424,379995789,5290064,194026064,-1073020928,1996425845,194812420,384499712,-1929087233,1343661638,504182968,3192912,-26032,-2033778688,65358,-1207666945,-1706032249,994,376750091,547782272,-2033776523,262004,-2033770261,130932,-1232398101,2055274320,141893797,-9140537,116064258,-9140537,-1224802304,-2037514380,1343684434,-955975960,130118,-1207666945,-1924136056,1343683654,-1705983957,65535,16547459,922697845,-1581774618,1183666176,-1202710874,-1706033072,148,175489035,-1710983425,65535,1996429035,-1505325820,951603222,-1202708979,-1706033104,2826,-11630905,1996423168,59291652,1418104144,-1202710785,-1706033150,3119,-11237747,181049936,-1098711040,1962999630,-373282043,1996424189,59815940,202086992,-2037841920,-1924071560,1343682630,-16493848,-1783102346,1654280195,-1996488694,1358920326,-11106675,954748950,74907396,1342411704,-8616307,112742422,1436176384,-1996488692,-1912647546,385842310,1354170192,61532415,-1207666945,-1924136044,1343652422,1342179000,817818,1350994176,-2109305345,-1224781802,-2048327856,74907395,1342411448,378422925,178256,211786320,-2037841920,1183711056,-11528562,-385920842,1996424032,59357188,-1840870064,45633558,-996519936,-1996488692,-1912647546,1343656518,-11487489]},{"sector":10,"data":[-16565272,-1900542858,1183666179,-1202710890,-1706033150,3305,-11499895,378947213,1354170192,51833087,-1207666945,-1924136047,1343658566,1342177976,855706,1350994176,-1706652161,-1224781802,-236388528,74907394,1342409400,379471501,178256,179214928,-2037841920,1183711056,-11528546,-385920842,1187447500,-1207959302,1183384967,-1537307486,1586188318,-96010246,-2020875311,1344144730,-12417395,1838829590,-1996488691,-1072955834,1996433524,-1569259612,-369013,-472778170,89819019,-2037559266,1343684424,892570,1958742784,112645,-1070923029,201213577,-14125888,1996465270,-94467166,-772126977,1518832611,-1924129275,385831558,231709264,-1073020928,28837236,721611520,-28931648,678739979,-5998849,1586209398,-96010246,-2020875311,1344144730,-11237747,-6664170,184549389,-1207601984,48955393,1183432747,1958743038,-1535705305,-1952286977,1191180894,-1948003846,503667335,-129594032,815419414,184549390,-1207601984,48955393,1183432747,1958743038,-1535705304,-1952286977,1191180894,-1948003846,503667335,1451658576,-1706027265,3681,91537419,-352321096,-1983894782,-1072955834,1996433524,-1569259612,-369013,-472778170,89819019,-2037559266,1343684476,954778,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166,-772126977,1518832611,-1924129275,1343652422,967066,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166]},{"sector":11,"data":[-772126977,1518832611,-1924129275,1343653958,979354,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166,-772126977,1518832611,-1924129275,1343655494,991642,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166,-772126977,1518832611,-1924129275,1343656518,1003930,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166,-772126977,1518832611,-1924129275,1343657542,16777114,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166,-772126977,1518832611,-1924129275,1343658566,1028506,1958742784,112645,-1070923029,201213577,-14191424,1996465270,-94467166,-772126977,1518832611,-1924129275,1343659590,870298,1958742784,112645,-1070923029,201213577,-16222784,-6683530,-1207959297,-1202651137,726663194,-1934077760,-1706025467,685,1577058744,-1034033781,-1957363710,149717996,294531,1996426101,108461832,-351956552,105286467,-1995942261,1451883078,-129579012,1187446785,-352321282,-94452716,653936383,1948270464,-129579259,1191116800,71732222,2097038905,-125926428,-15698944,1996425334,93632518,1452953630,-1962934262,113401317,-326413056,-1962480509,1451951174,-96040698,-1946397047,-1181153210,-101253110,-1003437440,1191117918,394798596,-1727510901,1183447543,2143292168,73305054,637816575,-1962932282,1451951174,-96061178,1589913203,126494458,-989968760,-1977220002,-94452729]},{"sector":12,"data":[653936383,1589905288,72285956,654198410,-806680696,-1034033781,50339590,51372033,50360064,16828673,50332928,-16000512,50337280,16934913,50333440,16835585,50333696,16932609,50333952,-15742208,50338048,-16633856,50338304,51098625,50331904,-16059904,50341632,17313537,50346240,50346497,50342400,17364481,50346496,17793281,50346752,50468865,50375936,51045889,50376704,50470401,50349312,50465281,50349824,16822529,50353920,17844993,50354176,17178369,50354432,50343425,50354176,50538753,50354944,50617089,50355200,51105793,50355456,50611201,50355712,51082241,50355968,50678017,50356224,50590465,50356480,51114497,50356736,50993409,1828742400,1937208180,1835757164,1818978915,1167087646,518818645,-327034738,-1070923514,42055760,36608592,-2037841920,-1072955572,1996433525,2923014,-1706033152,441,1342588553,1342177720,117914,108461824,121498,-373282048,-1581776444,726670853,-1202696000,1344144800,-11762037,-2135404514,-1046851582,-1962934272,-1979757434,1187510342,-1962934112,1065416798,-2094238464,1946198142,25094403,149305087,1342204088,379733645,5290064,61643344,-1073020928,266929012,112641,-1207890967,1344144810,519587467,95008848,-2037559266,1343684346,1342197944,152986,-91845376,244338942,-2147331096,16710334,-941030539,-1605974272,-2037579775]},{"sector":13,"data":[-1202651398,-1873803854,30795790,-1946532215,4161752,1191119732,-92864518,568856208,-94467326,1946173312,9038083,1344193419,503939768,19438160,2045444096,-11630963,1183535126,-1706025224,848,-11630963,-1900523498,-1706025460,328,-11630963,1183535126,-1706025222,65535,-11630963,95729744,-401698736,-661978777,-16775226,28837494,-1070903292,1317440848,-1706027265,65535,-1191545089,-1873803850,21096462,-1946532215,4161752,1191119732,-92864518,-1914171760,-94467327,1946173312,-8591101,-500085,1065416774,-385649408,-252969275,1183432747,108462076,114586,-6664192,-1996488449,-1202715066,-1706033151,65535,16547459,1996425844,62429702,384499712,-1928956161,1343660614,504182968,3192912,64002640,-1224802304,127598412,-385875966,-1224737213,-1600454836,-1207959550,-310181887,535137026,46812509,-1873273344,-326412987,-2082959842,-1070920468,52541520,-26032,1183383552,1975520244,-339727612,105286521,-1070903266,-1195880368,-1957683707,1344205894,1342382264,165018,-129579264,1183514624,-163149324,-2131337589,812908607,503727755,516131664,96057424,1183666206,-1202710790,-1706033150,65535,1358579341,-1847062896,-92372992,-955091968,129094,-1695254785,65535,-336050549,-161576179,-2131343617,-1334575041,-310119445,535137026,46812509,-1873273344,-326412987,-2082959842,1183517420,-96040696,-2131075445,829685823,-1996077429]},{"sector":14,"data":[-1014236090,-336050551,-128021744,955664010,-15567609,1191181382,-60912648,1183319946,1975519990,-60912668,1962950528,-96040187,1191118315,-2084705286,-443874579,-900899553,1478361092,-1957345904,-661774612,-1962611581,1183385158,-16520196,1586232390,541032700,1183577460,1960327942,-1957683701,-1706025277,65535,-1996077429,65797190,-1946401025,1065417822,-1946848000,-667220410,1325339764,-60912644,1948270464,-62455819,-956539253,-310181881,535137026,46812509,-1873273344,-326412987,-2082959842,922703084,1773668582,1183666176,-1202710868,-1706033072,65535,175489035,-1710852353,65535,1996429035,-1404662522,951603222,-1202708979,-1706029008,65535,-1962742397,1297948645,721610,24117507,7274499,1442051,327681,33227011,458753,32637187,65539,4259843,2556159,3735811,2228227,6488323,3801089,2490627,3014659,9830659,11534339,18219267,5767169,20447491,5832705,2004055149,1802398835,0,5,0,0,1349284931,1818586721,1986356224,1936024425,1852794368,1845523316,1768161391,1735355489,1953392896,1702428780,65651,7562585,1392537422,1299210615,1702065519,1953789250,7564911,1684957559,7567215,1684957559,7567215,1953394531,7106418,1953394531,7106418,1349284931,1818586721,1920287488,1114795891,1802398060,1702125906,1852405504,1937207140,1970226176,1130720354,1801677164]},{"sector":15,"data":[1701146707,1769406564,2003788910,-65421,3866647,59,3145728,1835619433,1852375141,788556916,1631875840,1761633652,7107694,1416822842,6647145,1819569769,5062912,892416371,1852375097,1342205044,846397517,3749171,1819569769,1631873280,1761633652,7107694,1936880963,1816293999,1382772329,6648929,1684957559,7567215,1651863364,1816356204,1399546729,1684366704,1852405504,1937207140,1852405504,1937207140,0,1835039,1966111,1966111,2031647,2031646,2031646,524293,131072,589827,262150,65543,1886216531,1665754476,1459646063,1868852841,1767309431,2003788910,1954047316,1919111936,1651272815,1090548321,1986622563,1953059941,1224762732,1952670062,1415935593,1701606505,1953059840,1700029804,1459647608,1868852841,1634879095,1291871597,7695973,1970169165,1954047316,1667318272,1869768555,6581877,2097184,1869377379,1660973938,1919904879,24838259,26018178,27459991,29032881,30147015,1968046549,1867541612,1996518514,1868852841,29559,1953656688,1677721715,1667855973,29541,1769366884,7562595,2883628,1677721644,1667855973,1769406565,2003788910,2883699,3014700,1986356224,6644585,1684957559,7567215,2883628,1986356224,1936024425,738208768,738208768,1986356224,6644585,1684957559,7567215,1684957559,7567215,1769366884,7562595,1769366884,7562595,1986356224,6644585]},{"sector":16,"data":[1684957559,7567215,2883628,1986356224,1936024425,771763200,1919168000,2556022,1230390596,1330464067,654329156,1819627008,1919897708,1769406580,2003788910,2883699,2883630,1769366884,1996514659,1868852841,1996518263,1868852841,29559,827150147,1329791034,3813965,1953656688,2883699,808464945,738208768,822094848,892219648,738210304,6630400,738225964,875298926,3484672,738211372,942407735,3222528,892219692,3288064,28716,827150147,1329791034,3813965,1953656688,1869611123,7566450,1543527482,704653824,1380205568,1329987670,1163023438,3801171,2883628,1701511226,1818586738,1308646400,1349282933,7631471,1684957559,7567215,1986356224,1936024425,738208768,738209280,1986356224,1936024425,1986356224,1936024425,1701052416,1701013878,1852405504,1937207140,738208768,1986356224,6644585,1684957559,7567215,1684957559,7567215,1986356224,1936024425,11264,1953394534,3014771,1986356224,1936024425,1701052416,1701013878,2883699,2883628,1543527424,1711287808,1937010287,1701052416,1701013878,2883699,2883628,1986356224,1936024425,1986356224,1936024425,1701052416,1701013878,1852405504,1937207140,738208768,1701052416,1701013878,1852405504,1937207140,1852405504,1937207140,1986356224,1936024425,1711287808,1937010287,1852794368,29556,1953394534,1711276147,1937010287,1868955648,7566446,1953394534,1868955763]},{"sector":17,"data":[7566446,1130954798,1953396079,1761638770,1702125892,1967352064,1852142194,1761638755,1768384836,1761637236,1701669204,2051827968,7303781,892416371,846397497,3749171,1920287603,1668179314,1416822905,1937076072,6581857,1667581043,1818324329,1631875840,1929405812,1701669204,1766617856,29811,0,0,0,0,0,0,1,131072,0,19777,1297088512,0,36,2883584,3014656,3080192,3801088,2883584,77987840,78972079,80151743,81003725,81790170,83100906,84083965,2753801,0,2097184,1819569769,1761619968,7107694,1819569769,2236928,2236450,0,0,1986356224,1936024425,1701052416,1701013878,2883699,2883628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,390070272,392173400,1953306540,1819506547,1668115310,257,4194304,524352,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,1792,0,1792]}],[{"sector":1,"data":[0,1792,0,1792,0,1792,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12582912,0,12582912,0,12582912,0,12582912,0,12582912,0,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-12648448]},{"sector":2,"data":[-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,3670271,16128,3670023,16128,-13041657,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,3670247,16128,3670023,16128,-12648441,-1,-12648193,-1,-12648193,-1,-12648193,-1,3670271,16128,3670023,16128,-13041657,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,-13041433,-12632065,3670247,16128,3670023,16128,-12648441,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,-12648193,-1,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,2097409,4194337,524352]},{"sector":3,"data":[0,0,0,0,0,0,0,0,0,65281,0,65281,0,65281,0,65281,0,65281,0,65281,0,0,0,0,0,0,0,0,14688000,0,15744768,0,16285440,0,16580352,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16711425,0,16580352,0,16285440,0,15744768,0,14688000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680]},{"sector":4,"data":[16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,-16711680,16318463,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,0,8390400,1953300480,1936607504,1819042164,1869182049,33554542,1684291840,2003127840,1769099296,1919251566,3026478,1140851456,1952803941,1917853797,1702129257,774778482,589824,543450177,544695630,1953394502,3026478,1140853376]},{"sector":5,"data":[1952803941,1866866789,774796398,1393557550,1886745701,65536,1852731203,1769235301,779316847,11822,1917845508,1702129257,774778482,360448,1835888451,1667853941,1869182049,1344303982,779383407,-1879036370,1717924432,1852142181,7562595,1392510592,1701147235,1866670190,1936879468,3026478,-2143289344,167778585,-1912557568,0,524296,524408,10,1132613634,1970105711,1633905006,1852795252,1699946611,1852404852,29543,1441800,524332,10,1350717442,7631471,335559680,201335808,67321344,-2142240256,827150147,1879048250,603984896,1056967680,1027,1329823824,3813965,637536256,134228992,2560,-2108685824,1685414210,1952535072,14949,2359356,786461,820,8474755,905971712,134228992,2560,-2108685824,1685221207,1852132384,6845543,872430592,201332736,67314688,-2142240256,1342177332,402666496,620760064,1027,3506256,872441856,201332736,67315200,-2142240768,-2147483594,402666496,654314496,1027,3637328,872454144,201332736,67315712,-2142240768,134217784,738215424,167774208,33554432,1632666192,2037672306,3932160,2359364,52494348,1342308356,1702249856,1610612846,603997184,570428416,1027,1682931792,-2080374684,603997184,587205632,1027,1867415632,25966,5636104,524332,10,1401049090,544239476,1937008962,3932160,2097236]},{"sector":6,"data":[53018636,1342308356,12672,5505120,786464,262954,830492672,13614,5505156,786464,262955,847269888,524288,2883686,655368,1342308352,1851869314,1634235236,25963,6553660,786484,262956,1216368642,2003071585,6648417,1677750272,201339904,67316992,-2142240768,1701736270,2424832,2097272,65550,1342373889,7032704,2013293312,234889216,512,-2142240000,1668178243,27749,2004055149,1802398835,1802134381,-2143289344,419436804,1073789952,0,393224,524356,10,1149390850,1969317477,1344304236,1953393010,29285,1179656,2621572,196628,1149456547,1969317477,1344304236,1953393010,29285,1310868,917536,65537,1333809155,-1811939221,536881664,33558016,50331648,1631813712,1818583918,1953300480,1819506547,-2143289344,419436806,1409338368,0,393224,524320,10,1350717442,1953393010,29285,393364,524332,10,1132613634,1701736047,1869182051,134217838,-2080370176,905979904,-1560280831,1866695504,1667591790,1852795252,9699328,3145746,19660840,1352859649,1852785539,1952671086,7237481,1073753856,234889216,16777472,-2142240000,27471,4194429,917536,2,1132482563,1701015137,1828716652,1937208180,1835757164,1818978915,1350565888,10,1744871424,0,524300,1703996,459152,1417695235]},{"sector":7,"data":[6647145,134241792,436219904,117545472,-2142240000,1702125892,524288,4456488,28180532,1342177287,1920287616,544370547,1852402754,201326699,1006649344,-1543500800,50332161,1919112016,1114401903,29281,872418304,134221824,2560,-2108685824,2003790931,3670016,1048628,655368,1342308352,1935754882,1409286260,1140860928,-1040174080,1793,1866760272,1701601909,1768702752,27491,4194392,786492,131512,1666404355,1819045746,7496002,5767168,1048628,655368,1342308352,1869370242,-2080374665,268448768,167774208,33554432,1632010832,29811,2004055149,-2143289344,167778572,-1946088448,0,393224,524352,10,1401049090,1701147235,1866670190,1936879468,524288,7864338,1310760,1352859649,1919112067,544105829,1869377347,29554,4980744,524312,10,1216499714,25973,4980772,786524,131772,1666404355,1819045746,7496002,524288,1572964,655368,1342308352,1769095810,7628903,1677730816,201350144,33738752,1397752576,1819243107,1918976620,134217728,402684928,167774208,33554432,1866695248,7499628,2080384000,201350144,33736192,1397752576,1819243107,1918976620,-1946157056,2013267456,167774208,33554432,1632862800,1701605485,9175040,2097270,65550,1342373889,7032704,1979758592,234889216,5376,-2142240000,1702061394,-469761932,536901120]},{"sector":8,"data":[33558016,50331648,1631813712,1818583918,1953300480,1819506547,1668115310,1936485226,-1874853888,419436804,1040227328,0,524296,524340,10,1300385794,1702065519,1953517344,1936617321,524288,9175060,9830412,1342373890,1717914752,1769090932,544499815,1937076077,1969365093,1852798068,2004033651,1701867617,603979876,536881152,16780800,50331904,1800372304,5767168,2097192,131086,1342373888,1851868032,7103843,1937009920,1852601207,-1874853888,100664867,-1644099072,0,393222,524356,10,1132613634,1953396079,1394637170,1769239653,7563118,301991424,671116288,16782336,-2091867392,1853189955,544830068,1953785171,1936158313,7864320,9175054,655404,1342177287,1835619456,1866866789,1952542066,8126464,2621466,59703308,1342308356,540160384,1920298856,8126464,2621482,59768844,1342177284,540291712,1920298856,11141120,1310748,655368,1342308352,976302466,14645,1704128,786450,915,8474755,469817344,134222848,2560,-2108685824,893006642,-301989831,301996544,-1811936256,-2097151997,33104,2883754,524328,10,1401049090,1918988389,1919906913,-738197446,167782912,-1862267904,-2097151997,33104,4194310,2883692,458762,1149259776,543519841,1836216134,29793,4980746,786456,263051,1300254722,22852,4980784,786456]},{"sector":9,"data":[263052,1149259776,22861,4980822,786456,263053,1501581312,17485,6160394,524328,10,1401049090,1918988389,1919906913,872415290,167795712,-1912599552,-2097151997,33104,4194424,3670156,458762,1317031936,1700949365,1866866802,1952542066,8126464,2097230,655368,1342308352,808464770,14896,4980894,786442,914,8474755,1543535616,134225920,2560,-2108685824,1768121668,980181357,10354688,655450,59310092,1350762496,2080374913,536898048,167774208,33554432,1766621776,3830899,1744870912,201329152,231936,-2125430016,11796480,3932244,655368,1342308352,1667581058,1818324329,1734960160,980644969,15859712,655442,59244556,1350762496,-1275068287,1006658560,-1795159040,50332163,1699512400,1852400737,1700405351,28530,8126584,1835148,458762,1132482560,1701999221,544826222,1836216134,29793,9044092,524316,10,1401049090,1868721529,14956,8913050,786450,901,8474755,-2013219840,201335808,67339776,-2142240256,1717924432,30825,8913116,786468,263047,1400918016,1768318581,100663416,536903680,16780800,50331904,1800372304,2883584,2097280,60227598,1342373888,1936020096,29797,8388690,917536,2,1132482563,1701015137,1828716652,1937208180,1835757164,-2143289344,419436810,1509993472]},{"sector":10,"data":[524296,524352,230,8540162,335546368,134243328,2560,-2108685824,1702063689,1948284018,1679844712,543912809,1752459639,1701344288,1811939360,805311488,-100661248,33554432,33360,1835016,524396,10,2038583298,1998615919,543716201,1629515636,1763730532,544175214,1986622052,8293,1835124,524292,240,8540162,469792768,134228992,2560,-2108685824,1919885356,1869112096,6648687,603981824,134257664,2560,-2108685824,1629515361,1919251564,1769234798,1679844726,1702259058,1919509551,1869898597,3832178,805308416,201366528,-2147476992,-2125430016,2359296,2097220,65550,1342373889,7032704,1140877312,234889216,512,-2142240000,1668178243,27749,-2143289344,7,1107360768,0,524296,524392,230,8540162,335546368,671128576,16782336,-2091867392,7340032,5242888,16384008,1342308354,8322,393408,786484,524287,8540160,134267136,134230528,16833536,-2108685824,11272192,2097198,65550,1342373889,-738197376,536882688,33558016,50331648,1631813712,1818583918,1953300480,-2143289344,419436806,1208007680,0,524296,524460,250,8540162,301991936,134261760,66560,-2108685824,524288,11272222,1703948,1350762624,385876097,536883712,100666880,50331904,1700364368,1308622963,536883712,117444096]},{"sector":11,"data":[50331648,1867415632,8716288,2097202,131086,1342373888,1851868032,7103843,1937009920,1852601207,1784900971,1685285995,-1874853888,285218310,1258328064,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,1852793730,1819243124,0,9437198,-65528,1342308353,1852785538,1819243124,1851871264,27749,2228262,524352,131071,1451380738,1769173605,824209007,3223598,788530432,151028736,33554176,-2108685824,2037411651,1751607666,547954804,892877105,1766662188,1936683619,544499311,1886547779,889192494,536886016,16780800,50331904,1800372304,1953300480,1819506547,1953451538,1869505824,543713141,1869440365,221149554,1953394499,543977330,1701732688,1816206956,1684104562,1970413689,1852403310,1866670183,1869771886,1632641132,778855790,1868710152,774796405,1867319342,778400629,1411001902,1830842223,544829025,1668246627,1864397675,1769218162,1936876909,1163133998,1308906579,73756271,544108320,1380199940,1177420886,1125338703,1953396079,1394637170,1769239653,779315054,11822,1953300480,1684291851,1769099296,1919251566,1769107468,1919251566,1818846752,977339237,1867388764,1769107488,1919251566,1818846752,1713402725,1684960623,1983975982,1634494817,543517794,1852404304,1936876916,1769099278,1919251566,1818838560,52443749,493118529,2037411651]},{"sector":12,"data":[1936941344,1634296687,543450484,1852404336,544367988,1701603686,1869878048,1769104416,1680827766,1667592809,2037542772,1631785786,1953459822,1684300064,1769107488,1919251566,46,1828716544,1937208180,1835757164,1818575886,543519845,1852404304,242378100,1852404304,544367988,1701603654,1141252154,1952803941,1750280293,1684370017,1769107488,1919251566,1818846752,1769414757,1847618668,1646294127,1701060709,1702126956,1142894180,1952803941,1935745125,1768124275,1684370529,1769107488,1919251566,1818846752,1712660581,544042866,1986622052,1768173413,1952671090,981037679,544165405,1986622052,1768173413,1952671090,544830063,1667592307,1701406313,1124871780,1869508193,1768300660,237003886,1852727619,1679848559,1952803941,8293,0,1937009920,1852601207,1784900971,1684291848,1852786208,1868958068,1713402990,56978537,341588545,1713401678,544501359,1701603686,1868963955,778333813,1635139855,1650551913,1176528236,1937010287,1852786187,1766203508,540697964,1684291843,1886339866,1935745145,1768124275,1684370529,1852794400,1768300660,320890220,1679847284,1702259058,1919509551,1869898597,272267634,1852727619,1629516911,1713398884,779382383,0,1953300480,1819506547,1668115310,1936485226,544165395,1953394534,1852383347,1818326131,778331500,1818575883,543519845,1953394502,1852786187,1766203508,540697964,1818575878,476410981,1701602628,1629513076,1668248435]},{"sector":13,"data":[1702125929,1868963940,1713402990,543517801,1869768213,1919164525,795178601,1701996900,1919906915,1310538361,1919164527,795178601,1701996900,1919906915,1886593145,1718182757,778331497,1851867916,544501614,1684957542,1631784480,1953459822,1818584096,543519845,0,1828716544,1937208180,1835757164,1851867931,544501614,2037411683,1818846752,1869881445,1937008928,778464357,1953451551,1869505824,543713141,1869440365,1948285298,1868767343,1713404272,778398825,1953451550,1869505824,543713141,1802725732,1634759456,1948280163,1868767343,237009264,1852727619,1663071343,1952540018,8293,1310392320,1869619311,544437362,1953720684,1763730533,1230446702,1313418830,1310076489,1919950959,1702129257,1763734386,1635021678,1684368492,1631785262,1953459822,1986095136,1868701797,86009972,1684955424,32,1937009920,1769099299,1919251566,1818846752,1869488229,1768693876,1684370547,544106784,776882519,776556105,1763714846,1869488243,543236212,1768710518,1919950948,1702129257,1768300658,3040620,1867388416,543236212,1768710518,1633820772,1914725493,778400865,369098752,1881173838,1953393010,544436837,1953721961,1701604449,1126575716,1869508193,1701978228,1685221219,2003136032,1952805664,1735289204,1852383347,1313429280,1229867310,46,1828716544,1937208180,1835757164,1818978915,1852397329,544698212,1801675074,1970238055,1460364398,1868852841,1700012151,1393259640]},{"sector":14,"data":[1819243107,1631723628,1091597170,1986622563,1767120997,543517812,309485890,1667329609,1702259060,1953059872,1109419372,1410232929,1701606505,1918976544,2019906592,1767312500,2003788910,1634879008,1292395885,544566885,158490946,1970169165,2019906592,1666388340,1852138866,1667318304,1869768555,107245173,1769235265,1225287030,1952670062,174421609,1701603654,1682251808,1460565097,1868852841,1700012151,538997880,1828716576,1937208180,544165405,1920103779,2036559461,1836675872,543977314,1667592307,1701406313,1311190628,1700949365,1718558834,1667589152,1818324329,1734960160,544437353,544501614,1667592307,1701406313,11876,0,0,0,2004055149,1802398835,1802134381,1395545396,741228846,538976288,538976288,741416992,808202272,808202796,539766828,539774273,539774288,740565024,741223468,742009903,1632252972,745431408,538976288,538976288,825761824,741482540,741485616,741354544,743260448,743264288,-1524621280,774646828,975974188,1312042028,1701344357,1851878514,539784036,857743392,824192049,841756716,824979756,555753516,555753516,1713381420,741223532,741157932,876293178,1735157058,745370985,538976288,538976288,539767347,741551153,741420082,538979377,538979361,538979361,539772448,791424044,992754220,1634879028,744842094,538976288,538976288,741552928,858534176,824980012,539767084,539762976,539762976,742793248]},{"sector":15,"data":[741092384,742009903,1884501051,745433441,538976288,538976288,875765792,741417004,741485619,741420081,740368416,740368416,1937002528,741092908,975974188,1228159788,2037145972,538976300,538976288,857743392,824192057,808202796,824979756,555753516,555753516,1277173804,741223470,741289004,876293178,1953068883,1819436410,744779361,538976288,539767092,741485617,741420082,538979377,538979361,538979361,774656582,774646828,992751148,1768838452,543450484,1735289163,745369444,741618720,808202528,824980012,539767084,539762976,539762976,748888096,741223468,742009901,1698968620,1918987630,538979435,538976288,892608544,741417004,741485619,741420081,740368416,740368416,1380655136,741092908,774647596,1395931948,1701078391,538979438,538976288,874520608,824192054,841757228,824979756,555753516,555753516,1260396588,741223506,741157932,876293166,2003988302,539785569,538976288,538976288,539768628,741485617,741420082,538979377,538979361,538979361,774656587,791424044,992751148,1936021300,1699160180,1851878770,538979449,741946400,858534176,824980012,539767084,1428955424,539783784,743261216,741092398,741223470,1967207483,1634890867,744581484,538976288,825630752,741417004,741485616,741420081,740368416,740368416,606085152,774646828,975973676,1177824300,1634496105,539780206,538976288,892543008,824192056,841757484]},{"sector":16,"data":[824979756,555753516,555753516,1293951020,740305995,741157932,876293178,1701344335,1866670194,1920233077,538979449,539766816,741354544,741354546,1092627504,1344285773,538979405,741090336,791424556,741095980,10753,0,0,0,1937009920,1852601207,1784900971,1685285995,0,2035482624,1835365491,7680,812801,694364160,1886339872,1734963833,1109423208,1953723497,1835099506,1668172064,959520814,539898936,543976513,1751607666,1914729332,1919251301,778331510,0,520093696,1090525952,2560,0,26214400,201328895,536576,-33488888,16654111,0,3166,0,1919243264,1634625901,108,0,184353024,1663565824,1866670121,1769109872,544499815,1937008962,1634038388,1850286189,824192611,775174201,1819033888,1734963744,544437352,1702061426,1684371058,46,0,4718623,655456,131072,-1879048192,524289,134217740,536872960,-536846081,0,718336,0,30208,469762048,806888556,806099000,0,203294208,2117090364,1010597388,0,410795008,2121809020,1013333118,1667261958,1014774883,1719549052,1717986150,1012939902,3670032,393312,408944670,7888908,0,0,0,1880624640,115,0,0,0,0,0,0,0,0,1711291392,2120629784]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[1142968148,538976335,538976288,538976288,538976288,1230131232,1414091343,1393167705,544239464,544370534,544695662,1953068403,538976288,538976288,1342836034,1701736296,1852138528,1953720692,538976288,538976288,538976288,1409944899,543517537,544366947,1713401449,1948283503,1969581685,538976368,1292504385,543517537,1851878512,1701978213,1987208563,1869182049,538976366,1342836034,543908713,1948282997,1952540008,1948283493,1701536617,538997620,537529666,1866997792,1970086007,222259299,1852785418,1952670068,1634038304,1919906924,538976288,538976288,222437408,1701593866,1730178657,1734439521,538976357,538976288,538976288,222502944,2003782922,2002873376,538976366,538976288,538976288,538976288,222437408,1634488330,1886593134,1735289202,1918986016,544105828,538976288,222437408,1751339786,1819632741,1635131493,1769234787,538996335,538976288,222371872,1634030090,1461854308,1629516385,1344300142,1701011813,538976290,222502944,1769101066,1193305460,1684955506,538993005,538976288,538976288,222502944,2037727754,1701998624,1953391987,1919903264,1918979360,543254644,222437408,1818317834,1869881451,1701987872,538976356,538976288,538976288,222437408,1801540618,1970217061,1634148468,1734435442,538976357,538976288,222437408,1818313482,1768956012,544173665,1701737844,538976370,538976288,222502944,10]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[14703181,31,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":16,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":17,"data":[279886,12583297,191782519,655366,268437504,68348,655360,262154,4194430,22282384,23527775,1601,262174,0,0,0,222625900,222687600,74187104,74248560,64487860,64549168,122094081,122155312,38994567,39121200,115016367,115142960,82379565,82506032,23724935,23851312,25953186,26014000,28705725,50987281,-2147287036,1,64618496,-265289663,32769,-2147221504,1,68878336,-265289714,32769,-2147155968,6,69795840,-265289719,32769,70385664,-265289719,32777,70975488,-265289710,32778,72155136,-265289720,32770,72679424,-265289721,32772,73138176,-265289720,32780,-2147090432,3,73662464,-265289720,32769,74186752,-265289706,32770,75628544,-265289725,32771,-2146893824,1,75825152,1048578,188,0,1229016327,1128481102,1414483463,1145131077,16777216,201328640,4352,1380272902,55330126,71910471,1380275029,1497713416,1380011842,33489220,-2130624563,16777476,1070399999,67108868,33496064,409549,1070399744,16976646,-2063122483,1070399744,16806659,212941,1070399488,66307,1762017229,1070399491,5,1158037453,1070399493,73478,-1459339315,1070399489,255748,475085,1070399488,402692,-2130559027,1070399488,215042,606157,1070399488]}],[{"sector":1,"data":[66568,922828749,1070399496,431620,-721338419,1070399495,648705,1006714829,1070399498,686849,-1626914867,1070399491,296711,540621,1070399488,254465,1766663424,1936683619,544499311,1684957527,544438127,1702129486,543449456,1819308097,1952539497,7237481,1347291392,1346653783,21188434,1313212160,1431257665,184551764,1111576134,1347703375,205737810,1313213952,1380926017,1196180564,1129271888,1141440523,1313228620,1313165391,1174929418,1447121742,55787845,1313211904,1145981254,1291845640,-2081649835,1048776428,1946157088,439811857,1354771200,112720,-26032,922681344,146276378,45633536,1183535104,994566,71732048,1342178349,1342177720,16777114,1575324416,1426065090,-327029621,1183514768,736520,1139344245,-385647103,19727059,605440,-404159626,-1816132862,497549102,112643,-26032,113704960,10485790,-385875528,-1070923007,-401698736,-1073020076,922742388,922681982,28835864,263737344,280514560,314068992,922701824,-2135424890,-2037559296,-1202651276,-1202716022,-1706032520,65535,1039419017,477495295,1586943,3946239,5125887,-9140595,3192912,-401698736,-1729427631,16023171,1048810100,1979646584,406257474,1010237184,1954974976,922702079,616038444,244338688,1023879400,57933830,-38423,-1711110090,65535,-9140595,-1967632362,-1202708990,-1706029056,65535,-1929217885,1358918790,16777114]},{"sector":2,"data":[-12785408,1851011,-1207340032,-1202716670,971702273,1586943,1342293176,-1705983957,65535,-58903,-1207952842,726664193,-4566848,-1706012033,459,-2130771479,153150,163057269,79187968,-51884032,-18028287,16777114,-18552576,1342180024,-352320072,1095912,-26032,-1073020928,62391677,-1207702781,1183384320,439811848,67155968,1354771280,-1415950256,-1996488702,1451882054,1976581112,-22746877,16777114,1887865088,1745407,-9402823,413207668,1887844608,-385649409,2122448518,1963131400,-18416,-26032,-1073020928,1877541749,439812094,142016256,1347469355,-26032,1541996544,1354771454,16777114,-28251904,1718015,1342445496,1347469355,-2080426007,8254,1152910709,-1207702784,12189892,-1706012080,65535,343195659,2113155,-1207601920,48955393,547602475,-32446208,1586943,3946239,5650175,1542045739,1745406,1946437177,-34281213,17202817,-14060282,721426486,922702016,347602970,246960129,-1070903292,-6664112,1342177535,1342177720,16777114,-37426944,33980033,-385649658,922746298,28835864,922701824,364380186,-1697977599,65535,200951433,-385647424,-63046246,-1593477633,250282064,-67469693,1386284405,-1593578752,1183383626,406257660,1010237184,1048793088,1946157084,3318022,-1191328279,-1075248700,1258374397,1342277121,1342394371,2130798339,-2046791423,998656,1223230325,1025081343,57999372]},{"sector":3,"data":[1040114409,57999373,1040079593,-2022440946,871088171,1962941245,-18618109,423430783,-385649408,-387186998,2080571453,50413027,1223230335,50478590,1609106293,50544126,954794869,-1949701122,146955749,-326413056,-16585597,721583670,1996443840,406257414,73304832,-472783919,9091071,8959999,16777114,-28931840,1979711293,406257436,1010237184,909573888,1354771200,1343238328,1659375248,-339727612,-28931325,-1034033781,1478361092,-1957345904,-661774612,-955978621,130118,1718015,1342441656,1347469355,84384336,-1039466496,922705780,922681368,922681404,1048772656,1946157084,3318021,-994573333,2122534913,91488262,-351272776,213920514,244338723,-1996227352,104725574,-2094631680,7230,45616500,28856320,954748928,-14685185,-1207953354,726663620,1620725952,-352321535,-58817779,-1207602174,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2082959842,1183526124,1064204,-2132212875,-385649152,37552565,1030452224,57999365,1023458281,57999366,1023446761,57999367,1023447017,913571848,1962938173,12904707,-2097044247,1963657854,702478,374864,-21895088,-16689687,1996426870,175570700,-16222465,2140800630,-385875962,922681662,1996423194,175570700,-16222465,2140800630,-385875961,-1070923482,-26032,468254720,1354771201,-1041756528,1975520254,17623299,1586943,16777114,16836864,1342177720,-1511518576,1877580286]},{"sector":4,"data":[176063233,-385649663,922681578,1352269848,184549383,-385649472,922681562,-6684646,-385875713,1183514830,1958742794,81168,-85392523,146688,-1209465996,242679552,-16353537,2011695222,11069946,-1928431873,1343673926,16777114,242679552,383141517,-26032,-1947664384,439811840,-163148544,-6664170,-2097151745,2131232382,105301767,283836416,134639235,972703371,75236934,105285960,34111107,1187448703,-352321528,141460240,-62485758,2080917049,1183401988,439811848,209125120,-16091393,1996425334,35559942,753598464,-352156184,1745191,1963345465,142508324,494208256,1586943,3946239,3553023,-1202667477,-1873805264,33810446,82427947,242679807,-16091393,1996425334,-100669434,-394936309,-1779954032,1038215939,57999634,2013163753,1129768,-806812811,1719806,289268340,-6392831,1996426870,175570700,-16222465,-6683018,-352321281,18234667,2078868341,1024423935,-613285612,1996559677,-27596541,20828651,-385649406,71171843,-385649406,-1075052805,-1962742397,1297948645,1426066122,-326898549,209125146,-16091393,1996425334,74907398,16777114,1975520000,-339727559,406257483,1312227072,-431583998,-6664170,184549631,-1927318080,1343678022,16777114,-431584000,2811984,175423499,384190093,-26032,1183645696,726669030,1347440832,16777114,1975520000,-364475464,-1034033781,-1957363702,82609132,-1593549173,121176090,-1947663500]},{"sector":5,"data":[41910528,57934082,-16743959,-1711269834,65535,1953873931,2113155,-1955760896,2139292766,1685325828,218398595,922705524,297271322,-4698108,-1070903041,-1550167984,989855751,1912610310,1354771212,16777114,-339727616,439811898,964608,1354771280,2023379024,184549377,2132901074,1073757445,922688114,922681368,922681404,-1070923722,3192912,-401698736,-974454675,-1962933832,46292453,-1873273344,-326412987,-2116514274,-2097085204,7230,1183517301,-1706025466,65535,-1710852353,65535,-17004919,-16873843,950095894,-1706025472,2073,-2037690286,1344208636,545178,406257408,-24736512,-1706027266,65535,-1962742397,1297948645,503317194,1430622296,-1910575989,116163032,-24736511,-1957685506,1344145990,551834,-91846400,-57243138,142509054,1376547840,138840912,-6664162,-16776961,-2037576074,1343684350,504120971,108461904,16777114,49120000,1562371467,707149,-2081649835,922684140,12058650,-1070903292,-1706012592,2346,-1980217719,-801375658,28837237,721611520,-62486080,1586943,582042,28856320,-342208512,1342177288,1342374072,-1694730497,2296,1586943,590234,28856320,194662400,1342177289,1342374328,-1694730497,2328,1586943,603802,28856320,1083854848,1342177289,1342374840,-1694730497,2392,1718015,1342445240,1347469355,67279440,1183383552,406257662,157391360,-1202716672,-1706033151]},{"sector":6,"data":[2411,1685584,-25263280,721712128,-1207702592,-1706033151,2526,1586943,640922,28856320,-778416128,1342177289,1342184376,2113155,-1207602176,48955400,-1705983957,65535,33310407,406257408,-26112,-1073020928,1187457140,-352321290,-159481075,-955812607,64582,1996427243,-25866,1183383552,1975520246,-25884,922681344,-124125160,1342177289,1342177720,16777114,45633536,1996443651,170564348,-443875328,1478411101,-1957345904,-661774612,-16061309,-1711269834,65535,-1694742903,65535,200951433,-15958592,247004278,28856320,-15602944,-6620554,-16776961,247004278,-1070903296,-26032,-6684672,-2097151745,-443874579,-884122337,1167120524,518818645,1465309326,-1962851167,-1962850786,-1962850290,-134133226,1151541709,1176406273,1208912129,1242990849,47105,-789118349,-310157729,535137026,-1932833443,1430622424,-1910575989,142016472,-16353537,1996425334,-26106,-987889664,1102317142,41034189,1344258099,-16222465,1996424822,108461832,16777114,-310159360,535137026,80366941,0,0,0,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,1577502507,-1996488703,1459703822,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-74455033,27322448,-850591816,-1957313759,-18196,-1957313699]},{"sector":7,"data":[-18196,-1957313699,1354771436,-1710983425,2919,-1017256565,-1192457387,-1957691328,1861682246,-1634054138,-1962934261,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,2989,-1017256565,736922453,1996443840,-26108,-443875328,-1957313699,74907628,16777114,1575324416,-326412861,-1710983425,3094,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443875162,-1363426467,-1258585855,1393062657,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1073840783,-1007912629,567095476,-1023318877,22939278,741772070,889239552,512303565,109838674,521011540,-1171980104,567085808,-1542550730,908256001,27657925,-617358708,-1575026890,-385649919,-986251703,-1946047994,244698,-1575026890,-1021372927,855643321,-2105018661,74711297,567099060,-1007492541,-387151019,1996423243,1042436,-1017256565,115600690,-657331503,1438907106,1122561163,-29235200,175432714,294528,1187382389,-987824636,-1207873002,567092480,-1542550753,-1157111039,520028162,1183515042,-850611196,28621601,28638081,-11335565,1128487703,-1144786197,-75431500,141754806,1528299347]},{"sector":8,"data":[-219462845,50347715,50826497,50358272,50440705,50358784,50654977,50359040,50797825,50359296,-16590848,50334976,-16624640,50335232,50725377,50359808,50897921,50360064,-16635648,50335488,-16644608,50335744,-16673536,50336000,50788609,50360576,17496065,50331904,-16489728,50336256,50793985,50360832,-16696064,50336512,-16728064,50336768,-16747008,50337024,17518593,50332928,-16330496,50337280,17530113,50333184,-16109824,50337536,17533953,50333440,-16121856,50337792,-16254976,50338048,17546241,50334208,50338305,50363648,17552385,50335488,50888961,50331904,17559297,50336000,17565441,50336768,51060993,50332928,50663937,50333184,50958849,50366720,17576193,50338048,50970113,50366976,67801601,50332928,67809537,50333184,17505025,50339328,50967041,50368512,50683649,50337280,50453761,50337536,50955265,50371072,50911233,50371328,50905345,50371840,50679553,50339584,50907905,50372352,50705153,50340096,50866177,50341120,50697473,50341632,50700801,50341888,50785025,50377216,50670849,50345216,50347265,50345984,16855041,50350592,34216705,50349056,50509057,50347520,17297409,50351872,50404353,50349312,17304577,50354176,17497345,50354944,50573569,1291867904,543912545,1411395140]},{"sector":9,"data":[-2081649835,1085803244,12079104,-62486270,31431248,1183383552,-163149318,74825739,1475067947,16664263,74907392,-771858805,1486851043,-1959264512,1344206406,-1694730497,65535,-129595072,-771858805,1486851043,-163149056,1183516553,-163184136,-244183,2122579526,-1048832002,-1191545089,1177223680,1085821180,-6664192,-1962934017,46292453,-1873273344,-326412987,-2116514274,1442907884,-401705217,-1072955542,-1070922379,721556969,45633728,1347590527,188570,42509056,-1207011585,1344143536,16777114,38707968,42483331,198407168,-3181376,1996425846,-26104,2122514432,175439884,-401705217,-1073020450,1183560820,41853710,-17135929,518717446,-17123701,-422378831,8963713,-16616193,242679604,16777114,-1996191488,-1895890348,-1098645766,2097217274,-401698601,582484518,-1924129280,385810054,-1161811120,1347551484,-1202696112,726663268,-11513664,1347423862,98714,1614592,58048523,-1191229463,1344143545,503363768,12892240,1380974778,1354771280,39368784,26261584,406257488,1030144,242679632,1347469355,16777114,1745664,58048523,-1694561303,65535,1586943,-1705983957,65535,-17004919,1354771280,196628560,12079104,-862302199,-16777215,738131126,1050759360,-1202708992,-1202716661,-1706032896,65535,39198347,-1207957562,726663234,-811970368,-1560281086,922681986,213385242,922701828,-1070923134,-1499836336,-16777214,-1711263178]},{"sector":10,"data":[65535,1586943,-1710852353,65535,638082756,1946173312,29669492,1392922654,16777114,29669376,-26032,-994574336,-1202708991,1344144010,1344798904,161434,41460480,1979711293,406257460,1010237184,29669376,741801808,2406400,-26032,104660992,-1206487808,1344143812,503483064,268482640,-26032,2023948288,2017362690,158662402,1342293176,16777114,439811840,67221504,1354771280,1718015,1342439608,1347469355,44931664,1347551232,16777114,112640,49120094,1562371467,707149,-2081649835,1085801196,448286720,-6664192,-1996488449,-1070858682,2130819152,-1706012007,65535,-1979818357,1996426823,112644,-1706012007,65535,-1979818357,1204227143,-956301038,5191,-1996208501,582486599,373786880,-954703988,-64953,-16496697,273139711,-1014300666,-6664162,184549631,721712576,-15995968,-6619530,-1207959297,-443875327,180829,1167087646,518818645,-326903666,12498956,-1930017143,1344206942,503366584,1354771280,229274,-96040704,-493825,-910625162,726670848,-6664000,-1560280833,1996423458,-159973384,503369656,17479760,1344163870,1342179000,243866,-126419200,-1191807233,1344143573,503386296,-1202708912,-1706033146,982,-493825,-575080842,-1202708992,1344143579,385631885,178256,-26032,1183449088,111384828,-126419199,-1191807233,1344143589,503374776,-62485168,45633558,-1650831360,-1979711485]},{"sector":11,"data":[-1550255034,1996423432,-159973384,503376824,1354771280,223642,19178240,200951435,1024226496,460587009,1946157629,-952833244,72710,503760640,-956300543,100737030,-954144000,50404358,503760640,-352321535,470206442,-956300031,134290950,537315072,-2097151999,-443874579,-884122337,16973850,197111,196719,16712329,16973843,65554,16973829,65655,16973830,66363,196615,16712286,196634,16712234,196635,16712192,196636,16712080,16973853,197043,16973977,197020,16973980,65801,16973875,66581,16973881,196933,16973865,66555,16973882,197132,16973866,196777,16973997,197364,16973998,196672,16974000,196793,16974001,197419,16973881,66109,16973898,65746,16973903,66081,327768,16712474,131073,16712479,1632436225,1167087646,518818645,-326903666,-1924863212,1343679558,1347469355,112720,-26032,-1073020928,1048786036,1946157692,2083979026,-330920702,-6664170,184549631,-1928038976,1343679558,16777114,-330920704,-6664170,-2097151745,161342,1048819060,1962934902,112645,-1070923029,-1962742397,1297948645,503317706,1430622296,-1910575989,205949912,1946226749,17906970,373098356,-346786815,1980155749,-402652926,28836635,-10884352,-1070920074,-26032,1185087488,473858818,628424704,-1207011585,-2091909100,7230]},{"sector":12,"data":[849413492,-1207309568,-1706032700,65535,1347607180,16777114,242679552,16777114,-4723968,-1207810506,-1202655136,-1706033151,65535,-1070881557,-1962742397,1297948645,503319242,1430622296,-1910575989,-689143336,-2009661696,-26110,113704960,630,16777114,-1002010368,108904459,-369098824,1996423802,-733573692,-6664170,-1962934017,1174656070,39101404,-1545714037,1996423754,702660,-26032,-2037841920,-1952841940,-150842354,914786809,-998834177,1342179768,-1202667477,-4521985,-11513089,-1711112650,523,-1070903214,-677752752,-1929379839,385825414,3711312,-1248178146,1375731713,473858896,91488256,-352308575,29669379,1347607180,16777114,-998834432,1342180024,-12941683,-6664170,1342177535,-12941683,-1070903274,-392540080,-1996488702,-1072972730,1996426877,37067460,1183514624,29157820,41826047,-1728049992,922701906,-4718568,-17665,922701906,-6684034,-1560280833,378077828,1347551878,16777114,41722624,460701707,42350335,42219263,200346,-998834432,194458,-280576,-16683543,721426486,-1046851392,-16777213,-1207952842,726664205,1347440832,165530,948340992,-62470145,1187446784,-956301114,16723590,-196688128,922681344,297271322,1996443652,1354771398,53582416,1183383552,951517128,-25857,1174601728,713460166,-998834177,-11485141,-2037646218,1344208682,-1698138369,65535,-13060353,16777114,39100672]},{"sector":13,"data":[-244223,-2037648314,1178206006,-951681804,62534,16533191,-998834432,1342177720,1347469355,-1706012592,853,196888201,-14516800,1922745462,-2097151997,161342,-1326972043,-2043216128,-2076770558,61250050,-706150400,1983808510,594870274,1718015,1342442424,-13728001,-13715713,1347469355,16777114,-968455936,58507275,-2080426007,161342,1996436085,112836,1354771280,1347440720,233114,2109737728,112645,-1070923029,196888201,-401771328,1996423239,60398276,-1913978880,41303683,-15305472,196658294,-1070903296,1347440720,-26032,552075264,-998834432,16777114,-2043216128,-2076770558,-26110,-1070923776,-1962742397,1297948645,-326412853,1586943,1342177720,16777114,2083979008,-26110,113704960,636,-1017256565,16973854,196638,16973933,197209,131183,16712194,131083,16712055,16973836,196677,16973937,196687,16973938,66194,196616,16711969,16973848,66233,196617,16711884,16973849,196829,16973846,131760,16973857,196848,16973979,196774,16973980,131467,16973862,197191,16973858,65920,16973875,66093,16973876,197578,16973877,131558,16973892,196886,16973893,65947,16973912,131414,16973904,65991,327770,16712191,327691,16712052,16973836,131387,16973917,197145,16973913,196663]},{"sector":14,"data":[16973914,196821,1632436316,1142975346,1167087646,518818645,-327034738,1183514758,17841420,289212276,-348359679,242679634,1342181304,1342444984,1342208952,1347469355,16777114,242679552,1342181304,1342182072,1851011,721712128,-1207702592,-1706032502,65535,-1962870807,20777542,1024816128,57999362,1023483881,57999375,721493737,19589568,-1207011585,-1706033151,65535,-26032,-1073020928,-1041693835,242679552,1342181304,-8747379,2075676694,-6664192,-1929379585,385841798,-26032,-2037579776,-1873739910,98494478,-8747379,-26032,-1073020928,1996429685,1010237198,1278672640,1354771200,1342189752,79770,-1922045184,385841798,2055638352,-1706027265,545,-8747379,-1070903274,41720400,2023948288,2055638274,-1924131073,385841798,37198416,1048772608,2080375416,2016870202,52795906,1996423168,1010237198,775356160,2055638272,616059135,-157659135,1023410177,91553799,-352321096,-1983894782,-1072956346,28837236,-11801856,-2037576074,-1202651270,-1873805311,4581390,-428556277,503432376,2055638352,-1706027265,65535,-1207011585,-1706033151,65535,1996474603,-339727602,242679793,1342181304,-1710721281,65535,-310136597,535137026,181030237,-1873273344,-326412987,-2082959842,1187450092,-16776966,-1711110090,65535,1718015,1342181048,1347469355,47684176,1183383552,1975520248,108954475,-15109120,922684022,922681404,1996423240]},{"sector":15,"data":[3192840,34642512,1206583296,1586943,3946239,4601599,-1207404801,-1706033119,65535,1962934589,43169834,1344163870,159386,43169792,1100632094,-1207959549,1344144018,-1382395874,721420290,244338880,721674984,26536384,425603,1183520885,-1202708984,1344144010,1353188024,247450,41460480,1183534059,508567048,53975632,1183514624,-1202708984,-1706033150,65535,184711331,-1960936000,1344145478,-1705983957,65535,184711331,-1207599936,48955393,1183432747,138841082,1344163870,216474,2017362688,242614018,-16091393,-16761802,-385854410,922746664,414711834,28856324,-1070903296,-73772976,-1996488702,922745926,-6684030,-1996488449,1586295878,439812086,964608,1354771280,2140819536,-1996488701,922744902,1996423800,-193527818,57514576,1178271744,-12028680,-1711111626,981,41432831,235162,-92372224,-1960676352,1344145478,-6664162,-1962934017,1344145478,16777114,138840832,1344163870,16777114,175570688,3946239,4339455,-94231,-16615370,1996486262,1354771444,16777114,439811840,67745792,1354771280,-1365618608,-16777213,-6682506,-956301057,7174,2016870144,63740418,2122514432,309592316,1718015,1342445752,1347469355,-26032,2122514432,410255366,503858827,42645584,-1070903266,-26032,-1706033152,65535,42088191,16777114,112640,-1962742397,1297948645,503318218,1430622296,-1910575989]},{"sector":16,"data":[250381272,2017362774,494272258,1586943,3946239,2766591,-1207535873,-1706033104,1268,15319083,-2009661694,29399554,922681344,-1070923144,45633616,1184518144,-1996488700,1451883078,-196703748,41432831,1347469355,-26032,2122514432,528417020,2122385276,2000683258,-2110324970,-196703486,1119375424,77221888,184549381,-15239744,-1711114186,1210,1586943,3946239,3815167,922714859,28835866,-1070903292,-1706012592,1409,42088191,189338,-163149568,-500084,503478326,-193527984,16777114,2016870144,18782722,1586167808,-159988492,50726,-6662650,-1962934017,994702414,-12812600,-1711111626,1359,1586943,3946239,4470527,-1207535873,-1706033104,217,42088191,-1202667477,-1706033086,65535,-1873756117,18212878,-989920791,1191179870,1065363190,-1960413906,1191179870,1065363190,-1961200308,1191179870,1065363190,-1961986737,-2144930210,91572031,-352321096,-1983894782,922743366,479855234,-1207959549,1344143812,503727755,107453008,1996423168,108042758,113704960,28,-16680728,-1207952842,726663179,1347440832,366234,439811840,67942400,-2110324912,1354771202,95656528,2122514432,544473330,1718015,1342439864,-1957642197,-1031015338,-644198318,-1207959547,-1706033151,65535,1586943,1342177720,1718015,1342248376,1342443192,1347469355,391322,28856320,-6664192,-16776961,-1207952842,-1202716661]},{"sector":17,"data":[726663169,-1706012480,1618,1718015,1347469355,1342177720,16777114,439811840,-26112,28835840,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,1946158718,1354771212,16777114,1958742784,439811914,833536,1354771280,503392952,109222480,113704960,65564,503432376,3318096,-610643938,-1207959546,-1706032700,903,1718015,1342439864,1347469355,117807696,113639424,-2097151402,-443874579,-900899553,1478361090,-1957345904,-661774612,1443163267,-955877749,64582,1015028971,-2146667218,1965949308,24936486,-1960807076,-1706025274,65535,1015083147,-1948289792,-1588584762,1077936262,1956270110,1577058305,-1962742397,1297948645,1426064074,-326898549,503760648,-16736256,-1207952842,726663182,1347440832,467866,-96040704,16664263,-14292224,-1207952842,-11533295,-1070858634,-761638832,-1996488703,513931334,-129615616,1183516286,2008056,-113013,1178336838,-1949270790,583228901,-1811873024,1862271748,-1140849920,251723525,1728119552,100663556,-1660878080,134217988,-603913472,150995204,268436224,436272900,1711276800,469827333,302056192,2080375558,151061248,2097152774,721421056,520158978,-1744829696,536936193,-1107295488,553713408,1342178048,570490624,956302080,587267846,-335478016,83887104,234947328,100664321,-2113862912,587203328,1560347392,1241514242,-1006566656,1291845894,-486472960,1040188165,-1442774272,1325400320]}],[{"sector":1,"data":[1946223360,1358954756,-1325333760,1375731972,-1878981888,1392509186,788595456,1409286404,-100596992,1426063616,503382784,1157628676,234947328,1442840835,1577124608,1476395269,-889126144,1509949700,-2147417344,1476395777,2080441088,1526727424,-1627323648,1560281856,822149888,1694499584,1918979328,776216683,1167087646,518818645,-326903666,1183667768,-62486070,425603,-661974668,-956545281,1586171143,-62455812,-16119866,1676213366,-901346048,-6664170,-1996488449,2122565702,494141446,1191178379,-901593400,-931755251,-959953153,-1962227134,1191168118,-901593400,108954368,-15960832,-6633354,184549631,-15371072,-1207952842,726664210,1183666368,-1706027318,65535,49120094,1562371467,182861,-2081649835,-1588193556,1183383838,17211626,-1996798328,1183381830,-163149576,-2013198176,1187442246,1187381502,113639665,-1708392123,246,-1744746080,372673360,-331182847,178256,21030992,-1744746336,406227792,-331182847,178256,19720272,21300934,-26070,1268776960,-1957652479,-1929307082,-1202654142,-397410302,1252000014,-1957652479,-1929306570,-1202654142,-397410302,922681594,915079496,1116537120,79188212,-404205568,-230242560,915079434,2055209238,611594988,837581440,2055224181,410989293,854424192,915091317,1116340504,-930375444,-1729281398,494190859,284313287,574522113,292880385,18232971,854424192,1258162046,-311787284,608076546,1450508289,18626187]},{"sector":2,"data":[821328512,1116543861,-1924131084,1343681858,116122,18653440,18744889,1191117694,-361329686,821328512,1116540789,-1924131084,1343681858,122522,372673280,-327516159,-1928366800,1343679554,384647821,32348752,1183514624,-1924129276,1343679558,129434,-1957670400,1344205382,132506,-1202695680,1344143654,135578,-1924115968,1343681606,16777114,-443851264,180829,-1947432107,1174471750,-1960973562,-1181153210,-101253110,-13581696,1586169422,-1961392122,-140965818,138840569,-16497013,-1073019826,-443819659,84329053,-2080308480,1862271744,1795162880,268500736,-1006632192,503381760,-1593769216,1476395265,922813184,1509949696,1918979328,1167087646,518818645,1183570062,17841420,289212276,-347835391,242679644,1342181304,503469752,-26032,1996423168,833550,19702096,1342341283,60314,1446936576,1098186754,-1207011585,-1706033151,147,1354771280,16777114,-1960121600,20777542,1026061312,309592066,1946160189,998753,-1914109067,-373282048,1996423322,175570702,50074,112640,-16741911,28839542,-6664192,1342177535,16777114,1958742784,242679780,1342181304,503469752,2144336,-26032,-2136932352,19702530,-15829249,1469713014,-1879048189,5498894,1996470251,833550,242679632,-26032,-1073020928,28837237,721611520,-6664000,-2097151745,163902,28837237,721611520,41984960,1996456939,1030158,142016336,16777114]},{"sector":3,"data":[-9312000,-1962742397,1297948645,503319242,1430622296,-1910575989,317490136,1718015,1342439608,1347469355,22190672,1183383552,-128546314,1718015,1342442936,1347469355,24549968,1183383552,-6663954,-1996488449,1183576134,-230258184,1718015,1342181048,1347469355,32021072,1183383552,-230257676,1357923843,737429131,-1202654650,-397409706,1183383651,-294191108,16777114,-58817792,-14977537,-16771018,-16761802,-1207946186,-1202716074,-1706033088,65535,1183526635,-230292996,1718015,1342439864,-1202667477,1344143958,131482,-230292736,-796143061,1183563819,-1706011918,731,-1962742397,1297948645,-326412853,-1962480509,1344144454,16777114,-62486272,721831563,-1992229818,1187510854,-352321282,142016283,-16484609,552139894,1958742784,-28931323,1191121387,138870782,972703371,-579011002,-1946157128,113401317,-326413056,1443687555,33441479,-129579264,1183514624,-163149562,-1995946357,1183577158,-129615612,1048793981,1962934572,-161576133,-467007606,1347605035,168090,-1981535744,1586232390,721914612,-1706011950,65535,1183441962,-62506502,1191123179,-163148808,-637185,-1226050490,-1946788213,76215414,-428603592,16664263,-28931328,1575324510,1426065090,-326898549,439811842,964608,1354771280,-1415950256,-1996488701,12123718,-28955840,10729881,1183447543,2109737982,-28915961,199950336,1694400131,1187448190,-1962908418,516120037,1430622296]},{"sector":4,"data":[-1910575989,82608600,205949697,1946226749,17906951,619388532,-1979736856,-66426,246943350,-1224781824,-1070858500,-26032,401276928,1024083595,74711041,250331179,-15829249,-6681994,-1207959297,-310181887,535137026,181030237,-1873273344,-326412987,-2082959842,1190532844,91521030,-352295752,-1983894782,1190586950,91586566,-352321096,-1983894782,-1072958906,922686837,414711834,28856324,-1070903296,-1113960368,-16777213,-1207952842,726663182,1347440832,16777114,1183399936,1073757678,1119359871,1996443648,-25874,1183383552,1975520240,-226589923,-15567616,-1207952842,726664216,1347440832,296090,-373282048,922681664,-1070923752,1996443728,112874,-26032,922681344,1183645720,-1706027276,65535,503394232,19839056,1996443678,108461832,1342179512,1342177976,771245707,-1957691377,70122054,922701824,263716888,922701824,-1070923138,-6664112,-1996488449,-1072956346,1996425845,-25872,-1913978880,-1695516929,347,-1292663,-1207952842,-11534323,1183575670,-1706025236,1200,-1695516929,409,1718015,16777114,-62485760,1342184099,1342442680,-1544534389,726663810,-1706012480,1261,1586943,1342177720,16777114,473858816,91488256,-352308575,29669379,-26032,2122514432,359923950,1718015,1342441912,1342177720,1347469355,329882,439811840,-26112,922681344,28835866,-1070903292,-1706012592,1546,1586943]},{"sector":5,"data":[1342177720,-1202667477,-1706033151,1331,15892099,922685813,-1070923752,28856400,-6664192,-1207959297,-310181887,535137026,80366941,-1873273344,-326412987,-2082959842,1448547564,15615687,-62470400,2122514432,57999110,-16740375,-1711269834,65535,91602955,1458159659,112641,-26032,1183383552,1975520236,98212359,-454361088,-1695779073,65535,-1980610935,1347613782,120218,105285888,2113155,-954043136,64070,956712587,360577606,653418180,1963802496,2139104795,343214593,32392903,-327745792,16777114,-26112,485163008,-375041,1996485750,-25870,1183383552,-195655182,1183563499,-96040698,1718015,1342439608,1347469355,103979600,1183383552,-128546314,2113155,-2089913088,1946218110,439811871,67876864,-18352,1354771280,105945680,1317732352,-1983370250,401338446,1718015,1342443960,737572607,-1706012480,1687,-1947187575,1317793862,-162649096,737955465,-96074815,1967675,922688382,922681368,922681404,-1070923712,3192912,28875344,-337051648,439812094,964608,1354771280,983191632,-1962934271,-62485560,-1952851317,105286640,731511435,64428998,198382529,2132114642,1073757445,922685046,922681368,922681404,-1360330698,1577058744,49120095,1562371467,537053773,-251591936,1862271747,-771685632,83886339,1644233472,117440772,1812005632,134217988,-1946090752,150995204,-2113928448,436272902,-771751168]},{"sector":6,"data":[469827332,218104576,536936193,-1811873024,301990149,-721353984,318767365,1812005632,-1996487931,-1979645184,-1979710715,2113995520,-1912601851,-167705856,369099524,402719488,553648900,1426129664,570426112,-1727986944,587203328,1392575232,687866628,-1124007168,704643844,-1795095808,889193220,-369032448,1291845893,469828352,1040188165,2097218304,1325400322,167838464,1073742596,-1593769216,1509949701,-2130640128,1476395776,1275134720,1526727424,637600512,1543504640,-1308556544,1560281856,1040253696,1577059075,956367616,1627390720,-637467904,1644167936,1918979328,1167087646,518818645,-326903666,340167432,-1962818909,1352864326,273058562,-1962783581,1386417734,205949698,-1560279251,1183515072,41591562,-1559738741,1183515204,38314758,723154687,1996443840,410451734,-1157627976,1347616767,-1709541633,65535,-1980217719,1347615318,16777114,-62486272,-362753,-6621066,-1962934017,-310117306,535137026,382356829,-1873273344,-326412987,-2116514274,1442910444,-244025,205949951,1946226749,17906952,-387359628,242679554,29505279,1073894049,-761638882,-16777215,922685046,364380610,922701828,-1070923328,-6664112,-16776961,1386286710,1344159746,38811391,38549247,1346375864,109978,1975520000,242679563,-1705983957,594,-385875528,1352729233,172374274,1187448693,-352318966,29532429,1963607609,172410629,1183514635,81162,37559156,-385649408,171770141]},{"sector":7,"data":[-385649408,188547363,-385649408,1357447748,242679554,1342177720,243866,-6664192,184549631,-385649216,1996423735,-1036583154,41591041,922701854,2124022208,-1929379838,385809542,41591120,-1046851554,-1929379839,1358888070,1342177720,-1929224728,1358888070,184758504,-12421952,-2037576074,1343684348,38811391,38549247,1346375864,226458,1958742784,41591076,-2037559266,1343684348,16777114,242679552,29505279,503478945,-26032,-1192689664,2050424577,1354771202,-16644632,-402490826,-1073020199,-1070920844,-26032,-1729560576,41591041,-6664162,-1929379585,1358888070,2062028432,1958742786,-62470350,2057371649,-1588584958,1344143940,1344798904,16777114,1209961216,1023904002,259391487,38018699,163715,1187448181,-4,1996426870,-16323588,-1070920074,-26032,954793984,138840833,1946157373,146699,-152501387,19261696,-15829249,-1929264586,385809542,-1070137520,-26111,1996423168,41591054,922701854,-6684080,184549631,-385649216,2057436971,-1706025470,687,-17529207,-17004915,-6664170,-1996488449,-1946224506,-58552848,-158955010,-2133292034,91499071,1966751616,112645,-1070923029,-17660279,-17004915,-17398215,-2037560202,1343684348,-17398133,-6664162,-1996488449,-1946225018,-2012771624,1023340678,1006924842,-955878081,33485446,-157381888,-2012771586,1023340678,1006924892,-1950780102,520025734,-26032,-2037841920,-1098645770]},{"sector":8,"data":[1946222322,-192509164,2047773694,-1933507838,-1957670182,-335612282,-192509166,2047773694,-1933507838,-1588571430,507511378,-106263,2057375350,-11526654,-16625610,-1207808970,-1706016752,65535,58048523,-369198359,1996488259,-1036583154,142016257,250089104,1589652224,-1962742397,1297948645,503319242,1430622296,-1910575989,108954072,762643200,-1207273729,-1706033151,964,175570768,-1710721281,65535,964688,1354771280,-6664112,1342177535,16777114,49120000,1562371467,445005,-2081649835,1448545004,16402119,105286400,1344163870,172186,-163149568,503727619,73701968,-259325952,1015086731,-2146208466,1966014332,-159481075,-955812606,63558,1015038699,-2147126180,125123132,33048263,-2093880576,1946158206,-339727612,178179,972572297,477300350,1949187456,1547534378,1183519348,-1957683706,-1706025273,751,-538183541,503399565,-129594544,38929923,2073710622,1577058305,1575324511,503317698,1430622296,-1910575989,-2098429480,1988843008,516328198,2122747216,-1202710785,-1706032896,549,91602955,-352321096,1589652226,-1962742397,1297948645,1426064074,-1957237621,283837558,1948925056,1060929541,28837237,1174989568,1962949760,1589652459,-1034033781,50337282,50459137,33581056,-16756736,50334208,50582273,50360064,50583809,50340352,50417409,50340608,16799745,50344704,16806657,50344960,17082369,50350592,16983553]},{"sector":9,"data":[50351360,17041921,50351616,16908033,50351872,17070849,50354176,17038593,83909120,-16757504,50334208,50357505,50353920,50395137,50354176,50415873,50354944,50378497,50355200,50424577,50355456,50499329,50356992,50391297,50357248,50384641,1291871488,543912545,1167087646,518818645,-327034738,-11140960,-1070920586,-11513776,-1706030986,65535,425603,-1159134347,209125120,-1928825089,385837190,8435792,-26032,-2037841920,-259260574,-9979264,-972721060,1560242306,-10320129,-10307957,-9927994,105286400,-1996486651,-1946196858,134547014,244338688,-1996451352,-1912641914,-1979750266,-1946197882,973039238,1946117254,1688111886,1622576127,939821823,-1959758841,973039238,1979671686,1621003017,4161791,1183517300,525574,-10189175,-15960321,-2037708170,1344208740,16777114,-1959662848,520053894,14522960,-2037841920,-2037645468,1344208736,87706,-6755584,28839030,-6664192,1342177535,-1705983957,65535,49120094,1562371467,576077,1167087646,518818645,-326903666,105286406,1344163870,16777114,105251584,983191582,-1996488703,1183579206,-62506746,1344154486,519849611,-26032,1183383552,-1965519876,-96040953,74734652,-629851588,519849611,-26032,1183383552,-62485508,-1962742397,1297948645,525002,15991043,2228227,13500675,5046273,19071235,5111809,18415875,5898241,15401219]},{"sector":10,"data":[5963779,12648707,6029315,3801347,6094851,1835267,6553603,1802658125,1167087646,518818645,-327034738,1018691730,-1202708991,1344143669,503395512,1954975056,-1202710785,-1706033024,65535,108380171,-369098824,-2037579443,1183448948,-162099980,-1098901269,1949106030,-159973601,-1695254785,136,-1980479863,1589966422,126494452,-9533816,-629817334,653549252,1946173312,-196673759,509478,-1098901269,2132868974,-159973601,-1695254785,195,-1980479863,1589966422,126494452,-9533816,-629817334,-1946925429,1183446614,-61437446,-1098899477,1949106030,1857978406,528359679,-624897,43709558,-1996488703,1451881542,-195115786,-2012771802,184512134,-992774720,-2144930722,678690879,653543167,-352319546,1857978399,125706495,-9519488,-14715604,1996486262,20486900,1183383552,-162100748,653549252,-2037905526,-1073021074,1183568757,-162100236,-9402743,-9267575,-1098901269,2116091758,-159973601,-1695254785,65535,-1980479863,1589966422,126494452,-9533816,-629817334,653549252,-16775226,1996487798,1954975226,-11528449,-36170,738160822,-1706012480,65535,200820361,-1207601728,65798142,-2080881013,-443874579,-884122337,16973827,65576,16973882,131440,16973877,65616,1632436301,1142975346,1632903214,0,5,0,0,1412311644,21592,0,10485761,1867382784,1634755956,65636,327683]},{"sector":11,"data":[720906,1114128,1179660,1310739,1441813,1572887,1703961,1835035,1966109,2097183,2883626,3145774,3538994,3670068,3932218,4194366,4456514,4718662,4980810,5242958,5505106,1048662,0,65535,0,0,65535,65535,1529830434,1014774365,993864510,8236,1852399949,6513473,1768178944,1852375156,1761635444,1702125892,1767139584,1929405805,959787313,858944256,788543797,1631875840,973104500,1767142144,1761633645,1919253068,538968175,538976288,538976288,538976288,8224,3080434,1296105530,0,19792,0,393219,196608,6,538968064,0,1157627904,7629156,1986348032,6644585,1684957559,7567215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,206569472,208669800,199868,9961475,524543,10223619,590079,9175043,196863,257,4194304,524352,16646144,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656]},{"sector":12,"data":[0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,16678656,0,32512,0,2130706432,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686]},{"sector":13,"data":[-1,2130706686,-136414225,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-276963329,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-269567009,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,-1,2130706686,14745599,2130706432,-1572930,2130706684,-1572865,2130706682,-1572865,2130706678,-1572865,2130706670,-1572865,2130706654,-1572865,2130706622,-1572865,2130706558,-18350081,2130706686,-35127297,2130706686,-68685833,2130706686,-135790593,2130706686,-270008321,2130706686,-538443777,2130706686,-1075314689,2130706686,2145910783,2130706686,-1638401,2130706686,-1703937,2130706686,-1835009,254,0,1632436224,1818838544,150995045,2003127808,655360,1852141647,3026478,1392509184,6649441,1392509440,543520353,774796097,243269678,1769099264,268465262,1953064005,1638400,1868852821,795366153,6517573]},{"sector":14,"data":[1124270080,1141470325,27749,1866662657,1175026032,33554482,1935757315,1225352564,29550,1816331011,7496037,0,1392510720,1667591269,1816207476,201326700,1835619328,1631858533,1175020916,53,461373440,1919899392,1918312548,-1879019423,1918985555,26723,1766195203,774792302,142606382,1852392960,1699618916,1175024760,1632436275,1142975346,1632903214,1919904889,-2143289344,335549446,1342215168,0,131118,786532,8388623,-8302461,67108864,1174410240,268449792,-1560280320,16745296,5701632,3276840,65550,1342373889,1701859200,1459617902,838875648,33558016,50331648,1631813712,1818583918,5111808,3932180,1179660,1342308352,33554562,671089152,-16774144,33555199,1766228560,1847616876,979725665,1632436224,-2143289344,335549445,1073771520,0,262152,786532,65535,1401049090,1668440421,1868963944,2112114,268437504,201352192,-2147479808,-2125430016,524288,3538974,786444,1342373890,1952533888,1126197347,6648673,536888320,234889984,16777472,-2142240000,27471,3145796,917539,2,1132482563,1701015137,1291845740,543912545,1411395140,1869379937,-2143289344,285218314,1711312896,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,130946,234881024,134254592,33554176]},{"sector":15,"data":[-2108685824,1702129486,6578544,570435072,134234112,33554176,-2108685824,1936876886,544108393,825241137,327680,8650799,-65527,1342308353,1886339970,1734963833,-1457490840,943272224,1293954101,1869767529,1952870259,1919894304,11888,3866677,917536,65537,1333809153,107,-1509929472,16777728,33555456,33360,5701640,786528,65535,545411074,1835356704,1768843617,1713399662,543516018,1667330163,14949,5701736,786444,14,830623746,12336,5701748,786440,65535,629297154,1632436224,-2143289344,335549445,805348864,0,983052,786536,8388623,8474755,33557504,201341952,16776960,-2108685824,1702256979,1818846752,1935745125,1342177338,1207960064,301992960,33554944,33360,983160,917539,65537,1400918019,6649441,553678848,234889984,512,-2142240000,1668178243,27749,1802658125,-2134900736,335549443,570463744,1308622848,1885697135,33580129,-1946156032,-16774144,33554943,1766228560,1847616876,1713402991,1684960623,1917001774,1702125925,2003136032,1818846752,16229,1441821,917539,65537,1501581315,29541,1441872,917539,2,1317031939,1291845743,-1865940992,335549444,1073764864,1308622848,1885697135,486564961,536882176,33558016,50331904,1631813712,1818583918,0,5898248,-65528,1342308353,1852134274]},{"sector":16,"data":[1735289188,0,5898258,1310728,1342308353,2019914882,116,1509956608,-16775168,33554943,1869906512,1769107488,1931506798,1819242352,3043941,1918979328,1631785216,1953459822,1701867296,1768300654,2123116,1869488157,1868963956,543452789,1917001773,1702125925,2003127840,1818838560,285228901,1819305298,543515489,1936291941,1735289204,32,1632835072,1663067510,1701999221,1663071342,1735287144,540701541,1853171722,1819568500,170484837,1702129486,543449456,8237,1918979328,776216683,1851867917,544501614,1684957542,1309745210,1696625775,1735749486,1701650536,2037542765,1818838544,1869881445,1634476143,979724146,1867384608,1634755956,1648429156,779384175,1276587566,543518313,544173940,1735290732,544175136,1953718608,1310666341,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,1702257011,1310335034,1629516911,1818326560,1847616617,1885697135,1713398881,979725417,1833245728,544830576,1701603686,1818851104,1700929644,1818584096,1684370533,1125654586,1869508193,1634934900,1696621942,2037674093,1818846752,220215909,1852727619,1881175151,1953393010,1867388192,543236212,1768710518,1768300644,1634624876,372139373,544501582,1635131489,543451500,1701603686,1701667182,1310662714,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,1852404336,1310400628,1696625775,1735749486,1701650536,2037542765,544175136,1852404336]},{"sector":17,"data":[1125326964,1869508193,1919098996,1702125925,1818846752,1632444517,1142975346,1632903214,1869567003,1668640032,1702109288,1948284024,1867980911,1461740658,779116914,0,0,0,1291845632,543912545,218115585,2949376,1895891714,16974080,524402,201356289,1803520,1632436249,565709030,1183666176,-1202710870,-1706033072,4923,91602955,-352321096,-1983894782,1996488262,16431110,-1438216880,1520062486,-2097151981,1962999422,-432603366,2275336,-1438216880,1354256406,-560312320,184549387,-1207601728,48955393,1183432747,108462078,1342177720,380257933,202283600,2122514432,158597374,-1207535873,468320255,108462079,1342185656,-16658712,-591919498,783831040,-1706025460,5235,-1928956161,1343660614,16777114,243712,175124215,-1985722877,28875846,-577089536,-1962934253,-936662962,-150993992,51015726,145531336,-939269935,201084553,-1962574135,-1673123391,-150993224,51139118,1183425094,1354771358,16777114,-1504802048,112773163,1378809600,-1580727540,-523171820,1317652483,2127105020,700549893,1996463686,-1636368634,-1952680193,1177265734,1183535266,-1538905176,1354771280,16777114,108461824,1342177720,842138,1575324416,1426064578,-327029621,1187446914,-1962934018,20777542,1026782208,57999362,1023469033,57933844,-2097092375,1963001982,209125149,-402360577,1996423391,14465036,204388432,-459648994,-385875950,1996423365,74907404]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[25188941,153,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":5,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":6,"data":[279886,56492849,191654789,2162694,268435712,2098572,2162688,196641,4194605,51446088,52429594,2703,131215,0,0,0,730333935,730460464,52629200,52752688,159387580,159445296,201331275,201453872,158274968,158396720,207951921,208073008,203758509,203878704,208674585,208728368,292495986,292614448,566175521,566292784,137244688,137359664,170799694,170914096,107558202,107671856,18822887,18936112,9779010,9892144,20526962,20640048,38942675,39055664,56637566,56750384,39139697,39252272,18889245,19001648,38943348,39055664,35666719,35778864,16923574,17035568,187776005,187887920,9322248,9433392,187383606,187429168,6701604,6811952,17777222,17887536,59785881,59896112,20792206,20902192,243811306,243921200,151013327,150995280,150358630,291897681,-2147418108,10,322240512,-265289711,312,323354624,-265289711,319,324468736,-265289711,328,325582848,-265289711,336,326696960,-265289711,344,327811072,-265289711,353,328925184,-265289711,362,330039296,-265289711,371,331153408,-265289711,380,332267520,-265289711,389,-2147352576,1,333381632,1048899,397,-2147287040,1,354549760,-265289663,403,-2147221504,1,358809600,-265289689]},{"sector":7,"data":[409,-2147155968,4,361365504,-265289719,415,361955328,-265289720,424,362479616,-265289716,435,363266048,-265289720,440,-2147090432,3,363790336,-265289717,32769,364511232,-265289712,32770,365559808,-265289711,32771,-2146893824,1,366673920,1048580,451,0,1380929030,139215181,1347573059,1279479365,1381319431,1145979208,1381319431,1415071060,1381319432,1364345165,1430456389,1396788306,1124618067,1380274773,138761025,1129469251,1397968722,1381319432,1313423696,1430456148,1280659026,1095763276,89411145,1313423696,1095763284,139742793,1162627398,1313165391,1279870474,1447121733,72565061,1347175752,1329742090,1380996178,89411145,1162036033,1095763276,5525065,65536,786437,1145504512,1162544713,1279610450,1163089156,33525586,-1560199219,1070399758,17682185,1711685581,1070399755,16880135,-972537907,1070399753,17362180,737229,1070399744,17017611,-250921011,1070399749,18770698,-1559609395,1070399774,18159617,-436125747,1070399766,16806668,802765,1070399488,415747,606157,1070399488,1171969,1292189645,1070399497,374277,1191395277,1070399495,2,212941,1070399488,254473,-1911996467,1070399492,273673,-939180083,1070399488,341792,320880589,1070399493,172297,1627996109,1070399503,275488,1980383181,1070399502,191500]},{"sector":8,"data":[185089997,1070399499,262668,671693,1070399488,1918986,-116768819,1070399514,1891082,604651469,1070399514,1679370,236994509,1070399492,883978,34226125,1070399505,128521,-821477427,1070399488,21769,1929985997,1070399489,968457,-1056358451,1070399492,4,1495220173,1070399497,98335,-65060915,1070399489,548890,-1155907635,1070399494,693016,-988135475,1070399497,501509,-1727381555,1070399496,696072,-16236595,1070399499,412427,1510621133,1070399491,215301,-804962355,1070399490,348421,-469090355,1070399492,22538,1242185677,1070399521,186394,2082422733,1070399491,2658561,253706189,1070399489,1612289,385957837,1070399512,757761,320356301,1070399497,432651,-150323251,1070399520,293664,-853524531,1070399492,937994,1327053,1070399488,16,1523661,1070399488,10003,1261517,1070399488,10002,1195981,1070399488,10005,1392589,1070399488,10001,1130445,1070399488,30,1916877,1070399488,27,868301,1070399488,14,1654733,1070399488,15,1851341,1070399488,22,2047949,1070399488,24,1720269,1070399488,7,540621,1070399488,23048,1292320717,1070399488,1498890,486883277,1070399496,2119690,2031632333,1070399497,671258,789200845,1070399508,538399,1042104269,1070399491]},{"sector":9,"data":[304160,-1038073907,1070399491,234784,-115327027,1070399492,193309,-1996406835,1070399515,58633,285818829,1070399489,64265,587939789,1070399495,41221,1308966861,1070399488,68357,637878221,1070399488,5,1527070669,1070399494,1777665,956645325,1070399490,136709,-586858547,1070399489,445957,-1174323251,1070399505,1152513,-1979629619,1040187418,1919117645,1718580079,1632641140,544501353,539583272,892877105,1667845408,1869836146,1126200422,779121263,544825888,544104772,1631806285,539780450,1629516901,11884,1330600462,1414877005,1346653783,71520082,1094913280,1396790862,1346653783,54742866,1095764992,1465142857,1380992078,82767,1095914511,1229343555,1095976268,1396786518,1410334728,1262698834,1162627398,1312901187,155469127,1095765504,1414808908,1145984837,1129271888,1175191554,1129598543,1112296513,206259009,1430522624,1279345488,1128350284,150997835,1380926017,1397052500,167776084,1380926017,1230131284,939086,1095914509,1229343555,1347372364,478789,1330600461,1464748365,1380992078,344911,1128351244,1279345477,1128350284,234884427,1163149648,1465141572,1380992078,410447,1347371788,1279870553,1296125509,2629,-2081649835,1996429548,-26108,1183383552,74907624,-401698736,1996427372,-394854652,16777114,-1372127488,1983315725,-1707671796,4233741,-1202716672,-1202699352,-1706023152,65535]},{"sector":10,"data":[-955363165,552454,-2110324992,34576910,1183383552,-1070903064,42572368,-1706033152,140,736655103,-11513664,-15886282,-1207065546,-256245727,-1706012160,168,-1542401,-1710496714,655,736655103,-11513664,-15886282,-1207065546,-256245727,-1706012160,65535,-1696041217,226,-1705983957,65535,201213577,-14977600,-6683530,-1996488449,-1202655162,-1202716638,-1706033151,65535,1996425451,41851646,1996423168,1354771204,16777114,-263812864,729071627,1354771280,-2118627248,12079104,530206721,-16777215,-1070862218,286832720,-2135404514,12079104,-6664191,-1962934017,46292453,-326413056,-2096960381,357438,1187448693,-352321026,1949761332,-26107,37552128,-1207602176,48955393,1183432747,1958743038,1312719648,125108229,72236672,-1207274496,1344144334,16777114,74907392,16777114,-28931328,-1034033781,-1957363710,-2110324756,26450446,922681344,-1667626012,-16777215,-1710456778,421,179975935,110234,1781989120,-26104,244318208,-15717400,-1710158794,65535,1962934589,-26107,-443875328,-1957313699,250381292,1996445271,-163148538,-6664170,-1962934017,1177287238,-28931594,721712895,922702016,-124122188,-16777214,1996424310,-1271463938,52468235,922681344,-6681452,-1996488449,213447750,-164694272,-1192195315,787939331,-125104650,-1727138143,-1037319629,-754974023,734147576,-28406846,-835991509,-1995576957]},{"sector":11,"data":[1996485198,2110733060,-339244284,-230257917,112720,222596432,239903056,50716881,1996443648,1354771444,2144336,1375784122,-26032,1996423168,-25868,1996423168,1354771204,170906,-1583722496,-16777214,129500278,-6664192,1342177535,16777114,234266880,734147481,178626,-1036781357,-259276245,1443133183,1342177720,-787614047,96863200,-1588592637,-523170228,1342178309,16777114,74907392,-1727138143,-1037319629,-754974023,734147576,-167377982,-1202700275,-1706033151,832,-1593542913,865668598,-1178457150,-120389630,-1037319629,234227203,1285640256,98619662,-1706033148,875,-1593542913,865668598,-1178457150,-120389630,-1037319629,239903056,-1706016704,65535,-1593542913,865668598,-1178457150,-120389630,-1037319629,234229387,-1056710191,1342178053,1074678945,-6664128,-16776961,1996424822,1354771204,231578,108461824,-1207666945,-1706033149,919,-16353537,45614198,-1499836416,-16777213,1996424822,112644,-26032,1048772608,1946159212,1354771211,-1710983425,65535,-443850914,311901,-2081649835,-1957295892,-1667037626,71731979,-1962167645,-1700592058,74877707,196359723,2130053966,-339309820,-1983894782,1996424262,1816036102,91553800,-352321096,1354771202,16777114,1950253824,57999365,-1593790487,1178143726,-1962574586,65734214,-1995706719,1721890886,71710988,1183516029,-1593578748,1183386726,209101310,2113422905,-129594619]},{"sector":12,"data":[1990263787,-129595124,957121185,92143174,-335657333,209887491,-1946270071,1177224774,-1037329928,1183447249,71732220,-1711389141,-120470997,-375159,-16419786,100924534,1346374580,-493825,28900982,-1097183232,-2097151996,539198,922683005,199951730,138034819,-15237632,721776694,-11513664,1996486774,112894,-26032,-1956773888,113401317,-326413056,-1962480509,3999814,1025012738,57999873,1023460329,57999874,1023478249,1165230595,-16695063,-1710348234,65535,141442691,-385646848,1048772909,1979648108,19130627,-1710590209,1476,-375159,1996424822,-744861692,-16777211,1996425846,98474746,-18284544,108461824,721712895,-6664000,-1996488449,87948870,-16026368,-1878690762,104917006,2122524907,829752574,138034819,-16026368,-1878690762,313518094,1048776939,2097154106,1949761289,-401698811,1996428064,-1103692022,-26109,-1494679552,-25263360,-385649661,1048772765,1946159162,977175512,-629276664,1048821227,1962936430,1949761345,123509253,113704960,2156,16777114,62825216,-1710590209,1548,-375159,1996424822,-6664188,-16776961,1996425846,103193338,1996423168,-26102,117374976,1072367726,141442691,-13074944,-2096599538,552510,113716597,-63380,-1710590209,1676,-375159,726665846,2040156352,-16777213,1996425846,111188730,-6684672,-1962934017,146955749,-326413056,-2096173949,1970340990,112645]},{"sector":13,"data":[-1070923029,90048059,-1578564747,75399936,-1207601807,48955393,1587789867,75399941,723613040,-1197846336,-1996488704,-1705971130,1685,15892099,1996433012,11574002,485163008,-1710852353,10,1358055049,16777114,108461824,-1695385857,33,503566008,171620432,28856350,-6664032,-1996488449,-1705970618,65535,-1695254785,65535,-1928956161,1343682630,122778,108461824,-231681,-471269770,1949761532,1354771205,112720,-26032,-443875328,311901,-2081649835,1048773868,1962935668,108461832,16777114,71731968,1023417901,58064979,50521833,-13724736,-16108377,-1710918602,65535,-16536087,-1710918602,65535,-16539159,-1207602122,-1706033151,65535,-16543255,-1710918602,65535,-16546327,-1710918602,65535,16777114,108461824,16777114,57469184,138034819,-15960832,-1878690762,561506318,-2096932375,539198,1340670844,1949761283,-26107,1139343360,1949761283,-401698811,938017774,1949761283,-401698811,736696081,1949761283,-401698811,535369543,1949761283,-401698811,334043297,1949761283,-401698811,132715980,1949761283,135502341,1183383552,1681818620,141819909,-26032,267059200,90717827,-16223232,-6620042,-16776961,-16419786,-1315242890,-385875960,922682062,664405364,-1996488696,-1705968570,65535,922738155,1067058548,-1996488696,-1202652090,-1706033102,65535,922732011,-1667627660,-1996488696]},{"sector":14,"data":[-1202652090,-420806605,1023690379,57999438,1023463657,57999439,1023451369,57999440,1023454697,57999441,1023470057,175374418,1962955581,13232387,1048777195,1946160546,-339727612,112643,-15883613,244319862,-16070936,-1710918602,2253,1358710409,-1779954032,1949761288,-59310331,583322,-1036090624,57999363,-16728087,-1710918602,65535,91502335,331930,-62486272,91502335,-26032,922681344,1996424564,86678268,922681344,-6683276,-16776961,-1710918602,65535,-2097029655,17435198,28837236,-1207702784,178455128,-8656630,168574592,704934912,-1341985856,168600065,-939562775,17435142,201770496,113639434,-973075955,658950,228722375,1256783872,238977279,74711050,49004586,245498288,-13113078,168640128,704934912,-1341985856,168665601,-56087,1996424822,24045572,63061635,-385649664,1048837953,1962935654,22341891,91502335,16777114,21555456,-16353537,2095580278,-15341311,91502335,1860701840,19982606,91502335,-437776752,19196174,-16353537,-1880619914,18409729,-1710852353,65535,-16708119,1996424822,-60954620,-16711191,62391926,-6664192,-385875713,1996423410,112646,1996484587,178182,1996482539,-339727610,71732192,-120387407,1023442725,141819958,1946174013,12904721,-16353537,244319350,-385211672,1996488305,74907398,-1964503408,-27006710,120522531,122357563,167839575,167840257]},{"sector":15,"data":[167840257,167840257,127469424,129042341,130615229,135137237,138020898,167840257,167840257,167840257,167840257,167840257,167840257,167840257,167840257,167840257,167840257,167840257,167840257,167840257,139200588,139200588,139200588,158009707,160696683,167840148,166332891,167381490,167840257,167840257,167840257,167840257,162269600,163056129,163056056,167840184,167840196,164563407,-1034033781,-1957363708,49054700,-1710852353,2851,1358841481,63190783,-1705983957,2831,-1946257665,-995949498,146296835,865751040,-1962934261,79846885,-326413056,-16585597,1520043638,-1996488693,-11469242,721977398,1184518336,-16777205,1183579766,142648068,571472,191732304,-443875328,311901,-2081649835,1996423916,13081094,1183383552,1889620222,6882568,1354771280,755354,-25755904,755254923,1889730665,6882568,571472,-26032,-443875328,311901,1167087646,518818645,-326903666,1376175876,-16776955,-1365637514,-2097151995,539198,244332917,-14886168,-73791882,-1996488693,-397345722,1996423256,-59310330,790426,-2110324992,5413390,1183383552,1038635260,-59310336,426650,-2094470400,539198,-6676099,-16776961,-627440010,-1996488697,-1705968570,65535,-16353537,127597686,-2097151992,-443874579,-900899553,-1957363710,74907628,-1705983957,94,6593104,1996423168,1354771204,-1741226160,-1539899635,2209805]},{"sector":16,"data":[1375793338,8428112,-443875328,180829,1167087646,518818645,-327034738,-11140970,-6683018,184549631,-13404992,-2037578122,-1202651284,-1202716544,726663178,-6664000,503316735,280148048,817385502,-6664192,-16776961,1973028470,-385875967,1996423349,-230257402,-778416106,-1962934266,1177286214,-96040462,737691275,1183446086,737184752,1309389878,75429387,49006219,1183432747,200188400,2113553977,-96040187,-291437589,1787201803,208052735,2112898617,-263812347,1721828331,-62486260,737822347,-1711314298,-120470997,-1947318647,1177284678,-1037329924,1183447249,135444716,-491237346,726670855,1342225088,1996443730,-330920978,196347395,-1224781760,1996488554,108462076,-11485141,1343294518,-26032,1956839424,345657349,1577058320,-1962742397,1297948645,1426064074,-326898549,-18428,1392508858,204930896,-26095,1183383552,-27883012,286013183,503525560,74907472,-59310254,16777114,-25755904,-1694730497,65535,-1034033781,-1957363710,149717996,-1710983425,2796,-2080618871,347710,1048774516,1946158418,112645,-1070923029,-506231,1048837238,1946158430,7387141,1907885035,2122534912,91488504,-352321096,1354771202,920730,-59310336,90062467,-1207602176,65732721,1342206136,-1705983957,3737,-2080606465,351806,1891108212,-1207702784,726663281,1134186688,-16777202,1048837238,1946158430,7452677,1891107819,146296832,-56995840]},{"sector":17,"data":[-956301302,130630,138034819,-12880640,-6683530,184549631,724530368,434852032,1946157629,212234,20776308,-955812608,65094,1996427243,-25862,1183383552,1975520250,-25893,1996423168,3062012,-25755824,55450,1575324416,503317186,1430622296,-1910575989,653034456,1183432747,-96040452,1024214667,1098121232,1776878454,81153,37564276,1027699712,57999365,1023444201,57999366,1023481833,57999375,-385842455,1996423515,-21567474,-1946532213,-2098594730,242679553,-336526872,242679791,-1712184600,-1980086647,-521405354,737308648,-6664000,-352321281,1950254035,242483205,91502335,82586,146688,28837236,735111936,-2083722304,1946159742,1312719791,125108229,72236672,-1197378560,1344144334,93594,-6952192,1996426870,142016262,-336306712,242679687,383403661,-26032,1996423168,-629735666,-897048,1183649398,-1706027302,65535,91504259,-385649664,1996488538,-26098,-1073020928,1273561972,1614709759,57933829,-939572759,17129478,242679552,-1746399600,-13571588,-33011977,-385649409,1996488486,175570702,-369678872,2122383130,1769308170,-401705217,199884161,242679807,-1928562945,1343620678,-369830168,2122579706,57999370,-2080443927,1946159230,-18290429,138034819,-15958528,-1710919626,65535,-2080451095,539198,922683005,-336919182,91502335,289269227,2005758977,1129767,-521600139,1457662,-152501387]}]],[[{"sector":1,"data":[242679806,-15960321,1996425846,108461832,16777114,-22222592,1963004477,-9246461,1963005501,-25237245,1912733757,33766868,1827210103,-2083853313,-443874579,-900899553,1478361098,-1957345904,-661774612,161482439,113704960,2312,151389895,1996423168,108461832,1374162576,67553025,-956301302,656902,134661888,-956301302,17435142,201770496,113639434,-973075955,658950,168756934,268879360,113639434,-973075951,659974,169019078,-1576614144,-956301299,590854,142016438,1354105016,1088949904,33998595,-4063223,12060790,244338882,-16538392,244320374,-1207812376,-1706033142,3112,-16146269,244319862,-2097148952,-443874579,-900899553,1478361092,-1957345904,-661774612,161494783,1175962,167950336,-6664162,-1560280833,1996425632,-401698810,1996423216,241088518,-6664162,-16776961,244319862,-1593819160,-523170398,241042947,241567235,-2096334685,-443874579,-900899553,1478361090,-1957345904,-661774612,-16353537,-1710645194,4563,-2096562013,-443874579,-900899553,1478361090,-1957345904,-661774612,151010947,-15961088,922682998,781846784,-2097151988,-443874579,-900899553,1478361090,-1957345904,-661774612,161494783,101018,49120000,1562371467,1478413133,-1957345904,-661774612,1446964355,-1710721281,4974,1357792905,1342194360,504268984,306223696,1183383552,-1866968848,1301958656,-16777198,918089334,-524791808,-1706025456,65535]},{"sector":2,"data":[1358317193,1342214328,1237402,108461824,-955977752,62534,-956266007,311878,16598726,821839558,-772514165,1015516131,-1960383735,-768871866,-150992199,-330921487,-4032885,-1047805362,-1964218633,-936709554,-2010070656,1183578186,-230258196,-747257845,79855235,1191117684,-260636734,-1957642197,1116586614,-1957685512,-998181818,2122535106,310247668,-1712044405,-150992199,1976699897,2144261,-1070923029,1342295168,1262234,-196673792,956892833,58586182,-939561751,62534,1586188267,-1846796,-1928748361,1343669318,1342187448,16777114,-159973632,-1924087765,1343669318,-2131474805,-2091862332,2113991806,-196703470,702873,-770967049,548930933,721611520,30179520,17275472,1191116800,151560692,2096383545,-310157655,535137026,80366941,-1873273344,-326412987,-2082959842,1996424428,342137350,1183383552,171869180,477430026,168574592,-2146077440,658750,1048579701,1962936846,-1572961529,192151565,-1191414017,726663246,-16061504,1320746102,146296832,-895856640,-16777197,1337523318,1048793088,1946225162,571397,-1070923029,333814352,1996423168,5290236,205422672,91488266,-352319304,1354771202,1310874,-59310336,1342198200,168640128,-1207602176,48955400,-1705983957,5147,-1191414017,-2142240685,659006,146277748,721611520,916082880,-16777196,1387854966,1048793088,1946160546,571397,-1070923029,237476432,-310181888,535137026,46812509]},{"sector":3,"data":[-1873273344,-326412987,-2082959842,-1974074132,-467007930,909766795,1333135624,-1710721281,3504,1358710409,151271167,-1705983957,5255,-1946388737,77792838,146296841,-358985728,-1962934252,-1846818,-1207328073,1344145940,1342185656,1248666,106859008,-472776918,151685002,1577717666,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,105286230,-259267542,151402041,1996437110,303077896,1183383552,922702076,-1070921470,352164432,1996423168,105286652,1342767779,1342179512,1290138,-773944576,1015516131,167944969,49120094,1562371467,313933,1167087646,518818645,-326903666,1183536652,307661584,1375736325,274646096,222792230,-397351894,1589903513,126559760,1358579337,-1006562072,-1960442274,582506039,1687834624,-1996488683,-1202260922,-1706033142,65535,734147481,178626,-1036781357,1183433259,-196675592,443810048,1090143883,-1946401143,1178204230,-13008900,-890700682,-62456064,1187507691,-352320778,-159481060,-167346680,1954608198,-163149029,-1980076297,-397345722,1191116965,-163148810,1006268151,-645990330,1577058744,-1962742397,1297948645,1426067146,-326898549,1048794628,2098792712,142016371,-1710852353,65535,201213577,-15043136,1996425334,-26106,1183383552,1958743038,137792335,-337194743,-62470344,451608576,-771983733,-28931098,161645625,1183517045,176437508,-16026615,144833606,-62506743,144825980,-62506743,-259320196]},{"sector":4,"data":[1183573713,-1568372226,71731977,151684233,151521023,1575324510,1426065090,-326898549,1187468804,-352321282,-27358447,1183572945,1015494916,-16024311,111279686,-28952311,1586227068,-1948003842,-2026306490,141887804,956892833,1132265030,-1995897183,384564294,855408259,1988824445,-1947807236,-1995883900,-16171900,1183579214,-62506498,1048830591,2100431110,101121796,-25263351,-1962115790,-472777122,-1996208501,1577663623,-1034033781,1478361090,-1957345904,-661774612,-1207374717,-1883629684,-11513321,-1710158794,6040,-1980217719,1589967446,939468294,-1961867637,302322262,642798080,637827071,100825087,399546963,1183383552,-92864516,-1694992641,6110,-2080618869,-443874579,-900899553,-1957363698,317490156,1342177976,-1728051528,-6664110,-1996488449,-1072958906,-1706029452,65535,-1980479863,317453910,1358954424,16777114,-129594112,-1930148215,1589966422,71732212,-1207465690,-4521985,-11513089,-1710158794,6068,653549252,637683593,-1207674999,-4521985,-11513089,-1710158794,3446,-1980873079,1996484694,1354771204,1996444240,-159973394,-1695254785,65535,-113015,1996484726,401185518,1996423168,-92864516,892058,-226589952,-15567872,-6622602,-16776961,-6622602,-352321281,-18423,-26032,1183514624,1575324670,503317186,1430622296,-1910575989,82609112,138034819,-10193665,-2096612850,539198,1996431733,410294790,1183383552,108462076]},{"sector":5,"data":[1342203832,-2081943920,108461825,16777114,-13767936,1723336310,244338688,-16731672,-124123530,-1879048168,270657550,-1710852353,6333,-244087,-1706031498,65535,-16353537,-493159306,-2097151976,-443874579,-900899553,1478361090,-1957345904,-661774612,-2096829309,17316414,117398388,1048774714,1962936378,108461871,768922,-62486272,-1207535873,-1873805210,16836622,-16353537,-6620042,-16776961,1996424822,198023932,569049088,-1207535873,-1873805209,2156558,-1710852353,2983,-1863840112,108461839,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,142016260,1696154,-409317376,-1996488679,-11469754,28837494,1268404224,-16777191,783875190,28856320,1637502976,-2097151975,1969686142,-59310304,1342188216,1342177720,1667482,-59310336,1342188472,1342177720,1671578,-59310336,1342185144,1342177720,1675674,-59310336,1342185400,1342177720,1679770,-59310336,1342185656,1342177720,1683866,-59310336,1342185912,1342177720,1687962,-59310336,1342186168,1342177720,1701530,49120000,1562371467,313933,1167087646,518818645,-326903666,142016260,16777114,-627421184,-1996488684,-11469754,-1070922122,436574800,1996423168,3062012,1354771280,1710746,108954368,-14781081,716766326,-1070903296,438934096,1996423168,2865404,1354771280,1718426,-59310336,1342185144,-1705983957,6727,-1191414017,726663199]},{"sector":6,"data":[1452953792,-16777190,548994166,-1070903296,442866256,1996423168,2210044,1354771280,1735578,1312719616,259260430,-1191414017,726663202,-241545024,-2097151987,-443874579,-900899553,1478361092,-1957345904,-661774612,-16454525,832177782,-1996488677,-1202652090,726663212,-1164291904,-16777190,767097974,-1070903296,449419856,1996423168,3127548,1354771280,1759386,-59310336,1342189752,-1705983957,6887,-1191414017,726663217,-157658944,-16777190,850984054,-1070903296,453352016,1996423168,3389692,1354771280,1786266,1678165760,-956301051,17132550,49120000,1562371467,182861,1167087646,518818645,-326903666,108461828,1903770,-62486272,2930768,1354771280,1790106,-59310336,1342188984,-1705983957,7007,-1191414017,726663215,1855606976,-16777189,817429622,-1070903296,488479312,113704960,66920,90965703,-310181887,535137026,46812509,-1873273344,-326412987,-2082959842,1048775404,1962935652,1748927242,57999365,-2097027351,1138750,1474888565,1816036097,58523653,-16704535,-1710325194,7123,-2081012087,353342,922708340,1016729952,-1996488676,1996487750,-1506344970,-1472790771,-1237909747,-1204355317,28856331,-1202696192,-860225504,-1706012160,7269,-1694730497,7277,90586755,-385649408,922681497,546966424,-16777188,-1710172618,6143,-2069643221,143172360,-1559723357,1721960582,-9114875,-1710453194,7286,-506231]},{"sector":7,"data":[922744438,922684838,922684840,922684342,-1202713672,1347420161,-1174198600,1347551266,1875866,-126419200,1877914,1614216960,500931089,1183383552,-159973380,228996863,229127935,196491007,196622079,112720,-2034741168,15645184,-929410990,-16777188,-795149194,-16777188,-1070922122,922701904,922684824,1996426660,-1202695946,-860225504,-1706012160,7705,-1695123713,3045,1048779243,1946158436,108461834,16777114,-16192768,-6683018,-2097151745,354366,922683764,77204622,-16777187,-1710137290,4429,-1710721281,6443,1358579337,1342188728,1342177720,1912218,-92864768,1342188984,1342177720,1916314,-92864768,1342189496,1342177720,1920410,-92864768,1342189752,1342177720,1924506,-92864768,1342190008,1342177720,1928602,-92864768,1342190264,1342177720,1932698,-92864768,1342190520,1342177720,1653658,1678165760,-956301307,354310,1812383488,-2097151995,-443874579,-900899553,1478361092,-1957345904,-661774612,-2096436093,353342,1048775285,1962935656,16312579,90979971,-2095874816,353342,-6682764,-352321281,-26107,922681344,-409333408,-1996488675,922745926,-694546814,-1996488693,1048835654,1946158436,-59310294,1342177720,-1237909680,-1204355317,-159973621,228996863,229127935,-1174396744,1347551436,161434,-10556672,28900470,-11513856,-16009674,-16009162,922744438,922684838,548933032,13416960,1905938514]},{"sector":8,"data":[-16777186,-1710453194,8133,-375159,28900470,-11513856,-16009674,-16009162,1347484278,-1174354248,1347551368,2095258,-92864768,1999258,-159973632,2001306,-59310336,2111386,108461824,2055066,-129595136,-1710852353,6437,-126419120,-521662832,108462076,-1694992641,8081,-1962742397,1297948645,503317194,1430622296,-1910575989,108462040,2036378,1975520000,108461836,1342186168,-351698968,542677525,1996423168,-401698810,1996423187,-401698810,-310116696,535137026,46812509,-1873273344,-326412987,-2082959842,1996430060,545757702,-1073020928,1996426613,2209798,154855504,-1711196695,65535,90455683,-2096466688,354366,451478389,1816036097,326959109,90455683,-1710787584,7627,-761657877,-16777187,983172726,-1996488680,922740294,922684342,922684826,-2087056402,-1996488673,922742854,922684344,922684846,-325448602,-1996488672,1996483142,-428409082,1608602,-1237909760,-1204355317,112651,-1070903216,-1818603440,-1996488671,-1072958906,-1561787531,1996443648,-361299984,16777114,-227082496,2085274,-431585024,291518207,2099354,-96040704,736524031,-11513664,-16009674,-16009162,28899958,-1202696192,-860225504,-1706012160,8239,90717827,-13077504,-1710453194,7104,-637303,-1070864778,922701904,922684342,1996426168,112886,649613392,12302850,-56995758,-16777189,1268446838,-1207959520,-11534334,-6622602]},{"sector":9,"data":[-16776961,1402665590,-16777184,77260406,-1711276004,3722,-1962742397,1297948645,503317194,1430622296,-1910575989,1089242072,1996445271,409442822,244318208,-16249112,1469711990,184549390,-15895104,548931190,-974630912,91678983,1342177976,16777114,-901347072,58048523,1342322153,1342181048,383927949,-26032,1183514624,-1069119004,-1981397365,1996487750,-25910,1183383552,-598308390,2004140555,-2459905,-1207177674,787939338,-1706029670,8451,-16009565,922737782,179833958,-1372653824,848973837,-1560281088,1183517624,-1037329984,100923601,-1952904266,-101203890,199116425,-16550464,1183571526,-563152960,-1962166621,731511878,66638274,-1727285242,-134459765,-565802503,58048523,-1948367105,1861745734,-1962284066,-1230782394,-62485749,-1593067357,104402328,58657718,-1995721055,-1532888506,-1207551731,-1593606389,1183386552,196518386,-1588576192,1077939128,112720,-1070903216,-6664112,-1560280833,-1073016480,854131573,228106500,-1711651285,-120470997,-1592940893,1177226660,-1037329934,-1465648943,-96040179,228984323,-1962038621,100921926,-1398600280,210155533,-1497870306,-1706025459,9319,-559693781,282895120,-1559176541,1996427480,570333898,1183383552,1614217154,596744721,1183383552,28856560,-11513856,-16009674,-16009162,-1070873994,1996443728,-59310144,-1174396744,1347551436,16777114,196518144,1979336249,196649224,1962034745,108461869,-1947175169]},{"sector":10,"data":[1346435654,1089619595,-1237909680,-1204355317,-92864757,-386763009,1183515585,196518906,-1544403317,1996426168,582523586,1996423168,591501830,1183383552,922702036,922684838,1996426664,-227082246,-1192200449,1347420161,-1174396744,1347551436,2416282,-730398976,1892762,108461824,-1697351937,9051,-1695516929,9226,-1710852353,8913,1354771280,361114,108461824,2006170,244338688,-940068888,17125894,53078272,1342178232,2426522,-129595136,58048523,1342311145,1533082,-968455936,-1916250487,-259273602,-1910634730,-1515870758,1996431269,402103032,2122514432,108267468,147619459,-1734276235,196518669,-351427423,-834237641,-1946925431,1183436870,108462070,2418330,-733574912,1355577087,385107597,61532240,-16353537,-1332030346,-1962934242,-1230769082,-163149045,-1593067357,1077939126,196649296,-1202700224,1347420161,1347469355,2074522,291545856,58048523,1342325993,2391706,-263812864,1354771280,1123482,-1466281984,-16777199,-1070862218,922701904,922684342,565709752,15776256,1251627090,-16777204,1996484726,-25908,1183514624,474572,138217332,-351243264,-260636898,-3246337,-6631306,-16776961,922742902,922684342,-6681672,-16776961,1996484726,-25902,1996423168,511286000,-1734279168,-1241106163,-1593606389,1183386550,228893178,196609593,-1197407361,-230258421,722311329,731511366,-1543974462,-1532949082,-230282483,-775804007]},{"sector":11,"data":[229155832,66733707,-1559386618,1183518122,-1476000782,229417741,504137400,229029968,-6664162,721420543,283026368,-1559176029,-660401958,1614216976,508336657,1183383552,196518384,1979336249,196649224,1962034745,108461865,-1018113,1996487286,-1237909518,-1204355317,-92864757,-386763009,1183514989,196518906,-1544403317,1996426168,112880,922701904,922684342,1996426168,1354771440,2144336,1375784122,507746896,1996423168,512858630,1183383552,922702036,922684838,922684840,922684342,-1947661384,112893,547461712,1183383552,1975520224,15722755,-1230782421,-2081387765,-1554644282,1077939128,112720,-1070903216,-2120593328,-1560281053,-1073016480,-1763114123,228106496,196478507,-775804007,229024760,722314401,-1727285242,-120470997,-1592940381,100863398,-1432155210,229155085,196609539,-1207063389,1344146566,504211128,568105552,-1070923776,-1559175517,-626847524,282632976,-1696565505,65535,-1710852353,2445,196492931,-2093452032,768062,922694005,-73789088,-2097151972,1103422,922683764,-811986730,-2097151963,759870,922683764,395971480,-16777188,632817270,-13702400,-258341258,1342177317,-1705983957,8905,-1710852353,8896,-401698736,113767568,66918,-206615,548931190,1374179328,518167042,1599995904,-1962742397,1297948645,1426064074,-327029621,1048772738,1946158414,1379828492,91553797,-352321096,309788455,1350583949,1342210232]},{"sector":12,"data":[1342186424,-1705983957,10359,1186484254,-1202708980,-1706033071,10375,-8485239,1946157373,9234691,89261767,1183514625,1946551050,-301581556,-1593147893,103484398,1183386740,138840842,209585667,208012859,1721830014,2114333452,138840332,50742923,1342993414,51226785,1342995974,722093707,-11532730,1996424310,242679568,722224779,-1706032058,9972,51226273,1342993414,50611851,1342995974,-1962248449,1177225286,1996443652,239504144,1342588459,-1710459137,65535,-1034033781,-1957363696,175570924,637820612,1996437503,571400,656382544,-11534336,79169654,1016745984,1342177319,-1006614296,-1993997218,175570695,41418534,-1207404801,-1706033142,10057,142016336,1342179000,1398682,518541312,73319424,38242598,4162342,-1073018498,28837246,721611520,1575324608,1426065602,-326898549,-263796976,1187446785,-2097151498,1962935422,13232387,755648139,121438209,-385649152,-1073545029,-1476448621,1187456982,-352318730,-163133631,988479588,-17807673,-163133696,787167296,-17807673,-163133696,585827304,-17807673,-163133696,384509712,-385333621,667943042,665135006,667166648,667953068,1183524816,1347590640,-1727510901,10113106,1375731752,105286480,-1706012007,10263,-1979955575,1183579734,1347590646,-1727773045,-6664110,-1996488449,1451882566,-62485510,66999947,1444149318,77306,1375787651,-92864688,-1694992641,65535,-1980610935]},{"sector":13,"data":[-770968490,92212092,1988099901,-339727612,-230257917,-1034033781,-1957363704,-2131983892,108461824,1350583949,1342210232,721712895,-2087038784,503316492,280148048,817385502,-1818603520,-1962934260,79846885,-1873273344,-326412987,-2082959842,1048774380,1946160100,-466157751,683055627,1183383552,-2110324740,695114254,1183383552,-59310086,1347469355,228079359,228865791,1358591743,2144336,1375784122,698260048,1996423168,686463738,1996423168,705272572,-310181888,535137026,516640093,1430622296,-1910575989,216826840,89261767,1822490625,-1546062075,-1969158804,-1546062072,1996425354,578198022,1183383552,-1975614474,108855304,-26032,1048772608,1946158436,-159973622,2808474,-2096108800,354366,1996425332,485202678,1048772608,1946158018,108461832,16777114,92446976,-2103191305,-466157819,695900683,1183383552,-2110324742,715233806,1183383552,-92864524,1347469355,228079359,228865791,1358198527,4634704,1375758010,700422736,1996423168,1354771444,-1741226160,-1539899635,-92864755,1186484304,6732288,-526757806,-16777175,-1070859658,922701904,922684824,1996426660,-1202695948,1723465798,-1706012160,10753,737572607,-11513664,-15886282,-15883210,1347482742,-1174396744,1347551436,2804378,-193528064,2757018,-92864768,2806426,1681818368,175439877,90717827,-385649408,-626982594,-1475989232,229155085,282723889,823188129,-1592940538,103878872,-1499394650]},{"sector":14,"data":[-670682867,282632464,228984369,823189153,-1592939514,103878060,-559869730,-1408880368,282894605,229246513,822979233,-1592730618,103878876,-1432285782,-1509545203,196518669,722316449,-1559386106,1048775608,1946158436,1816036172,981336069,291518207,2813338,-62486272,-624897,-15882698,-15882186,-16009674,1342945334,1342177720,2144336,1375784122,722901584,1996423168,723426044,1996423168,581278454,-2081882112,1816036096,1954414597,210646783,2828186,-129595136,-624897,-15882698,-15882186,-16009674,1342945334,1342177720,52869200,1375740602,580754000,1996423168,577673976,922681344,-224784032,-1996488671,1996487750,-1506344970,-1472790771,-1237909747,-1204355317,28856331,-1202696192,-289800058,-1706012160,10458,-1694730497,10466,-1695123713,10574,143277699,-16220672,781907574,-16777175,1996424822,581999350,-310181888,535137026,46812509,16973951,200789,16973931,74754,16973947,73583,131200,16717559,196620,16712134,131089,16717739,196621,16721327,16973843,74698,196611,16722090,16973851,198409,16973948,74727,196620,16721980,16973852,198382,196733,16721907,196637,16712632,16973854,74743,196622,16713243,196639,16715605,196640,16715561,16973857,206428,196609,16713323,16973858,66054,196627,16713618,16973859]},{"sector":15,"data":[66039,196628,16713577,196644,16713569,196645,16719994,16973862,200471,196614,16713552,16973863,137047,196623,16713540,327720,16715114,196672,16713524,16973865,204493,16973961,140735,196625,16713512,16973866,206350,16973962,140025,16973842,66261,196635,16713412,16973867,140054,16973843,204584,196747,16713404,16973868,74687,196637,16713332,16973869,204867,196749,16712991,16973870,205545,196750,16713145,16973871,137077,196631,16721384,16973872,200318,16973968,137226,196632,16713019,16973873,76624,16973858,198118,196626,16712709,16973874,73934,16973986,198187,196627,16714211,16973875,73661,16973987,74281,196643,16714184,196660,16721304,196661,16713976,16973878,200019,196630,16713946,16973879,201250,196759,16713780,16973880,201263,196761,16713756,196665,16713723,16973882,201844,16973978,203435,196763,16713706,16973883,196845,196764,16721484,16973884,74659,16973869,203419,196765,16714855,196669,16714756,196670,16714739,16973887,200602,16973855,75055,16973872,199851,131105,16715117,16973888,198852,16973990]},{"sector":16,"data":[198895,16973991,200562,16973863,131516,16973872,200584,196648,16722237,16973896,200010,16973865,69975,16973881,136960,196659,16722269,16973899,137012,16973876,206303,196654,16722784,16973903,76632,16973892,199835,16973877,71462,16973894,197779,16973880,136684,16973893,136702,16973894,136349,16973896,75538,16973904,207134,16973890,132787,16973898,73914,16973906,207738,16973892,197876,16973893,74653,16973911,206202,196682,16718085,16973932,69999,196701,16718039,196717,16717952,196718,16717905,196719,16719699,327795,16717556,196620,16719692,327796,16717736,196621,16721608,196725,16721296,16973942,200081,196695,16722799,1953300599,1167087646,518818645,1996478606,4777990,74825739,904642603,-402229505,-1073020735,1996485236,19916806,-395001845,-402229505,-1073020516,1996480116,34269190,-730546165,-402229505,-1073020297,28887668,49120000,1562371467,182861,-2081649835,1085801196,448286720,-6664192,-1996488449,-1072955834,-1070922635,1586193387,71732222,1342850953,503844024,-26032,1586167808,206014974,-1995961160,1603015239,239585044,1200160768,408914966,1342177976,16777114,-27358464,-955234423,-956298489,-64953,-16496697]},{"sector":17,"data":[516131839,-26032,-1073020928,1996465268,-25858,28835840,1575324416,1426064066,-326898549,4241410,1751120,6789712,1183383552,1975520254,-339727612,-27358380,-1996208501,-861861305,239569155,-1995957576,1603016263,1354771224,43418,-27358464,722487177,340232640,-955103351,-956300537,-64953,-16496697,516131839,13015632,-1073020928,1996469108,13802238,28835840,1575324416,1426064066,-326898549,4241410,1751120,15637072,1183383552,1975520254,-339727612,-27358381,-1996208501,1204226631,-1207959538,1200162834,408914966,-1705983957,281,-1979818357,-1070919609,-1995159671,130486855,1204224011,-939524350,-64441,1344193419,81562,1958742784,-25755724,84634,112640,-1034033781,-1957363710,49054700,1342193848,1342184120,91802,-28931840,74825739,1424736299,-1946263925,1200161862,63742218,-1207023735,1200162858,408914966,-1705983957,400,-1979818357,-1070919609,-1995159671,130486855,1204224003,-939524350,-64441,1344193419,112026,1958742784,-25755725,115098,112640,-1034033781,-1957363710,49054700,1342193848,1342184120,122266,-28931840,74825739,1407959083,-1946263925,1200161862,239585034,850919424,373786888,723017612,144330944,-1962934270,1200225886,-1983894768,1200165959,185059090,38258432,1204289535,-1946157308,-1706025277,557,-1267417077,-1694599425,569,-1962933832,46292453,-326413056]}],[{"sector":1,"data":[-1207767933,-1202716608,-1706033126,597,201213577,721712576,-1958483008,1183579742,172460292,-1996239711,582487623,373786888,-954703988,397383,198599,-16627769,71813119,-1014235137,-1533390818,184549378,-3902272,-1332019594,-1207959550,-443875327,285393501,637534720,67174146,-1660943872,83951362,67109376,100728579,-872348928,83886594,385942272,117441027,-2046754048,-1375730944,184615680,956302083,2130772736,1459618050,-1174403840,16842496,838862080,33619713,-1459616512,50396929,553649408,67174146,-1744829184,83951362,-16775936,100728578,-1090518528,16842496,922747392,33619713,-1375731200,50396929,1937009920,1167087646,518818645,-326903666,-26104,1183383552,-61437446,-1962223453,198878146,-1727342431,-1037319629,-754974023,734147576,-670694462,234267402,-1727276383,-1037319629,-1036781357,100909611,1285753818,98619662,-1264386043,1543948043,-1207953391,-11534312,-16021962,-1710517706,65535,-16108381,887621238,-129595136,443858955,-16508184,-2065168778,40036355,-402229505,283640001,93513733,-6683157,-1962934017,-310118330,535137026,46812509,-326413056,-16454525,213386358,-1706025464,65535,185373859,721778112,8513984,234239743,-150993480,1343114286,1342177720,1354771280,16292432,-2036137984,1958742798,1095898,28856400,726683648,-1706012480,275,185442467,-1195346752,1347420176,1342177720,9353296]},{"sector":2,"data":[-6664162,-1560280833,-1073017356,45655412,-1070903296,-1706012592,65535,185364131,-1198492480,-1706033145,65535,185488035,-385649216,28901245,1575324416,1426064066,-326898549,-11118824,-1207135178,-1924136946,1343679046,16777114,239902976,50716881,-297387264,1776878460,-1808335103,-26100,1183383552,-297366534,-1728052435,-120470997,-939637111,59462,1988843499,1191105000,737834751,-11120448,28896374,1996443648,1354771450,1088964235,2144336,1375784122,32086608,1996423168,1354771450,-327745706,1342177720,737834751,1183535296,1346388200,-1174354248,1347551368,16777114,-398032128,-28931326,2095597113,-92864607,1342178488,80026,-6664192,-16776961,-1070859658,-398030000,1346435281,-1192462593,-1202716671,-256245727,-1706012160,65535,15222471,-1956123904,1979973238,-394359832,1996488657,1354771450,51268769,1346388167,-1192462593,-11534335,-1070859658,38047056,2144336,1375784122,43162192,1996423168,1354771450,51268769,1346388167,-1192462593,-11534335,-1070859658,54824272,13023312,1375766714,29530704,1182990336,1183515368,-398050818,1996460412,309498,50436688,-1706033152,775,737834751,1183535296,66638312,1074678790,1996443712,112876,2209872,1375793338,36215376,1996423168,-25862,1599995904,-1034033781,-1957363710,183272428,243676927,97946,-62486272,1354771280,131482,127553536,-16777214,-1070859146]},{"sector":3,"data":[922701904,95948278,1278146304,565727246,15776256,-1415950254,-16777213,79232118,-1432727552,1342177282,176282,-96024832,-157220864,-1036805875,62505515,871944960,-1983763518,1183577670,1278146554,-1580692722,731450956,66638274,-28407352,16416387,1183531893,234267126,734147481,244162,-1036781357,244040235,-936702474,2130071099,-59310240,-624897,45678198,28856320,565727232,15776256,-308653998,-2097151997,-351996346,-59310144,-1946781953,1177288262,-1588576006,865668598,-1178457150,-120389629,-1037319629,244048081,-936702474,-96040111,1346953425,-1174396488,1347551472,186010,-96010496,100302467,1172898685,-59310081,188058,1575324416,-326412861,1443163267,16664263,-25263360,-2094042105,1946877566,-25263319,-2094828533,1946746494,-25263331,-1961397242,-422445450,-1962641665,503365252,-26032,-2071396352,1191120376,-25263106,-339575284,-27358449,279045073,-125335282,-28901619,419331715,-861803652,237544195,-1559359327,245566988,235447054,-1559361885,1996426756,53000196,1117409310,-1560281084,-1956772918,46292453,-326413056,1347469355,833616,239873783,1342180357,-150991688,1343092270,1342177976,1342180536,1342183608,1342178488,-1207926040,726663169,-1202696000,787939333,-11530676,-1207044554,-1202716667,-1202716671,-1202716667,-397410303,45613147,-1070903296,1354256464,-256356352,79187968,112742400,414732288,129519616,954748928]},{"sector":4,"data":[243712,1354771280,833616,171192055,-775804007,465064184,1546581760,-1037330159,-1202652975,-1202716668,-1202716663,726663204,82333888,1575324416,-326412861,-1207767933,1861681172,200410388,519980681,276234064,-15567105,1996426358,-26098,1586167808,105286654,-1962129527,1200162886,172395274,-1962391671,1200161862,1317771538,-1980106998,1183518791,-101213948,-1961994359,314727909,-326413056,-1207767933,1487077384,286434065,957056673,2114687494,302434080,-16773103,-1710361546,1517,1358841481,1347469355,1342181560,-352319304,193372455,194119225,113721469,1053016,234108671,193946,-28931840,1354771280,571472,1095760,-25755824,1347469355,1342179512,2144336,1375784122,-26032,1996423168,67214078,-443875328,-1957313699,49054700,1342179512,112720,-1363652528,-1706025472,222,1358841481,16777114,180134656,-1694599425,65535,-1017256565,1167087646,518818645,922736782,28840204,716722176,-1202708978,-1706033120,1674,286013183,1342177976,504030392,2144336,111188560,922681344,62394636,1186484224,-1202708980,-1706033120,1718,286013183,1342178488,504410808,2144336,114072144,922681344,95949068,-1162326016,-1202708981,-1706033120,1762,286013183,1342179000,504445112,2144336,116955728,922681344,129503500,414732288,-1202708975,-1706033120,65535,286013183,1342179512,504268984,2144336,119839312]},{"sector":5,"data":[922681344,163057932,-524791808,-1202708976,-1706033120,1850,286013183,1342180536,504214200,4241488,108304976,-310181888,535137026,516640093,1430622296,-1910575989,485262296,-1705983957,65535,199509641,-385649216,-1202716165,-1706033112,1915,-16021853,716760182,-1969598464,-1560281081,1996426130,571620,127507024,1990393856,-461963508,1342180024,16777114,209888000,-1192986881,-1706033148,1975,-15885661,112780406,1822052352,-1560281081,1996426670,102669028,1990262784,-1036805876,62505515,871944960,-1715328062,-2103357358,1347590412,527002,-431585024,199775881,-385647150,142540946,2013257533,8972547,-1727236447,-541568942,1389505535,137140816,1347551232,-1542401,966452854,-1560281080,-2103374730,1347590412,738189240,-1706011950,2126,1996443730,-428408856,547738,209888000,-1727161695,-541568942,1389505535,141597264,1347551232,-1542401,2107303542,-1560281080,-1365176934,1347590413,738189240,-1706011950,65535,1996443730,-428408856,16777114,229548800,-1532772309,228107021,112720,1354771280,19438160,-1163722752,309258,53713488,1789067264,67155976,112720,726683728,-1706012480,2261,-15957853,-1593018826,103484546,-1202713676,1347420161,1347469355,585370,243442432,228079359,228865791,1342177720,1354771280,104634960,-459079680,-1170308341,359923722,141180547,-2096204800,819262,1048774516,1962937986]},{"sector":6,"data":[-1170308253,158597130,179975935,601498,1782481664,158597128,141178623,605594,-2143386880,158597132,209729279,609690,-2109832448,158597134,243414783,413850,-465665280,158597131,199505663,597402,-1547687168,-2103243804,209756942,-1559729501,65735354,-2097151560,-443874579,-884122337,16973847,65640,196736,16711831,196625,16714077,196627,16713156,196635,16713751,196636,16713697,16973853,66343,16973853,66150,16973858,67094,16973859,66361,16973869,67768,16973872,67416,16973876,67141,16973884,67734,16973885,197771,16973997,196792,16973999,198414,16974000,67522,16973892,67496,16973904,65893,16973906,67746,16973911,197994,16973896,196622,1953300566,1167087646,518818645,-326903666,108461846,16777114,-330921728,768080,49781328,-1706033152,65535,-1192462593,1344146362,1452953630,1342177280,23706,-96040704,-1543743863,-1031074838,-15994717,951643254,508567057,-26032,-1706033152,65535,-1980086647,-358482858,-96061173,1183516278,199926778,957083809,108461126,-1543747957,62393328,-265357568,-1037330165,100792529,62393322,-265357568,-1036805877,45728299,871944960,29502402,-15994874,1996424822,-25876,113704960,1051350,243271367,280494104,922701824,922684294,-476443758,-1560281088]},{"sector":7,"data":[922684164,922685056,922684294,-6681710,-1560280833,-2136928046,193766158,-1559178591,-694088810,-754732790,239772640,-754252639,240428000,-787578719,1241908192,240952078,-1559178591,146280068,-1202696192,1347420161,1347469355,16777114,195994368,-16093464,-1207194058,1385758736,194951248,-6664162,-16776961,-1710510538,65535,-1207193437,787939331,243994240,-506393014,1183432963,282239478,244048081,-506393616,100909315,1183387220,200319476,-775804007,-1949791240,731510342,737726914,-368694335,208184075,737429131,722522630,-1559498746,129502316,-1248178176,-788529151,-163184160,1342179512,16777114,31510784,1996485702,-297366266,1996443670,-193527818,16777114,108461824,-1705983957,65535,503849656,132954192,-1070903266,1385185466,-163148976,-775804007,-296842248,-1957574613,731509830,-1946627646,-936644530,-159973551,-755969,-1070922122,204930896,-1706012655,617,1342535843,16777114,49120000,1562371467,182861,-2081649835,1924663532,-1202708984,1344146362,-1174404680,1347571712,208156415,208418559,199898879,200292095,1342469887,286013183,1347469355,174490,91923200,503871928,288929872,-1070903266,1380974778,208183632,199886339,200279555,1815543632,-365494516,-264831221,74907403,1342177976,286013183,1347469355,16777114,92054272,-1929087233,1343682630,16777114,-129594624,-1711520253,-120470997,-96040112,-1711389181,-120470997]},{"sector":8,"data":[-26032,-443875328,180829,-2081649835,922684652,-6681682,-1996488449,79232582,-6664192,-1996488449,-1070859706,2005584,1183383552,-196687880,1187446784,-16776964,1996424310,-193527810,-1694730497,65535,91537931,-336050549,-96040189,59415120,1996423168,-196703484,181808887,193725955,-62485680,184823543,194381315,181838160,77680712,-1202698229,-256245727,-1706012160,941,-2080618753,2080963710,-196673630,150240899,1996461180,-25858,1996423168,-1338573052,62429707,1183383552,74907638,240924415,243545855,239744767,240400127,-1174396488,1347551472,16777114,74907392,-1695123713,36,-1593542913,1212681100,194421072,-1706014648,1092,-1593542913,1212681100,184852816,-523041871,194381315,67410512,1996423168,181838084,-523041871,193725955,184852816,100917459,-1706030186,1054,-1593542913,61934294,100917459,-1588589684,1212681110,70425168,1996423168,193765636,-1588574136,1212681110,72981072,1996423168,240951556,-2069802936,-1706014706,65535,-1593542913,1346899548,51283105,1343116294,291226,74907392,51272865,1343113734,51283105,1343116294,296602,74907392,51272865,1343113734,1208911009,77109840,1996423168,240951556,-2069802936,-1706014706,65535,-1034033781,-1957363708,49054700,1023952523,276038144,1946288445,33701230,-1209465995,13363456,141442691,-385646848,1048772801,1962937318,12052739]},{"sector":9,"data":[-16353537,-2115500938,1975520006,11004163,-16353537,401081462,1975520005,112645,-1070923029,240518707,-1964440715,175570688,346778,-28931840,108461904,-402360577,1996424500,-25755894,352922,-2090276096,552510,1996440693,74907398,-1559876632,-1073017882,1996434548,74907398,-1559969304,1996426838,1153546,1183383552,1996443902,74907398,-16453656,1996425846,11705086,1996423168,-26102,117374976,401279086,141442691,-15696384,-2096599538,552510,-6683275,-1962934017,146955749,-326413056,-955585405,64582,16402119,-163148544,-6664170,-16776961,1183648374,-1706027274,65535,1023952523,57999373,1979749865,25815299,1946159421,10348821,425603,-1796668547,175570688,-385875272,2122514562,58523654,-1711242519,1538,92014139,922684277,-6683272,-352321281,102341228,104529920,108332410,92026623,922740971,-487914118,412570,2013674240,-2094566139,2097153662,1443284749,-956301307,33749574,1048786923,1962935638,1443284784,-956301051,33684038,-6675477,989855999,1946515974,-8853245,425603,1996427132,112650,31844432,33310407,-92372224,-15830016,1996425846,-163148294,568872982,-92371970,-385649664,2122514666,57934076,-1207901719,-571932671,108954368,-1949402112,624756806,1026585600,208928806,1946167101,2637102,116070772,688587937,-1935542202,-163170037,263725437,-701565184,-1590957302,1174473476]},{"sector":10,"data":[-1578636296,1177094870,-1579160586,1174473430,-1579684874,61934294,100917459,1178274700,-1592819722,731450070,66638274,-1995731962,-1767770554,-129615605,263719293,70186752,-1592530165,61934340,100917459,1178274710,-1592819720,731450116,66638274,-1995729402,1996486726,-163148534,949637142,-16777208,1996486262,138648312,485031936,1785343,2011759477,2113022,-1209465995,2440702,82379635,2637311,686359415,-17176065,-443826133,574045,-2081649835,330826988,-1483059200,184549377,-385649472,2122514613,91555588,-352321096,1354771202,16777114,75399936,-385649657,1183645849,-1706027268,1447,-1928956161,1343683654,373914,181838080,-775804007,-1945762824,-62506229,263732095,-701565184,-1037330166,100923601,1178274700,-1591313156,731450116,66638274,990615046,360709702,-150990920,-1727331282,-120470997,194381315,2113816123,181838134,-775804007,-1945762824,-62486261,-1727331167,-120470997,194381315,-113015,1183647350,-1706027268,65535,-231681,-694485386,-1962934270,79846885,-326413056,-1962087293,20776006,1023964160,1148452866,-1593801495,1183385706,196125176,-1962382685,-1331431354,54716427,-1710852353,2216,1358579337,329114,-62486272,1358591743,1342178232,16777114,-92864768,-1694730497,1309,-1710852353,65535,1358579337,1342177720,120986,-92864768,140698,108461824,16777114,-1372127488,148347403,922681344]},{"sector":11,"data":[-6681680,-956301057,358918,2080818944,-1962934267,79846885,-1873273344,-326412987,-2082959842,-1070913812,-1979955575,1183578694,539916,-991362186,474368,-2098658446,81152,104663668,-385649408,1475018898,-401705217,1183578378,-61436934,-16726295,1996426870,105286924,1642614806,-1577989,1183649398,-1706027302,65535,-15829249,-2014782858,242679801,383403661,-26032,-1024786432,-15829249,1996425846,108461832,201071336,-5278528,1996426870,175570700,-16222465,-6683018,-1996488449,1451883078,-7083012,1996426870,-35854324,2122549483,-2106261496,-15829249,-1662514570,-8984066,687747,1843987317,142509055,-385649664,1996488548,100375054,1508442112,16858623,4001655,1032680193,57999375,-335585047,17907094,4044916,1032614402,58130946,-335594263,49120130,1562371467,707149,-2081649835,1589904620,126559748,193725995,-703689831,-1980106998,-1960379322,103481927,-1952904298,-150273010,-28931591,-472786805,194938763,-1325399622,-61986297,-1037835565,-1034033781,-1957363708,149717996,637820612,103483275,-1952904308,-150284786,-129594887,38243110,194381355,68062105,-1980106997,1048837190,1946160726,-774337770,112867,1311377329,-136260616,-1635311152,-1961628917,-472777634,-1325399624,-129095161,-2029395757,922684318,280497070,1347590400,504078008,21207632,922681344,-828765264,-16777208,-1710510538,332,-16011101,1048774774]},{"sector":12,"data":[1946160726,309253,-1070923029,50502224,-1706033152,2854,-1962379521,788002886,100862678,-1957688436,788003910,100862724,-1588589674,1346898646,1208681633,2209872,1375793338,189373008,1996423168,-1338573048,190093835,1183383552,142016506,240924415,243545855,239744767,240400127,-1174396488,1347551472,222362,142016256,-1694861569,818,-1034033781,-1957363706,73319660,638291105,763103033,-1324689759,65065731,638290950,494798651,638293665,2080524089,184852756,100917459,958794646,92078663,-352321096,-1950340350,79846885,-326413056,1342938808,-1324597087,98620164,-397410088,-443875299,-1957313699,205562348,-523041615,1342232581,1342938808,-1962933016,1438866917,-326898549,1187468802,-1962934018,1182991966,1988821510,71729924,-1996190974,-28901625,150896259,-1956715140,79846885,16973862,199051,16973931,65743,196736,16714431,196627,16712427,196635,16713877,16973855,66534,16973843,66508,16973844,68378,16973853,198580,16973841,197994,16973842,198023,16973843,199114,16973846,198124,16973847,198463,16973852,68328,16973869,198593,16973853,197305,16973856,65833,16973872,198837,16973858,198988,16973863,199010,16973864,197148,16973865,68296,16973884,198780,16973870,198535,16974003,66430,16973892]},{"sector":13,"data":[198853,16973877,198845,16973883,198789,16973890,66336,16973907,198816,16973892,198474,16973894,68322,16973911,198561,16973895,65593,16973915,131123,16973914,68278,196714,16712141,1953300609,1167087646,518818645,1996478606,-26106,-1706033152,63,-2096502109,-443874579,-900899553,1478361090,-1957345904,-661774612,166346371,-15961088,922682998,-1885730326,-2097152000,-443874579,-900899553,1478361090,-1957345904,-661774612,-16061309,-6683018,-1996488449,1451882566,1946561530,-163149556,103531147,1183386750,108462076,1358329599,16777114,108461824,16777114,-1281732608,-1560281088,-310179352,535137026,46812509,-1873273344,-326412987,-2585058,922682998,-107345432,1342177280,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,1354771206,16777114,-96040704,242597899,504021688,112720,-26032,1996423168,108462074,154522,-96040192,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,92421763,-2093383936,361022,-6681987,-1879047937,11397134,1342177976,-1560215368,-523172480,1385816273,-26032,2124611584,1958742789,1156272131,92276423,1223360512,956661921,2080735750,2117533503,32283141,922681344,109053310,-1593768575,-523172480,1385816273,178256,-26032,-1073020928,780207733,16778624,92157695,16777114,286565120,286660233]},{"sector":14,"data":[956661921,2097512966,92447017,-523116335,286524931,286660235,-1980086647,1589967958,138841082,-1962440410,-1993996730,117375559,-310180478,535137026,80366941,-1873273344,-326412987,-2585058,-1710916042,65535,92157695,16777114,2114373376,721420293,286696384,-1559161693,-2103245440,49120005,1562371467,1478413133,-1957345904,-661774612,286531268,641204006,-1878886401,-19142642,-1962742397,1297948645,-1873273141,-326412987,-2082959842,1048773868,2114061698,108461898,1342179512,16777114,2107265024,-1996488702,1996487750,372702982,339148561,-2110324975,-26107,1996423168,-59310330,16777114,108461824,286668543,286537471,92419839,225434,-2094077184,361022,1996433278,337560582,2013210129,2013210116,-26106,1996423168,337560582,939468305,41418534,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,108461828,468192912,108462077,1642598032,-401698563,1996488484,-26106,1183383552,1095932,-26032,-1073020928,1996426365,112646,53123664,1996423168,-401698810,244383515,-83224,1996424822,-25860,1996423168,-401698810,1996488043,-401698810,-310117144,535137026,46812509,-1873273344,-326412987,-2585058,244319862,-1862490648,-21567474,-16353537,-15657418,-15657930,-1710915018,65535,1692929680,108462078,-1511518576,49120252,1562371467,182861,1167087646,518818645,-326903666,-950642930,62022]},{"sector":15,"data":[-1962385781,120259655,-1946532215,1194001991,-129595134,-1957670247,1385762374,64461392,-930414592,-1946532213,1347590618,-1727248757,-242528174,-6620277,989855999,2131459287,1992702724,112645,-1070923029,-939768183,128070,-16725271,1586169462,50825992,-1957686714,1174602311,244338704,-2097087256,1946221694,108461838,-15829249,244321398,-16708632,1183052358,1182991366,1586168840,71797512,1183385387,105352186,-1996339413,1385822278,239504208,-1706012007,1125,1183565963,-1713730566,1183535186,1347590412,-74714741,457626,2094480128,990150411,-1207601466,48955393,1183432747,-62485514,1962296883,108461875,-1962385781,306578183,38243152,1343243779,1860701840,-58817792,-15830016,1996424822,209125134,2112360080,-230228224,67520131,-1980348789,1191181382,172395508,2113160761,-13899517,-1962510593,126552158,1343374851,50481035,-1873801146,2615310,16547459,1996426868,242679558,-1878231297,3598350,-1947056385,1600057926,-1962742397,1297948645,503320266,1430622296,-1910575989,173968344,-1995946357,105286407,-2097002615,-443874579,-900899553,1478361094,-1957345904,-661774612,-1962254709,117508166,17188491,-310181305,535137026,113921373,-1873273344,-326412987,-2082959842,1996444396,571406,39164496,-1706033152,20,-1928431873,1343663686,-15960321,1183517302,205925128,105286480,1342850603,204086923,-1207966767,-6683260,1342177535,1353598605]},{"sector":16,"data":[-404222320,1922715901,-2097151998,-443874579,-900899553,1478361098,-1957345904,-661774612,1443687555,957056673,2114687494,194158858,-2045867111,-1593251061,-1952904314,-150236658,-96040455,16008903,-129579264,213385216,-194054400,1586229387,-1948003848,-1995984768,1187509830,-352321284,193372456,194119225,1183517822,-161575942,126431223,1183517931,-161575942,-1996328969,1182990919,1191118070,-128021508,1183572945,-2071512580,-3506427,2122577990,-1501821192,-2081143041,2080699518,-310157672,535137026,516640093,1430622296,-1910575989,82609112,108432214,1309308459,2114977411,1030149,-963968277,-1946401143,1177225286,-1037330164,-259262255,-59360946,1183516029,-1962742788,-62486074,92127243,16533191,242679552,-15960321,1996425846,108461832,-771996021,1996443872,-25860,-2090991616,-443874579,-900899553,1478361098,-1957345904,-661774612,1460857987,142508886,-2096204544,1962935934,-129579256,-1494679552,105286400,-1722789223,295325778,-1962934265,138841032,1385814667,1347590480,-74714741,476570,331744000,-196703785,-940157303,64582,-375097,-129579137,1187463167,-1962934034,1178201670,-1956875016,1385822278,1347590480,245402,-263812864,-1947052407,1452012614,-229230090,92016511,1945126457,-129594616,-335788407,-196703464,972445323,595391062,1178142079,-1961068816,1183447110,-129594374,-1947318647,1174666310,-2131176966,1183416292,-1952650248,1600059462,-1962742397]},{"sector":17,"data":[1297948645,503317706,1430622296,-1910575989,82609112,-1995684213,922745926,1996427532,-11526648,194644598,16777224,2122517574,997457926,504120971,105286480,-6664162,-1962934017,1344144966,16777114,205914368,722224779,1177156678,204930826,138840849,1183535168,-11526644,-6681994,-1962934017,-310117306,535137026,147475805,-1873273344,-326412987,-2082959842,1183517932,239483146,-2115435659,-196704000,1183432747,-62486022,1996451051,-92864752,-1202667477,-11534335,1996425334,-59310320,-1202667477,-860225504,-13833472,1996427382,1354771450,1342177720,-16222465,1996427382,1354771452,1946568249,13023240,-352286534,8828934,1375792826,153000528,1183514624,-196728562,-2080618753,2130769022,172395454,-768511,1183578694,-96061170,1183550588,205928712,-2115435659,-196704000,1183432747,-129594890,1996451051,1354771216,-624897,28839542,1996443648,1354771216,-1191676161,-860225504,-13833472,-1070919562,-159973552,-1207011585,-11534335,-1070919562,-126419120,1946568249,13023240,-352286534,8828934,1375792826,-26032,1183514624,-196728564,-2080880897,2130769022,138841022,-768511,1183577670,-163170036,-310145924,535137026,214584669,-1873273344,-326412987,-2082959842,1946158718,108461832,16777114,49120000,1562371467,503499341,33620736,1778385667,302056192,33554691,1275069184,486604548,-1056898304,318767362,-1375665408,335544578,-2130640128,-1811939072]}],[{"sector":1,"data":[-1191116032,-1778384640,1107362560,251658753,-2113862912,268435969,-184483072,285213185,-1795095808,301990401,1711342336,318767617,-1107229952,469762310,-1845427456,570425608,-1493105920,603980037,-1862204672,620757250,1812005632,754974981,-654245120,872415488,654312192,1241579265,-301923584,939524608,-956235008,-1342176505,1627456256,1157628169,-167705856,1275068674,1593901824,1325400320,1711342336,1459618053,-553581824,1476395527,-385809664,1509949959,-1996487936,2113994496,234881792,2130771712,-1761606912,-2147418363,1937009920,-1192457387,-11533234,-6683530,-1962934017,46292453,-326413056,-1962480509,100861510,104533108,226429934,50611851,990674438,2114741766,-2110324910,31562254,1183383552,1183535356,1946551046,-301581556,-1593016821,1177226222,1946561286,721611532,1183535296,2114323204,1711684364,-1593016820,1177226342,2114333444,721611532,-6664000,-16776961,463142006,-2097151998,539198,1419844213,-96040699,89392839,1996423169,-26104,1183514624,89433082,-16222465,1996424822,977175300,92209160,-352321096,1354771202,16777114,1575324416,1426065090,-326898549,-11118840,-6681994,-1711275777,348,201213577,-385649216,20775231,-385649408,121438411,-1962249216,-1846824,-351405897,1849590606,1132331016,63583999,86170,175570688,184986,-129595136,440400,-26032,1996423168,2050424824,2083979020,2050424588,2083979020,-26100]},{"sector":2,"data":[1996423168,-126419190,193434,-16127232,-1710356938,531,141573763,-1706134528,835,1946158397,179780,141561482,1988749011,-1715041284,-120470997,1589966987,126559748,208930307,-140916989,737081342,638350342,-1960441975,100860487,-956101506,-134285415,2114333678,1200170508,73319426,4162342,-1578564740,130491904,-1461125120,1748927232,1584660485,504211128,73319504,41418534,-1707606234,576,1182056459,210646783,209306,-96040704,73319504,721914662,1074636294,1200301648,-1475990782,-1706016755,65535,108315147,237516543,922682603,-6681094,-16776961,1771764342,-385875965,922746674,652807674,1681818623,527695877,504211128,73319504,41418534,-1707606234,65535,125091851,237516543,-65303,-384960458,1589968633,228106500,2080848166,-1993979900,73319431,41911078,638090496,149447,-1005458688,-1532951458,1194927629,1208318978,38242598,1023952523,410255872,1963065661,15984899,1963065917,28305667,1946288957,44099925,141442691,-385646848,2057372310,291676940,-1559462751,1589907812,126559748,638352035,-1560131701,1996426364,54237706,1183383552,175570936,1354771280,-27358384,-472783919,56532991,-16091393,1989867638,-385875965,1048773198,2130707842,38070531,-1559463263,2090930530,291808012,637820612,2057504651,1200301580,209494786,16777114,89432832,192200715,243414783,16777114,-16192768,-6681994]},{"sector":3,"data":[-1996488449,-6621114,1023410431,175374358,-1694992641,65535,1996425451,-25864,1048772608,1946158420,-126419190,16777114,-15996160,1996425846,-25864,1996423168,-26102,113704960,1364,-2097037847,552510,-1276574860,73319424,-1559786714,2057507170,199271180,38243110,-1559141213,-492630916,52533771,1419968512,-1036090619,141819907,-1710590209,65535,90455683,-2094566144,354366,1048780917,2130708618,65575449,389873664,-1710263296,220,1946162749,-26107,1996423168,77568522,1183383552,175570936,112720,1354771280,-771858805,-1846813,-16556385,1996425846,84515576,-6684672,989855999,141822534,-1710590209,65535,-1710590209,65535,67010179,113706612,66898,141428479,-2097088023,552510,-269941889,1846476544,1849590536,57933832,-1593777687,1654852730,209494289,-1005493085,-1960442786,209363719,38243110,-2096333661,1946222206,-25263342,-2096335871,1946680958,-25263354,-14453501,-728102282,-1996488700,1996486726,-1070903286,112720,-27358384,-472783919,56532991,1048790251,1946158420,-2110324981,112105998,149618688,-1710590209,1378,-506231,726665846,28856512,1586188288,-773598722,1587544035,1413382915,175374341,-1694992641,1754,1996426219,-126419190,365210,1681818368,695533573,90717827,-2094893824,559678,1048779647,2130707842,-25263340,-2096204793,1946418814,175570696,229018]},{"sector":4,"data":[1409730304,-1711276027,65535,134119043,1048791157,2113931374,-902365375,17668611,1996423168,95525386,1183383552,112742648,580538368,-16777215,922744950,922684538,922684540,922684538,983174268,-16777215,1996425846,97950456,1599995904,-1034033781,-1957363704,49054700,1048786155,1946158018,142016301,71066,-28931840,1342732031,1342177720,369510029,-26032,1187446784,-16777212,1996425334,21338878,1325334528,75399940,-1950122752,113401317,-326413056,-2096829309,1963394174,108461834,16777114,-15865088,-6683018,-1711275777,65535,1342182328,16777114,1975520000,75400058,-1207601913,48955393,-1705983957,65535,117735043,1183670645,-1706027268,65535,-1928956161,1343683654,16777114,-58817792,-1592361984,1178144152,-2096202244,2080439934,228892936,2097038905,228106542,-775804007,-62486024,-1727159135,-120470997,-113015,1183647350,-1706027268,65535,-231681,-6619530,-1962934017,79846885,-326413056,-2096698237,539198,266929022,-2110324991,117217806,1183383552,74907642,1347469355,228079359,228865791,1358591743,2144336,1375784122,119904848,1996423168,120429306,1048772608,1946158018,108461835,-1710983425,65535,90455683,-12291072,-1710137290,58,-375159,922682486,922684838,922684840,922684342,-1202713672,1347420161,-1174396744,1347551436,16777114,-92864768,33690,74907392,16777114,-2088899840]},{"sector":5,"data":[354366,922711668,-895873906,-1996488700,1996487238,-1506345212,-1472790771,-1237909747,-1204355317,28856331,-1202696192,582615846,-1706012160,1956,-362753,-1710137290,65535,-16484609,-15882698,-15882186,-16009674,-16009162,28899958,-1202696192,-289800058,-1706012160,1746,-1694861569,1276,-1710983425,65535,-1034033781,-1957363708,418153452,957395105,208930886,89917127,1183514625,280011528,16008903,-398029568,949637142,-16777210,1183648374,-1706027288,1605,1023952523,57999373,1979750633,54520067,1962936637,48425219,1048788459,1946158018,1514046215,796131333,63061635,-16223232,-1332082058,-2097151992,2097153662,1443284804,-956301307,350726,-1740733696,125042701,228867715,-2094828288,1946219646,175570702,-1913358593,1343678534,-2080871192,1946219646,49735939,-385875528,1187447538,-352189708,1446937558,-814415867,89523911,1048772609,1946160536,-1539406910,-1150025715,32786119,-2085295358,246334,1048774516,1946158426,-1036090458,141819907,-1710590209,964,425603,113707133,1368,1048807915,1962935640,1476839298,-956301051,350726,1849590528,58589192,-2080412439,890942,1659437941,-1539406849,57999373,-1694541591,2818,1946157885,277838,87892596,-15567872,62392950,1183666178,-397404440,854194101,175570943,16777114,-14161664,138034819,-16026368,-6681994,-385875713,1048837909,2080376890]},{"sector":6,"data":[-15996669,-1710590209,65535,-2080440087,539198,1048833652,2130708538,-17831677,2122567147,58523654,-1207861527,-1706033136,2425,276676619,1342181816,724634,2109737728,10676483,89786055,1048772609,1962937752,-21501693,228867715,-385649408,1183579821,2440456,641544308,1024226304,779354151,1946167357,-1593382119,1177093468,1543962602,-394362107,-954237696,59462,1554064619,-364510971,1554114539,-398055163,1554112491,-398065403,-1734223893,-398051059,-1991768964,2122573894,125632746,15353543,-1592988928,1178144164,1208253674,-1423735,1183648374,-1706027288,1668,-1542401,-1885672842,-385875962,1048837669,2113931374,-31725309,-219003193,201498891,-1577171319,1183386624,201105910,-1578350967,1183386618,138841080,1946166589,2506084,658312308,1030517760,1131675688,1325338859,-159480842,-1962443520,-1991706554,1183577670,-126945282,-1980348925,1996484678,-26102,-11534336,-6623114,-2097151745,890942,-1360460939,-1539406851,963969037,-154391,1183577670,-163169800,1187497084,-352321290,-28377155,16678531,1183560829,1183402220,-5510146,1183579718,-28952084,1187487868,-352321282,-196687975,1726546432,1543948285,-385875707,1048837469,2113931374,-44832509,425603,1256784765,64920317,1183383552,1095932,-26032,-1073020928,1191121020,-58817540,-954893288,64582,1325338347,-58817540,-955941632,1571910,-1710590209,2694]},{"sector":7,"data":[-59310256,1040141289,57999392,1039975401,57868325,1039988969,58130472,-369228823,-1070859027,-1034033781,1478361096,-1957345904,-661774612,723971203,-62486080,-1946532215,138218566,-385649152,121438384,-385650176,20775068,1023898624,292814853,1996452843,-194975730,-1946532213,-1293288362,242679552,-16353537,1625819254,-1446924,1183649398,-1706027302,65535,-15829249,-857154954,242679802,383403661,-26032,-991232000,-15829249,1183648886,-397404666,-1259604767,-15829249,1996425846,-106502138,1996465899,175570702,-16222465,-1243085194,1958743035,242679699,-15960321,1996425846,108461832,16777114,-96040704,-369338743,1996488566,209125134,-369510680,20840298,1024423681,-1166868224,1962938173,-9443069,37602283,1033729025,-1183710720,1979843389,-2085426301,-443874579,-900899553,50344202,50949121,50358784,51125505,50359040,17133313,50332672,-16300288,50338560,50386689,50363392,-16736768,50341376,-16190464,50343680,-16085248,50343936,50848513,50336000,17264641,50340352,50608129,50336256,50676737,50336512,-16385792,50345472,50606081,50337280,-16323584,50345728,50602753,50337536,50992129,50338816,50851841,50339072,17267713,50343168,-16434944,50348288,-16557568,50348544,-16560128,50348800,-16414976,50349056,50726913,50373632,-16727808,50349312,-16745728,50349568,50725633]},{"sector":8,"data":[50374144,-16774400,50349824,51101697,50341632,-16304896,50350080,51107329,50341888,-16398848,50350336,-16518656,50350592,-16242944,50350848,-16169984,50351104,-16175360,50351360,51066881,50343424,-16179968,50351616,-16272384,50351872,50729217,50377472,17280001,50349056,50573825,50344960,50592257,50348544,16908289,50352896,50601473,50349056,50682369,50349312,50994945,50349568,50735105,50349824,50451457,1828736000,1167087646,518818645,-6629234,-1207959297,1344145450,503833272,-1161811120,1347571712,922701904,922684824,1996426660,922701830,1347424524,16777114,91267840,24943184,-310181888,535137026,46812509,-1873273344,-326412987,-2082959842,1448543468,243414783,16777114,-62486272,166082303,165951231,-1728052552,-1449504686,-1962934272,285516232,165152299,1385814667,-499712176,-533266679,-1947104503,14588667,-972881920,1347606291,166082303,165951231,49050,208970496,166082303,165951231,-1728052552,-241545134,-1962934272,285647304,165283371,1385814667,-499712176,-533266679,-1947104503,-25861,-972881920,1347606291,166082303,165951231,16777114,209625856,208944771,-955745024,816134,-1592268032,100863092,104533400,175901678,722202273,-1559390202,1048775796,2097155198,2114373384,-352321524,209625367,228853251,208012859,1721830012,-1543099636,209625869,737965823,-11513664]},{"sector":9,"data":[-15886282,-15883210,-15961034,-1710457290,65535,-1694730497,65535,91240191,16777114,1879492352,-16777211,-1710918602,65535,16777114,-2090902016,-443874579,-900899553,1478361090,-1957345904,-661774612,723971203,-62486080,-1946532215,138218566,-385649152,121438347,1031500544,1517617157,-16353537,48760950,-96040184,-369338741,1996423306,-632910578,-6664170,-16776961,1996426870,78440666,-1928431873,1343674950,16777114,-2954496,1996426870,105286924,1659392022,-4003072,1996426870,142016266,-402229505,-1073020526,1996468084,209125134,-16091393,1996425334,-26106,1183383552,-61437446,1996461035,209125134,-352098584,998792,4033652,1037005313,-1217003263,1912733757,33701317,-1091854986,-1962742397,1297948645,1426066122,-326898549,209363206,-1592696157,1688407164,73319441,-1559786714,-1960440710,2091057735,138840844,1946288189,33635603,-907476107,33701120,-353827979,16705792,141442691,-385646848,1996423412,-26102,1183383552,-2031595266,209363203,291636779,-1577433463,103484540,1183388004,-96039940,285738499,165154443,165416451,226279739,722065569,51447814,-351675386,-96040172,285476355,165152315,-660534659,67513097,-96040687,66864779,-1961817594,50977294,990502414,-1592951615,103483866,100864266,350947806,66864779,990971398,2097797638,165323018,285607467,-1191426423,1344147716,-362753,-6620042,-16776961]},{"sector":10,"data":[-286720394,175570690,-1694599425,65535,1996439787,-26102,1048772608,1962936430,175570708,16777114,209363200,-1593057117,-492630916,1845952267,-2095584504,552510,251596926,1048774766,1962936430,-26107,-443875328,574045,-2081649835,-1331623188,138819856,113708148,66908,-1559738741,1187451056,-956301060,64070,385238669,97950288,1996423168,-163148534,-476426218,-1962934267,222103622,1986425856,26405123,1962936637,19261699,2122524139,226295814,89523911,1187446784,-352189702,1446937362,192217093,89523911,1187446785,-1962802694,-1331492794,-92372208,-15830016,1996425846,-163148294,786976790,-92371970,-385649664,2122514779,57934076,-1207872791,1323892737,108954369,-955745024,350214,-2084508928,350270,1187494261,-956300804,17127430,1849590528,-1484849144,91502335,16777114,-2086868224,2097153662,8972547,1023952523,812908581,1946166845,2571532,675098228,-350653440,89956614,-506327,-2096800762,2097215102,-163133665,619380736,17128609,-403965882,688217249,-538184122,17128609,-672401850,957192353,75298374,-163149496,16285315,1187448701,-352321288,228892940,2096645689,1183401988,175570936,385238669,103455312,1996423168,-126418954,406938,-15996672,89917127,48824321,1849590783,58589192,-2080442135,2097153662,-17831677,16777114,-28931840,1342181560,16777114,2092960512,-28901616,419331715,1187452284]},{"sector":11,"data":[-352321282,-28377330,16678531,1187448189,-16771074,1771702902,1342177285,16777114,1996443648,-25858,1187446784,-385744646,540933789,-385649408,624819824,-385649920,675151501,-385648896,-2098594071,-1950340098,146955749,-326413056,-1207636861,-1706033133,65535,57982987,-2097118487,1963394174,112645,-1070923029,-26032,2122514432,1769277188,385631885,-26032,1996423168,-62485242,-6664170,-2097151745,2080439422,228106518,2113685049,-25263346,-1593279488,1178144164,-1590264578,100864260,731451656,-1980182078,111279174,168166161,-1037330159,1183447249,108462078,385631885,-26032,1996423168,-25755652,16777114,1575324416,1426064578,1996483723,702468,-26032,1996423168,505860,107518544,-1706033152,1646,-1207666945,-1706033147,1708,112368208,1996423168,70713092,104267537,137821969,171376401,-26095,-443875328,180829,-2081649835,1448551660,63452927,16777114,-28931840,-1207666945,-1706033149,65535,-26032,1996423168,1354771204,-1741226160,-1539899635,2209805,1375793338,-26032,-291438592,460043,734147481,244162,-1036781357,1183433259,-498677776,1721827344,-1036805876,79282731,871944960,-339596350,-360807628,-2096729088,1962997374,-360807576,-16223232,-1785009546,-2097151993,1946220158,-159973624,500634,-498663680,-1727240543,-136163701,-431584775,1342177976,-1712306549,1183535186,1347590630,530074]},{"sector":12,"data":[-1706012160,65535,-1423735,-15995338,28894838,726683648,-1706012480,65535,-2081012087,1962993278,-427916404,-15698944,-6624650,-1996488449,1451881030,-2093618188,1946217086,-361300216,632218,-159481088,-15830016,-1382353290,-1593835511,1183386752,-364460042,-1766326272,-230258420,-940286324,124486,-1695123713,97,-940816759,2160710,16402119,-62470400,-1545011200,-62485759,1004946947,2114741766,208052489,-1979955669,-6625722,-1996488449,-11475898,1996487286,1354771448,16777114,-263812352,-1957670247,1385817670,137796176,1174470656,-95022600,-1804545,1996485750,-263812110,-1957670247,1385817670,140024400,-1706033152,65535,-1696303361,65535,-1946781953,1385820230,-431584432,-1706012007,2195,1996443730,-227082252,16777114,-499712256,-533266679,178185,-1706012007,2214,1183565963,-1713730564,922701906,922683878,-242546204,-593822837,50331656,1389827014,-499712176,-533266679,146577929,922681344,922683874,45681120,1406872320,-1695511727,2289,1183565963,-431619076,1385814667,-432603312,-466157815,-598832887,-1696702839,2371,333202947,1347608150,165820159,165689087,600218,-1983501568,1996482630,-600375316,922701833,1996426222,112870,-26032,1996423168,-667484412,-499712247,-533266679,178185,-1706012007,2390,1183565963,-1713730564,922701906,922683878,-242546204,211483531,50331658,1389827014]},{"sector":13,"data":[-499712176,-533266679,166828553,100859904,-11531814,-16131018,1996482678,1354771436,2144336,1375784122,-26032,1183514624,-62520858,957114017,58588230,-109847,1687874678,-2097151999,1946217086,-361300200,16777114,-361300224,16777114,-159973632,16777114,74907392,-227096,-1650786698,1577058310,1575324511,1426064578,1448602763,-1727271263,-1995841373,-1962286570,-1550252474,378079716,922683878,922683874,45615584,1347590400,663450,-1580692736,-628421530,-11513191,-16128458,-1962286026,-1694790671,2648,-686569981,922701906,922683874,1033505248,989855754,1635714118,-1559869813,922683868,922683874,45615584,1347590400,682906,-1580692736,-628421530,-11513191,-16128458,-1962286026,-1694790671,150,-686569981,922701906,922683874,2006583776,-1560281088,113707486,2520,721700491,-1727406586,-120470997,-351675741,208052597,165716889,165811849,-1727773045,-1995840349,-16128490,-16129482,-1207312330,1385758722,182229584,-930414592,-1962152287,1347590618,166082303,165951231,-74714741,731290,331744000,-11513129,-16129482,-1710628810,2829,-1962287965,-559741882,105286409,165414443,-775804007,165192696,165283527,922681344,922683874,45615584,1347590400,736154,-1580692736,-628421516,-11513191,-16128458,-1962286026,-1694790671,2928,-686569981,922701906,922683874,1436158432,50331659,-1559635962,922685700,922683874]},{"sector":14,"data":[45615584,1347590400,754586,-1580692736,-628421506,-11513191,-16128458,-1962286026,-1694790671,3000,-686569981,922701906,922683874,-1650849312,50331659,-1559635450,922685702,922683874,45615584,1347590400,773018,-1580692736,-628421224,-11513191,-16128458,-1962286026,-1694790671,3072,-686569981,922701906,922683874,-442889760,50331659,-1559165946,922685704,922683874,45615584,1347590400,791450,-1580692736,-628421212,-11513191,-16128458,-1962286026,-1694790671,1865,-686569981,922701906,922683874,2023360992,50331656,-1559165434,1600000266,-1034033781,50344196,50673921,50358784,50472449,50359040,-16308992,50336512,17189377,50332672,-16268288,50338560,-16077312,50338816,50553345,50363392,-16070400,50339072,-16774400,50341120,34033665,50335488,34019073,50336000,34045697,50336256,17204737,50338560,34184449,50336512,-16235520,50342656,17223169,50339072,-16438016,50343680,-16420352,50343936,50580993,50336000,50557185,50336256,17397249,50340352,50567681,50336512,50347521,50337280,50658817,50338816,17193985,50343168,50584321,50339072,17262593,50343936,50452225,50341632,50457857,50341888,50345217,50342144,-16678656,50350592,-16484096,50351360,50684673,50343424,-16237568,50352640,50703361,50377472,-16251648,50352896,17403649]},{"sector":15,"data":[50349056,-16256256,50353152,50425089,50345216,50507265,50348544,50550785,50349056,50969345,50349312,50661633,50349568,17192449,50353920,50710017,50349824,50546433,50351360,-16688128,50360320,-16183808,50360576,17327361,1828743680,1167087646,518818645,-326903666,1916206854,-26107,113704960,1394,91502335,91290,285516032,209323521,17893025,-1593017338,100733188,111219042,1678115089,285516049,199230977,17893025,-2096373242,-443874579,-900899553,1478361092,-1957345904,-661774612,1443163267,-1962116447,-1324509162,737858308,285516738,-1962115935,-754080746,-1547555846,915083526,-964489832,-754732793,285516286,144950787,228892945,-754972923,101057528,285909777,285490819,-955482880,1115142,137791744,-1592071407,104402328,293474568,-1961817949,130188240,-86834255,77840939,104760081,360513553,285607623,-1532952576,460045,-120388687,-351204701,228892954,285869625,178459006,-2083484911,61933506,-1037305133,-1592719709,103354628,111217786,2080778513,285516044,291636777,688981665,-1592695802,103354628,111217632,-502912751,137541643,-491237346,726670855,1342225088,1347440722,228079359,228865791,1342732031,286013183,-6664112,-1560280833,-1706031758,65535,49120094,1562371467,313933,1458342741,-2096728437,61933510,77725395,-1547304175,1183518984,460036,100923603,178458886,285778193]},{"sector":16,"data":[2131117625,105286411,722536611,285516742,957418145,343868486,-1560000885,-796192502,-1324891517,737858307,285647810,1575324510,1426065090,-326898549,-11118844,-1710325194,65535,-1946270071,722537014,-1961818570,722536510,-15662018,-1070922634,-947171248,-523041871,-741962928,1996443872,70713342,104267537,-1202301167,-860225504,-1706012160,65535,721712895,-1588571968,103485704,-1588588284,103485706,-11529978,922746486,922685700,548933894,13416960,-6664110,-16776961,129500278,-6664192,1342177535,16777114,74907392,-1588543445,117771684,-754732800,-1499836168,-16777214,-1734278026,460045,-120388687,-1532932032,460045,-1705969453,65535,-1593542913,117771672,-754732800,-1070903048,-26032,1996423168,228106500,-1325398267,1358484227,84780193,-120389625,-1868935104,-16777214,1570438774,1577058307,1575324511,1426064578,-326898549,1376175876,-16776955,-1710325194,1147,-2080487799,1946158718,77680669,2047214353,111235084,2080768785,-6664180,-1560280833,378080668,-1667166818,-1643771123,-1207602163,48955396,-1705983957,599,-244087,-1705968010,872,-1577158913,100864260,-1588589446,100864262,-1202713476,1347420161,-1174396488,1347551472,230810,-25755904,308634,142016256,-1694730497,605,-16222465,-15959498,-1207141322,1347420161,-1174396488,1347551472,249498,228106496,-1325398267,-1946627325,-754157034,2093104098]},{"sector":17,"data":[228892946,-754972923,2081852408,1004720908,-14451262,2057373814,-754732788,2090946784,1356911372,1342179512,2209872,1375793338,-26032,-443875328,574045,-2081649835,1654720236,2047224593,-28931828,722560161,-1995670522,2122579014,377225470,66995851,990971910,2114820102,228106524,285738539,1183518955,67503102,2109737745,285516040,1183439095,-58817538,-1961460736,100924486,104534282,478023076,722314401,-351204858,-62485744,285607427,142458891,-149879135,-62486056,33441419,-1961819130,100793414,1183518982,134611454,-62485743,285869569,16678531,-1073019787,922698612,-610660734,-1996488700,1996487238,1354771208,285778256,285476395,285909328,285607467,-92864688,285488895,285619967,-1174396744,1347551436,331162,-92864768,333210,75399936,-16026624,1996425846,-49813496,2122534891,108331262,16547459,922698612,-593883518,-1996488703,1996487238,1354771208,285778256,285476395,285909328,285607467,-92864688,285488895,285619967,-1174396744,1347551436,150426,-92864768,16777114,1575324416,1426065602,-326898549,73319428,4162342,-953809027,-352321529,73319439,638425249,75237177,126428744,637820612,163715,-953808771,583,1589907947,228892932,38222118,642254204,-2097002615,552510,2057380478,291676940,-1559462751,1589907812,126559748,-120388687,638352035,-754825333,209495032,1023952523,460587520,1963065661]}],[{"sector":1,"data":[9890051,1963065917,18999555,1963066173,24701187,-2097042967,712766,1048777845,2130708590,1095699,-26032,-1073020928,922683005,82513406,234895103,16777114,1849590528,58654728,-1593739799,104402042,208998754,957119649,1964073990,23128323,-1710590209,65535,-2080487799,712766,1996426612,-1070903286,-1075294128,-15864835,1996425846,1354771454,-55580592,-16091393,-1231356298,-385875962,1048772902,1946159214,8579331,637820612,61933451,1654913235,209363729,638312611,-754825333,291808248,-1559462749,244321250,-16410392,-493221258,-1996488698,280559174,-962965504,184549381,-1207599680,48955393,-526139349,1958742794,175570706,-1191282945,726663169,1005080768,-15668227,1996425846,112894,1354771280,-251672,1996425846,118987518,1996423168,-26102,117374976,-1813444498,1849590528,58654728,-16741911,-2096599538,552510,1996455541,100702730,1183383552,-532773890,276037642,1342863103,-1202667477,-397410303,283901146,-16091393,-1070858634,112720,-70784944,-16091393,-6619530,-1711275777,65535,182453959,887816192,84777121,61931527,378271955,-489485190,545178171,84780193,-120389625,209458827,-1036262701,1996426878,-26102,-1706033152,2157,-1034033781,-1957363704,183272428,16533191,-96024832,1183645696,-1706027274,2395,-1928694017,1343682118,616602,-163149056,67500068,-163149568,620250763,263672]},{"sector":2,"data":[-1946663287,272435270,1980724224,22538499,1962937661,9300227,2122529003,846987510,957192353,712898118,16285315,-1532943236,-129615603,1048779901,2130708590,108954389,-16352256,-351404490,3604228,98146830,2122514432,242483450,-16091393,1183709814,-397404426,2122579229,57934074,-2097081367,1946221694,17492227,-385875528,2122514694,226295814,89523911,1187446784,-352189702,1446937537,-1166737403,89523911,1187446785,-352189958,108954541,-955745024,350214,-2086671616,350270,1187485813,-956300804,17127430,1849590528,-2038497272,91502335,16777114,-8722176,425603,1911096189,138841087,1946166589,2506024,658312308,1025799168,326369320,1854080235,2122516728,427622646,83248839,-2094798080,-351733690,-160529427,-2081953016,-351734202,228106721,2096514617,-131839991,-1996487675,2122577478,125632760,83379911,-1592661248,1178144164,1208581368,67500068,-129595136,-1928694017,1343682118,635290,-159973632,-1694992641,2492,1040116713,57999392,1040125929,57868325,1040112617,58130472,-369141271,-1070858544,-1034033781,-1957363704,82609132,1342182328,16777114,1958742784,8710403,117735043,28837237,721611520,-6664000,-2097151745,1963394174,-62485141,-6664170,-16776961,1183647350,-1706027268,65535,16547459,-1734273412,-62506739,2122518141,142344446,957195425,947715654,-1727162207,-120470997,67500068,-62486272,-1727159135]},{"sector":3,"data":[-120470997,67500068,-28931840,-1928956161,1343683654,16777114,-59310336,-1694599425,65535,-1034033781,1478361092,-1957345904,-661774612,723971203,-62486080,-1946532215,138218566,-385649152,121438352,1028485888,1400111109,1996434155,209125134,369510029,-81794992,-1946532213,-1947599786,242679552,-16091393,1996425334,-45422586,-462110709,-15829249,1996426358,142016266,-1710852353,65535,-1980086647,-924058538,-15829249,-437777290,-4330498,1996426870,142016262,-336124440,242679727,383403661,-26032,1996423168,-629735666,-562968,1183649398,-1706027302,65535,255691499,1037464576,-1670250240,1979777341,33570180,54366834,-385648894,-1997799584,-1962742397,1297948645,503319242,1430622296,-1910575989,82609112,243414783,728474,-62486272,1354771280,205978,815419392,-16777213,922745974,922685700,144773382,67513105,178343953,101067537,565727249,15776256,1436176466,-16777213,-879035274,721420299,1996443840,-154146810,-1962742397,1297948645,503317194,1430622296,-1910575989,149717976,199505663,731546,-62486272,243414783,790938,-129595136,70713168,104267537,285778193,285476395,285909328,285607467,-59310256,285488895,285619967,-1174387016,1347551334,757914,-59310336,285488895,285619967,722536609,1343292422,722537121,1343292934,-493825,-15662026,-1206843850,1723465798,-1706012160,3011,-493825,-15662026]},{"sector":4,"data":[-1592719818,103485704,-1588588284,103485706,-11529978,922745974,922685700,1186468102,6732288,1402622034,-16777204,-744818570,-16777205,1536883830,-16777204,1805256310,-1996488698,1996487238,-420982778,108462069,-1694861569,1583,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,199505663,794010,-62486272,243414783,190618,-96040704,-231681,-15662026,-1592719818,103485704,-1588588284,103485706,-11529978,922745462,922685700,548933894,13416960,-1382395822,-16777212,1671101046,-16777204,-879035274,-2097151998,-443874579,-884122337,16973854,198263,16973930,199212,196715,16714417,16973851,66243,16973843,66163,16973844,68331,16973853,198520,16973841,68445,16973858,198334,16973842,66076,16973859,198428,16973843,196641,16973846,198897,16973852,68291,16973869,198533,16973853,199258,16973863,199280,16973864,196955,196649,16713560,16973900,198482,16973870,198961,16974003,68339,16973892,196626,16973877,199643,16973890,66311,16973907,199664,16973892,198634,16973893,198908,16973894,68285,16973911,198987,1953300551,1167087646,518818645,-326903666,-1808335100,1808908,922681344,614076038,-16777216,-1710383050,45,234108671,13978,-1137246464,4168202]},{"sector":5,"data":[922681344,1218055278,-16777216,-1710337482,65535,-1962742397,1297948645,-1873273141,-326412987,-2082959842,922683116,-6683276,-16776961,-6682506,-1996488449,-1070859706,-92864688,552078992,-62470398,1183517682,201630470,-99710055,-1980106997,-1962147818,-140966330,201499641,-11485141,244382326,-16648472,1996425334,1354771450,-1461186928,142016270,-1694861569,65535,-1962742397,1297948645,503317706,1430622296,-1910575989,201630168,-1962742397,1297948645,-1873273141,-326412987,-1579643362,-310179734,535137026,516640093,1430622296,-1910575989,210805208,-1962742397,1297948645,-1873273141,-326412987,-1579643362,-310179142,535137026,516640093,1430622296,-1910575989,82609112,16533191,1357824,100429559,1344146418,637951684,637695999,-1701169153,184549377,-1962576704,216792134,-2080618753,2080701566,-18220,-1962742397,1297948645,503317706,1430622296,-1910575989,149717976,1357910,84307703,1183386610,-1001382148,-14284706,-14286217,-26057,-1073020928,-4717195,-1958482945,931920990,638082756,-970258549,-134455669,-1952904593,-836041649,1183447543,140413946,38243110,737959563,1878458951,1334548744,38742790,1183447543,138906616,66744055,-2090928058,-443874579,-900899553,1478361094,-1957345904,-661774612,141311619,-2095087873,67660862,1996429437,175570694,-16222465,-1878496202,-11278322,-401698736,-310181877,535137026,113921373,-1873273344,-326412987]},{"sector":6,"data":[-2082959842,-1202322196,787939348,-259323796,200459905,-2080606583,2080376446,105286464,2114733113,306460984,922694516,1996425324,-401698808,1183514675,1284217094,-1980107000,1183518788,-101213946,-1961995127,1149830726,1815543570,142016264,216534672,-310157824,535137026,80366941,-1873273344,-326412987,-2082959842,-2091506964,2147420286,18802947,67665539,367592316,1357825,-1962381577,-221871632,-327775989,-1995422581,1150024262,-498693878,-1995553653,1150019142,-163149560,-1947044215,1183384132,-1996190754,1150017606,-196703994,-1996209013,1177284166,-62486048,737429131,1183440454,-62485512,-1711640841,-136163701,-532282375,-1947187575,1861744710,1317771750,66713590,1183440454,-96039960,-59836608,-498168935,1174665719,-364475936,1088833163,-1711771913,-134852981,-565836807,-2082191735,1962936446,-263782650,-2081929473,1963133054,108461893,-1726915423,-1037319629,-754974023,734147576,-263846974,882987072,-1036805878,-120339925,-1037319629,1088964099,291283280,-1588574136,1212680756,637008,1375753658,64133712,1996423168,-260636922,-1947699457,1177283142,1183535344,-398054428,637008,1375753658,-26032,-2090991616,-443874579,-900899553,1478361092,-1957345904,-661774612,-16454525,-1710573002,1139,-787736415,769708512,1183383555,2092960764,1354771215,1358722815,-26032,166395904,1342179512,16777114,180003584,-1962742397,1297948645,-1873273141,-326412987,-2082959842]},{"sector":7,"data":[1187449068,-1207161094,1347420168,1342177720,205562192,-523041615,503371781,-26032,1183383552,1958743036,-6664156,-1996488449,-1072957370,922685300,-2120611734,-1962934268,1789130822,-59310328,4762,49120000,1562371467,1478413133,-1957345904,-661774612,1443163267,452740807,833548,203960055,512487563,-472839126,129007755,1577881763,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-1957293844,1822623302,1357832,141307639,-964562805,1988692978,108954616,-11504384,379193462,-1996488697,-1070860730,-159973552,-1595404656,142016509,-1695123713,1859,-1202667477,-1873805311,162523150,721699979,1183399940,105155580,1073890347,-375159,-1710918602,103,16777114,-1961563392,1200355422,-1996018940,1200356422,38218502,-1191557495,-1706033145,1378,1174528209,571644,-26032,-523173888,-375295,1183647862,-11528462,1996487798,-25862,448266240,-1202708984,1344145378,1085980715,-1957670256,731511878,-1946627646,-936644018,-96040111,-775804007,-196178952,-11417557,1996487798,142016506,-11485141,1343294518,-26032,1183383552,142016496,-1705983957,1790,-1695516929,1798,49120094,1562371467,313933,-2081649835,-1202320660,787939348,-259323796,200459905,-1946782071,69928004,-1946270071,1183385156,272927740,-146743087,-1952842130,-506394036,1183447543,239373304,-146743087,-1952842642,-506394548,1183447543,74907642,385369741]},{"sector":8,"data":[-26032,1996423168,-92864520,16777114,-161576192,-1559083125,-1956770924,46292453,-326413056,-1962611581,3999814,-385649406,20775256,-385649406,37552409,-385649662,1048772977,2130708590,23587075,141430527,141442691,-385649664,347603289,1815017216,200410376,1589923870,2013210116,939468290,85914,1975520000,11593987,185101473,1024947392,57999361,1023448041,57999362,1023447785,2138308611,922688491,-1070920804,-401698736,512428009,-472839164,234403839,16777114,175570688,16777114,-28931840,112720,-26032,1996423168,-25858,1996423168,-26102,1996423168,124295934,1183383552,-25755652,1815543632,-401698808,1048774711,1962936428,1354771211,-1862502657,-77207538,-100609,-2137326474,-956301305,-16225274,-1875514369,-52828146,244357099,-335771672,-401698672,-1981022932,-1710590209,1950,1358710409,194262783,-1192751472,175570938,-1694730497,1976,16777114,-2090800384,552510,1996434037,-26102,1996423168,7313930,1183383552,108462076,1342469887,1172835984,175570938,-1694730497,192,141428479,1048783339,2113931374,175570722,323482,-62486272,-16353537,-1873804170,-99162098,-16091393,144374902,-1962934267,146955749,-326413056,-954930045,323654,167265991,74907392,-1705983957,2120,139369040,1996423168,1354771204,1816656,291254007,-775804007,213405944,875493120,-1037330166,-1202652975,-256245727]},{"sector":9,"data":[-1706012160,942,-1207666945,-1706033145,2411,146250320,146276352,-1202696192,1347420161,1347469355,284314,-96040704,16139975,-230242560,1183514624,-230278664,-538377348,-330905856,1183514624,-330941968,-1008139396,-92864768,-1728048968,1183535186,-754667018,14157280,-6664162,-16776961,1671101046,-1996488700,1996485702,999968772,-1996488695,62455366,1546581760,-1037330159,103545041,731451740,-1174875710,-796196861,-1947056501,1546581978,-1712720111,-120470997,1183433475,-138310674,-1727384530,-120470997,171181611,-775804007,-1949266952,-628364218,171192055,731507191,66638274,-62486077,-16484609,-1957630346,100920902,-1957686948,100924486,-1706030540,65535,-16484609,1905983094,-16777207,1620767862,-16777207,2122577478,108799222,-369998081,1191182108,-14226964,-1694861569,1012,721712895,-1969598272,1342177289,626842,1575324416,1426064066,-326898549,1996445198,309252,161258064,-1706033152,2466,-1207666945,-1706033144,1053,-26032,1187446784,-956300034,457286,351815367,-62470400,1978335232,183912135,-230242560,1525350400,-771983733,833766,-1947046153,-1333752872,-196703993,-2068512944,-126419195,-386500865,1996423254,-196703484,1586188318,-1846788,-1710914377,65535,-1946913025,-472777634,92583935,-134723957,1183535320,1356396534,-16767512,1183052358,1183519990,-230278658,1191157372,-129596420,-96040152,2096907833]},{"sector":10,"data":[-443851133,180829,-336819371,173968146,17188491,71731975,-2097002751,-16512442,2122516558,-444792824,-1034033781,-1957363704,49054700,185101473,1024554176,1500774401,1946157629,212340,1944799092,211039999,710298,-28931840,721712895,-1202696000,787939340,218435062,1285640192,98619662,-11534333,-1070858634,548950096,13416960,-6664110,-16776961,-6619530,-352321281,74907438,-335731992,-2043216090,-26098,1183383552,74907646,1347469355,234239743,-150993480,-351384530,74907577,-97048,-16225226,244319350,-1946706200,79846885,-326413056,1444867203,384190093,-26032,1996423168,-431583990,-6664170,-956301057,60998,-150989640,-1962382290,-221871632,-327775989,-1995422581,1150024774,-263812850,-1995815797,1150020166,-163149560,1023952523,661913613,1946165309,2440482,417923957,2505985,-1293352075,2571520,938017653,2637057,-773258379,-2095650048,2080376446,1849590544,74776584,141428479,49170119,-293698814,-385649408,2122383691,1946288366,20179203,-1981004149,-661917114,-1996339317,126608454,-1948105079,1183385159,71797754,737429129,1183441478,-96039938,-1981528533,1183578182,1088475644,-1711378697,-773173621,66713569,1183441478,-263812122,-146743087,-1952843666,-506333618,1174665719,-398030364,-1928694017,1343678022,891290,-428409088,-1696041217,3492,-2097100055,2097153662,-9574141,141442691,-16485120,-955748858]},{"sector":11,"data":[33615430,-2081403137,2080436350,-11409149,1224099467,-370129271,2122579783,58523654,-2080424215,552510,117376117,1187448942,-16645906,1183576134,-263833098,552141693,-263796737,417923072,108954623,-385647360,1048837903,1962936430,1845952260,-297351416,1325335040,-58817540,-385647616,1183579891,1183402218,-18224644,425603,-521600131,1849590782,74776584,141428479,15615687,-62456062,971654795,58588230,-939605271,64582,-83223,1996425846,-431583762,1827164182,-293698567,-1207601920,48955393,-1956724693,146955749,-326413056,1443556483,117735043,-1746336908,1357824,141307639,-964562805,1988692978,71601146,1183384619,105155582,-1996340181,1183710278,-1706027274,2838,-1928956161,1343682118,730010,-159481088,-1961460736,1178205766,-2096202250,2080438398,-62485752,2096645689,-94467261,-787462261,1861697760,1334548990,-136195830,-163149319,-787593333,1861697760,1334548988,-136195832,-129594887,-1928956161,1343682118,408218,-159973632,-1694992641,1605,1342182328,349338,1975520000,75399955,-1207601913,48955393,-1705983957,65535,1575324510,503317698,1430622296,-1910575989,653034456,1183432747,-96040452,1024214667,58064904,1023455209,57802759,1023443689,175374337,1962935869,8448259,1996445675,-136779762,-1946532213,-1477837738,242679552,-1928562945,1343620678,-336054552,242679783,383403661,-26032,1996423168,-629735666]},{"sector":12,"data":[-250904,1183649398,-1706027302,65535,1996473067,175570702,-16222465,-1326971274,1958743036,242679727,-15960321,1996425846,108461832,16777114,-96040704,-335784311,242679699,-401836289,-1997799809,687747,2122547828,57933832,-34327,-6680970,-385875713,255721326,1031959552,-1250819840,1979777341,33570205,37596018,-385648894,-1578369189,-1962742397,1297948645,503319242,1430622296,-1910575989,82609112,1187468887,-2096368900,1946158718,-234436850,-956301301,783366,-1203770624,787939331,-259322378,-1207402869,787939340,-131396106,-1727138143,-1037319629,-754974023,734147576,-2080887870,-29684241,-963967875,-947191061,-1979949429,38258439,213385217,-164694272,-60912883,-939323509,-1995652733,-208993201,-1962785653,-787592178,1086391265,105351488,-310157474,535137026,80366941,-1873273344,-326412987,-2082959842,1448545004,-150989640,-234551698,-129595125,-1207404801,-1706033139,65535,-1727138143,-1037319629,-754974023,734147576,-62486078,-1946530167,-1073019322,20780916,-385649408,-1053097619,-353827979,212224,-1494656140,-1808335103,287349260,1183383552,142016502,1090274955,-96040112,922701888,1285623286,-11515890,1586230902,273124344,234229387,1089075009,239569744,239865483,1089075009,2144336,1375784122,180066896,1996423168,180591350,1323892736,142016257,16777114,142016256,1342179256,1091226,-1399173120,-16777200,-157218698,-1036805875]},{"sector":13,"data":[62505515,871944960,63056834,100924486,1346375158,-1727116127,-1037319629,-1036781357,1174651435,129519866,-164694272,-1036805875,-120339925,-1037319629,66864643,1074656774,505936,239873783,734147481,871945154,63056834,-1705969082,2352,-1710721281,65535,-16726807,-1070921610,283482704,-1706033152,4331,-1962379521,1346436166,66733707,1074678790,-157200320,273677,239903056,1342178349,-1174396488,1347551472,539802,142016256,1342178488,526490,244994048,-1207959544,787939331,731450956,-1946627646,-92929040,-1727138143,-120470997,2114189451,142016508,1448564311,16777114,-11998464,-1710324170,2697,-637303,1183516790,-167377924,1346387981,66733707,1074678790,-157200320,1346914317,1208896673,1996443720,-128021514,-149928053,1074656814,239569744,239873783,1593743593,49120095,1562371467,688310861,1828782848,1795162894,1124074240,318832393,-2080308480,67109135,-1040186624,453050127,805307136,637599493,-1878981888,452985104,-654245120,486539536,939590400,285213453,-1778318592,301990663,100729600,570425616,-2063531264,318767879,-67042560,603980041,-1761541376,369099534,285278976,469762828,1157694208,486540045,721486592,754974992,1627456256,805306632,-872348928,570426117,352322304,1140915985,771818240,654312206,1140916992,671089422,-1107229952,687866629,889193216,1241579269,-1425997056,1006633224,302056192,1023410436]},{"sector":14,"data":[-251591936,771752710,-1392442624,-1291844851,234947328,1140850960,234947328,889193223,-738131200,989856517,-855571712,1107297031,-419364096,1140851463,-385809664,1157628678,469828352,1174405900,620823296,1459618064,-1006566656,1191183117,-1459551488,1275069190,-1560214784,1778385160,2046821120,-2130641147,-1744829696,-2113863920,419431168,-2097086704,1937009920,1167087646,518818645,-326903666,-935919866,4954627,1183383552,-2110324740,59677198,1183383552,1949761530,2117533452,-1741226228,-1539899635,-1070903283,244338768,-15470360,-6620554,-16776961,2073754742,-2097152000,-443874579,-884122337,1167087646,518818645,-326903666,-2091493624,1962936446,108954377,-385649408,922682071,1234830280,-1996488701,2122579014,1752432646,425603,-1070922626,1183516651,-1543109882,-96040691,92127243,16402119,105286400,-259270409,208942847,66733707,1342995974,228079359,425603,1183516028,-1962743034,-1543095354,-2096136947,2080376446,105286405,-963966997,-1532951573,1996443661,1354771210,-1862633729,322955278,556675,-1947663499,108954368,-1962574848,99288646,-150583669,-1543095336,-2089452275,2113931390,-339727612,138840839,228066819,-2080881015,2113930878,105286405,-1070923029,-2080749943,2097215614,-129579259,1183514624,1946551288,1183535116,2114323450,2122534924,92012552,-351779189,138840837,-2091853577,2080376446,105286405,1183516139,-1948715258,722314254,1996444104,-126419190]},{"sector":15,"data":[-1862633729,313255950,-150583669,-1947169832,-654899130,1996486795,142508810,-1962574592,48957510,-654852053,108954448,-1962574592,48956998,-654852053,142508880,-1962574848,48957510,104449931,377359768,556675,1183516028,-1962743032,-1580692537,-1054143080,-1070923029,108954448,-1962574848,48956998,104449675,377359780,425603,1183516028,-1962743034,-1580692538,-1054143068,-1070923029,175570768,556675,1183516030,721611528,2122535104,92143622,-351910261,1354771202,-1174396744,1347551436,252826,138840832,208930305,17188491,185368070,191132864,-1593278784,1177226660,721611526,-96040512,92127243,16402119,105286400,-259270409,722106111,1996443840,-1741225990,105265421,1183516028,-1962743034,-1543095354,-2096136947,2080376446,105286405,-963966997,-1532951573,922701837,1183517812,2114323450,244338700,-2095828760,1962936446,9300227,-150583669,-2081387560,2080376446,105286405,-963968277,228853307,2122543997,142475272,722311329,48957510,1183432747,108954616,721714688,-1962742848,-96040506,16285315,1187448189,-16776968,1996425846,-92864520,556675,1183516028,-1962546424,-654899130,108954448,-1962574848,99288646,-150583669,-1542550568,1372072717,66602635,1342993414,66733707,1342995974,-1696067952,-59310317,16777114,-2090902016,-443874579,-900899553,1478361094,-1957345904,-661774612,-2096436093,246334,1996425332,-26106,1996423168,-26106]},{"sector":16,"data":[1996423168,-26106,1183383552,-2110324744,61577742,1183383552,1681818614,175439877,90717827,-385649408,922681509,-6680224,-1996488449,1048837190,1946158436,-159973592,228996863,229127935,196491007,196622079,112720,548950096,13416960,-6664110,-352321281,-1908998302,86022668,1183383552,-159973382,228996863,229127935,196491007,196622079,112720,649613392,2275843,932859986,-16777212,922744438,922684838,922684840,922684342,1996426168,112892,-2034741168,15645184,-1818603438,-16777212,1201338998,-16777212,-1147470730,-2097151996,349246,1048776309,1962935652,1748927239,343146501,737703679,-11513664,-15886282,-15883210,317453942,737572607,-11513664,-15886282,-15883210,-1070860170,548950096,13416960,1637503058,-2097151995,353342,1996425844,-25864,267059200,90717827,-16223232,-6621066,-16776961,865793654,-16777210,1996424822,-25864,1048772608,1946158018,108461832,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,228106512,-1577433463,1183387044,108954616,-385649408,922681799,-946207800,-1996488698,922745926,-761656348,-16777210,-1710325194,1640,-1980742007,726725190,-1957670720,1178143302,-1962574342,65796678,1342850699,956843659,92141638,-336050549,138840835,-260636848,1347469355,-1174396744,1347551436,431258,138840832,2130200121,1949761315,2114323212,1996443660,-129594374]},{"sector":17,"data":[1342719531,737179391,1996443840,-401698808,753602209,956843659,612235334,737310463,1996443840,175570936,721962635,-11470778,-1962118090,100923462,-1873802114,287565838,956974731,830405190,208930307,2117533520,-96040180,1342850603,956843659,92141638,-336050549,138840835,-260636848,722106111,244338880,-351388440,172395322,2113553977,-227082446,737834751,1183535296,-96064758,138840912,2113422905,-129594619,1183515627,1183535112,1946551290,922701836,244321406,-15683352,-1667567498,-16777210,-241562506,1342177286,456602,-163149568,-16091393,28838006,726683648,-1706012480,1766,185328803,-11504448,-1710325194,1652,-1030519,-1710496714,30,1358055049,1347469355,-16091393,1996425334,-1202695952,-860225504,-1706012160,565,-1695385857,1700,-1695516929,67,-1191807233,726663210,-16061504,716764790,28856320,328880128,-16777209,312147062,-352321536,-466157750,-26101,1996423168,142016266,1342177720,1354771280,-26032,-459079680,209125131,16777114,-6664192,-1996488449,-1202653626,-2091909078,779326,-1070922636,28836843,-6664192,-1962934017,-1734145466,138840845,-2096257885,-443874579,-900899553,-1957363704,317489644,74907393,1347469355,28856400,-2137370624,-1929379832,385842310,72267856,1671057438,-1929379833,385806470,63879248,2040156190,-1593835513,-2037840562,1320746866,-1202708988,1344144590,497818]}]],[[{"sector":1,"data":[74907392,350752400,-28931839,1635041291,503566008,-259617456,-1706027266,1960,503598776,2089192784,-1706027265,2023,-9271669,-16429405,244319350,184606440,-1191938624,1344144334,503986872,537049168,147954256,-2037841920,-1705967760,2566,503566008,172144720,-342208482,-352321528,1312718865,91553796,-352321096,-1547687166,-1667168946,2055637259,196256255,196347435,2022082888,2109737983,2022098694,-1593835265,-2043081746,108920698,-8747381,-291437589,-293172981,208052734,-8878535,-2037709187,65798008,-1995675999,-2037646266,-2043936902,731512558,-1980182078,-1946192250,738162822,731511878,-1980182078,-35706,-1224801162,100925302,1346374580,-17910017,-1191414017,-1706033151,65535,1342459576,-1878755585,414902286,-1946270069,46292453,-1873273344,-326412987,-2116514274,-956255508,63558,63452927,330650,-163149568,72236672,-385649408,1320682104,-1202708988,1344146182,1344798904,16777114,1350994176,2109737983,36497667,503598776,185514064,-6664162,-16776961,738152630,1347440832,16777114,200188160,-1577433463,1183386726,193372654,-1578744183,1183386514,210936288,-1577302391,1183387030,243180016,-1579006327,1183387822,180396508,-1578482039,1183386324,1354170344,267774207,-2210167,-385920842,1183387627,1354170330,266463487,-15995229,-385920842,1721962455,1354170124,265152767,-16021853,-385920842,-1834807357,1354170123,263842047]},{"sector":2,"data":[-15953245,-385920842,-1767698513,1354170125,262531327,-15827293,-385920842,-1365045349,1354170128,261220607,-16072541,-385920842,-727511161,1354170122,259909887,-1947974007,1177804358,-465161254,200148531,208012851,193332787,194119219,210896435,227935795,243140147,279840307,180356659,181667379,-2115746167,1631903358,2122386293,1968008922,1958742788,1354170227,-25857,1996423168,1384549638,-2135404289,347623424,1320701952,-6664188,503316735,280148048,817385502,-6664192,-973078273,282118,-1543879029,1183517678,208053230,-1545189749,1183517574,194159584,-1543747957,1183517842,227976176,-1545451893,1183518334,279880668,-1544927605,1183517376,181707752,-1559331167,-1365177666,182100752,-1559457119,-1767830552,200057613,-1710852353,3080,-1579792759,104402038,1500842990,957121185,1963746822,200188240,243140153,1721845621,-1375323892,-12684016,683202166,-711307264,989855754,1963689478,-696844500,1342188216,16777114,-1845085440,-1592101621,104401798,292883602,957059745,1963824646,1577502472,-352321275,1577502470,-16777211,1996424822,203201238,787152896,-1928956161,1358910086,1342210232,1342181048,1342459576,663450,-1202708992,1344147634,1342189752,667546,1309066752,2122514436,57934072,-2147447319,282174,28837237,721611520,89039808,1342426808,1827147408,63879189,985157662,-1202708982,-1706029054,1998,-2131605879,282174,-1873800331]},{"sector":3,"data":[7530510,-506231,-660934026,-352321529,-227082481,-11487489,1105727120,-129595129,16285315,-826799500,-1706025469,65535,-1559331167,-291435088,291414795,-1559187807,1721830898,167813900,208930503,113704960,3198,-1695123713,2225,16285315,113706613,1362,-2080881013,-443874579,-900899553,1478361090,-1957345904,-661774612,-954274685,59462,-1705983957,898,1357792905,-303559024,1354771204,-1695648001,1222,-1727271263,-1037319629,-754973767,734147576,1713829826,-330921716,-1705983957,65535,1357792905,-1175974256,-293698812,-16223232,1067118198,-1593835516,865668078,-1178457150,-120389629,-1037319629,208021239,972834441,108457030,-1981004149,1996487750,-401698810,1996423419,2144262,726684313,-1818603328,-956301299,123462,-335788405,-360807663,-14191360,1183572550,-137221124,1183441526,178426,1354771280,-1694861569,65535,-2115352951,16841342,2122437495,1979777274,-361300208,16777114,-465139456,-337226103,-360807647,-16223232,1805314678,-956301299,59974,-1995663688,1586291782,-96024602,1183514880,-430535708,-1980479863,1183577686,-330921478,1589906923,-196673548,-16267738,-2081665281,1962994814,-58817555,-1960152064,1178205254,-1996261638,1183578694,-62510598,-16353537,1996482166,-6663964,989855999,-713754042,31999687,-360807680,-15698944,-6624650,-16776961,-6624650,-1962934017,-310122426,535137026,46812509]},{"sector":4,"data":[-1873273344,-326412987,-2082959842,1996424428,1354771206,-107327408,-1593835512,104008686,104008806,104008582,104008594,104008850,104009110,104009342,104009902,104008384,708119252,-62486228,-1207535873,-397385404,1996426161,1299101702,195553360,-16353537,-401871306,1996426141,1714880262,194242572,-16353537,-401897930,1996426121,-1841889530,192931851,-16353537,-401829322,1996426101,-1774780666,191621133,-16353537,-401703370,1996426081,-1372127482,190310416,-16353537,-401948618,1996426061,-734593274,188999690,-16353537,988347510,49120011,1562371467,182861,1167087646,518818645,-826746738,-1202708989,1344145978,1352663736,1007258,49120000,1562371467,1478413133,-1957345904,-661774612,8842369,-8747321,1048772609,1962935634,8448259,91504259,-16157696,-1878690762,245688334,-1928956161,1358920838,1342210232,1342183096,89013891,-1207602176,267061988,72236672,-1207602176,65733710,1342426808,1032602,-1202708992,1344146502,1342186424,1036698,2055637248,409087,1996433013,1354771206,-488108400,-62486259,242597899,-8747321,113704961,1362,-2033776917,196474,-8747381,-1962742397,1297948645,503317194,1430622296,-1910575989,-1897102888,-96024832,1048772608,1962935634,11856131,-1142419824,1312719088,57999364,-1207917079,1344144462,504039096,268613712,259562064,1183383552,2092960764,63879202,985157662,-1202708982,-1705992190,4133]},{"sector":5,"data":[-9271671,1358722815,1374162576,-1593447677,1077938952,200951433,1028751040,208928769,1946157629,-163133632,99287056,653674183,108461824,-9140595,8435792,-159973552,1342459576,729498,-1202708992,1344147634,1342189752,733594,72267776,949637150,-352321520,-163133677,-974454758,16416387,113706613,1362,-2080749941,-443874579,-900899553,1478361090,-1957345904,-661774612,8711297,88999623,-826802176,-1202708989,1344145978,1352663736,1092250,-62486272,280205904,1320681472,-1706025468,2984,-8616307,1119375382,-1706025462,4196,-8616307,-401698736,1344147617,1342459576,-1763176816,-1706025456,4212,503598776,2089192784,-1706027265,4242,503598776,63879248,-6664162,-1207959297,1344144334,503598776,122919504,113639424,-1207958450,1344144334,503986872,178256,191666768,1183383552,-459648772,-2097151984,-443874579,-884122337,1167087646,518818645,-326903666,105286406,45633566,-6664192,-1996488449,-1072956858,-1706029700,2951,33310407,-955913472,64582,-2080618869,-443874579,-900899553,1478361090,-1957345904,-661774612,1459940483,108954454,-10718208,683148918,781864960,-1560281071,1996426216,2799622,289249872,-324861952,108461835,1342179512,1133722,180265728,-1207535873,-1706033142,4443,-16065885,79169142,1788497920,-1560281071,1996426650,440326,180591184,-1365049344,-953881843,84666374,-335100160]},{"sector":6,"data":[-956299765,-804602362,-637090046,-956178422,386767366,-1375287551,-1593780211,-1834808344,200057100,-1592944989,2124614334,182100238,-1592742237,1385762198,193372496,-1706012007,4565,-1834891125,-1713730804,-1834921902,1347590411,-74714741,1217434,2094480128,990150479,-1589020986,-291303810,-1372127477,-2043216112,-1841889525,302291467,-11534336,-15886794,-1710452170,4671,-1727240541,-120470997,279840259,1712229273,-1980106996,-1365115834,1317771536,-1543899140,1206586470,-1559187807,922684518,922685054,922684306,1301941126,1342177298,210908927,227948287,16777114,200188672,-775804007,2114323448,244029710,-101250066,-1577302391,-1952903554,-101188530,-2146701661,-267653594,-1727271263,-1037319629,-754973767,734147576,1347590594,-1727240543,1268404306,184549395,2132442322,-2147067,45683574,200188160,-1543899239,1721830382,1894357260,243180031,-1592938333,1587743726,279879953,-1592921437,10685542,-2090902006,-443874579,-900899553,1478361090,-1957345904,-661774612,-954667901,64070,556675,-4716931,19720703,63452927,1318298,-62486272,32261831,200188160,-1728051451,-1037319629,-754973767,734147576,-196703806,-351508831,-260144366,-13339392,1721887814,1317771532,-1980106772,45674054,1183535104,1347590644,-1712437621,-879079342,1375731732,349346384,1183383552,-293698576,-1949928192,1727525958,-129594898,276086795,-1695516929,5368,-1981266295,569109078]},{"sector":7,"data":[15761027,1996425332,335911664,1187446784,-1207959312,1183386774,-362902296,16271047,108461825,1347469355,330537552,1996423168,1354771208,-1885712304,-1962934260,1183447110,-129594382,1978811961,108461870,-1411329,-1705973642,65535,-899447,1996425334,-394854422,223058512,1183383552,-230278666,1187499892,-2097151494,1946218622,-260636912,877466,-260636928,1381530,142016256,1316250,108461824,1060506,-59310336,775322,-96040192,-1962742397,1297948645,503317706,1430622296,-1910575989,619480024,1379828566,57999365,-2096984855,1962937982,42199299,818819,2062091125,306612994,734147481,244162,-1036781357,1183433259,306613212,1208894979,734147481,871945154,-1983763518,-291379130,460043,734147481,871945154,-1983763518,1187506758,-956301060,122438,-351517045,-461470958,-13339392,1183571526,1317771532,-1980106786,45670470,1183535104,1347590634,-1713355125,1050300498,1375731733,213686864,1183383552,-528579612,-1580829440,1183386752,-426094362,-1996488701,2122572358,376701152,-1696303361,3285,-1981004151,1183444566,-229209616,2122524651,141820132,-1696303361,3307,14960327,211204096,-1930410359,1183445598,-295793428,31475399,-364475648,-1957670247,1385762886,-26032,1183383552,-162100748,552879747,16144003,16271047,18409728,16547459,1988842613,-126473460,2128639545,-529102589,-1947449717,1183444566,-229209616,-739766640]},{"sector":8,"data":[-96040456,-159973552,737441535,1067077824,-16777194,1996487286,-260636686,-135641461,-1705975698,6247,-1694861569,5724,31213195,1996484678,-398029850,1088177707,-11513191,1996485238,411933424,1996423168,306613218,-1310959989,736285443,-1070903102,242679632,1342177720,-16091393,1183516790,-129629434,2144336,1375784122,415341136,1996423168,-398029850,1088177707,-11513191,1996485238,-25872,1183514624,-263847446,-1946401025,1178198086,-951683588,64582,535301776,-96040456,-159973552,737441535,-1801826112,-16777194,1996487286,-327745554,-135641461,-1705975698,5801,-1694861569,5809,-135641461,26861678,1444017222,-129564682,957105803,58587206,-2080449047,2113993854,-401698764,1183446986,1996443898,-193527818,-1705983957,6203,-362753,1996484214,-364475412,1358720759,1303194,-92864768,1601434,-495517952,1633690,-461470976,-15698944,-73735050,-16777192,-1164254090,1577058327,-1962742397,1297948645,503320266,1430622296,-1910575989,619480024,209617750,-385649408,2122514961,57999370,-1962800919,865667142,-1178457150,-120389629,-1037319629,-1948498295,1174603846,865683468,-742249534,734147576,-398030398,84668065,865665031,-742249534,734147576,-364475966,16533191,-565786880,1183514625,-2095912182,1962992766,-565772492,-1727379829,-136425845,-498693639,1342177976,-1712699765,1183535186,1347590626,1568410,-1706012160,4946]},{"sector":9,"data":[-2082191735,1962992254,209756614,1358186121,1370010,-431585024,14843523,1996428916,326146788,1183383552,-229209616,-1981004151,669773398,14974595,1996425332,419666660,1187446784,-1207959324,1183386774,-228684560,-1930672503,1187507806,-1962933790,-1986460090,1451882054,-364475400,-11513191,1996486774,407673590,1183383552,-128546314,553010819,16275075,16402119,14084352,16547459,1988848501,-92919030,2128770617,-495548157,-1947449717,1183444566,-229209616,602410640,-532248074,-126419120,737572607,-1499836224,-1962934253,1385818694,-498693296,-1706012007,4540,301352449,1996486742,-227082272,-1947175169,1861741126,647647458,-16777191,228253814,-1962934252,1174527046,-193527824,736642699,-1723802554,1996443730,-260636686,16777114,309788416,-1961855233,1174605382,1996443898,112652,-428409008,-1962391925,61987926,-1037311277,1354771280,-1174396744,1347551436,266138,-364475648,-1030655,1183579206,-62506526,1187448181,-16776964,1183578694,-96061174,535364477,-428408833,807834,-461470976,-15698944,-40180618,-16777197,-2036669322,1577058323,-1962742397,1297948645,1426067146,-326898549,74907396,385631885,112720,332438096,1183449088,-1947981060,46292453,-326413056,-16585597,-756546442,-1981535489,1996488262,-3676156,-523040591,-1946270207,-443810234,180829,-2081649835,1183450348,-62486524,-1928956161,1343683654,1342177720,1463450,1575324416]},{"sector":10,"data":[1426064578,1996483723,71731718,-397351894,1996488654,88508934,-397351894,-443809854,311901,1167087646,518818645,-327034738,1048772740,1962935630,1312718872,292880388,-1928956161,1358920838,1342210232,-352314184,108461875,1944587920,108461827,-1712845168,146932,113653620,-16775986,1105725046,1958743021,108461864,-8616307,8435792,899152,1354771280,1759898,-1202708992,1344147634,1342189752,1763994,49120000,1562371467,182861,1167087646,518818645,-327034738,1048772746,1962935630,1312718876,359989252,-1928956161,1358920326,1342210232,1342184632,-2081832917,108461824,-337113456,108461826,300420752,146932,-2115435659,-18432,1392508858,204930896,-26095,-2037841920,-1769341066,922746744,1152913676,-11526648,999949942,1342177286,-8866049,-8997121,16777114,-62486272,-8866049,-8997121,16777114,-58817792,-13405184,1843922550,1958743020,108461865,-8747379,8435792,964688,80656464,459053648,1344143360,504410808,3192912,460102224,-310181888,535137026,46812509,-1873273344,-326412987,-2116514274,-16742676,244319862,-16631320,244319862,184844264,-1207536192,-2031484929,1312718848,125108228,89013891,-1207602176,65733710,-1996239176,-826738106,244338692,200637928,-13732672,-2037578122,-1202651270,-1202716544,-1202716654,-1706031922,3793,1186484254,-1202708980,-1706032844,3809,1962935869,80656550,1183535134]},{"sector":11,"data":[-1873797382,74442766,343261195,503631544,266050128,1996423168,-401698810,149618712,-1878624513,-209721330,-2080618871,-443874579,-900899553,1478361090,-1957345904,-661774612,9235585,-1996140895,1386347078,2022082821,1309067263,-956301307,17125894,2055638272,-1202710785,1344144462,1832090,72267776,-826781666,-1706025468,7211,-1878624513,-215750642,201082505,-1201965632,-11533234,244319862,-2096810008,1962998398,2059305068,1702166783,503566008,72267856,1553616926,-973078500,282118,503566008,171620432,45633566,1771720736,-1996488690,1358918790,1419418,63879168,1119375390,-1706025462,7284,2122523627,377356540,503598776,2055638352,-1706027265,4168,-1543879029,-2037709490,1386479480,-62485755,-1962742397,1297948645,1426064074,-326898549,172138498,-768875478,-1147514798,-2013265892,1586232902,25133060,-1978305222,-768894969,-6664110,973078783,242548294,233553963,16777114,-28952064,28897909,1575324416,503317186,1430622296,-1910575989,82609112,-1878493441,5826574,425603,113706612,66898,89013891,-15895552,244320374,-1979846936,720108614,-1878493441,-234100722,201082505,185562304,-954761536,17124870,1309066752,1320681476,1996443652,-401698808,1183515664,49120252,1562371467,313933,1167087646,518818645,-326903666,-1036090620,192151555,-1710852353,65535,-2097088023,353342,1048774517,1946158440,108461866,692378]},{"sector":12,"data":[-62486272,-1710852353,6803,-59310256,16777114,108461824,-1694730497,7671,-2097102359,361022,1048797054,1946158420,-2110324981,505387534,149618688,-1710852353,7721,-1694742903,65535,1946162749,-59310326,16777114,-16192768,-6620042,-2097151745,349246,1996425844,507615996,199950336,-16353537,1318780022,-16777186,244319862,-337291288,-1975614629,1416888328,143277699,-2092466688,349246,922684276,-1919283582,-352321513,108461832,1931674,-62486272,-26032,1048772608,1946158420,-59310326,1489306,-15996160,1996424822,184982268,1996423168,-401698810,113763584,2186,-1962742397,1297948645,503317194,1430622296,-1910575989,1782481880,309592076,-16222465,-826800522,-1706025469,8548,1589905387,130426374,112640,-1962742397,1297948645,503317706,1430622296,-1910575989,686588888,-1207273729,1344145486,16777114,-62486272,1131724811,-1157627976,1347616767,-1694730497,7994,-1980217719,-1039402410,1183656308,-11528488,1996486750,-126418950,2053786,-666465024,-826781674,-1873797629,15984654,185262755,-1207601728,48955393,-310132693,535137026,113921373,-1873273344,-326412987,-2116514274,-956266772,713222,-18432,1392508858,204930896,531667473,1183383552,-61437446,-1070903214,-6664112,-16776961,1996487798,534878970,1048772608,1946159842,1354771241,-8747379,8435792,1620048,63879248,436574800,1344143360]},{"sector":13,"data":[504410808,3192912,437623376,-492765184,49120010,1562371467,1478413133,-1957345904,-661774612,-1207374717,-4521985,-11513089,-1710158794,6778,-1980217719,922745430,1522012428,-11526648,-1516632458,1342177313,-362753,-1583679370,-1996488678,1996487750,-126418950,1749402,-62485760,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,-16097596,-1977218490,-62486521,-16359740,-1977219514,-96040953,1643937408,2122320508,75463420,-520337792,1643806336,2122320508,75463418,-520468864,955926154,74775622,166445099,16547456,28882549,49120000,1562371467,576077,1167087646,518818645,-326903666,105286406,-1946532215,4161752,116083828,788299392,1586171764,105316102,1183319946,1975519996,-58818325,-1960479698,1204160094,1191128831,1292355078,-16359797,130418246,106859347,-972667137,1586188295,509446,519718539,480483920,-310181888,535137026,46812509,-1873273344,-326412987,735612446,1706578112,-11526648,-1962418122,1344144966,16777114,132162304,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,-1996077429,686554182,-1979294069,-96040953,141843516,74723132,125123132,1074153099,-1946401143,1344144966,16777114,105285888,-2147066229,-797638593,-2080618869,-443874579,-900899553,1478361090,-1957345904,-661774612,8580225,-8485235,716722198,-1706025458,7141,-2146935157,242483263,-8485235,-1873588202,-8656882]},{"sector":14,"data":[1048780011,1962935630,2122747148,-1202710785,-347077682,2122747366,-1202710785,1344146148,16777114,108461824,1934490,-2037559296,1343684478,16777114,49120000,1562371467,1057278541,1895825920,117505818,-1493171712,134283039,-939523584,167837470,822084096,184614687,-167705856,-2147483375,385876736,318832389,-1308622080,453050141,2046886656,2080375555,1895826176,486604567,-1912601856,536936219,-2046754048,16778015,1006633728,570490636,2013332224,251658775,-822017280,285213206,-1644100864,301990423,1291846400,721485596,-956235008,318767638,-1006632192,788594461,-100596992,570425621,-1191116032,419431198,-1090452736,-1694498042,1979712256,1006698271,1090585344,-1660943610,1476461312,805306630,-620756224,1107361565,-788528384,1124138781,-1325333760,620757793,1912668928,-1509948669,-721353984,-1493171452,-1577057536,1208024836,1610613504,1258356509,-805240064,855638558,-318700800,872415774,-956235008,771752735,-1291844864,1325465348,-1610611968,1375797013,-1962933504,1392574229,-369032448,1140850973,1258357504,905970463,1124139776,939524871,302056192,1241514262,520160000,1342177553,-1140784384,1107297053,1124139776,1241514524,-1744764160,1140851485,-50265344,1157628690,755041024,1291846177,-1174338816,1325400608,1845495040,117505818,-2013199616,1476395550,-1543502592,134283039,-1660878080,1493172769,-989854464,167837470,771753216,184614687,-754908416,1459618591,1962935040]},{"sector":15,"data":[2013331225,-687865088,2030108432,-452918528,1627390496,-2097151232,2046885648,-973012224,1778385173,-922746112,2063662876,838861568,2080440094,-1929379072,2097217309,1937009920,1167087646,518818645,-327034738,-950665074,64582,286031489,-385649663,1183515244,81162,37559156,-385649408,54329578,-385649408,87884009,-385649408,-1612119780,242679554,1342177720,78234,-6664192,184549631,-385649216,1996423809,243726,80656464,2058899486,2124042240,-1929379839,385840774,80656464,1150963742,-1207959550,-1924136959,1358919302,-2096995096,-2037578556,-397344906,-998046992,1958742786,242679603,-9009523,95965206,79187968,280514560,1905938496,184549378,-15371072,62393974,-2037559296,1343684470,153242,34662656,-1202667477,-397409074,-998047211,80656388,44230736,184730755,722171072,-6664000,-385875713,-826801686,-1706025468,65535,1342492344,16777114,242679552,1342177720,16777114,29616384,722368255,-2114917440,50333822,-1209465996,242679553,1342177720,81562,1996443648,243726,-26032,-1202716672,726663182,1347440832,16777114,-6664192,-385875713,1183515014,81160,37555060,-385649408,1944649970,242679553,1342178232,503631544,8042576,-26032,1996423168,1988529422,-1202710785,-1706033147,65535,58048523,-1929335319,385840774,28285520,1183383552,80656630,77221918,-1996488701,-838469050,-129595132,1065408651]},{"sector":16,"data":[-2147126230,91568703,-352321096,-1983894782,-2113964922,80672894,-826784138,-1957683708,1344206918,201114,-129595136,126539915,-9271672,74721852,108347196,-9140537,1586167809,-2012771592,1023373958,1006924892,-1950321350,1344206918,16777114,-129595136,-9126269,-1961987072,-2104625546,1343684470,-336050549,-160003316,-9010547,1035489302,-1706025464,892,-1207011585,-1924136957,385840774,43948624,2146107392,-1207011585,1344144590,1342178744,1342178488,1346375864,184218,1975520000,-37361405,-1207011585,-1202716669,-383908658,2122448445,1963003916,242679631,1342178232,503839416,-26032,1996423168,243726,68532304,8042576,1354771280,-26032,1996423168,133871630,95965214,79187968,280514560,-6664128,-16776961,244321910,-956055576,130118,1593591435,-1962742397,1297948645,1426066122,-326898549,-950642934,64070,503596683,-1706025392,65535,66471561,1344144454,222874,-1947170048,977043710,1015026036,-2146208466,1966014332,-159481075,-955812606,63558,1015036139,-955812516,129094,2122525931,74711046,65781803,-1996488008,2117728326,-2145946876,611593789,503596683,516393808,-26032,-125108224,1150149867,-1957683711,1007024198,-1706025464,65535,-443850914,-1957313699,1988843244,-2146374908,91499068,1967078528,112645,-2142893845,-344653764,-1956724693,516120037,1430622296,-1910575989,-1897102888,1187468800,-2130706182]},{"sector":17,"data":[17894526,-1645673612,172395264,1946157373,146701,54349428,-380603392,1996423589,112654,71146064,-1706033152,79,58048523,-16676887,62393974,-826781696,-1202708988,-1706033030,1222,1342492344,66970,242679552,1342177720,402330,22735104,722368255,-2114917440,50333822,1240007540,242679553,1342177720,281242,1996443648,243726,90806864,-1202716672,726663182,1347440832,85402,1922715648,-385875963,2122383640,1946226700,18082051,722368255,1347440832,1342178488,-1705983957,179,72236672,-955747328,1325364358,-2095715580,347710,-2033776523,63897460,-2033776917,138674036,-9134453,1962950528,11397379,-1207011585,-1924136956,385841798,8304720,7051856,1183383552,-2131719172,1560246714,-2100948876,-10682502,1988885574,2055390972,-2037710593,-2037776524,-397344906,-2037841760,-2037514376,-2037776518,-2037645454,-2043019400,242483062,-9003381,-9259381,121111690,-1635045516,1065418610,-1962248960,973043846,1946121862,1954974472,1988528639,242679807,1342178232,-9009525,-912633826,-352321536,1988528945,-1706025217,1371,-9009527,-9271669,-627421154,-352321531,242679705,1342177720,18842,-1070903296,22256208,1996423168,-401698802,1187447068,-1962933766,-2090927546,-443874579,-900899553,-1957363702,82609132,503596683,-1706025392,418,503596547,96377424,1183383552,-1959728130,1344144454,519980683,31824464]}],[{"sector":1,"data":[1183383552,-1965519874,-62486521,74734652,259340860,519980683,35232336,1183383552,-1962349570,1178141766,-1949796354,46292453,-1873273344,-326412987,-2082959842,1187448044,-2130706180,17894526,2122522485,208929034,34242179,2122516084,561317642,-15829249,1922697846,-352321530,209617167,225771792,-1878100225,6481934,33310407,-62485760,-1962742397,1297948645,503319242,1430622296,-1910575989,82609112,16533191,209617152,343212305,17464963,1996426869,112654,17930832,267059200,269254273,-15895295,244321910,-956296216,130118,-2080618869,-443874579,-900899553,1478361098,-1957345904,-661774612,-15537021,1183647350,-1706027276,1941,737691275,1183446086,-96039954,-1980348885,1996487750,-26106,-1924136960,1343680582,-1149185,244382838,-16759576,1183516278,-1037329938,1317796049,1372072944,-1711520117,-120470997,737300107,1996444104,-59310098,-1705983957,65535,-1207535873,-1706033151,65535,-1962742397,1297948645,503317194,1430622296,-1910575989,283935704,242679638,16777114,-230258432,571472,122788432,1183383552,-227082256,1342180024,16777114,-62486272,-15829249,-6622602,-16776961,-6680970,184549631,-1961003840,731508806,-990326334,-1993995682,-62485753,-775804007,1200170744,9955586,-1928431873,1343681606,16777114,-129594624,-1712044541,-120470997,638213828,1183516553,-96074762,-775804007,1200170744,138840834,-775804007]},{"sector":2,"data":[653298680,-972879989,2129675835,-263812342,-1993947605,-1961497849,731449414,-1946627646,173982960,2100771110,931735043,-1727641973,-120470997,1589964939,1200301578,1002832642,142539846,737953419,-8787514,-1727641973,-120470997,1589964939,2000233994,637828354,1577219977,-1962742397,1297948645,1641162,15663363,6815747,72941827,7274499,124190979,2031619,112197891,2097155,73335043,2228227,65798403,2293763,118751491,2752515,113901827,3014659,117965059,3670019,121766147,5242881,120914179,4325379,123666691,4456451,88867075,5046274,95027459,5111810,16515331,5177346,8061187,5767170,94372099,5898242,68222979,7471359,69009667,5767171,65405187,5963779,88015107,6029315,67633411,6094851,26214659,6488067,75497731,6553603,45482243,6619139,1167087646,518818645,-326903666,-1924863212,1343679558,1347469355,112720,-26032,-1073020928,1048786036,1946158446,1849098002,-330920699,-6664170,184549631,-1928038976,1343679558,16777114,-330920704,-6664170,-2097151745,348222,1048819060,1962935632,112645,-1070923029,-1962742397,1297948645,503317706,1430622296,-1910575989,216826840,16271047,209617152,695533841,-1710328065,65535,112720,-26032,1996423168,-26098,113704960,1390,89130695,-1175912447,209617152,57934096,-16730903,-1070920074,-26032]},{"sector":3,"data":[1183383552,1622692092,28856560,-6664192,-2147483393,282174,1187448692,-352039178,1312719635,125108229,-822720825,-955913469,182777414,-1980348789,65796678,-1946794241,1065416286,-336235264,-193036259,-1960610758,1178204742,505116406,-163148976,-6664162,-1996488449,1586230854,-2012771594,1547498566,1586222965,-2012771594,1547498566,977011828,1191117685,242679798,1342178488,519456395,-26032,1996423168,-26098,1996423168,-26098,1187446784,-1962933768,-310118330,535137026,181030237,-326413056,-1956713341,1065354846,721777920,22211008,-1996077429,-661915066,1946173312,-2146178066,1965073022,-96040167,-694530018,-1996488703,1586231878,-2012771590,-1073044922,1183572341,-62486022,2122322923,427044002,519718539,34708048,1183383552,-94467078,1183319946,1975519906,-94467103,1946173312,-96010338,-352319546,-1568767969,-2145028832,1965990526,-94467322,-1962932282,1344207430,145562,-96040704,-1963303285,-1572435961,-713703414,-1980086645,334233158,748846720,1183521140,-1706025222,618,-1946532215,126548574,178407048,-1948158528,1065417310,-385649408,1191182137,509690,2122322923,427106466,519718539,-26032,1183383552,-94467078,1183319946,1975519906,-96039967,-2086386039,1946158206,-28931302,1183535134,-1957683460,1344185414,1347469355,16777114,-1961301248,1344208454,519849611,-1538880688,-1070903266,-6664112,-1996488449,-1072957370,-1202708108,-1706033114]},{"sector":4,"data":[886,326435240,-1694992641,65535,16271047,1309067008,-1962934258,-443811770,311901,1167087646,518818645,-326903666,1309067094,-1207959282,1344144189,503527096,132298832,1183666206,-1202710870,-1706033071,845,1353336461,-402229505,1183448667,1975520252,1312719665,712245262,503532216,54769744,-491237346,-1924129273,1343662662,1342198200,16777114,-1438216960,108461904,-1979832600,1048837190,1946158430,9234691,16547459,1996446836,2668796,59087440,-391970816,-59310325,1342188216,234650,200057600,-1191414017,-1706033144,931,-16073053,179895414,-1298509824,-1560281085,1996425946,309500,63019600,-1700593664,-59310323,1342179000,16777114,229548800,113715947,330728,200017607,113704966,47188670,182060743,113705440,18288026,229508807,113705176,3662,-2080618869,-443874579,-900899553,1478361090,-1957345904,-661774612,1450896515,91096775,113704960,1360,1342177720,-941093232,-230258178,225820683,-1207535873,-397344769,-135724282,-2008642302,716722198,-1706025458,65535,72236672,-1928301568,1343653958,1342459576,16777114,-2095453440,347710,1183648373,-1202710904,-404028466,378029709,182761552,-6664162,-16776961,146338422,-1768271872,-1996488700,1996482630,702706,46701136,1183383552,-18206,1392508858,204930896,82221585,1183383552,-531199522,721843967,-358985536,-16777210,-1206842314,1344144210]},{"sector":5,"data":[-16353537,1996480630,-25890,1856176128,-18427,1392508858,204930896,-26095,1183383552,-598308390,-1192069377,726663177,-11382592,1347476086,336282,-227082496,1342180024,378029709,-26032,-1924136960,1343653958,1347469355,344474,-431585024,58572811,-16678423,62452342,-1070903296,-1924116400,1343682118,435610,-431585024,58572811,721510889,-11513664,1592384094,-159481087,-2095745792,1962998398,-125926641,-2096532224,1962998910,21883139,-624897,-15995338,-1852118922,-1996488699,1996483654,1714880504,-495517940,379802,-364476160,957083297,58518598,-1593775639,1178143846,-385647382,1183514846,-163173382,-1948760439,1177287750,-196703752,-624897,-15995338,-593827722,-16777211,922745462,1996426222,-1695511576,1520,1183434283,-126419066,208025343,-1696434433,1537,-231681,-15964618,-259267978,403610,-1983501568,1183576134,-2042231828,200148539,-291432066,-330945781,1350977161,-1542401,-1710494154,1613,-1948760439,1174661702,1711684592,-1592164852,1177226342,-263812630,-495517872,208025343,16777114,-196704000,8814211,2122527358,746455280,1347469355,-2466049,1996485238,-126418954,-2590977,1996485750,-361299988,-7964929,1290334326,1354771201,-631308464,1347469355,-2466049,62452342,-1070903296,-1924116400,1343682118,448410,-431585024,125681675,1342600959,-2097117720,348222,-1729559691,1346274302,930414597]},{"sector":6,"data":[-1192069377,726663179,1347440832,244994128,-2097151993,355902,1996435572,112646,123247184,922681344,1637483886,-956301305,355846,-15471872,45675126,-1070903296,1347440720,-26032,1996423168,47487730,1996423168,-562626592,470170,-596181248,-1696958721,65535,49120094,1562371467,182861,-2115204267,-956267796,17125382,1849590528,460587013,-1207535873,-1706033151,154,91109119,41626,1845937920,-150994939,1073742918,1183537524,-316156,1996489789,-1816132842,-1700266194,-28915961,418054174,536757959,-955127040,1965638,126618347,130746245,127076299,-1928956161,1358921350,1342210232,738096895,-6664000,503316735,280148048,817385502,-6664192,-1962934017,79846885,-326413056,-2095256445,1962935934,38398211,294531,1089012597,172395266,734147481,244162,-1036781357,1183433259,172395492,1208370691,734147481,871945154,-1983763518,-291377082,460043,734147481,871945154,-1983763518,1187508806,-1962933786,887817286,15498883,2122516084,1752498424,15498883,1996425332,147102444,2122514432,141820152,-1694992641,2258,-1947842817,-1952906170,-101194162,-1192606071,-1957691390,1385820742,-364475568,-1706012007,2311,-6664110,-1996488449,922741830,1996426222,112874,-1070903216,-6664112,-1996488449,2122577990,-1938489110,15367811,1996427380,-25876,1183383552,-162100748,2122528235,141820140,-1695779073,2589]},{"sector":7,"data":[16285315,1996426868,170236664,-2136932352,-129595124,15484615,211204096,-1930148215,1187509854,-16776726,-6621066,-1996488449,1183575622,1347590408,-1712175477,1503285330,-1996488695,1451883078,-96041988,-61439200,-28915968,-672595968,-28931328,1005209091,159253574,721700491,1183448646,-25878,1183383552,1996443880,-92864516,-1705983957,65535,-1712175477,1183535186,1347590634,620954,-96075520,-240111,1996482678,-193527818,-1712175477,1183535186,1347590634,629658,-6664192,-16776961,-6625162,-16776961,1183578230,1347590642,-1712699765,-6664110,1375731967,-159973552,-1695254785,65535,-15436033,1996427894,209125374,-1710983425,2513,1343243779,-15829249,1996483190,74907404,360346,1996443648,175570926,-11485141,1996424822,2144490,1375784122,-26032,1183514624,-28966422,956581515,58588742,-57623,379252342,-2097151993,1946217598,-327745768,16777114,-327745792,16777114,-126419200,16777114,1575324416,3150530,1966339,7143427,163315971,8388609,4522243,7405571,5177603,7471107,77660162,917759,81592322,983295,139722755,1245439,150142979,1769727,142082051,1900799,130482435,65539,142541059,983042,45547779,10027009,138805507,1114114,145621251,1179650,169148675,1245186,159842307,2818303,166592771,2293761,23724291,1441795,83951875,2490369]},{"sector":8,"data":[14090499,10158083,12976387,10223619,129433603,3932415,144113923,3145729,79364355,2228227,43843843,3473409,78250243,3342338,119603459,3407874,9437443,3014659,23199747,5243135,72941571,5308671,51904771,3801090,159318019,5374207,155713539,5439743,168231171,4456449,154533891,5505279,116588803,3473411,75956483,5242881,28246275,5046274,19333379,5111810,71565571,5767170,75170051,5832706,85065987,5898242,77463557,917759,81395717,983295,80871683,5832707,3604739,5898243,162005251,6946817,22675715,6029315,1167087646,518818645,-326903666,-11118830,129501814,-2103816192,-16777216,1183648886,-1706027278,65535,425603,-1997995147,1413382912,1114963973,-1207273729,-1706033145,199,13474384,1996423168,-533266678,-499712245,10131979,1996423168,1882652426,1916206860,11180556,1996423168,208713738,1183666206,-397404430,1996423673,899082,-26032,1996423168,-26102,1996423168,-533266678,-499712245,14522891,1996423168,909573898,943128330,15571466,1996423168,-26102,-1377239040,142508801,-12421888,129501814,748310528,1342177282,144026,175570688,199243519,199374591,148122,175570688,208680703,208811775,152218,175570688,504131768,-230257328,1927827478,2050394881,-533320948,-59340533,209469067,199376427,200965769]},{"sector":9,"data":[192184063,-1962640138,-1962611770,1004074950,-385646649,1988690129,2096499696,-339244284,-137917692,922702040,922685008,-2036724606,-1996488703,-166986682,-963967876,-963967765,1183439095,-58817554,-1962574848,99351622,-134461813,-297387048,-1880554628,-59340544,-654850421,-2110324912,1345781516,29989390,1183383552,-1955206150,-654836666,1183576203,-1948715014,-58817544,-1962574848,49019974,-952383861,1183535486,-263812612,92258315,-335919477,1355254530,240137983,209860351,16777114,-62486272,15761027,1183516028,-1962742800,-297367098,16547459,1183516028,-1962546180,-654836666,2112767547,-263812337,1459373705,-939557143,64582,66864779,-1559502842,1183517238,-502922246,171483915,-1559611743,950078576,208839434,-1207273729,-1706033145,65535,42048080,1996423168,-533266678,-499712245,44734987,1996423168,909573898,943128330,45652490,1996423168,171358218,1183666206,-397404430,1599995917,-1962742397,1297948645,1426065610,-326898549,209125126,208549631,247706,-28931840,-16091393,1183647862,-11528454,1996424822,20310020,-1005816065,-14284706,2013210167,48142850,1996423168,-92864756,-1694730497,748,-16091393,1183647862,-11528454,1996424822,26470404,-1005816065,-14284706,2013210167,51550722,1996423168,-92864756,-1694730497,800,-16091393,1183647862,-11528454,1996424822,32696324,-1005816065,-14284706,2013210167,54958594,1996423168]},{"sector":10,"data":[-92864756,-1694730497,852,-16091393,1183647862,-11528454,1996424822,39249924,-1005816065,-14284706,2013210167,58366466,1996423168,-92864756,-1694730497,904,-16091393,1183647862,-11528454,1996424822,45869060,-1005816065,-14284706,2013210167,61774338,1996423168,-92864756,-1694730497,956,-16091393,1183647862,-11528454,1996424822,44689412,-1005816065,-14284706,2013210167,-26110,1996423168,-92864756,-1694730497,65535,-15960321,-6619530,-1962934017,180510181,-326413056,1459809411,73319510,38243110,638082756,-1006483575,-1960440738,140428343,38243110,638344900,1342326571,240137983,209860351,279706,-990903552,-1993996194,73319479,994020134,-1002406409,-1960440738,-28931833,863290939,1177274251,1589924094,1200301576,207537154,38218534,734432080,-1705968058,1176,638344900,50483083,140428488,38766886,1581222182,1575324511,1426066626,-326898549,-1000974590,-1960442786,-1001912761,-1993996194,1589903943,931866124,638082756,-1006483573,723913822,-11533753,-15839178,-1710456266,1239,1589964843,931735048,637820612,-147112053,1589919869,126559756,1006519945,-1959562042,-28955705,140428368,38243110,638344900,1342326571,1177273995,664424702,-1006632955,-1960440738,-939326897,638082756,637685641,1600012169,-1034033781,-1957363700,-1000974356,-1960442786,1589903943,1200170504,207537154,-1002992858,-1960441762,1589903943]},{"sector":11,"data":[1194010124,922701826,922685008,1704594562,721420293,140428528,-1002993370,958792798,1249707127,638344900,-147112053,1589919860,1200301572,1355229956,638082756,-1006483573,723913822,-1957690809,1355230150,376986,207537152,38767398,1589954563,1334388232,73319426,71797542,638082756,1599997833,-1034033781,-1957363700,-1000974356,-1960442786,-1001912761,-1993996194,1589903943,931866124,638082756,-1006483573,723913822,-11533753,-15839178,-1710456266,1534,1589964803,931735048,637820612,2097444665,207537226,994020134,-1002408713,-1960442786,-953482169,140428368,38243110,638344900,1342326571,-953432437,21469776,1589903360,1334519308,-993524990,-1993996194,1589903951,1200301572,140428292,1577552166,1575324511,1426066626,1589963915,1200301572,1589921798,1200170504,207537154,-1006138586,-1993996194,214064391,-326413056,637820612,-1006483573,-1993996194,1589903943,126559756,638082756,-1034090615,50333964,17040641,50364416,16783105,50332672,16803329,50336512,16799233,50336768,16795137,50343168,50340865,50340096,16793601,50353920,-16731648,50365696,-16741888,1828750848,1167087646,518818645,-326903666,209363214,291636793,1654721405,-196703983,-351503711,209363209,-1577826679,1183388002,-194083844,-62487800,-193035512,-955941632,62534,957192353,58653766,-1577302391,104402044,192745828,-1995348831,2090990150,-1593185524,1183386748]},{"sector":12,"data":[291807738,-2080881015,-2096563602,-2096564154,2097216126,-96024827,-1532952576,-129615603,1183384446,-2110324744,-26098,1183383552,-6663946,-16776961,230225526,-6664192,-1207959297,-1706033136,65535,209567755,-1191807233,-1706033151,65535,-624897,-15637962,-15637450,-15959498,-1710457802,65535,-1695123713,65535,-16091393,1996485750,-62485510,1358186027,737691275,-11470266,1996486262,-92864524,-1174396744,1347551436,16777114,-159973632,16777114,49120000,1562371467,151571021,-1409219840,1778385664,-1140784384,33554688,-1560214784,67109120,-1912601856,453050112,151061248,570425601,-738196736,1140915968,285278976,1140850945,-603979008,-2113863936,-1761606912,-2097086720,1937009920,1167087646,518818645,-326903666,175570692,-1705983957,84,5937744,1996423168,2050424586,2083979020,-667484404,198877450,-775804007,565727480,15776256,2140819538,-16777216,-1710325194,65535,1358710409,-1705983957,65535,-26032,1996423168,2050424828,2083979020,-667484404,198877450,-775804007,565727480,15776256,-6664110,-16776961,-6620042,-2097151745,-443874579,-900899553,50332936,-16758784,50338560,16793345,50339072,16783873,50343168,16811777,50349056,16782337,1828738816,1167087646,518818645,-326903666,175570692,1342180792,46746,108954368,-10980352,-1097201034,-16777216,922684022,922685794,-828763804,-16777216]},{"sector":13,"data":[922684022,922684538,1402604668,-16777216,922684022,922684384,-560329758,-16777216,-426112394,-16777216,-15959498,-1710457802,299,-1710590209,65535,-2097104663,1946159230,-533266677,-499712245,10676491,957440673,1963751942,291807500,209454649,-1830222987,1413382912,1316225029,243414783,16777114,-62486272,899152,-26032,1996423168,16161532,1996423168,1647771644,1681325841,17209873,1996423168,2050424828,2083979020,18258444,1996423168,18782972,1996423168,-25860,1996423168,-26102,1996423168,1647771402,1681325841,-26095,1996423168,2050424586,2083979020,-26100,1996423168,-26102,922681344,922684538,-6681476,-2097151745,-443874579,-900899553,50333960,16782593,50332672,-16733952,50338560,16794369,50336512,16790273,50336768,-16748544,50348800,16838145,50349056,-16750592,50365440,-16753920,50365696,-16768256,1828750848,1167087646,518818645,1996478606,175570700,-16222465,-1070922122,3401808,-1962742397,1297948645,503318730,1430622296,-1910575989,209125336,-16091393,1996425334,112646,780368,-1962742397,1297948645,1426065610,-326898549,175570690,1342178744,28570,1973047296,-16777216,112724598,-6664192,1342177535,16777114,108954368,-385649408,1996423446,505866,15112784,1996423168,291676426,199231033,-526318211,-1593578741,-1588588190,104403300,92081122,-351542623,291807491]},{"sector":14,"data":[291676496,199231033,-526318210,-1593578741,-1588588190,104403300,92146658,-351542623,291807491,24156752,1996423168,899082,27892304,1996423168,-26102,2122514432,745799684,-1710590209,65535,-1710590209,65535,-1191295351,-1706033136,65535,209567755,-1207273729,-1706033151,393,-1593149697,104402042,92081120,-351543135,209363203,209494352,199362105,-492763779,-1593578741,-1588589444,104402042,92146656,-351543135,209363203,209494352,199362105,-492763778,-1593578741,-1706029956,505,294531,1996428148,-26102,1996423168,-25755894,16777114,175570688,16777114,11921664,556675,-1394015372,175570688,1342179256,16777114,175570688,957440673,2097930246,199270661,1654719467,1688293393,-502908655,-1593475829,65735650,1343317153,957440673,2114707462,199270661,1654719467,1688293393,-502908655,-1593475573,65735650,1343317153,149914,175570688,957119137,2097930246,199270661,2057372651,2090946572,-502908660,-1593475829,65735650,1342995617,957119137,2114707462,199270661,2057372651,2090946572,-502908660,-1593475573,65735650,1342995617,16777114,1575324416,723650,17826051,6946819,18874627,131073,9044227,262145,14287107,1769473,6488323,2949121,17039619,4980737,6095107,5701633,25034755,8519935,16515075,8585471,26279939,8716543,15597571,8782079,1167087646,518818645]},{"sector":15,"data":[1996478606,175570700,-16222465,-1070922122,3401808,-1962742397,1297948645,503318730,1430622296,-1910575989,209125336,-16091393,1996425334,112646,780368,-1962742397,1297948645,1426065610,-326898549,175570694,1342178744,28570,1973047296,-16777216,129501814,-6664192,1342177535,16777114,291676416,199231019,-1577171319,103485796,1183386594,-25755654,243152639,200161023,44186,-28931840,-362753,-15684042,-1710463434,189,1358579337,227948287,210908927,56730,-96040704,1358853887,106906,-96040704,1358841481,210908927,227948287,61594,-96040704,-100609,-15995338,-1710326218,259,-113015,922745462,922684518,1905922222,-1996488703,2122578502,57999366,-16689431,112724598,1301958656,-16777215,-526316938,-28955893,199401808,1358579243,66995851,1342955526,66733707,1342956038,147098,175570688,1342180792,162458,209363200,199231019,-1577171319,103484540,1183386594,-25755654,243152639,200161023,99482,-28931840,-362753,-15684042,-1710463434,405,1358579337,227948287,210908927,112026,-96040704,1358853887,193690,-96040704,1358841481,210908927,227948287,116890,-96040704,-100609,-15995338,-1710326218,475,-113015,922745462,922684518,-996536146,-1996488702,2122578502,745799684,-1710590209,65535,-1710590209,65535,-1191426423,-1706033136,65535,209567755]},{"sector":16,"data":[-1207273729,-1706033151,602,-1710590209,65535,-1593149697,1177226208,-492744450,-96064757,-28931248,199230979,-96040112,199362051,44079696,1996423168,-26102,2122514432,57999364,-16709399,1996425846,-25860,1996423168,-26102,-219611136,142508800,-385649664,1996423401,440330,-26032,1996423168,199270666,1358841387,722199201,-1957627322,100924998,-1957688352,100923974,-1706030110,65535,722238113,-1995710458,2090991174,-502912244,-96040693,-100609,-15827402,-1710494154,727,-113015,922745462,922685614,-392557466,-1996488702,-11470266,-15886794,-1710452170,776,-375159,-1705968010,65535,-1980086647,-11469242,-15953354,-1710385610,795,-375159,922746486,922684398,-6680962,-1996488449,1996488262,1714880506,-1372127476,10066448,1183383552,175570938,722198689,-1588527546,1177226210,1183535354,-536476674,1183535115,-502922246,1100632075,-1962934271,180510181,16973837,197120,196714,16711881,16973964,66350,16973952,66064,16973826,65819,16973828,66391,16973848,65635,16973869,66036,16973900,65629,196695,16712290,196738,16712172,196739,16712262,196741,16712216,1953300614,1167087646,518818645,1996478606,175570700,-16222465,-1070922122,3401808,-1962742397,1297948645,503318730,1430622296,-1910575989,209125336,-16091393,1996425334]},{"sector":17,"data":[112646,780368,-1962742397,1297948645,1426065610,-326898549,175570690,1342178744,28570,1973047296,-16777216,129501814,-6664192,1342177535,16777114,108954368,-385649408,1996423449,440330,15112784,1996423168,291676426,199231033,-526318211,-1593578741,-1588588190,104403300,92081122,-351542623,291807491,291676496,199231033,-526318210,-1593578741,-1588588190,104403300,92146658,-351542623,291807491,24156752,1996423168,899082,28088912,2122514432,745799684,-1710590209,65535,-1710590209,65535,-1191295351,-1706033136,65535,209567755,-1207273729,-1706033151,396,-1710590209,65535,-1593149697,104402042,92081120,-351543135,209363203,209494352,199362105,-492763779,-1593578741,-1588589444,104402042,92146656,-351543135,209363203,209494352,199362105,-492763778,-1593578741,-1706029956,508,-1710590209,65535,294531,-873921675,175570688,-1694599425,65535,-1710590209,65535,-2097105431,1946159230,11331843,-1207273729,-1706033146,65535,-1593149697,104403298,92081120,-351543135,291676419,291807568,199362105,-492763779,-1593578741,-1588588188,104403298,92146656,-351543135,291676419,291807568,199362105,-492763778,-1593578741,-1706028700,588,-1593149697,104402042,92081120,-351543135,209363203,209494352,199362105,-492763779,-1593578741,-1588589444,104402042,92146656,-351543135,209363203,209494352]}],[{"sector":1,"data":[199362105,-492763778,-1593578741,-1706029956,65535,-1034033781,50334474,50399233,50358784,16848897,50332160,16812545,50332672,16833025,50337792,16802561,50343168,16841729,50351104,16801025,50353920,-16673792,50364928,-16714752,50365184,-16680960,50365696,-16703488,1828750848,1167087646,518818645,-326903666,175570696,1342179000,47002,142508800,-2091748352,361022,-6680449,-16776961,-15998922,-385097162,-2103377701,-773795579,335938528,370576145,-129595119,-371063,1589906038,2013210360,2013210364,9804542,1996423168,2050424586,2083979020,10852876,-1511456768,92446976,-523116335,286524931,286660235,-1980217719,1996487254,-128007158,-59244762,-25690330,59290,175570688,291649279,291780351,63386,108954368,-15436800,230165110,-6664192,-16776961,-6681994,-1593835265,-523172478,100917457,378212628,1183387926,-94991880,-1005947137,-14223266,-14222217,-6619529,-16776961,922684022,922684538,-6681476,-2097151745,1946158718,175570709,16777114,2050424576,2083979020,-26100,-310181888,535137026,147475805,16973831,65557,16973828,65642,16973843,65626,196628,16711719,196682,16711954,196740,16711941,196741,16711871,1953300614,1167087646,518818645,1996478606,175570700,-16222465,-1070922122,3401808,-1962742397,1297948645,503318730,1430622296,-1910575989]},{"sector":2,"data":[209125336,-16091393,1996425334,112646,780368,-1962742397,1297948645,1426065610,-326898549,175570690,1342178744,28570,1973047296,-16777216,129501814,-6664192,1342177535,16777114,108954368,-385649408,1996423446,440330,15112784,1996423168,291676426,199231033,-526318211,-1593578741,-1588588190,104403300,92081122,-351542623,291807491,291676496,199231033,-526318210,-1593578741,-1588588190,104403300,92146658,-351542623,291807491,24156752,1996423168,899082,27892304,1996423168,-26102,2122514432,745799684,-1710590209,65535,-1710590209,65535,-1191295351,-1706033136,65535,209567755,-1207273729,-1706033151,385,-1593149697,104402042,92081120,-351543135,209363203,209494352,199362105,-492763779,-1593578741,-1588589444,104402042,92146656,-351543135,209363203,209494352,199362105,-492763778,-1593578741,-1706029956,505,294531,1996428148,-25755894,16777114,175570688,16777114,175570688,16777114,11921664,556675,-1394015372,175570688,1342179000,16777114,175570688,957440673,2097930246,199270661,1654719467,1688293393,-502908655,-1593475829,65735650,1343317153,957440673,2114707462,199270661,1654719467,1688293393,-502908655,-1593475573,65735650,1343317153,149914,175570688,957119137,2097930246,199270661,2057372651,2090946572,-502908660,-1593475829,65735650,1342995617,957119137,2114707462,199270661]},{"sector":3,"data":[2057372651,2090946572,-502908660,-1593475573,65735650,1342995617,16777114,1575324416,723650,17826051,6946819,18874627,131073,9044227,262145,6488323,2949121,17039619,4980737,6095107,5701633,25755651,8519935,16515075,8585471,26279939,8716543,15597571,8782079,14286851,8847615,1167087646,518818645,-326903666,-526297574,2047224587,-96040692,722199201,-1995670522,2122577990,528351482,66733707,51222534,990671878,2114711046,200188174,208930347,228066859,-1946532215,100923974,-1073017740,1956710525,-1982269684,2122578502,528351480,66602635,51225606,990674438,2114741766,208052494,209585707,228853291,-1946663287,100923462,-1073017730,2124482685,-1982269684,922744902,-6680958,-1996488449,2122575430,812908550,-92864688,-1694992641,65535,722106111,-11513664,-15886282,-15883210,1347481206,-1174396744,1347551436,89242,20572416,556675,820577140,-92372223,-955023872,63046,-1980086645,-1734219194,-96064755,1187452139,-1962934038,-654837178,-1946794359,100923974,1183387032,-125926412,-955023872,62022,-1980217717,-1532893626,-129619187,1187452139,-1962934042,-654837690,-1947056503,100923462,1183387044,175570928,-624897,1996485238,1996443892,-361299986,-1192855809,-860225504,-1706012160,65535,722106111,-6664000,1342177535,16777114,-125926656,-1593278976,1177226660,721611768,-62486080]},{"sector":4,"data":[-134723957,-1012776,-1070921098,-59310256,228079359,2096645689,-129594619,-963968277,2209872,1375793338,34183760,2122514432,142475514,722311329,49019462,1183432747,-125926424,721714688,-1962742848,-62486074,-16091393,-2091849610,2080438910,-96040187,1183516139,1356396538,16285315,1183516028,-1962742792,-1542550586,1372072717,-1174396488,1347551472,16777114,-294191360,16777114,-310157824,535137026,147475805,196615,16711831,16973851,65966,16973853,65741,16973858,65901,196653,16711852,16973894,66065,16973892,65895,1953300567,1167087646,518818645,-326903666,175570692,1342180792,35994,108954368,-13208576,-1801844106,-16777216,922684022,922685794,-1533406876,-16777216,922684022,922684538,-1264972676,-16777216,922684022,922684384,-1763111966,142508800,-385649664,1654718618,2047228177,-1593019124,104403300,58002556,-2097117719,349246,922701428,-6680958,-1996488449,-1202652090,-1706033139,65535,-1694730497,204,-231681,-15637962,-1710136266,220,-231681,-15959498,-1710457802,236,-1694730497,244,-1694730497,65535,-1710590209,65535,-16091393,-15637962,-1710136266,65535,-16091393,-15959498,-1710457802,65535,-1710590209,65535,-1962742397,1297948645,461002,1376515,262145,8323075,1769727,4391171,1245185,3342595,1310721,12845315]},{"sector":5,"data":[4456449,12320771,8716543,2293763,8782079,1167087646,518818645,-326903666,1748927236,57999365,-2097112343,1946159230,-1908998282,-26100,1183383552,229030140,922701854,922684386,-6681632,184549631,-13732672,-526254986,-1509545205,-1588576243,103484386,1346375080,16777114,1958873856,-59310320,29082,175570688,-351946776,-59310286,16777114,209125120,134810,1996443648,43031050,-6684672,-956301057,354310,-2095125760,1946158718,1778829072,-251,244320886,-351769368,175570711,-351910680,209125135,-16091393,1996425334,780294,-1962742397,1297948645,1426065610,1996483723,440328,-26032,2122514432,1584660484,-16222465,-15637962,-1710136266,364,-16222465,-15959498,-1710457802,268,-16222465,-15998922,-1710497226,380,209336063,209467135,100762,142016256,1342178744,16777114,-6664192,-1711275777,65535,-1710721281,65535,2122534891,175374342,199243519,199374591,1654733547,2047228177,-1593215732,104403300,762580092,-16222465,-15637962,-1710136266,65535,-16222465,-15959498,-1710457802,65535,209336063,209467135,16777114,108954368,-1592626176,-1499263878,-1432141811,209494285,-351426397,209363250,228984377,-1499265666,-1592923379,104402042,75435434,229286720,957119649,2114824198,229155589,2090929643,-1408878324,1074036493,-2096255837,1946158206,175570697,-402098433,-443875322]},{"sector":6,"data":[574045,-2081649835,-1432285460,-1509545203,196518669,722316449,-1559386106,1996426168,42441222,-1706033152,65535,90834631,-1230897153,1346387979,1074509985,28856384,726683648,-1706012480,593,-1593012573,1077939126,196649296,-1202700224,1347420161,1347469355,16777114,291545856,210648707,184841216,-2093386304,822846,922683764,2140802190,-2097151998,1138750,922683764,-6680224,-16776961,-6683018,1342177535,-1710983425,65535,209050,44624128,243414783,175514,-230258432,210646783,178586,-196704000,291518207,417434,-163149568,737441535,-107327296,1342177282,196506,-193528064,1347469355,1074509473,-1197387712,1346387979,-1174396488,1347551472,16777114,-193528064,1342179256,199578,295325696,-16777213,79230070,-1835380736,1342177283,235674,-193528064,1208854177,229155152,1016746056,-16777213,949679222,-1711276031,65535,737441535,-1706012480,65535,-1191807233,1347420161,196491007,196622079,1358198527,2144336,1375784122,59152976,1996423168,112884,922701904,922684342,1996426168,-1506344974,-1472790771,8828941,1375792826,63871568,1996423168,309492,19241552,-1706033152,299,737441535,1347440832,-26032,1996423168,112884,922701904,922684342,1996426168,-1506344974,-1472790771,36091917,1375779770,66099792,1996423168,112884,922701904,922684342,1996426168,-1202695946,582615846]},{"sector":7,"data":[-1706012160,1142,-1913358593,-11470778,-16009674,-401885130,1183514948,-129615364,-571931778,-28931328,2130331193,13822211,737953419,-1556023226,1183517622,-96064514,196649792,1224230539,228984321,51226273,-1559513594,1183518122,100747514,-1465840216,-1207565555,229417739,-1191938305,1347420161,196491007,196622079,-755969,1996486774,2144506,1375784122,77503056,1996423168,112886,922701904,922684342,1996426168,-1506344974,-1472790771,2144269,1375784122,79731280,1996423168,112886,922701904,922684342,1996426168,-1202695948,-2001076026,-1706012160,1256,-887041,-15882698,-15882186,-16009674,-16009162,28898422,-1202696192,-289800058,-1706012160,65535,113711339,2998,196609735,-1499398144,229286669,-1559385951,1996426668,85105398,1996423168,85629684,1996423168,6396658,1996423168,-401698812,-2034760723,-1202708980,1344146854,344218,282638336,-1497870306,-1706025459,65535,-1034033781,-1957363708,82609132,-955752821,2097152583,-16365625,509951,71812989,1187512319,-385875458,1996423333,1354771210,1358853887,-828747696,-1996488699,-12714938,-1959561985,121178206,126419582,-1962385781,1194982470,-1996260092,1586168903,-28931320,2114078521,38242563,-1962385781,1194982982,-1996260090,1996424775,105286410,1996443712,1354771454,178256,-26032,1183383552,-49668,1586180980,2114402568,-1962440446,1183516766,71776764]},{"sector":8,"data":[1200161661,140413700,972965515,58589767,-1962784887,1183516766,105331198,1200161661,-28901626,-2096869633,2113930366,-11343613,-1034033781,-1957363704,116163564,1290276496,1095683,105421392,-1073020928,113707389,132458,-1207915799,-1706033135,65535,58507275,-956263191,17132038,-2110324992,107649550,1183383552,-1908998150,2267660,1183383552,1614217212,117348881,1183383552,-92864514,228996863,229127935,196491007,196622079,-1191414017,1347420161,-1174198600,1347551266,444826,-92864768,228996863,229127935,196491007,196622079,-1191282945,1347420161,-1174370632,1347551470,477594,-25755904,448922,-59310336,450970,-92864768,588186,-955847936,354822,1575324416,1426064066,-326898549,-2110324978,118135310,1183383552,-1908998158,118921740,1183383552,1614217204,153459217,1183383552,1782481918,57999877,1342223849,1342177720,-1237909680,-1204355317,-227082485,228996863,229127935,-1174387016,1347551334,486298,-25755904,1342177720,-1237909680,-1204355317,-193528053,-960999344,8960512,-1818603438,-16777209,922682486,922684838,922684840,922684342,1996426168,112894,1186484304,6732288,-1147514798,-16777209,28900982,-11513856,-16009674,-16009162,922743414,922684838,1186467240,6732288,10113106,-16777208,28900982,-11513856,-16009674,-16009162,1347482742,-1174354248,1240137864,-887041,-15882698,-15882186,-16009674]},{"sector":9,"data":[-16009162,28898422,-1202696192,582615846,-1706012160,2088,-887041,-15882698,-15882186,-16009674,-16009162,28900982,-1202696192,-289800058,-1706012160,2249,385238669,229029968,832196638,-1207959547,1344146854,722238113,1343316486,722238625,1343316998,16777114,-1505852672,243073037,-1499217877,-1241119987,229286667,-1734274069,-1442432755,-1559593459,103484842,-1499264074,-1472298227,243073037,-1465663445,-1207565555,229417739,-1532947477,-1408878323,-1559593459,103484844,-1465709640,74907405,228996863,229127935,196491007,196622079,-1191938305,1347420161,-1174198600,1347551266,586138,74907392,228996863,229127935,196491007,196622079,-1191282945,1347420161,-1174370632,1347551470,220826,-25755904,590234,-193528064,592282,-227082496,330394,1575324416,503317186,1430622296,-1910575989,82609112,210646783,172442,-62486272,-1207535873,-1706033150,711,47028816,1996423168,-1506345210,-1472790771,-1237909747,-1204355317,-59310325,1342177720,32094288,1375759034,167025232,1996423168,175020796,-310181888,535137026,46812509,-1873273344,-326412987,-2082959842,1048775404,2080376172,16443651,-150639455,91005912,504420536,229029968,932859934,-16777208,-1710325194,2488,-637303,-1710496714,2500,-375159,-1710137290,2512,-244087,-1710453194,2738,-506231,-1070859658,922701904,922684824,1996426660,-1202695946]},{"sector":10,"data":[-860225504,-1706012160,2588,-1191414017,1347420161,196491007,196622079,-624897,-15882698,-1207064522,-860225504,-1706012160,2622,-1191414017,1347420161,196491007,196622079,1358460671,13023312,1375766714,174496336,1996423168,-1506344970,-1472790771,-1237909747,-1204355317,-126419189,1342177720,8829008,1375792826,183081552,1996423168,175545080,1996423168,176069372,1996423168,176593658,1996423168,185834230,-310181888,535137026,516640093,1430622296,-1910575989,116163544,-722989424,108462078,1726484112,-1908998146,180263436,1183383552,1614217210,108435985,1183383552,108462076,228996863,229127935,196491007,196622079,-1191545089,1347420161,-1174387016,1347551334,723866,-59310336,1342177720,-1237909680,-1204355317,-92864757,1186484304,6732288,-1583722414,-16777210,463142006,-16777205,-778372490,-16777210,244319862,-2080510744,-443874579,-900899553,50338562,-16641024,50366464,-16569600,50366720,-16699392,50366976,50737665,50358784,-16608000,50367232,-16617728,50336512,16832001,50332672,17136385,50366208,-16143360,50338560,16982785,50334464,16841729,50336512,16837633,50336768,17016321,50338048,16968961,50339072,17392129,50340352,17381889,50343168,16921601,50343936,-16742656,50350592,50362625,50343424,17394177,50349056,16798977,50352896,17380353,50353920,50963201,50350592]},{"sector":11,"data":[50345729,50351104,50876673,50351360,-16743936,50363648,-16705280,1828750336,1167087646,518818645,1996478606,440330,4889168,2122514432,544538632,-16091393,-15998922,-1710497226,98,-16091393,-15637962,-1710136266,114,425603,1996428404,899082,-26032,1996423168,-26102,1996423168,-533266678,-499712245,-26101,1996423168,2050424586,2083979020,-26100,2122514432,141819910,-1710590209,65535,-1962742397,1297948645,329930,1179907,262145,3670275,1245185,2621699,1310721,8388611,8716543,5373955,8782079,1167087646,518818645,1048828046,1946158436,142508888,-1203997696,1344146854,199374591,199243519,16777114,1958742784,175570696,-352300824,209125187,147354,1996443648,-26102,-6684672,-956301057,353286,-2095650048,1946158718,1778829064,-335544571,175570711,-352096536,209125135,-16091393,1996425334,15656966,-1962742397,1297948645,1426065610,-326898549,-401698810,-526317136,-1509545205,167289613,722199201,-1559386106,-256374278,-11526647,-16123850,-1593181642,103484824,100863402,-1588589600,103484836,100863404,-1706030110,458,-1559386463,-1465841172,166634253,1342181560,62106,2109737728,1778829064,-352321019,1161331,-26032,-1073020928,113729661,66922,243414783,70042,-62486272,291518207,151194,-28931840,-231681,-15882698,-1592940490,103484842]},{"sector":12,"data":[-1588589146,103484844,-11530840,28900982,-1202696192,-860225504,-1706012160,65535,-1694599425,340,-1694730497,65535,113706731,1386,-1034033781,-1957363710,116163564,425603,1996425333,-401698808,-1497890466,-1588584947,104402042,92081120,-351543135,209363203,209494352,199362105,-492763779,-1593578741,-1588589444,104402042,92146656,-351543135,209363203,2090946624,-502908660,-1593475573,65735650,1074560161,-26032,1996423168,-401698808,2122514690,57999364,-1593773079,103484842,-1230828122,229417227,229115435,-1207191389,1344146566,504211128,34445904,-659030016,-1202708976,1344146854,16777114,196518144,-1588576192,1077939128,112720,-1070903216,-6664112,-1560280833,-1073016480,-1779891339,1778829056,-251,-6681994,1342177535,16777114,-2110324992,39492110,1183383552,1614217212,-26095,1183383552,28856574,-11513856,-16009674,-16009162,922745974,922684838,548933032,13416960,-1281732526,-16777212,-1070859146,-26032,-1706033152,749,-231681,-15882698,-15882186,-16009674,-1207191498,-256245727,-1706012160,839,-1694599425,708,-1694730497,332,1996425451,-401698808,-443875322,574045,1167087646,518818645,-326903666,108461828,180107007,247450,-62486272,1074636449,-1442432192,-1593082099,1077939624,229377595,1996430718,-1506345210,-1472790771,229286157,228984363,229417296,229115435,-16741655]},{"sector":13,"data":[922682998,922684838,-1432285784,-1509545203,28856333,1236815872,5945856,1855606866,-16777213,922682998,-1465840218,-1202700275,-1588592639,103484844,1212681640,4831312,1375754938,60201552,1996423168,229286150,-1465823160,-1202700275,-1588592639,103484844,1212681640,4831312,1375754938,62626384,1996423168,-1506345210,229417229,-1432268728,-1509545203,28856333,1236815872,5945856,-6664110,-16776961,1996424822,-25860,-310181888,535137026,46812509,-326413056,1461775491,166764886,209323577,2057373054,-1593578740,1183386096,167027198,2113816121,-28931323,-190774293,-28931831,956953249,2114747398,209494277,-224328725,-129595127,956954273,92141638,-336050549,167158019,-1577564535,1177094648,167420414,-1946663383,103546438,1183386092,-129594374,166594091,-1913239927,1343679558,-100609,1183578230,-1241119746,1183535115,-1207565320,-929411061,-16777216,-1710325194,1148,-1554807,-1710137290,261,-768375,244319350,-111128,1996424310,-294191124,737166987,-1957630906,1177285190,1996443886,112884,548950096,13416960,-1969598382,-2097151995,33909310,1183521396,-364475928,-1996208501,-1499339194,-465139443,-1995593567,384557638,-1980479861,1183574598,-431584792,31737543,-498678016,2122514433,92012794,-335919477,-96040187,104585463,58461110,-1962848023,-654838202,2122576011,92012790,-336181621,1002867458,2081142790,20179203,16154243]},{"sector":14,"data":[2122540148,75366646,132890667,66471563,-1995720698,1996487750,-1506344986,-1476001011,922701837,2122517430,92012790,-336181621,1002867458,2097920006,-159481073,-1962574848,132904518,65783435,1342945441,-1411329,1183573110,-62520350,2144336,1375784122,21273168,2122514432,57999610,-1962874391,-654838202,2122576011,92012790,-336181621,1002867458,1963702278,13428995,16416387,-1070922626,1183516651,-1241119750,-532248309,16154243,1183516030,721611766,-62486080,-134592885,-488488,1183573622,-1509555232,1183535117,-1476000772,2122534925,92012794,-335919477,1002932994,2097919494,-92372209,-1962574848,132905542,65783691,1342944929,16154243,1183516028,-1962742794,-1207551546,-2095677941,2080437886,-163149051,-963968277,-1197356917,-339662069,1354771202,-1947568385,1174660166,1183535328,-62520350,-14881968,922740342,922684838,922684840,922684342,1996426168,-461963286,-1193117953,-860225504,-1706012160,1864,504211128,-330920624,-23441386,-16777215,244319350,-245272,-1550125962,-16777210,144369782,-1962934264,-324796858,-129594615,1577709219,1575324511,503317186,1430622296,-1910575989,283935704,1681818454,57999365,-1878949399,57075726,722315937,-1995594234,-1398670778,-1475990771,-163149555,-1995594079,-1465782202,-62486259,291518207,468890,-129595136,1090143883,1183535168,1346388214,1342177720,1354771280,36149840,1183383552,1958743028,-509980633]},{"sector":15,"data":[-1996488696,-1202654650,1347420161,-362753,1996486262,-1202695944,-860225504,-1706012160,1901,1324775051,-1191676161,1347420161,1459255039,1358460671,1342177976,-1174354248,1347551368,496026,-126419200,1342177720,1342177976,1459255039,-1191676161,1347420161,-1174354248,1347551368,506266,-92894464,-126419122,1342177720,1996445264,-126418954,1342177976,1342177720,-1174354248,1347551368,514714,-126419200,1342177976,1342177720,-159973546,1358460671,13023312,1375766714,134257232,2122514432,812908788,-1191676161,1347420161,-362753,1996486262,-1202695950,-1145437658,-1706012160,2112,-1695385857,2128,-1695254785,65535,-1878624513,-88283122,-16353537,-15882698,-15882186,-16009674,-16009162,28899446,-1202696192,-860225504,-1706012160,2316,-1878624513,-91428850,-1694992641,2486,49120094,1562371467,182861,1167087646,518818645,-326903666,1681818386,57999365,-1878965271,29550606,856063619,1187457653,-1593835016,103484842,1183387046,-163133444,1187446785,-956300814,128070,722316449,-1995593722,686551110,33310407,229417216,229115435,-940030327,128582,32655047,229286144,228984363,-940292471,127046,-775804007,-297367048,291518207,653722,-96040704,-16743447,1996487286,-227082250,-231681,1996486774,-193527814,-1192200449,1723465798,-1706012160,2353,-362753,1996485750,-59310096,-493825,1996487286,-227082250]},{"sector":16,"data":[-1174387016,1347551334,611994,-92864768,-624897,1996485238,-126418948,-362753,1996485750,4634864,1375758010,161913424,2122514432,141898502,-899329,116125774,-637185,1325397070,-293698578,-385647616,1996488561,-401698808,1996486998,-1506345208,-1472790771,-1237909747,-1204355317,-92864757,1342177720,2144336,1375784122,170367568,1996423168,-401698808,1996486950,170892026,-310181888,535137026,80366941,-1873273344,-326412987,-2082959842,244319468,-16750616,244319862,-460312,-1497889162,-1706025459,65535,-1878624513,-119216114,291518207,290970,-62486272,112720,-1432268720,-1475990771,-1398714355,-1475990771,1996443661,112892,163074128,5618176,-2087038894,-16777214,-1130693514,-2097151998,-443874579,-900899553,1478361090,-1957345904,-661774612,-2096567165,355390,-840367236,91005184,1822677239,282638341,-1497870306,-1706025459,1675,243414783,687514,-129595136,199505663,690586,-96040704,291518207,458138,-62486272,737834751,-11513664,-15886282,-15883210,1347483766,-1174396744,1347551436,710042,-59310336,1342177720,-1237909680,-1204355317,-126419189,228996863,229127935,-1174396744,1347551436,425114,-126419200,-1705983957,654,43293264,1996423168,-1506344968,-1472790771,-1237909747,-1204355317,2209803,1375793338,45390416,1996423168,186030844,1996423168,186555130,1996423168,110861048,-310181888,535137026]},{"sector":17,"data":[298536285,-587136256,1778385664,1157628672,-1895760126,268436224,318832392,1895826176,453050122,100729600,486539531,-1392442624,570425610,-436141312,754974986,436273920,805306631,1191183104,1241579264,956367616,771752704,234947328,1140850955,-536804608,1459618058,1728119552,1207960324,1744896768,1241514762,620823296,1275069184,-402586880,1375732489,1107297024,2097217280,1937009920,1167087646,518818645,2122569870,1282670598,-1710590209,65535,-16091393,-15959498,-1710457802,65535,276087307,-16091393,-15959498,722238518,317411520,-16091393,-15959498,-1207141322,-4521985,-1706012160,65535,-1710590209,65535,-1962742397,1297948645,264394,5243139,1638401,2359555,5439489,5767171,8519935,1310723,8585471,1167087646,518818645,-326903666,-2110324988,-26098,1183383552,142509052,1343583232,209336063,209467135,16777114,228369152,228464265,185441441,1947049478,175570708,1342177720,22938,-59310336,-352321096,175570706,1342181560,26010,-59310336,1342181560,16777114,142508800,-11635712,922684022,922684538,-1667167108,-1643771123,721777677,116103616,-1157627976,1347551487,47002,-59310336,209336063,209467135,185441441,1947049478,-1715459323,-4716821,16759551,-6664110,-352321281,175570752,291649279,291780351,59802,175570688,209336063,209467135,63898,-59310336,291649279,291780351]}],[{"sector":1,"data":[16777114,-59310336,209336063,209467135,16777114,-59310336,16777114,49120000,1562371467,118016589,1157694208,67109120,301990656,453050112,-654245120,318767360,-922680576,335544576,-1862204672,520093952,16843520,1140850945,687932160,1392509184,1937009920,1167087646,518818645,-326903666,175570698,1342179000,43674,175570688,1342179256,220314,1654280192,-2097151997,559678,166265727,142508801,-11504640,922684022,922684296,1352272778,-16777215,922684022,922684302,1620708240,-1207959551,787939330,-2002580600,178187,193605367,-1207203165,787939330,-1901917298,178187,193998583,-955543389,820230,-15602944,-1430779274,-11526642,-1710455754,298,425603,1996428404,899082,55614032,1996423168,50436618,2057371648,-1981755124,2090989126,-1981755124,-2002651066,-1912208629,-1037330165,1317796049,-1983370250,-1969095602,-1878654197,-1037330165,1317796049,-1983370248,1183578702,-163184132,1174520203,-2079930376,-16777204,-16021450,-401896906,-2001206903,1183666187,-1900523274,112742411,-1410838528,175570688,504277688,-2076770480,-26100,2122514432,1853095942,-1710590209,809,2122540267,544538632,-16091393,-15998922,-1710497226,368,-16091393,-15637962,-1710136266,384,-16091393,-15998922,-1710497226,785,-16091393,-15959498,-1710457802,801,425603,-526313356,193504011,-1559502175,2057374602,193897228]},{"sector":2,"data":[-1559462751,2122517392,359923718,143277699,-955744768,559622,-955847936,17336838,49120000,1562371467,576077,-2081649835,1448548076,294531,1586174325,-13107448,-1293417865,106859264,2013214719,11003906,-1962894103,931858526,-1962254709,63408959,-120504122,-1946532215,1586168391,38208264,-1980182208,1586232390,-1995994362,-972821946,-1980182208,1586229830,38243080,50749067,-784334265,-196703752,-1947580789,65130958,1086784449,-772222656,-330921480,-1962385781,-523173305,51011211,1586168391,38208262,-120504256,1183447249,175570926,1358579341,1357661837,1208239755,-11474864,1357661837,1358055053,-1962510593,1346896966,1593785832,1575324511,1426065602,-1957237621,-784333242,105286136,1074022027,1183447249,-2076278012,443809804,209991307,-422378831,956712587,1963894404,71731977,245924921,1048650356,8457348,117376125,915082372,45157508,1183573715,-1501263610,71731982,245925001,1575324510,503317698,1430622296,-1910575989,108462040,16777114,108461824,193476351,193607423,225946,108461824,193869567,194000639,230042,108461824,16777114,-1979267328,-2097151992,-443874579,-900899553,1478361090,-1957345904,-661774612,-1207535873,-1706033146,65535,-1207535873,-1706033145,65535,-26032,1996423168,-2009661690,-1976107253,-26101,1996423168,-1908998394,-1875443957,-26101,-310181888,535137026,46812509,16973832,65557,16973828]},{"sector":3,"data":[65623,16973843,65607,16973844,65688,16973861,65575,16973869,65569,196695,16711992,196741,16711858,1953300614,1167087646,518818645,-326903666,-2091493622,1946159230,1095719,-26032,-1073020928,113708669,61410268,199100103,216727720,198969031,113706826,12061662,722238113,-1995349498,-1072956346,-654899843,-1577302391,103484540,1183388004,2109737978,-1982269691,117439046,1048774796,2130839692,142508818,-2096335616,2130902142,-92372218,-955875838,560134,-1942060288,57933832,-16735511,-1710361546,160,-506231,-1710325194,65535,1358317193,16777114,-159973632,-1962116447,-787410418,1354836985,-1962115935,-787392498,1354836985,286406399,290993919,737703679,-11513664,-15999434,-1710498762,285,-1695123713,65535,209467019,-787392351,-1947194376,-1593017794,-120516334,1996486699,-11118838,-15658442,-15640522,1448605302,-1174396744,1347551436,16777114,-159973632,77210,-126419200,16777114,-2090902016,-443874579,-900899553,50333192,50338305,50358784,-16739328,50338560,16834561,50340352,16852225,50349056,-16717824,50364928,-16733952,1828750080,1167087646,518818645,-326903666,108954374,-385649408,113705198,2180,143132359,45613056,414732288,143041280,-773795431,-1706011950,73,-1207199581,-1202716670,-2103246592,1347590408,16777114,282501888,194526851,184841216]},{"sector":4,"data":[-2093713984,759870,922683764,2006584216,-2097152000,1103422,922683764,1520046294,-956301311,558598,-2113485056,-956301304,246278,-948573440,17023494,-1741226240,45718027,1183383552,-61437446,737828548,126428864,38242598,194524927,186522,175570688,110234,209125120,-1202667477,-11534334,-1710334410,449,-1559502687,-593293042,199401738,-1559162717,922684126,103485710,-1706029472,485,-1710459137,493,-1710590209,457,-1962742397,1297948645,503318730,1430622296,-1910575989,82609112,63061635,-11373568,-1710325194,65535,737953417,1996443840,-401698564,1996423362,-25860,113704960,962,-1710852353,401,104090,-1741226240,23304715,922681344,-6680362,721420543,142910400,-1559721821,-2036135806,49120008,1562371467,182861,1167087646,518818645,-326903666,108461828,16777114,-26112,1048772608,1946158018,108461904,16777114,-62486272,34904656,1996423168,1354771206,1342177976,241055487,16777114,-59310336,152474,108461824,-1694730497,65535,286144255,722538657,1343119366,16777114,108461824,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,-1036090620,1198784515,-1710852353,65535,143146627,-2093974016,1946159230,142016265,-402229505,1187448183,-352321284,142016274,-16353537,-1070859146,38791248,-1577302273,1178142856,-1671940,-6683018,-2097151745]},{"sector":5,"data":[-443874579,-900899553,-1957363708,82609132,-2009169066,108331016,143132359,-2002714623,104546312,628885638,194524927,143001219,143040792,-773795431,-1202695470,-1706033150,786,91602955,143011459,143171864,104546368,746522758,143132415,194524927,16777114,-62486272,-1946265975,-787969994,-60898074,-29324506,-16742106,-1710516170,65535,1575324510,-326412861,1443425411,143146627,-955878144,17336326,142778624,142870073,922690172,109056214,-1593767805,1385760898,178256,-26032,-1073020928,780207733,16779394,1074300065,142739003,117394815,922683524,1117391768,-1996488701,1451883590,-701038594,62691856,1183383552,-94991880,-1577290044,-523171704,-1960382461,83830300,-1963428156,-2010774458,-701038848,57907728,922681344,-208008296,1577058307,-1017256565,1167087646,518818645,-326903666,1996445192,21797390,1996423168,12425740,-823590912,106873856,637945599,1183319946,1963474168,-2009169051,58654728,-16730903,-1710516170,1183,-1980086647,915143766,-422508408,653942468,958791819,108396096,143134463,1589907691,-2009691142,652661000,251595007,922683524,-1248195688,-16777216,1996426870,-2009169140,108920840,1208518817,-1070923029,112720,2122339819,678759928,-1577170968,245566432,143171857,2016343880,-502922484,286302987,286144255,241174059,15768144,736821248,-1728559478,-956829557,527761376,-23992234,-16595837,1996426870]},{"sector":6,"data":[143171852,1048793160,1968638080,1354771368,-16766744,2122517070,58458122,-55575,10095734,-16777215,-124121482,1577058304,-1962742397,1297948645,1426066122,-326898549,922703412,-1365636200,-1996488700,1451883078,-701038596,10131984,1183383552,-363427352,-150583669,51148846,722132486,-1995546618,1988886086,-991506170,-1960379810,-398064896,-1981131125,1451879494,9119470,37763366,1996435060,1996444168,1217079020,1372072706,16777114,-465139456,-1578740087,-523170398,1183576203,-1983511580,-1031015354,149669379,16008903,209232128,-2081405303,1962935422,-2143386866,125065224,228736643,-2095549440,1946159742,142016274,738084491,1343070726,209204991,-2096978712,1409532990,-593424523,-532248310,66340491,-351609850,-1002536141,427119875,-1712044405,-120470997,-593366901,-1983501558,-593371066,-339344630,-1002536173,259347971,722132129,1183446086,182231520,-2081274231,1460174910,1996425333,178184,1996424939,112648,101685840,1048772608,1962937762,24832259,142622339,-2094566057,1946215550,142016289,-1948223745,103546438,-11530846,1996485750,6469872,1375797178,-26032,1996423168,-26104,1183383552,-128546314,-1710721281,65535,-1948023,28838006,-6664192,-1962934017,-523172282,-1946532349,1183448150,-564753956,-1962379521,1346953286,-100609,1996484214,-597768980,38243110,1342647078,422810,105286400,1174659281,-61436934,-1982314871,1996479062]},{"sector":7,"data":[-532247800,1996443712,-294191106,-991136001,-1960388514,723911239,-1516613625,-1962934266,-523172282,-1946532349,1183448150,-698971692,-16222465,1183572086,-11517698,1996484214,-731986708,38243110,1342647078,448410,105286400,1174659281,-61436934,-1982839159,1996477014,-529072376,1224623755,-294191280,-991136001,-1960390562,723911239,-6664185,-16776961,1183516790,-128545802,-755511049,-6664110,-1962934017,-523172282,-1946532349,1183448150,-833189428,-16222465,1996480630,-294191106,-991136001,-1960391586,723911239,1721389063,-16777209,1996425334,-159973384,453530,142016256,-1696434433,1458,1183527147,65065222,1452014150,-599356932,-2206071,1996425334,-25755680,-1149185,1589963894,1200301788,120268290,104962640,1183514624,286172146,-150583669,51148846,-1559502330,922685712,103485710,-1706029472,1082,194524927,498330,-701038848,148806160,-1956773888,146955749,-326413056,-16061309,1183647350,-1706027272,65535,243414783,523930,-163149568,721712895,-11513664,-15886282,-15883210,1347483254,-1174396744,1347551436,533914,-159973632,535962,1575324416,1426064578,-326898549,-2110324990,161454606,1183383552,142016510,-11485141,922682998,1996426648,-25755900,108461904,-1174396744,1347551436,16777114,-25755904,673690,1575324416,503318210,1430622296,-1910575989,250381272,-230242474,113704960,2180,143132359,45613056]},{"sector":8,"data":[414732288,143041280,-773795431,-1706011950,2173,-1207199581,-1202716670,-2103246592,1347590408,13466,282501888,194526851,184841216,-2094041664,759870,922683764,-1415967848,-2097151992,1103422,922683764,1738150102,-956301312,558598,-2113485056,-385875960,922681487,-426112104,-1996488696,1451883078,-94452484,-1993949141,1200170503,-1741226238,153917963,1996423168,159488518,1183383552,-128546314,1589914859,-163119114,-2012771802,-1073023930,171714164,1508377973,-1978405895,-1952910266,-523831312,1443329279,-2080782616,1191117508,-226590222,-897835200,-1710852353,874,956859041,2114487302,142910211,1074301089,143001147,-2036267138,-2002565112,-310157816,535137026,46812509,-1873273344,-326412987,-2116514274,1442889964,194526851,-385649408,1048773899,1962938582,84011267,194524927,626842,-196704000,-633207,-1710172618,819,-1981921655,922738774,681185632,-1996488703,-1705969594,918,16402119,-230242560,1187446784,-352321306,-431584394,1174659281,-162100236,-11499895,-11364727,-11493692,641174310,1946318649,-126419145,-1948367221,-972824490,-1960423342,-970259897,83466832,-2037841920,-1769341096,-1566441638,-1948200691,1485212656,-1983511553,-1031017402,149669379,15484615,209232128,31999625,1183576646,-330941958,1183516286,-96040468,-1578744065,1178142856,-8225562,2073753718,-16777212,1050343542,-2097151999,-2096956858,-1593642426,1178144152]},{"sector":9,"data":[-1593278470,1178144164,-1590395150,1183387032,228893178,-899447,-2037578122,-1202651300,-1202716544,726663204,-6664000,503316735,280148048,817385502,-6664192,-1593835265,1178143670,-1593281030,1178143672,-1958841102,1078000198,-230257840,-1202700224,1347420161,1347469355,16777114,-364476160,292864011,291518207,16777114,-364475648,-351182685,196518156,-1577433463,1183386552,1614217202,227777041,1183383552,-1466281736,-16777207,-1070860170,-26032,-1706033152,65535,737703679,-1957670720,1078000198,-230257840,-1202700224,-256245727,-1706012160,1514,-1694992641,1522,-1980873079,1187508310,-956300548,58950,-1962797847,-523114938,-1946925565,-2037778858,-1769341104,-1631256750,-1960378544,-565802185,65033867,-498693690,652498569,1946318649,-126419153,-1960423342,-970259897,166894160,-2037841920,-1769341096,-1566441638,-1948200691,1485212656,-1983511553,-1031017402,149669379,15484615,209232128,-2081929591,1409532990,-2033776523,196436,1048782827,1968505796,-96040179,-1712568789,-120470997,1048776171,1968571332,-96040180,1089226283,1418103104,-1572961281,57999373,-16699415,28899446,882528256,-16777209,1996486774,-294191120,847258,-431584512,1174659281,-162100236,-11499895,-11364727,-1946650881,1224692870,-59310256,-1804545,-1631264138,-1960378544,723911239,1838829575,-1962934260,-523114938,-1946925565,-2037778858,-1769341108,1996488526,1418103800,-11517697]},{"sector":10,"data":[1996487798,-495517724,-11755836,38243110,1342647078,828314,-431584512,1174659281,-162100236,-12024183,-11889015,-493825,-1946200906,1346960454,-1804545,-1631264138,-1960378552,723911239,-644198393,-1962934260,-523114938,-1946925565,-2037778858,-1769341116,1996488518,1421279224,-62485505,1996443712,-495517724,-12280124,38243110,1342647078,871066,-126419200,-1947318645,-789057450,1347605239,469402,-431584512,1174659281,-162100236,-12548471,-12413303,-493825,-43850,1996487798,-495517724,-12542268,1183524843,65065446,1452012614,1350994422,1385597439,-126418945,-11225345,-231681,1996481654,1352582370,1200301823,120268290,119249488,1191116800,-398029850,-1577302527,1178142856,-385647130,1996488161,171940600,1996423168,242260728,922681344,-2137386794,-16777203,-1710516170,1937,90979971,-385647360,922681583,-1600516478,-1996488691,-43386,-1710137290,1981,-506231,-1516632458,-1996488703,-11477946,-15882698,-15882186,-16009674,-16009162,-43338,-15882698,-1207064522,-860225504,-1706012160,3669,-1543879029,1183517622,196649970,51226273,722315782,-1727285754,-120470997,-1592940893,100863400,103484844,731450296,-1543974462,-1499394648,-1241119987,229286667,51226785,-1559513082,-2034758228,-1202708980,1344146854,16777114,-596181248,228996863,229127935,196491007,196622079,-1191676161,1347420161,-1174396744,1347551436,516506]},{"sector":11,"data":[-596181248,16777114,108461824,-1696827649,468,-1694992641,3705,-11094273,518554,-310157824,535137026,46812509,196641,16715110,196749,16714483,16973966,68595,196610,16714445,16973843,68609,196617,16714474,16973851,199315,16973825,133224,16973839,131736,16973840,133275,16973841,133315,16973842,134519,16973843,68388,16973853,68663,16973857,69080,196642,16714371,16973884,68356,16973869,68285,16973872,198580,16973857,196816,16973987,196945,16973988,198536,16973989,197518,16973990,197763,196775,16715357,16973896,68974,16973892,67072,16973900,200107,16973890,200296,16973892,68350,16973911,68396,16973914,200237,16973898,68478,1953300571,-2115204267,-1962894100,212012102,280514577,-1706025472,65535,-15816541,-1206842314,1344143382,13978,63742720,-1202667477,1385791234,-26032,-928841728,-6664189,-1711275777,65535,-16222465,-6683018,-1962934017,1175127622,-1206881272,1344144462,-16222465,-6683018,-1207959297,1344146114,16777114,-28931840,1685372939,243416707,-16157696,-1710325194,152,199507587,-16157696,-1710496714,168,179977859,-16157696,-1710573002,65535,16777114,204930816,-26095,20774912,-1710918400,65535]},{"sector":12,"data":[-1202667477,1344146866,504410808,3192912,-26032,1183514624,40888830,687747,922688373,-6680308,184549631,-1207011904,1344146114,1342177720,70810,-26112,-1073020928,-1028125067,-1202708982,-1706033151,65535,-10189171,716722198,-1706025458,103,184960651,158599238,637951684,1962950528,1686539533,-1202710785,1344146148,-2037576469,1343684452,-16222465,-6683018,-1207959297,1344145420,-10189171,-1070903274,1375784122,-1202696112,1347420260,1347469355,286013183,-6664112,-1996488449,-6620602,-2097151745,1962936958,204930849,-26095,-1073020928,837354356,180533249,28856350,-40218624,-385875968,1996423456,211073034,178256,30054992,1996423168,243709962,178256,31103568,1996423168,228636682,178256,32152144,1996423168,234141706,178256,33200720,1996423168,180140042,178256,34249296,1996423168,208582666,178256,35297872,1996423168,240302090,178256,-26032,1996423168,234403850,3323984,37395024,1996423168,200456202,5290064,38443600,1996423168,181975050,178256,39492176,1996423168,198883338,178256,40540752,1996423168,234272778,178256,41589328,1996423168,239908874,178256,42637904,1996423168,196392970,178256,43686480,1996423168,291289098,178256,44735056,1996423168,171227146,178256,45783632,1996423168,286439434,178256,29006416,1996423168,291026954]},{"sector":13,"data":[178256,36346448,-6684672,-1711275777,65535,16777114,-92864768,-1710983425,65535,-1694861569,65535,385238669,-26032,1183514624,-11517706,-6621066,-352321281,-92864719,245905151,384059021,-26032,-1073020928,1183652981,-397404444,1183645743,-1706027292,65535,384059021,-26032,1183645696,726669028,1347440832,16777114,1975520000,-1950340164,180510181,-326413056,2050917206,779354117,637820612,909719435,108266874,92026425,1589910645,2139170308,1946222850,2139170312,1962999810,73319433,637892769,-1956771959,79846885,-1864856576,-326412987,1473809950,106349830,-1274380604,1931595094,-18426,865076203,-2090924096,-443874579,-900899553,-661913592,-1957345904,-661774612,139904286,-1274657141,1931595069,-18429,49120031,1562371467,445005,1167120524,518818645,-987834226,1317734486,-851659770,-1207733471,-2095054849,-443874579,-900899553,-661913594,-1957345904,-661774612,-1274650997,1931595070,-18426,865076203,49120192,1562371467,182861,1167120524,518818645,1455806606,-851332090,-1207536863,65798143,-2084555888,-443874579,-900899553,-661913596,-1957345904,-661774612,-1274650997,1931595077,-18429,-1962742397,1297948645,-1946156342,1430622424,-1910575989,1586175704,139904268,-1274655093,1931595071,-18429,49120031,1562371467,576077,1167120524,518818645,-1960912754,1455754334,105810696,567099572,-4717709,-310173697]},{"sector":14,"data":[535137026,147475805,-1864856576,-326412987,114855454,-1005822325,-1047787434,-1274657141,1931595074,-18428,-310179943,535137026,147475805,-1864856576,-326412987,-1260876258,69324057,-310142911,535137026,516640093,1430622296,-1910575989,142016472,-16353537,1996426358,48621578,-1962742397,1297948645,503318730,1430622296,-1910575989,142016472,-16353537,1996426358,35710986,-1962742397,1297948645,2250,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,-1643722965,-1996488696,1460178958,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-96147449,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,1527,-1017256565,-1192457387,-1957691328,1861682246,781864966,-1962934266,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,1597,-1017256565,736922453,1996443840,-26108,-443875328,-1957313699,74907628,16777114,1575324416,-326412861,-1710983425,1702,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114]},{"sector":15,"data":[-402345728,-443874901,-289684643,-184844024,1393062664,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1074315919,-1007912629,567095476,-1022843741,144574094,741772070,889239552,512303565,109840530,521013396,-1171980104,567084416,-468808906,908256008,149292741,-617358708,-501285066,-385649912,-986251703,-1945572858,244698,-501285066,-1021372920,855643321,-1031276837,74711304,567099060,-1007492541,-387151019,1996423504,18147332,-1017256565,1475119957,-13413546,184960651,-149783104,72780759,-621291273,-1996488675,1451820614,172395268,310231051,1452005367,-136775928,7642,-1995815287,-1073018794,1317738101,105286408,-235417037,1183570059,-1947076860,-1875055661,1317787787,106334984,-788248949,-774254101,198758890,-134973989,871402481,-11513134,1996425846,14477320,1996903995,990409223,58065990,855764611,197561298,-150506241,-2082932774,1583022298,146955615,-326413056,-617392553,184960651,-149783104,72780755,-621291273,-1996488675,1451820614,172395268,310231051,1452004343,-136775928,7642,-1995815287,1317734486,-1948125436,138841080,-503844725,-141100541,-134019482,-963913845,125098763,-654845193,1577114243,146955615,-470994432,-773140218,-1006968104,-387151019,1021837416,1961102077,75399178,-972786432,519963718,143791813,-853213000,243998497,132319460,-16776517,-1962352098,1286865990,-189062707,-184844024,1393062664,1130043391]},{"sector":16,"data":[-1007490237,1458342741,-1962260853,-503905202,1183570059,-135230712,-1764097055,50751223,-1949070376,-1034068282,-189071352,-151289592,1393062664,1130043391,-1007490237,16973867,197445,196716,16711748,196624,16711872,16973841,197420,196721,16711853,16973842,197430,196722,16711816,196627,16712067,196628,16711938,196629,16711915,196630,16712082,196631,16712409,196632,16712404,16973849,132488,196609,16712399,16973850,197356,16973948,132576,16973829,132621,16973830,132636,16973831,196822,16973825,132684,16973834,198065,16973829,132708,16973839,132735,16973841,132759,16973844,197366,16973841,132801,16973849,132523,16973854,131254,16973872,196987,16973865,197348,16973866,196645,16973997,131786,16973878,131185,16973879,131495,16973880,196628,16974001,197398,16974002,196671,16973893,197379,16973894,131151,16973903,131364,16973912,131411,16973913,132493,1953300571,0,5,0,0,1701012321,1869480044,1818324338,1969422336,1918987634,1660970353,1634497141,7304051,1953658211,7632997,1752331619,6581857,1886549347,1818455653,1920295680,1935766117,1969422437,1852402802,1969422437,1970430578,1660971123,1681093237]},{"sector":17,"data":[1920295680,1852399984,1969422452,1819308914,1660972649,1886614133,7954802,1668445539,1936945010,-1114112,-524355,-8650786,-4325393,-9,-1,-1,-1,-3342337,-13369498,-3342439,-13369498,2031513,3145767,4194360,5374025,6488154,7471209,8650875,0,0,0,0,-1,-1,-1,-1,34952,8738,34952,8738,-32897,-2057,-32897,-2057,572688520,572688520,572688520,572688520,-34953,-8739,-34953,-8739,-1431677611,-1431677611,-1431677611,-1431677611,-572688521,-572688521,-572688521,-572688521,43690,43690,43690,43690,-43691,-43691,-43691,-43691,858993459,858993459,858993459,858993459,65535,65535,65535,65535,286361736,1145315874,286361736,1145315874,-286361737,-1145315875,-286361737,-1145315875,1061109567,1061109567,1061109567,1061109567,-65279,-1,-65536,-1,-808497586,-454755076,1061103399,1920136179,-50561410,-202114567,-808458265,1061134239,-269516929,-538968579,-134742274,-67387457,-52429,-49345,-52429,-49345,2004287488,2004318071,2004287488,2004318071,1061093376,1061109567,1061109567,1061109567,-202178560,-202116109,1061093376,1061109567,-505285645,505334988,2122202943,-101057284,-49345,-1,-49345,-1]}]],[[{"sector":1,"data":[-65536,960068732,-943221869,-4113,-1616953537,-12337,-202114567,-6169,-2021142577,-52429,-50528257,859011192,-1718010820,-1717976125,2088516668,2088566012,2071723260,-808470601,-33688589,-16843010,-1953820913,-1195844131,-387420048,-1903239715,1044266558,-1044276068,-471604253,471648713,-909566948,-471604253,-1667448383,1044266558,-538972177,1431677867,-33751040,-134743045,1987479688,1886417008,1734838408,252645135,-134742017,-707400725,-707417430,-134747157,-134744073,-134744073,-134744073,-134744073,1852994915,7105653,1886152008,1698955264,1701013878,1767985152,1140880494,1667855973,1767309413,2003788910,1648427123,1349808751,1953393010,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,-65536,62521344,-65536,262144,24,84]},{"sector":2,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,0,1,0,0,-65536,0,0,0,0,0,0,589829,327685,327685,131074,-65534,-1,196607,131074,196611,-131069,-65538,262142,196611,262148,-196604,-131075,327677,262148,327685,-262139,-196612,393212,327685,65534,65534,131072,131072,2,2,-131072,-131072,65534,-3,131069,262143,196609,65539,-65533,-131070,-65538,-3,-4,131068,327679,262145,65540,-65532,-196606,-131074,-4,-65541,196603,393214,327682,131077,-131067,-262141]},{"sector":3,"data":[-196611,-65541,-65536,131072,131073,-65535,-65536,-131072,196608,196609,-131071,-131072,-196608,262144,262145,-196607,-196608,-262144,327680,327681,-262143,-262144,65534,131070,65537,1,65534,65533,131069,65538,2,65533,65532,131068,65539,3,65532,65531,131067,65540,4,65531,-2,131073,65538,-65537,-2,-65539,196610,131075,-131074,-65539,-131076,262147,196612,-196611,-131076,-196613,327684,262149,-262148,-196613,196606,-65535,-131072,131069,196606,262141,-131070,-196607,196604,262141,327676,-196605,-262142,262139,327676,393211,-262140,-327677,327674,393211,105645516,117180076,127665996,103286200,115869336,126355256,100926884,114558596,125044516,98567568,113247856,123733776,0,1886611812,7954796,1953784144,544109157,1953064005,774504448,5264205,1397587548,1412300880,20557,1852399952,1631780980,1935767150,1632632832,1953785196,1632632933,1768179060,1868169332,1968139631,1868169332,1850305903,0,1294871132,20563,1701603654,1852141647,1632632832,1299476073,1819632751,1766195301,1632855404,1933665654,1347636480]},{"sector":4,"data":[0,65535,1967259648,1852798068,1953841664,7237492,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,115343360,117442296,1509196,62259203,5570815,61997059,5636351,61734915,5701887,61472771,5767423,61210627,5832959,60948483,5898495,60686339,5964031,60424195,6029567,60162051,6095103,59899907,6160639,59637763,6226175,59375619,6291711,59113475,6357247,58851331,6422783,58589187,6488319,58327043,6553855,58064899,6619391,57802755,6684927,57540611,6750463,57278467,6815999,57016323,6881535,56754179,6947071,56492035,7012607,2004055149,1802398835,131331,2097152,262176,-65536,-2097153,-3145729,-3670017,-3932161,-4063233,-4128769,2143354879,1069613055,532742143,264306687,130088959,62980095,29425663,12648447,12648447,12648319,264306495,264306687,130088959,130285567,63438847,-2083520513,-2116026369,-1040187393,-1056964609,-520093697,-520093697,-251658369,-251658369,-129,-1,65535,0,0,0,0,524288,786432,917504,983040]},{"sector":5,"data":[-2146500608,-1072758784,-535887872,-267452416,-133234688,-66125824,-32571392,-1072758784,-1072758784,-536084480,1611137024,1879048192,805306368,939524096,402653184,469762048,201326592,234881024,100663296,117440512,0,0,0,1953300480,259,2097183,262176,-65536,-1,-1,-57346,-63492,-64520,-65040,-65040,-65056,-65088,-64640,-16840960,-50393344,-117489920,-251691264,-520093952,-1056964863,-2130706685,16776967,16711439,16580383,16318271,16318335,-1040973825,-1007157249,-941096961,267386879,1070399487,-3080193,-8126465,-7340033,-12582913,65535,0,0,0,49153,61443,63495,30720,14336,4111,32799,32831,32895,16777471,50331902,117440764,251658488,520093936,1056964832,2130706624,-16777088,-33488896,469762048,-670892032,-804847616,-1073283072,983040,786432,1048576,0,0,0,1953300480,983299,2097167,262176,-50397184,-50331649,-251658241,-251658433,-1056964801,-1056964849,16776975,16776963,16580355,16580352,15793920,15744768,12599040,12586752,3840,768,12583680,12586752,15732480,15744768,16531200,16580352,16776960,16776963,-1056964861,-1056964849,-251658481,-251658433,-50331841,-50331649,-1,-1,50397183]},{"sector":6,"data":[50331648,201326592,201326784,805306560,805306416,-1073741776,-1073741812,-66912244,-66912001,-66322177,-66273028,-63913732,-63950596,12595452,12585984,-63960064,-63950596,-66309892,-66273028,-66862852,-66912001,-1073741569,-1073741812,805306380,805306416,201326640,201326784,50331840,50331648,0,0,1953300480,1048835,2097174,262176,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,-536805376,-268337145,520126479,251658488,16777456,16777344,16777344,16777344,16777344,16777344,16777344,16777344,16777344,16777344,16777344,16777344,16777344,16777344,251658368,251658480,16777456,16777344,251658368,520093936,-268369672,-536772593,32775,0,1953300480,983299,2097167,262176,-65536,-1,-1,-1,-1,-1,1073741823,1073741811,-196621,-196612,-4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-196609,-196612,1073741820,1073741811,-13]},{"sector":7,"data":[-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,855834624,855834675,50331699,50331648,50528256,50528259,3,0,-268238848,-268238785,63,0,50528256,50528259,50331651,50331648,855834624,855834675,51,0,0,0,0,0,0,0,1953300480,983299,2097167,262176,-65536,-1,-1,-1,-1,-1,-1929379841,-1929379889,-65585,-65553,-458769,-458760,-262152,-262149,-458757,-458760,-262152,-262149,-458757,-458760,-65544,-65553,-1929379857,-1929379889,-49,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,201326592,201326784,-956301120,-956301300,117440524,117440512,117637120,196611,-268435453,-268435336,196728,117637123,117440515,117440512,-956301312,-956301300,201326604,201326784,192,0,0,0,0,0,0,0,1953300480,259,2097152,262176,-65536,-1,12648447,12583680,12583680,12583680,12583680,12583680,12583680,12583680,12583680,12583680,12583680,12583680,-64768,-1,-1]},{"sector":8,"data":[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,786691,2097165,262176,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,402653184,402653184,402653184,402653184,402653184,402653184,402653184,402653184,0,0,-2122383360,-2122383106,254,0,402653184,402653184,402653184,402653184,402653184,402653184,402653184,402653184,0,0,0,0,0,0,0,0,1953300480,1638659,2097181,262176,-65536,-1,-1,-1,-1,-1,-1,-1,16711679]},{"sector":9,"data":[16580381,15793934,14745345,12648192,8421127,8421135,12615455,14712639,15761279,33062911,66879487,134119423,268402687,-1073774593,-32769,-32769,-32769,-32769,-32769,-32769,-1,-1,-1,201392127,503316480,1056964608,1929379840,-520093568,-1073676096,-2147286816,458864,-15794120,-14745348,3145982,6324225,12615680,8388615,8388623,12582939,6291507,3145827,18350275,51118211,101056515,201523203,-1207894013,-268435453,3,3,3,3,1,32768,0,0,1953300480,259,2097152,262176,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,2,5439981,16842814]},{"sector":10,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-8454144,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,534839263,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268492832,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-1882718241,-4097,-524289,-67137537,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268449905]},{"sector":11,"data":[-1,67043319,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-408944673,-4097,-524289,-67127048,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268441697,-1,-18612233,-1217,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-65553,25161983,-1088425729,1056964800,396427231,-4097,-524289,-74453362,-1,-3,-257,2147483647,-12648193,-65,-117448705,-1048829,-251691012,-251723393,8437535,-2154752,-268494944,-1,-12583177,268368867,-194561,-16777217,-1,1073512447,-4194545,-536870913,-990721,2147352559,528478463,-1088421889,536801415,-2021523489,-4097,-117966337,-72303685,66848764,63741,-2130739712,2147418368,-1835023,117505727,-939532289,-1081348,-251707399,-57473,-267403489,-2158593,-268449913,-503316481,-7689,-1007092740,-100851204,2130640895,-117497857,-1605633,-121634823,-536886977,1073651711,-1074003985,528478463,-1088421889,-1879052257,662765535,-4097,-956857345,-70193426,-117906959,-1539,1073643262,2139094271,-196657,-117448257,1073733503,-1097729,-251682829,-57473,-251674849,-2097153,-268488816,268369919,-15369,-235668544,-100795143]},{"sector":12,"data":[2130640895,-16809988,-6324417,-943751170,-549454081,1073709054,-537395217,-8392449,-1073741825,-3841,-1882718241,-4097,-1057538056,-83836933,-51250717,-1667,-229634,2134900735,1073741631,-24641,-204897,-1081360,-251670553,-129,-251674625,-2097153,-268464185,-2031617,-62930697,-35390720,-109183245,2130640895,-4,-12615873,1069498367,-540016641,-4063236,-269484049,-8392449,-1073741825,-3841,-808845345,-4097,-990380157,-83824626,-17563677,-1667,-229634,2134900735,1073741631,-32834,-401433,-1048673,-251664433,-129,-251674625,-2097153,-268447799,-15728897,-1069300489,-1836288,-113377565,2130640895,-4,-12615873,2143174655,-538443777,-6291463,-136314897,-8392449,-1073741825,-3841,-808714273,-117444609,-1040711873,-83886064,-18350109,-1731,-229634,2134900735,1073741631,-32834,-401433,-1048625,-251661409,-129,-251674625,-2097153,-268447797,-7937,1098231,-1836288,-113377593,2130640895,-4,-12615873,2143174655,-538443777,-1572871,-71303185,-8392449,-1073741825,-3841,-808714273,-2080378881,-990380033,-83886012,-24117261,-1731,-229634,2134900735,1073741631,-49217,-401457,-1048589,-251659969,-129,-251674625,-2097153,-268447797,-61442,4506871,-918784,-113410530,2130640895,-4,-12615873,-1614856193]},{"sector":13,"data":[-543162369,-393219,-41943057,528478463,-1073741825,-3841,1338572767,1073278975,-1040711681,-83886064,2115960568,-1731,2147254014,2134900479,2147418015,-16789569,-204993,-17825796,-251659137,-57473,-251674849,-2097153,-268480552,-32,1098231,2096691968,-109233090,2130640895,-50380802,-3178625,-473956356,-545261313,2147418110,-16777489,528478463,-1088421889,-3841,264306655,-3936257,-990380033,-83886012,410910972,-1667,536837886,2147481855,-393241,-1052772161,2147409919,-51412994,-260047105,-57473,-251674849,-2097153,-268496960,-49,4506871,16710400,-117636865,2113929216,16810239,-950273,-20971549,-536934656,2147368959,-529,25161855,-1088425729,-3841,534904799,-4097,-1040711681,-83689456,-2113994241,-3,-257,2147483647,-15777796,-65,-1610620929,-118489092,-264306688,-251723393,-520110305,-2097281,-268492831,-1,1110519,-1265,-131073,-16777217,-1,16744447,-4194497,-536870913,-405505,-17,-8392449,-1073741825,-14712577,1072824287,-4097,-50855937,-79757244,-1,-3,-257,2147483647,-1,-65,-520101889,-1048829,-251658241,-129,-2130722817,-2097377,-268484623,-1,327671,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449]},{"sector":14,"data":[-1073741825,-1,2147024863,-4097,-524289,-67173440,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268468232,-1,267452407,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-196641,-4097,-524289,-67158020,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-52428801,-268435580,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,61695]},{"sector":15,"data":[0,0,0,0,0,0,0,0,0,0,0,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-15729409,-9,-1025,-134145,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1537,-33,-50335745,-524529,-67108865,872415231,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,535887743,-100679681,-2097153,-268435457,-15729409,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073806592,-3841,-33,-50335745,-524529,-67170308,-1,-3]},{"sector":16,"data":[-257,2147483647,-1,-65,-8193,-1048577,-251658241,-2146764673,-520110081,-2097281,-284172033,-11534849,1677262839,-117441537,-156671,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-260050689,-1082146726,-12599041,16777183,-33558781,-524465,-67143184,-1677592321,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658242,1349370239,16760703,-2097393,-274658562,-15729409,2095513591,150535167,-131327,-16777217,-1,16744447,-4194497,-536870913,-16516865,2147287023,-2088767233,-1086368659,-3841,720961503,-50335839,-524529,-75546929,-15790096,-3,-257,2147483647,-15785220,-65,-520101889,-1048768,-251691012,-1459911041,-251674817,-2097153,-284622608,-3146241,-1616904201,2145450815,-117574897,2113929216,16810239,-1997504513,-20971645,-536934656,2131804671,1073283055,-1887440641,-1086347013,-3841,-1427963937,-33558647,-524337,-73412801,-217055264,286390781,301956624,2147422225,-7763744,17955007,-1845501953,-1097968,-251674632,-587296897,-252199105,-2097154,-282481982,-15729409,-411042057,-253690929,-117571840,2118403140,1145324798,583171967,-457179360,-545307580,1061422335,536018927,-2021658369,-1086336834,2147414247,-1433731105,-50335965,-50856177,-68683265,2130764000,1145370877,1157398084,2134852676,2132943490,1145357503]},{"sector":17,"data":[1157553983,-1097916,-251715598,-1040743553,-255344833,-2146306,-274487286,-15729409,-50333193,-1007617177,-100843620,2114982161,286331388,-2012709057,-1849737336,-551612143,2131759612,-1881079825,-2139098881,-1086389770,536801415,-1473577249,-117444697,-252182777,-83820544,1067370488,286390781,301760016,2134839569,1065912328,286331327,301784847,-1048831,-251686936,352370815,-267927745,-52490242,-275799510,-16518913,57591,-939984127,-117620834,2118403140,1145324796,572686143,1153318690,-548977596,-15776520,667090927,-528486145,-1136658688,50331648,-1565853473,-520097889,-1057489149,-83820544,1067370488,1145370877,1157398084,2134852676,1059201570,1145324734,1157160775,-1048801,-251713598,-618733441,48767,-253819136,-281048406,-14425857,49399,-939984111,-100843618,2114982161,286331388,-2012709057,297680776,-553185007,-15789575,-2088173585,-528486145,-1082139978,268365831,-1968512289,-1056968833,-520618205,-80674816,1057014520,286390781,301760016,2134839569,1065912328,286331326,301522695,-1048825,-251688056,-23084673,-259538945,-1025564674,-268490582,-14434049,61687,-956302479,-117620992,2118403140,1145324796,572686143,79642402,-548453308,-12368648,555941871,-1015025409,-1073761059,1073672391,699042527,-1056968705,-117965021,-68091904,1057015551,1145370877,1157398084,2134852676,1059201570,1145341119,1157422879,-1048767,-251715294,-34633857]}],[{"sector":1,"data":[-253247489,14647294,-268459264,-16260865,16841975,-956302351,-100843776,2114982161,269554172,-2004320449,-1044414584,-549515247,-15724036,-2012676369,528478463,-1073751578,-69385,-1493106466,-251662337,-17301753,-68091136,1057015551,286390781,301891088,2139033617,-7829304,269607359,301916031,-17858800,-251688824,-1276690562,-251674625,719257599,-268464215,-15730433,117506039,-956302351,-117620992,2118403140,1078199551,585269247,-121635039,-536919804,2135180542,572718319,2138894463,-1073760265,-3841,-1616876834,-117444609,-524529,-68087936,1057015551,63741,-2130739712,2147418368,-14474510,117505727,83877887,-51413180,-260103390,-403439752,-251674625,719257599,-268484704,-14680833,532742135,-1023411215,-180480,-16777217,-1,150765567,-4194545,-536870913,-15691265,63727,-8785857,-1073747975,-15793921,2139097822,-50335745,-524481,-68075552,1057014015,-3,-257,2147483647,-12648193,-65,-1040195585,-1048815,-251658241,-201523329,-1056980993,-2132803777,-268435711,-8389377,2146500599,-520094735,-164096,-16777217,-1,-32769,-4194305,-536870913,-16523009,-17,-8392449,-1073792514,-8396545,-33,-50335745,-524289,-68026376,-16715521,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-2113929345,-251674625,-2097153,-268435457,-61956]},{"sector":2,"data":[-9,-1039,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1537,-33,267448319,-524289,-67502081,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-100679681,-2097153,-268435457,-33024,-9,-1031,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-16650241,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-251658241,-129,-16385,-2097153,-268435457,-1,-9,-1025,-131073,-16777217,-1,-32769,-4194305,-536870913,-1,-17,-8392449,-1073741825,-1,-33,-4097,-524289,-67108865,-1,-3,-257,2147483647,-1,-65,-8193,-1048577,-218103809]},{"sector":3,"data":[0,0,0,0,0,0,1953300480,1819506547,257,4194304,524352,-65536,-16269057,-1,-16711426,-1,520093936,-1,50331776,-16777217,0,-50331649,0,-251658433,0,-1056964849,0,-2130706681,0,16776963,0,16711425,0,16580352,0,16547584,0,16269056,0,16260864,0,15732480,0,15732480,0,14681856,0,14681856,0,14680832,0,14680832,0,12583168,0,12583168,0,12583168,16777216,8388848,50331648,8388856,117440512,8388860,117440512,8388860,117440512,252,117440512,252,117440512,252,50331648,248,16777216,240,0,0,0,0,0,0,0,0,0,0,0,8388608,0,8388864,0,8389376,0,12583680,-268238848,12584704,-133758976,12586752,-32571392,14688000,-15794176,14696320,-14745600,14712800,-14745600,15794175,-12648448,15794175,-12648448,16318463,-8454144,16318463,-8454144,16580607,-65536,16711679,-65280,16777215,-64768,-2130706433,-63744,-520093697,-57600,-117440513,-49408,-1,-256,-1]},{"sector":4,"data":[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,16547584,0,-2130706685,0,-520093937,0,-117440705,0,-16777217,50331648,-1,117440640,-15728641,251658464,-16253185,520093936,-16515841,1056964856,-16647937,2130706684,-16647937,-16776962,-16647937,-16776961,-16647937,-16678657,-16515841,-16662273,-16253425,-33431297,-15728889,-66854657,-253,-133959425,-255,-133959425,-16777471,-133697521,-117440767,-133695485,-251658495,-66586623,-520093949,-33032192,-1056964857,-16287744,-1056964849,-15763456,-1056964609,-15763456,-1056964609,-15763456,-1056964609,-15763456,-1056964609,-15763456,-520093697,-15730688,-251658241,-15730687,-117440513,-15730685,-16777217,-15730673,-1,-15732481,-1,-15732481,-241,-32513793,2146500359,-66592513,266403587,-133701377,65076993,-133709569,12648193,-133988097,8453889,-134021057,8453889,-66912250,65283,-33488896,65287,-16711680,65039,-16777216,65279,-16777216,64767,2130706432,63743,1056964608,61695,520093696,57599,251658240,33023,50331648,254,0,248]},{"sector":5,"data":[0,0,0,0,0,0,0,0,0,0,0,1953300480,1818838544,503316581,2003127808,2031616,1852141647,3026478,1392517120,6649441,1392517376,543520353,774796097,578813998,1769099264,268465262,1953064005,2752512,1868852821,543707913,6517573,0,1157638912,1702060402,0,2883840,158627139,7103812,1124084993,158953583,12870,1632632878,157643891,7564873,1124085505,1918985580,0,3145984,1702260297,16807026,1918107697,543515489,1701274693,838926451,1768703488,1866997872,1870293362,1818326126,3375360,1885957190,1919243808,1633905012,905969772,1852786176,1107296372,1852786176,2053722996,1393557605,1701607796,5113856,1767992400,893782382,5177344,1684827970,3556873,1224757248,1768710516,927336803,5308416,1701080661,1852402802,944114021,5373952,1819571535,6647401,1392530176,1802072692,1953853285,0,5507072,1734962241,1701585006,29798,1816199253,544106345,1953391971,29285,1816199254,544106345,1751607666,116,1460142080,1634750208,6649201,1409308800,1936613746,1701994864,268465262,1701601616,6648948,1342200320,1702130785,779316850,1175006766,1526726707,1852394496,1767317605,1936225380,154021422,13382,1916928092,543716213,1885431891,774796133,1568669742,1869566976,774796140,1334837294]},{"sector":6,"data":[1869182064,29550,1868169318,1226861935,960891246,6750208,1836019546,1953845024,808535561,0,6883328,1193307982,6580594,1174432256,543518313,1684632135,7012352,1768187213,1193307509,6580594,1124101120,1936875887,1917263973,25705,0,1682243694,1344304233,1702130785,774794866,46,1879048192,1919895040,1769099296,1919251566,7438336,544370502,1701995347,1828744805,1937208180,1835757164,-1874853887,167774726,1342215168,0,131118,786532,8388611,-8302461,67108864,1174410240,83900928,-1560280320,16745296,5701632,3276840,65550,1342373889,1701859200,1459617902,838875648,33558016,50331648,1631813712,1818583918,5111808,3932180,262156,1342308352,33554562,671089664,-16774144,33555199,1884258896,1176530533,979725417,1953300480,-1874853887,134218757,805348864,0,983052,786536,8388611,8474755,251688960,234889984,16777472,-2142240000,1702256979,7864320,2293793,131086,1342373888,1851868032,7103843,33574912,201345024,33555456,-2108685824,786432,3932162,-65524,1342308352,1986089858,1766203493,1092642156,14963,2004055149,-1874853887,419436806,1308662272,0,327680,524442,131071,1300385794,1869767529,1952870259,1852397344,1937207140,0,10092558,-65528,1342308353,1767985282,29806,1507337]},{"sector":7,"data":[262143,1350717440,1953392993,1966080,6160418,-65528,1342308353,1919243906,1852795251,808333600,49,-1711264000,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989871360,234889216,16777472,-2142240000,27471,-1865940992,335549444,1073764864,1342177280,1953392993,738204928,234889216,16777728,-2142240000,1668178243,27749,524288,524378,131071,1401049090,1768189541,26478,1179648,524378,65540,8540162,469762048,134240768,33554176,-2108685824,1881173876,1953393010,1869640480,1919249519,1828716590,1937208180,1835757164,1632634880,544501353,671752237,1769238133,1684368500,1632634153,91516521,1852399952,1800340084,1851867910,141321571,1970233921,774778484,1852786184,2053722996,1866859621,1310946414,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,544109938,1852399952,520105588,544501582,1970237029,1830840423,1919905125,1869881465,1853190688,1767985184,439252078,1852727619,1663071343,1952540018,543236197,544695662,1986945379,1124889441,1869508193,1886330996,2125413,1851867916,544501614,1702257011,1376845856,1634496613,1696621923,1953720696,543649385,453000961,544434464,544501614,1635131489,543451500,1852399952,1768300660,355362156,1702256979,1920295712,1953391986,1634231072,1936025454,1059062304,1763711232,1818304627]},{"sector":8,"data":[1684104562,1700929657,543649385,1953064037,355361893,544501582,1635131489,543451500,1701603686,1701667182,1311440928,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,1953064037,1869504800,1919248500,1818846752,1124937317,1869508193,1919950964,779382377,1953451551,1869505824,543713141,1802725732,1634759456,1948280163,1919950959,779382377,1953451547,1869505824,543713141,1869440365,1948285298,1919950959,779382377,1767985201,1663071342,1869508193,1634738292,543519859,543516788,1953394531,1937010277,543584032,543516788,1885957187,1918988130,1344417380,1953392993,1851876128,544501614,544503139,1948282740,1126196584,1651534188,1685217647,1632641838,544501353,1852727651,1663071343,544829551,1948282740,1126196584,1651534188,1685217647,1750345262,1881174889,1702130529,1818851104,1986994284,1920430693,543519849,1920298873,1851876128,779313526,2019906601,1936269428,1869575200,1734959648,544175136,1953718640,1852383333,1948282740,1998611816,1868852841,1310404215,1696625775,1735749486,1701650536,2037542765,544175136,1953718640,1310600805,1696625775,1735749486,1768169576,1931504499,1701011824,544175136,1702257011,32,0,1953300480,704649989,3014912,755040300,16788992,2949233,1509978625,7536896,1946222683,16797184,5177461,1342207489,7799040,2013331537,-2130680320,6750329,2004055149,-129595009,1183554795,-2090901768,-443874579]},{"sector":9,"data":[]},{"sector":10,"data":[3562061,26,32,65535,-333119488,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":11,"data":[1409297384,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,221148023,240788490,-855002081,1275181089,8653]},{"sector":12,"data":[279886,1835250,191264114,131078,268435968,74012,131072,196610,4194397,13631568,14745819,1294,589828,0,0,0,593821699,593821968,104202262,180224017,-2147418108,1,52690944,-265289711,32769,-2147287040,1,53805056,-265289663,32771,-2147221504,1,58064896,-265289722,32769,-2147155968,3,58458112,-265289720,32769,58982400,-265289721,32770,59441152,-265289716,32771,-2147090432,1,60227584,-265289721,32769,0,1447383559,1230197317,16777216,201328640,1258684416,1162760773,1145504588,1398080585,-16494011,20958465,-855565366,308019519,20958465,-855572480,3539263,1294270464,1869767529,1952870259,1852397344,1937207140,1986351648,1769173605,1886404896,1633905004,1852795252,1225195520,1195723852,281665,1329742085,218197,1447383566,1230197317,1346653783,21188434,1313410560,1397900630,1397050693,1162297683,1828716546,1937208180,1835757164,1818978915,1936483443,1299014754,1330791241,1413893971]},{"sector":13,"data":[1167087646,518818645,2122438798,1963004172,242679569,1342177720,20378,112640,2122385899,1946226700,-2084557836,-443874579,-900899553,1478361098,-1957345904,-661774612,286031489,-15633151,28839542,-6664192,-1207959297,166395905,269254273,737440769,49120192,1562371467,707149,-2081649835,113713900,2408,-1710983425,647,1358841481,1342180024,16777114,-6664192,-16776961,1183710838,-1706027298,65535,-1545714037,1183517038,158770152,-16484609,1067122294,-2097151997,17394238,1721830261,164274953,-351673695,166633737,-1593193821,-593294880,2996233,164507383,-1207317341,-397408698,-998045158,-402209022,-956296183,17437702,-569981184,-956290807,17394694,2734080,74907472,-2096961560,28837060,1575324416,-326412861,-1960907645,10683974,71731978,-16107357,-1207304138,-1706033150,669,-1929087233,1343682118,16777114,-96040192,-1980348885,-794565562,-62485751,-1980217813,787997254,1178274254,-1591509276,1178143180,-1996259868,1183573062,179935716,-1543899392,-1952905662,-150352370,105161721,681647851,-498714368,1183384445,-498693150,702873,1151597047,-835782906,105030409,-1324989279,-1981754621,1117908038,-1981754618,1183579718,515480044,-1543899392,1183517138,-465159682,1183518078,-28955676,-775804007,721611768,166765504,971785867,226419270,736249483,731507782,-336014910,-1547687166,1186466292,-1108848634,46433030,157826691]},{"sector":14,"data":[-13995008,-16121290,-401997770,-998043787,108461828,1347469355,164640511,158217983,-1174402632,1347551317,16777114,1575324416,-326412861,-2096305021,4158,-1377238156,71731969,-1962264413,691865158,2121823232,24832259,1962939453,10676483,1946164797,25880847,-402360577,-998042858,25094402,-1207666945,1344146070,16777114,1812383488,-16776951,211420278,-1996488701,10745414,302434058,1342177280,1342177976,203930,-159973632,-2096097048,113705668,1313256,1342588600,-2096608792,1186464452,-169324538,46433029,-956244247,17437702,2734080,74907472,-2097079320,300483780,335988481,-1207959030,-387252182,169084615,750256132,-941757696,101323782,3061760,1048826603,1947470312,11200771,-1710983425,869,-1544141175,-1202714112,-1706033150,65535,1050311,1996423169,261351670,-16595837,-1710626250,923,-16484609,-6621578,-1207959297,-1202715066,-1202716652,-1202716670,726663171,28856512,-4697984,-236433281,74907418,16777114,-163149568,-1207304029,-11532730,-1207303114,-1202716669,-397410302,922682018,1186466308,1996443654,74907638,-2097113368,922683588,-6682132,-956301057,4102,74907392,-1695123713,179,922696939,45614656,1347590400,-16484609,-16109002,-1710608330,65535,708649195,-385649408,742260487,-385649408,775814922,-385649408,842923789,-385649408,-443810186,-1957313699,49054700,-1710983425,65535]},{"sector":15,"data":[1358841481,165558015,-1705983957,1051,-100609,146278006,-6664192,-1962934017,-559741370,1575324425,-326412861,1443687555,720783047,-402209024,-956296183,1375302,1996437739,-193528056,1342177976,1342178232,186406888,-1962380096,-391908282,-14947575,1996425334,243956,178256,473622608,108314635,-1980479861,1586232390,-163150858,-1995994366,-1072958394,1048819829,1964247528,176063351,-2096729068,1964309630,-96024733,1187446784,-956301058,784454,-1946657141,947914870,-16419582,250346054,-1946657141,947914870,-16550653,1191181894,-125926408,-1948680616,1178205766,-1962115334,1177287238,-2034740994,-1959924982,1178205766,722042362,-1202652602,485165600,-1202667477,350947898,-1202667477,216730282,336232067,-1070918795,169261136,108461904,-402360577,-998046053,-443851256,-1957313699,317490156,384714381,1354771280,28856400,-6664192,184549631,-2096139072,1964175486,1354771213,-2095247384,-1070923068,1183651819,-1706027282,65535,384714381,-26032,28835840,1575324416,-326412861,1460071555,-28915882,1187446784,-1207959300,1861681162,66096126,1586232438,188779012,1183441962,81402,54356084,-16091904,-16121802,-351679946,3604232,-600375542,105093641,1183514624,1143928828,66095878,-1962281930,788004422,-125106622,-787886431,-523296,-1593180106,-956102160,38047056,164536656,-523116335,166725163,100915447,-956103102,105161040,1212728835]},{"sector":16,"data":[113285712,1191116800,-58817540,-385647352,1191182193,-25263106,-385647352,1600061280,-1017256565,-2081649835,-2091512596,1964247166,28371203,50757251,922686581,922683904,1469712842,-956301306,129606,922686187,922683904,-1885730340,-956301312,195142,755517067,-1181155317,-101253110,105000695,164499083,-1056710191,166725123,-1946663287,187500614,179935488,-1946552576,1143928770,-200932602,-1992278007,922744390,1996425728,1183535352,-837907464,-773730039,62991329,1342587398,66471563,755385350,-1706033148,65535,1342178488,-11485141,1151466102,273670,105029968,164499083,-506338863,-11484885,1996486262,3604472,16508938,-955202429,1375302,-1962882071,1183385670,-28931084,-1946925567,1988883550,704678410,71711716,-1377238156,-28931328,-1946925567,1988883550,704678410,71711716,1178332020,-385649658,1995112592,-1946919285,1183451766,-1962899450,-2021067682,1183516230,732660,702873,788003319,243992130,-506394162,100909315,1183386096,-196703240,-1728050387,-150992199,-138245127,50742318,1074394118,-163149504,167786239,1358460671,-1946663285,-787886578,736219617,1107690433,1183535110,1141244918,273670,141204048,1183514624,-196728322,-1946919285,9046646,1178330154,-385649404,1586233202,-62487556,-1995994366,-1072955834,585696116,140413951,-1979025781,8914502,1575324510,1426065602,-326898549,276726534,-15567872,146277494,-1986375680]},{"sector":17,"data":[1342177280,541338,-935919872,145660425,1187446784,-352321282,243172184,-955812607,134726,1187448299,-2097151730,1963003518,74907401,164247295,1996425195,-600375548,143104521,1996423168,178180,19962448,1996423168,108461828,-1962379521,1174603334,1183535114,205914888,144939600,1191116800,306613246,2097038905,276726688,-13995008,922682486,-509998606,-16777208,1996424310,142016262,50742923,-1957688762,1174603846,43667468,-352321530,-365494519,53778953,-443875328,-1957313699,216826860,-1324989279,-1981754621,1117912134,-1981754618,-761135546,-835782903,-163149559,167786239,166606591,596378,3604224,-163149046,100917457,-1588590096,-523171374,166987267,-25755824,-1191414017,-256245727,-1706012160,2360,167786239,166868735,607642,3604224,-264831222,-197722359,-25755895,-1191414017,-256245727,-1706012160,2412,167786239,166606591,645274,166764800,-335919479,3604261,-92864758,166999807,164509439,-1191414017,-256245727,-1706012160,2469,17187489,1183578694,-268041218,-96060663,-190722179,-96040695,922691051,922683904,1996425712,-25755654,1342177720,-1174396488,1347551472,658842,105160960,-1946532351,100924486,1178274292,-1949336070,100924998,1183386096,-62485512,166987267,-768375,-16121802,-1710624202,2658,33179335,-13505792,-1962278858,1174665286,1183535354,244029946,-101250610,166987267,112720]}],[{"sector":1,"data":[-59310256,-1174396488,1347551472,674458,-96010496,972441227,-948110778,33179335,-13702400,-1962278858,788003398,100862414,-1957688848,1174664262,1996443898,112894,2209872,1375793338,36280912,1191116800,164798970,2096776761,3604426,-298385654,95853065,922681344,1996425728,-197722120,182688265,922681344,1183517184,-163183624,167027024,164759043,178428496,922681344,1183517184,-163183624,-196703408,164759043,180066896,922681344,1183517184,-268041226,1183535113,-771357708,-879079415,-16777206,-16121802,-16125898,-224725898,-16777206,-1962278858,1174665286,1183535350,-771357708,-6664183,-16776961,-16121802,1996486774,-25868,1996423168,-92936188,-1017256565,-2081649835,-950663444,65094,16533191,6600704,-1946259721,-60947496,-972786037,1191116800,-58817540,-1671581,2122579526,-662829314,16664263,-62470400,1183514635,-96040452,1689785579,-26282240,1577310347,74877946,-16711482,1183578694,525820,2147108411,-62487583,-58817782,-1194361263,1861681252,-1947169794,1086719070,1689781037,-26282240,1586229387,910214660,6600707,-1946259721,73305072,36454598,-150969160,-259260818,-972792181,-16632000,2122579526,-2055338242,1575324510,-326412861,1443163267,16664263,-1962022144,1183514206,2022148348,-28901623,-1946263925,9046134,184305288,-2082179648,1946159742,172395310,702873,-259261961,158660107,83773183,2022148144]},{"sector":2,"data":[172395273,702873,-1031734793,-27358416,-1996601601,-1962313577,-2017001890,-1207957128,-11531912,1525155446,79987461,-402360577,-998046212,-443851262,-1957313699,216826860,1342177976,807066,158507776,-1705983957,3164,-1207312221,-1706033148,2047,-1207308637,1347420168,1342177720,11319376,-6664162,-1996488449,-1705969082,65535,185201315,721778112,37218752,-1694861569,65535,158074567,-1070923775,8165968,1183383552,414732536,-895856640,1023410188,142475266,157943495,116064257,157943495,1996423168,702712,-26032,-935526400,-955747072,34196998,-955847936,17419782,1354771200,-1694992641,940,-1727987784,43667538,-1560281075,12061154,1389505535,219257424,1889730560,-1161811191,1347551487,16777114,157721344,-1207666945,-1202716669,1344146070,1342182584,867994,74907392,1342178488,503990968,2668624,223582800,1996423168,374788,169261136,179851294,1754943488,-16777203,112723062,-1430761472,-1202708982,-1706033132,3453,-1207666945,-1202716665,1344145978,1342181304,889498,74907392,1342179512,503980216,1030224,229087824,1996423168,636932,176601168,263737374,-1130737664,-16777203,179831926,1924681728,-1202708982,-1706033132,65535,1342193848,1342184120,16777114,-62486272,58048523,738111721,62410944,1347590527,914074,158638848,-1202667477,1385791232,235117136,-324861952,1354771209,-1719729480]},{"sector":3,"data":[345657426,-1560281074,1996425706,112644,-1706012007,65535,-2096510813,619582,1659437941,-331447298,57999369,-2080483095,649790,1323893621,1975520254,-28841725,-1207666945,1385758723,-26032,1586167808,206014972,-1191420277,1200160932,408914966,157957763,-1593478144,65735024,-1962286943,1200225374,-60912880,-16627769,71813119,1586233343,306694140,1204224001,-1962934252,1183579230,172460292,-939762037,-1962933497,1344207942,16777114,1975520000,-59310325,965786,-36706048,-1694730497,65535,-1962933832,1438866917,-326898549,205949700,-2096742237,1962936958,1575505939,46433277,57982987,721534953,43116992,1064579,-385649664,1996423815,166639626,178256,252877392,1996423168,166901770,178256,253925968,1996423168,158513162,178256,254974544,1996423168,165722122,178256,256023120,1996423168,157726730,178256,-26032,1996423168,165853194,178256,258120272,1996423168,158382090,178256,259168848,1996423168,164280330,178256,260217424,1996423168,165459978,178256,261266000,1996423168,166508554,178256,262314576,1996423168,158644234,178256,263363152,1996423168,166377482,178256,264411728,1996423168,164149258,178256,265460304,1996423168,165591050,178256,266508880,1996423168,169129994,178256,267557456,1996423168,1357834,1226832,268606032,1996423168,2799626,8042576]},{"sector":4,"data":[269654608,1996423168,177649674,1357904,270703184,1996423168,172668938,2668624,271751760,1996423168,169261066,702544,272800336,1996423168,178960394,1357904,273848912,1996423168,171620362,1030224,274897488,1996423168,169916426,1030224,275946064,1996423168,176601098,1030224,276994640,1996423168,175290378,1357904,278043216,1996423168,157988874,178256,279091792,1996423168,164542474,178256,251828816,-4718592,-17665,1996443730,282434060,-660406272,-636057335,671532809,-956289792,4102,-18432,1392508858,209125200,1109146,171221760,171316873,-1157627976,1347616767,-1710459137,65535,-1995820893,-1207291370,1344143548,1195651,-1207602176,65735242,-1945463112,726684378,13417152,1347440722,6600784,1354771280,209125200,-6664112,-1996488449,726727750,-6664000,-1996488449,726728262,1347440832,1342433208,1342767288,1139098,-25755904,-1202667477,1344146034,1342433208,1342243000,16777114,-59310336,-1710983425,65535,-1694730497,65535,-336352280,1575324667,1426066114,-326898549,105286402,-16121181,719848566,46433025,-16484609,-1710628810,4570,721712895,-11513664,-16134090,-1207341514,-256245727,-1706012160,2316,-1207666945,-1706033151,4646,-1207666945,-1706033142,3141,134584912,1996423168,74907396,503727755,568873040,46433025,-26032,-930414592,722063521,-1037329983]},{"sector":5,"data":[726726865,1183535296,1347427846,-2097086488,-1706032444,65535,157812423,1996423169,178180,139369040,-443875328,-1957313699,49054700,166069959,113704960,264676,-1207666945,-1202716006,-11534136,-16131530,-1710630858,65535,-1017256565,1167087646,518818645,-326903666,165978372,166069817,1996437119,211720718,1183383552,-1070903044,922701904,922683856,163055982,5618176,10113106,-16777197,-16128506,1996426870,350132988,216727552,-1207011585,-1706032486,65535,-1962742397,1297948645,1426066122,1048833163,1963002216,165978433,166110016,-2096859393,617022,1889600884,-1593578743,-1706030624,4512,721712895,-11513664,-16134090,-1207341514,-256245727,-1706012160,4540,157812423,-443875328,-1957313699,49054700,16664263,-16323840,1191181894,73304836,1962950528,-28931086,-1017256565,-2081649835,1151405804,-754732794,-163149344,-754564447,-129594912,-1559869813,1183517140,165061384,105004675,-385649408,1048772749,1962935876,8644867,-1995838303,-257819066,105265417,1183542654,-268041224,105265929,-190750338,138819849,1183537534,-200932362,138820361,1183534462,-268031226,244029705,-101251518,-1946401143,103483462,-1952904716,-150584306,-96040455,-150992200,1174666350,722426,-1192081783,-11532730,45675126,62410752,-773304320,1958742796,158638342,-113015,-1097138570,-1962934252,1438866917,-326898549,105160974,-523041871,-1577695607]},{"sector":6,"data":[-523041214,-1946663287,-727513530,138840841,-2096507229,410174,1609106293,1144947457,57999366,-1593747991,1178143216,-385646842,1183514954,-268041224,105265929,1005126527,167026945,2131248697,19982595,66471563,990508038,58656838,-1962860055,103482950,-1952904720,-150584818,-62486023,721962635,-1727400954,105123467,1183447543,702714,66875127,184941126,-230258432,1342588600,-1192069377,-1202716670,-397410301,-1073017844,-1108802699,-228685056,105285574,1812383490,-956301303,16781318,-365494528,357997065,1996423168,353737220,1183383552,167814132,-34871216,-16595837,1996424310,357407476,1186463744,1996443654,178418,243792,1354771280,1350566328,1350565816,-1207348248,-11532730,45675126,62410752,-1108848640,74907403,1210010,-196704000,-1207304029,-11532730,-1207303114,-1202716669,-397410302,922743026,1186466308,1996443654,74907636,-2081495320,1996425412,-193528060,845978,-331940096,364288521,113704960,16,922688235,28837440,1347590400,-16484609,-16109002,-1710608330,968,-1017256565,-2081649835,1048775916,1964247528,1816036106,57999369,-2097047319,4670,1996426613,172668932,2040156190,-956301310,16781830,-365494528,135174665,113704960,65552,158088835,-955419648,324678,50218695,10086656,169098883,-950700799,64582,720914119,2793728,-336181623,-128021719,1183385483,105298166,-159973552,1342177976]},{"sector":7,"data":[1342178232,185246696,-955812672,130118,1182991595,2122515192,-780926724,771114635,-1181155317,-101253110,-1946265975,837547590,1342588600,168048383,1342178232,1342177976,1342177720,1350566328,1350565816,-1593310232,187501062,179935488,-1980107008,111279702,732426,702873,1183447543,-196703244,105000695,1117898891,-1037330170,-939263791,166727171,164892297,-134330741,-1962523602,105161160,-775804007,63439864,-1995836402,-16132594,-202898314,46433028,-1710983425,5318,-1946532215,788001862,243992130,-506394162,100909315,1183386096,-28931084,105131767,166987267,1183400000,243966,112720,243792,105161040,1342178349,-1962523999,-787886578,736219617,1996443841,-193527810,-386238721,-997986079,268879632,-16777216,1996424310,312646394,922681344,922683862,1996425684,-66787324,-1962490749,1438866917,-326898549,-398556404,175445001,158088835,-385649408,-727645989,-268031223,244029705,-101251518,-1577826679,103483862,-1952904716,-150584306,-28931591,16533191,108954368,-1928498176,-1924071866,-397347770,199950503,1358841485,1358186125,-2097101848,179832004,-194054400,1577310347,197362686,-2131337591,17188543,113756021,65552,1342588600,178259,243792,149612624,91537419,33310407,268879616,-2097152000,1946221694,-196703332,105000695,1117898891,-1037330170,-939263791,166727171,164892297,-134330741,-1962523602,105161160,-775804007]},{"sector":8,"data":[63439864,-1995836402,-16132594,-1947728778,46433027,165033727,164902655,-402360577,-997983474,1575324422,-326412861,-16490869,73304839,2114404227,509717,106859264,1586169855,121602822,130483326,-443875328,-1957313699,73305068,1586171903,4162308,130487677,1586167815,-1961885946,1065551454,-956007168,-1962932473,1438866917,-326898549,112646,-1979824503,1183579206,2309382,-1192688779,-385649152,154993072,-385649408,222101738,-385649408,540868807,-385649408,557646015,1031107584,57999394,-385832471,1151402710,-704249594,29288713,722064545,-1727401978,104992395,1183447543,105030140,164890153,-1593728023,103483862,-1952904716,-150584306,-28931591,103399819,-1981216298,165060865,166987307,1141803929,-1980107002,-727581114,-268031223,244029705,-101251518,-1577302391,103351876,-1309996586,722065057,-1727400954,105123467,1183447543,700550142,-1593190906,100730434,1038682580,164929793,166725163,1108249497,-1980107002,1151466566,-704249594,-9049847,17188001,-351676922,272532434,57933824,-16638487,-16132554,-16133066,1726481526,34204154,1064579,-385649664,280494324,-1130737664,184549401,722435520,1996443840,-41424892,-385563517,28836326,-1192301824,-1706033135,6665,58507275,-16657943,1996424310,434608644,-1202716672,-1202716622,-1706033024,6644,-16484609,463078518,1342177306,1342190264,-1705983957,65535,1342190264,-402360577]},{"sector":9,"data":[-1460934609,1342181816,16777114,2092960512,25487619,-16484609,-57015178,1342177283,1342182584,1342210232,1720730,74907392,-1710983425,7204,1357904,1354771280,1694874,1357824,641577451,-385649408,326631061,1962943549,-22681341,1962943805,-26679037,1023488489,57999399,1040110825,57999400,1040075753,57999432,1040136425,57999440,-369132055,-727645938,-268031223,244029705,-101251518,1039812233,75431943,260030475,-1727642975,-120470997,166725123,-2096507741,2131294846,-58817780,-2094959360,1962998398,505883,105000695,1117898891,-1037330170,-939263791,166727171,164892297,722065057,-1727400954,105123467,1183447543,474618,-1073019777,1151405951,-1037330170,100923601,-693958156,-92372215,-2096333048,1962999422,-92372191,-1206160128,787939335,-930412988,-1727642463,-120470997,235128835,243862004,-727643690,-268031223,244029705,-101251518,-930354697,-1727642975,-120470997,235128835,243862000,-694089260,-200922359,244029705,-101251516,-930354697,-1727642463,-120470997,235128835,243862004,1996425686,1632260,-16595837,-16132554,-16133066,-1679293322,113542135,-1017256565,-2081649835,-727644948,-62486263,-1995843935,1996488262,-62485244,999968790,-16777187,1996487798,491166462,-443875328,1478411101,-1957345904,-661774612,-1960252285,289213510,1982821377,36104451,1962934589,8448259,1962934845,12577027,1962935869,17819907,1962938173]},{"sector":10,"data":[24963331,1962999869,15001859,1996452331,242679562,-2082071832,-1070922556,36170137,-1710328065,6606,-2080618871,4158,726671220,45633728,1268404228,-16777188,28900470,45633536,1553616900,-352321508,-59310135,-1202667477,-1706032128,65535,-1191414017,-1202716671,-571800576,-401705217,-997989382,-1952191742,-415430074,-15240189,1996426870,175570700,-16222465,-6683018,-385875713,922681777,62391872,1347590400,-15829249,-16107978,-1710607306,5496,-38935,-1710866378,65535,1962934589,1882652452,483367433,922681344,-660993550,-16777188,-1710660042,7393,165820159,823450,1354771200,16777114,-13965056,-1710328065,65535,57982987,-16693015,1996425846,-76290034,-1191244567,-1706033133,65535,1266008075,687747,1183530356,105265422,-727630476,-129595127,-1995843935,1996487238,-129594098,-6664170,-16776961,1996486774,-25862,922681344,922683862,1996425684,-170334194,-16333693,-6681994,-2097151745,1962936958,-22091517,556675,-1511455884,242679806,16777114,-23402240,-1928431873,1343674438,16777114,-663290112,-401705217,-997989505,242679556,383272589,-26032,1911095296,272532478,309657600,-16222465,1996424822,-176887794,-385432445,922746456,-409335318,-385875949,1996488268,-26098,113704960,65574,-1694614551,65535,1064579,-2095680256,9790,1996427124,108461832,-401705217,-997984783]},{"sector":11,"data":[637978374,-385875968,356384272,1025210113,57803028,1040057321,57999634,1040079081,57999635,-369232919,373161557,-385649407,4062702,-385649406,20840303,1032811522,-1686896126,-2080491287,-443874579,-900899553,-1957363702,82609132,-907520170,140413670,-1014300878,-167746375,273023969,-1056706421,-2080487799,-24441914,-661849853,750370958,-1510736896,-2020744239,1183386116,-2080648708,1964248702,337525302,2801162,1693123444,195951760,-1961528128,-670826914,1963016064,15132912,1240001396,14084353,-100609,1996426358,27715594,184600553,-13994533,-1710606282,5808,-16121693,1996488310,209125134,-401967361,922740538,922683960,446302720,-352321513,-386692341,909836485,-1301018092,-1090508098,1586167828,-62944772,1958742957,-27358395,1065408515,-1947175679,7792840,-108271244,1074284171,-150708597,105810907,1996478967,1996445456,209125130,-397323440,1178337036,-1983611386,1586169414,994019836,897385542,-8145429,959345940,58003070,-1946200599,-1958737850,-604568482,-150581621,276234201,175570775,1342994175,-840412845,105266174,1183384446,105286406,1583339767,-1034033781,1451884558,209095178,-994093481,-2096788736,-1073020217,-259321228,-243978184,809037827,272169588,-1072961675,-1966907554,1451887222,-27358452,1024345739,745799700,-1076362410,92995780,184731523,-1961134912,1966094576,1103705073,809037827,272169332,-265558923,-85847928,394845419]},{"sector":12,"data":[2123088734,182137854,-478147747,182702338,-478145955,182702342,-478129827,182702350,-478128035,-1326722786,98825806,-259325718,-1190410365,-617414578,-768360397,-1560223581,-1392770850,1193118360,14063370,-2029921533,-270401318,-1962876767,-2097095138,1946356862,-355429629,-355417301,12059506,-1957313667,861361900,769984,-1190625789,-490864562,108953600,-1106938877,-617414426,38149258,-1728454144,175423499,2038235323,-2097104125,1583334147,-1034033781,-1957363706,140413932,-2146804221,242549055,-1979418998,-538442154,112894,-1070398859,-1034033781,-1957363704,1183537132,1326344,1988758644,106334724,-401973621,-1956643090,146955749,0,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,-569981141,-1996488699,1459998734,1381172822,855727592,-6664000,1459618047,16777114,1958742784,-310646777,30861392,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,8583,-1017256565,-1192457387,-1957691328,1861682246,-1097183226,-1962934239,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,8653,-1017256565,736922453,1996443840,231315972,-443875328,-1957313699,74907628,962970,1575324416,-326412861,-1710983425,8758,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578]},{"sector":13,"data":[1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443875108,-1957313699,15722732,184479464,-2146798364,1962935422,71747076,382017278,12060114,522308901,103026315,45811683,572456704,71731974,567102644,-2130301253,1929786619,402608904,-347913381,79414258,1140897792,175251917,1954595574,42958853,2034974726,817153004,-459071027,110019333,-1960442402,-1207948234,567096576,97656457,97781388,12066574,554744357,-1959386675,-486136818,113587746,-628357594,-13182157,1929781790,-32249597,705086774,-1143305210,-13238269,369500702,347718431,-153406720,17171079,1051985012,-498916915,-1957313550,1435884,-402360577,-443810004,-315440291,-355399965,-85796655,104119235,104135553,-11335565,1128487703,-1144786197,-75430348,141755958,1528299347,-219462845,33574083,-15670272,50332672,52009729,50358784,52203265,50359040,50674433,50359552,50682881,50360576,18946049,50331904,50685441,50360832,18968577,50332928,18980097,50333184,18983937,50333440,34719745,50332160,18996225,50334208,51475457,50363392,19002369,50335488,19009281,50336000,19015425,50336768,52510977,50332928,52226305,50333184,19026177,50338048]},{"sector":14,"data":[51532801,50334208,34245121,50336512,34238977,50336768,51556353,50334720,18955009,50339328,34056705,50337792,52285953,50336256,52289537,50336512,34771713,50339072,52263169,50337280,34739201,50340096,51464449,50370816,50596865,50371072,52181761,50371328,51458817,50371584,52147969,50338816,52048897,50371840,52229121,50339584,18659329,50343936,50412801,50340096,52046081,50373120,17871361,50344704,51750657,50341120,34792449,50343168,17781249,50345472,52267265,50341632,34370305,50343936,52273665,50341888,51455745,50342144,51473409,50342400,51241217,50375936,51268097,50376192,51194113,50376704,52236289,50377472,34372609,50347008,51291393,50346240,34403073,50348544,35440129,50349312,52352001,50348544,52359937,50349056,52283137,50349312,52150785,50349568,52256513,50349824,34384641,83906560,-15828224,83886336,-15685888,83886592,-15676928,50332416,18947329,83909376,-15671040,50332672,34722817,50353920,34730497,50354944,33594369,50355456,52210689,50353920,50338049,33576960,-15826944,33554688,-15685120,33554944,-15676160,1828717312,1937208180,1835757164,1818978915,1936483443,1299014754,1330791241,1413893971]},{"sector":15,"data":[0,5,0,0,0,655369,65547,-524289,-655370,0,720941,5308434,852056,1048607,2490429,4456531,917590,983081,3145779,3801172,2162773,4128804,2228290,2818083,3473454,4194360,1572929,2752537,3407919,4849721,1507403,2097178,4063269,4784195,786508,1376273,4653084,5374030,1441879,4718619,77,1702258002,6910834,5570730,5570730,5570730,5570730,1702258002,6910834,655369,65547,-524289,-655370,0,513,0,0,511,-127664383,134612488,25592,-33756936,-118948611,-66584576,117703687,2300,326918,117244928,-49938432,67108868,1789,67632136,150734596,-386400256,-50463236,63720,101251171,1677199366,101251171,1677199366,-386400256,65792,63720,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16836856,201851137,-127729664,134612488,-127704308,134612488,25592,16836856,-119013375,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,135004160,16843008,63720,101190755,1677199366,101251171,1677199366,-386400256,65792,63720,67567624,134219524,17170432,67174660,1537,17039622]},{"sector":16,"data":[100729857,524288,117703687,2048,16779276,201851137,207814656,134612488,-127704308,134612488,25356,16836856,201850881,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,-386400256,16843008,63720,101251171,1677199366,101251171,1661732870,-386400256,65792,3080,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16836856,201851137,-127729664,134612488,-127704308,134612488,25356,16836856,201850881,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,135004160,16843008,63720,101190755,1677199366,101251171,1661732870,-386400256,65792,3080,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16779276,201851137,207814656,134612488,207840012,134612488,25592,16779276,-119013375,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,-386400256,16843008,63720,101251171,1677199366,101190755,1677199366,135004160,65792,63720,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16836856,201851137,-127729664,134612488,207840012,134612488,25592]},{"sector":17,"data":[16779276,-119013375,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,135004160,16843008,63720,101190755,1677199366,101190755,1677199366,135004160,65792,63720,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16779276,201851137,207814656,134612488,207840012,134612488,25356,16779276,201850881,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,-386400256,16843008,63720,101251171,1677199366,101190755,1661732870,135004160,65792,3080,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16836856,201851137,-127729664,134612488,207840012,134612488,25356,16779276,201850881,524288,117703687,2048,17039622,100729857,17170432,67174660,1537,67567624,134219524,135004160,16843008,63720,101190755,1677199366,101190755,1661732870,135004160,65792,3080,67567624,134219524,17170432,67174660,1537,17039622,100729857,524288,117703687,2048,16779276,201851137,207814656,134612488,25356]}],[{"sector":1,"data":[-2122252288,65921,0,0,0,0,0,0,0,0,0,581304320,583410366,1953309458,1819506547,1668115310,259,2097152,262176,-65536,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,257,4194304,524352,0,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792]},{"sector":2,"data":[0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,1792,0,-12648448,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-62922497,33488641,-130031361,16580352,-247471873,16285692,-482353025,15745022,-952115137,14688255,-1891639265,12619775,-1623203825,12636159,-1623203825,12636159,-1623203825]},{"sector":3,"data":[12636159,-1623203825,12636159,-1891639281,12619775,-952115185,14688255,-482353121,15745022,-247472065,16285692,-130031489,16580352,-62922497,33488641,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-29368065,16776963,-62922497,16711425,-130031489,2130509568,-264249281,-491776,-532684769,-966912,-1069555569,-1892608,-1069555513,-1630464,-1069555481,-1630464,-1069555481,-1630464,-1069555481,-1630464,-1069555481,-1892608,-532684601,-966912,-264249201,-491776,-130031585,2130509568,-62922689,16711425,-29368193,16776963,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,-12590849,-1,57599,0,0,0,1953300480,1835091728,838860901,1852393472,1214122356,1310720,1936941392,5266953,1308630656,-1879017627,1818848083,687865964,1734689280,1701736041,704643186,1987005952,6644585,1157639168,1919250552,780140660,1935756544,7497076,2004055149,1802398835,1802134381,-2134900736,419436802,838899712,1375731712,1919252069,83913075,-1946155776,-1711271424,33554690,1868137040,1634541685,1852776569,1830844780,543520367,1629515636,1634759456]},{"sector":4,"data":[1998611811,1701995880,1701344288,1920295712,544370547,1629516649,1869767456,3044211,419445760,234889216,16947968,-2142240000,27471,2004055149,1802398835,1802134381,-2134900736,419436802,838899712,1375731712,1919252069,83913075,-1946155776,-1711271424,33554690,1868137040,1634541685,1869488249,1634738292,539915123,1987005728,1752637541,543519333,543516788,1936880995,1763734127,543236211,1936683619,11891,1638460,917536,66203,1333809155,1828716651,-2143289344,285218310,1258328064,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,262018,234881024,134254592,33554176,-2108685824,1702258002,6910834,570435072,134234112,33554176,-2108685824,1936876886,544108393,825241137,327680,8650799,-65527,1342308353,1886339970,1734963833,-1457490840,943272224,1293954101,1869767529,1952870259,1919894304,11888,3866681,917536,65537,1333809155,1828716651,117440512,1702258002,359232370,1702258002,543781746,1667330640,1701013876,1835091744,1632633957,1494053747,1830843759,544502645,1936941392,1701401608,1835091744,1868106853,1867260021,1646294131,1493901433,1461745007,1646292591,1091051641,1953853282,3026478,0,2004055149,1802398835,1802134381,-1073545216,-1073545216,-1073545216,-1073545216,-1073545216,-16580608,-1,-1]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[9591373,77,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":9,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":10,"data":[279886,23724451,191394610,458758,268436480,65964,458752,196615,4194478,25165944,26345868,1805,131131,0,0,0,85983727,85983568,1559692130,1559818608,198056837,198177136,47914649,48034096,305078137,305197360,43656310,43708720,80094517,355860497,-2147287036,1,161087488,-265289663,32769,-2147221504,1,165347328,-265289713,32769,-2147155968,11,166330368,-265289716,32771,167116800,-265289719,32769,167706624,-265289716,248,168493056,-265289720,32770,169017344,-265289719,32776,169607168,-265289719,32775,170196992,-265289716,32777,170983424,-265289722,32778,171376640,-265289705,32772,172883968,-265289686,32774,175636480,-265289704,32773,-2147090432,3,177209344,-265289715,32769,178061312,-265289703,32770,179699712,-265289724,32771,-2146893824,1,179961856,1048578,32769,0,1279543567,1447121735,1095254853,1397049166,1380275208,1095649613,76,524289,100663308,1314014539,1191398469,1426344260,55723347,1070399999,17412866,-972734515,1070399750,17423621,33503232,-620412979,1070399746,17041925,-184205363,1070399755,17783045,-536526899,1070399748,16898565,939671501,1070399800,17153538,-553500723,1070399492,138758,-1056620595,1070399505]},{"sector":11,"data":[19716,33832909,1070399489,4,-1576714291,1070399488,4174850,201473997,1070399550,206341,-1660600371,1070399489,68102,1694646221,1070399537,6018306,2046967757,1070399554,3506690,1342324685,1070399553,4333314,2013675469,1070399489,2932738,1526874061,1070399532,2940930,-972931123,1070399534,3018242,620904397,1070399532,3141634,-1929232435,1070399536,3154690,1342324685,1070399536,2879234,-2097004595,1070399532,2158338,654458829,1070399528,4529154,-167624755,1070399556,3557378,285360077,1070399495,710147,1040400333,1070399498,9217,81869,1070399488,2988546,81869,1070399489,3,-469614643,1070399557,5226242,839008205,1070399566,5057794,1766662656,1936683619,544499311,1684957527,544438127,1819308097,1952539497,544108393,1836213588,1175126016,1279345486,1128350284,864843,1414415878,122507845,1313212160,1313818704,134220101,1312902726,1380276051,1174929418,1397310542,89018179,1163135744,1314344274,1330794564,134218051,1095978566,1396786518,1174994947,1346454350,1163023700,1174798342,1297040206,150997069,1313428048,1330794580,100666179,1347374662,151109,1129203211,1112296513,827016001,1828716556,1167087646,518818645,1996478606,108461832,-15960321,417860214,49120004,1562371467,576077,1167087646,518818645,1996478606,108461832,-15960321,1407715958,49120003,1562371467]},{"sector":12,"data":[576077,-2081649835,1996428012,175570700,-16222465,1996424822,-26108,-1073020928,-1070900875,-2097115159,1947398270,809403381,1198784533,355481343,354039551,384714381,-26032,-1073020928,2122396021,1963000048,-193528042,-887041,-1709887434,65535,184992899,-1928038976,1343680070,16777114,-297366272,-6664170,-1929379585,1343680070,1347469355,112720,-26032,-1073020928,1048810869,1946162480,1748927458,-613089279,24002179,-2853888,-15388618,-1877775306,583694,-443824661,705117,1167087646,518818645,-326903666,1916699402,914292737,24381127,1996423168,328775686,-4698082,-6664192,-1560280833,-1073020558,1996429439,1354771206,-26032,-1073020928,1923156084,-1546062079,1048772978,2113929586,142016291,-1191086943,-1056762984,1347607180,24262399,16777114,-163149568,24380929,24249897,-1962742397,1297948645,1226,1942235995,920188696,656953,959844215,1979714566,212022788,-2061568,-1140870941,-1329856848,-1705993987,65535,16777114,1958742784,1845937963,-1996488700,1459904526,1381172822,855713768,-6664000,1459618047,16777114,1958742784,-26417145,27322448,-850591816,-1957313759,-18196,-1957313699,-18196,-1957313699,1354771436,-1710983425,535,-1017256565,-1192457387,-1957691328,1861682246,1318735878,-1962934270,1438866917,1996483723,108461828,1342193848,16777114,1575324416,-326412861,-1710983425,605,-1017256565]},{"sector":13,"data":[736922453,1996443840,-26108,-443875328,-1957313699,74907628,16777114,1575324416,-326412861,-1710983425,710,-1017256565,-2081649835,-1070923028,71732048,-1706012007,65535,-1929492855,735087578,1575324608,-326412861,-16585597,-6683018,-1996488449,-628294074,-1070870389,-1017256565,-1275051,-6683018,-1962934017,1438866917,1996483723,-26108,-1073020928,28837236,721611520,1575324608,-326412861,1347469355,16777114,-402345728,-443874901,-1094991011,-990150396,1393062660,1130043391,-1007490237,-1207958341,567100416,-1024062862,-2147126144,1074041487,-1007912629,567095476,-1023118173,74319502,741772070,889239552,512303565,109839458,521012324,-1171980104,567083424,-1274115274,908256004,79038149,-617358708,-1306591434,-385649916,-986251703,-1945847290,244698,-1306591434,-1021372924,855643321,-1836583205,74711300,567099060,-1007492541,-387151019,1996423504,18147332,-1017256565,1475119957,-13413546,184960651,-149783104,72780759,-621291273,-1996488675,1451820614,172395268,310231051,1452005367,-136775928,7642,-1995815287,-1073018794,1317738101,105286408,-235417037,1183570059,-1947076860,-1875055661,1317787787,106334984,-788248949,-774254101,198758890,-134973989,871402481,-11513134,1996425846,14477320,1996903995,990409223,58065990,855764611,197561298,-150506241,-2082932774,1583022298,146955615,-326413056,-617392553,184960651,-149783104,72780755]},{"sector":14,"data":[-621291273,-1996488675,1451820614,172395268,310231051,1452004343,-136775928,7642,-1995815287,1317734486,-1948125436,138841080,-503844725,-141100541,-134019482,-963913845,125098763,-654845193,1577114243,146955615,-470994432,-773140218,-1006968104,-387151019,1021837416,1961102077,75399178,-972786432,519963718,73537221,-853213000,243998497,132318388,-16776517,-1962626530,1286865990,-994369075,-990150396,1393062660,1130043391,-1007490237,1458342741,-1962260853,-503905202,1183570059,-135230712,-1764097055,50751223,-1949070376,-1034068282,-994377720,-956595964,1393062660,1130043391,-1007490237,16973845,196814,16973933,196785,16973937,65960,16973825,196795,16973938,66048,16973829,66093,16973830,66108,16973831,66156,16973834,66180,16973839,66207,16973841,66231,16973844,197073,16973829,66273,16973849,65995,196638,16712037,196655,16711840,196656,16711774,16973873,196742,16974002,196922,16974027,65965,16973915,196903,1953300684,-2081649835,727057644,244338880,188804840,-12815168,347604086,-1070903296,-401698736,1183396163,146942,104671604,1023898624,594804743,45617131,28856320,-1080406016,-1962934272,-25263120,184841473,-1950059274,722070470,-1091638282,-370475007,1575324510,-326412861,-1202393981,-1924136880,-397365690,-998033630,1958742788]},{"sector":15,"data":[112645,-1070923029,-5486967,1771701366,-1996488701,-1202651578,-2091909112,1946201214,-339727612,112643,-26032,-443875328,-1957313699,49054700,-1996337503,79232582,62410752,1067077632,184549377,-14125888,1085801590,1319194626,-28952318,28837236,721611520,244338880,725695720,1085821120,244338690,-1959186200,1438866917,1183575179,474374,32047989,-385647103,20775399,-385649408,37552458,1026782208,57999363,1023443433,57999364,1023447017,57999365,1023523049,57999366,-385767703,62390779,45633536,1318735872,-385875967,28836331,-1070903296,55024208,-1039466496,-655817867,74907393,1342183608,-1873756117,805169166,1946158653,29485315,-2096859393,93758,28837237,721611520,1541951680,1975520069,27650307,24002179,-385649664,28835986,9365760,316030592,-15764480,-692583306,244338706,-381705752,45613439,28856320,-8197376,-370670474,46433278,-1207866647,-1202716666,1827209221,375039,309328,-2080414999,93246,28837237,721611520,1996443840,912320516,-1559968637,-692584084,244338706,-382499864,1996423471,1849590532,91553793,-352321096,1354771202,189057512,-385649216,1048772883,1962934638,-9508605,1856225323,16902401,24000255,-402360577,-998034193,15853828,-381390872,922681579,1996423530,15067140,-1559968637,-1628765846,23740035,-15698944,-16684490,-857209738,79987456,-1207866717,-1202716671,-1873804932]},{"sector":16,"data":[933488654,24002179,-14322688,-1070922634,1146415184,410304523,23987911,113704960,360,-1207666945,-1706033151,65535,1343396024,-773321072,-704199118,1085800466,-1202708990,1344143740,1342227640,-10978840,1085801590,28856322,244338688,-348174104,74907480,16777114,-11605248,-6683530,-352321281,736580,-957807755,1025146878,57999368,1040112873,57999369,1040138217,57999370,-335601175,802080,-1360460939,867838,-1326906507,933374,401146741,65617407,99156853,1575324670,-326412861,425603,146281077,129519616,-6664192,-1996488449,367724102,425603,28837237,721611520,105286080,16777114,74907392,16777114,163074048,2122534912,91488262,-352319304,1354771202,16777114,105286400,-1017256565,1575783253,-326412861,1023821451,208929280,1946288445,33701141,904603252,-15960321,1996425846,1404299272,1996433387,-26108,1996423168,175570700,-402098433,300635103,16777114,209125120,-16091393,1458047094,1575324499,-326412861,8711297,1589925463,1065362950,-385649408,-2033778546,65406,-8470909,-1005290113,1191118430,126494214,-8470901,176178056,-1958054464,-956334402,-16744381,1183646838,244338816,-1958850584,1962281968,112725,37795920,-401698736,1996436961,1619972,1354771280,417861264,408877,1996436597,1849590532,192217089,-352321096,2122776328,731245567,1944604864,1958742850,1849590549,91553793]},{"sector":17,"data":[-352321096,-1547687166,48955758,-963906005,-443850914,-1957313699,49054700,-1070901673,78551632,-1181155328,-101253040,-1996071285,1030151,79272528,79233024,-259305216,312474,112896,-1694987439,65535,-970209493,1685913,1586231799,1577552132,1575324511,503317698,1430622296,-1910575989,149717976,16271047,207537152,138906406,-1996029146,-1960379834,1183386183,106874108,653936267,2114078521,2139301461,1232338952,138885414,-1960435842,958792775,964626503,654067339,2114602809,1200301621,1194927622,-349471222,106873892,653936267,2097432377,1194927622,-1005095672,1183516254,1194927868,637959430,2081048377,-129579259,2122514433,695468280,-1962522997,201656406,-11513344,1996427894,3323920,1438443600,-1962516796,-1993934266,1183516743,1200170748,106873866,105351974,172439846,-1960441227,958792775,91490375,-352321096,-2084558078,-443874579,-900899553,1478361102,-1957345904,-661774612,638607044,605112202,1963015171,106873890,-1959264474,1451954246,1180946,922701906,922682582,1392903380,438682,-1207702784,-310181887,535137026,248139101,-326413056,10022017,16402119,75399936,-385649408,2122514617,57999366,-16731927,-6683530,-1996488449,-1072981434,-1628896395,108461824,1342190264,-9927027,-6664170,-16776961,1996462710,-26106,1996423168,-632910438,-6664170,-1962934017,1174657606,-1673098782,1352681101,1352550029,-1191306264,1861681155]}]],[[{"sector":1,"data":[-1036805732,45728299,871944960,-1983763518,1178196038,-1996259682,1187487302,-956301150,42054,731543295,-11513664,-16461258,-1929064394,1343658566,16777114,-1568767232,-1928498176,1343661638,16777114,-96040704,-16484609,-6645130,-1962934017,-443811258,-1957313699,75400172,-2094500864,1382462,922683764,-6679272,-2097151994,1281598,922683764,-6679666,-16776961,-6683530,-1962934017,46292453,-1873273344,-326412987,-2082959842,1183516396,315925262,-1157627976,1347616767,-1710328065,1863,-1996173149,-1207643626,-4521985,-11513089,-6680970,-1560280833,378078420,1183515862,173443848,-1996171101,-16459242,-1628959114,1975520043,-373282043,2122514771,2020933644,1342193848,1342184120,16777114,-96040704,-512442357,-1202667477,1385791232,-26032,1586167808,239569402,-1207011585,1385758721,-26032,1586167808,206014970,17975239,340248320,1857552384,373786899,-1961336948,1200164422,509706,38258432,1204289535,-1946157308,-1706025277,65535,-2055946229,-1694861569,65535,-1207011585,1385758721,-26032,446889984,1975520021,-10098429,504590008,1095760,-1070903266,1375796410,1347440720,1342203064,1347469355,1343125247,-26032,1183383552,1975520252,-13244157,-1206570845,-1706033139,65535,185931939,1348039872,-386107649,-997982793,328114948,-11668760,-773260170,-59310322,1342177720,173210,242679552,16777114,-59310336,-2080904472]},{"sector":2,"data":[297272004,244338688,-1205010456,-1202716671,-1873804736,831514638,-231681,664405622,-1207959541,569049089,-1202667477,-1202716662,-1873800362,683010062,-1694730497,1799,355468999,-1461125120,49120254,1562371467,707149,-2081649835,1996428012,8886788,1183383552,1975520254,12183811,702544,1748927312,91488257,-352319304,1354771202,229786,-129579264,1996423169,-26108,-1073020928,1187455860,-16776972,-6622090,-1996488449,-1072958394,20777588,-940804864,63558,16777114,-163133696,1048772609,1946157422,1748927250,192217089,16285315,1187448181,-16776970,112787062,1996443648,157915894,1996423168,506110,1354771280,628634,-163133696,1048772609,1946157422,1748927239,208928769,188903656,-955943488,63046,-1191282945,-11534331,-1566902666,-352321536,74907408,1342180024,1343444664,-1192751472,1575324455,503317186,1430622296,-1910575989,283935704,1024214667,57999386,1979802601,39184643,1023410477,58064916,50387689,-13724736,-15991897,-1070920074,-26032,1183383552,-1070903044,-1202696112,-1202715673,-1706032896,2584,737965823,79188160,-1202708971,-1202715671,-1706032896,65535,166445099,-401967361,28840836,-372102400,-236453274,-1447142,1743261302,46433071,-596328437,722293224,-6664000,-352321281,808910799,793569301,184730755,-4098880,-401264586,-997984866,1958742786,808910771,-60102635,355468999,-1528102912]},{"sector":3,"data":[24118983,1996423169,790423566,184730755,-7244608,1877479030,46433269,-1904885749,24118983,2078867456,176063487,-1207601919,48955393,1654898731,1958742785,242679575,-15960321,1996425846,108461832,16777114,29944064,-384249880,1048837962,1962934292,335988542,-16776960,-16459210,-16459722,-186118538,113542136,443924491,1342182072,-2048389488,37795882,2092453918,-1202708991,-397410108,28856370,244338688,-13244696,244321910,-14540312,28839542,-6664192,-385875713,1996488430,-181540850,-385694589,2122579682,91555596,-352321096,1354771202,518524560,-20125408,-16222465,1996424822,242679562,-2081057560,-1209464636,176063486,-385649408,2122579630,57933832,-88599,-6680970,-385875713,1996488346,108461832,-16091393,1996426358,-134354930,-385170301,1996488322,175570694,-1878100225,715188238,-385432445,1996488302,175570694,-401705217,-320132350,-16353537,1996425846,1043326990,1996480235,175570694,-401705217,-789889313,-401705217,1005190382,176062974,57934825,-1191261463,-1202716669,-1706033150,63,-469884439,-1257622775,-1593133814,973825290,-1257555445,-1257589494,-1257589494,-771050230,2013941002,-1257589494,772415498,18169098,678924916,1962999869,-10032893,1963000381,-9246461,1963004221,-15931133,1946227261,18103704,2045313909,-27137537,1963066173,-37689085,373103479,-385649407,4063090,-385649918,37617223,-385648894,1021968140]},{"sector":4,"data":[33832446,32047989,33963519,-1813445771,83901949,-1947663499,-31331843,-1962742397,1297948645,1426066122,1183575179,138819846,1183516796,138819844,1183384446,138840840,-1034033781,-1957363706,1988843244,-1961063676,1200161348,-1948742910,-1995994876,41191732,1575324510,1426064066,1448602763,-1962510709,1166738558,38045954,1971928201,-1982297342,-1956684233,79846885,-326413056,1460071555,140413782,1081219,2139838590,108432142,-1962641917,-956100537,972834441,712967806,645855035,-953432437,990135945,209457223,1066951,239585024,652935168,-1962385781,1191248966,273099022,1183521003,105265660,-969207683,1183517823,140413702,-1995552981,1586171975,276792072,-1591771392,-667221990,-661974411,446891915,138819840,113706613,26,-402098433,1600061228,-1034033781,-1957363706,82609132,294531,1586195828,276792072,-1962511104,1200162374,140413710,51267467,1183387719,105286654,-1996208637,1183579206,239548678,1200292735,140413710,-1961998455,1178205254,-1962574082,65797702,-1946401141,1194002526,273123598,989862561,185758936,1393456320,-82968,922683510,-756547558,138841086,-1962927453,113401317,-326413056,1460202627,972434262,1333529718,403472003,1586186623,-1948004084,-1961988417,1982532213,208995082,830404107,-1928706421,-1056763315,1183439500,-61437446,2114221625,74877189,1988821995,142016260,-16353537,1996487798,74907642,-347288088,-1946801406]},{"sector":5,"data":[-1956684090,180510181,-326413056,1443425411,818819,-1310129283,209617664,-385647080,2122514600,58523658,-2097111063,2119109246,9890051,-787718517,1854376931,-62486258,721440952,-259323322,2097444409,71731973,-963968277,200820361,-1955627328,1174604358,1181180,1996443678,108461832,-386369793,1586187350,209683452,-1962511104,1200163398,-60912886,51005323,1183386695,172395518,-1980217853,1183578694,172439818,1200292735,-60912886,-1962260599,1178204742,-1962574082,65797702,-1946532213,1194064990,206014730,175570771,-386369793,-1956708776,180510181,-326413056,1460464771,-989910186,-1960441250,-196703993,71797542,-1980479957,1183578182,-96040460,38243110,-990099831,1183517278,1194927868,1346534918,-362753,1996425334,71731974,2113422905,-129594619,1183515627,2095599620,66096126,108397054,-2096859607,2113930366,106873870,637945599,-16119866,-2092497842,2130707582,-339244284,-62456059,1600039403,-1034033781,-1957363702,116163564,173968214,819075,-1159134337,172460800,-1946270071,1174603846,-96040698,51136395,1183448646,-28931076,2131248697,-96061130,1183396222,-96040184,-1995946453,1195050566,-1961722868,1183386695,206030598,1204224000,-352321526,173968201,17188491,1193871943,-1959007476,1178205254,958102792,377289286,-1995946453,1586169414,138840842,1143731083,206014730,1586174187,-96040182,2131380025,-62485752,2080917049,105301765,2122514432]},{"sector":6,"data":[595460102,294531,1996426356,142016266,-402229505,1183579404,172360456,503321093,108461904,1581957608,-1034033781,-1957363704,108462060,-1202667477,-11534256,434635894,106859519,17319879,75399936,-955616000,4167,935879,1575324416,1426064578,-326898549,1586189830,-1995994362,1586232902,-1995994364,1586231878,71797758,-1946401143,1150024310,71796996,1183571595,71797244,-1962516853,-1962440250,1183515742,1577552382,-1034033781,-1957363708,351044588,1187468887,-956301066,63558,16402119,-62470400,1187446784,-956301058,16783366,-330905856,1187446784,722366192,-262239233,49301123,2088974219,91488264,-336050433,734497625,1183385156,-58817550,-1995606784,1187510910,-1996488196,1055653446,66733707,-952370106,1183518069,-28952078,1191118197,-1960317956,-163173433,-506231,1183646838,1575506166,-330921728,1064681483,-1980610933,2122972742,-62470150,2089353217,138725126,-2092498944,-2055333633,1177274251,-129594890,2122519531,327024888,-1929087233,-397347258,1183383584,-327253012,-941132800,6150,369542912,-1962934272,1600056390,-1034033781,-1957363710,317490156,1988843095,-263796988,2088960000,58654722,-2097085207,2130708092,8841475,556163,1149971326,138685188,-1946270071,1141048900,-196703992,1183384715,-28931086,1183384619,-193033234,1006761987,-352158679,142377836,-1960280832,1183384644,105155582,-1995946965,76280902,-1947056503,69928004]},{"sector":7,"data":[-1947318647,-193068040,16940073,-952177860,62534,1183384715,71601138,1183384619,105120750,1183515649,105120750,-956152791,1604,76224491,-1947056503,1183384132,-196687890,67174400,148679,-193035520,-1960610816,1183448646,-163133448,1174601728,-62486028,1358579399,108461824,1358317197,-402098945,2122517493,796131566,-1980610933,1187510342,50331894,1183444550,-96024580,1996423248,-163148538,971526166,-263812853,-1928956161,1343682118,-956114456,1604,1592805003,1575324511,1426064578,-326898549,-2091493572,2097154174,23259395,50873995,423429702,-385647104,113705300,65558,-16222465,1996424822,121169924,294531,-1880554628,71731968,1183439095,141986564,-964565295,-41218450,-1992495229,1183578694,-96064762,-335657335,1183427874,-1948742660,1191312966,-1070902524,-50141104,-939762037,67655,92914571,-16595069,2122578510,-713228038,-787972469,1858568679,-1391203570,-1946401143,71732184,-1962653911,-2096789053,1325335239,-25263106,-1947960064,1022264309,-2096869633,2097153150,11725059,-2096789075,-320142649,294531,-1578564737,141986560,-788105725,1858503142,71731982,-1946532215,1177224774,-28931590,-788234613,-2080570393,619396335,-1962742141,-62486268,1354771280,-1946391576,1204288606,-1962934008,1193934406,49251076,92914571,-2080747777,2097216126,142511059,-788103677,1858568679,-2095584498,76219118,-1946401143,71732184,-2096871679]},{"sector":8,"data":[-1014299921,1325335945,-25263106,-1948222208,-422509450,-293341949,-2096436420,-293403921,-1996190974,72285957,294531,1600056701,-1034033781,-1957363706,250381292,556675,-605486219,73319424,41418534,-1202667477,-397410280,1589966801,1200170500,2013210114,1354771206,1342183864,-990397208,-1993997218,-14285241,1354771255,1342197688,-990402328,-1993997218,2013210119,1354771204,1342197944,-990407448,-1993997218,1048773703,1946157078,1200301603,1194010118,1334519298,254486020,1363012087,-955810560,129094,1996428779,-69015544,-16222465,1996424822,151447556,-990361975,-1960442786,-523173305,-1995543035,-1960379322,723911751,-230258425,38243110,-335919479,-60912865,50087555,1183385483,1589924094,939468292,-887041,1240004726,-96010246,-1962647868,958855750,-713095609,-1034033781,-1957363706,149717996,-15829249,1996426358,142016266,-16353537,-1326971786,608076559,913637376,-1995684213,1183578694,-129595126,1074546315,-1946270071,1174604358,-62486268,-15829249,-16769482,-16769994,-16768458,-1929371594,-397346746,-443874351,836189,-2081649835,1448546028,-402098433,1589903552,2013210116,1354771202,1342183608,-1980332824,1589966406,2013210116,1354771206,1342183864,1224110312,972703369,58652230,-1962899479,-523110842,-1995543035,1586232390,-62487556,-1992848638,1589968502,1066083844,2097839161,-339244284,172264195,-1946925431,1141049924,-129595124,637820612,2097432377]},{"sector":9,"data":[1200301574,-1962677500,1177286726,-230258188,729726987,1588867,1443525632,1358198527,-336134168,142016282,-624897,1183577206,-28965900,503321093,-227082416,-71704,1183577670,-163169798,1600029822,-1034033781,-1957363706,116163564,406750038,1333067776,1457795,-12487680,971506806,-1959138310,-1962927586,2088960631,578682896,-1996209013,1150024774,-96040690,-16484609,-1924072330,-1056763316,1347607180,-401574657,-11075960,1962872436,-169744368,1719939,1589671168,-1034033781,-1957363710,82609132,-164932009,-150969672,-2114417682,-1962615609,-1981558306,-1995542849,1971913845,138790662,1032388608,-956138103,2629,1342981575,239453952,1170669568,1459617808,-397361109,1170733360,-956301304,3141,419332934,1996468862,218294276,-443850914,180829,-387151019,-443871887,-1957313699,82609132,2122536535,1451098116,556675,2122535036,1249843208,425603,2122531964,1048530694,-787980661,1858046947,175475470,50755115,-167048075,1983457406,-1996259836,1586168950,306285830,-1957277666,-654900154,1133045840,108461911,-174135210,688146059,1599999045,-1034033781,-1957363706,183272428,75400022,-385646848,2122514667,58523660,-2097093911,2115505278,14280963,687747,-790035587,176063232,-385647025,1586168007,-1948004084,-1995542905,1183579718,-28966134,-1996484091,1586296902,172395514,1023690243,159252560,721440952,1183386182,-27358460,51005323,1177226311]},{"sector":10,"data":[-163149558,92127243,16139975,71731968,-1980348925,1183579206,-62520566,2113949757,5289993,-1995815381,1996487750,-126418950,-231681,-873986954,-92864702,-493825,1996425334,74907398,-1958576664,2139356766,91553804,-351648117,-27358442,956974731,92080711,-351647861,172395267,-1979818357,1586170439,172395518,1143731083,-62520566,1393313673,-16091393,-1779893130,-443851020,705117,-2081649835,1183515372,172374278,1187448702,-352321026,105286421,1963607609,71731976,2131248697,-28915735,1183514624,1575324670,1426065602,-326898549,138840836,2114733625,172395272,-351512949,138840854,1963738681,105286408,2131379769,105286632,-1995942261,1451883590,73305086,1468598153,-1933341950,1575324626,1426066114,-326898549,138840836,2097956409,172395272,-351512949,138840854,1963738681,105286408,2081048121,105286632,-1995942261,1451883590,73305086,1468598153,-1933341950,1575324626,1426066114,-326898549,73304850,956843659,58589767,-1962886167,1194921030,-385646842,1194918064,-1962181118,1183384135,172410636,1586167808,138840836,2114340665,8907011,1208371083,-955758967,5244486,1183545835,-263812852,-1995815285,1183575622,1183399948,138841076,1963738681,105286408,-336443767,-230242555,1586167888,-1948003856,-1995542905,1183577670,-96040464,-28931776,16271047,-161576192,51005323,1183386695,-297366020,1183666198,-1924131090,1343682630,16777114,1958742784]},{"sector":11,"data":[242679562,1357792909,-956082456,2630,-1962129665,1178142790,-385646836,-443809924,836189,-1947432107,100729926,100728862,-1073020894,1048783486,2115502114,537315147,-956280832,402661894,507413248,947787776,-1962925919,-1560272362,378077212,686489630,1982083,-954106624,7686,470206208,-2097152000,8766,480317053,504793856,2138880,2233993,-1034033781,-1957363706,106859500,-1962926943,-1996481002,39291143,-1593549173,378208288,126418978,1560434569,1426064578,-326898549,-129594080,-1070903274,431509584,1354256384,-6664192,-2097151745,5694,1996424820,-171251700,-16091393,1996425334,74907398,1357661837,-1946280728,-1962439720,1183384151,-229209616,-16091393,1996425334,74907398,1357399693,-1946306328,-1962439720,1183384151,-162100748,922701906,922681374,1183645724,-555200284,-1948742659,39291655,-1995946359,1996425814,-260636686,2242303,2111231,1356875405,-1946322712,-1962439720,1183384151,106334468,1980159,1849087,-624897,669578358,1975520253,-227082475,-1018113,-16768458,-402644938,-1072956142,1996434292,506920716,473366272,574029568,540475136,-129594112,-38803376,-15960321,1996485238,-159973392,-336300289,209125245,-887041,922742902,922681374,1183645724,1122521320,-2585603,939459191,-887041,922742902,922681374,1183645724,-488091412,-2585604,939459191,1358448269,-172824,1996426358,-193527818,2242303]},{"sector":12,"data":[2111231,1356875405,-1946353432,41418712,1996437503,-193527818,2242303,2111231,1357137549,-1946378008,41418712,1183660031,451432696,-263812099,-1544399221,378077212,1183514654,-162100236,-1996480349,956310038,209055814,1178190475,-1207601678,48955393,614711339,1575324416,1426066114,-326898549,75399942,-2089518080,2135884926,71732078,3409451,245640951,-1577433463,103481400,1183383604,71732220,-1962920797,100924486,950206516,3449088,-1593819997,1084424248,808910592,-26091,922681344,1452938544,-16777187,-1961545674,-654837178,1354771280,1347440720,2068122,808910592,527473173,922681344,-6679248,721420543,1575324608,1426064066,-326898549,808910594,103258645,1183383552,922702078,1318719144,-16777210,28900982,-6664192,-16776961,922746486,922685090,-6680928,-1962934017,-443810234,-1957313699,641631212,527695872,355481343,504596152,-26032,1996423168,327596036,922701854,-2003173338,-1962934242,46292453,-326413056,-1928795005,1343682630,503329976,71732048,580538398,184549406,-1928039232,-397346746,1996426323,-129594106,1150963734,-2097151970,10302,1183659636,-1202710792,1344143420,503596683,510433872,-1073020928,983637620,-96040704,-28931776,1358448269,-15984920,1183647350,-1706027272,65535,-1034033781,-1957363708,183272428,2506371,-1921354752,1343682630,503329976,108461904,-1710983425,7844,410304523,1358448269]},{"sector":13,"data":[-16001304,1183647862,-11528456,-1711266250,7882,2637443,-1925483520,1343682630,503332024,108461904,-1710983425,7953,578076683,-1996473695,-1992230330,1183710790,-1796714248,142016267,385369741,641138512,-26112,1187446784,-352321290,-163133691,1183514625,1575324662,1426065090,-326898549,75399946,-385649408,1048772777,1946157410,10479875,33441479,-163148544,884494358,-1957683712,1344144966,2049946,1958742784,675185431,963903488,-1593418101,1194917954,-13730810,703331398,2637443,-1926794240,1343682118,503332024,105286480,1905938462,184549402,-1592822592,1183383610,1183400184,-28915716,2122514432,930414846,1358317197,-16062744,-1709887434,8087,355481343,-1957642197,787940422,-1924133210,1343682118,385238669,-26032,922681344,-6679248,-1962934017,113401317,-326413056,-1560000885,-1034092502,-1957363710,317490156,721435297,-1996474874,916584006,-230258432,2080654905,-163183864,2130986555,-159481082,721777920,17689024,2637443,-1593281536,1178140734,-2081655804,2080375934,75399942,-1207534056,-320274431,708739840,276037632,-772389237,-2131176968,-1992278044,233567302,32786119,-1962480896,1177154630,-230257678,2080654905,-1962480654,1174533190,-230257678,1005995523,-276954042,15892099,1187448189,-1962934030,1174663750,1588726,414714238,-163173632,-1947056503,103543366,1183383606,-230257682,50345635,983823942,-96024832,1187446784]},{"sector":14,"data":[-1962934024,788002374,1183387302,3711486,3409451,245640951,-2080618871,2080435838,-297366779,1183516139,1004074990,360511046,355481343,385369741,112720,-26032,451477504,808910847,1354771221,-135379317,-1506871336,1183666190,-1924131080,1343682630,2299290,808910592,555522581,-286720000,1575324670,503317186,1430622296,-1910575989,250381272,-1996478303,1178203206,-385649402,45613225,-1070903296,244338768,-16314136,-1709887434,7479,-1979954968,2122576454,1081409542,3979344,434655262,671533053,-16777216,-16764874,-402640330,1048772876,2098790450,3842381,1090012809,-1577302391,1183383604,3711478,-375159,1183707766,720049910,3292803,-14189056,1018753654,-397402624,113769680,65576,3159807,3290879,-16727064,1018753654,-397402624,922743906,1996428592,569285362,62390272,-1070903296,244338768,-1962511128,-310119354,535137026,46812509,-326413056,-1591284605,1178144424,-1954712572,-1465711546,-74192882,1356482185,383665805,106666576,922681344,1996428592,114268890,1183514624,-431619106,-1961974109,-1532762042,327983374,327681579,-1508996199,-1980106994,-1969103802,-2046416109,244029715,-101249372,-1191295351,1364197381,245774079,-152564080,-25755899,-388204801,922681368,-2034756304,-1202708973,-1706033151,9106,-1034033781,-1957363710,317490156,2123191895,3456758,-1515911402,1183557029,3318532,-1559869813,100859952,950206516]},{"sector":15,"data":[675185408,594804736,294531,1325342078,1040631556,-956295168,419447302,3449088,-1593819997,1084424248,-954275072,419446278,1107740416,-1593829120,1017315380,3711232,-956284765,10246,75399936,-955941352,1573958,50611851,-1560267258,406650938,-955286016,402668038,1619968,-1560000981,916521014,-129619200,201213577,-1591575104,1183383606,808910840,1354771221,-134330741,-1506871336,-1070903282,1347440720,1920410,3842304,2113685049,675185455,1853095936,737953419,788002886,1183387302,-1509555208,-62486258,737822347,788002374,1183387302,-163133446,887816192,956316321,1048509510,2637443,725054464,-150981114,-1995528658,100923462,1183387302,-163133444,950075392,872819456,-1506871552,-96040690,355481343,385238669,112720,548837968,1599995904,-1034033781,-1957363708,149717996,1342177976,1347469355,1994919568,-129595132,-371063,-1206570954,1344148358,1949338,327983360,-1508996199,-1543899378,-1969156432,-1543109869,-1952888818,-150035442,246326265,2113949501,5289987,3409411,-1560266589,922681408,-493218512,-1593835488,1151538054,327852288,-1593816925,104398922,394138508,-1558999903,922681418,1152914736,726670848,1385844928,-1593835484,787943088,1185091238,4890880,327943737,-1935599491,4891411,355481343,503334072,112720,575183440,922681344,922685102,-236450128,-92864515,-1191491608,-11534332,1996486774,-401698566,62391217]},{"sector":16,"data":[-1070903296,244338768,-16538392,-401264586,-443865207,-1957313699,585925612,-1207923736,-1706033139,2108,-15816541,1989805174,-1996488675,-11477434,-1710315466,9947,-1207666945,1344148358,2343322,-562626816,383796877,568498768,1996423168,-562626812,2204314,-532247808,-1545058813,1183518374,245670890,-1726772575,245632651,-1588528649,-1952902260,-150034930,1307070713,1575324669,1426064066,1048833163,1946157094,641138441,624007680,-443875328,-1957313699,641631212,158597120,2504447,454554,374784,625646160,-1432158208,-1407809266,571406,-26032,-1599930368,-1575581426,-1405681906,-1439236338,-26098,648216576,1575324416,-326412861,-1956320125,1183386694,172395514,-1946663287,-1992291258,1183579718,71697162,-1912846711,1343659078,385369741,3455056,-1113960418,-1996488667,-1072958394,1048780405,1946157096,-1673097961,1183666198,-1202710792,1344143420,1961882,-196704000,23215747,-385649664,2122514681,57999604,-1593773847,1178140734,-1593150050,1183383610,1183400094,-1673098334,17450539,1183516230,-1673122912,-1929099639,-397370298,1183646799,-11528540,1996425334,75399942,-1962574512,65733702,1342197944,-1992959512,1996486214,-1673097970,922701846,-811991002,-16777187,1996426870,-1636368484,379864717,74907472,16777114,-1639544064,-1962129783,1183423558,-159481078,-949193728,63046,1589920747,105316102,-2146961882,2122519412,729088246,-1995815285]},{"sector":17,"data":[1187486790,-352321034,-159481058,-1961331712,1183386182,242679712,379340429,650353232,1187446784,-1593835274,1174474404,72285962,294531,2122560637,326369526,-1995815285,1996464198,-1673097970,127553558,-1962934242,214064613,-326413056,-15143805,922684022,-2087055704,-16777187,28838518,-1885712384,-16777187,922684022,922685090,-1617293664,-1006632931,-1960442274,1183384135,126559994,-2080881015,960062,-1499396482,48973838,1589952555,1191388678,-28931834,245644931,-1593410048,-347599196,-994039038,52823646,1183384647,-129593860,45213776,384321165,3455056,1183666206,-1706027272,9627,477413387,294531,1996426100,-398029558,-504868842,175570934,384321165,-293279664,2637443,-1590332416,1178140730,959283194,679411270,-1996472671,1117911622,-28931840,294531,1996426100,-129594102,-1511501802,175570934,385369741,-297211824,-1034033781,-1957363704,49054700,3455062,1996443678,74907398,2615962,200313600,-2094828042,10302,1018698868,-11526656,1996424822,-26108,-259325952,108328459,-1996473695,-167049658,1996428148,74907398,-1996305944,1451820102,-346927098,327852298,-1935585216,-1706016749,65535,1575324510,503317698,1430622296,-1910575989,82609112,1024083595,58064906,50439401,-13724736,-2094412377,19518,-1830222987,685611521,1048772608,1962934352,245670256,734147481,178626,-1036781357,-1992244693,922745926,-1070918352]}],[{"sector":1,"data":[-59310256,245774079,16777114,1312719616,57999360,-2097064727,963134,1256784765,808910593,692427285,113704960,65618,5650175,5519103,-369162264,1048772909,1946157132,19130627,4982471,1048772609,1946157136,245670288,1048813035,1962934348,17295619,16777114,1376175872,-956301312,19462,15984896,246550271,1074705057,-420936844,1379828480,57999360,-16720663,-1709887434,7470,5375687,-890699776,-1308164352,-385649650,1048772801,1962934348,12052739,5127811,-385649408,1048772781,1946157138,10742019,355481343,2718362,1376175872,-385875712,113705105,78,113746923,65614,4996739,-2088995840,21054,1048802677,2080378546,808910702,492804629,922681344,922681430,837288020,-1950422018,1419970630,105286400,-2097129821,19518,-380615308,1048837898,1962934352,1342621498,-1207959296,726663173,-1873784640,-26482674,1048782315,1946157136,1342621470,-352321536,-769083678,422113320,1193904937,1512694568,-1574350295,-1591099863,378208340,-310181802,535137026,113921373,-326413056,245776003,-2092139008,959550,1586185598,38243076,-1508996199,66713358,-1996474874,126550599,-1542550631,66713358,-1996475386,105351943,-1508996199,66713358,-1996474874,1200293447,244029700,-101249372,3409411,-1962653815,46292453,-326413056,-1962647925,103481927,787939382,1200164518,721914626,-150981626,-1995529170,105351943,3540523]},{"sector":2,"data":[245772023,-1962522743,103482439,787939380,1200164516,46292228,-326413056,245776003,-2094432768,959550,1183523454,244029702,-101249370,3540483,-1962522999,-1952906170,-150035442,872809465,71731456,-1962654069,-443873706,311901,-1947432107,103482950,787939382,1183387302,71731974,3409451,245640951,-1962654071,-1034090922,-1957363708,245670380,-461309743,71696767,-16353537,-2065169290,71731711,184964745,-955482670,1606,280263,-2093159680,10302,983634036,105265408,1050740853,105285888,1048782315,1946157096,3842317,2080785977,4104453,983632363,105265408,-1991767684,1187448390,-1962913788,1451951174,1575324422,503317698,1430622296,-1910575989,108954584,-2095549440,91710,79171956,922701824,922685374,244322240,-224024,1172833910,49120043,1562371467,182861,-2081649835,53822,922686846,922685376,922685374,-504889134,-771307541,-2097152000,53310,922689918,922685380,-1029632062,258914575,-628309757,922701906,635961552,-804861972,-1962934272,516120037,1430622296,-1910575989,108954584,-14975488,-1206927306,103481368,-1957687360,-654899642,-417339312,264111815,-310181888,535137026,46812509,-1873273344,-326412987,-2082959842,2113930878,-9639909,264255231,721426616,1343209478,-402229505,113764073,4030,-1962742397,1297948645,503317194,1430622296,-1910575989,106859480,-1961902431,-1995456490,39291143,-762526837]},{"sector":3,"data":[-1962742397,1297948645,503317194,1430622296,-1910575989,108954584,-2094892032,2135885438,142508828,-2095678464,2132281470,-16979952,-1962522997,-1096611754,-1072264945,49120015,1562371467,313933,1167087646,518818645,45668494,-1070903296,244338768,-2080681752,-443874579,-884122337,1167087646,518818645,-326903666,-21698556,-1980729112,-397345722,922741200,1996428592,618240764,922681344,-1578627136,309490,-1103691952,-1070137585,-401698801,62454537,-1070903296,244338768,-939852568,54278,-704198912,-2097152000,-443874579,-884122337,1167087646,518818645,-326903666,178210,1354771280,-401698736,1996487373,-565801722,-6664170,-16776961,1183702646,-11528478,1491656822,108462073,383665805,-26032,62390272,-1070903296,244338768,-2080728856,-443874579,-900899553,1478361090,-1957345904,-661774612,-2091193213,1962936446,108954374,-1957661696,1183386694,-1471756374,-11534336,1183688822,-1202710868,-397410223,1183440971,-1404662362,1183666198,-11528532,401122934,108954414,-1928563712,-11490234,-6642058,-2097151745,1946159230,-1404662518,-1502150832,-2096724504,-443874579,-900899553,1478361096,-1957345904,-661774612,-401019773,1996488070,112648,1815543632,1781989121,-401698815,2122579816,1098192648,721435297,-1996474874,117439558,1048772822,2130772182,81157,244322431,-1862366744,-26941426,14026439,585629696,1354771239,1342183608,1358954424,-1785624,-352267258]},{"sector":4,"data":[142508815,-2096530432,2098661502,138870531,-1962522997,-1096611754,-1072264945,-364475121,922701846,-1070918352,-1706012592,65535,125091851,31999687,-955913472,59462,-2081929589,-443874579,-900899553,1478361092,-1957345904,-661774612,-955716477,64070,425603,32047999,-767655167,58654720,-16717591,-15744970,-15745482,-402599370,113764516,210,-1962880791,100861510,1346179006,-1962574080,132843078,721440952,-1995457018,1048836166,1946157262,-801209544,242548736,-1961902431,-1559248874,378081218,-1096740924,258868495,1183535134,-11526648,-202835850,-129594581,264111619,264373803,-352268125,-1070137581,-1103692017,138840847,1996443678,-552474376,33048203,17808902,1177094214,-1103199482,1333677839,15533814,-2095090624,403685438,922687604,922685376,244322238,-1979813912,113769030,4030,113715691,5181374,425603,922688894,922685376,1183518654,138806022,-1202708920,-397410303,1187503795,-2097151994,2113930878,-14161661,13371079,1183514625,49120250,1562371467,313933,1167087646,518818645,-326903666,-311695356,1358710409,503727755,-459085744,355481343,-1694730497,11522,-1962742397,1297948645,503317194,1430622296,-1910575989,264151512,264246923,-1995455837,-955268074,53254,-838416640,-2097151744,-443874579,-884122337,1167087646,518818645,1048828046,2113929424,-1003028707,-1036583153,264413455,504327685,-801702064,-409802752]},{"sector":5,"data":[13633223,113704960,206,-1962742397,1297948645,-1873273141,-326412987,-1948742114,100730438,-310181678,535137026,46812509,-326413056,-1957313699,71759852,997474304,1023690379,661979131,1962933309,-180976,1996433780,1226758,-339727536,108461834,1342181304,1342187448,-2132275568,-15930624,179832438,-692563968,-1947407596,79846885,-326413056,1988843095,108956420,-2096607489,2113931390,1191545355,172360840,1324185024,1600046731,-1017256565,1167087646,518818645,1448597646,-1962379637,-8190338,1443986954,-1181104245,-101253110,-401698736,-259260454,-1181104245,-101253110,-2010070400,-963951084,-310157474,535137026,80366941,-1873273344,-326412987,-2116514274,1459661036,108432214,168328835,922687604,1996427988,1485212936,-1202710785,-1706033072,12772,-2037575445,1343684440,504671416,-26032,-2037579776,1343684440,16777114,-62486272,755517067,305987594,-385649152,-1073544940,-1476448621,922694320,-1957293356,-1903297466,-1056702632,1347605132,721440952,-1705968570,13079,821577415,15132928,721440952,1448148038,-1912832373,1358911619,-2080442648,-521468220,721440952,1448148038,-1912832373,1358911619,-2080448792,1187448516,-385800968,1187446960,-385867272,1187446952,-385866760,1354236064,-2037559296,-1924071592,-397367226,-997982541,5289990,-2037557680,-397344936,-997982557,-96040698,-1473395413,1356396543,1353205389,-386238721,-997982581,-129579258,1592459300]},{"sector":6,"data":[1342197944,-10975603,-1471771312,-26089392,-1207516029,1448083536,-10975603,-27137968,-1996045181,-986973626,-134240211,1183666392,1996443816,-11474438,837825008,837825144,835334640,837300774,837825000,837825070,835334640,839398001,842412664,2122527352,74779144,284774016,-1928694017,385833094,326023248,1996443678,-25864,1599995904,-1962742397,1297948645,1426065098,1996483723,178180,311998544,347623454,748310528,-16777165,62391414,1857572864,-1202708973,-1706033132,13121,-1207666945,-1202716671,1344148740,1342182584,3366810,1975520000,-373282043,1996423476,2406404,350926928,146296862,2023378944,184549427,-1936192,599262326,-122138624,-1202708972,-1706033144,13197,-1207666945,-1202716663,1344148722,1342178744,3383962,74907392,1342179512,504599224,374864,867670608,1996423168,2471940,313571408,146296862,-862302208,-16777165,649593974,-860336128,-1202708974,-1706033144,13281,-1207666945,-1202716666,1344143808,1342210232,3405466,74907392,1342180024,504671416,2668624,873175632,1996423168,1947652,324450384,347623454,546983936,-16777164,515376246,481841152,-1202708971,-1706033132,13372,58048523,-57623,532153462,-1195880448,-1202708974,-1706033132,13393,-1207666945,-1202716668,1344148100,1342182584,3434138,74907392,1342185656,504666296,1357904,880515664,1996423168,2603012,349616208,347623454]},{"sector":7,"data":[-6664192,-1207959297,-443875327,180829,-2081649835,1048773868,1962934636,9955587,16533191,349479168,352454201,922688892,28841266,-1070903296,1347440720,-26032,1183383552,33998844,-2097151979,2080439422,75399975,-15172096,722809398,922702016,1183520002,-11526650,1167721590,-1593835482,100733828,1072370946,355612415,16777114,1812383488,-16777215,-1709887434,14427,201213577,1343059136,1342179512,-1705983957,2297,355481343,-386107649,-692520056,244338706,-1962912792,79846885,-326413056,-1962611581,1344144454,3255706,71697152,1586177259,-2012771586,1547500614,977011828,1191118197,-1961169922,1344144454,519980683,-26032,1183383552,71732222,2013152825,-28931119,-1034033781,1478361090,-1957345904,-661774612,-1957106557,1065354846,1393128448,-1979737368,99350598,-1728559417,1782481682,208928769,1343548088,-1979743512,99351110,-923121977,1816036099,208928769,1343551672,-1979749656,99351622,-922990905,-1471771389,1857572886,-1706025453,12706,380126861,313571408,-23441378,-1929379787,1343662150,519718539,906861136,1183645696,-1957685592,1344207942,3546266,-1471771392,-860336106,-1706025454,13867,380126861,-129594544,-6664162,-16776961,-1927991242,1343662150,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,-62470396,1048772608,1962934632,1849590535,292880385,-16353537,1996425334,565569546,-335788407]},{"sector":8,"data":[-301533641,91490304,-352321096,-318310866,460595200,17464963,1187452286,-352321270,108461838,-1710721281,65535,-244087,2122517070,-377683958,-2080618869,-443874579,-884122337,-2081649835,-2091515156,92222,922685300,1996423534,5629956,-352009085,-301533621,1148520448,15533814,-2093714400,2113996926,138856238,669712385,-1929087233,1343620678,1342177720,401084048,-2081387762,259850750,343275019,1342189752,16777114,-16127232,2122516558,-797114360,1575324510,-326412861,23608963,-1207601920,48955393,1755562027,74907393,425603,-1073019788,28837236,721611520,1704612032,-1962934264,1438866917,-326898549,-1957275902,2123039862,3964934,1325338996,142508808,-1408729600,1023297160,-972589780,-963969019,1183451371,1191545086,1600052203,-1017256565,-1192457387,1344144339,503565496,63682640,1183535134,-11526652,-6683018,-1996488449,-443873722,-1957313699,-1528004116,2668544,-700019376,-3610544,184861827,-955812416,44102,683169771,1183666176,1183666350,1927827670,113542143,-1191295351,-1924136920,1358912646,-385976577,-997982371,-28931834,1342187704,1350846093,-385976577,-997982391,1552321798,-1924131073,1343663686,377767565,1354771280,-26032,1183383552,-1404662868,-1017256565,1167087646,518818645,28891278,49120000,1562371467,182861,-2115204267,-16744212,-694549386,-1996488696,2122579526,57999366,-402609943,849608524,2009074453,74907410]},{"sector":9,"data":[1358954424,-940036120,1606,-16713751,-1206570442,-1202716665,-1202716670,1344144348,1347469355,3720602,-666466048,612155403,355612415,1342180024,504551096,893491792,-1202716672,1344148182,1347469355,3757978,-666466048,14188163,922693500,179836210,-6664192,-1560280833,922686676,1183651122,-1706027300,9422,64767627,-2069633978,-431584493,-351042909,842465149,964336149,1996423168,-663290108,-2080413207,93246,1183655540,244338816,-1946994456,-1962439720,1183384151,-2041149052,1354771282,1342177720,-1873756117,-195368946,23871107,-13143040,-1206570442,726663169,1347440832,1905938512,-956301255,1376774,842465024,768021,1354771280,1347440720,3454618,842465024,888510997,2122514432,359923966,-1191282945,-2091909112,1962935934,1354771202,3792282,105286400,-1017256565,-2081649835,1996423916,889494020,1183383552,1849590782,326369281,721712895,535318720,1958742797,1845938004,-2097151999,93246,1996431732,571646,1354771280,3803802,1354771200,-402360577,-997982618,1812383492,-2097151999,92734,1637489268,-16777213,163118710,-1070903296,890804816,113704960,362,-352321096,-1950340350,516120037,1430622296,-1910575989,142016472,-2096734581,1946160255,-339727612,112643,106859344,-16091137,-6683017,-2097151745,-443874579,-900899553,-1957363708,216826860,16777114,-62486272,-1694607735,15000,-1980479863,1183577686,1347590404]},{"sector":10,"data":[-1727797064,-1298509742,1375731772,-25755824,-1694730497,15551,-129594983,-1694869879,65535,468993579,1446770262,1913550842,-129615099,-6682765,-352321281,1575324642,1426064066,-326898549,1815543558,-28930797,28856342,-811970560,-1996488643,20838982,-2146667264,1947074174,-25263904,-1948617718,-1072956858,20778100,-955157504,326726,1187448299,-1962932228,418118726,821984896,2122377596,-478202370,-1728166262,-1996476371,-471073722,-1017256565,-2081649835,-1923720980,1183427142,-2585604,130481222,-60912831,-956545281,1586189319,-62455812,-1957492794,1191181406,906479356,-237941,130481222,-59310275,-16228725,244327543,-1980384792,-661914554,-956545281,1586176007,-62455812,-1957492794,1191181406,923256572,-237941,130481222,-59310275,-16228725,244327031,-1980398104,-661914554,-956545281,1586176007,-62455812,-1957492794,1191181406,822593276,-237941,130481222,-60912847,-956545281,1586183431,310346504,-16223232,1186528374,-16323840,-927400842,244338688,-1980417560,-661914554,-956545281,1586176007,-62455812,-1958475834,2139293790,74711056,48977072,1586188464,-62455812,1183516552,2491656,-335657335,-92372951,-2147058640,2117728894,-92372974,-2146667476,1948514942,-92372986,-1962183382,1191181406,-96040196,1586169736,-28901378,1183319946,1975519994,-60912696,-956545281,1586171143,509692,-1985329523,1183579718,-62486268,11028167,-1961104640]},{"sector":11,"data":[1065418334,-1961135104,1191181406,-25785348,-1963047169,-16283644,1183557702,-1471792890,1183571326,-443851096,-1957313699,105286636,-1202695527,1385768720,-26032,1347551232,-1727773045,-6664110,1342177535,-1946316824,79846885,-326413056,11988097,-263796906,922681345,1183650668,-1706027276,15646,325859071,-1705983957,15613,325859071,1342177720,4008602,75399936,-13339392,95946358,-1125625856,79987711,325859071,385107597,-26032,922681344,-1070918804,1027054160,922681344,28840812,-6664192,-2130706177,8389758,1996430965,5289990,1250331984,-806858497,113542141,-1912715639,-1979757946,367786566,-1325107573,-1947806974,-1996226940,-2071201210,1183384576,1815543806,-96040173,1996443678,-25858,1183383552,-28931090,1978549817,1586188398,376962822,-1191245848,-397410054,2122448052,1946189828,75399942,-1207470843,-397409554,922746016,1183650668,-2091903332,2102455934,-297366779,1354236907,-6664192,-1996488449,1183575110,-330941970,1183654261,-230258276,-2081665281,2080435326,-228685033,-1947056385,1191180918,939821818,-941263865,61510,1592805003,-1017256565,1167087646,518818645,-326903666,-62470396,1183514631,1958742796,81185,37567348,1029272576,2020868099,1962935357,11725059,1962935613,13363459,1183519211,264938246,17581767,-871971072,-1962934257,1183516766,-1962440196,-857142202,105286400,264898091,2080630845,175570918,-397361109]},{"sector":12,"data":[-997982637,1958742788,205965085,-806682622,721831563,1024444934,-1015281212,-1979964184,-1072956346,1187448692,-352320244,205965234,-1410662397,-2146804085,1962944127,-939079928,-352320497,-939079930,-16744433,922684022,15208392,79987710,225820683,83642055,205965056,1994981376,-62470145,1187446791,-385874932,-890699927,-62486021,209043467,264781443,-955943676,130118,133987971,1256784757,-2083853313,1035326,113710197,69580,-1559869813,1187450826,-385875700,1187512109,-352320004,49120168,1562371467,576077,-2081649835,-1070922516,2130884688,-1706012007,1938,201213577,1342796992,4172954,-62486272,1342433464,-331800,722693174,-258322240,-1207959492,-397408804,1996487388,178180,-45488048,-1207647101,-397408304,1996487368,243716,-46798768,-1207647101,-397410104,2122578612,141820158,-1694730497,65535,-1017256565,1167087646,518818645,-326903666,-330905828,1187497664,-956289554,1111550022,267011783,108461824,1342177720,-2080575768,1570374852,-1996488646,1451880518,1076468466,1183383552,-430536220,-1149185,1996483702,-260636686,4201882,1183422720,-94991880,-1411329,1996482678,-260636686,4225946,1183422720,-162100748,4214170,-465163520,1004951067,1350040150,1178273138,-11963400,28837494,-2065149952,79987708,3827866,-465163520,1004951067,309851734,1178273138,-401902604,1183447637,474620,1996480116,-394854422,-887041]},{"sector":13,"data":[-1936002954,-1728053190,301221377,-1595148714,33324675,1996425589,-22484986,-2096970621,-443874579,-900899553,-1957363710,149717996,-164932009,1586183403,105316102,-1986525302,1187510854,-2097151752,1929967742,-2114024667,-1325399577,-1947741425,-2132225594,-955547676,1183576203,75258,1859252275,-129564678,1325389291,75399940,-1950647040,-1956684090,79846885,-1873273344,-326412987,-2082959842,1085801708,79187970,-994553853,132665344,1975520026,112645,-1070923029,201082505,-2095614784,1946158718,50640913,1085820958,-1202708990,-397410108,1183521278,49120252,1562371467,182861,1167087646,518818645,-327034738,-2033778554,65404,503727755,2122747216,-1202710785,-1706029056,17077,-8747383,1618788363,37750471,1085800448,-994553854,300437504,37790719,-8734977,503464120,12892240,-26032,-1002635264,-1207602176,48955393,-2037792725,-1072955524,28838773,244338688,-335594776,142016272,1342181304,1342185144,-1863840112,2058813423,1125161727,367722496,-1207404801,-11534325,244319862,-940607768,33520774,2092860160,91554047,-352321096,-1547687166,-1098710684,1962999676,112645,-1070923029,-1962742397,1297948645,503317706,1430622296,-1910575989,1849590744,175374337,325859071,-402098433,2122514970,544473094,-2096603509,1962937983,-1908505849,108331027,353908479,922682603,1692930958,-515970849,-16228725,1491604599,140413715,-2095822967,-443874579,-900899553]},{"sector":14,"data":[1478361094,-1957345904,-661774612,22080641,503727755,-26032,-2033778688,65400,-1996337503,-939557754,50296454,105286400,-2037559266,1343684478,1342177976,16777114,1954973952,2092960767,-2037559211,1343684272,1342227640,16777114,12860672,-2037702539,-2037776720,-2033713286,65200,-21985651,12892240,-38606768,-8747461,1996428660,1751048,108461904,1625820816,2022098926,-16776705,-1694534474,65535,1996428779,833544,108461904,1088949904,2022098926,-2097151489,16742590,1085822837,-1924129278,385790086,12892240,402450512,1342177720,-1326969200,808910845,37795861,38707536,-8616391,28837236,721611520,244338880,-1191267096,1344148182,377898637,903912016,-692584448,244338706,-940441624,16868358,2025751296,91554047,-352321096,-2084558078,-443874579,-900899553,-1957363708,172395244,2040672516,108954369,-1957661440,-197326778,1024619775,729087996,1962933821,74907442,-352316488,74907440,1342183352,38026883,-1207602176,65732642,1342185912,2095582864,-15143955,179831926,-2068295680,-1250542,481821814,1991790592,-1948194047,1438866917,-326898549,73304834,68700042,24748593,503412408,67156048,16824400,-26032,1183383552,2092960766,1996443655,1894404,-1946270069,1438866917,2122574987,142344196,-1710983425,65535,-1017256565,-2081649835,2122521324,58523654,-16740887,1183647350,-1706027290,65535,2088550411,-1962647925]},{"sector":15,"data":[1183389255,440896231,-1964423544,1183325255,508005099,-940947832,2029126,33048263,-212959231,541559560,208977931,1946157373,146721,921382516,301221574,334841542,32722560,49499776,-1074567552,-537696640,1317018859,1317028083,1719673075,1719729907,183238131,-1074567552,-537696640,1183706347,-1706027290,65535,-1034033781,1478361092,-1957345904,-661774612,-15960321,1996425846,108461832,16777114,49120000,1562371467,576077,1167087646,518818645,-326903666,-163133684,1048772608,1962934638,10414339,325860995,-385647360,1187446932,-16776972,-15504330,1996425846,108461832,4031130,-163149568,956712587,1333065286,16154243,1183516797,-1982269450,922744390,1183650668,-1706027272,18037,1039419017,326435072,-15960321,-1710003146,18023,16008903,-1608979712,822346328,-16680542,364383350,1991790592,244338689,-2081705240,149566,1996427636,175570700,-16222465,244381302,-2080429080,1946219646,-163133691,1183580159,49120246,1562371467,576077,1167087646,518818645,-326903666,-62470378,1048772608,1962934638,10938627,325860995,-385647360,-476446564,-1996488641,1451881030,1179163380,1183383552,-329872918,-1728049224,1085821010,1030722,2140819538,1375731770,-193527984,-1695385857,16389,-297367143,-1695525239,16366,468338219,1446767702,1916172272,-297387259,922693491,922686768,-6679700,-16776961,-1928106954,1343682118,3990682]},{"sector":16,"data":[16824320,-1980152277,-1072956346,1187455103,-352321284,39362746,2040672516,808910593,1423381,24557648,-401698736,1183574719,49120252,1562371467,-1957311667,1849590764,544473089,325860995,-15107072,-1710003146,65535,1342369464,-818200,-1710003146,65535,-1017256565,-2081649835,1187451116,-16776974,-1432746378,-1996488647,2122576966,57999364,-2097086743,148542,1048584820,1962934886,636955,571472,1198299728,-1073020928,28837237,721611520,-230258240,15892099,-1880554636,37795840,-53483440,-1560099709,-1073015956,922686333,726663768,1996443840,-61675514,-351746941,1144947558,1685323778,40255104,-1201835008,-1202716662,-1706033143,3060,1039550089,343212039,-1207535873,726663184,244338880,1038737128,-680198142,200689291,1024425152,679346177,2080376381,474373,1996427134,1161222,1354771280,-1259860336,1815543785,-58202093,-956119933,127558,15892099,-1058471052,-193528064,1342177720,-1710983425,18403,-1191938305,-11534334,1520043126,-16777207,-2095763402,1946158206,1748927239,980680705,-352321096,505911,440400,1192663632,-1073020928,1048817012,1946157636,1715372049,175374338,1342324920,-2080957976,922682052,317199212,46433276,-1070887189,928225872,2122514432,796131332,355481343,385369741,616667728,922681344,-1483074256,-1996488668,922742854,244323632,-1778200,-15388618,345698422,-16777168,129561718,2122534912]},{"sector":17,"data":[91488260,-352319304,1354771202,3773850,-226589952,-1207601920,48955393,-443826133,311901,-2081649835,1183668460,-1371108944,11028167,1815543552,-1404662509,28856342,-442871808,-1996488632,-1072977338,20799100,-2132642560,1963633790,-1468103716,-14123696,-1961661386,1344187974,1342177720,3854234,-1438217984,880590859,-578895861,-2136056181,460655167,-1929377850,1343664198,503727755,-26032,-1073020928,28840565,-1961891072,1065397854,-5082099,-1377063354,-443826133,311901,-2081649835,2122516716,1131675652,16533191,-28915968,2122514432,1535056126,-1995893016,1451882566,1958874106,-25755826,-1946388737,201717830,-1202695680,-397410224,1589953711,1200170744,-397212150,1191118973,-943199234,65094,419331715,681647487,705039108,-1005292540,637806622,637958143,-402360321,1191118785,-1948390402,46292453,-326413056,-402330493,1183388275,-27883012,393527819,654073540,1342851015,96701184,1347551244,175636262,-1961783832,1452014662,1575324670,-326412861,184829579,158598726,-16353537,-1394080650,1575324434,1426064578,-326898549,574522118,57999364,-16733463,28836982,-1835380736,-1996488630,1996488262,112644,-62485168,1183666198,-1706027270,19162,1023821451,2104950789,781434883,1248241663,-335655169,-28901583,983641323,906373888,-28956416,983638251,906373888,-28966656,1183519979,-28931832,1245449451,1246120513,1247693394,2122533470,125632766]}],[{"sector":1,"data":[16664263,-1962153216,1178204742,-1996259586,1996488262,112644,1254267472,1178271744,-15305474,28836982,1996443648,1620726014,-16777141,300482166,1575324426,-326412861,-16323453,-1070922634,1262918224,1183383552,74907642,-1924087765,1343684166,385631885,1283103312,1183514624,1958742790,81180,37561716,1025864704,745799683,1946158141,343347,-286718348,-95486208,16416387,1183525501,-13767682,-252970426,721434785,687879174,-454297018,721434785,16790534,-655623610,-1995946357,-789841338,972834443,58653254,-375159,-1070922634,1280350800,1178271744,-385649158,1996423325,1354771204,-1191545089,-1706033151,65535,325729923,-1207077888,726663170,-1873784640,-592451570,-386238721,1048826213,1946162026,243725,1354771280,-401698736,883022997,-1408878336,-1593213934,104398904,477893294,325729923,-1203473408,726663170,-1873784640,-596645874,325715655,803930112,1342178488,313276159,722644641,1342451718,1390939792,1782481884,326434835,1342178232,1347469355,1055395472,1778829276,-1962933997,1438866917,1352789131,1443248402,-1592888046,104403534,91558484,-352321096,-1950340350,1438866917,-326898549,574522118,57999364,-2097085207,277054,-85392524,973522688,-1593835260,103481396,1325727800,-62486272,92127243,16533191,74907392,-1705983957,19705,2130462267,-59310320,1342178488,-402360577,-997982641,74907398,-1924087765,1343683142,385762957]},{"sector":2,"data":[1288280656,2122514432,141885690,972834443,326434374,721712895,-11513664,28900470,-308654080,-1593835444,103482418,100859962,-1991770058,-1072956346,1187448189,-16776964,28836982,1183666176,-1924131078,1343684166,16777114,-92372224,-1962380032,1178205254,-15305474,28836982,-1070903296,-59310256,1342177720,16777114,74907392,1342177720,16777114,906922752,806224640,1959279364,74907416,1342177720,50345633,1342451718,1342177720,5108122,973522688,-1962934268,46292453,-1873273344,-326412987,-2082959842,112723180,-1070903296,244338768,-1545936664,378081880,113709658,66594,-397361109,28889671,32002048,1354771209,-2031612272,307405779,1342177720,-1577338392,378209320,614663210,639011076,1958873860,-62470367,516161536,-1960442844,-1960442809,614663767,639011076,-62456060,419200643,849470590,1649924,184823971,-955875904,274438,70295808,-1593559389,950206518,108461828,-385988376,1996477904,603691526,922681344,-773320102,108462033,1342177720,50345633,1342451718,1342177720,5159066,309248,1479999312,1513553682,-401698798,922737185,922686042,1290277464,307798273,-1592611677,100864602,-1365048272,1778829074,-2097151725,-443874579,-900899553,1478361090,-1957345904,-661774612,722136195,307667904,-1559079773,1319309904,-129595118,-386513271,1183436565,1996443900,-159973384,-493825,-1024919946,108462028,-1694730497,20307,721696417]},{"sector":3,"data":[1342451718,-16470808,-402376650,-1070870232,-90118064,-397361109,28837840,149442560,570869713,721420292,1055412416,1513553870,-788338670,721843967,-1202696000,-1706033151,19111,721843967,1347440832,1342177720,5168538,108461824,1342177720,1347469355,1342177720,5020570,-725948416,307377919,48762512,1513553874,-793057262,1342178488,307771135,307902207,585633424,1782481881,225771539,1342178232,1347469355,250089104,49120217,1562371467,182861,-2081649835,1055392492,-28931634,688140449,1177094726,-25755898,-16091393,1996425334,74907398,-3415832,-15388618,1805319798,-1962934200,146955749,-326413056,17051809,1183516230,106334980,-1995287389,-1559079402,378081870,1347555920,-1545056174,1575324671,1426064578,815918219,105251076,-1962654069,1319306838,1343654162,1446444818,1412890386,-397389294,-443809926,311901,-1578333355,-1017314256,1575783253,503317186,1430622296,-1910575989,2062320600,307640063,307508991,307246847,307115775,1351239309,-1949720344,-1962439720,1183384151,-1739159146,307640063,307508991,307246847,307115775,1350977165,-1949746968,-1962439720,1183384151,-94991880,1183432747,-1907979888,-1962661727,-1996215786,1451856454,1975651220,-1715459322,-956227095,61510,1589908459,126559890,39291686,-1986902391,1191154774,-263812112,2140685881,13756901,60180107,1451987526,787860,-1986378103,1589943382,1200301714,-1773786358,653543049]},{"sector":4,"data":[-1960441973,1183384151,-1806268014,972703371,91592774,-336050549,5289987,-1986640341,1183577670,-163169804,1183516029,-1962677258,1183446086,-1773746274,-1073020928,1187448189,-1962934114,26844742,1443991110,105286544,1946699275,-1004344531,1191156318,126494362,1183350564,1975519986,-230242812,106873888,-1979300097,-2010713530,-1638990073,10387075,1183569277,-1740228102,1182999677,1451426446,1183514768,138808070,1589908596,105316102,218613286,-16359797,-970586554,1191119367,-96040040,2140685881,-14358269,184960651,175376454,-16359740,-970586554,1182990343,1451426190,1183514768,-1873376370,-1962742397,1297948645,1426064586,1183575179,105253636,-2132212875,839843584,69771524,69867147,1963349561,71711017,516170869,-1960442840,1468737031,69772034,69867145,1963349561,71710989,-1070921611,-1560008029,1589904424,1200301572,1468737028,532948486,71797030,106400038,637820612,-1960441973,-1004141993,-1993997217,1468605959,73319426,-1962660703,637808150,-1993996407,-1014300073,748929676,773228804,1575324420,1426064578,117435531,681641010,705039108,-1961921276,1451951174,69772038,69867145,1589922283,69771524,69867147,638028070,-1006479479,637806622,637814667,-1006217333,-1993997218,-1993997241,516163159,-1004141528,1183515743,106334980,638028070,-1006479479,637806622,637814665,-1962518647,79846885,-326413056,-1593512829,101385260,192218158,69875455,69744383]},{"sector":5,"data":[-1577130776,378209324,1183384622,-27883012,309641739,70000324,638028582,-1560127605,378078252,1589904430,-1933341700,126428866,39291174,71797030,106400038,1375734789,2013210192,144762890,-1946401141,-443810218,-1957313699,82609132,75400022,-1205764608,103481368,1183383610,71711230,1183516029,-1962677500,1183448646,973472516,552290304,294531,916528509,-1948715264,74856944,1183516030,-1962743036,71731654,3540483,-244087,-1914110858,71732172,1575324510,1426064066,-326898549,-196688116,614531072,637930244,-385649404,2122514791,58458116,-1962898711,-654900154,-1593555319,1178141744,-1994424828,451609670,69476036,71797542,106400550,-1996217181,-16505322,-16502770,2122515534,-528541436,-2096869633,2097153150,17295619,69476036,71797542,106400550,-1996217181,-16505322,721694734,414732480,28856320,-2098704384,-163133505,1996423168,-193527818,-1962662751,84157974,1347551244,69476036,175636262,-340087064,75400107,-385646848,2122514613,327031044,-1962661727,956574230,1963206166,604387688,-10324732,2122515534,58523652,-16740119,-1006358522,637805598,-1960441973,614662743,639011076,1354771204,1342183608,1358954424,-943780632,1570374,-1962662751,-1996216810,1451883590,-96024578,2122514432,830281722,654073540,-1960441973,1183384151,-27883012,-335919361,805765093,72285956,69476036,638028582,-1560127605,378078244,1776878630,-159973377]},{"sector":6,"data":[-1946913025,1452014662,787966,1589923922,2013210364,-1175328758,-385915671,1183434965,770199800,808910786,-126419179,5140634,1446444800,1412890386,1345781522,1312227090,-93788142,-1034033781,-1957363710,116163564,721700491,721434118,-1996214266,-1072955834,-1528233099,1782481664,225706003,1342177976,1347469355,921177744,-25755693,-1979853848,1178205254,688485630,1996488262,-31201026,325729923,-1207077888,726663171,-1873784640,-754194418,50345633,990130182,2131930630,3842317,70256131,313394747,1048779903,1946162026,178244,1354771280,-401698736,113758941,4970,1048784875,1962939242,243731,1354771280,-401698736,113758913,70506,1342178488,313276159,722644641,1342451718,-1494741360,1575324626,1426064066,-326898549,-53352444,-1979955575,-1039401386,922690420,922682430,1183515708,787964,1354256466,1760055296,-60898120,172460326,921195270,1575324668,-326412861,-1593381757,1178141748,-1590198780,1178141748,-397574652,1183445967,-61437446,1081393675,-1577427260,378209324,-1993997266,1468605959,-1933341950,70034370,70129289,70518527,2122566123,410916868,956576929,276628550,184822945,1963208198,574522124,91488260,-352045919,-63576038,-1980086647,-1039401898,-11401356,-1595344266,873398259,-1949701372,46292453,-326413056,-1207636861,-397410279,-1070858389,-1560008029,-443874264,-1957313699,49054700,308035203,-2096729088,1946158206,1547600653]},{"sector":7,"data":[1551171602,294531,-420981132,-28931642,1182056459,294531,-11529356,-16496586,-16497098,-16495562,-352040394,71743518,72005712,-1000937392,-100609,-16497610,-16498122,-16497610,-402374090,922731621,1996428592,1420139262,1183514624,308060932,-1034033781,-1957363710,49054700,956583585,997459014,294531,1048778868,1946158160,112653,-10295216,72353479,-1070923776,1554060267,72393490,108314635,-397361109,28901192,-1070903296,244338768,-1949237016,1319306310,1575324420,1426064066,-326898549,1547600642,561250322,71319171,-15043584,1996425334,-744036346,-1996077431,1347553366,-940036888,278534,1575324416,1426065090,-326898549,1547600644,796131346,71319171,-165121024,1946223686,142016278,-402229505,1183437676,-27883012,-219656110,-15930377,1996425334,74907398,-1946185496,113401317,-326413056,-2096960381,1203262,1190554996,242484228,-16222465,1996424822,-6297596,1996444651,108461832,-1546443800,378081886,79172192,922701824,-1873669538,-801118194,325729923,-1207077632,726663171,-1873784640,-802428914,325715655,1587609601,313303826,51536033,-1560006650,922686126,922686048,1088950878,1074186231,-1962934012,113401317,-326413056,-1961956221,557647430,1023769600,92143656,-638992341,70295810,313394745,-1365175683,805710610,-689418236,-163133446,736821248,84160673,104529944,360649390,722644641,755249158,-397410281,1187510965]},{"sector":8,"data":[-352315402,313434378,70256171,-637303,568915574,3449287,972965513,2098375686,313303301,950081003,-1408878336,-1592820718,100859956,103486124,-1992294344,883031622,-28952320,1996429428,-1004541698,721975039,1996443840,112894,1493342800,1996423168,112648,1242536528,243990528,235077686,-935656400,1996429428,112648,3580240,70256131,112720,1293785680,79167488,922701824,1996427948,-401698570,-1398681839,-230258414,-1980348789,1183577158,-129594894,-1980479861,1048836678,1962939242,243731,1354771280,-401698736,113757925,70506,755385995,121438241,-385649152,-1073544928,-1476448621,916544102,-196728576,-1202667477,-11534334,-2031613834,113542128,16791201,-102108090,3580160,737429033,62410944,-2102528,28838006,1183666176,-1924131074,1343683654,4860058,-59310336,1342178488,-402098433,-997986231,3449094,-1577957751,-1991770054,-1242958778,1354771200,1342178488,-402098433,-997986263,3449094,-1577957751,-538247114,956315297,226489414,1347469355,-402098433,-997986295,-193035514,-8424448,2062283854,1089750667,3802683,-1070919556,112720,142016336,-2081430296,2122516164,1518147572,-336312577,3449173,2146584121,1354771213,142016336,-2081389848,2122516164,980680946,-336441601,-230257867,939932480,722500608,28856512,1996443648,-262281208,-2096708477,2102325886,-230228203,1499336939,1502304637,1512135105,1514232284,79190524]},{"sector":9,"data":[1996443648,-193527822,-1561850224,1782481869,326434835,1342178232,1347469355,-1897394544,1778829261,-1962933997,-1398541754,-196703470,70256131,-15552861,1996485750,-803673870,-1980610935,280556630,-6664192,184549631,-2094170688,278590,1996429173,-126418950,-1982859800,1451882566,726684410,-1058516800,-193527812,-1192069377,-397410303,535559281,71319171,-15174656,1996485750,1354771442,-221464,1996485750,1354771442,-1191437080,-443875327,442973,1458342741,-1070334889,503598731,141986567,-217678197,1073837478,-443851169,442973,1458342741,-1946411433,1992623182,176079878,24373713,530969508,-443851169,705117,1475119957,72256508,-1004527432,-372177282,-206962317,-443850837,442973,1458342741,1183522391,-1036805884,1317782059,2126592774,734104322,142001608,2122516254,343670788,1309046275,-265552245,-1952123907,-215961400,418118826,-268173685,1944703484,-1510759423,548980875,1944703264,-1410094591,-1956749537,146955749,-1864856576,-326412987,-1948742114,12060246,-1205744317,24313857,49120072,1562371467,182861,1458342741,2126782039,108446986,839143051,-670389029,178945828,-1191780160,-478150655,1208055168,-1956749537,180510181,861361664,1479969791,1962281732,-2095281394,2082014335,-1946252486,-1119433,-16493002,-1710990794,1917,-259307293,72627967,73283327,73152255,16777114,-1154620672,-16055208,495649396,478885769,-1912453239,-164429241]},{"sector":10,"data":[20742182,-964491915,-660641,-31062969,-1916630012,183173444,132684374,-768409600,1583333427,-326412861,1183536982,-1946209530,184834102,-1958775562,38222108,-24443276,-269797493,1258577604,20938790,-970577803,478871559,2130989055,-1157133543,-16055208,495649396,-1710880887,65535,1553111638,28311552,-1070398741,-443851169,1912914525,352387840,1744831287,-1023343872,1778385754,-989789440,1795162890,-1543437568,1828717358,-83885312,234946361,100664064,251723592,-419429632,268500738,671089152,201391879,-587201792,285277954,1056965120,218169095,905970432,302055240,1828717312,318832392,1208025856,83886428,-436141312,117440860,-419364096,33554982,-771685632,2080375629,654377728,2097152804,-285211904,520159021,1560347392,251658588,-150928640,150995494,-234814720,16778034,-536804608,285213020,1191248640,100664074,100729600,-1996487927,755041024,-1979710711,-1358888192,486539578,369165056,218104646,184615680,234881862,385942272,-1879047415,-1174338816,301990659,-1610611968,838926134,-855571712,318767875,1191183104,855703354,1006633728,872480582,788529920,889257798,2063663872,369099531,-1879047424,922812229,218104576,939589445,66304,-1728052470,-486472960,553648692,-2063531264,-1711275192,-738131200,-1694497977,-369032448,-1677720823,-285146368,-1660943546,-1660878080,637534776,1241580288,553648968,805372672,855638279,-2130640128,-1560280280]},{"sector":11,"data":[1375798016,-1543503064,-1275002112,754975268,469828352,-1526725848,956367616,620757814,201392896,-1509948631,-1644100864,-1493171416,1661010688,654312237,2113995520,671089453,637600512,687866632,-1761541376,704643848,-1358888192,973078839,1275134720,-1392508097,704709376,889193016,-1509883136,-1375730937,-1878981888,-1342176463,-1056898304,956301830,-167705856,-1325399289,-1711209728,-1291844860,973144832,-1275067611,-1275002112,889193224,-603913472,956302087,1577124608,1107296805,1946223360,1241514305,100729600,1140851257,436273920,1157628453,-654245120,1023410976,-251591936,1174405637,1778451200,1308623157,-771685632,1040188248,-1912536320,1325400386,-570359040,1056965464,-922680576,1073742670,-637467904,1358954817,-1660878080,1090519897,1392575232,1107297096,-855571712,1375732034,-838794496,1140851542,1493238528,1157628735,-1576992000,1442840897,167838464,1459618121,1124139776,1207960347,1979777792,1476395331,-620690688,1342177848,637600512,-939523260,-805305088,16842503,-285146368,1493172533,-335478016,-922746044,1124139776,1375732230,-1241447680,1509949752,1812005632,-905968828,2080441088,-889191611,-855571712,1275069223,-1157561600,-872414392,1426129664,-855637179,-1677655296,1459618340,1409352448,1325400871,1275134720,-822082748,788595456,1358955302,-1778318592,1375732518,-939457792,-771751098,-671022336,-754973882,620758272,201391879,1006634240,218169095,-335478016,1560281656]},{"sector":12,"data":[1862337280,-687865025,-721419776,16842503,1937009920,1167120524,518818645,-326903666,-1957210542,1183385670,-1694551124,65535,243779891,65208649,-1962892055,-486454002,1346273362,477430017,2030456575,9890051,638082756,2133067658,140413251,-395046596,-462154948,-1957670761,-6663996,1476395263,-1997501862,-1761524202,-812908749,22023816,22228618,302120320,1295943657,869793537,-6427649,1199048270,638082756,2133067658,140413251,460464188,393510716,21956106,1202602888,1917910915,1962871559,4122627,-1090556439,1189609757,-1980402944,-972993250,86790,-512419012,22021830,198896385,-402426625,-6684648,-1962934017,1177225286,-2090967124,-443874579,-900899553,1586298888,-1705552978,65535,21562889,-54264013,-1979192429,-1073506108,-1389432789,259506986,-276904902,734004120,1034759920,-1812660223,-503773245,317698,-352126969,-285021438,-973137150,469761799,755455999,1376200958,1526673415,-1544143865,-1861907707,-1358472699,1510292741,-653991419,1208176644,839185912,2097376003,1627692291,-1056698620,1493063941,1644796423,1761829631,1963416316,1997049608,720530947,-553420534,1510335749,-1761126905,33922309,1409681414,1074222343,2097539593,-16387841,1476336639,1526669319,1526670087,1526343687,1510431239,1510431239,923228679,2047371774,-1946272504,1141215493,16968702,-604026877,855592198,-1040295421,1611154697,1644556543,1074129662,553647881,1392990972]},{"sector":13,"data":[1510431239,1006582791,1039154696,621296648,1510292740,-653991419,990205956,-66787323,-519634940,-1660690941,1342464260,1459884031,-855185922,687823363,-385982457,1661264388,218741754,-66758139,33997828,134048777,-737610231,1979675401,-1879083768,1090484744,905969417,-872166394,1963356931,-1962567930,436604421,-872000506,1946405891,-1660520954,335909125,1241915398,-570170882,218064899,301952009,-1577095671,33554185,-1459257346,654116357,-167378426,251597829,1979652358,33554182,-1459255810,771556869,-66713594,352261125,1996429574,50331398,67498239,335917055,-16377089,-352386305,-1040251899,553587717,16776966,117827071,453369855,-16390657,2144511,-26032,-1329397760,-1609241854,35913964,199950604,604040352,-352187391,-805064702,839021544,1944637686,-283756014,973500928,1979772950,402292745,-385822080,-1070398895,1347602054,16777114,1225132288,372949761,192151791,1947794048,449460980,1390210001,1342177720,16777114,-806659584,1947794048,-318310878,58000384,-1174300952,-92254441,856847384,-2145850405,225712378,398121611,-1240667313,-335596977,-1224832508,182094415,-2147125761,611602430,544528954,259316491,851705427,1370367,-1227650469,1376643919,1337379582,1509950952,-13444470,-1031094221,-964014016,-1974419202,-947236669,1355058000,16777114,147096320,-19231805,1928659661,1342078981,1337370998,-914315797,-617350140,1405016454,37530625]},{"sector":14,"data":[-1057093001,251648010,-243334831,-13704239,-872153177,1644391171,-872198141,2030271747,-1979484413,1925579461,1984904196,-10360573,-1705907834,65535,46500547,1022259910,1391097679,15533814,1359443208,16777114,-377071360,118937995,-1330741619,-1426850784,-1712784501,-318310660,91555840,16777114,317282816,1375089153,17557586,-92251814,-385649384,372965125,611451119,15734330,-257941897,-20829696,2009414336,-1227191541,-266958257,-14882560,-1705907834,65535,1375089347,13625426,-92251814,-385649384,372965065,611451119,15734330,-257941897,-20829696,2009414336,-1227191541,-266958257,-18814720,-1705907834,841,1945447107,-370046462,-184418159,166397555,-175452674,1984953984,-347097598,854995582,-1876366391,906688050,158597460,-25112834,-1241352625,1393429071,-33393663,419004617,116787573,1946222829,-1340806376,-318310889,125043200,15666690,973140128,-1979549752,842591185,-283755786,-1979420160,-2147422450,175380730,74634538,41144634,468439434,243988018,-784727824,397476466,1947794048,1926562314,1993423364,869370370,1388742336,-26032,-2134704128,16838158,-299466557,-2134639104,33615374,-299466557,-2134639360,67169806,-299466557,-2134639872,67169550,-316243773,-154928384,134278406,243276917,-1710751507,1081,-318310717,175376384,15541888,72981239,750977024,1023111728,-789088481,-972655640,-2147397882,1326352579,645972737]},{"sector":15,"data":[-1007222546,15601280,645972744,-1008795411,15535744,243319584,-1019215635,15541888,243319743,-1023278868,15476352,243319805,-1023344404,15476352,243319806,-352190227,-316243963,-1058407168,-318310658,393543936,15535744,112641,-26032,414908416,1327020544,-1006817048,15533814,-2145946623,-33493722,21380736,-402426600,-1070334325,105290320,1237516288,-1219933879,47811327,-2020921637,-617412971,-1705815216,65535,167774659,117442560,1949318144,1949514761,1949842456,-561331398,-1081540814,113639670,-972488458,151078150,119471299,838923967,5290432,-420762893,-1409199170,-16775192,2130792718,-1073036298,54316148,-1966875788,-956353826,151058055,22265539,518316,22089471,180614783,1021605056,1017607170,-1011452923,162531102,-13441654,-1081221494,-8322825,158794053,-234860615,2009923246,-135298575,-1965061376,-28579341,-1325594850,853903881,-1914795265,-2130643521,1912665855,5224713,-855724302,-276696713,-544538379,-369298550,1229585953,1229539657,-968275639,16863238,-4728438,-1959863549,-1995996513,-1023324898,154535573,148048078,130352595,129238956,1369507695,33325057,-1073028846,397410933,-855717634,41293372,-1002782670,-58718861,-1274907113,15704855,-1006810392,1006719906,-1012501224,-76277700,1419910956,1395556353,938024705,872190973,506304,-218017345,12161963,20168193,15533814,-1107069948,384303521,-16616455,-617364509]},{"sector":16,"data":[1886656572,796146492,74592316,74856764,21440255,22093323,-1992096395,-1979625186,33641103,48859849,46727881,36711657,1387235560,-1959597311,989942078,-82577953,319618947,1363053051,1386055681,1226500865,1048791369,1962934609,-645248741,-620494921,1772063534,1193183496,1342621185,113705217,132776269,-435725629,-351755256,15573000,101319204,-207486641,-199849728,-207568128,618695168,21996160,645973042,150798573,-1593774842,-2137915148,158472442,15533814,-1979550463,-53483056,1006784447,1007121512,-1088522900,1404961377,1359937281,-65898495,1456012972,-1176532137,266862848,-346136832,1337705448,-1157371134,824967777,158795836,-466436093,-13707261,1941881639,-1107039486,182976999,-16616456,-742407197,1359886338,-384469759,-1212154653,-1089606910,149619397,-352155713,44023555,-16690242,2013352206,-1951597544,-386430002,-242485291,1448602995,-16711495,-346071341,1883030498,235600757,-176881327,-274546637,-267991552,-291367168,-316243968,-324870912,15966720,-1576995677,1336017222,-388877567,-919340019,872221160,-49878839,-386080280,1021901899,16171005,-2097149511,96864455,871948809,-104535854,620817569,101432318,-324861711,-658521344,-352079872,22265381,22089471,-1392766856,-193654980,-1342118209,976902,952363755,1963021070,14401529,-466483280,504133375,-6664105,-1023409921,1375818686,1359937370,1380612097,104639740,283641205,1022225152]},{"sector":17,"data":[-1075219195,78643426,1979699176,29524447,-1731819007,-162395461,808453619,-1269570682,1355056699,-1281834358,99874314,-1202704336,-1957668069,-402083588,-997982304,-1031683320,-1202577376,-1336911589,-386102524,-997982324,-661863676,-1957345904,-661774612,-1070377130,-485863797,80510979,-485994869,1087143939,-486125941,-1560212478,602407153,206474239,-806878237,-2090967042,-443874579,-900899553,825229320,892613426,959985462,757861676,1903165486,1970566002,2037938038,1835814252,1364197486,1431589714,1310414678,1276857627,1142638619,1125859611,1348157979,1281051995,1146832987,1130053979,1348158043,1281051995,1146046555,1129267535,-661896625,-1957345904,-661774612,1459940483,1187446579,243932154,-511639315,1183514628,1021587974,1009283680,740587374,-301533600,225706496,48447411,1585991603,71780347,785943312,176064394,1207583624,1006669033,1010332272,1949595513,1954036774,98780946,1341867718,-1821365177,-1635284434,-1193678070,65227056,-1990701128,62913350,1197271808,1187382755,-1337500677,1019079550,1022391343,-1341885138,1018293119,-1155697363,-481869745,-79247606,1195848795,-1972867909,-318310713,41158656,-1863597174,829563180,762775356,216252419,-166722489,16838150,268698228,-2020921709,1133054630,189220858,-1928432385,1996487238,1464868360,642970,1606912768,-1962742397,1297948645,1049802,48627971,6815747,1572867,2097407,5701635,2162943,13828099]}],[{"sector":1,"data":[2228479,15728643,2294015,53018627,2359551,81002499,2425087,63242243,2490623,69206019,2556159,96206851,2621695,97386499,2687231,77070339,2752767,91881475,2818303,107872259,2883839,109576195,2949375,196935683,3014911,1167087646,518818645,2122569870,125042694,69090947,-2096270336,1962935934,507413285,510918660,425603,1996425844,-26104,149618688,-1710721281,65535,-1559869813,-310180834,535137026,80366941,-1873273344,-326412987,-2082959842,-1070920468,-1097183152,-1996488704,1451882054,1975651320,8907011,1343161016,-159973550,16777114,-196704000,309706763,-1207535873,-1202716662,-1706027880,228,1996448235,18520582,-1073020928,-6664844,-16776961,882570358,-1996488703,1451883078,1958874108,1996444191,-25862,1996423168,24943348,28835840,1996443648,-25868,283836416,-1207535873,-1202716662,-1706033120,65535,98714,-16192768,-6622090,-2097151745,-443874579,-900899553,1478361090,-1957345904,-661774612,-2095256445,93758,1996451700,-26106,-1073020928,28861300,-6664192,-1996488449,-1072961466,-1706013068,65535,-1981528439,-1070864810,-1980742007,1183575622,-364475932,-336832887,-297368824,-262765823,-362888192,652887807,1962950528,808910828,-428409067,-1804545,1996484726,1632494,-1696041217,65535,16777114,49120000,1562371467,182861,-2081649835,-1070918420,2130884688]},{"sector":2,"data":[-1706012007,65535,1358841481,184986,-163149568,16402119,108954368,-385647360,159318288,294531,99156855,-26111,1183383552,-195655182,146842,-297367296,-1192208759,263864896,-11513344,1996485750,-25870,1183383552,6600956,-61961319,1183447543,1975520250,-96024827,1183514625,1446746618,2081193734,71711493,1183516019,-1962677254,1183384646,-62485510,6601113,1183447543,1975520236,-330905820,501940225,150682,-262784256,1178273141,-1710328594,65535,-1980873079,1325396054,-327253012,-1948418304,697956934,1444480070,-95486202,16416387,1089012605,140428543,638076671,1183319946,1946828024,45193956,-1073020928,1996439678,-129594100,28856342,-962965504,184549378,-2094301504,149054,2122366836,-1183511048,16777114,2126514944,209125141,503587000,112720,-26032,-1073020928,1996462975,-25866,-443875328,336249437,-1879047424,419495680,2030109440,251658496,-218037504,285212928,-1425997056,301990144,-973012224,318767360,-1711209728,-1996487936,-385809664,-1979710720,-1560214784,-1962933504,-721353984,218104577,-771685632,-1929379072,-1694498048,771817218,-905903360,234881793,654377728,-1912601855,-301989120,872480513,-2046819584,956366594,1593836288,973143808,939524864,989921024,771752704,1006698240,-1610546432,-1392508159,-1459551488,1157628673,1937009920,1458342741,-16222465,28837494,630870016,-1962934272,931857502,1946580537]},{"sector":3,"data":[142016276,1354771286,22170,73304832,-1996077429,-443851257,442973,-2081649835,-1957297428,2005599326,-1961563390,926483550,1996426356,-1070901754,7182928,-1958346752,2000225374,-1803004,939460214,1342177720,16777114,-443851264,311901,-2115204267,-16744212,1996424822,-2142860028,12079126,-6664191,184549631,-1207601728,48955393,-443826133,1478411101,-1957345904,-661774612,-1157627976,1347616767,-1710852353,207,-1995524957,-1206995434,-4521985,-11513089,-426113418,-1560281088,378080952,-4714822,-17665,1996443730,16620038,-1130168320,-1105819378,-18418,1392508858,108461904,70810,247767808,247862921,-1157627976,1347616767,-1710852353,299,-1995521885,-1206992362,-4521985,-11513089,1117390454,-1560281087,378080968,-4714806,-17665,1996443730,22649350,-794624000,-770275058,-18418,1392508858,108461904,94362,248292096,248387209,-1157627976,1347616767,-1710852353,391,-1995516765,-1206987242,-4521985,-11513089,-6683018,-1560280833,378080984,-310178086,535137026,46812509,-1873273344,-326412987,-2116514274,17828990,28837237,-2128811264,17894526,2122519413,225771786,-15829249,2140801654,-352321534,-2084557855,-443874579,-900899553,1478361098,-1957345904,-661774612,-1962611581,272436294,1024488449,57999633,1023458793,1198784787,-956252695,973830,-569981184,-16777202,-1070920074,13154384,1354771280,-26032]},{"sector":4,"data":[113704960,331490,-1560124767,1996426976,2865166,-533266608,1354771214,16777114,112640,-2130670103,-938549754,-600375552,37795854,-62485168,-566821040,-26098,-593297408,-58817778,-2095156224,1946680446,242679576,-1705983957,65535,-15829249,194706550,-352321533,-502333512,-499219698,-1384185842,249564927,249577091,-1206878976,-1706032576,709,133973703,-943527168,84861446,-8984320,1024083595,74711041,283885611,1342324920,16777114,-62470400,-1645543418,-1962742397,1297948645,503319242,1430622296,-1910575989,205949912,1946226749,17906978,1183518069,81162,37554548,722826240,-15144000,28839542,1452953600,-1207959549,132841473,722368255,-2081494080,-443874579,-900899553,1478361098,-1957345904,-661774612,1024214667,578027792,1963004221,172395277,1946157373,146697,-1070918284,1996429547,112654,-26032,28835840,-16258304,-1070920074,-310120725,535137026,181030237,-326413056,1460333699,-96024746,1183514624,508567048,-26032,1183383552,138806262,-6664162,-1962934017,-2130801680,292829756,1965964416,-8617965,-2096270034,1963128446,-129579257,954925056,1968979072,-129579257,753598465,425603,-1070922636,45614059,-129595136,1929936441,775782423,1183523956,-1957683704,-1706025273,915,-454297461,503399565,-129594544,503596547,126655056,1599995904,-1034033781,1478361094,-1957345904,-661774612,-1962218365,272436294]},{"sector":5,"data":[1023898625,762577169,1996437739,374798,42252368,1788497950,-16777211,-1070920074,-1202696112,726663180,-90550080,-1207959546,-2065104895,172395264,1946157373,146697,-1070896780,1996452843,374798,249870416,-2135404514,-1684385792,-1207959547,726666980,1622692032,-320319488,249870590,-337096674,79987707,309706763,-1207011585,-1202716658,-1706029340,65535,1996465643,1354771214,1343153336,-1705983957,65535,201082505,-7572032,28839542,-16389376,-1070920074,102603344,1994981376,49120255,1562371467,707149,1167087646,518818645,-326903666,205949702,1946226749,17906954,-1070892428,-2097063959,151614,129500532,-1207702784,1755512840,1379828480,91488258,-352318792,636931,-16748893,1756892790,199774208,242679803,1342205624,-327192,196611702,922701824,-1070923164,89758288,1996423168,2799630,1647771472,1354771202,145818,242679552,1342179000,503473848,118200912,28835840,14870784,755648139,154992641,-385649152,-1073479816,-1476448621,1996424767,440334,40286288,515395614,2073710592,-16777209,716705398,1183666176,726669050,-644198208,-1996488699,2122579014,225706234,2080375101,16792840,1654850429,242679554,1342180280,385500813,1354771280,16777114,-62486272,16416387,37555572,1023966208,58523663,-2096995165,117467198,28837237,721611520,38839232,7224963,-1207601910,48955393,1386463275,242679554,1342177720]},{"sector":6,"data":[116634,-11867904,-15829249,1756891766,-16127232,1996426870,7256074,-104535984,-1962987543,-100264699,-100337148,604305924,788931590,-385470714,-310116584,535137026,181030237,-326413056,74877782,1015025899,-2147126230,91569980,-352321096,1015039496,736851200,-443851072,180829,-2115204267,50332798,1996435061,112646,111647312,-11534336,95946358,1486508032,1342177287,1342181048,1347469355,-26032,-1706033152,65535,-1034033781,1478361092,-1957345904,-661774612,17755265,205949782,1946226749,17906952,-1880536204,242679554,503346360,309328,833616,1074837584,-26032,1996423168,374798,8042576,-6664162,-16776961,95948406,364400640,-2135404540,-1070903296,-6664112,-1207959297,1240006657,172395266,1946157373,146715,-269941899,277760,-169278603,343296,518587253,35973378,-1207011585,-1706033151,65535,-26032,-1073020928,199820149,242679554,1342178744,-8616307,-2135404522,-6664192,-1929379585,385807494,2089192784,-1706027265,65535,-17529203,112720,5814352,-70129584,-17529203,-21370800,863289355,-1928431873,385807494,309328,833616,1074837584,157129296,-1073020928,1996428660,374798,-192508592,-1706027266,2757,-1929275927,1358920838,-1202667477,-397410216,-2037515389,-397344900,-1072955797,-1070920844,-26032,1877540864,2089192705,-1706027265,2875,-1928431873,1358920838,16777114]},{"sector":7,"data":[1975520000,22079747,-1207011585,99287041,722368255,-828747584,-385875964,1183514938,81160,37555060,-385649408,669581565,242679553,1342178744,-8616307,-2135404522,1301958656,-16777206,-2037576074,1343684340,1342178488,16777114,1975520000,-11605757,-17529203,-1835380714,-1996488696,-1912637818,385842310,160471632,-2037841920,-259260550,-8617331,-8878455,1065408651,-2147126230,91568703,-352321096,-1983894782,-1912638330,973044870,1996454022,2089192780,-1957685505,520059014,161126992,-2037841920,-661913736,-2037905526,708640498,1060897908,-2033777035,130932,-8872309,-2037905526,1547501298,977011828,-2037663371,1344208760,642458,2022082816,1958642687,343146751,-9009525,-17527155,-762527485,-2037690286,300679032,-9009525,-17527155,-762527485,-2135404462,-1706025472,1022,-97303,-2037576074,1343684340,1342178488,1342180536,1346375864,659354,1975520000,-35067645,-106519,1996426870,-48961528,-2090942421,-443874579,-900899553,-1957363702,82609132,503596683,-1706025392,902,503596547,162634320,1183383552,71732222,1996375609,-1957683669,1344208454,256154,-28931840,126539915,1023166088,1006924892,-1948617414,1344208454,710298,-28931840,-1946270069,46292453,-1873273344,-326412987,-2116514274,1442876140,1024214667,192151824,1963004221,15722755,-16710423,-1070920074,-1202696112,726663180,1201295552,-2147483644,1234494,922689909]},{"sector":8,"data":[129503956,-2037559296,1343684476,1342210232,16777114,2089192704,2022083071,-8590337,213388918,-2037559296,1343684476,1342210232,733338,-62486272,-1165954933,1952251771,2088945168,1191140607,-59339780,-8617274,2022098688,-1206724865,-397405482,-2037776632,-2037514374,-2037776516,-2037645450,-2043019398,242483064,-8872309,-8997237,121111690,-1635045004,1065418614,-1962248960,973044358,1946122374,2022098694,-15542529,95948406,-2037690368,1344208760,275354,112640,-1962861847,520059014,182819408,-2037841920,-2037645448,1344208758,16777114,-1952978176,20777542,1024816128,57999362,1023466473,57999365,721476329,14805440,-1207011585,-1706033151,1690,123640400,-1073020928,1996467060,374798,2089192784,-1202710785,-1706033024,1139,-8616307,-6664170,-1929379585,1358920838,-1202667477,-397410216,-2037516253,1343684476,-2081087000,-1073019708,1996428405,964622,2089192784,-1919266561,-385875957,-2037514409,-1705967748,65535,427081739,-1207011585,-1924136935,1358920838,303258,474368,820577141,242679807,-8616307,-26032,-1073020928,485032821,2089192959,-6663937,-1207959297,1344148182,-8616307,1083854870,-16777207,28839542,-1785049088,-385875955,1996488435,-339727602,242679792,-402098433,-521536862,-310157570,535137026,181030237,-1873273344,-326412987,-2082959842,1183516908,17841420,289213300,-385649407,65601803,1711720193,-1593835505]},{"sector":9,"data":[1688404550,38314255,-1592824669,1789067850,39100687,-2096142173,150590,364381556,-1207702784,-2036137964,1312719616,91488258,-352315720,1554435,-16741213,-1934094730,-672641024,242679795,1342182328,258225919,818586,242679552,1342181816,258619135,822682,242679552,1342182072,258750207,901274,242679552,1342183608,1342444984,1342178232,1347469355,467866,242679552,1342183608,258488063,-1705983957,1350,-1207011585,-397410170,1996485490,1488910,216504912,1183383552,28856568,-6664192,-16777204,397938294,194662400,-1996488691,-2091845562,1281598,28837236,721611520,-1130737472,-16777210,922685046,278528134,-1996488693,-1705969594,65535,837402667,142508801,-385649664,1183514917,77066,1996494397,-1816132633,497549102,242679566,1342183608,385500813,1354771280,372634,258515712,16416387,1419969396,258253058,-1593686365,1218645868,258646274,-2097001821,369134654,28837237,721611520,38708160,8797827,-1207601899,48955393,1285799979,242679554,1342177720,537498,11528448,722368255,-2081363008,1008702,28837237,721611520,258253760,-1207011585,-11534317,-1710267338,15,-2097117975,1010238,28837237,721611520,258646976,-1207011585,-11534319,-351311306,1816036314,91553807,-352321096,-1547687166,1996427116,1226766,1815543632,-4396273,1996426870,8828938,-235870128,1996437995,175570702,-352285512]},{"sector":10,"data":[-1676854801,403511309,403511309,403511309,403511309,403511309,403511309,403511309,-452081907,51225357,302908174,-1207037426,-310181887,535137026,181030237,-326413056,1459809411,74877782,-1996335455,1048772932,1946157636,2078725,548930539,457476352,50676875,755128838,1149829124,591694595,39323139,-1591655287,-1073020324,20777588,-1088588800,65732624,-1996484929,1587612028,81154,37561972,-1089833984,149618715,-352317505,1687526,-1592820599,-1073020320,20778868,-1089506304,233504798,-352314689,1884135,499057643,360483072,-443850914,-1957313699,1988843244,21269252,-2096998749,1964972924,112645,-1070923029,-1962785629,1143677252,39363363,721634443,67437892,39494400,722814091,1621301060,157059842,-787784661,-1836610589,39625472,722427019,-472837796,9996171,-1962778973,-788373474,-1635283997,39887616,1575324510,-1873273149,-326412987,-2082959842,1183517420,17841420,289213812,-385649407,-1070923589,-1207813143,-397410140,-997982505,242679554,1342220216,-1005080,-1380446602,-1612165120,242679792,1342223288,-1010200,-1179120010,-1947709440,242679792,1342226360,-1015320,-977793418,2011713536,242679792,1342180792,10827519,-1705983957,3256,24002179,-11504640,1048776310,1946157636,2144261,532153323,395988992,-1996488688,-1072957370,726665588,664424640,-16777200,1048776310,1962934872,2275333,565707755,-828747776,-1996488692]},{"sector":11,"data":[-1072957370,726665588,-610643776,-1207959540,-2048327679,172395265,1023410477,58064936,67057641,-13724736,-971939417,41990,12533379,-1207601889,48955393,1183432747,242679802,1342180792,385238669,1354771280,870810,-62486272,16154243,1480405364,2132177922,4930882,1849495412,1024095232,91488406,1963011133,-62485743,-2097109597,1946221182,314588426,1187448190,-2097151754,1962997374,242679609,1342183352,16416387,582492276,1025436416,-848034640,1946617917,157302216,-1069694092,1035891730,-1183570560,565758187,1805275136,-385875957,-1531379903,-35106816,46433277,355481343,1342324920,-1705983957,65535,113640939,-16711516,28839542,-811970560,-385875957,1996488465,175570702,-352278600,242679605,-1207273729,720044205,-15829249,-1279784330,-14685440,1996426870,12171274,1996428523,175570702,-352272456,242679561,-1207273729,-397410107,-890638686,101730302,1980724753,1980724751,1980724751,1980724751,1980724751,621770255,621880593,1980724753,1980724751,1980724751,1980724751,806432783,990982161,990984977,1175537169,1360089361,1360089361,437328401,437328401,-384755183,-310116747,535137026,181030237,-1873273344,-326412987,-2585058,722654262,1996443840,808910600,106859285,-472783919,246855679,246724607,16777114,-310142720,535137026,80366941,-1873273344,-326412987,-2585058,722654262,1996443840,808910600,106859285,-472783919,246855679]},{"sector":12,"data":[246724607,16777114,49120000,1562371467,939838029,-33488128,1744831239,1358955008,83951361,973079040,100728577,201327104,117505793,587203072,134283009,-184548864,151060224,2130706944,167837441,-1241447680,1862271750,-1610611968,335609602,1509950208,352386818,-1275067648,402718468,-486538496,419495696,1744830976,369164033,2013266688,436272907,-570424832,385941248,419431168,453050120,-1291844864,469827339,-1577057536,486604555,768,503381777,436273920,167772930,1946223360,201327362,335610624,369099533,-16710912,570426127,-1207893248,855638272,369165056,587203339,755041024,-1342176502,-1895759104,1241514240,151061248,1291845897,-771685632,1308623112,201392896,1325400328,-1023343872,1476395275,-2097085696,1509949704,-1392507648,33619712,-1006631680,50396928,1308624128,83951361,922748160,100728577,150996224,117505793,536872192,134283009,-234879744,151060224,2080376064,167837441,-385809664,1459618577,318833408,1476395793,553714432,1493173010,-285146368,1526727439,-671022336,1543504647,1593901824,1560281864,-805240064,1577059087,1694500096,369164033,-620755712,385941248,1828782848,1593836304,1828782848,1627390732,1895891712,1660945160,-1040121088,1677722375,-1526660352,1694499596,-1342176768,33619712,-956300800,50396928,1937009920,-2081649835,1183515372,-1202708988,1344147406,1346372280,11418,2109737728,71732000,-826781666,-1202708977]},{"sector":13,"data":[-1706029056,99,201213577,1342865088,38298,-339727616,-18429,-1034033781,-1957363710,82609132,-13937065,503596683,265205840,922701854,-6683624,-1962934017,2096499696,-1070901714,45633616,-6664192,1442840831,504385208,372703056,-26108,104529920,57934870,1459617471,16777114,-1090262272,113770490,1046,1600046987,-1034033781,-1957363710,82609132,1988843095,75401990,16533191,-62470400,189726720,-2129298177,267838,-15565822,1911031926,-62486017,91537419,-335788405,1183362077,1975519998,-28916220,371100448,369557252,-28931580,273581960,1600046315,-1034033781,1478361094,-1957345904,-661774612,185222795,1024226496,846462977,1946157629,-14226625,-739768202,68854782,427147275,503481528,138840912,-6664162,-1207959297,1344144004,16777114,68854016,-2068309013,1996443650,108461832,-1543548952,-370473958,1342342328,-335618072,49120224,1562371467,576077,1167087646,518818645,-326903666,1782481670,57999361,-956267287,64070,425603,922687102,28841264,1996443648,108461832,1575489168,-96040449,16416387,922687605,28841264,481841152,45633540,244338688,-1979760664,2122578502,1064567034,23725767,922681344,-6679248,-1996488449,-1202652090,726663177,-6664000,-2097151745,1979644542,808910609,1030165,2078800,42834512,-692584448,-6664174,-2097151745,-443874579,-900899553,1478361092,-1957345904,-661774612]},{"sector":14,"data":[-2091062141,92734,1183670132,-6664028,-1962934017,-1962439720,1183384151,-1437169240,1354771282,112720,-26032,922681344,45618480,-1070903296,244338768,-1979800600,-1072956346,-29547660,-15895041,-1206570954,-1202716657,199950367,355481343,1342182840,1342342328,16777114,49120000,1562371467,838477,33947651,1638655,34537475,1835263,37158915,2162943,38928387,3539199,32440579,10092547,31392003,10289155,1376515,4849665,21561603,5177345,3735811,5308417,7799043,5505025,8782083,5636097,20906243,5767169,0,5,0,0,0,0,0,0,0,1,65536,0,0,0,0,24,25,0,0,65536,0,0,1412311644,19794,1412311644,21592,458752,8,655369,1381248554,774504525,5067348,1381248554,77,1376276,1441792,23,131073,65538,0,131073,0,687875328,234881024,4096,452991232,469762048,7680,536878848,553648128,8704,1,0,0,457912091,993083227,1528521522,1528524336,1848848703,0,23,589824]},{"sector":15,"data":[0,0,0,0,0,0,2304,0,0,0,0,0,0,65536,0,0,0,0,1329790976,16205,16842752,1,65536,65537,65537,78643250,458752,131072,3932160,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16842752,1,65536,65537,65537,78643250,458752,131072,3932160,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16842752,1,65536,65537,65537,78643250,458752,131072,3932160,2]},{"sector":16,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,655392,1769366852,1996514659,1868852841,29559,1413545985,1361064022,1413549360,724238349,1413546027,864328,826823745,1413545997,64884058,65404936,65667075,65929219,66322437,66715653,4,43010,2573,10,0,0,0,0,0,0,0,0,0,0,0,0,4325440,393216,2375,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,50331648,52429592,1953301356,1819506547,257,4194304,524352,-65536,-1,-1,-1,-1,-1,-1,-1,-1056964609,0,16776963,0,16711424,0,16547584,0,16269056,0,16260864,0,16260864]},{"sector":17,"data":[0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16260864,0,16523008,0,16662272,0,16744192,0,-2130706688,0,-1056964863,0,-1056964861,0,-1056964861,0,-2130706685,0,16776961,0,16711424,0,16547584,0,16269056,0,15736576,0,14683904,0,12584704,0,12583680,0,12583680,0,12583680,0,12583680,0,12583680,0,-64768,-1,-1,-1,-1,-1,-1,-1,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1056964608,-1,2130706684,-1,-16776962]}]],[[{"sector":1,"data":[-1,-16776961,-1,-268435201,0,-268435441,0,-268435441,0,-268435441,0,-268435441,-1072942285,-268435441,-1072942285,-268435441,-1072942285,-268435441,-1072942285,-268435441,0,-268435441,0,-268435441,0,-268435441,0,-268435441,3354627,-268435441,3354627,-268435441,3354627,-268435441,3354627,-268435441,0,-268435441,0,-268435441,0,-268435441,0,-268435441,0,-268435441,0,-268435441,0,-268435441,0,-16777201,-1,-16776961,-1,-16776961,-1,2130706687,-1,254,0,0,0,0,0,0,0,0,0,0,0,0,0,117440512,-1,251658464,1020261180,251658480,1020261180,251658480,1020261180,1325400304,1020261180,-218103566,-806142769,-218038212,-806142769,-217874372,-806142769,-217595844,-806142769,-16261060,-1,57599,0,0,0,0,0,0,0,0,0,0,0,0,0,1953300480,1818838544,16777317,2003127808,131072,1852141647,3026478,1392509696,6649441,1392510080,543520353,774796097,1158676526,7629156,1124074752,544829551,843472416,425984,1953718608,1125122149,1920233071]},{"sector":2,"data":[27759,1866661895,1667591790,538976372,3360350,1342179328,1953393010,538976288,877026848,589824,1953521987,543519349,1180573728,167772213,1969311744,538994035,1579163680,13894,-2147483648,1916928014,543908197,538976288,3622494,1952797584,1735289204,184549491,1919243264,1634625901,774778476,786432,1835888451,1667853941,1869182049,774778478,884736,1852794960,774778469,1937009920,1852601207,1784900971,-2143289344,285218310,1258328064,0,327717,524356,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,130946,234881024,134254592,33554176,-2108685824,1836213588,1818324585,2490368,4194338,-65528,1342308353,1919243906,1852795251,808333600,83886129,-2080362752,-16774912,33554943,1866695248,1769109872,544499815,959520937,539768120,1919117645,1718580079,1866670196,3043442,989869312,234889216,16777472,-2142240000,27471,-1874853888,335549446,1342215168,0,131118,786532,8388613,8474755,335545344,939542016,50332672,-2091867392,5701632,3276840,65550,1342373889,1701859200,1459617902,838875648,33558016,50331648,1631813712,1818583918,5111808,3932180,786444,1342308352,33554562,671089152,3072,33554944,1766228560,1634624876,3827053,1937009920,1852601207,-1866465280,335549445,989906944,1409286144]},{"sector":3,"data":[1768780389,543973742,1919249473,167780724,-1275067136,3072,33554688,1699971664,1852404852,1746957159,543520353,1851877475,778331495,655360,11796500,12,1342308353,1986089858,1751326821,1701277281,1700929651,1701998438,1869374240,1735289203,671088703,587211520,16780800,50331904,1700364368,1342177395,587211520,50335232,50331648,1867415632,7864320,2293795,131086,1342373888,1851868032,7103843,1937009920,1852601207,1784900971,1685285995,-1874853888,335549445,805348864,0,983052,786536,8388613,8474755,33557504,201344000,0,-2108685824,1702256979,1952805664,1735289204,1935745139,1342177338,1207960064,201329664,33554944,33360,983160,917539,65537,1400918019,6649441,553678848,234889984,512,-2142240000,1668178243,27749,-1874853888,335549445,805348864,0,983052,786536,8388613,8474755,33557504,201351680,0,-2108685824,1702256979,1668180256,1852403055,1702109287,1763734648,14958,131172,786492,131084,8540162,251688960,234889984,16777472,-2142240000,1702256979,7864320,2293793,131086,1342373888,1851868032,7103843,1937009920,1852601207,1784900971,-1874853888,83887364,872445952,0,327685,786532,0,1099059202,2032166258,1931507055,543519349,1952540788,1970239776,327680,6553618,12]},{"sector":4,"data":[1342308352,1851881346,1869881460,1936286752,1852731235,1064592229,327680,2621473,65550,1342373889,1936021888,4259840,2621473,131086,1342373888,7294592,1937009920,1852601207,1784900971,1685285995,-1874853888,83887365,1090549760,0,327685,786532,0,1417826306,1701995880,544434464,1881173870,1701736296,1836412448,7497058,285213952,201352192,0,-2108685824,1948282473,1344300392,1701736296,1952797472,1735289204,11891,1900549,786532,0,1149390850,1870209135,1635197045,1948284014,1868767343,1852404846,4154741,738198784,234891264,16777472,-2142240000,27471,2883649,917544,2,1132482563,1701015137,1828716652,1937208180,1835757164,1818978915,-1874853888,83887363,755015680,0,327685,786532,0,1468157954,1769236833,1713399662,1629516399,1702327150,14962,327785,786452,43,8540162,335553280,234891264,16777472,-2142240000,1668178243,27749,2004055149,-1874853888,251659534,1845544960,0,327685,786512,0,1417826306,1768780389,543973742,1953785171,1936158313,327680,3604505,12,1342308352,1919243394,1634625901,2035556460,25968,1638465,786462,262165,1451249667,3290452,419462400,201336832,67113984,-2142240768,1230196289,327680,3276840,1245196,1342373890,2003127936,1852394528]},{"sector":5,"data":[1090519141,838871040,301992960,50332160,1867284560,543973731,1869112133,8192000,4587560,1114124,1342373890,1953841536,1918312559,1918988385,1684960623,327680,4587577,12,1342308352,1852394626,1763734373,1967267950,1919247974,1342177338,335558912,402656256,-2097152000,33104,4587525,786482,0,1417826306,544503909,1702521203,4259840,2621510,1441804,1342373892,1918979200,25959,4587645,786472,262167,1400918016,1819042157,4259840,2621530,65550,1342373889,7032704,1509981440,234891264,512,-2142240000,1668178243,27749,-1874853888,251659549,-1862219776,0,327685,786552,0,1132613634,1970105711,1633905006,1852795252,1699946611,1852404852,29543,1310725,786482,0,1115836418,543454561,1702125906,922746938,486544384,218106880,-2097152000,33104,2293765,786482,0,1468157954,543453807,1735288140,26740,2293815,786457,262181,880824323,5242880,1638435,2490380,1342177284,13696,2293865,786457,262183,914378752,8519680,1638435,2621452,1342177284,14208,2293915,786457,262185,947933184,327680,2621490,12,1342308352,1918980226,7959657,838874880,201339392,67115264,-2142240000,1852143173,6881280,3276850,1703948,1342177284,1684295552,10158080,3276850]},{"sector":6,"data":[1769484,1342177284,1852788352,83886181,671105280,3072,33554432,1951629904,1109422191,7566441,1090533120,201339392,67112448,-2142240000,1761607729,838877440,251661312,1024,774996048,-1694498763,838877440,268438528,1024,3309648,1342178560,201336832,0,-2108685824,1684955464,1801545843,922746981,838881280,469765120,50332672,1331200080,1331179374,26214,5242985,786482,262173,1216368640,2003071585,6648417,1342216960,201339392,67116544,-2142240768,1701736270,327680,2621535,12,1342308352,1852785538,1952671086,7237481,1593849600,201339392,67116800,-2142240000,1701080909,1761607789,1006657280,536873984,1024,1866694736,1953853549,29285,7208965,786472,0,1350717442,7631471,1845507840,201336832,67117312,-2142240000,827150147,1761607738,671116800,570428416,1024,1329823824,3813965,2097166080,234891264,16777472,-2142240000,27471,8192115,917544,2,1132482563,1701015137,1828716652,1937208180,1835757164,-1874853888,83887375,2013306880,0,655365,786502,0,1350717442,1701736296,1952797472,1735289204,83886195,838867200,3072,33554432,1866695248,1667591790,1869881460,922746938,1677728000,100666368,-2097119232,33104,2621445,786482,0,1149390850,543973737,1701869908,3932160,1966120,458764]},{"sector":7,"data":[1342373892,1852789888,1593835621,503326720,134220800,1024,1968210000,6648684,922748160,201336832,0,-2108685824,1701146707,1006633060,503330560,150998016,50332672,1817411664,30575,3604575,786462,262154,1182814208,7631713,1174406400,201349632,0,-2108685824,1953063255,1919903264,1852789792,841490533,691351853,1593835578,335561728,184552448,-2097152000,33104,5570565,786532,0,1468157954,544500065,544370534,2004053569,673215077,892480817,3811638,1392535808,201331712,10752,-2125430016,1310720,2621540,65550,1342373889,7032704,1677744640,234891264,512,-2142240000,1668178243,27749,2004055149,1648429056,779384175,671755822,1769238133,1684368500,1700005929,1852403058,1124559969,1701736047,1141732451,1868788585,1667591790,774778484,1380275208,1481911885,1163135060,1412321357,772033874,72176212,1415074862,1953451541,1869505824,543713141,1869440365,1948285298,1125064815,1869508193,1919098996,1702125925,537534522,544501614,1853189990,1631784292,1953459822,1986097952,455096933,544501582,1635131489,543451500,1836213620,1818324585,1818846752,421542501,544501582,1970237029,1679845479,543912809,1667330163,1869881445,1937009952,1852601207,1784900971,544165410,2004053601,539914853,544162848,544567161,1953390967,544175136,1768187250,557804641,1852727619,1663071343,1970105711]},{"sector":8,"data":[1633905006,1998611828,543716457,543516788,1701080941,1631784045,1953459822,1769107488,1125348462,1869508193,1868767348,1667591790,1869881460,1142759482,1870209135,1769414773,1948280947,1634934895,1931502966,1769239653,1064527726,1851867921,544501614,1953067639,1869881445,1125261370,1869508193,1701978228,1713398881,980250482,1699948832,1952671084,1646290021,543454561,1702125938,544434464,544501614,1886418291,1702130287,1868963940,387988082,2032168772,1998615919,543716201,1663070068,1701736047,306148451,1819305298,543515489,1936291941,1735289204,538583098,1679848297,1734438241,757097573,1634692128,1650532452,1702130287,1629498980,1634038380,1696627044,1953720696,538979955,2032168772,1998615919,544501345,1629515636,1852141680,1869881444,1064593696,1936269337,1937072672,1126182521,1869508193,1868767348,1667591790,1225404020,1769236846,2053729377,1632832869,1931502966,1769239653,208889710,1953521987,543519349,1954047348,2004055149,1802398835,1886339849,1702109305,1661498488,1970302319,91383156,1701080941,22020461,538968899,542966875,1342513197,1953393010,0,0,2004055149,1802398835,1802134381,83915017,7473408,1929969671,150996992,589940,167802121,7768320,1953300494,11856131,-1142419824,1312719088,57999364,-1207917079,1344144462,504039096,268613712,259562064,1183383552,2092960764,63879202,985157662,-1202708982,-1705992190,4133]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[48689,43776,0,156041216,1310720,1441814,1441814,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,1886549325,639662440,1819033888,539782757,1818322258,1936879476,825297421,540030265,1752446513,1702248736,776282158,1699946540,1819571297,1461726309,958406721,842084664,168626701,168626701,1346720336,1313428033,541139015,1162694472,1380927008,1279349536,218762565,1970231562,1851876128,1684960544,1953722981,543452769,1952540788,1869116192,1735289207,1746952480,543518063,1763733364,1646293876,544502629,1635148897,1734440046,1634541669,544433515,543516788,1702458722,1635197042,1948284014,1970282607,1634231154,1897948531,1801677173,1629518188,1629512814,543236212,1953785186,1881174629,1701013874,1210064942,543519333,543519329,1701670771,1936028704,543450484,1936746868,544175136,544499059,543516788,1734440051,1868963941,543236210,1718579824,1650553961,1629513068,1696621678,2037150305,1818325792,168636005,1766197773,1886724216,1936615712,778396777,1631723552,544828516,1701077350,1635197028,544435308,1998615151,544109167,1685024631,1802661751,1684369952,543515509,1701867617,539913313,1818579744,1769235301,1881171318]},{"sector":12,"data":[1953392993,543649385,1819044215,1818585120,1870209136,1684086901,543236196,1936028262,1869357160,539913071,1701593888,1998614113,1868852841,1629516663,1965057134,1918987630,543450482,1819042167,1769414771,1663069292,1952540018,543236197,1734963810,539784296,1701144675,1629518194,1634037872,1668178290,168636005,1632438797,1830839659,1919905385,1885696544,1936877921,1142956078,1886415218,543649385,1668637030,544437349,1819042147,1953784096,1769238117,1948282479,1634082927,2037673077,1970040864,1852400237,538979943,544567129,1970235507,1830839404,543517537,1701999987,1819042080,1970040864,1852400237,1936269415,544106784,1685024615,1919907616,1735289195,1685221152,539914853,543574304,544567161,544104803,1920102243,544498533,1818324339,1953046636,745762149,1663066400,1769236850,543973731,1936683632,1952671088,1851876128,1852793632,1953391971,1702125938,544108320,1869242733,1868767346,1684632430,1952543333,1936617321,1277173806,1702063983,1869571104,1852514418,544432751,543452769,1667855475,1735289195,1634886688,1936876919,544370464,1919905636,1633886323,1768169582,1634890867,1948284003,1646290280,1919252853,544432416,1819043191,218762542,1919501834,1763734643,1701998701,1869181811,1629516654,1763730802,1919905901,1953390964,1495277614,1931507055,1819635560,1701519460,1948282981,1814062440,544110433,1835627124,543450477,543452769,1701274725,1663052900,1769237621]},{"sector":13,"data":[1702125942,1869375008,544367991,1935959394,1851858988,1701978212,1702260589,1819042080,1717924384,543519605,1663070831,1953789292,1713402469,544042866,543516788,1685217657,1769152556,1635214692,539781996,543452769,1668444016,779314536,168626701,544567129,1970235507,1881171052,1931508065,1768121712,1629514849,1852142708,1852795252,544175136,543516788,1668573547,544105832,1852139639,1701998624,1769103728,1948280686,1746953576,543518063,544370534,1701601651,1394614318,1768843624,1864394606,1936614774,1634869292,1936025454,1851858988,1885413476,1634298992,1936024430,1818851104,1633886316,543712116,543516788,1702458722,544417650,543521125,543452769,1701536109,1730175264,543453039,1919970665,1769173861,539913839,1701137184,1735289200,1701344288,1970234144,1919251566,1851859059,1769152612,1663069038,1918985580,1629512805,1847616622,544498021,1701536109,1752440947,1768628325,1701340020,1869357166,1931504495,1768120688,779318639,1866670112,1718775660,1663069301,1635021429,544435817,1746955881,1869443681,1998616942,543716457,543516788,1853189987,544367988,1936748404,1684955424,1869375008,544436847,543450209,1701867617,1629514849,1702305907,221146220,1107954954,1919448161,1936551791,1634235424,1886593140,1818980961,1633886309,1700929646,1914724640,543973733,1937075312,1495277614,1931507055,1819635560,1751326820,543908709,543452769,1651863396,1663919468,1801676136]},{"sector":14,"data":[1701344288,168636013,1698826765,1869574756,1629516653,1763730802,1919905901,1953390964,1668245024,1881173089,1953393007,538979955,544567129,1819044215,1852401184,1953046628,1919907616,1948280948,1696621928,1919903334,1869881460,1701145376,1752440944,1847618917,1819566437,1918967929,1735287154,221144165,1124732170,1702063980,1814066036,543911791,1735549292,1998615141,544105832,1953459299,544433512,543519329,1886351984,2037150309,1853188128,1851859047,1752375396,745760111,1952540704,1629498483,1864393838,1919248500,1953653024,1701602153,1918967923,1818304613,1852383340,1634496544,221144419,1393167626,1919508852,1937334647,1701602080,1684370017,543584032,1701470831,544437347,543452769,1953718895,1701602145,1634541683,1763730795,1634017396,1919248755,1919903264,1869770784,1667592307,1948283764,1869881455,1948283509,1746953576,778399087,168626701,1769239617,539784035,1702060386,1953391981,1629498483,1730176110,1734439521,1629516645,1763730802,1919905901,1953390964,1634035232,1701999988,538979955,1914730818,1987013989,543649385,1701736053,1936942435,544830049,1970037536,1919251572,1768453920,1830840419,1746958689,543520353,1969447777,1634497901,744777076,1970239776,1818851104,1768169580,1634496627,1752440953,1969627237,1981836396,1702194273,543584032,1919906931,543516513,543452769,1818850421,544830569,1667330163,168636005,1666386445,1969513832,1931502956,1769434984]},{"sector":15,"data":[544434030,1952540788,1701994784,1852793632,1768842614,544501349,1948282739,544498024,543516788,1701670760,1818851104,1700929644,1701998624,1953391987,1629512805,1953046644,1700929651,539915379,1919242272,1634627443,1851859052,1634082916,2037148013,1769107488,2036556150,1869116192,543452277,1914725730,1701868389,1684370531,218762542,1970231562,1869116192,543452277,1668508004,544437109,543516788,1685285239,1864396143,1851859046,1634541689,544370538,1785688688,544498533,1752459639,1701344288,1634038304,1936007276,1702125940,1701273888,1646294126,1919903333,1919950949,1701143407,1735289188,1293951022,544829025,1735549292,2019893349,1684956528,1920300137,539784037,1970235508,1847617639,1701078373,1830825060,1847621985,1646294127,1667571813,1836019311,1818321769,1931508076,1684960623,1768453920,1948280172,1852406130,1869881447,1818587936,543236204,1701670760,220209198,218762506,218762506,1818304522,1852383340,1634496544,221144419,1393167626,1919508852,1937334647,1701602080,1684370017,543584032,1701470831,544437347,543452769,128,194,13107321,7667712,2381,113,0,0,0,0,0,0,0,0,0,1465662019,2119980879,809717572,775041605,5262676,1828913158,48759378,838004880,1828866625,413733321,-258997626,23690,839731777,1828913436,67109633,788,50331924]},{"sector":16,"data":[128,154,12714104,7864320,196,12976248,-65536,200,14942207,-65536,229,28377087,-65536,434,41222143,-65536,630,61603839,-65536,941,73072639,-65536,1116,95551487,-65536,1459,101253119,-65536,1546,108134399,-65536,335625218,1649,1651,115212287,-65536,1759,121307135,-65536,1852,133234687,-65536,2034,142344191,-65536,2173,155582463,-65536,2375,155844607,-65536,2379,156106751,-65536,2383,95551487,-65536,1459,101253119,-65536,1546,108134399,-65536,251739138,589826,1970225968,1919248754,536872448,1986815304,1677721600,1864396143,1851859046,1634541689,544370538,1785688688,544498533,1752459639,1701344288,1634038304,1936007276,1702125940,1701273888,1646294126,1919903333,1919950949,1701143407,1735289188,1293951022,544829025,1735549292,2019893349,1684956528,1920300137,539784037,1970235508,1847617639,-1995815287,-1073018794,1317738101,105286408,-235417037,1183570059,-1947076860,-1875055661,1317787787,106334984,-788248949,-774254101,198758890,-134973989,871402481,-11513134,1996425846,14477320,1996903995,990409223,58065990,855764611,197561298,-150506241,-2082932774,1583022298,146955615,-326413056,-617392553,184960651,-149783104,72780755]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[543516756,1819045734,1852405615,1852383335,1836216166,1869182049,1752375406,1684829551,543515168,1702129518,1868963940,1752440946,1914729321,1634036837,168650099,1293969007,1869767529,1952870259,1852397344,1937207140,1092624430,544174956,1936617315,544500853,1920298873,1852397344,1937207140,1702057248,225650546,1769293578,1629513060,1948279918,1092642152,1852138596,544044388,1818455653,1684370287,544106784,543516788,1801675120,543516513,544370534,1953658214,225600872,1718511882,1634562671,1852795252,218762542,1342835978,1414416722,541544009,1213483351,542397775,541411412,1330597971,223495500,544491786,1881174889,1769173871,543517794,1881173876,1953393010,1869768224,1851859053,1886413088,1633905004,1852795252,1953068832,1953853288,1769174304,168650606,543516788,1869574227,779249004,1750343712,1830843241,1646295393,1919950949,1919247973,1701601889,1701345056,1970413678,1852403310,1852383335,1948279072,168652663,1886350438,1679849840,1702259058,1852793632,1969711462,1769234802,1629515375,1953046643,1852793632,1987208563,1679848293,543912809,1667330163,168636005,1965059924,1948280179,544434536,1952540006,543519349,1851877475,1948280167,572548456,1869574227,1030907244,577987961,544106784,224749684,1769429770,2003788910,1931500915,1769235301,1864396399,1752440934,1230446693,1313418830,1768300617,1948280172,1701978223,572548193,1869574227,1030907244,774008686]},{"sector":3,"data":[168626701,1702129486,1394614330,1769239653,1394632558,1819242352,1849520741,1769414767,1679846508,1650553705,1881171308,1953393010,543649385,1836020326,1852397344,1937207140,1700006413,1852403058,168651873,168626701,1313756498,541544009,1129595202,774381640,693387586,1279870496,1176523589,541937490,1145981271,223565647,543574282,544567161,544109938,1953701985,1633971809,1629512818,1768714352,1769234787,1713401455,544042866,1633820769,543712116,1701603686,1970239776,1752369677,1684829551,1701995296,543519841,1229987937,1768300614,1713399148,1948283503,1646290280,1751348321,1818846752,538979941,543516756,541477200,1701603686,1752369677,1684829551,1986095136,1752440933,1634934885,1344300397,1864386121,1869182064,1931506542,1629516901,1752440947,1885413477,1667853424,1869182049,168636014,543516756,1869440333,1377859954,1769304421,543450482,543452769,1869440333,1142978930,1919513445,1864393829,1869182064,1713402734,1948283503,168650088,1668571490,1229987944,1768300614,1931502956,1819635560,1818304612,1937334647,543515168,544499059,857763700,539904818,1936287828,225667360,1684957450,1852141669,1953391972,543584032,543516788,1869440365,1914730866,1769304421,1701668210,544437358,544370534,543516788,1819308129,1952539497,778989417,168626701,1668571458,1768300648,544433516,1970235507,1646290028,1970413669,1919295598,1948282223,1293968744,1329868115,2017796179]},{"sector":4,"data":[1953850213,778401385,168626701,1431439885,1313427022,1230446663,1464812622,1381441619,541414473,1092636239,1331123232,1330398752,542724176,1414748499,168643909,1702258003,543973746,1667592816,1769239905,544435823,1970235507,1646290028,1651449957,1987208563,1998611557,544105832,1852404597,1767317607,2003788910,1460276595,1702127986,544108320,2004099169,1818632303,2037411951,1937339168,778921332,1933647904,1936024608,1651077731,1763730533,1870209134,1830842997,1635085921,168635500,544567161,1970235507,1746953324,543520353,1414091351,1480928837,1852776517,1819042080,543584032,1920298873,1668244512,1852140917,1768169588,779316083,1850280461,1685221152,1948283493,1919950959,544501353,1735549292,1868832869,1701672291,745763950,1970239776,2036428064,1852401184,1953046628,1667591712,1634956133,168655218,1881173876,1953393010,1953068832,1953853288,1701344288,1869640480,1919249519,1935745068,1936024608,1651077731,1629512805,1702260578,218762542,1376390410,1229868629,1109411662,1128878913,1145979168,1396785696,541147977,1213483351,1313429280,1398230852,1933642253,1701344288,1684291872,1969516133,1852383341,1633904996,745760116,1701344288,1297040160,1953525536,1936617321,544106784,543516788,541477200,1701603686,1711934835,1109422703,1128878913,1684955424,1396785696,541147977,543519329,779380083,1750343712,1881174889,1702258034,544437358,1718513507,1952672108,1752637555]},{"sector":5,"data":[168652389,1852732786,543649385,1752459639,1836016416,1768846701,1769234787,544435823,1735357040,1936548210,1226842158,1870209126,1868832885,1953459744,1986095136,224469093,1297040138,1919905824,1852383348,1818326131,543450476,2032168553,544372079,1953724787,539782501,544567161,1819044215,1952802592,1830838560,1634956133,168650087,1768189545,1769234787,1948280686,544498024,543516788,541937475,1953656688,1918967923,1853169765,1767994977,1818386796,1752637541,2032168549,168654191,1702130785,544501869,1914728308,1109421685,1128878913,544370464,1230192962,539902275,544166944,1768912481,1752440932,539784041,1953064037,1701344288,1094846989,541280595,1109422703,1128878913,1229987905,1768300614,1998611820,543716457,543516788,541477200,1953064005,1629516399,1679844462,1818588005,225731429,1701344266,1297040160,1953525536,1936617321,218762542,1141509386,1163282770,1327514144,541139022,1196312915,1176520012,1347440460,1498619993,1296389203,1850673677,1931501856,1818717801,1818632293,2037411951,1769104416,1931502966,1702130553,539784045,543516788,1953655158,543973749,1986622052,541204581,1769238639,168652399,1679848297,1650553705,778331500,1850679328,1701344288,1931502963,1702130553,539784045,1701209458,1668179314,1948283749,1919164527,543520361,1769414722,1646292076,1762266469,1919251566,1952805488,1629512805,1919164531,543520361,168635969,168626701,1347241300]},{"sector":6,"data":[1380012623,1229332569,223561036,1836012298,1885413477,1667853424,1869182049,1948283758,544498024,544109938,1701080693,1767317618,2003788910,1769414771,1663069292,1952540018,1702109285,1919905901,226062945,1818846730,539915109,1701336096,1818846752,1835101797,1701257317,1634887022,544828524,1768383842,1998615406,543716457,1769218145,543515756,1918986339,1702126433,2116558962,1628048681,1696621678,1998611566,543716457,543516788,1702131813,1869181806,1412309102,539906125,1970231584,1869116192,543452277,1702258030,1701060722,1702126956,1701344288,168650099,1701603686,1752637555,543517801,1852732786,543649385,1684957527,544438127,1948283745,544826728,544825709,1763730786,1937055854,2036473957,544104736,1819308129,1952539497,778989417,1716062733,1952866592,1897951845,1953786229,543649385,1684957527,544438127,544567161,1684957542,1835365408,1634889584,1713404274,1936026729,543584032,1936287860,1919903264,745824621,1752435213,1830844773,1646295393,1701060709,1702126956,168636004,168626701,1313428048,1196312916,1414092576,1213472840,1230250053,540030264,541347393,540357944,1313428048,1397900628,1750338061,1230250085,808794144,1684955424,892680224,1685024032,2004033637,1751348329,1869116192,543452277,1931502946,1713402981,1679848047,1952866674,1635086624,2037672300,2019914784,168636020,543516756,1986622052,1713402469,1948283503,1411409256,892870729,1919950901]},{"sector":7,"data":[1702129257,1970479218,1919905904,1948283764,1679844712,1969317477,1663071340,1634885992,1919251555,1952805664,1175063854,544501359,1953653091,1734633842,1629516645,1847616882,1931506799,1869639797,1684370546,218762542,1376390410,1229868629,1411401550,1142965576,1126191951,1396984648,1414864971,1414089801,1309281625,1919252069,1853190688,1263026976,541807428,1752459639,1701344288,543567648,1634886000,1702126957,1752637554,543517801,1684957527,544438127,1914729321,1768844917,221144942,1853182474,1735289198,1263026976,541807428,1752459639,544503151,543516788,1881171503,1835102817,1919251557,2036428064,1668180256,1701999215,2037150819,1684957472,1952539497,1812598117,544502639,1937075299,1936876916,1852404512,1864394083,544105840,1701603686,1918967923,1852383333,1886545268,1702126962,1935745124,1768251936,1814062958,779383663,1699154445,1634887022,544828524,1145784387,1931496275,1819635560,1700929636,1853190688,1953853216,1701079411,543584032,1684957527,779319151,2019887629,1684956528,1920300137,539784037,1970235508,1847617639,-1995815287,-1073018794,1317738101,105286408,-235417037,1183570059,-1947076860,-1875055661,1317787787,106334984,-788248949,-774254101,198758890,-134973989,871402481,-11513134,1996425846,14477320,1996903995,990409223,58065990,855764611,197561298,-150506241,-2082932774,1583022298,146955615,-326413056,-617392553,184960651,-149783104,72780755]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[154189,344,32,65535,490209280,0,64,0,0,0,0,0,0,0,0,1024]},{"sector":11,"data":[1409299944,544434536,1735357040,544039282,1970365810,1936028265,1667845408,1869836146,1461744742,1868852841,168653687,-1273033180,-1205744375,567102465,15919962]},{"sector":12,"data":[279886,153355549,191784989,5308422,402665184,65593,5308416,262225,4194799,82969288,84083963,4673,262533,1187250176,33812480,393216,72417603,72479088,165544332,165671280,138412629,138539376,74646239,74772848,145097515,145158512,185729989,185790832,38667398,38793584,142017711,142143856,56558911,56684912,222430585,222556528,27592287,27718000,48629381,48755056,65275580,65401200,16975623,17101168,297862939,297988464,75106369,75231600,57608332,57733488,97454279,97579376,1247548,1306672,140511550,140636464,177801679,177926448,157616765,157741360,193465132,193589552,74714106,74772784,45878350,46002480,168889473,169013552,133238061,133361968,100076987,100200752,132058663,132182320,52498098,52621616,95227629,95351088,109776724,109900080,100405195,100528432,359534642,359592240,25760154,25882928,112923062,113045808,354882084,355004720,13439875,13562160,104666001,104788272,103683064,103805232,257954922,258011440,52237674,52359472,45421982,45478192,8721869,8843568,40703448,40759600,306845190,306901296,73209664,73265456,88020880,88142128,144775147,144896304,35002498,35123504,107813030,107934000,274995486,275116336,68098624,68219184,148576906,148697392,273947427,274067760,188357701,188477744]},{"sector":13,"data":[130882831,131002672,186719631,186773808,60956244,61075760,65609362,65728816,30940894,31060272,60497667,60617008,345186120,345305392,4595885,4714800,23273651,23392560,173875408,173994288,81731977,81850672,163127781,163246384,558375559,558494000,226763964,226816304,80160156,80277808,102966764,103018800,42542679,42594608,399320706,399438128,307767329,307884336,40708464,40759600,8333722,8450352,155527588,155644208,50932291,51048752,2304633,2355504,137374333,462553425,-2147418108,3,721616896,-265289711,492,722731008,-265289711,500,723845120,-265289711,508,-2147352576,2,724959232,1048780,515,738328576,1048601,523,-2147287040,1,739966976,-265289663,529,-2147221504,1,744226816,-265289687,537,-2147155968,20,746913792,-265289719,32769,747503616,-265289716,32770,748290048,-265289715,32772,749142016,-265289712,32773,750190592,-265289720,32774,750714880,-265289719,32775,751304704,-265289720,32776,751828992,-265289712,32777,752877568,-265289715,32778,753729536,-265289720,32779,754253824,-265289718,32780,754909184,-265289709,32781,756154368,-265289721,32782,756613120,-265289715,32783,757465088,-265289715,32784,758317056,-265289715]},{"sector":14,"data":[32785,759169024,-265289715,32786,760020992,-265289689,32787,762576896,-265289709,32788,763822080,-265289710,32789,-2147090432,8,765001728,-265289721,32769,765460480,-265289724,32770,765722624,-265289722,33025,766115840,-265289722,33537,766509056,-265289710,33281,767688704,-265289692,33282,770048000,-265289712,33283,771096576,-265289718,33793,-2146893824,1,771751936,1048579,545,0,1280789767,1397051983,1213680903,1397051977,1397575686,122836291,1414873682,89018196,1380011346,1464665931,1329809759,1464665934,1313164639,1464666197,1128481119,1459962452,1163151698,16777216,201328640,4352,1380272902,55330126,71910471,1380275029,1497713416,1380011842,33554244,1209155533,1070399744,16777228,4276173,1070399744,16787979,1464549325,1070399744,17101131,1579106253,1070399744,17464122,-501202995,1070399744,16943136,-1272954931,1070399749,16777244,2899917,1070399744,16777256,-1658961971,1070399745,16777261,-96124979,1070399760,18031941,-784187443,1070399747,16777245,69025741,1070399747,17105441,-753188915,1070399747,16965384,540621,1070399744,17758795,1078673357,1070399759,17015363,-885375027,1070399497,342821,1392589,1070399488,396821,1543716813,1070399490,110918,-1239138355,1070399488,975909,-751550515,1070399498]},{"sector":15,"data":[258819,19939277,1070399489,966949,352534477,1070399492,117009,1578057677,1070399496,3,84099021,1070399490,20251,402866125,1070399491,357924,1130445,1070399488,83749,2375629,1070399488,247079,2064728013,1070399488,385319,1006714829,1070399489,27651,-536657971,1070399488,43314,1528971213,1070399497,68,977682381,1070399501,1316130,-1509539891,1070399494,540465,1729183693,1070399489,1396514,1075396557,1070399488,155148,3686349,1070399488,34583,-1673969715,1070399493,235523,3489741,1070399488,304407,-1874116659,1070399503,37,-1155186739,1070399506,244500,-2129117235,1070399491,56600,-1441251379,1070399490,101912,1589197,1070399488,78,405094349,1070399508,929317,-1559609395,1070399496,178185,1177960397,1070399491,13827,1778597837,1070399491,741195,692731853,1070399493,125706,-1722859571,1070399490,1226570,2084716493,1070399496,177734,388317133,1070399497,101424,2703309,1070399488,39,-1977925683,1070399489,14596,3162061,1070399488,184833,704856013,1070399489,95235,-516341811,1070399490,126209,-1862058035,1070399494,79,440614861,1070399489,286531,-1589428275,1070399492,268612,2084847565,1070399490,292164,876888013,1070399497,125519,1075986381,1070399508,184086,-1204535347]},{"sector":16,"data":[1070399499,122134,-1759887411,1070399490,26,739327949,1070399490,1052687,-2009120819,1070399492,14,1494106061,1070399488,54,-1036632115,1070399488,131894,523648973,1070399496,274435,-1258078259,1070399495,97289,475085,1070399488,9,-1610006579,1070399488,46862,2310093,1070399488,1040715,-1790558259,1070399494,70,692469709,1070399498,1014562,1311588301,1070399489,346931,-1356709939,1070399496,67,-1844625459,1070399490,289057,1712275405,1070399498,111689,-1038008371,1070399493,195076,167985101,1070399494,324102,-402440243,1070399495,4,-251445299,1070399492,288515,-920567859,1070399492,47108,-1776140339,1070399508,41761,1813725133,1070399491,26913,1090731981,1070399491,13857,-585023539,1070399488,511284,-1038860339,1070399490,231956,1293172685,1070399490,288533,337723341,1070399489,58,-566607923,1070399498,364833,624246733,1070399488,6222,-1794883635,1070399489,494851,3227597,1070399488,166939,-550944819,1070399502,168195,-215334963,1070399490,42,541343693,1070399489,304708,523452365,1070399491,254271,-902283315,1070399488,25,-1471987763,1070399489,367381,285818829,1070399491,192259,-972865587,1070399490,38,2080980941,1070399490,857381,1528119245,1070399498,250369]},{"sector":17,"data":[-1174323251,1070399491,391195,-1689632819,1070399507,181275,-334413875,1070399488,203537,1064909,1070399488,187702,-1223737395,1070399488,188431,100745165,1070399491,444163,999373,1070399488,529672,1327053,1070399488,130569,1798586317,1070399494,503816,923287501,1070399492,285992,-13025331,1070399491,73514,338247629,1070399502,43,-1911603251,1070399493,161039,-150323251,1070399490,364614,-318095411,1070399498,498182,671693,1070399488,19017,370163661,1070399490,68358,2081374157,1070399488,1114127,-16433203,1070399488,6,344013,1070399488,74756,-131121203,1070399490,16431,-786284595,1070399502,1372706,1478836173,1070399491,1079074,-214941747,16745985,2244557,1070399488,33049,990068685,1070399490,68377,388120525,1070399497,742446,691158989,1070399488,112434,3293133,1070399488,70194,-1207353395,1070399489,291355,-1726267443,1070399493,46,737229,1070399488,16693,-1941225523,1070399501,791115,1458125,1070399488,238605,1410154445,1070399491,121357,1023557581,1070399497,199207,18104269,1070399496,510228,3620813,1070399488,484372,977616845,1070399513,1596997,-62570547,1070399511,82999,1547124685,1070399488,53270,2113485,1070399488,31,1867202509,1070399492,75]}],[{"sector":1,"data":[1544175565,1070399496,63,1682063309,1070399488,66,4079565,1070399488,807476,868301,1070399488,21565,1279082445,1070399489,61,3424205,1070399488,441602,5259213,1070399488,51,147405,1070399488,158280,424165325,1070399489,72,-1022738483,1070399495,522261,1896824781,1070399495,478467,-753975347,1070399489,914703,806830029,1070399497,240435,1513701325,1070399495,452153,171458509,1070399499,550200,-583516211,1070399497,397369,540622797,1070399495,496697,1593917389,1070399490,210975,-49463347,1070399490,112416,-1843380275,1070399492,59,3948493,1070399488,763979,-653312051,1070399488,23,-1744420915,1070399490,64,-1875558451,1070399491,688191,-1421918259,1070399492,263487,1393180621,1070399499,137479,1612857293,1070399501,680248,138821581,1070399489,310787,390807501,1070399499,462083,1998274509,1070399495,1358370,1900494797,1070399492,201525,-902807603,1070399492,100423,4669389,1070399488,369188,1800093645,1070399500,77900,-1840562227,1070399498,768527,856637389,1070399501,220976,2131378125,1070399493,424970,-1592836147,1070399504,76,2016821197,1070399495,846095,1785805,1070399488,119811,-149930035,1070399491,30977,-284540979,1070399488,74,927612877,1070399506]},{"sector":2,"data":[68879,1427521485,1070399494,376136,-230146099,1070399490,18,-1140768819,1070399488,54273,-603897907,1070399488,75777,-369016883,1070399491,273153,1766657792,1936683619,544499311,1414091351,184549445,1129467974,1230261839,491083086,1229196800,1196379201,1162297680,1263681869,1175388171,1128613955,1347375179,1163022421,1856579,1095320593,1128746828,1179795784,1095586383,938836,1330790928,1094927425,1279349843,1431192908,234887757,1279347012,1229211471,1230195030,1396303,1095320592,1111969612,1095582785,1313425234,285218643,1279347012,1094928207,1279607630,1313428048,251660372,1162297680,1330007625,1346653783,71520082,1145899776,1314341711,1330794564,218104387,1279347012,1163085647,1195462740,285215301,1279347012,1095780175,1330004306,1413565778,201330515,1279347012,1095976783,1396786518,1141506054,1330397513,1313424967,285217092,1279347012,1431455567,1313427022,1095059527,184554308,1279347012,1380992847,122965577,1296894464,1145984855,1129271888,1376518145,1380273237,1346653783,54742866,1229195776,1196379201,1347175752,1141506061,1330397513,1414481735,268439631,1279347012,1163020111,1229406544,1163149646,1175191561,1398033999,1162173001,424498510,1229195776,1196379201,1313165391,1175191557,1179930191,1162167105,407721294,1229197824,1196379201,1313428048,1397900628,1347769413,1141506060,1330397513,1111577671,218109011,1279347012]},{"sector":3,"data":[1329809231,1380533838,201332301,1279347012,1212368719,1162300993,1108475922,1145130834,1414742339,1279871043,1431192900,6989,-1003791781,-654894733,168180022,907048704,788025,-1556741002,-527761396,-1949609134,1107804182,788464756,-5240896,-1140936517,1352203696,16777114,-26112,-1073020928,113717620,2002,130289289,1392924247,-401698734,-1070399405,-26032,-1705574400,65535,192200715,16777114,-6664192,-1207959297,567102719,-1864856373,-326412987,-1948742114,1996424798,142016266,-16615425,-401698761,1586168432,39291142,-310179959,535137026,113921373,136493824,137296769,-11335309,-1014801633,-873338108,-1207958341,567100416,-1024062862,-2147126144,1074263695,-873694901,567095476,-888678237,131204750,741772070,889239552,512303565,109840326,521013192,-1171980104,567083053,403606326,908256008,135923397,-617358708,371130166,-385649912,-986251494,-1945625082,244698,371130166,-887155192,855643321,-158861605,74711303,567099060,-873274813,1167120524,518818645,1448335502,-1946209449,-1073018810,-671673731,-150579573,500889560,1183383552,106334472,185353867,-149783104,173444055,-621291273,-1996488675,1451822150,1975520010,172919574,856180363,-1947076654,105286616,-745803273,-1953480981,172919768,-1962387829,-338622906,-355345967,-619980591,-235408267,-768348021,1996443730,175570700,300420752,139868929,141690743,1980122683,32408323]},{"sector":4,"data":[-963915213,125107979,-654845193,1593891459,-310158498,535137026,147475805,-1864856576,-326412987,1457032734,-1948568745,-1073018810,-738782595,-150579573,500889560,1183383552,106334472,185353867,-149783104,173444051,-621291273,-1996488675,1451822150,105810698,-125050377,-1962260853,65140720,1727502074,-1946680568,197561303,-150506277,-2082932774,1583284442,-1962742397,1297948645,-1946154806,1430622424,-1910575989,-1957276712,-1073017786,1317738101,138840842,-235417037,1183570059,-1947076858,-1874924589,1586219147,139889418,-788117877,-774123031,198758890,-134974007,871402483,-11513134,1996426358,-401698806,1446707232,1913091848,105265928,-293403786,-1949158655,-2091163962,-443874579,-900899553,-661913592,-1957345904,-661774612,205949782,-150581621,-1948742687,-259323322,-637279753,140965782,-745809917,-2090940789,-443874579,-900899553,-661913592,-1957345904,-661774612,-13412525,185091723,-149783104,106335191,-621291273,-1996488675,1451821126,205949702,276676619,-150317429,500889560,1183383552,173443340,443924491,-1962258805,-768407482,1183576567,-1947076858,198325186,-347638273,-661942196,-1962258805,1183516758,-773074682,-773140007,1977289688,871495668,-11513134,1996426358,-401698806,1446772552,1913091848,105265931,1177224822,206969610,453396011,-16054186,-621344907,-628893449,-2091163904,-443874579,-900899553,1430585352,840887435,-788077587,-489500192,49120250,1562371467]},{"sector":5,"data":[1430637389,840887435,-788077587,-489106966,49120250,1562371467,-661861555,-1957345904,-661774612,1172835984,-401698816,-469042054,2122320500,74776582,-33143098,-971586274,620804103,-1960894003,-486008818,178951,135667455,-1274657141,-1155412660,-75429842,158533678,1528823635,-352009341,784059377,855343368,1393128200,-2091180033,-236256061,50333387,16790785,50331904,50356225,50332928,16800257,50339328,-16748800,50409984,16792065,50354944,-16750336,98048,0,0,0,1167087646,518818645,-326903666,175570756,-1928825089,1343667270,1342193848,16777114,-79247872,1354771200,-1719729480,597315666,-1560281087,-1073017918,-1070922379,-1207782935,-1706033133,440,-1962802013,-1935471034,538687494,156821584,184599715,-1202424640,-397402083,-962393782,1958742784,539080774,154986576,184600739,-1204259648,-397393915,-895284946,1958742784,1073920042,153151568,184598179,-1206094656,-397402078,-1063057134,1958742784,538163214,151316560,184599203,-1201244736,-1706033151,65535,13254275,-16157696,-1711224266,216,12467843,-16157696,-1711227338,232,12598915,-16157696,-1711226826,248,12729987,-16157696,-1711226314,683,-626802645,191931137,31196729,104401269,57999838,-1207844375,-890691555,1354771201,-1719729736,949637202,-1560281087,-1073013940,-1070889612,2130753616,-1706012007,476,185714339]},{"sector":6,"data":[-385649216,922746733,683148940,-1706025471,65535,185744547,-385649216,-323420331,-1202708990,1344143670,503394744,278837328,515395614,-6664192,-1207959297,1344143934,503514296,1354771280,16777114,1975520000,-339727612,112643,-2096498525,1962937470,-1942552759,22276102,58048523,-95255,-1207530442,-1706033141,454,2080383037,833550,-26032,540868608,-1207599872,65732927,-1946073160,-1706011942,65535,185203363,-384141888,1996488393,167426060,178256,-26032,-1073020928,-1293352075,-1942552578,35710982,58048523,-1191271191,1344144140,-16091393,-1070921610,1375784122,1347440720,1342203064,1347469355,1343125247,-26032,-1073020928,1994982261,1346274302,57933825,-1694602007,65535,109721343,16777114,922701824,-6682986,-1929379585,-1705984954,65535,58048523,-2080488215,86078,988349300,-25858,1048772608,1962935970,-30676733,109721343,-1710852353,65535,31065799,1187446784,-2097151492,50238,922683764,-1147535164,-2097151998,50750,922683764,-879099706,-2097151998,51262,922683764,-6684472,-1962934017,485227590,31473283,-1207602176,65740833,1344281528,16777114,-62470400,-1343553536,-1962742397,1297948645,1426066122,-326898549,-431583974,1354771280,1342184120,16777114,-431569152,1187446819,-939524120,-5562,-1996208501,-1202655162,1344143698,16777114,-230258432,-1996399944,1586296902,51165434]},{"sector":7,"data":[-1929623927,1183710814,-1706027290,909,91602955,-907427797,-431584000,1354771280,1342184120,237978,-431569152,1187446824,-939524120,-5562,-1996208501,448327750,-62486269,-1912709492,1343678022,249754,1958742784,-431583809,1354771280,1342184120,255642,-431569152,1187446824,-939524120,-5562,-1996208501,-962465722,-196703983,-1996282184,1586297926,-431583746,345657366,184549380,-385649216,1183711098,-1070903066,1751120,51223120,1187446784,-956292890,-6074,-1423673,71732223,-1578088823,1183388102,53786868,-1929623927,1183710814,-1706027290,65535,58048523,-1191234071,-443875327,180829,-1192457387,-4521985,-11513089,1436157046,-1560281084,378081828,-1039461850,1743324021,-18430,1392508858,74907472,291738,278307584,278402697,58049035,-1207809559,-4521985,-11513089,-1852177290,-1560281084,378080160,-1039463518,736691061,-18430,1392508858,74907472,307098,322347776,322442889,58049035,-1207824919,-4521985,-11513089,-845544330,-1560281084,378081468,-1039462210,-269941899,-18431,1392508858,74907472,322458,295478016,295573129,58049035,-1207840279,-4521985,-11513089,161088630,-1560281083,378082138,-1039461540,-1276574859,-18431,1392508858,74907472,337818,228762368,228857481,58049035,-1207855639,-4521985,-11513089,1167721590,-1560281083,378081824,-1039461854,2011759477,-18431,1392508858]},{"sector":8,"data":[74907472,353178,195339008,195434121,58049035,-1207870999,-4521985,-11513089,-2120612746,-1560281083,378082082,-1039461596,1005126517,-18431,1392508858,74907472,368538,320381696,320476809,58049035,-1207886359,-4521985,-11513089,-1113979786,-1560281083,378080156,-1039463522,-1506443,-18432,1392508858,74907472,383898,277914368,278009481,58049035,-1207901719,-4521985,-11513089,-107346826,-1560281083,378081842,-1039461836,-1008139403,-18432,1392508858,74907472,16777114,263365376,263460489,58049035,-1207917079,-4521985,-11513089,899286134,-1560281082,378081278,-1039462400,-2014772363,-18432,1392508858,74907472,413850,324313856,324408969,1819591179,-1157627976,1347616767,-1710983425,1643,-1995713885,185324566,-1202621246,-4521985,-11513089,-2036726666,-1560281082,378080132,-1039463546,-4704652,-17665,1996443730,111254020,312672256,337021202,1958873874,-18405,1392508858,74907472,276378,323789568,323884681,74826251,65781803,-1962933832,46292453,-1873273344,-326412987,-2082959842,1183517932,109749002,-26032,-1633484800,1975520006,38594819,16139975,-1201673472,1861681278,325846518,-1946925431,-1723795898,113118859,-1031013897,-150962503,325846505,-1980473717,-163149049,113116675,244029768,-101251394,2126103179,99219200,1586172780,38242804,-1946919285,-1991751485,1586171463,71813108,1204289535]},{"sector":9,"data":[-250,-1096681914,-163170042,113744252,325849916,-1711276104,-1995563869,-1559355882,378084222,-6677632,184549631,-385649216,922681786,-1070922102,-26032,1183383552,-1070903044,-1202696112,-1202651137,-1706030848,1982,109852415,1342179256,503971512,16824400,-26032,1996423168,1354771452,503971512,-219105200,16824400,-26032,1656225792,726670849,-1169141568,1347572736,1347440720,1342863103,109852415,345657424,-1560281080,-1073016778,1072235381,1007076865,1823998480,726670849,-1202696000,12189697,726684244,1347440832,175570768,-1942552752,-1706012666,2121,185612451,-385649216,113639690,-1207824323,1344143734,1347469355,-1174402888,1347572736,1347469355,1996443728,922701834,1347421836,554138,242918144,58048523,-1207904791,1344144180,1347469355,1381236922,1347440720,175570768,-1942552752,-1706012666,562,185815203,-385649216,-1706032982,2389,200820361,-385649216,112722074,-677752832,1375731720,-26032,1183383552,1975520250,8448259,1358460671,154522,1975520000,-92864758,16777114,-9835776,28899446,1905938432,-16777207,163117174,-6664192,1375731967,-26032,62390272,-207990784,-1560281080,45617292,1150963712,-1560281088,922685570,45617206,-1070903296,909573968,112658,153524816,922681344,45617208,-1070903296,16758864,112720,-26032,116064256,22021831,-310181887,535137026,113921373,-1873273344]},{"sector":10,"data":[-326412987,1457032734,-1995802997,-1995426762,1443921974,151962,272278272,141934603,22021831,1022033921,272250623,1342177720,16777114,976682752,-1875443952,-1908998394,-26106,922681344,922685498,922683028,-560331118,-16777208,-15713738,-1710844362,2225,49120094,1562371467,445005,-1275051,-16348106,-21494666,-1202708983,-1706032896,1958,74825739,166445099,1342832312,16777114,1575324416,5636802,66519042,262399,70189058,327935,72155138,393471,76087298,459007,83951618,524543,80019458,590079,78053378,655615,81985538,721151,74121218,786687,85917698,852223,93782018,917759,95748098,983295,87883778,1048831,89849858,1114367,91815938,1179903,97714178,1245439,99680258,1310975,12058627,10027263,101646338,1376511,159514883,65538,147521795,131074,103612418,1442047,105381890,1507583,107151362,1573119,108920834,1638655,13107459,1114113,160628995,589826,110690306,1900799,48562179,3014911,126877955,10027011,125436163,10223619,41549827,12386559,114426115,10289155,102170883,3342337,161480963,2949122,32899331,3538945,132055299,2686979,25755907,3735553,42991875,2752515,24576259,3801089,3080451,11337731,53281027,11403267,163840259,11534339,22020355,11599875]},{"sector":11,"data":[149356803,11730947,144113923,11796483,55312643,3735555,1900547,5898495,144572675,4325378,146604291,4521986,151912707,4194307,142868739,4325379,51970053,65791,57737221,131327,56950787,7012607,61669381,196863,66191365,262399,69992453,327935,71958533,393471,75890693,459007,83755013,524543,79822853,590079,77856773,655615,81788933,721151,73924613,786687,40108035,16056575,85721093,852223,38273027,16122111,93585413,917759,95551493,983295,124190723,16187647,87687173,1048831,164954115,16253183,89653253,1114367,91619333,1179903,97517573,1245439,99483653,1310975,101449733,1376511,103415813,1442047,105185285,1507583,106954757,1573119,108724229,1638655,52297730,65791,110493701,1900799,58064898,131327,61997058,196863,1167120524,518818645,1465309326,-1962248565,1317734526,63408902,990322369,50820087,1324942321,-1527513777,-2090967044,-443874579,-900899553,-661913594,-1957345904,-661774612,2126796630,209110280,-1962520949,1002505159,50820087,1324942321,-1527513777,1606585596,49120094,1562371467,707149,1167120524,518818645,1465309326,-1962248565,1317734526,-1949857018,65262041,990322371,1258779639,66257739,-1510736389,-2090967044,-443874579,-900899553,-661913594,-1957345904,-661774612]},{"sector":12,"data":[2126796630,209110280,-1962520949,-774272057,1002636259,1258779639,66257739,-1510736389,1606585596,49120094,1562371467,707149,1167120524,518818645,-1940399986,-1950314792,1183517310,105810696,1605104636,-1962742397,1297948645,-1946155318,1430622424,-1910575989,2126796760,138840842,-66695541,-2090882061,-443874579,-900899553,-661913592,-1957345904,-661774612,-1898410921,176065472,-1962391926,-201587122,-310157398,535137026,113921373,-1864856576,-326412987,1473809950,-1979023676,1317734470,-1426850810,49120095,1562371467,576077,1167120524,518818645,1586223246,197888774,-150832677,172395483,-1072969677,-654900615,856184459,2043808714,-136644862,-775189790,-2084371461,-472842030,-751052534,-201910413,293126155,41535755,-310126345,535137026,113921373,2147465216,-294008565,-353642249,1167120524,518818645,-1957242738,1988823134,973572614,1124889860,1975551046,112884,865076203,-310157632,535137026,80366941,-1864856576,-326412987,1457032734,-1898410921,175541184,-1962377589,-1047853490,66061128,-1493959176,-1958674060,1583348929,-1962742397,1297948645,-1946155318,1430622424,-1910575989,-852708136,106859297,1468600201,49120002,1562371467,182861,1167087646,518818645,1183570062,139889414,2081183289,956661519,141953606,-1962260853,116067414,-1962522997,-310179754,535137026,147475805,-1873273344,-326412987,-1948742114,1451951686,206977288,92016511,1930053177,172395272]},{"sector":13,"data":[-351512949,105286406,-2096605557,-443874579,-900899553,1478361096,-1957345904,-661774612,1988843095,108956424,74708795,49006219,1600046987,-1962742397,1297948645,503317706,1430622296,-1910575989,-1957275688,2123040886,1995913990,-339309820,1590135554,49120095,1562371467,313933,1167087646,518818645,1448597646,-1962379637,-147126658,-963967875,-947191061,-310157474,535137026,80366941,-1873273344,-326412987,1473809950,141986646,990281355,-1962639625,-1962742842,-2090901817,-443874579,-900899553,1478361092,-1957345904,-661774612,1459940483,108432214,-352321089,-2142877951,1962999676,1590135800,49120095,1562371467,182861,1167087646,518818645,1448597646,-1962510709,-1961942498,1488927,-125047049,-1962786421,1599997009,-1962742397,1297948645,503317194,1430622296,-1910575989,-1957275688,512427638,529207074,-150989128,-1946645522,1599998529,-1962742397,1297948645,503317194,1430622296,-1910575989,1040631768,-1207959540,-1873805311,649230,-1962742397,1297948645,-1873273141,-326412987,-1948742114,-2103245242,49120006,1562371467,182861,1167087646,518818645,-326903666,-1957275900,2123040886,-62470394,82509824,-62455993,168134828,-1946847808,1600060486,-1962742397,1297948645,503317706,1430622296,-1910575989,116163544,1988843095,108956424,2122517227,74776826,703316011,-12285370,-1873746902,2811918,1207584393,721372554,244338916,-1996481560,1178205254,-1949076230,1177287238]},{"sector":14,"data":[-2090901764,-443874579,-900899553,1478361092,-1957345904,-661774612,705054346,244338916,184711912,-1979026240,-467007930,-352313339,105286149,-310123478,535137026,46812509,-1873273344,-326412987,-2082959842,-2002709268,-2012807417,1958742791,16115971,33949383,113704961,66050,33832579,-385649664,-1264516948,-230258426,108380171,-1996059999,1048834630,1962934746,-226589878,-12291072,-6622602,184549631,-13077312,1183707766,-1706027276,65535,737691275,731509830,-1980182078,1183575622,-163173382,-775804007,-263812616,-1913489665,1343680070,16777114,725674752,-6664000,-1996488449,-1072960442,-1202701196,-1706033144,1452,-775804007,-297367048,-1192462593,-1706033142,65535,-775804007,-263812616,-11485141,-6624138,-16776961,1996484214,-25872,922681344,-6681662,-1207959297,-1706033151,1523,1342183864,16777114,-62486272,28838379,882528256,-1962934266,1191181382,2092960764,49120237,1562371467,1478413133,-1957345904,-661774612,-2096829309,493630,251619454,1651836808,33949383,113704960,514,-1705983957,65535,33832579,-1962576896,48956998,-1705983957,1491,1342183864,386458,-62486272,33832579,-1961004032,1191181382,2109737980,112669,108567120,-336920576,-1705983957,1500,-244085,-1072956338,-310120835,535137026,46812509,-1873273344,-326412987,1473809950,141986646,-351895925,2088781323,74776831,183222315]},{"sector":15,"data":[-467008374,-311048389,1600046731,-1962742397,1297948645,503317706,1430622296,-1910575989,105286360,-1873746902,3270670,460701707,705054346,244338916,184574696,-2146667072,1962870398,108953606,-1207601697,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2133291490,1918961278,108953606,-2145880454,1927284350,108953606,-2146666762,1928857214,108953611,-1207601154,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2133291490,1916864126,108953606,-2145880486,1925187198,108953606,-2146666794,1926760062,108953611,-1207601186,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2133291490,1915750014,108953611,-1207601351,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-1965519330,-467007930,-401698736,-1072955581,1183451764,769927686,99287072,705054346,49120228,1562371467,182861,1167087646,518818645,-326903666,1187468804,-352321284,-60912851,-1979156853,1357130240,-1310191984,-60912644,-1979025781,1374497288,244379787,1006411752,721712326,-15799360,1183579206,-62506746,28887932,-310157824,535137026,113921373,16973834,198013,16973852,197972,16973857,197955,16973871,198225,16974003,198023,16973890,198079,16973892,198216,16973893,198090,16973894,198254,16973895,132504,80,0,0,0,1167087646,518818645,-326903666,-1942552828]},{"sector":16,"data":[108461830,1074284171,-4698082,1553616896,-1996488704,1586232390,-62486008,-310179960,535137026,80366941,-1873273344,-326412987,-2082959842,1448543468,-1962379637,922683006,-1957230964,-1202708794,-1706032897,65535,66864777,-2090901818,-443874579,-900899553,1478361092,-1957345904,-661774612,1459940483,108432214,253894283,381173643,65992448,105248504,-1961724926,212928069,254077139,91554108,-352321096,1589652226,49120095,1562371467,182861,1167087646,518818645,-326903666,-1957275900,-13957002,327022091,-1962516853,-1962410233,755484376,-654850421,-2092437365,494668542,-1181104501,-101253110,108461904,-1075310960,-1174928385,-963969014,-1946552423,106859506,134154123,-963913589,126365700,1577141645,49120095,1562371467,313933,1167087646,518818645,-326903666,108461834,16777114,-62486272,1342177976,-1711520117,-6664110,-1996488449,-1072957882,-1706022540,65535,-1980217719,-1039402410,1183522420,1380982278,-493825,-6620042,-16776961,-6621578,-1962934017,183236166,-1695123713,65535,-310132693,535137026,46812509,-1873273344,-326412987,-2082959842,1448546540,1183432747,-230258188,-1962248565,-33355650,2131248697,-373282043,-1974533841,1038363141,376700962,1946185277,485181187,1765638223,2123040884,176030472,1187450603,-352321530,-8552441,1325757728,-177014981,-788111733,-1366848541,-62486265,-2142895637,-93052868,1965898880,112645,-1070923029]},{"sector":17,"data":[200296073,1174500544,-12285370,1183441962,3030522,-1947663499,3161344,960334716,-2088337664,2080437374,-385647089,2122448763,1913441522,-9311997,-1728050504,1996443730,-227082252,16777114,-1949791488,808319558,-136672512,-768869274,-753680125,-1980610935,-147065770,1089184370,-12285370,1183441962,3161594,820577149,3751423,686359422,3157503,100427511,-768933883,-150992199,30551025,1444016710,-62485516,-150993659,-62486031,-1066207429,16023171,58593148,-2113997079,2076242558,-320273546,-260144130,-1961921536,1452012102,-2082932748,-621346606,1183515627,207522802,28837769,-2090902016,-443874579,-900899553,1478361096,-1957345904,-661774612,1460202627,175541078,2122579755,443876360,47988355,-1961659388,2025429446,-134613248,1975925737,138856197,1586167813,-1948004088,-1995985273,2122579014,92080646,-974536661,2113276672,207522579,134154123,130472075,-137983187,1206946776,737953419,13154770,-268176905,-768883061,-1979943177,-11470778,244321398,66928104,-129594376,737961719,702704,-259264777,1996244537,702474,1178332919,-1957399812,126553182,-661977089,1194198982,-768883061,-1979943177,1586231366,-16282868,-1965520121,805632070,-1186527352,1183514634,-60360712,-654850517,-768876041,-1979943177,-1072957370,1586172276,-16282868,-1965520121,805632070,-12122232,1586170998,-1847032,-1962433865,-953481658,-401698736,-134021103,1600046987,-1962742397]}],[{"sector":1,"data":[1297948645,503318730,1430622296,-1910575989,116163544,-164932009,-1962254709,-1961825473,1191118942,-2012771832,1958742533,-1958263284,1325336134,2143292166,108954598,-1206813440,-1924134982,-1202651835,-1706033149,65535,-1995809141,1590070079,49120095,1562371467,151439949,1191248640,251658497,-2080308480,285212929,1409352448,301990145,1996555008,318767361,1543504640,738262788,520160000,-1342176512,1862271744,1510014721,889193216,1526791937,1426064128,1845559042,0,1167087646,518818645,-326903666,113726980,3662,401035,-1995290741,96009286,-59836672,-166989685,1200162164,-1962743022,4372678,67156048,7838288,1419968512,-6664165,-2097151745,1946221694,-62485748,401035,-351123575,102664967,306678528,1491603088,1975520007,-373282043,1119355015,12079104,-6664188,-1560280833,-1073013932,-1783044236,-442871807,-1560281088,1950355872,-1475950632,-956300021,64582,-1564992277,-59836672,512487563,922948000,-1979332989,209724420,-16480245,-1465779130,-62506741,-6628228,184549631,-392268608,-1073020430,-1243048076,1958742786,86632592,-1988837365,1342210232,185242,262710016,-385649344,28901239,-310157824,535137026,516640093,1430622296,-1910575989,1525449688,-1505310890,1183514625,-1471772410,-1968677237,-1438218233,225755146,1936990268,1869875516,10897095,-1501658368,-12421888,1996424822,-26106,1346895872,1358055053,16777114,1958742784]},{"sector":2,"data":[-1337553645,108461904,-1705983957,65535,1031127051,31065799,431489024,-6664160,-956301057,16898566,-1404647680,1586200575,509446,11552454,31473283,-2096663296,122430,-1070899340,-16705047,2011801670,-1337553409,1354771280,-1207535873,-1706033105,448,628473867,-1207535873,-1706033094,464,360038411,-1207535873,-1706033060,65535,91602955,-352321096,1354771202,16777114,-1404663552,1954545469,-6664052,-352321281,-1400995437,544505855,295706251,-1564991605,-1402013952,1485566091,-1925710050,-1202671546,-1706033086,65535,1353729677,200602,-62486272,-385649344,1996488552,-59310164,-1705983957,793,1085163145,1374225269,-1367932929,462436095,281163519,16777114,998656,971572085,1354771455,1342177720,16777114,-1400995584,292847615,34735815,-6684671,-956301057,135686,108461824,16777114,118268160,118363787,-1994692445,-1558484458,378084204,480451438,504793360,1879998480,1347551515,16777114,112640,49120094,1562371467,182861,-2081649835,79168748,254452480,-150991943,-6663959,-1560280833,1967132450,-373282043,512426148,126553890,100550281,1183383640,-1962152964,1183055454,130488062,1183514624,-28952068,-4657806,582504575,697978881,1342177283,1342177720,209818,196125440,1350565816,1342251960,215706,28856320,-6664192,-1560280833,113712002,-60870,16777114,19183616,56007248,1956839424]},{"sector":3,"data":[19249179,56793680,-1700593664,19314704,-26032,748879872,-1338080497,58064651,-2080412951,-14974402,1625883509,58015999,-1191224599,-443875327,-1957313699,149717996,604875425,-1558705152,645926314,-2147283543,-133321690,229117568,1376175873,-1593767917,-2145124086,178462220,135168001,144769281,201401345,17343292,17958599,882966768,-119242737,-1560097664,1048776500,1962935018,18737411,111687423,1342180536,1347469355,-129594032,-1936044010,184549380,-14650176,922744950,922683882,916066424,-1560281084,1996427064,-63504390,-2009661687,-13309168,-1207523274,-1706033148,1094,943765584,16693328,72653392,950206464,-1472790769,440326,-26032,-1202716672,-1202702272,-1706032898,1184,-1592838493,104402744,108399082,-1559631199,916524856,-66701041,-1593412087,916654588,-1472790769,899078,1354771280,1183666256,-1706027272,65535,628408331,-493825,-16127434,-1710196682,1203,-15726941,922745462,922683900,-6680440,-352321281,255369493,166331947,111405265,255238416,167511595,2124671185,1354771216,722417825,722470406,1342827014,325786,-62486272,-1588543445,103485238,103485566,-1706030596,65535,-335657335,939968282,-953167857,-535874042,-1983894723,1183448646,276734972,-1206909277,-11532536,-1710225866,1331,-1206959965,-11532536,1318780022,-1962934267,722417678,1074670536,1108248847,94418959,2117533520,90020368]},{"sector":4,"data":[1017315328,94418959,-25755824,358554,906922752,734538511,-1995490290,-1206960626,-11533256,-1710195146,1415,-1206958429,-11533256,-1650786698,-1962934267,722417166,1208912328,118011919,-59310256,373914,940477184,-1983370481,-1206956018,-11533256,-1710195146,65535,-955298141,-15779322,256156159,-2147425152,1151533516,1241958159,-1593651185,1218645816,255238419,-955033437,-16554490,1879492607,-1207956978,-1706033102,135,1074789539,-1070922635,28836843,1575324416,-326412861,-951260029,152178694,-26112,-995950592,-401698805,1187381523,1183645878,-4697930,1347590655,1342179256,16777114,-62486272,1971322685,-373282043,512426219,1207894022,-1608611070,-1995994351,-661915066,17059712,-2131075445,-1962802097,-16775650,-1070923185,-1559085405,2075660706,306225920,722576547,-1583722304,-1560281082,-1070919258,-1506345136,-28930799,112720,112761424,-661979136,1200209963,1342671106,16777114,306356992,-11485141,-1928183242,-1202651578,-1706033151,65535,-1070868341,-1996339319,243719,114727504,-1465712640,243729,99654224,1151533056,-1547687150,-1432153530,296263953,-385649344,1151467343,58015762,-1191229719,-1202713176,-1202712650,-1706033147,1813,1343072440,1342828216,1342178744,468634,1379335936,281851923,899152,-26032,28835840,1575324416,-1873273149,-326412987,-2082959842,-1101656340,1187450492,-352321288,38061841,1183547391]},{"sector":5,"data":[71600632,-2080880897,278988486,-129615598,1386473340,-62470373,233504768,-1946394997,-971275210,1191182080,268083708,2096907833,-1003058197,-163133679,434831360,-16628537,107249791,-163148802,-972798839,-63420,-964430266,458793225,2096514617,394719,1578859683,-1962742397,1297948645,-1873273141,-326412987,-2082959842,113707244,1973080,1347469355,16777114,-96040704,-2080614775,326894586,1077740927,-955484659,1008424966,-502872320,-1593835263,-523166888,268084032,-150992456,1075533870,378273316,129047384,-2143100205,-1039925534,268045963,-18775999,1183432963,4241656,-126419120,546970,194683648,662028299,458753735,113704990,4001786,1074789025,235273764,-129595120,1342193848,-1694992641,58,-2096391517,760382,-1070922635,-1700711445,166241035,-1323607903,65065735,-1559520762,608177050,194683902,-1592032093,100863994,-1700590694,-31178741,-1559520605,28840388,49120000,1562371467,2083661,35717123,9306367,137167107,327681,4391171,458753,54591491,2490623,131399939,1638401,81854467,11206911,35127299,2883839,24051715,3014911,110231555,3473663,117702659,3670271,66519299,2490370,86245379,13238527,22806531,14090495,31522819,5832959,20840451,5964031,103874563,6160639,69730563,5242882,37224451,15401215,44892163,15466751,67829763,7078143,42270723,15532287]},{"sector":6,"data":[41353219,15597823,38862851,15663359,28311555,7274751,40173571,7340287,32440323,15728895,21561347,15794431,12779523,15859967,101842947,15925503,108724227,15991039,113901571,8519935,1167087646,518818645,-326903666,374796,2202192,1183383552,-61437446,1342179512,16777114,-163149568,-1577560439,378209934,1446577808,958100988,376830534,-1962503519,956732438,175503446,1979074105,-373282043,-1070923600,20683344,1183383552,1958743028,1996443884,-92864516,32410,110011136,110106249,-755969,1996486774,-25866,-1834811392,-1810462458,1354771206,-1695254785,377,110114559,109983487,16777114,110535424,393592843,-1705983957,65535,-955869533,-16347642,-1878603777,-2130641146,-16347074,-2095745792,-16347586,113708661,6424216,110757575,602603775,184979105,1963364358,-1744386290,-956284410,432646,-955454720,554080262,-1710831872,-1207898106,-310181887,535137026,516640093,1430622296,-1910575989,82609112,28857943,1347440640,1354771280,-26032,-1734148096,1975520013,-373282043,922681687,-6682998,-1996488449,-1072956346,-1202656396,-1706033142,347,-15848797,1488518262,1788497920,-1560281087,1996426652,5945596,-26032,-1499267072,-1976107251,-59310330,16777114,18921472,-1674117296,94418957,27171408,-1667039232,2076227600,-1674117296,94418957,31693392,1050869760,374803,28678736,45678592]},{"sector":7,"data":[-259305216,114842,1095936,-1694987439,65535,322834059,-821835733,235130411,243863708,-1263005130,922701824,-1598550628,-140881915,-1560281087,146280974,922701831,-1598550628,194662405,-1560281086,-860351646,922701845,-1598550618,530206725,-1560281086,548933826,922701902,-1598550618,865751045,-1560281086,1018696490,922701824,-1598550618,1201295365,-1560281086,1085807504,922701825,-1598550618,1536839685,-1560281086,1018695062,922701824,-1598550618,1872384005,-1560281086,-256374298,922701824,-1598550618,-6664187,-1560280833,244322290,184557032,-385649216,-1070858577,-401698736,28836892,-2090902016,-443874579,-884122337,1167087646,518818645,-327034738,-2033843694,-2097086730,135230,-1410792588,1312719616,57999387,-2097110551,992318,-1746336907,1310624512,-1925710053,1358820998,1342243000,16777114,50116608,-2037559266,1343684086,-17398131,-2037559274,1343684346,1342243000,228250,-91845376,-2037559042,-1924071948,-1873740730,31647758,-34437495,-34568505,-2037710848,-2037776908,-2037645576,-2043019790,58523120,-1962881303,-15784930,-122224841,-25858,-1073020928,-2037707915,-2037776648,-353763852,-122224896,-25858,-2046754816,-2030043400,-1024721424,503508152,49592400,-2037559266,1343684342,-34175347,12079126,-6664191,-1929379585,1358820998,1342188728,16777114,-125400832,1958743038,-293172949,-1928401923,972945030,1996353158,-292618483,-291599363,541032701]},{"sector":8,"data":[-1634997900,130481646,-125400320,1760248062,-34161024,-1204390656,1344144124,1347469355,-17398131,-2037559274,1343684086,1342243000,268698,-155287552,292880637,614711339,262578959,-1206169949,-320274431,50116608,-2037559266,1343684086,-17398131,-2037559274,1343684346,1342243000,194970,-155287552,-931921667,-17135987,-192508592,1183666429,244338940,-1929331736,1358820998,290202,731463680,-1980182078,-1705969082,1148,1075531427,-2037550732,-1957626378,-14987746,-92864713,299930,-59310336,302234,731463680,-1980182078,-1705969082,1195,1074767523,1996437620,-1507947524,-13107441,-493159818,-16777212,-1694632778,1429,-1037330112,1183447249,-6663942,-1560280833,1967132452,-1506345185,79927823,922681344,-6677682,721420543,254059456,-1559255389,367729486,-34294017,254025355,1996437503,-25862,250150912,49120255,1562371467,1478413133,-1957345904,-661774612,1460202627,-62470314,1988820992,1174530826,1948269696,106859514,199964553,1949056128,3964939,-2142894476,-260759492,1962949760,140413710,278792135,33310407,-2140542208,360000572,1174406342,1948269696,3965178,1586225012,-348681976,312906,1015023083,1174828032,1965833344,742162677,-672408971,1191181963,-2146702340,192162877,1946172800,1031816999,-957319904,-1958281211,1191308279,1948269952,1465276410,217754,-644198400,-2147483646,-931856324,-16359797,3061815,59349584]},{"sector":9,"data":[-259325952,359986699,122599510,309328,-26032,-1073020928,80085876,-62485760,-310157474,535137026,113921373,-1873273344,-326412987,-2082959842,1048775404,1962935018,8448259,111687423,1342179512,397466,-96040704,-15697757,-1207523274,-1706033142,332,-1543747959,922685576,112723624,1855606784,721420294,-129594944,-637303,-1928943562,1343682118,1342177976,16777114,-96040192,-1544141269,-1073018390,-654899843,-1962284381,1177286726,167551996,92127243,-56370953,-1472790775,112646,-26032,367722496,-1559912264,-358413828,228368649,-1592756061,-2002580058,3979280,-2009661616,-63504624,25860617,1923284992,49120027,1562371467,1478413133,-1957345904,-661774612,1443556483,16533191,-365001984,1668546562,458112643,-2091092992,1025598,1048794484,1946160932,108954446,-1207405568,-4521985,-1207505921,-4521985,-129594881,-1946528119,-1961908706,-1957683705,-1961144802,-1957683705,-1961941986,726670855,-11513664,-1465649058,1958742790,-368654584,-352321278,48931129,-244087,-1710847434,86,-955864925,190982,-58817792,-1592036352,1183384026,-637089802,-1207959551,-1706024926,65535,-1544141173,244318682,-1862368536,3860494,34735815,28835840,-6664192,-2097151745,991806,512432244,529207074,-150989128,-1961739730,307792880,1736449931,-2090959103,-443874579,-900899553,1478361090,-1957345904,-661774612,1461513347,574522198,57999375]},{"sector":10,"data":[-2096933655,993854,1256784757,-365001981,57999362,-16717847,-1207523274,726663180,1347440832,384190093,141007440,-1073020928,1996431476,-365494298,2016870153,135895568,1183383552,-394854416,167524095,277362431,922694891,79169192,697978880,1342177288,1345863864,1342242488,538522,-263812864,111687423,1342179000,392602,1085820928,-21475272,2073710592,-1996488696,-358486458,-263833335,1183384435,167551472,1944995385,-297367293,111687423,1342180792,1347469355,-431583920,-6664170,184549631,-14125888,922740342,922683882,-1902505864,-1560281080,1996427270,-63504408,-2009661687,110533136,2124611584,-1960187120,103542854,-388953622,-1961883997,103542342,-388953604,1187505387,-953167632,1038151238,2124660779,268870416,722417825,722419718,-1995488762,916584518,1007037199,1040591631,-62486257,722417313,-1995487226,1048834630,1962935018,12708099,-1957642197,103542854,103483882,-1706029050,2327,736773769,1183535296,-66704402,2114333449,-6664176,-1996488449,144829510,169249543,67513095,102112007,2094140167,1023770380,91619330,-352321096,-1983894782,1048835654,1946157586,255893864,989857541,1913652742,-129594561,989857541,879946310,84884641,104529927,678563966,100419211,1178271751,-2095222036,1946220158,256287028,989857541,1913683462,-230257909,989857541,494136390,109721343,268842751,-1411329,-15696330,-1533350794,-956301302,135686]},{"sector":11,"data":[-263812352,722417827,103544902,1117982528,-297366769,722417315,103545926,1050873660,-297366769,-1544403413,1187450696,-1962934022,-1961942498,18147639,1962949763,16705795,818307,-169278603,207391488,1166753675,205859588,-1995553493,1166800966,138750722,-1995815637,1166801990,340077314,-2081274231,135742,-1729559691,-365001984,57999362,-1593798935,1178143664,-385649158,-2103377789,-96061157,1166769012,460044,268830267,1183530866,460280,1927956027,138775348,989857541,1913683462,-62485720,989857541,494070854,16154243,1166755700,460050,276694587,1183517554,460274,1944864315,-1976107216,104267526,-361300208,276707071,-1695779073,65535,34735815,381157376,-93391104,512487563,922947362,-1962124149,-263812289,-1962654327,1160507462,-129619188,-1961998967,1166667334,-297366782,721962283,1166670918,-297366774,-1980611029,1996428357,-25862,1191116800,382108666,957295265,58587718,1593762281,49120095,1562371467,2083661,79298819,458753,102957315,196610,96600067,10551551,54132739,10748159,115802370,10027010,161939459,11075839,150994947,11206911,94044163,2883839,122421251,3014911,6881539,10092546,73728003,3670271,131727619,2490370,115278082,3473410,19267843,3145730,183631875,13107455,65077507,3801089,27918595,11730947,1179907,11796483,124452867,22610175,10289411]},{"sector":12,"data":[4325378,71106563,5964031,104661251,4390914,115605765,10027010,120062211,4325379,9437443,4456451,134938883,5242882,133038083,7078143,95289347,7274751,11272451,5701634,115081477,3473410,72089603,8519935,0,1167087646,518818645,-326903666,108953606,-1593477888,199952160,705054346,244338916,-1996380952,582548550,-59836672,-1995289595,-661915066,98176,28839029,-1070903296,-401698736,1183514638,49120250,1562371467,182861,1167087646,518818645,-326903666,108954418,-950307840,118342,-1979711560,1183437382,-1472790576,5945350,9345616,1183383552,-1472790572,5814278,-26032,1183383552,-666449962,922681345,-1070922072,922701904,922684294,1183648644,1389505486,-26032,1183514624,267690960,-1546500469,-4714492,2122535167,91488264,-343933000,112643,112720,-26032,-1073020928,1183656564,-632911396,1586172395,705137370,-1014279964,244338752,-16748568,-6628746,184549631,-1696369216,65535,1342189752,1342644920,1374162576,142508800,-1203735552,-1202716656,-1873803479,4122638,1342185656,1342648248,837291664,4241408,120961104,-401698736,1354235940,1018712064,244338695,721426408,1203261632,244338695,-2097148952,-443874579,-900899553,1478361092,-1957345904,-661774612,-1979257725,-467007418,-401698736,1183383621,2275580,100429559,1183388236,-2133292038,1962934655,138840611,1996425096]},{"sector":13,"data":[-96040186,548950080,-6664192,-2097151745,467006,1183516285,119579644,-1962742397,1297948645,503317706,1430622296,-1910575989,105286360,-1072962518,272439668,1025340416,343146528,1946169405,4209944,1346181236,-1206356992,384499717,317440043,-352321096,178189,62392555,-1207702784,-310181884,535137026,46812509,-1873273344,-326412987,-1193767394,726667852,-860335936,-6664192,-956301057,-16310266,1354771455,-1878624513,-32446450,-1962742397,1297948645,459466,27983875,2883839,17301507,14549247,11665667,4587522,16711683,14811391,14286851,14876927,8257795,5242882,36634627,7012607,0,0,1167087646,518818645,-326903666,-1957275884,1183385158,-1948742660,81159,233374581,146689,54332276,-385649408,1609105989,242679554,-1878231297,39970830,678739979,638344900,723912587,-11532729,-16122826,-1710192586,65535,-1728050683,-150989639,-96040455,109035531,-385875528,1589903906,1207313932,58001431,-1962895127,1207434334,1962999810,38270476,-2094304128,2130901630,-129579227,2122514432,-864220424,-772252021,-460878877,1358483712,58266,1958742784,-129564835,1586225387,38270716,-1959299968,-523109818,-940161399,62534,66354819,28837245,721611520,-159480896,-12288208,110818934,184549377,-14453568,1183577158,-163184134,1586222827,38270716,-1960545216,-523109818,19372624,-1073020928,-1070918283]},{"sector":14,"data":[-1006535191,-1977217954,103028551,57999932,-37143,-6620554,-385875713,1589903714,2139104780,57933848,654257641,605505418,1963080710,-14620413,-1946388853,958793284,762649415,638076043,1964853049,-1948349660,-1960440714,1200167748,-60912894,638351044,-1994570613,-1070922681,-1979949429,266930759,-60912895,721581963,1589905015,2139825676,-60912869,-1962508501,1194001479,1347590408,721700747,1385760839,138906448,2114209593,178181,62391275,1389505280,29727312,1347551232,137114,-993490176,-1960440738,1586175303,138882044,1385814667,-1950119088,-796193698,491227942,737959563,-628422585,-1957670247,-60912701,-1962387573,1317604446,-230258192,492255526,45614462,-1207702784,-768933885,513429586,1375731714,-26032,-930414592,-628373877,-1986400521,1451879494,-137917458,-939288081,1183570451,-229209104,334251523,-633606570,468255614,990346494,-385649976,1589968402,1200301580,-60912869,-1006483575,-1960440738,1586175303,71797244,-133655,1996426870,-401698804,-1073020897,-471268491,-60912643,16926663,-25237248,-310157474,535137026,248139101,-1873273344,-326412987,-992440802,-2144991650,1962940543,1200236065,1007035415,-1592626174,958795764,242555719,638583969,1964853049,112645,-1070923029,-1962742397,1297948645,503317706,1430622296,-1910575989,820806616,105286486,-1946401143,20939736,915084660,881524992,-461372277,138885503,-1070922377,-1962861335]},{"sector":15,"data":[126614622,276086795,1962934589,14870787,1946158141,17033554,705316490,140772,1006395019,57934407,-1006583063,-1977217954,-467003577,-1962872795,1195113566,-1207601916,48955393,1183432747,-60912646,425859,28837236,721611520,-129594944,872040075,57997382,-956266775,259142,16139975,-1472790784,273058566,85087883,1347551250,303314687,303183615,737429133,-1706011950,65535,16154243,1183667060,-800683566,-1961867637,302322262,-1957670400,507564102,2144336,-26032,512425984,529203456,-461371509,4210047,1586176883,276219088,289704486,126414884,-1865386241,71821326,158711819,196347591,233373697,112895,922692075,1183516328,307661584,1375736325,339148624,305594130,-62485742,1347605035,353946,-60912896,1577731979,-1962742397,1297948645,503320266,1430622296,-1910575989,988578776,-1274624170,-2097151989,65598,-1070922380,-1711168279,65535,1073807523,113707125,256,2122574059,58064650,-1962901015,-1961942498,1488927,-1962250505,306220016,-1946663287,-1960866856,2145681415,4241488,-26032,1183383552,-901345850,-943176055,64070,1586180075,-1959293960,-472778146,-1996341109,-661914554,1996437503,2275528,112433744,1996423168,-401698616,-1073020059,1191126388,-968455174,2096776761,2001865,-1960867071,2145681415,1913144891,16705795,184619240,-15960640,-1711210442,65535,-1946199063,-1962868706,-2146989281]},{"sector":16,"data":[1178304484,-385650168,1048772824,1962935976,1354771208,16777114,108954368,721712128,-1207702592,1183383556,-263796754,1187446784,-956292878,128070,-1995946357,922744390,-1070922072,922701904,922684294,1183648644,1389505518,94673488,1048772608,1962937268,108954506,-1954843648,-1962868706,-2146989281,1178304484,-949259512,62534,111687423,1347469355,193345279,193214207,737035917,-1706011950,1508,196361859,-385649664,512491337,529203456,-461371509,138820479,1187459187,-956300560,62022,111687423,1347469355,193345279,193214207,737035917,-1706011950,928,196361859,-385649664,113770249,4546,1577058744,-1962742397,1297948645,1426065098,-327029621,1186464054,-6664190,83886335,-2037841340,-2033713452,65276,-16990589,-385647611,-2033843963,-1962869046,-1963010914,83819654,-1207465935,1344143934,503465656,-897151664,-1924131074,385810054,16824400,-26032,20774912,-385646848,-2037579571,-397345026,-2037841633,-1202651398,-1706033108,65535,201213577,-16353856,-335610746,-28901477,738084491,1358887558,1342185656,16777114,-796489472,2126515198,-88670242,-679047682,-1224781570,-6619440,-1962934017,-1912680314,67032718,-125400639,-123827202,-124846082,509694,-17260917,1965047680,-795934965,-792820738,-511770114,-19874173,-6783487,244383350,-1996470296,1040110214,443809808,1946165309,3161365,1077743732,1024160768,108265552]},{"sector":17,"data":[-19757369,-2037776384,-2037842222,-2037514538,-1873740074,17819662,57982987,738153705,-1207702592,-443875327,1478411101,-1957345904,-661774612,-955847549,64070,-402229505,1183383611,-2145785082,2000288894,702498,-1963301129,-315950002,808304899,-96040704,-16359797,126486086,1023166088,-1948749008,-310117818,535137026,46812509,-326413056,-1979425141,1038363143,158597129,1946165309,-339506428,71761669,-443816213,180829,1167087646,518818645,-326903666,512448006,529203456,-461371509,-1039778945,721712913,-1959334976,-1962868706,-1038185673,-1948004079,1183384128,-1948742660,-1706016761,1555,-96040640,-237941,108461879,80124496,117374976,28840386,-310157824,535137026,46812509,-1873273344,-326412987,-2585058,-1711210442,1280,16778951,-310181888,535137026,516640093,1430622296,-1910575989,105286616,-122138560,-6664192,184549631,-1962314560,2139096670,91554561,-352321096,3604236,108461825,16777114,49120000,1562371467,268618317,1761608448,-1979646200,1476395776,-1946091772,1258291968,-1543438584,-33553664,738262791,-1778384128,788594436,620757760,1057029893,1510015744,973078790,-1728052480,-889127162,603980544,1476460296,-973077760,1510014723,-335543552,1526791943,553714432,1174405636,-1459617024,-469696768,1409286912,1812004608,-1107295488,1845559041,2013266688,1862336262,0,0,1167087646,518818645,-326903666,-96024826]}]],[[{"sector":1,"data":[28835841,-409317376,-1996488704,1950415942,-60912878,662773643,1586200576,-2145416196,-1954610841,-310117306,535137026,516640093,1430622296,-1910575989,82609112,572427094,-1205892337,1861681174,-1947170040,1183388224,1975520252,-401698780,1183448982,91570428,-352256072,572427039,-1205892337,1861681174,-1947170040,1082784838,-59310318,-1878624513,845838,49120094,1562371467,313933,1167087646,518818645,-326903666,-1957275890,529205342,2130798464,-637241,106859264,1183319946,1086557178,-26032,1183383552,2113010,1187448182,-1962925838,1077998150,1183443153,-6663944,-1996488449,1950415942,108461947,-237941,-126419145,16777114,-60912896,2123046795,116466,-1962385781,-2146989281,-1992261660,-523111354,-1728052475,-120470997,-506231,726665334,-6664000,184549631,-1959955264,-1991707578,1586230854,-1958769912,-1948003880,1099562054,140413698,1183528843,2145681652,-511636341,-1056210944,149619849,-1694730497,750,1593198219,49120095,1562371467,313933,1167087646,518818645,1996478606,108461832,1843924624,16727296,1996427381,108461832,-1569136,16727550,28837236,721611520,49120192,1562371467,313933,1167087646,518818645,-326903666,1187468806,-1962868742,-1961942498,1488927,-1962381577,306220016,201082505,1342993600,-1878624513,1239054,-1946532215,-2090927546,-443874579,-900899553,1478361092,-1957345904,-661774612,1443556483,-1962385781]},{"sector":2,"data":[-1992278009,529267270,-461371509,-129595009,16533191,-1958810880,1346373190,-771989877,-92894237,126556299,-6664128,184549631,-1960872512,126486110,183912072,-1961986880,-472777634,-1946519925,-2011198696,-62485753,1191120619,-129594372,2096907833,16758970,49120094,1562371467,313933,1167087646,518818645,-326903666,142016260,-1878624513,-14358514,1039943305,242548991,-16222465,244319862,-1979868952,1183579206,49120252,1562371467,313933,1167087646,518818645,-326903666,2122536454,963903494,-1962516853,-2146989281,1183416292,-62470150,367722496,-1962516853,-60912841,1895818193,50436610,1191116800,-96039940,2096907833,108462051,16777114,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,-950663956,64582,2125995243,-59836672,-2071203701,254088050,105265920,-1937767051,-60560,-1096680378,-62506746,243326076,-2130764930,-15852530,49120094,1562371467,100846157,1744896768,117440769,989856512,-1543438590,-50330880,939589376,-905968896,1526791936,385876736,-2113863936,788529920,-2097086719,0,0,0,0,1167087646,518818645,-326903666,951604746,1211037440,-2114942205,-1961883450,1177224774,244029704,-101249038,-1308998007,-1981754621,727119942,381178048,2040156160,-16777216,-1206933450,787939378,-2147155128,-1070903296,-26032,-1073020928,1996426868,-25864,1149829120,91570230,-352317512,912034678]},{"sector":3,"data":[-1070909441,-126419120,16777114,-96040448,-2012986232,1183515460,239372552,-2012592502,448267588,-1202708989,1344143536,12238891,1347441236,-11513776,1342605878,109852415,-6664112,-1996488449,-1073009596,1283500660,209715498,537690113,-1710590209,352,-1994636151,715202132,272926995,-16562015,1577273350,-1962742397,1297948645,503318218,1430622296,-1910575989,82609112,269008470,-16708480,-1877853642,172484622,-2012071264,1153828164,1153892384,-973078520,-1593834940,378210060,1755514638,1779861787,460104475,460199561,-1995160439,1149834836,441747736,460328576,-1547687167,19202586,-1948200704,-2145685490,-1056178719,-14978909,-1710081482,65535,-1994636151,-1070916012,-26032,1962868736,893684272,709944362,541362368,112720,27171408,1962868736,876907054,726721578,172263872,112720,-26032,-1070923776,112720,-26032,-6684672,-956301057,133638,-2147158528,-6683276,-16776961,244319862,-955702552,190470,460103936,460199563,-1996319581,1577227798,-1962742397,1297948645,503317194,1430622296,-1910575989,-890469928,209125120,1354122893,1342194360,162458,-146356736,-401698816,1183385009,2147433978,-4716939,13429119,-150953288,512490094,117641632,-1946663287,73892056,-128021625,411591,-128021760,34097095,-1236890368,-92864688,16777114,1958742784,102665157,38272768,-150953288,512490094,117641632,-1946663287,509578200]},{"sector":4,"data":[1996437503,4372492,-26032,2122514432,259391242,-16220541,512428405,1342111750,-1923683582,1358902918,-1202667477,-1706033024,65535,-2131206517,-1962867633,-16775650,-2033778097,-1104019658,-13072697,-2033778688,-1425998022,-1962391925,-2147153322,13796096,-12286327,-12151159,-1912965377,1358902918,1342210232,16777114,-96040192,-1962742397,1297948645,503318730,1430622296,-1910575989,384599000,1187468887,-956301068,60998,15746759,-230242560,1187446784,-2130706182,2147420798,512431220,529207712,-150953288,-259323282,17055990,28837236,721611520,-129594944,15353543,-401698816,1183384245,259277046,-624897,244320886,184753640,-1207536192,166330367,1488898,-1946784009,572427248,-1992883441,2122443894,1954545418,-1608611047,-1205892335,1861681314,-2080863478,1962936441,112645,-1070923029,-1325399771,-1948200188,-511703476,-1983837201,-461371836,281837583,-1962523511,19265606,105679616,201253248,105155009,621168267,179372035,1284235475,-203063290,1149878539,107249670,105286647,58048523,1023468521,57999361,1023490281,57999362,1023486185,57999365,-1207916823,1861681174,572427254,-1996029169,-661918650,-1995946357,1586169927,239585260,1586233343,-96039956,-1962260599,1183575134,206014964,-1947443573,1200221766,-329348336,-1980742005,1586172487,-230257684,-2095822967,1962994302,16771331,-1695123713,65535,57982987,-16715543,-6623114,-16776961]},{"sector":5,"data":[2073752182,-16777212,-1868894602,-1207959548,1861681174,-1948742666,-1961942474,-1708064972,65535,-150989128,-661916050,253900427,13055115,-1159135232,175570942,322970,-297367296,-4164544,1183648374,244338922,-1996234520,1950412870,-13113085,2122426859,1954545418,-125926602,-13601792,916064886,-1996488699,1950413894,175570838,16777114,-297367296,-385649344,1996488573,88578570,1183383552,58015986,-37655,1183648374,244338922,-1996256024,1950412870,-18618109,-939569943,60998,-2114004759,2147420798,1996484980,-26102,1183383552,58015988,-49943,-6681994,-1996488449,1967190598,-193527854,-56343,244381302,-2097143576,1962997886,112645,-1070923029,-1962807645,1600058950,-1962742397,1297948645,503318218,1430622296,-1910575989,216826840,108461910,-1092088176,118268165,118359563,512448884,529207074,-150989128,-259324306,-1995685749,-1072956858,884475253,-1962546417,126614110,-956545399,-970394554,-1962609338,206015448,-1946794359,1194001479,239545100,-1913108855,-11471802,-1070922122,922701904,922683150,-6682868,1577058559,-1962742397,1297948645,503317194,1430622296,-1910575989,149717976,253894283,1183385483,1489144,254422775,-1980217853,1187510854,-352321284,-128021740,1962950531,-62485755,1183005163,1191122680,-96039940,1928873529,574029796,705101583,254451983,-150991943,-1070903063,5413456,-1073020928,251595125,-4714710,-1593512961]},{"sector":6,"data":[-2092429526,-443874579,-884122337,1167087646,518818645,-326903666,548951570,1587171328,-1996488704,1967192134,-373282043,381157657,141489920,253894283,1183385347,-1948742672,931788918,1183384715,263662,-2114828663,2147419774,512432500,529207712,-150953288,-259324306,17055990,-2135423628,721611520,-1982714944,1451881542,108954102,91586559,-342245333,10663961,-1962512649,-1607037992,-1959490799,38832896,468993579,1183446614,-61437446,-940679541,-1962932985,1175190086,-1207601668,65732609,-1962933576,1200221790,-228685054,1200209963,-1962440446,1183576158,-61436934,-1996339319,-1039465385,1586186356,-1946973198,19203140,105810688,-780147328,-1983837215,1586168903,-196703246,-1980344693,1468597831,-228685048,673735,-228685056,-33265792,217204355,-1947050357,1452014150,-1995994628,1586168407,72319474,1586233342,172476402,1586167808,72319218,-262239487,-49911936,1577058744,-1962742397,1297948645,503317706,1430622296,-1910575989,116163544,-62470314,451608576,295706251,-1564991605,-59836672,1082847371,1014965253,-13274101,-1465779130,-62506741,922738300,1371017632,-1473317120,5309707,1354771280,417434,1975520000,2147465221,-1465829141,-1475936501,-62486261,-150953288,512490606,117641632,1358579337,-1202667477,-1706033071,59,-1946526069,88378099,185368612,-1962588280,-2090927034,-443874579,-884122337,1167087646,518818645,-6629234,184549631,-13929280]},{"sector":7,"data":[-1710081482,65535,1350565816,1342222776,16777114,-1070903296,-401698736,983825001,11712530,-401698736,-310118315,535137026,516640093,1430622296,-1910575989,351044568,644762,-163149568,-1962511040,-51775930,10663936,-1962381577,51486750,-129595129,1200347275,-96040682,-16220543,-167349121,1963000903,1354771213,-605548912,-163149568,1586219499,407342072,1006388873,58063430,-16734999,1996425334,-230257158,1354771280,628634,-263812864,-2131591551,-1958382336,-1995994152,1183051334,1187447536,-1962934028,126611550,200033929,-385649216,-12714115,-15829505,1183578694,-96060932,1793670002,-159973377,1089488523,-6664128,1023410431,225771775,-1695123713,2678,-335544392,-196673716,971916939,58520646,-1946206999,1077996614,-336574975,142016422,-1912965377,726725190,-6664000,-1996488449,2122444870,1946190066,-1195512950,-1873805311,1632270,-1946794359,130483806,-18284543,49120254,1562371467,313933,1167087646,518818645,-326903666,-26108,1183383552,108347644,-369342837,1996423324,1354771452,657818,261771264,184549386,-2089323328,1946158718,-59310113,1342189752,663450,630870016,184549386,-10783552,280558710,899305472,1342177290,670618,1958742784,-59310267,1342185656,674714,1369067520,184549386,-13667136,1085865078,1637502976,1342177290,681882,1958742784,-59310311,1342197944,16777114,-6664192,184549631,-385649472]},{"sector":8,"data":[1996488558,74160892,1187446784,-369098756,-310116514,535137026,46812509,-1873273344,-326412987,-2082959842,1183516908,-96040698,-26032,1174601728,1183402234,-96039940,1929135673,-60912880,1183319946,1952201976,1966750724,-62485754,-1961366720,126549086,-1705974742,65535,-1996726645,-61931769,-310129685,535137026,46812509,-1873273344,-326412987,-2082959842,1187464940,-1207304452,-1202716493,-1706030594,2852,-1946401279,1065354846,-1207601920,367723132,-1928956161,-1705985466,2870,1354385037,1558711952,1996443903,-25860,922681344,-21494134,-1706025463,65535,-1962742397,1297948645,503317194,1430622296,-1910575989,485262296,-230242474,1187446786,-1593834756,378210060,1183385358,-262764050,-1961662815,-1995216874,1451881542,321692150,321787531,-1981135223,2122574934,58064646,-1593729815,1178143664,-385649402,-1070923375,-1559009117,512430950,529207074,-150989128,-259324306,-1962786677,748880976,773228819,-1715459309,-1996029789,-1559821802,378078972,144901886,169249031,117744391,117839497,-1996026717,-1996026346,1183447622,321692152,321787531,2130335289,13625603,1178142844,-385649928,1996423365,-92864762,-1694992641,65535,185730806,-385649393,312541357,75019,199771785,-2092337984,1963061886,-230242555,1183514624,1975520252,15722755,1946157373,146712,-2002685579,-1978234085,117744411,117839497,33310407,241344768,241440395,-1996026717]},{"sector":9,"data":[-1559818730,378078984,1206585098,33324675,1187448181,-1962934020,-1072958906,-1494678667,81152,37558388,-1591184128,378215304,-56419446,-32077562,-230242554,1654718465,1679198990,118268686,118363785,-1996029789,-1593376234,378211938,1183387236,-94991880,-1946213655,1452012614,325493750,325588617,-1947580789,748940374,773228819,151451155,125108496,269027062,-1606650878,-467005427,1963345465,118268210,118363787,468600363,1183445078,-430536220,460636683,31737483,285984262,17549334,285985286,17550358,286470662,1578316822,-1962742397,1297948645,2228938,185073667,8913151,181665795,8978687,166920195,9044223,166526979,9109759,145817603,9175295,156958723,9240831,142671875,9306367,141819907,9371903,140967939,9437439,74645763,458753,202899459,2031871,28246019,2097407,33882115,2883839,152109059,3473663,138149891,3735807,23986179,4063487,189006083,2424835,13369347,4718847,11731203,2686979,99811331,5112063,157810691,5767423,178388995,5964031,25559299,4063235,44040195,7012607,27918339,7340287,48562179,8323327,38600707,8388863,29294595,8454399,110034947,8519935,135069699,8585471,83755011,8651007,81723395,8716543,78446595,8782079,73138179,8847615,0,0,0,1167087646,518818645,922736782,-1070918832]},{"sector":10,"data":[-1706012592,65535,324024063,16777114,49120000,1562371467,1478413133,-1957345904,-661774612,8973441,252477059,-521600140,242679552,383665805,-26032,1048772608,1962935996,-1404662413,1354771280,1342190264,16777114,440320,16030288,-523173888,277612075,-1918089591,1343663174,16777114,113025792,58048523,-16743191,-1705976202,65535,292929547,112998143,16777114,-1140406528,-352321530,-562626714,378291853,-26032,-1935605760,-1941558512,1083328003,1177286865,460891026,-2197761,1996481142,-431584284,1357006379,736642699,-1202658234,-256245727,-1706012160,65535,-1193380097,-1706033147,65535,2016870224,28751899,-1706012642,65535,-6664120,-16776961,1183649398,-1706027298,65535,-342245333,209617274,1601503748,58998403,-161974786,1946683974,59160658,-8878455,-8741236,-8616249,-2033713153,-130,-8370489,-2109290497,1187512319,-939524220,-31162,-7846201,-1975072769,922746879,922685492,-2037575622,-1202651268,-11532927,-939558754,230406,-6952192,1996426870,175570700,-16222465,-6683018,-2097151745,-443874579,-900899553,83891722,50414593,50340096,50435841,50359040,50339073,50363392,50336769,33586432,33646593,33559296,33644033,33559552,50416129,50340096,33613825,50339072,33622785,83894528,50417409,50353408,33591297,50343168,50350593,50341632,50403329,50341888]},{"sector":11,"data":[33586433,50346240,50358785,83931904,33645313,50336512,-16710656,83909376,33642753,50336768,33594625,33572096,50418689,50353408,-16752384,50359040,33600001,23808,0,0,1167087646,518818645,-326903666,-1983894778,1183448134,209617402,57803520,-1962861847,138218566,-385649408,58065070,1023457001,896794625,1946158397,474433,-1964440715,11397376,-15829249,1996426358,142016266,-1878624513,20047886,-16731927,1996426870,-401698806,-1561787912,242679552,-16222465,-6683018,-385875713,1996423313,108461838,-16222465,-6681994,-352321281,-25986,-1070923776,-26032,1877671936,25837187,-14912512,-1070921098,922701904,922685454,922685460,922683034,-6682984,-956301057,129606,16533191,-12522752,1996426870,-26102,871038976,-15829249,-6681994,-352321281,1326374,913814132,1946160957,242679708,-15960321,1996425846,108461832,16777114,-96040704,-2080614775,124478,-1070921612,-26032,1183514624,-61436934,322788587,-385649407,4063025,1036153346,58130947,-335606295,209617336,393413632,-15960321,1996425846,108461832,16777114,1975520000,-1952781386,607980614,1023898628,225707045,1996458987,-26102,-342294528,175570836,-1710852353,65535,-310145557,535137026,181030237,-1873273344,-326412987,-2082959842,1048773868,1946157574,-1036583156,-26101,-1427570688,209617152,762642944]},{"sector":12,"data":[33832579,-385649408,379650201,138819856,-962525827,-1592726767,1178144924,-1593475578,65739596,-1995834719,-347014074,172395460,-1560280027,1183515288,533770,-1207788893,-1706033134,65535,92127243,-352321096,-1547687166,2122384028,1963066124,112645,-1070923029,-2130272093,33688702,1048780405,1946157568,-1203862738,661979142,-1710328065,65535,33556167,401276928,35522247,113704960,66048,-16222465,-6683018,-2097151745,-443874579,-900899553,1478361098,-1957345904,-661774612,957382817,1819609158,112737923,-161123328,17827846,1048796789,1946158774,-1241069811,-2097151994,964670,1822509685,1846971163,1779841307,960328987,1964730374,196911415,303433259,269747771,922692221,922688362,922688360,922688362,1048779624,1962938040,112645,-1070923029,-26032,113704960,1718,-1962742397,1297948645,1115338,32768259,6946819,16843011,7012355,38731779,17760511,24641539,17826047,23724035,17891583,21823491,17957119,14614531,18022655,13762563,18088191,8847363,18153727,7536643,18219263,12255491,1900546,36700419,1441795,18219011,4260095,9306115,12779775,27394307,4521987,47316995,16646399,9830403,17039615,1167087646,518818645,-326903666,108954380,-949979903,1052166,335988480,721420304,865751232,-2097152000,438846,28838261,-6664192,-2097151745,123454,1048783989]},{"sector":13,"data":[1946158780,1345781541,-26093,-1202716672,-1706033139,65535,45783632,-1706033152,704,112985799,113704960,67266,-1207870231,-1706033147,132,-1191557495,-1706033146,65535,-1946663287,1174604358,-2113524742,-196703984,50873995,103544902,1183387788,-163133444,1048772608,1946158786,-1472298225,141885446,-1705983957,65535,272119551,-1946913025,-654837690,-2110324912,-129594608,1174659281,28856572,144330752,-16777215,-15714762,-15506890,1183579254,65065466,103483974,103486306,-11530110,-1206875082,-1706033151,291,242890495,-755969,922745974,922685570,28840076,1050300416,-16777215,722686006,1996443840,1647771644,-1942552813,112656,23632464,1048772608,1946158768,109093164,269878827,-163149504,112211711,1347469355,-755969,-1207533514,-1706033151,441,112211711,96922,943128320,25401872,922681344,-1936060362,-16777215,-1710327242,405,324024063,16777114,876512000,494141456,271857407,-11485141,1996486262,-62485516,1358317099,1342177720,16777114,209125120,1347469355,16777114,-1039743232,-2097151994,-443874579,-900899553,1478361096,-1957345904,-661774612,1443425411,55197315,-16157681,-1711060426,65535,268963456,172395265,-1961881949,346228806,-26096,1183383552,-61437446,270407227,109014140,270272059,1048601714,1979715595,-128021667,-1727772789,269164170,78774058,915137491,469962814]},{"sector":14,"data":[-1995379837,1334573150,142052102,-233584637,2096920123,990215985,712440398,31080067,-14453504,721635894,-2103816000,-16777214,1996487798,-25862,922681344,-1070922934,-26032,-2090991616,-443874579,-900899553,1478361096,-1957345904,-661774612,111296131,-2092665856,435262,1048774517,1946158758,-1573454053,-1741226234,-26099,-1706033152,65535,-1499217877,111452934,1342177720,-1705983957,790,111294207,206490,-1576614144,-2097151994,1946158718,-401698811,-310181877,535137026,46812509,-1873273344,-326412987,-2082959842,436286,-1070908044,112720,-26032,1048772608,1946157802,-1472790773,-26106,233504768,109721343,111687423,16777114,-1475950848,-2097151994,-16602050,-6683276,-2097151745,-443874579,-884122337,1167087646,518818645,1048828046,1962935992,-1207515340,-16776954,918030454,-6664162,1342177535,1347469355,16777114,-1203862784,208994318,-1207404801,-1706025418,65535,16777114,49120000,1562371467,313933,1167087646,518818645,1048828046,1946158776,142016293,1344157368,16777114,-26112,113704960,1720,35522247,-1070923776,-26032,-310181888,535137026,80366941,16973849,196977,16973948,197061,16973951,197501,16973834,197565,196620,16712404,196666,16712299,196667,16712310,196668,16712202,196669,16712180,196670,16711868,196671,16711715,196672]},{"sector":15,"data":[16712662,196673,16712642,196674,16712597,196675,16712592,16973892,131162,196653,16712519,16973893,197491,16973993,196728,16974003,196831,16973880,131805,16973892,131168,16973893,196682,16973890,197429,16973892,131156,87,1167087646,518818645,-326903666,105286406,1183441105,4372730,-92864688,15514,-62486272,645251083,-1694861569,136,242532363,1342194360,-1694861569,65535,45616363,-1499836352,-1207959552,-310116353,535137026,46812509,-1873273344,-326412987,-2082959842,1183515884,-1981755128,1996487750,1119375370,-1684385792,184549376,-1207601984,686489601,-1694730497,65535,292864011,-16091393,1119419510,-6664192,-352321281,1073920222,-26032,-1070923776,-1962742397,1297948645,503318218,1430622296,-1910575989,116163544,-1710852353,65535,1090143881,-775804007,244338936,-1979767320,1967193158,-18427,1996428267,-60912890,1996437503,-25862,1183514624,49120252,1562371467,100846157,486605568,83886336,1996555008,100663552,-234880256,738262784,1191183104,771817216,-939523328,1526791936,738198272,-402587904,0,0,0,1167120524,518818645,-1974019954,-796260794,91488316,99338494,-853953392,-1958673375,76023926,973161670,1543652550,-1274820989,-1960719033,477235318,70927950,2088827765,125066495,1180435654,-1962933050,138816454]},{"sector":16,"data":[-1878594752,-150993722,-310157608,535137026,80366941,-1864856576,-326412987,-1260876258,-2094936743,-443874579,-884122337,1167120524,518818645,817158286,-310173235,535137026,-1932833443,1430622424,-1910575989,106335192,-851246920,1942063905,-18429,-1962742397,1297948645,-1946156342,1430622424,-1910575989,106859480,567099060,1912602808,-310165503,535137026,46812509,-1864856576,-326412987,-2082959842,-14794004,-1927412106,-1705984954,65535,-1262725491,1914817857,-18429,-310126345,535137026,46812509,-1864856576,-326412987,-2116514274,1459651820,1996430854,1183653384,-258322244,503316480,503740159,-8747379,19372624,1452081152,-1928913220,-1258325314,1914817878,-18429,1594349815,-1962742397,1297948645,-1946155830,1430622424,-1910575989,207522776,-1962387771,1068762702,41099725,-310126345,535137026,147475805,-1864856576,-326412987,-1948742114,1455754334,105810696,567099572,-654900621,-1962742397,1297948645,-1946154806,1430622424,-1910575989,207522776,-1962258805,1183451222,-851266554,-150637791,-17704,-1962742397,1297948645,503318730,1430622296,-1910575989,149717976,108461910,-1995989784,-12715962,-1207536129,-342228993,-126419084,1347469355,1342177976,-1561850224,-96040449,201086601,-2093974062,863371258,1979710013,108461870,-1995741976,-12715962,1344304383,1347469355,1342177976,1927810704,-96040449,201086601,-1962378030,1452014150,-1960645636,-654837178,-24907637]},{"sector":17,"data":[-2096399341,108993534,191891143,12058625,-6664128,-352321281,-310157690,535137026,46812509,-1873273344,-326412987,-2082959842,1187450092,-1207959302,1861681161,-1006238970,-163149551,-768313,105286655,-336050551,-161576151,721700747,1209760774,-1946401143,1178203206,-1962117124,1183448134,-129594380,-375159,1183053894,1486948854,-129615589,1183567740,49120250,1562371467,182861,1167087646,518818645,-326903666,-2125048032,-16651714,-16092033,-6682506,-352321281,142508819,-1207601920,48955398,-1873756117,-10360818,-1192474999,1861681161,66096108,-955136970,60998,458768011,-2081653205,92144895,-352320328,1002932994,427748934,17188086,2088841332,1954545410,41221929,300420752,1975520007,-293698787,-2095090432,1962934908,142016267,16777114,-330921728,-370260225,1191116933,164004846,-1564955925,141489920,295706251,1183385347,-153580570,1946223687,142508821,-1961921536,1194919494,-955812086,126534,1183535595,-1311626490,-26105,1586167808,-532248090,-1948100983,39291655,467682859,129098326,16777114,-1980200192,-8133506,-1207602431,48955393,1178322827,-1962576146,216788550,1929510787,112645,-947191061,-1947318647,-768932282,-150993735,-162100751,1178190475,688226030,99288646,16139975,-330921216,1223575043,-1174911351,-369688567,906227851,401281476,-16614271,-16092033,889127540,1307053712,-129040639,-1962283389,1178201158,-1948156424]}],[{"sector":1,"data":[1174662726,1183401990,-15799320,1996425334,-401698584,1325334824,105286632,2112374329,142016490,-330921136,-523040847,166200835,-294191280,-1569136,-196703999,-1981004149,163182662,-1947601152,-1003093008,138840849,-1962785655,76088902,461113087,-1994687327,1686111300,2122448390,2097185012,-196703483,-2135424021,2145681408,1284235473,31555846,-1983837440,1153828420,2123104008,-2131787276,2130643712,-339244284,-1983894782,1317794886,1183531270,-503889912,729801856,-97060910,-229209841,503569035,126491524,1183441962,-96024592,451608831,-1980742005,163117638,-261163264,512489611,1099567556,-1981535736,2122444870,1962999792,-92372513,242548991,-1947050357,-1977908162,25753670,163058411,-93391104,512489611,1183453636,138512632,-16365825,-964429754,-296812791,15629955,2122516862,58589428,-1946213655,1174662214,-2090901770,-443874579,-900899553,1478361092,-1957345904,-661774612,1443556483,1090932363,1074284171,-461313545,-137221249,-1995441610,-628360618,461649547,-467009398,-940030327,16776262,-1207915543,1861681161,-1006238728,-163149551,1183570059,38222088,-2132212876,105286400,2037712697,17188854,1996425332,-401698808,2122384496,1962999804,-161576175,-1962391670,915143262,8919940,1586173931,138906358,163104907,-59836672,512487563,1216876996,-161576184,-16627769,-161576065,-33134720,-1577689461,243997564,-506389672,-1054088751,-1962653815,-1181091770,-101253116]},{"sector":2,"data":[108384779,-631157,1586168911,138921718,-129594369,-1946401143,1200289374,-1981535736,2122446918,1946222584,-11802365,49120094,1562371467,313933,1167087646,518818645,-326903666,-1564977644,208598784,295706251,1183385347,-1948742668,39291655,-1980217719,1183578710,-1311626486,144808455,1183383552,-229209616,-1946919285,1982535799,108411146,1988690806,105286406,-523040847,-1946794359,1183577182,407320842,-1070922633,1586198507,71825140,-2095221759,1946160254,32153879,1946961465,172395279,1997162297,-62470393,1038811137,-1946663285,1177287254,-229237776,-1981004151,1187507798,-1962934020,999945798,259845718,1178273151,-1962379540,1183444038,-1961956362,194639430,2080800722,1992297373,209125273,-16091393,1996425334,-59310090,216534672,-310157824,535137026,147475805,-1873273344,-326412987,-2082959842,1996427500,209125134,-1996333592,-1072957370,1996439164,32499726,1358317193,503989899,142016336,-1226305904,-96040455,1963476539,138840838,-1962893079,-654837178,2080379709,-96040157,457038071,-1206288640,384499713,-134723957,1261016,1183517308,1037629432,-411172837,1183432747,243172348,-2096729088,1946158718,138856199,988479488,16285315,2122516092,75301114,65781803,-1980086645,1174664262,-263812854,721962635,1183446086,-1962284046,1191178334,1476904688,-899445,-1072958898,2122575231,108265724,191891143,2122514433,57999372,-1191221527,-1706016768,611]},{"sector":3,"data":[-2080417047,-443874579,-900899553,1478361098,-1957345904,-661774612,1444342915,-150953288,512428654,117641632,-1947056503,-1962439720,1183384151,-61437446,-1728020296,1996443730,-92864516,16777114,-196704000,129094187,242330,8389888,-1996434813,1451882054,108954616,-167152640,1946286662,138870531,-1727510901,-1946792309,1311504478,-60941318,1266670139,-935656324,1996440947,-193528054,-1695267073,2354,-150992455,-1006238743,-263812847,-259270517,621167755,-864026623,105351425,-2131730805,-1962867121,1183576670,-128545802,1468598153,-96040702,-2080614775,1946158718,-96012718,-11766783,1996425846,-25868,163119104,65664768,-1995324410,-661918138,-1996045437,126610526,-461313839,-461356929,-364476033,75649,-1947443573,-523113914,1586169609,105873646,-228685055,-2097084541,1577058903,-1962742397,1297948645,1426065098,-326898549,10663940,-1962643721,51486750,-28931833,1200281739,635709957,1183383679,671228,1996433525,-401698812,-1073019837,12062325,1822052416,-1207959541,451674111,-1963041141,-467008185,-1996456155,112786502,-59836672,-2020878197,-443871620,180829,-2081649835,1996425964,-7084026,-637303,-1964505482,-163149313,1979711293,-280571,1183537899,-1311626492,112892423,1183383552,-94991880,1391884031,1354771280,-2098721136,-62486025,1040078473,594935802,-402229505,1183384397,-49674,-11484300,1996487286,1354771448,1525157520,-62486025]},{"sector":4,"data":[-2080483703,2080439934,-339727612,-62485757,-1034033781,1478361092,-1957345904,-661774612,-2095649661,122430,2122517364,91553798,719962155,-599883007,141819905,956426913,-327940538,16139975,298098944,-369867127,1586168063,105286644,1946306361,15395075,17188854,-504822923,-1995994368,1187507782,-1962934032,129103430,100917459,1183386088,637162,66481911,-1995324410,1191177286,-263782410,167003779,958093473,360576582,-1946919285,1194919494,-1962248958,1174663238,1946631150,-195130407,-771930229,2145681640,-1309649269,65196807,8400322,-939768183,-1466,-16353537,-1209471370,2092960766,108461860,-1979822872,-12717498,1343649023,518669963,-59310256,887623312,-96040458,1962690107,-92372178,-2094826496,1962935934,-569981166,-1207959295,-1706016765,2124,-939586071,16899078,538097664,12119275,-1947735232,1325396038,2126515184,-329348332,166479491,-33134720,1191176683,-196705290,458793225,2113291833,-17372925,-2097151560,-443874579,-900899553,1478361090,-1957345904,-661774612,1460202627,303079766,2131117625,8579331,-335788407,440337,-1946390793,2122827736,-8388850,1183579206,-62506746,279177084,-395842798,1183383665,269418488,303079698,1962427961,440397,303050487,-2071203701,1183387262,2147433978,-1564985228,-93391104,512489611,1057165728,-1979332733,2133129286,-511701622,-2000614784,96897797,-1202712964,1861681158,243009016,243792]},{"sector":5,"data":[-26032,278986752,105265426,1600035196,-1962742397,1297948645,1426064074,-326898549,-129579254,1187446784,-956301062,243072582,-637241,-129579009,921370624,-1946263925,103482439,-1991763118,2139225158,1971322626,303079686,-1946401239,1178203718,-1962117124,1183448134,-129594378,-375159,1183053894,278988542,-129615598,112771708,-93391104,-1082009461,2147421822,1996425332,220437242,1183514624,1575324666,-1873273149,-326412987,-2082959842,-2125069076,2147419774,512436596,529207712,-150953288,-259324306,704987274,8332772,1039943305,192151562,1946159933,-6664186,1577058559,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,16533191,-1608611072,-1995994351,585890374,-1963303285,2133067079,242486076,2326400,1996425332,-401698564,1191116939,-96042500,-1465843550,-62506741,-310126980,535137026,1439386973,-326898549,10663944,-1962643721,51486750,-62486265,1200281739,635709957,1183383679,142574586,-1207601918,48955394,-863977429,-28931672,-402360577,1344144340,100419211,1344143394,-1694599425,3749,1039681161,91619327,-335544392,440338,-1946521865,-129594408,243042185,-1946663285,46292453,-1873273344,-326412987,-2082959842,1448563948,-150953288,-259324306,295706251,1552627459,-2145416418,91553855,-487997397,142377729,-1207601918,48955394,-998195157,-62486232,-2147203850,1182795380,183206141,-2147138314,1182794868,-996145923,-2004933621]},{"sector":6,"data":[37548614,54275954,1182991474,2088964348,561316360,-2147203850,1552620405,-1875378402,-232790002,1039419017,158662655,32786166,1038680948,71628289,-16223104,31983222,-1962546429,126557788,1347607180,505562253,-59310256,16777114,-163149568,1979711293,13363459,-2147203850,1183673717,1150111920,-1070903254,274766416,-1073020928,1183668596,1552634032,-1707606242,65535,1198833675,1353729677,16777114,2147433728,1183660405,1754943664,-1996488688,1950413382,-1608611030,-1205892335,1861681314,-488698,-6676879,-1962934017,-1961779170,10663967,-1962512649,-230257672,-2145500791,-394263476,1183448381,440568,100167415,1183387260,-1948742740,126481990,-1951637877,1200162374,-1403090174,458360575,-1994698079,-1564998585,107935488,512489611,1057165728,-1979332733,2133129286,-511701622,-2000614784,112645,-2097117975,1963067516,71628375,-1605274240,2133068740,779223868,86277251,244328565,1039189736,510984224,-1996367199,113749574,474,1344282552,1045402,-1371108608,-385754461,1153957466,-956301304,64582,-2147203850,-1326906507,-45711106,-22419072,-2147138314,1156978805,309690372,35945603,431492213,-6664160,-385875713,113770018,68464,1593711081,49120095,1562371467,182861,1167087646,518818645,-326903666,1586189894,25133064,-1979157190,216279559,721611648,599281856,726670850,1183666368,-1706027334,65535,225820683,1346371768,637850]},{"sector":7,"data":[-339727616,142016320,1354385037,-1705983957,65535,-1710721281,65535,1090274953,512483188,529207712,-150953288,-259324306,-1979955573,1996430912,-401698810,-1072956057,28884852,-310157824,535137026,80366941,-1873273344,-326412987,-2082959842,-1957296916,-1961779170,10663967,-1962512649,595099888,-1207602176,753598465,295706251,-1564991605,107935488,1082847371,635709957,1183383679,671228,-1706031500,3294,-1878624513,-50206706,49120094,1562371467,182861,1167087646,518818645,-326903666,-1564977656,107935488,295706251,1183385347,108462074,1342210232,-1873756117,-147658738,-1728020296,1586188370,41418746,-1785055233,-1996488696,1996487750,-459649018,-1191182328,-369688567,298059267,-1946663287,-1947169832,19203652,30179328,-1962522743,1333852254,1586168070,-2146991622,39289600,-94467328,1090274955,-1961343095,-2090927034,-443874579,-900899553,-1957363710,49054700,956427425,125109318,1795049159,-2095912190,1962935422,-28915961,99287644,1291732679,-28931326,-1034033781,50336258,-15797504,50368000,17764097,50333440,-15804416,50373632,67188225,50332928,-15747840,50343424,-15648000,50345728,-15969792,50345984,-16528128,50384896,-16118272,50385152,-16553728,50385408,-16581888,50385664,-15708928,50385920,-15644928,50386176,-15669248,50386432,-15809024,50386688,-15801088,50386944,17681409,50350592,17842177]},{"sector":8,"data":[24832,0,0,0,1167087646,518818645,-326903666,1183536724,-62486264,-26032,1111293952,721780224,31910336,1353991821,-2146935157,1966735743,-62487789,705137154,-660975388,754974723,48955456,-1705983957,65535,1039550089,377290755,1979707709,538753033,-26032,113704960,68464,1183692267,1996443828,178186,-401698736,1183515452,-1992278006,1183447622,-1236890120,-2085468535,-1962740114,126549086,1018185352,1006924892,-1961790161,1191181382,-128021508,-956807425,367746055,-5081345,1996486774,-401698570,1183515384,1174489334,-60912648,-1963178241,-1371109369,276086794,208940092,141828156,74722108,510986556,-956801397,1325334535,-60912644,-1963178241,-1404663801,57982986,-385813527,2122318085,1182084782,-237941,126549062,1018054280,1018066012,1017803823,-385649618,1586233085,-62455812,1183319946,1952201902,1949252615,-18355965,-1946661121,2139158622,-2123080449,1006257803,-370313256,29294289,-2144277760,1949085310,-1367441360,-2144701408,1949019774,-1367441372,-2145487863,1952231038,-1367441384,-1961724881,1191181406,-2012771588,-2142851514,1962978942,234783690,-1897331842,-62485506,-11483605,-1873348490,35055630,-2131200511,1966059134,-128021750,1560233926,-2130767127,1946201726,-1367441381,-2146077652,1948298878,-1367441393,-2146864085,1946791550,-17700605,-956801397,-16711865,1586170486,-1847034,721563319,244338880,-385742616]},{"sector":9,"data":[2122383096,58007724,-2130775319,1946791038,-31725309,-1191254295,-2090991615,-443874579,-900899553,1478361094,-1957345904,-661774612,1460464771,175541078,-506169,-335598593,64981836,775913694,-544532107,2139151875,175397889,-570171509,788627328,-947714699,-1960121598,-2132933665,645213759,-570171509,771850112,-544531339,2139151875,175397890,-570171509,788692864,-947713931,142489859,2122952575,142490100,2122911871,106859516,33310347,-373282041,2122907919,138841084,2096907833,12642563,-1963172213,-96040960,57835580,1006671081,1020424737,718174078,3816932,1819748468,1023418925,2071396365,781434883,51947519,-491901,1183559541,-62506508,1183557492,-129594884,2122538475,-1720385028,1352139914,16777114,1958742784,-62485620,138820416,1183548276,1183400188,-129579020,871104511,42795661,55247691,55247691,55247691,42795661,55247501,50397912,1962957629,-11409149,993858423,1023963648,58130495,-48407,1290402886,6045183,1564322676,-385649408,2084437807,-385649408,-471072985,-491901,1183516021,-1962677496,1177286726,540148,1183517822,525812,-369342839,2122579715,91619320,-352321096,138840852,1224230443,2113930045,-129594385,-352320507,-2090901797,-443874579,-900899553,1478361094,-1957345904,-661774612,1443163267,-351897973,173968155,-1979037953,-62486521,-1705974742,65535,-16228725,126355526,189712011,1591637440,-1962742397]},{"sector":10,"data":[1297948645,503318218,1430622296,-1910575989,183272408,1187468887,-16776970,1184500342,-1962934268,1988710128,-129594376,1308624173,360564283,-1979031925,-1947981312,788497400,-1014292619,1183434243,-159480842,-14781184,1996425334,1481226,1174601728,-347060214,1560249112,-8133772,-339839697,108954588,-16026624,1996425334,-25866,1599995904,-1962742397,1297948645,394954,74055683,8913151,3866627,8978687,6160387,3014911,68091907,5964031,49872899,14418175,4718595,14483711,0,1167087646,518818645,-326903666,-2135402996,1347590400,-16091393,-6682506,-1996488449,-2135360954,1347590400,-16091393,1486489718,-1996488702,1996487750,244338700,-1996444184,163117126,-126945536,298059267,-1946925431,-259324322,-788118389,2145681640,-1980086741,-129594617,-523040847,66733571,1577707526,-1962742397,1297948645,503318730,1430622296,-1910575989,183272408,209125206,-1878362369,5826574,-1191426423,1861681161,-1006238724,-96040687,-1962385781,105155568,-461313839,-1962440321,-1014760866,-128022266,19203979,105253632,-1996488411,662763078,-128021506,167134859,-62485753,-523040847,166200835,49120094,1562371467,576077,1167087646,518818645,-326903666,-1957275898,-1958672818,-146798522,2145681633,922210859,-628420614,461651595,770376074,-150992456,-259261330,298071555,956843659,376767044,1178141835,-15764218,-1592034298,1149836156,-62485756]},{"sector":11,"data":[1149901035,-1981535736,-12714938,-3574528,1996425334,-26106,1599995904,-1962742397,1297948645,503317706,1430622296,-1910575989,116163544,-62470314,971702272,-150993224,-661914514,243173259,1039812233,578060287,425603,512431221,529207712,-150953288,-259261842,2324608,1996425333,-401698564,1191117161,303079932,2096907833,-310157633,535137026,46812509,-1873273344,-326412987,-2082959842,512427756,529207712,1468729227,-96040702,-1946397047,60360262,1444149830,33195004,75437948,292995083,1346372536,16777114,-569981184,-352321279,1354771214,-16222465,244319862,-1962929688,1452014150,49120252,1562371467,313933,1167087646,518818645,-326903666,-1564977646,175044352,295706251,1183385347,8435962,-1957670247,2013264478,-1707606270,65535,-369342839,1996423332,-59310326,-1862514945,-25368562,-1191819639,1861681161,-1006238730,-196703983,1200347275,-2132225786,1183416292,8435960,-1946663381,108411376,1183515519,-230258426,-1962379521,129103430,1174659283,-402258952,1996443657,-25870,1586167808,113476596,-1947181431,-2132225785,1174634468,2145681650,-2115090807,-1962933977,1183576158,165728750,-195130617,17190784,-1712175477,33185419,39260423,-1946526069,1200225350,-230257896,688408065,2122516038,58589190,1593791465,-1962742397,1297948645,503318218,1430622296,-1910575989,149717976,440406,84307703,1183387260,-1948742660,1183384135,-1707606022]},{"sector":12,"data":[65535,-150953288,-259261842,295706251,1149908739,209724421,88377354,-939762037,2147418695,49120094,1562371467,100846157,-1241513216,738262786,788529920,922812160,16777984,-738132222,1073742592,-654246141,1442841344,-637468927,452985600,-620691712,0,0,0,0,1167087646,518818645,1996478606,209125134,-16091393,1996425334,-26106,-1073020928,-1070922635,-6678549,-16776961,-1710385098,540,192296703,16777114,49120000,1562371467,707149,1167087646,518818645,-326903666,-1983894770,1183448134,205949946,1962939965,38988035,1072235382,77059,1979716669,42985731,781434883,58894335,-15829249,1996425334,-26106,1048772608,1946157542,1354771208,16777114,-96040192,-369338741,1996424037,57337870,1996480747,-230257394,-6664170,-16776961,-1070921098,1996443728,-126418954,110769919,110638847,16777114,-96024832,1187446785,-352321284,172395437,-351887709,-969474139,-26095,2122514432,192217096,-16091393,-6683018,-2097151745,964670,1822524533,1846971163,1779841307,-385649637,104464244,57940840,-37911,-14980554,-14981066,-14980554,-1206163402,-1706033151,459,-2080419863,1946159742,142508834,-14912256,-1710214090,65535,259309579,271857407,16777114,109748480,-2096712541,1946159742,-33110266,-2097151999,121406,300483444,37651455,57999362,-63511,-6681994,-385875713]},{"sector":13,"data":[2122579708,57933834,-956264727,16907782,444160,-2097151998,214590,922691445,1285162634,-16777214,-14980554,-14981066,-14979530,723217462,-6664000,-956301057,16991750,1354771200,125338,-1304526080,158662662,1342177720,16777114,-499219712,57933825,-2080466967,441406,-1914109067,1345781758,-26093,-1202716672,-1706033139,65535,-26032,-1706033152,65535,112985799,1709768704,-1547686914,-22871860,-1475987199,1342600454,16777114,1178501888,57999363,-112663,-1710847434,65535,54920903,922681344,922688362,922688360,922688366,-890692756,-29457410,276037633,109721343,1342177720,16777114,-32577280,109721343,109590271,16777114,-2012821760,-16777210,721848886,-2298944,-6680970,184549631,-1207601728,48955393,-768884693,-6657557,-1728052993,2122539499,57999370,-1191326743,-1706033151,65535,-1694646295,65535,-131351,1996426870,142016262,-1710590209,65535,-154647,1996426870,108461834,-1710721281,65535,-1946316823,-264435130,-14846734,1996426870,175570700,-16222465,-6683018,-1996488449,1451883078,-43324932,109852415,-1728052040,922701906,922683018,922685986,-6680032,1073742079,1240007540,1073920253,-26032,1038680064,242679805,-16091393,244319862,-385800984,1996487980,175570702,-402229505,501809655,209125373,-16222465,-6683018,-385875713,8453388,50791119,47645447,50790719]},{"sector":14,"data":[50791175,50791175,50791175,10879751,45220507,50791175,57737390,1963004477,-11802365,473770615,-385649408,276299220,1929386557,-12588797,1979718461,-13112924,1946164541,17907100,250151797,-14161409,1963004733,-25040637,1963004989,-9246461,1963005245,-10884861,1963005501,-52303613,1963005757,-52303613,-2080441111,-443874579,-900899553,-1957363702,149717996,-1929087233,1343682630,1342177720,16777114,-1338080512,158597126,112211711,279194,943128320,72063504,922681344,1419382838,-16777212,-1710327242,1117,324024063,290202,876512000,158597136,271857407,111514,74907392,1347469355,16777114,1575324416,503317186,1430622296,-1910575989,142509016,-385649403,-1070923580,-1560232797,2122514972,1937048584,55451275,706758538,105266148,-1511455883,-26112,-4718592,1347590400,-1727641973,748769362,773229331,1310624531,407317251,1377457947,-26032,1347551232,16777114,1310624512,407307011,-1994762477,1468601415,-1706012138,65535,55451275,542663,1310624512,34570243,55195391,16777114,-1958483200,-1073018810,20779380,1024947200,494141442,1946157885,-1205671137,-1706033151,65535,28841963,-6664192,-352321281,-26100,99287040,-352295752,1354771436,-26032,-310181888,535137026,113921373,-326413056,84311683,-1070900108,-1560232797,1183515164,1958742790,81174,37559412,1025668096,661913603,1946158141]},{"sector":15,"data":[-13112532,-1710092746,65535,922692843,-6680050,-352321281,269394209,278660651,-1578833072,103485454,-347074404,71732197,269616683,-26032,-443875328,772194909,2030109440,1761608450,385942272,1795162883,-1291844864,-1878982910,956367616,2080375556,-301989120,-1627324672,2030109440,2130707204,2063598336,704708355,-134216959,721485570,-469761279,738262786,-1996422399,201327362,-805305600,755040002,1241514753,771817219,-939523328,771817218,-1627389183,788594434,-16776447,805371648,-1979710719,822148864,956302081,838926080,654312193,855703296,436208385,872480512,-788462847,486539776,989856512,-1241448701,1560347392,369099521,-520092928,922812164,1442841344,989921029,285213440,1040252677,956302080,1057029890,-654310656,1073807105,-1224670464,553648896,-1728052480,1090584320,-1241513216,1107361540,1342243584,587203329,369165056,754975234,805372672,1157628416,687932160,-1107295484,100729600,1107297026,-1962867968,1191183105,-637533440,1845559044,268501760,1459618306,-973077760,1895890693,-1560280320,1912667909,-1744829696,1929445125,1174405888,1946222341,1056965376,1962999557,872416000,1979776773,-134216960,1996553988,939524864,-33489151,0,0,0,0,1167087646,518818645,-310126450,535137026,13323613,0,0,0,1167087646,518818645,-326903666,-950642912,60998,-1705983957,65535,58048523]},{"sector":16,"data":[-1962795543,529139806,-2013855958,1963721392,23456003,1183432747,-364475924,459945727,459814655,1342178488,161178,-163149568,-502135,-1592640970,378215276,19733358,14320384,922701906,922688362,-1667622040,1375731714,11639376,1654718464,1679198990,-263812850,737302153,1444673094,-96040456,-1577298295,378213164,1446581038,2083094514,-263833339,922690163,1996427834,-260636686,172954,241344768,241440395,468731435,1183445590,-329872918,-1946794357,1174665302,-61467654,334120451,373025878,2071728942,104531583,1937117996,-1947580789,1174531158,-61468166,425603,45626996,922701824,1996427834,-159973384,-231681,-4654474,1385779455,-96040112,771511947,-628948990,726684160,-2036707136,-956301311,1606,-1092583795,118889320,-234879559,976682917,775356178,741801747,-26093,1757347840,-529101541,96012062,-2086276608,1946158718,178217,976682832,-126419182,-624897,1996487798,-18182,1347590480,-231681,-1070859658,32479824,1048772608,1946159984,-25988,-1477902336,459841792,459937419,-1980348791,1347614806,460207871,460076799,16777114,-263812864,737302153,1444673094,-96040456,201086601,-2087684670,1946158718,178210,976682832,-126419182,737572607,-1202696000,726728703,1347440832,-6664112,-1207959297,726665710,1586188480,705137160,-1014279964,-6664128,-352321281,142016307,305805055,-493825,1996486262,-260636686]},{"sector":17,"data":[-1763176816,976682753,-126419182,-624897,1996487798,-59310086,-1694861569,874,-310157474,535137026,80366941,-1873273344,-326412987,1473809950,106859350,1757346699,-1190715877,-1510866939,459945727,459814655,1342178488,16777114,459842304,459937417,305805055,-1961136991,756772374,-628948991,-11513344,-14980554,-1709479882,65535,563761234,-1593835517,378211938,1822625380,1846970651,-2090901989,-443874579,-900899553,1478361090,-1957345904,-661774612,1460595843,460104022,460199563,-1980610935,244053078,512433000,1317608298,-128022026,-753155797,-1980086647,2122579030,1467219974,16777114,321691904,321787531,2146719289,956660806,1064825414,305805055,460207871,460076799,16777114,321691904,321787531,241440313,108994940,241305145,748755318,773229331,-163173613,100161051,-763166719,-96040704,-239991,-15582666,1996486774,-59310090,-362753,1996487798,-25862,1183514624,459849480,119468171,-234879559,-2090901851,-443874579,-900899553,1478361092,-1957345904,-661774612,-16353537,-15582666,-14980554,-14981066,-14979530,-1877251018,780302,-1962742397,1297948645,503317194,1430622296,-1910575989,283935704,-150989128,512429678,117640994,-1947056503,-1995994152,1333852742,1996423430,209125370,-1710590209,1021,-244087,1996487286,108461832,16777114,-129595136,191905411,-1957595904,-16775650,1183515207,-263812612,-150991688,1586232430]}],[{"sector":1,"data":[84345850,1183383556,-2094863370,122430,1586176885,175636470,-1877969153,2615310,-1980342645,1191119431,-163150864,-129594612,2096121401,102665174,38797056,-1962742397,1297948645,503319754,1430622296,-1910575989,-1393786408,-1957275904,126486110,-2037783510,-661913766,45123466,52818059,-431585024,203802251,1552320768,633768959,1183383584,633768956,-2037841792,-963903650,-1996472283,1187505222,-2097151764,1962993278,108461835,339866,-431585024,-10385779,-152025463,1963001926,14084355,-1957642197,-388954042,-780147584,1372138464,-297366192,-26032,1183383552,1183400184,-128021526,-467007606,-1980873079,2122577478,57999606,-1962853143,126544478,1183441962,-1965519878,-1962758009,206328,199771785,-16026176,-6624650,-1996488449,-2037651386,1178206042,-2096663046,16735934,-947184779,956304421,1979669638,633834291,1178140704,-2094433028,1946215550,-96040157,-10844615,-1098706315,1964834650,-362902773,704726922,-330956316,703088267,518778438,486178435,-1098709131,1947860826,-361299989,-1018113,1654319222,-1996488698,1183576134,-364510744,-369736151,1183514456,-1981535735,-1962977146,-388954042,-1996456155,-661915066,45123466,-125049814,556675,-2037699980,-667156646,-1098709131,1962999646,633834267,-2043084788,779485020,539346827,-62506752,2122523772,510918884,972703371,1979669126,1522434830,125115647,-10975605,-940816895,60998,2122527211,125115642]},{"sector":2,"data":[-10830205,-1947438055,1191178334,-96040208,-947189880,-1996487899,37613126,-1962117888,1191178334,1485212400,-16283393,1996424822,-428408848,721453240,-1705972154,65535,109550160,1586167808,-330921232,-2097068288,1962995326,-427916488,-13467902,-2037518218,-11468970,278586998,-2147483641,-16820570,-1963958645,-796974073,1452182240,31555839,-2037858038,-2037645482,-1427505322,-431584512,-2115090943,8449662,1889607038,1418103051,537901311,-26032,-2037710848,1889795924,138840843,-2097118999,122430,1183511413,1619429614,1095935,1619430736,1183535359,-1706016530,65535,91602955,-352283487,1619430742,280514815,1183535104,-1706016530,65535,-1957642197,-31134138,1183400000,28856558,-6664192,-2147483393,-1929312178,1358913670,-1695648001,65535,-657327407,-780147584,139365344,123265,1183432971,9741064,1593801449,49120095,1562371467,313933,1167087646,518818645,-326903666,-129594104,-1946401143,-62455848,-2012723574,-60912889,-2012854646,176063239,-1927383808,-1202653114,-1873805311,-127604722,205391559,62390292,-6664192,-352321281,175570705,-11485141,1996425334,34052860,-310181888,535137026,113921373,-1873273344,-326412987,-2082959842,1187448556,-1929379588,1183448134,-1965519878,126355014,-16091393,1996425334,-401698564,-310181877,535137026,113921373,-1873273344,-326412987,-2082959842,-1070921492,1612368,-1073020928,1183661172,-62486024]},{"sector":3,"data":[1191172235,138840828,1183647624,1996443654,178428,94083664,1183645696,28856568,244338688,-940066328,336346630,243712,128424528,-310181888,535137026,113921373,196629,16712252,196638,16711798,196639,16712445,196640,16711791,196641,16711753,196642,16713658,196643,16711975,196644,16712113,196645,16712082,196646,16712010,196647,16713746,196648,16713810,196649,16713528,196650,16713511,196651,16713782,196652,16713460,196653,16713414,196654,16713308,196655,16712897,196656,16712942,196657,16712684,50,0,1167087646,518818645,-326903666,43950390,1963607609,461938988,462034571,2080921145,956661536,426903110,-1961991519,957244438,226429014,837354365,105265411,703136627,1488899,-1962250505,51323422,-196703993,1200347275,-754274042,206312,-1947187575,1451951686,72825096,-1914109058,956857344,58065479,-1593801751,378213222,1446581096,2135522312,105265413,1996440182,105286410,755521163,-628948991,-1873784320,-10426354,-1961991519,957244438,545196118,1178142076,-1961266426,1200354398,72846082,-2097151483,1654849746,1679198478,43968782,-1559607669,1586168478,38243316,-1559996533,378084232,33889162,13796096,-1995545949,-15834090,244320886,-385712408,512426608,1207894022,-195130622,126558091,1357792905,-1962522997]},{"sector":4,"data":[1183385686,-128546314,-6664110,-1191182081,-369688564,99501571,1183383556,43950572,1963607609,241344794,241440395,1963480633,105265422,1183517045,139889414,-1962894615,1183444038,-228684814,1468729227,-431585022,-1947707767,-388955065,-1988107136,1207364166,1282736388,-1962522741,1183385687,-531199522,65697535,1444148806,-431608840,1390958107,-529072304,-1864468737,77195278,-1981659511,-92019626,1023768063,343212031,-1947842933,1174661206,-464120862,467551787,703324246,-1946794357,1446639702,956658952,125044294,-2131599733,-1962867633,1175184966,-385649432,1721827579,1746307859,461939475,462034569,-1559607669,1586168478,38243316,-1996204149,1451883078,105286652,-1995942261,1451882054,-330920968,-1947056503,126612062,-1996335221,1451872326,206015442,-1995548789,1451873350,71797718,-461313839,-599357057,17057782,-1410792588,105351936,-1995942005,1451871302,-596181042,334906883,1177286742,-766108720,1183535186,-833188916,332678659,1177278038,-766108720,45633618,244338699,-1996129816,1451874374,-359462,-12778123,-1956547329,1452003398,-666500142,735729171,1444662342,241345486,241440393,-1878362369,23193614,-1947050357,1183386183,1958742986,1354771215,1342898872,-1698007297,65535,185351809,1836515568,185337543,-2031550224,-431584512,-1981262197,1451882054,-227638280,-26875636,-1946794357,1446639702,956658952,125044294,-2131599733,-1962867633,1452014150,-698992132]},{"sector":5,"data":[1178147957,85423572,-763166718,241345280,241440393,401035,-385724417,1183579585,-698971180,-1980348791,1183053910,-689369870,205423102,1912725515,201770760,-352198645,185377042,721435653,7911890,-503844361,-1962210141,-16775650,-310181297,535137026,113921373,-1873273344,-326412987,-2082959842,1721830636,1746307859,-1978255085,2136898587,-2012858106,-1588169189,378215304,1183390602,-94991880,-1961991519,-1995545578,1451881542,108462070,-1946663285,19790422,14320384,244338770,-2130953752,-284487130,185738880,-196703248,-1544137077,378080866,1183518308,-94991368,-1994684253,-350516714,1379335961,184727571,768080,72850000,1996423168,-401698810,-310181877,535137026,46812509,-1873273344,-326412987,-2082959842,-1957296916,-1961942498,1488927,-1962512649,339774448,201082505,-1206749760,726666008,448286912,-6664192,-352321281,-60912878,414726143,448286731,-1382395904,1577058308,-1962742397,1297948645,503317194,1430622296,-1910575989,82609112,958105249,1584663110,-1559607669,381164422,175044352,253894283,1183385347,-2082960388,1946160255,207588103,82524159,1343173816,1343075000,1342190520,317082,-1547687168,413340186,-60912878,-1962784885,-962395049,-938047216,229816336,247248976,3389520,-26032,-310181888,535137026,113921373,-1873273344,-326412987,-2082959842,1448545516,705613216,-1913615388,653786948,243994322,-936702272,-150025567,734538726]},{"sector":6,"data":[722389006,-1995516914,1218573902,734079763,-1995519994,-1012860858,-1947981299,-92894736,-134265715,-1962031066,-129594424,103530795,-768930092,-235417973,-8259445,91423440,-352137032,-1547203838,1218514368,230073107,722386593,722387974,-1995520506,1487010886,-62510317,908849291,-25096508,91424160,-351952712,-1547269374,1486949820,229942035,-310157474,535137026,516640093,1430622296,-1910575989,57057752,1963345465,1711720198,-1577058557,1178143592,-955878138,-16029690,43950591,1963345465,-1643723002,-1577058558,1178147718,-955878138,-14973434,460759551,1963345465,241082654,241174027,1048645493,2147420928,1048774517,1962871550,1980155654,-2080375013,-443874579,-900899553,1478361090,-1957345904,-661774612,44041927,-1070923776,-1560106333,-1532820824,44212994,-1962742397,1297948645,-1873273141,-326412987,-2082959842,2122390252,1954545166,105286416,956847755,208997462,1963607609,-18425,26077593,949891,-2002702219,-1978234110,206977282,92218492,1913275961,42508573,42604171,2131252793,956660948,-847837626,-1962768223,-385709546,-1564999337,242153216,295706251,1183385347,-153580548,1946223687,12249347,-1962260853,19729494,14320384,1183416356,-94991880,-1728020296,1996443730,-126418950,16777114,-163149568,-1962522997,1446578262,-385647348,142606195,1997162041,-9836285,-15829249,1325397622,-196702730,1354771280,502426,172919552,66604587,-229733944]},{"sector":7,"data":[-1946663285,1446640214,2131983368,105265413,1183517814,139889414,-1980217719,1183578710,-94991368,2081183289,956661541,511052358,-1947054337,1065415262,-1962314486,1451952710,10086668,17460867,810627,1854001387,-2097118984,-385811874,1996488558,243172110,-1206815488,-11529822,1996426358,-26102,501940224,-1946394997,939465823,-15960321,244320886,-1962752792,-930349986,51136395,1183666369,-1070903056,-26032,1183383552,-532773906,57933825,1358864105,-15960321,1183648374,1183666410,244338918,-1962793752,1452010054,139868652,2095645566,956857598,57804358,-1946258711,1452010054,49120236,1562371467,707149,1167087646,518818645,-326903666,922703388,1996428114,768006,156932688,2122383360,1954545168,276726553,-1592101632,378208904,1446576778,2131655694,205928709,-4716686,-1427531265,10663937,-1961857289,-1607037992,-1994652911,1207368798,57934084,-1962890775,1451953222,-1988090866,1451882566,8435962,-11513191,1996487286,114399992,1183383552,138841078,956978827,-1300296106,1178142076,-5541108,1996427382,-163119114,1358186125,-1705983957,2368,722226827,-939263922,-2114826615,8452166,16406147,-1962391925,1446578774,2131983610,-129615611,1183517814,173443848,-1980217719,1183578710,-94991368,2131646009,956660892,-1787622330,17581699,939651,-893301,1065415238,-1948551926,1451953222,15198478,-2096072961,1962938494,295876625,242679632]},{"sector":8,"data":[-1710459137,1918,1586175467,476023804,1996437503,209125134,786960016,-60912895,1200343179,1354826508,1357923981,-1705983957,1793,-2081667447,122942,922692212,1996428114,3389446,66755152,1586167808,138841084,956978827,57934423,972998633,-385649657,1877737152,-2081655157,76219590,956454027,209456726,1178142079,-2096795124,-353696058,1418396811,-398030590,-1947576695,1183384644,138841070,956978827,58649174,2097054697,-398051064,2045313910,-293698562,-1960938241,1174662726,263660,1088833161,108461904,-1964614005,1357130247,16777114,-398030080,1592415883,-1962742397,1297948645,503319754,1430622296,-1910575989,82609112,242649942,-1962621309,39095044,2081183289,956661516,91359814,-351877501,239504362,989856773,-1962248762,126553694,-352168053,-96171258,-1946397557,126421086,-1962780791,76219998,-1996335989,39291143,1577337995,-1962742397,1297948645,503319242,1430622296,-1910575989,82609112,175541078,16533191,80118528,-1962522997,1413023830,2081193982,-62637819,1191118199,-1947800580,-2090927034,-443874579,-900899553,50333702,-16130816,50342912,-16594944,50344704,-16704768,50344960,-16212992,50345216,-16182272,50345472,-16223744,50345728,-16248320,50345984,-16497920,14592,0,1167087646,518818645,1183570062,50343180,1996492349,-1816132856,-1532494034,-373282048,244318371,-385763608,244318360,-385834520]},{"sector":9,"data":[244318352,-385705752,-6684536,-385875713,-6684544,-352321281,-401698695,1928004507,-1878362369,49342478,1996450027,108461834,16777114,-10753280,1996425846,142016262,16777114,-11801856,1996425846,142016262,16777114,-12850432,1996425846,-26106,787152896,-16222465,1996424822,-26102,518717440,2752546,3801138,5242946,4784157,5898269,8847463,1900692,28835959,49120000,1562371467,576077,1167087646,518818645,-326903666,459841802,459937419,-1980348791,129562710,922701824,-11398598,1822553718,1846971163,-163173605,-1980213733,1451883078,-1202695428,-1722744833,-1070903214,-1706012592,581,1342177976,16777114,-1338573056,976682763,-126419182,-624897,1996487798,39754490,1048772608,1946159984,45193735,434831360,269027062,-167283455,34605318,244319604,-1593830168,144905060,-401698814,-310180629,535137026,516640093,1430622296,-1910575989,149717976,572427094,-1205892337,787939350,-259322960,-1962786677,1183384656,-94991880,863289867,196097791,1347469355,16777114,302446080,527699723,167528134,16598726,1358710413,196097791,1347469355,-362753,-6621066,1577058559,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-493220116,-1207959550,-1706033150,65535,58048523,-1593784343,378215272,1183390570,-128546314,-1961136991,-1994691050,1451881030,375028,976682832,-126419182,-1946781953,1177285190,-128574474]},{"sector":10,"data":[-1980086647,1347615830,1358954424,726684313,1347440832,16777114,-1338573056,976682763,-126419182,-624897,1996487798,-25862,116785152,1963003913,151451143,91488784,-18346352,1883145214,880082955,269027062,-167283455,34605318,244319604,-72472,-15582666,1996486774,-59310090,-1191545089,726695935,1347440832,-26032,99287040,210586,325361920,-956168029,1270790,-401698816,-310180977,535137026,516640093,1430622296,-1910575989,116163544,16533191,-26112,-6684672,-1996488449,104593990,930353280,242532363,52082768,-26032,-1073020928,-6677387,184549631,-2094631744,133182,28837237,721611520,-62486080,244320747,184671976,-16091968,244382838,-352055320,-26102,-6684672,-2097151745,-443874579,-884122337,1167087646,518818645,-326903666,-1338573010,-26101,1183383552,-61437446,1023821451,1618214913,1946157629,212241,-2143473036,-1872530176,14018574,1048796395,1946157576,1354771285,-59310256,-362753,-1928613834,-1705979322,962,1674739331,921380468,34094723,724530176,-11513664,1996487798,-1338572806,-767128309,-26032,2122514432,309617618,16777114,1975520000,538425353,-26032,-310181888,535137026,46812509,-1873273344,-326412987,-2082959842,38974,113726069,1722,196097791,1358954424,1347469355,983191632,-1593835519,87886910,1024097280,92209160,490906,-1774288640,1954545408,-1774780657]},{"sector":11,"data":[-26112,113704960,2147418262,55328387,-16157681,-1711059914,65535,-1962742397,1297948645,-1873273141,-326412987,-2082959842,1187401452,1183645884,-1070903108,129519696,-6664192,-1996488449,-12731834,721712511,-1954944064,-1767654842,922701824,28838832,-6664192,184549631,-16091712,-6636938,-352321281,178394,-1136226992,-26032,1183383552,1347590584,16777114,-1304000256,-1149976565,88054352,1183383552,-1235842636,-1418411509,381437581,1996444240,-1200160844,351898,-1300824320,353946,8435712,-1300824240,468122,112640,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-950642452,47686,276838143,426906,1975520000,-373282043,-2135424735,-6664192,-1996488449,-1072976314,32047989,-6664191,-1996488449,1451864134,1975651250,15657219,-1334378670,381437581,4372560,-26032,1996423168,-25938,1183645696,-1070903108,-6664112,-1996488449,-12732346,-385649281,-1564999492,-1200687360,295706251,1183385347,-2133292116,-1962802097,1207348318,91488516,-352288584,734014210,-1270445614,-4827511,722186294,-1957670720,-1961942498,1488927,196095735,1895821451,40959748,-4688129,1996469878,-1403089996,1468729227,-1270469886,1387681307,44735056,512425984,529207074,-150989128,-1962168274,309395440,16777114,-1200161024,1353205389,16777114,-1438217984,-955943616,43590,253894283,381165451,-1339099392,-1947170037,1082763846,1883144978]},{"sector":12,"data":[91553803,-352321096,-1983894782,882555462,-1879048185,911374,1589266059,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-1957285652,-1961942498,1488927,196095735,1082912907,72387330,-1982839159,922735190,-6680448,184549631,-1878493760,-44439538,-956258839,16816134,-26112,113704960,152,196097791,1347469355,108954,302446080,376705035,-1961991519,957244438,175493718,1976583737,112645,-1070923029,184682659,-955812416,130118,-1070913301,1996443728,-797507630,196097791,1356088973,236698,-729906432,-1207601821,65732610,-1996487752,1183579206,-767161392,28837236,721611520,112894912,393527307,1342210232,-1705983957,1839,737965823,-6664000,-1711275777,65535,49120094,1562371467,1478413133,-1957345904,-661774612,1462168707,-62470314,28835840,-191213568,184549377,-385649216,922681843,1520044976,-1996488701,1451878982,1975651308,31320323,83610,459841792,459937419,460199481,108989820,460064313,-6683274,-1929379585,-289476994,-1190717943,-1510866939,-1961138015,-1994692074,1451882566,-1338572806,1354771211,134060624,116785152,1947208466,-92372119,2137226240,-125926650,-1956940288,-1961942498,1488927,305802999,1216409739,922681606,1183519290,-94991368,-2097151699,1347551450,437658,241344768,241440395,1979340345,-129615611,1187455092,-16776452,-15582666,1996487286,184727800,-26032,1182990336,1451426538]},{"sector":13,"data":[28836076,922701824,1996427834,-126418950,-1280257,-4658570,1385779455,1354771280,412766288,-1207959551,-1706033150,289,305805055,-1711520117,335037955,1347615318,1347469355,196097791,1183535184,1317771772,-329348118,-635713493,-6663853,-2097151745,749630,-1243020428,-129594624,66737803,1444145734,-1202695444,-1706033151,65535,-1981397367,1048832086,1946157576,1044284173,108331532,205391559,2122514471,913571846,450512582,1357792909,1356547725,1342180024,16777114,-632910592,976682832,-92864750,-1946650881,1452013638,-364510214,1391220243,30382672,1996423168,-428408856,-1542401,-6625674,-1090518785,1988954606,-1190715666,-1510866939,269027062,-167283455,34605318,922686836,1996427834,-126418950,-1280257,-6624650,-2097151745,749630,563742068,-956301308,16915462,-2090902016,-443874579,-900899553,50344194,-16269824,50339584,17086721,50335488,17090049,50336256,-16208896,50340352,17099009,50336512,-16231680,50340864,-16167168,50341376,-16295168,50341888,-16229376,50342144,50666753,50366720,50740993,50366976,50764289,50367232,50521857,50367488,-16195328,50342912,50656513,50367744,50671361,50368000,-16524800,50343424,-16651520,50348544,-16528128,50349568,-16322304,50349824,-16291072,50350080,-16565504,50350336,-16578816,50350592,-16581120,50350848,-16390656,50351104]},{"sector":14,"data":[-16511232,50351360,-16186880,50351616,-16736768,50351872,-16740864,50352128,-16744192,50352384,-16748288,50352640,-16752384,50352896,-16760064,50353152,-16762112,50353408,-16279808,50353664,-16381696,50353920,-16384768,50354176,-16420096,50354432,-16457472,50354688,-16470528,50354944,-16474368,50355200,-16477440,50355456,-16485632,50355712,-16496640,50355968,-16502272,50356224,-16170240,50356480,-16182528,50356736,-16217344,50356992,-16243200,25600,1167087646,518818645,-327034738,922681608,-6681680,-1996488449,1451883078,1958874108,-1170308345,91553798,-352321096,876019537,-26096,-1073020928,244335220,-1996470040,-6621114,-2097151745,1962997886,-125399589,397955326,1637503008,1342177280,1344282296,16777114,-1976107264,-125399802,565727486,-6664192,1023410431,-1401683967,-310132693,535137026,516640093,1430622296,-1910575989,1290568664,572427094,-1205892337,787939350,-259322960,-1962786677,1183384656,-61437446,15877831,138314496,108331010,-385744664,-1070923277,1996443728,-92864516,196097791,1355171469,16777114,-1338573056,-465138933,1183437355,-162100748,-1070903214,374864,32676432,45613056,547442688,1183422734,-1000961598,1704611922,-1996488702,-1072959418,2122522997,141820146,-1695385857,298,15761027,1996425332,38771440,-1070923776,-1962835223,1452014150,-162121220,92034943]},{"sector":15,"data":[1945388601,-260636848,107162,-1136228096,197023369,-1581550398,1344147372,63063691,103529542,1347554848,236992255,170650,-260636928,121242,237019392,-196738663,-1946790383,1452014150,-162121220,92230268,1928611385,-964787381,-385649565,1996423356,41261808,1183383552,-1168733768,443859467,-1984412021,1451876422,-700019230,-6664170,-1996488449,-1072958906,1183539061,-1169814600,1038680949,-260636673,149402,-13440768,196097791,-624897,-1070861194,374864,-26032,1183514624,-1069118992,237019472,-1035599463,-3910127,1996473462,178370,58759760,1183383552,1958743024,-15472381,-1983887733,-370544570,-227082242,-3639553,-6632842,-1207959297,-11534334,-1365577098,-16777214,-1566904202,-16777214,463138934,-956301309,61510,45635819,146296832,1347590400,186778,-230258432,58048523,1358864361,236954,-1270445824,196499081,-385649214,1183579788,-867792400,382092941,1996444240,571572,64526928,1996423168,-25870,62390272,1996443648,-25870,28835840,-310157824,535137026,1439386973,-326898549,-1070901734,-1980873079,45673542,28856320,1347590400,16777114,-230258432,1183432747,-129594886,253894283,381165451,-1339099392,-1947170037,1351287360,-62486268,-939633015,61510,15892099,300483444,-226589951,-16223232,-6622602,721420543,24963520,196097791,-362753,-1070860170,-25755824,-1191414017,-1706033144,65535]},{"sector":16,"data":[-1996266335,1187505734,-1593835286,1178141540,-1961918998,-1082070434,1962935680,-1983673545,1183573574,-398030350,-431584432,-330955879,99505683,-763166718,-1202695680,-1706033150,65535,200427145,-1961986624,1183443014,-8525326,-336967937,-227082318,16777114,-196704000,200693385,-385649214,1487011683,1511426819,-27903741,92015231,1945912889,-431030525,503677112,-330921136,-1946925565,1347614294,-1696172289,65535,-1712961909,300697089,1586228822,-193542932,218154534,32261763,15619715,-991142261,-970525578,1191119360,-330923024,-296320255,56140032,56235659,-1980217719,1996487254,76389106,1183514624,-27882500,2147112505,956660783,678688838,196097791,-362753,-6621066,-167771905,269160966,-672595083,241345022,241440395,-1980217719,-957613482,-1695385857,1604,-1980479863,-1039403434,-1595341963,-260144130,-2096597759,-2096960402,-1962873250,1992617054,12986100,-227082496,435610,112640,-227082416,147354,112640,1575324510,-1873273149,-326412987,-2116514274,721534700,-129594944,-1980348791,-2037777850,-2037514518,726728280,683167936,-6664192,-956301057,-385975162,2122761987,-956045058,133126,-1338573056,-18421,1354771280,-1706012592,65535,276838143,12954,1975520000,-373282043,28836786,647647232,-1996488699,201256070,-952339008,-108410,243967,87923280,-2037841920,-1072955668,-2033770635,6553176,1342177976,16777114]},{"sector":17,"data":[-326727424,1975520254,-96024824,887685121,134661891,-2097151742,133182,-303496331,1379335937,-2071556845,230183166,-6664192,-2147483393,285119630,-27228473,-1098711040,1952710232,15526147,-18041089,1342181048,-26704243,-711307242,1023410181,58523662,-2147294487,33452222,-1098905737,1979842161,-323551448,-401698562,-2037840680,-1072955826,-1058471051,-326727422,246960382,-2037559296,1343684200,16777114,-323551488,-25858,-2037841920,-1769341360,-2037776814,-1031012774,-27490679,-2037792725,-2037776796,-2037711262,-466944400,1347537195,-26442101,-1957670247,-1711378810,513429586,1375731718,-26032,-2037841920,-1769341356,45678166,-11382784,-1694608202,263,201082505,-385649216,-1706032747,1657,-25131383,-24996215,58049035,-16678679,-70474,-108874,1392399542,-25118977,16777114,1975651072,23325052,-18041089,437914,1250330880,1284934142,1975651326,33155331,1253506898,1485213182,-1202710786,-1706033144,365,-18041089,95642,1589051136,124033790,-2037841920,-1769341312,-1039401342,-991362187,1589051137,122919678,-2037841920,-1769341356,-2037514666,-1924071848,1358848646,-26966387,-401698736,-1073020342,-353827979,1988544256,-1962923778,-1946266490,-1979820394,-1979811706,201226902,1913485266,-49915,-2037709193,65797716,-1979711560,-2130811258,-2130814834,196097791,1347469355,-27752819,2668624,229161040,1354771280,16777114,1487306752]}],[{"sector":1,"data":[1187479550,-956290826,63558,-1224791573,-6619412,-1996488449,-1979820922,-108906,-1694569290,329,-25131383,-24996215,58049035,-2097082647,16668350,125260914,-28000637,-2092206592,16668350,141693047,-28000639,108200191,-28014965,-4717589,1116113152,1183238142,-2097151746,133182,-1224779659,-1224737150,-1924071808,1358886534,-29063539,-401698736,-2037841669,-1072955838,1187458165,-2097151494,133182,-1679228043,1488880384,57959422,-16741399,-2120549258,-16777208,479919222,-385875967,-1098710905,1946222148,324182326,-1224790549,-1224737150,-2037514624,1343684342,-29182209,582298,1116113664,1003629566,1979602582,1418083086,-1928825346,-1979808634,-113018,-16011210,1996486774,-158953994,-1224781570,-1464271294,-1224781811,966458950,-1962934265,738083462,1418078674,1452677630,-163184130,33052177,-369196922,-1224737023,82574942,-18041089,269978,-356613376,158597374,-18172161,713882,4430336,1048772608,1946157534,-1338573032,-18421,1354771280,-1706012592,1268,16402119,-96040192,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-11139860,1996426870,138840844,1996443678,110926346,1586167808,141986570,-16777018,179832950,-6664192,-1996488449,-1072956346,28837236,721611520,106859456,-1073018999,1183517044,138816508,-16127168,-6682506,1207959807,49120094,1562371467,707149,1167087646,518818645,-326903666,1988843024]},{"sector":2,"data":[-1996190966,922743366,146278056,1603948544,-1996488695,922742854,179832488,1872384000,-1996488695,922745414,79169192,2140819456,-1996488695,922745926,112723624,-6664192,-1996488449,1183578182,474610,-1628896387,539904,-1763114114,41714432,-2096529920,2113930364,8579331,1342178488,1342254264,-362753,-644155274,-1996488695,2089022534,460652546,294019,79172981,750276608,1996443649,-59310096,670874,-2093421824,2097153148,71600903,65788151,-1727773557,1183535186,1347590644,162947,1149962109,-338102526,38046467,-1706012007,65535,-6664110,-1996488449,2122577478,108265718,16023171,-1070910603,1187470571,-16776206,1962930806,-260636926,-1694730497,2640,-637303,1962930806,-92864764,-1694992641,65535,-336312695,-159973439,166344447,276313855,686746,140413696,1996425097,-63504396,-2009661687,-26096,1586167808,-1207465722,-2090991615,-443874579,-900899553,1478361094,-1957345904,-661774612,-954798973,64582,16402119,-364460288,922681344,26873914,-1996488693,-1072956858,2122526581,141820154,-1694861569,2774,15367811,1996425332,191863530,2122514432,141820156,-1694730497,65535,-1846951893,-92864768,-1710852353,2881,-1032536053,272250623,16777114,-364476160,-1300971509,-1207535873,-1924136946,1343679558,366490,1958742784,-294191203,-1192200449,1347420161,1347469355,16777114,-62486272,-2106277877,1357543167]},{"sector":3,"data":[16777114,1975520000,-9246461,736786175,-11513664,1996484214,-92864528,548950096,13416960,-6664110,-16776961,2006645366,-16777205,-6624650,-1962934017,-310117306,535137026,46812509,16973865,67124,196623,16712767,16973855,66066,16973840,67575,16973841,66656,16973842,67567,16973843,67270,16973844,197885,16973961,198806,16973962,197785,16973965,197903,196750,16714259,196663,16713071,16973880,132574,16973986,133991,16973858,131635,16973987,133876,196653,16711893,196679,16711699,16973896,133937,16973872,131519,16973873,133811,196660,16713904,196685,16713757,196698,16714015,16973915,133832,16973892,133265,16973893,132713,196682,16712508,196709,16711922,196710,16711795,196711,16711767,16973928,133455,196688,16713815,196713,16713239,16973930,133913,196690,16712911,196715,16714341,196716,16714167,196717,16714252,196718,16713975,111,0,0,0,1167087646,518818645,-326903666,1048794630,1963918156,12183811,-150980424,-1962718162,884473816,112656,1354771280,1342242744,-1705983957,79,-150980424,-1962718162,884473816,1354771216,909573968,-6664174,-16776961,-275118474,-1996488704,1451883078]},{"sector":4,"data":[1958874108,3717213,55324407,1992611979,76228346,272271241,55326463,1342177720,46746,3717120,55324407,1343227909,653942468,637958143,1208633227,-26032,922681344,-1070922932,42703440,-1070923776,112720,30120528,1996423168,25074182,951582720,1278146304,-942109949,1063559,-310157824,535137026,80366941,-1873273344,-326412987,-2082959842,-11138836,-6683018,-1996488449,1451883078,1975651324,8579331,653942468,637945739,-1996339413,-1072957370,1048777343,1947140940,1278672737,-26109,1458241536,55328387,-15436529,922683510,-6681680,-1560280833,255656780,-1204063232,787939384,-259325108,-1995946357,-1005570940,-1960379810,310675719,-94452720,71797542,269386889,653942468,-1996339317,-1005578620,-1960379810,-2071394745,1996427284,-26106,-2090991616,-443874579,-900899553,1478361092,-1957345904,-661774612,3717206,55324407,1183570059,881277194,-385649648,1048772848,1963918156,15132931,184685544,-385649216,922681564,28836684,-1751494656,-1962934270,-1073018810,-1997995147,81152,-1947663499,146688,-1897331851,212224,-1914109067,277760,-1964440716,3717120,55324407,-4657013,1347590400,-1727641973,748769362,773229331,545532691,580131600,-1706012144,65535,-6664110,50331903,319824004,-1995431276,-1995432828,1376788116,-26032,951582720,1278146304,-940537085,1052804,143425536,922681872,-6683828,-352321281]},{"sector":5,"data":[112674,-26032,401276928,1342177720,16777114,-1710429440,65535,1689781739,-1250560,721636406,1671057600,721420291,28856512,-426094592,-402653182,-2090991192,-443874579,-900899553,1478361094,-1957345904,-661774612,-150980424,-1962718162,172395480,271877945,-1377238156,1279165184,58003203,-402611223,-1073020680,-1712782475,1278672640,112643,57645648,1183514624,1958742792,81174,37559412,1025668096,829685763,1946158141,-11211968,-1710092746,65535,922700267,-6680050,-352321281,3717182,55324407,-2020878197,103485454,-347074404,3717338,55324407,-2020878197,103485454,-347074404,3717329,55324407,1183570059,310848262,-6664176,-16776961,721636406,-6664000,721420543,28856512,-6664192,-402652929,-310181680,535137026,113921373,-1873273344,-326412987,-2082959842,-2091514644,133182,364391541,-62486272,2114340411,106859278,-60913333,638088900,-1207959354,1344143514,-16091393,1996425334,-25860,-2090991616,-443874579,-900899553,-1957363706,951604972,1278146304,-1012989,-1710213964,65535,272270473,443858955,-150980424,-1962718162,985137112,-1774780656,-26106,-1073020928,-1070922635,951597035,1278146304,-2585853,-15713609,-16347082,-1710846410,65535,-150980424,-1962718162,985137112,-1808335088,-1841889530,-26106,28835840,-443851264,-1957313699,951604972,1278146304,-1012989,-15715148,-1710212428,65535]},{"sector":6,"data":[-150980424,-1962718162,981977048,1577058320,-1017256565,16973848,132128,16973825,132154,16973833,65623,16973842,65726,196627,16712231,196663,16711850,196667,16712283,16973886,132094,196653,16712638,196698,16711966,16973919,196660,16973888,197600,16973890,197724,196676,16712224,196718,16711809,196720,16712535,196721,16712471,196722,16712460,196723,16712312,196724,16712305,196725,16712294,196726,16712254,196727,16711987,196728,16711838,121,0,0,1167087646,518818645,-1957242738,1149961846,16792834,20782194,-1961396479,272434244,1024422400,175570961,333975184,112640,-1070923029,49120094,1562371467,182861,1167087646,518818645,280549518,1721389056,184549376,-1207599680,48955393,-1734098901,1161218,-26032,-1073020928,28837245,721611520,43688896,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-1957296916,882968182,1946433808,-18427,1149985259,-62486268,1023558795,125042944,1946223165,-2082018485,170558,2122517364,-646640132,-343798344,-62485702,1946159421,1025081107,594870280,43531907,-1207602176,535527470,-2130950517,401309900,1946160445,7355891,2034042236,-1197310464,65798140,1593591435,-1962742397,1297948645,503317194,1430622296,-1910575989,82609112,141986646,162945]},{"sector":7,"data":[-1593346815,70848564,-1070922380,-1962835223,-864025532,-62486144,43662979,1024357376,-428048351,2139105341,-45711135,-62485759,1954555965,-385647043,574423316,-385646976,557646057,1026260352,997490700,1971329853,9300227,2122560747,225705990,104858,-59310336,16777114,503760640,-385875966,2122514604,-244056058,16777114,-59310336,16777114,-2082280704,1946158718,503760860,-385875710,1048772744,1946157720,108954385,-385649408,-6619292,-385875713,2122579804,-1250689018,1342177720,1343230392,-1157627976,1347616767,16777114,-2086737152,1946158718,112792,269727824,-18352,-335544390,108954593,-2088602624,170046,28840052,280514560,-4698096,-17665,116835563,1963003913,151451143,393478672,197146367,1342181560,1347469355,-26032,28835840,-1704006912,65535,1040137961,58556451,1040111593,58687525,1040129001,58032166,1040134121,58032167,-369161239,608042684,1025212289,58491169,1040127977,58032173,1040148713,58032174,-369153047,624819868,-385649279,641597152,-385649279,658374388,-385649279,675151568,-385649279,2045378276,-310157570,535137026,80366941,16973838,196687,16973930,197178,327791,16712215,196692,16712061,196674,16712260,196681,16712135,131157,16712218,327764,16712186,327802,16712157,196732,16712165,196731,16712097,131197,16712189,196730]},{"sector":8,"data":[16712069,131198,16712160,124,1167087646,518818645,-326903666,43557140,-939899255,62022,622555297,1183383553,833780,45587024,-1073020928,28837245,721611520,503712192,105286402,1971332925,17099011,434701182,-2145174271,607999348,1030255744,58032165,-385813783,1187447342,-956300814,326726,-1961138015,958097942,1964731926,1812347142,-2096532453,1962998398,17492227,16023171,-118946955,460103936,460199563,-956229143,127558,50087623,-2084181248,138814,599264372,244338817,-385751832,916521430,-2095846638,138814,616039796,-1578701951,103485596,1183387666,-330920464,-26032,1347551232,73114,1779841792,993686811,1964730374,325493044,325588619,459937337,108996476,459802169,1048780662,1946157594,-330920680,459841872,459937419,-2097151699,1347551450,16777114,805750528,-939524337,-15781370,-1811494913,-16777200,1996483702,112880,-92864688,16777114,20506880,32655047,507413248,91488258,-352320584,112643,-369342839,624819974,-385649279,658374450,-385649279,-46268635,-385649153,-29491479,-385649153,132775644,459841793,459937419,2122523371,259260658,-1961136991,756772374,-628948991,-1592923392,378215272,17111914,13796096,-1980348791,2122578006,427032818,-1961677663,957558294,511047766,1979074105,-26087,-1209466880,325492992,325588619,1979209273,-163170043,2122573684,745799922,-1961677663]},{"sector":9,"data":[957558294,276625494,1178142079,-1593216266,378213164,971707182,-493825,1996486262,-25860,703266816,-1961662815,957573142,259848278,1178142079,-2096597258,-2097023378,-16713634,1996486774,-59310090,16777114,-163149568,-2080876919,1946221182,-2091888105,1963064446,-339727612,-62485757,-26032,485163008,-493825,1996486262,-159973384,16777114,-226589952,-2147126016,-31756250,35391175,113704961,65724,-1962742397,1297948645,503317194,1430622296,-1910575989,585925592,-1734257065,-62486270,-1995424095,213447750,-6664192,184549631,-1207599680,48955393,101302315,1183515166,-2144846586,1618950772,1954554173,-2145239779,641546868,-2089716352,138814,-38269836,244338943,-369291800,116786712,1946229616,-58817752,-1591577600,378215276,552278894,35536515,-1207602176,-705953794,460326646,-2082179839,1946221694,459842014,459937419,-1980742007,552333910,1031872813,410451975,781434883,54831103,51905270,49677080,49677140,51905364,-887041,1183707254,1048793326,1946160188,-96039675,1991771115,244338702,-2096781080,1946221694,507413303,812974082,1023821451,58032161,1023452905,58032162,1023469033,1265926182,1971333181,14215427,1971398205,9038083,1971398717,13166851,1023821451,58032417,2114244585,85715203,1971331389,18737411,1971331645,34466051,1971332669,42985731,1971333181,56355075,-2096813079,801854,-1667152012,-96061168]},{"sector":10,"data":[104415103,964562550,-1961662815,957573142,763163222,1178142079,-1960413456,1452011590,77298,1375787651,112720,37591632,1347551232,1357792909,1358579341,-353890672,325492996,325588619,270407225,1877541748,470170111,-385649648,1446641510,-385647118,142606174,2012235321,-11212541,15629955,2122386036,1954554118,-12261117,1350640824,585633424,76999166,-1946919285,-297366729,-523041615,1150021635,1141086468,139727622,-1981135223,748809302,773229331,-329893613,199820157,956858367,57928262,-1946222103,1418397252,-229230328,-202833027,956858366,57929798,-1577129495,378213164,1446581038,-385646862,142409434,1928349241,-19863293,-343858248,507413386,57999362,-956253463,-1978,305805055,459945727,459814655,348058,1346274048,913637123,253894283,381165451,976156416,-1946645742,1183387713,-1948742682,440383,55586551,1755437195,1779862299,139540763,1094255989,-16550906,922744902,922686010,922688362,-6677656,-1962934017,-1961942498,1488927,305802999,1099692171,-431585008,55590531,-1961396993,100923462,1183384400,2092960744,-430011639,121184139,-140900225,-385875962,1586168704,-1205892122,1861681158,-1946645528,-1029503935,-26097,1709768704,-26109,113704960,-61648,254936775,113770495,4244,-1947306241,1066136670,-1309778293,-152841468,1963196993,52488451,518635563,507413251,141819906,33048263,-11081472,1342203064]},{"sector":11,"data":[16777114,805750528,-939524337,-15781370,-1811494913,-16777200,1586228854,-1958769676,78769758,1106699219,74712066,65781803,1343125153,1342177720,-1694730497,321,16547459,-806812811,-293698814,-385649664,1822491334,1846971163,504772891,-385649648,104399542,57937948,-1207783959,-1873772504,-63707122,-16604695,721635894,882528448,-1962934265,931918942,-1309784437,65065732,-58817552,-161975296,18575366,1822493044,1846971163,-1593316581,378215272,1413159786,993817864,930416196,-1961662815,957573142,729548884,1144587647,-14387706,-1961739722,1418397252,77064,1375787651,-26032,116785152,1947208466,-2145011706,-1577316631,378213222,1413026664,958952712,594871876,97408,-828760715,-16777215,-15505354,-1928108490,-1924075962,-1873746874,34334734,-2080465943,1946218110,108953866,57966886,-1207855383,-1706033151,65535,55195391,-1705983957,1859,-101399,721635894,-6664000,-1962934017,931918942,-1309784437,65065732,71601136,105120665,-1995942893,1451876422,460104162,460199563,459937337,108812671,459802169,116806003,1946229616,460104010,460199563,1963480121,105134398,748763509,773229331,-497665773,92024191,1944077881,-58817754,-385649408,1150025216,-754667262,266633448,278660611,242615867,2088962419,58589700,-151133207,1946419780,-2144880572,-401698736,2122577958,57934076,-16701975,-15582666,-14980554,-1709479882]},{"sector":12,"data":[1742,185730806,-385649392,113705226,66200,1350576056,-202895728,-25865,-202833920,321691904,321787531,2095207993,956661572,1031200838,-1961138015,958097942,1964731926,1812347142,-1592560613,378213164,372839214,192224110,460064313,-2019949195,-16777211,-15520202,-1928123338,-1924075962,-1511399866,269197566,1212736554,1944995385,108953863,209027368,1342177720,389530,-22484736,-370260225,1187511588,-385875730,195099932,1222912528,200165001,-385646656,512490764,529207358,78772363,346154963,239155472,-169278595,-296812548,-200727,-15505354,-1928108490,-1202655674,971574902,775356414,741801747,1038936851,-1300987614,1954620221,-2128331284,641586548,-385649279,675151221,-85726847,1343125153,1342177720,-1694730497,1580,205260487,1599995905,-1962742397,1297948645,503317194,1430622296,-1910575989,183272408,35274371,-16026368,1996426358,163027466,1996423168,209125128,-1710590209,221,-1980348791,-6621098,-1593835265,378215272,1446583146,962491660,1500842566,-1961136991,958098966,1299516502,1963607609,440304456,1098121218,-1961662815,957573142,897322070,1178142079,-1959889398,1451952710,77068,1375787651,142016336,-1878624513,-9181170,-1962260853,19729494,14320384,-6664110,-352321281,172395338,-1980348885,922745414,1996427834,-159973384,-11485141,-15520202,-1206703050,-1706033144,65535,-11485141,1183709814,-6663940]},{"sector":13,"data":[50331903,-1996265466,1586232390,302394118,-1677327600,-2096658160,-443874579,-900899553,50337032,50341377,50358784,-16622080,50368768,-16641536,50369024,-16186368,50369280,-16169984,50369536,-16408064,50369792,-16449280,50370048,-16126208,50370304,-16173568,50370560,-16257024,50339584,-16507392,50340352,-16355584,50346752,-16722432,50347264,-16167168,50348544,-16249344,50348800,-16232704,50350336,-16617216,50356736,-16130048,50357504,-16406016,50361344,-16220928,50361600,-16308224,30208,0,1167087646,518818645,1183570062,-268425978,1947205693,536886545,4002164,1024554032,292831232,1085805291,-1207047424,149618736,-352316488,1095683,-1962742397,1297948645,503317194,1430622296,-1910575989,520023000,1430622296,-1910575989,-1561558568,1996445184,-401698810,-2037776486,1048837982,1962935988,109748485,-1264516117,-2114942202,1073874558,113710709,66032,31735427,-385649664,113705196,66020,191905411,-385649664,1048772815,1946157530,12970243,-1705983957,416,1023821451,1601445917,322792575,1028551712,1316233243,-1096715029,-62486272,58048523,1342220265,16777114,-129595136,200955529,-385649214,-11403116,-2037516170,1343684450,-1694730497,65535,-26032,1996423168,-25860,1072365568,-352272223,12755388,-996034581,-1582109952,-1377107770,-352270175,13279656,557687787,1039234080]},{"sector":14,"data":[-663478238,1950351933,1074085265,-2037520524,-11468958,748291702,-2097151997,130622,1016729716,184549379,-16288320,-385917258,-1923742338,1358914182,-10569985,434638480,1589543680,108282111,191891143,-2090991615,-443874579,-900899553,1478361090,-1957345904,-661774612,-955847549,64582,-1705983957,777,805731971,2122516084,443879430,191905411,-385649664,113705159,68464,31080067,-385649664,2122514615,628359178,956738721,276040262,956739233,141822534,956738209,225774150,722106111,244338880,-351959832,176063275,-14846976,-6681994,184549631,-15632960,28838518,1905938432,-956301310,130118,-1705983957,634,-1962248449,1344145478,503477944,108461904,16777114,-96040704,687747,-1398725004,172374278,-1365176204,172374278,-1432287116,172374278,1996426869,112650,-401698736,451609877,16547459,1996426100,1354771210,16777114,112640,-26032,1183514624,49120250,1562371467,445005,1167087646,518818645,113760398,66032,1342177720,16777114,-868318464,259325952,1346373048,-1696067952,-871970819,-2097151744,-443874579,-884122337,1167087646,518818645,-327034738,-11140962,244319862,-1979898392,-2080415098,439358,-1969158795,-1593578746,-259324236,425601,-2095680192,122942,113708917,66016,1342177720,204698,1883144960,1282736139,31080067,725972224,-6664000,-1929379585,1358915718,-1710852353,65535]},{"sector":15,"data":[-10189175,33439363,-1710197760,927,125157387,-10307841,1443075560,-9927027,1656160080,-401698561,113770032,68464,49120094,1562371467,182861,1167087646,518818645,-326903666,205949706,-1946794359,1183386182,138841080,-1946532215,1183385158,-163148292,-2095990109,130622,-6680460,184549631,-1207470656,-397410256,922682162,364381836,1347590400,-15829249,-16001994,-1710501322,65535,-1962742397,1297948645,503319242,1430622296,-1910575989,317490136,-1995326815,1183578694,408844,272455284,1023898625,1551106321,-1070901525,35428944,1187446784,-1929378820,1183445062,-297366034,-94467248,-1070909441,702544,-26032,1996423168,-59310322,384845453,-26032,1191116800,-96041988,-58817790,-1194820090,602603521,687747,1183516276,112501518,334217259,17464963,1996486261,1354771214,16777114,-2082936064,-443874579,-900899553,1478361098,-1957345904,-661774612,-1961563005,100861510,1183390552,28353016,2130200121,-373282043,1183514872,1088475640,-1191557495,1861681161,-31178504,1106923147,67035520,-128545855,-489486415,1183433219,-399048708,1085820937,-6664192,184549631,-2096204352,1963001470,-2012821572,-352059391,-129594444,-523040847,-1578350967,608178170,-163149314,1090143883,1183448612,637172,458764023,-1979833280,922743366,1183519172,-196738068,166200835,1343341731,-1695385857,1331,461649663,65816203,-1559631866,-11527292]},{"sector":16,"data":[-6621578,-956301057,61510,-1995324255,837545542,958093473,461172806,-940679541,2147418695,-1578213749,243997564,-506389672,-1054088751,-1962653815,1204219486,1191182088,-297368592,-129594615,2096121401,458793927,-1543879029,-6680582,-1207959297,-310181887,535137026,46812509,-1873273344,-326412987,-2082959842,1048773868,1962941268,4372505,67156048,98343504,1419968512,1975520027,112645,-1070913045,-26032,3997696,-1206226172,-1202716670,-1706032128,65535,201082505,1356494016,16777114,-2084558080,-443874579,-884122337,1167087646,518818645,-326903666,-950642926,62534,425603,1187448693,-352319752,-129579259,1183514624,-230258184,958093473,1702752838,-150992456,100923502,1183388100,-263796754,1183580159,-163149320,1586180587,71797742,461112875,-62486200,972048011,343407686,972310155,209124422,-1979955573,1183576134,-96040458,-2081011969,-1593184698,1178147672,-1194885898,1861681161,-1947169798,-166607842,1963001408,458793243,2113029689,32153914,1963345465,-96040186,-1961987421,669776454,-150992456,-125044114,298065547,184709515,1443394806,16777114,-1949635840,1183445062,-230227980,1593790953,49120095,1562371467,182861,-2081649835,922682092,-6682998,-1996488703,1996488262,-26108,2122514432,225771774,109721343,1342177720,486810,-1976107264,1354771206,1342305464,1347469355,16777114,109617920,1924674283,726670859,1347440832]},{"sector":17,"data":[1342177720,16777114,1958742784,-29457637,343146497,504066744,-26032,1924661248,-1706025461,65535,33439363,-2084080384,1962999422,-1976107252,1354771206,498586,1575324416,503317186,1430622296,-1910575989,112107992,1946699321,-1449504746,184549383,-15960896,-16339402,-1181088138,-1593835513,1178142380,1343648776,16777114,1958742784,-1405681908,108461830,135066,111845632,1946699321,-1952821226,184549383,-15960896,-16340426,-476445066,-16777209,-16348618,161089142,-2097151993,-443874579,-900899553,50339076,50787841,50358272,50803969,50359552,50809345,50360576,50811905,50360832,17151489,50332928,17090305,50333184,17164545,50333440,-16604928,50370816,-16515584,50371072,-16334592,50371328,-16414976,50371584,17156609,50334976,-16490240,50371840,-16507392,50372096,50475265,50331904,16832769,50336256,16844289,50336512,16840705,50336768,50797825,50334208,-16442368,50342912,-16732160,50348288,50845441,50340352,50785025,50340608,50841345,50343680,-16712192,50354688,50418433,50380800,-16693504,50358272,50578433,50353920,50605569,23552,0,1167087646,518818645,-327034738,-1588198528,-2037837382,101055700,-628717312,-695810307,1183514876,408844,-1259797643,605441,-1729559691,17841409,289213300,-385649407,-1746337348,1354771201,16777114,-727807232]}]],[[{"sector":1,"data":[-729381892,1319174908,-1962440421,-2080582498,50123910,-1995463007,-727807225,254059004,-55048311,726670850,-1924116288,385668742,-561607344,-1202710787,-1706032896,278,-2037858262,-2037842212,-2037514531,-2037776930,-1634992676,1065418204,-2091944704,1789502,-236387467,608076544,57999375,-1929320471,1358880390,458104459,512440319,939462436,-16470552,62393974,230182912,-4698108,-2037559041,1343684318,92826,2110917376,11004163,-385875528,-55050077,-1957683710,519953542,-695825072,-1924131076,385669766,16824400,55417424,-2033844224,-2147418663,16571070,-2037554316,-1924072230,1358745734,1358710413,221338,-830043904,-863582212,-352321284,-561607366,-1224781570,-1224737316,736689360,242679556,1342178232,1342439864,-1924087765,385801862,37460560,-1224802304,-879035184,16777218,-208762,-1946366842,972869254,2096942214,-593589316,-595132419,4161789,166265717,737078271,1958742976,112645,-1070923029,-36004213,-1073018999,1996428661,112654,39492176,726663168,1671057600,-1207959550,-1477902335,176063235,-16157696,-1710111178,928,-1813397461,176063235,-1962511360,-1264382394,37651206,-395051006,-1710590209,65535,-2033721621,64722,1024083595,510918657,1962934845,53340419,1962935101,142508995,-1207601919,48955393,-2037792725,1996487890,243726,67745872,1354771280,-1046851504,-1996488702,1090312326,-1635046283,1065614810,-385649408]},{"sector":2,"data":[1996488565,112654,42834512,726663168,-1751494464,-1962934270,-939664738,-385875961,-1098645675,1946221778,-627143891,4162557,1122567028,242679807,1342177720,16777114,28856320,-6664192,-1962934017,-939664738,-385875705,-6619359,-16776961,62393974,179851264,-1224781820,-2037515048,1343684318,16777114,-561607424,2073710846,-1962934269,-578646544,-796489218,-16454660,-1946365810,-2130915170,1965096831,-561607182,-930706946,167688444,1292368,-26032,-1224802304,548994248,-6664192,-1996488449,201115782,-385649216,-1202716527,-1605367297,-467006978,-26032,-1073020928,-1635025548,130481352,50116608,-2037559266,1343684318,-53049715,-2037559274,1343683802,1342243000,16777114,-628716288,-2037559044,-1924072248,-1705968570,65535,-53174645,958090913,1342600199,250010,-561607424,-660975362,1073741827,-775804007,-897152520,-6663940,-1560280833,1967135566,1309067033,-16777189,-1709487050,65535,-16662551,-369309562,-2037514416,-1957626146,-14987746,-893976777,-25860,-1635057664,-1499333420,38222095,-1706031500,65535,-1694730497,65535,-1037330112,-2037778223,-1705968438,1075,1074767523,113707125,4006,1996464619,-1507947524,-13107441,-1694709066,1109,-53174645,957293729,108266567,85629520,-1224802304,1771764944,1073741828,-775804007,-897152520,-1952820996,-1560281085,1967132452,604423945,-385875953,-1224736939,512490704,939462436]},{"sector":3,"data":[-53823745,245402,13547520,-59310256,-58685811,-59310256,364954,-1706014720,1146,374864,93887056,-2037579776,1343683712,16777114,-1031370496,2113020,37557367,-385649408,414776633,-979742688,-385875964,-1224737491,-742851390,-1706025472,65535,-54229367,-54094199,360038923,1344280760,16777114,-1028194560,83794684,-18284544,1278672892,30972443,1996423168,-1028194546,-561607172,-1957685506,519884934,-996212912,1975520252,-1028194548,84581116,-672595968,-1028194308,-25860,-1635057664,-2038170412,-16581420,86678071,-1635057664,-2038170412,-16581420,87398967,-1635057664,939523284,225690,268879616,-352321534,-727807195,-729381892,126550780,-1961144669,-2080582498,50123910,-1499265141,-727807217,-1559786500,1996427044,1354771214,16777114,-61609728,49120094,1562371467,707149,-2081649835,-11140372,1996424822,108461832,378266,-1706014720,1463,-21434229,330846217,-90550272,-1207959550,1448086015,705298080,-879079196,-1962934267,74907632,74907478,95130,-6664192,1442840831,1343266488,16777114,1958742784,-1978799340,1357130244,16777114,1174702080,1962949760,-443851026,403096157,-452984064,-1996423419,436273920,117440772,1224737536,-1711210752,1828717312,-1660879099,-637533440,-1627324668,889193216,-1610547455,570426112,-1593770237,-1493171456,-1576993019,-1493171456,-1560215806,-721419520,-1543438587,1879048960,738262788]},{"sector":4,"data":[-1627389184,771817220,134218496,939589380,-1023343872,570426113,-1342110976,838861060,-1946090752,973078784,587203328,1526791940,-134151424,1191183105,117441280,1862336259,-2063531264,1593835780,-838794496,1610612996,-1174338816,1526727425,-402652416,-2113863933,-385809664,1694499584,0,0,1167087646,518818645,-326903666,1183536722,408844,-924253323,605440,-1394015371,1064192,803799925,17841410,289213300,-385649407,-1545011000,1354771200,218522,572427008,-1205892337,787939350,-259321286,-1995161461,-1072956858,115934069,-1948742910,-330921721,83642055,-329348352,1183385483,1975520234,32237827,-1980742003,1183706694,1996443886,1354771434,1342180024,247962,242679552,-1912834305,1343680582,163994,242679552,100419211,-1957691380,1200286814,1007100930,-1207601917,48955393,-1705983957,658,82593411,-335788289,176063388,-16157696,-1710111178,65535,401195051,176063234,-1962511360,-1264382394,37651206,-395051006,-1710590209,65535,1183571691,77066,1996495421,-1816132653,-1079509202,-1236890366,1354771280,1342184120,16777114,-431584000,-944486775,326726,268205699,-1763114114,-1371108096,242679632,-1694730497,65535,158711819,191891143,317259776,-1367440639,-2096728833,1962978942,-62456059,1183697643,-1337554506,-1951375733,-1304000249,477413387,1957578297,-1371129372,-1957482125,263619,-1270445232,-1705983189,65535]},{"sector":5,"data":[-1951375733,126463558,-1961986305,201718854,-1466281984,184549378,-1341492032,-2096567545,-352014266,738504883,-1962466300,1334489182,-119439358,1200144650,-1198331134,-11534302,722614838,1347440832,-18352,1347590480,726684313,-6664000,-1962934017,-1961942498,1488927,305802999,1082912907,-96040684,611696651,1342184120,16777114,-96040704,-1958382528,-1961942498,1488927,305802999,1183576203,339773946,1354122893,-369013,1751095,-26032,512425984,529207074,-150989128,-1961739730,105414896,-1643723006,-1694499070,65535,722368255,-6664000,-1207959297,-1880555519,-62470400,2122514436,-276885508,-15829249,-558302090,-1706025472,912,-1961986305,201718854,-1070903296,45718096,1191116800,-2888708,1996426870,242679562,-1710590209,65535,91602955,-352321096,1354771202,16777114,296020736,1761761281,-603923454,-603923456,-603923456,-603923456,-603923456,-603923456,-1694328064,-1694328062,-1694328062,-1694328062,-1694328062,-1694328062,-9705214,49120094,1562371467,707149,1167087646,518818645,-326903666,-1957275850,-1961942498,1488927,305802999,1099692171,-263812852,-1980610931,1183575622,408844,1206453109,605441,736691061,17841409,289213300,-385649407,719913295,1354771201,16777114,-260144384,-1207601920,99290932,-1947181429,-2081387769,1962870396,108330795,1357792909,16777114,-956790016,-16715197,62393974,1183666176,-1706027278]},{"sector":6,"data":[937,-1980610931,300674630,-1207011585,-1202716669,1344143583,252314,242679552,1342178232,16777114,-297366272,208994128,-1202667477,-1706033142,65535,-1207011585,-1924136956,1343681094,16777114,-230257408,-1913764215,-1957630394,1143669828,205794062,1354771280,1342180024,271258,242679552,1342178744,384976525,70556240,1183645696,-297367054,1357792909,721974527,179851456,1419399168,-16777212,112725622,1183666176,-1706027278,1125,-1980610931,1183706694,1149980910,172239618,1342719019,-1202667477,-1706033142,141,-1207011585,-1924136953,1343681094,40346,20310272,687747,922683764,-660991546,721420288,55830976,687747,1183516276,112501518,33701507,-1543168,-124122506,-352321536,172395486,1946157373,146698,401146741,-1915950333,-11477946,62393974,28856320,-4698112,28856447,179851264,-6664160,184549631,-955681344,749574,12970240,48905859,-1589873664,1183387654,1354771426,722417825,722470406,1342827014,333466,-465139456,-1995407711,-1070864826,255238480,276694571,167511595,-26032,1183383552,722398184,-398030400,-1981397367,1183441990,-532232222,2122514432,1954350304,-773816693,-767324697,242679632,98584203,-1706033148,65535,58048523,-1946190615,-405675906,1166802179,460242,2111980859,242679614,-1935617,1996481654,-394854426,16777114,242679552,98584203,-1706033148,1647,-1961986305]},{"sector":7,"data":[67493958,-2053484544,1342177286,428954,112640,-16634647,-2031361978,15761027,867711349,379211776,-1996488697,1967190086,33614083,1343173816,-1024373,3389495,37132880,512425984,529207074,-150989128,-1961739730,-263812104,-1962131063,931917918,-1982708083,1150020166,47197444,-1948367223,-1607663036,-632911611,-1947574645,-330921721,2145273403,-364477639,-362902782,1174472587,-565802004,2146190905,-364477659,-362902782,1183385483,-632931348,1182995583,1586168554,17271786,1183575110,-330941990,230179966,-6664160,-956301057,749574,242679552,736773771,3016133,67500241,-1248178176,-16777213,1183518326,96807914,-120520658,1342178309,16777114,-6664192,-385875713,1150025193,-599377658,1149972341,-767149812,1149970293,-767153404,1003767339,427101764,956843147,292935238,721568907,1177278022,172243928,-68615307,1751040,976682832,1354771218,-1202696112,-1722744833,1385779282,1354771280,124826,-262239488,1149974411,-599377658,-1947663499,572427008,1488911,305802999,-661975157,2139871491,1979648784,2144311,34183760,-125108224,-1710721728,65535,-1946256663,38258461,495648778,67527,211885451,236358407,105351431,-1962387575,931917918,-1982052725,1187448388,-1962934064,-1995994339,93048390,-1996487675,317442630,-1949671797,1191173190,-16283172,1183043654,1183516362,-800704050,113763964,-65100,-1962654581,1284100686,734079756]},{"sector":8,"data":[1149883462,38046478,-1982443893,-1054144436,-1982314965,113707588,-58490,152730,572427008,-1205892337,787939350,-125103558,33966464,-1207011585,-1706033151,607,1593691881,49120095,1562371467,420137549,1023410944,-1711210752,-872414464,-1660879097,-117439744,-1644101885,1996489472,-1627324668,-452984064,604045062,-2013265152,-1526661371,2030043904,-1509884157,536871680,637599495,-1392508160,-1493106937,1073742592,-1476329727,2030043904,-1459552507,1275069184,-1442775291,-117439744,-1425998076,-1946156288,738262785,-889191680,-1409220860,1392509696,771817222,-1660878080,369099525,-771751168,939589381,486540032,956366593,-1761541376,1191183108,-1761541376,1526727429,167838464,1543504644,-1073675520,1627390720,-1560214784,1644167937,-1224736000,-2113863931,0,0,1167087646,518818645,-326903666,1183667822,-129594916,-1705983957,65535,58048523,-1929298967,-1705994682,65535,-1961136991,-1994691050,1451874374,1745783770,1780386587,-229734117,737435273,-1982653503,1451883078,321692156,321787531,2094683705,956661579,1148639302,1342177976,305805055,-755969,1996485238,-92864516,1358954424,-1957670247,1452014150,142844,1375787651,1354771280,52634,976682752,775356178,741801747,-26093,703266816,1342177976,305805055,-755969,1996485238,-92864516,1358954424,-11513191,1996487798,1354771450,16777114,-230257920,-1544268149,378084200,1183521642]},{"sector":9,"data":[-631862312,-1994691421,-954503658,37446,43155075,1586191231,-1948003950,9111158,1089881737,1183529076,1958742930,81164,37564788,-348949504,-1807300859,1183645697,1183666422,45633697,-6664192,-1979711233,1183355974,-1605988960,-26032,1191116800,-944903278,234566,1187501291,-352320876,-1773761075,112720,-26032,-2090991616,-443874579,-900899553,1478361090,-1957345904,-661774612,-955978621,167771206,1358710413,-16222465,179832438,-6664192,-1577058049,-310179330,535137026,80366941,-1873273344,-326412987,-2082959842,-1957291284,104664134,-385649408,154992785,1031304192,57999376,1023493353,175374608,1963004221,9758979,-1070894869,-26032,1183645696,-6663960,-956301057,58950,-150993992,-259266962,2088826115,544538864,-1149697,-1878860746,-10033138,-1961986305,50718278,-4698112,-1706025463,65535,-2082060545,2080630398,242679751,1342178232,16777114,112640,-2097093655,1946159742,-969474295,-26095,-1070923776,-2097098775,1946159742,239504134,-2096712541,131646,1996482676,-26102,-555024384,1024083595,175374337,1962934845,9693443,-1028076309,1996443663,243726,1354771280,-1995488607,-1202652602,-1202716654,-1706024949,724,141934603,191891143,-1981087744,264388227,-955812353,64582,-1029633813,-1982269681,-994509754,1996443663,309262,-59310256,-1191545089,-1202716654,-1706024949,758,-1066090485,1343211192]},{"sector":10,"data":[-1207011585,726663173,1996443840,1227002,537638992,-26032,-1073020928,-1028088204,244338703,-198168,28839542,-6664192,-385875713,-2090926313,-443874579,-900899553,50335754,-16656896,50371072,-16576768,50371840,-16676096,50372096,-16630272,50372352,-16740096,50340864,-16635648,50373888,-16735744,50341632,-16771072,50341888,-16700672,50342912,-16608256,50375936,-16654592,50376192,-16688640,50376448,-16696832,50376704,-16766976,50376960,50486785,50349824,50467841,23552,0,0,0,1167087646,518818645,-326903666,-129594104,-15615325,-1207530442,1385758725,-1976107184,943128326,909573907,-26093,-12779520,1025078527,494206977,16777114,976682752,112658,-26032,166395904,1346372280,16777114,49120000,1562371467,1478413133,-1957345904,-661774612,1444080771,-1995326815,1077999174,-1577302391,67441082,-96040704,1024214667,57999366,1023475433,57999369,1023468265,192151824,1963004221,17230083,-16719383,179834486,-491237376,-1706025472,65535,34225795,-1959693312,130545246,1996423175,571406,-1707671728,112653,15112784,1996423168,636942,2050424656,112667,-26032,132841472,-940155253,-956299769,522310,48905859,-14453760,-1207523274,-1202716664,-1924136958,1343682630,1347469355,16777114,1958742784,112645,-1070923029,-1980080501,1958742791,242679575]},{"sector":11,"data":[1342180280,-1577296245,126419446,23501392,367722496,-1207011585,-1706033141,65535,1354771280,16777114,242679552,-631157,112695,46176848,-1070923776,-26032,-2065104896,176063232,-16157696,-1710111178,65535,-1544962005,176063233,-1962511360,-1264382394,37651206,-395051006,-1710590209,65535,1183571691,77066,1996491325,-1816132653,329776942,-161576189,1963409283,112645,-1070923029,200558217,-1923844928,-11472826,146280054,28856320,-4698112,28856447,179851264,463097888,184549378,-955484736,749574,112640,-1929302551,-11473338,163057270,28856320,-4698112,28856447,179851264,-6664160,184549631,-1915718464,-11472314,179834486,28856320,-4698112,28856447,179851264,-1070903264,-6664112,184549631,-1951894336,1065613918,-1962445824,126614622,-1070923029,-1962805597,178517062,1958742786,-263812340,-1962042717,2057563718,-230257893,-16642909,1996426870,-26102,1894318080,142508543,57934592,-69143,246941302,-1070903296,-1706012592,65535,58049035,-1946202391,931919454,1963458179,-12457725,1443788543,-1705983957,725,-1961986305,129562206,1342671104,1342177720,190618,-14817024,-1961986305,939521630,-1705983957,65535,-1961986305,1183577694,-2692342,1996426870,-60912886,1962950531,112645,-1070923029,-1979949429,-1178539257,-2080212223,-2080275455,-603792383,-1996322558,-150895614,-20059902,49120094]},{"sector":12,"data":[1562371467,707149,1167087646,518818645,-326903666,2122536482,376700940,-1962476383,-1996030442,1451882054,117481976,117577355,77665515,102140679,-163149561,-1577560439,378210056,1183385354,-61437446,469124651,-770967466,32047997,1023966978,58130434,-956172311,62022,15222471,-364460288,922681344,-6680006,-1996488449,1451879494,976682990,-126419182,-1695123713,65535,-1593155957,126422456,1979711293,173968135,67527,305805055,-493825,-6621578,-167771905,134943238,1586169205,-1593311478,103484862,-11530234,-15697866,-1710626250,1054,-2081143159,1946160254,230990103,276694571,-2009661616,-63504624,89561609,48955392,1183432747,375024,-1310308727,1356911363,16777114,140413696,1967130505,140413708,1991,1441382443,-93420799,-60914942,-96040192,972838539,58652758,2080424937,-163170040,-1175911566,976682752,-126419182,-624897,1996483190,-327745554,1342177720,16777114,-264338688,-1200291839,971392651,494727750,-16228725,-431586505,-431584507,-523041871,1354771280,16777114,1958742784,140413843,931864459,-899445,78770758,-268181293,-1946794357,76150870,-1962781559,1149889094,-196703484,57148931,-1962523511,100922438,1149829996,-263812342,-1962392439,100921414,1149830004,1681818380,108920835,-1980610933,1487005766,1511426819,-163149565,-1577560439,1183384412,57975274,-370129407,2122579759,1416953868,15236739]},{"sector":13,"data":[1586187902,-1960867064,-398030025,-523041615,50335789,231121392,276694571,-2009661616,-63504624,-26103,1143668736,-498693876,-1981266293,317447750,31606411,1183516740,205783522,-2082582785,2122518766,-394329890,-1962516853,126478406,1586173419,-16267510,140413951,1991,-955883893,-1207959545,-2090991615,-443874579,-900899553,50337800,50503681,50360064,-16683520,50371072,-16612864,50371840,-16678912,50372352,-16523520,50339584,-16651520,50375680,-16756480,50343424,-16532480,50377216,-16628992,50377472,-16759296,50377728,-16762624,50377984,-16766464,50378240,33625345,50341376,50418945,50340352,-16537856,50350080,-16481024,50357504,50438145,50349824,-16515072,50359296,50416641,50354944,50376705,50355200,50385409,50355712,50413057,50356480,-16501504,50364928,-16470784,33536,1167087646,518818645,-326903666,-230257394,-15615325,-1207530442,1385758727,-1976107184,-1640562938,-1674117359,-26095,-12779520,-385649153,20775066,-385649664,1587151003,-2097151998,127038,-1930886284,-130120960,980680705,1343973560,1358186125,1342180024,16777114,2799616,976682832,1354771218,976682832,-26094,1347551232,1358954424,-1722789223,-1070903214,-26032,922681344,-1070919110,-26032,1048772608,1946157560,238977848,829685762,16777114,33200640,1996423168,-193527818,-362753,379254902]},{"sector":14,"data":[-956301310,16915462,-26112,166395904,1346372280,153498,49120000,1562371467,1478413133,-1957345904,-661774612,-1593512829,1183388090,205949948,1946158653,605510,272445044,1023898625,1416888593,-1070910997,-26032,1996423168,243726,-60912816,-1996359519,-6664185,-1207959297,2095775745,687747,922683764,1301942726,721420291,-2090210368,1946159742,239504134,-2096712541,131646,1996482932,64330250,-538247168,1024083595,208928769,1946157629,212246,-873783692,-1207011585,-1706033149,65535,-16648029,1996426870,-26102,-1679097856,-1207011585,-1957691389,1065614430,-1207601920,48955393,1586217003,-8918532,-1962742397,1297948645,503319242,1430622296,-1910575989,149717976,297443670,-506231,-1961739722,73370584,-472709967,881586315,9122955,-1996337013,1451883078,-1202695428,1385758721,1347590480,227994,-26112,1996423168,-92864516,-231681,96008822,697978880,1375731715,53516880,1996423168,-92864516,211866,-264338688,141819905,34473671,1223360513,109852415,-1728050760,922701906,922683018,922685630,-6680388,1073742079,330828661,-6664160,-352321281,-25905,-6684672,-2097151745,127038,1586216565,176129016,-1207601920,48955393,-2090942421,-443874579,-884122337,1167087646,518818645,-326903666,-1957275894,-1961772490,104664134,-385649408,154992920,-385649408,272433297,-385649408,272433448,1026716673,57934097]},{"sector":15,"data":[-1962862871,20777542,-385649408,37552405,-385649408,87884040,1023898624,410255366,2088984043,192217348,197018,112640,-16674071,317391948,956449931,125109316,16777114,-13047040,1552614468,-754667260,-1958966301,-1962833091,1183384145,-61437446,1347571794,1342178744,16777114,-1706012160,952,-231681,-6620554,-2097151745,1962936958,9562371,298202879,16777114,8775936,-1705983957,65535,305805055,-1325245301,-1948003580,-12743876,838795889,-1728052808,1385779282,-26032,1552613376,-1205892346,1828126726,-1946645752,1452014150,67068,-1996434813,1367934529,73173768,-472709967,1032535179,1368064395,-96040702,1392268937,-1706012080,65535,2122547691,108265482,-1559345525,1048774324,1946157570,175570696,16777114,-373282048,1153892519,-16776950,-1207530954,-1706033151,1027,722368255,1234849984,-16777210,721848886,1050300608,-956301306,439302,-969474304,99850769,2088960000,-2123038710,956449931,58000452,-956336407,-15927738,-1961739722,78709852,1015800787,25902475,-2097000053,1367539969,1183383554,-61437446,-6664110,-16776961,-15582666,1996487798,-163148294,112720,1354771280,-1961129823,958106134,57998422,973004265,57997894,-1191258647,-773256446,-2090901762,-443874579,-900899553,1478361098,-1957345904,-661774612,-1593512829,1183388090,976683004,105286418,84432523,-763166719,-1202695680,1385758721,1347590480]},{"sector":16,"data":[361626,11442688,1996423168,108461832,-1962522997,17107030,13796096,-1785049006,-16777211,1996425334,35756550,1048772608,1946157552,235325193,-385875710,922681513,179832460,1347590400,109721343,324810495,324679423,150426,192233472,1344279480,54682,-1697715456,611,16282,-264338688,-1116405759,-2080612725,1962936959,209683288,-14584832,-15582666,1996425334,112646,-1202695527,726695935,1347440832,-26032,837484544,305805055,-1962522997,17107030,13796096,28856402,1347590400,-1706012007,501,-16222465,1996424822,108461832,49050,-60912896,688003,28837237,721611520,49120192,1562371467,313933,1167087646,518818645,-326903666,297443588,-1946401143,104664134,1026388992,343146505,1946161213,17841492,-2014772363,17906944,267072372,687747,922683764,1687818694,721420294,8776128,687747,1183516276,112501518,33701507,-1543168,1520044662,-352321535,172395486,1946157373,146764,71108468,-347311104,-60912694,17450951,-1976107264,112646,106273360,1996423168,1354771214,16777114,-1976107264,1354771206,16777114,-1274624256,-16777210,-1710111178,315,-352321096,-60912876,804807,-1950422272,1204288606,-352321268,49120180,1562371467,470469197,251659008,-1845428478,-369097984,-1744765180,301990656,-1711210751,-1979710720,-1660879103,-1056963840,503381764,301990656,-1627324668,1325400832]},{"sector":17,"data":[520158980,671089408,-1560215803,-1979710720,604045056,-905968896,637599488,1627390720,738262784,553648896,771817221,-1778384128,-1275003136,754975488,-1258225915,704643840,-1241448704,-385875200,-1224671486,-1459617024,-1207894272,-973077760,1107361540,-335478016,570426115,1979712256,1208024832,1644167936,1275133701,-553647360,1644232452,318833408,1191183110,1476395776,1761672963,352387840,1459618565,-150928640,1476395779,654377728,1627390721,2080441088,1644167937,0,1167087646,518818645,1996478606,142016266,721843967,-4697920,28856447,179851264,-1070903264,244338768,-2097092120,-443874579,-900899553,1478361094,-1957345904,-661774612,-15567105,1996427382,209125134,-16091393,1996425334,1354771206,-401698736,-310181706,535137026,248139101,-1873273344,-326412987,-2585058,1996425846,108461832,-1202667477,-1202683905,-1202716671,-1202708468,-11534335,-1878860746,8185870,-1962742397,1297948645,503318218,1430622296,-1910575989,175570904,-16222465,-1070922122,2147465296,1226832,537704528,112720,-600375472,-401698814,-310181822,535137026,113921373,-1873273344,-326412987,-2585058,1996427894,242679568,-15960321,1996425846,108461832,1342177720,47986431,199757456,49120000,1562371467,969293,1167087646,518818645,-326903666,1187468854,-956301102,120390,-15436033,1183650422,-1202710821,-1706033121,65535,-153467256,1946291270,1975519761,375294733]}],[{"sector":1,"data":[-63545,-385875272,1183646132,-733574693,34359030,1190540148,762581004,30426823,-732001536,1946173312,-733544691,1948270464,-800667664,2122514432,225771984,-954835317,-1191182585,1978204176,-616133375,-1965799799,-466953658,1183576203,-1983511596,2122579014,309592072,-1927907585,1448139590,-1710852353,65535,1996428267,-733573866,-59310256,1355957901,-1914171760,-666466047,556675,-1645673612,205977088,-385649400,45613204,375294720,126431223,-150994248,1183387758,178192,-1995542793,2122518086,1920270552,972834443,1786041414,-2133565813,1651846719,-1949022465,1183437894,-96039430,-59310256,-437776752,1958742784,-666450169,1122697217,972834443,745854022,-2133565813,611661119,-1915468033,-11479994,244382838,184597480,-1961790272,134157918,30951111,-700004608,250281992,970213003,108460614,-1980086645,2122568774,443810008,13794947,1586173045,959941398,176099446,2081322553,-700019963,2122542315,74711256,149667883,735331979,2426309,-942913911,2147469894,556675,196609396,-1207702752,1183391752,-662797362,-1962511360,1183386182,343343054,-1206749441,726664193,1451970752,-867791926,-6664110,-16776961,1996428406,-26094,-1706033152,65535,-1697745153,65535,-2090942421,-443874579,-900899553,1478361106,-1957345904,-661774612,-1962480509,126552158,-1946401143,1178142278,-1960741892,126549086,1023035016,1006924848,-16419552,-471073722,-1962385781]},{"sector":2,"data":[126483526,65781803,-2097151560,-443874579,-900899553,1478361092,-1957345904,-661774612,-1961956221,126552670,-940161399,62022,16402119,-196688128,1187446784,-1962934020,130483806,-1830223872,106859264,1946173315,9496835,956843659,57865798,-1962899991,126547550,1183441962,2113016,1191118197,-1956058122,-1072956346,20778100,1025274880,829685762,2122536427,141897208,32655047,-163119360,33310407,-12522752,161151094,184549380,-955812672,195654,1187458539,-352321036,-126419162,16777114,1958742784,702701,66744055,808319046,-96040704,-1703034869,-955883893,-2097151737,1962996862,-10098429,-1962254709,126481990,15892099,1183516532,-338102278,-96040189,-1995678069,-193035513,-1207601920,48955393,-310132693,535137026,147475805,-1873273344,-326412987,-2585058,-1710838730,1169,208977931,111949567,-1710852353,1185,112080639,305818,1958742784,-1372127476,108461830,309914,-1439236352,-26106,-1073020928,922684532,1996424874,-26106,-310181888,535137026,46812509,-1873273344,-326412987,-2082959842,1187448556,-956301060,2147482182,-16222465,28837494,-1070903292,2147465808,-275099566,-2097151998,-443874579,-900899553,1478361092,-1957345904,-661774612,1024214667,829685766,1946159421,17841433,289212276,-348163071,1354771228,1021841040,112895,2122536171,158597130,298202879,388762,-339727616,176063297,-1962511360,-1264382394]},{"sector":3,"data":[37651206,-378273790,-1710590209,65535,1183571947,81162,37602162,1024095744,-1183711226,1996490557,242679732,-1878362369,4122638,-310138901,535137026,181030237,-1873273344,-326412987,-1697083874,65535,-15698177,1996426870,175570700,-16222465,-6683018,-2097151745,-443874579,-900899553,1478361100,-1957345904,-661774612,-15799165,1996425334,-26106,28835840,244338688,-939620632,439302,1278672640,-26085,-310181888,535137026,80366941,196622,16713021,196767,16713116,196771,16712456,16973870,197376,196630,16712128,196793,16712687,16974010,197768,16973858,197752,16973871,197980,16973895,198067,16973911,198102,16973912,197370,16973915,196924,16973917,197875,101,1167087646,518818645,-326903666,-1202301098,1861681208,-2114417910,-1995437881,1166791294,-632911566,-1995815541,1166795334,-733574906,14698183,-398014976,2118025984,92012547,-352321096,-1983894782,1187511366,-1962934042,931870301,-1324857717,65065732,459710960,1963476537,-1878604020,-956301310,-16608762,57188863,-1324358528,-1948200188,-511638964,-1056243697,-1593686903,1149829996,55746826,55842443,-1996077943,1183385684,-564753956,-1962714975,-1996269034,1451882566,-599380998,-1593555831,1149830004,-330921716,-2013047136,1183514948,-94991368,1977505337,-599377655,-5241739,1621099499,-2147186685,-1962868148]},{"sector":4,"data":[-81526204,57675403,123265,-506338863,1149878539,-1946344446,-2130484722,-788528671,-1983837215,2122515012,141885448,-1949147509,65736263,-1979825013,1174656582,239372780,56376963,-1207602176,48955393,19251243,-834238208,604128395,-833188873,-489487439,1149878795,-830569726,-2096598016,-2097022906,-2097087914,-16554434,1996431221,1354771418,-2722049,1996477558,-1707671572,-1741226234,37526022,703135744,-129594617,972707467,141942358,1977370169,9103619,185730806,-385649649,512426112,529207074,-150989128,-1962711506,276333552,-1586793472,104405878,645202790,-1962213727,957022230,444594774,1178142076,-1592559624,378211934,1446579808,2082373626,-129615611,922687351,1183515494,-94991368,-2097151699,1347551450,16777114,241082624,241178251,2145277497,956660761,309845062,57687680,-2096663552,218686,1187382389,1048624104,1962935152,108954374,-14650368,-1070867850,-696844464,278673151,-1280257,-16344522,-1710843850,763,-1710877463,65535,111296131,-1709607680,65535,735737599,1996443840,-733574186,278660651,-16848560,956736673,142595142,956737185,1518267462,111427203,-2096663296,435774,922686324,922683042,-828764776,1342177282,16777114,-733574400,1342612643,-1544796533,-1202714970,1347420161,1347469355,16777114,-834238208,175489035,-1499217877,111452934,922716651,1996424866,-25906,922681344,922683042,-1070919524,-730398896]},{"sector":5,"data":[971798271,1946590214,110665993,110761611,1656227563,16759296,-6664110,-2147483393,221758,1587610996,-1593578749,1183384420,-65106958,-1995994353,1755437126,-498717949,278660611,-196703936,16547459,-1070922636,1923154923,-163149565,15353543,-230257920,2095728185,40691971,-1965531509,-467007417,-1983101303,1200286278,-364510967,972179083,58649158,-1947580791,1177283142,-901346868,1187510411,-1962934032,-422458250,58902145,28116203,-947130298,2143292239,-260144139,-385646848,1183515019,92276172,-3914103,-16554442,-1070868362,-26032,1586167808,71825368,393543424,-1325119605,1021891336,-1593478272,166398438,-150346079,721611736,-330396736,237750315,237699962,1317604954,-1573453842,-159973626,1342177720,279962,-1035548928,501809152,1879504641,1979645955,8579331,63719051,145869382,244048083,-511704222,1992375040,56860781,-259267542,63719051,-125058490,1517813307,-1983756661,-29639098,922689909,1191118498,-159973386,1342177720,317594,-901346560,-1983756757,1183563846,-1609831478,-467008669,-1983101397,1183432774,-1065448510,15746759,-864646400,-776047101,-2100919834,1338477315,259964939,-263847507,1183577067,-1069119030,-2084419959,2113978494,-1000436898,-467007606,1962934589,8710403,1946158397,605567,1586185589,-1948003892,17007239,2122576966,561250556,956530337,427609158,111294207,-1996262751,-1202653626,-1706033151,65535,16533191]},{"sector":6,"data":[-866219264,-2020875311,1177092994,-1001979920,-4174081,-16342474,1996485750,-1002009618,1996443678,93100736,1183514624,-196738576,29378187,1183564870,-1035585078,-655817859,-666467330,-32118518,-136814965,1073742407,1586217332,20938948,116795509,1963003913,151451143,443810320,1342832568,242759423,-1202667477,-1202716664,-1706032897,65535,-4714005,146296841,-4698112,-6664192,-1577058049,922683902,1996424866,-294191116,503971768,167682128,-1705974742,65535,-775135605,-2105046045,-263837437,-3383669,-472789946,58886027,-768511,1325384774,-19142208,263063239,1252065280,172374275,-907476108,-765555967,704989066,-1341768732,-385649397,1048773048,1946157894,28240131,-1961136991,958098966,58646102,2080481257,-599377656,-1779891338,459841793,459937419,2113558073,25618691,1178142847,-385649672,1755382140,1779862299,-564774629,92219004,1927038521,460103967,460199563,2147112505,956660755,209188934,-1996265311,1822536774,9890051,-1961138015,958097942,679475798,1178142076,-1591642120,378215276,1446583150,-385649414,1178140968,-385649416,1048772896,1962934810,18278659,-2197761,922737782,922688362,-6677656,-1996488449,1451863622,-92864592,-493825,-14979530,-1709478858,65535,-1985329527,1183558742,-599381074,-1438217392,1353598507,1353991821,-286781808,-263812863,65173131,-1962709962,-133974914,75431483,49006219,1183434635,-1267299406]},{"sector":7,"data":[199390763,-1962639626,721611718,-1677327424,-465139440,968115851,897495622,971130507,92189766,-340506997,-498693373,2125612601,-498693351,2125743673,-1270445307,1183515627,-1949791262,-1054100922,-1070923029,-337623415,460104029,460199563,459937337,104419445,1249188712,1979340345,-129615611,28837236,721611520,436614080,-952929278,964614,58237184,-1961748829,1174656582,196912108,-1545320821,113707954,67254,971130507,92058694,-352321096,-1983894782,922740294,-1070922078,922701904,1996427420,-1677313556,-1593215994,378209944,116065946,-1174379848,1347551487,94874,-528579840,-15305472,-1070867850,-696844464,-2853121,922741878,-347076958,-629735577,-11485141,1996478070,-327745564,111294207,548950096,13416960,429543506,-16777208,1996479094,-696844316,-2066689,922741878,1996424866,1354771428,-1174402888,1347551283,542874,-461993216,-2066941,-11085194,1183569526,-465163308,1356875307,-1280257,1443275318,-1202667477,-860225504,-1706012160,65535,15105667,244319604,-2146657304,1946216574,1714880304,1354771203,61512272,1996423168,1354771418,64374411,103541830,103482234,-1924133286,1343678534,1342177720,329370,1883144192,242483203,-16091393,1996425334,-26106,1599995904,-1962742397,1297948645,503318218,1430622296,-1910575989,183272408,-2101455273,57188611,-1577302391,1177224030,-163149558,956843659,108918342,-1980348789,-13957050]},{"sector":8,"data":[28116459,961018950,-159446402,-1962516853,126483526,16533191,-335598848,1174514949,2117683196,-1946779896,1600060486,-1962742397,1297948645,503318218,1430622296,-1910575989,82609112,55066243,723877376,1996443840,-401698810,116785189,1963003912,-264338669,208994305,268961526,-1710918528,65535,-1962742397,1297948645,503317194,1430622296,-1910575989,787252184,951604823,141489920,-964562805,1149898760,-1981535741,1150016582,-431584970,-1995553653,83294278,-385649407,2122515393,208928774,887623312,1958742789,61860099,57018055,-6619137,-1962934017,1183387716,38050536,1048772608,1962935970,38836744,-1964441600,88377859,1183441962,1711720434,-150995197,460587524,425603,244321396,184871656,-385649472,-1070922907,-6664112,-956301057,17225734,-498678016,1962868736,410320666,-15305473,-2019945356,-1996488698,1451881542,474254326,-1994500981,1451875910,138709984,737035913,-96040512,-1946401143,1178143812,-2096726792,1962998910,71600682,1183441962,-62485544,2144880185,-428409024,-1311226229,98620163,726663208,-6664000,184549631,-1977453120,1149828166,-26109,113704960,4014,-1577180032,1149834026,306497296,-957808640,71598082,-599356667,2096776761,23128323,425603,2122519156,208994530,619187856,1958742788,22931715,-1947836789,-96040129,-523041615,1166800899,-700020466,16926198,1183535732,-96060932,1183533692,-162100236,2080920889]},{"sector":9,"data":[956661567,946996805,735463051,1183386693,-129614888,1183525500,-700040728,1149962364,-666486510,1183521406,-162100236,1963480377,105199893,1166676085,1004808705,108260934,-369473793,1183580011,-162100236,1946703161,13166851,1946567993,12642563,704726410,-297387036,-1276574860,205818624,2127971897,-129594613,2128102969,10545411,-1980217717,2122568774,561250530,-1962379521,1346960454,1183432747,244338914,-1946909208,1066133086,-1308998005,65065732,71666680,105186201,-1995942637,1451881542,38139638,-1979157496,-467009211,721611584,-297367104,17581451,1183578182,-96060932,1183516789,-666486316,1996435572,-92864760,737953419,-11470266,244372598,-2097051160,1028158,1586170740,-1960866842,334101062,-62485759,33179179,1183571014,1183400188,22145530,425603,2122530676,963969250,-991424880,1958742786,-599356624,2096776761,20441347,-1947836789,-96040129,-523041615,1166800899,205859598,2096645691,18606339,-33397376,-335919361,-227082288,-624897,1996485750,-529072146,-1193380097,-1706033144,65535,32521859,-1582402304,1183384412,56140270,56235659,-1980479863,1956771414,-129629949,-1980217717,1586171972,-1958769690,78772806,-133963565,970737291,58522182,-1962899735,1452012614,139803126,1161395061,-1971948282,-467009211,1978549819,-96040084,-1949153655,1178205254,-1961265670,1160449605,-129615092,1996426879,-92864760,-1191557377,149618689,-16222465]},{"sector":10,"data":[-1070859658,-126419120,1944587920,-1338080512,762576911,-1947836789,-767128801,-523041615,1736497155,2122579458,108265698,-1995553653,1149964356,-398030576,-1995553653,-689309626,142016508,-2130938113,225342,1048777844,1946157916,205818637,2113422905,112645,-1070923029,1357006473,-1276637552,-62455822,1593630953,49120095,1562371467,313933,1167087646,518818645,-326903666,-1202301152,1861681208,-2114942196,-1961883450,126563932,-939768183,1028102,54823424,1177281578,-230258422,704857226,138806244,704924810,1942043629,138840584,-352107518,71600643,704857224,138816484,990529067,91681350,-336443765,54823435,1177281578,172370696,74694667,552321067,704857226,138816484,990529067,91681350,-336443765,54823435,1177281578,172370696,-1947056503,78711422,2114185171,-260142596,722355595,1183386693,105286638,-1980873173,2122578502,1753088242,51005067,1183385670,205818856,-1947580791,-522983354,-1979955709,2122575942,259260424,1183535191,-754732558,-6663968,-1962934017,1183443014,54823670,1178199082,-2094435338,2097216126,-262239471,971654795,108924487,-33396864,1586170347,-96039952,-15841535,1183053382,-840232720,16416387,1183658868,726669024,1183535296,-297387770,1183516029,-1962677266,-11532730,1962870388,-26100,1183645696,-1070903072,-92864688,16777114,-96040192,-310157474,535137026,147475805,-1873273344,-326412987,-338129378,192067708]},{"sector":11,"data":[-26032,-1073020928,1048646005,16845684,1923168117,872823051,-1204914928,1344146290,1347469355,257268304,1923153920,872823051,-1203342320,1344146290,16777114,192067584,1184518174,-352321521,192192816,1946227517,18365721,4002932,-1207602174,854261761,504066744,-26032,1924661248,726670859,1347440832,16777114,192067584,-1070903266,1347440720,16777114,1958742784,-9574141,-310132693,535137026,516640093,1430622296,-1910575989,283935704,1245118294,1354771203,-957870448,142016505,-1710852353,65535,55451275,1946224630,-264338681,-646709247,55451275,-1959370869,-62486265,16008903,1310624512,55020035,1183441962,-196703238,-96060608,1183544701,-96074764,1183447249,-754667022,-62520352,-1947187575,105352152,-1995942005,1451882054,139869176,92039039,1996899899,105286496,956847755,242612310,1979074105,-262239479,98176,1183532917,-196703758,-1946794357,1446639702,966685960,-1720383930,-1947181429,60359751,1460864583,139868936,1178273141,-1954384890,1183517278,-1962440204,78771318,1586226899,104893436,-351776629,-230257914,1593794537,-1962742397,1297948645,503318218,1430622296,-1910575989,753697752,138840918,956978827,175443542,1963738681,112645,-1070923029,-2081405303,214590,1625883508,138840835,956978827,58592854,2080592617,205928712,1223230326,325492995,325588619,2097829433,54126851,1178142847,-385649912,1048773423,1946158784]},{"sector":12,"data":[52816131,325336707,-2093911040,124990,922692212,1996427834,209125134,16777114,302446080,343150603,-1961991519,957244438,141888086,1963476537,49146115,55451275,721831819,-1995400186,1200353862,-196703990,16139975,1310624512,55020035,1178330154,-385648650,1602945731,-1962439882,78771798,-1039932717,-1946401143,38270680,-16419583,-773065146,-1946394997,1468728903,-398030584,-1947576695,1451952198,-363448054,-1997995138,956857346,58124358,-1593671959,378213164,1446581038,-385646870,142344815,1994933817,40233219,-1962391925,1446578774,958100970,376825926,-1962129781,1446579798,-385649654,1178141255,-385649656,1586168383,71797756,-398064743,-1981131245,1451879494,-398029842,971658891,1518276182,1178142076,-1957464308,1452010566,173423086,92227708,1913144889,-60912831,-1325250677,-2132225276,1183387620,38270714,-1960610812,1452010566,173423086,1178146933,957576456,242608726,1978156601,-96040183,-369604983,1586168018,172461052,2122576619,578027760,-1947449717,1446637142,957838606,309660742,35274371,-1962183680,1200356446,-96040694,1183566571,-296317972,2114868793,-18355965,1178142844,-385650164,1996488413,-394854422,-15829249,261753974,-1996488694,1451876934,-294191132,-1280257,1996425846,111188488,1183383552,-531199522,305805055,-1411329,1586227318,21465852,-11475926,-15520202,-1206703050,-1706033144,3160,736249483,-1957631930,1177280070]},{"sector":13,"data":[1183666402,244338938,-1980381976,1183573574,-431619078,-1946663287,-1962717666,126563935,-1309256053,65196804,-62486078,-1946394997,1979910775,-126469644,1183516029,-1962742792,-129594938,972703371,1434384454,972310155,58718278,-1946277655,1200356446,205990670,-1948760439,1982593654,2130054132,-339309820,62925570,-1995400186,1586222662,239569916,-1948498295,1177286726,-1677327372,-632911600,272250623,383141517,-26032,-555155456,-260144131,-385649408,1183579605,-129615366,-890698892,-60912643,-1995552885,922735686,1996427834,-394854422,704726922,922702052,922686254,146281260,-795193344,-1962934254,104007238,1098124984,246955651,-1959430912,1177287238,-1677327372,196256528,735331979,-1560054266,915082172,908788596,909706102,92078968,-352094047,-1547269374,113709590,67254,-370667888,-310157824,535137026,181030237,-1873273344,-326412987,-1193767394,1861681208,268961030,1354771280,321533695,199757456,49120000,1562371467,182861,1167087646,518818645,2122569870,997982214,956712587,863242310,-2146804085,1586168079,138840842,2098218809,273124101,1183515627,173968136,-1961867383,1183517278,306657542,1200292732,173968146,-2095954039,-443874579,-900899553,1478361094,-1957345904,-661774612,721742979,244338880,-939562264,-16554490,49120255,1562371467,1478413133,-1957345904,-661774612,54935171,-14781184,-14980554,-14981066,-14979530,723217462,244338880]},{"sector":14,"data":[-939813656,16991750,49120000,1562371467,1478413133,-1957345904,-661774612,-1203862698,309657614,196884107,269891115,303445561,914949246,922685974,922685498,-1130296398,369502987,45633554,922701824,163058198,5618176,-1248178094,-1207959545,103481345,-1197273416,-310157810,535137026,516640093,1430622296,-1910575989,-1203862568,91488270,-1914171760,49120255,1562371467,2214733,252051715,7077891,258277635,7143427,253296899,7405571,253952259,7471107,32309251,9830655,285016067,2031871,311361539,2162943,65863939,655362,355926275,1900546,239796227,3670271,143196419,2162690,133366019,2228226,140902403,12255487,163708931,12321023,261881859,3932415,162922499,12386559,312868867,12452095,91160579,12517631,89915395,12583167,175243267,12648703,166920195,12714239,162201603,12779775,155975683,12845311,42926339,2949122,144572419,12910847,249692163,12976383,247267331,13041919,45154563,3145730,43319555,4521986,331022339,6619391,246284547,4718595,326762755,5373955,174260227,8585471,0,0,1167087646,518818645,-326903666,-1331603954,105265419,1709769589,1488897,-1962512649,574000088,-2095316209,1586038467,-1324905476,636015372,625475599,1183383567,23560442,-60912881,-738572661,-2096690720,1946221182,19589379,-1710852353,65535,253894283]},{"sector":15,"data":[381165451,107935488,1082912907,-96040690,-16223168,244382326,-1191213592,1861681174,-1948742906,-1961942474,-1708064972,188,-150989128,-661977490,253900427,13055115,512425984,529207074,-150989128,-259324306,-1995947893,-1072956346,-1706031500,218,253894283,381165451,107935488,1082912907,-129595126,108314635,16292432,512425984,529207074,-150989128,-259324306,-1995685749,-1072957882,-1706031500,278,253894283,381165451,107935488,1082912907,-196703980,108314635,-26032,512425984,529207074,-150989128,-259324306,-1995292533,-1072958906,-1706031500,65535,956476577,91555398,16777114,108461824,16777114,305832192,1963345465,973522694,-1577058542,1178147674,-955878138,-14984698,205562367,1946568249,206217480,1963345465,-26107,-2090991616,-443874579,-900899553,50333186,16813057,50333440,-16680448,50341376,-16695040,50349312,-16692992,50382848,-16754688,50383104,-16698368,22528,0,1167087646,518818645,-326903666,108954380,-385649408,1190527125,1970536710,-1957642197,-388954554,-780147584,1372138464,-96039600,-26032,1183383552,-1965519880,-1981535737,-1014236602,-62486208,16416387,1996447102,142016266,-1963172213,-1981535737,-1957628858,-1873788733,5171214,-1963696501,704819335,206308,200689289,-16026176,244382838,-1996164120,1183577670,-96065034,-335788543,175570871,-1979156737,-467007930,2133190865]},{"sector":16,"data":[1183666176,244338695,-2097148952,-443874579,-900899553,1478361094,-1957345904,-661774612,1460857987,106859350,-467007606,-1946532215,-2013919138,1963721392,24701187,687747,-2065104011,173968132,-1946278016,71108678,2118153216,20244739,1946157373,146701,54337908,-383486976,1183515743,394506,-244087,-1202715018,-1706033150,504,-1962653975,67439174,-1947866368,134548038,-1948390656,1183517278,206330,-523040591,210498443,201123200,-385381951,1183515675,656650,1586215659,-1946973430,-266071996,-2114302325,184553441,273123777,-16516375,-1070922170,173968208,-1962522741,120260190,27105872,1586167808,105351434,-1957642197,1200294494,106859268,1342326571,16777114,173968128,-385595511,1586168767,273124106,-1996484827,1200354374,-754667248,75240,-506231,1393775158,1342180280,16777114,-1960187136,1200294494,992528,-1946925431,78712903,19261651,-129595136,1074153099,1183535952,-1706014470,965,-1962254709,272927731,1317793828,266437108,-1983837440,1586171975,-1946973430,-282849212,-2114431349,-1325399582,199414532,-12719678,1962936381,-8984317,1962936637,-15013629,1946159677,736658,99156853,2637311,518587253,51767807,818819,216597365,207522563,-1946278016,338495558,1260800,-118946954,-1816132862,1101528878,207522565,637159051,145817601,-208936749,-444593013,-21501442,-1962123637,19266118,-754339584,-1946973216]},{"sector":17,"data":[-35291124,-1946246935,-208991138,-2147335029,1452015332,31621626,-754405120,-1983771678,-1528233401,207522562,280567,-2094893569,1946221182,38242844,-1202658262,-1873739777,46065678,1586226218,38767372,-352263808,207522602,280567,-2094697217,1962998398,38242847,-1202658262,-1873805311,43182094,1586226218,38767372,184607104,38242753,-1978900853,-466945466,-523040591,1284240267,15040516,1810481419,207522814,637159051,179372095,-208936749,-444593013,-1983837437,207522567,620381835,-754536000,468472,1284240267,-119439356,1586219755,-1946973428,2359876,721047178,-373224467,1586233153,38242828,-2125405142,8452734,1183516796,16788986,1183515627,244338938,704775144,207522788,-2147332213,-840236831,-1962123637,246481479,19261651,-263812864,1392932607,1342180024,16777114,207522560,1150022539,-1075544062,-2114955637,-1325399582,-19142386,-1962123637,246481479,19261651,-263812864,621037451,112263175,395043027,-355267919,4186753,1183433227,38243054,1183441962,71825394,225771264,112720,-401698736,1183383936,229161202,209125200,1342178744,118170,207522560,1150022539,-1075544062,-2114955637,-1325399582,199414542,38242754,-1962123637,1059450438,-754274048,-1946973216,65372172,126468363,-1962123637,-1071321530,-120387919,-1962932443,72125427,200860032,71797185,-1962123637,38046707,1317666852,-18617870,-1962123637,71797559,-1325398235]}],[{"sector":1,"data":[-1948200186,-754273834,1071809002,-1983773952,-125047226,-1979294069,-467009215,-1947318647,1059392606,-1948200192,65372366,126468363,-1962123637,-1071321530,-120387919,-1962932443,72190971,-369565312,1586232906,71797516,-1325398235,-1948200186,-754274025,1071809002,-1983773952,-11473338,244319862,-1996404248,1586228806,4138252,-523040079,210498443,184804736,-1962440255,1183517790,-1312807698,637063942,-208994297,-2147201909,-202770207,-1878885891,-989681918,1778596098,956541955,-536642045,1761962243,1761962245,1761962245,1761962245,-368798715,-2090902012,-443874579,-900899553,1478361096,-1957345904,-661774612,-2147066229,91560511,-352318536,106859274,704726922,-2092941084,-443874579,-900899553,1478361090,-1957345904,-661774612,1443163267,425603,-1863777419,108954368,-951288320,64582,167542403,1586171517,-1948003844,-2026305466,293470436,66877067,-2092038538,176032254,-352319048,-62456057,-963914005,-1946401143,-1948003880,-2026305466,1232863460,-771989877,-460878877,-951981312,64582,184319619,1586171517,-1948003844,-2026305466,243007716,66877067,-167049610,-1070921347,1191118827,-1948652548,-62486074,-472786805,956843659,2113987719,138841015,49120094,1562371467,313933,1167087646,518818645,-326903666,2122536452,125110280,83642055,-2093815040,2098202750,-62470393,636157953,537427587,1187448701,-352321284,142508824,-955810520,195654,2122517483,92090376]},{"sector":2,"data":[66864839,-59340032,-1979294069,-467009216,49120094,1562371467,67422797,-2113928448,-1425998079,469762816,738262785,838861568,822148864,822084352,939589380,0,1167087646,518818645,1048828046,1946159984,12577027,32521859,-955681792,17526790,11528448,185616011,1031017030,-15173889,1996428918,410451732,-15304961,1996428406,276234002,1342177720,-2048389488,410451723,-15304961,1183519862,374770452,319833603,1347555926,786960016,410451725,-15304961,1996428406,276234002,-15829249,1996426358,142016266,-1878624513,46983182,191905411,-12552960,1996429430,343342870,-15567105,1996427382,108461832,-1897394544,273058564,957503115,91555926,1946568249,410451734,-1961605493,1174607446,139858694,244338770,-2097148952,-443874579,-900899553,1478361108,-1957345904,-661774612,572427094,-1205892337,1861681174,-1947170038,1451951686,72366344,1077478773,-13339646,1996425846,108461832,16777114,302446080,527699979,-1961129823,958106134,91555926,1946568249,175570702,-16222465,-6683018,1577058559,-1962742397,1297948645,503318218,1430622296,-1910575989,149717976,173968214,1996437503,108461832,16777114,833792,-259266057,51011211,80118583,-1962522997,69929046,-1996336101,1451883078,1958874108,1150112611,28856332,244338688,-1962904344,1979059184,-18427,1183538667,139889414,1418265737,-129725694,-461313839,-1948200577,-511638452,-1056243711]},{"sector":3,"data":[-1962654583,1418459716,-96074756,-1979951597,1418266180,-29062392,-1962261367,-31194044,-2114433909,184549857,71600577,1586218635,-2096133366,-1054145343,213504555,1592915712,-1962742397,1297948645,503318218,1430622296,-1910575989,216826840,173968214,1183528843,72125704,-768884437,-150991687,-129594895,50742923,1183384132,-1996190726,2122579014,58654726,956336873,1551825478,1342180024,-1711651189,-150993479,-6663943,-1996488449,1996485702,-96040182,-1980479997,112852038,1089074944,-1070903232,53844560,-1073020928,45616757,-6664128,721420543,12380608,-1962254709,833591,-1946652937,71339480,-1962391927,76151878,-1980086645,1996423748,833544,50753271,-1957689274,1177287238,105262072,-150993223,-107327255,-352321534,108954488,-1955431168,1149893190,833538,-1962512649,-936703922,142016337,737822347,112851014,1357510400,16777114,-58817792,-1958314491,-523109818,2113685051,175570748,1342178744,-1711651189,-150993479,-96074759,-26032,76087296,-150993223,1346388193,1342177720,16777114,833536,-1946652937,117639774,-352320507,138840835,49120094,1562371467,445005,1167087646,518818645,-326903666,-1957275882,1451951686,273033992,-1995287013,1451878982,-263796756,381157376,409925376,1049352331,1032523554,1183383947,1996443896,343342870,-1427632496,-96040451,185616011,125112902,16008903,-14882048,1183578230,374770452,319833603,1347555926]},{"sector":4,"data":[-2098721136,-96064515,-2081143159,749630,1508442996,-128021759,1183385483,833774,-1946521865,-293731336,-1995903101,1183579262,138808070,2122543476,813564154,-787593589,72190944,1006559616,-2094959167,1962936957,105220891,50877835,1444090950,453323542,1446707797,990213388,997460550,-150991688,-661916562,-2080612861,1586040003,71797744,1317797412,1004654862,-2090895935,1962936959,172395353,51140235,1444087366,139934472,1195067509,-12356346,1183578230,787964,-196703408,-1873749769,-40900594,-166989685,-1444347019,105286400,1946699275,-260144272,-1961790464,214336478,-1962260853,1200163926,139954438,-17275776,1996444651,-62485512,1342180357,721420728,-1873742778,-45357042,-166989685,1183541364,374770452,1418265737,239504130,-780147584,72125408,123265,1149878539,172395268,-1995680117,1418266180,172279560,1686110208,-964428284,-128021748,213401483,40236800,1099815051,-163149564,199902859,376761414,-964489237,-364475636,32265867,1410462788,-160024074,1600056439,-1962742397,1297948645,503321802,1430622296,-1910575989,686588888,1183536727,274107150,319440387,1183386710,-61437446,-1962522997,1177225302,206969610,-1980479863,381220438,309262080,512487563,922947362,-1946925429,1140979286,72618242,957495969,561320518,-1961677663,957558294,360648790,1178142076,-1961986290,1452012614,738591222,773198099,-196703469,1962296843,105183052,1165298688]},{"sector":5,"data":[1080451,1552629620,-1995994352,-661917626,1183385483,440558,65957623,263619,440400,178256,-294191280,-1961998709,17109078,13796096,1996443730,-193527818,-504885616,44867847,1964131897,191668546,191764107,2131777081,956660790,796331590,-1961998709,1174605910,206967562,191764027,108990332,191628859,-6682762,-352321281,-196703474,32921227,285961222,-955552234,63558,956516513,58521670,-1207786519,1861681208,-2114941960,-1978660666,-467008188,1947354683,29616387,14960327,54823424,-1948236151,1418400836,-431585002,-1578609015,1178141514,-1207601672,65739624,-1994242931,1183571014,-61436934,2082362425,956661592,1366432836,-1946925429,1140979286,508825884,-1946532213,1413086294,2082045722,407124229,1149964919,441748248,2132694073,956660776,561192004,-1946925429,1140979286,441717016,956517025,225835078,-1961343861,1721965140,1746307347,-196703469,1979074059,9693443,-1948492149,1451953734,106379536,-2098658435,956661504,2071069767,-1948492149,1452014150,39270908,75441532,527566649,-1948492149,1452012614,285671926,1586168407,-196703268,32921227,1460732999,-1958155514,1175127622,-15633144,1996427382,112654,-26032,216727552,-1961998709,1174605910,139858694,-1982314871,1586223702,239504348,-1995417973,39291143,-1948492149,1452005446,71797210,-1962518647,126563932,-1948367223,78766150,1174659283,1060318,-1947580791,-1960711176]},{"sector":6,"data":[1452014150,139803132,92235644,1980122425,-196703392,32921227,1427179077,284132104,1994292793,-1958024230,60359749,1427310149,274086664,92021119,1997424187,71666458,105186201,990401811,712314966,1963869755,38139429,-2095090680,186942,1702888564,1252130306,-129615613,1049166965,-276622544,-562153200,2117710198,-16353814,334100550,-633437186,57933826,956370048,2037833342,-1946532213,1446640726,2132507880,-431605499,1183519862,-396981274,334775811,1149892182,374638868,1149911787,736373250,-431619118,1005082131,-1284370346,1178273143,-1951631858,1451953734,105251600,990402067,411035734,1178273148,-1961790490,1451953734,340035856,-954837879,2116,-16642944,1996427382,-26098,1927872512,71666687,105186201,-1979165421,65874445,13796289,1930450491,-11015933,1178273911,-385648882,1702952781,209780226,-2084074751,1178145007,-372608290,1996488505,-26094,1599995904,-1962742397,1297948645,503320266,1430622296,-1910575989,518816728,1048794711,1946159984,43378947,184960651,561317958,-15173889,1996428918,309788436,-1206880513,726695935,1347440832,-401698736,1827272362,572427010,1488911,-1961333001,64523023,-1959293991,-1206967778,1861681174,-1961915634,-1948711976,-62486265,939513995,-15960321,-1399190922,-1996488695,1586230342,-1959264260,1451952710,105251596,755521043,-628948991,-1706012160,353,-2081929591,127038,113707380,68464]},{"sector":7,"data":[-1593703703,1183519290,306580240,1996438900,376897304,-15436033,1996429430,343342870,-15567105,28840054,244338688,-16653336,1996429430,343342870,-1961605493,1174607446,307630864,244338770,-1962701592,1175127622,-14650360,1996429430,343342870,-15829249,1996426358,142016266,721843967,244338880,1442947048,-15304961,244323446,-1980299032,1183578694,306580240,1183516021,1444211706,-1961605493,1174607446,307630864,244338770,-1980308248,1048834630,1946159984,22407427,833622,66744055,263428,-96040112,66209323,1177282630,-1873788684,-142874610,213448843,-194054400,66870923,263431,-2081798519,749630,417923956,-1202237439,-1706033146,2843,-1961605493,92870230,-1962781303,1451952710,-362902772,1461389099,105185538,-1962388207,1451955270,172370710,-1995680229,1451882054,105286648,721966731,1444614214,-498693870,-1947969911,1177282630,-263812620,829734923,99239563,-1924136948,-1202713531,1861681158,-879079184,-352321534,214401806,-1946794357,84015190,-1962781423,1325396038,1975520240,833768,1744247947,96666370,1183383556,-1962152978,1452008006,285540836,-947715499,-293717748,1996483959,376897304,-15436033,1996427894,142016272,-1878624513,-104601586,-1961867637,1446580822,956658952,376702534,-1961330945,1451955270,105251606,1376278035,-401698736,1183577408,138808070,1996431220,410451726,-15304961,1183519862,374770452,319178243,1347553366]},{"sector":8,"data":[-1914171760,-2090902008,-443874579,-900899553,1478361108,-1957345904,-661774612,1444867203,-1962129781,1174605398,173413128,-1980086647,1996487766,242679568,-1710459137,3155,-1961991519,957244438,58588246,2130770665,-96061176,-253164685,572427008,-1205892337,1861681174,-1947170026,1351287360,-498693884,971265673,863310934,1964131897,1958873902,376897322,-1961736565,19731542,14320384,2107265106,-1962934260,1452008006,67044,-1996434813,1451877958,-15275032,1183520374,341216018,-1981397367,1347610710,834714,461938944,462034571,-1981135223,2122574934,208994310,-1962129781,1183387222,-61437446,-1948105077,1446634582,2083028988,-96061179,1996431735,-59310314,-1694861569,273,-1961991519,957244438,427811926,1178142076,-1961724958,1452008006,67044,-1996434813,1451877958,-431584280,736646795,1444670022,-297367060,-1026423,1996428918,-361299988,1347571794,854068880,-310157576,535137026,315247965,-1873273344,-326412987,-2082959842,-950662420,64582,1090274955,1929791035,-62485673,1208370691,1183443153,174520314,1577310347,209095432,1351286923,-163149566,1006130825,276762710,1178273148,-1962314994,-1992230330,-1058276282,-1961998709,1446580310,2131787000,-163170043,1183517046,1183400186,-1952060666,65796678,1593591435,-1962742397,1297948645,503319754,1430622296,-1910575989,183272408,-150989128,512429678,117640994,-1946532215,105379800,527764480,-1995421813]},{"sector":9,"data":[-1072957370,1996428660,209125134,-16091393,1996425334,-6664186,-2097151745,-443874579,-900899553,1478361098,-1957345904,-661774612,343313238,-351242749,309734175,-1962260853,1413024854,2132507650,1912879364,105286421,17323659,39063812,-15841653,-1073017266,-2090936459,-443874579,-900899553,1478361104,-1957345904,-661774612,-1592857469,378215272,1183390570,-128546314,-1961136991,-1994691050,1451881030,-25868,62390272,922701824,1996427834,-159973384,-1947056501,1177285718,-128574474,-1980086647,1347615830,1358954424,726684313,1347440832,1474825872,976682752,-126419182,-624897,1996487798,2147465466,1354771280,-1873784752,-246093810,35391175,113704961,4964,-1962742397,1297948645,-1873273141,-326412987,-2082959842,127038,28837237,721611520,49120192,1562371467,182861,1167087646,518818645,-326903666,-2091493620,1946360958,13953283,957104289,57940550,-2097100311,51134014,1048775284,1946291262,12118275,-1962130783,957105174,376772694,1964394041,-2110324975,-26085,1183383552,-128546314,1183523051,408324886,319964675,372970582,1500843076,205653563,-1070902411,-1980217719,922744390,1996430210,-159973384,1347469355,-15042817,1996429430,343342870,-1877838081,-107223026,205405827,-1961790205,1451954758,1174798612,1209405708,51308812,-1961736565,100734038,370216016,-35058606,1044284162,611648012,-1962130783,51135510,319571462,990660630,276109398]},{"sector":10,"data":[1964394043,306613003,1964262923,48163075,18644611,1084314997,440809740,1048792437,1946225726,1044284167,477430284,-1962130783,51135510,319571462,990660630,729094230,1964394043,-8656602,-1962130783,957105174,393549910,1964394041,205431058,1946157885,343383,155021428,-2090634240,1948851326,8513795,205405827,-1585810135,1178143808,-1586334438,378211394,1446579268,963015960,1635063366,206847619,-10849024,1996428406,1211563794,1178009356,-26100,1185087488,1209436428,36366604,-1962129759,-1559476202,378080336,113708114,134206,113708779,724030,113706731,461886,-1961736565,1185092694,1209436428,178188,306354768,-303497216,440830721,-1962131293,1451955782,205693720,205788809,-1961736565,1185092694,1209436428,273058572,-1962128733,1451953222,206349070,206444169,-1962391925,1352862294,1377208588,105286412,-1962126173,1050876998,1391884,317260670,1326337,99156860,146689,54353012,1027765248,141819909,1946158909,18213123,112868995,-15174656,-14974410,722186294,-11513664,-1710510026,3886,-15865006,-1206156746,726728703,1347440832,-401698736,-521600671,-2110324992,444006171,-15173889,1996428918,309788436,922739691,1996430210,410451738,-15304961,1996425846,-3216632,-14974410,1996429942,376897304,-15436033,244322934,-1207886616,-1679228927,-2110324992,444006171,-15173889,1996428918,309788436,-18346352,1488896]},{"sector":11,"data":[-1961201929,572427248,-1960867057,-16052104,62442868,-149058816,1077936751,-768375,-1961942474,1050054,1488976,461516535,1342181381,-1863026945,25815054,922722795,1996430210,410451738,-15304961,1996425846,-401698808,62390437,1025895168,-2055995366,1962943037,-10491645,1962943805,-13768445,1946167613,2768329,1760101237,178431,-26032,2122514432,1450508058,-150989128,512432750,117640994,-1191557495,787939350,-259318910,1988704003,-94467076,-788117621,75240,1284235473,-35553274,1149878539,-94467322,621168523,1284177921,-18776058,1149878539,478053126,-1962445817,1333852766,1048773126,1946159984,240556549,1599995904,-1962742397,1297948645,503322826,1430622296,-1910575989,216826840,381179479,275707648,381218955,242153216,512489611,529207074,-1995292533,512489030,529207074,1196231,-159973632,16777114,276233984,16777114,276233984,-135786864,276233984,1347469355,253894283,1895767947,40959748,-15829249,1996426358,142016266,-1878624513,-169351154,253900543,-15827325,-4717195,-1962546177,787911,96897872,-1202716660,-1873805261,3270670,253900543,-15827325,-4717195,-1962546177,1312199,96897872,-1202716652,-1873805286,911374,-310157474,535137026,214584669,-1873273344,-326412987,-2082959842,1448543980,-1962248565,1586169982,-1960867060,-96040703,259309579,-26032,1586167808,-954234100,184549377,-1959232266,529206366]},{"sector":12,"data":[1946171523,108461870,16777114,-62486272,-1960807360,529206366,939464843,-237941,108461879,701594,-62485760,-1962123637,1577158943,49120095,1562371467,576077,1167087646,518818645,-326903666,49120006,1562371467,182861,1167087646,518818645,45668494,244338688,200972008,-1592101696,378215276,372841326,226433898,104400508,91429736,-437776752,49120249,1562371467,1478413133,-1957345904,-661774612,19983489,572427094,-1205892337,1861681174,-1947170032,1183388224,1975520216,10545411,-19626297,1187446784,-352321284,-664892588,1586182027,-1948003844,126550616,-19757431,-632910512,2275408,-26032,1996423168,-632910578,-26032,-2037841920,1183579856,-796509700,-16485122,-1946233722,-2037711754,-2104951088,-1098776872,16776912,1191133812,-664892420,126558091,998237312,-1653081018,-19612029,-970361856,654235270,-1948754293,-2012771809,-1912678522,1358878342,-15829249,1996426358,142016266,-1710852353,65535,49120094,1562371467,403491405,-1442774272,117440787,-67108096,520158987,1778385664,553713424,1845494528,570490631,-1442839808,637599506,922747648,654376705,-1375730944,687931152,-1509948672,738262804,-2030042368,771817218,-1962933504,872480521,-452984064,939589395,989856512,1157693190,100664064,-939458807,1073742592,1208024849,-50330880,-922681582,570426112,-905904381,1526727424,-889127166,-687865088,-872349939,-1308622080,-855572716]},{"sector":13,"data":[402653952,1308688149,-184548608,1476460306,-1040186624,1996553992,-922746112,-2113863917,2046821120,-2097086718,0,0,1167087646,518818645,-326903666,106859278,1183385483,263674,-1947056503,1451953222,66830,1375785603,-227082416,1342179000,1342177976,-1946526069,-163149561,-26032,1183383552,440828,1174530551,-228684814,-1962129781,1463357014,2137553924,38222085,1183539574,-129594894,16008903,-1961039104,1183578206,173443848,2130990905,956660761,309789255,116934275,-1946925313,1174666310,-163169292,2122570108,661913844,-493825,1183576694,-163173900,737560203,62520390,1357510400,16777114,106859264,1183522699,-2096657930,-443874579,-900899553,50332172,-16730880,50345984,-16761344,52736,1167087646,518818645,-326903666,2122536458,1500905230,139345537,611680254,-1727127391,139068931,139204115,413255819,-1713730802,209508923,-935656321,1453393522,237019912,-1727127391,277087745,277222929,158711819,17669793,-351376890,1778829062,-1593835506,26807840,285755910,-351777770,172395313,-1559472501,378081412,1183518854,241869576,-1559345525,-1070919484,138847129,138942089,-1995942237,-1559734250,378079324,512428126,529207074,-150989128,-1961835474,277127664,277223051,2130989113,956660801,980877888,236979911,113704960,69022,33965814,703136629,229160962,261929040,374864,15964752,-1464336384,-2001186803,95965195]},{"sector":14,"data":[-90550272,-385875967,547422724,373004558,394201176,104531580,259197014,-1727127391,139855401,139990553,-1207893783,787939350,-661974844,253900427,411776139,1183385483,243172346,-16353793,-351774202,-92864749,277231359,277100287,2028474000,140157698,-150991688,-1962386898,-92929040,-1996175741,1150024822,240421644,277087787,277222939,-1995942237,721967126,1185126848,1209436424,140288776,140383881,-1962523509,69929044,50484251,319849478,-1559198186,378079306,1149962316,-2132225788,1319337956,2147368200,1252089973,237765896,-1961907037,722343990,185092662,721714678,-1962742848,237020102,138847129,138942089,-1995940701,-167223786,1963066950,18278659,1578535321,263632904,261929040,374864,34314832,-1665662976,-2001186801,95965195,-6664192,-385875713,1586168038,172461052,-167226717,1946224198,1312227107,1278672648,1245118216,-129594104,-26032,-1398603776,-129594609,138847129,138942089,33965814,547445108,373004558,377423966,104531580,242419804,-1727127391,140248617,140383769,-1665648149,1183666191,922702070,922683470,922683468,922683466,244320338,-1962817560,-1550191034,378079324,-1665660834,-2001186801,95965195,-1432727552,-2097151996,546878,142544764,139869825,91389951,-343933000,139895043,-166846301,1946224198,373004565,243009608,104531583,108398662,-1559738719,1190530592,410255878,-1727127391,140383803,108990076,140248635]},{"sector":15,"data":[1554056822,237019912,-1559355231,-2090988130,-443874579,-900899553,1478361098,-1957345904,-661774612,-955847549,64582,-15698177,1996426870,-1586173172,378212484,1446580358,2139061258,138819845,1183545462,-62510330,-1577433463,1178144288,-1996259590,1183578694,1317771770,173968136,277089835,277224987,276814395,-935656324,1183517299,-2079970552,-96040688,262944511,-15567105,1671101046,-1962934267,1174534726,-62521070,957227169,511507014,1358954424,726684313,95965376,244338688,-1946396184,1178142278,-385647108,1586233205,-62485740,-310179959,535137026,281693533,-1873273344,-326412987,-2082959842,-1957294356,1200294494,-96040702,16271047,96701184,1183383556,-129594372,-96060608,1183531901,-96074760,1183447249,833782,-1946784009,-59339816,1351286923,-230258430,1005868681,578750550,1178273148,-1961134330,1183446598,-230257672,972314251,-1183512490,1963345465,-129594444,1183516907,-96040458,-2090948629,-443874579,-900899553,1478361094,-1957345904,-661774612,1444342915,-150953288,512429166,117641632,-1946794359,-1962439720,1177223767,173415176,-1980086647,512490582,1207894022,209617666,-1591315200,378208908,1446576782,2132442122,138819845,-1229450382,1996443663,374800,80321104,-370606080,-161576192,17057782,-1092025483,229160960,276234064,1342178744,362394,209125120,818819,1052250485,1996443666,142016266,-51900784,-1960973568,1603008094,-13107430]},{"sector":16,"data":[1996425846,-26104,1586167808,-1949791242,-1056765369,-230257328,1354771280,16777114,-196704000,31473283,-1956612864,80118768,1418396811,173422850,92212348,1913144889,113672965,76278507,-1996335989,1451880006,71601136,1038894729,460652543,99894787,1183383556,-11517704,1586172022,705137400,-6663964,-1962934017,1452011078,138816496,-1995811301,1451883078,-1205867524,-11530840,95948918,-493203456,-1962934272,-208990114,604128395,-1995174912,2122515015,242483206,722499327,1996443840,-26106,2122514432,310116604,2122385279,1988100090,241077001,2147420103,1586170091,-96040178,512427913,1342111750,-310157822,535137026,214584669,-1873273344,-326412987,-2082959842,1586169580,106924810,1183385483,173968378,-1995946101,1183579206,-61931524,578076683,-1946526069,1451951686,39270664,75435644,141952825,-1946526069,199951431,117065347,1586222315,-2081363190,-443874579,-900899553,50333190,-16548096,50342912,-16633344,50344192,-16406016,50344704,-16446208,50345216,-16605440,50345984,-16452096,52992,1167087646,518818645,-326903666,297443688,-1912846711,1183434822,205949894,1962935869,15001859,1962936637,13166851,1962938429,32958723,1946226749,17906955,-454491275,12577024,-1705983957,65535,305805055,1350565816,-1705983957,65535,-1979949429,1975520007,26405123,1996429803,309262,67221584,1354771280,1086736011,-409317346]},{"sector":17,"data":[-16777216,-6633866,184549631,-1914997312,-1705973178,65535,16481920,1183523445,1357435385,1355302541,1342178488,-16458520,95948406,1183666176,-1706027320,782,16285312,837354356,-163149055,-3914103,79171190,230182912,-4698108,1586188543,1074236356,-828747746,-16777214,-1108865418,17230081,687747,922683764,-6680122,721420543,26995136,687747,1183516276,112501518,33701507,-1543168,-6681994,-352321281,172395486,1962934589,19065091,1962934845,15919363,1962935357,17164547,1962935869,21162243,2122562027,494207422,431638214,-792574326,-1153005344,1354385037,-1698662657,550,12601031,242679552,1342178232,1086736011,548950046,-6664192,-1996488449,1586216006,509638,-2080612725,108265535,-389646593,2122515530,58654908,-16742423,-16711626,-6633866,-1996488449,-12732346,-1924565760,-1202677178,-1706020864,65535,-6797687,1183649398,616059034,-6664192,1023410431,611581958,-1207011585,-1706033149,65535,-1207011585,-1706033149,929,-26032,28835840,10742016,305805055,-1698269441,65535,1035486857,376701183,415778502,-2001189238,1183697222,1996443848,-25920,1586167808,4162556,-6683276,-16776961,28839542,-6664192,-352321281,138841013,1962934589,-23336701,1187463403,-1929379392,-11484602,95948406,79187968,2142785536,314068992,163074048,-6664160,-1996488449,-1072972218,-907476108]}],[{"sector":1,"data":[1879492606,-385875957,1183580016,81160,37554292,-373591040,1996488544,23652366,-2080417815,-443874579,-900899553,-1957363702,-1360231956,1485212928,1418103295,74907647,1342178488,1342441912,1347469355,50043472,-2037841920,-1072955526,-1635054979,1204223828,468385793,-1207666945,-1202716668,-11533302,-1946191178,1090475142,597315614,-16777213,62391414,-2037690368,507576148,-26032,1996423168,440324,768080,1354771280,949637200,-16777213,112723062,95965184,-1070903292,-1706012592,882,-8733053,-1925284864,-1979754362,-44410,-1912646474,1358920838,1342185656,-352226584,74907417,1342179000,1342439864,-1957642197,520049286,60136016,-1224802304,-790036654,1975520001,74907612,1342179000,1342180280,1342177720,1347469355,16777114,74907392,1342179000,16777114,-28931840,1354771280,112720,-26032,1996423168,-25858,1996423168,374788,-62485168,-1070903274,-26032,-2037841920,2122579798,645136636,1387724624,309503,27519056,-1207666945,-1202716666,-1202715635,-1957625857,520049286,69442128,-443875328,180829,-2081649835,1187387116,1996423402,440324,67745872,1354771280,1117409360,-1996488700,-1072955834,1996433788,440324,67811408,-25755824,384452237,8362576,1996423168,374788,-364475056,-1130737642,-1962934272,46292453,-1873273344,-326412987,-2082959842,-2091514644,2080638590,108954374,-1207599489,1173028865,957294753]},{"sector":2,"data":[2097802246,-62470342,367722496,-771989877,-1948003869,-1961969098,3737158,1191172468,166502908,2096907833,166510307,83827851,-472783919,247084683,-1996077429,733539072,-310157632,535137026,46812509,-326413056,1443294339,-1559869813,113708730,2540,-1560000885,113708840,3688,49956551,-1472790784,2275334,-26032,1183383552,-1472790532,138840838,-11526592,-15592394,-1928195530,-768869818,-6664110,-956301057,65094,1988827371,-754798082,-1170865178,1446313742,1342178488,-16756504,-324927930,-28952311,-1956716420,113401317,-326413056,-1593643901,104401388,662507112,-15832927,-787585018,65065440,-1995523578,-11469242,-1706032010,1454,98212432,28835840,721611520,1575324608,1426064066,-326898549,-1136227004,-244087,1183647862,-6663940,-1962934017,130481246,-1136227072,-26032,1183383552,108462078,1342185656,721700491,-1705968058,65535,1354516109,721700491,1174666822,1996443654,-25858,-443875328,442973,-2081649835,-11139860,-16711626,-1415969674,-1996488703,-12714938,-1960348672,-1962868706,-772764897,39357414,126492555,1183441962,1958743038,73304845,-1996601718,112647,-1070923029,1575324510,1901250,4718595,10092799,62521603,8126467,61997315,8192003,37683203,10289407,16711683,10420479,31719427,10813695,94306307,10879231,41091075,11272447,91881475,2883839,32899331,1441795]},{"sector":3,"data":[34078723,13435135,91488259,5964031,36896771,14549247,85655811,4587522,23330819,14614783,99811331,14680319,9699331,14745855,8847363,14811391,5767171,14876927,30605315,6750463,18809091,4653059,29360131,6815999,83493123,5242882,96731139,7012607,32506115,5963779,72548611,6029315,25100547,6094851,63832323,6225923,66978051,6619139,0,0,1167120524,518818645,-326903666,-1957210514,19203654,-96040704,12863175,57057536,1964131897,55746852,55842443,1964004921,239483160,1453396853,205928707,-2136929419,105265411,854131573,-661891316,1388298382,47107,-67103047,-950031373,228358,306612992,-1962711389,-2136799674,239504131,-1559210357,378078034,1317733204,1443793164,173423363,92220284,1980253755,1711720228,-1543504125,378078040,113705818,898,-1559352671,-120519820,-1560053597,-890698886,33998603,-16777215,1996427894,242679568,16777114,-129579264,1996426674,276234002,-1710328065,65535,48907975,-362902773,269502455,-14846976,1996427894,242679568,-15960321,1996425846,108461832,16777114,192407808,-689434992,-1572961523,125042694,111689347,-1710721792,65535,-1928635159,-1940404138,-1950314792,47354,-67104583,-950031373,320582,31868615,-92372224,-1591905280,1183386090,167551418,-1577302391,1183387768,277389806,-1578350967,418061170]},{"sector":4,"data":[-1996119880,1183448134,228368826,-1578219895,1183387046,166109676,-1947187575,1200351838,-1035564794,-1961129823,958106134,192221270,1963869753,138906374,-1950202367,1150023798,71772942,-1175042423,-1053066304,1317602166,-1035564042,58114363,1036144265,92078080,1183432755,-163169854,-1992293261,1996486214,-294191166,-1699055873,65535,-1983232375,1755564102,-1032388861,276313855,166344447,120986,-800683776,-624897,1996484214,32611002,1183383552,57582540,-624897,-15697866,-1710626250,514,-1949153655,369486406,-1102673664,16416387,-1465842316,-1593578746,860882594,-1706012480,65535,1183432755,-196703808,-2734393,309788671,-15698177,1996426870,-1207309556,1347485695,1354773328,1342180280,16777114,-1404647680,-1633615872,-1236891379,-545996789,-1995461471,-2069777338,-2045342960,173422864,326912895,1980253753,-92372210,-1958841088,1065399390,1446409484,229162583,-1190426433,-661913595,-947142514,-472786549,-147078397,1263208307,-83627261,-56232963,645946975,-2147284087,-133460954,193595078,-1873375980,-2000791722,-1174762741,-661913595,-947142514,-472786549,-147078397,1263208307,-83627261,-56232963,2122538591,527696122,-1928169729,-1202679738,-1706033149,65535,51491489,-1995327482,-1264457658,-14816495,1183650422,45633680,345657344,-1593835517,100863574,1183387228,240689640,-2084813175,127038,-840367244,-1790511613,-1978305281,-2143513274,1183516787]},{"sector":5,"data":[-398065168,1183516395,-1136262672,11028167,-1136227584,2109752889,-1069119224,27805383,-398030080,2113160761,-196703992,27805383,-1468103936,-1959431168,1979957366,-362902540,1024083851,478019824,-327745712,-1694730497,536,112720,-26032,-125108224,92206907,-337873271,-595687165,722502817,1023627782,58458367,-1996423496,1177268294,-1438217772,16924291,188120576,-1926070336,-1202679738,787939338,512426242,117641212,1342179885,1342179256,16777114,1975520000,-1268872432,1946763136,524255240,-1142357132,242262272,16909881,-1192752523,1975520009,11069699,-150992200,-1962868178,183403504,268181131,1048786691,2113929474,-733574385,-1999092181,1183451460,138709208,-1962228093,-1874424362,-259303594,96074379,-1898411008,-1949856832,65262041,1945582531,55266055,-33881101,1610393075,156008542,-1434549249,-1979351296,938202182,-774613365,-2101181982,-661891325,-91504498,-1962934088,-201545138,1451974571,-2134736428,-661891323,-91504498,1317732528,-1426850646,-1337554081,-1999354231,1183516740,-666465836,16910079,-1961851743,957384214,58591830,2080411625,138819848,-2048326794,-427916544,956986368,343216214,1963869753,-733574385,-1962711901,1183434822,57451470,16416387,77671541,306592001,1586177140,-2138585388,-1531403259,-1070379008,-401698736,1586170078,-733544492,-2021006383,100729730,1183515500,57975772,-1547680117,1183515514,-1069153292,-1962706781,1688458310]},{"sector":6,"data":[56533763,-1962391925,17107542,13796096,-1996269405,-385656298,1183516222,-1236925484,2113994557,16758798,-1982577109,1187493446,-956300860,55878,1083393782,-605486219,-934900479,108461904,-1324502367,636015371,-1706033145,65535,57982987,-2097037847,1962992254,23062787,735725195,50550790,-1559198714,2122515296,57941986,-1198500629,-11534291,244382326,-1962399256,-1996266466,1258511902,92309446,-1981558483,17007239,1183567430,57451470,-1593611613,961020162,511570502,-150992200,-125046162,268181131,1174290179,1578535689,139802627,-2008415118,2122516565,108265722,-1560058719,2122515294,58000612,-1928990999,-11483066,-68565386,-631338235,-1948629249,25867390,-259267542,1965096579,-92372172,-1593478144,65737134,-1995550047,1586214982,-1981558316,17007239,-1365129146,-1371109103,-1949284863,1191171166,-2138585388,1474895877,553550596,-25094532,276627584,296492683,-467009398,1034831497,225771775,112726,-401698736,1183385430,-92372050,-1962576896,619425350,2082537091,-2130804458,-1961853696,-1978773474,-1981535744,-12732346,1443656960,-1873756109,119859214,-1950857591,-472787874,58886025,-1949809151,1174515270,-732001328,-1949022465,-2138601274,771654405,1183527294,-800704046,2122523262,57934050,-1946246679,1346950214,185045992,-385649216,2122384565,2080440276,78375171,15091399,-1959400704,802246,-1545010315,-385647104,154993930,-385649408,171770299]},{"sector":7,"data":[1035172864,58654731,-352088087,-733020247,699942539,1183565894,-800708178,968246923,57989702,-2114008343,16766078,2122551421,57999556,33211625,1183558726,-1408891988,-1270445809,722312865,1183427654,-1001994314,401145856,-733020164,699942539,1183565894,-800708178,1208025761,-1192081783,-1202716627,-1873805311,104654862,1003505155,58643014,-1946207255,1183434822,-732001358,92309446,35514633,-1949020417,1177139270,-1371108408,-1949284823,2057551942,-196738301,-1560054621,1183515512,100899290,370348164,1487081606,1511426307,-730398973,184981480,-385649216,1654718628,-1560170493,2122515298,57934074,-956265751,3057222,866547455,244338880,-1996111384,297312838,-1674643712,-1037330163,-1952843567,-101211570,2097209149,-1207702782,1183383775,-732525660,92324481,-1898410921,-1963291712,1317774918,-1426850652,-732525729,-1031675183,-1940454526,-1950314792,-1572434950,-56340853,-1956664333,1174656070,56533924,111294207,503677112,-1535705264,16777114,57451264,57149127,-1947664384,1577502467,-385875965,113705858,66428,1219249803,1476788633,1511395587,1611056899,-2097151741,1962993278,-565802219,-1948236151,1688458310,-934900989,-1546762615,1183515500,56533972,-1545845109,-1108802700,-733020164,699942539,1183565894,-800708178,970081931,58511430,-2097042199,1962993278,-565802222,-1948236151,1688458310,-934900989,-2083633527,1946477694,-934900467,-965279920,-402229505,1183515434]},{"sector":8,"data":[-1304000056,-3115265,-16127434,-1710196682,944,-341948791,-163149013,1923106361,-1605990141,966674059,343056454,79578755,704792458,468452,-1996487675,652993606,79578755,-1950458229,-1605990137,-915030005,731793035,47233490,-503844361,1183432963,-465123424,1996423172,-294191200,-1699055873,2416,2127054393,-934900989,-2084157815,1963254910,-934901482,-6260993,-15697866,-1710626250,2512,-1949284727,1183434822,-733574198,-942258551,56902,14829255,-431569152,1183514624,56533972,-1547155829,1183515500,57975772,-1547680117,1183515514,-1069153292,-2096924509,1946278526,242262377,16909881,-1662515339,1958742787,702553,16920311,-276563829,-65107190,-2093022449,66110,1183453054,138774744,735331979,1166596166,180847369,1452295821,-1947169961,375295,-1064380276,-645150837,-1023155247,125040443,-217887925,-201458941,1583348901,16910079,179835627,36632320,-2080863487,512428783,1057165308,-1999354230,1300236357,1586233097,-733544492,-774349175,-934900765,-1984805333,-2096921977,343214590,-1090740759,2078867616,-767128581,2127578681,-64034557,-2851199,-385647616,1988754477,-632910878,-1716763133,277087747,277222931,-1996269405,-1962714602,1822672966,-733574397,-1962713437,1956895814,-1069118717,50559651,2024010822,771654403,-24967820,-1961331425,1183440454,-733574176,-1962711901,1183434822,57451470,-2080626199,1962993278,-565802215,-1948236151]},{"sector":9,"data":[-1555508154,1183515492,57451464,-1984412117,-24916410,-2096794614,1685392382,547112647,-1669923072,-1862633729,42526734,-1965793653,-1752654762,-472840833,58754953,15105667,1177226869,1812332984,-733574397,56927048,1946877571,-98637565,16416387,1688274548,56533763,82083459,2062091124,-362902534,620840842,1183383555,212452,1642820724,-941734145,124486,-1946447383,1174657606,100899244,370348164,19730566,14320384,-1996269405,-1962714602,-1555508154,1688404830,-599356669,-1962707805,2057551942,-196738301,-956073821,16998406,-934900992,-1984412117,1822674502,-362902781,620840842,1183383555,1958743012,-934900467,-864616624,-402229505,1183514678,57320396,-1546238325,468386686,1962937661,-83498749,1962942269,-79304445,1962945853,-26351357,1610259433,49120094,1562371467,969293,-2081649835,1465255148,-1962385781,54336583,1028879360,745799681,1946157629,474433,1451962741,39267078,1175353227,56899131,-1132453507,1949173120,736547098,-788299116,-387234066,721835659,-771029417,65602431,-2080714495,58589434,-385830423,1451950326,106375942,2139352555,57999384,-1962875415,1462437462,2144471814,14215427,369170177,1049297772,-141884572,92325761,-964565295,-1957559422,1334548930,-1543899368,-1992293518,1451883590,113662718,1325466481,-1064380276,-17923,-1359863632,65130817,-28931087,201215743,-15174208,-61408178,1015236166,-1946586112,58863046]},{"sector":10,"data":[1593698513,-1962712158,67238982,-92024789,-2095284480,2114001023,1190942307,3965766,-963905164,-788299219,1671585512,-11670781,-1511319473,-1031071999,17057527,1377924352,94419026,-1674117296,167025165,-11534336,-15697866,-1710626250,3498,1510497931,-2096609535,2097155711,1746272518,-1962284285,-472838561,58889985,57415169,-1956749316,113401317,242262272,375193,-1958675977,-63504400,1879442191,1357510414,-1705983949,65535,74825739,132890675,242234881,-1023409736,1167120524,518818645,-326903666,142508804,-2094891232,2099185790,142508812,-2095219703,2131560574,108954391,-1157270528,669716910,-351382853,142508322,142344320,-956539251,334233351,425603,512427636,82514348,240131723,-2146935293,1131806527,108954451,-15174656,-1928943562,1343621190,1342177720,572826,-1341773056,-15275247,-1928945098,1343621190,1342177720,951706,1409690368,-1072997618,-12777604,-2013102848,-1979389177,-2082199033,-443874579,-900899553,-1957363708,-661891092,-2101362546,72256259,-205507588,1073837487,1575324511,-1946156350,1430622424,-1910575989,-264338472,1735720961,111296131,-1957595904,-16560610,-6671753,-1560280833,-1073019230,-1202700684,-1706033151,65535,55451275,-1204652033,-1706033128,65535,1962934845,112645,-1070398741,184982691,-15633216,-16342474,-16346058,-1710845386,65535,111689347,856192256,-6664000,-2097151745,-443874579,-884122337]},{"sector":11,"data":[16973842,134928,196610,16711892,16973855,134980,16973833,131644,196618,16712634,196779,16712713,196653,16711873,196786,16712499,196795,16711960,196796,16715603,16973887,134911,196660,16711933,196837,16712297,196710,16713140,16974054,134944,196688,16715192,16973932,134813,196699,16715264,131,0,0,0,1167087646,518818645,-326903666,138868228,-2095549439,1930036862,-339727612,209125202,1343112845,16777114,-1924863232,-1202713018,-11534296,244319862,-1996442648,1183710278,246960142,1183535104,-62510330,-401698736,1174470696,239504892,2734160,105286480,1358710315,-2048389488,-62521088,-2080618869,-443874579,-900899553,1478361098,-1957345904,-661774612,33877121,-24736426,1996443901,-26104,-2037776384,-466944514,1983508619,-1962577146,48956998,-1072970101,-1070922637,1983450347,-1962577146,48956998,-2037791093,-2037514756,-1957626369,939461214,-33769729,16777114,173968128,-33782133,-2037709055,-2090926596,-443874579,-900899553,1478361094,-1957345904,-661774612,425603,1586173054,-1977644278,126355526,-16097653,112647,-1070923029,-1962742397,1297948645,503318218,1430622296,-1910575989,283935704,173968214,957193889,58462791,-1962827031,172264435,2114471737,26601731,84690827,1183384960,308251638,262944395,-467009398,1039156873]},{"sector":12,"data":[57933825,-167736599,17828102,116796021,1963069449,138868259,-1955171327,1200294494,100899090,370348164,372969606,1635714830,104531580,1500710668,-624897,-15828938,1996424822,173968136,721485752,-1873802169,-28514290,-151763319,1946224710,-96040699,-21476629,-163149559,-1203862704,91619085,-352321096,230203651,108461904,1342177720,-1207279989,1194000639,244338700,-335670808,-159973428,-1962379521,-4715938,205990656,-401698736,1183383789,-196703750,-16097653,1187451463,-956301070,64582,1586174699,705137398,28856548,1973047296,16777218,1191178822,-163119108,972703371,-562234298,-1962254709,1191309894,138868232,-1962380287,1183445574,-952701960,63558,-1962254709,1183386695,-1961300996,-2020934562,-467008128,1354771280,16777114,-129629952,-1946401025,1200294494,-196738292,2147239483,173968346,-1978900597,-2021068730,1586169216,209160970,-787724289,-129594394,58885257,17456779,173968135,1150022539,138885386,1827210111,277127678,277223051,55842361,104401781,91554642,-352321096,-339727602,173968138,1984455,1592650496,-1962742397,1297948645,503318218,1430622296,-1910575989,82609112,1342850701,1342188216,-1878624513,-35723250,-2080618871,-443874579,-900899553,50332678,-16739840,50373120,-16767744,50374144,-16723712,50342912,-16635136,59136,1167087646,518818645,-326903666,108461828,1358710413,1088949904,1958742784,458793227]},{"sector":13,"data":[1039943211,394067983,723212449,255720518,-15107072,244382838,184596456,-15895360,244382838,-1207886104,48955393,-310132693,535137026,46812509,-1873273344,-326412987,-2082959842,1448544492,2122972971,-1003058180,-2129728751,2147418748,-12123787,-964428730,458793225,2096907833,637162,-812912649,-1056710191,129095563,-1039932717,1929922107,163071779,-1947207936,65130959,-1311274047,65196807,138820546,1586227058,725584134,1327688640,-150992456,-774927377,-1950284831,-754470441,1002570722,-411891642,106859335,28852105,-2090902016,-443874579,-900899553,1478361092,-1957345904,-661774612,1443294339,16533191,726133504,-6664000,-1191182081,-369688567,906227851,2088833476,1954545410,105182752,-15698943,-6684044,184549631,721712576,-14488640,889127540,16777114,2080833280,461152539,-16497527,1183579206,-62506746,28881276,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,-1957294356,-1995324362,1187510390,-352321286,41713986,896827391,1962440249,1996445219,637176,34904656,727056384,163074240,-6664192,-956301057,2147418692,-16235322,-1963434357,1200159302,-129596664,164004617,-1577433345,1178147672,-1867088646,7792654,688277131,-1592043514,-523166888,268084032,-1323607903,-1981754617,100922950,-2069689880,636955,458764023,-1979833280,922745926,-2069818940,-100269285,-31178737,1343341731,-1694730497,663,16777114,268083456]},{"sector":14,"data":[66987072,1174664774,-230258180,166213375,4241488,-26032,-2090991616,-443874579,-900899553,1478361090,-1957345904,-661774612,1460202627,-1003058346,636945,458764023,1183434243,-96024580,971702272,-16614271,-1976798081,-467007420,2117728395,-1323535110,65065735,1342826502,-738572661,-402258976,-2135404535,-6664192,-973078273,-63420,-964429242,-59361015,1600045687,-1962742397,1297948645,50333643,16922113,50333184,-16700672,50371328,-16639744,50371584,-16673280,50342912,-16696064,50391296,-16708864,50391552,-16669952,27392,1167087646,518818645,2122438798,1963003916,1354771213,16777114,112640,2122407403,1963004172,176063258,-2096729087,1963068030,242679599,1342177720,16777114,-2082804992,1963330686,176063263,-1962511360,-1264382394,37651206,141819906,-1710590209,65535,401326123,151813763,2122577525,-260833270,298202879,16777114,-2082084096,-443874579,-900899553,50332682,-16771840,50371072,-16762624,50371840,-16747264,50372352,50355201,18176,0,0,1167087646,518818645,-326903666,512448018,529207074,-150989128,-1961739730,205556720,-1913633143,1183445574,205949934,1962935869,9758979,1946159421,1064316,-219610251,17841408,289213044,-385649407,1961558167,-1705983957,65535,15761027,884475253,-1962546417,126611550,-1946401143,109020120,-14715649,1183647351,-6663954,-1962934017]},{"sector":15,"data":[-230504720,242679552,1342178232,384976525,1996426219,243726,17217616,-6664162,-16776961,62393974,-6664192,-1207959297,-1914109951,176063232,-16157696,-1710111178,65535,2062270507,687747,1183516276,112501518,33701507,-1477632,-6681994,-352321281,172395487,1946157373,146695,-789888652,1343210168,-1207011585,-1202716669,-1202716671,-1202683905,-1202716671,-1706024950,65535,141934603,191891143,-1880424448,703073936,1310624512,-2146961917,-6683276,-16776961,28839542,-6664192,-385875713,-2090926227,-443874579,-900899553,1478361098,-1957345904,-661774612,1460726915,572427094,-1205892337,787939350,-125103558,-1995423349,1187509830,184549620,-385649216,-661978999,126558091,-940423543,63558,-1946788213,80118583,972179083,1065220166,957334177,-2093976316,1962996862,-129594596,-230278336,1755386740,1779862299,173291803,92214652,1980253241,38046478,-1996204917,1451883078,-11998212,-964429754,-2084967674,1962996862,-196688121,-1611988991,-150993224,-259263890,-1962479997,923006558,-1593522557,70848450,20824956,-1593215744,378213222,-1142221976,1344276408,16777114,-1958221056,-1962717666,1452014150,340232700,1377195913,-26032,512425984,1204224846,721420296,-1706012480,65535,-231681,96008822,-6664192,-1996488449,1451883078,1380995836,-26032,1599995904,-1962742397,1297948645,50335435,-16755712,50371072,-16696576,50371840]},{"sector":16,"data":[-16728064,50372352,-16625920,50340352,-16733440,50373888,-16745728,50374144,-16707584,50375680,-16640768,50343424,-16629760,50381312,-16699648,50381824,-16622080,50356736,50388737,50349824,-16634368,50362112,50372353,23552,1167087646,518818645,-327034738,1448542800,253894283,381165451,976156416,-1946645742,-388954559,-1996488411,1187510854,-956301068,63046,14567111,-297351424,62390272,-6664192,184549631,-1710721600,802,-16156951,-1206878154,-1706025418,65535,1023821451,58032136,1023445993,58032174,-1593795607,378215272,648223594,672565523,460103955,460199563,-1995408733,957381654,2115725846,11659523,104401276,57809768,-956258583,129606,-1961138015,-1994692074,-1979854202,-142186,1376926262,1354771280,1342177976,16777114,261928960,-695825072,95965437,1134186496,-1711276031,65535,55195391,-1705983957,440,191905411,-382897152,922683507,922688362,922688360,922688362,832183144,-385875967,922746725,922688366,922688364,922688366,-420799636,-36391169,-36522241,-36391169,-36522241,16777114,-695825152,-289910531,95965193,-6664192,-352321281,-26070,62390272,922701824,922686010,922686248,-1070918874,-4698032,1385779455,1354771280,-660975536,-1879048190,140437518,-940816759,214534,-1375287552,-2097151985,749630,-655817868,1958742791,320774451,320870027,-2097143803]},{"sector":17,"data":[1822621906,1846970651,459842331,459937417,55195391,-1705983957,65535,218529409,-955943552,-63930,-1727129439,320734723,320869907,-37452151,-37316983,-1996077429,1187508806,-2097151748,122430,1048774517,1946157552,105301765,1048838143,1962938286,-26107,512425984,931860542,-1323604319,65065732,102665200,38272768,-37058931,-1700704234,-1957674993,1143672388,922701836,346099726,239352080,1149964413,-1710298354,65535,-385464695,346161022,-6664176,-956301057,-16554490,108954623,-385647104,1183515978,-2146943738,1961427829,-2146878207,-18283659,-2146616059,233374581,-2144453371,222127732,-385649278,512427460,1342111750,134211586,-1961679199,957556758,1963699734,-1408878327,-385649397,28837548,922701824,922686010,922686248,-1398729946,-1374254325,637938443,672537363,-1202695661,-1722744833,-1070903214,-1706012592,65535,1342178488,16777114,111143168,-1961138015,-1994692074,-1979859322,-2080522090,1946214014,-532247796,-1098514023,-1063906819,321692157,321787531,-37710279,-2065104003,956727040,1929232006,-25988,512425984,1342111750,-562134270,-15633408,1996482678,-529072154,-955530008,56902,972834443,108981830,-1980873077,2122579014,92013308,15615687,1042189056,-1958769904,-1323604450,-1948003580,1093263430,320774404,320870027,-2097143803,1822621906,1846970651,459842331,459937417,-1947842933,-2037782442,-1769341500,703200710,976682756]}]],[[{"sector":1,"data":[-1061748974,-1095303171,1354771453,1342177720,276634,-1407284480,-2012771825,-939672954,33406086,1947024384,13691139,167870336,-941030540,-1132003584,-1165572355,-1142355203,-997815552,-963212291,77309,-1996432765,-1979859322,-2080522090,1946214014,-532247796,-1098503783,-1063904771,325493245,325588619,-37710279,58527359,973014761,1946009222,-16914173,305805055,-37701889,-37832961,-1202667477,-1706033151,1153,262938251,-2037905526,-2033713734,130492,1282738748,-1961662815,957573142,2097004694,956727103,1996340870,976682807,-1098478830,-1063875587,77309,1375787651,1354771280,1342177720,314266,-1407284480,222265359,-2030104971,-1367081540,-2097021506,16629918,305805055,-37701889,-37832961,16777114,302446080,57937931,-103703,-15582666,-147274,738049718,45633728,-979742720,-2147483648,-1089495258,1343200440,2011696784,-562134266,-1960283136,-1711424378,2145932859,990215224,829941318,-37976437,-2116008447,-2146957698,697901941,1444537926,-1961169944,-1946304890,-1979858794,1451877958,-1132033048,-532248067,31344327,-62470400,-2037710846,1143733694,-1199142650,2109737981,33483011,-38093184,-385649398,-1098907143,1963785658,32499971,43138691,-167152129,1963000388,31451395,49184387,-689372292,102664961,38797056,477082,-1266251520,-1841396739,192282370,-35617139,154265680,-1948105079,-1961869794,459710775,-523041615,512487427,1207894022]},{"sector":2,"data":[-1874951422,545128450,134643329,-15108736,-1979543538,721271430,-1070903068,-26032,-2037841920,1760296392,-38238581,-37976573,-38631799,-38224245,-50075695,35712897,-2037840501,1048837576,2080375442,-1195474115,914096381,956581003,2147332742,-1299805395,65065469,35663301,-4696240,-1299830016,-677752579,-1593835520,-2043084142,276692408,-37976437,43124265,113706731,-64878,16154243,-2037708428,1174535624,-1962087452,-1979856762,1187505222,-2097151498,16626878,512439412,1342111750,-196688126,1083834369,-1996488702,1178333254,-2095811322,1962996862,-70522621,16008903,-263812352,-1946434071,-16775650,1187447367,-2097151754,2113987710,-26050,2122383360,1971324934,-465138924,261752361,-1559258463,1183517618,-897177116,-897151491,1183535357,1356396516,-1705983957,65535,16777114,-465138944,-1948105175,60359748,1410532932,773208840,2131590163,738605830,-1207602669,48955393,-2037792725,2122448310,1954557446,1975520004,-1199142113,263677,2097431611,-498693352,261752363,-37185909,-489487439,91669051,16533191,-1229028608,393478397,705694624,104548580,192289638,17974518,1187448181,-1962933252,-16775650,-6684081,184549631,-385649216,2122578907,57934068,-939797783,128070,417690,-263812864,1946568251,-71440125,971916939,58719302,-1946226455,1183448134,-1845049362,-369099006,512491233,1342111750,899074,-2037559216,-1873740342,70969358]},{"sector":3,"data":[401035,-956151809,656966,401035,-16625665,1996424822,-897151502,244338941,-1996220440,512490566,931860542,-1323604319,65065732,40141040,135168254,1721827600,-364476133,57982987,-167735063,34605062,178266997,736373264,470156242,504763152,-963233008,-385649667,158793889,-37452229,-1763114121,1354771200,-26032,922681344,922685474,922685472,922685470,-6680548,-1962934017,-1961869794,1713277759,-754667237,104958435,-955756151,261190,1187470827,-167769082,17828102,116787829,1963069449,-11998973,19610,102664960,38797056,-939656983,591430,-2080427543,1149964526,1141086468,139727622,-316011382,-763117309,-963233024,1997632253,-997836026,-2146863363,-130460,65792590,-1961834877,-1072956346,-1226243203,81405,-1360460929,146941,-1494678659,212477,71108734,-379948032,714800537,-16777207,244378230,185086184,-2091420480,1946418302,91331124,-1073020928,1183525748,-754667030,1042189280,-1996029168,-1946308474,71797720,105317273,990402323,2132503062,990280741,1998284806,-364475619,244338752,-351803160,162437649,922681344,-1070922934,15243856,922681344,922688362,922688360,922688366,28842860,-6664192,-385875713,648150293,672566035,2081831187,958690576,1964014086,21666334,2122514432,326435066,253894283,381165451,976156416,-2131195118,-939719071,801798,-1203862784,427032582,276838143,1344157368,16777114]},{"sector":4,"data":[-1070903296,-6664112,-352321281,110270981,-1229455360,-289910769,95965193,328880128,-956301306,16915462,-2090902016,-443874579,-900899553,1478361090,-1957345904,-661774612,-1592988541,378215272,1183390570,-61437446,-1995235677,-15523818,1376926262,78223952,-2002714624,-1978234085,-196703973,-1577691511,78711570,19261651,-129595136,166594295,91554304,-352321096,-1547687166,645927452,-1195439631,-1873802770,18409486,236455623,922681344,922686010,922686240,-1070918882,-21475248,-1070903169,548950096,1347590400,16777114,320774400,320870027,-2097143803,-1398603566,-1374254837,-1845049589,738197250,-6664000,-1962934017,-310118330,535137026,1439386973,-326898549,2144262,236455467,-1191557495,-11530708,-1710352330,65535,-1979955575,922746454,922686010,922686240,548934430,1347590400,-11485141,1996488310,236495356,-1706012007,65535,721428664,-1727129594,195823145,195958297,47843015,113704960,4912,305805055,-1727129439,320734723,320869907,1183535186,1347590650,1347469355,16777114,809403136,175374355,321920651,704267915,113706055,66266,-1961136991,-1558483434,378077844,113705622,744,246955651,-1710918400,3402,-1017256565,1167087646,518818645,-326903666,263632902,108461904,1342180024,811930,1958742784,-1608610982,-1960867055,39291655,-1980086647,-1935541162,-1911125246,-61458174,1178142069,-1205308166,-1202712002,-1202712650]},{"sector":5,"data":[-1202713176,-11534326,1996487798,210803450,1183514624,-61436934,-1996321629,-16609770,-1229453706,95965199,-1583722496,-2097151988,-443874579,-900899553,1478361090,-1957345904,-661774612,1466887299,406750038,58466318,-1962789912,-15853538,-1978787834,-2021127610,2122321452,158599690,202014336,-1427569804,-18432,-1560058205,251593374,922684952,513872442,538348307,2098451,1375785603,167680592,2123169792,184729234,867763990,-5901824,-401729530,-1564934583,1183666193,922701970,1183650642,-860335982,1723355152,-6664192,184549631,-2096335424,1155646,-1699216012,-1207702529,-1957691290,-1961779170,-1962439905,-2002582953,-1978234622,-1706012158,65535,1351763597,1343278264,1342190520,638874,976682752,-26094,244318208,-939711512,326726,-2097062935,1186878,-135724171,176062464,-385649397,2122318062,58001674,-2147424791,1964968574,14477571,218791552,-739703947,-1908505856,57933840,-1711224343,2259,705185418,-1070903068,96377424,1183383552,2126515194,108461836,1354771280,442522,976682752,261792016,-1969139648,1510353680,1183666190,-1202711032,-1706033151,65535,42993407,33179275,-1592813050,-1297936486,113613323,211877888,-1710868206,-955745265,261190,-1711228951,3492,1299562507,-1994692959,243988550,-316010485,1925266249,10152195,57018055,2145976319,1042189060,-1960867056,78772342,1487005395,1511426819,407910659,1077478773]},{"sector":6,"data":[-1710328810,3587,1685438475,-352320840,-339727518,-62470306,1525350401,303840899,-2096335872,1084990,79184244,-951784704,-16554490,70052095,-1962716511,956519446,2082171414,956727078,1914398726,56140062,56235659,459937337,108794239,459802169,-359003789,184549384,-1207601728,65732611,-1996488264,1183579206,-2090901764,-443874579,-900899553,-1957363706,82609132,1343106232,1342185656,699546,-62486272,-108919,-15582666,-15523786,722673206,1347440832,-59310254,-1728044872,-660975534,-2097151990,537635846,195958403,-637090048,-956301310,1257478,976682752,503743250,377692179,-16772320,-15523786,722673206,-1202696000,1385758752,185965136,1048772608,1946161968,807308040,71795475,-637090016,-956301054,923654,1575324416,-326412861,-956109693,-16554490,54323455,1342407352,-1207666945,-1706032897,3019,50555553,1343265798,269367039,16777114,-28931840,722673313,50549254,-1559357434,1183515282,1575324670,1426064066,-326898549,-950642920,63558,721700491,-1995565050,60422726,1444087366,538327816,997094675,1964187142,-92372120,-1962246400,103351366,-890696168,403097345,-1593835506,378213158,1446581032,2084077320,105265413,-1070911117,-1979824503,648150086,105261843,-1946663287,1451951686,321299208,321394313,-1995685213,-1962130410,697956422,420195334,-1962168810,697956934,420683270,-351068138,71732040,105251737,721966611]},{"sector":7,"data":[453749766,-1995723242,1451881542,2094140406,184844070,-14649664,-1709473226,65535,-1979955575,1183579734,-129594892,32921227,286292486,-1961853930,1183384646,-129594374,2130331193,-96040177,-1711782357,195823145,195958297,16285315,-337050753,1488896,305802999,1049352331,1032523554,1183383947,-2585614,142016311,-1710852353,65535,-1192737143,1861681164,-1947169816,923005534,-1996175741,1150020214,-2132225788,1183416292,105155564,-1995942773,1451880006,175932400,-1957989120,-1952843706,1552616524,105786126,990404123,2134342874,1925724932,-2110324943,-25755877,737965823,-11513664,1183575158,-262763538,319178243,69929046,1375884315,-129594544,-1706012007,4355,922690539,1996430210,-59310082,1347469355,305805055,-16222465,1183516278,1347590648,16777114,205431040,1946157629,212243,1183521397,100768248,370216006,216730696,-1711782261,206571009,206706193,305805055,-16222465,1183516278,1347590650,1350565816,1347469355,1637503056,1577058314,1575324511,503318210,1430622296,-1910575989,250381272,1042189142,-1959294192,78710342,-268181293,15877831,1711720192,-253,-15582666,1962870900,1354771206,270939903,270808831,1342179512,16777114,108432128,-422378319,-1961834877,51396126,105286455,185502272,1005398544,-163351615,1946223172,56140060,56235659,1963480121,105134352,1149963125,205794062,1962820667,40140833,56140286,56235659]},{"sector":8,"data":[-1996077943,1149962324,205784062,-955366263,127558,1183658219,726669044,922702016,1149964302,205794062,242548560,151450,876019456,-196702960,-6664170,-2097151745,1283461358,922681602,1996424010,1354771206,16777114,-230257920,49120094,1562371467,182861,1458342741,305805055,272506507,512440203,78715750,1895818195,108068616,-11485141,-15718858,-1206901706,-1706033144,4433,305805055,1343207096,1342177720,16777114,-443851264,2802525,244711427,1966335,204603395,2031871,299565315,8323075,137297923,2162943,24051715,2359551,157941763,2490623,4390915,2621695,48300035,2687231,238354435,2752767,161939715,655363,6029571,786435,191692803,2949375,270270467,3408127,248774659,3670271,221511939,2162690,154533891,3866879,306249731,12255487,217317379,4325631,135921667,12714239,219480067,13041919,212467715,13107455,263979011,4718847,140836867,4784383,161284355,11075587,249888771,13304063,278396931,4980991,14417923,5636351,17235971,6422783,280821763,6488319,176357635,4521987,305135619,6619391,61931523,6684927,218234883,15139071,298647811,4718595,123797507,16318719,33685507,16384255,224395267,16449791,189530115,16515327,240844803,16580863,156172291,16646399,195952643,16711935,301006851,16777471]},{"sector":9,"data":[1167087646,518818645,-326903666,-96039674,-26032,1183449088,-1176229123,-503906204,-1961398087,-96040240,-628366294,-1023155721,721178250,-2084502547,-443874579,-884122337,1167087646,518818645,-326903666,-1588177132,1183390566,1042189294,-1995994352,195096646,971254288,578022982,-1309772149,-1649916,-14980554,52127798,-396955530,-1073020406,1149962356,139758342,1988842219,-330905616,195035136,971254288,628354118,459945727,459814655,31516758,58048523,-1962896919,1722018886,105155355,-1995942773,1451882566,269197562,1178199082,-1206422804,-11527322,-14980554,-1709479882,65535,-1980217719,512490070,931860542,-1323604319,65065732,38074096,-2091551742,1795646,1755401854,1779862299,139737371,1144603253,-2093124346,1156976878,829686018,33703158,251603829,1149967206,139758342,-1980217719,1419442774,-2147483647,35352590,35260103,602603521,-2081667329,1240010950,281445375,460326646,-1708559358,867,460334720,436652029,-16777214,-14980554,-14981066,-14979530,-1206162378,-1706033151,65535,305805055,-362753,-1070860170,775356240,741801747,571411,-26032,-1070923776,459841872,1358448171,1343199928,16777114,302394112,1745224464,-1677327613,261792528,-1560053087,1990265314,165716739,57949835,1043986475,92078968,-352094047,-1547203838,1856049990,302818051,305805055,1343207096,1342177720,16777114,1042189056,-1591768304,78715750]},{"sector":10,"data":[-670834477,722356107,-1559633402,1453396106,1543897870,-196703986,-1995548511,116912710,-16773190,-1163845516,1023419407,208896000,688514721,17861126,183235654,17426081,17861126,1996485190,2050424818,39950851,1996423168,1947110388,2047748867,-125087485,16777114,1002898176,2114155526,112645,-1070923029,-955216221,17804806,-2090902016,-443874579,-884122337,1458342741,-167479669,1946223172,105155418,956847243,1333528662,1178142079,-1958186490,60359748,1410532932,139868936,92023935,1996899899,321691941,321787531,1963480633,105265446,1149968757,1141086468,139727622,1963480635,105265938,346099061,239352080,28837247,721611520,-443851072,442973,1167087646,518818645,-326903666,55417358,-1073020928,1924675188,-6664181,-1996488449,-12715450,-2128644865,750654,1023964417,58064892,-1207895575,1344146290,1347469355,-26032,1183514624,17885690,-1209528688,-129594884,16777114,1975520000,-401698631,1177287846,1654264,-6624654,-16776961,-1207743946,-1706033151,65535,459945727,459814655,460207871,460076799,1342177720,96410,62233088,-1073020928,1978205044,-972634113,-16777210,-14980554,-1709479882,65535,-1705983957,65535,256922,1958742784,-11605757,263077507,-1878690560,-59447282,16777114,-1177408768,-235470838,-1862908279,-64952306,-772387189,-1983380503,110818382,184549379,-385649472,1048837912,1962935992,-18427]},{"sector":11,"data":[28857067,-6664192,-1879047937,-68098034,737298057,1178334278,-1697680650,65535,-1980610933,-1024723898,1342927544,-1705983957,65535,-982138869,504066744,1354771280,983191632,-1207959549,1344146290,16777114,-21894912,-1962742397,1297948645,50336715,50610945,50359296,50613505,50360576,-16721920,50369536,-16668416,50370304,-16537600,50370560,-16535552,50372352,-16626176,50375424,-16551936,50346752,-16649984,50379520,-16699648,50348544,50580737,50374912,-16673280,50357504,-16544256,50395904,-16507904,50396160,-16545536,50396672,-16575744,50397440,-16772608,50397696,-16502784,50397952,-16513280,66560,0,0,1167087646,518818645,-326903666,142508816,-11438848,1996427894,242679568,16777114,309788416,1347469355,-1961998709,19730518,14320384,-6664110,1375731967,1354771280,1342177976,109722,261928960,-263811760,374864,13867600,1719664640,1183694835,138840560,-1710721281,65535,-15960321,-6681994,-1996488449,1451883078,108954620,-1202424832,-11529822,922682998,1996428114,281851910,-401698736,-1073019856,1048775796,1946161570,-6637563,1723335659,512446464,529207712,1468729227,42509058,42604169,244338770,-16700184,-860354954,867717136,-6664192,-16776961,1996427894,242679568,1347469355,-59310256,-1946519809,1385761350,-26032,-310181888,535137026,248139101]},{"sector":12,"data":[-1873273344,-326412987,-2082959842,1448572140,-1928113503,-259289986,867763990,-1582960128,1178145338,-165579510,17828102,1183517044,217064604,-166794490,34605318,1183517300,217064604,-1673099001,234636998,184370886,-1091404147,118884846,-234879559,-177831771,175570879,-16222465,1183647350,45633788,1183666176,1183666418,244338828,1593737704,49120095,1562371467,445005,1167087646,518818645,-326903666,-11118834,1996426358,142016266,-1202667477,-1706033150,65535,-1091404147,118885256,-234879559,-177831771,-62470465,-45693427,209125130,-16091393,1183647862,45633788,1183666176,1996443890,-401698810,1600060954,-1962742397,1297948645,503318730,1430622296,-1910575989,250381272,-1070901673,274631504,-1710983169,704,-1309129079,65065735,-1995839482,-1041630650,274631424,-1995946101,1200354374,-230258426,440656,1089750667,-150452343,-1037329943,726726865,-6664000,184549631,-385649216,1586168064,-95974404,-1946396789,440520,1861737099,-1946973196,-226587688,159989131,-1962774135,1200296030,-228685052,-930406517,-150993224,-259263378,721701001,-6664000,-1962934017,1200164958,274631428,1991,-955228533,8061511,687747,1183516797,-1982269686,-1070921146,274631504,-1710983169,65535,-1309129079,65065735,-1995839482,-661915066,-1946388853,1418459716,-1995994628,1586168407,38243088,100288003,1183383556,50826230,67500614,-62486272,-11485141]},{"sector":13,"data":[1183709814,1183666422,1996443900,209125134,-16091393,1996425334,-401698810,-1073020863,-51838091,637182,-1946652937,-1004631056,105414673,274631425,737953419,70122054,-1962440448,1183518814,-96064522,-1996487635,1599996487,-1962742397,1297948645,503319754,1430622296,-1910575989,116163544,176063318,-1961394944,126554206,-1962932731,121311838,1183516790,-1982269686,2122517062,58654730,-2097089559,1969621630,241077043,1474435,1187456372,-2097151494,2098068094,-92894438,-422378831,-2096210293,1962940024,440700165,1191123179,-941560838,1444422,-15829249,1996426358,-26102,1183383552,2126515196,-62456061,-1961730421,-62510329,-1961861493,113345295,1131659579,1474179,-1070922379,-16729111,1996428918,8435732,-26032,1586167808,276204308,1149973643,-61568006,1468598153,308185858,85214859,126419071,-1961861493,67441734,-2096658176,2113993854,274631481,1988829067,-62485742,76219433,756303403,1200160772,308185860,1325342603,-62485764,1996425096,308185870,1346373515,-1694730497,65535,1586173931,-954234096,-64441,1586170859,-1959294192,1149894212,274631428,1183522699,139889414,1468598153,274631426,-1962539133,340142855,-1728052179,-150993223,341740537,-1199618168,-2090991615,-443874579,-900899553,1478361106,-1957345904,-661774612,1443294339,84428427,1183383574,105286652,-1996483067,1586231878,-1959293956,926546526,-167038859,1996429429,108461832]},{"sector":14,"data":[1342203576,251546,1975520000,112665,1586176747,-92894212,1418396811,39270658,121177205,-1070922636,1182993131,1182991612,-1226111750,49120094,1562371467,218417741,486540032,520158976,922747648,553713408,1929380608,704708352,1946157824,738262788,83886848,755040005,1442841344,939589376,-234880256,1275133696,201327360,-721355006,1157628672,1711341312,-1895824640,-201261310,234881792,2130771716,1191183104,-2097086718,1744831232,83951360,1,0,1167087646,518818645,-326903666,-1957275890,1988692086,1979059196,229162499,704791690,-754404892,-162624544,184608128,-163149375,344653860,-355267919,4186753,1183433227,172395510,-1962930395,-511641522,-1983837200,1150023750,-1947676410,2145878520,-2134408960,325391,-2130414334,-134479897,1962999812,-1605372,38074365,74776832,-16783487,17188086,-410975115,1183580031,992760,-427763829,-754667249,-1983771678,1183578182,1958742790,81188,37554804,1024095232,1064632323,16533191,-163148544,-59310256,-2097136152,1946355326,-128021206,-1946919287,-754667257,132415720,-2114828663,-1962930393,1183577182,165729266,-163148537,1354771280,1577061864,49120095,1562371467,445005,-2115204267,1459667180,106859350,-1325250677,636015364,1183385600,1958743038,236757276,236852875,1963087673,1963407657,37128997,-1001994480,-588709887,106859265,-1961132383,958103574,175440471,108332857,228603531]},{"sector":15,"data":[1187504107,-1962934076,-1961673674,1149961822,106203908,1963087673,1963407628,-968440056,-1595342848,959744769,1964194870,-968439842,1996423169,-26106,-259325952,91616779,-352321096,-1983894782,-1072969658,1961427829,106859265,-1325250677,-2132225276,1183387620,-25928,-259325952,1355564685,-1202667477,-1706033102,65535,-1962516853,-754405113,-1176229144,-503906294,-2084813175,1946222206,922701845,922685576,43649532,-150994942,-867792424,1996437483,-1506345028,94418957,36084304,-654901248,-154384759,1954527302,-1203336420,-1191149787,-369688556,-1674117296,94418957,-26032,1183383552,-1203308594,74712064,30820038,12076791,-972786687,-150874298,33601606,-1128790668,-1207702782,1183383952,108462036,16777114,-901347072,12076791,704934920,-166925376,1954592838,-352210940,-1962758142,529255006,1183319818,-1069103139,1586167808,-2145416246,1963131263,-1069089021,-1949671797,-1069153529,1183666240,548950238,-6664192,-1929379585,1343671366,16777114,474253568,141934603,16777114,71559424,-1962516853,39291655,-1996209015,1586169428,1074236362,-26032,1077936128,-775804007,-1102673416,-26032,1183383552,158679226,57383510,183042048,-899773692,1586182143,-13107270,-6635914,-1962934017,1149876806,1010186508,-1957399533,957561886,-1957923785,38046492,-1962784887,76218972,1017186185,-1962637037,-1961673698,1149829703,-1994618110,1552614007,-1992849150,-1961673674]},{"sector":16,"data":[-2092987620,1979647613,75334406,-1961855745,2361413,1981808701,-6662394,-2097151745,1946207358,47704323,-100609,-1897390988,1975520003,58714371,13008515,417923957,-2080470270,2122516679,91488510,-351885151,111321347,1351763593,378947213,-26032,2122514432,57999560,-16672791,-1070886282,-6664112,-1962934017,1149873990,-1837695214,503414968,112720,-26032,1177223168,272927151,-1986509173,1183519812,373590426,-1986509173,1183520836,440699294,28133110,2122385269,2080440224,16758789,1183515627,-1874425440,1344160909,-1198491905,-1706033056,452,-1949671797,4161567,1190541685,863301805,-1198360833,-1924136928,385838214,92379728,1586167808,1074236362,1820757328,-1818603265,184549381,-1962117696,529255006,615335562,-1962440464,1177261638,-1941534308,16678531,-11508108,-16122826,-1710192586,1208,-1728051963,-150992199,-4697863,-879079424,704643076,-754404892,-2146595872,-1056243483,1190528393,628361389,-6260993,-16127434,-1710196682,1256,-1728050683,-150989639,2142785785,-73773056,-352321532,-1983894782,1317047878,938150031,-1198754049,-11532896,-1710381514,491,-1728051963,-150992199,-4697863,-6664192,704643327,-754404892,-2146595872,-1056243483,1187448201,-2130706290,36086910,1317012606,2122318479,74711206,76500608,10976896,1317012596,1190527375,74777005,-2138157440,-2138159477,78712804,1301012691,266436866,-1983837440]},{"sector":17,"data":[1166737989,-1947196414,-511637940,-1056243697,-2097003127,1946222206,1250331954,1216776703,-1472790529,2144262,1216777040,1344159999,16777114,1216776960,-1957674753,126601822,-6664128,184549631,-1976666688,-467008444,-511701621,-1983837440,-25263355,-1988201472,-1961885130,1418396740,236757766,236852873,1343112333,-351163208,1218349948,-1387885825,126414884,620905867,-11534321,-1694545738,65535,-12155255,1962999613,1216777010,-1957674753,1090472070,548950080,1268404224,-1962934266,-956348258,-1962737337,254083653,-1224781824,-6619320,-1996488449,-1962981754,721372806,-2146595868,2028536033,-1607038465,71600909,-1559866229,378084222,1150098304,1354256398,246960142,-1483059200,-1962934270,1418397764,106182922,1144588405,-385649404,1586167973,138709766,-1995811701,39291143,294531,-1897331851,75401984,-1962516853,78709319,-461313837,1116113167,-1995994113,637485190,179372095,227270867,184804736,-1979348543,721371526,38636516,184607104,38111681,-12417397,-788496603,105745376,184672640,105220545,-33135232,-33331840,-50240128,-33462912,-12417289,74711552,16862592,-12417289,74712064,33639808,-12417289,74711296,16993664,-12417290,-2147191680,1577125453,1575324511,1426064578,-326898549,-2091493622,1946158718,-1472298115,91553798,250200107,-1472790783,74907398,481178,1958742784,16312579,111687423,48905859,-1207602176,65732622,1342180792]}],[{"sector":1,"data":[506522,-1449504768,184549383,-2094697024,191038,922684276,-6682968,-352321281,-1976107251,-1472790778,-26106,113704960,1704,179610,-1472298240,-1804271610,-1705983957,65535,1048808171,1946158754,-1573453949,74907398,16777114,1975520000,-1573454053,899078,-26032,-1706033152,2020,492954,-10950400,146798123,1211513104,-2091024893,1946169981,846593873,-1710983425,2046,1115013131,1342180792,549786,-129595136,111294207,136419920,1187446784,-956301062,269022790,2147120697,-161576013,3309443,2013203316,-126419150,471450,-96010496,955664003,-2092507413,-1645528889,1577058744,1575324511,503317698,1430622296,-1910575989,108462040,425603,1048775796,1946157802,964613,230163435,1369067520,1342177287,-2080463640,1946158718,33998612,-956301296,-15852538,503760895,-335544562,-1610168558,-956301299,-14975482,-2147039233,-2080375013,-443874579,-900899553,50338050,-16666112,50399232,-16677376,50399488,-16392192,50399744,33800961,50334208,-16493824,50373632,-16384256,50342912,-16577792,50345984,-16268032,50379776,-16280576,50347776,34062337,50343168,-16477440,50383616,-16378112,50384128,33730817,50346240,-16590336,50354944,34040577,50349056,50821633,50349056,-16506880,50359040,-16482304,50359296,34074881,50353920,33806849,50354944,33833473,50355200,33795585]},{"sector":2,"data":[50355456,-16586240,50364928,-16583168,50398720,-16623360,67328,0,1167087646,518818645,-326903666,1008634628,38243091,1358710409,216534672,-62485760,-1962742397,1297948645,-1873273141,-326412987,-2082959842,1586169580,109019910,-2096728577,1962869887,106859353,-1994635381,-1599997370,1977105165,-339727612,268607755,1963345465,112649,-26032,2122514432,276037882,-1694861569,65535,-955883893,7239,-2096734581,1946160255,209190664,16777114,106859264,-16496697,105367551,-310116353,535137026,46812509,-1873273344,-326412987,-2082959842,1187448556,-352321286,8304706,-1946521865,1921513432,1954545683,112645,-1070923029,201082505,-2096728896,1962935934,-58817780,-2095745792,1946159230,8304655,100298487,-1873800340,-13768690,-1577433345,1178142398,-2085192454,-443874579,-900899553,1478361092,-1957345904,-661774612,1443425411,-1878624513,9431054,-1946401143,-1961673674,1183386692,1958743032,-60912792,1346373515,-1946657141,-1706016761,65535,1366671371,704988298,-754404892,106859488,-511701109,1975597824,38243132,1418457124,-754667258,266764522,-1036262701,1200301941,992514,-2147070837,-1056182047,-1962523511,126486110,1284236330,14778372,1149878539,-339309820,959744778,1964194870,1589652358,-1962742397,1297948645,503317194,1430622296,-1910575989,116163544,106859350,-467007606,-1946532215,-1961942498,108432159,620905611,381222927]},{"sector":3,"data":[-1948125440,306220016,-1946401143,-1960866856,2145681415,2012890683,-96024827,1586167808,-1959293956,-472778146,1577205899,-1962742397,1297948645,262858,9240835,458753,21495811,10748159,6684675,4194559,7602435,4521986,0,0,1167087646,518818645,-326903666,-29457660,477429761,113393283,-2095745792,442430,1218055797,184549377,-1878690368,15329294,504066744,1354771280,-6664112,184549631,-385649216,113705162,476,191891143,922681344,922683018,1924665916,-1706025461,65535,-1519009781,111951491,-15567872,-1207522250,1344146290,37530,1975520000,-1371634804,359923718,112080639,504066744,11442768,-1073020928,1894318964,-1438743553,359923718,111818495,504066744,-26032,-1073020928,1424556916,192067839,-26032,-1073020928,1924674421,-6664181,-1996488449,-12714938,1024357631,158662652,-26032,686358528,192067839,112720,-26032,-1073020928,350815092,192067839,-6664162,-1207959297,1344146290,16777114,-16914176,-1962742397,1297948645,-1873273141,-326412987,-2082959842,113708268,1734,32521859,-1709149184,65535,57982987,721541097,31761344,-1711148893,543,57982987,-1878932503,29878286,1342177720,16777114,134673920,57934096,-1962824727,-1979494882,-467008697,-1946925431,126563935,-1309387125,65196804,1060290,-1695136119,65535,-1980086647,1048837206,1962934812,9103619]},{"sector":4,"data":[12336771,-1589283584,378215276,372841326,108338026,459802169,512438900,1822491470,1846971163,374815003,92021375,1930708793,-161576165,-1727772789,319178499,372967511,1182735210,104531580,1047993192,35274371,-2096598016,-2097022354,-1593770914,378215276,372841326,192224106,459802169,-6683275,-16776961,1996487798,-25862,1822031872,184549378,-385649472,-1070923540,-1560232797,480448026,1174812930,960263171,1963064838,460366134,19261649,35300096,54920903,922681344,922688362,922688360,922688366,28842860,-6664192,-1711275777,644,57982987,-2097111063,99902,244322677,-1711200024,765,57982987,-16742423,1963034638,-18320,-26032,-1070923776,-6664112,-2097151745,359793658,1077740919,-955354611,16900614,-1341733120,-352256255,-502872308,-956301311,1258401798,-18432,-26032,-1331625984,1476802817,-400720613,-1073020381,95950452,-124104704,184549378,-1207339584,-1706033151,65535,16777114,1975520000,1354771217,16777114,1278672640,-26085,-310181888,535137026,516640093,1430622296,-1910575989,216826840,55451275,2916227,922709108,1183647370,-1202710794,-1706033151,857,55451275,-1926465537,1343682118,1342177720,16777114,1958742784,-1069644991,980746246,-1980217717,512488518,1194918734,-1962508786,1183387207,-196703244,2130462265,1312227085,1996443651,-25860,512425984,2013201230,1354771244,-26032]},{"sector":5,"data":[-310181888,535137026,516640093,1430622296,-1910575989,753697752,1310624598,912231171,1149974411,1141086468,139727622,-2097151699,1347551450,1347469355,16777114,-599357184,-2206071,1376926262,-26032,983629824,1980119314,-1591315173,378211934,1446579808,2132442334,-599377659,-22998158,1477386,-564774645,92214908,1927038521,976682767,-562626798,-1864599809,18868238,957495969,1963045894,306749717,25298489,1352731765,-2079966973,-385649407,113705137,4288,-1559086431,1218511284,25338642,-1560063839,512426372,529207074,-150989128,-1962822610,272665584,-2082847095,-16560066,1048777077,1979649464,112645,-1197402389,-1961759987,931912286,-150993224,-1962717138,71338968,-1915206007,-1202659258,-1706033138,65535,719406730,-6663964,-2013265665,1183703366,-1229434655,1183469569,1357130464,16777114,-532248064,-1241127894,-700020479,1191172235,537380566,-1915193601,-1705978298,65535,-959029621,-6684665,1577058559,-1962742397,1297948645,-326412853,1443163267,-150992456,52123694,-1995324410,113770054,33554824,1075533985,28313147,-1070922626,915085547,183177668,-16614271,-2081459073,1983449542,-1192134658,-1956773887,516120037,1430622296,-1910575989,183272408,172395350,-1961134429,-1961942498,1488927,-1962250505,272665584,201082505,-1962314560,-2095084584,494207039,1621344299,241083150,184420039,113770495,2147420928,55576263,-974520321,-60912896]},{"sector":6,"data":[126558091,-1946794359,1451951686,66824,1375785603,-60912816,67438475,112742400,45633536,1996443648,-25866,1352859648,-60912893,112736139,1345255168,-1948742909,1351288384,-129595128,972707465,930875478,1178142079,-1959759354,1452013638,241083386,241178249,253894283,381165451,175044352,1082912907,72387330,-2097151739,-22871854,1476874,-2093225205,217150,211880309,236358407,-1961628921,529267806,-150993224,-1962717138,-1962898448,1587741264,1612089614,-129594610,-1543874933,378079998,251595520,-2090990768,-443874579,-900899553,50340102,-16468224,50366720,-16585984,50400000,-16698368,50400256,50346753,50359296,-16720384,50400512,-16451840,50400768,50396929,50360576,50399489,50360832,-16639488,50370560,50568705,50364160,-16576000,50372352,-16525056,50340096,-16471040,50373120,-16454656,50374144,16962049,50337536,16947713,50337792,16950017,50338048,-16462592,50342912,-16520704,50377216,-16675840,50347264,-16578304,50348288,-16642304,50348544,-16728576,50382336,-16397824,50384384,50356225,50377216,50545665,50380288,-16544256,50362624,50362625,50354688,-16768256,50395904,-16619776,50396672,-16725248,50397440,-16716288,50397952,-16687872,66560,0,0,1167087646,518818645,-326903666,-950642844,59462,14304967,-264338688,242548737]},{"sector":7,"data":[31342211,-2096663296,122942,1183651700,-1070903076,440400,-26032,1187446784,-352320292,151451172,125108496,269027062,-1207602174,65733016,1342278840,1356613261,1342179000,16777114,108432128,1116595921,-666465828,184960651,1025995968,2087976961,1962934845,18016515,1962935101,25225475,1962935357,68872451,1962935613,85190915,1187459563,-955252504,268884550,48905859,-2095418368,992318,512430964,939462436,1343266488,237210,1975520000,-664892666,-1091098752,1183514625,-62486040,970606219,58522694,-16454935,1996425334,-664892420,58013573,721734121,80210368,283657927,-632895728,1822494742,1846971163,1779841307,957117723,1964730374,-664892666,-2080823424,1270846,1586169461,-819494696,112868995,-15371264,-1710510026,65535,1081459211,-2133303669,954988327,276838143,16777114,1958742784,-700004565,183173120,2080375101,212229,1996428670,-25898,1183383552,1975520214,-664892441,-1695078528,65535,205405827,-2096663552,127038,1586169460,-30965544,-385595416,1187512121,-955244312,270850630,16777114,-1979303168,-1961855738,-14978018,30710327,20774912,-2092403712,437310,1048778613,1962935982,1948158736,-1707606245,65535,1946157373,-1405189334,192151558,111949567,185172968,-2095548992,437822,-622263435,-1372127234,158263302,58048523,-1946235671,662755422,-20715011,1088964295,-632895728,1183649868,244338922]},{"sector":8,"data":[-16496408,1102579830,2122338320,192217324,15367811,146277748,721611520,1603948736,-16777214,1119357046,2122338320,192217327,15564419,146277748,721611520,2140819648,-16777214,1136134262,2122338320,192217330,15761027,146277748,721611520,-1617276736,-16777214,1152911478,2122338320,192217333,15957635,146277758,721611520,-1080405824,-16777214,1169688694,2122338320,192217333,15957635,146277757,721611520,-6664000,-1207959297,787939350,1183388218,572427206,-1960867057,307792880,133635979,91586560,-352321096,-1983894782,-1072967098,113725556,3886,305805055,1342178232,1342177720,16777114,1958742784,-800667851,2122514432,326960080,-150986056,906350702,-6664175,184549631,-1706461760,65535,253894283,1988829067,307792838,1333796747,113737729,-61658,-3258681,-163148801,-942389623,53318,63995523,782325629,-800704241,1085806460,-800159232,103932115,1022037798,254674687,-338671873,-830569579,-2144502528,1962997886,2275367,97545975,1183387958,-732001332,1346373515,1087129227,-26032,-1073020928,1183516277,-834238000,-338671873,-125927261,-2091158272,2097204862,775848789,75301647,254674687,1208954529,-1949415799,931910750,2275414,97414903,-1924132554,-1706032828,438,-6664128,-1207959297,1317666880,165729230,-1961941498,-1961942498,-964785377,-1961731701,23560223,-767113345,2122514433,1618215122,13649607,-797015296]},{"sector":9,"data":[-1588232957,1178144558,-1977254448,822399046,-962574712,-970022586,-1205820858,1861681186,288818640,-1555657392,105093712,82509824,10503878,97535627,1183387718,-1640562748,1183666182,-11528544,-2135374730,1570394112,-16777210,-1511272378,-1579655541,119607078,13649607,-797015296,-385647613,1996487749,-800683256,1343243781,969819787,91607110,-352319304,1354771202,319898,-800653568,1187501035,-955219736,277469766,1357530765,149425808,-327254013,-1962576640,65792582,-1979711560,1996463686,276871176,1354771280,326554,142016256,1343259064,10387075,146277749,721611520,362434752,-16777211,-2101868426,2122534928,91554206,-352319304,1354771202,339866,142016256,1343259576,43941507,146277749,721611520,1234849984,-16777211,-2068313994,2122534928,91554718,-352319304,1354771202,354970,142016256,1343260088,15695488,2122386549,1962995949,571397,-1070923029,93035088,1996423168,277264392,-276922288,-2129890048,23653758,146277749,721611520,-1399172928,-16777211,-2017982346,2122338320,208994543,-521306495,-1207601919,48955400,-1705983957,575,-939843351,285272134,98191047,-82581231,1342177720,16777114,-1650432,199883846,-2090901765,-443874579,-900899553,-1957363708,49054700,205405827,-955878144,17203718,-2109832448,108855302,-1560170847,-1365178750,-2113521407,-949980154,141360710,109852415,1342177720,503868600,1685584,-26032]},{"sector":10,"data":[1174470656,-2109832194,259260678,-100609,-1710849482,65535,-1191295351,-11533916,-6619530,-16776961,-1207525834,-1202712560,1344145516,1343230136,1342210232,16777114,109224192,-1962824029,516120037,1430622296,-1910575989,418153432,16533191,-398014720,748748800,773229331,1846950163,2132507675,1812347142,-15501797,28837494,314068992,-1248178176,-385875962,1996423448,1354771206,1342182072,16777114,976682752,1781989138,1748434715,-26085,1822490624,1846971163,1779841307,957773083,1964730374,166639632,108461904,-1207848472,-823588370,1781989120,1748434715,1849098011,1815543579,-401698789,1183384529,-162100748,305805055,459945727,459814655,-1202667477,-1706033150,1899,1343200440,1357530765,1342178744,26010,261928960,108461904,-1593745944,60362272,319849478,990938646,1669330518,1178273148,-10718220,2122573894,1400845032,1358954424,726684313,45633728,-6664192,-1593835265,246484894,19261651,-1948200192,-444535730,-1983837249,1183706182,-1665642262,179851279,-6664192,184549631,-6261568,-1665661322,1183666191,-790081284,-58817791,-2087947002,2117265534,-18880253,1357530765,-402229505,-310181534,535137026,46812509,-1873273344,-326412987,-2082959842,1187474668,-956301164,38470,305805055,459945727,459814655,543386,108461824,-1202667477,-1706033137,2185,1342898872,1352156813,1342190520,470426,-1740206848,108461904,-1593782296]},{"sector":11,"data":[378211938,372837988,1266424686,104400511,1131813740,-2087303425,2134021758,976682810,1681325842,1647771406,113678862,1183645696,45633688,381177867,-1818603520,184549383,-4426560,45614710,1183666187,-722972524,-1803648255,-2086111995,2117244542,108461840,1342177720,1342181304,435098,49120000,1562371467,182861,1475119957,108432214,-1962639733,-754405116,75240,76219785,-388822607,-1996488411,1149961029,-754405118,75240,-1962523255,-754274044,4138472,-1978907255,-467008956,-1961933431,145818692,-1986467629,1599998277,-1034033781,-1957363708,-1957275668,2123040374,-1325102332,636015368,92864515,-1995815797,1149961029,105220358,-1995946869,1149962565,205883652,-443850914,311901,-2081649835,1448543468,-1962510709,1183515774,-1947196162,-2129511922,184553441,-28931647,604259466,-771313401,-1324053536,-2132094198,-1040039966,1317790762,14778620,1183432971,-62484996,-26032,1166606336,-1956684276,79846885,-326413056,1988843095,108956424,162944,76224885,-523040591,-511636085,-1053097728,1153829236,1586168066,-2146959612,1962935676,54823706,-523040335,-511636085,-1053097472,1153829236,1586168069,-2146959612,1962936444,105155355,-523040591,-2130555509,989921505,-972458815,-1962866620,134153310,752768,1149966965,-754405111,72190944,989913472,-972458815,-1962865852,134153310,949376,1149966965,-754274036,-2129818656,1006371041,-972458815,-1962865084]},{"sector":12,"data":[134153310,1145984,1166676853,1004808706,158601028,17908934,-16490869,-1956684281,113401317,-326413056,1988843095,108956424,162944,76224885,-523040591,-511636085,-1053097216,1153829236,1586168066,-2146959612,1962935676,172329745,1946371129,88393225,73304833,2088765439,292880392,956712331,158598724,17319110,-16490869,192708615,-1961790208,1144588357,-972458999,-1962865852,134153310,949376,1166741877,205797636,1153829236,1586168078,1577582340,1575324511,503318210,1430622296,-1910575989,149717464,1183536641,139889414,-1980086647,-2037515178,-1924071688,1358887558,305805055,-1962260853,330838,13796097,1996443730,108461832,16777114,16788736,1375787651,142016336,-1207535873,-1706032896,65535,-1232399381,-1165951240,1965096698,107905812,140411649,-125400320,-124846082,2143292414,-121732127,142409982,-1946532213,116128854,-1962522997,-2090989482,-443874579,-900899553,-1957363704,49054188,27630081,1183383552,71711230,-1202712716,-1705967624,65535,1963214395,74907423,1342179256,-16873843,-4698090,-6664192,184549631,-1207601728,48955393,-443826133,180829,1167087646,518818645,922736782,1996424862,-401698804,1996485682,-401698806,-1073020870,922692468,922683018,1996424862,75544588,201431632,1593769984,-1976107258,-1640562938,209125126,1342439608,16777114,49120000,1562371467,576077,1167087646,518818645,-326903666,-1640562940]},{"sector":13,"data":[108461830,-1705983957,3132,201082505,-15633216,-16343498,-1706031498,1477,65781803,-2097151560,-443874579,-900899553,1478361090,-1957345904,-661774612,-954143613,64582,673527,-385649392,1183515565,267396362,729071627,1962938429,9365763,1962942525,14346499,1962950717,19982595,1962967101,38267139,1962999869,50587907,-1962710551,4000326,1025274896,527699969,1947206205,268647714,71116148,1026061328,1114902533,-1711061527,65535,-1711063575,65535,-1711065623,65535,-1711067671,65535,-1929173527,-1163660218,-1942552815,768006,-11513191,-16348618,-16014794,-385114058,-6683906,-385875713,1183515390,269499658,289217652,1025471504,578031634,1947210557,269761829,356329588,-383028208,-6683942,-385875713,-6683950,-385875713,-6683958,-385875713,-6683966,-385875713,-6683974,-385875713,-6683982,-385875713,2122384042,1947214602,176062732,91492385,903322,172395264,1947213885,270613778,574428532,1025012752,460591139,-1711112727,65535,-1711114775,65535,-1711116823,65535,-16620055,-1207530442,1385758734,-1976107184,-1506345210,-1539899637,38070539,1258978945,-1710918640,65535,1357006477,-1763176816,172395512,1024475181,58064907,50473449,-13724736,722388135,498618560,-1070903296,244882000,266928128,1354771202,1342182584,14974592,2122525813,619380962,-1202667477,-2142240747,1962993534,-444693735]},{"sector":14,"data":[722594560,381178048,2122338304,108331242,15236739,28884085,733604608,397955264,2122338304,108331245,15433347,-425614209,732031753,397955264,2122338304,108331245,15433347,-425620356,-338102519,-339727481,112648,45614059,-1360506880,26011905,-1202667477,-1202716644,183238655,-1202667477,-1202716644,-1706033151,65535,35391175,1743323137,-532247295,-15615325,-1207530442,1385758735,-1976107184,-1640562938,-1674117365,21031179,234687979,237178384,240324155,242290285,243273334,245698188,-1962856983,-2144531898,539920,535364470,-1816132863,-1884815570,1354771215,1342179512,-1705983957,3909,325336707,-385649408,-6684418,-385875713,-1070923530,309328,-339727536,1354771234,1342178488,-352321096,1354771222,1342178488,-352320840,1354771210,1342178488,1342178232,16777114,12642560,-1202667477,-1202716661,384499952,-1202667477,-1202716661,183173480,-1202667477,-1202716661,-1706032672,65535,-16738839,-1207530442,1385758736,-1976107184,-1841889530,-1875443952,-176821488,554636814,957295887,1477397519,1997497359,-1955992817,4000326,1024881681,410259713,1947271741,285424922,71113844,-349211631,-26037,1156251648,16777114,-1707218176,65535,922695403,330827404,1347590400,109721343,263468799,263337727,922687211,347604620,1347590400,109721343,268449535,268318463,16777114,-62486272,-229757,45615477,-6664128,-1711275777,65535]},{"sector":15,"data":[-1962742397,1297948645,1426065610,-326898549,2275332,84176631,1183387958,976683006,-6664174,-1996488449,-1070859194,1620048,-59310256,915098,470206208,-1962934014,46292453,196663,16712778,196744,16714536,196887,16715632,196888,16715520,196889,16715535,196890,16715861,196891,16715168,196892,16715160,196893,16715152,196894,16713713,196639,16715099,196895,16715091,196896,16714513,196641,16715075,196897,16715015,196898,16715121,196771,16714976,196899,16711877,196772,16714968,16974116,199560,196741,16714960,196901,16714952,196902,16715728,196903,16715721,16974120,196941,196745,16715714,16974121,196988,196746,16712683,196652,16713819,196653,16715799,16973870,196970,196752,16715781,196790,16713745,196664,16715059,196792,16711738,16973881,197743,16973977,197801,16973978,199720,16973979,199658,196770,16715804,196803,16711992,196680,16715843,16974029,198174,196784,16712676,16973915,199542,196668,16712488,196830,16712479,196834,16712449,196835,16713500,196710,16713268,196712,16713728,196715,16715083,196730,16715067,16973948,199587,196701,16714090,263]},{"sector":16,"data":[1167087646,518818645,1048828046,1962936006,-401698805,113704975,67270,-1962742397,1297948645,-1873273141,-326412987,-1193767394,-1706029008,65535,-1962742397,1297948645,-1873273141,-326412987,-2082959842,346096876,138819856,1491665788,269918465,2097694265,21883139,1021841040,1958742786,459847715,459061328,374864,-26032,-1070923776,-1560110941,-1599929702,1782481670,1383334675,-16222465,244319862,-1560168984,1996425700,1312227080,-401698813,1183384169,805750780,-939524337,-15781370,-1811494913,-956301296,17220614,1996443648,-466157818,-1741226231,23828994,922681344,-6680524,-385875713,28835981,-1581978880,1178144788,-1207206392,-1706033151,65535,379654635,138819856,28841341,-6664192,-16776961,721635894,949637312,-16777213,922683510,244319054,-1996361496,2122579014,125632518,411335,-1593054464,1178144782,-1996259834,1048774214,1946157724,805750540,-939524337,-15781370,-59310081,-16353537,-2096503754,171070,28837237,721611520,-23441216,-1929379839,-1873803706,35186702,57982987,-1694537495,65535,-16222465,244319862,-16765464,-1710214090,65535,-1961136991,958098966,1964730902,1745238284,-955878117,17217030,49120000,1562371467,313933,1167087646,518818645,-326903666,269787398,2097694265,138840837,346096619,922701840,244319054,-1996410648,-11469754,922682998,1048775140,1962939242,112645,-1070923029,-26032]},{"sector":17,"data":[1788936192,1958742803,81186,37556596,1024685056,326434819,16777114,-1710429440,65535,-6683157,-956301057,190470,460103936,460199563,-1996319581,-956131818,443398,49120000,1562371467,313933,1167087646,518818645,-1667114866,105265424,1048780158,1946157722,243717,1048784107,1946158752,178181,28844267,-2095322368,170558,112723316,-2096108800,434238,79168884,-1207702784,-310181883,535137026,80366941,-1873273344,-326412987,-942109154,1272326,-1673624832,1081344002,43531907,-2096139264,170558,113707125,136042,1048783595,1946157722,-1740733681,141885442,325715655,350945283,43662979,-2096270080,170046,113706613,70506,325729923,-1207602176,48955393,-310132693,535137026,516640093,1430622296,-1910575989,183272408,-167354741,343146759,137216907,951687440,1358558976,-1705983957,65535,-1962516853,1183387207,912231418,1183385483,106859516,704857994,-163149340,16271047,-1960973568,1200356446,-96075508,956843659,92207686,-336050549,-129564912,284968579,972441227,-612566970,49120072,1562371467,313933,1167087646,518818645,-326903666,-330920684,-1070903274,-1202696112,-1706033151,65535,1031061515,1039025803,91357696,1979843133,-330920682,-6664170,-1929379585,1343679558,16777114,-1960318208,1183516254,-1962440206,1183516254,38242804,49184385,-350981118,112653,-26032,-1073020928,28837245]}],[{"sector":1,"data":[721611520,49120192,1562371467,268618317,872481536,1744831232,-167705856,1778385667,-1409219840,1828717315,-956235008,1895826179,-788462848,1912603395,-771751168,-1828651264,-620690688,301990656,-2147417344,318767873,654312192,889257730,536871681,906034946,-1811873023,369099521,419431168,922812162,2046821121,939589376,318767872,989921025,-201325824,1962999552,117441280,1979776769,0,0,0,0,1167087646,518818645,-326903666,-950642836,38470,1352156813,-1202667477,-1706033101,65535,-1207535873,1385758848,10664016,-1962512649,-1606513704,-12743919,838795889,1352156813,16777114,-1367440640,-1201441792,-1706033126,280,1083590281,-175418252,-950866301,56902,1686122987,1686161154,1153842946,1149894659,1007100930,-2147060479,-336067996,38046227,37488420,1149897333,217588738,38045699,-2096839037,-898301892,1353598605,-6922613,1751095,20355664,1183514624,-2090901866,-443874579,-900899553,1478361090,-1957345904,-661774612,1460989059,10664022,-1962512649,-1608610832,-1960867055,-1961779138,495653952,-1995290485,-935592882,-1070922379,-16711703,1996424822,-163148292,1354771280,149146,-96040704,1065605259,-1193315328,-1706033101,613,1090012809,-4716939,13560319,1343173816,-500085,3389495,45390416,1183514624,263674,-899447,-661977482,-16222209,1183647351,-6663946,-1996488449,-661916602,1962950528]},{"sector":2,"data":[9431299,-1946657141,-263812857,1089750667,-260636848,-1963696501,1357130247,221594,-262239488,957298849,779355207,-1996208341,1191308870,-262239484,51279755,-25039242,74842832,65783435,-1962749768,1200222302,-262239474,32392843,1586175047,255238640,1946306361,38218542,32261769,1586168391,175606768,-2115209725,1980080382,-339309820,94418947,-1980735861,1586170439,-330920976,-1961605375,1600059462,-1962742397,1297948645,503317194,1430622296,-1910575989,283935704,-1564977577,107935488,512487563,529207712,295714443,-1961475957,340298525,1005997705,721778120,10021312,-16353537,1183708790,-1070903046,43817552,1183383552,-1948742664,-230258425,-613105653,-150993992,1077998190,1357923977,16777114,-196704000,-1207601856,1558970367,-1946919285,-62486265,1358460671,1089502851,1085811070,-14161152,1191118454,-159973386,1358579341,-1705983957,65535,-62488240,1996423296,-260144132,-1948811456,-1705971642,65535,1089498755,15761027,1586219391,-1960866828,1200222790,-196703486,-310157474,535137026,46812509,-1873273344,-326412987,-2082959842,-1957296404,1065354846,-1207601920,1122729983,16533191,195600640,2113685049,10664174,-1946390793,-1607037992,-1994652911,1200290398,1014965253,-15305717,1602946678,-1875378402,43706382,91602955,-335788405,-62456059,-2090941461,-443874579,-900899553,1478361090,-1957345904,-661774612,13823105,175570774,1354122893,1342194360]},{"sector":3,"data":[16777114,-146356736,-1233223680,-1207536384,1172930559,-1236890366,-401698736,1183448927,2147433978,-1706031500,65535,16777114,-96040704,1954545469,-1236890154,-26032,1183383552,-948682500,-150953288,512490094,117641632,-2080881015,1946158718,-2133292282,-1954544305,1204287582,-1962933752,-208930722,-1995946357,254019140,-523107407,-1963428213,-511703988,-2000614777,1586168903,-62485512,-14792823,-6620554,184549631,-1961265728,-1961779170,10663967,-1946521865,510722032,447386,-11015936,737834751,-2037559104,-1202651338,-1202716544,-1706033151,1783,1962967101,985563403,1974141183,9824515,-2037792725,-2037776588,1178206002,-2093386744,1946486910,537311283,-26032,-1564999680,-93391104,915134603,469963168,-2080874871,-1635187261,662765358,782142336,185565439,-500085,-1997857161,-2131206517,-129945,-6620554,-1996488449,-1979764090,-1946209130,126482526,-2096998519,91619322,1962934077,8435885,-1957670247,-1946209658,100611222,-763166593,-1706012160,1324,-1980211573,-488040377,918454528,1958621695,-9049853,956843659,1962883206,343304,1692992372,-1770093569,-1962445568,-1979755898,1586206278,72319224,-128021759,-12286325,-12151157,1468598153,8435714,-1957670247,-1946205050,100615830,-763166593,-1706012160,65535,-1980211573,1586170439,1216777208,206014975,-1946657141,-1979757946,1586171463,1283886072,273123839,-1946657141,-1979756922,1586172487]},{"sector":4,"data":[1350994936,340232703,-1946657141,-1979755898,1586173511,-1773761544,-2095560823,1946355838,1418104118,-1634053889,-1996488701,1967193158,-20256509,295706251,-1564991605,-93391104,1183576203,541100540,-1862633729,29943822,58048523,-1946245143,-2090927546,-443874579,-900899553,1478361094,-1957345904,-661774612,-351867773,-92372214,721712384,-1959662656,1191118942,705137160,244338916,-1996477208,1586231878,105316102,-467007606,-401698736,1183383577,-96060932,1183566708,-62510086,-1962742397,1297948645,503317706,1430622296,-1910575989,105286360,-1705974742,65535,175423499,705054346,2098660,1183450603,-2082199034,-443874579,-900899553,1478361090,-1957345904,-661774612,9628801,10664022,-1962250505,-1607037992,-1959490799,38832896,-1980217719,1183578710,-2037825528,-2033713290,720756,1342182584,21658,-62486272,-1207536320,-739639297,1921435392,-1962934017,973042822,2097115782,1954972464,-2037708033,-523108492,731504849,-1980182078,-36730,726727798,1704612032,184549383,-16091712,-6620042,-352321281,105286586,-9009607,1996442739,1991704330,2022084095,-2135404289,28856320,-6664192,-1996488449,-1711313274,-881470965,1962967101,-60912698,-1232396405,-422445198,-2037651759,-1769209992,9043834,-16625527,-36218,-369133946,1586233201,-1960866820,-771788106,-1947807258,1452013638,67066,-1996434813,38832384,-1946388737,-771788154,98619872,731447300,1358483906]},{"sector":5,"data":[1342177720,16777114,-62485760,49120094,1562371467,445005,1167087646,518818645,-326903666,-1202301180,1861681314,-1947170042,51486750,108461879,-16091905,244321396,-1979798552,1967193158,-339727612,-1608610971,-1205892335,1861681314,-1946645754,1099562054,10663962,-1962512649,-1608610832,-13171951,1962870390,242548492,1911033488,-62486018,-1961331392,-1961779170,10663967,-1962512649,443678712,266650,-1951470848,-1961779170,10663967,-1962512649,-62485520,-1206108023,1599995905,-1962742397,1297948645,503317194,1430622296,-1910575989,183272408,-163133866,-146356697,108461829,1342189752,545434,1486508032,-2013265912,1996486982,1095686,141007440,-1706033152,2157,-506232,1085802102,2090487808,1342177288,557722,-96040960,-1207535873,-1706033072,2193,144153168,1183318016,108462075,1342185656,16777114,-6664192,-2013265665,1183710278,1996443894,1354771206,572427088,-1205892337,1861681174,-1012986,1895761008,-26110,1048772608,1962934750,112645,-1070923029,49120094,1562371467,352504397,1124074240,167837448,1023410945,-1962868984,-2030042368,-1912537339,-184483072,117440775,2097152768,738262785,1509950208,771817220,1392509696,822148865,83886848,889257729,-939523328,922812164,-1929379072,939589379,-1375730943,939589376,1157628672,956366592,536871681,956366592,738198272,973143812,738198273,989921030,-1828715775,1006698244,-150994175]},{"sector":6,"data":[1023475459,-1107295487,1308688136,-2013265152,1610678019,-1996487936,-2113863930,-956300544,-2097086714,0,0,0,1167087646,518818645,-326903666,1781989166,1748434715,1849098011,1815543579,976682779,-700019438,-26032,1183645696,1183666390,1183666388,-6663982,184549631,722760896,1996443840,-763953196,1342433464,1354771280,-2096274712,-443874579,-884122337,1167087646,518818645,-326903666,-129579238,-1070923773,55044176,58048523,-1929330455,-397346234,1183648882,726669030,1347440832,25270864,-1073020928,1719666293,2011953144,384190093,1354771280,-1684385712,-1962934271,4057158,1024226305,1265893888,1946288445,-2134643867,-1928791986,-397346234,-1801384918,-1878643960,65589512,-1995927546,1183579206,867818,456999028,1028748288,125042725,1946167101,-1584403702,1177093836,-1592202246,1174472396,-2146374662,-1946683290,1452010566,-96040466,-239991,1996486774,-92864516,-385504024,312606560,-1912208624,-1677317368,-4698096,1347440895,201320528,-2096812056,-443874579,-884122337,1167087646,518818645,-326903666,-950642912,63558,31737543,112640,39315536,58048523,-402528023,1183649299,2145931514,-431583989,-1070903274,1347440720,16777114,1975520000,-127500281,19786231,384190093,1354771280,-6664112,-1962934017,4057158,1024619521,57999872,1023459049,57999873,-352231191,-96039492,188016720,150490752,1038763659,57999373,1023494377]},{"sector":7,"data":[57999387,1023506921,930349093,1946166845,2571608,675088244,-345476096,-129594488,1023410981,92012545,2113929789,143827213,-2131081591,-385681330,-861863757,-96075514,-1962890519,52820038,81152,37553532,-1592951296,1183385742,-129072902,9300226,688311457,-2065040826,-129567232,-1593281532,1177093838,-1586041860,1183385748,-129072900,-160765180,1946482758,114204936,-335788543,143958364,-2130950519,-351995826,-127500208,-461470729,-955747328,58438,-1946224919,1452010566,-96040466,-151234935,1963194438,143827226,2096776761,-129073146,-1592988926,1178142862,-2147188742,-167643058,1963259974,143958284,2096907833,-129073148,-129594620,1023410981,343146497,1946157629,-126419168,-231681,-219612554,-23467773,956863137,-377685434,620250763,-352187140,143565071,2147108409,-129594408,17628196,-2080881015,444990,1105724276,143572745,503875262,-1515870969,-4789339,-402089418,1183383616,-1640562718,3598344,-1579137399,100864018,103483534,-1588588388,103483538,-1588590450,103483540,-11532144,1996481142,166193376,1577261032,49120095,1562371467,-1957311667,49054700,-1241219455,-1960283645,-768932794,-150738759,-27883023,1932720771,700615431,787153990,-1224835455,-1205374461,1177224168,-1961038850,-768932794,-150866759,-27883023,1915943555,-1023770152,-1962446335,29502401,1183515718,1575324420,1426064066,-326898549,-1957275808,-1767701434,1245118216,1354771203]},{"sector":8,"data":[16777114,145274880,922701854,922685596,922685462,922685454,-6680556,-16776961,-14980554,-14981066,-14979530,-14980042,-1928185290,-1705981882,38,294531,2122517364,91694822,115982379,-1472790782,2537478,-26032,78118912,-1070909580,-1983494519,922731590,246941352,-1070903296,-1924116400,1343669318,16777114,112640,-742109558,144745440,-1979711048,-522992050,-351755101,112649,-1559714653,2122516640,963994568,1342740664,1342741688,1355302541,-1705983957,65535,144193279,1342433464,-1695779073,1191,-16213853,-1207395274,-11533336,-6623626,-352321281,-934900431,-1035563696,-1069118128,3643984,-1073020928,1407779701,-1032388609,-1705983957,1442,-16213853,-1070874506,96705104,-1667039232,-62485240,-26032,-1073020928,669582197,143046911,-934900400,-59310256,55195391,16777114,143572736,503875262,-1515870969,-402208859,-956301055,565766,-1976107264,-26106,1183383552,1958743038,196628545,1134186496,1342177286,412058,1958742784,-25755859,379602573,-26032,922681344,1996424842,-25858,1183514624,114074538,60835467,731490374,-1543974462,-1159199026,-935427328,292880390,109852415,503763128,-26032,-928841728,976682758,1781989138,1748434715,-26085,922681344,-1070920256,-26032,-1588592640,100864018,103483530,-1706028900,65535,-16207709,722318390,-6664000,-1560280833,922683570,-2034757574]},{"sector":9,"data":[-1706025464,65535,271857407,16777114,143827200,143525419,100919505,1183385742,143958512,143656491,100919505,1183385744,768242,-227082416,-386894081,922681533,2140800712,-1207959546,-1706033151,65535,1577058744,1575324511,1426064066,922741899,-6680518,-1560280833,922683558,45617210,-6664192,1342177535,16777114,976682752,-1472790768,-1439236344,-1405681912,-1372127480,-26104,-443875328,-1957313699,686588908,31983303,-6684672,721420543,-6664000,-956301057,-16665594,-25857,1048772608,1946158794,95610883,144850563,-15829760,-1206896074,1344145542,382106,976682752,-1506345200,-26104,-1070923776,102537808,-6684672,-1962934017,1438866917,-326898549,-1588177060,103483538,-388953970,-1913370999,-1900087170,-1526262264,-156916315,1963198534,12773635,721831563,990416902,2114499078,143696140,145884675,-351910263,-1875473651,1983464968,-1996260090,-1801386378,105265416,-1528233089,74907392,143800063,474010,-1912198400,280514568,-124104704,-1996488697,726723654,798642368,1342177288,1342177720,539034,-297367296,738197432,-295793710,-338492495,1183446007,105286642,143656491,1354771280,500634,28856320,-1399173120,-1996488697,-1599999930,-1540425976,-1949791480,-768872378,1178333687,-13732110,28897910,26890240,1342177288,-1705983957,2059,143656451,-1868492565,105265416,-1801385860,105265416,1183384446,138840838,184550181]},{"sector":10,"data":[1025012928,57999361,1023471593,192151554,1962935101,15984899,-1962899735,103482950,-1202714480,-1706033136,2363,1354771280,16777114,28856320,-627421184,-1996488700,-4659130,-1949160449,61991006,-201856045,-1947842935,103482438,726665358,1570394304,1342177288,1342177720,550554,-364476160,-150429535,-1962367954,-364475448,-235417045,1994802747,-428409060,1342177720,16777114,-1070903296,80517712,100859904,1183385742,145274884,1996443678,74907398,16777114,1958742784,45345027,721988769,-787961850,-465139224,721989281,-787961338,-498693656,14698183,-565786880,-1465843712,71710984,-1930886276,306086656,1685389328,613274,145268992,-385595767,-1465843516,71710984,1048813437,1962938386,-1953240168,1177224262,-1475986444,-2096005880,1053246,1183517301,-1476000780,-8984312,50611851,100922438,103485458,104534172,58656944,-1577098519,1177225392,302394356,-1677327600,-11605744,-149941599,1183535320,1356396516,721700491,1342744582,624538,-2120593408,-352321527,145531210,2114209337,269656389,145491459,145229355,305530427,-442889348,-1593835511,1609107628,305570303,269616683,145491459,145229355,-461963440,721700491,1342745606,373914,-6664192,-1996488449,-1432231866,105265416,195061629,-1947981296,-754667024,1042189286,-2093546736,1988694254,145400284,143656505,1048587901,1979781131,459841831,459937419,1963480121,105134376,1149969269]},{"sector":11,"data":[139758342,1979208761,-163301109,1156974197,225772786,16777114,145400064,-351910263,143696210,145360427,-337754487,145662278,2114340409,1042189118,-1995994352,1048631878,1979781131,-1579644129,378215272,1463360362,958100744,376768071,1146752,1207305844,175440914,716698,145662208,1187491563,-2097151522,1962991742,-562134263,-385649408,312541417,-666466032,-1995929439,2122567750,208928992,14581379,113706612,1734,113917571,-402426880,922681808,922685498,-1231419226,-2097151994,1946214526,-529072376,16777114,-562134272,-1207206400,-1706033151,65535,2122518507,159187166,1342177720,16777114,1245118208,1354771203,250266,-77076480,459945727,459814655,460207871,460076799,305805055,1353205389,264346,-700019456,82221648,-1073020928,-1113978763,-385875960,-2034761396,1183666184,1996443816,1245118422,83991043,1183514624,302394328,-733574896,721979553,1183436870,-129593902,1996443670,-763953196,751002,-733574400,-1962654207,1174524486,-1956975866,52758598,1958742784,81220,37564788,1026847744,896860163,144064131,-1959103232,100922438,1183385742,-129593866,1183535126,-163173628,1354771280,16777114,-1961170176,1183384646,-1962480648,1183384646,138868476,-1962511356,1183385158,143565310,1979205177,143827230,1979467321,143696150,1979336249,143958286,1979598393,138868230,-2095483896,444990,-2048392332,143572736,519599757,-1515870969]},{"sector":12,"data":[7792805,134760182,1996427892,74907398,-16698648,-1710831562,1555,144064131,-1588628480,103483538,-1202714482,-11533336,-1710712778,3100,-1582938487,103483540,-1202714480,-11533336,-1710711754,1172,-1583069559,1178142874,-1593281114,1178142878,-1961921372,-1700551098,-1538880760,-402088285,1599996735,-1034033781,-1957363706,82609132,721982113,1208520198,-1577171319,103483540,-1991767920,922745926,922685498,922683534,1996425360,112894,4831312,1375754938,212048464,922681344,-1834938310,-11515896,-1207398346,-11534335,1236860022,5945856,-979742638,-16777204,-1592772042,1346373774,1208521889,-25755824,1342177720,-1174386248,1347551322,845466,976682752,-1908998384,143696136,28856384,1996443648,4831484,1375754938,-26032,914423808,-63798,-1017256565,-1947432107,1344144454,16777114,876019456,71731984,-6664162,-1962934017,46292453,-326413056,271857407,369378957,-26032,1996423168,108461828,16777114,1575324416,1426064578,-326898549,-18426,-1979955575,1183448646,176063482,-15172608,280496758,1973047296,1342177293,-1705983957,3474,-2080487799,2080376958,142016280,1342181560,16777114,-1070903296,125147728,1183383552,209617916,-15827968,-1070920586,122133072,1183383552,-92864518,-100609,1996487798,74907398,1342177720,-1962932504,180510181,-326413056,1446702211,-1961138015,-1994692074,1451883590,-1576613890,-1711275768]},{"sector":13,"data":[65535,-100609,922745974,922686254,922686252,1183650362,-577089328,-2097151990,1969475710,112645,-1070923029,-1946532215,1183439942,-92371976,-2095418368,2113931390,108954412,-1960411648,1183385670,105286644,-336181623,209617688,-1962509312,1183386694,176063450,-1962509312,1183386182,243172316,-1962509312,1183387206,-293698600,-2147191266,-1920937906,-11481018,-6623626,-1996488449,1451871302,-798588722,976682879,-25755886,-1694730497,65535,818819,2122541437,1669136394,184694411,50390657,33619585,-25098636,1333068032,294531,632828276,922701824,1996427834,-59310082,-1961136991,723217942,454780934,1377528342,-18352,1347590480,726684313,261771456,-1711276017,65535,80365254,13321926,1355433613,16777114,-2094208256,1946158206,2471974,976682832,-25755886,737965823,1996443840,-18194,1347590480,726684313,-6664000,-16776961,-15582666,1996488310,1354771452,1357805311,-3246337,-11481994,-6623626,-2097151745,1946221182,108953863,242680808,16416387,1183528053,-599377416,748760190,773229331,-62510317,100554267,-763166719,-968455936,-3647863,-15582666,1996488310,1380995836,-26032,-1956773888,214064613,-326413056,-956109693,28769862,144324351,1342289592,988286608,-28931840,1191172235,1476904702,-106869,130481734,-1640562897,-25755896,451415696,-28931840,1191172235,1493681918,-956408181,-6684665,-1962934017]},{"sector":14,"data":[516120037,1430622296,-1910575989,116163544,721962635,6601170,-92016137,-2096860622,-1959655354,-768931770,-150738759,-96040463,192266251,-16359797,130418246,-15930576,1183709814,-6664186,-1962934017,1191118430,772261382,721962635,65583570,-1031015945,1689899563,82966272,106859312,-2012854529,106859271,-1962932282,-310180282,535137026,80366941,16973881,196775,16973932,196750,196717,16715723,196878,16715638,196638,16715380,196639,16715472,196640,16715467,196644,16715799,196774,16715355,196650,16713517,16973995,132706,196630,16714037,196655,16715489,16974000,199933,16973841,198109,16973842,198263,16973843,134274,16973853,132659,196638,16714429,16973883,199970,16973852,199947,196637,16712890,16974142,132169,196646,16713354,16974143,133763,196647,16713599,196928,16713553,196929,16713110,196930,16714502,196931,16713411,196675,16714470,16974148,132409,196653,16712836,196933,16715216,196677,16715104,196934,16715243,196679,16715134,196935,16714293,196681,16715095,196810,16715567,16973900,198018,16973997,197922,16973890,197974,16973892,199656,16973893,199981,16973894,198334,16973895,132134,16973904]},{"sector":15,"data":[197611,196680,16714756,16973932,198781,16973900,199465,16973901,132403,196695,16714385,16973937,198313,16973906,132426,196701,16714400,196725,16714417,118,1167087646,518818645,113760398,-64852,44973699,-15764480,-1711100362,65535,44959431,-310181888,535137026,516640093,1430622296,-1910575989,418153432,951604823,141489920,-964562805,1149964296,-230258378,126605451,-1324984693,65196804,-62486078,385107597,1354771280,-1946394997,1194004039,1962889228,242745094,16777114,-666991872,393478150,504506552,-196702896,-6664170,-956301057,448518,1445128960,-1092059507,118886952,-1515870811,304658526,1183666206,-1924131096,1343681606,16777114,-2090902016,-443874579,-900899553,1478361092,-1957345904,-661774612,23784577,3717206,84569847,1183387656,-1948742758,126563935,-1324853621,65196804,-632911422,1200347275,139954950,-1982445943,512481366,529207074,-150989128,-1962711506,37784560,-1996205941,1451882566,-62470150,1187446784,-956301108,56390,14567111,-1705080064,-1993193589,-1070870970,-1981659511,1183440966,175570920,-1878493441,-19142642,425603,-51838092,102664966,38272768,-2590977,1996478070,-126418950,57030399,1352418957,16777114,-1002009344,-1673097904,-629735600,-1878362369,114681870,734545547,1183433798,-901346314,-1983494613,1183573062,474524,138218108,1031110144]},{"sector":16,"data":[1685323875,-6523137,1996463734,571598,30382672,-11534336,79220342,-358985728,1342177281,130458,-767129344,-6523137,1996464246,702670,33004112,-11534336,112774774,-6664192,1342177535,16777114,-800683776,13794947,-1073019788,512431733,1342111750,82372866,-1985067381,1183568454,-800683600,-1697745153,65535,-1554807,28888694,-6664192,-16776961,1285672566,1241921795,721712387,-1593578560,-1957687140,-16560610,2013204087,209190662,162970,-666991872,410320902,-3246337,-15587274,-15586762,-15586250,-1710084554,65535,-1995400031,922742342,-1070920946,45718096,1317732352,-1983370298,1586229326,240073626,1200293501,-263812850,-1952817525,1183385159,272039922,1354771211,16777114,-901381376,-1946925431,1195088478,-1962508788,1183386695,-831062028,-1149185,1183576182,-297391118,-196703408,1357923883,110769919,110638847,16777114,-1705080064,704989066,-1408877596,-1586662142,378211180,1446579054,962688472,1551226438,-1697745153,65535,197936777,1346925760,44971775,16777114,1958742784,-831062214,-3901697,1996473974,-461963274,734820095,961564864,1946590214,1778792718,-1207405557,-1715863450,-1207506176,-860225504,-1706012160,65535,-1862360087,-57612274,16777114,178176,-1099497648,-1698924801,65535,201082505,-385649216,-1070858624,-1981659511,1183572038,64105402,1444140614,-364475944,-1947445623,1452007494,-1101645342]},{"sector":17,"data":[-1779891341,956856064,58178630,-1929344023,-1924082618,1358862982,57030399,-1280257,1996483190,-126418950,-1950595445,1177271894,-497673248,259510795,3999090,-1962380543,1177271366,-1207702560,-1706032896,65535,-1694730497,1147,-23689591,-23554423,58049035,-1912735767,385784454,-532247728,-23689725,1996443730,-25900,1996423168,78420732,1183514624,1174510036,-497675808,-364510823,-370387439,512491357,1342111750,-1669430526,-1207601821,48955393,1183432747,1958743014,-831062170,324762,-867792640,58048523,-16610839,-6620042,-1996488449,1451865670,1975651256,41216259,380389005,-26032,1183383552,1975520222,39905539,1183432747,-1236891208,-1694730497,1875,-1694730497,1883,16533191,-864616704,-1696696577,1311,-1962886423,1178194502,-1962183178,1178193990,-385649180,2122514887,58001308,-2097037591,1963498622,28698883,-1697745153,1432,197936777,-385649216,1996423678,-763953202,-1697614081,65535,199116425,-385649216,1996423654,848974028,184549381,-385649216,1996423638,-1774780468,96770566,-1073020928,-1008139403,-864616703,1347469355,-2984193,922734710,922683034,-241564008,-16777214,1996475510,92379804,1996423168,112844,37198416,1996423168,-59310132,457882,-864616704,1342177720,437402,-264338688,57933825,-1879014679,-93526002,-1697745153,792,198985353,-2089913152,1962993278,-834237693,-159973552]}],[{"sector":1,"data":[-1696303361,65535,184725155,-11373376,-1705976714,809,1165279243,735868671,-11513664,1996486262,-864616476,1996443728,-797507630,-1174396744,1347551436,434074,1975520000,-596181173,465818,-599341312,922681344,932840110,-956301305,175622,-831062272,-3901697,1996473974,-461963274,734820095,-11513664,1996477046,-1677313584,962819078,1584719430,-1174378824,1558904985,-3246337,1996473462,-159973434,-1804545,-1070867338,104419408,225707676,1961248313,6731784,-352282182,2144262,1375784122,56924752,1586167808,88574618,-1398545366,-700019966,-1546103157,378080108,1183517550,191538150,548956907,13416960,-6664110,-352321281,-831062181,-1701021953,65535,-3246337,1996473462,-25914,1183514624,474524,138217332,-350456832,-1635876056,-2095811584,1946198142,-831062258,-6392065,-6643594,-16776961,1996476022,-461963274,16777114,-831062272,-1694730497,65535,15236739,1996426110,-394854450,16777114,-595688704,-16223232,698014838,-2097151993,1946209406,-864616696,16777114,-562134272,-16223232,479911542,-2097152000,1946221694,-427916514,-1961856000,1175172678,-16223048,-6620042,-16776961,-6620042,-2097151745,1946159742,14084355,54935171,-385649664,1048772812,1946157544,12773635,-1697745153,552,-2081929591,448574,1996429429,674693070,708247314,741801746,775356178,129735186,1996423168,-1674117170,1310624528]},{"sector":2,"data":[242745091,-16353281,1570376823,-1593835518,378215276,1446583150,2083880920,-700040955,1755393651,1779862299,-665437925,92217980,1926645305,-1002009829,-1947318647,1183434822,-831062030,384714381,-26032,871038976,-1961138015,958097942,1964731926,1812347174,958428443,460707926,1976976953,-666991850,158662662,957070497,2098342406,-1207515386,-16777202,1996476022,118332136,113704960,67288,31997571,-1593478144,65734344,1343966369,16777114,-310157824,535137026,113921373,-1873273344,-326412987,-2082959842,1448548076,-1207273845,1861681208,268961030,-1947580791,88574680,-1957632982,2013202526,108527368,1911033488,1664910082,2088975221,108265482,818307,1183657845,1183666420,727077104,-6664000,-16776961,-1070861194,155490896,1183383552,-260636678,-1705983957,65535,-336181623,172264228,1358579337,-1705983957,2477,-1946925431,1183386692,-1070903050,152214096,1183383552,140413936,294787,1183519348,268829686,-1070903285,42900048,267059200,-1979162997,-467009209,-523041615,-1996484603,1586231366,239569672,-1980217813,-1667106746,-362902768,1342850859,-1705983957,65535,-1577957751,1183387072,184721916,-388822863,184550181,1024423104,443809793,1946157629,212266,1149961845,-330921720,957024417,595455046,1183524075,-96064516,184944171,185075203,-775804007,-1948324872,1177287750,101067770,-1949111541,1174662214,-297367054,1354771280,16777114]},{"sector":3,"data":[207522560,1174603657,207522804,-1962653815,-74773410,-1980217717,1174602309,105351664,-310157474,535137026,147475805,-1873273344,-326412987,-2082959842,512429292,1200227150,-1981535741,1755445830,1779862299,-163149541,-1946659191,126563935,-939768183,62534,972703371,545125446,-151232885,1963000391,-339727612,-60912847,-1946794357,1463416918,957314312,175441479,972703371,192738374,1191174123,-62487564,-1949963504,1183516254,-1207465476,-310181887,535137026,46812509,-1873273344,-326412987,-2082959842,-1957295892,1602946654,-1995994314,1586232390,88574470,-1957632982,2013264990,108527368,728730,-129579264,334168064,-1309116789,-1947806972,1089928286,292816898,-1946663169,1200227934,1222912515,2012759611,-126448673,-422378319,-1963172213,-467009216,-96040640,-1588571495,378211938,103485028,370875272,1347558282,704726922,1372138468,-26032,1347551232,16777114,-60912896,319178499,-2090989481,-443874579,-900899553,1478361090,-1957345904,-661774612,-16091393,1996425334,-26106,1996423168,142016266,-1710852353,65535,-1962742397,1297948645,2819786,91554051,8060930,66846723,18284799,90046723,196610,58720515,983041,90833155,458754,177012739,2031871,139788291,10420479,78905603,1114113,67371267,1179649,57737219,10682623,70385923,1245185,115540227,786434,112853251,851970,116457731,917506,128057603]},{"sector":4,"data":[1441794,187432963,11665663,95682819,10223618,89325827,1900546,125829379,1966082,108134659,2228226,99418371,2293762,138019075,2555906,150339587,20971775,149159939,21037311,79954179,2949122,146210819,21299455,146931715,21364991,24707075,4653311,147849219,21430527,183566339,21496063,76677379,3211266,84672771,3342338,73990403,3407874,69861379,5898495,100204803,4456450,101122307,4521986,29491459,5242882,7930115,4718595,9371907,4849667,183107587,6947071,30736387,7143679,12124419,5242883,133824771,5373955,0,0,0,1167087646,518818645,-326903666,-950642890,129606,32786119,242679552,1342178488,13722,702720,1183443447,242679778,1342179000,18842,702720,1183443447,242679774,1342178488,22682,-62486272,-1207011585,-1706033146,103,-637303,649596534,-6664192,-1476394753,724857860,-733574720,-2996599,246943350,-1070903296,-1924116400,1343672902,16777114,112640,-741192054,-96040480,-1979711048,-522988466,-2081143159,2113993854,-159481082,-1962180864,-1070861226,-369473909,1996423524,-495517940,-1694730497,213,-1423735,1996425846,-159973410,16777114,-398030592,556675,2122567038,-948043770,15367811,-1072971394,1183563134,1317771528,-1946552342,46564336,-1713224053,-125044233,2113813319,-339244284]},{"sector":5,"data":[-1983476990,1183572038,1317771526,-1946552344,46564336,-1713486197,-125044233,2113813319,-339244284,-1983476990,1183571014,-230258182,-1980479861,-4657594,-330921601,-1947187575,1183447622,11790806,-1980479861,-1712719802,-364475648,-1982435593,1183566918,-126945304,-1714796919,1183535186,1347590408,102554,-1957670400,1385811014,105286480,-1706012007,427,244338770,-1996451608,1183567942,1347590406,-1727510901,-1097183150,1375731713,-901346480,-1957670247,1385811014,46897744,1347551232,1659375248,-834238208,972048011,545247302,971785867,411029062,-1982445941,1183576646,-297367048,-1982839157,1183576134,-330921522,32786059,1183578182,-129615396,1558774653,-96039937,-1948891647,1178198086,-385647146,1452015426,-1950340114,1600057926,-1962742397,1297948645,503319242,1430622296,-1910575989,183272408,-1962260853,-355398570,1317787857,140413702,-640554031,-753680125,-1980086647,1183579222,139889414,1913411129,956659477,242616902,-1962260853,1177226326,139860742,1183517931,139889414,453658155,1183386710,-128546314,200951435,343276614,-1962522997,1446578262,957904140,326437446,854310955,1106804355,125242994,938901121,-1207601527,518718440,-231681,-390530442,1347590403,-493825,1134229110,1375731715,58497616,-310181888,535137026,147475805,-1873273344,-326412987,-2082959842,1187451628,-947912712,64070,32655047,-62470400,2122514433,91553798,-404111317,205949696]},{"sector":6,"data":[1962935357,10086659,-1377238146,81152,-1595341963,146688,54331252,-345017344,-62470185,-1070923766,-59310256,-1727641973,1654280274,-1996488701,1451880006,726684400,1996443840,138841074,-1957670247,1385761350,57252432,1347551232,16777114,-297401600,770725395,-628948991,-1706012160,65535,-1980479863,1183577686,-94991368,1928746553,-385649056,1178206066,-380209420,1187512170,-352295684,-230242415,1187447038,-348634884,-230242427,1187449324,-383315716,1187512184,-352256270,172395505,104671979,2144760832,343304,803858548,474623,669582205,540159,535364479,6503935,401201012,-196703233,-1962742397,1297948645,503318730,1430622296,-1910575989,1089242072,105286486,-1996488411,1996472390,242679568,-16091393,1996425334,-1002009326,-401698736,2122514798,578118596,13532803,2122516084,376766672,1357792909,1357661837,1355040397,-1866434817,29157390,1996430571,-1065943090,-2048389488,-297367294,-3115265,244367478,-1996297240,2122574918,477364416,-1961991519,-1559337962,378078040,113705818,860,-1544796533,1810563956,-1324595573,98620164,1178271776,-1589543188,378211938,1487081060,1511426307,1543948035,-1962934269,865725510,-1178457150,-120389628,-1037319629,189722763,721714678,-1962742848,-754667066,-330396704,243910699,468386676,1073960609,-1593615197,378209106,1487078228,1511426307,1946601219,-1593831421,2023949172,230727939,-1577302391,145820418]},{"sector":7,"data":[52816083,1958742784,81167,37558900,1026847744,108331011,-1983101301,144818758,-1035585269,954939261,-1149185,244367478,-1962811928,-936641458,184946219,185077251,1317665233,-2626622,1996484214,-401698624,1317732798,734538748,-351599090,-1035564059,-1065943216,1843924624,57189121,65947275,-1560057850,1889600364,201335811,57713409,49120094,1562371467,969293,1167087646,518818645,-326903666,1183667716,1996443900,142016262,-15698177,1996426870,175570700,1342187704,16777114,106859264,1954547702,2133295109,1586174187,-1946973434,1200164420,575129376,1586167808,508020486,1586167838,511673094,-955418842,65545287,-955883893,65545799,49120094,1562371467,838221,1167087646,518818645,-326903666,140413718,-1995290741,1200353862,-263812844,-1996339317,1200355910,-129595132,111687423,-887041,1996484726,244338938,-1980123672,1451881542,-364475914,1183433355,-364475396,-1980600585,1183575622,-261163012,-2081667447,1962935934,-294191312,1342177720,-1545073008,-1070903296,-401698736,1183383648,-327745554,1342177720,-1569136,-1070903296,-401698736,1183383740,-294191124,-16228725,-390585225,-996519933,-1996488698,1996484166,140413932,-1205438465,-1706032152,1794,-1947449719,1183517790,-1962440210,1183517278,-2096657940,-443874579,-900899553,1478361096,-1957345904,-661774612,425603,1996427892,2016870152,-365494512,121412105,233504768,-16222465,-1207067594]},{"sector":8,"data":[-347077216,49120236,1562371467,313933,1167087646,518818645,2122569870,309592070,-16222465,-16127434,-1710196682,1910,1996426731,94418952,-1674117296,-2081625331,-443874579,-900899553,1478361092,-1957345904,-661774612,425603,1996427892,-2009661688,-63504624,129014281,233504768,-16222465,-1207065034,-347077216,49120236,1562371467,313933,1167087646,518818645,2122569870,309592070,-16222465,-16122826,-1710192586,196,1996426731,94418952,-1506345136,-2081625331,-443874579,-900899553,50333188,-16399104,50403072,33589505,50341376,-16592384,50415616,33562881,50352128,-16679680,50358784,-16339200,27648,1167087646,518818645,-327034738,1448542360,425603,1048775797,1946157560,112645,-1070923029,-2083502455,127038,-1914109068,-1976107255,1354771206,16777114,1354771200,16777114,-1983894784,245624390,-465138430,-2095990109,1946210430,-26105,1391132672,109852415,425603,112723316,-1207702784,-768933880,922701906,922683018,922684836,-6681182,-1560280833,-1073019214,330830453,1788497952,-956301310,16911878,146860288,-1202667477,-11521595,185814046,-385649216,2122516654,359923718,16777114,112640,-26032,1048772608,1946157802,-797015103,722629888,-977776448,520048689,-1073015988,2078868341,1685512,-1309522295,1356911363,96154,-465139456,-7113664,211880054,236358407,-1471772409,1386894985,-26032]},{"sector":9,"data":[1996423168,-26104,1183383552,-128546314,722320033,1343258118,277362431,167524095,85402,-196704000,722320033,51412486,1343077382,277362431,167524095,91546,-666466048,722321057,1343227398,276313855,166344447,16777114,-62486272,460719815,548995071,-6664192,-1996488449,1967188550,-361300213,16777114,-16586496,-1947574645,38258463,1586167818,-954233878,-1962934009,126610014,-1996487675,-661937082,-1951906165,1200204374,72845570,-1995589471,-12736954,-955943425,108102,-1952162165,126461510,1353598605,1342181048,16777114,-1354331648,-1705974742,65535,-1951447416,-410931586,1137049855,1183654063,-1229434705,1191071745,-1371108690,-1705974742,65535,-150989128,-259323794,253894283,1149974275,-867792624,-1981135221,-1070919612,-1559009117,1178145638,1343256016,1345439160,323755775,58048523,-2096888855,1962935934,15460611,1342177720,1358579341,1356088973,1356613261,164250,1975520000,538163212,-26032,-706150400,1354771203,1355957901,1352812173,1353467533,16777114,1958742784,-1472790564,636934,309328,1312227152,1278672659,1354771219,46373456,1048772608,1946157558,-1472790758,505862,178256,32946256,-1070903266,-157659056,-16777214,-1928951242,1343652678,1342184888,16777114,-2000617984,922714694,179832488,1183469568,1357130370,377702029,1354771280,-26032,1183383552,2109737942,-700019914,1040186157,142016516,781434883]},{"sector":10,"data":[53127167,14042871,-385649344,582484776,-12261088,-383769160,40238910,105251620,52299334,-2096951319,1962987646,1354771218,1345439160,323755775,58048523,-956113431,52806,-1951906165,1183427158,-531199522,14304967,-1505326336,-1961985885,1452013126,-531219976,-1142357122,956857348,57859654,-1962626583,1183446086,2089207680,-2097151745,1946158718,171868947,208928770,958102177,2114877446,76343555,716064394,28706276,-8747383,242759423,-8747379,-26032,-1635057664,130482042,-26112,1187446784,-1962934042,1452013126,-531219976,770245502,956857347,57859654,-2096946199,1962987646,1354771218,1345439160,323755775,58048523,-1962792471,1178202694,-14779162,1183048822,1183517426,-754732558,-1070903072,102472272,-1073020928,65602421,142016258,-2066689,1996480118,-126418982,-1191807233,-1706033151,65535,32521859,-385649664,1654653406,-1981535741,-1072963002,-1561787531,-565802240,-1981786485,-1979746682,-1946191722,-2037786042,1487011700,1511426819,-565802749,-1579133303,1183384412,-797015078,-12291072,-34634,-1694533962,65535,645185547,15761027,-2037699212,-1769209994,1183448952,-531199522,-9140597,-2082847095,-2097023378,-385812386,1048837991,1962934798,59566339,-1962844695,931914846,-1310308725,65065732,-565802000,-1981786485,39094532,-1982183797,-1070922684,-1995684727,1149831748,105154824,-1962874391,931914846,-1310308725,65065732,-565802000]},{"sector":11,"data":[-1981786485,39094532,-1982183797,1183515716,1745224700,105154819,66864779,-1996264442,1183517252,138709376,58738315,-1996262394,-2002711484,-1978234085,-531220197,1178149749,-2095155746,1962990206,241344792,241440395,56235577,104400501,91489112,-352321096,-1983894782,1183518276,1946551168,-666486013,-1008139393,-427916543,-385646848,1654718906,1679198990,1511405838,959214851,1963153414,461938982,462034571,1977636409,-565823221,2122516085,259260634,31882883,1325336958,2089207782,-2097151489,2114053758,-463566053,2123046795,-754667034,-25590809,-16157696,-2033719730,130940,13532803,-1259797644,-362902784,-947699829,-1960867070,-1995964665,994110534,-10191867,92531318,-1190819062,-369688573,726679616,-6664000,184549631,-1203210816,-1706024941,147,425603,922686580,45614760,-1070903296,1347440720,125540944,113704960,66062,253894283,381165451,141489920,1183576203,272665036,-1695910145,389,-1207800343,1861681158,-362902548,67438339,-1538881280,-1947967861,-427914465,-405601103,1368064395,-1537307902,-1996339319,1586168919,242786724,-955807424,-14977530,-797015041,-2093124608,1962992254,-431584469,-1696053623,65535,58048523,-1946288151,1178200134,-1995344666,1183049286,1451426294,-2033778440,130940,55195391,-1705983957,65535,-8601981,-1960872960,931914846,-1310308725,65065732,-1962636304,1183384148,-531199522,-1996209013,2122570310]},{"sector":12,"data":[57999366,-2097115159,133694,-1700720012,2013673741,-1585480690,104405882,1988038264,-9271609,-1070923775,835041360,1277099856,1975520019,-18552542,-1962714975,-1996269034,1451875910,56402400,-1579530615,1174471540,-431554688,-234263,-1207523274,726663171,1347440832,-9795955,-1566945258,-1996488702,-1072966074,2028536701,1887865851,1820735999,-1962246657,973041286,2097113734,112656,-26032,117374976,-1092022664,1925088251,477364479,111687423,1342177720,16777114,112640,158046800,-2033778688,65394,957249697,444070470,-16222465,1996477558,1787203036,26890495,184549384,-385649216,1996488250,-461963512,-1914276097,1358916230,534170,1975520000,-31397629,957249697,58118726,-57367,1996425334,-1401487454,-9795955,-26032,-1073020928,99156852,-34018817,425603,1191120500,34382286,2110670393,-83039997,425603,1048775284,1946157578,-34281213,-150989128,-259323794,253894283,-964479229,33879558,2122535285,913572044,-1947574645,-864122081,93011339,645203769,-1947574645,263431,-866219184,67438475,112742400,-362902784,804724619,-26032,-1073020928,28837237,721611520,75200,210493649,201187712,-2096854591,1946209406,-864616696,580762,-797015296,-1710918400,65535,-1696303361,2294,425603,-2033754252,65384,13926019,1996425332,151296724,2122514432,141820066,-1700628737,1636,34487939,-15436544]},{"sector":13,"data":[-1207523274,726663179,1347440832,1100632144,-2097151991,128574,922688372,129500840,45633536,-2037559296,1343684456,1347469355,410266,-1471771904,-1549117813,378082150,-4713624,460760063,-1711164253,65535,425603,28841588,-1566945280,-1711276025,185,-1705983957,194,109721343,1342177720,14746,112640,4299344,2122514432,192151760,457979647,16777114,-2095322368,438846,922686580,-6682958,-956301057,438790,-401698816,1599996192,-1962742397,1297948645,503317706,1430622296,-1910575989,384599000,-1995326815,1048837190,1946157582,8841475,32521859,-2088798976,2080376446,108953977,1182020037,1048800235,1962934768,-364475066,-1070903274,-1202696112,-1706033151,2815,796180491,112342783,384452237,-26032,-1073020928,1183650933,-1706027286,65535,384452237,185440848,1586167808,176129020,-1951173632,2139356254,125108234,32521859,-1207602176,48955393,245612587,1975520002,112645,-1070923029,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,-1995326815,2122447942,1963004172,176063244,-2096335870,1946225278,209617670,-1962052336,1204288606,-1207959286,535494657,269254273,-2081131519,1963330686,176063248,721712384,-1962677312,-1264382394,-2084558074,-443874579,-900899553,1478361098,-1957345904,-661774612,-350950269,-330920668,-1070903274,1030224,28856400,-6664192,184549631,-1928235840,1343679558,16777114]},{"sector":14,"data":[-264338688,-713818111,-1962742397,1297948645,50341323,-16653312,50366720,50992129,50359552,-16528896,50400768,51000321,50360576,51002881,50360832,17352961,50333440,-16151040,50371072,34061569,50332160,-16147200,50372352,-16211456,50372864,-16656128,50373120,-16754176,50373376,-16531968,50374144,-16198656,50341376,-16163840,50374400,-16644096,50342912,-16373760,50343424,-16708096,50377216,-16325632,50346752,34152193,50341376,-16156672,50347776,-16267776,50348032,50955521,50340352,50517249,50340864,-16706048,50350080,-16622336,50415872,-16158720,50416128,-16336896,50416384,-16477184,50416640,-16259328,50416896,50966273,50345216,-16498688,50357504,-16699136,50359296,50365185,50354432,50996737,50354688,-16715520,50364928,-16507392,33536,0,1167087646,518818645,-326903666,512448010,529207074,-150989128,-259322770,-1962786677,1183384656,-61437446,16271047,9627904,-1202667477,-11521595,185814046,-1957595968,931859038,-1309129077,65065732,106859504,956843147,1736312391,957105291,1602028103,956712075,1467876423,956974219,-11502329,1962871926,-13304062,1996424308,-92864516,1342177720,16777114,-264338688,74711041,1022083115,-1962254709,-129594569,-523041615,1048637443,1946157936,108330765,-1710721793,65535,1962871275,141885190,-16769560]},{"sector":15,"data":[1183578182,-129615608,1676215165,112895,49120094,1562371467,576077,-2081649835,1448551660,58605187,-1207600128,48955393,1183432747,-65106946,-1995994353,2122576966,74711294,65781803,-1996262751,1187511366,-1593835274,1178141540,-385647370,1586168445,138906356,1183441962,-163149326,17385354,1688335942,-163170045,1183384446,-163148810,-1980611029,-125046714,16271047,-227112192,-964565295,82510722,-129629779,189777803,-2081062976,2130770046,26274051,99763851,1183384960,1714880490,-193528061,1342178232,16777114,-195130624,280567,-1961396993,145818695,-2143491885,1923155315,-1593185509,-654894222,-1070923029,721702539,1947075528,2047748867,-1240585469,-95516399,111687423,-1191414017,-1706033151,544,15222471,18737408,57673463,58064640,-1962900759,1174663750,-754404880,1645120480,14778371,1836499259,704865184,-1947169820,1174663750,1006144488,-1957005314,1183443014,1979595748,-1472790751,-62456058,-1191414017,-1706033151,691,737166987,1183443014,-263812122,1671433195,736373251,1183445574,-398030362,-941195637,63558,66221707,-422452106,58902145,189777803,-1391493440,-336050687,-263812109,-1981397367,2122573894,1585316070,-1964351861,1038363143,57999361,1023444201,2138308613,1962936637,-228684987,-2020875311,1174471554,-25263354,-1591643136,1178141566,-15106830,-1593399242,1183384434,28856572,-6664192,-956301057,65094,-772645237]},{"sector":16,"data":[-2105046045,-129619709,-1423617,922740302,1996424872,-92864762,518669963,-428409008,226202,-129594624,-1962523135,1174529606,-263812118,2112374329,-19339005,183780995,-1946283799,1207432286,1950351362,-362902591,1963016064,-230257868,1376125849,1410732803,236337923,2082635527,201734918,-1206226169,-11531777,722368566,28856512,-4698112,-6664192,-352321281,167753745,112720,16758864,-26032,-22937600,-1472790775,108461830,-1191545089,1344145919,705298080,-6663964,-1962934017,-472780194,58886027,-1946663383,1191178846,-1948003854,17007239,1191118406,-431030294,1593757673,1575324511,459970,29884675,655362,48300291,2162690,25231363,12255487,55967747,12517631,54722563,12583167,11534339,21889279,8716291,6619391,0,1167087646,518818645,-327034738,-1957297834,-1961942498,1488927,57028343,1082912907,72387330,-1980348791,1187510358,-956301062,54854,14960327,-1983894784,1183443014,-62486042,-1948023,-16559050,1375949366,-624897,-1929157066,-1705988538,65535,721644705,-1996265466,1956770374,-364476157,16008903,-1371108608,2080376637,539914,1664967038,-11504640,1996467830,2016870320,-1472790768,309254,12229200,-1706033152,192,-2472311,1996467830,-2009661518,-1472790768,440326,-26032,-1706033152,65535,-2082978167,1962990206,44951811,678805515,-1962760471,1183432774,-1035564070]},{"sector":17,"data":[-1193785719,-11534334,1996476534,-25906,1183383552,1975520250,42068255,972179083,141941318,971654795,91543622,-352321096,-1983894782,-873728954,1183432747,-431584792,734807691,1376125906,1410732803,-297367293,-1947183479,1452009030,-799655448,-1779891341,956856064,58183238,-1929344023,-1924079546,1358868102,57030399,-1018113,1996484214,-159973384,-1949415797,1177276502,-397009946,259510795,3999090,-1962380543,1177275974,-1207702554,-1706032896,65535,-1694861569,528,-22378871,-22243703,58049035,-1929258263,385789574,-431584432,-22379005,1996443730,-25888,1996423168,37853946,1183514624,1174510048,-397012506,-297401959,-370125295,922746717,-6682968,-1996488449,2122572358,91579310,-352321096,-1983894782,-1072960442,-1947663499,-1472790784,43162118,1183383552,1975520214,24242435,-1694861569,65535,-1983363447,-1039414698,1558774645,-1102672639,-6664170,-1996488449,-1072962490,1223230325,-1983894783,1183435334,-92864568,246682,-696844544,-1696303361,702,58048523,-16701719,-16340938,1996425334,-227082490,-1411329,-1070868874,1996443728,-663289894,-1174396744,1347551436,16777114,16181504,16023171,-1914109067,-1472790784,-26106,1183383552,1975520214,14543107,111687423,-2459905,-6629258,-1996488449,-1072962490,-991362187,-696844544,-26032,-1073020928,-1259797643,-696844544,1347469355,-2459905,1656281206,16759296,-6664110]}]],[[{"sector":1,"data":[184549631,-385649216,1996423315,-1367932970,201626,1975520000,8513795,-2722049,1989868150,184549379,-9276224,28890742,580538368,-385875965,922746685,1996424872,-25938,922681344,1996424872,108461832,16777114,-1371108608,1946158909,539911,720051572,11566723,2122519924,259260594,111687423,-5212417,-6638986,-16776961,-16340938,1996485238,-25878,922681344,1996424872,-25862,1183383552,-495025156,-15958528,-16340938,-6626698,-2097151745,1946211966,-696844536,16777114,-461470976,-16223232,-6626186,-2097151745,1946221182,-327253218,-1961856000,1175177286,-16223030,-6620554,-16776961,-6620554,-2097151745,1962998910,539277321,-26032,-2090991616,-443874579,-900899553,50338052,33751809,50363136,-16676864,50403072,33747201,50332416,16838145,50335488,17025793,50336000,16879617,50336256,16891393,50336512,33774337,50334720,33763585,50334976,33778177,50335232,-16524800,50343424,33742593,50339072,33676033,50339328,33717505,50340608,33786625,50341632,33704961,50343168,-16753664,50349824,33695489,50344192,33729281,50344704,33684993,50344960,-16665088,50354688,33790209,50349056,33793793,50349312,33593857,50352128,-16736256,27904,0,0,0,1167087646,518818645,-6629234,184549631,-1206291264,-1706033151,125,112868995]},{"sector":2,"data":[-1710394368,65535,74825739,434880555,113247943,1996423169,-26106,-1070923776,-401698736,28836102,49120000,1562371467,182861,1167087646,518818645,-326903666,1354771206,56218,-96040704,324024063,34458,-62486272,1342177720,16777114,-1976107264,-26106,-11534336,-1684342154,-16777216,-15713738,-1365575050,-2097152000,449086,922684532,1996424922,12753658,922681344,-929429866,-16777216,1996487798,14785274,-1706033152,231,113000067,-15174656,230227062,-6664192,1342177535,16777114,-140881920,-2097152000,450622,922683764,127534816,-2097151999,451134,922683764,-6682910,-2097151745,48702,922683764,664404158,-2097151999,49214,922683764,932839616,-2097151999,49726,922683764,-6684480,721420543,-6664000,-2097151745,-443874579,-884122337,1167087646,518818645,-326903666,28857868,-6664192,-956301057,64582,-1564976149,-59836672,295706251,1183385347,-1965519882,2133067079,1047792444,33834998,2122528884,208928774,-14786677,-26057,233504768,-1946788213,939466335,16777114,10663936,-1946390793,-1608610832,-2093546735,76154310,185368612,1191117960,195600892,2096907833,-310157667,535137026,46812509,196621,16711691,196752,16711704,16973977,65815,16973841,196927,196614,16712031,16973889,131215,196653,16712101,196943,16712086,196944,16711716]},{"sector":3,"data":[16974161,196666,16973877,131255,16973893,196721,16973890,131173,87,0,0,0,1167087646,518818645,-327034738,1048772920,1962935986,112645,-1070923029,-1949284727,356321862,1025209344,57999386,1023508457,57999387,1023583465,57999389,-385675799,-6683825,184549631,-385649216,1048772836,1946158810,-633929880,-1875443962,-1908998394,13736454,922681344,922683098,922683028,-493222254,721420288,-11513664,-16346058,-1710845386,65535,-20019575,225820683,1342179256,91034,-830043904,-633929730,-826867962,12163838,-1706033152,302,114964223,110507775,61338,977175296,1316225040,272250623,110114559,109983487,16777114,976682752,-1808335088,-1841889530,17734150,922681344,922685498,681182870,-2097151999,434750,1048778868,1946158748,-1573454063,-1808335098,-1841889530,26122758,1048772608,1946158730,-1976107239,20879878,-11534336,-1710844362,372,24812112,1048772608,1946162000,1345781593,56138259,-2037841920,112787148,-2019930112,1375731713,-26032,-2037841920,-1072955702,79170933,1654280192,-1996488701,-79226,-78666,-1694577994,65535,-26032,-1224802304,163118796,-6664192,1375731967,-26032,1048772608,1962934958,32893187,191512195,-385649664,-6684181,-385875713,1183515107,138808070,1996437876,108461832,382879373,2013264,50829904,1183645696,-55029550]},{"sector":4,"data":[-459649022,184549377,-1928039232,-1202662842,-1706032404,582,57982987,-1593728279,1183390542,262578672,-1577433463,1183387428,-25860,-1073020928,-1326906507,-930691328,-2097151746,1946218622,-92372131,-2091420672,1946221694,1312719697,1249116187,262553219,-2092731392,992318,512441460,939465550,-1024373,39492151,-1073020928,512436341,939462566,-369013,40802871,-1073020928,512431221,939462436,-237941,51878455,-1073020928,1183519092,-930706992,1975520254,302434054,-2097151742,1946218622,-260636920,171930,-92372224,-16223232,-1382352266,-2097151998,1946221694,-59310328,16777114,-927038720,57999614,-352266519,1073920098,-26032,1183514624,458138608,-1543879029,1183518630,254059516,-2097105175,1962987646,11397379,458112643,-385649408,1183514787,138808070,1996433780,108461832,-19888499,12079126,-6664191,-1929379585,1358876806,458104459,-6670337,184549631,-1703774784,65535,-1560280648,-358415854,1354771202,16777114,-1036090624,1433731078,271857407,1347469355,-26032,1173028864,113000067,-14322688,-1710010314,65535,899152,-26032,-1706033152,166,11311696,113704960,1724,28575431,-6619137,-1207959297,-11534335,-6631306,-352321281,49120164,1562371467,352766541,2130707200,234946307,-1862204671,117440770,1644233472,16777728,1174471424,2097152771,1929446144,150995456,-754973952,-1543438591,-1040186624]},{"sector":5,"data":[771817218,-1962933504,973143811,822084352,1057029891,-1493171456,1157693185,1744896768,754975235,536871680,1241579267,33555201,1375796994,1258357505,-1275067647,-2080308480,1023410688,-973077760,1510014721,1375798016,1107296769,1845560064,1157628419,503382784,1107297025,-1795095808,1459618304,1124074240,-167706880,0,0,0,1167087646,518818645,-6629234,-1962934017,-167555554,141852679,-1207750680,166395905,184557288,721974464,-6664000,-16776961,-1709487050,65535,-1962742397,1297948645,-326412853,-1955140477,-1962717666,1183385159,206015428,-1191295351,1344144166,1347469355,1380188346,1347440720,-1976107184,922701830,1347421836,16777114,112239360,963952651,-26032,-626851840,1958742790,-1617276899,-1560281088,-1073019172,922685556,-6682918,-1560280833,-1073019170,922687861,-6682960,-956301057,438278,-26112,-1070923776,-1207794711,1347420161,-1070903216,-6664112,-1560280833,-1073019164,1048825972,1946158816,-600375535,-533266682,18323974,-1073020928,922686837,-289929588,-1706025466,297,185000099,-2086439744,451134,922685812,922683100,1956251362,184549377,-15174208,-1207530442,1344145142,16777114,115516160,58048523,-1912638487,726715462,850940096,-6664192,-1207959297,-11534176,-1207065034,-1706031712,65535,1183439095,-867791412,-6664170,-1996488449,-1072969658,922687092,-1706031398,761,141934603,-1698138369]},{"sector":6,"data":[65535,109067907,-385649664,-1667170077,-1980182259,-120471482,1183447249,-1069118530,1174665425,-1677327424,-1035564784,115357439,1342181048,378160781,37526096,1183514624,163158412,-1980107008,1183553606,109093774,1183432747,-754732644,149554656,-342210935,-1705079993,-1983756661,-1705080057,16926663,-1705080064,26756747,1183564358,71797186,-1952817525,-1992257978,2122516039,108265884,77364867,1183516021,-1962677312,1174519366,-1673068606,144328323,161250947,922727292,246941410,1183666176,-1706027382,65535,-1718860149,-150993479,149464057,-1550956917,922683698,1183647450,-1706027362,65535,731924107,100901958,67438898,-2147090176,1310624518,-2146467837,-1962508127,721636894,-1992290745,922733126,-1070919628,-898171056,-1950058753,1177288262,28856522,-1264955392,-16777214,721858614,-11513664,922731638,-1706031488,65535,112211711,16777114,-633929984,112646,-26032,922681344,922683098,922683024,-6682994,-16776961,-16328138,-16346058,-1710845386,65535,114964223,110507775,207258,1354771200,-1808335024,-1841889530,-26106,1183383552,1975520198,505868,-26032,1183383552,-633929786,-965279994,16777114,-1338573056,112646,-26032,922681344,-6682960,-1207959297,-443875327,-1957313699,-633929748,1354771206,1245118288,-2143879405,-1707671802,-1741226234,63740422,922681344,-1348860240,-956301312,438278,-401698816,512426119]},{"sector":7,"data":[662700878,-1979267201,-16776959,722482230,-11513664,-1592571338,103485460,100864022,1346373248,1342177720,171930,-1979267328,-16777215,722483766,-11513664,-15513034,-15722954,-16344522,-1710843850,1326,109721343,1347469355,16777114,1575324416,-1873273149,-326412987,-2082959842,438334,-1070921100,-1873784752,11528206,-1962742397,1297948645,-1873273141,-326412987,-1579643362,-324860186,108347398,116131527,1048772608,1946158786,115783699,-18352,243792,74160720,652935168,-1202667477,-1873739777,223864846,1342177720,1358954424,1256722064,178189,-18352,-401698736,-1229451971,-4698101,62411007,2073710592,-1207959548,726665396,448286912,-6664192,-2097151745,-443874579,-884122337,1167087646,518818645,1048828046,1946158822,1354771209,-401698736,-310178567,535137026,516640093,1430622296,-1910575989,1659667416,512448087,1200292686,-96040694,687747,1038680948,108954371,-1593084672,1178143028,-385649158,-1667169659,-867792627,114964223,382617229,39623248,-2136932352,839265030,-1991751671,1317793350,-733074480,737431177,-129594943,-2084026743,1946158718,-633929885,1354771206,1245118288,-2143879405,-1707671802,-1741226234,93755910,922681344,922683098,-2136928100,-1706014714,1378,114964223,323630847,1208385697,91396688,922681344,922683098,1996427420,97557230,922681344,922683098,1996428106,98409198,585826304,114964223,-11485141]},{"sector":8,"data":[922732662,1183519562,-934925330,-1707671728,-1741226234,-26106,922681344,-6682918,-1996488449,922742854,922683098,-1070919524,1245118288,-2143879405,-26106,915079168,1982533788,-14816262,1443289654,-1694992641,1545,114964223,-294191274,399002,-864681216,323630649,1183571327,-772222476,-129629704,-1949532463,722508854,451672694,114964223,-126419114,410778,-633929984,1996445190,106011374,1979908096,1245067724,-1948418285,-120458170,1174534353,-864646152,906231505,1982533788,-14816262,1443289654,-1694992641,65535,114964223,-294191274,16777114,-864681216,323630649,1183571327,-772222476,-129629704,-1949532463,-19805066,278672899,-335907285,-633929955,1996445190,88120056,922681344,-11139366,1385885302,50331653,909757558,-578874550,1342178744,16777114,-901347072,278673035,-1325763029,-213481424,-369998200,2122317972,125188595,-957200642,-2144275642,1966142078,112645,-1070923029,-3783031,-1962485194,-230453768,45633558,1355229952,16777114,-1002010368,-1949678077,-1324508138,1006293763,-14385982,-1962485194,-972830138,-931725488,-1950058753,1177284166,922702024,922683034,-2120612200,-16777207,-1962485194,-972830138,-934900912,1356088875,-1916371317,1343681091,721420984,-6663993,50331903,-32662474,909767494,58594122,-39959,-16328138,-6623114,-2097151745,1962935934,10414339,-16192834,-16327626,-1710825418,1947,712359947]},{"sector":9,"data":[109852415,503770808,16554576,-526188544,1958742790,-600375538,110776326,184549384,-1710787136,2355,1187471595,-1962934078,69928004,-4307319,-16328138,41221940,105155408,1342325803,115095295,-138262901,726711918,104419520,141821596,-1174378824,116064409,-1174396744,1347551436,16777114,147227392,-2084419841,2081014398,-600375374,-466157818,155884038,2122514432,57933832,-1962779927,-787945410,278700543,1183434539,323658152,278660651,1183434539,-432110684,209059590,-11485141,-1878594506,157018126,1353336461,16777114,112640,-1350664112,-1207602176,267124735,766330507,-768933648,-150964039,1346388209,786960016,178185,-1400995760,-1207602176,116129791,95045259,-1873805307,152299534,305805055,459945727,459814655,16777114,976682752,1781989138,1748434715,-26085,2122514432,1635057670,956904609,1500904006,51054753,990579206,1963701766,185114956,196609593,-1063173259,101067533,-1173996789,-1103727349,415172788,956664587,-2094369532,57999420,-1979613463,119800389,-1969207672,119800388,-1969338744,1178116166,-2144111458,1946394238,1963146244,323658025,149423619,842465104,112649,-1070903216,-811970480,-1996488704,-1072956346,-1164308363,-385875968,-964493005,80184068,922722283,1996424926,15375100,-1706033152,384,115226367,1347469355,51595937,1342760966,154285823,110902915,-1593216000,378209944,116065946,-1174379848,1347551487]},{"sector":10,"data":[633498,-633929984,1354771206,721846433,1208562182,323658064,149423619,842465104,-1707671799,-1741226234,57055750,144769024,168166155,196518667,-1559557983,-1063187528,306881293,184944171,-955532637,48198,-776184181,-1229455389,-1674117365,94418957,171022928,-125108224,200965675,957644031,259957886,-1950583041,-956061626,1354771280,-16236824,2122562630,-998505540,-2096581442,1962935934,186169423,448288336,-6664192,-352321281,-1502150849,228341503,1342546104,711578,737708800,-15992194,2117673852,-1977712988,119800388,91554620,-352320328,243715,-1471771824,726714115,-521645888,80118535,1183384715,1975520166,-96040008,1577661603,49120095,1562371467,445005,1167087646,518818645,-326903666,1187468866,-956301064,62022,14960327,1354771200,16777114,1975520000,103409923,-16222465,1183647350,1183666416,619204846,-260144378,-385649661,1183514987,-1677317370,872809232,-1598533623,922701829,395971996,-1996488693,1187503686,-2097151774,2097406590,-497120404,-1207966767,1996426166,134801630,1416937483,-1981659509,-661915066,-1207966767,922684342,-1598550628,194662405,-1962934260,-787945458,62991353,722508806,-1995885562,922744390,-1588590886,103483008,1346898226,149436159,154285823,-1174402632,1347551317,466842,15853824,-337492225,-532232306,1187446784,-1962363672,1065609310,-2096204544,2081218686,-26033,1558773760,-396457211,1996437503]},{"sector":11,"data":[125888734,796180491,-1947705717,39291655,-1981135223,1183509590,635710188,67436551,474368,79168885,-1207702784,1183383555,-361299974,-43031,1183047750,-1544878872,1357530765,-1202667477,-1706033150,1074,-402229505,1183385451,-432110614,74776582,48956592,69994416,1317668644,-119439124,1183367434,115778028,-1996487931,-11470266,922741366,-1598550628,-224767995,-1962934260,-787945458,62991353,722508806,-1995885562,-1202653626,-397410303,1187448343,-352321032,-260144364,-385649153,1996424347,-294191120,1458048656,-1338573051,-26106,82378752,-260144383,-385649661,1183514839,-62486266,323618363,1252066686,-1593251053,1178144924,-1996259844,1996487750,113633532,1004947081,1980910086,-92372212,-1593410301,1183388234,-92371994,-2095547389,2080376958,109093243,154273283,2114471483,-427916433,-2090241024,1962996350,-163149033,149425803,-1056704047,108914768,1978025531,9038083,33048263,-226589952,-15960832,1996487286,1354771446,-16425240,1996487286,-1674117146,94418957,22321744,243990528,-103741208,100909355,103485596,1183385908,28856566,820531200,-230242555,1038811136,15892099,1996426357,-159973382,-397361109,1187448087,-352321038,142016292,-1928956161,-1924074426,-397349306,1183515551,-196724240,1996426101,-294191116,1189613200,105286916,-26032,-1073020928,-320273548,-25858,2122514432,57934832,-2097080343,1962996350,-92864756,737572607]},{"sector":12,"data":[-1125625664,-125926652,-1961135104,1183385158,1241922556,-1593475565,367727434,957389985,276692038,1183517675,-401699850,66703624,-62486079,-386107649,1183384967,1241922534,-2096335342,2097412734,306880774,-2082060663,2080635518,142508833,-385647360,-2136932194,839254790,138820361,-1880554625,-427916544,-385649408,1996423302,-428408838,228341503,1342546104,647834,-401700096,737792264,-1677327423,872819472,-1070903287,69331024,66748035,1988831357,-2115579398,-1962166586,70903366,28837236,721611520,109487040,58048523,-1962900503,76146246,1183546603,-364475930,-2081923445,158662719,1357530765,-351976984,-396457115,1996437503,100264166,1450557451,-387418369,-521468675,-2081923445,1182007359,82831443,1996439787,108461832,1358186125,1356613261,-1962785048,1178202182,-15763980,1183577206,-297367076,-401698736,1586168553,-1948003858,-2026246586,91490022,-352321096,-1983894782,2122572870,108265700,15761027,1048777077,1962935942,-2076278006,57999366,-1929253143,-1705982906,65535,-1961677663,957558294,2082172438,956727053,1981508614,178181,-1070923029,244044331,512433004,237706094,505092968,1317608298,-631338536,-635713493,-1983885687,699974238,922701824,922686010,922688362,2122521448,108332016,66748035,1183516797,-631862312,1183516395,-1034515520,-4698030,1385779455,-1032388784,734033663,-6664000,-1962934017,20836422,1024291840,443809794,1946157885]},{"sector":13,"data":[18409762,197019335,7911424,115879671,-371964279,1187447046,-1593834306,86836970,-1947342080,71170630,-385649152,-1073544984,-1476448621,1187451020,-1593834562,103484342,1183386552,13560276,722187937,-1995720698,1183700038,-767129138,1191172235,50841298,1356088973,-1194166529,-1706033150,4280,1355695757,-1705983957,4292,29247175,196649216,1187495147,-1593834818,103486026,-1360327750,109315783,512425984,529207074,-150989128,-1961739730,339774448,198592137,-1205373504,-1706033126,65535,1087784585,-1863777419,572427008,-1205892337,787939350,-259321286,-1982445941,-1263004608,1586188296,-1204289578,-1706033126,2591,253894283,381165451,976156416,-2131719406,-956168632,-16605690,-25857,1022033920,264769462,269750278,113709076,1670,-1982970227,-661925306,-1965930753,126402118,1356088973,-1194166529,-1706033150,65535,1355695757,-1705983957,65535,1355040397,1342177720,16777114,-310157824,535137026,80366941,-326413056,-956109693,65094,-1308735861,98620163,1344145642,-16091393,-6682506,184549631,-1960676160,-1072955834,20807548,1029799424,1971060738,2113930301,343392,138242940,-346063360,-28901532,167673475,-2136884612,839265030,994592777,595528262,-1961845599,-787945458,1002515449,326961222,-787945311,1241908216,138820371,62391678,-1207702784,1586233343,-1962440442,130483294,569114623,-955883893,-352321529,106859280]},{"sector":14,"data":[67527,1586169835,34064134,73304832,-1979824501,1575324423,503318722,1430622296,-1910575989,183272408,138840918,-435822383,-96040698,126605451,972834441,1970538054,114966147,1030124544,762642431,61993099,-964565293,922683626,889128666,-1962773249,69928004,105155408,1342325803,-1174402632,1347551317,1190298,108954368,-1959889665,61933174,-964565293,922683626,889128666,-1962773249,69928004,105155408,1342325803,-1174402632,1347551317,740762,-94467328,-1996077429,-310157817,535137026,80366941,-326413056,-1593643901,103483008,-1991767758,922746438,922683100,2124023522,184549394,-13994560,-1207530442,1344145142,494234,115516160,242532363,115095295,318413392,-1073020928,-1533409419,-352321529,-566821007,108461830,-11485141,-16193482,-16174538,-1962484682,787941446,726665448,1723355328,10074624,-308653998,-16777198,-16328138,1996424822,-399048706,842465032,-566821111,108461830,961593387,141820998,-1174402888,116064307,-1174396744,1347551436,519578,-600375552,-466157818,125344262,-443875328,442973,-2081649835,1183515372,71707398,201213577,-150635072,-28931624,149436159,1342546104,228341503,1268890,1006162176,92208710,-352321096,-1950340350,79846885,-326413056,-1962742653,103482438,100864156,-1202714316,-11532896,-1710384074,3589,-1174518135,755302490,-1949160704,-135006247,1575324641,1426064066,-950604661,17204230]},{"sector":15,"data":[73304832,1150022539,106203908,1468598153,73304834,67389059,1962950531,-443851036,180829,-2081649835,-1957296404,126551134,-1090894199,1139476660,1996436735,11135226,880066571,-1979425141,119800391,-2147332982,-1053161503,126554228,-1996335221,39094532,109315783,28835841,-1070903296,112720,-401698736,1793847477,-2096839037,-1200291780,109315783,-1262616575,959376136,645397062,71601494,146061392,-120469973,369491492,1754943488,-1962934256,126551134,-1996335221,39094532,-964481813,-1996190972,-1072956346,-963917451,-787958739,1039716856,310181900,-1962647925,39291655,1418265737,71616258,-1956773888,46292453,-326413056,-1962742653,1177224774,-28931836,92127243,1183439095,-25263106,-1207599782,48955393,-443826133,923058781,-620690688,16777730,-905903360,33554946,1057030912,2080375555,872416000,-1627324672,-654245120,2130707203,-1509948672,520158984,-335478016,150995458,184550144,-1560215808,1795162880,604045071,-2046819584,-1493106928,-1593834752,671153930,-1895759104,318767622,-2113862912,335544838,-335543552,738262799,-1174338816,369099269,1157628672,-1375666424,-788528384,-1358889200,-335543552,-1325334770,-1795161344,-1308557560,1241580288,301990668,1711342336,318767885,-184483072,486539793,-1627323648,503316997,587203328,939589396,-872414464,956366603,1124139776,553648647,-1224670464,570425874,-2030042368,-1140785390,1593901824,654311943,1526792960]},{"sector":16,"data":[754975250,654377728,805306889,1963000576,687866624,1912603392,1224802059,906035968,704643843,-1895759104,872415744,-1124007168,754975490,1828782848,-1358953710,1661010688,956301825,721421056,1392574208,-1593769215,-1291844858,1509950208,1409351437,167838465,1023410691,1862337280,889193219,-1459551488,939524867,1342243584,1157628425,-134216960,-553582833,-2113862912,1107297024,-1174338816,1375732225,1124074240,1795227393,687866624,1812004627,-16710912,1275069200,436273920,1459618307,-385809664,1526727174,-301923584,1560281604,939524864,-2113863920,0,1167087646,518818645,-21440370,2122534921,91488262,-352320072,440323,-26032,922681344,45614750,-4698095,-1202708983,-1202712318,-1706033024,65535,-1962742397,1297948645,131786,1966083,10617087,3670275,10027011,0,0,1167087646,518818645,-326903666,205949738,1946157629,343411,255682164,1024685056,57999873,1023480041,57999875,-385808151,-6684397,-16776961,1183649398,-1706027306,65535,-1202667477,1347420161,26522,242679552,383141517,-26032,28835840,-1070903296,-6664112,-2097151745,124478,-1070921612,-26032,-1070923776,14281113,-1559869813,-471133366,115097219,-16157696,-1710826442,183,115228291,-14912512,-16327114,-1710385098,209,14129744,922681344,-6682914,-2097151745,449086,922702196,230164186,-476426240,1342177280]},{"sector":17,"data":[59802,43667456,-16777215,721869366,-157658944,1342177280,64666,-633929984,505862,-26032,-1706033152,65535,18848336,922681344,922683056,-6682918,-2097151745,451646,922685300,-6682908,-956301057,451590,-1547687168,-559741220,114991878,-51991,1996425334,-26106,652804096,242679807,-15960321,1996425846,108461832,16777114,49120000,1562371467,202033741,1426129664,1795162881,1979712256,1090584320,-1476328704,754975232,1073808128,654312192,1510015744,671089408,1040188160,1426128641,1291846401,1442905856,855638785,1459683072,-1811873023,1140851200,-1375665408,1157628416,251724544,1140851457,-889126144,1459618304,0,0,0,1167087646,518818645,243325070,-402583543,1048772790,1946159984,153518087,1005321744,109852415,-1728048712,922701906,922683018,922686004,-1684401614,-1560281088,-1073019222,922684276,-1415966668,-352321536,-401698802,45613766,-1147514816,-2097152000,-443874579,-884122337,1167087646,518818645,243325070,-402518007,1048772690,1946159984,153518087,1005321488,109852415,-1728048456,922701906,922683018,922686004,-6680014,-1560280833,-1073019222,922684276,-6680524,-352321281,-401698802,45613666,-6664128,-2097151745,-443874579,-884122337,-2115204267,1459668716,269066326,19260458,-96040704,376750091,-1962476383,-1996030442,1451883590,117481982,117577355,77665515,102140679,-62486265]}],[{"sector":1,"data":[-1577167223,378210056,1183385354,-128546314,-1961878367,-1559224810,378082098,-960556236,459849227,96012062,-1700400640,65535,-1705983957,65535,-1705983957,65535,58048523,-1962861591,1452013126,-27903496,1178167413,-10258948,-1928113610,1358905478,1342190520,16777114,151451136,91488528,-352319816,505859,-1962930395,-2130751346,-1056182047,-11499895,305805055,-100609,-2037515146,-1705967808,65535,191905411,-385649664,922681708,-6680006,-2097151745,-2096957882,-385812394,1183514792,-128545802,-2097151443,-2037841702,-1769341124,1446772542,-385647106,142540940,2013021755,8579331,305805055,-12810613,-12675445,-2097151699,1347551450,-1202667477,-1706033149,65535,236994179,-967082495,1493121670,305805055,-12667137,-12798209,-12941683,112720,229161040,1354771280,16777114,1883144960,57933835,-16720919,-15582666,-49482,-1191232330,1385758721,2147465296,1354771280,-1706012592,65535,191905411,-385649664,922681520,1183647370,-1202710874,-1706033072,65535,1353074317,16777114,118530816,-955747008,462854,-14947584,-2096723402,1946221182,118667269,431490027,1390054407,53910096,1183514624,-27882500,-1995217245,-1559009258,378081312,480448546,504793360,-1957670384,1452013126,142840,1375787651,-26032,748879872,773228819,270836499,270931593,325596927,325465855,325596927,325465855,16777114,1354771200,16777114]},{"sector":2,"data":[470206208,-1711275774,65535,191891143,1599995904,-1017256565,1167087646,518818645,1048828046,1946158864,-1976107232,270437126,503810823,-26032,922681344,-6682864,-956301057,462854,56138240,922681344,-1415966150,-1711276031,300,-1962472287,-1559818730,378082150,547558248,571902224,976682768,-26094,748879872,773228819,270836499,270931593,-1705983957,308,269035136,153518334,849476880,873892627,270312211,270407305,197670655,197539583,197932799,197801727,193946,98867712,113704960,1706,-1962742397,1297948645,-1873273141,-326412987,-2082959842,-950655252,167701574,253894283,381165451,976156416,-1947170030,1183386688,205949942,1962935869,11462915,1962938429,46852355,1946226749,17906955,-1427569803,10676480,-1559345525,922684352,922686010,922688362,-6677656,-956301057,34158086,102664971,38272768,16154243,884475253,-1962546417,126613086,-244087,112725622,312561664,533771,84253264,116785152,1946226697,-330920692,-60912816,-351111169,-330920690,-60912816,721569675,-11529145,-1207772106,-1706033142,65535,-1207011585,-1202716667,1344145918,16777114,102664960,38797056,-385875528,2122515049,108265482,-1559345525,-1070922060,-1962780439,20777542,-385649408,37552648,-385649408,54329856,1026585600,57999364,1023462377,-696975354,-1207011585,-11534330,-1706029450,65535,91602955,-352321096]},{"sector":3,"data":[1354771202,16777114,-1197348096,-1706033151,1496,-1804287989,31999686,-1961136991,958098966,1964730902,1745238283,-1207601893,468388334,305805055,459945727,459814655,-1202667477,-1706033150,508,1343200440,1356744333,1342178744,91546,-514949120,112704,976682832,1781989138,1748434715,1347590427,1358954424,726684313,1347440832,396186,976682752,1781989138,1748434715,-398029541,112720,-565801648,1354771280,141722,470206208,-385875710,748814078,773229331,1711680275,1746279187,-129595117,200955529,-385647150,125828834,58179595,-1191257623,-1706033150,316,58048523,-1694578199,776,1342178232,305805055,325596927,325465855,-362753,-4654986,1385779455,1354771280,-6664112,-16776961,-15582666,-15505354,-15505866,1996487286,2147465464,1354771280,-1706012592,596,-1946256919,1317788742,130122730,1283375419,-1588543445,103485240,103485446,-1706030614,65535,-2472311,922685046,-11530234,-15696330,-6628234,-16776961,95948406,-6664192,-16776961,95948406,-6664192,1342177535,18330,-31397632,-1411329,112725622,-191213568,1342177284,-2031612272,-401698816,922745970,1183649920,-1706027282,65535,276838143,384714381,1354771280,16777114,-1274624256,-16777210,-6680970,-385875713,1183710678,1996443882,374798,-26032,-1073020928,-1075248267,-365001731,-1737228286,-1588543445,103485238,103485566]},{"sector":4,"data":[-1706030596,1616,-153336183,17828102,518587253,276734463,1593777129,-1962742397,1297948645,503319242,1430622296,-1910575989,317490136,269066326,19260458,-129595136,158646283,-1962476383,-351863274,117743879,117839499,-1980742007,512488022,529207074,-150989128,-1961739730,205556720,737822345,-1684385600,184549384,-385649216,2122514674,963969274,1342190520,16777114,-96040704,-385649344,884474074,1586188303,-1204289542,-1706033101,1369,253894283,381165451,976156416,-1947170030,1082784326,-94467316,1183385483,-125926404,-1962249216,138841048,-351123575,-60912882,1150022539,138816258,-954972279,454214,425603,1182991476,2122516718,57999608,-1161473,-15582666,-15505354,-1592564170,378213164,19731246,14320384,865751122,1375731720,147167824,922681344,922686254,922686252,922685028,-761655710,-1560281086,378082092,1721832238,1746307859,459842323,459937417,-1961677663,-1559024106,378084204,1187388270,1183451636,-179926802,1358186125,-1705983957,2602,49120094,1562371467,313933,1167087646,518818645,-327034738,1448542342,184960651,58001478,721533673,278548672,184549381,-385649216,2123170219,459849454,96012054,-1952058880,1451952710,-364476148,-1288567,1347554934,601242,172395264,51140235,1444087366,1645120264,1679723278,-431060722,1005084297,-385647149,125763737,57917755,-1962897175,1452009030,77288,-1996432765]},{"sector":5,"data":[1451876422,242679778,-1070903214,112720,88644176,512425984,1065357228,-385649652,1996423386,-327745778,-1695910145,2489,-8733043,369820350,3389703,1996465650,-532247794,98719371,-763166718,-1202695680,1385758721,2147465296,1354771280,-1706012592,1580,-15829249,1996481142,2055638496,-1734717185,-2097151999,749630,-1097180812,-956301309,451654,269027062,-16550910,1183573062,206998282,-1994692445,52128278,1444087366,460104456,460199561,305805055,-2097151699,1347551450,650138,321691904,321787531,241440313,109001596,241305145,28849014,-2093946112,17581574,206050947,242679552,-1280257,798681718,-1593835516,378211938,1183387236,-396981786,-1947842933,-1259739050,-1983894530,-1072956346,109251188,-2097016020,1256982,167265990,-1998305654,1183709510,-1070903048,-26032,2122514432,175374588,321662595,773751554,1996423187,-294191120,460207871,460076799,244122,-2090902016,-443874579,-900899553,50341130,-16615168,50368000,16989953,50333440,50774273,50363648,-16478208,50372096,-16245248,50339584,-16561664,50339840,-16247040,50340096,-16416512,50340864,-16354560,50373888,-16154880,50341376,-16289024,50341888,-16357632,50374912,-16326144,50375168,-16317440,50375424,-16754944,50343424,50758913,50337280,-16276480,50345984,-16544768,50347520,50769921,50340096,50491393,50340864]},{"sector":6,"data":[50504193,50341120,-16550400,50350080,-16162816,50351104,50777857,50345216,-16559360,50419712,-16225280,50388736,-16102144,50356736,-16157952,50357248,-16182784,50357760,-16408320,50358528,50345729,50354432,50757377,50354944,50635009,50355200,50618881,50356480,50763521,50356736,-16283392,50364928,-16581376,66560,0,0,1167087646,518818645,-326903666,-11118832,721635894,-6664000,-1929379585,-11471290,1996425334,-26106,1183383552,-94991880,305805055,512446546,1602945870,-1960867018,78771782,-670834477,704726922,922702052,922686254,146281260,-6664192,721420543,1183535296,1376135942,1183666179,-6663948,50331903,-1996265466,512490566,1200292686,-196703990,721844107,-1995400138,1178202742,-1959952900,-8171522,-1962640056,-1207702585,1178140744,721714684,-2091258944,75319551,65783691,-1962915656,-62485560,1156301099,66340491,1178333766,-1958576132,-2091912578,75319551,65783691,50350264,104594502,92148542,-351060319,1224704783,-947190659,1220019179,-62520576,1982591115,-167033102,-963926660,1358186027,233311888,-2090902016,-443874579,-900899553,1478361092,-1957345904,-661774612,-2096436093,1946158718,1310624624,779616003,708069258,1200312548,105251594,112720,-26032,-6684672,-1929379585,1343682118,278673151,-1957642197,-16560610,2013202039,-26100,1183645696,1183535350]},{"sector":7,"data":[1356396294,-1873756117,2942990,55195391,16777114,1310624512,105286403,-1962260735,-167555554,91521031,16777114,49120000,1562371467,182861,1167087646,518818645,-326903666,-1957275872,2122517110,125632520,-150452597,-1962677288,1183385670,108954604,-1962443520,-654899642,1183515627,-364476154,556675,2122516852,57933830,721528553,889147584,140442,-498693888,-1962642177,-16560610,-125106569,145562,-1983436032,-1072961978,2095645567,1310624513,242745091,-1711115009,65535,-1816951,512427636,2013201230,-1694987508,65535,1183434539,2143292392,21883139,1357006477,1357792909,1342179512,157338,-498692864,-163148464,571472,-26032,512425984,1200292686,-532248270,971785867,58713670,-1962870039,1178200646,-385646616,-6684433,184549631,-1587186496,101386068,410322774,-1157627976,1347616767,109852415,16777114,122987264,123082377,123090687,122959615,1344194187,16777114,-1338080512,745799695,55451275,-13862913,1996425334,516328198,-1706025392,65535,25822919,-6684671,-956301057,100870,10348800,556675,1183517556,-96040468,-336443863,-364475639,704398985,2122576966,243073032,32261771,1183572550,-163184142,2122526443,142475272,32261771,552332870,425603,1183518333,-465174038,32786059,216791110,425603,1183532926,-263847446,-2066689,1996484214,-227082256,-755969,1996480630,-461963294,-1174396744]},{"sector":8,"data":[1347551436,16777114,-529072384,-624897,1996486774,-59310086,110769919,110638847,16777114,-2090902016,-443874579,-900899553,1478361094,-1957345904,-661774612,-15012733,-256374154,-6663937,-150994689,1971323074,112646,-16740887,1183648374,-1706027278,65535,-1980610933,1183573574,-398030348,-1980348789,1183578694,-62486024,55451275,-1926465537,1343678022,264858,1310624512,746061571,385500813,-26032,1183514624,-230258202,-1981266293,1183577158,-163149318,-1979955573,1183709254,-1924131094,1343681094,-16222465,-6683018,-1929379585,1343679046,16777114,1958742784,-9049853,263194311,-1070923775,-1962742397,1297948645,503318218,1430622296,-1910575989,915101400,512430646,1999307598,108411146,-963967874,1183515627,105285894,142524427,-401698736,99351692,315802,-310157824,535137026,46812509,-1873273344,-326412987,-1948742114,-1962717666,1194919494,-1962574582,65735239,-1996077429,-1073019322,-654898562,-401698736,99351628,16777114,49120000,1562371467,453167693,637534976,-1811874048,1862271744,-1761542400,-1610612224,469827330,-1224670464,-2030042365,-184548608,-1425998079,1426064128,738262786,150995712,788594434,-1862204672,486539779,1963000576,570425859,385876736,989921024,-117374208,486540035,-2130705664,1040252673,-805240064,536871683,1258291968,1107361537,-352320768,-1023344894,-1459551488,855638274,-1728052480,-1006567679,-1862270208,1224802052]},{"sector":9,"data":[-1962867968,872416002,-1056898304,905970434,-536804608,1023410946,1174471424,1040188161,1526727424,1694564096,1711342336,1207960321,1090585344,1258291972,922813184,1325400836,-1660943104,469827330,0,0,1167087646,518818645,-326903666,512448014,1200292686,-163149514,704857994,-230258204,-523041615,66477707,1060103,-1946663287,-196703993,-1946657141,-1962717642,1194921028,-1961984498,-667159482,1854080886,1325338872,1310624754,105286403,956847755,58594903,2080408297,340211973,1586199415,71797752,105317273,-1995942125,1451883078,139869180,92234620,1913013819,-96040100,972838539,242550870,1963345465,-128021751,134367222,922698612,1996427834,108461832,16777114,302446080,1551110155,-1961136991,958098966,1964730902,1745238351,-1958120165,1755444318,1779862299,139933979,1194932853,-2143980282,1979711871,1310624559,105286403,-1995942261,1468601415,-1873784298,137947150,55451275,542663,655341568,-230257840,-1873741615,59959310,49120094,1562371467,313933,1167087646,518818645,-326903666,512448014,1200292686,-129595082,-1961080949,1194008151,441916184,-1980086647,-1039401898,1187448693,-352321290,-128021642,1207312267,292815874,55451275,1963001846,-6663416,-352321281,1310624522,340232963,-1995024501,1451881030,-59310092,-1191545089,1385758975,-230257840,-1946921333,721636894,1461393479,-1706012134,65535,-1946530165,-70124450,-1056712239]},{"sector":10,"data":[1347605267,16777114,-2114942208,2113994750,16758789,-963968277,-1946794359,-1979494882,-467001273,1962296891,813170455,1345669002,-1997126006,-1202708409,-1706033151,65535,49120094,1562371467,1478413133,-1957345904,-661774612,-2096698237,1946159230,142016356,55451275,704857994,-6663964,-1996488449,664406086,-16777213,721635894,1996443840,1310624520,239569667,1342588419,16777114,1310624512,912231171,1183385483,-96024580,250281984,-2080612725,-2146370490,-130457,1183578694,-96061176,512486012,260047694,49120001,1562371467,313933,1167087646,518818645,-326903666,922703376,-1070922934,-26032,512425984,1200227150,-1947981309,-24949008,-1207602431,48955393,1178322571,-1962576378,216729158,1929510531,112645,-963968277,-1962522999,-1962717666,126563935,-1324984693,65196804,1060290,-335788407,-60912862,-1727772789,319178499,372967511,360452910,104531583,225841964,284978819,-2096738561,2130708094,108954584,-385646848,1486946550,1241921799,-1878297597,95807502,-1560065375,-6682792,-1962934017,1200356446,1191418116,139924230,55451275,-1995159671,1586173527,38270716,-1979157496,-467009209,721611584,1310624704,138905859,55451275,-1963166069,38242308,55451275,-1959370869,-62486265,44056195,-1955564288,105352152,-1995942005,1451880518,21465842,1183441962,206015478,-1946663287,-1979494882,-467008953,-336312695,-60912835,-1727772789,319178499]},{"sector":11,"data":[1183385687,-229209616,134367222,1200228468,1088694785,-1070923029,-1946794359,126549086,1183441962,-62487564,-60912880,-1995683957,1183709254,244338928,-1962673176,1325336134,1975520006,1310624688,17793027,535301776,73964285,99287040,287130,-310157824,535137026,46812509,-1873273344,-326412987,-2082959842,1187448556,-1962931974,-1962717666,126563935,-1946401143,38270680,-1962511359,1183386695,1310624762,206015235,722356011,-1202652602,-1873795313,4909070,125157387,299162,-1710888192,1175,-1962742397,1297948645,-1873273141,-326412987,-1193767394,-11524337,244319862,184556520,-1710787136,65535,-6683157,-2097151745,-443874579,-900899553,1478361090,-1957345904,-661774612,23391361,1310624598,912231171,915087243,1149961038,374639380,1963480889,105330949,512429940,1602945870,-165704906,1963000391,112645,-1070923029,-1947187575,-1962717666,1468732487,-196703978,-1946790263,1183385671,-96024590,1187446784,-956301064,64582,-1946343552,-2147267042,1486946575,1241921799,-1878297597,61728782,-1560065375,1048774488,1962934944,-62456061,44056195,-385647103,-2033778193,65186,-22509881,1721827328,1746307859,-162121453,92031103,2012497465,-226589887,-2093255424,1946218622,-92864757,-1862764801,-58529778,55451275,-1961662815,-1995216874,1468601415,1310624534,138921731,512425984,1204159310,244318210,-369393176,2122514675,92143868,-335786241,-226589933]},{"sector":12,"data":[-16417280,149680718,32796291,16146051,-624897,244380790,-1996279320,1451879494,976682990,-159973614,-1695254785,173,-1961129823,958106134,478146134,1178142076,-1592428564,378215304,1183390602,-296318484,-22378809,116064256,-22378809,1183514911,-296317972,-22772087,-22636919,-23034169,1183514624,-162100236,-22636999,108997756,-22772167,1183523954,-162100236,-22636999,-1125579916,-1534707456,-385649410,1183514803,-1601816078,-385646850,-1098710873,1965096610,-1467562228,-956300802,16687750,976682752,-1497956590,-1531510786,-1598619650,775356414,741801747,571411,-26032,1048772608,1946157552,-96040186,-1962852375,-89466,-1174494586,-369688566,-2104627061,-2037776724,-661913954,-22772085,-22636917,1468598153,-1633776894,-1601795074,105351678,-23159157,-1996262239,-1635055545,-2037645666,1200225962,56664324,-22378871,-1962714975,-1996269034,-1979800442,-1577146730,-2037841060,568983200,-1400467969,-1224781570,244383394,-2097071128,16689342,179837812,-1565591808,-1913615362,1358867586,721428664,1358865030,434638480,702465,44314359,-1995682811,-2080465786,16949310,-661973387,1468729227,-196703998,-1946790263,1183385159,-35853838,956843659,142473286,956712587,1132264006,15761027,1996426100,-126418950,2112360080,1310624762,-1665758461,-1962636290,1200161364,374835476,55451275,-23284085,-1996077941,512428103,-1232403634,1149959836,38242308,-136215]},{"sector":13,"data":[-2096978930,173118,113706623,2097828,44044031,-1191557377,787939338,-661978460,206866315,-369605119,-2090926249,-443874579,-900899553,1478361092,-1957345904,-661774612,117397079,1048773280,2116027040,-1576599787,-1572961534,108339202,44172999,251592704,-1532951904,-1543045374,2112770,113706613,66212,-150992200,-1962761170,105286616,206356365,119468171,-234879559,-2090901851,-443874579,-900899553,1478361090,-1957345904,-661774612,1459940483,702550,50753271,1183385670,2144508,44041771,1983508619,-1962574586,48956998,1183434379,-1610219258,-1539407102,913637378,44304071,787152928,-16604511,184721934,-955877952,520266246,702464,44183287,1854134411,1183517436,1455394300,519080716,375047,1183557106,105840390,-931807221,-310157474,535137026,80366941,-1873273344,-326412987,-942109154,172038,-1547687168,-1465711958,44344066,-2096979293,-443874579,-884122337,1167087646,518818645,-1465788274,-1441363198,139868418,92213372,1913013817,44605705,44701323,1721829355,1746307859,49120019,1562371467,313933,1167087646,518818645,-326903666,-1201935610,787939338,-661978460,206342027,206477195,-1980086647,251657302,108331684,44304071,1183514656,139889414,2147243577,956660781,645134918,-150992200,-1962761170,1283951576,1318554380,44606220,44701321,-1560108383,113705636,672,-1600056853,-1609629950,81154,244357503,-2080430360]},{"sector":14,"data":[-443874579,-900899553,50334724,-16393216,50339584,-16665344,50345728,-16608768,50346752,-16514560,50413312,-16637184,50348544,-16512768,50350336,-16639232,50383616,-16630528,50420224,-16684288,50420480,50457601,50347520,-16348672,50357504,-16670720,28160,0,-2081649835,1048778476,1979650618,31189251,460594827,563755007,1207959554,200427145,-1207142976,-1706029055,218,-402539287,1996426720,223930610,58048523,-1593725719,1183384296,1958743028,-1774780649,-1808335102,775356162,741801747,48732691,132841472,-1961677663,-1995231722,1451883078,460104188,460199563,-1980348791,1183578198,-61436934,2146981433,956660751,142079558,-1946532213,132906070,-1961677663,-1995231722,1451878982,-126418964,-624897,1996483702,740199402,-1875378417,181725198,-1980873079,-92016554,-385649409,-12779370,-385649409,1048772750,1946158938,268679192,18192976,113704960,1882,48760519,-169279488,43294976,43390603,1978422841,-364496575,2122529909,913572084,48774787,-1207602176,65736704,1343226296,16777114,-398556416,57999362,-956252183,190470,460103936,460199563,-1996319581,-385706474,1721827487,1746307859,-163149549,-1577560439,378208916,1183384214,-329872918,32786119,-12195584,-1947318645,17166422,13796096,-6664110,-1996488449,1451882054,-260636680,-1578207489,378215308,1177230222,-262792210,244338770,185531368]},{"sector":15,"data":[-385649216,1048837899,1962935016,-297366765,-1544530293,378077844,113705622,66280,-1018113,28896886,-6664192,1375731967,-1908998320,-1942552805,-26085,922681344,922688362,-1008198808,112663,-1560232797,922681884,1805258540,-1962934270,1438866917,-326898549,-392079800,-498693886,-3782969,1354771455,16777114,1975520000,158722307,305806979,-385649153,512428395,939465588,150170,1183401984,1975520218,268548102,-402431255,1996426204,190114010,58048523,-1962327319,-15689186,46373431,1183383552,731463930,-1980182078,-1705976762,650,1074929315,922684533,-1717956820,-385875966,512428307,939462810,303963787,1996437503,-25862,1996423168,-25892,-928841728,259342353,254555903,176794,506920704,-3675374,-1259799946,1975520011,741801743,-26097,922681344,-588574264,303963787,-6670337,1207959807,-941996407,115782,14843523,922687348,922682006,922682004,922686254,-6679764,-352321281,321691911,321787531,-1980742007,1755443798,1779862299,-465139429,-1981393271,1451873862,108954584,-2096728832,1962935422,460103945,460199563,1183523307,-229209104,2145801785,956660751,141812806,-1947187573,132903510,-1961677663,-1995231722,1451866182,460104122,460199563,-1984149879,2122563158,292814854,-1950857589,1183431254,-229209616,31606471,-26112,922681344,1369051706,-1996488700,1451868230,-1101645374,92216188,1992050233,243732]},{"sector":16,"data":[976682832,1354771218,-1032388784,-339708161,243740,976682832,-428409070,-1947961601,1451998278,-465163330,1390827035,-18352,1347590480,1347469355,79272528,1048772608,1946159984,124053763,-1947974005,1183442518,-363427352,-1411329,1996482678,-1200160838,254549643,244332543,-1995992600,1451872838,-359468,-639040652,-49919,-773258380,-263812351,972183179,192264790,1975010873,-495025402,-2096466688,481854,-1863777419,741801729,71277071,922681344,1218056648,-16777212,-1710088650,1809,305805055,470170,-1069119232,-2084415863,1962935934,-998341879,-385649408,1183514808,-1034515520,2092848697,956661531,343325766,1342177720,305805055,1347469355,-4032769,485212278,1342177720,305805055,-1673473,1183573110,-1101624388,467945003,1347610198,1358954424,726684313,1347440832,434074,1883144960,57933835,-955877911,302792198,112640,-26032,1996423168,-461963290,1342177720,343962,-2091888128,1946158718,-465138936,-337226101,-1136227578,1388205707,91069008,1183514624,35431174,2037694475,48760519,1822490624,1846971163,43295515,43390601,2122540011,1567948806,-2851197,2122522485,427163602,-1673473,28894326,1587171328,1375731717,-1099497648,-339970305,-998341857,-14781184,1996477558,112850,29071952,1347551232,462305023,462173951,117402,1781989120,1748434715,337700891,-1560280648,480444604,1514046210,309592071,123340487]},{"sector":17,"data":[62390272,144330768,-385875961,2122515943,57999556,-2096767255,1946158718,268613637,1048830955,1962935016,-59643645,-351272776,325493204,325588619,-1981266295,1183574614,-229209104,-1984412023,1187494486,-385875486,1183579650,-732525614,-2097151739,1347551442,93082,-398030592,-1419639,1996477558,462201298,462296715,466765355,1347605590,1978142352,1975520010,-37164797,425603,-924253324,-700019968,970479243,427152470,1976714809,462201108,462296715,1975408185,-1136248568,-1528233099,75399936,-1954647040,1452003910,-465139244,-1981393271,1451878470,-700020246,-1579657591,378215308,1183390606,-1101624900,12863175,112640,976682832,-428409070,-1947961601,1177271366,-430564380,-4698030,1385779455,1354771280,-6664112,-2097151745,749630,-1880554636,-398556412,57933826,-1946322199,1452003910,43295700,43390601,48760519,1692991489,-1001994243,1183514625,-665416746,-1981528439,1183573590,-1101624388,-1984412023,1156168278,-1001994243,1048772608,1962934768,-566328566,57999361,-1207920407,-1706016766,40,254555903,465562,506920704,119773714,922681344,-409333304,-16777215,-1710081482,65535,-1983887735,1446625878,2132507834,-1203357435,28841078,922701824,-1070919110,1996443728,-1065943102,28843243,922701824,1996427834,-461963290,-1950595445,1177271894,-430564380,-4698030,1385779455,1354771280,-1483059120,-2097151991,749630,1855588468,-385875965]}],[{"sector":1,"data":[113705971,1182782,-16520471,-15582666,1996477558,1354771410,1342177976,16777114,261928960,-934900400,374864,-26032,1719664640,1187495883,-2097151752,188478,1996430197,-763953196,-1961128799,723226134,1444663878,-397389100,1183385597,-968455176,1962427961,-129594579,276086795,1962934589,12183811,1962934845,14870787,303963787,512440319,939463112,1088046731,147823184,922681344,1996427834,-763953196,16777114,-968455424,1979205177,263632945,-934900400,702544,140679760,-1073020928,1048779893,1946157798,281851966,184727632,6731856,-26032,-1073020928,1183656308,-6663992,-1962934017,-15611874,-629735625,16777114,-565802752,-2082449783,190014,1347552628,-15269144,-15582666,1996477558,1354771410,1996443728,-562626592,-1713748341,1587171410,-2097151991,749630,2146002804,505318146,-1959264494,-15611874,-632911049,-2103816128,-1962934270,-1961746914,705137183,228217060,-1962934263,-1961768930,-385382369,1187512116,-1962934018,1178196550,-385647362,1586233124,506891262,-1976268014,1357130240,16777114,-27358464,298333835,8926347,-335657217,-129594414,-1580841335,378213164,1183388462,-162100748,305805055,-1713748341,332547587,1347605590,-1961128799,723226134,1444663878,-1202695468,726695935,1347440832,-26032,1183514624,-162100236,321652267,321787419,-1981004151,1048833622,1946159984,29157635,425603,28850293,922701824,1996427834]},{"sector":2,"data":[-763953196,-1713748341,-4698030,1385779455,1354771280,-895856560,-2097151997,749630,-2014772364,112641,80910928,1183514624,1177262554,-296346644,297289217,1183562326,1177262554,-296346644,462161409,462296593,-1713748341,468469291,1174531670,-229240336,462305023,462173951,724634,-398030592,-2081794423,1946158718,-1203336436,-1984276853,1451867206,108954558,-385649664,2122578374,57999364,-390423,1996483190,-1166606360,-1950845185,-15782882,-401698761,1183383886,-732526126,1962932867,11790595,1962934077,11266307,-1947187573,1446638166,957052346,108378182,14843523,1048774517,1946158938,-1001994387,1996423168,-461963290,1342177720,319898,-11513344,-14971338,-1709470666,1278,459945727,459814655,-1592853016,378215308,1183390606,-1101624900,123354755,-1207602176,65736707,1343226040,366490,1510393600,-956301305,190470,460103936,460199563,-1996319581,-385706474,1721891155,1746307859,-398030573,-1947576695,1452011590,-1203336718,-944089463,123462,-1946212119,1452003910,67028,1375785603,99719760,1183383552,-363427352,-2853121,-1935551882,-1911125221,-767153381,1389647387,-401698736,-1073019560,-286719115,-76420610,254555903,739994,-935919872,190028305,922681344,916066846,-1711276028,1931,425603,1048781684,1946158940,154837276,154932875,-1994692445,-1592038890,378210622,1822624064,1846970651,-443851237,311901,1167087646]},{"sector":3,"data":[518818645,-326903666,1187468816,-956301060,61510,15877831,105286400,-15507805,-15582666,1996426870,1354771212,1342178744,820890,237019392,-2079980647,-2045373680,-163149552,-940026231,189446,-262239488,324941451,1962948736,-465665219,91488258,-352321096,734014210,-1949791278,-628360122,465644441,-2079980589,-2045373680,462201616,462296713,737953419,60420678,319849478,-384793066,1183514974,100899324,370348164,1446711430,2132900874,138820357,1048779378,1946157796,-260666584,324935307,161920,1183521653,-1377068548,957227169,1149041734,185514472,-955419456,17259014,-18432,17885593,305805055,-493825,-1070860682,374864,224172624,547422208,100899086,370348164,1183387782,-128546314,16533191,-12982016,-237941,915143750,9047980,-2081143160,1127486,1048796277,1962935008,1916877864,2002402314,-196706298,-2145719520,1919022206,-193036282,-1978763654,-466947002,232036944,1183318016,-262239244,324941451,955532938,-16419584,216789062,234126976,2122319476,125116404,33179335,-954471680,64070,1183454443,1357130484,1357923981,1342177720,-1995412504,2122578502,108265722,-369998081,1183579815,-62510606,16547459,922695037,1183519290,100899324,370348164,1347555462,-1202667477,-1706033147,1965,-1727127391,277087747,277222931,-1980348791,1187510358,-956301060,61510,15877831,-27662080,49120094,1562371467,707149]},{"sector":4,"data":[-2081649835,1183515884,-1723842556,-120470997,39623248,748879872,74792975,1558954027,48250499,-1958972160,-1961135074,-28931833,254549643,1183385483,-1961300996,126549598,-1705974742,65535,-1996726645,-28901625,-1946401025,1065418334,-1948224256,130481246,-1961432320,-14978018,740199223,-1959264497,1346372678,532122,112640,-1034033781,-1957363710,82609132,460594827,1183385483,-1977488388,-466944442,1946165309,2964751,1060964980,1023767552,141885534,288622279,367722497,-237941,126549062,184436360,-942639680,1127430,1575324416,-326412861,1443556483,303963787,1183385483,-28915716,113704960,742,-1946263925,9108598,184174216,-385649216,-467009197,1962936893,12249347,1946181181,-28901627,1988877035,-60912642,704725130,2964964,-1947663499,6569216,-1981217931,7224576,1883076724,-385649408,1933377666,1029665792,1618215028,108381242,1593329350,1988824299,-60912642,-2013183862,2122381382,410258168,67008139,1150155894,-1957277695,1177224262,-1706014466,3977,184057472,113709685,66278,-106869,1988886086,218154748,-1946263925,1183513718,-385840904,1187446639,-1226071816,167265990,1187426539,-1427436552,536364742,1187423467,-1628762888,184043206,2122553579,208929022,-1946257781,2021719134,1953762815,1074022027,-1037330112,-1705969455,3490,1089881737,-1070922635,512452331,939463198,-631157,-25755849,1029274,-161576192]},{"sector":5,"data":[1988829067,218154750,-1946270069,51519006,1586188295,50826230,1346436678,721700491,-1705968058,3589,303970047,1224602,-163149056,-1961746781,-1995994152,1191181382,-28901628,48629447,-1125580799,112894,1575324510,1426064066,-326898549,922703362,1996427834,142016266,-1202667477,-1706033147,4184,262938251,-467007606,-26032,-1073020928,-1070922635,1187473899,-1962933762,60423750,319849478,-1961851370,1586169934,72221450,990273043,2135260378,1992833796,237019455,2097038905,-18406,1347590480,-1202667477,-1706033147,3009,16664263,-1950553344,1191181918,-1405711362,704678415,-6663964,184549631,-1197181760,65732609,1577059000,-1034033781,1478361096,-1957345904,-661774612,305805055,-15960321,765069942,-167772152,269160966,-1070922636,1048779755,1946157794,209125137,-16091393,1996425334,185657350,28836843,49120000,1562371467,576077,-2081649835,1586168556,-1995994364,130547270,113704960,1716,-1694599425,65535,-1034033781,1478361090,-1957345904,-661774612,17493121,16533191,242679552,1342177720,16777114,-125400832,205949950,1962935869,9824515,1962938429,30402819,1946226749,17906955,-1595341963,10021120,-1207011585,-11534331,-1711087050,4444,-1207011585,-11534330,-1711087562,4663,460594827,-2037565441,-1705967878,65535,201082505,-15829568,738130102,-6664000,-352321281,242679582,1342179256,-17135987]},{"sector":6,"data":[-1986375658,-16777198,129502838,-6664192,-956301057,190470,460103936,460199563,-1996319581,-1207790058,1575550977,176063233,-1962511360,-1264382394,37651206,141819906,-1710590209,65535,1038729259,172395265,1023410477,-260636666,781434883,319399935,556673,-943688445,190470,460103936,460199563,-1996319581,-16607722,-1224800650,-6619400,-352321281,242679710,-16091393,1996426870,314743306,-1073020928,28837237,721611520,-6664000,-385875713,-1224736903,-6619400,184549631,-385649216,1996488553,505870,-91845296,28856574,-991408127,1958742797,242679592,1342179256,1345323448,1024324072,57933825,-49943,129502838,-2037559296,1343684346,16777114,-91845376,-6663938,-1996488449,1090451078,384369525,1620223,-401698736,922684941,1100618612,-1962934261,-1543571834,1996430196,440334,-26032,-526188544,242679554,1342178744,1469338,48407296,111949567,-1705983957,4848,-1238552,-1207522250,-1706033151,5769,-1873756117,230418446,-1191266071,-397408596,-1360396850,-15581442,-669919214,420616465,-384700398,-310116707,535137026,181030237,-1873273344,-326412987,-2116514274,-956232468,63558,-1207011585,-1706033151,5085,-17529207,1024214667,57999366,1023485929,57999376,1023683305,192151824,1963004221,22604035,-972992279,16709254,-1207011585,-11534331,-1711087050,5004,-1207011585,-11534330,-1711087562,4428]},{"sector":7,"data":[460594827,-2037565441,-1705967882,5152,-506231,129502838,-2037559296,1343684342,1324442,-125926656,-15827456,129502838,-1617276928,-352321519,-189333685,1354771454,1304218,242679552,1342179768,1307290,-1070903296,335256144,1996423168,243726,336042576,726663168,278548672,-16777196,79171190,110776320,1342177301,-1705983957,5391,278535819,-2037565441,-1705967882,4460,-506231,146280054,-2037559296,1343684342,1430426,1141294848,-956301303,190470,242679552,-1961136991,958098966,1964730902,1745238283,-1207601893,48955393,-397361109,1822491465,1846971163,43295515,43390601,-385875528,2122515242,745799690,-1559345525,-1588590924,378215276,372841326,108338026,459802169,1048774516,1946157800,112645,-1070923029,50587728,33701507,-16223232,-728102282,721420305,48556480,755648139,138215425,66090752,-13724736,-2129162329,50333822,113762677,744,-1961136991,-1558483434,378077844,1996423830,-189333754,303274750,-1073020928,1996440181,636942,354130512,726663168,614092992,-16777195,62393974,815419392,1342177301,-1705983957,5433,-1207011585,-1706033148,5448,1354771280,1397402,-13309696,-1207011585,-1706033143,5470,112720,359176784,1996423168,243726,359963216,-1202716672,-1706033151,4479,-1207011585,-1706033148,4373,112720,-1224754709,1134231284,184549394,-385649216,1048837862]},{"sector":8,"data":[2097152842,-19076861,-1207011585,-1924136953,1358886534,1342243256,185236200,-14125888,129502838,28856320,-1477947344,81162,-1343683724,242679806,1342179256,-17398131,630870038,-1929379818,1358886534,1453978,-62486272,-385649344,1996488330,571406,-158954160,28856574,686313473,1958742794,242679592,1342179512,1345323448,1024087528,57933825,-107031,146280054,-2037559296,1343684342,1151898,-158954240,-1818603266,-1996488686,1967192646,-29824765,1342183608,1927810704,1949761290,374970907,1183514624,460628988,278542079,1031578,-96040192,-15689053,112725622,2056933376,-1560281066,1996423904,374798,304519760,-492634112,-1372127486,1354771206,16777114,172395264,1946157373,212241,71117940,1027437568,578027529,1474823147,-1372127255,112646,316709456,1996423168,-398556402,2037645314,-385875528,-1070923637,176063312,-1207601911,48955393,-397361109,-840176875,16777114,1144947456,1047855113,123471559,1755381761,1779862299,154837787,154932873,-1961136991,-1558483434,378079550,1721829696,1746307859,459842323,459937417,-1961677663,-1559024106,378084204,28842862,-1070903296,-356521904,123471559,1894318080,460104191,460199563,459937337,104401269,58006376,738161129,1525174464,1354771200,1525157520,-48961271,-15829249,1996425846,175570702,1233306,1975520000,112645,-1070923029,326933072,-269942784,112113916,-112662448,2130503145]},{"sector":9,"data":[-1911061227,1612025365,-753442793,-1911244012,-53417707,-1962742397,1297948645,1426066122,-326898549,155492632,1963214393,-398029511,75400016,-1207602176,65732621,1342180536,16777114,108461824,1342178488,384321165,330406480,2122514432,91553796,-352321096,-1547687166,-443872956,311901,1167087646,518818645,922736782,1234831020,184549401,-13797952,-1207530442,1385758732,-1976107184,607584006,574029587,426285587,-1398603776,1975520006,1073920032,427334224,367722496,111949567,1342179000,1342177720,1347469355,1625242,49120000,1562371467,1478413133,-1957345904,-661774612,1460071555,875989846,-26096,-125108224,111951491,-2096663296,437822,915098740,-167049556,-147123084,-1202246540,-1705967624,6324,111937083,915086452,-167049554,-147117964,-1202253708,-1705967624,65535,112068155,-1202318219,-1202716399,726663169,-1706012480,6443,414717163,244338688,-402137880,-1070864606,-401698736,922683345,93982772,184549401,-15895104,-1206897610,-1706033151,6422,109721343,1409946,1975520000,-1976107251,112646,332503632,922681344,112723594,28856320,-1070903296,-1885712304,1577058329,49120095,1562371467,1478413133,-1957345904,-661774612,112080639,16777114,1975520000,-1942552787,899078,-11513191,-16348618,-15525322,-1710024650,65535,184987299,-1205832256,-1706016766,2749,922686955,112723630,28856320,-1070903296,-6664112]},{"sector":10,"data":[-2097151745,-443874579,-884122337,-2081649835,1448545516,55195391,-1705983957,65535,113524355,721712128,-1207702592,512425985,1334444878,736963075,-162625080,58706187,-1962851863,126563935,78762379,-1039932717,-1996484563,512489542,1183515470,106334980,2132170553,956660799,947328071,-1946657141,60359751,1460864583,-96040696,1006392969,544998998,1178273151,-1961266684,1452014150,106314236,1178161269,-1957989116,1207367774,1114900482,55451275,-1962654069,1200162390,374835476,-6664110,-1962934017,-956084706,2119,55451275,722225035,-120517049,178256,-26032,922681344,77202250,-385875941,512426142,1200292686,-1037330164,1183447249,-1705815810,65535,-1309391223,-1948200188,-1962717666,117651039,-1946663287,71797720,105317273,990402323,310314582,1178273148,-2096400636,2080502910,-196703431,1586182123,-28931080,2114864953,112645,-1070923029,-1946657141,1988822094,972589830,209651831,1329137020,-1207601402,48955393,-947535829,28843636,-6664192,-16776961,-1711060426,65535,55195391,-1705983957,6572,-443850914,311901,-2081649835,1448548588,112475779,-1593478144,65734324,-1996059999,1183709766,726669032,12079296,129519617,-1070903295,-26032,-1073020928,2123070068,-122136600,-1734717185,989855768,91552326,1979350585,-398029469,-1202237418,-1202716416,-1706032889,7071,15367809,-1959693055,-24908682,-2096794597,611648510]},{"sector":11,"data":[384321165,12080976,129519617,-6664191,-2130706177,16902782,1983506037,-1193183764,451608577,82476673,-2129563135,17295998,1183648375,-1706027288,65535,1600045099,-1017256565,-2081649835,-1957294356,1175128134,-385649398,922681492,1183519290,173443848,-2097151699,1347551450,-1202667477,-1706033147,7236,16664263,-1407284480,705137167,1603948772,-1996488676,547486790,100899086,370348164,1446711430,2082766602,138820357,922688887,1996427834,142016266,-1202667477,-1706033147,7396,16664263,-16520448,1586232902,-1405711362,704678415,177885412,-1996488675,1178335814,-2096138756,1946221694,1958742793,-373282043,1183514897,173443848,319047171,19727958,14320384,-1980610935,-1039403946,-269941899,237019392,-2079980647,-2045373680,-195675376,92215932,1995589179,277127443,277223051,2146719289,956660786,729018950,305805055,-1962391925,1174604374,106304260,-2097151699,1347551450,-1202667477,-1706033147,7501,16664263,-1961956608,1174602822,-2079970552,1183402000,-27358210,262944395,-467009398,493853264,1183383552,237019638,-2079980647,-2045373680,139365136,51011211,1578304590,2094676742,990150443,-14323000,-1961739722,1451952198,71697162,1376146963,1354771280,1342178744,1048730,-28915968,65732608,-2080487681,925758,1586177652,-1405711362,704678415,-6663964,-1996488449,1178335302,-2096269834,1946220158,1958742791,-17962749,1577058744,-1034033781]},{"sector":12,"data":[-1957363704,149717996,106859350,1183385483,-1948742658,-1978442186,-1981535744,1187510342,-956301060,64070,48250499,-2096073472,2084636798,142508810,-2096857254,-2095052730,1962935422,-25263333,-1961525760,512491126,2021659486,141909759,1593329351,-28377344,1039681163,829685792,1946168637,4144456,1581078132,963605504,712247366,218660483,1994982261,142508801,-385649377,113705325,740,1709817899,142508801,-2130217952,10487934,2122573941,57999364,-1207877143,1055457281,142508801,-2081721299,1948190846,142508517,-588578643,218660483,719913845,142508801,-385649377,2122514721,-965476100,1057521283,2122563307,108265724,1577614979,1988866795,1579060222,21006867,1183441962,75400184,-16550912,1187511878,-1962933764,1849555014,-385649408,58589342,1023455721,57999405,1023449577,57999460,-385836567,1187512110,-385873160,1187512102,-385873416,1183579934,605448,222105468,1029275136,1416888352,1946198077,-465665201,57999362,-2080429079,1946158206,-28901609,-1946263925,-2146214346,292880440,-1962516853,2045509190,-2080485633,2080439934,106859503,-1979824501,-469317881,-1962934270,915144286,9048926,1183441962,-21435912,48498375,1273692161,-1594341689,-22484736,200820423,-23009024,536364743,-23533312,217597639,-24057600,1962963005,-10819325,1946186557,7618003,1441334133,7814655,1441334133,-26154497,67108792,1586232902,-1207465722,-1956773887]},{"sector":13,"data":[113401317,-326413056,-955716477,64070,1177247979,1183400190,1174510072,106303748,-1191557631,-1202712158,-11531518,1343443510,1343278264,16777114,1958742784,-1572961524,91488273,-335570248,6731779,71732048,-1559865717,378077832,1347551882,16777114,184727552,281851984,3389520,129931856,1183514624,-937522182,-1996029167,-1202651578,-1706033142,65535,201082505,-1954318912,79846885,-326413056,1443032195,-16091393,1183516790,-11526650,-6683530,-1996488449,1988886086,106859268,16662726,1208239755,-28951736,28837245,721611520,-443851072,574045,-2081649835,1183661292,1996443844,556571140,1996423168,108461832,1261722,-6664192,-16776961,1996425334,67221510,1354771280,-1174339656,1347583999,16777114,142016256,1355040397,1342194104,16777114,1575324416,503318210,1430622296,-1910575989,1257014232,-894023993,108954385,-16091904,-1207530954,-350350902,-1976107169,-1236890874,1119375390,-6664192,-16776961,396015222,50331648,-1991723450,149666374,-2135269749,192159807,-4569461,1178319438,-1214538,1183692406,1183535292,-1236915270,-1203336896,251697744,-1202716672,-1706033128,6097,109721343,381437581,-26032,-310181888,535137026,46812509,196672,16716700,196744,16713951,16973961,203640,16973932,203594,196717,16717277,16973966,202833,16973935,203720,16973938,71242,196615,16715935]},{"sector":14,"data":[196639,16714369,196642,16713599,196644,16716739,16973989,203611,196741,16714584,196646,16712197,196648,16714170,196649,16713853,196650,16720162,196652,16713798,196653,16717882,16973870,204931,196630,16719870,196664,16715790,196923,16718608,196667,16711770,196798,16718447,16973886,203004,196642,16718438,16974018,202987,16973859,205031,16973860,205114,196645,16712567,196680,16713903,16973900,202763,16973871,200944,196661,16720111,196699,16714233,16974172,202866,196668,16714978,196957,16717046,196958,16715891,196959,16717490,196960,16717533,196961,16714384,196706,16718867,196962,16718472,196963,16719813,196964,16718848,16973926,201911,196679,16720045,196711,16719986,196712,16719892,196719,16718587,196725,16718407,16973943,202794,16973913,204925,16973915,202722,16973916,204859,196701,16719853,16974079,202622,196705,16715628,16973954,202605,196706,16713839,16974085,204957,101,0,1167087646,518818645,-326903666,321691916,321787531,2081052217,956661521,175245382,-1961677663,-384618986,1721827539,1746307859,173422867,92017791,1929922105,325493005]},{"sector":15,"data":[325588619,-1995946359,1183517270,408838,-1073543049,-1476448621,1183514863,173443848,-16737559,-15582666,1996425846,22649352,748748800,773229331,1679178003,2131262478,1644575135,-1583778034,378211938,1844121188,-16091393,244320374,83914216,-763166719,-1923421440,-11471802,1996425846,42441224,1183514624,-754667020,1042189280,-1996029168,-661915066,-1727772789,319178499,1347553367,321795839,321664767,16777114,-14750976,1996425846,108461832,16777114,1510927104,-553611264,1661001472,536912640,49120000,1562371467,445005,1167087646,518818645,748804238,773229331,139868435,92213372,1913013817,321691913,321787531,1721858283,1746307859,139868435,92017791,1929791033,325493005,325588619,-1996077431,922683478,1996427834,108461832,132762,302446080,259264523,-1961991519,755917846,-628948991,-13374720,-15582666,1996425334,1354771206,1342178744,157594,-1407284480,222265359,1183518325,139889414,-2097151739,116064466,-1962522997,-310179754,535137026,80366941,-1873273344,-326412987,-2116514274,-1593802516,378213222,1446581096,2081521418,138819845,1721830007,1746307859,13625619,-1961677663,957558294,326896214,1178142079,-1962118648,-1073019322,20776316,-14713344,-15582666,1996425846,-26104,1183514624,408838,-1073540489,-1476448621,748749469,773229331,8907027,-1962391925,2146110038,-1961129823,-350516714,302446198,-260763637,-16091393]},{"sector":16,"data":[28838006,1347590400,16777114,77056,-1996432765,1451852358,976682884,726684178,95965376,-6664192,-1962934017,-2146456546,-1334506177,-1954396533,803963990,1350583949,-16091393,-6682506,-352321281,175570718,-16222465,-6683018,-352321281,889332750,-1929212670,2080517122,-2097032702,-443874579,-900899553,1478361094,-1957345904,-661774612,-1592988541,378215272,1183390570,-94991880,-1961136991,-1994691050,1451881542,105286646,956847755,326896726,1178142079,-1962117622,1451951686,172394760,-955492727,137734,1178501888,57933827,-1962816279,1452013638,206977530,-1578564738,956857344,57805382,-1962895383,1452013638,139868666,58527103,956342249,58132038,-16738327,1996426358,-92864758,-1191676161,-1706033151,917,-1946925429,1446639190,2081914632,105265413,1996427379,108461832,-624897,-1070861194,1183523307,-162100236,2080921145,956661532,360056390,-624897,1996485750,108461832,1342177720,16777114,-196703488,972445323,57997910,956379369,57997382,-16701207,1996487286,-380611848,1183514901,206998282,2130073145,11725059,1178142844,-385648908,1183514792,-162100236,1979340345,-129615606,28837237,721611520,-62486080,-1559020895,1183515162,-94991368,1963742777,172374325,1183527029,-162100236,1963480633,105265445,2122522741,443810044,246955651,-1592560640,35986288,974031616,1004654867,-385649215,983629989,75027,244048081,-511698064]},{"sector":17,"data":[-1547629571,2122521456,91488508,16777114,209125120,-16091393,1996425334,112646,79665744,2122514432,1802830076,-362753,1996486774,-193527818,1183536619,139889414,2146850361,956660760,292811846,-624897,1996485750,108461832,-352321096,105286432,956847755,461174358,1178142079,-15436044,1996425334,-159973626,737441535,-744861504,-16777212,1996487286,209125368,722106111,1285181632,-1962934269,1451952710,459842316,459937417,-1962522997,1822623830,1846970651,321691931,321787531,1963742777,172374277,28837236,721611520,75200,460328587,201253248,460366785,-1962522997,1446578262,958625036,510986822,-15960321,244320886,-956277272,190470,105286400,-1559734645,378077844,-1070923114,-1559020893,1721963364,205300494,305805055,459945727,459814655,375706,302446080,427036683,-1961991519,957244438,1964731926,1812347148,-955878117,18048006,49120000,1562371467,576077,1167087646,518818645,1721882766,1746307859,773208339,956921107,1964190726,12577027,305805055,-16222465,-426113418,-1593835515,378213164,372839214,628431754,461899321,922689397,-2002709958,-1978234085,77083,1375787651,7248464,116785152,1963985682,302446206,2004160523,305805055,462042879,461911807,-1962522997,19728470,14320384,1234849874,1375731714,1354771280,1342177976,99738,261928960,166639696,374864,108829264,116850688,1073745822,116861556]}],[{"sector":1,"data":[-16773216,645931636,-1610610189,-467006992,112720,-26032,-467009536,166727307,184607104,166765505,166798976,-1206129729,-1202713176,-1202714130,-1706033147,65535,604631201,-1558967296,-310179344,535137026,80366941,-1873273344,-326412987,-2082959842,1822498540,1846971163,1779841307,957052187,1964730374,112645,-1070923029,-1578482039,378215272,1183390570,-229209616,-1961136991,-1994691050,1451879494,460366318,-1996488411,2122577990,91554054,411335,325492992,325588619,-2097151699,1446576346,956658954,326371398,-1961677663,957558294,259787350,1178142079,-1710721528,65535,-1207762967,-1986396161,1451876934,-431584796,-1981262199,1451881542,-96040458,-1946397047,1452011590,173423090,-806812802,956857344,58067014,-1962883607,1452010566,173423086,1178142837,-385649400,2122515128,1349779704,15367811,1996442229,-327745554,-887041,1996484726,-401698810,1347614842,55706,460104448,460199561,-1980086647,1996487766,142016266,-1878624513,-100014066,-1981397367,1183574102,-296317972,-1980479863,1005319766,15367811,1755386740,1779862299,-96040677,-1979951479,1451881542,175570934,-1207404801,-1873805311,-103946226,-1981397367,1446635606,956855794,58060870,-2147342359,-31756250,-1947187573,1183445590,-464090654,-1947842933,1755572310,1779861787,26274075,-1947449717,1446637142,-385647350,142541064,1929922105,16705795,-1947187573,1446638166,956855562,58001478]},{"sector":2,"data":[-2097030167,1962997886,-360807578,-10455808,1996485238,108954608,-1962380032,1452010566,-1962087442,1452010566,77294,1375787651,108461904,954732176,-1706011911,1555,-1994692445,-1994692074,1451881542,175570934,-16222465,244319862,-1980275224,1451876934,-263812124,-1980606837,1451883078,-2093814788,1946217086,459841811,459937419,-1980086647,1183448150,-162100748,-1962391925,1183386198,-464090654,1978553913,-330942200,1038680949,1879998465,1183514907,-296317972,-1981397367,1183574102,-464090142,-1994691421,-1961136618,1452010566,-464111122,-1679228044,-498714368,-1813445772,-162121472,1178142837,-385649164,1187446918,-939524126,-7098,2122545899,997458168,-1962391925,1183386198,-61437446,-1961136991,958098966,141950038,1979336249,13297923,-1946532213,1822686294,1846970651,-330921189,-1980868981,1451881542,-1959138314,1451952198,-196703990,-1577691511,378215272,1446583146,956855798,58061894,-1962897431,1452012614,459842550,459937417,-1947187573,1183445590,-61437446,-1542401,1996482166,-495517724,1342177720,642458,-59310336,-362753,1996486262,1354771444,287386,460103936,460199563,459937337,104400501,91495272,282010,976682752,1781989138,1748434715,186423835,116785152,1947208466,241344792,241440395,460199481,104401781,91560812,-352321096,-1547687166,-310176924,535137026,113921373,-1873273344,-326412987,-2082959842,1448549612,722508961,-1995435514]},{"sector":3,"data":[1187505222,-16776970,721635894,-6664000,-1962934017,2116749950,2113866724,-339727612,-1983411454,211814982,-1947981296,2117685240,-1962641908,-1962677305,1183386694,1042189068,-1321759984,65065732,105155568,-1995942773,1451882566,321692154,321787531,2096780857,956661527,275970118,-1961677663,-1995231722,1451882566,27257338,67257590,1149970804,-754667262,266633448,1997162043,142508818,-385649659,2122514817,57933834,-956204823,128582,-2097057559,2080639102,23587075,305805055,-362753,1149958262,1357130241,321795839,321664767,1342179512,16777114,976682752,-92864750,-1694992641,1377,272506507,1183528843,-754667252,-2131754016,221758,1386285684,1410763523,-9443069,-1325251445,-2132225276,1183387620,57188860,1962690105,30796035,972834443,142543430,15222471,15722752,956974219,528222790,721639585,-1991706554,1487005766,1511426819,77059,-1996432765,1451882566,-1955337222,1183448134,-398014490,1486946304,-129619197,-336443767,172395287,2112243257,-396457193,-773306625,-2105046045,-431619837,972179083,-511907770,32013955,1325335420,-398029848,-129629799,-371183,-15582666,1996487286,167156472,1586167808,-1948003864,-1727823225,-120470997,990529027,1535043142,17333891,1183536501,-94991368,-2097151739,372965586,947195492,241305147,116798069,1963985682,-1807842517,242548752,254951043,-2095221249,-15781826,1048778357,1979649842,809403162]},{"sector":4,"data":[326500111,278136519,199950337,-2081929473,-2097022906,-16713130,1996487286,142016504,1290276496,-297367051,-1026423,1996487286,142016504,-2014835056,-364475917,-2081663351,1963001982,38073968,-2096729084,1946220158,-297366772,-1980737909,1451878982,842957804,1366687503,254819971,-1958054401,60359748,1410532932,-95012088,1178282357,-1591446024,378213164,1446581038,2081980410,-129615611,1156977015,192218114,33703158,28837237,721611520,322610112,-1947318645,816050262,840337679,108954383,-165579776,18575366,1183516788,-329872406,1183516395,-262763538,1996443730,-401698808,300677499,-1018113,1996484214,-361299988,-1981280624,-2090901771,-443874579,-900899553,1478361096,-1957345904,-661774612,460326646,-1591118847,378215276,19733358,14320384,28856402,244338688,1391742696,1781989200,1748434715,142383643,132841472,-1961138015,-2095355370,-443874579,-884122337,196622,16711854,196756,16714722,196639,16715118,196641,16713266,196664,16714319,196667,16713609,196798,16714213,196674,16713496,196681,16712343,196965,16714509,196709,16713249,196710,16711913,196966,16713302,196967,16714169,254,0,0,1167087646,518818645,-326903666,922703372,1996427834,142016266,119706,302446080,175378443,-1961991519,-384932842,922681678,1996427834,142016266,-1202667477,-1706033147]},{"sector":5,"data":[192,1586092843,-1405711364,704678415,-129594908,-401698736,1183384599,-125926410,-1592756979,378212484,33886342,13796096,-2097083927,1946876030,-125926638,-2096335860,1946941566,-125926650,-1593019127,378212484,17109126,-2083067136,1962997374,108954432,-12946173,-15582666,1996425846,178184,-26032,1347551232,-1202667477,-1706033147,247,1586092843,-1405711364,704678415,-129594908,-401698736,1183384471,-62455818,957227169,729611334,1358954424,726684313,28856512,-6664192,-1593835265,378213164,372839214,108335238,277087801,1187475060,-2097151748,1963132542,-129594596,1946165565,3030282,1060963700,-955616000,132678,49694407,-60912896,262944395,-467009398,1039681161,92012553,2113932605,108954403,-7703294,244381814,-1996286232,1178203206,-385649162,1183448951,1975520246,-9574141,-1711520117,277087747,277222931,49120094,1562371467,445005,1167087646,518818645,-326903666,748770938,773229331,173422867,92214908,1913144889,321691919,321787531,-1995946359,250284630,-1962391925,1182992982,1451426056,1183383562,-2007594618,305805055,1855606866,-1593835517,378215304,1446583178,956659080,125077062,185730806,-1593150448,378215304,1827216266,108954370,-1207601918,65732618,-1996462920,999921222,461310550,1178273148,-1961594104,-1952868794,-1948611640,1451952198,465644298,721677267,1183422912,-1806268014,1358710413,1352156813,305805055]},{"sector":6,"data":[-1837695150,-16091393,1996425334,55351958,1325334528,-59339780,714621578,-1941534236,-401698736,1183384075,-62485622,-1840905319,194270739,721843650,-387343936,-1937865983,-1961134838,2055273590,309661079,60409483,1444123206,77204,-385820029,2122514887,410258060,227311235,2122519156,208931980,193756803,2122516084,225773964,-1711520117,328353283,-1662413738,-1971420415,-1961724671,60423238,1444123206,-1907979884,-342862199,-1907964150,1187512319,-2080374896,1962998910,325493087,325588619,1972655673,-1840891640,1625883509,-1773761791,-1806287975,92019583,1938966075,-1773761772,-1949791335,-1840870438,731141771,-338486335,-1715459325,-1986902391,1183683670,1183666428,922701976,-11398598,1996460662,142016266,-1701415169,65535,-1946398977,1116404854,-1981535592,922717254,-963964358,-1840905319,1385453075,-26032,2122514432,427035276,210534019,2122519412,225708940,160202371,116787060,1947208466,-62485741,-1840905319,93607443,-763166719,12708096,33980035,2122524277,309592202,-1869842689,12183566,1971996219,-13899517,1996476395,-401698676,1183383719,-14947958,1032603275,594804769,1946168893,4144414,1996429684,-401698676,-1073020793,20796276,1025274880,796131330,-2080444183,1979682942,-1904311546,-1948551937,1451986502,-1957237872,60423238,1444123206,-1907979884,-946841975,100934,-1946237719,-1072985530,20777844,-385649408,-1293287783,-1975072770,-1427570686]},{"sector":7,"data":[-1971420162,-1961462526,60423238,1444123206,66964,-1996434813,1451855430,-1975072880,-2031550464,-310157570,535137026,113921373,-1873273344,-326412987,-1948742114,524092998,2134340608,605459,222107772,722697984,-1205146688,636157954,1946165309,10501618,1996483956,-26106,-1073020928,1996426357,-26106,-1073020928,28891508,49120000,1562371467,100846157,1308623616,385941250,419431169,520158976,-1308622080,570490624,-1308622080,-1174339836,-1509948672,-603914492,1073742592,1711341312,0,0,1167087646,518818645,-326903666,-2091493512,67757118,1048774516,1963264484,976682836,1781989138,1748434715,-26085,45613056,1183666187,196104342,-1735047544,-26032,1187381248,922684052,922688350,922688348,922688354,-1181082784,-1929379840,-1202678714,-1706033151,251,205391559,-1796669408,976682752,1354771218,459841872,459937419,-2097151699,1347551450,16777114,726684160,45633728,-6664192,-1929379585,-1665234818,-1190717937,-1510866939,459159295,459028223,459421439,459290367,152730,166641408,512259725,375047,1621206514,1645644571,1578514715,956724507,1947950086,166639665,-1790538416,702544,-26032,1187381248,1183652500,28856468,-6664192,-956301057,520896006,243712,39688784,1599995904,-1962742397,1297948645,-1873273141,-326412987,-2082959842,1187451116,-1593835272,378215264,372841314,158669662,459015737,552141685]},{"sector":8,"data":[112641,42965584,-1073020928,132711285,459841793,459937419,-1980742007,1621226070,1645644571,1544456987,1579059995,-95516389,737959561,-1982653503,1451881542,34380534,922681344,922688386,1996427834,-92864516,-624897,1335555190,-2097151997,749630,-1125579916,-263811840,-159973552,-1191938305,-11534335,-1877853642,50784270,628473867,1342177720,305805055,-887041,1996484726,-193527818,1358954424,726684313,1347440832,16777114,976682752,-227082478,737179391,-11513664,1343980086,-159973552,-1695254785,951,191905411,-1710787584,65535,1721847787,1746307859,-229230317,92224124,1928349241,-263812301,66213515,1444148294,773209078,2082570003,738605830,-15108333,1996485238,-263812112,66213515,1444148294,-1706011914,65535,1342177976,189850,49120000,1562371467,1478413133,-1957345904,-661774612,-1592857469,378215264,372841314,108338014,459015737,28860276,-6664192,184549631,-1588431680,378215272,1183390570,-195655182,-1961140063,-1961139690,-1961141234,-1994695138,1586100814,465644540,-163149357,-502135,1393703478,-11513263,-1928185290,-1202654650,-1873805311,1501198,158646283,1342177976,16777114,49120000,1562371467,1478413133,-1957345904,-661774612,-1962087293,1183516766,307661584,2080528185,956596014,-1960283641,1451954246,205914898,-1961994733,1463486558,2132048898,1980185348,537966606,-26032,-1070923776,-16679703,-14974410]},{"sector":9,"data":[1996428406,276234002,-15829249,-6681482,-2097151745,749630,1996479605,242679560,722237183,1996443840,-401698806,-1073020588,1586175092,273058568,957503115,243204695,121177212,1182992503,1451426320,748748818,773229331,-96040685,-239991,1586170486,41418504,-1070909441,922701904,1347427202,-15829249,-6681482,-1962934017,126552158,-1996335221,1451882054,340167672,1963607609,273058618,957503115,478148694,1178142076,-1592429578,378213164,1177228078,-61465606,286279169,334172758,-1961677663,722677270,1444674118,-163173892,-502247,1996428406,276234002,-15829249,-4715402,-1070903169,1347440720,16777114,1883144960,141819915,97946,-16848640,957495969,1182075462,-1961662815,957573142,981268566,1178142079,-1959562506,1452013126,205915128,990795283,2131963414,990280737,1997745158,-126419175,-1946781953,1452013126,205915128,1376671251,5741136,2122514432,678690822,1342178488,305805055,-15567105,1996427382,209125134,305805055,-493825,-1070860682,-1706012592,1423,-2097151560,-443874579,-900899553,1478361104,-1957345904,-661774612,-1962480509,126553694,-1996335221,1451883078,-2110324740,1354771227,85039696,116785152,1947208466,-58817701,2136308736,-92372218,-11700736,1183516278,-61436934,-2097151699,1347551450,10906,-96040192,100423307,-763166719,1679178496,992572686,1963876870,321691939,321787531,241440313,108795519,241305145]},{"sector":10,"data":[1586171507,17269518,153475,1659617323,-1961991519,957244438,91618390,1962559033,142509035,-1205046272,-11534335,1996424822,-92864516,-1962260853,33885270,13796096,-4698030,1385779455,1354771280,-509980592,-16777215,1996424822,-92864516,1342898872,16777114,241076992,-2097019005,-1207958953,-310181887,535137026,181030237,-1873273344,-326412987,-1579643362,104401994,1249184832,-1962128223,957107734,2131510294,956726297,1930183174,205955345,206050955,206308905,206444057,1285629163,1310100236,1142307084,2132245516,1107704070,-1592822260,378211398,100731976,370216002,-310178748,535137026,281759069,-436206848,520158980,-1996487936,553713408,-1342176512,604045060,822084352,637599492,1174405888,671153921,167772928,687931137,-369097984,738262784,838861568,771817219,1040188160,939589376,620757760,1275133700,-1761606912,1291910913,1677722368,-553582848,-2113928448,1644232452,768,1661009666,-1593834752,1677786885,-1761606912,1711341312,0,0,0,1167087646,518818645,-326903666,298098950,-939899255,64582,1586175979,41910778,242515967,17188854,2013202548,-26110,1191116800,-96041988,458793225,2096907833,49120217,1562371467,1478413133,-1957345904,-661774612,1444736131,-16351615,-385649281,244318534,-1191208472,1861681314,-1608611066,-1996029167,-661917114,-16615425,458793271,-523040847,-1706012007,65535,200558217]},{"sector":11,"data":[-385649216,1048772882,1946157534,12079117,-6664189,-1996488449,1996485702,1354771206,166213375,1358198527,16777114,-364476160,-1036805816,129614379,871944960,1086467010,-1947711863,1452010054,-754470424,96611298,1183383680,458793456,-939768183,60998,163073003,-294717696,298059267,-1947842935,105286616,-1962784887,1183573598,-1962440210,1325393502,-62485508,-1962653815,1736500830,1586232838,-1946973210,19203652,30179328,-1962522743,1204217438,1191182088,-398029842,2095990329,637101,-1947701513,-1003093008,65962769,-2131736949,-523141148,-511636341,-1056243711,1183515785,-297367064,163064299,-294717696,298059267,-1947974007,-61931560,-1979955573,1586168903,107446500,-463565826,-16234554,-1578219777,1178147672,1221557486,-1877246813,845838,49120094,1562371467,182861,1167087646,518818645,-326903666,-1202301168,787939337,100866904,1183388100,-96024588,233504768,-1946526069,-971275202,1191182081,268083706,2096776761,-230242325,915079168,2129334724,-16614271,-1955498881,1149976844,-503889918,729801856,-97060910,-162100977,1049352843,25828228,1183441962,-62470152,451608831,-1980217717,163118150,-126945536,512489611,1099567556,-1981535736,2122446918,1962999800,-58818081,242548991,-1946788213,-1977908162,25752134,163058411,-59836672,512489611,1183453636,138512626,-16136573,1983509062,-385648908,1600061306,-1962742397,1297948645,50332875,-16765440]},{"sector":12,"data":[50371328,-16735488,50343680,-16729856,50412032,-16742400,48640,0,1167087646,518818645,-327034738,1448542490,-1996365663,-257836986,-1236891391,-1928694017,-1202668474,-1706033086,826,16598726,1889779755,31499019,-1560158557,-257752612,702465,37657168,1048772608,1946161064,-1472790769,31365647,113704960,4008,44828359,1048838143,1946157742,-1372127473,-26110,113704960,686,461518591,1358954424,1347469355,-6664112,-1711275777,65535,-150989128,-1961739730,572427248,54496015,113738750,621168267,61931521,227270867,200794496,-1962571327,-1961942498,104920607,-385649407,2122514749,57933832,-1929300759,-1924088762,1358918790,-17922419,45390416,-2037579776,-1202651276,1385824255,505936,48470608,-2037841920,-12714260,-385649281,1183646003,1996443836,814124294,244338943,-1995505176,1048820294,1946159984,21227779,205978,-326726912,32285694,976682832,1354771218,-320336240,1958742787,1954975030,1183666431,-2019929924,-1996488703,201255558,1024818624,91619325,-350217032,1073788931,63347280,1441464320,305805055,-219672944,-2092242156,1946204798,814124347,1183666431,1637503164,184549379,-1926660928,-1705984954,877,-18315639,1954545469,10663959,-18305289,915134603,469963168,-18440567,-50043008,-18041089,235162,1488896,305802999,512487563,529207074,-49913728,253894283,1895767947,-26104]},{"sector":13,"data":[1183645696,-6664004,-1996488449,-1946193274,-1961942498,1488927,305802999,-2037647221,1099562866,-13767928,-1961739722,-1961942498,1488927,305802999,1082912907,-754274042,206312,-1136226992,142016336,-1878624513,4253710,16777114,636928,-26032,113704960,2147418604,-1548335477,850919920,1211037440,5113091,-26032,-1465712640,-1203336433,1577181347,49120095,1562371467,445005,1167087646,518818645,-327034738,1448542426,-9271609,2122514432,74778380,65781803,-1995684213,-2080409978,1963396222,-1169766906,-15602944,1183648374,-2037559110,-1705967826,65535,1354385037,556675,512431732,529207074,-150989128,-259322258,-1962786677,82510928,-1711276104,129519698,-6664192,-1996488449,1040151686,108363775,-377487432,-2037710298,-324796556,196124929,1947092537,175570723,-1928956161,1358919814,65539728,1921419533,1883145215,57933835,-1711146519,65535,118259331,1183649909,1996443834,4372490,-26032,-1224802304,1996488564,142016270,-588771696,1975520001,1925088076,963903743,-8878451,175570768,240538,2092960512,175570728,16777114,747014400,2147433983,-1564993676,749664000,-1948742657,51486774,715032860,73892095,1958150141,-25857,1407778816,209617919,-1926597625,-11486650,-6681994,-1996488449,201271430,1024884160,91619325,-350217032,1073788931,-26032,602472448,196125183,1963869753,-1608611051,-1205892335,-1359544158]},{"sector":14,"data":[-259260556,33835136,1996425451,-401698802,512430709,381161250,242153216,-661975157,939514115,278938,242679552,-9128193,16777114,1488896,-1961988361,572427248,54496015,113738750,621299339,227213313,201253248,-1962571327,-1961942498,141623071,22170,175570688,124826,-62486272,253894283,-150989128,260771438,-654059381,-1979955573,2122516551,1534328840,-1710328065,65535,253894283,-150989128,260771438,-654059381,-1710065665,65535,-9128193,-9402739,-26032,512425984,-930410718,-150989128,-1957687698,646351111,-661956353,-14246397,-15577207,244321910,722621160,-6664000,-16776961,244977270,-956301307,-16605690,1883145215,410320907,28458627,-1592691456,1178143664,-16157682,-1862306634,139913230,556675,-1331618188,239483147,1996425332,-26098,1996423168,-26098,113704960,-64866,-9140597,-310157474,535137026,181030237,-1873273344,-326412987,-2116514274,1459790060,42387286,-1962934017,-358413754,-1070903295,-26032,1923284992,572427022,-1205892337,1861681174,-1947170040,1351287360,-96040700,-2080614775,1962935934,126085379,721975039,-1706012480,1671,-1961991519,957244438,1367342166,1178142076,-1588956166,1178143664,-1958579192,-1961942498,1488927,-1962381577,343442416,-13732864,1996425334,-92864516,16777114,-1643723008,-1946157310,-1961942498,1488927,-1962381577,37784560,-1996205941,1451883078,142016508]},{"sector":15,"data":[1347469355,-1202667477,-1706033147,1713,-1961851743,957384214,763165782,1178142079,-2094631174,121918,1048780661,1962934752,175570712,262944511,236992255,16777114,-18432,-346908336,-599882822,57933825,-2096736279,122942,1307116404,175570694,1342210232,-1705983957,65535,-150953288,-259323282,295706251,1149974275,172263704,-8878393,-2033778560,65402,16205510,-8616307,-15956343,-1980283251,-135546,-1070921610,-6664112,-16776961,-2037577610,-1924071678,1358820486,-1981280624,1975520015,99019011,721975039,1347440832,1342177976,490138,142016256,-16599297,1343200440,-34306419,-401698736,-1073017202,-1175911563,261928965,-158954160,95965438,1738166272,-1593835513,378212484,1446580358,-385647108,142540971,2012890681,10610947,31211139,-385649664,1048772759,1946157536,9300227,1343200440,-17398131,702544,-26032,-1073020928,1996440948,2022083850,-2037559041,-1924071954,1358892166,-17398131,229161040,702544,277127504,277223051,-2097119227,1347551442,16777114,261928960,-158954160,95965438,-6664192,-1207959297,-1722744833,-1070903214,178256,-26032,1996423168,45547272,261929215,-192508592,244338941,185452008,-385649472,-303431863,-599883004,57933825,-2096831511,122942,-639040652,175570692,-8878451,-293171888,-2037559043,-1924071668,1358886534,1343072440,1342180024,-1946532213,-2147091370,13796096,-1483059118]},{"sector":16,"data":[-16777208,-2037577098,-1202651272,-1706033024,2405,31211139,-385649664,1048773772,1946157536,75688195,-150953288,-259323282,295706251,1149974275,205818136,-8878393,-2033778560,65402,16205510,-8616307,-15956343,-1980283251,-135546,-1070921610,-258322352,-167772152,252383750,512437108,529207074,-150989128,-125106066,-1962124917,-390690505,205818877,185075201,721699979,1143671876,101056782,175570699,-8878451,-293171888,-2037559043,-1202651380,-11531518,-1206693322,-1588592538,378211938,-2147152284,13796096,1436176466,-1207959545,-1924134142,1358893702,1342190520,647834,241344768,241440395,2113689145,9234691,1178142847,-385649670,1048772738,1962934748,-532774021,1953824769,-16222465,-15834058,-1710333386,1404,185730806,-1960086513,-1961942498,1488927,-1962381577,207195128,-1232521333,1150025190,134611212,71600907,722224171,100732484,1996425990,2022083850,-2037559041,-1924071954,1358892166,1342898872,324155135,310807888,-6663937,184549631,-385649216,-1699152063,-12654081,-1928694017,1358919814,1342210232,652186,-599883008,57933825,-2096949271,122942,233374580,10663939,-1962250505,-1608610832,-1959329007,1149835332,10663950,-1962250505,-1608610832,-1959329007,1149835332,-1311626480,-26105,-2037841920,-1769341470,512490980,529207074,-150989128,-125106066,-1995685493,201263238,-969444160,1727888006,939513995,-42236275,3389520]},{"sector":17,"data":[115317328,1996423168,2055638282,1740132605,-1600499712,-16777206,-2135422346,-1070903296,179280464,1048772608,1946157532,41609475,31473283,-385649664,-1564999056,175044352,512487563,922948000,-1994898293,-1098706364,1946222344,178302,-43743607,-43874679,253894283,381165451,141489920,1099692171,72452866,-43612535,-43477367,-2097151739,-2037841710,-1769341584,1183579506,1787201802,-494498819,-459895811,1820756477,1855359485,1954990077,-947912707,-166266,2022098943,-3,-2037577098,-1202651806,-1706033128,2815,-1207273729,726663296,244994240,-2097151989,121918,-840367244,-532774143,57933825,-1207843863,1861681314,-1947170038,51486750,407145271,-15448951,244320374,-1995990808,201262214,-1960348480,-13136936,-1202320778,754384899,67494097,496652288,-16777210,-2135422346,-1070903296,189897296,1048772608,1946157532,24045827,31473283,-385649664,-1564999324,175044352,512487563,922948000,-1994898293,1996428868,45547274,-401698561,1996425509,8435722,1354771280,411802,-599883008,57933825,-2097075223,122942,568918900,175570689,-1924087765,-1202653114,-1706033151,65535,-34961783,-150953288,-661976466,295714443,-1635181309,1200357126,-358708468,306678269,-34955637,-16335221,-1995553397,-1635052473,-1098121750,1166802694,373786896,-34955637,-16335221,-1995291253,-1635051449,-1098121750,1166802694,440895764,-34955637,-16335221,-1995029109]}]],[[{"sector":1,"data":[-1635050425,-1098121750,1166802694,1615300888,-34955637,-16335221,-1946532213,-2147091370,13796096,1435043209,239569154,-1961863287,-1961942498,1488927,-1962381577,104986616,1718946816,1342660280,809114,1619429632,1131692285,-43999605,-1957283957,100526726,1448083486,16777114,681201664,-1962934272,100526726,-1706033122,3734,-44005751,295706251,-1564991605,175044352,-2037647221,1099562336,-1961628896,-1961779170,10663967,-1962250505,541116400,113704960,2147418602,-16599297,297114,-599883008,125108225,31473283,-955747328,16715910,-15930624,580520566,-1996488691,-1191243642,-1706033151,3375,-15679869,-15960832,244320886,721847784,-10032192,-6681994,184549631,-1957202496,-1961779170,10663967,-1962250505,73433328,-12325890,1996425846,-26104,113704960,2147418602,31211139,-2096663296,122942,-2033776524,65296,1996426475,-26102,-2037841920,28901136,-6664192,-2097151745,16715966,28873076,-2090902016,-443874579,-900899553,1478361094,-1957345904,-661774612,14347393,512448087,126553890,-940161399,64070,-1331615509,-96061173,1586174324,4162550,1207308660,192152070,958104225,57997894,-2097013015,-15272378,715258438,-96061169,381210748,-1339099392,572427019,-1996029169,-661916090,294787,58593148,-2130578711,33555071,-387382410,-161576191,294787,108998012,163715,922690934,-1070920784,1134186576,-16777208]},{"sector":2,"data":[-1207193546,-1924136953,-1202670522,726663169,244338880,-2081128984,749630,-1461124236,-1608611071,-1995994351,-661915578,-1994897525,-1070878138,-401698736,2122383772,1971322630,12708099,295706251,2088777611,57933859,-1962888471,-2037834172,529268588,-150953288,-125106578,-1960945269,-2012771809,-37242,-1348860298,184549390,-385649216,-2037776249,-466944146,-1202683892,1344143907,-1924087765,385839238,-26032,-1073020928,-2037553292,-1924071640,1358917766,-1705983957,65535,-14121331,71932496,-2037841920,1950416746,-1608611004,-1995994351,738141830,-644198208,184549390,-1962183488,-37730,-26057,-1635057664,-2037645530,1200226154,647924510,73892095,108461951,16777114,1354771200,16777114,-128021760,-1984805237,113645639,721420304,42640320,-1560115037,-1935474034,-128021758,1149891467,306678036,-1980211573,1586171975,239569400,-1980211573,1586170951,172460536,-1559085405,2075660706,306225920,722576547,1570394304,-1560281073,-1070919258,-1506345136,-62485231,112720,259299920,-661979136,1200209963,1342671106,16777114,306356992,-11485141,-1928183242,-1202652090,-1706033151,2936,-1070868341,-1996339319,306619143,-1206801757,-1202713176,-1202712650,-1706033147,4005,324155135,1343278264,1342180792,571802,-2090902016,-443874579,-900899553,1478361090,-1957345904,-661774612,1460202627,10664022,-1962512649,-1606513704,-1994587375,-1070859170,-1996339319,-60912889]},{"sector":3,"data":[-1994897527,915143238,401281476,956712587,158663236,-33135488,17196161,-96010496,-1593194877,1178147672,1591835898,49120095,1562371467,182861,1167087646,518818645,-327034738,-950664804,63558,-9402681,-1070923776,175570768,-85455216,1975520001,10348803,-16091393,1119356534,1268404224,-16777204,951584374,28856322,-6664192,-16776961,1996425846,-26106,-2037841920,1586233198,-2012771834,2122576966,125042696,-9519485,-2089520128,16740542,-2033769099,130928,720651914,599281892,726670850,-2037559104,1343684396,1101978,1975520000,-943199435,16740486,-196703744,-2146638806,35895376,-1070903266,747015504,-1706027265,3702,242597899,1346371768,91802,-373282048,1996423493,747015430,-1070903041,244095568,1187446784,-16776712,530187894,-1996488687,-12716474,-15698817,-1070922122,-360280752,244338942,-66072,1234831990,-1996488686,-12716474,1343124607,832410,-159973632,1241242,108461824,1189018,1958742784,175570703,-1710852353,331,1736294411,-9388413,-385649664,1996488476,205888010,1174601728,-2037823478,1183579752,1753626890,-15632642,-1946261362,-2130810722,-361407425,-26704129,-26691841,-26573171,539211856,-26032,-1706033152,65535,276838143,-26573171,539211856,-26032,-1706033152,65535,-2113984791,2147481214,512448628,529207712,-150953288,-259262866,-1709281025,4920,-1710852353,3113]},{"sector":4,"data":[-26966391,-150953288,512489070,117641632,-26835319,-2037655413,1200225892,1721666334,-129594626,-523239132,1284174731,-35553276,1200144650,112644,2122519019,-176881656,-1710852353,3774,1593751273,-1962742397,1297948645,503318218,1430622296,-1910575989,-2098429480,108461824,103578,2147433728,1183520629,-1924129274,385842822,1073789008,-26032,1950351360,112645,-1070923029,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,1488982,-1962512649,574000088,-1994652913,1207434334,1946943494,-339727612,-60912890,1578125195,-1962742397,1297948645,503317194,1430622296,-1910575989,250381272,10664022,-1962512649,-1608610832,-1959329007,1183391300,440699900,-1947056503,1183390788,102665208,38272768,-1710852353,65535,16402119,-15799552,1996424822,-25862,1191116800,407145466,1929004601,73695466,458269181,-1977727863,-2145123004,1149766412,102664965,38797056,958091425,141884486,-1694730497,4928,-1695385857,4936,-1694992641,1029,49120094,1562371467,182861,1167087646,518818645,-326903666,-62470394,-996081664,-96040687,1586173675,105286650,1963083577,107446276,-62455810,167396995,958093473,-495125434,-1962742397,1297948645,503317194,1430622296,-1910575989,183272408,32153942,1946568249,10152195,242368131,-1203995136,787939337,100863602,1183388100,-1948742666,1183446855,-1961497608,1191179870,-129594376,326436665]},{"sector":5,"data":[167134851,242353919,-1946788213,1194919494,-2067454,-1592888818,-120513704,242353919,242353723,113706623,3698,-150992456,-1961987538,-1004631056,461152529,-1996210133,1190657094,1954545916,1087436549,1183515627,-62486020,1929381437,1354771216,1332634,-96040704,-351374685,242393363,1486949355,1358483739,16777114,-96040704,1593460363,-1962742397,1297948645,503317194,1430622296,-1910575989,351044568,-330905770,1187446912,-939524108,64582,-1962516853,-163149561,126605451,-1988107136,1996484678,-263811832,178256,350984784,1187446784,-956268820,63558,1988851435,-1947807240,1485567582,-1995994366,1346432582,1523866,1183399936,263666,-1946532215,1178201158,-14385414,1183647862,45633780,261771264,-16777195,-2135422858,-1070903296,167942736,1187446784,-16744212,1183647862,45633778,496652288,-16777195,1996425334,-227082258,1394842,-230257920,1177108544,-129564692,-1946788213,2145681415,1995982395,-8722173,-1928825089,-1202652090,-1706033150,2032,49120094,1562371467,313933,1167087646,518818645,-326903666,1586189866,71797512,-1325398235,-1948200186,-754274025,1071809002,-1983773952,-661923770,-1979287925,-1981535744,-12724666,-1957661440,-1961942498,1488927,-1962119433,307792880,1586182027,-1948003880,126550616,1356482185,1356613261,1342186168,1068954,175570688,-1696958721,65535,1037452937,74776831,1122746411,-1948754293,1183450742]},{"sector":6,"data":[-1962899242,1183516766,4138454,-523040079,210498443,184804736,-1962440255,1183516766,-1312807722,637063942,-208994297,-2147201909,-1056179999,-1207679095,-2090991615,-443874579,-900899553,1478361096,-1957345904,-661774612,-1207535873,1347420415,16777114,-26112,1586167808,1074235656,28837237,721611520,1975520192,112645,-1070923029,-1962742397,1297948645,503318218,1430622296,-1910575989,-1229433128,512446465,529207074,-150989128,-259324306,-16486145,703070832,28706048,1554512,295082576,-661979136,-956299322,-16665594,-25857,-2090991616,-443874579,-900899553,-1957363710,49054700,16664263,108954368,2134277120,75399942,-13733366,179832950,1347590400,-16353537,-6683530,1375731967,-3217328,33441417,179832902,1347590400,1342457485,16777114,140413696,67389066,-1962440656,-1958674874,113401317,-1873273344,-326412987,-2082959842,1996445420,374790,112720,-26032,-1073020928,-1897331851,-632910592,-1196800375,-1706032570,4450,-1996340219,1187490886,-16776964,-6641034,184549631,-1956416320,1346415174,1353598605,1084901003,348756560,-1706033152,5565,-666465976,1191172235,738707160,-1968546165,1357130247,1356351117,16777114,-664892672,-1962932282,1183493214,-2010053380,37664775,1186484254,-1924129278,1343663686,16777114,-62456064,100433539,-6647428,-2097151745,-443874579,-900899553,50348802,-15623168,50366464,-15319552,50367488]},{"sector":7,"data":[-15349760,50367744,-15606784,50368000,-15292928,50400768,17945601,50333440,-15651584,50371328,-15869184,50339584,-16740352,50341376,-15233792,50374144,-16402176,50341632,-15402496,50342656,-15241216,50342912,-16310784,50343168,-15672064,50343424,-15774208,50345216,-15278336,50345728,-15756288,50345984,-15802112,50412800,-15941632,50348288,-16463104,50382848,-16486400,50383104,18329857,50346752,-16741632,50351360,-15647488,50417408,-16143872,50385152,-16430592,50386176,-16476672,50353920,-15666688,50386688,-15663360,50386944,-15952640,50354176,-16465152,50419968,17981953,50350592,-15242752,50354944,-16663296,50355200,33583617,50349312,-16714240,50355712,-15220992,50388480,-15248640,50389504,-15259136,50389760,-16169216,50422784,-16389120,50357760,-15617024,50358016,-15643648,50423808,-15297024,50358272,-16702208,50424064,-15531520,50391296,-16719360,50424320,-15450880,50391552,-16759296,50424576,-15320832,50359040,-16632576,50424832,-16261376,50425088,-16448000,50425344,-16510720,50425600,-15838464,50425856,17869057,50356480,-15925760,50426112,-15934720,50426368,-15649536,50426624,-15780096,50394112,-15618560,50426880,-15701504,50427136,-15704320,50427392,-15271680,50427648,-15424000,50364160]},{"sector":8,"data":[-16623104,33280,0,0,1167087646,518818645,113760398,66022,-1705983957,777,-991424880,1958742799,-1942552793,112646,-11513191,-16348618,-15587786,-1710087114,65535,-1207339712,-1706016766,531,31852231,-310181888,535137026,516640093,1430622296,-1910575989,1458340824,205949782,1946158653,605542,272452980,1023898625,1953759505,-1070903061,-26032,1996423168,309262,123844688,-1415950306,-16777215,79171190,-6664192,-16776961,1639452278,-1202708985,-1202716667,-1202716669,-1706016752,393,-2096913943,1946159742,-969474295,50436625,-1070923776,-2096918295,1946159742,239504134,-2096712541,131646,1996482676,-26102,-555024384,1024083595,443809793,1962934845,31844611,1962935357,54126851,1962935613,36432131,1996471531,112654,-26032,-1706033152,65535,58048523,-956090903,2147462214,16777114,242679552,1342178488,503925432,4372560,56597072,1253572608,1183666185,-1701162820,-1929379839,-1202668474,-397410303,1048776665,1962937200,-1136226999,275179600,1047838731,-1928431873,1343667270,1342178744,1342178232,1346375864,16777114,1958742784,-1136227039,155891792,-26032,1996423168,309262,155891792,-6664162,-385875713,1253572938,-1070903287,260040784,191905411,-1207208704,-397407926,-1073016820,113707380,2928,-2147408407,608830,1183658100,1253593276,-1070903287,-26032,-1073020928]},{"sector":9,"data":[1183652980,1183666364,-6664004,1207959807,-1371108016,-26032,-1073020928,246942581,-6664160,-352321281,-1136226891,1354771280,1342786232,1342189496,146074,1975520000,155891751,3848272,38509136,-1073020928,1253578357,1555582985,-6664192,184549631,-1207601728,48955393,-1705983957,65535,1034700425,58032127,-16741911,-1207530954,1344145255,16777114,-1401487616,16777114,-1608611072,-1205892335,1861681314,-1947169876,939466328,1354516109,1342194360,16777114,-1136227072,-26032,1183383552,477380786,-5474561,-1070878090,-26032,1183383552,1282752688,-1699580161,65535,253894283,381165451,976156416,-1947170030,939460696,16777114,242679552,1342177720,16777114,23914752,1889779755,31499019,298202879,16777114,1354771200,16777114,22079744,305805055,16777114,-1337554176,-1206764893,-1706030774,65535,34735815,-6684671,-956301057,135686,-1951732992,20777030,1024160768,57999362,-385829399,1996423442,309262,-1136226992,1119375382,-6664192,-16776961,1253576310,-1202708983,-1706033147,65535,1970585611,503925432,59480656,1183383552,-1136226890,-6664170,-1996488449,-259278266,-1984150899,1187493958,-1929379660,1178188870,-13928776,1586214990,-2012771656,708618822,1060897908,1187448181,-1962933836,126531678,1017792136,1006924892,-3115718,2122561606,91488436,-340232449,123844612,-1236890800,1342786053,86938,242679552]},{"sector":10,"data":[1342178488,503925432,70425168,1626013696,491418,242679552,503925432,374864,243792,1074837584,12098128,-1073020928,-1914109067,242679805,1342178488,503925432,100833872,922681344,-6680122,-352321530,142508319,57934592,-228375,1996424822,112654,112237136,-1873805312,112715790,1577058744,-1962742397,1297948645,503319242,1430622296,-1910575989,-435763240,721420545,345657536,-2097152000,1791038,922685300,-929424556,-956301310,1790982,-401698816,922684406,45614732,1347590400,109721343,278411007,278279935,14490,343162880,1342194360,1342439608,16777114,458531584,158711819,1346372280,17562,-26112,113704960,486,-1962742397,1297948645,-1873273141,-326412987,-2116514274,1442988780,1024214667,57999366,1023540713,57999369,1023533545,192151824,1963004221,33941763,-956178199,63558,16533191,-1236890368,125286480,1354771280,503450,1975520000,13756675,1354122893,352922,-1991751680,37615686,-1962508800,-1237137680,-1236890368,33266256,1183383552,1326588,-2065104001,-1236890368,-360280752,1996443902,98867964,-2037579776,-1202651414,-1706033060,553,747014464,-59339777,-18316659,-13728119,-1635054101,1065418542,-15829924,-1946210674,973024902,1996434566,750190569,3062015,243792,-26032,-2038235136,-16515284,-53578,-1946211146,-1238631306,-2104623314,-1705967894,1669,-1207011585,-1924136957]},{"sector":11,"data":[-335615354,242679562,1342178232,381044365,103127632,2122514432,494797816,-956795253,-346245566,-1236875756,242679552,1342178232,1347469355,431770,572427008,-1205892337,787939350,-259321286,-1962387317,-1270445817,1065408651,-1956875264,-16775650,1996423751,814124468,-2037559041,-1873739918,70445070,1354122893,-13597043,-26032,-1073020928,-2037578123,65798002,1353991819,1342803640,1342194360,171418,242679552,1342178488,503942840,9673296,512425984,1342111750,-971314430,626182,-1207011585,-1706033151,1879,1354771280,16777114,32416000,-1593227613,-1935472136,242679561,1342178744,32388863,451994,242679552,1342179000,167261951,16777114,1354771200,33434,20310272,687747,922683764,-895872570,721420288,49998272,687747,1183516276,112501518,33701507,-1543168,-359003530,-352321536,172395486,1946157373,146722,1592329077,277762,-1545010315,343298,1575551861,408834,1944650613,-4920574,28839542,446320640,1342177281,73882,1975520000,12708099,253894283,381165451,976156416,-1947170030,-2037839808,832241384,-16777215,79171190,-2037559296,1343684260,1342194360,83610,-1531019264,1265893630,-31553907,-1534685872,-1070903042,32152144,-1073020928,-2037566092,-1924071906,1358831238,681114,-2037823488,-1924071774,1358882438,132762,1958742784,512134418,783831294,-845524992,184549386,-12290624,79171190]},{"sector":12,"data":[-1617276928,-16777216,79171190,-174436352,1342177289,16777114,537835520,81369680,113704960,2928,298202879,277402,1354771200,295834,112640,-1207839767,787939350,512430650,117640994,-31684983,-31553907,1619430736,244338942,-1962299672,-151118690,1947207239,512134424,1602965758,-1707606264,2171,91602955,-350216008,160348315,-1534685872,2124042494,184549385,728331456,-2037559104,-1705968098,65535,1484046347,-37714291,1488976,175348304,-2037841920,-2037514818,-11469216,-1862418762,138799118,-37845503,-37839221,-37845249,-1958803514,-956449122,1996423175,-1064923890,616059133,-2070261759,1023410186,57933830,-51735,-1710505418,65535,-1207011585,-1706033147,2307,-16650589,112725622,-6664192,-1560280833,1052248568,-1202708990,1344144132,167263875,-1207602176,65734520,-1945666888,-1706011942,65535,-31553907,-297893040,91553793,-352321096,1354771202,167261951,16777114,-599883008,57933825,-2080456727,122430,-1243020428,-532773890,796196865,-31553907,572427088,-1205892337,787939350,-259321286,-16230261,107649591,-1073020928,-1981217932,1619430910,-509980418,-16777214,28839542,-308654080,-385875966,1048837767,1962936646,112645,-1070923029,-16169309,95948406,922701824,418056518,160185987,-1207601920,48955393,-1935425493,242679561,1342863103,447898,-28710656,556673,-385649661,1996487961,242679558]},{"sector":13,"data":[1342177720,284314,244338688,-385804056,-2090926553,-443874579,-900899553,1478361098,-1957345904,-661774612,12250241,572427094,-1205892337,787939350,-259321286,-1995947893,-1946204538,-2145416232,259326015,1342340280,1351239309,722842,-1961563392,-47458,1216777527,1183666431,244338826,-1929366552,-1705997754,1353,1116598411,448286857,-6664160,-16776961,-1928298442,-1202681274,-1706033117,65535,49120094,1562371467,1478413133,-1957345904,-661774612,1443294339,-972530037,1586167815,509446,-2146804085,292880447,-1207404801,726665084,966414528,-352321531,175570758,1342189240,363674,-96040704,-1946530049,1065417310,-690852,1183578694,172370938,-244087,1996425846,2124042248,-1962934267,1988885598,50696,-362753,-375781770,1577058307,-1962742397,1297948645,503318218,1430622296,-1910575989,82609112,142016342,1342181048,1347469355,-26032,-259325952,1443264255,440730,1590070016,-1962742397,1297948645,503317706,1430622296,-1910575989,82609112,-62470314,1996423168,-26106,-1073020928,1996432244,-26106,512425984,529207712,-150953288,-259324306,-14788469,-401698761,1183383578,108462076,16777114,-62485760,49120094,1562371467,182861,1167087646,518818645,-326903666,-129579256,1996423168,215849478,1183383552,1958743034,69515307,-92864688,1347469355,-401698736,1183384217,1958743036,108461835,16777114,-129595136,-1694861569]},{"sector":14,"data":[3345,16285315,2122516093,91619064,-352321096,-2084558078,-443874579,-900899553,1478361090,-1957345904,-661774612,-11998077,-1617295754,-1996488691,1451883078,1958874108,1996444204,-1203335686,1119375382,-711307264,-16777203,1536820854,-1929379826,-1705985978,3197,1954545469,-339727612,112643,-1962742397,1297948645,503317194,1430622296,-1910575989,283935704,142016342,914330,-96040704,1954545469,1721389082,184549387,-12553024,-6620554,-16776961,1922759286,-1962934261,1065355358,-385649408,-1070923568,-1936043184,184549384,-385649216,1996423360,108461832,16777114,-230258432,159236107,-1207915031,-1477836801,142016256,847002,-129595136,896843787,-1710852353,65535,200689289,-1205963584,-11533275,-1070860170,-159973552,1358954424,1726484112,-159973631,858522,-126419200,16777114,-92372736,1517584383,295706251,-1564991605,-93391104,1895821451,239049246,1996423168,235248134,1183383552,10664188,-1946521865,51486750,-263812857,1183570059,508004860,-1962510593,705032262,1996443648,130128390,-1202716672,-1706033086,65535,237607504,-1070923776,49120094,1562371467,313933,1167087646,518818645,-327034738,-11140974,-1264973706,-1996488691,1451883078,1975651324,12052739,-1710852353,65535,-1980348791,-1039402922,-1696005259,-59310336,-1912965377,1343664198,1342194360,912026,-126419200,-1913227521,385838726,4372560,-26032,1183645696]},{"sector":15,"data":[-6664016,-1996488449,-12717498,-1923582849,1358917254,173722,-196704000,-1924631488,1358917254,-150953288,512488046,117641632,1342188037,1342194360,717722,-1608611072,-1205892335,1861681314,-1012750,-1818616208,-1962934268,-1961779170,10663967,-1947046153,-196703248,-14794615,1671038582,-16777202,-6682506,1577058559,-1962742397,1297948645,503317706,1430622296,-1910575989,239504344,-1962288477,-727511994,138840841,-1559603573,378079696,1183517138,165061382,165152455,2124546047,-2147087609,-1204783865,-4521985,-11513089,-1710846922,3792,-1995997533,-1207468010,-4521985,-11513089,-1710846922,65535,-1995996509,-16284650,-16285642,721911350,-1706012480,65535,-2096506719,-443874579,-900899553,1478361098,-1957345904,-661774612,956730017,645139014,-1207273729,-1873804532,7923726,376750091,-16091393,-16284618,721912374,-1706012480,65535,28836843,49120000,1562371467,445005,1167087646,518818645,1996478606,52082698,-401698736,-1073020870,1996432500,-633929974,-734593271,-768147703,-801702135,187865609,-660406272,165060873,165152313,28837236,721611520,49120192,1562371467,445005,1167087646,518818645,-326903666,1996445228,-733573880,683167766,-6664192,1073742079,1039943305,461242369,1120333963,1183645907,1996443860,140810758,-1073020928,28837237,721611520,-310157632,535137026,80366941,-1873273344,-326412987,-2082959842,381158636]},{"sector":16,"data":[976156416,572427026,-1996029169,-661914554,33966070,-2081881227,-401698816,37616128,1028551680,125042694,1946158909,-1958548625,1603009630,-2145416440,410255423,-151232885,1947207239,539015216,294623824,113704960,2928,652742288,1489140,305802999,253894283,1183385347,-153580548,1946289735,-339727580,-60912854,-16228469,-297893065,91553793,-352321096,1354771202,167261951,607642,1883144960,-713752565,-2097151560,-443874579,-884122337,1167087646,518818645,-4663154,-17665,-1197846446,-1207959536,-4521985,-1706011905,4293,-1157627976,1347616767,1102490,-18432,1392508858,283089488,-4718592,-17665,-325431214,-1207959536,-4521985,-1706011905,65535,-1962742397,1297948645,-1873273141,-326412987,-2082959842,1448543468,-1962379637,1187448446,-352321284,1191134980,1149912828,1357130495,16777114,168134656,-1947568704,1600060486,-1962742397,1297948645,1426064586,-326898549,-950642934,64070,-1710852353,4478,-163149496,1979969675,-24424954,1949973632,775716880,2088775541,695545599,1962934845,-129579228,1183514624,123733496,302946896,1174601728,4341238,246953086,244994080,-352321528,1547468857,1187448693,-352321032,75400149,721712128,-1207702592,1183383554,108935672,1031848051,1326674990,1183577067,123733496,21269840,172333648,1599995904,-1034033781,-1957363708,1988843244,-2146374908,91499068,1967078528,112645,-2142893845]},{"sector":17,"data":[-344653764,-1956724693,46292453,-1873273344,-326412987,-2082959842,1996424940,225090056,1174601728,1183401992,-96040452,1586170859,1547665660,1325337460,138841084,2013021753,-62485523,1996443712,-96040186,1358710315,883354,108461824,-397361109,-310116627,535137026,80366941,196690,16716234,196744,16716065,196745,16715070,196750,16712469,16973967,200558,16973935,66761,16973829,68918,196615,16713453,196762,16714903,196763,16714139,131229,16715439,196634,16713757,131231,16715463,16973851,68592,16973841,68643,196626,16712705,16973987,68679,196627,16715718,196772,16713715,196773,16716353,196652,16715834,327726,16715978,196685,16712889,16974006,198661,327702,16715952,327893,16715991,196823,16713765,16973889,199485,16973858,198493,196643,16712926,16974019,69304,16973875,197237,327717,16715965,16973918,67880,196667,16715124,196811,16714725,131408,16715981,327757,16715939,16974185,200424,196662,16714431,16974039,200492,196663,16714832,196824,16712284,131161,16715955,196821,16714815,16973914,200619,196666,16716108,131163,16715994,196823,16714645,327776,16716004,131449,16715968]}],[{"sector":1,"data":[16973918,198888,16973893,198431,196679,16713943,196711,16713886,16973928,66430,196698,16712378,196843,16713158,196715,16714127,16974061,69803,131165,16715942,196969,16712495,196846,16713699,196719,16712317,196848,16714891,196976,16713681,196849,16714911,196979,16712484,196984,16714686,196856,16715905,196985,16714931,16974202,198655,196699,16714949,16974203,197626,16973916,198549,131165,16716007,16974201,199129,16973921,198900,327778,16715436,16973850,197488,327779,16715460,16973851,197658,100,0,1167087646,518818645,-326903666,1721849368,1746307859,-230258413,-1577822583,378213164,1183388462,-262764050,253894283,381165451,107935488,1082912907,72387330,-1980086647,-1070859178,-1559009117,1183519590,321692666,321787529,1183432747,-163149320,-1946532213,1446640726,-385646856,142344352,1928742457,9890051,-16353537,1996486774,-25866,1654718464,1679198990,-364476146,-152283511,269160966,1183518324,-329872406,-1980348791,-1192495018,-1947580789,1446636630,2095546360,-163170043,748806259,773229331,-128567021,92066943,1945519673,108462029,-493825,-1070860682,374864,-26032,922681344,1183518240,-163173398,-26032,1183383552,142016488,262944511,-26032,1183514624]},{"sector":2,"data":[1174510056,-128577034,1183554283,-195654670,-1995217245,-1961662442,1452011078,321692656,321787529,49120094,1562371467,313933,1167087646,518818645,-326903666,512448016,1207894022,-1608611070,-1995994351,1187508806,-1962934020,-1961942498,-196703993,1191118827,-196705284,-195130602,1946173315,-1960866831,263431,-940161399,129606,99763851,1183383714,13232632,-1963434357,2133067079,58002236,-167728151,1963066439,10676483,67389430,-1712782476,254451968,2113685049,-161576142,-788248693,2145681640,1039156873,1534427135,-1577302273,1178144554,-2096333316,-1961429946,1065612382,-1578535936,1178144554,-1959953156,-16775650,1996423759,-25862,512425984,1207894022,-1608611070,-1995994351,-1564937658,-93391104,-1980611069,971765830,-1946919285,84380447,1183383556,-1953305610,1178204742,958559472,259977286,-150953288,-259264402,-2131599733,-2096888760,-385026490,1586233191,73892088,-96010245,-1560787327,195600640,2113553977,-13833981,401035,1577209855,-1962742397,1297948645,50333131,-16744960,50339584,-16717312,50343680,-16650752,50355200,-16721408,50357760,-16713216,32512,0,0,1167087646,518818645,-326903666,1187468806,-352321286,702535,-1946521865,51276830,-62486265,529258635,1996437387,-1705617914,65535,5610064,179830784,-93391104,241966731,1183385347,108462076,1342178821,1342178488,28826,-96010496,957229217]},{"sector":3,"data":[-1317209530,-1207535873,-1202714746,-1706033151,65535,49120094,1562371467,33737293,805307136,1526791936,905970432,2130771712,0,0,0,0,1167087646,518818645,244373646,-2097149464,-443874579,-884122337,1167087646,518818645,-326903666,-1705617628,65535,16777114,205431040,770590345,691863553,-385649152,-1073543023,-1476448621,-2031548615,-2110324984,1077346075,1144454924,1110900492,1211563788,1178009356,23370252,922681344,922684480,922684484,922684482,922684488,-4715450,-1070903169,1347440720,120730,-1983894784,1183440966,-293698594,-1207601905,65732611,-1560277320,28838974,10113024,-2097151999,1948708478,114682115,16777114,114157824,205534975,205797119,205666047,1347469355,461518591,1184976976,1209436940,-565802740,1390433929,20552272,2122514432,91557614,-352321096,1030147,-1207157085,-1706033151,328,-2096724247,440894,-504822923,1077346048,1144454924,1110900492,1354771212,-1338572976,-11513845,-1710510026,349,-1981921655,1347608662,143514,1040631552,-1207958004,-1706033151,401,196097791,461518591,1347469355,461518591,98714,-1706012160,392,122010,102623488,461518591,196097791,1347469355,196097791,131226,-1706012160,436,1342177720,152986,1040631552,-16775924,-16011210,-15974346,-15973322,-15973834,-15972298,-1710471626,588,205534975,205797119]},{"sector":4,"data":[205666047,206059263,205928191,1350565816,1347469355,-1684385712,-1711276030,65535,1183432747,-565802528,-2096782615,440894,113707381,68464,-16411927,-1710510026,581,-1981921655,922738774,1117850688,1142328076,1174799116,1209406220,726684172,-11513664,1342943286,-529072304,-1696696577,65535,196097791,461518591,1347469355,461518591,16777114,-1706012160,632,1342177720,16777114,1040631552,-16775156,-14974410,-15974346,-15973322,-15973834,-15972298,-1710471626,65535,205534975,205797119,205666047,206059263,205928191,1350565816,1347469355,-6664112,-1962934017,1452006982,205956064,206050953,-83479,-1709473226,761,-1981921655,922738774,1117850688,1142328076,1174799116,1209406220,726684172,-11513664,1343980086,-529072304,-1696696577,975,461518591,196097791,1347469355,196097791,329882,-1706012160,102,1342177720,307610,1040631552,-16775412,-385109962,922746697,922684490,922684494,922684492,922684488,922684486,1119358016,-1070903284,-26032,-1073020928,-1897331851,205955333,206050955,-1981921655,1117904982,1142328076,-498693876,-1578871159,378211404,1117981774,1142327564,-498693364,-1545316725,378080332,1084296270,-431585012,-1559475551,1183517760,206218214,16777114,66709760,636386947,1352730996,1377209100,-1593316596,378211398,1183386696,-531199522,461518591,-1070903214,922701904,922684480]},{"sector":5,"data":[922684484,922684482,922684488,-157676474,-16777213,-15974346,-15973322,-15973834,-15972298,-15972810,723223094,-11513664,1996480630,87595742,922681344,-1070916734,1996443728,-562626592,1350565816,1347469355,-1986375600,-2097152000,1948642942,205955355,206050955,-1995681629,-1962126826,1452006982,205956064,206050953,636386947,512440437,529207074,-150989128,-1962131410,37784560,721703051,453788166,-1995684842,1451875910,1077346272,1144454924,1110900492,1380995596,-26032,2122514432,141895662,205391559,686489640,686718595,113707125,2559038,2122521323,141886190,205391559,216727568,284065411,113706613,134206,1342177720,43930,1781989120,1748434715,112667,-26032,1347551232,460207871,460076799,16777114,-1706012160,65535,-16601367,-1928576970,-397348794,-1073019916,-1662450827,-2110324990,-163148517,65202256,58048523,-16610583,-1710473162,1303,-1981921655,922738774,748297090,-1996488703,1451878470,-2110324758,726684187,-11513664,1342980150,-529072304,-1696696577,230,205534975,1347469355,-2066689,922738294,1347427202,-1411329,2023417974,-16777210,723223094,-11513664,1996483190,2147465448,1354771280,-1706012592,1728,253894283,381165451,1076819712,-1947170036,1183387712,1958743036,-946188282,-1962934267,-1961942498,1488927,205532919,1183576203,272665078,253894283,381165451,-2110851328,-1947170021,1183387712]},{"sector":6,"data":[1958743036,-6664186,-1962934017,-1961942498,1488927,461516535,1183576203,272665072,460719815,-1528168449,1488897,205532919,253894283,1183385347,1489132,461516535,1183385347,-329348110,-1995683957,1988885062,205818866,-1962129527,1183576670,206014970,-1947443573,1183387719,-227111952,-1995422581,1586171975,-263812110,-1206892663,-1706033151,1842,-1543503944,1990394292,461808411,-367127,-14974410,-15969738,722227254,-11513664,-15974346,-15973322,-15973834,-15972298,-1710471626,1697,205534975,205797119,205666047,206059263,205928191,461518591,1347469355,206714623,206583551,189594,-2110324992,1354771227,1379336016,1345781516,2147465228,1354771280,-1706012592,1043,-1962129759,-1995683818,1451875910,206610912,206706315,-1995684189,-1962129386,1452006982,206611424,206706313,721420728,-1559473146,381160532,1076819712,572427020,-1996029169,381217862,-2110851328,-1996029157,1586229830,340233196,-1946925431,1150022262,340232468,-1947050357,1200223302,112660,50960976,2145976320,-1811919367,436256771,1879115523,-1358828799,-754396414,-754396408,-1073163512,-1811919616,-1811361021,-1811704829,-1811704829,-1811704829,-385641469,-1811704827,-1811704829,-1811704829,-167537661,-1811704826,1292080131,-1811704832,-553233661,1883144964,91488267,16777114,1488896,205532919,512487563,922947362,-1192462711,787939350,-125101182,2122923779,105155570,19261649]},{"sector":7,"data":[-129595136,-788118133,75240,1284235473,-35553274,1149878539,-129594618,-788528859,105745376,201187712,105220545,621167755,1183383553,105155576,1301020196,31555846,-1983837440,1183516228,75256,-2147070581,-1056178463,-2096740983,1963257470,11790595,586055299,-1427569803,-293698816,-385649382,2122514593,58010094,-2097112855,-15582658,-1897331851,305832192,205522489,-2098658444,325492992,325588619,205788729,109016444,205653561,1183542642,-531199010,205653507,205788691,321787451,108812671,321652283,2122535287,678766062,205797119,205666047,205797119,205666047,1342178488,16777114,-1706012160,2249,325322439,501940225,205797119,205666047,-1948367221,100917334,370347074,1347554372,317594,470206208,1577058562,49120095,1562371467,-1957311667,82609132,572427094,-1205892337,1861681174,-1947170042,1183387712,1975520254,73304841,1991,62404331,-27358464,1878466443,-1992278014,-1705968570,65535,-1996202357,74792967,401326123,-106869,73304887,939466635,-1694730497,65535,1577058744,-1034033781,50336772,-16212736,50369024,17142529,50333440,-16485888,50339328,-16465408,50340352,-16280320,50341376,-16729856,50374400,-16367616,50342144,-16173056,50345984,-16765696,50348544,-16600064,50350080,-16419840,50351104,-16580608,50351360,-16461568,50420736,-16766976,50422016,-16210944,50356736]},{"sector":8,"data":[-16427264,50356992,-16684800,50428928,-16544512,50429184,-16565760,50429440,-16181248,33280,0,0,1167087646,518818645,-326903666,-2091493628,251873854,-1070917260,-26032,512425984,2139947854,459849250,96012062,-2086276608,2097154174,20637955,-1559738741,951649098,-1947601152,147030488,1310624016,88574467,983819306,742886162,-1961852765,-1961942498,1488927,305802999,1082912907,-62486256,158646283,529258635,1962950531,305832224,723220131,241214400,-955359581,-16056826,444415,-947912949,-16560122,1310624767,537886723,55451275,-1927583553,119415415,-234879559,55353765,1963476537,-1547687154,1721963368,-1338573037,-10228981,-1710081482,65535,55451275,16861174,-56550028,-32077050,325493510,325588617,-1962475359,755434006,-628948990,-1959204096,-167555554,1946288455,117743895,117839499,-1995217245,-1592563690,378210056,-672463094,-1962472287,-1559818730,378082150,922686312,1989808698,-1560281086,378082092,1347556142,325596927,325465855,16777114,321692416,321787529,55451275,-1961662815,-1995216874,1468602439,1310624538,321691907,321787531,-1994635383,113712727,3686,459947651,-1587643392,378215276,372841326,477436778,459802169,-1331620235,973486347,-15895534,-14980554,-1709479882,65535,305805055,459945727,459814655,16777114,302446080,410259467,-1961991519,957244438,1964731926,1812347147]},{"sector":9,"data":[-1207601893,48955393,1688453163,-2090901997,-443874579,-900899553,1478361092,-1957345904,-661774612,1443294339,55066243,-1207534590,-1997996017,55091456,-1174649207,-369688520,-964562805,727060488,381178048,1167740928,-1979711486,1149765190,5289989,-26032,1149829120,-948682698,-13214581,1354771255,1342197944,16777114,-2012565504,1149764676,138840835,-1993587575,1149841476,876922414,893699584,17596417,-2145383296,-1979635124,-467008188,-26032,1149829120,508856604,-1995232607,117379140,1183515464,-310157572,535137026,80366941,-1873273344,-326412987,1473809950,108432214,1366619659,-150980424,-2585618,-1710211401,65535,55326265,113706613,983884,55054079,55064121,951593854,-1947273472,272631288,96963408,-1588588536,-970259640,-150980423,-6663959,956301567,2114145334,1276051204,-2090902013,-443874579,-900899553,50334210,16955393,50333440,-16770560,50370816,-16665344,50339584,-16694016,50340096,-16584960,50342912,-16638208,50346240,-16699648,50350080,-16723968,50419712,-16669696,50392064,-16634368,33280,0,1167087646,518818645,-6629234,-16776961,-6683018,-2097151745,-310181180,535137026,46878045,318767872,-2080309504,184550145,-2063532288,1,0,0,0,5]},{"sector":10,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2147418112,1381433344,541414473,1836216134,1702130785,1700012132,29816,1459617792,1702127986,2108704,0,0,0,0,1680736256,1140881010,1128879685,1146047813,822083653,3211264,1048588,1572884,2621472,3932208,6291528,1953724755,28005,0,3276799,0,0,0,0,0,0,0,0,1633646445,1651794787,1852788224,1968046181,1867541612,1828746354,1919904887,1828746085,1919510647,29541,2003632128,1868786015,2003632238,1852140895,1666383989,1819045746,7496002,1869767507,1631743084,1666383986,1819045746,7496002,-65504,65535,1,4128831,268369935,2032127,4128784,268369927,1835519,1393106976,1933910120,-65437,128,1632698367,824206695,0,0,0,0,0,0,0,65536,0,0,0,2147418112,32767,0,0,0,0,0,0,0,1,1,0,0,0,1143865344,17231,1397507886,35782656]},{"sector":11,"data":[35652136,35652128,1262567982,1397555200,1953067607,1866858597,7894126,1953067607,1866735717,1701672291,29806,1953067607,1917853797,1634887535,1918304365,543519849,1702256979,1918304256,6648937,1953387816,1701606505,10596,0,0,-65536,0,0,-65536,0,32,0,65535,-1482184960,-1499159130,-1480291610,623224743,-978934747,-2105376126,-2101312894,-2105376126,-2105376126,49830,65700,65536,0,0,65536,1684957559,7567215,1769366852,25955,1769366884,7562595,1801675074,28789,1381454669,1598379081,1431192909,1397555200,1414091351,1329880901,1397555267,1414091351,1431461701,5391692,1381454669,1598379081,1162297680,1330007625,0,983040,268959759,65535,0,0,0,0,0,0,0,0,0,0,0,0,1478426622,-1957345904,-661774612,1461513347,108432214,880805099,1015039507,-559872,1183648886,-1957685514,536807518,-2131073408,-2130942336,-1946532213,-772156984,-1949266951,-754732583,-1982200838,-1020531106,-1947056503,-930350010,-103679535,737169033,-196703807,-1962248449,1344144966,1358954424,384714381,1161296,140413776,-1962647553,-120456634,-1947449719,-120456122,736773769,-336098305,175570773,736904843,-1957211962,1610549342,175570696,-364475562,-1957640445]},{"sector":12,"data":[1610549342,175570700,65816203,-1957211962,1610549342,175570696,737822347,1183535302,1355219946,-16228725,1183517791,-754535942,-1947204616,-120325050,1983510531,1587969516,49120095,1562371467,576077,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2105164800,1617198199,2053194803,2066970215,1899192434,863860342,1719427441,862419828,1781759079,1899193980,2085696362,1362313073,859795836,1919574353,1345535869,1346271867,2104911483,2104636223,1917006711,103]},{"sector":13,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,-65536,-1,65535,16711778,0,0,0,0,0,0,0,0,1048576,0,0,0,262152,1668509040,29301,1,0,0,-65536,-1,1651638272,1869902965,1836187758,7041633,0,0,0,0,0,1162346496,1380271169,1330595328,5391700,1867382783,1852990820,1836012032,1392537185,1936943479,1919111936,7630953,1868784964,1769234802,1392534902,1936943479,1680736256,30322,0,15,0,1143876188,1275085647,1768186223,1713399662,778398825,11822,3145777,0,0,0,2228224,7168800,808546336,829431808,1881145394,1814036596,126484585,126879628,127534997,94373790,9437751,1310840,774766832,46,-1,0,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,0,-65536,-65536,-65536,-65536]},{"sector":14,"data":[196612,16713762,196992,16713766,196993,16713770,196994,16713774,387,0,0,0,2031875,2097152,262176,-65536,-769,-1793,-1793,-3841,-3841,-7937,-7937,-16129,-16129,-32513,-32513,-65281,-65281,-65282,-65282,-65284,-65284,-65284,-65281,-63233,-63233,-61953,-61441,-57346,-57346,-57346,-57346,-49154,-49154,-32770,-1,65535,0,512,512,1536,1536,3584,3584,7680,7680,15872,15872,32256,32256,65024,65024,65025,65025,30208,30208,25088,25088,24576,24576,49152,49152,49152,49152,32768,32768,0,0,0,2031875,2097152,262176,-65536,-769,-1793,-3841,-7937,-16129,-32513,-65281,-65282,-65284,-65288,-65296,-65281,-65281,-59138,-58114,-49412,-49156,-32776,-32776,-4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,512,1536,3584,7680,15872,32256,65024,65025,65027,32256,28160]},{"sector":15,"data":[26112,49664,49152,32769,32769,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,524547,2097160,262176,0,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,65343,-193,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,65535,0,-12648448,-12648448,-12648448,-12648448,-12648448,-12648448,2130706432,2130706432,2134769664,2134769664,2134769664,2134769664,2134769664,2134769664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33026,3932592,16842806,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},{"sector":16,"data":[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481]},{"sector":17,"data":[268435455,-16,-1044481,268435455,61680,-252702961,268369920,65520,-1044481,252641280,61680,-1044721,268435455,-16,-1044481,268435455,-16,-252702721,252641280,61680,-1044481,268369920,65520,-252702961,252641280,-16,-1044481,268435455,-16,-1044481,268435455,61680,-252702961,268369920,65520,-1044481,252641280,61680,-1044721,268435455,-16,-1044481,268435455,-16,-252702721,252641280,61680,-1044481,268369920,65520,-252702961,252641280,16580592,-1044673,268386300,-16,-252702721,252641280,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,255787260,1073545200,-1044481,268435455,61680,-1044721,268435455,-16,-1044481,268435455,-16,-1044481,268435455,16580592,-1044673,268386300,-16,-252702721,252641280,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,255787260,1073545200,-1044481,268435455,61680,-1044721,268435455,-16,-1044481,268435455,-16,-1044481,268435455,1073545200,-1044481,255802620,61680,-1044721,268435455,-16,-252702721,252641280,61680,-252702961,252641280,61680,-1044721,268386300,1023213552,-252702913,252641280,-16,-1044481,268435455,61680]}],[{"sector":1,"data":[-252702961,252641280,61680,-252702961,252641280,1073545200,-1044481,255802620,61680,-1044721,268435455,-16,-252702721,252641280,61680,-252702961,252641280,61680,-1044721,268386300,1023213552,-252702913,252641280,-16,-1044481,268435455,61680,-252702961,252641280,61680,-252702961,252641280,1073545200,-1044481,268386300,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268386300,1073545200,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,1073545200,-1044481,268386300,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268386300,1073545200,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,1073545200,-1044481,268386300,61680,-252702961,252641280,61680,-252702961,268373760,267452400,-1044481,252641520,61680,-1044721,268386300,1073545200,-252702721,252641280,61680,-252702961,252641280,251719920,-1044481,268374000,15794160,-252702961,252641280,1073545200,-1044481,268386300,61680,-252702961,252641280,61680,-252702961,268373760,267452400,-1044481,252641520,61680,-1044721,268386300]},{"sector":2,"data":[1073545200,-252702721,252641280,61680,-252702961,252641280,251719920,-1044481,268374000,15794160,-252702961,252641280,1048378608,-51376321,255803004,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-51376129,255802428,1010629872,-1044673,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,941423856,-51376321,255801372,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-17821697,259993612,806158064,-1044609,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,537198576,-1044481,268378116,61680,-1044721,268435455,-16,-252702721,252641280,61680,-252702961,252641280,61680,-1044721,268370304,25231344,-252702721,252641280,-16,-1044481,268435455,61680,-252702961,252641280,61680,-252702961,252641280,62980080,-1044481,268370880,61680,-1044721,268435455,-16,-252702721,252641280,61680,-252702961,252641280,61680,-1044721,268371936,132186096,-252702721,252641280,-16,-1044481,268435455,61680,-252702961,252641280,61680,-252702961,252641280,267452400,-1044481,268374000,-16,-252702721,252641280,-16,-1044481]},{"sector":3,"data":[268435455,-16,-1044481,268435455,-16,-1044481,268378104,536412144,-1044481,268435455,61680,-1044721,268435455,-16,-1044481,268435455,-16,-1044481,268435455,1073545200,-1044481,268386300,-16,-252702721,252641280,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268402686,2147418096,-1044481,268435455,61680,-1044721,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,61680,-252702961,268369920,65520,-1044481,252641280,61680,-1044721,268435455,-16,-1044481,268435455,-16,-252702721,252641280,61680,-1044481,268369920,65520,-252702961,252641280,-16,-1044481,268435455,-16,-1044481,268435455,61680,-252702961,268369920,65520,-1044481,252641280,61680,-1044721,268435455,-16,-1044481,268435455,-16,-252702721,252641280,61680,-1044481,268369920,65520,-252702961,252641280,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16]},{"sector":4,"data":[-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,-16,-1044481,268435455,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,240,15732480,251658240,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},{"sector":5,"data":[-1,-1,-1,-1,-1,-1,0,0,33026,1572984,16842768,0,-1,-805306381,62980095,16761855,-1,-1879048207,62980095,16761855,-1,268435440,62980095,16761855,-1,268337136,62980095,16761855,-1,268189680,-3932161,12829695,-1,267919344,-3932161,12829695,-1,267390960,-3932161,12829695,-1,266340336,-3932161,12829695,-3841,264242160,-3932161,16761855,-3841,260047344,-3932161,16761855,-3841,251658480,-3932161,16761855,-3841,251658480,-3932161,16761855,-3841,251658480,-473708545,14926791,-3841,251658480,-1010580481,12829635,-3841,260047344,-2084322817,8635329,-3841,264242160,130277631,508896,-1,266340336,256045311,1000176,-1,267390960,520157439,2031864,-1,267919344,1057029375,4129020,-1,268189680,2130771711,8323326,-1,268337136,-16711681,16711935,-1,268435440,-8257537,16744959,-1,-1879048207,-3932161,16761855,-1,-805306381,-1572865,16771071,257,4194331,524352,-65536,16711679,-65536,16580607,-65536,16318463,-65536,15794175,-65536,14745599,-65536,12648447,-65536,8454143,-65536,65535,-65536]},{"sector":6,"data":[65279,-65536,64767,-65536,63743,-65536,61695,-65536,57599,-65536,49407,-65536,33023,-65536,255,-65536,254,-65536,252,-65536,252,-65536,252,-65536,248,-65536,240,-65536,14745585,-65536,15794163,-65280,16318435,-64768,16580583,-63744,16711623,-61696,16777167,-57600,-2130706545,-49408,-2130706529,-33024,-2130706529,-256,-1056964801,-255,-1056964801,-16777469,-520093889,-16777465,-520093825,-50331889,-520093825,-50331873,-520093697,-117440705,-1056964609,-100663297,-2080374785,-234881025,-1879048193,-201326593,536805375,-469762049,2147024895,-402653185,-917505,-1006632961,-3670017,-1056964609,-14680193,-2130706433,-8389569,-2130706433,-1761,16777215,-3297,16777215,-14577,16711679,-57593,16711679,-33020,16580607,-255,16580607,-255,16318463,-253,16318463,-249,15794175,-241,15794175,-129,31522815,-1,132186111,-1,264306687,-1,532742143,-1,65535,50331648,65535,0,65343,0,65343,1056964608,65507,2130706432,65475,-16777216,65415,-16711680,65295,-33357824,65311,-66650112,65087,-133234688,64639,-266403840,63743]},{"sector":7,"data":[-515964928,61695,-1015087104,57855,-2013331456,50175,268370176,34815,536740608,4095,1073481472,8190,2146963200,16380,-1040640,32760,-2015488,65520,-3965184,65505,-7864576,65475,-15728895,65415,-14680575,65295,-32571392,65055,-66650112,64575,-134021120,63615,-268369920,61695,-520093696,57599,1124073472,49407,117440512,33023,251658240,255,520093696,254,251658240,252,117440512,248,117440512,240,117440512,224,117440512,192,50331648,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1818838544,101,2003127824,268500992,1852141647,3026478,1393558016,778401377,11822,0,1917849603,779382377,11822,1749225476,1701277281,1769099296]},{"sector":8,"data":[1919251566,3026478,1376781696,1734439013,1952542313,774778469,1682247680,29801,1851068432,1393127268,1933910120,99,285212672,1953841936,1818575881,269615104,2037411651,3294729,1343230720,1702130529,1936607497,0,269746176,1702260557,1667846176,1701999988,269844480,1702521171,1667846176,1701999988,1699942400,1751347809,270532608,1684957510,3026478,1376788736,1634037861,1632378996,1176532083,157576809,13126,1749225506,1701277281,3026478,0,1192240000,1867784303,1734430752,774778469,3425801,1634222864,1952670066,29285,1867386944,1818324338,3491337,0,1108361472,157576303,13894,1950945346,1667853409,3622409,1427129088,1919247470,1701734764,3687945,1393574912,1919250549,1769104243,29808,1968377925,1919120226,7630953,0,1066496,1066752,1067008,0,1376798976,1668637797,1866866789,1175024750,1241514041,1819165968,1701278305,1852786208,826673524,48,1266679808,1852786192,774796148,1343225902,1734439521,1752195442,276824064,1836216142,27745,0,1699483777,29798,1698893954,1919251566,25701,1766985859,7628903,1242596352,1769239413,1684367718,0,277151744,1735289171,1394632044,1701011824,277217280,791748657,1884495922,6644577,1141933824,1818391919,1884495973,6644577,0,1225820288,1852138606,774796148,1150287918,1836409711]},{"sector":9,"data":[7630437,1209073664,1701077349,774778482,285278208,1953460038,774795877,46,33554432,1819628049,1327526501,50331758,1650545681,774778483,0,285507584,1701273936,2036419616,779384175,11822,-2143289344,671096326,1593876480,0,458754,786472,196607,1182945282,1852140649,979725665,3014656,7208965,262156,1350631552,67108993,1174411520,83902464,-1593834752,33616,1638478,786508,65539,8540162,738221824,234893824,16777472,-2142240000,1852141647,6225920,3276866,131086,1342373888,1851868032,7103843,0,0,-2143289344,671096327,889246208,0,327685,655470,65535,1401049090,543520353,1920103747,544501349,1969450820,1953391981,980631840,327680,7995409,262156,1350631552,-2130706303,1275069696,50334720,256,33360,2293765,786484,131077,1417695235,544503909,2037149263,4587520,3932195,393228,1342373890,1801538944,1631723621,1886743395,10158080,3276817,65550,1342373889,1986089856,-1694498715,838869504,33558016,50331648,1631813712,1818583918,0,-2143289344,335552006,1342215680,0,327680,524438,131071,1300385794,1869767529,1952870259,1852397344,1937207140,589824,23,-65536,1342177283,1601662338,1852793705,0,9830414,-65528,1342308353,1769101186,25972]},{"sector":10,"data":[2228259,524368,131071,1451380738,1769173605,824209007,3158062,788529152,134256128,33554176,-2108685824,2037411651,1751607666,547954804,892877105,1766662188,1936683619,544499311,1886547779,922746926,671104000,16780800,50331904,1800372304,0,0,0,0,-2143289344,838865163,1291878912,0,458757,786462,65535,1132613634,1701408879,14963,327715,786462,8388618,8474753,335545600,201345536,33557248,-2142240000,1717662276,1968250996,1953066081,83886201,838870272,-16774144,33554687,1632666192,1377854823,1701277281,167772218,838872832,100666368,50332672,1816232016,167772268,503331840,117443584,1024,1917222992,3829103,1023420672,201334272,-2147481600,-2125430016,5111808,786495,-65524,1342308352,980374658,6029312,1966141,589836,1350762624,1426063489,671089920,16780800,50331904,1800372304,5570560,2621465,131086,1342373888,1851868032,7103843,0,-1865940992,838864643,872449536,1342177280,1953393010,6778473,327685,524416,65535,1468157954,1702127986,544434464,1684956531,543649385,1920298873,1668244512,1852140917,83886196,-2147480064,-16775168,33554687,1869906512,1701344288,1769107488,1919251566,788529198,671096320,33558016,50331904,1631813712,1818583918,0,-2143289344,1677744644,755014400]},{"sector":11,"data":[327685,786512,65535,1384271874,1734439013,1952542313,1866735717,1701672291,29806,1638405,786532,131075,1132482563,1768320623,1344302450,543516513,1634038338,29547,327790,917544,65537,1333809155,1845493867,671095040,33558016,50331648,1631813712,1818583918,0,0,0,0,-1865940992,838864643,838884864,1375731712,1734439013,1952542313,6778473,327685,524372,65535,1468157954,1702127986,544434464,1634755954,1634625895,1735289204,327680,3407886,-65528,1342308352,1970239874,1868832882,1701672291,29806,1835035,917544,65538,1132482563,1701015137,108,0,0,-2134376448,2013288968,838909952,1375731712,1734439013,1952542313,6778473,327685,524380,65535,1434603522,1965057395,1851859056,1868832868,1646292599,1869902965,29550,917509,524360,65535,1954697218,1869422703,1881171318,543516513,1634038370,83886187,872421120,-16775168,33554687,1718190672,1667591712,1634956133,2914674,536872192,134231040,16776960,-2108685824,1852139636,1852793632,1836214630,1711276078,671090688,83889664,50331648,1884651600,6684672,2621468,393230,1342373888,2003780736,-1828716434,671090688,16780800,50331904,1866694736,1919510126,-1828716435,671095808,33558016,50331648,1631813712,1818583918]},{"sector":12,"data":[-2134376448,1677744646,973113088,1375731712,1734439013,1952542313,6778473,327685,0,262143,-8237056,503348994,1543505664,-16774144,33554687,1868005968,543452277,544567161,1701538156,544175136,1885693291,1966080,6553619,-65524,1342308352,1768453250,2019893363,1769239401,1881171822,543516513,1634038370,16235,2293767,917539,2,1132482563,1701015137,822083692,587211520,16780800,50331904,1699446864,28773,2293851,917539,4,1384140803,1987013989,101,0,0,0,-1874853888,671096324,1342225920,0,327685,786502,65535,1401049090,1667591269,543236212,1852404304,980575604,327680,8650772,196664,1352859651,1818579843,544498533,1917853793,1702129257,14962,1310865,917544,65537,1333809155,-1862270869,671101440,33558016,50331648,1631813712,1818583918,0,-1865940992,-1526716411,922798080,1174405120,6581865,458757,786477,65535,1182945282,543452777,1952540759,838860858,-1946155776,117443584,-2130673664,33104,1310725,786492,131077,1468026883,1701605224,1919899424,1677721700,1593840640,100666368,50332160,1632469072,543712116,1701867605,1867263858,1668441463,6648673,587220480,234896384,16777472,-2142240000,1684957510,2019905056,116,0,-1865940992,-1778369526,1174468864,1124073472]},{"sector":13,"data":[1735287144,327781,2949127,-65524,1342308352,1852393090,1750540388,3830881,83898880,201364992,-2147481856,-2125430528,327680,2949142,-65524,1342308352,1634222978,543516526,3829588,335557120,201364992,-2147481600,-2125430528,327680,3932195,327692,1342373890,1869109120,1461740908,6582895,587228160,201376512,33555968,-2142240000,1668571469,1884627048,796026224,1702326092,1935762290,83886181,738210304,16780800,50331904,1766228048,1310745710,7632997,838874624,234900480,2304,-2142240000,1851877443,539780455,1852139636,1852392992,-2030043036,536883712,50335232,50331648,1749254224,1701277281,11272192,4718642,262158,1342373888,538976384,1851877443,1092642151,538995820,32,0,0,0,-2143289344,1056986884,671112960,0,458757,786482,65535,1350717442,543516513,1651340622,3830373,83900416,201334272,-2147482880,-2125430528,327680,2621462,65550,1342373889,7032704,369111552,234891264,512,-2142240000,1668178243,27749,0,0,-2134376448,604000265,1476441088,1174405120,1937010287,83887360,201338112,16776960,-2108685824,1953394502,1835093536,14949,1048581,786557,8388611,8474753,587203840,805333248,50332672,-2091867904,7536640,1572907,393256,1352728579,-1879048061,268448000,-16774656,33554687]},{"sector":14,"data":[1866891856,29806,3866768,786452,65535,1401049090,979729001,9437184,1966151,327692,1350631552,-2030043007,671089920,16780800,50331904,1800372304,8847360,2621465,131086,1342373888,1851868032,7103843,0,0,-2134376448,603986952,872453632,1224736768,1852138606,50361204,805308160,-16774144,33554687,1699512912,1226863718,1852138606,14964,327736,786472,8388611,8474753,369099520,201337856,16776960,-2108685824,1936877894,1766596724,3827054,335558656,201336832,-2147482624,-2125430528,196608,3407909,-65524,1342308352,1734955650,1226863720,1852138606,14964,2293816,786472,8388613,8474753,134244608,234891264,16777472,-2142240000,27471,1769577,917544,2,1132482563,1701015137,108,0,-1865940992,1845514246,704701440,1342177280,543516513,1684104520,83915365,1275070208,-16774144,33554687,1766097488,1851880563,1713399139,544042866,980447060,1342177312,503317760,83889152,-2130673664,33104,327813,786522,131078,1350586371,1953393010,544108320,1936877894,1632641140,25959,1441804,917568,3,1233145859,1919251310,1632641140,589325671,5767168,1966102,262158,1342373888,1701593984,29281,1441922,917589,65537,1384140803,1920300133,1869881454,1668236320,1852140917,116]},{"sector":15,"data":[-1865940992,1845514246,704701440,1342177280,543516513,1953460038,83915365,1476396800,-16774144,33554687,1766097488,1851880563,1713399139,544042866,1953787714,540700015,5898240,1966085,327692,1350631552,-2063597439,1509950720,100666368,50332160,1917878352,544501353,1176530543,1953722985,1734430752,201326693,1073747456,50335232,50331648,1850310736,1953654131,1734430752,2302053,369121280,234888704,1024,-2142240000,1634036803,-2113929102,1426068992,16780800,50331904,1699905616,1852994932,544175136,1969450820,1953391981,0,-2134376448,687878687,1627448832,1409286144,7561825,458755,786472,65535,1350717442,1953067887,1936617321,50331706,671099392,-16774144,33554687,1867547216,1769236851,980643439,196608,2621462,-65524,1342308352,1667581058,1818324329,50331706,671103232,-16774144,33554687,1698988624,1634560355,14956,327725,786462,8388612,8474755,335557376,201331200,33558528,-2142240000,1258291246,503317760,83889152,-2097119232,33104,1310801,786450,131089,780161027,6881280,1966085,393228,1350762624,1862271105,301995008,301992960,50332160,3047504,83920640,201334272,-2147481856,-2125430016,9240576,1179668,1245196,1342373890,11904,327845,786462,8388616,8474755,335588096,201331200,33559552,-2142240000,-1023410130,503317760]},{"sector":16,"data":[150998016,-2097119232,33104,1310921,786450,131093,780161027,2949120,1966120,655372,1350762624,855638145,302003968,369101824,50332160,3047504,671107840,201334272,-2147480832,-2125430016,5308416,1179703,1507340,1342373890,11904,2621545,786462,8388620,8474755,922775296,201331200,33560576,-2142240000,-2030043090,503326720,218106880,-2097119232,33104,3604621,786450,131097,780161027,10813440,1966120,917516,1350762624,-1426063231,302003968,436210688,50332160,3047504,671138560,201334272,-2147479808,-2125430016,13172736,1179703,1769484,1342373890,11904,4915220,917554,65537,1333809155,1509949547,838880000,33558016,50331648,1631813712,1818583918,10485760,3276875,196622,1342373888,1701593984,1092645473,27756,0,0,0,-2143289344,671095309,1342223360,0,458757,786520,65535,1401049090,1953653108,1734430752,1968054373,1919246957,1950425203,1593835578,503317760,50334720,-2130673664,33104,2162693,786472,65535,1300385794,1768387169,3830638,805309440,201331712,16776960,-2108685824,1952867660,587202618,503328256,67111936,-2130673664,33104,3145813,786462,65535,1384271874,1952999273,1962934330,503328256,83889152,-2130673664,33104,4259852,786452,65535,1417826306]},{"sector":17,"data":[3829871,1056973568,201334272,-2147482112,-2125430528,5570560,1966145,-65524,1342308352,1953448578,980250484,7667712,1966143,458764,1350631552,-2030043007,671089920,16780800,50331904,1800372304,8847360,2621463,131086,1342373888,1851868032,7103843,0,0,-2134900736,335557131,1090579200,1459617792,1702127986,83887360,0,67108608,-2108686336,8324095,327710,786632,65535,1132613634,1701999221,1881175150,1953393010,1663070821,1869508193,1919950964,544501353,1937012079,543515753,1936025716,1634541669,1852401522,503316595,335548672,-16774144,33554687,1699512912,3830886,285228032,201336832,768,-2108685824,8519680,1572881,-65524,1342308352,1734955650,3830888,285255680,201336832,1024,-2108685824,1966080,1048605,-65524,1342308352,1886344322,1006633018,671096064,83889152,33554432,33360,1900674,786460,65535,1115836418,1869902959,14957,1900712,786472,6,8540162,738222336,234891264,16777472,-2142240512,27471,0,1851065600,119566180,1953064005,174550633,1836216134,1769239649,1409705838,1852403833,1968310375,544367980,1376349775,1919249525,1717980960,1868710152,774796405,46,1230133001,1210991956,1125142604,1735287144,1699946597,1952671084,175009641,1851877443,1092642151,1879338092,6645601]}],[{"sector":1,"data":[67108864,544108320,1376845824,1634496613,1159751011,1953720696,543649385,1749229575,779317857,1634030348,1768448882,774793070,46,0,0,0,1634030352,543712114,1886220131,1702126956,1699943982,1751347809,2019914784,1869488244,1868963956,778333813,544165397,1851877475,544433511,1701995895,1684106528,1393569381,1668440421,1633886312,1818583918,3040357,0,0,0,0,1684291857,1852794400,1869881460,1936288800,1396391796,1852404340,1936269415,1869575200,1852795936,538979943,1668248144,543450469,1752459639,1701344288,1919510048,840987763,1663055157,1634885992,1919251555,16243,0,0,0,0,0,1310392320,1629516911,1818326560,1461740649,1702127986,1668244512,1852140917,1309486708,1970479215,1881172067,778397537,1953451539,1981833504,1684630625,1836412448,779248994,1852786213,1769152628,544433530,1953723757,543515168,2004116834,544105829,1851858996,842080356,1311911479,1700949365,1970086002,1646294131,543236197,1819240567,1970151525,1919246957,1952801312,1852138871,1629499680,857760878,926299954,1867388974,543236212,1768710518,1701650532,1920299873,1852140901,1294282356,1970495845,1701668210,1830843502,544502645,1814062434,1701278305,1752440946,2048945761,779055717,1918979345,544106855,544173940,1735549292,1310010981,1629516911,1818326560,1713398889,1852140649]},{"sector":2,"data":[778399073,1919895063,1953784173,543649385,544173940,1886220131,779642220,0,1851867938,544501614,1702260589,2019914784,1869881460,1634235424,1869619316,1769236851,808349295,543516756,1886152040,1818846752,1381441637,776295497,542133320,1763734377,1919902574,1952671090,544370464,1936943469,778530409,1936278584,1936269419,1819633184,538979948,1634036816,1931502963,543520353,1969450852,1953391981,544108320,1768169569,1919247974,544501349,1802725732,1850291758,1717990771,1701405545,1830843502,1919905125,1869881465,1885696544,1852401505,795178081,1852404336,1752440948,1679848297,1836409711,779382373,1766078976,1763732339,1920409715,543519849,1953460848,1702126437,538979940,1634036816,1914725747,1987013989,1920409701,543519849,1953460848,544498533,778199412,1936278581,1768169579,1952671090,544830063,1713402729,778857589,1817190432,1702060389,1702065440,1679843616,1701209705,1953391986,1936286752,1126641259,1651534188,1685217647,1869575200,1734959648,1919903264,1635148064,1650551913,1830839660,1919905125,1343041145,1953393010,1696625253,1919906418,1851867925,544501614,1684957542,1668244512,1852140917,539242100,544432488,1851877475,778331495,1632837664,1663067510,1701999221,1663071342,1735287144,524252005,544501582,1970237029,1830840423,1919905125,1869881465,1853190688,1769101088,422471028,1701996868,1919906915,1868832889,1847620453,1696625775,1953720696]},{"sector":3,"data":[1867391790,1852121204,1751610735,1936286752,1886593131,543515489,1914728308,1461743221,1702127986,538973230,1668507972,543453793,1885957187,1918988130,1175863140,543517801,1847620457,1629516911,1818845558,1701601889,46,0,0,0,1634030132,1852779876,1713404268,543517801,1953723757,543515168,1702257011,1853169764,544367972,1768169569,1919247974,544501349,1701667182,1631793966,1953459822,1853190688,1769101088,539911540,1634620704,543517794,1663070068,1952540018,1702109285,1919905901,544830049,1701603686,1851068206,1701601889,544175136,1852404336,1851069044,1701601889,544175136,1819305330,543515489,1920091439,1998615151,1701603688,1769107488,1852404846,1768956007,1920300131,538979941,1952672080,543519349,1869506409,778331506,1936607535,1768318581,1852139875,1768169588,1931504499,1701011824,544175136,1852404336,1752440948,1679848297,1836409711,779382373,0,0,0,0,0,1936278547,1919230059,544370546,1713401455,778398825,1867260672,1852776567,1835363616,779711087,1632837664,2032166262,544372079,1969450852,1953391981,1699948334,1869181811,1869881454,1869357167,539912046,1986089760,1869488229,1948265591,544105832,1953068401,1277952046,1864398703,1701650542,2037542765,1344282670,1935762796,1818435685,543519599,1629515361,1768714352,1769234787,3042927]},{"sector":4,"data":[302018817,7471376,1929449505,17834752,272629876,1090548993,7733520,1996558402,17842944,273219704,1241545089,16,578142219,-1577130775,378209112,1183384410,-531199522,-1996268383,1956764230,-2142895869,-370784513,922745964,62391976,-1070903296,-1924116400,385837702,44210768,1183383552,2109737942,-75962109,-9402741,-9664967,-2037708163,-2043019410,276627306,1342177720,16777114,2013724416,-71374578,-9257341,-14912512,-1207523274,-1706033151,65535,1342177720,617370,1921435392,-1593835265,1178144376,-15042566,1996425334,-596181036,-9795955,134322768,-1073020928,988349301,142016510,-1804545,-2037520778,-1705967766,2086,58048523,-1577180951,1178144376,-385648942,1996488479,-1569259768,-1918077185,1358916230,16777114,1958742784,-16389885,-2080507671,1946158718,-834207986,956435617,58576454,-2080699159,1946158718,171868938,57933826,-1191316247,1861681174,-1947170040,51323422,113673015,1963066614,-864124079,-1959365632,529263198,-1949532533,956664637,-1960413945,126610014,1342178309,-1949540725,263431,440400,-1947574645,1345320735,16777114,1975520000,112645,-1070923029,-788528859,-2146661408,-1056178719,2122515593,141820108,-1697876225,2268,13663875,-6683275,-16776961,-157621130,-2097151992,1946158718,1753663327,-2097151745,1946211454,-730398968,591002,-1568767232,-16223232,1687855734,-2097151994,134718,922686581]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]],[[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}],[{"sector":1,"data":[]},{"sector":2,"data":[]},{"sector":3,"data":[]},{"sector":4,"data":[]},{"sector":5,"data":[]},{"sector":6,"data":[]},{"sector":7,"data":[]},{"sector":8,"data":[]},{"sector":9,"data":[]},{"sector":10,"data":[]},{"sector":11,"data":[]},{"sector":12,"data":[]},{"sector":13,"data":[]},{"sector":14,"data":[]},{"sector":15,"data":[]},{"sector":16,"data":[]},{"sector":17,"data":[]}]]]
      • 1981-04-24.json
        [53,55,48,48,48,53,49,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,216,224,237,225,185,0,64,252,139,217,184,255,255,186,85,
        170,43,255,243,170,79,253,139,247,139,203,172,50,196,117,37,228,98,36,192,176,0,117,29,128,252,0,116,3,138,194,170,226,233,
        128,252,0,116,14,138,224,134,242,252,71,116,216,79,186,1,0,235,208,195,250,180,213,158,115,78,117,76,123,74,121,72,159,177,
        5,210,236,115,65,176,64,208,224,113,59,50,228,158,114,54,116,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,
        255,255,249,142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,115,227,
        11,199,116,1,244,176,0,230,160,230,131,176,153,230,99,176,252,230,97,42,192,186,216,3,238,254,192,186,184,3,238,184,0,240,
        142,208,187,0,224,188,22,224,233,51,1,117,213,176,4,230,8,176,84,230,67,43,201,138,217,138,193,230,65,176,64,230,67,228,65,
        10,216,128,251,255,116,4,226,241,235,180,138,195,43,201,230,65,176,64,230,67,228,65,34,216,116,4,226,244,235,160,176,84,230,
        67,176,18,230,65,230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,238,184,1,1,236,138,224,236,59,216,116,3,233,122,255,
        66,226,237,246,208,116,223,176,255,230,1,230,1,176,88,230,11,176,0,230,8,230,10,176,65,230,11,176,66,230,11,176,67,230,11,
        184,64,0,142,216,139,30,114,0,43,192,142,192,142,216,43,255,228,96,36,12,4,4,177,12,211,224,139,200,138,224,252,170,226,253,
        228,98,36,15,116,24,186,0,16,138,224,176,0,142,194,185,0,128,43,255,243,170,129,194,0,8,254,204,117,239,176,19,230,32,176,
        8,230,33,176,9,230,33,43,192,142,192,190,64,0,142,222,137,30,114,0,129,62,114,0,52,18,116,56,142,216,188,240,63,142,208,139,
        248,187,36,0,199,7,182,226,67,67,140,15,232,183,4,128,251,101,117,14,178,255,232,186,4,138,195,170,254,202,117,246,205,62,
        14,23,250,188,24,224,233,45,254,116,3,233,189,254,184,48,0,142,208,188,0,1,38,199,6,8,0,195,226,38,199,6,10,0,0,240,233,42,
        0,185,0,32,50,192,46,2,7,67,226,250,10,192,195,80,65,82,73,84,89,32,67,72,69,67,75,32,50,80,65,82,73,84,89,32,67,72,69,67,
        75,32,49,43,192,142,192,38,199,6,20,0,84,255,38,199,6,22,0,0,240,250,176,0,230,33,228,33,10,192,117,43,176,255,230,33,228,
        33,4,1,117,33,252,185,8,0,191,32,0,184,182,226,171,184,0,240,171,131,195,4,226,243,50,228,251,43,201,226,254,226,254,10,228,
        116,8,186,1,1,232,173,3,250,244,180,0,50,237,176,254,230,33,176,16,230,67,177,22,138,193,230,64,246,196,255,117,4,226,249,
        235,221,177,18,176,255,230,64,180,0,176,254,230,33,246,196,255,117,204,226,249,233,54,0,180,1,80,176,255,230,33,176,32,230,
        32,88,207,80,228,98,168,64,116,8,190,25,226,185,14,0,235,10,168,128,116,16,190,39,226,185,14,0,184,0,0,205,16,232,230,3,250,
        244,88,207,32,50,48,49,252,191,64,0,14,31,190,19,255,185,32,0,243,165,176,255,230,33,176,54,230,67,176,0,230,64,230,64,184,
        64,0,142,216,232,120,3,128,251,170,116,38,176,60,230,97,144,144,228,96,36,255,117,22,254,6,18,0,38,199,6,32,0,178,230,38,
        199,6,34,0,0,240,176,254,230,33,176,204,230,97,178,4,187,0,96,232,200,254,117,7,254,202,117,247,235,7,144,186,1,1,232,222,
        2,228,96,180,0,163,16,0,36,48,117,3,233,152,0,134,224,128,252,48,116,9,254,192,128,252,32,117,2,176,3,80,42,228,205,16,88,
        80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,11,187,0,184,186,216,3,185,0,64,254,200,238,142,195,184,64,0,142,216,
        129,62,114,0,52,18,116,13,142,219,232,118,252,116,6,186,2,1,232,129,2,88,80,180,0,205,16,184,32,112,43,255,185,40,0,252,243,
        171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,4,226,249,235,19,43,201,236,34,196,116,4,226,249,
        235,8,177,3,210,236,117,228,235,6,186,2,1,232,61,2,88,180,0,205,16,184,64,0,142,216,138,38,16,0,128,228,12,176,4,246,228,
        4,16,139,208,139,216,228,98,36,15,180,32,246,228,163,21,0,131,251,64,116,2,43,192,3,195,163,19,0,129,62,114,0,52,18,116,77,
        187,0,4,185,16,0,59,209,118,70,142,219,142,195,131,193,16,129,195,0,4,81,83,82,232,210,251,90,91,89,116,230,140,218,138,232,
        138,198,177,4,210,232,232,62,0,138,198,36,15,232,55,0,138,197,177,4,210,232,232,46,0,138,197,36,15,232,39,0,190,232,226,185,
        4,0,232,80,2,233,74,0,184,64,0,142,216,139,22,21,0,11,210,116,240,185,0,0,129,251,0,16,119,231,187,0,16,235,155,30,14,31,
        187,183,228,215,180,14,183,0,205,16,31,195,32,51,48,49,49,51,49,54,48,49,188,3,120,3,120,2,48,49,50,51,52,53,54,55,56,57,
        65,66,67,68,69,70,184,64,0,142,216,128,62,18,0,1,116,57,232,178,1,227,43,176,77,230,97,128,251,170,117,34,176,204,230,97,
        176,76,230,97,43,201,226,254,228,96,60,0,116,25,138,232,177,4,210,232,232,156,255,138,197,36,15,232,149,255,190,167,228,185,
        4,0,232,190,1,43,192,142,192,185,48,0,14,31,190,243,254,191,32,0,252,243,165,184,64,0,142,216,176,77,230,97,176,255,230,33,
        176,182,230,67,184,211,4,230,66,138,196,230,66,228,98,36,16,162,107,0,232,62,20,232,59,20,227,12,129,251,64,5,115,6,129,251,
        16,4,115,9,190,171,228,185,3,0,232,110,1,176,252,230,33,160,16,0,168,1,117,3,233,185,0,176,188,230,33,180,0,205,19,246,196,
        255,117,32,186,242,3,176,28,238,43,201,226,254,226,254,51,210,181,1,136,22,62,0,232,243,8,114,7,181,34,232,236,8,115,9,190,
        174,228,185,3,0,232,42,1,176,12,186,242,3,238,199,6,26,0,30,0,199,6,28,0,30,0,189,177,228,190,0,0,46,139,86,0,176,170,238,
        42,192,236,60,170,117,6,137,148,8,0,70,70,69,69,129,253,183,228,117,228,187,0,0,186,250,3,236,168,248,117,8,199,135,0,0,248,
        3,67,67,186,250,2,236,168,248,117,8,199,135,0,0,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,168,15,117,
        5,128,14,17,0,16,176,128,230,160,128,62,18,0,1,116,6,186,1,0,232,16,0,233,207,0,128,62,18,0,1,117,3,233,46,250,233,118,255,
        156,250,30,184,64,0,142,216,10,246,116,24,179,6,232,37,0,226,254,254,206,117,245,128,62,18,0,1,117,6,176,205,230,97,235,232,
        179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,51,5,230,66,138,196,230,66,228,97,138,
        224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,12,230,97,185,86,41,226,254,176,204,230,97,176,76,230,
        97,176,253,230,33,251,180,0,43,201,246,196,255,117,2,226,249,228,96,138,216,176,204,230,97,195,251,81,80,228,97,36,191,230,
        97,43,201,226,254,12,64,230,97,176,32,230,32,88,89,207,184,64,0,142,216,128,62,18,0,1,117,5,182,1,233,85,255,46,138,4,70,
        183,0,180,14,205,16,226,244,184,13,14,205,16,184,10,14,205,16,195,251,184,64,0,142,216,161,16,0,168,1,116,35,185,4,0,81,180,
        0,205,19,114,20,180,2,187,0,0,142,195,187,0,124,186,0,0,185,1,0,176,1,205,19,89,115,4,226,224,205,24,234,0,124,0,0,23,4,0,
        3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,139,242,209,230,186,64,0,142,218,139,148,0,0,11,210,116,22,10,228,116,
        24,254,204,116,78,254,204,117,3,233,137,0,254,204,117,3,233,185,0,89,95,94,90,31,207,138,224,131,194,3,176,128,238,138,212,
        208,194,208,194,208,194,208,194,129,226,14,0,191,41,231,3,250,139,148,0,0,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,
        196,36,31,238,131,234,2,176,0,238,235,121,80,131,194,4,176,3,238,51,201,131,194,2,236,168,32,117,8,226,249,88,128,204,80,
        235,167,43,201,236,168,16,117,8,226,249,88,128,204,128,235,152,74,43,201,236,168,32,117,8,226,249,88,128,204,128,235,136,
        131,234,5,89,138,193,238,233,126,255,128,38,113,0,127,131,194,4,176,1,238,131,194,2,43,201,236,168,32,117,7,226,249,180,128,
        233,98,255,74,236,168,1,117,9,246,6,113,0,128,116,244,235,236,36,30,138,224,139,148,0,0,236,233,71,255,139,148,0,0,131,194,
        5,236,138,224,66,236,233,56,255,251,30,83,187,64,0,142,219,10,228,116,11,254,204,116,32,254,204,116,45,91,31,207,251,144,
        250,139,30,26,0,59,30,28,0,116,243,139,7,232,30,0,137,30,26,0,91,31,207,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,
        0,160,23,0,91,31,207,131,195,2,129,251,62,0,117,3,187,30,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,
        255,255,30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,
        28,26,24,3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,
        255,117,255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,
        115,100,102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,
        38,42,40,41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,
        86,66,78,77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,
        53,54,43,49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,251,80,83,81,82,86,87,30,6,252,184,64,0,142,216,228,96,
        80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,117,2,36,127,14,7,191,130,232,185,8,0,242,174,
        138,196,116,3,233,136,0,129,239,131,232,46,138,165,138,232,168,128,117,84,128,252,16,115,7,8,38,23,0,233,131,0,246,6,23,0,
        4,117,104,60,82,117,37,246,6,23,0,8,116,3,235,91,144,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,216,1,246,6,23,
        0,3,116,243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,185,1,128,252,16,115,26,246,212,32,38,23,0,
        60,184,117,44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,163,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,
        60,69,116,5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,143,0,246,6,23,0,4,116,49,
        60,83,117,45,199,6,114,0,52,18,233,209,245,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,
        36,37,38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,37,1,191,138,234,185,10,0,242,174,117,18,129,239,139,234,160,25,0,180,
        10,246,228,3,199,162,25,0,235,139,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,248,0,60,2,114,12,60,14,115,8,128,196,118,
        176,0,233,232,0,60,59,115,3,233,99,255,60,71,115,249,187,99,233,233,37,1,246,6,23,0,4,116,91,60,70,117,24,187,30,0,137,30,
        26,0,137,30,28,0,198,6,113,0,128,205,27,184,0,0,233,180,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,
        216,3,160,101,0,238,246,6,24,0,8,117,249,233,22,255,60,55,117,6,184,0,114,233,133,0,187,146,232,60,59,115,3,235,120,144,187,
        204,232,233,195,0,60,71,115,45,246,6,23,0,3,116,91,60,15,117,6,184,0,15,235,97,144,60,55,117,9,176,32,230,32,205,5,233,218,
        254,60,59,114,6,187,89,233,233,151,0,187,31,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,
        44,71,187,122,233,235,119,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,109,233,235,11,60,59,114,4,176,
        0,235,7,187,229,232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,
        60,90,119,17,4,32,235,13,233,92,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,96,252,59,30,26,0,116,9,137,4,
        137,30,28,0,233,58,254,232,13,0,233,52,254,44,59,46,215,138,224,176,0,235,168,80,83,81,187,192,0,228,97,80,36,252,230,97,
        185,72,0,226,254,12,2,230,97,185,72,0,226,254,75,117,235,88,230,97,89,91,88,195,251,83,81,30,86,87,85,82,139,236,190,64,0,
        142,222,232,28,0,187,4,0,232,255,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,
        127,10,228,116,39,254,204,116,116,198,6,65,0,0,128,250,4,115,19,254,204,116,106,254,204,117,3,233,150,0,254,204,116,104,254,
        204,116,104,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,
        254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,40,2,160,66,0,60,192,116,7,128,14,65,0,32,235,17,180,3,232,71,
        1,187,1,0,232,109,1,187,3,0,232,103,1,195,160,65,0,195,176,70,232,185,1,180,102,235,54,176,66,235,245,128,14,63,0,128,176,
        74,232,167,1,180,77,235,36,187,7,0,232,65,1,187,9,0,232,59,1,187,15,0,232,53,1,187,17,0,233,171,0,128,14,63,0,128,176,74,
        232,129,1,180,69,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,
        0,240,8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,224,0,10,228,116,8,
        43,201,226,254,254,204,235,246,251,89,232,224,0,88,138,252,182,0,114,75,190,243,237,144,86,232,148,0,138,102,1,208,228,208,
        228,128,228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,
        0,232,147,0,187,9,0,232,141,0,187,11,0,232,135,0,187,13,0,232,129,0,94,232,64,1,114,69,232,115,1,114,63,252,190,66,0,172,
        36,192,116,59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,
        4,114,14,208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,119,1,195,232,46,1,195,232,111,1,50,228,195,82,81,186,
        244,3,51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,
        186,245,3,238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,196,195,176,1,81,138,202,210,192,89,132,6,62,
        0,117,19,8,6,62,0,180,7,232,172,255,138,226,232,167,255,232,114,0,114,41,180,15,232,157,255,138,226,232,152,255,138,229,232,
        147,255,232,94,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,230,12,230,11,140,
        192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,232,
        80,187,6,0,232,117,255,138,204,88,211,224,72,80,230,5,138,196,230,5,89,88,3,193,89,176,2,230,10,195,232,30,0,114,20,180,8,
        232,40,255,232,76,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,6,62,0,128,
        117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,184,64,0,142,216,128,14,62,
        0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,249,
        91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,202,
        235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,176,254,138,196,254,192,42,193,195,207,2,37,2,8,42,255,80,
        246,25,4,251,30,82,86,81,83,190,64,0,142,222,139,242,209,230,139,148,8,0,11,210,116,12,10,228,116,14,254,204,116,66,254,204,
        116,42,91,89,94,90,31,207,80,179,10,51,201,238,66,236,138,224,168,128,117,14,226,247,254,203,117,243,128,204,1,128,228,249,
        235,20,176,13,66,238,176,12,238,88,80,139,148,8,0,66,236,138,224,128,228,248,90,138,194,128,244,72,235,194,80,131,194,2,176,
        8,238,184,232,3,72,117,253,176,12,238,235,219,252,240,207,241,240,241,26,242,169,247,48,242,156,242,65,243,125,243,195,243,
        246,243,84,242,56,244,39,244,34,247,122,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,224,139,240,61,32,0,114,4,88,
        233,71,1,184,64,0,142,216,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,3,184,0,176,142,192,88,138,38,73,0,46,255,164,
        69,240,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,45,10,127,6,100,112,2,1,6,7,0,
        0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,44,40,45,41,42,46,30,41,186,212,
        3,179,0,131,255,48,117,7,176,7,186,180,3,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,194,4,138,195,238,90,43,192,142,
        216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,3,217,80,50,228,138,196,238,66,
        254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,12,128,252,7,116,4,51,192,235,
        6,185,0,8,184,32,7,243,171,199,6,96,0,103,0,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,132,244,240,238,162,101,
        0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,30,7,51,192,243,171,66,
        176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,235,237,139,22,99,0,138,
        196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,148,80,0,56,62,98,0,117,
        5,139,194,232,2,0,235,190,232,127,0,139,200,3,14,78,0,209,249,180,14,232,193,255,195,138,223,50,255,209,227,139,151,80,0,
        139,14,96,0,95,94,91,88,88,31,7,207,162,98,0,139,14,76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,147,255,91,209,
        227,139,135,80,0,232,184,255,233,115,255,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,238,162,102,
        0,233,87,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,63,255,83,139,216,138,196,
        246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,243,1,83,139,193,232,57,0,116,51,3,240,
        138,230,42,227,232,117,0,3,245,3,253,254,204,117,245,88,176,32,232,112,0,3,253,254,203,117,247,184,64,0,142,216,128,62,73,
        0,7,116,7,160,101,0,186,216,3,238,233,225,254,138,222,235,218,128,62,73,0,2,114,25,128,62,73,0,3,119,18,82,186,218,3,80,236,
        168,8,116,251,176,37,186,216,3,238,88,90,232,126,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,74,0,3,
        237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,216,128,
        252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,147,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,254,204,
        117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,87,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,169,2,
        232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,32,254,138,207,50,237,139,241,
        209,230,139,132,80,0,51,219,227,6,3,30,76,0,226,250,232,203,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,177,1,138,227,
        80,81,232,208,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,233,
        209,253,128,252,4,114,8,128,252,7,116,3,233,126,1,80,81,232,159,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,
        250,236,168,1,116,251,138,195,170,71,226,232,233,160,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,143,253,80,
        80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,112,253,50,193,235,245,83,
        80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,6,187,128,
        1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,193,232,106,
        2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,116,45,138,195,
        180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,232,136,0,129,
        239,176,31,254,203,117,245,233,212,252,138,222,235,236,253,138,216,139,194,232,16,2,139,248,43,209,129,194,1,1,208,230,208,
        230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,246,228,139,247,
        43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,254,203,117,245,
        252,233,116,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,95,94,195,138,
        202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,133,1,139,248,88,60,128,115,6,190,110,250,14,235,15,
        44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,86,182,4,172,
        246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,244,251,38,50,5,170,172,38,50,
        133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,50,69,1,38,136,
        37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,133,1,32,131,
        199,80,254,206,117,193,94,95,131,199,2,226,182,233,148,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,114,26,
        182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,198,0,
        32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,185,8,0,243,
        166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,128,235,210,
        131,196,8,233,16,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,186,0,0,185,1,0,
        139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,185,0,192,
        178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,74,0,209,224,
        209,224,42,255,3,195,91,195,80,80,180,3,205,16,88,60,8,116,89,60,13,116,94,60,10,116,94,60,7,116,97,138,62,98,0,180,10,185,
        1,0,205,16,254,194,58,22,74,0,117,54,178,0,128,254,24,117,45,180,2,183,0,205,16,160,73,0,60,4,114,6,60,7,183,0,117,6,180,
        8,205,16,138,252,184,1,6,185,0,0,182,24,138,22,74,0,254,202,205,16,88,233,71,250,254,198,180,2,235,244,128,250,0,116,247,
        254,202,235,243,178,0,235,239,128,254,24,117,232,235,185,179,2,232,199,238,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,
        194,6,236,168,4,117,120,168,2,116,126,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,138,229,
        138,30,73,0,42,255,46,138,159,161,247,43,195,43,6,78,0,121,3,184,0,0,177,3,128,62,73,0,4,114,42,128,62,73,0,7,116,35,178,
        40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,238,235,18,
        246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,90,95,94,31,31,31,31,
        7,207,251,30,184,64,0,142,216,161,19,0,31,207,251,30,184,64,0,142,216,161,16,0,31,207,251,30,80,184,64,0,142,216,128,38,113,
        0,127,88,232,4,0,31,202,2,0,10,228,116,19,254,204,116,24,254,204,116,26,254,204,117,3,233,39,1,180,128,249,195,228,97,36,
        247,230,97,42,228,195,228,97,12,8,235,245,83,81,86,190,7,0,232,194,1,228,98,36,16,162,107,0,186,122,63,246,6,113,0,128,116,
        3,233,138,0,74,117,3,233,132,0,232,198,0,227,235,186,120,3,185,0,2,228,33,12,1,230,33,246,6,113,0,128,117,108,81,232,173,
        0,11,201,89,116,197,59,211,227,4,115,191,226,232,114,230,232,155,0,232,106,0,60,22,117,73,94,89,91,81,199,6,105,0,255,255,
        186,0,1,246,6,113,0,128,117,35,232,79,0,114,30,227,5,38,136,7,67,73,74,127,234,232,64,0,232,61,0,42,228,129,62,105,0,15,29,
        117,6,227,6,235,205,180,1,254,196,90,43,209,80,246,196,3,117,19,232,31,0,235,14,78,116,3,233,98,255,94,89,91,43,210,180,4,
        80,228,33,36,254,230,33,232,66,255,88,128,252,1,245,195,83,81,177,8,81,232,38,0,227,32,83,232,32,0,88,227,25,3,216,129,251,
        240,6,245,159,89,208,213,158,232,217,0,254,201,117,224,138,197,248,89,91,195,89,249,235,249,185,100,0,138,38,107,0,228,98,
        36,16,58,196,225,248,162,107,0,176,0,230,67,228,64,138,224,228,64,134,196,139,30,103,0,43,216,163,103,0,195,83,81,228,97,
        36,253,12,1,230,97,176,182,230,67,232,166,0,184,160,4,232,133,0,185,0,8,249,232,104,0,226,250,248,232,98,0,89,91,176,22,232,
        68,0,199,6,105,0,255,255,186,0,1,38,138,7,232,53,0,227,2,67,73,74,127,243,161,105,0,247,208,80,134,224,232,35,0,88,232,31,
        0,11,201,117,215,81,185,32,0,249,232,42,0,226,250,89,176,176,230,67,184,1,0,232,51,0,232,122,254,43,192,195,81,80,138,232,
        177,8,208,213,156,232,11,0,157,232,36,0,254,201,117,242,88,89,195,184,160,4,114,3,184,80,2,80,228,98,36,32,116,250,228,98,
        36,32,117,250,88,230,66,138,196,230,66,195,161,105,0,209,216,209,208,248,113,4,53,16,8,249,209,208,163,105,0,195,232,35,254,
        179,66,185,0,7,226,254,254,203,117,247,195,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,
        108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,8,56,124,56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,
        60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,
        120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224,
        248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,
        0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,
        24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0,
        0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124,
        192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,
        24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,
        24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204,
        120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,
        204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252,
        0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252,
        102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,
        120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120,
        0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56,
        108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,
        112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254,
        238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192,
        96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,
        118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,
        240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120,
        224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204,
        204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,
        48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,
        204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,
        0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,80,184,64,0,142,216,88,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0,
        198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,0,137,14,110,0,198,6,112,0,0,235,218,251,30,80,82,184,64,0,
        142,216,255,6,108,0,117,4,255,6,110,0,131,62,110,0,24,117,25,129,62,108,0,176,0,117,17,199,6,110,0,0,0,199,6,108,0,0,0,198,
        6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,242,3,238,205,28,176,32,230,32,90,88,31,207,165,254,0,240,135,233,
        0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,239,0,240,0,0,0,0,101,240,0,240,77,248,0,240,65,248,0,240,89,236,0,240,57,231,0,
        240,89,248,0,240,46,232,0,240,210,239,0,240,0,0,0,246,242,230,0,240,110,254,0,240,83,255,0,240,83,255,0,240,164,240,0,240,
        199,239,0,240,0,0,0,0,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,205,16,138,204,181,25,
        232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,205,23,90,246,196,37,
        117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,6,0,0,0,235,10,90,
        180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,234,91,224,0,240,48,52,47,50,52,47,56,49,255,255,235] 
        
      • 1982-11-08.json
        [49,53,48,49,53,49,50,32,67,79,80,82,46,32,73,66,77,32,49,57,56,49,215,224,126,225,32,75,66,32,79,75,13,232,19,26,138,251,
        232,14,26,138,235,138,207,252,250,191,0,5,176,253,230,33,176,10,230,32,186,97,0,187,204,76,180,2,138,195,238,138,199,238,
        74,228,32,34,196,116,250,236,170,66,226,238,234,0,5,0,0,255,255,250,180,213,158,115,76,117,74,123,72,121,70,159,177,5,210,
        236,115,63,176,64,208,224,113,57,50,228,158,118,52,120,50,122,48,159,177,5,210,236,114,41,208,228,112,37,184,255,255,249,
        142,216,140,219,142,195,140,193,142,209,140,210,139,226,139,236,139,245,139,254,115,7,51,199,117,7,248,235,227,11,199,116,
        1,244,230,160,230,131,186,216,3,238,254,192,178,184,238,176,137,230,99,176,165,230,97,176,1,230,96,140,200,142,208,142,216,
        252,187,0,224,188,22,224,233,27,24,117,212,176,2,230,96,176,4,230,8,176,84,230,67,138,193,230,65,176,64,230,67,128,251,255,
        116,7,228,65,10,216,226,241,244,138,195,43,201,230,65,176,64,230,67,144,144,228,65,34,216,116,3,226,242,244,176,3,230,96,
        230,13,176,255,138,216,138,248,185,8,0,186,0,0,238,80,238,176,1,236,138,224,236,59,216,116,1,244,66,226,239,254,192,116,225,
        142,219,142,195,176,255,230,1,80,230,1,176,88,230,11,176,0,138,232,230,8,80,230,10,176,18,230,65,176,65,230,11,80,228,8,36,
        16,116,1,244,176,66,230,11,176,67,230,11,186,19,2,176,1,238,139,30,114,4,185,0,32,129,251,52,18,116,22,188,24,224,233,241,
        4,116,18,138,216,176,4,230,96,43,201,226,254,134,216,235,246,43,192,243,171,137,30,114,4,186,0,4,187,16,0,142,194,43,255,
        184,85,170,139,200,38,137,5,176,15,38,139,5,51,193,117,17,185,0,32,243,171,129,194,0,4,131,195,16,128,254,160,117,218,137,
        30,19,4,184,48,0,142,208,188,0,1,176,19,230,32,176,8,230,33,176,9,230,33,176,255,230,33,30,185,32,0,43,255,142,199,184,35,
        255,171,140,200,171,226,247,191,64,0,14,31,140,216,190,3,255,144,185,16,0,165,71,71,226,251,31,30,228,98,36,15,138,224,176,
        173,230,97,144,228,98,177,4,210,192,36,240,10,196,42,228,163,16,4,176,153,230,99,232,5,24,128,251,170,116,24,128,251,101,
        117,3,233,239,253,176,56,230,97,144,144,228,96,36,255,117,4,254,6,18,4,161,16,4,80,176,48,163,16,4,42,228,205,16,176,32,163,
        16,4,42,228,205,16,88,163,16,4,36,48,117,10,191,64,0,199,5,75,255,233,160,0,60,48,116,8,254,196,60,32,117,2,180,3,134,224,
        80,42,228,205,16,88,80,187,0,176,186,184,3,185,0,8,176,1,128,252,48,116,9,183,184,186,216,3,181,32,254,200,238,129,62,114,
        4,52,18,142,195,116,7,142,219,232,199,3,117,70,88,80,180,0,205,16,184,32,112,235,17,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,233,153,21,43,255,185,40,0,243,171,88,80,128,252,48,186,186,3,116,3,186,218,3,180,8,43,201,236,34,196,117,
        4,226,249,235,9,43,201,236,34,196,116,17,226,249,31,30,198,6,21,0,6,186,2,1,232,219,22,235,6,177,3,210,236,117,215,88,180,
        0,205,16,186,0,192,142,218,43,219,139,7,83,91,61,85,170,117,5,232,54,22,235,4,129,194,128,0,129,250,0,200,124,228,31,198,
        6,21,4,5,176,0,230,33,228,33,10,192,117,27,176,255,230,33,228,33,4,1,117,17,162,107,4,251,43,201,226,254,226,254,128,62,107,
        4,0,116,9,190,255,248,144,232,78,22,250,244,198,6,21,4,2,176,254,230,33,176,16,230,67,185,22,0,138,193,230,64,246,6,107,4,
        1,117,4,226,247,235,216,177,12,176,255,230,64,198,6,107,4,0,176,254,230,33,246,6,107,4,1,117,194,226,247,176,255,230,33,176,
        54,230,67,176,0,230,64,230,64,176,153,230,99,160,16,4,36,1,116,49,128,62,18,4,1,116,42,232,115,22,227,30,176,73,230,97,128,
        251,170,117,21,176,200,230,97,176,72,230,97,43,201,226,254,228,96,60,0,116,10,232,180,21,190,76,236,144,232,203,21,30,43,
        192,142,192,185,8,0,14,31,190,243,254,144,191,32,0,165,71,71,226,251,31,199,6,8,0,95,248,199,6,20,0,84,255,199,6,98,0,0,246,
        128,62,18,4,1,117,10,199,6,112,0,60,249,176,254,230,33,186,16,2,184,85,85,238,176,1,236,58,196,117,68,247,208,238,176,1,236,
        58,196,117,58,187,1,0,186,21,2,185,16,0,46,136,7,144,236,58,199,117,33,66,236,58,195,117,27,74,209,227,226,236,185,8,0,176,
        1,74,138,224,238,176,1,236,58,196,117,6,208,224,226,242,235,7,190,15,249,144,232,63,21,232,236,21,30,129,62,114,0,52,18,117,
        3,233,159,0,184,16,0,235,40,139,30,19,0,131,235,16,177,4,211,235,139,203,187,0,4,142,219,142,195,129,195,0,4,82,81,83,80,
        185,0,32,232,207,1,117,76,88,5,16,0,80,187,10,0,185,3,0,51,210,247,243,128,202,48,82,226,246,185,3,0,88,232,222,20,226,250,
        185,7,0,190,26,224,46,138,4,70,232,207,20,226,247,88,61,16,0,116,169,91,89,90,226,180,176,10,232,189,20,228,8,36,1,117,51,
        31,198,6,21,0,3,233,102,254,138,232,176,13,232,167,20,176,10,232,162,20,88,131,196,6,140,218,31,30,163,19,0,136,54,21,0,232,
        206,26,138,197,232,122,20,190,4,249,144,232,145,20,186,0,200,142,218,43,219,139,7,83,91,61,85,170,117,6,232,40,20,235,5,144,
        129,194,128,0,129,250,0,246,124,227,235,1,144,180,4,43,219,142,218,232,174,19,116,3,232,130,1,129,194,0,2,254,204,117,236,
        31,160,16,0,36,1,116,62,228,33,36,191,230,33,180,0,138,212,205,19,246,196,255,117,32,186,242,3,176,28,238,43,201,226,254,
        226,254,51,210,181,1,136,22,62,0,232,252,8,114,7,181,34,232,245,8,115,7,190,82,236,144,232,24,20,176,12,186,242,3,238,198,
        6,107,0,0,190,30,0,137,54,26,0,137,54,28,0,137,54,128,0,131,198,32,137,54,130,0,191,120,0,30,7,184,20,20,171,171,184,1,1,
        171,171,228,33,36,252,230,33,131,253,0,116,25,186,2,0,232,6,20,190,9,232,144,232,241,19,180,0,205,22,128,252,59,117,247,235,
        14,144,128,62,18,0,1,116,6,186,1,0,232,230,19,160,16,0,36,1,117,3,233,95,250,42,228,160,73,0,205,16,189,163,249,144,190,0,
        0,46,139,86,0,176,170,238,30,236,31,60,170,117,5,137,84,8,70,70,69,69,129,253,169,249,117,229,187,0,0,186,250,3,236,168,248,
        117,6,199,7,248,3,67,67,186,250,2,236,168,248,117,6,199,7,248,2,67,67,139,198,177,3,210,200,10,195,162,17,0,186,1,2,236,144,
        144,144,168,15,117,5,128,14,17,0,16,228,97,12,48,230,97,36,207,230,97,176,128,230,160,205,25,252,43,255,43,192,136,5,138,
        5,50,196,117,77,254,196,138,196,117,242,139,217,209,227,184,170,170,186,85,255,243,171,228,97,12,48,230,97,144,36,207,230,
        97,79,253,139,247,139,203,172,50,196,117,37,138,194,170,226,246,34,228,116,22,138,224,134,242,34,228,117,4,138,212,235,224,
        252,71,116,222,79,186,1,0,235,214,228,98,36,192,176,0,252,195,82,80,140,218,38,136,54,21,0,129,250,0,200,124,13,232,253,24,
        190,10,249,144,232,197,18,88,90,195,186,2,1,232,235,18,235,245,255,255,255,251,43,192,142,216,199,6,120,0,199,239,140,14,
        122,0,185,4,0,81,180,0,205,19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,4,226,229,205,24,234,0,124,0,
        0,255,255,255,23,4,0,3,128,1,192,0,96,0,48,0,24,0,12,0,251,30,82,86,87,81,83,139,242,139,250,209,230,232,16,19,139,20,11,
        210,116,19,10,228,116,22,254,204,116,69,254,204,116,106,254,204,117,3,233,131,0,91,89,95,94,90,31,207,138,224,131,194,3,176,
        128,238,138,212,177,4,210,194,129,226,14,0,191,41,231,3,250,139,20,66,46,138,69,1,238,74,46,138,5,238,131,194,3,138,196,36,
        31,238,74,74,176,0,238,235,73,80,131,194,4,176,3,238,66,66,183,48,232,72,0,116,8,89,138,193,128,204,128,235,174,74,183,32,
        232,56,0,117,240,131,234,5,89,138,193,238,235,157,131,194,4,176,1,238,66,66,183,32,232,32,0,117,219,74,183,1,232,24,0,117,
        211,128,228,30,139,20,236,233,125,255,139,20,131,194,5,236,138,224,66,236,233,112,255,138,93,124,43,201,236,138,224,34,199,
        58,199,116,8,226,245,254,203,117,239,10,255,195,69,82,82,79,82,46,32,40,82,69,83,85,77,69,32,61,32,34,70,49,34,32,75,69,89,
        41,13,10,255,255,255,255,255,255,255,255,255,251,30,83,232,37,18,10,228,116,10,254,204,116,30,254,204,116,43,235,44,251,144,
        250,139,30,26,0,59,30,28,0,116,243,139,7,232,29,0,137,30,26,0,235,20,250,139,30,26,0,59,30,28,0,139,7,251,91,31,202,2,0,160,
        23,0,91,31,207,67,67,59,30,130,0,117,4,139,30,128,0,195,82,58,69,70,56,29,42,54,128,64,32,16,8,4,2,1,27,255,0,255,255,255,
        30,255,255,255,255,31,255,127,255,17,23,5,18,20,25,21,9,15,16,27,29,10,255,1,19,4,6,7,8,10,11,12,255,255,255,255,28,26,24,
        3,22,2,14,13,255,255,255,255,255,255,32,255,94,95,96,97,98,99,100,101,102,103,255,255,119,255,132,255,115,255,116,255,117,
        255,118,255,255,27,49,50,51,52,53,54,55,56,57,48,45,61,8,9,113,119,101,114,116,121,117,105,111,112,91,93,13,255,97,115,100,
        102,103,104,106,107,108,59,39,96,255,92,122,120,99,118,98,110,109,44,46,47,255,42,255,32,255,27,33,64,35,36,37,94,38,42,40,
        41,95,43,8,0,81,87,69,82,84,89,85,73,79,80,123,125,13,255,65,83,68,70,71,72,74,75,76,58,34,126,255,124,90,88,67,86,66,78,
        77,60,62,63,255,0,255,32,255,84,85,86,87,88,89,90,91,92,93,104,105,106,107,108,109,110,111,112,113,55,56,57,45,52,53,54,43,
        49,50,51,48,46,71,72,73,255,75,255,77,255,79,80,81,82,83,255,255,255,255,251,80,83,81,82,86,87,30,6,252,232,197,16,228,96,
        80,228,97,138,224,12,128,230,97,134,224,230,97,88,138,224,60,255,117,3,233,122,2,36,127,14,7,191,126,232,185,8,0,242,174,
        138,196,116,3,233,133,0,129,239,127,232,46,138,165,134,232,168,128,117,81,128,252,16,115,7,8,38,23,0,233,128,0,246,6,23,0,
        4,117,101,60,82,117,34,246,6,23,0,8,117,90,246,6,23,0,32,117,13,246,6,23,0,3,116,13,184,48,82,233,214,1,246,6,23,0,3,116,
        243,132,38,24,0,117,77,8,38,24,0,48,38,23,0,60,82,117,65,184,0,82,233,183,1,128,252,16,115,26,246,212,32,38,23,0,60,184,117,
        44,160,25,0,180,0,136,38,25,0,60,0,116,31,233,161,1,246,212,32,38,24,0,235,20,60,128,115,16,246,6,24,0,8,116,23,60,69,116,
        5,128,38,24,0,247,250,176,32,230,32,7,31,95,94,90,89,91,88,207,246,6,23,0,8,117,3,233,145,0,246,6,23,0,4,116,51,60,83,117,
        47,199,6,114,0,52,18,234,91,224,0,240,82,79,80,81,75,76,77,71,72,73,16,17,18,19,20,21,22,23,24,25,30,31,32,33,34,35,36,37,
        38,44,45,46,47,48,49,50,60,57,117,5,176,32,233,33,1,191,135,234,185,10,0,242,174,117,18,129,239,136,234,160,25,0,180,10,246,
        228,3,199,162,25,0,235,137,198,6,25,0,0,185,26,0,242,174,117,5,176,0,233,244,0,60,2,114,12,60,14,115,8,128,196,118,176,0,
        233,228,0,60,59,115,3,233,97,255,60,71,115,249,187,95,233,233,27,1,246,6,23,0,4,116,88,60,70,117,24,139,30,128,0,137,30,26,
        0,137,30,28,0,198,6,113,0,128,205,27,43,192,233,176,0,60,69,117,33,128,14,24,0,8,176,32,230,32,128,62,73,0,7,116,7,186,216,
        3,160,101,0,238,246,6,24,0,8,117,249,233,20,255,60,55,117,6,184,0,114,233,129,0,187,142,232,60,59,114,118,187,200,232,233,
        188,0,60,71,115,44,246,6,23,0,3,116,90,60,15,117,5,184,0,15,235,96,60,55,117,9,176,32,230,32,205,5,233,220,254,60,59,114,
        6,187,85,233,233,145,0,187,27,233,235,64,246,6,23,0,32,117,32,246,6,23,0,3,117,32,60,74,116,11,60,78,116,12,44,71,187,118,
        233,235,113,184,45,74,235,34,184,43,78,235,29,246,6,23,0,3,117,224,44,70,187,105,233,235,11,60,59,114,4,176,0,235,7,187,225,
        232,254,200,46,215,60,255,116,31,128,252,255,116,26,246,6,23,0,64,116,32,246,6,23,0,3,116,15,60,65,114,21,60,90,119,17,4,
        32,235,13,233,94,254,60,97,114,6,60,122,119,2,44,32,139,30,28,0,139,243,232,99,252,59,30,26,0,116,19,137,4,137,30,28,0,233,
        60,254,44,59,46,215,138,224,176,0,235,174,176,32,230,32,187,128,0,228,97,80,36,252,230,97,185,72,0,226,254,12,2,230,97,185,
        72,0,226,254,75,117,235,88,230,97,233,18,254,32,51,48,49,13,10,54,48,49,13,10,255,255,251,83,81,30,86,87,85,82,139,236,232,
        243,13,232,28,0,187,4,0,232,253,1,136,38,64,0,138,38,65,0,128,252,1,245,90,93,95,94,31,89,91,202,2,0,138,240,128,38,63,0,
        127,10,228,116,39,254,204,116,115,198,6,65,0,0,128,250,4,115,19,254,204,116,105,254,204,117,3,233,149,0,254,204,116,103,254,
        204,116,103,198,6,65,0,1,195,186,242,3,250,160,63,0,177,4,210,224,168,32,117,12,168,64,117,6,168,128,116,6,254,192,254,192,
        254,192,12,8,238,198,6,62,0,0,198,6,65,0,0,12,4,238,251,232,42,2,160,66,0,60,192,116,6,128,14,65,0,32,195,180,3,232,71,1,
        187,1,0,232,108,1,187,3,0,232,102,1,195,160,65,0,195,176,70,232,184,1,180,230,235,54,176,66,235,245,128,14,63,0,128,176,74,
        232,166,1,180,77,235,36,187,7,0,232,64,1,187,9,0,232,58,1,187,15,0,232,52,1,187,17,0,233,171,0,128,14,63,0,128,176,74,232,
        128,1,180,197,115,8,198,6,65,0,9,176,0,195,80,81,138,202,176,1,210,224,250,198,6,64,0,255,132,6,63,0,117,49,128,38,63,0,240,
        8,6,63,0,251,176,16,210,224,10,194,12,12,82,186,242,3,238,90,246,6,63,0,128,116,18,187,20,0,232,223,0,10,228,116,8,43,201,
        226,254,254,204,235,246,251,89,232,223,0,88,138,252,182,0,114,75,190,240,237,144,86,232,148,0,138,102,1,208,228,208,228,128,
        228,4,10,226,232,133,0,128,255,77,117,3,233,98,255,138,229,232,120,0,138,102,1,232,114,0,138,225,232,109,0,187,7,0,232,146,
        0,187,9,0,232,140,0,187,11,0,232,134,0,187,13,0,232,128,0,94,232,67,1,114,69,232,116,1,114,63,252,190,66,0,172,36,192,116,
        59,60,64,117,41,172,208,224,180,4,114,36,208,224,208,224,180,16,114,28,208,224,180,8,114,22,208,224,208,224,180,4,114,14,
        208,224,180,3,114,8,208,224,180,2,114,2,180,32,8,38,65,0,232,120,1,195,232,47,1,195,232,112,1,50,228,195,82,81,186,244,3,
        51,201,236,168,64,116,12,226,249,128,14,65,0,128,89,90,88,249,195,51,201,236,168,128,117,4,226,249,235,235,138,196,178,245,
        238,89,90,195,30,43,192,142,216,197,54,120,0,209,235,138,32,31,114,197,195,176,1,81,138,202,210,192,89,132,6,62,0,117,19,
        8,6,62,0,180,7,232,173,255,138,226,232,168,255,232,118,0,114,41,180,15,232,158,255,138,226,232,153,255,138,229,232,148,255,
        232,98,0,156,187,18,0,232,181,255,81,185,38,2,10,228,116,6,226,254,254,204,235,243,89,157,195,81,250,230,12,80,88,230,11,
        140,192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,4,138,196,230,4,138,197,36,15,230,129,138,230,42,192,209,
        232,80,187,6,0,232,114,255,138,204,88,211,224,72,80,230,5,138,196,230,5,251,89,88,3,193,89,176,2,230,10,195,232,30,0,114,
        20,180,8,232,37,255,232,74,0,114,10,160,66,0,36,96,60,96,116,2,248,195,128,14,65,0,64,249,195,251,83,81,179,2,51,201,246,
        6,62,0,128,117,12,226,247,254,203,117,243,128,14,65,0,128,249,156,128,38,62,0,127,157,89,91,195,251,30,80,232,252,10,128,
        14,62,0,128,176,32,230,32,88,31,207,252,191,66,0,81,82,83,179,7,51,201,186,244,3,236,168,128,117,12,226,249,128,14,65,0,128,
        249,91,90,89,195,236,168,64,117,7,128,14,65,0,32,235,239,66,236,136,5,71,185,10,0,226,254,74,236,168,16,116,6,254,203,117,
        202,235,227,91,90,89,195,160,69,0,58,197,160,71,0,116,10,187,8,0,232,174,254,138,196,254,192,42,193,195,255,255,207,2,37,
        2,8,42,255,80,246,25,4,251,30,82,86,81,83,232,126,10,139,242,138,92,120,209,230,139,84,8,11,210,116,12,10,228,116,14,254,
        204,116,63,254,204,116,40,91,89,94,90,31,207,80,238,66,43,201,236,138,224,168,128,117,14,226,247,254,203,117,241,128,204,
        1,128,228,249,235,19,176,13,66,238,176,12,238,88,80,139,84,8,66,236,138,224,128,228,248,90,138,194,128,244,72,235,197,80,
        66,66,176,8,238,184,232,3,72,117,253,176,12,238,235,221,255,255,255,255,252,240,205,241,238,241,57,242,156,247,23,242,150,
        242,56,243,116,243,185,243,236,243,78,242,47,244,30,244,24,247,116,242,251,252,6,30,82,81,83,86,87,80,138,196,50,228,209,
        224,139,240,61,32,0,114,4,88,233,69,1,232,214,9,184,0,184,139,62,16,0,129,231,48,0,131,255,48,117,2,180,176,142,192,88,138,
        38,73,0,46,255,164,69,240,255,255,255,56,40,45,10,31,6,25,28,2,7,6,7,0,0,0,0,113,80,90,10,31,6,25,28,2,7,6,7,0,0,0,0,56,40,
        45,10,127,6,100,112,2,1,6,7,0,0,0,0,97,80,82,15,25,6,25,25,2,13,11,12,0,0,0,0,0,8,0,16,0,64,0,64,40,40,80,80,40,40,80,80,
        44,40,45,41,42,46,30,41,186,212,3,179,0,131,255,48,117,6,176,7,178,180,254,195,138,224,162,73,0,137,22,99,0,30,80,82,131,
        194,4,138,195,238,90,43,192,142,216,197,30,116,0,88,185,16,0,128,252,2,114,16,3,217,128,252,4,114,9,3,217,128,252,7,114,2,
        3,217,80,50,228,138,196,238,66,254,196,138,7,238,67,74,226,243,88,31,51,255,137,62,78,0,198,6,98,0,0,185,0,32,128,252,4,114,
        11,128,252,7,116,4,51,192,235,5,181,8,184,32,7,243,171,199,6,96,0,7,6,160,73,0,50,228,139,240,139,22,99,0,131,194,4,46,138,
        132,244,240,238,162,101,0,46,138,132,236,240,50,228,163,74,0,129,230,14,0,46,139,140,228,240,137,14,76,0,185,8,0,191,80,0,
        30,7,51,192,243,171,66,176,48,128,62,73,0,6,117,2,176,63,238,162,102,0,95,94,91,89,90,31,7,207,180,10,137,14,96,0,232,2,0,
        235,237,139,22,99,0,138,196,238,66,138,197,238,74,138,196,254,192,238,66,138,193,238,195,138,207,50,237,209,225,139,241,137,
        84,80,56,62,98,0,117,5,139,194,232,2,0,235,191,232,124,0,139,200,3,14,78,0,209,249,180,14,232,194,255,195,162,98,0,139,14,
        76,0,152,80,247,225,163,78,0,139,200,209,249,180,12,232,170,255,91,209,227,139,71,80,232,207,255,235,140,138,223,50,255,209,
        227,139,87,80,139,14,96,0,95,94,91,88,88,31,7,207,139,22,99,0,131,194,5,160,102,0,10,255,117,14,36,224,128,227,31,10,195,
        238,162,102,0,233,91,255,36,223,208,235,115,243,12,32,235,239,138,38,74,0,160,73,0,138,62,98,0,95,94,89,233,67,255,83,139,
        216,138,196,246,38,74,0,50,255,3,195,209,224,91,195,138,216,128,252,4,114,8,128,252,7,116,3,233,240,1,83,139,193,232,55,0,
        116,49,3,240,138,230,42,227,232,114,0,3,245,3,253,254,204,117,245,88,176,32,232,109,0,3,253,254,203,117,247,232,140,7,128,
        62,73,0,7,116,7,160,101,0,186,216,3,238,233,231,254,138,222,235,220,128,62,73,0,2,114,24,128,62,73,0,3,119,17,82,186,218,
        3,80,236,168,8,116,251,176,37,178,216,238,88,90,232,129,255,3,6,78,0,139,248,139,240,43,209,254,198,254,194,50,237,139,46,
        74,0,3,237,138,195,246,38,74,0,3,192,6,31,128,251,0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,95,195,253,138,
        216,128,252,4,114,8,128,252,7,116,3,233,166,1,83,139,194,232,148,255,116,32,43,240,138,230,42,227,232,207,255,43,245,43,253,
        254,204,117,245,88,176,32,232,202,255,43,253,254,203,117,247,233,90,255,138,222,235,237,128,252,4,114,8,128,252,7,116,3,233,
        168,2,232,26,0,139,243,139,22,99,0,131,194,6,6,31,236,168,1,117,251,250,236,168,1,116,251,173,233,39,254,138,207,50,237,139,
        241,209,230,139,68,80,51,219,227,6,3,30,76,0,226,250,232,207,254,3,216,195,128,252,4,114,8,128,252,7,116,3,233,178,1,138,
        227,80,81,232,209,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,251,250,236,168,1,116,251,139,195,171,251,226,232,
        233,217,253,128,252,4,114,8,128,252,7,116,3,233,127,1,80,81,232,160,255,139,251,89,91,139,22,99,0,131,194,6,236,168,1,117,
        251,250,236,168,1,116,251,138,195,170,251,71,226,231,233,167,253,232,49,0,38,138,4,34,196,210,224,138,206,210,192,233,150,
        253,80,80,232,30,0,210,232,34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,193,38,136,4,88,233,119,253,50,193,235,
        245,83,80,176,40,82,128,226,254,246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,187,192,2,185,2,3,128,62,73,0,6,114,
        6,187,128,1,185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,205,254,207,117,248,138,227,210,236,91,195,138,216,139,
        193,232,105,2,139,248,43,209,129,194,1,1,208,230,208,230,128,62,73,0,6,115,4,208,226,209,231,6,31,42,237,208,227,208,227,
        116,45,138,195,180,80,246,228,139,247,3,240,138,230,42,227,232,128,0,129,238,176,31,129,239,176,31,254,204,117,241,138,199,
        232,136,0,129,239,176,31,254,203,117,245,233,219,252,138,222,235,236,253,138,216,139,194,232,15,2,139,248,43,209,129,194,
        1,1,208,230,208,230,128,62,73,0,6,115,5,208,226,209,231,71,6,31,42,237,129,199,240,0,208,227,208,227,116,46,138,195,180,80,
        246,228,139,247,43,240,138,230,42,227,232,33,0,129,238,80,32,129,239,80,32,254,204,117,241,138,199,232,41,0,129,239,80,32,
        254,203,117,245,252,233,123,252,138,222,235,235,138,202,86,87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,202,243,164,
        95,94,195,138,202,87,243,170,95,129,199,0,32,87,138,202,243,170,95,195,180,0,80,232,132,1,139,248,88,60,128,115,6,190,110,
        250,14,235,15,44,128,30,43,246,142,222,197,54,124,0,140,218,31,82,209,224,209,224,209,224,3,240,128,62,73,0,6,31,114,44,87,
        86,182,4,172,246,195,128,117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,94,95,71,226,227,233,251,251,38,50,5,
        170,172,38,50,133,255,31,235,224,138,211,209,231,232,209,0,87,86,182,4,172,232,222,0,35,195,246,194,128,116,7,38,50,37,38,
        50,69,1,38,136,37,38,136,69,1,172,232,197,0,35,195,246,194,128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,0,32,38,136,
        133,1,32,131,199,80,254,206,117,193,94,95,71,71,226,183,233,156,251,232,214,0,139,240,131,236,8,139,236,128,62,73,0,6,6,31,
        114,26,182,4,138,4,136,70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,117,235,235,23,144,209,230,182,4,232,136,0,129,
        198,0,32,232,129,0,129,238,176,31,254,206,117,238,191,110,250,144,14,7,131,237,8,139,245,252,176,0,22,31,186,128,0,86,87,
        185,8,0,243,166,95,94,116,30,254,192,131,199,8,74,117,237,60,0,116,18,43,192,142,216,196,62,124,0,140,192,11,199,116,4,176,
        128,235,210,131,196,8,233,23,251,128,227,3,138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,89,195,82,81,83,43,210,
        185,1,0,139,216,35,217,11,211,209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,91,89,90,195,138,36,138,68,1,
        185,0,192,178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,136,86,0,69,195,161,80,0,83,139,216,138,196,246,38,
        74,0,209,224,209,224,42,255,3,195,91,195,80,80,180,3,138,62,98,0,205,16,88,60,8,116,82,60,13,116,87,60,10,116,87,60,7,116,
        90,180,10,185,1,0,205,16,254,194,58,22,74,0,117,51,178,0,128,254,24,117,42,180,2,205,16,160,73,0,60,4,114,6,60,7,183,0,117,
        6,180,8,205,16,138,252,184,1,6,43,201,182,24,138,22,74,0,254,202,205,16,88,233,82,250,254,198,180,2,235,244,128,250,0,116,
        247,254,202,235,243,178,0,235,239,128,254,24,117,232,235,188,179,2,232,118,2,235,219,3,3,5,5,3,3,3,4,180,0,139,22,99,0,131,
        194,6,236,168,4,117,126,168,2,117,3,233,129,0,180,16,139,22,99,0,138,196,238,66,236,138,232,74,254,196,138,196,238,66,236,
        138,229,138,30,73,0,42,255,46,138,159,148,247,43,195,139,30,78,0,209,235,43,195,121,2,43,192,177,3,128,62,73,0,4,114,42,128,
        62,73,0,7,116,35,178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,0,6,117,4,177,4,208,228,211,227,138,212,138,240,208,
        238,208,238,235,18,246,54,74,0,138,240,138,212,210,224,138,232,138,220,50,255,211,227,180,1,82,139,22,99,0,131,194,7,238,
        90,95,94,31,31,31,31,7,207,255,255,255,255,255,255,255,251,30,232,19,2,161,19,0,31,207,255,255,251,30,232,7,2,161,16,0,31,
        207,255,255,249,180,134,202,2,0,80,228,98,168,192,117,3,233,135,0,186,64,0,142,218,190,21,249,144,168,64,117,4,190,37,249,
        144,180,0,160,73,0,205,16,232,70,1,176,0,230,160,228,97,12,48,230,97,36,207,230,97,139,30,19,0,252,43,210,142,218,142,194,
        185,0,64,43,246,243,172,228,98,36,192,117,18,129,194,0,4,131,235,16,117,230,190,53,249,144,232,16,1,250,244,140,218,232,25,
        7,186,19,2,176,0,238,176,40,232,208,0,184,90,165,139,200,43,219,137,7,144,144,139,7,59,193,116,7,176,69,232,186,0,235,5,176,
        83,232,179,0,176,41,232,174,0,250,244,88,207,185,0,32,50,192,2,7,67,226,251,10,192,195,49,48,49,13,10,32,50,48,49,13,10,82,
        79,77,13,10,49,56,48,49,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,50,13,10,80,65,82,73,84,89,32,67,72,69,67,75,32,49,13,
        10,63,63,63,63,63,13,10,251,80,228,97,138,224,246,208,36,64,128,228,191,10,196,230,97,176,32,230,32,88,207,184,64,0,142,192,
        42,228,138,71,2,177,9,211,224,139,200,81,185,4,0,211,232,3,208,89,232,134,255,116,6,232,87,237,235,20,144,82,38,199,6,103,
        0,3,0,38,140,30,105,0,38,255,30,103,0,90,195,80,177,4,210,232,232,3,0,88,36,15,4,144,39,20,64,39,180,14,183,0,205,16,195,
        188,3,120,3,120,2,139,238,232,28,0,30,232,167,0,160,16,0,36,1,117,15,250,176,137,230,99,176,133,230,97,160,21,0,230,96,244,
        31,195,46,138,4,70,80,232,202,255,88,60,10,117,243,195,156,250,30,232,123,0,10,246,116,20,179,6,232,33,0,226,254,254,206,
        117,245,128,62,18,0,1,117,2,235,195,179,1,232,13,0,226,254,254,202,117,245,226,254,226,254,31,157,195,176,182,230,67,184,
        51,5,230,66,138,196,230,66,228,97,138,224,12,3,230,97,43,201,226,254,254,203,117,250,138,196,230,97,195,176,8,230,97,185,
        86,41,226,254,176,200,230,97,176,72,230,97,176,253,230,33,198,6,107,4,0,251,43,201,246,6,107,4,2,117,2,226,247,228,96,138,
        216,176,200,230,97,195,80,184,64,0,142,216,88,195,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,126,
        129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,
        56,254,254,124,56,124,16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,
        60,0,255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,
        99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,
        126,60,24,102,102,102,102,102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,
        126,24,126,60,24,255,24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,
        192,192,254,0,0,0,36,102,255,102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,
        0,48,0,108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,
        118,220,204,118,0,96,96,192,0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,
        48,0,0,0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,
        48,48,48,48,252,0,120,204,12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,
        0,56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,
        0,0,48,48,0,0,48,48,0,0,48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,
        0,124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,
        108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,
        252,204,204,204,0,120,48,48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,
        0,198,238,254,254,214,198,198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,
        204,204,204,220,120,28,0,252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,252,180,48,48,48,48,120,0,204,204,204,
        204,204,204,252,0,204,204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,
        48,48,120,0,254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,
        198,0,0,0,0,0,0,0,0,0,0,0,255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,
        120,0,28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,
        118,102,102,230,0,48,0,112,48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,
        0,0,204,254,254,214,198,0,0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,
        124,12,30,0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,
        204,120,48,0,0,0,198,214,254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,
        48,224,48,48,28,0,24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,251,30,232,
        230,251,10,228,116,7,254,204,116,22,251,31,207,250,160,112,0,198,6,112,0,0,139,14,110,0,139,22,108,0,235,234,250,137,22,108,
        0,137,14,110,0,198,6,112,0,0,235,218,255,255,255,255,251,30,80,82,232,173,251,255,6,108,0,117,4,255,6,110,0,131,62,110,0,
        24,117,21,129,62,108,0,176,0,117,13,43,192,163,110,0,163,108,0,198,6,112,0,1,254,14,64,0,117,11,128,38,63,0,240,176,12,186,
        242,3,238,205,28,176,32,230,32,90,88,31,207,255,255,255,255,255,255,165,254,135,233,35,255,35,255,35,255,35,255,87,239,35,
        255,101,240,77,248,65,248,89,236,57,231,89,248,46,232,210,239,0,0,242,230,110,254,75,255,75,255,164,240,199,239,0,0,30,82,
        80,232,48,251,176,11,230,32,144,228,32,138,224,10,196,117,4,180,255,235,10,228,33,10,196,230,33,176,32,230,32,136,38,107,
        0,88,90,31,207,255,255,255,255,255,255,255,207,251,30,80,83,81,82,184,80,0,142,216,128,62,0,0,1,116,95,198,6,0,0,1,180,15,
        205,16,138,204,181,25,232,85,0,81,180,3,205,16,89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,176,32,82,51,210,50,228,
        205,23,90,246,196,37,117,33,254,194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,58,238,117,208,90,180,2,205,16,198,
        6,0,0,0,235,10,90,180,2,205,16,198,6,0,0,255,90,89,91,88,31,207,51,210,50,228,176,10,205,23,50,228,176,13,205,23,195,138,
        198,232,172,249,138,194,232,167,249,176,48,232,179,249,176,32,232,174,249,195,255,234,91,224,0,240,49,49,47,48,56,47,56,50,
        255,254,40] 
        
      • MSDOS320-DISK1.json
        [[[{"sector":1,"length":512,"data":[1301296363,1397703763,3288627,66050,-805277694,195842,131081,0,0,0,0,251658240,0,872022017,-1127182656,118914048,906000571,1444820933,733958934,768380,-2144948996,57933885,-1442477530,-236796790,1200168710,721929986,378207100,332234237,278947442,653760636,100891670,100891676,1067678734,2084021116,-150986568,-1954803418,58460958,-201897789,2083980801,-1593507653,-1796703169,-402542592,426901673,196737931,2111159808,225814259,-1105166451,196705760,1957098240,2104933912,838885864,1578552804,-1895526625,432865860,-344080450,85762539,922210867,-1057063925,-1585693534,1034124343,117488508,-394512479,413204543,990259836,-397393796,1918369869,1007036623,17593980,-142854394,58460966,-1965429800,-1971579602,-1954677482,-360956642,7340032,1958742700,-1290882015,-351220225,-137219085,-25421770,991332546,-137219204,-2005132746,-1552143850,-1262257095,957778690,-789935492,-2133929778,243974374,-511673285,-1966208449,-1971574218,-847381226,168674067,762212174,1953724755,1679846757,543912809,1679848047,543912809,1869771365,1376390514,1634496613,1629513059,1931502702,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,218106381,1936278538,1866604651,1713402991,1970039137,168650098,542066944,538976288,1398362912,1329877837,538976339,5462355,0,0,0,0,-1437270016]},{"sector":2,"length":512,"pattern":0,"data":[67108861,1610940480,8390400,184590345,-536018752,16781056,335540241,1611989312,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-265485632,-1036289,872411185,1614151664,58734339,990093369,-268500032,67124995,1124343873,1615135808,76545796,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,101711621,-16375711,1617233487,110100230,1795600383,-529725760,117468934,1929850879,1618345968,125859591,2064097401,-528676928,134250247,-16244607,1619331151,142640904,-1962368887,-527628096,151031560,-1828118383,1620443120,159422217,-16146279,-526579249,167812873,-1559617375,-257619392,176203775,-1425366871,-525530432,185597706,-1291116367,1622477632,192984843,-1156865863,-524419088,201375499,-1022615359,1878985792,-997620,-15949623,-254997297,218157055,-754110465,1624637424,227540749,-603983655,-522383936,234938125,-485613343,1625624128,-989426,-351358977,-521335104,251719438,-201330447,1626672960,260110095,-82857985,-251850816,268500991,-15720191,1878986831,276891408,185639177,-519237439,286261008,319889681,65521]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[67108861,1610940480,8390400,184590345,-536018752,16781056,335540241,1611989312,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-265485632,-1036289,872411185,1614151664,58734339,990093369,-268500032,67124995,1124343873,1615135808,76545796,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,101711621,-16375711,1617233487,110100230,1795600383,-529725760,117468934,1929850879,1618345968,125859591,2064097401,-528676928,134250247,-16244607,1619331151,142640904,-1962368887,-527628096,151031560,-1828118383,1620443120,159422217,-16146279,-526579249,167812873,-1559617375,-257619392,176203775,-1425366871,-525530432,185597706,-1291116367,1622477632,192984843,-1156865863,-524419088,201375499,-1022615359,1878985792,-997620,-15949623,-254997297,218157055,-754110465,1624637424,227540749,-603983655,-522383936,234938125,-485613343,1625624128,-989426,-351358977,-521335104,251719438,-201330447,1626672960,260110095,-82857985,-251850816,268500991,-15720191,1878986831,276891408,185639177,-519237439,286261008,319889681,65521]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"data":[538988361,538976288,659773779,0,0,1610612736,134375,16138,1329877837,538976339,659773779,0,0,1610612736,1182951,28480,1230196289,538976288,542333267,0,0,1610612736,3017959,1651,1162891329,538985550,541937475,0,0,1610612736,3149031,1725,1230197569,538988103,541937475,0,0,1610612736,3280103,1523,1381258305,538985033,541415493,0,0,1610612736,3411175,8234,1145784387,538987347,541415493,0,0,1610612736,4000999,9680,1296912195,541347393,541937475,0,0,1610612736,4656359,23612,1263749444,1347243843,541415493,0,0,1610612736,6229223,3808,1263749444,1498435395,541415493,0,0,1610612736,6491367,4096,1447645764,538989125,542333267,0,0,1610612736,6753511,1102,1229734981,538976334,541415493,0,0,1610612736,6884583,7356,843405381,542001474,541415493,0,0,1610612736,7408871,3050,538985286,538976288,541415493,0,0,1610612736,7605479,14558,1397310534,538976331,541415493,0,0,1610612736,8588519,16830,1145981254,538976288,541415493,0,0,1610612736,9702631,6403]},{"sector":7,"length":512,"data":[1297239878,538989633,541415493,0,0,1610612736,10161383,11005,1178686023,1279410516,541415493,0,0,1610612736,10882279,8210,1346458183,1396918600,541415493,0,0,1610612736,11472103,13170,1313427274,538976288,541415493,0,0,1610612736,12324071,9012,1113146699,538990148,541415493,0,0,1610612736,12913895,2886,1113146699,538989126,541415493,0,0,1610612736,13110503,2948,1113146699,538989127,541415493,0,0,1610612736,13307111,2940,1113146699,538989641,541415493,0,0,1610612736,13503719,2892,1113146699,538988627,541415493,0,0,1610612736,13700327,2983,1113146699,538987349,541415493,0,0,1610612736,13896935,2886,1161969996,538976332,541415493,0,0,1610612736,14093543,2750,1162104653,538976288,541415493,0,0,1610612736,14290151,13928,1163022157,538976288,541937475,0,0,1610612736,15207655,282,1313428048,538976340,541415493,0,0,1610612736,15273191,8824,1145913682,1163282770,542333267,0,0,1610612736,15863015,6462,1329808722,542262614,541415493,0,0,1610612736,16321767,4145]},{"sector":8,"length":512,"pattern":0,"data":[1280329042,541410113,541415493,0,0,1610612736,16649447,4852,1414680403,538976288,541415493,0,0,1610612736,16977127,1898,1396856147,538976340,541415493,0,0,1610612736,17108199,9898,542333267,538976288,541937475,0,0,1610612736,17763559,4607]},{"sector":9,"length":512,"pattern":0,"data":[]}],[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"data":[2630633,0,0,0,0,402653184,257302581,21958648,21697798,23462246,350950644,23462246,570818895,348135951,23462246,436666726,23462246,501088614,1711939074,1711367681,-989769983,1712058379,1259090945,1712081676,23464449,23462246,211157327,23465150,218041591,216075519,1711367689,1325491713,1259257345,1711367681,1427002625,23468046,23462246,22872399,23462219,225706342,227413364,23462246,23462246,230556006,23462246,23465474,23462246,21954895,0,-1993474048,771801118,12715660,1253988043,1447029504,-339725744,-1336912380,6405633,1347826155,384548915,-1070444458,250282420,28332118,116064948,45109334,-1916927052,646458880,199953779,7913046,-1101658901,1364197399,508909394,-1574022394,-986840892,-1979662306,1737097543,307202829,-1760274549,771901322,326566970,65065368,2143590384,-65073650,-1274977025,-1340478717,516238851,1328087232,-343821294,-1071725301,-1983892736,28578375,-1071725266,55019776,1562314587,1482250847,1448135518,246699351,281872307,1482579805,378220239,12779716,0,0,-1761607680,-687745279,1,1659129856,108298408,788475480,106234273,-1727623634,780873217,28311967,4621862,1114964028,-1624341714,-1993996287,-1943666074,-980745130,107907878,4602150,-1064553099,-443821938,520040092,-326434399,7244582,72781350,40274726,4638246]},{"sector":5,"length":512,"data":[780742144,1560740255,20762456,-2044328844,-1008205754,783805190,26947131,-393481102,4638246,15461123,1342177280,-1909586347,771856646,27209355,-2044329552,3932230,-2094120331,134324014,40274214,72780838,-1960393333,958793326,896860230,-795950964,782034315,36118271,-1960383349,-1910112146,-1960442794,-970587546,771752006,27209353,-816292601,74711356,4621862,-351909400,775630519,-193855077,-970528629,-352124858,235,-1878791424,1431306384,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962761954,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130,-1209334326,-1691469010,-1946914303,1187391208,-336919808,0,772166992,26805902,-1624339666,637644801,1006651014,776107264,27209347,1720264200,1452025346,650480388,637955723,1962952249,-1899983819,-1662678064,538902318,653036291,637562507,637818510,637691531,18118,-1624340178,1482491649,1946238159,1183196676,89188352,992917483,1912707886,652774388,50349766,60395,1431306240,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962698210,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130]},{"sector":6,"length":512,"data":[-1209334570,-1691469010,-1946914303,1187391208,-336919808,0,772166992,26805902,-1624339666,637644801,1006651014,776107264,27209347,1720264200,1452025346,650480388,637955723,1962952249,-1899983819,-1662678064,337575726,653036292,637562507,637818510,637691531,18118,-1624340178,1482491649,1946238159,1183196676,73197568,992917483,1912707886,652774388,50349766,60395,1431306240,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962635746,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130,-1209334814,-1691469010,-1946914303,1187391208,-336919808,0,772166992,26805902,-1624339666,637644801,1006651014,776107264,27209347,1720264200,1452025346,650480388,637955723,1962952249,-1899983819,-1662678064,136249134,653036293,637562507,637818510,637691531,18118,-1624340178,1482491649,1946238159,1183196676,57206784,992917483,1912707886,652774388,50349766,60395,1431306240,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962573282,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130,-1209335058,-1691469010,-1946914303,1187391208,-336919808,0]},{"sector":7,"length":512,"data":[772166992,26805902,-1624339666,637644801,1006651014,776107264,27209347,1720264200,1452025346,650480388,637955723,1962952249,-1899983819,-1662678064,-65077458,653036293,637562507,637818510,637691531,18118,-1624340178,1482491649,1946238159,1183196676,41216000,992917483,1912707886,652774388,50349766,60395,1431306240,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962510818,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130,-1209335302,-1691469010,-1946914303,1187391208,-336919808,0,772166992,26805902,-1624339666,637644801,1006651014,776107264,27209347,1720264200,1452025346,650480388,637955723,1962952249,-1899983819,-1662678064,-266404050,653036294,637562507,637818510,637691531,18118,-1624340178,1482491649,1946238159,1183196676,25225216,992917483,1912707886,652774388,50349766,60395,1431306240,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962448354,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130,-1209335546,-1691469010,-1946914303,1187391208,-336919808,0,772166992,26805902,-1624339666,637644801,1006651014,776107264]},{"sector":8,"length":512,"data":[27209347,1720264200,1452025346,650480388,637955723,1962952249,-1899983819,-1662678064,-467730642,653036295,637562507,637818510,637691531,18118,-1624340178,1482491649,1946238159,1183196676,9234432,992917483,1912707886,652774388,50349766,60395,1431306240,109981190,-1959919207,-1342070994,1183196673,1962949632,780348994,638058911,637691529,-1962649972,1854613189,1178150406,-1942653696,-1949266240,-13722395,-1962385890,1854613228,1452156416,1720395268,1187390978,-1993474048,117546798,1020221533,637826049,-402635130,-1209335790,-1691469010,-1946914303,1187391208,-336919808,-1657894098,2122327553,309657600,-2044329552,3932230,20714612,-2010774412,992870470,1946262318,149783302,-1329341461,-93133305,568786864,-829644314,616488590,607955977,129173620,281874100,-18091029,168626701,1413563911,540691521,1702129225,1818324594,1635013408,1176529763,1970039137,539780466,1953724755,1210084709,1702128737,168636004,262230052,-1851576832,1155329,26583854,771756961,-1593731165,-1557266411,102629785,1465012563,-930327210,-1959864178,771856174,26947209,771754168,26283659,-989601289,26452782,-343680885,1049308674,-1590820461,-503905899,12109963,109981184,-201588327,244002474,-970587759,637534278,83654,38192934,-953810944,1094,-1793195218,1586046465,797517318,-502741629,149783513,-1657894610,780742145,128975263,-1191546138,-661782528,-1962932034]},{"sector":9,"length":512,"data":[-1583141372,38046465,27501358,27591879,-1207808884,-661782528,-1962925890,665005572,38046466,36283182,36373703,-1207808884,-661782528,-1962924866,-1583141372,38046466,44278574,44369095,-1207808884,-661782528,-1962923842,547565060,38046467,52601646,52692167,-1207808884,-661782528,-1962922818,-1700581884,38046467,60597038,60687559,-1207808884,-661782528,-1962921794,346238468,38046468,68592430,68682951,-1207808884,-661782528,-1962920770,-1901908476,38046468,76587822,76678343,-1207808884,-661782528,-1962919746,144911876,38046469,84583214,84673735,-1207808884,-661782528,-1962819394,-2103235068,38046469,92578606,92669127,-1207808884,-661782528,-1962817346,-56414716,38046469,100573998,100664519,-1207808884,-661782528,-1962816322,1990405636,38046470,108569390,108659911,-1207808884,-661782528,-1962815298,-257741308,38046470,116564782,116655303,-1207808884,-661782528,-1962814274,1789079044,38046471,124560174,124650695,-1207808884,-661782528,-1962813250,-459067900,38046471,132555566,132646087,-1207808884,-661782528,-1962812226,1587752452,38046472,140550958,140641479,-1342026612,-76356057,-661731188,524683006,1516199517,520575833,207539032,-2146238352,13697222,542003011,538976288,-402201856,-492175354,-174659078,109494323,-1073083452,382539125,-260784117,1970405437,168865794,-2012973632,-1022639066,168543392,-1271827008,1964428545,624853020]}]],[[{"sector":1,"length":512,"data":[762576911,12590789,215031,-1205701628,-617463552,434836941,1975520144,-350827260,1912618447,279970421,12590789,-351451256,-182982244,-352320792,-1006188810,28573707,108271309,382592050,-473697045,92940002,-500576953,786492408,197396166,220450563,-2147483536,14090438,542659905,538976288,7343413,13008896,1329791191,538980685,-57312,-2147483536,14483654,843927363,538976288,300089344,855670504,168265408,-402426432,-492175355,-391451654,45413595,-990505779,-1341754354,-1796646133,1491649524,168266240,-401312320,-990511067,-1475382271,-401902560,1089011669,-385382400,1793720138,780532,1948304630,1948297461,-390403087,62190743,-389868339,130416671,-470881536,92939944,-192812985,348979636,1954596086,-351621116,-336928091,-194123548,-1014900085,1103301780,1073770510,-436156768,1314017280,538976288,1879918368,-962576384,1275128832,540103760,1495277600,1073770509,-201275744,1414548480,538976306,1879867936,-962576384,1275132928,540234832,1344282656,1342197760,20480,45813475,92939776,2091079,-220068491,1341382633,-370248373,183038915,-151489280,-327843644,-1259097879,839052034,-203036444,-990505011,-1341754104,29685250,-167137085,91562180,-990508368,102679304,1375177503,786117459,225648266,-1959861295,1527606159,1979696360,-2134575588,1952052961,-1159156715,-502303233,-986832934,687915038,1911099983,773806579,12590789,-384676055]},{"sector":2,"length":512,"data":[1053094743,-2144993088,1946488189,-213915389,239438374,327009318,512416563,-472838797,225152907,-1869585092,1161562996,-579497840,9276198,1804568832,-1920391667,636026880,1880036083,-964687872,1124142080,1262702412,2105380,93005312,1300964944,1435182594,911364,-855526150,1392938778,-169215218,-163794702,50378213,393263553,-503850357,1689307275,-939268106,-1224682877,-2083847424,-628424494,196723083,-1948125207,-136672317,-2084371487,-1957297966,868387824,375250,-661917193,-235420021,-796144757,-466435234,-628417843,96059787,-1948125440,-1144812600,-470351867,196727043,-1947076631,-138398760,-1177318415,-235470648,1919220352,1693089795,-774206731,-788483376,3979730,-91557385,-997789194,1403072080,-1420252402,-374619253,208728660,138412144,17957062,1880325124,65280,0,65280,512,25344,589824,0,0,0,1082132560,67504144,100794371,135201796,2011696128,114181,2704887,-2129169407,-16832155,688309806,1173880591,1946157353,-16884,1173824491,1962934569,-386518244,1752306333,1964247784,698363408,71645711,350750069,855829248,516173558,-1993998144,-167047561,-1175897480,114417,449700914,91537418,1392967470,1297427214,1968131355,1976699677,117321236,-2144465112,84879422,-30536334,-351328242,620397317,-1018297994,772996840,254346950,-243865089,-385373976,-118754973,-400192986,-160299822]},{"sector":3,"length":512,"pattern":0,"data":[1912610024,330033393,772196227,12590788,224888870,310348070,341806118,-135182359,338245,1371734388,-397212078,2104623248,1962998659,14542854,-393192981,1836187901,-2146258456,1963075709,-100892644,-1212455819,-1979249136,-1962934137,-1962933361,-1962932841,-352321121,-2134078930,-108988191,-1337756168,1074313985,-1174323015,-990510847,-33065726,-2084307264,-990500671,50885633,-26167351,-2000486714,2106067061,239962380,-2012191352,1569198405,357926931,1499072347,116123843,129038059,66186233,94400521,28901890,-386518528,1282539655,-2144412877,1762753598,-2144462732,-384730050,-2144464780,-351175618,-2144456843,-1877901762,-2127681675,1427339838,-1306561366,-1944700924,-1307148527,-1944700927,-1592886255,-1065021049,-14350476,-352160511,-1007140095,240590531,294108959,177546,441738,560523,697738,755082,892298,1021322,1354964831,838861497,649462,777520498,1505961866,62739907,1435108864,293387012,28837646,1930677506,199813128,-1292241803,555124991,689342479,1282246671,104589468,-1017313379]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7345101,33554432,33554943,23593024,150995456,256,0,1310740302,541412673,2105376,671096835,0,0,0,0,0,0,0,0,-1,1880366847,256,130818,1744846850,131073,65545,0,542068224,1162690894,538976288,2097920,40,0]},{"sector":5,"length":512,"data":[0,0,0,0,0,0,-256,342884351,131184,33489408,4194816,33554792,16779520,0,1330511872,1296125472,538976325,537067552,10240,0,0,0,0,0,0,0,-65536,-1,50360575,-16646144,1073872897,92160,589826,1,1308622848,1095639119,538985805,50339872,2621472,0,0,0,0,0,0,0,-16777216,-1,-150991384,76101,-1712782475,-327423508,-1960898989,940514622,225707333,-1962779253,-2082763203,-277479425,784555001,254609095,132841731,755418926,-402652401,57802903,-370383895,-2031555509,1358162688,693996371,1963049974,281278313,-144477184,1962942659,71666269,521033502,-1961943617,1032520285,-8135794,944403711,-277543867,-165061237,-411819837,-1994329216,526330205,-880747725,693963040,658407470,578027791,608075822,393544207,-1974446306,-527825595,-544276685,84149894,1599660090,-402426849,1482361722,526383555,145815787,263242745,771797225,254609094,-388003070,-361562314,772818314,-485544798,646524644,-225767617,1426321667,242563863,1390989431,243871487,1173819183,1962934569,211937286,-1962923544,-137219134,-1023536267,991332398,357403407,-235417037,1008109614,1034104335,799092239,8644623,-1023388696,73239123,689866798,-645113073]},{"sector":6,"length":512,"data":[-661733325,7878341,926320942,512503311,-1607594183,1149767478,172263940,254976558,650219014,36208000,78644597,118113414,1149632944,866266633,1963015183,-1911574526,883044057,1173865231,1962934569,23324709,786074704,772748192,254944906,926336302,71616015,155486217,33768646,-1911921528,197351642,-1963232064,-1040313523,990784046,1005400591,-1962773567,-1957605176,714945,-1054123943,-117251632,96328171,646589952,776998701,255661707,-825176368,993397294,-1947040241,915025610,1435111228,692451076,1953824769,253836928,-2146798337,141820668,1946483840,-1873417469,1912648424,692451177,141885441,555124782,1282246671,759071022,1946223375,-511682488,786707007,254740009,-2010200062,974076686,511054669,990299694,-1976696561,-32555978,360004294,-164493454,1023868718,914894351,-1007153348,555104814,973436175,-1602990995,-352308248,-1269802850,4843524,1625862003,100722699,-58717836,1476686976,-385922071,-970063807,-15783674,789482286,646655503,-471331009,1344193534,255107118,926336302,155486223,216538968,-986833408,-972081354,520161604,424015555,-855411328,-1258700013,1375398784,-997587186,256746030,-1090516807,-1359868090,121997870,1355020633,19482103,841184512,169528804,772109504,240322303,1968002363,1330461445,-970060684,993286,-1991420535,1492668237,195,0,400925486,100434076,-953283979,1074735622,190769153,-518062290]},{"sector":7,"length":512,"data":[-905743849,-2137260030,1198787068,1947335808,46832900,-1590780672,20715493,-466483851,1392509642,-408801711,-442421737,-402542569,781977133,400629503,-58718861,772764945,401018622,-1040316300,-939603970,1532615659,1476395722,400924974,50102523,-58695054,-2143980540,1114899964,1364350583,-1957343149,-775779092,-773664286,65196514,-4029997,-1979354367,1441466742,-2135626032,-533010902,-1863830670,11528454,118379270,-1676575557,-518062290,-905487593,1392902146,102651734,-1960900850,293388275,520511976,-588554657,-517013714,-997568489,-1979488630,1424492918,1484026374,33711656,50070220,1720341500,66879491,102638965,101603158,2092893983,-208972015,1527129576,28335711,-402106742,552076637,1914636038,103213886,-1157165485,28316028,-402106742,149423429,1913084678,1465261606,-74768626,-401507138,1583285742,-947889377,1183465730,-922814462,1451886964,85714952,-1962549528,1532714469,46815833,440599040,472456270,1461354242,1787932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251658240]},{"sector":8,"length":512,"data":[-16777216,788529151,12590788,653967848,135102336,-1977210251,1371409991,1965074457,425246211,976097060,-1743423740,54976721,1606690544,352267795,703136626,-417732121,-1964569367,-2010765243,1166737735,206121,38242598,640370059,839141257,1200105152,762678534,17298982,-1628959884,-173020934,1972178034,125799686,-218098759,-2117863260,20982093,34076198,1911227252,1200236176,675645441,71797542,640370057,771901323,253902464,620983552,52822013,692947712,-728703,1166655755,1200236073,27405830,692945178,1461584000,-165260538,393543943,69813751,-2130152448,-317083,-1181738773,2106392607,-1190728915,2106392595,125275398,520560134,1072211187,1594317571,1334519327,243871270,1702959615,654309161,1946421238,692945157,-108855288,-483821784,-1014803675,1639929640,-1960423399,92810759,38243110,771864552,-2097068664,-947714877,1491591172,-1007133857,-1007088464,17298982,-2144437900,18481726,-970036108,1704454,-164757072,17769990,1444830324,-661733325,7878341,926320942,512503311,1579093817,-1960098421,-461368499,-791883773,-2032071988,-1966568480,414450773,332224262,-1070390158,918935694,-1993473928,773456694,436543116,7880329,7997068,33998382,-1070464742,45089515,-2010773665,-2134640633,1946495101,106372696,19720275,653866216,771966859,638534307,771837835,255921800,-1084759670,-1959913121,-484835570,92876296,-536557693,96034808]},{"sector":9,"length":512,"data":[-1590800128,95689215,1606092558,23848985,1508380275,-371042047,1543209192,-1021354233,1594317657,124959,113651395,637800237,771966859,638533027,771835787,856636578,244002496,-617408001,870892430,-970013952,34548998,781191915,254609094,-1878922493,55020326,255697710,21465894,255631918,88574758,122653478,157271078,-1023409688,1059490094,-125573105,37650478,125042970,1609060688,-1101506055,-523167393,-268181295,-150994502,534853,-779681164,1179013713,772049454,772750242,100746378,-1003597738,638531382,-1962720120,-2010770617,1582826564,2287623,784501584,-401657949,56162748,-497460520,-111220537,-461323272,1019513351,738358532,-1974353151,8435912,-1017519917,34010670,997523738,-2144778761,-2127268864,-8443547,1141294638,2105561103,74777128,418055344,2105541040,276103464,2105786622,141889299,-970014466,1410286598,1435113396,-1978413820,-2010246299,-1022409434,-2147475480,410452474,19482103,504460544,4242259,-1866736754,-958791168,526082311,844153677,1477692900,554092078,516161295,777389655,254150390,1346204929,-1900006626,2016855512,914959872,-1943138505,521091358,918826502,1435176759,1418208787,268075780,-1976694412,638534670,-2147005304,1963075709,1153836549,1476854794,772035978,255932042,1108249390,-791818225,-840333619,1594318355,-269958369,71666422,-1959911666,940514622,125109317,539575799,-1962314496,1032520285,-336864370]}],[{"sector":1,"length":512,"data":[-873980437,113651446,-402583769,-970000643,993030,-1014047949,-2010710095,839189518,692451273,91488272,-33206902,516239041,1334313152,-483464959,784347728,436340358,427081738,772152918,436418245,-1064386509,2016839974,512501248,520552570,1358452830,777461331,253953734,-389903871,-970000798,992006,1173839730,1946157353,324897624,1059373450,-1019485134,-201962634,74834954,-922819702,180412800,1088697036,-729758206,356858624,861025654,358452178,-770968585,-745863307,24428555,1526368840,-141897730,-410977910,-2046381249,49009355,-757329208,182028003,526383311,-1966909349,-338755856,1881167348,335314944,-13761164,773775654,400635647,-482934994,922693143,-13754562,773799990,400627337,-484537298,512306711,-1943134402,119488518,-816177317,16824657,1504048124,139889347,-1073028046,1720323956,242679555,-518062290,1183816727,49934,0,855638016,785944256,524172996,4996745,5113484,1178501166,57999391,771802089,27344580,540297,657036,658424878,540969218,570854400,1053044224,1049166497,109838372,-1003618266,-1996283842,-1946146754,771762694,60440260,2899593,3016332,339657774,809404676,839289856,1053044224,1049166990,109838388,-1003618250,-1996158914,-1946142658,771766790,92421828,29376137,29492876,-62995410,-935425787,-905540607,1053044225,1049167478,109838796,-1003617842,-1996033986,-1946038210,771871238]},{"sector":2,"length":512,"pattern":0,"data":[124403396,30686857,30803596,-465648594,-666990329,-637105151,1053044225,1049167966,109838812,-1003617826,-1994440130,-1946131394,-855611898,-1977676263,-1089528794,-890691519,-753696017,1964254227,-1155438060,33,0,150765568,-13761164,1008749870,-821988616,58048522,1020264368,-402361087,785317902,12590729,-1039758290,-527243008,490128430,-2091514353,947191806,637814154,1963213880,-1277480160,693963024,693897510,-209641293,1562509311,1552623145,48463913,1560936242,106650409,1552623190,881534466,-1007959154,-661911714,38045990,-952334042,-1006633211,861347408,-1075867905,92995772,541958958,771900811,-98545757,518325703,-83735156,-883417249,67454346,1034038849,521018913,1394680254,-402650392,-466425045,526063309,-1073042237,245168756,-337617944,1225395700,1919251310,1768169588,1952803699,1713399156,1679848047,1702259058,540688672,543452769,1769108595,168650091,544829025,544826731,1852139639,1634038304,168655204,-2147483638,7405567,33571712,33554689,16,504,0,0,1310740302,541412673,2105376,671096835,0,0,0,0,0,0,0,0,-1,1895825407,4489472,65538,2,63488,0,0,542068224,1162690894,538976288,2097920,40]},{"sector":3,"length":512,"data":[-256,-941031425,440795122,-388016151,2105799358,57933850,-384152065,2105794376,-389873638,-164367643,1946249960,22669357,1380985205,380948618,1482298317,29236594,512372224,1563954985,1343190020,1558729297,1482250989,57996811,-389810637,-93131327,1929392104,-181147403,-5052221,-389873291,-93060841,1928177896,1501199,-167049358,1223224441,-183244800,-389849351,-167050747,1005064312,-401968639,-167050782,-286784395,-970013952,-15783674,117211331,1843983221,-387025665,309521769,1929367784,2029390601,-389855998,-369557497,-1914047347,1364664052,771870952,12590789,-1944682615,1599674439,-116411361,29092035,-1071725266,260016384,-1022277748,36259319,-2145618944,1946298493,-100892650,128979317,-1176498245,45746528,46433025,-1007846167,0,0,-1892810752,774052870,589170319,537300782,-13722589,1914902558,788475397,-2137251044,108267260,788475549,-771087588,-953223560,1074735622,190464,1381231339,-1959863670,839854614,1461604607,490652974,-31985,1563955572,151221508,1166747989,-1908569342,1609231320,1532647455,692451267,-2117926848,-4249243,692451267,1321402370,1095639119,538985805,1308631072,1095639119,538985805,1375739936,-2234288,-396948108,1918828562,11003914,-117454616,1522752088,50010,1397838342,240590416,-1088483833,-1682037849,833827,526361843,-1962195574,-503967411,772359427,-1960587613,78711877,-930354989]},{"sector":4,"length":512,"data":[-828297647,323848995,-235417037,868911682,360052690,-393547126,1928147688,1096010,-2144991056,1014235199,-448823258,-2077881996,292883271,-501169277,-13739543,-500969978,-336186433,-208971496,520509214,-1480653042,768291,-1070422797,1609970602,1543002143,-1022928295,1591405401,519367518,1364592215,-67096344,1582933235,-1021354233,1359370014,-67100440,12494579,-1107069952,123338751,1354964831,-1607535053,1161432876,1308718096,1354979576,521013022,-2094815298,213458119,-2134681600,175276282,1946352768,184320010,-13761164,1394556462,509039185,1085820934,-958886400,29702,981459584,1912632598,1946600967,585826560,-1044345773,-1023212309,-2124693362,-1711271965,7349728,1347947634,-1174397976,-387054602,-1973944211,-117410778,24503306,1595869176,-899983014,1134690306,1208403456,-58712064,-972721150,570443782,1059373450,-2013248350,-1979693778,115916993,-1962916190,81838274,168813696,-1566569276,1392902215,1881520282,1200301568,48808197,637551266,1527269258,1982237191,-1058766848,646504458,-1950154634,633379579,930414704,1881524378,-1188006656,-256245504,-201655295,116849517,1946288200,634427921,393347184,-1174403911,-201719312,-660931732,1962962981,1125056006,-1010207488,-352361112,-268423282,-352361112,-268423650,-352361112,-268423553,-352361112,-268423454,-352361112,-268423432,-352361112,-268423319,0,110042894,110044648,-392354326,-1980104685,-82947274]},{"sector":5,"length":512,"data":[-100613400,449642932,-399572997,1381060645,449700914,1347967322,-950906541,19387398,-855329792,-385649894,780664971,243804088,914892729,378021818,113715131,141268,1912687848,-737753232,-402652377,1701970154,668206791,-1528299520,666476544,-1203863400,58004519,755000325,78708816,-594873866,95795608,-727457289,-1732015577,192200715,-150901319,-737803807,-2146964697,36158014,117376118,243935188,-315480133,-737279671,-1173452249,1240281639,-1128341039,-1947139289,-737804028,-734622937,1532582439,-919354536,954978867,-855460720,-1997311462,-2010662866,-2010662642,-970474954,2603782,1912647912,9627869,350804082,-1204909568,-1190229465,-1170830809,-1156150745,-411703257,666411203,-1577050136,-1180686408,1501223,-1608009310,233318330,666542592,-400049248,-1147011068,-527776985,-1963978971,853575384,-754667036,-167071256,-1010629919,666386048,1949660960,-1203863538,745675047,666451584,-2145029504,-1725449922,1048583799,1997678522,-1170309097,276168743,666582656,-2146863311,2603838,-1007156618,1048626169,1998858168,-1187086320,158816551,666517120,-134056103,-1178338877,-1195704316,-1979217369,-267442720,376900156,-321852208,-321852208,-2146442112,108464892,-512407229,-1007041544,0,2031616,5898299,9896056,13893813,17891571,21889328,0,0,0,0,131072,16385,17301504,28674,35651584,65540,58697728]},{"sector":6,"length":512,"data":[131080,83885824,262160,58697728,131080,50331392,1073872900,791752704,942616625,872022068,-1579643200,-1557266356,-1557258434,1319180257,1084435968,-475845089,1275512599,-1944590336,-1593815538,-1557266332,1721835330,1151544832,1678165791,-1944107264,-83859954,-1071312435,-771313408,1019281128,772243201,254019326,-930430722,1971372790,868233986,-762381614,-83427140,512306769,-443930663,-18352,-1608073074,-1574043634,548415458,-2101468954,113698828,-401837890,1505625792,112519181,-401782850,901645998,111732749,-628174285,-1070349682,-1425722177,-943158101,1459645446,7250700,10749639,-1499266694,311040,-1827906117,-2085907541,-1416428345,-1416385645,378121107,378078464,915080452,512622712,582942842,768261,520529139,7866055,512492834,-2144468870,-47717826,113707900,34538795,86116038,-1324167713,1507906310,-686913234,378228775,-164463594,-568948434,95506727,727311059,-526176574,1840928807,-941978109,-1308620026,219057163,1549056,243843582,-893911015,11567,-788525307,-773271080,99144168,1879376128,369408,57522256,-1070350194,1050794126,104539648,91619351,1978662973,1007077130,-1945346816,1476410894,118365966,80213555,844636515,254911204,-787538782,541179872,1237252099,-1297767136,-855067520,-2012974573,841048598,-1088483630,372903709,57806620,855680233,-1237480503,-1272401152,1913900309,50102346,-914340491,570869250]},{"sector":7,"length":512,"data":[113639695,504303414,105992791,332204212,-956429198,914933246,243804131,-1047844892,1599756551,1917891359,618433044,1947155519,1946762252,-351816188,-352143866,-2147371518,-91610935,254033536,-33196798,552698063,-476004301,1011190055,-1993874272,1300838981,678791209,-2012916344,1569195133,608075819,309657871,254019270,281641218,692914432,-1023525493,-1023493653,-1191226391,92930047,263836210,-854018992,-2147126509,108265980,637978158,1048576271,2113937762,-1082084787,512368996,-253227215,-32607487,-2145295858,2187838,854267519,-172693360,560086656,-1978043902,-32558818,565559235,-924286542,-33131775,-350133746,-174790653,169960096,34043072,-1576062714,-1202712804,1048585704,1962682338,1090566206,365756595,1931990968,615757915,253902464,-1201113856,1048584710,1979785570,-1870861565,1965143480,-1871385853,-2145295688,992318,1944781684,560117904,-2138018325,2187838,12502900,-1094283536,-172021731,1973878015,-8617800,-940083968,-1290280698,-485585884,-1877415145,113647184,855707429,-1193767232,-1331485204,-1307669503,1347952385,-1900006626,5022168,588817198,771772065,-954000733,570444806,1309576227,1347952384,34550176,-1574870522,-1168634084,-628227219,83886125,-657391601,-388896559,161736913,109139968,7340041,1381048078,-919343821,45404723,-108848435,-2095942400,225771770,1946287491,12141843,-335617472,417879777,915012346,1593511507,253902464]},{"sector":8,"length":512,"data":[-402426624,-677313630,-389748697,-387706648,-13434780,-1576695258,-677304360,-391059417,-2011603574,-1977098978,1166739533,-653907689,518861351,-544276685,87694987,801814559,83886125,-657391601,-388896559,387281,7341313,-1427586930,714754,-555163790,59905,116786029,1967138781,-134512379,-75250929,-13384713,-1962933830,-1591222770,-1064425504,-383264863,-1061623547,-1145008633,28836352,-1175047678,332201985,-2128213646,1426325054,-117345110,508778435,-2012914296,-1070398379,1158217996,675661353,-586758651,-1269694425,-32256760,360024262,-2145160614,1300774881,-5052397,-1027925902,1065362947,638809089,1946435456,281248525,67304321,-369497227,642908453,637814667,637949835,638076675,1946834707,-586252283,643465255,-1996208245,-1960437947,1077741639,-1982631424,1380978245,857163147,-1963029806,-201911459,-1040266614,358451865,-858721289,-461321008,-1966339392,-225814296,28889226,-841272574,2104645651,54427942,1967278336,1048651292,541917189,-2128211083,838862910,638416174,671360,-351963856,-1873351906,138314022,1965961984,1048585972,1966080010,638118658,671360,652375346,1207964577,370576166,290818304,-1037311279,286690086,206932224,-355269455,-1977171413,-2013262578,-768407475,-235409782,1913648701,-586252283,1139490855,671989392,91620411,-351746429,105679607,668798472,-1962783605,1435042900,141395980,668796662,858289472,1272810203,-338438141]},{"sector":9,"length":512,"data":[-18644925,-338562165,-1014899197,-271580673,-1978565240,-2010653410,536353117,-1312596133,736809732,45304002,856194442,-2084371502,19726546,14320384,1166668791,869591825,1053044443,-8188131,-352094721,1460047956,677218854,1963326336,1166747172,-1960423410,-148499131,-930409627,-137219240,1959922673,-1993981951,520497989,-351898227,-2145448434,510920699,-37821487,-1926198482,330902909,-1527541760,-1960442017,-1960443299,-339505603,-768359515,-1960098421,-470336419,-147169909,893749731,33798984,-770968585,-1992294028,-789891003,16908800,7340544,50135760,33556736,0,65794,1610670082,522505,131087,33554432,33554690,94371952,150995961,512,-684801024,1362029102,-619804329,1220774695,65140552,-1960322810,2484432,-24906965,17200639,-349709554,-677293072,-619803865,-429922265,-610181285,-773814745,1509426144,-1957486909,-165158858,1076354310,-561112715,-288230517,141760651,-338564143,-338564143,268428161,-1899815074,-1948003874,-1021354465,397541815,-1548024341,773108224,797447816,222595630,-1952960212,-842822704,705303,200579,200768,200709,202181,661318,202738,4068,118359582,-1967251698,-930370257,-1951594013,-208621320,-1074598998,1723334706,128690945,49951,0,63721,0,0,150994944,32768,16777216,-65536,83887112,0,6044225,5242882,0]}]],[[{"sector":1,"length":512,"data":[0,0,0,0,0,0,0,57475112,57475097,57475144,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-67108864,-24381901,386829102,-1899459584,255506648,721961192,-1178497336,-372175045,-1207523853,-883949280,368942,-1590765426,-1064435703,-24381901,-212860743,918892197,-1959919605,-100657386,-795948916,-83801924,119471926,109852160,-1992949755,637535038,908084618,-1946125662,1125832,2138934,-400617954,-1709244112,7348436,-879952645,-1911493757,-1946799165,8436222,-1943624205,-1275054586,505531728,-1111875826,623163404,-4513331,-850873089,-850873311,6464289,520117923,420907574,1959922176,-1261765114,-400438002,521011546,838868128,868781028,-851528485,178977,567099060,-1158028733,45092052,-839303756,-402296031,334170765,113488,567099060,-1260876968,-1272853179,-1172189883,45092056,-1173711384,28314844,-1106604568,119406633,-5112181,-1431518722,-126500854,-1441943473,2625160,1376578746,-1258291269,-1272853176]},{"sector":2,"length":512,"data":[1914817864,-1262449084,-1960719031,387877867,734563328,298025944,762506027,-113442632,1114776013,-919349109,45666867,567146818,251999346,13796096,-388823887,-489485135,268812811,1925528320,158329091,567099060,-1157165478,1334575178,139430916,856444812,-112479040,-876994099,165144590,1053097707,-1977221117,-315482035,558729254,1370800522,-1696013066,540445446,-1980749056,637542966,-1961331319,1170679494,637534230,-1064421947,-1590231245,917176356,-1426053471,604438070,1371550464,-218087495,-97366,-1070397067,-1410137167,1494149977,-1421868872,-1934899573,1959111640,-18408,-1196708949,-492109822,113653441,-1019150300,12066574,-2011050697,-1174394602,12061920,567146813,300483442,2138370,234889891,143583263,738204832,843019781,1545505764,1578535680,54445312,75351296,1435049353,-1004597758,637557822,-64057,71665958,-470403661,100780171,112722012,1543897344,139388928,-1070335997,521054963,-1610071064,-466485219,6037131,6166155,212677,-1994760823,-1976689579,838868510,509446655,1053040398,-953810852,654311173,-1291565687,-154629323,1543897571,440320,6030849,50855912,1363259640,-67095111,-953767181,52037,-532297946,-953810944,57925,-2082151847,-16770498,113731701,131098,-1003610544,637535022,234909380,1586112031,-1195115008,567100424,930463755,-1977165005,-1006763938,-1207088198,1622754317,1914817800,1511951138,223518989]},{"sector":3,"length":512,"data":[12177971,-135137534,1976699875,47201541,113707382,196634,646975211,-15171965,-1004140940,-1377101714,1843943455,251606535,846463002,1053046302,-986316708,-1962933474,-1993993657,340232965,38111526,-1944944759,-953805753,16712773,521166731,907068291,6036993,837338347,1053046279,-1977221117,976625741,1929387790,243938821,-315490273,558729254,6201654,407210278,6070582,373655846,1370800522,-2098666250,100742660,-169344930,902112774,377340966,-1191316504,-661721088,104529328,712310782,1554063118,1286912,-1560256863,146276373,285606656,252611328,-387844352,100729925,-1175977890,156867078,521011312,-1962496024,-1593811426,-1064435614,1253365803,-1945755187,-1064417088,17221414,117442560,242334403,-385395480,-661979001,-768358093,-851311944,5808929,12112435,-1943941822,5808586,721678568,300581840,2102921,922563560,2102923,-1030825330,-1959341517,-1275045874,567146815,1364676764,-91546960,-1359870493,-1336999563,179350029,922364842,5783177,240672601,1052004383,-1655168563,-935656334,-524678796,113240076,-386041111,1994917182,-1963625981,57665760,1894320755,-400617729,-303364670,1967324288,106424338,1681720692,-385650176,446955351,-2132612352,57951228,1016080619,-400526001,460456765,175459900,28324788,567136394,1178387435,652740981,1006924291,-370052026,-58654941,-385649596,-880016937,915004302,109838454,-1645739912,-1547685115]},{"sector":4,"length":512,"data":[1587609607,631552,100688035,-1898542305,1023457472,1914818041,1389923146,-768358093,-113114440,141763021,567099060,871102810,-2097148155,78708946,212986067,-1039408429,-939277940,992872306,1912611342,90958083,-851528614,-1899262943,6208451,1270088624,505531897,1931415047,98297862,117385961,478815830,57989898,653716294,102761670,-1157165482,1038614534,572165,1577400296,312863,1956716302,386284288,1577349632,-976819449,-1962932458,80118770,54445102,-1459320064,544505856,-1459302936,141819905,206932262,241011750,1946159273,1435051528,1569465864,12445962,7446574,108380170,-369098824,-1952972588,653560520,-1977592438,-2132802846,175512316,532291342,90433551,-2081890581,1157637636,100675104,-986840966,771782174,208580,273058598,991923027,242440967,-1732638882,244693774,-385540376,-1004077465,-2094661522,1962875006,1858348550,787737368,637557921,773342857,637558433,773473929,6041284,1543930670,971513856,1187456516,654311192,-15251770,1128478603,5671206,567104436,1377698027,118932782,1451828736,1586243090,1109350932,-2082289922,-639099122,1053044474,-1960443901,-1960435123,-986831787,637536054,639792521,-1960551028,128134660,-1995667200,123601492,-385649600,-722862419,1375502589,854071925,-1962118140,956283096,-838860870,-1173982431,-2098721057,-38409980,1967586432,68413462,1912603965,16792843,480380531,-39982848,-2130900247]},{"sector":5,"length":512,"data":[360008956,1630281740,-1057092494,108468796,-385867870,-253100669,1358725372,1156059253,-386698751,619184389,-370445823,-58655381,-969116341,738216198,-972831512,18694,1912604733,4209959,262349431,11790336,-353887630,-386501630,275907493,1912610877,33570059,295896695,-47322880,-2130928919,58021884,-2130930967,58016252,-2130933015,729109500,2688710,216907520,-385923704,-1073086351,540826484,92800370,-957289657,1592262661,1963604992,5761027,-2130911511,980769020,4785862,54781996,4785862,1026061312,594739456,-402645598,460455989,1946316008,52947190,4002162,973894401,1996496134,2007558,-369316119,417987611,378620,-402642497,540803081,92840306,1375005511,5770891,915084003,-1977221030,1477377796,1510407936,-1017513984,100396025,-657391601,-388896559,516155601,1381061456,512416563,-1006760425,1270488846,-1337674739,-1324829427,1512164672,525884249,1325844419,-973058035,34425862,223151815,113704960,3608,521019075,578030908,1047792188,276176956,57945916,-399381511,512294970,124915224,1929346280,-337777915,116887583,265752,-336002187,236495123,-1560280283,113708365,3441,10479864,117424927,251592792,-689242022,1929332968,1021256785,1011577409,105346906,243926798,11865705,-233936193,913639342,-754974280,404655072,-1948775666,8169928,384311412,1008562943,-400984774,777256717,4785862,33548320]},{"sector":6,"length":512,"data":[1225180718,-396689408,-1007157242,-1007036109,236457605,-1040764043,91488260,-351397982,1086453544,-1576700928,501943628,427081739,573943,1336083828,-150017267,1946161345,236299013,329450475,113506318,-617412850,223092362,1962998656,2668807,223284873,1505682385,-1087337714,532221266,-1527514112,403109639,1946161166,236298502,-150118493,537794566,-1589742592,1638075923,-20411635,224043465,-522979119,1520642930,33128461,45150387,512366455,292818268,780796336,-41939636,-1291553792,-33362960,1545504971,223650317,-1007041544,1477348142,-386407680,-164429669,1508441739,1914715136,1465274873,-1102188917,11865337,210435467,-217128122,-251420762,-260723554,-346464673,1499356933,-391488848,921174052,-386370304,-391512028,1017774104,1022916384,649819146,16729542,-1442838552,-126547396,652455147,1174702630,518243145,1174702630,256073,1019475060,1023112224,1022850057,1022587965,1022325804,777634619,5783177,-1993411021,-1023387082,1929224424,1963605242,-40376073,508973507,-164421882,1918975148,2004499465,-2011157499,-253558972,-1017553377,1956720208,1587752448,1923165696,1554198016,777017344,-402629471,19856765,771776006,6031047,-1590820864,992870494,1929388550,-1161603070,521015032,-385834776,-1909524826,771754270,466435,-13760629,771753782,-1157625949,-13762460,771753758,460431,113651395,855638089,751040960,1007055408,-134056183,868481475]},{"sector":7,"length":512,"data":[-1054501,1402200946,-150992197,-1023255581,1912657024,-353856556,774075132,4785722,792466036,208965776,141822524,74714428,-847921142,1476853550,251604480,-1014300582,247709707,-1158509817,-1782903111,-1273033202,639749385,-771091318,45352820,-347725363,-1261204494,-1021194999,1929387240,215005703,-1023404824,-1070344053,567100596,1971372790,-851528462,-1259934943,567146813,113542083,1515805528,526212958,431247367,-816307763,5002574,5132099,5788993,5132880,1313817436,776423750,5462355,1297040220,1145979213,1297040174,1430390528,1380271686,1107640915,1262568786,1162085955,1162037590,1229325636,1179862348,1111705092,1275680851,1146377025,1163282770,1380190284,1095784009,89148754,1128354899,1124551499,1414419791,89217362,1279608915,21324,1342177282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33554432,2304,33554432,33554690,47186032,150995709,512,0]},{"sector":8,"length":512,"pattern":0,"data":[65794,1610670082,522505,131087,0,16908800,7340544,66651552,33556736,0,789453312,1141785614,1141785614,1141785614,1212548878,1128551507,1426722126,1667592814,1768843119,543450490,1835888483,543452769,1126198889,1229344335,1498623559,604638547,1699940877,1919906915,2053731104,1869881445,1634476143,543516530,1713401449,543517801,1107954980,1864393825,1768759410,1852404595,1126441063,1634561391,1226859630,1919251566,1952805488,218133093,1986939146,1684630625,1970234144,2037544046,1685021472,604638565,1866664461,1734960750,1952543349,544108393,544173940,1735549292,1868963941,1701650546,2037542765,220465677,1869566986,1851878688,1816273017,543908719,1769366852,225666403,9226]},{"sector":9,"length":512,"pattern":0,"data":[7065321,1430388736,8263,0,0,-1,201841,-65535,65535,0,9961472,0,0,8388608,0,0,0,0,0,348553220,1431180492,538976332,-1879039968,5720,5724,5724,5720,5720,5720,5720,5720,5724,5720,5720,5720,5724,5720,5720,-1,5]}],[{"sector":1,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,788725760,536936448,538976288,538976288,538976288,-65003488,203228188,1905693,36864,255,0,8388608,0,0,0,0,0,0,0,-1879048192,0,65535,1,0,0,0,0,0,0,0,0,0,0,0,0,917504,5,0,0,862,1,0,253361920]},{"sector":2,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1779863086,646655492,-1527577496,378087164,915079900,-1943666650,637544454,2885260,4591242,-1943605966,-970581436,-2080434364,-220061498,639692419,-15055673,-541128961,-773861013,-772812305,62950639,868257479,973507839,943622400,1170679296,637599492,-64057,38127398,101187583,-231306430,376629250,-559862265,-559733246,113649154,1207960400,2401062,-958886370,1509949446,67271,723910656,-150801914,61032664,-1631641856,243712,2539435,203,0,0,0,0,0,0,0,0,0,-65536]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1496837117,-1513577016,471836104,505355807,522067743,20455198,50542850,70911234,84017936,50463291,33752124,87885060,67895811,100744709,84279871,84279872,33751873,100811269,50610945,1141178626,17633029,38077702,38142982,21431302,117590031,117590280,117656073,139134985,67240195,84412939,33751886,302075666,51446870,39257346,22544646,50616833,1527055362,33771525,73139460,556007686,67568127,50856703,50856706,67175426,50529537,67569407,84346625,67176453,67569925,67570181,50924293,67570689,67702017,50859777,50532354,51187970,50860546,51138562,34217986,34218242,67195906,50550527,67195393,50934274,51139843,50943747,67982081,67183617,-251,118166527,84153346,117773569,84154111,67835649,84154370,17111297,118168066,67836674,117578754,67443972,67444479,67969023,34218239,34218242,118170114,50934274,67576579,67183617,84803333,353637375,421009174,488381210,522133278,912532514,-719336354,-1541372129,1059105312,471821087]},{"sector":7,"length":512,"data":[1243430429,-937378275,-1424314592,1881650457,1210627105,-1608446679,-2044156632,-1239296472,-1692817899,974796825,-1240091110,-1239777771,-1356289515,-182378200,1612303648,-1775723749,-98947800,924260118,-317241321,-820410600,-2141332968,1712537626,1545190682,-199629543,-987005672,2099970346,929611369,-1100518809,-1016475801,-1586918809,-1704429013,-1138066840,-1252009634,307861599,-1151758754,875172649,1913862675,-400889574,-182758888,-110613655,1478101599,-580241302,-2141185942,-681440926,974501478,1729476115,-1122604269,378742286,433731192,1342314128,1381965783,925325189,1803049265,874066992,1464604559,1466259321,477895768,1478564976,1635670282,348152640,1727357677,415569968,473307172,1632330286,367027927,479937978,100801674,525324,268583040,18350852,603979776,0,3014700,3801133,-1778384384,738197526,2889728,10223617,738197504,754986496,14848,378929410,2883584,16789784,5063680,3014656,3014700,33554478,1480193,402668288,65569,70,738205696,973090560,16909056,5782,571998267,-1644166912,0,2883630,3801135,-1778318845,989855766,2562048,1766588417,771763828,788540416,16792064,378929408,3866624,33566232,1262834432,3014656,2949164,33685550,1485825,402668288,65597,36,771763200,973090048,16908288,5782,756547628,1140850944,21067,2883630,3014703]},{"sector":8,"length":512,"data":[-1291779581,989855766,2693120,1917190145,738197504,771763712,33566208,378929410,2883584,16789272,5393152,3014656,3080236,33685550,1487617,402668288,65567,159,738209280,973090048,16908288,5782,538443835,1174405376,0,2883616,3801135,-1778318845,989855766,23468032,1263337473,536870912,754985984,50346496,378929410,3866624,17026072,39168,2883584,3080238,33685562,1485569,402664448,131074,36,738205696,973090048,16909056,5845,286785595,603980035,0,2883630,3801135,-1426062589,989855766,23009280,2359297,771751936,788540416,67123712,381944066,3866624,24,9216,2883584,2949166,33554490,1480192,-16765952,1766066701,1701079414,1702260512,1869375090,319425911,-1650680576,-1583309154,-1515936862,-1431787609,1095080576,-2138095218,1229276485,-1886500535,1335005840,1431654297,-1684367015,-1616994916,1431259457,-1482250843,-1886348672,-2138664562,-1953330807,-1886480244,-1936551536,-1651070567,-1684366952,-1616994916,-1767928954,1163215781,-2042543807,1162167619,1099778377,1162167695,1430865231,1431279701,1431674011,-1566465889,-1499093853,1788327,1396395328,1027423804,1381124927,495272257,522722975,506470184,505224980,517545638,516890284,514924209,83894064,84103250,370021920,-2045898995,-2029681148,-2046130424,-167410169,-151587082,-151587082]},{"sector":9,"length":512,"data":[-151587088,-151587082,-151587082,-151587082,-151587082,-118032650,-2305,-1,-185270273,-590081,-1,-1,-185273089,-2828,-1,-1,-1,-1,-1,-1,-151584769,-10,-1,-1,-1,-1,-1,-1,-184549377,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,16777215,0,0,0,0,0,0,0,0,1259543808,1622412128,1619222604,1620402318,1626693788,1629053209,1629970713,-568424146,-1959866622,-821895650,108380170,-451507666,37539586,192157303,31621202,-451508178,-2133894654,-2043805214,-821893866,785383344,-821426526,619380916,1489961136,110046808,-90438370,922693200,976094494,1997401358,-337540377,641347079,-596177426,1951530112,1660715169,-58680204,-2137951152,-1737214980,1952775296,16640186,2115931182,512306693,-880016004,117365646,-1070398769,-1593644381,-391970082,85893378,-1593473885,-2103245536,-1991223291,-1945821658,-1912266730,-1996300770,-1946145242,771764246,84739782,-1899262976,117882067,-1899262725]}]],[[{"sector":1,"length":512,"data":[-1996541221,-972881090,16974854,49823368,49692296,-472785782,1961102076,1509720086,-58704524,-2146666740,183870,112996725,-1557337334,113640166,-973012271,183814,47187654,-2102112001,-967300403,197638,-167213380,-16587514,-397408908,777534385,233807755,92020359,92151438,2081881910,-30475771,771936014,85989006,505842478,-1997763835,-1590820794,-1557265020,-1590819554,-1557265022,31982880,-1892757760,1476755462,1582979419,119496031,-2144927954,110046725,503711104,1381390165,777016145,92284671,506905902,-2128166139,16778063,117323467,-50658609,-400615906,1931411602,-1342000123,-953761023,-57786,374363678,56671775,75498632,21284673,12058682,718141443,1914658392,-952712447,839045638,788185856,85989004,505841966,-1139339771,-402257786,443744171,1948778728,118359573,112845874,252362496,74821362,90540582,-100140793,-821101002,378418690,-1959918304,-83550682,-1943078197,772087830,85862025,-2034493682,1760036360,-388533505,-1142216728,1912669264,1299834883,-996773288,637876782,4409079,-955747200,839045638,650377472,-1991938364,-1945820114,-1023072762,-2113985048,-125340,-466480661,-402625048,333971483,374112767,-1980170239,-1070415100,920924867,-402468189,-5242877,431904451,1048589837,1946157814,113718794,5440210,-401794626,-1017249790,374558750,-769750241,-12801022,-1019606668,-964491916,-1376589053,1962933376,-735672316]},{"sector":2,"length":512,"data":[1962884098,47555075,1962884268,47292931,-1021355941,1397839390,-761061610,210681346,512424074,1017971431,973894911,-2046004029,65286880,-1963987984,-1978930233,-1393741108,41207610,-466421278,526276955,112835,-788085202,-1007091454,-872418584,-2130981896,175444476,57982986,-889199896,-58720254,-2131659760,24384252,922693327,-13758791,1343142710,-1947432107,-396554682,-655686105,-1329389810,-2143501313,1019937139,739014567,-1152180608,521015612,-887137321,-428506564,1019973808,1021276827,753956777,-1152180581,-487911123,-478698436,-546144196,1394507820,-351181637,1921006801,2007514322,511716558,294239059,870891755,1460580614,-233720641,-506372178,-1493177973,521540034,-1593788440,512426750,-1209531652,106727933,-1995981819,-1607072700,-1329396990,-1125547521,-2080935417,309819385,-294324726,-361442806,1997340288,-400615931,381878539,8054815,-1979874840,1284048468,-1010814460,-41877584,-2131201256,-210551559,1933377152,1694138606,1381099891,1488658198,440579,-1031024077,832038995,775341342,829155328,-1108845793,1543933745,1510379267,775341315,827844608,381927474,-402239201,-804847584,-773730079,-773729823,183423201,-1580102706,78709501,-523116334,-66712999,1398194946,-1190963013,-768409594,1122550411,918887985,384303150,1583030065,-1962714975,-1962714610,990075926,1946353670,-1422508588,10698099,1381062147,-1246113229,-772671739,-773795360,-1094153248,602410106]},{"sector":3,"length":512,"data":[1944703232,-926777084,2418688,-2101476943,1107980,50138760,-65632190,9627650,-1017226918,1001128116,737702608,-152354352,50204296,-1341931018,-33393380,209953472,-988989,-2118400374,-1036331252,-260898896,-1979720216,-788333546,-1192635927,-628423243,243982839,-511704322,209370627,-506343285,-1979690264,209895119,4843593,55167882,10719953,1347638787,-1190963013,-768409594,-397163893,-987877263,-402641354,1528770629,-1892640792,503535622,3028677,523252968,10575451,-1177406717,1077936135,378073591,-1070464254,-486492989,-805065477,381942754,1411287839,1376684803,209232131,-1979981336,1284047452,-1023112956,44933174,906044611,-1023234654,74776380,-13444982,1599211294,-8184042,189166847,-1962117669,-1962715594,1284177500,-400430083,477298695,-2115435856,253148924,1979661484,-1966868222,-667177528,-315426700,-320081661,-212341454,-1943642204,2078807117,39619067,1273611147,-3020548,45089907,914999531,-320142506,-1031135466,1917422312,454289432,-143469689,1340662834,106203643,-1996206967,76087900,-401624893,-4654025,921168895,47849099,-603026634,-80943102,-1996333943,918753356,47847049,-601977802,-1607023870,-1966931228,-390005054,74598692,48538166,4694070,1763523,-400571354,1552546554,272927746,714947,394864378,39816230,-617364485,-661994610,-472783919,1008670403,1946907137,1912814607,-1340705776,378192895,132842159,45029000]},{"sector":4,"length":512,"data":[-385895741,1418328762,521585414,-1006447967,-1962748354,-1979526114,-402468562,2089417378,272927754,-1996333943,1810433100,884336891,-91428778,-1022868337,521535666,-1394031990,1913630792,439609374,646510450,817825072,-387698171,1284110954,106727684,-1945994103,-373092788,1474886483,38062074,1418461903,1273545488,38062074,1418461222,11715344,-1031135466,1917347560,977191971,1173825029,1971322947,40167447,-398801944,208798310,-1980097048,1150026348,-1010814450,381943728,-385896417,585630278,-17602,2104969,1973897,3684037,-1994326088,885326916,158659387,-989576055,1978874676,35973358,-1191182408,801968416,-2080535613,-1414724921,-22228853,-1057051960,27845682,-989985163,-152311600,-1968520054,-1431525928,-1414662006,-355269199,-1950219448,-137219126,1204325361,648848711,-1391049080,652736170,-1425652221,-1993948925,723913542,-654897850,-388772982,1183393344,1187456525,637534236,-14793017,-970013697,-16560122,-568422866,183195138,-1896260120,922686556,-1030881278,-24381901,-218070855,116797093,1962869584,857673291,1358299,1172105222,628293552,88471334,494211072,40208934,-2131696512,292843772,87441033,87557772,-401146648,-1977203299,-2010773755,-498919353,-568423477,512304642,109838358,-611450146,1342621230,861405187,-1898344759,8961730,-1191179585,-1510801402,172838,-12729813,-1207732721,271388671,834304,78764075,-628170541,-1996487005]},{"sector":5,"length":512,"data":[-956299234,-855638010,84330016,113744384,567083088,5375686,872859595,-1946150912,-956287458,335557126,939968256,-939524352,-16762362,1465304063,870886480,868411392,-1977163638,669533957,867624960,74833978,-445267958,-1017225384,334015568,866314240,1975519914,1354979572,-1073042772,-1017578891,24338748,2004499651,-1008729086,-4632489,-222285057,1490155438,132694879,-1251328,-1023409688,119473694,918812551,84739830,1375172095,470715190,1359536896,-18691789,1509483097,-326412861,106859347,941591086,393413726,839147146,1139003903,772169219,1586044811,-2091033850,1539507396,442973,977191982,-31995,-148502156,-2147466427,-171769483,1173825219,-1015021563,-2147370813,-1017632051,-2130593597,-1017632051,-2147305277,-1017632051,-2130528061,-1017632051,-1998039522,907244851,168181376,-1274710784,705423365,718111924,-466425621,1579811048,-225721569,1948531884,42985720,-796068117,-225722226,179170610,-1964608320,989694684,-2147125565,41159992,-796205686,-1482672566,-1465764351,-1447078399,780678657,-41286380,-1679231606,1963605247,-7018493,-109836740,-1291437514,1011053585,1010201727,1009939464,1016107031,1016107029,1009939469,910455818,296879674,-231052428,-22406797,45541574,339640374,-1049296891,-1116472518,-339214778,-1335759944,33810439,233418731,-85415175,1971871489,516357887,-1106829562,-829816407,-389831437,-1846869693,-1921714678,-352306200,3598583]},{"sector":6,"length":512,"data":[376763914,-12219866,242364476,-311019204,1631330316,2050753650,1760158582,-396578561,-396492363,-1607073521,568852904,-12982014,-385874968,-167051441,1357386100,92939776,124985404,326371644,905987560,85212800,177960192,-23628545,1472417487,-829751985,-1286397776,-1374756089,-2144990858,1946747261,-489947639,506083058,-567672408,-511653118,1599863815,132695412,-335814144,1338965694,1122502832,-400510975,145752381,906049769,-384715872,-880083188,132894506,-352307992,906080514,85198534,1962031616,1962621455,-391468021,-939654740,-404568322,989771497,-17206021,-1393998137,518398,-117247741,-385965335,976682550,1964094214,-30611450,-1970266389,1959733963,343165207,1460084230,-230162805,1963417518,47314439,-1009833269,-26089123,-1092075344,106389248,-20715490,-1973549281,-17045026,337049142,-27924219,2112428720,-401755906,179306653,-1979672343,1979661506,1053046338,-617413346,1914505960,-402541378,192227301,640757736,1075203456,650362930,-1089051264,1395728360,-387392717,-294495460,-1024982604,-1274645209,-349516412,-387697945,1405298613,-402652741,460463307,-2130355061,-2122284829,1962967291,1556422160,71824903,91496208,1542990285,518339,-1528235797,1358262812,-840432661,-402410448,-160159879,-402475944,-1007147151,1358777832,1476396264,1019382467,1012888096,906327167,27723518,-29993442,906145286,44967552,1342534915,1479586536,1593806056,116799007]},{"sector":7,"length":512,"data":[1962869420,1444828111,-402652741,611458123,-150643573,1971323075,-2134640869,-1156221952,887619588,-150113764,134219076,-969537164,175110,-352287767,222072958,138158196,154937460,-1607033227,-133430873,-1974347530,-486492728,-400510969,-102563971,-969489575,108294,-369132055,-29950099,-385767666,540868466,154988915,-1336873612,-11016098,-398455720,-389808303,62599199,466216960,65795186,-1271925784,648013825,-466422156,-1020880664,244563,-1152187157,-1031143420,804644944,-397009320,526319352,-387398821,1946202159,-1006695176,-617393584,1914407656,-402344955,1482303077,20766858,104600436,121376628,138152820,171706228,11535220,82442947,85256435,-1996167960,1418207556,243041059,-2013039808,-1444338572,56672244,1916948968,-400615927,41028980,-1729499925,82372852,503537855,1111025750,-294510754,521557534,1578152168,-1948028385,-1949856813,-620032420,-2135227531,-1946645760,-137219134,-947171085,-896797705,84337498,-763166719,558139648,170087560,-2001636106,-1393875852,-1746354126,-1979485180,-1573454012,15205638,-387223036,141904358,84320310,71665702,638862475,-1961933431,-1993992636,1149963589,1166616080,306481937,323324198,88965414,521551872,-1005272600,-1677380034,-16386266,1342666239,-622309968,1939691522,1946565793,-385699683,870904803,76173828,-1089419645,889127904,76043806,2011747979,-1893769663,443701764,1245088566,914961925,1623131468]},{"sector":8,"length":512,"data":[1096869891,300419186,-385650162,-1007946840,910083126,-86120443,-1960437388,1149836613,643237402,-1994818108,1150033020,-1291362530,-397481088,57952566,646988523,-2147138057,640120064,-1994570357,-1977213628,1149771589,1166747167,457476363,-1960443725,-1071381179,38079014,-350600056,-1960407016,1149830981,1166747162,474253577,-555007821,-2078343370,1166747136,171910149,423921859,922371469,4195883,-201968205,907560072,1073746081,356878630,364578421,387072,1090358,-2147436349,-1003596026,637550654,-1929097845,690357885,637761281,-947715703,1609818677,25765383,312553155,-1993981952,108336965,-402647109,-1557200949,-389873646,-1959857729,855655470,16614336,-1152560524,-208928769,1077855278,1300964864,108891396,4031270,-2094659980,91619133,1793849227,1173825168,1971322885,1212475397,-1960439692,-801433771,-751105934,-628423565,-947652725,-2083659211,141885438,-352237683,1894513068,-1946157125,1053044467,-1960443840,2106393677,1173825030,1971322885,1208281093,958793332,208803653,358431014,-141883789,358452006,-499791997,-97316,-24394892,910068014,109850117,-148503240,-2147482299,-806877835,370701383,910083103,1032005125,-401837056,-277671222,-344717764,839248889,15198400,787536872,87441092,-1329397390,1149944611,1954588697,1201203228,12061045,170904849,772568256,-2147293535,57938172,-117323032,1199368387,-152507019,653619966,33703367,-1740692352]},{"sector":9,"length":512,"data":[-1975517171,-376825268,180413824,266436805,38635558,88443174,48800046,826640678,1460033054,-423688426,571652,1072213062,-102585608,113647382,-401210106,123675004,426909534,92112934,71681574,918892032,-1993997006,-1943664779,-339539619,1166747278,4138245,-1343728098,1971922493,1569465863,1914658313,491031526,491096358,639321227,638272905,-1977924215,-2010767548,-14278843,24415493,-1189053043,-391380981,-492111918,1472461049,-218090055,-953786454,637534213,1394119,1170679296,-1006633193,1077855278,1161307648,-1287359996,-1914440139,-134019459,48800046,826620198,-2094648971,729022525,-1474739062,1346532480,-1069760476,773748056,8920831,116069746,190659366,1059327349,90540582,977265792,-105876256,440699843,491076390,1150023029,1161504284,-1947437799,992353860,-478864571,1967171779,492604223,492649254,1552602485,1564091935,-1966312161,-1977214372,-80607875,1975576448,1563567806,266567682,1448588661,-1927250547,196673908,1587999488,-1952156321,-1930749092,639261835,1963416891,475827094,157104934,2112458101,-1974251265,870848580,777542655,87441033,939953198,-401640699,770240275,-285546242,47358254,-1003584910,772093502,48772863,826642214,2341059,-150550994,-1003616254,-1090182098,-812974079,190221094,-114547736,558140355,-2094836597,41042171,-1966868942,1418403908,-773795828,-1965502230,852921058,1381024758,2133117067,-2145368952,-506363679]}],[{"sector":1,"length":512,"data":[-980757807,1149887114,-1017619956,1015083659,-2096925185,-231012410,240946115,-126493941,-1996455749,1438846556,-326898549,-330921964,16729798,-151005720,1963519046,112899,-386052471,-790036583,-144799233,49039094,2095580020,-112817665,-386181495,1183580052,-1947994117,-112817160,-687610889,-1980545399,1183577430,-1981548547,53932358,-2096965114,427032786,50284230,47882550,24500471,-137219256,-45708813,1183441911,-1982123023,1580855134,-167348751,1963130694,-19797916,82317171,-314128401,1187381248,-555154945,272927488,289769766,638731403,-1961671287,1452012358,1166616309,1434920469,1317753367,966115313,82593526,448725877,1444828475,-671146218,1918705502,-280065607,653988328,639059343,-1995356789,-1960439740,1149834053,-280589550,1995952691,-314144265,-2080815615,989920086,309656902,82593526,-148502411,8389957,1187382389,-771030529,1183000180,1451426297,1190527227,410256620,-957528321,-1962672314,-903088306,-1003044814,50518590,-1426854018,-1946462581,1190590790,108266220,149702390,2045248372,-330893570,-1995475960,1418207556,243041059,-2013039808,1190536308,192218348,-268965858,340035871,-166308727,1946741830,-313619703,-1980951064,1183450188,1575324671,178371,506678457,-1085255342,-1612184736,1515804731,-385649889,1005121003,-82319106,-953800078,-2147483067,-1957472738,-14739727,526277590,910083126,1343779589,-1360506192,71129340,1023767552,91553828]},{"sector":2,"length":512,"data":[-38672304,650439512,65537535,-87693062,88471334,158662784,-790100854,-2000617926,239388420,-1960443776,1149832517,1166747158,340035855,289770278,638600329,-1995225717,-1070394812,906773641,4210372,73763366,1947747386,1676169223,158554364,-1002782466,-1070403979,407144643,906362662,637538465,370492809,910083103,234825221,-1337778200,-65017789,-1195778837,-390057166,57998718,-369146742,179371813,-1325560599,-41424626,-2098658128,-385830659,112262525,-1325565719,-42735358,1041664310,512505349,-225770176,1979661440,130450179,118895871,-402431809,74660498,-320738981,922689302,922682074,113705692,73401050,47980172,-1895043608,-1895638010,1929566726,-638887165,-1006346050,-167428546,-16447738,-947715212,-620078329,512362101,-1006763292,1203996332,-218101063,-1430026587,47857348,84346614,-1341229825,-1057051905,-218102343,84451498,-1430025558,-218099527,-328275547,1041664310,512505349,-969538240,329734,117884470,118882309,-1962647361,-12812046,-964489867,-1573475322,-30014200,-1408956658,340036176,702890,521577971,47855359,47986431,47843015,512492640,-353893668,-603549941,-637104382,-385650174,1053097814,116786494,1962870023,130515715,495461979,-1947468055,243807986,1623131400,973400067,61867379,384553961,-633929953,-600375550,-637090046,-1945870334,-402465762,110037750,110035676,41091802,1623120619,-633420796,1423618,-1974033165]},{"sector":3,"length":512,"data":[-2086007996,-1515907386,-1515895226,3532894,384533993,73449223,-633944778,1423618,521577715,47855359,47986431,47843015,512492640,1256719068,-603549941,-637104382,-340823294,571819,-2144951053,1965096829,-2092871929,-227407623,538983553,2088765045,309600258,-1180029264,-1527578621,-8552410,1325626656,-1070336277,2145960874,-389903630,141768788,-1326285336,-350820081,-986819042,-150652362,-2147466428,-970063755,194566,-402431809,1460018082,123674462,-964438414,1333003008,1968979072,-1427618303,-390057231,-739642814,-1960946966,56672242,956622935,520516447,-352079782,1048590000,1979647253,839325202,945350848,1239945074,-33262351,536013760,-351227814,-1101389858,2145990852,56672000,-1075252597,-1341885640,-2132219133,-16444098,1053095285,-8190662,-387156737,-378401417,87703236,1128658726,628367360,-397322490,2089544074,240946694,-2029821762,1472213751,1580764648,87703236,1229309734,1599733759,-1960897017,1359301174,-2081346584,2002338809,1173825190,1971322947,1300833800,977192009,-252712955,468303922,934788842,1443061951,1072231051,91446840,300483504,1048590058,1979647253,-14739725,-336629034,383683801,1996700703,901310578,112199027,1021964265,1011380994,1166681600,169767941,-1341688586,-370545907,-2136473319,113703284,-2147220783,-2010742582,-1142356651,-788085015,-466484734,225738920,47253190,2110006788,1703552519,-388986107,1418324166,651946758]},{"sector":4,"length":512,"data":[-2147138057,-385649408,113639641,637797073,839351748,25029083,-33458711,1019805384,1022719491,-1273007354,1946430465,1342419970,1477453544,1978205043,452978943,-5185398,-1057095051,125089771,158664492,-385819927,-1897332583,1976106496,8710403,1869924606,192203006,510970110,-428408260,-402532631,1953641714,345591,-966232704,67293446,125682726,113643499,-2147351855,1400178941,1963038184,1173825102,1946173444,-967375290,386081798,52823750,622757907,825133059,839813123,859212035,893290755,924223747,959875331,52738819,526255894,906036457,1838729,192205323,437684534,-390534912,-1342137367,-390403839,-385956887,-210435782,71694118,-344717312,637978166,229641987,-1556683894,-1070398684,52929334,-141877498,616236822,-397009405,526261193,52928822,-1325268955,-337063159,-389838156,1232221631,637585128,-1979427445,1053046488,-148503238,-2147466427,-897514380,521539584,-2147262274,478691779,973161671,50378752,1932185080,13271300,1173825026,1947205699,13271300,-414390144,-351906679,-384847698,-471275484,-1341885645,653585158,-351971957,-11277852,1962972648,1173825272,1950351364,-20381968,-972589880,201532934,113640939,-1341979866,-1545369066,-1070398684,-1576851549,243860273,378078006,914948914,520487732,118945675,-402447173,-147449075,206598,906392960,-352110943,1049310866,-410975449,-947191553,774228456,-352136543,-1014345588,1916071656]},{"sector":5,"length":512,"data":[-958713307,50516230,87703236,1128658726,-1004109824,225789309,47253190,1569334786,2110006785,-1017579502,1929367272,-1000929777,637876798,4408823,-1022926976,-12981928,-335634199,-2037600,-148441483,4195397,-922816908,113641332,-350747866,637978117,229644035,614720394,-1547685117,520487719,118945675,503522491,443017302,-147447970,206598,918320512,-385669728,1340663562,-1207536658,801968403,168216259,1541931013,403097582,-1947926523,-1408939466,-76169206,-2130383229,1965959740,41713670,-2095090646,-24704530,1069025046,309567,477474803,1034813063,343228206,1061109165,144707189,1008673797,-972720865,334086,49809094,346023937,208999283,141871370,-117439816,-1007812120,-352320584,-2146667018,334142,95946100,183036672,-2131265308,17107470,421956126,1950270725,116798981,1963001094,189265417,520320001,1961371371,520319744,1300242155,663240709,-2145444725,268765710,1912798083,1580934667,-402295027,1265770313,86257348,1913890280,317057090,784641395,-1977219804,1659371590,-164597207,268765702,116793972,1946682630,1460031511,87703236,-2145023450,646463980,-1041757689,1476878117,-1007853080,84543222,-385649407,1642725198,1347886847,118904403,1245612854,921930501,91627150,-1014767733,-323950590,-386333879,-397986339,1532951151,521557587,9445119,87563916,87426759,-466483503,-1004821016,637875774,268584391,96937472,-1561853951]},{"sector":6,"length":512,"data":[-1005751749,637875774,1479,-130314264,86257348,1599626078,-1008155873,-1207536660,801968401,-788085053,915079682,1049298250,76154188,537732490,1959016992,1161221,922731513,922682076,512492250,113705692,92668634,84608710,-324999168,1929674216,1195285,45613941,110098688,110035674,-1880620324,95994860,188645376,-378208251,-964430965,-14030822,548930931,-1948521728,-1996141514,-955954634,-16429562,403097599,-387580155,594678509,-469105548,95957113,1352464640,-402320992,-2141706207,194110,-342031499,62412965,1973349120,-163676149,74776578,108382474,-117439560,118918379,-1106971969,196674790,-1583025408,-6093480,-1157163516,-423688805,83017220,-1409283143,41238332,1135216522,113702370,-971635450,-16443386,1930732520,-14775403,607044612,303818757,-437745550,-2138868976,194110,-6215051,-1794753788,-1605143547,279446950,111286901,941526021,114408965,87438985,33703111,-389467392,57874636,1409241065,87441092,1530542056,91504324,88965158,-2080666816,-1497494585,1423621,1323869427,-1958186496,1980141307,-1427787771,1055396843,-1959235072,1980141307,82230789,-218100807,1950256036,1300243973,-2017574907,-347281403,85460678,68675584,2005733746,-34478054,548931187,-18159360,-117496087,-1946229783,-1006267106,-402316242,24318309,330950851,-402287711,-389869271,108260086,-854519880,132694831,-133773589,-1863843582,1964208913]},{"sector":7,"length":512,"data":[1959332364,178184,-352786183,243907,-469043477,-1910575240,-1962576354,-1948568589,374115323,840455307,189041380,108335272,-1961067381,-132178340,-659959829,-971737857,16961798,47515334,-737753593,95945730,-389809920,141814410,286177360,-1017434163,1357552104,49809094,287434753,-346356877,2044988046,-1947707386,1489300458,1945973480,2144261,1053040107,-2144991884,651692903,638273288,1074089344,-402320992,57878077,-402652488,784591454,87441092,1978287848,363784195,-1023017178,-2136415182,145230965,145752692,1353195532,95947380,-788085248,1055588610,87441092,976667654,-97531,1342638453,-854517576,650337071,4408567,141821824,286767184,-1017434163,38633766,-135790590,385411305,113643123,-385938937,-558110222,-1007036655,-1476065120,-1005095928,637876798,-327146102,119965761,-372447222,-400413720,45672910,910083072,-1809907963,-373233664,-1275014423,-9508607,49809094,16443392,-993853069,839202366,1166550756,918816258,-24967878,118060543,286701648,-1017434163,1128593190,1946648576,381177864,1529859345,-378214205,1930429160,168588568,-1207405367,-386334718,-1195120278,-152371197,-352320072,184120561,-1908377372,637892102,-1475655798,-1461095160,506491905,909559126,38570757,-2147433993,-779482507,-2131697024,158691578,-990847,-352170871,266436620,1946220928,-350265852,-400597321,243996582,-397344742,1935226749,-392173550,1053095138]},{"sector":8,"length":512,"data":[736625974,-387484928,-1195120390,1053032451,520029494,-337117036,910083304,339929093,38139686,-495681536,637722273,-1020181111,38139686,209027072,38636070,-2131697280,91554041,1932997096,2144486,161661945,-662023419,-2131696768,-16446146,-75496075,-2147126160,225919227,-478095222,50036751,-128253065,833731,-389809829,108259426,-854520648,113689391,-402521391,-840374162,-1153338848,1458044930,-986090977,-1979354058,521539684,223251238,508988198,1962932867,1926314756,1238512419,1914647784,1107391767,1274405443,1183458891,650182148,637685387,-132229495,-1008194072,-387196533,87703236,1979711363,286898182,650325965,4408823,-1207536512,801968411,-402593597,49809094,243918849,208999283,141871370,-117435720,-1008209432,-352320584,2044988150,-200882422,-16777470,-1006302458,-1962747330,-1408939466,-995475412,1191369278,-1543182658,-8552410,637891845,-436255290,-218101063,84320420,-190754646,1486990082,-947672315,-469084156,1048777592,1979647348,1170679304,-335544328,1981714075,-1175221499,-1527578592,-386392298,-993794174,637721150,-2136472182,481822324,-1020277487,47253190,-413079550,87688903,244057237,1074005308,1915519976,977191990,1841571333,-539498427,4622886,-955969118,333830,-133773595,918880514,380371674,82231047,-218100807,-1573475164,195888390,-385648192,-1387200730,521590923,86257348,1930251496,-336898045,1477418728,1913458920]},{"sector":9,"length":512,"data":[206432482,-466428558,922691817,48105102,839813926,1373211392,823912523,385278553,287160351,520040397,-1003093908,637550654,-486257269,108891415,48800054,826620198,-953809547,-2097151995,-253610553,-397157581,1935354668,-2094611711,427032637,48800054,826620198,-1590292619,958792426,91565893,378662,-689224960,87441092,90016550,-2147433481,112723572,-1020277487,-387551768,-1830289149,1344214528,889382995,-145729445,1962983619,9234545,1802634672,1955419735,-438245344,-401868568,1600054746,-24441996,521537310,-352145159,1837770318,71600651,84320822,1963906792,1300244197,1149968395,1166616075,289704730,474319142,638796939,-1960950391,-1993994428,1149966405,1166616077,1333798422,1444823045,295706390,567011333,95422303,-386399886,-1671884465,637760841,-538440311,-1664901659,1208322854,642253173,-1013119609,47253190,643237378,1377654155,1511918056,-1070455438,49743558,551610392,526260594,1950270518,1300243973,-544537595,-1341096563,526710304,1606678531,1053082375,-1960442570,-1007221411,-243990336,-2147433481,129500788,-1020277487,-387616280,-4718585,-16062209,-1060898877,-134646528,1967128771,-397192973,-1993941015,-1993994427,-1070396075,9707263,-389851045,343139622,-854522952,95994671,1005123840,938001381,-79500827,-1931138584,-955959274,-536529402,319211267,-1342177276,303622160,54386802,-992775168,-989518802,721777726,1979668215,-14739962]}]],[[{"sector":1,"length":512,"data":[855988278,89695168,1913736936,184543328,1053055858,-2144991884,-2092956339,783814855,1477872416,297068549,1512976056,-1005474328,-972741586,402847494,-390057382,1450319858,89659019,91504325,67456384,-1980300450,-1982713068,1418265172,88965124,639571520,-402635126,95953013,-459741184,-1000711485,-972741586,402847494,-1276592078,-988319201,-2147126210,1577321805,-293341437,-452671974,-369113368,-346095828,-465245958,95946355,-1020277487,-958114328,194566,84412102,182052886,1912603576,-1959103225,-133867506,-1008451096,1944328680,285325318,-389861427,113697834,-973077768,369428486,1913302760,-1961724660,184899646,-351439361,243720,1493095145,-20256424,91504325,-11280597,521537141,-423688426,-1187008508,-1426915317,-391462862,-202896253,-1898417655,-1962576354,775794163,-2083752672,1034755782,-1015730642,113712918,131828,1913246184,101107382,-521660923,-2136182008,194110,784639349,512427300,1323828568,1519940117,49743558,-390057448,-1938678070,91504325,67456384,-958463141,-521542393,50775806,113442819,50775639,1053032707,1049167158,109839736,123667834,910083267,1166681605,1007625218,-385649407,-202898120,-401874173,141878087,-854521672,-1007107281,88471334,259326080,47253190,-483071998,-402340888,-960240842,67293446,90016294,47857348,1950401526,79951367,-1070463628,-167722775,141893827,1946272758,15329609,-544530682,-796147661]},{"sector":2,"length":512,"data":[504300776,909559094,248834053,-2034968693,155093814,13104899,-400984960,-91547722,276086794,57934652,1607461663,910083126,78178565,922389343,51920387,-1064523029,-544483186,-1031024077,112977,1494137064,909559094,125093125,-401230616,-1269363067,1049310854,-940113143,393510912,1595368936,403097398,1006633219,1021146113,850228227,1595075520,406750006,527761667,512636446,92930838,117388831,-952761580,198918,440157952,222037364,-348082464,1017818143,-972851955,171706884,125170656,384366131,369167589,-21895137,2242185,1049173782,158664016,87441092,90538022,81455295,-23336765,2242187,-1049233909,36257408,-955878272,-2147342074,1460031999,-402511430,123724360,36421209,1964653696,-1441091424,-401952689,-164371263,1053075947,-1977219786,254018117,57999420,637776873,148983,638022784,17057270,1609100917,-508172286,163055220,-1020277487,88471334,1416953984,47253190,-509286398,-402354456,868475302,232188096,918894110,1944585526,-1260942579,1049310855,-940113143,343179264,-1961470488,1958742746,1946369035,-739565821,-23336616,413212504,910083075,-389510395,-1950153666,9562577,47253190,1300243972,-1977204731,-1070398115,-1977688093,-635517501,872123138,1948297426,-1466373374,-1469025022,-1949272828,440369346,-1185821836,1575485441,-986294003,-989514186,652740468,217573396,914863191,50937483,-2147432457,-672655756,-952738027]},{"sector":3,"length":512,"data":[16979974,1946237952,1958742749,-31725300,1048786527,1946157848,-13221348,1191384070,512636446,1031799574,158605082,151439158,-503316477,532843441,520051433,1055399702,-208986115,440183889,-1964505740,1492574947,-400572117,1021967651,116799231,1979646723,102700562,620554327,-963901838,-141828466,-2084370593,-378076677,2016855350,868481029,1480491986,74776581,-1878135918,572969098,-1977220010,-388823730,84809352,-494221173,89527947,-696200190,1411287808,1847494917,-400956667,-965601479,568909703,-503155945,1847495154,-1965585659,287566044,49743558,-390057448,-1502471334,918902302,1283458420,526255109,113653443,-1961360649,1317676793,1183458824,-1964756465,1347506924,652791691,1952012288,-489684192,-812950799,1946163432,113653459,-402651888,20709479,54324852,-117344776,1371757251,375818790,21400102,-756545965,-1876301045,1962940392,-969489663,17108998,1006648040,1022194689,24508419,642892793,639002250,1392592522,198895622,505403788,309773630,-1911850776,911935449,51908235,-137417889,161560281,-2147440381,1963932867,911613459,52180677,-669086666,914961922,526254806,-1022076952,125158694,639536182,-1994451451,-1962597322,-1996301794,-972730338,331526,356879142,391482150,90314377,637886627,-2147138057,104232320,86257348,6195750,85008008,39750438,913560379,1520694263,1578535173,651201285,-1576778206,-1047853810,89033254,378137299]},{"sector":4,"length":512,"data":[-1962474156,63015880,1929566726,47882508,24500471,-473396408,856146692,-1007133751,-1962582367,1958743001,1177232910,735639298,50623448,-1545915453,-1014299292,-148450765,1755513462,1712752901,1679166213,1037071621,-881524735,38177574,-1996134749,-1023055850,84936390,1173825024,1971322882,-1977200370,-511704499,16351472,-402295463,-546100024,565758259,-960235264,17108998,-1960388629,-1960439483,103486301,505087328,812778850,-1073018251,-1053087116,-930413965,71693862,-399805176,108211323,1946133992,784647151,1541932324,1410239487,228517893,359975179,-385763863,-504823609,1532582144,-919396586,-117439048,1377208771,1411287301,1681818373,91488261,1913514728,1748927459,-747372539,1913543656,252102353,378142981,243991822,512427368,1994917204,1472295438,113660752,-1908931849,1375919134,-35592111,-1452123557,-1977165309,333971526,88965144,71645728,1429815669,960262662,930285149,1074087414,1347956340,1428902487,-1948584186,-1946645513,1317742274,65140482,276073976,906422737,47974030,24356339,1599735716,4622886,-401082648,-1317726241,1499012886,-401677477,645076044,117375154,2045314386,90612223,376750091,-402299741,242355636,90048199,753401856,-385649907,1053097762,243991862,237700432,-148503846,8389957,1419841141,1166616069,89301275,423987494,19270115,-2094656179,-134211755,1173759683,57935876,1358995689,58050827,-385876039,1935223603]},{"sector":5,"length":512,"data":[-24909815,-373038221,-2128215658,-1078000283,86257348,-1577186840,378209632,-404552350,-763117309,1586177536,1943223042,-1946945701,1976699864,-1977202687,-388823730,-1006218672,637875774,638666123,118707595,41350950,-770979701,-1556086412,-1070398116,-1559924573,727188850,1950118617,-1815442643,40302374,-628899541,-2084371712,552272082,166250635,-401743092,141757818,1053083955,-1007155914,-376419861,-1037369081,-768407178,-1996132189,1476751894,89394827,1913372648,1411287526,1377208581,1958882053,1371661090,1072220299,-999139315,378259595,1229063506,-1175976588,-1983876597,-1996139490,-2096803306,353342,512428404,820512084,-1582796276,-1073019544,100757108,1709704538,-963087860,17108742,84809354,89398923,90705547,1913422056,1380996994,1183458899,64588544,372041946,537218432,1963214138,106248466,1564020082,-955747578,553583685,-401195288,-529197529,-1909040549,906157086,49743558,-68622280,521558873,149112690,117375154,-1393883822,184903329,-1559006016,-236452508,-953257461,351750,195160064,1053041522,1889600822,1913555717,1975520005,638575362,638665985,-1206694639,520028161,568918164,-46339586,-905197429,19745140,14320384,41350950,89033254,-930354989,1913303016,-400104480,510790718,87441092,637886625,-1592703607,-1993996958,45617989,-1809907968,-372690176,-1544946182,-17666,1913437928,869657550,1053034203,-1993997002,-1993991843,-2027545763]},{"sector":6,"length":512,"data":[185011037,-402295589,-546173795,-1998014741,84320259,138190372,1374159733,15525889,-2014772365,512630272,663356790,745858058,421935670,-165317627,1946684231,117323269,-695466730,-208943474,-402331969,678690913,607044639,6744069,1357630323,-200373473,1779317506,-1996197115,973433358,1946491174,1812892128,887879941,-1977668470,-2147154394,1955438308,147191311,-990508684,853570568,-2146309148,-680261380,1946358504,403109383,-881524987,86257348,6720038,-1178401002,-1494024181,-2144991372,1950351229,-190725131,1812347650,1076196357,991977357,-1977650470,-33223138,303971011,-1961332219,-402297314,141758716,1912798083,-1876628733,-190594055,-2000422910,-1559949794,-987888908,-1962576834,524420693,872007144,-1876497445,-1560087391,95486708,-796147501,-2113937371,637542370,-2147328373,-201858845,-397157749,1918630225,1947634625,281182981,52877827,197329494,-1993640741,637884446,-33274230,85107392,278653014,-1017249165,89407113,-617426037,84811400,1577748712,89527945,-1070349320,-1576707933,-1555561202,-1960442540,-1960441018,-1037365162,-1996156254,-133868010,403097539,-958070779,33739014,91489991,1049362431,2105607498,1952201217,63406906,2028533643,-1607568896,111281416,-788085243,118882562,-1962613058,-1962587586,571863,540846764,-678755724,-91490590,-402651706,-1057095108,-1946227773,-2096804298,58064894,-972851827,369427974,87703236,654311352,-1958126197]},{"sector":7,"length":512,"data":[990203446,990147824,-1961986600,-1929033162,784597876,1105921316,607044752,-14686203,1189806962,-104254832,-1929933885,-1077440809,163120358,194111488,242495036,1946928104,1958742535,-303912443,-1048329223,-215961598,-1898935126,23259352,-15537981,1962949760,84451337,839190178,1443283940,244055691,1048773976,1962870094,1312701198,-1006078715,637876798,-1941353079,-1077899568,548930790,-1414813152,-1079268437,-466483994,1949187244,1958742546,1952201764,1967078432,30179331,-1075188822,179045614,1007580352,1007318108,-2147257025,-341179956,-863351059,1602275712,1979136775,10414339,168069718,-1979157056,-2012936130,100992574,-840431850,192022272,57982986,1577092073,1476311273,233328902,1594317309,-2115435661,1950270720,189265413,912749584,49823360,-1961790464,383356119,1031823135,1466070016,-644941173,-550824821,1347680043,1979666774,383421190,-33560545,-972393894,402847494,-471285710,1482578194,1594192731,518780811,-1946714648,50689086,1608451063,-1073085046,-1958273164,177400055,-169278603,-919449858,375330795,168135199,-1962642240,-32838665,-1973500992,183995140,84451520,-117111134,607044803,-1547685115,379716340,1789085701,91005701,-1607053117,-789183226,371508514,1465303896,922701905,1048577254,1963263206,-435763707,116843780,1963459846,4767266,279799,-1961790336,180782022,-1190861121,-1477246972,359985291,-24955707,-102664705,-644951668,82183823]},{"sector":8,"length":512,"data":[1583307096,512505539,2089420084,-1060143100,920643456,87176841,548986603,82755360,1085319851,-1178586198,-1410138102,-1076797208,-1416493828,-141841518,-1425722719,-1425722207,-423893110,-1010814460,-2081649835,2122909420,918894334,1988691258,-60912390,-136929816,-2147466428,-1981217932,919745024,49813126,-219674858,-25785387,-739762410,-2011228641,-1006438378,1426405950,1561252840,918905970,2088961338,1282801481,-13236458,990202422,192281206,922648203,88751753,383105256,137821983,-521644795,-1889837583,-2012919290,-989525986,259258998,976652598,512505349,-919403204,-956085112,-46780,976667958,1229752581,922386116,87703177,1007062070,266926085,-92355370,-1017256565,-24422825,-35126134,1175942408,538971565,1969579069,537701415,544568892,149350572,1444813429,-2146928152,1979252796,-400615931,526319244,-1962773665,-1007329289,922086393,53745292,839305014,906190339,53872327,-1556742143,1157038942,1971322885,88405870,1735655552,-1932703000,-1898738470,868454107,100434139,-880737163,512295936,-617413849,53550728,-1484071798,-472837659,300650379,-2013059909,-2013060058,-1912396242,21293274,658410294,13104899,-1943898752,-2133291312,108332541,-1576848992,646579038,-722074840,-402463616,-1590244136,-339541154,-387872233,20711942,-974649739,-10229300,673611830,-940835581,594863114,91540734,292867326,359989187,-401115905,1150222353,356814615,1829059]},{"sector":9,"length":512,"data":[-386721816,-389873592,-1998061551,-389477391,-1607073732,-294321314,918756016,51906191,919374568,47855359,-600375498,512505346,521536824,87438985,53743243,47976073,53612171,47845001,53874315,110039019,110035736,110035676,1038615258,654259916,1223164696,-351424308,-868095995,-2065166672,845772244,1173825252,637566981,1963425220,585689104,-1977198988,-1977220763,2110006797,1173825042,1946681348,-1960901053,-1090054409,-544537850,-1441943472,-1428126120,648732806,1479,2877520,58690342,-2147432457,1157044596,1954545668,-343493628,-1262384636,151054342,57999676,1489169240,-1010058264,-402164539,1150014502,547567110,512505347,-13237470,-1962729442,-1556740028,-13237472,-402448354,1472451598,78729297,118888112,-1442642241,-1974425000,-1070355775,147293099,-1428126120,-1957641082,-661869629,-1420273237,-2020496494,112943057,1364706051,906539344,44895746,1788987115,-49915,-1007156620,89669251,-117279488,1478396867,1960512261,91219973,28963442,76867584,378268274,-771029672,-957870731,-941788423,-16583674,1394011135,89398923,1527403496,512296050,-745863852,1458101042,1317676548,851574276,113660397,-1340603657,243591423,-1017576845,38701862,1950270470,1300243973,-2091449339,-1070395193,-1410078255,1604977011,88965158,1113130816,-190723102,-1007140862,309675,-215998280,280013483,180847530,87438987,-1425193845,-1425062773,866894475,-1012159552]}],[{"sector":1,"length":512,"data":[85460679,-967776769,194566,-402323294,-779421311,1935198347,-2147125993,108298490,-466484048,1053082617,-1070398154,-1873024007,61884532,84281078,171668760,169507053,1373599204,91621006,191859238,1963050486,-77993948,840922457,1357132480,-387610031,1053032754,1398146358,1931557096,1499355984,-351883176,95443373,28354795,-1957649173,7006401,-1331793064,-236403966,-151358721,268764678,1397814133,554166358,1935170398,1053053160,-970586764,-2144934649,-1002437299,637871150,-402635126,-346550751,910083252,-390057211,-2027498954,106385413,550430876,643762077,736626063,1499356114,-6363048,1397794674,-1159160746,1532927264,784647000,376636708,49692288,-243926784,1929267176,-133437204,250341234,-469056519,-2081881223,16508928,116847474,1946682630,373194759,-462094331,91621006,-423691381,375044,-1599822349,-1314257658,-205507835,-867178325,-1416451182,-1420312525,915123115,-2144991884,-1002437300,637871150,1342195338,-1000929709,637875774,-2147138057,505050368,605996371,1569269253,651922439,1527340425,-52238305,168298182,-402170111,-1041756847,1582848768,-2139955062,1053095050,-947714762,180367876,-1912112906,-1979353570,866782023,214338240,-987845824,-167110073,-986315400,-1425726458,-1423976308,-293362346,-1381653242,-1379365971,75101706,-930365389,-1416516719,-1414807501,477689354,440896427,915093163,1149961588,-1014256890,722519683,-165629498,65776369]},{"sector":2,"length":512,"data":[-1962424445,768499,375301363,516159519,91504325,1435176075,-108847354,640512514,1997360699,1407134503,-388396206,1935278713,-960275710,402847494,-202850254,-227386613,66098664,-1962576866,449217523,-1622096904,168312448,-972000256,657414,1053054726,82314550,-1643683844,-1006189736,637875774,639327627,186209675,723875035,50885578,651310026,118185355,1659376867,-1023315193,-388002989,1935345480,1121945349,-1007096606,-129351417,1410763715,236882437,-150551035,988297218,192473089,113699442,-1962867441,-1962586058,1678674942,-1980169467,-1006284738,637891646,134565248,51412365,-133865922,12060355,-4331520,-351861901,-1899787223,-1912415226,-771848229,-1543408663,906470899,91504325,722492813,175761651,41302822,-756546702,521598986,89825731,89826112,89916987,41353648,-402210766,-1166868617,47980174,24373713,128316324,1948173622,89096197,276270400,-141820373,887683979,1983587850,-402427390,385354381,116835103,1962870031,84844582,975618302,410387526,89398923,1929799656,108259348,1049169778,117376340,11535698,-133886302,1388575171,1183458899,-1967063548,-1950209312,47569,1913015528,-2134375881,-902102827,-997575821,1962621763,512314347,-785709740,650218322,-1962776841,50679862,89170886,-634693032,89267713,1566811,-1007100277,-117128061,717892547,-1999831327,-1962602970,1372056522,89033254,-489469366,52876042,-1017574570]},{"sector":3,"length":512,"data":[-388287661,1049167337,1918567726,-1957473806,1586177747,50037532,-953808521,138310,1124073915,224279334,-1024960649,1966043653,1586046706,29004316,100460544,-2094653326,1962876542,1325344260,-628649442,-404176245,-1827966459,-874327157,-385876038,1499137498,-1964466830,-392662523,-1821245395,-15999097,-1006203531,637875774,638279049,119233929,2122524355,-1837825508,-17829,1476401896,48808235,1405352192,-617392302,86906507,1594201576,868440922,88336594,-160106382,-397228149,1918502274,1976699885,2122524171,74776350,507969318,1950931083,84863193,-389819022,-93190887,-388002989,1935344896,-337671183,113653486,838861562,1963108562,96871940,146360064,-1828411392,74719408,-919340797,61975283,1946731510,871957252,-1851067447,-276583509,29619728,1944586612,13035520,-398064523,-1662517142,-2146011648,292895292,1983917126,-1712828409,41113619,1185611698,-1186509233,333971464,775716864,-1186592907,233308163,-1010660864,-1018234621,1979737832,1625837303,1965257216,116798988,1962869498,1965046809,1240195861,74787388,-1426899024,1967078570,30048477,548460779,-1018254605,6219948,-1018234252,-100219338,118882562,1459939007,-1189076808,-206962683,-1967115605,-396383536,-2143879283,-452663746,-969483915,84207110,1631366339,2050754162,539755127,512439891,772670294,1343379455,772929467,1476503767,1397801819,772929467,1526900951,1397801816,772929467,1527032023]},{"sector":4,"length":512,"data":[792511320,1547437686,-1017335613,918813556,47136384,-1023314943,508757585,369561174,1007076895,113640707,-955382982,212230,54180608,3290821,922265832,54331127,141820416,526303282,-1017575589,55025718,-227212484,1007076918,-969538557,369310214,1192134710,113718787,829,1275512630,-402652925,526317677,-380041381,272367793,54265204,-373096076,916193423,50595574,907310335,47056630,906786303,50607871,-1892276019,-1660746746,-10229565,-388287661,1918626727,-402541325,-831195519,-1099623620,1994974258,910945270,44832502,310099,1542162152,1460064882,-24443106,88471334,410257408,287750224,1935159245,113653263,1342177964,-854514504,283858991,-1405190090,91553794,-336108824,-145299453,-389871777,28639096,1962288360,-617393162,1542142696,-466424718,1022760168,1016886288,-1327532797,-817960957,382598888,54427679,57933827,-85444888,85989006,85862027,784550888,47122118,113651200,771752654,48244361,-98316808,48669486,992893084,1963122726,-425644537,-1038751486,-1459436413,-244056063,776732856,49874630,-1091900417,-1959915240,-1945031906,-1127182648,48760582,383904512,-971041273,134429702,54134470,1023854358,-1996488701,-1157411810,914948922,918881096,518520882,113716983,56492872,1275512622,-1023409917,909692032,49751688,470191158,780744197,-2125069030,-1946091545,6613213,-2120760482,-2097086489,175440127,1183458896]},{"sector":5,"length":512,"data":[-794675712,-1054124030,642961411,1510106871,-466429949,106314534,-989980046,274086694,-953808781,-57786,-989984021,190200614,-989986190,171369680,906301478,49751562,4622886,470191158,780744197,-1004141286,-980675978,-2097060376,58068223,905972927,47070848,-1341819904,-1873614077,572950838,906434053,88227459,504132863,918894166,80086342,-98607361,-838402506,251540994,-1909062961,637870102,85862027,-1993988915,637869606,85989004,-712063604,572951350,117323269,-969538865,183814,784611067,20710682,1047803506,1148519228,-150538698,1014237186,-30014544,906163718,47187654,1048786687,1979647298,1444856577,1117861456,918894085,76023110,-1021354408,-150538698,-797695998,-164178453,268629766,-873740684,1048583958,1946157827,-430053373,50661110,-961448449,33888006,-51789774,-2102125046,-969528627,-16579322,-854515016,-400379857,106546811,512439891,-611450146,989861537,991458499,1343518169,389972022,108266245,-401932824,-1892228443,235068934,-385896417,1726531978,-913512443,-84356120,47122118,-804862464,113704706,-1895824635,-1895491066,-1912267770,-1912414690,-1962921962,-402641370,-1557217032,1482163486,-234702760,922693200,-13761252,772086326,-821748063,233683024,990764333,1942457336,-2054541817,-466481699,47358766,-1916905896,-1039865843,-2128166050,267783550,-75430541,-2084368392,650377467,1997364795,12249126,1032527474,-1960440203]},{"sector":6,"length":512,"data":[-25096842,208801782,216792843,-271454255,-271454255,268429185,650321686,-14793017,-2001448705,-150550986,-4257790,-32446449,1979188028,-1017579263,1912633320,1949666267,78729484,-2124815661,-352317466,2122393108,1930425869,15106314,-1932816,855829263,-1980625930,918894133,1283458420,-2143928315,332606,-1082908906,-1588505776,512623912,-964491914,371492880,378228767,29230378,-390057472,1918370716,1950270739,88965125,281510720,2114135631,-133855230,1532567318,113689432,1342178579,-1957539501,267827651,223230246,-388955533,-1960393981,-108985778,1920270848,-494808949,-997588481,647555280,1225147907,-1957604784,-1094700336,1105723393,1515739395,918899570,2089616756,1006109456,-1976863295,-31517179,-1576725754,378078504,843187498,114368,1912805352,1949746468,276598021,521536906,-1090180702,1499071784,650130267,-166887807,-1962773745,1476503747,1532582595,-768359592,-1813253641,124634150,4622886,-402320990,2045296693,1460060928,1164821542,4622886,-402320990,1709752353,1913085696,859338216,-1977726784,838878990,1975854829,1053046341,-148504516,-2147466427,1460017013,1165870118,1594001128,638219527,1950958981,1166616068,1372029769,-1004544798,-133880786,1187456707,-2113929442,-973013017,402847494,295705268,-59185147,86257348,41222972,521585657,-1977217104,111346022,134661635,113705219,777,373721638,100864930,50772766,309773606,-219944953]},{"sector":7,"length":512,"data":[-1962467562,-150795970,1971323079,652489384,-1609079162,104334609,141888007,168232646,9300479,51652106,1592460153,-130190192,643106499,638742212,280311,1946639624,374808102,-150551009,-1006233598,-1945955010,117626886,47595145,-973074504,17108998,1610321896,1946369055,-9770730,3686085,1963214138,88471054,369652800,381941791,-977012449,-31939,-953751947,-57786,-2147436056,975177037,276104261,1074087414,-1913978252,-16497209,13494304,1962981096,2126849762,71694098,276111360,45817622,-47454208,1053145458,250283380,-986295034,-402638786,123535963,-947656078,512505360,521536278,51658377,-1977215312,111346022,134661635,113705475,777,373721638,100864930,1996432926,1996432916,50772754,-402186402,369619405,155093791,13104899,640054656,-988395894,637737014,1853127,-1011488768,339658038,1183458819,1720329736,-129660657,-1070457066,-26613309,943637814,-542093312,-989510368,-31939,911799925,3686085,-31805,1173813876,91561989,1476463696,-348273213,902039276,100665064,134122271,-1121589053,-108851772,-1941211905,906436293,3684037,1962968808,243873292,-1992949704,-352306642,-1948742636,-399194658,-176881553,-208938866,1820920969,-1948742654,-2093693474,-176816130,1065998478,637683596,-64057,38127398,-1108803585,75333820,-392071681,-389873663,119454915,943113526,3008512,-1993988236,1569465909,1049179650]},{"sector":8,"length":512,"data":[-1942618056,-1946142202,-975270952,1173556,-661719691,-63545,-16627769,-1132795649,1979136963,-1940762117,1002605785,-1017554230,748942899,1183458821,507430144,-32000,1429933172,973567238,41223237,-986286613,989870142,91555413,1946436922,-2093103791,-277479425,943637814,1431459328,12707846,1582980359,-466460046,738653750,511049477,-1190109811,1465253889,1962281810,-464132089,99287732,-1260096024,1583307264,1435056754,174950662,638338444,-1996470646,28836933,1962281728,1183458824,1720329736,138774799,922665704,91627148,538872886,1049179648,-1992948364,-134209986,-1262280938,943638015,2549760,71666256,-804898250,1477735426,-8176187,384464383,-163676129,24444930,-943457853,16712773,1698227691,989033476,973501664,1979188293,88471273,1357083712,-402360833,1918369803,-1075544058,1476674953,16758979,1006912903,-151685889,-260816700,-804898250,-991333374,1569524333,106269456,-1979167349,-1964166459,113653477,-166198537,1946682693,243283462,1461715703,1364721459,112976,-400666029,1512039358,1599690843,54985074,199746256,-117344769,-1070349473,-502888650,-1140791038,-2081649835,54270700,-969535882,16961798,-443874896,-1141708451,-294387140,-1929617783,1183383110,-96024837,-430536448,-1947705716,-1027675918,854216329,-370649664,-764257010,-1946663287,-390057256,124965311,1954595574,-385699830,179306703,-956249367,60998,15877831,-79235584]},{"sector":9,"length":512,"data":[-984058622,76282998,259375115,-568422858,2924802,200427145,-1908378432,-1174457408,-1070432257,-965366030,-1362922935,-1923615115,1577259357,-754667030,2145912555,1935220484,-1871385853,1183432846,-1946799118,-1197149186,-978649087,1317791350,379909098,1751327,101908410,53143582,1332872991,1265942539,1962940989,185005849,1979711251,-96025084,318743039,1952075069,1297759496,1709769588,319004929,-523041359,319227435,-151763319,1946352454,-58801109,-1996125402,-1960383418,1183384133,-1334383626,-1341986040,-128021749,-402465048,1431355966,1561095400,-19207848,-17584,65333278,268785695,301695744,-1019488910,1190580599,410386426,319358467,-1019493006,103530871,100864777,74584843,41337659,-1960918133,-262239784,520334824,1183425906,1050094,-375050,1174604148,-196727824,-1996484563,1183446598,118918124,78729747,-1319574829,-1947675892,-128021560,-390057442,1931414653,-9311997,-2114691445,1913651451,266386179,1408523817,-472709967,-1910584437,-768349090,36104273,1215438681,1952172091,-2117588216,1929511161,-329383621,-768265,-1949993473,228718158,-1547631853,262214393,318219027,320014020,-1944912989,-1547631680,-919399683,320280203,519593611,250134579,57876236,-1946222359,1376978198,-1190960966,-400686716,1510408648,1639574130,56672000,200701579,638940370,-661905979,-661731837,-947702015,-337491452,-806674682,-385839895,1190592193,208929531,-1375963451]}]],[[{"sector":1,"length":512,"data":[-1192474999,753663999,-385876037,-620035410,1586094452,-1545055248,1183406850,1050094,871122569,16482752,-1962511600,-754667069,16788960,-128021680,-779368141,-2098675661,1586387211,1372730348,1577142248,1793655667,1959148542,-79235426,-1960545022,271445062,-39635456,113718802,16782075,16696961,-147420874,-106744302,-942109166,-1962934268,485029982,-1360505599,552099082,-79235583,-1962511358,-1483291,-296318024,-1962933826,-1072958906,-1907882636,-1961588264,-1907823034,1377077720,66090635,-1097406222,-227082406,738627366,-59325184,1959089694,833798,6078289,-1527571318,-1414807501,505372249,175424854,-1527563126,526298027,-2147322683,-108298039,-906058509,-13449334,1929762792,-1963357694,-388287805,41092556,-1343694454,343211959,-15567617,1962873972,110044690,-1893335030,855641094,-1881633088,-1895790586,906004998,47843015,-1909063552,906157598,47980172,33244918,-986306700,-1005390026,-1943602050,1313738845,-1993991031,-986313099,638778118,638868876,-1961736823,669605349,918894264,-1003089157,-1944914114,-969475392,184070,-410267506,-1906958597,-1948610878,216583107,-128021760,164554837,911453,12276675,-1084954624,1526730984,-1959898173,-402465250,1273495557,-1664918593,-230257840,-1962931736,65596998,-1013098496,-76234741,-661774776,73353,911262495,85395142,109983235,-92077346,-1174179066,-628424698,-1058535853,1918574337,64523271,172995]},{"sector":2,"length":512,"data":[-1205408936,-1031589632,-1311059697,-370486525,-466438789,-114915786,920914434,85395142,906392576,85395142,-1231755263,-566821066,340037378,-1070462741,386319926,-1976172539,906303270,-402464093,1552856694,-1900006636,704192,-1526691649,-1515870811,-187831899,905969855,-402643807,24313888,958334659,1962934558,20875524,1513979904,48819828,-1930958080,50725848,-1064419328,1295876134,-2144937356,-730572227,1031848953,-386239398,-177012767,20855078,653161728,200331,51249473,227157504,-555020920,868105704,922258368,906161315,906161827,1342369955,2400566,1929360360,958334482,1946157374,1513979945,-1696067980,1492022271,-1329719832,-1230051065,-331447498,1802829826,1538638312,-402498423,145800702,-1914116117,-1948486913,1509950222,41339451,995283339,918714329,49036931,906327296,49028748,-297893066,242483202,109983238,958792430,117441294,-1942616714,906161694,49290892,-1909025813,-1962741730,721421070,1960479947,-1898904763,-645445182,915417067,45104768,920614657,49028750,-1909062286,-1962742242,721421070,-1948742453,52131024,-1064419133,52332873,243869184,1303576579,-2010767994,1049175581,-628228095,48144694,-1946156637,-396672808,-471220910,-1119557451,-1946156865,-907523904,-385649666,-661717210,1929301992,51284982,-650424064,602514806,-1121916673,-1946156865,-1511503680,638219006,81545,-339929624,-1122965311,-1444345424,1912683701,907179020]},{"sector":3,"length":512,"data":[47253190,-352210939,-1331677459,-337366526,512243422,-135593296,74581820,309725500,1552675467,512308754,1552614122,512308756,-13237528,907221814,320419583,-1133123504,-788085194,28311810,-1011525655,521591603,1404873192,1912678376,1032005155,639202304,1962884483,1173825043,1971322885,910067979,939953157,-688461819,-672447653,1539081704,917837289,7347967,-185925006,-13190421,-352294882,520042227,-320143252,-2145452234,-387354112,1552528410,175933698,-1995422580,-689241012,-397009320,123712518,1455150568,-218102087,-1522055259,76242597,-1962779509,1418396748,175934214,-15842162,1552812148,-1942594036,906329630,92020361,218547766,82444037,-1090054477,163119822,48675338,-684994773,-779884079,-387854080,1150071730,142379278,-351906679,632836246,1529859345,-1897201038,-1951106071,-761055740,172264194,47620918,906904715,-1962747741,-1556741564,1149960916,646460932,784532177,48105102,840842022,-1341885952,650377478,3423940,-1007092989,1929372904,1031808762,-1341884929,1407642374,840796710,190719,-1003568293,637545022,1912888635,1563108879,1036264964,1979711363,233568750,3520592,-133962762,113738584,-617364488,1929355496,1031808521,1124431103,78705387,1406874563,1543487464,78644595,646988523,1946172803,1032005153,1394111999,-367097034,1564026370,906720559,48766603,828193062,1130038644,-128725525,-16398554,512440063,-1993997590,-1959383203]},{"sector":4,"length":512,"data":[637724702,1529961865,515395779,1529859345,-2081881230,-1282741837,641123638,-97536,70912628,-977075851,-236251020,984925177,910175312,4589112,1053046360,-953809606,17221,-1993983630,1555582981,1166616064,-2128193534,1073759053,1329973030,-953810942,18757,1262864166,508559360,-398381994,141754278,1165330726,1197313062,-1017634978,1476471888,779358578,1031144764,-788085194,28311810,515050473,922389255,921227,-1984815640,521536588,-1191005250,-1527578609,-374685645,-1992903966,-1962930674,-1090054414,-30014797,-352144890,532173026,1513082129,-1058340237,350805483,514093568,918894166,1157039418,1579155523,-107711457,1975519939,-459262458,-20906494,911613640,47253190,116798978,1962870029,1460031521,973522742,906269957,87821964,300433668,1173825279,1598029891,242505735,333976555,-150507008,1073759044,-969537675,16961798,-1021354247,1191590454,-117280256,911233987,3946181,-470396493,-1992888317,906312246,87826060,-1007133864,-2081649835,118886380,2123192070,113653489,905970951,84412102,-1030952960,1149898100,144848639,113653253,-1392573177,1929337576,57993260,-1190004805,-1403650037,145282854,-136176780,-388002978,123717271,1988960022,4161777,-397080716,1935474702,61929731,-1017256565,49004594,-1573453904,-5242120,84714038,352765494,-1992884475,906316350,88999623,118947839,8826253,218560054,896859909,-402457880,712179439]},{"sector":5,"length":512,"data":[-1929180696,921174365,381448705,1245088543,201782789,57999109,369243624,977191967,-1193744379,-386844696,61913306,113718979,-64198,-854514760,-399936721,-1957690697,-339810300,-1175920506,975140331,1478194656,468233381,1958742712,-341383154,1974132619,14412016,-1430053098,-2141652245,74776636,-1007091024,-2081925808,1935171042,113653276,-385940211,-969474457,331014,-1342013976,-1008162257,521599159,-29693757,-126745680,1460033054,1608622568,-1340121593,518615555,918894166,-544537286,-1924178941,-402618707,-1336952923,1161307740,-1442745089,-400597425,292880595,276086794,-391316597,-93000924,1958742606,-1436766205,1912624360,-1960896853,-989509058,-402310602,343212570,-385923958,208988928,4030502,910624372,89013897,915087126,-919403190,84674294,-402426625,521535790,87703236,1128658726,24412160,-401873981,636008390,-1211569936,-1396505680,1978318824,1945975559,-202659303,952120142,639268100,989822336,1555039605,-1429960022,-924269576,1946398721,-117264382,5433539,-2094597518,141831741,775782694,1326150958,-1342165784,-337284605,-117207037,1962940136,1843965137,1001747946,-1429769219,-362616660,-347145612,168069800,-389974848,1002695252,1326150395,-402290138,-210376120,61916152,-326908935,106307086,-326412969,-1431556428,410371130,1962921704,984263691,-396921404,1383464899,-1985298382,1206584950,-402229621,1983637930,910128134,84739830,-2146404865]},{"sector":6,"length":512,"data":[3539426,2131039510,168064301,-1993378606,521537142,-1929058626,-396948866,-396377049,55162458,1312490062,-1962183936,41862391,-122276632,-386331669,45089011,-1325857931,123690243,-2086723746,803737284,-1013036618,1510405686,1786052352,976682806,922695173,1444807996,-1070397601,1929172456,-138346933,536888132,-396889484,57933978,652864351,1962950016,116798984,1979646712,116886511,2045271839,1319187968,2025851653,734462728,1319319238,3964933,1555039093,-1246238550,-2147171197,216728009,1007062838,110048773,-919403206,976667958,1165804549,608078134,109852165,516097318,-1084815786,-404225184,1577541628,-385649889,1623109304,-400615933,-1544964747,-2134887762,-629931972,973175936,212718709,1969237024,-1006653235,1074053374,-1012188492,1236628456,-143284493,-12285360,1961418728,92939782,1493073128,1994960067,-386238978,-389814068,728891758,1049173782,109839670,-2094660296,175374653,38111782,1883041828,-219674764,96872185,-820451073,1051985266,-374459927,-1782665672,-103028679,-1977218958,19982341,-336919949,910068022,109852165,-13236936,906156598,47986431,-1320035701,1508627204,-1023158132,-494806898,-1992949745,906156566,47980172,-687923434,47974031,47842959,-1047805838,448702187,-391451845,-1301151518,175505980,-788085194,28311810,20751595,460786290,357892902,390927142,647152011,638928265,-401123959,1418308814,650504966,345591,638219648]},{"sector":7,"length":512,"data":[638670083,-351056621,1173825243,1971322882,1166747374,15738114,1946173501,3161349,565763445,1932512529,1017768894,906654210,47253190,-352210943,7137520,-1073051534,653923701,638406027,-82881141,-1985187352,1418265676,-392238330,-1993952094,-1993994931,-1070395563,-1809907914,1702962688,654294789,347521,-1265833920,-1014244373,1928931304,1582761495,535335711,-401772032,-1159149026,495593208,-521462648,1364434411,-1763124853,-396862466,-672401243,1945680360,911262465,637725345,1479492923,112259956,381010937,-1191048472,-466472116,-1271863216,-386340120,343061554,1109297462,1049179653,-1942616778,-402311162,57931968,906004201,88489609,1208388662,512308741,-1959393980,637878814,-225763960,1359175871,1543159272,909559094,906654213,85278336,-1341819649,-1874597118,-2117520552,1966296315,1954588681,-1182850043,1153896448,-956301310,13124,-11460842,918903251,460457270,66759,906316809,906314913,9182975,1107740470,-369099003,-950293450,905969668,88487621,-335608634,911866626,88213191,636092415,-1195814484,113653298,-385481464,1623195455,-1957605373,-96933646,863131737,1048583958,1979647253,134661674,19666437,376703858,47253190,-352210943,-936384315,65540978,71600555,-1047814677,1925739496,-1326060796,1373956867,1623192203,-101390333,921727577,85278336,370046463,-402213601,-1578630941,-352030012,-352079656,1377718744,-141877498,-402399041]},{"sector":8,"length":512,"data":[-13174326,906316342,88868495,1918443358,1048590010,1979647253,1623151064,-106108925,384594521,356417567,-982319355,-1662511435,-974723072,-1209287310,860338513,-1174453527,-1320091644,1354814212,805572388,41302332,1487537924,-1007951271,-2081649835,-1040774420,91553752,-352320072,-162625192,-1929881975,1586297438,-1962467586,-137393158,-222284839,-1977200722,2045312837,-1341950747,2122951260,1428100860,1571626984,-1946386748,-6297407,-1696021877,-1430244609,-1946659131,-397019570,1935540102,-761186803,1951415298,1946500308,-443811376,-385650083,-706106674,116799146,1979647245,919439874,84414088,1996569795,2145933068,1594913782,-1243019600,113653418,-1342111023,183757569,494164160,88471334,158629888,285980752,-346345523,520041989,41091192,2146033643,1173825194,1954545669,179851273,1529859345,-13178645,-352291810,438209505,520049408,1918566524,1525203713,-243971151,102679545,565727575,-150551040,784603138,29295908,651135744,-401910133,1599727248,20717319,-1007035532,-1321304018,-3997694,-1023385570,-967375330,331782,49743558,607044632,114437,-1960390773,1575489622,520576998,-613154500,520078329,1371734116,1707659,87441092,-1993949133,-397331643,1935278013,-1327503350,-1209472286,1507947519,195,0,0,788331215,49419913,1747355950,378285572,-930347926,884789390,512505455,-1992949686,503334966,-661733325,-1553215304,-930348888]},{"sector":9,"length":512,"data":[520137379,1442973160,-1631647986,243712,-1412890965,-1330986958,-963925053,-1411871573,-1414807501,-1414838101,-2085901504,-964491321,309514,61974003,-1426906960,72122462,914961923,-1942618062,-989842402,29157428,134497526,-1992886924,905981494,3153548,-982567235,-97484,-1612158860,71628545,-277512192,319719990,-1997721085,-1976169908,838878742,234895094,1444806726,404669750,1127713539,1451763267,1988634112,1381061377,648955624,906118795,3540539,-1556741002,1499070518,1591250011,1988699679,1586243090,-27910636,-1899823418,549815256,526304226,521048555,780926347,-793247690,96797547,648216592,-2117039360,-1955868438,-2115042326,1426286317,-2089863489,243931335,-315490234,-1426055163,-501299325,552567799,-1409286216,-787495549,-754732579,63605997,1031125,49417867,243912076,-980548878,1241943078,-1900006653,-1077899560,-980746110,1735,44257675,1161472,-947672077,2865414,-2134922253,326285312,-1426060871,-503134333,80184314,-1426057543,-503134333,-943354886,1577106438,-1073297898,113764864,326303937,-956251229,1811972102,-2079930605,-955020032,34822,-1978234623,-1811495168,-954921472,1358993414,-1677277419,241042176,-1090056673,-930348964,-2097147975,-492109113,56146170,-1325396219,-1930898684,1207436255,48119433,-224308651,-388527358,521055733,855644351,-1330992192,1161727,118401779,2891404,-1101439654,1049325366,-819265498,125238843]}],[{"sector":1,"length":512,"pattern":0,"data":[66650953,-1896005135,-1772033595,101107254,-969532925,198406,134661686,-952762365,198918,1347618304,235079355,-625743865,-1022928040]},{"sector":2,"length":512,"data":[-1,10649619,1329791149,538976334,103751712,14549214,33554648,14549634,48366278,14549730,994115806,71516676,1141123907,172491830,76040708,1376034891,174458065,81291268,1829033068,-1267858344,82735108,1963214963,1104,-16709888,33031176,125894405,-2012712712,16260608,537196575,-132054280,33038854,604370979,-131791880,9381895,708874025,-1892999025,277818464,777031469,-1892732785,65392,-1993474048,771792414,10487436,1364219595,508909394,-986819834,-1962893794,1200230991,314480642,66061056,1997225200,243254283,620699406,149619636,-2118909008,28574443,-1642150610,55019776,1562314587,1482250847,-970011810,50402310,67162000,50586368,79,0,453336832,993013851,223490096,1792,1006633144,-972589811,65798,171729387,121391732,512429173,-478150379,-854674425,138199824,1048579445,1946157313,17759988,-1958941951,-1191111394,162791425,117313741,27263233,408065,-2145094143,64062,251528564,-960298751,65798,16910078,16924288,-972525031,402719238,-1979706904,-1979645386,-1979645674,-1274997186,-1022309118,1006698400,1007186946,-1341885437,-1970803958,-1291774658,5291296,50403233,-1912530682,869830336,10534655,-66617159,389972270,1958215681,-1952058613,-204633149,-1021374805,-847248712,64666154,1946724588,-1171934981,-202505256,-1950119003,-1330908211,64535081,-2130528018,-706008371]},{"sector":3,"length":512,"data":[-397342493,-1437007865,-773195550,-2034224130,167842822,-2144242240,67646,-466478219,1038620365,1226142976,172180297,1224897984,135170115,152996097,911361,-680214517,74825738,18097800,152996803,-33060095,1124141070,91602954,135200323,152996097,1606140673,839879173,1959332845,1975519762,21445381,1194984427,50754561,199683033,346080219,1975519745,138313776,141819905,17374859,569051018,382534068,-1073011340,11798133,-622127411,1979693032,38242828,98176,1200227189,-1642150653,222791680,-369222679,113704462,-973078252,67590,-1897057506,436651741,113647108,522060828,-589046037,1191545382,-503312920,-70128649,-400617954,-820051966,1381061456,1426478934,18286279,-1198082048,-661782464,-33535583,-6082868,1963408384,113716743,-1342177001,771777184,-1744759134,-661929981,777013131,-1593769565,78708814,521070803,-1778312797,1560283624,1516134151,-1017619623,-16712258,1952136228,9169155,56886471,512351027,149618949,209009468,17172222,855758568,-1022916160,309473340,242694460,738313960,-1274575312,15005194,1027392263,1060901748,574361460,658244724,80159349,94503842,104514305,158662917,17174270,56886471,26339523,80152456,-1393884254,-2097141829,1065354179,941978624,-1946913529,1606091079,503530245,394920187,-896797134,24496395,1021378369,-955943653,-1023192828,-939709208,-486474490,658031363,117441652,378271970]},{"sector":4,"length":512,"pattern":0,"data":[-617414399,281871028,-108993045,-1594919143,1871315200,1961691649,986578434,-1979549755,-20085016,17729997,-1965823231,-1342111706,16890625,-4669205,-1191777536,45809919,-1196168447,-152365055,-1560215135,-1360330493,-1560214623,-1494548223,243714355,-454557434,126501120,6011731,-1014814838,-229373,-533065868,1200353909,352723198,354813953,-498902271,-8984099,243910963,431358209,16782986,18169482,-855244616,-10557168,16846475,-387189366,-1057092942,-218700750,-1020252155,-402586976,228851694,16883713,-1543510552,113639696,-955711224,184617222,-14948095,48955825,-1031091917,-243857604,243795570,-370474758,281870516,-768351253,17176198,1290289730,-402158848,460717412,237632395,113639675,-1962934008,-1175387145,-836041177,118359804,-402152205,-92274649,-2011729405,369229655,-637337349,16465537,108134600,371841579,1204158715,113705215,65208573,-81884221,503530240,-75431674,108134608,17174270,-1014895637,79889759,1077760]},{"sector":5,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,-855638016,1009787921,-955878096,71430,1997552816,-16333302,113639424,858194176,-1143238949,130482284,1334575346,10795778,49219527,771903372,10362565,789465031,273648646,16411625]},{"sector":6,"length":512,"pattern":0,"data":[352489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6029312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1543503872,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1428031064,1364350551,1491140435,1582979419,119496031,-970006273,130822,-637077714,1946288129,251538971,-2127691265,-16655834,-30489603,1963065094,243346951,33554908,777212099,30940811,175495947,-843579208,512306735,-620035624,-75295116,1460761608,-1039681530,-855637573,117321258,1594294785,1354979419,784347731,33621638,-260784118,-1144911688,718077953,59115,0,0,0,1162891329,993870926]},{"sector":7,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,3997696,1024095415,141866753,-298909906,-805326847,-1547761906,-970010878,-16646650,1482184792,1582979419,119496031,1048587983,1950024355,1039958031,-58716300,-2146798577,91497468,-164692178,-526176767,-20584447,-100233426,110046721,-1892810244,-402531834,-13697400,771873334,32907007,110046876,-1557265956,782172642,31538816,-1641974467,37487731,-1092084108,-25499394,31629614,-600375506,922693121,-13762052,-821953994,-495583428,788409832,32251532,-367621842,-1899459583,-390033704,646513123,378274278,-795999768,-402198852,266863168,50775810,-2147310847,1023533374,-1645714059,1474886657,-1339460607,508996188,230284174,-1073042432,-503155542,-1168236552,115867909,19785729,326306420,-713817540,-780926148,-402527256,-1142423022,-401413375,132645344,31367426,-1593713501,-492633628,-401175039,-433681663,-39065599,-1593880599,-538443261,-959583488,-16653306,-365509346,33799937,-12812036,-964492427,1153868807,-1273036545,520068121,44171766,22527490,1202978994,-165740644,12183553,-1075265164,-1145277440,41091164,94444937,989626369,1093411957,-8269686,41222407,246685065,-165740644,-1303923711,26787328,-165740644,8513537,96085110,-1673808895,32907007,-367606498,4450305,104759327,175454721,-1274964038,520068155]},{"sector":8,"length":512,"data":[378143222,246678018,-165740644,-1170492415,-6553258,-402524642,1048576067,1962869220,33792133,91602954,-33422688,1894592,788468969,771874977,31078143,-165740754,-1892770815,771874310,-1023286109,-364985338,1031808513,-2096925185,128583623,11555011,33425030,-1017593602,96425724,53906177,1962281729,-1396100301,276052796,175423498,21495681,1101721975,-164368917,100630863,-1978961407,1949252613,1952201971,-968361745,914948101,-1025310461,519881566,32126661,179101323,1007711424,1007187036,1006924847,-1947241158,-1947472930,534482163,1364414659,1504970327,-6497485,-1560152546,512295714,243860260,378077990,914948904,1049166634,512492332,109839150,1594295088,-1017619623,-1168307528,-6552798,-1023281634,891598854,-165740644,-232879871,-200897535,616040193,55228965,-165740644,-987839743,-1207832042,781985060,32907007,12108575,-13722573,771880478,33560200,-1305280072,-13722624,-1023281634,775094712,33560202,520040092,-54328842,567095476,171827334,-1173785853,162793328,550314445,1996690493,2925042,125091851,-1262449146,-1205744311,567096609,32906889,33031820,-852152392,-299988703,-268006399,12060417,1009765815,125148415,-843644488,-1207112913,801965568,913686538,1459790783,3598586,58023931,-1660915736,1286866549,-85253683,-1191223320,851060015,-1205744381,1572480289,-400438013,12124006,7322161,-1564597811,6285319,-919350037]},{"sector":9,"length":512,"pattern":0,"data":[-1409252930,125159691,1912610792,-386632683,242614296,108159292,41384508,1101668396,-921968149,11535220,540853162,154930548,1027344756,222037364,-1007156620,-2144943111,259275581,-1927346658,166263157,-1161945344,-1107039481,29034376,-1157371136,28901378,-1395225856,125091850,567099572,-1007359166,1868787273,1667592818,1329864820,1700143187,1869181810,604638574,1629515598,1852141680,543450468,1701996900,1919906915,225666409,1346437130,1145980240,1092628256,1195987795,1866670158,1768711790,168653923]}]],[[{"sector":1,"length":512,"data":[17061097,84148994,151521030,218893066,286265102,353637138,421009174,26,0,0,0,0,0,0,37225013,37225016,37225016,37225016,37225016,37225016,37028408,37684328,37683775,37683775,37683775,37683775,72811061,37028405,37028586,37028405,37683765,37683775,37028415,37683765,37028415,37028405,37028405,37028405,37028405,37028586,37028405,37028586,43647541,43647642,43647642,37028405,43647541,43647541,37028650,48890421,37028405,58851893,37028405,37028506,37028405,37028405,37028405,37028847,37028405,43647642,37028405,37028405,37028767,37028405,906413870,1342308353,1677492307,-997578121,-1948200552,-1476448552,283640120,146296832,1479200128,146297027,1479200129,146297027,1479200137,-661309,-13739941,-1962859986,1007127258,-2096794113,126486467,74825738,18718766,788513768,-402579806,126354040,522094894,777542401,20055695,872845102,37152769,572456750,1105763329,777211906,18816651,18784302,1482360712,876019502,922693121,-1930952398,-628371457,973176704,126522997,788493288,-402579806,126353994,522094894,777542401,20055695,872845102,31909889,572456750,-236413951,777211905,18816651,18784302,1482360712,876019502,922693121,1021837618,-771043329,-1031128716,788473832,-402579806,-796261924,-1892788133]},{"sector":2,"length":512,"data":[771830278,20186767,771858408,19013375,27977884,504793646,922693121,-13762252,-402574794,-372244737,1482424078,71127888,1024422980,175391749,1950615613,1141456133,-620020363,-1014351500,788451304,-402579806,-662044284,-1892788136,771830278,20186767,771835880,19013375,22210716,505317934,922693121,-13762252,-402574794,-372244825,1482423990,-1073065136,-628419979,973176704,126486389,-2013175320,-23271161,-1946223639,25133278,-1963821766,-26286073,18784814,-2013182488,512306695,1482359071,839290670,110046721,-504889036,520039936,-392429278,1397752044,522095406,513814017,1527220225,922693208,-13762252,-402574794,-1949303241,-402158630,-1573978588,-1993473762,-2147410146,91568892,-2013203992,93005319,18981422,1966800000,14739462,1527089190,110046808,-1892810446,-402574330,-13762432,-1677647330,1342213096,564145747,92808705,522095406,513814017,1527220225,922693208,-13762252,-402574794,-389022257,158597341,-1607575461,-922877667,-36640305,-1031120805,-1444364034,513945341,6219777,-796210946,18981422,520040092,-1269825246,-13722599,771826206,18749066,976145150,1963008262,513814024,497167873,2095601665,1431359485,1183575179,102837766,1719730486,1576926982,1431356248,-1590760309,1174995254,-1017619194,57983230,-33553432,440189896,3939703,-1607595915,-1574043363,1364394270,-1147605878,-670891774,-1979217362,-1017423387,359809340,141974076]},{"sector":3,"length":512,"pattern":0,"data":[225599804,158825020,1613504524,83871720,-1209482432,788475647,-1343749850,788475647,-58719958,772109318,19803903,74580284,118359157,1456471984,-1070378672,448393355,-2071319040,994443523,-503024186,1505768436,12803672,-1275068416,-2044605136,51658208,-608564365,-855002106,-850611167,51658017,748810359,1958742784,-1064434168,567101876,-850217977,1394510113,1426492421,-66642427,-1409253186,829734922,1947024556,13297708,-521603468,45848576,-1395129599,91491644,1946204136,16509187,1947024556,11200760,-1058474380,-351827968,-1338657585,-1994273499,-1946081762,-1274992634,-853102539,706644257,738626561,-1338657791,-1994273489,-1946079714,-1274990586,-853430219,572426529,604408833,100710401,-1073074227,431235444,-1202708019,801965569,-1962867778,1751550,-73075718,-854674342,-850611167,-1258624223,-31339239,18719424,-16867352,-1261401400,-1172189938,632292626,567092660,-1341842758,-853167066,86161953,632565680,12198349,-1272860670,-1172189915,833880150,540811725,171710068,725357172,993791604,154929780,742131316,1027342964,3598531,661799212,-1001368826,637883166,1931560762,1606690330,1370706710,56353782,1207379672,1950351427,123426822,-1161576194,162793161,1286873549,1631330765,2050754162,539755127,1986939331,1684630625,1918988320,1952804193,1227125349,1919902574,1952671090,1397703712,1919252000,1852795251,2361869]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[2775629,262161,12976160,36241407,681052160,2244,30,13500417,147128762,406454272,411828224]},{"sector":6,"length":512,"data":[-1957363712,309484,-16219416,-706214794,46433034,1962934845,73304859,-1979431169,-62486521,-1979425141,1094555655,1024029696,410255442,636207155,553535175,-58818560,-1961855701,101318214,250282100,33441479,-1947538688,101318214,-4718474,1575324671,-326412861,-402632520,1586169891,357037574,-1207602175,65732728,1342208696,-2096507672,1586168516,357037574,-1207602144,65732732,1342209976,-2096513816,1183646404,1996443824,87746564,-1929067389,-397365178,-998045915,-1337553662,8566864,160950352,-1017256565,-1192457387,-991428592,106859271,134247584,1586173255,7774470,1193332983,-213465579,-230242749,106859265,-1743435894,-1946794359,1183384646,-230257160,-230257328,161605712,-2096839549,1979776638,17020938,61401168,-1962752893,1438866917,314109067,124643328,-175417769,-971837821,1445986628,158459990,-1341864829,-1977289116,-316014260,1183432963,7381502,2097038905,7512328,2130593337,12695562,56682576,-16595837,1182991438,1187447302,-352321282,-27358445,2123097041,-399376634,-998046115,-28901630,956581515,-444793274,359972875,1946157373,146714,54351476,-385649408,-370605936,10795008,51701840,-1962752893,939460190,-2080484376,-1073085756,-1531442572,-68661248,46433026,1342202296,-1957642189,939460190,-2097100824,-1073019196,-675804811,-605532160,856091394,-1528278848,46433032,-16359797,-32315337,167953539,-1207274048,-397410058,-998047046]},{"sector":7,"length":512,"data":[12630018,1354773328,-16359797,-2048392585,113541888,158711819,1342232504,-352151064,1354773254,-2096602392,1586168516,-398983418,-997982768,1975519746,16168970,41478224,-1962752893,2013202014,-38344702,167953539,-1207274048,-397410058,-998047138,12630018,1354773328,-16359797,703071351,113541888,158711819,1342232504,-352174616,1354773254,-2096625944,-1531444540,736645120,46433026,-443850914,-1957313699,19839212,1443229416,1356088973,-16353537,736625782,113541890,74760203,1860943923,-19757427,74907472,-2097125144,-2037578556,-397345070,-998045672,-1913615614,1358877314,-402360577,-998047576,-762934012,-35106562,46433031,-2104627061,1183448786,-230257404,74907472,-2096782616,1183646916,1183666186,-2037559084,-11469102,-998045610,-733573882,34400336,184730755,-1194167104,-1956708353,1438866917,45673611,89778176,8894550,74907472,-2097009176,1183384772,-2585602,1065418310,-1962511104,1183384646,74907646,-402229505,-998046397,-27358460,-1962648021,12977782,108461824,-2096663576,-1073020220,28837236,855829248,-443851072,-1957313699,309484,1443167976,1342212536,-402360577,-998047278,-1982297340,1065418334,1074033664,-1962654071,-1991769018,-1950810554,1183535104,1183400190,-1410838276,79987457,1586092171,4161790,1996481653,108461828,-2096837912,1586169028,73280508,-972654965,1996423168,117106694,184730755,-1207601984,48955393,-1956724685,1438866917]},{"sector":8,"length":512,"data":[1387850891,75884544,73304918,973176704,126487413,4205976,-335657335,-28915963,1996423168,-1371107842,24242256,1074054275,-4717195,-1924142081,-397365690,-998046040,212226,1183661684,1996443822,3926020,184861827,-13798208,-1981283210,46433030,1586229387,-8880124,1405580380,-2096728088,-259325244,-1733410166,201213577,1035171008,-1368129444,-1956724685,1438866917,-1070338933,-16516376,1307051126,46433030,108461904,-402360577,-998046810,1975520006,112645,-1070398741,-1017256565,871140181,63826112,-1207666945,-397410160,-998046327,112644,95807568,-1017256565,-1192457387,-1394081778,-213465597,138840858,-1913108855,-1924074938,-397348282,-998046293,-213465596,105286478,-1946794359,1183384646,-230257160,-230257328,93186128,-2096839549,1946222206,-18427,-1070398741,-1017256565,-1192457387,1558708238,-213465597,71731994,-1913108855,-1924074938,-397348282,-998046373,-213465596,-230257329,-230257328,88729680,-2096839549,1946222206,-18427,-1070398741,-1017256565,-1192457387,417857538,108461827,-402360577,-998047105,-28931836,242597899,-402360577,-998046376,71697154,1183515627,1575324670,-326412861,-402649416,1586168551,71761668,-967047226,-1974996154,1183319622,71732216,-1912977783,-1924074938,-397348282,-998046505,-25263356,-1207602176,49020927,-443826125,-1957313699,833772,1459791592,25421910,-62486120,-2147197301,443809855,973176704,126489717]},{"sector":9,"length":512,"data":[-1897377640,46433025,-1996472019,1183054918,1586168324,-62486010,126370052,-972661109,-1959132857,1065354334,1393325404,1074153099,1827164224,-1958221054,1346436166,1074153099,1491619904,79987711,108314635,-369098824,1586168087,4161540,1996430196,75950086,1023591555,226361347,1342215352,-402229505,-998046579,74907396,-402229505,-998046591,108432132,-1962887959,9877758,21335376,23717968,-1962621821,1979059184,108461838,-2096872472,-259325244,-1979288061,-28932092,74800188,1560168134,-1207958330,-1924136808,-397409979,-998046616,1975520004,-28931567,1465255048,-2097034520,-141884220,-1699193365,1166888960,1172852737,79987460,1182121995,-1996601718,-2012902908,96927302,105286400,-129595064,1342217656,1090012811,1358579337,-2080482840,-661977916,-2131206519,-462094273,-1996601718,105286405,1979336249,-14882557,1341816459,1183489259,-2147186434,57933884,-47895,-1645738378,46433027,1962934845,10467341,108461904,-2096913176,1996424388,7333894,855819395,-1956684096,1438866917,247000203,18212864,435373766,1358055053,1358055053,-2096948504,1183450308,-1947981070,1438866917,247000203,15853568,10632832,-954305280,939586118,-1996029768,1183709254,1183666418,-387428110,79987458,10618566,339148799,305594119,74907399,-1962908952,1438866917,45673611,11659264,74877782,76156651,-397351894,-997982295,1174702082,1962949760,71732205,1575324510,-326412861]}],[{"sector":1,"length":512,"data":[-402652488,-346685305,108432153,1586171115,121154564,-1014299531,1015026411,-1084160,1586168902,4161540,-1070342283,1575324510,-326412861,168052363,1007515108,1007055457,738359162,106888992,-1017256565,1475119957,-1962467754,803407950,2123094411,871860996,-17984,-146690318,1993030617,-1949594878,108432382,1149937395,986264575,91750213,-348060300,-1949174014,1566531265,-594847293,175298603,17964603,-477428622,-1947606529,-326413055,119428695,-1962508661,-1178586121,-1359806465,-1948649663,-678755202,-1031035661,-1017290914,-1962822209,721420854,16679415,-1107070448,-1896214528,784630231,57932551,-2130621975,922746596,18622089,438733110,-1312388351,1222693636,18391862,567095476,25076534,712180284,1354773278,381296398,-855002103,1329908513,775037011,1919885360,1952541728,1914729061,1769304421,224683378,-150789110,145033,-567557236,1253366775,-1942609459,-1962838498,503327798,889239574,-1992941107,906040350,18220684,12066574,172341797,-1959386675,-486354930,113587746,-628358446,-13182157,1929563678,13428995,-704199370,-1143305214,-13238269,117624350,-624952289,120633602,-1070346453,370584307,-1343742201,310020,-851181384,-167087583,91521218,27037568,-327595200,-402476568,-625278450,-621051646,1393062658,1130043391,-1175262397,-517275642,-1962835778,-217639172,25094308,787017011,-1662496521,1393167616,1801675124,1702260512,1869375090,218762615]},{"sector":2,"length":512,"data":[1986610186,543515753,1869771365,218762610,1869366794,1852404833,1869619303,544501353,544501614,1684107116,168649829,-306572623,250425865,178975,567099572,-4710634,-404205568,-1173311231,-437581313,263855537,1440672522,-326898549,-1101637882,-397016620,-998046958,-1913091326,-11532730,-397015946,-998046691,-96040698,2045269846,79987459,1593460363,1575324511,-326412861,24919683,-16485376,-16679914,-1880619914,1575324417,-326412861,2123060823,-1962571004,1300955741,106269444,-1962379893,567085693,108956503,1569260937,72190210,-1996073591,1167001717,855929354,-402068490,29231763,-1996125440,1599999093,-1957313699,119429100,855932555,-17984,-1047810318,-654884800,1438866783,1448602763,2123040542,869763844,-17984,-1957712142,108956663,-4595829,1101984511,-24389129,-1527516277,1600045707,-1957313699,-1957275668,2123039862,-1962467834,-1178586145,-1359806465,-1948649663,-1968770053,-919339196,1929332026,1090876421,-772341013,1600045451,-1957313699,149717996,915101271,401277316,1342180536,1342290616,-806865665,113542140,141869067,-2096970109,-462094276,1946172547,-2093184199,1187450055,-1979711234,-1986509051,485227078,1033373066,74776831,49004594,1586169226,-28901378,27035528,1207586559,16416387,80207477,1599995904,-1017256565,29886095,24518286,-1047803597,-108271221,741772105,1962281728,-221868536,1974355374,1083655674,-41157084,-989600303,-1930944746]},{"sector":3,"length":512,"data":[-1949332484,-1946352644,-1912138004,1240871902,2122911203,-1404746496,1975519914,-1980505350,521535566,25437833,29894399,-1142125739,-75431206,141755098,1528299347,-219462845,167907816,-2146798364,1962935422,71747076,382017278,12058900,522308901,47189643,45811683,-836829440,71731970,567102644,30017167,24518286,-2135029994,865643520,1048585938,1912799614,109989989,-1070399444,-772290421,-1359808373,1963276326,63407097,-772290421,-1977157749,977356549,1007973600,1007186978,1006924809,1491825952,-2118252778,1328278272,-15991253,-812912268,-1014277310,50708739,-121600,-57941973,371131934,-1331367161,-880039392,8502815,-930410773,-31194108,-57941973,-1423948872,-1047812877,385125290,-594849761,-1431503221,1031061514,527770172,-2147025066,-1073042431,574369396,2105542517,74800383,-303322545,-12204473,-388633856,-797704137,-12167602,-1409187834,1958742698,2484232,-504629899,1274317738,1945320267,126332168,-335657847,199003122,-16615982,-2111403769,-903414015,1946762241,-1021297662,1458342741,-2130413941,1963054334,105182780,-1976142580,-1952970940,-152841768,16936071,1153902453,-1979514876,-1952970940,-958148136,16936071,24905415,1153898342,-1962803198,76088388,-352321096,-318865100,-164858623,1963722308,121932326,-774337640,1820849891,393543938,1342308536,-2096510488,1149829828,1958742788,105676806,867822344,-443851072,-1957313699,1988843244,75399942]},{"sector":4,"length":512,"data":[-2125696000,1963054334,121932325,-890744680,46433032,376750091,148891734,-1979530109,-1952970940,-958148136,158855,-25093397,460653036,147056726,-16595837,1508377716,46433033,-150576000,76136499,1577337993,-1017256565,1458342741,901379635,-52153856,-488623444,1442087163,3477246,646448757,300613684,225764362,-1157613894,431554562,-851397632,-1564462559,-1956773835,1438866917,1656286347,-101324799,1988843095,-1568240378,48669694,-1560000885,1183515358,48407304,-190595021,49455874,1962949760,21620995,1948597376,17492227,49022663,-1070399487,-1560089949,-291306790,48276226,-1560091485,-123534628,49980162,48760519,854261792,1965898880,-100204794,-2144867582,209005372,48891647,47974087,384499712,1965046912,-365001971,175439874,47974143,117376235,-1975123208,-397371388,-998046201,1975520002,-256354625,-1863823358,79987461,1015083147,-15567570,1174594566,49068118,91875408,-1962621821,1815904496,113706869,131808,3964998,-1595341963,-1744532992,-23165303,1946174781,4668682,1480394100,-16157440,-2096965114,553557638,-23165301,1023435565,1047986197,781434883,265725951,49153791,49809095,179830784,-2014818304,46433024,146297067,-1192039680,-303366128,-397361101,-370474592,-352321096,-1632174091,35580158,-24388629,264520171,264834976,264835017,265424850,265424850,265424850,263327698,265424850,263983058,261885906,265424850]},{"sector":5,"length":512,"data":[1048776631,1946157812,49455365,-381280021,1031863974,1191605285,1962950016,734497781,-396996410,-998046946,-369652988,1600061066,-1017256565,-1192457387,1357381656,-2091493384,1946813566,-301531388,-532774142,376700930,48373387,1468729227,-129595134,-2080745847,67297798,1048783339,1946157806,-501314800,-1995994366,1187510342,-352321286,-501314803,-1727558910,-1980217719,109312598,-2097020190,194622,1183518068,-96072712,1183516020,855829252,49718208,48641675,49168003,-2094369536,2097216126,75399972,-971541238,-1958335228,1452013638,-2082932742,-621346606,-1980217719,1187510870,-352321034,-163133691,-41222144,-15143037,-11074442,1996487286,81783032,-2096577405,189502,-396943244,-997983772,-334591230,-1983370494,82574926,1177552070,-113013,-1072955826,92992127,1048773768,1946157786,2086747143,539787267,2105558854,-428539649,49168003,-1592494848,101384938,192152284,16154243,28837237,855829248,1441288384,46433026,-443850914,-1957313699,571628,1475814120,-402208938,-2097143806,1946158206,114192,-2096962911,33743366,-335788407,-501314765,-1995994366,109313094,184681186,-955943488,43449414,-386107649,-997983936,-2081387774,189502,104401524,74646252,49034891,49299083,1048837675,1962935034,250107655,46433025,-59310250,-2097058328,1048773828,1946157818,-152545529,46433024,-443850914,-1957313699,178412,-1577675032,1183384290,-465665026]},{"sector":6,"length":512,"data":[108331010,49022663,922681350,922682074,1996423916,-432603388,-25755902,-2096921880,2122517188,108291844,1191476867,1048778869,1962935032,-331447535,175374338,48641791,-2096928536,1048773316,1946157816,-331447535,175439874,48641791,-2096932120,109249220,-955776286,194054,48931072,47973899,1996427892,55699710,184730755,-1207601984,48955393,-397361101,-443875036,-1957313699,-390056980,-2091452937,193598,512440437,1342112478,41911042,-1978565632,512427078,931857118,76023807,233563178,48117503,-402360577,-998046955,108347396,49547007,117376235,-1956773134,1438866917,45673611,-173414400,1048794711,1962935028,74877777,1249834507,512439275,1342112478,41911042,-1609466880,512426728,1066074846,92801023,250340394,48117503,48772863,-2096972568,1967129796,-200868092,1321634562,-964706293,49561219,-1962445568,100729926,1599996658,-1017256565,-1192457387,1088946178,-1957275659,2123039862,-197229818,1282736130,512439787,1342112478,41911042,-1978500096,-568423676,-15758590,-1999009017,-337368569,-566821106,-1744532990,39053392,1074054275,117376117,-1958345996,-1073000505,1048822901,1962935028,105286407,49415681,-443850914,-1957313699,702700,1475663592,-432633002,-1983892734,1183448134,-264336392,434656770,46433271,737822345,75377656,-1325205855,737727235,-96566280,359989250,1965898880,-398556400,158674946,-397371220,-997982572,-398556414]},{"sector":7,"length":512,"data":[192163842,125763339,49954435,-2095483904,1946158206,-129564922,-2097127704,194110,1191118452,7334140,49954435,1462138112,-2080462616,2122515140,158597124,16285315,887620469,-163675392,158597122,16547459,1122501493,-92864768,-18290602,-2096839549,195134,113708404,2097896,-26482601,1577239683,1575324511,-326412861,216580147,-365001740,74711042,48966576,1352147120,-1946289176,1438866917,-1070338933,-1191973144,-397410256,-997982744,-163675390,359993346,47857283,-1341885440,-1341985960,-397371272,-997982772,1575324418,-326412861,-402652488,1448604603,-2147060085,242559548,48373387,48367235,1178569474,-13419797,2083536000,960266291,1043934847,192217828,1966095488,-402209018,-1409273854,-774927464,65130977,65130959,820609992,1015085451,-2147124176,-478267076,-1996202357,1590070079,1575324511,-326412861,-402652488,-1101597869,233505437,1178076298,-1207601916,149618689,3964998,-1070338443,1575324510,856191683,1575324608,-402230333,-4718579,1575324671,-387697981,-1564278783,-469106298,1048585077,1912799614,1931623437,1914715149,-351948795,322736135,330302070,-687693125,24683416,-339440957,-326412809,-1946901016,1438866917,-1679233909,1575324660,-326412861,-1946906136,1438866917,-2014778229,1575324660,-326412861,-1946911256,1438866917,11791499,1426284777,-326898549,-1957275900,1149896310,-2086037498,-167349248,1950352964,-18426,-167716119,1946224196]},{"sector":8,"length":512,"data":[105676806,-2131825888,-2147350964,871302756,38046144,2122971275,105182974,-1978698488,-1952970940,-152841768,16936071,1015754868,184843307,1460829951,-1979419393,1352140612,-2096933400,1183385284,71601150,-956004032,33489476,-1979425653,126354502,1156999915,1316291590,30736001,1149906293,-397371385,-998047639,1975520002,2080818997,-954767871,50332740,-1744354166,-472786805,40667078,17090305,-1195840765,-397409792,-998047478,71600386,108314635,134630528,1283496939,29295622,1183667968,1149915140,-397371385,-998047018,-28931834,1962835513,-13506301,704923274,-1956684060,1438866917,1586228363,352027396,-75296387,-166953984,1073847431,28837236,855829248,1438866880,-326898549,-1957275900,-13433738,56617046,-1979530109,52692548,1014301244,134628598,1149898613,-661940217,-2013862959,1946223212,721718055,1183384644,2126515196,1962889243,121932292,1407733912,113541890,1962690107,105676807,-16608,-1996209013,38061828,-947191808,-443850914,-1957313699,82609132,-859941289,-335596799,105155095,8628632,-397014156,-997982343,24395778,147227463,43267641,-947133581,-443850914,-1957313699,73305068,33443712,-1017256565,1458342741,45529943,1962950531,-1207493079,1609039877,855995649,619420096,-1543625664,-1197276490,80188930,-964493311,-29047036,915013630,1317733052,-1898411004,649408,-443851169,-873872547,-285637888,-2143160205,2005663457,-1951532030]},{"sector":9,"length":512,"data":[1946265854,-1053079486,-796191373,-1464995837,53769217,132546,1149892491,-1947800578,51148030,-28538375,-1991720661,50719493,-28508423,-628308341,28703361,-1943665292,-1996307426,650314367,46663366,-115454,-24435340,-1464995837,-1947044863,-1053079298,-796148365,-1464995837,65172481,132546,1149892491,-1947800578,-1073018809,-661781388,-31058965,1946339342,1037601808,91488693,-1071739354,-348681470,108497853,1508425779,1959148288,1073816589,1307088960,-32672768,199818829,-1778027520,-1695855026,-1013333965,-28996783,57934248,1095354411,2147465793,-971621594,-788236798,-1946847766,1925579713,1925317397,601028365,-389665854,141885452,-355347721,-1070340747,1364378457,1946164712,-24422632,-234622837,-16890681,108497407,-684992885,-27948726,-1017489064,-768389037,1347572254,1342177720,1256726278,147096321,536869507,41179994,1472451083,172919638,-1962654069,2123040342,119428872,-1073048580,-108850316,185496842,-1341490734,-604526035,-150941053,-1829270566,-1072967117,-235470220,-1829636205,805622663,41302332,-1951783164,1975716802,1325762786,-2012903764,995098436,1492480759,-1017290914,-1947432107,-2013920162,1948254620,1107474446,-779368141,57876941,-151277847,-2147378041,-2115435659,139365120,503731851,-54512889,-259303849,1709439627,-230683976,1362261422,-903098485,-854531255,-268198879,-1274776675,189393673,1177515200,-1174404423,1085539018,74654157,887818676]}]],[[{"sector":1,"length":512,"data":[443858955,-338195623,-812953147,567134763,-1645214820,162792563,-1073014037,-2013915531,1950351772,106859275,1964654464,82573315,470333689,-1962773927,-379625786,1317796643,106334984,567099572,162792563,-337383957,-411713525,27035638,-1962249152,440369370,-336067723,146340310,1439755036,1586228363,107446276,1438866895,1465314443,142508806,-1086819072,1451950364,71731974,-402164408,661782611,915097835,1950876012,1962359569,38046477,1443645065,1577073384,-964480909,1828618500,184840961,-1207536174,-342228993,-2082829539,-607055933,-338492495,567101620,-1986860686,39094532,23869065,1594343475,1575324510,206474179,1278867339,-2096335870,-25099066,-227212948,-1958745095,1914438618,-1898738887,1979136961,404633862,-2094632191,-607055933,-338564143,-147067951,-654112395,721516193,-1262448936,1914817866,1979136781,404130052,75993601,12833163,0,0,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,690169920,1920234593,1663984233,538976288,858665248,791951392,808399409,5242934,20971840,0,2097234,536887584,621346848,973081203,1543518720,14895,684837,6029404,774766638,1543527424,0,1635151433,543451500,1651340654]},{"sector":2,"length":512,"data":[1864397413,1634738278,1701667186,1936876916,1668172032,1701999215,1142977635,1981829967,1769173605,1224765039,1818326638,1881171049,543716449,1713402479,543517801,544501614,1853189990,2035482724,2019652718,1920099616,1090548335,1936024419,1701060723,1684367726,130416640,0,0,28639232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,284,0,0,0,0,0,0,0,0,0,0,0,25264513,1,0,0,0,0,0,1127940096,1279870559,1313431365,20294,0,1280,66816,0,16908288,0,33947648,0,58982400,0,67239936,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1848115812,694971509,539831040,369098787,219677186,202116105,-63481]},{"sector":3,"length":512,"pattern":0,"data":[302846719,65282,0,0,0,536870912,168624128]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[30431821,393235,32,32833535,-1952710122,0,30,94240769,100728832,136708096,137297920,317128704,320798720]},{"sector":6,"length":512,"data":[68073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1919243776,808334112,16842800,-852446128,1038124577,91357972,1979913277,400538126,162799374,856039885,1489719488,-1946160965,771752470,521606793,-785659508,268434049,79234931,-1948069120,386857690,1358685067,567086516,1979661400,403814957,-1041752306,-1337150458,1377947135,1511041512,540864235,154928756,171704948,1949056195,1950039048,1950170116,118407936,-1090495298,549000134,-1197149440,567097088,-401176530,804945939,-970060683,1544808710,805750318,-2118231020,487112448,-391329485,-92995660,1962916584,1947024629,104476241,242488296,108159292,41384508,1101717284,-391324437,-92995696,1962907368,1963801845,-350179323,537694219,343176764,393504316,495690286,-1172371938]},{"sector":7,"length":512,"data":[501749320,-1360322810,621215278,782756628,337905406,520528107,495455881,96874467,49906432,146675826,-58675939,202339642,1918975008,2004499462,-385225982,117374747,166401034,1946172588,168230404,-853953516,484876833,-989929334,331759242,108330762,-527775862,646498558,646452092,646452048,100668321,-729148060,-1193637294,567100425,-1023995022,1952059904,397523468,-1157706263,-941025315,113726206,977345937,496174791,-889323428,496047616,-1849794380,496353053,1918509517,-680155514,16743552,-169147788,567095988,108396348,-384298566,-889258354,567086772,-467760074,-1994453476,-31661538,338804418,567101364,-852155464,-568424159,-536441828,623097884,-854434630,891598881,512303565,109845722,616045788,306690597,118366669,-1273763398,-1172189893,-1418586070,523966091,486741641,567089844,-1273804358,1008848145,-402426625,516227651,1200299234,-391956990,71797276,-1573469954,1200299239,-324848115,267926812,-30010510,907290118,338101959,-952696840,-149673722,-1556723457,1200233706,-1947979249,653735624,20323560,907870982,907871137,485230083,905970181,907871651,484967939,905974789,-1960896093,15696380,1928870657,-1963357366,1468729423,-1960899066,-1608565986,-922872964,-813235788,1347899730,111289805,1064523796,407045831,1347949907,-466434938,-1172814429,1105729601,1599690756,63241818,-388767017,192220867,-1140897815,521017748,-32627735,-954365434]},{"sector":8,"length":512,"data":[1662611974,427080469,1477317609,-1957144488,-1407239370,259258428,192213052,-401232966,57937649,-1953486613,-1961032898,1092414478,-1426866126,-1273804358,857853210,-397389632,-387447534,221243402,-402399768,1038615296,843887629,-1088303680,-141878008,495455883,-1605371645,-218295319,242547886,-2145580865,1966735741,46629691,-12110101,-148154571,-554234508,1963130499,-8552441,1191277882,-1174403642,1001659656,-1889590835,-401837307,2092565382,58386456,-33506071,1192495878,-960497781,326934547,914968490,45093862,567093684,1946172544,-16398845,-1274848792,51809050,-2081780963,567090117,-960884300,169987347,860976576,7769024,990401512,1930700606,-147110364,-1992294028,-1961033922,138340599,486475519,486489659,-336919947,338116155,-348126349,1958743010,168216087,-1556086252,915085513,-398058237,-977663630,49211416,-1494543692,1964113024,-432633073,157607955,-401041478,233505496,336215680,-1173982206,-907536143,188645378,125042708,-1273745222,-1021194949,484589253,-1962586742,-750105901,64228066,521014101,521910979,-851967816,993430305,147227423,-1189244481,-1527578613,-1174403642,-1705894781,34996285,-1391606141,-1580168362,-1073012965,1950884980,522625080,-400715358,914948309,-1008198470,-1103722240,11921436,482489993,-350439238,-2014801876,10872832,480786057,-1996443416,-1172526538,367729828,9562256,479409801,-402626072,914948249,-1850073961,1033523740]},{"sector":9,"length":512,"data":[1577195008,-1375943037,-141821813,-288158799,2090625,522993280,-2095680256,175246590,338626246,-2096925584,-167047954,213779317,-784955136,522756124,-1960996446,-754601481,1072071150,-717846272,742293532,91488287,338626246,483375616,-1023293464,95535755,254142675,-930396160,-1056710447,51678142,496091120,-218102855,378532,-2114810941,-1023402010,95548043,-427692333,-1950154737,-754339342,2145812974,-1127841536,-722943225,-2145618681,1935934,113706613,334109139,433133193,-400962118,113639784,-1023402614,337985152,-1995279360,-400960746,-1598421072,-1979253221,-3741667,-2046709565,1007945734,-1106479872,-1779952662,444054023,-1006653464,571729,-2144951053,1965096829,-2092871929,-227407623,538983553,2088765045,309600258,-1180029264,-1527578621,-8552410,1325626656,-1070401813,1371756970,-850177456,335979046,1482316632,-1106742439,2095584603,-1008176117,376780425,-1173835288,-706210189,-358497536,377076508,-1962892312,185865486,-1593215799,-1447357417,9627670,336400011,158648587,-1156313183,-2115496252,286165760,1959332628,336830729,-401154373,463536240,1958742804,385334036,337919616,-1157401344,243996424,1441273463,337223936,108314635,-401173829,-358547384,252062492,319171348,386280212,419834644,453389076,486943508,390380308,-402642968,396427346,1096223,1589371639,2680855,-1944119391,283804618,280674859,-1142753536,333977459,-1952201984,484941853]}],[{"sector":1,"length":512,"data":[653780018,-768402037,484976375,-1994947933,-1994947562,-1994946034,-1172864994,31987584,-1705852160,34996285,1377276346,369114522,-340081918,-851725293,-2142190815,1320254,-1796733579,-1106449410,837293038,446282246,872303592,-397061184,1432159633,1977957760,334544435,-218100807,279990436,180847530,-1425404184,-1951677813,866846278,1487645632,337839814,608075777,427032596,-402652743,300678805,486278910,337985152,-1173982208,-102229238,1482382845,-384611906,-2142240357,1320254,552076661,-1106449410,-1108864021,446282245,-1191323672,1431502849,1560616168,-448954283,-71419275,768275,-1336892173,-947672560,161081354,-1413313621,-1425783157,-1414807501,587646552,1048576276,1946162212,112902,1576935656,1237211227,28305683,-2141693091,1320254,-2101727884,-1877546213,337985152,-402295552,468450735,-401347906,1002046796,-754530533,-31717607,-971142650,-15432442,-386050072,117374696,-1746330372,23849217,486278854,134661888,1426063380,-326898549,421935916,-1157204193,-1377232492,624853000,326369300,337788544,-1106479872,602412010,408205829,-1090611224,-57994379,2931031,-1956993805,-854477606,108954401,179205120,-399805248,594675004,-401347906,113706230,459807185,433260231,-843441145,-2063153639,1508441876,-26810114,-385803799,1371471694,334544659,-218100807,-402099034,-931986172,-1090628631,1149899593,1964025875,-289516014,465156627,1593624040,269700224]},{"sector":2,"length":512,"data":[-1962688280,1178280516,1444180998,-1173098818,-1410851916,1183538940,574916870,-1962695448,-1073011644,1149962101,1958742822,-289516010,465811987,1593608680,1149878323,642025764,-1962704664,-854412077,1958742561,-27334397,-1089252930,196678651,1973875456,323600112,-1475132278,1444050192,-1173099586,1340611513,1283481340,1256722451,1149982211,71711522,-339864716,464828947,1593587176,-1996208501,786965060,608471811,125157387,187057291,1444312256,-1173099586,333978563,-1070375172,-1994111863,182986308,-1261204733,169987346,-2094304064,1946158718,334215711,567098292,1048581747,1946162213,334151180,-1174167576,-1175971294,-45422341,-1034033781,1237188612,323286547,-2142735088,1319486,82314612,-2135495935,1320254,-1957490828,59500766,-401055302,-208929524,-394153893,1156972824,108333075,34817270,117377652,234951701,-2048191465,336660223,336793089,-2130740503,1319486,-1125644940,-1340151040,15132802,336398079,336530945,486358656,-2146798592,-386985116,1357447773,137822207,1149981460,1996443682,147227398,1461513919,-76486576,-1072997800,1001664116,309469645,1543357928,336070287,486293120,-383290112,-997982437,-386757880,783942360,-2063153636,1911095060,-16389636,-1962359677,46328050,-400918598,1048640220,1962939426,367770344,337985152,-1174178560,988288529,1440118023,340233043,-1962800920,323600375,147293015,-218095431,-1957273948,1474830964,1566268933,-1994111863]},{"sector":3,"length":512,"data":[1525229140,18778623,-1948349667,384311927,1393718528,1526803432,909899655,2087916583,1946158312,-1954747410,52233022,-165311746,-373092156,113639639,-973071107,1900038,486612617,-919347573,-2094893173,-479067394,485242427,-397157001,1952121064,45410518,2133082485,14346323,-142130853,338114107,-24950413,990278146,1981606966,-396930783,1337590283,-99162086,268417630,338050688,-1174178816,-397148161,1499136213,1944591851,-20876286,-2145583610,1319486,914951540,-420996111,468564481,-151296024,1963987783,-29458363,1047855132,337788544,-1606978304,-466477849,484976375,-1948125360,737184762,1461396551,185233958,1510372818,376619579,-1991157166,2139694199,12052518,-1174303000,-1712842010,-208971271,486612619,1962281923,447527455,24504402,-108861350,2005530163,611813666,-400132215,117309577,-1947525891,-2095388998,1962943615,645891035,-371886848,512491385,-24436933,338050688,-788040704,188320743,-271465473,965475843,116471,-271513484,-271454255,-410914863,-960294913,18091014,337839814,991857409,-24422881,338050688,-787975168,-1980562458,-775725548,66257902,-1947217417,-787582148,-773664286,-2115841566,-352317465,15171844,-1980101648,1455644220,-208973485,486612619,1493173480,-960274853,18096902,337919616,1442018304,-1957276077,317199431,-964469248,2144520,-1040276237,1593393384,247684443,106859295,338107963,-1464138126,69396761,-523041615]},{"sector":4,"length":512,"data":[-523120077,244044497,-511697688,200407008,-163810085,-1977817290,-470994232,-386692341,-142082272,-561251870,-147003310,486874763,-32277344,1397903560,-855637575,335979045,1482316632,1760036211,1609200644,1388575491,484589253,1426313355,-350286320,-2046709553,169084678,-2146601536,1319998,1253705333,-105977831,-1709885,337788544,-186072320,-972655361,1937670,1894595,-1709885,113640820,-402645615,-1950154751,147227635,1461513919,1593330152,496090966,68385952,984656448,334078122,-1963488342,-1273791466,-1407070905,-76169206,1593740110,1946172544,334077969,1962886456,179087873,-1442614080,11598059,-356596822,-4397037,-1088581186,1622417041,443687373,512900737,309681210,513031808,-1609861888,104471953,41164433,-1007041544,486751883,629865987,1951458314,-3896824,202645510,1476757520,53906371,-1169799651,243990530,179051754,-2027784768,-33625870,427094663,338247227,117377909,1153831961,166397183,453443472,-12270060,-689815032,337327755,57996811,-1023409688,-385946904,-941033294,-2063141129,259325716,109494323,-397405148,-1571291127,-389868508,-1161625599,2062030285,-385649405,915079390,1179000067,-1962933574,-1407391218,192153768,861074055,-38278958,1123190618,-1070338590,337315463,-2145625927,1319998,1522075253,337486620,-1608676445,-466477849,495658743,653775411,1386421480,1410763036,1443793180,475052572,-1007146008,486749835,45762118]},{"sector":5,"length":512,"data":[-368145664,145271836,27812980,1364615285,209735250,1996947329,-386757866,-142082780,338114107,-2091432589,309461758,485242427,-147125129,-286783372,147126011,-1168239755,1048580095,1946162214,-17917,-335732504,-2134575590,629148276,1997471615,199974678,1963050230,17662169,1521544031,-498966951,50068,0,0,484589253,235490699,53906207,-1085913571,-1561853951,-1957210624,-1950338057,1343649558,-1118416303,1189613682,1031823101,-2147126043,1752498237,337839814,608075777,1232338964,1343911305,229921618,-1581637171,-854608877,1975519777,6940677,-1564543509,768275,1558750451,-1178586368,-1426915317,-1425959192,-1951677813,1464289077,1593858536,-1413313621,-1185392037,585629697,1482250998,189423199,-400526126,1465253921,65795979,1079531866,1482167010,376903209,-971385414,1937670,-1007325208,1358915817,-1992538196,-336300968,-1447143690,-2147156461,108935484,1311769798,-1017187349,-768360397,24507915,-68753213,994113415,1930700598,50234117,512421747,-13493017,653779959,-1950147352,185868342,-401705738,117372582,-1070394334,-941076400,-2143894537,1313854,-2143917708,1319998,-986291852,-1977818594,-315486385,1334507915,106400520,780672782,512433415,2090868539,-1261896173,-813215487,1347899730,111290061,426989588,486999806,407045831,1347949915,-466434938,-1172814429,971511873,1599690998,63241818,1506796247,487001658,-1175976587,-1264618496]},{"sector":6,"length":512,"data":[-1172189939,1001657392,1048584653,1963004938,-230430717,-434730442,-854674404,1857733409,512308761,-2143938192,1935934,-952760459,-1038519802,-169154535,-434730442,-854674404,-1337150431,-1675506177,-635502802,1963080732,-1075250422,-1337150209,-819868161,382021371,616045786,773967141,484316869,-853204040,-971043295,1313286,-1258322712,-838881204,-852708319,-790507487,-773729823,-790507039,-1949431058,716460753,-377413171,-1047853124,-523107151,78759434,-523116333,-1839545846,357809859,1539179499,1364414485,-1610197166,205263878,212861558,-125049806,-1785993263,378082479,914953597,2075792767,-180164587,1377147578,369114522,201439234,-397401651,207156534,-2012857824,974091284,1947502854,-1979303413,-371624684,-1073021074,1499094791,1455642715,363402889,1377150906,369114522,343194114,567085748,-1091240472,2088768630,-462159617,975178924,1947502086,-2029635062,-352160748,1589643987,65475,134217728,1061109504,1061109567,1061109567,0,0,0,0,0,0,65280,503316480,1061109504,1061109567,1061109567,0,0,0,0,0,0,1229324288,808469836,1212362800,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,771764013,3014702,538976302,538976288,773857312,538976302]},{"sector":7,"length":512,"data":[538976288,8224,0,0,0,0,0,0,0,-134217728,1046287,1627389952,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,1853423616,1247900265,1699114593,1918979426,1299345473,1967815009,1819626094,1399289153,1666150501,1987006068,-916232892,-535505132,-166401516,185924372,487919637,924134933,1310016277,1769101077,1881171316,1702129522,1107326051,1965057121,7629166,544501582,1684104562,1631715449,1868767332,1851878765,1631846500,1107321204,1663067233,543976545,1836216166,1392538721,7038309,762212174,542330692,1802725732,1667584768,544370548,544501614,1853189990,1867382884,1885433888,1459647077,1702127986,1969317408,1375761516,543449445,1819631974,1766064244,1912630131,1768186213,1996515182,1769236850,536897390,620768833,1919230067,544370546,1679848229,1702259058,1728082725,21,1091920640,1953656674,1699881004,746156660,1852262688,1063613039,360906784,673215269,692989785,-1677713345,1342177301,1633841010,543517794,762212206,542330692,1802725732,1124732206,1769238127,543520110,1852785408,1953654134,1936682016,1751326836,1936615777,544175136,1701603686,536879219,1851072544,1868785010,1634887030,543517794,1869771365]},{"sector":8,"length":512,"data":[1852383346,1919509536,1869898597,221149554,538976266,1986948931,544502373,1701996900,1919906915,1869881465,1818846752,620765285,543368547,1635151433,543451500,1634886000,1702126957,658802,333977135,1680153995,1936682016,1818435700,1702130549,1713402738,1684960623,544106784,1663067173,1852399976,1308634739,22,1815684352,1931812964,1953461280,1679846497,543912809,1667330163,958726245,622879852,1931812979,1684103712,1667592992,1936879476,1815684352,1931812964,544417056,1746953253,1701078121,1768300654,7562604,1684814117,544417056,622883621,1768169572,1952671090,1701409391,958726259,622879852,1931812979,543434016,1919251317,1818846752,620786533,543452217,622883621,1680154739,7546144,1684814117,544417056,1819635575,1700929636,225649952,538976266,538976288,543434016,1644196645,1936028793,7235840,1868785010,1701995894,1768300644,7562604,1684814117,544417056,1767994977,1818386796,1852776549,1936286752,958726251,622879852,1869881459,543973748,1869440365,620788082,543452217,1713402661,6645106,0,388694016,5937,168630068,1125617152,1869508193,1212358772,1263748171,1310744864,1870099557,1679846258,1702259058,1125618432,1869508193,1212358772,1263748171,1394630944,1414742613,1864393829,1396777074,1313294675,1679844453,1702259058,1226289920,1919902574,1952671090,1397703712,1919252000,1852795251,1986939172,1684630625,1769104416]},{"sector":9,"length":512,"data":[1931502966,1768121712,1633904998,1852795252,1125643520,1869508193,1212358772,542263620,1914728308,225734511,403898378,1802725700,1920099616,622883439,1095114867,1680154708,1584128,1140850688,1667592809,2037542772,7546144,496048199,538976288,1931812896,-1860675584,225649949,538976266,1752457552,1953459744,1970234912,3040366,487069797,168653605,1176510496,543517801,544501614,1853189990,-2147471772,622694680,537529715,1866670112,1767994478,622883694,1869488228,1868770670,1734964334,1937076085,1869373984,779316067,-1860658432,1090519069,1931504748,1768121712,1684367718,1818846752,695412837,1701994784,1852793632,1969711476,779318639,219728640,1920091402,544436847,1853189990,1176513636,1918988320,1952804193,1847620197,1931506799,1768121712,1684367718,1124732206,1701999215,1869182051,1998615406,543976553,544501614,1998611810,1953786226,1948282469,1768169583,221145971,418578442,1668248144,1769173861,1663068014,1869508193,1868767348,1852404846,221144437,628303114,424411251,0,1701603654,1819042080,1952539503,544108393,1818386804,1633820773,1919164516,6649449,1970499145,1667851878,1953391977,1835363616,7959151,1635151433,543451500,1920103779,544501349,1701996900,1919906915,3014777,168653605,1931834149,-1860582400,29,1936607488,1768318581,1852139875,1869750388,1763732847,1869750382,1679848559,1667592809,2037542772,1158286638,1702060402]}]],[[{"sector":1,"length":512,"data":[1818846752,1763734373,1869750382,1629516911,1914725486,1634037861,1212358772,1263748171,538968110,1145586464,773870153,1634082862,1684368489,1920213036,1735289209,1953259808,1634628197,1830839668,1869116517,536882788,1632116768,1852383347,1768710518,1818435684,1702130549,1713384562,543517801,1853190772,1702125923,536882788,1850286112,1768710518,1970479204,1768172898,1952671090,544830063,1920233061,168636025,538976256,1936027460,1953459744,1769497888,3044467,1176510496,1953722985,1970037536,1919251571,1836412448,544367970,1763734377,1818326638,221013097,538976266,1953391904,1948285298,1668183410,1684370529,538968110,1819033888,1952539503,544108393,1869771365,1931488370,543521385,1969906785,1684370547,538968110,1851867936,544501614,1868785010,544367990,1852121134,746156660,1869770784,1936942435,543649385,1953394531,1702194793,536882788,1766072352,1952671090,544830063,1948283753,1818326127,1696627052,2037674093,1869488172,1864379936,774774898,658732,1142956064,1667592809,2037542772,544434464,1852403562,221013093,538968074,1851867936,544501614,1868785010,544367990,1696607790,2037544046,658732,1159733280,2037544046,1935763488,1646289184,2122849,1802398060,1953784064,1969383794,1929405812,6650473,168653605,1226842144,1919098995,544437103,1802398060,1864393829,1818435694,1702130549,1680154738,-1860450304,1124073501,1869508193,1212358772,542263620]},{"sector":2,"length":512,"pattern":0,"data":[622882676,537529715,1920213024,1881171301,544502625,1936287860,1768910880,1847620718,1881175151,1701015410,1684370291,468910126,958733713,1646290028,1936028793,1936286752,1886593131,627401569,1701996147,3040357,7218,0,168624160,538976288,538976288,1870077984,543452277,2123106,1970040662,622880109,1919098995,1702125925,1879056484,622694684,1931812964,543434016,1869568,1937664,544417024,539780133,2122789,496049305,0,1663394853,1663394853,2122789,7340,7569,7569,1663394853,1681010725,-1006607579,-1862270948,788529181,20]},{"sector":3,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-805306368,35]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964]},{"sector":5,"length":512,"pattern":0,"data":[1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568,329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"data":[-1173627415,87886320,-1172605952,37554645,-1173130240,138217883,-1173654528,188549511,-1174178816,521013624,-351950360,1914817804,-850545454,-89969119,21817610,1527182894,208929035,1527182894,57934347,-820950039,1527182894,292815883,1912732800,217874674,-997986953,46856454,243281408,-83621029,27336462,1975520011,229920774,-145219123,-16079098,186742015,-400722496,988283445,-1911393533,-1274370298,-954086071,698118,-64040960,37808138,-393494477,-1576335710,484969223,17185024,-955878389,-16056058,1529250047,104397579,58002169,-117365271,-1070378805,1543931438,1958742539,785395205,-1017640196,235536570,82372639,184565376,-2096073728,721214,465176949,81061898,-1157698565,-873985472,4096004,443875339,772447393,-1593829725,-1557263714,-1600061430,212020746,1275115520,521019853,184616647,109969408,1236536357,512434637,1353976474,-90103347,-113344502,41222154,113688627,-16708871,772445742,177604239,-1744400594,118380554,-1191149377,-1510801344,567103924,-1709274834,-1940868086,773967307,184616647,-970063743,17496326,-113344466,1685323786,-1258291269,-400437944,537198602,1943550720,-12523253,-1320612936,-1008151804,567101620,-970002574,719110,203793198,99614757,326242304,622234414,1003684620,721974992,16417232,772043536,772548001,772544419,51127713,512306904,-1209529611,785918975,183443081,-795948916,-1912119876,9431256]},{"sector":8,"length":512,"data":[-4657869,50759679,-49909,783549556,1048781261,1979648769,-17962749,989950952,1946875670,-1509505514,384303370,23259137,183965243,1374160244,-1192039679,567097088,202970760,1966078592,-2007191290,-972285426,697862,-1089727554,109985329,-1174664465,-836039641,-173955853,172810,183316223,-889191960,-661957808,-851179336,184840993,621145024,-789118975,-389851045,-389349375,-617414374,184356491,1578635,141871674,567099060,1576584,1961769539,-851528696,422479905,79921920,-1275064391,1126288702,516159970,1370771539,-611442227,3415749,-1557264501,-1607595356,-527826918,1532495753,535347999,-15931136,-1269804258,-1591620271,-611448156,3415749,1532495753,62571295,-35395319,-401935200,-227147926,151255681,-1075313803,152812034,-1962755608,-1962219242,-972362954,-400293564,1153827498,767164417,44099593,-1023409688,-854849608,201373729,1170416077,-1207260742,567098624,71110771,-1173981952,-1897330242,-5707523,-661920277,856965306,1107343561,275915213,508034233,183443086,-1275002694,522308927,1052004508,-1655168563,-1053096846,62568564,-9115639,-1910590997,-1106579682,-1665597184,-372114374,61723187,13796304,-1021314846,-1207793478,378086690,512491530,567083020,-33473350,-1172189760,-1057094421,-1161616947,65538394,-1191677438,567086081,1596256626,203949626,985858421,1963730694,-71042590,1364657694,-1948414384,-2010250172,235463974,147046151]},{"sector":9,"length":512,"pattern":0,"data":[-2097149767,-1527575866,-396404392,521076405,29222994,-1572797350,-990508873,-167086976,-2146900730,-1729559691,144227841,1946273014,144752131,204226185,1381389598,1504990033,1499144653,526212698,177290889,177407628,-125049806,1930686339,835331,177538758,285180672,-8190604,-972720879,17470726,178405001,1980891011,-1191670979,801965312,628490044,95733643,494022605,504010146,-678748410,855637945,-961613120,-400228539,1170604338,-350289665,-1794718184,1049296906,1049168940,-405730654,123780491,334035591,-1791066111,91488266,-352254232,145275438,-1962868248,16574678,149227254,-1173785472,162793659,334176717,-402083654,1048576230,1946159782,-34543610,-2080512023,252355134,508632181,-1858681593,-1967171830,768264,1604645884,-1168564474,162793591,-826662451,11593736,184878838,-1274710785,8907011,-854851144,10086433,11804684,204146234,-989956748,204015162,-989958796,204080698,116828533,1946225499,4096026,141819915,-401972550,-18153362,-1559585631,-4718570,-165556916,-16059898,113640820,-1979643149,-401908714,-771032245,1048776052,1946159873,17221382,-2080375029,696894,1048774516,1963068066,117884434,1048772619,1946159873,17221382,-1962934517,-388527164,520617258,149338831,-1174401560,132647088,-352145408,146324202,-133581744,-1017634355]}],[{"sector":1,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127010692,128255899,129435570,130811847,132777945,134154227,135923722,138086444,140445775,1953067607,1919950949,1667593327,1631724660,1853169764,1311011945,1914729583,2036621669,1684095524,1836016416,1684955501,1631855648,1109680500,1663067233,543976545,1836216166,1394898017,611018085,762212174,542330692,1802725732,1667584804,544370548,544501614,1853189990,1867392100,1885433888,1462006373,1702127986,1969317408,1378120812,543449445,1819631974,1699161204,1634887022,1631985772,1920298089,1750279269,1852404321,1767252071,1952541807,611217257,1801678668,1869174304,1769234796,1227124335,1818326638,1142973545,543912809,1851877443,1176790375,1965048387,1635148142,1650551913,1394894188,1769103720,1646290798,1701209717,2019893362,1684366691,1344562277,1935762796,1850286181,1953654131,1936286752,8299,0,0,604638464,1684104562,610758249,1953067639,610758249,1920099616,606106223,1769104416,1092642166,539232781,1769366884,2123107,0,218103808,1648436234,745828975,1952797216,539785586,1869506377,541025650,168624164,1701603654,1819042080,1952539503,544108393,1818386804,1633820773]},{"sector":2,"length":512,"data":[220474468,1986939146,1684630625,1297040160,1145979213,1297040174,1227098637,1919251310,1768169588,1998613363,543716457,1852383268,1769104416,538994038,1851853325,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,226059361,168633354,1836213588,1952542313,1633820773,543712116,543321962,1311725864,606093097,1128618053,1767990816,1701999980,1159989773,1919906418,544106784,541415493,1701603686,1344539149,1919381362,1948282209,1646292847,1948280681,1768300655,1852383348,1835363616,226062959,168633354,1713401678,543516018,1701603686,1851877408,1936026724,1684095524,1836008224,1684955501,544370464,1701603686,1835101728,604638565,1701012289,1679848307,1701408357,604638564,1699547661,2037542765,1819042080,1952539503,544108393,1869771365,220471410,1851867914,544501614,1684107116,1297040160,1145979213,2037588012,1835365491,1818322976,610559348,1631783437,1953459822,1635021600,1126200434,1095585103,539771982,1953069157,224882281,168633354,544239444,1702258028,1919950956,1936024431,1650532467,1702130287,1663052900,1869508193,1868767348,1852404846,539911541,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76800,0,0,256,1]},{"sector":3,"length":512,"data":[-16777216,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,979304448,1600061487,1600085855,1600073311,979304543,1600061487,1600085855,1600073311,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1846238720,-2147483637,1543503872,1811939328,-1962934272,3,758066432,1879048193,3,1493172224,1767993934,0,0,0,0,0,1213481296,1329791037,1162892109,1127169347,1095585103,1127105614,19791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1274585668,-2044605136,51658208,339543410,-1173195261,162796454,-1064558131,369506598]},{"sector":4,"length":512,"data":[-838962176,1483040,-1593140061,-1633484790,827658,-1207263069,78712047,-913512237,631488771,-268425972,1930428421,203792643,-1593043037,512491522,512494621,512494625,-173863915,872859402,-956284140,169095686,1225505280,-355269455,-274480597,2924810,108314635,337446654,1085803499,-754667252,64654568,201696194,12107918,-2011050697,973871382,1964256022,338468881,-2146176350,1318206,-1574566795,431226894,-1057087027,-1609894750,-1073086372,984884852,67826850,1048640832,1962939421,520494611,-1107255361,-1866923875,530903808,959270,335586300,-1091118616,-1968439168,65876680,218416881,-486506050,984369480,1947479302,1946762486,419838706,-385649652,836960480,537701449,125134396,184878790,987294719,1964256774,458271,-1643722997,-1945991158,-2146787298,-15462338,113687925,-352316400,26536374,338626106,113641333,-352250864,805714598,-1995344620,-972357322,720902,336594630,24176897,-1955240644,-1404466717,-2022360516,-1014244557,-1404486173,343027772,276248892,-745852884,-489561391,-472786429,-454305789,338495034,104471412,359926809,-1404485661,338495034,104466036,-260764647,770392398,-952021360,1323526,16482568,-954304640,169095686,-1594130176,-2095943168,-338620477,-338564143,512355281,149623858,331266704,567085492,-369160983,1095631082,1448203915,104483244,158602285,91490620,-253033757,-12270010,1023588352,1181884877,12114059]},{"sector":5,"length":512,"data":[-165556924,125141186,567099060,848311531,63602934,-851181128,1540590369,62476635,-1260702976,1126288702,-628360734,567100852,567100852,567100852,567099060,-379460775,113704609,-1207954403,78711872,-628299565,94618115,-1597993460,1149768749,-1957077249,-1407967682,755382857,1007252500,-1442483191,-269810973,-1105309354,247010290,1166681600,43903231,1229324917,378250483,520492062,-851640136,225582881,1052039307,1582899661,1055466211,322747134,1025554664,57999425,-401377862,-222428578,507415315,964884,-622091021,184565376,103707648,-611561292,567133070,-1207956801,-1934949752,1018735576,-661869823,82557099,-1411871573,1449612,-1207806022,567092526,1483015,-1945461597,-1593829858,-39649256,152996874,220105740,287214604,178896652,337524363,337460864,114854912,1958776351,-1105261028,1460016160,-1962802200,1595868919,-1962249465,-2129387978,235684038,1049175583,2088766185,108345857,-385449178,-1431567862,-92946422,-348223194,251602442,-1977218325,-2146765786,-2010758972,235484966,205372191,-338492239,567102132,183568070,1086195201,48916,183436942,1363737785,-972832373,-388823887,64588864,-284804159,91379978,-336357144,1324417802,-45090557,133997811,-1980508184,-1156909290,1219821567,512303565,-75426764,124915712,-1995440197,-1273744354,-1910387384,906757406,-1911814749,-1946799168,512440062,-472837068,-472783919,-1992891439,1259615262,-320286157]},{"sector":6,"length":512,"data":[33129216,-651490188,-347995021,-1527541755,-1070338837,186584746,-1173981998,-202894428,873368320,-2083837164,-372174655,-372119087,238807505,74585138,338824841,338828939,567102132,336608896,-385649664,62587018,-850873344,-1552846303,113642151,-1912403204,-1325452352,-1070355968,-4674645,702975,1048620019,1962939392,-853953525,822477345,335585812,-1189871426,-1510801400,-1206648646,567098624,-661976974,567099060,-397391893,463667286,520050708,1094521881,-1173981952,1609044871,-1492742656,-850807798,-1492728031,-973078518,17497094,-1558329672,-274656239,336831242,336666367,184630915,-1173981952,803738385,1527170560,-1679228917,-919382288,-1073069652,-1017185675,-2146766943,17494334,-1940713100,339785931,-388896559,-388896559,-1017396477,-2037680,-15460445,1477711134,378163907,372773931,74714137,74760762,338429498,99140442,-349277696,-386101183,109969448,-13431803,-1403562415,1191197928,-12240346,-203292043,1952013919,585650444,-2144970496,-529203139,119456761,-396886389,82509836,780375,-2013713575,681624569,839052052,16824768,985902834,1913923846,705051144,738359060,-997997792,-225749498,83143,13590029,0,0,168626701,1919117645,1718580079,693250164,760433952,676548420,538978642,1936876886,544108393,808594995,538970637,538976288,538976288,673194016,1866672451,1769109872,544499815,1919117645,1718580079,1866670196]},{"sector":7,"length":512,"pattern":0,"data":[824209522,758200377,909654321,168626701,1393733632,1768121712,1684367718,1297040160,1145979213,1634038560,543712114,1701996900,1919906915,1633820793,658788,1884492563,1718182757,543450473,1296912195,541347393,1918985587,1679845475,1667592809,2037542772,1684103712,1667457312,544437093,1768842596,168649829,1091780096,1936024419,1701060723,1684367726,1996491277,1953845011,543584032,1769369189,1835954034,544501349,1667330163,658789,1850282889,1920102243,544498533,542330692,1936876918,225341289,1850287114,1768710518,1852121188,1869769078,1852140910,1769152628,1931502970,1768121712,1684367718,790891021,794182980,5132099,0,1127153664,1095585103,1127105614,19791,1096563200,1162826837,776160600,5521730,255,3269888,1853952,917504,1397575491,1027818832,796549437,1685069916,16739]},{"sector":8,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,567086772,857640494,-18370,184747655,1962934077,-852577276,520039969,-315408847,184630915,235238911,316139807,-87520004,-1195585394,-1064371384,857640502,113653310,914373647,1016202950,1961692032,113718793,218184720,1048582123,1946159871,113647120,234883839,1024834079,567098292,1564377119,175374347,190594688,-402426624,113646321,-1946154247,1356369608,-1203193670,567097344,889596760,280711998,1541666560,57987595,1040187320,58065408,-1543634907,512638548,116801075,1946225404,445835279,116787826,1979648860,358475779,567089588,1044881974,190580470,-385649409,116792119,1946225404,443213832,-488111246,117896719,57999115,906529257,1037960902,184993280,113639435,-973075702,722438,178718455,108331007,-352153624,1048809550,1946159873,-16867,184628871,859608255,1101704393,-109769412,-2011230647,-348351730,163090474,-1205744291,28466440,521019853,-1271132230,-1977496310,842796814,63013869,-1086582850,-1527563118,-401292568,108271446,-384151831,1877475578,235631390,886815263,-382765592,116850310,1963082091,691962862,-546045884,1097744003,-1093110784,-1379976044,687978558,512434637,2139111785,477444609,-494921846,1746283231,1962884155,1816038156,4030529,1072236149]},{"sector":9,"length":512,"data":[366012926,1403127178,-1189040066,-230227959,705212590,1051566785,1442873791,-398682946,-391375792,175379540,108268860,1043793466,860811381,1017818313,1341841421,-772345973,8392328,1883147102,1245612353,1949731646,1979059009,-1074427134,28835932,-1574843095,1049312840,1049182587,915095116,-167034497,-175439243,-1207931713,567093505,-1958852190,-1992194498,-1958851010,-146706370,725492695,1346275652,1051566142,1045632650,91607562,954845438,364898581,1043537550,184630915,-385649409,-1360396718,1465255677,-1202499503,-1064374272,-29458394,141884927,1498962936,-1022927265,-1900019528,654259136,-1437254271,-2147153292,-268419840,-521409166,39684646,-472776910,-1014766639,-2132573825,442367,1192069670,-921965262,-1023212427,-225716245,1957098310,-2080832761,-454360121,1950301312,540835845,-1943081099,775956998,1076379273,-1147474951,1219821567,1219764685,1347625421,505750200,857640494,20036158,-628350515,1512030862,567104948,-2135238002,-853888000,94447137,2925324,64654427,35031507,1255836672,-1992107378,-1912602346,16482778,855798288,-754667045,-1898279709,870550482,-789098304,708247342,922693184,-1030864856,96725195,-2117926542,1949646330,520039955,393494077,-402100248,111287360,880720395,235050216,762439711,519862761,1609047822,256045,-1194661089,567086088,-854851400,116835105,1979648755,-234437112,-1326972662,1016381439,512678028,922684071,922681345]}]],[[{"sector":1,"length":512,"data":[-661782525,1006931688,1952078138,-1492715737,1962934026,512630318,378079911,243859457,-1205927933,567099904,-670644434,872415048,-1877939255,-402597400,116851275,-62809,-389827979,-2126446017,1929412857,1948597292,222079538,-276697739,-947176299,1016308262,-402513176,116786413,234949372,-1160547297,1323842708,300804114,1947024579,9496579,-388764758,624689663,222087028,808239988,154941042,-1952959881,115593688,178718350,91720486,-97529,-1910597260,1225434910,1947024556,-108969713,57868416,854715306,-1242882112,-8656609,-1363192034,-1439693762,-1442729240,326438204,-12204506,1051639296,-400617889,525271446,1023370985,-1327401691,1166550589,1051639551,-397336818,106499978,-1962471905,74604535,1325494760,-13375201,178718455,24510463,23718083,-260764356,109971139,-1910096333,-1274272506,119655753,109971139,-4506061,-850873089,1219777313,643506637,-1559485021,-796180925,1963982629,633506567,594931712,2474635,268436976,-1960437390,51127574,1926249427,1003195406,721973976,16482776,637825808,638330273,-1559488605,-661963211,-1020540788,1096531,190571511,-1207733038,4063231,620983810,1420033536,-389871810,109974772,1978154547,440854534,654273256,604699808,-1763160063,1029422592,-1961521432,-1195146791,78729472,1219816403,-1557782067,1424493223,637950719,178718350,443942,-1070399488,107302,238374,376648,179953547,-1951665408]},{"sector":2,"length":512,"data":[-1096485942,179911828,275179520,494144828,-1993996573,46367551,274655404,1017775988,-351636467,-1441943309,-347480093,-1430244644,-1324393075,-1259613436,119655754,1048780550,1979648769,17221382,1493168139,184297168,184288776,1358556649,109981190,-1591329229,-1073018201,-1912204428,-850807616,-1070397663,178758438,-64040922,-1017641206,178957392,1492809152,508646339,183699190,-144804353,-16079098,106329343,178718350,17204006,-2094661376,790,-1899459577,-669086760,-294072,-625336971,-1710322872,1428065083,-851463103,-473396447,-99710688,-1982123192,-1974937570,1128848007,1224351291,-4521102,-669087233,1964653640,857640492,-9967554,-1342021400,-217647603,113704714,1946159859,1016381191,233556275,184630915,-955877904,-16056058,1532567551,79321283,299297081,1044776646,-1257847040,-1107296185,1105723521,1947024399,-1074885659,11876943,227210635,-348658873,-1408207614,1193642534,91538490,975228032,-1611734332,495712515,1973307207,222080219,300463220,-388926193,-469823740,1044780790,1203046143,861320427,222080201,-169306252,1090745358,1027404779,222037876,-341014668,1027386613,-706207627,1947024398,-1493999847,-2142365836,-1200353988,1947024556,247916723,-5179787,1558789099,-1175933697,854226190,-1406211136,1963896808,1059896058,-853933896,178977,1203052035,-398366280,394991976,-1207957831,567102976,-1070463630,-1332739093,1174861567,41221950,-1073032970]},{"sector":3,"length":512,"data":[1072235380,241887480,-377368949,237502593,243925120,243794048,-1799406445,-1527514052,514461104,1043537550,184944326,1927880703,-8656391,-617477449,1947024556,238741748,808193140,-403258490,-1014578430,-1910576405,-1975635170,520813094,-482688974,-922839181,512660459,-1482605005,1975520010,-1064385791,96458894,41258240,-218101319,-12745819,898362228,-64057,1963801772,3965179,898227060,-1492715581,1962934026,-35264502,1947064296,-104597264,857640643,-1492715714,1962934026,517092339,178724494,71305,202377,-86382561,-1191158337,548405259,24489714,199852865,-1993418249,-398513138,477298611,594819644,1023253224,-402033398,208863139,326384188,178718455,-394919937,234901736,955496991,-401609751,-260898937,771775935,1059851915,-397343253,207224167,87696928,132842101,975577132,1204385029,1357441250,1048784637,2097692460,1998601220,1947024567,-46274553,-109769412,-386058520,784531457,1096097419,1912994691,-851528700,-234437087,516096010,178724494,-1207952966,567098624,378215538,243990529,773783555,-1958652509,1107343576,-953278003,-12003322,-628374529,-399196486,126489033,-115392468,42133699,857640494,20873534,1979645963,17221382,-369098997,-437520758,-1911879519,-1161785640,12060107,-2094936806,345406,117376116,512427335,507184455,-629209783,-402653000,1334515556,-166229245,1963196999,775392022,943418784,192282436,943370305]},{"sector":4,"length":512,"data":[57999684,721600899,1161724874,410255365,33703926,1334511221,-1876825339,-1194773679,567102976,-1878594727,-850460488,-18399,12059506,88449792,-1888108533,1270822795,-2086341883,345406,-373421195,3964933,1973683060,-1430244616,-772290253,-1799365837,1142852156,1261865477,-1207497210,-639107072,158829334,1174702662,343221564,276116536,1270765126,178957317,1341841600,-437559743,222054826,-772350091,-1827764178,512634428,116801075,234949372,639202335,16729542,1074661063,1606040724,645785652,-12204506,-153294579,-386474775,1072234844,-62199551,1043531406,121536550,-344653813,1564377126,57933835,856738024,17492178,624746354,-393487499,1975519916,16443604,-551170190,1896233951,-1396280005,376750090,997000762,126073717,155681538,91194114,-12285182,-773323285,983986688,1966828806,16548000,641340020,58014574,-104727,89128711,-1877808314,1912647656,1862679428,-385452741,-974520753,63605755,-293403273,997105667,125043768,1912639464,-1947407383,313082,997131835,-397999756,-697171844,1004527397,1966830342,-1073042227,1776863349,1354985984,1465012563,-1998039722,9103609,-402585413,647764106,-401930077,1570634119,1499094878,1014126683,922691078,1225198344,243869263,-1993996985,637880638,88348296,1158072102,-1946157307,646457029,637994571,185009918,20874022,125173515,17221414,-1006698485,-382126406,994184448,2101618966,-1193637107]},{"sector":5,"length":512,"data":[1172849001,-1388868843,-1007041544,857640478,958315070,184630913,108396288,184616647,-383778817,105909456,856067630,144778814,1958742795,-1064434168,567101876,113714695,2824,117884454,1476853771,1097447619,872415162,1005990857,1933846798,-388396225,1997214952,-54069497,-167217793,1946223175,-1171854584,2112435907,1976109836,92242709,-2095680509,1199768327,1199768329,1870856963,-92077307,-1948486145,-1142210093,1045051017,-2084556206,276103162,1066130059,973176192,92931701,1613504524,-402629470,1068499968,-1191158337,-1426915317,-1556198751,113721214,15946,1065748166,-1342068713,-1342016511,1046127109,-952215134,4086534,1059895808,567089844,6035082,1527334120,1962933123,-1273525483,1914817870,1090975247,141836351,1045038791,2079064062,1001658251,1936925133,990082955,843674838,-1274247479,-2044605125,-1975684340,-857145532,-1978370807,-991363516,-2044824567,1001717580,1283858893,-1256098817,-9684422,260770677,-835989881,1946352003,939702799,67258358,414843765,193390901,774782081,2088766581,108331010,1045038847,1556025835,688830464,1015030221,-16485376,1396591118,-1174126872,378093356,-1950728155,595978296,-294053,1048778612,1946173002,-402031600,45746142,188410168,-351808024,1426507433,113704704,-1274019749,5618193,-397401651,-27785282,-385649216,117375186,884883035,17623103,1065223926,-385649663,116785288,1947221823,932821512,-350012696]},{"sector":6,"length":512,"data":[1343654678,169249087,1377209152,202803519,878099008,-1591532824,-1073004724,1572822132,548950078,-1957123296,2041304,-1014247286,-388823631,-259387612,-372191350,-1048318670,1694072912,-377486478,250210404,1061817995,548935907,-372135136,-372119087,-372184624,1221140106,-394212480,-1070395286,1046330026,1074665097,-399220806,251536063,544554585,-1572971872,-588759463,-2045837817,-166234817,37715462,113643636,-401129594,116064377,-399219270,313795219,-855616070,-14161631,1046152951,58064895,-1593921559,104480346,57949785,-1173905688,915093039,914964059,1692942359,-1976126430,-855614442,-49887,-138215051,-1545340959,378093593,1169834011,575007030,-1187095105,-1527578616,-1180032848,-1527578621,1386922035,-1992401478,-1170207210,619197535,-1161602526,484980397,-189274078,-1022934296,-1103496774,179044480,-399674176,222037824,1448224372,-1405806406,1946631144,1963801604,2132819190,1448762899,1929889768,742293518,125042752,939702878,-1173776407,-1336330984,1560688672,-2081328128,-247790655,984614773,1962820664,353888739,-398853702,222037744,-1914120588,970504711,158584436,1076641408,-352160768,-2110354497,114485311,-105247428,-1337363399,918796858,1946240056,7126847,-852950600,941666337,1946184966,129674287,121497654,397682292,-855614278,1979661345,96139530,193456181,1358934098,1476768232,24428798,1139301059,-262870751,-1022819351,-402619970,222037624,-105249163]},{"sector":7,"length":512,"data":[150137145,-167114264,37761030,129631860,149088566,-851640136,-1173195999,37565720,-1160940544,-386319912,-907474119,-1224292856,-661979065,1043668622,-2144415181,4699966,-1959877003,-1270983666,-1960719041,514122696,1358902023,-1359865168,4034904,-2147060480,1964703613,1237854986,-164755698,1397208854,-1275067973,1528941888,-1053095310,994688116,-1023314495,-1207959109,567100416,1971372790,106424818,-402619970,646579672,113639516,1006633052,-2011728883,-1409262554,1966750892,96397319,108268860,-382309958,-1528297416,-1090052603,-5242795,-1413467222,145795755,196691882,-213929984,1059895978,567089844,-1275046470,-383660783,2028475623,256005,-1274711319,1344392496,497280050,-528066496,530834482,934525504,505425641,-402252018,108135283,4030502,1927809653,-398544896,988479578,1191545382,846512138,996935226,1206388084,653126400,-1152973430,-1073071580,-1014817676,63891459,125044538,1962950528,114420721,-16314793,123666775,520603371,975223491,-1340091671,-1341002947,-1609700581,149633899,-348427616,996777987,1460084230,1075953490,935115434,1512025832,-1262287009,35769625,-398759930,851705826,1059897042,1201733259,-1270807490,950053690,-142104002,1074675337,567101364,1932812218,915192323,-1021348120,-1174401304,378093356,1606041614,526772276,1544981187,79858176,1967144000,1191576070,1354825278,-1270927426,1931595079,-383840763,750716382,1490520895,-1599391052]},{"sector":8,"length":512,"data":[-1012253128,-402490904,712247418,-402501656,-1058536734,141355010,376716092,1947024556,49473553,91503420,1946439656,49997829,-1070339349,82363307,69855232,1031808707,-1173719808,118372503,-320266482,-2095118818,-141883921,-2130528280,1946222585,-1090056474,12205960,-2016335103,-1163594799,521024579,-1155610903,12058625,-165556924,1282703554,1947255542,891926599,-1031003699,-852156232,1002474529,-1271564336,1007734031,1007252995,-1274711033,-1022309120,-617411660,263459021,-729149235,414632702,-930365389,-1274609477,856739078,-1275021358,-1022309118,-1405476162,-315438966,-1968437580,-501101104,803783673,-2142351865,58014268,-1207958330,567098626,-661974926,-851181384,-2134706655,1051987317,-541449779,506587192,848308715,63602934,-851181128,62477089,-1260702976,1126288702,-1269040670,-1272853179,-1272853179,-1272853179,-1910387394,507392798,-1560274783,-189265155,-1899278334,641610502,638229665,637540003,638230177,637536931,638230689,100666531,1044579982,567101876,642561031,-854918496,15722529,1442938344,1577151464,-389873291,1642594643,1340823041,-402608151,-126615208,-1403593933,259263804,-143311556,1015071742,-17795827,1592585159,108317694,-382139206,-397212348,-27590480,-389843761,-544538314,1442910952,-1514217593,309560,91596787,1097336518,1593543425,222080086,1239942516,1593240321,1097350784,-392989696,109970052,-1447084493,-1260418294,-2145268455,1966735740]},{"sector":9,"length":512,"data":[-402355702,1093402896,637716355,183058057,-1574518530,1074006772,154640934,-391316597,125043288,57937212,854846378,113683136,1325416808,-348223194,512672522,512638515,-164426747,1946172544,1065926560,-1073042772,1136327285,520494644,521981672,-1715542293,-1107039432,508967070,1912612328,-386430192,-142147428,721485032,-216070450,-1017241692,-348612162,949927427,1912604136,-1870926862,3008764,1043531406,84315686,1375679244,-391358634,642187376,1979663674,1609818626,-881567394,5695569,1031808601,-102730496,-1962467645,1105745918,1459940096,1493188584,-108529365,222068931,-391316876,1239941176,1966947328,-2134981648,-1073042432,-2115438732,-1022542847,1043531406,84315686,654258956,1946172800,452846,1035007467,-1070464277,-234815303,104514478,141704058,997918266,539755127,-903938258,1397867336,-1962916632,48989145,846396219,-397192880,-2091126813,-75431229,74612736,-1878332423,-338492239,-850742205,-1912169439,-398576890,-1660424237,108222553,-382372166,648676236,1479,113465691,1220578384,-1591295858,78708739,-930357037,516097880,1043537550,184499840,-227270912,-1271065158,841076027,101050560,1045078467,1045431819,1966523322,8502835,1006682088,1175417869,1966750892,-1310173680,222060032,-68679819,10086651,71362755,1076889334,-1274645246,1931595067,939703023,-1021620760,1912607464,-851856372,-1158384863,1860712481,456714245,8502979,1006662632]}],[{"sector":1,"length":512,"data":[-1960938483,1911074006,1007252480,-956926707,-1023344828,16729286,5695574,1947024478,972667634,-1007042509,1929367272,-1274645234,1931595066,945470194,-402315032,-1077732622,-1031127787,1077690372,100796021,-1057079737,942049962,-1422217154,-141877498,567101364,521067634,448418499,521018938,521849576,-391330982,-93061116,540853070,1027406708,742193012,993850228,154988404,171764596,571843,1948269740,-119363071,1948269740,-1595897325,-2035664000,45198020,1948269740,-119363069,-1012219854,-2130938458,1946222460,1358294006,1464929712,-4588917,119408383,1170648818,-1996029697,-1170207210,1491612767,-12204518,1594126861,247683161,856067615,895072830,1547599910,108265483,-1173816344,-236373666,800346113,1043801656,792462452,1547436660,378192728,585629788,49342719,1076889334,-1273596670,1914817851,74704912,1572814768,768256,-1070421261,-2110354493,1149914687,-4331265,-231005068,76164212,1962914536,-219460093,998285392,1476478008,1149897844,1949973759,-6690799,-1007091083,-1275067194,1931595067,76202775,-100694296,-617416843,-1274979194,1914817851,22841580,1174671592,1076770441,-1207935809,567093506,868455363,-20256549,1043793466,-880675979,-398032896,222101180,-398006412,-1782579880,375099,1974399632,112649,-670310189,-773073941,-382309958,-1964441316,1958742528,980140025,-1363228365,1192069694,238742755,108347053,1065488009,60794611,-1576695047]},{"sector":2,"length":512,"data":[-1958265275,-1639495907,-1847010187,1158084098,192151870,171853984,1010714886,-1095404289,1307065492,-2110389250,8503103,-1431516877,57937212,-1997018303,-167739378,37635334,233311093,-1173981952,-1444333885,-371982592,-1084758030,-2135031679,-930436096,933293362,-234865602,-960274514,4081158,1045632650,1051530888,1076299462,-1380298240,-365303746,-33066150,-348117242,1539280897,378429,1076313728,-352095232,-1008168938,1958742792,277771,132842364,-319034992,-393198613,109969900,1236549187,109978061,-31048141,638253318,184485574,6078208,1387919243,-1163529472,96157019,1258338316,1076299510,-385649409,-1047729587,1572655502,959381255,-1172369858,937964763,-414652136,110020915,-1799471565,-1392604356,74785340,-135543298,-210432708,1017968523,-32475870,-2012449587,-1040300283,1965178028,986578678,1966828294,1963210808,-31020026,-401929722,222100788,96865653,113714701,592651,1459656937,-1962210369,1017906911,-395807731,1668611356,1043793466,-341156492,1778793197,-1960872645,-50403106,192220476,-955447866,155049478,1466231552,-1958879553,118359775,-527775509,1954348160,1764112902,641692987,190594688,637891840,184297168,1543962150,-54335477,175377724,108297276,996738618,520494197,-2046685975,725266656,-293921,942016372,24510277,-1430244785,629694215,234651719,-1040317068,654258153,190594688,-1089178624,-1993995392,-1106543042,1978154132,1017818364]},{"sector":3,"length":512,"data":[-1996851955,641504014,190594688,-1022947840,-1409253186,-2136742862,-2110355137,805750335,113639488,-1962917844,-1958772170,-1958772722,1363010518,-43259818,1530889379,56221227,-472478773,-391362261,74841275,1076627198,91569980,1076891264,1963342338,-2147125957,37761038,1962677224,923154950,1322546494,75939890,1963801670,-1996191742,-1992326602,-1019248626,-1409253186,-143343606,1006633960,-391331059,74841060,-160089284,1377747790,777081680,1043537550,190594688,-166890240,-16054778,166200949,5564416,1515739993,-2144419041,4054590,236910452,1038006815,-1958936392,522309080,-661976206,1200029616,1614360,-400617789,1094516857,-2146929664,108281343,-382366022,414907900,146741,1035662708,343349,733670772,-35198667,185286272,-2143456256,723518,196747124,1023522827,1528941904,-768406158,-661927629,-851311944,1024846625,1962475525,185318056,1018480947,1528941904,-661939342,1200029616,1679896,-919383869,172076284,737834432,1942182129,1364434173,106256214,-1269673954,1495387481,893237851,1946173757,-1950119164,1560747985,1532583519,-689388643,773770239,1043537550,184630915,-2130283520,-16056002,-1329389585,512630273,-6144461,516103946,512634450,1589263923,-851332085,191805985,567099828,70445146,190645958,-1161617664,-622315260,-383840513,-392364772,1381040005,-398893382,521076681,1511343592,1094557016,-385649408,1273625856,857640676,1560739390]},{"sector":4,"length":512,"data":[-853953525,100806177,1856125800,190757643,-466483320,190916232,191964808,-919350389,567106228,-661932942,567099060,-1274319174,1914817882,-1260876891,-400437954,915144324,1048775550,1979648769,17221382,-336592885,-64585680,915144202,1017908094,772437116,996738618,-1981217932,18254592,1023457292,57876941,-1946197015,-2030063400,413276231,1016381184,1015073075,-385649395,-1607532735,70794089,1015084404,-1393527684,1947024554,2084323647,976095092,1966827782,1170613998,776539647,1016270472,2117503310,51809035,-919383796,-851705672,-1502455519,-5187445,-1575467130,377946137,378080257,233507843,-1827764178,914968124,602409854,-383840514,-1159142212,20873726,1978662923,17221382,-369098997,-1943084226,104739614,-1899459554,-1160212800,12077240,-954086088,218136838,-1845049856,113737788,218184851,-402625304,119472492,-1948677173,-1295348797,-2030897564,280466116,189315233,1209365696,12001908,-402638360,585629739,2484224,-1023399960,-402646808,501743643,1435648,-1023402520,-402648088,48758795,-1964053760,39315653,1220780227,-1047870550,-1023259416,-1073035638,1122501492,-389903870,-1094516163,-773324671,1947024632,-1874203901,-399049542,1575490443,923843080,-1206680856,1555707904,-1960719104,532327922,142100535,1949773498,926792195,-1273796888,1016248842,-402652487,567083532,99141939,-125966334,-2143513410,-1435235012,189315233,1210741952,1525170292,-399871488]},{"sector":5,"length":512,"data":[628228233,1912619752,8382496,1088953202,-1401982464,1786055996,567094196,1651884042,2484419,1659395186,-396922368,1383202851,1912625384,2091085,350803947,-398233088,1047658569,-352320792,23849189,-192228750,23324867,-389819254,-93191843,-402166599,1318846505,-2146143075,259263804,-1973111981,1541666500,1055443083,-1965329919,50377924,-373636152,313649206,-1392564503,-244043972,998245946,104524660,-445367434,-2118204423,-137435136,2087980348,-399623493,-1947664146,-852708352,235296545,1046331143,333971891,-1430244608,-1992401478,-1170207210,1760048223,-1017182446,-1007237750,-1223527041,1913404513,1953543942,168569858,-1342016064,280449804,-402594584,-1047920599,1526783208,-2134641069,11998069,-1979705112,13363398,-1438072416,-1024933238,-1007265024,-1967622785,-1597789497,-1012250427,-399023430,-2065165809,-1161219073,82327415,-2078373102,4450363,930276724,-768357749,1947024556,1958951462,1975990788,6547494,-192274062,1947024556,-1056556526,-401312440,259129425,1017959562,-1274514163,169987373,-1163103040,-1125632177,-1263604975,1016248842,-402652487,567083104,1508428083,-154015744,-2143513410,-2022437572,1912609000,-1393259902,158647098,91539258,11728974,256195,-389819254,-93192176,166256778,-721128960,216041994,76202753,-109957076,1928661564,-725399820,230983178,809250864,-953548171,-1012203337,512672682,645938739,150801243,235625230,1344193311,857640494]},{"sector":6,"length":512,"data":[-2034224578,168516614,-805014336,1477114926,49951,0,0,0,1381061456,-962832809,4199942,1194264263,-1070333953,-1090173767,-1426898583,1185744583,113722413,17451,1143539399,-1799487488,512630332,1048591923,520096519,767496309,-1964166586,-29584626,-1096485951,-1346419155,-1994345658,860303670,1728497389,-236453823,251914485,-318043789,468193652,-972231936,37754374,1929384424,-1660621862,-1660752904,1516199673,-1017619623,1465012563,1726520406,691962624,1333608516,512489354,117392425,1773683753,8579137,477127,89098496,-1962772600,-1991856842,1463157559,-1980290239,915080055,2005485361,-1946711287,54963518,754942457,722828613,-1527513863,-1985347408,-1656312514,-1207243784,65732609,-1660943688,1516199673,1354980185,-1671999149,1946273782,792625948,460652359,1194270347,-398366280,1862860824,724437255,-335962812,1143578888,-1656279133,1532583928,-1974418600,-167005245,-1023190045,50067,0,0,1448235347,-157526697,54618886,-1008139404,20768768,-1203293254,567089664,-218044410,1197344396,1197489801,1197620873,8436487,-398632002,-697171381,113759883,912869299,184648680,-1955892032,1029423080,1097414283,1097600651,984927787,1912797571,23345157,1201670260,-1421802434,-1414724117,201517443,-2133816800,1688232170,-108811705,-1408601599,1678129737,1092514887,-141863346,-850984776,1593740065,-2142804832,158597181,1946172800]},{"sector":7,"length":512,"data":[-118798589,1963210922,-481737214,-375065854,116785289,1963213163,-1959020773,725707798,-2126419690,-398631998,-393543526,1978469279,-210526713,1894498355,-1958913089,-1958256114,105340982,1197356799,2088773127,880094722,76162641,-1977219704,1166541124,1197776897,1442989448,-2146137562,-360701750,-2080928928,12059590,-400437945,-251397925,1593740110,1493419651,516827911,1197356799,-1527514081,1688227615,-12240313,-1096154764,-919386266,-1073042772,-980682123,1583308189,-1017423526,-399527856,125105231,1688362160,-1564256185,-1017624732,1465012563,-471294890,1185923071,1197618827,1197487753,1580662558,179052359,973567168,-1442614073,-1994394389,-1975033290,-2118110248,1950789631,1197776925,1962886458,-225727999,-1073042772,-1346700683,-1291401402,-398930873,-620101616,-123927436,-107150613,1499094878,1381090139,1385977431,1941895819,-2133707961,1966735741,-2146072056,-360652830,1191229504,1918509517,1292607,-850526024,-969117151,4678918,1197868742,3729408,1197803066,1705120638,1196539463,-1186502977,-201588723,1946696868,1292554,-850460488,-1596296415,183191397,1202919051,-1207063832,1587347456,-1017554337,12080727,1196539648,-67105351,913682162,-1106907261,-947176567,-1492617817,146277749,-1960580352,999145208,-1492617817,79168885,-1961628928,999407352,-1492617817,45614453,-1207702784,1599995904,1364414659,-1672063150,1097406091,1097612939,1946172800,63605550,725708302,783303119]},{"sector":8,"length":512,"data":[-1951468804,-2083902513,-885324565,-24439425,-201526645,-1331015772,-1431655873,-1649803088,-1660752904,1516199673,-1017619623,1465012563,-2120460970,-1325050941,-1192504572,567101440,-393526158,-1178563066,-13433532,-213816898,688819108,-1094700220,2085175657,-388396252,-1752433432,-701808279,-1961391834,725707927,1468606166,1922534147,651569985,-351709303,-980744231,-107150101,-123927829,1516199517,-1178379431,1572732939,1060940800,-102628747,1962998147,932035120,-1106473240,-695533440,7865543,-854848840,-469062367,-1310136460,975178993,1966835718,104514305,-392414329,1973285267,-1173113648,567083100,74760446,-1007635992,1555700404,-1272853248,1344392465,1492165096,-30074694,-1170377536,-169265859,9758963,512627314,108346931,184290944,645972737,-1006761220,1946165480,8567305,-370040600,512684351,512376371,521014012,-1174281344,787167659,-1091322903,837288065,-1022542607,-1207938584,208810753,28444021,851648973,-1021194798,1979703528,-843042085,-1160082911,-790087277,968538635,58055434,-382094406,535301059,771864576,58002034,-20766259,-1021194808,1979691240,-850086741,-1160213983,-823445088,-402619970,222097620,229452404,1866276896,1024488558,477455983,1008733356,202732902,839052134,-661938240,1022406632,-1962576627,-1007116605,-113740358,1554010307,1010828288,-1610123968,100810311,614611816,-507881408,1975519799,1046331159,-574695541,-528160713,1060421199,-218100807]},{"sector":9,"length":512,"data":[-1430244444,1075975817,-382216262,1460013851,-2000746738,-852839361,266901537,-149428224,-1163214798,283653187,-1017182453,-422449013,-964562941,-645187899,-218102855,-1440698204,-1547684925,1168326672,1083286337,-1556196702,1319321174,1096262462,-1572852061,765607507,1083220544,-1572851550,1201815699,1076666945,-1572827230,1235369237,1044816449,-1556026461,1403208017,1089315393,-1556001374,1235369552,1095737918,-1572779358,1537425742,1095476030,-1572976478,-1918680948,1089381184,-1556074077,1923301524,1059889983,-1572935261,-1555545776,1487028360,1082892862,-1103090526,512360577,117324663,113656167,855719958,1089388525,-1677155096,1095763710,1954596854,1325843973,-940179135,151876609,155078190,-1656860626,-672451726,-164728163,74809543,1044973310,1096261974,725675710,1077002182,782485251,755927104,-1527561920,1076903560,1045300935,-346161152,1329496230,343212353,1044987520,-2146601727,37834814,-1262877067,94431541,-1572778080,-523223480,1201856720,972667457,171854240,1006924992,-385649150,750645640,1963015232,1044881442,996673026,1187396276,834601473,113748800,15950,33834694,18118,-2146992664,1963065726,943370262,1967141382,72253454,1077133058,18118,-1962450456,1031799422,-1172998912,984627202,1979598136,4638374,72253442,121956358,-1590246470,-475447728,-1450150529,343146512,567104692,857640478,-1545326018,-1205925117,567094785,-2118193869,1998490112,1089388347]}]],[[{"sector":1,"length":512,"data":[-167279384,-176881209,1045310985,574967,1048579189,1946173000,1309066757,-1588198335,-289521321,-1077531840,-956088172,-2009034333,1094750222,1049142515,-1956757357,82831557,-386965272,1625818345,10742016,-1174228504,915093022,914964059,-588759024,-672863992,1044921984,-1168149248,378093716,1304051720,147187764,-382396230,-1588198282,-289521321,-1077531840,-956088172,-2009034333,1094750222,1049142515,-1956757357,76802245,-386988824,1048577165,1962950216,-1564462325,1453538898,1045668414,1095054985,-1120070209,2011709583,-1858696443,1048625984,1962950991,-8591101,915139891,512377157,-289457289,111667264,-940119182,-152669056,-294321721,-1073771544,12058716,-2145268439,376766524,-2143251295,41171708,537673904,1554145324,-401492992,-392429305,1956506737,-12261117,109494322,-1073070504,213453684,1064484608,-213963586,-1564462428,1049313609,767443089,-313399233,1044921984,-167283456,37786374,-1799745420,236357952,878688832,-402137368,-907481849,1212055552,175439934,1912706536,1376175621,1048576062,1946173000,41412620,1082918646,-352160513,8775692,113663861,-352305581,-1942060896,225771328,1095054987,1082996361,1082918598,-1947388929,-1975433930,-1086621922,-756530962,-2134379003,-940166540,-386894591,-1024917832,1051574251,-852950856,1064549153,-1958826306,-398421698,1048577069,1946173000,1225180677,1474887745,-19207681,855708136,1045603008,-1572972893,915095123,914964621]},{"sector":2,"length":512,"data":[149438789,-385649664,434765381,-166546177,37786374,-469105803,448024771,-851497798,1555716129,169987328,113689536,-1174389178,12075156,1931595069,-249042927,4275612,1035601525,116516917,-661929059,1089150601,-849936200,1360431393,1393461569,1140897857,-494919219,-317290368,-2146601920,4278846,-2017851788,41478457,1089150603,1045696139,1045829259,242600491,-2147391256,4279614,244016501,-1910620588,-1270991586,522308927,-930392718,1048596963,1962950893,1312718855,460587073,1049350539,447757910,889622022,128905790,117310837,725696070,63605713,-1992403442,993941006,1916687374,18081804,1095581312,-351243008,-314670961,125042752,1044790912,-1954450432,-1270813922,-1021194946,1045642880,-1594329856,585645646,-1959496702,993941022,1967019038,13297673,-1007091084,-1910580429,-952224482,520100359,1045825279,1095304902,1095475456,1045825027,20776306,-401968128,-696975200,1095450243,-1954712576,-1958705122,-1958653170,-2143203050,4278078,750006644,-506453555,-506338864,-506338863,-838144304,-852839343,-1125547743,-773224953,-790179615,-790179610,-2132356890,-703987499,-2091256438,712900859,-849935944,1107474465,-896806349,-804576819,1140897948,-1269685811,1512164670,-150243939,1962967234,2025477,117376235,117325403,-1007141293,1082662539,-385892120,113704968,15963,834333931,-851332032,1218495265,115888190,104486912,-960283064,4279558,1045577344,-385649664]},{"sector":3,"length":512,"data":[1156055171,53012481,1048581749,1962950893,1212055567,-1262878658,-966888395,21055750,-2143485512,4278590,1018430581,834324787,-1172189888,719861134,-1556188433,113655944,-1962852782,1140898008,378020301,-1024049014,-1607306112,203701838,1319111029,1241909825,2048422977,1946724384,1140963356,-897518030,-1978234848,-350106304,-965350644,71388678,1095175808,1228832772,494207041,1963106792,-314671080,292880448,-399122246,113706139,15958,1095567102,-2011264061,-2016857280,-482454002,1258749939,1228832833,1517617217,-1910582733,-1270991586,522308928,1916099002,1959275295,-1979255085,343179328,1082787574,-2146798304,4278078,1950989941,974502587,1045628670,-2147204376,4084286,512432500,-75284344,-1274774016,-1172189890,1102331953,113648077,-385860014,-768345294,28889479,-2145268414,4081214,1085587828,616767949,1343257100,1252132900,69490753,138497698,-1606334714,-1073069746,742293699,209059648,-1120070209,-538427348,-399775744,109494322,-1073069941,-1964440715,775326464,1055506240,-852950856,3964961,1170605172,832666625,989626432,1085276788,1095634570,1613504524,-1606489694,646594608,35995795,1958742530,1975794195,1329496079,141819969,1082918654,116113458,-1004404172,101378256,1218593103,-790572994,1095213792,1095384704,-1574669056,-922074802,-1073078923,243997044,333659734,856038064,889622271,128905790,-1991309963,-1153542594,1048592173,1946173000,1064549123]},{"sector":4,"length":512,"data":[-1958810946,-1186976194,1017905160,-1979550401,1948269575,-498882047,-1341935119,1946433568,998285331,1060940970,126485109,24387644,-236829782,-1012219854,33834742,-712301963,-1207582077,567098624,-661973390,-851181384,-851528671,-2134706655,1190544757,1064567812,-2147133813,41171710,-897564494,1625980960,-1947742232,96633813,-2147189110,-8386841,-1961396986,984810102,1979604024,4638214,-972690686,1308688454,-8363285,-972720894,-1023410106,-1259537176,1914817851,872057635,1237879744,-1605390606,1187397176,1161429504,-1442482945,16795334,100945536,-1023392280,18118,-167477622,-210500409,33572550,-2147322229,678690876,998252170,544480312,1547188915,-972720898,1308688454,478599986,988586216,141885276,567098292,-1082975098,-532354567,-2147320183,-1593048762,146357121,-2035617024,-997807420,-1426914383,-1012219854,-1799466927,1077002048,1044844170,984672650,1963017272,103460103,-930464920,1161312944,-1979026175,709314309,-1975818234,1978219240,-413865949,1149967988,-11695105,1489052240,104469109,74791808,149677066,998247994,-318111115,868440408,1463716288,1096458817,-1975428190,861379832,-571953975,1007908326,1022784544,-2030930935,172055302,-370510656,1048576291,1963016214,-447027197,91603770,-343879808,1963801812,17099011,1043793466,65602421,943370753,-401378028,-391380672,1049166140,113656151,-385859239,1049165989,113656151,-2147466919,20977214,82321269]},{"sector":5,"length":512,"data":[1343911399,37636000,-398759930,984613136,1476463592,1096236681,1096353478,-2147075584,-32934597,-968795642,-12494586,58015548,973262720,1966830854,47153201,1097285248,-351963904,8382757,1048577972,1946173786,-1342000126,1495673407,-2031455679,-2046172191,12249313,-136126074,-1729568378,-2145290778,1048577231,1946173799,46659077,1049186165,117391703,113656151,-956350119,4282886,-1409250328,1075199616,-402426623,-639048584,1009939685,976122893,1950234374,1958951464,1966750756,373194767,91554368,-352296984,300631762,-1157671191,703150552,-561452568,-107126962,1072385731,-2130587776,-394264371,1011279248,-1341557491,-847140352,-521453568,-402641944,1460069408,-1090056623,96025493,13467904,1974399552,-1736437,112831,-401874733,-1341694119,-1654674944,1101710328,1096353534,1173699,911563,-1008388376,-1459173586,-352320965,113716743,80809,-1957342468,1347637740,503731799,-1413544178,40799035,7768894,855819651,33155291,1948597420,1958742550,25749509,-1947667733,1577524993,1499158623,784554589,1000343238,624733184,976151412,1950053894,104476232,-411813001,2013674030,776107067,997787194,809253748,960249714,809253751,-2094133387,3908670,817104757,-1473869778,-1590800325,179911588,1524758272,-360647118,784466736,-348412765,113651372,-352240736,243281572,-352240735,786375836,998180410,976100212,1950055430,104476189,527711101,2114337326]},{"sector":6,"length":512,"data":[-400133061,1474888019,113716991,1063846,-953258773,171681286,-396104960,-1031143122,-402599448,938017075,535320319,787647233,1000607371,192203019,-1606516690,57999419,1442850792,1958742700,11069445,777975531,1000357504,772568064,1000607371,57985291,1577060328,-385813784,-768344330,-1073042346,-347995276,-903127304,1743258486,-873938176,868387584,1048587986,1946172321,12380163,-1959897517,775661110,1000607371,1577061352,4253787,-385830168,1347026614,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,3907646,333972341,184254464,-1014824078,-2020987386,-397331408,-1017577454,192858379,1000906798,321617,-1007033767,268403114,-1023314884,-2026132551,1959734223,-1959898122,507226398,-1413865714,-851397573,-401968351,104720457,-349539328,1959279364,64654116,440369368,1528765300,856067630,895072830,1543960102,108330763,-1158891544,-1377224354,-1017438235,-2081191082,-1958870333,1578404658,784348099,775659682,775659938,-1338268509,-1465766368,49979,858927408,926299444,1111570744,1178944579,1073763109,-2009839820,542319935,137644288,1815684416,877723748,1074544650,1543525157,155192884,221537024,1952530954,1713399907,543517801,1936943469,224882281,879165450,1850280461,1953654131,1936286752,1769414763,1646291060,1751348321,1818846752,1628048741,1881171054,1936942450,2037276960,2036689696,1701345056,1701978222,226059361,880803850]},{"sector":7,"length":512,"data":[543449410,1835888483,543452769,1713402479,543517801,1701667182,-1073739251,1886733364,1633905004,1713399156,543517801,1701667182,544370464,1701603654,1953459744,1970234912,168649838,1177869568,543517801,544501614,1853189990,658788,1632646407,1847617652,1713402991,1684960623,436210189,1667449141,544437093,1768842596,168649829,1228221696,1718973294,1768122726,544501349,1802725732,1634759456,168650083,1328889600,1864397941,1852121190,1869769078,1852140910,1886593140,224748385,895156234,1701603654,1701995296,1869182049,1919230062,225603442,897056778,1701603654,1851876128,544501614,1663067490,1701408879,1852776548,1763733364,1818588020,658790,1866675600,1852142702,1718558836,1936024608,1634625908,1852795252,1936682016,1700929652,1701998438,1886348064,658809,1850291638,1768710518,1768300644,1634624876,1864394093,1768300658,1847616876,1713402991,1684960623,-503313907,1681466677,1818838560,695412837,1886348064,224683369,906559498,958742544,1766203492,1932027244,570433577,624957238,543452217,1702132066,1919295603,168650085,422982400,1228938048,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,168652399,1127631616,1701999221,1679848558,1702259058,544434464,1814065006,1701277295,1635131506,6580588,1951610475,1701538162,1797284128,1998616933,544105832,1684104562,539893881,539893806,1228312064,1818326638,1881171049,1835102817,1919251557]},{"sector":8,"length":512,"data":[-1358951923,1853182774,1416523597,1700226421,1969771620,1399419462,168653921,1635151433,543451500,1702125924,1127668224,1701999221,1679848558,543519841,2126697,168638187,1702129221,1701716082,1633951863,2123124,1831352062,1684286829,695826733,301998138,1684285495,762146093,975796601,924909600,762935592,1680698733,540682596,221720576,1986939146,1684630625,1835627552,1056972901,1920287543,1953391986,1835627552,1936269413,928055328,1850018317,544367988,544695662,1701669236,1677729850,1701986615,1970239776,1920299808,1495801957,1059671599,540506368,1380533308,538976318,1295486720,1329868115,1700143187,1869181810,824516718,807743076,-1694473166,524295479,4400448,1075918777,1819235872,543518069,1679847017,1702259058,543368480,-1073712347,574628919,544434496,1935763456,544173600,1700946284,1850277996,1768710518,1768169572,1952671090,226062959,938344458,1650552405,1948280172,1919098991,1702125925,1919509536,1869898597,168655218,1228407808,1818326638,1881171049,745043041,1953459744,1919509536,1869898597,221018482,544370442,1701996900,1919906915,1869488249,1835343988,226063472,941817866,1953723725,1701868320,2036754787,542002976,1327526511,168642118,540564480,1701996868,1919906915,1718558841,1394941984,1996491277,1312826680,1632641135,-1895798668,1413566520,1380990280,1414548815,1297040189,1128616019,1986939197,1684630625,1769104416,1763730806,1702043758]},{"sector":9,"length":512,"data":[1751347809,1952542752,658792,1850292397,1768710518,1701060708,1701013878,-838858227,1650543672,1847618661,1713402991,1684960623,-520091123,1853444920,544760180,1869771365,658802,1175271669,1663062607,1869508193,1700929652,1936027168,224683380,956694538,1970499145,1667851878,1953391977,1835363616,226062959,958398474,1702129225,1684368754,1702125929,1818846752,1919230053,544370546,1769108836,1881171822,224751721,959971338,1852727619,1679848559,1768038511,2037539182,1634038304,1713402724,544042866,1701060705,1701013878,1610615309,1163018809,1763724097,-1996480397,1380275769,542721609,2126697,1128610197,1763725128,-1577049997,1717989177,-1392506355,225341241,968163338,1635151433,543451500,1752457584,544370464,1701603686,1835101728,658789,1850292668,1768710518,1970151524,1919246957,543584032,1634886000,1702126957,168653682,1161419264,1919906418,1769109280,1735289204,544175136,1769366884,168650083,221903616,974585866,532488,453261852,1112158811,-834399687,304825638,1209151303,877400609,307187218,1360157520,1901335079,296965663,605496671,50336316,810831694,1380256264,1280462674,1279612485,1157957876,1414744408,50333831,55724356,1376128269,1296125509,272367941,1313165827,84950017,1396789829,266600773,1279607811,68150273,1162893652,51426305,38618450,1124335876,56184911,1342514945,1163089217,68146946,1163149636,69098242,1162692948]}],[{"sector":1,"length":512,"pattern":0,"data":[52387328,5391702,1443041706,1409371215,1145242129,85352705,1229211715,375456082,21253378,1292179108,1380533323,35038209,-402570158,1297220886,22169924,1107629800,1262568786,103154688,1230128470,905992518,1163068198,340460116,1330794502,39080013,1342444593,38294593,1157894852,5523800,1124340739,56185940,1157895070,38750275,1191454145,38753359,1392839017,1413892424,34152962,-536721847,1329988359,193987154,1397506819,1258240,1044151361,690563108,1145981184,724380239,2053205068,1481851716,741228334,2037395002,1329802862,1480928845,1094856261,1094866516,2119504]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[14703181,131080,4849696,16318463,-1344011776,2555904,30,851969,79822887,39]},{"sector":2,"length":512,"data":[1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568]},{"sector":3,"length":512,"data":[329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,-829665028,1525210766,1913046790,-16705526,638218758,-1560280415,350751348,-401772027,141690321,-1111487656,57935857,-402360855,-1326971675,55109635,-353832334,-803304957,-388285943,1048577050,1962871258,-786527737,67954697,-1174300952,512363216,149424592,-2143718909,-16131522,1622806900,-786527733,49670153,-1830279566,-399084284,-773324165,178102528,177800763,1956724339,-1408881910,-1475986678,-399412726,-437583374,-2130115656,1946865914,151631875,-1173703517,82511710,114342544,-1174138904,166201712,69068804,178456262,-1873614077,-1593766936,-1331492240,-2030063606,1007327238,-1173261057,512363360,-2065167919,-390761982,-982186975,990556321,1930079238,17033221,1889661675,179086090,990551457,1930074374,13297670,-2080410903,696638,468190069,2091008,434701173,42658047,-1976368712,-854991850,178495521,567102644,-402028870,-1161624692,-1847064241,59697155,-402428184,-392428234,1922892676,-1168981014,-1717499503,179610378,-1559585887,-1499395402,179872522,1510169576,-1269673021,79923712,165520192,1023429352,1979252757,145209875,179570375,971508189,55437315]},{"sector":4,"length":512,"data":[-134194456,1405311834,121158226,179570375,568855005,118667779,-1559577695,-1113519436,179741450,-402456856,552076056,-1559837181,1532625674,1398387907,106386001,567139123,1499094791,1048626011,1946159578,-1758035953,512425738,2011695568,124930,-1169010493,-773322448,76081154,-1581033382,-1365046670,-2030063606,1007330566,-1173981953,-722990240,-1547685120,-1616835909,180200202,512385457,-1162212911,-1506899190,179216650,-401947229,141754912,1946105576,-10753808,-401954143,326369324,-2147311640,697150,113640821,-16708957,17473798,17477638,-16077306,957004550,1913305902,-1626931264,1364247306,109977094,512625328,-13432146,-523110517,-523116335,531100561,-1017620217,164634250,109510576,-12842332,-793115020,4581386,-1146896333,178102538,-1324696157,-803304863,180009481,178663051,-1559581535,-1847063867,-401837311,-260833625,-78616,-1593138938,100731562,117377708,775490235,-663614789,178063103,-956658749,-1683946491,642091274,-1324695133,22734912,181903811,-754667111,573160,175507190,-1962642048,-1995774922,-150299850,178955238,-167771714,17462790,915080309,914950886,-420017498,-1861572445,175251083,179183241,512350467,512297584,1956711084,1925393162,-137219302,326387953,856350625,-466159662,-137219318,-1559566794,-1111291239,1005127460,-1956597503,17155834,1929437160,-34215931,-392368269,-1013120842,-1190399814,512360450,-91551280,1358955974]},{"sector":5,"length":512,"data":[-1108844367,359815424,-2130667032,-1979674430,-502673122,-620298523,-1245841399,251577094,544541147,-1190399814,512360450,-91551280,1359218118,-1981267791,-1031710464,512360592,-354285103,-803325245,-1979354103,-1022766306,164765322,-803304509,1141815305,-930471475,247004038,-1977496252,989562600,168326395,974091457,-972327447,-16131578,1049164682,-922089007,-880147851,41282826,243855242,780667346,868420051,177717184,722202809,-1012206641,121998161,684163927,-1157621063,-1416429567,-498881645,-1957076999,1166611525,-1269578970,-1257394108,-8787960,-1017437747,280646227,151238665,163054452,1086554121,-1264385865,-1241069814,-1995842294,-402006754,1532624964,113651395,-1946023261,-1898017074,-57808442,108159292,41384508,-13754324,-1022719714,-1559837138,-712309750,-402647064,1827209259,378089212,-1169028430,-1705899342,61,166249306,-387427840,32004863,1381024512,-402214726,1482358747,-1279634749,-3020794,1381024602,772214714,179570375,-1590819074,-1557263685,-1590818122,-1557263713,-1041757512,-2758401,-1077716902,1740507863,2078987,-1195137293,-2051398365,-1205744380,567096064,-602503122,855750665,567083442,-1338460989,175618560,520495565,-2134982605,-393106432,91357198,1912627688,-1899066368,-1010397474,-1949158575,170897662,-122752320,984630133,963948274,-24424103,800063667,829796082,49971266,93005687,561393708,494340156,-755382134,-151844141,292912838]},{"sector":6,"length":512,"data":[1949301888,553418757,1170671479,-350215937,127516103,914894585,-1017574794,1017961267,1008235533,-386435552,192020498,-796424146,-75480311,-102271486,-1022912067,754894312,426922048,360127036,553548928,76222327,1966750790,553418760,-128449673,-1715644221,-1262225145,-31339239,-803304512,1977289225,164667907,58064650,-1979067998,-402010082,124911626,164699786,-1023409688,145769652,-1073012275,1152661621,567085488,-1023987598,628429312,-2147433737,-725738891,-2134144503,210256065,-1274421825,-1608397472,104466909,242485716,-351768899,138591496,-239270933,-1262225145,-2044605136,51002848,339543666,-1023314173,2126121396,102878471,-883696845,-854851144,12079137,1478610188,788399592,164038202,976095860,-116799482,-1073085835,195,0,0,0,117443085,1447379968,541410121,1886418259,544502383,544501582,1936028240,7630437,1986622020,2037653605,544433520,1679848047,1701540713,543519860,1701869940,1846152563,1663071343,1634757999,1818388852,1866661989,1918988397,1919230053,544370546,620785263,1769152627,622880100,1948265572,1801675122,6563104,1970499145,1667851878,1953391977,1835363616,7959151,1701998165,1702260579,1818386802,1701978213,1696621665,1919906418,544108320,1986622052,1126506597,1931804730,1936286752,1953785195,1633820773,1919885412,1668180256,1634757999,1818388852,168624229,1868787273,1667592818,1329864820,1702240339]},{"sector":7,"length":512,"data":[1869181810,118099310,1986939172,1684630625,1918988320,1952804193,168653413,1866729997,1953459744,1701868320,2036754787,1818846752,1835101797,695412837,1866664461,1851878765,1868963940,1952542066,1229201466,1329810259,1679839309,979640378,1563504475,1563963227,1986939136,1684630625,1769104416,1931502966,1768121712,1633904998,1852795252,1884490253,1718182757,543450473,1986622052,1868832869,1847620453,1696625775,1953720696,1919879693,544434464,762212206,1869440370,1818386806,1631780965,1953459822,1397310496,1297040203,1869881424,544370464,1836020326,543230477,2004116846,543912559,1986622052,1631780965,1953459822,1397310496,1297040203,1869881424,544370464,1836020326,1851853325,1397965088,1699628873,1919885412,1112888096,1684362323,1769104416,1140876662,1702259058,541271328,544501614,1684104562,1292504441,543517537,1701999987,1679843616,1701540713,543519860,1763734377,1919251310,543450484,1869901417,1752435213,1919164517,543520361,543452769,543516788,1919905636,544434464,1936682083,1174430821,1414746697,1128616704,4476495,1702063689,622883954,1768169587,1952803699,1763730804,1919164526,543520361,3818277,1936028240,1851859059,1701519481,1752637561,1914728037,2036621669,773860896,1124085280,1634757999,1629513074,1752461166,1679848037,1701540713,543519860,1311725864,4137001,1886220099,543519329,1668248176,544437093,1701080677,1866661988,1918988397,1263476837]},{"sector":8,"length":512,"pattern":0,"data":[1836008192,1769103728,622880622,1920213092,1936417633,1680149005,1667592992,1936879476,1919250464,1634890784,539781987,1931502629,677733481,1493182835,78,0,0,1329805824,78,1701336064,1667845408,1869836146,1344304230,1869836901,543973742,1886220099,1919251573,1397310496,1297040203,1951735888,1953066089,1700143225,1869181810,775102574,673198129,1126181187,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1667845152,1702063717,1632444516,1769104756,757099617,1869762592,1835102823,1869762592,1953654128,1718558841,1667845408,1869836146,29798]},{"sector":9,"length":512,"pattern":0,"data":[23117,131080,4915232,17563647,120324608,2555904,30,851969,84213799,39]}],[{"sector":1,"length":512,"data":[1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568]},{"sector":2,"length":512,"data":[329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,-829665028,32038542,-1878604025,-16700661,638291974,-1560280415,-1142420590,-401772027,141690488,-1111487656,57936020,-402343191,1706886541,65529863,887681650,-387091965,512361503,-616953152,-2147200792,-16070082,512362356,1122503361,30140420,-1978924870,-401948642,1198654196,181026432,-1172343553,512363664,1622215361,96926347,68085760,1023623400,108331008,-385384259,1843922011,13953026,990624929,1930147846,194158903,197789227,197527099,-454546830,-941233407,-351547386,134658569,-2135292949,71952391,-401975878,1290273843,72673284,197134022,-1872499965,-1593755160,-861729904,-2030063605,1007400710,-1172540161,512363664,1776814785,-402165246,192152627,-164380437,887684747,-1581813244,104532940,91425738,-352246040,194028018,-1593062749,104532924,108202936,-385815064,1048641390,1946160064,162052617,-402401560,417858538,-385649408,1541996289,855750658,194320010,-1063247411,-850611189,171489825,-402407704,-1662516293,97576963,61991068,-1008045411,176274002,-1559512927,-1163850800,198353675,-1559509855,-1998058540,1405311491,-1979665326,-1556085565,1860700922]},{"sector":3,"length":512,"data":[1391872,1946766266,1260809,-1173129735,113707464,184159184,-402432280,1994916722,1532688384,-122357309,-1202564781,512428027,243993559,192023513,-1962409800,-1962154978,-1173625330,-794621993,-771307765,-401933813,-1313209561,-803305209,-770799349,50980875,-402447640,113640234,1510017984,-1262265511,1381061465,-617413033,1594302925,-1017423526,181026432,-2146470912,-16009674,180362890,-402491160,1354956801,169458258,-402466072,1482294526,-2030063421,1007403782,-1173850881,78646416,855679464,-466187786,-1103197429,-432109301,-1975406325,-1173700322,780864483,-861860924,200188683,1929520104,-15472627,-1058475917,-387222782,-928907459,-872021749,914966027,775490532,-697168924,197003007,-1071740221,-2030063606,1007403526,-1173850881,78646272,855654888,198681536,-1559511903,1638992857,180362890,-1962158406,-1593064402,-509408310,29812747,-1226307469,-386894850,-928907549,-905576181,-687407349,-684836597,-2330101,-1022641146,92863115,-1995720031,-576510395,199926539,-1847050063,128041729,78747916,915138771,914951188,-420017222,-1106523997,116785153,1963002772,372673284,-1003058932,-1545144565,-1953428538,-1995730914,-1593062882,-1020589166,-768402830,1950937591,202350867,922210867,-768406508,202782455,-1022642013,-385367107,1622213007,96926347,19589121,451413363,-1662028802,-1660878872,220248771,-1979710791,-1962229730,378618,-396316335,1918435592,14870546,9486977]},{"sector":4,"length":512,"data":[180428426,117368290,-1007154485,181079806,549068917,178445,180362890,96926347,1085362436,1493227496,9486977,180428426,1455680226,202678615,212082315,202450570,211893898,175499066,779469626,-335544392,915247147,1015220968,991917056,-2096794620,-219478842,-2096989045,242483261,74718523,-202684601,-335544392,-1070362621,985882207,1946861598,-920745467,512410378,-1950151992,-1207255010,567100430,-75052918,-851177800,-2031580639,1962621691,1958808072,1978219023,-905525749,-74776822,180436616,41273610,-318059638,-276168075,180883080,180956808,-1077922877,548998070,-204526835,1364444074,1460094347,-1188509821,29032474,-1817472256,-102612053,340101983,1495680393,-1202470053,146097165,-838895384,1405311777,167361106,1946807224,166901763,181026432,-1979419137,-2146779106,12009667,-955527005,-99888634,-98662134,4319242,-1933354150,-1898017074,-1073297722,1709769227,1918975228,2004499462,773860354,195567359,-1073297725,-712309749,-402647320,1172897834,-837383684,-826650101,1033523723,1509949440,649411,-1447854,125018,-1169010493,-588773536,-1017619713,123976274,1526715112,201834435,-1190357058,-1494024161,1448235459,-2030063529,1007403270,963967487,-1962918936,722188302,914969039,1049168881,1118899187,-401870662,1935277872,-65017849,367781747,-1003078842,870216203,-639481866,-1341353798,-43194364,1516134392,1465303897,-401971014,549388159,-1866039027]},{"sector":5,"length":512,"data":[210812672,-218101831,201834148,-218095687,210812836,-974596213,196649470,211027515,113640820,-1342108522,-47388667,-1195155873,-876993245,-1205744380,567096064,194320008,-1305280072,-1021195007,11548852,-854878534,857671201,8437440,250122668,-402296320,7471201,-561066356,1371784846,-24391117,-1073074256,1979231986,-231034813,1496937646,-1140946095,800063616,813018866,49971266,93005431,544616492,477562940,-472659830,-956893430,-2146339458,91500540,1998650496,-12204281,-940892128,-116899395,-1808365522,868440331,222080219,540809332,317257590,772502016,180389768,50036803,-1107695754,-389871551,1076690531,1008300624,-2146076902,1998651004,1174702863,141900348,1998650496,-1007134717,138526040,431277049,-1057087027,180362891,58055434,168476834,-1576831489,512363201,182979264,-1979223552,-401948386,-1262288895,-855068604,1975520033,-1337674696,1914817801,12777264,-148540142,1971323074,180534810,-1048523894,-1089697728,1622412026,-90168883,-1039779318,-1123126262,149621010,-351738179,143965443,817153017,-528080435,1912801853,51657990,-1262288521,136755721,856039885,13325275,0,0,-854851144,12079137,1478610188,788372200,179373626,976095860,-116739578,-1073085835,195,0,0,0,117443085,1447379968,541410121,1886418259,544502383,544501582,1936028240,7630437,1986622020,2037653605,544433520,1679848047]},{"sector":6,"length":512,"data":[1701540713,543519860,1701869940,1846152563,1663071343,1634757999,1818388852,1931804773,1684632352,1680154725,1920213036,543908705,1224762405,1718973294,1768122726,544501349,1869440365,1426094450,1667592814,1919252079,1701601889,544417056,1869771365,1852776562,1769104416,622880118,1912617539,6578533,1953067639,1931804773,1936286752,1953785195,1633820773,1919885412,1668180256,1634757999,1818388852,168624229,1868787273,1667592818,1329864820,1702240339,1869181810,118099310,1986939172,1684630625,1918988320,1952804193,168653413,1847619396,1931506799,1768121712,1713404262,1852140649,677735777,168634739,1835888451,543452769,1836216134,540701793,1263749444,1498435395,540697632,1528838756,6107439,1635151433,543451500,1986622052,1886593125,1718182757,1952539497,225341289,1701860106,1768319331,1679844453,1702259058,1701798944,1869488243,2019893364,745829225,1919879693,544434464,762212206,1869440370,1818386806,1631780965,1953459822,1397310496,1347371851,1869881433,544370464,1836020326,543230477,2004116846,543912559,1986622052,1631780965,1953459822,1397310496,1347371851,1869881433,544370464,1836020326,1851853325,1397965088,1699628873,1919885412,1112888096,1684362323,1769104416,1140876662,1702259058,977478944,1953459744,1634038304,168655204,1701536077,1920299808,543236197,1802725732,1702130789,544434464,1702063721,1684370546,1953392928,1946815855,1679844712,1702259058]},{"sector":7,"length":512,"data":[1684955424,1701344288,1869571104,1936269426,1869374240,6579571,1735549268,1679848549,1701540713,543519860,544825709,1965057378,1634956654,6646882,1735549268,1679848549,1701540713,543519860,1998615401,1702127986,1869770784,1952671092,1392534629,1129469263,1096024133,1413826386,1936607488,544502373,1679848229,1701540713,543519860,1679847017,1702259058,977478944,1701990400,1629516659,1797290350,1998616933,544105832,1684104562,539893881,3022894,2037411651,1869504800,1919248500,1936286752,1953785195,1495801957,1059671599,1886339840,1919950969,1936024431,1852121203,6579556,1836216134,1769239649,1998612334,1701603688,1886348064,1735289209,1886339840,1735289209,543434016,1667330676,168653675,1394631717,1869898597,1412395890,1801675122,1680154668,1684624160,695412837,5134592,0,0,0,973078528,5132099,0,-16188407,-116392695,-16252928,-116392695,-49741824,63759,63759,181206536,181861385,182386440,182779145,1750335488,1766662245,1936683619,544499311,1936876880,1818324591,1836008224,1702131056,1229201522,1329810259,1428183376,1768712564,1444968820,1769173605,857763439,540029230,539575080,2037411651,1751607666,1766662260,1936683619,544499311,1886547779,943272224,1766596661,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1766662246,1936683619,7628399,0]},{"sector":8,"length":512,"data":[-1,985152,65562,771751936,728713,218532910,1392954112,516173392,-2144993269,1962934911,10545411,9805870,21465126,-855113032,-2091148241,-1655504188,-888710312,-1,33555201,33554943,23593024,150995456,256,0,1310740302,541412673,2105376,1342185474,33685504,1879179265,-117071872,589827,2,0,0,0,-1,4849919,1153376014,-2118860032,28574443,186565934,55019776,1516199199,-346138535,5244299,151126018,50331648,236867604,-855002081,-1017635039,1381060694,773739863,728773,-1979627638,1334512999,341281554,235831236,817167391,104473037,108331199,12592698,-541456012,-4069373,-1198492437,801966080,1786117948,728773,-1961724021,-661777337,-1090494488,118358084,1912627688,516238929,1200226315,1166550550,-1784533499,776012800,-402371934,913441132,28313780,1153376014,774884608,728773,-2010250828,-2013263322,-1766322841,239569152,-955232372,9835079,1377062796,-402381638,-379912369,-369492180,1743322916,792505344,-1018233995,106307159,-1409263128,309604156,611585340,544475708,477364284,-100663624,2112372203,512306688,-596442947,-100663491,-21484172,669776383,-1123616978,1962935296,28987918,-17176572,-149414,-401544199,-1590755642,52756669,692390144,133742643,-1017176226,1948269740,1946762491,1405308663,868234066,-1395510309,544354364,477575484]},{"sector":9,"length":512,"data":[1402155052,-150992197,-1023255581,-1828662144,-92076686,-1193249792,65798143,1515111307,615301979,1916878047,2002402369,243936829,11862999,1460080134,-234628929,1963417518,112681,-1959862061,184597790,-1446474792,326369404,1966750892,-7804913,1040158952,74776575,-1023408408,-335947469,521019130,12390021,-1040764299,91488260,-352275038,1086453543,-1576832000,3997882,-149326848,1946159297,11969285,-1040773397,91488272,-352273501,12100355,118407967,-404169933,512372477,1569194170,677218856,1963326336,239438625,356879184,-1961662985,-768386872,-770969097,775946612,-1962887517,113673207,-75492117,-1190628096,-1993474008,-788482546,63422179,-947703669,1292589,-1527513968,-1962913560,-120507067,-29602421,1927336905,893749569,-1291716224,1996665072,679313438,-1978108921,-109037731,-1341099007,678267393,1946221952,-336547068,-1999897086,1569206085,725977911,-147038837,979209187,1166664695,-389810123,-147915454,67157254,774796288,-2013219424,-1590819771,1166606518,116862507,1048765,-1590818956,1166606523,116862522,2097341,-1590818956,1166606520,33604412,33554690,47186032,150995709,512,16908288,-536739839,-116826112,983047,2,16908800,7340544,66651552,33556736,-1912602624,-1274830589,-1274825725,-1274825725,117683203,1414744134,172901188,1381123341,757092943,1668172064,1701999215,1142977635,1981829967,1769173605,218787439]}]],[[{"sector":1,"length":512,"pattern":0,"data":[168626724,1381123341,757092943,544165408,1986622020,1884495973,1718182757,174351721,604834317,1684107084,1159750757,1919251576,543973742,1802725700,1769096224,544367990,544370534,1986622020,172040293,9229]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[12343885,196623,32,22020095,1050149226,2555904,30,393217,112656423,239861799,39]},{"sector":4,"length":512,"data":[1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568]},{"sector":5,"length":512,"data":[329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,-1705898517,61,278837955,772342249,389095052,-1610168786,1790705685,817123329,-528080435,1946358845,273005070,162799374,856039885,1489719488,108314634,-384794950,12060878,-2145268425,108343290,1040631342,118370063,-402619970,-1385034141,1040595502,1316320271,638952127,1962950016,-53922956,1948269740,1946762266,1946827798,1947024402,104476174,125046590,-1441906456,1323428673,378406,-1185851817,-141885436,-1090195837,236850994,531034911,1969184345,13560067,504734394,243867406,1035212322,567083696,774664735,-401202013,57871859,771798505,255723066,-1947532684,-286741252,1950497805,280279558,772286953,255657670,1037626113,1853095939,1946158141,343407,236852853,1124120607,-854220102,-146050527,1946157505,-1874203835,1962934845,521018941,12139700,362985984,1914642893,-1260877022,505531710,1102323470,-854220102,443686689,1124517422,-969998576,-15711738,1040153833,309657605,-384738118,-491124806,129296656,-384775494,2126120878,128510224,-384763206,-2144467038,1065278,521067125,-351477784,985305150,126675217,1048583950,1946161218,297908742]},{"sector":6,"length":512,"data":[-1090621464,243996066,-1085204958,-1527572954,1507298127,-218288464,-1962773330,-1991770886,-1105811394,96014135,-1163595008,-919398874,567098548,-1499223950,512630294,243996465,-812908542,-108933333,58068992,-787480647,-773729823,534893025,-99710647,407682835,272762614,-2128775681,-786936599,-775844887,252611049,-1949826284,1287815633,286689560,407681556,436586236,335036041,337315526,-1660500352,113704724,-955640417,1276376582,-200882408,-956301037,18084358,-368654592,-150995181,-15711738,113642869,-402582112,113640753,-1140845152,599261546,239450661,1606033869,-40179696,-1273750598,-954086134,487855878,309639700,-939685912,1305606,-301545728,-956301293,1306630,1007076864,113639439,-1962929150,-1122756810,-13429782,1040223976,-947711095,-230782718,-231812845,6416403,-395039684,201451598,141901628,335677126,200665343,41312060,-658546908,1030403,1974399632,-638615217,-1579185405,-1073015828,104531572,1014109162,337065609,-1744837679,915080167,-1058532329,1947024395,1947876369,1966816260,-1991358975,-384559306,1122631529,-1528279297,1048822539,1946162156,-333562888,1525839379,-401492806,652868820,193587455,1963392899,1007076869,775684367,591150452,725370484,758932596,12218228,1006678272,1008628272,-2128971975,1931057658,738308551,-774206672,65196514,-1729965613,-340996093,16351454,-770990220,-2134660492,17775678,378228596,-1012132876,255606400]},{"sector":7,"length":512,"data":[-1170050047,179306497,407682903,335023755,132370219,58044146,1610083138,1048626092,1946226492,-8787936,334763523,1010729155,292815119,-1946195224,722727966,-1157400614,-745865215,-11474493,1128348429,1279870276,1381060685,1096242259,-2096414453,1241782535,1090978314,185273350,-703944956,-670491122,-1861907191,-14620408,-2080431895,51638846,113701749,-352250064,-230784244,-445512941,389023430,-299988224,-1160049901,-663481794,334110347,192273163,334765707,-1979786264,-401348066,-1116403862,335298185,334241419,141941515,334765707,334241417,1963413992,-333542492,1206403859,-29456121,-367621357,-334087405,-385649133,378273454,372970478,158733290,334239291,-1679228041,-32601090,-66180333,319719699,353274132,334536980,225755147,336799479,-770979701,-35060876,319719688,335061268,335167115,-113510357,-370605197,-299988216,115664915,335560329,335033995,-819212661,67013441,-1995173058,-49022914,-1946376973,991166494,1997798430,320768780,-65142508,-31588077,-266433773,4098835,353274644,-63534316,-2086341869,-243334677,389037696,-1959758848,-1961624514,-1961624010,722728974,-1527513906,436586022,335036041,334372491,334110267,503516530,506139626,-1991568404,-1961628130,-401347042,1049167454,512300022,-1950149644,-1961625586,1104096241,-201459061,-50886748,-1980855481,-1995180482,-1995181026,-1022101458,1962934845,296008198,-1157782295,-1628893058,-230784003]},{"sector":8,"length":512,"data":[57934099,-386035223,-1085404893,-919398742,540847356,154931060,222038900,993789812,-341179532,378604,389450062,380287508,1035206832,-1267588659,-1206441309,-1447418589,-1960719098,185854494,-1962445349,-401345506,-873923272,-1948611835,-401343978,378273645,243995638,237704184,-1957620746,-1273550306,1512164671,-784611189,1807355006,-101521390,334892683,235081195,-242543626,440183886,-1958149771,-130642951,244008467,-836037638,1336210241,335036041,388636299,567099060,-230784061,58065171,-1191387671,-1329978077,-1960719098,185854494,-1962445349,-401345506,1273560248,-1948611835,-401343978,-18284819,91089150,-1273717318,-400438006,-1614936128,440172564,-219659660,-11761145,-678756171,1926300481,990147590,-402230571,233373742,-1331367161,-347887094,407681733,567089844,-661731188,1337507982,-1127182847,-386203286,65537907,-64034560,-1023409688,335031947,334904971,-1958283893,722729486,1336210381,335036041,-1171971144,567086661,-368654397,-939524333,18084358,8906752,334104263,1048772608,1946227698,-65214205,334118531,-956926720,18194438,-385876037,116785569,1962872899,-132740152,112915,379985547,567099572,371465867,567099060,379985547,567099060,380124811,-1525730626,-1564826459,371638037,567105204,380124811,-1525729346,649766053,362987286,567105204,-1070445388,8653,0,0,0,-2097092887,18084414,-1679228044,1124529915]},{"sector":9,"length":512,"data":[-327811312,335025803,334118531,990344448,1913917718,-91503871,335154827,58051115,-1962542103,-1961625578,-1995037666,-1273549810,992070975,1343780040,28954627,-851463168,15649,-972589736,17842950,-1958739477,-236432952,-972720891,17842950,512479795,-620030998,-947186315,104579331,192287761,336674443,-819214197,-402652741,1161298885,-2145094401,17843006,96866677,21349901,46629642,46236505,1326246737,335154827,-55643395,1498040135,1705415,1049087787,-117238792,393543435,512447314,-678750684,-4597001,-1274957569,1528941890,990999130,-971147814,1065734,302037699,-1007184920,-1089400390,1040389538,11540002,9497002,272828150,-152930817,-15359994,501866869,-230784251,58065171,-1946513943,185854494,-1961069093,-1961619698,722729022,-2118093063,1981304063,-1143852102,384303105,1124395779,-2147291672,1065278,-396950155,-1956706932,407681743,-1753953749,379985547,567099572,-1053088910,-141877387,-1994896193,-1961626050,722728974,-201571890,1049186212,113710072,70644,-1507947581,-851528682,293059105,-303554802,-1258311434,-383660724,1048772878,1979847666,-100603645,388957894,-972690687,1519366,362874566,52619264,915135861,1927812107,51784452,84839188,-2117008620,1979776762,-1870861565,336141963,42068050,118393690,188123924,1238248212,-401132609,-1101660071,243994561,1323832325,906190336,-896855037,-402472573,-1070464959,406370986]}],[{"sector":1,"length":512,"data":[-386502680,712312187,-1962895128,1326712638,-1961901634,-1961622762,1226048782,336006657,371804737,108205069,336398023,-398327808,786957239,-1023314941,-469797911,1252699141,-1161561118,1475023338,334642819,-385649150,113703238,-352250065,788973061,113639447,-402582111,880083560,336141963,336279179,-1962804760,-1961621698,-1340863218,-1359807478,1049172597,1049170951,243864587,117380109,-320334839,-401443836,-864812343,-401485894,-1950091824,-351008482,152996613,1877494548,-199849727,-163673837,1048822547,1996624882,-367097005,1977289491,-199324920,-367097581,-333542637,1977289491,-367097080,-333543149,-367097069,-123541485,1963013608,-1957211188,1125379102,-1962858008,110059511,1049170932,243995638,-836037640,-62846350,-1991269133,-1022101442,-2080865815,34861630,-617351561,-1996423704,-1961617130,185854494,-1962248741,-2095844322,24379899,421411651,-1023314412,334239371,91607563,-1031548021,372982294,74847257,337188491,-478883013,938017655,-1957473544,-1209512998,-163673856,-199849709,-1410835693,1610058496,837548843,334642819,-385649150,512489490,-620030998,512429173,-343731212,-1157400821,-2081947647,-1952418560,-331445257,-81049837,398394231,12576768,-230784061,57803283,-533015,-1961617650,185854494,-1962379813,1125381150,-386417688,-141885362,334763657,334902921,1002635636,1947465782,37742841,335746697,334902923,-402621976,179568731,-854286918,45017121]},{"sector":2,"length":512,"data":[345902730,-689766219,335746699,-401301570,1049297625,-790031370,1,0,334763659,334904971,24500795,185497539,-1173719845,1287585793,1960459032,-133264401,-1328600301,-473953782,1118761479,-143271365,407157443,407248521,407504582,-199345366,-972721133,538462726,-1007417368,-1962933825,722728974,-1946913586,-397258281,1499135955,-1407765569,405929857,540810099,171710067,222040692,154930804,1588857460,-997834740,-1878856789,-536200022,-8552230,-2146667510,1947074429,-1441943549,-961934672,-1169031163,-1377298376,98786035,-1384822205,1086309195,772195855,-622329577,-473953792,1964653808,772195845,243859479,-919399421,125046076,362888832,1308718080,337065609,-401620545,1048576177,1962939809,1963801609,914968065,243864599,512431109,-620030998,1048581237,1962940207,113413,512427499,-398257164,-337054120,121539070,188647700,152471828,-333542636,33260307,-385885309,-812908846,336006699,115605260,335744571,-1983708813,-1609298674,243994432,1049302029,-16051193,-361386254,-544484981,335744651,255966793,-1493974982,-74724725,243917941,-812968947,336019081,336281227,179359531,336139915,-220230846,1257862318,336139913,336273033,868466738,373075145,-391379339,82510177,141826620,74714428,-370458198,141871371,-1996936361,-1017118899,388906624,-2012974079,-1966866611,-117178547,1959410627,1364678190,-234621045,-123602685,63056659,-100254783]},{"sector":3,"length":512,"pattern":0,"data":[-2028244205,-1961625594,1003367368,50690039,-34012175,-56298687,-211919015,-1850031196,-229709807,-1074487063,-4647777,-17920,1011002028,-1996890099,1947508246,1011002592,1341814029,1048626090,1946160957,739130142,839217687,-1010762048,56036323,1031819257,24469274,-390057399,1472397340,186298449,-234392375,-1627163218,-108290495,-819224743,32006046,477479680,-117221476,1291813199,-2147126248,175376957,218187206,38127169,-1654701814,1891259075,-238622702,1958396762,-239146990,-1899459389,-1195340072,-795999921,-83793220,-369107224,113701885,-1962864575,-1105811394,-1515909326,-1170099036,567088678,380124811,-1525729346,1371776165,-24422825,855592074,-65621779,-1359863325,1464933749,-402290096,92799001,1341623128,1604645697,1224860505,-11731362,1591602006,1354979679,1023467557,1968701504,2041091,154971331,171768692,540866420,1019474804,1007055457,604143482,1048822751,1946227698,-196548349,334118531,-1158253312,367530517,-855526159,975178785,1947223046,-12982013,379985547,567099060,-1273616710,-1272853183,-843042228,34010657,-1116405996,-401483590,28635364,-397401651,1012465423,212497421,1141258784,1110360848,771771201,2368548,2949120]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1668172153,1701999215,1142977635,1981829967,1769173605,168652399,1560291876,1986939152,1684630625,1769104416,1864394102,1768300658,1847616876,224750945,274792458,1701603654,1835101728,1970085989,1646294131,1886593125,1718182757,224683369,276824074,1635151433,543451500,1634885968,1702126957,658802,1766199456,1763730796,1163010163,1328366657,223956046,280363018,1701603654,1701987104,1869182049,1917132910,225603442,281804810,544173908,2037277037,1818846752,1864397669,225338736,283377674,1684104530,1920099616,1763734127,168639086,168645413,-1575945216,1851867925,544501614,1953064037,1094856224,1768300619,757949804,1634624882,1713399149,224750697,286588938,1914728270,544042863,1679847017,1667592809,2037542772,1919903264,1818846752,658789,1766068540,1713400691,778857589,1768178976,1814066036,779383663,1577060877,1225395473,1718973294,1768122726,544501349,1869440365,168655218]},{"sector":5,"length":512,"pattern":0,"data":[1175550208,543517801,544501614,1853189990,658788,1850020243,544830068,1869771365,658802,1699615142,1768300663,168650092,1309783552,1713402991,1684960623,-1023407603,1261326097,2113326,1766592977,1948280174,1814065007,224882287,299499530,543452741,1763731055,1953853550,1818846752,658789,1648431596,544502383,1953064037,794372128,541010254,1293025792,544502645,1667592307,544826985,1953719652,1952542313,544108393,1701734764,1836412448,225600866,303497226,544501582,1970237029,1914726503,544042863,1830842228,1701278309,1701344288,1953391904,543519337,1701603686,1073744397,658706,660077,4722]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5448960,389224501,1681401120,6497594,6204,6218]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[32135757,327686,65568,6422527,1170604394,0,30,1048577,2359296,35389440,59572224,60162048]},{"sector":2,"length":512,"data":[1354773278,567095476,339599494,-1156484093,-611450823,-1274979142,102878473,-883900365,-1157594690,-1014104007,138891,1929456616,-1172371960,1793655185,1687297,19785900,-1960433548,1006638614,1006924892,638350650,6700681,1711734566,1020408576,-1962707666,-1993979177,-1442834922,642700011,-402651706,494076136,440303654,309672448,1679654,6988582,-1224278234,117384704,2045444279,6995856,973175936,-2144988044,973085246,642780277,-1426056799,-1220638426,-391358464,427032763,405178918,1968978944,1021587970,-1274907346,646457087,-341180392,96872161,-1172655104,520487099,1320427981,-1191155014,567148543,-165278862,268488710,938151285,2105550480,796211967,-1332738837,-970544548,6150,-1220638426,-1960901120,-1962908106,-1962887362,1107301910,141881915,1946172588,-185882109,100664774,373195551,158662656,-1107289665,317194252,406749184,1299513088,-1107268929,48758801,-2143098112,57933885,-1392972985,1975519914,-1392720902,91491644,1946159848,222056182,-117344776,1963801795,540852993,154991476,742193012,993850228,725413748,171764596,1027401588,1686211,-851640136,-1559858655,367722600,26327696,-402541080,-1161100829,-135593561,-352193862,21150450,1392515769,6823563,567099316,1111392603,1968852225,21668323,1023418117,-747433984,-1308631003,1390465796,-1957474223,-1328991280,1746832128,-851266560,1498962721,-775649702,1175882728,-2117063935,1929412858]},{"sector":3,"length":512,"data":[-772634970,21275106,108314635,33614465,378130435,-1031601850,-1108684017,-721223521,-2089299141,-1593707846,101384528,101384530,57934168,-1577092887,-1073020586,4007796,1391424769,-1168945071,-919404288,512426416,1119092840,1482367437,103373401,1048772934,1962934600,-2082786355,84030,448414580,18802690,1002048180,-1172189951,300417567,20823553,16729286,749528180,1008497200,604795402,1007103071,1007710730,-787713264,-773598749,182702563,-2132808744,1963851644,-1948416067,-1274984946,1049319231,-1910636440,1406284763,567140235,1935613787,41204230,-2080452375,84030,1520518516,1347506689,869305171,-1962889015,-1275041762,1528941890,-1168484008,1119486274,309505,-1957478476,-855611362,57891617,-1946246679,-1593753026,-1023213244,19316878,1208942381,-1260948223,6994492,567134515,-1180477838,1175358208,1463858177,12140171,870026782,-544517166,526066125,-1274318241,512447294,567083193,-675624101,-28579583,-1664941710,1465274707,1344144981,-849759150,-1168418527,1094517120,-1962642432,533826499,1583308039,-1013097639,-402539078,451542994,1201296126,-1174374656,-1705901537,7798855,875442883,1163412782,1229073920,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1638400,0,0]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1778384896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,83886080,0,0,0,0,0,0,0,0,1868787273,1667592818,1329864820,1702240339,1869181810,1665213550,1936942435,1852138528,6579561,1766195570,1847616876,1713402991,1684960623,1224835584,1718973294,1768122726,544501349,1869440365,-1828685454,1818838529,1919098981,1769234789,1696624239,1919906418,1224845568,1718973294,1768122726,544501349,1802725732,1634759456,-1090493085,1818838529,1633886309,1953459822,543515168,1986948963,1702130277,30998628,762865990,544436341,1684366702,757097573,1935761952,1702043749,1852140903,1747460212,975796325,32768032,469764621,1380013826,1196312910,1377840416,543449445,1869771365,1852776562,1163412768,1818846752,168636005,538976288,538976288,1832984608,1953396079,1634038304,1701584996,1948283763,544104808,1702521203,544106784,1684104552]},{"sector":5,"length":512,"data":[3043941,545,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,825237504,892613426,959985462,1145258561,1650542149,1717920867,0,0,0,0,0,0,1426068736,1347637586,503731799,118418571,-1962921793,-1958865298,-617414538,-1409156376,812918076,91537418,-352207384,31058162,1599997727,1515805528,110046813,-1892810708,1476406790,775356206,922693120]},{"sector":6,"length":512,"pattern":0,"data":[-389349332,-873791082,1948597420,1949121782,1948990527,1951153223,1953250366,1915763770,2000239677,1966095417,1048784398,1962934289,113651206,1345323029,771754680,1124087,1155886,753152600,100740656,216727569,201784878,772139776,853758,1480370923,1631331956,2050754162,-551288193,309614652,510936124,695485244,544494396,-385790232,-969998511,100667142,319211310,-352317440,-953249669,167777030,-1871582464,268893742,-208972288,1040368515,771912331,1064576,-1408600832,997457980,-352263704,244002358,-922025967,-2144465548,3134,-397015691,1449001000,1946172588,12642309,777975531,802432,772568064,1117835,57985291,-402651160,-379715369,-768344359,1958742700,-118799869,58116651,-1023376920,-2081191082,-1958870333,-2144468414,3390,-208991372,1040368515,-352169333,1406284546,322341678,244002304,199753745,5302272,1526763240,-24123042,-1031057335,-151530957,-145172341,1356498934,1951973899,-404204793,199973887,205422638,57999360,-1962925592,1913273539,1048587789,1962934286,100806149,381353999,521018880,-397336617,-1017577454,192858379,1417262,321617,-1007033767,1157595562,-1023314944,1392514233,169773870,521018880,-1275055942,522308928,3194715,822051267,-2115996672,-1962921745,-2365233,784348099,771755170,771755426,771755938,771756451,1377990,279064096,49920]},{"sector":7,"length":512,"pattern":0,"data":[14572109,262173,14024736,63176703,533268480,5841,30,100270081,382862052,440139776,445513728]},{"sector":8,"length":512,"data":[-1957363712,11319532,1443765480,705037472,-754404892,84839136,65874438,1552320961,51002879,339543410,-1207011837,-1202716671,-397409992,-998046958,302434052,-955252978,16733318,1518782208,-385875457,-1635057189,-472776870,-1962510709,792690712,1857583988,-1635037184,-472776870,854077695,79987468,-10582391,1014284299,126539915,-11106680,-1962932282,-771794274,108432355,-2037698305,-2030043308,1354366804,-1947601152,1619168752,602427647,79987476,-10576245,-11106678,636159880,-10838389,1988879313,-1959723258,-43898,-1174449018,-369688496,-2104627061,-397344928,-998042638,1485227780,-1962934017,-771794274,108432355,115880191,46433048,-10975685,753468287,1520339713,-1948003841,411764342,-10963317,1966028928,1520339835,-1948003841,814417526,-10969461,704725130,-51883804,46433034,1128129578,1986491392,14149891,1946173757,4341066,1891127668,-1635037184,-472776870,-1962510709,1485177600,-397393665,-998044557,-2133292284,57933887,-1207920407,-1957691382,-771794274,108432355,-2046623605,1346436952,-2096231448,2091058372,-972690688,-16744442,-10975489,-956346135,-16744186,113701611,-352321404,-2063153429,-454295808,-10838389,1988879313,-1959752954,-1962977122,-467008960,174450768,1006814339,-1205701310,-1957691382,-771794274,108432355,-2046623605,50724696,-1444392960,79987469,-352289117,-2113485149,-1662255360,8586950,-946476033,-1811017210,-1198658791,860880897]},{"sector":9,"length":512,"data":[1139298496,79987457,1040154089,-1804337076,1946177085,5520855,1463671156,-385649408,434765691,1518796799,71732223,-10844615,434701181,1421771774,225706751,1342177720,-397361101,-998047486,2084471556,125107968,8521414,-955847681,33586182,2118025984,108396288,8259271,1048576100,1962934401,-2109833128,1366622208,1342902968,-10451315,260696144,-955988861,16734854,-1205736704,-1957688558,-771794274,-2034761757,139520000,184861827,-972720704,-16744186,-10844417,-10838389,-1081875503,1962934406,-2126610222,91553792,8521414,-2126610177,477364224,8535680,-2146994944,33598,28839540,582504448,1609060353,79987456,8732288,-2145946624,33854,113707124,189073680,113712619,195430672,1048581611,1946157188,268879624,-350658551,268879622,-2146766839,33086,1183649396,-2037559120,-397344928,216727623,1353729677,-10451315,34531408,1577370755,-1017256565,871140181,181921984,294531,1996427124,9746436,352381008,-352009085,21936138,351594576,-16595837,568854134,1575324437,-326412861,-402649416,1448544933,-637242,1342217400,-402360577,-998043685,-28931836,594919435,1342923752,-1207666945,-1202716264,-397407470,-998043248,112648,185776208,-7542704,-1207647101,-11534177,-1528297866,79987471,201082505,-400329280,-11531476,-1732770186,314068993,1508397067,147096337,1342177720,1342902968,-2080418328,-1070398268,-1980479863,1586229830]}],[{"sector":1,"length":512,"data":[38797310,163715,1586171772,-16282626,-1965520121,-337368569,-25755895,-2096139032,-259325244,-1957661632,1342176350,41911042,-1961919488,126614622,-661977089,-467007606,1996425707,256633084,-1962752893,527712504,58062651,-973044247,1459680838,-193527978,-1192069377,-397410142,-998042634,-9573622,1996424822,-1958089980,1342176350,41911042,-1961919488,126614622,-661977089,-467007606,1996425707,251390204,-1962752893,443891960,16154240,-1070397324,29276240,28846059,-504868864,46433043,1996432107,108461828,1342287032,1342902968,-2096073752,28838084,314068992,1877495819,79987710,32654979,16012931,1442781161,-1070338933,1460222184,108432214,-2096464245,1946160254,205949764,1178322435,-1959100668,-956101562,2131248699,205949744,185356031,-1960151872,45696967,65664769,1074664966,-963948480,65664838,1074664454,385830976,-998045424,1958742788,-339725360,-18429,-443850914,-1957313699,1882348,-972500760,-1191188922,-11534156,149423222,79987470,200296073,-400329280,-11531888,-1732770698,314068993,-1108848629,147096335,1342177720,1342902968,-2080523800,-1212676924,1996443648,231860230,-1996176253,-1072960442,1508385653,1996443657,26785798,185776208,260499536,-1207384957,-1202716671,-397407470,-997982846,16955396,8269559,323414096,-1560099709,-1073017324,45618548,2117007105,837308416,46433043,185472675,-1207274048,-397409831,-997982898,-1983892734]},{"sector":2,"length":512,"data":[1183443526,-129594898,-1912715639,-1588527546,1177223294,1996443886,16955632,65957623,1343099910,-2096935960,1174472900,-129593874,8298832,1357530667,-1192462593,1861681410,369492970,703090702,147096323,-2081798655,1962995326,-360807649,-2145815296,1962993278,51046659,-1202667469,-397409858,-997983014,49998084,-1411329,1944645238,79987464,-941341047,59462,971261579,494790726,1342177720,-1542401,1996483190,-294191128,-2080488216,-1073083708,1424556916,-465138943,1961379385,1354773265,1223181963,136243280,-1996176253,1996482630,-294191128,236205823,-2096936728,1183385284,-394854418,-1411329,-401729994,-998046923,-364476154,15629955,-1073019019,317260661,-28930561,8298832,1357792811,-1192200449,1861681410,335938542,1575505934,147096322,-1913764351,-1588529082,1177223294,1996443882,16955628,65695479,1343100422,-2097005592,1174472900,-2000669974,1183381062,112892,-1980086647,1183441990,-196703758,736773771,-1957629370,1177284166,-1947709212,79987463,-1554807,1342209078,-2096661016,1183384772,1996443880,-361299982,-1804545,1592323702,180651005,2004140042,15091398,-1207666945,-397410118,-998043454,-461963516,-11485133,-401730506,-998047060,108461830,1342227640,-2096060952,1996424388,1354773490,236336895,-2096984088,-826800444,-1947709440,46433040,-1804545,922742390,921177620,113541890,-1161591,1996485238,372703210,35907598,-1996045181,183102022]},{"sector":3,"length":512,"data":[-398000130,-1946254871,1177283142,1183535354,-196727826,114878544,-1996176253,922740806,-397410180,-998046006,-398030588,-92864688,-1411329,1996485750,-55842578,168477827,-966691648,-16718266,-692583306,266883072,79987472,871659263,922702016,-102232556,113541889,-1207535873,-397410080,-998043662,-92864764,-11485133,-401729994,-998047268,15382534,265873488,-16595837,1996485750,339148782,25421838,-1996045181,1996484166,-11867654,-1946925313,1178199110,-954761484,128070,-1947973889,1178201670,-1995997980,1187439686,1191182332,-96039950,2129806905,-230242534,1191116801,-364475398,2096776761,-297366774,-956676471,-2130708922,1962998910,-27203325,16154240,1474888565,-431569154,8298752,2112767545,-364496635,-390590852,-222801919,1206407168,79987471,-1207666945,-397410059,-998043846,-297366780,-1070378936,339148624,19064846,-16333693,-4716938,468209664,79987471,1223313035,1354773328,236336895,-2097085464,163055300,-1552383,46433038,1342177720,-2096157720,-443874620,-1957313699,178412,1443146984,16664263,8579328,-1207535873,-1957691136,1077937222,303497040,113541902,2004140043,236076673,359995796,1074022027,1189630016,46433039,1586229387,21022212,-2059501568,460587008,1342247352,1074022027,2028490816,79987457,125157387,-972792181,-1962933689,1077937222,252700752,184730755,-2146994752,34110,1586173045,175540996,76219647,1182861193]},{"sector":4,"length":512,"data":[-16711164,1183579718,139394824,57982987,-1946193431,-1956708794,1438866917,-1070338933,-1962670872,1178142790,855932678,-1960318016,1177224774,16955656,-1957631497,1344144454,1861730699,71697160,-521646050,180650756,721831563,-443873210,-1957313699,-390056980,1048576965,1946157184,138840908,1023821355,1098776578,-150928712,1174603374,1088966660,46433024,1342247608,-2096245272,45613764,141489921,1342457347,-2097142040,501940932,-16365941,45680198,65664769,-397409210,-998047729,138840834,2114340409,1575324643,-326412861,1592311859,-2093055997,259260416,-16490869,18331703,226814032,-1962621821,1077937222,18790480,225765456,-1017256565,-1192457387,786956294,106859267,-1979300097,1357130247,-2097079576,1183318724,73305084,-1979431169,1374497295,-386251127,-998047485,-28932094,1962559034,-62486003,1996375608,112653,-1073083413,-1070350475,-4717589,1575324671,-326412861,-622280653,65754626,-1962653953,529138782,-2013855958,1963460261,-16520209,1586169414,706710022,-1517816065,-277542906,-1962647925,76154486,292882232,-2147203329,74776639,367771699,-351910145,73305026,-467007606,-1979294069,736963087,-443851071,-1957313699,178412,-352159512,71761667,-1979425141,-151049697,134653319,65793909,-1962522881,529139294,-2013855958,1963460261,106859503,-467007606,4319312,-1962752893,260703326,-1991119574,820575814,46433024,1979598394,73304852,-2147203329]},{"sector":5,"length":512,"data":[74776639,367771699,-351910145,73304999,-467007606,-1979294069,736963087,1575324609,-326412861,-402649416,1048576509,1962934809,-230242530,481835008,-129595122,1358055053,1358055053,-2096338968,113640644,-64999,-15847370,-15847882,-571997066,1575324416,-326412861,-402652488,-1957297731,585827446,-467008374,7399504,184730755,-2096794432,250282694,-467008374,-6952880,-2013084541,1015039492,-1948683008,-1956772794,1438866917,45673611,25159680,-1976636586,1357130247,-2097138200,-1073020220,1182991988,434831876,-351897973,73304844,1963407532,-339506428,3964946,1191178101,73304836,1962950528,1589654474,-1017256565,-1192457387,921174034,-297351423,1048579608,1962934812,35299610,-955377501,924166,-294191360,-2097133848,113640132,-64996,-15853002,-1978787786,-467008442,5105744,184992899,-1207601984,49020927,-443826125,-1957313699,71732204,225829898,108159292,41384508,1593778220,1575324422,-326412861,1586190166,104303364,1660991518,-1992941107,1603024439,1594302210,1575324510,-326412861,-2046540149,-987867424,179046006,974222528,-1408403516,-227024838,536870840,-1878594722,-352321352,1575324662,-326412861,1996445526,189261830,1073923203,1988876427,-1951597564,108956619,-160059662,1610564749,1575324510,-326412861,1996445526,186640390,1073923203,1988876427,179108868,-1962314560,108956619,-227234062,1610564749,1575324510,-326412861,-1946396842,2123039862]},{"sector":6,"length":512,"data":[40811270,-142092372,-676536182,-533006457,-469104267,-4657547,168225791,871855332,-1956749376,1505975781,-668214133,507185778,74580510,-503323765,-385874968,-1957361157,1431787244,1484057867,771913355,-386040704,1150099573,6351101,-402511942,-963968951,-29097170,-1174384152,988283454,7244544,-2127637781,1459617148,1150098549,3729661,-402509894,-1976696799,-392626364,1002045482,1304578,-963915285,-1174397464,-236256736,-1956749475,1455644133,-1951534453,-1144484906,1085538305,-1017241139,1153369886,309506,309585,1348059347,67112741,1983462448,-1442380798,-1159077288,-890764734,-1957313537,71732204,2131117627,105286403,-1017256565,-1947432107,1178272838,-1962705914,-443873722,-1957313699,-390056980,1048837917,2080376318,99787017,100533817,1220019580,-1962218750,-788136418,-1467511837,1575324421,-326412861,503732054,-485732725,142525485,-66816315,1178327180,991458570,-1961593865,1002843079,-1962118207,-134002495,-201461757,-788010076,1940255721,536650753,-1956749561,1438866917,106425483,75416828,-1962391926,-1426912690,-443851001,-1957313699,440556,1476303080,108954454,-2096727038,2114979454,-18427,-164407317,16533190,-16490869,126485574,200838040,-166234881,17212805,1166869876,-1962743008,-151483449,-2147048059,2122320501,-915144452,569099915,2134507395,821003013,-276626453,108935511,1183573118,65992454,-957314105,-335545274,-1956684113,1438866917]},{"sector":7,"length":512,"data":[79228043,-31463424,1325356631,75401990,425603,1586180212,38797064,163715,1586171772,-16282872,-1965520121,-337368569,142016265,-2096931608,-259325244,1962933891,184451845,96866933,-97536,2117666165,-1203145724,1189806081,1947074179,167674803,-963966348,-12122744,-1528101298,-1962510593,71707591,754976549,-654901240,-26154928,-1962621821,548951792,-947171328,-555200482,147096574,1982463491,-9115386,1600045107,-1017256565,871140181,-42211136,-16222465,28837494,1996443648,81258500,990430339,292881990,-1207404801,-397409706,-998046691,1958742788,112645,-1070398741,-1017256565,-1192457387,1055391876,-62470147,-2037579776,1183448956,1996443902,12642310,184861827,-15698496,1996488310,11593732,184861827,-2147191616,-16188338,-689373578,46433031,-113151,1996488310,30730246,184861827,-15698496,1996488310,29681668,184861827,-2147191616,-16450482,-1494679946,46433031,-113151,1996488310,18081798,184861827,-15698496,1996488310,17033220,184861827,-2147191616,-16581554,1994980982,46433031,-113151,1996488310,8513542,184861827,-15698496,1996488310,7464964,184861827,-2147191616,-1929249714,1358920838,-402098433,-998046954,-62485756,-1017256565,-1192457387,1659371522,1522030332,1996443650,-70129660,-1962621821,2088781552,57999615,-16484725,1996424310,48293894,-1962621821,1579877982,50692,-402229505,-998045959,1958742786]},{"sector":8,"length":512,"data":[112645,-1070398741,1575324510,-326412861,-402651976,1448606737,-1207667061,-1957690788,1086819326,-75896752,-1962621821,3965168,1589176693,-396931070,-997983385,-2133292284,91553855,1949187456,1476299522,-402229505,-998047114,108461828,-2096719640,-1073020220,28837236,855829248,-1956684096,1438866917,79228043,-72357888,1988843095,1656245764,-24424446,417879879,79987707,1015083147,-1192528640,1464861286,-2080700696,-259324732,108461911,-2097012248,1586169028,735970054,509663,-402229505,-998046151,1958742786,112645,-1070398741,-443850914,-1957313699,-390056980,1996487505,74907398,-2080403224,1996424388,101443590,16958595,1996424774,74907398,-2080434456,-1070398268,-1017256565,-1192457387,518520836,-1202300933,-11533720,-1930951562,79987706,1015083147,-1928956928,1183383876,74877700,40548430,1207864144,-93460393,-1962621821,3965168,1996483445,108461828,-2097053208,1586169028,73280262,-16776762,-1696070026,46433029,91537419,-352321096,1589654274,1575324511,-326412861,1443032195,-1962308376,1962281968,1996445199,74907398,-2096268312,48957124,-1956724685,1438866917,-1957237621,1149895798,-2086037498,-167349248,1950352964,-18426,-167732503,1946289732,105676806,-2131825888,-167705012,1963722308,121932329,-774337640,1653077731,443875592,1342308536,-2096807960,1149829828,1958742788,-351752188,134524930,2088961604,208994308,-1744354166,1661329617,71600392]},{"sector":9,"length":512,"data":[-1996209013,105182724,-1207602172,65732609,1342308536,-1979419393,1352140612,-2096619800,1149830852,2143292162,1958742805,-350179324,135311362,1153893956,-385875966,1291845483,-14906622,705137156,-443851036,-1957313699,49054700,1988843095,179972,578090507,1946172544,-1964485091,1357316868,-555198634,113541898,-1202665589,1464862100,-2096443160,-224327996,-33146619,-2095874811,392766,512429180,-472840706,94930827,-1749548053,1458604805,-2096870168,1448084164,178251863,-1207516029,-1202716671,1464862117,-2096459544,1599997636,-1017256565,1475119957,-1962467754,-141883778,-4603853,1101984511,2123094519,-203977980,1589808036,1438866783,-326898549,-11118842,-85457802,46433027,1996486795,186574854,-1962752893,108462064,112727,74907472,-2097120024,1183385796,108462076,192997462,956613763,158727294,-1979425141,-342294719,-18429,-443850914,-1957313699,216826860,-41200041,-972361853,-1958607291,1166607430,-955938556,2147418693,1342719629,1460041471,-2096292632,-259324220,-2097000961,2080375421,-1950338548,-2012872931,-337368569,-1070377206,95807568,-1962621821,-1956684090,1438866917,-326898549,-1957275898,2123039862,105286410,-1995938057,1183447622,1958743036,105248315,-1975618292,-1952970939,-152841768,17326727,1308569461,41779970,-1978893312,-14841084,705136645,1460399076,1352139914,-2096801048,1173750980,91496454,-622215117,1325352448,105248508,-1978501880,-1952970939]}]],[[{"sector":1,"length":512,"data":[-152841768,17326727,-1545010315,-58817792,-385649408,1183514761,38091260,1448090738,-756533761,113541899,704398987,1183515205,-955973124,64582,2105791467,561250306,1443001855,-1360513537,113541899,16926091,38112005,66864681,1170670197,-352321534,38666156,163203,76156028,100605323,-467007608,-1974006805,-397371388,-998046529,105248260,1176007968,-369340673,-1973944449,-397371388,-998046553,105248260,-1962052576,1177287238,-137221124,535496310,-61931706,16547459,1308617076,41779970,-1966113792,-14841084,705136645,1590619108,1575324511,48218051,145035,-25037013,57806848,-99614530,-998123634,1945833022,21620995,-72575,1210485046,646526470,-963967418,-523041615,1151546952,-852446202,77805089,1929526278,-1070391766,-1172369840,162797347,1154163149,840979279,1864380462,1634476146,544367988,1970365810,1684370025,52693517,37128695,734235648,-1260652578,908184906,100408972,2897547,12064286,908184885,104865417,1107725366,-1205924346,1387930880,908184856,149163659,-986307869,-1945573882,920335322,149036799,-857144461,113587712,-628356886,905970619,149036799,-1073996025,1085868270,869214990,380302272,-400619754,79366806,1140897792,175251917,1954595574,579829765,2034974726,109045996,-1157243672,-75429650,141756654,1528299347,-219462845,721422009,101105377,118946955,1290314995,-387108091,-397350900,168624284,1667331155]},{"sector":2,"length":512,"data":[1986994283,1818653285,168654703,1766066701,1701079414,1920099616,168653423,1816529421,1769234799,1881171822,1953393007,1953459744,1634692128,224683364,-1173180150,-315484166,45817614,-851397632,-1205922271,-397410049,280036789,-350745414,-1172459035,-555018212,-2081649835,1448543980,1443351230,-2096647192,-125107516,1342588557,1443133183,-2096495384,1183385284,-396929286,-998045670,-96040188,-443850914,-1957313699,37651436,74711046,100800255,-402360577,-443873955,-1957313699,-1957275668,92996734,-1962779253,1435173965,141921030,-854950517,2123061025,-1996125946,1300824669,106268932,-1895271031,74582597,149681715,-1106216216,92995585,1577874825,1438866783,509078667,75401991,-4603853,-1951468801,-146784063,-1017290792,-1947432107,1333789790,-443874818,-1957313699,-1151904020,1065551514,506033408,374791,1963061224,-1715457275,608183531,110797822,-1777951581,66759,-955988349,-65980,111163017,-1945874805,-390033704,1583284377,-1017256565,1475119957,74877782,503742091,870288135,-17984,-146690318,-201618471,-12285274,1161480499,1946514175,48972037,-1047801353,-1017290914,-2081649835,1448543468,-1962379637,2122515582,712310790,-397012245,-997983771,-28931838,956921152,242549886,720093235,-1996601718,171722501,96864373,71731968,1325340907,-822266,2088960588,-897843198,83827851,-467007606,1600047083,-1017256565,-2097099799,-126619911,-18775999,-66947189]},{"sector":3,"length":512,"data":[-1459713107,1212314625,359907643,-268185461,1946265773,96600884,-141885438,-335657847,1962839014,-1980169460,-1054081460,-351958712,-17235195,-963903924,-92153204,91488991,-1440838618,41912583,113649347,1023543214,628424702,-268173685,1946265773,1224641522,-1116487365,-268185461,1946265773,96601058,-141885438,-335657847,138906598,74760203,334223502,-1374749146,-1945078777,48184792,-1910110860,-1962432994,-1950487753,-1070397833,989878760,604861638,-1740619775,1946177000,-28443123,1946160104,1313773061,-1070359829,-1957575783,27852357,-936705164,-1170128567,992378879,1980214294,1978323204,63015925,51737286,-150113598,734143442,846022,-755562379,-445257007,-1017528269,501764434,1461220352,-259260789,1153954307,-1979711746,-695531913,-1991583957,1499004501,1347666778,1377751603,28856402,520507392,-2096127768,-92075836,1532633087,-771030412,-326412861,1459940483,108432214,-1744419702,1946190761,105182726,-1207536576,-622198785,105182720,-2147060735,-350222772,105677038,107249666,-1983892497,-125107644,-151093623,1963460164,121932303,-774337640,1653077731,812908808,2083208331,2130643716,1962891026,121932292,-1427615592,113541891,-1946270071,-1992293308,38061828,1552613887,71731716,1793787784,67519734,-25080203,762644426,-1744354166,234612816,184730755,-952797760,-1694105082,71616298,1149896978,-661940217,-2017008687,-956233630,-351726844,33601720,-48568240]},{"sector":4,"length":512,"data":[-1996307325,-1073019836,1283458676,-1679095802,67521664,1459618239,1342457485,-1744354166,53209168,-1996045181,2117729862,-385649410,1183514417,1592011268,1575324511,-326412861,-167485813,17174151,-1070398092,-1962080535,1451952206,-851463162,-1274776799,-167056631,-2147081593,65536884,216656128,-1946396842,-1946514446,-1273240632,-1002787827,440145780,-2017065099,-352254450,1191544837,-947131422,1583333931,33129411,1015023476,-336759798,579335912,427048966,-851181384,549648161,-1928694528,-1274564586,1914817855,-351620907,-1341733329,378339335,1068763056,-1032707635,443858955,17333891,-4644748,-1194226689,567099905,-2147483207,168276030,229640052,-351906165,106335124,1048613611,1963591600,1438313433,-326898549,-1027713534,105155079,8628632,-1070393995,-2013117303,1149830724,-972781308,-1946220732,-1962021946,147227590,143263291,-1070344331,1575324510,-326412861,1460202627,171346774,-1206392058,-1202716660,-11532366,211281972,184992899,-2096597824,1015218886,-2082179840,963903548,-947700597,-28915956,92930048,1183422535,-1977816070,-12740603,839152896,-1979520064,-27358459,-1996601601,-16375161,-2092434866,1962998398,313310,-1956684288,-1883021851,-1912094714,856030238,-1950250039,1241091049,2897547,141882891,-1359821170,-92950971,608212805,-771912706,382010341,-263460833,-57946229,-326370045,-561117418,-481692109,8292621,-1431550651,-92946422,1317663714,-1994451456]},{"sector":5,"length":512,"data":[-16381402,1426571302,-289674101,-285507320,1393062664,1130043391,-386733245,-469105622,2122320500,74776580,-33274170,1075234078,620804102,-1960894003,-485956594,178951,149036799,-1274788213,-1893610164,-1912042490,369490974,8437255,-768370516,71204902,1701970694,738627152,-1950338304,-1949173816,648999672,-109771464,-1962686589,-1949173816,92940023,-533053113,574362740,154929268,540804212,374926197,8502791,726608875,1962871806,1120898033,63146843,198081,738197029,519867360,118890246,548447475,533433258,-352288322,80251662,738075652,-1191408672,-206888893,-1430156380,521598091,-1948480688,178957566,1010660544,1444902178,101058303,1958742700,1965177902,-8552441,1325692252,1206774698,16729542,938005995,1322284032,117392982,-1431566842,141869066,1962943976,-1428034571,1263269003,141816635,-1995995219,-219414972,-770974581,134152821,101197449,143402751,41158972,1438851132,1586228363,579335684,242491398,859964088,-841905207,-385649887,-2013918741,1971324450,8513795,-1962389877,119408214,1476182067,-1947169962,-1201282054,-1359855606,-1957612939,1237986255,567087331,-1645214820,162792563,-1073002005,-1186582668,-1900412926,-851397624,-1274776799,188017417,1494906048,-974399605,735021905,-1675506230,1939730435,-351685628,1975520026,579335702,192167942,-2147066229,58006079,-117117960,1495009464,-963968398,1625907038,139365129,-1274653045,1931595072]},{"sector":6,"length":512,"data":[-351685628,200008685,-152603200,1074143879,-628422028,1964654464,-689178621,470333689,-1957310229,1988843244,-889290492,-163810041,1963722308,121932342,-774337640,1653077731,661979400,302269639,121932297,-774337640,1653065443,113705224,714802690,148679,71600898,28837001,-2127238400,1963451134,105182764,-1977191156,-1952970940,-152841768,17326727,12064629,-1914155006,46433272,184829065,-2147060544,-351795636,1589654457,-1017256565,1458342741,-2096728437,1946158206,-889290420,-1977256697,1352140612,-2096557848,-1073020220,-397011340,-998045338,121932290,-774337640,1653065443,451608584,132316801,-397010059,-998045366,74776322,-2080891416,1686110916,-1070336250,1149830281,-443851260,-1957313699,116163564,1988843095,106859272,1033373578,1114898529,1946186301,7814408,-2031537804,-28915968,1191116801,106859270,1965768576,-28409849,105316104,637421195,20774919,1025143808,880017410,1946158141,-955192524,196166,1187500267,-352320258,-134270007,589382,-813627276,-410976254,1586233342,1950318598,-813625227,384516096,-352124481,17416158,1586223595,1648328710,-813628299,-1531412480,-11055103,-219675530,113541897,200951433,855932352,-146609216,589382,1153828468,300646406,117327607,-972655616,-352188860,105170436,33998593,841652998,-94467136,-2021071919,-1986525086,-1070398908,1149830281,-96040444,-1962457976,-1956684090,1438866917,1448602763,2123040542]},{"sector":7,"length":512,"data":[108432132,1317787531,1996372744,63343380,1945648065,66126604,-45134087,-335764237,197626657,1944637894,868715274,1927860678,-1958107925,-202780199,1944834469,637831685,-1031076472,-1017290914,1458342741,901379635,-52153856,-488623444,1442087163,3477246,646448757,300613684,225764362,-1157613894,431554562,-851397632,-1564462559,-1956773835,1438866917,1656286347,-342104063,1988843095,-1568240378,150643710,-1560000885,1183516914,150381320,144949299,151429897,1962949760,21620995,1948597376,17492227,150996679,-1070399487,-1559691613,44239086,150250249,-1559693149,212011248,151954185,150734535,854261792,1965898880,235339526,-2144867575,209005372,150865663,149948103,384499712,1965046912,-29457651,175439880,149948159,117376235,-1975121652,-397371388,-998046201,1975520002,79189695,-1863823351,79987461,1015083147,-15567570,1174992902,151042134,91875408,-1962621821,1815904496,113706869,133364,3964998,-1595341963,-1744532992,-23165303,1946174781,4668682,1480394100,-16157440,-2096566778,553557638,-23165301,1023435565,1047986197,781434883,600483839,151127807,151783111,179830784,-2014818304,46433024,146297067,-1192039680,-303366128,-397361101,-370474592,-352321096,-1632174091,35580158,-24388629,599278059,599597972,599598013,600187846,600187846,600187846,598090694,600187846,598746054,596648902,600187846,1048781739,1946159368,151429381]},{"sector":8,"length":512,"data":[-381280021,1031863974,1191605285,1962950016,734497781,-396996410,-998046946,-369652988,1600061066,-1017256565,-1192457387,-152567784,-2091493399,1946813566,34012932,-197229815,376700936,150347403,1468729227,-129595134,-2080745847,67696134,1048783339,1946159362,-165770480,-1995994360,1187510342,-352321286,-165770483,-1727558904,-1980217719,109312598,-2097018634,592958,1183518068,-96072712,1183516020,855829252,151692224,150615691,151142019,-2094369536,2097216126,75399972,-971541238,-1958335228,1452013638,-2082932742,-621346606,-1980217719,1187510870,-352321034,-163133691,-41222144,-15143037,-11074442,1996487286,81783032,-2096577405,587838,-396943244,-997985283,953090,-1983370487,82574926,1177552070,-113013,-1072955826,92992127,1048773768,1946159342,2086747143,539787267,2105558854,-428539649,151142019,-1592494848,101386494,192153840,16154243,28837237,855829248,1441288384,46433026,-443850914,-1957313699,571628,1474873576,-66664618,-2097143800,1946158206,114192,-2096564575,34141702,-335788407,-165770445,-1995994360,109313094,184682742,-955943488,143719494,-386107649,-997985447,-2081387774,587838,104401524,74647808,151008907,151273099,1048837675,1962936590,250107655,46433025,-59310250,-2097058328,1048773828,1946159374,-152545529,46433024,-443850914,-1957313699,178412,-1578615576,1183385846,-130120706,108331016,150996679,922681350]},{"sector":9,"length":512,"data":[922683630,1996425472,-97059068,-25755896,-2096921880,2122517188,108291844,1191476867,1048778869,1962936588,4096785,175374345,150615807,-2096928536,1048773316,1946159372,4096785,175439881,150615807,-2096932120,109249220,-955774730,592390,150905088,149947915,1996427892,55699710,184730755,-1207601984,48955393,-397361101,-443875036,-1957313699,-390056980,-2091456611,591934,512440437,1342114034,41911042,-1978565632,512427078,931858674,76023807,233563178,150091519,-402360577,-997985149,108347396,151521023,117376235,-1956771578,1438866917,45673611,-414193664,1048794711,1962936584,74877777,1249834507,512439275,1342114034,41911042,-1609466880,512428284,1066076402,92801023,250340394,150091519,150746879,-2081150232,1967129796,134676228,1321634569,-964706293,151535235,-1962445568,100729926,1599998214,-1017256565,-1192457387,-421003262,-1957275674,2123039862,138314502,1282736137,512439787,1342114034,41911042,-1978500096,-232879356,-15758584,-1999009017,-337368569,-231276786,-1744532984,-205395888,1074054275,117376117,-1958344440,-1073000505,1048822901,1962936584,105286407,151389697,-443850914,-1957313699,702700,1474723048,-97088682,-1983892728,1183448134,71207928,854087177,46433265,737822345,75377656,-1324807519,737727235,238978040,359989257,1965898880,-63012080,158674952,-397371220,-997982572,-63012094,192163848,125763339,151928451]}],[{"sector":1,"length":512,"data":[-2095483904,1946158206,-129564922,-2097127704,592446,1191118452,7334140,151928451,1462138112,-2080462616,2122515140,158597124,16285315,887620469,171868928,158597129,16547459,1122501493,-92864768,-18290602,-2096839549,593470,113708404,2099452,-26482601,1577239683,1575324511,-326412861,-1293369293,-29457435,74711048,48966576,1352147120,-1946289176,1438866917,-1070338933,-1192913688,-397410256,-997982744,171868930,359993353,149831299,-1341885440,-1341985960,-397371272,-997982772,1575324418,-326412861,-402652488,1448600929,-2147060085,242559548,150347403,150341251,1178569474,-13419797,2083536000,960266291,1043934847,192219384,1966095488,-66664698,-1409273848,-774927464,65130977,65130959,820609992,1015085451,-2147124176,-478267076,-1996202357,1590070079,1575324511,-326412861,-402652488,-1101601543,233506967,1178076298,-1207601916,149618689,3964998,-1070338443,1575324510,856191683,1575324608,-402230333,-4718579,1575324671,-387697981,-1564278783,-469105140,1048585077,1912800772,1931623437,1914715149,-351948795,322736135,330302070,-687301445,100574104,-339440957,-326412809,-1947287832,1438866917,-1259803509,1575324654,-326412861,-1947292952,1438866917,-1595347829,1575324654,-326412861,-1947298072,1438866917,11791499,1426266601,1586228363,352027396,-75296387,-166953984,1074143879,28837236,855829248,1438866880,1448602763,1317734174,-1959795960,75402201]},{"sector":2,"length":512,"data":[-1070336117,-218103879,-638107218,41339707,-24392821,-217680245,-12285274,1161480499,1946515455,48972037,-1047801353,-1017290914,-2081649835,1448543468,855930507,-1897376001,46433027,604390538,1963080707,105182780,-1978698488,-1952970940,-152841768,17326727,76228468,-1996209109,-1072956346,-11527298,1149895796,-397371385,-997985067,-62506234,1283458932,-4251642,71601151,1153893513,-1962934270,-1956684089,1438866917,-326898549,-1101637884,-13432894,1149900779,-2086037498,1443591168,-2080409112,1950352068,-964475135,-1976157944,-1948028152,-1956684089,1438866917,1465314443,142508806,-1086819072,1451951688,71731974,-402164408,661782611,915097835,1950877336,1962359569,38046477,1443645065,1577073384,-964480909,-1728151292,184840966,-1207536174,-342228993,-2082829539,-607055933,-338492495,567101620,-1986860686,39094532,110638729,1594343475,1575324510,206474179,1278867339,-2096335870,-25099066,-227211624,-1958745095,1914438618,-1898738887,1979136961,1142831366,-2094632186,-607055933,-338564143,-147067951,-654112395,721812641,-1262448936,1914817866,1979136781,1142327556,75993606,1438896523,-13439861,148651656,839272075,567789,548733556,148582024,1023410981,91553795,17200769,145799680,567089844,-1962924103,1320420438,57876941,-1962894359,-930412986,1023737893,125109504,-116324936,-956468503,17358086,33597841,1451953012,1124120580,-1595334195,239872,11097972]},{"sector":3,"length":512,"data":[-162368128,-2146902266,45108085,148637194,-1274784117,1914817853,12096455,-165556924,762675394,-1946157127,1107474641,-638115379,-1274498886,186764607,-2146011968,436777022,-638120075,45666699,857853250,-851397431,-851528671,105286177,101319460,1451952348,-851594236,-381980127,1190592760,1962999814,178182,-956339991,580870,-402098433,-1990655696,-315488178,148637430,-150505985,132678,-511704203,72780798,567098548,-1326906509,-603523332,125173512,33965815,-1825409792,567099060,604391050,-603583997,72780552,567098804,116840562,1963002077,138868500,225705985,-1828599424,-1207675253,567100161,8055187,1317754455,71731978,-1962518901,509020286,177470471,-2095876928,242551545,175755787,-139842128,13796315,-141829385,198325138,-150833984,-235432975,80971666,1983462448,-1440283646,-1022639477,92856949,92712015,1342129288,-177014981,1566531160,-326412861,148571846,108461824,1493196776,-1962520951,-315489194,567098548,-661959310,-1207675253,567100160,115191,-919468939,280036075,411383,-150047424,-2147482042,116787829,1971325151,-2134278141,148573706,-1207842432,567100416,-1024015477,-2147257216,-1886895927,-2017065438,-385874418,-1957299293,100704748,1586221303,-2117917948,-1463811869,-2147256960,1586037195,1438866692,1586228363,107446276,12803535,0,0,0,0,0,0,0,1766596675,1918988898]},{"sector":4,"length":512,"data":[539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,1163412782,1112485376,1278083146,771768905,5066563,1313423918,1498623488,3080275,858927408,926299444,14648,-1,0,5243135,5898325,6553695,105,540697446,684837,1912627826,807731298,978873400,842016032,807739480,677938,1912627826,707395682,539634218,684837,707406378,1931812906,707395594,170535466,707395594,539634218,684837,707406378,1931812906,707395594,170535466,1931804682,707406336,622864938,704645747,707406378,175318304,707406336,168438314,774766592,620759598,540697653,1931804704,1850277898,1886220131,1651078241,1931502956,1668573559,7562600,1868787273,1667592818,1329864820,1702240339,1869181810,1937047662,979724129,543385120,1566650203,1647270688,794501213,1528847715,542993455,1651257179,542985806,1568091995,1949260576,794501213,1528847726,1313754671,1713397070,828730473,1818846752,668261,1852727651,1864397935,544105840,757101349,7546144,1814065957,1701277295,1752440946,622882401,1869480051,1718182944,1701995878,1936024430,1668179232,1953396079,1684370021,1953853184,543584032,1869440365,686450,2037605714,1713398638,1701603681,538979940,1701603654,1918967923,1869881445,1768169583,1919247974,1551134309]},{"sector":5,"length":512,"data":[-1618935698,64736,34734080,248905728,1059061765,104808255,1094918144,169888844,1094918144,1528843340,19615810,154880,264717,0,1852534389,544110447,1869771365,168624242,3801088,794558510,794558522,3014714,794558522,16777274,84148994,151521030,218893066,286265102,353637138,421009174,488381210,555753246,623125282,690497318,757869354,825241390,892613426,959985462,1027357498,1631600446,1701077858,1768449894,1835821930,1903193966,1970566002,2037938038,1566333818,1633705822,1701077858,1768449894,1835821930,1903193966,1970566002,2037938038,2105310074,-2122285186,-2054913150,-1987541114,-1920169078,-1852797042,-1785425006,-1718052970,-1650680934,-1583308898,-1515936862,-1448564826,-1381192790,-1313820754,-1246448718,-1179076682,-1111704646,-1044332610,-976960574,-909588538,-842216502,-774844466,-707472430,-640100394,-572728358,-505356322,-437984286,-370612250,-303240214,-235868178,-168496142,-101124106,-33752070,16842750,84148994,151521030,218893066,286265102,353637138,421009174,488381210,555753246,623125282,690497318,757869354,825241390,892613426,959985462,1027357498,1094729534,1162101570,1229473606,1296845642,1364217678,1431589714,1498961750,1566333786,1096834910,1162101570,1229473606,1296845642,1364217678,1431589714,1498961750,2105310042,-2122285186,-2054913150,-1987541114,-1920169078,-1852797042,-1785425006,-1718052970,-1650680934,-1583308898]},{"sector":6,"length":512,"pattern":0,"data":[-1515936862,-1448564826,-1381192790,-1313820754,-1246448718,-1179076682,-1111704646,-1044332610,-976960574,-909588538,-842216502,-774844466,-707472430,-640100394,-572728358,-505356322,-437984286,-370612250,-303240214,-235868178,-168496142,-101124106,-33752070,1917190142,544370546,1308622896,1970479215,1713399907,543517801,1679848047,1667592809,2037542772,0,1735540992,1936288800,1869881460,1869357167,1157654382,543384952,1836216166,1696625761,1919906418,1684095488,1818846752,1970151525,1919246957,1308622848,1696625775,1735749486,1868767336,1342203250,1768780389,1869181811,1701060718,1684367726,0,1701603654,1769497888,7566451,1936683587,1701064051,1701013878,1852402720,107,1986939136,1684630625,1735549216,1852140917,1409286260,1830842223,544829025,1852141679,1818846752,29541,1867382784,1634759456,1814062435,544499301,1679847023,1667855973,101,1632436224,1629513844,1836410738,7630437,1970496850,1948284012,1814065007,1701278305,1699872768,1920298867,1679844707,1818517861,543908719,1819635575,1668227172,7501155,1426071610,1869507438,1696624247,1919906418,2560,74843246,76612727,76743826,76874900,79234215,80348361,81462475,82707693,82838767,84804860,84935951,86115601,87491875,87622968,89261370,89392467,89523541,91555172,2426230]},{"sector":7,"length":512,"pattern":0,"data":[0,0,0,0,-2122252288,65921,0,0,0,0,0,0,0,0,48168960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1608,0,0,538976256,538976288,673718304,539502632,538976288,538976288,538976288,538976288,269502496,269488144,269488144,269488144,-2071690224,-2071690108,277120132,269488144,-2122248176,-2122219135,16843009,16843009,16843009,16843009,16843009,269488144,-2105405424,-2105376126,33686018,33686018,33686018,33686018,33686018,269488144,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8192,1127940096,1279870559,1313431365,20294,202506240,202506240,1,0,258,0,518,0,900,0,1026]},{"sector":8,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,0,0,0,0,0,0,0,140115968,168624128,1819635240,721430892,2301997,33691136,201919768,134679564,318767103,-16641523]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[29252173,262177,15007776,73465855,-526776320,7408,30,243531777,485556985,739835904,745209856]},{"sector":2,"length":512,"data":[-1957363712,309484,-954471192,65094,-1609602584,-467006014,-523040591,230887050,-1056707286,1039943305,91357962,1979913277,168755005,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2095416600,-1866988348,-186101750,46433032,1342177720,-2095140632,1996423876,162195710,-1996307325,1048837702,1962940068,168754997,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2095437080,-55049020,-1528279030,46433032,2122516203,175440126,1342177720,-2095163160,-222821692,-1998041081,46433032,-385976577,-998047710,-28931838,191577728,1342665728,-2096547864,1048576708,1946159978,237824003,-1017256565,-1192457387,-152567804,-62470630,75399936,-385646848,1048772895,2114000548,185907210,138012752,-1207778173,-397408254,-998045649,-1539407102,175374614,1342728888,-2096619800,2058879684,350769160,46433032,1342177720,169797712,-1996176253,-12714426,1027765503,678690817,1946157629,212290,71123572,1027765248,1114898437,16678531,2122538876,1501497854,100550283,1424687152,-402360577,-998046984,1958742786,379887884,1963214393,-62470652,197715969,-402619927,-169148274,-351898136,138340592,1048833003,2114000548,74907575,-2096603160,1183384260,1975520004,1374179540,46433032,-352041335,2144456,178305104,-1640562864,441706506,-16333693,-2096231922,920126,128979068,235413131,235407103,-467007608]},{"sector":3,"length":512,"data":[146280171,129519630,-991408128,79987480,1342861496,-2096677144,-1732771132,887640074,46433031,16547456,-655817867,71732222,-1017256565,-1192457387,-1159200756,-62470631,-196688128,1187446784,-402652934,-88601830,15224840,46433031,379862659,-1207271935,-397407468,-998045969,268888066,1342913208,-2096700696,1187447492,-352321030,-161576169,-472709967,308199296,-1962510976,1183447622,-96010252,-386238721,-998041938,-163149566,-646070261,-2080747777,1962998398,168754998,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2095579416,-625474364,2028490760,46433030,-2097047319,1963063934,-193035468,-13730304,-2096231922,920126,128979068,235413131,235407103,-467007608,146280171,129519630,-1125625856,79987479,-351739208,-193035332,-385646848,1996423500,143833332,-1875443888,419686408,-1207516029,787024010,149600257,101836880,-1207778173,-1202716671,-397344769,-998045672,-28931836,-385649344,1996423456,367323390,-1996307325,-1072957370,2122538877,243007742,167673475,1183516799,3147262,548930539,-1598533632,922701834,-1494742370,113541912,235540223,235552387,-1341096960,136219399,134676238,705136654,-1206981660,-1202713080,-397410297,-998041833,175159300,93448272,-1207778173,-1628894568,-128021760,-472709967,308461440,-13732353,-2096231922,920126,128979068,235413131,235407103,-467007608,146280171,129519630,-790081536]},{"sector":4,"length":512,"data":[79987478,-351763784,-62470558,-163133695,1586167808,-754667018,1585956579,1191116818,-159480842,-1947501564,-472647586,308185030,1795606144,803733771,150648841,85321808,-2096970621,18261054,347605630,82333707,46433029,-15852568,-1061618058,922701832,-756545346,113541911,1342748856,-2096830744,2122318532,57999612,-385957143,-443869685,-1957313699,702700,-971543320,-956238266,64582,16402119,-92864768,-2095944216,-1073020220,1191125620,-94467076,-472709967,308461440,-1962183679,-472647074,308449080,1187384437,116064758,-1980086645,1191180358,-92371974,-2084406268,1962998910,143190135,1342824120,-2096861464,1048773316,2114000548,185907210,73263184,-1207778173,-397407430,-998046637,166115330,71952464,-1207778173,-397410303,-998043390,-28931838,1962934845,14543107,1962934589,74907435,346175231,-1202667469,-397410301,-998043148,1975520008,12445955,311297734,1778828928,28836107,11528448,-1207430680,-397407778,-998046729,-1539407102,176029974,1342903480,-2096896280,-35126588,188397580,64612432,-2147302269,1946220158,168754997,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2095765784,-2034760508,-1595387895,46433027,2122532075,779420924,235540223,235552387,-1341096960,136219399,134676238,705136654,-1206981660,-1202713080,-397410297,-998042389,159299588,1996473323,-126419196,-2097147672,-1073019708,-1998060684]},{"sector":5,"length":512,"data":[-1950338284,1438866917,280554635,367519744,16271046,-768313,-263796737,1187446784,-939524100,130630,1586197739,-754667018,1636272867,1357130258,-738828661,1619495651,635981842,79987476,1006388779,712962118,-1309254005,-1964780796,705847687,1586188516,-1964780554,1343381639,-2095841304,1177224388,-263812612,-1979955573,1586230342,-754667018,1703381731,1357130258,-738828661,1686604515,-706195438,79987475,-244087,1996488262,312797438,-1996307325,-12716474,-385646849,-1566441608,-62510316,2129675835,346202384,1090274859,-1947187575,1183448134,-196673548,-2081403137,1962995838,168754991,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2095852824,2125989060,17230089,-1192200449,-11531866,-402023370,-998042335,-193528058,1342817464,161756927,-2095771416,-1766324540,619204617,46433026,-386894081,-998044494,-96040702,58048523,-1207905303,-397407632,-998047225,165066754,33417296,-1207778173,-11534332,99153014,79987460,1039287945,58064895,-16734231,-397346186,-998045503,1975520004,168755024,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2095895832,1996424388,155760890,1043791696,343926793,-16333693,1857614454,922701833,1860700486,113541908,-351717192,-129579513,175159297,24766544,-2147302269,1962997886,-11736829,-1962510593,1174663750,-11515654,1996485238,254994436,185123971]},{"sector":6,"length":512,"data":[-971541312,17525254,-1207277592,-397407998,-998047421,112642,-1070398741,-1017256565,-1192457387,-823656446,87877651,1342840504,-2097077528,1048773316,2114000548,185907210,17950800,-402471805,985139752,82333707,46433025,16664263,-25263360,-14254844,-1477902730,46433038,980729867,-1308729717,-2132552956,17982143,1586170740,954455038,1964139151,-25263327,-13339388,-2096231922,920126,128980348,235413131,235407103,-467007608,1191121899,-1196495874,-1202713080,-397410297,-998043109,167688196,-16742167,-2096231922,920126,128979068,235413131,235407103,-467007608,146280171,129519630,-320319488,79987473,1342834360,-2097125656,-1070398780,220260432,1023591555,1366622209,1342181560,1343661752,-1308735861,98620164,-397405602,-998042209,1778828806,113639691,-402584725,515376194,686313482,46433024,379862659,-1207271935,-397407468,-998047721,154068994,1342830264,-2097149208,954729156,1575324433,-326412861,-402652488,-950660455,65094,1988836331,-754732546,73305062,-1962774273,-472646050,-16484725,86763568,-1962621821,61996662,1586226899,74514180,-738298229,108068838,-2096846872,1191118020,-27358210,-472710223,-2096859509,-1233321928,-738298229,73305062,-1962774273,-472646050,-1962641781,1356396288,-2096832280,1988822212,-754732546,73305062,-1962643201,-422314378,-402231041,-998046628,-443851260,-1957313699,-390056980,1877479937,174635011,-11147184]},{"sector":7,"length":512,"data":[-2096970621,18261054,347605630,1156075531,46433279,-402105368,-443871121,-1957313699,178412,-955133720,130630,191577728,-2141490176,748094,-1763179660,278968322,74907472,-2097004312,-1073019708,251609205,1048776202,2080378378,-1962430448,-15857634,-2012346362,-337368569,235452430,505936,274589776,-1207647101,-397407632,-997982505,185382914,-20060080,-402471805,113643515,-16774293,1996424262,40691716,-1593654141,1178146468,855997956,12249536,1343267000,-402360577,-998043937,-28931836,1467334667,-16603672,481821814,922701835,1726483226,113541905,1342903480,-2080474392,251593412,1048776202,2080378378,-1962430448,-15857634,-2012346362,-337368569,235452430,505936,265152592,-1207647101,-397407484,-997982649,259385346,-2096999960,1962999422,-9180925,312360577,393521749,1342308536,1342943928,1343267000,-2095874328,113641156,-16708757,481821814,922701835,-353891558,113541904,1075094177,171358288,741801808,282585098,-1962490749,-443874234,-1957313699,2144492,1443923176,16533190,335969923,1187448190,-1929374714,-1924079546,-397345210,-998047008,-58818556,-12094208,1996480630,51112190,-2096839549,2080375934,74907411,1342206136,1357006477,-2096070424,149620420,551700166,14894790,-1928956161,-397352378,-998045516,1958742788,-129579239,1187446783,1891107324,1894273034,46433277,-369604981,1187446932,-973078280,-956171194,64070,-2131069301]},{"sector":8,"length":512,"data":[1946215034,-498955636,-153580648,68102023,764941940,-930414544,-150992200,-939263890,-504183,-722732474,-1963297141,1352196674,1342873784,178140927,-2096104216,251594436,1048776202,2080378378,-1962430448,-15857634,-2012346362,-337368569,235452430,505936,242083920,-1207647101,-397407632,-997983001,177780738,-52565936,-972897149,-385811386,-1956708593,1438866917,45673611,258467840,16664263,-25263360,-13468411,28837494,-1070379008,71732048,1342209797,-2096935960,-1073018684,1183519348,8324356,42854480,-16595837,-840171962,-352321096,-1950338302,1438866917,481881227,253487104,193805952,-970885888,-970595002,-1205607354,1183386508,-230257174,-465138352,305653840,-972766077,17534214,-1017256565,-1192457387,-421003236,-448346610,71731720,1183350532,-230257174,-465138352,1292368,310372432,-2147040125,1946219390,-1543059704,-352321514,-129594841,-1532763094,-112817642,-1978359646,-1974405306,-397347258,-998044396,346202884,620119690,346137151,-1017256565,-1192457387,-2031615972,-448346610,-230257393,-465138352,1095760,304605264,-972635005,-972626618,-973020090,-955783354,59462,418072262,-1997322614,1183705670,1183666418,280514788,-85438464,1575324433,-326412861,-402644808,2122321465,846530564,1356875405,1358841485,-2097111064,2122515652,1719534048,-2076929,1996480630,13101310,-16464765,548931190,-991408128,79987711,1187396843,1183451619,-498694140]},{"sector":9,"length":512,"data":[-2012854646,1187439686,1187447013,-1929379354,-1924075450,-1202658746,-397410288,-998043251,-532247290,-28930736,4384848,-16464765,1996480582,-25755680,-2097123096,-443874108,-1957313699,178412,1443736808,300676659,-1962510593,9045086,1491619992,79987711,73304902,1962948736,-443851033,-1957313699,1882348,-972193560,-972823226,-1929320634,-1924074938,-1202658234,-397410288,-998043363,73304838,720979594,126435556,-1979294069,-466945978,-1962440384,1438866917,481881227,222554112,48580294,15156934,-33274230,-347699000,-33143158,-364476216,1358055053,1357137549,1342181560,-1961832216,1438866917,481881227,219146240,31737543,71731714,-1964358008,1183319622,138841067,-1947711863,1183386182,-230257178,-465138352,1292368,278390864,-1979267965,-466947258,-1017256565,-1192457387,-823656416,-62470388,1187512304,-386924290,1387855410,417878027,46433274,-401619992,1593835042,1575324668,-326412861,-402645832,1187450017,-1979711260,1183319110,-230257174,-465138352,1292368,272361552,-1979267965,-466947258,-1017256565,-1192457387,1927807004,-448346612,-465123835,-230257408,-465138352,1095760,269477968,-972635005,-1928338106,-1924074938,-1202658234,-397410288,-998043655,-230258170,71164970,1024226304,225705989,1946158653,-971838706,-352197562,-465123822,-972231936,-352132026,-230258170,-958118264,-1929321146,-1924074938,-1202658234,-397410288,-443871307,-1957313699,1882348]}],[{"sector":1,"length":512,"data":[-955517720,50455622,-2012985718,1183509062,-347699194,-1995946357,1183574086,-431585014,1358055053,1357137549,1342182328,-2096136984,1183450820,-1947981069,1438866917,79228043,196339712,33441479,-25755904,-2096563736,1183384260,2109737980,15788291,78764171,-2020940845,-467004831,-60912816,-2020940845,-397405600,-998045196,71711492,1586179196,-754667012,1636272867,1357130258,-738435445,1619495651,-773304302,79987465,50613899,994641486,-385647416,1586167960,-754667012,1703381731,1357130258,-738435445,1686604515,-1511501806,79987465,2080654907,-60912855,-472709967,308643722,-1957632982,-472646562,308578186,159574096,-1962621821,1308820558,-935638778,1586187389,-754667012,1636272867,1357130258,-738435445,1619495651,1508397074,79987465,2130986555,-60912851,-472709967,308643722,-1957632982,-472646562,308578186,154593360,-1962621821,1308820558,-935638778,-1070398337,1191125739,-16913922,294531,1183576188,105251588,-1576649912,-2082242796,2113930878,112861,-1017256565,-1192457387,-2098724852,74907402,-2096640536,1183384260,91570422,-437665741,-161576192,-472709967,308447114,54387754,-385649152,37552280,-385650176,20775041,-385649664,1187446933,-1962425096,78771806,-2020940845,-467004831,-161576112,-2020940845,-397405600,-998045540,-96040700,-1309254005,-1964780796,705848711,1586188516,-1964780554,1343382663,-2096595992,1183384772,-196702722,-62485168,-59840432]},{"sector":2,"length":512,"data":[-1962621821,1177288262,-11517702,1996488310,-126418950,-1309254005,-2132552956,-2146279745,-341825163,-953685241,132315206,1187481067,-385364232,71171965,-385649408,-12714128,-940870656,131659846,-1593874199,1352140780,-1207666945,-397408354,-998044635,-193528050,1090274955,-62658480,-1207647101,-443875327,-1957313699,178412,-1207337752,-397407648,-997984557,170309634,-154539952,-956119933,130630,-385976577,-997982510,1958742786,-28901623,83787395,2122574462,175440382,1342855352,-2080989464,-443874620,-1957313699,-390056980,1996425521,108461832,-2080645912,1996424388,175570692,1342942904,-2096389912,1183516356,172360456,1996443720,-71571450,-1017256565,-1192457387,-85458932,-96024824,-1600061441,1357130260,1343529376,346175231,-2096705816,1183385284,-27883012,16271047,-128021760,-472709967,308709259,308844427,-1980479863,1996486230,64022776,184730755,-1959234368,1452014662,-162121218,92024191,1945388601,73304870,-1946925429,1463416406,2081980162,1929853188,-129594606,-1946532215,1452012614,-62486026,-108919,2122577990,-1652816648,-1962647925,1452014662,-1995994626,1183515223,1575324666,-326412861,-402652488,1642596437,-28932085,74760202,880083772,67010176,1307050868,168754955,171868942,276561934,512427952,117378568,126357000,-823401430,1343097016,1342179256,-2096696600,-1091894076,-1728166262,-1017256565,-1192457387,48758786,160348168,-178657200,-1207778173]},{"sector":3,"length":512,"data":[-11534332,1642595446,79987703,1040074377,74842111,1726726195,33455747,1183516796,-28952316,251610238,1048776202,2080378378,-1962430448,-15857634,-2012346362,-337368569,235452430,505936,109439056,-16464765,314113654,922701833,-622327536,113541895,1342769848,-2081100056,2122515140,-2055470594,956581515,58654278,-1946191127,-443810234,-1957313699,833772,1443327208,16008903,-28915968,1996423170,182249476,990037123,108922438,-369099080,2122514793,91553798,1592377395,-163148543,-96039600,-105977776,-1207647101,-1605369841,1352140781,-2080839960,1183515844,105251830,1996443712,-104077062,-1207647101,-1605369841,1352140782,-2080848152,1996424388,-163149050,1996443712,74907642,-2080523288,-1863841596,-62486274,1517555004,2095599768,46433034,50232963,-1226243212,-195130624,-972786037,1996423168,-163149050,1996443712,74907642,-2080537624,1491601604,-62486274,540056,222111604,1025209344,259260443,956712587,1786573894,16271047,-950473984,130630,1187491563,-352321282,-193035353,-16417280,-1662258098,235540223,235552387,-1341096960,136219399,134676238,705136654,-1199445020,-1202713080,-397410297,-998046417,-9377532,-1946650997,1082786910,-1948349695,8914038,-1946663169,1178203206,-1737480,1586230350,-196673548,-1979418997,8977478,-48663,1996486262,-120854278,-1207647101,-1202716665,-397410272,-997984313,-163149052,1074152963,-92864688,-2080854808]},{"sector":4,"length":512,"data":[129500356,548950016,-1461170176,79987703,1593722507,-1017256565,-1192457387,-689438712,-79247867,-129594112,-62485168,-130095024,-2096839549,1963000958,133144584,-335919480,75399951,-1610255104,-253032464,553273030,1342177720,1358579341,-2080495640,-1073019708,1891111028,-320319478,46433266,-385875272,1183449238,-661939974,254248950,738489346,-1979454688,1183382086,133210366,1979598392,175159310,-222435248,855819395,-1603671104,1178077167,-1206946306,-397407632,-997985625,112642,251613931,1048776202,2080378378,-1962430448,-15857634,-2012346362,-337368569,235452430,505936,66447440,-1979399037,1352202822,1342886584,181417727,-2096805656,-893909308,1558728714,46433266,-493825,-1494680458,-14095881,-1017256565,871140181,82045120,1342181560,1343661752,-1325119861,98620164,-397405602,-443874079,-1957313699,702700,-1962622744,78709830,1577443539,-28931822,425603,28312693,-1070464277,-1996595573,1996423495,-27358454,704726922,1996443876,19851270,184992899,-385649472,1996423340,112646,-28931248,1342178053,1090406027,-1142403008,147096322,-1593942389,1200100512,142016261,705995168,1183535332,460286,-28931248,1342178821,-2096982552,1586170052,21465854,-1202658262,-11534335,484968054,113541890,-1980086647,-1600062378,1357130260,1343529376,-402098433,-998047229,-96064762,-1979951589,1451882054,-27358216,-2097151739,1200160978,240617740,-1946263925]},{"sector":5,"length":512,"data":[1452014150,138906108,-2096474231,2080438398,-2130215061,-2147420546,78668406,1183539435,-1924120322,-397408698,-998047496,138840836,2131117625,-14751485,1342865592,-2081351960,2125988548,216551433,46433265,235540223,235552387,-1341096960,136219399,134676238,705136654,-1206981660,-1202713080,-397410297,-998047137,34727940,384548915,1586168240,71796990,-956408181,113639431,-1207891093,-443875327,-1957313699,67811564,-1962714904,2131036230,138840320,33048263,346136576,1178199082,-10651656,1996424310,-163148296,-96039600,24963152,-1979136893,-466946490,-523040591,721047178,-1983839251,-2037515194,-11469834,1996487798,142016262,-2081034008,1183385796,1975520254,-158954213,1996443899,108462076,-402098433,-997984528,-28931832,91537419,-335657333,-129564923,-443838485,-1957313699,-390056980,1586168525,346071046,121234474,130484594,1586167808,-1962677500,134153822,-1017256565,-1192457387,-1494745080,-62470398,1187512319,-2080374786,2130969726,75399942,-1207599360,636223486,33048263,-1928074496,-397345722,-997983878,-96040702,-16026560,1183578182,-129615612,1183573374,1575324666,-326412861,-402652488,1187447385,-2097151746,2097544830,108461874,1342177720,-1957642189,2131035206,585650176,147096565,309641227,84166283,-397410177,-997984897,-28901630,28888555,855829248,1575324608,-326412861,-402651976,1448542733,705994912,-919912220,-1583329199,1373907476,71732048]},{"sector":6,"length":512,"data":[-397389159,1347551878,-1962817816,105286600,-1952851317,346136816,-125049814,-1995946357,1451883638,-1947731970,-1950250000,-2084174893,1174601938,-27913220,-2097151699,1599996122,-1017256565,871140181,28043456,-1979294069,126356038,-1962647925,2427462,-772222717,138808056,-443873400,-1957313699,-390056980,1183449477,635709956,-523173696,1317724369,200092166,1575324609,-326412861,1726529587,188397569,-289544112,-352140157,168754985,171868942,276561934,512427952,117378568,126357000,250340394,1343097016,1342179256,-2097148184,-790100796,1964719352,1575324624,-326412861,1459940483,108432214,-1744419702,1946190761,105182726,-1207536576,-622198785,105182720,-2147060735,-350222772,105677038,107249666,-1983892497,-125107644,-151093623,1963460164,121932303,-774337640,-1601702173,812908814,2083208331,2130643716,1962891026,121932292,1088966808,113541895,-1946270071,-1992293308,38061828,1552613887,71731716,1793787784,67519734,-25080203,762646024,-1744354166,78374992,184730755,-952797760,1091420166,71616289,1149899424,-661940217,-2017008687,-956232032,-351100668,33601720,262924368,-1996307325,-1073019836,1283458676,-1679095802,67521664,1459618239,1342457485,-1744354166,113371216,-1996045181,2117729862,-385649410,1183514417,1592011268,1575324511,-326412861,172395350,-150712693,-1948742687,-259323834,-637279753,107411350,-745809917,1566492299,1493174466,-668214133,507185778]},{"sector":7,"length":512,"data":[74583550,-503323765,1426214377,1448602763,-485994869,-1962467812,1988822142,866579206,-12285239,-12240346,58656628,-150803647,1589742545,1438866783,-326898549,-1957275892,183469053,1107707334,-1996208501,92865605,-16628281,138841471,108461904,134735959,-1962490749,38666224,163203,-1070461828,100605323,-467007608,861342443,1357402304,79987710,1600046731,-1017256565,1475119957,-1948568746,-1073019322,-738782595,-150710645,500889560,1183383552,72780038,185222795,-149783104,139889619,-621291273,-1996488675,1451821638,72256264,-125050377,-1962391925,65140720,1727502074,-1946680570,197561303,-150506277,-2082932774,1599996122,574045,-1962740545,721420854,16679415,-1107070448,-1896214528,-1094417961,57932566,-2130621975,922746596,248653449,-802780874,-1312388338,1222693636,248423222,567095476,230859574,712180284,1354773278,1119493902,-855002083,1329908513,775037011,1919885360,1952541728,1914729061,1769304421,224683378,-150789110,145033,-567557236,1253366775,-1942609459,-1962034658,503327798,889239574,-1992941107,906938910,248252044,12066574,510769701,-1959386675,-485460978,113587746,-628354954,-13182157,1930457630,13428995,2047264054,-1143305200,-13238269,118518302,2126511135,381729040,-1070346453,370584307,1541938951,310022,-851181384,-167087583,91521218,232820608,-327595200,-402421016,2126185139,2130411792,1393062672,1130043391,-1175262397]},{"sector":8,"length":512,"data":[-517275642,-1962031938,-217639172,35907748,-303502029,48779489,1393167617,1801675124,1702260512,1869375090,218762615,1986610186,543515753,1869771365,218762610,1869366794,1852404833,1869619303,544501353,544501614,1684107116,168649829,431624881,250425886,178975,567099572,-4710634,-1930932224,-1173311230,-437576149,1002053041,1440672542,-326898549,-1101637882,-397013496,-998046530,-1913091326,-11532730,-397015946,-998046263,-96040698,635983702,79987461,1593460363,1575324511,-326412861,119428695,-1962639733,-678754698,990400139,-1961593090,1002505158,51147768,1324942321,-1527513777,-1960711172,-775550009,-1962249240,-775539769,-1528073496,-774272183,-777653271,-1979354133,92808708,1600045707,614515549,1958742543,-1998310905,-1022417882,567085236,1438901298,1048833163,1946160576,-1072234748,74907405,-1962815768,1438866917,1448602763,-1962639733,39684869,-1962652277,1972045397,175999752,-1957223987,92866174,-1996333687,1435042893,141920518,1913275791,-336186620,204335112,-1962933826,209029381,-1017290914,1475119957,2123040542,-1178586364,-1359806465,1077985675,1566562551,-326412861,168764576,-1979025984,614597702,-337366513,-138398972,1438866896,1448602763,-972493693,-1949435834,1183319110,-96024839,-162100021,-1980217715,2123101254,-1962571002,1300955741,106269444,-1962379893,-2091578755,1593773293,-1957208832,92866686,-1996333687,1435042893,141920518,1913275791,-336186620]},{"sector":9,"length":512,"data":[194373640,-1962933826,209029381,1577632899,1438866783,1586228363,352027396,-75296387,-166953984,1074651271,28837236,855829248,1438866880,-326898549,-1957275896,-351418314,833559,271104080,-399179952,-998044410,1958742790,46564104,1962949763,3965924,1015757172,-955463805,65094,-1740175990,-335919479,-1744467428,1962999613,-339725820,-1962571262,1191181918,-527988482,-95486195,-92372153,-941722368,1577058308,1575324511,906399683,-1172402672,-1949748467,-1947628607,915098105,-167051220,-963770252,-1371164942,-1757021579,-1946278848,65393149,-400615739,-812909787,-50070389,118942859,-164372850,-1995578551,1162150014,-1073042772,-203228555,369118857,-936998625,908525325,-326413040,-2129625413,1930460923,402608904,-347913381,51964146,175432714,294528,1187382389,-987824636,-1206990314,567092480,1947110175,-1157111024,520028162,1183518834,-850611196,-326413023,1459940483,234929750,401342259,-1744419702,1946190761,954750475,46433036,1191277632,956876419,1930348598,1590135779,1575324511,939954115,-1172402672,-1106831859,-1733558144,-2144939469,51233342,-1907333774,855649286,-137851968,-218592303,87565998,-947652235,-137852157,653757393,1095173514,343203898,141828668,74713404,-344645572,-1106831784,736821377,201206607,-1947110145,-1956953393,96535491,-31129597,-1948242945,520494844,-1527576810,-1951784784,-2118246453,-1961956608,604243144,-1948242946,541309180]}]],[[{"sector":1,"length":512,"data":[-1952123989,-192173375,-1957683434,-1392604196,1958742698,1965177917,117397023,179047876,1009677504,-2146994910,1969028989,-341160188,1170622445,-706019073,1946171368,1180061392,230950655,-1073042772,635963508,-336235264,-192173343,-214217909,-2018703245,-29062905,-594808085,41275915,646514687,654249414,154931256,540803700,-326412861,-167485813,537780359,45616756,-1949748414,1931595217,150595843,232818678,-385649280,1317732481,106334984,-1070397666,-1957275652,-470119440,1074444389,846573298,735021905,283331018,60563917,74685936,1240140212,796180491,178502,-1274004806,1931595072,-351685628,1958742836,-678733542,-1957575189,-842388529,-268198879,-1274776675,186313481,-166300224,1074651271,1586170740,440369158,-336067723,146340100,41048348,1600046731,-1962381591,1451952206,-851397626,-1274776799,-470947063,1975520235,-527960345,175390733,1065409163,-133991142,-1191586069,-789898232,1458342741,-2130413941,1963854078,105182780,-1976142580,-1952970940,-152841768,17735815,1153902453,-1978490876,-1952970940,-958148136,17735815,230688455,1153900865,-1962803198,76088388,-352321096,553550132,-164858610,1963722308,121932326,-774337640,-1601702173,393543950,1342308536,-2096658200,1149829828,1958742788,105676806,867822344,-443851072,-1957313699,1988843244,75399942,-2125696000,1963854078,121932325,719868056,46433276,376750091,161605718,-1979530109,-1952970940,-958148136]},{"sector":2,"length":512,"data":[958599,-25093397,460656160,159770710,-16595837,417858676,46433031,-150576000,76136499,1577337993,-1017256565,1458342741,901379635,-52153856,-488623444,1442087163,3477246,646448757,300613684,225764362,-1157613894,431554562,-851397632,-1564462559,-1956773835,1438866917,1656286347,-142088191,1988843095,-1568240378,277521406,-1560000885,1183518850,277259016,-1734098893,278307600,1962949760,21620995,1948597376,17492227,277874375,-1070399487,-1559195997,-1834807170,277127952,-1559197533,-1667035008,278831888,277612231,854261792,1965898880,-1643708666,-2144867568,209005372,277743359,276825799,384499712,1965046912,-1908505843,175439888,276825855,117376235,-1975119716,-397371388,-998046201,1975520002,-1799858497,-1863823344,79987461,1015083147,-15567570,1175488518,277919830,91875408,-1962621821,1815904496,113706869,135300,3964998,-1595341963,-1744532992,-23165303,1946174781,4668682,1480394100,-16157440,-2096071162,553557638,-23165301,1023435565,1047986197,781434883,632203263,278005503,278660807,179830784,-2014818304,46433024,146297067,-1192039680,-303366128,-397361101,-370474592,-352321096,-1632174091,35580158,-24388629,630997483,631317880,631317921,631907754,631907754,631907754,629810602,631907754,630465962,628368810,631907754,1048782223,1946161304,278307077,-381280021,1031863974,1191605285,1962950016,734497781,-396996410,-998046946]},{"sector":3,"length":512,"data":[-369652988,1600061066,-1017256565,-1192457387,-488112104,-2091493387,1946813566,-1845035260,-2076278000,376700944,277225099,1468729227,-129595134,-2080745847,68191750,1048783339,1946161298,-2044818672,-1995994352,1187510342,-352321286,-2044818675,-1727558896,-1980217719,109312598,-2097016698,1088574,1183518068,-96072712,1183516020,855829252,278569920,277493387,278019715,-2094369536,2097216126,75399972,-971541238,-1958335228,1452013638,-2082932742,-621346606,-1980217719,1187510870,-352321034,-163133691,-41222144,-15143037,-11074442,1996487286,109111544,-2096577405,1083454,-396943244,-997984098,-1878095102,-1983370480,82574926,1177552070,-113013,-1072955826,92992127,1048773768,1946161278,2086747143,539787267,2105558854,-428539649,278019715,-1592494848,101388430,192155776,16154243,28837237,855829248,1441288384,46433026,-443850914,-1957313699,571628,1475654888,-1945712810,-2097143792,1946158206,114192,-2096068959,34637318,-335788407,-2044818637,-1995994352,109313094,184684678,-955943488,272432198,-386107649,-997984262,-2081387774,1083454,104401524,74649744,277886603,278150795,1048837675,1962938526,250107655,46433025,-59310250,-2097058328,1048773828,1946161310,-152545529,46433024,-443850914,-1957313699,178412,-1577834264,1183387782,-2009168898,108331024,277874375,922681350,922685566,1996427408,-1976107260,-25755888,-2096815128,2122517188,108291844]},{"sector":4,"length":512,"data":[1191476867,1048778869,1962938524,-1874951407,175374352,277493503,-2096821784,1048773316,1946161308,-1874951407,175439888,277493503,-2096825368,109249220,-955772794,1088006,277782784,276825611,1996427892,83028222,184730755,-1207601984,48955393,-397361101,-443875036,-1957313699,-390056980,-2091453559,1087550,512440437,1342115970,41911042,-1978565632,512427078,931860610,76023807,233563178,276969215,-402360577,-997985741,108347396,278398719,117376235,-1956769642,1438866917,45673611,-214177792,1048794711,1962938520,74877777,1249834507,512439275,1342115970,41911042,-1609466880,512430220,1066078338,92801023,250340394,276969215,277624575,-2081301784,1967129796,-1744371964,1321634576,-964706293,278412931,-1962445568,100729926,1600000150,-1017256565,-1192457387,-756547582,-1957275662,2123039862,-1740733690,1282736144,512439787,1342115970,41911042,-1978500096,-2111927548,-15758576,-1999009017,-337368569,-2110324978,-1744532976,-244193200,1074054275,117376117,-1958342504,-1073000505,1048822901,1962938520,105286407,278267393,-443850914,-1957313699,702700,1475504360,-1976136874,-1983892720,1183448134,-1807840264,-739748336,46433269,737822345,75377656,-1324311903,737727235,-1640070152,359989264,1965898880,-1942060272,158674960,-397371220,-997982572,-1942060286,192163856,125763339,278806147,-2095483904,1946158206,-129564922,-2097127704,1088062,1191118452,7334140]},{"sector":5,"length":512,"data":[278806147,1462138112,-2080462616,2122515140,158597124,16285315,887620469,-1707179264,158597136,16547459,1122501493,-92864768,-18290602,-2096839549,1089086,113708404,2101388,-26482601,1577239683,1575324511,-326412861,-1628913613,-1908505615,74711056,48966576,1352147120,-1946289176,1438866917,-1070338933,-1192132376,-397410256,-997982744,-1707179262,359993360,276708995,-1341885440,-1341985960,-397371272,-997982772,1575324418,-326412861,-402652488,1448603981,-2147060085,242559548,277225099,277218947,1178569474,-13419797,2083536000,960266291,1043934847,192221320,1966095488,-1945712890,-1409273840,-774927464,65130977,65130959,820609992,1015085451,-2147124176,-478267076,-1996202357,1590070079,1575324511,-326412861,-402652488,-1101598491,233508931,1178076298,-1207601916,149618689,3964998,-1070338443,1575324510,-326412861,-2147197301,-1962803633,1438866917,1465314443,-2096084805,695533631,95946526,27781120,-1070398091,1076161433,1218706980,273326864,17090454,80118528,-16890681,1312197119,72256272,-1064380276,1593856488,1575324510,856191683,1575324608,-402230333,-4718579,1575324671,-387697981,-1564278783,-469103158,1048585077,1912802754,1931623437,1914715149,-351948795,322736135,330302070,-686796101,230466456,-339440957,13363703,1945041283,-511688200,41389054,-24400388,1114898856,1942043464,63998741,27831792,-1039977356,-1962933755,-29062665,-24385813]},{"sector":6,"length":512,"data":[-117240716,738086025,92883137,-117242389,-1946268418,-2116383546,1946350842,512501253,2139689066,-970538238,34631174,1962933821,67013413,27831792,-24382860,1942043464,63998909,27831792,-1039932812,-1962933755,-29062665,1200350955,1958742792,-338129404,251536915,276041838,-197273460,637891586,275127950,-1108658293,856061835,5892288,225756731,1077936420,5105816,1308495220,780542,1318454644,865790798,1371773376,-1459731061,721646593,1094797768,645922746,275519035,-355400586,-1047792267,359843331,225624579,-1037839625,216581675,-150440704,1978323410,1505768421,-397323581,410255389,-1946252457,-940440592,-65980,-1962510455,1255615446,1493063049,1405311577,517092176,-1202695598,105906177,22931487,-2096577405,1512046586,184710235,-1957313582,-245831444,-1017256565,-387151019,-443813554,-1957313699,-247142164,-1017256565,-387151019,-443813574,-1957313699,-248452884,-1017256565,-1276343467,11331840,1475119957,-1962467754,803407950,2123094411,871860996,-17984,-146690318,1993030617,-1949594878,108432382,1149937395,986264575,91750213,-348060300,-1949174014,1566531265,-326412861,1459940483,74877782,-396951757,-998047561,105155074,37487396,1156988021,259328006,-1744354166,-472786805,245401590,-1960348671,71576324,201082505,1343979200,-1979419393,1352140612,-2081121560,1178273476,-2146994948,-1088420276,1150025727,-956004092,580,1600046987,-1017256565]},{"sector":7,"length":512,"data":[1317754455,71731978,-1962518901,509020286,177470471,-2095876928,242551545,175755787,-139842128,13796315,-141829385,198325138,-150833984,-235432975,80971666,1983462448,-1440283646,-1022639477,92856949,92712015,1342129288,-177014981,1566531160,-326412861,-2147197301,1573848679,-326412861,-2096736426,1962936446,248692536,-1962518901,1967653958,5498887,1223370610,253900427,990999624,-1962052361,1183384132,988304908,812867072,-2130393469,1930371838,1976699652,-18426,-1960973415,264471514,61987793,1219816403,-378396211,-1996191342,914948692,-1070395614,-1956749561,-1950130715,-141882290,1946307641,80118540,253951617,-335941003,64654143,-1959169508,1002540755,956724727,1930350110,264471334,-338568239,-338564143,158725947,-1163798269,-1898435827,-850742080,990736929,-1996196361,-1844523498,-779418489,195,0,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,690169920,1936286822,543370859,538976288,825110816,792016928,825177136,5242929,25637,690169920,1633969254,1663983988,538976288,825110816,792016928,825177136,1766195249,543450488,1802725700,1952797472,1344303221,1919381362,1444965729,1769173605,807431791,3289134,1126777640,1920561263]},{"sector":8,"length":512,"data":[1952999273,1667845408,1869836146,539784294,892877105,1145438254,541807433,1769238607,7564911,1869572163,1864394099,1864394094,1752440934,1868963941,2003790956,979857001,3027200,1634038339,1142973812,1344295759,1769239137,1852795252,3027456,1851877443,1092642151,1986622563,1632641125,1953068146,7237481,1140862515,1952803941,1329864805,1632641107,1953068146,7237481,1140862516,1819308905,1344305505,1769239137,1852795252,1952531488,1917845601,544437093,1129530624,1869881344,1952805408,544109173,1142976372,889213775,1699938350,1952671084,2019905056,1766203508,543450488,1802725700,1769096224,1157653878,1919251566,1869112096,979723113,1701336064,1650553888,1881171308,1769239137,1852795252,1851876128,1646294055,1634541669,1629513060,1986622563,1750335589,1969430629,1852142194,1667309684,1702259060,1918988320,1769236852,1763733103,773857395,1918980096,1769236852,538996335,1634541600,1629513060,1986622563,2105445,1881173838,1769239137,1852795252,1869881459,1801547040,1667309669,1702259060,1918980096,1769236852,824209007,544434464,1701997665,544826465,1769235297,1157653878,1919251566,1701344288,1836412448,544367970,1948280431,1881171304,1769239137,1852795252,1970239776,1851873024,1869881460,1801547040,1667309669,1702259060,774778414,774778414,774778414,774778414,1749221434,1701277281,1952661792,543520361,1953653072,1869182057,1329856622,1634738259,1953068146]},{"sector":9,"length":512,"data":[544108393,1634038371,6579572,1931505486,1701011824,1919903264,538992928,1663049760,1852402809,544367972,1953653104,1869182057,1308634734,1886593135,543515489,544370534,538976353,2036539424,1684957548,1881174629,1769239137,1852795252,1952514080,1819894560,1701080681,538976370,539893792,538976288,538976288,538976288,538976288,1308631072,1886593135,543515489,1663070068,1952540018,543236197,542330692,1953653104,1869182057,1174417006,1684371561,1936286752,1818304619,1684104562,1634214009,543236211,542330692,1953653104,1869182057,1157639790,1919251566,1918988320,1769236852,1931505263,778402409,774778414,774778414,976105006,2019642624,1836412265,1635148064,1650551913,1931502956,1701011824,544434464,538976288,2036531232,1684957548,544436837,538997857,538976288,1850015790,544367988,1918989427,1735289204,1819894560,1701080681,1970151538,1919246957,3812910,1634038339,1142973812,1344295759,1769239137,1852795252,544162816,544567161,1752394103,544175136,543519605,543516788,1769238117,1713399154,1684371561,1936286720,1868963947,1329864818,1495801939,774458927,774778414,774778414,774778414,1140866862,1881166671,1769239137,1852795252,1818584096,1684370533,544165376,542330692,1953653104,1869182057,1869881454,1818584096,778400869,1918981888,1735289198,1631854625,1763729780,1752440942,1329864805,1634738259,1953068146,7237481,1819044215,543515168,1953722220]}],[{"sector":1,"length":512,"data":[1142956078,1870209135,1769414773,1948280947,1660952687,1769238127,778401134,774778414,774778414,774778414,774778414,774778414,1059991086,1698955296,1702126956,1397703712,1918980128,1769236852,1409314415,1818326127,1936286752,1886593131,543515489,538997609,538976288,1819894560,1701080681,3044210,544165376,1953653104,1869182057,1679848302,1852401253,539911269,538976288,538976288,538976288,538976288,1632632864,1953068146,544108393,1952543827,538997621,1701869908,1394614304,1953653108,1850023968,1767055460,1140876666,1819308905,1344305505,1769239137,1852795252,1718503712,1634562671,1852795252,538976256,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538968096,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,536879136,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538968096,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,1668172032,1701999215,1142977635,1981829967,1769173605,536899183,544434464,544501614,1751326817,1701013871,1817190446,1702060389,1953391904,1629516389,1869112096,6644585,1936269344,1953459744,1663066400,1667854184,1344286309,1935762796,1852121189,544367988,1919885401,3034656,1713401678,1684371561]},{"sector":2,"length":512,"data":[1936286752,1881174891,1702061426,1157657710,1919906418,1634038304,1735289188,2020173344,1679844453,7041897,1869771333,1920409714,1852404841,1768300647,543450488,1802725732,1920287488,1953391986,2020165152,1142973541,543912809,1986622020,538983013,1701990400,2126707,4412229,544175136,1970562418,1948282482,1145446511,541807433,1769238607,7564911,1953724755,1998613861,543976553,544698222,1953719666,7631457,1702063689,1142977650,1679840079,1701540713,543519860,1679847017,1702259058,3817760,1936028240,1851859059,1701519481,1752637561,1914728037,2036621669,539897390,8224,538968180,1680154656,538976288,622862368,538976355,538997541,1681073440,858071072,622862436,25651,1142956064,538989391,538968064,1818386772,8293,1852796448,1397703725,538968064,1229866328,1090527320,1499290446,65614,458753,-130926,458753,327864,983041,590038,458753,721124,983044,721153,458760,786692,983044,786713,458760,852252,983044,852276,458760,917815,983044,917836,458760,1638735,458753,1638758,983047,-1638035,458762,983409,983044,-982653,458760,-1113722,458753,-1441373,983041,-1048143,458753,1750335962,1969430629,1852142194,1667309684,1702259060,1918988320,1769236852,1763733103,824516723,11876,131050,33357839]},{"sector":3,"length":512,"data":[1953653072,1869182057,1680154734,1684106528,1667309669,1702259060,-1245184,983041,-1244648,983041,1245749,458753,-1310125,458753,-327047,983041,-1441122,983041,-1441098,983041,1867383500,1634759456,1713399139,1629516399,543434016,1768716643,1919247470,1918988320,1769236852,3042927,65558,49479695,131049,52035599,1931505486,1701011824,1919903264,622879008,2036539492,1684957548,1881174629,1769239137,1852795252,1952514048,1819894560,1701080681,1680154738,-1245138,983041,-1244353,983041,-1244317,458753,1049483,458753,-1113171,458753,1632437198,1970104696,1986076781,1634494817,543517794,1667330163,1936269413,6563104,1768716643,1919247470,1952522355,778315040,-1310720,458753,-326686,983041,590852,458753,-654311,458753,-1244099,983041,-1244065,983041,1246325,983041,1311889,983041,-1375052,983041,-326445,983041,984310,458753,-654069,458753,1867777328,543973748,1802725732,1634759456,1763730787,1680154739,1819894560,1701080681,3044210,131063,87097351,131063,89784327,131067,92471311,65558,94437383,131049,97124359,65555,99811335,131052,102891527,131071,105971727,131050,107413519,1763730213,1869488243,543236212,1768908899,539911523,1634036816,1696621939,1919251566]},{"sector":4,"length":512,"pattern":0,"data":[1663066400,1667854184,-1441691,983041,1663370896,544434464,544501614,1751326817,1701013871,1817190446,1702060389,1953391904,1495298661,544370464,11854,131071,112721935,131050,114229263,131050,115867663,131065,117506055,1920103747,544501349,1702390086,1766072420,1142975347,1702259058,1680154682,1638400,458753,1640221,983047,-1636572,458762,984872,983041,1115972,458753,-1177764,458753,1916,690169920,1869374566,543370871,538976288,825110816,792016928,825177136,191627313,675283151,1684416803,778204531,538976355,824188960,941633838,875573045,3223855,707070862,-1191575437,-796000208,-83820356,47356,-1064380274,-1082392386,12156416,-1197083902,-1018135006,-1149333314,-919372354,1971339136,1976109832,-338982067,4161541,-1014807435,-17071856,199588989,-855476791,-1948677352,2005533263,-1149193727,96435200,47104,28840909,1930677506,-243314936,-344020802,2127019537,-29458138,1974097277,2080434693,-617414656,281871083,179048116,-67668544,1850343147,1768710518,1634738276,1953068146,544108393,1818386804,1917124709,544370546,1684107116,543649385,1919250543,1852404833,2037588071,1835365491,1936280832,1735289203,1701867296,1769234802,1931503470,1702130553,109]},{"sector":5,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43605,0,0,0,0,0,0,0,0,0,0,0,25264513,1,0,0,0,0,0,391512064,5284,70820,0,16908288,0,33947648,0,58982400,0,67239936,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]},{"sector":6,"length":512,"pattern":0,"data":[0,0,3736,0,0,756,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248643584,536870912,538976288,538976288,673720360,538976296,538976288,538976288,538976288,1210064928,269488144,269488144,269488144,-2079322096,-2071690108,-2071690108,269488260,269488144,-2122219135,16875905,16843009,16843009,16843009,16843009,269484289,269488144,-2105376126,33718914,33686018,33686018,33686018,33686018,269484546,2101264,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1180648251,1598377033,1330007625,0,168624128,1819635240,721430892,2301997,0,0,369098752,219677186,202116105,-63481,302846719,65282,0,8192]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[16996941,13,4980768,24248319,-1159461720,20,30,1]},{"sector":9,"length":512,"data":[5972026,0,0,0,0,567095476,339599494,235828227,373340703,567085492,1354773254,-1106833717,-1847066495,1960512258,374913552,2081327662,51570710,2045313712,-1338526718,1377946880,1948269740,1947024466,-1036363040,-1403890827,1131683900,-780923588,-1157431832,1446772747,1128014452,1312564084,-1574034316,-608561421,243936790,-840427788,374782466,-402652487,-1125449020,-352321345,114440,46072811,29763072,1319758847,184687592,-341740325,1965177992,91602698,1017956659,-1173326579,-1976691075,-401174258,45089420,1006760937,-1407945438,259269180,243869262,-922024589,28313973,-1442718743,-389027007,-620035624,521013364,-352321352,-639070117,100122369,1017956659,1007186976,-1442548723,1324608321,378406,-1993990570,235271438,100121119,11550132,57876941,1342264297,773256634,386010762,-320279246,100121089,99946123,-2147360024,-16774082,1455032692,178454,1476514536,951769227,268482822,567099316,-85392525,1975520000,205422617,58064640,-2097057560,57999611,-1274984983,-383660738,1364656434,-1946514682,-1898410808,-65359680,24489714,734497615,1599670210,-915095541,104381779,-1329034416,-218264822,-125085522,-12778123,-1961853169,-8814371,-972524534,-968422143,1464273409,1930857301,65751557,1569748715,-1957036661,-485838631,1974399731,-1957211665,-1949488177,-2144974375,1963851389,117393665,669188114,1975451019,-1359827963]}]],[[{"sector":1,"length":512,"pattern":0,"data":[-902095499,1364662642,149146251,74753779,-420782247,1048598616,1979645963,-2135626999,-16774338,1048620405,1979645964,268893958,1386277632,867968,-402426369,-712310578,-521614453,-1947510272,190567307,-150113070,-17958,1119093168,57811405,-2080442391,1551106299,567099060,773243834,383192714,-1174349080,-1976690984,-350823922,87920692,-1172802304,-1976691029,-401162482,-1125646128,381729280,-1039234514,-1172903146,-1976691054,-401168626,-1528299336,380156416,-1441887698,11200534,233332255,1977289472,-29693693,1286865072,872161741,540847323,222100340,-661978507,-970538162,4102,302433830,1405288448,1946221443,47625,-402652487,278986803,245504,-1174392088,619184131,374782464,-402652487,-1017446373,312562259,245504,-973072664,1094802693,-402652486,1532624899,113603,567099572,703427,994167091,856322755,-2131494958,-346935102,1345324273,-1437017717,-880018206,100121283,99946123,236849387,190495,-315440353,-1275067717,-1021194944,108159292,41908796,12836644]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]},{"sector":9,"length":512,"pattern":0,"data":[]}],[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1868787273,1667592818,1329864820,1702240339,1869181810,168633454,1145981254,1850286138,1768710518,1970151524,1919246957,543584032,1634886000,1702126957,168653682,1313424932,1394620996,1635020409,1919230072,225603442,1229329418,540689486,1701603654,1953459744,1970234912,354444398,1174538765,977555017,1667449120,544437093,1768842596,337667173,1174538765,977555017,1634030112,1919230052,544370546,337669737,1174538765,977555017,1986939168,1684630625,1918980128,1952804193,2126437,755633433,757935405,757935405,860205]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[16603725,720918,65568,23920639,-375258646,0,30,1376257,2293760,2949120,5636096,15728640,16711680,17694720,18546688,89653248,90963968,94896128]},{"sector":5,"length":512,"data":[-852446128,1038124577,91357972,1979913277,105560593,-1912501320,-855001896,-1070397919,-1950823600,1489014273,259391292,-1912501320,-669610536,90499078,-1274809623,69324057,1084368449,1252140553,1117922825,6077954,1975519916,25933839,378394766,1005061673,63564037,1554172158,195175936,641795075,637734050,43196044,-2118198477,76539904,1949252780,1963801643,8513795,1017962634,643593530,28982912,643069184,28968702,-2145334144,975593964,1946356518,-8590896,1916877996,652157954,157552266,796182794,1707016373,1974399497,112678,-670310189,816433291,-1398377472,326449724,-397323348,1532560440,1377700210,1510244584,-1198593249,-661782133,116790925,-385572376,-1950874833,-1915187711,-402156010,552141970,25933827,512350350,109970069,-1866792301,-1826739454,-850742270,623097889,503666618,567090958,186550815,-1195115005,567100425,-1023995790,175378944,110302861,-385592856,-1023999265,511016960,51060362,41885184,503480254,42385159,567107764,41885322,42343994,378342004,602408442,45213956,1930002920,622234890,68478983,-150822167,16946438,-1153993728,1219821567,-620027443,512297588,1219756481,57876941,-1543547927,113705407,526,35653319,113704960,562,1929663720,42264581,501802219,-1793684726,-1760130814,839304962,-956301309,209926,671532800,-956301309,207366,-1173961216,113639425,-1962933835,-1996318954,-402483946]},{"sector":6,"length":512,"data":[292752021,119871117,-972844568,67220742,-352188184,188934336,4057714,-385649408,507183380,158531990,124196493,-352096792,44278739,43321079,1483997185,28982912,-30575360,-402540026,378208642,681640746,773228803,53256963,-402555672,378208644,748749614,-801704189,-1777990912,44147457,44113467,113647223,-1929117259,-402176746,645989146,-130411,53085895,113704960,808,26615339,235129739,-1958149469,869413827,-769750309,-1946945792,868322264,-617393198,13770378,-1956908041,1103834056,855819139,13803712,13641463,317253771,17462272,1929589294,872873732,-287161597,1358901993,-2142088877,-16671682,-138796940,268417039,-288230517,906228483,-1007222376,410255361,-523041615,-489487183,-138801429,-18177,26752651,-217844989,-1710846458,210445825,-789067741,637804838,-784657399,1532582407,116900696,66197,1048579700,1962934714,-1173946873,7792641,1930090472,1729531149,38070279,536783337,-1977682965,-33354986,-852314942,1962884129,474466286,1204224000,536870686,43321079,661913601,-402453600,-1410856140,-1927974141,-402176746,113705482,810,52954823,132841472,56366733,-402524696,-18349586,-854739967,183494689,1273561971,191424766,-385852184,132709907,1042432,-1023404056,-1962798943,-402517482,-1581055977,378208802,216531492,883016448,907447042,124930,922178499,-771030832,1346371956,-617360845,13770378]},{"sector":7,"length":512,"data":[190378999,721843410,64681939,-802752574,671482112,706089219,-2134680829,83937854,-1142419340,-401903094,1810432366,-1257847295,116786177,1962868736,17221132,378340352,887619585,28680200,567102644,567089588,-1006708598,228737284,4974595,1102061427,-1576858206,1252133184,37921289,-402652741,158531637,107091597,-352247320,51224752,904413484,51809546,18409475,-401965336,-1597832954,568853259,-82408182,17098754,-401970456,1354957042,-851179336,-1206881503,567100425,-1023995534,192221184,-1450178837,57999361,-104638216,1048626008,1962869163,-901873608,460653824,49747597,-402602520,141756945,28640966,-12130043,-402609688,-1597833050,-1041759477,-82408183,10807298,-401995032,-1880620910,-1425619456,-1396506623,-76275652,-143390404,-617364658,-402650439,594673705,65140627,-1826852157,1948269740,1949056017,1949252621,1947024392,1975519748,-1014280482,868466699,751040960,1007055408,-134056183,-1195116093,-661782133,57742989,-973063704,50443526,-1157707799,-628227701,43323013,-1040768651,410320912,2146807,4048244,1024488448,58064936,-1543806743,65733031,-1023301213,54662797,28513929,28513933,4037202,-138215099,33723654,-134056704,1465274819,-1610146298,-1057094901,-1929226078,-402348522,1089011666,-3610615,-1962949144,167945742,842495177,44547821,-117178741,-1342174279,-1179978976,1505689605,-1532628222,-1274916422,169987350,-1928760128]},{"sector":8,"length":512,"data":[-402214122,-1276379242,-1274916422,-400438000,1594359686,-389850786,24314702,-989411645,512425985,-1079967220,63998721,-1560166122,243991064,-1056767474,813089339,29689542,-1053390079,-385928447,-1910635381,-402515938,1914635277,-1949158639,1107409098,346235341,370575618,-392366078,-1013120092,29689542,272024578,516393986,35135118,520347880,512484466,715325982,1958886146,537824217,1002504962,-2144504126,67224846,36312619,-13372789,503590632,36314766,520335592,-768363406,28887691,-1558065854,378077734,-1578434008,29691520,574014472,516393986,36314766,520325352,512461938,1017315888,1958886146,839814017,1002504962,-2144438590,268551438,37492267,-13372789,503568104,37494414,520313064,-768356750,28887691,-1558065854,378077752,1223230010,-988905217,918822913,-947125708,1008635422,53471234,-13440737,-1174403143,918817088,-947125744,1929453288,512344833,116785603,1963065797,339133464,-1983411198,-1996375242,-1123959490,1374159372,-337743359,272024591,516393986,35135118,520287720,29564555,35393163,35264139,-1191111192,1253703687,574014473,-389575678,-1385037621,29564553,29689590,-1120766712,116785694,1963196869,637978387,-956301310,141318,19195904,619415410,36058820,914999180,1049166267,-437780035,-337022464,574014479,516393986,36314766,520260072,29564555,36572811,36443787,-1191138840,1119485952,876004354,-389575678]},{"sector":9,"length":512,"data":[-848166817,29564553,29689590,-1120766688,116785712,1963983301,939968275,-956301310,145926,12118016,619436146,37238468,914999180,1049166267,2045247933,-337022464,876004367,516393986,37494414,520232424,29564555,37752459,37623435,-134201880,-2454589,51159095,1018431368,126820813,426956939,-695480437,-851312456,-1261882591,857853248,-1194226743,567099904,277955,378403445,65537661,-74323459,-849935944,-851528671,228639521,201734659,-1274579709,-400438003,512490461,915079619,1049297339,1042153917,-401842546,1914634658,1187266264,1178287624,-1945537276,1178287808,-1023314682,567086516,1040301985,-1609808247,104465165,125109004,567086516,-386182680,-193855382,6196030,139904062,-1195275182,567099904,1992572506,734497796,1475943410,264667990,-402598013,-963968583,104554334,158728641,29439627,-1662451917,-1154053887,-1119975167,512630273,384303551,91430657,-335734808,-1949158493,1107409098,-1992416819,-1992423354,31984214,-12654083,-1170407240,567085376,417858931,-1547437569,-661978612,-2097107224,134718,104403060,175374862,512442036,567083532,245620715,272009474,306088194,437684482,470714626,1023457282,-855029062,-402296031,-722731305,-1962795357,7203032,35667587,957379584,1946296326,-1958824950,-855499234,-1548358879,914948640,1049166370,378077732,243860012,12059182,37927485,91431373,-335636760,36742100,753457291]}]],[[{"sector":1,"length":512,"data":[842957568,276037634,36832825,1051986548,36707979,-1242881587,-1996344669,-1996344266,-1996343746,-1996341738,-134070258,1107474627,-779368141,-259317299,252050059,13796096,1041025,-489485135,-388823887,-1202666997,-919387648,567136651,-849936200,1354979361,12408146,911423,-1017619875,1073790293,1560281832,-1949158461,-1961892914,1914817989,1003488243,-387091007,-1946681249,-1958353969,1914817989,1003488223,-388401727,-812974005,197145425,-1189841710,-903151600,567133579,-805101198,460702011,-1191170328,-936640513,567133579,-805106318,125157691,1493179112,1498533602,309699,-674109743,-1178338590,-271515644,-85795119,-783265085,-773139990,-1930767894,-1899887656,-2124785448,-1023406110,13178509,13174470,24963072,378342003,-1880620281,-116004358,13186701,81549,503367865,-945491193,9990,443904,113705216,239,1912882664,-281115710,443875328,14487179,15666825,-1962933832,-1929326562,-1426001602,1083419539,512489954,-1014824752,-773074673,-773074453,-850873109,-1551076831,-1070399056,-1593725277,653721808,251986139,-773271296,-773271064,-1260876824,1914817864,26911708,-1734098893,387073,-134206488,14066115,-150986565,-804912157,-768391168,13645559,-1560171357,-610205290,-718866944,-754580736,-1777991424,-660487423,-1777980672,869413633,-769750309,1039398656,91361270,27002566,-509492225,-2083376384,55358,378209397,100860131,-763166499]},{"sector":2,"length":512,"data":[-628930560,-586249472,1240594176,243911211,-768409179,14628599,-1996382301,-1593729770,-768409384,125157387,-1962875487,-150935786,-1560224458,243990947,1053032656,-1070399058,-794711309,-1143852288,-201916384,516212875,-1070464594,43321079,41156612,-2010716752,549683975,-660473630,-1777980672,-802752767,52601600,52696713,1141749955,51060362,1085916158,-1021195000,-1975251528,-33354978,140556739,113451469,26754756,-150938719,-1962880986,-205507640,-1740731478,14327809,-1196687436,116785407,1962869148,-18429,116852651,524949,113666421,-1929051959,-402601706,116916131,3146389,113651828,-1207893615,512377869,-1006763253,-1928838471,-855535338,-1858174943,309461249,378340983,82511626,116790925,-369585688,-1175914721,27107831,-1593732445,-1801256545,-1559327999,243878145,-1964506719,7071744,-1763177358,-957123840,111110,-1326922760,-386240000,259130427,-385982744,-397345148,1492713116,-956349207,16888326,116900856,524949,116795765,1962869170,-1308178936,334168065,5499024,988288370,1828864,1827206003,-388599296,-576650975,-1916536832,-402426602,12122122,-1195116544,512377869,-1006763253,-1928838471,-855535338,-1259637983,-841272487,-1580992223,312672660,26386691,-1929178973,-402452970,-2084309026,106814,251600244,117375393,-1834942062,-553239807,-955616768,102918,-1811480832,-104597503,1523139,456990836,1025209344,376700957,1946164797]},{"sector":3,"length":512,"data":[2047249,322767988,1024029696,225706005,-1007107079,130029197,-101219864,-468283965,-143071225,2078852089,868315651,-720467255,-753497344,-1605218048,243991307,-987889445,-855533538,1914656806,369318476,-497483557,14393828,653709875,378208469,-805109549,28053131,195056209,112899,-1373715170,1478937857,1512403487,1493287555,113764066,39,67270,18255108,-35002368,567086516,-870937149,-1876169979,98571917,-393206549,-1581055192,103481763,-146275935,-1962877658,-1524759592,-1974418687,-1195114792,567100431,-397229224,-396691762,1558836942,245,0,0,0,70456973,-386484760,544407561,-1477960076,-387060746,74776599,199999538,201500576,1074149920,973435907,-117227258,201373891,-1514528307,-854936574,201373729,1048584653,-1023409498,52434573,-2080998936,206910,1048774517,1946157866,52869638,-2081004056,209470,1048774517,1946157876,806784263,-162469885,52563595,52698763,53612075,53747227,52956715,53091867,54005385,54140553,53876365,-386520600,12842522,43321079,378339340,91490038,-101315096,1964412355,-1794705656,1946288130,-1794705656,1962935042,-1794705433,1946222594,-1794705640,1962946562,-1794705449,1946157570,-1794705656,1946157314,-1794705465,1946169346,-1794705656,1962983426,-402209097,1048576013,1963262154,-402209193,116883469,-261483,378341748,-1477965679,1355020789,508711251,-1190982752]},{"sector":4,"length":512,"data":[-768409599,233512589,1935156685,1512044807,-1017619623,1024453025,1512024661,-128427175,-389873292,-138214474,-66939642,-1913162497,-402098922,-1007028890,13254272,-2145422329,16828990,376824183,43321079,695533696,43321079,108265536,141891213,646043115,-8453483,14630531,-150046975,169222,-2130283519,-1090349786,-1794705409,1979710466,16247043,43321079,359923760,13254272,-2140638207,33606206,1048600948,1946616010,-901873574,192217344,13567686,-855193855,-2130696192,-2147314418,-138398976,169222,-2130283518,169230,-1794705663,1946173442,66819,43321079,158597376,-2130705915,67278094,2079488,915268599,-268236433,13647501,503324601,-140185081,805475590,-143100928,537040134,-1593281536,-576519769,-1593382144,-1482489635,-1794705663,1946161154,27894024,-352268893,13476102,-1593726557,512426407,-470417185,27862775,91607563,-352266077,15049487,15144585,-1982713006,1510004758,512416563,-201916206,-150993989,179171,-768347145,-150863685,-610057997,-821639680,113639424,-118488870,306086851,510984195,51396227,-2145946367,16828990,113643639,-2113994325,1073911054,-35592192,-1007041544,13645453,200687245,503324601,-1599802873,28902155,-1915604224,-854856930,24270886,102141379,-204412920,116900857,33555093,1407714676,-135695872,169222,-402295807,-596508515,13254272,-730466299,-1023343384,548413198,415113446,179081216]},{"sector":5,"length":512,"data":[-1258523456,506638,-219475763,762212174,1953724755,1679846757,543912809,1679848047,543912809,1869771365,658802,-1576858464,-106819601,440591,267327117,567098548,12179595,521018928,301209229,567099572,-851528673,440609,267982477,567098548,12179595,-199848594,-851397615,-851528671,-1194183903,1961389568,-1194183695,1827155968,-1597769487,28902155,244224,233512589,1935156685,488017161,-218044408,512607225,1204162027,-1014823413,189253152,51093510,113048,-1929378886,-854725858,158554150,98571917,-101526040,-1794705469,1962934530,51093681,166443928,14630531,-955943935,16974663,855638457,1478938066,378377331,-1477965818,-1195116046,12255232,47360,166401677,1929404904,-149517047,-225646584,1048691705,-1437266967,512574837,-75428951,997395433,17072000,2139097972,91489284,-351222909,71812841,-1673625596,74776577,17057734,-1157627720,12124160,-350843648,2091017,378377843,1072171287,-1916536334,-402080490,-1007029706,157027977,-402103879,-1983709172,-1190568946,31983681,1487127296,1511950601,1612089609,1646169097,1577502473,-1979711223,-33354978,1141749955,156702349,-1262280243,-1574843111,246681606,297017805,268899981,-1269816883,102140430,1478610192,41205770,800375801,-208985651,101238403,-1189148898,-1527578613,-1007149306,272776845,51058314,-1912619800,-401609962,485028278,-240850693,44449408,-2146929408,1065534]},{"sector":6,"length":512,"data":[516112757,768263,512416563,1049428646,-83688793,-1426906960,44437130,915270962,76153511,141713724,74938940,76029996,-1175461306,915210251,1049428647,-1494020030,-1916599947,-402114794,-1007029934,0,1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250]},{"sector":7,"length":512,"pattern":0,"data":[-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568,329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478]},{"sector":8,"length":512,"pattern":0,"data":[]},{"sector":9,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-16777216,16777215,0,0,973078528,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,978845696,1297040220,1145979213,1297040174,65280,134217728,538976256,538976288,538976288,8,0,0,0,0,0,1090519040,1313817402,977338368,92,0,0,0,0,0,0,20480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-738197504,-1794962429,-2063397885,1224936452,1308822788,199685,54884472,0,0,0,0,1237,83099648,0,0,1297,86900736,0,51118997,168652409,1634027520,622869092,2034442340]}],[{"sector":1,"length":512,"data":[1684957548,540701285,877605,1953724755,1948282213,1936613746,1920099686,168649829,168430848,1919895040,544498029,1886220131,1702126956,538976288,538976288,538976288,168632352,1936607488,544502373,544695662,1802725732,1702130789,1919903264,1769104416,622880118,168639075,543452769,1769108595,1159751019,1380275278,1701345056,1701978222,7955553,1096223245,1313427026,1092627527,1142967372,541152321,1310740047,1378700879,1448037701,1162625601,1397310496,1141509451,1163282770,979576096,1279874848,1161961548,1397705760,168632660,1668248144,543450469,1752459639,1919895072,544498029,1311725864,1174421289,1634562671,1851859060,1701344367,1495801970,1059671599,1936607488,544502373,542330692,1802725732,544106784,1986622052,1663377509,1628048698,1931502702,1802072692,1313153125,542262612,1852139639,1634038304,168655204,761614848,1702063721,1679848562,1701540713,543519860,544370534,1986622052,1663377509,1867907130,1701672300,1650551840,673213541,1663054129,1634885992,1919251555,1159736435,1380275278,1919903264,1852796448,541010277,829170944,1646289968,1936028793,1953461280,1679846497,543912809,1667330163,658789,808545317,2036473956,544433524,1684370293,544825888,1953724787,168652133,829170944,1646289968,1936028793,544106784,543449442,1952671091,225669743,1814364170,543436849,1702132066,1986076787,1634494817,543517794,1679847023,225145705,1866858506]},{"sector":2,"length":512,"data":[1952542066,1953459744,1886745376,1953656688,1864393829,1919164526,543520361,221930277,1850277898,1768710518,1701060708,1701013878,1918988320,1952804193,544436837,1836020326,1986356256,543515497,1986622052,168653413,1920091392,1763734127,1330192494,541873219,1819042147,1308625421,1629516911,1869373984,1679846243,1667855973,658789,1869771333,1920409714,1852404841,1095114855,658772,1869771333,1920409714,1852404841,1768169575,1952671090,226062959,1631780874,1953459822,1919903264,544498029,1092644449,1195987795,543450446,1394635375,1414742613,1679844453,1702259058,168632366,1769096192,1814062454,1702130789,1970086002,1646294131,1886593125,1718182757,224683369,1850277898,1920102243,544498533,542330692,1936876918,225341289,1631790090,1953459822,1852401184,2035490916,1835365491,1818838560,168653669,1869566976,1851878688,1886331001,1713401445,1936026729,1124076045,1869508193,1329995892,1413565778,1310744864,1870099557,1679846258,1702259058,1224739341,1818326638,1663067241,1634885992,1919251555,1852383347,1819244064,543518069,1700946284,658796,1635151433,543451500,1986622052,1886593125,1718182757,1952539497,225341289,1850277898,1768710518,1634738276,1701667186,225600884,1632632842,1701667186,1936876916,1953459744,1886745376,1953656688,168649829,1919895040,544498029,1818845542,543519349,538976288,538976288,538976288,168632352,1936278528,1853169771,1953068403]},{"sector":3,"length":512,"data":[1701601889,1919903264,1937339168,544040308,1802725732,1224739341,1818326638,1830839401,1634296933,544370464,1667330644,540024939,543449442,1768169517,1965058931,1634956654,224750690,1850277898,1717990771,1701405545,1830843502,1919905125,1868963961,2037588082,1835365491,1634890784,1701213038,658802,1702130753,1702129773,1920409700,761623657,1953460848,544498533,1819240822,1869182049,658798,1986622020,1869488229,1701978228,544826465,538976288,538976288,538976288,220209184,1851064330,1701601889,544175136,1953067639,1329733733,168645711,1920091392,1914729071,1768186213,1679845230,1667592809,2037542772,1224739341,1818326638,1444963433,1836412015,1145643109,1157630477,1919251566,1920295712,1953391986,1819235872,543518069,1700946252,1868963948,1919164530,543520361,540697381,1918980096,1952804193,544436837,544501614,1886220131,1651078241,168650092,1918980096,1952804193,544436837,544501614,1886220131,1651078241,1998611820,543716457,1702390118,1768169572,168651635,1684095488,1918980128,1769236852,1411411567,1701601889,1342179853,1835102817,1919251557,1869488243,1968382068,1919905904,543450484,1142978914,1702259058,1157630477,1919906418,1634038304,1735289188,1918988320,1769236852,1948282479,1701601889,1157630477,1919906418,1769109280,1735289204,1918988320,1769236852,1948282479,1701601889,2573,0,0,1230781048,1498623567,980942931,1146309980]},{"sector":4,"length":512,"pattern":0,"data":[1395544911,21337,0,0,0,876102154,1129598513,5461583,66050,-805277694,195842,131081,0,0,0,33554432,33554689,23593024,150995708,256,0,0,0,33685504,1879179265,-16613376,524289,2,0,0,0,16843264,4194816,33423680,16779264,0,0,0,0,1866596352,824210543,30766]},{"sector":5,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-352321536,1397592116,861097796,33567278,33554696,1359151616,285214968,16778240,0,0,0,0,983040,16777216,-1070335488,12374158,-1157163396,-986316680,374742583,2083241811,-67105863,1031808684,637760512,-1968568950,116515524,38242591,2083194823,-48854277,1913900413,2081464422,371652504,470156156,235275132,2084545404,-1199818845,653721632,512457745,-1023181813,32765768,-1149487354,1067517184,9758844,-1444413008,-1961266688,768507,-209857090,-1928497754,-524410753,768381,410298099,-394430786,-466485151,526259917,1150223503,-1105605374,-336888385,855973025,188151762,-1564410244,933329980,2084414332,-1593376581,1072200759,2081988864,2084242986,1307070528,-814589952,2084308520,100732022,653753399,-670860277,780851691,378174485,512458237,15367229,-1409257472,561299466,-5042508,-202698547,922210867,-1023509480,2084247176,922210867,378043418,967015466,45400956,2084116107,-825169270,-427766064,990808768]},{"sector":6,"length":512,"pattern":0,"data":[1071743100,915066378,378174506,332234237,1309281731,1395486319,1702130553,1768169581,1864395635,1768169586,1696623475,1919906418,1699875341,1667329136,1851859045,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,226059361,168624138,1802725700,1869562400,1634082932,1920298089,658789,538988361,538976288,1297307987,1397703763,1394614304,21337,0,0,0,0,11162880]},{"sector":7,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1258291200,2013465608,1869175866,1937339182,1547335680,1868854125,2037591667,-16777101,0,1056966656,1061109567,1061109567,16191]},{"sector":8,"length":512,"pattern":0,"data":[1202765,393233,12648480,35782849,-632289280,2096,30,131073,121897397,32899072,137429429,413204480,418578432]},{"sector":9,"length":512,"data":[1917255680,1635018337,1715235938,205284960,1711291398,1717986816,917567,1618896444,-1015152580,1715340860,6684735,1715340860,7340095,1715340860,404226111,1715340860,63,1012949052,-1015145466,1618896444,6684732,1618896444,7340092,1618896444,6684732,404232248,-964952004,404232248,7340092,404232248,476250172,1669292854,404226147,2120629248,917606,809250942,126,-864088961,908001407,1717993318,1715208295,1717976064,1711276092,1717976064,1879048252,1717976064,1715208252,1717986816,1879048255,1717986816,1711276095,1046898176,415464454,1013343804,6684696,1717986918,404226108,2126561406,907810840,1932556338,1717960830,2115534396,-856156136,-809043252,453953478,404241432,946392,1715340860,1835071,404232248,234881084,1717976064,234881084,1717986816,2080374847,1717992448,8257638,1853781606,1815871590,2113945196,1815609344,2080389228,1572864,1717579800,60,1616936448,0,101088768,-960299008,1714675404,-960294964,1865931724,404227023,404232192,855638040,862375014,-872415232,-865717402,-2011037696,-2011002846,-1437235166,-1437226411,2010884693,2010902235,404287195,404232216,404232216,418912280,404232216,418912504,909514776,922105398,13878,922615808,13878,418912504,909514776,922093302,909522486,909522486,13878,922093310,909522486,16647926,909508608,16660022,404226048,16259320]}]],[[{"sector":1,"length":512,"data":[0,418906112,404232216,2037784,404226048,16717848,0,419364864,404232216,404690968,6168,16711680,404226048,419371032,404232216,404690975,909514776,909588022,909522486,4141111,0,909586495,909522486,16711927,0,922157311,909522486,909586487,13878,16711935,909508608,922157303,404239926,16711935,909508608,16725558,0,419365119,6168,922681344,909522486,4142646,404226048,2037791,0,404690975,6168,910098432,909522486,922695222,404239926,419371263,404232216,16259096,0,404684800,-59368,-1,65535,-65536,-252641281,-252645136,252702960,252645135,-61681,65535,0,1852075579,1006633019,2087091302,2113953888,1616928870,2130706528,909522486,1719533622,1714427952,126,1819044927,855638072,1043542835,989880368,202116206,410910732,1013343804,907836952,912490339,907804700,909534051,403570807,1717976588,60,2128337790,201719808,2128337790,1612496992,1623260352,1715208220,1717986918,2113929318,2113961472,404226048,1579134,405799038,3151884,403439742,792624,453902462,404232219,404232216,-669509608,404254936,402685440,1979711512,-596246308,1815609344,14444,0,1579008,0,1572864,202309632,1827408908,1819810876,7105644,409993216,7888944,0,1010580540]},{"sector":2,"length":512,"data":[0,0,-1957363712,73840876,1459841000,20357206,145876010,243982547,-316014281,1183432963,51002874,339543410,-1207011837,-1202716671,-397410164,-998047079,75399940,-385646847,1586168059,41418502,1352418957,-2096941080,1958216900,1183666176,-1847045988,79987458,-73759095,846577675,1342207928,1352418957,-2096776472,2092434628,1183666176,1843941532,79987458,-73759095,242597899,1342177976,1342244024,-2097006360,-1224801084,28900250,-2101850112,1810386944,46433029,-1668903600,-1477947141,147096325,-1192606071,-397410174,-998046382,-2101850110,-2037559296,-397345892,-998046934,1958742790,178190,15382608,32237648,-16464765,-1191470410,-1202716544,-1924136952,1358666886,-2096799256,1183385796,8404458,45616765,79187968,-1092071423,79987457,15353543,-361329920,-73629046,918871691,-2010775472,-364445952,15367809,-1672188,-386164042,-998046143,-314128894,-330906059,-498692833,-330920624,-330920624,29419600,-1962490749,-1070865834,-2081536509,1183383762,-27883012,15353543,-360808192,360514560,-991273333,637554742,1992556682,3679996,-1997995147,-360808192,242549760,1342177720,1342219960,-2097072920,1187448004,-1207959318,-397410174,-998046614,-364496126,-2101862786,1541951488,46433028,736779915,-59325224,-1964343669,637567621,1198784568,1342274232,1342229688,-2097033496,-2101869372,803753984,46433028,1978287675,-364460241,2122383360,2080637162]},{"sector":3,"length":512,"data":[12904707,-991273333,637554742,1992556682,8922876,-336967937,-364445727,-43287,-2014582202,15353543,-1205802240,-397410174,-998046742,-362902782,918870059,2123038800,-2105177366,8922624,-1192605953,-397410174,-998046774,-364496126,1187434879,378227181,-1070923474,-2097140731,-1030881070,-1960388469,-498693881,1357006477,1357661837,1357661837,-2097112600,1187382980,1187390957,1352736748,-230258432,-1996467551,1183705158,1183666402,1183666412,1944604908,113541888,837633734,15484614,-1996467039,1183707718,1183666412,317214956,79987459,-397361101,-998046991,-1956684286,1438866917,-1070338933,-1207919640,-11533950,-924318602,79987456,-402229505,-443874611,-1957313699,49054700,92923990,-166989685,-11137164,1996424822,155379716,-351878013,1589654274,-1017256565,1475119957,2123046486,-1962571004,1300955741,106269444,-16222837,2123041397,-1912238584,-849410467,-1088530655,-544341584,-1945600373,105221893,-1996063093,39684357,-1996206711,1971914325,172330760,-164428686,-773322517,114187,1971914123,1600003852,-1957051555,1926769628,605960970,-1962642943,-371064861,-1957363190,508975084,108956423,-1070336117,-218103879,-638107218,-1962639733,-1952123945,1566531266,-326412861,1460071555,74907478,-2096996888,-125107516,-402229505,-998045784,-1012990,-1202256266,-11534335,1793590390,147096329,-244087,-397015434,-998045686,-58836732,1586170229,-12482044,-1207702632,1600061439]},{"sector":4,"length":512,"data":[-1017256565,1475119957,139365206,119413987,-1962639733,-1494022538,1149946163,1161438975,2131195135,48972035,-1047801353,-1017290914,-1962823489,721420854,16679415,-1107070448,-1896214528,516194775,57932551,-2130621975,922746596,38020745,1109821750,-1312388350,1222693636,37790518,567095476,20357942,712180284,1354773278,-2101731570,-855002104,1329908513,775037011,1919885360,1952541728,1914729061,1769304421,224683378,-150789110,145033,-567557236,1253366775,-1942609459,-1962856930,503327798,889239574,-1992941107,906116126,37619340,12066574,162642469,-1959386675,-486340594,113587746,-628358390,-13182157,1929578014,13428995,235324726,-1143305213,-13238269,117638686,314571807,119585027,-1070346453,370584307,-974643449,310025,-851181384,-167087583,91521218,22318976,-327595200,-402320920,314246254,318472451,1393062659,1130043391,-1175262397,-517275642,-1962854210,-217639172,64940196,-1243026125,1726501114,1393167616,1801675124,1702260512,1869375090,218762615,1986610186,543515753,1869771365,218762610,1869366794,1852404833,1869619303,544501353,544501614,1684107116,168649829,1505366705,250425865,178975,567099572,-4710634,1206407168,-1173311228,-437581461,2075794865,1440672521,1048833163,1946157364,873922308,74907393,-1962662424,1438866917,1448602763,-1962639733,39684869,-1962652277,1972045397,175999752,-1957223987,92866174,-1996333687,1435042893]},{"sector":5,"length":512,"data":[141920518,1913275791,-336186620,154069000,-1962933826,209029381,-1017290914,1475119957,2123040542,-1178586364,-1359806465,1077985675,1566562551,-326412861,119428695,-1962639733,-1178586153,-1359806465,-1946711217,-544536962,-218103879,-638107218,-208929141,-1031035661,-1017290914,-2081649835,1448543980,-1962248565,1727465030,-96040696,-15992693,-51838091,105182720,-1975487220,-1952970940,-152841768,16913031,1291792757,41714434,-1962247168,-1979384036,-337368569,568874503,46433025,1090406025,-1070398091,-1962884375,1191117918,-28931580,-162592888,1963460164,121932306,-774337640,310900451,57999618,184584169,963343615,359793276,-13303977,-1796733834,113541895,16940073,-335596740,41714658,-14453760,889127540,-402360577,-998045833,38046470,2083193857,38046466,-956021247,580,-396969493,-998047580,-28931838,-1961135040,1191117918,-28931580,-347142264,-1981262178,46433024,1090406025,1183517813,734473210,108459986,1586177003,71761668,-1996601718,-16036089,1291838580,41714434,-1949402112,-1979384036,-337368569,-1956684085,1438866917,-326898549,-1957275902,-4258698,105155327,8628632,1156982900,578109446,18868310,-1962752893,-1813489928,46433027,-1744354166,123332688,184730755,-1090290240,1153892351,-947191802,-443850914,-1957313699,1988843244,105155076,8628632,1156974196,108281862,-369098824,1156972698,108265990,537283712,1283518187,1156972806,695536646]},{"sector":6,"length":512,"data":[-1744354166,-472786805,34768886,-1206225663,-397409792,-998045032,71600386,74760203,48957616,1141376176,75268870,-1978895104,-778565820,34801120,-1962654583,76088388,67519734,28837236,-1207702784,-11533824,1149895796,-397371385,-998045672,38045958,360693771,74760203,48963760,1141379248,38061830,1810432000,38600703,83827851,-467007606,1575324510,-326412861,1443032195,-1979616578,-1449654716,359989379,1149878323,105154562,-1996209015,121947652,-339309569,-2084140275,104532166,-680197574,-1956724685,1438866917,-326898549,-1957275900,-13433738,169928790,-1979530109,52692548,1014301244,134628598,1149898613,-661940217,-2013862959,1946223122,721718055,1183384644,2126515196,1962889243,121932292,-1058516840,113541896,1962690107,105676807,-16608,-1996209013,38061828,-947191808,-443850914,-1957313699,149717996,915101271,401277244,1342180536,1342346936,266876159,113541896,141869067,-2096970109,-462094276,1946172547,-2093184199,1187450055,-1979711234,-1986509051,485227078,1033373066,74776831,49004594,1586169226,-28901378,22316936,1207586559,16416387,80207477,1599995904,-1017256565,44304015,19799694,-1047803597,-108271221,741772105,1962281728,-221868536,1974355374,1083655674,-41157084,-989600303,-1377296618,-1949332487,-1946352644,-1912138004,1240871902,2122911203,-1404746496,1975519914,-1980505350,521535566,20719241,44312319,-1142125739,-75431150]},{"sector":7,"length":512,"data":[141755154,1528299347,-219462845,168085480,-2146798364,1962935422,71747076,382017278,12059196,522308901,50859659,45811683,102694656,71731971,567102644,44435087,19799694,-2135029994,865643520,1048585938,1912799542,109989989,-1070399444,-772290421,-1359808373,1963276326,63407097,-772290421,-1977157749,977356549,1007973600,1007186978,1006924809,1491825952,-2118252778,1328278272,-15991253,-812912268,-1014277310,50708739,-121600,-57941973,371131934,-1331367161,-880039392,8502815,-930410773,-31194108,-57941973,-1423948872,-1047812877,385125290,-594849761,-1431503221,1031061514,527770172,939982678,-1073042431,574369396,2105542517,74800383,-303322545,-12204473,-388633856,-797704137,-12167602,-1409206266,1958742698,2484232,-504629899,1274317738,1945320267,126332168,-335657847,199003122,-16615982,975603975,-1507393791,1946762242,-1021297662,1458342741,-1979418997,-1449654716,494141571,134628598,1962874740,121956356,-2147302269,871827044,-1996191296,1149830212,-443851262,-1957313699,1988843244,2063499524,-163810047,1963722308,121932342,-774337640,310900451,661979394,537150663,121932291,-774337640,310888163,113705218,362348852,148679,71600898,28837001,-2127238400,1963037438,105182764,-1977191156,-1952970940,-152841768,16913031,12064629,-773304318,46433030,184829065,-2147060544,-351795636,1589654457,-1017256565,1458342741,-2096728437,1946158206]},{"sector":8,"length":512,"data":[2063499596,-1977256703,1352140612,-2096813592,-1073020220,-397011340,-997983063,121932290,-774337640,310888163,451608578,26410625,-397010059,-997983091,74776322,-2096733720,1686110916,-1070336250,1149830281,-443851260,-1957313699,116163564,1988843095,106859272,1033373578,1114898529,1946186301,7814408,-2031537804,-28915968,1191116801,106859270,1965768576,-28409849,105316104,637421195,20774919,1025143808,880017410,1946158141,-955192524,196166,1187500267,-352320258,-134270007,589382,-813627276,-410976254,1586233342,1950318598,-813625227,384516096,-352124481,17416158,1586223595,1648328710,-813628299,-1531412480,-11055103,266863734,113541894,200951433,855932352,-146609216,589382,1153828468,300646406,117327607,-972655616,-352188860,105170436,872859393,840276225,-94467136,-2021071919,-1986526702,-1070398908,1149830281,-96040444,-1962457976,-1956684090,1438866917,-326898549,-1957275898,2123039862,105286410,-1995938057,1183447622,1958743036,105248315,-1975618292,-1952970939,-152841768,16913031,1308569461,41779970,-1978893312,-14841084,705136645,1460399076,1352139914,-2097030168,1173750980,91496454,-622215117,1325352448,105248508,-1978501880,-1952970939,-152841768,16913031,-1545010315,-58817792,-385649408,1183514761,38091260,1448090738,-1394067969,113541888,704398987,1183515205,-955973124,64582,2105791467,561250306,1443001855,-1998047745,113541888]},{"sector":9,"length":512,"data":[16926091,38112005,66864681,1170670197,-352321534,38666156,163203,76156028,100605323,-467007608,-1974006805,-397371388,-998047424,105248260,1176007968,-369340673,-1973944449,-397371388,-998047448,105248260,-1962052576,1177287238,-137221124,535496310,-61931706,16547459,1308617076,41779970,-1966113792,-14841084,705136645,1590619108,1575324511,-326412861,119428695,-1962639733,-678754698,990400139,-1961593090,1002505158,51147768,1324942321,-1527513777,-1960711172,-775550009,-1962249240,-775539769,-1528073496,-774272183,-777653271,-1979354133,92808708,1600045707,-1957313699,-164407572,838874553,850197732,-2130976032,251549172,108331061,3417736,-469102101,918162804,178944,-1275061831,841076032,3515072,1575324510,-326412861,-1274782069,1914817854,1418184202,-2017067007,-385875648,141688832,-443826125,108249949,-1207955992,-443809793,-466435235,-1023409688,167853730,-2145159708,50411070,574360946,540806515,95421810,1016072171,-1342015981,44612371,816027863,-997539071,-1957300245,82609132,1988843095,105155078,8628632,1156974196,108281862,-369098824,1156972762,108265734,537283712,1283518187,1686110726,-1070338298,-1962785655,-25261576,134628598,1149898613,-661940217,-2013862959,1946223122,725388080,-16055172,-11070850,1149895796,-397371385,-998047245,-28931834,1074021515,1153893513,-1962803454,1183450204,-351827964,105182826,-2125564668,1963031294]}],[{"sector":1,"length":512,"data":[121932333,803754136,46433025,896909323,20186823,1153897881,-1979506684,-1952970940,-958148136,16913031,52495559,12105963,2045267970,46433026,184829065,-2147060544,-351795636,105676955,114436,71732567,121932368,1961382040,113541889,972965513,57998974,-1962987031,-467008442,-443850914,-1957313699,73305068,21006326,855995393,-22091328,-1962389877,1068762710,74654157,183175604,22317046,-402426752,-1847001085,-61384962,-91491701,467912843,984354228,1008170180,-972589798,16859271,92800491,-1947475385,1606560711,-108805282,-2146995199,-311162308,-2013861653,1950351700,1140897817,-1023991347,175439904,45880973,567099316,179361138,113651691,-1929379140,-1274889194,1914817855,1958742978,142508826,-1189055487,-779354113,-851312200,112929,45891200,-1341688822,106334989,1451988203,-2137855226,167951422,-1158948491,-1947432107,-75299746,-2096005868,209453307,22317046,-1207602112,48955393,-1017266125,1475119957,-1962467754,803407950,2123094411,871860996,-17984,-146690318,1993030617,-1949594878,108432382,1149937395,986264575,91750213,-348060300,-1949174014,1566531265,-326412861,1459940483,24297046,401342259,-1744419702,1946190761,250107403,46433271,1191277632,956876419,1929525814,1590135779,1575324511,-326412861,-167485813,536958087,45616756,-1949748414,1931595217,-45422333,22317046,-385649280,1317732481,106334984,-1070397666,-1957275652]},{"sector":2,"length":512,"data":[-470119440,1074444389,846573298,735021905,283331018,60563917,74685936,1240140212,796180491,178502,-1274888518,1931595072,-351685628,1958742836,-678733542,-1957575189,-842388529,-268198879,-1274776675,186313481,-166300224,1073828999,1586170740,440369158,-336067723,146340100,41048348,1600046731,-1946370071,1451952206,-851397626,-1274776799,-470947063,1975520235,1418196711,175390721,1065409163,-133991142,-1191586069,-789898232,-1947432107,1333789790,-443874818,-1957313699,-1151904020,1065550528,506033408,374791,1963114728,-1715457275,608183531,46179326,-1778203997,66759,-955988349,-65980,46544521,-1945874805,-390033704,1583284586,-1017256565,-1947432107,1736442974,-1017262330,854362965,-163673857,105286402,145354034,-1258130432,-181499872,206082,1962935101,108429573,-893779967,-853887998,2603297,-1274784117,1931595086,10217731,-1962522997,83895752,1963262013,285587463,-69015047,49743558,11112705,-1962183678,12059734,-383660733,61407392,-1453886464,1383432192,50530038,-1337232000,-167376382,72780546,567098804,-1198274702,567100416,1971372790,-18131,45666699,-148779710,46840537,567099316,376750091,46808704,-149981926,-1194226727,567099906,1085589811,1051992525,1183457741,167977990,-1962740218,1035207766,997335501,-150869783,16778822,45614709,-9901824,49743558,142016256,1493311720,839405193,-167315731,125173506,33965815]},{"sector":3,"length":512,"data":[-2147257088,1452015329,-851659772,-385649887,116849440,1979646710,105314055,846528514,-851528557,105286177,101319460,1451950838,-851594236,-153587167,16971526,1190597749,1946157320,29982733,72780691,-851246664,1793692449,13363457,1945041283,-511688200,41389054,-24400388,1114898856,1942043464,63998741,27831792,-1039977356,-1962933755,-29062665,-24385813,-117240716,738086025,92883137,-117242389,-1946268418,-2116383546,1946267898,512501253,2139685628,-970538238,33751046,1962933821,67013413,27831792,-24382860,1942043464,63998909,27831792,-1039932812,-1962933755,-29062665,1200350955,1958742792,-338129404,251536915,276038400,-1338124148,637891585,49815182,-1108658293,856061835,5892288,225756731,1077936420,5105816,1308495220,780542,1318454644,865790798,1371773376,-1459731061,721646593,1094797768,645922746,50206267,-355400586,-1047792267,359843331,225624579,-1037839625,216581675,-150440704,1978323410,1505768421,-397323581,410255389,-1946252457,-940440592,-65980,-1962510455,1255615446,1493063049,1405311577,517092176,-1202695598,105906177,10020895,-2096577405,1512046586,184710235,-1957313582,-184105236,1996423170,6285318,105810265,839145099,-851659539,-1957858783,72780760,-851246920,29488929,839152896,-1325208631,105314064,242565120,411383,-167086720,-2147286266,-914357387,-183629184,29982722,-851181384,-154957023,57966786]},{"sector":4,"length":512,"data":[-2009020032,-972991345,82055,1442391017,849472651,-1949239551,-1021115298,-1073683583,58032296,-1996371072,-1017314210,1458342741,2122516055,947191816,-1962785601,1183516246,125126660,1912624104,-1958155481,1208128566,-147123852,1149963636,205949186,3860566,-2093976738,-25099066,74646164,108384779,-1711276104,-628417045,-787496061,-754732581,-850873109,-1830194655,1418265737,-1808365310,130036482,-443851169,1317782365,972524300,208929356,-2130393469,1963103486,1072429554,470014603,-745850510,-147078770,507053685,645071424,-787496061,-773074469,1005310443,50951671,19833305,-1064380373,567102132,-147124878,378078325,-2020474304,-1009677564,0,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,10,675283026,1919363363,1635018337,1663986786,824188960,941633838,825241398,3354671,771777138,6452327,25202,1917255766,1635018337,27746,1868787273,1667592818,1329864820,1702240339,1869181810,168632430,1917255680,1768452193,1751326819,1667330657,1936876916,1919705376,2036621669,1634692128,543450468,2573,1885434439,543385960,1918986339,1702126433,1814066034,1701077359,168632420,1850277888,1768710518,1919361124,1635018337,1713400930,543517801]},{"sector":5,"length":512,"data":[2573,1869771333,1701978226,1852400737,1919361127,1635018337,1713400930,543517801,2573,1974,0,0,0,0,0,0,0,0,0,0,0,25264513,1,0,0,0,0,0,85983232,85983232,1,0,258,0,518,0,900,0,1026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,0,0,0,0,0,0,0,34209792,0,0,28311552,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1127940676,1279870559,1313431365,20294,0,33691136,201919768,134679564,318767103,-16641523,168624128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,536870912]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[24271437,1572890,12648480,56099009,-72415232,5264,30,19136513,23330816,58523648,106692608,109248512,110034944,111804416,114360320,115146752,118161408,118751232,120979456,131072,16515610,16122394,15729178,15335962,14942746,14549530,326697498,234094592,345047578,394788864,400162816]},{"sector":9,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1917255680,1768452193,1358656355,1465012563,-1205971626,-661782448,-2031091277,-1207959522,-661782528,1946286976,102230102,1048577906,1946158913,5290018,512284814,1562312704,1499094878,1431328859,1183575179,1570590728,-13698472,-1946090962,-1996386794,-1207858138,-796000256,-402586948,-1863843723,-1911124479,-1943631103,5289985,113694862,520093696,1516199517,-816293031,0,-1911124434,646655489,1354236300,-958886400,-16777210,1600019743,1482381658,207,0,0,0,0,0,0,0,0,0,0,0,0,1342177280,243946065,-109051443,-1978501888,-2147007986,158662905,990330017,2081019142]}]],[[{"sector":1,"length":512,"data":[121544973,104595377,41683413,103514859,-654898731,922210867,2040728038,-801210362,108331009,108594887,-109051904,-1587645184,-1247606980,165323009,28812104,-1560280904,12059065,29074176,-1559806815,1050739133,29336327,-1560280904,28836289,29598464,165691008,-1207143424,-1046282239,47105,-1593719901,-979170852,47105,-1207842909,-912064512,165323009,-352203869,121413986,165283371,28681024,-1559806303,1017184695,28943111,-1560280904,1017184699,29205255,-1559806303,-4718145,29467647,-1560280904,1048576451,1946159584,47116,-1207844445,-1012727807,47105,-1593719389,-945616420,165323009,-912008969,47105,-1207841885,243924993,-906098217,-777789229,1482250753,58190019,-1560169055,-1214185043,28287745,-1560168031,-1147076175,28549889,-402627864,1048772678,1946157513,28156186,29951491,-1593725533,100860337,-1314717239,-1123665151,-2094958847,117566,-1348349324,-888798463,28287745,50443169,-1560163578,104530355,-1200225857,-1023205144,-855526320,-1273990122,1008127232,-386763493,-1863711987,1476395009,1381060803,-402652744,108199959,-402421272,-523173784,30475835,954789246,1482250755,-1391555645,-1357477119,2549761,1048781682,1946157509,-988927222,-1123140863,-2096007423,116542,371975028,372965831,-646577729,1398195192,-259304879,165158539,-2063304472,722433478,721535246,-33438954,-118655541,-1946615317,1532582598,1397801822,-985758896]},{"sector":2,"length":512,"data":[125042689,721531297,-1593447487,-1037368909,2097152061,-1948715262,41412824,-1324446888,-1290368255,1173505,29691395,29824515,-386763445,1482359443,1364416195,871402322,68413659,11585059,-1057095052,30640008,29429251,29562371,507233278,-512620072,-402650392,-963968389,1583044954,1381062339,-66989122,165625472,50754816,1309268022,-670135299,-1395510519,-757995312,243988962,-1031075362,1499119827,50014,0,0,842084384,909456435,1094268983,1162101570,1667391814,6710628,1426063360,1347637586,503731799,118418571,1041657483,-67078517,-1014244557,1958742700,1220936470,2078865547,2012691201,624733194,1508387188,536013569,1482644999,1566202203,-1157198034,110046724,777520317,79509247,-1154023634,904448772,1003416321,-1395099657,-227269316,1064578364,1198795580,1047809084,980708412,1030893628,964114748,242561084,-1606515922,108331012,-1543059922,-1202704380,-147980278,772055078,1476698275,808248370,-1610219218,772598532,77334270,-30538261,-352019194,1951939750,1918975010,2138717190,1021256706,1007580248,1008366660,-400526269,1424556242,113651455,772146335,77727431,585826320,113716880,656546,1452284139,-1014762613,1921728002,-1847022590,-402593024,-379715422,-1957232861,46367731,41061182,-2144467829,302398,1418397044,855829250,-1959898158,772055606,77598347,-402650136,1877475406,-379692288,1347026671,-768359797,-661915913]},{"sector":3,"length":512,"data":[-2013857960,-1039445798,1392997464,1543497704,-2144465941,302142,535298933,1019448064,772633098,77479552,772109568,77530626,503621051,534191886,-1023406104,159303947,77897774,-503315480,777176059,77207179,399369266,1948894454,26274309,-1017511936,-1573994445,-1574042468,-1574042467,-1557265249,-970062688,537175046,1342177475,1342826936,311194,1354979328,1342827448,311194,1354979328,-482443183,74711049,108594691,-1207305309,-1706030611,1215,165887616,-2095877120,424254,-459207564,2030996233,1959942,1482292194,-206024509,-1080406007,1476395012,-172470077,-1080406007,1476395012,-666991677,125700105,115917958,-389773824,1354956801,-2146829405,647486,104468340,158665186,1342830520,311194,167229440,79665744,-1017643008,-1072999600,-617407884,1944637763,-685884677,1259175689,-1014897711,-1705833987,1215,12802139,0,16777216,1342177536,263475795,1000476877,252066311,-385650166,-466485000,-150991941,64523243,-1962275554,123177735,-1555502345,1200293692,156732162,-1555502345,1200228158,121676292,-1576712310,1200228161,121807366,-1559804021,1200293699,122004233,-1559622239,113707261,155781375,121650816,-385649661,-1205993315,-661782464,520119968,168828555,846536872,563083,151328393,694155,151459465,1087371,151590537,1218443,151721609,1611659,151852681,1742731,151983753,-1752485653,378077196,-1752495867]},{"sector":4,"length":512,"data":[378077198,-1752495865,378077204,-1752495863,378077206,-1752495861,378077244,-1752495859,378077246,1048578319,1946157519,992521,-523116335,395040771,151066249,-1996335221,-955710698,17366278,-16333047,-133617400,1526268395,1405311067,121376315,-1729559690,1041644288,-385649145,1381040271,-768359797,121976567,868322128,1127675858,1523092231,281873844,1048598874,1946157518,1975519761,121675781,104466667,41224000,1048625202,1963001664,-339736060,853051933,-773598721,-2132553245,17422142,834340212,50653961,-402063586,-2137259957,17422142,1048585076,1946486587,993951772,359925255,-13444982,-472783919,150806019,1124234397,-351827133,91528458,-352321096,1539322626,195,0,0,0,0,1381061376,516481,516737,529193475,-1007227950,1532582401,195,0,-1437226496,-1437226411,-608773291,-608773194,-74,-1,255,0,34816,34816,37376,-1845493614,579338240,579347080,613556872,613557394,9577618,9568402,1227096210,1227114788,-1437251292,-1437226411,1437248085,1437226410,-1227139670,-1227114789,-9586981,-9568403,-613548179,-613557395,-579347603,-579347081,-9577097,-37377,2013265773,2013265919,-1,-1,1207959551,1752195442,24339305,17022976,524296,-16777215,-16777216,131072,67174400,805374465,285225216,369168897,12289,70912]},{"sector":5,"length":512,"data":[0,0,0,2030061312,2621632,-65511,16777472,419440640,16776960,65537,1638480,16842751,1342177536,-16770816,65791,20971521,196808,33555200,-939442176,768,131075,13107840,33488897,1342177792,-16770816,65791,10485761,983240,33555456,-939442176,3840,131076,13107840,50266115,512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331904,85472027,857422875,1276839460,1663394597,168624640,1663369728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1426063360,1448144011,-1205991849,36506571,18810112,-388896559,-388896559,-1962912605,-1064434106,637556384,-1610494558,-1574567849,1486881230,-811457024]},{"sector":6,"length":512,"data":[5873665,30450214,637557409,-66807133,-989213761,12126326,648344322,84535713,-1557788213,-1591342615,-888862229,-341629431,-308206071,164300041,166568742,166699302,638176005,638185379,84537761,-1557788213,-1591342607,-888862221,-207411703,-173988343,164300041,167093030,167223590,638176005,638187427,84539809,-1557788213,-1591342599,-888862211,-39639543,-6216183,164300041,167748390,167878950,638176005,638189987,84542369,-1557788213,-1591342589,-888862203,94578185,128001546,164300042,168272678,168403238,638176005,638192035,84544417,-1557788213,-1591342581,-888862195,228795913,278996490,164300042,168862502,1583286047,1575324504,-326412861,-402574664,1448543921,-1996397384,1586296390,-1539407624,242418190,1342177720,18233087,-2096970008,1187448004,-973078300,-973015994,-385810874,548929711,146296833,-2037559296,-1924071656,-397351866,-998047042,1958742792,81185,37561204,1025864704,661913603,1946158141,415137833,1333068031,-768314,113669099,-335609769,1476839020,1709965056,5637830,-966857729,-16754426,-2037557269,-397345000,-998045953,5939970,-15169910,-153580648,68084103,1048774516,2114125914,112692,473366352,-2146505983,1946222206,112656,439811920,35514369,-352009085,411471124,-2037559041,-397345074,-998046227,-28916220,-193036033,-385649408,2122383176,1534329086,14960327,21930240,2112112185,440347,-1947963657]},{"sector":7,"length":512,"data":[716701656,-830042879,-1360506626,79987460,544587787,956386977,494789702,-150993224,-661920658,19695499,19830667,-1980348791,334231638,-337361153,178360,439811920,27125761,-972766077,-969545914,-1928993210,1358893190,1357268621,1357268621,-2096827672,-1769273660,-1070858480,-2081929725,1183383762,-61437446,14960327,22067200,139323472,990037123,511108166,1342263480,-2096611608,1586168516,-992465948,2123102838,1350929124,3679745,1354245236,552095745,46433032,1977894459,-126419174,-624897,1996487798,-49813254,-385301373,1191117064,-945099804,58438,1354244331,-253210623,46433031,736386699,1345766616,-461468928,22054282,-16742362,1354294342,-790081535,46433031,2011448891,-414791983,-1676244151,96480014,-763166676,-1950183936,126559960,-15694199,-15694195,-431583920,-431583920,69331024,-1207516029,-397409968,-998045805,1343130370,1377733376,-2084033792,1317602537,-497120800,-1948229948,1452014150,126428924,39291174,-493825,922744438,922681426,1525153872,147096572,887113415,-498678016,1589903440,5546464,-523041615,637603885,1187383177,1187390951,1352730086,-330921728,-1996467551,-1912662394,1358893190,1357268621,1357268621,-2096914712,1187382980,1187394023,1419837670,-330921728,1357268621,1357268621,-2096711192,-1070398268,110684240,1577239683,1575324511,-326412861,-957824973,226539523,74907472,-2096892952,1996424388,108324870,-1017256565]},{"sector":8,"length":512,"data":[-1192457387,-1494745062,1048598019,1962934626,-314128868,-330906057,-330920704,-330920624,107276368,-1979399037,1654846022,-1676244223,96480014,-763166592,-62486272,-989964663,-1977156514,1586206727,2097625348,22722591,-1962410160,-59325409,-1744795098,35907664,184861827,-1948748352,268371038,654073540,-1952970870,121177182,1586171004,509446,-369099080,1586168312,-1962410236,-59325409,-1962898906,126355038,23201338,2028536692,-364460287,1122697216,1342266040,1586182027,1082795772,-397371391,-998047287,1975520004,73304887,1589917579,23240956,20985894,1586177652,-1962410236,-59325409,-1962898906,1191176798,108432362,1589903496,126494460,73304984,-1334048967,-1947574645,12977782,-96024832,1183514624,-96061176,-756481156,-94467328,1988879313,-2145875190,443824703,-772120949,-13565981,-1897396618,79987457,57982987,-385820695,1586167977,-1948003846,9112182,1996443712,24111110,184861827,-385649472,1589903544,126494460,73304984,528287545,1342266040,529205247,654079684,1352138890,-2097083160,-1073019708,1586223221,-955252988,59462,1522025195,931876865,654073483,-1744748406,15198288,184861827,-1959299648,931857502,-1594073404,942014818,645136704,-16490869,-1004565753,-1977156490,-396457216,-1947711745,8914550,654073540,-1952970870,121177182,1586212988,108432360,-1962934074,1178142790,-14058246,-588773770,46433028,1996443712,105286406,518541376]},{"sector":9,"length":512,"data":[113541892,-1610195317,126353762,1191144939,-17634822,-335919477,-431569051,1139474432,1342266040,1586182027,1082795772,-397371391,-998047663,1975520004,73304888,1589917579,23240956,20985894,1586177908,-1962410236,-59325409,-1962898906,1191175798,106859494,-1006550904,-1977156514,1586206727,2080848132,-428438609,-972661109,-1207959232,-1956708353,1438866917,45673611,19130368,1988843095,23240710,1946437176,-335596774,71731727,3727243,28837237,1191897856,947969931,871003392,-1956684096,1438866917,112782475,15460352,-402360577,-998046640,-62486270,-402229505,-998046652,-96040702,16547459,-1073019788,-1070398347,1996437227,3467516,-16595837,736688758,46433024,-362753,-504824714,79987459,-113015,686357622,46433025,-386238721,-998047457,-28931326,-1017256565,1458342741,-1962641781,-1318996522,-1975405446,-1965282595,1958742532,1925528079,2009152008,-2000475644,-336902652,1566491275,-326412861,-1960946089,92996734,-1962779253,1435173965,141921030,-1962248705,93194366,1594252686,509026765,-1912465985,142511071,1167000972,108956422,1569260937,72190210,-1996073591,1167001717,855929354,-402068490,29231547,-1996125440,1579093109,1505975647,-668214133,507185778,74583396,-503323765,1426208233,1448602763,2123040542,871860998,-17984,-146690318,75402201,-1527523445,1600045707,-1957313699,116163564,1996445271,47835140,-1962752893,108462072,-2096718616]}],[{"sector":1,"length":512,"data":[-259325244,1460041471,1342177720,-402360577,-998045847,-62486264,1443264255,-2096693528,2117665988,-1962314244,1099564126,65771775,1593835448,1575324511,-326412861,-2147197301,-1962803633,1438866917,1465314443,-2096273733,695533631,95946526,68085760,-1070398091,1076161433,1722023460,224961293,17090454,80118528,-16890681,1815513599,72256269,-1064380276,1594013928,1575324510,140831171,-1962797633,721420854,16679415,-1107070448,-1896214528,784630231,57932564,-2130621975,922746596,239216265,1076267318,-1312388338,1222693636,238986038,567095476,245670710,712180284,1354773278,-491118834,-855002092,1329908513,775037011,1919885360,1952541728,1914729061,1769304421,224683378,-150789110,145033,-567557236,1253366775,-1942609459,-1961976802,503327798,889239574,-1992941107,906902046,238814860,12066574,370260517,-1959386675,-485484530,113587746,-628355046,-13182157,1930434078,13428995,503760182,-1143305200,-13238269,118494750,583007263,338737424,-1070346453,370584307,1223171847,310023,-851181384,-167087583,91521218,247631744,-327595200,-402387736,582681449,586907920,1393062672,1130043391,-1175262397,-517275642,-1961974082,-217639172,47835300,1089006899,-1209511689,1393167616,1801675124,1702260512,1869375090,218762615,1986610186,543515753,1869771365,218762610,1869366794,1852404833,1869619303,544501353,544501614,1684107116,168649829,-1178987855,250425877]},{"sector":2,"length":512,"data":[178975,567099572,-4710634,1122521088,-1173311229,-437578293,-608559695,1440672533,1448602763,2123040542,108432132,1317787531,1996372744,63343380,1945648065,66126604,-45134087,-335764237,197626657,1944637894,868715274,1927860678,-1958107925,-202780199,1944834469,637831685,-1031076472,-1017290914,-2081649835,959038,385811572,1996426914,47179780,-1017256565,1475119957,75402070,1569392011,72190722,-1962519157,2106263669,1461832970,-1996063093,39684357,-1996206711,1971914325,172330760,-164428686,-1662514965,114182,1971914123,1566531084,-326412861,-1962467753,-1070398338,-218103879,1086426030,1608054592,-1957313699,-1957275668,2123039862,-1962467834,-1178586145,-1359806465,-1948649663,-1968770053,-919339196,1929332026,1090876421,-772341013,1600045451,-1957313699,2123061228,-1461168380,-397393665,190577949,1526953408,-397408277,-997983091,-1017291004,-2097099799,-126619911,-18775999,-66947189,-1459713107,1212314625,359907643,-268185461,1946265773,96600884,-141885438,-335657847,1962839014,-1980169460,-1054081460,-351958712,-17235195,-963903924,-92153204,91488789,-434205658,41912591,113649347,1023545322,628424702,-268173685,1946265773,1224641522,-1116487365,-268185461,1946265773,96601058,-141885438,-335657847,138906598,74760203,334223502,-368116186,-1945078769,34946520,-1910110860,-1961893346,-1950487753,-1070397833,989878760,604861638,-1740619775,1946177000,-28443123]},{"sector":3,"length":512,"data":[1946160104,1313773061,-1070359829,-1957575783,27852357,-936705164,-1170128567,992378879,1980753942,1978323204,63015925,51737286,-150113598,734143442,846022,-755562379,-445257007,-1017528269,501764434,1461220352,-259260789,1153954307,-1979711746,-695531913,-1991583957,1499004501,1347666778,1377751603,28856402,520507392,-2096687384,-92075836,1532633087,-771030412,-326412861,1460202627,-1439265962,-1206392050,-1202716660,-11530260,101574708,184992899,-2096597824,1015218886,-2082179840,963903548,-947700597,-28915956,92930048,1183422535,-1977816070,-12740603,839152896,-1979520064,-27358459,-1996601601,-15809913,-2092434866,1962998398,313310,-1956684288,-1883021851,-1911555578,856595486,-1950250039,1241091049,2897547,141882891,-1359821170,-92950971,608212805,-771912706,382010341,-91756513,-57946229,-326370045,-561117418,-481692109,8292621,-1431550651,-92946422,1317663714,-1994451456,-15816154,1427110438,582741131,586907920,1393062672,1130043391,-386733245,-469105841,2122320500,74776580,-33274170,974570782,620804110,-1960894003,-485484530,178951,269885183,-1274788213,-1893610164,-1911555066,370056222,8437255,-768370516,-1539407834,1701970702,738627152,-1950338304,-1949173816,648999672,-109771464,-1962686589,-1949173816,92940023,-533053113,574362740,154929268,540804212,374926197,8502791,726608875,1962871806,1120898033,63146843,198081,738197029]},{"sector":4,"length":512,"data":[519867360,118890246,548447475,533433258,-352288322,80251662,738075652,-1191408672,-206888893,-1430156380,521598091,-1948480688,178957566,1010660544,1444902178,245761791,1958742700,1965177902,-8552441,1325692252,1206774698,16729542,938005995,1322284032,117392982,-1431564634,141869066,1962943976,-1428034571,1263269003,141816635,-1995995219,-219414972,-770974581,134152821,245900937,268183295,41158972,1438851132,-1957237621,-25099146,1014304120,201737462,1149908597,-661940217,-2013862959,1963003408,71616295,1149898800,-661940217,-2017008687,-956232176,1561240070,38061855,1149960704,-1207662332,887816193,227606145,1156983925,645204998,-1744354166,-472786805,235964406,-1206422271,-397409792,-997983935,71600386,108314635,134630528,-1070351893,1575324510,-326412861,108432214,294531,-25080716,628428152,-1744354166,56223824,184730755,1444312256,-2096910360,1149895364,-661940217,-2017008687,-352317936,-1862368998,1444640013,-2096917528,1962869444,-120461308,-2147302269,871827044,-1996191296,-1956772796,1438866917,-326898549,-1957275898,2123039862,105286410,-1995938057,1183447622,1958743036,105248315,-1975618292,-1952970939,-152841768,17698951,1308569461,41779970,-1978893312,-14841084,705136645,1460399076,1352139914,-2097035544,1173750980,91496454,-622215117,1325352448,105248508,-1978501880,-1952970939,-152841768,17698951,-1545010315,-58817792,-385649408,1183514761]},{"sector":5,"length":512,"data":[38091260,1448090738,317208063,113542138,704398987,1183515205,-955973124,64582,2105791467,561250306,1443001855,-286771713,113542137,16926091,38112005,66864681,1170670197,-352321534,38666156,163203,76156028,100605323,-467007608,-1974006805,-397371388,-998047445,105248260,1176007968,-369340673,-1973944449,-397371388,-998047469,105248260,-1962052576,1177287238,-137221124,535496310,-61931706,16547459,1308617076,41779970,-1966113792,-14841084,705136645,1590619108,1575324511,-326412861,-1175047338,-466485195,-533549828,-192873502,890175061,-2012842752,-352308186,1961101841,3586573,-1191181637,1085538329,-1070456371,1577072034,-1017256565,1458342741,74877783,-1715457028,1017961099,1023112224,1022850057,74751021,24455996,2000239788,1915759647,-773598949,-1949594670,-773598726,-773598766,332989394,-2082995241,-588578606,125148563,-763111177,1608185600,1575324510,856191683,1575324608,-402230333,-4718579,1575324671,-387697981,-1564278783,-469102932,1048585077,1912802980,1931623437,1914715149,-351948795,322736135,330302070,-686817605,245277592,-339440957,-326412809,1459940483,108432214,-1744419702,1946190761,105182726,-1207536576,-622198785,105182720,-2147060735,-350222772,105677038,107249666,-1983892497,-125107644,-151093623,1963460164,121932303,-774337640,277346019,812908814,2083208331,2130643716,1962891026,121932292,1558728856,113541890,-1946270071]},{"sector":6,"length":512,"data":[-1992293308,38061828,1552613887,71731716,1793787784,67519734,-25080203,762645880,-1744354166,6940752,184730755,-952797760,1561240070,71616287,1149898800,-661940217,-2017008687,-956232176,-351260412,33601720,-168564656,-1996307325,-1073019836,1283458676,-1679095802,67521664,1459618239,1342457485,-1744354166,31320144,-1996045181,2117729862,-385649410,1183514417,1592011268,1575324511,-326412861,-2096865653,293410043,2080439171,-1031277044,91504654,-352321096,1572877058,-326412861,119428695,-485994869,-1948677329,-141884290,-4603853,1101984511,-885270025,-880082314,1988886155,-1968770298,-919339196,2013218106,1090876421,-772341013,1600045451,-1957313699,82609132,1988843095,1459565316,-2097011224,1149895364,1006838790,-163810046,1963460164,121932303,-774337640,277346019,661913870,1143669899,-62486268,461291531,74776400,-1744354166,18475088,990299267,125107270,537283712,-1946157121,76088388,148679,1590135552,1575324511,-326412861,1459940483,225492566,401342259,-1744419702,1946190761,2045269515,46433279,1191277632,956876419,1930311734,1590135779,1575324511,-326412861,-2096736426,1962936446,239255352,-1962518901,1967653958,5498887,1223370610,244463243,990999624,-1962052361,1183384132,988304908,812867072,-2130393469,1930334974,1976699652,-18426,-1960973415,264471514,61987793,1219816403,-378396211,-1996191342,914948692,-1070395758,-1956749561,-1950130715]},{"sector":7,"length":512,"data":[-141882290,1946307641,80118540,244514433,-335941003,64654143,-1959169508,1002540755,956724727,1930313246,264471334,-338568239,-338564143,158725947,-1667114749,-1898435826,-850742080,990736929,-1996196361,-1844560362,-779418489,-326412861,-167485813,537838215,45616756,-1949748414,1931595217,-52303613,247629814,-385649280,1317732481,106334984,-1070397666,-1957275652,-470119440,1074444389,846573298,735021905,283331018,60563917,74685936,1240140212,796180491,178502,-1274015046,1931595072,-351685628,1958742836,-678733542,-1957575189,-842388529,-268198879,-1274776675,186313481,-166300224,1074709127,1586170740,440369158,-336067723,146340100,41048348,1600046731,-1946396951,1451952206,-851397626,-1274776799,-470947063,1975520235,-1031276825,175390734,1065409163,-133991142,-1191586069,-789898232,-1947432107,1736442974,-1017262330,0,0,0,0,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,270,0,0,1868787273,1667592818,1329864820,1702240339,1869181810,168632430,1953451520,1730175264,1752195442,544433001,1852404336,544367988,1701603686,658720,1701998165,1852272483,1684372073,1769107488,1919251566,658720,1701998165]},{"sector":8,"length":512,"pattern":0,"data":[1852272483,1684372073,1769107488,1919251566,1919905824,168632436,1818838528,1701978213,1696621665,1919906418,658720,4325458,4390982,1124094010,1380928591,5522762,1346458183,1396918600,1280262912,3232335,1330401091,1124086866,1380928591,1329791032,1128353869,6029396,9699445,13172908,14549212,14811360,15139044,34933604,23331056,16318997,34932068,123994368,17236501,34933092,56885518,393749,1885434439,1935894888,153092096,1027279373,43,1885434439,1935894888,62914561,134219777,256,255,33554687,16777216,17432836,3211312,17957137,3146006,18153472,0,0,0,4653056,671137803,-16770816,65791,2621441,-65511,16777472,419450880,16776960,65537,1638480,16842751,1073742080,50382849,196608,20971522,196808,33555200,-939360256,-16776960,262145,1638480,16842751,-1610612480,251709440,262144,20971522,983240,33555456,-939360256,-16776448,131074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,406002435,456923909,453387315,627254604,218234979,620888074,99]},{"sector":9,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1885434439,1935894888,31457281,134219777,256,255,33554687,16777216,17301763,3211312,17826063,3146004,18022400,0,0,0,4653056,671137803,-16770816,65791,2621441,-65511,16777472,419450880,16776960,65537,1638480,16842751,1073742080,50382849,196608,20971522,196808,33555200,-939360256,-16776960,131073,1638480,16842751,-1610612480,251709440,262144,20971522,983240,33555456,-939360256,-16776448,131074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,70327042,840645659,625679110,6497635,658690,6497538]}]],[[{"sector":1,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1885434439,1935894888,145227777,134219777,256,255,33554687,16777216,17694982,3211312,18219285,3146012,18415616,0,0,0,4653056,671137803,-16770816,65791,2621441,-65511,16777472,419450880,16776960,65537,1638480,16842751,1073742080,50382849,196608,20971522,196808,33555200,-939360256,-16776960,262145,1638480,16842751,-1610612480,251709440,262144,20971522,983240,33555456,-939360256,-16776448,131074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,524296,238230277,453446157,355670844,453394203,627254604,218234979,1645937162,6497538]},{"sector":2,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1885434439,1935894888,145227777,134219780,256,255,33554687,16842496,17694982,3211312,18284821,3146022,18481152,18874653,291,0,4653056,671137803,-16770816,65791,2621441,-65511,16777472,419450880,16776960,65537,1638480,16842751,1073742080,50382849,196608,20971522,196808,33555200,-939360256,-16776960,262145,1638480,16842751,-1610612480,251709440,262144,20971522,983240,33555456,-939360256,-16776448,131074,0,262148,131074,262148,65537,65537,262148,524296,0,262148,131074,262148,65537,65537,131074,524296,238230277,453446157,355670844,453394203,627254604,34406755,453118477,1830486649,40049410,620913179,99]},{"sector":3,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1885434439,1935894888,145227777,134219780,256,255,33554687,16842496,17694982,3211312,18284821,3146022,18481152,18874653,291,0,4653056,671137803,-16770816,65791,2621441,-65511,16777472,419450880,16776960,65537,1638480,16842751,1073742080,50382849,196608,20971522,196808,33555200,-939360256,-16776960,262145,1638480,16842751,-1610612480,251709440,262144,20971522,983240,33555456,-939360256,-16776448,131074,0,393222,327685,262148,196611,131074,655370,0,524296,262148,327685,262148,196611,131074,65537,524296,238230277,453446157,355670844,453394203,627254604,34406755,453118477,1830486649,40049410,620913179,99]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1885434439,1935894888,52428801,134219783,256,255,33554687,16842496,17301765,3211312,17891599,3146059,18415616,19333408,20250926,21168444,4653379,671137803,-16770816,65791,2621441,-65511,16777472,419450880,16776960,65537,1638480,16842751,1073742080,50382849,131072,20971522,196808,33554944,-939360256,-16776960,262145,1638480,16842751,-1610612480,251709440,262144,20971522,983240,33555456,-939360256,-16776448,131074,0,65537,524296,1048592,131074,262148,131104,0,4194304,262145,524288,1048576,131072,262144,2097184,4194368,221256452,840630794,625679110,23274851,453838605,87387,1528497672,16777549,1297816326,100794369,21846811,453378816,85339,1528497668,83886413,1297816326,101056513,21846811,33554432]},{"sector":5,"length":512,"pattern":0,"data":[25381,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5318,0,0,4656,70192,0,16908288,0,33947648,0,58982400,0,67239936,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3592,0,0,533,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239206400]},{"sector":6,"length":512,"pattern":0,"data":[0,0,0,0,-2122252288,65921,0,0,0,0,0,0,538976256,538976288,673718304,539502632,538976288,538976288,538976288,538976288,269502496,269488144,269488144,269488144,-2071690224,-2071690108,277120132,269488144,-2122248176,-2122219135,16843009,16843009,16843009,16843009,16843009,269488144,-2105405424,-2105376126,33686018,33686018,33686018,33686018,33686018,269488144,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8192,1180648251,1598377033,1330007625,0,369098752,219677186,202116105,-63481,302846719,168689410]},{"sector":7,"length":512,"pattern":0,"data":[20208205,327698,13172768,39649279,589694976,2988,30,184418305,13107200,195887595,457834496,463208448]},{"sector":8,"length":512,"data":[-1957363712,15382764,1460366056,-2114614442,-956241170,43078,805389510,1760056918,79987469,620127408,704728202,-1983839251,1587651654,-1538901760,1621166204,-1538901760,-172488066,-1696051200,46433028,-2096869633,-956168634,42054,1586172907,-1948003932,838796926,-2096504344,1191117508,71732132,2091140665,117487845,121825360,-2096970621,2114061438,11581450,72869968,-2096970621,1962935422,55502854,-1962722071,529204830,764938122,1183383617,106859428,2139103115,359938561,17071747,-1330117259,-1207702784,-397410097,-998046691,646352130,1996443903,126937252,168084611,-1207274048,-397410097,-998046719,106859266,-504875009,46433036,1034307209,1014235138,-1962516853,41910303,-1207274449,-397410128,-998046759,-1501658366,-2095746044,1963000958,13613061,-1330117653,-1092071424,46433027,-16359797,106859271,132843519,-2096869633,-1962801594,529204830,1966030720,106859292,2139103115,125125633,-5749049,-1207243777,-397410097,-998046843,-1468103934,-385649409,-2030632823,536936297,-810022283,1793609728,46433027,-14252403,44492880,184730755,-1207274304,-397410097,-998046895,-1538881022,-2037890812,-2033778906,-969212121,1560225926,-14055738,1971767040,-1610611969,966264608,142386246,-9861433,116064256,-9861433,12075008,-303542265,46433029,120852222,1342636216,-2096745752,-2037579068,-11469018,-840391562,79987462,-1207835415,-1957691345,939460190,-2096359448]},{"sector":9,"length":512,"data":[-1073019708,-1330115980,-689418240,46433026,-9861385,175382528,1342230456,-2096970520,1183646404,1586188464,-398983418,-998046757,-1337553660,135325776,-402471805,1178273116,-1926204252,-397365178,-998047264,1975520002,5290018,-1287221936,54257744,-1962621821,4161752,1996426613,111470756,184730755,-13732416,-51862410,46433030,225820683,-391874817,-998045899,1958742786,8566794,38791248,-1207778173,-397410097,-998047163,-1337554430,4271512,113895504,184730755,-1978501696,764981318,-397410239,-998046025,1958742786,8566794,35121232,-1979530109,764981318,1183383617,-1538901590,-810022283,-18329600,46433025,1353729677,-2096639256,1950352068,10807555,-8878451,1095760,-1337553584,33286224,1074185347,1190528628,175444109,1342230456,-2097035032,1183646404,-1444392784,46433034,1133377675,-1404663376,1342198712,-391350529,-998045011,2022083844,381178111,1183666176,-1226288976,113541889,-340900215,5814331,-1773761200,182380624,184861827,-1206750016,-1924136870,-397371834,-998044980,1975520004,2022083853,-756526849,46433025,-507983125,1458065408,46433025,-5341565,1586216821,509612,1353729677,-14252403,132245584,-955988861,16738694,646352224,1996443903,83814564,-1207647101,-397408512,-998046728,872873474,117487623,71166032,855819395,-1796714304,46433033,-443850914,-1957313699,5552364,-955808024,65094,1190600683,1948254447,-1404662507]}],[{"sector":1,"length":512,"data":[-28931248,1342193925,1342202552,-2096550680,1191118532,-1404662274,-25755824,-2096871960,-1073085244,-443821963,-1957313699,5421292,1443316456,-2147197301,1966735743,-1744336373,-1996472275,99352134,16664263,-25755904,1353598605,-2097057304,1967129796,-18427,1183666155,1709723822,46433033,1946157885,-1371108034,74907472,-2097136664,-1073019708,1996434804,155641860,-1962752893,73305072,1560246400,-397162636,-998045388,-1963947262,-1986482622,-1072955834,1547547508,867070976,-443851072,-1957313699,-390056980,1996424887,151709700,1342358659,-16353537,1676149878,113541894,91602955,-352321096,-1950338302,1438866917,-1070338933,-16348440,1857553526,1189629952,79987464,1342177720,-1962380568,1438866917,247000203,107603968,452150982,-1995946357,1183709254,1183666418,1760055538,79987464,1324566214,-1996077429,1183577670,-129595132,1358055053,1358055053,-2096608536,2122515652,91488510,-335544392,-1950338302,1438866917,247000203,102361088,452150982,-1996208501,1183709254,1183666418,417878258,79987464,1341343430,1358055053,1358055053,-2096625944,2122515652,91488510,-335544392,-1950338302,1438866917,45673611,97904640,-16353537,-907541386,79987460,201213577,-15829568,367527030,46433032,-352041469,-28931325,-1017256565,-1192457387,-1528299506,73304837,-972798209,1187404807,1183467507,-129595386,-1996208501,1183709766,1183666418,-1796714254,79987463,16678531,-4717196]},{"sector":2,"length":512,"data":[855829503,1575324608,-326412861,-402649928,1448543587,-1744731160,-1946401143,1065354334,-2145750016,1966735743,-1744336364,64546896,755156099,1183383617,71730172,106859266,83641994,-1962440639,1204160094,1586182657,1547665412,-1957491595,1077937734,86632528,1183533035,-1957674756,1077937734,-10950576,184861827,-1207536448,401211391,73304833,1946173312,108461851,-2096675864,54330052,-1207075328,-11534222,1256719990,79987463,-16484609,1055393398,79987463,-385452405,-24444748,1342207160,1342260621,-2096909336,-259324732,242611723,-402229505,-998045952,66095874,76154486,1023297160,-972786340,-966984122,1991770116,1166888960,1307070465,79987463,292929547,-1996601718,-396929532,-998046585,-336098556,7911517,21335376,120252496,184861827,-1975093824,76086854,1183319434,378622,1208370827,-1191688567,-1957691269,-1992230842,-397346234,-997982631,-1982297340,1065416798,-1964739328,92864070,956712587,58063430,-1946215191,-347080066,-28931428,1015022728,-385649664,1996488516,106620934,1023591555,225771522,1342209464,-402229505,-998046111,108461828,-2096973336,-1070398780,-443850914,-1957313699,964844,-972827928,-1927679162,-1924074938,-397348282,-998046249,-230258172,-443816918,-1957313699,2013420,1459859176,-2081060010,1153834734,1183666689,1448497400,-2096956440,1451951812,62925816,-763166140,-230258432,-940288375,63046,-990486901,-1977159042,75401985]},{"sector":3,"length":512,"data":[1191117192,-159480842,1592360501,1575324511,-326412861,-402645320,1448543067,-293341813,21284382,-129594030,-396994992,-998047064,-128546042,1141096491,13796098,-1980610935,1187509334,-1962934026,2123101790,-1006532092,-2010713474,-163119359,905346691,1600055678,-1017256565,-1192457387,149422086,2122536451,1065091076,-1744363104,2097432121,5355574,-1727762697,118883843,119019027,-1979955575,1187511894,-1962934022,1992620638,9053948,-2012842357,-96010496,1375370883,-4658818,855829503,-443851072,-1957313699,440556,1443017448,294531,564150140,1178179591,-1204388604,1861681233,100899076,370345750,1183385368,-27883012,16402119,-94467328,-1979287925,-59325440,-16742362,2122578502,-377597446,-335544392,1589654274,-1017256565,-1192457387,1558708348,1183667714,-96040488,1350846093,-402360577,-997982406,1958742532,-951650499,913682432,-1949743477,1183435606,-27883012,14042823,-698447104,654079684,1988821130,-16742150,2122569286,-377609770,-1730656630,1963214395,112645,-1070398741,1575324510,-326412861,-402627912,-1957297673,1659798517,1353598605,-402360577,-997982506,1958742532,151308063,71732036,38046016,-454535594,79987459,15812343,-1207602048,48955393,-1956724685,1438866917,1656286347,28436480,-2081060010,1183671022,1996443822,-24057852,168084611,-953781056,-1958475516,-1992293306,1448477252,-2096914712,1190593732,1971323121,105182983,91488768,-352321096]},{"sector":4,"length":512,"data":[1589654274,-1017256565,-1192457387,1692925966,-2143387647,510984192,15877831,121026616,-1913108855,-1924074938,-397348282,-998046885,-2147039740,922746624,922683210,1996425032,6481924,-1017256565,-1192457387,619184130,1988843009,-1978733820,1357130244,-2080396824,76022468,3964998,1183575413,-443851260,-1957313699,178412,1442904808,1988827627,-1962087674,950797406,-1962642169,-2146243645,-277544900,-1962653953,1065354334,870282496,-443851072,-1957313699,71732204,225829898,108159292,41384508,1593778220,1575324422,-348539709,-348474362,1429976066,1452010635,-383660796,-1957362788,508975084,-1962639733,39684869,-1962652277,1972045397,175505160,-1912045941,106794501,1461833055,31899422,2123095950,-1895461880,2123040325,-1996125946,1300824669,106268932,-1895271031,74582597,149681715,-1107075096,92995585,520910217,-1017290914,1475119957,-1962467754,803407950,2123094411,871860996,-17984,-146690318,1993030617,-1949594878,108432382,1149937395,986264575,91750213,-348060300,-1949174014,1566531265,-594847293,175298603,17571387,-477428622,-1947606529,-326413055,119428695,-1962508661,-1178586121,-1359806465,-1948649663,-678755202,-1031035661,-1017290914,-1962809665,721420854,16679415,-1107070448,-1896214528,1589936599,57932551,-2130621975,922746596,18228873,338069814,-1312388351,1222693636,17998646,567095476,24683318,712180284,1354773278,-21356786,-855002101,1329908513]},{"sector":5,"length":512,"data":[775037011,1919885360,1952541728,1914729061,1769304421,224683378,-150789110,145033,-567557236,1253366775,-1942609459,-1962840034,503327798,889239574,-1992941107,906038814,17827468,12066574,221100581,-1959386675,-486356466,113587746,-628358452,-13182157,1929562142,13428995,-804862666,-1143305214,-13238269,117622814,-725615585,123779330,-1070346453,370584307,535305991,310021,-851181384,-167087583,91521218,26644352,-327595200,-402447896,-725941634,-721714942,1393062658,1130043391,-1175262397,-517275642,-1962837314,-217639172,32434340,837348659,-1662496525,1393167616,1801675124,1702260512,1869375090,218762615,1986610186,543515753,1869771365,218762610,1869366794,1852404833,1869619303,544501353,544501614,1684107116,168649829,-709225807,250425868,178975,567099572,-4710634,1474842624,-1173311230,-437580569,-138797647,1440672524,-326898549,-1101637882,-397016606,-998046846,-1913091326,-11532730,-397015946,-998046579,-96040698,-370649258,79987459,1593460363,1575324511,-326412861,24526467,-16485376,-16681450,-1571722,1575324417,-326412861,2123060823,-1962571004,1300955741,106269444,-1962379893,567085693,108956503,1569260937,72190210,-1996073591,1167001717,855929354,-402068490,29229252,-1996125440,1599999093,-1957313699,119429100,855932555,-17984,-1047810318,-654884800,1438866783,1448602763,2123040542,869763844,-17984,-1957712142,108956663]},{"sector":6,"length":512,"data":[-4595829,1101984511,-24389129,-1527516277,1600045707,-1957313699,2123061228,-1962467836,-1178586145,-1359806465,-1965426879,-74774970,944746226,855798789,1606913023,-1957313699,-1957275668,2123039862,-1962467834,-1178586145,-1359806465,-1948649663,-1968770053,-919339196,1929332026,1090876421,-772341013,1600045451,141738845,-443826125,108249949,-1207955992,-443809793,-466435235,-1023409688,167870626,-2145159708,50427966,574360946,540806515,95421810,1016072171,-1342015981,28621587,1923324119,-997539071,-1957300245,149717996,915101271,401277310,1342180536,1342294200,1609053439,113542140,141869067,-2096970109,-462094276,1946172547,-2093184199,1187450055,-1979711234,-1986509051,485227078,1033373066,74776831,49004594,1586169226,-28901378,26642312,1207586559,16416387,80207477,1599995904,-1017256565,30803599,24125070,-1047803597,-108271221,741772105,1962281728,-221868536,1974355374,1083655674,-41157084,-989600303,484974358,-1949332484,-1946352644,-1912138004,1240871902,2122911203,-1404746496,1975519914,-1980505350,521535566,25044617,30811903,-1142125739,-75431212,141755092,1528299347,-219462845,167907816,-2146798364,1962935422,71747076,382017278,12058894,522308901,46796427,45811683,-937492736,71731970,567102644,30934671,24125070,-2135029994,865643520,1048585938,1912799608,109989989,-1070399444,-772290421,-1359808373,1963276326,63407097,-772290421,-1977157749]},{"sector":7,"length":512,"data":[977356549,1007973600,1007186978,1006924809,1491825952,-2118252778,1328278272,-15991253,-812912268,-1014277310,50708739,-121600,-57941973,371131934,-1331367161,-880039392,8502815,-930410773,-31194108,-57941973,-1423948872,-1047812877,385125290,-594849761,-1431503221,1031061514,527770172,2047278934,-1073042431,574369396,2105542517,74800383,-303322545,-12204473,-388633856,-797704137,-12167602,-1409189370,1958742698,2484232,-504629899,1274317738,1945320267,126332168,-335657847,199003122,-16615982,2082900231,-668532991,1946762241,-1021297662,1458342741,-2130413941,1963057918,105182780,-1976142580,-1952970940,-152841768,16939655,1153902453,-1979514876,-1952970940,-958148136,16939655,24512199,1153899126,-1962803198,76088388,-352321096,-83984076,-164858623,1963722308,121932326,-774337640,2055730915,393543938,1342308536,-2096528920,1149829828,1958742788,105676806,867822344,-443851072,-1957313699,1988843244,75399942,-2125696000,1963057918,121932325,-2098704232,46433032,376750091,144173142,-1979530109,-1952970940,-958148136,162439,-25093397,460653050,142338134,-16595837,300418164,46433033,-150576000,76136499,1577337993,-1017256565,1458342741,901379635,-52153856,-488623444,1442087163,3477246,646448757,300613684,225764362,-1157613894,431554562,-851397632,-1564462559,-1956773835,1438866917,1656286347,-108664831,1988843095,-1568240378,48276478,-1560000885]},{"sector":8,"length":512,"data":[1183515352,48014088,-291258317,49062658,1962949760,21620995,1948597376,17492227,48629447,-1070399487,-1560091485,-391970092,47883010,-1560093021,-224197930,49586946,48367303,854261792,1965898880,-200868090,-2144867582,209005372,48498431,47580871,384499712,1965046912,-465665267,175439874,47580927,117376235,-1975123214,-397371388,-998046201,1975520002,-357017921,-1863823358,79987461,1015083147,-15567570,1174593030,48674902,91875408,-1962621821,1815904496,113706869,131802,3964998,-1595341963,-1744532992,-23165303,1946174781,4668682,1480394100,-16157440,-2096966650,553557638,-23165301,1023435565,1047986197,781434883,321824767,48760575,49415879,179830784,-2014818304,46433024,146297067,-1192039680,-303366128,-397361101,-370474592,-352321096,-1632174091,35580158,-24388629,320618987,320934648,320934689,321524522,321524522,321524522,319427370,321524522,320082730,317985578,321524522,1048777487,1946157806,49062149,-381280021,1031863974,1191605285,1962950016,734497781,-396996410,-998046946,-369652988,1600061066,-1017256565,-1192457387,-521666536,-2091493385,1946813566,-402194684,-633437438,376700930,47980171,1468729227,-129595134,-2080745847,67296262,1048783339,1946157800,-601978096,-1995994366,1187510342,-352321286,-601978099,-1727558910,-1980217719,109312598,-2097020196,193086,1183518068,-96072712,1183516020,855829252,49324992]},{"sector":9,"length":512,"data":[48248459,48774787,-2094369536,2097216126,75399972,-971541238,-1958335228,1452013638,-2082932742,-621346606,-1980217719,1187510870,-352321034,-163133691,-41222144,-15143037,-11074442,1996487286,77064440,-2096577405,187966,-396943244,-997983884,-435254526,-1983370494,82574926,1177552070,-113013,-1072955826,92992127,1048773768,1946157780,2086747143,539787267,2105558854,-428539649,48774787,-1592494848,101384932,192152278,16154243,28837237,855829248,1441288384,46433026,-443850914,-1957313699,571628,1475785448,-502872234,-2097143806,1946158206,114192,-2096964447,33741830,-335788407,-601978061,-1995994366,109313094,184681180,-955943488,44366918,-386107649,-997984048,-2081387774,187966,104401524,74646246,48641675,48905867,1048837675,1962935028,250107655,46433025,-59310250,-2097058328,1048773828,1946157812,-152545529,46433024,-443850914,-1957313699,178412,-1577703704,1183384284,-566328322,108331010,48629447,922681350,922682068,1996423910,-533266684,-25755902,-2096940312,2122517188,108291844,1191476867,1048778869,1962935026,-432110831,175374338,48248575,-2096946968,1048773316,1946157810,-432110831,175439874,48248575,-2096950552,109249220,-955776292,192518,48537856,47580683,1996427892,50981118,184730755,-1207601984,48955393,-397361101,-443875036,-1957313699,-390056980,-2091453049,192062,512440437,1342112472,41911042]}]],[[{"sector":1,"length":512,"data":[-1978565632,512427078,931857112,76023807,233563178,47724287,-402360577,-998047027,108347396,49153791,117376235,-1956773140,1438866917,45673611,-180754432,1048794711,1962935022,74877777,1249834507,512439275,1342112472,41911042,-1609466880,512426722,1066074840,92801023,250340394,47724287,48379647,-2096991000,1967129796,-301531388,1321634562,-964706293,49168003,-1962445568,100729926,1599996652,-1017256565,-1192457387,-790102014,-1957275660,2123039862,-297893114,1282736130,512439787,1342112472,41911042,-1978500096,-669086972,-15758590,-1999009017,-337368569,-667484402,-1744532990,34334800,1074054275,117376117,-1958346002,-1073000505,1048822901,1962935022,105286407,49022465,-443850914,-1957313699,702700,1475634920,-533296298,-1983892734,1183448134,-364999688,-1444391422,46433270,737822345,75377656,-1325207391,737727235,-197229576,359989250,1965898880,-499219696,158674946,-397371220,-997982572,-499219710,192163842,125763339,49561219,-2095483904,1946158206,-129564922,-2097127704,192574,1191118452,7334140,49561219,1462138112,-2080462616,2122515140,158597124,16285315,887620469,-264338688,158597122,16547459,1122501493,-92864768,-18290602,-2096839549,193598,113708404,2097890,-26482601,1577239683,1575324511,-326412861,-1662468045,-465665037,74711042,48966576,1352147120,-1946289176,1438866917,-1070338933,-1192001816,-397410256,-997982744]},{"sector":2,"length":512,"data":[-264338686,359993346,47464067,-1341885440,-1341985960,-397371272,-997982772,1575324418,-326412861,-402652488,1448604491,-2147060085,242559548,47980171,47974019,1178569474,-13419797,2083536000,960266291,1043934847,192217822,1966095488,-502872314,-1409273854,-774927464,65130977,65130959,820609992,1015085451,-2147124176,-478267076,-1996202357,1590070079,1575324511,-326412861,-402652488,-1101597981,233505451,1178076298,-1207601916,149618689,3964998,-1070338443,1575324510,-326412861,-1946911256,1438866917,1944644747,1575324660,-326412861,-1946916376,1438866917,1609100427,1575324660,-326412861,-1946921496,1438866917,11791499,1426284777,-326898549,-1957275900,1149896310,-2086037498,-167349248,1950352964,-18426,-167716119,1946224196,105676806,-2131825888,-2147350964,871302756,38046144,2122971275,105182974,-1978698488,-1952970940,-152841768,16939655,1015754868,184843307,1460829951,-1979419393,1352140612,-2096933400,1183385284,71601150,-956004032,33489476,-1979425653,126354502,1156999915,1316291590,31653505,1149906293,-397371385,-998047639,1975520002,1980155701,-954567167,50332740,-1744354166,-472786805,41584582,17090305,-1195840765,-397409792,-998047478,71600386,108314635,134630528,1283496939,29295622,1183667968,1149915140,-397371385,-998047018,-28931834,1962835513,-13506301,704923274,-1956684060,1438866917,1586228363,352027396,-75296387,-166953984,1073845895]},{"sector":3,"length":512,"data":[28837236,855829248,1438866880,-326898549,-1957275900,-13433738,56617046,-1979530109,52692548,1014301244,134628598,1149898613,-661940217,-2013862959,1946223226,721718055,1183384644,2126515196,1962889243,121932292,1407733912,113541890,1962690107,105676807,-16608,-1996209013,38061828,-947191808,-443850914,-1957313699,82609132,-625060265,-335596799,105155095,8628632,-397014156,-997982343,24395778,147227463,44185145,-947133581,-443850914,-1957313699,73305068,33443712,-1017256565,1458342741,45136727,1962950531,-1207493079,1609039877,855995649,619420096,-1543625664,-1297939792,80188930,-964493311,-29047036,915013630,1317733046,-1898411004,649408,-443851169,-873872547,-285637888,-2143160205,2005663457,-1951532030,1946265854,-1053079486,-796191373,-1464995837,53769217,132546,1149892491,-1947800578,51148030,-28538375,-1991720661,50719493,-28508423,-628308341,31914625,-1943665292,-1996308962,650314367,46270150,-115454,-24435340,-1464995837,-1947044863,-1053079298,-796148365,-1464995837,65172481,132546,1149892491,-1947800578,-1073018809,-661781388,-31058965,1946337806,1037601808,91488742,-1172402650,-348681470,108497853,1508425779,1959148288,1073816589,1307088960,-32672768,199818829,-1778027520,-1695855026,-1013333965,-28996783,57934248,1095354411,2147465793,-1072284890,-788236798,-1946847766,1925579713,1925317397,601028365,-389665854,141885452]},{"sector":4,"length":512,"data":[-355347721,-1070340747,1364378457,1946164712,-24422632,-234622837,-16890681,108497407,-684992885,-27948726,-1017489064,-768389037,1347572254,1342177720,1256726278,147096321,536869507,41179994,1472451083,172919638,-1962654069,2123040342,119428872,-1073048580,-108850316,185496842,-1341490734,-604526035,-150941053,-1829270566,-1072967117,-235470220,-1829636205,805622663,41302332,-1951783164,1975716802,1325762786,-2012903764,995098436,1492480759,-1017290914,-1947432107,-2013920162,1948254614,1107474446,-779368141,57876941,-151930903,-2147379577,-2115435659,139365120,503731851,-54512889,-259303849,1709439627,-230683976,1362261422,-903098485,-854531255,-268198879,-1274776675,189393673,1177515200,-1174404423,1085539012,74654157,887818676,443858955,-338195623,-812953147,567134763,-1645214820,162792563,-1073014037,-2013915531,1950351766,106859275,1964654464,82573315,470333689,-1962773927,-379625786,1317794092,106334984,567099572,162792563,-337383957,-411713525,26642422,-1962249152,440369370,-336067723,146340310,1439755036,1586228363,107446276,1438866895,1465314443,142508806,-1086819072,1451950358,71731974,-402164408,661782611,915097835,1950876006,1962359569,38046477,1443645065,1577073384,-964480909,1727955204,184840961,-1207536174,-342228993,-2082829539,-607055933,-338492495,567101620,-1986860686,39094532,23475849,1594343475,1575324510,206474179,1278867339,-2096335870]},{"sector":5,"length":512,"data":[-25099066,-227212954,-1958745095,1914438618,-1898738887,1979136961,303970566,-2094632191,-607055933,-338564143,-147067951,-654112395,721514657,-1262448936,1914817866,1979136781,303466756,75993601,12833163,0,0,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,1543527471,2764330,774766638,20971520,1663369536,1044193338,175318304,1931804672,6029322,3014748,1543515694,23552,1631780864,1953459822,1229933088,543236174,2004116846,543912559,1986622052,1867382885,1852121204,1751610735,1835363616,7959151,1868787273,1667592818,1970151540,1919246957,543584032,1634886000,1702126957,1224766322,1818326638,1881171049,1835102817,1919251557,1919501312,1869898597,1847622002,1696625775,2037674093,1668172032,1701999215,1142977635,1981829967,1769173605,28271,2038,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18219008,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0]},{"sector":6,"length":512,"pattern":0,"data":[0,0,0,0,0,33691136,201919768,134679564,318767103,-16641523,1180648251,1598377033,1330007625,0,83886080,83886080,1,0,258,0,518,0,900,0,1026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,0,0,0,0,0,0,0,41025536,1819635240,721430892,2301997,0,0,0,0,8192,2573]},{"sector":7,"length":512,"pattern":0,"data":[21387853,6,32,1,2033057792,2136,30,1]},{"sector":8,"length":512,"data":[115408896,60300059,61808945,61816882,61809459,61809716,61809973,61824566,61810231,61811256,61810745,61810992,61832027,64367421,60325640,61145097,61153831,61160492,61161006,56840304,56842617,56837734,56837991,56836963,56840818,56839276,61161263,61177181,60295693,78248708,56836449,56840047,56837477,56841589,56838505,56837220,56838248,56841332,56839790,56841075,61169453,61177440,78249218,61176924,61159995,56840561,56838762,56839019,56842360,56836706,56839533,56842103,56841846,56842874,78249473,95056426,76674824,96673824,74891072,90767617,90767874,90768131,90768388,90768645,90768902,90769159,90769416,90769673,90767360,73064224,70840080,81147648,81147905,81148162,81145091,81146884,81147141,81147398,81144583,81146120,81146377,81146634,81145867,79375884,102891520,0,0,17104968,115408896,60300059,61808945,61816882,61809459,61809716,61809973,61824566,61810231,61811256,61810745,61810992,61824813,61811517,60325640,61145097,56840561,56842103,56837477,56840818,56841332,56842617,56841589,56838505,56840047,56840304,61176667,61177181,60295693,78248708,56836449,56841075,56837220,56837734,56837991,56838248,56838762,56839019,56839276,61159995]},{"sector":9,"length":512,"data":[61153831,61177440,78249218,61176924,56842874,56842360,56836963,56841846,56836706,56839790,56839533,61160492,61161006,61161263,78249473,95056426,76674824,96673824,74891072,90767617,90767874,90768131,90768388,90768645,90768902,90769159,90769416,90769673,90767360,73064224,70840080,81147648,81147905,81148162,81145091,81146884,81147141,81147398,81144583,81146120,81146377,81146634,81145867,79375884,102891520,-16185337,-16382716,197121,-2063632385,1962898431,1996453375,807337983,554836014,605496098,825370149,319822104,789976095,739585297,1397816571,1465274961,1085802014,-388461056,-527825784,58064700,-1962680599,2145616344,1425768448,-622263426,-773598973,-2134575389,-2127677579,1610699838,-164727807,67114758,116795252,1946681367,1404981280,-25082367,343081300,1965308462,1424916980,1422295297,-1976674303,50587908,918826584,-1960443564,-1967027704,637540118,-402497281,-1024064674,-1744079864,-1976641533,-385716825,-1024064805,738554884,47442272,-1024000206,-2147257341,-896909105,843112832,-1979550471,45869509,-167566104,41157826,-1360411254,51898370,1946469110,-398791915,-1024064750,-2147060728,-1796639036,79885826,-1024055435,-1979550717,42461637,-167579416,1282671810,-337112085,146994690,-998242700,40757622,1946469110,66879543,1625883509,133988354,514851957,-58704917,-1341885158]}],[{"sector":1,"length":512,"data":[-2144146661,74783740,703274416,1965816960,-350441468,1965898784,-350244860,46917912,-1024000206,-2147257341,-896909105,843112832,-1979550471,35383749,1971373302,79885886,-2136916108,1745664,-973071197,-2147454714,-855457560,-373279973,-990510599,-165907072,494142658,1576576,43116552,1574646,-369527544,-990510467,537293952,-352315346,585140791,1962940422,405145647,-338415104,-2134575581,-1070457740,1640070,242532362,1519136,-1427512270,-2134575615,-719190924,-804650261,1513096,-402509591,-1024065018,-162958328,1098122434,7472839,-4713932,-1070378753,-58668208,-2147125806,2130712614,1646218,-167649304,544475330,-645211341,-1265661394,-425982,179309172,1648374,49004802,430096435,31451392,-1024065360,856388612,786008795,46245770,-58704917,-2145881014,326389500,-1024009421,-2147257341,-896917297,841015680,-1979419399,-2145981499,292901628,1574646,-2146798208,-2147477706,1576576,1975519872,-229366,-58718092,-385649588,-2098659091,22603777,1947190006,432308278,1946993398,180650030,1946731254,180650022,1946469110,23116574,1953037440,1778155528,12259701,-1993410048,771839006,22417036,-385792791,317194407,79885825,-443939724,-1024003605,-391613437,97321279,-402575127,-1024065282,-167218172,57936066,-352249623,-337080194,-661940224,-773598901,146994915,-1959917708,-352232825,79885874,-1959917708,-352233337,63108646,-2010246796]},{"sector":2,"length":512,"data":[771840302,22448011,22717230,771808489,771840418,22316939,22717230,-352269079,-990474190,-166431360,67115014,-1159134348,403603456,12059648,-2146899067,-83879898,1350894008,551952560,1476446440,-1561782835,771796992,22625920,776565760,22617738,-13448194,1497270318,786682113,22329227,976111182,773485572,1962949760,12052724,-1590765429,-790101670,1019448064,-350718944,1021587987,772633600,22329131,1421280046,76164609,771797736,22560384,-96700932,551952560,-1207935768,365793538,-158321173,443877570,-990510925,-166496896,134223878,645924724,-336134120,421431301,-346504448,548469258,1323835622,-100275456,551952560,-100654872,1583292167,1482381658,-434065201,1042464,4800128,-1610124281,-658898843,784592387,22560384,-100043268,-1342099736,-77273426,1048587971,1979449688,485030409,-424824831,1355021156,-1959898797,-469672418,-64728991,1642463796,1544457006,1274995201,-430378379,1482381665,-49725,-1946541196,-1962927050,994461438,1912635958,-2143909116,439761664,1476687104,-1979750679,473336069,-2144419072,-67020738,1625559412,-1973295981,-427815712,-421493151,-389835935,-386203769,1625555115,1979596027,243333642,1528823959,1023359209,-99977734,9899648,719936272,125183,-1963306813,-2147477722,-992972572,-992951088,-1751071536,973546496,-164203296,1073780486,243281781,-1337982825,-1340021216,2418925,9897718,-1978305152,1632452]},{"sector":3,"length":512,"pattern":0,"data":[9897718,-2146863744,-134179034,9905672,9905792,-1006938049,62148944,-1759084294,-397390080,-430440409,12188512,-1761151456,242561024,-855705630,243327605,-343932777,116822024,1965031575,1482291949,-919383613,44590308,-1017513248,567095476,171827334,1023767043,225837844,783949582,-855002103,-840682975,109979169,1236533292,236855757,48806431,-853210696,4241441,1048828046,1962934400,515439124,8430336,-1560274269,113704988,4063362,113716987,340,1443793966,113651201,-1207959207,-661721088,788528800,520181922,772330938,22560384,776828412,22808263,-953286450,-2113839610,-1532940800,109522432,-1557266260,-1590820700,-2027028314,771796486,-1107253597,-2126118573,1929467134,1015033368,772175147,-349633338,1015033581,786920745,-349502266,157858529,60033,-355269455,-1070452300,1850286541,1920102243,544498533,542330692,1936876918,175009641,9229]},{"sector":4,"length":512,"pattern":0,"data":[25451085,6,32,1,-1473380352,2198,30,1]},{"sector":5,"length":512,"data":[119472128,64363291,68432166,68432514,68432674,68432935,68433192,68433429,68433802,68433953,68434311,68432005,68483113,68443949,64388872,65208329,60899681,60906106,60900709,60904050,60904564,60905849,60904821,60901737,60903279,60903536,101974529,65219108,64358925,82311940,60903793,60904307,60900452,60900966,60901223,60901480,60901994,60902251,60902508,60902765,65217943,65248486,82312450,65224252,60905335,60905592,60900195,60905078,60899938,60903022,65224492,65220155,65220410,65219389,82312705,99119658,80738056,100737056,78954304,94830849,94831106,94831363,94831620,94831877,94832134,94832391,94832648,94832905,94830592,77127456,74903312,85210880,85211137,85211394,85208323,85210116,85210373,85210630,85207815,85209352,85209609,85209866,85209099,83439116,106954752,436667395,591407899,1549622110,24052072,25166201,1869178209,1627398261,1970235749,1431257465,-1937210624,6198931,-1802794620,-1718708095,442368154,437983998,65535,0,4718592,261,454756127,556860374,1077019629,590545901,607388653,624231405,1580598253,641139693,708314093,674825197,691012589,1596785645,725418989,2131231725,590806,1366361059,1467417505,1164247969,1383203745,1416889249,1501103009,1433732001,1231618977,1332675489]},{"sector":6,"length":512,"data":[1349518241,2069562273,2103247843,168625123,-83622954,1096877287,1400046497,1147405217,1181090721,1197933473,1214776225,1248461729,1265304481,1282147233,976946081,572982243,2120221667,-50199581,2086405351,1517945827,1484260257,1130562465,1450574753,1113719713,1315832737,1298989985,1009517473,1043203043,1060045795,-33487901,1915356391,-150469144,538969295,-1086323199,16843956,33686951,50529703,67372455,84215207,101057959,117900711,134743463,151586215,1447,-551549529,-284162920,922748022,939590932,956433684,755172628,872678676,889521428,906364180,721880340,822609172,839451924,856294676,806028564,772539668,1273,134678112,84213513,33685254,2013200387,1946125567,1979675903,-35073,539897886,589439250,639968279,421015858,337580816,756100886,-50648043,1381061456,102651734,-1912586056,76081368,-12787574,-555154571,-2116515069,-2147450909,58610939,-788276503,-152841757,930447556,-1841397458,1946263041,386332206,661914624,1509110,1344304136,1174492094,22740609,976098419,-2114685660,-2130619154,1476483782,-385578450,777519875,26359492,-1979151578,387353281,1627334144,56551426,1946731254,-670853109,-1415083474,47966466,1946469110,-379573243,-13499693,1946403574,1087340547,-511653238,1962488384,-372930046,619184827,79885827,-980811148,-402477335,-1024064745,-350915580,51570746,1946731254,1992589318,-167602967,661980354]},{"sector":7,"length":512,"data":[1946403574,-372930046,-253230457,79885826,334187636,-167580696,108267714,-378092416,-1024064915,-2143849468,58000380,-2147327767,74778620,1005264560,1964702848,-350507004,469532722,498074741,-58709525,-1341885141,1008790300,-1341885139,-384242913,-13499701,1946403574,1087340547,-511653238,1962488384,-372930046,-990510565,-163678848,1064568002,-1560248159,480444442,1896269312,-1058504704,857459970,33155520,1971373302,79885852,243277172,-402128872,116785809,1963458584,41806329,1954596086,405676038,-1976046848,403055328,137327872,838866982,-165418028,477397188,109494322,-1073086439,773852788,-466485225,-167662871,74744004,49009954,378064906,820576279,34007042,1946731254,79885897,113721716,305397874,1358954424,-883900365,1976761472,405176325,512392960,-538443751,146994689,-617406348,-1976641142,-2147290481,175439865,653658800,-1056833511,-1070398741,-385869406,11534815,1946469110,-1965346037,-1484116263,1005257471,1951071360,1325170712,-617409676,1946403574,550469635,-511653238,1962488352,-339375612,1392279574,116789621,1971322904,389447690,243302400,176160792,-2146798144,141885436,1951202432,15591683,-402554135,-1024065192,-2143914993,-1024058940,-2144439284,-1024062780,-2144963576,-1024062780,-1155632124,-58719842,-2146929560,292907516,-100663109,-1843492562,244067841,1156120980,11004161,-167701784,74712258,-236198518,1946403574,20965544,820577741]},{"sector":8,"length":512,"data":[16705537,1946469110,146994696,417923956,-1870730495,-1744770072,-783558517,-152841757,125044930,-1870165202,-164435199,125043906,-1903719634,-165221631,292815810,-1758558162,-2020921855,-1557266036,-588709480,-1750979072,-2020921855,-1557266038,-857144936,-1875711232,1971373302,403109396,57934848,-2147435799,67115022,-343605064,405176328,28900096,548425861,-924311322,365778944,-1342135575,1048587776,1946157463,512372297,-872545897,-2010185934,-788424898,-1215615261,1179517280,1946434094,1015033370,-386632448,-661978953,26779950,-1962880792,1948269763,840166168,1946172644,-1221906931,53346656,771843255,-1293417334,1048587776,1979449750,548469308,1558716646,-1862092800,904598989,146994832,11737717,1971373302,403109395,125044736,1582720,-2012877833,-1023403746,-99947688,551952560,-352301336,548469253,552083686,520616448,1499094623,-1328588709,-400497120,1048576015,1946615881,6660103,-301737798,1048587971,1979449750,787020297,-424759295,784595812,26623616,-100043268,-1342104344,-77273427,1364414659,-1675719890,1348592641,37026852,-1959894554,-503211506,-227193858,1499588184,1036212315,594870271,473336826,1191086848,-2110375098,-1962642944,989888566,1962940982,1726568452,-1996125697,-1023402954,-1774288850,292879361,-460103452,216042081,-2040404352,-1822300448,-7870269,11266298,1023107300,-99977730,9899648,954817312,1979333887,243333642,1527775383,-385930519]},{"sector":9,"length":512,"pattern":0,"data":[1354956801,388401914,1894023168,-992951088,-992951088,604018592,1960851975,-1761151434,796213248,9899648,-434065344,-387076064,116785188,1971323031,-389772779,116785176,1971323031,-1759084535,638121984,645922967,1480523927,1364247547,-2131098700,1325438758,2615376,-77535656,-165674823,805345030,-136180107,-495596290,9899648,-1878463616,9897718,-85101280,1371756633,1692715315,-85982552,817152857,-528080435,1912801853,51657989,521014646,-1274450758,841075977,639749604,2885262,567101876,-1172369890,163054374,-1205744347,-661782464,8404611,-99322624,-1560273224,446890112,1876736,8521415,788201534,26347207,-1943142400,771855374,26674886,-268388352,-23013234,-1767756033,330964737,1048587785,1979449750,113716813,13500826,-1677277394,771785217,771794081,11273863,10789678,10920238,-1375303890,-1499255296,22265344,1526628678,773354241,1965767808,80096774,787344169,1965636736,80096999,-1159599317,-360642138,78708736,833940179,567132210,1868787273,1667592818,1329864820,1702240339,1869181810,604834414]}]],[[{"sector":1,"length":512,"pattern":0,"data":[24926797,6,32,1,1403060224,2190,30,1]},{"sector":2,"length":512,"data":[118947840,63839003,65347889,65348146,65344819,65348660,65348917,65349174,65351479,65349688,65349945,65355056,65355745,101450241,63864584,64684041,60379505,60381047,60376421,60379762,60380276,60381818,60380533,60377449,60378991,60379248,67279489,64694827,63834637,81787652,60375393,60380019,60376164,60376678,60376935,60377192,60377706,60377963,60378220,67279252,67276420,64708131,81788162,64699964,60381561,60381304,60375907,60380790,60375650,60378734,60378477,64699180,64698926,64708397,81788417,98595370,80213768,100212768,78430016,94306561,94306818,94307075,94307332,94307589,94307846,94308103,94308360,94308617,94306304,76603168,74379024,84686592,84686849,84687106,84684035,84685828,84686085,84686342,84683527,84685064,84685321,84685578,84684811,82914828,106430464,723196419,1549622080,23855460,24838515,1869178209,2114933,1869178209,-1610604427,-1549622910,-2063587440,-1751806582,220659808,-62112,33536,0,4718592,261,454756119,556860366,1077019621,590545893,607388645,624231397,1580598245,641139685,708314085,674825189,691012581,1596785637,725418981,2131231717,590798,1366361051,1467417497,1164247961,1383203737,1416889241,1501103001,1433731993,1231618969,1332675481,1349518233,2069562265]},{"sector":3,"length":512,"data":[2103247835,168625115,-83622962,1096877279,1400046489,1147405209,1181090713,1197933465,1214776217,1248461721,1265304473,1282147225,976946073,572982235,2120221659,-50199589,2086405343,1517945819,1484260249,1130562457,1450574745,1113719705,1315832729,1298989977,1009517465,1043203035,1060045787,-33487909,1915356383,-150469152,538969287,-1086323207,16843948,33686943,50529695,67372447,84215199,101057951,117900703,134743455,151586207,1439,-551549537,-284162928,922748014,939590924,956433676,755172620,872678668,889521420,906364172,721880332,822609164,839451916,856294668,806028556,772539660,1265,134678104,84213513,33685254,2013200387,1946125567,1979675903,-35073,539897886,589439250,639968279,421015858,337580816,756100886,-50648043,1381061456,102651734,-1912586056,76081368,-12787574,-555154571,-2116515069,-2147450909,58610939,-788276503,-152841757,930447556,-1975615186,1946260993,386332206,661914624,1509110,1344304136,1174492094,22609537,976098419,-2114685660,-2130619154,1476483270,-385578450,777519875,25835204,-1979151578,387353281,1627334144,56551426,1946731254,-670853109,-1549301202,47966466,1946469110,-379573243,-13499693,1946403574,1087340547,-511653238,1962488384,-372930046,619184827,79885827,-980811148,-402477335,-1024064745,-350915580,51570746,1946731254,1992589318,-167602967,661980354,1946403574,-372930046]},{"sector":4,"length":512,"data":[-253230457,79885826,334187636,-167580696,108267714,-378092416,-1024064915,-2143849468,58000380,-2147327767,74778620,1005264560,1964702848,-350507004,469532722,498074741,-58709525,-1341885141,1008790300,-1341885139,-384242913,-13499701,1946403574,1087340547,-511653238,1962488384,-372930046,-990510565,-163678848,1064568002,-1560248159,480444442,1896269312,-1058504704,857459970,33155520,1971373302,79885852,243277172,-402128872,116785809,1963458584,41806329,1954596086,405676038,-1976046848,403055328,137327872,838866982,-165418028,477397188,109494322,-1073086439,773852788,-466485225,-167662871,74744004,49009954,378064906,820576279,34007042,1946731254,79885897,113721716,305397874,1358954424,-883900365,1976761472,405176325,512392960,-538443751,146994689,-617406348,-1976641142,-2147292529,175439865,653658800,-1056833511,-1070398741,-385869406,11534815,1946469110,-1965346037,-1484116263,1005257463,1951071360,1325170712,-617409676,1946403574,550469635,-511653238,1962488352,-339375612,1392279574,116789621,1971322904,389447690,243302400,176160792,-2146798144,141885436,1951202432,15591683,-402554135,-1024065192,-2143914993,-1024058940,-2144439284,-1024062780,-2144963576,-1024062780,-1155632124,-58719850,-2146929560,292907516,-100663109,-1977710290,244067841,1156120972,11004161,-167701784,74712258,-236198518,1946403574,20965544,820577741,16705537,1946469110]},{"sector":5,"length":512,"data":[146994696,417923956,-1870730495,-1744770072,-783558517,-152841757,125044930,-2004382930,-164435199,125043906,-2037937362,-165221631,292815810,-1892775890,-2020921855,-1557266044,-588709488,-1885196800,-2020921855,-1557266046,-857144944,-1875711232,1971373302,403109396,57934848,-2147435799,67115022,-343605064,405176328,28900096,548425861,-924311322,365778944,-1342135575,1048587776,1946157455,512372297,-872545905,-2010185934,-788426946,-1215615261,1179517276,1946434094,1015033370,-386632448,-661978953,26255662,-1962880792,1948269763,840166168,1946172644,-1221906931,53346652,771842231,-1293417334,1048587776,1979449742,548469308,1558716646,-1862092800,904598989,146994832,11737717,1971373302,403109395,125044736,1582720,-2012877833,-1023403746,-99947688,551952560,-352301336,548469253,552083686,520616448,1499094623,-1328588709,-400497120,1048576015,1946615881,6660103,-301737798,1048587971,1979449742,787020297,-424759295,784595812,26099328,-100043268,-1342104344,-77273427,1364414659,-1809937618,1348592641,37026852,-1959894554,-503213554,-227193858,1499588184,1036212315,594870271,473336826,1191086848,-2110375098,-1962642944,989888566,1962940982,1726568452,-1996125697,-1023402954,-1908506578,292879361,-460103452,216042081,-2040404352,-1822300448,-7870269,11266298,1023107300,-99977730,9899648,954817312,1979333887,243333642,1527775383,-385930519,1354956801,388401914]},{"sector":6,"length":512,"pattern":0,"data":[1894023168,-992951088,-992951088,604018592,1960851975,-1761151434,796213248,9899648,-434065344,-387076064,116785188,1971323031,-389772779,116785176,1971323031,-1759084535,638121984,645922967,1480523927,1364247547,-2131098700,1325438758,2615376,-77535656,-165674823,805345030,-136180107,-495596290,9899648,-1878463616,9897718,-85101280,1371756633,1692715315,-85982552,817152857,-528080435,1912801853,51657989,521014646,-1274452806,841075977,639749604,2885262,567101876,-1172369890,163054366,-1205744347,-661782464,8404611,-99322624,-1560273224,446890112,1876736,8521415,788201534,25822919,-1943142400,771853326,26150598,-268388352,-23013234,-1901973761,196747009,1048587785,1979449742,113716813,13500818,-1811495122,771785217,771794081,11273863,10789678,10920238,-1375303890,-1499255296,22265344,1493074246,773354241,1965767808,80096774,787344169,1965636736,80096999,-1159599317,-360642146,78708736,833940179,567132210,1868787273,1667592818,1329864820,1702240339,1869181810,604834414]},{"sector":7,"length":512,"pattern":0,"data":[21781069,6,32,1,-1475346432,2142,30,1]},{"sector":8,"length":512,"data":[115802112,60693275,62202161,62202418,62233651,62202932,62203189,62203446,62205751,62203960,62204217,62209328,62209831,62217869,60718856,61538313,57233777,57235319,57230693,57234034,57234548,57235833,57234805,57231721,57233263,57233520,61571722,61549099,60688909,78641924,57229665,57234291,57230436,57230950,57231207,57231464,57231978,57232235,57232492,61554837,61547397,61543831,78642434,61554236,57236090,57235576,57230179,57235062,57229922,57233006,57232749,61553452,61553198,61562669,78642689,95449642,77068040,97067040,75284288,91160833,91161090,91161347,91161604,91161861,91162118,91162375,91162632,91162889,91160576,73457440,71233296,81540864,81541121,81541378,81538307,81540100,81540357,81540614,81537799,81539336,81539593,81539850,81539083,79769100,103284736,1529551642,23645,0,4718592,261,454756071,556860318,1077019573,590545845,607388597,624231349,1580598197,641139637,708314037,674825141,691012533,1596785589,725418933,2131231669,590750,1366361003,1467417449,1164247913,1383203689,1416889193,1501102953,1433731945,1231618921,1332675433,1349518185,2069562217,2103247787,168625067,-83623010,1096877231,1400046441,1147405161,1181090665,1197933417,1214776169,1248461673,1265304425,1282147177]},{"sector":9,"length":512,"data":[976946025,572982187,2120221611,-50199637,2086405295,1517945771,1484260201,1130562409,1450574697,1113719657,1315832681,1298989929,1009517417,1043202987,1060045739,-33487957,1915356335,-150469200,538969239,-1086323255,16843900,33686895,50529647,67372399,84215151,101057903,117900655,134743407,151586159,1391,-551549585,-284162976,922747966,939590876,956433628,755172572,872678620,889521372,906364124,721880284,822609116,839451868,856294620,806028508,772539612,1217,134678056,84213513,33685254,2013200387,1946125567,1979675903,-35073,539897886,589439250,639968279,421015858,337580816,756100886,-50648043,1381061456,102651734,-1912586056,76081368,-12787574,-555154571,-2116515069,-2147450909,58610939,-788276503,-152841757,930447556,1514045742,1946248705,386332206,661914624,1509110,1344304136,1174492094,22544001,976098419,-2114685660,-2130619154,1476483014,-385578450,777519875,22689476,-1979151578,387353281,1627334144,56551426,1946731254,-670853109,1940359726,47966466,1946469110,-379573243,-13499693,1946403574,1087340547,-511653238,1962488384,-372930046,619184827,79885827,-980811148,-402477335,-1024064745,-350915580,51570746,1946731254,1992589318,-167602967,661980354,1946403574,-372930046,-253230457,79885826,334187636,-167580696,108267714,-378092416,-1024064915,-2143849468,58000380,-2147327767,74778620,1005264560]}],[{"sector":1,"length":512,"data":[1964702848,-350507004,469532722,498074741,-58709525,-1341885141,1008790300,-1341885139,-384242913,-13499701,1946403574,1087340547,-511653238,1962488384,-372930046,-990510565,-163678848,1064568002,-1560248159,480444442,1896269312,-1058504704,857459970,33155520,1971373302,79885852,243277172,-402128872,116785809,1963458584,41806329,1954596086,405676038,-1976046848,403055328,137327872,838866982,-165418028,477397188,109494322,-1073086439,773852788,-466485225,-167662871,74744004,49009954,378064906,820576279,34007042,1946731254,79885897,113721716,305397874,1358954424,-883900365,1976761472,405176325,512392960,-538443751,146994689,-617406348,-1976641142,-2147304817,175439865,653658800,-1056833511,-1070398741,-385869406,11534815,1946469110,-1965346037,-1484116263,1005257415,1951071360,1325170712,-617409676,1946403574,550469635,-511653238,1962488352,-339375612,1392279574,116789621,1971322904,389447690,243302400,176160792,-2146798144,141885436,1951202432,15591683,-402554135,-1024065192,-2143914993,-1024058940,-2144439284,-1024062780,-2144963576,-1024062780,-1155632124,-58719898,-2146929560,292907516,-100663109,1511950638,244067841,1156120924,11004161,-167701784,74712258,-236198518,1946403574,20965544,820577741,16705537,1946469110,146994696,417923956,-1870730495,-1744770072,-783558517,-152841757,125044930,1619495726,-164435199,125043906,1585941294,-165221631]},{"sector":2,"length":512,"data":[292815810,1596885038,-2020921855,-1557266084,-588709536,1604464128,-2020921855,-1557266086,-857144992,-1875711232,1971373302,403109396,57934848,-2147435799,67115022,-343605064,405176328,28900096,548425861,-924311322,365778944,-1342135575,1048587776,1946157407,512372297,-872545953,-2010185934,-788439234,-1215615261,1179517274,1946434094,1015033370,-386632448,-661978953,23109934,-1962880792,1948269763,840166168,1946172644,-1221906931,53346650,771840695,-1293417334,1048587776,1979449694,548469308,1558716646,-1862092800,904598989,146994832,11737717,1971373302,403109395,125044736,1582720,-2012877833,-1023403746,-99947688,551952560,-352301336,548469253,552083686,520616448,1499094623,-1328588709,-400497120,1048576015,1946615881,6660103,-301737798,1048587971,1979449694,787020297,-424759295,784595812,22953600,-100043268,-1342104344,-77273427,1364414659,1679723310,1348592641,37026852,-1959894554,-503225842,-227193858,1499588184,1036212315,594870271,473336826,1191086848,-2110375098,-1962642944,989888566,1962940982,1726568452,-1996125697,-1023402954,1581154350,292879361,-460103452,216042081,-2040404352,-1822300448,-7870269,11266298,1023107300,-99977730,9899648,954817312,1979333887,243333642,1527775383,-385930519,1354956801,388401914,1894023168,-992951088,-992951088,604018592,1960851975,-1761151434,796213248,9899648,-434065344,-387076064,116785188,1971323031]},{"sector":3,"length":512,"pattern":0,"data":[-389772779,116785176,1971323031,-1759084535,638121984,645922967,1480523927,1364247547,-2131098700,1325438758,2615376,-77535656,-165674823,805345030,-136180107,-495596290,9899648,-1878463616,9897718,-85101280,1371756633,1692715315,-85982552,817152857,-528080435,1912801853,51657989,521014646,-1274465094,841075977,639749604,2885262,567101876,-1172369890,163054318,-1205744347,-661782464,8404611,-99322624,-1560273224,446890112,1876736,8521415,788201534,22677191,-1943142400,771841038,23004870,-268388352,-23013234,1587687167,-608559359,1048587784,1979449694,113716813,13500770,1678165806,771785217,771794081,11273863,10789678,10920238,-1375303890,-1499255296,22265344,1476297030,773354241,1965767808,80096774,787344169,1965636736,80096999,-1159599317,-360642194,78708736,833940179,567132210,1868787273,1667592818,1329864820,1702240339,1869181810,604834414]},{"sector":4,"length":512,"pattern":0,"data":[27744845,6,32,1,-789512192,2233,30,1]},{"sector":5,"length":512,"data":[121765888,66657051,68201777,68200498,68166451,68166708,68166965,68169526,68167223,68168248,68167737,68167984,68181805,68168509,66682632,67502089,63197553,63199095,63194469,63197810,63198324,63199609,63198581,63195497,63197039,63197296,104268289,104268803,66652685,84605700,63193441,63198067,63194212,63194726,63194983,63195240,63195754,63196011,63196268,70100388,67516987,70090887,84606210,67518012,63199866,63199352,63193955,63198838,63193698,63196782,63196525,67518252,67510574,67510823,84606465,101413470,83031816,103030816,81248064,97124609,97124866,97125123,97125380,97125637,97125894,97126151,97126408,97126665,97124352,79421216,77197072,87504640,87504897,87505154,87502083,87503876,87504133,87504390,87501575,87503112,87503369,87503626,87502859,85732876,109248512,723196419,1549622080,24379756,25035134,26018181,27132311,1869178209,2114933,1869178209,1329690997,1700855893,544567145,-1585274880,663790498,-1953922048,-1902607980,-2063557991,-1751806582,-2004680608,1586926476,-31840512,-15066342,1578852607,-15000293,255,0,83904512,1107296257,-115664121,270610691,272642564,270742276,270808068,270873860,274609668,270939908,271202308,271071492,271134724,274672900,271269124,-109115388,100665603]},{"sector":6,"length":512,"data":[-1001295612,-1000900861,-1002085117,-1001229821,-1001098237,-1000769277,-1001032445,-1001821949,-1001427197,-1001361405,108747523,108879108,-116781820,184222723,-1002348283,-1001164029,-1002150909,-1002019325,-1001953533,-1001887741,-1001756157,-1001690365,-1001624573,104479491,102901508,108945412,184353284,108813317,-1000703484,-1000835069,-1002216701,-1000966653,-1002282493,-1001492989,-1001558781,104606723,104738308,104804100,184418564,192031237,-218691578,606085124,-675332090,-905903868,-905838075,-905772283,-905706491,-905640699,-905574907,-905509115,-905443323,-905377531,-905969659,-1143005179,-1712386044,926351364,926417157,926482949,925696773,926155781,926221573,926287365,925566725,925960197,926025989,926091781,925895429,472779781,-2097151995,151521030,100992255,50463231,-8913152,-9175164,-9044108,520093558,304098864,388178465,841360676,270080049,370417427,355275055,1358756652,1448235347,-1207558569,-661782464,-1979414296,1979661536,64940291,-478029685,-75497345,-385647020,-472841254,-990452783,775386496,28655233,779354561,1509110,-165186556,134223622,-1102045068,-2126118573,1929468158,607792660,-293473163,-964624044,777519448,65602698,-1003595773,637646134,-1047918453,1513098,39911206,-167551256,192153794,785908632,47097738,-167584791,91489474,-739680212,-151047678,57934786,-1975464064,1088520394,41220402,-1142307446,52750338,1946469110]},{"sector":7,"length":512,"data":[-372930046,401081006,79885827,988484980,-167570712,108267714,-378092416,-1024064876,-165186300,41157570,-2014722678,49342466,1946469110,-401347764,-1024064789,-2147060728,1844016836,79885826,-58706060,-385649405,-58719648,-1341885177,-2143556834,74783484,854268848,1964768384,-350375932,737968169,481297525,758915307,531629173,-873916181,-151047678,57934786,-1975464064,1088520394,41220402,468305290,-2134575614,-1024049547,-1589677052,446890112,1876736,7407302,46196864,-1070392371,-167642647,477462724,1946469110,403603485,-1847064576,403109378,-109770752,-167608855,108298436,1584672,-527812629,1574434,638070645,-734920680,-990501909,840725632,419858112,1958742528,388898830,-370920960,-990510678,570717312,167963605,387352784,36759808,-167639320,1232341186,1946469110,1913046849,-1206766592,860946431,-2134159168,91607804,1582720,421431935,31451136,1946731254,-1965346016,-1886769447,-109051115,-1341491969,421983754,-339672576,-1564462334,-538378215,-167727103,192152770,-645211341,581405230,-2143556861,410274556,1951333504,-153406701,57934786,-1977561216,551649482,74774834,384550282,1968372864,403109393,175472640,1521280,403603584,-1073053696,-58717579,-2146929409,57953532,-385815063,1491599746,264435201,-998230412,214103577,-998232460,146994698,-998234508,79885834,-1044701580,1761378305,-58718092,-1156483735,788135936,28647049]},{"sector":8,"length":512,"data":[-1223783378,21293313,-402610199,-1024065262,-1979419644,-151917595,-1468791870,-855556120,19982597,-167706904,141821122,1946731254,18409731,-393183509,-1952972565,-472822824,-1024007215,772240392,28018571,-1024052501,772240388,27887499,-1024055573,772895747,28978824,-1484289234,-1146933759,14477569,29008430,-1517843666,-1146933759,13428993,-158321941,343244996,1574646,-385649660,243269818,-1207697384,149652736,1582720,-2063484677,-434065328,13166624,-384447144,11534498,-1170309074,1232338945,-1172403666,852229633,1049112319,-472841798,1555532590,776359425,443810874,3964974,-1209469835,785943296,-402539615,-1014300464,410263612,-466480149,225706044,1555508014,-1224528383,-1976696476,11724804,-1187086290,1014365185,-434065158,6088736,-846134600,-1875514603,1963508470,-167726310,326467780,1574646,-2146995192,-150988762,512230891,1489174553,-1325790485,-400497120,99287118,-434065158,2156576,1595869178,1532582494,548458328,266871014,1228832768,125044480,-1174379104,-1007811624,-1187086290,158727169,19851514,1692839600,-2144418821,-66995906,-386266763,-1380974308,-1006934810,777081680,29302411,609247716,-436062980,244002401,-18742851,1492284747,1532584422,-12729512,-98339585,1848971,1179057803,8533563,915080306,909836416,74776602,-10032808,914949513,784531484,28917376,-468617988,1642369888,-2146639734,-528064026,-1013751322,-83916824]},{"sector":9,"length":512,"pattern":0,"data":[-469718040,-29557920,-2131096971,536909582,-13047461,175503932,-1760657158,-379908096,32046890,-95370496,1517194,-797907840,-792407868,-1597714236,119799959,913629242,9897718,-2144373440,1073780494,551952560,619244976,-1761151488,360022016,417907850,-1761151488,158695424,9905792,-1759115016,-1759084544,-78102784,-1269739325,645986819,1347354775,1476405224,-1174707994,116793344,1966080151,-17309170,-2132642356,-2147444978,-158332693,536909574,1509617013,860996440,-1469782839,1509613570,-852446013,1038124577,91357962,1979913277,-1172369907,162793871,-466476595,-1910103603,-1275057146,505531721,1236934414,621393923,1085809101,-2082959872,32830,-1191570315,-2136801250,1745664,-956293981,1040220678,-953222400,111878,244067840,-970063433,113158,-1896873800,-89896,28942894,154581535,-1187086290,1299577857,-1123629266,771804673,29296327,-1590820734,-2027028316,771795974,771794083,771794593,11404935,10920750,1174492094,22609537,-2144462733,108342076,688178734,-2144408085,-411752132,721733166,-910499349,15368457,-754667264,842118378,1226952128,1919902574,1952671090,1397703712,1919252000,1852795251,2362634]}]],[[{"sector":1,"length":512,"pattern":0,"data":[21387853,6,32,1,9568256,2136,30,1]},{"sector":2,"length":512,"data":[115408896,60300059,61808945,61809202,61840435,61809716,61809973,61824566,61810231,61811256,61810745,61810992,61824813,61811517,60325640,61145097,56840561,56842103,56837477,56840818,56841332,56842617,56841589,56838505,56840047,56840304,61176667,61177181,60295693,78248708,56836449,56841075,56837220,56837734,56837991,56838248,56838762,56839019,56839276,61159995,61161511,61177379,78249218,61176924,56842874,56842360,56836963,56841846,56836706,56839790,56839533,61160492,61161006,61161263,78249473,95056426,76674824,96673824,74891072,90767617,90767874,90768131,90768388,90768645,90768902,90769159,90769416,90769673,90767360,73064224,70840080,81147648,81147905,81148162,81145091,81146884,81147141,81147398,81144583,81146120,81146377,81146634,81145867,79375884,102891520,0,0,17104968,115408896,60300059,61808945,61816882,61809459,61809716,61809973,61824566,61810231,61811256,61810745,61810992,61824813,61811517,60325640,61145097,56840561,56842103,56837477,56840818,56841332,56842617,56841589,56838505,56840047,56840304,61176667,61177181,60295693,78248708,56836449,56841075,56837220,56837734,56837991,56838248,56838762,56839019,56839276,61159995]},{"sector":3,"length":512,"data":[61153831,61177440,78249218,61176924,56842874,56842360,56836963,56841846,56836706,56839790,56839533,61160492,61161006,61161263,78249473,95056426,76674824,96673824,74891072,90767617,90767874,90768131,90768388,90768645,90768902,90769159,90769416,90769673,90767360,73064224,70840080,81147648,81147905,81148162,81145091,81146884,81147141,81147398,81144583,81146120,81146377,81146634,81145867,79375884,102891520,-16185337,-16382716,197121,-2063632385,1962898431,1996453375,807337983,554836014,605496098,825370149,319822104,789976095,739585297,1397816571,1465274961,1085802014,-388461056,-527825784,58064700,-1962680599,2145616344,1425768448,-622263426,-773598973,-2134575389,-2127677579,1610699838,-164727807,67114758,116795252,1946681367,1404981280,-25082367,343081300,1965308462,1424916980,1422295297,-1976674303,50587908,918826584,-1960443564,-1967027704,637540118,-402497281,-1024064674,-1744079864,-1976641533,-385716825,-1024064805,738554884,47442272,-1024000206,-2147257341,-896909105,843112832,-1979550471,45869509,-167566104,41157826,-1360411254,51898370,1946469110,-398791915,-1024064750,-2147060728,-1796639036,79885826,-1024055435,-1979550717,42461637,-167579416,1282671810,-337112085,146994690,-998242700,40757622,1946469110,66879543,1625883509,133988354,514851957,-58704917,-1341885158]},{"sector":4,"length":512,"data":[-2144146661,74783740,703274416,1965816960,-350441468,1965898784,-350244860,46917912,-1024000206,-2147257341,-896909105,843112832,-1979550471,35383749,1971373302,79885886,-2136916108,1745664,-973071197,-2147454714,-855457560,-373279973,-990510599,-165907072,494142658,1576576,43116552,1574646,-369527544,-990510467,537293952,-352315346,585140791,1962940422,405145647,-338415104,-2134575581,-1070457740,1640070,242532362,1519136,-1427512270,-2134575615,-719190924,-804650261,1513096,-402509591,-1024065018,-162958328,1098122434,7472839,-4713932,-1070378753,-58668208,-2147125806,2130712614,1646218,-167649304,544475330,-645211341,-1265661394,-425982,179309172,1648374,49004802,430096435,31451392,-1024065360,856388612,786008795,46245770,-58704917,-2145881014,326389500,-1024009421,-2147257341,-896917297,841015680,-1979419399,-2145981499,292901628,1574646,-2146798208,-2147477706,1576576,1975519872,-229366,-58718092,-385649588,-2098659091,22603777,1947190006,432308278,1946993398,180650030,1946731254,180650022,1946469110,23116574,1953037440,1778155528,12259701,-1993410048,771839006,22417036,-385792791,317194407,79885825,-443939724,-1024003605,-391613437,97321279,-402575127,-1024065282,-167218172,57936066,-352249623,-337080194,-661940224,-773598901,146994915,-1959917708,-352232825,79885874,-1959917708,-352233337,63108646,-2010246796]},{"sector":5,"length":512,"data":[771840302,22448011,22717230,771808489,771840418,22316939,22717230,-352269079,-990474190,-166431360,67115014,-1159134348,403603456,12059648,-2146899067,-83879898,1350894008,551952560,1476446440,-1561782835,771796992,22625920,776565760,22617738,-13448194,1497270318,786682113,22329227,976111182,773485572,1962949760,12052724,-1590765429,-790101670,1019448064,-350718944,1021587987,772633600,22329131,1421280046,76164609,771797736,22560384,-96700932,551952560,-1207935768,365793538,-158321173,443877570,-990510925,-166496896,134223878,645924724,-336134120,421431301,-346504448,548469258,1323835622,-100275456,551952560,-100654872,1583292167,1482381658,-434065201,1042464,4800128,-1610124281,-658898843,784592387,22560384,-100043268,-1342099736,-77273426,1048587971,1979449688,485030409,-424824831,1355021156,-1959898797,-469672418,-64728991,1642463796,1544457006,1274995201,-430378379,1482381665,-49725,-1946541196,-1962927050,994461438,1912635958,-2143909116,439761664,1476687104,-1979750679,473336069,-2144419072,-67020738,1625559412,-1973295981,-427815712,-421493151,-389835935,-386203769,1625555115,1979596027,243333642,1528823959,1023359209,-99977734,9899648,719936272,125183,-1963306813,-2147477722,-992972572,-992951088,-1751071536,973546496,-164203296,1073780486,243281781,-1337982825,-1340021216,2418925,9897718,-1978305152,1632452]},{"sector":6,"length":512,"pattern":0,"data":[9897718,-2146863744,-134179034,9905672,9905792,-1006938049,62148944,-1759084294,-397390080,-430440409,12188512,-1761151456,242561024,-855705630,243327605,-343932777,116822024,1965031575,1482291949,-919383613,44590308,-1017513248,567095476,171827334,1023767043,225837844,783949582,-855002103,-840682975,109979169,1236533292,236855757,48806431,-853210696,4241441,1048828046,1962934400,515439124,8430336,-1560274269,113704988,4063362,113716987,340,1443793966,113651201,-1207959207,-661721088,788528800,520181922,772330938,22560384,776828412,22808263,-953286450,-2113839610,-1532940800,109522432,-1557266260,-1590820700,-2027028314,771796486,-1107253597,-2126118573,1929467134,1015033368,772175147,-349633338,1015033581,786920745,-349502266,157858529,60033,-355269455,-1070452300,1850286541,1920102243,544498533,542330692,1936876918,175009641,9229]},{"sector":7,"length":512,"pattern":0,"data":[12474957,458758,32,2621439,1819279488,3080605,30,25231361,26607663,43122735,43712559,46989359,59310127,59899951,47]},{"sector":8,"length":512,"data":[1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568]},{"sector":9,"length":512,"pattern":0,"data":[329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,538968076,538976288,538976288,538976288,538976288,538976288,65312,134217728,1061109504,1061109567,1061109567,0,0,0,0,0,0,0,0,0,0,0,1547321600,591544652,1076256292,1111575598,65280,134217728,0,0,0,0,0,0,0,0,0,0,0,65280,134217728]}],[{"sector":1,"length":512,"data":[0,0,0,0,0,977338368,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1363521024,1033523717,1509949440,1948269763,1946762246,-1022739454,-1705894130,61,-850591816,1294658337,1329868115,1095508051,541869378,1735357008,544039282,1936876886,544108393,842018353,858731552,892874544,-852446208,786466337,1023410339,91357962,1979913277,71154190,162799374,856039885,-1261743936,-1105081075,-1968439168,-470994232,-1998017497,-502958593,-1877087240,49906510,2088772466,494221825,-377272762,752821250,-387698112,317391233,2062073907,117321217,585826306,-390057072,118358381,-486537537,1011789036,-387549664,-512426173,301957548,-1442614528,521074402,-424016114,-853888000,1948193,567087540,544538428,-1090457922,196674996,-1096486144,-1447100178,768256,117351667,113704963,95421867,147072,-1166642176,-1705900633,61,1376069818,15770,309760,567085748,-1963011352,167773454,839939273,442349,196737283,-215961600,-2143097942,830,1354378100,1033523717,-1174405120,179568644,-1595399731,84839166,1959332352,434405,2033983500,1849429364,-1494624139,-24778752,-1174363927,330563745,-1763106355,441856,-2147453505,830,-1178664076]},{"sector":2,"length":512,"data":[768256,775727788,-119382668,212608,-1170705152,-919404451,567098548,1908018803,277765,-1933966475,-27989755,1052039307,1572479437,-851332096,7191073,567088820,594870076,567087284,-1097843221,196673721,1060940800,708579700,-169734796,-1275027014,1008848151,-2145356289,574,117312885,-1480982526,1033523717,-1174405120,-1705900811,61,-385942039,12123615,1394724172,1465274960,-1073019362,431229045,-1057087027,-527768526,-1573991170,-1574043612,-1574043532,3014824,771775782,95233536,640024622,785943041,16001,1165099776,-851179080,-149786079,1947336898,75151895,-1157783063,-1679227734,998909,-843446667,-40834812,118365966,650010804,19578625,-361618995,-2133035610,1962999676,1595869175,1532516958,-1261139261,-1977496295,-854674192,-853953503,1975663137,-1261008187,-350106354,1225395676,1919902574,1952671090,1397703712,1919252000,1852795251,604441101,1631783437,1953459822,1111575584,1629506629,1952796192,1802661751,1769104416,168650102,72876039,1631783437,1953459822,1111575584,1629506629,1112888096,1684362323,544370464,1230197569,1684360775,1769104416,168650102,75235335,1850280461,1768710518,1919164516,543520361,1667592307,1667851881,1869182049,118099310,218409984,1850279690,1768710518,1751326820,1667330657,1936876916,544106784,1970040694,1814062445,1818583649,218418944,1819235850,543518069,1700946284,824713324,1751326769,1667330657]},{"sector":3,"length":512,"pattern":0,"data":[1936876916,1313153068,542262612,544370534,1701736302,2113321,168625399,1701602628,1663067508,1701999221,1981838446,1836412015,1634476133,543974754,1311725864,2113321,168625450,1914728270,544042863,1914728041,544501615,1701996900,1919906915,118099321,218452480,1869566986,1851878688,1768300665,544433516,1852141679,461325,168625523,1970040662,1763730797,1919164526,543520361,1931830053,-1912600051,-1073369851,94650629,544434464,538976288,538976288,2105376,1935763488,544173600,1700946284,108]},{"sector":4,"length":512,"pattern":0,"data":[6838861,3735580,12845088,59441151,-1475147776,7351,30,159776769,157614080,275513344,328269824,332791808,411435008,410451968,408813568,407830528,406192128,405209088,403570688,401801216,400031744,398262272,396492800,393019392,390856704,388235264,385941504,382337024,380895232,379256832,377487360,375848960,374013952,372178944,370409472,368640000,366804992,365166592,363331584,361693184,358219776,356450304,354222080,352321536,441712640,440074240,438304768,436666368,434831360,433192960,430964736,429522944,427884544,423821312,422051840,420151296,417660928,414515200,413073408,457244672,71434240,481821432,760741888,766115840]},{"sector":5,"length":512,"data":[-1957363712,1443256300,1381061406,-986833328,-1006557410,-1189147073,1556021250,19906048,561293043,-1090517831,733877020,531034881,1286873461,157558408,-947142004,756227117,-706150396,364388096,-320319488,46433040,771803113,19349188,378662,1301030400,12066306,-1077899536,653983742,1979268480,896317498,-1993465395,773092894,343410316,1824005902,343259685,364388813,773967157,342957705,1929808942,622180372,-854298438,-954327263,2047172614,-955847916,1879400454,891140116,520495565,118420363,-1189859137,-1527578560,347610894,773967157,326835849,2097581102,622114835,-854362694,890746913,-1993465395,773046302,331482764,-1171974216,567088053,-852158024,512306721,-1943137428,-1206686202,549070105,522308883,646459828,244058468,-1070398110,1532742284,1579113305,-1946460409,818109925,1291845637,-163232689,-326412862,508954199,1347572051,516238878,1069809959,45686542,6078208,-218026050,-1189448538,482279428,19643923,1965008627,-1950184423,320613831,-352320467,364388269,-991408128,46433039,-1070358293,1532744243,1579113305,-1946460409,1438866917,45673611,445638656,704873120,-754404892,-2096198944,65874435,-28931647,1912801853,51657989,280496758,-2132258816,46433039,33965699,-1962651905,529204830,537659274,695561276,1342193080,-16359797,262662199,184861827,-16026432,1996424822,222750724,1996443115,74907398,-352302872,243778,5290064]},{"sector":6,"length":512,"data":[106859344,1860712447,113541913,393527307,1342178232,1342198968,-16359797,425191479,184992899,-16026176,1996424822,143058948,1996425707,74907398,-1962656024,1438866917,918088843,433842177,-863582634,-2033843970,-973013134,16707718,16402119,1988544256,-956301057,16741510,-129579264,1586167808,-1977644282,1008733191,-1960938132,134153822,126492555,1882988556,1586171765,-1962410234,201820703,1953774624,112650,244967504,-1962752893,134153822,126492555,-2037895124,20774638,54264946,28838518,2028490752,46433038,-16359797,-2145416441,91568703,-16359797,106859271,1065361291,-1956088788,939460190,-2095467800,-2037841212,1346240374,1027568640,141820036,-9009465,401276928,-17791350,-17791234,-259267542,268190406,-1996274015,-1946236282,529204830,1946173312,106859302,1065361291,-1961069524,134153822,-2037717525,-2030108944,-466944272,1120333963,1151406844,-1949504765,529204830,1962950528,9955587,-1962516853,742359071,179833460,-722972672,46433037,-16359797,106859271,1065361291,-1957268436,529204830,764938122,1183383600,-259618054,-259588354,-1947981058,-62732560,-96040165,1946158653,539994,1187452532,-33554182,-1963003762,721350790,-1997501468,283901026,-17791350,-17791234,-259267542,821838534,-16359797,106859271,1065361291,-1961593856,529204830,1949056896,702504,223471696,-1979530109,83816070,6005296,-1979656983,-16846714,721350790]},{"sector":7,"length":512,"data":[-957314076,-348980158,106859455,1586169855,-1977644282,1008733191,-960072336,33475718,-1098855957,1946222450,11135235,-19364153,1183538946,-628717064,2022084094,-528053761,-226062850,-494499330,-427389442,-420982530,46433047,-18053493,-18446711,-18446707,-662270640,-2037559042,-397345064,-998041941,-662271226,1954974206,-625049345,1215628286,-17908096,-1206029055,-1924136866,1358919814,-2095597592,-1073019708,28312693,-1070464277,-9271672,-9257344,-1206029056,-1924136872,1358919814,-2095606808,-1073019708,28312693,-1070464277,-9271672,-2080880897,16741566,1307116405,1925087487,1249116415,-17777024,-951880192,50256006,-129594530,-628717240,-259618050,1222912766,-19102071,-1979955571,-1912676218,1358882438,-2095633176,-2037579068,-1924071706,1358878854,-19364211,427092048,-385432445,149422291,-796489220,-761886210,1958874110,1678165611,-11383799,872337590,-1202696000,-1903558655,-315949330,1356911433,-2096142360,1491602116,-1073732340,-388821327,-19495287,-17922422,-2042895318,813104854,-1974419405,721350278,1340625124,79987467,477413387,-1996269919,-1946235258,-293172520,-2010118914,-1224801465,-1444348210,46433048,-19626298,-968299776,16701830,-19614069,16770689,-1996733814,-1963009914,721350278,-2037823260,-2037514530,-1924071720,1358878854,1342183352,-2095512856,-2030696764,1972436697,178186,189917264,-33373053,-1963010938,956231814,1929303174,-255950674,779485438]},{"sector":8,"length":512,"data":[-8995197,-1961397248,-1963013474,83816070,55019568,-20269313,-2095567896,2122515140,175374586,55064319,-2095571992,-1098906940,1946222284,1678165567,-2037691383,-2046034224,192282322,-1980122136,-1979789178,-77162,-77130,872337590,-2037755712,-466944308,112720,-17920374,-750129878,1239961824,180650766,1575324510,-326412861,-402639688,1187386785,1187409628,1187409634,1187446732,1586168014,-2145416442,58010687,-1962837015,126551646,-1981397367,-661919162,1033373578,57999427,2113977833,20769027,1946170429,3685645,1111314804,-379423744,45613380,1656246272,1996443648,345762026,-1996045181,1187440710,2122514636,175374568,1342180024,-2096478488,1586168516,-2145416442,57999423,-1962862615,529204830,1965834112,17492227,-16359797,-1193284857,-1202716670,-11534235,1390996086,113541908,-337099127,-362902720,-1960833152,1333848670,79175681,1756909568,1996443648,338684138,-1996045181,-1072961466,79204468,1840795648,1996443648,337111274,-1996045181,-1072961466,2045313908,-867776769,-9246462,-2132124021,1586176015,21987562,309280,7518288,-361300144,-2095847192,1183385284,1975520232,-867777017,-12130047,1342178488,1342207928,-387287297,-998042679,-398030586,57982987,-956355607,-385627066,1586233124,537886954,-2132124021,-1960836785,1333848670,1586176002,55541994,309280,8173648,-361300144,-2095870744,1183385284,-867776792,-17897209,1946176829,6438341]},{"sector":9,"length":512,"data":[686359413,6503935,1743324021,7159295,1187491956,-369098776,1586233036,-2145416442,1249116223,-1962516853,742359071,1586173557,-1962410234,201820703,-599357408,242512444,175402044,1342180024,-2096566552,1586168516,-1962410234,4161567,1586173044,-2145416442,1433676863,1342180024,-2096574744,2122318532,477495244,267208390,1357661837,1357661837,1342181560,-2095688984,1183450820,-867792660,-1731443062,155773008,184730755,-1207274048,-397410294,-998045549,-595689470,-971016850,-973014458,-352263098,106859350,529205247,537659274,-1670024132,30295750,1048617195,1962934365,1030154,140372048,-2147302269,1946274942,-864124922,-955812608,315974,1187448299,-2147481390,1970068606,-96025078,-465123839,-972494078,-956302778,-2130779066,1970199678,25225475,-1980307480,1451875910,-314128672,-330906059,-733573859,-330920624,-330920624,300017744,-1962490749,-1070869418,-2081536509,1183383762,-27883012,1178190475,-970361632,-970592954,-1960973242,1183440966,338737370,-1996488518,1183707718,1183666388,1183666412,-1595387668,113541905,-1948367221,817487958,47892,-763117309,-62486272,-989964663,-1977156514,1183318599,16312784,1859944064,-118946955,-96040448,-2133834240,2080493694,-797016058,-1206616525,-397410175,-998042492,-599341566,-834222482,-1002116352,1183513694,1200105168,-60898302,652494474,-1005435136,1183513694,1191192314,-60898270,652494474,-969783552,-1979650746,1183370310]}]],[[{"sector":1,"length":512,"data":[-330920468,-330920624,1095760,348776528,-2147040125,1946275454,8775939,15222471,-1207047424,-397410138,-998042596,-398000382,970081931,-344135610,1342222776,-2095839256,1187381956,2122326242,1282701794,1860337280,2122335860,108360412,55588607,922682603,-504888498,46433043,1342422712,-2096018968,1187381956,1183647725,1183666412,333992172,79987476,216811146,-498694112,1342223288,-2095860760,-1360330044,1860337280,-1506443,-529072130,870217471,-1202696000,-397410272,-443872760,-1957313699,2799852,1443980520,14173894,131745479,-599341312,1187381249,1187407332,1586174716,-1977644282,1008733191,-1960938141,134153822,126492555,1866211340,1586171765,-1962410234,201820703,1953315872,112650,103934032,-1962752893,134153822,126492555,3157400,1040074377,259260417,1946157629,112650,101574736,-16595837,-588710282,46433029,175489035,1342177720,-2096761112,1586168516,-1962410234,977240095,1586169204,-1961885946,134153822,954742783,46433041,1038239369,57999480,2113971689,16902403,1962940477,10938627,-873921666,736512,205328500,-385649408,255656070,-380341248,1187446994,-1979683102,522517574,620512904,-2013000453,1187511366,-1207958820,-1924136950,-11475386,-538385802,113541904,-1981397363,1586228294,-2145416442,57999423,-1962875159,529204830,1965834112,14280963,-16359797,-941626617,9888326,620512906,-2011165665,-1209271226,753026759,-62486015]},{"sector":2,"length":512,"data":[1074536228,1187507691,-1979557662,522517574,-538222580,-1327348025,-62486012,-2146689244,1187500523,-1979096862,522517574,-1007968244,-1058912569,-62485998,-1072947420,1187493355,-1977253662,522517574,-1477713908,1946164797,3161511,1010686580,1034646528,-562823072,1962962493,-13375229,1342179000,-2096837912,988349124,39337471,478122356,1962972733,-9901821,1946218557,19676569,1827210101,31473151,-789865868,1946402877,78658977,1961427829,157302271,2062091125,314588671,-2143452300,-343116763,106859439,1065361291,-385649408,1586168190,-2145416442,175385663,1342180024,-2096864536,1586168516,-1962410234,742359071,1586181492,-1977644282,-2011165689,1033430086,2104754277,1946185277,7290129,179858036,820531200,46433028,1183451371,-1998117636,1586232390,-1962410234,529204830,1962950528,18671875,-1962516853,742359071,179833460,15224832,46433028,-16359797,-2145416441,1165241407,-1962516853,-1744336353,-1996476371,121494086,1025733632,2121531400,1342180024,-2096901400,485163716,620512906,-351793945,-62485858,403498788,1183487467,217851132,-62486526,-16359797,106859271,1065361291,-385649408,1586167978,-2145416442,175385663,1342180024,-2096918808,1586168516,-1962410234,742359071,1586182772,-1977644282,808294407,-599357184,1946157373,146714,179855220,1625837568,46433027,1183453675,217851132,-1969296637,-81462202,-1946401144,134153822,-1962516853,4161567,1586185844]},{"sector":3,"length":512,"data":[-2145416442,175385663,1342180024,-2096944408,1586168516,-1962410234,742359071,1586177652,-1977644282,1008733191,-972065424,-352200634,-62485997,67959588,179876587,-118992896,46433026,15681222,-1996732790,1183575622,1183402238,-297366028,-297366192,1357904,276162640,-1593391997,1183384396,-1965519914,805633606,-2130491512,78701182,62391677,-1207702784,1183383556,-1961563166,1579931230,-327775262,-1964226817,172460036,-2082320641,2130764414,-698446874,-1998305654,1586170695,-632911146,1200107524,-698447091,81544842,256346160,-1980601624,1451875910,-662798112,186676224,-402033214,1183445288,-531199522,-959029621,-9432761,-402437066,-998043816,-1961432318,1204213342,922689552,1172833100,46433039,157550278,-754732724,1183579750,-532280354,1996429172,-562626592,-1974419405,1352194118,-385976577,-998046320,-443851254,-1957313699,1751276,-1962088216,529204830,537659274,511011900,-16359797,-1977644281,1008733191,-1961921168,134153822,126492555,1950097420,28838516,-857190400,46433025,-16359797,-1977644281,808294407,-62486272,2080375101,212229,28838526,-1461170176,46433025,-16359797,-2145416441,91503167,-16359797,106859279,529205247,1950171008,702474,25290832,-1962752893,134153822,126492555,1664884748,1586175605,-1962410234,201820703,1970224160,106859279,529205247,537659274,175402300,1342177720,-2097067288,1586168516,-1962410234,-1744336353,-1996476371]},{"sector":4,"length":512,"data":[20840006,1024422912,175374338,1342177720,-2097076504,-1729625404,234890497,199902857,-1207274048,-397410286,-998047473,-25755902,-2097094936,-1073020220,330828405,-118992896,46433024,1342177720,-386107649,-998047618,-273750012,-1981397367,1183574102,1317771772,-396456986,-636237821,-1173114184,-939327488,-2097097853,-612171287,-1950118400,-28931367,-2010724098,55877895,-1947449719,-62485800,1200107524,-329348349,83773066,390563888,-387156225,-998044256,112642,1241271947,1183441107,-394854404,-1192855809,860880897,1996443840,66251004,-1017256565,1475119957,1053044230,1183518989,65065220,108954616,638809089,-1207878269,460652544,378662,16758784,-2094657045,12058685,638088448,67015,117505976,1575324511,263875,-326413056,-1003616681,-1961806530,-783809466,653788128,-1207943805,57999615,117440696,1575324511,262339,-326413056,-488062925,73304842,-1207966767,-102235330,46433036,-1962071576,1438866917,-1070338933,-2096446232,1946158206,1513553670,-15602941,-402433994,-998044460,56271106,1342179333,-1962096664,1438866917,-1070338933,-351627032,105286154,192153400,-1962653953,1065354334,-1947306752,1065354334,-1962642432,855829443,1575324608,-326412861,-402649416,1183648361,297292018,-1243066368,79987458,1946157481,1161228,-10098608,-352140157,-230257917,-1017256565,-1192457387,988282908,-398014710,1187447824,-956301078,64582,117735040,1187457653]},{"sector":5,"length":512,"data":[-956301084,-1342118330,652500676,-968161338,-1001914810,-2144934818,1937066815,33310407,1560724992,1743454208,14960327,-431569152,1589952512,1065428708,712354389,317540038,284051142,1357661837,1357661837,1342181560,-2096331032,2122319556,175440110,33310407,1560724992,2122514432,594870524,14960327,-431569152,1589950464,130426596,-28916149,-463551417,1262452774,1187448181,-2097151492,1963064446,71731823,2092960664,81172,37557886,1024097280,1568538627,1946158909,-96024737,99287040,284837575,-396442624,621251366,1175191503,126428922,-1744550262,-1913895287,-1924076474,-1202656186,-397410288,-998044681,-314128890,-297351678,-230242560,1183645696,1183666412,280514796,-655863808,113541899,-335788405,-96024818,-1377107936,821708487,-1951995136,12803557,1162104653,622115066,2065089838,-1205744365,-986831593,-854343658,622704673,1880540462,-1205744365,-661721088,-115072,-1206618631,-986831595,-854298346,627882017,1981203758,-1205744364,-986831591,-854365162,332266273,0,-268373852,12776960,15335659,1342177280,860888732,-2133291328,2130997542,2056920920,1342177299,-1900006626,1896281816,1478459396,-990508939,1476818048,-863971861,-817609600,0,12776960,-1024065301,-369038592,0,1344183376,-661733325,74524288,-1709221761,5055,-1070391728,116840590,528483441,-167217832,108265924,-2133464232,1145307596,33325263,-1867250827,1347572687]},{"sector":6,"length":512,"data":[51622587,394931930,1946352768,-855526389,-2134575596,216732276,348980148,-2141133696,74735868,48961972,-1973710668,-816096573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,234,59904,-1957363712,-1957210388,-1574042554,1854608544,4623110,-1962778997,1451951182,141986566,1426751115,-855577608,1183407360,39749888,-1996206455,1988691542,176064776,1583306908,-1957313699,2275564,1443324136,117196487,-28915964,1183449088,71145476,2115335168,92924163,2097152317,93776131,2113929789,93251843,556672,1187389812,1183514630,206998282,-1156337479,-1056768000,-1912548733,651725762,1175062410,-1960842492,1451952710,330348812,50331835,13796289,-661929330,-1979217370,-772406194,1183367458,172395500,-1190373749,12260272,-2084502784,-1030881070,1183504523,126363372,-1962260853,-1195832234,47891,-763117309,66816,-1912548733,-1193767998,-2010775493,-330921465,474520,350815094,-1816132863,-509083858,172395286,-1190373749,12260279,-2084502784,-1030881070,-970532725,1183515399,206998282,-1156335431,-1056768000,-1912548733,651725762,-378271802,1183514935,206998282,-1156335687,-1056768000,-1912548733,651725762,-1962866746,1451952710,330873100,50331835,13796289,-661929330,1963443750,-1962867991,1451952710,330807564,50331835,13796289]},{"sector":7,"length":512,"data":[-661929330,34063910,1183552747,206998282,-1156335687,-1056768000,-1912548733,651725762,-352188474,172395438,-1190373749,12260279,-2084502784,-1030881070,-970532725,1575551239,172395519,-1190373749,12260279,-2084502784,-1030881070,-970532725,1994982151,172395519,-1190373749,12260279,-2084502784,-1030881070,-970532725,1183514631,206998282,-1156335431,-1056768000,-1912548733,651725762,-336918586,172395360,-1190373749,12260279,-2084502784,-1030881070,-970532725,1183514631,206998282,-1156335431,-1056768000,-1912548733,651725762,-1947531322,1451952710,47884,-763117309,66816,-1912548733,651725762,-352319546,-2062118640,-283788779,622201365,1561739542,108953622,-1960610816,1451952710,330348812,50331835,13796289,-2097151739,-1030881070,-1977165685,71698439,1183525099,206998282,-1156337479,-1056768000,83939971,-763166719,-1950183936,126494424,-167489910,-2000608559,1183515718,206998282,-1156337479,-1056768000,83939971,-763166719,-1950183936,71731928,-1962440666,1451952710,331200780,50331835,13796289,-2097151739,-1030881070,96000139,126363136,-1744550262,1979713341,15526147,781434883,414885887,-1962260853,-1128723370,47891,-763117309,-1950183936,130426584,-1955927293,1451952710,331135244,50331835,13796289,-661929330,17286694,1183545323,206998282,-1156334407,-1056768000,-1912548733,651725762,-352188474,172395316,-1190373749,12260284,-2084502784,-1030881070,-970532725]},{"sector":8,"length":512,"data":[1105920519,-1962260853,-1128723370,47891,-763117309,-1950183936,130426584,172395265,-1190373749,12260285,29485312,-1962260853,-1128723370,47891,-763117309,-1950183936,130426584,172395267,-1190373749,12260285,30337280,-1962260853,-1128723370,47891,-763117309,-1950183936,130426584,172395264,-1190373749,12260285,31123712,-1962260853,-1128723370,47891,-763117309,-1950183936,130426584,172395264,-1190373749,12260285,-2084502784,-1030881070,-970532725,1183574791,206998282,-385875781,410779896,397612952,401151950,405542916,-1209460652,108953601,-1977322496,-1315437498,-1946627325,1586170446,326416908,50331838,13861834,-645151858,168790566,-1977291832,-1315437498,-134687997,172919760,-1173594485,12456820,-2083912960,-1014103853,-1977165429,-2000150001,1183515726,206998282,-1156352839,-1056768000,-1912548733,-1965519934,-2010774458,172395271,-1190373749,12260216,-2084502784,17105106,13796096,-661929330,637535672,1183451016,-1072982012,20780404,1029796864,57999362,1023446761,57999363,-1962886423,1451952710,326613260,50331835,13796289,-661929330,509478,-1962260853,2025393238,47891,-763117309,-1950183936,130426584,172395499,-1156819317,-1056768000,83939971,-763166719,-1950183936,130426584,12380416,-1962260853,2008616022,47891,-763117309,-1950183936,130426584,172395265,-1190373749,12260216,-2084502784,-1030881070,-970532725,-2014743545,172395264]},{"sector":9,"length":512,"data":[-1190373749,12260215,-2084502784,-1030881070,-970532725,1183514887,206998282,-1156351815,-1056768000,-1912548733,651725762,-344651834,172395347,-1190373749,12260215,-2084502784,-1030881070,-970532725,1183514631,206998282,-1156351815,-1056768000,-1912548733,651725762,-336918586,539935,1625883509,1064446,1491665781,2113022,347605620,-1192734720,46433270,157564544,-385649615,1654718598,205928709,347605620,-1662496768,46433270,-1962581855,120261214,-1996372864,-1181095354,-101253104,74764811,283788931,-1962929991,-140907962,-364475911,54408959,-2096924696,2057372356,-532248317,752764615,-280574464,-564214711,-1995994330,1183703622,1183666402,1183666414,552095982,113541888,837764806,-1981135221,1183708230,1183666414,-2081926930,79987459,1575324510,-326412861,-1960946089,92996734,-1962779253,1435173965,141921030,-1962248705,93194366,1594252686,509026765,-1912409153,142511071,1167000972,108956422,1569260937,72190210,-1996073591,1167001717,855929354,-402068490,29233011,-1996125440,1579093109,1438866783,1448602763,1317734174,-1959795960,75402201,-1070336117,-218103879,-638107218,41339707,-24392821,-217680245,-12285274,1161480499,1946515455,48972037,-1047801353,-1017290914,-2081649835,1448543468,855930507,-1159178497,46433030,604390538,1963080707,105182780,-1978698488,-1952970940,-152841768,17063559,76228468,-1996209109,-1072956346,-11527298,1149895796,-397371385]}],[{"sector":1,"length":512,"data":[-998046290,-62506234,1283458932,-4251642,71601151,1153893513,-1962934270,-1956684089,1505975781,-668214133,507185778,74580848,-503323765,1426188521,1586228363,106925060,1334577036,72846338,-1957313699,-1957275668,2123039862,-1224270330,-1252347071,-1964037535,168135204,169899236,1176270016,1927756359,2011380230,988086786,973501127,33716163,1977629381,987294470,1913287904,112645,-4717589,1566531327,232319427,1475119957,-1962822826,1183516750,-2083376380,24447737,108956569,-1090320663,915079923,-148176894,268500609,12452722,-678495728,158254209,-385649669,-461307575,-1992884226,906268710,76424841,78759563,910745811,-1274770269,908184880,1006863011,506098434,240173107,487176735,567085492,1397703883,808333856,544370464,1702125932,1701978226,1919513969,168649829,-1980300508,-1946156490,-136434749,-850742053,512505377,915080058,371064876,-852164424,512308769,-1942616952,235178502,620804127,-853657414,244004385,585303342,805750070,869960709,520042203,57869612,906022121,87295685,62642828,520041984,520553772,87605244,722038969,-205507633,118888106,98035743,-1207958341,567100416,-1024062862,-2147126144,1073979535,-387155637,1474822906,87603970,87620481,-11335565,1128487703,112849643,-1092539648,-57998460,-1527576810,855730920,-475010835,10283088,1951599117,543908705,1919252079,2003790950,168626701,1769367876,1696621924,1919906418]},{"sector":2,"length":512,"data":[168626701,1634692166,1735289204,1768910880,1847620718,1814066287,1701077359,-1324741276,501266962,521071922,-1275067717,371313984,16758815,36759632,-222687055,-1310332131,503495197,-1957306645,116163564,-960604585,988304899,46433028,1183709323,1996443654,1172854276,113541893,1459242633,77719639,-1962621821,1600059974,-1017256565,-2081649835,229438,385811572,1996424064,30992388,-1017256565,1475119957,75402070,1569392011,72190722,-1962519157,2106263669,1461832970,-1996063093,39684357,-1996206711,1971914325,172330760,-164428686,283642091,114188,1971914123,1566531084,-326412861,-326937001,-129579512,71732173,-956742008,-1932789178,1183708758,-196703752,-1962508661,39684869,-1962652277,1972045397,175999752,216892245,1560305407,142510935,1569260937,72190210,-1996073591,1167001717,855929354,-402068490,29232043,-1996125440,-998044555,1566531080,-326412861,1460202627,-2009691306,-1206392061,-1202716660,-11533086,-65279948,184992899,-2096597824,1015218886,-2082179840,963903548,-947700597,-28915956,92930048,1183422535,-1977816070,-12740603,839152896,-1979520064,-27358459,-1996601601,-16539513,-2092434866,1962998398,313310,-1956684288,1472421349,172919638,-1962654069,2123040342,119428872,-1073048580,-108850316,185496842,-1341490734,-604526035,-150941053,-1829270566,-1072967117,-235470220,-1829636205,805622663,41302332,-1951783164,1975716802,1325762786,-2012903764]},{"sector":3,"length":512,"data":[995098436,1492480759,-1017290914,82839183,58334862,-1047803597,-108271221,741772105,1962281728,-221868536,1974355374,1083655674,-41157084,-989600303,-420995306,-1949332485,-1946352644,-1912138004,1240871902,2122911203,-1404746496,1975519914,-1980505350,521535566,59254409,82847487,-1142125739,-75430600,141755704,1528299347,-219462845,167964904,-2146798364,1962935422,71747076,382017278,12059784,522308901,86904459,45811683,740228864,71731973,567102644,82970255,58334862,-2135029994,865643520,1048585938,1912800130,109989989,-1070399444,-772290421,-1359808373,1963276326,63407097,-772290421,-1977157749,977356549,1007973600,1007186978,1006924809,1491825952,-2118252778,1328278272,-15991253,-812912268,-1014277310,50708739,-121600,-57941973,371131934,-1331367161,-880039392,8502815,-930410773,-31194108,-57941973,-1423948872,-1047812877,385125290,-594849761,-1431503221,1031061514,527770172,-2079916202,-1073042429,574369396,2105542517,74800383,-303322545,-12204473,-388633856,-797704137,-12167602,-1409055738,1958742698,2484232,-504629899,1274317738,1945320267,126332168,-335657847,199003122,-16615982,-2044294905,-232325373,1946762244,-1021297662,-1947432107,-2013920162,1948255136,1107474446,-779368141,57876941,-167180567,-2147245945,-2115435659,139365120,503731851,-54512889,-259303849,1709439627,-230683976,1362261422,-903098485,-854531255,-268198879,-1274776675]},{"sector":4,"length":512,"data":[189393673,1177515200,-1174404423,1085539572,74654157,887818676,443858955,-338195623,-812953147,567134763,-1645214820,162792563,-1073014037,-2013915531,1950352288,106859275,1964654464,82573315,470333689,-1962773927,-379625786,1317734523,106334984,567099572,162792563,-337383957,-411713525,60852214,-1962249152,440369370,-336067723,146340310,1439755036,1586228363,107446276,1438866895,-1957237621,-25099146,1014301638,201737462,1149908597,-661940217,-2013862959,1963000926,71616295,1149896036,-661940217,-2017008687,-956234658,1795391494,38061868,1149960704,-1207662332,887816193,64945793,1156983925,645204998,-1744354166,-472786805,73304054,-1206422271,-397409792,-998045261,71600386,108314635,134630528,-1070351893,1575324510,-326412861,108432214,294531,-25080716,628425670,-1744354166,153086032,184730755,1444312256,-2080865816,1149895364,-661940217,-2017008687,-352320418,-553746150,1444640003,-2080872984,1962869444,155445252,-2147302269,871827044,-1996191296,-1956772796,1438866917,861334667,3521014,-1392712654,-69017550,-27921280,1962947854,874940422,168946432,-1173523228,45809718,1685760,567099572,899858482,-443851264,-1957313699,23247084,1475899624,108432214,-22903155,-1962589021,1017316422,138840837,855982243,89301952,-2147135325,57999420,-2147399191,57943356,-956232983,17123846,-1547685120,950207816,88908549,-1559937373,983762242,89563909]},{"sector":5,"length":512,"data":[-955950941,537216518,-2144146688,108342588,89655039,1015031787,-15960789,-955955194,342534,-2145981696,225779772,88620675,-16091904,-351979002,1443299076,76170757,132665496,46433030,-1082802165,89045078,93382736,-1962621821,775717104,117379701,1447429442,1342524088,-2096793112,-259324732,1970027648,1040631559,1174405637,1962949760,10545411,-1986526070,1040096902,175374405,1946175293,5782789,117377397,-2038233800,-1960771938,771661446,356319331,54425344,-13724736,-14356057,-955954170,349702,702464,8906832,-352140157,571472,280556267,871230208,-1595387712,-1192629503,-169148415,-23152897,-352182552,-335639589,-1155211455,-467344348,-316349404,-316347100,-316347100,-316347100,-316355292,-316347100,-316352732,-316360924,-769331932,1379828516,91488261,-351973215,-1494661600,624787710,-2142828940,-176881603,-970209397,518542928,79987459,-1964378229,-1956684034,1438866917,414772363,-154408960,2122536535,74713604,88868607,87965315,-1961462784,-1962590178,39291655,-1980217719,109312598,-352058048,1279165225,276037637,88088203,1183385483,-96024584,233504768,88088203,-1986459765,1451882566,1074168826,1048773125,1946158422,-129594611,1962558987,71731973,-1070398741,-1962584925,-2096806858,347198,2122525301,612172026,168066691,80090997,1183532589,-94991368,-763111177,-1982138624,1451882566,-163133446,99287041,16139975,-2080535808]},{"sector":6,"length":512,"data":[1996429551,1996445444,-126418950,-2096810776,1048774852,1946158402,-689416416,46433030,88739467,1317652523,-972755970,-1958334460,1325399622,2143292414,-2012902670,943620868,125042693,58483004,1176513664,-8552377,-2082048768,347198,1218516085,973474565,-2096401403,1962997374,112645,-1070398741,39184464,1577239683,1575324511,-326412861,-402650952,1448605085,88475335,2122514464,276037636,-1593835074,109249856,-1996356288,871103558,88088203,1183385483,1074168828,-1073020411,1187448181,-16451844,854129782,46433030,1048834187,1946158402,1241921802,-1962642683,-1962587594,721767998,1480492030,125108229,17754199,1443021955,-386107649,-998047379,1480491780,125042693,16181335,1577239683,1575324511,-326412861,-402652488,1084355857,-28931835,88227459,-955878144,101009926,943128320,1245118213,74907397,88356607,-385976577,-998046761,75399946,-2096728985,1967588478,1446937368,292880389,88751747,-16092160,-402308042,-998046787,1446937346,292814853,88751747,-16091904,-402308042,-998046801,1074168578,113707013,1364,184895649,1946499590,-25755886,-2096912664,-1073020220,28837236,855829248,619204800,1575324417,-326412861,1927856179,1048794868,1962935634,1008634680,38797061,163715,1183453564,1008634628,-13137147,704940039,-15864860,-16434122,1793590390,79987459,-16353984,-351972858,1342635780,-443851259,-1957313699,178412,1475618024]},{"sector":7,"length":512,"data":[1379828566,1366622213,184841867,-347439370,1008634675,38797061,163715,1184895356,1008634629,-12612859,705005575,-15799324,-16434122,-402307530,-998046959,74792964,89261823,189712011,-2084143168,348734,1183516533,1342570756,-1956684283,1438866917,45673611,-205789184,1988843095,108956420,89276035,-347310848,1008634677,38797061,163715,76157564,87826059,134156171,126409099,250340394,87832319,1352139914,-2096977688,1967129796,1376190212,-947173883,1975520079,1379828676,125108229,17188491,1577406470,1575324511,-326412861,-402650440,1448604497,88356491,1183432755,-129594884,89013899,67889238,-1996307325,-131335610,-1593541077,61932884,-131335981,89669251,-2146077440,276114748,88489603,-1408666320,-1796714344,46433278,88489603,185300016,-2096660737,350270,2122520948,108265476,-386382081,1048772702,1946158420,-62456058,-2097123352,350270,-396941707,-997982552,75399938,-2096532480,1962997886,3467267,89407107,-2096532480,1962998910,4384771,1459255039,-2080446232,1048773828,1946158424,1174849293,1459625989,-2080478232,1599996612,-1017256565,871140181,-225974080,88620675,-1341885440,-1341986005,-397371360,-443810309,-1957313699,-390056980,817427049,-387428352,46433277,89407107,-2095745776,342078,1487930484,2024801003,-857190248,46433277,-1017256565,-1192457387,921174018,-1957275662,1015023222,-1961986774,-2096807906,33898502]},{"sector":8,"length":512,"data":[-347717749,-2130758854,863776828,2134457472,1111374126,-2146732795,108343356,88475335,-1733558224,-506343541,-821829167,-939269679,-1959728765,809271545,1015022972,-1948025287,1065944158,1600046731,-1017256565,-1192457387,-823656446,-37857551,-1978799356,71710724,28837237,1174989568,1962949760,1589654510,-1017256565,1458342741,74877783,-1715457028,1017961099,1023112224,1022850057,74751021,24455996,2000239788,1915759647,-773598949,-1949594670,-773598726,-773598766,332989394,-2082995241,-588578606,125148563,-763111177,1608185600,1575324510,856191683,1575324608,-402230333,-4718579,1575324671,-387697981,-1564278783,-469105782,1048585077,1912800130,1931623437,1914715149,-351948795,322736135,330302070,-687537477,58499992,-339440957,-326412809,-1946998552,1438866917,518581387,1575324659,-326412861,-1947003672,1438866917,183037067,1575324659,-326412861,-1947008792,1438866917,11791499,1442079977,-326898549,-1957275900,1149896310,-2086037498,-167349248,1950352964,-18426,-167716119,1946224196,105676806,-2131825888,-2147350964,871302756,38046144,2122971275,105182974,-1978698488,-1952970940,-152841768,17063559,1015754868,184843307,1460829951,-1979419393,1352140612,-2081030680,1183385284,71601150,-956004032,33489476,-1979425653,126354502,1156999915,1316291590,63372929,1149906293,-397371385,-998047639,1975520002,-2147039435,-953390333,90440772,-1744354166,-472786805,73304006]},{"sector":9,"length":512,"data":[1694811905,-1195840763,-397409792,-998047585,71600386,108314635,134630528,1283496939,29295622,1183667968,1149915140,-397371385,-997984898,-28931834,1962835513,-13506301,704923274,-1956684060,1438866917,1586228363,352027396,-75296387,-166953984,1073979527,28837236,855829248,1438866880,-326898549,-1101637884,-13433922,1149900779,-2086037498,1443591168,-2081476120,1950352068,-964475135,-2043266808,-1948028156,-1956684089,1438866917,1586228363,-28344316,1575324417,-326412861,381376342,4162309,119417205,-402651720,91554168,-342245325,-31178716,-1559947613,-946469608,-2097151740,1153893574,-1979711746,-1962599370,-661912498,585678990,-1956749568,1438866917,509078667,75401991,-4603853,-1951468801,-146784063,-1017290792,-2097099799,-126619911,-18775999,-66947189,-1459713107,1212314625,359907643,-268185461,1946265773,96600884,-141885438,-335657847,1962839014,-1980169460,-1054081460,-351958712,-17235195,-963903924,-92153204,91489011,605981734,41912581,113649347,1023542568,628424702,-268173685,1946265773,1224641522,-1116487365,-268185461,1946265773,96601058,-141885438,-335657847,138906598,74760203,334223502,672071206,-1945078779,49495512,-1910110860,-1962598370,-1950487753,-1070397833,989878760,604861638,-1740619775,1946177000,-28443123,1946160104,1313773061,-1070359829,-1957575783,27852357,-936705164,-1170128567,992378879,1980048918,1978323204,63015925,51737286]}]],[[{"sector":1,"length":512,"data":[-150113598,734143442,846022,-755562379,-445257007,-1017528269,501764434,1461220352,-259260789,1153954307,-1979711746,-695531913,-1991583957,1499004501,1347666778,1377751603,28856402,520507392,-2097148184,-92075836,1532633087,-771030412,-326412861,-2096736426,1962936446,76595000,-1962518901,1967653958,5498887,1223370610,81802891,990999624,-1962052361,1183384132,988304908,812867072,-2130393469,1929699582,1976699652,-18426,-1960973415,264471514,61987793,1219816403,-378396211,-1996191342,914948692,-1070398240,-1956749561,-1950130715,-141882290,1946307641,80118540,81854081,-335941003,64654143,-1959169508,1002540755,956724727,1929677854,264471334,-338568239,-338564143,158725947,2057427203,-1898435837,-850742080,990736929,-1996196361,-1845195754,-779418489,195,0,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804,7171939,5066563,592728140,1380974848,808714318,3160064,808744802,947347968,1868759088,1660956724,3160175,1869508461,1902465536,1953719669,1394631781,1701147235,1750278254,544499305,544503151,1914725999,1701277281,825229322,892613426,959985462,218106368,808714240,3160064,808744802,947347968,1868759088,1660956724,3160175]},{"sector":2,"length":512,"data":[1869508461,1936019968,1852138601,1869619316,1869182066,1718558830,1146047776,1869357125,1684366433,1816723466,1634166124,1701060716,1701013878,1835101728,1342179941,1953393010,1696625253,1919906418,1347158026,540680276,544499059,544370534,667704,542396492,1702043706,1868963956,858857586,1342179890,1953393010,1814065765,1936027241,1919250464,1668180256,1702043752,1224739444,1818326638,1646290025,543454561,1702125938,1701868320,1768319331,681061,541937475,538976314,1697390624,824981292,666924,2032168772,1931507055,1948280165,1914725736,1952999273,1953722221,541014304,1311725864,2105385,2032168772,1931507055,1948280165,1814062440,1836344933,544502639,673201968,692989785,1224744992,1818326638,1881171049,1835102817,1919251557,1275071091,975197264,1684369952,1667592809,543450484,1126199156,975195471,1347158026,540680276,544501614,1768187250,1952671090,681061,1224765262,1852401262,543519849,1920230770,1852776569,1918988320,1701604449,1919950956,1702129257,1769218162,1970234733,167774836,1650552405,1948280172,1752375407,544499305,1701995347,683621,1868787273,1667592818,1329864820,1702240339,1869181810,1392511598,1702130553,1631985773,1920298089,1308625509,1329799279,1881160269,1937011311,1329790986,1869619277,1679848562,544433519,544501614,1936291941,1224739444,1380275278,541868366,1330795077,1852383314,1146047776,1885413445,1667853424,1869182049]},{"sector":3,"length":512,"pattern":0,"data":[1224739438,1919902574,1952671090,1919243808,1852795251,543584032,1162104653,2592,1919117645,1718580079,1867325556,1444963684,1769173605,857763439,539767342,539575080,2037411651,1751607666,1766662260,1936683619,544499311,1886547779,943272224,2613,12124342,12648636,13304006,13959376,17498358,19661082,22741311,25952632,30605744,33685991,35324440,39846471,42402423,45023894,49218259,49283072,2566,0,0,0,0,0,0,0,0,0,0,0,25264513,1,0,0,0,0,0,123994112,123994112,1,0,258,0,518,0,900,0,1026,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65536,0,0,0,0,0,0,0,0,0,72744960,0,0,49479680]},{"sector":4,"length":512,"pattern":0,"data":[0,0,0,0,1127941264,1279870559,1313431365,20294,0,1848117773,694971509,539831040,369098787,219677186,202116105,-63481,302846719,65282,0,0,0,536870912]},{"sector":5,"length":512,"pattern":0,"data":[567095476,339599494,-1173785597,162791932,550314445,31917766,-854608871,-400127984,35109377,567085492,1169480499,-393535027,567099060,-1275067717,-64893627,-1191044422,-578088960,567099316,41271307,-930406195,1017967243,1022719002,-972589811,16902662,171724011,117311093,1122697705,225773628,32128640,-29920255,-352196082,1963539505,-366573038,130318337,-17243008,-366573372,1008462593,-32017401,-1979586042,973204006,1979836454,-385417719,-368654847,-796262143,567083700,32056970,31925818,-256237454,-855002111,-1341344735,-1172189951,162791959,113648077,-973012502,16902406,1950957902,-9508605,419386601,65872,0,539831565,1701998413,606940448,1163022157,1850286138,1920102243,544498533,542330692,1936876918,225341289,9226]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[7887437,983058,32,33292287,48955592,17956864,30,62455809,283639808,284426240,285736960,24444928,41091346,43647250,46399762,49545490,52494610,80347410,88736018,90898706,93585682,106889490,274]},{"sector":8,"length":512,"pattern":0,"data":[168626701,707406378,707406378,168634922,1919229988,544370546,1684104562,543649385,1701603686,220465677,1176766220,543517801,544501614,1853189990,604638564,168626701,1701603654,1663050784,1701015137,543450476,1864399202,1634887024,611479412,168626701,543976513,1701603686,1633886323,1818583918,1646290021,1886331001,1952543333,1462006383,1702127986,1869770784,1952671092,1684095524,1768846624,1867392116,1701978228,611935329,543449410,1835888483,610561633,1635017028,1684095524,1818321696,1868963948,1952542066,1701139236,1867392107,1329868142,1768169555,1394895731,1869898597,1869488242,1868963956,610561653,1881173838,1919250529,1769101092,1713399156,1953264993,1634030116,1634082916,611609717,1802725700,1818838564,1818304613,1633906540,1852795252,1650553888,1646290284,1679844449,1702259058,221135136,1766597642,1864397939,1970304117,1936269428,1953459744,1936941344,1701734249,1869881444,1679843616,1667855973,688524645,1936019968,1852138601,1634738292,1864397938,1380982886,542395977,1953721961,1701604449,571084132,0,539634218,1919117645,1718580079,861286260,706752561,10794]},{"sector":9,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-939524096,3,0,0,134217728,167838216,264306688,0,0,0,0,0,0,0,-256,255]}],[{"sector":1,"length":512,"data":[0,0,33554432,141623296,154471207,147720429,8325350,9830541,11272352,12648625,13828294,15532260,17039609,1358430208,-846790472,1354979370,-846790216,784554026,63112902,772205567,63112902,-2168832,1995113331,117321360,-30538811,771999238,63389312,772240384,63377150,-2144445973,243262,-1336913547,-350165493,551849985,1968766500,777395778,62338757,16743555,863313758,-1241055698,113651203,771752901,63309510,-164693248,-16530682,-1336932747,1478551072,-100615704,-929026480,-945672701,-30517245,-402409970,-164692115,-16530682,-13761163,-821839058,1929335784,1048587823,1962935222,117321252,-30538826,-83639290,-100631064,-1006189010,776994819,771999904,1476642722,-1240531410,-13899773,-718340306,3,0,0,0,0,771751936,63178486,-1272154625,114747481,85566254,454986030,243871237,-1993472739,772087574,86062729,591300910,512503301,-1943141083,-1023072506,-1006176722,192282371,240978616,85572127,-1022977048,-365002706,24444931,1048587971,1946223601,-1943121673,772005142,64956041,-1896167284,62307536,1428031227,1448235347,-400617897,512491397,507184107,175244300,-1660879895,-385837079,512426306,507184107,-260897780,63192704,1342928128,939772320,1476642054,904453747,1048615943,1946158058,343186898,63192704,1348695296,939772576,1476642310,-1024763789,440141706]},{"sector":2,"length":512,"data":[222083444,113640821,1006633961,-1977780983,-2147227378,-638125879,602139954,117317808,-397343767,-497481959,-1877677069,74778684,65605374,74588220,65603326,-16318232,-972821754,247302,63192704,-385649408,434700140,-15931392,1499094623,119496027,378416890,-1959918627,-83632346,-2144418984,263742,1397757044,119442222,-397364220,1482360208,101107246,784531460,67518080,1394504960,-397298608,-1993472648,-1945893090,283870155,1776832692,777738245,67503814,-118963455,151438848,512425988,243991533,378209290,1068762064,-1677377304,-2147417880,264510,-346553228,1922928684,15651,512433780,-74775600,512358403,243991531,-936705014,118360035,-201581904,-11343446,988286128,10872838,67700422,-316765185,-398543869,-1226308363,-368654848,113704963,-64531,-1560015711,-1092090901,6154245,-2146451010,829685820,-973049112,264454,12113547,79947837,8644764,67714688,-1660718080,1939724267,1107973,-308031509,-368654845,1088946435,-18421499,235223784,48647,-1106970648,-236453845,264355332,-1106976280,-437780441,90171396,-1090056509,29233089,-871462128,-53597437,-828267277,4205827,-1962684765,313072,1381172931,900998320,772037608,65209996,-518092498,132299267,632562864,1510229992,516097883,-986820016,-1341923050,-400182236,1482294324,-2144419041,264510,1408980341,1448563281,236848725,462367,-1107220218,1843920896]},{"sector":3,"length":512,"data":[-2134575612,-410960779,-8191745,-1090292212,1049165836,-405732398,68861323,1307113355,1162756,-1107015704,937955265,2604548,-33276952,520358150,1600019719,844847450,113758144,16712658,-402585154,-471137248,1979841664,788475397,-130284583,-2143482253,-385649408,-469042207,28312437,1975519951,-805326845,-1237417938,225705987,1426065848,1317137547,1560281350,1038365391,91619333,-352321096,117321450,117113782,-971043298,258310,-125050671,68064767,236849010,73328671,-1243046881,788176381,62263038,-1150154977,-2115204267,-129434,113692509,-402586639,-1957362628,72256748,264355421,241768075,113689592,-134216719,-365002557,24444931,-316765245,-21895165,67700422,-398543871,-957873403,-368654594,113704963,-64531,-1560015711,-1044511765,-835286769,312835,-402629442,666764100,54454272,-133973784,-365002557,24444931,-326412861,1560567438,-970062066,259078,-184105426,-1044709373,22013967,-225707125,87697068,937953396,87696897,-2144990859,1349779517,787082055,66272896,1009415425,640054591,1949187456,1031808533,-1394641664,-76267716,-143380932,225820682,179054315,1007056064,-336104146,1086555077,4161574,-2144425355,17036606,521012597,-1207920151,-1007091710,113647374,-2130639883,1963966971,-197230513,1215627267,66324166,512447233,-857209875,151439101,1051984132,-402513688,113704417,-956300310,-16519930,67936767,1526983587]},{"sector":4,"length":512,"data":[3980883,-1962776600,39381235,-402635074,666763868,39249920,47179867,-208929909,994100867,1963183670,378373,243993067,-836041780,-1583025156,1076691918,63873792,80146571,4161536,-1957361036,73305836,-16455331,65879683,-1103137281,1015025601,-399019008,113704263,-1962933239,1023457494,-1677616920,-2130880280,264510,-392362380,-672400117,-402099299,15269090,-1546851331,113640429,-402586646,-1007156721,108159292,41384508,784539692,66258630,-51213568,1975519916,-1392685317,108341820,-217659858,1060897027,-970062219,17036038,-234472914,-52136701,-214007762,24379651,-1085913405,-1185479690,548405260,1605039100,687913046,1577130216,521013022,-1090614522,146342903,540847104,-492174476,67092216,1948269696,-1439780850,-1409285191,57942076,653845162,520095174,-1950152946,990105150,1912851518,571397,-1957313543,73305836,-1962471843,3965170,1959073909,4241665,-11736916,1958742698,250995214,833567,28886009,247724288,-835286241,-964471293,-835286720,312835,-956549400,264454,1023457370,-1677686552,-62396334,1366531418,787647312,973175936,-346553484,-400968652,776994925,-897575798,1642758176,1592266420,-400968704,-1036386215,-1269167243,5236750,-338261160,246700556,1476412648,-1962930248,-835286058,1089372931,63846025,-117439290,-365002557,343146499,-991373173,151439099,1051984132,-402646808,-1007092775,-1593578077,-341638132]},{"sector":5,"length":512,"data":[-368654845,-1595408125,-389810176,32045693,-2144419072,897854,1394483572,-1273051858,1527250445,1894431,686301645,-1672274432,-1273051858,-1659896307,-389865637,567083014,-1023405336,45634128,-841862605,378023457,1482294228,-1202564925,-1976683774,-855387114,-1017619935,1946172588,911375,1017968363,-402295772,-152371197,-1779936317,-2130021376,537815358,-351963314,11790577,50011,369098752,0,0,0,822784,256,1352422144,378220114,-92077073,-1207274241,801964547,-855506504,1677834287,1482301901,65539507,-1017406208,-986819042,-150739658,134218820,521013876,210962118,6416397,1405296478,-401689700,1381040094,-283735250,-359677,45615732,-1204826878,801964548,-849084232,-1655154143,-11287717,-1290901242,-1828272630,686296332,-1777928448,1954545676,-1777434362,-150863860,824838,-955878142,944390,-1564255488,145951886,210962118,512230934,-880014187,113755022,3222,212141767,1444806657,-114825136,-989031493,-1962678986,-1557264828,-13759345,-1962111202,-1557264316,-13759345,1477218078,-1022943394,0,781979045,62260990,922693134,-13759092,772639286,227030783,-30499637,-1660701170,714,0,0,1965096064,1996569629,772830233,229836542,-1273067218,109850125,785321398,229836486,-13709568,896814,0,0,-2144468992,17686334,-2144461963,256574,992875380,1963845654]},{"sector":6,"length":512,"data":[1048587788,1962935222,-1581974780,788475599,3556,0,-549552082,645202445,-365002706,510918659,370555694,773289230,62275200,-82873088,91546634,1979907200,-1275023358,-13709440,772674094,232734336,772896001,65683072,772371456,233324163,-821988096,-533790930,134217741,542003792,538976288,1347160064,538980692,134225952,844386380,538976288,1347160065,538981204,139296,1481982216,538976288,1124597792,540101967,2105376,1297040136,538976306,1342177568,538988114,-1272963040,-45356974,2005737222,-1090056670,1157041843,1954545668,-2091428338,146344646,1604776704,-989105058,-97484,521069685,-1943092231,772575518,65478284,-449410770,-954266109,-16519418,-1123610881,-175436109,-1961989185,1192069877,-1494016797,-1963392097,1973307165,-1979763986,-1995577314,-972820706,17686278,-1799411733,-1963619570,417548045,60794611,1193118457,854488478,371100159,-553204210,99287565,232720070,-87820288,801971982,-85261453,117321411,-30538826,-402406394,-986777217,-1207707370,567092527,-1156135634,622639107,364388813,382021157,567086511,774182840,233051845,95953357,382021157,567086560,774182072,236066501,616047053,382021157,567084001,-1089026770,622442499,-839179827,783941657,1460570881,113409,567099572,-849084232,1291827233,8653,-50724864,212012684,1929303272,81836761,900999344,109846989,512295895,682623957,567092660]},{"sector":7,"length":512,"data":[-1341632326,-852118481,-620327903,-652310269,-1271943165,-1339962075,-852118509,-1979282399,-2011264755,227457549,632558512,363864525,567096756,229705356,229580425,-1341278022,-853167083,-1273515999,-1943941835,-1995577850,-1173494754,397413866,567092660,900994224,109846989,512298516,414846482,-1273712626,-1339962075,-852118523,-502887391,-534869747,239843853,632554928,884220365,109846989,512295865,481297335,567096756,62719628,62594697,900995504,109846989,512295873,12059583,1009765816,-150572032,1962984643,72333842,632560816,1471816141,-1273384945,-1172189915,243990873,29032827,-851397632,88913953,-1206920541,100859904,-593296332,-1195340273,-661782254,-1961928519,-33977359,-1929599757,769167040,-762576622,-762392573,-634454226,15,0,0,-852445956,1038124577,91357972,1979913277,-1172369906,162794957,856039885,-1580511040,-1073020884,-1912207244,-850807616,521013025,12060430,170904833,-1200785984,567096616,166004364,165879433,-852152392,-385446879,-417429239,890484745,109846989,512297457,364382703,-1943941835,-1995835130,-1207306466,567096599,167577228,167452297,-852159304,-184120287,-216102647,889567241,109846989,512297453,481823211,-1943941835,-1995833082,235536158,-1876038905,259260732,194709190,-400430334,-4716806,-1172189876,-202699562,801984600,154995315,-2081065984,-1007091004,-1023228797,-402261528,12060166,-2011050697]},{"sector":8,"length":512,"data":[-2146837482,91565562,165480134,8502831,-401890113,57804129,-2147439639,760638,-1897331851,17086464,-2113947928,1912986874,521018890,-401722182,-400619882,1015021616,-1086557184,236850472,233224735,-1173977112,1049169186,1153371430,108324877,1086751519,-2147480600,236847164,1491367199,1448548843,-1408484673,57982986,-1426527318,247684958,219658783,-1207547416,1424490757,-1690402561,443875595,-1912602440,-1176816680,1051983877,-498916915,873892857,822130692,12067277,-383660724,861274927,-1073042231,-348060812,-373072136,20775875,-385649408,37552919,-385649408,71106937,-2142014208,537633806,195313280,-385649310,1048576264,1952713636,-1539407662,58029323,-2138014229,1829479486,-1712782475,-1539407872,58028811,-2147436055,1896588350,115934069,-1539407871,510947339,195313280,-2144766877,1946919998,-356895628,94169100,194723456,-384666368,1048641176,1962937243,43903235,194774726,-20715264,194723456,-385649408,113640075,-385807460,1048641201,1962937243,41543939,17021014,1593732840,-385964823,-1301150723,1962934845,-1690402643,-1502281717,1912827624,1977879201,12197533,-1562735104,-383843382,-689373579,1025667587,494206978,194723456,-401181440,292684615,225829898,47646,-912074098,1323900675,-10032642,1912843496,146936,1048638325,1962937243,52291820,-469047438,-1172380811,-628228096,-1576810334,-383843385,-2098659807,1029009923,1349844994,194723456]},{"sector":9,"length":512,"data":[-397839104,1148322547,1912733757,1073757503,-1172424073,-628228096,520358563,-386009879,678560597,1962934845,-1690402781,477429771,1912784616,277783,540873330,504198912,-1912602438,63677146,-37230305,-2130780183,760638,-1930886283,113703937,1442843549,-356518005,24936459,-1273990086,-1977496295,79888080,984656449,-1978799190,40822788,376848428,-1532702582,940170656,-1440517116,-1258845354,1931595079,-219587068,-1073042432,-1957758091,1593740231,326420283,-1442194016,-1957294613,-850938633,57892385,-1191128855,-947191744,722201133,-1190956088,-1431568383,74721852,91569980,194840262,1958742529,1340858890,199638665,1325455337,199638665,195346270,1023574248,561315844,195300992,-1539407840,125133579,194774726,-2146243839,1879811134,113641333,-352318564,-466187516,1048598027,1963002780,10545411,194854528,-402098943,326304243,-1174371607,12061674,1914817853,-1260876977,-1172189890,378080234,512494047,-558233119,16889865,1945928424,539929,1048581237,1946225567,-1626946030,12189963,56158221,113640939,-2147480673,17538366,-857209483,1589670657,-1157856791,837488019,-1676844102,1465274707,1344144981,-849759150,-1168418527,1094520181,-1962642432,533826499,1583308039,-342008999,224639496,-1430649877,50915341,-62592674,-1207178566,216531202,1577349884,1039939049,7602178,-351417926,-585725216,47113,-2010726258,-2147225066,17538622,1387937652,47638542]}]],[[{"sector":1,"length":512,"data":[-972315462,151757830,195364550,-854936576,233224737,-1979531288,168535310,840594633,195477229,1443804095,-2142310141,24459836,-391356855,-492175176,-1205926151,653656128,-1056635957,63742735,64004928,67765763,-1560015709,328683,1049857,-388896559,-388896559,-368823133,4062,623098107,-855169094,623163425,-855182150,-1694054879,915079435,-2014770204,12066555,1060096,531421326,57948732,-402265266,57868505,-2130932759,760638,37615221,1458664704,-1191736489,-1064435712,-1291401434,639639566,246744774,246660896,-2142310141,24459836,150569801,146342774,-1403625984,-1442836504,1583348194,113641230,-385807458,1631386405,2050754162,539755127,861361859,-1174959141,1017905162,-1407224518,343195658,376582204,309803324,-466472916,65140627,-403991613,1606650872,-335953058,-1172654856,567086218,-1190401350,1320419328,24322509,-432632893,984415499,1963580678,1179057401,199767689,-134212120,-1172654909,567086218,567103412,-389873293,-1007157246,199769739,-66279234,-1073042772,-1664877963,-466187986,12066315,1060096,861395086,5236937,158666044,1308623288,-107143329,378154691,-1036383780,921177973,1947024384,4319463,-352320328,3794976,1948269740,1946762260,1947024400,1949056012,1950170120,1975663108,45633252,11554816,526342314,-1396442979,-76275652,-143390404,-210490308,-277594820,-1019106621,891598854,512303565,109841312,-1022948446]},{"sector":2,"length":512,"data":[-1171971144,567084839,-1171970888,567084788,460483,-13758820,772206902,195180287,-1607008466,37538571,-30532491,235336454,-1139339745,1048578969,1946291099,2877443,-5223244,785326541,116604544,-821988352,-217645522,236916230,194624535,194723456,-1193642750,2028470533,-86643719,505751736,165877445,-1205919283,-987880145,-854989034,330833697,382017061,567085551,622180383,-149502690,522308873,505747384,167450309,-1205919283,-987880172,-854985962,95952673,382017061,567085547,622639135,-15284962,522308873,50171,0,0,-1174404120,1431440870,1464882001,-1960966570,-402190612,-544472583,-147077492,-1074527884,1854606964,1988836880,-1394920704,460596540,91537418,-352212760,29550834,1599997727,1566137176,-1763130534,-1394545919,-160160452,1064578364,1198795580,1047809084,980708412,1030893628,964114748,242561084,1497269038,108331022,1560725038,-1202704370,-147980278,772692262,1477335459,808248370,1493565742,772598542,240387838,-30538261,-351382266,1951939754,1918975014,2138717190,1021256706,1007842392,1008628804,1009349699,-400526253,1726546253,113651455,772148823,240846535,2078998544,113716880,659035,781218283,240649982,-2081191082,-1958870333,-2144468366,940094,1017907829,-398756864,921370849,1494125358,1959332622,1048587789,1962937940,686315013,-1403625984,91488316,-352272152,-2144444682,939070,-1959916428,185489678]},{"sector":3,"length":512,"pattern":0,"data":[-402426679,-689438713,-286695936,-1395510274,57982986,737733442,-402426166,1455620225,-1014762613,1116421634,1048587778,1946160725,-2081191157,-1958870333,48955986,777245235,240858763,1494125358,780302,-402632472,1583022221,1241425129,868387664,-1946748974,-151562024,189848199,125065410,-1578925,772533083,240402048,-402426624,-1014300639,225577532,1446936622,91553806,1460011566,241089294,-685830626,317215007,197351680,772505289,1359895968,1493173480,-1429997086,243859329,-1178402444,-1152188396,236847105,242530847,567099572,1958697759,-8273138,24448628,1961853379,-389051634,868483036,1419914944,1436691982,1470246414,1503866382,113651214,773852765,-1022469982,23552]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1851867904,544501614,543519605,1313428048,539828308,543519573,542393678,1313428048,213188692,1635151433,543451500]},{"sector":5,"length":512,"pattern":0,"data":[1634886000,1702126957,215482482,1313428048,1970348116,543520101,1713402729,7105653,1380977900,542395977,1969583473,1936269413,1886217504,33585524,538976269,628303136,219742323,3130,544434464,1920103779,1819569765,1700929657,543649385,1852404336,6579572,544434464,1897950825,1702192501,544417024,1701603654,1953459744,1970234912,1358980206,1091299853,1936024419,1701060723,1684367726,1225615104,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,1996516975,544417037,1752457552,1701667182,1869575200,1852795936,227868775,1931807722,1818838560,1869488229,1852383348,1230131232,1897944142,1702192501,-368202240,1668172043,1701999215,1142977635,1981829967,1769173605,220491375,232980490,1869771333,1864397682,1768693870,1679848563,1667855973,1852383333,1633904996,1948280180,544498024,168653929,544825709,1864394082,1814914662,778399337,1701597216,543519585,1667590243,1953046635,658734,1632505320,1864394093,1768693862,1679848563,1667855973,1348149349,979193426,238420000,0,0,825237504,892613426,959985462,1145258561,1650542149,1717920867,0,0,0,0,0,5376]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"data":[-1,11536384,251723963,17826897,15335706,16515373,16515324,20447544,16515324,16515324,19398908,1385176555,824202820,-2143866578,65536,16385,129024,65537,-351928320,1094795774,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,1094795585,0,-1407284946,109850112,1456144558,1465012560,1392909909,-1407269586,307202816,-1978378357,-1976696249,973081382,-1106282556,60293132,-990903312,521014911,61875455,-986838293,-956257250,4679,48988596,-986840652,-1996444642,123405127,1516199199,-883009447,11280069,17713094,516285163,1204224172,-1946142958,-722791345,-352124744,-385928495,41025550,-1226062101,-202702409,-1007089488,4134459,-1031014797,104579331,-327745473,243974539,-523042742,12059507,-1949791360,925300674,-1878660352,1048576,23594499,23729683,376766218,-2013070685,-1996293098,-956109762,190982,51166720,212014315,236357635,-365000445,-335100158,-1107296254,-1064566022,-1946113816,48538576,-402454850,646512797,780337904,-1274936592,7137503,1189806709,-1007091024,8435793,118413454,1589638707,3389698,-1510737156,119473694,-994115789,3389698,84911603,-1064393229,521076531,-1191027010,-1510801357,-368672261]},{"sector":8,"length":512,"data":[-2130575358,191494,350443778,49678023,-377421568,-1334640384,49679873,-1460942541,-1274543943,321757,-1007093280,1370362,-776990603,199779558,-1979222784,-396302652,-1006960638,-456576175,-536730524,1388534266,1096017,76145143,1493324936,50010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32243712,0,0,0,0,0,0,128,-32256,-2113929216,65535,-32256,-2113929216,65535,0,-16723968,136,0,-16728064,3606528,-1,-1,1625562704,276124476,-661733325,-167503968,1963763920,3467267,-13740001,-402444242,508559402,-661733325,53256494,6595578,53387566,771778211,-1560072031,-1590820828,648217394,777527040,53227263,235282016,-569981153,-956044798,199686,235324928,113709059,748,48891591,113705024,6226678,-1945961794,-23074624,-459026292,50773506,-1979804440,-1274875866,-26679073,-1191676422,-661782400,-164428018,-1191027009,-84148173,102671859,-13433057,-1191000898,-1510801357,100074767,359923713,132599,2105739892,74776834,-187007]},{"sector":9,"length":512,"data":[-502610045,868257509,-1105260801,867762782,-1264192768,-32184099,133723642,46358815,64,257,207872,0,-1273033186,522308873,702915,-235417037,91537419,-923566,818053210,567083700,722373827,755928068,817167364,-528080435,1912733757,50347274,4000626,-1172540924,115938295,69632257,-956825856,184552198,339543751,113641997,-987491265,-1979667402,3020356,-1173075450,-1813507045,309642751,1948269740,1946762491,1949056247,-385356813,-823590657,222080000,171767156,540864884,154930548,742132084,3933556,179103605,1021080768,1020818445,1020556298,1022325792,1022063625,1021801516,1019704367,1009545776,1311274809,771935208,69484160,1948022531,1048587848,1946289188,284918549,-75428494,125243392,538872110,-346690812,112234587,8452993,-1057089420,16841601,-1057091468,33618817,-1057093516,67173249,-1993459083,771766046,-352302430,50037543,-75421070,611779584,926845742,-754601728,868453359,200800210,721712338,786367482,4005513,604438062,-11081468,-401371974,-1070334286,-1342044183,109457151,-1073085402,1017965173,1006924869,772371813,69142214,-13702912,74727740,-797613764,520537646,501809412,-1608577281,-1073085409,-1410857611,-32707832,-402295352,65734943,1930113768,-2135954686,271678,2011759477,69247233,-150732615,926349281,4170496,-1325384287,870372101,926349266,1959922432,665010177,132356]}],[{"sector":1,"length":512,"data":[4130363,113715570,1048637,12112435,926349058,1959922432,665010177,132356,4130363,-1310193294,329955845,-1577104151,103481407,243925050,-315490244,4326955,103545570,29033511,267795712,45816690,535575808,79369074,1071136000,146475890,2142256384,280691570,-137219328,-775386125,1090614249,50708739,-137219328,184563510,1073837266,4327047,3743366,3743290,104570229,-1753939902,70205056,-1203276800,100859905,100859970,653722663,100859959,370344296,251986282,13796096,-150990663,-1931965455,-2116408374,1929483515,97029125,-1064435308,-24381901,-65454407,-1207524109,105907942,118410015,28955187,2932480,-1108868681,1052721664,-1178586347,-201588224,356433835,637534649,-522809,38127142,10414335,96937538,-970588160,-1962933691,1224753678,-1185870877,-2048393215,-497466880,113141,-401269057,-1958608776,1225008910,1052708579,28922133,6744064,-169715390,-401322054,547486938,-52566012,-401317958,933362894,-53352448,-401312582,966851778,-387698176,-1833239357,-55252972,-402637407,-1262814025,-56039404,-986840656,-2013221858,-1959916217,-1996216050,-1959915953,-1996215538,1204228175,771959314,70061707,-384544887,1460074826,1397903646,1543079400,1595890010,-617364729,1915759788,1997093903,-1164732405,-487129078,-320088061,1229833038,1397707331,542393935,541936965,1280463939,1380275744,1313818963,808333600,1329799216,1330795598]},{"sector":2,"length":512,"pattern":0,"data":[1279402060,541803343,538976288,0,3,1049600]},{"sector":3,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1095914049,1380012626,1048592722,1963000863,672566031,-851069949,-2097381273,1475081076,70205056,-1588562688,378210324,2951190]},{"sector":4,"length":512,"data":[14320388,-1996396381,838953494,5826815,1052718450,-2080929003,-4505401,6273535,67063,100078452,141819906,16940419,-544537995,-502610045,-293913,662767988,28835837,503325160,53221061,-12724084,990148095,-1206946622,567092505,806798638,621393923,-1021369907,-1031024077,235012281,356433671,-185276386,-13450465,-1157633560,577901514,1912633576,1460050969,-672661065,332053247,110038386,110035304,1956446570,-2084308982,-2014837052,851704311,-4658945,1913899706,-1090056463,750654782,768256,1973875708,348619576,-1189820797,-1494024095,1048587125,1946289189,357154340,923155373,-1105562368,1001198927,1962949894,621200912,935264260,357154304,-218098503,247724196,356433671,-1190667586,-201588686,-2128906842,-2130459450,-1190935353,-1494024182,1052707957,69378325,843397960,1052710772,-625060075,33601799,-1587567117,-1991769054,1166619205,-1092930764,-24439490,-1186936957,100073567,57999361,-2097116183,1963000445,33945461,-395414272,1166737605,33129224,104552054,1349780512,-2091442318,100076231,1952382977,69247237,103496171,1140917280,69247284,-351779447,-947693782,17168138,611671808,3439747,103489140,-654900192,1932805161,876872456,3425479,138739968,-972536437,33826054,-2130435933,-1006632435,-1070398339,-947698749,-1173822966,1407718314,-373032458,1150025580,1064244,1055452530,537279232,-1593608700,547554336,876882180,-955759223]},{"sector":5,"length":512,"data":[66117,198087,183468887,-1006090869,-947125155,-150732615,331547617,1166630871,106268932,855932356,197345472,1345877467,-1207545006,567096601,53223049,53347980,-1207741510,567092505,-852162120,807307553,839289859,53787139,-853210696,688310049,117710596,-1017619877,-1895825480,1048585920,1962672142,321632776,-101337624,-2013218621,1673139661,1958742803,329956079,1912607037,69379047,961271947,1979981854,538872068,637603588,17760970,251862542,51512833,-402448706,314441750,1107971,48631436,-1945960258,-209196856,-1006784536,-16485121,889127540,-1895545713,38047492,1296909763,1482184792,-1106833872,1757351918,29538561,-423713549,58769168,-218062919,895989924,180298189,249413120,-218101575,-1173850970,468193990,-1178338827,1085571072,-58693683,-2146798592,-220101892,-351077958,-851331867,-2097381273,-58656908,-940739328,92166,1780386048,-851266559,-2097381273,-58656908,-1948945152,325302978,-1233862645,185838266,-139496229,1978663107,309519,507110355,74843168,69213833,69213835,79283083,-1444162816,208928783,79254339,-1981558016,1526997022,1741505460,1954741376,16548087,-58715276,-2146732922,108168700,-384587078,1944715104,672565759,-388287741,113770093,59966505,1945953512,-66131963,1048626169,1962935333,4170007,3614455,-150732615,537279473,-972721148,33826054,50168,1380974592,52958859,1741506484,393536522]},{"sector":6,"length":512,"data":[1954741376,-1336255761,-1929609214,-58718348,-1342015603,1522792716,1408054104,1073789265,-225709577,-338567541,-654093991,-494808181,229711871,-770970669,-1958542988,-2082960437,125175033,1481239179,-1957641685,-1207752682,1481655296,-850242736,173759079,1131312612,1354825304,1499000290,-469086120,1460014452,526319243,1778814510,-1912280319,-218011106,1978469285,1358452772,378220188,1219756840,-469080115,-58716044,-2131856254,108302076,212884058,1486734329,378220227,12059432,-850242748,173759079,1478260196,1961101904,-335596796,-1946799358,-341445683,-2097381192,-998014604,-2146899194,-764116228,-1341995901,-1544816382,1380974592,672566062,-851069949,-2097381273,1482355316,195,-1106833920,1757352529,29538561,2059314419,58769170,-218062919,-1324167772,-1948200186,284795864,-1610548351,1642360179,32186380,862054032,-1896379393,-388264253,158662896,-1993420237,-351208674,113210,-79789266,796131344,771804648,284892715,-754972999,301695979,-1964440718,-1870730496,-141820109,-611400818,1962981352,1959922438,197257990,-2084145966,-75415357,-529358848,771790312,284900995,247493888,788987423,621200900,750256644,984323,-388823887,-1039938932,1096016,1755570679,1779861761,378230785,-1023998944,561380352,-489486671,426951171,284759691,201386625,-1036316814,113707895,1065,-133944413,329956035,250758632,247724319,572426527,507071236,74843168,69213833]},{"sector":7,"length":512,"data":[-1190069343,-503906288,-1996396381,83978774,-763165696,135570176,135665289,-1007002648,-551263772,-426769941,-139607199,990218704,-149064443,1161538512,-1391102466,1095894471,-1869574000,1095908737,-1179974027,-1510800898,195,1745224448,1779831553,280580353,1509029632,208994058,-141877498,-91504498,-1007114765,-225716082,1465317099,1381061456,521012766,-1962841951,755067414,-628947968,1095936,-661720585,-24382837,-1186936957,100073567,359923713,132599,2105739892,74776834,-187007,-502610045,1511983077,1599626073,1095943006,1769096269,540697974,1987011137,1866604645,543453793,1869440333,1293973874,1734438497,1847620197,1881175151,1702061426,168653934,1296126500,1986622020,1092631141,1702260578,1634681376,1293968498,1919905125,1951604857,1937077345,1869116192,1696625527,1919906418,1378093581,1917078849,979727977,1836008224,1702131056,1970086002,1646294131,1129324645,743719213,544370464,1093485392,1868767316,1952542829,1701601897,1378093581,1917078849,979727977,544165408,1702131813,1684366446,1835363616,544830063,1767994977,1818386796,604638565,1145913682,1702259058,1850286138,1768710518,1634738276,1701667186,225600884,1095902218,1769096269,540697974,1970499145,1667851878,1953391977,1835363616,226062959,1095902218,1769096269,540697974,542060361,1869771365,1667309682,1936942435,543649385,1986622052,1701650533,2037542765,220465677,1296126474,1986622020]},{"sector":8,"length":512,"pattern":0,"data":[1226848869,1919902574,1952671090,1397703712,1919252000,1852795251,220465677,1667845386,1869836146,1377858662,1917078849,543520361,1936876918,544108393,925969969,1919514144,1818326388,1936286752,977346667,539232781,1142956064,543912809,1702521203,1797529658,538970637,1699946528,1919906915,2053731104,606091877,1954112032,168653669,538976288,1869376577,1769234787,1965059695,980707694,1931486240,1869898597,168653682,538976288,1701996868,1919906915,1852121209,1701409396,606091891,1378093581,1917078849,543520361,1629516649,1634890784,1634559332,1864395634,1766662246,1936683619,544499311,1886547779,1952543343,778989417,1936287828,1869770784,1835102823,544434464,543516788,1886351984,2037674597,543584032,1919117645,1718580079,1866670196,1919905906,1869182049,1397567086,1296126509,1447645764,2117,0,0,180994048]},{"sector":9,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[3234381,131081,32,12517375,-569179670,2555904,30,31457281,32047143,39]},{"sector":4,"length":512,"data":[1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568]},{"sector":5,"length":512,"data":[329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,1442979049,544436837,808463922,0,0,788541184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2129936197,-133449154,-1962315249,-1947204624,-1877546216,-772764848,-268198664,1939675275,-754667260,266830059,-1341224104,-1061436661,-1170308853,1913649163,66095881,-351237648,1381011489,-120459125,-1947204708,158571776,-1325396187,-337456380,-268425981,9028107,-1195157414,567086088,-854851400,1048625953,1962934284,201770744,236847360,143374879,520128232,788520168,1006638240,504002305,-1912581957,303835,378258207,-1616901214,194945547,-1962928992,-1156866034,-389870656,266928104]},{"sector":6,"length":512,"data":[-1707179259,74776587,194647689,-16679037,-788273036,194907902,378266741,-771028070,-337061516,-1108819196,1364414719,80078930,1482381658,251580675,-311096418,-1172423741,-2146994677,41220091,-1007107079,4037202,1270480896,1033523720,-1023410176,-1974329586,-1275063530,1512164622,-1325407768,71100927,408783398,1397817138,567104180,444580902,1527152013,3520594,-133962761,1354979418,567095476,339599494,1023767043,242615060,1136271118,-855002105,-1070397919,-1207514288,567096612,220105006,109850112,-1274609649,773967129,1476400034,410320700,-1409253186,225755146,1948269740,1946762491,1963801847,18606342,-1275018007,-1155412723,126484572,-12793602,-1607596939,1397751827,-19363246,1141487811,242360781,302039799,521013364,-385261382,1532690246,346173016,100675072,3016847,-1106796026,118358108,-1190430017,-1527578592,-852033352,804945953,-970060683,1543509254,386319918,-2118231040,6078208,1017956659,1023112201,1022850080,-385649395,1101660317,1948269740,1946762248,1963801604,378609,-1608577457,-218300395,57998510,-477073429,977108997,113640821,1191247889,1470759088,1181382,2048297473,1959922187,-1261765104,1008848142,-1173981697,-1410791122,-33101570,11683764,-855631682,289308705,364511488,-1174178816,1001652316,783950285,-385649911,599326342,104315429,616047053,107264549,118366669,192593758,-852950600,192592673,536969088,1065357429,235631872]},{"sector":7,"length":512,"data":[154057247,-369211928,-1377303907,378150653,-1023541228,567095988,-478871748,1342326667,839143306,-1993457171,-150231538,-1331482911,191859467,-1961863285,1334445687,226462479,-1962381430,525863263,195698313,195180169,195833481,195958409,195038856,196886153,196755081,194981512,-503845582,197002753,197017227,-1310333512,-1948003580,-391384117,2059140473,25133067,-385649632,1049297150,113707966,134052,-401890143,-1662452562,-385649923,113705127,2998,196609735,378208256,-1465709638,-1240596213,-1206484213,45613067,-58398720,195567163,-1465711243,1088875275,-310984133,194774783,957065889,1997249542,190955128,1015022846,-972652999,-347197436,-852839181,-1125547743,49676807,49677046,-789183754,-1997403439,-2012515786,-1274318066,-803091156,46727918,-792132919,-792132907,-792132907,-1997468971,-2012516298,-1593085650,1990396854,196649227,-1593083741,1956842408,190496267,-218095431,-1543045212,195338507,196740667,1055460727,-1676738561,145930763,-1594038808,378208276,243993518,-903148628,197009035,-1174308120,915081417,914951068,-1008203573,18147836,-1274316102,-31339249,-1173785152,-1343747777,16837116,196871879,2059337729,272993035,-1559513437,1166740402,196649746,101430435,-55515049,189106982,-1532819617,1975520011,12839171,195305099,1929144040,-1508996108,195338507,-503887800,195823107,512479371,346033086,1596312832,1930132159,195338612,-2080682520]},{"sector":8,"length":512,"data":[17546302,887625589,855798780,1398212315,1543265768,190679334,166397791,-1579971696,1441270716,195338747,-385878086,-1331561652,-1270971637,158662667,196216377,-1298070665,-396950005,690420778,-2094657211,687870813,-2096385530,766494,90538278,123731903,-2096085719,-1593830819,501943228,196125072,196216361,196353667,856191744,196256704,-1593068381,-1130165340,-88020981,195305097,-1157677591,280234874,-1243078195,14870779,567086516,-386170904,-1070465018,567102644,1195648,-1206750208,382018852,567083021,398073614,-851725312,320244257,-854674432,108446497,-13758820,772170294,997119,221708078,37538560,521013621,-1258307096,-819868340,1364414464,-1574515374,1145308804,1482381658,-1698821773,2091015,-1007097996,1381061456,-2069748275,1514423302,1935170393,127057646,1946158312,1355020519,1465012563,109355014,41290812,-466482000,-405669749,123442571,126621321,126760585,-402158918,1186659066,-84023288,-854851144,-236433375,537680122,121636410,104468340,192153409,121767482,787078261,130026239,1532582495,-356859048,276138760,149698185,-1995276917,-1962348994,-1995721162,-1962348490,-1995720642,-402066882,12843686,0,0,1231123049,1919902574,1952671090,1397703712,1919252000,1852795251,-1541142003,-1157123577,-771242745,-418916601,-116921337,319293959,705175304,544417032,1869771365,1931812978,1769104416,622880118,125108323,0]},{"sector":9,"length":512,"pattern":0,"data":[1701971874,1852400737,1920401511,1852404841,4259943,1953067607,1919950949,1667593327,1631715444,1853169764,1308652649,1914729583,2036621669,1684095488,1836016416,1684955501,1631846432,1107321204,1663067233,543976545,1836216166,1392538721,7038309,762212174,542330692,1802725732,1667584768,544370548,544501614,1853189990,1867382884,1885433888,1459647077,1702127986,1969317408,1375761516,543449445,1819631974,1766064244,1090546547,1953656674,1699881004,746156660,1852262688,1063613039,137297952,1207962125,1342835976,1936942450,2037276960,2036689696,544175136,1768383842,1701978222,1702260579,1864399218,1752440934,1711934821,677735529,1864378739,1919164526,543520361,1291875109,1091079944,168632378,218106381,1918981898,1735289198,1679830304,1667592809,2037542772,1819633184,144113772,1713398821,677735529,1914710387,1987011429,1684370021,570368,621415680,1864393836,1814372454,2036473956,544433524,1868785010,1701995894,147652708,0,0,1635151433,543451500,1651340654,1864397413,1634738278,1701667186,1936876916,1225323520,1818326638,1679844457,1702259058,544370464,1701603686,1835101728,152240229,1701603654,1953459744,1970234912,805332078,1851867913,544501614,1329808722,542262614,1699618913,1919907700,1919164523,6649449,2369]}],[{"sector":1,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1229324288,808469836,1163014192,67]},{"sector":2,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,197132288]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[16013901,196618,8650784,17891327,251267120,2555904,30,29491201,73072679,78774311,39]},{"sector":5,"length":512,"data":[1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365,1019448064,772633098,278144,772109568]},{"sector":6,"length":512,"data":[329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,-1899066116,26208478,190711436,-695286130,-1172922180,-1645737802,15591428,200541942,-402426872,-54655707,81258507,1001707147,930292173,-1274985752,1931595067,-116996340,-1173619701,48826722,-217153532,717161483,201113101,1325710056,1560247680,-967900043,1049165829,686296442,-1172343545,-54654484,76081163,-1578567801,205700612,-956001560,-66324218,-385699829,-54656063,74704907,1337605044,-2145268468,-83102938,84792481,-657391601,-388896559,244050129,-939323946,232525449,231874187,745986347,268499841,12256114,-754667248,512314339,-1833038374,70248460,1001707147,326312397,200869575,1656360082,56879369,985270448,-2131301623,135000846,200218367,-440779852,-2145268468,-150211802,1072234672,1579060739,8437259,-1190265153,-1527578496,719855382,-217153536,-558235381,939571213,31990221,8710145,-167726872,17560582,113708148,137825263,200345287,-1262286033,-31339239,195666624,1203032202,-854873154,378192673,-889320535,567086772,-1274303814,-1021194949,-1962699544,1405256662,567098292,-1923655997,2078819964,1390956035,1447468035,1577289448,24485198]},{"sector":7,"length":512,"data":[312902,-1262264737,-2044605136,51002848,339543666,-1023314173,1136265652,102878475,-883696845,1577487878,44115467,-761067776,26458893,232136329,4047659,-1207733744,-1320677376,-1545547004,-1329394216,154843656,100821225,-852155208,-836859615,-804877299,616040205,34585125,599269837,33798693,-71097907,-1509505482,28376843,906115561,195444352,-1676380928,-836829386,1979792397,-1573455092,531631014,-1342038551,-21049598,-1070377459,-473396308,23128106,1577160936,2615366,200619659,1912631528,3976210,-397477001,914948197,-1078326279,-402164983,-1161625574,28314071,-402530071,-210632627,-133432133,-1996467736,-1022626506,200619659,1442855144,1944589682,-29062398,1952201277,1560051722,-972786184,1577123652,-401829189,2092892198,210943501,1325557480,1560247680,-967900043,1049165829,-1396503092,108268860,-143343606,-1007041714,200881801,-2065130415,1785896192,-1929150579,179062351,1012888768,1309176924,334034823,-2131261694,1567906876,31516758,-1929378618,-1671560876,775750795,-352160512,774782248,2088770677,376766466,989756800,-142134412,29091918,24508295,378439,-236451861,31844353,-225731249,1560233158,1153873267,-113573633,1498284915,162642627,48825264,-115439359,157465099,-152501328,195665920,2088766066,74791425,1076643500,-1261401514,1417121095,1560233158,225583565,-402423923,-2141322857,394805442,79858371,-1086671808,-961868290,1330577413]},{"sector":8,"length":512,"data":[200883849,-1341550406,11528463,-1957603498,468233470,-1085188352,45680939,1504637440,-1342016161,-371021312,-1425211208,-1017225383,108159292,41384508,520036396,-389870096,326369380,-1409274904,192154940,-277561334,963981116,-152507570,51115014,175768180,200541942,2046981153,29016833,-352210934,-1084780470,112789797,1974399488,-2082867440,-1287059775,149148161,1594618910,163560131,-1274151233,-1411348945,-956299834,-32769786,-352210931,1017942038,1007449101,-1393068753,16663751,-1010824704,-117314568,-745616500,-1911119684,1354993371,12261747,-1014102528,443942,1659372032,4909056,443942,-167313152,17560326,116792692,1946684403,210943494,-151198232,67891974,-54655372,-52893685,1492960232,195430134,-402426369,1286865029,378085837,-1169028105,-1705899017,61,132694874,-1382400,-1023409688,918180432,-2168823,1388533850,-402049862,-1017446444,-117314568,1945934928,1017969921,168064092,1324840384,1174565789,1482439750,-469040012,2088813561,-1007142145,1975519916,1354977019,-2146137518,246694378,1482301901,-1431547709,-92946422,-2144943272,1952251773,96871941,1354975068,200351371,-166909791,17560582,-1073020811,-1559996533,108334073,-1946187544,1843921495,-389850881,915144562,344656881,-385921048,1676149583,-10426113,-326434621,-1959990141,448026068,-359980595,201000646,205699662,113690931,-401601627,208797776,1508430731,-387288574,-437583694]},{"sector":9,"length":512,"data":[200541942,-969444350,1309408006,-1190580806,113639440,-402650203,577896488,-2030024472,-851725094,1440384801,1577035752,-1274465862,-400437957,-712310713,567089844,-1956786453,1337246693,201008774,443687373,-2078980470,1963697414,1959332589,1958839300,509513189,1949187968,1455683805,-1556182185,-386692341,216596248,1049186303,1583287203,-1957210429,1309385526,-956383000,914948100,1583287203,-2141825085,108265532,-117934938,1031802859,158660864,-128172672,-469040267,-1017159943,-571976111,16443392,717117298,226279181,200883849,1979697896,169589256,-353827408,-1261007875,-853495747,-1957989855,226278128,116836659,1947208692,17098755,567098548,846395531,-1207930136,-561293568,1051992525,28844493,-840987817,-851528671,671547169,-1017553395,-1174388504,498076024,199756779,3401728,65537003,-40900352,1504976662,517682003,119655686,11819807,200869575,1320815996,1946500105,156154381,108268604,-1173620317,381880899,-1269673953,-1172189890,1102318972,1482301901,517092291,232529550,-636581066,-1958759411,1914818014,-1665057879,-1958693743,1914818015,1925266333,-529228409,-225721569,226115211,-386011160,1623129571,-868316405,-36050931,-35723185,-790039925,113755133,226233337,200357515,-167769925,67892230,112919413,1964018432,-44636152,1726487787,-46208771,-1677653016,-1644342808,1979314290,106203914,-386061336,-1007092414,-851246920,1124186145,-18775727,1495387647]}]],[[{"sector":1,"length":512,"data":[234797763,567089844,113699467,860752891,-1526282551,1119490059,-31004660,283643250,-1158909184,145754426,-2080599831,763710,109971139,1049300438,-208990764,-1929356568,-1515907466,232013449,232275513,195495679,-225721593,-401736001,-21102529,-1492219123,109970955,-13431338,-1957210543,899551,1583326963,1494318477,427159264,200541942,-1928367072,1988956031,1923611928,-1492748539,-336067725,134019329,230248899,178957312,-201662272,-1262265942,234797594,567143051,195497611,401143347,234797568,-959892655,1309408006,1509784552,-471334029,-1008213251,234798929,-702640610,899341,1587868502,521237645,1381024601,243317334,-854848840,201373729,-225762867,-1073042106,-1978239751,-80942908,1543911982,772437003,190645818,167933433,1482317504,28856515,-1205744372,567086080,1163051864,1128352848,1700143173,1869181810,775102574,673198130,1126181187,1920561263,1952999273,1667845408,1869836146,1126200422,779121263,943272224,824192053,3553337,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351984,2037674597,543584032,1919117645,1718580079,1347633524,155472471,707668512,3026432,168624135,1850277888,1717990771,1701405545,1830843502,1919905125,1665204345,1936942435,1852138528,543450473,1931814688,1632632871,1847617652,1176532079,1684960623,623321120,2579571,1970499145,1667851878,1953391977,1936286752,1886593131,6644577]},{"sector":2,"length":512,"pattern":0,"data":[1635151433,543451500,1986622052,1886593125,1718182757,1952539497,544108393,661857575,1952534528,1869881448,1869357167,1224763246,1818326638,1881171049,1835102817,1919251557,623321120,1392519027,1668445551,1634738277,1914726516,1769304421,6579570,1713401678,1936026729,1970234912,538993774,661857575,1918980096,1952804193,544436837,544501614,1886220131,1651078241,1174431084,543517801,1852727651,1646294127,1868767333,1684367728,1953394464,1953046639,1718379891,623321120,1426073459,1886938478,1702126437,1329864804,1917132883,544370546,1342202917,1936942450,2037276960,2036689696,544175136,1768383842,1684086894,1735289188,1818846752,695412837,1867382816,1818846752,1629516645,1684366436,543433984,1701603654,539587368,1701078113,1092616292,1852400740,1931812967,1681989632,1931812964,1495801919,539577903,1701990400,1629516659,1797290350,1948285285,1700929647,544106855,1819305330,1852400481,1768300647,1932027244,1308631081,1768300655,544433516,1819305330,1684366177,543433984,1701603654,539587368,1819305330,1684366177,1699880960,1667329136,543649385,536900389,1819305298,543515489,541029157,1311725864,1526734889,-1861582326,-1391812086,-418726646,218822922,1225464587,1919902574,1952671090,1397703712,1919243808,1852795251,604441101,20057]},{"sector":3,"length":512,"pattern":0,"data":[0,0,0,0,1610612736,11,6029312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1644167168,735493,0,0,6044160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,973078528,92]},{"sector":4,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2]},{"sector":5,"length":512,"pattern":0,"data":[23747149,4,65568,3801089,1595277770,3,30,1]},{"sector":6,"length":512,"data":[-1271988224,-2044605136,51658208,565842036,-1273033214,102878473,3604270,11586304,567097268,35031086,8437248,-1396100100,1223215242,104476160,-160104446,1006649064,202732587,1970420768,113651209,-1871576664,2109661419,8382722,444206,-402653184,808189979,154979442,-1952921481,702680,2553646,784532224,-352321373,1224991714,777569196,1667,1048784386,1946288128,251604485,12255232,-850873328,185037601,-336169509,-661745617,78758030,-2135301165,539015168,-218103617,16956075,-377369717,-617414398,567099316,-936652797,-1073019276,401338485,235028414,-930370273,45864587,-851397632,-1274957791,-1960719028,-2117432358,-1342110999,16957210,24489714,-2082919605,1065419499,141822477,939705219,1124168711,-952177781,70,-1090453317,229638402,-819212917,1974399553,171802629,-947128459,-1020571576,1197148041,-487914781,1991,-1090359411,-544538368,1065612171,-385649408,872611997,-1073019765,1465275508,724499339,1996488710,48646,-1962868552,371928597,108462080,-1174404929,-930414336,41075259,53398155,771751998,13827,-1833217965,-684807166,-1977163638,-684833019,-236855238,1583307608,-1036320139,-561272717,-208952085,913635131,1465259147,734891005,1324714959,-100401525,1610392819,-234662050,-204829866,1465867940,-905720437,-784216533,67013609,1604711410,-28915906,1023606784,-1073784855,227213568,227277059,168625607,1962998147]},{"sector":7,"length":512,"pattern":0,"data":[16956147,-903098997,-1275067973,1914817856,1958820612,39632390,855555305,-850611008,1380930337,1226848852,1919902574,1952671090,1397703712,1919252000,1852795251,455346701,1380930304,1226848852,1718973294,1768122726,544501349,1869440365,168655218,1330839583,540693586,1970499145,1667851878,1953391977,1936286752,1886593131,224748385,1224741642,1818326638,1881171049,1835102817,1919251557,16779789,84148994,151521030,218893066,286265102,353637138,421009174,488381210,555753246,623125282,690497318,757869354,825241390,892613426,959985462,1027357498,1094729534,1162101570,1229473606,1296845642,1364217678,1431589714,1498961750,1566333786,1096834910,1162101570,1229473606,1296845642,1364217678,1431589714,1498961750,2105310042,1430486910,1094795589,1162167105,1229539653,1095057729,1330597697,1331254613,606348373,1229005860,1313756495,-1455446106,564964266,-1313856990,-1246448718,-1179076682,-1111704646,-1044332610,-976960574,-909588538,-842216502,-774844466,-707472430,-640100394,-572728358,1407246302,-437984286,-370612250,-303240214,-235868178,-168496142,-101124106,-33752070,65534]},{"sector":8,"length":512,"pattern":0,"data":[]},{"sector":9,"length":512,"pattern":0,"data":[11164237,327700,13172768,43253759,-2105604096,3705,30,207028225,15466496,242876960,299827200,305201152]}],[{"sector":1,"length":512,"data":[-1957363712,1751276,1460454376,-129579178,-175439872,-971313533,1445986628,272033878,-1341864829,-1977289116,-316014260,1183432963,5284342,2096514617,5415176,2130069049,14465034,93775952,-16595837,1182991438,1187447302,-352321290,-161576173,2123097041,-399376634,-998044963,-163119358,956581515,-444795322,1342644408,-2096611608,2122515140,108331012,-385595160,2122514661,1920205316,1342189496,-16359797,273147959,-1996176253,-1072956858,-1414002059,837308416,46433029,-1962516853,792690719,-1414002059,501764096,46433029,-2131075445,1950613887,13285386,84600912,-2096970621,1963000958,-92864754,-2096121624,37552836,-1207274496,-397410133,-998046484,-94467326,-956299322,-1978,1586176235,38243078,-1946532215,792690904,2139099253,-478919679,1342229176,-2096840728,2122515140,460718072,-16359797,12904503,167953539,-1204259392,-397410102,-998046560,-1205015806,-1957691345,2013202014,261351426,184861827,-1207274304,-397410133,-998046592,106859266,-16615425,22210615,1577370755,1575324511,-326412861,-402651976,1183517520,1183401988,5552380,-62485680,-28931776,83814480,-1962621821,-60913192,1962950528,-27358236,1946173312,74907460,-2096173848,1077936836,258074704,-1996307325,-1072955834,-1715991435,367546368,46433028,1996431339,-25755900,-2096428056,1454900420,1996443648,248572158,-1962621821,1183448646,71731972,-1017256565,-1192457387,-773324716,74907402]},{"sector":2,"length":512,"data":[-2096195352,37552836,-1962314496,2139096158,91503105,-1578516429,74907392,-2080418072,1183384260,-1965520124,-397371385,-998045483,4271362,-1918089591,-11489722,518564982,79987463,259309578,15812343,-402099184,1178273347,-1207274068,-397410102,-998046848,5814274,-1371108016,175564880,-1979399037,1174449222,-45693010,1084227586,1178179591,855932076,-1207702592,1183399936,121676017,-1404683880,-1070398084,-16127079,468233334,46433033,-1980545399,1183708502,1996443822,117565612,-1207647101,-443809793,-1957313699,10926316,1443497960,1353467533,-402229505,-998046670,74907396,-2096250648,37552836,-1962314496,2139096158,175389185,1342229176,-2096960536,1996423876,228583430,1023591555,326434818,-2147066229,1966735743,13285386,46852176,-1929198461,-397366202,-998044291,212226,2122323573,108346029,1554939520,-893908364,-1511501824,46433026,1350566072,1353467533,-2096505368,1950352580,13285381,-1070394389,-1404662448,162130000,1074054275,-222819723,1978159104,46433026,-402360577,-997982717,71731458,1353467533,-2080508184,1183384260,74907398,-2096645912,1996423876,128968710,-1962752893,126485598,4271512,-1946401143,126486110,4271512,-113015,-1142358922,46433030,175423499,1342209208,-2097013784,1996423876,111470846,184730755,-1207274304,-397410180,-998047228,-58817790,-1604748288,966264641,1350433862,16678531,966281852,1149107782,-402229505,-998044515]},{"sector":3,"length":512,"data":[4406530,1183528573,-62506498,-2037567884,-11468966,1189674102,79987461,477413386,990147304,343211078,10307319,-15895120,-689373578,46433029,175489035,1342229176,-2097046552,1996423876,206563334,1023591555,309592067,-402229505,-998044607,-1947170046,1086719582,1996423423,1518767366,1911050495,79987464,-10844531,203417680,-1996307325,54372678,-16550656,1187490126,-11534179,669580918,46433031,-1986050423,-92036778,1024423423,175505407,1342229176,-2097074200,1187447492,-939524189,-23226,-10844531,-59310256,-2096828696,-1956772668,1438866917,1421405323,133621760,-28915882,803930112,15681271,-2094697456,1963129726,-79233277,-956598645,-1929335742,-1957647290,1090911814,1555582976,-1552384,113541898,-1912715521,-11490234,1189674614,79987460,-1066024950,1575324510,-326412861,-402632008,-1957296224,2139096158,192231937,764938122,1183383616,-955913218,65094,-1912703233,-397365690,-998047375,91570180,-335544392,-1371108017,188213328,1023591555,1047789571,1353598605,-402360577,-998047685,1958742788,74907437,-2096424728,-259325244,-2147197301,1952251768,115889095,46433035,1116401803,1183422638,1958743038,6045107,-1070354828,1575324510,-326412861,367575091,74907399,-2096440088,-11533628,1996424822,113371140,184992899,-1207601728,48955393,-443826125,-1957313699,-390056980,1996424936,6862852,169404496,-1207647101,-397410303,-443872700,-1957313699]},{"sector":4,"length":512,"data":[964844,-972634136,-1961168058,1183385670,-230257160,-230257328,171632720,-972766077,-1957760186,1183385158,71732214,-1913108855,-1924074938,-397348282,-998045156,-25263356,-1207602176,49020927,-443826125,-1957313699,964844,-972654616,-1961168058,1183384646,-230257160,-230257328,166389840,-972766077,-1924140218,-1924074938,-397348282,-998045224,-25263356,-1207602176,49020927,-443826125,-1957313699,178412,-16370712,1996424822,80340996,-1996176253,-1072955834,1996426869,166193156,50513027,65733702,-1946270069,1438866917,247000203,100853760,-16490869,130417734,-213465508,105286215,-1946663288,1183384646,-230257158,-230257328,157739088,-2096839549,1946222206,-18427,-1070398741,-1017256565,-1192457387,-1041760244,-396994811,-1986526845,1586232390,4161540,2139101812,343226881,1352140682,-2096899864,1093468868,-62486272,33834627,-1979294069,1090845766,1586169736,21480966,73304890,1968979840,1183535884,1346387974,-351959064,-62485689,1183535168,1346387974,-2080417560,-1073019708,-4716940,18344447,-2147197301,460587071,-402229505,-998045419,212226,1824001406,1996443648,152889350,-16464765,1996424310,152102918,-1962621821,-1259796874,-1191277824,-1924136850,-397409979,-998046797,200313604,-15829514,-756545930,46433032,1979969675,-2012968442,1547501126,1187382389,80108798,7387136,21335376,158591056,184861827,-1978567232,76086854,-437758122,79987460]},{"sector":5,"length":512,"data":[1575745419,1342206648,1342260621,-2096541464,-1073019708,1183467125,-1979414274,-28932091,-1962932794,-1991768506,1975056454,1183535104,1183400184,1508397306,79987710,1586092171,4161784,1183507573,-1962571522,1178142278,-385649158,2123104028,-1662300166,-1996601718,3964932,1156121460,108462079,-2096616216,37552836,-1207077632,-11534217,870844022,79987464,-402229505,-998047047,1589654274,1575324511,-326412861,-402649416,1187382320,1183652339,1183666418,-1444392718,79987463,720520842,1575324644,-326412861,-402645320,1448543244,-293341813,21284382,-129594030,-396994992,-998046887,-128546042,1141096491,13796098,-1980610935,1187509334,-1962934026,2126837342,25831154,-2012971381,-163119359,905346691,1600055678,-1017256565,-1192457387,-1175977954,-1957275901,518947829,1375814854,1358448269,115889750,113541891,737695371,38011840,-1996434813,1451881030,-163133452,1586167808,75402230,2126774666,25700082,-2081011969,2117465726,-1956684055,1438866917,112782475,57075712,75400022,-1606452224,966264641,914162758,-150974024,60359790,319239686,-1996015594,1451883590,-96024578,1586167808,-59325190,-1962898906,8914550,-2080749825,2119301758,-18199,-1070398741,1575324510,-326412861,-402651464,-2091515120,2080375934,121741375,71711128,1371027069,74381056,906363801,940970759,-62486265,-939633015,64070,-1946526069,9045622,654079684,1191116936,-92371974,-1192657327]},{"sector":6,"length":512,"data":[49020927,-1956724685,1438866917,2092493963,45803520,-666464938,-1912977783,-11500474,988284022,79987711,1031061514,13059831,-1959365200,1452001606,-62486069,-939633015,54854,-992584053,-1977156490,-92894464,1191116936,-696351786,-1964409311,999872582,91554886,-352321096,1589654274,-1017256565,-1192457387,1441267810,-175417854,-1922896253,-11489722,-689437578,79987710,527745034,1141441735,1074022027,1442989193,95873110,-150682493,-2147421882,28837236,855829248,-443851072,-1957313699,6469868,1442975720,-293341813,-1371107998,74907472,-2080468760,-1073085244,80160372,1183532041,1149845508,-396995070,-998046352,-247007484,125140992,410871,-1207602174,48955393,-1956724685,1438866917,247000203,29550592,8011392,-954305280,939586118,-1996007752,1183709254,1183666418,770199794,79987461,7997126,1781989375,1748434695,74907399,-1962908952,1438866917,45673611,25356288,74877782,76156651,-397351894,-997982295,1174702082,1962949760,71732205,1575324510,-326412861,-402652488,-346685096,108432153,1586171115,121154564,-1014299531,1015026411,-1084160,1586168902,4161540,-1070342283,1575324510,-326412861,168052363,1007515108,1007055457,738359162,106888992,-1017256565,-1192457387,166199338,1183667713,-96040488,-1962467167,-1996021226,1451880518,-62486030,-956410231,-335554490,-263812298,-1207536320,-342228993,-263812295,-1980606837,1451883590,-700004354]},{"sector":7,"length":512,"data":[2122514432,327098838,-992584053,-1977156490,-92894464,1191116936,-1964512298,999872582,-1049295802,-1946401141,-1956708778,1438866917,1448602763,75402014,1569392011,72190722,-1962519157,1979648117,142510858,1569588622,567107334,465509975,-1948283390,93063294,-1962523249,92866174,-1996333687,1435042893,141920518,1913275791,-336186620,108324872,-1962933826,209029381,1566531103,-326412861,119428695,-485994869,-1948677329,-141884290,-4603853,1101984511,-885270025,-880082314,1988886155,-1968770298,-919339196,2013218106,1090876421,-772341013,1600045451,-1957051555,1926769628,35535626,-1962642943,-371064861,-1957362945,508975084,108956423,-1070336117,-218103879,-638107218,-1962639733,-1952123945,1566531266,-326412861,-1207675253,567100160,1190530930,158597638,1946272246,218478596,96266745,854362965,809404671,105286401,145354034,-1258130432,791578656,206081,1962935101,108429573,79298561,-853887999,2603297,-1274784117,1931595086,10217731,-1962522997,83895752,1963262013,285587463,91548153,19990214,11112705,-1962183678,12059734,-383660733,61407392,-1453886464,1383432192,32311030,-1337232000,805702146,72780545,567098804,-1198274702,567100416,1971372790,-18131,45666699,-148779710,17087193,567099316,376750091,17055360,-149981926,-1194226727,567099906,1085589811,1051992525,1183457741,167977990,-1962856442,1035207766,997335501,-150512407,16778822]},{"sector":8,"length":512,"data":[45614709,-9901824,19990214,142016256,1493669096,839405193,805762797,125173505,33965815,-2147257088,1452015329,-851659772,-385649887,116786354,1979646256,105314055,846528514,-851528557,105286177,101319460,1451950384,-851594236,-153587167,16855302,1190597749,1946157320,29982733,72780691,-851246664,-555117791,35372806,145035,-25037013,57806848,-99614530,-998123634,1945831294,21620995,-72575,975604022,646526465,-963968712,-523041615,916665928,-852446207,-1331481055,1929526273,-1070391766,-1172369840,162795211,1154163149,840979279,1864380462,1634476146,544367988,1970365810,1684370025,52693517,37128695,734235648,-1260652578,908184906,27795084,2897547,12064286,908184885,20061833,872844342,-1205924351,-88464128,908184847,49286795,-986307869,-1945964026,920335322,49159935,-857144461,113587712,-628358410,905970619,49159935,-1073996025,-2135358726,869214983,380302272,-400619754,79365962,1140897792,175251917,1954595574,-829456379,2034974721,79882476,-1157357592,-75431174,141755130,1528299347,-219462845,721422009,28491489,118946955,-1880578829,-387108093,-397348764,168624284,1667331155,1986994283,1818653285,168654703,1766066701,1701079414,1920099616,168653423,1816529421,1769234799,1881171822,1953393007,1953459744,1634692128,224683364,-1173180150,-315486302,45817614,-851397632,-1205922271,-397410049,280036344,-351292230]},{"sector":9,"length":512,"data":[-1172459035,-555020348,-2081649835,1448543980,1442979006,-2096779800,-125107516,1342588557,1443133183,-2096711448,1183385284,-396929286,-998046188,-96040188,-443850914,-1957313699,-1371634708,74711041,28186367,-402360577,-443874400,-1957313699,-1957275668,92996734,-1962779253,1435173965,141921030,-854950517,2123061025,-1996125946,1300824669,106268932,-1895271031,74582597,149681715,-1107139096,92995585,1577874825,1438866783,509078667,75401991,-4603853,-1951468801,-146784063,-1017290792,1475119957,-1962467754,-678755202,-4603853,1336865535,2123102091,-1176532218,-1359806465,-1948649663,-202142722,1589808036,1438866783,-1957172085,119407742,-1070342261,-218103879,-638107218,-1962522998,1336865531,41157944,-947126477,1438866783,1586228363,-28344316,1575324417,-326412861,-1933879466,4162305,119417205,-402651720,91554195,-342245325,-31178716,-1560179549,-946470514,-2097151740,1153893574,-1979711746,-1962831306,-661912498,1038663822,-1956749568,1438866917,1448602763,-1962641781,119408254,-1070342261,-218103879,-638107218,-1493959797,872367242,-12240183,91489650,-150803647,1589742545,-373072545,-108855093,1106801646,-1946230400,-1375993225,27852427,994591348,-1961528383,-1376779312,880017832,33931779,-1980265728,-420741564,208993931,1284110595,1220619262,99288457,1291778307,-1933145090,469402074,637891586,26877580,-1023246455,-1643723226,-29556223,-1960479489,-1376779266,-227278424]}]],[[{"sector":1,"length":512,"data":[994639499,-1950518335,-1376779312,-495713880,33931779,-1980265728,-420741564,185091979,-1912310592,638839768,27135742,-661909388,1946295101,512632325,931856790,2005646827,-390057210,-969211815,19139956,-392675264,225706061,-385987074,91488267,-347189610,-1715457126,1166758339,1946265854,1237854979,-4570815,372975231,74842524,-176821551,-972832373,-1039985294,-755561102,-970210781,1962937576,-774703352,870675946,1388534208,1960017,-1957226380,66096126,-29046798,2005532670,735480582,1435060951,1515804926,860902339,1381113554,112720,-400619952,-998044464,-359672,1952143903,-1009644798,-1070397326,-1017256565,233309811,-18432,-1017256565,32039986,-1197292800,1977879041,-1338081245,225575681,225649212,91365436,132842928,1980972176,-1156337662,-1730739730,-1023300957,-135543670,-2081649835,1448544492,28718731,213391339,45633536,889147394,-2080814360,-1073019196,-964491148,3965698,1015276661,-1959169024,214401852,16664263,1191545344,-96040552,92937451,16727448,-1070463883,92930795,-106869,-2021065146,1325334990,2122532858,-562757382,1223,-443850914,110084957,512623120,-919404120,-376716917,-1958086261,184560694,-1912048394,1169093318,1174042030,-31178601,-439222901,521585923,-1946613784,66882511,384601085,870223367,232999414,1157660297,178957381,-486902336,5147123,646520598,654246326,-1957363184,49986540,50002817,-11335565]},{"sector":2,"length":512,"data":[1128487703,-1679232277,1961101826,75399178,-972786432,519963718,20059845,-853213000,243998497,132317936,-16776517,-1962742242,1286865990,110043597,512623122,118882728,-1409253186,651309976,28327552,1348825603,2885262,-930365389,-125054473,942059250,-2080803579,-930413625,-141831689,1191545382,1960852033,1948400660,1946762248,1965046788,118905067,-352288322,-30716117,-243990773,1531105163,-1056717941,620757765,-533987330,102694027,-217639393,-1440698204,-1105212533,250282113,67422347,-533987804,1136196747,-1527534816,-1951743605,1344214772,-24388469,-1073042772,574373236,-11133067,-1409175034,779403274,125116988,1560247680,-1437662091,-968364565,-352256187,3664085,1448005748,-1308164282,178957313,-402099008,-176881627,-1951735317,994790388,-1391954957,1149831047,-1947014146,1976699868,-1995964670,-16665562,1006768678,1006793737,-1957313760,788973292,1996423169,6285318,105810265,839145099,-851659539,-1957858783,72780760,-851246920,29488929,839152896,-1325208631,105314064,242565120,411383,-167086720,-2147357434,-914357387,789449344,29982721,-851181384,-154957023,57966786,-2009020032,-972960113,113287,1442660841,-1398674293,-1949239551,-1021115298,-1073683583,58032296,-1996371072,-1017314210,1458342741,-2130413941,1963072766,105182780,-1976142580,-1952970940,-152841768,16954503,1153902453,-1979506684,-1952970940,-958148136,16954503,28182215,1153900398]},{"sector":3,"length":512,"data":[-1962803198,76088388,-352321096,889094452,-164858622,1963722308,121932326,-774337640,-1266157853,393543938,1342308536,-2080707864,1149829828,1958742788,105676806,867822344,-443851072,-1957313699,1988843244,75399942,-2125696000,1963072766,121932325,-2098704232,46433032,376750091,144173142,-1979530109,-1952970940,-958148136,177287,-25093397,460653108,142338134,-16595837,2062025844,46433274,-150576000,76136499,1577337993,-1017256565,1458342741,901379635,-52153856,-488623444,1442087163,3477246,646448757,300613684,225764362,-1157613894,431554562,-851397632,-1564462559,-1956773835,1438866917,1656286347,-169416703,1988843095,-1568240378,50766846,-1560000885,1183515390,50504456,346275891,51553027,1962949760,21620995,1948597376,17492227,51119815,-1070399487,-1560081757,245564154,50373379,-1560083293,413336316,52077315,50857671,854261792,1965898880,436666118,-2144867581,209005372,50988799,50071239,384499712,1965046912,171868941,175439875,50071295,117376235,-1975123176,-397371388,-998046201,1975520002,280516287,-1863823357,79987461,1015083147,-15567570,1174602758,51165270,91875408,-1962621821,1815904496,113706869,131840,3964998,-1595341963,-1744532992,-23165303,1946174781,4668682,1480394100,-16157440,-2096956922,553557638,-23165301,1023435565,1047986197,781434883,405186559,51250943,51906247,179830784,-2014818304,46433024]},{"sector":4,"length":512,"data":[146297067,-1192039680,-303366128,-397361101,-370474592,-352321096,-1632174091,35580158,-24388629,403980779,404297712,404297753,404887586,404887586,404887586,402790434,404887586,403445794,401348642,404887586,1048778759,1946157844,51552517,-381280021,1031863974,1191605285,1962950016,734497781,-396996410,-998046946,-369652988,1600061066,-1017256565,-1192457387,1105723416,-2091493388,1946813566,235339524,4096771,376700931,50470539,1468729227,-129595134,-2080745847,67305990,1048783339,1946157838,35556112,-1995994365,1187510342,-352321286,35556109,-1727558909,-1980217719,109312598,-2097020158,202814,1183518068,-96072712,1183516020,855829252,51815360,50738827,51265155,-2094369536,2097216126,75399972,-971541238,-1958335228,1452013638,-2082932742,-621346606,-1980217719,1187510870,-352321034,-163133691,-41222144,-15143037,-11074442,1996487286,77064440,-2096577405,197694,-396943244,-997984439,202279682,-1983370493,82574926,1177552070,-113013,-1072955826,92992127,1048773768,1946157818,2086747143,539787267,2105558854,-428539649,51265155,-1592494848,101384970,192152316,16154243,28837237,855829248,1441288384,46433026,-443850914,-1957313699,571628,1475548136,134661974,-2097143805,1946158206,114192,-2096954719,33751558,-335788407,35556147,-1995994365,109313094,184681218,-955943488,48168006,-386107649,-997984603,-2081387774,197694]},{"sector":5,"length":512,"data":[104401524,74646284,51132043,51396235,1048837675,1962935066,250107655,46433025,-59310250,-2097058328,1048773828,1946157850,-152545529,46433024,-443850914,-1957313699,178412,-1577941016,1183384322,71205886,108331011,51119815,922681350,922682106,1996423948,104267524,-25755901,-2096940312,2122517188,108291844,1191476867,1048778869,1962935064,205423377,175374339,50738943,-2096946968,1048773316,1946157848,205423377,175439875,50738943,-2096950552,109249220,-955776254,202246,51028224,50071051,1996427892,50981118,184730755,-1207601984,48955393,-397361101,-443875036,-1957313699,-390056980,-2091453976,201790,512440437,1342112510,41911042,-1978565632,512427078,931857150,76023807,233563178,50214655,-402360577,-998047027,108347396,51644159,117376235,-1956773102,1438866917,45673611,-241506304,1048794711,1962935060,74877777,1249834507,512439275,1342112510,41911042,-1609466880,512426760,1066074878,92801023,250340394,50214655,50870015,-2096991000,1967129796,336002820,1321634563,-964706293,51658371,-1962445568,100729926,1599996690,-1017256565,-1192457387,837287938,-1957275663,2123039862,339641094,1282736131,512439787,1342112510,41911042,-1978500096,-31552764,-15758590,-1999009017,-337368569,-29950194,-1744532990,34334800,1074054275,117376117,-1958345964,-1073000505,1048822901,1962935060,105286407,51512833,-443850914,-1957313699]},{"sector":6,"length":512,"data":[702700,1475397608,104237910,-1983892733,1183448134,272534520,2129155587,46433268,737822345,75377656,-1325197663,737727235,440304632,359989251,1965898880,138314512,158674947,-397371220,-997982572,138314498,192163843,125763339,52051587,-2095483904,1946158206,-129564922,-2097127704,202302,1191118452,7334140,52051587,1462138112,-2080462616,2122515140,158597124,16285315,887620469,373195520,158597123,16547459,1122501493,-92864768,-18290602,-2096839549,203326,113708404,2097928,-26482601,1577239683,1575324511,-326412861,-35078093,171869167,74711043,48966576,1352147120,-1946289176,1438866917,-1070338933,-1192239128,-397410256,-997982744,373195522,359993347,49954435,-1341885440,-1341985960,-397371272,-997982772,1575324418,-326412861,-402652488,1448603564,-2147060085,242559548,50470539,50464387,1178569474,-13419797,2083536000,960266291,1043934847,192217860,1966095488,134661894,-1409273853,-774927464,65130977,65130959,820609992,1015085451,-2147124176,-478267076,-1996202357,1590070079,1575324511,-326412861,-402652488,-1101598908,233505509,1178076298,-1207601916,149618689,3964998,-1070338443,1575324510,-326412861,-1947053336,1438866917,1223224459,1575324658,-326412861,-1947058456,1438866917,887680139,1575324658,-326412861,-1947063576,1438866917,11791499,1426228201,-326898549,-1957275900,1149896310,-2086037498,-167349248,1950352964,-18426]},{"sector":7,"length":512,"data":[-167716119,1946224196,105676806,-2131825888,-2147350964,871302756,38046144,2122971275,105182974,-1978698488,-1952970940,-152841768,16954503,1015754868,184843307,1460829951,-1979419393,1352140612,-2096989976,1183385284,71601150,-956004032,33489476,-1979425653,126354502,1156999915,1316291590,35454593,1149906293,-397371385,-998047639,1975520002,-1375287499,-954241535,52429892,-1744354166,-472786805,45385670,553961217,-1195840765,-397409792,-997985677,71600386,108314635,134630528,1283496939,29295622,1183667968,1149915140,-397371385,-998047239,-28931834,1962835513,-13506301,704923274,-1956684060,1438866917,1586228363,352027396,-75296387,-166953984,1073860231,28837236,855829248,1438866880,-326898549,-1957275900,-13433738,42133590,-1979530109,52692548,1014301244,134628598,1149898613,-661940217,-2013862959,1946223284,721718055,1183384644,2126515196,1962889243,121932292,1994936472,113541889,1962690107,105676807,-16608,-1996209013,38061828,-947191808,-443850914,-1957313699,82609132,348018263,-335596798,105155095,8628632,-397014156,-997982343,24395778,147227463,47986233,-947133581,-443850914,-1957313699,106387180,556675,985610357,106334977,1208239755,1407715189,-349736448,-1976136888,292833281,225769275,-1996340085,-397013946,1935540282,80118576,25886337,-771029901,-4716939,501979647,-1014769013,-1310994161,-1259613437,1914817864,76124905]},{"sector":8,"length":512,"data":[-1996335991,855738934,1583286208,-1017256565,-1962127733,38550007,-964490124,-1963032316,-101550847,-628408341,963779587,-1047604341,108394299,20323897,-1014815117,-774123249,-773074453,1979137003,-1579613431,-668270168,1253359758,225583565,74839867,20321929,-1962637422,1448592337,-1962258805,1451951174,142510854,-66642345,1958742675,184124179,-771027339,766511737,-2082736214,-621346606,865269643,1958742994,-1812859134,-2020412937,1009779923,67270201,-1031034329,-495598837,-1404107384,1149764998,-147107841,1582888306,1438866783,1586228363,-829950460,242491393,859964088,-841905207,-385649887,-2013859318,1971323342,8513795,-1962389877,119408214,1476182067,-1947169962,-1201282054,-1359855606,-1957612939,1237986255,567087331,-1645214820,162792563,-1073002005,-1186582668,-356909054,-851397630,-1274776799,188017417,1494906048,-974399605,735021905,-1675506230,1939730435,-351685628,1975520026,-829950442,192167937,-2147066229,58006079,-117117960,1495009464,-963968398,2146000734,139365361,-1274653045,1931595072,-351685628,200008685,-152603200,1073860231,-628422028,1964654464,-689178621,470333689,-1957310229,73305068,-821663872,50013,0,0,0,0,0,1766596675,1918988898,539828345,1126777640,1920561263,1952999273,1667845408,1869836146,1126200422,544240239,892877105,1968046336,1881173100,1953393007,1629516389,1734964083,1852140910,658804]},{"sector":9,"length":512,"pattern":0,"data":[20971840,6029404,6044225,540697381,622870077,2675,684837,6029404,774766638,1543527424,0,1852727619,1394635887,1414742613,1847615776,1870099557,1679846258,1702259058,1953451520,1869505824,543713141,1869440365,1224767858,1919902574,1952671090,1836412448,544367970,1881171567,1835102817,1919251557,1850278003,1768710518,1634738276,1701667186,7497076,1868787273,1667592818,1329864820,1702240339,1869181810,1632632942,1847617652,1713402991,1684960623,135659520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,539,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20578304,0,0,0,0,8192,0,0,0,0,0,0,0,0,0,0,0,-2122252288,65921,0,0,0,0,0,0,369098752,219677186,202116105,-63481,302846719,1128005378,1279870559,1313431365,20294,0,1312,66848,0,16908288,0,33947648,0,58982400,0,67239936]}],[{"sector":1,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1848115884,694971509,539831040,168624163]},{"sector":2,"length":512,"pattern":0,"data":[1125222889,1702260335,1684370546,0,24402509,524297,32,9961471,1992294806,2555904,30,6291457,7733287,17039399,49283111,49938471,50528295,64946215,77266983,39]},{"sector":3,"length":512,"data":[0,0,0,0,1,0,536870912,858927408,926299444,1111570744,1178944579,1684234849,26213,0,0,0,0,0,352321536,1364350208,1448562771,-326427130,650053390,376343296,7768894,-85402829,624733185,-1073074060,-1108867724,-386733311,119472601,1532518238,777869913,2229903,604409646,-13740032,771761206,2242303,26667211,1017957355,1022784549,1010791469,1011315755,1010725964,1010463852,1010659888,1010399033,772699440,474755,772175104,722630,179851312,653733376,-1557266425,844627975,774909156,460289,-30536469,-352321018,117321221,-1427439613,645158972,108159292,41908796,1480384292,1144787572,1128013428,1396451700,1323835508,-11409151,84330030,-953285120,268437766,-1870927104,151439150,-352318976,-30502799,1442842118,-1014762613,1921728002,1048587778,1962934278,3976202,-504874124,775351040,462475,225757451,37650478,91553792,2680918,1017927262,-402295808,-152371008,1048587870,1946157058,244002316,-922025977,132645748,14149632,-19273378,179098163,1107522752,-903087893,-2115501194,-1957248256,46367731,37915454,54427694,192151552,-1014762613,1384857090,855829250,-1959898158,771754294,462475,-402650136,-1897398192,-379692288,1347026575,-768359797,-661915913,-2013857960,-1039445798,1392997464,1543497704,-2144465941,574,568853365]},{"sector":4,"length":512,"data":[1019448064,772633098,278144,772109568,329218,503319739,534191886,1239121,-921975975,-1607595138,-397344757,-497483772,-2119515143,1946172159,347718401,-1959898368,503316510,649731854,-851397632,-1084547295,-2117926874,1946167039,653230560,-389051648,868483035,44183232,60960256,94514688,128134656,113651200,773849099,-1023408478,163580651,542333267,808594995,-852446128,1038124577,443876116,-1106833832,-21036964,2144520,521053427,-1274464582,-350106342,521048140,-1274710342,102878473,-883900365,-385499462,-1430650192,44755205,567089588,-1006708598,1929660392,104380942,4037202,28835840,-1608397492,1074006166,-1173979998,-1705900424,61,839127016,-754530624,113639432,-973076268,17356038,148244166,-12681215,-1468719096,-1435173060,150879872,-1264356352,-31339239,144089792,150865464,-1974430604,-1207370210,567100425,-1023996814,108270080,-385518406,1347945004,567086516,-32964960,218414024,-1962933830,1478872522,-2146340264,-133364674,1048584819,1961889028,45082907,150904912,-979222524,113359366,4037202,-2115502080,-1075095549,874416976,61728777,67698336,144155200,-1274501726,144161358,-855636295,-33066463,-402074618,1320420285,-855071302,874416929,-165448951,17355782,116794229,1963002067,115523100,1149956867,2025851404,214139664,154410633,117353451,-2031613741,-32077309,506639368,1468735949,-23060720,-1144455672,28904708]},{"sector":5,"length":512,"data":[1478872320,1156252531,218414736,1946172544,1015086127,-1089571611,196675881,1973875456,-703660519,220511752,1946172544,-449019885,515837556,768265,2104862451,148180734,-1593610008,102959315,1836386517,-1572862888,-1012791117,-1279591416,148356872,1929484520,-26679037,-1089944646,-1964504857,-1947045375,82411980,-1240561393,18016265,-23010446,-1572862968,-1516107625,150446600,-1576488030,1320421571,-1190594630,567083030,1320423283,-1190594630,567083016,1994988402,144161281,-1275066439,1931595086,23587075,-1274501702,1914817870,144161524,-1207959367,567100161,-1207396422,567099648,-1190615622,28835840,-1172189885,12060837,-1172189887,129566899,-851659776,-1556319711,-1011218203,-851659768,-1557106143,-1273100043,-32077262,-954086136,7239,17950751,-308209294,-385479928,-586806520,-653915384,-401509368,-445448096,-369255959,45744365,-1875121402,148967051,149100171,149233291,-849935944,-851528671,-250705119,-216626424,-182547704,1459730440,1051992525,-169336371,102349312,4037202,-1070465024,-1705897493,61,1376176826,15770,-1258311680,1495387468,244040697,512428470,79300823,1048793357,1996490973,-653379318,-1962641656,-1274488562,1914817855,1975598042,-1982856234,688502806,-2096572154,580894,-1949815975,-2096568546,585022,238619255,74909929,149491339,567099316,-1053054094,-805067147,163190409,149489193,149757571,-1195116544,567098624,-1951664014]},{"sector":6,"length":512,"data":[1107474648,-768358093,-1414848051,-1414806901,12112435,-1205744318,567105280,-1951678069,-1161581630,1307117031,218413823,163057291,242534955,149233291,567099572,-1053039502,378215029,243993016,-903149126,512480372,1085540597,-898489907,-965426885,666420217,-1596420608,-922875650,-402652998,242352272,251805313,108374613,-351465026,850694231,150869642,1200234957,740232726,-661939976,-1215568943,-167048256,512366709,-1397094146,-1337674749,-1324829427,-1960719008,125275610,-24951226,-2092600065,410386174,378156724,567085310,-470295925,204473915,1913399998,202948099,-843118818,1227017,-2136673284,-133573314,113640821,-1602221123,-922875650,856277179,1103793106,7546573,-1185889448,79364097,1478872333,146326360,-1205744372,567086080,1376176826,15770,-1202666752,567100424,163057779,1914817860,12777233,-351570672,27889670,-133991168,1492763480,1464947651,512490582,-490862284,-1074593018,-947713897,768259,-272718605,-1074593018,-947713883,768259,1600038131,1455643481,-490843305,874416902,-1074593015,333973801,116375040,154410635,515896067,321545,-1017225381,1017956659,-1442548690,-1325929663,150569760,1101661309,62518763,1235921920,1455684469,-859942569,145997574,-1190934653,-1527578612,-1090070594,-947713853,833795,1599710451,1631830878,1953459822,1398362912,544175136,1699618913,1919907700,1919164523,6649449,1850279254,1920102243,544498533]},{"sector":7,"length":512,"pattern":0,"data":[542330692,1936876918,225341289,1850287114,1768710518,1919164516,543520361,1667592307,1667851881,1869182049,93192302,1635151433,543451500,1634886000,1702126957,95158386,1914728270,544042863,544370534,1953724787,1864396133,1701060718,1852404851,1869182049,1768169582,-1073714317,1668172037,1634757999,1818388852,2037588069,1835365491,2053731104,99156069,1953724755,1948282213,1936613746,1920099686,168649829,1309017088,2037588079,1835365491,544108320,1634100580,544500853,1986622052,658789,1850279451,1953654131,1937339168,544040308,1802725732,544106784,1986622052,1663377509,1851853325,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,7955553,108791354,1850277953,1953654131,1936024608,1634625908,1852795252,1936286752,1852383339,1769104416,622880118,1628048739,1931502702,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,-989430272,218120710,113704970,1395543881,21337,1291845632,1397703763,1398362926,1330184192,1398362926,0,1308557312,1397703763,1398362926,-16777216]},{"sector":8,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1090519040,1330207802,1398362926,0,1547321600,1329877837,1498623571,1090519123,23610,0,0,1090519040,23610,0,0,0,65792,0,0,0,0,0,0,0,1090519040,774528058,42,0,0,0,0,0,0,0,1397555200,542330692,1498619936,542067027,538976288,1398362912]},{"sector":9,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7340032,1301296363,1397703763,3288627,67586,50462722,587857,262161,1,0,0,0,251658240,0,872022017,-1127182656,118914048,906000571,1444820933,733958934,768380,-2144948996,57933885,-1442477530,-236796790,1200168710,721929986,378207100,332234237,278947442,653760636,100891670,100891676,1067678734,2084021116,-150986568,-1954803418,58460958,-201897789,2083980801,-1593507653,-1796703169,-402542592,426901673,196737931,2111159808,225814259,-1105166451,196705760,1957098240,2104933912,838885864,1578552804,-1895526625,432865860,-344080450,85762539,922210867,-1057063925,-1585693534,1034124343,117488508,-394512479,413204543,990259836,-397393796,1918369869,1007036623,17593980,-142854394,58460966,-1965429800,-1971579602,-1954677482,-360956642,7340032,1958742700,-1290882015,-351220225,-137219085,-25421770,991332546,-137219204,-2005132746,-1552143850,-1262257095,957778690,-789935492,-2133929778,243974374,-511673285,-1966208449,-1971574218,-847381226,168674067,762212174,1953724755,1679846757,543912809,1679848047,543912809,1869771365,1376390514,1634496613,1629513059,1931502702,1802072692,1851859045,1701519481,1752637561,1914728037,2036621669,218106381]}]],[[{"sector":1,"length":512,"data":[1936278538,1866604651,1713402991,1970039137,168650098,542066944,538976288,1398362912,1329877837,538976339,5462355,0,0,0,0,-1437270016,-131072,-1,201722868,199363536,33554689,20971584,134218238,256,16908288,7340544,33489536,33556480,0,33554689,23593024,150995708,256,16908288,7340544,50135760,33556736,0,33554689,157286624,251660281,512,16908288,7340544,66651552,33556736,0,1280,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1526726888,96504912,243990544,-939327202,-1946464375,50406926,-145782328,18878091,-1946595447,-1996413938,1049359695,378208552,78709016,244048595,451084566,280347942,80184065,52878732,-2097080274,-402456123,67231118,521070306,-1962868545,281444850,734759681,1487205326,-78147846,-67541109,16084991]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}],[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]},{"sector":9,"length":512,"pattern":-151587082,"data":[]}]]]
      • PCDOS100.json
        [[[{"sector":1,"length":512,"pattern":0,"data":[1322987,6291456,1294808864,942504289,49,0,0,0,0,0,0,0,-930285056,12245134,-1127051776,-1577354240,-661750778,12238990,-842888448,-398364141,-76414888,34507566,12276092,-1177406720,29229064,28333568,332202676,1482564210,721479656,-32213818,-1107185211,-969211896,-259324813,1452671467,786295632,2080648959,-1199749954,844135746,2133110015,-1269429388,506638,-346156851,12305392,309504,-855506504,879894035,-661731188,-1191182145,-2144993269,-2144985075,536879245,-1074535865,1992163328,768381,1973875708,2146063,-1182956866,-1494024181,-1021377931,-394462786,11861925,-115403059,1309281731,1395486319,1702130553,1768169581,1864395635,1768169586,1696623475,-227577230,1699875341,1667329136,1851859045,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,234447969,416088074,1766066701,1109420915,544501615,1818845542,233140853,1380974602,12568203,65533698,-1017619752,1700949842,1327527026,1634030119,1651056754,1869177453,1868767264,1651093613,1936680045,1868767264,13217901]},{"sector":2,"length":512,"pattern":0,"data":[67108862,-268107712,8390655,184590345,-536018752,16781056,-16703471,1611989327,25171713,469757977,-534969920,34602753,603975713,1613103088,42991362,738193449,-265485632,-1,872411185,1614086976,59768579,990093369,-532872256,67124995,-16506815,1615135823,75515652,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,100687621,1661345889,1617233472,109078278,1795596393,-529725760,117468934,1929846897,1618282304,125859591,2064097401,-528676928,134250247,-2096619391,1619331136,142640904,-1962368887,-527628096,151031560,-1828118383,1620379968,-1009911,-1693867879,-526579264,167812873,-1559617375,1621428800,176203530,-1425366871,-257094976,184594431,-1291116367,1622477632,192984843,-1156865863,-524481600,201375499,-1022615359,1623526464,209766156,-888364855,-254997312,218157055,-738201391,1624575296,227540749,-619863847,-522383936,234938125,-485613343,1625686000,244317966,-351358977,-521335104,251719438,-217108481,1626672960,260110095,-67112711,-520286272,268500751,51392511,-251265039,-980993,201322761,-250740751,-978945,335540497,1879048177,293672721,454143999,-249753151,302063615,603975969,-249228735,310454271,722641193,-517139775,1048338]},{"sector":3,"length":512,"pattern":0,"data":[67108862,-268107712,8390655,184590345,-536018752,16781056,-16703471,1611989327,25171713,469757977,-534969920,34602753,603975713,1613103088,42991362,738193449,-265485632,-1,872411185,1614086976,59768579,990093369,-532872256,67124995,-16506815,1615135823,75515652,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,100687621,1661345889,1617233472,109078278,1795596393,-529725760,117468934,1929846897,1618282304,125859591,2064097401,-528676928,134250247,-2096619391,1619331136,142640904,-1962368887,-527628096,151031560,-1828118383,1620379968,-1009911,-1693867879,-526579264,167812873,-1559617375,1621428800,176203530,-1425366871,-257094976,184594431,-1291116367,1622477632,192984843,-1156865863,-524481600,201375499,-1022615359,1623526464,209766156,-888364855,-254997312,218157055,-738201391,1624575296,227540749,-619863847,-522383936,234938125,-485613343,1625686000,244317966,-351358977,-521335104,251719438,-217108481,1626672960,260110095,-67112711,-520286272,268500751,51392511,-251265039,-980993,201322761,-250740751,-978945,335540497,1879048177,293672721,454143999,-249753151,302063615,603975969,-249228735,310454271,722641193,-517139775,1048338]},{"sector":4,"length":512,"data":[1112359497,538988361,105729859,0,0,0,131831,1920,1145913929,538989391,105729859,0,0,0,393997,6400,1296912195,541347393,5066563,0,0,0,1245956,3231,1297239878,538989633,5066563,0,0,0,1704708,2560,1145784387,538987347,5066563,0,0,0,2032388,1395,542333267,538976288,5066563,0,0,0,2228996,896,1263749444,1498435395,5066563,0,0,0,2360068,1216,1263749444,1347243843,5066563,0,0,0,2556676,1124,1347243843,538976288,5066563,0,0,0,2753284,1620,1163149636,538976288,5066563,0,0,0,3015428,252,1162692948,538976288,5066563,0,0,0,3080964,250,1162104653,538976288,5066563,0,0,0,3146500,860,1229734981,538976334,5066563,0,0,0,3277572,2392,1430406468,538976327,5066563,0,0,0,3605252,6049,1263421772,538976288,4544581,0,0,0,4391684,43264,1230192962,538976323,5066563,0,0,0,9962244,10880]},{"sector":5,"length":512,"data":[1230192962,538984771,5066563,0,0,0,11404036,16256,542396993,538976288,5456194,0,0,0,13501188,1920,1347240275,542328140,5456194,0,0,0,13763332,2432,1414680397,1162297671,5456194,0,0,0,14091012,6272,1330401091,1380008530,5456194,0,0,0,14942980,1536,541545794,538976288,5456194,0,0,0,15139588,640,1162625347,1380009038,5456194,0,0,0,15270660,3840,1230198093,538976323,5456194,0,0,0,15794948,4224,1263423300,538990917,5456194,0,0,0,16384772,3584,1163217986,538976288,5456194,0,0,0,16843524,1152,1330468168,538976338,5456194,0,0,0,17040132,640,542134096,538976288,5456194,0,0,0,17171204,768,1414680390,538976345,5456194,0,0,0,17302276,768,1145979204,538976345,5456194,0,0,0,17433348,640,1129464141,538976328,5456194,0,0,0,17564420,768,1380013139,538976339,5456194,0,0,0,17695492,768]},{"sector":6,"length":512,"pattern":-151587082,"data":[542392648,538976288,5456194,0,0,0,17826564,768,1279345491,538989381,5456194,0,0,0,17957636,640,1430995283,538984786,5456194,0,0,0,18088708,512,1129466179,538985804,5456194,0,0,0,18154244,1664,1128614224,1414676808,5456194,0,0,0,18416388,2304,1128353875,538976325,5456194,0,0,0,18744068,1920,1280065858,538976288,5456194,0,0,0,19006212,2048,1296912195,538976288,5456194,0,0,0,19268356,4352,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099]},{"sector":7,"length":512,"pattern":-151587082,"data":[-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587082,-151587099]},{"sector":8,"length":512,"data":[-385785111,-1293352851,14215424,-385816343,988348708,55699713,-385658135,11600196,1229062178,1444959055,1769173605,824209007,-1607454674,1244475954,942500981,168624177,544503119,1881171567,-228233119,218106381,1769099274,1919251566,1969317408,168686700,1091177728,1226864757,1696616239,-227577230,771754509,167995040,1377072576,-855526254,1024029718,74805760,-1073082192,-883235190,1711719982,-70319357,-1514515888,8710144,600660058,1141509583,1684633193,1986994277,1818653285,168687471,-1336241664,109456896,-1073085594,-1840112267,382533812,-378224629,1970405437,1007726594,772109568,57026184,-883235190,1448300629,772715607,-855636037,1532911376,1355504984,113651282,-1174404251,11796480,1052383181,549778944,1337593973,96794112,-2144466060,16999734,65593717,-883402240,-1406209401,125075236,1610671258,-2014057728,1347601394,-1275068230,-1173041918,-990511007,-402426866,-1973747750,1355504358,-1174293422,348979200,1954596086,6404804,11844843,-930284853,-795944818,-83663428,332260402,349021104,399311284,-1071312435,375040,33941715,402688,37494644,-523171979,57149126,45529857,130537475,-2017001472,2,-1247614767,12066306,-1193767424,1856176224,1812383488,-956264448,-1761607674,172800,-1996446533,-1560280034,512294918,245563404,270436608,1221376,-1912581960,444376,100663296,-1912557128,327727552,14727420,-13379442,-1510738037]}]],[[{"sector":1,"length":512,"data":[-1245831417,39426,-1157955407,448004352,243999181,-377421818,-611581696,-661731188,-1274910278,169987343,-952732224,166406,-1945712896,-956301310,16938758,-853036032,1008657185,-1910868735,-1899786533,4242643,-1957642189,-1275035626,1394724122,1342243000,42908363,2063515112,1329791486,1312902477,1329799236,205,0,0,0,0,0,168624128,543449410,1830842991,1769173865,1126197102,1634561391,1226859630,1919251566,1952805488,168686181,46269440,46269122,706,33554432,33554689,20971584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-352144384,100905986,235347486,-47806177,-64583676,1748926468,863305987,-1896467682,-2032104738,520422438,561300538,-1572797358,-1480981309,-41621500,-1897057506,436651741,113647108,522060828,382533812,-1845448614,-151648074,-997800706,83862417,-947126090,-405674031,-405674031,-947782909,460456447,-271523961,-416644940,-533012597,-527826314,-389772720,710410317,-29068092,1409044680,-63012858,460587524]},{"sector":2,"length":512,"pattern":0,"data":[-1185811573,520487168,1707017998,-203453695,521034149,117469672,-1156191397,118358373,-1962908184,-1956968461,12145147,1504047873,1476577152,520094952,181139463,-1268288320,987834889,-1979549984,-997568288,1476410344,-456080342,-471073790,-855591785,175394323,-58669173,1476621440,118368235,-997537909,-1090516295,-1359870744,624010,83824267,83699339,-872872161,96338352,-64583168,332222468,676905586,33881862,150569160,-973208458,230883761,1936607498,544502373,1802725732,1702130789,1919903264,1769104416,1101030774,1851859002,1953701988,-445945486,1851853325,1701519481,1752637561,1914728037,-110861979,657933,270549120,50595849,100794626,67896332,202113032,2]},{"sector":3,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,541406240,874524980,153100356,923353668,1163010604,1162690894,537529634,538976288,538981684,538976288,538976288,538976288,220209184,1094201354,859316280,540356640,538976288,538976288,538976288,1464076576,1313165833,222645569,1094201354,909123649,540357664,874525237,859119665,540357664,1111755040,573322761,1396789829,168632901]},{"sector":4,"length":512,"data":[51679209,1396395264,1077755452,1095912255,-352275391,771523102,11540854,777541839,363529871,777058972,363542271,1998911874,115444457,1448563998,1347637586,-1423537874,378285589,-863234643,-725822322,-2010186986,-1978303194,-788482084,-58524445,-1140621812,-13756460,-100630121,-1423537362,378416661,-326429267,1476413064,1582979419,119496031,604365775,202399761,1308693761,1108423441,1527852305,403606801,201383953,1494119694,251916035,1326282765,772154882,-2130403066,1493228802,-586296818,-587145971,-587145984,1040243968,-1861859834,504259085,1309814802,1913017862,571672081,-1106023149,-1023365101,-1014047949,436651558,-970580476,503585798,20766858,104600436,121376628,138152820,171706228,11535220,-12654141,-1710259736,6291471,1354926787,1477408232,1610617498,1580974848,-1927776500,-1947479752,-787909831,-772812305,-101723665,-410922031,1354960895,-4226892,69789711,-74726568,-570168367,-271458557,242433931,-489561391,-489561391,1042305,-410974997,-99880960,-1094500471,112399391,-1189771585,-1494024188,-251459468,-260715522,79283193,-215961600,-1963625042,339131331,-1210545449,1676198911,1392144897,583710,-389849337,-93191850,-661731188,1946139880,30992625,1912616936,-448823063,-208989580,-1189771585,-1494024181,2105674868,-160153601,1929401064,646628324,-722070127,-964484062,115638287,116846452,1962874282,2124530659,1178288149,-1555074296,78714238]},{"sector":5,"length":512,"data":[-768352045,-757997359,-2147393909,-201858845,1720375947,1493580544,1392866324,1526922984,51893434,22414298,2118028227,2117814037,-1994951928,-2095743426,-633659197,-1057093006,47835218,399817562,1692976120,-389809917,-5177515,-130353038,113702004,-956361659,478930183,185759373,990409947,58133598,-401966104,-495714494,-402528024,-1070464205,8186051,-964462734,361938693,1912643560,-15144852,-8231054,-1100843777,-1648421498,440597,-2034260493,361938453,-1409283143,41238332,1135216522,96925154,-22026234,922695795,113710462,-60034,1493101032,652748915,-1090810881,196679046,-962268416,-15448826,-1089102402,112792966,-391777536,-1301020986,839039720,-1259813952,-1006653438,-1442396626,-930349035,-2034253682,-1393390827,363438638,-12844876,-1031599499,113672967,-1392548726,-1859745746,1959957,1015206258,-881526496,-402650183,91557544,1979260988,1914715326,-270357830,104345283,-126741434,-439249512,341552779,-29431613,-8216718,-1977191169,-1057095610,197624746,-1196703693,-1381302144,-1515859829,-1409792885,-1424654687,-1414806901,-1431584717,1569269443,-1010814442,360580807,1183514623,1808896,1183449184,291899904,-855765896,28632436,341116475,104521076,208999509,340985543,113704960,16716885,341378759,-1192689665,-806858752,175265793,1946633770,-371657034,-812973947,-922824445,-1662457995,21358848,-1950154576,-12745990,-947715211,394101255,-152210177]},{"sector":6,"length":512,"data":[1962876485,-402289945,678625087,-1275050358,104541697,427103317,521018962,341182150,1360956160,112916,340989579,520197352,-43587494,2124499058,1161504277,641692950,-1994895989,1435182604,39094544,307596070,637817993,-1995156085,1541996116,293503489,-971475711,-402648762,1364328475,1390956627,1499158529,-19856550,-1326484024,1187431168,-5242863,122063555,-1978507635,11865678,-1023060341,256246680,-725888885,112919,-27465533,-2034291854,768277,-1359855696,-970055820,18196998,-270000558,-401247236,770244302,-448823043,1558718324,536245245,-1006653350,-8193675,-1958972161,991093516,225905742,-1915122861,31986294,-9181176,-1090811045,96015750,-1510759424,-1441427040,112312371,-1847022605,-1070355699,-217665193,-1545055318,-128034048,1072258823,-1863823106,-1974446080,1503854694,-9902060,1476395752,7137475,-969999757,1422598,1006634472,-1007782911,62991255,1727484624,-670868991,1446707380,-32345595,253115332,-32869888,169229252,-33394176,786747588,364193290,1426081418,-1356429010,-1909523947,773172502,363538059,-1993464627,773172006,363665036,-728839028,-1356428498,1012792085,-1017482238,1426081418,-1705881261,6291477,1566269274,1158084291,-126550252,340068038,341417984,-1963011608,1398079558,412766801,1509974016,1935498079,113651419,-402582091,20774758,784589172,363542213,856972430,-1094676800,-2000748534,-1515870976,-1899459419,-390033704]},{"sector":7,"length":512,"data":[-1070397409,-1391030534,-1423537387,-1093104107,-2134966136,1487250709,1582979419,119496031,788475643,820516224,50915334,686294763,73656326,17122787,13796096,1458060779,49342464,1323836907,72083456,1239948779,48293888,1105725163,71034880,363542213,-486257527,66822,637588099,639714697,170087816,637826294,-1960544888,645866696,-2145368696,-506363679,-980757807,-1993940342,-1607594939,-1178397262,-91553791,1979661698,130515715,-1960753781,868426581,-1308178743,-1017445355,-1962571184,-167047563,-2135030155,242583808,-1014047860,-611398772,1492941544,-24913550,-1241353664,-1106343680,364552981,364648073,364265097,340336267,364387977,363988678,-1291401728,-628424683,-895228169,-1014279659,56354551,13796291,-861710731,-1580168427,1586173386,1943223041,-1544292537,378082756,-796191288,-1576843742,-1047849551,-754692470,-1038710294,-1947797739,1225130952,13796116,1235294836,1977153300,-768391167,-1096550665,-957941995,34976262,199477387,-1022200179,363988678,1539912449,365470147,-1072965237,1177226612,735639297,50623448,-1545915453,-1014295090,1995952691,366125825,365958793,1569400515,1435182618,1960512284,1942629149,868877064,1569400530,-387587304,-8259216,-596439048,-498926713,1245823986,-1038709821,-1323398635,75425813,991278242,1964266262,341155848,1946175034,1443296832,376766228,780883282,512431191,28906577,1393986304,-36968428,116808285,1979651508]},{"sector":8,"length":512,"data":[1360956172,112916,-47847342,1393985882,4622868,1436745908,1462667540,-1291401708,1049297173,-141879880,365825675,915009795,915084728,906171473,851645896,-8263488,1258720774,1944703252,-1510759423,-996031737,-995934187,-972670187,1996599317,-402608126,-142082209,118359582,340467342,24373713,128316324,1443284511,-154992364,-15355130,-1314904204,985726485,443941702,365043339,267975553,1988957555,-125376494,365051529,364906239,-1314783056,-104597483,1017818307,-972851955,171706884,192279520,856138728,1976110070,-1996420025,-1995159754,118863934,1049299317,-2144987722,-377481651,-1006239523,169101630,-32607013,-387942965,1017837598,-336011238,-1960898858,185878326,-2136050186,-2146108610,113706612,-8383237,-1168701871,2028475643,1493655301,-2112553538,-1921705412,-1331029328,121301002,-1679034829,1340721459,15198465,654147048,-2112463477,-1636499457,272993062,308120358,365561387,365698587,175495794,-730546165,41140539,216582283,-1039234050,-30545899,-1066022645,364910217,365043337,365837955,-402426880,1048837821,1946162642,-17569620,113652082,-1979640397,-1961512682,-1961504242,-401227234,1347879507,1260293662,-74848236,-480552673,-117735058,-1308069105,-1073283328,-1948194027,-1592412618,-125102664,340330027,-1960390093,-235467188,364774971,113648244,184620466,-971410222,51753478,-1912157653,-1827386618,-372129741,-206962317,1074238379,-24393589,638960289]}]],[[{"sector":1,"length":512,"data":[-1592113783,-1993992768,-1163846587,-1139373291,1225253653,-763117309,-1581039360,-1073015344,-828139148,-28055531,113742194,5576,-335673112,918888070,-478145463,1960512127,1959525918,1976303120,440183840,-1565836,-336141818,-1092047852,-535151370,-1408570376,91494972,-502924312,243998710,1049302462,-1762978378,921225355,-401153027,292749819,363988678,364552449,364648075,364265099,8186307,-973010199,-402579899,-102171626,1166616071,1569400340,-32234,-1125611660,365601276,365696651,55171811,13796289,-1979615497,-388823986,1166747216,1435182608,24573714,24433163,365339456,-1039234216,-55449579,365043337,364910217,544522795,-1957592349,25290952,-1954188712,-1072264248,1950958101,-56104957,365043337,364910217,365837955,-1962445824,-401227234,-761135824,1958742805,-1006239438,-45094891,364054214,-1323922943,-1038185707,-770798827,11659285,-1910615977,-401323234,1495267961,-1308040357,-1073283328,-1578702059,-1073015344,-828174476,-48764907,365430471,-504889344,364421628,340330027,365561347,365696651,-1962880381,-1237414966,1161504277,1293624848,638087698,638600585,-1961732727,-384451058,-538313122,197692414,758871242,-628948991,24573696,-754692470,-389510168,451148763,1912650472,-1237414947,365601045,272992550,638962849,856835465,-4537399,18147343,17909446,-617357333,408782630,-713762037,-352256024,-1974250773,-1057094842,-1037377398,1989005707]},{"sector":2,"length":512,"data":[47378,49617896,13992648,745785915,994296970,1273853179,365043337,-1957506773,23525313,364394123,-1197226493,727341077,-1071775270,300440341,-1008825600,-517289429,646499582,-896854607,-1974350101,1246364750,-754261293,1493849603,-2097509437,58064701,-1190672509,1166671873,206932768,-355344176,-494217008,11982474,1379205059,-1014279343,994300811,696126558,2130706749,-4564183,6088719,1522608984,54658191,56003266,-146669386,734563298,1997912590,-104254718,-194058045,2118650996,1709741001,-1828489996,-746077973,-2115452277,-489124876,268417715,-957057048,1526796614,1172855385,-2029744140,1979649019,-1237414965,1569269269,-768359656,1962160104,-389575688,-130157488,1926793999,501793773,-117472780,-1946782961,-386667553,963835016,1962934146,360620349,373655846,1053094795,-4713399,-1459209728,-1425443563,-1414807298,-1441427040,-33536374,-1180390720,-1510801403,179945523,-1532628224,1170679491,-1325400554,-1993948161,1053038173,-1070394295,82740138,548971941,244000,866823155,702912,-1012225037,-1946843672,1389327098,373656350,2124619534,-198383595,-2115412217,-200873729,-546111568,639747971,200101259,-1190955575,-1070399360,-8203725,1175745791,38046534,-1387204105,-770969097,1074033754,-1421737611,-1330986357,1090093824,-2010732173,-1993424091,773081366,340467340,-1899459389,1529777112,-173086700,-1978507635,-1057094842,1242322571,17909446,-989770101,-1995068618]},{"sector":3,"length":512,"data":[1418265180,72124678,-1022473076,1260293166,-1899459564,1225181144,-1593802732,1537414237,341156116,460645386,-774337640,1571785699,1443284500,378208276,1371214931,112916,-1963491096,-1256962546,341687808,-1957277267,-167122712,-186492578,780873411,1183454299,-186072320,558205437,-2094836344,1933577853,611682544,-1962887485,-1608577318,-667282362,-472780173,341677963,341513865,-1899459389,-1242395712,-1073042176,-594873740,-1019544182,948045174,-1979550707,1255181021,339583022,339714606,343654230,-41228918,1827206538,1954495490,1946696758,1947024434,1946827845,1947745381,1947941990,1946172514,1945254432,-956388845,167864040,986936804,1188000763,-890517506,1994917808,-339481855,36563025,-1089687209,-1359871995,-773223585,-1493225755,-391507915,-2007039668,-956366987,-611531380,-577846386,-1978369090,-1012599858,837291440,-385175551,-202899156,-1333531649,19064924,-1513378,339714094,-385766168,-167051426,1323831668,92939776,124985404,292817212,167789544,168261092,-33327873,1307135695,-45131777,548458122,-486034605,158772750,25002534,-32934903,787669707,339680810,-889004502,-66592384,-948674725,-503314456,-20911109,145772494,-1342130200,11724832,-1377236816,-385830912,-880083165,132894506,-352309016,-1274957566,1962031616,1962621455,-391468021,-939655049,-337459458,989781993,-17206021,-706132281,518398,-117247741,-385954839,-880148169,393531178,102003785]},{"sector":4,"length":512,"data":[-1957230818,-1359853570,125110111,-889007626,1573113642,-1325488151,4646976,503732063,536803816,-561357305,-151054615,-24188460,-1461118288,-1257324802,1309682447,806360847,-384845296,-552615921,-988822257,1931492367,1946762257,1588613133,1476397032,48971788,540852874,2134670706,-30538380,1343503622,1476402664,1610615194,116796928,1962873920,826001,1019412576,1008038928,-1022266365,1610613658,1022915584,-1695779565,6291462,1610614426,1947220992,1963146289,2107649762,1946827797,1963539460,-396578808,1810431908,-1909523714,773172502,363538059,1515805528,526212958,-383529721,-2144407749,18104374,1019461682,1008759821,1009087496,773747977,202653088,1373173496,11913354,548407267,-486580248,784554489,339543750,-10491648,1024392750,-11015916,1610613658,1946202112,-1006695195,1342179048,1493121000,-9377597,-1966867596,1979661506,236047,11534432,110817396,-1023385600,1610615194,-1031093504,-12785584,825944,-1950154656,607956210,-35063692,787934206,1948531884,-17635091,11728363,108314634,1946183656,11554555,1914715266,24936983,-401509062,1076625492,976095094,1981040134,1191162370,571818,-2113922072,24456764,244038,771756008,363536069,856192905,-1968460864,568902594,1008301056,1008039456,-1341754070,-1426896577,1060940353,-897580171,1189339649,-1426906960,615301966,1918975103,2004499462,1008741378,1022260256,1021998141,1021735980,1021473851]},{"sector":5,"length":512,"data":[1021211694,1020949562,1020687394,1020425259,1020163119,1019901019,1019638877,-617364727,-661994610,-472783919,639076646,-1023254644,-986791282,-1911182538,-164424612,-2135294325,866513664,-1898344759,8961730,-1526723905,782607781,340594315,34507046,-2117457152,1980760057,268417283,721423547,-773729831,-773729823,-1982165279,-1996487154,-956299234,-855638010,84330016,-775710208,-773336601,-773336601,-773336601,1381090279,1435731,-1587979685,-523234238,-523181872,-523116336,339805706,-855591741,1958742554,1090913015,339845652,1117839498,318356244,1994402519,1093044451,339910676,1117962494,1980513300,1107740371,1134559508,-1564410348,52696131,41229488,-73219842,471843602,505355807,522067743,521019166,-1577080088,512431171,918885441,1552487851,129762566,839140489,-5192768,129821057,-108791950,183662455,183399670,-2098563886,-445182722,-25026802,-2113047294,-646504966,-1040838030,-1022528509,-105134454,-1036331246,-210567248,11817298,-396879155,110100357,-1070459839,-400617789,-1047789757,-489563509,-489565743,-754724399,-1181564653,-235411189,-1070344053,-745803273,-150943559,1694139121,-360578190,-628427420,11718865,1018811089,-1963854080,-2030962950,-1422473788,106727701,839140489,-5192768,1931017602,1022984952,-24972429,-2098302148,-378313478,-436847440,-1056767819,-1961398087,-1948125222,-161173304,-2084043801,11993298,-763114749,-1148087808,-470292213,-141374841]},{"sector":6,"length":512,"data":[-2084502557,-1148059438,-201981947,11913354,-1835481974,-796134409,449642932,1355006002,1277185618,1093751888,1126193237,1127304527,1310740047,52448341,33620224,2,0,0,32768,0,0,65280,16776960,0,0,0,0,0,0,0,0,0,0,0,-215613440,-1293353820,-50672643,234991080,-1574523897,1572541510,376618772,-1958770394,641942511,-1441369952,-259303763,-796152915,1325808422,637826580,-1407955037,1957349630,-989947895,-92931888,-1515535222,-1031035484,-388823631,642304139,856180227,-1410205742,1435857,1906517504,28353814,1375732154,1510021864,242532922,-225786310,-277491574,206503718,648733931,638019318,-1425717757,172360486,172394790,637599720,-1207153015,648675583,638469770,50423543,-1608098056,-1057089936,376480294,1174813222,-385649900,648937306,340729483,51893432,1369646787,-83667180,-947782909,78709105,-276041773,-661733325,-2134916978,1161216,-959935317,-369049594,12650183,-1012727779,637184,113748979,1376388,9176775,113704988,1835152,-1426057800,-1426038600,113748907,1573016,-628176244,113759491,8393801,340465289,-1558946399,315429979,-523041103,340632366,-644953805,8914631,378077440,521011338,378078990,-1587675133,-523168689,1946247685,341688101,16781241,-498645243,-1093760006,-836037006]},{"sector":7,"length":512,"pattern":0,"data":[-33294197,125353995,66650953,-369278479,2045378168,1727407870,1174611463,100869637,723916401,-654898106,72256038,-1958680365,-796180280,-1038882095,24546086,860407299,-1007224878,-617392610,-2134916210,-1105261051,2025395826,-1079708928,525534594,1442860222,-218102599,96952228,1569260928,-1021354494,334168064,0,0,0,0,-2113929216,91489276,-2110849234,1448169477,-33153449,247530184,92978951,918888206,196673656,-1527514112,-1901977842,7905541,-1593473373,-2002583430,2013710085,-1945794048,117471758,1499356959,-13722536,-1677360610,521018960,-1559918943,-2002714504,8037125,-895657953,2]},{"sector":8,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51456,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,541406240,874524980,153100356,923353668,1163010604,1162690894,537529634,538976288,538981684,538976288,538976288,538976288,220209184,1094201354,859316280,540356640,538976288,538976288,538976288,1464076576,1313165833,222645569,1094201354,909123649,540357664,874525237,859119665,540357664,1111755040,573322761,1396789829,168632901]}]],[[{"sector":1,"length":512,"data":[220649,-1946157056,-1898410296,16825552,25487611,567089588,229953674,246686157,116793805,1962869812,64797211,567085492,-854851144,1012868129,1007252558,-957713063,275462,-1896167284,16825552,-388460805,736624966,1578515201,-971607036,17037830,-402599192,372965658,91489374,-352252696,-100219150,62783491,156417793,73139854,-5921284,-2096866770,78712770,19851987,855704342,-2584896,-83853266,1377766942,1509984488,681722116,-2134575613,163470965,29685251,247333748,446934275,480488707,-1605373,218071808,213844854,-1212314880,-1260943614,-1172189943,567083795,66731650,-1170639616,162792236,28844493,-400438004,537657401,1765540020,-989983628,108294716,1631372542,-997532299,-819996789,-1274854470,-1172189943,567083809,-820051280,-1274838854,-1205744375,567086087,-1157686807,-1269824727,1478610185,1545506499,16824836,567089844,901390094,-854608892,1958742561,58767886,567085492,-854849608,-941954271,-855353850,1476839172,-956301308,17056518,131119360,-1274792518,169987367,-1162251072,-789904544,512634620,12452956,131119361,-768349743,-489684051,-1021374725,-1207876422,567092514,-1207892038,567092515,-1342071878,-1172189916,665846151,-977067571,-587017470,-419241470,67303426,1769101059,1881171316,1702129522,1311011939,1914729583,2036621669,1952531492,1699947617,1394895717,1869898597,1869488242,1868963956,610561653,1953067607,1634082917]},{"sector":2,"length":512,"data":[611609717,1802725700,1634038308,1920410724,539260009,1869771365,1920409714,1852404841,1919164519,543520361,604638529,1919902273,1377840244,2037544037,1732845612,1701998446,220471359,1818838538,1818304613,1633906540,1852795252,1650553888,1646290284,606889057,1850280461,1768710518,1329799268,1312902477,1329802820,1852383309,1769104416,1092642166,1850280461,1953654131,1397703712,1936286752,1852383339,1769104416,1092642166,1851853325,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,226059361,168633354,1702063689,1679848562,543912809,1752459639,1952539168,1713399907,610626665,1700006413,1852403058,543519841,1668571490,1869226088,1495801954,1059671599,16786464,1330926913,1128618053,5521730,0,0,0,0,0,0,-1,-1,-1,-1,-1,1329791233,1312902477,1329799236,77,0,0,0,0,0,16777216,0,-1174339396,78711403,44165843,-1547556096,244057180,1874329861,-1930898684,-1547566134,333971715,-38934274,-1979845144,-1174118890,263455739,113713613,66569,259309578,70518470,8841216,-1274758982,-1306407671,-854674432,-54925023,1750338061,1112088677,1699749965,1852797810,1126198369,1970302319,544367988,223563588,1919243786,1852795251,808333600,1126703152,1886339881,1734963833,1226863720,1126190402,544240239,825768241]},{"sector":3,"length":512,"data":[1277430285,1852138345,543450483,1702125901,1818323314,1344285984,1919381362,1344302433,1701867378,544830578,1226860143,-1581626046,-855002107,-1173703647,567084478,-1090720536,1055393216,-386627072,921174059,-388724224,786956323,124565760,1947024514,-161173495,-389510172,-997588963,-939327308,567094196,175489034,792505539,758970996,-21170572,-391386368,-160301042,132702346,-706383360,-1008694774,808191114,171768178,1190425333,1953383875,1948283493,2036425839,1679848231,543519841,1680698664,975796525,795680,0,0,0,-854674432,1555888673,-930284534,-1064382322,-1929652082,1376136136,1096201,-770972937,-4717708,157066239,-1274573126,-1272853239,-1574843111,1090783575,-796261708,1051861453,567083700,156507790,70518518,240088575,147831327,567085748,-402620183,624690598,222060148,808213108,154947442,-1952953481,-1947807248,-2096881484,1031077886,1017905844,-1439271923,567136394,162854123,-855392582,60602913,28844493,-383660788,-71631001,-854608893,1975519777,151439329,-1174404860,448006593,-776003123,88664072,-1686887108,-1261401430,-2111714046,-311095814,148041601,-1574516853,736626896,-1306587643,-855460854,147963425,-1207344961,567093505,2138308924,1316290364,1537344906,-1189040119,-230227959,705278126,157328065,-1191149121,-1403650048,-536003414,-1999505670,1577091086,-1342153537,-1574843135,1824459096,-855527424,156869153,-1979096928]},{"sector":4,"length":512,"data":[168385302,-29723182,-385255992,1622867693,20179208,-1257727042,157335296,669191306,60794611,1974312689,-1596945424,101321048,-12842663,-754984844,-369191191,-1930886906,-20250882,-1594395448,1621231963,1762051849,-967884023,1292462854,-1274453830,-1574843121,-1073084074,113736564,1480919401,158009030,169987397,-949324608,1107912966,1795606081,567104521,-1284128758,156501646,-1207689025,179961855,-1096027392,12519633,69253888,1006913768,639333389,1128480649,71559340,1017775988,-351570931,-1441943309,70581121,1623121522,66830089,-218099527,113259429,68985631,1074011811,-1576793693,-253164492,2000585469,1551171337,-2119974861,159621897,158245696,156374667,649386635,116793805,1979648342,-628220343,-1275002694,522308890,157027979,16836993,-1274453830,-31339225,138394312,243999093,-611448484,-1896168562,-69104685,16836993,-1202667469,1347617024,-888943384,-1274579270,-383660791,-1027932797,-853887991,1751329,-1274453830,-1591620313,520423882,-754601728,159491048,158205639,-1014824448,-971601136,-1982846199,-754334186,63081442,1003064531,138394321,1048820087,1962871246,-1949816060,518753241,-768353394,567089844,-972125409,157334025,567093172,163974697,27791476,-1014954379,-605351968,-385365574,-626917503,159490825,158205639,-1027997695,-853887991,-935427295,578027529,1622812596,309513,-1073077811,1049350773,-996079166,-1899691255,755050176,164105983]},{"sector":5,"length":512,"data":[-794698123,-87751927,646697102,33229266,-1593190354,243992914,-1064433316,-286730098,788475394,116853206,-63138,-1162213771,-15472377,1564377795,175448064,1572814768,768256,-1665488141,-853887991,1577502497,-1275068407,6076945,-1057087027,117426292,-1648490146,571657,-1275044632,-853495294,-1188967135,1323827203,-1187607808,-1153529079,5105673,567091378,512434637,-620033611,-1014289804,-388823631,-1830285532,-852643328,616794657,8906783,567094706,-388970614,1006653445,738357860,7596132,-1274573126,-1272853239,-1265702126,-796218366,-102620723,-1950338109,-1175942184,-422510560,-392833071,-1818951614,-1828700696,-287178732,-400879431,-1014300665,-1962933528,-729132859,1509949928,-355405174,-355407152,48818896,-2133423616,41160674,-838991695,-897528542,-1261360592,-1021195006,-2044215278,666899140,-725367674,-1261401334,-2099870206,567095490,-1031612790,-1021194960,-1162144844,1564377607,183181312,-1548019788,1832813063,-1850073088,-1173654521,567083100,-613039874,-622210165,1377734397,-1261292791,237096218,6076959,567087028,-1162166262,870544647,8233920,1073774499,-1912575325,-1173794298,243990620,666110300,-1612504627,-1406732749,-1753998788,-796261708,-220061235,1824449003,158121728,160546724,1965046914,6143491,375204,113747443,2398,-1274438470,-1272853222,6076945,-1073077811,915083636,-13432482,-1157700888,162793519,-1144839731,1841236381,160546313]},{"sector":6,"length":512,"data":[-1409283143,41238332,1135216522,1822488034,1975519753,156737541,104513790,276105628,-1089901122,196675997,-1163463936,1853097995,-1274438470,-970863345,612870,156376718,448057907,521019853,-1113341901,163554057,-1559655005,-1556084337,-1665529430,1544456969,-853036023,-1338055903,1510376961,1975519753,158120468,567088820,168293818,-954239552,17398278,158120448,567093428,-898318326,-1274450758,-1272853232,-1172189933,162793435,1105797581,1510405887,292880137,-1559646047,1824131456,-854543351,1577516833,1480491529,-562757367,-1665525068,-1272853239,-15865582,-1274807366,112935,132325837,1007272352,-1341688550,872859149,-1396506620,1946158312,1019432698,1023112224,1022850109,1022587948,2092614409,-855002104,201439265,-2134695475,111276257,-1983829248,-1325398514,33084164,-1174403066,448004224,-1590812211,-919402152,-164703861,-16501754,-1959865228,-1173793778,1120076795,1663067233,1634561391,1864393838,1768300658,1847616876,224750945,1766663178,1852404595,1768300647,1847616876,610626913,1819309380,1952539497,1768300645,1847616876,543518049,1176531567,543517801,544501614,1853189990,1917133924,544370546,1159753321,1713390936,610626665,1970499145,1667851878,1953391977,1936286752,1886593131,224748385,1766204426,1663067500,1952540018,544108393,1869771365,604638578,1701603654,1851876128,544501614,1663067490,1701408879,1852776548,1763733364,1818588020,604638566,1818838560]},{"sector":7,"length":512,"data":[695412837,1886348064,610559337,1735357008,544039282,544173940,543648098,1713401716,1763734633,1701650542,2037542765,1986939172,1684630625,1769104416,1931502966,1768121712,1633904998,1852795252,1920226084,543517545,1701519457,1752637561,1914728037,2036621669,773860896,606088736,1380533252,1376191592,1296125509,101024581,1396789829,84244293,1162893652,1375995296,17059141,1347371781,101050713,1398096208,472389,873267584,876950581,876885041,808663093,875966517,875705653,875771185,808924981,892678197,892941620,1094005808,221264176,1093745162,892879920,892350512,842347568,1144272180,825242672,859059504,808797748,960837941,909129008,825503797,859125045,892548404,808466224,825241656,910509104,809110029,808464432,808464432,436866352,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,541406240,874524980,153100356,923353668,1163010604,1162690894,537529634,538976288,538981684,538976288,538976288,538976288,220209184,1094201354,859316280,540356640,538976288,538976288,538976288,1464076576,1313165833,222645569,1094201354,909123649,540357664,874525237,859119665,540357664,1111755040,573322761,1396789829,168632901]},{"sector":8,"length":512,"data":[142607083,1007002556,-1173785089,-840432570,12118272,567089588,-1106951518,-961806244,344326,91602954,-33209696,-1563885888,-1360527268,6070272,-928890620,61520387,-1174365208,-1779956789,15001600,503340192,-1912581957,303835,1547108127,14936064,6030991,-35099790,1061060612,57933829,-1174130456,-2135228416,112904,1553990068,1931922688,5171459,66763421,-2147463192,17121598,-2065167243,109438981,-402383942,-1863843780,190464,99126251,-383946240,-2014838653,70302208,-1207950360,567086081,1497161508,1312556404,-1007032203,-855611672,65780256,179962859,190468,162799821,-1597824563,537657437,376730428,158605372,-402365766,-739639320,7184639,1933320204,113644661,-402586303,91423917,-352319256,97118454,-1262225806,69324057,76522049,-402361158,-876937288,-5052413,-1023409688,-854851144,321569,-1023409688,-402384710,-842793060,12592401,113640821,1375731804,-402431046,1364918152,-1157617479,-108329706,-503316026,113662457,-1341979502,112904,6035082,332202164,-1394080141,-1316608,76678854,1074185731,780795909,398132544,-2096582651,797443307,-143275778,378205746,146276444,1930677509,8251398,-956310551,50631174,28379312,88092298,332203188,1692927603,-1251072,76678854,1076791811,-2000290299,-2147139538,-1368053507,1347572675,88096384,-1173523200,162792633,-998039091,-22091514,88161920,-2146011903,67452990]}]],[[{"sector":1,"length":512,"data":[-709226637,-855002108,-13572063,88147654,85441280,88088066,88016582,14123009,1493108678,-1612096678,66879743,1958352501,-22353917,-385939992,-997982462,1543933700,-34477824,1971387520,60340741,11854827,-17296435,-2147184114,299582,-380042123,230948731,1919895050,1953784173,778530409,-1339806162,1950419469,1886217588,543450484,1953067639,1919954277,1667593327,1769349236,1952541807,611217257,1917061645,543520361,544501614,1684104562,1850287225,1953654131,2003136032,1936286752,1953785195,1868963941,1919164530,543520361,220478072,1684955402,1920234272,543517545,544829025,544826731,1852139639,1634038304,1176795492,1634562671,1634082932,1920298089,1866867813,1952542066,1836016416,1952803952,168633445,1953067607,1919230053,611479410,220465677,1937330954,544040308,1851880052,1919247987,610559346,1836216134,1629516897,1752461166,673215077,692989785,1850287167,1768710518,1919164516,543520361,1667592307,1667851881,1869182049,1850287214,1768710518,1634738276,1701667186,611476852,1850280461,1953654131,1397703712,1936286752,1852383339,1769104416,2015389046,9274,1296912195,541347393,13455171,0,0,0,0,0,0,1410140672,1801675122,1646276640,1680696417,543912809,1937075829,1701601889,1141705252,543912809,1970499189,1650553961,1713399148,1931506287,1702130553,1768169581,2386803,131328,131584]},{"sector":2,"length":512,"data":[131840,132096,132352,132608,132864,133120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1157627904,62458496,113152,-855614304,-4547291,-1124027121,666830103,-12877824,109126261,268437090,117376115,145819236,-472785013,-472783919,-343680765,3926022,-320679029,-1093241521,-2134963584,16824588,-2134923789,1094615054,57999621,-1184839805,1186856976,1612089606,-1146752250,62458496,113152,-855614304,1405328678,-772568238,-2134670869,-773979382,1933020142,-773664498,-773664286,266764770,-2130384128,200278246,1513589234,1633862491,1634890852,538995555,1056,0,0,0,0,-2134966272,47114,-1191181637,-1410137856,-1191676597,-2136735746,209756938,176301704,209856136,-1207009089,79427318,16824576,1967893491,-1176129288,-2134966208,-947672562,-1141186017,28969600,440576,-855614304,-1262248666,125549071,-1073077811,-1007091084,-1559783775,263456729,-855135814,1975519777,130327021,-1274553437,377535002,-1070390835,-1559780445,-777844827,131310343,-1560280648,-1096611952,-1171803129,12126075]},{"sector":3,"length":512,"data":[-1994273524,-1274566898,578861594,666116557,-1190680134,567091200,131403401,6070467,-1331511042,126001671,-1273593670,-1591620326,-677181479,125549319,-1593829656,-677181477,578861575,567089844,-402150981,-842858493,-1983892704,-1996478329,-1962923385,-854149933,361219873,-1275068160,747604776,-1591620352,-2021062697,280231963,-3989043,0,1224738304,1229081922,1126178895,314703,0,0,0,0,0,0,65280,100663296,1296189696,542330692,-850443488,4,0,0,0,0,0,0,0,1115732480,141629065,567089844,-1274768454,169987343,-948144704,308230,-1241069824,-956301308,17080582,268482816,-1559976031,666110069,1541611981,141758089,74711868,1333068092,6070467,-1818050306,76790276,567088820,997572618,141629067,567089844,78907079,113704960,1206,77661895,-1816526847,-1960266748,-855084274,1975519777,141926674,-1174100061,280233107,-1073077811,-104660619,195,822083584,1967795509,825765228,1322987,6291456,1294808864,942504289,49,0,0,0,0,0,0,0,-930285056,12245134,-1127051776,-1577354240,-661750778,12238990,-842888448,-398364141,-76414888,34507566,12276092,-1177406720,29229064,28333568,332202676,1482564210,721479656,-32213818,-1107185211,-969211896]},{"sector":4,"length":512,"pattern":0,"data":[-259324813,1452671467,786295632,2080648959,-1199749954,844135746,2133110015,-1269429388,506638,-346156851,12305392,309504,-855506504,879894035,-661731188,-1191182145,-2144993269,-2144985075,536879245,-1074535865,1992163328,768381,1973875708,2146063,-1182956866,-1494024181,-1021377931,-394462786,11861925,-115403059,1309281731,1395486319,1702130553,1768169581,1864395635,1768169586,1696623475,-227577230,1699875341,1667329136,1851859045,1953701988,1701538162,2037276960,2036689696,1701345056,1701978222,234447969,416088074,1766066701,1109420915,544501615,1818845542,233140853,1380974602,12568203,65533698,-1017619752,1700949842,1327527026,1634030119,1651056754,1869177453,1868767264,1651093613,1936680045,1868767264,13217901]},{"sector":5,"length":512,"data":[168264380,-2111801920,536894782,431235701,-2120080947,1544980998,1959922176,-32590807,975293898,-1172211774,162792754,550314445,-351973702,-1899459339,-1978747688,-855211754,97368609,-796203797,108140168,378061566,-889322235,-2147313944,-646578625,-1994455522,-1996068074,-1274647282,107979520,-2101359989,-205507833,-1547138133,2007172731,109028102,780791691,-678754695,567089844,-21360204,-31339260,58001344,1090607337,-1959999613,-853887785,-1173179359,567084286,-344604418,108465801,-1962933831,1107716886,108861065,857916803,7769024,108869179,1996848063,1962281768,-772175080,2126284774,200200455,1078490623,1946296808,-117472918,998208271,1996913982,-336098466,1183404252,71731458,750436747,-487110656,369348747,330565241,1360929229,30795856,169826648,-385649472,117440275,2075788927,-1171068155,-1269824106,-1960719095,43772103,-1274729798,-1960719095,42985665,-1274648390,1478610185,108725761,-1174367255,-873984001,90225153,-855002032,-389969119,1757020781,-855002106,100751393,-259324293,-1962785141,-1957624746,1225158414,-763117309,-372162304,-355400078,-152315695,107820791,24433163,1959148352,-1946209464,-402231538,1988690348,142510342,-360458869,-854608862,1958742561,-25564925,-1996067423,12186438,-852970496,-854543327,484974113,-1296425215,-855002107,-397387743,1757020661,-855002106,-981247711,238764332,58132087,872337641,126008768,-1962933570,-150574322]},{"sector":6,"length":512,"data":[-65466,-1569931,856060928,18147538,1178944832,-1072961054,-407173516,20768773,-2129229266,-854674426,2000063265,2134256390,-1140903162,854066691,107716865,-402255429,1805713690,2064001798,103529222,-1593766424,280625154,-1948059904,-1141208080,182978119,172289,-1037317492,-150990662,-1947169822,106806266,-402590488,-1976696821,-1274642154,-853422834,517508128,-1070350194,-1866540914,108248832,-67108167,615556595,-1145428556,567090947,567086516,-1900006650,-1866466112,108248576,-218103111,-71104603,16770945,-58583179,772961539,108135992,-2110911627,17199422,-1070464140,-259313969,-2129229230,-854674426,-963945951,1932459822,378154502,246679154,464789965,1347559885,-2129229266,-854674426,-1017489375,-271450485,-1960378877,29816633,-787975168,-772812305,-2114989585,-1022361625,108070598,-24422911,-217846063,-271452413,1933347622,-773664498,-773664286,266830306,-2130384128,200278247,1015621370,-372128930,-422446222,-152315951,107816695,107941515,-91492213,1409279976,-661929933,549054603,-773402368,1273533911,-392981248,345178182,-1175526912,283646736,-389838080,-980746229,1509951208,567085492,-729132861,1509949928,-355405174,-355407152,48818896,-2133423616,41160674,-838991695,-897528542,-1261360592,-1021195006,-2044215278,666899140,1371784326,2931016,-259268105,108606979,-1190607229,45350920,-1308619800,-1323184864,190467,-1968389287,-501101104,16761849]},{"sector":7,"length":512,"data":[0,1061093382,1061109567,1061109567,63,0,0,0,0,0,538968064,543452769,1850287136,1768710518,1919164516,543520361,1667592307,1667851881,1869182049,1850287214,1768710518,1634738276,1701667186,611476852,1869376577,1769234787,1696624239,1919906418,1919903264,1818846752,1143218277,1667592809,2037542772,1920099616,1714254447,543517801,538976314,1766204448,544433516,1936683619,1768697203,1684368238,168632378,538976288,1766204448,1931502956,543521385,1869771365,1868963954,1768300658,538994028,1936278564,1953785195,1869488229,1852383348,1634301033,1702521196,539238500,1702132066,1768169587,1931504499,1701011824,1701996064,168649829,539232781,1802725732,1818846752,168653669,2036473892,544433524,1635020660,1768169580,1931504499,1701011824,539232781,1702132066,1701978227,1852399981,1635148064,1650551913,168650092,539232781,1702132066,1869881459,543973748,1869440365,168655218,2036473892,544433524,1701147238,2361869,0,973078528,808464432,808464432,168636464,220209220,538976266,1093672992,540291616,538976288,538976288,538976288,805965088,541209142,908079154,959914034,540292896,924857654,1176510515,1347634514,1141455427,539101506,1702132066,1701978227,1852399981,1635148064,1650551913,740451692,824980273,858860592,741355820,220341282,538976266,808591392,540161824,908080438,825630788]},{"sector":8,"length":512,"data":[1555699179,12839170,-385713222,892403901,1819626029,-1137625043,-12843921,1048634484,1965031517,-1173375773,567083789,91537418,-352255256,52994544,-1274844253,54245903,-1073077811,1453451893,57516803,1874467508,857853188,53846976,-1560070237,1705182051,112643,-1560075613,666108752,-1190982214,567086080,54070921,1874467508,-1272853232,54245927,-853540679,1729005857,6070275,-1576844638,230359828,3532803,-402441285,1874460719,-853887996,57385249,-1157404253,1290273549,57516288,-1174181469,448008303,1002119629,3794947,-1274883398,-853422839,-1960594400,169987539,-1957661248,-1962923897,-1459606377,57934335,620888069,-1023934976,74711551,33604225,-33496447,813023803,-1983892541,-1996478329,-1962923385,-854608685,361219873,-1275068160,747604776,-1591620352,-2021063831,280231963,-1161616947,-1679097174,-352153414,-1173310314,567083789,-855426118,48675361,567085492,-854851144,-1308445663,-1306407667,-1306407670,-1021194998,1635151433,543451500,1986622052,1886593125,1718182757,1952539497,225341289,1227098634,1818326638,1881171049,1835102817,1919251557,604637709,1868787273,1952542829,1701601897,1937339168,544040308,1702521203,1867427876,1869574688,1868963949,2037588082,1835365491,544108320,1953719652,1952542313,544108393,1802725732,2035527716,1835365491,1634890784,1701213038,1684370034,1850322980,1953654131,1937339168,544040308,1802725732,1684955424,1920234272]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[543517545,544829025,611935595,65456,100663296,1296189696,542067010,-850443488,4,0,0,0,0,0,-16777216,0,1224738304,1329876290,1126178899,314703,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-922746880,0,0,0,0]},{"sector":2,"length":512,"data":[1409324265,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1936278560,1953785195,1866670181,1919248752,1919243808,1852795251,808333600,1126703152,1886339881,1734963833,1226863720,1126190402,544240239,825768241,1667845152,1702063717,1632444516,1769104756,757099617,1869762592,1835102823,1869762592,1953654128,1718558841,1296189728,1953841440,544370536,1631854637,543451510,1953786188,-64983441,855703740,-536194350,1962933378,95009352,6110850,-2109639392,536898878,646593141,646447212,298647645,-388888911,-1057094876,431282314,-1057087027,1963064194,1543947788,113639680,-352255907,1543960095,242614016,-352297822,63683081,567085492,116793549,1979646045,6136323,134241440,-33288698,6070984,1570824330,872810496,-1563886076,-1002831779,243271029,-1593769017,-611581950,-2144484565,-1156926208,-1019540992,146088051,990380219,-1256754237,67156740,242467643,12255925,1942174466,93370885,780704491,-323353659,-855002109,-955845087,192151811,-855361350,6547489,-402652183,1642594385,-955845120,57934083,-402635544,1048707230,1965556676,72858151,567085492,-1274710086,-1205744375,567086081,1849434124,550306421,-394954436,63178438,-5838592,63375094,-390368255,-1243021309,65846015,-1174404119,162792466,951722445,-1272853244,-855527412,113689377,-1979710520,838884374,-1979600394,33801262,-2013018834,704890414,-1157380818,146277824,1913900290]},{"sector":3,"length":512,"data":[-2117730803,974127299,1963181614,-1070349331,117314509,1048708040,1963328456,1773820610,-9639676,63506118,-905525760,378142723,-164495267,780796337,-1061485628,50903045,527569869,-1014905346,775557120,-311098426,-2113914648,248382,646632565,646448070,-2101148732,225772540,-1274727750,-400438007,-1175847071,-843041793,-922288621,-918650365,-1435171325,78363226,-1962998295,838884630,-1979600394,-1207712722,332203016,-973205902,63319610,113701237,-1023409206,332251187,63571710,63585922,-1023314938,-289777062,-20125436,0,218103808,1986939146,1684630625,1769104416,1931502966,1768121712,1633904998,1852795252,604638471,1850280461,1953654131,1970238240,543515506,1802725732,1702130789,544106784,1986622052,222306405,168633354,1702063689,1948284018,1701278305,1768169588,1952803699,1763730804,1919164526,543520361,604638528,1951599117,1701538162,2037276960,2036689696,1701345056,1701978222,125396065,220465677,1886339850,1868767353,1701605485,168650100,1426722084,1667592814,1919252079,1701601889,1634038304,1919230052,544370546,1931505263,1668445551,1409944933,1701278305,1768169588,1952803699,1965057396,1634956654,124087394,220465677,1919833354,1987011429,1650553445,1998611820,1702127986,1920099616,1864397423,1635000430,1952802674,1632897549,1952802674,1936286752,1953785195,1853169765,1650553717,218588524,168633354,1701998165,1702260579,1818386802,1702240357]},{"sector":4,"length":512,"pattern":-151587082,"data":[2036754802,1920099616,1864397423,1635000430,1952802674,1632897549,1952802674,1936286752,1953785195,1853169765,1650553717,218588524,168633354,1735549268,1679848549,1701540713,543519860,1953067639,1919950949,1667593327,224683380,1124732170,1701999215,539784291,1852139636,1920234272,543517545,544829025,125396331,220465677,1886339850,1851859065,1701344367,673202034,692989785,604638471,1850280461,1717990771,1701405545,1830843502,1919905125,168626041,1225395492,1818326638,1881171049,1835102817,1919251557,604638471,-46421504,-276102538,-907284766,-1274898502,-853422839,44481056,-2130689047,1963387134,1008848137,-1103858687,1017905896,-1020038118,-1979703064,1829080,-472849456,-472849456,751026954,1023111728,738619914,1022587399,-389810928,-353828923,-1158188033,162792049,922689997,113705072,1329791077,6751942,6077005,567088820,695582730,2107883571,8364800,6988608,102683187,-853887969,-846520543,1555703988,-1893610240,-1275039738,-853422832,47168032,1224697065,1329813573,1920091469,1763734127,1162354798,1768300632,757949804,1986948963,1769173605,1629515375,1953656674,1176790117,543517801,544501614,1853189990,1681990756,1936028260,1970217075,1718558836,1851879968,757949799,1986948963,1769173605,1629515375,1953656674,1143235685,543912809,1701996900,1919906915,1969627257,-165385108]},{"sector":5,"length":512,"data":[1409326569,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1936278560,1953785195,1866670181,1918988397,1951735909,1953066089,1700143225,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,1766596657,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,1967202381,1919903860,1142959392,1684633185,1953057824,544108404,520537852,113639428,-1124137951,-768409344,-2099246510,1215627260,-2113581638,536894782,1048723829,1965031533,1814465082,1562806272,-1324233472,619237894,-1967063549,-853953320,-2101281247,208994811,6031046,1560724993,535494912,6031094,-1576110593,166395996,-1274797382,-853422839,1560737312,58064640,-1610588766,101187676,-922876828,-1979687774,6136032,76154376,1570949374,1975794176,521043973,44105988,735808512,8404419,-2144524426,-1157253888,-1019540992,78979187,990380219,-1256754237,67156738,242467643,12255669,1942174466,87341573,780703211,-745864163,-489561391,378135249,-1031732198,378078564,1136264216,-855002108,520549921,192151812,-855339334,13297697,-402652183,1689977016,1544980997,12707840,69142262,-166365944,17047302,-1645739148,404654848,1561758212,10872832,-1962580802,-1962665922,-486270450,1957098249,15067141,646641131,646448158,1048708124,1965556764,520549944,125109252,-1274761798,-1172189943,162792721]},{"sector":6,"length":512,"data":[28844493,203541772,1970158624,1008782594,-957844103,269318,69150336,554092035,1642725124,520550143,141821956,69150336,-9508361,69144192,404654856,1561758212,2746368,69142262,-385649407,65601364,-11605760,-385596486,1757020163,-855002108,76462625,213131725,567083440,537315011,512294916,512427030,-164494314,780796337,771884060,780665885,774505502,146277405,1913900290,-2117730803,974127299,1963204142,-1070349331,117314509,1048708128,1963328544,-2134704443,378028234,-1168505622,921240774,521044223,-695532540,1693090122,212947205,39447251,973347862,1963204886,378061569,867173409,-92135756,-1340704995,-2112572366,225907706,179581360,1997142658,-1271877628,84648448,-897526742,202803248,82819589,567085492,195,0,0,168624128,1635151433,543451500,1986622052,1886593125,1718182757,1952539497,124677993,220465677,1936607498,544502373,1936877926,1768169588,1952803699,1763730804,1919164526,543520361,604638528,1850280461,1953654131,1667592992,543452783,1802725732,1702130789,544106784,1986622052,222306405,168633354,1769108563,1629513067,1797290350,1998616933,544105832,1684104562,168626041,1141509412,1701540713,1936028788,1836016416,1701994864,225144608,168633354,1701998165,1702260579,1818386802,1701978213,1696621665,1919906418,544108320,1986622052,121643109,220465677,1836008202,1701994864,1920099616,1932030575]},{"sector":7,"length":512,"data":[1852776489,1634890784,2124643,168625920,1124732196,1634757999,1830839666,543519343,1802725732,1702130789,673202035,692989785,604638471,1850280461,1717990771,1701405545,1830843502,1919905125,168626041,1225395492,1818326638,1881171049,1835102817,1919251557,604638471,876033334,892744759,1177760567,942813234,1177696565,959595828,1144010544,875708720,168641331,809578810,808727349,809775152,909718593,926103365,909522485,909719094,909719091,927282741,909128244,909456964,927348292,809056050,809775159,808727105,221724996,909195786,1161049392,1093677104,1161181492,825636407,959857462,808596534,825634871,825635383,892748854,892744759,925905463,1093682224,859911218,809110029,808464432,808464432,436866352,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,437918234,538976288,924862006,959914034,540487712,807420976,220209217,538976266,875700256,538976288,538976288,538976288,538976288,805965088,541340725,807420976,959717441,541406752,908080695,1646272561,1852204129,1650729018,741552416,573321265,1635151433,543451500,1634886000,1702126957,925639282,741552428,573321265,168632868,538976288]},{"sector":8,"length":512,"data":[1409325545,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1818838560,1866670181,1918988397,1951735909,1953066089,1700143225,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,1766596657,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,1967202381,1919903860,1142959392,1684633185,1953057824,544108404,16825596,-58531830,-401443329,113640100,-970981283,536898822,7079622,605146368,1975519936,1729003525,1824391429,87539456,-218100551,10533028,136843,-752100468,8448641,167836289,-355399053,-355341615,-1031017775,-1325047901,-1948200185,122947056,-2113576541,536894782,-2051403915,6077190,1006768616,-336366337,943620842,678764549,87506562,-1172933376,935003885,32827397,-210436292,90848898,-337742579,6143722,-1190840129,-1527578613,567089588,1048756478,1962934364,6070787,87506562,-1576831744,1555957047,87539456,-218100551,-1173981786,-1930885358,1728509441,359923973,-1912581958,69634778,-1899328512,985988826,1962957862,113555981,567085492,28314804,1555702221,1778829056,-402620416,512295346,448005475,-855157574,6076961,-1174276888,113706295,8389957,-1107192344,1203699820,309509,1316267763,-385403462,1048772903,1946158435,1728509466,141820421,90646144,2484733,90640000,34662402,-167765271,134571782,-68680844]}]],[[{"sector":1,"length":512,"data":[103725569,90638070,-385649404,-253165329,122993152,567089844,-402629446,116785549,1963066727,31254531,90508939,-1962453826,-486186690,1973875460,2048822040,92053765,90506755,-1996434557,-1559922146,-2048326276,1729003775,1330512901,79299722,28895238,314181002,28370950,91889291,1412286091,2080768775,13861637,92216969,-2034612410,26535941,-1880570742,92250369,-1979610648,25487556,45406603,-1996481863,-1106944714,-1968437794,-501101104,92258041,-2147481415,2131060518,1728509612,141918213,74788924,199488226,567136394,90640000,-152706432,-2147129594,816972917,-880074291,89994891,-122025548,-1172189947,567084552,92145406,92159618,-385649654,-2017788103,-855002107,1730576417,113639685,-956299906,358918,2080818944,-956301307,341766,-35198688,90769094,-855002112,90749473,567085748,90848898,-2130152179,1946499067,-1105146608,-74775190,-852950600,1962884129,-1380269311,-855002107,-1006653407,834007691,1952250499,-1271745278,169987363,-1960872512,-620027556,263463796,-1069932083,1153902197,-956301280,8772,2376903,-2007317760,-1173992914,1760101955,780688127,1505363552,-10622714,-2144434086,107723270,-1946201367,956653326,1929732878,1661897476,-853036027,90415393,1671676203,-1312716027,-1545547001,1048773989,1962935651,8400308,7085707,8381313,58055435,50364603,1696500184,1405321477,440369671,243307380,-1022884505,-1274669382]},{"sector":2,"length":512,"data":[-1021194999,90248843,567089844,-1274726470,1594788647,-1021195003,-1157276254,199755214,90021888,-388962096,-388962096,-2015949020,-2029549357,12798675,0,0,0,0,0,0,0,0,0,0,0,131072,16,0,0,0,0,0,0,218103808,540029194,1836280141,1751348321,757101413,1868718368,1852404850,1868767335,1918988397,168626021,1225395492,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,218590831,825238538,892613426,959985462,1145258561,168642117,1886220099,543519329,1869771365,1952522354,1717989152,544499059,1766197773,824206700,538983712,604638496,1701603654,1025520160,220209184,168633354,543584069,1802658157,1953459744,1970234912,218588270,168633354,1701603654,1868767347,1918988397,1802444901,220465677,1818838538,544743525,544501614,1853189990,168626020,1175063844,543517801,1835343992,125400176,220465677,1701859082,1919230062,544370546,1713401455,543517801,168626040,1158286628,1919251566,1769107488,2037539181,1818846752,1634607205,168650093,1917782541,1920234272,543517545,543516788,1163152965,1701519442,1869881465,1684956448,604638471,1867319821,544501365,1802725732,1702130789,539587368,543452769,1769108595,1629513067,1797290350,168655205,1158286628,1919251566,1684943392,1818846752,1634607205]},{"sector":3,"length":512,"data":[1864394093,1919164530,543520361,218588265,168633354,1852727619,1663071343,1634757999,1713399154,543517801,1763733364,1818588020,168626022,1175063844,1936026729,1701994784,1718182944,1701995878,1931506798,1936030313,604638471,909456449,909391685,221529141,1093745162,860239408,842477616,842215474,875971894,909520946,1127627062,808596790,825640246,892748854,1177956402,808596023,842478646,909588790,808596790,842086710,825887245,808923201,909127748,808923188,843132996,809775156,909325377,910505521,927348293,909128244,910571059,909129540,909260593,909128245,909719094,1161115203,973737282,925909297,808466226,876032050,808601142,876034358,892744503,909525814,1144010544,875708720,1093682224,959854132,892748598,808596279,842477878,808596790,168640820,808661306,808530999,909391408,909522489,926234166,909456946,842282821,909326128,910243641,808662837,809775159,892613185,973737285,808464432,808464432,168636464,437918234,437918234,437918234,437918234,437918234,437918234,437918234,1701540713,677737588,1629497715,1931502702,1802072692,1851859045,1701519481,824975993,808528947,572793388,538970637,924852256,808591412,540292640,924858678,1110843443,168632352,538976288,540358176,924857399,892739636,540553760,538981175,538970637,840966176,808591417,540096032,908084534,808591412,168632352,538976288,540227360]},{"sector":4,"length":512,"data":[-1174239044,162791893,716448205,-964025907,-1342136600,10872877,-1796685174,-399659008,-377421669,-108853396,-2096926108,-1047894807,-1174372632,162791910,179577293,-855508550,33275425,1947024514,4712498,753464458,4188160,619238538,3663872,-2113442631,158600508,-453614416,652789899,-1262188032,-1261960448,169987371,-854886976,792505376,758915444,-960881292,-855002111,42515489,-385900311,-294518770,132702346,-721128960,-1008694774,808191114,171768178,1190425333,-2046110525,808455620,-1979710744,-1269787964,1478610178,168674194,1635151433,543451500,1702125924,1920287524,1953391986,1952539680,1936269413,168633376,1702129221,1701716082,1633951863,540697972,3108,437918234,168636727,809578810,808990257,1128413232,842548536,942682166,1110721345,808464436,1110983475,1128411700,808530500,925909825,1128411189,1093677636,843264835,842282822,222705969,1093745162,842543408,1127428144,876037170,1094861873,825243203,959460418,825377859,943211330,960836144,1179004993,1160788037,842477616,1094206789,944058437,809711408,825887245,959524929,808464451,808597296,808797236,1161902145,942883632,842281025,925905731,859391538,1178677315,1177696053,1127625780,808731699,1127626817,960770100,973737267,825246001,808465986,808661043,842020933,1094201392,842609731,876752949,1145254448,943010098,860041785,1093682224,1161181492,825636407,959857462]},{"sector":5,"length":512,"data":[-1174239556,162791891,750002637,-980803123,-1342137112,10741818,-1830239862,-398807040,-964034407,-1342142232,9431086,2129183370,31767040,567085492,-138802508,-1105081087,-919404039,984863283,1946170600,-387151325,343146541,783535242,1946166504,-1275819509,1828877,-729152908,567094708,41271306,-994434867,-855002111,42384417,-385895703,-294518756,-527820940,1979716584,-1979001596,222069472,984352116,215446979,76203007,-109834948,-177065940,1928661564,-725399824,230983178,48771120,-1832613376,-855460784,-1013819359,1850280461,1768710518,1769218148,1126458733,1701999221,1948284014,543518057,606106473,1850018317,544367988,544695662,1701669236,203694138,437911552,437918234,168638259,809578810,808990257,842285616,843334468,1128345649,808793904,843334450,1128350256,1110519860,1127821364,1110520388,808859715,1111049522,1162233394,809709880,221525808,1093745162,842543408,842477616,876037445,1094203185,944058437,808465201,875574839,1093678404,809845048,1127428664,876037168,1128346928,860045619,927216951,1110459184,825887245,959524929,1177563203,942883654,859058241,927215683,842614324,925905731,859129394,1178677315,1177696053,1127625776,808731699,1127626817,860106804,875574064,973737269,825246001,808465986,842020933,1094201392,842609731,876752949,1145254448,943010098,860041785,1093682224,1161181492,825636407,959857462,808596534]},{"sector":6,"length":512,"data":[1409327849,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1685015840,1868767333,1851878765,1700143204,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,1766596657,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,1967202381,1919903860,539828339,543974733,1819042120,1634562661,1851859054,1867653220,1699225710,2036690537,16825376,-1185754573,12451852,1552205312,-498728956,47608,8392330,-2118303261,73186048,1006651018,1007514656,-2012318676,-75414777,712246374,-336993723,1732149797,510919172,73875074,-972393471,17065734,-352033605,1728497379,1706754564,-371594492,243270023,-2111830948,1812225086,65733236,-1124003351,-1880619940,251705345,1721897165,687571460,645926773,-1275001754,73834496,300486861,1358660096,11799669,73797248,73834498,243273933,-2111830940,1912890430,1048717428,1953236068,19785987,-1610574104,17039506,-1610575198,33816738,-1610571102,17039538,-385830238,2028470299,9609216,-1834876628,10657792,-1566440916,11706368,-1298005716,-1899459584,251705560,1721897165,-855591932,1695449104,1048715268,1953760357,14018819,73797248,1715372545,91488516,-352319303,309507,-1274804550,-501101303,1681818359,91517444,-352054854,70760963,567085492,-854851144,1008733217,-385649554,1374224535,47359,512481422]},{"sector":7,"length":512,"data":[-75300746,-1088719808,1085800592,-1950315008,-1996458954,-1946127298,-1912572410,4241883,1085842931,-1009218048,73416322,-385649606,1639776349,73375748,11809068,1810419851,1358660096,313722229,-2147481623,343246075,414715827,4253696,-75366220,-1979354112,3467459,73678466,-2111671296,906257470,850593141,-2113926679,939811902,817041269,-402646088,11796498,199803786,-1172255488,162792406,550314445,-461367347,16548521,-289797772,-855002109,-1021260511,2122449075,208928770,738215562,-735644112,1171784195,738215562,-718866896,1171784195,738215562,-1009253840,168626788,1701604425,543973735,1769366852,1310745955,224750945,168633354,1852404304,544367988,1869771333,538976370,220209184,825238538,892613426,959985462,1141509412,1870209135,1702043765,1752440933,1769087077,1836345447,544502639,673201977,692989785,220464928,544162826,544567161,543516019,543516788,1952867692,1953722221,541012000,1311725864,604446761,1093745162,843461424,959852592,876037430,842478902,892612658,842478135,842483254,808595506,808595506,808595506,1093682224,808662066,842215731,875770675,1110914355,825887245,808726593,858796099,859255606,842609464,809775156,909390913,925905478,927348281,925905461,909456947,925905461,909653556,925905461,909719090,808990263,973737269,875577649,808465970,1144402999,859260470,808596535,1177762099,942813234,1177696565]},{"sector":8,"length":512,"data":[168656875,543516756,541934153,1936876880,1818324591,1836008224,1702131056,1145380978,1380930633,1700137485,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,604638513,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,-1169341879,-68613796,2131150338,1220280330,1564377613,-344711168,1102757898,-1092127479,1707018558,243968,1114941171,1555697588,-1574843136,-1073083778,62523252,-855002102,6077985,-1190504257,-1527578615,-1526120770,-1173113692,567085656,1639916720,-1431655926,567088820,208977930,-385246278,2025456278,43051273,2107883571,8364800,-1559594589,-1556084101,1721958506,222935562,448068235,243999181,-1991704570,-167077874,-16089594,-377411979,-372175543,-372129397,177475209,-779368445,222937729,177608329,-1275044678,-400437977,-117243616,436586236,177880713,177997510,503760512,113704716,-955642552,1225429510,-1878604019,-956301046,17465350,2114385408,58064650,-1140785688,599264584,153991717,716186061,-1173970456,179571356,179315149,-955869720,688646,2097595904,-1631715318,5892106,176166537,1006650344,1174500652,4843598,176297609,1006646248,-1576635073,686295677,1985952768,-1084283902,179897152,1974399488,-1579578594,-1073018238,104531572,259132032,-1744837679,-1964440758,540847359,-1161561228,162793973,2062098893,-1185537,896806460]}]],[[{"sector":1,"length":512,"data":[930358076,-1325399878,1915763712,2000239646,-1711636198,-1311214823,-1959777279,-773664294,-774700062,-805070622,-2099319892,-1099693831,-1149971957,-1877570621,-1161581558,-1012072450,1396791121,1229734994,126160197,135661773,122553614,103220630,68617072,1364658342,-1359865168,-1621493365,1604243243,9365955,176031478,-1946782209,-2096457194,688190,372967029,-462222698,448068235,243999181,-903148904,1555725940,-853036032,176071201,-4528047,113640821,855706238,-2145481774,1977289482,63408917,-1777976383,-1962183158,-1962240450,-1144050744,-672661503,-12240896,1341983860,177737355,1195880178,-950404022,721426949,-1707178033,704185098,-2097119938,32542,242604603,176031430,834323200,-855002102,116835105,1979648638,2131162865,-243925238,-1962674711,185237534,-1961069093,-1962241010,722115134,-2116389127,1980582399,-1143852076,1810366465,1124395776,-1962916888,222935759,-1116419541,567089844,-1274390342,169987368,-1960938048,222937079,177356425,177868427,-213791189,1049186212,113707674,68240,-854543165,163166753,567085492,378216653,1049299600,-633664878,242738804,175430411,-1090518598,-633664183,244045428,-819262822,-1073083728,-1359820061,1977236290,-1336687625,74246176,-1342172184,73721914,995830448,1946849310,-383733758,-1070398378,280613002,316920064,-997840960,-2044215278,-489549116,-1844399120,-1979705624,190662,-259341686,-388962096,-388962096,-1979710744]},{"sector":2,"length":512,"data":[1947149510,67154690,-373085648,512427030,-620033408,512429173,-343733616,-1157400821,1575485441,-1953860097,-2109830153,-81049846,398395511,-1090262272,243990529,-836040038,780874100,-397342064,-1403388056,359866428,292817468,225709372,158599484,-396447664,207094722,62711872,-538965444,1329792483,-1018440587,-1190387521,-4587265,1118481663,-102757060,203363976,1118628212,-92992196,-373052849,-35127095,-1946651392,-401961930,371982290,243993220,-788329850,16710273,512454775,-397276534,-1956970760,-1962244082,722111542,1340623310,-1631693312,-2045867253,4515850,-2076834978,-2083878134,937951937,9496576,2129144437,-2009167104,-1631695094,-2078897397,-2045867254,234965258,1245776520,177083945,113706611,2702,29878338,1962990824,-8132340,-391378973,-498466042,565887993,-398726390,863305836,176823947,176961163,-385941272,729022522,176701067,177081995,-1359869264,1049171317,1049168520,243862156,117377678,-1830286710,-1160940544,162793998,-1581047347,-1834808692,176857354,-1022717789,175965942,-1158122241,162794010,28582349,-397401651,1012400787,1021604877,1021342809,515883897,10741771,-169623542,176426633,222087475,-1631648140,9431051,176557705,176168587,-2097022077,-1041760045,-2009167363,-1942058742,-1978234614,-2111927542,33260298,-385885309,-812909144,176688683,-1310458100,176426539,-1992184974,-1609921010,243993374,1049299598,-16053624,-1787449614]},{"sector":3,"length":512,"data":[-544484981,176426635,186629705,-1493974982,-74724725,243917941,-812971378,176701065,176963211,179359531,176821899,-220230846,1257862318,176821897,176955017,868466738,440184009,222099572,1101722740,512488427,-620033408,512427125,635964048,1407153661,-2111927465,1977289482,1138395906,-1946348568,-685023273,110038134,1049168528,-919401838,1793676779,-2145481733,1977289482,-1877046523,-303545590,-1980265476,-1995796458,1963627062,-1707721827,-392727542,378142154,915081860,-2098722158,-50665219,515508916,-1339962100,23128074,203361930,1071841461,176428683,-1962139458,990548542,1445885130,-141864617,-117181949,722115233,1002505154,1930074118,-1710848229,734563082,2012691406,66126597,-213778951,1599732900,-1012599970,-1274421830,-383660791,599325277,142457381,512434637,-620033408,512427125,1441270416,-1710322692,737250058,1049313743,-201520488,-50427996,-1947301049,-1841395238,-1877047030,-1708226294,-60889078,-1274274118,-400438006,549322948,440173068,1284121972,-1962887681,1120994262,-1737239237,-1331387149,-347887094,-1899459384,-1899983144,222870736,-1962896664,-1962239442,-1962241474,244008693,-852817256,-1991269133,-385181122,1169881549,-855002102,-855526367,1012868129,-1167690407,280234584,330572237,550314445,176162503,-1545011201,2131150586,-4521718,-77338369,176031478,-1947896577,-1274373610,-1188967142,1488584705,-852970486,-854543327,6077985,-1961853811,637398]},{"sector":4,"length":512,"data":[1052681459,-1264278263,-1105081065,1757347932,440586,1488627187,-853422838,-401756128,179306498,45388370,1519526349,-1899459389,-1899983144,222870736,-369106200,1094908213,1986939211,1684630625,1769104416,1864394102,1768300658,1847616876,610626913,1701603654,1835101728,1970085989,1646294131,1886593125,1718182757,610559337,1852727619,1696625775,544500068,1262567982,1818846752,1915563365,1835101797,1768300645,1311008108,1869750383,1763732847,1768169582,1952671090,544830063,544370534,1701603686,1936278564,1969627243,757951596,1701603686,1769109280,1847616884,1663071343,1819307375,1684370533,1225395492,1718973294,1768122726,544501349,1869440365,168655218,1953383716,1696627058,1919906418,1310984717,1713403749,224750697,1867392010,1868963956,224685685,776938506,541011531,1852394532,1869881445,1869357167,168650606,1684948260,543584032,1970302569,1768300660,168650092,1868710180,1696625778,544500068,1311725864,606093097,168641075,808464442,808464432,221261872,437918218,437918234,437918234,437918234,437918234,437918234,875835957,843462213,909260592,910571078,221590596,1093745162,843135280,808595504,1161181494,875966514,842479926,859190582,1177957431,959918647,909520946,842483254,909520946,1127627062,875705654,959853620,876950327,825887245,1111044161,909127747,909128258,909457206,843265603,910438980,909719094,842348099,926365488,926496306]},{"sector":5,"length":512,"data":[-1575487300,582490215,33536549,598745549,-855505734,-1161262047,-1031595397,-253591537,78768779,-805049645,567092916,146784907,-1414792168,1940106155,410493720,-1560215368,1973622897,-1898279400,8436418,567089844,8390343,1556024576,-1442795520,-1341176440,768288,-947672333,768261,111258355,1037601536,521076720,111216499,734330368,402695109,-1557738242,-668270586,-338492239,136184102,1564377600,141828096,409470662,141092865,-930284804,-1064380274,-121843570,263518999,113643725,-972613476,68722438,412944071,-58589120,-955223000,-2145870586,-1677277696,113643288,-1341646689,16508973,-402639384,-1133248376,1916873900,1998142479,-1730097141,-1744884077,-1460993295,-1174214679,65738253,-1944704326,-86470968,-121843570,162855703,-1930747443,347736756,-1105081064,-1514203114,1631366168,2050754162,-536608137,1947024554,1948400662,1965505540,-1394570520,1947024554,1975794182,-1092949002,229644453,-1342142232,8644874,773245630,8120492,-143400752,452803,1965833346,-1404025331,-76275652,-143390404,1015175246,79282957,31582208,79297163,31057920,1375883752,719902467,5236736,1509969128,-678692309,-352314136,-388330327,984612885,-1962922776,-1945310250,518338,518535856,-1965585664,190662,-527777142,-771444399,48781800,616860160,663749647,1344749588,-1837161390,567083700,-1329375142,-386864352,-69009415,-435886397,1980510724,302336003,2114512900]},{"sector":6,"length":512,"data":[-435639294,-1912281596,855894793,-435635191,-1627389948,-1241238266,-435389945,-435579644,-435886588,137267972,2030487320,-402620392,1380975047,-1962987800,1951153156,2031520535,21162008,79238514,18475008,727370379,-1017626166,309574,-1962865944,-1017619766,1962869480,2030995722,-3938280,-1962839575,-796152329,780911533,243996680,1975457949,-2299880,-225716082,1459559144,-385918744,-391315627,1230700336,-963962252,-1677294546,1376547864,-411760728,786967984,-387716097,-722796542,-1949922479,-1950209038,65065432,3389891,585680939,-1395946497,2134671140,540804212,783286899,-486604568,-1993975314,639137078,410459788,-385981463,1347551031,17164370,1577118184,-1906574709,1505791707,-1021575621,55117682,-34012175,-213277631,283689892,1380995583,1593882600,-650422009,-484923970,736523010,1473873867,-1956731661,-350288181,-17962792,-397258671,1598750868,-886351609,-1407670850,1979572398,-880323644,-1951993001,1968922571,1458065160,-303544322,-340859907,-33691425,434688563,-1971817984,-397850928,-1720582128,-489591325,-489561391,-804592943,76213227,-2056114132,1945438780,744432768,1913273351,-183485437,-37361469,1929372648,178443,-1996506392,-1007140073,658244746,574359156,-1007091084,-1404641142,578030908,91604026,-495639494,1124567110,-1514410517,-3807208,-343803021,125048997,1979550696,-2125544702,-1961319186,-33822514,-401161794,-1410728603,-43390724,1006716042]},{"sector":7,"length":512,"data":[-1189645229,1558708228,-2100982785,-713737668,79251026,-11671552,76202840,-1190840385,-1359871996,1179042165,-645144111,403224575,1966750850,1138420658,-398178989,123731860,-1961318978,-1012599861,403189387,1358932712,-48568238,123725173,-386049816,-2031551095,92940029,-1325572120,-42997714,-1174404423,2062024704,-387937792,-528023794,-225834638,-287124342,1006659816,1008825352,1008235647,1011840045,1012036621,-1338805216,-46405624,-469977624,-1328813089,-47192056,1946352002,-1966997834,-386561322,-1226048354,1946352002,78729483,173663954,361244374,-337067193,-398376449,-947127019,-2055928028,-369332248,-672596106,-347123713,-3086093,-1258528791,-1021195007,413140678,361872909,-1256720197,-1626437120,-1609684968,34173720,-971464690,1613830,-2113848088,1613886,770180468,-388174852,1743322305,-64821247,-1558703967,-1588586391,1805850638,113725464,-59262,-1895394584,-1894223098,-1592233722,-12838782,-58572940,-2046659329,-661940028,-2020875311,1994919923,-389773572,984677489,-1946391320,-401051882,1035009097,-1946394392,504727967,-628416626,-165734517,-15172090,786957940,-71636484,770228874,-72160772,-385919511,-126551101,-1975118710,234783284,-398043020,-24969682,-1085311968,244454801,964871,1014345714,108382475,-1959899313,183041605,-389772548,250149893,-1928913156,-1962777187,-69474281,-1325701144,-68163526,-386192920,192215932,-402651975,-471270034,-1021867523]},{"sector":8,"length":512,"data":[-380484936,-92143502,-386566842,766509186,-386152216,1441331970,-1948568581,-1390931434,1651772732,1947073666,363708258,234889401,1974465031,-2132178346,28839905,-2050960640,187659715,-154137640,41226437,350801971,785181691,-75241299,2129183882,-398610181,395049849,1458062147,-75765509,-486835992,1152959458,976966,-1963237144,-77862716,-384384322,378142061,-1195173870,-437565886,-1189761602,378208272,-1389488110,74638033,507808558,192200715,-1963249432,-81008444,-486853400,401130469,-89528319,-1157838872,108134401,-402651975,378141851,266868899,-1593391107,-2147483624,18354958,-1900006626,201770968,-1945620224,-956297714,939525126,101616648,113768960,137101452,9309836,402177055,1515805528,1600019805,-1961425145,-15204314,-15199690,-15200714,-1911025610,-820508642,-386258968,-1511260726,-351878013,-1276153,-326696882,2525486,378285592,-863234036,213701774,1461585432,1280070998,1347637586,646651670,378411008,110041100,110041104,-2141710322,312737508,2525464,503782936,402177047,-1900006626,-1945712680,-1946024960,520130062,251657467,-1804265309,-1961298498,-484925170,1019479562,-1543190909,-402130718,1273559464,-117904899,-402651975,736689075,233368828,-107812358,-402651975,-1185743965,-1662517246,-65738501,-1007789422,403582603,-2097574168,-210420420,-65411002,-1994912093,-1021833194,872408552,418758619,1962504936,237931291,-67246056,1166611849]}]],[[{"sector":1,"length":512,"data":[96961282,201032515,1119413877,-26678960,413212297,316918667,504952255,-2093628122,-962329401,-489881788,113713139,71843,-1895912983,1444417030,-1409252929,1963801770,-2098232838,650611456,1577091234,-1207935809,567093505,-1575487326,28317799,-855610177,402235937,118365958,-1962910530,440830,-1161583117,-1897327123,1732150008,-210436328,6635137,-361413304,6766210,113689432,-352249752,1745274373,780861464,-840427506,-395741960,-974587053,1349612792,28957323,-89004032,309586,1392159464,-402652231,468253347,1523223547,-1976688808,1343776806,74769418,48965069,1499145933,2008723315,1975519766,377272835,118365966,-2008956542,-1105813746,-1849747805,1978468886,380091907,162833829,-1967513139,-134485738,-1172828511,1692926208,856323583,23783890,1962892008,-1982123016,-1996456674,-2130673890,1157653822,-2113440424,1157654334,-1910612620,-853887784,1555701537,1745286656,544538392,567087028,309706762,6948551,-4653055,-853035777,-66156255,767214359,-140777194,567088820,1052426494,-940411882,16804358,-66155776,-1171737577,567083100,1522188298,-1260751594,6076944,-1161616947,116791012,1962874984,422034120,567089844,-1174398279,263454812,113713613,65642,-1435123702,567093172,85536673,95485983,2107893971,1778829056,-1962803200,-2095577058,378212547,-802481877,422254217,-1031019821,244044547,-784662526,1997974458,859734837,74776345,-645150677]},{"sector":2,"length":512,"data":[-1910576245,-1261292581,522308890,422252171,-1275044678,690081063,1947806478,1963042832,-524058362,-1159992561,-622258484,423600630,-956269149,16804358,422033920,567089844,422395523,-1272810496,6076967,-855636807,1975519777,658410450,422158617,-1064385277,-13827802,1964584206,422945246,212059395,423076120,-1592262493,-989652675,-1592258909,279124283,378127128,-457566097,1745286678,-1770717416,2075836558,-853887976,-1173375967,567083100,767213578,-385649642,113704828,-956301188,27142,-1173048318,-315424676,-400917570,977010734,1156118901,-1245148672,-398859520,-125173701,-1979697432,1864238040,-386168040,686293035,-46421504,-276102538,-806619934,444333697,567085429,208929084,-1407681602,74717756,74825738,402402953,1108163,199809162,-790376448,-790376221,-1010627869,-385888792,-143394722,-384381766,-253168171,1380995574,-386351384,-1956710238,532713210,32000345,-1494007552,-397486732,-1830226349,-158340874,-160765780,-386496280,642774661,1575486858,-159651594,-386500376,-397937087,-1070402088,780914923,1908348942,-1659991272,-773205736,-153818903,409540233,-1994888285,-401052402,-1310195653,1829173237,1979711256,-987839502,-1407686346,1765181727,300437528,1832291318,1962281752,914968069,117315693,-1017636741,-1576980504,-396683133,2045247555,918888181,-924313495,115875829,2064041718,-2067857384,-1189040104,-1426915305,-392165946,11861936,19191947,-1978106206]},{"sector":3,"length":512,"data":[-773598781,-71073309,-1994945777,-1088914410,1476335748,409583106,-1525124673,2066123429,-1327234536,-1731974642,-171972463,410793611,-1326110488,-173807607,-384269122,1709765917,618695423,411017735,-321852208,-997528368,-2136864988,-789786600,-1997745940,-1021804250,-401253957,82313769,-401937662,-152305712,1911078962,-1439911936,410912502,-401902081,367787812,-1342176280,434678316,-388986113,-259326188,-1979710744,-790590782,-790048536,-387395352,-997588990,-1878782172,658510887,-236403798,1963605246,1505477600,30402581,-1342067992,-571954644,-796157698,733012106,75097098,-587846224,-339440982,4778172,-1599460176,-742516608,2118025743,57999640,-1743789122,-268177405,-388971611,-388962096,-205651164,619506447,-958010617,18382342,-1342171672,-2136954324,-387585256,-538378464,2114373375,283836696,-335604760,2114373134,166199576,-5510913,-2102776656,51937598,1947762592,-958712927,51937798,1197147590,125109820,411123330,-1974176768,1979792592,1946631251,1979923535,1963342852,35556109,-2113485288,1119355416,-92099760,-1341951228,-92100053,-2146602234,829686242,403054083,-1421261640,169378208,1007252672,-401771518,-637272284,-1985323600,-1021808866,-391500880,-286523688,402267787,-346537288,69075900,1230223384,-571945493,100899069,-1970136983,-20584250,-1058422134,-37033730,-974598006,66095869,-350721770,-402184986,749797122,-373280086,-1070399750,-1325470744,1538304556]},{"sector":4,"length":512,"data":[-958712918,51937798,-385899287,749797360,-373280086,113704656,-352315266,2114373125,119800088,-1325511703,-1195136436,-374657972,96927320,119849779,32034954,-790441730,182636770,-28186430,411123330,-972524541,18382342,-1325473303,2141235756,-385407976,96992823,-1144825788,585635145,-2126609920,225706776,-164871496,-15172090,1471152756,-21501525,-1325408024,96971308,-389854141,-796197460,65065368,-1559786536,-1031137156,359250883,184543464,1007449280,851341828,-30218048,-369196567,2042363308,-3151851,-1452146116,141755964,74711464,-1423160136,1107192041,1145848652,1095516748,1145586504,1095254600,1146635096,1398293080,1397768784,1162429513,1397965651,-44874669,-49423085,-49423085,-49401325,-49401325,-49450989,-334663661,-452068844,202242580,202235156,202235156,202256916,202256916,202207252,-334663660,-452068844,915988,908564,908564,930324,930324,880660,-334663660,-452068844,101579284,101571860,101571860,101593620,101593620,101543956,-334663660,-452068844,235797012,235789588,235789588,235811348,235811348,235761684,1124954132,1091356693,51292948,51240212,51240212,51261972,51261972,51212308,1124954132,1141688341,151956244,151903508,151903508,151925268,151925268,151875604,1124954132,386713621,286173972,286121236,286121236,286142996,286142996,286093332,1124954132,537708565,1628351252,1628309268]},{"sector":5,"length":512,"data":[1628309268,1628309268,1628309268,1628309268,1628309268,1628309268,1192101652,1192101652,1192101652,1192101652,1192101652,1192101652,1192101652,1192101652,-334625004,-334625004,-334625004,-334625004,-334625004,-334625004,-334625004,-334625004,-452065516,-452065516,-452065516,-452065516,-452065516,-452065516,-452065516,-452065516,-82966764,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-82994925,-1660053229,-1710307820,1947125268,1896793620,2098120212,-1945188844,1980679700,1863239188,-1626421740,-1760639468,-1894857196,-1844525548,-2079406572,-2129738220,-2045852140,2131674644,968212,876544,876544,876544,856537600,856568341,990786069,990786069,336474645,336452884,336452884,336474644,336474644,-1475474668,336473364,-452060396,-686938092,990817044,990832917,990832917,990832917,990832917,990832917,990832917,655288597,1041148692,588163860,923632660,-267474155,-401691884,219065108,-1592874219,336505620,336524820,336524820,336530196,-921761004,-854676716,906930964,974039828,856599316,856518677,722300949,789490453,-1307661547,-1240552684,336505620,403614485,336505621,336533012,336533012,336533012,336533012,336533012,336533012,336533012,336533012,336534804,336534804,336534804,336534804,336534804,336534804,336534804,-82895596,-82994925]},{"sector":6,"length":512,"data":[68000019,67996181,-1425102059,-1525797612,336473364,336423700,-83006700,-82994925,68000019,68102933,1678714645,1678717460,1728937748,1796123412,961300,1009408,1009408,1016832,487556096,437105172,-82988524,1057855763,1292806933,1292842516,1292842516,1292842516,1292842516,1292842516,1292842516,1292842516,-1022413292,-1106328044,-1173436908,2031011348,1527694868,1577942804,-586318060,-519209196,588087060,-1995515628,-1995515628,-1794276332,1527694868,1578066452,-586194412,-519085548,-1374723564,-83046892,-15886061,-83046892,1343016468,856599316,961300,1024256,705667328,571386644,806267669,672049940,755936021,621718292,961301,1030656,1141881344,-1002159678,1405305921,1112785493,-766551870,1312936527,-800242748,1104564045,1094828353,-851361340,1137918273,1137462337,1279514434,-1001634877,1137265731,1296286541,1296286288,1464063824,-1052687164,1154695492,1229243205,-1017952810,1238649928,1238780228,1238127949,1313456718,-1018279465,1238650441,1238324302,1255425362,-1035056447,1112195658,1480805061,1255819994,-985183545,1279970378,-800240955,1255820874,1347077456,1255164623,1313526606,1255099087,1212239059,-750498618,1287734604,1330434885,1330432835,1330430532,1330435908,1330434127,1289375823,1313886031,1448037850,1448037826,-866824745,1321682254,1330565199,1414877140,1414877122,-800108329,-967815344,-934062768,1213420880,-868003130,1389511506,1390039109]},{"sector":7,"length":512,"data":[-632401851,1389643090,1330826319,1212240850,-767470650,-1035910317,-683588781,1405896787,1414779464,-1001106493,1405703251,1405243220,1423396692,1473532741,1490307393,1489455171,1406419276,1061144389,169150399,-132844267,521477140,286606869,202636565,101974036,51645972,286525716,1175794452,-736830955,1460982036,1393838612,1192517908,588522260,-1995142892,1175776276,236456469,135793688,1113080088,1146635096,1112560472,1145656144,1163084873,1129534291,1347438931,67,0,1146507008,4801870,1514622464,1090519122,1342177347,1124073541,89,0,1431719424,4801616,1313624064,1308622938,1342177345,1308622927,1225395523,1818326638,1679844457,1702259058,1701868320,1768319331,1769234787,168652399,1342836004,1919381362,1948282209,1768780389,1702125934,1869488228,1818324338,168655212,1818838564,1869488229,1868963956,224685685,1867392010,1869574688,1852383341,1936286752,1768169579,1952671090,226062959,1850287114,1717990771,1701405545,1931506798,1701011824,544108320,1802725732,1143212557,611021673,1953067607,1919950949,1667593327,1696605300,1919906418,1634038304,1735289188,1769104416,1092642166,1914964493,2003067237,1232365938,1718973294,1768122726,544501349,1869440365,168655218,1159749156,1919906418,-2011133427,1869771333,1852383346,1163412768,1480935471,1818846752,604638565,793073733,542655816,1701603686,1851876128,544501614,1998611810,1953786226]},{"sector":8,"length":512,"data":[168652389,1701336100,1296189728,1919242272,1634627443,1866670188,1953853549,1142977125,1196769861,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,540096569,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,5063241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,0,0,0,256,852304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67125255,808469773,842283316,808600628,1177957172,808923703,825438258,942881075,808595763,959857460,892744502,859260214,875967798,1144270898,876032310,168638776,826356026,808990007,926234160,909719090,843265585,843330096,925906224,910571058,909260599]}]],[[{"sector":1,"length":512,"data":[285261,34013269,160,0,-1287123968,70189062,28,70189060,70189099,70189253,70189265,70189280,70189079,70189084,70189089,71237647,71237675,71237702,71237735,71237777,71237824,71237879,71237884,71237917,71237951,71237984,71238040,71238045,71238059,71238067,71238075,71238083,71238091,71238099,71238181,71238245,71238303,71238568,71238623,71238638,71238663,71238707,71238721,71238729,71238737,71238747,71238778,71238818,71238834,71238843,71238870,71238919,71238952,71238975,71238984,71239004,71239038,71239114,71239139,71239150,71239160,71239169,71239174,71239179,71239205,71239229,71239252,71239272,71239299,71239321,71239362,71239465,71239482,71239525,71239533,71239567,71239581,71239607,71239621,71239659,71239671,71239690,79691798,79692052,79692066,79692098,79692206,79692237,79692276,79692339,79692502,79692524,79692553,79692572,79692647,79692688,83755049,83755054,83755068,83755076,83755084,83755092,83755100,83755108,83755190,83755225,83755249,83755277,83755294,83755474,83755489,83755514,83755557,83755567,83755593,83755617,83755640,83755660,83755692,83755724,83755816,83755866,83755897,83756058,83756153,83756161,83756203,83756224]},{"sector":2,"length":512,"data":[83756235,83756257,83756301,83756312,83756317,83756322,83756362,83756375,83756388,83756410,83756418,83756426,83756445,83756453,83756464,83756485,83756496,83756549,83756557,83756572,83756608,83756634,83756667,83756700,83756712,83756724,83756743,90832929,90832989,90832995,90833007,90833030,90833042,90833075,90833087,90833208,90833220,90833324,90833336,90833354,90833380,90833403,90833446,90833469,90833477,90833554,90833577,90833612,93782434,93782510,93782930,93782965,93782986,93783007,93783012,93783039,93783051,93783180,93783350,93783376,93783559,93783750,93783778,93783844,93783897,93783913,93783934,93784176,93784214,93784290,93784349,93784378,93784521,93784543,93784562,93784597,93784656,93784745,93784876,93785050,93785067,106299408,106299416,106299445,106299457,106299636,106299645,61866718,107413575,107413611,107413628,107413653,107413757,107413789,107413816,107413828,107413833,107413842,107413847,107413858,107413897,107413925,107414003,107414030,107414058,107414080,107414135,107414202,107414455,107414521,111869968,111869988,111870037,111870045,111870061,111870109,111870129,111870138,111870150,111870155,111870168,111870392,111870415,111870420,111870429,111870453,111870458,111870474]},{"sector":3,"length":512,"data":[111870482,111870502,111870534,111870595,111870721,111870765,111870784,111870807,111871250,111871335,111871364,111871396,111871408,61866844,61866848,61866852,118030382,118030397,118030415,118030423,118030449,118030457,118030466,118030474,118030500,118030513,118030541,118030546,118030562,118030574,118030585,118030596,118030605,118030619,118030624,118030642,118030653,118030680,118030714,118030736,118030750,118030764,118030785,118030799,118030814,118030849,118030870,118030878,118030907,118030968,118031035,118031089,118031119,118031132,118031141,118031146,118031158,118031185,118031216,118031246,118031259,118031268,118031273,118031283,118031333,118031350,118031367,118031405,118031417,118031426,118031434,118031443,118031457,118031482,118031487,118031501,118031511,118031516,118031521,118031558,118031582,118031590,118031616,118031653,118031680,118031701,118031711,118031727,118031741,118031746,118031751,118031763,118031772,118031781,118031790,118031808,118031816,61867302,124059710,124059757,124059786,124059817,124060174,124060206,124060231,124060310,124060386,124060442,124060669,124061094,124061289,61867382,61867386,130809897,130809962,130810056,130810125,130810136,130810144,130810155,130810186,130810196,130810201,130810314,130810442,130810507,130810567,130810685]},{"sector":4,"length":512,"data":[130810723,130810822,130810847,130810947,130810979,130811020,130811032,130811044,130811053,130811109,130811121,130811130,130811144,130811153,130811169,130811210,130811233,130811249,130811254,130811311,130811327,130811346,130811360,130811375,130811389,130811408,130811422,137232407,137232600,137232650,137232669,137232997,137233023,137233047,137233076,137233152,137233230,137233254,137233274,140902462,140902483,140902507,140902575,140902685,140902730,140902753,140902808,140902840,140902973,140902986,140903089,140903156,140903180,140903235,140903249,140903597,140903613,140903632,140903833,140903916,140903929,140903943,140904086,140904109,140904133,140904164,140904178,140904305,140904434,140904506,140904619,140904637,140904716,140904903,140904938,61800450,12594042,151781540,151781558,151781570,152568301,152568338,152568364,152568381,152568388,152568494,152568636,152568682,152568793,156631060,156631090,156631181,156631230,156631270,156631323,156631370,156631477,156631592,156631634,156631721,156631783,156631873,156631936,156632080,156632160,156632262,156632377,156632419,156632506,156632520,156632598,156632740,156632820,156632846,164036624,164036640,164036661,164036677,164036698,164036719,164036742,164036768,164036789,164036805,164036824,164036850,164036873,164036896]},{"sector":5,"length":512,"pattern":0,"data":[164036914,164036935,164036958,164036981,164037004,164037027,164037045,164037066,164037092,164037115,164037138,164037161,164037187,164037210]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,5063241]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"pattern":0,"data":[]},{"sector":4,"length":512,"pattern":0,"data":[]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-198132480]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61800452,0,128,0,1380402182,5264719,544173908,2037277037,1734701856,1953391981,1919885427,1634493216,1936028531,67111437,1162104643,544173908,2037277037,1734701856,1953391981,658803,1835492691,544501349,1702521203,1668834592,1935959397,1261712928,1409288717,1830842223,544829025,1970238055,168653680,1869566976,1851878688,1970282617,1667853410,1836675872,1936486242,544106784,543518319,1969516397,168650092,1836667648,543977314,1768318308,543450478,1701998445,1634235424,1852776558,540697955,1852383232,1818846752,1291853925,1095770195,1279345491,1414680390,541999442,1850292023,1768710518,1651449956,1952671082,1685024032,224750709,251854858,184944143,50725636,1651341651,1948281967,1701601889]},{"sector":4,"length":512,"data":[1885430560,1953063777,2019893369,1684366691,25701,544173908,2037277037,1734701856,1953391981,658803,544173908,2037277037,1869768480,225669237,1867776010,1634541679,1696627054,1919251576,543973742,1651341683,544435311,1864396393,1830839662,1819632751,658789,1766590989,1847616878,1700949365,1713402738,1210085999,1850286112,1768710518,1651449956,1952671082,1685024032,224750709,1850277898,1768710518,1651449956,1952671082,1685024032,224750709,1968111626,1718558836,1634759456,1864394083,1768693870,1713402995,224750697,218234890,1297481738,1347245102,1852727619,1864397935,544105840,1886217588,1918988911,1768300665,168650092,776820224,542133588,544432488,1852138850,1701995296,1684370529,1141509422,1869488239,1751326836,1701277281,1936286752,1953785195,1852383333,1769104416,2123126,658746,544503119,1931503215,1701011824,544108320,1412320598,168644685,1953775872,1953525093,544175136,1701012321,1679848307,543257697,1937012079,224748649,543584010,1835492723,544501349,1853189986,168653668,1701729536,1667592312,543450484,761556581,1714251375,543517801,1444965999,1297362509,658768,1735357008,544039282,1702521203,1668834592,1935959397,1885430560,1953063777,1718558841,1852394528,658795,542135620,1868785010,1948279922,1663070063,1819307375,2127973,107413948,1852727619,1713402991,543452777,1919052140,544830049,1953383680,1847620197,1679849317]},{"sector":5,"length":512,"data":[1702259058,1952803872,980575604,32,1917848077,1634887535,1852121197,544830068,1852403568,1952522356,3801120,544106784,1701715968,2126433,1970825542,1718558832,1952805734,1668834592,1935959397,1701406240,1998611564,1752458345,121634816,98370623,68617470,1631979273,543973748,1869771333,220215922,1850277898,544503152,1701603654,536879162,980643696,1377828896,1919902565,2035556452,540697968,1851867904,544501614,1852141679,1818846752,1224745061,1818326638,1713398889,1634562671,1768300660,2123116,1849753600,1953392928,1634628197,1634082924,1920298089,1634213989,1668227187,1701999971,168636004,1851867904,544501614,1684957542,1651076128,2037539186,168624160,1702129221,1701716082,1919164535,543520361,1953785196,540701285,1851867904,544501614,1684957542,1818846752,218112101,1634231050,543516526,1802725732,1702130789,1768438816,1851859060,1701519481,536886905,1713401449,677735529,540682611,538970637,538976288,1224744992,1344294210,1869836901,543973742,1886220099,1919251573,1852394528,225600875,1919243786,1852795251,808333600,1126703152,1866670121,1769109872,544499815,541934153,1886547779,943272224,658737,1648427008,544503151,1730178932,1919250021,543519841,1163412782,1818846752,658789,1634222848,543516526,1802725732,1748770931,1629516905,1797290350,4094309,658688,1851066893,1869833586,1684371052,1954039072,1634628197,221934444]},{"sector":6,"length":512,"data":[218106378,1701336074,1998611826,6648421,1920099616,544436847,1702126948,1684370531,2573,124060133,544173908,2037277037,1112887328,541280588,1651341683,7564399,544173908,2037277037,1112887328,541280588,1651341683,7564399,1852989783,979857001,544165408,1128354899,1702043723,1852140903,658804,124059716,124059662,538986504,544432705,541591584,538976288,168632352,1635013408,538997874,1886352467,1277173792,1952935525,1310728296,543518049,538976288,538976288,538976288,538976288,1816338464,225669985,1207962122,541589536,538986496,168627200,1681989664,1936028260,538976371,538976288,1968185376,1667853410,2036473971,1835093536,218762597,218890250,1092624394,1701995620,538997619,538976288,1344282656,1768710773,1646293859,1633034361,224753004,658698,544503119,1931503215,1701011824,544108320,544109938,1701603686,2573,1412320598,1297502285,1347245102,544434464,1763733089,1734700140,1713400929,543517801,1701667182,1851853325,1634213988,1700929651,1763733093,1919905383,168649829,1224736768,1818326638,1495295081,1311732581,1634738287,1701667186,779249012,1124076045,1869508193,1886330996,1814064741,1701539433,1701978226,1852797043,1713399155,778398825,1325402637,1667590754,1867325556,1701606756,2112115,1245859630,544109906,1701603654,771760186,1279612997,544502633,1701603654,771775264,1565540685,771766816,5259597,1919052108]},{"sector":7,"length":512,"data":[1701409377,542842995,540680285,1869566976,1851878688,1768693881,1918988898,544433513,1667592307,1701406313,658788,1818391888,544433001,1567575643,1275076666,543518313,1651340622,544436837,1567575643,1392517178,1801675124,2053731104,1331372133,1667590754,1768300660,1931502956,1801675124,2112093,1224739341,1818326638,1847616617,1919249781,1881170793,1835102817,1919251557,658734,1970365778,1702130533,1953701988,543908705,1702521203,1668834592,1935959397,1261712928,658734,1684107084,2003782688,1700354848,540695923,1095975936,1668246636,1869182049,1314594926,540695919,977341440,1129529680,1278102593,1329807945,1347166286,1092628820,2119765,788198448,267918,-1949761348,-81848596,167772314,2464265,1738146863,-83425020,-326412812,-1760889190,-1577013243,1839395692,-1560234765,1048831260,1997137180,471763728,998754021,109248748,1929504028,436652009,-1593835291,-29498086,-1994688768,-2013220413,-773112689,-1996442141,-1982132081,-2082136433,31791622,113696115,-1325405384,-348806656,-1259514206,-619797760,-1561503838,1537403702,-348675347,-1544796766,446946054,-485841943,-1561109342,77851444,436651995,-956300827,31792134,-485711104,-1562177885,10152762,-1341865984,515395586,1973047296,-1207593206,-1336870912,-5222394,37460560,815989952,-451108407,-919593333,-1593620600,1000531228,470220779,1439391205,-967709557,15415302,-883037047,1374456661,1778503322]},{"sector":8,"length":512,"data":[-12154875,620709514,1946172544,-11105770,-1317019008,1390596616,1778503322,-1056810747,-1962981752,11861830,-883037047,-2115204267,-1711209236,90833358,-16742776,-16728448,-970427392,16711046,-16742774,-2043098882,393740029,1778503322,-40990203,-1996442114,25331918,-41484545,-1596099074,-789128459,1265817808,-11533904,-1327822794,1436176639,-1996122360,-1946222970,-2080440674,1962936703,8817198,-1996442369,25347782,-2030165505,-2037514496,-1336869120,-5222400,37460560,815989952,-350182967,-16867701,-1995880567,1439391212,-327029621,1048772866,1996610306,9431299,-451658111,225575167,1358432440,1342185656,151115162,30317063,-2037906070,-1098842368,1946222336,-7944664,-2037776130,-922812672,-16808392,-828762249,-1979356671,-1241579634,-1999730432,-16842366,1979645830,8818141,11555071,1358934096,-1073595494,-919559420,-451666293,547480529,377981419,8818147,666390783,-5222152,3775056,-657455936,547423859,-384130069,-451672321,-1979750423,1439391212,-326898549,440303886,1929445349,406749448,1912668133,-131287027,658683984,30775888,-828766455,-2012911103,2122380870,276103414,1778564506,-129595131,1778503322,-146372603,1778564506,-28931835,1056966810,-179927036,1056966810,-196704252,1056966810,-146372604,-1309260150,-1998007803,2122379846,544473334,477364540,410255932,343147324,276038716,-451404149,-245528634,403111680,31058405,620119690,1946172444]}]],[[{"sector":1,"length":512,"data":[-178353544,-472842057,-485050369,-1336933968,-1181069057,-1996177407,1570831430,-791611661,-1975946280,12055646,1988879313,172264444,-485062853,24510384,2088783936,-5242878,1497366901,-657407710,28316275,-1338704048,1436176384,-1996122360,-940835770,-2130944373,1946223231,1560725039,1586167795,-788482059,381157347,-352210717,1560725010,1586167795,-788482059,381157347,1342353635,-1073663846,-62486268,-789357152,-1589808168,1586226458,122128636,-451273077,513926097,512199147,-195130651,-472842057,-485062773,-1979949429,1183451719,-60912650,-1593030776,1586223880,222792188,-451279105,-1963172213,1183319879,-163149069,339483684,1183452277,-212032781,32655046,1183458027,1008477430,-1961265896,1200356446,-96040701,214983,-96040192,1946043961,-28931837,49446528,1586170997,55020540,-121536,2122329835,242549746,-1946394997,-1065155769,-1039089,2122324715,242550002,-1946394997,-16448697,-67099389,1586169579,55020540,-1946532215,1200290910,-771378932,-230278936,1200230262,-1977867252,-489491882,1200144906,-159481844,-1960610816,1174665798,-60912642,1929594683,-129976307,2209872,30775888,1183516425,-28965894,1183515627,-60912648,-1979496567,12055390,1183572945,277318138,-213480741,-451404149,-245528696,-451410177,-685885697,-1761549926,1575782661,-326412861,-1710822269,71237640,-1963178360,12057694,-1207966767,112255766,1358934096,-1073628774,-28931836,-789357152]},{"sector":2,"length":512,"data":[-1592953896,1586226460,55019774,-451148033,-1963041141,1183318855,37651450,1618346459,1778503322,-45709307,-164224,-828761484,-2012911103,-828703418,-2012911103,-828703418,-2012911103,-773063354,1056966810,-79263740,-1974468176,12057438,-245522550,-472842057,-450971649,-1705967696,93784149,-1946270071,2139160158,-1586167800,-1996863862,-1712650169,-451133821,-1207077366,-1202653093,-1706033118,118030805,-1017254775,-2115204267,-1711207700,71237640,-17201528,1056966810,-142178300,939569406,1979643782,-158955499,-1996442370,-1694565754,90833597,-17201528,-1635115797,12058359,-245522550,-783089481,277318627,-91846181,-2037884674,1048837878,1996610306,17623299,1778503322,8816645,12484863,678691071,-17267002,8817152,952696575,2013198470,30317079,-1903557270,11927288,-2104963447,-2030108927,-579469576,1778564506,-24737531,563966,-2037906369,-2037514503,-1336869120,11554824,37460560,-2037840704,-1098645764,1946222332,1560724999,351010803,-16742771,1342419024,-1705967696,79692347,-17004919,-789357152,-1973652520,-1946224762,-1998252514,-772645753,-24736797,478644734,-56718361,38258430,-91845885,-24771586,-56718338,71797246,-17398134,-16998773,-16562296,-1697178058,93782241,1088755361,1038423715,896663807,1358458296,1342186424,151115162,-1205409017,-1705969515,118030482,-16742771,10000976,-1246231190,1218072824,-1710921216,118030661,1778499738,-18159355]},{"sector":3,"length":512,"data":[-1017254775,-2115204267,-2097085204,31130174,-828741258,-2012911103,-956366714,16710790,-17004918,-16742854,-828762253,-1979356671,-1241580402,-1999730432,-16842366,-335610746,563935,-2037906369,-2037514499,-1336869120,11554819,37460560,-2037840704,-1098645762,1962999550,8818086,145772799,1358934096,-1073595494,-24737532,-1986991106,1439391212,-327029621,-1113980670,-1996133886,44170822,1183402203,16727550,1187448182,-973012994,16711302,-16873846,1178271924,-1709739010,90833358,-16871798,-829882187,-16809336,-16873730,-1232216341,1049493247,163182783,-66642432,115593611,-126572813,-2092248789,460652538,-16796019,-121094515,-1962931527,-217652271,737703078,-92058927,-971213313,-3592442,-153422432,1943589072,-193683442,-657403658,-660994701,-2096601591,31130174,44108406,-1706014501,90833520,-883037047,1374456661,-1560280648,379839768,-451632155,1554120880,-212098319,-1563873630,117426479,-828716756,-1576703487,-1113920719,-1559926270,1048632066,1972955953,-100931579,1048604651,1954605873,826179605,125143275,1057394586,-2141525244,-2098515650,1016727413,-352043264,826179660,91593451,-335791384,826179648,125144299,1057363098,-2144146684,-1762971330,-744880267,-352043264,826179620,91590891,-335751704,826179608,125083883,-349094272,-1591118710,1346951938,1778544794,37651205,192217563,1778503322,-12154875,-1191222295,-1202652974,-1706033115,118030805,-883037047]},{"sector":4,"length":512,"data":[1374456661,-349698361,28311553,-1202716492,-1706033032,93784693,16664263,-25263872,293011711,-771858805,478660579,-2097151767,1929510470,1575782888,-326412853,173968209,1586169738,1963407880,173968184,1183319946,-8486657,-1976667136,-922812602,-1258338680,-1949923072,1217006174,140413697,1946241082,105286368,158587088,838942858,1948269761,-352276272,-1979731966,113925612,-326413056,1586188625,-2012771836,1183383366,-8486658,-1977387520,-922812602,-1962981752,45219398,1317718226,-1996442113,73305038,-2147399542,-1053679415,1183503595,-1996442370,46292460,-326413056,681660753,33555947,-33544888,-1577171319,1174661928,-28951804,1183516278,-349658114,-1981077343,1174666310,-349658364,-388822607,1920530563,-118179827,47184,30775888,28313353,-59310256,-1705967696,93784149,-1949749085,-326501306,180829,-2081649835,28313324,142016336,-1706032976,93784149,-1593948535,1183373086,106859258,-2020998985,11860202,-9050032,-1578426717,1183435056,-79247620,106859008,-2020998985,-922814230,2012956216,-79263214,-964099916,-956539253,1191051264,-1965132293,1586169414,38242556,-1946263925,1586168647,-1593341444,1586227998,55020030,-1694861569,93782241,-1979955573,80371180,-326413056,172395345,-1309990749,-1336913663,1436176384,-1559914744,512486172,1200352028,-350313725,-212007226,-805195776,-1337035816,922701825,11594526,139827792,1183384983,-27358210,973227914]},{"sector":5,"length":512,"data":[74778694,770431113,-1946263925,-350313721,163712,1183501173,-791611898,-1207602216,300613632,-212007226,540475391,142016491,-1073663846,1575782660,1426065098,1364323467,-401967361,1183448647,-60912644,-2020875311,547612956,1560725227,1048772851,1962994464,105286270,-657403658,113668210,-1946160291,126487134,-1057094396,-397410124,547618387,-919559701,-1947525981,-472777634,-384004213,260686729,-350478709,149446,-1947524959,-1981080546,1586168647,-32536054,473861057,92114411,-561446731,-218364130,-60912732,547480529,478644715,142508265,1342927872,-1710721281,79692080,12079851,-1337070848,922701825,11594528,139827792,480445847,175570923,-350478709,1342523277,117997184,24510384,966414400,-804995072,-15633448,-1368010,1996425334,28940806,216728768,-350478709,547555211,-13702677,-899814263,-1957363706,283935724,16664263,-25263872,58065151,-1962894615,-472777122,-384006261,-2080881015,1946220670,1342287999,-1325893889,1342223360,-1761061478,-96040699,-1030458,-1946526069,-196703993,-1996273781,28374598,1316214992,-11533904,11597430,139827792,1183384983,-60912644,1183385483,38243058,955336328,108267078,425600,1996428661,-59310086,-493825,1183512182,1342223600,-2146935041,1946218878,-263797239,-230257920,1183558123,-8853004,33441411,1558774642,1575782911,1738,-2081649835,1048645356,16770330,1048643699,16770328,347606386]},{"sector":6,"length":512,"data":[1119375609,-711307225,-1710814975,90833358,-2131343736,1962997374,45980176,1183384938,30317304,1183319402,45980407,1183384938,563966,1183319103,563957,1183319103,563956,1183319103,-163149065,-388889167,-2131605880,1946220158,1946303520,1946237980,1946369048,1946434580,404654864,1569179365,117375217,1005184280,-163149311,3939364,1586117492,-788482059,381157347,1342288099,-1706032976,79692217,-1963178359,12055646,1988879313,172264444,-485062853,28328820,-1338704048,1436176384,-351955192,-178353445,-472842057,-485050369,-1336933712,-1181069312,-1996177407,1586232390,222792700,-620231109,28315508,-1338507440,1436176384,-351955192,-58817566,-1207339776,-1706023066,118030897,-1963172213,1183319879,-163149069,339483684,1200294005,-28955901,1183463659,1008477430,-1973980136,12055390,1988879313,88378364,-619673853,-2131081591,1963127422,-31113210,-2144080897,1963192958,-96040174,621789315,1586167792,-788482061,-2145653789,1963258494,-96040181,621018885,-420742144,-1208787318,-1948004096,-2021000634,1183570704,-60912642,-1979365495,512488262,-2021071592,2122379613,326435062,-1014431564,-348348534,-472842057,-1980217717,-2289529,-1763322,-1697178058,93782241,-1017254775,-2081649835,144312044,-2012987648,1586166854,-788482052,381157347,1342615779,-1706032976,79692217,-1946270071,1200291422,-96040957,-349561205,-211908728,706644291,184255467,683150706,1807241465]},{"sector":7,"length":512,"data":[-711307225,-1593374463,1346951938,1778544794,1575782661,-326412861,17099905,-620609917,-385648895,-828768025,-2012911103,-956366714,16710790,-17004918,-16742854,-828762253,-1979356671,-1241580402,-1999730432,-16842366,-335610746,563935,-2037906369,-2037514499,-1336869120,11554819,37460560,-2037840704,-1098645762,1962999550,1443284570,-2037514259,-1336869120,-5222392,37460560,-2037840704,-1634992386,2139356926,108331011,-619837697,922685675,145812256,19962448,-2037840704,144834302,-23163941,55020030,-451535221,-2016943151,59164,-451535221,-228816954,-1960908032,-773515746,-21591069,71601150,-417560695,1200288649,371100419,1552386277,-451501582,-451501248,1912667965,-113592307,4241488,30775888,266929929,1575782911,-326412861,-2096567165,1962935422,106859346,11798410,1140475529,1342594697,-312958893,-11533308,-1696395210,93784632,65213089,1183385158,-2134669050,259260479,-312985857,-485476609,1234843647,-1962497279,103482950,1183441682,-96040186,-485489151,-2096740863,1979712638,106859321,1183385483,46367740,-1962516855,-28931833,33965699,16547459,1996427638,-25755898,-1979746584,1325398086,-1947603972,1183447110,72285958,1183564267,1575782662,1426064578,1364323467,954939040,1978488838,-788483052,-1950119456,971182094,1994329743,244287748,1463714015,628465901,-313063738,305594112,-312690461,-312958896,-11533308,-1696395210,93784632,31658657]},{"sector":8,"length":512,"data":[-337440762,-62470365,113700188,-16716457,28900470,-118992896,-62486018,-485355893,-312688255,-411909829,954939040,1978488838,-788483045,-1950119456,736301070,-1981870449,-1892024754,74703116,-519270519,-1017254775,-2081649835,144314092,-2012987648,144373062,-1996210432,1569163971,-196704015,-1208721782,1015515648,-213481237,-348905926,-1880554635,876511232,91488491,1778499738,-100233979,-1924129062,519660550,1292368,108698192,1183385942,-159973386,1778388634,1342287877,-1208721782,-1847040,-1327161673,1436176384,-1996122360,1586231878,41910522,-1341688832,939479041,109962731,1344199418,-1912971637,1344144967,-1274722422,2056933376,-1995876858,1996486214,957174,-1063647894,-1710921215,90833344,-1561049462,113765172,56068,-620609917,-385648895,1048772767,1912920836,67553035,-1711275813,90833344,1358841485,1342177976,1778517146,-62485243,178256,33856080,1586103658,-788482060,277318627,-62520869,-1694599425,90833228,-1706024784,90833015,-1695123713,90832910,-1208787318,-1847040,-1327689545,-946188284,-1341822464,2006601786,-16422400,78707830,13081168,109905258,1344199418,-109640051,62410782,2056933376,-1995876858,1996486214,957174,117376362,1474943748,1575782911,-326412861,112721,-1545267037,715384086,-451632149,1470234800,-245587219,-1561109598,117426479,-828716756,-1576703487,-1113920719,-1559926270,1048632066,1973218097,89233927,350946987]}]],[[{"sector":1,"length":512,"data":[-313049472,-402426880,1048640941,1972955953,-103487483,1048605931,1971907377,110074375,1726678079,-349094272,-402295398,1525414794,-349094272,-1710787178,71237843,1048595691,1972169521,-70391803,1048592619,1956703025,826179591,125149931,1442842266,-2144605434,-1796525762,866126965,1943589099,-35592173,1048582379,1972038449,563719,703268523,1222312609,40933968,1048773994,1963055874,30317067,1183319402,-12129793,1358527160,1342194104,151115162,1575782663,-1957363509,108954604,-1207143424,-11470422,-711326090,1560742145,1426064074,2123099275,-1338143482,2147465472,-1946417378,-234429487,737703342,-796308783,182877,1374456661,-621148531,1586188318,503811334,664425296,1342532096,1443265178,-620715255,-620742913,1778388634,1575782661,1426064074,109964427,1344199418,-1710852353,156632485,-2424669,-1696923594,90832910,182877,1374456661,-100233903,-1957683494,1200424542,-1974460927,1342223367,1443265178,-620715255,-620742913,1778388634,1575782661,1426064074,-326898549,-129579512,108953604,-1975159296,-922814394,-1946663288,254085190,-112818176,1859323057,-109150200,-1979223286,805632326,1183451115,742458617,-129070582,-829882187,-2080750968,1962936446,108953606,-33196284,-1242888626,-621148531,1183469598,-1996442376,-95777338,78729502,11913258,108698193,10684758,3604443,957147,-326564502,313949,-2081649835,1187449580,-954195721,539031878,100026054]},{"sector":2,"length":512,"data":[16154240,1183462518,-2000093450,1183577670,702726,-235417039,-134330743,105810913,-1048328149,-163149264,-964099916,-1946727800,1183448646,16286470,109954677,1344199418,519521933,374864,108698192,10684758,3604443,957147,-326564502,182877,-1192457387,-1705969210,90833048,-1957311651,251613676,109959938,1344199416,520046221,43686480,10684758,4096987,225706203,1358533304,-620742913,151115162,-12154361,-883037047,-2081649835,2122516204,1517682694,-621279603,1996443678,-62485242,1183666206,-1706025222,156631858,-2082799453,14352446,-1833431692,922702073,-711271680,-16316159,10094710,-1995895808,1992558303,-95515652,1183712798,-218357768,-1957093468,1174534726,33958152,105261531,-326524693,313949,-2081649835,2122516204,997588998,-621279603,1996443678,-62485242,1183666206,-1706025222,156631858,-2082799453,14352446,-1833431692,922702073,-711271680,-1962473215,103414342,1177148162,-1983911162,46816748,-326413056,-28930735,178256,33856080,1183516010,1575782910,-1957363509,-1957604884,1317668422,65110024,1183369426,1962949884,-62470652,105810689,254337,-771209590,-62520640,1183383732,-25263618,91357585,-1845596543,-27358463,-669022326,1023231624,-1978632705,-657456058,-662109069,-4706837,-1977029633,12057950,-685734006,1963476538,-1948004080,1003042439,91555398,-335657333,-62486006,1174470836,-1985025026,113401324,-326413056]},{"sector":3,"length":512,"data":[-5222063,-669041011,503419321,-1426916345,16598726,1222048929,-1241690486,2009611008,-1966372564,-1999167353,3996742,-783279500,918028259,1358934217,-1979761688,1183514182,-27358211,-669022328,1979533054,1575782855,-326412861,-1224319350,-1333279232,-899809319,-1957363710,149717996,-112953,-687955457,-2131147128,1979775358,-112817613,1183369470,-1996442375,549421251,91554007,-338223454,-111244773,-472842057,-874608757,2013152827,-28931630,-1560721782,-940845282,-685891958,-1082130249,1946212128,-28915851,-56492033,-112817962,-1963434360,11860294,-687995333,-922865546,-1258731896,-2134669056,14098623,1183319413,-1977881608,12056926,-2020875311,1178323934,-1982826498,1183514182,-129595143,1586152939,-1979664392,-791039865,-1709607976,93782626,-1208459638,-1333294592,1943589081,28332807,25290832,987176608,58062918,-956267031,64070,-688122229,-1258797430,1255156480,-489486927,-687335933,-1963174263,-1210638818,-1847040,-1697958729,151781376,-1006182775,12188286,-1910613503,-1510802214,505317919,-1979664425,-1965612921,12056670,-685734008,-685891958,-472842057,-1258797430,-1948200704,-1983302001,915179974,-561017911,-561215029,505318091,-1979664425,-1965444985,12056670,-642742392,-685891958,-2017066825,-973023456,14266503,-1593953560,-326510818,-1957313699,116163564,-1999176543,1187446086,1187447036,-2147483394,-1342112386,1073838079,-1963043189,11926606,-2091855613,-5238534]},{"sector":4,"length":512,"data":[1497366898,-657407710,-1981217934,-45708800,1183369470,-1996442371,546278083,-78739241,1946220928,-788482777,-1981558303,1823771598,915377109,-772734007,1824293862,209059791,-2020949111,-789128784,494131408,16547456,1996425588,-59310086,-1979691288,11861062,-956414463,-352256954,-58818545,-1979288320,1183382854,-62456070,2147253888,1996428661,-59310086,-1979702552,11861062,-956414463,-385811386,2122383185,158597372,-362753,82377846,1575782656,-326412853,-1608717181,-657402081,-890698894,520537600,2122318039,175513092,-1274788214,-687824128,113706731,2021120,-1311309663,-1981230329,10613830,-754339369,-230258208,-104200563,-1929886071,11926110,519458441,1187270992,-1706031374,152568212,-2081405303,1946218622,-260144889,376766688,-919337331,1187270686,-11532552,-962922890,-1995892733,2122575942,208929008,1358549176,-1695516929,118030805,-1982137695,113763910,56058,1358556600,1778403482,27892229,1090783687,1183383732,-100233744,-1924129062,1344204870,1342177720,1443265178,-263812855,1358571704,1778403482,-431584507,-1965360477,11994718,-685727862,-472842057,-1274657142,-1948200704,-1982501729,914656198,-775748663,-1950119456,-1982894969,-125567930,-385649409,44105892,-62486057,-1258008950,-1547631872,104584962,1047975680,1003946145,1943470598,426759,-253026601,-1311309663,-1981754615,10613318,-754470441,-196703768,-919324929,116541124,4889168,1183385942]},{"sector":5,"length":512,"data":[-260144144,-385649664,1183449255,-1996442620,1183514182,-448362490,-1979955573,2122575430,913703166,-1209704822,547326464,-788482089,-448361757,-523173708,-714301557,-2071214455,-1023162058,-1014374191,-1980871029,-19960689,1191175502,-28377106,1183565035,-754339332,-230258208,-1308866933,-1981230329,1187509318,-1962934040,-1965622250,11798086,-1320497109,65196805,-1982396394,922741334,1187301684,-1974466840,11797574,-150863687,1187270881,-1706031374,156632250,-2081405303,1946218622,1812383249,750256371,1996443898,30776048,2122319625,309723140,-1224319350,-1333279232,1325269209,72285702,-326506261,311901,-2081649835,512367340,12048158,-685734006,1963607610,-1948004072,1003042439,225773638,-804895094,-385649704,-1494678882,175570690,-1341622529,1575505920,-96040454,-360829,-1024916619,-94467328,-669022326,-1259911544,-33146112,-385649706,-523173724,244040585,-1886791930,434686942,-685858053,-688122229,-1259911542,1255156480,-489486927,-687335933,-940943735,59462,-685891958,-472842057,-885737473,201326746,115312905,-1175947580,102629632,535053966,530969340,175570777,-1341622529,-571977728,-96040455,-1948836192,-2021066146,11851807,1317716873,546277386,-1948003881,-2021062586,1586153782,-1979664409,-1965444985,-1210638818,-1333295104,-413234471,-2017066825,-973023456,14266503,1183450859,-685858073,-402585111,513997432,175570903,-1341622529,2112377087,-96040455,-1948836192]},{"sector":6,"length":512,"data":[-2021066146,11851807,1317716873,546277386,-1948003881,-2021062586,-109000394,-1253477385,-1981689600,-595117109,-1207078195,-1202652603,-1706033122,118030805,-1224057206,-1948004096,-1982501753,-125568954,-1207339521,-1706023129,118030897,66608779,-472840098,-814970997,-1577826679,350996788,-1995946357,1586164806,-135561206,-472842057,-624785525,-2081667447,1979708542,505317918,-788482089,884473827,39627,-544667380,-1191182152,-218365696,-1957827669,162657350,1183441107,-196703248,-388823119,-899447,512420982,12048158,-1207966767,10144564,101256192,33601619,-263797680,-1449504762,-1995876863,2122575430,208929006,1358592440,-1695648001,118030805,1087833761,-2083060061,57934072,-956263447,-954,15156934,1222048929,-1243132278,2009611008,-2134144740,14098623,-472838540,-874608757,1945912891,-62486269,1978091262,-58818089,91455488,16533191,-414792064,-688086784,-414283192,-935657291,-880196489,-685719680,-784960512,-561542173,-62506037,-2016999309,52190,1586106091,-788482073,-62485533,-874608855,-1209573750,-1948004096,1003216519,1926694406,111362052,-414777641,512405365,12048158,111272913,-561542697,105286347,192141520,-685891958,-2017066825,-1962944080,-1210638818,-1948004096,-1983171449,113925612,-326413056,621299339,-11533825,1183517302,-754339576,1996443880,91265542,56165783,113925569,-326413056,-1224057206,-1948004096,-1546294137,-125577452,-1207339521]},{"sector":7,"length":512,"data":[-1706023129,118030897,425603,1642660727,175570689,-1341622529,1342223360,-1544071192,1048827664,1962923792,270437197,528976599,-1962887976,735509526,95505104,369353427,378132232,113760028,55066,-1710459137,151781376,-1006182519,-1177085386,102629632,536757902,530969340,205947225,1191117312,105840392,1586139883,-788482294,138841059,-841185477,632818038,832196647,-1962473214,64427038,-472840098,-814970997,-2083056989,544604152,-1710459137,151781376,12115849,16824576,-5508356,1325336646,205947142,-1326775808,-1311305055,-1545546999,312596236,-754470441,-686906392,-687208761,1325334529,138870534,425603,24641456,337546048,140379095,244048849,1346492178,-814969031,24444848,-1054713536,594794704,-16091393,11536502,-397410124,-125569444,-15698433,-2684410,1191118414,302448392,-4854825,-3591114,10095734,101256192,-687169197,-150863687,113529057,1342625548,1442949530,-686251255,-686276989,-16157696,-1697179594,118030897,-1177089375,-503905792,-385071615,-899809642,-1957363704,209125356,-16091393,1436157558,-1559914744,1183566128,33498378,721551545,839813576,139344841,1183516278,-919428344,576093,-2081649835,1979714686,142016304,-16353537,-5239690,168204880,849413527,205924809,-1996077567,175541185,-919585141,-218364130,-919428700,-351648255,147480010,-326413056,-1224188278,-1948004096,-2021063098,77712860,1820821975,105251797]},{"sector":8,"length":512,"data":[-2133392221,1945569406,50347269,-1665659530,834162938,-711307264,1560742145,1426064586,-967709557,-1593770170,-1974937860,11927374,695715899,-2020947063,1178261280,-1978043130,-791039865,1359442904,-397409872,1586165851,-973031425,14098567,1979664126,-174200630,-899814263,-1957363710,250381292,-688126265,12058624,33566141,-956414327,-2113932474,-2687938,-1956154624,-958989282,14098567,1342308536,519456397,2005584,1183385868,-92371974,-1958251264,144963654,-65106985,-1333279018,-472842023,-874608697,1183449088,1943589107,-28931298,-885749879,1087831201,-2116616541,33619582,-125631118,-972786347,-16714938,-2116617210,33619566,-4681237,1816038911,50379215,-218364130,47275,-841204083,503367865,-1410139129,-1912602696,-1177195458,119406792,-1196690692,77791232,-687430697,-1546183006,113694466,-385886433,-326503221,-1957311651,530600428,-791611689,-14715944,-1698089930,152568352,-2080487799,1946222206,-25755896,151138714,520537607,-326500393,-1957311651,149717484,563712,1183319103,45980411,1183384938,33983486,1183402203,16286204,-385648892,1773666313,832196647,-1207498494,-11473572,77266038,-1979356670,12057438,-245528694,-1996929400,-2131928826,57999608,-1979703063,-152356850,-1996442415,1015515843,889600747,2013245675,-1054719999,57858256,-973074711,15554566,-313063738,1575782656,-111244597,-472842057,66995851,-1982132089,-1964830714,12056926]}]],[[{"sector":1,"length":512,"data":[-348354678,-312998264,-1979955573,-1964830202,-1997852410,-957524218,-973014458,-1979647930,-152356858,1926811856,4909315,-313049472,-385649502,109772864,-1065229550,109702492,1048697590,33612562,384369527,-87771136,9607760,922683145,-979705072,-1996051711,-1949606420,-1914498498,-2014487419,-1329493561,-66642432,-326522126,-1957311651,183271916,108954369,-1962511360,130418270,205964288,-17398135,-17267060,-1995815285,-1946223994,-472840098,-624783475,-1006218978,106892358,175570768,402900634,-28931831,16678531,2122521460,141819910,-972661109,1542192903,-17398131,-25755824,151120538,138840839,1342240517,1342177464,91265616,815990167,807308233,-264273719,-2037576332,-11469066,-358941066,-1962473215,-1949749218,162595655,1468786899,-754470651,-1950219294,-422508426,-622689143,-1996011637,-1982147964,181034476,-326413056,-972493693,-2428410,-625983869,-385648896,113639645,-1593779468,-1974936912,-1243941874,1992833792,13101315,-783285840,-3438111,-1327844681,1436176384,-1996122360,1586231878,105352698,1200246814,1342223365,-1260718944,1183666176,177885433,-2147064064,1946220926,-621108921,-939637111,14350854,-85936128,4758096,1586169194,88575482,10000976,-1063647894,-1207604735,-1705968907,90832968,-956300134,-94467319,-1710864504,90833344,-1543616885,-1762927878,-790957408,-970886184,14349062,-621672762,-603536384,-1336932614,848973832,-1610301437,-789128461]},{"sector":2,"length":512,"data":[-663496496,-621535606,-472842057,-624785523,-828747746,-2012654080,117373254,57989876,-956356375,14349574,-883037047,-2115204267,-973011732,-2428410,-1978769781,-1040317105,-1257932915,-21066496,-66642178,-2037537550,-11469058,-1915030474,-1924071866,1358888070,1728206746,1943588870,1342287960,-621535606,-472842057,-625821697,-1706032976,93784149,-1961998711,1200426590,246960133,1996443899,-621502210,-1706032972,140902414,-1544871775,1856101130,-620190732,-211024186,121674495,113640511,-973016212,-2428154,-621541690,1575782656,1426066122,-326898549,173967882,-472842057,-624785525,-113015,1183452278,1342223370,1728236442,-62486266,-229757,1183531380,140413948,1183516553,106859518,1183516553,-754339332,-129594912,-1308866933,-1981230329,1183578694,-621239298,-621279603,1187270686,-1706031368,156632053,-1326037367,-1341985793,1575782656,1426065610,-326898549,106859296,-2020875311,1183439570,140413924,1183319946,-1995469342,11855950,1317652483,47334,-1980742007,1183444038,-364475922,14843520,1586189430,201820904,-515471328,-1964614005,550076431,-1948234104,45215814,1451933907,855684833,-263812670,-739490165,-530675008,-1020067657,-1947449719,-925635002,1183433523,-364475410,-1036793645,-18200951,1191174734,-431030296,1183557355,-137219600,1451877494,-297366530,822093241,-1980631086,1183578710,-137219604,1451877494,-364475396,-235417039,-2080876919,1962998910,-62470395]},{"sector":3,"length":512,"data":[2122514433,91554040,33048263,105286400,1342240517,-788111733,-28931101,-622688509,1342222416,-1761251174,-163149563,14894790,635666048,1586193523,-92894218,1962948736,629112843,-1202490113,1709965311,-1946788213,9108086,-523173708,-1056764019,1358055049,-1341622529,966414591,-804995072,-1961593896,126486622,1174601908,1183400178,-1950119436,-30479609,1183572806,-96074760,-2080749943,-1670240776,637169283,1183553259,-28965892,1006519945,108192838,702826123,1558838854,1575782911,1226,1374456661,30317137,1183319402,-45708547,3948580,-1394015371,30317056,1183319402,-45708547,3934244,1586105972,65241341,-2020998985,669773125,620578442,1962949760,-45708783,1346138148,-828766092,-2012911103,-828703418,-1274713599,-1966896896,-1997447801,-1113916346,-1979356670,12057694,-2029788207,1183439632,926843134,1232404715,-1208197494,1015515648,-348675349,-1543616885,280550150,1218072827,-1979356672,-1209321698,-1847040,-1327689545,-946188284,-1207604736,-1705968854,90832968,-620349697,-1706031952,90833095,1778499738,1575782661,-326412853,563793,1183319103,138840831,-388889935,1183318820,140935422,1962949635,-10581493,-2020998985,367784285,33455744,1586106997,-1979664385,-1208787297,998738432,-12154644,-804895094,-1978305576,1586167366,-2013219064,-1964159609,-2021064890,334228817,-1963047286,11995230,-313948280,-1996536182,-1980938873,80371180,-326413056,-1610158973]},{"sector":4,"length":512,"data":[-657396934,1436552051,889586413,-339149077,-313155577,-348846590,-1963243896,104465990,91679541,1996179002,1463713862,309699309,721974923,-1964830666,512427590,8968950,1586114027,-788482294,277318627,-28931619,-1995946357,79232070,1183666176,45109500,171376464,171481827,109249943,-1996168438,113925612,-326413056,1358638264,1778403482,21338629,834144009,1218072827,-1979356672,-1209181922,-1948004096,-2027223482,-1336878320,-946188284,-1710921216,90833344,182877,-1192457387,-1705968840,118030482,-1710983425,111870405,180829,-2081649835,1187456748,-1711275782,90833358,1183383732,138841086,-523040591,-1979824637,244053062,-939269360,-1694740855,90833358,-1948432760,1543894086,-163149331,14304966,618481290,1946172544,-582579690,-388889423,1183318820,-1996442402,1369410243,-1975915539,1076157766,1148518460,1056966810,-498693884,618481290,1963998320,-497120497,-211902582,-1618345801,283896891,618481290,1962949744,-497120494,-245522550,-2020998985,1183378236,-1962021920,-1618288034,-320081316,14698182,618481290,1946172424,-582579676,1183318820,-1996442401,1237287107,108331757,-314204278,1586110443,-1979664417,-336771705,-582579629,3932708,144319348,-2012987648,1586158406,-1979664421,-1997382521,-472785850,-417560693,-956676471,-335553978,-582579670,3932452,144315252,-1996210432,1587514051,-1979664397,-336839801,563723,-1014430657,-245528694,-1965275512,69524806]},{"sector":5,"length":512,"data":[175439932,1778564506,-129595131,1187448299,-2147483400,15554622,1586116980,-1979664420,-1997849465,-75439802,-2144635648,1963133566,-193035495,-1961069055,-1991707066,-1014368698,1973043072,-871905778,2122320363,57934346,-385812759,2122318245,1215561952,-1209966966,-1964781312,11853894,-1886658351,-1014375152,-586117333,-1981395319,-754667064,-398030368,-1980086781,2122441798,1930428646,-96060667,1996424819,-31921924,-1981528437,1183513158,-515471136,-153467254,1943589072,-597784030,-472842057,-619673717,-1980086781,1178330182,-16354310,-404161418,-465138691,-1963309431,-657455546,2122347379,225706208,-312992118,-472842057,-337623414,1478396427,-788482067,-515470621,-523173708,-586117237,-1892957303,1317657872,-431584282,-523041615,-2115484023,268494462,1174603891,-62505988,1996424819,-41096964,17464960,1183518837,-62520344,737824395,48858056,1183517931,-62520344,737824395,1317620168,-96039942,66477707,-129629433,-1946532215,346291270,-312958749,-1964155998,1520568902,-1996442387,786682307,88319999,-1946532213,126416478,16416385,-2122812927,-8324482,1183451506,-791611898,-9931816,401144950,-1956582403,1586231878,-351827466,-513897898,-472842057,-586119285,-1980342645,1479999239,-59310099,-1696499969,111870281,1183528427,-161575942,1183516553,46171126,-1963571575,12050782,-1886657583,-1014375152,922685321,1183575384,46171132,-993399984,-184227068,-1996155388,113925612]},{"sector":6,"length":512,"data":[-326413056,1048596817,1946217270,37651273,1198916059,1778503322,-12154875,1183510507,1343169791,149618864,620709514,-5222385,13736528,518719147,-1963100417,11861062,-335564720,-42533109,-1258535286,11554816,35166800,1048774315,1979833090,30317114,1183319402,-12154113,-388888911,-1963047288,45219654,52750546,-1963112824,52756294,-1963178360,12058206,-13704239,1845878695,-2012907515,-1996122875,13327852,1374456661,-621148473,-326565888,-1957311651,1839223276,1943589107,-66679538,-1706025254,156631246,-2130819447,15414334,-1063647884,-1610257919,-657396944,109907571,1344199418,1442893466,-28931831,-1760835942,1575782661,-326412853,-349134767,242473168,-621148531,-828747746,-1995876864,211484230,-1207498496,-1705968794,90832968,-1710852353,90832968,-899814263,-1957363710,117395948,1048632078,1946217268,29399562,113640810,-16717004,1218053750,-1996133888,46816748,-326413056,-1610158973,-657394836,1991793779,1218072827,-1710921216,118030661,-621279603,1183666206,-1706025220,156631347,-1191557495,-1705968765,90832968,-1325500673,-946188033,-16422400,78707830,13081168,-1967651478,1218072827,-1610257920,11856689,1342353488,1778435994,29399557,815793514,1943589099,-100233970,-1706025254,156631246,-375159,-1332083594,-1995895808,46292460,-326413056,-1341723517,922701825,11590408,139827792,1183384983,-27358210,-1995880565,1586231878,41910526,-1340967936]},{"sector":7,"length":512,"data":[939479041,-1706032976,93784149,-335657335,-28931099,-1979955575,88575427,10000976,2122515818,963903738,-1706022736,90833015,-11533904,11598454,139827792,1183384983,-60912644,-1962586114,1200487518,-1734717435,-1962579456,1207893086,1344843781,1778415514,1575782661,-326412853,-1710721281,118030429,-402229505,-899809581,-1957363708,-2091822612,1946222206,-73811963,-1414003733,1570394363,-1928918784,519815174,140413776,1342572484,-1710983169,156632698,-1694611831,90833344,-211024186,108461824,-1979805976,80371180,-326413056,1358676664,151018906,108461831,1576957672,1426064074,-326898549,1812383260,113770483,51500,-1982136671,1183575110,16286700,-1545010315,-620190975,1347486129,11796656,139827792,1183384983,-27358210,-1996273781,1200352326,-230258425,-1325401981,1073837567,-1947974008,1183384903,155683824,-1947318647,2139160158,376700930,178456459,1359065563,1342222416,-1761061478,-28931835,1183572459,-350444546,16402119,-465139200,2054412496,-772645237,-1031303709,-1957683494,-1913971682,1344144967,-1274722422,1419399168,-1995892734,2122578502,1148453114,-1982137695,113763910,56058,1358685624,1778403482,471763717,88575467,10000976,-88603286,1218072827,-1710921216,164036612,-350478709,-1710864504,90833344,-1545189749,-1796482310,-772645237,-1031304221,-621239334,-1449496597,-1274427648,-96040704,-621279603,512446494,1200483100,-1974460922,11797831,39098960]},{"sector":8,"length":512,"data":[1183385880,-92371974,-1589480448,1183439610,-100218906,-1207959334,-1705968619,90832968,-350478709,1342523277,1778423962,-64505851,4758096,77202794,-1274427648,-96040704,1778499738,-431584507,-337970525,-260144229,-1960348672,162656326,1183441107,-263812120,-388823119,-1914026359,517666822,-398015408,-174436346,-1995876861,1593834054,-133788412,-1706025254,156631246,-2080749943,1946221182,-92864760,151138714,-28120825,-211024186,1575782656,1426064578,1586228363,58688268,-1975487488,-657455546,-1063642509,-1962579455,1200426590,-1734717435,-1207604736,-1705968569,90832968,-1706024784,90833015,-211142913,1778388634,207522565,-1560066165,1167776520,1560742145,1426066122,-326898549,-100219126,-1207959334,-1705968545,90832968,1711453850,1510392840,-397408517,-1046807107,-972658944,15554310,1694635674,64068103,-73791540,-1006358784,117136902,-40114096,-789286240,-1923976232,519874566,-1442411184,-1202708740,-1706033123,156632698,-1912715639,519882502,-922317488,-1202708740,-1706033126,156632698,-1694611831,164036612,1183383732,-486109698,-1924129028,519890182,178256,108698192,1183385942,1862700542,-163149325,-1963434356,-1242337778,-95516416,1364205137,-51968371,-1801826274,-1995892735,-1923482042,517667846,1862700368,-1605361933,11858798,39098960,1183385880,-25263106,-1928563712,-11471290,-358941066,-972617471,-824058,771834010,-313090040,477354192,1358751928,1778403482]}]],[[{"sector":1,"length":512,"data":[1644610565,-1336932613,848973832,-1710964733,90833344,151001754,238977799,896794843,150998170,-50087929,4758096,922682730,1285217038,-1207604735,-1705968368,90832968,-789892960,-1928432680,517667334,13539920,1183385942,10394366,-326563572,-1957311651,105286380,678680784,-349423989,1183573713,773753608,-1593800213,-1556026580,4057900,-1207078396,-1202651864,-1706033152,118030805,707165,-1947432107,-773116874,172395494,-349299061,748748937,748896491,67124715,1085803890,12079357,-711307264,1560742145,1426066122,-326898549,1342287898,-1324857717,1357435657,-1706032976,93783408,-2130162037,50462689,-28931647,-1957690960,162596422,-1336874797,1889161216,-1962567931,-511637938,-1056767489,-2130950519,15951934,-1259797643,-27358464,-1224515702,1015515648,-398030613,-1963172213,11993951,-348352630,988237448,-1961593407,1200356958,-60912892,1996769083,15329539,-1979662103,12052574,-2020875311,1183440144,-413234442,-472842057,-586117237,-1309389175,-1981230324,1183576134,-1981230092,1183575110,-754667018,-27358240,-1996208381,1183576646,13665264,-1996484827,1183576134,-1948199948,1191443550,-297367292,-2081667445,254083280,-330921728,1978680889,-230257906,2012104251,-230257838,1978549819,-163148944,-336312773,-27358363,-1996077171,1988885062,105156092,-1963440503,1194853700,-1962510587,1200291422,-381253627,15302272,1586180214,201820922,-347699168,-1963434357,550076431]},{"sector":2,"length":512,"data":[988434056,-1341884735,-1977291777,1178266438,-15043862,1191180870,-380698888,1586219755,88574718,989617803,317261127,-1996443393,80371180,-326413056,207522641,-2013050998,3997510,1586109044,-788482049,277318627,207522779,-16496895,-1697178058,93782241,-899814263,-1957363702,451707884,15288006,-212058496,-1207208704,-1705968296,118030482,28325355,1545505360,-788482061,515375075,1358934245,-1761061478,-196703995,-586269053,-1962183424,1200354398,-586243325,245434859,-195130403,-972863607,-1593708730,-1974934246,11923278,58116155,-1996443927,1019183307,57934059,-1342137623,-472821759,-450971649,-1706032976,93784149,-1963702647,-1057034426,-1947384184,2139157598,1970536460,-18139744,-348806464,-1209049462,1015515136,-195130389,-1995815029,1183512134,989902061,1944394246,1359065424,-1014374191,-450971649,-1706032976,93784149,-1946925431,1200354398,-163169526,1586113141,-2147436563,15416511,1988828789,209486068,-1609206784,-1057035467,-1997851230,-1360761,-1697178058,93782241,-336771330,-280559963,1122567028,1426507519,1187381485,446759407,1317685477,989902319,-1994491960,1019183307,276103403,-313194754,-18139744,-348806464,-348354680,1978615550,-348479275,510908624,-1998251359,117368902,899738965,-1564410133,1183378229,-396457241,-2021130057,899738428,-1312751893,-1981680126,1048638022,1962994485,16823557,1187443278,1183449323,889600747,-1272743957,-1981755136,47555]},{"sector":3,"length":512,"data":[-586117239,-552693879,-519270519,-1209311606,1183811584,-347668756,1436603509,889596141,-280574229,-451239679,-280065464,-935657291,283706230,-1966372607,-1997849465,28371782,-1846960,-1327161673,1436176639,-1996122360,1586230342,209682676,-1978567424,12053342,1988879313,54823924,-586119287,-1963696501,1183320135,1946172652,-1996442566,1002406083,259260652,-331636854,-2020998985,1178266428,-1978894613,1586163526,-2013218836,-1964229753,104524870,192277307,988497546,58124614,-1964423544,12053342,-2020875311,1183441164,-195130376,-1324595318,-388870139,1492010632,339483684,1187382389,1183450094,-346125586,-2026241865,74902598,-330922104,49184384,1183517045,-31112968,-2145326081,1963191934,-129594613,621789315,267124720,82738816,1183517813,67044856,-1979973595,1586165830,-788482065,-129594397,-619673719,66346635,1586103111,-788482069,210209251,-280559903,-521600140,-619929090,-939637111,64582,32196294,988497546,1995126022,13428995,-1014431564,-330922102,1022248584,-1962314494,625015878,636223486,65961600,1183517557,264274940,-335548379,-293699564,-1962183420,-16384954,-67099389,1183515627,-96040452,-18129270,-788482101,210209763,-95515679,1177272579,210209276,-61961759,1980758403,-59866361,-28901616,-1209311606,-1948004096,-2020999610,1183571216,243763708,-347698465,-1957690364,-2029781946,385292,162613250,-1705973549,93784693,-1209311606,-1948004096]},{"sector":4,"length":512,"data":[-1310651257,-388804604,-1979824637,626589254,1174601743,-62486020,1980758147,-28901625,284978819,1961576190,-14096125,-789890400,-1974963240,12052830,-2020875311,-2029788916,-1065099506,-754667249,277283816,-263812643,-1964489078,-1209320674,998737920,-263812116,-1978662867,12052318,-2021006383,1586158864,-788482072,277333987,-1610612517,1168304949,-280574228,-451239679,-280065464,-935657291,-880206985,-348348534,-472842057,-2020875823,-880156914,-619673855,1978615550,604423384,-1336932611,848973827,-1996177405,13327852,-2115204267,-956230932,62022,1005733515,57804358,-1325315351,-523153151,1586218633,-1338966264,1436176384,-1996122360,1586232390,41910524,-1341688832,939479041,1183573483,-28931588,1334494089,-225540091,108498430,-17580403,119406773,-1331367172,1586188289,58195966,-1706032976,93784149,-1946401143,2139159646,125043458,-11533904,-1947866313,1200290910,-259618813,-1996442370,1016040131,-292648725,-59339778,-1996204917,3996246,11886708,-829824559,-586118005,-1963438455,989785734,2011903238,1342287950,-1207966767,11592990,139827792,1183384983,-60912644,954940320,796198983,-1014431564,-331636854,-1618345801,12053308,-2020875311,1183440144,-128545802,78762027,1442964179,-129594886,1187448299,-1342177032,2006601760,-16422400,78706806,13081168,984614250,7838288,1996424554,1342484730,1778435994,-255950843,175374590,-17922422,-348846534,2092434806]},{"sector":5,"length":512,"data":[-1207702531,-1705968251,90833048,-17660275,10000976,-1063647894,-16422399,-1410731450,1575782910,1426064586,-326898549,-28915900,1183514624,1183401990,-1119435012,-62485760,-2080487893,57804536,-2097114903,1962999422,-58817783,-385649664,1183514753,1183400190,-163148810,2013021755,1183402060,-160003084,1586226897,-1996453112,1988881990,-1947807244,822020190,-1695648001,124059763,309582032,-772508021,140413926,1082720395,-196149502,1988876523,-1947807244,1586228806,37783816,-336181505,-1115782996,-385649408,1183449549,-2000093507,11844934,-964042543,-1982444917,1116470862,-62486082,-1946197271,1174666310,-1981230594,-523111866,1586218633,-1996453112,1183575622,-96040450,-1979955573,-523110330,822068873,-1695648001,124059763,729012432,-771983733,-226587674,1586227153,-1996453112,-59340031,1183573713,140413934,1988821129,-1947807246,9111646,-1161591,1988882038,-1947807234,822020190,1694528410,1943588871,-25785497,2123097809,-1947741710,9111646,1988821385,-1947807234,1586228806,-1962899192,-422448522,-1962385781,-297367296,-771983733,1345388518,1694528410,1943588871,-59339989,2123097809,-1947741710,9111646,1988821385,-1947807236,1586228806,-1962899192,-422448522,-1962385781,-297367296,-772245877,140413926,1183383691,-96039952,2012759611,-1948200610,-422446986,1586218889,-1996387576,-92894464,1183573713,140413936,1325334665,-126448648,1586226897,-13566200,1939533430,-804821760]},{"sector":6,"length":512,"data":[-1947766056,-422446986,-1962385781,-263812864,-375041,1988882038,-1947807238,822020190,1694528410,1943588871,-1947866212,1177286726,-61961218,1006259755,-1977781311,11844934,-964042543,-1980084597,1183569482,-1102935556,-1980217717,468450374,-1262664054,-1981755136,-28406842,-1948890487,1116338246,-96040002,-1963047287,-1057047226,1019037320,-1207340532,-1706023055,118030897,-1979862295,80371180,-326413056,135457921,1358794424,1778403482,-242825723,-2037775881,104527857,58125109,-1274963991,-1981755136,277318595,1342484957,-2037784365,-1319569414,-1981230324,-956827514,33025926,1222974113,-135295350,-935657291,1558774646,-1966372607,988494983,1962406278,21293315,-783285840,515375075,1342222565,-1761061478,-28931835,-1543616885,512477488,2139146544,259260418,-11533904,1342222391,-1761061478,-1964709115,-1208488034,-1948004096,66583174,-1982132089,-1946683770,-2080900986,-2037841712,548468724,7838288,-1224800918,28375028,13081168,-1224800918,78706678,13081168,-944241302,1218072829,-1962579456,2139356766,141885443,-135100729,199950336,-1946263925,-1991769273,-1946684794,33026694,-1946683770,-2080902010,-2037841712,-1336870924,-946188287,-16422400,-1325926730,-946188284,-1207604736,-1705968182,90832968,-106869,78644087,13081168,-843578006,1218072829,-1962579456,-1916194786,1183384903,-1734717188,-1962579456,1065417822,-972589546,33026182,397413355,721182347,-259618809,-255950601]},{"sector":7,"length":512,"data":[242614519,-1706024784,90833015,-135229698,28371947,-27358384,-1341491201,1436176384,-1559914744,512477488,1200474416,-1734717435,-1710921216,90833344,-135297282,-1813445772,-242811138,-385649417,966852188,-791611669,-385649704,113705098,60204,-134445427,-991220061,117273606,1342419024,-1073532262,742294276,1752432875,1358811576,1778403482,1745274373,-2037579533,-11470852,-1695863754,130810215,-134445427,741801808,39659,113706956,60204,1358822072,1778403482,2013709317,-1336932611,848973827,-972767229,-825338,-134445427,741801808,23567083,-2037577780,-11470852,-1695863754,130809856,-883037047,-2081649835,1946158206,-31148020,74907472,151115162,46292231,-326413056,105286225,376690896,-1005826305,-1977218978,-1325353977,31511304,-1367546,1183516742,-1981230836,2122579526,326500606,638082756,100730763,1183050530,1325335048,-1947735042,-657454010,1589906547,126494216,100729012,-326505694,576093,-2081649835,1183518956,-754339574,-163149336,-1995815285,1719795270,-2097021174,1996491902,10414339,51005067,4000838,-955812344,134281286,1183517163,205914890,-1946663287,391238,12142594,-137219838,-196703759,-1928962421,1996443919,-159973618,142187088,1586169239,175540998,1183383693,-60912390,737691275,-129594938,673479,138840576,276027600,-990349569,1344207430,-1694599425,137232413,-621017459,1187270686,-11532550,2056976502,-1995876858]},{"sector":8,"length":512,"data":[1996484678,-19076880,33048203,1177157190,-196703476,-369736191,-326500519,707165,-2115204267,-1207422228,581107712,-349003541,-657403658,1810432882,1882113,-942258551,1515053638,-348709238,-472842057,-586117237,-1577562487,1183439622,-465123338,211877892,-330921501,-1981608287,178384454,309731,-235417039,-1964489079,-1208787938,1015515648,-830043925,-788482825,-1950119456,-1982001009,245493838,243729373,-230258209,16008903,-96024832,178323484,482378723,635324041,12124671,-1983370494,1183572046,33490398,-388822607,-1311226231,-1981754619,1183439942,-632895510,-2033844224,-1979582513,989319046,2011903238,-788482999,-1950119456,-1895572914,1317658892,-1312257574,65590025,1183438918,-632910888,-1996357851,-2037720506,104527823,343272517,14319235,1187448948,-16776998,1183569990,-431584808,-137394434,1187491189,-1929379588,517667846,-498692784,481841182,2056933376,-1995876858,1996488262,-40572674,1342184632,518145677,1342222416,771759514,1342353416,-485869825,1342177464,-1924071504,1358419078,771782810,-528580344,611582464,14712451,109911670,1344199420,11796656,94739024,1183385942,-25755650,-178712,-588521394,-1310964085,-1981230331,1187502150,-973078310,33017734,-137394550,-348846534,67388535,-811693488,-788482057,213385187,246939617,1358934239,-137066867,7903824,-1635121106,12056527,1183572945,210174938,-632911391,-388822607,-2116532735,33544806]}]],[[{"sector":1,"length":512,"data":[-137394434,849392245,-791611669,-146639912,-940891626,318230662,-762919168,-1929379593,517667846,-796474288,-1706031369,156632053,-1912715639,517667846,570854736,-1202708757,-1706033150,156632698,-113015,-1813447050,-66679300,-1706025254,156631246,-113015,2145975926,1829160700,-326565645,-1957311651,149717996,-1928561013,915210621,112852544,-66642432,115593611,-126572813,-1991585493,-92014506,-1207208449,-1705968058,90832968,1187478507,-16776966,95423606,1358934096,-1073595494,-28931836,-151822944,1943589072,540475151,1342550251,-1073663846,-28931836,-1946532213,1200225886,138840841,-1979818357,1183515975,-27358458,-1593358455,1183446126,-350313988,-2081132893,14351934,-22870667,-1340412966,1996443649,1358934268,-1761061478,-28931835,-1946915167,1200225886,1575782659,1426065610,-326898549,-193617912,57858256,-956249367,130118,16664263,-112802304,73319424,-1274574298,-62506752,24313776,2122338368,-5239303,1497366901,-2091859678,-1342112130,1073837311,-792649127,-1926794280,519335942,-112816816,-1701162978,-1995876862,1183579718,1183400188,-1966700036,1589967182,143140356,2122361835,376770041,-193984883,1183666206,-1706025223,156631706,-113015,2122579022,326369534,-193984883,-828747746,-1995876864,113704518,-1962871691,-1001849786,-2010774434,1973420359,1943589108,2097581344,-1001382146,1200424030,-1907358206,-1977219514,11796807,108698192,1183385942,73319678]},{"sector":2,"length":512,"data":[41910310,-1609993156,-789121931,175364304,100949700,9411155,12061127,-96040704,637820612,1979795256,-62486205,637820612,-33470582,956347592,813169734,654079627,-2013118326,540866886,1631329396,2050754674,1853883511,1183457529,73319673,653948555,-16629624,1183054406,-1066204676,-990230901,-2010774434,1589903687,2139104772,91562242,-193591610,1575782911,1426064578,1990257803,-791611660,-13929512,1218054262,-1006278144,1392903262,-1694597912,90833344,637820612,16875392,-2144990091,1965097599,1980155397,1589968884,2139104772,91642370,40861734,73319456,25133094,-1607764992,-657394570,1589912690,2139104772,158682626,638213828,-352319546,73319441,41910310,-1005882023,-970585506,-1034027257,2142765066,1218072830,-385521152,-1957298312,485261804,-266419197,1204037367,-393836284,-360280835,650349053,1979793280,1963378235,244187124,1360983152,100814733,-360280495,126494461,11847934,39098960,-2037839592,-1098645768,1946222328,-23349228,-122224816,30776062,99288841,-193657146,-1577013248,1923282036,-1560234764,-2033788166,-1962935068,-788732794,-385649960,-2033843836,-973013788,-203386,1358872504,1778403482,-444166907,-397402372,-1063584395,-2147128831,16574142,1508442997,-426866175,-406942212,-1342130692,-66642394,115593611,-126505230,-1991585493,-2080510314,125108218,-52132154,-1978995713,-1258494330,-293172992,-290026499,46564349,-52067642,-290026708]},{"sector":3,"length":512,"data":[-1165998339,1965882597,-292618490,-1947276291,1090383494,-52001144,-34699577,-2033778688,65268,-52001142,-2043084620,410254830,-34687349,-2147301757,754771386,-2030107531,-2030043404,-588513810,-17398073,-2033778688,65004,-17398133,-17529285,652804978,-323580929,-410874371,-96040452,-1963172212,-1241717106,-1982977280,506245319,-779355129,-1359870237,-785647499,-292124342,-27883011,-1980628154,-2080510794,1936982266,-34699637,-17135992,-989966709,-1097991562,102694651,-65075426,-971004686,16643206,-17133942,-17056115,783286453,-1946417378,-234429487,737703342,-1769387311,-92013074,-1927711233,-1963000898,-1258358138,-1174928640,-792854524,-2136673538,83819142,-17135987,-192508592,12079357,-4698112,244994303,-16226816,-369166714,-726073538,1218072830,-972723712,-203386,-52066675,-152547298,29399803,-1098906262,1946221798,-410612259,-96040452,-1963172212,-1258494330,-28931840,-1980072252,-63983423,115593611,-126505230,-1991585493,-2080510314,410320890,-1996242301,-440762154,209015036,-193853754,-293172225,-28931587,-989966709,1049492086,102691695,-65075426,-1960860430,1856175686,1866370547,-1329493517,-66642386,115593611,-126505230,-1991585493,-2080510314,125173754,-1979824501,-1946292602,-2114064706,-1175228473,-541196284,-66642178,1183556850,-1065135874,-210853372,-193591610,-92879872,-17056115,503717465,-218358009,-474472540,1218072830,-1962579456,-1097990578]},{"sector":4,"length":512,"data":[783351547,-1946417378,-234429487,737703342,-1769387311,-92013074,-1962445313,-2037776826,-1097990674,-1107034373,79298030,-17842688,-218364130,-100233820,-1924129062,520027014,-293172400,79725565,108698192,-2037839530,-205979912,1218072830,-1929025024,519890310,-88086448,1778499738,-423723003,628359420,-151751008,1943589072,-426866148,-407466500,-71397892,503363070,-1527579641,-52001142,1183383732,-28406786,-17056115,119418544,-472806404,1974399494,1255222264,-34695543,1962932867,-28931323,-1098049301,2114191099,309758,520026046,-1527579641,-2080487797,-2037840704,-2037514770,1183448827,-60912390,-34699637,-989968759,1359411790,-83456688,-1706025218,152568212,-17267063,-34568563,1187270686,-11532550,1419443830,-1995892734,-2080442234,16709822,1183649140,-1224781574,-358940936,-972617471,-1363962,-151751008,1926811856,26274051,-52066618,-16992001,4758096,-2037578390,1344208101,-1694903064,90833344,-51986816,-1602259968,-657394570,1676215155,-427390463,-1262420228,-2134472448,754771386,-2037771404,33881318,-964099916,-52067642,-427360724,-192493572,-956301058,16641670,-427390464,956347644,1946021510,-290026728,46564349,-52053376,-16485076,-68474,-335679866,-1341732900,-2097151782,100594878,230165878,12079359,-711307264,-1207498495,-2043084800,58064628,-1996428823,-1979847546,-1946225018,1224668294,-17398215,-739703946,-323581184,46564349,-52067699]},{"sector":5,"length":512,"data":[-1929754999,-1903494050,11926758,-34828757,749782921,-1946417378,-234429487,737703342,-1769387311,1451884014,16417790,-2132212875,-91830784,1317732606,-92355330,-1946404176,-234429487,737703342,-92058927,-1709869569,164037033,-2037890812,-2033778949,-969212164,50264710,-989966709,-2037712266,11861754,-1148336247,102694651,-65075426,-1977637646,-1258358138,-28966144,-17135992,-17135987,1342550096,-1705967696,79692347,-35223927,-625992053,547480529,-1299740181,-1341718566,-326726694,-2046607107,-2037776914,-2038170132,1912733430,-14685949,-193788218,956745216,109904107,1344203577,1358900408,-52066675,-1494724578,856082169,109904107,1344203571,1358904248,-52066675,-1897377762,-193552135,695392464,1358909368,1778403482,-444166907,-397402372,1891170317,1218072831,-2147128832,16574142,1990199156,1943589108,235325193,-385875747,113705109,56590,-34699577,-2037776384,11861222,-34699719,-1232377741,-964428306,-444429822,-444167940,1915763965,1983462404,-9193461,4758096,-1796536982,-586269055,494344601,-586269055,-5236327,1346371956,-35275136,2013245493,576274433,1943589057,-7292923,245485291,702941,-1903500809,11927013,-394018557,-586243280,-34699521,1048808683,1979768078,238977294,1929511133,235325190,-972947235,-138106,-35354995,-1262989282,-2037559041,1344208101,-940005144,14879750,-460944896,1943589117,235325192,-335544349,235325190,-973078301]},{"sector":6,"length":512,"data":[15415814,-348518771,-977776610,-2037559041,1344208101,-1594329880,-657394571,109907827,1344205936,1442893466,-125400823,-259617794,-621108227,-883037047,1374456661,-2508719,1342550096,-1705967696,79692347,-1946270071,-774197218,-350182941,-625834103,-625998081,-348518714,1946601215,-326500364,52061,1391233877,1720340766,139904268,-855224693,1512003873,576093,-1964209323,1451886694,1562496262,1226,0,0,-1930654891,-2080902138,284685318,-134609268,-134347124,637534910,512302219,-883034122,1374456661,429393,-62486083,-1946263924,1183385158,-60898052,-899814263,-1957363710,2013709548,1589905140,126428678,1468606042,106873858,638207627,443746105,621789315,19333104,172395271,-1324367741,-991374588,690357854,1589903943,172395270,-1006163674,-1960442274,-754667257,1191257832,106873858,254247206,106873856,38243110,-135258428,1929853734,16758789,1589907691,130295302,-1930135389,-1191937530,-899874816,-1957363706,113482476,516163926,-14223376,-883095457,-1695773867,151781534,182877,-1695773867,151781534,182877,1374456661,638213828,-973076538,-2147418298,1997012862,-12154348,-964099916,638213828,536953030,1979664126,-12138778,-8486912,-1978370302,11861830,1589954185,1086727690,1191059465,-957975041,-1979646138,1178271558,1929359364,1317683201,-1996442113,106874062,947922512,1962913824,576274433,1943589057,-12124667,1183503851]},{"sector":7,"length":512,"data":[985726719,913507398,-1258338678,-993621760,-2144991650,1966735736,947922469,637826650,-1977603968,11861830,1589954185,9053702,-1057078996,638213828,1182795656,1187382015,2122318078,-5240578,-1975516814,978386766,-5241778,1514144114,11911714,1589956233,-2144972794,-5231048,1514144117,-657407454,-1977214605,-28407296,-829882187,638213828,-33472376,1191116358,-1967657985,1178271558,1929359364,1317683201,-1996442113,106874062,947922512,1979691054,576274433,1943589057,-12124667,1183503851,71711487,11817075,1589954185,947922438,-29133522,1187446598,2122318078,-5241858,-1975516814,978386766,-5241778,1514144114,-657407454,11870323,1589956233,9053702,-1241624950,-993097472,-2010772898,1191053632,-12124418,-326515477,705117,-2081649835,1187383532,2122318073,410453241,-1309063542,-1981679956,-1568175421,-791611660,-32869672,-495584954,-352256072,-112817575,-503927631,-2020752503,1183446140,-27357956,119456649,1187271430,-11532788,602409590,-60898050,2073711366,-1274427647,-96040704,16416387,1589910901,1204168444,1589903397,1204168444,1183711014,-1706025220,156631246,-1946532215,-326501818,707165,1374456661,503727757,13539920,1183385942,-25263106,-15436544,10094198,101256192,20355667,11798983,-1946270071,-326500794,182877,-2081649835,1187383532,2122318073,410453241,-1309063542,-1981679956,-1568175421,-791611660,-32804136,-495584954,-385810504]},{"sector":8,"length":512,"data":[1183449406,-156454407,-1916565023,-1980466041,1586297926,516131326,-1001191929,1342572614,-402229505,1589968226,-1705834756,164036833,1183383732,-58800902,-1929282163,-1174411722,-1946419196,-217652271,737703078,-4699439,1959803903,2126775870,25005564,-1427827,-1962932807,-217652271,737703078,-801420591,102790233,-1912832316,915210621,-1185808401,-779419644,-1494022429,-785647500,1506818890,-1005947559,-970523554,-352311481,-60898296,659015206,-92371969,-1962511360,-1880491450,-60898304,103303053,28940880,1589905863,1204233980,-1006632927,-953746338,8392263,654073540,11044807,1589903360,1200236284,1943588903,-1705834954,164037075,1183383732,-92371974,-2094763008,1946417790,-112802274,-109150208,-1978370177,11860294,1589954185,1086727932,1191051304,-1192856071,1589903360,-2021054724,1589903530,1200105212,-60898267,642237990,-60898049,1589907341,260646412,-899814263,-1957363702,205964524,1187270662,-11532792,1419380342,1560877058,2762,1374456661,16664263,73319424,103303053,28940880,1589905863,1200236036,1943588901,-2020923872,-1993998168,1589911879,-1705835004,164037098,1183383732,73319678,625460774,-28931328,-1034031991,-1957363708,116163564,687747,12060021,-1955730688,-2147154362,1178290176,-16551162,1183516742,8389894,105285960,-1324988789,-1947675897,162596950,-1039932717,-16365943,10095222,-1995895808,1183644254,-94452484,1676169990,-1996442369]}]],[[{"sector":1,"length":512,"data":[2122579526,494207230,-1006221685,-1993934242,1589911879,-1202518278,-1706033152,164037193,1183383732,-28931074,-899814263,-1957363706,116163564,637951684,1946173315,106873886,-1707606234,151781376,-1929617783,1589968454,1200236284,-791611866,-1207602216,770375680,117202628,-17242029,1183383732,-92371974,-1005095680,1392966750,-956237670,-1996442615,1589967430,1204168444,1183514662,1575782906,1426064586,1364323467,638213828,1946173315,173982815,-1707606234,151781376,-1929617783,1589968454,-2020923652,162594984,1589962963,1200170502,-60898302,-1467512026,-754470656,106874080,-1006139098,-1960442274,-59325433,-2080168368,995688618,-1912114239,-14284730,1589903943,-2020923652,1589903530,117515782,-1996488520,147480044,-326413056,-15930237,10096758,-1995895808,1183644766,-60898050,1005081350,-1996442370,2122578502,57934074,-1962885399,129041990,1452009683,-754339576,-1983773726,1183577670,-754470648,-60898072,591890726,654073540,11175879,1183514752,8435978,-235417039,-1946663287,78711878,1174530259,208044302,2122514447,1903558904,101467844,28940880,1183517127,-60898058,558336294,-768313,33536001,1995982395,-129594618,-990624119,1392966750,-1695254785,164037170,1183383732,-92371974,-2096729088,1963195006,-193035476,-1951435264,-1992231354,-125569466,-1006144256,-14222242,1325343559,-1316966152,-1259810300,239468800,-336310529,-96039980,-899814263,-1957363700,116163564]},{"sector":2,"length":512,"data":[638213828,10106879,-1995895808,1183644766,-60898050,-1430290138,1962967040,-397212080,11861310,-2080749943,1946221182,-96040187,1589926635,-2020923652,641728680,-1004451959,1392966750,-956181606,-1996442615,1183578694,16286714,-125631116,-1003391741,-14222242,-1006589817,-953746338,43655,-59325440,-1430484186,653494528,-1003994742,-2010773922,-60898297,-1433927898,47104,-899814263,-1957363704,116163564,638607044,10106879,-1995895808,1183644766,-60898050,-1430290138,1962967040,-397212079,11861158,-2080749943,1946221182,-96040186,-1006598935,-1960379298,1073784967,558336294,117202628,30644819,11798983,-1946532215,-125568442,-2096794624,1534395384,654073540,11044863,654073540,11175879,1183514624,106873870,-1207465690,1589903488,-2027215108,1992556714,70854150,-1993997450,-59325436,-1430484186,-1913419520,-1006229439,-1993995682,-1993975289,1589903959,126559750,654073540,11175681,-1996488520,248143340,-326413056,-1005917053,-2094658978,57999423,-1006589207,-14284194,39479,1586039052,-28930820,117202628,-69146541,1183383732,-92371974,-1962511360,-2081818042,105286400,-388823119,-1324853621,65196809,-163149374,654073540,11044745,654073540,11044747,558336294,117202628,30644819,11798983,-1191557495,1178140672,1979691258,-657440767,2122525043,-5242630,-801111691,-954436648,63558,2146991747,1589907831,-126448644,675333670,-129596672,-1947634943]},{"sector":3,"length":512,"data":[-2135357882,-137219840,-60898063,-1432909530,47104,-899814263,-1957363704,216826860,-1710196993,151781376,-1929617783,1589968454,-397211908,11860778,-2080749943,1946221182,12118275,-1324988789,-1947675897,162596950,-1039932717,-1946794359,129042502,1589962963,1200170748,-60898269,-1433942234,-1962901504,-2135356858,-137219840,-129594895,-1324595573,32035588,1719733830,-2097148148,1979775102,205964395,-1181069306,-1962293503,1589966406,1200170748,-196688095,-4718081,-129615103,1183516278,-196703752,117202628,-193527981,-956151398,-1996442615,2122578502,745865466,16023171,1183561078,1183400182,16286710,1589905269,1207903996,-129040605,78741680,11856082,-15841791,-722734002,-1980086645,214588908,-326413056,-1006048125,-2094659490,192217151,-1710852353,164036628,-1006587159,-14284706,39479,1586039052,-28930820,654073540,11190145,1953824896,535319302,-1996442374,2122578502,108265722,-369473909,1589903490,-2013321476,1589903528,-2020923652,-1993998168,1589911879,1200236284,1943588903,-1705834994,164037075,1183383732,-955913222,16775750,16416387,1187454068,-2097151752,2004875390,-60898287,653817483,2638022,33048195,1589963123,-2016991492,170,654079684,11189387,1183511433,1099441670,-60898264,-1433927898,-60898304,625460774,47359,-899814263,-1957363706,-2091822612,1946158718,-28915915,1183514624,1178159110,-1004046338,1342573638,-1962385724,-14221706]},{"sector":4,"length":512,"data":[94738992,1183385942,-58817540,-1962576896,166460486,33441411,12111987,1575782656,1426066122,-326898549,-28915962,1183514624,83395582,-1397151369,-1981679872,-1567126845,1943720180,2089258260,-62486028,519849613,13539920,1183385942,-28933126,-1982893311,1439391212,1183706251,-1706025466,156631246,182877,-1326675115,11554817,1612368,-883095289,-1326675115,1996443650,1612294,-660469497,46816759,-326413056,-1336933456,412766208,1560872704,-326412853,-11533136,412747382,-1576466688,-899811367,-1957363710,1342550252,-1710852353,151453720,1576524450,1426064074,112258187,108461904,117446810,46816521,-326413056,-1001387600,1342572102,-1706032976,151453696,1576524706,1426064586,179367051,105301072,11554822,39504,-593360633,80371191,-326413056,-1336931408,412766208,1560872704,-326412853,-1336930896,412766208,-1576466688,-883034147,-1326675115,1996443662,1612294,-559806201,46816759,-326413056,-1001386064,1342572102,-1706032976,151453696,313949,-1326675115,1187270672,-1336932858,10113024,1560872704,1426064586,296807563,105301072,11554822,39504,-899872505,-1957363708,1343402220,-1706032976,151453720,-1957311651,1343467756,101074628,1342222416,117440666,80370953,-326413056,-1001384784,1342572102,-1706032976,151453696,313949,-1326675115,1187270677,-1336932858,10113024,1560872704,1426064586,380693643,105301072,11554822,39504,-899872505]},{"sector":5,"length":512,"data":[-1957363708,1343729900,101074628,1342222416,117440666,80370953,-326413056,-1336927824,412766208,1560872704,-326412853,-1001383248,1342572102,-1706032976,151453696,1576525730,1426064586,565243019,105301072,11554822,39504,-899872505,-1957363708,1344450796,101074628,1342222416,117440666,80370953,-326413056,-1001380944,1342572102,-1706032976,151453696,313949,-1326675115,1187270692,-1336932858,10113024,-1576466688,-899811360,-1957363708,1344778476,101205700,108461904,117440666,113925385,-326413056,-1001379664,1342572614,-1710852353,151453696,445021,0,0,0,0,0,0,0,0,0,0,0,0,179367051,105301072,11554822,39504,-593360633,80371191,-326413056,-1336931408,412766208,1560872704,-326412853,-1336930896,412766208,-1576466688,-883034147,-1326675115,1996443662,1612294,-559806201,46816759,-326413056,-1001386064,1342572102,-1706032976,151453696,313949,-1326675115,1187270672,-1336932858,10113024,1560872704,1426064586,296807563,105301072,11554822,39504,-899872505,-1957363708,1343402220,-1706032976,151453720,-1957311651,1343467756,101074628,1342222416,117440666,80370953,-326413056,-1001384784,1342572102,-1706032976,151453696,313949,-1326675115,1187270677,-1336932858,10113024,1560872704,1426064586,380693643,105301072,11554822,39504,-899872505]},{"sector":6,"length":512,"data":[-98017559,-150858567,-16310778,-1190955777,-896794015,243911171,857604944,-1982165294,520425486,-164380274,244055691,-201588688,-1899983708,-1949266216,-83874778,-402269976,512428684,-2017066960,-1962868737,-167562466,57999111,-385275159,-389085099,222038007,-152566923,126496263,1975519811,950060014,1208367623,-1274776576,-1156526848,1357381638,565901831,403500032,12263150,-1948545536,-1996154338,-1962897378,-1996153826,-1962896866,-1996155362,-1962906594,-1996154850,-1962906082,-1996156386,-1962905570,-1996155874,520122910,241091579,1285209686,-167723434,-1882499754,-1106837498,-253014891,-1101656482,1431719066,-2011323453,1159548948,68487195,1293777173,1577864716,823302429,655119119,235212301,235212293,251989509,353571347,-149752813,1192426002,1224886274,1895982850,2097312258,-2113765118,-2080210174,-1912436478,-1610441982,-1375559422,-1191006462,-972898302,-939342078,-905787134,183042,1229015040,-917074738,47404545,1325646934,-833663667,-1865592949,1279480393,1090556357,-1918614188,-1831386798,1162412032,1233306700,-2116860596,-1982577408,0,-2016654263,-733654272,1229652101,1397425316,1145767332,1090520740,8701261,-1999350528,-733066943,-650031985,1392509075,1166464069,-1965800109,1414748416,8637765,-1538962103,142,0,604474063,-83104897,-176882372,-260702660,1599997834,38189981,1085401226,-1975270914,785615607,-1073084534,1134555764,787773854,-986052726]},{"sector":7,"length":512,"data":[-628627339,1499120010,1587597450,-1329591804,73310975,548408692,1101724043,58052350,-1979158551,772205506,-1975318646,-1954601776,-29250823,-385649202,-1039529896,1130097017,-83342615,1532582233,770198355,34847493,-1073594068,11913354,-1959864061,-397190377,-930478824,-1406209397,58031908,1124612073,930464058,-1406209397,2042628674,787647458,83290284,57945660,-1341850392,-385650176,-1957165036,179056370,2035964352,256259,1358528524,1900208,1527248617,-1406209397,2042628674,-1494531337,1007149545,-821988227,1134387038,-2127820918,-1073549710,-259267534,187283801,-1258344879,-1209466399,232693763,-1341392763,-1694495737,-1174401612,985203677,452615,-1190926406,-225769522,-2127778770,-1966931597,50378712,1121518555,-1406209397,1111689096,-1406209397,-347994232,981792733,1979711239,1600114433,700012957,-1258335989,1609107258,-135034109,-16265596,-821987841,1503485791,1359724473,130987263,-29557821,-46398092,1137645172,-1925445750,1978205045,1972255752,151513347,-821589429,1134387038,-2127820918,-1060110155,-397293430,1692926742,-561553916,197114454,-1576947630,-208993112,129302318,1140900610,1667855973,1851072613,1767994977,1818386796,1866661989,1853189485,1952539497,544108393,1717990754,1864397413,1718773110,7827308,1802725700,1769101088,1344300404,1702129522,1684370531,1936278528,1869488235,1699881076,7955553,1802725700,1684360480,1159749993,1919906418,1986281728]},{"sector":8,"length":512,"data":[1701015137,1699094628,1920300129,1236402277,-83462679,1144832650,1590624627,1245486430,1760167282,754319368,76987203,-1976643446,-1073069305,-889259915,686355573,1193184252,144239107,-1946421760,348423111,1186072351,141869066,37504946,1219625588,-83482135,-397192624,-880082034,-1974314405,275114178,1590646874,1381670239,1347835804,154977930,-816315790,34400331,-471332748,-538378495,-346516991,1591440330,-2041012897,1582931652,-1974380969,1406175986,50343609,509657,117416025,-323223804,-561553915,-152481450,-880018667,1525155722,-82056430,-420951157,-1654694382,-1996488517,1527048478,183197275,-389313541,1600000784,1448566429,-880018485,-351070232,-1654694159,-1631287720,1583045209,937973335,-386151661,57802776,-1325440023,321447949,602409648,-1654694381,844519262,-655832128,-1023314685,512446803,783877353,1507394304,154929034,1600045915,1499159197,-396994722,1590367297,1482399071,-551286902,527581228,460528444,-256294077,-1426486524,851639873,-104792384,1355056799,196527238,-385532439,1599996777,-1070442339,1600052459,126507933,1465827338,57854806,1593762793,-1638359713,-1978501988,170667015,-401967680,-873987854,-107130368,-1070424932,1390936498,-1071997694,17614884,-1660602718,-1564468580,1973224687,216721667,839189480,37611712,-401841175,1925383101,-23664381,1486708574,1359686073,11331659,552076917,216459520,738229736,158683196,-402613784,233373711]}]],[[{"sector":1,"length":512,"data":[7137297,387137,1911144498,839037444,-402606400,-1329397267,87466751,-393560014,-806828662,509441,-33235040,1942301381,-1564462353,1589839158,15310175,-397346037,1918435040,-30742269,-392339618,343020345,276040252,1599996907,-383874147,2799876,134142211,1946412521,-33101565,-1021974807,-50623650,-1957255634,-1979025953,1916419079,401195777,68479232,1006828448,-20382200,-1010237752,1007127107,-1023315398,-193716164,809240690,-20906251,-1073036344,188545908,507277170,10502005,-1010824701,10634064,1931226115,1945447482,1979595783,1124567579,50208393,-662044489,50470537,27394736,310019,-1010824616,1128466314,50208393,-348157365,1963998433,-31552573,-23663870,-1564421952,1364329217,-2029845830,-387413286,-628686255,512318041,-1151859970,-1073086460,1913208003,-9639677,-17485764,-1010237760,1006829728,1008300815,-1961528819,1963131422,1128481546,-1975314550,-388331721,-1444216601,-1576861280,138150651,512430708,512295682,512427171,512295684,-1913977691,-402455877,-2048196339,-1631287720,126534491,-109944516,-176981188,-389849308,-93126646,-160288708,-1007338948,-76398276,-1007330500,54206091,-1558279741,-1576882172,1405289211,50994827,-654114635,-604514045,1916453763,1927021321,190723,-320224421,-118036224,-347067715,1350352376,2042491883,-1108415668,-370456744,-350283331,432061924,1505615851,-1109726420,-706011686,-348150339,596164048,683527147]},{"sector":2,"length":512,"data":[-1111037119,-1041547027,-346500163,1073200572,-1581402133,-1112347804,-1377103791,-345752643,1328332200,-692214805,-1113658586,-1712642498,-350806851,1682226580,-1430417429,-1114969310,-2048187723,-351667267,942325120,-1107790871,1843994396,732282360,-1107793943,1642671224,965721592,-1107797015,1441339896,983678456,-1107800087,1240008599,461618680,-1107803159,1038705816,128368120,-1107806231,837362741,755285496,-1107809303,636037286,128564728,-1107812375,434702951,274316792,-1107815447,233375926,754236920,-1107818519,32061294,649772536,-1107821591,-169269681,461356535,-1107824663,-370591641,127188471,-1107827735,-571930726,642563575,-1107830807,-773247887,1950399991,-1107833879,-974564144,802602487,-1107836951,-1175910478,128171511,-1107840023,-1377233113,288407031,-1107843095,-1578539826,126795255,-1107846167,-1779863352,522173943,-1107849239,-1981208810,291225079,-1107852311,2112447824,633257463,-1107855383,1911121161,577224183,-1107858455,1709773976,275496439,-1107861527,1508467889,128957943,-1107864599,1307117484,1390919159,-1107867671,1105798692,1097448951,-1107870743,904476778,1130020343,-1107873815,703153913,1185463799,-1107876887,501817098,1199291895,-1107879959,300508130,1698479607,-1107883031,99174810,1686814199,-1107886103,-102145107,1800519158,-1107889175,-303469651,1680981494,-1107892247,-504798399,1663614454,-1107895319,-706131961,1197981174,-1107898391,-907457868,1058258422,-1107901463]},{"sector":3,"length":512,"data":[-1108787434,433569270,-1107904535,-1310111437,1215413750,-1107907607,-1511438239,1211088374,-1107910679,-1712764849,250145526,-1075120640,-352976882,-167767827,1110250,301918966,1508570624,-352976875,-167766823,4577258,1052371702,-890571264,-352976866,-167764242,4117226,1095625462,216724992,-352976795,-167762291,487146,148105974,904590848,-352976865,-167770223,514282,535292662,-1378816,-352976858,-167760642,507626,198765302,1072363008,-352976883,-167761641,4145130,127986422,-571804160,-352976833,-167765547,5628650,1459284726,498988544,-168040147,-382912579,-1329728011,-168826579,-385402691,1656616425,-169613046,-385208899,649983453,-170399388,883047212,-390177273,126506510,1023359977,1393194373,754681320,120889915,-390177189,126506510,-67163927,-1098781557,866713606,1355743604,120850166,-971540993,-16305146,973101728,1946167558,-1564410359,-380108713,-346490468,-1070461475,-402016023,-387450086,-397148747,260767033,1912732032,28805960,-388396544,-192282558,-402641944,-729153478,-402643992,1824063538,1960512007,-161173495,-389510172,-997588958,-939327308,567094196,292929546,-620051621,-872543372,1949252780,1949121559,-50730733,1912606440,-387937544,74579975,-527824171,180587203,-1963363109,1915759620,-183878413,-872485262,1340654406,-1336720638,-62134262,-852839342,-964011231,-1342165784,3401773,585679498,-399659008,-377421783,-109050004]},{"sector":4,"length":512,"data":[1913894244,1693024261,-980761090,-1979709208,256193,-721528599,230983178,48771120,-2000385536,-389856505,-387450298,-397148959,260766821,1912732032,28805939,-388396544,-326434962,-402646552,-863305882,-402648600,-192217250,766771378,-1073077811,-1017442699,125098762,1017957374,-1023314630,-386123031,1396900278,-1293416272,750015227,-92266035,-32214478,1023312070,11930994,-109002242,-1325108676,1539702272,2062075274,-398806785,-1047855231,-1325436696,-8918982,1726531210,-38016513,1023178472,-385650172,512424939,-1073086365,-922873228,512364148,-922876112,512362100,-922876111,-1662467074,110085115,-390199524,591156750,1776878453,-65017603,1962513896,-43783933,-1963129624,181466822,-385648192,-796197981,-110827438,-79697876,83525722,192143494,-799911088,1343534306,1593654761,119289599,-72330416,-523188694,-491061068,785908494,347801483,785908480,-10811509,-1974207520,1042674,977013108,115871604,1542945024,-1966090614,-889306361,717654723,1019805378,1022128642,1508406021,-927247534,-1963881714,1458080456,-58710902,-2146930079,57900028,773909632,1178797962,393593914,-462042626,168266286,1527544256,1600019035,1448566429,181125130,787052736,172165002,-1963427392,-1976672563,1975519751,1524534202,-808023462,827150147,1297040379,1347222066,1291399508,-130919344,861163596,521011447,523902756,526786384,-1974447109,-2147471705,41287164,-58656332,-2147126537]},{"sector":5,"length":512,"data":[57867516,-1328587944,46410491,-1560234816,-491059420,785908494,-1218771061,785908480,-396687477,-520159230,110059358,-6486244,-1564462362,1721893989,-1173911036,-1036386115,1705116789,-397720828,-1394018230,12276731,1813940480,-397714684,1970599994,754455016,309603388,1408936168,-1980115736,1527016478,-132061109,-135767180,-1447416585,1958885888,-135469026,-135731135,-135993268,-385649332,-605552196,-1036374793,-1506444,-1665135877,-402364766,1139341294,-555200004,1364875769,512350603,-353893271,-1978960903,-1982625033,1527015198,57858619,-1644568855,2112422772,773753601,512447232,1128988720,172165002,-385649401,-1958543150,378094359,-1545076690,1958742775,1949973734,1979596021,126501643,973114298,1258976450,-386430488,-347342293,-142546723,-1336681612,54108673,1962521832,214272612,854100608,-113907520,966918320,-1979091709,1965571079,1777048844,675022730,1692992373,-1964483591,1976699897,214272541,-1159165312,-1169026973,-1605236089,-259390725,200861417,-385649198,-1974208193,-1144354066,1230180503,1236070795,-126304246,212660619,-1426486400,54108867,675022730,-2023835787,1229543134,1543494888,-151459765,1357448053,1965571327,-152246260,704038376,1089012597,-155391745,-10557140,773753179,1511426816,1478396675,1960459011,260723544,126501699,614252554,1124567167,-1242000664,-1646722304,1373796441,-1962930200,50551326,1511950810,1541048067,-628633621,56368779,-225715653]},{"sector":6,"length":512,"data":[-1426486356,-1617018209,-260727231,-1020608118,-980758390,-259340518,-645183158,56368777,1544981443,1960459011,1128485669,-1073084534,-2004933476,887636743,1125092088,54734730,2019139033,-1377283616,1541048319,512481259,378209112,-633666726,126491764,1346585411,1492650728,91554620,838878440,-1227846976,-338033920,378231261,-633666724,126509428,1129333571,-1963464984,797590287,55793731,1963146457,824084960,260725507,-654114635,-1958487805,990064918,-1177848614,-1974398557,395002631,-1073069245,1405288821,56106635,1918622267,512447477,-633667536,1407939419,1397443403,1543021800,-2031615051,-389850120,512489553,-880082084,56104587,56237707,512350763,512427086,512295727,451413088,1272548344,53419657,168060576,-1961331520,-1962645218,1730055115,-130684924,56237705,56368777,-1325982232,74162689,1705046154,-1962857468,1258303518,1810481178,-1564462348,1705116779,1478396676,-1949594877,50613790,1511950809,790530819,-628669693,73408139,53419657,-225715653,-1426486356,-1617018209,-260727231,-1982231735,-1962714082,-1962644458,1258303518,58053131,-386359575,57866005,1240957673,-1863722613,-140645896,591135153,1371734388,1509956072,125092410,57934908,-386455831,-1976765254,-1982756107,-1023088362,-187635637,58008380,-386610712,1558771521,-1596945673,-1036385057,48825203,1392555767,81796747,-637281789,-1975316598,-1393456337,-1017397238,-1330052432,145799428,-168826800]},{"sector":7,"length":512,"data":[-165156776,53288587,1509296104,-1325899543,61913345,1342681273,1492548840,57804602,-17398039,50045632,-400585917,-1228671407,-373280255,1323829350,-385649913,-29558725,1688339829,-33035516,-385649472,512426106,652738608,1478396171,73703427,57982986,-386699032,1128527326,56106633,855139816,87466688,-1594521624,-1073085333,-1125579916,82813182,58048522,-369744663,-957810789,-177542922,-386595351,417986612,-1897375242,-269988865,-402230029,-269877276,-1564462345,-756546321,-385649914,-1057032257,417923957,1975582454,-166598397,82386571,50342585,-385351975,552138659,-184555275,1541996464,1477872389,807308035,1960459008,1124567713,88664146,1408428890,1945249768,-386027461,512427322,635962192,-397190400,512426016,727320324,1501402,-1910580601,-1979494370,401088263,189416197,-370182702,-1014304328,-1979381272,84208071,1408605929,1945232360,94693623,-260702916,-1979343384,93907152,-1813450614,-388462075,-125172338,-1979348504,92596424,1621158026,1959329280,1343654662,-397190397,-1910635150,520587482,-980793021,-277495542,-245438119,1979594216,-179312381,57934892,-2013969687,11779034,529258755,73277065,-1996488517,-1979248098,-1160083513,-628686660,-393553661,126540423,24390716,-397323581,-397347814,-398331226,-397151582,1206449385,1582913780,-1974018425,-1957473592,-1257827810,-1982266624,-2029579746,1579060186,1943681796,-176690941,-628663717,-1992093816]},{"sector":8,"length":512,"data":[-1360307433,32178188,-1360487175,-200480524,-199432110,-561553831,-397323434,797635705,1457424222,-930478198,1134318417,-1073080437,512453748,-633667536,512440691,-633666728,-779472526,512426166,-637336740,512481927,-633666769,-1969397134,-204805951,-2023859877,1364350686,1509175528,-561553830,1129533782,-1659401828,395002715,-1958519975,985762335,-1979550779,-1966789912,57843144,-33547288,1959657157,-1962440178,1111730938,1499067371,1935235417,190467,548455259,-906051074,-91490444,-152354134,1582914461,-2024350073,1359640026,1659422090,-173807373,-561553831,-346861226,1946434690,-397688063,-1168969290,91488384,-214964143,512447321,-633665767,-1259797645,11779059,394909955,-1296027069,126370567,-109720834,-1564255653,-1343748328,1946434812,-205395709,784028497,-1965489408,1913207815,-1604626159,-2036398312,-997830460,-385568687,-1212418789,-1948712192,1581400855,-1974018425,1965833223,-221517821,-247142325,1206453108,-561553675,1976699734,-214046461,1243056459,1364416859,50379451,-2000669991,126370567,50377659,-2027975719,-1152167206,-633667456,-1174047397,736821248,-470302069,-1974282101,-1971379005,1493219024,-544554102,-620496502,15270771,1943064819,-980794623,57982986,-1980566807,1527190046,-1128574119,-1982266624,-1157164002,-654114765,512350723,1398474518,721453243,995252954,-1979419942,-1596290306,-1073084648,-2135278220,1943681792,1407734533,-1957602560,370576331,337545991]}]],[[{"sector":1,"length":512,"data":[8316935,118759049,-779422326,3663961,118627979,303991107,-634692857,12245771,-1552592128,1405311835,1526734312,-1949594799,-1962470378,-402188770,-628686776,118759049,-779422326,231336793,966967346,1397903623,118625931,50378171,529224665,1541028674,1134499720,1966573726,121217031,242532362,1394048699,683365201,-371653888,1515913763,-1974353063,-1426420985,-1974910397,1975585477,1489197554,1386136710,-1957650607,6416587,1374170228,12303104,-637282045,126393944,716918943,-1965489408,509495,141823292,-963977212,126353428,1515822680,-1628847269,719868658,-386436096,-1145372644,64553728,168266458,1499159232,11779011,-1162148885,-1948712192,-1153252585,-654114630,-1950148727,-1382197,-1972142,995809927,512345050,-454556869,-226367248,-1041695056,-227284741,1022392809,-385649406,700182959,-1965489408,1958742535,-1393456341,611583036,168266307,1359574464,-404170357,-555001599,120225968,11913354,-1186735869,-654114808,439093130,-1072037588,-1963858711,1121028853,50342331,-1070444071,-68679800,121020417,1007008744,-385649153,-922816029,-152501387,1976106738,-1070441969,-1314194805,1760051728,-243144217,58048766,1509016297,50341819,1125616601,1261930562,1371740040,-1968377461,1121028853,1963080786,416398106,-645180589,-1964434768,2734848,126540035,57982986,1526697448,-1325297176,-417470448,842249817,-1426486336,1976499777,71091192,1962944699,12106499]},{"sector":2,"length":512,"data":[126540035,-383808949,297529455,-2015821056,77511642,1124075462,1189610677,1127188721,-2008862840,130433839,-1576488776,-1070464261,-402348126,1539567803,-1631287720,-997810349,-1950054832,-1979389666,1963015175,-282793725,58000444,1493056745,1386136710,-1614050479,-2041527162,2734788,126540291,1968406588,-17569789,-1979187621,1124119823,-1631287720,146428063,-1965423872,-2012398537,67662895,315001568,50825413,1503549657,1527220314,-2008331581,931676951,-2146974141,-2146974141,-561553829,1405848406,50340539,1125616089,509507,121217115,91602954,1526751720,-23861053,-260052645,-1971276463,-91536633,-838974806,-1017514635,512447313,126485737,58000444,-1174545687,-654114774,-1073084534,-1974790028,268321543,-930478294,146397443,-1965489408,1539312135,-1974746279,1958742535,583685,1543095413,-1021661095,82386571,-1963488686,666452691,-1965489408,797590287,260590401,1127188547,834360131,-1311112448,130433920,1976172032,1632504,-402180704,-1073085480,41222320,-2007269200,126372615,-1017462774,-1152167343,-637337550,447863431,1541767912,-389850790,-93126818,-168224196,1397879925,82386571,50342329,509657,509507,-1017553927,1408197864,-1964054296,1975519751,-288495357,394937244,-1975547325,1020299994,-1978764798,126501647,977062654,-28637068,-1023521854,-889306959,-1047894924,1076682532,456940658,-256288653,-1426486524,1124841025,58313470,-1979697687,1965964295]},{"sector":3,"length":512,"data":[1501192,-342034019,-1426486294,-822197439,-1070407051,-1660617566,-963984549,578030396,510788412,548467572,1101724043,-353644802,-822163714,548461684,1101724043,-160051458,1089065195,-10426130,82885203,-1259860047,1975582436,-300160765,-1174072645,213189872,-2001931637,-29211897,1542813133,1105986024,1407974888,1409233384,-1325076294,-460986353,57983230,-1158775575,599459057,-401885947,397536977,-402320710,-1017387925,-397225846,57997103,1525572329,-68660655,1364810494,-389641572,-1986135521,1912814366,180521498,-1156287040,126485753,192225340,1128400838,1128335302,1532168134,-1991194998,1392830750,82885187,-225768271,1107789996,1976172099,-2000669963,1358343,126409219,1124567107,-2008873080,126370567,-398306726,1482423910,138171216,-1293417611,1963080706,-1427615208,-401362686,-1319443489,-472258538,58048766,-336709911,-401624798,-1057037365,1482299765,125110332,1380975280,1356655426,1946434642,-316675837,1523641154,-1426420904,1030994,130472451,130433920,2603776,-1070409213,-2008873080,126370567,1527220291,71042954,138154868,20717684,266929012,-40048404,54206091,3389891,-2135828221,-29151352,-369527351,512486390,-1957493527,2276299,-628631293,1162066,-1336682237,-32506364,1125020935,-176830210,-967091621,-873922041,126508011,1352630052,-791672950,-1979468477,-1949249529,1111730938,-210383362,-791674704,1487600267,-402426466,803733562,-396796931]},{"sector":4,"length":512,"data":[11665458,1929175528,1947876360,-339542519,-402607373,512426014,-880081687,-1157494842,-654114777,126402610,1124567107,-2008868984,-345446137,82386571,582732683,-1244069120,-33060348,1958742543,-29113599,-1007520307,954793333,-468260627,-370369304,-277486942,-316020653,-1662510671,229724386,1491244776,246534282,1541574376,-47388477,82885203,-401624750,-1057037697,-1315155366,-402426864,1520296563,-622263435,19917035,1692930993,1975737314,-256158962,509444,-401886909,1952120959,-51320829,-56442830,-239381756,-402083580,-105185179,-402411260,314179677,-400903931,-256187857,-401493756,-12787161,-1897331851,85179371,126487473,-345642941,71090570,126487413,41164860,1424502448,1976172267,-350623515,-259387644,973089184,-1341820218,-348264416,-823655565,82885355,-521661775,1979661537,-1966908484,1965702151,1057474297,1976172099,-1974287368,-991407672,1348098529,50340283,1963458266,134103816,-29162635,1019316743,1477997858,-646660086,58000700,1022100201,1946267651,-1010762036,1489223730,-126614724,-2017214454,3926234,82386571,3455315,1273551107,-1185199365,-654114783,585631742,447828480,-1948162328,1124395294,347200135,182541032,-898278464,-2135172473,-2015755520,-1948521510,-1190973666,-654049494,-1301030341,-1946891031,-1073042190,803735157,-1426420992,1342496672,-202250158,-645194892,-633650342,-1252912012,-1393390836,1963407938,-838974712,216658805,-27763989]},{"sector":5,"length":512,"data":[-1009223224,-400969390,-1057038085,560186202,596779867,606217207,607986730,162079821,624632930,593174883,603399058,606741538,609035325,610404777,541730107,162073445,162078809,162073001,162073001,544213417,191176823,545655209,162073001,162073001,162073001,547627165,162073445,162078899,162073001,162073001,550111657,309131,994444426,1962936503,179800836,79137024,42991360,-1215577344,76021766,146225990,-1962642176,-1996485961,-16775497,-1023409529,50798779,-1962466274,-1752579297,-1886846968,-1886846972,-1886846970,-2017001462,2,1583044803,119289599,-2041001130,1515822788,1525738331,-336897701,6201427,360038654,3022475,54992521,-1021130870,91537662,916635698,-1950131451,-1962719962,-385662178,1152576279,-2132053527,41255162,-1950154062,-2096830178,-2084359229,126496451,-1312567050,-1841152,-806851152,-383874072,851673860,-383874109,797411844,780845824,-555220894,6529279,2028537736,-2041554689,256196,-1140885527,-397205405,1673199755,6416640,-1564178856,-1966931870,-402181586,815857585,-385382393,1348009803,65586310,-11867904,1394643131,-1157602328,887686960,-997828608,-1022938462,120794762,-1593867032,126355249,1493114601,-389773744,501809155,549305343,3926099,-385404485,-2041053177,120824516,1947024579,1393032724,1543464680,326418686,121161982,229639794,509635,1223165834,1527220479,47811,28969195,-1174148352]},{"sector":6,"length":512,"data":[1402732546,-855591856,549778967,-990507403,-166890236,225706436,116070578,48962482,1676220850,1011898602,-1341819635,-2955254,-1013097640,12276510,605946628,47623,395041422,84942478,119936649,-1144840357,503514920,529205028,120372163,119807491,1405296523,-151107096,-16777081,-1729559692,-1075293464,63079423,1257160754,-1070404022,755592,821128,886664,952200,1017798,277333763,1392706304,-1190855749,-2142568439,-85909441,509507,-1190858565,-2142174848,58007615,-2147435031,578038847,21620825,402227537,1393193476,-2130845208,67113359,4161627,-1679228043,742359040,-398248331,11921044,796151356,1329332661,62204276,594822460,527707196,1295779253,129309044,326390588,-2143088917,125042751,1965834112,-1007074557,1407675113,-1258450456,296165892,61954816,1946148840,-2146465247,-462277399,1929771392,-3217185,663359603,-30348160,50102476,-456077709,1609098448,263162109,-1966765568,1963009257,1959332358,-2133983561,-1334639363,108326154,41205770,-334836226,1085321,-1946339864,-1962933873,-402652265,837353161,-47912707,364427,497547,-385957144,378273056,-1031600346,-293556221,1493363331,1257162122,-387006070,-1349845762,61931535,-2020940334,-989200367,-301743485,-301223870,-919387582,1979521512,-392107773,1009788140,-502827984,-384257297,-1070405466,99255131,-957477968,16777351,162499162,-1342131968,-92251288,-1962380028]},{"sector":7,"length":512,"data":[-1996023498,-402607177,-991304194,-414324484,589937491,-1959902397,188957455,990475465,787576273,-1017442421,1273387753,1845886976,-1778116864,738394112,1476493313,-1342128126,134242308,1610629127,-1073729527,-2147477486,3109,1611,-402653184,-118948394,-58398467,-2013852044,-65534,300479349,-403576576,42452986,-402653184,-369426428,843250821,-1031541056,602467843,8882428,244040448,-745863399,1263620699,1961096680,-473110498,-443357140,-771010215,995692916,-1960414518,-397717046,57992154,1508367849,1364416606,50379963,182486750,-401771072,126353564,-336010685,-439490293,-398260342,-119406335,119082635,1959406426,509446,1543168579,-2082053911,1347957443,-488061818,1947020288,1393032728,1543255784,259309822,121161982,229640562,838912232,-385382208,1240005560,-373290496,585694137,44010493,16759296,41081403,770300551,-49288985,169867,40843,501865003,-50337561,165771,19710986,-1969700838,-371684412,-397154552,-1886848182,-379912181,1397876446,-151306776,-16774009,-2017064588,-1308622836,-165745851,-16773753,-2017064588,-1308622835,-166794439,-16773497,-2017064332,-1308622834,-421205735,755594,-2017017846,1962934283,-80418791,1323893621,-57415429,167819,-311113461,-386222616,1499136003,-85923645,1089418,-1976696649,572841663,521126855,1375698751,-941076397,243791610,-1435107584,-1946392856,-402653041,58063598,1006307561]},{"sector":8,"length":512,"data":[1946157711,-64165646,856081027,807726281,91500604,-991299614,-90904323,-2013857192,1979645962,-2017002739,-2080440310,1542325994,619234137,-94443268,1492446203,-397163386,-2021066130,-1017446391,1364414715,1465261650,-1912602438,270438106,607584005,604423943,-402653177,113704987,132900,-1895820568,-1173937146,548405280,526278638,1482381658,-72292145,276091403,-1460911550,839480577,787516388,630830335,-635045949,-1591369179,199803685,63079418,1947870444,226985988,99255040,-1763128437,12553211,45583104,1004111616,839677175,210208960,-645141504,-319175703,821190,2095629057,-138398981,-16776569,1242068223,-107943862,-385896210,-2021066306,-2084372470,619447490,-402033376,-922814034,952200,113703619,-1946155237,-1106836978,-138477440,5290241,-1935346692,172505,-12730069,-1207730673,78712831,1212735699,-1962734941,-167724832,-1900429170,47872,637967038,126354570,-136296893,-1064380276,-1274908184,-1575957233,950141000,1009300487,-1274187262,1963408464,185383175,6819465,2696840,119408327,-1929772800,1344178651,-768401917,512350862,512427280,512295056,512427290,512295058,512427292,512295020,512427286,512295022,512427288,512295024,512427282,512295026,1186661652,-1877047035,-1844540416,625523456,3153545,2891401,3280524,3018380,-1991428933,-1157600226,512317252,113705072,-167772050,7472839,-1088424448,1874396986,-54512896]}]],[[{"sector":1,"length":512,"data":[-773280781,906413793,178323717,2925315,-68892696,-1142726936,1223173923,-590616358,1409439465,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1935753760,234840937,1936876886,544108393,808333636,1866670128,1769109872,544499815,541934153,1886547779,959520814,234828088,758390784,761754945,1766601016,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,872859213,1353776903,-1576586590,113706803,1840,-1962934086,7661770,985532021,6219807,1107296953,1962960360,525385222,-1191161880,-398327804,108331094,-400595266,113705024,1828,-400617794,113704995,132900,-400612162,937951255,1976699897,605456655,-114497529,74830347,119412361,503773123,1962934023,401101577,1976699897,196696872,80162304,-964485102,-1007230462,50596030,12132081,-1948676608,-922018036,28575348,-922019891,-1070447933,915102190,512427806,-1886845148,-1048508640,-1886846958,-838662360,835969,120360841,9224577,-119150511,-2016949365,8388608,-1946627864,12028371,214073600,214008064,-148838400,34758,159892992,-1752563968,-1886846975,-1048510459,-704446336,235401,495497,-1274599520,1946369263,1963080710,-1158171639,585891873,-1017385276,855775419,-1178497335,-1943666582,637534863,22677447,-536558717,688111345,-1073042386,-466480012,-1073496061,-1389438837,638028070,167820,-661854485]},{"sector":2,"length":512,"data":[-1815887730,-744291517,62625026,-1627114080,496436301,239446020,-1408862549,-324467129,109766926,-553268256,2128348565,114813446,-334235669,988025915,100000518,-435830296,-303626784,90168581,-570030410,937100659,121495815,-2029562142,1737032979,203404295,-2117432320,-1274890302,-1910387418,-1899852070,-1564462382,-1863777180,-1574129412,-1212481034,973587968,-1994251845,839333150,49914560,-1577056606,1705116779,2662916,-1996455749,-1157162722,512295694,2059076364,-501315325,-1576816637,112919775,857639168,33012483,-1073084534,53681801,-1293352075,1127188992,-2008348790,-29146361,1274377677,-1996486714,-1157418210,-1410858506,1975519965,9431299,393490236,570934859,53681801,1949252675,-577705974,-176832502,-973048599,-2081947641,-563681059,1198805820,1400128316,1956400444,1950759943,-512431869,-388142616,-398795454,1956503349,180783639,-385649472,-1031086229,57806908,-1562418455,132842719,50992777,1258757026,1960656360,-585832410,-390927569,199810354,-18335011,420907486,-387650809,-68625118,-286770468,504793566,1272244999,50994827,169773387,-1605154045,414909663,81764872,-397360898,1398340871,81796745,11980938,-637281789,11778394,394910343,-628669629,-1957439229,-1190717154,-654114628,-27538549,1139111368,3153545,54861449,616729178,1406175984,168237984,-1156024896,513870400,1958742791,91273987,57924099,1275068347,1541048139,-31145334,-1031090038]},{"sector":3,"length":512,"pattern":-151587082,"data":[-661994710,-954546550,57931914,-1310808343,-1964256509,1912749255,33602307,-1020607862,-963979126,-125122790,-1997995149,169773534,-1982167293,-1996477410,-1996280034,-1962719970,-2030030818,790510042,-385649917,-634658743,1532185419,-1143019288,149433187,-561256234,550871273,1702132034,1919295603,-385850011,0,0,0,0,1128400838,1127352262,-399505466,-1070399713,-385808990,1162148620,808594755,2003780640,1852402798,1869881451,1668235808,1632772193,544108404,808465243,1936745005,538976349,1093482784,942502512,168430897,59648,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":4,"length":512,"data":[-96668183,-150776135,-16310778,-1190955777,-896793693,243911171,857604944,-1982165294,520425486,-164380274,244055691,-201588688,-1899983708,-1949266216,-83874778,-402238744,512428806,-2017066960,-1962868737,-167562466,57999111,-385243927,-389084977,222038129,1894253429,126496264,1975519811,950060014,1208367623,-1274776576,-1156526848,-890765306,317515783,2210554,-300413716,47902,512482190,512296218,512426128,512296220,512426130,512296214,512426092,512296216,512426094,512296210,512426096,512296212,512426098,512295868,512426020,512295870,-81854426,1443782339,1447860926,1458962622,110086997,-1782708480,1592847180,-1698802162,-1017817524,682373575,795423092,690497836,215429533,830606552,592783037,231148787,385161099,486676748,657657428,658057014,656090904,39462686,39584347,42205818,42992261,43319956,43451030,44106396,45286062,46203572,46924482,47776467,47907546,48038620,734,-834059960,29972108,1443025750,1297023940,-1949413555,1234226511,-984857774,1413546129,1385014341,9623361,1279609088,1279886020,8508229,9032773,1224736768,8899660,-2049686189,-1538700544,-1538045180,-1539028219,1296105478,33989,1099486293,-1881911735,-1814478516,1163067392,1397065428,9098309,1163154265,1224770509,-1901836979,0,-822083584,2133067658,1023085547,1022719229,-1963952642,-1654694393,-1979557445,-29314584,-141933631]},{"sector":5,"length":512,"data":[-1976642678,1958742535,-1639735310,-1976634247,1975859719,-1965389848,-1973855551,73310416,-5193718,1946443426,-1960792051,-29250823,-385649202,-1031141162,-1976695061,-796245241,-108298460,-822197846,-1075248267,2042759688,-381461527,1509623985,1398495577,93644875,738338491,-1967127999,50378184,394997465,2145932123,-1949791739,615263986,-385649281,977471646,-1959299647,1118580466,-495337462,-1406209397,1006984680,-402426834,11535715,2078868338,-225748984,-1073042386,58284633,201327593,-1336870528,-385868546,-1956968355,1118580466,-143015926,-374936766,2101086280,2117867892,-1975315339,1973435399,322627843,58040892,1259557609,1590656688,-1975280289,1921068039,851444438,1508936676,1359717305,-189464786,67561729,-1911132727,244127274,360748310,-988802620,1436553225,208831761,819632,1125275,-1190917958,115869498,69515776,-1962422599,749481714,-1023315071,12048522,-654058749,787647298,1124567212,787647298,1107789996,-2064130581,-63686,1607401845,-1185309345,-11465821,-385402188,-208993380,130974967,24510463,-1654693937,205109593,-826998959,1023132423,1006990590,-820611843,1007127107,-385649267,-1908668200,1793655669,126503689,-1654694193,738691651,-805259903,1372097216,-402435096,-2023881567,968513246,28332556,-1962628958,-1258344717,12780058,1769366852,1428186467,1635148142,1650551913,1124099436,1970105711,1633905006,1852795252,1718968864,544367974,1919252079]},{"sector":6,"length":512,"data":[2003790950,1936278528,1918312555,543519849,1953460816,1702126437,1766064228,1847618419,1377858671,2036621669,1936278528,1699553387,543254884,1869771333,1681981554,1668178294,1176527973,1970561381,-1308596878,112388425,1019382523,-821988540,1016946270,-368741814,-167770008,-742702292,785418756,172165002,-17271360,-386632246,512490475,-1729494201,-67764216,-997996661,-1308156140,1958742598,1011331592,-1308462078,107407688,132666363,97118221,839829992,139109056,-1576515166,61868107,-1340413208,138453508,-1341636958,138388088,-1594110117,-1073084328,1335888500,1975519747,223340547,1381039055,59697235,1515965323,-389903790,1482302479,-1654694193,1469862490,-964013994,41027900,-397684904,141820428,-16653336,-1845370904,1942678360,-1654694181,-1631287720,1448566361,-1963816367,783897552,-958856448,-1604780025,-16513281,1577477819,1364647559,-81157911,126536587,-349829912,-880018661,1579585768,12295519,-383874816,1583045380,-1946481941,649783499,1587371870,-70560169,-1041708149,1592912678,-2041012897,1515822788,1448566363,-886644248,1632507,1676215154,-401755905,179316434,1579601384,1465818463,-876596650,1963186408,1364443905,82386571,50343609,126507481,-1017444036,1520263006,1465801051,669771862,-1654694197,126507099,1076682532,456925042,1128471411,-1962610503,-29250823,-20958526,-2036336192,-997830460,1038683062,57272581,1486708574,-588529614,1537040222,-1073084534]},{"sector":7,"length":512,"data":[-883533986,-471268494,-1654694146,1956421208,738691602,1975519788,15919114,1375783912,-1667434083,28491826,-1660792088,-937115622,916586764,446471429,82813632,-385649251,65544340,-390057467,233374269,62777376,-385649981,1600061078,-1548134243,-397717237,108331180,-385867544,2112364688,1346120704,-1712846475,1042432,-400246807,-398393236,-1070465019,-1308331543,-1228918270,32368640,-1560301373,-1070463690,-980752246,-972959768,-543162361,717618692,854553541,87466688,-1654694205,-81876247,-18814896,-385650088,1600060970,652470429,171709554,65736820,-1952620706,-1190860514,-654114774,-437712898,-385649661,-1863713274,-1956723927,-1506870021,1977584470,1007127050,-1023315398,-385869847,-73399276,-33014782,-20382008,-1975270456,1916419079,540852993,141751412,-17485764,-1010237760,-76234742,1869744956,1064640060,167968928,1129366464,738394274,742028060,1007121397,-1977911810,512312071,11993854,512350346,45089538,-1157430878,173539332,126534592,512312131,-1974795522,1021438783,-1950124784,-352125410,-792658282,50438848,45764946,-1965390077,38922472,1515838087,50208393,310104,1019461642,-385650167,809303916,-20906251,10535880,1930378243,1913469977,35556117,1124758787,394937155,-2026403261,15198426,27306475,50045443,309594172,50470539,77799049,50601611,77930121,45845995,17688579,-2041018901,-1017405756,1631324042,2067593586,1596257651]},{"sector":8,"length":512,"data":[714947,809302643,977073778,1094501365,1530723186,512476149,-1983708357,-1341873378,50045442,512447427,11862794,-654059261,-1014768649,50950714,-385649956,-1017446398,-385815319,717093007,-1107760304,-202682244,-347309635,1196998126,431876587,-1109071073,-538240576,-349414979,500874714,-1514285589,-1110381761,-873782392,-348051267,1089322438,-742538773,-1111692456,-1209319433,-345726531,273792434,1002286571,-1113003164,-1544859860,-349776195,641645982,482187755,-1114313961,-1880398780,-350049603,582335882,-71465493,-1115624695,216610858,521977336,-1107818775,15281061,746110456,-1107821847,-186041969,435731959,-1107824919,-387368287,127385079,-1107827991,-588702845,1687731703,-1107831063,-790034522,607501815,-1107834135,-991351548,682016247,-1107837207,-1192687703,174570999,-1107840279,-1394012071,146193911,-1107843351,-1595331340,930004471,-1107846423,-1796659526,642760183,-1107849495,-1997988993,946322935,-1107852567,2095646612,127581687,-1107855639,1894327884,745651703,-1107858711,1693021248,1422966263,-1107861783,1491677142,129154551,-1107864855,1290340259,388480503,-1107867927,1089016112,1691270647,-1107870999,887687054,1892204023,-1107874071,686366495,655801847,-1107877143,485036379,1699790327,-1107880215,283715006,1695137271,-1107883287,82387559,345554423,-1107886359,-118943637,1689370102,-1107889431,-320272465,128761334,-1107892503,-521579801,639942134,-1107895575,-722910871]}]],[[{"sector":1,"length":512,"data":[946519542,-1107898647,-924236966,1190772214,-1107901719,-1125562712,520797686,-1107904791,-1326889093,1675804150,-1107907863,-1528208068,1234877942,-1107910935,-1729534838,1672330742,-1107914007,-1930859695,1806548470,-1107917079,-2132188111,1665252854,-1107920151,1961452328,1208466934,-1107923223,1760118631,1253359094,-1107926295,1558789907,1058455030,-1107929367,1357453783,1228127734,-1107932439,1156139121,1214365174,-1107935511,954812463,1213185526,-352963863,-167768344,966634,284027638,-253037056,-352976880,-167767554,1399274,349825782,-672467456,-352976827,-167756103,2018026,518974198,-756353536,-352976834,-167755443,6622442,646834934,1860892160,-352976889,-167769901,2045418,127003382,-655690240,-352976889,-167763993,2555882,754903798,-1091897856,-352976889,-167769128,868330,689433334,1072363008,-352976833,-167770208,4185578,433449718,-487918080,-352976811,-167749894,-382919235,935196052,-175183571,-382881603,951973256,-175970041,-385195331,767423868,-176756470,-379312451,992802160,1577530530,1443817662,1005127562,1971666175,-2048371958,-1573180165,1583023924,1443817662,686360458,-326370305,441985,292828073,208996156,-397323696,1515783003,-106108584,116805839,1979647796,872859159,1520500487,688273920,-32934912,5743296,-108205736,232647512,1263583282,1023094760,1007187008,1006925007,1476687144,1477356521,-400737047,-387450124,-397148785,260766995]},{"sector":2,"length":512,"data":[1912732032,28805960,-388396544,-192282558,-402641944,-729153478,-402643992,1824063538,1960512007,-161173495,-389510172,-997588958,-939327308,567094196,292929546,-620051621,-872543372,1949252780,1949121559,-53221101,1912606440,-387937544,74579975,-527824171,180587203,-1963363109,1915759620,-183878413,-872485262,652788550,-1336720635,-64624630,-852839342,-964011231,-1342165784,3401773,585679498,-399659008,-377421783,-109050004,1913894244,1693024261,-980761090,-1979709208,256193,-721538327,230983178,48771120,-2000385536,-389856505,-387450336,-397148997,260766783,1912732032,28805939,-388396544,-326434962,-402646552,-863305882,-402648600,-192217250,766771378,-1073077811,-1017442699,125098762,1017957374,-1023314630,-386132759,1396901005,-1930950480,750015227,-92266035,-32214478,1023312070,11930994,-109002242,-1325108676,1539702272,2062075274,-398806785,-1047855231,-1325436696,-8918982,1726531210,-40506881,-384935238,-633270251,249184782,1141824067,-633008422,249185806,1292819015,-1144123465,246402830,-737239088,-2050224491,530798606,-2142211328,1265844730,1198838282,138417800,553287875,378027378,1942161471,-2134297802,796082682,242536970,1929417705,133857318,378020211,1942161470,180521498,1010922688,-1743752363,-166940088,-1963947278,46202564,-382604352,-377423031,-389479872,326373397,292823868,225717052,91499836,-351262744,-20316670,-1144943927,-684847134]},{"sector":3,"length":512,"data":[-747061238,138294922,1084248656,138519048,1947198696,271116304,1933703808,1959922362,1091995652,-1739040248,-619980661,-1959915916,-1324355681,-741463546,13861867,378194827,1067452481,1373828616,45795467,570472448,190444023,1364686016,261875792,775690356,-1185410699,-503906301,-355342127,-394997237,-386223895,1498943396,863291659,138559104,1345090561,1108249169,244488,1946352000,506627,-388766729,24494091,250108224,243947520,-388822974,-1072969421,-1950154379,10938832,-386241303,28380983,494160956,1396490750,-1040312460,292834876,1178388786,-906099084,-596295108,138612360,1108248771,336773896,50272278,168297988,269356287,1393580562,1913805585,-736847341,-2145968107,-2145782504,-568515813,52476190,-352288582,-83498935,1915091587,-840412613,1760046327,518542330,78035963,1979647990,-379954427,1065354302,-2145553519,1065354503,-955485551,2147483527,-41433200,-390856449,-745801365,116087131,-369505047,-1746394159,-226077952,1976109906,-352144124,1227276,-147530568,-2033677327,512446953,-1886713785,-1947729920,1003779107,1946157711,-94873099,-1977406488,589752516,568902027,-389772765,116794140,1962870851,1711732488,1979711232,-1070397884,331006094,378086932,-1943666656,117449230,-1207942982,-1964111872,116846276,1979646053,4438541,-1158760784,216793185,954789379,4372992,-289109266,6688393,6620870,-1017382144,138610422,1394439679,138878603]},{"sector":4,"length":512,"data":[165879,-126484481,1711732571,1962934016,1694942727,-236192000,579135683,2145970314,-389510622,-527818118,-400394775,71104889,-286719118,1662946040,1958742528,1959329298,807307790,1959329287,824084998,-20382201,-123737917,470192067,250134023,1965243478,-93525757,-386325784,57996952,-386242839,-963970553,-1073032970,-1494678663,1389398776,754345960,1526219496,-2046494080,1342927840,-489663917,-380627788,-10552768,1342643254,721137747,-1260334906,307870464,-1959864317,1358599,-1959864317,-520135929,-225815557,1946161128,1949973513,452623,-1973684359,126537686,-1010106813,-1037384054,37538046,87878770,1381623923,306166611,-930418293,-1974015862,1643937828,-58718094,-2147257477,-1976688404,977683207,-32016956,786724297,-1073084534,1532693625,-1654694310,173430622,-1073034304,-1976637064,-1073069305,-846530439,126496350,-1166688246,1515904651,1137694346,-80655025,843927363,1414548730,1347221809,1291334228,-147631024,1211314688,1949523507,-80508365,-1484107693,-58720210,-1274907139,-134446855,-58718862,1476621052,-72298661,-1073560534,614662324,307870471,-1959864317,12016391,-1959864317,48782087,1591803648,470191967,-419455737,-1190635077,130416698,-85835008,139988616,126548675,17564708,126355258,69469300,-1006944139,-972584198,166395911,1342671610,126353932,1946498136,-87819462,86247306,126355258,-1006955147,-1475900678,202404867,1946630660,-1475901430]},{"sector":5,"length":512,"data":[872707330,-83659771,117373635,-1006958504,604474106,-2012792317,-1609927673,19662936,1487012722,1405352712,3022475,1960512323,140163865,-1979706439,1943588871,1926811656,1926811652,63144711,-1017385502,26708817,1506937600,1397944180,-385894936,78774134,1509278440,-998024358,922702600,-1269759954,-628404083,54730377,-386388503,133562372,1522254593,-167529464,-1009253404,1381191931,-1898826978,270438106,773753605,-620018944,1622821492,993848320,992756338,527567420,946998588,179363978,-1057090188,1947270272,-2134835698,125047548,-58670850,69039381,-5773309,401086068,-1964227841,-293597984,-1158757238,548405280,32242158,1532633080,-855477672,1358680047,-768388578,512678542,1810367760,-1564462592,-922877846,1509973666,1355765791,-768401838,512678542,116851984,-65434,251595124,57999462,-33547288,-2146941938,520635430,1511982709,-806302376,-1342168902,1512042016,1398198104,1193184081,42465032,1962934016,-54663118,-301972806,-1980840822,-973052402,25862,-1017226407,-967748778,25862,138747531,364427,497547,138878603,-165719064,-16751354,1639590517,-64689152,-1070391570,512481422,-1980103744,-1962926050,-1996242402,520102430,-301973318,1711720430,-83886080,-1017226407,508974933,-628174285,84942478,3409654,-402426625,116785167,1962868805,5695491,1566531103,1381061583,281871540,1961101904,975079692,1009682432,1058441472,916477952]},{"sector":6,"length":512,"data":[1959014912,-1998321107,1946170918,924748069,959350784,1024887040,-402477056,225771101,-134361624,-16776825,-352160513,889636357,1499135744,1364443995,-167754053,91619079,250089653,133579520,-1257933313,256064,1405311833,167779304,-1340902199,285048849,-1057095052,1962808552,-41621499,-2007250638,-1168981233,585892353,-1731658043,-1017459574,-1324436141,1959345155,-29605082,126487669,11600565,393515068,-12823829,126504565,1006633657,-1256098656,1007792386,1362982306,1493191400,-109000450,1007056145,839021569,1942305472,1273530930,-230496175,-1913512984,200606952,-402098990,-779356538,1478194011,-389807533,-1992032868,-1017226473,-390177189,126506510,-369770263,-1830161367,-233903884,686942184,1358152424,703717352,78758744,-386723096,1398404289,3028735,1359501753,-1185903180,-380563736,512357768,-4848837,-1946802200,1159629283,1972190211,133585707,-402426879,1532624029,512480135,-397737157,125104572,1443817662,-1980411159,-2030031346,195280602,-196351658,-1779891278,1948794101,-221059068,-7804733,175423498,238864638,61959539,126499563,-243079088,-1791208616,-1875112588,-583266700,-859875211,-1089934574,65737401,-1189948225,1464926222,-1056832592,-1161901826,-380152298,1499462856,-1017385758,1347497866,1978746856,1398364201,-1310146302,-570588932,-41939084,-2146470768,309695997,1543231208,-68884285,-404176037,-373072901,568980273,1965571317,-16455431,37538046]},{"sector":7,"length":512,"data":[11660659,614578923,1958742791,79756802,-60299264,-672660620,-2098674693,-252778245,-1312804269,-6756350,-1874886565,-571996299,1860787952,99175412,-77338379,1022414824,-398166744,173276858,-33131328,1929526472,296833182,1493133800,-1791000485,-466482315,50349758,-349927184,-583040994,-1336733067,-66590703,1968960395,59045383,125042944,1592822760,1274289385,-386615063,1381102553,-1594634520,-796260618,-260904885,1239943028,619195632,-389903630,57871026,1525839081,283661145,144238597,-402652742,393478424,19261523,-2015755430,-390057254,28311797,-1342115608,1529539457,472967363,1256784757,137469980,259309578,137502347,807308115,512447240,1515391028,-1047897255,-1979199768,138191557,-814432254,-402295982,65734599,1510467560,-1108811406,853308416,137470656,-1979660568,183995091,1260287168,46631499,-1995017536,-402115562,512296843,815925298,138190856,832753910,975080200,-2015755512,6285530,137174667,-402116704,512427887,378210360,-634714054,544360052,1709759111,171799552,-2014874432,756976602,137338888,1017170058,-387413496,-756350912,1263262711,-1073559670,1396906610,1258784232,-126493941,137863258,141869066,-167232352,1304784,-1593891095,-930478026,168310688,-1023314495,-1979171680,117303528,-2023831414,1381062366,-385699501,938012751,941000970,975079688,-1965356280,137863873,114944195,512446547,799017005,114681864,512318296,799148077]},{"sector":8,"length":512,"data":[166127624,-1047864565,-1022871902,-386770712,-399708456,-2024541693,924748250,-268703739,-1175314200,-205881291,-232134652,-1980622104,839393822,136880832,1527260834,-1309531416,47617,1375855592,-4554575,31123711,1457424222,-628637646,74701371,-628635394,-1995954270,-1995956202,1527258654,-291575733,-397212043,619382655,753823720,1408305896,-386809624,141885960,648200446,-238295032,-1979406661,-2012740601,-240261113,136584841,-1996488518,-1962403818,50673438,442296539,1994982261,-792557030,1377202904,-338607277,-387264190,1532624963,57858619,-2013394711,-1949594662,1124603934,-637281789,-1073559670,-2024665486,64588762,-628667429,1514789419,135798409,-347940469,283660980,648043265,1975519752,-628636927,437684675,12276488,471763200,-1972216,136912521,1406830427,-1979722008,1510484758,585685751,-1957539072,-1995955682,-1962402786,721951254,438208986,689867528,-1982073080,1510484254,-1327827109,1381191684,378229331,512428060,-620558302,512350723,512428060,-637335526,512481927,-633665504,175316596,136191627,192207419,664806259,1975519752,-1608389849,-1073608664,132849267,-804771680,1511355352,5957723,-352303896,136814619,74760202,283859802,1172855642,101312512,-1813510541,91547653,-27763878,-1023314488,689343314,-1982138616,-2029508322,-1957471526,-2029507810,723421658,1541076744,-1946195223,-1996145378,-1962592482,-1996145890,-385533666,-1957498741,50674966]}]],[[{"sector":1,"length":512,"data":[1523289050,87760523,-628631037,605981635,180587016,168261056,-2014218809,-466435110,-225778953,-1979678715,-397687852,-109777696,753711080,-244044740,-280106927,1457424222,-268441517,77970265,-1073084534,233374584,-2004933632,136887047,-1056307318,582551432,-108807554,-386928920,57999396,-387009303,512487674,-620558302,-620504317,-387080984,1515843521,-386937112,-2024083521,12174298,47745,-17843992,1369621448,-957853688,18999535,1958742616,8644867,-353616920,1793610321,17688815,-397190822,57929695,1139789544,117251721,1945095400,-272898045,-81884861,75032582,16050267,1381061203,-1962596888,-1157170410,-637337600,-92944130,129682315,-2015755520,-773140006,-1947545110,1359412510,787008395,79387119,1524237056,-628631037,1943681883,-301471485,1125091419,-1958531192,-1996030698,172180247,1400302528,1526996456,1375771112,-338499509,477365685,753641448,29088391,121253405,-28636812,-2013891123,-2017240358,-340596518,-980759042,1457424222,1125616464,-2024582589,77129946,-889270134,82379637,-336867072,378227701,-637336265,-880078734,1125616475,-1957473725,1241856286,57924099,-2014476055,619207642,1482250752,1676169977,-1605215740,-1073084335,-1276639883,-402396412,1239942438,189422083,1541895634,-118991933,-385650173,-1017385643,753604584,966918576,-312875005,1122567028,54108909,-2015786157,1406796762,44888459,-1210545472,-654098176,1532615303,-940642365]},{"sector":2,"length":512,"data":[230355142,-1564462563,1659439178,490460417,-870498876,1154620738,492653853,-971157051,1472666957,491505693,1109262785,-212984329,530798621,-752983357,-150987251,47578,-621328405,12241547,-146871552,-339047462,-137721032,-147657766,-339047462,26339574,725352629,758908532,-973208972,-397359734,-1226309208,2028491265,1949056001,-324802301,1493281000,1975519832,10283078,-388920494,-628686698,139173978,678680784,-397192624,-880147629,1398463111,1493214952,-628665765,50331835,1976434394,-1796713478,-637314304,1490745178,74701008,-621290505,-1594020888,-1073608630,1364199794,-49551278,39344474,-1995803968,-1962591466,1025411545,-1564462587,-1329395638,-1341985984,139115392,126355210,-1979026493,1929657538,139174404,-385649981,-963974127,57982986,-1964242711,1975519938,-335550205,-1022867038,168315296,-1141345088,-637337600,-92944130,-963978617,1939652610,-355382783,1939729105,214338270,1123060416,46566083,-1157205056,-145547334,-373191974,-1452016463,954778250,-385649918,-1983648843,-402108650,-1168905197,1347551232,-387214616,-1974342487,-1571270458,190515278,-385649189,512295046,1592264780,48985088,-1949791552,772296478,-1073608822,1994982261,1958820587,1128481541,-1766199829,-1976676066,46696967,170423232,-1965502272,-397192760,28966953,-385649408,-454557679,-385650176,1307049990,99350784,167785448,1129929664,-14709970,256227,1405334132,-1979167045,1958742535]},{"sector":3,"length":512,"data":[-1961886185,-1979167714,512312071,540805196,1614603892,539755122,-1152138405,134088782,139206283,1277069643,-389850360,1027407811,725379188,758969716,-1162213771,-336899553,-1258291014,1949056004,1950039249,1933196509,1915763913,-1965389115,64685054,64619483,-1976554277,50378448,-388331558,-1166737527,-780808706,2028477931,33012479,-399985326,259129403,1118501515,175389500,-16817432,-370051635,-379852147,-639046683,-341186305,-389817721,1319174096,1277070088,-561553912,45174870,-370577688,-621281598,1916878019,-178570237,-216101949,116760582,-216102461,116761094,-216101949,1358660358,-1007090061,116596363,1914765184,552566792,116596361,-1329364541,-216102625,512475910,-75430157,108150512,512476153,-8386829,-2130087392,-1994411797,-1022954722,-1994340480,-1022954722,243974538,114425941,-930478347,-3997326,-1022954738,12568204,-1949856072,637989662,103942026,102893302,807798517,-1010397689,-355341941,-1311077473,65196802,-754667053,74686178,536920705,116594313,-896871029,5572342,-1340836863,-1329061369,-1561800064,61933301,369224403,-1329395981,46670339,-759123767,116761320,-355269967,116594177,1929657539,1426519567,208929024,-654966492,-133761374,-378803773,-503949903,-133761374,5611715,-311115766,611904778,-1476230981,-788368127,-1614070805,-1958018190,2029390539,-923107060,-1174113792,-1631387449,-1009634365,-341849805,14007272,-167693382,16798982]},{"sector":4,"length":512,"data":[-338623116,-1009646781,-1023388256,139730569,117116553,-1600137078,-13498635,74637520,-118765570,139607688,839742366,786105343,557424523,139861641,1327585987,1159807777,-165584607,87172816,807847202,-154974459,-154858795,85993173,-987577529,1191512102,650453699,-1018755792,14018566,-511649290,1961462279,652489238,1246168458,-788975240,1976434396,583586550,-1948480800,132284906,-772943616,653119981,1296500106,48765304,854911744,180933604,-1979414333,-758954276,-1966857528,-2044400680,-754993967,-753428,326421130,-259341278,-388775886,-963970934,184537320,172913919,-2008386359,1173046812,6154246,-304939083,-175445365,-305009199,225766865,-1258275352,-126530049,1946673792,-1194686934,-321716480,-896871178,-125114157,-688460766,468250122,1962871296,-1964013048,1444347843,1412860168,-2134702328,-292880394,-336858252,-740019540,-1966929208,1445396444,-82408696,-1207910650,1049347982,915080947,243927124,-617412526,-1006834382,116797066,-1560396056,780666941,-1966930186,583152327,-1978960699,583414471,853019333,-1966867976,-771730162,642216901,384318856,642752256,-1013039734,5574282,846450130,1195214886,-146961882,1962938311,-1312322779,-1963750652,619238396,266829839,-955061040,37871243,1914256577,1947806722,1942039044,-1077676550,-946948096,116604555,116731530,138221194,116799114,-1977165006,-1123630275,-555155457,-1964489217,-402296065,-177012879,654284264]},{"sector":5,"length":512,"data":[1049181576,780666611,-880146699,-1022894709,-387282170,1391001529,1292727039,1944586100,871592959,602625517,137182857,137309832,-336776363,-13375483,-398128781,-176947370,-1979761432,-2012810434,1510405422,-1975678938,131959755,-1564462397,1721893989,-1173911036,-1036386115,1705116789,-397720828,48817312,12276712,1813940480,-397714684,1970594960,753166312,309603388,1407647464,-1981404440,1527016478,-461969333,1307073396,-1447416604,1958885888,-465377250,-465639359,-465901492,-385649332,837288380,-1036374812,1441334132,-1665135896,-402364766,-1712790460,887640552,1364875750,512350603,1088947305,-1978960922,-1982625033,1527015198,57858619,-1645857559,2112422772,773753601,512447232,1128988720,172165002,-385649401,-1958543150,378094359,-102236114,1958742755,1949973734,1979596021,126501643,973114298,1258976450,-387719192,-347347327,-472454947,-1336681612,54108673,1961233128,214272612,854100608,-443815744,966918320,-1979091709,1965571079,1777048844,675022730,-1159134347,-521643035,1976699877,214272541,-1159165312,-1169021817,-1605235967,-259390725,199572713,-385649198,-1974213227,-1144354066,1230185659,1236070795,-126304246,212660619,-1426486400,54108867,675022730,-2023835787,1229543134,1543494888,-481367989,1357448053,1965571327,-482154484,702749672,1089012597,-485299969,-10557140,773753179,1511426816,1478396675,1960459011,260723544,126501699,614252554,1124567167,-1243289368]},{"sector":6,"length":512,"data":[-1646722304,1373796441,-1962930200,50551326,1511950810,1541048067,-628633621,56368779,-225715653,-1426486356,-1617018209,-260727231,-1020608118,-980758390,-259340518,-645183158,56368777,1544981443,1960459011,1128485669,-1073084534,-2004933476,-1964489977,1125092068,54734730,2019139033,-1377283616,1541048319,512481259,378209112,-633666726,126491764,1346585411,1491362024,91554620,838878440,-1227846976,-338033920,378231261,-633666724,126509428,1129333571,-1964753688,797590287,55793731,1963146457,824084960,260725507,-654114635,-1958487805,990064918,-1177848614,-1974393401,395002631,-1073069245,1405288821,56106635,1918622267,512447477,-633667536,1407939419,1397443403,1541733096,-588774475,-389850140,512484519,-880082084,56104587,56237707,512350763,512427086,512295727,1894253664,1272548324,53419657,168060576,-1961331520,-1962645218,1730055115,-460593148,56237705,56368777,-1327270936,74162689,1705046154,-1962857468,1258303518,-1041645542,-1564462368,1705116779,1478396676,-1949594877,50613790,1511950809,790530819,-628669693,73408139,53419657,-225715653,-1426486356,-1617018209,-260727231,-1982231735,-1962714082,-1962644458,1258303518,58053131,-387648279,57860971,1239668969,-420882037,-470554140,591135153,1371734388,1509956072,125092410,57934908,-387744535,-1976770288,-1982756107,-1023088362,-517543861,58008380,-387899416,-1293360233,-1596945693,-1036385057,1491665779]},{"sector":7,"length":512,"data":[1392555747,81796747,-637281789,-1975316598,-1393456337,-1017397238,-1330052432,145799428,-498735024,-495065000,53288587,1508007400,-1327188247,61913345,1342681273,1491260136,57804602,-18686743,50045632,-400585917,-1228676441,-373280255,1323829350,-385649913,-29563759,1688339829,-33035516,-385649472,512426106,652738608,1478396171,73703427,57982986,-387987736,1128522292,56106633,853851112,87466688,-1595810328,-1073085333,-1125579916,82813182,58048522,-371033367,485024753,-507451165,-387884055,1860822154,-1897375262,1172851711,-402230048,1172963300,-1564462364,-756546321,-385649914,-1057037291,1860764533,1975582434,-496506621,82386571,50342585,-385351975,1994974201,-514463519,1541996464,1477872389,807308035,1960459008,1124567713,88664146,1408428890,1943961064,-386027461,512427322,635962192,-397190400,512426016,727320324,1501402,-1910580601,-1979494370,401088263,189416197,-370182702,-1014309362,-1979381272,84208071,1407317225,1943943656,94693623,-260702916,-1979343384,93907152,-1813450614,-388462075,-125172338,-1979348504,92596424,1621158026,1959329280,1343654662,-397190397,-1910635150,520587482,-980793021,-277495542,-575346343,1979594216,-509220605,57934892,-2015258391,11779034,529258755,73277065,-1996488517,-1979248098,-1160083513,-628686660,-393553661,126540423,24390716,-397323581,-397352848,-398336260,-397156616,-1645682369,1582913760,-1974018425]},{"sector":8,"length":512,"data":[-1957473592,-1257827810,-1982266624,-2029579746,1579060186,1943681796,-506599165,-628663717,-1992093816,-1360307433,32178188,82353401,-530388767,-529340334,-561553831,-397323434,797630671,1457424222,-930478198,1134318417,-1073080437,512453748,-633667536,512440691,-633666728,-779472526,512426166,-637336740,512481927,-633666769,-1969397134,-534714175,-2023859877,1364350686,1507886824,-561553830,1129533782,-1659401828,395002715,-1958519975,985762335,-1979550779,-1966789912,57843144,-33547288,1959657157,-1962440178,1111730938,1499067371,1935235417,190467,548455259,-906051074,-91490444,-152354134,1582914461,-2024350073,1359640026,-1192704630,-503715617,-561553831,-346861226,1946434690,-397688063,-1168974324,91488384,-544872367,512447321,-633665767,183042931,11779040,394909955,-1296027069,126370567,-109720834,-1564255653,-1343748328,1946434812,-535303933,784028497,-1965489408,1913207815,-1604626159,-2036398312,-997830460,-385568687,-1212423823,-1948712192,1581400855,-1974018425,1965833223,-551426045,-577050549,-1645673612,-561553695,1976699734,-543954685,1243056459,1364416859,50379451,-2000669991,126370567,50377659,-2027975719,-1152167206,-633667456,-1174047397,736821248,-470302069,-1974282101,-1971379005,1493219024,-544554102,-620496502,1458111347,1943064799,-980794623,57982986,-1981855511,1527190046,-1128574119,-1982266624,-1157164002,-654114765,512350723,1398474518,721453243,995252954]}]],[[{"sector":1,"length":512,"data":[-1979419942,-1596290306,-1073084648,-2135278220,1943681792,1407734533,-1957602560,370576331,337545991,8316935,118759049,-779422326,3663961,118627979,303991107,-634692857,12245771,-1552592128,1405311835,1526734312,-1949594799,-1962470378,-402188770,-628686776,118759049,-779422326,231336793,966967346,1397903623,118625931,50378171,529224665,1541028674,1134499720,1966573726,121217031,242532362,1395368635,683365201,-371653888,1515913763,-1974353063,-1426420985,-1974910397,1975585477,1489197554,1386136710,-1957650607,6416587,1374170228,12303104,-637282045,126393944,716918943,-1965489408,509495,141823292,-963977212,126353428,1515822680,-186006693,719868638,-386436096,-1145372644,64553728,168266458,1499159232,11779011,-1162148885,-1948712192,-1153252585,-654114630,-1950148727,-1382197,-1972142,995809927,512345050,988283707,-556275491,-1041695056,-557192965,1021104105,-385649406,700177925,-1965489408,1958742535,-1393456341,611583036,168266307,1359574464,-404170357,-555001599,120225968,11913354,-1186735869,-654114808,439093130,-1072037588,-1965147415,1121028853,50342331,-1070444071,-68679800,121020417,1007008744,-385649153,-922821063,1290339189,1976106719,-1070441969,-1314194805,1156071952,-573052461,58048766,1507727593,50341819,1125616601,1261930562,1371740040,-1968377461,1121028853,1963080786,754301722,-645180589,-1964434768,2734848,126540035,57982986]},{"sector":2,"length":512,"data":[1526697448,-1325297176,-755374064,842249817,-1426486336,1976499777,71091192,1962944699,12106499,126540035,-383808949,297524421,-2015821056,77511642,1124075462,-1662516043,1127188701,-2008862840,130433839,-1576488776,-1070464261,-402348126,1539562769,-1631287720,-997810349,-1950054832,-1979389666,1963015175,-612701949,58000444,1493056745,1386136710,-1614050479,-2041527162,2734788,126540291,1968406588,-17569789,-1979187621,1124119823,-1631287720,146428063,-1965423872,-2012398537,67662895,315001568,50825413,1503549657,1527220314,-2008331581,931676951,-2146974141,-2146974141,-561553829,1405848406,50340539,1125616089,509507,121217115,91602954,1526751720,-23861053,-589960869,-1971276463,-91536633,-838974806,-1017514635,512447313,126485737,58000444,-1174545687,-654114774,-1073084534,-1974790028,268321543,-930478294,146397443,-1965489408,1539312135,-1974746279,1958742535,583685,1543095413,-1021661095,82386571,-1963488686,666452691,-1965489408,797590287,260590401,1127188547,834360131,-1311112448,130433920,1976172032,1632504,-402180704,-1073085480,41222320,-2007269200,126372615,-1017462774,-1152167343,-637337550,447863431,1540447976,-389850790,-93126818,-168224196,1397879925,82386571,50342329,509657,509507,-1017553927,1406909160,-1965343000,1975519751,-618403581,394937244,-1975547325,1020299994,-1978764798,126501647,977062654,-28637068,-1023521854,-889306959]},{"sector":3,"length":512,"data":[-1047894924,1076682532,456940658,-256288653,-1426486524,1124841025,58313470,-1979697687,1965964295,1501192,-342034019,-1426486294,-822197439,-1070407051,-1660617566,-963984549,578030396,510788412,548467572,1101724043,-353644802,-822163714,548461684,1101724043,-160051458,-1763061525,-10426150,82885203,-1863839823,1975582416,-630068989,-1174072645,213189872,-2001931637,-29211897,1542813133,1104697320,1406686184,1409233384,-1325076294,-798889969,57983230,-1160064279,599459057,-401885947,397531943,-402320710,-1017393081,-397225846,57997103,1524283625,-68660655,1364810494,-389641572,-1986135521,1912814366,180521498,-1156287040,126485753,192225340,1128400838,1128335302,1532168134,-1991194998,1392830750,82885187,-225768271,1107789996,1976172099,-2000669963,1358343,126409219,1124567107,-2008873080,126370567,-398306726,1482423910,138171216,-1293417611,1963080706,-1427615208,-401362686,-1319448645,-810162154,58048766,-337998615,-401624798,-1057042521,1482299765,125110332,1380975280,1356655426,1946434642,-646584061,1523641154,-1426420904,1030994,130472451,130433920,2603776,-1070409213,-2008873080,126370567,1527220291,71042954,138154868,20717684,1709769588,-40048424,54206091,3389891,-2135828221,-29151352,-369527351,512481356,-1957493527,2276299,-628631293,1162066,-1336682237,-32506364,1125020935,-176830210,-967091621,568918535,126507992,1352630052,-791672950]},{"sector":4,"length":512,"data":[-1979468477,-1949249529,1111730938,-210383362,-791674704,1487600267,-402426466,803733562,-396796931,11665458,1929175528,1947876360,-339542519,-402607373,512426014,-880081687,-1157494842,-654114777,126402610,1124567107,-2008868984,-675354361,82386571,582732683,-1244069120,-33060348,1958742543,-29113599,-1007520307,-1897333387,-806164263,-371658008,-277492098,-645928877,2028476849,229724366,1489924840,246534282,1540254440,-47388477,82885203,-401624750,-1057042853,-1315155366,-402426864,1520291407,820577141,19917016,1088951217,1975737294,-256158962,509444,-401886909,1952120959,-51320829,-56442830,-239381756,-402083580,-105185179,-402411260,314179677,-400903931,-256193013,-401493756,-12792317,-454491275,85179351,126487473,-675551165,71090570,126487413,41164860,-1427624272,1976172247,-680531739,-259387644,973089184,-1341820218,-678172640,619185011,82885336,-1125641551,1979661517,-1966908484,1965702151,1057474297,1976172099,-1974287368,-1595387448,1348098509,50340283,1963458266,134103816,-29162635,1019316743,1477997858,-646660086,58000700,1020811497,1946267651,-1010762036,1489223730,-126614724,-2017214454,3926234,82386571,3455315,1273551107,-1185199365,-654114783,585631742,447828480,-1949482264,1124395294,347200135,181221096,-898278464,-2135172473,-2015755520,-1948521510,-1190973666,-654049494,-1301030341,-1946891031,-1073042190,803735157,-1426420992,1342496672]},{"sector":5,"length":512,"data":[-202250158,-645194892,-633650342,-1252912012,-1393390836,1963407938,-838974712,1659499381,-27764009,-1009223224,-400969390,-1057043241,898089818,934688639,944125979,945895502,170080369,962541702,931083655,941307830,944650310,946944097,948308515,879638879,170068959,170079357,170068515,170068515,882117155,199177371,883558947,170068515,170068515,170068515,885535937,170068959,170079447,170068515,170068515,888015395,309131,994444426,1962936503,179800836,79137024,42991360,-1215577344,76021766,146225990,-1962642176,-1996485961,-16775497,-1023409529,50798779,-1962466274,-1752579297,-1886846968,-1886846972,-1886846970,-2017001462,2,1583044803,119289599,-2041001130,1515822788,1525738331,-336897701,6201427,360038654,3022475,54992521,-1021130870,91537662,916635698,-1950131451,-1962719962,-385662178,1152571245,-2133342231,41255162,-1950154062,-2096830178,-2084359229,126496451,-1312567050,-1841152,635989424,-383874091,851673860,-383874109,797411844,780845824,-555220894,6529279,2028537736,-2041554689,256196,-1140885527,-397200249,1673199755,6416640,-1564178856,-1966931870,-402181586,815857585,-385382393,1348009803,65586310,-11867904,1395963067,-1157602328,887686960,-997828608,-1022938462,120794762,-1593867032,126355249,1493114601,-389773744,501809155,887208959,3926099,-385404485,-2041053177,120824516,1947024579,1393032724,1543464680]},{"sector":6,"length":512,"data":[326418686,121161982,229639794,509635,1223165834,1527220479,47811,28969195,-1174148352,1402732546,-855591856,549778967,-990507403,-166890236,225706436,116070578,48962482,-1175905870,1011898582,-1341819635,-2955254,-1013097640,12276510,605946628,47623,395041422,84942478,119936649,-1144840357,503514920,529205028,120372163,119807491,1405296523,-151107096,-16777081,-286719116,-1075293484,63079423,1257160754,-1070404022,755592,821128,886664,952200,1017798,277333763,1392706304,-1190855749,-2142568439,-85909441,509507,-1190858565,-2142174848,58007615,-2147435031,578038847,21620825,402227537,1393193476,-2130845208,67113359,4161627,-1679228043,742359040,-398248331,11916010,796151356,1329332661,62204276,594822460,527707196,1295779253,129309044,326390588,-2143088917,125042751,1965834112,-1007074557,1406386409,-1258450456,296165892,61954816,1946148840,-2146465247,-462277399,1929771392,-3217185,663359603,-30348160,50102476,-456077709,1609098448,263162109,-1966765568,1963009257,1959332358,-2133983561,-1334639363,108326154,41205770,-334836226,1085321,-1946339864,-1962933873,-402652265,837353161,-47912707,364427,497547,-385957144,378273056,-1031600346,-293556221,1493363331,1257162122,-387006070,-1349845762,61931535,-2020940334,-989200367,-301743485,-301223870,-919387582,1979521512,-722015997,1009788140,-502827984]},{"sector":7,"length":512,"data":[-384257297,-1070410500,99255131,-957477968,16777351,162499162,-1342131968,-92251288,-1962380028,-1996023498,-402607177,-991309228,-744232708,927841107,-1959902397,188957455,990475465,787576273,-1017442421,1272099049,1845886976,-1778116864,738394112,1476493313,-1342128126,134242308,1610629127,-1073729527,-2147477486,3109,1611,-402653184,-118948394,-58398467,-2013852044,-65534,300479349,-733484800,42452986,-402653184,-369426428,843250821,-1031541056,602467843,8882428,244040448,-745863399,1263620699,1959807976,-803018722,-773265364,-771010215,995692916,-1960414518,-397717046,57987120,1507079145,1364416606,50379963,182486750,-401771072,126353564,-336010685,-769398517,-398260342,-119406335,119082635,1959406426,509446,1543168579,-2083342615,1347957443,-488061818,1947020288,1393032728,1543255784,259309822,121161982,229640562,838912232,-385382208,1240005560,-373290496,585694137,44010493,16759296,41081403,-2081826169,-49289005,169867,40843,1944705579,-50337581,165771,19710986,-1969700838,-371684412,-397159586,-1886848182,-379912181,1397871412,-151306776,-16774009,-2017064588,-1308622836,-165745851,-16773753,-2017064588,-1308622835,-166794439,-16773497,-2017064332,-1308622834,-751113959,755594,-2017017846,1962934283,-80418791,1323893621,-57415429,167819,-311113461,-386222616,1499136003,-85923645,1089418,-1976696649,574161599]},{"sector":8,"length":512,"data":[521126855,1375698751,-941076397,243791610,-1435107584,-1946392856,-402653041,58063598,1006307561,1946157711,-64165646,856081027,807726281,91500604,-991299614,-90904323,-2013857192,1979645962,-2017002739,-2080440310,1542325994,619234137,-94443268,1492446203,-397163386,-2021066130,-1017446391,1364414715,1465261650,-1912602438,270438106,607584005,604423943,-402653177,113704987,132900,-1895820568,-1173937146,548405280,526278638,1482381658,-72292145,276091403,-1460911550,839480577,787516388,968733951,20586179,-986069446,199803705,63079418,1947870444,226985988,99255040,-1763128437,12553211,45583104,1004111616,839873783,210208960,-645141504,-369507352,-957555444,16780423,-75896637,-2013806542,-65534,1246365812,-285635096,-1142358096,176654585,-1031552256,539290628,-1410856587,-2000093447,-1023406457,453428986,244056071,-2135030014,33013504,-67088199,-645094157,721420961,268385729,-4717698,-754667249,-1555543840,-527760630,-1896480584,9353664,-1107296069,-1977219430,1124567044,-1929912250,-390033704,263455451,1218580685,121152000,37497012,1353977202,125110076,-1995764551,-2013239282,-956290778,466438,-611517951,55582345,-1898826978,270436826,-1877046523,438208768,-1843492091,471763200,1813940997,371099904,1847495429,404654336,1881049861,303991040,1914604293,337545472,605981445,-1138849536,639535875,-1105295104,327990019,2367113,2494092]}]],[[{"sector":1,"length":512,"data":[-1996127301,-1946120162,-1157590514,512309612,512294960,244056108,244056114,-155516882,1813940499,1846447104,348175104,7347849,7474828,2104971,62922377,2236043,63053449,121290527,855666617,-1410073408,-959578648,17118726,-1560081759,-202899412,-1964442672,997309391,-389678360,-1612068678,1701336066,1296189728,1919242272,1634627443,1866670188,1953853549,1109422693,1667855201,1700138495,1869181810,826351726,540028974,2037411651,1751607666,1112088692,1866670157,539914354,825768241,536874495,1967205684,825765223,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,-968015287,541446,138544838,1159629059,314802440,1193183488,-2117367032,1358990529,34759,-880082816,138747531,835969,364425,-1031679605,-1752629120,512425991,-1377302457,113662967,-1325463756,120758864,-955829342,471046,47616,1961413259,-1106873088,1592275806,178432,6678594,1958610549,5236787,1107297465,1962956520,864730630,-956284696,467974,858963456,-956292120,34022406,860405248,-402647064,-770967350,378081141,-1075312860,1976699896,504793348,116900615,-63714,-397211276,-770967382,-1185208203,-953286645,-2093730300,-152960314,67681987,-1189154557,-645005312,186584203,-1274645303,186109185,843236297,-1957040448,-1962467786,-1996020706,-2130239345,-1996483903,50800783,214008270,747604224,-1933475577]},{"sector":2,"length":512,"data":[2028491008,-942961672,-2147483513,-127670272,-1215704181,-1031733248,-1048510452,-1276641268,8898294,-2017067008,-1979777015,-1996488297,-2130705009,50364609,60262870,126847232,120037376,54325172,37488244,-139196043,-335535686,1542374434,35175363,-1047606989,637561529,167820,1510459174,79921921,-1799425568,179056189,840201408,62915556,785943488,126428845,42961958,-1931023616,-1010790696,-1560062317,-829095194,96900611,-1610244945,-1969290126,73045764,-1424900952,-1045690640,308521222,-536410903,266274373,116972550,-351841814,1609312283,112518184,-402231325,1525024315,107472646,-1241130531,-304216448,129096453,-502810655,1351026640,132221189,825780,-1031681396,649331713,-628219443,-762396018,1688387634,-64952060,-157143888,12040961,-1153824826,512303649,-1070463179,-1576863326,1805778950,73769476,-1157617502,512295040,247138073,203327747,58374915,65150601,-543030352,441092,53681801,-1979582533,-1983903225,1963143966,11725059,-1975308406,126372615,-838974653,-968100491,512294919,-155516109,-913381375,58048522,1006669801,1259828271,-1994258490,1124283166,175386428,180974568,-369789504,130416756,-916002816,1019890152,1011315795,1012102211,125082701,57951804,-389195799,636012876,417872585,393518539,-1073035638,1323893620,1019382475,-385650160,-542979259,-1995969788,-1576859114,-397736165,645187872,801699816,367571691,-923866935,-891164614]},{"sector":3,"length":512,"pattern":-151587082,"data":[119084681,99149035,-924915511,-892213190,119412361,-1957964565,1258490398,50994825,-543141045,143899396,-33235038,-1092071232,-1991026436,-1979391970,50378448,1524237274,-2029997127,1125616090,64653123,512447449,-1128724711,-1948712192,-922854453,-1992039051,-1996476386,1510163742,-266026358,-1605119862,-1073084645,-1329915787,119447818,57982987,50716859,-1157401638,1263271935,-1973691769,-1963055934,717392592,-1965520189,-1966662970,-385649672,61983369,-947196973,57803324,-1979580229,-1966921022,449219288,1945668295,-898897661,50994825,512350855,512294956,512295727,512426821,-628686800,53419577,753468275,1272589260,-396668085,-88356149,-1049499585,-372609304,1109442825,1936028793,1701996064,15269989,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"sector":4,"length":512,"data":[-1408455425,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1953644832,-1240671744,1444974339,1769173605,824209007,540028974,1126777640,1920561263,1952999273,1296189728,1919894304,959520880,201339192,-1895579635,1667845152,1702063717,1632444516,1769104756,757099617,1869762592,1835102823,1869762592,1953654128,1718558841,1296189728,-905105408,1092652803,1869116533,539828338,1852140615,1951604846,1953653109,1918977056,1801677156,-821214464,1394644739,540690245,253794336,1125482,64228695,1347240275,609437004,572581664,2248526,64884065,-233955191,225837059,1095959528,1162629197,-417323949,1163469344,-1560272301,-922488307,-935666400,304877856,253804346,739322895,547371537,-1069930481,371247674,974327596,1226973329,2248002,66850246,739778762,288099343,572559674,1936876880,1818324591,1836008224,1702131056,-218094990,-1090255347,738856736,550124049,439093775,-1858465492,680984352,-383134449,353315030,701304620,680984553,2734095,68161064,185540810,288102956,-14642886,-1290852202,539158825,538976288,538976288,542396993,538976288,538976288,-1761613534,699600680,437145088,253807108,739912716,546388497,254318335,-689362509,739577640,-383180785,254318335,-2097141325,-905698290,739053344,974203930,-1761664879,699600680,538977001,1700143136,1869181810,774971502,538980400,572530720,680984553,2732815,70127273]},{"sector":5,"length":512,"data":[235872458,288102956,-14642886,-737204074,685173033,254547215,-1496627,-1106302826,249364521,549389368,288100111,253807162,739781649,546388497,692267042,1886339872,1734963833,1226863720,1126190402,544240239,825768241,252772386,549389378,288099855,253807162,739781655,546388497,1701990434,1931506547,1701011824,1918984736,544175136,1953394531,1702194793,254083106,545981516,585558238,550314018,1275994249,254935044,1296237654,-417323964,1241570848,-1962647537,1145914144,552017956,-853532126,237013280,1711277142,-1962644977,1145914144,552017956,254318335,-853530341,237013280,2130707962,-1962642417,1145914144,552017956,539107362,545857741,296974,75370377,1443766409,261423108,546768008,-414759597,263716881,545981586,681049896,688132108,203484704,-399966160,3149030,-1994339040,85200416,-1676687104,253796356,985676368,739516618,265945106,546374822,1280264226,1414078532,385884705,-1861963760,1331241504,1163011925,1414483488,1230198048,1411401550,1126188360,1380928591,1095911215,1128876112,1330454611,1330923854,1145118802,1163153473,2236754,79302741,1411522705,542329160,1196380752,541933906,1397052245,1095911200,1128876112,1312890963,1163010116,1380537681,1411404613,542392648,1346454593,777143636,276693026,546374852,1163022370,1411404627,1394623816,1162035536,1380008480,542069792,1414418243,1163218505,-2013257170,-1761292784,1195725600]},{"sector":6,"length":512,"data":[-670000128,-568292604,572712680,-1994339040,81268256,-502224640,1145914116,552017956,281084126,545981676,608456003,572581664,550314018,-502390647,282918916,545981686,608456003,-14620896,453978262,550314025,-99737463,284557317,545981696,608456003,572581664,-853532128,237013280,1530,-1996158447,81923616,336660992,1394644741,402671429,-1794829039,-1994348768,85462560,370222080,546569733,577137954,387001856,237013253,939525401,-1476061167,85528096,420562432,-1491036923,237013280,1476395008,-939188719,288100896,421576506,-1069936340,672231936,673230853,689056786,1075587306,-938529791,739453993,-1912584638,-1341836783,504309792,689835820,572270826,-1441846271,739322921,-1543485886,-1341834223,504309792,689835820,739387626,304883986,1175567616,673230853,738271772,-366404081,20978728,740889132,299106322,548406608,740167464,-366368241,254546472,304884168,1511124480,673230853,738271772,-366368241,20978728,700976940,150999596,-1341823982,1678714912,699600684,-670095126,700518188,1110184236,303366214,550110574,254547983,304676880,546375023,1750343714,1766006885,572553588,305397819,550110576,168766483,2014466816,572559621,1936028272,1397039219,1701519427,1869881465,1769497888,3875444,92410468,-416196535,267094271,588245498,-1944947456,844646661,-343343129,266992143,311492643,1481180566,552017970,827869480,844646890]},{"sector":7,"length":512,"data":[538242089,1481187561,312606770,1497957792,-1996495055,-378662933,-1392494833,1225107986,266809945,315687077,548406708,827869480,827935020,1227418153,1227633240,740897369,334203135,1110184681,317653062,548406718,827869480,827935020,1227418153,1227633240,740897369,4336657,96998165,1227366576,317272408,827935020,-366406935,844646696,1227625194,317338201,739322921,322306114,1095304658,-14620896,1227368582,1240084824,-349621672,827935016,844712426,1392519465,1225120787,552018003,805313832,1240109070,485239105,-383778456,2428704,98964318,1397301444,1728058156,1258680339,14608164,99750781,608903307,572581664,550314018,-2113003383,329187333,545981940,-400546741,-1761664794,689639208,-1742680800,745148192,545864209,360974,100275151,739320008,545995282,1347240275,609437004,572581664,575882585,-31404768,1394745484,1280331073,740447045,256028,100930527,739778751,974203921,8469184,437911552,14608164,99750781,608903307,572581664,550314018,-2113003383,329187333,545981940,-400546741,303366214,550110574,254547983,304676880,546375023,1750343714,1766006885,572553588,305397819,550110576,168766483,2014466816,572559621,1936028272,1397039219,1701519427,1869881465,1769497888,3875444,92410468,-416196535,267094271,588245498,-1944947456,844646661,-343343129,266992143,311492643,1481180566,552017970,827869480,844646890]},{"sector":8,"length":512,"data":[168603903,1411419904,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1835094816,1936026736,336387584,1444974336,1769173605,824209007,540028974,1126777640,1920561263,1952999273,1296189728,1919894304,959520880,268448056,-1895817715,1667845152,1702063717,1632444516,1769104756,757099617,1869762592,1835102823,1869762592,1953654128,1718558841,1296189728,671953920,1092652800,1869116533,539828338,1852140615,1951604846,1953653109,1918977056,1801677156,839737600,-585053952,287361082,-1086713300,739184416,974203921,672080032,-902119366,254547488,546388499,1296189730,226754594,550109244,202320920,-1858465492,1699750432,1852797810,1126198369,1970302319,577922420,1175302400,253804288,974203914,168763594,288102956,-14642886,-720426858,685173033,254547215,-1496627,-1206966122,233177129,550109264,439094031,-1858465492,680984352,-383143153,538976290,538976288,1347240275,542328140,538976288,-383639520,254318335,201337267,-905946610,738987808,974203930,-1761664879,699600680,254334697,537865237,-1761613527,699600680,1678655744,253807104,739912717,546388497,254318335,585705907,538976288,1936876886,544108393,808463921,538976288,-1498592,-1290852202,241631273,550109294,439094799,-1858465492,680984352,-383134705,353315030,701304620,680984553,2735631,7868059,252649663,-902164180,739315488,974203928,673325201,1126181187,1920561263]}]],[[{"sector":1,"length":512,"data":[1952999273,1296189728,1919894304,959520880,2240824,8523471,235872447,-902164180,739708704,974203928,1344413841,1936942450,1634759456,1646290275,1948283489,1868767343,1852404846,2254197,9178863,1779376280,975180076,1279515023,542261573,1145198923,1179992608,5391686,9834236,608456003,-568269024,-1609625088,1126206208,-417053619,-853532126,237013280,771752086,-1962890737,1145914144,552017956,254318335,-853530341,237013280,1191182696,-1962888177,1145914144,552017956,539107362,545857741,51214,12455761,-1945231223,260046848,549978312,974269457,252649663,288100652,-902119366,338433568,572559674,1347240275,1344292172,1380405074,575884609,-770726912,404802048,288101420,539005242,757088546,1398099232,538985289,858267680,573139762,-602941696,421579264,288101420,539005242,757088802,1414676768,538976288,858267680,1127050034,1919904879,1634879279,1667852400,2238835,15077371,739909834,974203924,572530833,539828291,1414680397,1162297671,942942240,2238827,15732785,168763594,288101420,572559674,539828292,1129466179,538985804,1094854688,1094928723,1819231021,1194291823,1752195442,695427945,275185698,550109434,338430735,-1858465492,541401632,1329864749,1497713486,673194016,1230192962,1127039299,1919904879,1634879279,1667852400,2238835,16453789,202318026,288101420,572559674,539828294,1128614224,1414676808,1094854688]},{"sector":2,"length":512,"data":[1094928723,1819231021,1194291823,1752195442,695427945,282263586,550109436,338431247,-1858465492,541532704,1094852653,538987596,673194016,1230192962,1127039299,1919904879,1634879279,1667852400,2238835,16584951,235872458,288101420,572559674,539828296,1330401091,1380008530,842213408,2238827,16650523,252649674,288101420,572559674,539828297,1162625347,1380009038,842213408,2238827,16716113,269426890,288101420,572559674,539828298,1128353875,538976325,1094854688,1094928723,1819231021,1194291823,1752195442,695427945,292618274,550109440,338432271,-1858465492,1397039648,1162551363,539828313,1414092869,295305250,550109444,338432783,-1858465492,1313153568,542262612,1414808908,1327518277,1380982854,1095911247,-889183667,-905902575,739577632,974203924,1310859409,977622095,1819033888,543584032,543516788,1987011169,1919950949,1634887535,2257773,17240574,370090186,288101420,572559674,538976288,1701978144,1919513969,942940261,1718165611,1769174304,1109419886,1128878913,503325249,-1744761326,745148192,-1892016111,1162626009,1260409409,541344345,1179014466,1006654021,1258360850,552017956,545995486,-400546741,572661990,-1994339040,17698336,319969536,539249409,987635943,608903307,572581664,550314018,319692937,310444033,545980696,1260946431,739388452,-417322734,574693920,-31404768,1294082188,1128878933,-400806878,312934403,545980706]},{"sector":3,"length":512,"data":[1260946431,739388452,-417322734,574759456,-31404768,1092755596,740447314,256028,19665618,-2080431989,740576040,689056786,572581664,-853532093,546111008,1380928802,1195460436,472654405,-83885080,-1962854894,679739168,304882763,539562540,1143087335,550314018,572558590,1129466179,740443468,256028,20386596,-2080431989,740576040,689056786,572581664,-853532091,546111008,1313817634,576275787,65543212,940789504,-14644479,608905347,304878124,552017961,539117090,-1929502515,1229988384,1095254853,740447314,256028,20517750,-2080431989,740576040,689056786,572581664,-853532089,546111008,1279345186,472654412,-1593834520,-1962853869,679739168,304882763,539562540,1210196199,550314018,572558590,1330401091,1380008530,-400806878,332136451,545980731,1260946431,739388452,-417322734,575218208,-31404768,1126310028,1313164353,575816004,65543212,1007940608,-14644479,608905347,304878124,552017961,539118114,-1929502515,1347625504,574964545,65543212,1041505280,-14644479,608905347,304878124,552017961,539124002,-1929502515,1431118368,574835027,65543212,1058292224,-14644479,608905347,304878124,552017961,539124258,-1929502515,1380000288,472654420,1828717544,-1962852332,679739168,304882763,539562540,1663181031,550314018,572558590,1414680397,1162297671,-400806878,345374723,545980737,1260946431,739388452,-417322734,576987680,-31404768]},{"sector":4,"length":512,"data":[1126310028,1279480393,472654405,-1090518040,-1962851820,679739168,304882763,539562540,1696735463,550314018,572558590,1263423300,740448581,256028,21173482,-2080431989,740576040,689056786,572581664,-853532058,546111008,1162432546,1380010051,472654420,285213672,-1962851307,679739168,304882763,539562540,1730289895,550314018,572558590,1280065858,-400806878,356253699,545980741,1260946431,739388452,-417322734,577249824,-31404768,1126310028,1380928591,575816002,65543212,1175807744,-14644479,608905347,304878124,552017961,539126050,-1929502515,1094918688,1145980236,740446785,256028,21435791,-2080431989,740576040,689056786,572581664,-853532054,546111008,1095783202,740443459,256028,22287793,-2080431989,740576040,689056786,-14620896,453978262,550314025,1745756297,364576769,545849694,51214,23598543,739320008,549403154,974203928,8469184,65541593,-938598263,0,1145969178,740446785,256028,21435791,-2080431989,740576040,689056786,572581664,-853532054,546111008,1095783202,539124002,-1929502515,1431118368,574835027,65543212,1058292224,-14644479,608905347,304878124,552017961,539124258,-1929502515,1380000288,472654420,1828717544,-1962852332,679739168,304882763,539562540,1663181031,550314018,572558590,1414680397,1162297671,-400806878,345374723,545980737,1260946431,739388452,-417322734,576987680,-31404768]},{"sector":5,"length":512,"data":[-1408454145,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1919896864,1734436724,215941221,546243510,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,3225657,62917905,1766596751,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,221577293,546243530,1752462657,757101167,1701594912,1394634350,1918989684,1631854708,1667851378,222756971,546767823,977749331,253794336,1125482,64228697,1347240275,609437004,1330520807,224591906,545850334,258574,65539446,1347240275,609437004,1163469543,-1560272301,-922488307,-935666400,304877856,253804346,739322895,547371537,-1069930481,371247674,974327596,1226973329,2248002,66850246,739778762,288099343,572559674,1936876880,1818324591,1836008224,1702131056,-218094990,-1090255347,738856736,550124049,439093775,-1858465492,680984352,-383134449,353315030,701304620,680984553,2734095,68161064,185540810,288102956,-14642886,-1290852202,539158825,538976288,1380928800,1195460436,538976325,538976288,-1761613534,699600680,437145088,253807108,739912716,546388497,254318335,-689362509,739577640,-383180785,254318335,-2097141325,-905698290,739053344,974203930,-1761664879,699600680,538977001,1700143136,1869181810,774971502,538980400,572530720,680984553,2732815,70127273]},{"sector":6,"length":512,"data":[235872458,288102956,-14642886,-737204074,685173033,254547215,-1496627,-1106302826,249364521,549389368,288100111,253807162,739781649,546388497,692267042,1886339872,1734963833,1226863720,1126190402,544240239,825768241,252772386,549389378,288099855,253807162,739781655,546388497,1701990434,1931506547,1701011824,1918984736,544175136,1953394531,1702194793,254214178,545981516,-420994850,539107872,545857741,281614,72748852,608456003,-568269024,1611615488,1126206212,539247693,539107559,550314018,2114855049,258473988,545981546,608456003,-1761614048,689639208,-1994339040,79302176,1947169280,237013252,-1778383786,-1090224625,739184416,985676305,978329775,1296113798,676614735,738325532,-935712493,-1577053920,-1761312241,1195725600,-838856217,-1962638577,-1744885728,68160552,552476713,687878156,806151912,550313984,1397509955,337700640,237013306,-570424186,-1610316785,978325280,1397509955,-402646553,-1761311217,1195725600,-2012220928,237014276,134218968,-1962634736,680918816,-416734135,-853533937,79302176,-1676663552,-14644476,608774275,304878124,841148201,550314018,-636608375,272760839,545981606,1227391999,739388452,585574674,-853532111,237013280,1275069906,-1996181488,76025376,-1173328896,1394641668,1280331073,539251525,572581608,575882585,-1994339040,79957536,-1089437440,546110980,1296126754,1397050448,-400806878,277544963,546112708]},{"sector":7,"length":512,"data":[376334,80613521,279576705,546243800,1095573549,1327517257,1330205776,1162682446,-721398450,-1090199024,739184416,985676305,739319999,546388504,1330454562,1095193682,1092633927,1498169678,542329171,284491810,549389548,288100111,337693242,-1858465236,1347363360,1313818964,539828307,287244322,546374902,757084450,1380928800,1195460436,1095770181,1313164633,1329799252,1380012109,1313821513,2236499,83890497,841097361,1293954336,1196708431,541411137,1380928833,1096436052,1313818964,290979874,546374922,1129530658,1497713440,1159736608,575949144,336683520,572559621,-1929371104,-1861935599,1347363360,1313818964,1297436192,542262594,841756968,1380917292,1129530656,1027416105,1044200765,297336866,546374952,1414483490,1344289349,1397966162,1162368032,1414415648,1260409413,1461737797,542000456,1162760004,297992226,546374962,2236450,87822798,252649663,-285208276,-1861925359,680984352,-383133169,621750486,680984364,690603023,680984553,2735887,89133611,-1761664879,699600680,538977001,1414680397,1162297671,1497452576,1414415693,1297040160,1230127440,1397641043,538976288,572530720,680984553,2732815,89789031,-1761664879,699600680,538977001,539828256,541414229,1397311572,1414549280,542003017,1126190932,1095781711,538985810,572530720,680984553,2732815,90444451,-1761664879,699600680,538977001,538976288,541411412,1414418253,542723144]},{"sector":8,"length":512,"data":[1297695056,1398033989,541478688,538976288,572530720,680984553,2732815,91099871,-1761664879,699600680,538977001,538976288,1414680397,1162297671,1413554259,1380013600,1398099785,1413567008,538989381,572530720,680984553,2732815,91755291,-1761664879,699600680,538977001,538976288,541347393,1313428048,1095780675,1296113740,1414419791,538979923,538976288,572530720,680984553,2732815,92410711,-1761664879,699600680,538977001,1414680397,1162297671,1330463008,1514755154,1330205761,538976334,538976288,538976288,572530720,680984553,2732815,93066131,-1761664879,699600680,538977001,539828256,541414229,1397311572,1414549280,542003017,1126190932,1430473793,1163149644,572530720,680984553,2732815,93721551,-1761664879,699600680,538977001,538976288,541411412,1313428048,1095780675,1312890956,1313415236,1163019604,538989651,572530720,680984553,2732815,94376971,-1761664879,699600680,538977001,538976288,1145651536,1163284256,1312890962,842080345,1313819936,1344292948,1330205253,572534340,680984553,2732815,95032364,-1761664879,700452648,254334697,-1761661915,700714792,-1761613527,702091048,-1273738752,287358725,-902162388,254548256,546388517,975314978,739844298,1811948815,1225110804,987686692,608772235,539108071,-1257365299,-1590026235,1226871072,-1908786396,-1105954048,253804293,974203919,8469184,96998586,-417315248,-347717344]}]],[[{"sector":1,"length":512,"data":[-330935768,7976,0,686457088,31,0,673770625,31,0,1179838849,1179577641,690563369,-687829446,-1895443948,1830825248,1735684719,543516513,1886220131,1936290401,7564911,98309396,252649663,-1069936340,287358778,-1858463700,1293951520,1196708431,541411137,1297695056,542395973,1347243843,1397314113,1344294479,1380405074,572542273,-434821632,253807109,974269450,252649663,1191186732,-1861881835,680984352,-383133169,621750486,680984364,690603023,680984553,2735887,100275587,-1761664879,699600680,538977001,1414680397,1162297671,1497452576,1414415693,1297040160,1230127440,1397641043,538976288,572530720,680984553,2732815,100931007,-1761664879,699600680,538977001,539828256,541414229,1397311572,1414549280,542003017,1126190932,1095781711,538985810,572530720,680984553,2732815,101586427,-1761664879,699600680,538977001,538976288,541411412,1414418253,542723144,1297695056,1398033989,541478688,538976288,572530720,680984553,2732815,102241847,-1761664879,699600680,538977001,538976288,1414680397,1162297671,1413554259,1380013600,1398099785,1413567008,538989381,572530720,680984553,2732815,102897267,-1761664879,699600680,538977001,538976288,541347393,1313428048,1095780675,1296113740,1414419791,538979923,538976288,572530720,680984553,2732815,103552687,-1761664879,699600680,538977001,538976288]},{"sector":2,"length":512,"data":[538976288,538976288,538976288,538976288,538976288,538976288,538976288,572530720,680984553,2732815,104208107,-1761664879,699600680,538977001,1163153230,1330913338,1279611680,542393157,1096163393,541414732,1092637263,1314213709,572530772,680984553,2732815,104863527,-1761664879,699600680,538977001,538976288,1163152965,1213472850,1346445381,1347375696,1413564754,1096163397,541414732,572530720,680984553,2732815,105518947,-1761664879,699600680,538977001,538976288,541347393,1397051984,1213472851,1313153093,542262612,777602379,538976288,572530720,680984553,2732815,106174340,-1761664879,700452648,254334697,-1761661915,700714792,-1761613527,702091048,1578612736,337693190,-1338371540,572556576,1163152965,1094852690,1293960531,1196708431,541411137,1431260481,1025528910,540949821,608254754,1746393088,-417316602,680853280,975774785,541139083,287369192,-1994339040,104861216,1914169088,1313423622,552017987,512028,108795897,739582154,546388498,690360274,404357179,550110854,974269462,673325201,1330913329,540357408,1129465168,693390917,1325415202,-905539560,304878880,-2061455302,1313153568,542262612,1163084098,1414416672,1397051973,1095901268,1025525076,1027423549,992092222,2380361,110762103,-417312183,680853280,690246217,1226869562,588244562,1226895136,538110034,545857741,424974,111417494,552018002,485249609,1379534000]},{"sector":3,"length":512,"data":[541281865,169681127,-327670825,-1476391921,-905531880,304879136,-769617606,992552463,-1206335744,388024838,-1858465236,824713760,542069792,1495282995,1397899589,3875369,113383675,739647690,548420114,1159864453,1380275278,1297436192,542262594,1495287375,1397899589,542001440,541545549,572538429,2382139,114039050,552018009,1495831807,419440932,1309070873,1495328544,253815584,421789708,1179518688,1310779168,-367443968,1310755590,-1541609914,552542209,317212238,-1994339040,112070176,-199670272,2063646726,-1090060775,405541152,572559674,1313819936,1498171476,1380928800,1195460436,1095770181,1313164633,1329799252,1380012109,1313821513,2236499,117971377,252649663,-902164180,254546976,546388490,585704537,1095063853,1330454610,1095193682,1277183303,541999439,1431260481,575886414,432799803,550110994,974334998,1377968273,1397052481,-1086702814,405541152,471457536,1226867207,287368992,1126222880,5459023,119937544,739582154,-347477734,546388505,975771858,739582154,-347477734,546388505,-347477695,1129204033,807014400,1226867463,974790912,1226867207,287368992,253807648,440074254,550111044,743041303,546388498,975771858,-384360246,1256521,122559085,550969489,774054690,992092963,673744383,686379560,1230170953,690570062,1610620395,-383151766,29,267135360,443875428,545458008,444596297,549390178,288100111,1813680384,1226867207]},{"sector":4,"length":512,"data":[287368992,253807648,447610894,1179780982,1377888032,1391151593,977489481,317146689,237014330,-1056963128,-2113437670,-417314272,-870313696,1280262944,451870803,542115722,1179656423,-381605653,1229056842,975782734,552018000,673744383,203286864,695804887,694423531,6557676,126819116,-430956405,539430940,550117581,304879119,572559674,1297695056,1398033989,1330598944,1380011040,1411401031,1229201487,1095520339,-1992678823,129764896,-1810150144,388024839,439110121,434850537,-685731526,589505056,590226211,1346052643,458555451,545458078,459079754,545458088,459735113,546375602,2236450,129768332,1344413841,1397966162,1095783200,1109411139,1411404353,1329799247,1313428558,992101717,-971267328,-568292601,552003616,539107362,545857741,509454,131079085,-2012340087,466288644,546244570,1869422637,1634169970,1629513063,1953656685,1952545385,7237481,132389845,739778751,467337233,12584942,133700581,739319999,468647960,550111234,1190930,135011351,539107473,1414680397,1162297671,1330463008,1514755154,1330205761,1380982862,1095911247,2236493,135666729,168763594,-1086713300,739184416,474611729,546375712,254318335,-689362470,740626216,254318335,-383178300,254318335,-2046809665,-1861735908,680984352,-383143153,1293951010,1196708431,541411137,1380928833,1096436052,1313818964,538976288,538976288,538976288,-383639520,254318335,-1040176717]},{"sector":5,"length":512,"data":[-1861733348,680984352,-383143153,538976290,1428172064,1411401043,542329160,1230262351,1411403343,1094918223,1280656204,541414465,-383639520,254318335,-33543757,-1861730788,680984352,-383143153,538976290,1411391520,1344292168,1129204050,1279348809,1145979168,1414416672,1397051973,538976340,-383639520,254318335,973089203,-1861728227,680984352,-383143153,538976290,1344282656,541346113,1380275791,1498300704,540160288,1414418253,1162879048,1146046802,-383639506,254318335,1979722163,-1861725667,680984352,-383143153,538976290,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,-383639520,254318335,-1308612173,-1861723107,680984352,-383143153,1310728226,977622095,542069792,1162626387,1092637763,1279350304,1327514965,1296113746,1414419791,-383639520,254318335,-301979213,-1861720547,680984352,-383143153,538976290,1159733280,1380275278,1162368032,1347436832,1380994898,1163149641,1279350304,538985813,-383639520,254318335,704653747,-1861717986,680984352,-383143153,538976290,1092624416,1344291918,1397966162,1162368032,1414415648,1260409413,539908421,538976288,-383639520,254318335,1258301875,-1861715426,680984352,-383139825,621750486,680984364,690603023,680984553,2742543,142876245,739516618,511574034,548407438,1159864453,1380275278,1380928800,1195460436,1296113733,1414419791,1027423520,992092222,-1912593343,1091082270,552017990]},{"sector":6,"length":512,"data":[1093178623,-1744819932,-905403874,304878880,-1407268864,572559624,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,992092192,-1239494144,371247624,-318762452,-1861697506,824713760,542069792,1344288051,1162039877,573133902,519503931,550111434,1190933,148119329,545595568,1414415650,1226854981,1380275278,542397253,1163149650,1027423520,540949821,1380530978,523370532,1380518110,-14620896,1380526228,1174415652,-1962350561,-430814944,-853531889,237013280,1493174434,-1962348001,-397260512,550314002,-1576132471,526974984,1179781372,1226893088,-1340281774,527630340,550111494,1190934,152051619,539107473,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,3875360,152706989,739713226,533069842,546375972,540092450,857755476,1163468853,693326401,-805291230,-905368033,304879136,941619456,-2061455351,1313153568,542262612,1112364366,1327518277,1163468870,542331457,1044200765,1497047584,537395236,542705986,-1795219225,690247976,1277171712,541478409,542712039,202318059,1444949248,1310755593,-1541609914,550313985,101589129,541065225,545982816,317212238,-1994339040,151391776,1780500992,237014281,1744831944,1342796832,552017990,673744383,501827152,2032391948,1678764841,1678765097,2116062720,572559625,1414418253,542723144,1297695056,1398033989,1163018528,1027423520]},{"sector":7,"length":512,"data":[992099901,-1728035248,-1089895648,739708704,549060625,546376072,1279345442,1095521603,1196312916,1330463008,1514755154,1330205761,-989846962,-1089893088,739184416,551092241,545982866,266749518,550314020,-1509023607,552534025,545393052,552017993,550248466,973334556,4792451,161882371,1380928833,739321940,-417322734,4604192,162537748,541663362,538058983,1179525324,-1172224256,1330462985,1227379794,539562796,-2046877465,1296115752,676614735,739437129,1391143186,203286854,695804887,694423531,6557676,163848563,1380928833,742991956,-417322734,1330463008,1227379794,304878314,1179707945,1330463209,1227379794,2691884,164503931,4792451,165159326,541663362,538452199,420421836,1226885690,-1858465236,655348256,-2093335767,-1476376288,-905321951,304880160,-333332736,572559625,824192288,575624224,680787945,2704974,167125473,539107473,540024877,1159745364,1092633678,1414680397,1413569097,575557449,569049147,550111744,1190936,168436242,1159864465,1380275278,1195721248,1229868617,1344292686,1162697025,1310741582,1161973077,1073750610,-1341516766,572556576,824198735,1330454578,541611086,1230128464,1025524815,1027423549,572538429,1380274235,608456521,505566208,-414953462,680853280,1230128464,690242639,673344000,1344310026,-420995004,-853536480,237013280,-2030040516,-1962266078,1380274208,608456521,552003616,539111458,545857741,655374]},{"sector":8,"length":512,"data":[171713178,1146101899,-853536281,237013280,-1375730552,-1962260958,-431730656,-853522866,237013280,-1056962048,-1962258398,-398176224,550314001,925833,583729162,550111834,1190936,174334678,265429137,-520083161,-1861587422,655348256,585826345,550111864,1190938,176300825,1344413841,1414417753,1230131232,1346978638,538987585,1414416672,1397051973,538976340,1279345184,1162038849,589692962,1230244492,-417311666,989860128,-2113235421,-417314528,541347872,1146101964,724969,177677135,-431415157,541478432,545857741,704014,178266988,1414416724,1411442464,542395977,1296113897,676614735,689122377,-1440514560,-685731574,589505056,992092195,-1207944375,-1861569501,572577568,589504544,589505315,572728110,-364490693,1380928833,742991956,1094396179,1414680397,321669416,1296120617,676614735,689056841,-1104953344,1226867466,-937178624,572559626,-318758368,-1861561821,1313415712,1163019604,1176523859,824201807,1162879026,1146046802,574431315,604438587,546376412,589439191,589505315,589508131,1413161504,5525065,182854674,420421834,922751532,-1861554140,1380983328,542331717,1128353875,1094852677,1330913362,1313817376,1431193940,3875397,184165441,741089482,609681425,545983236,-420994850,539107872,545857741,721934,185476196,608456003,-568269024,405044480,1126206219,539247693,539107559,550314018,-670162807,613941257,545983266,608456003]}]],[[{"sector":1,"length":512,"data":[-1761614048,689639208,-1994339040,79302176,740598272,237013259,2830,1092229632,1330913362,1313817376,1431193940,3875397,184165441,741089482,609681425,545983236,-420994850,539107872,545857741,721934,185476196,608456003,-568269024,405044480,1126206219,539247693,539107559,550314018,-670162807,613941257,545983266,608456003,1397051973,538976340,1279345184,1162038849,589692962,1230244492,-417311666,989860128,-2113235421,-417314528,541347872,1146101964,724969,177677135,-431415157,541478432,545857741,704014,178266988,1414416724,1411442464,542395977,1296113897,676614735,689122377,-1440514560,-685731574,589505056,992092195,-1207944375,-1861569501,572577568,589504544,589505315,572728110,-364490693,1380928833,742991956,1094396179,1414680397,321669416,1296120617,676614735,689056841,-1104953344,1226867466,-937178624,572559626,-318758368,-1861561821,1313415712,1163019604,1176523859,824201807,1162879026,1146046802,574431315,604438587,546376412,589439191,589505315,589508131,1413161504,5525065,182854674,420421834,922751532,-1861554140,1380983328,542331717,1128353875,1094852677,1330913362,1313817376,1431193940,3875397,184165441,741089482,609681425,545983236,-420994850,539107872,545857741,721934,185476196,608456003,-568269024,405044480,1126206219,539247693,539107559,550314018,-670162807,613941257,545983266,608456003]},{"sector":2,"length":512,"data":[-1408454145,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1819231008,1633841775,215941234,546243510,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,3225657,62917905,1766596751,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,221577293,546243530,1752462657,757101167,1701594912,1394634350,1918989684,1631854708,1667851378,222756971,546767823,977749331,253794336,1125482,64228696,1347240275,-417053364,575622690,-569548288,237013251,1946158066,1392764941,1280331073,585573445,575882585,-233988352,-585053949,287361082,-1086713300,739184416,547371537,-1069930481,371247674,974327596,1226973329,2248002,66850242,739778762,288099343,572559674,1936876880,1818324591,1836008224,1702131056,-285203854,-1090255347,738856736,550124049,439093775,-1858465492,680984352,-383134449,353315030,701304620,680984553,2734095,68161060,185540810,288102956,-14642886,-1290852202,539158825,538976288,1329799200,1112690508,538989121,538976288,-1761613534,699600680,437144064,253807108,739912716,546388497,254318335,-689362509,739577640,-383180785,254318335,2130717107,-905698290,739053344,974203930,-1761664879,699600680,538977001,1700143136,1869181810,774971502,538980400,572530720,680984553,2732815,70127269,235872458]},{"sector":3,"length":512,"pattern":538976288,"data":[288102956,-14642886,-737204074,685173033,254547215,-1496627,-1106302826,249102377,549389368,288100111,253807162,739781649,546388497,692267042,1886339872,1734963833,1226863720,1126190402,544240239,825768241,252510242,549389378,288099855,253807162,739781655,546388497,1701990434,1931506547,1701011824,1918984736,544175136,1953394531,1702194793,253952034,545981516,-420994850,539107872,545857741,281614,72748848,608456003,-568269024,1611614464,1126206212,539247693,539107559,550314018,2114855049,258277380,545981546,608456003,-14620896,453978262,550314025,-770826103,258932741,545850484,284174,75370363,739778751,12597777,76025731,14491849,76681101,739320008,261488658,547357852,-1610602481,-1090214385,288100640,-1341151744,-1241464828,-2113619441,-417314528,-870313696,-989849568,-2113616881,333924896,253807648,265486347,550110414,-347526070,1239318,81268725,742990015,546388553,254318335,-12899877,-619763562,-1761658071,702222120,268238907,545457378,268763210,545457388,269484105,550110454,304876559,1055488,253804293,1125391,84545612,1646403729,538995564,1702194274,1852991264,2036539424,1914728033,538993765,543646061,1852989984,1768453920,992109940,336615168,253807109,1190925,85856354,252649663,-1828712148,-1861933040,538976800]},{"sector":4,"length":512,"data":[538976288,538976288,3875360,87167139,541663362,537993447,1581260,87822515,-414572414,-870314481,1445664,88477889,743055562,-384373943,283574290,549389648,739895625,974776649,-1761664879,702222120,680984379,992598799,254318335,3877339,89788655,4857987,90444023,4792451,91099394,386867402,218108460,-1090160623,739184416,289210385,546375042,1918985250,1735139435,1814066280,544499815,1952999276,1751608352,1735139444,2032170088,538995813,578055785,290062395,550110604,304879631,1426067756,-1090152943,739184416,293994513,546375072,1701996322,1818370169,1730176373,538996338,1851881827,1684369952,1634541600,538976359,1998594080,1702127976,-1879033054,-905598447,304878112,-1273909504,572559621,1936028240,1397039219,1701519427,1869881465,1769497888,3875444,96342470,-388095861,680984550,-852944113,237013280,-738196034,973457425,1162140047,1163150668,-770581504,287361029,-602806784,404799237,-335539924,-1073355247,-267250944,1394641669,1280331073,585573445,575882585,-31404768,1394745484,1280331073,740447045,256028,437911552,1936028240,1397039219,1701519427,1869881465,1769497888,3875444,96342470,-388095861,680984550,-852944113,237013280,-738196034,973457425,1162140047,1163150668,-770581504,287361029,-602806784,404799237,-335539924,-1073355247,-267250944,1394641669,1280331073,585573445,575882585,-31404768,1394745484]},{"sector":5,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1277307954,1967333473,1634885987,543254627,1699553325,1633905016,1866866798,1394633580,577203823,808651277,1142960180,541152321,824980020,824979500,741487660,741354545,842279985,808202540,875311404,741420087,741682224,824979765,858533932,741487660,741354545,842279985,808202540,168636716,808792115,1413563424,842276929,808202540,875311404,741420087,741682224,824979765,892088364,741356332,741354545,808660017,808202540,858534188,741420085,741551152,824981300,824979500,808651277,1142960182,541152321,824981300,824979500,741749804,741354545,909388849,808202540,875311404,741420084,741420080,824980532,824979500,741487660,741354552,842279986,808202540,168636716,808923187,1413563424,842276929,808202540,875311404,741420082,741420080,824981044,892088364,741946412,741354545,842279987,808202540,875311404,741420082,741420080,824980020,824979500,808651277,1142960184,541152321,824981044]},{"sector":6,"length":512,"data":[892088364,741946412,741354545,926100533,808202540,858534188,741420087,741420080,824979507,858533932,741618988,909454386,892088876,741485620,841757237,808651277,1142960185,541152321,841756981,741946412,926166066,168638508,808464691,1413563424,825040961,221326636,824973834,824979500,808651277,1142960184,541152321,824981044,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1277307954,1967333473,1634885987,543254627,1699553325,1633905016,1866866798,1394633580,577203823,808651277,1142960180,541152321,824980020,824979500,741487660,741354545,842279985,808202540,875311404,741420087,741682224,824979765,858533932,741487660,741354545,842279985,808202540,168636716,808792115,1413563424,842276929,808202540,875311404,741420087,741682224,824979765,892088364,741356332,741354545,808660017,808202540,858534188,741420085,741551152,824981300,824979500,808651277,1142960182,541152321,824981300,824979500,741749804,741354545,909388849,808202540,875311404,741420084,741420080,824980532,824979500,741487660,741354552,842279986,808202540,168636716,808923187,1413563424,842276929,808202540,875311404,741420082,741420080,824981044,892088364,741946412,741354545,842279987,808202540,875311404,741420082,741420080,824980020,824979500,808651277,1142960184,541152321,824981044]},{"sector":7,"length":512,"data":[-1408454145,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1818313504,1633971813,215941234,546243510,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,3225657,62917905,1766596751,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,220397645,546767823,977749331,253794336,1125482,64228661,1347240275,609437004,1330520807,222232610,545850334,258574,65539412,1347240275,609437004,572581664,575882585,-233996032,-585053949,287361082,-1086713300,739184416,974203921,672080032,-902119366,254547488,546388499,1296189730,228851746,550110204,202320920,-1858465492,1699750432,1852797810,1126198369,1970302319,577922420,101568768,253804292,974203914,168763594,288102956,-14642886,-720426858,685173033,254547215,-1496627,-1206966122,235274281,550110224,439094031,-1858465492,680984352,-383143153,538976290,1126178848,1313164353,542261572,538976288,-383639520,254318335,738208179,-905700850,738987808,974203930,-1761664879,699600680,254334697,537865237,-1761613527,699600680,604922112,253807108,739912717,546388497,254318335,585705907,538976288,1936876886,544108393,808463921,538976288,-1498592,-1290852202,243728425,550110254,439094799,-1858465492,680984352,-383134705,353315030,701304620,680984553,2735631]},{"sector":8,"length":512,"data":[70782651,252649663,-902164180,739315488,974203928,673325201,1126181187,1920561263,1952999273,1296189728,1919894304,959520880,2240824,71438063,235872447,-902164180,739708704,974203928,1344413841,1936942450,1634759456,1646290275,1948283489,1868767343,1852404846,2254197,72093445,551428235,572581608,550314018,1275994249,252837892,1296237654,-417323964,721477152,-1962647537,1145914144,552017956,539107362,545857741,294414,74059591,1296244875,-417323964,680984352,539564815,545857741,586254,74714961,1443766409,257818628,549389438,288100111,-1946107846,-2046523377,673467680,740889359,1414418253,321397832,689114924,1095650604,673465677,740887567,1398358340,688656168,-1508916736,1095650564,673465677,-417322734,1243619872,1096109633,572545362,1293957664,1162690894,689121316,572581664,1380074822,1498562901,-134208992,1292155407,1162690894,689186852,572581664,1095573536,541606738,975184416,1095650592,673465677,-417322731,538976800,1230131265,572530764,-837800448,1095650564,673465677,-417322730,538976800,1497451808,572530720,1293957664,1162690894,689383460,572581664,1430921248,538985806,1677730336,1292165648,1162690894,689448996,572581664,1430921248,538990924,975184416,1095650592,673465677,-417322727,1092624928,1398097749,572530772,-166684160,1095650564,673465677,-417322726,1163076128,1296389200,575817026,1293957664,1162690894]}]],[[{"sector":1,"length":512,"data":[168765476,572581673,1413697312,1380270671,-805297632,1292175888,1162690894,185542692,572581673,1448037920,1161973061,975184466,1095650592,673465677,-416740337,1162093088,1112360259,572543557,672208384,1497449477,539500627,-417322734,538906400,1094983738,673207129,539562784,470753511,1142962720,542333249,689184808,253814560,540680223,1398358340,354428960,552017961,1543511567,1141193745,542333249,689315880,253814560,540680223,1398358340,387983392,552017961,975183375,1497449504,539500627,-417322728,538906400,1094983738,673207129,539564320,521085159,1343332864,1497449477,539500627,-417322726,538840864,1094983738,673207129,539560463,521085159,1142962720,542333249,688590632,253814560,540680222,1398358340,202319904,552017961,-1308614897,-2046467055,1095063840,254301010,-134207212,1493528081,1397899589,304097312,552017961,540680213,1380009305,539500627,-417322733,975181344,1095063840,673207122,539563040,538386663,1163468858,542331457,689250344,287368992,-2112733696,1095063813,673207122,539563552,538124519,1163468858,542331457,689381416,337700640,1495284256,1397899589,404760608,552017961,540680213,1380009305,539500627,-417322727,1358960160,1493538322,1397899589,438315040,552017961,309133329,609027488,539562536,-1761664793,700452648,254334697,-804312029,313786409,609486250,572581664,538976288,-1761613534,701108008,1293957664]},{"sector":2,"length":512,"data":[689121316,680984551,-383137265,1424565332,609544484,-383494935,1424565332,609544484,673467706,1306994964,689121316,-938283008,539251717,685121767,-804312043,-1761613527,702156584,1293957664,689252388,680984551,-383137265,1424565332,609544484,-383494935,1424565332,609544484,-602729216,1226867205,371255072,253807648,609040915,539576616,609034471,350898472,545471017,320798793,550110711,1190932,100143926,1159864465,1380275278,1411395616,1313153103,1358963268,-1861879533,1213473312,1380982853,1095911247,975318605,739385546,326828050,548406778,1159864453,1380275278,1095063840,824713298,758200377,959985969,1027416105,992092222,2380377,100930457,1381572747,807593764,538976290,539020576,538976288,-233955191,330760200,545981966,-417050023,943272226,-853532111,-414033632,545864210,442894,102241237,1381572747,824370980,573716537,1495321888,974382930,-1039261559,334692358,545981986,-417050023,943272226,-853532109,-414033632,545864212,442894,103552017,1381572747,824370980,573847609,1495321888,974514002,-1039261559,338624518,545982006,-417050023,943272226,-853532107,-414033632,545864214,442894,104862797,1381572747,824370980,573978681,1495321888,974645074,-1039261559,342556678,545982026,-417050023,943272226,-853532105,-414033632,545864216,442894,106173577,1381572747,824370980,574109753,1495321888,974776146,-1039261559]},{"sector":3,"length":512,"data":[346488838,545982046,-417050023,943272226,-853532103,-414033632,545864218,442894,107484336,572661905,1913966080,572559622,1380009305,1398099232,1161961556,1310736672,1161973077,-385867182,-1861845996,1380327968,824200527,540096569,824201044,775501881,351404066,546375302,151003682,-1861840875,1313153568,542262612,1330913328,1145980192,354287650,546375322,1162368034,1330794528,1296126535,654320174,-1861835755,2236960,112071984,572661905,-1206568448,237013254,1275069946,1493615125,1495328544,1397899589,693262632,-871012352,1495304966,552018002,537378844,1094983885,321409881,487581481,-703233024,1495304966,552018002,537379868,1094983885,321409881,487581481,-367686400,572559622,364380194,546375412,1397706786,1330205769,1095770190,542262608,541347393,1397051984,1347625043,541410113,575816002,-32121088,572559622,1313163351,1162368032,1296189728,1380274208,1095651155,1329799244,1414877261,2249285,117970424,1344413841,1414416722,1226854981,1163010131,576275521,303431936,572559623,369754146,546375452,536879650,-1962465770,-400499168,572661990,-1994339040,119934496,806759680,1145914119,552017956,373686494,545982266,608456003,572581664,-853532128,237013280,1644169048,-1962458090,1145914144,552017956,254318335,-853530341,237013280,1811941618,-1996009962,120589856,1477876992,572559623,1313428048,1196312916,1279345440,1094995525,1329995858]},{"sector":4,"length":512,"data":[1213472850,1163468869,539775553,1381579554,740440868,381681698,546375522,1163022370,1411404627,1159742792,1260405587,1411406149,1480925263,573461577,1813434368,1344307719,287368992,320916512,1981210112,-14639865,252651670,285227817,-1660452841,538976800,538976288,1126703136,1329799209,1230133584,542394439,541934153,1347571523,1413567055,542003017,825768241,387907618,547161994,254318335,3877138,127145787,1263739010,317149257,304139296,572693818,1394639674,5261643,127801175,-1761664867,688787240,680984379,992549647,254318335,3877189,128456582,539107485,1411391520,1226851656,1344294210,1330860613,541868366,1347243843,1380275285,1279345440,1094995525,-1577049518,-1660440041,680984352,992546319,254318335,-12900069,1158621334,-1006617815,-1660437481,538976800,538976288,538976288,538976288,538976288,-1139000542,1381624071,-971513856,1394639367,-414168757,550248466,580729363,545471010,1346980691,-803733504,1293976071,673244960,-347018990,-870307563,-384554976,689302352,320917280,-635954176,1394639367,-414168757,550248466,580729363,545471010,1346980691,-468174848,-14639865,235874454,-1761658071,689639208,680984379,992560399,-300389632,572562695,538976288,572530720,1095650619,673465677,574302541,538976288,538976288,992092192,1296125517,1294476357,2691817,133699712,-1761664867,689639208,680984379,992560655,35164416,1226867208]},{"sector":5,"length":512,"data":[304146208,253807648,413728787,1330448396,608719950,1227625000,552017961,1227367501,415301673,1330448406,608719950,1227625256,552017961,1227367501,415825961,545458208,417661001,545392682,1346980691,-870313241,-1657138656,-2093342174,1229673248,419102800,545392692,552017994,550248466,1398358340,2706728,138287393,552017995,1256806696,539562730,974659827,552017996,673744383,-364189351,418130194,424607785,-2080438200,1313819944,673466452,-384619502,689236812,1273565996,539563755,-2080431897,680787752,321661258,2691884,139598167,4857987,140253557,552018009,686381352,1398358340,539577640,689447155,552804393,428671000,545392742,552017994,550248466,1398358340,317279528,431161385,541788272,1495802087,317344489,552804393,541866520,-2046877465,-380032984,689105482,2693356,142219745,1294500863,1213484623,739452964,-347281133,321661204,384519145,552017961,-14121985,692725907,321655596,434700329,545458308,436797514,542705806,1495802087,1094985961,1294488409,539562729,689447155,552804393,442499096,547162264,538976290,1394614304,538988117,542003021,1163220000,1163337760,1411391556,538989896,541676102,1413567264,538976288,1431511072,1293951054,538988111,541414740,1145394976,1213472800,1176510549,538986834,575947091,-1575315456,1226867208,304146208,253807648,547174931,538976290,1295720992,1213484623,739387428,574302537]},{"sector":6,"length":512,"data":[572530720,1313819963,673466452,692661267,-1239764736,-568292600,-14620896,453978262,550314025,-233955191,448331784,545458368,450560073,545392842,1346980691,-870313241,-1657137888,-2093342174,1229673248,540680272,5054595,148773629,1263739010,317149257,354470944,572693818,1394639674,542132555,545464378,455540816,545982706,1347240275,609437004,572581664,575882585,-31404768,1394745484,1280331073,740447045,256028,150739767,974201032,739778751,12597777,437911552,545392842,1346980691,-870313241,-1657137888,-2093342174,1229673248,540680272,5054595,148773629,1263739010,317149257,354470944,572693818,1394639674,542132555,545464378,455540816,545982706,1347240275,317279528,431161385,541788272,1495802087,317344489,552804393,541866520,-2046877465,-380032984,689105482,2693356,142219745,1294500863,1213484623,739452964,-347281133,321661204,384519145,552017961,-14121985,692725907,321655596,434700329,545458308,436797514,542705806,1495802087,1094985961,1294488409,539562729,689447155,552804393,442499096,547162264,538976290,1394614304,538988117,542003021,1163220000,1163337760,1411391556,538989896,541676102,1413567264,538976288,1431511072,1293951054,538988111,541414740,1145394976,1213472800,1176510549,538986834,575947091,-1575315456,1226867208,304146208,253807648,547174931,538976290,1295720992,1213484623,739387428,574302537]},{"sector":7,"length":512,"data":[-1408382977,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1937067296,-184523927,-1895582195,1919243808,1852795251,808333600,1126703152,1886339881,1734963833,1226863720,1126190402,544240239,825768241,-1072814336,1277202179,1852138345,543450483,1702125901,1818323314,1344285984,1919381362,1344302433,1701867378,544830578,1226860143,956321090,-1761358066,1195725600,546840634,288123407,-737260288,1296126723,1397050448,552017956,575622690,-569485568,237013251,1811940338,1392764942,1280331073,539251525,1495408871,2249541,66195097,987570377,739320008,549403154,288100111,-1606807252,975703840,550124224,319761430,572559674,575488585,-66143232,404802051,738987820,546388497,1919242274,1634627443,1866670188,1953853549,2257509,67505897,168763583,-902164180,738856736,974203930,-1761664879,701828904,254334697,-854643691,-1761613527,699928360,269426176,253807108,739912715,546388497,254318335,585705907,538976288,538976288,1230198093,538976323,538976288,-1498592,-1290852202,256114729,550110234,439094287,-1858465492,680984352,-383143153,353315030,689966892,680984553,2732815,69472121,219095242,288102956,-14642886,-1290852202,539158825,1444945952,1769173605,824209007,540028974,538976288,-1761613534,699600680,772775680,253807108,739912718,546388497,254318335,-689362476,739577640,-383136497,254318335,-754964034]},{"sector":8,"length":512,"data":[-1090242545,739184416,550124049,405541135,-1858465492,1126703648,1866670121,1769109872,544499815,541934153,1886547779,943272224,117449265,-1090239984,739118880,550124049,405542671,-1858465492,1917854240,544437093,1667330163,1633820773,1869881458,1852793632,1970170228,486548069,-1962652656,-400499168,572661990,-1994339040,72093216,1443899904,1145914116,552017956,272761054,545981536,608456003,572581664,550314018,1443766409,274595844,545981546,608456003,-14620896,453978262,550314025,974004361,276299783,545981556,608456003,552003616,539107362,545857741,284174,74780806,547823765,2081300617,278003716,-1812069258,1718428192,278659106,545850487,294158,75239590,2098077864,280231940,546636925,545857703,14,75370702,739320008,547371538,-1086707697,739184416,974269458,284885184,550110344,405540623,-1858465492,757080608,757935405,1931488557,1667591269,1852795252,757932147,757935405,671097389,-905670127,739249952,974203928,539107473,1095576897,541606738,1210926368,1380928853,759767072,1430995283,2244946,77336917,286204106,288102444,572559674,1395474976,1397899604,759570464,541545794,1243619360,1431061037,572530757,-1508802048,253807108,739781650,546388497,759373858,1414680390,1193287769,1347375149,538976288,1129524555,1397050433,296943650,550110375,405541647,-1858465492,1142956576,1413564461,538976288,1094987080]}]],[[{"sector":1,"length":512,"data":[542721102,1129530656,1497713440,1230521645,-1107287468,-1090211823,739184416,299302929,545391802,538044233,252649676,1243644474,-870313497,-100656864,-905657327,1256789536,1240012332,288101355,-14642886,-619763562,-1761658071,702353192,302383163,545457358,545471050,304021577,545391832,538044233,202318028,1243644474,-870313497,1140856096,-1962614254,333924640,1226895136,-283109401,451365152,1226895136,537726951,545857741,325134,82580069,-384425782,-384226230,974383945,-1761664879,689966888,680984379,992599567,-166563584,1243644676,1226867514,1212160,1243644421,-870313497,-1426056672,-905639406,1256789280,-1086712532,288101664,-14642886,-586209130,-902153431,1256789280,975441708,252649663,-922742484,-1861938158,680984352,992599311,354467642,-1858465236,680984352,992599311,504549632,1243644677,672325888,354467589,-902163924,355210528,840105472,1226867205,-870313497,975179552,-1761664879,702222120,545471035,320012361,546374972,254318335,976955869,219095242,805311788,-2113583597,300370208,253807648,546388512,254318335,976955867,4792451,89133916,-1761664879,702353192,549403195,974662673,743252141,743386190,545667664,1477388365,676277289,2704911,89789326,-414637950,550248472,1295669263,539576616,488644839,-2045562061,-317511445,267129384,-316069620,401230120,545471017,329973833,545391972,538044233,974594252,692660301]},{"sector":2,"length":512,"data":[471918368,-2093318145,-1207940832,1325755923,539562280,1122535,91755484,655304783,974579497,672081999,974710569,688859215,974776105,705636431,1763113,92410884,722413647,168814377,254299962,266807596,676280843,-416731889,1329204495,690884392,921575,93066284,789522511,252700457,254299962,266807600,676280848,-416730865,1329205519,691146536,1183719,93721684,856631375,319809321,254299962,266807604,676280853,-416729841,1329206799,691408680,1511399,94377084,923740239,403695401,254299962,266807608,676280857,-416728817,1329208079,691670824,1839079,95032484,990849103,487581481,254299962,266807612,676280862,-416727793,1329209103,691932968,2101223,95687884,1057957967,554690345,254299962,266807616,676280867,-416726769,1329210383,692195112,2428903,96343284,1125066831,638576425,254299962,266807620,676280871,-416725745,1329211407,692457256,2756583,96998654,1577984137,352845830,545719762,4926538,98309415,608456003,-568269024,1126206266,-417053619,-853532126,237013280,1023411716,-1962547691,1145914144,-1761614044,689639208,-1910452960,-267040768,253794309,1125482,100275534,358613135,545981956,552017994,538972906,9314509,101586285,552018001,692725839,404064000,1243646726,541069286,-397795089,-853530865,237013280,-1107294666,-1962532331,371771424,-399945428,538972134,549396685,974662673]},{"sector":3,"length":512,"data":[185540810,-1858449108,680984352,992546319,253804346,974203919,906895497,366936070,549389868,288100111,404802106,-1858449108,680984352,992546319,287358778,452991020,-1006225898,1244155168,978005033,-414572405,552476689,538109771,545857741,973488142,1406766906,542132555,1415071054,1380927008,1096045344,1413563203,654331732,-1006224618,2147425312,1090523692,-1962524650,266750496,552542272,655353930,-1994339040,97652256,1242984960,-937391354,1361843752,552017961,-853532657,253804320,974203919,739778762,546388561,254318335,976955680,-770826103,378798085,549389908,288100111,253807162,978398219,-1761664879,702222120,545864251,381454,106829509,353312970,-1858464212,538976800,538976288,538976288,538976288,538976288,538976288,538976288,538976288,992092192,1746331904,253807110,974531605,1159864465,1380275278,1279611680,1230259013,1025527375,992099901,1914109696,-568292602,552003616,-853532126,237013280,469763698,1124498455,-417053619,545995486,608456003,539108071,545857741,424974,109451063,1296244875,-1629116,453978262,-853532631,237013280,1526728506,-1962504169,1145914144,1092806436,550314018,552019027,1380011298,572540995,237013306,2130708202,-1962503913,1145914144,1629677348,550314018,552019027,1380011298,572540995,237013306,-1560279318,-1962501609,1145914144,1109583652,550314018,552019027,1096045346,572543826,237013306]},{"sector":4,"length":512,"data":[-956299542,-1962501353,1145914144,1646454564,550314018,552019027,1096045346,572543826,237013306,-352319766,-1962499049,1145914144,1126360868,550314018,552019027,1380927010,572545364,237013306,251660010,-1962498792,1145914144,1663231780,550314018,552019027,1380927010,572545364,237013306,855639786,-1962496488,1145914144,1143138084,550314018,552019027,1413564450,572530720,237013306,1459619562,-1962496232,1145914144,1680008996,550314018,552019027,1413564450,572530720,237013306,2063599338,-1962493928,1145914144,1159915300,550314018,552019027,1297434658,572543567,237013306,-1627388182,-1962493672,1145914144,1696786212,550314018,552019027,1297434658,572543567,237013306,-1023408406,-1962491368,1145914144,1176692516,550314018,552019027,1196769826,572530720,237013306,-419428630,-1962491112,1145914144,1713563428,550314018,552019027,1196769826,572530720,237013306,184551146,-1962488807,1145914144,1193469732,550314018,552019027,1347375138,572530720,237013306,788530922,-1962488551,1145914144,1730340644,550314018,552019027,1347375138,572530720,237013306,1392510698,-1962486247,1145914144,1210246948,550314018,552019027,1312900130,572545348,237013306,1996490474,-1962485991,1145914144,1747117860,550314018,552019027,1312900130,572545348,237013306,-1694497046,-1962484967,1145914144,1227024164,550314018,552019027,1262572322,574706261,237013306,-1090517270,-1962484711]},{"sector":5,"length":512,"data":[1145914144,1763895076,550314018,552019027,1262572322,574706261,237013306,-486537494,-1962484455,1145914144,1243801380,550314018,552019027,1431061026,572530757,237013306,117442282,-1962484198,1145914144,1780672292,550314018,552019027,1431061026,572530757,237013306,721422058,-1962483430,1145914144,1260578596,550314018,552019027,1094931234,575882572,237013306,1325401834,-1962483174,1145914144,1797449508,550314018,552019027,1094931234,575882572,237013306,1493173994,-1996035814,107482656,-367362304,572559622,1127948832,992232525,992095522,-29744045,549265548,472654931,1093404404,-1996469172,-1945701350,1142982458,-31809792,1142983430,334161640,-1944007392,237013306,-1073740014,-2029582310,975459104,386867402,686363180,570425373,-1828722042,690246440,1305641,118299351,252649663,-1858464468,992236320,287358778,-520087508,-1928916454,97652256,471534080,-417049849,655304918,572531244,550124073,304879375,354467642,-1858465236,975459104,739319999,454295576,545851174,417294,120593178,457310337,545982266,1347240275,609437004,1163469543,-853532077,546111008,1296126754,1397050448,-400806878,458752003,549979972,974269457,739778751,974203921,8469184,196615045,1750343823,1112088677,1699749965,1852797810,1126198369,1970302319,544367988,1769174349,1666392163,1819045746,-1038372096,1444974347,1769173605,824209007,540028974,1126777640,1920561263]},{"sector":6,"length":512,"data":[1952999273,1296189728,1919894304,959520880,-452972232,-1895052261,1667845152,1702063717,1632444516,1769104756,757099617,1869762592,1835102823,1869762592,1953654128,1718558841,1296189728,-702802176,757105675,1176644658,1380273749,1293962305,1212371521,541478688,1095573569,1313818962,1163154501,1193291040,1330533711,1660953156,-2079596516,741815072,741354545,808660018,808202540,875312428,741551154,858534452,741422124,959654963,875311916,741551153,741551152,858534452,741618732,741354547,926100531,808202540,-1342164436,-2079593956,741356320,741354545,842279989,875311916,741551154,858534196,741946156,825502771,808203052,875311916,741551154,858534964,858533932,741815084,842279987,808203052,875311916,3353653,200547578,959717508,875312684,741551159,858535220,858533932,741946412,842345523,892089900,741551152,858536244,858533932,741553452,909454387,892089900,741551156,858534709,741356844,490995763,545524734,858536244,741815340,892611635,875311916,741551156,824979507,892088364,741487660,842279987,875311916,741551153,858536243,741422124,741354547,842279987,875311916,3353652,201858443,741351556,926100531,808202540,858534444,741420080,741682224,858534452,741487660,825502771,858534700,741551161,858534196,858533932,741487660,875834419,808203052,-788516052,-2079583715,741815072,892611635,808203052,875311916]},{"sector":7,"length":512,"data":[741551161,908866101,741356844,959720499,875311916,741551159,858535220,741553196,926166067,892089132,741551152,858534452,471727360,874546188,741551153,858534452,741618732,741354547,892611635,808202540,875311660,741944372,824980020,639502592,757105676,825044017,436207616,-2079583718,741815072,892611635,808203052,875311916,741354545,808660018,808202540,875312428,741551154,858534452,741422124,959654963,875311916,741551153,741551152,858534452,741618732,741354547,926100531,808202540,-1342164436,-2079593956,741356320,741354545,842279989,875311916,741551154,858534196,741946156,825502771,808203052,875311916,741551154,858534964,858533932,741815084,842279987,808203052,875311916,3353653,200547578,959717508,875312684,741551159,858535220,858533932,741946412,842345523,892089900,741551152,858536244,858533932,741553452,909454387,892089900,741551156,858534709,741356844,490995763,545524734,858536244,741815340,892611635,875311916,741551156,824979507,892088364,741487660,842279987,875311916,741551153,858536243,741422124,741354547,842279987,875311916,3353652,201858443,741351556,926100531,808202540,858534444,741420080,741682224,858534452,741487660,825502771,858534700,741551161,858534196,858533932,741487660,875834419,808203052,-788516052,-2079583715,741815072,892611635,808203052,875311916]},{"sector":8,"length":512,"data":[-1408382721,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1852785696,7955819,62262774,1700143247,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,237502513,546243520,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,5063241,63901242,1163075735,-1742718393,745148192,239861777,1095959508,1162629197,585573459,2248526,64884310,-233955191,241762307,1095959528,1162629197,585573459,575882585,-233925120,-585053949,287361082,-1086713300,739184416,974203921,672080032,-902119366,254547488,546388499,1296189730,247005218,550110204,202320920,-1858465492,1699750432,1852797810,1126198369,1970302319,577922420,101639680,253804292,974203914,168763594,288102956,-14642886,-720426858,685173033,254547215,-1496627,-1206966122,253427753,550110224,439094031,-1858465492,680984352,-383143153,538976290,538976288,1263423300,538990917,538976288,-383639520,254318335,1090529715,-905700849,738987808,974203930,-1761664879,699600680,254334697,537865237,-1761613527,699600680,604993024,253807108,739912717,546388497,254318335,585705907,538976288,1936876886,544108393,808463921,538976288,-1498592,-1290852202,261881897,550110254,439094799,-1858465492,680984352,-383134705,353315030,701304620,680984553,2735631,70782928]}]],[[{"sector":1,"length":512,"data":[252649663,-902164180,739315488,974203928,673325201,1126181187,1920561263,1952999273,1296189728,1919894304,959520880,2240824,71438340,235872447,-902164180,739708704,974203928,1344413841,1936942450,1634759456,1646290275,1948283489,1868767343,1852404846,2254197,72093720,-388095861,539108070,545857741,281614,72749093,608456003,-568269024,1611676928,1126206212,539247693,572661991,-1994339040,72748576,1779456256,1126206212,539247693,-1761664793,689639208,-1994339040,85069344,1947234816,1126206212,539247693,539107559,550314018,-2012340087,276561924,545850494,284174,76025992,1163075735,1173319,76681393,-14147445,269232279,-299882236,3148832,216459305,-853540816,1394644768,-1992669371,84610592,-1676623360,253796356,985676368,739516618,282263570,546374822,1280264226,1414078532,268444193,-1861963759,1331241504,1163011925,1414483488,1230198048,1411401550,1126188360,1380928591,1095911215,1128876112,1330454611,1330923854,1145118802,1163153473,2236754,79302990,1411522705,542329160,1196380752,541933906,1397052245,1095911200,1128876112,1312890963,1163010116,1380537681,1411404613,542392648,1346454593,777143636,293011490,546374852,1163022370,1411404627,1394623816,1162035536,1380008480,542069792,1414418243,1163218505,-2130697682,-1761292783,1195725600,-669936384,-568292604,572712680,-1994339040,81268256,-502160896,1145914116,552017956]},{"sector":2,"length":512,"data":[297402590,545981676,608456003,572581664,550314018,-502390647,299237380,545981686,608456003,-14620896,453978262,550314025,302915721,300875781,545981696,608456003,572581664,-853532128,237013280,-117439214,-1996158447,81923616,185729280,-585053947,202510080,-1491036923,237013280,469763343,-33223406,1881284755,2242097,84808230,336470153,305332229,549389583,288104207,-1778380500,-1861939182,1213473312,1344295753,1380405074,1377848641,1230328133,542328146,1096172609,1145389902,1396785696,757089097,1398087725,1329799237,1312902477,1109860420,1128878913,975316801,252649663,288100652,1226867258,-870313241,589831200,540705594,302915752,312737797,546637074,545857703,14,85136096,739320008,545995282,1347240275,609437004,1163469543,-853532077,579665440,1886216563,577987948,65543212,547437088,739778751,974203921,8469184,85201638,317587599,549389698,318242833,548210060,5892673,94376712,739385544,549403153,1190937,95032086,626073734,32775208,322699305,545654196,673526084,740922895,673526340,740922895,673526083,740935695,673526339,2738191,96342860,1313087622,472393035,2687276,96998230,-1811013491,325058567,546112978,455694,98308966,326369472,545654246,472393026,2687276,99619732,-414637950,550248467,973155356,1227367746,485156649,266944512,8600256,100275113,287843650,974382889]},{"sector":3,"length":512,"data":[304620866,-1055922391,68398848,-1157591290,1124470291,1846536024,-754925510,-1341770221,739321888,686434577,738275612,740935439,-335527380,-1341767661,739715104,686434583,254566671,304884163,4604460,105518087,254288048,689384631,823929066,-1022415871,739388457,469780034,-905554924,371987488,572559674,1802399556,2259301,106828850,739516618,-1858462449,1917067808,1919252073,340787234,550110815,254546703,579942937,1936028240,1884495987,543515489,3875360,106959982,336535754,974720812,1631724177,1869881458,1769435936,577266548,344719419,550110817,254547215,579942937,1701732716,538976371,538976288,3875360,107156650,386867402,974720812,1917854353,544437093,541283141,572530720,348651579,550110820,254547983,579942937,1696624500,544500088,538976288,3875360,107484400,-413589374,550248469,-819935473,974393120,-1945163600,-366388948,747376424,168814937,8600105,108139776,266819907,1480800873,6885351,108795173,254288048,688991332,1678715114,700911404,254324794,688991412,-1274074902,700911404,-2045427712,371247622,-1858463956,977556256,739647690,-1858461937,5067552,110105946,1139235139,974514777,1497571467,540807144,-1240588083,359661576,-1996618086,1480796192,693715756,1380008748,13052965,111416710,266819652,705685865,679870443,334203135,362872873,545392302,-14096551,367717256,538569513,2081366220,388026144]},{"sector":4,"length":512,"data":[-1206539008,471909382,304893472,-1038737920,-417054458,545995486,-1629119,453978262,550314025,537203214,-1742692038,745148192,545995281,1093178111,300296484,-1340027616,1480796192,693715756,1480796394,740036585,266950979,288106796,977682988,266819651,1480846076,545848890,743981864,740907331,626147651,-1002780884,751308576,373030930,545982156,350676825,-31404768,1143480456,693709912,1263420460,12987429,114693721,1480794251,542655719,-380034834,-404350705,-853518013,135007776,-535399424,1495304966,337702432,-31404768,254288008,689384588,2441772,116004506,548420227,743982120,-366380017,-380091352,254550031,288106901,977682988,-2045894519,379584518,12584692,117315246,572560126,860043347,383189026,-1828845816,827146786,1915825202,824929587,845427500,1145975122,1915843890,1815372850,1815180594,-67100111,-33091050,929309330,1684943186,1915909426,1815503923,1815246131,1832084529,824979757,2241388,119281446,1830982398,757870893,1815311665,1815241777,1916171571,1848796211,829567588,829175669,845951332,389808162,-1828845786,1916040482,1848730674,827470436,2241109,120592203,1294111486,757870891,1795170867,-33080809,1145184914,843329585,844444498,741420365,827076909,741420365,-1996479951,-33078249,1145184914,1378960435,1278301489,844251697,826552658,827666764,1310173696,580058631,1110590530,826552908,827666770,1380069708]},{"sector":5,"length":512,"data":[1144082994,1429294129,399179825,-1828845736,843334178,1144147010,1429295665,1110527025,827470418,827076932,-520081067,-1341693417,288100648,254339625,1007627304,1110191145,1813507584,546307591,304878120,402522153,545654646,626147651,58989608,404160553,-1979840640,304878120,254339625,755969053,1094921257,486548818,-1912108520,-1810357504,788578311,-33055208,810754706,1073750584,-33052648,1109532818,741617997,2242609,129112164,1294111486,757871147,1295536692,757870891,1295078705,724316459,841698609,3222828,129767559,1294111486,824979757,741419853,825052467,760033580,841821233,741420365,-1358945742,-33044968,860103314,861221196,741420365,1278362673,1278367025,1278362675,1295144241,757870893,-989846991,-33042408,860103314,894775628,741485901,573658419,-635906560,546307591,739577640,740888079,418250772,549914596,740626216,975768079,254288071,168766504,419823657,549914606,740626216,975768335,254288071,185543720,421593129,-1979840520,219097120,-366407380,741150504,740890895,625692228,35202816,1140887048,1393036313,1146349380,-902163735,739118880,546388503,1330594338,2236749,135666019,673221118,1496078404,1143532073,269478232,266950956,1143744793,2113938737,1141383193,1156012081,826554968,978970457,-413650364,266950724,429916177,-1979840470,1480861728,739315689,686434649,266950724,-380031969,740890895,2437700]},{"sector":6,"length":512,"data":[137632193,673221118,1126979651,686434649,266950723,1497574414,690753513,623985452,1041884416,545914376,-380091608,1126960911,686434649,266950723,1497574428,690753513,624050988,1209663744,1479623432,978863079,-413585085,1127897411,1139234866,252701016,1377445120,1344307720,-870311961,-819982048,974318112,-334305446,1357714216,827996713,1525289703,1545226752,545848840,1479623464,1496400684,826485801,-1996604891,1479689000,1496400684,843263017,443482149,-1996617626,826550304,826551384,1143744857,-29743823,843327624,826551384,1143744857,-1711266510,1124626458,1139234865,828042072,1496400954,1525373415,843266609,843310936,472443224,1139409187,-349611982,449773658,826542202,1480910680,976313067,-413585085,-380030653,-358936792,693711171,1144675051,1156012082,686381106,-369023460,693645892,-201303317,-32996326,1126703240,1126979633,740907313,975515971,1126729982,1126979634,740907313,2437699,143530777,673220862,743977284,693711172,623985708,680066618,743977540,693711172,624051244,-1743049728,253805576,-1996494555,751308779,8600085,144841534,-413589374,550248466,973590556,457834627,985663660,68034697,460259334,1297287350,-380808217,550124050,420424728,572559674,1802399556,1814067557,1936028527,-2130697695,-2113355749,317151520,471911456,-2093349912,-904164096,-1992638456,100929056,436207616,693711130,624051244,-1743049728,253805576]},{"sector":7,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1109535794,543520108,1970168132,1461740898,2054450273,544825888,777203274,1634890835,577991541,808651277,1142960180,541152321,875311668,741749804,959720500,875312172,741616697,741616688,841756982,841756716,741422636,741354546,943008822,808202796,892088876,741485624,741747760,875311668,741487660,856296756,540030256,1096040772,741749792,959720500,168637484,808857651,1413563424,959717441,808203308,908866604,741485617,741485616,841756982,908865580,741946668,741354546,959786034,808202796,875312684,741616689,875311412,741618732,825568308,892089388,221522993,925905674,1094983728,807420244,908866604,741485619,741485616,841757494,908865580,741946668,741354546,856296754,540031024,1096040772,741946656,741354546,825502774,875312172,741616689,875312180,741422380,825568308,808203308,908866604,741485619,741485616,841757494,908865580,741881132,741354546,943008818,168636972,809054259]},{"sector":8,"length":512,"data":[1413563424,741351489,842279990,168637484,808464691,1413563424,842276929,875312172,741616694,875313460,741618988,741354548,909519924,808202796,908866092,741485622,741747760,841756982,841756716,741422636,741354546,842279990,168637484,808530227,1413563424,842276929,875312172,741616694,875313460,741618988,741354548,909519924,808202796,168636972,808595763,1413563424,909516865,808202796,908867116,741485619,741485616,841757494,908865580,741618732,875834420,875312172,741616695,841756981,841756716,741422380,808203313,875311660,221523000,858862346,1094983728,874529108,741616697,824981557,856296758,540030001,1096040772,741618976,909388852,875312172,741878838,875312180,741422380,959720504,875312172,741616690,741485616,841757236,741487660,741354548,959720504,808202796,875311660,221391927,892416778,1094983728,807420244,875312684,741485625,221391920,909193994,1094983728,874529108,741485623,741747760,875313460,741881132,892089905,741616694,841759028,841756716,741749804,741354546,959720502,808202796,875311660,741485622,741747760,875313460,825428493,1142960183,541152321,824981045,875899958,875312172,741485625,741485616,841758516,908865580,741946412,741354546,926166066,808202796,875312684,741616697,824981557,856296758,540031025,1096040772,741750048,959720500,892089388,741616692,875312693]}]],[[{"sector":1,"length":512,"data":[741881132,825633844,892090412,741616697,841758773,741881132,943008818,892089388,741485622,741485616,875312181,942420012,825428493,1142960185,541152321,757870893,436866353,741946412,741354546,926166066,808202796,875312684,741616697,824981557,856296758,540031025,1096040772,741750048,959720500,892089388,741616692,875312693,808202796,168636972,808595763,1413563424,909516865,808202796,908867116,741485619,741485616,841757494,908865580,741618732,875834420,875312172,741616695,841756981,841756716,741422380,808203313,875311660,221523000,858862346,1094983728,874529108,741616697,824981557,856296758,540030001,1096040772,741618976,909388852,875312172,741878838,875312180,741422380,959720504,875312172,741616690,741485616,841757236,741487660,741354548,959720504,808202796,875311660,221391927,892416778,1094983728,807420244,875312684,741485625,221391920,909193994,1094983728,874529108,741485623,741747760,875313460,741881132,892089905,741616694,841759028,841756716,741749804,741354546,959720502,808202796,875311660,741485622,741747760,875313460,825428493,1142960183,541152321,824981045,875899958,875312172,741485625,741485616,841758516,908865580,741946412,741354546,926166066,808202796,875312684,741616697,824981557,856296758,540031025,1096040772,741750048,959720500,892089388,741616692,875312693]},{"sector":2,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1210199090,1919905141,1970369381,2036473957,1870021664,577462642,808651277,1142960180,541152321,858535732,841756716,741946412,926166065,808203052,875311660,741420089,858534197,841756716,741618988,909454385,808203052,892088876,221326388,892351242,1094983728,891306324,741551161,741485616,824981557,741422636,741354547,959786034,892088620,741551160,741485616,824979766,741946668,741354547,909454386,168636716,808857651,1413563424,875896897,808203052,892088876,741420084,858535477,841756716,741618988,959786033,808203052,892088876,741420086,858534965,841756716,741422380,856296753,540030768,1096040772,741946400,875312178,741551159,741485616,824981812,741815340,741354547,959720498,892088620,741551153,741485616,824980533,741750060,741354547,875899954,168636716,808988723,1413563424,909451329,808203052,892088876,741420088,858534198,841756716,741946668,943008817,808203052,908866092]},{"sector":3,"length":512,"data":[741420081,858536245,841756716,741750060,856296753,540031280,1096040772,741618976,741354547,875899954,892088620,741551161,741485616,824981300,741946412,875899958,875312684,942746679,825428493,1142960176,541152321,757870893,436866353,808203052,892088876,741420088,858534198,841756716,741946668,943008817,808203052,908866092,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1210199090,1919905141,1970369381,2036473957,1870021664,577462642,808651277,1142960180,541152321,858535732,841756716,741946412,926166065,808203052,875311660,741420089,858534197,841756716,741618988,909454385,808203052,892088876,221326388,892351242,1094983728,891306324,741551161,741485616,824981557,741422636,741354547,959786034,892088620,741551160,741485616,824979766,741946668,741354547,909454386,168636716,808857651,1413563424,875896897,808203052,892088876,741420084,858535477,841756716,741618988,959786033,808203052,892088876,741420086,858534965,841756716,741422380,856296753,540030768,1096040772,741946400,875312178,741551159,741485616,824981812,741815340,741354547,959720498,892088620,741551153,741485616,824980533,741750060,741354547,875899954,168636716,808988723,1413563424,909451329,808203052,892088876,741420088,858534198,841756716,741946668,943008817,808203052,908866092]},{"sector":4,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1344416818,539062383,1936027463,1701344288,1634031392,543517811,1849761837,1836674671,577992047,808651277,1142960180,541152321,841758516,841756716,741815340,959720498,808202796,875311660,741485625,841756981,741618988,825568306,875311660,741485623,741485616,841757236,808651277,1142960181,541152321,841758516,841756716,741815340,959720498,808202796,875311660,741485625,908865845,741815340,741354546,842279986,875311660,741485623,741485616,841758516,741946412,856296754,540030512,1096040772,841756704,741946412,825568306,892088876,741485620,841756981,741815340,741354546,909454388,808202796,875312172,741485625,741485616,841757237,741422380,926166070,168636972,808923187,1413563424,741351489,959786036,808202796,892088876,741485625,841758261,841756716,741946668,943008818,908866092,741485617,841758773,741618988,741354546,959786036,808202796,168636972,808988723,1413563424,959782977]},{"sector":5,"length":512,"data":[892088876,741485622,741485616,841759029,741881132,875899958,808202796,892088876,741485617,841757237,841756716,741422380,842345522,808202796,892088876,221391924,959460106,1094983728,891306324,741485622,741485616,841758773,741946668,741354546,909454388,808202796,875312172,741485625,741485616,841757237,741422380,926166070,168636972,808464691,1413563424,825040961,221326636,875895306,808202796,892088876,741485617,841757237,841756716,741422380,842345522,808202796,892088876,221391924,959460106,1094983728,891306324,741485622,741485616,841758773,741946668,741354546,909454388,808202796,875312172,741485625,741485616,841757237,741422380,926166070,741485623,741485616,841757236,808651277,1142960181,541152321,841758516,841756716,741815340,959720498,808202796,875311660,741485625,908865845,741815340,741354546,842279986,875311660,741485623,741485616,841758516,741946412,856296754,540030512,1096040772,841756704,741946412,825568306,892088876,741485620,841756981,741815340,741354546,909454388,808202796,875312172,741485625,741485616,841757237,741422380,926166070,168636972,808923187,1413563424,741351489,959786036,808202796,892088876,741485625,841758261,841756716,741946668,943008818,908866092,741485617,841758773,741618988,741354546,959786036,808202796,168636972,808988723,1413563424,959782977]},{"sector":6,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,538976304,1413563424,841818177,2035491372,1869115501,589330798,1646276660,1867325561,1953653114,856296738,540030000,1096040772,741684512,875899954,892088876,741616692,841758005,741618988,875899954,892089388,741485621,841757749,741618988,842411060,808203308,168637484,808792115,1413563424,842408001,908866092,741485617,875313461,741946668,926231602,892088876,741616693,841758005,741618988,856296754,540030512,1096040772,741487904,842345524,808203308,892089388,741485620,841757237,741487916,875899956,892088876,741485618,875311669,741618988,842345522,168636972,808923187,1413563424,842342465,908866604,741616689,741616688,841756982,741946668,943008818,892089388,741485624,841758005,741618988,875899956,892088876,221391922,942682890,1094983728,891306324,741616688,875311157,875311148,741488172,825633842,908866092,741616689,875312182,741881132,825633844,168637484,809054259,1413563424,959782977,892089388]},{"sector":7,"length":512,"data":[741616692,741616688,841757238,741422636,825633842,908866604,741616692,875313205,741422636,856296756,540028977,1096040772,741946656,842411060,908866604,741485617,841759029,741815596,892677170,892088876,741616692,875312692,741815340,959720500,168637484,808530227,1413563424,808788033,892089388,741485618,841756725,741946412,926166068,892089388,741616692,741616688,942421046,825428493,1142960178,541152321,841758006,908865580,741619244,892742712,808202796,908867116,221785140,858862346,1094983728,908083540,741616693,875312182,741684780,875965492,908866604,221522997,875639562,1094983728,757088596,825044017,890898957,741485618,841756725,741946412,168637484,808792115,1413563424,842408001,908866092,741485617,875313461,741946668,926231602,892088876,741616693,841758005,741618988,856296754,540030512,1096040772,741487904,842345524,808203308,892089388,741485620,841757237,741487916,875899956,892088876,741485618,875311669,741618988,842345522,168636972,808923187,1413563424,842342465,908866604,741616689,741616688,841756982,741946668,943008818,892089388,741485624,841758005,741618988,875899956,892088876,221391922,942682890,1094983728,891306324,741616688,875311157,875311148,741488172,825633842,908866092,741616689,875312182,741881132,825633844,168637484,809054259,1413563424,959782977,892089388]},{"sector":8,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1495411762,1701539425,1866735717,1701602415,1092627744,2037280622,1937076077,168632864,808726579,1413563424,808788033,892089132,741551152,858534453,741618988,808791091,892089132,741551156,858534453,741684268,808791091,892089132,741551152,858534453,741618988,808791091,168637996,808792115,1413563424,959717441,808203052,168637228,808857651,1413563424,808788033,892089132,741551152,858534453,741618988,892677171,892089132,741551156,858534453,741356844,959720499,875311916,741551157,858535732,741946412,808791091,168637996,808923187,1413563424,808788033,808203052,168637228,808988723,1413563424,926163009,875312428,741420089,858535732,741684268,926166067,875311916,741551161,858533941,858533932,741684268,926166069,875311404,741551157,858534708,741487660,856296758,540031280,1096040772,741684256,741354547,856296755,540028977,1096040772,741815328,959720501,875311404,741551159,858535220]}]],[[{"sector":1,"length":512,"data":[741815340,959720499,892089132,741551152,858535732,741684268,808791091,875311916,741551161,858534453,741356844,856296758,540029233,1096040772,741356832,856296758,540029489,1096040772,741420320,168636717,540031258,1096040772,741684256,741354547,856296755,540028977,1096040772,741815328,959720501,875311404,741551159,858535220,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1495411762,1701539425,1866735717,1701602415,1092627744,2037280622,1937076077,168632864,808726579,1413563424,808788033,892089132,741551152,858534453,741618988,808791091,892089132,741551156,858534453,741684268,808791091,892089132,741551152,858534453,741618988,808791091,168637996,808792115,1413563424,959717441,808203052,168637228,808857651,1413563424,808788033,892089132,741551152,858534453,741618988,892677171,892089132,741551156,858534453,741356844,959720499,875311916,741551157,858535732,741946412,808791091,168637996,808923187,1413563424,808788033,808203052,168637228,808988723,1413563424,926163009,875312428,741420089,858535732,741684268,926166067,875311916,741551161,858533941,858533932,741684268,926166069,875311404,741551157,858534708,741487660,856296758,540031280,1096040772,741684256,741354547,856296755,540028977,1096040772,741815328,959720501,875311404,741551159,858535220]},{"sector":2,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1176644658,1380273749,1293962305,1212371521,541478688,1095573569,1313818962,1163154501,1193291040,1330533711,168632900,808726579,1413563424,926097473,808202540,858534444,741420080,741682224,858534452,741487660,825502771,858534700,741551161,858534196,858533932,741487660,875834419,808203052,858534700,741420087,221391920,892351242,1094983728,857751892,741420080,741682224,858534452,741487660,825502771,858534700,741551161,858534196,858533932,741487660,875834419,808203052,858534700,741551159,858534452,858533932,741684268,856296755,540030512,1096040772,741946400,926166070,875311916,741551157,741551152,858536244,741487916,808791094,875311916,741551161,741551152,858534709,741750060,875899958,892089132,741551155,858533941,808651277,1142960183,541152321,858536244,741815340,892611635,875311916,741551156,824979507,892088364,741487660,842279987,875311916,741551153,858536243,741422124]},{"sector":3,"length":512,"data":[741354547,842279987,875311916,221457460,942682890,1094983728,807420244,858534700,741420087,741485616,824979507,892088364,741487660,842279987,875311916,741551153,858536243,741422124,741354547,842279987,875311916,741551156,221457456,959460106,1094983728,857751892,741551159,858535220,858533932,741946412,842345523,892089900,741551152,858536244,741815340,892611635,875311916,741551155,858535732,741356844,842279987,168637228,808464691,1413563424,825499713,875311916,741551154,858534964,858533932,741684268,741354545,875834418,875313452,221326386,825307914,1094983728,757088596,825044017,739904013,858535220,858533932,741946412,842345523,892089900,858534196,858533932,741487660,875834419,808203052,858534700,741420087,221391920,892351242,1094983728,857751892,741420080,741682224,858534452,741487660,825502771,858534700,741551161,858534196,858533932,741487660,875834419,808203052,858534700,741551159,858534452,858533932,741684268,856296755,540030512,1096040772,741946400,926166070,875311916,741551157,741551152,858536244,741487916,808791094,875311916,741551161,741551152,858534709,741750060,875899958,892089132,741551155,858533941,808651277,1142960183,541152321,858536244,741815340,892611635,875311916,741551156,824979507,892088364,741487660,842279987,875311916,741551153,858536243,741422124]},{"sector":4,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1394748466,1397899604,1145979168,1381258016,1397051465,1380927008,1380275781,1394617632,1095980367,168632864,808726579,1413563424,875896897,892089900,741747764,858534453,741422380,825568307,892089900,741551152,858534197,741422380,808203825,892088876,221457456,892351242,1094983728,891306324,741551153,908865845,741356844,825568307,168637228,808857651,1413563424,875896897,892089900,741551153,858534965,741487916,875311665,741747769,741551152,858536244,741946412,942943286,875311916,221457465,925905674,1094983728,874529108,741747769,858535988,741946412,856296755,540031024,1096040772,741487904,808203825,892088876,741551153,858536244,741422380,875899955,892090668,741944374,858535477,741946412,808203825,892088876,221654068,959460106,1094983728,891306324,741747764,858534453,741422380,825568307,892089900,741551152,858534197,741422380,808203825,892088876,741551152,858534197,741422380]},{"sector":5,"length":512,"data":[808791094,740307756,858534197,825428493,1142960176,541152321,858534453,741422380,959720499,875312428,741420086,824981812,926166066,808203820,875311916,741551159,908867380,741749804,926166067,892089132,741747760,858536244,741815340,856296755,540029233,1096040772,741946656,808203569,875311916,741551159,858536244,741422380,875899955,808202540,875311660,741551159,858536244,741422380,875899955,808202540,875311660,741551154,892089396,825428493,1142960178,541152321,824979765,741946412,875311665,221326391,858862346,1094983728,757088596,825044017,739904013,856296755,540029233,1096040772,741946656,808203569,875311916,741551159,858536244,741422380,892088876,221457456,892351242,1094983728,891306324,741551153,908865845,741356844,825568307,168637228,808857651,1413563424,875896897,892089900,741551153,858534965,741487916,875311665,741747769,741551152,858536244,741946412,942943286,875311916,221457465,925905674,1094983728,874529108,741747769,858535988,741946412,856296755,540031024,1096040772,741487904,808203825,892088876,741551153,858536244,741422380,875899955,892090668,741944374,858535477,741946412,808203825,892088876,221654068,959460106,1094983728,891306324,741747764,858534453,741422380,825568307,892089900,741551152,858534197,741422380,808203825,892088876,741551152,858534197,741422380]},{"sector":6,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1294085170,1667856485,1210084961,1142977633,1701015137,1411394848,1768186226,1852795252,572550241,808651277,1142960180,541152321,841757237,741815596,741354546,842345522,892088876,741485623,741485616,841757237,741815596,741354550,842345524,892088876,741485623,841759029,741815596,909454386,168637484,808792115,1413563424,926228545,892088876,741485625,741878832,841757237,741750060,741354546,842345522,892088876,741485622,741485616,841757237,741750060,741354550,842345524,168636972,808857651,1413563424,909451329,892088876,741485623,841758261,741618988,909454388,892088876,741485623,741747760,841757750,741553708,875965490,908866092,741485617,841756726,741422636,856296754,540030768,1096040772,741815584,909454386,892088876,741485623,841757237,875311148,741946412,808791090,892088876,741485618,841757749,741750060,926231602,892088876,741485625,841756982,808651277,1142960184,541152321]},{"sector":7,"length":512,"data":[841757238,741946668,741354546,842411060,908866092,741485617,841757238,741946668,943008818,892088876,741485625,841758261,741684524,909454386,892088876,221391922,959460106,1094983728,807420244,908866604,741485620,841757494,741619244,909519922,908866092,741485620,841757238,741422636,959786034,892088876,221391927,808530698,1094983728,757088596,825044017,840567309,908866092,741485617,841757238,741946668,943008818,892088876,741485625,841758261,741684524,909454386,892088876,221391922,959460106,1094983728,807420244,908866604,741485620,841757494,741619244,909519922,908866092,741485620,841757238,741422636,959786034,892088876,221391927,808530698,892088876,741485623,841759029,741815596,909454386,168637484,808792115,1413563424,926228545,892088876,741485625,741878832,841757237,741750060,741354546,842345522,892088876,741485622,741485616,841757237,741750060,741354550,842345524,168636972,808857651,1413563424,909451329,892088876,741485623,841758261,741618988,909454388,892088876,741485623,741747760,841757750,741553708,875965490,908866092,741485617,841756726,741422636,856296754,540030768,1096040772,741815584,909454386,892088876,741485623,841757237,875311148,741946412,808791090,892088876,741485618,841757749,741750060,926231602,892088876,741485625,841756982,808651277,1142960184,541152321]},{"sector":8,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1394748466,1162625347,538976339,538976288,538976288,538976288,538976288,538976288,572530720,808651277,1142960180,541152321,824981555,741946156,808725553,875311404,741420081,824980020,741553196,875834417,875311404,741420085,824981044,741815340,856296753,540030256,1096040772,741880864,959720497,892088620,741420080,824979765,741487916,859122737,892088620,741420084,824980789,741750060,856296753,540030512,1096040772,741815584,943008817,892088620,741420089,824979510,741422636,842411057,908865836,741420083,824980534,741684780,741354552,856296756,540030768,1096040772,741684768,875965496,908865836,741420083,824980022,741422636,808856625,892088620,741420089,824981557,741815596,856296753,540031024,1096040772,741750048,892677169,892088620,741420084,824980277,741487916,825568305,892088620,741420080,824981812,741880876,856296753,540031280,1096040772,741815328,909388849,875311404]}]],[[{"sector":1,"length":512,"data":[741420085,824980532,741553196,842279985,875311404,741420081,824979508,741946156,942877745,168638508,808464691,1413563424,825040961,221326636,1096030730,741750048,892677169,892088620,741420084,824980277,741487916,825568305,892088620,741420080,824981812,741880876,856296753,540031280,1096040772,741815328,909388849,875311404,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1394748466,1162625347,538976339,538976288,538976288,538976288,538976288,538976288,572530720,808651277,1142960180,541152321,824981555,741946156,808725553,875311404,741420081,824980020,741553196,875834417,875311404,741420085,824981044,741815340,856296753,540030256,1096040772,741880864,959720497,892088620,741420080,824979765,741487916,859122737,892088620,741420084,824980789,741750060,856296753,540030512,1096040772,741815584,943008817,892088620,741420089,824979510,741422636,842411057,908865836,741420083,824980534,741684780,741354552,856296756,540030768,1096040772,741684768,875965496,908865836,741420083,824980022,741422636,808856625,892088620,741420089,824981557,741815596,856296753,540031024,1096040772,741750048,892677169,892088620,741420084,824980277,741487916,825568305,892088620,741420080,824981812,741880876,856296753,540031280,1096040772,741815328,909388849,875311404]},{"sector":2,"length":512,"data":[808464435,1296388640,1701336096,1296189728,1919242272,1634627443,1866670188,1953853549,1293972069,1667855221,1919111968,225209455,825242378,1163010096,1700143181,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,856296753,540029488,541934930,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,223167049,858796810,1094983728,757088596,1394748466,1920297825,539828321,1634754890,1702061422,1819231776,1699553387,2036625260,168632864,808726579,1413563424,959717441,875313196,741878841,824979765,741354546,959720500,875313196,741878841,824979765,741354546,959720500,892090412,741878833,942420533,741422380,856296760,540030256,1096040772,741946400,825568312,875312172,741616697,824980788,875834422,875313196,741878832,942421044,741684268,856296760,540030512,1096040772,741618720,875834424,875312172,741616688,824981811,959720502,875313196,741878841,824979765,741354546,959720500,875313196,741878841,824979765,741354546,856296756,540030768,1096040772,741356576,875834424,875313196,741878837,942422324,741422380,959720500,875312172,741878837,824980532,856296758,540031024,1096040772,741420320,168636717,875834394,875312172,741616688,824981811,959720502,875313196,741878841,824979765,741354546,959720500,875313196,741878841]},{"sector":3,"length":512,"data":[-1408454657,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1919501088,6646883,62262493,1700143247,1869181810,774971502,673198128,1866672451,1769109872,544499815,541934153,1886547779,943272224,219086897,546243520,1701013836,1684370286,1952533792,1634300517,539828332,1735357008,544039282,1886351952,2037674597,543584032,5063241,63900961,1163075735,-1742718393,745148192,221904913,747766740,524295212,1296126778,1397050448,1310910244,1140859471,-1996235251,66194976,-401777152,741118467,975126556,1347240275,609437004,1163469543,-1962925485,-922488307,-935666400,304877856,253804346,739322895,547371537,-1069930481,371247674,974327596,1226973329,2248002,66850222,739778762,288099343,572559674,1936876880,1818324591,1836008224,1702131056,-620748174,-1090255347,738856736,550124049,439093775,-1858465492,680984352,-383134449,353315030,701304620,680984553,2734095,68161040,185540810,288102956,-14642886,-1290852202,539158825,538976288,1229135904,1162625874,538976288,538976288,-1761613534,699600680,437138944,253807108,739912716,546388497,254318335,-689362509,739577640,-383180785,254318335,1795172787,-905698290,739053344,974203930,-1761664879,699600680,538977001,1700143136,1869181810,774971502,538980400,572530720,680984553,2732815,70127249,235872458,288102956,-14642886,-737204074,685173033,254547215]},{"sector":4,"length":512,"data":[-1496627,-1106302826,247791657,549389368,288100111,253807162,739781649,546388497,692267042,1886339872,1734963833,1226863720,1126190402,544240239,825768241,251199522,549389378,288099855,253807162,739781655,546388497,1701990434,1931506547,1701011824,1918984736,544175136,1953394531,1702194793,252510242,545981516,585558238,550314018,1275994249,253362180,1296237654,-417323964,838917664,-1962647537,1145914144,552017956,-853532126,237013280,1308623958,-1962644977,1145914144,552017956,254318335,-853530341,237013280,1728054560,-1962642417,1145914144,552017956,539107362,545857741,296974,75370353,1443766409,259850244,546768008,-414759597,262537233,545981586,681049896,688132108,203484704,-399966160,3149030,-1759458016,1195725600,237013306,-1224735468,-1610310641,978325280,550124224,1190932,77991880,1210196113,541346895,572609609,-1341127424,572559620,659902297,1310737746,1428182095,1196312915,1162368032,1280262944,1194283599,1213219154,542327625,1229868877,542265172,1346454593,559039828,272826402,546374842,1229476898,1380982867,1095911247,1398087757,1193300805,1213219154,542327625,541347393,1431389522,1397051977,1095259168,1145118804,1163153473,2240082,79958124,1344413841,1397966162,1162368032,1095783200,1109411139,1411404353,1329799247,1313428558,573457749,-837782016,1394644740,-1979693243,-1962616816,-420946400,-853532126,237013280]},{"sector":5,"length":512,"data":[-1761606440,1124393488,539247693,14557415,82579631,1296244875,-417323964,539107872,545857741,320014,83235019,1296244875,-417323964,680984352,539564815,545857741,335886,83890404,1296244875,-417323964,572531232,-1994339040,85986848,168881664,237013253,-167770910,-922414064,67165472,-1794829039,-1994348768,85855776,370217216,546569733,909209634,286982178,545850647,337934,85856552,521085119,288100652,521243392,572559621,1397311572,1330794528,1296126535,1363497504,1163020629,1145118803,1129202006,1109410885,1128878913,539831584,541414229,1296912195,541347393,1396785703,658588489,549403170,288100111,-2110123732,317147424,471911456,-2093341912,547889210,335886,85987737,547823765,925833,298188800,549979425,974269457,1095966859,1162629197,585573459,575882585,-31404768,1634935436,1701605485,472654451,-704642072,-1090182639,288102432,-1069936340,-603946694,-1895487471,1007807488,304138245,-1086713556,288102688,1175586304,-416197883,29,-1996494464,1396315883,-1996495054,201331691,-1073393646,1427254272,253807109,974269465,1917854353,544437093,541283141,1696624500,578054520,1511145216,1377862149,-870312217,543428384,1253583,90444388,1105670721,976311273,843128971,-171827738,-853507256,-416136928,501887553,-2092370494,1846705920,680656389,254582799,1378625892,1093407532,741490988,1567766,91755168,-381556927]},{"sector":6,"length":512,"data":[-1959120301,501629216,-2092370494,1092668704,501891559,-2092370494,-2112707072,-1207926011,-33190894,-1609619313,694423340,321655852,-1777153536,1226867205,-870313497,65543200,-452951238,1090885394,987686692,608247947,680984551,539564815,554574029,317652997,545850784,345614,437911552,1093407532,741490988,1567766,91755168,-381556927,546569733,909209634,286982178,545850647,337934,85856552,521085119,288100652,521243392,572559621,1397311572,1330794528,1296126535,1363497504,1163020629,1145118803,1129202006,1109410885,1128878913,539831584,541414229,1296912195,541347393,1396785703,658588489,549403170,288100111,-2110123732,317147424,471911456,-2093341912,547889210,335886,85987737,547823765,925833,298188800,549979425,974269457,1095966859,1162629197,585573459,575882585,-31404768,1634935436,1701605485,472654451,-704642072,-1090182639,288102432,-1069936340,-603946694,-1895487471,1007807488,304138245,-1086713556,288102688,1175586304,-416197883,29,-1996494464,1396315883,-1996495054,201331691,-1073393646,1427254272,253807109,974269465,1917854353,544437093,541283141,1696624500,578054520,1511145216,1377862149,-870312217,543428384,1253583,90444388,1105670721,976311273,843128971,-171827738,-853507256,-416136928,501887553,-2092370494,1846705920,680656389,254582799,1378625892,1093407532,741490988,1567766,91755168,-381556927]},{"sector":7,"length":512,"data":[-1408454145,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1701400608,1918986339,215941236,546243510,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,3225657,62917905,1766596751,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,220397645,546767823,977749331,253794336,1125482,64228661,1347240275,609437004,1330520807,222232610,545850334,258574,65539410,1347240275,609437004,1163469543,2130715219,-922488307,-935666400,304877856,253804346,739322895,547371537,-1069930481,371247674,974327596,1226973329,2248002,66850210,739778762,288099343,572559674,1936876880,1818324591,1836008224,1702131056,-822074766,-1090255347,738856736,550124049,439093775,-1858465492,680984352,-383134449,353315030,701304620,680984553,2734095,68161028,185540810,288102956,-14642886,-1290852202,539158825,538976288,1162432544,1380010051,538976340,538976288,-1761613534,699600680,437135872,253807108,739912716,546388497,254318335,-689362509,739577640,-383180785,254318335,1593846195,-905698290,739053344,974203930,-1761664879,699600680,538977001,1700143136,1869181810,774971502,538980400,572530720,680984553,2732815,70127237,235872458,288102956,-14642886,-737204074,685173033,254547215,-1496627,-1106302826,247005225]},{"sector":8,"length":512,"data":[549389368,288100111,253807162,739781649,546388497,692267042,1886339872,1734963833,1226863720,1126190402,544240239,825768241,250413090,549389378,288099855,253807162,739781655,546388497,1701990434,1931506547,1701011824,1918984736,544175136,1953394531,1702194793,251723810,545981516,585558238,550314018,1275994249,252575748,1296237654,-417323964,637591072,-1962647537,1145914144,552017956,-853532126,237013280,1107297366,-1962644977,1145914144,552017956,254318335,-853530341,237013280,1526727954,-1962642417,1145914144,552017956,539107362,545857741,296974,75370341,1443766409,259063812,546768008,-414759597,261750801,545981586,681049896,688132108,203484704,-399966160,3149030,-1759458016,1195725600,237013306,-1426062069,-1610310641,978325280,550124224,1190932,77991868,1210196113,541346895,572609609,-1341130496,572559620,659902297,1310737746,1428182095,1196312915,1162368032,1280262944,1194283599,1213219154,542327625,1229868877,542265172,1346454593,559039828,272039970,546374842,1229476898,1380982867,1095911247,1398087757,1193300805,1213219154,542327625,541347393,1431389522,1397051977,1095259168,1145118804,1163153473,2240082,79958112,1344413841,1397966162,1162368032,1095783200,1109411139,1411404353,1329799247,1313428558,573457749,-837785088,1394644740,2113947461,-1962616816,-420946400,-853532126,237013280,-1962933032,1124393488,539247693]}]],[[{"sector":1,"length":512,"data":[14557415,82579619,1296244875,-417323964,539107872,545857741,320014,83235007,1296244875,-417323964,680984352,539564815,545857741,332302,83890392,1296244875,-417323964,572531232,-1994339040,85069344,168878592,237013253,-369097502,-922416368,-134161120,-1794831344,-1994348768,84872736,219219200,546569733,909209634,286195746,545850638,332814,84873500,521085119,288100652,269582080,572559621,1397311572,1330794528,1296126535,1363497504,1163020629,1145118803,1129202006,1109410885,1128878913,539831584,541414229,1296912195,541347393,1396785703,658588489,549403170,288100111,-2110123732,317147424,471911456,-2093341912,547889210,332302,85070221,547823765,925833,298385408,549979411,974269457,1095966859,1162629197,585573459,575882585,-31404768,1634935436,1701605485,472654451,975176680,549396641,739322904,985676305,299630721,545654036,1678714962,608250921,694423336,2014437888,-234831867,-939160559,288100896,421576506,33558828,1275437074,839903058,-414035142,469773327,-2063226350,1769218592,543517812,1663067759,1953653096,609499938,-1273872896,572556549,544698216,2037277037,1702127904,1763734381,1751326830,578056801,1174425147,1392885266,1409290727,-2113550318,317147424,1310772256,-770540800,572556549,1701672302,543385970,1970037110,1848385637,577072481,1227379259,608250921,2705704,98308744,-380377261,692660306]},{"sector":2,"length":512,"data":[-434991616,-1442807035,-2113540078,317147424,1310772256,1227379258,676521769,1407985993,-1291812038,1090910738,1173298,100930233,315752640,550110734,336538643,680722410,-332848044,546388499,251667540,-1341777901,-350672864,7464,-1407716,609495186,689171497,405543402,422111785,1911019,-377152512,1411945215,334244132,740302889,740888591,4336660,102896413,-415031166,550248466,322830414,826345004,976372199,1105670721,676522290,334178627,-1035001877,265971862,1325433417,1090926099,1093199681,843180337,1305641,104862568,266819651,-1929385568,692142376,1380722923,693261290,1242792192,-413580538,-1416177,1094789257,1277750057,1381231186,329711657,-1845623212,1480796192,693715756,743592748,1105865746,1864231473,745997074,741491178,1567766,106828766,673222654,-1484733,1094789260,-853677271,-343913268,1126978131,-1979717031,692142376,-858972693,1407942732,1126967634,354480928,402657836,1275488276,1480845144,680329193,-349617855,-384823512,-366390701,-1828721899,673464616,975776067,1139235148,-1979717031,692142376,1381181675,688918505,1913927936,304138758,1498163433,740891124,1277749522,689566808,1092653370,692267044,343736379,548406908,1481386024,-349627916,-350671847,1498163240,-383182348,-366401262,1481386024,-349627916,-350623463,1093178111,692267044,-350671831,1498163240,-383182348,740894994,344260626,545457798,344981571]},{"sector":3,"length":512,"data":[550110864,304879375,-1542148096,1092784390,1752461166,1126199909,1953653096,1495801919,544370464,992094542,-1374370048,-417054458,545995486,585573441,550314018,437774,113382627,608247947,575546087,1092677408,1847781156,550314018,332302,114038015,608247947,576266983,1092677408,2032330532,550314018,358414,114693385,-1878122359,6,304880154,-1542148096,1092784390,1752461166,1126199909,1953653096,1495801919,544370464,992094542,-1374370048,-417054458,545995486,585573441,550314018,437774,113382627,608247947,575546087,1092677408,1847781156,550314018,332302,114038015,608247947,576266983,1092677408,2032330532,550314018,358414,114693385,-1878122359,1480796192,693715756,743592748,1105865746,1864231473,745997074,741491178,1567766,106828766,673222654,-1484733,1094789260,-853677271,-343913268,1126978131,-1979717031,692142376,-858972693,1407942732,1126967634,354480928,402657836,1275488276,1480845144,680329193,-349617855,-384823512,-366390701,-1828721899,673464616,975776067,1139235148,-1979717031,692142376,1381181675,688918505,1913927936,304138758,1498163433,740891124,1277749522,689566808,1092653370,692267044,343736379,548406908,1481386024,-349627916,-350671847,1498163240,-383182348,-366401262,1481386024,-349627916,-350623463,1093178111,692267044,-350671831,1498163240,-383182348,740894994,344260626,545457798,344981571]},{"sector":4,"length":512,"data":[-1408382977,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1634751264,-184523421,-1895582195,1919243808,1852795251,808333600,1126703152,1886339881,1734963833,1226863720,1126190402,544240239,825768241,-1072814336,1277202179,1852138345,543450483,1702125901,1818323314,1344285984,1919381362,1344302433,1701867378,544830578,1226860143,1325419842,-1895577074,1953841440,544370536,777134125,1768245280,544826734,776806438,1818314784,1836213612,1627418209,-1761358066,1195725600,546840634,288123407,-737250560,1296126723,1397050448,1310910244,2097160783,-1996235250,66194976,-401698816,1296126723,1397050448,1495459620,2249541,66195133,987570377,739320008,549403154,288100111,-1606807252,975703840,550124224,319761430,572559674,575488585,-66134016,404802051,738987820,546388497,1919242274,1634627443,1866670188,1953853549,2257509,67505933,168763583,-902164180,738856736,974203930,-1761664879,701828904,254334697,-854643691,-1761613527,699928360,269435392,253807108,739912715,546388497,254318335,585705907,538976288,1394614304,1162035536,538976288,538976288,-1498592,-1290852202,258474025,550110234,439094287,-1858465492,680984352,-383143153,353315030,689966892,680984553,2732815,69472157,219095242,288102956,-14642886,-1290852202,539158825,1444945952,1769173605,824209007,540028974,538976288,-1761613534,699600680,772784896]},{"sector":5,"length":512,"data":[253807108,739912718,546388497,254318335,-689362476,739577640,-383136497,254318335,-150984258,-1090242545,739184416,550124049,405541135,-1858465492,1126703648,1866670121,1769109872,544499815,541934153,1886547779,943272224,721429041,-1090239984,739118880,550124049,405542671,-1858465492,1917854240,544437093,1667330163,1633820773,1869881458,1852793632,1970170228,1056973413,-1962652656,-420946400,-853532126,237013280,1275069516,1124357648,539247693,14557415,73404516,1296244875,-417323964,539107872,545857741,284174,74059904,1296244875,-417323964,680984352,539564815,545857741,332302,74715289,1296244875,-417323964,572531232,-1994339040,76025376,2115019520,237013252,-1358953386,-1761310704,1195725600,-671084057,-1962634736,-1744885728,68160552,552476713,687878156,806151912,550313984,1163075735,545864263,330510,77336809,1343168672,-902119366,304878624,-1508836864,572559620,1145851720,559171872,288817186,546374832,1431263522,541413927,542396238,1313428309,1213472839,1329799237,793923404,1346458183,1396918600,1313819936,1380930633,1094992160,1380275280,1962943009,-1861961199,1213473312,1344295753,1380405074,1428180289,542328147,1346458183,1396918600,1145979168,1363497504,1163020629,1213472851,1092637761,1414545732,573461061,-1005478400,572559620,1397051984,1213472851,1347625029,541410113,542261570,1126190932,1230261839,776295758,296222754]},{"sector":6,"length":512,"data":[546768078,4670803,81269180,-388095861,539108070,545857741,317454,81924553,608456003,-568269024,-334372608,1126206212,539247693,572661991,-1994339040,81923616,-166593280,1126206212,539247693,-1761664793,689639208,-1994339040,85069344,1185280,1126206213,539247693,539107559,550314018,302915721,304087045,545850634,320014,84611624,14491849,84677174,547823765,252584073,306380805,-1812069107,829432352,1291854390,-1996157422,85200416,252860928,253804293,739322911,314376209,546374928,1229476898,1380982867,1095911247,1163010125,1380537681,1092637509,1312904772,541345091,1230192962,757932099,1163089184,1297040160,1145979213,1094854432,1094928723,-1086709209,739184416,974203921,-414637950,550248466,975382556,-1474282877,85069344,303221504,-1491036923,237013280,117440512,-939191533,304877856,1394641722,1280331073,-417049787,1397053730,550314018,1931644158,1819307361,740455269,537126940,-1088380614,288102432,-1069936340,218136890,-1895492589,2014516480,-585053947,-2112673792,1226878213,-2042999062,472402208,2687776,93066040,739385544,549403153,1125401,93721512,-1845609792,748687144,740910095,304881167,489434156,2137417318,680525370,254582799,304884068,-29748692,1835147922,741357105,1697656881,1835151411,741357105,1747988529,975319091,254288048,1678716034,254339625,1678716094,974335017,254315006,1175399554,254339625]},{"sector":7,"length":512,"data":[-2112934722,4795433,94376940,287842480,-366407380,744754984,740935439,1178741777,254324794,688991333,-938530582,700911404,1110184748,682637894,288147727,472443433,254542124,338438599,4604460,95032327,386867402,540676908,1917854353,544437093,541283141,503331618,-905595884,739774240,579942931,1696624500,578054520,341573691,545392062,538175306,974594252,-414637950,550248466,-1812055533,1651319328,1949578860,1865758002,1664838205,1684284259,1717986595,593979171,1646485857,8600098,96998559,-1625781,52226952,843790849,-343343129,-29718001,827009160,691161900,-265533140,1226867258,538109745,-1777393460,-29719750,827009160,691161900,-265533140,-1174371526,1090900500,987686692,608247947,680984551,539564815,302915789,349896709,546833884,288123407,1092651834,585558052,550314018,537252366,237019450,1470,85596672,-1625781,52226952,843790849,-343343129,-29718001,827009160,691161900,-265533140,1226867258,538109745,-1777393460,-29719750,827009160,691161900,-265533140,-1174371526,472402208,2687776,93066040,739385544,549403153,1125401,93721512,-1845609792,748687144,740910095,304881167,489434156,2137417318,680525370,254582799,304884068,-29748692,1835147922,741357105,1697656881,1835151411,741357105,1747988529,975319091,254288048,1678716034,254339625,1678716094,974335017,254315006,1175399554,254339625]},{"sector":8,"length":512,"data":[-1408383233,1411419907,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1818313248,234094700,546243510,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,3225657,62918182,1766596751,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,238551117,546767823,977749331,253794336,1125482,64228938,1347240275,609437004,1330520807,240386082,545850334,258574,65539687,1347240275,609437004,1163469543,-1811930541,-922488306,-935666400,304877856,253804346,739322895,547371537,-1069930481,371247674,974327596,1226973329,2248002,66850487,739778762,288099343,572559674,1936876880,1818324591,1836008224,1702131056,-469753230,-1090255346,738856736,550124049,439093775,-1858465492,680984352,-383134449,353315030,701304620,680984553,2734095,68161305,185540810,288102956,-14642886,-1290852202,539158825,538976288,1109401632,541871169,538976288,538976288,-1761613534,699600680,437206784,253807108,739912716,546388497,254318335,-689362509,739577640,-383180785,254318335,1946167731,-905698289,739053344,974203930,-1761664879,699600680,538977001,1700143136,1869181810,774971502,538980400,572530720,680984553,2732815,70127514,235872458,288102956,-14642886,-737204074,685173033,254547215,-1496627,-1106302826,265158697,549389368]}]],[[{"sector":1,"length":512,"data":[288100111,253807162,739781649,546388497,692267042,1886339872,1734963833,1226863720,1126190402,544240239,825768241,268566562,549389378,288099855,253807162,739781655,546388497,1701990434,1931506547,1701011824,1918984736,544175136,1953394531,1702194793,269877282,545981516,585558238,550314018,1275994249,270729220,1296237654,-417323964,989912608,-1962647536,1145914144,552017956,-853532126,237013280,1459618902,-1962644976,1145914144,552017956,254318335,-853530341,237013280,1879049490,-1962642416,1145914144,552017956,539107362,545857741,296974,75370618,1443766409,277217284,546768008,-414759597,279904273,545981586,681049896,688132108,203484704,-399966160,3149030,-1759458016,1195725600,237013306,-1073740533,-1610310640,978325280,550124224,1190932,77992145,1210196113,541346895,572609609,-1341059584,572559620,659902297,1310737746,1428182095,1196312915,1162368032,1280262944,1194283599,1213219154,542327625,1229868877,542265172,1346454593,559039828,290193442,546374842,1229476898,1380982867,1095911247,1398087757,1193300805,1213219154,542327625,541347393,1431389522,1397051977,1095259168,1145118804,1163153473,2240082,79958389,1344413841,1397966162,1162368032,1095783200,1109411139,1411404353,1329799247,1313428558,573457749,-837714176,1394644740,-1828698299,-1962616815,-420946400,-853532126,237013280,-1610611496,1124393489,539247693,14557415]},{"sector":2,"length":512,"data":[82579896,1296244875,-417323964,539107872,545857741,320014,83235284,1296244875,-417323964,680984352,539564815,545857741,332302,83890669,1296244875,-417323964,572531232,-1994339040,85069344,168949504,237013253,-16775966,-922416367,218160416,-1794831342,-1994348768,84872736,219290112,546569733,909209634,304349218,545850638,332814,84873777,521085119,288100652,269652992,572559621,1397311572,1330794528,1296126535,1363497504,1163020629,1145118803,1129202006,1109410885,1128878913,539831584,541414229,1296912195,541347393,1396785703,658588489,549403170,288100111,-2110123732,317147424,471911456,-2093341912,547889210,332302,85070498,547823765,925833,316538880,549979411,974269457,1095966859,1162629197,585573459,575882585,-31404768,1634935436,1701605485,472654451,975176680,549396641,739322904,985676305,316932225,9372948,92410615,572560382,862742125,909145138,335553079,-1392145389,1525301536,545660986,404498498,540682497,675356806,2725391,93721386,549993152,974203922,739844287,550058513,322830557,-1845623392,-1609619424,694423340,738856748,324075539,-1879177814,-1609619424,694423340,321655596,-1273796096,545914373,748031784,-366388721,749342504,740912655,327483457,985662910,254288048,688991251,723265770,-1324405759,1110191145,-938238464,673230853,304878607,472443433,254542124,741091762,331481154]},{"sector":3,"length":512,"data":[550110674,254547983,579942923,1701990432,1159754611,1948271443,2019893359,572552297,332857403,545392092,336586584,471911456,-819986152,-83880672,1107682835,-416720856,-1401073,-2030098276,680132392,2048781144,696066265,-198616853,218114323,-2096762860,-414441414,1495284248,-1777342670,-99342592,673230853,338485007,254339625,-1357959939,739519529,1090537026,-1341783020,-1089525728,-366406612,752750376,740929295,1178741779,236215040,673230854,338468879,254339625,-1357960002,739388457,1761625666,-2113529836,300368928,304139296,571769856,266818310,-347805420,973145116,404547397,-347805183,66588,103552154,-413654910,550248531,550445125,-350623211,349765700,-413596106,693643330,-414310342,-357953752,-198626727,-1812055530,1028399648,844381004,1312503093,574311997,545988666,550314054,673220862,1496068696,1093413170,1075117312,545848838,1496078376,977349673,-416131040,1495284312,978970418,-353941984,-2095039982,1242894336,686246918,689498444,253817632,8600128,105846059,-555277247,1092651834,-1761614044,689639208,237030688,1308624146,-1744415723,745148192,545995281,-420993983,-853532126,105844256,547437088,403579017,6,1496062490,1093413170,1075117312,545848838,1496078376,977349673,-416131040,1495284312,978970418,-353941984,-2095039982,1242894336,686246918,689498444,253817632,8600128,105846059,-555277247,1092651834,-1761614044]},{"sector":4,"length":512,"data":[17717247,1411419904,1226859880,1344294210,1869836901,543973742,1886220099,1919251573,1836008224,243597421,546242562,1936876886,544108393,808463921,692267040,2037411651,1751607666,1112088692,1866670157,824209522,3225657,200375,1766596751,1936614755,1293968485,1919251553,543973737,1917853741,1634887535,1917853805,1919250543,1864399220,1112088678,248643661,546242564,1752462657,757101167,539905312,1377840707,1935764079,168753152,-585053952,549986362,974203921,253796384,-1088407000,288102432,985669690,1779376280,268439852,-2113926385,317147424,253807648,550058506,572664905,1694532410,-1157624817,548216890,979036737,1279346208,300369235,1381244986,-739818155,1279346208,540689747,1179012952,-1761614044,689114920,1331175482,-1629106,286206102,546650665,545857703,973196302,974251860,608715589,2237159,987050,1163075735,974251847,673221408,203986943,539558928,806101230,216475904,-853540816,253796384,-413910448,1295651855,608519247,576856807,1394644794,-1992669371,1969696,269468160,1226867200,-870313241,973737760,742990025,-2093342174,286259968,253807104,168766489,334255337,1176670522,540876849,1126182964,1297435727,538976334,538976288,843456544,941636896,1329799216,1313690956,268763170,546766866,4670803,1970204,1663180960,976317807,-15782878,1394644794,1140868933,-905959408,540676896,265166993,693430538,1329799712]},{"sector":5,"length":512,"data":[1314213197,1413563209,1397641033,1313164576,1912611413,-905956848,338433824,540693737,1126310033,1936682856,1852776549,1718558821,1701344288,1819239968,1769434988,574252910,1007721728,438356480,-385216724,-1860158892,540090912,1668506948,1953524082,544108393,1881171567,1919381362,2256225,4591815,265166993,693430538,540156448,544698180,1701736266,1699622771,1377858423,1769108581,1818326629,284033058,546373712,-385216562,572533076,1112088627,1699749965,1852797810,1126198369,1970302319,577922420,1511065600,-836726528,1424558607,874651689,1919243040,796091753,603988529,-1862245359,168807968,539579625,1411396898,1394623816,1129469263,1124082245,-1862242799,168807968,539579625,1327511074,1919248500,1919251232,1701013878,291504162,546373747,-385216562,572533076,1850023991,1919950948,1634887535,-1929371027,-905938927,974262048,-14642912,672082072,975787241,253807136,-384553966,974269524,1663180945,1667854184,3875429,7999908,-555277247,1092651834,572712740,237030688,-989855622,-1962902767,680722208,-416734143,550314002,-1616820,608250004,545864233,33294,8131042,1330454667,-417053372,539124258,1414275277,-1992683033,8523296,2098328576,-417054208,1093174271,739453988,1207970066,-1962901998,680918816,-416734142,-853525745,253796384,-413910488,985676305,286138505,-1590026240,-14644448,608315541,1007675177,-1608463072,978325280,336586580]},{"sector":6,"length":512,"data":[-1992638406,1117728,547437088,300373068,237013306,1375731842,-1996456174,7999008,-2112683520,1277201152,538502996,985669837,-836726496,1424558607,757211177,1297040160,1229870413,1230258499,1159745103,1145390158,975318304,975208736,545988769,-413905880,552542227,367481932,1277226784,689366868,237030688,975175910,545988769,317150284,-1927230176,34737696,237013306,976879626,545988769,-397128664,552542226,417748044,550314025,317148230,982589498,-836726496,693430548,1850286624,1768710518,1751326820,1701013871,1920213036,1734418553,577661281,-1944896512,1176537856,538109772,545398989,538109769,-1004789556,-2095039991,550117434,540676879,-1728110447,-383250648,1178216788,974251852,237013280,-1728053128,-1073704685,550117434,168766482,540693737,1428299921,542262611,1229342020,541345102,1263421772,545995298,350704716,-903820000,-384553952,-1860158892,1330913824,1330528544,1380272212,1296189728,1380274208,1095651155,1329799244,1414877261,2249285,9835464,739582154,743762196,546388498,1430340130,1095901252,572540244,546126395,973197582,1162892064,-417053627,-184540094,-905928685,338433568,304895209,572559674,1230127440,572545364,546126395,973197582,1380012064,609834057,2376423,11146293,739713226,743762196,546388498,1297436194,542262594,1109411407,542331977,542262608,1380010051,1163150145,992092242,237014330,1111097809,609440841]},{"sector":7,"length":512,"data":[2376423,11801708,739778762,743762196,546388498,1297436194,542262594,1394624079,542134100,1398032706,976953888,-787603315,1394620929,-417050540,-1325390782,-905922284,338434336,304895209,572559674,1380010051,1163150145,1159746386,1162823747,1330913348,1380143904,542000453,1311725864,992092201,237014330,540672465,608715589,2376423,12457201,168763594,1424561196,540676652,1143087249,543257697,1702129253,543450482,1920102243,1819566949,1495801977,539577903,-1925563614,30477856,609370938,2376423,13112600,1380130955,1310910244,552542242,-417050045,539127330,-1861345075,-1590026240,237014304,1493172704,-905915883,739577632,1329805844,1279870541,1126360868,976309583,1347676450,608453957,573317865,1380012265,609834057,573317865,1414087401,585704531,1407787564,2379860,14423405,1329799354,1279870541,1396776996,1188640,15078823,1414275211,-853535257,609046048,1699947239,1936025970,975319343,-703717235,549075457,1836016418,808663601,744827952,573713463,542327072,367984689,545980656,333927500,1310772512,585573453,544698180,1701736266,1699618931,1378841463,1769108581,1818326629,546126370,973198862,1663180986,976317807,741355571,574041189,542327072,371785777,545980666,384259148,1310772512,585573453,541411412,1381322579,975324483,-703717235,549075457,1836016418,808663601,744827952,1092624951,3219539,17045062,1394745530]},{"sector":8,"length":512,"data":[978211395,545398818,1347704143,1092637781,321069139,236343296,740346369,1778389548,1342248982,1163089217,1279346407,-1791343277,-1994348768,30150176,571900160,-417054207,545995486,585573442,550314018,81934,19666660,-1828773749,690242088,-853536026,-14644448,-2080429931,740573736,689056787,1141892905,237030688,975176130,1074667681,-1590026239,1109429024,-1761614044,539564328,550117581,680656684,317335825,-1858465236,572531232,550124091,680656684,317335825,301994540,-1862191593,739386144,976954434,1159760672,-417052605,539121954,1128603887,585573448,-853532039,321098016,992231980,1075258368,-14644479,689055907,237030688,1258291490,-1962849769,681901856,266742034,550314112,1398096208,1381295941,-1858452139,1479283235,608585295,392101947,608239956,673482215,304653567,304294953,393347113,545390952,538109769,-1828773684,690241832,1914157824,673221377,-14117377,608249987,304892204,266873129,552476703,1093174271,742992932,-420992750,254318335,539568397,-2080431889,740573480,689056841,680984551,539590415,-1710350131,400818177,545980796,1093174271,742992932,-1627886,168765590,550314025,1093174271,742992932,585574674,-167763424,-1862168553,679739168,1227629633,992547372,-1709703680,1226867457,-1541926400,-14644479,689055908,-853536282,19009056,-1374145024,1344310017,1163089217,1344326944,1163089217,1279346407,-1858452141,1479283235]}]],[[{"sector":1,"length":512,"data":[992235087,-1206370304,237013249,1610613026,-1744715240,745148192,-1155515887,546644026,545857703,973078542,237013280,-905969654,-1962816488,266851616,550314052,-903857472,738987808,978643225,572559648,1397311572,1330794528,1296126535,1363497504,1163020629,1213472851,-1858461115,-384512480,572533076,1314476865,1330792515,1398099790,1297040160,1229870413,1230258499,542330447,1346454593,777143636,-2128594398,-853975808,-719287551,538447847,985669837,253807136,304884748,572559674,1162092609,1162037590,1296651296,1414876997,1381123360,1210077775,1327518529,1381319491,776226130,546388514,1262570786,1431511109,1411401042,1210074440,1464095297,541413953,1126191945,1163022927,1498174531,546388514,1413829410,743462176,1162368032,1380982862,542331717,1163152965,992095826,237014330,540672465,11025088,30284131,428409000,608240081,975315687,585573442,1380137506,572712740,-374267846,-400277216,680984550,2690319,30546468,-555277247,545988666,585573441,550314018,536990222,-1960795846,680722208,-433511359,550314002,-1778442101,679739176,321659969,690557484,541331431,-1039261491,-1590026239,30543392,-1590026182,1092651808,-1644508,689514646,-1860121312,992231712,-1590026182,740346400,287871487,739437097,546388498,992092194,740346426,287871487,739437097,608320018,679739367,304882754,680722220,-366402494,1275078930,-1962814694,-400277216,680984550]},{"sector":2,"length":512,"data":[539561231,608248046,-1761614104,539564328,608313549,-383499545,1409295425,-1308503014,1828752954,-1073621478,550117434,202320914,540693737,1296965777,9517604,31464097,982596241,349053073,539579625,1344285986,1701011820,1970239776,1633886322,539782252,543452769,1702063721,1948284018,2254184,32119507,349053073,539579625,1881153570,1701736296,1667592736,1702259045,1852383346,1948282740,1830839656,1835361391,1919885356,453312546,546374127,1424561358,539107369,1769435936,543712116,1920298873,1952539680,1702043745,1919295604,1948282223,543911009,2256756,32774975,349053073,539579625,1679826978,778138721,1701336096,1919950958,544437093,1163152965,1869881426,1734697504,539913833,975314976,540709152,459866257,546374142,1424561358,757211177,1163022368,1176523603,1411395633,1330061391,542069792,1431192909,9517602,33561459,-787603315,460914689,9306627,34741146,-903857472,254546464,978643215,572559648,1129530692,1414547794,575557449,471584256,354470402,1424561196,546381882,544096546,1853453153,1869768803,1937076078,1836016416,1768846701,1769234787,1814064751,577465961,639368192,-836726526,693430548,1769415200,1646292076,1936007269,1818386804,1701344105,1700929636,1701148532,1752440942,587211365,-1862127588,-384512480,572533076,1701602675,1684370531,1919251232,1701013878,1684955424,1701344288,475267106,546374202,1424561358,1226973225]},{"sector":3,"length":512,"data":[1344294210,1330860613,541868366,1347243843,1380275285,1935745068,1819239968,1937207148,2063606330,-905821156,338434592,540693737,1109532817,543454561,1702125938,265173794,693430541,808465186,479854626,546374222,1424561358,1344413737,1953067617,-834985351,1424559631,574956073,1478278144,-836726526,693430548,1631855136,1646289268,577991785,235916859,992564457,-167758046,-1862114788,-384512480,572533076,1886352467,1953063456,-834985357,1424559631,824326953,1866735648,1867128951,745760110,1162368032,1431261984,574964562,1813844224,-836726526,1424559631,841097257,1699946528,1936025970,2240815,41295175,252649674,1424561196,546381882,1953517346,1936617321,1629500192,908092526,1819042080,1713403759,1948283503,1629513064,1702260578,494338082,546374272,1424561358,1663180841,1634885992,1919251555,1769239401,1948283747,1700929647,1886745376,1701407856,2036473956,497549346,546374282,1424561358,1948393513,1965057384,544367987,1679847284,1852401253,543236197,1835888483,1667853941,1869182049,-620748178,-1862101987,-384512480,572533076,1802398060,544175136,1701344367,1702043762,1667855986,1864397669,1868767346,1953853549,779317861,502333474,545981077,1162104653,1646454564,550314018,171534,43589159,336535754,1424561196,546381882,1970231586,1851876128,1818587936,544498533,1663053876,1836412015,1768169582,1634496627,1919885433,509149218,546374298,1424561358]},{"sector":4,"length":512,"data":[941760553,1868767280,1852667244,1936286752,2036427888,544825888,1936028272,1735289203,540100128,2257519,43720328,349053073,539579625,540165666,1868981602,1931502962,1667591269,1735289204,1852140832,1751326837,1701013871,-1224728018,-905798114,739774240,978643220,572559648,1397051984,1312890963,1162551385,1330913369,542066464,1293963092,576015941,517275707,1380123295,987686692,1380130955,572712740,237030688,975176351,9314465,437911552,43720328,349053073,539579625,540165666,1868981602,1931502962,1667591269,1735289204,1852140832,1751326837,1701013871,-1224728018,-905798114,739774240,978643220,572559648,1397051984,1312890963,1162551385,1330913369,542066464,1293963092,1819042080,1713403759,1948283503,1629513064,1702260578,494338082,546374272,1424561358,1663180841,1634885992,1919251555,1769239401,1948283747,1700929647,1886745376,1701407856,2036473956,497549346,546374282,1424561358,1948393513,1965057384,544367987,1679847284,1852401253,543236197,1835888483,1667853941,1869182049,-620748178,-1862101987,-384512480,572533076,1802398060,544175136,1701344367,1702043762,1667855986,1864397669,1868767346,1953853549,779317861,502333474,545981077,1162104653,1646454564,550314018,171534,43589159,336535754,1424561196,546381882,1970231586,1851876128,1818587936,544498533,1663053876,1836412015,1768169582,1634496627,1919885433,509149218,546374298,1424561358]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]}]],[[{"sector":1,"length":512,"pattern":-151587082,"data":[]},{"sector":2,"length":512,"pattern":-151587082,"data":[]},{"sector":3,"length":512,"pattern":-151587082,"data":[]},{"sector":4,"length":512,"pattern":-151587082,"data":[]},{"sector":5,"length":512,"pattern":-151587082,"data":[]},{"sector":6,"length":512,"pattern":-151587082,"data":[]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]}]]]
      • components.xsl
        <?xml version="1.0" encoding="UTF-8"?>
        <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
        <!DOCTYPE xsl:stylesheet [
        ]>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        	<xsl:param name="rootDir" select="''"/>
        	<xsl:param name="generator" select="'client'"/>
        
        	<xsl:variable name="MACHINECLASS">pc</xsl:variable>
        	<xsl:variable name="APPCLASS">pcjs</xsl:variable>
        	<xsl:variable name="APPVERSION">1.18.3</xsl:variable>
        	<xsl:variable name="SITEHOST">www.pcjs.org</xsl:variable>
        
        	<xsl:template name="componentStyles">
        		<link rel="stylesheet" type="text/css" href="components.css"/>
        	</xsl:template>
        
        	<xsl:template name="componentScripts">
        		<xsl:param name="component"/>
        		<script type="text/javascript" src="{$component}.js"> </script>
        	</xsl:template>
        
        	<xsl:template name="componentIncludes">
        		<xsl:param name="component"/>
        		<xsl:call-template name="componentScripts"><xsl:with-param name="component" select="$component"/></xsl:call-template>
        	</xsl:template>
        
        	<xsl:template name="machine">
        		<xsl:param name="href">/devices/pc/machine/5150/mda/64kb/machine.xml</xsl:param>
        		<xsl:param name="state" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="$href"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/machine">
        			<xsl:with-param name="machineState" select="$state"/>
        		</xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="machine[@ref]">
        		<xsl:param name="machineState" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/machine">
        			<xsl:with-param name="machine" select="@id"/>
        			<xsl:with-param name="machineState">
        				<xsl:choose>
        					<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
        					<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
        				</xsl:choose>
        			</xsl:with-param>
        		</xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="machine[not(@ref)]">
        		<xsl:param name="machine"><xsl:value-of select="@id"/></xsl:param>
        		<xsl:param name="machineState" select="''"/>
        		<xsl:variable name="machineStyle">
        			<xsl:if test="@float">float:<xsl:value-of select="@float"/></xsl:if>
        		</xsl:variable>
        		<div id="{$machine}" class="machine {@class}js" style="{$machineStyle}">
        			<xsl:call-template name="component">
        				<xsl:with-param name="machine" select="$machine"/>
        				<xsl:with-param name="machineState">
        					<xsl:choose>
        						<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
        						<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
        					</xsl:choose>
        				</xsl:with-param>
        				<xsl:with-param name="component" select="'machine'"/>
        				<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
        				<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
        				<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
        			</xsl:call-template>
        		</div>
        	</xsl:template>
        
        	<xsl:template match="component[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/component">
        			<xsl:with-param name="machine" select="$machine"/>
        		</xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="component[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class" select="@class"/>
        			<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template name="component">
        		<xsl:param name="machine" select="''"/>
        		<xsl:param name="machineState" select="''"/>
        		<xsl:param name="component" select="name(.)"/>
        		<xsl:param name="class" select="''"/>
        		<xsl:param name="parms" select="''"/>
        		<xsl:param name="url" select="''"/>
        		<xsl:variable name="id">
        			<xsl:choose>
        				<xsl:when test="$component = 'machine'"><xsl:value-of select="$machine"/>.machine</xsl:when>
        				<xsl:when test="$machine != '' and @id"><xsl:value-of select="$machine"/>.<xsl:value-of select="@id"/></xsl:when>
        				<xsl:when test="$machine != ''"><xsl:value-of select="$machine"/>.<xsl:value-of select="$component"/></xsl:when>
        				<xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
        				<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="componentURL">
        			<xsl:choose>
        				<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="name">
        			<xsl:choose>
        				<xsl:when test="name"><xsl:value-of select="name"/></xsl:when>
        				<xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="comment">
        			<xsl:choose>
        				<xsl:when test="@comment">,comment:'<xsl:value-of select="@comment"/>'</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="border">
        			<xsl:choose>
        				<xsl:when test="@border = '1'">border:1px solid black;border-radius:15px;</xsl:when>
        				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="left">
        			<xsl:choose>
        				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="top">
        			<xsl:choose>
        				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="width">
        			<xsl:choose>
        				<xsl:when test="@width">
        					<xsl:choose>
        						<xsl:when test="$left != '' or $top != ''">width:<xsl:value-of select="@width"/>;</xsl:when>
        						<xsl:otherwise>width:auto;max-width:<xsl:value-of select="@width"/>;</xsl:otherwise>
        					</xsl:choose>
        				</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="height">
        			<xsl:choose>
        				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="padding">
        			<xsl:choose>
        				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
        				<xsl:otherwise>
        					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
        					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
        					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
        					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
        				</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="pos">
        			<xsl:choose>
        				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
        				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
        				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
        				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
        				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="style">
        			<xsl:if test="$component = 'machine'">overflow:auto;width:100%;</xsl:if>
        			<xsl:if test="@background">background-color:<xsl:value-of select="@background"/>;</xsl:if>
        			<xsl:if test="@style"><xsl:value-of select="@style"/></xsl:if>
        		</xsl:variable>
        		<xsl:variable name="componentClass">
        			<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
        		</xsl:variable>
        		<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
        			<xsl:if test="$component = 'machine'">
        				<xsl:apply-templates select="name" mode="machine"/>
        			</xsl:if>
        			<xsl:if test="$component != 'machine'">
        				<xsl:apply-templates select="name" mode="component"/>
        			</xsl:if>
        			<div class="{$APPCLASS}-container" style="{$border}{$style}">
        				<xsl:if test="$component = 'machine'">
        					<xsl:apply-templates select="menu" mode="machine"/>
        				</xsl:if>
        				<xsl:if test="$component != 'machine'">
        					<xsl:apply-templates select="menu" mode="component"/>
        				</xsl:if>
        				<xsl:if test="$class != '' and $component != 'machine'">
        					<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
        				</xsl:if>
        				<xsl:if test="control">
        					<div class="{$APPCLASS}-controls">
        						<xsl:apply-templates select="control" mode="component"/>
        					</div>
        				</xsl:if>
        				<xsl:apply-templates>
        					<xsl:with-param name="machine" select="$machine"/>
        					<xsl:with-param name="machineState" select="$machineState"/>
        				</xsl:apply-templates>
        			</div>
        			<xsl:if test="$component = 'machine'">
        				<xsl:choose>
        					<xsl:when test="$url != ''"><div class="{$APPCLASS}-reference">[<a href="{$url}">XML</a>]</div></xsl:when>
        					<xsl:otherwise/>
        				</xsl:choose>
        				<div class="{$APPCLASS}-copyright">
        					<a href="http://{$SITEHOST}" target="_blank">PCjs</a> v<xsl:value-of select="$APPVERSION"/> © 2012-2015 by <a href="http://twitter.com/jeffpar" target="_blank">@jeffpar</a>
        				</div>
        				<div style="clear:both"> </div>
        			</xsl:if>
        		</div>
        	</xsl:template>
        
        	<xsl:template match="name" mode="machine">
        		<xsl:variable name="pos">
        			<xsl:choose>
        				<xsl:when test="@pos = 'center'">text-align:center;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<h2 style="{$pos}"><xsl:apply-templates/></h2>
        	</xsl:template>
        
        	<xsl:template match="name" mode="component">
        		<div class="{$APPCLASS}-name"><xsl:apply-templates/></div>
        	</xsl:template>
        
        	<xsl:template match="menu" mode="component">
        		<xsl:apply-templates mode="component"/>
        	</xsl:template>
        
        	<xsl:template match="title" mode="component">
        		<div class="{$APPCLASS}-menu"><xsl:apply-templates/></div>
        	</xsl:template>
        
        	<xsl:template match="control" mode="component">
        		<xsl:variable name="type">
        			<xsl:text>type:'</xsl:text><xsl:value-of select="@type"/><xsl:text>'</xsl:text>
        		</xsl:variable>
        		<xsl:variable name="binding">
        			<xsl:text>binding:'</xsl:text><xsl:value-of select="@binding"/><xsl:text>'</xsl:text>
        		</xsl:variable>
        		<xsl:variable name="border">
        			<xsl:choose>
        				<xsl:when test="@border = '1'">border:1px solid black;</xsl:when>
        				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="width">
        			<xsl:choose>
        				<xsl:when test="@width">width:<xsl:value-of select="@width"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="height">
        			<xsl:choose>
        				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="left">
        			<xsl:choose>
        				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="top">
        			<xsl:choose>
        				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="padding">
        			<xsl:choose>
        				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
        				<xsl:otherwise>
        					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
        					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
        					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
        					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
        				</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="pos">
        			<xsl:choose>
        				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
        				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
        				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
        				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
        				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
        				<xsl:otherwise><xsl:if test="$left = ''">float:left;</xsl:if></xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="style">
        			<xsl:choose>
        				<xsl:when test="@style"><xsl:value-of select="@style"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="containerClass">
        			<xsl:if test="@type = 'container' and @class"><xsl:text> </xsl:text><xsl:value-of select="@class"/></xsl:if>
        		</xsl:variable>
        		<xsl:variable name="containerStyle">
        			<xsl:value-of select="$pos"/><xsl:value-of select="$left"/><xsl:value-of select="$top"/><xsl:value-of select="$padding"/>
        			<xsl:choose>
        				<xsl:when test="@type = 'container'"><xsl:value-of select="$border"/><xsl:value-of select="$width"/><xsl:value-of select="$height"/><xsl:value-of select="$style"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<div class="{$APPCLASS}-control{$containerClass}" style="{$containerStyle}">
        			<xsl:variable name="fontsize">
        				<xsl:choose>
        					<xsl:when test="@size = 'large' or @size = 'small'">font-size:<xsl:value-of select="@size"/>;</xsl:when>
        					<xsl:otherwise/>
        				</xsl:choose>
        			</xsl:variable>
        			<xsl:variable name="subClass">
        				<xsl:if test="@label"><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-label</xsl:text></xsl:if>
        			</xsl:variable>
        			<xsl:variable name="labelWidth">
        				<xsl:if test="@labelwidth">width:<xsl:value-of select="@labelwidth"/>;</xsl:if>
        			</xsl:variable>
        			<xsl:variable name="labelStyle">
        				<xsl:choose>
        					<xsl:when test="@labelstyle"><xsl:value-of select="@labelstyle"/></xsl:when>
        					<xsl:otherwise>text-align:right;</xsl:otherwise>
        				</xsl:choose>
        			</xsl:variable>
        			<xsl:if test="@label">
        				<xsl:if test="not(@labelpos) or @labelpos = 'left'">
        					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
        				</xsl:if>
        			</xsl:if>
        			<xsl:choose>
        				<xsl:when test="@type = 'canvas'">
        					<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
        				</xsl:when>
        				<xsl:when test="@type = 'button'">
        					<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
        				</xsl:when>
        				<xsl:when test="@type = 'list'">
        					<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
        						<xsl:apply-templates select="disk|app|manifest" mode="component"/>
        					</select>
        				</xsl:when>
        				<xsl:when test="@type = 'text'">
        					<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
        				</xsl:when>
        				<xsl:when test="@type = 'submit'">
        					<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
        				</xsl:when>
        				<xsl:when test="@type = 'textarea'">
        					<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
        				</xsl:when>
        				<xsl:when test="@type = 'heading'">
        					<div><xsl:value-of select="."/></div>
        				</xsl:when>
        				<xsl:when test="@type = 'file'">
        					<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
        						<fieldset class="{$APPCLASS}-fieldset">
        							<input type="file"/>
        							<input type="submit" value="Mount" disabled="true"/>
        						</fieldset>
        					</form>
        				</xsl:when>
        				<xsl:when test="@type = 'led'">
        					<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
        				</xsl:when>
        				<xsl:when test="@type = 'separator'">
        					<hr/>
        				</xsl:when>
        				<xsl:when test="@type = 'container'">
        					<xsl:apply-templates mode="component"/>
        				</xsl:when>
        				<xsl:when test="not(@type)">
        					<div style="clear:both"> </div>
        				</xsl:when>
        				<xsl:otherwise>
        					<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
        				</xsl:otherwise>
        			</xsl:choose>
        			<xsl:if test="@label">
        				<xsl:if test="@labelpos = 'right'">
        					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
        				</xsl:if>
        				<div style="clear:both"> </div>
        			</xsl:if>
        		</div>
        	</xsl:template>
        
        	<xsl:template match="disk[@ref]" mode="component">
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/disk" mode="component"/>
        	</xsl:template>
        
        	<xsl:template match="disk[not(@ref)]" mode="component">
        		<xsl:variable name="desc">
        			<xsl:if test="@desc">
        				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
        				<xsl:if test="@href">
        					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
        				</xsl:if>
        			</xsl:if>
        		</xsl:variable>
        		<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
        	</xsl:template>
        
        	<xsl:template match="app[@ref]" mode="component">
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/app" mode="component"/>
        	</xsl:template>
        
        	<xsl:template match="app[not(@ref)]" mode="component">
        		<xsl:variable name="desc">
        			<xsl:if test="@desc">
        				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
        				<xsl:if test="@href">
        					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
        				</xsl:if>
        			</xsl:if>
        		</xsl:variable>
        		<xsl:variable name="path">
        			<xsl:if test="@path"><xsl:value-of select="@path"/></xsl:if>
        		</xsl:variable>
        		<xsl:variable name="files">
        			<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
        		</xsl:variable>
        		<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
        	</xsl:template>
        
        	<xsl:template match="manifest[@ref]" mode="component">
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/manifest" mode="component">
        			<xsl:with-param name="disk"><xsl:value-of select="@disk"/></xsl:with-param>
        		</xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="manifest[not(@ref)]" mode="component">
        		<xsl:param name="disk"><xsl:value-of select="@disk"/></xsl:param>
        		<xsl:if test="$disk != ''">
        			<xsl:variable name="prefix">
        				<xsl:if test="title/@prefix"><xsl:value-of select="title/@prefix"/><xsl:text>: </xsl:text></xsl:if>
        			</xsl:variable>
        			<xsl:for-each select="disk">
        				<xsl:if test="$disk = @id or $disk = '*'">
        					<xsl:variable name="name">
        						<xsl:choose>
        							<xsl:when test="name"><xsl:value-of select="$prefix"/><xsl:value-of select="name"/></xsl:when>
        							<xsl:when test="normalize-space(./text()) != ''">
        								<xsl:value-of select="$prefix"/><xsl:value-of select="normalize-space(./text())"/>
        							</xsl:when>
        							<xsl:otherwise>
        								<xsl:value-of select="../title"/><xsl:if test="../version != ''"><xsl:text> </xsl:text><xsl:value-of select="../version"/></xsl:if>
        							</xsl:otherwise>
        						</xsl:choose>
        					</xsl:variable>
        					<xsl:variable name="link">
        						<xsl:if test="link">
        							<xsl:text>desc:'</xsl:text><xsl:value-of select="link"/><xsl:text>'</xsl:text>
        							<xsl:if test="link/@href">
        								<xsl:text>,href:'</xsl:text><xsl:value-of select="link/@href"/><xsl:text>'</xsl:text>
        							</xsl:if>
        						</xsl:if>
        					</xsl:variable>
        					<xsl:if test="@href">
        						<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
        					</xsl:if>
        					<xsl:if test="not(@href)">
        						<xsl:variable name="dir">
        							<xsl:if test="@dir"><xsl:value-of select="@dir"/></xsl:if>
        						</xsl:variable>
        						<xsl:variable name="files">
        							<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
        						</xsl:variable>
        						<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
        					</xsl:if>
        				</xsl:if>
        			</xsl:for-each>
        		</xsl:if>
        	</xsl:template>
        
        	<xsl:template match="name">
        	</xsl:template>
        
        	<xsl:template match="title">
        	</xsl:template>
        
        	<xsl:template match="control">
        	</xsl:template>
        
        	<xsl:template match="cpu[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/cpu"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="cpu[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="model">
        			<xsl:choose>
        				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
        				<xsl:otherwise>8088</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="cycles">
        			<xsl:choose>
        				<xsl:when test="@cycles"><xsl:value-of select="@cycles"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="multiplier">
        			<xsl:choose>
        				<xsl:when test="@multiplier"><xsl:value-of select="@multiplier"/></xsl:when>
        				<xsl:otherwise>1</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="autoStart">
        			<xsl:choose>
        				<xsl:when test="@autostart"><xsl:value-of select="@autostart"/></xsl:when>
        				<xsl:otherwise>null</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="csStart">
        			<xsl:choose>
        				<xsl:when test="@csstart"><xsl:value-of select="@csstart"/></xsl:when>
        				<xsl:otherwise>-1</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="csInterval">
        			<xsl:choose>
        				<xsl:when test="@csinterval"><xsl:value-of select="@csinterval"/></xsl:when>
        				<xsl:otherwise>-1</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="csStop">
        			<xsl:choose>
        				<xsl:when test="@csstop"><xsl:value-of select="@csstop"/></xsl:when>
        				<xsl:otherwise>-1</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class" select="'cpu'"/>
        			<xsl:with-param name="parms">,model:<xsl:value-of select="$model"/>,cycles:<xsl:value-of select="$cycles"/>,multiplier:<xsl:value-of select="$multiplier"/>,autoStart:<xsl:value-of select="$autoStart"/>,csStart:<xsl:value-of select="$csStart"/>,csInterval:<xsl:value-of select="$csInterval"/>,csStop:<xsl:value-of select="$csStop"/></xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="chipset[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/chipset"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="chipset[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="model">
        			<xsl:choose>
        				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
        				<xsl:otherwise>5150</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="sw1">
        			<xsl:choose>
        				<xsl:when test="@sw1"><xsl:value-of select="@sw1"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="sw2">
        			<xsl:choose>
        				<xsl:when test="@sw2"><xsl:value-of select="@sw2"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="sound">
        			<xsl:choose>
        				<xsl:when test="@sound"><xsl:value-of select="@sound"/></xsl:when>
        				<xsl:otherwise>true</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="scaletimers">
        			<xsl:choose>
        				<xsl:when test="@scaletimers"><xsl:value-of select="@scaletimers"/></xsl:when>
        				<xsl:otherwise>false</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="floppies">
        			<xsl:choose>
        				<xsl:when test="@floppies"><xsl:value-of select="@floppies"/></xsl:when>
        				<xsl:otherwise>{}</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="monitor">
        			<xsl:choose>
        				<xsl:when test="@monitor"><xsl:value-of select="@monitor"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="rtcdate">
        			<xsl:choose>
        				<xsl:when test="@rtcdate"><xsl:value-of select="@rtcdate"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">chipset</xsl:with-param>
        			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',scaleTimers:<xsl:value-of select="$scaletimers"/>,sw1:'<xsl:value-of select="$sw1"/>',sw2:'<xsl:value-of select="$sw2"/>',sound:<xsl:value-of select="$sound"/>,floppies:<xsl:value-of select="$floppies"/>,monitor:'<xsl:value-of select="$monitor"/>',rtcDate:'<xsl:value-of select="$rtcdate"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="keyboard[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/keyboard"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="keyboard[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="model">
        			<xsl:choose>
        				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">keyboard</xsl:with-param>
        			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="serial[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/serial"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="serial[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="adapter">
        			<xsl:choose>
        				<xsl:when test="@adapter"><xsl:value-of select="@adapter"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="binding">
        			<xsl:choose>
        				<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">serial</xsl:with-param>
        			<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="mouse[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/mouse"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="mouse[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="serial">
        			<xsl:choose>
        				<xsl:when test="@serial"><xsl:value-of select="@serial"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">mouse</xsl:with-param>
        			<xsl:with-param name="parms">,serial:'<xsl:value-of select="$serial"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="fdc[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/fdc">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="mount" select="@automount"/>
        		</xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="fdc[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:param name="mount" select="''"/>
        		<xsl:variable name="automount">
        			<xsl:choose>
        				<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
        				<xsl:otherwise><xsl:value-of select="@automount"/></xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">fdc</xsl:with-param>
        			<xsl:with-param name="parms">,autoMount:'<xsl:value-of select="$automount"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="hdc[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/hdc"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="hdc[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="drives">
        			<xsl:choose>
        				<xsl:when test="@drives"><xsl:value-of select="@drives"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="type">
        			<xsl:choose>
        				<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
        				<xsl:otherwise>xt</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">hdc</xsl:with-param>
        			<xsl:with-param name="parms">,drives:'<xsl:value-of select="$drives"/>',type:'<xsl:value-of select="$type"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="rom[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/rom"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="rom[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="addr">
        			<xsl:choose>
        				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="size">
        			<xsl:choose>
        				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="alias">
        			<xsl:choose>
        				<xsl:when test="@alias"><xsl:value-of select="@alias"/></xsl:when>
        				<xsl:otherwise>null</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="file">
        			<xsl:choose>
        				<xsl:when test="@file"><xsl:value-of select="@file"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="notify">
        			<xsl:choose>
        				<xsl:when test="@notify"><xsl:value-of select="@notify"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">rom</xsl:with-param>
        			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,alias:<xsl:value-of select="$alias"/>,file:'<xsl:value-of select="$file"/>',notify:'<xsl:value-of select="$notify"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="ram[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/ram"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="ram[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="addr">
        			<xsl:choose>
        				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="size">
        			<xsl:choose>
        				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="test">
        			<xsl:choose>
        				<xsl:when test="@test"><xsl:value-of select="@test"/></xsl:when>
        				<xsl:otherwise>true</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">ram</xsl:with-param>
        			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,test:<xsl:value-of select="$test"/></xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="video[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/video"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="video[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="model">
        			<xsl:choose>
        				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="mode">
        			<xsl:choose>
        				<xsl:when test="@mode"><xsl:value-of select="@mode"/></xsl:when>
        				<xsl:otherwise>7</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="screenWidth">
        			<xsl:choose>
        				<xsl:when test="@screenwidth"><xsl:value-of select="@screenwidth"/></xsl:when>
        				<xsl:otherwise>256</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="screenHeight">
        			<xsl:choose>
        				<xsl:when test="@screenheight"><xsl:value-of select="@screenheight"/></xsl:when>
        				<xsl:otherwise>224</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="memory">
        			<xsl:choose>
        				<xsl:when test="@memory"><xsl:value-of select="@memory"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="switches">
        			<xsl:choose>
        				<xsl:when test="@switches"><xsl:value-of select="@switches"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="scale">
        			<xsl:choose>
        				<xsl:when test="@scale"><xsl:value-of select="@scale"/></xsl:when>
        				<xsl:otherwise>false</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="charCols">
        			<xsl:choose>
        				<xsl:when test="@cols"><xsl:value-of select="@cols"/></xsl:when>
        				<xsl:otherwise>80</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="charRows">
        			<xsl:choose>
        				<xsl:when test="@rows"><xsl:value-of select="@rows"/></xsl:when>
        				<xsl:otherwise>25</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="fontROM">
        			<xsl:choose>
        				<xsl:when test="@charset"><xsl:value-of select="@charset"/></xsl:when>
        				<xsl:when test="@fontrom"><xsl:value-of select="@fontrom"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="screenColor">
        			<xsl:choose>
        				<xsl:when test="@screencolor"><xsl:value-of select="@screencolor"/></xsl:when>
        				<xsl:otherwise>black</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="touchScreen">
        			<xsl:choose>
        				<xsl:when test="@touchscreen"><xsl:value-of select="@touchscreen"/></xsl:when>
        				<xsl:otherwise>false</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="autoLock">
        			<xsl:choose>
        				<xsl:when test="@autolock"><xsl:value-of select="@autolock"/></xsl:when>
        				<xsl:otherwise>false</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">video</xsl:with-param>
        			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',mode:<xsl:value-of select="$mode"/>,screenWidth:<xsl:value-of select="$screenWidth"/>,screenHeight:<xsl:value-of select="$screenHeight"/>,memory:<xsl:value-of select="$memory"/>,switches:'<xsl:value-of select="$switches"/>',scale:<xsl:value-of select="$scale"/>,charCols:<xsl:value-of select="$charCols"/>,charRows:<xsl:value-of select="$charRows"/>,fontROM:'<xsl:value-of select="$fontROM"/>',screenColor:'<xsl:value-of select="$screenColor"/>',touchScreen:<xsl:value-of select="$touchScreen"/>,autoLock:<xsl:value-of select="$autoLock"/></xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="debugger[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/debugger"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="debugger[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="commands">
        			<xsl:choose>
        				<xsl:when test="@commands"><xsl:value-of select="@commands"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="messages">
        			<xsl:choose>
        				<xsl:when test="@messages"><xsl:value-of select="@messages"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">debugger</xsl:with-param>
        			<xsl:with-param name="parms">,commands:'<xsl:value-of select="$commands"/>',messages:'<xsl:value-of select="$messages"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="panel[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/panel"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="panel[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">panel</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        	<xsl:template match="computer[@ref]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:param name="machineState" select="''"/>
        		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
        		<xsl:apply-templates select="document($componentFile)/computer">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="machineState" select="$machineState"/>
        		</xsl:apply-templates>
        	</xsl:template>
        
        	<xsl:template match="computer[not(@ref)]">
        		<xsl:param name="machine" select="''"/>
        		<xsl:param name="machineState" select="''"/>
        		<xsl:variable name="busWidth">
        			<xsl:choose>
        				<xsl:when test="@buswidth"><xsl:value-of select="@buswidth"/></xsl:when>
        				<xsl:otherwise>20</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="resume">
        			<xsl:choose>
        				<xsl:when test="@resume and $machineState = ''"><xsl:value-of select="@resume"/></xsl:when>
        				<xsl:otherwise>0</xsl:otherwise>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:variable name="state">
        			<xsl:choose>
        				<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
        				<xsl:when test="@state"><xsl:value-of select="@state"/></xsl:when>
        				<xsl:otherwise/>
        			</xsl:choose>
        		</xsl:variable>
        		<xsl:call-template name="component">
        			<xsl:with-param name="machine" select="$machine"/>
        			<xsl:with-param name="class">computer</xsl:with-param>
        			<xsl:with-param name="parms">,busWidth:<xsl:value-of select="$busWidth"/>,resume:<xsl:value-of select="$resume"/>,state:'<xsl:value-of select="$state"/>'</xsl:with-param>
        		</xsl:call-template>
        	</xsl:template>
        
        </xsl:stylesheet>
        
      • fd1.json
        [[[{"sector":1,"length":512,"data":[1183861995,1147495794,2118479,66050,1073770498,130305,65544,0,0,2686976,536870912,538976288,538976288,1095114784,540160340,6299680,65543,196608,655360,-50724864,-795951055,12441742,-530150020,612270331,-2013039105,-524802986,-1983869409,-1175483922,-1510801152,-528713238,-1898410465,14215376,1701147206,5459780,-1958328693,2123057238,-941936320,6307398,-398571890,946995394,196738865,2113125888,1604776791,440765222,-947713164,1031808544,1927771392,-1746382737,1095114752,1183711316,-1948569282,1183520382,1146522434,1476430312,102650482,12519199,-964056288,-972950015,1940778705,-754667260,266633448,1913649213,-1413467672,1474830094,1699422208,1818586738,1044811264,12507953,-1073107680,1212689268,-2129822069,-150929433,1246102503,-397650413,-445448138,218114536,1330594314,1919230036,805314930,-854143516,1370137,558843680,1586102304,59940,-617545632,281874100,1012313182,-1007454976,1397772886,-1430568524,609651285,829739652,762450893,-1437209727,-372168843,915219315,1552514461,240945420,1381652571,138709328,-1995811703,1150026844,-347950074,16781357,1515739904,-1970188206,1727404102,-235433702,410449554,-964111991,-909055610,1183500752,-18864104,-1193211708,1451885057,1930677540,-840683512,-346400749,190710664,-1064564877,-1911503744,-2091231040,-763166272,-411742464,1271095032,1162760773,1394614348,-1437248679]},{"sector":2,"length":512,"pattern":0,"data":[16777213,1610940480,8390400,184590345,-536018752,16781056,318840849,1611989312,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-533921088,50343682,855842865,1614086976,58734339,990093369,-532872256,67124995,1124343873,1615135808,75515652,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,100687621,1661345889,1617233472,109078278,1795596393,-529725760,117468934,1929846897,1618282304,125859591,2064097401,-528676928,134250247,-2096619391,1619331136,142640904,-1962368887,-527628096,151031560,-1828118383,1620379968,159422217,-1693867879,65520]},{"sector":3,"length":512,"pattern":0,"data":[16777213,1610940480,8390400,184590345,-536018752,16781056,318840849,1611989312,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-533921088,50343682,855842865,1614086976,58734339,990093369,-532872256,67124995,1124343873,1615135808,75515652,1258594377,-531823424,83906308,1392844881,1616184640,92296965,1527095385,-530774592,100687621,1661345889,1617233472,109078278,1795596393,-529725760,117468934,1929846897,1618282304,125859591,2064097401,-528676928,134250247,-2096619391,1619331136,142640904,-1962368887,-527628096,151031560,-1828118383,1620379968,159422217,-1693867879,65520]},{"sector":4,"length":512,"pattern":0,"data":[1112692052,538976335,541415493,225968128,1179731537,225968128,214609,156321,1296912357,541347393,5066563,1671188736,11851,-1297874944,2829677,87396,1162037733,541414222,5527636,1671189248,11851,1079771136,8464599,18427,1330927077,1128618053,5521730,1671188224,11851,-1417347072,9645642,67]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"data":[1329798123,1195984462,16777235,1962999810,1702065518,101124196,33752069,-1612519167,-1102067527,-141975666,-2135578338,84265100,98078208,-1064434136,-56232963,309100590,-1830325488,235842991,119473678,376086,1434472379,1481659851,50531105,1261724426,816337475,16669587,-570384684,-939523841,1124985855,1229344335,392007,33685760,-1672261505,-15846984,-855576389,1482398992,1997859511,45579,2077204264,2013259776,-840250624,-50219626,-369070360,131203406,1582354278,-218427540,1324601174,1190322732,-1778320666,913918270,783783783,874686215,-2020165338,-1647501659,1784878745,1392770996,1730084654,-872719616,-185924428,218066191,776996606,7937678,-2046425893,312557174,104539903,678756368,-234747284,69061394,313660476,789972687,-1217684985,-1007999232,520575231,1048653507,1968993895,1762191625,1342665918,502232474,61919064,-486482825,921220870,-83893590,822246633,-7983424,134275078,-854166080,-1073146113,4058996,41285490,2064650416,646458885,-1605608679,-619372957,1948254644,1965169335,-351834620,-14237206,-1658927826,222791682,36891135,-402504727,-385811197,-970063319,771772630,-466614723,-1007407905,-14229533,-850983542,-369565143,1864305075,1465274503,-1269606913,-1291798770,1532500743,1583308269,-915775331,-255387875,30992641,1397222272,-351945801,-1308349352,1275644754,-1307831956,1074842438,984749100,741611723,-886132196,606873632]},{"sector":4,"length":512,"data":[684401330,-1305727972,271633174,179450924,788805835,-11403204,-930341296,-425600882,104530431,712376808,-1982660724,-367620384,647334657,-459203649,1862674689,-1610638328,-100555529,1484130561,-316633510,-670687292,-1324036261,1344207625,1124090040,1896775807,-648511488,-508113121,-1089697490,-1626960850,1459604226,-351908674,173037127,92657353,1019228385,118418294,-1274957570,1745283842,-1100816894,-904198556,-1318386697,317454111,216788765,-568237541,-1732378601,1208304347,1887128163,-1784458671,-963361150,1887727266,83242623,-618498944,973621130,1719076095,31510936,513276870,-1796896429,1489402726,1425980924,-346466047,18997046,-32675958,-1961734261,-1047063465,-331902162,755924932,-1962842947,-1988252586,-1682697657,57739531,11838299,1482250877,-1928975522,1670507117,1282353431,-152337996,378220252,1858336907,-1058124018,-396947730,1515953157,91104922,60087302,793908400,-94790570,-619302837,657195230,1352487420,1834294866,280168028,922706206,-1660658397,-587047114,-675008855,1181886041,1576824839,-94873057,-1099337413,13344091,-385760944,1807423459,-1163510206,-1223658041,-619858858,-16381660,-370548153,1967914828,1625941757,-1089345281,162592784,552453366,-1157303947,-12184704,-11325321,-2011693107,1009788128,183349296,-2062020492,1958568233,34461220,-985867731,-1994434281,1397882623,-1976640719,-779154658,-1884363849,-386109448,1977483203,-85899746,393501174]},{"sector":5,"length":512,"data":[10574413,23658802,71368800,704905215,128,0,34,553320449,92786,13238272,12853385,12460169,12066953,11673737,11280521,10887305,10494089,10100873,9707657,9314441,8921225,8528009,8134793,7741577,7348361,6955145,6561929,39854217,57933824,2818048,4722427,5181179,7474939,9178875,10161915,11341563,12717819,15994619,21040891,22155003,25890555,28708603,31461115,33296123,35655419,38473467,39849723,41422587,47320827,53284603,55906043,58134267,63049467,66916091,67768059,68685563,72552187,74387195,77926139,78974715,83693307,87953147,90640123,93327099,106237691,107347968,76939264,110370953,117964800,119537664,138215424,142606336,175505408,183762944,220069888,222101504,227672064,241762304,242614272,257556480,315883520,357564416,365690880,366280704,368902144,11665408,24710996,30216020,31985492,33296212,33951572,36835156,37818196,1576788,2494329,5902201,398659449,417136640,416743424,415236096,407699456,406847488,405733376,405078016,435224576,506986496,502464512,494206976,492568576,490471424,489160704,485163008,482148352,480706560,479330304,476381184,475463680,474218496,464060416,446758912,540934144,534118400,559087616,556007424,638779392,633995264,633077760,626982912]},{"sector":6,"length":512,"data":[601358336,598278144,597164032,593100800,587988992,587137024,584843264,583925760,582811648,576847872,575668224,573374464,657522688,640352256,740950016,731643904,725745664,711065600,829423616,810483712,790757376,789708800,786563072,780992512,875233280,874905600,854392832,853803008,844103680,908263424,904200192,974127104,972947456,962920448,962265088,980287488,1087635456,463208448,455614601,455352457,454434953,454172809,453255305,452993161,452731017,452468873,452206729,451944585,443752585,443490441,443097225,442835081,442441865,442179721,441786505,441524361,441131145,440869001,440475785,440213641,439820425,439558281,438116489,437592201,1154687113,1153236992,1145962496,1132003328,1130954752,1123090432,1115160576,1112342528,1101660160,1168637952,1246101504,1273364480,1349320704,1346043904,1341849600,1340407808,1339097088,1333854208,1330708480,1329397760,1328611328,1326252032,1313275904,1303576576,1291714560,1289355264,1286733824,1374486528,1367998464,1366818816,1364656128,1350500352,1471217664,1465253888,1462566912,1460011008,1457258496,1450508288,1445527552,1444085760,1442578432,1440874496,1638596608,1688207360,1687224320,1741881344,1740242944,1728905216,1727135744,1724055552,1820852224,-2100690944,-2106195968,-2106851328,-2119761920,-2125594624,-2128871424,2145845248,-2044198912,-2073493504,-2075852800,-2077032448,-2079981568,-1969094656]},{"sector":7,"length":512,"pattern":0,"data":[-1969815552,-1970470912,-1823277056,-1824129024,-1818230784,-1641480192,-1646723072,-1651638272,-1672806400,-1691222016,-1693450240,-1401225216,-1403781120,-1406140416,-1407057920,-1435566080,-1438384128,-1451425792,-1388773376,-1389232128,-1316225024,-1301086208,-1235746816,-1240465408,-1241513984,-1248067584,-1252589568,-1253441536,-1137311744,-1145438208,-1147797504,-1069613056,-1074069504,-1076953088,-1085734912,-1088946176,-1106116608,-1115160576,-1118437376,-1121452032,-1122500608,-1011482624,-1012203520,-1016791040,-1022820352,-1023606784,-1029177344,-1029963776,-1035534336,-1041432576,-1047330816,-1048117248,-1052704768,-1065156608,-962985984,-887816192,-906297344,-913047552,-914554880,-948830208,-799539200,-801832960,1441792,2494337,4394881,8261505,9244545,16453505,18157441,252514177,265359233,265686913,267390849,294457217,-1482289279,-1481830527,-1481371775,-1480913023,-1478881407,-1477701759,-1475604607,-1474359423,-1472524415,-1472065663,-1471475839,-1468592255,-1467609215,-1464725631,-1464266879,-1463808127,-1462038655,-1460007039,-1458958463,7212929,7937185,40508577,41229473,73014433,73735329,4529313,6298983,8002919,8461671,16522599,17833327,18554223,11869551,12590465,22289793,23272833,699538817,700063135,-707650145]},{"sector":8,"length":512,"pattern":-1869574000,"data":[773884346,36443785,567095476,142987,2891403,748935822,705072128,639535360,1009682688,608093184,-1949857024,2147465688,1524870898,87565891,-847186315,-1982204032,-1191173106,-472711167,-2096577661,512358627,-628359128,1049356843,-8307716,124977408,-1996422977,-2126775234,1922539719,608043809,-1323601408,1206899460,309522235,1006386819,-1089571584,-281341952,-41220233,-2048326677,64981761,874416602,941525248,-85470464,-410266994,784348155,36439694,-1185672513,-819226720,1508420339,-431888155,2242303,2111231,1980159,1355669224,786763496,36445838,1286925451,-855488886,1431567137,-1962480501,1585906782,140412678,-1996333433,1589904478,105316102,-1222669786,-136064768,-1618268453,1585906188,-1654847740,-1869573949]}]],[[{"sector":1,"length":512,"data":[-1869574000,-1869574000,-1869574000,1085575312,-855637317,515490593,12226560,512634368,-370671060,243967,-22812592,11796480,-1023257952,45361357,-466479411,61374244,51118708,-855460669,684573462,382534068,-1073018508,-4716683,855829503,-1205943360,-661774199,201319400,-972524352,153350,-402599959,104005566,141886034,39257798,12511488,192155816,-968490824,268588806,-1476349975,-1207208928,113657088,-383778217,1084752032,12061556,1460061754,-1846984702,1946724352,1376187946,427100162,39272064,-401968120,1403191422,1427540226,8579074,1912602808,939571203,39257798,-1469846776,-164989948,67260934,1048582517,1946419799,5302282,-1996336221,-402500330,12058708,-1207733760,113646848,-352058793,1946396725,1376187947,427098882,39272064,-401968125,1403191330,1427540226,2549762,1912602808,704690179,39257798,-1878529277,38929968,-1021329357,-1900006626,74228184,74323595,-269958369,1427520511,-1559727358,378077779,734200405,453137158,755127574,-628948974,-1205943552,-661774199,201253864,536442048,-1120061,39261834,38934064,39257798,704658688,4007028,1025471517,443824128,1950679101,973094165,4001908,839611462,186043876,-1207732800,-842792961,-855526360,839283734,-350827036,-1957313550,1988843244,1381191684,50657030,-1960020992,-1031574700,-1702562300,276054016,-336718672,-1308512256,15462110,149623984,611140746,15462135]},{"sector":2,"length":512,"data":[554704580,117934118,1582848858,180829,1458342741,1342469771,-150580653,1946157828,1800702757,-167460221,1073781380,28313972,-336666958,-1965510144,135032132,-1006572562,639701022,1510410120,1566464091,-301989182,-528088853,15461954,-1018503034,116841267,1946313652,-1205976319,-661741568,-66060103,1960512420,-119362559,1465303839,-1207710022,-890764796,-1274611969,108331619,-402651720,243335101,-1006345292,857808958,-4396810,1672742646,-1107069950,-1343733760,-1017225217,-617413090,1672742646,1124168706,-1610565626,12173454,-1526980848,24435467,133751466,1465303839,-1207712582,1927808002,-989907969,-400482250,116850634,1946313652,1073790723,-1191199256,1458048770,-1017225217,-1964209323,11797574,-1006539032,639702046,1568614272,1426064066,1586162827,1862645764,-1006545176,639702046,1568614272,1426064066,-1957237621,-1937111946,76218522,10134656,33597823,-397342860,-1863712819,1878272,-2064251019,1946419361,-1545055993,-1870730241,470041847,-1006078976,639702046,-1962406016,-1047893164,-1040810204,-1274514048,16377856,-1953473557,1086453516,1007514624,-1157008113,-661912980,485212302,553918148,1008714790,-2096008702,71045315,-1014822286,1963408400,281248515,4243959,213386612,-1207702784,-930414576,108462074,-1325530136,663365120,-25171901,-169688834,-29824938,-1034068229,-1957363708,-1185458452,2126774288,-625279996,-1062015997,-922828406,1107356654,-1442780180,-625808158]},{"sector":3,"length":512,"data":[-1329548564,15461905,15461442,-321211734,548454578,1593895918,79846750,-326413056,-1006628679,-625343394,-1062015997,-922828406,637594606,-297597046,-253624085,-336719440,126494208,-1342116882,15461920,311901,508581718,-1910470216,1040631768,520094036,1344392536,545896478,113760398,21566,1583306783,-1990764853,-850128338,305040144,-1017225388,707013156,167782948,1162084608,4674882,270473,0,791644,0,2364517,0,4199610,0,4986641,0,333572,0,0,0,0,0,-1957363712,-61384980,110403886,-1064380274,147461772,147334793,147205769,1023986849,58064895,1342475425,76166911,146978846,304912976,-1432154239,-1407809272,1975651080,140568592,33965767,820877824,1659568128,136177808,-1945612824,-1077899560,12124792,-1143436287,12190584,26077185,33980035,-1365125260,-1308228856,146055944,145628868,147592843,145886859,76166795,-402241909,275972511,147334795,147205771,-4538317,20376063,146030219,147588750,-393214288,1048773602,1946159292,-1371618288,1031808520,-402230068,401082938,113716737,1738,-871971282,-970063866,1515014,76194192,-1593256285,-660405108,191162376,-401842712,-1969157235,-1944679676,206473988,2126784995,2105550344,443809797,1963277094,-1910110699,109838917,1508378978,130255875,-751075726,-947684748,-388308474,1802699857]},{"sector":4,"length":512,"data":[-1593835079,104531082,443877590,990153889,1963513862,-704198895,-248,1225034246,33980035,113723252,-63274,-1942552751,-1976107260,-1028121084,748310536,1494188306,-636757877,-1554964876,378079402,-186120020,-1365157626,-1979303160,-1593215740,104532144,1031013516,76156417,1979658985,-13768427,157431551,76166911,146978846,304912976,-1432154239,-1407809272,112846856,990424737,1963231750,145793289,76285499,-1964440716,125233406,-1593637912,378210474,1583286444,576093,145637060,637897254,-993262138,-1442267586,146540231,12779520,149070592,148905609,149167753,149423815,-637337600,149298825,148520585,148637324,-523124341,-523116335,-787947869,-205507607,152085419,147563054,-569492541,-385649144,-157089483,-333543160,-301560824,-266958584,-1983184120,-955715058,593414,113651200,-1577121588,-358414106,-197752568,32172040,150740617,150869641,150998665,150746763,148637326,638123681,1819608197,150224523,149816974,-1996037656,-1995897842,-1945565634,-1559689210,915081474,109971708,-23000868,1477384,67708425,1967841489,112654,-2097147718,109249222,-503183108,150905832,151000713,1024000673,1031012357,151914183,-1071448064,77673333,-200933111,150249736,150079035,-2064973197,149567115,149304891,109974900,-1960441636,-368671948,113705480,2318,-117484823,-2082960445,-472809501,152086527,1810367920,-1447302399,1282670720,1609042096]},{"sector":5,"length":512,"data":[-2084443391,50922046,915081076,619251974,104238079,17754121,148637326,1964475686,-65107169,150905096,1963402022,-366050339,1049297416,1044056298,124913892,-1425471839,-385912855,-1007091356,990447777,1963519494,149987605,-1593243485,104532230,108136684,150079035,922721650,922683656,-1205991162,-1706030838,260117036,-2139831797,1053034160,-471332602,37651200,678691593,-2080426519,593470,113707893,67854,-1075313488,-15800064,425603,-2136384395,-1341623296,11331591,-989922327,638125630,16001,292896717,21334822,-365068250,-1960442764,111346245,151560457,149816891,-257882507,151560968,151533311,151402239,151697438,304912976,-1039462527,112200820,151666372,-385849880,61931180,-385853976,11599524,-385856024,28376732,-385858072,45153940,-385860120,908852876,-561313556,-338492239,503571409,-427620134,-773402353,580160486,613190409,-2128166135,-855637954,638416191,1064579,638022656,1050254,-1007041544,150224523,149816974,1946185960,-467760333,106401032,149558843,-1910626441,-1995906530,38243391,-402307192,175308732,-2012902874,-970587065,-2095068155,101245958,149423871,452803,-385584152,244054974,719522024,-533281506,-398670840,208863116,-868384730,1149896309,92808708,-502872445,-526311448,149201672,149423815,113442816,-1950184418,-485955570,-533281518,1966881544,39074565,-964483468,536011270,206474014,1992628195]},{"sector":6,"length":512,"data":[92045320,990475264,990213436,141820500,-502872445,29982956,-1950152929,-1912014794,638116358,501759172,639857407,1976319360,71600669,-402290650,915080602,109971704,1019480290,-2012902874,-970587068,-1950102523,-485955570,-532772073,-502886904,76194056,76289675,-2096663377,-119405369,637977593,-773323378,130256126,-751047310,-1960384139,157459205,-1996296317,638122046,-1744484982,-1962345821,1946631384,1946696733,637935129,-1578617404,119473918,1015024498,637957580,-2012985974,-472834300,157591551,-1946198808,990153782,1963519542,-1976136891,-331990268,993751560,1929966134,-28645323,148637326,1964475686,-1976136953,-62658556,-389824462,451673897,144836295,-672661503,-1576614140,-2097151992,1963001470,105301765,922681344,922683746,-1205992310,-1706030838,260117036,150617731,-1962511097,1960446936,-397258661,1482358392,-636757877,-308672139,855638064,-1009634368,1342473889,150486667,-501314018,-399129592,-2144928272,108383292,637814154,1478427784,1912623165,-1610597089,3999090,840266432,-2036218944,-1610597116,1346226547,-1580961280,-1075116920,152059523,-1708231424,12525,152045255,243990529,-987887384,-2146901962,1996752252,641516558,1976319360,71600646,-2096789466,-404617530,-1010814433,149425803,-987883037,-1006051274,1031808572,-1979288116,-2010774460,113672965,-1021317662,1458342741,106335063,-904491270,-936998136,780925704,-1909585722,1376162846,-402266904]},{"sector":7,"length":512,"data":[367527280,-39655422,844808243,1048588022,1946158796,1221626627,1442485225,1465314443,512634398,1183516308,75931910,-2130405213,298510,650153474,1443470,775341094,-835286784,-804877304,-871971064,-939524344,565766,109981184,-1070397804,-164374386,-1190880065,-1510800896,-1910470216,507415512,-773336831,545896679,717150350,-1664646818,-1096440572,146756675,783002885,-1392066397,-1029493077,1413135878,-1526388545,1580121765,-1526387521,86032293,772115238,637977763,771900811,-1207515485,-1934944481,1595911112,46816606,116796928,1954547404,773769985,110370446,157419148,1776861836,1958743036,-1542550716,505209608,145110725,1963086907,641501964,1149765002,96871940,113673164,-1960842526,-485955570,918887964,1413155040,-1962117886,92939836,637813896,-2083781178,-354285882,-1572961505,326369288,-1977156725,654258717,-1983117882,-1945592258,-1995923450,520657950,-1405681717,-1439236344,-1363665400,-1205972984,-1706030926,260116987,292864011,145753742,147588748,1929108456,-1341748220,-1010824440,0,146540231,1317732352,-1542551284,-999955704,512297054,109840550,1397819560,126559750,259302190,38243110,259433262,259301678,76154427,772161653,259393166,-1929670680,846333888,76285499,-1070453643,33980035,1048787829,1962936508,1398474548,-1140406522,-1929379576,-1096612793,-1073312760,1053044232,367726452,-1003607061,101676094,1929072616,629810695,-872036826]},{"sector":8,"length":512,"data":[-1946046457,643499970,637880200,1493460872,1225180035,2045313908,1317782527,505733900,-2146928955,1946158460,-1908634860,367526468,1031808763,-1979288116,-2010774460,113672965,-1021320734,378130995,-1960441020,158776861,-1392489031,71025443,-964490380,-1175133692,-1070399487,38570691,1149955378,585380355,50560713,896844746,-242496002,-964567305,-13758331,-820990684,-317661168,1964012816,571548432,-1945009903,454137617,202446097,-1575941871,-1039029999,-1374619887,92939793,641483335,775688308,641467508,113740917,-62652,113738987,461636,-1946190871,1166681816,-1919707135,45679225,-1010171136,22907686,-1190954611,-905773053,2110006979,375041,1204013571,1569334850,-253526015,1965095808,-905756156,384518083,33945126,-347991947,100017677,1107784962,17167910,591528308,-1959496256,587940878,640449737,-2147394166,594788603,-1056242461,-478142997,117145799,-478145164,50036743,-75494028,-2146929661,57935611,637535757,-2147394166,45729763,-1057259520,79238259,-2131001344,-75494285,1225225222,1933638528,-905754367,178627,17167910,-1019149964,637534905,1963066870,-1178386175,-165281790,24381445,129549121,1103792896,113091,62456811,189047040,1946158909,57950441,50333368,1151452106,474379,1950406772,571605,-1019098485,-402287128,-1326972924,1053082373,-1977219958,1959541765,1959738419,1956396084,1956461653,1959607401,-1911652063,771817476]}]],[[{"sector":1,"length":512,"data":[113784575,-939079890,-402652922,-1892810222,-16332794,-385578490,1575682217,76154623,-1845063997,-1877046524,126559748,38767398,72846118,-1996191069,-1996190706,-2096853482,100962310,780369387,-1962802032,-1912303586,-1593535994,-1993997170,-1979252985,512475908,109970576,-1960442734,-16833273,-2096853341,33853446,76154623,1569334979,-771804671,-2082221597,33851910,76557955,-1874949370,-1845064188,76194052,76325291,76456363,-1014948181,-164756324,-2147038202,-1070397324,-343811954,126551196,520247179,-1996191069,-1006334954,637831742,16001,175390669,310745606,1654853505,-164707575,-2147038202,-2128199307,1950338365,1031808534,-1942718998,638149126,-1560197692,109839498,-389872500,535299211,18409472,-402634520,1048773726,1962870940,-1640053746,1031808520,-1610320436,-1012266852,567103924,77209225,-828259442,782444040,147890432,3187494,77078155,567103668,2812154,771780584,113772231,-389873661,434634893,113716736,1736,-850283269,-1742829279,-1709274364,-850349052,-1070349535,-327033717,-461175807,-1948741890,-1962469648,33602044,781231603,110370446,-1912300354,-1174893632,-1510800896,521598091,772054207,110364302,-217972551,512634533,-1909586284,-1962503162,236897251,-1900006625,110542528,-1106343122,-125063930,-1996125402,1166747140,38045954,-1526413693,-492058484,-1950146584,503617566,-628176244,-1064386509,772183742,113118859,653822893,1963087163]},{"sector":2,"length":512,"data":[71600912,1963277094,1185260808,535421510,1564026563,-1896713726,113673178,-1021322526,189146761,189273740,189410953,-1962641221,72321799,-1962518645,2139818615,141527820,-99596402,-1961207922,-321433,2013206135,309853972,-1912447093,-821787106,-935427282,175374598,1048784591,1946355400,1394528001,-1809936850,75021062,1200555913,72321282,-1996073079,2139687543,141527308,-1945221233,1200558151,340234002,-1944696945,1737038423,378468888,646646600,-1946481850,-2129966546,-16837017,76156671,1461634044,-544276685,-16749377,41287477,67487738,38636565,520040092,-1879439704,93258309,-851541970,359923718,74524288,113651327,1342179021,-466463149,1532892877,773807960,114034422,-818645759,-871464914,-164757242,-2113483770,-970057099,17222918,512634398,113706644,67754,145491655,-820051968,-871464914,-13729786,772194350,114036352,1048784386,1962936010,777199294,114034422,-1156156032,-611442551,1551122048,772436992,114034374,-350266494,512634526,2025522836,-1895331580,1334379079,106400004,-1995802743,1871252607,239570696,-1894758516,1200558663,373788436,-1994762356,-1896212377,-1962358250,-83310554,147205771,-871958994,1802862598,-871971282,-386170362,132708964,-1442396168,-956301048,568326,-1942552832,310745604,-861728895,1603948552,185565458,-1592625728,-397409140,1968701563,-1945748686,-336366588,-868810792,-1976107256,-1028121084,748310536,-1961918190]},{"sector":3,"length":512,"data":[1977224152,76325150,5367888,990410072,1946455046,-139531304,772320286,114034374,-1558385920,378079402,417859756,145662457,76154427,-1331572875,-1945748728,-1262062332,-1994273455,-1962633186,-1274766818,-400437936,501808529,519568381,1256786090,-1975612430,-1945727484,1031874052,1333010893,-851607258,642282515,281886081,-13745804,772196406,113772231,1441267713,110046971,1048643272,347735178,-164755596,17222662,1003195587,1963232286,922693361,-953284920,17221638,-43194368,-939094226,786164486,113903303,1195835393,637897254,1355548102,-13740282,772196406,113772231,1139277827,110046973,123668168,373015180,-529202036,76168763,643357301,-953285240,444934,116796928,-1023342900,-905511122,-13722618,-351881186,117386791,781977290,112205567,771758827,387858048,774468864,113903359,1951136896,782039076,113516287,1357679445,107382943,-13738664,772196878,114034422,-820349695,-1003552978,117321222,781981470,113516287,251539100,-342026466,-36967985,-1090517826,1555564184,-617406956,118414222,-1910528603,-58946109,-930305030,119471019,311235,-1207527234,857609308,650350299,108332347,-1510334706,505412517,-1957313785,509040364,-1962387829,-661976506,1452001931,105286404,15307418,-50040064,-66917383,206474232,1586370275,108432132,-1962391922,108202622,-117182205,-1527558322,1583292412,113754973,-43982,1412433607,-1950089217,-1588317674]},{"sector":4,"length":512,"data":[1439388720,-1205932917,508585635,-402229505,-899841071,-1957363710,820806636,1183651414,-241545008,370080513,1356088973,-83750502,108461838,-1341884673,-1070379008,60660304,-259322117,-2984193,295358582,185531138,-1173916426,-1031012353,1183523307,-263844882,1183519860,-1949158420,-1950338096,-919344546,-787234045,-4586005,1589808127,-1034033781,-1957363708,108462060,-8919026,108314635,-9967602,-14809109,2045249142,46816767,-326413056,1443032195,108956503,621037195,1183449087,1996431102,178184,80255568,-259322117,-1072970101,1317737854,-1193833474,-561293567,413850,177886720,1594817285,1575324510,1426065090,-14750581,635962486,840337919,1412473684,180829,-2081649835,1183649004,1239961848,1183668690,1441288436,1183537618,-129759752,33515137,8332799,1175052497,-79262977,-26836584,254148127,375040,1175052499,-96040194,-26836584,522584032,-28964608,-1258994038,-43613952,522583815,-773795584,165728736,1183513926,-2130660108,-132121498,-1191166171,-523042811,-1963178487,-388958394,1719730356,637526268,1174994975,-27882500,-1979955573,-1554763242,-443853776,-1957313699,82609132,108432214,-956014965,-352321273,1015039489,-2131069920,-176944836,16664263,-62470400,1290469376,-1711374719,1968142105,-58818297,1182243225,-1711374719,-2129890023,-1717961602,1015022965,-1959559371,1183579734,-1144441860,-1281753078,1375731945,-1744532912,56187801,-2083908648]},{"sector":5,"length":512,"data":[-779890493,-28407297,1190944393,2083536000,960266245,1015065214,-1962445824,130483294,1451950080,-62485506,1575324510,1426064578,-326898549,108461828,-402360577,1451884376,-62486018,242405899,-12778121,-1962445057,130483294,1183514624,1575324668,1426064578,-1957237621,-149021386,1979645956,71731980,989921061,-351177724,990153479,141820998,-2096904573,-545980356,-1744681846,46292318,-326413056,503871231,-16353537,580519030,990837509,544474182,1343457720,1412708095,-1200087064,-1588592639,347741312,98760448,-397386190,-443821327,442973,-2081649835,-1957276436,-1923742090,-11490234,1592263798,1346394575,-21784,1183646838,1810387116,190405071,1447065024,1353467533,1342179256,-1191211288,-1924136750,-397366202,1499057998,594919435,-28930730,178256,-9312176,637421195,378273536,-494855752,-1036255488,28837237,-1207047424,-11529308,-397134794,-1070368880,1575324510,1426064578,-1957237621,300614774,-14351221,105266047,-963967883,-964490517,-12811514,-1070339467,79846750,-326413056,1443556483,-62470313,1183514624,1412735752,478152447,-1172537183,-487129068,1348350469,1506928360,57982987,503367913,856192767,-929410880,-1961952508,2113866744,221558797,142016336,-378071064,-11075411,132646006,1975520255,9824515,-1172537183,-487129068,1348350469,1506910952,57982987,1459651817,1358317197,1342178488,-2080464152,1962931838,-159973529,-402229505,-259260595]},{"sector":6,"length":512,"data":[-1072970101,11551348,38046544,1358579337,-1996209013,-397345210,-997994857,-129594618,1945781819,-96040701,-25755817,-386238721,-1957167521,1177286726,1389507578,112720,91527760,-1679094021,-129594537,1347605043,1342177720,-83528550,-7870194,33310407,177886976,-15795451,-1961066482,1583348806,-1034033781,-1957363706,861361900,74907638,1506655464,-12060533,-14809482,-1705573258,251331915,745916219,503740159,1342231224,1342179256,-83539046,474382,1996428917,-1195893242,45633561,1268404224,1024391941,57933826,-1962933826,1566465990,1426064578,-326898549,-1957210622,-13433226,-1559738741,1344164916,1342178232,-83572582,-28931826,243122187,1343472056,1412708095,-378154008,1996423285,74907646,-1946194968,-1958482952,-359660,-1023998348,779452416,519993087,309334,88840784,71110395,-15436544,-14745994,1962869876,88840706,1144721147,-1090161662,48955393,1015283507,-2096663297,-16054586,1996470644,84581118,-16052485,-810018444,922701843,1709724724,922689141,1956271156,856619777,-1207702592,1583284225,-1034033781,-1880621050,-1256813655,473858915,478025985,1360631,-1023994252,141819908,18613959,250282027,18613959,116064306,18613959,1438842905,-950604661,220285446,-18432,908650576,-1207666945,-1202716384,-397410242,-259260679,20825739,-1206487808,-397410016,950206858,1742190676,74907472,10438042,1590070016,180829,1458342741]},{"sector":7,"length":512,"data":[558499527,-4718577,-471314177,74907445,1342251192,1342193336,-1946331416,1036422128,376766465,1342251192,-1560197656,-675785672,1996443751,-1622828540,-963969024,46292318,-326413056,1988843350,1979058948,-1958837494,57999403,184580329,-401967882,-1073008966,-1226237323,-1270971648,276103195,-1959637016,197626872,-1962574400,11594183,1333065227,1342314168,1660106495,184625384,-1203735360,-397384971,-1072995525,113718645,12721241,-1202667469,-1202713760,-1202711348,-1202713731,-1202716662,-1202716652,-397410300,-998018460,1968782350,35043414,10807376,-2090667101,2854206,548951156,922701825,-756526024,1958742784,1742190661,-20191152,980795403,475596487,-1070399293,190888016,350468176,192788560,702544,1357904,309328,1913579600,1007600771,-1207602087,216793087,1342251192,-1560262168,-1070377928,-1034068385,-1957363710,146691820,71731712,104005812,916673590,-149034156,22296070,-1592953856,-388934602,-1551629259,149640246,-783010143,1412867048,189712011,1591506368,180829,-2081649835,1465254636,-956008821,5518854,-1960776960,1149960828,-28931836,1586170859,-28901378,-1712834561,1338477567,-294273013,-2096707965,-613023940,1599354529,1575324510,1426064066,1996483723,-4921338,1946437179,112645,-1070398741,311901,-2081649835,-1705618708,251331184,-2130753912,6532926,-1348463244,-12174749,113641333,-352296017,1672454150,-956348792,-1607553466,1183326466]},{"sector":8,"length":512,"data":[-1371108433,1666909755,1572343669,1538805859,2028490851,-346465846,-1475228330,-1324715007,619237894,-339673597,67153922,-12174783,922697079,-1927912529,-1705988538,251331348,1353598605,1506408680,-964431733,1538807550,1183666275,-1847045968,113542093,259375115,1527105163,1538805859,552095843,1582913994,-1017256565,-2081649835,1465254636,1348710328,1506393320,-1202194293,-397384878,1599719857,-1202194429,-397384790,1599719845,1538848771,-1696051101,1183406537,63409150,1178336838,-1958511100,-953482170,738096779,1606844912,-1962087581,939476702,175711720,-2147125824,-277544900,-1207570813,-1957684806,-397393722,1499056555,-2011102560,76022852,1666955350,-912660400,1583307097,-1034033781,-1957363710,142016492,-394394904,1996488386,-10164220,-402229505,-1034060271,1397751814,503730769,-1118480554,-577888119,1413365379,-1223658496,-402410496,-822155969,45351095,1575302888,119496287,1482381658,1364414671,1444808274,-1984080553,870157856,-1145008448,-2144992143,113737511,87105,526278493,1532582407,12111704,-1977496269,1413522114,1413547719,28835840,-855592397,1816609,-900994992,1159104857,1413718868,558479374,1816656,-901126064,-1207516029,-397410269,-1990604243,-1554760682,-1207020486,-1202708198,-397410269,-997995989,922731270,922702917,465065027,417878016,113542090,1413232383,1413101311,1342186424,-2083911960,28837572,1075218995,-1021194924,558499527,113704961,2890841]}]],[[{"sector":1,"length":512,"data":[624082408,54329599,-2096663552,5521726,1458048628,1090963251,-1207959468,48955393,1355006003,106058067,1431787038,-1910470211,1583308253,1499072287,1439651931,-326898549,-164407804,12066795,870222660,105945801,28835840,870222660,1087013321,-1695141376,1616,100565830,280550524,1793609728,1451841993,-62486018,572766222,1095760,-915806128,-1274624893,-14562037,1996488310,1095932,-917116848,1577501827,-1017256565,-2081649835,1465274604,2117730099,-385646844,-1927937837,-11489210,-1399192458,1376747792,1948772432,-1929333271,-1705988026,6147,242597899,-1337553642,64199248,-1073017093,-1927923596,-11489210,-286783882,1979648801,9562371,1353729677,1353729677,10438042,74907392,-1337553642,281320016,1996427137,-1337553660,52226128,29322219,1493616384,-1207909348,-1924133460,-1202671546,1347420165,1342197944,1342187704,-1955747864,197561328,-2143978304,1962979454,74907413,-16573720,-1927936906,-1705988026,260116676,1183655915,1183666352,-1070378832,224049232,472639568,-963907445,75350027,216778379,11566720,1122567028,100710655,-443851169,311901,1458342741,279485015,-125104255,-352321090,1996430872,-1399171580,1376747792,2016667728,74760203,132892299,2130131782,1606431716,46292318,-326413056,16837761,8817942,1996443903,396466694,1347555201,-1586295576,-1432147230,8818021,1183535359,1241918214,-11517868,-325057418,-1979665366,-1238701546]},{"sector":2,"length":512,"data":[1220684544,-1874204592,-1034033781,1465253892,1665664711,1520500736,1443248980,-1593409964,1520653398,1415225684,1414137403,1252197245,1245610836,108331092,1414137543,1252065281,1409680212,1510357844,-1592623276,100881482,378229844,-802466726,1242956098,1245088596,114516,995497195,1968462390,178181,-1070398741,-11671472,1044072262,-427928492,1438867039,113765515,25416,855930623,820531392,46292479,1415225600,1414137403,1252068732,1409680212,1510357844,-402292908,200015708,1415198463,1342177976,-1006696728,-2081649835,1465255148,1415200395,-1990964575,-1070334906,-1989982045,113770054,1057098,475596487,922681541,922702934,1522029652,1253593172,-253210540,-1578071185,1178293322,-402295556,434896648,995383969,1460040903,-335580952,-28931319,1665664571,2028471156,1414177279,-1946401143,-1588307394,1183408968,-97282,-25095300,225707264,1946484355,100565768,-4287371,1606847487,1575324510,-1084795197,29229068,1444080384,-2129157734,-397389297,-952405655,-125107586,1446394694,-2081915308,75442431,49006475,378153136,-802542868,-1996635520,-1607800298,-695522581,-308100606,1980775466,-318323195,-308277206,-1979665366,-1238701290,1220684544,1599362211,-1957313698,-4303124,336108287,28839809,1415226112,-1705751901,260118429,-397125981,117440383,-2136925056,1358364,839246583,-1729605538,-1072997945,-4323980,-1204884481,-397410288,28871100,1944604672,-32577361]},{"sector":3,"length":512,"data":[-1946239512,1036422128,292880388,1415198463,-2129142886,73304847,1468598153,-2146500862,1095708,-1976899504,-2129307238,1590070031,180829,1458342741,1421786711,-352315969,105155358,1963345467,74907410,168150667,954748928,1448696260,1325442792,190760579,1608414719,79846750,-326413056,-1094822058,1425236,1149965803,71711494,1153894773,-956301310,1325400068,190760579,1609004543,46292318,-326413056,-1094822058,1425236,1586179819,138906374,1963476027,75399967,-1961265920,656838,96701264,-397410294,1499055002,74825739,183223947,1590068047,-831127797,1583333427,311901,1458342741,-2096859509,1815614,1149961844,71600392,856192255,-1276620608,1514440989,46292318,-326413056,1443032195,-2096859509,1946159228,96897834,-397410294,1149893750,1958742790,141885206,503739647,1183651414,-73772802,185565457,855930304,-1207702592,-1956773887,46292453,-326413056,1443163267,75402071,-1993729887,-1094779322,-62470316,-1226244075,142377728,-385649408,-397016921,-1072955501,-1662450828,1979648768,-963961250,1342179845,-402098945,243342677,33561324,857596648,501764288,403097480,-955493078,-971220730,1354773248,1342991544,1343007160,632082152,145882880,-1605310253,1519917799,-1605185533,1352145638,1342178488,-2090248216,-1952969532,-28931080,-1960175453,309703,774368955,108267323,-136166589,-13752341,1771623,4522051,671875145,670967814,-397006846]},{"sector":4,"length":512,"data":[-13434836,-397014037,99287076,-340078408,-61931755,-2090940797,1946221694,-12457725,-1560280648,1583305800,-1034033781,-1957363710,1342222572,1342201528,-402360577,-443825549,1415057151,180829,-1094756522,1424980,-947189013,1348388739,1325388776,-227150325,1218691123,1415095124,432015047,15204353,-1017225443,-1070167210,1480491801,1685323860,1415069315,-1961853183,6208198,-661921033,1416150915,1176597760,104580747,1148459456,2081881731,114179,1589298827,-1948059904,1757381592,-546045868,432027273,-1161393378,-487128994,1347709445,-397361101,-963961843,-150970694,-1948742686,-1554728313,-1075307750,479062102,-1957313698,1659667436,1187469142,-1962933856,-1339418562,1589137408,1183666176,-1394061150,113542081,454702847,-1994672408,-1548178874,1183666278,1894273196,-2091296319,40740926,1183648373,-722972510,-1605989891,1352812173,-397361101,-259261093,-1072970101,-397015180,-1041629464,-1602321664,863204608,-437759808,403097479,-401844950,-796153057,11847306,451387472,-805086568,-1268494176,-129792,259838011,451677825,-253230592,1354773275,-947508248,-954443514,1354773248,1342925752,1343008696,1342930360,631955176,145882880,-1605310253,1519917799,-1605185533,1352145638,1342178488,-2090375192,1497108164,1048791925,2098549848,1421786679,362694343,-2094667008,1962936444,6207513,1183667792,216551586,113542081,-51320746,1415055103,1325340907,1590068126,10387075,183227765]},{"sector":5,"length":512,"data":[1343012280,-397361101,1072195784,406751515,-1956749526,1438866917,-1957237621,401278070,-2096472437,-1962538426,126550615,1963480635,105265925,189662580,-1947896330,-1034068282,-1957363704,82609132,1623086934,71732052,872302217,-963961089,1342179845,-1710852865,260116652,-2098704302,-1796712852,1212056572,259326036,-397361101,-1072956213,-793246337,-952112198,1506374,2088972523,611581960,503609087,101041803,-396931072,-1072955527,1418400373,-1962636542,1468661342,-2096658174,1191640646,-2080616705,2122538694,-898301700,1583335307,-1034033781,-1070399486,-1558582621,-593290776,433759001,-1558589789,28842444,434152192,-1021721437,1458342741,-16484725,1458047092,108330934,1414674175,168150667,-963948544,1342180357,-397361101,1566466125,1426064066,-326898549,1577502466,-1962934188,-2145794018,1299447871,1414545027,508785920,922689107,-1205986858,-1202695076,-1706033151,260117850,-385923448,2122319292,443810047,-1258338678,-861714432,-1547685095,-995943968,1415488281,-384181597,28835964,1414570752,-346792285,-702641395,509465,1415317191,2122514432,1651834884,1415331459,507278336,434386687,-701038818,365795865,1183321985,90368255,16744064,1183455604,1208005887,857335971,434152384,-1558592349,45619674,-953488640,5529094,-1205867776,-11529103,-400959946,1499053751,-526139341,432317209,-1558586717,-1070392884,-4717589,1575324671,1426064066,-327029621,1465254662,16664263]},{"sector":6,"length":512,"data":[-91845376,432579580,-17135987,-1927686493,-1543636346,28842468,434283264,857327267,1414570944,-1705746781,260117512,-1272250976,-82408960,721466922,-195134,-1202433373,-1202716655,-1202716626,-1202716669,-1605348270,11807486,721163914,-1037369162,-1070378936,1668212816,-1912846711,1358756486,-1333240088,-91846656,-91846403,245502,-350626113,-963948946,-150993990,1120963554,721133634,50659508,-56602624,50377770,-39825214,1208005674,721199184,-1039990604,-1605353408,11807487,-216102064,21465642,-1974468428,11797319,112720,-85438384,138774964,1342185656,-5767448,-216102091,-1274574294,-1276620800,112820,-1467684784,185528195,-393316874,780402132,-1962650542,965318,-125050121,432195457,2013257611,-1271142392,-397361101,-963926060,208977931,1946157373,146721,887827060,475596487,1048772808,1946180983,1292293,314049515,558539520,113711851,13179993,558499527,216727572,475596487,113705162,1384778,-16353793,-1202433482,-1957691137,656839,96963408,-1957691380,1346388167,-402360833,1183407926,-1002535942,108331033,1414530759,1183514624,375290,774743995,125044539,-136166589,771799785,681983,67109120,553656320,791562496,791526190,-1959900882,1958742982,81164,37560692,-348687360,1342621515,-1207959468,-397410303,-1072956103,512440957,130423268,-2094339328,5529150,-2037568908,-1924071686,1358822022,1505530600,179801]},{"sector":7,"length":512,"data":[-1070395413,-49551280,176013323,33441479,-55121920,-259325205,1343865528,-1191392792,-397403696,-558302014,-1142403047,-1959859204,965318,-1039801609,-1410838503,-963950852,2080375613,-336186600,-1161393388,-487129074,1343865349,1325175272,46007165,-92372224,-385647616,-1027604843,-15930599,-622327691,-1537677134,-2129737853,1981406975,1161454,-2117146544,-386107649,1503310529,-2096135915,1946222206,-18422,1264838736,-1954838808,1583348294,-1017256565,-1094756522,-1472298156,863306349,1551122051,-402426880,2062060928,1425139,1170673131,-956301310,-2097151995,189685447,871331318,1414046656,-1705751389,257163784,1595312872,-1957313698,82609132,100712022,1840658175,1349003192,1505464040,-1241069735,-9951379,-9584586,-1704083914,260116620,-1979820407,-804520890,-1706018444,260116652,-1741100976,-25038709,510985728,1840527103,872314623,1877496000,-1205972971,-397383641,113710174,72319,-25092885,376770048,-1577058370,-200970828,475636481,1349003192,-397361101,-963943576,1575324510,-326412861,10546305,12539734,106334982,-1996208501,-1554756074,-12757940,184841727,-2094762798,1946158206,1279165214,142409812,-145470303,1414308824,1414413955,-1593279232,-654879666,-967553373,855683142,74856950,1605911925,1183666189,-1552208,-2091296327,1979647614,114195,1343058872,1353729677,1505356264,10742105,11552454,-1559869813,-1096738370,-1073345683,-385649299,-1477967731]},{"sector":8,"length":512,"data":[-18421506,-2097094935,2080375934,8120579,1343063736,1353729677,1505341928,108954457,-1106084096,-1833435135,1183666189,-1679273808,-346465863,229095510,-1337553584,-1181947824,-1927915175,1358913670,1414280959,-2129613670,-397389297,-2037553515,-1924071584,1358913670,1353729677,1505351912,189708368,-1177556912,-805086631,721439928,-2115481406,1619430896,1183666431,1139298480,-2141627975,1946202238,1354773290,1342918328,1353729677,1342929848,1342178744,1342180024,91551243,-352320072,309251,1617619024,-2129738621,1963327743,1312227085,1278672724,-237705132,2122578059,208928772,294531,2122516861,58654726,-1946303000,-1956749369,79846885,171868928,292880444,556678787,-2096466688,2855742,803734388,1048824694,1946165550,1969612803,-326412861,8973441,2022083926,568873215,-2114941959,1975177470,-1160726516,-1979824503,-2048263098,171868928,125108284,192329960,-1206880832,-397384779,1488498620,1827164260,-2096436370,36410174,-672660619,432662645,1458594792,2022083862,1996443903,114727428,1451819008,-62486018,-386926616,-790095425,775848729,91488289,-344659224,842957078,1969510433,1683535889,-1351948208,1348711864,-395437336,11569579,6207568,1415624784,-1191319472,-402209661,1452003841,-62485506,1575324510,1426064066,-1957237621,-131267514,409087,-661966729,-13704239,20045735,-147719118,-231602639,-315488719,245087793,1119754219,-1106056435,233508527,-351373378]}]],[[{"sector":1,"length":512,"data":[243842568,1639842795,-1070377458,1623386192,46292318,-326413056,10808449,1007304323,-1609927680,11822086,-338408728,-1472298224,108266093,556795591,-135790591,289388660,1821829200,-386957336,-739755393,21731892,-2065166508,978970676,-2081482776,3934782,-2037561484,-397344932,-2037666148,104595292,745890904,1342219192,1348753592,-10713459,-1200756656,-2096708477,40740926,-1548217740,-38252544,1488474212,1424511076,113542072,1342177720,-344656920,1942611996,1839742595,-1206750206,-1202716509,-1202690819,-397384616,-998000593,1575324422,-326412861,-1472298154,158597741,-402456088,-1075279555,1996430984,629252,-14807212,1872365174,-1961929728,197561328,-401900352,1055457051,-2007897873,-397015829,1048837825,1946316200,-2003507194,1586047976,311901,-2081649835,-1101658900,1996488703,-35002364,-1979820407,-801244090,1376416954,-63313840,-387387253,1590070134,-1034033781,-1957363710,82609132,1623086934,-1809922988,1606690308,-28931054,-1073979767,334168086,-1962781557,-27903228,1178273141,1325954300,190760579,-1947634177,-1956749369,1438866917,1465314443,-1207667061,-397384029,-125046786,-1072969845,-1548209548,1790464102,-387428268,-10921546,-400877002,1755517207,1715374420,1415624788,-213522352,443924491,1343101624,-397361101,199974664,1343109816,1348903864,-1101071384,-963966715,-1034068385,-1957363710,116163564,2123061078,-16892,16664263,1354773248,199902952,-385647168]},{"sector":2,"length":512,"data":[113705253,-58946,872062440,1347440832,261154896,1551122051,-402426880,-1205958663,-1706020632,257163273,-2129731174,-61437681,1039812233,1400242175,1979710083,33521989,-2096663287,5527614,113716852,13311065,-1202667469,-1202713749,-1202713088,-1202713731,-1202716667,-1202716662,-397410300,-998024012,1952005134,10217731,33441479,151109376,1996425707,-46143236,-16737559,-1259798922,-1160757774,2062091125,50299136,1460040969,-1946230552,-23140104,57982987,-1962342977,151072199,1996489789,-774337693,-1476448541,890778818,891041048,885798092,16416387,2122520182,276168956,-231681,-1863779722,-386888710,938177855,475596487,-1070399284,191608912,232110160,192788560,374864,702544,309328,1545005136,1007600771,-402295719,233568658,65795979,-939524162,18952198,1606847232,1575324510,1426064066,-326898549,-1957210622,-4324226,1036487679,41158915,1609041643,8579577,1839742595,-2096008190,6881086,2078802804,-1472298240,393544045,-1986547480,457047622,1029665792,125042777,1839742595,1460171778,-1953020952,-1202983952,-397344769,-947174330,1024000301,980877316,-472786805,-1649934546,-1489653707,-1154101707,1463139125,1040046312,510920965,1342177976,-1946328600,-2129400848,1963525375,-339725564,112643,-45291440,-963907445,-443851169,180829,1839742595,-401902592,1738209478,-401637104,1438872635,-326898549,-2147025072,478191900,-150989638,1580336610]},{"sector":3,"length":512,"data":[-1216747440,1975520089,1183651404,-1205972816,-397406631,1348056420,375443688,1353729677,-83635302,1975520014,220444685,-1337553584,1553918032,-2136924181,1358364,839246583,954749022,-1072997961,1183648629,1605914800,1961381899,-2146500612,1575324444,-326412861,1445260419,142510935,990791307,58460742,-2147446039,92044861,-352321096,-1983892734,-1924661690,1187503222,-352321288,537183758,-2012461430,1191117124,-2092546312,2081355902,-562655764,92933611,1183450248,21268492,-2142878137,-294322115,16678531,44043636,-1979414495,1149766726,-1958328831,1177226822,2130155782,-138245372,1079801382,-1946532215,1177226822,2130155782,1183399940,-92864516,-96040112,1342180613,-1912834305,860937286,1390956736,-1956749414,214064613,-1084795392,1166682629,-1962888182,138775280,-265617228,-1144616114,-140967922,1552065531,-487074933,1522961232,-140918229,-1554218434,-1023189896,-1973651805,11799365,-1240902262,1220684544,1552033527,-396589917,1048812375,1962958038,112654,599281744,1357402125,-1959662674,-346260938,495670816,-16549889,-1956850122,65262046,-10715106,2050424631,-2110324900,-20322212,1551540550,1552156163,-713046469,1438867039,-326898549,-1101572526,1149905413,-1979665398,11929684,-1991720405,1790508614,1183666188,-991407954,-1202103886,-397386618,-1957055891,994527224,561970814,-2046441589,-28955812,1342178053,1343876280,1353598605,1504827880,-739749799,-346465871,1552332813]},{"sector":4,"length":512,"data":[-1371108016,-1312495536,1790466393,1183666188,-1209511762,-1923524175,-1957646778,-1274574308,1944604672,-633437271,1182007388,-1554219871,934829270,1183666196,1357402286,-1923524174,1577299550,509694,-1274329974,-1963422976,11798852,28899371,-1923657728,-397365690,1348055517,-1371108009,112720,-1729632176,1149898219,1342223372,1342242744,-392556056,1583349387,-1017256565,1458342741,74877783,-351895925,708608018,1015027572,-1979288513,1963211269,-2142877923,91488317,1962949760,708608228,92934260,76173464,-805086568,-1070398348,28836843,1566465792,1426064578,-326898549,1996430864,1354773252,-263811760,-96039600,1591535696,1962934953,435075104,-96039600,-1315575728,-14788263,-1070398346,1183666256,1183666416,854085882,-263811743,1666365520,-9377712,74825739,199999539,1358579341,1348709048,-1946198552,46292453,-326413056,8711297,-1927915690,1358921350,1348710328,1348688824,1343877304,1343877816,375450856,1355826829,-83758694,1183651342,295325908,-1341195518,2105968640,2124650751,1557570396,-369983859,-2033844118,-167641219,1947265350,1023773473,1483997230,1965960765,-817445370,-972756097,-1585524922,104553686,326392956,-396943381,-1072955611,-694077836,2080783196,-16353956,-346237434,2114387786,-817445284,1557569917,-150991174,66096098,-10691530,-1973627386,76074822,-396994746,1499050155,995940001,2002549766,-2037574118,-11468930,-1191215690,-1706033136,251331485]},{"sector":5,"length":512,"pattern":-667035587,"data":[58048523,-35863,1996477046,34708176,1583288059,-1017256565,-2081649835,-145338132,542957062,-1205963520,860883886,-1578610496,-1547685032,2057526488,1551803228,-1554196829,-1209443110,1672460288,1666955344,1621354576,1558056577,-2034761704,-890744740,75400036,-1338215424,-1927917568,-1705988026,251331348,1353729677,1504692456,-1202261877,-1924113274,-397365178,-998001820,1958742790,-339725564,96897794,-11510650,-253229962,-396797521,-694026609,2080783196,-1207601572,48955393,-626802637,1958742876,1551671558,-2091067741,6084158,-164418690,-963963157,-150991174,-603585566,-773944484,-2145516573,1174899036,1557542459,922739836,922705110,99114112,-1547685029,2057526488,112732,1575324510,1426064066,2122574987,460587012,2114485888,1183519090,-754405112,105265896,28837237,855829248,-2145784896,1971128446,138840849,-388822863,1963345466,112645,-1070398741,442973,-2081649835,1465256172,100157127,1551540522,-375159,-1956849610,529266782,-16615425,-1956850122,-782444514,-2145516573,-13107364,-10716618,-396590538,915143391,113728728,270666,475596487,-622329813,-28931815,-557324208,922744971,1586191576,-14709768,922682231,512449750,-472818472,1551900163,922695679,922705018,-1662493566,768052218,557711339,-385649152,-661978614,-13704239,456906663,-667035588]},{"sector":6,"length":512,"data":[607981117,-96671427,-700654532,-667035588,-1153574851,1295893565,-12746435,-954433530,-853780218,340178944,1552332880,-128021680,-1274525814,328960,155683408,50659508,1354256384,683167744,-1779937280,200837972,-1586987777,347741312,98760448,-397386190,190427419,-1195870784,-11510650,-1070397834,74907472,-1553935640,556096734,2112768,512436597,529226880,-1199765562,-1202691158,-1957665966,-1956872162,-397393913,1499049455,-1389828016,-164406951,-16635159,1743259766,1975520253,-9967357,-333592,-1961066482,1036422135,58523647,-2097038103,57994239,-385744151,-4260023,33155583,1557544579,-385647104,-1628896785,-666991871,58654812,-16673559,-379791346,-660536947,104546396,58481878,-16678679,-379791354,-660536967,-2113520804,-385647268,-2103377555,-670684836,23325020,22839969,-1587750906,104553688,58547414,-1593749271,100883578,104553604,-696427306,22839969,-346260986,1557701069,1552156203,-346236765,1552064775,1557661185,1557675651,-1577944064,103373956,1048796282,2080398458,17819907,1551500999,115933184,-700546303,57999452,-1593770775,100752516,2057395416,-2079980708,-704234660,-1592754852,100752516,132865146,693928609,-1587750906,104553688,-260219690,-956248855,6084614,12839168,1557544579,-385646848,-694091591,-660387748,11528540,2113929091,-1946711262,-49722,-320273539,-16454912,-1587750898,100883578,104553604,-276931368,-2130671383]},{"sector":7,"length":512,"data":[16776806,201213579,-385649216,-397410183,-1990610833,753466950,206276,-1946401143,65262046,-1956872162,-13107425,-397345162,-1072956207,-660535692,48971868,-259276749,1031075339,-472785269,1551900163,939466635,-100609,-1427571594,1975520252,-336186588,-773944544,-2145516573,-14709924,-25755849,-386107649,-1072956275,914949748,132865240,-701088954,-1579516836,104553688,92101754,-346260829,1551540507,1552156163,1557661243,-660533633,-2079970468,-2113535140,1551541084,995916449,58063430,-1711498007,1552039671,1551504937,995916449,58063430,-386103063,2095708219,1606847484,1575324510,1426065090,1465314443,-16222465,1996424822,-61544444,-166989685,-1696005251,-773944576,-2145516573,-2145416356,1568439871,-472785269,1551900163,2139168651,1965960705,1666955297,-1423972272,1341688665,1666959233,-2127025,1522591799,-193675254,83398,45621227,-561295327,503571409,126573696,1538805824,2078822499,1348032938,1504343528,142016345,-386221592,2146039873,-2034753793,-1346875300,1538805859,-1070378909,-957853616,-773944486,-2145516573,1074236252,1552332880,-1438586800,79190361,-1962743040,1566465990,1426065090,-326898549,-950577564,65094,117440307,-2136925056,1358364,839246583,-1058516898,-1072997971,-4323724,22145535,294531,-14799756,-1070398346,1183666256,1183666414,-471314184,1558094679,1946158249,-297366266,-134330743,39640582,-1929153536,2122578046,192151560]},{"sector":8,"length":512,"data":[-16222465,-2065167754,-10921558,1996425846,-25755898,1563551831,-10690909,-2034759050,1760055388,-1587979862,556096734,2112768,79562357,14805248,103531659,-1207631824,-754667024,1551672296,-729030447,-494153685,-2136750965,1551671644,-150991174,735349730,-1948087344,1557963716,-1172537183,-487129068,1348350469,1504511720,175489035,-402098433,-1072957034,-4323723,8579583,1342178232,-1200676888,-397410303,115905750,478192119,-150989638,1580336610,-1395529648,1958742873,-16891,1996444139,108461832,-31463337,-963907445,1962935357,1342222398,-1639543530,51681872,1183649531,1659392158,1183406505,-2034741092,1183666268,-35106658,113542060,74760203,65781811,94127755,-11510650,-1998058890,-1202103895,-397410301,2090954564,-754667172,-1950088224,-2146500640,1606847260,1575324510,-2097149758,2855230,113642612,-972933666,37084934,-627044117,-1576860631,-610257442,-1576926167,1455633887,558499527,65732609,-401337112,-259320986,-12728693,200373503,-1207601674,49020927,-882981237,1241958230,-402652895,-259320847,-12728693,-940280577,505174278,1590070016,-326412853,116873046,8395500,29230452,-15013120,-1205991818,-1706009376,250347676,1348264120,1504218344,-964431733,702324745,-125108044,-1272325472,737684224,1048795134,1946168209,178181,-1070398741,519570271,1348264120,445331199,445200127,1342194872,-2091569688,1736510,-189266572,-1207702783,1174602528]}]],[[{"sector":1,"length":512,"data":[475636486,1558218182,1558231040,-1473255344,-336557223,-528169466,994451548,-1191805705,-628335392,-883073441,1458342741,-67352,1996424822,5289988,1370351696,113766539,1973337,2113928835,1989826055,1495113518,1979711107,-18427,1996425451,1413801988,1566490675,1426064578,-1957237621,-14809482,1996425334,80255492,-259322117,478154495,260044299,1343610808,-402098433,-4698044,-1962742785,-1034068282,-1957363706,1357677548,1493616470,-1207906788,-1202711057,-397386457,-1072955530,117393269,-2136925056,1358364,839246583,-1259843490,-1072997974,1183656821,666390704,-1070378915,224049232,-54794160,-963907445,2113929021,-2146500853,1989826076,1495113518,1979711107,-2146500855,-18404,1183648747,861294768,1525174464,-443851009,-1957311651,1357677548,1493616470,-1207906532,-1202711034,-397386457,-1072955650,117399669,-2136925056,1358364,839246583,1021857886,-1072997974,1183663221,666390704,-1070378915,224049232,-62658480,-963907445,2113929021,-2146500853,1989826076,1495113518,1962933891,1183651353,-744861520,185531139,-1928039232,-397365178,-1073000411,251595125,-4711296,-1928532993,1448128582,1342178232,1593755880,-883038837,-2081649835,1946159742,172395311,-1961196637,-2120021946,73319450,445318796,445193865,452992652,452855495,-324986239,-10541798,-1560133619,283843308,452992652,452855495,645995141,-48293140,444532423,-1034092544,-1957298168,-1976970698,161612612]},{"sector":2,"length":512,"data":[71600666,-1978004830,195166788,88377882,-1961227102,-1973048290,437101063,-1576974454,112728590,62410752,163074074,-1058516966,113542054,1342179000,1343880632,1343883704,-2086228248,-1205991740,-1706026270,496970993,-1017226919,435750598,1683005520,-1592132958,-358390777,-1858174182,527695915,-408813392,451322394,-31852128,451453640,451348166,435855361,-375194108,-1608455398,-1057084966,-1608849758,-1057084965,-1608849502,-922867236,-1608849246,-922867235,-1021646430,-1275051,1996424310,-491250170,-157659110,-1960992980,79846885,-326413056,503609087,1343939256,-1624441958,1575324445,1426064066,-326898549,-164407728,-397359477,1996450896,108461832,1722005534,1458301008,813023243,-1337553642,142016336,-402229505,1183666657,-85438288,1975520010,2001940,-33110245,-2128968422,521858086,-339725315,33603100,855930623,2011713728,454730751,150999528,-400888778,28850782,-443851264,442973,451683969,-943456289,18592774,470218496,1946159131,472285455,-2113931493,-15012826,125167,-2561853,-397361101,-1072992852,-4715148,2062045439,1343991860,-1023165976,-2081649835,1465255148,-1107001717,1048794302,1946178636,1278672677,279747156,1347555201,1722005534,1369827408,242597899,1414412031,-397361101,92929770,96929003,1170669566,-947714814,1480491779,1500774484,50218695,-62470400,1206583318,556163,-1548208268,-963948442,1342179845,1503946216,1975520089,1518109476]},{"sector":3,"length":512,"data":[1443329535,-387918360,1150025538,-972715686,-2096889275,1183450055,1564772606,-335657217,1564788228,-61931776,-2090940797,1962998910,-16398413,-1956749313,46292453,-326413056,2123061078,-1961039100,63341559,76221931,74777915,-129849,-2096904573,-294256836,-2096904317,-545915075,-1034068385,-1957363710,49054700,-1094822058,1279165268,192151636,-16490869,-29497289,-11252061,-1394080650,1490943,2088778731,829685853,-1268956022,62539776,-1948059904,73270232,-2080481655,108396095,-512300970,1586172907,-398983170,1149894147,-27358456,1149831051,-964472998,1979648862,-1956749375,46292453,-326413056,-1962385781,105265927,1183516022,1560740100,1426065090,-326898549,-1957210546,2123039862,-1203335928,-1577171319,103488270,-969204968,1152913267,-1070378986,1270278224,-1276526541,-1203335936,-26941360,453648068,1183637251,-1268872778,1404466943,-1950984565,1388708803,454598992,1346422571,508520424,-16353537,1996469878,1508398772,406192463,456833051,-396994736,1018756983,1448562715,-1191219480,1464867610,-10098602,11683527,-1961760000,-523128250,1343962629,1357403735,-1303969793,78806659,243394930,531228,451683969,-68620321,-15930569,1448607350,-2080428312,-1962672570,1065614942,-1913883137,-397363130,938016428,-16332847,-956300952,1815558,112640,-443851169,442973,-1094822058,1490772,2088769003,192151645,-10861369,71601151,1325941897,190760579,1609004543]},{"sector":4,"length":512,"data":[1465303902,-1084965186,283836438,6126720,1149961844,71600392,1590068047,-327811317,1438867039,1183509643,1342223364,1504072424,108461904,-1952329240,1958743013,112645,-1070398741,311901,-2081649835,-1957296404,-1956808394,169788614,-1932000485,1586101830,-79247620,1187416832,454559291,1187382898,854262010,-237884,-1977156538,-96040953,75309116,553273030,553287296,2122319477,175382779,-16497013,-1073019826,1183451252,-79263494,1183498219,-443851014,180829,-2081649835,1465256684,454702731,516212363,-670885110,-1979824500,552336478,-61931698,654073540,1183319946,108462071,-386435329,-1072955583,-12188043,82574406,-596249077,1568224905,1586233139,-1945690616,1586100806,-1004016648,-1977156514,-146372601,1190938367,-16353537,183039862,1958743039,-146372072,653811396,1191118728,909854712,91429656,1912897083,-128006962,509478,-443851169,442973,-2081649835,1465272044,1354385037,-1929627160,-1916563757,109886046,512301876,2122324786,141892356,450823879,485228288,-16482688,1183460468,-542926844,-1643722982,-1979711461,-1449655226,141885184,463341255,317390850,-16496906,113708148,72606,1187382507,117381892,516168832,503520010,-970581224,-2136925689,1358364,-661921033,1580763079,-1947664385,512401914,-150973766,-1948742686,-1553985145,297278234,968380416,-1969139685,1161758,2013651703,15224927,113542049,-1172403551,-487129082,-2020878197]},{"sector":5,"length":512,"data":[378216092,-494855444,-1039400977,-15012701,-399911370,-125069515,-397361101,28871372,-1612165120,770199690,454730123,454559291,413206134,454730523,475596487,-1205993442,-1706026270,496970988,-259303079,142407179,-472785269,486848395,451683969,116915647,72476,1183655540,32002234,472285692,-939524581,1815558,-16333056,-402652824,1048825466,1946180724,-347281405,-1590357528,347741312,98760448,-397386190,190423775,-385649472,2122383108,1333009156,-12728693,1027962111,125042689,1946157629,-1203967190,-1202692611,-1202711012,-397410272,45678050,-890744832,-2031595497,-1947169841,-49722,-974584964,-401282050,-259294597,-12728693,-385647361,65797812,855965886,-1008185152,1374179465,1122523018,1354773398,-7742488,-954433522,1782790,839304960,-1962934245,-1956749370,46292453,-2091428352,1812030,1219758196,1568675467,1583310797,-2091428157,1812030,1202980980,1568675467,1583310797,-2091428157,1812030,1049303412,-164422744,-561312277,1152697226,1568675467,994469837,1609528055,1465303902,463879811,-1274514432,-2146006203,1600638301,-1957313698,149717996,-1430300842,445489435,-1980086647,1048836166,1946164134,-1898237144,27179971,-1106801114,48955402,-24950970,638022418,87688330,-24907148,-955550702,1811974,-129579264,1048772608,1946164134,-851266486,868453223,-1710313006,60735,-1979820407,1452014662,71731974,1929270843,990213907,209124422]},{"sector":6,"length":512,"data":[-1946265973,1451883590,71731462,871909003,106314706,91688306,1979991611,71731974,-386382199,-930385964,1006257803,-1996261695,1183578702,-129614854,-1918694538,-1509505254,-352321509,-129594577,-1961194077,246500312,-1270617133,-1989685949,-1994676194,-396525546,-320274725,-851331842,869501799,2098629056,1568383837,-443851169,311901,-1275051,1996424822,1354773252,1354623056,1560692363,1426064578,-326898549,-1957210544,1606289022,140413707,1946173312,-336360700,-1705566630,251331539,74760203,1273755531,743390848,505246720,-1337553577,-1648236464,-1202693799,-397398961,-1705967706,251331539,611696651,1732460160,505443328,-1337553577,-1650595760,-1202693799,-397383869,-1705967742,251331539,57982987,1454405261,-402360577,1499045247,-443851169,442973,114262,464797315,-950242048,-803448570,1354773248,1342925752,1343285176,1348903864,1358954424,1342930360,1342178744,1342180024,1342178488,-2092706840,1033376452,628359195,1946177085,5848344,468386420,1023629288,91553793,-352321090,-336186622,-136583158,-335912472,-1946799358,1438867142,1465314443,855932555,-7804682,58048523,-956263191,-15001082,470206463,-402653157,1031850568,-385649408,1461584076,-83635302,1975520014,10479875,558499527,-4718582,669536511,-2147025146,478191900,-150989638,1580336610,-1616779184,1958742873,-2146500857,9627932,857411233,1779842002,1967027970,1745238790,-952731902,-786671354]},{"sector":7,"length":512,"data":[1354773248,1342925752,1343605176,-18345,192788560,374864,702544,309328,1124001872,1007862915,-1207536551,-1897267201,-11067904,505089590,1343953080,453785343,453654271,-83835494,-2081387762,6059070,-2081946764,-2146500633,-1107039460,-24969215,-955747071,1775622,-2093749504,242549502,1343602360,-397361101,-1070381992,245449195,1003631387,1996646934,990278929,1996646406,453943561,-1543504379,-396944616,-164378039,516166123,-2144986358,108337720,454571657,994445291,1914378294,-112793367,1593835960,46292318,-326413056,-402229505,-960999365,-1430761457,-1259843485,-1733733,1189610614,79846736,-326413056,1448275075,74877783,558499527,-4718583,-202878721,3964932,-1598093707,9562379,-929409506,-1458636031,108265473,-385089601,1048772735,1946168207,1183667742,-1662496592,1183651583,1956270256,370080513,1353729677,-1650829794,504298241,454598998,922701888,922688268,312089354,-1995506943,20819526,-1090161408,971705289,44990083,-574683787,-2094077173,1963175550,200195845,1048781803,1962941364,-73771507,1375731735,-921049008,-397015829,266914137,-171972560,-352321096,-1070377207,1127409744,1583333427,-1034033781,-1957363710,1988843244,1174530820,1948269696,3965178,28837237,1447291648,-1454423320,343212046,714749183,185531138,-1207601984,48955394,652984371,-1717938658,185531138,-2146142784,343146556,973175936,889130613,-83744102,-1207571698]},{"sector":8,"length":512,"data":[48955394,1566490675,1426064066,-326898549,1996445264,-43259900,-963907445,1979711293,-373279995,-167051119,113716341,6936,374341808,1353729677,-83684198,223655950,-1337553584,-1719343024,1183668569,-722972496,114223,1996426475,-1337553660,-1708267440,-1548199591,1183666278,1167741104,503316639,1348903864,451950335,451819263,-1624341862,147096349,-1204811544,-397344769,-1070388879,1347440720,-2114777624,-551883738,1354773503,191005672,-1341623104,-1746382821,856091640,-2048372544,1590070112,-1034033781,-1957363710,1357677548,1722005590,1312680016,1343993528,1348686520,1503233512,1958742873,11528451,1343052472,1348709048,1503228392,1958742873,10217731,1348903864,1353729677,1503235816,1493616473,-1207905764,-1924131586,-1202671546,-1202716665,-1202716669,-1202716592,-397410264,-259309632,-1072970101,1183651708,-1070378832,1522028624,1659392013,-1947169810,2109737926,-97522,-1070398347,-963968277,369141481,1353729677,-83635302,1958742798,-1337553648,1112008784,91602955,-1997946829,-1337553664,-1337553584,-1622828464,-1927938048,-11489210,-15011786,-1709511114,496971394,-16202621,-400888266,-1072956081,922698612,-1548215570,-1209511834,190405016,505246912,1348903864,451950335,451819263,-1203425048,-1202690397,-397383949,1499044039,-1204894488,-397344769,-1662507010,-164960013,-352321096,-1548214760,922701926,922688240,-2103829778,-2095210706,-4716348,-443851009,-1957313699,1357677548]}]],[[{"sector":1,"length":512,"data":[353286230,1007466576,5290064,1104799824,-963907445,1065140235,1346112696,-1924889112,-1202671546,860896268,1522028736,1793609741,-1947169811,2092960710,-1337553634,-36968368,91602955,-335544386,-217659890,-1070399386,1592191056,-1962540866,-443851066,-1957313699,-1561558548,-1957210624,297403974,-1948059904,-759198760,54889001,-2037841740,1996488542,1619430660,82333951,-1990633064,-1224801210,-1070334114,2139220048,1358954424,-402360577,1499043686,-166989685,1996425589,-1862604796,-973046807,-12189692,-303561610,-1744532848,343368,-661957001,-13704239,-615329881,-263002798,106101586,-1974267565,-1996442619,-335585658,21334601,-2037841740,1055653726,-1274919542,1585875200,-1976308737,11797317,-10582391,1166682347,-1996442620,-335585658,88443421,-2037841740,317456222,1954546934,-1744532979,1342209829,-397361101,-963935899,71731520,175437323,1065408651,-385649664,1583349580,-1034033781,-1957363708,-11053332,-399885258,-125071883,1342179768,622576289,-397410240,146300246,-1029615616,2106651,1565059152,1342179256,622576289,-397410288,512449850,1200237112,1342223363,-397361101,484998791,440447,74907472,-1946239000,-1976944610,11797575,163115147,32002048,112732,-541568944,-396996589,146313225,-303542272,112731,-424128432,-396996589,129535989,-639086592,112731,-323465136,-396996589,-396914719,1583320417,180829,1458342741,-968982441,57999387,-402618391]},{"sector":2,"length":512,"data":[-259281364,465712691,465712689,7390967,113706612,-58434,465569479,116850688,203714,113706612,72640,465700599,108265476,465569479,116850690,531394,113706612,203712,558505611,-472783919,-1063132207,65065243,1287621592,-1103217887,-2130217701,65471614,1048779893,1946164164,465871109,-544535317,465444489,-2020875311,-397401580,1583349444,180829,-2081649835,1819710,1183517301,465871620,-22353840,180829,-1947432107,-945617850,46292251,915101184,113712071,7111,-1017198965,-4696234,669536511,-1039743233,1048772701,1946164167,466067718,-402616855,-125063808,-1072969845,2112422773,1927829248,-2131719227,1820222,-24951180,-2096794373,494271230,-2085716248,74841086,65781811,1342177720,-1962046232,1355254776,-335574552,-16874679,1558714997,321513646,-947128181,-986716080,41861131,-396886221,720109418,1947205251,301892377,-24963980,-2096139248,175379710,1947467395,318669573,619187317,1459565486,-369193496,-947126411,-389849505,-1072955566,1048836468,1946164167,-13244411,113707499,7108,-1012008216,-2081649835,1589904620,1468737028,126559746,-2113929435,-1996423198,1183448662,9724,1106561,326422539,-1946265973,916550,13271296,-27883009,-1946401143,1183579734,1575324668,1426064578,922741899,1996430297,74907398,-1705983949,251331956,311901,-1275051,-14952138,1996424822,112644,91527760,-1034088709]},{"sector":3,"length":512,"data":[-1957363708,-650706964,1996430875,74907398,-83549542,79846670,-650707200,-675799525,62410845,580538368,185531141,-1207601984,48955393,1438892083,861334667,-400233482,-1072955433,-677371532,1178310749,-1106938620,48955393,-166988237,-660534923,1347590493,201295336,-1948748554,-1034068282,922681346,177871833,-1022428411,871140181,1320702144,1996443659,-18428,108461904,1342929848,1342180024,1342182584,1342180792,-1959099416,79846885,-326413056,1443163267,74877783,1573731979,1183434635,-28931588,1342922680,-823634346,3965173,297273973,-396996596,1499042747,-1070377442,80255568,-643625221,2143292187,220444683,-1947707824,11397631,467220223,-59310306,1342970808,1502822632,-1706016704,251331874,1342970808,-386107649,1499042634,662028299,467220223,-25755874,1343998648,1502812392,580538432,-1206977787,-11527222,602472054,190405011,-1207274304,1448088565,-335597080,-650707116,-1202250213,-1706033150,251331874,1946434944,336115722,333993552,859237375,-890744640,1958743038,1574746156,-667484336,-24713123,1342178744,201241832,-1206487872,-11510296,-396502986,28900976,-1628942336,1975520254,-339725564,-650707140,616046107,45633630,580538368,856619781,-397389632,378142254,547577378,1579458910,-150993990,64107490,324935686,-1990319594,-1554122474,28859895,-1956749568,46292453,-326413056,1443032195,-1173993845,-487129079,906227851,1149918671,21244418]},{"sector":4,"length":512,"data":[1183367422,21269247,76173464,1183666328,1183469823,-1325353980,232837896,-397410296,-1956738091,79846885,-326413056,467345035,512440319,2013224488,-5642236,-1962651905,512427078,126426075,673090384,41418590,1577030376,1426064066,1586228363,20414724,17299200,-1962183680,529204830,254019466,1586172395,-16282874,-1965520121,-771444473,1561273592,1426064578,1465314443,-1962639733,1048774262,1946164315,1527709449,1573167132,1465283051,-1560301336,255614404,1465259637,1358931176,-1628940458,-771444225,1490062048,1340850698,1573142144,1446933774,-7870377,1537425560,-396929508,-995950723,1963932765,-396929511,1448148849,-9705385,-523107151,173592714,1573167810,-996140565,-661940131,1575585674,-346176350,1573167114,-1965519976,1599990151,79846750,-326413056,175541078,721962635,-1960938298,-567605154,-972792317,-459276281,-972842915,1183535168,-11517946,2028471414,-1034068340,-1957363704,82609132,-164407466,1579038265,909708148,91512358,-351000386,507413270,91488350,-350997826,641630986,57933918,-1961611842,-1977886946,11799623,-1977644208,11796807,2030102608,729085451,-1738677600,-1605896053,-1986503197,1444871750,-1958926104,-802423210,1392268937,-28931241,1448562760,1342177720,1601673448,1575324510,-326412861,1448799363,-1505310889,1187446784,855638184,-1435072010,-1585917208,112860245,-1948059904,-541589544,-575144165,-69474277,-253208,-10629834,-396502986]},{"sector":5,"length":512,"data":[-845022208,-28931747,1183659499,1183666430,1927827626,-1387886338,1958742936,-15078654,-1957255050,1191159366,1183666342,-387428178,-1980353538,132884598,-2001910134,-1958302142,103546438,104553933,-1099145768,475741827,-4754176,-11097994,1183688310,-1192734546,-71964418,-744243149,1579590493,-1201791325,-1202692578,-397410302,649657224,45633630,2112376832,1574156539,112720,-76355504,1574125187,-1962248960,-954475746,-335544569,-852033725,1574150493,-150992454,1374179554,-335596549,512448268,2013224488,-47847420,-750896313,-1947304867,-2095326434,74841919,1991,467345035,512440319,2013224488,-50206718,1610507240,1575324510,-326412861,-1962518901,1347552326,-1172548191,-487129082,1515772043,467638153,467502985,-1172548191,-487129082,-1558454011,-661972005,-63545,1576968936,1426064578,1048833163,2080382037,475373863,-150993222,-1948742686,-1961107561,991681927,276105302,1963345467,75399179,-399739904,669777519,475348611,-1206684397,-1202716558,-1202709539,-397403165,-443838589,117376235,1996430421,108461832,1577021160,-2097150270,1856830,251598206,1436621909,440860,-519707913,467378971,-1006754072,-2081649835,-1957296916,-167050122,909855612,1165844004,62572171,870512384,537265106,571872094,-397389218,-440862203,62410845,770199552,-440918278,-1410838435,-27883015,-2080618871,91619322,1962934077,-25263348,-2094828033,1979645054,571902749,1579196766]},{"sector":6,"length":512,"data":[-2097075195,1347551442,-1191590680,-1202692635,-397410301,-1205929492,-397386267,-1956710038,46292453,-326413056,-402229505,1347616626,-402360577,-1034027279,-1957363708,1525449708,-912173226,-989447331,-1995738275,-979261370,-1404663459,-979301141,-1471772323,-1990342239,-878597050,-955892899,-1995738275,-945706426,-1371109027,-945746709,-1438217891,-1990341727,922725958,-1024972296,454730116,-1952037239,1575725694,1470658303,1470920447,1353729677,1342177720,-1955332632,1982573686,-1438217304,1957578299,1308748557,108197387,548436608,994506100,376680062,1183702667,-958921808,-1958343417,-1337553442,130471939,1996441098,-1337553498,182998608,1958743018,-1502215927,-1367459001,446799478,457614107,-1549384053,243342152,1055468,-1205692952,-397410302,1583305536,-1017256565,-2115204267,1442881260,142510935,990267019,158534214,-1995802997,1988692550,71731974,57853755,-1962899479,-1980199945,2112423030,175570688,108461911,1686539607,-1070378753,1934157904,1223423539,-472785269,-10189171,126605315,-1979776987,-1308663162,636015364,-1769271552,78774114,-1039408429,-10320247,-472785269,-10189171,126605315,184614693,-1946197370,-1914449442,67069078,1174899162,721831563,-969209274,1996467827,1996445450,-2037557498,860946276,-1830268736,2117814131,-385648892,1583349627,-1034033781,1465253896,-945569741,1573233501,-1560280648,-912040501,922701917,-1561829941,112758,1993140304,2002446416,1573207683]},{"sector":7,"length":512,"data":[-1207602176,65732632,-1560275016,1525162314,-1946645513,16721351,-1872369584,4341081,1048786293,1946181061,-986251501,-952696995,-919142563,-885588131,-19077027,-1554134623,-878617147,1573364573,1573205759,-919142576,-1008185251,1470491646,-1950612248,100566000,1048783221,1946181061,-986251501,-952696995,-919142563,-885588131,-23271331,-397361101,-397380030,-1070369072,-2097046807,92143614,-1863727221,1036421889,58064900,-1946198551,786682328,1588111359,1605590885,1593859762,1048797208,1996578249,-12523261,1573207683,-1592364032,104553929,225861061,-952697008,922701917,1072192971,-921763842,1573495133,-885588144,1974200413,1573207683,-385649408,-912130294,-989447331,-385650083,1340866302,-1738677344,1573455419,-269941897,-985758722,376701021,996002209,1935525126,922701837,-11510329,-396506314,117439982,-912171575,922701917,1525177803,-985758859,57999453,-1577141783,104553929,58154437,-86551,-10630858,-10631370,-10630858,-396506314,-1746272842,-885095426,58130781,-2080469527,6145342,-878635404,-955892899,-15894947,1348322614,1573467903,-41097136,1573467903,1573588735,1348324257,-2089486104,6145342,1474888565,1573626366,1573324347,1273561970,-1605374978,999841250,2002635526,-29562621,1573207683,-1592364032,104553931,225664455,1573205759,-919142576,1005080669,-919142403,-888733859,1573626205,1957161040,1573207683,-385649408,-878576122,-955892899,-385648803]},{"sector":8,"length":512,"data":[922746362,922705349,922705355,922705353,65560011,-35329539,1573207683,-385649408,12123610,-1017225218,-2081649835,1465255148,558499527,854065158,-1947169803,16721350,-1908545456,4406617,1470182773,-28931812,475465415,512425986,1200233431,1342223372,1200234379,1342223361,-395172376,-259261080,-1543616885,-25093033,410320384,1459145704,-1950753560,100631544,-1070398091,-2097092887,92143615,-588659061,201294592,1048779125,1962958366,-7804669,1579038463,1392177640,-96868272,-2080409111,427101439,1579564675,-385649408,922746730,-739746266,-397389062,1542060571,-750877697,57999453,-1946201623,-1961108706,637447,100918007,1183407567,1036487676,58064906,-1946208791,786682328,1627695103,1631871286,1630036250,1613783398,1613783088,1632788528,1586192732,55020284,82333848,-16193033,-1963172213,1352139847,-369690904,1586233082,88574716,-387428200,-18028042,-1963172213,1352140359,-369698072,28901086,-790081536,-19600906,1574123263,-369703192,1586233034,125304828,-397361101,-1142293837,-1956749314,-1581031963,104553941,695557585,1574241991,-626982912,-83477667,-1593477539,65756667,-1554130271,922705361,-14804007,1348324662,-83549542,-636551410,1574281565,1574242047,503568523,126508493,-326412861,1443032195,74877783,-1728074520,-947128181,-120388175,50333477,-2114942010,-352313369,-7084026,-1958345592,-1073000505,80147317,-8132608,-385988984,1183383421]}]],[[{"sector":1,"length":512,"data":[-28931073,-443851169,180829,-2081649835,-967433492,855694918,1574020032,-144845405,73260038,-1207470848,-397386243,922694774,922705401,-1763156489,-203560717,-1554130783,921198042,-28931841,-1996541720,451673926,1356744333,-1946195224,1576909040,-565801648,-2013730736,-1072998055,1183517309,-28377090,-596262901,1348337080,1356744333,1502076392,1958742873,2996237,112720,-107616176,-1202321173,-397410303,-1956710005,1438866917,-326898549,-1957210540,-164428674,-1557531487,909729320,594811991,475479683,-385647103,-8191676,-402230015,971634873,6600705,112720,-112334768,-1593758743,1183392074,202488062,-1404662448,-2019432368,-1477944999,-62486163,103531659,-2012938192,1576772602,103531659,-527737349,-844905333,1573888861,478152447,-1172537183,-487129068,1348350469,1502239464,91537419,-1796606413,1460061952,-1929379300,-397366202,-1072958613,-2132212875,1460061952,-1610612452,-1147642397,-140967934,707244795,-685863984,139954203,34097034,-27401466,172460224,-1738677600,-1728052549,213056503,512479274,1468537815,155683337,1575093762,1200144638,178187,1277356112,1342177720,-2089690648,91554559,-335647256,1962871579,1430160135,225836828,475608831,1342177720,-336040216,-167122941,-1946392088,63212528,-1956775162,-650214432,58589211,-877592,-2128838642,1962803454,178185,1282336848,28837867,921194496,-59310209,-1954719512,1252261446,-18399,-269424560]},{"sector":2,"length":512,"data":[475465415,-963969024,-443851169,180829,1458342741,108432215,1586233139,17286916,3964928,1065944949,1256966027,540835910,1015085684,-336235511,-1744532965,475969616,-2050693040,1580030297,-1311274212,65196804,1190693826,2083536000,960266245,1015077758,-2147124159,-780253636,1946172544,73304839,1991,1583335307,311901,-2081649835,1586173164,38243078,1183651408,-879079188,-1961956352,939460190,-163148522,13343312,1183649516,1874350326,1183666204,1996443884,-2049316860,-397387431,1499038994,-2062751664,-443852455,311901,-2081649835,1465259756,1996488499,-364475130,-2051938224,985160025,1183666176,535318762,-1957078651,197561328,-1929022016,418114166,1174406342,1357530765,-402360577,-125042934,-2096865653,175374399,74907478,-1979778584,-678691258,1610499723,1575324510,1426064578,516222091,-2128207608,1052791,-1744550262,116906123,33579957,95946100,-1962742929,-1591088957,180829,1348711864,-1602506776,1336042502,1443793508,-1257834652,1946157667,284786703,-109050508,-972720864,40129798,1683304074,1682904714,1679963786,11846282,1946157629,212257,121445492,-350784512,-1241271808,1978468905,-351817212,50167817,45220981,378023350,914908239,11559970,-1268506718,1678484224,-949738590,1348732678,171868928,678690876,1673084547,-2094959616,1864254,1048584309,1963418703,243717,129500139,18260736,477234887,116064257,1007290055,1048641536]},{"sector":3,"length":512,"data":[16711958,1048791412,1963393302,-1157171446,1946157411,-147985606,23312134,-1609140992,1336017174,-2097041308,33625662,45089397,-345746014,-1187085542,326369379,1673201399,192217089,18233087,872340712,-1207702592,-1195180031,-397384451,-202868052,1958743038,-1257834503,1946162275,1396605192,1962985572,-770801659,1455620395,1683333207,-1073020748,20778100,1024947200,175374338,767432427,692502315,1354632939,697089835,180225771,687914795,-118991018,-1017225378,-1579309592,-492610179,445489434,505078947,1343939256,-1624469350,-950445795,1775622,169788416,130426395,-585177062,922703555,-85458658,378100100,715349548,-336186530,-773944557,47331,-2128166770,-1878978881,1174893968,8453761,-25041028,310182016,1342177464,1342234040,18757375,-2088447256,-1017248060,1579955967,1579824895,18757375,-2088452376,-2084370748,3934782,111151220,-402607004,113745715,74032,-398464536,-655868869,-467474205,-390434840,-1008204433,-1957313537,116163564,2123061078,-831723516,-1954961176,-2147039248,201326364,184841727,186217718,-402098954,113658256,-402646074,532168197,-1070378987,725280848,1342177720,-390683928,-166985839,-16055179,1236810100,703090709,-1927915721,-1705969082,250347700,1358579341,-1204348952,-397404841,374748944,1358579341,-335498086,-96039666,922675280,1344042168,1463220200,1501427432,-443851169,180829,-2081649835,1963000958,222476319,920315984]},{"sector":4,"length":512,"data":[1344042168,-399059992,-1125598788,-15669244,1342177720,1501415144,-402360577,-1034027200,-1957363710,1996445420,-2112624636,-904492455,-1962887638,-938046734,721466922,-265599246,-11079983,1996424822,2104616964,79846750,-2091428352,-13974466,-1070398092,-1207923479,-397410290,45631308,1706577920,-1310175211,309503,17283152,-5838768,1342178744,1343582904,-1191207960,-1202716666,-397404786,28901264,-672641024,1463716716,1036487452,108331009,475465415,113704962,74058,475596487,-1293418495,-1947169812,1958742982,-1696049419,2047409,129502581,867717120,1307070476,1037298687,41746431,247002675,1843941376,1463716167,1606847260,-1957313698,1357677548,83934806,1007042179,-1206946816,-1924121588,-397365178,1499038083,-4715541,1183666431,-655863632,-1333886954,-1206946560,-1924133548,-397365178,1499038051,12452843,-1337553658,1354773328,224049232,-698619824,343785483,2113929021,-1192195326,-1924133548,-397365178,1499038007,1353729677,-1947816728,-443851066,1048822621,1962949636,1742190626,477542480,1742190672,-484972464,1742159488,-1207602176,48955393,77840435,-1206195396,860907479,-1202696000,-397403013,547959723,-955878144,3933190,71205632,175374396,1348982712,-1548466712,1048787972,1962949636,477542413,1742190672,-2134775728,-2084349607,1812030,1048654709,268442253,-1070398349,922692331,-722986355,2098628945,1568383837,359972875,721424568,693992198,-954561274]},{"sector":5,"length":512,"data":[6126342,2097610496,112733,-326412861,1443163267,-1218779049,-402483480,1458109493,-12392196,-396580888,1451839874,-62486018,190623976,-1207470656,-397410303,-924254798,1958742838,1051912199,125157387,1342177720,-156184,1996488310,-517019396,201289960,-1207470656,-397410303,-1511457402,-1290344390,-1576985440,116876368,1860533,480249972,-1560345599,-320314303,10729531,1683535952,1694349392,-2141591472,-402209661,446823438,730964737,-1203916056,-397402566,1038620516,-1946645506,83901895,1048784501,1962949636,138314535,544538684,-1947601432,197561328,-1206553152,860894683,-1863823168,-42866673,-963907445,-373495728,-1351358378,-12717941,-402031105,-1072960907,-24444300,1583335307,-1017256565,-2081649835,1465254636,856194699,-1004934154,-1977220002,-12154873,-2147203329,1948319614,-12154356,1179059592,2080964227,378594,-443851169,442973,478191958,-150989638,-2114941982,-2090978618,-14909378,2088964212,175439622,1342177720,-2108168106,-1017226919,-2081649835,1465281260,-1980742003,1989016134,478192032,-150989638,1580336610,-134330743,-2147482042,1183724148,173968136,-1986509172,-165243298,1954547015,-263811816,-1739158704,168149899,-397389312,1187512150,-352317692,71747352,300613646,294531,2122516092,92146692,218384071,73304832,-1081351215,887823490,1033373066,477364260,1946173501,-1977619710,1090782790,-347732856,-94467302,76023690,1190807295,-2131075445]},{"sector":6,"length":512,"data":[-311099329,92931563,1195771016,1962950016,313031,-1952996120,1678050374,-1706653440,478166659,-1207601665,116129791,-1946263925,1183385159,1958743036,475505003,-946059639,35411718,1354773248,1342931384,1352681101,1342938296,1342182584,768080,616753232,-1743862653,-1952561527,1470340166,-1635876068,-2094238638,-14909378,1586169972,105367550,-2068316160,247175680,1048776577,1962876032,-62485741,-1979818357,-1612183993,-1207571458,132841473,-392530177,1599700928,1575324510,2406595,2133059664,806783321,1580114782,1349215416,1501523944,808910787,775356254,2406494,2132142160,-1022966653,-1947432107,-14350778,4261120,-402241911,113743565,13835353,-1202667469,-1924132097,-1202715066,-1202712218,-1202709342,1347420180,1342178488,-1960570904,1964719333,-31397881,65781811,1560281528,-2097151286,1974334,512429940,2139102752,91554052,-352321096,-1547685118,1438850610,-1957237621,2088764534,275927053,67978378,189016241,67978378,222570673,1705909956,692554278,1997423674,239372828,693602854,-1057045974,-1978907608,-1977217468,-1037424297,1143521534,-1034068466,-1957363710,317490156,1988843350,-1983892732,1183446086,-297367048,-1962872855,196800070,65206016,1183387972,-1948742660,1183385415,-398983170,-1957069699,-193053704,2122908542,-163133452,1586167808,88574716,37552308,1023898624,225705987,1586174187,38243326,-336443767,-27358446,-1274001526,-230258432,1187448299]},{"sector":7,"length":512,"data":[-2097151758,1946219134,-263796902,1240137728,-2130944373,1963066751,-262239463,-1957436463,56163934,-661978041,317208575,-125085316,1183522027,768752,-661921033,-27358381,289866584,939513995,1501295848,2117859467,-1996259594,1191179902,-263812112,2096252475,-1960449105,1200290910,1023456261,175439876,-1946263925,-163149561,104664811,-1962314496,1200356958,-163149562,1005995659,58652742,-506231,1149955654,989901840,58650182,-1962998551,1140984900,-2000617968,2122518084,92143864,-352320840,-1950338302,1443099734,1086456824,-96040640,1946172547,-399180014,-1957069971,994527224,58653310,-1963295095,1174539076,-2000617734,1183452484,-2013068044,-397013180,1583349325,-1034033781,-1957363710,82609132,512448342,2139102752,57933828,-402603799,-1073017973,28837236,855829248,-28931648,505421451,17516486,17582022,1343047622,-788642166,-2000617760,113708615,286462,1793848883,196789899,-1948059904,538872824,293536542,-488098305,1183406458,-773944324,-24671261,-62520482,-1962933243,-472824866,1593739145,490883,-561302668,-2020940847,1174560510,123571198,-1962195064,-1977737186,1451888199,-4030210,1569440298,206014471,-402164225,1569455588,38258183,512443905,1200234016,989901840,-1953923130,-523108794,721440954,-773944368,-23623197,-16258210,-400678858,1583349172,-1017256565,-2081649835,1465254636,-955877749,65094,505421451,-1274001526,-336033024,74842933]},{"sector":8,"length":512,"data":[-952383861,-164428676,-167049237,-141884547,-1161393330,-487129077,-1957439349,1478369310,-1961801981,105379544,-1962642175,-15864890,1183579718,2093431806,-18236,-443851169,311901,-2081649835,1962869886,74907398,-955590936,18755590,46292224,-326413056,1988843350,-97532,512434036,1200234016,989901840,-1961722170,-954325954,-14801914,-1528277249,608078090,805750558,1593835550,46292318,-326413056,505689855,-16664,1996424822,-13047804,-1960958813,-1994514402,-397408953,-1034027122,512425988,1200299552,507028233,1887692880,-397361101,-873962334,538872589,55035422,113754881,7732,505941759,505548543,505945739,-472783919,1596491659,186523811,-1962380096,88574936,-1021434717,505421451,229248,2013206132,1882712073,-1956530712,-954327010,-63161,214982,-2080394264,1974334,512431732,2139299360,208994057,-1559672949,-397402568,116092937,506988231,-3932161,-400678858,512430505,2139102752,125108226,16926662,-1946313752,-2095177698,1979647359,-18416,112720,-26679216,-350346077,538872595,88574750,28856392,1407733760,505717758,-1960958815,-1994514402,2139292999,58064649,-1962329368,-2145509346,1962935167,-16062459,512428779,2013208096,1871702025,-326412861,74877782,505939711,505945739,-472783919,1596503945,141948427,505546439,82509824,505546495,505427593,46292318,-326413056,-1959138474,-786552802,-2082221597,6236351]}]],[[{"sector":1,"length":512,"data":[-706205835,570869758,-1962934242,-350345162,-773944558,-2082221597,6236351,117378676,189668898,-336955914,-19339261,505953923,-1962249216,1325335622,1975520004,-1034068298,1048772610,1963007522,538872663,75464734,-1587645184,196746788,-1948059904,512447448,56106528,-661974713,67520502,922699381,-387441116,-398595075,1048837770,1946164768,505717043,-150991942,1406700514,505421451,289866584,1207359627,74712070,401326131,505560707,-1949270271,-2145509346,1946158207,-28251971,-1023409736,-2081649835,1465255148,-1172429663,-487129077,512489611,2130910752,121998097,-1946401143,-1959293992,38243288,-151107959,1947207237,-1979384304,989901828,310181446,-352320314,-1962606835,-28951804,80151676,922681344,484974116,-1956749560,1438866917,-327029621,1465254022,614596403,71711518,-397404812,1183579443,505717508,505421451,1342523273,-1946351128,196740166,-1948059904,538872816,293012254,-1962720117,-786552802,-1981558301,-1973475705,11797828,1979713085,24832259,-472786805,1906835246,-495745677,2138327156,-495657101,-948679052,18756614,125600512,-385649408,512426321,1200234016,1073787915,2055637312,876512255,175374366,-1274067062,-2046736384,512491386,1200234016,50377740,1075717126,2089191744,121932799,-2095177565,1979454,-661970828,-1961664629,505717511,268846326,645990004,16719396,-1960958815,-1994514402,922682695,-924312032,538872829,75464734,-2143652606]},{"sector":2,"length":512,"data":[1946157695,2055637528,190286591,1191232042,2089191949,207063807,1191232042,2055637518,538872831,189237278,-8616310,-2146678904,1946157695,182997764,-118757127,872221928,-2115481408,10152202,-369201688,1149960337,2122746119,-2585601,1183646327,753422464,-1957078666,-33122,41418551,505421451,-1274329206,-1974452224,11799623,505677315,-1635037120,2013265790,71797508,-397350703,-125100976,-1072969845,-8185475,855799295,-2142859777,2124319568,41418751,1500897000,-164631719,1963460164,2124319498,41418751,857858536,105182975,-1928039040,-1957658554,-33122,-2081947017,190404981,-1962707776,-947190916,-443851169,180829,1458342741,75400023,860058624,-1959597066,768710,-125050121,505421451,-15630589,1894253686,-1974445703,1519911493,276156475,17188342,1166740085,475636489,300664459,538872646,273123870,-969211724,-4669057,1566466047,1426064066,-326898549,861361670,20048383,558499527,614531072,768542,-661921033,538872659,1191401502,-1948742895,1503856967,-537401316,637421193,-397410049,1183448942,-49668,48825204,-25755903,-1985687320,-12714938,-1559659009,-55042506,15460863,505421451,-1274787958,-1947170048,171834438,-385649152,-661978933,-13704239,1064681383,-160018314,1870010229,-2122941834,-2122940042,-378153610,538872693,273123870,-1202716492,-397410303,-1729496401,1354773248,1358954424,-369450264,-24969077,185299969,-2096138762]},{"sector":3,"length":512,"data":[1978942,1187448948,-369099014,-167051161,1827210100,-2094208256,192152062,242611723,506609283,-955812864,-132538,-167032853,922701685,28843556,1491619840,188935162,-12684042,-1205984202,-397344769,837548615,-562694645,-1172429663,-487129077,-1957439349,1478369310,-1961801981,125797336,-1592626176,1183391268,114682,1187448811,-335544326,1979649012,-20387581,1610237579,1575324510,-164407613,-561302037,-472783919,1596491659,186523811,-1960610624,159351768,-1962183169,55035608,-90970111,512430315,2013208096,1787291657,-397361101,994467360,2115905590,-336186427,-773944527,-1948003869,-1554044793,-1073013216,-661971084,-402032641,-1070372259,1585244240,505421451,-1559935093,28843556,-1041739776,909854215,-914481624,-1554271768,-1017242056,-2081649835,6245950,683163508,649613312,1354256479,-991408033,-1578792077,547561002,506241310,-1591860573,614669870,1593614622,-14800733,922682486,484974128,1593483523,-954324829,6245894,46292224,-326413056,1443425411,74907479,-2080397848,1976382,1183538812,505848580,1204213899,1005060101,939932507,-402295778,1038876419,871102003,-472785269,-2020875311,547577640,1958742814,674642721,-1962380258,159351768,-1961658881,-1960959970,614663495,-108271586,-397361101,994445056,2115905590,540967879,108331038,-369098824,1256718796,-129579019,-437714944,-44308480,-947128181,1040186413,58064899,-1962901783,786682328,2013308927]},{"sector":4,"length":512,"data":[2014935108,2013820953,-1980090392,384366662,-96024587,-1310064641,538872576,75464734,-402426623,922745054,-8184284,-1207601667,65732609,1358954424,-1946704408,-756525064,8841722,33048263,506896640,-1577433463,196746788,-1948059904,512447448,56106528,-661974713,-1962719349,-786552802,-1981558301,-346085753,-1696049323,-129594886,1249165323,-1172429663,-487129077,505421451,-1995356413,1183579718,-96040456,506740355,-1960086528,1183388487,-27358212,268847094,614468212,-60912866,149620616,-1960958815,126483550,-507416,-400677834,2122515039,57999608,872354537,-1960842250,673055710,572402462,-472825058,-2020875311,-561291482,503571409,1200168486,580994568,-969193442,581032317,639535902,105351454,505421451,-1962195062,-2011290082,512426823,1200234016,604373516,-1950286306,-2011290082,-16055225,1183520637,572427258,65261854,-1994512866,512428103,1207901734,-50363642,669735284,-1172429663,-487129077,505421451,-1995356413,-661914042,67520502,512431221,2139102752,175374340,-2080927256,1974334,1048826485,1946164768,-27358430,67520502,512432501,2139102752,259325956,505689855,-1946762520,-971102690,-1962867385,1583348294,-1034033781,1048772610,1946164768,538872602,159351582,-15698689,-2031613577,538872679,91750174,-1007251736,1458342741,75402071,505558667,125697803,359986699,990309198,721584126,-51882249,-31753,-1243085963,1566466047,1426064066]},{"sector":5,"length":512,"data":[-2091455349,6245950,683171445,1354256384,649613407,-655863713,113542000,-1558304607,547446522,506110750,-1558306143,614538796,506372894,505951883,-561308949,-472783919,1596491659,186523811,-1962380096,159351768,1308980735,-495061493,1593587337,-402360577,113770350,89934,46292318,-326413056,1183536982,505848582,505427595,505691787,-2080633112,1962935422,-14489597,505427593,505691785,-1034068385,113704964,24398,538872771,71797278,-1073020748,20778100,1024553984,393478146,512434411,126492198,418054324,505814667,-1274984566,-1962022144,-1977735650,11797063,-1070398741,538872771,189237790,-1974468428,11799623,222792272,-1974468428,11800135,-5904304,538872656,123702046,-1274984566,512446464,1602952736,55020039,860881076,28856512,-1494724608,538872678,155683102,-326412861,17886337,512448342,1200299552,-599357177,-1174124917,-487129077,2130966667,121998097,-1948367223,104531014,343219748,-1965269365,1183318599,-481916702,-2013050998,1189863750,84245888,1586172277,21465820,-387823992,1183448867,-164631568,1946224197,92110871,-1961790463,1200282718,-515471356,-1998371192,317448774,-1965269365,1183318855,-498693919,-2012919926,2105598790,158662917,126492043,-337623416,92110876,-1961724667,-472780706,-472783919,428115850,-337623416,-532232700,1446349600,1500404968,-1947580791,-2145509346,1962935423,75400019,-954960896,63558,-788242805]},{"sector":6,"length":512,"data":[-24671261,1183400030,-1961759758,-472841122,1593739147,-940030327,127558,-1980217717,1174665798,1183402218,73305084,-1948004029,-1990263161,1187509318,721420790,-1992232378,1156316742,84245888,28837236,855829248,-230258240,505421451,-1274198134,190286336,-1037369162,-1980611029,1183577158,1183399940,-129579018,1187446784,-1962933766,1177285702,1183400178,-62486018,14960327,-1976177920,1586225222,-1914449436,67039382,-1962440486,1178330182,990215416,92208198,-337557878,-498693629,-773562741,-241791517,-1998978050,-465109241,1004816011,-1015218618,84245888,1586179445,-773598736,-1964781085,-2011593081,-1946226554,-472780706,-472783919,428312458,-772514165,-258568733,-1998978050,-1958221049,1183447622,-330905628,904593408,1586168970,-1914449436,67039382,-2096658214,1962994814,973376028,359989829,32261831,-481916416,-773562741,-241791517,-1998978050,1191134727,3965156,512476789,1200234016,-1996442609,1200284742,-1979665395,11930455,-49954261,-431584769,1166734899,1208005637,277832,-1897331850,-774337792,-1476448541,2106097022,2112257461,2113109507,-1948361077,-297367289,268846582,-661976460,11798410,99342475,-1947312501,1407439135,1490968203,-1962653949,-348681256,-564229298,-1995225205,1173810758,141824006,126539915,99287220,-1947312501,768519,-661921033,-564229293,289866584,931911819,1586175467,41389022,1183385483,-1961825302,1200348766,-364476154,57982987]},{"sector":7,"length":512,"data":[-167610485,1948255813,-51882478,1527170592,1183645795,250106000,-166597855,1950352965,1183667726,1996443792,-1563236118,194016909,-162892554,1946289733,48780855,512448876,1468669472,-1962887665,-634657186,-1992042453,-619976610,-1014293890,-337361407,-1962636781,-472783778,-17787251,126409219,-465109178,1946172544,-465138936,2129020475,-227082272,-624897,1996485750,-259617290,-1070378754,1388570704,-443851169,180829,538872662,125274910,1358691048,-1274985334,-538423296,538872659,4162334,939461236,11797642,1658120272,-1957313698,2122536684,376700932,505421451,-1979228277,11797319,1354773328,-397199640,-164364362,-397015573,-1958282181,-1977737186,11800647,-293616069,46292318,-326413056,1443163267,548388695,301942470,16533191,-1958941952,-472777634,512395147,-150973766,-2114941982,-2141187130,695468092,-1204420778,-397410254,-544497212,939476807,1500183784,-1224780150,1992440576,-12154877,-2080618753,2081029246,-62455874,856622791,362807297,-12189133,396493572,857120819,-17021438,857252544,-1560525174,1583297306,-1017256565,-336819371,106859273,-16775226,1183516230,72285956,-311050229,311901,454730070,512401744,-150973766,1490586594,1611761545,1342181816,-1172403551,-487129071,1348433925,1343961528,-2090129688,-1969158460,440862,-259267849,513590913,622521505,76087312,1571738,72648960,1577206921,-326412861,-1962522881,154994246,-1962378240]},{"sector":8,"length":512,"data":[130417758,-1961170176,-472840610,512395147,-150973766,1611859426,74907472,-1955959064,79846885,-326413056,-164407466,-561305877,-2020875311,1387929226,-1948059904,331842040,4030560,-11070604,266863734,190404970,1174828224,2081029763,1962871765,378412,-472785269,512399243,-561310997,-1948004029,-1960932729,-1981558306,1176406663,2080964227,-773944343,-1969780253,1566465822,1426064066,-326898549,861361672,-1960317962,-1948003874,-1172403577,-487129006,-947783541,1031823379,504656896,1348903864,652760862,1975520027,-24951290,-2083226615,91490814,1962950016,112645,-1070398741,-2080881015,24447486,-773944498,-1970828317,-96040674,1348903864,1771694167,317413721,-783556981,-1970828317,-773944546,-1970828829,-167031266,1183574645,512402426,451065886,753375824,1499012511,16285315,645993076,-1107220,454690503,1810366464,9693694,-1172403551,-487129082,-1994482683,1078001222,-1694742903,6139,1006395019,1282736727,1215629115,-1172403551,-487129006,-2020878197,446914577,1161243,456767568,512401744,-150990406,1601701346,1768810576,-1593391997,112860810,-1948059904,-1668838440,-334066914,-270368486,-1547564033,669719276,1571738,-60912896,-1996335223,-27358457,1991,-1172403551,-487129071,1348433925,1342181816,1610463720,1575324510,-326412861,114262,-2147197301,494141503,558499527,-4718580,65556735,74907602,1342314168,1342233016,-1952787224,1962281968]}]],[[{"sector":1,"length":512,"data":[35043338,-1654069168,-1956449373,-1034068282,-1957363710,1357677548,1996445526,549697540,-1337553584,-898897840,-1337553642,-172482992,-1360506782,1958742809,11856131,1342314168,1660106495,194866408,-1207470912,-397384971,113770367,25331,11566720,-1880554635,-1337553664,-1337553584,-1622828464,-1927938048,-1705988026,251331539,225820683,1353729677,201281256,-345738048,1241958227,-1207955935,-397344769,1183699290,381178032,-642232318,-857190400,1958742936,-336186558,-773944544,-1970828317,5421598,-125050121,1611908993,1946172800,-1705566707,251331301,167674694,381213564,-1746382846,1660134300,1353729677,1348662712,1499965160,-972690599,6485254,1593835960,1575324510,1426064066,2122443915,1966279172,-67508221,180829,-2081649835,1465254636,-972783989,6693894,17104769,-8312196,612303117,-83507317,616059134,-1125625754,608076028,91488358,-352251457,16891659,-543030096,903782965,19777419,1129729,-1863777418,-774337791,-1476448541,-2088336542,-2065071160,-2065070871,-2065070871,-2065070871,-2065070871,-2065070871,-2087812127,-2085911458,1911063768,-370111538,616038750,1555583078,-1070378948,550418512,-1141118896,-963907445,58572811,-1207877143,-397384156,-259273639,-1072970101,803799935,-217659903,12451942,19196166,-1949502488,197561328,-385649216,-24968938,-385647105,-320274162,1713682432,1736947792,1354773328,1343052472,-1950635800,197561328,-385647168,-1205993234]},{"sector":2,"length":512,"data":[-1706007004,251331539,242532363,1348871352,185571560,-385649216,616038610,-991408026,1975520202,12904707,1348903864,1348871352,10438042,-1548214784,922701926,922688240,-2103829778,-2095210706,1122502852,-217659652,-4718490,2011713791,-1055528715,11562987,616046160,345657446,-1206977789,-397384156,-1990629939,54394438,-1962443264,596100824,934805606,616058895,1152929894,1491619840,-1947170033,277958,616052853,65556582,1713682450,-889001904,1946157373,146720,216728180,1343178680,-397361101,753602068,1348871352,1349035960,1499841256,-1720743,-167044373,300619390,-397361101,-259286685,-1072970101,48760444,-16719,91551243,1963261571,-16893,1583335051,-1034033781,-1957363710,1183536876,50605316,1979714365,34728195,-472786805,497549102,-544918139,629613957,629613959,629613959,193406343,1351034247,1713682566,828946512,1354773328,1344328120,-1950722840,197561328,-385647168,1048773078,1946168205,18921501,943128400,-1706039212,242532363,1348982712,194529512,-385649216,616038834,2145931366,1958742936,-217659826,-4718490,1139298559,-1720588,-1600654360,11822160,18613819,446762612,730964737,-397361101,317399536,992711073,1946229254,18522377,-399797853,985148660,1307070494,1975520252,22866179,-1207894807,-1202708267,-397383721,1499030707,-1207875095,-1202690089,-397384156,1499030691,1343189176,1348871352,1342197944,-1962021144,197561328]},{"sector":3,"length":512,"data":[-385647168,616038690,-1070378906,-776449968,-2031595488,-1947169863,2109737926,17361155,1713682462,64199248,-1073017093,616042100,1994936422,1975520013,15526147,1348871352,-1198033688,-397344769,-440470650,14215679,1344158392,1348871352,1499738856,608075865,225771622,1344331448,1348871352,1499733736,261404761,1713682512,5290064,225044560,-963907445,58572811,-1207919127,-397384156,1048580114,1946183204,1713682458,1354773328,551467088,-1191974832,-963907445,58572811,-1207929367,-397384156,-1072956584,616065652,985157734,-991408098,-1202103965,-1202651137,-397384156,1048639771,1962960420,223655949,1713682512,1671817296,-1205970599,508585508,1348903864,185920744,-1204980288,-397344769,616100605,48779366,-1205998647,-1202709704,-1202705428,-1202716670,-397410288,-1073017872,1290273652,-16706,92075531,-335544392,1590070018,180829,-1964209323,104465478,242508880,-1274788214,18653952,-397361101,12066888,46292229,-326413056,-16810,-1190902133,2042298376,121319047,1128466292,-1343621150,1744776704,-268442608,-50333441,33817087,67371780,-1719149564,-829966201,159892359,-1719136632,171869063,57933884,-402619927,-1024974962,-1293397811,-386888814,-4317501,7137791,-148139615,1086331864,-1590980189,446901137,719775745,-4696341,-68660993,705947889,1223422091,1006780033,91555328,-352254530,37650747,1963393084,4096819,91553852,-352321096,1354773250]},{"sector":4,"length":512,"data":[-1959589912,-349574858,1685531,116855019,287669,733480308,-1207702784,-397410254,-259260650,1566492299,1426064066,-326898549,-1101572606,512427264,-472834520,-1081351215,1183538984,-2347772,1979719997,23390467,-472786805,1504182062,-1651921272,-1651920504,-1651991160,-1651991160,1216929672,-1853254007,2022273929,-2021052023,2106163849,-544633719,1770614408,-1266043767,227107977,1082714761,-1266098295,-1266043767,1602805641,-18295,-248715184,84166283,-878510045,768565,100918007,1183397335,-2082960386,1962936191,-1948742905,199951223,1345706936,1342177720,-1947100440,2013265502,-387848185,-16722455,1961362550,-370111490,-8322870,108344074,-385548104,-8322880,125055890,1358945720,-1191237400,-397410224,-1477850214,184516864,-1207470797,-397410303,-8263469,125055890,1358945720,-1191246616,-397410228,-2081830026,-18432,-258414512,-1952270104,7662064,1006780033,1819608320,1358954424,-1578073624,297417726,-1948059904,-659059752,-1101665495,1357580288,-352255298,167886411,113133291,-1102976246,1022036993,-351533634,151305783,96350955,-1104286967,686491906,-351731266,151240227,1048780523,1946316200,-16891,-4713749,669536511,184663792,-1981282581,100712146,1583335051,-1034033781,-1957363710,71732204,1024196909,1467416582,-472786805,-710410450,-259398775,126487689,294262410,-1333126262,903848453,-399122782,921379254,1342177720,187248616,-2094500672,3932222]},{"sector":5,"length":512,"data":[-18341515,-400561375,401286189,-350064664,-1640699883,-840430101,-402396258,12099158,-1207702778,-1034027009,-1957363710,82609132,-16810,755254923,54332161,-385649152,-661979008,-13704239,1401572263,-1970636918,-1920303478,-397345722,-259286184,71157387,-15895296,1996488310,-1741362948,1391194251,2097151619,-401675443,-259284615,28853483,367546368,-1720803,144324843,504332564,1349079480,-2129255270,-27883249,-1694742903,260117849,16547459,-457700235,-1070378993,136243280,1996426475,-59310082,-1097342488,-963967488,1575324510,855638722,1776832704,1342222374,-1010930200,1458342741,75402071,-427690101,-25035008,125108480,-132323241,-2130681111,1963524350,854087430,-2125010006,1963589886,937973510,-2125796545,1963065598,1006954501,-25083925,108331776,-102569897,-25086997,108332032,-64100265,-25090069,108333824,-17635241,-25093141,108334080,-25499561,-25096213,108396288,-52697001,12059627,1566465797,1426064066,-327029621,1465254146,-16089461,-756544394,-259303074,2096577350,106859283,-695531637,-1036265685,-963967362,126469931,75400014,-2129497088,1963000062,1220971269,-963968277,-1995940213,140413703,1586169739,2097625862,140413706,1586169739,-1962440442,126552158,-1962516853,1255605015,226279995,-1962385781,1086794503,-1996071285,1354773255,1346955752,-1203144728,1347420161,-2096734581,91488319,-350164808,552253443,1506142288,1665539723,-1274853494]},{"sector":6,"length":512,"data":[-24737536,75400190,-1979223040,11797063,-2037709589,860946174,-51883840,209125189,-16742771,1583736912,1586190681,50825990,1036487672,92078336,-16743482,106859264,-1769142389,-1039925504,1465837648,-16861441,-397361101,-147110461,-759684227,-2037559284,-397345024,1499029031,-567550069,-16742771,130471939,8817920,770199807,2130131799,552384517,-357039125,501764128,140413783,1077938059,721837707,28856327,-219656192,112711,1209854032,1219160144,-443851169,705117,-2081649835,1465258732,-955613557,63558,1183433867,276234226,1499295976,1089488521,-802433909,-997465461,-113015,-397406090,1499028903,558505611,-772514167,-773598749,1351060451,-163149535,558505611,-472783919,-2016943151,270672,-15698177,-11071882,1586169974,-398983418,199884349,-196703486,-400471389,1183434817,786977018,-297367155,2113929021,33155331,1962935101,990219088,243134534,1451951499,-1036301812,100598909,1048787947,1946180983,-399114444,-1986479386,540932678,-2095811328,259260477,1577262475,-8421360,-16485088,-2082542843,1946221182,-297351412,1586233343,509702,-96040192,-1996423387,2122579014,1299447812,1912610877,106859336,1946173315,-1983892718,92926022,-1995940213,274631431,-1962932282,994577478,58716230,-1962843671,276169525,100599179,-1947187457,-802426794,1086753618,216553040,113541981,-1996732790,-297366780,1979719997,18082051,-472786805,27787054]},{"sector":7,"length":512,"data":[-393287538,193880718,-1097930609,1871645582,1166972814,-930198386,193923982,193923983,193923983,193923983,193923983,193923983,193923983,193923983,193899407,193923983,-393287537,378766,12577024,1208764043,1178273161,-385646608,1183514801,-385512976,1031995561,-385649408,234815649,-2097111831,1962935422,9693443,1178273163,-385647376,898302089,-1961855485,1448100038,1499201256,-263258279,-2097122071,1946158206,4031342,234842484,1979921803,-2082673904,1946158206,274631514,-956299322,61510,1187454955,-939524114,129094,-100609,-1125642122,-10921637,1726484598,1183406427,-1983892496,140413701,602605449,-401574145,-1957078191,276169712,1308748622,1980790331,540835845,-968428172,1187446788,-2097151496,2097147518,-125926629,-15371008,1996427382,1996445454,-1950338296,126420574,-63969200,16285315,-320273547,-163148803,-1980473717,-786347490,-773598749,1351059939,-18399,-996087728,-351242613,1015039489,1006269472,158601334,276234070,1499145960,276234073,1499123944,1979969675,82529808,1308624070,1913681467,540835845,113767028,23927,-1947048309,1583345222,-1034033781,-1957363698,49054700,1996445526,1519904772,-28931751,855932555,-2146964490,24510269,1031817030,-1946913536,-1948200506,-28931088,1583334955,-1034033781,-1957363710,116163564,1183536982,1161742,-259267849,701679233,294531,1183516276,38045956,-402492161,-1957078459,-1949856776]},{"sector":8,"length":512,"data":[121309278,1065943678,51005067,-1992292794,1586232390,50825992,50662470,-96040704,2080395325,-2080863467,2116661703,209594874,1187448957,-16777204,1352727622,1208005732,2147239483,1683005459,-33226572,-58815489,2116679723,-58840822,-2012461430,1183451204,155486218,-1996863862,1183451716,189040892,-1992284696,1996488262,523692046,1342177976,1342177720,-1203499800,-397410303,76236002,-1956428125,1583349318,-1034033781,-1957363700,116163564,-1983892650,1183448134,-28915718,1996423169,108461832,-1929087233,-1924072890,-1924072378,-1202651578,-397410303,-259261466,92075531,1963261571,1590070233,-1034033781,-1957363706,-1202235668,-11534326,1996425846,71732488,112720,242679632,-1946233880,209125368,-16484609,-1847064970,-1192195073,-397410294,-396943556,-963948495,-1034068385,-1957363700,-554925588,-950577664,64582,-13990202,209095936,2122526443,460718074,-13990259,1492641872,714509657,-1983773697,76283462,1190938249,-15865018,-2037515658,-397344982,1499027558,1183384715,189155066,-2084080192,1946221694,-60912808,1946173312,713461072,300437759,5029886,1996486699,-1438216708,1709725520,-1438216817,1486874704,-1913091239,-1946211706,-802423210,721453240,1355230146,66995851,1996443847,1496443134,1460061315,-1912703233,-397366714,-998024925,-968982522,896794651,-13990259,-38082480,-14383479,-16484609,1996424822,612797704,28856575,-1070379008,-36247472,-14514551]}]],[[{"sector":1,"length":512,"data":[-1929087233,1358899846,-339717144,713461007,-974630657,208320524,213837904,687747,11535733,-1593793047,-2037833398,1048837926,1963072599,1241958152,-352317151,1816606,175570768,1498923496,1958742873,1241958152,-352319711,1241958150,-402651103,-14302451,484986880,-2037884580,-1098842327,1946222377,696683197,-11495169,-1947727242,190404951,-1951697728,-1543559546,-4710070,1609060607,-968982335,259260443,-402360577,-1224794700,-1494679774,-2145260722,553593278,548406397,-2037775125,-2037842135,-2033713366,720683,-13990259,202565712,-14055798,-443851169,-1957313699,-1957210388,-4324226,1979649023,190824197,-1070336117,189708368,-11118768,2075657846,179851275,347623424,95965184,501764096,314868734,-1034068385,-1957363708,283935724,-1928825089,-397348282,1183418129,105266160,1178277234,-2096072956,1946219134,-263812598,-2012586357,-10753273,-1927936394,-1705970618,250347676,369391359,1358579341,-335504230,1354773262,1342918328,1358579341,1344335544,1358186125,1343521720,1342929848,-1271537760,-559919104,1073787957,374864,-39917488,-1961573245,126487134,1183383732,-230242320,1996423168,1996431088,10263048,1183518444,1575324658,1426065602,-1070338933,191608912,74907472,1358954424,1343528120,1342930360,-1271537760,-559919104,1073787957,309328,-45422512,1497163147,28837237,855829248,46292416,-326413056,-16222465,-559937930,1073787957,903848016,-11534156]},{"sector":2,"length":512,"data":[1183515766,178948,1358690201,1576850408,-2097150270,23284798,251593854,-1581030580,104555340,75326288,1665926911,1279165379,511574371,694373025,2137214470,1309067014,-1593835165,103375690,109011788,1665926855,-1581055999,104555340,1333617488,1666059915,1665797635,1666190907,243860599,1319199566,1241908067,104548451,427713360,996364449,2103659014,112645,1352730859,1241918307,1319321699,1276021603,1242432355,1343109987,-1962641821,-1989980146,-1016902642,1665941123,-955875839,23284742,1285669632,1342585699,-1593410205,1285776208,1048822627,1946182472,1208942340,117424995,-943496376,6506502,113754880,16802632,-326412861,-16810,197119464,-385649216,1860698268,1592283328,-2081387643,1962936958,9103619,-1559607669,1183540048,1665835784,-1962516853,1665966855,-1962647925,1666097927,238929547,-1957202176,786682328,-1791449089,-1789160106,-1786538626,-1786342010,-1786342010,-1787521658,-1788832391,-1788177051,-1159162513,-399774722,653000385,-335623448,-18094047,1072176363,-401085441,317456200,-335584024,-10033139,1239943403,-402396161,1285685072,106859363,1319176073,73304931,-963967095,146955614,-326413056,1443032195,75402071,-351897973,-1274770893,-1679273984,1183340888,-1274705154,-1880600576,1183340888,-28931329,1996441146,112645,1183456491,-12174594,-1070398349,1195774187,1946172544,4030469,76202869,1583284404,-1034033781,-1957363708,82609132,29251414]},{"sector":3,"length":512,"data":[-1161393408,-487129085,1005620032,-243399050,1988714475,-1957499908,-472777634,-1962648061,-28931833,737967755,-1960186882,65262047,939459678,-385976577,-1072955549,-544531852,1577313233,-1962439932,-773979169,73270243,-30734455,-746717429,-1946270069,-773979169,73270243,1191118729,-62485508,2080785979,-1144616026,-140967933,200313851,1603502070,1575324510,1426064578,-1957237621,32179830,-1744532922,1474947152,168069209,1592882624,182877,-1275051,-401734538,-1034027047,-1957363710,74907628,-1962510593,-11532218,1183517302,-504868852,1575324544,1426066114,861334667,1174531062,-16490812,-2144992186,-210436033,1566492299,1426064578,-326898549,140428292,-1979824500,1589967966,71761668,-1006138842,1191118942,126363144,-361381878,-1946265973,-443810746,574045,-2081649835,-1000995604,1183582814,-60913154,-963905997,71711558,1589909107,105316102,-1006138842,1191119454,126363146,-495599606,-1946265973,-1956709306,180510181,-326413056,638082756,1589905290,663365124,276086794,208987146,141935674,-16234753,-521468858,11846698,574045,1458342741,108956503,185104011,-349473546,792559644,1031800180,-1610255012,48963842,76023178,1205832518,1946173312,71731978,184831743,-958761536,1583284228,442973,-2081649835,1465276652,-1985198451,-13370298,1946844729,173968134,-2097150010,1946159230,140413702,-2097150010,1946158718,106859270,-2097150010,1946158206,73304838]},{"sector":4,"length":512,"data":[-1962932282,1175129158,-385452786,1191117237,207537164,541032486,1187443828,1187446954,-352321282,207537262,654204419,-930478198,1702150154,1914763648,-1262384622,-222801920,-1008185312,190404945,-2092600128,2158654,1860764532,1354773249,1342918328,1344339384,-1438216938,242679632,-401836289,-1202651523,-1202708227,-1202711126,-1202713733,-1202716662,-1202716652,-397410299,-997984104,20179220,-2080487681,2085682814,1183651468,1996443819,209125134,-1912716056,-397366458,-1957080687,-1438216720,1988751363,-1744532824,-1157625927,992909521,1124496391,-336076221,1744776770,704643086,788540928,1056979456,100686848,-308737127,43582104,43584409,47153561,74907392,309334,-24582064,1308624070,-410971925,1988886526,-2130187352,1308623311,76195819,440728,781789883,108267323,-136166589,-13744661,3175,3080234,4128826,-1723400100,-1723360921,-1721263806,1983617351,1176794620,1946172544,80707844,108461824,571478,-30873520,1308624070,1962949760,-2124616951,1308623311,1983620331,-1959365892,1015086198,1177449786,1065410187,-2130414592,-16774961,-1202321290,-397410239,80150002,282034432,175570688,1353401997,1342177976,-335684120,142016282,1353401997,1342194104,-1946300952,1065355358,-2130414592,-1962932017,-1956749369,214064613,-326413056,1191117803,73304838,-1979431169,106873863,168265766,-1947503168,-1014298538,442973,-2131981483,1952187518,75399174,-1207601873]},{"sector":5,"length":512,"data":[48955393,-1034043341,-1957363710,1988843244,1962281732,3964962,2088967540,393492993,1344006230,-1047719,-1008140428,1975519999,553820166,-1962636904,1566442566,1426064066,-326898549,-1957210620,1988823166,207537162,-1979824500,-166986658,1015031412,-14584832,1448345206,-1979750680,1183448662,-60898052,1065363019,-1962314694,130426584,-62456006,812973835,1946172800,-25755861,1476163327,-1979761944,1183448662,-60898052,126494283,-11737008,209043466,-1004469600,-2010710946,-62456057,425603,1996427892,-59310082,-402229505,1451884295,-62486018,294531,1996427892,-59310082,-402360577,1451884271,-62486018,654073540,1593837510,1575324510,1426066626,-327029621,1465254020,-8604019,-8616250,106859264,1962950528,40933898,1586171643,-1962440698,126485598,594828348,527707964,-16359797,-2037574089,-1705967748,251331348,-8485235,2089192784,1290293503,-10921649,-2037578634,-397344900,1499025022,1174434793,32243339,168135239,1007187136,1006924892,-1963887313,-12154875,-2147482170,1265970748,167855243,-1978567232,92864326,-963948969,1325787216,988502361,1962946109,-12154315,-347208312,1006930442,1007645788,1309373487,-1769093493,-1036255364,-2037519501,-969146500,1448546423,1498338024,-1979192487,92864326,1015084939,-385649664,-2037514363,-11468932,-1259862922,1599691086,1575324510,1426064578,-327029621,-11140948,1996425846,1418104072,-2037559041,-1924071588,-1924079546]},{"sector":6,"length":512,"data":[-397347770,1996487614,74907398,-10975603,-1639543472,-364475056,-96039600,-73078704,1357530765,1356875405,1498296808,1958742873,17295619,1358579341,1358186125,1498291688,1958742873,15984899,-83726182,-12154866,-11223424,-2146994944,16734398,-1098891404,1962999636,-12154349,-11237752,-11172154,1451673146,418054399,-10961280,-1978567424,-2037842106,-2033778856,-969212071,16734854,-11237750,-10975686,-1628896396,1555988480,158662911,10387072,-1830222987,-1639543552,1552321872,-1545056001,190404941,-385649216,-1224802179,669581148,1996443901,-48174946,844681354,-259286846,-10699136,186020864,-1206749706,-1924136914,1358912646,1498225128,1958742873,1418104077,-2037559041,-397344932,2122382833,359923870,292943371,1342189240,1352550029,1498214888,1958742873,1485212940,1183666431,-890744674,-1639543299,1552321872,669536511,190404941,855930048,-1207702592,-1956773887,146955749,-326413056,9759873,2123061078,-642296,-1591967738,347741312,98760448,-397386190,190402579,855995584,21490166,-1928694017,1358916742,1498222312,535318617,-2037573895,-1705967764,251331636,208977931,-9664883,-59840432,2150017,-9664883,23193680,-956829557,1316290584,1249181451,1946172800,1183668037,-857190212,-1923524276,-397362106,1183710272,-739749700,1183651576,882528444,185531140,-385649216,-1927937831,-1202668474,-1202691153,860906331,-397389632,405141966,2100480,-956829685]},{"sector":7,"length":512,"data":[779354136,2148087,1538795637,-1346875293,1183666275,1961382076,1348032844,1498131944,1183651417,882528444,185531140,-385649216,-830406519,-956891104,1098186756,425603,1996426868,1666365446,1279387728,116087129,1666320071,1048576042,1946182482,80642315,1666365440,-130226096,1344339896,1348686520,1498394856,1958742873,30310660,46593792,-13470464,-1430780810,15224931,-2141628084,6531646,-830403724,-1430781950,65556579,553629944,74907472,1498380520,1958742873,30310660,175570688,-16749336,-1961066482,-1956749370,146955749,-326413056,-1274788214,-402148594,-1034066017,-1957363710,1988843244,-2145588476,74841916,334186054,1963605120,1343074310,-1946168600,939476702,-2130720024,-545980356,46292318,-326413056,74907422,1348710328,1348688824,1348686520,1348709048,1576575464,1426064066,-14750581,-1346894730,1538805859,1387810915,-1430761373,-18329501,46292474,-326413056,-402229505,-1346830405,1538805859,-1696051101,142016507,1577044200,-1207958326,567097088,-1297956214,1949252707,33998341,1438854945,-326898549,1988843010,1782876676,1183383732,17102846,-1979157248,95747654,-1956192536,-472777122,1468784131,-25261480,-857210188,-1668510874,-402541568,914974403,-1956765390,46292453,-326413056,74877782,-1005042549,639698974,504383369,1359333003,378228736,-1014292214,1375750405,2013264,-154474416,96897822,-1957691252,-1591670250,-2080038648,-1202695680,-397410292]},{"sector":8,"length":512,"data":[-396953936,1566506865,1426064066,-1957237621,1996424310,317216262,-1702589851,1979923456,1946631175,8513795,10194058,516166795,-1977212664,-33520505,1958820544,348321587,-2144504832,527768057,10388619,855644603,1022621650,1007711240,-1341885170,1007348497,-1341754096,-1341986028,-1290685422,1711663104,606405771,277760,516173685,-2144984824,402687167,516164213,-2144984812,434896423,554966724,17793062,-1335143285,-1337790956,313847303,-857202509,-1034068379,-1957363708,-1528004116,1988843008,1552321796,1172852991,-118991296,-163149058,2133131444,-1701541376,-2130659840,989888482,-1978567230,973118340,141948742,995247243,242527814,10128512,1552321920,-396996353,-396951791,-396951943,-1956757500,46292453,861361664,-1946252298,1694213063,1007289913,-1511455884,1672847616,1207967525,1979715389,9890051,-472786805,900202286,1570854305,1923203745,-1029586271,-1449016671,-1029586271,-1029586271,-1029586271,-1851669855,-83441759,-351297436,-83441907,-1106272156,906559490,113713448,8492,113725675,450913531,556416643,-2143259648,6575422,1186871668,672039169,-352320479,-83441874,-2145435548,6575422,582885748,672039168,-352317407,-83441898,-2146459548,6575422,46008692,672039168,-1090516959,904404992,-82408678,64422756,-1765637674,1942108952,-339725564,412530763,433973328,1706301065,-2090487133,6617918,922685044,-924293893,504793369,555524897,192214539]}]],[[{"sector":1,"length":512,"data":[431614038,556144265,-2094979933,2174014,-16052364,-396948620,378083747,547561762,112673,1438867039,-326898549,915101188,908271912,-956865448,108331010,575223,516173172,-1977212636,-1262319081,-2116515072,-1325391645,-2114202875,-1275002677,1679157259,11846282,-478029685,196345887,-144439576,1946158278,605996059,549683489,-28931071,-1946394999,-28931117,45662350,1676011536,1099511,922684276,922689830,2095587620,-443851165,-1957248163,589375542,-144418762,1962934982,147257094,-1005620224,639698974,-999929974,639706142,-956889208,578027524,555228868,639616038,637958143,-1962641409,-1591663082,537207076,-1202695679,-397410287,-956828736,192151568,556152575,556021503,1583537128,-326412861,-150672253,35727366,-150440704,136390662,-1003588608,639706142,-1979623542,-1962887998,551780824,-754601728,13337083,-401886207,-1031118021,-661978956,2089857,753404852,671545187,1946158113,605996061,834896161,-28931071,-1946394999,-28931117,45662350,1661593616,116856811,1057064,378212212,614539558,1115425,-1729605550,1575324514,671545283,1946158113,605996063,-1752488415,-1960443580,-1006550393,639703070,637687689,113706889,8488,-326412861,1443163267,555228868,39291686,-1006138586,639706142,21272457,1116178726,404669441,532948513,71797542,105319206,516177269,-14278376,-14286217,641138487,607584033,2144289,-222894000,556144267]},{"sector":2,"length":512,"data":[86058145,516161568,-1993989852,-1993996713,-1014299577,555228868,39291174,856131878,404669686,532948513,73384998,-1979824500,200014942,654073540,-16775226,-2092499898,-260304386,1348795832,-2143503384,-2140825842,1348795832,1348795832,-1191464728,-397384451,-38208747,-1645719452,-990497988,639703070,-1004134460,1183581279,-60913154,1589906923,-62455812,4161574,-2092562827,-293858818,1964113539,-17700861,1575324510,671545283,1946157601,136234000,1200236065,605996134,1200104993,671545089,1946159137,136234000,1200236065,605996134,1200104993,671545089,1946158113,-19273691,555228868,639616038,637958143,-1962641409,-1591663082,822419748,-1202695679,-397410287,116912568,1057064,378212212,614539558,1115425,-840413102,-1957313696,82609132,171869014,661979196,516224563,1183588636,-60913154,1589906923,130492156,1182992160,-1589247236,-388930309,-361249221,1593792232,-1017256565,1672742646,-402426876,-1966907524,-1973114610,-1956321490,-2090575850,2174014,-109041548,-2145160691,511120377,1884919,-1023993740,259260420,1969276406,268009482,243271026,-402431052,1438867176,-327029621,-2037579612,-397344932,1988770660,-1370060041,-1224343368,-389467385,-443850557,-1957313699,317490156,1048794966,1946172426,11004163,103531659,327728,-62486020,-802433909,1451877003,1463714042,125042788,1348711864,-1956782104,862255926,-1956385793,-1956360938,-195655225,-1947056503]},{"sector":3,"length":512,"data":[-128546361,-990493047,52501534,-263811873,1005477513,74710134,65783435,-1979955573,-265552314,1996486659,-227082252,-92864738,-260118448,-1018113,1996484214,-159973384,-385976577,-14749588,1996487286,-294191120,-385976577,-166989732,-997484171,-1946401277,1463714016,125042788,1348711864,1599971816,1575324510,645945027,-386374732,-259325575,1348753592,188383208,-402164234,-1073020567,300421748,-20977412,1348711864,-386265112,132906083,1348711864,-386329880,113770248,8494,465962694,-1581031935,104555608,1316316413,1690633974,-1606781694,104490226,829777303,979694496,1969592326,1688903976,1699677755,1048584053,1962960066,1689297176,-388822863,1693648442,-1331688589,989901924,1919199750,1683535903,1694349392,-117708720,362812139,203342949,126363169,-1268429152,1599203328,1704529547,1223164340,805750623,-1023410143,556940929,125133749,1348711864,-398867480,-1360462224,1958742784,1683535887,-111482800,-386009624,132905677,1348753592,-940025112,18951686,-972634624,1048772635,1946165552,-12326909,-1070377277,-766449584,1342177720,868902632,1443228662,1174979560,2081619587,159312118,-1957313698,-1528004116,-18432,-765990832,-1593848088,1352794396,1326350436,2122547300,729022468,-10713459,960686160,1348711864,-1913130264,1358912646,1348711864,-1191693080,-397384779,-1246169191,568873059,-1207440583,-397384779,1760098496,1575324416,-1593834814,104555445,91579480]},{"sector":4,"length":512,"data":[-352321096,-1010814206,18364159,-399669016,-1073009237,11535477,-5242133,-1608909662,-16489392,-1574275422,1705126516,711172650,-1574284126,1134701138,708944426,1342179000,-1207472152,-397410297,146278248,1642614784,636935,123398224,144107715,872393192,1491620032,902215881,-917378992,1345706936,-397361101,112775671,28856320,1005080576,65517576,-1419188144,-1022744600,-2081649835,-1000994580,56991774,-1939495906,1586100806,-92864520,1996430931,-297801724,-362753,451475574,100745454,117400996,516187558,-1014930016,-1499396144,736153957,-28930856,-1946394999,-350143946,-60898290,38243110,-2096658138,1308818502,1183575925,-60898056,1577552166,-1034033781,-35127294,131087634,-1070398349,-793241365,-1326952441,-1575581422,1705026405,1344355512,-1191218712,1438842881,516222091,-1014930016,-1499396144,736153957,71732184,65065288,126559960,1705121419,180829,-2115204267,1442906860,-1962641781,104531526,91383206,-352320314,-11133382,-1159199114,-397389057,1444867457,-24736490,-1927917314,860945990,1520062656,-401637099,1035503492,-396996575,1499021378,-16873843,937973328,1582913856,-1034033781,-1957363708,82608620,-1957210622,-1232271746,28900860,1911050240,1958742793,4096868,1567948860,703018751,-1992850200,1044119110,209002810,1705522943,1085663318,99309913,1676170839,702783999,1449503395,103532427,1346380086,17071747,1048775541,1963025830,-339725564]},{"sector":5,"length":512,"data":[71731971,703438928,378142900,11938283,1346945579,-16106776,787021430,-1956749513,79846885,-326413056,33746049,557072003,-1928891136,-1543635322,1048798632,1962949632,336108080,922685313,922689850,-202873432,-1506344962,976682853,876019489,557234209,557365328,-1449215920,149547088,-2129307238,1575324431,-326412861,74877782,1080403617,-793059119,63974151,1002867698,1936040966,-336186620,-1539953916,142016357,-1207535873,-1202716662,-1202716665,-1202716416,-397410271,-1072962000,585826941,-402229505,190398337,-1207601728,317456383,208848443,1343644600,-397361101,-1041504260,1566490675,1426065090,-326898549,-11053558,-400475594,1451884081,-129594886,-689418158,1207471083,1705262633,871909003,-1610208302,14320485,-1577695607,1177249188,1992297462,-94991592,66602635,1380995783,-1577552129,1177249188,-2115481354,-1608596245,-826048155,-28931065,-1946394999,-345659850,-60898269,990350118,58128454,993995046,2099329590,-60898294,638028582,1308772233,50097795,-646580725,1705381631,996517537,2099329542,1958742796,-1207702782,983760897,910066465,310247713,51323624,1210136070,1705379387,251593854,1583292726,-1017256565,-2115204267,-1929314068,1358889094,-955704600,-1608754938,2000585472,91488349,-352315720,112643,-1205777757,-1924131200,1358889094,-397361101,-1072955749,535495293,-16742771,-56301488,-397361101,-1073017060,820511605,-18178,-841684912,-1946163784]},{"sector":6,"length":512,"data":[-1581031963,104538426,108881318,-385953560,-4653549,-1957313537,1208403948,-1711275933,260117512,855930623,1911050432,358193917,-1034088575,983629826,906378017,-1592951775,100868406,104538424,92217658,-335685912,336108076,922685313,922689850,-471308888,976683004,876512033,91488289,-352320840,112643,-47781808,-2129307238,-1957313777,49054188,876512002,125108257,-33651059,375761059,-33651059,976682832,-58726367,1189630034,1493616618,-956257508,18958854,378320896,-24736432,983650557,-1509541087,-1928430235,1358823046,1497199848,-352320763,1354773250,201170664,-352158272,557490478,1705379387,-152563587,-24736259,-1679273731,-12392197,-2037576725,-397345282,619248526,-18179,-859248560,-1946163784,1438866917,113765515,25416,-1560000885,-1073012428,-1070394252,232974416,1342177720,-1711010840,260117512,1503266283,-401637099,-1034027272,-1957363710,116163052,-1923656190,-1543635322,1049322920,916529466,-91846367,1665704445,-33782135,1342177720,872391912,1407733952,-504868825,1241958183,-956300511,-1323542266,-1506345216,943128421,557496353,557234256,-413800368,-963907445,2113929021,9038083,992032417,1962801798,-59119611,983639531,1959213857,1575507721,-25499394,-2037705237,104594940,192176968,557463295,1342177976,-1577333784,-2037833418,1049361914,1218519354,-58291869,-1178170371,-54853627,121319085,1128466036,703330274,174587694,393220]},{"sector":7,"length":512,"data":[1835015,-1374683107,-1373721065,-1374179810,-1946260504,-401937424,-259261046,-488111125,-97283,1290339196,1354773503,-1946230552,-1956749370,-943497755,18954758,-402396416,1048837277,2130797990,-69605130,-326412861,74877782,187882984,856061120,-35106624,2096499640,318669573,-963966594,1342228485,1589177320,180829,1458342741,75402071,-1274264182,-2081387776,2855230,2105544052,125042704,-1274198646,-1947170048,1566465990,1426064066,-326898549,75399940,-2096663552,2855230,1048779636,1962949630,-62470646,-28916011,-970593352,-958727098,-339739066,71731995,1006503483,1187383925,1187432188,149665278,-1006876986,-1258404154,1347469363,1183666256,28856572,1525174272,5224482,1354773328,1342197688,-1924087757,-1202651578,-397410303,-443866559,180829,-2081649835,1465256172,-1962641781,1161926,-125050121,701679489,-15341482,-1996339829,-1072956858,-396924812,-1072955598,1979670644,838592516,200820361,-2096794378,74777086,-12326826,-1274264182,-773795584,98619872,1183390084,-1965519876,-12154873,909843851,192232446,-1962520694,130481246,-1979520051,-92864753,11846026,838920272,-1946204534,126418014,-386369793,-397004379,1583349411,-1034033781,-1957363710,49054700,2123061078,-1161327868,-487129071,-964562805,-396940846,2089025151,141885188,-402361089,1810575729,175439627,1946288003,112645,-1070398741,-1962981752,11798596,1149915200,1073787913,172264016]},{"sector":8,"length":512,"data":[1346371764,-1274329974,1448099840,1358850536,1200233611,1342223361,1200233611,1342223363,-1743829878,-12154288,-1696051048,71600433,16744064,-396950412,1149959906,1342223374,1462014696,-1946286360,1583285316,-1034033781,-1957363710,-1957210388,-947190658,-150990406,-2114941982,1462358726,-2080513304,1962869884,74776338,-399452952,1153901138,1476394756,1610468072,46292318,-326413056,2123061078,-1161327868,-487129071,-964562805,-396940846,-396952149,-1957626414,21465628,-397410124,-396942882,1583349143,180829,1458342741,-1173993845,-487129071,-1207969653,2062035414,-2081387728,1946158206,112649,613476432,28837867,988303360,1592284722,-1034068432,922681348,922707380,-1766300238,314069016,-1205972992,-1202710144,-397410296,378085944,-1365023312,861324133,1443228662,1191130088,2081619587,112886,841738320,1706034887,113704960,26030,-1957313698,-164407572,993787553,678691910,-1560000885,909720574,141831057,-1107207192,350945281,1358954424,-1194812184,-397410303,-1070334542,-38999984,1006515967,872299496,1843941568,1590070051,180829,451065886,754031184,1499012511,451683969,1048637407,1946183331,1343991816,-342384152,1354773257,-386005016,1438851331,-1957237621,-4717450,1122521343,-236431672,1354773501,-2094814744,2855230,-167050124,-397014924,-396951885,-166986430,-1545075339,-402396161,1566443867,-2097151294,3931710,28837237,855829248,1006543808,730939011]}]],[[{"sector":1,"length":512,"data":[-402295808,350945452,1342177720,872222184,132665536,-29949955,-40441797,-1170473311,-487129071,-2020878197,1455630808,-1858174121,309592107,703334086,1683005441,-291308028,702390825,1760043755,1343654408,-1962887580,-141864966,-1957760981,-1560345402,-576574996,80186153,703505151,512879080,1343939256,-1624444518,1599691037,-1957313698,1988843244,770201092,1354773501,1445127656,1459485416,1593608680,180829,-1979645767,-2140909514,378207686,-1031773177,-1207453697,-991427072,1994965843,127002879,-397361101,28900756,-1914155008,586541309,57982987,-2080388632,2855230,113643124,-16766498,-398721482,871104205,702416582,-18431,-955258800,-397361101,28901252,2112376832,-24844033,-2096611608,3931710,922684789,-1578615810,1354773500,-1591618584,297417726,-1948059904,-662205480,-1957313751,71732204,-150990406,-2082960414,-14035265,28837236,855829248,46292416,1354773248,215136336,2275408,816048208,-326412861,1443425411,141986647,-955482485,702806086,1342177720,201308136,-385649216,113705171,25416,-1963434357,11799367,-1240901750,1220684544,-1996071285,119400455,990273163,-2096270329,41812284,233311487,10611199,949891,1586178421,74973176,-1993501464,1586232902,-1977644040,11797319,1354773328,-400666904,1996431075,762833150,989885161,58592894,-1961984373,2126985988,-2093184766,74776636,66759,1586168971,990315270,-1962180665,-1962474748]},{"sector":2,"length":512,"data":[1120938967,-4713471,-219655937,-1996190779,1187510854,-352321028,-92864730,1006257803,-2096073273,1946159742,178181,28836843,855829248,1459572928,-96010492,-1946401025,126551646,2113685051,-1956749360,214064613,-326413056,2123061078,175540996,-396996785,-1957087779,1993292744,-338744572,-1580649726,-1053072568,243860598,906191688,2122539848,158663174,1705647755,-352170102,-1440838905,55544421,11846026,1354773328,-1206027544,-11534335,1178142838,-1207601914,65741120,1344357048,1446053608,1445916648,1496678632,58181435,1610514152,146955614,-326413056,74877782,-2097150778,3931710,-1202318219,-1202711010,-397410049,113742790,89463,1048780011,1963015166,4096789,242548796,922703390,384311610,-397389068,1566499293,1426064066,-326898549,1996445198,-230257400,1695279184,-963907445,1913013819,74857234,2122517879,125042930,-1995809141,-11408585,-1927936394,-1705970618,250347676,369391359,1358579341,-335504230,1354773262,1342918328,1358579341,1344357560,1358186125,1343521720,1342929848,-1271537760,-559919104,1073787957,374864,-610604976,-954940285,62022,-16097653,1996430903,10263048,1183518444,-443851022,574045,-2081649835,1996431084,-498692852,1675552848,-1981393271,1446765638,1966043658,138820357,1451960434,-465138714,1996903995,990213405,376898630,14843523,1451954292,-465138714,-1995546997,126419543,1996445675,142016266,-398029546,8690256]},{"sector":3,"length":512,"data":[1996426988,74907398,-196702954,8690256,-1070395668,189708368,-196702896,558151760,-398029488,344176720,192657488,903848016,-1605369676,11810270,95965248,-504868864,348423130,14829255,241076992,-16615425,1996430903,8690188,1183518444,1575324642,1426066626,-326898549,1996445196,-163148538,-1375147952,-1928825089,-1202653626,-397410294,-259269273,1358317197,199236072,-1924104970,-1924073914,-397347770,1586212398,39291142,2122516361,729088244,-1202667469,-1202713778,-1202711385,-1605366917,11810271,903782480,1346371764,1342178744,-2082842648,-4321596,-1928532993,-11471290,-1326971786,-1957078733,-443851066,442973,558251651,-955745024,2180614,-1961825536,1248111126,992036513,-1996196158,-1021229546,558382723,-955745024,2181126,-1609307392,11822323,-1588932469,-1036312248,378078326,1438851400,-327029621,1465254220,1688800906,1007304323,-2146798336,192021753,1946679680,459663366,855761641,-149820426,1946157510,-351817724,-2011123710,1191100546,10550913,-1432229518,1210513252,1174799137,65065249,-1989890554,-939607418,1325315206,-1441887488,1175333732,-1266250975,1992375294,-336491772,-1263105276,-775517186,-1132033568,-1858173954,242483243,-1268494176,-260864,-21592439,-291499285,-1979665367,-1238766570,1220684544,-21592439,-1268452448,734563072,-1960753138,1006548614,-352160063,-1232172284,-1198618114,114686,-1962883863,1006549638,1935997702,-1132067990,-83477506]},{"sector":4,"length":512,"data":[-1961068700,-1591665130,-2046615268,1347616442,1619430678,-1224781569,-1779892548,-1956910114,-1591665130,-2046615268,1347616442,1619430678,-73314049,-1165612188,-1098479106,1911050494,-266957858,-1165587612,508580606,-10451315,-21068285,-1132033200,-1098503170,1374179582,-1961366562,-1956319210,1392425606,-2037574064,-11468960,-385958730,28892728,1448562688,1619430743,-1070378753,416016464,-21723509,360105531,1346422411,-1263075497,-2037557250,860946112,-1360506688,1688903960,-2046697263,994574010,2013182142,-13375229,28841707,-11055104,1476310198,-20937075,1354773328,1192789224,-21578181,-1029643146,-1962888092,-1948003880,-1973112689,-1962887999,1177955312,-1262122463,1208363776,-1199142623,1928727550,1925188368,-1263125748,990278654,1929295494,1354773260,1343991272,-350471192,-197722348,473098340,1346422411,-21461365,1659392064,-1956749541,1438866917,1465314443,730939011,-1609796608,11822160,-964431733,-1609438213,11807214,-324996981,721466409,-20544528,-1272320608,-1594324224,11807211,-1957693397,389874758,-385649152,-661979000,-13704239,-222723161,-1111885639,45728697,45744826,45744826,-1279664454,-323361095,45744825,45744826,45744826,45744826,-860224838,-1581656903,-953457494,-350140765,1175387970,-16454879,-400472570,871103774,558368455,183173120,-1268452448,-1547293952,113713480,8518,908663275,283844936,558380545,251595499,82518344,558368511,-386070040]},{"sector":5,"length":512,"data":[1583349033,180829,-18346,-1077876656,1342177720,-940104728,521951494,1241958144,-402652639,-397370555,-259301323,2097151619,-1455521772,124912740,1688813184,1457026311,-335612696,1590070226,-326412861,-1610421117,11822274,-472786805,1689290635,-1963047287,93912646,1185152947,2109737761,1174849286,-2097151967,2855230,1352666228,-1962888092,-54426680,-291500053,-1962888151,703373512,-936705868,-12154295,-779468648,-1037369162,186730659,-955875904,2181126,1575324416,-1373715261,1334453861,-4095959,730939011,-1979091968,83932353,1038876669,11846026,18097911,-1728046917,-936707081,1006648963,-2094893824,23438910,28640373,780797931,-981441114,986024703,168457153,-1979419411,-1325208627,-1262384639,-1957313792,71732204,1006634555,10689908,1975520060,320976901,699925483,702915347,1342177720,200800232,855930304,-402199616,28899192,46292224,4096768,91553852,-336667928,-69474301,28858051,-840413184,1958743031,4096803,477430076,1006515851,1358954424,-1195470616,-397410303,-790039492,-72357634,-197990314,-1957313698,705072876,73304832,2760235,-1706426184,1616,180829,1840133887,-1006641176,1840264959,-1006643224,728608929,862331398,-1710968366,60735,-326412861,1988843350,-754667260,71759854,24379407,1840292166,1713505835,108250683,-1031024077,1049301739,906061346,581002786,1840161638,-1070344309,-1034068385,-1343750142,2144472063]},{"sector":6,"length":512,"data":[184843274,855929792,-1190401088,-770965506,-937229707,-2084322933,1812030,580978804,1840161638,512432107,-919397608,453777035,-1709503839,59703,-1374254782,581026669,1840161638,-326412861,1342177720,1342180280,-1962641665,-1976918498,11797063,661121104,180829,-1206498584,-1202716667,-1202716666,-397404427,95955271,146296832,280514560,954748951,380090409,-4593584,-4696381,1005080831,1006543293,-150990406,-1948742686,-1557538681,213400578,99110912,-1421966349,91488307,-350755906,402112003,-1642165418,-1274574294,-806858752,-6756316,1342177976,382842960,686155856,1342177976,1342178232,1343675576,-1205283096,-1202716651,-1202716667,-397404441,113715399,21569,1342177720,1578659304,-326412861,-401806205,-1072995098,1874331764,247175680,1586171777,41418502,-196702954,10263120,95948524,1183666219,-1746382604,-1202104020,-1202716642,-1924136954,-397347770,922691703,922709454,-1927909940,-1705970618,250347652,1344996792,1358186125,1496082920,1423449,440400,-196702896,675932240,728615073,-1318205946,1357435654,-196702954,10263120,-1715990804,1183666198,937971956,-1202104020,-397404400,89730209,-1202716666,-1924136952,-397347770,-443865073,182877,-1275051,-776469386,-857190299,-1733844,-1229454218,448286821,770199552,899171,178256,1706473552,668854352,1343017656,1562756072,1426064066,1465314443,-1962508661,2105739381,309657614,1708243030]},{"sector":7,"length":512,"data":[744024144,-1072998055,-397015948,-1705574490,6147,661962763,-521279402,1348709048,1348686520,1343659448,1348843192,1496080104,-1746382759,1348032811,1496027624,1443687257,1348843192,1342184120,-1201490968,-1202716659,-1202716669,-397384266,-759683229,1239961612,-401713371,1583349407,182877,230643542,-1270971624,343146605,1840529025,209518848,1840529027,-1106938769,65734144,-2080374850,1869460542,1048776308,1962962356,71204954,1400176683,1840529027,-1090095761,12458017,-1863821554,1358077,768080,388216912,-1642165424,38242858,-2146631500,-152547328,138314532,91488316,-351797058,1241958170,-956301023,740055302,-1770002432,1534060624,2113929021,-2131719422,7185982,113706612,26879,1342180536,-1947121688,-1017225274,-4503372,105945855,-1014300672,-326412861,10939521,-4237482,1030399,-259856304,1343715000,-10713459,726788176,11557209,1183651408,345657516,-1928398077,-397366202,-1990645011,1040145030,142475267,61562509,509656,1353467533,-10713459,710731856,62413145,45633536,-2037559296,-397344932,-1950865861,-2037559273,-397344932,1499015935,1348903864,-1193315608,-397410262,1183670486,-2098704212,-1404662305,1552321872,468209919,-1202104022,1347420163,-10713459,637397072,857413793,374362834,1353467533,-335510374,-1404662514,396408912,1552321872,-1394061057,1348032810,1495918056,453943641,872414725,374362834,1353467533,-335510374,192526350]},{"sector":8,"length":512,"data":[-1404662448,399161424,1552321872,-1142402817,1348032809,1495905768,-1343729575,-1202104023,-1202716669,-1924136956,1358912646,-1591374104,78715816,374399187,1353467533,-335504230,379172878,-1404662448,397785168,1552321872,954749183,1348032810,1495888360,1810387033,-1202104023,-1202716669,-1924136955,1358912646,-14333208,-9581002,376294454,1353467533,-335510374,-1404662514,399685712,1552321872,-118992641,1348032809,1495871976,243801,505936,1552321872,283660543,406173733,1552321872,-722972417,-2091296471,7186494,1606288757,-2096108789,20163390,1304298869,-1107039464,-1923737514,1358912646,1495854568,1839767897,1996489533,-774337757,-1476448541,-1057308430,-1056653057,985579785,-1106384104,149624929,-350719042,411090435,1552321878,-1209511681,-1202104024,-1202716669,-1924136951,1358912646,-970680600,-2097107898,-15090114,-1096740492,1389507353,1183651408,-2070261588,-1592857600,101412286,91516352,-350664264,425703427,1552321872,820531455,-1923524311,-1924092858,1358917766,1495868136,243801,702544,1552321872,1088966911,1841471780,78762547,15548314,374362624,1353467533,-335510374,413120526,1552321872,-320319233,-1923524312,-1924092858,-397366202,-1168562031,-802488289,-10713459,-397225981,1499015375,1343789240,-10713459,671148112,62413145,213405696,-2037559296,-397344932,-996072481,1389507437,1183651408,-2070261588,-1206981632,-1924130623,1358912646,1495831272,-1404662439]}]],[[{"sector":1,"length":512,"data":[-1404662448,674752592,2079321,-2037526485,-805044388,678815826,-1732748967,-2037559272,-397344932,1499015078,1342178232,1342180792,-10713459,595978320,862857889,374362834,1353467533,-335510374,417576974,1552321872,954749183,-1923524312,-1924092858,-397366202,-1168562211,-802488289,-10713459,-397225981,1499015195,1343789240,-10713459,659351632,62413145,246960128,-2037559296,-397344932,748757803,-1311624338,-314598908,1347551232,-1404662506,8690256,95948524,-2037559271,-397344932,1499015127,1353467533,1353467533,1495760104,721428410,1552322000,1389364223,1495775976,412661849,1552321872,-337096449,-1202104026,-1202716669,-1924136945,1358912646,-1591555352,-768381394,1067058353,1375731949,1183651408,-2070261588,-1206981632,-1924130521,1358912646,1495758568,-1404662439,-1404662448,656140368,2079321,-2037526485,-805044388,660203602,-1732748967,-2037559272,-397344932,1499014794,1342178232,1342181560,-10713459,577366096,1839742595,-401312510,-768345166,1067058353,-1996488467,1183448662,-399709188,1347614778,463879811,-2146994944,4001598,-1070398348,245434347,403057435,1540502299,332923737,-28407350,872177289,67156178,1996443730,-59310082,15506586,-1927917568,-1705989050,250347676,1343658424,1353467533,1495665128,-1404662439,386971728,1552321872,-1192734465,1348032806,1495658984,243801,1226832,1552321872,-790081281,112673,1292368,389593168,-1642165424,38242858]},{"sector":2,"length":512,"data":[-397410124,28843969,1676169216,1241958161,-956301023,-669230842,-1857034240,1447028816,263780491,703090688,2097089516,-16637,1583335307,-1017256565,-2115204267,1442874092,997113687,1346099896,-402360577,1499014719,163203,495658101,1946173315,1004386309,-524811285,1979666491,74907396,1495621096,1474842713,-380020443,2105737437,410321666,1346102200,-402360577,1213801909,1342457347,1495661288,12577113,33717635,-558360715,905924667,-402360577,1499014434,622651472,-1561765543,41779968,-385649663,-340262765,1996443707,628615172,1174620249,-1125625852,-10921691,-2142859979,632416336,-259303079,1962949760,7334147,-2142871317,292814908,1352139914,1346105272,1495600616,1975520089,2125892073,1174531071,1946172544,-1744532975,1005566032,619767888,-1072998055,1015081332,-972721152,32178180,1005303886,2125922128,1005762815,74907472,1495568872,-1947709351,1348032804,1495565800,1015039577,-342067968,41779974,-2096729084,-202832185,-1956749314,46292453,-326413056,67169409,-67074419,-20649904,-1924087757,1358692486,-67074419,616294480,1793609817,-1547684991,1017322266,456827675,-400868958,12106246,1575324422,-326412861,1988843350,108956420,902643337,117819275,848208640,-1556843357,346240363,872915765,-1959552605,918983,-1557183581,1101213395,819634988,-1556992861,-947178735,-1560275707,27470814,884122418,1057343115,715039488,-1960128093,3212742,-1557483613]},{"sector":3,"length":512,"data":[665004685,96897834,2091057194,720610090,117819019,702784256,352700043,717267712,-1960175965,3671494,-1557527133,914959074,-963958318,-1560277499,-963958284,-1560273915,1805855288,710583082,-1960162909,2295238,1600498851,79846750,-326413056,10546305,607554390,1619445358,-2037579521,-1202651296,-1924130443,1358913670,-2138695448,16736446,1974996597,-2037559271,-397344928,1499014143,-10451315,-1704057693,260115318,1840529027,-1205701632,-11531158,-1922189770,-397365178,1499014107,588572752,1183668569,922702000,233336356,607553996,-443851154,883016541,1713545984,1207975073,-1586646877,-1556060638,-1581027922,-1398603734,-1547685011,-1432130124,-1982712979,-1553084906,113667532,-956076510,-1553062906,-905525402,-399527571,-1365115061,1713546093,-1023409736,1345249720,1345252280,1342439608,1358950584,-1192367896,-1202704669,860892915,-11513664,-13702858,-399579338,-407310746,-71806930,922701870,922693349,179973859,1388327680,-296949680,-1006633032,-2081649835,1465254636,-1107001717,-1705572864,6147,57982987,-2097121559,1815614,113726069,14031961,-1202667469,-1202713749,1464864976,1358954424,1343276728,1342930360,1342180024,309328,-914954160,-2011904893,2122383174,192240127,193528808,-1961525312,-2146309136,1968111486,2106058760,-343929368,234929667,100728449,-776464523,-206024603,-1461170074,1465473314,193470696,-1962770496,1606847472,1575324510,1426064066,-1957237621]},{"sector":4,"length":512,"data":[-1070398346,-382539696,1840529025,58458368,-2097118487,1869460542,2028536693,-1237909760,1747433581,577103952,1048795481,1946185144,1023391777,-1204355248,1023195245,1747433552,562620496,-397387431,1499013506,561834064,1048795481,1946185146,-1172403406,142081901,-1946223128,1036422128,695535104,1840527103,1840914059,-745863285,722518659,71762882,666377808,468209768,-1207243909,860907559,1038635200,1979059146,-18427,-963968277,46292318,793878784,100917457,378220373,-489607341,-1039932719,794629771,-489487183,378257923,95498071,-1039932717,794760843,-489486671,378257923,129052513,-1039932717,795154059,-489486159,378257923,162606951,-1039932717,795022987,-489485647,378257923,196161371,-1039932717,794367627,-489485135,1438892547,1465314443,478152447,-1172537183,-487129068,1348350469,1495552744,125091851,478154495,-402597143,1183476894,1847763460,1840514759,116785152,1946316322,272531466,57933885,872219368,-1983738926,-1553088490,-1130140226,-12720019,-1955714909,-1590762218,251997923,13796096,1587152049,-1560280851,378236460,-408867095,984366,-1325346173,-312567292,782434304,786538862,862857891,1841603520,862831267,-837383726,1842127725,-861464,-395434954,266917199,607584086,-714872722,1847867135,-2131498520,4001598,1048775797,1962941350,112645,-1070398741,190608547,-402295616,116126253,-1553587551,113733038,73968,-2130630758,-267991281]},{"sector":5,"length":512,"data":[-2097151968,6059070,837288820,-2146500622,1566465820,1426064066,1048636555,1946172588,75399436,91490817,-348345160,-214007793,91488358,-345574472,1722005507,180829,-2081649835,1465256172,-1107001717,-947126273,1024066093,58064902,-1962810135,786682328,-899373057,-868234056,-881406921,-868234177,-105330062,-1095217136,-340242323,-488091544,2109737963,36890883,1358954424,-2085666328,7186494,1048774516,1946183935,-1105279891,-28930963,1476157065,1358916840,1348871352,1495259880,1847894873,-801920096,1354825440,-989966104,109902942,512323008,1048800702,1962962356,-1472298233,561315949,-1946972696,-1270971408,57999469,-2130588183,1963852030,29681923,-50075562,-1142296437,833537,-447813552,1761543879,922681344,922709440,-1936036418,-1995472624,1183447638,1959791608,-92864699,1467541584,-963907445,1946550333,25487619,451677825,582484096,666390545,1223184488,-950445793,18513670,16824320,439811920,666377755,1206407272,-334593672,-385843174,-440532654,285849855,1354773328,-372809752,-1397227198,-1024962500,-1072998114,-1397223564,616058940,15224934,-346466017,1023522829,1713682512,519170128,-1212655271,616058895,1354256486,1021857792,-1947169848,2109737926,16836867,1713651328,-1206225920,860907044,-1202696000,-397406886,-259296307,-1072970101,-538377347,-1405190144,410320956,1713651328,504460288,1348903864,1713682462,-806361008,695517195,1713651328,504460544]},{"sector":6,"length":512,"data":[1348903864,1017952286,-807933872,292864011,1017952286,616046160,-957853594,1975520207,1773463555,1348871352,1346153656,1495162600,83934809,-402619927,-259263773,1459649001,1358812392,1348871352,1495155432,1847894873,20825995,1024226314,343149062,1946814269,-1607800036,-523226197,-397360898,418118821,-801920096,1343030496,-335767320,866885643,84205776,-57939888,-1947082264,-1270971408,208928877,234946177,-397015436,-259261603,1839611520,-1206815744,-397344769,-1202651799,-397383423,1499012567,1583335051,-1034033781,-1957363710,1048598252,1946185126,-1472298212,947126893,1358954424,1358773480,1349059000,1495103976,1958742873,67552803,112722219,1273516042,-1947169795,-49722,113641844,-1962923260,-972297274,2819078,-402360577,1566467792,1442841282,-2097131842,6881086,113721204,14097497,-1202667469,-1202713749,-1202712629,-1202713731,-1202716667,-1202716662,-397410300,-997997604,-259287026,1497220747,-402426624,-24942462,-955878373,6881030,1590070016,-1472298045,74777197,48990384,-777911888,-1472298188,75366509,48990384,-593362512,903591988,-1445599152,-326412861,74877782,2130706051,37128452,-2147025092,478191900,-150989638,1580336610,533588048,1958742873,83934723,1962933891,16679174,-1962642162,-2126773706,1963262206,-6952924,1048637579,1946170848,1006543120,-150990406,-1948742686,-349579129,83933187,-348388701,-1398347577,79283851,-838092032,1946630958]},{"sector":7,"length":512,"data":[-498908410,778497015,550911,458758,453574664,1607351502,-1194446642,-397344769,-1494701138,-940536900,3932678,-7804666,1342767544,-1946252312,-8590864,1358954424,-2085909016,3932222,-169343115,-336557090,-340465659,113766539,117455874,-1191224855,-397410303,-1073000485,1223232637,1743279871,-370111556,1566506818,1426064066,1465314443,-1274784118,1596050690,46292318,-326413056,1586170859,71761668,-555206657,73305087,1962950528,46292461,-326413056,1444605059,108956503,-392682776,29282473,13166848,-472785269,126491019,1672611386,-1696005260,-773944576,-1978037277,1352139079,1495245544,1023427117,58064910,-1962894103,786682328,-822827009,-819802342,-813183141,-813183097,-813183097,-813183097,-820850809,-813183097,113758051,80904,113733099,146440,-1205967381,508585943,-472785269,1077936523,-944248752,1742159488,1175942400,1178322571,504331524,1348982712,-773944546,-399376413,-677328999,77830247,-953357508,20711942,-953881856,18950662,505211648,1346112696,-773944546,-399376413,213436273,602427452,101107655,1174405436,2097444411,-13571837,1065360779,-14584832,1732491317,451799120,1136154969,1625837671,-1577013041,1386374058,1732491363,-814749616,-1952820504,138314736,57999420,-1207910423,-397406501,1048806590,1962941350,-1405190130,125042748,1342247352,-1582093848,84229128,1407733770,-1757157126,1840529027,-385649408,1048641686,16805300]},{"sector":8,"length":512,"data":[-1947663492,-1270971648,58027885,-2097118743,7191102,512438132,2013228474,-26351608,-397399888,512491093,2013228474,1183651330,-1667608346,-1928401920,-397351354,129564239,1223184445,288930046,-29235120,1840527103,-431583978,10263120,1183649516,753422566,1023981822,-31070128,1349003192,-1325523224,115888174,1343074558,-1325530904,-85438454,112893,-397013781,-1070334717,-1755256752,1583333427,-1017256565,1913203432,41219,-1022801688,10546305,-402056472,57872083,-1979671831,-1979666802,-1979667282,-1979667818,-2147440458,1946158207,105351952,-153553328,138871516,-351705342,-20316651,-20250931,1342671822,-587802378,33703682,39322471,47186632,-1946942740,-2147440962,42174,1988961652,1381373442,1355123281,-1979034904,853594305,1374684132,-1390471650,985792170,536377034,-1977554087,-773573951,64550880,1380976327,1355123281,-1979046168,-20895038,-773573952,-17300512,1995324101,144435374,10536065,-2130703166,-402611988,552077415,-385649906,-1903558487,-1366687570,-1769340756,-1232469846,2139095208,276037636,1342588811,-587802378,34096898,367724903,-838940162,-822162690,-162527349,48035544,1728184903,-939370493,-335359998,-1232342014,2123169958,-1531019262,829685760,1364350742,-397359734,1464928671,118883870,-792622561,65286880,-28859144,1992964801,1499406328,1364350726,-397359734,569051519,851544720,-136261148,113640408,-1974382000,1760055493,717392393]}]],[[{"sector":1,"length":512,"data":[851508929,65065444,986054384,-392202514,-998176807,214040736,-1595113216,128313344,2013208946,-1501132277,189237248,10796672,-401771520,192023883,2123171606,911362,-387698088,-998176859,79823008,22514176,1334507058,736965123,105988554,41418583,-397264897,-1974007557,-1964756473,-315489713,-784218069,-1963457568,1191224966,1610408618,2013222662,1379401474,1107876584,-1010048423,-402181400,326241515,-2012854646,1183450183,1962884100,88573955,-402014232,79824701,118614016,1913441000,209250307,-1022939928,1913062120,172291,-1022943000,1913059048,821789465,113707125,458756,233311467,35556096,-1547465984,-18350080,2139144966,158663200,288816979,271050752,176547931,185761675,-1958841089,1730807879,717553159,-1057094073,-141826826,-268177405,396939,119459371,-523131661,394793,-1961732213,-2097146338,225718523,1913804601,306653443,-350986357,-327040018,2028470435,-385650170,1342570785,11648708,-1324365949,-1930439932,1539769280,-1803056850,-942108967,1030,136218880,101107456,-1006632960,-1996445250,-1946145730,-1979699706,-1577015418,-1945698261,-1962931706,-1962889338,-2097106498,91492327,50335789,3227079,113707379,262148,-1560231703,-2037776370,715260077,1183651328,115888130,38177538,-1962925405,614690118,-1534686720,-1545565696,1183449126,-1650029996,2663168,10126987,-1207956317,-1903558622,-1040318291,-503906123,1207972101,-1560274269]},{"sector":2,"length":512,"data":[104529926,158466062,263879,1676345348,3193744,856396008,1876928,-33546589,2138816,1200209971,273123602,1200162697,2662662,-855717634,-1996339319,1204160583,1204158468,1183516427,206014810,10389131,-972142711,-1342037945,1090048,-1342172766,-1383167488,-2097105664,1200104131,-1929846240,-390056998,-998177419,247595171,88467456,-1276637838,705661701,-20895003,-390005052,-389872295,645006639,-1979300214,394986598,74760202,-805123842,74769418,-201143042,990664585,1962934814,-389903611,719850515,311813,1912930024,71731718,-402289176,46269721,82700288,2013203058,71731984,1477461897,-1039858456,-655884286,-402230780,-706215900,83093512,1392509634,1212291,1602947956,821789460,-336006539,67553031,-117437696,1465303899,989868222,1946162206,343903026,-1995028597,-969206203,1049168245,2089353238,-1962546412,343706096,1324683,-1995154295,817829495,343902464,1318537,1595301257,1827193694,-1961922044,1200161862,35535630,-402426624,2129136500,180740,1912885992,545226780,-2146011903,1962935422,1354773000,-351736344,168683528,-2115501198,72869897,-402652478,426902571,167782049,-1978501916,-75496354,-2012843006,-352311778,640059396,-387698176,46269489,67495936,648021362,-387698176,1438843937,-974590837,545896451,2126829710,37349380,642974880,10585480,642974369,-1593424503,-1993977088,-23002555,1166616146,1392288004,184912166]},{"sector":3,"length":512,"data":[-402295616,1173029239,-1929378631,-61687242,-1379892052,1364592244,1582944511,1558770146,26273793,-402541848,-1960443388,1392288517,71666470,642973347,-1560132213,-1960422656,44238405,-2054543789,77725857,35448915,1560498408,1442841794,-2144979571,57933884,637826445,-1993997175,-1017249188,-853933896,1964653584,-1211397283,1961691648,-774010342,-1948003869,642942599,-1962654327,642943111,-1979300471,-788482087,-1948003869,642942599,-2020932215,-1993977208,11534917,-1571635038,-1012772163,639470930,67575,1569524341,133637636,175374337,509734,-1022966272,113704786,-1023388998,313790643,-75493171,-1205570544,512557060,-511618438,-654114562,1659379595,29620223,-972589824,5423110,113640939,-973057341,5422342,64273091,1912623336,178185,-402652485,113704761,-1023388992,-402410310,829554745,-385876039,551748139,-1964197198,1893826760,-1157545544,-109051900,-1206684592,-109051711,-1207405552,65732673,-1157627464,-85458943,-1022966018,-1329397678,-331158001,1722867850,16824814,-2031288606,-58659104,-117345178,2105747139,796131332,1803386918,638219444,16926199,-350194688,1173825032,1962934530,93005334,71665446,637896998,637683083,637945223,-1023261303,75334438,-1172474880,-148503628,67141,-726006923,-6821885,-1070396813,71665958,105220390,-400716349,1569521671,124932,133637827,242483204,1388709517,-1207872792,427032608,-148497685,1946161159]},{"sector":4,"length":512,"data":[12079891,-2129605265,-1202309125,1968898560,118040067,509040323,-561056205,-1929117506,-1866921859,-51785472,1595909619,106414942,1389706948,503679526,-650212089,571730,-1924157710,726849798,-1947741704,1012064645,1007776784,1343058992,1391527565,1476454120,279970421,-2010751225,-1023368827,119473694,100080048,812908572,106256208,-1223610184,-838880768,1599932176,1958936152,1354926619,-927342090,1992375040,22984970,58114363,-1996386119,1476435597,10192264,11077003,-1207471102,281898756,547959531,-1977650176,71061829,121373810,-1115679627,1965817996,-2129654782,8671869,537662069,1166675691,-142662575,1946173445,4712451,10126728,12255412,1803387056,-1223789388,1006810296,1007055872,-1274907646,-1599764479,-1734506240,-150949888,1946157573,-1585056247,41226240,-2054619216,1166737570,-401241240,-2054617159,-1195179876,-1064435648,6660134,263193256,128975477,106387139,1036318859,-964431733,3964932,1957036916,1583286264,-1162193213,871467779,-2136412965,326499296,-319107445,-511662013,-1962380038,-1471943474,-67444608,707052382,707013156,17236481,1296976215,16797249,1381040128,102651734,-1979812097,1506016862,-1979818357,520617550,1499094623,119428035,1526726888,-642258047,-1801482706,1539541977,-1957340989,509040364,-521601968,-661892865,58048523,-972100615,50340102,2098942,7819,-1664919304,198741072,-29592384,1962942478,473858870,125108224]},{"sector":5,"length":512,"data":[1982083,-30903296,1392517126,1448432209,-16376233,117447710,1566465823,-27567782,-956293106,7174,503760640,1476395008,1595890077,-1018077858,138811,1200293236,-402199796,1200162406,507233036,91488258,-351385717,107210758,-1022474359,-2134341039,141885689,234873832,971710464,-2130704456,-1275059138,-1341426429,691961869,41163008,-109049936,-1977715710,-2134049056,419440958,116855668,262178,116853620,2097186,12059509,-2117904122,1426125036,-437719925,39291646,-1023535318,2123171606,-1274574254,65065216,71797496,2828022,741786910,-1963982080,-1977678780,-896924313,-1410137931,-189348578,-1928915456,503710334,1475839751,-4652880,1336865535,734497625,-2013688895,-1073018889,-930407820,1917909379,5290243,-1527529077,41308220,-1036365648,-1031142794,172460063,518244491,-1040000778,117631185,2123227345,519570258,1988960022,-125400574,-492133376,-1927929860,-11513274,939459191,-402163713,1256718351,-998154754,113377520,-352210944,-2097106942,-1957361428,-31004436,-1979431288,1177161798,-2000617970,2139097158,141885728,-402108790,1508573285,-1978906998,1317670486,13363208,168187528,1378186688,-1274132854,-991899392,-956099970,1996443654,209125134,17071744,31982964,-401282300,267060289,-503962959,-1962921979,105810648,-1979704088,1317668422,2127047176,139364360,-351386112,-38016857,147096413,-1610609982,1183318049,-1979665150,1193937990,139954695]},{"sector":6,"length":512,"data":[-33138902,-1964837182,1462373974,50378246,-1948200510,-268234121,-787589494,310297826,2122381827,108265732,102692743,1190528799,175374594,33703670,-1510798220,417861355,-85810176,-391903509,-85852145,17071744,-142145932,119473694,75399363,1191343105,-1966913853,-1342130479,-327040256,-1957363552,-48043796,1006913418,-385649408,653656302,100859947,-259325908,773754398,38046208,520316042,105876048,1476451048,1334494346,13756424,-1979548019,50378263,-1963326470,11862607,507628075,3022478,520373386,369452938,-1918110969,1343619654,-16222209,2013202039,-24254455,773754398,-1979414016,1344209252,-402239606,-1973944181,139430596,-1979677976,260702791,705326986,717291201,48812229,-18283832,38178253,-906080234,108527441,-402163713,1183710795,-11528702,-973207433,-11416186,954730359,22514430,773754398,91523584,56048159,-964022665,-402239606,1334444079,2746376,369247885,105351760,-397258672,1183710731,-1974462974,1347422279,-33691566,-840187138,1576809704,10536065,41848259,-506396491,1737160963,92878341,-326412861,-1090778136,2000224304,-1962183402,379786311,340035840,2139818475,340232982,-2095823479,1966085247,373787403,-1996483421,166401604,-1961590901,1166612039,541574678,-69474304,-1957248163,-1962933730,-2097146826,192164094,35683456,1955267956,1005644566,-400853794,-823591858,239569154,512351883,1200291842,47573004,-401717365]},{"sector":7,"length":512,"data":[-1017249060,10677377,-387151019,1334508424,-1979665144,11929175,-1958622677,1200231031,38176775,973227658,1064765767,369378957,142081872,41353042,-1946343704,734145478,-11526462,-11401097,417858166,75402749,-100402685,371128199,1464928031,1499375091,-251453690,1191112963,-390468862,-2124547275,-1023368508,-387151019,1468726044,-1979664888,11863631,-1975332565,653657927,-1056767960,-125050671,788110,705253258,-1040316593,681574581,-788483072,309824480,294528,1204168564,-167050976,-1957343628,-2097143506,1364198605,1048627851,1459617830,1593932264,56449113,-337911048,541574703,1962281730,119408167,1442285343,556698406,147686144,-896839344,641630246,-397017088,1499332938,-268214952,520544738,-385957912,-1034028395,2139095042,175374880,35669958,-385948184,-2134638936,1946230911,-19339254,18892742,-1006725144,10546305,-387151019,548469336,-1190434934,118882384,1459781261,-1973441549,1468662607,-20305407,369145281,41418583,-397264897,-1023476737,126611938,990660489,1962934814,22669315,1576675560,10536065,-2146209085,1963008127,310346509,-955812608,184550406,1925445888,310346509,-955812608,184550406,-1983645440,-1996488162,-1996483554,-1996483042,-1996488674,1602819167,1280099094,1374456661,102651734,-485601653,2203691,1183384588,201756162,105286144,2631414,-2146941438,-523173676,1048639627,-989855706,1854605942,5302274,1583292167,1145331033]},{"sector":8,"length":512,"data":[1275071170,-326412980,509040209,240028422,564145123,-1995961344,2126774854,105286154,2631414,-2146941438,-523173676,1048637579,-1912602586,-1962931170,199754350,1595868928,1146968414,705092,-149916334,1946157509,46528313,-214535168,-1169167451,-973667366,829685761,181751,-319148428,-76363568,1942540524,-486824453,-147854351,1946159301,-973650431,24379396,-286735545,-353852161,-335879425,-1841131,-925831942,-789775502,-1527024696,-2889477,-1017450782,-1269673645,-855591165,1522699024,1405311833,62149201,281870519,378257803,451412002,1532582400,-1957538877,-1224559408,1511050496,-1957575845,-855526200,-138192624,1946157506,101137674,213390197,-150017269,1946157762,6765832,129500021,-1125596410,71732216,-1159180282,-120067852,-402652478,192149675,-1072965492,28837237,-1593185536,113704964,4,-1007109912,1945669352,198741003,-1207601728,65732609,-402651999,-389810015,1114830967,184829579,-1207732800,-661979088,1912614973,436615956,755921664,582549552,-137219328,1959922673,67553032,-352319744,545226773,-955747072,83887110,-1593316608,512294912,1458044928,180984,-386389272,561184227,294784,113707125,589828,1183454187,1979661316,88574467,108956496,-420980986,-131602184,-402651966,108263419,-369098821,1317667145,-1966473708,-838987154,-32483702,242649802,681692926,1942501888,1944861218,1926314526,1943026202,1928673814,1945385490]}]],[[{"sector":1,"length":512,"data":[209616910,974418944,973370570,-955484690,50332678,-17664,1359020265,2756234,817561781,583238400,2129792,-169734284,67553113,-1157627392,-555089921,75399168,1496019968,717392465,-1967063359,-18535706,-773523772,235834336,101591808,1942502144,113727757,262148,-369098821,-919404371,294528,243992692,100728838,1334378502,-1983892718,1183453255,71796748,-2012592502,1183450439,189237256,105875801,-2146936951,1946158207,-20840952,-20250939,-1995470386,1049297495,2139684884,340248342,1048772656,1966080022,371099912,1142851840,822051584,1569260404,2001172,337545472,1176406272,541574656,172475905,75399168,-2145881088,1946158207,92241929,-402426625,2139158892,57999115,-1946407448,206014727,-1979863832,1183452743,-146479098,-1961998455,-154408765,-402648382,695400095,1966144387,67553032,-352319744,545226780,-2146011902,1962935422,1342287880,-335860248,-62003192,-756546702,-157816581,-402652478,1064498795,1318539,1949367171,545226780,1393390850,7817,1128191,1543482600,2115526,-350855285,-64755489,-1560274271,2122317830,192151556,532107,-1803040978,-1593835303,113704964,4,-1024047896,417857538,-70129418,2013204338,71731984,-1070379002,-1645719472,-165156864,-402652478,-1259801093,-1977453829,-1040838577,-2147126260,65734857,-1978873472,-1957624722,1342572102,-16222465,1843923574,-168302592,-402650942,-2065107509,-15633669]},{"sector":2,"length":512,"data":[1183515766,-11532794,1996425334,5171210,-1024075544,1200226312,105265154,527863952,1948304118,105285646,1187483792,-1879048190,-1976898672,105285639,1191088272,-1970237436,1178075975,1989185540,281212436,1200228980,71731201,99324048,-1878767992,-327040112,-1957363540,-181475092,12097163,11845316,1963246326,146994693,-1185473419,-1070399489,-1957122318,1237855183,11046537,11175561,11306636,-1977216277,1206727181,11046537,11189897,11306636,1963508470,79885835,-897579403,192383500,-1024016334,-1342016508,146994689,34341492,-167763550,57934530,-385949056,1720251746,105285636,-2037772405,-1073086286,-922876044,1183368450,-1333360124,1958742528,46726663,105285825,973358730,58065735,973358728,-2013039675,1183450182,38222342,1183318902,1942043142,105285635,11044491,-1962785143,-1073020346,1542128501,38767248,839274026,-935640595,-930413962,-1228595631,118882474,-1979154803,-466483642,-133963567,1946469110,-1024023551,-1979485176,-253580602,11187849,-1927915233,-1974466490,-1056831930,-11482882,1996424822,-169482236,688279040,-1914174898,-157488130,192152002,-1979431170,105285639,-151094296,309658306,-1979300214,1200161894,35535628,-402426624,-286721249,-998154765,180486316,-200939520,1928969960,276299537,100943499,108461904,-402098433,317259400,443124,-326412861,512428779,-472820978,-1755932673,-11333983,189992462,-1346112,-11336170,-11335658]},{"sector":3,"length":512,"data":[-11335146,-957873034,-1017292518,0,-1892810752,786828294,-435282292,705072892,8437248,-1406737358,-2017096640,915117014,-964493276,112898,2899584,-1911459325,-1962924538,847229438,-475073856,2146533494,-1207767933,-1023213567,-31080189,737971199,-1956613384,-1899983641,-1898935080,-213298752,-1430244700,-225976946,-1014244985,-398208885,125239321,317210738,1022981888,1007186976,1006924813,854095113,199551936,1107784896,1975519914,-528071935,-470171598,743025685,68121634,1968978978,574390279,1236009589,-373033461,56171344,512634570,512353806,54722590,-1946907685,1928014828,-1981445146,-486531026,7768334,906151299,-524285268,871396602,4622784,203882286,604933094,1206407424,-125085439,611631115,-1912136162,855647774,-1527513866,116951839,2635519,-2097075736,-661978428,2269959,58048523,857400297,-17984,-1014808695,648999426,-193657544,1438844809,1048833163,1965052686,112645,1183520235,236882692,-1981558445,-6859129,861081094,1560341440,-326412861,2123061078,105220868,999790755,-955746873,9934854,-1961825536,512427125,2005505944,-1751604988,1594246281,1438866782,1465314443,-1962639733,86574662,-150784629,1074153099,2089354377,-1751736062,108382011,-1751763319,-24442645,-1996063229,-963968395,-352320507,1566465792,-326412861,71732054,-14298573,14844415,-397389312,1499005177,-24907637,855930367,-1592202304,1149867926,71731970]},{"sector":4,"length":512,"data":[-1996191424,-1583901130,67475350,1577118464,-1957313699,1183536876,634532612,-494796801,1347551232,1493220584,-2081387687,74842110,367771699,-1751501175,-1751763319,1074022027,-963967863,-352320507,-1017291264,1458342741,75402071,91553547,1995767683,-339725564,96963418,-131792885,-2080863233,9935422,-396949643,-346423396,-1741255870,197561239,-1959693120,-2083026172,-1036310334,1448544626,1509886184,-1960514727,1925659396,-857188850,83843582,67487371,-1961825536,909837940,-814377064,-14817193,1593895769,1438866782,1183575179,-2116777212,989921514,-1559792702,-1070399440,113708011,524334,-335544392,1438866688,1183575179,106334980,3147267,-1962880381,12681672,13796097,175493643,108252219,3147399,113708011,524334,-335544392,1438866688,1996483723,-6297596,1560341337,-326412861,-1727773045,-1293397934,-337277953,197352704,-150110775,-2083391533,-779943485,-1876038912,74695427,268485249,78768522,-184359470,-388765558,-980758525,-889188571,209570059,-772287497,-2097036413,-722796335,74695467,268495489,78772618,-617420846,-393555157,-805050157,254133642,-1974351104,-754667032,-1966079000,-740062523,-888972821,254139530,266568448,41275707,1456194363,-1064988010,-470351244,1958774161,65468164,-470313272,-882978557,1458342741,2123103319,-1962467836,-1178586409,-1359806465,-1946192499,-4651394,-139529473,-2013713455,29816823,-1543343104,-202780343,-1543408731]},{"sector":5,"length":512,"data":[15450763,-1017291169,1458342741,-1979418997,-956889506,158597121,1958951596,1958748697,-1019564783,-1071509132,-482736012,-467531660,-1070338187,-1924790549,15466052,1438866782,1465314443,-1946417378,-1070463874,-218103879,-138310738,15419600,-1017291169,1458342741,-1898410921,-1070334784,2123094155,855083782,-17984,-772296974,1988886155,-1968770300,1569390404,-339530753,1566465792,-326412861,119428950,108956668,-1070401653,-218103879,-1949173842,-1527577474,-352041333,1566465792,-326412861,119428950,-1962639733,1183450702,-52393464,116727,165872756,-372160086,24357875,1566465962,-326412861,-16353537,1996425334,-3545084,1183573387,1560341252,-326412861,119428950,990135947,108201542,112893,872154091,74877888,-1962508661,-1073018802,-251459980,1341719374,116727,300090484,-265598556,-372115413,91465203,-133959677,1583348900,-1957313699,142016492,-16484609,-1461189002,-1947890689,15402054,-1957313699,-852839188,73304865,1586171785,39291140,-1957313699,-852708116,73304865,1586171785,39291140,-1957313699,49054700,2123061078,185015812,-1340443393,-1188722176,-218300417,1238497198,1049299828,-16056286,1979612809,-339725557,-28933332,-25261310,-16040565,92991348,-378224630,-378150854,964745611,-1948093123,-1494023050,-646591609,-339244217,-1956749568,1438866917,901049483,-855357814,-1933341919,1560341442,-326412861,1183458740,1455758852,522308870,1397801821]},{"sector":6,"length":512,"data":[503730769,777344854,36445838,-997462901,-6840669,1996424310,276233984,620906123,-11534081,-1952998378,273058277,526278493,1532582407,-1957310632,71732204,244817059,1357643448,1342186680,-1946180888,1438866917,1465314443,-1962654069,1570217510,119496287,1146837338,1583337284,-1957313699,861361900,-1070378816,5552208,37152848,-1962490749,780862534,-981231714,-2132440294,1526797390,1600019033,-821616803,-1017291169,233556275,-352321095,178440,62456811,1465275648,-108270453,-1962260853,1586170966,273582862,141936907,1769263627,1702157067,116727,-771023755,-621344135,-628893449,214926080,175753483,-604513801,-2097096317,-376765193,1459626169,-164364493,-757997359,-674113839,192085307,-214236041,-215284366,-499057381,-1007199257,108265474,-678705525,-1007162415,125042692,-654845193,1593891459,147479902,-135006464,1946157767,868387586,-2131956782,275976441,-522987381,-638131501,-753876608,-875361301,-1961825920,-742378544,-108999710,-1961856240,-739716134,-2133199126,-472706879,-2134129909,-1031073559,-388771277,-326412853,119428950,-812924276,-66814325,-1425783155,-1666461556,-930305192,38177707,4623275,-1413379157,-1951677813,-661869626,868388523,1593895872,1438866782,1465314443,-2096734581,-746388997,74877696,344894972,-1381113717,-1387221680,-393499312,-1376220243,-1901215602,-1947170020,1583337411,-1957313699,-1940433172,-54489384,-1962508661,138841079,501467275]},{"sector":7,"length":512,"data":[-1070409589,-651448590,-24392821,-217811317,-12285274,855596426,737970916,1593895875,1438866782,1465314443,-352026997,108432150,92933099,74777658,283887499,3964998,-2142769035,-445317059,15450163,-1017291169,-2081649835,1979647102,-18427,1183457771,-1962888188,294123224,208929875,-1274788214,2098432,132844011,-1274788214,1560341248,-326412861,-16482685,-4717195,-1977488385,11797574,-2013865845,1946702609,71731724,-536543052,-351671297,71731719,15401140,-1957313699,-1973987604,1183450214,106334984,15409613,-1017291169,-13371853,989858491,-150572077,-336427021,2144539,-757997359,-674113839,74841989,108196667,-545000661,-387825664,-970523453,-315424763,-636757877,-396947596,-2090860606,-1993985850,-347781323,1978469355,96937479,1162281008,-81011317,638184267,-2044328566,1263249921,197391743,638548434,1194132934,-789064969,-2097151739,-1309998894,1458342741,1187257943,-993883126,-1595406722,1583292415,576093,1458342741,-768401833,-1962508604,-1998058938,1583292415,445021,1458342741,2126782039,172395270,-5511015,1566465823,1426065098,1465314443,2126838814,175016710,-1325398854,-1949969660,266568669,39356298,-277525846,531234992,-899850657,-1957363706,1381061612,102651734,-1054535219,81152,1183532661,1958742532,989626431,431229300,413850,604302080,1010904287,858355457,650546934,84158090,477421626,-1202696186,-661774199,7134362]},{"sector":8,"length":512,"data":[1488980736,637957127,-351992670,32241923,1595869176,1532582494,180829,-1706819400,1616,1971372790,1071808526,-1237204352,-2115481030,-134091777,105945795,745668608,-1957538992,1140898008,413850,-2134706688,-1023994252,276037643,1352285876,1509949446,95967323,82573568,-128427174,-1707166525,1616,-326412861,505304918,-15704379,-13440969,-745862286,-398655304,1931476907,112645,-661969429,504254091,-1274652987,170559,1931415417,-4069368,-352320840,176080138,-1259862647,532689919,-899850657,-1957363698,509040364,207537438,-437766145,-1962118402,-1261882413,-10622916,-1207602401,971702273,1317787787,106349834,43663540,1913616640,1959275284,225790232,-1706819400,1616,1971372790,-10360824,-352320840,-10885108,62391667,855829248,1583292352,707165,1458342741,1589976663,-398983418,192085636,1102369675,413850,-1207602432,48955393,1595916339,80371038,-326413056,-987867306,2126775894,905913866,1929271272,-1705593847,1616,28837235,855829248,1583292352,576093,1458342741,1589976663,-398983418,208862768,12112779,105945667,74645504,49004595,1595916683,80371038,-326413056,-1273079978,105945647,-1014300672,106874142,1200359305,1595875074,80371038,-326413056,505304918,-1274652987,105945626,522125312,-899850657,-1957363708,509040364,-2147068278,57827834,-1239356800,1106935866,481567858,1089110098,413850,-12822016]}]],[[{"sector":1,"length":512,"data":[-397273996,242417072,-1270748544,105945614,-1070399488,-239598613,1583292415,182877,-1273079978,105945625,1090781184,-883007713,-1962467753,-1070400264,-218103879,-947171410,1547486047,792461940,-326412861,-987867306,-397408698,1213923290,-96733045,92933494,1979703272,-8552442,1191277882,96865674,-2454784,-46208969,1912603064,-1707363315,1616,-1070398350,-654900501,1595870600,80371038,-326413056,-987867306,126486110,427081738,1979685864,553820165,1631324907,2050754674,539755639,-347928696,1583292385,313949,1458342741,2126782039,96871942,172395008,158711818,1352276404,67108870,-1261401535,-840413126,112892,915232370,372923778,309616066,1573000840,1089110098,1352288180,1509949446,-947701134,-1392748797,1958742698,1610148610,-2013007997,21350165,1461607482,-83696230,-389575922,-125042942,-385923702,12123916,-1609862144,11804930,48956809,1595922679,113925470,-326413056,-987867306,1720322654,1977879048,-398983414,28900436,-1961659904,105810899,-1706113920,1616,-1070398350,-654900501,1566465823,1426065610,1465314443,-1547685090,1789067880,106874114,501757951,-1958710532,1023457491,1929156328,-1193768138,1352287232,-167772154,91521218,-335759640,545896482,45668494,868823874,105945810,124911616,-1996330845,-402494954,28900503,855829248,1583292352,313949,1430580355,1465314443,1247724830,-1041745921,-1955237125,989626375,431229812]},{"sector":2,"length":512,"data":[413850,-1270807552,-1994451398,1187381830,1988975620,-2133816827,1202995434,413850,-985042432,-1031058858,1224607208,1065408651,-1976273862,-32839673,-633664907,2139105652,594819839,126498815,1979578344,509443,1352285108,-1895825402,370242055,39226655,1352285108,-1207959546,48955393,1595916339,-998023842,313924,1458342741,1589976663,-398983416,28900144,-1960414720,105286355,208929596,-1595392588,1025012731,292880386,425600,-919401612,1352285364,1929379846,534312706,-899850657,-1957363706,509040364,-402235765,57867094,536584936,-899850657,-1957363710,509040364,-401842549,-71763138,-1961790721,1455752782,-1707101176,259588098,-654900621,1566465823,1426065610,1465314443,207522590,-1191504408,292749307,-989442421,1085540438,2030043802,-150834417,1583292376,576093,1458342741,1586175575,-85137396,1451954290,172919560,-1274657142,105945666,1595867136,147479902,-326413056,-1910614186,-1090508282,1992622209,-53923066,1958742700,-348018172,-1441943305,-2146531290,-1105263104,1556021377,687978496,1824465357,687978496,1595875789,80371038,705072640,782312960,1412211456,3186982,-1017893213,2754190,643050657,-1593823581,-1557769170,1438842928,1465314443,508826811,-1946449145,-67098090,-1426053471,-1426030408,-1196703093,-1951727524,1824041922,-1031034112,775356331,808910592,707168512,1378257748,106349885,-850722376,545896993,-1896162674,707169234,1352465236]},{"sector":3,"length":512,"data":[567095476,171820166,-1911390974,-1593824762,-1557790674,815857710,815998464,-1885513728,-1895813114,1912614406,-10622968,-352321352,-21458414,49971455,-55572108,1946745472,1610264578,80371038,-326413056,1187272534,1411818250,1411909260,-1559869756,109859874,646534180,646665258,1451965778,242649872,567104948,-1961867634,-1557787066,646643714,82334762,1566466047,1426066634,1370773334,132653517,707168767,378468948,646665252,-990161886,106178054,-1898213808,168216515,-1946060800,-889189362,-1910470216,-795936040,1412048523,-850545413,1566465825,1465275851,567103924,189537929,76824260,-1178586116,-1410138105,-1414806645,-1420548447,-1420547935,-1582606180,-1582607326,-1901374428,113714883,31916042,202279974,463098624,-1962934258,-1275057634,-954086064,40740870,189571328,1593839621,-1194631842,-661774199,-1949266182,-79867354,567102900,270441040,-1070395519,-1710535517,3552,-1957210539,185289758,-399149861,646577734,-1014082518,168216358,637677824,790156,567103668,-850657096,545896481,-1896163186,707169232,513473364,856654096,189572032,1839728327,1583284227,-58668195,-2147126209,158679292,1037601872,1935187968,105945606,1439367168,503732054,-1662219438,545897212,512678542,378208298,-360644606,-628224000,855670468,-2131678218,91504636,-352310808,-372158199,-207355533,-768386651,-1700933333,1616,2126838940,737555200,583921,119495325,-883073441]},{"sector":4,"length":512,"data":[-372158128,-1977218701,1149805573,638182399,-1985673845,-136118716,1388533849,-1202577914,-1706033149,251331784,190449660,-1020363584,-1705900462,6147,190449660,-955616064,6922758,8435712,503730883,1354773330,-83572582,1510472718,24952843,1030595,1962933821,899347,1962933309,9615627,1962933053,964867,1256833419,-2131001074,-1274711040,-64893634,-1705900349,6274,-2117924868,1962967291,-73791991,-67108841,12108551,-64893609,-2117877365,1962967291,1772266244,-1949660221,1107343568,-1006886451,-75415069,779419776,454565515,1772232235,-885313162,-880082314,102651734,-1030817653,-982932831,52103734,-205419536,1595869092,-1576664738,-1910586519,-1261401126,-64893633,855798559,1460061120,12446618,-1022886912,721426408,1030333446,225574917,1772357121,94000902,-67108675,-628309241,-1912586056,7119320,1455676046,-1380385705,223733761,856388584,1839637184,-1553094493,-828150324,1842652013,-1553082717,-56398352,1845404525,-1553071965,144928262,1846190702,-1553068381,648244752,1848156526,-1200770397,-492595970,1843700589,1843398343,113734592,-2084540846,1843791559,1709731776,1077837824,1434255470,1847723766,-1337035775,570881537,41222766,-1499331920,-1475950739,-352321171,-1270971589,343175021,1843543691,-1795227775,1049168500,512454074,495545942,-2086371352,7210558,-692451724,-1541347218,1846034051,-1173982208,333999910,177334436,1594668776,82365278]},{"sector":5,"length":512,"data":[-1547685109,1084386870,1849860718,-1553049437,1554214490,1851695982,-1553047389,1688432226,1840423278,-1586616157,1419996754,1007076974,113641070,-1341690306,605457156,638976878,-1568413586,1847858827,-392098328,922722672,-492737052,1843700589,-392464920,116824320,1965059618,977174540,91506542,-352316696,7923715,-1553092959,110063046,1474915812,1074185889,1035009902,1972926184,-1781798872,-402599704,229677256,1972922088,-402542575,313563289,1956141800,-401690380,347117709,-342325016,1024704267,-1394079970,10741909,-402589720,-236446813,50915330,-393217048,2045254598,81127427,-1469177184,-1475578879,-402295806,65767140,-1014633496,1849689798,-397955071,1659410501,6809749,-1332191256,-1741166572,854078128,11462808,-400860440,1721827855,1848943470,1849689798,-399527934,-1779918823,41609216,-2145698072,510540350,-2048391819,-1341789438,-1744836569,-402483736,1407750024,44886043,-1610415128,52719138,58000188,864366056,1848288192,-1553060701,-1195151826,-1226309568,2144521,-1410088909,171870502,1049175552,1085800486,-1806112768,1852194500,138316070,571392,647260136,1493321670,1848655497,866893964,-1414812736,644732577,-1946155869,-1200761338,1857748996,158591086,-1409286216,243385259,-2147455448,1852311182,1848116983,108267520,672039718,-1960443392,637536318,-1224516214,1099638272,1848812298,1849048707,-2146274048,40779838,465505140,-402186691,1558746223,-397824000]},{"sector":6,"length":512,"data":[1973196543,-1806440432,-402632984,313562960,1956048616,6678768,1852311182,-402411544,1973223556,-401297403,110008081,-1960415640,637536318,-1224516214,1848811776,172067110,1849048707,638219520,638089611,-1224516214,1099638272,1849205508,571587,647206888,1493321670,1848653451,73173286,1848655497,1848784523,108366118,1848778377,1745260227,77669998,1842782976,-1912001048,-1586599930,-1557762604,109838340,244018644,378236358,719875528,244040448,378236360,518548934,1745260032,77669998,1842651904,-1911999000,-1586599930,-1557762602,109838340,868445654,1842782683,-1593817624,1072197076,-1878618624,-335596690,221849103,-1993997451,1569334805,58297602,1854815803,-1899762827,1049306816,-1977221112,958792541,74777673,72452390,142183206,-361365749,303398,-613040117,3008707,1712243998,915089006,-836042742,-768349743,63099309,200925904,1241609682,540299,-1224516214,106006784,2877471,-919381309,1852311182,138316582,1569334784,-1929332989,-14285703,-953788619,1090519045,75336486,-445251829,1524825937,-1893310631,-335355,-1878618398,868234094,-335596581,92874250,39684646,990083469,1970179646,110019568,-1960415640,637536830,67437963,124512256,641632550,-1070349568,-395449181,109980835,-1557762448,1990262786,10692206,544270592,1849310848,-1962052335,997057086,1970136126,-81860343,-385851720,179833053,148367616,627976353,3998464,504984835]},{"sector":7,"length":512,"data":[1852317326,669323,2506379,-1048376181,-217637372,334176164,1852311182,2531622,644769443,637536929,-1912592733,644769798,671371,-787641562,882983401,-1958262930,529213151,-109848517,-501380826,1721877488,1845887854,53047918,1919841798,2114323235,52261486,1919845894,-1912208617,51475054,1919849990,-1643773173,1023767150,108199920,-385844296,-51902395,1715389694,1049175662,-987889652,862875150,-1644435210,1049175583,-987889650,862877198,-1645483786,1049175583,-987889648,862879246,-1646532362,1049175583,-987889646,862881294,-1647580938,1049175583,-987889644,862883342,-1648629514,1049175583,-987889642,862885390,-1649678090,1049175583,-987889640,862887438,-1650726666,1715374367,9693294,-1374763746,8448110,1857069855,-1240546018,7661678,1857594143,-1106328290,6875246,1858118431,-972110562,6088814,1858642719,1841694348,1852311182,444198,642798592,132807,1721841237,446899822,1856938240,1876774,644789921,-1593827677,-1557762370,-962527200,581117550,1851302144,2401062,91139745,78708751,-1029445421,1851302253,1857422851,-1016216413,-13371853,-1510741551,-1952185997,-2082867249,-1070395423,-1064523021,-271383375,-946931709,1745260227,1857069422,3318566,644790433,-1593822045,-1557762368,-928972746,950216302,-1960393984,637536318,-1224516214,650284032,637817225,185104779,104232191,63406935,637546472,540299,56461862,-1960443721,-1031010751]},{"sector":8,"length":512,"data":[-1977219233,11993949,105483046,108382475,104958246,-1053047317,-947666572,-1957313789,-353598996,-1233744640,-1583606040,79392214,-1233744640,1946253800,1842651427,-1929378629,1810413174,639661313,540299,56461862,-2094661449,-1207957895,57933892,-1929296151,119453310,-1593420055,112946602,-1233744640,1963015656,1842651431,303910,1842611852,-1191228440,-680198074,644732577,263815,-1938959197,862836230,16443903,-1917421939,-385915202,-1070359604,116838539,1946447394,67221530,-10054003,-1986251288,-1769081274,-991363226,67063,-1996434813,1451883590,1975651326,1723239758,381586943,-1685985025,-1920826440,-385935722,-1769104378,-1729560810,1086465015,-1232267915,-1097990298,1625882390,75741339,-15296883,-1919162904,-385935690,1988952256,19720374,1962849256,4634714,-1912652567,-1912641866,-385935682,-2085053645,378965378,-1682380545,1847723766,-1925155832,-385935722,17168195,13796096,-1980217719,1177287254,-27911172,-1232263822,1911095062,-1233744640,-1962877464,1452013638,15919354,1508379253,-402295298,334168422,-1962854168,-1769081274,-1511456922,-1233744639,-1929333272,-385935690,109969790,-1993970218,855650366,782444224,-499217664,-144381843,-1017256565,477413387,-1960394610,-2097149890,210371527,-1958613710,-1951992874,637957362,-521468021,-1957313720,1156350956,-1946257783,-162469674,-1912846711,-628310970,-1962917703,-806814626,4210166,2122401141,1968198844,-1099005634]}]],[[{"sector":1,"length":512,"data":[930428501,-388610421,-1014103333,-1946140488,-699495486,1586219051,-156964612,867989133,4241919,1586210035,-162404100,644732065,-1946155869,-1955736570,-1195155995,1451950152,75753982,138316582,63406848,-315487094,-1494002111,-1023314594,-1962916424,-385409282,-1957362597,1424786412,-1979955575,-1960378794,637539902,-1224254070,142183680,406731558,103838720,130515799,-391350643,123705820,-1339717082,-1403613952,-1919265304,-387404714,67061,989909635,-948765098,1178273143,-1950320900,-1950130715,-1955739634,-395459050,110033421,-1591317048,-727515132,446768749,984320,-388823887,-1056718452,-1016215389,520082664,-972648954,-164421779,244055859,-1561853926,-1591337063,251985946,-754667264,63016168,1841734593,644732577,-1946155869,-1016211962,1843412619,-2089746559,-396948873,1049205055,-1017156128,-385871176,703071133,1848025856,1847858825,1847725696,-155260893,-1912591384,644732422,83892897,78708751,-1047729965,-962346749,780387181,-1190367800,582877364,-1895877778,-210909178,-1262894172,-1074384128,119434786,1841831566,520529139,1841825411,1465303820,204323068,-402454808,-1070399196,-1553095006,-1432130136,1842783085,-1553067869,1048604216,1962949904,16824336,-1996418840,-1586623458,-1365021242,605457261,-194189202,-397158261,-2141457207,4001854,480448373,504793454,-972125330,537823597,470170478,994866542,1970150934,1847632198,-395458909,-2065169860,1048651508,1347682304]},{"sector":2,"length":512,"data":[-2128203403,1426063934,-1943505610,3926211,644721313,-1946155357,-1905415674,-971097149,-2133428883,4001854,512296053,1491627438,-1207047424,378208328,-1964413404,-1709512702,1024460486,40495104,650862175,-402646367,-1993998291,637547038,-402645855,-1993998303,637547550,-402645343,-1993998315,637548062,-402644831,-1993998327,637548574,83894945,78708751,-670832429,1839899075,-1107294533,468204827,47357,-1557785227,-1960443900,637536318,-1224516214,1099703808,-1547662332,950234582,-1365130386,1841734509,-1553092447,96693704,78708751,512485587,-670863930,1841831483,28837494,32499968,1841700489,-522987477,984515,-388823887,1841831563,507238443,108228038,-385875528,512295373,-523014712,1025687235,510551743,-1413467385,-1418869087,-1515470797,1859583873,-1144787083,65760870,-999371077,1925645119,990349576,125240391,105352131,1023512809,-176685072,1465274961,33601542,326567739,4055249,1005941280,84440839,-143450112,738193592,78709831,378267859,371944904,-1036292666,-1031074442,1191436499,1913076484,29526837,-1955740154,31642576,-745864105,-2089888069,-633665301,-987883916,64982031,868716280,-385928202,18847481,-471137721,1516134151,28885849,18082048,-1553045343,-692359738,-938046610,149652333,251987851,-1039104,-1325119607,736678660,264576720,-164380018,-1159135437,1468604310,1727758594,-1982433938,-1016215530,-1318137183,65590020,-1553018874]},{"sector":3,"length":512,"data":[1723559368,-971601042,264576621,-164380018,-2098659533,1468604310,84380418,78708751,-805050157,-2130132093,1970198267,-971601444,110019437,-928944698,-971601043,1958882157,268451113,-4717710,-754667249,868781024,-397323328,89191018,78708751,100788435,1498967494,1958820699,28885965,-1872958720,1847867019,1349441215,1486218984,-395389254,-692414866,-241964946,-1016199517,512219955,-387355130,1024566257,-1264336845,1840685933,-1553090397,-1990693446,-1989291994,-9579986,285657056,-1023410115,510621375,1870052871,-397355381,-1990683228,-1955743722,-482537202,-802780385,-768701587,-1554968979,-930386508,-482232642,-1073042425,-102565003,1840658057,-61385013,1839611520,-1207339776,-105185281,19393023,-2147354904,40740414,512435060,2062052782,1864808449,1872384030,185553920,-385649216,-397410115,-1202060959,-85327873,671545088,1946189934,268879365,512426301,-1014796758,-754667249,69075947,203293550,281248622,728608929,990278339,1936600070,-18423,-369099590,104530113,58093102,57552545,384324568,44113409,201720686,1049966,-13385586,-1582579661,-661754408,855639201,504269814,874417664,195359488,535524800,204930907,109990766,-1591317032,100859946,268791308,-1960423424,637537342,637683083,52837771,637537854,-1588591357,100888068,268791308,922701824,161115690,-1710271487,257163661,57544867,-1553071610,516189716,-953782766,247792711,105367334]},{"sector":4,"length":512,"data":[-694091776,1958742893,650153491,637540513,1705531,-1591341963,-370475004,-338654392,110006282,-13406762,1594075112,-466433186,-395463517,516161621,-1960415726,-771026345,1169425524,516188109,-1960415726,-1960432569,-1096602025,-1072264851,1958873965,1037155865,1958742700,-1274660339,-1408797587,-76169206,915009259,1456172470,-1070334889,-1553095006,279145896,-66983826,-1949606305,-1586647010,-668242516,1253359758,-1006886451,1458342741,5367895,-1962522997,-1073018794,-397934220,1583284903,313949,-881979743,-1959338869,-472841121,-1896052853,58048523,-1942122824,183002,1458342741,1586232407,15919114,637959876,1946172800,173968134,1593884904,113925470,238977792,24379502,-1547684925,113733134,1958778110,-345123167,650153564,1457803,-617365453,21334310,123570726,638089613,1588795,-1960382859,-352317890,1032005165,639923455,637957515,1586691,-1960437390,52822620,637539870,98179,1465256309,1501190,-2090967289,992348359,1962938430,77670092,1975520000,-1957313632,1357677548,1846413055,644746913,637618057,11544458,125799760,-391088499,-1923575076,1541976150,-1336504941,1167741522,-1962934113,-1922167266,119451774,-1962933016,868441573,-29979712,-1359052396,1443919758,1586666216,-1073042346,915012469,-782723842,-58226205,-472792178,-1081606349,-16019716,-141874060,1975519916,734432251,-1948808249,731184654,-217637170,-29455964,-1895908460,1846414987]},{"sector":5,"length":512,"data":[41359163,1128466217,1438906082,1465314443,-1961998709,-1360523178,52261376,-999419882,-1993995650,1435051525,108971010,-1207072474,1583349759,838237,-152321997,1458342741,172395351,-1005824373,-1993996674,1435051525,269888258,16902254,-661975182,-1081875503,1962970876,-1950338300,1566466000,-1962932022,1602959068,270412548,1842782574,309641227,992395406,1946167838,77669894,-1192367360,46858239,920423168,855918478,1048651456,1070399488,-1064558988,1846681284,240093990,-1047653661,268843814,638022656,1314443,-1064505621,-1962933558,-345123298,868453924,1049306843,-1960443882,637540366,1946240315,1569334806,142183687,-277481157,69110566,1977289472,-1950090792,103491271,-1960443882,637537854,1056395,-12745946,-1960435852,52823669,1912608822,1144727060,-1961986814,1277896394,637956614,1913146427,147292937,-730465477,-1960393735,1543710237,180781828,-991426589,-489159936,12445945,-102512501,-1960393845,-134206954,-702641213,-1910707347,372975299,242548778,772160294,639005184,2885179,-1960439950,184550430,870348251,-103773248,1049306819,-2094661618,108330813,38087462,-947714702,653257480,637682947,637957515,1586691,723965298,-814611388,1418405462,180781830,1290324107,-936689152,1581971571,39619366,371065638,1200301568,52871937,637537342,52829579,1912606238,1065559587,639464703,637951883,1580547,-1960439182,52822647,637539894,637617291]},{"sector":6,"length":512,"data":[-1022994549,-796147661,179054275,-1744668480,-1971379005,-1012128032,1458342741,570869335,113721454,8416734,1849427654,1040631302,113706862,1874882022,1843529415,-1070361344,-1553055070,-257724902,1275476845,-401509365,208797728,104631078,9300055,116066143,1842742926,109903667,1049194088,1583312384,1053084509,-1960442732,-1960439227,988288085,269888256,-19797906,105918578,637897510,-1006353405,637834302,638731579,638076299,639131019,1964656014,642468615,-1014298743,-1938942301,124655622,-993789864,644747806,618860427,1846545923,-784612978,992349812,1946161174,244000273,-420806642,141934603,172326,-1031011605,-326412861,637856899,50342561,-1989275642,379715142,-62486162,-1946401141,-1318184386,-1981295869,-1936654667,-1986985851,-1986985323,-7273339,-2123490810,-2140267970,641627136,-16040821,-1977206924,11993949,71928358,-1896063349,644749318,1183385483,1200301820,-27882750,1946272246,1468737034,-10229756,1224627849,1846548011,1946023656,1575324571,-1957311549,-61384980,-401230664,2126838047,16967696,-392883009,401091316,20178945,-401842492,-1070398615,189546115,-2145160192,1962935933,155579933,-1005095552,1065362973,-166759929,76877318,1048774773,1962972432,1589921793,126428680,283885619,1840658059,-401834300,1453428373,1941908846,1610144488,248143198,-326413056,1444211843,163118167,-123082730,-401965372,2123169932,712960236,-1006583576,-152566178]},{"sector":7,"length":512,"data":[1676404738,-392883010,1290297222,1049094205,921237383,-339725567,-1237939440,108971117,-1584512792,-1087541674,-125441933,-443851169,576093,-2081649835,1465259244,375372028,-386379032,2126838447,3336198,-387154291,1726491172,639484928,1963474816,1670375442,-1962261109,371919957,-320311792,855960572,-388985920,1583347771,-899816053,-1061289980,3574131,1446414741,-1915885458,1842757251,-385649664,-1967618872,-131077888,-1794242874,268879616,-956301163,194318854,977174528,108335726,-402648344,-2134670172,7223870,-1195179659,48824454,3574776,7399573,809239690,960239986,837293431,-145263984,-1554812198,1474860304,168069632,-398297920,1421577540,637245,611583802,-119389373,846546492,3729478,1922040808,1926952745,146725,305995890,-1558481152,149656850,134301578,1184173574,-1979705880,1975519748,3574206,914998165,-2017956266,-141825792,1958742700,1981824004,-993833225,126494237,1148390460,1081346108,1014238012,192219708,-1928903286,1843923548,1009642385,639071497,-1962784885,260704860,994176306,-1960675640,126372040,-957867029,173837161,-315438966,-466434934,166451203,-1960436284,1552745039,-1957210614,176014579,1583326451,1847239107,-326412853,-956541098,1080959494,1843791559,113668032,-956263154,194318854,108956416,-405601359,-1862875263,510902459,3401735,-1938571080,1566466010,1426064074,1465314443,-1324974453,-2115513597,-1953433913,499385429]},{"sector":8,"length":512,"data":[39815974,371065638,1200301568,1566465793,1426064074,-326898549,417118230,-1962860312,1183385157,641582334,-16040565,-1960440203,-1929377730,468190045,11593989,56461862,-165281609,1947206721,1502291475,1602954759,63144722,-1341850136,99477550,-402432627,-1977219854,11993949,-402359923,1174473982,1300965118,-1334451437,97380392,1360381827,-1977219497,-1960442811,-1960443299,126756413,-1930789239,-397349818,693636432,1586232910,403083006,1963239534,1959922436,532948483,-1981120883,1166805597,639484940,1946238848,105235984,1200236032,121997313,-352285464,1036761862,117734376,1950964063,-399724534,-947714713,-1332155643,90040361,-1795014972,-1951743950,1438866917,-326898549,599283476,3926041,2123233163,-1190715668,-1510801398,-2131984755,1962935933,235337239,91489429,-352295192,269388558,-402267243,65732822,-1006622488,848626238,-1956664640,-1547477531,113743112,16684294,-1795023223,-1794898292,170297688,204376469,-991887467,529147421,-472776910,1504182062,-1206136039,689580313,-652551910,790353690,1377557019,1612472348,-383984356,119339804,269388573,1976109973,639484934,-1006481525,116787805,1948357902,63039753,-400510909,1364395167,-167278042,1117064710,-466483084,72345753,-919403029,1493460456,-1008868773,-1960436284,-1960441737,-1910109601,1284187655,1277896200,499400964,74943270,106924838,-1995993562,38112309,21269030,-1341700728,72214568,-1342175768]}]],[[{"sector":1,"length":512,"data":[71690537,209059665,-16091649,1979647605,-399114494,93323077,-1895676529,1167001157,205885194,283330905,484977840,639484932,16926603,-857011643,-399986493,-919403509,637941188,1090942207,54296614,-1960439435,-620033444,-1960441484,-1910110092,-1947997433,1435175493,1591423756,1962281735,2088773132,91574786,-352319000,-1326652688,63564073,189813585,-1341229861,235337260,41160853,-1259848784,235337219,192155797,-402432883,984613554,1476633320,56396326,1888288951,1448235012,1141057030,172329217,638342537,637885579,638022795,495518862,637683084,-2013182070,1170605893,2129133574,1516111870,643390296,1124299915,-399986493,1573127003,1200301578,1032829698,1960292397,1033288474,-1156287416,1950891420,1034140430,-1157073848,1038630287,-400299262,749732408,-1341969688,52815911,638213572,170936202,-402230080,-347929833,-400051982,699400975,-402453783,1538285229,-1006435608,2005607965,1602954756,126756358,-1995809397,38112309,33965510,34031046,804295,868233984,-2080262702,-402295761,116064273,-2084188096,-1073086253,1571876213,184730345,1342665938,-1192743760,1166628866,3794954,-2084188096,-1073086253,797191540,-259315340,-2084188096,-1073086253,797181044,1213264501,990528905,1949085894,-399593465,783286915,-402489624,1113063427,1364414659,108396370,-1879211800,1499072069,-960276389,-402520507,48779294,235337310,1500842133,185222539,1265896517,-398611269]},{"sector":2,"length":512,"data":[1166737744,1279165196,527695883,76822212,641577403,1947485243,1035385625,239352614,-1145368460,1144727101,856126490,31189202,501744619,-399724543,1166737935,-388877558,699400649,-1157496087,99171752,205884161,-857159373,-398807039,1166737903,-372690166,-1964506689,173902685,-315486326,15984963,-1587708696,37590290,1023767040,58064914,-1929376840,-1229059491,-1954420625,-770979701,766510452,855749352,-33979438,238749308,75404562,1245825671,343918859,-1729613648,-399593471,316866963,-1930940240,-152354559,-503308312,-399593221,367526271,3964928,-770967435,-1329397387,23980101,-375799157,179044580,1308849600,1558786224,1560274945,-1962261109,-957805483,1559488512,-2143436613,1946159741,1036434179,-393197333,1569545441,112906,-393196053,1166761173,206932746,-1960436284,-1960440713,-1910108577,1976699655,1144727070,-1961330936,415663048,11996131,56396326,-502501235,56397303,-342882581,119443573,839879206,-1977203731,15329287,516159458,860611335,126494418,-1794242826,1008760065,186413856,-402426670,1364394039,598757458,1476444904,-392567758,1499070513,186116955,-402426414,-1073086437,548405877,1006675688,-402426585,-498925409,1976699836,15254276,665866240,1476431592,-154938633,1083510278,-661959563,259904011,-755510281,-2097036413,766509266,-1107267864,163134822,39074560,158795378,91429947,-503003517,800080368,472629502,1929532443,320603127]},{"sector":3,"length":512,"data":[-964492716,4319236,-154933022,43322886,-1336888203,3270692,506200,125074,-389773678,-997851134,-790048688,-790048536,256232,-485546920,1975519752,868436226,1009779913,67269178,-1000929785,-1433075138,-1795015031,-1794765057,123667316,170298307,204376981,136773525,1848156565,-1150427485,1642602094,772175228,-352233473,50906092,538915380,927276879,551373344,740441148,1008804412,574366242,-1006631745,-1200722410,149684223,1946499878,80184072,-193594821,2106271427,1745260034,1870052974,56461862,-1977220937,-1024064431,1460958224,125405990,310217510,-402405501,1153861008,-2090914049,-2048392249,3913861,1946731254,3061763,-378571078,1048637393,1963093562,-633437884,1962993261,1874239804,1874335371,829805067,763150347,2133266237,310056,180341043,1981712384,-134768273,-2010070400,-26249577,1271530186,-506400907,1849953928,1849296582,434684673,-5314436,-402652488,-970557281,-1336999353,2074732562,347138932,1434180841,-326898549,2079778836,-1792538938,-390057216,330332283,1971030760,163074918,-308287488,113661702,-400921026,113641300,-150507970,7219206,638219280,16940419,1424491380,906413670,-1230962283,1577462638,-1791515794,-1553039711,113677625,-402549464,1000542200,1024887189,-400904043,434666353,1527209744,38258214,-1791574446,-218101319,105638820,-402149293,2123201365,546564332,-970586277,-1924136377,1036257909,-1190819290,205258756]},{"sector":4,"length":512,"data":[138155379,179376500,192154172,548484235,57935676,-398390134,1347555228,50332856,-319035199,-1420252328,347120883,-2139419416,24001086,887686005,675184895,57933973,-1962525208,-389849627,113736468,38186,-402651976,1465087895,-402149370,1743289053,109832192,118444008,-970564769,-1420754361,-1330920821,2059659284,1849310848,-1949207551,194325054,-1908771585,644769798,-1912177269,-395401210,149452755,1009218937,639858001,637689227,-1910096501,252372999,-1792393589,1852311182,71665446,106268966,-342545757,330875838,-302978816,1013856928,1007252536,1006990396,-1023314900,38258214,-1000929702,-395418050,123670224,-1413313621,2054088899,-1792538938,7923712,1055396784,9300090,-51897424,-399411847,1387296651,1970926312,1178518546,245295214,-1986709597,-1332397802,-399447280,966987947,-401362795,-1595377139,-1791515888,468386736,191758497,-1559792448,45126969,-2036265493,-1791384722,-1792538938,-1577013247,1239979318,-401297408,1048607197,1946250810,675184784,57933973,-1023065624,-1553045855,-1070361296,-1198181725,1827143689,839319414,-401428331,-277579401,89057475,38112038,-392874845,1000541724,1024887189,378258325,1049335092,110007600,-141857176,38127142,1569334866,-1929332989,916456569,1962949781,1851302181,1848116983,192155648,1946286723,880033798,67108389,-1557302590,-1037341096,1852048939,37506539,-324983691,-1037350803,-149589440,7219206,-2096598000]},{"sector":5,"length":512,"data":[57934330,-1543504347,736849388,-385851208,138210489,512435317,-1993960146,54889783,-1953157469,644742174,637683595,1929533185,1488902,-1544776471,918459703,637333,251634931,57972018,-1006672919,2031020112,-394917656,-930449402,-2140506792,729043961,1968306560,898311750,39684902,638029350,1963146368,-437759946,-401493896,-622298947,2007820405,1396455797,-2141702795,24002622,-1960435340,-1912209035,644771846,134167683,-1175973515,11659384,1006709737,1007318049,-1207536606,317259780,9681132,-1192489751,115933334,1948335340,1948400880,196628716,1966073856,38258214,2021845075,-1506345128,1460032366,1594425064,-1336255737,2018240532,216543664,102004088,449112151,-2144991393,-1993997811,347078989,645411049,-402303607,10552085,1166616174,1975520003,-399265774,192247775,67993638,250090672,-2146178184,24002622,116852852,2125278,-2144992140,1048576269,1946250816,-399790065,57964467,-1342143511,2011425044,640464067,1015171,565449333,537261606,582224501,1074132518,1018430069,1484112954,1849310848,-2146995187,325990974,922699125,1460039334,139847763,1599862667,-1960945913,-1989253618,728655414,197624782,-1494016250,1969119007,102651683,1856376459,1856386697,-1960391125,109970813,520515240,520595187,-1341819553,2003560724,-385842248,1048832757,1962962432,-399986668,225802015,135102502,88459046,-2031550464,-331940096,-29950099,3604333,1849098094]},{"sector":6,"length":512,"data":[2001262,-29456018,226502253,1166747264,-1792236795,644769441,-1207614071,-1209532412,5826675,-386252056,109973051,1049325160,-2144965122,-1960411355,109969789,-1993970064,1990263365,92874350,1593965032,-1896198936,-1955698682,-1888616898,-1888616442,-1888616954,-1586631674,2453032,50347267,-1070397068,88442662,-1334942045,1992288532,-2081649835,109970156,1049325160,-538415618,-28931840,-1560219928,922709484,-1960405716,-947711155,1366614805,-1977198842,-1960442811,-1960443299,-1791581635,-1791279479,-1791156599,-402158042,1311310120,-28931074,410309131,728624289,671545282,1947205742,33194760,-31128716,1844225023,-1584056413,967011840,742296469,-1475965291,1936844910,-1792262519,-402650696,-970558732,-1101921721,163157302,1604645632,-947693305,-1953701371,644742718,1947207158,906413626,113706645,431415,-1553071967,-1960405703,2112357245,-1791253750,-1791158647,507587263,1931601927,-402650696,-970558808,-1101921721,163157302,-1583025408,104568108,1968729766,1856414467,-1017256565,637547752,1963197942,263435,17167910,1077936756,650130371,185687435,102200539,2106271319,126756367,155025446,-1960442252,-654900667,868419423,2105747136,309592067,-165281104,175378437,-165280592,41181189,-1960442192,635638605,365396823,1460031569,71666214,39684902,641567526,233310094,1476878080,-2091269885,-522058297,78168927,-1977209739,1300964869,1930050562,1946762279,1946696727]},{"sector":7,"length":512,"data":[1946631199,33129231,-108849548,-2096008190,208930041,79286667,79282944,-1009634560,-18775231,113496627,79188823,1852750592,1541862632,-4663413,-1014256641,638017451,-1023322743,-1157625672,-622301578,-1413467162,728673953,-1418830842,728678049,-1418829818,997087905,1970183686,-18429,1856938411,-1586602845,1621323454,1855889774,-1016178013,-1201704216,2126184456,-425990034,-1582579661,103509686,-1582600610,103509702,-1582600606,-1582600708,1587769014,1858511214,-1016175965,-1157625672,1860726406,-1413467162,1080973473,-31123852,1851302911,1852048939,-1413467221,1851302315,-1016175453,-385851208,113764333,38186,100668136,-107747241,-2134702241,946747966,350815093,-398741502,-1796705277,654556017,1970524136,1744776708,1423361,283621609,661082371,1042774045,571811813,767378221,1076721961,1208823013,734411822,36423212,-732942636,785646638,1429132291,-734581036,1900931118,1849310848,-1607961510,-2034274758,1950563328,6733575,125118780,1849165454,-395053079,1048604971,1951493690,833542,-991472407,644761150,637689227,-1910096501,1943464199,-1334586392,1940645903,-397293261,106498041,313540951,1953719016,279990769,-1334602520,1938810937,1509903080,638059496,1593990539,1347571975,138775334,71641894,-148343744,-1960545565,132573400,213405778,112896,638045928,638076303,638207375,637814159,1493583247,-1195130142,-689373162,708247526,775356309,808910741]},{"sector":8,"length":512,"data":[842465173,571541,45734707,127526912,1845247625,644769441,637814153,411079,105221376,110440099,309335,-1200641560,417867582,856121088,1845273536,-1791883633,-1792014705,-1792145777,-1792407921,-326412861,-2011763581,-488047002,1849335922,1962821178,-400576393,208958107,-1342146584,1922164756,1693181812,-395320088,158691623,91574588,-344794136,5957635,-1360512592,1745260146,-63009938,1435182701,650283778,1342326151,-1923676590,-689378690,-401428457,-210472365,-2031610960,235780210,1610584808,643324423,1979860283,1166616068,-401297406,141914675,980302496,-1049231802,-385988982,-443846051,-1947679907,-401362696,922710609,-1070371332,-395445085,110098583,113667580,856200502,-1791384640,-1191666711,-1092026346,708247525,4096917,1098186862,1399997416,855643320,244187,637960936,-1995291249,-1334969282,1909319693,1460023157,654185704,1963146624,-401690594,-1960414731,-1960443299,-1960440755,1642598517,-351838458,9746455,-1192923927,1726546067,868234213,870003666,-16695,39684390,138774822,173377830,206407974,239453990,-1993932801,1721831541,1166616174,1170679300,-1929379834,782435909,-1202256235,870842372,1042542,1776813919,-1547685119,110063100,-1597795030,1010593338,742136948,557586548,574362740,658247796,300427124,-401297153,-546016981,983571435,1950104686,1949056015,1948335115,1965177860,17885192,1946159080,-383274779,-1957334719,149717996]}]],[[{"sector":1,"length":512,"data":[1901783120,-395422488,477458514,309678908,104579212,343240296,54889254,1845233211,79170165,-459020032,-946929869,-1929871735,196672070,1842079744,-1989073944,1183644798,1204168446,-56536318,1166616173,1856413955,88443174,-1792133493,-1927509722,914950517,-1024944850,833902843,141828412,574378420,297009780,-400193498,2126774635,1962871800,2105747004,896794631,-1360522064,-397692816,-1977192279,-58801147,1963276838,-58815145,-2080868723,75696901,687728651,763577973,187466507,653819588,-351844981,-401297369,745893951,954747824,855929968,-1004409920,-165217154,578101253,637543912,638338443,67913091,654081732,-1341700727,1880221716,-1017256565,-385842248,-1749490735,-473175808,1852311182,1845247627,209552166,637957376,67913159,-2094611712,1962937469,-2094611711,1979650173,1166747149,1166616066,1166222864,-1960443390,-654900667,1356396368,79223947,1520363520,-1960421288,70061125,729314304,116689888,113849175,108396326,1569400385,1960512266,2106271241,126756360,123726315,-1977209621,-13499555,41779238,637957458,-351831669,75074841,123570982,175430411,21334822,-1929625463,-1960378816,-16053891,-891105163,-1960442017,-372175795,1363798481,-1378317395,858783929,1515514066,-402651976,-497460675,-1578726422,-1993970050,1460014661,1610264040,-2048343289,-1506345105,387182,1856374415,179851459,310016,-401799495,-1070398537,71665958,105220390,138774822]},{"sector":2,"length":512,"data":[-51901008,101741934,3467351,-1993996449,246417477,1483678952,494218300,451417008,-396949905,-2144928983,242354237,1594066920,1166616071,1435051524,582533894,-494147328,-2081649835,1187448556,-973078278,-956105146,64582,-1461171536,-972786322,-402194874,1191116923,-401428228,-210473321,83773174,109973108,1656712760,977174528,443880302,-1226304592,-88217490,83773174,-2144990091,1131676733,87916582,434650484,-1202695677,1727463429,-529012484,1586125400,-61961218,637896998,637687177,-2096865912,-253622841,33310347,347142726,1970157288,-8656637,-1946532213,-1195155995,-286719874,1803282657,-1972406594,1073787908,-1497642869,-533206930,1776919795,1852237934,1055406512,42985582,71666470,140348198,544597770,-388824143,-668210221,43968579,146296914,506112,637699816,637814159,-1022999153,-385869896,703127961,1849335918,1006667455,-1087736765,691798118,922690420,-1863815514,571647,-1191181125,1357384968,-1792368382,71665958,105221926,-1792393591,939953859,38201454,146296914,310016,-401798983,-1893334485,-1893333947,-706148795,1842538605,1894267312,-399739539,-1977157277,1946369029,1946434602,1946500134,34531362,146296914,8436480,-402651975,-1893334541,-1893333947,-1899821499,-1083295738,-1195179930,-18284520,1838082272,753405872,-1911655315,-1083295738,-1195179898,-420937703,65661152,-210382325,-277486582,-344670198,15122256,1849165454,1375844328]},{"sector":3,"length":512,"data":[1095760,-1191181893,-1662516724,1167009281,1167009292,-1070376178,71665958,105220390,140347686,172329254,25880643,381636690,939953665,25094254,213405778,637184,637626088,637814159,637945231,638076303,-1341504113,1826875664,-1200815128,-617414640,-402649159,1460011331,637619176,638338441,1376671113,571472,-1191173957,686292999,643455745,637820297,-1190767223,1396834303,146297425,1767237632,38258214,1532582480,-1951677557,-1047811134,-1413467221,1357386416,-1327795092,1820583950,-768360053,-1157408536,78118913,1598226804,1166550535,1569269249,650130178,637814153,637945225,638078345,-1022737015,-2081649835,2123180268,294643948,205488166,465045107,-540022528,988288944,-662794900,991000808,125168734,1178321036,-1207536402,-1293352934,-498693153,736384651,1444673094,-1207534088,-1628897252,-163148833,-386378101,-930479391,-1948105077,-689380266,-387872254,29033227,1946462208,145244935,1128465012,653033156,-393605750,1375754216,1095760,-1962917144,-1993935290,1183515717,1166616312,-498693370,138774822,652494475,638207369,638338447,-1961998961,-389849627,1692954143,1031808759,638087692,33717635,-1195179657,585695261,1927828447,-1993974819,1569269261,-947141886,1465107084,1746832926,138316654,-337956096,142183175,259325707,990076298,-243989423,520376717,532896607,-385840968,-1977164059,-771804643,-1476448541,805449698,813969416,805449860,805449730]},{"sector":4,"length":512,"data":[831009087,831009127,831009160,831009160,1673015688,-558634752,-2081649835,2122908908,-28930820,-386105715,594889116,1849310848,-400788467,126484925,-1002183630,992410750,91554373,-346711064,6600775,-1327596311,1793583117,654081732,638213515,638090635,-1960441970,723912781,2126775373,1569400572,2106271238,126756356,-396949935,123731816,125323609,-1293413712,-1326584982,1789650958,-1017256565,-2081649835,2122909420,-28930820,16402119,1031808512,639988995,818563,922689140,-1960415562,100732997,-1064538442,241011494,869269689,1430579410,1857422991,1726483888,977174634,1366560366,654079684,1963146368,1149969938,-96060656,45615477,-96075520,-397080344,1198876982,1131762236,644504552,989939083,1031141958,719852464,1569400426,2106271239,126756357,38112038,-386251263,347143872,1953093352,-401690449,2126801417,1166747388,-96064766,-1957379864,-1195155995,-2098659284,6666461,1440578793,-326898549,-1923676652,585690238,-386626801,123412983,-1974474520,67056348,-466422178,-1957400600,650337765,1208108427,7596112,839354970,1992440804,-2000516348,1087384327,1414457426,1416096088,-2081649835,1460016364,-387154291,-192213287,-398203416,-420994645,638017314,1963605376,1166681610,-161575679,645338088,-1929230965,367588958,1575324500,-326412861,-1928008573,-1561793410,1065362958,-1962248948,1435175493,1575324428,2013379,1440536809,-326898549,-327250668,-401702680]},{"sector":5,"length":512,"data":[499402587,155156518,1569392501,1575324426,6731971,199013609,1964734674,2028210710,168457487,839088320,45138880,-1023102781,-1329396048,-92028148,-2146208257,125173756,58310666,180552112,-1341949468,229688069,1942239939,-154892798,141820356,41157288,17621200,-326412861,-972362621,23988742,-1560280392,-1410830862,1844224474,862842531,1844749248,-1553074525,1049335104,1166765538,1845011202,-395445597,1183383758,674693116,89450606,-1879423351,-395452922,1183383738,71624950,1844192899,1745260286,-29455506,1979648877,12380174,-385988983,1183383869,639691768,1946420726,61204494,-385988983,1183384555,-401806344,1183383882,44099838,-1946663287,2095643718,-28931247,-1957610008,938015302,-163675311,695468141,-189011024,1368975469,-395446597,109990344,1049325160,-1960415746,-1960443011,128979029,-1202803736,-722992612,1844755281,-1957582872,887682630,-129594543,-1588529688,103509678,-397382052,-794733854,1841734510,-828129229,1859298158,1483606690,-1017256565,1848116983,292815104,1843543691,990004619,1953364486,1845142276,-1010814013,1849704064,-1201373952,2028470276,1842782545,-148455282,16787462,638219520,184550561,-336759360,34650129,1848116983,58000384,-402516808,-919383729,1842742926,-1064431637,203328294,1065559552,1090680063,77669894,1975520000,-1340808215,1353377946,870003544,12145106,1362618416,-1326652839,1352067157,-387610184,-324972383,1958742893]},{"sector":6,"length":512,"data":[-1294403833,1318250732,-1202696727,-1964446583,-396513200,1048596596,2080403008,-389304312,870928488,-1070483376,-1202687768,-655884276,1344596304,-2081649835,1437598956,-1202697240,1458103689,-569968816,1946158189,-334066927,-1327827091,1300424704,-402599752,-324972373,1958742893,-1294403833,1311697132,1852311182,1845378699,-1980697112,82378310,-62486031,323848998,-485111933,106385692,71666214,39684902,641567526,954730382,1499399936,-502937725,1745260260,-29455506,100017773,639333408,637760907,-1341107061,1293608967,-402515784,1957711939,-395447109,-2014818338,1575324495,-388461629,1311371536,-61462018,1979841155,671545100,1947205742,-60390652,79951614,-2144980619,729088829,209552166,1378120704,201213579,-1962707758,52886598,-944107451,1305405446,-1960394612,12127837,-388877360,190468121,-1023314478,-1157740917,-1310179644,1460058189,-1957732120,-1917125562,1302521918,-396945736,-1977200815,1963539461,1166747149,333989890,3192908,121384939,-544535947,-1202978072,569049180,326435644,209552166,638350336,-401586805,548948974,638249730,-402504309,280513506,1333389568,1852311182,1845378699,537261606,-994569356,1324869702,-504887632,-1030965170,-347149080,100017689,638809152,637760907,-1341107061,1276569607,-402514760,-1960423617,-620031651,-1960419212,-1910108291,92939783,762514492,695470140,544475964,1182075452,637983162,-167684854,41157314,-1960431946,-654900667]},{"sector":7,"length":512,"data":[-397616152,720062385,-348756034,912375319,21362214,-1106414328,-165267875,1963196741,911851011,839682606,-1976678675,1314580484,-1984366622,1315170540,1307073968,1745260110,-29455506,-279189395,-1011824501,17167910,-877657484,-922874397,-1957810200,1312549057,-397543959,-269922780,1183449933,1183515647,1187251710,163745020,-1946532213,1452014686,1397799166,-1202842392,250106449,1465301070,-1202845464,48760350,-397037490,-1984410132,1308092645,191753377,-150506304,-387140904,-1196405784,-1588735000,-617386392,866123961,1316743378,-388460872,-1947644463,-326518707,-1337079576,1303570525,-400619592,1605914045,1303898206,-396797256,1538805169,1303111768,-1779904592,1298196813,1077316382,1745260181,-803303826,-1961366674,-1977220484,11993949,71404326,208977931,-1962785655,-167050124,-1021319819,5421087,-385628285,681695119,1843307374,-387465240,1656447323,1670834231,602418037,922702076,922709486,-13734298,110035287,110063206,190475758,-1844742958,-1840442648,-397617688,28527854,868234179,51758043,1396676178,1163149206,937958997,1278755374,423573691,963193401,1295717407,1714240659,933449533,1446878257,-1773054651,1066812223,1430230569,-1776795754,1066817599,-398515881,1053057153,-29659578,-2094649742,779419709,-401735898,330326932,107179240,-10819497,243792,-1328199192,-544495092,638017368,1407720841,1282206028,-385855304,1371068121,-690755328,1428627128,-327029621]},{"sector":8,"length":512,"data":[1720189058,1664346367,-8485177,501743616,-27358977,-8479091,-1605640984,1178234426,1007252735,-400788204,-487890124,-8479091,-397678872,1021901618,1276962892,-1956438040,-1195155995,2122317909,57999614,-385846856,-1957308807,451707884,-949812248,59462,15091399,-327250688,-1207420184,-890765244,-21305246,-1326823799,1652942886,-1377302923,-398030338,49446528,1183518325,-159481622,-1959496448,803989574,-386906485,1183533982,1268312298,15236739,-340785036,-387555699,1586318330,1277880568,-387430773,1586318206,1277094118,-1957981720,1438866917,-326898549,1653270550,15353543,-327250688,-1207449880,1458044964,-28907422,49446528,2122321781,74776822,770424883,16271047,1262282752,1586359216,1269098730,1347112424,-387293555,1183534032,1260710128,1260447832,-386376051,870861760,1575324491,-326412861,-1206457213,-957855681,-364475906,-387154291,2122319719,477430514,-2132130165,1962997374,-129579224,-340787200,-386376051,-68662446,-263812790,-386376051,1183533948,1255205098,-386906485,-471315766,1575324490,-326412861,-394335101,1187471836,-1929379710,-1125585794,639484946,1913405312,155579916,-167349245,1948256581,6404102,-1193990935,-1897398250,-662794911,-1157559832,501758728,-1207536543,183042106,-2040624683,-1922983960,-269958018,-562135040,-2147060478,1946339966,-662794978,-1337304856,1185212416,-2142606616,1946339966,-998339318,-969100056,-1207957435,1055391780,-47257503]}]],[[{"sector":1,"length":512,"data":[-1920711031,1988997246,10873048,-1920434547,-1662466954,-1333883648,-1953991027,-1976662434,-1545076409,-1669427968,-387156339,2123169923,-998863480,-1929348376,1988992126,-401887096,2123169926,-663319160,-1929353496,1989012606,1081206920,45514368,2122321781,74711226,1240186931,12207815,-934900992,-1958097432,-941040570,-1270445239,-1958100504,-1142362042,-1913933751,602440286,-1503752886,-397782040,1586298965,1246423170,-393984373,1183533470,1234757792,-390439283,-1410840008,1575324489,702915,-1510799586,-1007661687,-1929005080,-1796674442,433056024,-2144216856,1946289789,1231284245,-1928772214,-806876579,207457609,-381026328,-1916581525,1988881534,122025606,-1308003064,1955213054,1212868866,771752376,-402434934,1166231475,-1070398966,72649262,-2092456216,-1023276435,205915394,621805568,405276685,-2115204267,-402607380,-1070374864,-1979824503,1183448134,1317439994,-495022593,640703464,638351243,638476171,1988691854,-129594122,134694390,1290273652,1222109209,602407088,1223747653,-11624819,-1337423640,1606936633,-402615576,-1634907938,1994981198,-72685496,-11624819,-1337430808,1601300500,1048583797,1948741178,977174551,276047470,1586359216,1225058554,-386113907,-991213260,1290282672,-1339001505,-94466581,-1924600344,501808222,1217456201,-11624819,-397924120,-1634862244,518586190,977174600,125052782,1458050224,-1326912673,1599072295,-11624819,-1924651288,1183578718,1221257468,-386244979]},{"sector":2,"length":512,"data":[1407731936,1575324488,-144906045,-397908248,1957822542,-387442768,-1340508834,-159468932,1946347846,-1301106684,1586319990,1216145660,1509961192,-924314960,-1978632866,-27357758,-1924634136,-1712784290,-1966806200,-1929300798,1474886750,-27357880,-1337423896,1591470355,-389120371,1580925977,-1943243274,-129614912,1183458677,124095209,989189864,494266694,192152744,31997360,172329800,-1337455383,174426684,-1203239703,787021898,7387346,1439836393,-326898549,1588783190,-1989283679,1187511878,-1929379670,-1930892674,639484943,1946304384,1065362956,-1207536637,-85393333,250381265,-257821557,205818221,1844459145,-1945609079,1166674500,1946396681,1965074462,17090074,-1962851192,1149831749,205884162,-1962654583,1149832773,-1203705082,15204356,33867332,302073030,855786633,71600576,-402242423,-1159182575,-1984278465,38046526,1480963048,168201402,38046704,-402652667,333989284,-1436644025,-1337545496,1571940370,1659437941,-400248577,-773300767,-1436643847,-1958308632,-257687994,-1436643987,-398021912,-443857178,-437730467,-512038819,-1336207640,1572333647,-1956990744,997083670,-1206422826,-1880621048,146298831,-1031033877,109533355,-374631104,1354254002,-786437888,-10637336,-395418058,753401866,1711705857,1184426350,-2081649835,922683628,113667686,-1340510660,1567090701,686295472,1946267741,-401952757,11558175,-5242252,-386316664,1048599207,1968336442,1178518598,100017774,638415888]},{"sector":3,"length":512,"data":[637754763,637631883,-303364210,-1476031962,-2145618686,1946220926,67314716,-112818174,54889254,-1929623927,-242292542,654202505,-352238197,6928440,-2133815063,1399732798,1053053813,-2094633402,1946161021,100017736,-398297984,-1960384746,-1960439971,-1910107779,1065362949,637957129,-150845557,-96040488,16350848,1187382397,-504888839,1550903388,393527306,-213260208,83460185,-654900619,-335919615,-214308858,-1963309431,-12781242,11537781,16481920,28312180,-1963374968,46235848,41026108,-315488335,1592312203,-109670962,431006963,1968977640,-16455421,1849427654,-401690618,-1000383391,728655374,1575324623,-338754621,-1977200317,1946172421,1946238001,-1879000799,57934396,651165881,637885835,-1960441973,-1960443043,786956629,130515782,-1960438293,2129133893,63406917,-1977218581,1642594629,1497843525,-1183450821,-326412861,-399840125,918838308,-424645050,-2013003226,263257670,-1923354392,1575545470,358541356,-488107856,-401166245,2123193309,743106774,33441526,1172833652,-402396395,1988957486,108822762,-2145815294,1962937212,1152641043,-1572688,-28931520,-401972086,199968009,-1975472920,135069254,-398136344,-443857738,-1957313699,686588908,-387154291,499387604,1007127078,1011577856,1011315716,1011053573,-2145815290,1946551933,2139301390,208994308,1849310848,-402295786,535498854,1458050736,-662794917,-387156339,1988952094,899475692,-401382680,-142142307,-1959082264]},{"sector":4,"length":512,"data":[-443874235,733528925,-826283776,-2144985916,259262015,-1377241209,1962379065,5695503,-398885655,45681915,155379969,4646998,1065363038,-2143390455,1963067005,-1239512264,640992367,973227147,640316679,-1996400758,38112309,1124554120,-951760408,1093,411078,542150,-2079767098,-1995811447,1166609501,1592312590,899934208,-2134696508,-2140265970,-2147462936,2137924134,-2144985660,275909695,242715430,207588134,-1996190170,38112285,3139779,-2144985660,561319231,33979776,-1494738316,1132193845,873022858,207457537,-1924930072,367528541,1132587332,2668739,-389155607,-1682243361,1509353537,2045258357,1200238170,351044353,1464923275,-991363445,1610058496,732424280,-1022049149,-385865288,448318917,-843060992,-253218640,-2081655463,-192211732,-385971369,-823656293,1610058552,-2144985916,-730527937,72321830,106924838,-1962439130,1200301785,1602954764,394995214,992353732,-1166734265,241142566,1964456742,949479601,-399194904,2105545538,561316358,33979520,1569397621,-754732790,173802475,1300891530,132218890,19196114,-348913944,1038084130,-152504441,993847350,-1746339961,6338626,-398233880,1170621107,1974472456,-2093773592,113448132,134874882,168560907,202246925,3336207,-398338885,527784212,777623528,-2097068150,-192211732,-24422576,-1962928152,-396861449,-998036795,-1009128684,197124,138019076,954730830,1107933952,1968758760,1499654175,21465646]},{"sector":5,"length":512,"data":[-1961563005,-1957211916,1960190,1482684299,-2094362392,-638905148,84019139,588252674,470037763,1107640583,1535502342,-1151965464,-1578614137,777287000,-1006544897,1065362973,-166431482,1080959494,-2094647179,1946158207,233891852,-401637400,-546043111,108888259,640578822,552945654,-672651404,1103620109,-389019208,-655867355,138790465,-378163185,45691569,115795968,-1205240343,988348458,9418956,315372777,1119834627,1397039618,1398097333,1173228897,71639632,-83671557,1187133253,1363619382,1245923146,1196042567,1447557903,1276666195,1257068617,-397697193,-1981281957,1177994328,1552623214,1955276293,76424711,1166810505,1200236034,121997313,411078,542150,1850095300,-1476097498,638415888,637754507,637629579,-320141426,192153768,637593320,16860299,-154990011,1080959494,-1960419467,1435042132,1006838794,1009546240,1008890881,-1340771326,1418405382,1050077187,-389640520,1170620753,501942281,55872294,-352253208,155567636,-972756159,637602117,-1996274549,1166806085,83240462,-1173392380,-689424188,155567679,172345128,-857145344,146008128,52742282,326369340,175374652,779354684,22856742,280707819,-1157371136,-1960443886,-1960443580,52822900,478881335,1962933123,-1579678914,100888080,-1064407550,-1960437013,1364197700,57969446,56396326,1888288951,15984644,-670869415,1946468854,532948483,1166655539,155551748,-1945477751,-1195176891,-823590773,570881738]},{"sector":6,"length":512,"data":[1165312110,1850482315,175495947,863945913,6285522,1170614251,1200226310,155551745,-1996339317,1200294469,205883652,-1996077173,1065356869,-1173392383,317208772,155567679,172345128,149487616,133163072,-1075292666,8120320,106939430,-1945477751,123604037,155567811,1456914,-1023314578,571033030,108956601,1745260118,-29979794,83240557,640972048,1946375227,-1194459602,786988683,1955276288,1552557571,-1929332989,917505136,641722344,1963984118,1413162510,-1207405565,183008651,-1948587264,256193,-389871778,78659545,17102374,112198260,641711081,637623435,794115,639601446,925187,105351974,403047206,-1094546432,244027646,384003610,225772603,1963086907,106728200,1847068302,147227587,-1950815518,-910432000,1852311182,1845507723,-1977216021,-13499556,637825165,1963984118,1955276296,1979058947,1048626153,1946316346,1177994312,478881390,41192230,-1996190170,-1938957794,644733958,918816650,-964465082,1946762244,1963408393,2144549,-1977219349,1106063884,1088995723,-1239512737,-74754193,119473694,520529139,1874247263,-2091448546,102632135,96012063,111538944,516185887,495545818,-956152436,1093,33965510,542150,21465638,205488166,1166739826,206932746,-1997776664,-1712781499,107341909,280007,138790400,1177994240,83240558,-402426864,11599391,-1995716989,38112309,101074374,-1593358968,1166634574,1850777872,-384678519,229660000]},{"sector":7,"length":512,"data":[-397068056,246479569,-397070103,-397388574,1012464663,-1023314940,-1003236120,126494237,1349848124,33979776,95436148,-402168438,334031903,1040181304,1273495728,-654854086,134694390,-138929292,1045424336,-388827208,95960649,1044637697,-394067784,-759677379,1043851264,859695849,735196096,1427835461,738912524,645204540,33979776,-420997772,833153072,-398610200,901265203,1040967904,-2093105431,1946161789,326467588,188531584,116861557,8416734,-1964452747,-402608067,146290514,1038346432,-402426696,-2135409187,1037560054,-1041727312,1032186173,-385865288,-1981233159,-78518188,-1003285272,1065362973,638350349,1946959744,2734114,-2134385431,1946289789,795338769,17397120,-2029369973,1166609477,1971569418,-2134703862,1946289789,1025763366,1877475504,-789137351,67585526,-138932364,122025680,-402230264,-138920595,1030219986,-146990359,1442253397,501793548,105236052,-1983892734,1170605125,1166544135,172329224,-385071735,-396942162,-544481295,1065363039,-1341688573,1402333201,1392927092,-957870672,-117512109,-1092088144,126494291,39291686,495519579,-2147334772,1962935933,155579928,185759104,637957330,1963087675,1200236040,121997313,1930181827,1963473924,1065362968,637956876,1963474816,1200236044,719867905,2145998898,4044854,-389612311,1170670683,-973078524,-1207957435,-1766191103,977174528,510984558,-1957211568,1379985651,-141834102,1968724575,1408860173,-2077882251]},{"sector":8,"length":512,"data":[-385649628,-1031012902,1439088873,-327029621,1239941324,-1070377133,-1979955575,-2037776826,2123235124,-1190715724,-1410138096,-790097744,-1592887982,1187475000,-1996458244,-1846935994,-394359552,-1342123800,1387653143,2123182453,12839124,49184384,2122321525,141886170,-1947056501,585883222,-387416435,-1557559,-729903818,-398737176,-1464322314,-2143819008,1963126398,-230257883,-802434933,-259312270,-288160847,-511653750,-771641337,-1270740768,-696008496,-176600576,2123176427,998762728,-1204371992,1357381796,1000138812,-13328755,-1338297112,1379526674,1961427829,-401559297,548950633,-389510400,1988975575,519801780,1604645639,-1979943228,38112309,280007,105235968,138790402,173902080,-13320573,-401574912,786968399,882806075,990505215,-1959051544,-389849627,-756538748,-58817744,-1005161216,1200301597,1602954764,529212942,-1996484603,1586101318,639485182,638338955,638476171,268771211,-62506240,1580927093,-385649154,448269130,-982521600,-402469144,-1125625348,178435,-385874968,2105549466,359925254,-2144985660,225773119,1962998144,172327684,-404110590,570881536,-160087954,101088640,-1628934284,139296826,16351233,1173764468,611651593,537478646,-1196422539,-398796824,451623417,17384950,2105740917,141885450,-386365000,116079313,-402616902,-109037187,-2145487614,-1207695283,1173805196,208994569,-155153224,1963460933,-796084221,-1494687486,978970682,17188294,218580422]}]],[[{"sector":1,"length":512,"data":[607686,641057987,-1460321142,-1470401278,-167349232,1946224453,1961691729,1964288015,1946265673,2088969797,1047855352,17319366,1946220928,-390549474,-1940833712,1552623296,268483062,-152513997,-109029062,-2136574718,-1341913011,-390004040,-1064551888,-161707226,857735353,987228370,-1883730965,-1000609536,101088640,1166739572,206932746,-1159174933,-164248575,1963001669,1552623146,1960512508,1955276322,1149970168,175490064,-1960382461,1846583604,1845626371,-1960394610,1351296512,640674562,49628406,-1960428171,52885108,637537334,637682827,52835467,637537846,-92072821,52458751,269913026,369305198,-109051862,-1845398272,33965510,218580422,-1995815543,-1195176875,-823590773,-326412861,-399971197,1441268007,1177994320,478881390,41192230,-1996190170,38112285,21465638,1460094344,317198256,-327250608,-400523288,2112368317,-401362935,2123190273,544139480,-399594264,279972204,-162533144,1080959494,2123186293,954198252,736624816,-397365195,2123184424,953149656,468191152,-402149323,-396412648,1183463643,-532280588,1166544676,155567624,-1983892696,1166608965,239438092,861869547,71666112,-1962326648,1166664262,-163149046,-972274295,-1962932667,1438866917,-326898549,6809602,-1001413656,-1334950346,67249892,-1325513080,1332733967,-400564248,279972064,-2142280472,1963067005,172329745,175498250,1183506570,951052542,1189613803,-402477000,1183462546,-402125570,1357396108]},{"sector":2,"length":512,"data":[122013240,-28903934,-972786687,-972683451,-2147416507,-973010867,-1962931899,-154968603,-1066524154,-1195179659,-1628897147,570881730,24477806,8763587,-2084400919,7213118,-1195179660,-2098659189,16312514,101088640,116790901,1967156770,639484967,294787,-538437516,91154435,1946224872,108888287,-166890240,1971325253,-1883716857,-1035212544,-385844552,1048625733,1968401978,1177994340,2088969838,1500774415,-2147158490,-1108847756,1242991438,-138811282,-1075251321,-1980266536,-1960441275,-1960439972,-1910107788,-1944221436,-1977220539,1166541127,105235975,138790400,1200301568,651753218,1963540352,952416780,-969511704,858261829,172329408,-348691736,5302275,101088640,499388277,75465510,-401116160,-840432834,6809604,2105599604,125108230,-2146875914,-1195179659,-1427570566,2156737,-2144985660,292816447,1946174696,108888307,-167283456,1971325253,2058928897,-1048057600,-1152692504,-1981264567,772044109,-1207867393,1927872532,1375930561,-1252834625,1196052805,692537923,1398097738,1257068641,-1605809128,255618618,289148788,356255092,-373095308,602472911,-326413054,-1004606333,1065362973,637957121,1963540352,108888076,-167348992,1954548037,7976966,-389997335,499404204,138906406,174033702,-1962439130,1200301784,-398030588,-1931321719,-1923619770,-1578570626,739764466,-387811699,113640827,-402362814,113641137,-1962906046,499408887,71797542,106924838,-1962439130,-1944221224]},{"sector":3,"length":512,"data":[-1977220539,1166541127,1200301575,-431585022,33979520,1149964149,-398054646,31876855,-1578563003,-398030080,702965495,1183517253,11790566,-152416632,1965033797,2093550112,-386431204,128988657,-2026750488,-364475657,1329577558,1577102056,-348791576,-386431142,11548117,-2026757656,-364475657,175947786,1329184342,1577093864,1300239851,-1162869752,-1959393304,317253190,-487081930,-1976169240,-142145467,-2026823192,899410167,-142147408,-2026812440,-125060873,537478646,62391156,157551352,-399121176,1149908375,135209992,1300236357,902045705,20742182,-2144991628,175442236,686297776,-385649332,280035028,-1957930776,197352933,-1324124992,408848,-919400844,1944637761,-1073001989,-5176716,1913666755,76230170,775262440,-402504565,-1959905911,897837060,71600942,1010138345,-2146208254,-1979578291,-391008032,-1959905939,-385741820,20723045,108269170,-402355410,-1959905959,894691588,-1948200509,-775552016,66554855,641058046,1946303616,1015031302,-398625533,1048595448,1963028026,-1075292359,1610058570,1379676277,-1960435339,1157693764,1552623114,1955276293,76424711,1166810505,1200236034,121997313,-1337211927,-163518208,-385844808,750305061,-1088427776,-2144985660,108267583,-385844808,1894301457,1268705532,108497702,73370406,-1996190170,38112285,21465638,-402176632,-1070399485,570881731,1232420974,-2144055064,1962935933,952416776,-348955416,108888082,-1206749951,-1696020599]},{"sector":4,"length":512,"data":[-1030834124,859084008,-349654336,-1962495981,-974648235,-963725263,-1959493400,145885765,411078,-1995876984,619252293,108888116,-1005816830,-1004139939,173902111,-972274292,-1023408571,425344,1173769332,1484062983,-2094654012,1946221695,178255,-1006515480,14084149,604587402,863234063,-59441370,-126579930,272927526,-398619718,116863592,159198,616040052,880666626,503298648,-382577688,45626299,26077184,-1171023640,-1427629825,866773298,2662694,-1962837272,641058014,83182838,-165276555,1946350916,1284187667,-74754058,1609439976,1924688363,-1107826432,-180029914,-402295792,468385884,-128677082,326423051,1845499451,1437599605,-348940312,1996470534,653490408,32851190,-1064557964,1852311099,-1699736204,-1942783000,1552623296,805353974,115921459,-1340544204,862382094,1642653872,650153011,-1175036789,-768409600,-382465816,-165268713,1948316996,122025504,103445761,1038661808,274580531,-1960394612,12127839,-388877360,-351849503,1156982294,343163125,-151015240,1963198277,-1070483453,-1338825496,856614992,17253878,1173757813,225772039,-399332120,101460821,115955636,-1070483405,-1204616984,-85372848,-397015502,678753130,56396582,-1961867893,1223168597,1578726692,2126821639,-1293364685,155567858,172345128,112721920,852224343,-385839176,499432693,108497702,73370406,-1996190170,38112285,252200390,205488166,-2144990093,108267583,188710950,-1977216907]},{"sector":5,"length":512,"data":[1170604359,1166541062,155567623,-2144943360,158665279,84297158,34031046,16824515,-399566616,686371345,-326413006,10153089,-1960430140,-964491188,-147004662,7200262,855799048,-96040512,-10058041,229638144,1464396008,-402237871,1577517089,96895833,-1341688759,1221847058,-1335891221,1221322766,-10051955,-1959681304,650337765,637813898,637688971,-1910098805,-59340537,-1912715636,78177918,1988977013,-311367428,-386107763,-1259855122,32499712,-1977213500,1930181639,1946696733,1946565657,1946631189,1946762262,1946827807,1946893352,701556777,-1763152779,-395646164,1860707757,-396397568,1525359991,-400166168,1383333985,-349825560,708765773,-353874965,-398005462,1589967183,126494460,913571900,292817212,594871100,-1030962293,-387441212,-349998046,-569968880,1962938477,639484942,1946763136,1751057,1002151145,-1930005219,38091712,-1880559755,71666473,-10051955,-147803927,195142,2105543284,74712326,67716598,639485123,482609034,1963407910,853051918,786682367,1399429119,-1195179659,1391001626,-1940681541,-1940681645,-1940681645,-732718765,-1990974381,-1991014061,-1991014061,1783859539,-1010814124,70976907,1166739061,38025986,509040323,885341636,-1491503705,401086069,-1391364864,-1861388881,199756515,-1509591808,-152960395,-1017225441,-1391430233,1193118502,1958742855,529212934,-1022936173,-2094654012,1946158207,1334519356,1602954756,126756358,-1960388213,-1960440761]},{"sector":6,"length":512,"data":[-1960440225,639419415,294787,-1960437132,-1960442801,-1910110625,651791111,1963738939,1602954759,389752334,-1996190781,38046469,-1023261303,70976907,1166739829,38025986,-993853067,1200301596,1602954756,126756358,-2094606197,1946157695,639484960,637814667,637951883,-661977202,41911078,-1962248960,-1962571516,1166606916,499434242,206015270,241142566,-1005090010,1195058716,638022924,638476171,-993847493,1065362972,-1021086964,-1912555845,-345098234,13024025,1849165454,-692383509,939953664,-1157108882,109969638,2105568824,880083462,-1962261109,992349269,142542423,992354428,443679815,173488934,310315132,138885926,-1977217929,101318983,1166569026,1287176967,-1177556736,1843267319,1182007298,-14265594,-14284169,-14284681,-14285193,-594869129,-402650952,1397764230,-401756078,250095906,-402608081,-1078973606,1513052136,12146779,805562448,-402600776,216543175,147096367,-1977219237,101318983,-202805694,1174857768,1850089156,-2128639194,775946211,1432323979,1571290926,5724245,-329376512,-396485376,140473344,73364481,5756161,-1873232384,-1806123520,5825792,5847296,5979136,677110272,744219137,6078721,6092032,6110720,6120960,206961920,5648384,5779968,5800192,6065408,5682944,5703168,5721856,5867520,5910784,5952256,-1738860544,-1671751679,-1604642815,-1537451519,-1470342655,5659137,676747776,1281203464,1348312321]},{"sector":7,"length":512,"data":[5995521,139853056,5651200,-326413056,1343548547,1964405736,-327250666,-401240088,1961426576,772794390,1541931184,-1207506134,1726529585,-790079442,773646382,-1017256565,-189011024,778365037,-1909584407,-1955698682,644742718,1948255734,-1142181877,1273523702,771025198,-385836360,-1957316511,686588908,371255376,-387154291,499447247,205488166,2123186034,369617112,1170675060,-973078524,-956168635,68165,804295,-402003200,1183454476,664856819,1511386856,-1913880947,652793974,-386430168,1166802397,1575324420,6863043,1438123241,-326898549,365226044,-387154291,-974646200,-662794987,-401289240,-2098659888,364308520,-389775731,-1343744848,678684925,-1961516312,1072230470,-599356627,-1959970328,870893638,24164397,-399639832,-443863738,-1957313699,1022133228,-1927973400,-102175618,360114195,-388465011,1843926000,-998339307,-401311768,719912312,358213672,-386906485,1183526134,753985756,-389527925,-2135413526,766633985,-1959985688,-1195155995,-1528299248,753985837,-2081649835,602417388,-327250667,-1928073752,317249662,354019328,2123233163,591259884,-1962654325,113466853,2005608019,1602954758,76424708,54493222,313531765,1967348456,-1983892714,1166541893,537049096,-402614086,-2014777305,638643192,-402503797,-2001196634,759031808,-1892908312,38113029,17188294,218580422,252200390,607686,-326412861,-399971197,2123175078,327346412,108497702,73370406,637832742]},{"sector":8,"length":512,"data":[1963147136,-401428452,360006391,-857189626,-1207477257,-1715847164,-272242688,-336058904,2013210135,739239938,1478968808,-1205256728,-722993012,739895340,-1961599256,-443874235,-1957313699,686588908,-1928050200,334031998,340453395,-388465011,1441272660,339339516,-399780632,-2001197302,748546048,-970202392,-973011387,-972224699,-972093371,-402650811,-141880442,-387154291,1166746171,1575324420,-326412861,-399971197,2123174906,316074220,-1928070168,99145854,-66656237,-1928074520,-2098664322,649652267,-388465011,-1343739015,9222182,-399752472,-443864178,-1957313699,351044588,331147344,-387154291,-337112442,330688547,-386906485,-396874926,1743268891,1575324459,-326412861,-398660477,2123174806,316008684,-1928095768,820566142,328132626,-389775731,-1863839080,642509051,-1961657624,401141830,-599356629,-1003810328,-1960388514,-397934009,1183524918,721479880,-402632520,333982663,1575324459,-326412861,-398660477,2123174722,300280044,-1928117272,1307105406,-79304686,-400162584,2123174708,306112708,-386189592,552084977,-263812333,-1960133144,-1209476026,-934900950,-1205161496,2028470356,717547563,-1017256565,-2081649835,-202878740,-327250670,638719976,205260682,116867700,8416734,-1360519820,510715933,-1193771379,-2031615977,-998339321,-385876040,-1934096515,-399250559,115875258,-662794972,-402648648,2123171689,-18236,-1207475992,384500196,-386217752,2123179377,-390057000,1187448653]}]],[[{"sector":1,"length":512,"data":[-1207959352,-397409916,2123174548,288221360,-1961720088,602468422,-599356630,-1960174104,401131590,-1270445270,-1003875864,-1960398754,-397934009,-396875978,468200143,1575324458,-326412861,-398660477,2123174474,294250732,-1928180760,-253175682,300869873,1006733498,-1173064692,171737488,-390460044,1946893313,6797318,1353995497,304277586,-389775731,350752971,-327250670,-1960203032,-1410807738,1961383977,700049450,1946958936,1946893342,105235981,122013189,292743170,1170611435,1170604294,1894253575,-972035311,-973011387,-972224699,-402650811,1170608490,1988955912,448587992,-2013675288,535423223,-1962654325,1438866917,-326898549,296282152,-387154291,-1410854724,611313913,-1928223768,1021892734,295036944,-386906485,1183525170,690809052,651714244,1208108939,-1205448216,-387448428,691333161,-1017256565,-2081649835,-397404948,2123174242,279046380,-401514776,-396875527,921184711,688973841,-1017256565,-2081649835,1072179436,-327250671,-401617688,2123174208,276162776,-1961807128,-806817722,-599356632,-1205286424,1589903652,1065363180,-1207733244,-2065170156,684779561,-1017256565,-2081649835,-1557268,-327250672,638553320,1963278208,284878923,-388465011,2123173748,283109572,-102233227,-117774321,-349983512,1200301578,631826434,-399996184,1183518927,678226160,-388217205,1183524966,677439688,-402543432,-1763170009,678488080,-1017256565,-385859656,-1957317927,686588908,278456400,-387154291]},{"sector":2,"length":512,"data":[2123173669,71682008,-2144993280,829687103,75465510,-401378048,-2135420811,-400788224,-1914171508,591390968,-1960437781,-1960442809,-1910110625,651725575,-402503797,283649326,274065448,-386906485,1183524850,669837532,-329333672,71270438,-268106892,682223871,-401598232,-443865102,-1957313699,351044588,270592080,-387154291,-2144989523,393545023,-1961879832,-1276579770,2095601703,267118632,-1960327704,-1195155995,787021887,-326412878,-401281917,2123173870,243001580,71270438,-454551179,-263812337,-1205370392,1223164268,263710760,-1960341016,-1195155995,-85393345,-326412879,-401281917,2123173818,239593708,-1961904408,1407774790,19970087,653024964,1946435456,18921475,-400027928,1474826109,1575324455,-326412861,-399971197,2123173766,236185836,71270438,-2115490187,-662794993,-401699864,1055455125,258861090,-386906485,1183524618,654633180,-402565960,988293067,655681551,-1017256565,-385859656,-1957318275,351044588,-1928380952,-890704770,255453197,-386906485,884483798,664659969,-401666840,-443865370,-1957313699,686588908,-1928391192,-1561793410,253159437,-388465011,149425739,-263812337,-1960401432,-1612129210,20494374,-400070936,-1343746347,1575324454,-326412861,1347480707,-1928405528,1793649790,1065362957,644117764,294787,-773300875,-662794994,-401781784,2123173576,231925956,-386477080,2123178373,245885104,834146676,648800448,-397389640,1491609253,-402396378,-1729622705]},{"sector":3,"length":512,"data":[-263812338,-1960430104,803789894,-934900954,-1960433176,602453062,-320317402,240904230,-1960430104,-1195155995,-1628897217,-326412880,12643457,-939637111,64582,-12548409,1172832256,-385649650,2123170074,-500766488,-2144985660,108266559,88047654,1810376309,71666462,-2144985660,108266559,-369342839,1317732583,15776510,-385729560,2123170050,-504174360,-954525464,50246,-1977213500,1963539463,440264724,-1927400984,-1070345090,-1207785240,-1880555304,1946827776,1963670532,-569968830,1946189933,413919261,-1927713304,397988990,42199040,-1195344243,2062090239,-2133542910,-1209507093,520349720,-1194033523,1726480401,-1065448190,-385876040,-591920547,1011215105,-401378036,1793652161,-729903840,1189658675,14465026,222047979,1458049141,-729903840,854114355,14727170,238820075,1122504821,-729903840,518570035,14989314,1085802219,-1349261056,-330921136,-1960509976,-135735226,-1002009820,1478816232,-400180504,-1634917114,-1628897472,221505572,501810037,221636863,-1157871989,-236453632,1084132620,614852863,-385988981,-18340465,618194956,-1017256565,-2115204267,-1996444436,1187511878,-956301060,16733318,216983552,-169278604,-394359552,-991124760,1065362973,637957124,1963278208,487909414,-1006353013,1065362973,-1996065788,-1024852922,-28407040,-402584390,-571932444,-394359552,-387158296,154930284,-404218763,609216540,-1960436284,-397934009,-122150534,621930496,-383492632,2123169926]},{"sector":4,"length":512,"data":[1963605204,-1643788527,105235968,122013189,-2131445758,188501483,96932213,1170604194,1170604294,-524811257,1010363137,-954895092,-973019643,-973011387,-972224699,-1207957179,535494908,359992892,18220487,17188294,34031046,607686,-352255816,4241414,-391223063,-387439453,1849205027,-972929655,-1928394683,401139830,-199497707,1156118407,71666458,-11231603,-400331544,58002433,-385924375,1183517699,47868,-1928609816,-385919842,1183523699,610134270,-401879832,-443866202,-1957313699,-1662221844,-28931840,-2114169207,1946223865,-386301578,644903936,294787,-1960416908,-1960442809,-1960442273,-129595105,-939893111,16737414,196012032,-387678579,1580927528,-1941277192,-95011902,854082421,-62485725,-400294168,-1634917558,-488046748,192407586,2095634036,-28931317,-1927079448,-385915746,-2085084433,594274500,1441268912,188999715,-1960632856,-1195155995,-2031550401,1751213,1353548009,-1326967888,158685241,-401975320,183104335,537716766,-1004343575,644761118,-1007214709,125140992,1847723766,-148998784,1967128771,570881543,292896878,1073734529,775541736,1636665227,-1951924434,8763489,1068314857,-1946156952,-1946076054,-1946075030,-1946074006,-671004566,-671000470,2130795626,-1895825308,1056964706,-1090518941,-1083958429,795092323,1610612836,1761607780,637534308,2046820453,2046885733,-1728053147,-1721600155,-1721599131,-1721598107,-513637531,822083685,828530535,828528487]},{"sector":5,"length":512,"data":[828531559,828532583,828535655,828533607,1835167591,1835159399,1533170535,1533183848,1096977256,1342177385,-1828716439,-402653079,1577058409,822133866,-681419929,587202663,1157628010,-1224687510,-1040187292,-100663196,-1442840476,2046820455,1811939941,1677721702,1744949376,1812059264,1677847680,1879175297,1946285184,2013395072,-2147353472,-2080243584,2080507008,-1946023808,-1946151736,-1946153256,-1996481840,-1744824096,-1670839808,-395764480,1256720722,639484951,1963736960,108888158,-1337691134,124094981,-389048600,1173756810,494209031,-1339985688,498919424,-390067784,2042110409,566487042,-388433992,1894326717,559147041,-1612185424,2406429,-400418072,1170612575,-2084368632,2030046333,868233997,172305362,-385067749,650317684,1963605888,108888096,-401247230,266867789,555214869,-1206215960,1927864629,556132641,2131977600,-569968701,1962967149,553380062,-1008205648,-427771878,-1339992856,557770879,-400489751,-2144991070,1031081023,1703544240,-823007225,-166009368,1963460421,550234134,401080496,-386418659,-400481048,1300242647,-389872632,11542709,-1206058520,2095579176,549578785,252200390,-569968701,1946189933,331868190,-401307160,350757009,-1070221286,-400495384,985143819,551807177,-400517399,1994920914,-402608096,-659023298,557705217,1344307945,-402124824,-2141317607,1946289789,542632000,-1545076560,122025500,-166038264,1963198277,1149971978,547612673,773871337,-402439030]},{"sector":6,"length":512,"data":[1290346632,1149972000,546301956,105155374,773884136,-402111349,887693441,76164640,1157863832,206902026,17716201,88129790,-763166719,-922812672,77128,-402597245,-1427634263,122013205,108888064,-401181694,11542501,-1206111768,1055451344,535947296,-823561552,174424848,207979265,131066112,-402165784,-1142356089,124774407,-1341686040,432334850,-949077855,-1996417531,-389873083,-504887294,1065363163,-400132850,-1570821,449046767,-1205890840,1558708584,530704416,17188294,34031046,252200390,607686,6994115,-391510807,820512545,-385699833,384309622,119924743,-2146102040,1946289789,-402214881,1170610530,2105541127,74776582,-1022736897,-1205911320,-1628905336,525461791,839599498,-372100124,-555217548,350218246,33979776,112203380,-401003032,11542297,-1206163992,1927857286,522578207,-2046147189,-372100156,-1957360312,351044588,1460098536,-387154291,-1494743448,-278468588,122611807,-402236440,1508381849,121497839,-2131986803,1963067005,108822542,-1962380030,1166608964,-401806580,-655877427,138709534,-972536568,-401799355,-443873662,-397360291,-1863842042,-397321753,15262680,37509127,112199796,-384260632,1609107086,-152007930,1080959494,-1959912331,518252548,-971073816,-973011387,-972683451,-973010875,-385873595,1793590886,71682022,1170604032,1170604550,516161544,53347476,-1960443300,-388877561,1139346576,111208454,-1607295256,1362914874,1128029812]},{"sector":7,"length":512,"data":[691821172,1088968308,639485158,1963147136,2139301458,1265893388,273124134,-167099135,1080959494,250094709,948681246,-1206050584,1726481803,505014302,17188294,101139910,17321344,607686,-286774037,173917413,-1910535386,644748294,199952267,-1058019241,643817355,855787403,72714706,33965510,-402107000,552078344,96004358,-402254360,1048588819,1951493690,-440539089,-1763172924,1200301568,172294416,1847723766,-401705664,1170611605,11535879,-350626328,-443815887,638213572,1441466251,-1064048553,-396370037,116785253,1967156770,-1196403920,1528675304,-1960394612,12127839,-388877360,-1934090655,498591962,-971150616,-973011387,-2146629819,-972748723,-352319163,-448796632,241142566,270402342,126559744,1962934077,337021742,71681902,1170604032,1170604550,1575485448,91613195,637854185,1963147136,2139301384,24379404,9681091,-1196977943,-1964441461,-1343729497,116874756,8416734,-13758092,260302900,-401600280,-622325550,772991772,-402492161,669519810,483125264,-1813512016,-1796712426,484042781,252200390,1944604867,309061636,108888158,-400722686,-1070395575,1649409665,-1925185164,-1729623459,-1962439872,-639106473,76343562,-956326936,-973011387,-972224699,-385873595,1170670714,-973078524,-972945851,-972945595,-956299195,-1036711355,1745634759,239453985,1170725538,-943124720,1073746501,-402376727,729089184,-402407448,-1108867929,393210092,-1206108952,149422452]},{"sector":8,"length":512,"data":[474867741,17188294,101139910,252200390,607686,-150725143,-2140283386,-1206356736,-454557172,472508444,17188294,67585478,252200390,-1207700759,-857177736,470935580,84297158,34031046,252200390,-402403351,-396950462,-544489735,1065363039,-402230008,887746349,2209796,-1767481111,1847723766,773616960,-1863842677,467003420,17188294,218580422,252200390,607686,-402414103,-1959861335,333972084,71681792,1170604032,1170604550,-706215928,59304201,1053105751,1166765586,508922652,259375115,1965049131,1959922449,12747054,722660112,41099333,-1320107981,65590020,254105808,441789184,1160449394,84701976,-360513520,855929601,-976079936,99294333,-947661057,1979648776,-754667017,-2083877950,-494669599,532744975,1426309983,39136006,1023689987,74579984,1107300397,74646827,1241518085,106793923,990010667,-1961266470,220922957,-1048378253,-633648368,141690487,74631227,-745815669,54585539,-402509848,-1595407553,264431874,-2081649835,736629996,40757251,53405783,-387154291,552075875,-1159176445,-263812326,-1206208024,-2132279232,449177627,17188294,84362694,252200390,607686,-1962764824,1438866917,-326898549,48818216,1459759848,-1929188376,-169284482,-353507327,-401233688,2123170524,31910104,-387260696,-924314215,12082946,392423425,-1961206552,1541992518,-599356646,-1206233624,484966456,442624027,252200390,-1017256565,-2081649835,-1813506836]}]],[[{"sector":1,"length":512,"data":[25356290,-401672472,544539269,-327250601,1593951976,-1961221912,535359558,3979290,-400890136,1170610731,-605352184,-1962775832,-389849627,1894252981,355199210,-402587464,-219670791,24950809,-400900376,1170610691,-1092022520,447866881,-971376920,-973011387,-972748987,-972093371,-385873595,116785606,1967156770,-2234360,17319366,-507778877,1846681284,877103910,71681945,1170604032,1170604550,-437780472,26798343,32172112,-1070396812,-402652998,434831796,637565160,1946500992,1211979786,-1205373695,-397409952,1927807447,1088968729,28305434,-971406616,-973011387,-973076667,-972093371,-385873595,1069023581,-1545344768,27846736,637548776,1963212672,27387939,1478049000,-400946456,1290273145,105235993,122013185,138790413,155567631,18671872,-385859656,686334893,296282337,-389866044,-2144927756,108266559,88047654,-1195179659,-1897332659,-2168669,155156518,-1195179659,2129199170,-3217245,205488166,-2094659467,1963065983,1656275713,-1553471232,-991894808,1065362973,-1023314680,-385859144,-35085483,1065363156,-1023314680,-385855816,-303520955,231860436,-1005711128,1065362973,-1023314679,-385858632,-706174163,1065363156,-1023315444,-385865800,-974609635,1065363156,-1023314676,-385866056,-1243045107,639485140,205260682,188483700,171705460,-1195179659,-219611057,-5576542,-385026328,-1343745814,-4790272,-402608407,-1108868954,10873343,-402612760,-1662386236,108888064]},{"sector":2,"length":512,"data":[-2147191552,-1015019187,-949077855,-1996456443,-1581055419,96955960,1166606470,950125314,-1643788434,38111488,1849205187,10618311,-1023261303,-949077855,-1996429819,-1581055419,96955960,1166606590,499434242,1007127078,-150309621,-2140283386,-1342016512,-1072970998,-1078978955,-1592253464,-617386440,-393215815,515381453,405006679,-149437975,23977478,-1207536640,-2132213560,229688088,-1339133207,778955026,-1561784912,-384913362,313536157,-1574004503,1189647682,217311245,1055455111,216786957,499447687,-1006138842,121251356,646581877,205362498,1024422928,1081409550,-2029221144,210102519,2105603975,410321414,33979520,-286780811,175892489,-420939897,175368201,418117511,1843267319,-428539776,-401988120,-142144886,-401990168,-142144894,-991541528,260711965,-754974280,1109297888,-771804523,-2021314845,460614973,-13444726,-472783919,33979776,2088765557,41222662,-13745341,-1200791641,2129199145,-2141290335,1867804,1048592,1048592,3145776,-2130739152,16646399,-2130804482,1835262,0,0,0,0,0,0,-1627389952,1399724653,2138167665,1148123758,695209839,1399859568,-512632463,1399970160,1399970161,-2140022415,177553982,-1662515853,-402396406,-142144827,-2029338392,1111392503,41226133,-253167737,374925326,-1790833014,1963981184,-1191737598,-109051732,-1204259840,-109051728,-1204784127,-109051724,-1205308414,-109051720,-2146929654]},{"sector":3,"length":512,"data":[57936889,-402604872,1156060927,138790422,-2139836401,194331198,1974469237,-402189079,753407719,138790422,1465303823,-1962249077,119409277,-1610608455,3970370,20723316,37501556,171720820,188486772,255594612,-142146955,-1358623827,-119404939,-1477246229,41222320,1048576432,1963693378,1593914370,118352222,-1425732691,283900642,600897453,-119362811,598542059,-85808379,-2134679969,9781822,1692933749,-386431222,-142144969,-401727768,1018697094,375252992,-971660568,-1022425019,33979520,1552615541,4161546,2105545076,527761926,-2146804341,393543743,-402247192,-1070396852,-1996012408,1149831748,73066508,-401249559,-142145045,-2029394200,231598327,-1206569496,216531012,357689366,252200390,-378193477,1448543778,-1962246773,119409268,-1790820736,-2029358080,895478007,820600670,-1979348474,1929642704,855617538,-398438172,1398289787,-1947389354,-1426355209,-213464438,-930455900,-213464534,1600019364,-1022730871,-2029490456,141158647,1117845383,1009825429,-1240173552,1930050584,1006679566,-1240960000,1946237984,-2146912766,1946486397,108822549,-166956027,1963067205,121959945,-402426878,1156972667,527696391,1375761128,-2029483544,142928119,-2028699160,235792631,-1043562408,-488097104,1377102612,-402100760,-1302719382,122948312,1307113351,-1594390765,272405826,171717236,45624946,288483328,1054718544,-401410072,1079512525,-400127302,-1632627980,-401304600,28316759,134759434]},{"sector":4,"length":512,"data":[968558661,86305141,134759562,1089013829,-269987308,-956933628,-2147257312,-1916598026,1284311645,-1790795766,175245884,108269628,-382226456,1760101663,-569968841,1946189933,119793677,518584199,-369654009,1117847302,1947221141,1930050587,1946172424,1963080708,142376975,-2146864128,1962936445,76867587,556160,-1092086155,-402608109,-142144122,-1340885784,226289665,736884615,-1494681721,-402608109,-142144146,-397192520,1353716733,-401348632,11539345,-1207084568,-639106983,1600043027,-1609308952,272405826,171709300,-927461518,339863553,-1156348184,1542026553,28883460,292814908,1006746810,-1173720063,37487040,-994442380,-389903615,1625887771,-569968877,1962950765,1111392352,125044885,-1790820736,-397249273,-142146219,-2029694744,321120503,-1928772214,1301088861,1111392268,74713237,-645463756,-1961655832,330492121,48822151,-386431213,1149899543,138741768,-1962254963,2112358980,207457555,-401849205,1149899636,155551753,79947971,-1092028537,-1963489532,1686767429,-1058674681,-1790820736,-1475841273,604271876,1342442497,-2029205016,-1008183049,-386431220,1048576826,1913296194,122025488,-402295544,1139474852,-352171288,122025534,-1341492216,245819397,-344751685,-2147110888,60113470,1048578420,1946457410,-402542590,2075856524,-1790795662,-523115470,-670834479,39291694,-13699193,-386431209,1149899375,138741768,1111392451,460458645,-1962261109,1143671893,206838538,-2147433855]},{"sector":5,"length":512,"data":[-2147419519,-1073020299,-402437399,1860894723,1109297808,-771804523,-1208013085,1166766619,206932746,-1962259317,801311836,963785842,1064451186,1399998322,1685217138,57829746,-1009577023,-753155797,875162051,-399227415,-1047841726,-2084318325,108273633,-757997359,-2084308254,108273633,-657331503,600046306,-1009572927,-754204405,868299715,1166656467,206932234,-2000711448,-1547499707,-1556086670,-1220007822,-668403854,154728306,288946035,299946355,-1259810445,-1275060110,-1275066254,-2147471246,1963067005,175997707,-1979353855,298248646,-2146470423,1963067005,172329774,661962763,-784217805,1241215976,460701707,-1173729911,971759825,34031094,834144372,296216786,-1716517397,-2146332696,1963067005,28332551,1510834664,34031094,-427818124,272361719,67652992,-3348285,1776915120,108888081,-2096401150,1963002493,-373126395,-1336798871,223406081,-385741736,2105545053,326434822,33979520,-353890955,172264208,1692940466,-1339299057,217507841,33979520,2088966005,292880394,-155186760,1963198277,-1073170429,-351197976,-1292400887,247261240,1069283207,122025589,-1157401598,-1679198919,7579905,678668560,343130136,410238976,410241536,544456704,477347840,544450816,141797632,812886272,2145931776,178190,1510813928,91551242,-1729505654,246212878,-402542510,-380105550,-202895057,-930498305,-1206863640,-1293297015,-1547685104,1168348483,108822677,-1956219646,1141574212,-1606912756]},{"sector":6,"length":512,"data":[171742530,188482676,2105552245,477429766,-2146425624,-1325987995,225372160,34227587,-402650950,1300237846,1407910152,-1206908696,1726533641,-2142704880,1962935933,267905056,34227587,-1307818869,242083896,-2097134616,-1962800531,951192132,-351379736,-402280414,-142144528,-402652488,951192713,-401738008,-21495776,209447167,-1075300174,-1141405939,-1477937863,-1790729984,-1593162359,1166644549,512410380,-13462206,-1959861295,175412359,1342731456,-392870981,-1973940222,1958742724,-1790592250,-1022364183,7697664,2138864767,2138864767,1016414880,1007973130,1007711232,1007449090,1007186951,1006924808,-2145094391,1946289788,108888094,-2145815550,1946159228,142442514,-2146601984,1947142268,142442502,-1023314929,-1962931527,-1996126460,46629636,-503134589,351241202,-1609240957,272405826,205261172,914359666,-1023306430,747979424,-958976502,-972880315,-2013264059,-1070397115,-1995815543,-152499131,2004186358,1953919858,2105311093,512401278,-13462206,-472783919,1966195585,-6422096,-350849821,-351111918,-351373554,-351636982,-351898874,-1342015998,-963012608,-1996486843,1435044421,-156243700,-1977213756,1946762247,1946827793,1946893328,1946369042,1946696724,-1326857443,19392515,-402541335,-672595598,-1933341951,639485122,1946369920,-1960393941,-1960442809,-1910110625,651725575,1963147136,-993883101,1065362973,639202568,637816715,637951883,-645199986,1962937064,-1994603513,38112285,1065363139]},{"sector":7,"length":512,"data":[991655171,-1945733672,1959410625,1334519313,1602954760,638051082,-645199986,-2134645269,1963132541,235923513,-1928772214,2078804573,207457550,-1206998040,1592262832,49002510,-1928439576,-1712846243,28358670,-401715992,1170607615,1300234502,1170604296,-2134704119,1946355325,231729217,425344,-2135290507,215738424,300466226,-2145850610,1946224253,-1968132084,317196901,139296782,-1073170431,-401733400,1170607547,1170604806,-1070369527,-1995815543,-389870523,11537805,-1207313944,1173749761,158598151,122025536,1073902600,172877888,411078,302597574,-1341504119,168093696,-1005749527,1065362973,-2142735092,1963067005,173903112,-349095704,108888115,-166365952,1963460421,122025495,-1173785596,1173749983,192152071,1005063600,-6821881,-402596934,31984929,221636620,84297158,34031046,-1007355927,-2144985660,913640511,33979776,1569524597,820504586,-349090072,-401756130,-286783742,-402608116,-860354246,230025217,-972227864,-973011387,-972093371,-385611963,-993790781,1065362973,-400526069,11537605,-1207530008,-1930919504,215083021,84297158,34031046,252200390,-1007382551,-2144985660,745867839,33979776,1569523829,820635658,-2081941525,210495488,-394152776,-1662513833,105235980,138790401,122013199,-194647804,108888259,-1923058430,1200294493,2147427592,20784756,1026519612,712459262,134154231,-2126699403,1025012287,326582398,98179,2139295093,125108227,79233200]},{"sector":8,"length":512,"data":[-1341330688,571652,45090283,-2013263175,-397342907,-396873536,1170607498,1170604038,1435075593,207456522,-1022474871,84311424,-1863835020,201320703,-167716422,1946289989,170440194,-773322923,201713674,84297158,34031046,-2134887485,1963067005,173902633,855642297,1125583826,200991299,-1206422062,-957874144,10532872,-401830168,1170607059,-1195176184,2105540640,477430278,2144336,-401973877,1170607374,1170604038,1435075593,207456522,1477330313,425344,499394165,38222630,333979252,2144260,-402096920,499387253,-1207393560,1021837400,193062924,252200390,16824515,33979776,1569398389,839354890,-397393692,1170607290,1170604038,1435075593,207456522,1477330313,16824515,84311424,-397403276,-1075249205,719869955,186902536,-402641736,887622639,138790411,2105590543,779354118,33979776,1569394549,839354890,-388877340,-135661244,184019186,-402169928,149424981,105235979,155567616,172345128,1170604032,-672595449,639485170,1963868032,108888121,-1206422270,1088946178,-1979600853,126421605,-972399223,-385874107,-488050031,16824325,-402149144,1220020905,192276480,-972375320,-384890811,-389811595,561315876,52750416,-402587464,-2031614067,-1209509878,5027847,-401912088,1170606739,1323896584,499434482,20938790,-1960435595,-1960442809,-1910110625,651725575,1963868032,639484941,1023559563,41353471,-154943429,1080959494,-2134703755,1962935933,105236217]}]],[[{"sector":1,"length":512,"data":[639484930,205260682,-1612183182,121997824,1006908905,-385649400,188481682,-1947726731,173903104,-382838808,171766260,2078805877,121997824,-401973875,-504811917,1963539697,173917205,839354918,-930397980,-399875352,1569259619,121422602,-219664267,-1194292474,1290272800,509040170,1975846686,-1963226358,854405838,-1968507968,-1314589750,717892128,531297230,1569283679,20759306,904403061,-1961658881,417874120,1125091370,1258297064,-385196663,-1984368275,-1809848064,-1960436284,1569522255,509040138,1975846686,-201618678,1583292324,639485123,-13492342,-13704239,-210058329,-210046086,-210050182,528151418,528194939,-142886789,528226427,528162683,-998563973,35698717,274172710,209683238,-2028636928,26536183,-1880557689,-1004506111,1095709,39291686,-142126512,-402545944,-142145270,105179224,165537880,-2146884887,1963067004,172264278,1963738123,122025518,-400002044,834144497,156231872,-1461190480,122025478,-2096270328,-1342043579,110749696,34237827,17321344,-402069783,1149962441,112388106,134694390,1166216820,1149960714,111339532,34237827,-2029467927,145221879,-402111350,-142146526,-2029478680,-390057225,-142146484,-402045814,-1528232658,-386431224,216595665,141879297,499447687,-1207588120,1156055132,143255817,33979520,1552619893,4161546,1592267125,13023752,839348456,145156288,-2029491479,-51779337,-402599192,-142145478,-1960436284,-397934009,817366382]},{"sector":2,"length":512,"data":[151382016,-2029499671,-64952073,-2029511192,416922359,34031094,951452276,-402172662,-1830287624,136964353,33979520,115875701,172264200,-2096762904,-1962800571,-437777340,172327685,239373058,-351937560,-386431160,11536357,-2029933080,142442743,-1207208960,921195346,-397365240,-890763232,142442503,-1341426688,135456856,-396731464,11536413,-2096793880,-1342043579,91088899,34227587,1692926640,174949125,129362180,-1960436284,20775495,1024160768,192151554,1946158141,1170653963,-960299001,-1023146171,201803206,583875,65599367,-1007188224,425344,1659375733,780295,1471415820,-385368856,-154990737,1947208005,948812296,-351903512,155579938,-166431712,1963002181,175997702,-1206881280,-1830238335,-1341789433,125495487,-1979278104,414189925,1963050230,-166678512,158663364,-990510928,-1342016248,2105590536,779420166,-1977213756,1569521991,-1779937270,180049963,1946303488,1007203080,-1291684608,-1957999868,-397211071,190514194,-369986085,2105542383,460652550,-1006156406,1194993180,638416129,-402501749,-68680003,114419971,-386225688,482608817,38243110,166259890,-477513723,-402193176,1018167331,-1207505944,482615129,21432870,41157288,-353878092,256006,-1207526679,-555139635,387078,-974533200,-569968890,1946189933,512630284,243494504,520159272,7649475,-393155351,65537621,107604224,425344,112789109,59042048,199753904,1397929984,-1341743896]},{"sector":3,"length":512,"data":[109504848,17202560,-930473868,-402587464,62390293,1042438,-402193736,1170604041,1170604294,180555528,-1979550519,56289476,425344,1166214517,-1950154230,1166609477,239438602,-1022605943,-1979232886,108888296,-1960282878,1435175493,80082444,-157808523,41157317,-973675470,-1727499000,1946338806,-1982713086,1435044421,860744460,-153996352,259261637,1963246070,-157765622,57934529,-152817480,326371525,1963508214,139296782,-157699580,57934529,-1949158982,1960446936,1347571991,-1341816600,30205952,845912,583768,1493535464,-1022923384,175423499,57992202,-385497879,-2134702672,1963067004,89385025,134694390,2088965237,242549002,818307,-21886859,-385594392,1149961555,-1259843062,1173772803,326371335,34227587,-1978907509,281706710,-2096914712,-385742227,-2024667857,84928759,-402111350,-142147446,-2029714200,-390057225,-142147404,-1966175654,-422573708,-422517040,-102175094,122025475,-2096008184,-1962800571,281706961,65464336,34237827,-402330903,65537229,81914112,425344,1173758581,578028551,134694390,1166216820,-4586998,63170608,34237827,-399441990,468386745,17202560,11535732,-167713304,1946683205,-397234171,1353712860,-972761112,-1023146427,134694390,27791989,78125172,44570996,145234548,-1595204748,108266920,208931496,11572971,-1342133783,10807554,-1612119632,-385634304,2105540762,1316291590,17188294,134694390,1488202613]},{"sector":4,"length":512,"data":[-2080374343,-1273531199,33864026,242532740,45701556,1958839297,-1185172475,1292370696,158173192,1642710154,375044,1488503172,-1190759334,1505231114,139266139,-385258104,-1329396647,714753,45152135,-2030028312,1149551607,-401574648,11535325,-2030032408,64219383,1355020167,1342719242,-957810809,1139300355,-386430977,11535293,-2030040600,1776834807,-1007187969,1173801098,913573895,425344,-994960267,-523181872,-259333936,-1342001944,-2132702580,-864025916,65792192,-706211605,178176,-1979696920,-402520895,95420616,-1041758741,-771641344,105236192,138741761,-1022800504,485017738,122025473,-2096139256,-1979577787,-402520895,1837302027,-2134703606,1962935933,172294404,108888259,292097,-1950152379,1166477893,172329228,-1579643965,-1020563986,1843267319,141824000,1946286979,-121597,-1955729757,191753246,990147803,-1560054845,-389845524,-1917124653,27453502,-396945736,1170604881,650315014,637683594,637816715,637951883,-645199986,73894438,-321780815,-1840957,11587723,-1342150680,51571024,-787854079,174949353,822065666,-503199512,2105590772,544538630,678756412,805914102,1166680693,37742601,1173791152,41223175,-571957072,33548546,17202560,1161433973,-1023314679,-523203918,-523181872,2112483466,122025473,201880836,174426800,-1962752791,-771028395,-1207170444,-1962760216,45345218,-536166220,-523181872,-536158000,-1561775696,1962949634,155579932]},{"sector":5,"length":512,"data":[-1978239696,-689436347,-157044735,1963198277,-391991294,-1763114380,-796347903,-790572832,-370111776,-930414304,-402602310,-1047854824,67585526,1659437940,38725890,33979776,-1031136395,67585526,84675444,-1962787864,1189677637,-1979446270,1055459941,46825474,-504760782,108888064,-1962314494,-897578427,-1876431934,-1241265536,13887760,33979776,-897576843,-1327330622,34596993,-385202805,-897580535,-384780797,-930414411,1975597976,-1327330804,32761987,-571883126,-1327330815,31975553,-487997045,-1966568703,-159337742,1946421061,-1736199663,175425595,2129166770,-373191936,1994916293,-373192192,-397409876,-2141652261,-829774614,-2146967168,158598905,91602955,-1561738613,-1731687679,225820987,-1958687104,26470594,2112471434,-2133950463,-2031566197,-373191935,1173750145,141824265,-2131059992,1055630570,-1325755672,22734908,1173782704,175440393,1173749936,41224201,-802013008,1173758187,57934855,-2147366272,1963001469,158665227,-1950298496,20703682,-402045558,1166671993,1964025865,114196505,913580200,-1476135296,-2094238459,1962936957,-373126385,-830471915,1948297222,100040707,-1744157301,1963607355,1087275022,-85409141,172329728,-2147425303,-1031044914,-167711512,1963264325,172329734,1359012073,-1961998965,1435176029,1342224650,67716598,12127349,155580112,-1190955712,1659408384,-1463592703,-1273793263,1963108406,-1473858552,-1274907384,-372995538,-2084372332,141835839,50464643]},{"sector":6,"length":512,"data":[-1022916321,283660371,803756032,4777984,34064219,38242560,-787510333,-2096335639,126550723,1370195,-1007361445,-2030040856,256247,868480903,71665600,276086795,-1202694394,-605552637,-1442795384,123710296,321731,-1023130231,728625825,1953418758,-1202256365,-1142423551,-1442664312,109561739,123694578,1958742979,1347880464,-402652232,313559202,1605064874,1460060935,178256,-1333227032,-1437029884,113444703,62410839,-2004817920,1487537840,-1022926933,1858999947,1460017031,571472,-1333237272,-1437029880,1605091979,395035399,58053131,516097929,1859133070,1468783243,1976699650,38242807,126599967,-1073019095,113443189,62410839,-2010060800,1487539376,-1960388469,-1993997753,-1073020289,123728501,-2147440189,-1259862412,2147427832,-392515504,-1587806352,12152376,114438960,854086487,-1194849536,-202899449,-1441746809,1487651211,-1413313621,113444703,384324439,-1194849536,-672661497,-1441877881,1487651211,-1413313621,-1899821217,862883846,-337955841,87762444,-1977206924,2039284317,-1908524285,1374582126,-1907351978,915089088,-964493304,76162563,-1958739788,132552,-395407685,1465419665,-203911509,1579114404,-1010332839,-1000974586,-1955680746,728652862,1926245335,-1946973426,-1494001720,1192391775,-1947043510,-1141666872,1525182126,-1527556217,1852350815,1853234827,371971979,1600024156,1460060935,-1949791402,1857469427,-209241880,123690660,112835,1857422981,1472397685]},{"sector":7,"length":512,"data":[-1144485114,518549174,-205507705,-1017182294,-397191418,-938737851,-1157625672,115896006,-1413379193,-1031034024,1857462699,1851655723,-1022926933,1848116983,242483456,-402652232,313558754,1845141930,28879680,-2032867328,-391506768,-1612185592,-370182912,857604297,-1949158455,-1955680706,-1905397194,-1402023906,-13444982,1772617518,-2054783098,-1937340282,-1400466298,-1148799866,-779696506,-1383672186,-336557226,-672440614,-739555514,-2096970109,-873790777,-1996260215,-695532204,113673132,1006880643,-2085063445,-1276443961,-2096642429,-1410661689,-964477815,-2086343934,-947714362,146899714,-964453909,80184070,-351747709,46564238,-1994421781,-1986704882,731204630,-1989235138,-1013626818,-1949748450,-1902818250,-345059298,22842138,1143670667,8469763,-2109928833,-972718849,1091239748,184906891,534935030,1438894347,-326898549,116858380,16805416,-90093196,-133813395,98619757,-1631911924,-2048923538,-143785823,7219206,855799042,512469952,1200319970,-1365136626,-196703890,1851524651,1845010859,-1409923447,728627873,1080948742,-125924949,-1577433460,-1363438264,-2053117842,1252087558,1857993621,-1987734296,1183644798,-1962450946,-1955701738,-1905397194,-1402023906,-13444982,-1582825682,-1115179129,-1014513529,-477641081,-142085497,797446791,-1383571064,-336557226,-672440614,-1512772700,1017958891,872772843,-1425820671,-1381307984,126605451,36554539,-964449536,-1531647228,-1948742739,1221012231,80118698]},{"sector":8,"length":512,"data":[-964450837,-1952388350,-1950209081,-993817393,-1515848578,2122951589,-1896248324,-1413467197,-947157525,-812924373,2126824332,-1515870724,-58816085,-1014040181,-1414807501,-1375770391,1311492235,-1993902346,-947128762,-1980479957,1460073598,1039695556,124911744,-2146646906,-1429961046,-213270478,-125924950,921241439,116858879,16805416,1183516276,1855890424,-1017256565,-1904424216,644769798,276223,-1557741517,-2085093372,-2049644414,1852315275,728614561,1025471682,57806848,1343225784,-754667182,868781024,102665152,494987374,-805087142,-1008149781,1745260165,110044782,-1494745084,1105773436,42461186,-1593813016,44264902,10283118,-1593491480,-1064407594,-402285848,-1591343700,-1073020924,-694030219,203328365,281248622,690405518,637544990,184550561,703690176,695075358,-1586625506,-660378154,255754349,57999421,-1585227032,-1365021242,-1070349459,-1586642269,-1064407594,238979878,378217984,-1070399472,3056422,-1993995541,1157834245,147292930,-227149253,3318054,2794278,1876262,2925350,-1325396219,32035588,644727302,184550561,-1011124800,-1107295557,283639824,1228288,-1996485912,-2089958370,678949115,1842782659,-1960394610,1418405436,638380802,52829577,275907165,990431107,653293050,184550561,-1008896576,-385863240,1307084033,205422593,57999421,-402551576,-1070398934,1842742926,3056422,1849165454,3056422,862836385,650153673,3817091,1360294912,1841706751]}]],[[{"sector":1,"length":512,"data":[-402652737,1172832631,-972648702,641816941,184550561,198866368,869365193,-1790008384,-946511709,479549958,50587648,-1550496095,-1511494142,66250755,-2096885528,9789502,-2034756236,-2077693822,-1941884744,309722,1845894795,857467368,-1788959808,-1788737849,1688403972,1443284885,-1593828203,-1064407594,1841706751,82378547,748758529,104539648,74645550,3055910,-1987954456,-392866786,401081339,1048782341,1962934318,90105861,-337113877,98494470,-402196504,-806877630,65988614,-402322968,110036313,-1591317050,-1073020924,-303519627,1614709510,57933973,-1903969816,644732422,-1560268127,1048604102,1946172686,-1789877999,-1789782389,1846025867,-394938136,-617405034,1846025863,-2139783448,4001086,484967284,255754272,57999421,-1585350935,-1365021242,-694041747,650153581,1318539,-1591857685,-661754410,538251,-1929132413,210371199,-213843787,-1592888154,-1073020924,-1205869451,2129199240,-1993990269,652184327,1449531,-1591292811,-1073020924,-1581008011,-1064407594,283705139,113714688,48,303398,-361381877,378218179,-771030992,-1477942924,651725684,83892897,-266010609,198325247,638612735,1838731,637553640,1969803,1392526312,1534393576,-2105612282,-1938503960,-16054333,-1993992075,637547038,-402645855,-1993998288,637547550,-402645343,-1993998300,637548062,-402644831,-1993998312,-1962919906,-378674626,-1048349406,-253656305,-763117309,252035840,-754667264]},{"sector":2,"length":512,"data":[-1009253400,-1905404255,650130368,637549219,637549731,1207975587,238979878,378217984,82509844,113738667,-126485957,303398,-747257845,1852311182,205425446,1032529408,238945062,100607488,973537062,109888256,-1591306906,-1960443850,637537854,1054347,637543656,3933697,3711270,272534310,378217984,250085394,100738560,-2094661570,14910,-1547449227,-1070361240,552334899,4031270,-14281867,251602437,1448214586,283641431,1583286016,1963140698,147292932,-596248005,1435182787,-338296060,1745260141,210445973,41716518,-1788475762,-478029429,52826111,637539358,-1040775282,24387584,12711744,-148933504,1947205825,12711738,638350656,1195523,17155878,640215808,1064451,-1040772117,141901824,205390630,1032529408,238945062,1032005120,638088703,-14285313,-2097137146,-231012154,-1581019275,-1064407594,647319201,855648931,1049306816,-1960443890,-352317418,1032005136,638022911,52823433,-947715515,1979333384,512435948,-2094661572,11838,-1557777548,251985966,-754667264,130253800,-338492495,104579843,58103136,647323811,637537953,788011,-338569077,-1023153199,855646213,748889819,984320,-388823887,-1790048767,1042154278,-773598976,1511916003,-2095484267,-258647490,-1591340425,-1073020924,1709769588,-1790008833,-1016216925,-385848392,45842673,1097216,-1996483352,-1097507810,182976530,-1004631808,-251952275,-1581044105,-1064407594,641501990]},{"sector":3,"length":512,"data":[-352168821,1032005138,638153983,52829577,275907165,990431107,652899834,184550561,-1009289792,-385863240,110002337,-1960415688,637538366,312673675,1841602926,-1325396219,65590020,-1553071610,-1581027836,1927845210,1478396286,-1789091435,-1988204312,-1955720162,-1083300810,-118984922,-2105362411,-395368774,649729662,1906567279,-1586624349,252024154,-1039104,512479795,518614536,916530802,512435712,-1960443854,637537854,1054347,-1591340053,-1960443848,637547550,1064587,303467302,1711705088,-1788304491,-1788076407,-164373709,-1960433685,-49915,1856181364,1780386197,1448235925,367527511,1583286016,52845402,52822621,-947714955,1979333384,643154901,50621835,11004398,-1788344690,647081254,-1389980755,-1834146158,-1788475762,-410912373,52826111,637539390,-1040775794,578060288,1073791479,52825717,637538846,512427779,1223388674,270402342,117646848,1845632651,-1040762133,661995520,775848742,326369280,805356023,-1014297228,-338564143,537248515,638905088,794115,38208294,639601446,925187,637993766,2760331,-1788199228,-1040713213,242552832,536920567,369299317,-1037331090,-139769784,1948254401,1001100034,-385649419,-1017249966,3318054,-1789649269,238979878,378217984,317390864,3449126,1846812299,272534310,378217984,-164429806,-2094652437,376766269,102651734,38636326,-1908569306,-389837096,520557737,52846175,-947715467,1979333384,-1591295015]},{"sector":4,"length":512,"data":[-1960443850,637544990,933515,269912870,638774016,-1962919775,644743710,1064587,303467302,-1788304640,418117171,-12745946,1448217460,283641431,1583286016,1963140698,147292932,-462030277,227223235,72715046,1049351683,636196182,-1788344690,325414,639071264,50742411,83306177,41160704,109985856,-1951689384,-964449341,1978809096,1446939095,-1591295083,1755512886,870003605,1049306870,-1960443890,-352317418,1032005144,1376482559,-402237610,1594294288,52845150,-947714955,1979333384,-1960393756,1435182605,-1948908796,-1910313989,647325702,536872183,-1960438668,-1056766396,325414,1073902608,1409715776,-964449387,1978809096,-1008759846,1580662558,1681325973,1647771541,109971093,857707860,1070446847,-1413467221,-1420252328,-1426051423,-788513631,245476320,201730816,-773271296,-1420252184,855640249,-1951665216,-1207956426,-1381285939,-2085758837,225771515,925187,-75292789,50492671,-1413248040,1001046066,1962937910,520560346,3055910,-1788738047,-1788602749,1017193984,31510784,-2087362042,9790486,2793766,-1013621085,-1789651317,739150630,136219392,345500014,378257459,-1960405676,-1962922482,-378665442,-1070394210,-1789651317,1007586086,-1948135168,-378665442,1053037706,-617386478,-1591768794,-1993960098,-1788829435,38111526,244040332,512464220,1323855368,338880532,-1986703197,-1902816746,647321606,1735,1520523853,984469,-388823887,566054,1845626371]},{"sector":5,"length":512,"data":[-1789124981,-1324366973,65786628,634948547,78708767,-1557733165,-1014824958,-754601697,512304875,1520500740,1846677,-388896559,434982,93674657,78708751,100919507,512454146,-1014796758,-754667249,69075947,1612579694,-1579668587,-1023185364,-4717709,178464511,1848549632,57918211,654311352,-1593832285,-1557762556,715194382,279127662,113714688,1835032,302434086,-1912602624,644769798,802443,38112038,641567526,933379,-1912274138,647321606,637539491,1443527,-953810944,6662,-1950184448,-1953146354,-378664930,109974365,-13406568,1855340091,-1977209228,130515717,443876668,1859567191,-15629336,-395458506,1609039901,-939094272,109993837,-1977192808,1088696837,-856950781,1859566275,-1199850263,-692452096,299690094,-395389254,1956867350,-388461675,-771026196,-264428171,-1558153217,-1259825808,1914603897,-1950338155,1880001491,1948158869,1836902549,-1787552117,-1200803095,-1242890195,2023931955,-1787190635,-1567262046,2124584315,-1786797419,-946500446,-1500154362,1852350825,1358031080,-1556086771,223909244,-2136768512,-1896467563,999649798,1939173430,-1465113050,740324609,1008497280,-1978108126,654258904,1220936621,781550755,-1817602049,-1786497397,-1194005690,1290338351,-493624577,-493624685,-845946221,-493548141,-493580653,-476847469,-493598573,-493452141,848691859,2067693718,57933973,-2137891352,9797438,-1075313804,-20752238,647329798,1963211948,2015791696]},{"sector":6,"length":512,"data":[1015096981,209014595,41713958,74794308,-1787156856,1128038694,638350675,1157790849,-2012973753,647330342,1094990977,-2128212875,1096024700,646448245,-2128177794,1968391228,2088838668,1967604994,2116454404,65286805,-2076820496,-1013157227,-1787230466,-1951586746,-1968429360,982874406,1972730374,2066122770,-1144878187,-1360499026,1913032312,974187413,1972731398,2133231626,1477837205,1175024238,-2076820666,-1010732395,-385863240,-1406730649,1702215690,104508454,1567987067,637718760,1347815085,1946344424,94431265,1362907509,-1960424075,2106271285,93201922,54296614,-1108853387,89712642,2145911787,1009808645,640447827,1946682870,2106271270,1879477761,1853268334,1074104102,643306869,1577207177,909854215,-1535994492,3389635,-1191315735,1049296947,110007686,-1595304590,39839865,1843942918,-399281150,544539767,477450556,641043238,637697419,-2144991858,208995132,-402501656,74777834,1534350140,-1962920776,-1902803394,-376081914,-1981253277,-396528896,-394984385,1064588092,-529182148,268826150,-1960440460,-1960443043,-1910111875,653126407,52692362,1015021753,-1190693888,20758528,1460058741,-1024933748,185032687,1569400513,1435182595,638970625,1963066870,-1940453729,-274208576,-1960442017,-768409251,-1787412853,1873215361,92871284,-1996333687,109249621,1577489782,909854215,57906564,-1006682391,-385862216,1048640799,1963356022,1093975578,2009007902,-1176597649,-1494024186,2005732212]},{"sector":7,"length":512,"data":[2097053960,-102009535,-796152381,-1946157128,113689560,637572492,2064005804,639792533,-1786600531,1851539083,244054019,-836004476,109970974,-216043856,520560292,-1785985338,113689345,637572492,2064005804,638875029,-1786600531,1851539083,132708355,-2076820736,-1007193451,1448127782,-1072976602,-397407628,1213792242,317454453,-930436058,102690098,1857029774,514126623,-695525625,1967675486,-1007514667,-1785971072,645100544,618695340,1020408828,-1172999036,-1002696704,12193396,1959279648,805353991,1383451708,-14308314,-2113535229,653822869,-154629460,1047890369,1967178230,179054087,1174501824,-466441178,108642314,-527794396,-661935066,-1040793549,637695236,52320173,-1905370050,57585694,-1839259899,989859304,1922401334,951632782,-68032256,1963114998,2065578528,185234837,-1953137658,-345082338,2132687401,189429141,-1953136634,-345078242,-1948004071,65262027,-1601762343,-1533607063,-1566602391,-49815,1398217332,571472,-395395397,-1420266039,-1031034024,-1901373269,-1013616122,1547567902,-1340174738,521505134,3717315,-1980004631,647333430,-2009691732,65286805,-1976137232,106414997,-919348429,-1786112373,-1786233205,-1787689330,494205499,1191545382,359940156,108159292,41384508,-2008866772,-26249593,-339213624,-2000092449,-2005961186,-1989262322,999655486,-1017182214,-523122549,-402652667,-1047825091,-1411329720,-1410088909,7071939,-385874968,-397409432,1968702050,309254]},{"sector":8,"length":512,"data":[1349957097,1870007946,88146101,-1056767997,-394982168,512360481,589721156,39357724,638028582,-544522359,-1430244437,-210798914,-212379228,-1899798614,-1955698682,191757366,-1961986570,191757878,638285302,669323,1955276483,-1960393980,-2134702732,24001086,-1195179659,1659437058,1870052982,-2010805722,843466532,92939995,108159292,41384508,76029996,-922859961,-855713790,-620566667,1849958024,977174723,997523822,1847723766,1446737216,16377943,1497116277,-1377298315,-401494014,-1561853307,93202175,171871014,28436480,983700085,1243515246,1178503534,1208388718,-1017225362,-385875016,1465284077,1946273000,12183586,-694084236,650153581,2506379,1946255080,77669902,1975520000,243948,-394935063,1497104495,-2098720139,642872576,2506379,1963023080,5892324,594891068,641043238,637697419,-2144991858,812974908,1962958056,16050219,501793653,1968389122,1007348511,639202643,1964115446,4188179,-1960440203,417858941,-392006399,-471138281,-1953132383,-1989287394,32434183,-1567256672,1583312442,-1785748797,1850351241,1850097289,1850214028,1851137675,-1785717111,-2147365911,292436542,-1041758603,-21239551,-264860733,-1005589651,-2081945484,-1956088832,-1955705802,914951284,-167023028,110029173,915107432,518745600,56396326,1888288951,1139299844,1031036416,1852311182,268760614,-1960441739,-167050380,-1960386955,637536310,-1224516470,74484992,637832742,671371]}]],[[{"sector":1,"length":512,"data":[7465046,-1911655330,644769798,184972427,1323070966,-1007275069,92048166,5630038,638088286,1963984118,-1007285501,57969446,1850619529,1850738316,75270950,3532886,639136862,1963146368,1552623122,1960512266,1955276297,126756360,-1018437909,1852311182,1845245579,-931793397,1845376651,-1468664309,171871014,1142852096,488842862,39422758,477420299,-1972406600,-1234209258,2139963904,-1947170045,1957098442,529212937,-294266101,-1977171125,-1144847801,-694063242,-1239971219,-1064418816,138316582,63406848,-208942453,175417075,303398,-428490741,1504756552,136219430,-1976646912,1139618319,840403502,983581686,121253486,-637336204,-1018562590,1013856928,1007121412,839087107,1592509376,973486736,-1023314834,26236139,505630466,606414628,842414386,792282167,341067593,307630933,240651607,442107737,257627738,291311708,912201566,982862712,1970158086,-1877218557,-1181025349,-1959919592,1958885911,-498908410,-1979336971,-370920762,1397781357,1465274961,570881542,125124718,1843543691,-395993624,914948771,76246614,578076682,645017660,360069436,477249852,141974076,309485884,846690876,-352293400,11528218,11539947,439095787,556534316,-13444982,-13706493,-1566850921,1049325114,898199010,1594343475,1532582494,95994712,1929111808,-1682269254,-1669751659,-1682269254,-1658479467,-1657430735,-1656906439,-1656382143,-1654809256,-1653760663,-1652187776,-1651401798,-1682268779]},{"sector":2,"length":512,"data":[-1650614887,-1682269192,862942911,1006930633,1008955952,1007580729,604664927,1916878047,2002402325,-109033967,1206023231,92848638,-402470658,243849195,-318607498,1849962120,245963967,753423879,41180926,-1950154320,126567390,74592316,-176801476,1007146984,1007580229,-2145225426,494153468,1948908672,1874246424,1913355496,10401798,-1996444951,-1200728522,1122566150,175761522,-1230828174,-1206482577,15120495,-1996452119,-1200728522,652804103,8435826,-1995962648,1131394590,76204339,578103100,168069702,1007776960,1174893863,658244746,126412917,-387235517,1851143817,-385873736,1581019633,-1975118987,122873860,-395001846,-2009058234,-348044537,1965243585,1364411924,1493830376,-1980992677,-1200728522,-1024917497,-434206351,-1239512211,-1206941585,1967718534,21465616,-1550195662,378105782,381185976,1843045121,-1553057631,45116892,-2146586429,58011388,1178996656,1175367875,1174778051,1174646979,1175630019,1174712515,-2145931069,158609148,-58715728,-1341950679,-1018804720,1181629600,-2146193213,58015228,1178998448,1175761091,-2146914109,158613244,-58717520,-1341950659,-1018804724,1181630112,-2146848573,58015228,1178995632,1176023235,1175433411,1175498947,1175826627,977174723,393549166,1049319254,898330082,-18749362,-1955710302,-1989287362,-1017225419,-402648391,58001840,-1107289927,1386299772,66620270,-2017444415,1386423159,-217637266,-902394972,68479085,1946172544,59172879]},{"sector":3,"length":512,"data":[1859534464,-401837056,-370474467,8370371,-1200572183,-1293352830,-499217552,-1405777043,510967818,-143253444,570881614,712327278,2067530891,675087988,1176466730,1828934,116841963,1967156770,74246160,1049350517,898199010,-351960600,-1564258624,1015059854,-385649628,-398065107,1014104797,1485277998,1958742946,634424110,1015054335,151418155,-345102330,758939659,-789112459,1848116769,-2147425663,1848120867,-2142892427,-965465028,771879145,-1568626689,-385871432,-1108840419,24373250,-1962812183,-2089950658,37053,-396947596,-51904051,74735361,9473535,8435907,-1955597079,-2089950658,37053,-1912666252,-1427570544,8435713,-395322135,-1628962110,-499217663,-1992980115,-1200728522,-692453375,99149934,-692452432,95938670,50378832,-395389254,-1168636458,937979606,77260804,1843543691,-389859957,1021837888,1592283137,1049319425,-2046857758,-1073020784,-396948619,1952383359,-1869742332,501793536,18475010,-638856969,-402476568,544342505,1485277998,1958742946,2147427607,1848120971,1948990592,758939655,-755562891,-1309949405,-385931799,79168046,1859566080,-1341824536,1859566085,87025750,16247134,1912759272,1976699700,67124528,-264426638,-1557760001,837316138,1025405442,427270144,-395432797,292684324,1848378939,4000626,-1559857248,-1091998162,-19863296,1849704064,-165184256,40772102,-2048383372,-692365823,-88414098,-148496267,33564678,639464448,3016391]},{"sector":4,"length":512,"data":[-379650049,297271437,1858070784,-385839688,62418617,1857284352,-385838920,1307078317,2942977,-393187861,-1073020861,-1101653131,210398934,-1589514958,-125079982,-1069694717,-1559791737,-1527550382,2142815070,1853614336,184556264,1444246720,850196363,-1947204636,728650254,-1985678386,1584288318,1049319107,119434836,1044103219,359951954,-315486838,-1101573823,-1493995818,74733919,-420742909,-2134679992,2073398846,179048821,1006990528,-1007192707,1963069928,840231921,-1394570524,108314634,1965697341,-68631564,-1192463103,115933194,852636270,168070134,1007973568,169702439,1007252982,1025143931,343157288,1390865222,1510068712,-2118591115,1843128576,-320088330,-1901967802,607944853,1380331893,1509967080,-1014355598,1006698681,1955631114,33536288,-1869607876,28907380,-1877853184,1007580304,1955631124,-1877591032,855798928,-397258295,1499135837,74771722,74764810,-2081697534,-1983657718,-395422154,314507320,856100514,227157723,283372850,-692169151,1587999598,-117241996,-370457789,-1679244295,1446414592,977006,1859534464,-1023314944,-385875272,-617386683,1597768842,-551286156,460472636,393697852,-2021113018,-75272490,-1978895297,1915763716,1983462406,-1998853141,-1016146402,-1996466712,862869046,1006930651,1008563744,1008301098,1008039037,1007055457,738359162,-695760864,-2092743058,-579514373,1859553222,434684672,85357056,-763166705,-1190235648,-355401724,-85796655,24433163]},{"sector":5,"length":512,"data":[132695033,1446414592,83487086,-1073085302,540807028,742131830,993789044,-347733131,1090634731,1140933121,1178944518,21319241,1279591493,1157973331,1179206734,1224820225,1145456901,1225147973,1162104390,1179190598,22302799,21823820,21954894,89325906,1162104405,5636422,4231168,33024,33792,2097152,1,0,33280,-2013233024,262146,1048576,-1634165096,-1633771880,-1633182056,-1634165049,-1625579809,-1622630594,-1618174093,-1614242152,-1634165096,-1634164722,1843535499,-1727248501,285492993,-2135357865,-1949158656,-1922176970,119410815,1844059787,745861947,540820140,-492170638,1189629939,1049186048,196636246,1809312000,-529265348,863242812,-663437302,-562750916,669731406,-1497869743,-1176859543,-936677978,1843535499,-401973365,1499094434,-1956010306,-1982331938,191752734,850228672,512469696,1468624354,1959922444,38272781,1842087555,-837385471,914948205,2005757416,1446414608,-1009644690,1846165120,-1957464832,-2123505090,1955053823,-487620273,239438080,-1913484457,-402615619,-396427033,1166630066,-1836741366,138774784,-1995422323,1851171589,1166655539,71665922,-1996077687,1166543941,-1870296816,1843962624,-1989285213,-378674626,1991794004,1796466944,-385873480,1049324301,1569418722,1556867082,-1911661173,644782086,637749129,-1023060087,1846165120,-1957989120,997057086,1953358910,-1866628287,1081409536,-1956834328,-2065167779,-490241700,-499218176]},{"sector":6,"length":512,"data":[-16809619,-1960676204,1851171589,-1962654325,1157826133,13796108,-401973877,-1070375795,-1553078109,-571904534,179880796,1788602624,-385842760,1631349397,2050754162,539755127,256195,-2030040600,520494839,119456519,-930436436,-1527517902,-1316669,-352320280,-1408819482,1975519914,-622279686,321791,119461355,852003500,849671149,-1396462912,1193642534,-868562806,-863370634,82046258,41264883,-775699398,1940255721,-37510143,-117182205,-372158642,1319371123,-56233137,-434205757,1036190573,125203392,-1061436629,-1547500689,1354984934,179106443,-1946454592,-1949684786,460225,-395405637,1465411657,-1413467222,-1974883413,-225727807,-1017600781,-2115204267,1442882284,1451820631,516983806,1959922183,-25785538,179100467,1007449280,1022719068,-1946979026,200272862,-167283493,527728834,-24382581,-1439780785,-2143185730,-889319454,179046260,-335841856,178957557,-1963297344,266567902,-768408203,-1224691479,-1948004096,-2143180105,-294387652,1971373814,-27882671,593175272,-562741054,1946172544,1589546457,852636671,-1394570524,141869066,91503420,-236240214,989626446,-58717836,-1341885348,1447209564,-1392609653,1975519914,-1923981574,-385917290,-1037870369,-1133225408,-1098041109,-768344226,-527768526,1958742700,-347952636,989626613,-58717836,-1341885348,-1958565284,-25785377,-1073042772,977013876,1547437172,-74714507,-1232212245,2123104094,5224958,1958742700,-119363069,-1951743950]},{"sector":7,"length":512,"data":[1583286210,-1017256565,567099828,-919354372,45666867,-64893630,-919383982,12112435,-64893630,1371757144,-1030879657,-638060149,856678787,128644032,-1048356513,-253656305,-1910631965,-1261401126,-64893632,990212639,-1023314495,-385871688,-1910609807,-1150440418,2139095045,91553560,567099060,-75283460,535786772,-1957210429,-134575120,-1957539615,-1947994170,-137917480,1523092449,64160600,-1017225263,-1957341354,1961561065,-1663366302,-772339079,-1048325129,13861633,2040320523,-137300214,67026,-1962880381,872123377,-1109707831,-774832095,-835988527,74702619,-552350205,-774843915,-361411118,-149980771,-2083260463,-746389055,91856128,2040335851,-137300214,67026,1560334979,-1195155873,-957808578,607944807,-347732875,-1070362561,-561262029,-315487094,-2143622784,645073601,-268385545,-783211403,1389548000,-773795504,-773795374,-1056745006,1506874201,-763117309,1174894592,-214184213,-1007091337,-768360397,210427531,1919023488,552173571,-2143622784,192023233,-2145916544,343082689,-1257586304,-773795580,-32673070,183924173,-756332863,24638267,-472136711,1406874451,1071242379,1258296507,-2124677771,-2129707037,1526939643,508757699,1011949139,1007645696,1007842305,-1709870078,480314435,614077419,-350445310,37657100,99294369,-1593681766,123468828,621299595,-12746753,-1023314817,-385839944,503736041,-1705959853,487194633,-2147219460,113475644,508960339,760403,1543249263]},{"sector":8,"length":512,"data":[-1947204857,-14350265,-523157377,1381172931,1394529419,508698192,825942,1526472065,113444699,41418579,1394489343,1107388826,123468829,-1073084733,508762996,-1469794221,1207324686,125075465,-1593688422,-1710888164,480313892,1394496347,1107363738,-1990460387,39291143,175366865,108380683,-385856328,-1022925223,0,-2147483648,1392918526,1394496286,1577059994,123468829,508757699,-1705828781,492699722,-1962451972,38216455,1074022179,-1195179660,518586444,1946303590,508757540,1012080211,1007383552,-1710328828,490864640,194645227,-350409216,7903749,1543249198,37536519,1392922996,1394496286,594804796,796132412,1107328666,123468829,-788117621,187986912,38210311,1963214603,5027882,-1704606487,487653477,-1962451972,-2135293369,-1710298241,487653680,-1962451972,-256244153,1002578815,-1009355582,-1425276898,-1434080559,-1425692042,-1432966489,-1436898641,-1434670484,-1442403618,-1427330330,43589,1095763515,1145391939,121438208,1196380752,5062994,1225666304,1162629197,1414415693,1330205761,849957710,1414416649,1095127621,17731,1314194503,21577,1313409331,1381123412,5525589,1091050240,1280267074,4543573,1158162432,1380275288,4997454,1174874880,1096241743,-1452129198,1398080585,-1449962683,1095501108,4998466,1191456000,5198927,1225142528,1313426510,581548869,1397048330,1129665108,-1303228588,1124802985,1414745679,1413698898,21071,1230374731]}]],[[{"sector":1,"length":512,"data":[1096111186,950618188,1245859590,-1017887931,1392722089,-1448455099,1229325353,-1446165172,1313407536,55443456,5394264,1392722432,-1451601336,1213399873,889192524,1146047747,52668906,810961220,1308833450,-1449178039,1330512695,973078612,928141058,1090722986,-1452981170,1230439501,-1437448108,1094911007,-1443543725,1414727235,1196312914,104770047,1329808722,17490,1179583033,85830171,1095914049,547962457,1313817349,-1438755757,1498678341,-1441512112,1096155978,631901778,1464812550,-1655745458,1157899946,-2025499828,1426409641,1279874126,104835547,1162888530,-1436396479,1329857060,88910370,1279871063,1185595973,-934325246,1174612650,-1430760881,1213465668,-1440133563,1179189806,137144974,1129207110,1313818964,154970699,1129271888,1381319749,665507653,1145980163,85895928,1229407554,222199886,24444989,2144963,-2097125400,1049168071,109876626,378115476,1726518678,-1785552639,-1325396219,32035588,-395459066,-2051538523,1662314626,971559475,-1740732160,-1710846827,149586837,-1784932727,-2147348504,37555518,-488107918,222199810,57803581,-402446616,-1024981992,81455108,-1587349016,-962357868,512476013,-1014075962,728615073,722826947,-1173260606,-12714000,-1324977393,-1948200188,-1006685232,-385875528,1379689225,-1030992523,-1977251290,1007625412,-163809535,242487492,57510694,25004838,4623910,20767467,-1960441996,-352316882,780871173,52822032,-1960443027,-12779450]},{"sector":2,"length":512,"data":[638350591,-1912519421,35032002,-1909527698,642837442,37488010,-1960425100,637537326,637627651,933515,8258342,1023773478,796196863,38142758,706120486,-1841394944,-1774306411,-1207537003,2129199105,-1899656094,-1416260602,-1951677813,-980702266,-1841395285,-1010463083,203328294,1066083840,1979711363,-1960393983,-1960443321,637537822,-1960443645,-1962923498,999658046,1922405950,112646,-1939719959,-1811509563,-1031033963,1353496747,-1411871573,-1785577847,1438893454,1842749067,-1343700082,512435967,-1960443894,1105842447,-1960426685,1962281783,642139685,-1958345590,344598270,-100403662,1917992007,2001943559,-18946045,637791875,-167037813,-790439051,69110566,1977289472,516119991,-1785577787,989857982,-2096728841,48761071,1438850816,1465314443,-544484813,-763109885,-773140224,-119307301,1468729227,39074050,74582903,91423801,-351746429,39139824,74910578,91620665,-351735933,2012691440,309528,495393931,-964486007,46629634,-276565278,1995914000,-25282108,1988561267,-6297346,972977803,108461174,-386105717,-443809903,-890715299,-1157161470,1072189440,46131202,-1593656088,-1064407594,708741926,244000256,-1960443860,-2097149922,800719811,1189611088,-1591343360,-1073020924,119463029,1845640843,1841565323,-1957677893,2877651,1845771915,1848249995,-1957676613,1829075,91105953,78708751,100919507,-125080060,1069271347,-388789424,-1329397759,39512096,-488061045]},{"sector":3,"length":512,"data":[508757505,1346681607,855753192,-1962679333,-1014281255,-388896559,-388896559,-1024932093,-389838079,1220215327,27322448,-1293368949,1347205889,1526830568,260711943,-1947669198,-400510975,-377290224,-150375662,-400510759,-102628860,-628422882,-402558488,-389873167,119407085,-397389893,-488111774,-1811509759,573077,-1342056216,31123488,-796152538,1592306982,-398807039,-1031077428,-1191095064,548405255,-503201816,-1951586567,112010968,669565070,909838081,-932014702,1842782659,-4603762,378218239,-1960443880,-352317890,1972053565,-97530,-234671756,-2095215834,661979131,38046502,91537723,770230411,642928896,-485995381,1543710224,1418405380,180781830,-503290904,-2091296005,992348359,1962938430,77670076,1975520000,1055441827,20703233,503730515,1349696263,117485032,136219430,63144704,-1342135832,19327016,52843355,-2097146338,-1880619069,119408128,-397376325,637993094,532107,-402406525,-85458822,861624576,-1977170963,-1073068540,-1073084552,-342345100,-1971379192,76162784,-318025658,-689437835,1388481280,-402651462,-1336278904,13559840,2793766,-1342155544,12773434,1256768395,-444381952,-670869501,-1427586238,11003904,-1883568354,1894480,1842742926,205425446,915088896,52822030,76228149,38077222,-1023403800,-1977200301,-339146225,-1977203959,8054791,-176829954,113466201,1381061463,-1185943365,-796195836,-1785184572,-1031093549,-1428746460,-193606146]},{"sector":4,"length":512,"data":[-1785184631,1599822170,1364443911,-661957038,-1107294791,473649126,-964491917,737665538,-2029291823,-400510774,-102629332,800115335,472629502,470022771,-402471293,-287178728,1532582494,-256158781,-686873521,-1341658277,190477,1460013744,-1785184572,-1740731990,-1673643115,1929863061,1397801729,244011601,333682072,-1785198905,378208256,-1070361190,1845894795,1526053352,-1017619623,1841706751,-400509208,1994916445,260171779,-1895470360,-1016216058,1458342741,63408983,-1519162,-1953029098,-16731938,1956063254,-202684925,28368779,-1758980353,-347143308,2012691443,639041290,995051159,970487543,158596734,-385976697,1988886462,-59360770,2123040374,-5183236,-1017256565,-1189193898,-503906295,-257822581,-1898410347,-201378880,1583292324,-1185458493,-963969015,-259268105,-503855221,-1910572917,-392826850,1579090198,1008634719,512630423,1465292578,-422448341,-405669077,92734603,1599997065,50381599,33751297,1444807427,-164409257,-1962931783,-1948125245,-266432776,-1073063787,-142146955,-1968096581,119801925,-527771858,604521610,987180551,1999532740,1962949680,105155348,1913013563,-1960675552,1161495620,-350850556,1963015192,71600906,2130986299,-1962218744,-351978748,-352210936,167817218,526278592,509040323,-150991687,-1578071071,-661744054,-13385586,1595909363,1465303902,-1962931015,-1948125242,-137917456,519605217,-1773527410,520114664,512450398,508270354,-1759764850,-215263402]},{"sector":5,"length":512,"data":[-422451503,-405669077,76277713,76088711,-1021354146,1347900958,213513779,-138179840,-1896313887,1486244382,41271306,1150023559,138754824,41025968,-1073086288,-1021354401,92669066,1195771016,-1262225694,-64893630,-1195179662,1927872528,-971076772,-1581019539,-1020564024,-1037363850,-256241290,268385791,78710387,-796139309,-1195114701,1256783873,252006748,13796096,-788527943,-489106966,-971600902,-938570899,1003105133,17201089,1500366342,112835,1398546665,-1962518703,-1950183720,-425525,-1190955505,-783216641,-773729823,868234209,1504441343,-1056718708,-651444082,1594350967,-1950131367,-1992293308,-503902132,-1729624206,240421375,8108227,-1101276951,163157474,-2103296,-1181350210,-689438714,-1776763137,-402651975,1019150285,833942,-1090534168,146380384,-4462592,-1181317954,-1293418491,-1768505601,-402650183,-1463877719,178582,-1090543384,79271610,-6821888,-1181299522,-1897398264,-1774149121,571712,-1787633161,-1979767064,-1583932394,378246914,146380548,-2112976640,-2084502634,216531154,-13375233,-1769990519,-946412895,26668550,-768393216,-1979779352,-1583944682,113743604,104192,-388877504,378142435,1319212798,-1779129450,-1198118237,77791248,-167327850,-788528491,-388877344,378142403,213423618,-1774542080,-1775499577,-523173886,-1394027981,941001214,1095830,-946446685,43405318,870371584,-23729966,-1772349815,1692979763,570854654,-1981099625,-1902691818]},{"sector":6,"length":512,"data":[-1080655866,-1279393784,8436048,-1329355277,136219393,868823918,-30414638,-1986670941,-1953116138,-2082960438,-779931453,-1774288128,108265622,-2096053373,512295121,243897832,-492726806,-232327275,332923797,-98661942,-66156139,-1779129963,-1778112777,-904669181,-1777590647,-1777463671,-141162847,60167718,-1983245352,-1986650594,-1583996914,653760024,-670853592,512346643,243897904,715232818,975632278,332923798,1109297610,1141803414,-1774411370,-1773394185,-904669181,-1772872055,-1772745079,-141144415,60186150,-1983245352,-1986632162,-1583978482,653760096,-670853520,512346643,243897976,503551610,236164866,512333572,243897994,-2069784948,-1809385578,332923798,-1675720246,-1643214442,-1768513130,-1767495945,-904669181,-1766973815,-1766846839,-141121375,60209190,-1983245352,-1986609122,-1583955442,653760186,-670853430,512346643,243898066,-861825324,-601426026,332923798,-165770806,-133265002,-1762614890,-1761597705,-904669181,-1763434871,-1763307895,-16729661,125293067,2013200445,1355320066,-1949988014,-255006505,-1054123942,-788473213,-773205527,65655273,197823481,-1009617464,1224887435,-1336858762,136219392,139234158,-402238325,-1957036887,-503902140,285623297,-1957361580,2089488492,-5904370,-490814627,-3348331,-392825666,113180614,-4134762,-392816450,717160378,-4921194,-392807234,1321140142,-5707626,-392798018,-2067857502,-6494058,-392774978,-859897962,-7280490,-392761154]},{"sector":7,"length":512,"data":[-557908086,-8066922,-1962889021,-1955723234,-1953116146,-392835562,1048837169,1946195606,-871971066,-1191178091,-628359120,-392847688,1048834062,1946195606,1095947,-759637364,-268638059,-1325435928,136219392,2047773550,2014743446,-67901290,-1953037663,1435960342,-1962932035,-392789954,-1767768333,-1734131562,-1768505706,-1577118232,-1556048216,-1463904598,-16193386,1448199005,-964485545,653079043,-1958343542,1100406846,-1763701247,-1763176959,-1763043709,168230656,-1912190569,529984518,-1070422797,520560298,-1017553313,1614118,436615974,643265536,1457803,-1977202197,1946369029,1963211780,-1777819342,-1776933129,178385035,512630423,76125716,54889254,637682825,-1996143221,-1960901564,80118775,-31768,-6942714,848693254,1300899565,-947699449,653853447,1588795,1388556402,-1771921066,-1771034889,581038219,512630422,1143707246,105154820,1778843423,1644625814,-1017487722,1654740562,1881601942,-1578071146,378246690,-1910598146,-1986630114,344523844,1166747167,651725570,1443331,1465274707,-947652469,653079047,-1958277750,-1953017290,-1953017826,513204246,-1762910578,-1494001839,309614943,1928477507,-337956092,-8617970,1189704704,1015085035,535393536,-164376013,494197515,135674690,855929494,-2095911982,-1910634810,999691294,-394977508,-1756097021,1499357002,512630363,1418303086,1516117762,1381061571,-1776639658,-1775753481,-768354165,139299622,-1960426781,1963140660,1837835780]},{"sector":8,"length":512,"data":[180847366,639536670,92939926,2025851463,149657603,-527794396,1191545382,1946157117,-1993373429,-2092825993,-268237629,534438469,-1776151039,-1776675327,1532582494,915089091,-1960443890,-1157623786,-230948865,-1960433037,-8190340,52196607,1015228153,638874879,1946311995,-294133,-1293417612,-19601154,-2080411928,-756348730,1962933123,-23074557,-1771396669,-1772210549,1545506334,205818262,-1777295073,-1778108789,35556894,138709398,-1760911073,-1583918941,1386452704,-1777294953,-392735581,-1960378874,637540366,1707579,2028471156,512435967,-1960443862,184561166,637892041,2887307,1543933446,1581157270,-1778474602,-1413248085,-1951678413,244034497,237737534,165910288,60182177,-342422522,-22986492,-1047811179,1645120427,82004374,65750855,-1951678413,1049340865,-947677692,33984002,-1274892138,244034308,378246936,-903112938,48480307,-1951677813,244034497,-481716728,-347650300,-1413467389,-1951678069,513170998,-1772347762,-1961997173,-1424028604,128696715,205425446,868233984,361440969,1962932867,512435734,-637337586,638028582,50484619,1334519490,113912578,-661925493,-1774567797,-1774713202,-1760162165,-1760293333,65257523,-1416162143,1202438539,-18361,-1413248085,128696971,-326412861,1443032195,-1758027433,654198409,-372174965,378218049,1128464422,188189478,-1960282890,63407102,-1977162702,1207436037,-1756875205,1048579702,1946261318,1995586308,270002179,187992870]}]],[[{"sector":1,"length":512,"data":[-489130506,-1780178483,-1757673941,-1712782473,973486848,-1207535977,-1360461701,868780884,-13433152,-1759377778,1988865011,906923006,-473027689,-963948254,-150992711,519605217,-1759764850,520373643,-1759902165,-125050671,1185662603,-941694375,26682886,671532977,-944684393,-392748026,1010207664,-465663081,803753877,470191862,439782295,-1948349545,731245582,-1960647730,-772068354,512630503,93034274,1958742815,573197,-125048841,-1962621053,-498684986,1583286238,-1017256565,1431393879,654216019,638670219,-401652341,-259322957,-2145481186,572310,-661920777,212929139,-645078317,-628174589,1334511498,534378243,1006633661,-1122798333,-1293418493,-2084009110,-165280575,41156869,106643777,-1779431794,-1080695647,-403242999,-1014237045,-1413051477,866894219,-980702272,117376938,117413348,1499305452,868441950,-1756847168,88357158,958806644,880022340,-967354797,26692102,323783462,91523878,-2093743322,914949318,-24406200,839108483,92940004,-397936637,-141881683,-502675837,1532911589,243992259,-481716764,-268005825,638869,-1779681653,-1780206037,1569400390,109970946,146314880,-1947994368,1359770584,-489485135,-788282996,643416718,1965899648,2005476868,-947714292,-773700087,1048822535,1963038518,1185006337,-1760648298,-1550434655,28874514,906377984,-385650025,-1185939257,-503906296,-1910581109,-1953031138,2005598847,1465261830,204901158,1963140608,1049306625,52822030]},{"sector":2,"length":512,"data":[-1910614212,-1953031138,1200292943,522160898,-1583922013,653760062,-125069748,-1936331615,1243516634,-1996125802,1300825181,-1960420602,1141057031,138774786,38767398,38546214,-165258402,41158660,1300875571,-2454006,-392827850,113704661,-1593796790,1017353700,-1779654249,194452131,-402426661,-1070334398,89951014,225762059,60180129,-1550430714,887658306,-324969987,515976085,-1773527410,520242569,-1774319873,-1773795585,820592728,236358655,1175358359,1319192982,63439766,1993423824,11004163,-1555512693,-1031039170,-1760426453,110575779,725701201,-1077769270,109969412,1202427676,-85835705,-1759115577,113750470,-1308322008,-1759246649,915124653,1049335570,-397437378,1499132842,-1759770994,79610507,2009152256,1015752213,-1757528533,-405674031,-1425881213,1074054787,-1031018517,103536779,653760320,-125069748,-1912289405,-1953084922,-886357551,990219046,991589059,722892738,-778617338,-1948200480,512630512,1149998876,-1993990398,214401797,-955786526,26686982,1141294848,-1023410025,-141148511,-1953084378,651310072,184835211,-1957530405,63341555,-1977160398,1190200076,41714470,115635200,1459915558,-1912601921,-1953030650,-225030642,1341116847,-1906325621,-1416214010,-1951678413,-21451838,-1070355457,-1962431573,60182038,-6928874,-6930938,-342473210,977177510,512630422,1435080248,-1950146812,-476670450,109971016,197105316,1166681600,1962949642,-1960421582,15621,-1912200076]},{"sector":3,"length":512,"data":[-1147750906,-470351870,-1960380277,768773,-125049865,2105550343,41222154,-1977165589,643762757,-2096478840,-1042150457,244040455,-108816746,-385649408,-1912209221,-1080646650,46006283,1032005120,641496064,-1912207989,-1164541946,-487129080,1946221187,268483343,-138245296,63147235,1489211096,-1960388469,109969735,-1993959754,46564100,-6903135,127314438,637896998,101074315,-1769994610,-150992710,16417762,12259188,-1031057392,-1014176777,-1014048765,651725656,117524363,105220390,-502544509,179852,-1767240053,103932745,-1766455666,117738278,1358957503,-1768550773,105199910,-947714700,-1577721333,-1054108010,109971008,-1993959754,-2091317500,-807271738,915129095,178361860,512630423,76125698,915088927,2045247496,-1778474505,-2087239005,-315489338,51153446,1273513713,-1773755906,-1583936349,279156286,-1779654249,-1550379869,-459172070,-1757633643,1252180019,-1758813545,-963163997,26691078,169773862,772196096,-1593835369,816027296,-94771049,-1768538493,103969792,-1765276018,-150993736,-1953055706,775848920,141820055,647442593,99288969,509734,-1758551808,38242598,-1765538049,-1766062337,-1779654393,-1550379357,-459172070,-1757633643,-1757018426,512435712,113704998,38702,169753382,-1593216000,816027296,-101586793,-1768538493,104690688,-1764096370,-150992712,-1953051098,650130392,-1993996407,1048773191,1946195758,-1758420727,71797030,-953809173,1095,647442081]},{"sector":4,"length":512,"data":[-16365687,-6892026,127323654,-1550455647,117348120,-1578592470,-78255877,112835,-1550455645,279156222,-1776114794,-1550432605,2091095658,-1769036906,-1550409565,-995912014,-1764318314,-1550391133,-89942262,1260816534,1141294999,-2013265769,-1953026778,-1905404386,112835,-1550371165,446928356,-1777818730,-1550434653,-2036099486,-1768381546,-1550407005,-828139844,-1763662954,647426723,540299,637781891,-134019702,876513607,-27858793,-532760,647364102,269963,125098763,-184096685,-391582885,585694580,-1090052355,-71789154,1048816466,1946195606,34191365,146277355,-392058110,-367621226,77206,-1426007421,-1582579061,-1421306102,-1953037663,-1181285354,-235470840,-1769692757,-1780309589,-1589164117,1202427470,1007027015,413248406,111258518,1319218070,1621207958,-1070355562,1048619947,1946261319,-1431590139,-1582626581,-1330942462,-1582585342,-2085906704,9868862,-1085859980,-1767795246,-1465799786,-947672170,-1766153980,-1764974165,171754411,-58710923,-1341885184,-2142049522,74777340,1240142000,1963261056,-351293436,117211200,363869557,205273067,-58708619,-1341885183,-2144670974,74777340,569051312,1963326592,-352014332,117211160,179307637,-58716181,-1341885171,1392962310,-682502725,-1008455077,141934603,74830347,-1023409736,-1960387961,1004177183,1953380374,178841605,509022323,-628164469,1703544202,-396419327,650379120,637949323,-402373237,-259324801,173378342,138775334]},{"sector":5,"length":512,"data":[503608040,-1979949371,1200162423,1166747144,55019778,-987839713,-1960379298,1200161349,1200113667,516103941,108888870,855930112,-1962677258,1590030966,1166747388,55019778,520517513,654311355,-2096728693,57999614,-1962888727,63407102,-1977162702,1207436037,641007398,1392671872,637930357,-695532401,-351582835,1435182600,1166747143,66447365,-1996189914,-2144929210,1951597180,1166747181,-294143,-1019534220,1344151671,-1896593781,-1147760098,-470351867,130472075,1200183360,55035649,-14745600,642839622,1392671872,-1960442251,82512205,55413542,513215137,-196703408,-1768808818,-150993477,-1948742685,1200224838,1200183299,197145089,-1342016055,520587392,-196673701,-1946973208,1962281969,-11540221,-1960436029,-1960441259,1692928069,650676995,425347,-164428683,1988821995,-1767857678,-1767495945,-1532897141,-2082959722,158597625,1204227977,-352321278,509705,38258432,2005467136,38177540,637945737,-1995422325,1204160583,-1960900598,-6905802,-6907898,513187846,654073541,-1996339829,2005467975,-4514042,1972053759,16679686,-1226243211,-2080470272,-466484281,50694694,-14268424,2088773172,192238338,76490246,1166923403,638118667,638014859,-402307701,-1893334333,-96040700,2088773200,477451010,272465958,113643644,-1560176851,1122539307,755418630,-1960443753,82512205,55413542,513215137,-196703408,-1768808818,-150993477,-1948742685,1200224838,1200183299,197145089]},{"sector":6,"length":512,"data":[-1342016055,100017792,639464464,490883,1275855988,1208746731,537261606,1108083316,1074132518,1091306100,1528760200,-386644225,-242486700,57996811,-46359,-1013502458,-1756690746,29681665,650284038,-386382453,642779182,637685131,637814155,-402238069,-165216934,1946285381,-351948284,-1006521854,-970523554,-1993986809,-2010774705,-1993996969,-953809337,268439111,21481254,643301376,117983113,1435182787,1166747142,30795780,-1977159541,1371847429,1589976791,108497404,38112038,520308617,-466477373,-682502725,-1979943227,-1960442300,1149829701,1166747139,138709252,105220902,638207113,-1995946613,-1960440764,1149831749,516103950,-939755835,394820,71666470,638076041,-1996071541,-1960441252,1149831237,1166747148,239372554,38112038,1006847113,-1341885180,1008528134,-166890238,74727623,267060656,199952816,1950402550,-352014332,-2012696574,1472405252,240487206,205884198,1963349563,71711493,552085364,-129595135,-2145481186,572310,-661920777,212929139,-645078317,-628174589,520898443,-336181623,-129579174,1183514634,-163149326,139299622,415728449,-24381557,839108483,92940004,508033027,-1760944501,-253564845,-1896593781,-1097428450,-420020219,-1990659957,-1960443580,1149830213,312835,1963063683,-2147170813,-196673761,-964429941,1606148616,-59325154,640222406,-1996339829,-1960443068,1149830213,1166747144,172263686,138775334,638207113,-1995815541,1183517764]},{"sector":7,"length":512,"data":[105155064,-1980348789,-1021375420,-1756676480,-971803391,9915142,-1758839168,-2144635647,1083657230,113648875,503682892,-956539195,1204229639,-956301311,262983,1073890955,-2096740471,1586038979,639508476,637949323,-402373237,-1605305498,1590007628,587712252,83911,88573952,38112038,1476609929,520505225,1975520195,1976699656,112644,-2024779069,529213146,373021319,91516472,1929768424,-1957210076,-628220168,41713702,638219603,2081439104,-351227900,-1979348478,1595867493,1526375400,-1064546109,91541563,79987544,1431328963,-326898549,1364612879,2088773203,209015554,272465958,1187382908,300617969,-1957212154,-1030880130,-2012902874,1482682694,75401991,-2147054074,572310,-661920777,212929139,-1047731501,-1030827773,-1979824500,-1977156514,130190343,57982986,637573609,1392671872,-2036263052,-196703850,-1986621791,1302458950,-2046426729,-1912209002,-247035242,-1960910710,1371847627,-1897888041,-1999008806,20717351,-1897396875,1012788218,-402295550,1424751297,91554620,-335833368,1963342923,-23795707,272384747,-1075313291,1010428924,1007186952,1006924804,-402295545,686554371,91556156,-335905816,1963736095,-45619195,222041835,238814324,149423477,1007283197,-402295537,15465861,1600018779,1482548619,-1023097725,134608422,1183516277,-196703750,-1756690746,873892609,189107607,-1979804952,650377286,1963081088,-1960393983,637537310,637623555,637687691,52830091]},{"sector":8,"length":512,"data":[637537822,-12777589,-1023314433,-2081649835,1392905708,1573135952,-967309809,184611654,-972786472,1476522822,1187448667,50331892,-62486078,2793766,855525001,100017856,-1342016248,-163149816,-1986590047,1048640070,1946261293,-298915837,40143398,604342822,1963211839,-129579253,1187381280,1961597175,963969084,32734848,113642101,-402548916,535560006,519587527,708739072,74776983,49835651,326992678,-972524544,26692614,-1325452824,-163182064,-336116088,-209813449,-972393215,93801478,-335606296,-129579233,1048576031,1963038506,-126975228,2105746946,141819923,-1756625210,-17242107,1175064752,-146372362,-812924020,-1779431794,-1080695647,-403242999,1183578251,1048620026,1963038509,-1758748411,1183515627,1183558648,1183558652,1183493118,110013175,916559644,573335,-125048841,-1416150367,-1582579317,-1951689236,-5508026,-1953024506,-3961095,-6953978,-1953108986,-1581031963,1183421924,-469303298,-335085675,-1760910955,-386120055,1452010792,-163148808,-1979904280,-1912145338,-1953107962,163577414,-1947732224,-62485512,-96040021,-1413379157,-1968454773,128643398,1963343043,-1009634557,24379964,-1957474109,63144922,-1977162702,1138230023,-1757143493,-768408459,1460020203,470191697,-1758027369,146786443,-1947732224,149914616,39664422,-1960380448,1599669333,-1017619705,1448235344,-2080470185,-1363278905,653079120,-1494020726,-1031004299,93799585,-2014838773,109970946,146445952]}]],[[{"sector":1,"length":512,"data":[-1948059904,-1759862280,172329254,1516134151,1438865497,-326898549,1381061391,-1977199017,-58719644,1999794768,-4181453,-392758730,1918436542,-247019996,1166747141,-129595134,-1996125402,-617351610,-1761997253,-1960441739,-1960442275,-286784435,11725310,1968307328,-247019963,1166747142,-129595134,-1996125402,-617351610,-823604941,-96039938,1996496957,9103619,-2147054074,573334,-125048841,212929139,-1047731501,-1030827773,654067339,117523849,-58693397,-396659374,1584530587,-1757135229,-1962052608,647447582,2081439616,-15407101,1460062347,-1476031962,638415888,637754763,637631883,-320141426,-1140936984,1607946725,1245609991,41222551,1183320076,651856881,-1996012149,-1960380346,1183384901,-29103882,-58717973,-402426029,1600060633,-1956947622,1371758053,-1927391402,-315489163,1091340838,-1762509173,-1762521599,-1761997311,-33124858,-1527570538,1595868958,1371756894,-1927391402,179897461,-230782208,-233963114,-99745386,109971094,-216033538,520560292,-1017553313,100787250,-964454940,76162563,100778238,-293366048,-569966845,-1960393834,637540406,1717819,-1960432012,838866494,1166681828,650182151,1912814976,1031808530,-15960316,26664454,-6889466,93718534,-134021113,-646775237,512435907,992346136,1962940958,1364443905,238455590,378217984,-4653040,1945254911,2089494060,-31994,-83681676,-12811482,-1960438156,100730949,-1960405478,-1053097403,117376628,-930376094]},{"sector":2,"length":512,"data":[-351746429,-1017423408,37584934,1405288821,-1960422831,637537310,637623555,52830091,637537822,1962884995,-402542509,117440310,-1960405442,-92073643,638612736,1024411019,125108224,326992678,-1960414208,-1919470570,28379973,100688616,-1004122029,1476792157,1532549131,638219271,1963460086,-469303548,1569400469,1960512261,58779651,-1017423526,1913555793,186704790,184841664,504919250,538873430,972436375,956658948,175374932,-502741373,1495228146,1284228089,71600902,-1994432776,1503087886,2088773315,175461122,272465958,280298620,372968427,74815284,24626747,-1030991165,1526703592,-1957300621,1464881900,-2091691690,-2144992020,1968374396,1031808522,-1257997296,-1258099952,-1770872576,-1757936069,28837490,1103096064,-150992710,-1980199966,-1945701818,537300674,-62485609,-1413313621,-1761339765,-1147731295,-201916408,-1070355648,117376939,2123077234,-2132528388,125108477,-1979348442,-1979520024,1370733509,33948119,68584343,-544538473,20759946,-1960436363,-1960442281,844170311,-11933495,173509414,138906406,1509900008,1006724841,1008694274,-15174397,647403526,688003,-2094659723,1946159231,-1442382071,-385619050,-4521822,1972053759,16679686,887686005,-263796991,1191116800,-390057232,-24379994,839108483,92940004,1363671043,641007398,1392671872,-2144987019,92016701,-1243065420,-1893333503,-1915319548,28379973,-1960441109,-1960442027,-919468731,654229224,643368079]},{"sector":3,"length":512,"data":[1392671872,-1960439692,-75300539,990344447,-16549949,-661917626,41713702,637957459,-351701621,1972053508,1979058947,109971081,2123077408,-263812110,105220390,-2046426873,10611094,74712636,1349849148,1946286464,-226587870,101238659,-1759508850,-1414807501,-1962431573,1913061371,33981334,377686167,637572868,637949323,1359234443,-905197429,-919468684,654193384,-2096607861,41156857,-346487829,-569507504,1240160662,141822012,74712124,292882236,106400550,71797542,-389467567,-346423805,1963932716,1468737064,1200301582,-27903220,1178278773,639006204,1074284427,-1769601535,537300486,-228684905,105351462,79987463,1600018779,-1017256565,642995974,637689227,-1910096501,629810695,-2147000485,1064438268,-1073080713,-1977217676,-466484155,-234487488,-399840362,636222457,1997274240,1958742544,-234454265,367725206,-335803160,268206096,158666103,91537418,535347250,-104597252,106125251,-1476031962,638415888,637754763,637631883,-320141426,611778876,-1960441996,-352316898,512435717,52822032,-1960443043,-49913,52826996,378208581,116092418,21349414,-336018804,1527249153,1364443999,-58698153,2002285136,-11737064,28332402,654031336,637687179,-919468661,-335740184,1375502398,28316533,654025192,637687179,-919468661,-335746328,1392279590,1894259061,-1340312833,-75175935,123046694,88443686,-857159374,-2146898948,58151932,1593577960,-1017423521,-1960421801]},{"sector":4,"length":512,"data":[1105842447,-1960426685,1962281783,-2080470241,-466484281,50694694,-1977202696,914948708,1911068466,881534719,-512362997,1600050914,76228291,-1773257077,-1030953007,-1759639922,-1912239834,653669058,184841355,-2095680266,-1977220154,1190265620,41714470,-1543168,-342475258,-459160606,-502922859,-435799147,-1560055147,144807398,101056918,168180630,-1560055146,446797322,403046806,470170518,-1560055146,1050777116,1007026582,1074150294,-1560055146,1654756928,1611006358,1678130070,-1560055146,-2036230556,-2079981162,-2012857450,-1560055146,-1734240632,-1777991274,-1710882410,-1767202410,-1767373311,-1767111167,26655905,999733766,1922481670,-1765891325,26660513,999738374,1922486278,-1764711677,26665121,-2087254522,9898006,-1763572165,-492633230,-1762483818,-1762654719,-1762392517,-190643342,-1070349418,-1550457693,446928392,-1774279786,-1550425437,-1734109562,-1767201898,-1550402397,-526149938,-1762483306,-1898410813,-1194183744,753402880,504793569,-768407913,-1931412760,-1953030138,-1177406526,-235470840,127350947,-1631600589,23378325,113748723,16815874,-1550383965,144938758,-1756913001,1842749067,117425038,117413454,117413562,-2115463476,1048782591,1946157102,1191626245,-1960443497,-402651082,-964429394,652489219,-268237686,875989318,-26613609,639535910,-30611456,-386290712,-1914111517,512435966,-620036092,1923198581,571798,252043767,-754667264,538348520,-1982856297,-2089957866,9868862]},{"sector":5,"length":512,"data":[-1070397323,-1550402909,12818124,0,118904662,-1174613461,-1510801404,-773795411,-1410805294,1583328146,-326412853,637820612,-16220287,-1003653761,-2128214946,-2147481985,1589910901,1065559556,-1005292288,-2094660514,1962934911,73319434,75465510,-1207602176,48955393,15450163,311901,-2081649835,1465260780,175555870,-1696039283,480313344,-1928956219,10155134,521969920,-1914145139,1183511678,-28954098,855525000,1183380038,-263812338,1039949451,712212479,2147482497,-1019537805,1317670003,-229734146,-1812963703,-619972729,854279799,1183577995,-263812612,-1979824501,1183576646,-62506000,1183521909,-28951566,1187452020,-1207959310,12255232,47360,-373292870,-1959395068,1552627204,1284191746,1418409476,15919366,1077789483,-1998094592,-1959336378,1569404421,1300968962,1435186692,-414792186,-428965888,-2011595768,-997529786,-544545910,-846530166,-695539062,1853882550,-411236122,132540032,-355397516,-607004207,1590745297,-431030553,-13897611,949888,53879157,1544762884,1276327426,1410545156,-781683962,-774254118,-791096869,1191176030,-2141656080,906097270,456524843,456524380,456524876,410191444,32667264,-772287753,-789064713,-169386250,-552351981,-686567661,167788734,1311013110,1724913268,-774843929,332517843,-2081392174,1979793646,-1878201360,15746759,-230242816,-803214592,-954996890,-820781293,91477779,1191172817,-260144656,510885887,15761027,2126782324]},{"sector":6,"length":512,"data":[-1817445366,-1834249813,-263812181,1175118033,-1412902414,1187452651,-343932944,-263796987,-1070923776,-930359157,-756297589,-443851169,707165,-1326675115,1996443648,175570700,-16222465,-401734026,-899809758,-1957363704,1342288108,-15960321,1996425846,108461832,-32970738,576093,-2081649835,1465260268,175555870,-1696039283,480313344,-1928956219,10155134,521969920,821972618,1586229838,-263812100,1937768253,-294609,995718015,-1828621629,309641227,-30555389,-351571393,-4222859,-2147435905,-13957653,721420474,-1948742720,23980488,16547459,-1927934860,-397350842,-1072956077,1122697844,638213828,-16226431,-230230145,158597375,638213828,554881,22276480,15761027,-1927934860,-397347770,-1072956125,317391476,-1954545729,1586230342,-129070090,-369469813,12189975,2147467200,1183422955,-1946211344,-151548977,1954608966,-397505786,-152406389,1954605894,-196214001,334919187,-146344193,1325495424,1183570731,-328796172,-233584637,-1962879101,-1072957370,1727469428,331875304,14124018,-134723957,-268178842,-746325485,-196703488,65955575,-2080762896,1183514835,-328796170,-99356669,-1962880125,-1072956858,1727466100,334496744,13861882,-1957246677,-163148815,65955575,-2082860040,1183514833,1958743032,-328796393,-636225533,-1962880637,1727526982,332923886,14058442,200951435,-148605760,-133961114,-779888109,14058240,-134592885,-670831514,-696006125,-96040192,65955575]},{"sector":7,"length":512,"data":[-1947069496,-1956735018,-770969474,-783348872,-774843930,-774778413,367448530,-746389504,13730560,1929433731,1205522691,2147483521,2112422770,-990409730,-1409545602,-1416516717,-778654830,-230290720,1605093585,1575324510,1426065610,-326898549,-950577624,64582,175555870,-1697087859,480313344,-1928956219,10151038,521969920,853689994,1183379014,-327775238,-2116008309,1937768446,2147433769,-167037325,-1073017228,-33214860,1925589823,-1874728171,-1098907718,-1072988160,-4583051,-1073693057,-768931349,-12716501,737113215,-1948742720,29747656,638213828,-16226431,-96012417,158597375,638213828,554881,29223296,737691273,-564753463,1005221515,721647602,1183531478,368506844,-854458367,-1979756920,-1957628346,1586226246,-1961761818,1177151574,-631367208,433870361,-220012938,-1981352098,-1819083706,-670832905,1183566355,65468392,13796296,1727501970,-2084174870,1579876562,-632415272,467420699,1586093654,-632387112,-1948498295,-151524746,737605521,-1038878254,-802436589,435443337,1585509966,-1957691137,1586226246,-1961761818,1177151574,-664921604,433739289,-220013450,-1830357154,65468307,-1949690920,-419960762,-763115517,-141127168,-972821914,721474179,1310456926,-632939560,-1982048741,1317665886,-632911400,-135629173,-151547402,335139371,-1983245374,1308750406,-162131468,-1761651184,-1830398325,-471310709,-62510837,433610265,-169682346,-1819089161,-670832905,1183566355,65468394]},{"sector":8,"length":512,"data":[13796289,469524011,1444665414,-60913190,-1948760439,-167516042,-2081786229,74645718,300669575,-791551023,-151530799,-772343917,-791096853,-17954,-779423349,-789064713,368434934,1578303488,-196209678,318141971,-355401898,-556724877,-607004207,-556738351,737691391,334889727,333386695,-2131291185,1451950290,-1107004168,-2126348288,1920991226,-31397629,2147482241,401146738,176080126,-1416385540,-1416189039,182505874,-925763002,-1956749397,147480037,-326413056,-987867306,2126776950,138709766,139823910,-523117781,-489563184,-930357296,786680331,1031790394,-1036307844,829893234,637944971,1963345211,71600925,71645990,1149965429,1161504258,-1962183422,87762436,-1070922635,158798571,158718730,-335544392,1977289223,112887,-350240757,1566465792,1426065610,509013131,-1962510651,1418396740,3965702,2088963957,158662658,91586472,1946273014,-2134900198,-763166508,-787451136,-2567718,-4519868,140256127,-1340968893,-1982125312,39618844,-1996209015,-350288300,-1161811193,-403996672,80371038,-326413056,1443556483,1992629847,-159478518,96012054,-1510736896,1183651359,-401714954,1586233221,-788483586,-774778653,-294421,-2128382849,2126545091,-294609,-1977451264,1183579518,-788822277,-773205789,108971227,-1416385540,1586108651,-1209806595,-339727361,-16729112,-504643541,-1070867669,1583340523,-899816053,-1957363704,509040364,-1962510651,62259524,873132066,145228917]}]],[[{"sector":1,"length":512,"data":[67444340,723088128,56365531,268786705,208865116,-1089977089,2082701311,191907592,80148516,21268736,-1995445473,39618844,-956015479,-2147482044,1583345387,313949,-2081649835,1465256684,175555870,385253005,375047,530969596,-163148522,-1981280688,-146371585,-1946583413,1451948878,-27358211,2147476353,2147482497,-1014936204,1115603968,134216577,-489665155,-623842351,-209008886,-271458421,-623781679,-607004207,-657330223,-640558383,1725029329,-788523778,-774319633,-774254118,108971227,-1416385540,-1416451183,12198379,-2096108800,-355368990,-897324335,-1174148128,1725038560,735760894,-1948677175,1607658433,1575324510,1426065610,1465314443,175555836,637831974,721573003,-773664266,47918046,-2144176930,578093054,-109057149,-225781040,-393554806,2126774449,-1413469434,-1834249813,-16411733,-1413084353,-661969685,-604513782,-348127045,197823447,-2096204600,-355434517,-770523133,-347355016,-1073628169,1583333611,576093,1458342741,1992629847,108971018,721835147,-773664320,2106457560,92874248,-355269199,-92184204,1148454911,-360640333,93455359,187056127,1418439429,266764293,1284240138,22842115,11543690,-741220143,-758001199,-741220143,-758001199,-741220143,-758001199,-1416516718,-1416451181,-1873286369,-2096735094,1544228835,39586564,12196875,-1280347072,-1968444656,-477952420,73141007,184704011,-1174047460,-1762934783,-2147134325,1284181990,22842115,78652554]},{"sector":2,"length":512,"data":[-456079106,-774777903,-193342957,366672,84616764,11557035,1583324907,576093,1458342741,1992629847,-1962636534,1284178524,106203908,48927,310170123,-922016385,-620027531,-1073013387,-164947595,-755548693,-738733577,-2081040137,-779943725,13796096,-1107295809,-771030976,-779679115,-2087466105,-219475730,55446392,333124544,2043810761,-20545035,199676223,-993078793,-1409546626,-1416516717,-1416189038,-899850657,-1957363704,509040364,-1089833275,2082701311,-17858296,1073709887,-16054145,-768929923,12190699,-1950340224,-339178536,106203977,-1962652533,76218972,1999695747,-1950119152,734694361,281510866,-410782850,1960834831,281510670,-640554287,-657335343,-151683249,1954548036,-134862063,-137234478,-170330157,-837558765,2126829075,-1817445370,-1834249813,149914539,1566465823,1426065610,-326898549,142016264,369522431,1358448269,-10295282,-1711651189,1979471419,-27903221,-1953364363,99350598,12238891,1575324544,1426064586,-326898549,142016264,369522431,1358448269,-13703154,-1946663285,1317796438,-28439556,-4717196,-1949266945,80371173,-326413056,-1962349437,1183386182,205949944,-1711651191,-1979951479,-1927872938,-11470778,1996425334,1877478918,1575324670,1426065610,-326898549,172395272,-1946663287,1183386694,-1983894534,1183448134,1183651582,1996443896,108461832,-29300722,-899816053,-1957363704,-1000909076,-1960441218,182135573,-1962379822,-1949594637,639036371]},{"sector":3,"length":512,"data":[637695371,-1979429493,-2131391746,-1031700250,-847233154,108971136,-1413469188,-1416189037,-1416451183,-899850657,-1957363704,509040364,-66423099,-1382830675,-1382896239,637045535,2116911103,169637439,-1978436124,-2132553497,-779943724,13796096,-1057091213,-4715147,721611775,-1949791296,-788075568,-773336606,108971226,-1834249813,1566465963,1426065610,-326898549,-1957210614,-167048586,41510260,-25043209,58069895,-1156347970,-568131577,-472783919,1374471041,-16615425,-163148489,-1751494634,-1323482623,-1074867453,-167030260,-288287372,1183648883,508565238,39361111,-947708767,-991433974,1342572102,385238669,176063312,-1710786304,480314435,1486489067,1595711746,1575324510,1426065098,-326898549,509040140,-66423099,-678691021,-544485493,-1980465527,1017968254,1013412400,744716089,-619997136,-922017419,-771021963,-1164501131,-487129078,-763103229,13730560,-1962880125,1174533702,-2117080076,1930218747,-405712852,-774778159,1364448209,-405711022,-774778159,-405679151,-774778159,56153041,-804038408,1489507160,-346499053,-163148869,-196738752,775722219,2122517365,91554038,-336179457,-125924987,-1980082551,1586101326,-193033218,74728764,913663292,-1968383181,1949121736,1948990497,1915763741,2000239644,-386170600,739406595,-472803280,-472788085,-637279279,-340994045,771326176,-604568971,-1927283965,1343682630,101074628,39504,12066114,2113420272,1358441229,101074628,1022544]},{"sector":4,"length":512,"data":[-1000923801,1342572102,1728057242,726177309,15403590,-443851169,576093,-2081649835,1465259244,-2088763208,2130710142,1226758,-1995553145,2126835270,-226588410,519325324,-1928300859,118945406,375292,-1960860173,-919863738,-774774575,638222020,-388952695,-12776844,-1173196161,48988159,2126828075,-1430246906,1944699531,1073687809,2097158973,2092960524,-330905848,1189806088,1292941968,-1265374473,-45708723,-453582640,-763116797,-2082932992,1451819218,-296338452,146718332,-1192088832,-264564736,-265613956,-163148464,261771286,1444767488,385238669,1022544,1720261991,2013680,738086442,-160003109,-1946648949,1452014150,284787708,-561311886,-125044853,-768884085,1947265411,-315927276,-657331503,-556671023,-573449263,-846466334,2123192157,-1861806346,-1767140437,-1196730197,-1851047938,-991142261,1988883070,655407366,179958263,-168390044,989197970,705327813,-1336917051,5892145,3663960,-1980998007,1183707774,-2142234890,2013330814,374347277,39504,1854086466,109920510,1344164464,-1593681766,-1950340324,-25263664,-1536016385,-385920279,-1970143231,190700,-157760118,808453617,-1979710744,1966095556,1962818308,1325378054,990542862,92204638,-1142308021,-261714946,-160104901,736035663,1031808734,991392565,1340568830,809336870,334230900,100542031,960331814,-29685386,-970526091,641937669,83398,15451019,-443851169,969309,-91491445,-201586914,-1948349532]},{"sector":5,"length":512,"data":[1448199127,-208992681,119470731,-56298499,-678699381,1499356935,-1224280125,-1023409918,45549303,-138215422,134395654,116900608,67109559,-286783372,-402426625,-138149918,177926,-2120432888,268613390,-1664901888,48695031,91553801,1509062,-418479872,-2130704126,6414,-389833471,468196319,-1767783676,9675522,45162123,43392649,-1560110175,-1281294187,43754242,243974955,-1053162827,-1047920010,-1593732189,-813038964,-360000973,-503842166,-1023163645,-1023243613,346210355,48896,503324089,-1426850809,1949504,-218103367,-18262,-1191174465,-1426915325,-1090480200,112787490,-1330908416,3063552,-218081351,587646890,-956293629,503530502,51749376,51775174,772195850,113640192,-951123917,218206470,-1962889206,-788351730,-1342129439,43531904,-1610255353,-1196031103,-1996321118,-1996321778,-1023244266,-1560095327,329450257,50963203,-1560081501,262341389,2269955,-1560271197,94568490,419874563,-973078528,197638,2361031,645988503,-268500297,-18237,503760464,1609105152,-17569790,-1591912472,-1767702381,9806082,-402482269,512435436,130417379,282650650,48569993,-2061071528,646562560,512426117,-1957494043,-956112098,-955642617,-1476359418,-1224280284,1946165250,-21829626,-967709861,-16771322,45549303,91557888,1509062,-1223786240,-972029950,16784646,1543409640,45549303,443875840,2373375,50607871,1528650216,50601608,605981019]},{"sector":6,"length":512,"data":[498526208,-672657685,-1224280305,1946173442,260368387,8726155,2367115,1979662208,-1896120053,-402296063,-387246405,-400844824,645995008,-9502695,-402548248,243335758,2097847,1912652264,2025477,-998979861,1392649403,2734930,-1191170630,-1578565624,19261693,-399798296,-488105124,1948269821,1946762249,854085637,512448512,-75431900,611516815,1962775272,-689418235,126375952,1963801667,473622537,-383871256,-1763173592,605980958,487778560,-148505111,6406,-2125171711,-16770778,-42800898,-1964488332,2400527,41075515,-1749362549,1004177152,-1978370854,1948269575,1946762251,1979661316,537380358,-1159140541,-634716009,915069575,-700841213,130421106,-889306359,-822212236,130477172,-1007490049,-399840280,2134645432,540804211,784025971,17286656,235374659,-1094823161,-402606815,173736159,1395750336,-1256002370,13756417,1975519835,-550058973,11883266,1526776552,343146812,91619132,401195403,3121406,57876540,-1007042510,208980222,52697275,651756505,-1007085685,-1677715736,-399867928,117316172,-2008874962,58039559,-352320792,710928534,861131125,371099867,244115456,-1979699525,1958742535,-1975300078,369524743,132645376,-922855424,-1017385099,1982080,-402426880,540811960,1441334130,-1336913906,240052318,-398457768,-1017639352,1640183,745865217,-343221453,1445514,-109042973,-972720637,5894,-2146553368,7742,-1981283468,-400510942]},{"sector":7,"length":512,"data":[-69071336,1445512,1375711683,1392520891,-1977198245,-1073068540,-393583756,616621440,1371668031,1125091923,74694954,1407961090,126505119,-1869610948,-847247755,-1876432096,1965082102,1086715422,1631329396,2101085810,539755127,1954596342,1916877837,2002729990,-2143278078,975626213,1175680260,1976172099,1537104065,-1342130855,-1342016257,39371521,-1245148479,-336526592,13101447,1640183,192151553,1648257,1323892734,-134515671,537048838,-402295808,-780850879,-2145265688,-16771266,113693556,-1140916201,512294912,512229386,1541931032,248965133,-398786373,1122504018,-418973940,1946159362,956349192,705502440,100711168,1275925736,543518313,285260544,1124927720,2124911,1962613480,419478285,1225586920,1919251310,266862708,-1156745989,-420995072,1684949260,7630437,1962607848,654359306,1410127080,-402627999,192215804,-399834949,1766198469,-402625428,259324669,-399507269,1851067573,1701080681,-150965138,537048838,-402295808,1987389581,33752224,-33549562,403061440,-1575652352,12255256,212658197,-1977545752,-1342130216,7333891,671371,141885195,2244155,175260788,788167,1049296897,1223164629,571378448,735195904,504198351,1359654919,2484311,510941535,792065,-401932101,-1041757086,203328288,-402280448,512426021,512294946,283705354,-1359807472,172102773,-134777390,537048838,-386960384,-378263555,1355006011,300417205,-989702144,-393606284]},{"sector":8,"length":512,"data":[367534256,1976434188,-75250695,1949347840,655407665,-1174399512,266863592,6601216,-1174402584,65536010,113152,-634666958,-1057094542,-637273877,809250820,-318110603,-838940812,-972303383,-16739834,973845480,-628424672,-1975258485,509495,-352014013,503760424,1397882880,-56825770,-967156898,-16769530,141917043,-402640992,-504689591,9578122,9569990,1019316736,-972786432,1019412487,-1978895102,-969277116,1157546867,1014164225,-1978501884,-969277116,126530420,1140654568,-352238338,1963146478,7071751,-1645479051,158678588,9578120,-349755416,1948400672,1948466188,1946237960,1963080708,4712454,-2130740503,302001982,1894365556,-1841397505,209059584,3139664,113703797,1476395154,1149948042,1912879617,-11409149,-2013182722,1124567575,-1963157016,-969277116,1021903731,24414975,-1962985751,-1073086140,1291720564,1065372417,-402427104,-1041760256,136316938,184528896,183026624,3270656,51709638,-396694784,-1511519408,1852392970,599392356,-18880253,-401915160,1699875476,1667329136,1769414757,-1174378380,-957807804,187295998,1326087144,1869182064,-1174375570,-1293417706,-1824617730,-385830143,-1226306938,-3872513,-956310808,-2147281658,-655883285,387901691,-1995786776,-956297186,6918,-485586176,952578,-720467200,34507010,51886848,-318099574,2129331061,126501776,343357756,275918892,179327128,1781495,-1547566246,1592459291,1008541416,-2147125929]}]],[[{"sector":1,"length":512,"data":[16979214,91575612,51711616,1968061444,353271813,1195115011,243272309,-2146958571,-553446106,91570748,51711616,1967930384,353271836,645931011,1375142677,51580555,3721,51449483,134793,1968389209,353271813,-838975485,1048806261,1996554267,453428998,-1962934016,-1610612194,279446293,512427124,-2136473600,682101876,512427125,512294928,988282896,-164990430,-2147281658,1676151924,352777728,41166851,251651307,41156635,-1957438229,-402649058,-396683614,1609111198,3336441,-166291992,-2147281658,116787060,1965556501,165603561,1393113576,1668440421,1953701992,1735289202,1953459744,1970234912,-385850258,378210596,-68681003,-484537591,167045378,619702355,116787828,1946288917,-1871713533,270437203,373352448,373090395,-166519832,33756422,-1930930059,476571657,1819305298,543515489,-835725016,2112041,-1190350104,-1360527356,-1155238620,-397344668,-497476018,251706353,-1190603288,-1763180540,-1156811484,-397344668,-497476042,-388895759,1592272016,464381961,108288316,1534348860,1508425451,-153884651,54857354,1398472885,52731985,-930430678,41111711,116837886,1963983637,270437124,1402886144,-1159199884,-1973855738,1958808261,54967046,-386514456,854071163,-402033372,645993480,-196583,51709686,1527018768,1539562119,-326412861,509040209,75416582,-66554171,520595187,1566137951,-1308620606,-1308431615,-571976961,141879316,-1000670325,-1945934538]},{"sector":2,"length":512,"data":[1959136192,210445885,1179007203,3288712,-1964506955,-1340705536,-964471295,-1947706620,529212928,1949615142,-338654692,80118552,1962962152,1459597320,-351998333,80118752,-806763541,7792887,-50071438,92992739,70919753,1048589428,1946157106,121251565,-92215179,-2029423615,8186078,-629804153,-317995778,-100464008,1925851983,-890551867,-1099773397,1207577409,-92225301,-402295807,-1233846186,-629814018,-1276584053,648276756,637695231,1461597439,-1006688536,41418534,641204006,637695231,350762239,-1031093249,-1259828328,1020365569,722435840,-812955654,47517227,-117632654,-100463125,48434827,57855787,-1007136959,1443256094,-521612921,-1010137090,-402454082,-1589442735,-1019543516,-1014300042,-1094515575,-336919797,-352121410,51363558,512483819,-571998174,-1962642681,-1996299490,-1107094754,-890765306,-183047937,-1593157911,295895074,310787,-1847005973,572427027,287213824,128903171,512427123,512295651,-303561965,308996340,-2129276183,268613430,169994496,-1961662488,-385677026,1575490526,186551059,332720387,-1961667608,-385676002,1239946186,253659923,331409667,-1961672728,-385674978,904401846,320768787,330098947,45549303,443809808,1124506856,512480139,300417028,512447232,166199302,-1019521024,-1007091086,-75381768,192348559,41343547,-397223285,-1017510243,1929364968,50063610,1509062,576514048,-1946157251,-352095016,1354993666,112322566,1049320199]},{"sector":3,"length":512,"data":[915079953,76153619,80107088,734956314,83592143,-2025782922,495577338,242416263,57985067,1577547081,-385578920,102692326,495511583,6503711,-873927299,1936278533,1969627243,-402625428,-605354556,-402639942,901511669,4161536,386320067,-639107072,-49887,24500363,-488090685,40888563,48434827,32883073,47779371,-2028041391,-622266112,-1956947965,-1962899690,-1983370294,721457166,486926538,488237212,-400395363,149422165,90236934,1869771333,1701978226,1852400737,1768300647,-402627220,1407780176,1958820853,-91516604,447743774,-234494980,1325495726,1138723663,51584649,512481927,512295047,512426769,-634716016,1441319819,12511475,-1946870295,-1962899690,721457182,-2016703526,1458174163,-1316861,-402393623,-1779953216,82503685,1852404304,1735289204,-1224280320,1946161154,319720204,287214339,1926839043,-719418616,-485586174,1003631106,-1975749671,-1023524089,645079100,222087934,154934900,548412533,-31767832,-1031122238,378142900,-218758397,1510014080,-806623115,686346802,-402099685,-1015799695,-1021282328,990053793,1912803590,320768780,1942174467,85887236,20834307,-1293408141,24963314,8855179,51451531,51453577,512350467,-746126573,44558584,51453579,-384724504,-389871673,-93126385,-386759448,512426318,512295047,-654114031,51584649,-401466904,-1528229916,283830279,-1961894936,-402643938,507184261,1550975761,51584571,1323849335]},{"sector":4,"length":512,"data":[503760626,512425984,-1779956975,51618048,2229817,1347955315,141869066,-972733208,183181319,9960321,-397736844,243336531,16777241,-1961845784,-402644450,-898431812,277801048,1967814,486983423,1072169216,316533245,1374208856,61663236,1330795077,1327512146,1864397941,1886593126,6644577,-972842007,-16769530,-2113938456,-50325210,258599167,1902278,572427009,281077760,-384655640,548467582,-11933360,-380632912,995295043,1946342686,-12088822,57936444,-1980699829,-402644450,-1749348557,203548672,130420085,-75414752,-244186737,-1996449861,1509958686,-1224280125,1962938370,-389810174,-1958542487,-402643946,-169343991,605981455,58976256,8855177,286690131,-633650685,51582603,-633665422,-1073085325,512429291,-634715375,8986249,-1017394293,-1962852120,-150959858,-2028565543,287214336,-1008185085,-389850640,116854684,1049271,250142068,287214577,49080323,2236041,2498187,51451531,1926904642,320244496,1943681795,572427016,639535360,320768768,286690051,1943677699,-880033023,1364448135,276359324,-396666467,512426201,512294946,512295697,837288723,99739918,2228997,2752550,131072,51577617,393220,51053321,51315469,1448170320,-1195654773,440591,-2127066322,1996590908,1913927942,1124335874,1592648259,-1017619623,-1464117158,964879,959941422,688420356,1929656596,-2096854782,-320732477,46735044,1962933123,-721016025]},{"sector":5,"length":512,"data":[-485586174,-720491774,1065559554,638940415,192284473,639052070,57870137,-2096658138,-437582653,-46742522,197233666,53376206,637719814,-108852085,-2094893825,359988985,75026955,225757243,158517307,-935605717,-21429389,210315007,-352074109,1405290454,-352095663,378245169,1380057827,735741778,1539541978,1926835024,8972547,-397225077,1499070519,-1991622309,1107485462,57985291,-370184216,55836482,378229721,1111622371,-634660217,1515965323,74762507,1257194984,-485062326,535380482,-652309505,-634696958,-205962638,1943612161,-2133261510,7742,-397201036,-1252326953,19720192,1314013527,977751625,568852512,18671861,1954112032,695412837,1717922848,-320339852,420380932,-1023409920,-385874968,1048637706,1962868766,-44046077,-990035991,-66930378,-1073042394,-389873291,887624691,-391371244,-24439761,-4603854,-1359807233,92939855,1952201807,1949252616,1946041092,1190628336,342354246,1659438878,22210580,704687592,1310730794,1917132911,1936879474,1970226720,-402627474,-1612119908,224061680,721482216,-1006447330,-2096969418,-847970306,-12811482,-2094610572,1576993916,-436269708,654301928,1962884227,637594548,503520395,-14286123,803734132,16181248,-1224280232,1962967042,4778003,1869771333,-402644878,-1561848822,2112019,-400796696,-437775169,420380947,-1023409920,5302355,-805202784,1342797032,1476473832,-143275778,50667145,1527723752,-401780247]},{"sector":6,"length":512,"data":[-2115502046,325576980,-384529688,-387443871,319875093,-385649944,1048578611,1979645982,322562322,1982080,-1828162560,-402485342,-1013770668,-719439029,-1979026942,1963801607,11987187,-719418429,1358555906,-1883351471,16365825,540847357,-12843404,154927732,1962734561,-561297919,-1017620130,1140841704,2365067,-1090488856,-745865065,-896805077,-5239581,-234414340,1241740718,512489451,-637337566,-484557885,1007448834,1124758797,171706250,977469813,-1595358272,386319881,12255232,-9639936,-401359896,12255460,-10426368,1007927273,1006990357,-1021676517,-385886232,707460914,1313415210,1381123412,1163153493,635961412,-282531329,41081403,1002689415,-2029882406,1464976339,48434827,-819201141,-661907338,-1325612914,1974399501,1006995981,1191277834,1610145675,1610203993,507233113,964035285,1023362954,1258386698,1023362954,1258779917,47521339,229644150,1962886968,507202313,-193527083,126486507,24447548,-719439037,-1962642686,-134032098,1405352387,1224839097,-242484853,1993026382,-49865202,28943603,1121159936,1543255528,-4631613,-1143763969,-634715761,-398324364,-1958020062,1138396107,-957589016,536973062,780845915,-118947437,-1090052599,855376358,-1949791260,26452208,-1073561346,-299112309,1364389419,-1979544415,855805710,-135623982,56252897,-1976695832,-27933950,-3544896,-402294711,65732707,1560342504,507412675,-445251840,190549,-1818180771,-390005247]},{"sector":7,"length":512,"data":[2018115495,-2133708181,197694,484981620,1007127049,1129935885,48438843,-1023520141,1640183,410320900,343214396,-1979665328,51808962,-20839933,-151849272,1490062050,50599482,24430706,419886923,1946158080,-152546527,2400765,41337659,-1992042357,1526730270,990430952,1929383454,12249467,378169579,-1259863292,990349832,1929569054,1947024473,540820309,154944371,548413557,43656842,1354956459,-1262319022,51808768,-2131560957,1482293500,786688736,1074055403,44318336,-2146667519,7742,-974650508,-2146768111,7742,-1444412556,1937783825,-1708750311,-1023497470,126524642,1962784488,507200267,-227147037,-437583125,-1341622207,-1708750304,-2136214782,7742,-829740172,-1962809666,-2012836099,-1908506622,57999106,-1161583117,-1951595558,-657396504,-319095950,-76293936,-486823019,15254509,236862216,-1967557632,-12827897,540813684,154937203,1074012532,44318336,-2146667519,7742,837288820,-2146768111,7742,367526772,-1341986031,-1708750304,-1092441342,-335577623,-402606092,-1749352329,420380928,-402652160,646053483,-327655,-1709885,-401890583,512428352,-1209466141,9943817,2367113,-401991703,-2126250843,1912705019,26131203,2367113,-972422167,5894,45561473,-960299007,5894,45561473,-960299006,5894,45561473,-2117926904,177974,914473732,134218423,322865859,303991296,-63903488,2236043,1929183208,148039877]},{"sector":8,"length":512,"data":[2236043,-386075672,-1175977979,1405351943,2236041,2033350,352765440,-672596224,352765449,-1017446400,2236043,1929180136,-1645718639,-806659320,990053793,1946342662,143583329,512477491,507183138,108266245,1107087336,512226539,-1801453534,973220865,-402426424,-1957430084,-402644450,-1628898124,-42342145,-393155749,922683480,512426018,-919403771,26480266,1843972606,-1661213956,-1644200728,1004434011,1929577758,-61151016,-1950100501,990053662,1946165790,568873973,-1041540344,-1962402840,855835934,-1810986295,48857089,-486788120,-391451653,-1801451516,-1966539263,-1949791512,-402455266,-838927332,512358773,512426757,233308194,-1979981060,-402644450,954730754,-706166006,26517511,-393557762,512477322,367526661,1976434428,85887481,572427011,-66656256,-806618142,50667147,47519371,57989691,-401997080,512427936,512295637,512294946,-1209531643,109242376,-1996449861,-385866722,-745863060,-840414646,990212859,-118262822,9943235,-402643805,611516392,2236041,-1157202200,-1111621481,161998884,922686067,113705099,616366219,-1895698968,-134182138,-393615165,1609060725,-1152814338,-2081947497,1259173096,-1879342781,-394562815,-193723593,2367113,-402126871,512485529,-1006764014,-402592792,233309700,572427015,-80812032,2236041,-402614341,283639969,420381182,-1023344640,-386023192,443869242,1258330043,605961027,-402164736,-193723669,-1662514965,-4986627]}]],[[{"sector":1,"length":512,"data":[-1360488981,-401020673,512431988,1038614562,616414975,1929971944,-401872888,-689372043,312525569,512446464,512294948,113639432,-402653154,512427676,-397213662,110100255,-1571291102,-1528299502,503760389,512491264,378208292,-634716152,-746076298,-83629998,1512048582,-193606914,-402233368,243336575,16777241,-1979909399,-402643938,2011694908,88271111,-1947744024,-402648546,512360476,-1006764014,-1947664590,572427257,-94705664,-2114237720,6414,-397163775,-1142421980,780537,-110303141,-401753112,1405292311,-83463,1542953192,168626119,512475971,-2125791196,1912641531,-12615436,512357492,-706150364,605981446,-75414784,-294518385,98494659,2760331,-1980155416,-1962925538,-385864674,1810431857,4188160,2367115,1913129192,-75414777,-193855089,2367113,-386796568,183042085,572427250,-101521408,-397197966,-1990523492,-973069794,7942,-402213400,48759936,-1961038855,1258300446,9960321,-1024928910,1274311175,9960321,-1226308238,1140093703,2367113,-1157215255,-185925481,-1946626840,605981635,-1329382656,-33393920,9282240,-75414709,829555087,2236043,1928946664,87484495,2236043,-1980147736,-973069794,7942,-402241048,-1749351404,605980928,123725824,-102118798,123201541,-2126265485,1912705019,-1925283827,-1133182976,1140356328,1055428331,-337153529,572427143,-113580032,-429659965,1961244904,-402018298,-389814156,-328007705,1342182048]},{"sector":2,"length":512,"data":[2367115,532105,1967814,79882240,2236043,-46733229,2236041,-16527640,-956265674,-1124037882,-11999196,9111183,2229903,1221208,-972836120,-16769530,1977997032,-81139453,2367115,530059,-1804150229,-397225081,130480393,-889300448,1843983477,59107332,-386201879,-1958479907,605981643,1993026304,-439097331,-117315503,-386276775,-389871951,-1749293627,605980928,86435840,-385887000,512427064,1397948450,1526224872,-634713998,1968950155,-379862238,770179860,572427012,-130095104,99156851,28920579,1007127040,1258452234,-390067647,-1578568307,215476235,-402549600,-437714478,1007127042,1007055904,1006793737,1592312831,-145233691,2365067,-746071493,-521620366,-401574657,57869845,-402588183,183040115,-369593594,512426229,99090466,-385649672,65536229,-92542725,585680107,-149165851,512476043,-667221980,-1041648525,-451942400,2367115,1977940200,10152195,9960321,-1847000203,-1998040320,-401902081,-1014237459,-667200677,-2125788046,1912641531,-9312248,-346295180,512318321,113639432,-402653154,312476496,922701824,512426018,-857210846,-1962052869,-1962925026,989857814,-118787110,2229903,1221208,1088986195,503760386,512491264,1486684168,1263545458,9960321,-1125644942,1509223415,9955713,1363348451,1509396712,-501217338,512312309,243335204,16777241,-2125784085,1929418747,-14227197,1979662208,-141957115,512355563,-2132279260]},{"sector":3,"length":512,"data":[62318839,-1023069976,1408726760,-1946796824,-667198525,-924259469,-387549698,-152307869,-385875272,28894534,-448730880,-385875016,-1259805382,2353401,45549303,91488288,1964091624,3598341,-1662390669,-107353863,-402650904,-76349400,-1963356439,838868238,85887981,125061379,1928761320,-1007033853,48438923,-159192893,512427123,497025763,-1811531264,-30968063,973085958,1946161670,42967780,48438843,1357383027,-2134640393,7742,-840432780,-151590903,-1007041544,-389510576,-346488919,1364414680,-1006217386,-1945961162,1959136192,119408203,116853424,262169,512427124,-1946353630,734759931,1090704654,1202647631,-1957168057,-485585925,-473224446,1336865283,-1960442023,-49916,-29552012,990409983,990147265,-2096598329,-420805690,638577656,-1576909686,-1866792284,-1700604158,1594358018,1482381662,-7739197,-138215053,268613382,-2146732800,7742,837288820,-145702135,67115270,991458560,1912803614,320748352,-2143653117,7742,1172833140,-1590105335,-1891827708,-1591970303,104529954,494011153,1023411873,292946319,989864609,1996690182,1003547404,-351898920,1926773735,507412678,57933824,1476974568,507412675,292814848,-1974119856,-390005051,-397806089,1516107574,29082456,-194713600,-385305624,-140768791,33560838,1343255808,-397258413,57868311,1526175464,-1655153831,-496244541,1929381608,-142219261,646010307,-16842727,1642113,113704962,142]},{"sector":4,"length":512,"data":[-1560079967,329318404,434947,2242187,-88681934,503355327,-1229063161,440591,-1959901883,926613598,108394208,48447369,1017966315,1010398221,-1341819393,-502273921,-3998038,-33518074,1011971278,-1966377719,51284674,-20905469,-167725880,717881073,-1330154292,-1023497473,812961534,-1427376158,-919396176,-1426862454,2367115,-2147402776,7998,2033350,-1609665025,-922877923,1181242,1576534898,-68421181,-386659352,1766650726,1948280174,1814065007,543649391,1380130861,1936615712,1702130277,1307050084,26196979,-386682648,552139253,39971071,-689387541,-210507549,419886915,1962934784,-1830239487,244011763,-903151474,2236043,1793590243,421954033,1509948672,1049303267,-1749155806,-66642432,1962884268,1964653819,-1440698366,854127330,-745847821,263765333,771753657,-1962903925,-1879342820,990869249,-1962772774,-397258278,1499132733,1162157193,-1587682846,295895044,434435,-1023208541,-8460205,48438923,-1158489624,-754777863,378209395,-396688679,378270594,-2098724139,-1075293197,572426738,-886351616,7923793,1509835752,-486500421,1124567561,-109772996,512358370,585826340,1357132432,-13440941,-225384357,2236041,-1748795045,605980928,452608,-385859096,-1749352948,-1827763712,-1965413631,67513027,975073795,706114241,46202561,-1576860666,-1818230012,-1563886079,-1528233965,1286901,67502787,50635267,1246918,-174987008,1982080,-1947634688]},{"sector":5,"length":512,"data":[-1593637602,-1019542827,94569846,-1176990973,507052033,57999394,1996531433,572406594,-402229760,-347999492,85887476,302433795,113639680,872349727,26517696,477282619,49906505,29038199,-237443072,103213137,-502824216,-108832264,-1023314175,989909737,1929388574,-225253368,-348038286,1978469106,-1810462123,717326849,-17790270,-29199674,-2146798130,-16771778,1693123445,-2134442352,846660350,779338282,704650656,-1574471994,512426013,-292945147,-229709742,-49616813,1976434267,85887476,-889300477,1185416,302942403,512475904,-1605827835,36438420,-1047867254,-930430422,-838991245,-487449624,85887483,4843523,2033350,-16193025,-1593849880,-922877923,104467828,125043092,57985278,-1962926686,-402455266,512356844,-1511521531,26517756,-1946446359,-1979675850,76164647,141836604,57984058,-101520570,486983363,1405288704,-2130667589,1946259451,-12615668,954729589,-347911182,9944046,1065353649,-1976666871,51808961,-20839933,-167725880,-20804878,180628168,1343648960,-235935663,-968664999,-1040253177,1945827712,1976106508,1136787178,1929050496,-195434299,704746400,-1962929402,-2130697186,67115278,-231282688,1648257,-1017380869,218169644,38469634,150784,1946157683,38273026,-16691200,196353,1358955081,38207490,151296,1962934903,42205186,-16681472,-16646399,-16646399,-16646399,-16646399,-16646399,22151170,33489407,50266623]},{"sector":6,"length":512,"pattern":0,"data":[134304512,-16646399,-16646399,-16646399,-16646399,-16646399,-16646399,-16646399,197328641,-1023475439,297928977,33489172,33489407,33489407,33489407,33489407,33489407,33489407,33489407,33489407,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19660800,331419073,29426881,96536257,398530753,314645185,297927617,68272659,-1039855166,297932817,51495442,-4063295,-1055452734,34718463,-1039461950,297930769,823247408,-1036906046,381760273,432082625,-1055321662,-1056456428,34325119,-1039463486,197268491,806076936,-1036973118,197276171,51102259,-1038742590,197269771,386646546,197328833,67879440,264374721,336577033,-4063295,-4063295,-1039396414,297928209,-1056128767,319537680,-1038413374,12721425,252691038,-1039790142,197268751,353092105]},{"sector":7,"length":512,"data":[0,0,417208221,425400565,372775300,373822980,386537095,363402971,380835251,389027524,76354975,296223885,195036301,419498922,193071992,194382732,412358087,444275351,456792830,188947277,420875046,184814447,186387223,231934753,256052624,200019049,220136589,435749241,366941651,76350605,76350605,123346417,129894318,472908401,167709179,473701430,368186859,246156966,1529626172,724184669,1027223341,2105223464,660349790,167714875,1094795585,1094795585,1701013836,1684370286,1952533792,1634300517,1344286316,1919381362,1344302433,1701867378,544830578,1109419631,1095520847,-953269170,-821912314,-1626945754,-953748478,654483718,-1559837145,2124480258,2133232131,16854275,-1610441821,646579068,-1767701635,50128898,1918975171,2004499462,-1021301758,771770600,1701990432,1008759667,1044599621,1501184,-109765828,1364414659,-11118766,1577229590,1532582495,1364443992,-11118766,1577230102,1532582495,1364414659,1347835730,44111615,1499094878,1438865499,1585966219,777034754,172165002,-402295616,-202637349,1476550279,1438866845,1585966219,781996034,172165002,1008039104,-402295936,132841700,604033000,-387419009,-471072849,1585928349,1354980610,623491923,1397753323,-64625733,-1073042394,-738261132,-335573272,-1017619470,-388877486,-1017511934,-1090103466,119407269,-1962929688,-2955017,-1017225465,-388877486,-1017511934,1381061456,102651734]},{"sector":8,"length":512,"data":[-661971186,-919339951,-1272550722,-20958713,454831040,-143457708,1410538499,80118530,74828030,74762507,1101672452,-579482370,74828043,1101672624,1487585331,-1054138618,1329663862,-133957749,-1952123907,-215961400,1595869098,1532582494,1111540568,-2036334577,655360001,65536000,6553600,655360,65536,1048576000,1946157732,-1543059960,1692991490,1048625921,1946223268,-1543059720,1273561346,-1539407871,-378273022,44304070,-1818210301,43688450,1048626008,1946288804,-1543059756,-1605369342,-1700658542,-2134681598,-16604354,410386352,119408158,60038798,-1054933210,1025443586,11599871,-922877324,-1023409883,1962825448,44278011,44238534,1979661567,503717407,-1809936889,520037891,520553157,209043466,44246664,-469106512,61866613,1489232946,1381322842,1476449256,108334396,43390602,171729131,-956429707,43791930,1038832758,175441980,43390522,-889304972,121390315,246679669,281935666,-1269678357,-1174457847,512360449,281871002,985857626,1979882262,-1776907743,986119682,1979882550,1389297173,-1979317832,-1962763714,-1962764786,-855467242,45373968,281935666,-661929123,24464195,57581763,-1073486798,-1073496061,-725601712,1967675402,1407642615,-397061551,112459836,1049231792,-292945254,43388554,43718283,41283130,281919538,1532582493,1381061571,1501269,-655685708,43098192,1476565666,-1868541757,43688450,62178136,281935666,1381061571,-858027]}]],[[{"sector":1,"length":512,"data":[-1979318088,-1962763714,-1693021494,1561382146,-1017423526,58761301,74841916,281874356,43386566,-1761163776,121372674,11751351,1946387134,59686432,376701500,41026620,-5045328,225706812,20719543,-1070463116,-2000813901,43557379,43589256,43728520,-1868364661,38046466,-1962765661,-1801255868,-854608894,-1744422384,-1610124286,-466484584,-379776819,1397817187,-729131694,369356934,45351574,281935666,1482381917,-1974316861,-855264048,-1017619935,134005992,1397801728,1465274961,1030406,1558710155,989626620,1128465525,431229163,1090789837,-1993983308,172443397,-2144045587,796154943,1949253504,96871978,1202997084,-360656758,519539520,567090950,638874143,1946172800,1031808526,1191408640,-970524693,-1975034875,-66459641,410132540,1459620537,103368895,-218364146,1952384942,-2010758393,-538228987,378406,1516134151,-1017619623,992750370,1530805564,-1910604707,-10032934,-1023314657,-1006238178,520320822,321692,-1021376611,116064690,48956082,-919350734,-1073085046,-2142824332,-193723654,41233980,1547489163,792462452,-919345547,-921967893,-771094668,-108327307,76162639,1195771272,-176832502,-1707100989,259588098,-1707035453,259588098,99287666,-117439768,1052004547,-1017634355,-851332016,163797025,151587081,151587081,151587081,151587081,151587081,151587081,151587081,-2012673783,134744072,134744072,134744072,1191708680,1195853639,1195853639,134744135]},{"sector":2,"length":512,"data":[134744072,858927408,808595760,875704880,825242933,858928688,842019120,134754864,134744072,319951120,269619472,336728592,286266645,319952400,303042832,134746640,151521288,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,101255433,1448235344,119428439,-1962728258,-167768002,268637446,378212212,-1119223806,995098623,-351438854,1477457,113920,1182005819,-466965252,1172555915,613076483,1946287232,839223824,1960814788,1006437128,-336431622,116807461,1967129365,352777740,175440899,-352289816,13690888,-1595407381,1596421120,-96731901,-1946565003,-352317410,352777817,125075459,54869632,17069312,-1962930130,-134213602,116801771,1950417685,4078375,-1977519360,788474397,701728758,1539339600,507202387,208797698,-14016630,-746064338,-1418375127,1050255,116842379,1947206421,270437124,1599993856,1482250846,1364247303,-836020654,-685043340,192399931,1957098492,-8617978,1593209857,-1017620134,788487562,701728758,973304848,17613760,1448300739,1006578428,991786225,-1407748870,1946238023,-12242190,-542577292,1569327733,-3348225,17621364,-1017619618,1431720784]},{"sector":3,"length":512,"data":[-247726294,-96771980,-1392747916,1946238023,-12242418,-542635660,-1545057163,-1153075713,-359978541,1001128118,772569073,1947149527,1959148277,1003522801,-1977649923,-684833019,-210497756,-277559750,326627643,33520768,-1036385164,-259387275,-247739157,1330054774,49004603,-712310516,1482382941,606741699,36316202,1157694731,1330923844,82,1429012666,1465314443,-975664098,76416630,-1912173522,44941100,100727784,60072735,84084641,614662295,47554816,-1962871576,-11204026,-1588568622,-654900523,-1593776920,-1758658524,50832128,-1106870588,-974650707,1595889664,-1161077410,-1477759672,-349351238,760658594,1840946667,-1164383443,-1813303921,918882078,1153893083,-1943946232,1807682124,1095939,648344572,57620165,-1190954049,-1527578599,113712902,60162773,47652492,48826055,512491566,-1348402453,-643610622,-139204606,-1009550872,48694983,-270008320,1508426707,119456724,57620165,-1190954049,-201588711,-400619868,-1326843206,516983763,-717321465,209584898,48434827,179359531,74730236,-109793550,103532427,-1950154027,-717356040,-1962467838,856338632,-230490670,-1946454866,1448199106,12499287,1604645884,29579614,16966406,16978182,16978694,16963846,16975110,16966918,16976134,16976646,16977158,-1006432506,-1945961162,1960709059,478881301,1962933123,-17071347,19268468,63341316,-2084312085,223550,1223164789,1048822775,1962935145,-145823739]},{"sector":4,"length":512,"data":[106374123,45956804,-16414170,1946380558,1360942610,57216651,-141877498,-1527514042,123608921,505332575,-1809936889,-14266365,-1912419042,1492159426,505332511,-1809936889,520037891,-1021377811,-1912136162,637768734,49356543,1448461087,-1909580201,-13857250,1583292370,-1957313699,105286636,24951389,-1957305109,1465261804,-1962508604,1451952734,512634380,-1175966578,526278650,52061,1869505089,1818324338,1869770784,1835102823,1919251488,1634625901,1852795252,2573,0,0,0,0,38816,0,0,1968439296,544170610,1668505936,1126198369,1768320623,1634891111,1852795252,1818838560,1712229,6423040,73865,496968124,451674114,204937,545856312,722075652,336009,545859840,18087942,467081,545849622,18350088,598153,545856678,18874378,729225,545857836,724369420,860297,545860432,692453390,991369,545859980,445448208,1122441,545856422,0,218169344,436279058,1920291840,1344302946,1633907553,1766858860,1277193059,544502633,1701603654,436214304,606741504,36316202,1225065732,536888644,1936876886,544108393,3485237,16711696,2,1572889,131073,142219,730791938,131075,274257,793968642,131077,405333,794624002,131079,536415,794886146,131081,667479,795148290,131083,799659,1024196609,131085,929505]},{"sector":5,"length":512,"pattern":0,"data":[786628612,262159,1060583,1024262145,65554,1252152,730660866,131092,1376540,18481154,131094,1518483,1024327681,131096,1650535,795017218,131098,1781595,1024393217,131100,19672921,747831364,8388909,19803351,760676480,8388911,19934679,820510848,524593,20066027,787677192,524595,20197115,1017905232,8388917,20328369,736886788,5243191,20454970,743374916,196607,65783,1611727586,1179650,204426,1601699993,3538948,6561436,457900044,65637,6691671,458817568,2097255,6822778,1562837072,196607,247,0,858927408,926299444,1111570744,1178944579,0,120466741,1465320027,770]},{"sector":6,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,545850488]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166723584,172493303,177146532,185993998,68382,131088,262159,524302,1048589,2097164,4194315,8388618,16777225,33554440,67108871,134217734,268435461,536870916,1073741827,-2147483646,1,226692420,227020150,217320840]}]],[[{"sector":1,"length":512,"data":[216993038,16518332,15990920,9175293,16646388,15990918,12845310,16646388,15990916,13631740,12845300,15990784,6422783,16253172,15991000,9240831,956236020,16003327,9386239,821952756,15991038,553001214,821952756,15995126,285159679,822052084,-2097929985,8388860,12976360,15728644,11010302,16253168,65680,2556135,16711681,65751,13107455,16711684,65737,885914879,-50395676,98842829,1020133375,-64036,84032973,13435135,16712962,65740,13500671,16711681,65691,15401215,15729406,66977904,14680316,16712702,50069737,15204607,16712956,49938666,10092799,15140090,38,15859966,16187392,16842947,12714231,16711939,16842959,181731326,16646146,14811244,7209214,16646368,14549158,10748158,16646366,14680236,11403518,16646370,14811306,101711871,-956366846,98319,6291710,16646145,65788,15991038,16646145,65688,15466748,16515073,131300,16253180,16515073,65692,5243120,15728641,65600,10486012,15073498,65542,12583166,956170482,15335622,16136446,16580842,15073385,-1357905921,16580836,15597672,11534576,16711916,240,14156024,244,65536,0,0,539885568,1701990432,-14650509,1129530627,3015935,1126178862,1769238127,1063613806,67053600]},{"sector":2,"length":512,"data":[788856665,-11664385,452995332,458119424,538979840,-11402241,1920230660,1919885433,1090780960,1868694783,4158578,1786194,1713401678,543517801,1701667182,1850277934,1768710518,1919164516,543520361,1679848047,1667592809,2037542772,1818838528,1919098981,1769234789,1696624239,1919906418,1818838528,1920409701,543519849,1869771365,1766195314,1663067500,1702063980,1920099616,1174434415,543517801,1914729321,543449445,2037149295,1381323776,1210994498,1409306700,1329746517,1396789280,541868355,1347175752,1279870496,1107308101,1212227705,1196433452,1464672300,1111695404,1245978668,1263542316,1851858988,1464279140,538451968,1635151433,543451500,1634038338,1768910955,2126958,1224998688,1852245247,744845935,1157889824,1634862335,539780467,-12385281,1634036740,1818304626,1633820780,-14668700,83841795,544237931,543976545,778330466,1162037504,1224743763,1919251310,1851859060,2036430713,1869566976,1851878688,1919033465,1886085477,1953393007,538968179,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,1124081696,1948741217,1852401184,1768300644,2123116,661545283,1667309684,1936942435,1867382816,1852121204,1751610735,1835363616,7959151,1095651150,1345209677,536892225,1735357008,544039282,1836213620,1952542313]},{"sector":3,"length":512,"data":[738223205,1852402720,1869881445,1868767343,1701605485,1428160632,544367987,1634038370,539754603,1735357040,544039282,1836213620,1952542313,536896613,2125417,1851867936,1713402919,543452777,1920298867,1713399139,744844393,1953391904,1847620197,1847621477,543518049,544165376,1969382756,1852383335,1629515622,1919950964,1634887535,1953701997,745828961,1853182496,2037276960,7954807,1679847246,1735746149,1718511904,1377840239,1629515381,1635219822,1867382905,1685021472,1701257317,1634887022,543450484,544370534,1936287860,1852402720,1917845605,1634887535,1868832877,1847620453,1663071343,1635020399,1713401449,543517801,1297040128,1128616019,1397703680,1920099616,1864397423,2019893358,1953850213,1124085349,1948741217,1853190688,1965056288,7629166,544173908,2037277037,1818846752,1835101797,1124103013,1948741217,1852401184,1480925284,1768300613,1124099436,1948741217,1634692128,1480925284,1768300613,1375757676,1140869376,1442858496,1275085312,1325420032,1291863296,536887552,1869903169,1769300512,1763730540,1919950958,1701996399,757101427,1124335392,762081908,537198403,-14650769,1920221955,1916939628,-9739931,1869881348,1769497888,1310720116,1310750565,543518049,1850023936,544367988,1701603654,1835093536,536879205,544695630,1701996868,1919906915,1342185593,543716449,544501614,1853189990,1126170724,1634561391,1277191278,543518313,1634885968,1702126957,2126706]},{"sector":4,"length":512,"data":[1852785440,543648102,1701603654,1226833952,1970037614,1142973796,1667592809,1769107316,2126693,1667846176,1766203499,1310745964,543518049,1682251776,1919906921,1650545696,2053722912,536879205,1835627088,544830049,1701603654,1110310944,1392528193,1668445551,1869422693,1768319332,539780197,1969382770,6581353,1651341651,1847618671,1713402991,1684960623,1698963456,1701734758,2035490916,1819239021,536879219,1702129221,1919950962,1684366191,543519349,1701667182,1394606112,1801675124,2053731104,1852383333,1954103840,2126693,1852394784,1836412265,1634027552,1767055472,1763730810,2034376814,544433524,1632444416,1970104696,1699225709,1394634849,543521385,1109421673,1936028793,1159725088,1969448312,1818386804,1766072421,1952671090,544830063,1649352704,1952671082,1919501344,1869898597,1936025970,1428160544,544500078,1701996868,1919906915,544433513,1968447488,544170610,1668505936,1142975585,1667592809,2037542772,1917124640,544370546,2125417,1969365036,1969430644,1852142194,1684349044,1713402985,543517801,544501614,1702257011,538979940,1702256979,1917132800,544370546,1919181889,544437093,1918981120,544499047,1919181921,544437093,544501614,1853189990,1411383396,1701278305,1684086900,1936028260,1868963955,6581877,1869771333,1409294450,543518841,1414092869,544175136,1970562418,1948282482,1968447599,544170610,1668505936,774794337,1850277934,1953654131,1936286752]},{"sector":5,"length":512,"data":[1953785195,1852383333,1769104416,2123126,1802725700,544434464,1953067639,1919954277,1667593327,543450484,1679847017,1702259058,1426079776,1869507438,1965059703,544500078,1679847023,1702259058,1140867104,543912809,1847620457,1914729583,2036621669,544106784,1986622052,4202597,1953067587,1818321769,1936286752,1919230059,544370546,1679847023,1702259058,1140867104,543257697,1702129257,1953067623,1919230073,544370546,1679847023,1702259058,1392525344,543909221,1869771365,1852776562,1769104416,1075864950,1802392832,1853321070,1684368672,1948279145,543518841,1679847017,1702259058,1392525344,1869898597,1869488242,1868963956,543452789,1679847023,1702259058,1342193696,1953393010,1864397413,1864397941,1634738278,7497072,1953067607,1634082917,544500853,1679847023,1702259058,1375748128,543449445,1819631974,1852776564,1769104416,1075864950,1918978048,1918990180,1634082917,1920298089,1852776549,1769104416,1075864950,1684095488,1835363616,544830063,1734438249,1718558821,1413563936,1952801824,1702126437,1917124708,544370546,1701012321,1852404595,539238503,1769366884,973104483,1684955424,1701998624,-14650509,1953383683,83849829,1701345056,1701978222,779707489,1633099776,543712116,1968119808,1953853556,1159725088,544500068,1699225600,2125932,1919243808,544826985,1917132800,544370546,1917001728,1667855465,1159752801,1919906418,1126170656,1768975727,1735289196,1226833952]},{"sector":6,"length":512,"data":[1919903342,1769234797,2125423,1818313504,1951604844,543908705,1701729536,1667592312,543450484,543452773,1713399407,543517801,2125423,1635151433,543451500,1718513507,1920296809,1869182049,1768300654,540697964,1851867904,1663071271,1952540018,1124081765,1948741217,1769109280,1948280180,536879215,1397768515,1310720032,2116949,1380143904,541871183,1986939136,1684630625,1818585120,1768300656,2123116,1868787273,1667592818,1702240372,1869181810,1718558830,1818585120,1768300656,2123116,1884645200,1147621423,1733296238,1409314901,1830842223,544829025,1701603686,1310720115,1830844261,543912801,1984241664,1635085409,2123124,2003127840,1818326560,2123125,1936020000,544500853,1851867904,1646294055,1869422693,1768319332,1107321957,1981834337,1702194273,1277173806,1818322789,1851879968,2123111,1919252047,1953067639,1107304549,1981834337,1702194273,1277173806,1818322789,1919903264,544498029,2021160994,2037987960,2259321,1869771333,1634934898,1735289206,1667854368,1768693867,1157657715,1919906418,1986097952,543649385,1718513507,1920296809,1869182049,1377828974,1835101797,1330520165,1162690894,1277165600,543449455,1701603654,1835093536,1224745061,1919251566,543973742,1869771333,539828338,1634036816,1914725747,1919905893,1869881460,1919894048,1684955500,1769497856,1919230068,544370546,738205757,1852405536,1869771365,540876914,1920291840,1344302946,1633907553]},{"sector":7,"length":512,"pattern":538976288,"data":[1866661996,1769109872,544499815,539583272,859322673,959520812,1646278968,1866596473,1851878514,1850286180,1852990836,1869182049,745300334,1668172064,1816723502,1634166124,1768300652,1847616876,979725665,1699872800,1696621665,1919906418,1869881344,1634476143,778397554,1918115872,1633906293,1426089332,1818386798,1869881445,1701867296,536879214,1684104530,1869365792,1176529763,544042866,1701603654,1461714976,1702127986,1869365792,1411410787,1766203503,2123116,1111565358,1178944579,1246316615,1313688651,1381060687,1448432723,1515804759,858927408,926299444,6240568,544501582,1970237029,1914726503,544042863,1763733364,1919251310,1702109300,1308652664,1696625775,1735749486,1869750376,1948282223,1684086895,1635197028,6841204,1684291872,1952536352,2123875,1768178976,1633099892,543712116,538987264,1229210880,542265172,536879130,538976288,538976288,1950556192,1110273138,1801545074,544175136,1953068401,538976288,538976288,538976288,1767984384,1768300654,3827052,1886220099,1852402793,1409301095,1818326127,538976288,1701603654,1852394496,1663071077,1768975727,979658092,538980384,538976288,3153952,1767994945,1818386796,1701650533,2037542765,536879162,1344282656,1936942450,2037276960,2036689696,2105376,538976288,538976288,538976288,538976288,538976288,538976288,1936028240,1851859059,1701519481,538976377]},{"sector":8,"length":512,"data":[538976288,1967325216,1852142194,1768169588,1952671090,544830063,1124081722,1701999221,1713402990,543517801,538976288,2112032,1701603654,2053731104,538976357,538976288,540680224,1397572864,1634956576,538994023,538976288,975183904,673185824,980967757,1766588448,544433518,1886220131,1684368489,536879162,1886220099,1852402793,1869881447,1936278560,536879211,1886220099,1852402793,1869881447,1835355424,544830063,1394614272,1701012341,538997619,538976288,975183904,1126178816,762081908,1634038338,538976363,975183904,1685013248,1763704933,1869488243,1986076788,1634494817,778398818,1852776448,1936286752,1763704939,1701650542,2037542765,1936269312,1634038304,1948285284,1970413679,536882798,1914729321,1768844917,3041134,1935763488,1836016416,1952803952,1914725477,1768844917,3041134,1954112032,1124103013,543515759,1702521203,538976288,538976288,538976288,538976288,538976288,538976288,1952531456,1769152609,538994042,538976288,538976288,538976288,538976288,538976288,1392517152,1801675124,2053731104,538976357,538976288,538976288,538976288,538976288,538976288,1852394752,1836412265,1634035744,1769152624,538994042,538976288,538976288,538976288,1291853856,1835628641,1746955637,544235877,1702521203,538976288,538976288,538976288,538976288,1853182464,1835627565,1919230053,544370546,1701080931,1342185504,1919381362,1696623969,544500088,1701080931]}]],[[{"sector":1,"length":512,"pattern":0,"data":[538976288,1381323776,1412321090,19536,0,0,-641679398,-1262242876,-641678654,-1262242876,-641678653,-1262242876,-641682238,-1262242876,-1127695415,-1177765171,-641682237,-1262242876,774766850,-65490,340852737,0,0,0,5224,0,0,341573632,0,0,0,3026478,707657770,65536,-15118336,255,0,0,0,0,-167419648,2132249,-1610612736,673220891,2069715753,574504061,673654562,19474986,-1994776831,-1994776544,553713952,572557594,18909466,-1994775807,-1994775520,620822816,639666458,18909466,-1994774784,-1994774496,687866144,706775322,35686682,-1994773760,-1994773216,32,0,0,16777216,-256,255,16776704,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,5199,445582339,450830473,1095442569,1097859072,444923904,1099767945,0,0,0,545856015,545856678,-65536,0,1117388800,1125253120,0,0,0,0,8]},{"sector":2,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,439287808,8329,1396789294,65536,1296367616,1482184781,12376,1330511873,1162690894,-65536,0,0,707002368,639642148,606479910,-201317334,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16776960,256,825229312,892613426,959985462,1145258561,973096517,0,1431568394,776946258,20564,293666815,297472419,301404632,303501784,306909741,310121063,313070227,314905048,453841638,131072,-16776449,37486594,196352,1073742399,37552130,142592,1124074093,40894466,148480,771752467,35717122,137216,1560281706,40632322,139264,1107296833,39911426,156928,805306942,40108034,157184,1610613343,16646146,131063,196596,-196616,-131083,-983068,-524303,-2031649,-1966115,-65546,-1900561,-1245203,-1441814,-1835029,-1114136,-1638425,1208025052,1280,402739200,1258291456,33559298,67325184,852736,83892996,17385216,1325402368,167773706,302729472]},{"sector":3,"length":512,"data":[1358957312,201327372,885760,527990,106037256,117920512,1640192,486542876,1190400,939528989,256180244,1132032,593978,554631200,1441791,-2080369033,393543702,1537536,1023475293,-197394187,16531456,1057023085,-264044296,15822848,1778448196,-295304970,15416832,1610671967,-362741530,15548672,1677782082,-379256600,16464640,1812003432,-585039633,14553600,771809043,-518520608,14888960,788587040,521601054,16592128,56574,1917695,0,0,65535,0,0,0,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131073,262147,393221,524295,-65536,65535,-1,-65536,65535,-1,-65536,65535,-1,-65536,65535,-1,-65536,757137407,1869357101,1713398881,543517801,2108717,0,0,0,0,0,0,0,0,757932032,1634692128,1768300644,757097836,8237,0,0,0,0,0,0,0,0,539831584,1684107116,1818846752,757932133,32,0,0,0,0,0,0,0,536870912,1814048045]},{"sector":4,"length":512,"data":[543449455,1701603686,539831584,0,0,0,0,0,0,0,0,757071872,1869357101,1713398881,543517801,2108717,0,0,0,0,0,0,0,0,757932032,1634692128,1768300644,757097836,8237,0,0,0,0,0,0,0,0,539831584,1684107116,1818846752,757932133,32,0,0,0,0,0,0,0,536870912,1814048045,543449455,1701603686,539831584,0,0,0,0,0,0,0,0,757071872,1869357101,1713398881,543517801,2108717,0,0,0,0,0,0,0,0,757932032,1634692128,1768300644,757097836,-771743699,941557022,-1642108129,69194015,1780496160,1409286176,1329746517,1262702638,707657728,1347694080,1381323776,1412321090,1431568464,776946258,4932432,2097169,2949136,742064128,1044130621,1566253692,1056973312,6029354,116,1024,1040,1125,1159,1192,0,0,0,0,1,1672806400,65536,65536,2112000,2097159,45,720896,0,131073,0,131072,1310740,131091,1179666,131073,327685]},{"sector":5,"length":512,"data":[393217,458759,393223,524296,393224,589833,589833,655370,655370,720907,720907,786444,786444,851981,851981,917518,917518,983055,983055,1048592,1048592,1114129,1114129,1376277,393217,1441814,1441814,1507351,1507351,1572888,1572888,1638425,1638425,1703962,1703962,1769499,1769499,1835036,1835036,1900573,1900573,581902928,591930107,599663460,606348302,591930417,613688356,581837998,618734793,622535938,631579965,643180008,646456149,658974431,669984666,681912415,1174667040,755302193,1886152008,67051552,83834182,1869568557,-14671763,-13220349,2001939716,1751348329,67051552,83834694,1634882605,538994019,944112639,1395459327,544236916,1174667040,755302201,1701536077,67051552,-13618874,1699556612,536900974,1398670335,1278018815,544499301,1577320224,755302212,1751607634,-14671756,-12231165,1884630276,67051552,83843166,2003780653,-14671762,-12493309,1867001092,538994029,1180566527,1160578303,536896622,980708417,1174667040,755302193,1953718604,1818585120,-14671760,-13416957,1766862084,538995555,910558207,1395459327,544235895,1174667040,755302201,1886220099,543517801,1476656928,1160578303,7629176,1174667040,755302193,1886152008,67051552,-10259643,1648438532,7631471,1577320224,755302227,1952867660]},{"sector":6,"length":512,"data":[67051552,83838046,1734955565,538997864,1197343743,1143801087,538995813,1214120959,1110246655,1936417633,1701011824,67051552,83843422,1818575917,1852402720,-14671771,-11379197,1699884292,1919906931,-14679963,-13548029,1699228932,538996844,877003775,1311573247,1830844261,543912801,402915104,-15001063,1749232900,1702063983,-14671840,-641451005,1395459327,1667591269,-14671756,1668498691,1093469439,1953656674,-14680032,1953251587,-13547987,1632382212,1746957427,7367781,1174667040,755302193,1886152008,67051520,83833158,1818576941,1852383344,544761188,402915104,-15066343,1766862084,1948281699,1667854447,67051552,-2505668,1866935556,544175136,1768976244,-14671773,1668498691,1160578303,544500088,1886152008,67051552,755302211,544503107,1632641062,6648947,1986089760,543649385,1953064005,1176531567,543517801,539893806,1277165614,1768186223,1159751534,1869900132,1766203506,773875052,773860896,1632837632,1735289206,1667846176,1766203499,773875052,773860896,1632837632,1735289206,1852785440,1969711462,1769234802,1176530543,543517801,539893806,1277165614,1768186223,1344300910,543908713,1701603654,773860896,536882720,1684107084,543649385,1718513475,1920296809,1869182049,1766203502,773875052,773860896,67051520,83833158,1818576941,-14671760,-13285885,1868180740,538996079,910558207,1395459327,1668573559,-14671768,808535555,1294796031]},{"sector":7,"length":512,"data":[544566885,1224998688,83850094,1684291885,67051552,-9673404,1698966788,1702126956,67051552,-2505668,1682255108,1998615657,1751348321,67051520,83838302,1851871277,544240928,1577320224,755302232,544104784,1853321060,67051552,83841886,1851871277,1717922848,-14671756,-12296701,1632644356,1769087086,7628903,1174667040,755302193,1886152008,67051552,83834182,1869568557,-14671763,-13220349,2001939716,1751348329,67051552,83834694,1634882605,538994019,944112639,1395459327,544236916,1174667040,755302201,1701536077,67051552,-13618874,1699556612,538998126,421004287,83827227,1851871277,-14680032,-13548029,1699228932,538996844,421004287,83827482,1919111981,543976559,67051552,-2505668,1767255300,1663072101,7105633,1174667040,755302193,1886152008,67051552,83834694,1634882605,538994019,944112639,1395459327,544236916,1174667040,83832881,1852132653,-14671755,1111577603,1127023871,1701602169,67051552,-2505668,1984244996,1635085409,536896884,826672127,1210909951,544238693,1174667040,755302199,1667330644,-14671771,-13089277,1951608068,538996837,826672127,755302192,1970169165,67051552,-12435116,2034445572,543517795,1006894880,83876292,1635140909,1952544108,-14671771,83827203,1919896877,1702109285,536900728,826672127,1210909951,544238693,1174667040,755302199,1667330644,-14671771,-13089277,1951608068,538996837]},{"sector":8,"length":512,"data":[826672127,755302192,1970169165,67051552,-12435116,2034445572,543517795,1006894880,83876292,1886339885,-14679943,-13548029,1699228932,538996844,927335423,1412236543,1701011826,67051552,83834950,1702122285,-14671760,808535555,1294796031,544566885,1409548064,83837505,1668891437,538994028,-1002699777,755302361,1768189773,536901990,826672127,1210909951,544238693,1174667040,755302197,1836019546,67051552,83834438,1769427757,543712116,1174667040,755302199,1667330644,-14671771,-13089277,1951608068,538996837,960889855,1294796031,543517537,1174667040,83832881,1852132653,-14671755,83827203,1919896877,1702109285,536900728,421004287,83827227,1987005741,1969430629,1919906674,67051552,-10259643,2017799428,1126200425,639661173,1935757344,1830839668,543515759,1107558176,1110246655,1852401509,1953850144,67051520,437983512,1294796031,543520367,1936880995,538997359,1933902847,755302243,1953069125,1953841952,1344284192,1702130529,1685024032,-14671771,83837443,1734689325,1663069801,538997877,-1002699777,755302361,1953718608,1702109285,29816,510727959,387927575,2132770583,1886396238,7434255,1887403776,28784,1886650368,1325400095,48,1886388224,28687,1313296128,7631951,1880060016,1879048192,7348080,117899264,1879508848,1879508751,259002119,124784399,251658255,117903119,7,7341839,7343872,0]}]],[[{"sector":1,"length":512,"data":[124784399,251658240,462607,1886388224,28687,1886416896,7,259000071,118452239,252145671,252645135,462704,252645120,7,118423552,251658352,112,252641280,1904,118427392,15,124784399,251658240,1011727,687865856,-60622,16778752,69711,117506336,-15523543,459007,102190864,16785409,322513166,83951615,356517135,1,2701312,16776960,1191708933,536871186,689242112,-60608,169739520,331050,822083584,-15513303,503644415,84748810,0,10524,83951615,407836672,2097152,2694144,16776960,1326991365,536870936,689700864,-65536,407110912,6216,469762080,-16777175,1057292543,1590296,8192,10538,83951615,6203,18874369,1361654016,16776979,657925,536872192,691994624,-60574,118751231,332603,822083616,-15513303,184549375,83886090,8192,10517,-1,255526675,1049861,1848196864,-237,1191381503,536872215,0,-60548,54853631,16848462,32,-16777216,16777215,17446656,8193,538976256,32,1946185743,258998272,7633008,1880060016,1879078008,2020609904,1886388340,1954050063,1879048192,983047,124782336,117444367,252145671,117440527,252643184,1879506944,986887,2013724672,671117312,2021132152,2021130352,1886943239,125304832,7370872,2013755392]},{"sector":2,"length":512,"pattern":0,"data":[-150966152,-30016715,305530677,506861878,758523446,1144404790,3557686,16777216,16777216,36408064,-1926532352,1929380395,36409131,-1859423488,1929380395,37555755,254505728,1929380413,973086251,-184541666,842419810,1026,9109504,53753438,4,35584,33554432,65535,65535,33554432,11201,56,736890789,131076,239285873,-1694236157,-2113894613,50545974,731186178,915472518,33753922,-2060738300,1412865536,67502861,8989680,22689447,-1492909564,-1275033045,51139382,735511552,139,-16646144,-16776961,255,-133824512,43]},{"sector":3,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1392508928,1143754512,1845501440,1143771920,2113936896,-2144545009,-1711268352,-2144512240,-2063589888,-2144479472,-1073734144,50746422,777454598,919928869,100862277,-1909563644,1228335616,67502858,9383527,123025151,1862534659,335581230,50876215,779551750,925434001,67309392,-1842628348,3619072,1090781184,11197,0,16776962,16776960,0,3047175,4194304,0,822086144,876098358,805306368,0,905969664,909325621,503316528,137292560,872416768,137294608,1358956032,137296656,1275069952,34820919,788726790,928448641,100799820,-2110846204,1211590400,67502612,8597267,0,16776962,16776960,0,3087107,16777216,256,256,256,16777216,16777472,36655360,1395356416]},{"sector":4,"length":512,"data":[1929380399,36656427,1462465280,1929380399,36657451,1529579264,1929380399,36658475,1596686080,-2097151441,36659499,1663792896,1929380399,36660523,1730900736,1929380399,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1324354304,251691055,1379366656,67240452,7679849,39008134,1862533634,-1795131857,33900855,796197890,933363831,33687366,2049932036,1329050112,67240461,12267399,138491843,-2130443774,-838805201,33969719,797770754,937558139,33687874,2083492612,1312290048,67240460,8204185,239417352,-1627127294,302037551,35406904,799343618,941883512,34276940,-1204835580,1127756288,201720323,8335409,189610054,1006895106,32815,33554432,65535,65535,234881024,12345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1347694122,0]},{"sector":5,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,820514646,128,828903280,80,146700,905390971,136783,-1308622832,1396200192,268435991,11730944,407910492,1048578,1677767680,35210296,4096,181,-16646144,-16776961,255,-838598656,1832717617,35278136,838472707,947257526,33688140,2117191700,0,-65024,-65536,0,839844352,948043776,135235,1932579588,1278774016,67109403,12005925,289749138,973340674,-1644133332,51397688,785122304,950665255,100798288,-1791903732,1396225280,67109637,2686976,72497346,-1065089533,10289,16777216,65535,65535,117440512,12858,67116754,1,83888384,17104927,0,523763721,67072,150994944,2059008,263,589824,134225822,1,-788526848,17367071,0,537133065,68096,150994944,2111232,267,589824,201334890,1,-1660942080,17629216,0,953352201,131072,-16777216,255,-1677656064,436207666,1348962063,620756992,1346133007,-503316480,16862264,1024,955187211,66384,154339844,1312357376,67109137,786432,39008512,262145,218107136,17717049,857703430,957743119,100732740,305342340]},{"sector":6,"length":512,"data":[1127817216,67109136,1245184,307181867,1,872420352,-175815,1024,21,-16711680,-16776961,255,789118976,234881075,3976192,36940544,1093368576,167854905,0,961609833,656973,1778384896,1111056640,2567,7077888,38025575,-1392246262,1929407795,168314425,1024,964558958,67765584,1882433316,1194953728,2564,7405568,0,16776961,16776960,0,3388167,1094292736,67111937,10485760,38025648,12,-1124029952,201540921,1024,969408683,787538,-1409286144,3537408,17104896,0,89405915,12,-167731968,201737017,0,973865119,788310,-1392508928,0,-65280,-65536,0,873793536,268894208,5269841,975241216,139086,-1090519040,1396319744,544,12582912,557922860,2,49408,33554432,65535,65535,50331648,731067530,38091315,11,1224776192,184632122,0,979304601,101385030,-1540062580,1228566016,335675934,12397491,491993731,-1391197694,-1744782293,184894522,883622915,984154288,722002,-1358954496,0,-65280,-65536,0,884999936,985202688,590162,-1526726656,1346031360,2307,11010048,38222565,9,-83843328,151278650,0,990970011,591187,-1677721600,1429939968,1028,12451840,0,16776961,16776960]},{"sector":7,"length":512,"data":[0,3482118,1178287360,256,668562,4537154,6,1191185920,151015995,895746048,994771047,655427,1748238336,1329287936,512,7484039,4471643,218103819,1627428405,201343547,879558656,174,-16777216,-16776961,255,2030501888,53,257,0,0,0,0,0,1325400064,1325426278,1867710574,1635218534,939550066,792148016,942813240,1699545143,2037542765,1936278528,1699872875,1702388076,1951596644,1952672114,1869107968,1126200434,1969451625,1124103273,1819307375,6648933,1702132034,1919899392,892469348,1852402720,1768169573,1634496627,859046009,540030255,1701734764,1936286752,2036427888,1852785408,543648102,1869903201,1986097952,1682243685,1629516905,544175221,1702257011,1667318272,544241003,1701603686,1632895091,1769152610,1509975418,544042863,1684957559,7567215,1701995347,1931505253,6650473,1651668308,538976367,1768169504,1952671090,981037679,1163412736,1411393056,1679840592,1667592809,2037542772,1850277946,1685417059,1768169573,1952671090,1701409391,1426078323,544500078,1679826976,1667592809,1769107316,3830629,1701470799,538997859,1701996900,1919906915,980641129,1667846144,1768300651,1847616876,979725665,1920287488,1953391986,1667854368,1768300651,3827052,1667331155,1769152619,1275094394,538998639,1885431144,1835625504,1207989353,543713129,1885431144]},{"sector":8,"length":512,"data":[1835625504,1375761513,1701277281,1701339936,1852402531,1951596647,543908705,1667590243,1735289195,1328498944,1701339936,1852402531,1866858599,543515506,544366950,1819042147,1984888947,1634497125,1629516665,2003790956,1090544741,1852270956,1952539680,1633026145,1953705330,1735289202,1701339936,1852402531,1866596455,1634036847,1986338926,1635085409,1852795252,1836404224,1667854949,1869770784,1936942435,6778473,1819635013,1869182049,1698955374,543651170,1868983913,1952542066,7237481,1633906508,2037588076,1819239021,1866662003,1953064046,1634627433,1701060716,1701734758,1699545203,2037542765,2053731104,1392538469,1701668709,7566446,1818391888,7562089,1635018052,1684368489,1885424896,1818846752,1766588517,1646291822,1701209717,1866662002,1818849389,1275097701,1701539433,1850015858,1869769078,1852140910,1766064244,1952671090,1701409391,1632632947,1701667186,1936876916,1986089728,1886330981,1852795252,1699872883,1701409396,1864394102,1869182064,536900462,1701012818,1713402990,1936026729,1867251744,538993761,538976288,1342190406,543908713,1953251616,3360301,7824718,1702256979,538976288,843456544,1769101056,1948280180,1766064239,1952671090,7959151,1851877443,1679844711,1325429353,1752375379,7105637,1953068369,1092624416,1479373932,1836008192,1701603696,1816207392,960900468,1801538816,538976357,538976288,960897056,1769292288,1140876396,1769239397,1769234798]}]],[[{"sector":1,"length":512,"data":[1174433391,543452777,1869771365,1917845618,1918987625,1768300665,3827052,544499015,1868983913,1684291840,1952544544,538994787,538976288,538976288,1819440195,3622445,1701602628,1998611828,1751348321,1768178944,1635197044,6841204,1869440338,1629513078,1998613612,1751348321,1409315685,1818716015,1919033445,1886085477,1953393007,1950556192,1177382002,1816330296,544366949,543976545,1634038370,1768910955,7566446,2003134806,2019913248,1919033460,1886085477,1953393007,1852788224,1834156133,7631457,1635216449,1157657465,1970037110,543519841,538976288,1920221984,877014380,1818313472,1953701996,543908705,1126178848,762081908,1174418246,543452777,1668248176,1920296037,1850277989,1919378804,1684370529,1650811936,1768384373,1392535406,1684955508,1852796001,1701060709,1734833506,6778473,1886611780,544825708,1885435763,1735289200,1717916160,1752393074,1936286752,2036427888,1853182464,538976288,538976288,1126178848,762081908,1342191942,1919381362,1914727777,1952805733,1920221984,843459948,544163584,1663070068,1869836917,538976370,538976288,1409299526,1701011826,1953392928,538976367,538976288,927342624,1702122240,1986994288,538997349,538976288,538976288,1426077766,544367987,1701995379,538996325,1816207392,893791604,1818838528,1682243685,1375761513,1124101749,1768975727,1325426028,1869182064,1140880238,1735746149,1701986816,1999596385,1751348321,794361856]},{"sector":2,"length":512,"data":[249102336,12127,1024331469,247922688,12131,794234581,248053760,12117,795283141,248446976,12129,794496721,248709120,12113,793972419,224198656,12125,3787,248971267,143083,787677184,2,143099,800129024,1,262144,612040704,2894592,2097163309,612043277,2097160269,536873485,612040763,1229342020,2114894,8192,83886080,0,0,1095773738,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2764330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,687876128,1345202688,687887169,8250,16777216,117440512,1196380752,105726290,1414748499,8080709,8061051,8061051,8061051,8061051,3211312,3211312,707002492,707013156,84216321,1347243843,1380273225,-1795293184,38011203,72171592,273811536,1079517267,-905953244,-520078438,-1769994763]},{"sector":3,"length":512,"data":[1111490712,-2036334577,655360001,65536000,6553600,655360,65536,100663296,1397705795,1225081925,1414877262,1414876934,72635728,1313165391,1279872515,1381257220,1396900904,1141131077,71779667,1195725651,1279346181,1409566035,88429906,774778408,1850278185,1768710518,1329864804,1969627219,1769235310,1663069807,6644847,1818838530,1869488229,1868963956,6581877,1952534531,1869488232,1868963956,6581877,1869566980,1851878688,1886331001,1713401445,1936026729,1766196480,1629513068,1936024419,1701060723,1684367726,1850279424,1768710518,1768300644,1746953580,1818521185,1309147237,1696625775,1735749486,1701650536,2037542765,1850280960,1768710518,1768300644,1629513068,1936024419,1868767347,251684196,1635151433,543451500,1986622052,1970151525,1919246957,1631784960,1953459822,1835364896,543520367,1920103779,544501349,1701996900,1919906915,1125187705,1869508193,1701978228,1701667182,1919115552,544437103,1986622052,1677751141,1802725700,1634038304,1919230052,7499634,1936278629,1920409707,543519849,1869771365,1181089906,543517801,544501614,1769173857,1684368999,1766221568,1847616876,1864397935,7234928,1818838632,1869488229,1886330996,1713401445,1763734127,1953853550,1766222080,1847616876,1864397935,544105840,544370534,1886680431,1778414709,1635151433,543451500,1701672302,543385970,1836216166,-1778355103,1802725700,544434464,1953067639,1919954277,1667593327]},{"sector":4,"length":512,"data":[6579572,1769096344,1847616886,1914729583,2036621669,1380162048,1919230019,544370546,1679847017,6386785,1936278684,1702043755,1696623461,1919906418,1699978752,1919906915,1953459744,1970234912,-1627364242,1852404304,544367988,544503151,1881171567,1919250529,1698996224,1701013878,1769109280,1713399156,1953264993,1698996480,1701013878,1634038304,1634082916,7629941,1918978210,1918990180,1634082917,1920298089,1153957989,1936291433,544108393,2048948578,7303781,1851871945,1663067495,1801676136,1920099616,-905940369,1667331155,1986994283,1818653285,1696626543,1919906418,1699269376,1864396897,1718773110,544698220,1869771365,1238106226,1818326638,1881171049,1953393007,1864397413,1634887024,1852795252,1816579328,1769234799,1881171822,1953393007,1702260512,1869375090,1187905655,1952542572,543649385,1852403568,1853169780,1718773092,7827308,1986939343,1684630625,1869375008,1852404833,1869619303,544501353,1919250543,1869182049,1339031662,1819436406,1830844769,1734438497,1847620197,1763734639,1635021678,1684368492,1984942336,1634497125,1768300665,1914725740,543449445,1869771365,1339162738,1667590754,1869488244,1852383348,1634301033,1702521196,1375731812,1769238133,1696621933,1919906418,1392771072,4607045,1448038484,1380206918,1546801489,1380010310,-30256815,1380141382,238178641,1380272454,372396369,1381189958,103960913,1381452102,-1573039791,1380010566,1073762641,1380141638]},{"sector":5,"length":512,"data":[-1073721007,1381190214,-2147462831,1380275717,1292186933,1397703763,1431323397,1124415032,926438736,5456208,4544581,5591124,4866639,5259597,5396047,747842639,760687831,1632906711,1952802674,1684300064,1936942450,1970234912,1325425774,1864397941,1701650534,2037542765,1701071104,1718187118,544367977,1701869669,1684370531,1802392832,1853321070,1701079328,1718187118,7497065,1819309380,1952539497,1684611173,1769238117,1919248742,1853444864,544760180,1869771365,1917124722,544370546,1914728041,543973733,1936617315,1953390964,1920091392,1763734127,1852383342,1701274996,1868767346,1635021678,1392538734,1852404340,1868767335,1635021678,1696625774,1701143416,1814066020,6647401,544173908,2037277037,1936027168,543450484,1701603686,1851064435,1701869669,1684370531,1684956448,543584032,1701603686,1852394496,1869881445,1869357167,1409312622,543518841,1852138601,1768319348,1696625253,1667592312,6579572,544173908,2037277037,1701867296,1768300654,7562604,1635151433,543451500,1701603686,1701667182,1818838528,1869488229,1868963956,6581877,1802725700,1819633184,1850277996,1768710518,1868767332,1818849389,1679848037,1667592809,1702259060,1869566976,1851878688,1768300665,7562604,1701080661,1701734758,2037653604,1763730800,1869619310,1702129257,1701060722,1768843622,1852795252,1918981632,1818386793,1684611173,1769238117,1919248742,1886938400,1702126437,1917124708]},{"sector":6,"length":512,"data":[544370546,1948282473,6647929,1970435155,1920300131,1869881445,1634476143,6645618,544499027,1702060386,1887007776,1970217061,1718558836,1851879968,1174431079,543517801,1886220131,1852141167,1830843252,1847621985,1646294127,1768300645,544433516,1864397423,1667590754,1224766324,1818326638,1931502697,1852404340,1701584999,1752459118,1886999552,1768759397,1952542067,1224763491,1818326638,1931502697,1634886261,543516526,1702060386,1887007776,1867251813,544367991,1853189986,1919361124,1702125925,1752440946,1965059681,1919250544,1970233888,1325425774,1852400754,1948281953,543518841,1701869669,1684370531,1953384704,1919248229,1852793632,1851880563,2019893364,1952671088,1124099173,1953721967,544501345,1701869669,1684370531,1953384704,1919248229,544370464,1818322290,1852793632,1851880563,2019893364,1952671088,1342202981,1953393007,1948283493,543518841,1852138601,1768319348,1696625253,1667592312,6579572,1635151433,543451500,1668183398,1852795252,1936028192,544500853,1701869940,1650543616,1763732581,1953391972,1701406313,2019893362,1952671088,1107321957,1313425221,1886938400,1702126437,1313144932,2019893316,1952671088,1224762469,1734702190,1696625253,1701998712,1869181811,2019893358,1952671088,1325425765,1852400754,1696623713,1701998712,1869181811,2019893358,1952671088,1107321957,1701605231,1696624225,1701998712,1869181811,2019893358,1952671088,1325425765,1634887024,1948279918]},{"sector":7,"length":512,"data":[1936027769,544171040,544501614,1668571501,1886330984,1952543333,1157657199,1919906418,544106784,1919973477,1769173861,1224765039,1734700140,1629514849,1734964083,1852140910,1766195316,543452261,1852138601,1768319348,1696625253,1667592312,6579572,1701470799,1713402979,543517801,544173940,1735549292,1851064421,1768318308,543450478,1702131813,1818324594,1986939136,1684630625,1784835872,544498533,1701603686,1667592736,6582895,1701080899,1734701856,1953391981,1869575200,1918987296,1140876647,543257697,1835492723,544501349,544173940,1735549292,1329856613,1886938400,1702126437,1850277988,1768710518,1431314532,1128877122,1717920800,1953066601,7237481,1635151433,543451500,1381259333,1701060686,1768843622,1852795252,1869566976,1851878688,1480925305,542003796,1768318308,1769236846,7564911,1696613967,1667592312,6579572,1163152969,1128351314,2019893317,1952671088,1224762469,1818326638,1914725481,1668246629,1650553953,1914725740,1919247973,1701015141,1162368000,2019893326,1952671088,1409311845,1919885391,1464812576,542069838,1701869669,1684370531,1684952320,1852401253,1713398885,1635218031,25714,1635151433,543451500,1701869940,1935762208,1766064244,1769171318,1646292591,1702502521,1224765298,1818326638,1713398889,543517801,1701869940,1851867904,544501614,1684104530,544370464,1953067607,1635131493,1650551154,544433516,1948280431,544434536,1701869940,1768902656]},{"sector":8,"length":512,"data":[1919251566,1918989856,1818386793,2019893349,1952671088,1392534629,1852404340,1635131495,1650551154,1696621932,1667592312,6579572,1769108563,1696622446,1701998712,1869181811,2019893358,1952671088,1124099173,1969451625,544366956,1953066613,1717924384,1852142181,1426089315,544500078,1701667182,1936289056,1668571501,1851064424,1981838441,1769173605,1830841967,1634562921,6841204,1768838400,1768300660,1713399148,1634562671,1919230068,7499634,1280331081,1313164613,1230258516,1696616015,1667592312,6579572,1936617283,1953390964,1684955424,1396785952,2037653573,544433520,1847619428,1830843503,1751348321,1667584512,543453807,1769103734,1701601889,1886938400,1702126437,1866661988,1635021678,1864397934,1864397941,1634869350,6645614,1701603654,1918989856,1818386793,2019893349,1952671088,1342202981,1953393007,1696625253,1701998712,1869181811,2019893358,1952671088,1224762469,1734702190,1864397413,1701978226,1696623713,1701998712,1869181811,2019893358,1952671088,1275094117,1818583649,1953459744,1953068832,544106856,1920103779,544501349,1668246626,1632370795,543974754,1701997665,544826465,1768318308,6579566,1701080661,1701734758,1634476132,543974754,1881173609,1701012850,1735289188,1635021600,1701668212,1881175150,7631457,1635151433,543451500,1918967872,1701672295,1426093166,542394702,1701869669,1684370531,574300672,1886938400,1702126437,975306852,2019893282,1952671088]}]],[[{"sector":1,"length":512,"data":[570451045,1696604716,1667592312,6579572,539109410,1701869669,1684370531,573121024,1886938400,1702126437,1025638500,2019893282,1952671088,570451045,539114810,1701869669,1684370531,576397824,544370464,573450274,1886938400,1702126437,1562509412,1919885346,690889248,2019893282,1952671088,570451045,1696604718,1667592312,6579572,573451810,1886938400,1702126437,1867776100,1634541679,1981839726,1634300513,1936026722,1986939136,1684630625,1380927008,1852793632,1819243124,1918989856,1818386793,1850277989,1701274996,1635131506,1650551154,1696621932,1667592312,6579572,1701603654,1684955424,1869770784,1969513827,1948280178,1936027769,1701994784,1953459744,1819042080,1684371311,1919248416,1951596645,1735289202,1852140576,543716455,1836280173,1751348321,1986939136,1684630625,1685221152,1852404325,1718558823,1701406240,7562348,1769108563,1663068014,1953721967,544501345,1701869669,1684370531,1953384704,1919248229,544370464,1818322290,1918989856,1818386793,2019893349,1952671088,1325425765,1852400754,1981836385,1634300513,543517794,1701869669,1684370531,1280198912,541412937,1869771365,1749221490,1667330657,544367988,1919973477,1769173861,1696624239,1667592312,6579572,544173908,2037277037,1818587680,1952539503,544108393,1835365481,115,1836008192,1634494832,1852795252,1868718368,1684370546,1396785920,1868767301,1635021678,1864397934,1864397941,1634869350,6645614]},{"sector":2,"length":512,"data":[1869771333,1852383346,1635021600,1701668212,1124103278,1869508193,1633886324,1629514860,1852383342,1920099700,544501877,1668248176,1920296037,1291845733,544502645,1763730786,808984686,1830827832,543515759,1663070068,1768975727,1948280172,7563624,1735549268,1629516901,1701995620,1847620467,1713402991,1684960623,1668172032,1701082476,1818846752,1629516645,1847616882,1629516911,2003790956,1746953317,6648421,1279872512,1886938400,1702126437,1850277988,1768710518,1970348132,1718185057,7497065,1635151433,543451500,1769103734,1701601889,1717924384,1852142181,1409312099,1830842223,544829025,1651341683,7564399,1952543827,1852140901,1634738292,1948284018,1814065007,1701278305,1766195200,544433516,1953723757,543515168,544366966,1634886000,1702126957,1409315698,1830842223,544829025,1684959075,1869182057,543973742,1651341683,7564399,1886611789,1701011820,1868767332,1953064046,1634627433,1768169580,1952671090,6649449,1229213253,1768169542,1952671090,543520361,1936943469,6778473,1869771333,1852383346,1768843552,1818323316,1852793632,1769236836,1818324591,1717920800,1936027241,1634027520,544367972,1936027492,1953459744,1952541984,1881172067,1769366898,544437615,1768318308,1769236846,1124101743,1769236850,543973731,1802725732,1920099616,1124102767,1869508193,1986338932,1635085409,1948280180,544434536,1919973477,1769173861,1157656175,1701998712,1869181811,1852383342]},{"sector":3,"length":512,"data":[1920102243,1819566949,1702109305,1852403058,1684370529,1986939136,1684630625,1919903264,544498029,1667592307,1701406313,1850278002,1768710518,1852383332,1701996900,1914729571,1919247973,1701015141,1920226048,1970561909,543450482,1769103734,1701601889,1918967923,1869488229,1818304628,1702326124,1701322852,1124099442,1869508193,1986338932,1635085409,1998611828,1869116521,1394635893,1702130553,1853169773,1124103273,1869508193,1667309684,1936942435,1768453152,2037588083,1819239021,1986939136,1684630625,1869375008,1852404833,1869619303,544501353,1919250543,1869182049,1631780974,1953459822,1836016416,1701603696,1702260512,2036427890,1869881459,1835363616,7959151,1668248144,1920296037,1919885413,1853187616,1869182051,1635131502,1650551154,1696621932,1667592312,6579572,1635151433,543451500,1668248176,1920296037,1919885413,1853187616,1869182051,1701978222,1701995878,6644590,1852727619,1864397935,1819436406,1948285281,544434536,1953066613,1869566976,1851878688,1701716089,1684370547,1868788512,7562608,1701603654,1667457312,544437093,1768842596,1325425765,1667590754,2037653620,1696621936,1667592312,6579572,1633906508,1651449964,1952671082,1887007776,1629516645,1847616882,1629516911,2003790956,1442866277,1431589449,1696615489,1667592312,6579572,1752458573,1763730543,1953391972,1701406313,2019893362,1952671088,1442866277,1970565737,1663069281,1953721967,1952675186,544436847]},{"sector":4,"length":512,"data":[543519329,544501614,1869376609,6579575,1936617283,1668641396,544370548,1852138601,1768319348,1696625253,1667592312,6579572,1953719620,1952675186,1763734127,1953391972,1701406313,2019893362,1952671088,1174430821,543975777,2037149295,1819042080,1684371311,1953068832,544106856,1936617315,1668641396,1936879476,655360000,6554600,65546,858927408,926299444,1111570744,1178944579,1951604782,544502369,1869894432,538976368,1735288140,1310746740,543518049,538976288,538976288,538976288,1816338464,74675041,1162104643,1413563396,1414726977,72041281,1346454856,541601795,807421955,572540930,1681989664,1936028260,538976371,538976288,1968185376,1667853410,2036473971,1818318368,1276208501,543518313,1651340654,544436837,544370534,1931487498,1701668709,471889006,1735357008,544039282,1920233061,1869619321,544501353,807433313,976236592,1392787457,4607045,0,67108864,65536,-2147483648,2147483647,83886080,131072,0,-128,100663423,262144,0,-8388608,142606335,65536,0,-16777216,150994944,131072,0,-16777216,167772415,262144,0,-16777216,234881023,262144,251658240,524288,268435456,655360,234881024,393216,671088640,65536,201326592,65536,0,-16777216,117440512,524288,184549376,524288,721420288,655360,637534208,16777216]},{"sector":5,"length":512,"data":[654311424,8388608,369099008,262144,50331904,16777216,587202815,262144,587202881,262144,587202885,262144,587202817,262144,587202821,0,134217991,134744080,134744072,268961800,269488136,773725184,623060519,235733782,688662533,16843053,18356481,18553345,319947025,33554433,50331649,1,10,100,1000,10000,100000,1000000,10000000,0,-1094967296,16409,-910228480,1077186075,728806814,-1647989336,-1495973783,524943311,1087619704,-2132177696,-1816508471,-561102424,-335831559,1129425534,-1508994617,-484859730,202852003,1971749237,1296615798,-985834011,-1635042467,-1751426414,1375898144,1965409376,0,-1094967296,147481,65540,262146,1,65536,131073,2,262144,262148,1,1048576,1048585,16,524288,524292,524297,1812004880,-690486826,30870785,3200804,924893184,959590710,808596789,16776704,-33619984,-124113412,33554688,134218752,805310464,16384,16771584,1297040368,5325136,0,0,-438566912,-438508068,0,538976256,538976288,555819040,539042081,538976288,538976288,538976288,538976288,1077936416,1077952576,1077952576,1077952576,33686080,33686018,1073873410,1077952576,336871488,336860180,67372036,67372036,67372036,67372036,67372036,1077952576]},{"sector":6,"length":512,"pattern":0,"data":[404242496,404232216,134744072,134744072,134744072,134744072,134744072,1077952576,32]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]}]]]
      • fd2.json
        [[[{"sector":1,"length":512,"data":[1183861995,1147495794,2118479,66050,1073770498,130305,65544,0,0,2686976,536870912,538976288,538976288,1095114784,540160340,6299680,65543,196608,655360,-50724864,-795951055,12441742,-530150020,612270331,-2013039105,-524802986,-1983869409,-1175483922,-1510801152,-528713238,-1898410465,14215376,1701147206,5459780,-1958328693,2123057238,-941936320,6307398,-398571890,946995394,196738865,2113125888,1604776791,440765222,-947713164,1031808544,1927771392,-1746382737,1095114752,1183711316,-1948569282,1183520382,1146522434,1476430312,102650482,12519199,-964056288,-972950015,1940778705,-754667260,266633448,1913649213,-1413467672,1474830094,1699422208,1818586738,1044811264,12507953,-1073107680,1212689268,-2129822069,-150929433,1246102503,-397650413,-445448138,218114536,1330594314,1919230036,805314930,-854143516,1370137,558843680,1586102304,59940,-617545632,281874100,1012313182,-1007454976,1397772886,-1430568524,609651285,829739652,762450893,-1437209727,-372168843,915219315,1552514461,240945420,1381652571,138709328,-1995811703,1150026844,-347950074,16781357,1515739904,-1970188206,1727404102,-235433702,410449554,-964111991,-909055610,1183500752,-18864104,-1193211708,1451885057,1930677540,-840683512,-346400749,190710664,-1064564877,-1911503744,-2091231040,-763166272,-411742464,1271095032,1162760773,1394614348,-1437248679]},{"sector":2,"length":512,"pattern":0,"data":[16777213,1610940480,8390400,184590345,-536018752,16781056,318840849,1611989312,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-533921088,1048322]},{"sector":3,"length":512,"pattern":0,"data":[16777213,1610940480,8390400,184590345,-536018752,16781056,318840849,1611989312,25171713,453091353,-534969920,33562369,587341857,1613038144,41953026,721592361,-533921088,1048322]},{"sector":4,"length":512,"pattern":0,"data":[1112692052,538976335,541872212,229507072,1179731537,229507072,214609,44352,1296912357,541347393,5066563,1671188736,11851,-1297874944,2829677,87396,1162037733,541414222,5527636,1671189248,11851,1079771136,8464599,18427,1330927077,1128618053,5521730,1671188224,11851,-1417347072,9645642,67]},{"sector":5,"length":512,"pattern":0,"data":[]},{"sector":6,"length":512,"pattern":0,"data":[]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"pattern":0,"data":[]}]],[[{"sector":1,"length":512,"pattern":0,"data":[]},{"sector":2,"length":512,"pattern":0,"data":[]},{"sector":3,"length":512,"data":[1329798123,1195984462,16777235,1962999810,1702065518,101124196,33752069,-1612519167,-1102067527,-141975666,-2135578338,84265100,98078208,-1064434136,-56232963,309100590,-1830325488,235842991,119473678,376086,1434472379,1481659851,50531105,1261724426,816337475,16669587,-570384684,-939523841,1124985855,1229344335,392007,33685760,-1672261505,-15846984,-855576389,1482398992,1997859511,45579,2077204264,2013259776,-840250624,-50219626,-369070360,131203406,1582354278,-218427540,1324601174,1190322732,-1778320666,913918270,783783783,874686215,-2020165338,-1647501659,1784878745,1392770996,1730084654,-872719616,-185924428,218066191,776996606,7937678,-2046425893,312557174,104539903,678756368,-234747284,69061394,313660476,789972687,-1217684985,-1007999232,520575231,1048653507,1968993895,1762191625,1342665918,502232474,61919064,-486482825,921220870,-83893590,822246633,-7983424,134275078,-854166080,-1073146113,4058996,41285490,2064650416,646458885,-1605608679,-619372957,1948254644,1965169335,-351834620,-14237206,-1658927826,222791682,36891135,-402504727,-385811197,-970063319,771772630,-466614723,-1007407905,-14229533,-850983542,-369565143,1864305075,1465274503,-1269606913,-1291798770,1532500743,1583308269,-915775331,-255387875,30992641,1397222272,-351945801,-1308349352,1275644754,-1307831956,1074842438,984749100,741611723,-886132196,606873632]},{"sector":4,"length":512,"data":[684401330,-1305727972,271633174,179450924,788805835,-11403204,-930341296,-425600882,104530431,712376808,-1982660724,-367620384,647334657,-459203649,1862674689,-1610638328,-100555529,1484130561,-316633510,-670687292,-1324036261,1344207625,1124090040,1896775807,-648511488,-508113121,-1089697490,-1626960850,1459604226,-351908674,173037127,92657353,1019228385,118418294,-1274957570,1745283842,-1100816894,-904198556,-1318386697,317454111,216788765,-568237541,-1732378601,1208304347,1887128163,-1784458671,-963361150,1887727266,83242623,-618498944,973621130,1719076095,31510936,513276870,-1796896429,1489402726,1425980924,-346466047,18997046,-32675958,-1961734261,-1047063465,-331902162,755924932,-1962842947,-1988252586,-1682697657,57739531,11838299,1482250877,-1928975522,1670507117,1282353431,-152337996,378220252,1858336907,-1058124018,-396947730,1515953157,91104922,60087302,793908400,-94790570,-619302837,657195230,1352487420,1834294866,280168028,922706206,-1660658397,-587047114,-675008855,1181886041,1576824839,-94873057,-1099337413,13344091,-385760944,1807423459,-1163510206,-1223658041,-619858858,-16381660,-370548153,1967914828,1625941757,-1089345281,162592784,552453366,-1157303947,-12184704,-11325321,-2011693107,1009788128,183349296,-2062020492,1958568233,34461220,-985867731,-1994434281,1397882623,-1976640719,-779154658,-1884363849,-386109448,1977483203,-85899746,393501174]},{"sector":5,"length":512,"data":[911560788,0,4195903,211028480,232000972,241503836,283578599,3953819,4320,4194908,0,0,0,0,0,0,101842974,113707124,144705674,159123814,162007442,164891070,154798372,135268842,2106,262144,128,327680,18219264,460361,32,218628096,6422532,591433,18219264,11929161,656969,67764228,101318664,34209800,67829770,17563654,-8388607,8388607,15073280,34342473,1,16711680,15073280,84674121,-2147483646,2147483647,15073280,101451337,2,-65536,15073280,218891849,4,-32768,15106047,460361,11927584,853577,1,65536,16646144,460361,16646176,34473545,1,16711680,18219008,460361,18219040,1609,1111556949,12591187,1090802944,-1135459260,1409286208,1347436806,2084851269,1426140672,1129464070,1817067860,1409286144,1397965062,676218697,1409286144,1330397705,1163021123,9192513,173277184,1129270338,1230133067,9454932,122748928,1280266050,-28425915,411904,1107579136,-1236970407,411904,1124356352,374489416,411905,1124422656,1380533320,27197552,1212351317,12597330,1124422656,1163087692,52,1329792081,10113101,21038665,1329792597,1413563214,20381844,1329792085,9460048,55902678,1750290243,1426154752,1163084548,-2076161977]},{"sector":6,"length":512,"data":[1141068801,8930117,106168320,1162626372,2377044,122945939,1347635524,340087631,1359063808,1431258118,-1773843390,1493584128,1141134593,1279739219,1426186816,1179600131,28704784,1329923157,806476,89391562,1396789829,15429,1157911552,1213483352,1426211328,1347962115,33489012,1480919121,1145980244,10372165,1609,1095107668,10243145,89129559,1397506374,1224801861,6,1426213888,1279870471,1397706821,21823508,1229326421,1230193996,1590618,139723272,1280067910,1380010051,45088856,1279657300,-2142743723,1426225664,1095910916,1627429955,1174885378,1296385362,5262661,106168938,1146373447,7098953,106169056,1297368391,5000517,72614433,1414283592,36634692,1229455957,37339312,1313407828,33588291,1225151491,1380275022,-922738604,1224955138,6313038,122749706,1163152969,-967686841,319179008,1225282819,1397051983,-1739305899,1426158656,1313164294,-2008525753,1426268096,1884179458,1426254848,-1404089342,1358954688,1313819655,1414416711,105447654,72614696,1263681869,43319320,1095567445,1096171864,1082412105,105907066,1230520653,15094862,2147419721,57671680,1095567952,1313819736,1414416711,105447654,2147483647,56099653,-1236449971,1627801856,1292391683,1447120197,-2142484159,1476631104,1296387332,1224795724,1476520966,1296387332,1224791639,1409537286,1145785605,7623241,72614562,1163284301,63504476,1162740566,-1157627817]},{"sector":7,"length":512,"data":[1325618435,-1070578620,55902968,1079199311,1426317632,1146244867,34914356,1095764565,1129136466,1414419791,68223144,1095764053,1397571922,10768980,39126006,12077392,122749651,1313427280,2119320916,-1090107136,1342461697,5526095,89588792,1414680400,53936471,1330643797,1476430931,1342461188,742671698,1426320576,1381257219,59293756,1095894613,1297040462,68812960,1095895380,1297040462,1615157833,1409503488,1095062020,-1979708348,1376146436,1279541573,-1560276914,1376014596,-1572060859,1074153728,1376211972,1095060549,1852755,106169386,1095648594,4212045,89391605,1163085138,2113940564,1376211972,1230133061,3163476,89391961,1229213010,1962965074,1376081156,1145984335,74170492,1431439444,1381123406,9982543,72614911,1262830931,81723448,1163069269,1329941317,-738195386,1393054980,1162560837,72240207,1426305024,1195725571,84951108,1163070036,1480938580,1179992660,83296404,1213401169,1230262863,10900558,84018761,1230177109,889218126,1392922885,1279741513,1224774213,1426373382,1514754822,1481002821,1426327744,1414550276,1312838738,1392727301,2380369,72680068,1414680915,86442076,1397949525,1079002949,55838100,1683117139,1426420992,1129665284,1589651523,1392792837,-1269808809,1359237056,1480938500,1224765012,1342531334,1431458820,1224801861,262,1426438912,1431458821,-1065860274,139724190,1314214484,1163149635,96796756,1498678869]},{"sector":8,"length":512,"data":[1179600208,85606592,1347749461,1163084099,78577692,1096155988,-1728026548,1459900676,-700165553,-1475983104,1459966981,1163151698,99352580,1381435220,1279611977,1644169294,1392924932,1163154265,1627390029,233,1376094976,1381388043,1162104643,1414744396,1,1224791552,1376092422,1381388043,1346454856,1163544915,513,1224791552,1376054278,1381388043,1430406468,1381257287,1025,1224769024,1376145670,1381388042,1346454856,21451343,8,105447638,173147642,1213355599,1347436869,167858772,-704643072,-939112192,1326076420,1162367574,1313165377,786756,14024704,102434377,1448020818,1095715922,1397312580,917844,14024704,46007881,1448021074,1397703762,1145979208,268518732,-704643072,-788117248,1326207493,1296388694,1312901203,21318724,18,105447638,122816063,1346454856,21451343,20,105447550,122816246,1346454856,22172752,24,105447550,122816176,1162170950,22172752,28,105447550,122816296,1162170950,21907789,32,105447638,156370788,1346454856,1330795077,2228562,8257536,103220809,1480919122,1380996169,637616975,2113929216,1007044864,1158173191,1129597272,21316687,42,105447622,156370703,1330795077,1145323858,2883922,8257536,87950921,1380976978,1481197125,21448019,48,105447638,173147654,1128354899,1296649291,838947913,-704643072,1342589184,1225282055]}]],[[{"sector":1,"length":512,"data":[1414877006,22234450,52,105447622,139593266,1145979218,1145390419,13825,1224795648,1376232198,1279870472,1146047813,3801413,11927552,125306441,1163135058,808997971,989935416,-1241513984,-469350144,1225085447,1414877262,0,1224764928,1376276230,1414876934,5526864,256,105447534,156370939,1163280723,810831433,33554480,8257536,110691913,1095960914,1313424726,3289172,516,105447550,156370894,1163280723,827608649,34078786,8257536,126748233,1095960914,1313424726,3355220,524,105447550,156370401,1163280723,844385865,34603060,8257536,115213897,1095960914,1313424726,3421012,532,105447550,156370561,1163280723,861163081,35127349,8257536,95487561,1095960914,1313424726,3552084,540,105447550,156371041,1163280723,861163081,35651639,8257536,129500745,1095960914,1313424726,3683156,548,105447550,156370981,1163280723,861163081,36175929,8257536,107546185,1095960914,1313424726,4272980,556,105447550,156371126,1163280723,861163081,36700226,8257536,147588681,1095960914,1313424726,4404052,564,105447550,156371170,1163280723,861163081,37224516,8257536,150472265,1095960914,1313424726,4535124,572,105447550,156371214,1163280723,861163081,37748806,8257536,156239433,1095960914,1313424726,3487572,580,105447550]},{"sector":2,"length":512,"data":[-1,0,13697024,14155776,16,262168,2031640,9240600,10027032,10813464,24,40,1703976,4063272,4980776,9240616,12124200,17104936,19922984,21102632,22872104,28377128,48,9306160,11403312,40108112,42008656,42991696,46006352,46268496,46596176,46923856,47251536,47579216,32,1572896,3276832,4718624,6488096,10944544,2752560,3735600,5898288,13566000,15401008,17367088,19202096,20709424,5177592,8,458760,1376264,3997704,6029512,3670184,5767352,176,1966240,13435032,15466648,15335640,200,168,184,160,10748056,15466648,14876888,8847448,144,7340176,7667856,13172880,216,3014872,3604696,11469016,232,1507560,208,262352,524496,786640,18415832,18874584,25231576,224,1507552,3277024,44302416,264,9634008,2294000,88,3342424,248,240,120,4915320,136,5898376,256,5308672,9568512,10944768,7995536,12910736,4522128,32702544,35455056,64,393280,1179712,1572928,2228288,2490432,2752576,3276864,786496,5898432,192,128,6488192,2621512,7929928,9240648,16580680,15335496]},{"sector":3,"length":512,"data":[25690184,36765768,47448136,1441880,272,280,304,4194608,6881584,9175344,262200,56,13041720,30146616,37945400,40697912,44826680,96,7995488,104,25362536,10092656,39059568,152,2359448,4194456,6553752,26476544,14417920,786512,9633872,551551264,498073888,48890152,57278760,15990816,28246048,34013184,-65144,5636096,-65480,1572864,-65536,11796480,-65528,50397184,-65160,34013184,-65536,22675456,-65536,50855936,-65536,4980736,-65448,74514432,-65168,47906816,-65176,9699328,-65464,17956864,-65528,54984704,-65488,57802752,-65456,8126464,-65520,9830400,-65520,9371648,-65520,41877504,-65472,17956864,-65472,4915200,-65496,7733248,-65496,3276800,-65512,10551296,-65464,12255232,-65464,11796480,-65464,4587520,-65520,28377088,-65456,9175040,-65512,6684672,-65520,3604480,-65536,8912896,-65520,15073280,-65520,1245184,-65536,1835008,-65480,3932160,-65480,640679936,-64128,68616192,-65296,10223616,-65496,3932160,0,38273024,0,0,0,0,0,0,0,1310720,0,0]},{"sector":4,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1392902144,1163154265,1101,309955693,1398362890,776815956,89342288,0,1292369920,776882497,88752719,0,1158152192,776163922,88752719,0,1443364864,776491585,88752719,0,1275592704,776425039,88752719,0,1208483840,777011525,88752719,0,1393033216,776491604,88752719,0,1393033216,776492101,88752719,0,1174929408,775435344,88752719,0,1174929408,776484916,88752719,0,1174929408,776353844,88752719,0,1174929408,776484664,88752719,0,1376256000,776228417,88752719,0,1141374976,777277001,88752719,0,1141374976,775435334,88752719,0,1141374976,775370822,88752719,0,1393033216,777277001,88752719,0,1393033216,775435334,88752719,0,1393033216,775370822,88752719,0,1409810432,776754243,88752719,0,1409810432,776163399,88752719,0,1409810432,777144387,88752719,0,1409810432,777147475,88752719,0,1409810432,776752962,88752719,0,1409810432,777277001,88752719,0,1409810432]},{"sector":5,"length":512,"data":[775435334,88752719,0,1409810432,775370822,88752719,0,1409810432,776885574,88752719,0,1174929408,776754243,88752719,0,1174929408,776885574,88752719,0,1174929408,777144644,88752719,0,1292369920,776490309,88752719,0,1342701568,777212481,88752719,0,1141374976,776491593,88752719,0,1124597760,777142600,88752719,0,1158152192,775305289,88752719,0,1158152192,775370825,88752719,0,1158152192,775305293,88752719,0,1158152192,775370829,88752719,0,1325924352,776489538,4866639,0,0,-1912602438,429274,-1947389184,1246660,-388823887,-1039936884,-1560280925,100859904,10682368,172800,637534883,754975393,44240896,48896,-1191060034,-57671662,901033006,495526349,-2097003124,-253623097,-1172369890,12058830,-1172189915,599261397,-1172189915,616038557,-1172189915,1069023430,522308901,503316664,-1202708912,1343095302,59406,59406,503316664,-1202708912,1343095302,59406,59406,-997983285,-410822650,-1765310177,972849152,-4258957,1421105151,-326426163,18239104,1515805528,526212958,-793194745,113541888,-927464469,-346334976,16758791,-617363149,-1912602438,10746842,197233408,-1591774013,-1073020928,-1064431244,270416678,637957120,-352316255,734235885,-2097151970,243863787,512294912]},{"sector":6,"length":512,"data":[516161538,-1064566784,326419211,10731571,172800,-1207959389,1343095058,-1194634490,1344143360,59406,503316664,15208016,48896,-1191060034,-57671662,632597550,-854211298,-947708127,-1577983484,101384192,695468034,-402526277,10551338,3336192,-402522437,44105758,4253696,1441282736,41216,-1157614104,132645379,41216,567102644,168266286,-402230080,-347930568,1689371635,-1325398040,190474,-466483989,805630454,2025552,-1010529704,-389772720,1347944449,-388889423,1476396008,805572388,41040444,-796260604,567084724,453116099,892609571,959985462,1027357498,1383415614,1769238133,1696621933,1919906418,1629487136,771760244,855640589,427968,1048824576,1962934272,10603265,59648,-1909001077,992346692,125764181,992351356,638546437,2080789819,638025480,1996768571,-910636287,59648,-265554805,-293532302,124912128,13883,-1194655374,15270090,-1931703552,2009413338,2143565322,1334523398,-1527514108,181066382,-1949791488,-1947169830,1356986362,-137983150,-1948742685,-1948125241,56122056,-875494445,199854933,190870763,175742171,-738733577,-2097036925,-771030829,-150308452,97712080,-763166719,-1947104512,868824059,2211291,-741223983,-551825877,-838663053,-772415725,1305661904,2040392309,-137234673,29459411,-1660890237,233506169,-150308451,97712080,-763166719,1573608704,-385824584,-511508480,-788106209,-489106966,-511456262]},{"sector":7,"length":512,"data":[-788106209,-489500192,-770978822,-789116291,17158903,13796096,920423371,-402372725,124911851,-745815669,-1207958838,15270091,920423168,906250123,-1945743420,25749699,113902450,13416448,-1962934039,2143565532,41220,-1593472730,-1993998334,80347717,920423168,637829060,10683787,1166747136,172802,10731571,313856,-1962789400,-992506938,721420350,721420822,1929379846,1049895,639757130,637949187,637687083,1023689987,74579984,1107300397,1929718566,1049860,147293002,-613023989,-889041688,-1962806808,-992506938,721420350,721420822,1929379846,1049904,640346954,637951371,990010667,639333082,637816203,74648875,1259389315,108517947,-935655310,-1047853966,-947661941,1979648776,33548498,-320319285,4113409,638577408,637951371,990010667,-2090896422,-16054073,-2014777995,-1949398271,35531743,928512,-2096860416,994775233,1913026522,1925724962,953118,35556096,64160512,1064385,271385714,10699264,35031296,1482484480,3723,134667,1347441780,7935,1256413329,-1953598135,-1960393767,723911757,-2096860403,994775233,1913026522,1925725070,227223178,39684902,-1056713981,1912606781,1060100,92874306,39160102,106248998,992348533,58000453,1476451560,-1007041544,863289355,50409192,1036059603,74579984,1107300397,138811,108469362,3643,372970610,242679810,104531570,108462080,16068,-1007071253]},{"sector":8,"length":512,"data":[39664422,91692658,1913469734,1564157463,1916237574,1295721990,640644868,-1960440437,233505373,39140134,91693170,1912945446,1429939737,1913681670,1161504262,638088964,637814155,-402238069,-947716011,1979648776,35011503,990868736,1962934278,952585,35555584,317244160,638546432,-1993994871,-1993997731,-1993997243,-1950153131,-2097151938,427034863,-288229493,-288231727,906227409,909836290,91619330,16009,-1950090813,-67108810,-1524194010,-1524194010,-1995903101,-1023410122,16011,292945675,15915,-164424843,147083,268486529,4074435,855798528,-2080928769,-271511578,-271454255,1040445393,1044054018,276234242,909837938,141754368,13963,147083,634424259,-355401713,-355341615,-1312560431,-1950166268,-253656118,185590403,-1946369087,920292572,906526660,-1408993339,852003498,-1901792275,314074,-1931703300,2009413338,2143565322,1334523398,-1053119484,-1047920010,852003498,-1901792275,707290,-1003037557,-1977219969,-891014651,-1946419196,920292572,906788804,-1979156539,920924676,184962955,-1190953015,-251461631,326287659,1334523456,2110327556,1003041538,-1962510655,855829441,-930370880,-628185869,-67106614,-628302709,142591030,74958134,839748134,2534637,638087941,-1962998330,64026305,-930461703,-628185869,-67107638,907992203,906524613,637829060,-315486838,-1404622365,695337276,-223606665,1327265198,-466477077,-802434677,-1958604430]}]],[[{"sector":1,"length":512,"data":[1957098440,63449870,1207501809,871396682,722004928,919047160,520374059,-67106614,-628302709,142066998,75482166,629810860,986221127,-1979550004,1959332556,-202558970,973239718,-891646268,-1946419192,2143565532,-1442729978,71797302,182954,-1931703300,2143565530,2009413130,1200305670,-930371068,-628185869,1426065098,-327029621,-1098055168,1461124864,101351108,112727,105286480,-401715128,2126839504,240584206,-1912665880,385745086,176079959,1996445446,16758790,-1310192048,-286781698,176080126,1996445446,1877478920,1575324670,1426066634,-327029621,2122514944,1132331014,-16728435,2126796566,-1202256374,-1957691391,1346897990,-25761778,-33505651,2126796566,-1957231094,1174603846,-4698106,-401715200,-401670564,2126839449,-1202256374,240124159,-1946281496,147480037,-594805760,-1003038068,-986314113,-1959393673,-813038497,-1070404302,-880104717,548513011,-819279062,-628184333,-67107126,-1003037557,280560767,-205507840,-594818133,109036598,71797302,-13444982,-338492495,-511653750,-771641337,17311456,-1962933558,2143565532,1200240136,1468675590,1926244868,-1966932449,-1308675368,-1964256509,132219080,-523107920,-805238746,13861824,-193606914,-67107638,-628302709,175621430,109036598,73370422,-315437174,-880086781,-628185869,-1962931510,2143565532,1200240132,853051912,-754732545,-2134340885,28313569,-2077826862,444929,-1931703300,2143565530,2009413128,1095940]},{"sector":2,"length":512,"data":[84616877,-1896226133,314074,-1931703300,2143565530,2009413128,1095940,651229101,-492108509,-891646217,-1946419196,920292572,906526660,-1190889531,648871952,-492108509,-891646215,-1946419196,920292572,906526660,-1190889531,-1477246960,147511950,-594805760,-1003038068,-986314625,280560759,187084032,41266949,-628164638,-2130704182,176161015,175862985,980972736,-1861912895,-678961529,-654917334,1735600188,1347797382,-461314422,870878080,-1331930937,-2133950464,-2147430527,1913190784,-1966831087,-1965061405,852921082,149520630,-922031381,-355399052,-657335343,-160052738,53967005,333321153,1573751767,-623834509,-657335343,544522750,-2097119227,-763166509,-1978699264,2145812673,-1950092022,-1948349503,-623787049,-344604162,-1054096391,-686039525,1935527307,-137169136,-170330157,-2097097853,-176160558,200969088,1962413051,2029390541,-773795401,-19738157,-369986103,-1073086210,-922027660,-1957300876,-2116602902,-2038431518,315687632,-2117563664,-2122317619,1384120527,74834954,225762059,678817034,611710475,-2015459439,-1966765073,-1947863356,-138048552,-2082995226,-896859950,-403192437,-763117309,-1870861568,1431393879,-326414253,1183500595,124188161,-108269429,1183570315,140965632,-99356669,1183570195,107411202,-99356669,-242493165,-150976885,-134018458,-250357229,-150845813,-134018970,-250357229,-150714741,-134019482,-250357229,1183578507,174520066,-233580541,1183578387,140965636]},{"sector":3,"length":512,"data":[-233580541,1183578387,174520068,-686569981,-1827879805,-167092903,-523171976,-758000687,-2115403447,8390016,-2097097853,57868498,-163456303,141902021,851544641,-1007824651,-661929933,180605067,1442149568,-684463477,-2147430527,-2147431039,-2147425663,-785726842,-1336741862,113154,108392251,41279035,108193082,-568597206,-757993701,-456126094,-707669039,-450174349,-283386341,-18093064,1376417992,1962934714,-348081435,-1312650271,1541460742,-144877222,-2083260464,125370354,-741224239,-2125868335,-377454399,861077351,91839191,1523765586,-2134444349,82315124,-183208960,1975597763,1958742542,1977039626,1977498374,-1008387582,-636757877,-292931468,175755787,-755511049,-2097151739,-661978926,184590520,-2029226542,177254611,-2046528010,193507570,-32999214,333120456,184056274,-2147256083,-1815904282,-886399055,-109031822,-28608737,-2130801983,-109018930,-1962446319,-2133707838,-109047575,-1978961399,-1964864828,-2131348778,-355399447,-906045231,208926837,141880586,-2097151739,276299986,175767306,-755511049,-2097151739,-1007157038,-1070349319,-389819853,997326848,59595,-1949616782,-1946973240,59642,181086578,-399870775,527564800,59595,59595,-402606645,158466048,-402541109,24248320,13613259,-1207959319,15270093,13154304,1459618025,15225174,1600018688,1364613059,1493172456,1472421726,15225174,1600018688,1364613059,1493172456,1019436894,-1958120536,-1946973240]},{"sector":4,"length":512,"data":[870593274,-2133707813,964067561,1913715072,-1947760116,-17702,-351213184,150569199,-477491854,-91562102,-4794742,168356224,-116689719,-607003951,-906044208,-685509259,-450699741,-876596533,240145234,-1946179352,-1946973240,1515935994,-889192216,-2081649835,-930412308,-91491445,1014284298,1971373814,-129595071,-1980080503,-1048511402,-2131111808,-1047887679,1183323180,-129594370,-1946526069,1491663958,-13113089,1397934334,59472,1509836346,-512532642,-561266293,-443820149,-1201812643,15270095,562149632,-1076190530,15255823,1958742528,-2131329021,1551002684,-1105099847,264231586,-427797943,59519,-401575334,1448607495,1541934673,1600018943,-151064344,57966790,-16853784,59593,-402427236,-906035501,1912602856,-2134770168,15237326,1919695872,22986505,-402651207,1922892470,1958742535,-2131329021,966613195,1624719263,-1842307773,1068132144,1859596840,-283301194,-804424648,2060455168,-2004318072,-1431601656,178956970,-167414592,108298438,-385822792,-2119106560,-1974419158,-75449919,-1074580546,15217924,-1949791488,-1191539725,-617414527,1189663283,1347638014,855671224,-2147435813,1493172456,15228766,34455296,-402651463,-1057095118,-1093500999,1925126135,59441,1347637849,-1718042230,-1191182104,-138489216,829603607,1493172456,15228766,1936145408,868233990,-875416613,-660764035,-377676407,976128930,954437245,1233019790,306783378,-858993282,-1417720628,715827882]},{"sector":5,"length":512,"data":[-1669282058,-1182800256,-138489216,829603607,1006633192,1381331848,-1057075117,15269813,1600018688,15225168,-1073063680,-922877324,-2015459439,59607,-1191009089,-1326972920,-372156159,-1185870221,868154241,889503731,1493172456,343064834,-1961855843,-1946973240,8501498,-768353485,-889192216,13482072,1828716777,1611734318,742813745,1954539006,-2071364554,1012102945,2049885183,-1789166126,-1205502947,2120439878,-34604010,-137199499,1429303831,-326898549,1975519750,13691139,-956905165,1090811008,1367336576,855671225,-385928202,208797696,-2015459439,59607,1363231065,-1102414151,1874848142,59404,-303561357,-1082660096,45679541,777474304,-1959916149,-1959918987,15205501,1918459648,315065096,-276568094,113738502,-1980086647,1451883614,-1959897090,1972055565,2106273282,-55187452,-1957670062,1586231878,-27882500,-1191182104,-164429695,15269683,-1949791488,1492814835,15227483,8841216,113738591,772639534,771913099,-402358901,-161939456,343147201,-1949791407,-1191539725,-1564794495,1225767642,1493172456,1946272246,-2133950461,-883038837,-858790017,-159427565,154182388,-1849595265,-1249901046,1148160670,975995520,1786778573,101355969,129,562036736,1225775778,-1952257923,-1904362962,1670265059,613566846,-847343031,1288490188,-1431655553,-440423766,375043,1364218706,-1949791401,-386233357,1499398144,1493173992,15294302,-326413056,-1996034941,1586100806,-27883012]},{"sector":6,"length":512,"data":[772115246,771906955,1359238539,1360063319,227225175,41257774,75336494,-1962934040,1988885070,-25261060,1593835752,113738585,-2118525470,871772928,59647,-1017256565,7999,0,2147450880,855638715,429823,109979136,-4653012,-1960379265,1958742533,926432539,-1960439691,1027342917,-461371275,1509720287,-1070391829,-562778382,-253312973,126477275,347684825,-1946230272,255796487,-1174192323,11539248,1481911669,28361787,-610589323,-388391965,-1678845541,-644089378,-522609728,-1680220517,-1952759843,45129223,851051892,-1576816621,378077184,516096000,884481806,702757,567137931,-1946426816,-1172189737,45088971,-1078320691,-847925248,936189729,775278051,1355481088,-253312974,-1595531088,1347952870,47134,1048631438,1962934272,909495559,99287046,407257,434331,102945014,142082056,2031516,-816308480,1950198011,-482882241,3028429,1499027712,16482651,1493398784,27810649,-927328907,1963239424,13482513,175442088,-1476342086,-1174178544,-376307505,-987889664,-1694494690,-1021341552,958803,-478095222,-1057259328,941884532,-997849332,-670300380,20489006,1946671421,131939664,-616739980,1028027439,1148458968,1947720765,534265151,-599967116,1026913311,225720280,1949817917,-488924408,-335566872,780217875,805241144,-385901592,-610598873,-102851614,37674395,44079872,134612992,1173504,-2132616293,-50329562,103209371,1478449920]},{"sector":7,"length":512,"data":[-438723633,37674395,44145408,1157671168,11080052,-1457818560,376701952,-1680286309,-1681658151,36625198,-908485888,-1678190181,180607453,841118912,-1964209463,-2132508442,-2143322619,1381007566,-919383725,-841184431,-852534468,180650813,-298463797,183272395,1020124299,1036861275,1493353603,-1957143973,2147427832,1983872557,1977879066,-790263263,13926625,-2097097853,242352338,-405675311,868997841,870003648,-1057043502,-843518347,59648,104740301,-1724068608,-855637970,138807,103691725,172288,267915,506973643,1036845058,-1962933599,-889191402,104740301,-1724068608,-855637970,902691893,-889190866,104740301,-1724068608,-855637970,902676533,-382022148,103691725,902679296,1053674490,-842297108,-879694274,-1863172403,-197210677,1053674384,-389312262,-1070399412,-1959338869,-620034977,-141425548,46830323,3598336,8435859,-167763783,175472838,-757996591,-203241218,-427769806,434686847,-1623405312,-855618298,1591,-840878643,969801013,-885142055,10616801,35556096,784894720,8726263,-506338863,-385687087,-754724605,-472783919,-217918717,-472709711,17167106,13796096,-1996488541,-1023409642,750027781,243868109,378077184,1472921602,198740988,-150110766,-2083325997,-763166269,-1439846400,-1325378882,1413164553,1996976642,473640460,-964491405,1976172036,-1329463572,784399919,456006699,-177012140,773587758,-2096999405,-22412090,-1947961911,-819241009]},{"sector":8,"length":512,"data":[-1698037565,-169803717,-1734967291,256000000,25600000,2560000,256000,25600,2560,256,868233984,-470404142,1031808601,638022699,1965899136,1229407749,-2144974621,1148462141,-2145547738,-1015006485,-148344054,1978663106,-523152591,1347605201,-757997359,-757997359,1539507035,844878611,-2084371457,309854418,1322115655,-789116299,17158903,13796096,-1007041544,-85767865,-2145547738,57827835,-2145326208,-1015006485,-2146733558,-1015015445,-2133822714,79104707,-757997359,-805383054,-1022691723,-338566585,-326412870,1460989059,2114713987,768259,2113272195,-673533,-1996599671,1460075638,384597645,13756423,1317603167,-25785350,209253899,1190819331,1187383417,787153132,-24912137,-1107070452,2055208971,1120286188,443678956,-32540594,2055269442,242629100,15483590,1187507947,-16764436,-164365754,-27882500,897110539,-2130950410,766509940,-95515734,91867403,-341167952,6154247,-109491798,1282724363,1101672112,816842356,-143308118,-398624694,-341180349,-165629705,1954610246,-1439846398,-1442827544,-1341492158,686336558,1967303168,-1438273287,1451961264,2043808762,-148000764,-1031034150,-84538702,-1422905339,727699339,1575324623,-331183421,1975519814,1311813635,1975519939,440589,-63950664,-1070421005,-427768918,-2144579457,-319402572,-1979710203,-930375484,-637959336,1363214709,-388368553,1499398468,74678588,1224853480,-2133950383,-936737615,175374512]}]],[[{"sector":1,"length":512,"data":[-606999855,-906045231,213841525,-1309767168,-2131897852,-2010763067,266764333,-783264942,-774647328,-773795374,1506988499,324649219,-787260967,-741220143,1313329873,-970535051,-1017577467,-2081649835,-1070397204,-1980217719,1183447622,643949564,1183319434,1948269822,1948990472,1965898756,-397850878,1215430786,175430411,400808755,775782438,954405237,775782438,1229402741,1912628712,-472123605,92939818,74728764,527787324,-397194937,1918566400,-1948777709,-230974990,1077742197,1023769856,58720192,1362226169,-1949595049,1586231366,-61436934,2111633792,-592359158,1493195752,-400244352,1499398228,-1073082766,2122320500,1979198974,-2133950461,-1017256565,971234099,738560550,1930036282,1229407024,-1739108013,59545,-208942965,1183578763,-94467080,-386115957,208797856,-1996488472,1586100294,-61437446,1935366495,-109001787,-2142667558,1149183737,173036370,41524425,-645211658,-1963138176,49008891,-1912655137,771931583,-1959918197,-1959919011,-511703979,-402164733,-906100652,-930350731,-91491445,1515935901,15270776,59648,8504313,0,142,10165312,1052516352,-1525677912,79063252,236702143,-339366717,-841994888,1405230030,964229598,736821567,499494312,-830748168,-1073069929,1448167796,-1971270016,1388327624,-355381165,-657335343,-606999855,56547537,-569155898,1943409502,-774188789,-2133274149,426901953,-2097119227,-763166509,-788040960,29458650,-427817102]},{"sector":2,"length":512,"data":[79792767,-1017553405,1,10,100,1000,10000,100000,1000000,10000000,0,-1094967296,16409,-910228480,1077186075,728806814,-1647989336,-1495973783,524943311,1087619704,-2132177696,-1816508471,-561102424,-335831559,1129425534,-1508994617,-484859730,202852003,1971749237,1296615798,-985834011,-1635042467,-1751426414,1375898144,1965409376,1983905792,-569676998,16442,0,2147450880,-1957358785,686588908,-25283123,781794509,936181912,-2091389826,58594041,-2097147207,58584825,-1979715911,-839058866,-196703427,636896905,695500799,1971322685,-226590419,175407104,-1421783368,-374714704,2122514768,58261750,-1196806736,-1330950583,1038723654,-129595135,-371702136,1183383729,1849150964,1073688044,-145944390,-128546326,721424824,32696514,-839109171,-2077320388,-650851072,-58836531,1190608333,1950417148,-1707291383,-16776138,1003354182,1586359414,-1106988584,1036845065,-1964293494,-2132225312,805638116,126432816,1968063299,931739371,16416387,2122517372,92022008,-285587769,-92894209,209253899,1190688259,1187383417,736821464,-24912137,-2145094894,-969549702,1912657986,259542554,-2133310722,1983502458,-666712562,-940643584,3266630,871909119,-94991370,897110539,16154243,766509945,-129070166,91867403,-341167952,7661575,-109491798,1517605387,1101672112,816842356,-143308118,-397707190,-341180326,-2095009545,2030106238]},{"sector":3,"length":512,"data":[-1439846398,-1442821656,-1341492158,1072212526,1967303168,-1438273287,1451961264,2043808760,-148000764,179874522,-151612828,-157748086,808453618,-1731818837,805696246,-812930256,-842060961,902685239,1036910190,-1017256565,1188577930,58048522,-1018285904,-2081649835,902629100,936246910,-1724068382,-855599058,1944317493,-2012902874,540867398,725354612,758908020,1229390453,6940753,249813811,1006996006,1191671086,5892169,995679223,-482052927,92939815,74728764,477455676,-397194937,1918566400,-1712157906,662041147,2098431805,-327598814,-670884482,1172882315,-75595776,-855411411,969793589,1036909694,167528183,-117345280,-840812595,-838963659,1575324477,-472173629,92939804,168049196,1020072819,265882,-62486120,-62506291,-347519165,4047842,-854819312,2049874748,-918893312,1024458797,209580032,781925581,986513530,268436985,-1072965493,41499508,-259270409,-788011389,-840511002,8690492,-773271296,-1092038168,250282016,125036753,748371149,-2083964211,-1073018170,-619975051,986514552,986563529,-1957313543,552371180,-1961998709,2123173974,-402188576,-1960968192,-1004595465,1451952254,205949702,41861691,-902053237,-896859522,41795899,-1426275957,141869355,-1329034415,1504375584,-1960860429,214588901,-326413056,638222020,-315486838,638182215,1965047168,-136165629,1912602856,-1962286334,172895183,-768360397,637959876,-899871351,-1957363704,1089242092,-1961867637]},{"sector":4,"length":512,"data":[1451954782,206474004,242862347,721422009,-108851634,-1190953218,2123235326,-402188608,-1960968192,-1004595465,1451952254,239504134,41861691,-902053237,-896859522,41795899,-1426275957,141869355,-1329034415,1504375584,-1960860429,281697765,-326413056,638222020,-315486838,638182215,1965047168,-136165629,1912602856,-1962155262,172895183,-617365453,2126828083,227091974,576093,-2081649835,1317748972,2043218700,571662,-2096214485,58654457,-1912602951,118931582,503316712,521598859,-1962377532,1183516246,2126658318,1002605314,-1962770742,2109815754,-54424830,1958816682,-930393848,-1426906960,530903897,-899816053,-1957363702,176080108,839748134,165890029,540901414,-498662539,59639,232981106,1311494027,-667300598,-840026675,108971069,1561168166,-1962932022,-1003086116,-986314625,872154231,-1330074688,-2135381033,-1070355712,-1918129237,-1934920635,364424128,-930305279,-1178586197,-1410138098,1984904364,-1974489086,-202558776,-1430244700,576031,-1003037557,-1959392641,-1993997241,-1959394235,-1993996729,-1959392187,-1993996217,-1070395835,138774822,172329254,-1174402358,149673905,-338185542,-676087293,-1003037557,-1960442753,-1321401787,1024619735,225761202,1960292413,444176,-352295424,1460032036,2418702,650130266,637687177,638076297,-1156954743,1256718352,637957120,-1342028345,314071,48955568,-594869840,75482166,41779494,410310577,41779494,141875122,1735]},{"sector":5,"length":512,"data":[418054247,1358672,1476400360,208977930,-402645829,-953810935,-676330939,100664522,643237463,-1073014273,10683252,-1022927104,907992203,855932869,-1207072311,2105621760,1960292610,-16601075,41779461,41211827,2105556148,158597168,-852470387,-1991282143,32618501,-645150413,-1325236863,-1960217385,1140897821,1186472397,-1933014270,-2134706485,2105610613,1977070338,2549763,855777720,-942044215,-676199867,-1944828535,1300829773,442337560,1713128903,508398594,-903888845,-768409596,495700275,-851311944,8400161,1929435779,868233988,-1949660206,-1206023216,567099904,8426893,-1962901319,-851463139,855798561,1004221376,-2145356584,436240569,-347929740,735284210,-17968,45620619,857853250,-1273132087,-1021194944,907992203,637829060,638342597,637816203,1068768651,275915213,172329254,-953761741,2117,313887,172345126,-286588928,907992203,637829060,856446405,1300702921,495658504,567099572,-1054144654,1706558324,80355072,517769984,75482166,206947622,-2027501261,-1960441779,-851397603,855798305,80355264,920423168,637829060,-75293301,-1274644988,1914817854,-893373694,1048772612,1962934272,2105615880,1977069826,1569400333,1435182600,2110006794,113754892,6815744,-633607189,-1977219724,-1950091263,2110011132,4057090,-633614197,447802485,1048822777,1962934272,2105615880,1977070082,1569400333,1435182600,2110006788,113754892,6881280,-2010715157]},{"sector":6,"length":512,"data":[-633650431,-1950154380,2110011132,508973314,-1912602438,1569269466,106366472,1577002583,1958742804,41731,-1960442017,-1960441275,-1960441763,-1004141483,1579093117,-594820263,75482166,1374181126,-401312257,440205168,1011027316,-386632435,171769700,1598226805,1569269255,-1960449272,2143565532,-396950012,175505256,-2048389712,-401952513,123731840,140347686,-594868501,75482166,444433190,-905743104,1048772612,1962934272,643237622,186146303,-1544784704,-404029440,-1003037557,1460012159,1962934504,59405,1598226802,1569269255,447793928,-594807317,142591030,105351734,72321846,15226630,1225749760,-1332344450,59424,-392758814,123666432,140347686,1426064586,-1004606325,1460014206,-989855512,12126326,-401246976,222035968,440143476,1094912628,990152774,-344652210,210301227,-1993996449,1562314845,1426065098,-1004606325,1460014206,1962934504,142001445,-66695541,736375468,-1341358392,59424,1149958626,-1947979009,-66591800,59564,123730402,140347686,113925407,920423168,906655743,-1207404545,-2143944665,1962935935,2930691,-13217778,-401734537,-998047744,313860,1431458820,1095107909,1430606668,-326898549,108971040,15226630,48640,15212917,1947876352,1998601242,-219462909,1006633192,1124890144,1948319363,-532510477,1609427782,1569269255,-473003256,-528577262,15206166,-486379008,444170,855665152,-1949267008,1439391205,-326898549,138840864]},{"sector":7,"length":512,"data":[-1928702325,118939774,-1006632728,1460014206,1962934504,105286431,226410795,-930352757,15212720,-1946557952,-529101362,-391366916,-119406592,-1993996449,-443873187,445021,-2081649835,2126790892,-396950010,12451840,-400460544,440139776,540809844,-347929737,59634,209068092,1090421571,1116271476,-303348032,-1993996449,-829749155,2123174627,-402188608,41025536,113708259,6946816,-661929933,-443821941,-1957311651,1089242092,-1962260853,1451953246,105810702,242862347,721422009,-108853170,-1190953218,2123235326,-402188608,2126774272,-396950000,527761408,721962635,-1962049855,-1329034255,59424,-829687326,-54495603,15248438,1610146304,1569269255,1575324424,1426066122,-326898549,108971072,15226630,48640,15212917,1947876352,1998601242,-219462909,1006633192,1124890144,1950416515,-1069381389,1609427782,1569269255,-473003256,-1065448171,15206166,-486379008,444174,-855610880,902682681,-1958883858,1439391205,-326898549,105810752,242862347,721422521,-108853170,-1190953218,2123235326,-402188608,2126774272,-396950006,527761408,721962635,-1962049855,-1329034255,59424,-829687326,-54495603,15248438,1610146304,1569269255,1575324424,-1325398838,-1324684541,-1324946686,-1325208831,920423168,100958148,59479,15211637,1947876352,29488665,222037108,-1040838540,1007121410,1124300576,11592939,28312299,-1993996449,80349277,517769984,142591030,74958134]},{"sector":8,"length":512,"data":[-1413467140,-1411927880,381272115,-1398017280,41307964,-930459728,-1527517902,531284018,-1610610486,1035206656,116118067,-1170472776,-1957363711,142525676,41779494,443865008,41779494,141875123,1735,887816294,1460032080,5040142,-2144970662,1946169469,1435311634,857671216,522309065,10684019,-1844319488,38127398,-1993943117,105286405,71665958,445021,-1003037557,954729599,856585472,495658697,567099572,10683251,313856,-1003037557,484967551,639071488,-75293301,-1274448380,1931595070,41731,38127398,80402352,2105615872,1960293122,444166,-1023383808,1689927604,-1274680576,6666816,-991130795,-588772738,505116159,106349906,72190758,-853701850,1914657313,1958820614,-1547531515,-899874816,1068695556,-352295751,-1186942203,-1957363611,276743404,1979688680,172395327,477413387,-148483810,-930413467,-1978902843,495658723,525935053,-768401550,74839846,-1945731388,1960250306,92874245,1178279147,-1994951670,-352321522,41745,-1945731388,1960250306,650130181,-899873399,-1957363698,176080108,1979665128,138840865,73791270,1183565963,1710695942,-1949695228,495658704,-851312456,-1560055007,-899874816,1156055048,638546432,-2096870005,108265977,-401679565,80347136,3008512,-1047850126,-1960389749,-108854195,856060929,15208155,313856,1912607464,465644299,-1341820205,313857,80396338,920423168,637960132,-1291682431,858486231,651310025]}]],[[{"sector":1,"length":512,"data":[28843403,1377946946,868823888,495658706,-851311944,1381587745,651397968,12066187,1495387458,113754971,6750208,-768360397,-594820103,1472542238,818053892,567099828,-1560055009,80347136,-326413056,508619907,-1928956219,118927486,1329376508,1336935030,-315438966,-1070422797,173458858,-1926184317,1454682238,1931420109,41733,-1927408405,521580662,-2096464188,-1392758585,1975519914,-443867142,576093,-628302709,175621430,109036598,72321846,1945582588,66126599,-45134087,-628185869,-1962931510,2143565532,1334523400,1200240134,-1426850812,1426065610,1452010635,1959922438,4843525,817115371,54272461,1912602808,429605,109979136,-13434836,87697148,-4651148,-340856065,63407092,12187531,-1850805759,102682870,142525471,-208557316,-899866716,-768409598,-1828715800,429771,8437504,839748134,-617396243,-2144990749,58138685,-1946688953,638182391,1981824384,-136165629,-970209397,1245906036,1438899829,-327029621,-1927413632,521568374,168576650,-1274645056,-31339239,80775872,1174702144,1547306183,1202996806,57876941,-1929378618,2126807158,105810696,-1392714957,108314634,25699907,-2010712606,-443867363,576093,-2115204267,-402620180,1183514721,1958742656,989626410,-551280523,-796245716,567086772,567089588,141869626,1735,199950351,8552064,1001653620,-1962914840,80371173,-326413056,8449153,-1275059992,3598393,-899816053,-1957363708]},{"sector":2,"length":512,"data":[-2131983892,780288,568867508,1575324416,503317706,-1928956219,118915198,2134682876,2142241394,-204960872,-1430244700,-1927363809,521568342,1931420109,41731,920423363,1006913418,1007055457,738359162,182816,-1107296024,12517376,1975519744,444172,-1107237376,12517376,59648,167772392,-1106676544,12517376,59648,-402645829,-4718592,59648,1701672270,543385970,1882025827,1701015410,1919906675,1902473760,1701996917,658788,201384583,1009787928,1818252360,-1668250504,46248,0,98304,314048512,-26940672,1271733130,47487608,-1207959552,1407909923,1545072827,-1196803287,1,-352308040,1757558082,265986593,713,4569088,-140955157,-1702560817,-26080,1454899200,-1407128832,-137244807,11629079,-1207959552,267059303,0,0,49153,503347384,-644953716,112852118,-2086276352,529927407,726685635,-1414792000,-1420252245,11846026,-1245487189,491644929,-54514857,-1263817813,28879808,28879680,-1017140480,1049319254,-276627240,-666990324,119408128,440828,1594336755,1465303902,14171787,-1995640957,503371838,235347462,112851999,128316160,-1017225441,915101526,-1174667048,-1510801402,14169737,1455644255,-667514025,-193164032,14171785,119408380,-218102087,1583286181,-1957210429,-1962878922,503774462,440583,205883309,133817003,650337887,-919927669,184549562,2131197120,-1073628407,-654896917]},{"sector":3,"length":512,"data":[-617938510,-372161647,48486609,1435105259,140347658,-1996077687,1300825165,-1022523134,-2096608117,176099577,-1073612415,-1070920065,146110955,-1206096152,1877704704,721837195,16352192,-338623363,1418451665,16352004,-489617282,-791555119,336328930,167924747,-1311110434,-686939636,217677824,-109038988,35746816,-109049268,-2145029116,544475641,1432567,-2145617664,1963002492,-2147467867,267100277,-803077710,-1014900214,-487882753,-2132808712,1963002492,651753218,1455621513,112852055,1604711168,-1913157794,1015089268,259964929,1073822849,218040957,-939582232,-1023409916,-1073675065,218645959,122013184,1441852288,1465314443,-2096608117,142544889,243255563,485212203,-1461188427,2147465243,1149962987,-2133199354,-388820799,17464448,-654900619,-2130162293,2126512633,33128725,51346752,-1073660479,20780670,-1995997888,1583286341,146129757,-1206162712,149635073,1625821365,-1073629157,-335677720,478881509,39095078,12173355,2043808512,-137169143,-2456613,1300824497,1095946,74830347,11655815,208982539,-773140159,-338112037,-1073628685,1300888547,106793224,-1996208759,361300565,139234243,2132867459,2110327603,33128764,-1290568000,-685891060,173801984,1946549120,150700043,-768932236,451658379,28889643,100368384,-654897035,183227127,-790099787,-2147436006,-1377189845,39619328,1544166410,71600897,-2147068789,276238569,-955596022,-768896365,2115027328,266436851]},{"sector":4,"length":512,"data":[-1101652509,-1026293761,-422330157,-937177461,-232537805,-972302797,-653598966,-1319174774,-686939636,217677824,-109031308,34829312,-109049268,-2143063036,1047792121,208854007,28379883,-653604830,2147468161,-2097151979,695795922,17464448,-92205451,141918208,1962934333,-1877546237,-1962973719,851562702,-1040840116,-385453055,-336003242,175931599,-150506239,-2082932782,-1993932838,1435051525,1448461058,637831974,637688971,637815947,-1123658613,-771031040,645862268,578144523,511040267,443924491,-339738178,-137169101,-137103407,-746326568,13730560,-1124019581,1086193665,1976699648,-2016311542,-293366837,2029185808,-1073525237,-921445613,-176565741,-1995805303,1435043957,72190214,-1996333687,-1017291259,1284200277,1073316616,-922011265,-108968323,327073793,505547955,1543635159,100368394,-75495052,721712136,723577837,-1193964563,-75497471,1977453317,-136775912,-137168941,-1257313323,425322504,729809085,-1948611630,9562563,-1962513269,1552614484,725388034,820609216,-1005971849,-955580236,-628360309,-315894389,2115027328,266436845,292870646,168870272,-772943420,-774123046,-488845089,571257330,-2147428594,812911865,1946220928,172753429,1946483072,167346211,-654893452,418057586,28413419,-1056256221,-1182793979,-116195328,-787228397,-394729197,175931543,-149785343,-137168939,-170330157,-2097097853,-712834862,-1817485568,-1783917909,149914539,1448461149,-1947302057,-108853170]},{"sector":5,"length":512,"data":[187465024,-2126152247,2126512633,571257107,33609486,-109049266,-2146667515,125044985,29285163,-1106121792,12255233,1946807168,-400509672,300619887,1183432747,38177024,-1996208503,1988691550,11593992,587217086,-775015439,-772877842,-2082539538,-24967226,-1274645241,-352155136,721586946,1342082011,453641852,-135578744,-2147418182,-355268639,591919755,168064464,-1250855717,404088864,212976179,14093858,1947007360,16351256,1308761716,83460106,-109048972,168195081,-349997606,-2147317689,1962936190,-10426049,209050378,141936517,-683945469,116123510,-683945469,-293347470,50953223,121800903,267115766,1116325635,2135311879,122847238,1945596416,1590819079,138870534,-1017291169,-1962654581,1552614996,172788232,1962949763,41714447,-1475775232,-167414401,259260868,-729759742,13796096,-623835789,-2092705583,847150787,16776065,-489613443,-607065648,-997532975,-695541110,-1834224758,82805675,142377411,159203329,1223166133,735193879,16759744,2088883435,2126512392,-401558267,-617933005,-1014246517,1465303275,-1960379386,1418405380,-772396286,735498722,1960706779,-98256,-343728012,-623838850,-729091446,11659402,-1070921954,-1416516693,-1416385646,1594338198,-661929122,-604513782,-348126789,197823448,-2096204600,-355434773,-770457597,-347354504,-1073628169,-1957182741,2089484612,88902403,-1962453878,62261340,873132066,145228917,67441012,14123776,-2147430013]},{"sector":6,"length":512,"data":[57868498,-2126259504,2114191043,-294590,608861447,-773664520,182112491,-1946973497,-772812321,-774188584,-774123047,-774319633,-774254118,172231387,-657330223,-640558383,-60826671,-1851026517,-2085907797,-1161623313,2088828928,2126512392,-351226605,142377228,360529921,-1241521990,372893704,-787852278,-1949750326,-339637287,134200265,-1940417045,-1899787048,-1950314789,-1070922156,-791551279,176000509,-754601557,-2124385046,1946681338,-2129611964,-1845231894,89426859,168814208,55348211,-1979622261,-788484060,-774647328,-774712879,-774647328,-774712879,-774647328,-1831677487,-1817472597,-1934912853,-1899787048,1606455003,106728131,185590659,1544225884,-1172567294,-880787455,-1968379120,-477952420,73141007,184704011,-1174047460,-1746157567,-2147134325,1284181990,22842115,78652554,-456079106,-774777903,-193342957,755020880,1487602686,-1679097680,-1510189226,-1381653083,20778123,84901184,259801086,-372121391,1605097681,-4668578,737274751,1458432960,-1945756073,-1899787048,-35942720,-1928825715,-1817376131,-472793045,-777269039,-2129627925,-1824522517,-1515870805,520617125,-1195155873,732676097,-1414812736,1391389611,106203990,2147476097,1410012171,72616706,-75292299,-2129103617,1073809535,1468731772,-1933050,186059647,1460339287,-129665788,-2084349346,1047855099,17334145,-1959297984,-494860713,386629631,184702731,645137495,990270603,511116887,1418402418,72825604,275911799]},{"sector":7,"length":512,"data":[990008459,175571543,344655474,41359163,-1252527221,344844289,-67107143,1610196467,28420843,11600619,-1913877675,1465317990,-1962379637,-1047918978,839533874,1183320644,138710010,1023958411,964509697,1073871745,-1019522947,1295124605,-142109942,1284113387,-78739446,-1995944821,-75367346,125747201,1077789483,-1957331456,39619332,-1962652533,719914580,-1957211391,75402207,1610550504,-2127138213,2084569595,-96040419,594919434,-4516629,172329727,-141835982,-402358645,359857897,1149895659,-79263734,33310407,-1951077568,-1964505986,16181750,-1946204536,39684869,-1962652277,1187382869,1853882622,427559167,-1963047288,-1964799292,-1963357473,-1964340531,-2147436842,2097741678,-10059545,-787450873,-774254102,-791096869,1325334110,737179135,-92372737,52262144,39588612,319048723,1735591508,-640558383,-657335343,-106800,1475083334,33257088,1545274411,72096514,1929794587,-76120040,-137169151,-137103407,-27330864,331813877,332338143,4243159,662238730,-803900338,-791544218,-774777903,-260451821,21032579,267123830,-411708917,33310407,-79247680,-803149056,-954991002,-820781293,91477779,1191172817,-58818052,578633729,33324673,-64717120,-1425768821,-1416516717,1183558546,1183493116,1583327995,-1034033781,146079750,33310407,-1257772224,-62470384,-924270591,-79247854,-1950340352,-1949791272,1438968784,1720577163,-61384962,-1962379637,1284114046,172831242]},{"sector":8,"length":512,"data":[-1946268024,1149962333,1073822984,-75421571,930955265,24953659,-1073660525,-1023208578,1073823048,1027621757,1350549505,1961365685,-1073629166,-1957217301,75402207,1610439912,2105620594,2126512392,1445194520,-1946157125,75402231,1593656552,2088837234,2143289608,75401997,-336270104,-402082461,28840503,75402048,-385986934,1357640903,-185800624,-404162681,5040372,14157443,-771006696,-783348872,-774843930,-774778413,367448530,-746389504,13730560,1929433731,1205522691,1073872769,-1309998468,2123102091,-1416385788,-1416451183,1183493014,-1426017026,-443851169,442973,780883797,-13958952,-141832309,-2146482442,1317734004,41323264,-2147268874,1308823412,242619148,1190592275,24412175,-1948570801,1727466566,331875076,14124018,185616011,-149457728,-939327386,-679218669,273058560,50489079,-2080762896,1183514835,107411212,-99356669,-1962880125,1727467078,334496516,13861882,185747083,-150309696,-268238746,-746325485,1456024320,1183576459,107411214,-636225533,-1962880637,-1073016762,1727469428,335020804,13730778,-149928309,-670890394,-696006125,306612992,611631115,50489079,-2082860040,-696057647,306612992,50620151,-2083908648,1183514838,107411218,-233584637,1587009163,1438866783,1720577163,140413944,-16353281,2013201527,725090050,1465274560,108956668,839534474,1183320645,141921277,-2130163829,2101346814,1073823038,-25079939,528400385,2126512445,1036397329]}]],[[{"sector":1,"length":512,"data":[259866625,2143289661,-401558201,28840087,-1257444416,-1258099960,277473284,-1975516744,2123103566,-216406012,-1962813975,75402231,1929079016,142574067,-763609087,-336390936,-1141666841,2123104255,-78649340,-856958350,738084489,-162100279,990279051,721647602,1183531478,368506868,-854458367,-1979953528,-1957627322,39684869,1435177443,-263837436,435314201,1981412438,1592976118,1183442679,-141323538,332923878,71666634,-939268361,-1845439869,107345814,-763116029,-262264064,468864539,1444672582,-262239754,-1980608887,1972106310,-1846085882,-768870665,331486201,-1982846006,1310324822,-60915462,93016064,-486384245,72715025,435045929,1444540510,-193586702,-144772382,-141323546,332923878,71666634,-939268361,-1845439869,107345814,-763116029,-295818496,468733467,1444672070,-295794188,-1980739959,1972105798,-1846085882,-768870665,331486201,-163149366,301485569,1443953238,1435211516,1569427970,688644868,1578757702,-229238288,-419957278,-419982446,-904669181,-150583925,-2084502554,1579876562,-263840786,-1980606949,1183444574,74812400,1972106755,14058246,-628685709,-472837653,-758001455,-141297929,-773074442,-1176579880,-242483201,-738733686,-554249993,5621,334913043,1981020238,-61467910,225700560,-640557359,-657335343,1191173840,50277374,331813878,332338143,13795575,1962825355,-2147435004,33194306,-385647552,2123103790,-1817445372,-1767140949,-1968467285,-1416037050]},{"sector":2,"length":512,"data":[-443851169,442973,1458342741,138709847,2126512445,1073823017,2088773757,745865226,-386840088,1049296951,1465254104,-41162666,-396994985,1291844080,-670661880,1583287296,-4471971,-385971201,-219416239,1424490933,-385971442,1170731222,-348126968,-1957210399,-1962878914,1435175005,71666438,-788378229,1124561915,-657331503,-92022319,1394439166,-1949660335,-101545000,-151527727,1995455310,-268220910,-779362607,-286538869,-774188551,1175972824,24375355,-1856284266,-768870665,-556666621,-1038886703,737990163,-1414819383,-1416451183,12102547,1583328000,1073873091,1090715970,-326412989,-1928694273,1465317990,1569392011,72190722,-955886197,64582,721976715,410847356,1200640747,2085567979,-60370438,-741220143,-770453039,-294053006,1996903483,1005023764,225903692,1547427954,1913026306,1912880089,-62455851,1545274411,72096514,184964123,197361663,1947039954,-523153596,-774777903,-176565741,1460173827,-1409909109,-1416516717,-1420252270,-1728166262,-718896981,130006016,-62485760,33455744,-654900619,-1976633309,135275925,1593890070,1575324510,-2016311357,-276589621,1976699664,-2016311382,284132299,-276573817,1976699664,-1073627238,-919875029,-1070867669,1418437099,-1933050,185863039,1410007636,-1254853628,216131585,-381353800,1435173009,-1933050,185928575,1426784853,-337349372,-326413028,1988843350,75401990,-1962392437,20777053,-2118419136,2101346811,1003523025,-1962770493]},{"sector":3,"length":512,"data":[33194451,-1975812416,1295649356,2135522314,2093169469,-1958969548,1161496132,-1255639802,-684842493,-1958841344,1161495620,-1961331452,1161495108,-2146405118,1265894141,87753867,12060021,1997859648,16351242,12061301,-2146899199,-160104199,-2013265736,1593890086,79846750,723290880,39619357,-1962779365,1562051676,-150374652,-2132573221,-907295628,1954603907,-1949504579,1998400284,-2133068023,-1368064793,-410995733,-341347076,1073789110,17333377,-2129428800,1073809532,12063101,175931393,-1207733247,646447104,-1950154539,-494860716,336297983,184701963,-562822060,-790101579,1157675019,12116203,142377280,327073793,17333377,-1206813376,2088764416,57999626,-2013134835,-1023355610,-1962606408,-494860716,336297983,184701963,-562822060,-352255816,1465275865,14167691,-1962916213,1317732958,106334980,1988886315,33456392,-2094959424,226488574,-1014237045,-896804469,-964439509,209667600,-640554287,-657335343,-236199983,12576721,331813632,332338143,4622807,-1996333431,1451820110,-1948284154,-151548977,1954546502,6195978,-788377973,-1949183517,1727463494,332923652,66524106,332010456,-1948677129,-1946801202,1727464006,332923652,66524106,332010456,4623351,50751223,332010456,332923895,-772336694,332338147,-1948677129,-1946801202,-520682426,-904669181,1183577875,40302342,-904669181,-670828781,-149698029,-150583669,-939326362,-15470061,-233584637,-1962879101,-520681914]},{"sector":4,"length":512,"data":[-99356669,-1996464503,1988690510,108955908,673478,542407,1566465792,-326412861,102651734,1727401136,797958,74843030,-1947380760,105840382,-1957200258,-1979656130,1160779333,-124983286,1569260937,72190210,1594250633,1426911107,14167691,773688110,771902859,772035979,772175243,973751690,880020038,453008939,1444610638,108403460,-688450445,-772287753,-2081039369,-763166511,14058240,1586037044,38701312,-1996204407,1183319670,-1913955062,285236737,1443955278,108400900,-8525475,14169739,-1382830596,-1382896239,-1985106537,-2029987786,1023355895,-149850879,-137168938,-170133551,-686567661,317454099,-773926407,-774254118,333386715,332862415,-660518921,-1416390912,-1416451183,-1416385642,-1426063176,1583292167,311901,8,0,0,-1430913024,-1431655766,10922,604176385,572662306,546,-458031104,13634816,13,141426689,775669579,0,1086717952,7051542,0,1158414337,45202,0,1171587072,214,0,524289,0,0,0,-120,2147483647,65536,-1431659866,178956970,0,1527047807,5965232,65536,26945263,106522,0,-1814245859,1183,65536,-146034417,8,0,209442819,0,65536,-387213848,-13697733,-1206622154,-397405078,922746423,1448476888,-2081030936,201381894,-48371517,-902365394,348960788]},{"sector":5,"length":512,"data":[-31856560,-345708349,-386069784,-907482199,-1775361,1757558211,265986593,457,2048,0,0,1459617792,1431655765,87381,-1107296000,858993458,819,2097152000,613566750,9,-1140850432,477218558,0,1543503872,6100735,0,-671088384,80571,0,167772160,1036,0,256,0,-35192832,-1124073217,-293874012,-5022620,-1258290945,1962690437,10555696,0,0,25165824,-1677721600,-1297062662,-18479331,-1677721345,-1297062662,-1702115,-184549121,1174686651,11306326,-436207616,-1121986194,-18220535,-1929379585,1539126651,-598652,2130706687,-620612139,13398912,1426063360,1720577163,1448564478,-1293396393,-28915722,-608239616,-25263339,-2027851005,-362092297,-11075961,-402597834,109312695,1024196824,141885440,-2080487681,-638907193,16678531,1843922293,-1956254976,776732254,171914,-2114036087,-1961480253,-386430981,-24647124,-666989738,1166890752,14197748,-222894000,-396994730,1374221433,1448499177,-873496,1442895926,-164108202,14157443,2287640,-2114027893,-2028598329,-370218761,922746503,1448476888,-2081258520,201381894,-443851169,1465303901,-2081834520,2145388668,-385971449,585886182,14171787,50873731,788220648,360265471,1343585208,1476151016,250107478,-670661644,1583287296,3523,0,0,50331648,0,4194304,-1459617792]},{"sector":6,"length":512,"data":[-1431655766,699050,2013265920,1431655765,87381,637534208,572662307,8738,469762048,763549739,728,-67108864,54539257,52,335544320,1077150546,3,503316480,775669612,0,1275068416,38783408,0,-1862270976,1762830,0,1358954496,73590,0,-989855744,2860,0,1426063360,780883798,2123170008,-666990092,-393746432,-396994985,780792657,2089484504,-520125688,76240766,-1962779509,1418396748,394086150,-640554287,-657335343,368409671,-746389504,13730560,-2097098109,201381934,-666989572,-1416385792,-1416451183,-1414807509,772599683,389887743,1343700920,-1577373976,1448083672,-218896298,14157443,1566465804,401652675,-1438963364,440,2304,0,0,1744830464,1431655765,349525,-1174405120,858993460,13107,-1493172224,613566659,585,1291845632,1908875869,28,603979776,1952246614,1,956301312,330427565,0,-50331648,17793238,0,-1258291200,1107066,0,1426063360,1979706507,-1957210616,39684869,-1962652277,-92207531,276280581,-741220143,-758001199,-16777026,367787598,-772287753,-654846985,13861877,-2097098365,29229266,201272064,-1827047982,-276589935,-1056996592,780398975,-1962147624,-402597826,770434902,-783348872,-774647328,2043810769,1381455605,-1957670063,8120564,-401057346,915138448,-997523240,-396996522]},{"sector":7,"length":512,"data":[-997985815,-25785076,14167683,-666989812,-405280768,1443657101,166221655,1996445680,-59310084,-2081307416,402708486,-443851169,-1957313699,-1957210388,-416225033,14169739,-1107285784,1038620761,-667513881,1955419648,-396995060,-11079275,1996488310,-242489090,14157443,-1956749544,1438866917,1465314443,-1073185661,780355198,-1962147624,-402597826,1174398532,1465341448,1458543592,719869783,-417077005,14163595,34097027,788035304,409286399,1343776696,-429336,1459673142,-247994282,-2096610049,402708486,-443851169,11649885,45156075,78709483,-326383730,14171787,1359637898,142443344,-2146730016,58000121,-370810904,2105737402,192823304,-941203224,2164293,-973035031,-1929377211,915010677,-24706856,-2014974232,141329406,-171841534,1183319844,-27358468,1946483584,-60947909,-2012748928,-338559906,-24702605,-2014984472,141329406,1465341442,-1980832792,-1962878914,-62458121,-402294269,65796775,-1963294232,-338625442,1022094288,33310454,-142143116,-2014997784,141329399,1465341442,-1980846104,-1962878914,-91625225,-1946911603,-62458170,-2029880829,1347852279,-232003497,-788767094,31686891,50232960,1580335988,173902079,14171785,-1899764341,-667513913,-193164032,14171785,-1947923480,20777028,1027112256,780058625,-561315663,-402162616,-544479745,11862449,1359638406,1509629160,1963063680,283660558,139329509,-396994985,-2007372240,914950764,-1950154536,175439870]},{"sector":8,"length":512,"data":[-1880819992,1291782724,-1897141496,-667513913,-193164032,14171785,-337313560,-1949856222,-1929324490,1049228412,-1712848680,-1911493660,-667513913,-193164032,14171785,-387658776,2105599375,427098122,1023952267,226410497,2101346621,-47978484,14169737,-352012861,-402541310,28836415,-1308718272,-456005632,1085859563,-1911624960,-667513913,-193164032,800595179,-1949856256,-1929324490,1049228412,-788594472,-396994730,915009361,-326434600,1342177464,1023952011,1316945932,2130690109,-452728742,-16235009,-2147428810,-218048730,14093952,-386430204,110094636,-1957691178,-447944452,-1928835841,1448545404,-314382249,1945686360,-2063284435,38061924,1153956318,-940363004,-1258027452,-24433685,-1528297291,1073854465,954728625,-1958679580,-474552066,80165355,1153892352,-956301310,1092,410823,1149845632,172279304,-1912698112,1323830389,1448564475,1458483432,-437758377,-25263892,-2147191551,-1996420492,-1962878922,-946945051,-1256685939,-1326871808,65140234,12631800,-2096304509,-873985297,-192983573,237751947,-293404456,12500738,1961480701,1202057986,-666990265,-946945280,-376766283,12048778,44010030,-667514112,738102016,-666990085,12630272,91541035,-202780164,410422693,-2081707800,-964490041,-192983798,-669086781,2005750528,-964471284,-1961563380,1392564254,1443657613,915081707,-1923743528,-1907159972,-201987897,14169737,-1021942136,14100096,-2147095556,-33499354,512477070]}]],[[{"sector":1,"length":512,"data":[-1923940136,-397013897,243332051,-2096955177,914951366,1720189144,-946945258,14169739,-1997243672,-1899817370,-667513913,-190126080,-1022474615,484580522,491724104,489102617,494869874,438180378,453188130,460659555,466230151,467278799,1347615995,1465275731,-1960947450,780744428,1992622302,1988734226,-1898476526,-1731425569,-587497325,-13755022,907915415,14171777,376897728,-567899338,123281152,1532845663,-1244702120,387073,-338892053,508645607,-727703786,-703690240,1071742976,171962752,585140933,-153079071,41158852,-1048305652,-2146693260,570479778,1965046977,1482235661,-1568725821,1495204052,45663064,908184885,13639305,-771322826,646657536,1495204062,1566465799,911890523,13643519,-1320005293,638235908,-947250037,-436803374,-685633614,-436813310,570486970,65721299,702914,-477896201,1522729743,1438866265,1465314443,155486758,-805273563,172329408,-1977219919,-523040700,181790930,-148434753,1955435495,-5707770,-703413501,-403187061,-137720941,315098087,49185750,67080680,13730755,-1957243374,-1847068710,-403180917,-134576237,333317090,-293380360,-9377790,-636239613,280951315,-1813579993,-419968373,-134576234,332268514,13796344,-385976693,-670826674,-2097098365,-763166505,4241408,225825291,1946161197,-2015918292,-338982919,1208711407,-774773807,-770451503,1988883833,-1994618372,2089353804,106203396,1594377353,1575324510,-1073628989,1364255979]},{"sector":2,"length":512,"data":[78734512,-1963788654,-771042092,-1830810908,-455996716,-427113462,-1017620053,1458342741,1150024791,-1961063672,1418396236,74746630,2080374845,3943736,863969148,-569640319,729225074,1799028353,595005298,1983904129,460785522,2012281731,738243606,2131756036,-1947760112,-1949398055,-338547726,-345510928,2098211950,-773140210,-774254114,-19083045,49446080,13861860,-2097098365,-763166506,280925696,-1846085849,-141297929,-10557194,-141438421,-151546890,-386467951,-745799856,-1846085743,1172895479,-137262081,-12654346,78711508,-1005919022,-25785430,-804633462,1583327944,11584349,-218101319,-1242895446,-37623800,-252995152,557916471,559227211,560341343,560800132,629089546,635905509,44369618,21170134,572269077,572727846,573317677,573841973,44369618,21170134,49088088,24643378,581378733,584131396,585179830,583082663,581378801,598221586,599073658,597369727,1491599797,91089405,-990501769,1123120416,-544422774,242532388,-678657988,2123040882,-1962707196,-1406790530,119857286,154940139,-953808523,-460718780,-385533207,14744924,1347615995,1465275731,-1960947450,780744428,1992556766,11685394,875343142,-1468856260,583010235,-1845746980,1942028160,1090486375,343151223,-75448277,638612742,309758381,1709956748,65776934,-1986483162,11997814,-13704239,52445351,1174604870,-337736696,205914952,-1945745917,54455262,1174604358,-338260984,172360500]},{"sector":3,"length":512,"data":[-1945745917,53144534,-561248186,1174610923,-337736698,205914908,367779468,-1944947063,-1898410288,29488832,401290100,-1945483773,-92236074,-1761512191,-796082034,-1040787314,-2145750015,57917693,-167732759,58007749,-1157482519,-652083194,1353187118,3717152,-388905694,-2137659183,712229117,14171787,-1995640957,-1157572546,-652083194,1486356270,-1898869728,835265,9297803,280613003,-1493225946,12001376,44010030,14196992,-1040787453,1959824132,735283970,46266102,213779316,638630144,1621557038,1381191712,-412948143,1364349776,-2081873687,1397755078,-284563119,1381191827,-414783151,1381191827,-354948783,587204285,549844713,-973716875,-166038256,1416956101,14171787,67105976,14328824,1344670648,1889992494,-666989792,-151550208,158664901,1344673208,2024210222,-637090016,-1207956480,777004555,544777983,570427576,-1192752187,-162519531,91558085,-2136539346,787973920,546350847,-1258066199,-78518271,637841859,-1560132469,-1960443692,14066436,1021903029,-666989573,217023232,-2082398232,201381934,-666989629,217023232,-2080657176,201381934,-666989629,217023232,-2082091800,201381934,8841411,-1207924504,103481536,212992216,-4590858,-922512897,732686547,-1414812736,-588725333,-667513857,1837835776,1439531510,-401609899,-964434582,180847372,-439228975,-277278348,-1070920725,-218102343,-773467733,-1007454747,637583551,-2096862069,-847162170,-305048235,192146897]},{"sector":4,"length":512,"data":[185265795,-336366099,-2081566449,1323830511,183403493,-244126255,14171785,-369310077,-694026445,-1581012224,-1070792488,-166940416,-1324931847,-1948200445,-2147429362,-401946651,-1950110831,-402597834,109306042,-1022623528,14169739,-2080651800,201381894,-667513917,-455809024,14157443,604095244,605365332,609952783,609952852,609166427,611066964,611787895,611787860,12002423,44010030,-667514112,-1275919616,-2132991464,-653654303,440828,-1029177554,-668040413,1049299968,-1510801192,-1090386199,82509836,49040,11861633,-24702860,-1321205320,-596514816,14169601,-947694101,-1948808436,-670159922,370045952,49185543,-50282817,-1510741551,-669646340,-164304128,796133317,-1528299083,-1960252423,-1962878914,-1425766651,-503134589,27912694,915144331,-1510801192,-1962828055,-667513858,-1985613056,-385820618,67371407,67372036,1028,0,134480896,67504134,134873090,168035332,619054084,620242155,301278456,620237362,1975544,4194351,6422609,8650867,400237816,358422739,619714131,620242168,271394040,257956234,89007352,620233275,1954555128,-960298742,-1023407548,317216598,-1017225251,15270325,622707705,623912276,626795839,532358511,786244096,612796298,-472803432,-22675666,-666989788,217023232,-1499988178,-666990300,15067392,14169739,364445323,-13742042,-1960532313,-1962878922,217023486,-1499988178,-666990300,12708096,14157443]},{"sector":5,"length":512,"data":[12183820,14171787,772568461,614897663,14169737,-1962891543,-1929324482,364383349,-13742042,-2145081689,-41934875,-1085639421,1049166016,28836056,-402607808,1972230915,49251082,1626113021,-218091335,-737753179,-952041472,1057019398,-637090045,-956301312,-1073686522,-536426752,-949132032,1962992134,-469317753,-352321280,50167825,113641333,-352321324,-402541307,837548059,-151590000,-243982395,755030177,212926656,119863798,-523107407,13897355,180872576,240028136,915409899,14300811,-667549386,1048655360,12583128,-1959391369,520150566,1583286105,1515739997,-286536497,560513589,-921707870,-1036697602,-626908824,1073727759,-4177408,-4175872,-4175360,1056964608,-102865787,-1257966797,16383,11632512,45156075,78709483,1441126811,1720577163,2128452606,1720359934,259170047,-109040011,-1694075646,-644097827,1948183528,-1693680882,781965533,1312473,-337323621,-639722740,114896539,-644153324,11004388,-1679697509,3070766,-908485888,-1241982565,-789831166,2128452589,1720359934,-780493057,-1004403792,-456071984,-66793264,-108998448,33846530,604026305,1946265607,-371287291,-577043477,-220619815,1946483072,2047060009,-908485885,-1681794661,-644101928,-925328439,-1681793381,-388957479,-986519344,-644152460,-102851616,-527814165,-461312816,1961177601,-522609917,477758376,-1681270373,-576985895,-157548930,1950416710,-639722741,114896539,65732654,-1946558821]},{"sector":6,"length":512,"data":[-1681695259,-1957304871,-26833428,-25240165,-10057061,74617246,1290476661,1216039540,-1680286309,170842926,-1690965248,781965790,11995,-644142357,-388391967,-1680746341,-1677820195,-1627429238,57926004,-1681270373,208925657,786116251,-560267254,49643753,1946338806,-522609917,-1017256565,-337061477,-321283320,-644152341,-908485651,-1678996651,1720575449,2128452598,1720359926,208838391,-990509708,-1692961790,82565341,159058804,-1680286309,403101998,-455501056,-644143893,2128321472,2122423286,1967128574,-58818286,192249856,-1679238757,-644093474,-1694241799,-443813415,-644103331,-352210454,-339137781,-371614969,15401393,-644152349,-438723639,-1913877675,-576980378,65272446,-1681270373,-1627691382,1964012179,-656565466,-577043485,-388391976,-486496279,-656565501,159058804,-1680286309,470210862,-455501056,-486502423,-908158205,-1679697509,538368046,2128452352,1190566906,192168443,-1678714469,-560207655,-1688147007,-644093735,2128190401,-36070406,268127872,-93398629,-2130912869,-1678509210,-1678086439,-1677961509,-644101671,-908485664,-1677862501,-560211491,-25263127,-1684963584,-644091687,-1042375704,1945923281,-617702647,-1694489554,-543438370,-644088762,-36070455,-153494117,108266183,-1679238757,-443813410,-1957313699,508973292,34031350,-973405836,1149960822,1010052351,-2096336120,75563758,1988731854,1998842626,549778982,-293392779,41322754,1184564422,-1071266678,-790048761]},{"sector":7,"length":512,"data":[887673064,-668596968,1579091081,1020222808,-2096531703,80151278,-957637744,59567339,61932448,65864630,67699711,3277838,3801142,27132203,26804628,33882622,-50658807,1426478672,1992617099,-1985141240,-600045450,-259323534,-13724008,1560504980,-816292345,243059966,-453637456,2061212566,183403278,-1013188739,-855706069,-610596484,-964489622,-1678513398,-352276285,28348419,-326414251,8313243,7768987,-67017088,-1694415352,-1694470439,-593760551,-1042375702,-1694468471,-1694470439,-576988706,1486553214,208046173,-639722557,-1693620598,-1693679907,-1995618678,-1681716154,-320087592,-338569061,-455500825,-644095253,2128452581,-1950115066,-24966538,-1005489663,-1064565154,158647051,673479,831071744,1443138507,59479,309485151,-1022639733,1317662324,140413190,-645151858,-443818005,13351005,-2097151767,1946159742,106873873,-1959687386,-1932817660,59587,-1070397070,-1996077431,-1949628346,-860332571,59648,-991130795,1586169982,652149510,-259324021,-628355957,-66292027,-628185869,1560774950,-1962931510,50782989,24445517,13809867,233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131072,0,565248,65536,53248,458800,53248,1638408,53248,1835018,53248,2097154,53248,2293772]},{"sector":8,"length":512,"data":[53248,2490390,53248,2687002,53248,3342366,36864,3539456,36864,7667712,18087936,8519680,18350080,8781824,36864,8978688,18087936,9830400,18612224,10092544,565248,14483456,53248,14876714,53248,15466510,53248,17104944,53248,17563692,53248,17825838,20480,3736029,20480,5505230,20480,6029525,20480,6553757,20480,7078086,20480,8126982,20480,9437702,20480,21299677,20480,23396847,20480,24183294,20480,25690627,53248,18087974,53248,18808870,53248,19005480,53248,19202100,20480,19398930,36864,19922944,18874368,20316160,36864,20513024,18874368,20905984,36864,21103104,53248,22806572,53248,23068718,53248,23789610,53248,24576046,53248,25296940,53248,26083370,53248,262196,53248,589876,53248,1048628,524288,1245184,524288,3866624,53248,4915250,524288,5505024,524288,9109504,524288,1441792,524288,3145728,53248,3735576,53248,4128794,53248,5373976,53248,5832730,53248,6160412,53248,7077916,53248,7340058,53248,7602200,53248,11534364,53248,11796506,53248,12058648]}]],[[{"sector":1,"length":512,"data":[53248,16384028,53248,18481178,53248,18743320,53248,20054040,53248,20316186,53248,21364760,53248,21626906,53248,22085666,53248,22347812,53248,22872098,53248,29687830,53248,30212116,53248,30605338,53248,31129624,53248,31522844,53248,37355546,53248,37748760,53248,38141976,53248,38404122,53248,40108060,53248,41353246,53248,41615386,53248,42008604,53248,42467356,53248,43515932,53248,43843612,53248,44367904,53248,44892190,53248,45482016,53248,46858270,53248,47120410,53248,47644696,53248,48037912,53248,48300058,36175872,65536,36438016,458752,36700160,1245184,36962304,1900544,37224448,2293760,37486592,2555904,37748736,2949120,37748736,3473408,524288,4063232,524288,4456448,524288,4849664,36175872,262144,36438016,917504,36700160,1572864,36962304,2228224,36438016,9043968,36438016,13565952,524288,15204352,36175872,15990784,37224448,17760256,37224448,19857408,37224448,20578304,36175872,21233664,524288,26542080,36700160,27787264,36175872,29753344,36962304,30146560,36175872,31653888,37486592,32374784,36700160,33161216]},{"sector":2,"length":512,"data":[36175872,33554432,36962304,37879808,37748736,38797312,4739072,21692766,4739072,30343693,4739072,40501924,4739072,51970997,37486592,39321600,36438016,40304640,36700160,42074112,36962304,43646976,524288,44171264,37224448,49610752,36962304,50266112,37224448,51314688,37224448,53215232,36700160,56754176,36175872,57409536,36962304,58195968,36175872,59572224,36438016,61210624,4739072,67372005,36700160,68485120,36700160,69206016,36175872,72220672,36700160,73007104,36175872,74121216,5263360,11010251,5263360,11468991,2134016,851970,53248,1245232,53248,9175099,2134016,9437184,2134016,12320768,2138112,13500416,53248,13893691,2134016,14417926,2134016,14811142,2134016,15073286,2134016,15466504,36864,15925764,2134016,16973824,5267456,17498112,40894464,19922944,2134016,20250640,2134016,20840462,5263360,22413624,5263360,26214712,2134016,27459586,2134016,27721730,2134016,27983880,2134016,28639240,2134016,29032454,2134016,29818882,2134016,30081026,5263360,31916034,524288,39976960,2134016,40304646,5263360,40697856,2134016,41025538,2134016,41353222,2134016,41549826,2134016,41811972,2134016,42205186]},{"sector":3,"length":512,"data":[2134016,42532866,2134016,42795012,2134016,43188230,5263360,43581440,2134016,44105734,2134016,44498950,5263360,44892160,2134016,45809670,5787648,3801165,5787648,5963909,53248,4128822,53248,5242934,53248,5505080,53248,8257590,53248,8519736,53248,9240630,53248,9502776,6311936,1441874,6836224,42992317,38273024,31391744,37486592,38076416,36175872,39583744,36700160,45481984,36962304,45678592,7360512,11010200,7360512,19071108,7360512,20512772,7360512,40173720,38273024,44826624,7360512,50200580,7360512,51839098,7360512,52953210,7360512,54984704,7360512,55574560,38010880,1179648,38273024,6488064,38535168,2752512,38797312,8060928,39059456,2162688,39321600,7471104,53248,9961524,53248,14876724,53248,17825844,9457664,2359573,9457664,21430769,9457664,22807110,9457664,24248865,9457664,25952870,53248,131124,53248,1966132,53248,4325428,53248,6160436,3710976,7798784,53248,9175092,53248,16646196,53248,17694772,39583744,589824,39845888,917504,40108032,3080192,40370176,3801088,40370176,4194304,39583744,655360,39845888,1376256,40108032,4325376]},{"sector":4,"length":512,"data":[40370176,5701632,40370176,6750208,11554816,720935,11554816,1376300,14155776,2031616,39583744,786432,39845888,1310720,39845888,2228224,38273024,4456448,53248,4980788,38010880,6946816,40108032,7471104,40370176,8650752,40370176,9502720,39583744,786432,39845888,1310720,39845888,2228224,38797312,4456448,53248,4980788,38535168,8650752,40108032,9175040,40370176,10354688,40370176,11206656,39583744,786432,39845888,1310720,39845888,2228224,39321600,4456448,53248,4980788,39059456,8192000,40108032,8716288,40370176,9895936,40370176,10747904,39583744,1507328,39845888,1835008,53248,3080250,53248,5570612,53248,7995444,53248,11141172,53248,13172788,53248,14549044,53248,18022452,53248,23593012,53248,23920692,53248,27983924,1572864,1179648,1572864,2949120,53248,8519732,53248,1179700,53248,4718644,53248,1835056,53248,5767216,53248,8060980,53248,14876724,41156608,65536,42209280,262144,42471424,458752,53248,983090,41684992,1310720,41947136,1507328,41418752,1703936,18370560,1114140,41156608,65536,42209280,524288,42471424,720896]},{"sector":5,"length":512,"data":[41418752,917504,40632320,1310720,786432,1703936,18894848,2031634,18894848,3145763,18894848,4259892,18894848,5374021,18894848,6488150,18894848,7602279,18894848,8716408,18894848,282136613,18894848,355800168,18894848,355996778,18894848,357766346,18894848,357962956,18894848,375854555,18894848,379715586,18894848,380180015,18894848,384374283,18894848,388371833,18894848,388568443,18894848,406722365,18894848,406918975,18894848,424220761,18894848,429660249,18894848,435820645,18894848,436017255,18894848,466288704,18894848,467337263,18894848,485425154,18894848,495721642,18894848,495852770,18894848,495983944,18894848,496115023,18894848,496246041,18894848,496377127,18894848,496508274,18894848,496639359,18894848,496769562,18894848,496900638,18894848,497031714,18894848,497163011,18894848,497294179,18894848,497425269,18894848,497556359,18894848,497687498,18894848,497818575,18894848,497949658,18894848,500768176,18894848,541073719,18894848,541204801,18894848,541335883,18894848,541466965,18894848,541598047,18894848,541729126,18894848,541860228,18894848,541991277,18894848,542123274,18894848,542254463,18894848,542385637,18894848,542516711,18894848,543171093,18894848,543302172,18894848,543433254]},{"sector":6,"length":512,"data":[18894848,543564323,18894848,543695405,18894848,543826476,18894848,543957557,18894848,544088628,18894848,545268397,18894848,545399463,18894848,542639826,18894848,542769829,18894848,542902230,18894848,543031619,18894848,544212690,18894848,544342693,18894848,544475094,18894848,544604483,18894848,544736856,18894848,544867053,18894848,544999218,18894848,545128824,18894848,557129792,18894848,565387344,18894848,567746648,18894848,569122912,18894848,569573378,18894848,571678816,18894848,576921712,18894848,578232440,18894848,579215480,18894848,580591744,18894848,581050512,18894848,545530692,18894848,545661649,18894848,545792694,18894848,545923809,18894848,546054823,18894848,546185921,18894848,546317041,18894848,546448039,18894848,546579218,18894848,546710440,18894848,546841466,18894848,546972597,18894848,547103615,18894848,547234715,18894848,568796688,18894848,571352592,18894848,576529931,18894848,577840661,18894848,578823691,18894848,579872277,18894848,602341378,18894848,603923394,18894848,599925761,18894848,600056916,18894848,600187925,18894848,600318991,18894848,600450139,18894848,600581204,18894848,600712283,18894848,600843355,18894848,600974415,18894848,601105492,18894848,601236588,18894848,601367671]},{"sector":7,"length":512,"data":[18894848,601498743,18894848,601629780,18894848,601760887,18894848,601891959,18894848,615387637,18894848,615518770,18894848,615907358,18894848,616038447,18894848,616169536,18894848,616300625,18894848,616431714,18894848,616562803,18894848,616693892,18894848,616962011,18894848,617093331,18894848,617223517,18894848,617354835,18894848,618008621,18894848,618142090,18894848,618270560,18894848,618530126,18894848,618660411,18894848,621945990,18894848,622535934,18894848,623322278,18894848,624764070,18894848,614868198,18894848,614999275,18894848,615130360,18894848,615261432,18894848,615654648,18894848,615785720,18894848,616834296,18894848,617489648,18894848,617620728,18894848,617751800,18894848,617882872,18894848,618407160,18894848,618800376,18894848,618931448,18894848,620635421,18894848,620766548,18894848,620897584,18894848,621028671,18894848,621159772,18894848,621290863,18894848,624371221,18894848,628565525,18894848,625681574,18894848,627451046,18894848,628958374,19419136,54920076,19419136,55051168,19419136,55182257,19419136,55313334,19419136,55444461,19419136,55575551,19419136,55706633,19419136,55837710,19419136,6946836,19419136,7864340,19419136,8847360,19419136,18874414,19419136,21954570]},{"sector":8,"length":512,"data":[19419136,22675456,19419136,25165834,19419136,30343192,19419136,38731804,19419136,40042528,19419136,46727204,19419136,55967794,19419136,56098870,19419136,56229946,19419136,56361259,19419136,56492446,19419136,56623508,19419136,56754585,19419136,56885758,19419136,57016837,19419136,57147913,19419136,59048810,42729472,2031616,524288,4063232,42991616,5439488,524288,6750208,524288,10092544,911560788,0,4194498,54723359,57344859,60162947,63898575,919348,864,4194314,0,0,0,0,0,0,126,0,23724032,37879808,0,0,15138816,388,314,0,28508160,0,0,268,194,0,213,47644672,35454976,33947648,0,0,652,44957696,50003968,460,31719424,0,613,248,0,0,0,1448019801,1095520837,1644167257,-721365633,1493172224,1398362886,5064020,15294720,0,1325748224,1263489622,14614758,0,139460608,1163023951,1380930130,14614758,-1,189792256,1314018895,1330009167,-431731115,-33497344,16777215,1326141440,1330532950,1330464077,15096146,-196385,65535,1448020560,1162824018,1380930130,14614758,-4]}]],[[{"sector":1,"length":512,"data":[240123904,1314018895,1397572943,1447645764,15094341,-327457,65535,1448021584,1162825298,1162695501,1498566477,14614758,-6,156368896,1381127759,1280660293,340,12976128,223,1448021074,1095914578,1431257936,33641550,-704643072,57088,1326207488,1330401878,1329808449,22302293,4,14614742,189923328,1179801167,1296387145,21316687,6,14614710,189857792,1381127759,1178878277,-146583979,100715777,-973077491,16834304,-553593344,512,1448020562,1095062098,1179992644,0,-855509248,1392508928,1381388039,1414090313,1033,0,100663296,1037,16777216,-553613824,512,1448020563,1229867346,1397572948,2057,0,100663296,1037,0,1392594944,1381388041,1112819027,201934421,0,0,67962368,0,-436207360,33611520,156434842,1196578383,1430410309,1050950,0,0,265478,14614758,0,1448020819,1413829458,1381254482,1313113,0,0,265478,0,15073281,587333855,1326142209,1162302038,1413829204,403265874,0,0,67962368,-553589248,0,1326142208,1279480406,1112686917,470369877,0,0,67962368,0,-16777216,150994943,268436736,134219776,134319104,134341632,134344448,134348800,132864,0,134221568,16776960,1074088192]},{"sector":2,"length":512,"data":[16776962,402775040,16776961,2048,0,1536,0,1024,0,0,0,1536,0,1498613248,1296389203,1325858816,1280460118,284993,1968577792,1448020754,1095520837,1095773785,1363,0,1163284235,1497451602,1245859630,5,184549376,1380275791,777211205,4866639,-1192916651,10092753,-1996488704,1354980844,1028150337,-2115204267,-67075348,16003,-1608551424,1183318016,10676478,-1444406925,-401313024,259195103,-369099080,1051984007,-4709939,-1954616321,20768984,-1070337934,2122437171,1968852472,-62485720,-150863686,-95515678,-511583753,-1054146049,1375787651,-1949660336,1107343568,199762381,1918523393,-125926979,-1233825708,1341816449,-1984989866,-1560281058,378077184,113704962,39452672,134796,184549537,1962934790,444170,-1945970944,503317006,235067578,624932895,857678285,41920,-899816053,-1927413756,385842878,9824263,817152799,54272461,-1910623630,-1912602594,855649310,-1073042186,179108725,-1376356928,-8470899,-544536810,-1073042772,1547438196,-544475531,-74714389,520116968,512630467,512622592,-164429780,234881215,375047,225748723,-1073042354,70974325,-115348875,3965123,-1097992076,118947710,-527777742,1958742700,1950039047,-219436540,989626446,-58718092,-1341950884,1444850268,1577060072,533623327,108447171,852003500,849671149,-1769100608,521600894]},{"sector":3,"length":512,"data":[-1258404214,-1021194947,-128545506,112795414,-851463168,41033505,868467003,408512,994472960,1962934278,172352,132651,1547,-594857099,71812150,-1897348468,408320,52589056,1912602630,429601,104539648,376897538,-1560280925,44236802,-1547685120,80347136,-18432,-38210069,-1578046465,103481344,1609039872,-594818304,71812150,1189659276,41728,-1593834294,1206386688,-1957311744,4097004,712245248,-1560280927,10551296,-1911297280,37546176,-1557741517,-1557790704,-1591345134,-1073020908,10742133,41728,-4666531,-1309217793,-739716348,14844362,-1010693136,-1059912527,-265957237,266503167,920423363,503596942,7819,16011,638633859,267915,101616422,1442560,34476800,1107343360,-1910103603,855642142,244000466,1068761096,1047667149,930267451,-1325396219,652792580,1050115,-768354162,168725286,-1273175296,1914817855,1925266205,870961430,109979382,-1375993840,19323019,871948863,-1207702592,-903937948,1439367170,1397812363,1465274961,12060190,-69693952,637689540,1854093311,91554306,-352308504,113607448,-2030025077,1183447622,2222080,-2030025077,1183447622,-1591321856,20774930,-4187392,117440542,1516134175,1566071641,458703,1048782336,1946157072,113714697,65554,117402091,-402259968,-1960443402,-2097149418,78712770,-805049645,-352204056,2112377396,429568,346105344,41728,306086694,259325952]},{"sector":4,"length":512,"data":[637594088,1050311,-1075314688,638446337,1183487,-402585368,-1070399155,2010131290,10553288,279127552,-16382464,117440542,863354891,-402575128,-402259844,109969779,-1960443904,-486534130,408348,1360425728,1048782416,1962934290,9496579,1493265896,-339672313,-373094435,10551296,1958742784,650153534,1054347,5691,-919390349,-1064415167,1351974,-193609717,-1593835357,10682368,-1588525312,-1557790720,109838356,669515776,403713,7596032,-1578704295,10682368,-2144943360,-369090498,-1960432268,-486538738,278996489,-389903360,-1960443719,637538334,790155,-67100481,39160614,-1951733072,-1014256702,-1007557973,540966950,712297728,-1960394612,855642134,8906953,34507046,244000256,549388300,-1960379392,-843579051,-1031034049,-1430244693,-1580994334,-1960443904,637538326,637538467,528011,870961473,-1036256010,-242547086,-35204786,102694539,-1064379762,520594931,540966950,309644544,637549800,790155,-67099713,63407019,-389809438,100728930,-1155661824,126550016,125091851,347854990,-1930171648,346236423,-389865728,-620036087,-2026503052,868418127,65754587,184577675,990934253,-193657770,184829577,-1947372069,1575611357,41411,208977931,-1591295858,103481360,124977152,721420449,-1023410170,565542,-1325396219,-1008151804,1481461061,811096152,104579123,57999360,-397415608,91488356,-335545416,7399493,-88603277,-398726145]},{"sector":5,"length":512,"data":[225640613,5771,1741505972,-335545160,2001705,-851528704,444193,-1946060544,-1006632434,-1560281082,109838338,113704964,6684672,134796,10731571,378260224,1169424384,113534925,10682370,33983488,1740163840,-1188967115,12451848,704256,-65073634,-1021335821,1741504948,7817,859832248,2001874,1966848,281248512,52872078,-2097149946,-1960443694,184552990,-1142524453,-201900032,1135925387,-456103987,378078322,1438842880,378268811,1202978816,10577869,63517440,83886086,-1064435696,-1591328432,-1073020914,-617353867,1359478579,637534369,637538467,1449609,406751526,106386176,2031366,1532954368,268879654,-150994944,-402099496,57802771,-1664097703,5771,1741506740,1575324573,378218179,-164429816,259391243,1477458,1140897792,-799381555,-1188465948,-819249152,41077307,-785659253,109970974,512622592,-201588736,-2128672860,1967128831,-13417725,-998911477,920423363,-1962653810,-1275068394,644336967,1449611,135695142,915088896,-13434856,725614777,1925856206,734694146,378229457,12058624,1516752196,393602058,512624158,-1910112256,-67104762,520594675,200684355,-1966246446,1357132484,5771,1741506740,182872,0,0,0,0,0,0,0,536576,458752,36873,9240576,544777,9372250,53248,10485764,544777,10617559,544777,11141848]},{"sector":6,"length":512,"data":[53248,983040,53257,1376262,53248,8519696,577545,8716290,577545,8978436,36873,9633794,53248,9830404,53248,10092550,53248,10878982,53257,11993088,53248,14024752,53248,17367088,544777,17956864,53248,26214416,53248,26607630,53248,26935318,53248,27197466,53248,27459608,53248,28573698,53248,28966920,53248,29360176,53248,30015500,53248,30212118,53248,30408730,53257,30736384,53248,31784972,53248,32047112,577545,33226752,577545,33619968,53248,34340880,53248,34734088,53248,34930698,53248,35127310,53248,36962318,53257,37158912,53248,40042512,53248,40304688,577545,41418754,577545,41680900,565257,48496640,53248,52297732,53257,53215234,53257,54591492,53248,56623118,53248,57081870,53248,60030986,36873,60686336,53248,61931534,577545,62652416,2097161,64552960,53248,64749582,53248,65732618,53248,66977806,53248,67174412,53248,67371018,53248,67698702,53248,68222990,53248,68681738,53248,69271560,53248,69468170,53248,76611594,53248,81592330,53248,81854478,53248,86179854]},{"sector":7,"length":512,"data":[53248,87097354,53248,87425036,53248,87687178,36873,4390912,1069065,4522361,53248,5767206,1069065,5898342,53248,786448,53248,3014674,53248,3866640,36873,4784130,53248,5046310,1085449,5242882,1085449,5505028,53248,6160424,53257,6488064,53248,6815762,1085449,7340034,53248,7536678,53248,7798824,1069065,8585216,1085449,9830400,53248,10420224,53248,10682416,53248,13369362,53248,13893650,53248,14352384,53248,14745648,53248,16318472,36873,17760256,53248,19529746,53248,21168146,1085449,23068672,53248,23330824,53248,25231378,53248,27787282,1085449,28835840,53248,30539794,911560788,0,4194498,107742740,108791420,110823052,112789177,1555,672,4194324,0,0,0,0,0,0,126,0,97584248,0,0,0,1206,90833978,806,64881466,0,40763392,27657501,36503552,48627712,0,1524,62391625,68222976,12714830,22348494,95289942,25494161,0,45678592,15925248,0,81134453,51445760,674,41944310,60293379,0,1380123481,-905969580,-788475490]},{"sector":8,"length":512,"data":[1493172224,1398362886,5064020,15294720,0,1107578880,-433048489,56064,0,1124356096,-433048497,16833280,0,1107578880,-433047465,33610496,0,1124356096,-433047473,50387712,0,1292128256,-431010225,117496576,0,1174884352,945049167,15087704,16777435,0,876806992,-620698064,256,1342177280,808993539,14352614,3,89128960,1128352834,-620698037,0,1342260736,1431060996,-620698043,256,1342177280,1163020037,15093317,131291,0,1497564240,15093313,196827,23330816,1163002704,-620698044,1024,1342247680,1195461895,1096044101,14352614,5,89128960,1464816194,-620698034,1536,1342177280,1195985929,1380406344,15096129,458971,0,1094977616,1380404050,15096129,524507,0,1229719888,1112819783,-431663796,151051008,-788529152,1275744256,1414022985,1162170951,-620698034,2560,1342177280,1195985929,1497584712,15093313,721115,0,1229719632,1381255239,15090757,786651,0,1229720656,1297369159,1313163073,15090004,852187,0,1163462224,1464814668,14352614,14,89128960,1414088791,-620698043,3840,1342177280,1229734405,15092558,8388827,14876672,1212353106,1112228677,1262568786,0,-620691968,1375731712,1162363656,1329941315,65606,16646144,26607835]}]],[[{"sector":1,"length":512,"data":[1229196114,1413694802,1162103126,131151,16646144,219,1212352850,1397441349,5721934,3,14352638,139591680,1414742348,1162104653,1024,-620702208,1375810304,1480938504,1414807892,393298,11927552,219,1230440274,1229800526,524366,14024704,50069723,1230440274,1095582798,655448,14024704,219,1396771155,1313294675,156521027,4,0,218497024,4,65536,14352494,1392583430,1497713418,1397051984,155469139,8,0,218497024,16646148,219,122880000,1145128274,156845387,12,0,218497024,18219012,219,139657689,1415071060,1162104653,4105,0,100663296,1037,16777216,-620706304,512,1230440019,1464812622,5129,0,100663296,1037,67108864,-620710400,11928064,-1241382693,33610496,14352566,1392604418,1414481670,156850255,24,0,218497024,4,131072,14352566,-620710398,32375296,1213662803,1480938053,7177,0,100663296,-1241512947,56064,1392508928,1162368774,156845394,32,0,218497024,11927556,219,106103240,1397902403,604590659,0,0,67962368,0,0,1124487936,1329943116,2623820,0,0,265478,0,37879808,1313408851,1313426515,2885957,0,0,265478]},{"sector":2,"length":512,"data":[0,28639232,1162086227,1313426508,3148101,0,0,265478,0,77004800,1163135315,1329812568,156389196,52,0,218497024,4,65536,14352566,1392640514,1480938510,1128350292,1330792267,155471445,56,0,218497024,4,65536,14352566,1392508930,1464814600,1162103126,3934543,0,0,265478,0,72941568,1229457747,1230391367,156190020,64,0,218497024,4,0,156434432,1297239886,1162103126,4458831,0,0,265478,0,93061120,1162085715,156844364,72,0,218497024,4,65536,14352598,1392508930,1431261957,1275675726,0,0,67962368,0,-704642816,33610496,122880535,1330859854,155471445,80,0,218497024,4,0,0,50200584,46792712,47972360,20774920,22151176,31784968,34668552,35454984,26345480,28049416,29360136,29687816,36241416,37945352,39518216,39911432,40304648,40763400,43384840,46333960,8,3145728,-65464,98762752,-64936,786432,0,524288,0,1124270080,21586,1398362886,72172884,-1981087744,1124536569,1345213522,348993,0,1380124416,1112485460,74,0,-387610283,12517376,240590336,-1090518808]},{"sector":3,"length":512,"data":[1461583872,154,48896,-401713378,12517376,-1705566720,0,-883037047,-739766348,1946631173,1979923466,243718,-402630936,146014369,-1142358222,616860165,303743,855638178,41664,-1577056862,-1572863994,1085800448,-1077899776,-1977221012,87696901,-1977156748,-18171,-1207812120,-141492169,-137219120,41969,-1172369890,465043711,522308901,4242115,-2144943474,-33519834,108267324,41026620,-1269824592,89450496,1961101912,286439469,1206386867,288405509,11665591,-2147140120,376777466,-2029092826,12058880,100710657,-1274730008,-400510190,-1262287582,85780495,288405584,11665591,1476727272,-771096399,414320757,41354044,-225836623,-889269110,-25165644,-1274907112,41729,136841,3720,1734,-1547685119,378077184,1354956800,47134,1048631438,1946157056,101107205,1478426880,104759503,24444928,101107395,28573696,108271309,382533812,1588655339,-1341974296,51636291,-855438872,920423203,-402372725,1860763427,303359,-905969502,-594870270,173509174,142051894,105876022,74418742,662163770,595064122,528009982,460902142,238733822,326565890,775605758,192348163,5769,3721,-905757208,12058632,4098566,953088,1477376,70576128,5771,-888987160,-1207757080,1049232896,-896860160,5770,-888923672,-351862344,100775939,49932368,4098648,952832,-1947301376,973078550,839022062]},{"sector":4,"length":512,"data":[66382016,920423371,906385290,-33261686,1442506,974615040,1996488726,47119889,1912602934,20331017,-402426112,80347838,45213696,103465610,-1057095680,44427467,103466634,-1057095679,920423371,-1476114550,604271856,-2139091953,1879048230,1544,-1962933558,1200240348,-1324932092,-2132749820,-1895825370,1544,-2147482934,-150994906,950475,-1597306880,10616836,-594818304,72846134,326423051,-946929869,-1962571226,-1962934242,452811,-889686710,975568898,-503155451,-594820103,73370422,-1170940488,-751108078,-201909645,1642387595,141886376,1642464012,1139193520,1122419594,1122420618,-469761334,-419683231,1048628065,1962934277,-855526392,1946202134,-889081854,-973077088,1286,309706762,382592050,175489034,337544,41280522,417858480,-594818050,2143630878,38127364,1170724784,-1929347068,-1996455803,1569459269,273008398,1301021481,809879058,80355072,517769984,75482422,-1157406280,-880081857,-1325236863,-955616041,-676199867,-1962668360,340101592,-1995027060,1301026909,474843418,857623948,80355264,-326413056,637959876,1241798027,1972053578,2110006792,-958713076,1286,-10688498,1006633401,1010070536,1009808403,1229222916,661920572,594805052,930350652,1182014012,1333005628,-814604228,-881534405,1124173862,989894888,-1950320930,196930547,-1330088741,8906760,-2098716496,-402083840,-498401155,1000664042,648049886,540803466,1793628530]},{"sector":5,"length":512,"data":[-270384384,1048613355,1946157056,25699978,-401937597,-953810866,1124732161,108971075,-1993949133,-1993996219,-899872163,-594870268,75482166,139299622,139274534,-1004135965,1048579197,1962934272,92939787,1191189736,65796066,-402613016,-1070334757,855639242,314048,48762288,1393209344,1342591569,1476424424,712247100,762579004,863243580,896797244,512362932,-13500416,1375732153,1510041064,372949758,544604160,5770,246683627,-352235032,1456659,-32672768,-1979061302,-352321514,583683,117452264,-1017423526,909821694,410386433,1381093118,-1979317832,-1962934210,-1962934258,-402653162,1499070742,839103683,17623551,-13499724,503383529,-1912586056,1343654872,-628416768,-1977157749,1946631173,1946696737,1946827820,1947024437,-1023523015,5690,1877490806,-6232064,5770,1676160235,-1202564864,-1008202233,-346465792,5564444,5690,-889318540,1206390763,-8853504,1072170987,1477120,-141867264,-1495082357,503329256,-1912586056,1343654360,-154760704,838879782,-1950219274,1662421960,-301027328,-980811541,15461954,-300961718,-1047920405,-1021317566,1668609851,509039185,735021830,1477326,3574272,4241408,-947201906,4859638,-1023148238,-125050671,378264203,-1031602077,-1207912442,4800128,-1274907385,-1910569296,-620036928,-1968433548,27847896,-319095947,-76283480,-72629365,116124898,-1414731894,520617186,-1017554337,106256214,1560744141]},{"sector":6,"length":512,"data":[12803679,0,0,0,5505024,262144,36870,458752,262144,851968,36870,1048576,18362374,1376256,36870,1704192,262144,2097152,36870,2294016,18624518,2621440,561152,2228228,36864,2424838,36864,2752513,561152,2949125,561152,3145734,36864,3407872,561152,5898240,36864,15073284,561152,15335426,36864,15597571,36864,15859714,36864,16252936,36864,16515082,565248,16908288,36864,17301504,561152,17760262,561152,18284550,561152,18808838,561152,21626884,36864,21823494,561152,24641538,561152,25165827,36864,25559048,36864,25821194,36864,26673158,36864,26935304,36864,27197450,36864,27656200,36864,28573702,36864,28966922,36864,30343174,36864,30605320,36864,30998538,36864,32702472,36864,33095690,36864,33619977,36864,34013195,36864,35127304,36864,35913737,36864,37289990,36864,37617670,36864,38862854,36864,39190534,36864,39649286,544768,6291711,544768,52167465,544768,53543777,544768,53740607,544768,54854670,36864,40042502,561152,40370180,36864,40566790,561152,42008576]},{"sector":7,"length":512,"data":[561152,46923781,561152,48037893,561152,48300037,561152,49414149,561152,58261509,36864,65536001,36864,69468162,36864,73924614,36864,74973194,36864,75366408,36864,76218376,36864,76873736,36864,78118923,36864,78970886,36864,79233032,36864,79495178,36864,83492874,36864,84279304,36864,85852168,36864,87228424,36864,92209155,36864,92471302,911560788,0,4194498,232590677,242552437,248254141,269160459,1593,144,4194310,2,0,0,0,0,0,126,134613072,3377,190187994,148244155,0,213453157,2684,0,41943040,151650986,198770688,184745984,2727,218957082,167772636,193004117,3103,47513794,28772945,133237545,216793088,195887104,0,205914879,19857728,17302579,3178,162728051,2089,24904197,0,3220,1329857369,-251658157,-788475634,1493172224,1398362886,5064020,15294720,0,1174818816,1381122371,-620698023,256,1342177280,1095779847,1498696018,14352614,4,173015040,1481982278,1095322697,15096146,1048795,14876672,1514538320,-431009211,1073797888,0,1174753280,1313294675,14352614,128,156237824,1163284294,1330398802,-620698025]},{"sector":8,"length":512,"data":[524288,1342177280,1129137672,1163087692,-620698044,14135296,1342177280,1229800967,1414877262,14352614,55217,139460608,1431260486,1414877268,14352614,55218,122683392,1313426758,-430680753,-1291789568,215,1376276480,1329873221,-430355378,16833280,0,1208373248,1162101833,-620698034,512,1342240000,1398362887,1162627398,14352614,4,139460608,1431064406,1145652557,14352614,8,156237824,1163020612,1380930627,-620698023,4096,1342177280,1129464071,1163282760,14352614,32,122683678,1180257857,-431666103,1057020672,0,1124487424,1414745423,-922597038,16911360,0,32512,-620698112,-2147481344,-620685824,-922601216,1359008000,1413566471,1381258056,13173364,66060,0,79,14352614,5242889,14352662,13173348,105972267,1397901636,43930196,34341065,1,4390912,15073280,590043,18219076,42860763,201,1095632721,1414743373,-922564270,16911360,0,2048,-620698112,150997248,-620685824,-922568448,1358954496,1415070982,-212708269,201378050,258,67108864,-436207616,151051008,369100032,-486483199,51458,1376342272,1397311301,1397900628,13173520,1310722,52560664,65536006,69469190,970,1480655442,822083592,-620702205,1375731712,140001794,54525954,14352598,38928384,67655747,-704426240,56064]}]],[[{"sector":1,"length":512,"data":[1141002752,395352,14025566,53543131,1346503250,1828718600,-620702205,1375948544,139023106,58458122,14352598,38929186,201869636,-704410880,1073797888,1141002755,919635,14025626,57475291,1397031506,-1459613688,-620702205,1375952384,1095517701,302535495,-704398592,2080430848,1090671107,2124,11928522,62587099,1212219986,-654311160,-620710397,1375971584,139215362,65536002,14352566,38929369,50874434,-1241254144,-1962878208,1124225539,264268,11928582,66519259,1212351058,352322824,-620710396,1375967744,139215874,69468166,14352566,38929429,117983300,-1241513984,56064,1174884608,1380273225,71451461,131273,71958656,394324,82642060,1144,106037248,1145979208,542028,-704354560,56064,1292128768,138757199,74973186,14352598,122815572,1396917586,138762825,76283908,14352598,122814464,1447645776,138761281,79429638,13173936,65548,1,26,14352614,1703937,14352566,13173920,139592807,1380275029,1096040772,-318758904,-922427132,16780288,256,4096,-620698112,268435712,-620710400,-922431232,1376041984,1296125444,3147845,84803584,786633,1,5177344,15073280,65755,18219088,83755227,26214601,1163134801,1430410328,-922404538,16780288,0,32512,-620698112,-2147483392,-620685824,-922408704,1359071488,1480938503,1128616532]},{"sector":2,"length":512,"data":[13174100,16777218,90572124,111673350,101189243,0,1095239250,1162626126,2030043144,-620702203,1375731712,1146047748,133189,14026122,91816155,1430390610,1514754886,264261,14026142,219,1380976466,1413568073,395333,14026162,92930267,1430390354,1397706822,-989853688,-620702203,1376085504,1179992582,138694213,98041866,14352598,106038706,1346786626,201871956,-351931648,134269189,956302349,-989804283,1325945349,1179534672,138628693,101187600,14352510,156370419,1431260745,1314211412,1312835,8259102,98042075,1279658322,1179145045,138628693,104071192,14352510,156370462,1397705795,1314211397,1837123,8259146,104071387,1398081618,1094996549,537411924,1862695680,201378054,16777472,268435456,-436207616,16833280,-1241509888,1593891584,1241565446,1308905990,138759489,111673392,13174428,65548,0,79,14352614,5242881,14352662,13174412,106038686,1179014466,-2146938299,956301312,51461,1393119488,1129464133,1128616520,13174476,2818050,115214036,6,1854,1837,1229325394,543820,-16315648,201378054,16777472,352321536,-436207616,16833280,-1241508608,-285156608,-570373882,1090802182,139613268,119275541,14352566,72484619,1162692948,754980360,-620698105,1376197632,1514754820,1706053,15075134,219,1095631954,503858509,1593835520,201378055]},{"sector":3,"length":512,"data":[258,201326592,-436207616,151051008,369102080,1325456129,1426114823,1141395713,1413829697,2068139337,33605895,-2097148928,101158151,-788012800,-1341669369,1375731719,1095063812,2130,14026654,126681307,1330447698,138957902,128974850,14352598,55705600,140067140,130023428,14352598,72482816,1381322568,-788527608,-620702201,1376230912,1313426691,-520091640,-620702201,1375731712,1128616707,2568,-620702208,1375731712,1397703688,1330795077,82,12976128,219,1329859155,1380275795,1313818963,1033,0,100663296,-704642035,56064,1392508928,1414416644,526674,0,0,265478,0,11927554,268566747,100714755,89326104,1329877837,788819,0,0,265478,0,51380225,393417,1191662336,1094997061,269043028,0,0,67962368,0,-704642048,100719360,14352598,-620702202,14026240,393435,1392988928,1094997061,336151892,0,0,67962368,0,-704642304,33610496,14352598,-620702206,512,1162282835,1296651348,1575237,0,0,265478,0,14024708,-704249637,100719360,14352598,-620702202,1536,1163069267,1296651348,1837381,0,0,265478,0,14024708,-704511781,33610496,14352598,-620702206,512,1162283347,1380074324,155926853,32]},{"sector":4,"length":512,"data":[0,218497024,4,65536,14352638,1392508934,1413829385,1163018819,604588865,0,0,67962368,0,-33554176,33610496,156434928,1448363335,1179210309,2623833,0,0,265478,0,16646145,393435,1393120000,1163285573,1497778514,11273,0,100663296,1037,16777216,-620691968,124453376,1229195347,1380338515,805913925,0,0,67962368,-620698112,-1241513728,33610496,139657216,1263749444,1163544915,13321,0,100663296,-436206579,16833280,-620710400,512,1162283091,1413563988,940134996,0,0,67962368,0,1644167680,100719360,14352598,1392508934,1413829384,1414807878,3934546,0,0,265478,0,6422530,-704249637,33610496,139657216,1179927879,1162692948,16393,0,100663296,1037,33554432,-620731904,15074816,637927643,1393054474,1413895237,155536713,68,0,218497024,4,131072,14352482,-620698106,512,1229326675,1229341774,156521298,72,0,218497024,4,196608,13173364,-620702206,114033152,1158021321,1174950661,1313099337,156522565,76,0,218497024,4,65536,13174476,1392508934,1347310858,1414218561,155536713,80,0,218497024,4,131072,14352614]},{"sector":5,"length":512,"data":[-922256638,1536,1095764051,1230261059,1409893709,0,0,67962368,0,2063598080,100714759,14352614,1393218054,1413826313,1448365641,1477002053,0,0,67962368,0,-1241513472,33610496,14352510,1393134598,1413829385,1448365641,1544110917,0,0,67962368,0,-1241513472,33610496,14352510,1392616194,1096241931,1128617552,1397903188,24585,0,100663296,1037,0,1392508928,1162169092,6555984,0,0,265478,0,14024705,-50200357,1157911307,155403608,104,0,218497024,4,131072,13173364,-922597118,512,1329859411,1230521683,1146045268,7080261,0,0,265478,14352598,0,1397098323,1129464133,7342408,0,0,265478,13173364,41156610,-2046689079,33610496,122882366,1347962182,155471425,116,0,218497024,41156612,65737,13173364,1392508930,1347634694,156518732,120,0,218497024,4,262144,13173364,-922575358,46728704,-217710391,100714754,139657216,1129729605,1414419791,31753,0,100663296,-973077491,56064,1392601344,1447970054,156390483,128,0,218497024,8781828,65755,14352582,1393075970,1413826310,156651077,132,0,218497024,8781828,65755]},{"sector":6,"length":512,"data":[14352518,-254,255,184551424,2048,4096,570429440,905973760,1526730752,6144,301996032,8192,251666432,10240,419440640,12288,603992064,14336,654325760,16384,1040203776,18432,1140869120,20480,402673664,22528,24576,26624,-1811912704,28672,30720,32768,34816,151029760,36864,83886080,-16777216,1811939583,-16775168,1912602879,-16777216,553648383,-16777216,486539519,-16777216,872415487,-16777216,1107296511,-16773120,1174405375,-16773120,2063597823,-16775168,2080375039,-16777216,721420543,-16777216,939524351,-16773120,436207871,-16775168,-1728052993,-16762880,1761607935,-16777216,-922746625,-16777216,1677721855,-16777216,1258291455,-16775168,1845494015,-16775168,33554687,0,0,0,0,0,0,0,0,0,0,0,67108864,0,0,0,0,0,50331648,5459780,1498613248,1296389203,-150994940,118659448,777211716,89342288,0,1443364864,777212485,88752719,0,1225261056,777147470,88752719,0,1409810432,776293705,88752719,0,1124597760,776688194,88752719,0,1443364864,776360517,88752719,0,1141374976,776688457,88752719,0,1174929408,777147457,88752719,0]},{"sector":7,"length":512,"data":[1174929408,776816980,88752719,0,1174929408,776228425,88752719,0,1342701568,776816980,88752719,0,1443364864,777274181,88752719,0,1393033216,777011543,88752719,0,1258815488,777012549,88752719,0,1158152192,776160600,88752719,0,1393033216,776487762,88752719,0,1158152192,776884312,88752719,0,1393033216,777276496,88752719,0,1158152192,777213518,88752719,0,1158152192,777410126,4866639,0,567095476,1499094731,1344385115,1448235347,-326427051,4570012,-617393394,1586158478,-773598964,505398755,142001491,-1387221508,-1951541109,-796152376,-1377268819,-125063856,-1901244243,1482563520,110939130,-326412969,-66027836,-1413248085,-1951678069,-1420252222,1487652491,-1411871573,-1420252328,113925407,-326413056,567093940,2126832690,-1031099642,-1425375548,2126825098,-997086450,1571492478,1426067658,1317792907,141986314,-1274653046,1562496299,1426065098,750054539,-466476595,2126824074,-963990778,-1425375548,2126823818,-980767986,-1424851260,1100381,-1964209323,1317669998,141986314,-1274653046,1562496301,1426065610,12119179,-1004417741,-2010773890,80370965,-326413056,-1207544182,567096065,182877,-1259566251,-1004417708,1571423870,1426064586,1183509643,-852577274,46816545,-326413056,-1274653046,-1960719050,-49712,-503905164,-899816457,-1957363710,106334956]},{"sector":8,"length":512,"data":[567097012,-796140917,1962934077,-136186108,46816739,-326413056,173458718,-1204764029,567100160,855929631,855829449,41920,-1861845308,147479979,-326413056,139904286,-1959738749,28837454,522308931,-1070398862,1560281251,1426065098,2126834827,495658506,-849936200,856060705,-338545719,-1547685118,2126774272,-1416496122,-899830894,-1957363704,176080108,-1960998106,1451951694,1459730440,41034189,10731571,147479808,-326413056,508619907,-1928563003,118927486,1329376508,1336935026,-1527541352,-978665422,448005718,1452089805,-1960896848,1320421966,-1004592691,552076926,1575324416,1426066122,-987829109,448005718,-1273028147,-1004417713,82314878,80370944,-2095222272,102637255,-1178586593,-218365696,-1965951314,-141865023,-1527513778,-1070391382,-1023410013,-991130795,-1946417538,162597958,-1140463405,1183558407,-754601716,992744,205949867,-1426055387,-1324726645,-1410804981,-1324726645,636015365,-1951727553,522521158,-1411329792,576093,518818645,-66423099,129772973,-523040335,95530386,-805052205,-1378876499,-523039823,95530387,-670834477,65589677,2126782403,-1416451322,576093,-1964209323,900991558,-1064558131,-66683196,-1416385645,445021,518818645,-1979296059,632556102,1562321357,-1090517302,649986048,1227008,-1406206832,567096756,-987868410,-853167083,93265697,-2097003121,-421395257,453116107,892609571,959985462,1027357498,1433747262,10611851,650153472]}]],[[{"sector":1,"length":512,"data":[136843,1183502379,-852380666,46816545,-326413056,9865,136844,16706689,7822,-1996477279,118944326,175556092,-1400734067,41045820,-1852289104,-1070422797,108447146,-16597363,1920875692,-1434537982,-1527541352,380243376,45518111,-193558017,1190551180,-1981645171,1183643774,687978746,2123178445,-58816046,-1191295348,567093505,-1920838003,12120670,1914817867,-1161809150,-628228096,2526202,35032576,10746624,147479808,-850545664,-1957311711,-973332756,-1968437642,67056344,243188958,-987867577,-1968436618,-202558776,-1430244700,1124120655,1108235973,1579098573,-1040775566,628359192,1192132292,494203707,-527777742,1950039212,-214193659,-58657675,-2134739910,-1116447492,-341156688,-993555528,-953479554,1562356296,1426065610,-65082229,-1408862523,-315438966,2126827011,1001211658,-2146338831,209009404,309485884,242711100,183181356,431246926,1090789837,1001077428,-2147126031,678714428,-796245972,1454005424,-1958235106,-853604617,1918770977,1031808531,1359836160,855637945,1336865472,1504337072,-1527525845,-978665422,-1958344074,179066878,1007776960,1007514716,1007055457,738359162,-353654240,1560182145,1325692206,-2128811185,774831741,2105546101,259349757,-2147225725,1950023549,1031819014,184186204,-2133690944,1966800765,-1436766205,727697291,531255239,313949,518818645,309773820,852527788,198872054,-2146470693,1952251768,-8880119,1258517562,1136193909]},{"sector":2,"length":512,"pattern":0,"data":[243188736,855648232,-2147030053,91500088,1977236291,571638,-401965372,-628424688,-1006631752,99092094,-899866880,-752156656,41075515,-1951743093,-203553848,-1007449180,686346803,-654863872,-326412853,106335006,-1962927384,840894199,16824768,-772362510,-1979154748,-1527534911,46816543,429568,109979136,-13434836,650130172,175375674,-1190693814,-1359806465,1438904299,-326898549,-973332960,2123171446,-1408821536,41295676,-1952964688,-796180280,1017908963,1007055457,738359162,-220026336,531250608,2002462,740199936,-2131348736,292814908,-1948221811,1957098442,179064328,-335841856,519998442,-1178586617,-1359871744,2126828022,-1430156790,-1960860429,80371173,0,0,544768,1114181,36864,1638400,36864,3932160,36864,1638400,36864,4194304,36864,7864320,36870,66048,5787648,262182,53254,262192,3182592,327680,3182592,589826,53254,1114160,3186688,8323072,3182592,8781824,3182592,9043970,36864,9306112,53254,3080240,53254,3407920,911560788,0,4194498,16449783,16974083,18743563,19988785,56,48,4194560,0,0,0,0,0,0,126]},{"sector":3,"length":512,"pattern":0,"data":[0,0,0,194,213,0,0,0,0,0,0,0,15138816,0,0,0,0,0,0,0,0,1380976473,1163152969,1543503954,-721365565,1493172224,1398362886,5064020,15294720,0,1275286016,21587,1845493760,57088,1280,805320704,16776960,65536,0,1380976384,1163152969,100663378,1414748499,281925,1263706624,1380977425,1163152969,1095773778,83,0,0,0,1414548484,-443984591,503316671,48983,10114830,-1090519040,1461583872,154,2001664,1140897792,-897572403,-1207912928,567100417,-883037047,0,0,36864,589824,20480,917504,18100234,1245184,36864,1572864,18624522,1900544,36864,2293760]},{"sector":4,"length":512,"data":[-352321096,-1010814206,18364159,-399669016,-1073009237,11535477,-5242133,-1608909662,-16489392,-1574275422,1705126516,711172650,-1574284126,1134701138,708944426,1342179000,-1207472152,-397410297,146278248,1642614784,636935,123398224,144107715,872393192,1491620032,902215881,-917378992,1345706936,-397361101,112775671,28856320,1005080576,65517576,-1419188144,-1022744600,-2081649835,-1000994580,56991774,-1939495906,1586100806,-92864520,1996430931,-297801724,-362753,451475574,100745454,117400996,516187558,-1014930016,-1499396144,736153957,-28930856,-1946394999,-350143946,-60898290,38243110,-2096658138,1308818502,1183575925,-60898056,1577552166,-1034033781,-35127294,131087634,-1070398349,-793241365,-1326952441,-1575581422,1705026405,1344355512,-1191218712,1438842881,516222091,-1014930016,-1499396144,736153957,71732184,65065288,126559960,1705121419,180829,-2115204267,1442906860,-1962641781,104531526,91383206,-352320314,-11133382,-1159199114,-397389057,1444867457,-24736490,-1927917314,860945990,1520062656,-401637099,1035503492,-396996575,1499021378,-16873843,937973328,1582913856,-1034033781,-1957363708,82608620,-1957210622,-1232271746,28900860,1911050240,1958742793,4096868,1567948860,703018751,-1992850200,1044119110,209002810,1705522943,1085663318,99309913,1676170839,702783999,1449503395,103532427,1346380086,17071747,1048775541,1963025830,-339725564]},{"sector":5,"length":512,"data":[71731971,703438928,378142900,11938283,1346945579,-16106776,787021430,-1956749513,79846885,-326413056,33746049,557072003,-1928891136,-1543635322,1048798632,1962949632,336108080,922685313,922689850,-202873432,-1506344962,976682853,876019489,557234209,557365328,-1449215920,149547088,-2129307238,1575324431,-326412861,74877782,1080403617,-793059119,63974151,1002867698,1936040966,-336186620,-1539953916,142016357,-1207535873,-1202716662,-1202716665,-1202716416,-397410271,-1072962000,585826941,-402229505,190398337,-1207601728,317456383,208848443,1343644600,-397361101,-1041504260,1566490675,1426065090,-326898549,-11053558,-400475594,1451884081,-129594886,-689418158,1207471083,1705262633,871909003,-1610208302,14320485,-1577695607,1177249188,1992297462,-94991592,66602635,1380995783,-1577552129,1177249188,-2115481354,-1608596245,-826048155,-28931065,-1946394999,-345659850,-60898269,990350118,58128454,993995046,2099329590,-60898294,638028582,1308772233,50097795,-646580725,1705381631,996517537,2099329542,1958742796,-1207702782,983760897,910066465,310247713,51323624,1210136070,1705379387,251593854,1583292726,-1017256565,-2115204267,-1929314068,1358889094,-955704600,-1608754938,2000585472,91488349,-352315720,112643,-1205777757,-1924131200,1358889094,-397361101,-1072955749,535495293,-16742771,-56301488,-397361101,-1073017060,820511605,-18178,-841684912,-1946163784]},{"sector":6,"length":512,"data":[-1581031963,104538426,108881318,-385953560,-4653549,-1957313537,1208403948,-1711275933,260117512,855930623,1911050432,358193917,-1034088575,983629826,906378017,-1592951775,100868406,104538424,92217658,-335685912,336108076,922685313,922689850,-471308888,976683004,876512033,91488289,-352320840,112643,-47781808,-2129307238,-1957313777,49054188,876512002,125108257,-33651059,375761059,-33651059,976682832,-58726367,1189630034,1493616618,-956257508,18958854,378320896,-24736432,983650557,-1509541087,-1928430235,1358823046,1497199848,-352320763,1354773250,201170664,-352158272,557490478,1705379387,-152563587,-24736259,-1679273731,-12392197,-2037576725,-397345282,619248526,-18179,-859248560,-1946163784,1438866917,113765515,25416,-1560000885,-1073012428,-1070394252,232974416,1342177720,-1711010840,260117512,1503266283,-401637099,-1034027272,-1957363710,116163052,-1923656190,-1543635322,1049322920,916529466,-91846367,1665704445,-33782135,1342177720,872391912,1407733952,-504868825,1241958183,-956300511,-1323542266,-1506345216,943128421,557496353,557234256,-413800368,-963907445,2113929021,9038083,992032417,1962801798,-59119611,983639531,1959213857,1575507721,-25499394,-2037705237,104594940,192176968,557463295,1342177976,-1577333784,-2037833418,1049361914,1218519354,-58291869,-1178170371,-54853627,121319085,1128466036,703330274,174587694,393220]},{"sector":7,"length":512,"data":[1835015,-1374683107,-1373721065,-1374179810,-1946260504,-401937424,-259261046,-488111125,-97283,1290339196,1354773503,-1946230552,-1956749370,-943497755,18954758,-402396416,1048837277,2130797990,-69605130,-326412861,74877782,187882984,856061120,-35106624,2096499640,318669573,-963966594,1342228485,1589177320,180829,1458342741,75402071,-1274264182,-2081387776,2855230,2105544052,125042704,-1274198646,-1947170048,1566465990,1426064066,-326898549,75399940,-2096663552,2855230,1048779636,1962949630,-62470646,-28916011,-970593352,-958727098,-339739066,71731995,1006503483,1187383925,1187432188,149665278,-1006876986,-1258404154,1347469363,1183666256,28856572,1525174272,5224482,1354773328,1342197688,-1924087757,-1202651578,-397410303,-443866559,180829,-2081649835,1465256172,-1962641781,1161926,-125050121,701679489,-15341482,-1996339829,-1072956858,-396924812,-1072955598,1979670644,838592516,200820361,-2096794378,74777086,-12326826,-1274264182,-773795584,98619872,1183390084,-1965519876,-12154873,909843851,192232446,-1962520694,130481246,-1979520051,-92864753,11846026,838920272,-1946204534,126418014,-386369793,-397004379,1583349411,-1034033781,-1957363710,49054700,2123061078,-1161327868,-487129071,-964562805,-396940846,2089025151,141885188,-402361089,1810575729,175439627,1946288003,112645,-1070398741,-1962981752,11798596,1149915200,1073787913,172264016]},{"sector":8,"length":512,"data":[1346371764,-1274329974,1448099840,1358850536,1200233611,1342223361,1200233611,1342223363,-1743829878,-12154288,-1696051048,71600433,16744064,-396950412,1149959906,1342223374,1462014696,-1946286360,1583285316,-1034033781,-1957363710,-1957210388,-947190658,-150990406,-2114941982,1462358726,-2080513304,1962869884,74776338,-399452952,1153901138,1476394756,1610468072,46292318,-326413056,2123061078,-1161327868,-487129071,-964562805,-396940846,-396952149,-1957626414,21465628,-397410124,-396942882,1583349143,180829,1458342741,-1173993845,-487129071,-1207969653,2062035414,-2081387728,1946158206,112649,613476432,28837867,988303360,1592284722,-1034068432,922681348,922707380,-1766300238,314069016,-1205972992,-1202710144,-397410296,378085944,-1365023312,861324133,1443228662,1191130088,2081619587,112886,841738320,1706034887,113704960,26030,-1957313698,-164407572,993787553,678691910,-1560000885,909720574,141831057,-1107207192,350945281,1358954424,-1194812184,-397410303,-1070334542,-38999984,1006515967,872299496,1843941568,1590070051,180829,451065886,754031184,1499012511,451683969,1048637407,1946183331,1343991816,-342384152,1354773257,-386005016,1438851331,-1957237621,-4717450,1122521343,-236431672,1354773501,-2094814744,2855230,-167050124,-397014924,-396951885,-166986430,-1545075339,-402396161,1566443867,-2097151294,3931710,28837237,855829248,1006543808,730939011]}]],[[{"sector":1,"length":512,"data":[-402295808,350945452,1342177720,872222184,132665536,-29949955,-40441797,-1170473311,-487129071,-2020878197,1455630808,-1858174121,309592107,703334086,1683005441,-291308028,702390825,1760043755,1343654408,-1962887580,-141864966,-1957760981,-1560345402,-576574996,80186153,703505151,512879080,1343939256,-1624444518,1599691037,-1957313698,1988843244,770201092,1354773501,1445127656,1459485416,1593608680,180829,-1979645767,-2140909514,378207686,-1031773177,-1207453697,-991427072,1994965843,127002879,-397361101,28900756,-1914155008,586541309,57982987,-2080388632,2855230,113643124,-16766498,-398721482,871104205,702416582,-18431,-955258800,-397361101,28901252,2112376832,-24844033,-2096611608,3931710,922684789,-1578615810,1354773500,-1591618584,297417726,-1948059904,-662205480,-1957313751,71732204,-150990406,-2082960414,-14035265,28837236,855829248,46292416,1354773248,215136336,2275408,816048208,-326412861,1443425411,141986647,-955482485,702806086,1342177720,201308136,-385649216,113705171,25416,-1963434357,11799367,-1240901750,1220684544,-1996071285,119400455,990273163,-2096270329,41812284,233311487,10611199,949891,1586178421,74973176,-1993501464,1586232902,-1977644040,11797319,1354773328,-400666904,1996431075,762833150,989885161,58592894,-1961984373,2126985988,-2093184766,74776636,66759,1586168971,990315270,-1962180665,-1962474748]},{"sector":2,"length":512,"data":[1120938967,-4713471,-219655937,-1996190779,1187510854,-352321028,-92864730,1006257803,-2096073273,1946159742,178181,28836843,855829248,1459572928,-96010492,-1946401025,126551646,2113685051,-1956749360,214064613,-326413056,2123061078,175540996,-396996785,-1957087779,1993292744,-338744572,-1580649726,-1053072568,243860598,906191688,2122539848,158663174,1705647755,-352170102,-1440838905,55544421,11846026,1354773328,-1206027544,-11534335,1178142838,-1207601914,65741120,1344357048,1446053608,1445916648,1496678632,58181435,1610514152,146955614,-326413056,74877782,-2097150778,3931710,-1202318219,-1202711010,-397410049,113742790,89463,1048780011,1963015166,4096789,242548796,922703390,384311610,-397389068,1566499293,1426064066,-326898549,1996445198,-230257400,1695279184,-963907445,1913013819,74857234,2122517879,125042930,-1995809141,-11408585,-1927936394,-1705970618,250347676,369391359,1358579341,-335504230,1354773262,1342918328,1358579341,1344357560,1358186125,1343521720,1342929848,-1271537760,-559919104,1073787957,374864,-610604976,-954940285,62022,-16097653,1996430903,10263048,1183518444,-443851022,574045,-2081649835,1996431084,-498692852,1675552848,-1981393271,1446765638,1966043658,138820357,1451960434,-465138714,1996903995,990213405,376898630,14843523,1451954292,-465138714,-1995546997,126419543,1996445675,142016266,-398029546,8690256]},{"sector":3,"length":512,"data":[1996426988,74907398,-196702954,8690256,-1070395668,189708368,-196702896,558151760,-398029488,344176720,192657488,903848016,-1605369676,11810270,95965248,-504868864,348423130,14829255,241076992,-16615425,1996430903,8690188,1183518444,1575324642,1426066626,-326898549,1996445196,-163148538,-1375147952,-1928825089,-1202653626,-397410294,-259269273,1358317197,199236072,-1924104970,-1924073914,-397347770,1586212398,39291142,2122516361,729088244,-1202667469,-1202713778,-1202711385,-1605366917,11810271,903782480,1346371764,1342178744,-2082842648,-4321596,-1928532993,-11471290,-1326971786,-1957078733,-443851066,442973,558251651,-955745024,2180614,-1961825536,1248111126,992036513,-1996196158,-1021229546,558382723,-955745024,2181126,-1609307392,11822323,-1588932469,-1036312248,378078326,1438851400,-327029621,1465254220,1688800906,1007304323,-2146798336,192021753,1946679680,459663366,855761641,-149820426,1946157510,-351817724,-2011123710,1191100546,10550913,-1432229518,1210513252,1174799137,65065249,-1989890554,-939607418,1325315206,-1441887488,1175333732,-1266250975,1992375294,-336491772,-1263105276,-775517186,-1132033568,-1858173954,242483243,-1268494176,-260864,-21592439,-291499285,-1979665367,-1238766570,1220684544,-21592439,-1268452448,734563072,-1960753138,1006548614,-352160063,-1232172284,-1198618114,114686,-1962883863,1006549638,1935997702,-1132067990,-83477506]},{"sector":4,"length":512,"data":[-1961068700,-1591665130,-2046615268,1347616442,1619430678,-1224781569,-1779892548,-1956910114,-1591665130,-2046615268,1347616442,1619430678,-73314049,-1165612188,-1098479106,1911050494,-266957858,-1165587612,508580606,-10451315,-21068285,-1132033200,-1098503170,1374179582,-1961366562,-1956319210,1392425606,-2037574064,-11468960,-385958730,28892728,1448562688,1619430743,-1070378753,416016464,-21723509,360105531,1346422411,-1263075497,-2037557250,860946112,-1360506688,1688903960,-2046697263,994574010,2013182142,-13375229,28841707,-11055104,1476310198,-20937075,1354773328,1192789224,-21578181,-1029643146,-1962888092,-1948003880,-1973112689,-1962887999,1177955312,-1262122463,1208363776,-1199142623,1928727550,1925188368,-1263125748,990278654,1929295494,1354773260,1343991272,-350471192,-197722348,473098340,1346422411,-21461365,1659392064,-1956749541,1438866917,1465314443,730939011,-1609796608,11822160,-964431733,-1609438213,11807214,-324996981,721466409,-20544528,-1272320608,-1594324224,11807211,-1957693397,389874758,-385649152,-661979000,-13704239,-222723161,-1111885639,45728697,45744826,45744826,-1279664454,-323361095,45744825,45744826,45744826,45744826,-860224838,-1581656903,-953457494,-350140765,1175387970,-16454879,-400472570,871103774,558368455,183173120,-1268452448,-1547293952,113713480,8518,908663275,283844936,558380545,251595499,82518344,558368511,-386070040]},{"sector":5,"length":512,"data":[1583349033,180829,-18346,-1077876656,1342177720,-940104728,521951494,1241958144,-402652639,-397370555,-259301323,2097151619,-1455521772,124912740,1688813184,1457026311,-335612696,1590070226,-326412861,-1610421117,11822274,-472786805,1689290635,-1963047287,93912646,1185152947,2109737761,1174849286,-2097151967,2855230,1352666228,-1962888092,-54426680,-291500053,-1962888151,703373512,-936705868,-12154295,-779468648,-1037369162,186730659,-955875904,2181126,1575324416,-1373715261,1334453861,-4095959,730939011,-1979091968,83932353,1038876669,11846026,18097911,-1728046917,-936707081,1006648963,-2094893824,23438910,28640373,780797931,-981441114,986024703,168457153,-1979419411,-1325208627,-1262384639,-1957313792,71732204,1006634555,10689908,1975520060,320976901,699925483,702915347,1342177720,200800232,855930304,-402199616,28899192,46292224,4096768,91553852,-336667928,-69474301,28858051,-840413184,1958743031,4096803,477430076,1006515851,1358954424,-1195470616,-397410303,-790039492,-72357634,-197990314,-1957313698,705072876,73304832,2760235,-1706426184,1616,180829,1840133887,-1006641176,1840264959,-1006643224,728608929,862331398,-1710968366,60735,-326412861,1988843350,-754667260,71759854,24379407,1840292166,1713505835,108250683,-1031024077,1049301739,906061346,581002786,1840161638,-1070344309,-1034068385,-1343750142,2144472063]},{"sector":6,"length":512,"data":[184843274,855929792,-1190401088,-770965506,-937229707,-2084322933,1812030,580978804,1840161638,512432107,-919397608,453777035,-1709503839,59703,-1374254782,581026669,1840161638,-326412861,1342177720,1342180280,-1962641665,-1976918498,11797063,661121104,180829,-1206498584,-1202716667,-1202716666,-397404427,95955271,146296832,280514560,954748951,380090409,-4593584,-4696381,1005080831,1006543293,-150990406,-1948742686,-1557538681,213400578,99110912,-1421966349,91488307,-350755906,402112003,-1642165418,-1274574294,-806858752,-6756316,1342177976,382842960,686155856,1342177976,1342178232,1343675576,-1205283096,-1202716651,-1202716667,-397404441,113715399,21569,1342177720,1578659304,-326412861,-401806205,-1072995098,1874331764,247175680,1586171777,41418502,-196702954,10263120,95948524,1183666219,-1746382604,-1202104020,-1202716642,-1924136954,-397347770,922691703,922709454,-1927909940,-1705970618,250347652,1344996792,1358186125,1496082920,1423449,440400,-196702896,675932240,728615073,-1318205946,1357435654,-196702954,10263120,-1715990804,1183666198,937971956,-1202104020,-397404400,89730209,-1202716666,-1924136952,-397347770,-443865073,182877,-1275051,-776469386,-857190299,-1733844,-1229454218,448286821,770199552,899171,178256,1706473552,668854352,1343017656,1562756072,1426064066,1465314443,-1962508661,2105739381,309657614,1708243030]},{"sector":7,"length":512,"data":[744024144,-1072998055,-397015948,-1705574490,6147,661962763,-521279402,1348709048,1348686520,1343659448,1348843192,1496080104,-1746382759,1348032811,1496027624,1443687257,1348843192,1342184120,-1201490968,-1202716659,-1202716669,-397384266,-759683229,1239961612,-401713371,1583349407,182877,230643542,-1270971624,343146605,1840529025,209518848,1840529027,-1106938769,65734144,-2080374850,1869460542,1048776308,1962962356,71204954,1400176683,1840529027,-1090095761,12458017,-1863821554,1358077,768080,388216912,-1642165424,38242858,-2146631500,-152547328,138314532,91488316,-351797058,1241958170,-956301023,740055302,-1770002432,1534060624,2113929021,-2131719422,7185982,113706612,26879,1342180536,-1947121688,-1017225274,-4503372,105945855,-1014300672,-326412861,10939521,-4237482,1030399,-259856304,1343715000,-10713459,726788176,11557209,1183651408,345657516,-1928398077,-397366202,-1990645011,1040145030,142475267,61562509,509656,1353467533,-10713459,710731856,62413145,45633536,-2037559296,-397344932,-1950865861,-2037559273,-397344932,1499015935,1348903864,-1193315608,-397410262,1183670486,-2098704212,-1404662305,1552321872,468209919,-1202104022,1347420163,-10713459,637397072,857413793,374362834,1353467533,-335510374,-1404662514,396408912,1552321872,-1394061057,1348032810,1495918056,453943641,872414725,374362834,1353467533,-335510374,192526350]},{"sector":8,"length":512,"data":[-1404662448,399161424,1552321872,-1142402817,1348032809,1495905768,-1343729575,-1202104023,-1202716669,-1924136956,1358912646,-1591374104,78715816,374399187,1353467533,-335504230,379172878,-1404662448,397785168,1552321872,954749183,1348032810,1495888360,1810387033,-1202104023,-1202716669,-1924136955,1358912646,-14333208,-9581002,376294454,1353467533,-335510374,-1404662514,399685712,1552321872,-118992641,1348032809,1495871976,243801,505936,1552321872,283660543,406173733,1552321872,-722972417,-2091296471,7186494,1606288757,-2096108789,20163390,1304298869,-1107039464,-1923737514,1358912646,1495854568,1839767897,1996489533,-774337757,-1476448541,-1057308430,-1056653057,985579785,-1106384104,149624929,-350719042,411090435,1552321878,-1209511681,-1202104024,-1202716669,-1924136951,1358912646,-970680600,-2097107898,-15090114,-1096740492,1389507353,1183651408,-2070261588,-1592857600,101412286,91516352,-350664264,425703427,1552321872,820531455,-1923524311,-1924092858,1358917766,1495868136,243801,702544,1552321872,1088966911,1841471780,78762547,15548314,374362624,1353467533,-335510374,413120526,1552321872,-320319233,-1923524312,-1924092858,-397366202,-1168562031,-802488289,-10713459,-397225981,1499015375,1343789240,-10713459,671148112,62413145,213405696,-2037559296,-397344932,-996072481,1389507437,1183651408,-2070261588,-1206981632,-1924130623,1358912646,1495831272,-1404662439]}]],[[{"sector":1,"length":512,"data":[-1404662448,674752592,2079321,-2037526485,-805044388,678815826,-1732748967,-2037559272,-397344932,1499015078,1342178232,1342180792,-10713459,595978320,862857889,374362834,1353467533,-335510374,417576974,1552321872,954749183,-1923524312,-1924092858,-397366202,-1168562211,-802488289,-10713459,-397225981,1499015195,1343789240,-10713459,659351632,62413145,246960128,-2037559296,-397344932,748757803,-1311624338,-314598908,1347551232,-1404662506,8690256,95948524,-2037559271,-397344932,1499015127,1353467533,1353467533,1495760104,721428410,1552322000,1389364223,1495775976,412661849,1552321872,-337096449,-1202104026,-1202716669,-1924136945,1358912646,-1591555352,-768381394,1067058353,1375731949,1183651408,-2070261588,-1206981632,-1924130521,1358912646,1495758568,-1404662439,-1404662448,656140368,2079321,-2037526485,-805044388,660203602,-1732748967,-2037559272,-397344932,1499014794,1342178232,1342181560,-10713459,577366096,1839742595,-401312510,-768345166,1067058353,-1996488467,1183448662,-399709188,1347614778,463879811,-2146994944,4001598,-1070398348,245434347,403057435,1540502299,332923737,-28407350,872177289,67156178,1996443730,-59310082,15506586,-1927917568,-1705989050,250347676,1343658424,1353467533,1495665128,-1404662439,386971728,1552321872,-1192734465,1348032806,1495658984,243801,1226832,1552321872,-790081281,112673,1292368,389593168,-1642165424,38242858]},{"sector":2,"length":512,"data":[-397410124,28843969,1676169216,1241958161,-956301023,-669230842,-1857034240,1447028816,263780491,703090688,2097089516,-16637,1583335307,-1017256565,-2115204267,1442874092,997113687,1346099896,-402360577,1499014719,163203,495658101,1946173315,1004386309,-524811285,1979666491,74907396,1495621096,1474842713,-380020443,2105737437,410321666,1346102200,-402360577,1213801909,1342457347,1495661288,12577113,33717635,-558360715,905924667,-402360577,1499014434,622651472,-1561765543,41779968,-385649663,-340262765,1996443707,628615172,1174620249,-1125625852,-10921691,-2142859979,632416336,-259303079,1962949760,7334147,-2142871317,292814908,1352139914,1346105272,1495600616,1975520089,2125892073,1174531071,1946172544,-1744532975,1005566032,619767888,-1072998055,1015081332,-972721152,32178180,1005303886,2125922128,1005762815,74907472,1495568872,-1947709351,1348032804,1495565800,1015039577,-342067968,41779974,-2096729084,-202832185,-1956749314,46292453,-326413056,67169409,-67074419,-20649904,-1924087757,1358692486,-67074419,616294480,1793609817,-1547684991,1017322266,456827675,-400868958,12106246,1575324422,-326412861,1988843350,108956420,902643337,117819275,848208640,-1556843357,346240363,872915765,-1959552605,918983,-1557183581,1101213395,819634988,-1556992861,-947178735,-1560275707,27470814,884122418,1057343115,715039488,-1960128093,3212742,-1557483613]},{"sector":3,"length":512,"data":[665004685,96897834,2091057194,720610090,117819019,702784256,352700043,717267712,-1960175965,3671494,-1557527133,914959074,-963958318,-1560277499,-963958284,-1560273915,1805855288,710583082,-1960162909,2295238,1600498851,79846750,-326413056,10546305,607554390,1619445358,-2037579521,-1202651296,-1924130443,1358913670,-2138695448,16736446,1974996597,-2037559271,-397344928,1499014143,-10451315,-1704057693,260115318,1840529027,-1205701632,-11531158,-1922189770,-397365178,1499014107,588572752,1183668569,922702000,233336356,607553996,-443851154,883016541,1713545984,1207975073,-1586646877,-1556060638,-1581027922,-1398603734,-1547685011,-1432130124,-1982712979,-1553084906,113667532,-956076510,-1553062906,-905525402,-399527571,-1365115061,1713546093,-1023409736,1345249720,1345252280,1342439608,1358950584,-1192367896,-1202704669,860892915,-11513664,-13702858,-399579338,-407310746,-71806930,922701870,922693349,179973859,1388327680,-296949680,-1006633032,-2081649835,1465254636,-1107001717,-1705572864,6147,57982987,-2097121559,1815614,113726069,14031961,-1202667469,-1202713749,1464864976,1358954424,1343276728,1342930360,1342180024,309328,-914954160,-2011904893,2122383174,192240127,193528808,-1961525312,-2146309136,1968111486,2106058760,-343929368,234929667,100728449,-776464523,-206024603,-1461170074,1465473314,193470696,-1962770496,1606847472,1575324510,1426064066,-1957237621]},{"sector":4,"length":512,"data":[-1070398346,-382539696,1840529025,58458368,-2097118487,1869460542,2028536693,-1237909760,1747433581,577103952,1048795481,1946185144,1023391777,-1204355248,1023195245,1747433552,562620496,-397387431,1499013506,561834064,1048795481,1946185146,-1172403406,142081901,-1946223128,1036422128,695535104,1840527103,1840914059,-745863285,722518659,71762882,666377808,468209768,-1207243909,860907559,1038635200,1979059146,-18427,-963968277,46292318,793878784,100917457,378220373,-489607341,-1039932719,794629771,-489487183,378257923,95498071,-1039932717,794760843,-489486671,378257923,129052513,-1039932717,795154059,-489486159,378257923,162606951,-1039932717,795022987,-489485647,378257923,196161371,-1039932717,794367627,-489485135,1438892547,1465314443,478152447,-1172537183,-487129068,1348350469,1495552744,125091851,478154495,-402597143,1183476894,1847763460,1840514759,116785152,1946316322,272531466,57933885,872219368,-1983738926,-1553088490,-1130140226,-12720019,-1955714909,-1590762218,251997923,13796096,1587152049,-1560280851,378236460,-408867095,984366,-1325346173,-312567292,782434304,786538862,862857891,1841603520,862831267,-837383726,1842127725,-861464,-395434954,266917199,607584086,-714872722,1847867135,-2131498520,4001598,1048775797,1962941350,112645,-1070398741,190608547,-402295616,116126253,-1553587551,113733038,73968,-2130630758,-267991281]},{"sector":5,"length":512,"data":[-2097151968,6059070,837288820,-2146500622,1566465820,1426064066,1048636555,1946172588,75399436,91490817,-348345160,-214007793,91488358,-345574472,1722005507,180829,-2081649835,1465256172,-1107001717,-947126273,1024066093,58064902,-1962810135,786682328,-899373057,-868234056,-881406921,-868234177,-105330062,-1095217136,-340242323,-488091544,2109737963,36890883,1358954424,-2085666328,7186494,1048774516,1946183935,-1105279891,-28930963,1476157065,1358916840,1348871352,1495259880,1847894873,-801920096,1354825440,-989966104,109902942,512323008,1048800702,1962962356,-1472298233,561315949,-1946972696,-1270971408,57999469,-2130588183,1963852030,29681923,-50075562,-1142296437,833537,-447813552,1761543879,922681344,922709440,-1936036418,-1995472624,1183447638,1959791608,-92864699,1467541584,-963907445,1946550333,25487619,451677825,582484096,666390545,1223184488,-950445793,18513670,16824320,439811920,666377755,1206407272,-334593672,-385843174,-440532654,285849855,1354773328,-372809752,-1397227198,-1024962500,-1072998114,-1397223564,616058940,15224934,-346466017,1023522829,1713682512,519170128,-1212655271,616058895,1354256486,1021857792,-1947169848,2109737926,16836867,1713651328,-1206225920,860907044,-1202696000,-397406886,-259296307,-1072970101,-538377347,-1405190144,410320956,1713651328,504460288,1348903864,1713682462,-806361008,695517195,1713651328,504460544]},{"sector":6,"length":512,"data":[1348903864,1017952286,-807933872,292864011,1017952286,616046160,-957853594,1975520207,1773463555,1348871352,1346153656,1495162600,83934809,-402619927,-259263773,1459649001,1358812392,1348871352,1495155432,1847894873,20825995,1024226314,343149062,1946814269,-1607800036,-523226197,-397360898,418118821,-801920096,1343030496,-335767320,866885643,84205776,-57939888,-1947082264,-1270971408,208928877,234946177,-397015436,-259261603,1839611520,-1206815744,-397344769,-1202651799,-397383423,1499012567,1583335051,-1034033781,-1957363710,1048598252,1946185126,-1472298212,947126893,1358954424,1358773480,1349059000,1495103976,1958742873,67552803,112722219,1273516042,-1947169795,-49722,113641844,-1962923260,-972297274,2819078,-402360577,1566467792,1442841282,-2097131842,6881086,113721204,14097497,-1202667469,-1202713749,-1202712629,-1202713731,-1202716667,-1202716662,-397410300,-997997604,-259287026,1497220747,-402426624,-24942462,-955878373,6881030,1590070016,-1472298045,74777197,48990384,-777911888,-1472298188,75366509,48990384,-593362512,903591988,-1445599152,-326412861,74877782,2130706051,37128452,-2147025092,478191900,-150989638,1580336610,533588048,1958742873,83934723,1962933891,16679174,-1962642162,-2126773706,1963262206,-6952924,1048637579,1946170848,1006543120,-150990406,-1948742686,-349579129,83933187,-348388701,-1398347577,79283851,-838092032,1946630958]},{"sector":7,"length":512,"data":[-498908410,778497015,550911,458758,453574664,1607351502,-1194446642,-397344769,-1494701138,-940536900,3932678,-7804666,1342767544,-1946252312,-8590864,1358954424,-2085909016,3932222,-169343115,-336557090,-340465659,113766539,117455874,-1191224855,-397410303,-1073000485,1223232637,1743279871,-370111556,1566506818,1426064066,1465314443,-1274784118,1596050690,46292318,-326413056,1586170859,71761668,-555206657,73305087,1962950528,46292461,-326413056,1444605059,108956503,-392682776,29282473,13166848,-472785269,126491019,1672611386,-1696005260,-773944576,-1978037277,1352139079,1495245544,1023427117,58064910,-1962894103,786682328,-822827009,-819802342,-813183141,-813183097,-813183097,-813183097,-820850809,-813183097,113758051,80904,113733099,146440,-1205967381,508585943,-472785269,1077936523,-944248752,1742159488,1175942400,1178322571,504331524,1348982712,-773944546,-399376413,-677328999,77830247,-953357508,20711942,-953881856,18950662,505211648,1346112696,-773944546,-399376413,213436273,602427452,101107655,1174405436,2097444411,-13571837,1065360779,-14584832,1732491317,451799120,1136154969,1625837671,-1577013041,1386374058,1732491363,-814749616,-1952820504,138314736,57999420,-1207910423,-397406501,1048806590,1962941350,-1405190130,125042748,1342247352,-1582093848,84229128,1407733770,-1757157126,1840529027,-385649408,1048641686,16805300]},{"sector":8,"length":512,"data":[-1947663492,-1270971648,58027885,-2097118743,7191102,512438132,2013228474,-26351608,-397399888,512491093,2013228474,1183651330,-1667608346,-1928401920,-397351354,129564239,1223184445,288930046,-29235120,1840527103,-431583978,10263120,1183649516,753422566,1023981822,-31070128,1349003192,-1325523224,115888174,1343074558,-1325530904,-85438454,112893,-397013781,-1070334717,-1755256752,1583333427,-1017256565,1913203432,41219,-1022801688,10546305,-402056472,57872083,-1979671831,-1979666802,-1979667282,-1979667818,-2147440458,1946158207,105351952,-153553328,138871516,-351705342,-20316651,-20250931,1342671822,-587802378,33703682,39322471,47186632,-1946942740,-2147440962,42174,1988961652,1381373442,1355123281,-1979034904,853594305,1374684132,-1390471650,985792170,536377034,-1977554087,-773573951,64550880,1380976327,1355123281,-1979046168,-20895038,-773573952,-17300512,1995324101,144435374,10536065,-2130703166,-402611988,552077415,-385649906,-1903558487,-1366687570,-1769340756,-1232469846,2139095208,276037636,1342588811,-587802378,34096898,367724903,-838940162,-822162690,-162527349,48035544,1728184903,-939370493,-335359998,-1232342014,2123169958,-1531019262,829685760,1364350742,-397359734,1464928671,118883870,-792622561,65286880,-28859144,1992964801,1499406328,1364350726,-397359734,569051519,851544720,-136261148,113640408,-1974382000,1760055493,717392393]}]],[[{"sector":1,"length":512,"data":[851508929,65065444,986054384,-392202514,-998176807,214040736,-1595113216,128313344,2013208946,-1501132277,189237248,10796672,-401771520,192023883,2123171606,911362,-387698088,-998176859,79823008,22514176,1334507058,736965123,105988554,41418583,-397264897,-1974007557,-1964756473,-315489713,-784218069,-1963457568,1191224966,1610408618,2013222662,1379401474,1107876584,-1010048423,-402181400,326241515,-2012854646,1183450183,1962884100,88573955,-402014232,79824701,118614016,1913441000,209250307,-1022939928,1913062120,172291,-1022943000,1913059048,821789465,113707125,458756,233311467,35556096,-1547465984,-18350080,2139144966,158663200,288816979,271050752,176547931,185761675,-1958841089,1730807879,717553159,-1057094073,-141826826,-268177405,396939,119459371,-523131661,394793,-1961732213,-2097146338,225718523,1913804601,306653443,-350986357,-327040018,2028470435,-385650170,1342570785,11648708,-1324365949,-1930439932,1539769280,-1803056850,-942108967,1030,136218880,101107456,-1006632960,-1996445250,-1946145730,-1979699706,-1577015418,-1945698261,-1962931706,-1962889338,-2097106498,91492327,50335789,3227079,113707379,262148,-1560231703,-2037776370,715260077,1183651328,115888130,38177538,-1962925405,614690118,-1534686720,-1545565696,1183449126,-1650029996,2663168,10126987,-1207956317,-1903558622,-1040318291,-503906123,1207972101,-1560274269]},{"sector":2,"length":512,"data":[104529926,158466062,263879,1676345348,3193744,856396008,1876928,-33546589,2138816,1200209971,273123602,1200162697,2662662,-855717634,-1996339319,1204160583,1204158468,1183516427,206014810,10389131,-972142711,-1342037945,1090048,-1342172766,-1383167488,-2097105664,1200104131,-1929846240,-390056998,-998177419,247595171,88467456,-1276637838,705661701,-20895003,-390005052,-389872295,645006639,-1979300214,394986598,74760202,-805123842,74769418,-201143042,990664585,1962934814,-389903611,719850515,311813,1912930024,71731718,-402289176,46269721,82700288,2013203058,71731984,1477461897,-1039858456,-655884286,-402230780,-706215900,83093512,1392509634,1212291,1602947956,821789460,-336006539,67553031,-117437696,1465303899,989868222,1946162206,343903026,-1995028597,-969206203,1049168245,2089353238,-1962546412,343706096,1324683,-1995154295,817829495,343902464,1318537,1595301257,1827193694,-1961922044,1200161862,35535630,-402426624,2129136500,180740,1912885992,545226780,-2146011903,1962935422,1354773000,-351736344,168683528,-2115501198,72869897,-402652478,426902571,167782049,-1978501916,-75496354,-2012843006,-352311778,640059396,-387698176,46269489,67495936,648021362,-387698176,1438843937,-974590837,545896451,2126829710,37349380,642974880,10585480,642974369,-1593424503,-1993977088,-23002555,1166616146,1392288004,184912166]},{"sector":3,"length":512,"data":[-402295616,1173029239,-1929378631,-61687242,-1379892052,1364592244,1582944511,1558770146,26273793,-402541848,-1960443388,1392288517,71666470,642973347,-1560132213,-1960422656,44238405,-2054543789,77725857,35448915,1560498408,1442841794,-2144979571,57933884,637826445,-1993997175,-1017249188,-853933896,1964653584,-1211397283,1961691648,-774010342,-1948003869,642942599,-1962654327,642943111,-1979300471,-788482087,-1948003869,642942599,-2020932215,-1993977208,11534917,-1571635038,-1012772163,639470930,67575,1569524341,133637636,175374337,509734,-1022966272,113704786,-1023388998,313790643,-75493171,-1205570544,512557060,-511618438,-654114562,1659379595,29620223,-972589824,5423110,113640939,-973057341,5422342,64273091,1912623336,178185,-402652485,113704761,-1023388992,-402410310,829554745,-385876039,551748139,-1964197198,1893826760,-1157545544,-109051900,-1206684592,-109051711,-1207405552,65732673,-1157627464,-85458943,-1022966018,-1329397678,-331158001,1722867850,16824814,-2031288606,-58659104,-117345178,2105747139,796131332,1803386918,638219444,16926199,-350194688,1173825032,1962934530,93005334,71665446,637896998,637683083,637945223,-1023261303,75334438,-1172474880,-148503628,67141,-726006923,-6821885,-1070396813,71665958,105220390,-400716349,1569521671,124932,133637827,242483204,1388709517,-1207872792,427032608,-148497685,1946161159]},{"sector":4,"length":512,"data":[12079891,-2129605265,-1202309125,1968898560,118040067,509040323,-561056205,-1929117506,-1866921859,-51785472,1595909619,106414942,1389706948,503679526,-650212089,571730,-1924157710,726849798,-1947741704,1012064645,1007776784,1343058992,1391527565,1476454120,279970421,-2010751225,-1023368827,119473694,100080048,812908572,106256208,-1223610184,-838880768,1599932176,1958936152,1354926619,-927342090,1992375040,22984970,58114363,-1996386119,1476435597,10192264,11077003,-1207471102,281898756,547959531,-1977650176,71061829,121373810,-1115679627,1965817996,-2129654782,8671869,537662069,1166675691,-142662575,1946173445,4712451,10126728,12255412,1803387056,-1223789388,1006810296,1007055872,-1274907646,-1599764479,-1734506240,-150949888,1946157573,-1585056247,41226240,-2054619216,1166737570,-401241240,-2054617159,-1195179876,-1064435648,6660134,263193256,128975477,106387139,1036318859,-964431733,3964932,1957036916,1583286264,-1162193213,871467779,-2136412965,326499296,-319107445,-511662013,-1962380038,-1471943474,-67444608,707052382,707013156,17236481,1296976215,16797249,1381040128,102651734,-1979812097,1506016862,-1979818357,520617550,1499094623,119428035,1526726888,-642258047,-1801482706,1539541977,-1957340989,509040364,-521601968,-661892865,58048523,-972100615,50340102,2098942,7819,-1664919304,198741072,-29592384,1962942478,473858870,125108224]},{"sector":5,"length":512,"data":[1982083,-30903296,1392517126,1448432209,-16376233,117447710,1566465823,-27567782,-956293106,7174,503760640,1476395008,1595890077,-1018077858,138811,1200293236,-402199796,1200162406,507233036,91488258,-351385717,107210758,-1022474359,-2134341039,141885689,234873832,971710464,-2130704456,-1275059138,-1341426429,691961869,41163008,-109049936,-1977715710,-2134049056,419440958,116855668,262178,116853620,2097186,12059509,-2117904122,1426125036,-437719925,39291646,-1023535318,2123171606,-1274574254,65065216,71797496,2828022,741786910,-1963982080,-1977678780,-896924313,-1410137931,-189348578,-1928915456,503710334,1475839751,-4652880,1336865535,734497625,-2013688895,-1073018889,-930407820,1917909379,5290243,-1527529077,41308220,-1036365648,-1031142794,172460063,518244491,-1040000778,117631185,2123227345,519570258,1988960022,-125400574,-492133376,-1927929860,-11513274,939459191,-402163713,1256718351,-998154754,113377520,-352210944,-2097106942,-1957361428,-31004436,-1979431288,1177161798,-2000617970,2139097158,141885728,-402108790,1508573285,-1978906998,1317670486,13363208,168187528,1378186688,-1274132854,-991899392,-956099970,1996443654,209125134,17071744,31982964,-401282300,267060289,-503962959,-1962921979,105810648,-1979704088,1317668422,2127047176,139364360,-351386112,-38016857,147096413,-1610609982,1183318049,-1979665150,1193937990,139954695]},{"sector":6,"length":512,"data":[-33138902,-1964837182,1462373974,50378246,-1948200510,-268234121,-787589494,310297826,2122381827,108265732,102692743,1190528799,175374594,33703670,-1510798220,417861355,-85810176,-391903509,-85852145,17071744,-142145932,119473694,75399363,1191343105,-1966913853,-1342130479,-327040256,-1957363552,-48043796,1006913418,-385649408,653656302,100859947,-259325908,773754398,38046208,520316042,105876048,1476451048,1334494346,13756424,-1979548019,50378263,-1963326470,11862607,507628075,3022478,520373386,369452938,-1918110969,1343619654,-16222209,2013202039,-24254455,773754398,-1979414016,1344209252,-402239606,-1973944181,139430596,-1979677976,260702791,705326986,717291201,48812229,-18283832,38178253,-906080234,108527441,-402163713,1183710795,-11528702,-973207433,-11416186,954730359,22514430,773754398,91523584,56048159,-964022665,-402239606,1334444079,2746376,369247885,105351760,-397258672,1183710731,-1974462974,1347422279,-33691566,-840187138,1576809704,10536065,41848259,-506396491,1737160963,92878341,-326412861,-1090778136,2000224304,-1962183402,379786311,340035840,2139818475,340232982,-2095823479,1966085247,373787403,-1996483421,166401604,-1961590901,1166612039,541574678,-69474304,-1957248163,-1962933730,-2097146826,192164094,35683456,1955267956,1005644566,-400853794,-823591858,239569154,512351883,1200291842,47573004,-401717365]},{"sector":7,"length":512,"data":[-1017249060,10677377,-387151019,1334508424,-1979665144,11929175,-1958622677,1200231031,38176775,973227658,1064765767,369378957,142081872,41353042,-1946343704,734145478,-11526462,-11401097,417858166,75402749,-100402685,371128199,1464928031,1499375091,-251453690,1191112963,-390468862,-2124547275,-1023368508,-387151019,1468726044,-1979664888,11863631,-1975332565,653657927,-1056767960,-125050671,788110,705253258,-1040316593,681574581,-788483072,309824480,294528,1204168564,-167050976,-1957343628,-2097143506,1364198605,1048627851,1459617830,1593932264,56449113,-337911048,541574703,1962281730,119408167,1442285343,556698406,147686144,-896839344,641630246,-397017088,1499332938,-268214952,520544738,-385957912,-1034028395,2139095042,175374880,35669958,-385948184,-2134638936,1946230911,-19339254,18892742,-1006725144,10546305,-387151019,548469336,-1190434934,118882384,1459781261,-1973441549,1468662607,-20305407,369145281,41418583,-397264897,-1023476737,126611938,990660489,1962934814,22669315,1576675560,10536065,-2146209085,1963008127,310346509,-955812608,184550406,1925445888,310346509,-955812608,184550406,-1983645440,-1996488162,-1996483554,-1996483042,-1996488674,1602819167,1280099094,1374456661,102651734,-485601653,2203691,1183384588,201756162,105286144,2631414,-2146941438,-523173676,1048639627,-989855706,1854605942,5302274,1583292167,1145331033]},{"sector":8,"length":512,"data":[1275071170,-326412980,509040209,240028422,564145123,-1995961344,2126774854,105286154,2631414,-2146941438,-523173676,1048637579,-1912602586,-1962931170,199754350,1595868928,1146968414,705092,-149916334,1946157509,46528313,-214535168,-1169167451,-973667366,829685761,181751,-319148428,-76363568,1942540524,-486824453,-147854351,1946159301,-973650431,24379396,-286735545,-353852161,-335879425,-1841131,-925831942,-789775502,-1527024696,-2889477,-1017450782,-1269673645,-855591165,1522699024,1405311833,62149201,281870519,378257803,451412002,1532582400,-1957538877,-1224559408,1511050496,-1957575845,-855526200,-138192624,1946157506,101137674,213390197,-150017269,1946157762,6765832,129500021,-1125596410,71732216,-1159180282,-120067852,-402652478,192149675,-1072965492,28837237,-1593185536,113704964,4,-1007109912,1945669352,198741003,-1207601728,65732609,-402651999,-389810015,1114830967,184829579,-1207732800,-661979088,1912614973,436615956,755921664,582549552,-137219328,1959922673,67553032,-352319744,545226773,-955747072,83887110,-1593316608,512294912,1458044928,180984,-386389272,561184227,294784,113707125,589828,1183454187,1979661316,88574467,108956496,-420980986,-131602184,-402651966,108263419,-369098821,1317667145,-1966473708,-838987154,-32483702,242649802,681692926,1942501888,1944861218,1926314526,1943026202,1928673814,1945385490]}]],[[{"sector":1,"length":512,"data":[209616910,974418944,973370570,-955484690,50332678,-17664,1359020265,2756234,817561781,583238400,2129792,-169734284,67553113,-1157627392,-555089921,75399168,1496019968,717392465,-1967063359,-18535706,-773523772,235834336,101591808,1942502144,113727757,262148,-369098821,-919404371,294528,243992692,100728838,1334378502,-1983892718,1183453255,71796748,-2012592502,1183450439,189237256,105875801,-2146936951,1946158207,-20840952,-20250939,-1995470386,1049297495,2139684884,340248342,1048772656,1966080022,371099912,1142851840,822051584,1569260404,2001172,337545472,1176406272,541574656,172475905,75399168,-2145881088,1946158207,92241929,-402426625,2139158892,57999115,-1946407448,206014727,-1979863832,1183452743,-146479098,-1961998455,-154408765,-402648382,695400095,1966144387,67553032,-352319744,545226780,-2146011902,1962935422,1342287880,-335860248,-62003192,-756546702,-157816581,-402652478,1064498795,1318539,1949367171,545226780,1393390850,7817,1128191,1543482600,2115526,-350855285,-64755489,-1560274271,2122317830,192151556,532107,-1803040978,-1593835303,113704964,4,-1024047896,417857538,-70129418,2013204338,71731984,-1070379002,-1645719472,-165156864,-402652478,-1259801093,-1977453829,-1040838577,-2147126260,65734857,-1978873472,-1957624722,1342572102,-16222465,1843923574,-168302592,-402650942,-2065107509,-15633669]},{"sector":2,"length":512,"data":[1183515766,-11532794,1996425334,5171210,-1024075544,1200226312,105265154,527863952,1948304118,105285646,1187483792,-1879048190,-1976898672,105285639,1191088272,-1970237436,1178075975,1989185540,281212436,1200228980,71731201,99324048,-1878767992,-327040112,-1957363540,-181475092,12097163,11845316,1963246326,146994693,-1185473419,-1070399489,-1957122318,1237855183,11046537,11175561,11306636,-1977216277,1206727181,11046537,11189897,11306636,1963508470,79885835,-897579403,192383500,-1024016334,-1342016508,146994689,34341492,-167763550,57934530,-385949056,1720251746,105285636,-2037772405,-1073086286,-922876044,1183368450,-1333360124,1958742528,46726663,105285825,973358730,58065735,973358728,-2013039675,1183450182,38222342,1183318902,1942043142,105285635,11044491,-1962785143,-1073020346,1542128501,38767248,839274026,-935640595,-930413962,-1228595631,118882474,-1979154803,-466483642,-133963567,1946469110,-1024023551,-1979485176,-253580602,11187849,-1927915233,-1974466490,-1056831930,-11482882,1996424822,-169482236,688279040,-1914174898,-157488130,192152002,-1979431170,105285639,-151094296,309658306,-1979300214,1200161894,35535628,-402426624,-286721249,-998154765,180486316,-200939520,1928969960,276299537,100943499,108461904,-402098433,317259400,443124,-326412861,512428779,-472820978,-1755932673,-11333983,189992462,-1346112,-11336170,-11335658]},{"sector":3,"length":512,"data":[-11335146,-957873034,-1017292518,0,-1892810752,786828294,-435282292,705072892,8437248,-1406737358,-2017096640,915117014,-964493276,112898,2899584,-1911459325,-1962924538,847229438,-475073856,2146533494,-1207767933,-1023213567,-31080189,737971199,-1956613384,-1899983641,-1898935080,-213298752,-1430244700,-225976946,-1014244985,-398208885,125239321,317210738,1022981888,1007186976,1006924813,854095113,199551936,1107784896,1975519914,-528071935,-470171598,743025685,68121634,1968978978,574390279,1236009589,-373033461,56171344,512634570,512353806,54722590,-1946907685,1928014828,-1981445146,-486531026,7768334,906151299,-524285268,871396602,4622784,203882286,604933094,1206407424,-125085439,611631115,-1912136162,855647774,-1527513866,116951839,2635519,-2097075736,-661978428,2269959,58048523,857400297,-17984,-1014808695,648999426,-193657544,1438844809,1048833163,1965052686,112645,1183520235,236882692,-1981558445,-6859129,861081094,1560341440,-326412861,2123061078,105220868,999790755,-955746873,9934854,-1961825536,512427125,2005505944,-1751604988,1594246281,1438866782,1465314443,-1962639733,86574662,-150784629,1074153099,2089354377,-1751736062,108382011,-1751763319,-24442645,-1996063229,-963968395,-352320507,1566465792,-326412861,71732054,-14298573,14844415,-397389312,1499005177,-24907637,855930367,-1592202304,1149867926,71731970]},{"sector":4,"length":512,"data":[-1996191424,-1583901130,67475350,1577118464,-1957313699,1183536876,634532612,-494796801,1347551232,1493220584,-2081387687,74842110,367771699,-1751501175,-1751763319,1074022027,-963967863,-352320507,-1017291264,1458342741,75402071,91553547,1995767683,-339725564,96963418,-131792885,-2080863233,9935422,-396949643,-346423396,-1741255870,197561239,-1959693120,-2083026172,-1036310334,1448544626,1509886184,-1960514727,1925659396,-857188850,83843582,67487371,-1961825536,909837940,-814377064,-14817193,1593895769,1438866782,1183575179,-2116777212,989921514,-1559792702,-1070399440,113708011,524334,-335544392,1438866688,1183575179,106334980,3147267,-1962880381,12681672,13796097,175493643,108252219,3147399,113708011,524334,-335544392,1438866688,1996483723,-6297596,1560341337,-326412861,-1727773045,-1293397934,-337277953,197352704,-150110775,-2083391533,-779943485,-1876038912,74695427,268485249,78768522,-184359470,-388765558,-980758525,-889188571,209570059,-772287497,-2097036413,-722796335,74695467,268495489,78772618,-617420846,-393555157,-805050157,254133642,-1974351104,-754667032,-1966079000,-740062523,-888972821,254139530,266568448,41275707,1456194363,-1064988010,-470351244,1958774161,65468164,-470313272,-882978557,1458342741,2123103319,-1962467836,-1178586409,-1359806465,-1946192499,-4651394,-139529473,-2013713455,29816823,-1543343104,-202780343,-1543408731]},{"sector":5,"length":512,"data":[15450763,-1017291169,1458342741,-1979418997,-956889506,158597121,1958951596,1958748697,-1019564783,-1071509132,-482736012,-467531660,-1070338187,-1924790549,15466052,1438866782,1465314443,-1946417378,-1070463874,-218103879,-138310738,15419600,-1017291169,1458342741,-1898410921,-1070334784,2123094155,855083782,-17984,-772296974,1988886155,-1968770300,1569390404,-339530753,1566465792,-326412861,119428950,108956668,-1070401653,-218103879,-1949173842,-1527577474,-352041333,1566465792,-326412861,119428950,-1962639733,1183450702,-52393464,116727,165872756,-372160086,24357875,1566465962,-326412861,-16353537,1996425334,-3545084,1183573387,1560341252,-326412861,119428950,990135947,108201542,112893,872154091,74877888,-1962508661,-1073018802,-251459980,1341719374,116727,300090484,-265598556,-372115413,91465203,-133959677,1583348900,-1957313699,142016492,-16484609,-1461189002,-1947890689,15402054,-1957313699,-852839188,73304865,1586171785,39291140,-1957313699,-852708116,73304865,1586171785,39291140,-1957313699,49054700,2123061078,185015812,-1340443393,-1188722176,-218300417,1238497198,1049299828,-16056286,1979612809,-339725557,-28933332,-25261310,-16040565,92991348,-378224630,-378150854,964745611,-1948093123,-1494023050,-646591609,-339244217,-1956749568,1438866917,901049483,-855357814,-1933341919,1560341442,-326412861,1183458740,1455758852,522308870,1397801821]},{"sector":6,"length":512,"data":[503730769,777344854,36445838,-997462901,-6840669,1996424310,276233984,620906123,-11534081,-1952998378,273058277,526278493,1532582407,-1957310632,71732204,244817059,1357643448,1342186680,-1946180888,1438866917,1465314443,-1962654069,1570217510,119496287,1146837338,1583337284,-1957313699,861361900,-1070378816,5552208,37152848,-1962490749,780862534,-981231714,-2132440294,1526797390,1600019033,-821616803,-1017291169,233556275,-352321095,178440,62456811,1465275648,-108270453,-1962260853,1586170966,273582862,141936907,1769263627,1702157067,116727,-771023755,-621344135,-628893449,214926080,175753483,-604513801,-2097096317,-376765193,1459626169,-164364493,-757997359,-674113839,192085307,-214236041,-215284366,-499057381,-1007199257,108265474,-678705525,-1007162415,125042692,-654845193,1593891459,147479902,-135006464,1946157767,868387586,-2131956782,275976441,-522987381,-638131501,-753876608,-875361301,-1961825920,-742378544,-108999710,-1961856240,-739716134,-2133199126,-472706879,-2134129909,-1031073559,-388771277,-326412853,119428950,-812924276,-66814325,-1425783155,-1666461556,-930305192,38177707,4623275,-1413379157,-1951677813,-661869626,868388523,1593895872,1438866782,1465314443,-2096734581,-746388997,74877696,344894972,-1381113717,-1387221680,-393499312,-1376220243,-1901215602,-1947170020,1583337411,-1957313699,-1940433172,-54489384,-1962508661,138841079,501467275]},{"sector":7,"length":512,"data":[-1070409589,-651448590,-24392821,-217811317,-12285274,855596426,737970916,1593895875,1438866782,1465314443,-352026997,108432150,92933099,74777658,283887499,3964998,-2142769035,-445317059,15450163,-1017291169,-2081649835,1979647102,-18427,1183457771,-1962888188,294123224,208929875,-1274788214,2098432,132844011,-1274788214,1560341248,-326412861,-16482685,-4717195,-1977488385,11797574,-2013865845,1946702609,71731724,-536543052,-351671297,71731719,15401140,-1957313699,-1973987604,1183450214,106334984,15409613,-1017291169,-13371853,989858491,-150572077,-336427021,2144539,-757997359,-674113839,74841989,108196667,-545000661,-387825664,-970523453,-315424763,-636757877,-396947596,-2090860606,-1993985850,-347781323,1978469355,96937479,1162281008,-81011317,638184267,-2044328566,1263249921,197391743,638548434,1194132934,-789064969,-2097151739,-1309998894,1458342741,1187257943,-993883126,-1595406722,1583292415,576093,1458342741,-768401833,-1962508604,-1998058938,1583292415,445021,1458342741,2126782039,172395270,-5511015,1566465823,1426065098,1465314443,2126838814,175016710,-1325398854,-1949969660,266568669,39356298,-277525846,531234992,-899850657,-1957363706,1381061612,102651734,-1054535219,81152,1183532661,1958742532,989626431,431229300,413850,604302080,1010904287,858355457,650546934,84158090,477421626,-1202696186,-661774199,7134362]},{"sector":8,"length":512,"data":[1488980736,637957127,-351992670,32241923,1595869176,1532582494,180829,-1706819400,1616,1971372790,1071808526,-1237204352,-2115481030,-134091777,105945795,745668608,-1957538992,1140898008,413850,-2134706688,-1023994252,276037643,1352285876,1509949446,95967323,82573568,-128427174,-1707166525,1616,-326412861,505304918,-15704379,-13440969,-745862286,-398655304,1931476907,112645,-661969429,504254091,-1274652987,170559,1931415417,-4069368,-352320840,176080138,-1259862647,532689919,-899850657,-1957363698,509040364,207537438,-437766145,-1962118402,-1261882413,-10622916,-1207602401,971702273,1317787787,106349834,43663540,1913616640,1959275284,225790232,-1706819400,1616,1971372790,-10360824,-352320840,-10885108,62391667,855829248,1583292352,707165,1458342741,1589976663,-398983418,192085636,1102369675,413850,-1207602432,48955393,1595916339,80371038,-326413056,-987867306,2126775894,905913866,1929271272,-1705593847,1616,28837235,855829248,1583292352,576093,1458342741,1589976663,-398983418,208862768,12112779,105945667,74645504,49004595,1595916683,80371038,-326413056,-1273079978,105945647,-1014300672,106874142,1200359305,1595875074,80371038,-326413056,505304918,-1274652987,105945626,522125312,-899850657,-1957363708,509040364,-2147068278,57827834,-1239356800,1106935866,481567858,1089110098,413850,-12822016]}]],[[{"sector":1,"length":512,"data":[-397273996,242417072,-1270748544,105945614,-1070399488,-239598613,1583292415,182877,-1273079978,105945625,1090781184,-883007713,-1962467753,-1070400264,-218103879,-947171410,1547486047,792461940,-326412861,-987867306,-397408698,1213923290,-96733045,92933494,1979703272,-8552442,1191277882,96865674,-2454784,-46208969,1912603064,-1707363315,1616,-1070398350,-654900501,1595870600,80371038,-326413056,-987867306,126486110,427081738,1979685864,553820165,1631324907,2050754674,539755639,-347928696,1583292385,313949,1458342741,2126782039,96871942,172395008,158711818,1352276404,67108870,-1261401535,-840413126,112892,915232370,372923778,309616066,1573000840,1089110098,1352288180,1509949446,-947701134,-1392748797,1958742698,1610148610,-2013007997,21350165,1461607482,-83696230,-389575922,-125042942,-385923702,12123916,-1609862144,11804930,48956809,1595922679,113925470,-326413056,-987867306,1720322654,1977879048,-398983414,28900436,-1961659904,105810899,-1706113920,1616,-1070398350,-654900501,1566465823,1426065610,1465314443,-1547685090,1789067880,106874114,501757951,-1958710532,1023457491,1929156328,-1193768138,1352287232,-167772154,91521218,-335759640,545896482,45668494,868823874,105945810,124911616,-1996330845,-402494954,28900503,855829248,1583292352,313949,1430580355,1465314443,1247724830,-1041745921,-1955237125,989626375,431229812]},{"sector":2,"length":512,"data":[413850,-1270807552,-1994451398,1187381830,1988975620,-2133816827,1202995434,413850,-985042432,-1031058858,1224607208,1065408651,-1976273862,-32839673,-633664907,2139105652,594819839,126498815,1979578344,509443,1352285108,-1895825402,370242055,39226655,1352285108,-1207959546,48955393,1595916339,-998023842,313924,1458342741,1589976663,-398983416,28900144,-1960414720,105286355,208929596,-1595392588,1025012731,292880386,425600,-919401612,1352285364,1929379846,534312706,-899850657,-1957363706,509040364,-402235765,57867094,536584936,-899850657,-1957363710,509040364,-401842549,-71763138,-1961790721,1455752782,-1707101176,259588098,-654900621,1566465823,1426065610,1465314443,207522590,-1191504408,292749307,-989442421,1085540438,2030043802,-150834417,1583292376,576093,1458342741,1586175575,-85137396,1451954290,172919560,-1274657142,105945666,1595867136,147479902,-326413056,-1910614186,-1090508282,1992622209,-53923066,1958742700,-348018172,-1441943305,-2146531290,-1105263104,1556021377,687978496,1824465357,687978496,1595875789,80371038,705072640,782312960,1412211456,3186982,-1017893213,2754190,643050657,-1593823581,-1557769170,1438842928,1465314443,508826811,-1946449145,-67098090,-1426053471,-1426030408,-1196703093,-1951727524,1824041922,-1031034112,775356331,808910592,707168512,1378257748,106349885,-850722376,545896993,-1896162674,707169234,1352465236]},{"sector":3,"length":512,"data":[567095476,171820166,-1911390974,-1593824762,-1557790674,815857710,815998464,-1885513728,-1895813114,1912614406,-10622968,-352321352,-21458414,49971455,-55572108,1946745472,1610264578,80371038,-326413056,1187272534,1411818250,1411909260,-1559869756,109859874,646534180,646665258,1451965778,242649872,567104948,-1961867634,-1557787066,646643714,82334762,1566466047,1426066634,1370773334,132653517,707168767,378468948,646665252,-990161886,106178054,-1898213808,168216515,-1946060800,-889189362,-1910470216,-795936040,1412048523,-850545413,1566465825,1465275851,567103924,189537929,76824260,-1178586116,-1410138105,-1414806645,-1420548447,-1420547935,-1582606180,-1582607326,-1901374428,113714883,31916042,202279974,463098624,-1962934258,-1275057634,-954086064,40740870,189571328,1593839621,-1194631842,-661774199,-1949266182,-79867354,567102900,270441040,-1070395519,-1710535517,3552,-1957210539,185289758,-399149861,646577734,-1014082518,168216358,637677824,790156,567103668,-850657096,545896481,-1896163186,707169232,513473364,856654096,189572032,1839728327,1583284227,-58668195,-2147126209,158679292,1037601872,1935187968,105945606,1439367168,503732054,-1662219438,545897212,512678542,378208298,-360644606,-628224000,855670468,-2131678218,91504636,-352310808,-372158199,-207355533,-768386651,-1700933333,1616,2126838940,737555200,583921,119495325,-883073441]},{"sector":4,"length":512,"data":[-372158128,-1977218701,1149805573,638182399,-1985673845,-136118716,1388533849,-1202577914,-1706033149,251331784,190449660,-1020363584,-1705900462,6147,190449660,-955616064,6922758,8435712,503730883,1354773330,-83572582,1510472718,24952843,1030595,1962933821,899347,1962933309,9615627,1962933053,964867,1256833419,-2131001074,-1274711040,-64893634,-1705900349,6274,-2117924868,1962967291,-73791991,-67108841,12108551,-64893609,-2117877365,1962967291,1772266244,-1949660221,1107343568,-1006886451,-75415069,779419776,454565515,1772232235,-885313162,-880082314,102651734,-1030817653,-982932831,52103734,-205419536,1595869092,-1576664738,-1910586519,-1261401126,-64893633,855798559,1460061120,12446618,-1022886912,721426408,1030333446,225574917,1772357121,94000902,-67108675,-628309241,-1912586056,7119320,1455676046,-1380385705,223733761,856388584,1839637184,-1553094493,-828150324,1842652013,-1553082717,-56398352,1845404525,-1553071965,144928262,1846190702,-1553068381,648244752,1848156526,-1200770397,-492595970,1843700589,1843398343,113734592,-2084540846,1843791559,1709731776,1077837824,1434255470,1847723766,-1337035775,570881537,41222766,-1499331920,-1475950739,-352321171,-1270971589,343175021,1843543691,-1795227775,1049168500,512454074,495545942,-2086371352,7210558,-692451724,-1541347218,1846034051,-1173982208,333999910,177334436,1594668776,82365278]},{"sector":5,"length":512,"data":[-1547685109,1084386870,1849860718,-1553049437,1554214490,1851695982,-1553047389,1688432226,1840423278,-1586616157,1419996754,1007076974,113641070,-1341690306,605457156,638976878,-1568413586,1847858827,-392098328,922722672,-492737052,1843700589,-392464920,116824320,1965059618,977174540,91506542,-352316696,7923715,-1553092959,110063046,1474915812,1074185889,1035009902,1972926184,-1781798872,-402599704,229677256,1972922088,-402542575,313563289,1956141800,-401690380,347117709,-342325016,1024704267,-1394079970,10741909,-402589720,-236446813,50915330,-393217048,2045254598,81127427,-1469177184,-1475578879,-402295806,65767140,-1014633496,1849689798,-397955071,1659410501,6809749,-1332191256,-1741166572,854078128,11462808,-400860440,1721827855,1848943470,1849689798,-399527934,-1779918823,41609216,-2145698072,510540350,-2048391819,-1341789438,-1744836569,-402483736,1407750024,44886043,-1610415128,52719138,58000188,864366056,1848288192,-1553060701,-1195151826,-1226309568,2144521,-1410088909,171870502,1049175552,1085800486,-1806112768,1852194500,138316070,571392,647260136,1493321670,1848655497,866893964,-1414812736,644732577,-1946155869,-1200761338,1857748996,158591086,-1409286216,243385259,-2147455448,1852311182,1848116983,108267520,672039718,-1960443392,637536318,-1224516214,1099638272,1848812298,1849048707,-2146274048,40779838,465505140,-402186691,1558746223,-397824000]},{"sector":6,"length":512,"data":[1973196543,-1806440432,-402632984,313562960,1956048616,6678768,1852311182,-402411544,1973223556,-401297403,110008081,-1960415640,637536318,-1224516214,1848811776,172067110,1849048707,638219520,638089611,-1224516214,1099638272,1849205508,571587,647206888,1493321670,1848653451,73173286,1848655497,1848784523,108366118,1848778377,1745260227,77669998,1842782976,-1912001048,-1586599930,-1557762604,109838340,244018644,378236358,719875528,244040448,378236360,518548934,1745260032,77669998,1842651904,-1911999000,-1586599930,-1557762602,109838340,868445654,1842782683,-1593817624,1072197076,-1878618624,-335596690,221849103,-1993997451,1569334805,58297602,1854815803,-1899762827,1049306816,-1977221112,958792541,74777673,72452390,142183206,-361365749,303398,-613040117,3008707,1712243998,915089006,-836042742,-768349743,63099309,200925904,1241609682,540299,-1224516214,106006784,2877471,-919381309,1852311182,138316582,1569334784,-1929332989,-14285703,-953788619,1090519045,75336486,-445251829,1524825937,-1893310631,-335355,-1878618398,868234094,-335596581,92874250,39684646,990083469,1970179646,110019568,-1960415640,637536830,67437963,124512256,641632550,-1070349568,-395449181,109980835,-1557762448,1990262786,10692206,544270592,1849310848,-1962052335,997057086,1970136126,-81860343,-385851720,179833053,148367616,627976353,3998464,504984835]},{"sector":7,"length":512,"data":[1852317326,669323,2506379,-1048376181,-217637372,334176164,1852311182,2531622,644769443,637536929,-1912592733,644769798,671371,-787641562,882983401,-1958262930,529213151,-109848517,-501380826,1721877488,1845887854,53047918,1919841798,2114323235,52261486,1919845894,-1912208617,51475054,1919849990,-1643773173,1023767150,108199920,-385844296,-51902395,1715389694,1049175662,-987889652,862875150,-1644435210,1049175583,-987889650,862877198,-1645483786,1049175583,-987889648,862879246,-1646532362,1049175583,-987889646,862881294,-1647580938,1049175583,-987889644,862883342,-1648629514,1049175583,-987889642,862885390,-1649678090,1049175583,-987889640,862887438,-1650726666,1715374367,9693294,-1374763746,8448110,1857069855,-1240546018,7661678,1857594143,-1106328290,6875246,1858118431,-972110562,6088814,1858642719,1841694348,1852311182,444198,642798592,132807,1721841237,446899822,1856938240,1876774,644789921,-1593827677,-1557762370,-962527200,581117550,1851302144,2401062,91139745,78708751,-1029445421,1851302253,1857422851,-1016216413,-13371853,-1510741551,-1952185997,-2082867249,-1070395423,-1064523021,-271383375,-946931709,1745260227,1857069422,3318566,644790433,-1593822045,-1557762368,-928972746,950216302,-1960393984,637536318,-1224516214,650284032,637817225,185104779,104232191,63406935,637546472,540299,56461862,-1960443721,-1031010751]},{"sector":8,"length":512,"data":[-1977219233,11993949,105483046,108382475,104958246,-1053047317,-947666572,-1957313789,-353598996,-1233744640,-1583606040,79392214,-1233744640,1946253800,1842651427,-1929378629,1810413174,639661313,540299,56461862,-2094661449,-1207957895,57933892,-1929296151,119453310,-1593420055,112946602,-1233744640,1963015656,1842651431,303910,1842611852,-1191228440,-680198074,644732577,263815,-1938959197,862836230,16443903,-1917421939,-385915202,-1070359604,116838539,1946447394,67221530,-10054003,-1986251288,-1769081274,-991363226,67063,-1996434813,1451883590,1975651326,1723239758,381586943,-1685985025,-1920826440,-385935722,-1769104378,-1729560810,1086465015,-1232267915,-1097990298,1625882390,75741339,-15296883,-1919162904,-385935690,1988952256,19720374,1962849256,4634714,-1912652567,-1912641866,-385935682,-2085053645,378965378,-1682380545,1847723766,-1925155832,-385935722,17168195,13796096,-1980217719,1177287254,-27911172,-1232263822,1911095062,-1233744640,-1962877464,1452013638,15919354,1508379253,-402295298,334168422,-1962854168,-1769081274,-1511456922,-1233744639,-1929333272,-385935690,109969790,-1993970218,855650366,782444224,-499217664,-144381843,-1017256565,477413387,-1960394610,-2097149890,210371527,-1958613710,-1951992874,637957362,-521468021,-1957313720,1156350956,-1946257783,-162469674,-1912846711,-628310970,-1962917703,-806814626,4210166,2122401141,1968198844,-1099005634]}]],[[{"sector":1,"length":512,"data":[930428501,-388610421,-1014103333,-1946140488,-699495486,1586219051,-156964612,867989133,4241919,1586210035,-162404100,644732065,-1946155869,-1955736570,-1195155995,1451950152,75753982,138316582,63406848,-315487094,-1494002111,-1023314594,-1962916424,-385409282,-1957362597,1424786412,-1979955575,-1960378794,637539902,-1224254070,142183680,406731558,103838720,130515799,-391350643,123705820,-1339717082,-1403613952,-1919265304,-387404714,67061,989909635,-948765098,1178273143,-1950320900,-1950130715,-1955739634,-395459050,110033421,-1591317048,-727515132,446768749,984320,-388823887,-1056718452,-1016215389,520082664,-972648954,-164421779,244055859,-1561853926,-1591337063,251985946,-754667264,63016168,1841734593,644732577,-1946155869,-1016211962,1843412619,-2089746559,-396948873,1049205055,-1017156128,-385871176,703071133,1848025856,1847858825,1847725696,-155260893,-1912591384,644732422,83892897,78708751,-1047729965,-962346749,780387181,-1190367800,582877364,-1895877778,-210909178,-1262894172,-1074384128,119434786,1841831566,520529139,1841825411,1465303820,204323068,-402454808,-1070399196,-1553095006,-1432130136,1842783085,-1553067869,1048604216,1962949904,16824336,-1996418840,-1586623458,-1365021242,605457261,-194189202,-397158261,-2141457207,4001854,480448373,504793454,-972125330,537823597,470170478,994866542,1970150934,1847632198,-395458909,-2065169860,1048651508,1347682304]},{"sector":2,"length":512,"data":[-2128203403,1426063934,-1943505610,3926211,644721313,-1946155357,-1905415674,-971097149,-2133428883,4001854,512296053,1491627438,-1207047424,378208328,-1964413404,-1709512702,1024460486,40495104,650862175,-402646367,-1993998291,637547038,-402645855,-1993998303,637547550,-402645343,-1993998315,637548062,-402644831,-1993998327,637548574,83894945,78708751,-670832429,1839899075,-1107294533,468204827,47357,-1557785227,-1960443900,637536318,-1224516214,1099703808,-1547662332,950234582,-1365130386,1841734509,-1553092447,96693704,78708751,512485587,-670863930,1841831483,28837494,32499968,1841700489,-522987477,984515,-388823887,1841831563,507238443,108228038,-385875528,512295373,-523014712,1025687235,510551743,-1413467385,-1418869087,-1515470797,1859583873,-1144787083,65760870,-999371077,1925645119,990349576,125240391,105352131,1023512809,-176685072,1465274961,33601542,326567739,4055249,1005941280,84440839,-143450112,738193592,78709831,378267859,371944904,-1036292666,-1031074442,1191436499,1913076484,29526837,-1955740154,31642576,-745864105,-2089888069,-633665301,-987883916,64982031,868716280,-385928202,18847481,-471137721,1516134151,28885849,18082048,-1553045343,-692359738,-938046610,149652333,251987851,-1039104,-1325119607,736678660,264576720,-164380018,-1159135437,1468604310,1727758594,-1982433938,-1016215530,-1318137183,65590020,-1553018874]},{"sector":3,"length":512,"data":[1723559368,-971601042,264576621,-164380018,-2098659533,1468604310,84380418,78708751,-805050157,-2130132093,1970198267,-971601444,110019437,-928944698,-971601043,1958882157,268451113,-4717710,-754667249,868781024,-397323328,89191018,78708751,100788435,1498967494,1958820699,28885965,-1872958720,1847867019,1349441215,1486218984,-395389254,-692414866,-241964946,-1016199517,512219955,-387355130,1024566257,-1264336845,1840685933,-1553090397,-1990693446,-1989291994,-9579986,285657056,-1023410115,510621375,1870052871,-397355381,-1990683228,-1955743722,-482537202,-802780385,-768701587,-1554968979,-930386508,-482232642,-1073042425,-102565003,1840658057,-61385013,1839611520,-1207339776,-105185281,19393023,-2147354904,40740414,512435060,2062052782,1864808449,1872384030,185553920,-385649216,-397410115,-1202060959,-85327873,671545088,1946189934,268879365,512426301,-1014796758,-754667249,69075947,203293550,281248622,728608929,990278339,1936600070,-18423,-369099590,104530113,58093102,57552545,384324568,44113409,201720686,1049966,-13385586,-1582579661,-661754408,855639201,504269814,874417664,195359488,535524800,204930907,109990766,-1591317032,100859946,268791308,-1960423424,637537342,637683083,52837771,637537854,-1588591357,100888068,268791308,922701824,161115690,-1710271487,257163661,57544867,-1553071610,516189716,-953782766,247792711,105367334]},{"sector":4,"length":512,"data":[-694091776,1958742893,650153491,637540513,1705531,-1591341963,-370475004,-338654392,110006282,-13406762,1594075112,-466433186,-395463517,516161621,-1960415726,-771026345,1169425524,516188109,-1960415726,-1960432569,-1096602025,-1072264851,1958873965,1037155865,1958742700,-1274660339,-1408797587,-76169206,915009259,1456172470,-1070334889,-1553095006,279145896,-66983826,-1949606305,-1586647010,-668242516,1253359758,-1006886451,1458342741,5367895,-1962522997,-1073018794,-397934220,1583284903,313949,-881979743,-1959338869,-472841121,-1896052853,58048523,-1942122824,183002,1458342741,1586232407,15919114,637959876,1946172800,173968134,1593884904,113925470,238977792,24379502,-1547684925,113733134,1958778110,-345123167,650153564,1457803,-617365453,21334310,123570726,638089613,1588795,-1960382859,-352317890,1032005165,639923455,637957515,1586691,-1960437390,52822620,637539870,98179,1465256309,1501190,-2090967289,992348359,1962938430,77670092,1975520000,-1957313632,1357677548,1846413055,644746913,637618057,11544458,125799760,-391088499,-1923575076,1541976150,-1336504941,1167741522,-1962934113,-1922167266,119451774,-1962933016,868441573,-29979712,-1359052396,1443919758,1586666216,-1073042346,915012469,-782723842,-58226205,-472792178,-1081606349,-16019716,-141874060,1975519916,734432251,-1948808249,731184654,-217637170,-29455964,-1895908460,1846414987]},{"sector":5,"length":512,"data":[41359163,1128466217,1438906082,1465314443,-1961998709,-1360523178,52261376,-999419882,-1993995650,1435051525,108971010,-1207072474,1583349759,838237,-152321997,1458342741,172395351,-1005824373,-1993996674,1435051525,269888258,16902254,-661975182,-1081875503,1962970876,-1950338300,1566466000,-1962932022,1602959068,270412548,1842782574,309641227,992395406,1946167838,77669894,-1192367360,46858239,920423168,855918478,1048651456,1070399488,-1064558988,1846681284,240093990,-1047653661,268843814,638022656,1314443,-1064505621,-1962933558,-345123298,868453924,1049306843,-1960443882,637540366,1946240315,1569334806,142183687,-277481157,69110566,1977289472,-1950090792,103491271,-1960443882,637537854,1056395,-12745946,-1960435852,52823669,1912608822,1144727060,-1961986814,1277896394,637956614,1913146427,147292937,-730465477,-1960393735,1543710237,180781828,-991426589,-489159936,12445945,-102512501,-1960393845,-134206954,-702641213,-1910707347,372975299,242548778,772160294,639005184,2885179,-1960439950,184550430,870348251,-103773248,1049306819,-2094661618,108330813,38087462,-947714702,653257480,637682947,637957515,1586691,723965298,-814611388,1418405462,180781830,1290324107,-936689152,1581971571,39619366,371065638,1200301568,52871937,637537342,52829579,1912606238,1065559587,639464703,637951883,1580547,-1960439182,52822647,637539894,637617291]},{"sector":6,"length":512,"data":[-1022994549,-796147661,179054275,-1744668480,-1971379005,-1012128032,1458342741,570869335,113721454,8416734,1849427654,1040631302,113706862,1874882022,1843529415,-1070361344,-1553055070,-257724902,1275476845,-401509365,208797728,104631078,9300055,116066143,1842742926,109903667,1049194088,1583312384,1053084509,-1960442732,-1960439227,988288085,269888256,-19797906,105918578,637897510,-1006353405,637834302,638731579,638076299,639131019,1964656014,642468615,-1014298743,-1938942301,124655622,-993789864,644747806,618860427,1846545923,-784612978,992349812,1946161174,244000273,-420806642,141934603,172326,-1031011605,-326412861,637856899,50342561,-1989275642,379715142,-62486162,-1946401141,-1318184386,-1981295869,-1936654667,-1986985851,-1986985323,-7273339,-2123490810,-2140267970,641627136,-16040821,-1977206924,11993949,71928358,-1896063349,644749318,1183385483,1200301820,-27882750,1946272246,1468737034,-10229756,1224627849,1846548011,1946023656,1575324571,-1957311549,-61384980,-401230664,2126838047,16967696,-392883009,401091316,20178945,-401842492,-1070398615,189546115,-2145160192,1962935933,155579933,-1005095552,1065362973,-166759929,76877318,1048774773,1962972432,1589921793,126428680,283885619,1840658059,-401834300,1453428373,1941908846,1610144488,248143198,-326413056,1444211843,163118167,-123082730,-401965372,2123169932,712960236,-1006583576,-152566178]},{"sector":7,"length":512,"data":[1676404738,-392883010,1290297222,1049094205,921237383,-339725567,-1237939440,108971117,-1584512792,-1087541674,-125441933,-443851169,576093,-2081649835,1465259244,375372028,-386379032,2126838447,3336198,-387154291,1726491172,639484928,1963474816,1670375442,-1962261109,371919957,-320311792,855960572,-388985920,1583347771,-899816053,-1061289980,3574131,1446414741,-1915885458,1842757251,-385649664,-1967618872,-131077888,-1794242874,268879616,-956301163,194318854,977174528,108335726,-402648344,-2134670172,7223870,-1195179659,48824454,3574776,7399573,809239690,960239986,837293431,-145263984,-1554812198,1474860304,168069632,-398297920,1421577540,637245,611583802,-119389373,846546492,3729478,1922040808,1926952745,146725,305995890,-1558481152,149656850,134301578,1184173574,-1979705880,1975519748,3574206,914998165,-2017956266,-141825792,1958742700,1981824004,-993833225,126494237,1148390460,1081346108,1014238012,192219708,-1928903286,1843923548,1009642385,639071497,-1962784885,260704860,994176306,-1960675640,126372040,-957867029,173837161,-315438966,-466434934,166451203,-1960436284,1552745039,-1957210614,176014579,1583326451,1847239107,-326412853,-956541098,1080959494,1843791559,113668032,-956263154,194318854,108956416,-405601359,-1862875263,510902459,3401735,-1938571080,1566466010,1426064074,1465314443,-1324974453,-2115513597,-1953433913,499385429]},{"sector":8,"length":512,"data":[39815974,371065638,1200301568,1566465793,1426064074,-326898549,417118230,-1962860312,1183385157,641582334,-16040565,-1960440203,-1929377730,468190045,11593989,56461862,-165281609,1947206721,1502291475,1602954759,63144722,-1341850136,99477550,-402432627,-1977219854,11993949,-402359923,1174473982,1300965118,-1334451437,97380392,1360381827,-1977219497,-1960442811,-1960443299,126756413,-1930789239,-397349818,693636432,1586232910,403083006,1963239534,1959922436,532948483,-1981120883,1166805597,639484940,1946238848,105235984,1200236032,121997313,-352285464,1036761862,117734376,1950964063,-399724534,-947714713,-1332155643,90040361,-1795014972,-1951743950,1438866917,-326898549,599283476,3926041,2123233163,-1190715668,-1510801398,-2131984755,1962935933,235337239,91489429,-352295192,269388558,-402267243,65732822,-1006622488,848626238,-1956664640,-1547477531,113743112,16684294,-1795023223,-1794898292,170297688,204376469,-991887467,529147421,-472776910,1504182062,-1206136039,689580313,-652551910,790353690,1377557019,1612472348,-383984356,119339804,269388573,1976109973,639484934,-1006481525,116787805,1948357902,63039753,-400510909,1364395167,-167278042,1117064710,-466483084,72345753,-919403029,1493460456,-1008868773,-1960436284,-1960441737,-1910109601,1284187655,1277896200,499400964,74943270,106924838,-1995993562,38112309,21269030,-1341700728,72214568,-1342175768]}]],[[{"sector":1,"length":512,"data":[71690537,209059665,-16091649,1979647605,-399114494,93323077,-1895676529,1167001157,205885194,283330905,484977840,639484932,16926603,-857011643,-399986493,-919403509,637941188,1090942207,54296614,-1960439435,-620033444,-1960441484,-1910110092,-1947997433,1435175493,1591423756,1962281735,2088773132,91574786,-352319000,-1326652688,63564073,189813585,-1341229861,235337260,41160853,-1259848784,235337219,192155797,-402432883,984613554,1476633320,56396326,1888288951,1448235012,1141057030,172329217,638342537,637885579,638022795,495518862,637683084,-2013182070,1170605893,2129133574,1516111870,643390296,1124299915,-399986493,1573127003,1200301578,1032829698,1960292397,1033288474,-1156287416,1950891420,1034140430,-1157073848,1038630287,-400299262,749732408,-1341969688,52815911,638213572,170936202,-402230080,-347929833,-400051982,699400975,-402453783,1538285229,-1006435608,2005607965,1602954756,126756358,-1995809397,38112309,33965510,34031046,804295,868233984,-2080262702,-402295761,116064273,-2084188096,-1073086253,1571876213,184730345,1342665938,-1192743760,1166628866,3794954,-2084188096,-1073086253,797191540,-259315340,-2084188096,-1073086253,797181044,1213264501,990528905,1949085894,-399593465,783286915,-402489624,1113063427,1364414659,108396370,-1879211800,1499072069,-960276389,-402520507,48779294,235337310,1500842133,185222539,1265896517,-398611269]},{"sector":2,"length":512,"data":[1166737744,1279165196,527695883,76822212,641577403,1947485243,1035385625,239352614,-1145368460,1144727101,856126490,31189202,501744619,-399724543,1166737935,-388877558,699400649,-1157496087,99171752,205884161,-857159373,-398807039,1166737903,-372690166,-1964506689,173902685,-315486326,15984963,-1587708696,37590290,1023767040,58064914,-1929376840,-1229059491,-1954420625,-770979701,766510452,855749352,-33979438,238749308,75404562,1245825671,343918859,-1729613648,-399593471,316866963,-1930940240,-152354559,-503308312,-399593221,367526271,3964928,-770967435,-1329397387,23980101,-375799157,179044580,1308849600,1558786224,1560274945,-1962261109,-957805483,1559488512,-2143436613,1946159741,1036434179,-393197333,1569545441,112906,-393196053,1166761173,206932746,-1960436284,-1960440713,-1910108577,1976699655,1144727070,-1961330936,415663048,11996131,56396326,-502501235,56397303,-342882581,119443573,839879206,-1977203731,15329287,516159458,860611335,126494418,-1794242826,1008760065,186413856,-402426670,1364394039,598757458,1476444904,-392567758,1499070513,186116955,-402426414,-1073086437,548405877,1006675688,-402426585,-498925409,1976699836,15254276,665866240,1476431592,-154938633,1083510278,-661959563,259904011,-755510281,-2097036413,766509266,-1107267864,163134822,39074560,158795378,91429947,-503003517,800080368,472629502,1929532443,320603127]},{"sector":3,"length":512,"data":[-964492716,4319236,-154933022,43322886,-1336888203,3270692,506200,125074,-389773678,-997851134,-790048688,-790048536,256232,-485546920,1975519752,868436226,1009779913,67269178,-1000929785,-1433075138,-1795015031,-1794765057,123667316,170298307,204376981,136773525,1848156565,-1150427485,1642602094,772175228,-352233473,50906092,538915380,927276879,551373344,740441148,1008804412,574366242,-1006631745,-1200722410,149684223,1946499878,80184072,-193594821,2106271427,1745260034,1870052974,56461862,-1977220937,-1024064431,1460958224,125405990,310217510,-402405501,1153861008,-2090914049,-2048392249,3913861,1946731254,3061763,-378571078,1048637393,1963093562,-633437884,1962993261,1874239804,1874335371,829805067,763150347,2133266237,310056,180341043,1981712384,-134768273,-2010070400,-26249577,1271530186,-506400907,1849953928,1849296582,434684673,-5314436,-402652488,-970557281,-1336999353,2074732562,347138932,1434180841,-326898549,2079778836,-1792538938,-390057216,330332283,1971030760,163074918,-308287488,113661702,-400921026,113641300,-150507970,7219206,638219280,16940419,1424491380,906413670,-1230962283,1577462638,-1791515794,-1553039711,113677625,-402549464,1000542200,1024887189,-400904043,434666353,1527209744,38258214,-1791574446,-218101319,105638820,-402149293,2123201365,546564332,-970586277,-1924136377,1036257909,-1190819290,205258756]},{"sector":4,"length":512,"data":[138155379,179376500,192154172,548484235,57935676,-398390134,1347555228,50332856,-319035199,-1420252328,347120883,-2139419416,24001086,887686005,675184895,57933973,-1962525208,-389849627,113736468,38186,-402651976,1465087895,-402149370,1743289053,109832192,118444008,-970564769,-1420754361,-1330920821,2059659284,1849310848,-1949207551,194325054,-1908771585,644769798,-1912177269,-395401210,149452755,1009218937,639858001,637689227,-1910096501,252372999,-1792393589,1852311182,71665446,106268966,-342545757,330875838,-302978816,1013856928,1007252536,1006990396,-1023314900,38258214,-1000929702,-395418050,123670224,-1413313621,2054088899,-1792538938,7923712,1055396784,9300090,-51897424,-399411847,1387296651,1970926312,1178518546,245295214,-1986709597,-1332397802,-399447280,966987947,-401362795,-1595377139,-1791515888,468386736,191758497,-1559792448,45126969,-2036265493,-1791384722,-1792538938,-1577013247,1239979318,-401297408,1048607197,1946250810,675184784,57933973,-1023065624,-1553045855,-1070361296,-1198181725,1827143689,839319414,-401428331,-277579401,89057475,38112038,-392874845,1000541724,1024887189,378258325,1049335092,110007600,-141857176,38127142,1569334866,-1929332989,916456569,1962949781,1851302181,1848116983,192155648,1946286723,880033798,67108389,-1557302590,-1037341096,1852048939,37506539,-324983691,-1037350803,-149589440,7219206,-2096598000]},{"sector":5,"length":512,"data":[57934330,-1543504347,736849388,-385851208,138210489,512435317,-1993960146,54889783,-1953157469,644742174,637683595,1929533185,1488902,-1544776471,918459703,637333,251634931,57972018,-1006672919,2031020112,-394917656,-930449402,-2140506792,729043961,1968306560,898311750,39684902,638029350,1963146368,-437759946,-401493896,-622298947,2007820405,1396455797,-2141702795,24002622,-1960435340,-1912209035,644771846,134167683,-1175973515,11659384,1006709737,1007318049,-1207536606,317259780,9681132,-1192489751,115933334,1948335340,1948400880,196628716,1966073856,38258214,2021845075,-1506345128,1460032366,1594425064,-1336255737,2018240532,216543664,102004088,449112151,-2144991393,-1993997811,347078989,645411049,-402303607,10552085,1166616174,1975520003,-399265774,192247775,67993638,250090672,-2146178184,24002622,116852852,2125278,-2144992140,1048576269,1946250816,-399790065,57964467,-1342143511,2011425044,640464067,1015171,565449333,537261606,582224501,1074132518,1018430069,1484112954,1849310848,-2146995187,325990974,922699125,1460039334,139847763,1599862667,-1960945913,-1989253618,728655414,197624782,-1494016250,1969119007,102651683,1856376459,1856386697,-1960391125,109970813,520515240,520595187,-1341819553,2003560724,-385842248,1048832757,1962962432,-399986668,225802015,135102502,88459046,-2031550464,-331940096,-29950099,3604333,1849098094]},{"sector":6,"length":512,"data":[2001262,-29456018,226502253,1166747264,-1792236795,644769441,-1207614071,-1209532412,5826675,-386252056,109973051,1049325160,-2144965122,-1960411355,109969789,-1993970064,1990263365,92874350,1593965032,-1896198936,-1955698682,-1888616898,-1888616442,-1888616954,-1586631674,2453032,50347267,-1070397068,88442662,-1334942045,1992288532,-2081649835,109970156,1049325160,-538415618,-28931840,-1560219928,922709484,-1960405716,-947711155,1366614805,-1977198842,-1960442811,-1960443299,-1791581635,-1791279479,-1791156599,-402158042,1311310120,-28931074,410309131,728624289,671545282,1947205742,33194760,-31128716,1844225023,-1584056413,967011840,742296469,-1475965291,1936844910,-1792262519,-402650696,-970558732,-1101921721,163157302,1604645632,-947693305,-1953701371,644742718,1947207158,906413626,113706645,431415,-1553071967,-1960405703,2112357245,-1791253750,-1791158647,507587263,1931601927,-402650696,-970558808,-1101921721,163157302,-1583025408,104568108,1968729766,1856414467,-1017256565,637547752,1963197942,263435,17167910,1077936756,650130371,185687435,102200539,2106271319,126756367,155025446,-1960442252,-654900667,868419423,2105747136,309592067,-165281104,175378437,-165280592,41181189,-1960442192,635638605,365396823,1460031569,71666214,39684902,641567526,233310094,1476878080,-2091269885,-522058297,78168927,-1977209739,1300964869,1930050562,1946762279,1946696727]},{"sector":7,"length":512,"data":[1946631199,33129231,-108849548,-2096008190,208930041,79286667,79282944,-1009634560,-18775231,113496627,79188823,1852750592,1541862632,-4663413,-1014256641,638017451,-1023322743,-1157625672,-622301578,-1413467162,728673953,-1418830842,728678049,-1418829818,997087905,1970183686,-18429,1856938411,-1586602845,1621323454,1855889774,-1016178013,-1201704216,2126184456,-425990034,-1582579661,103509686,-1582600610,103509702,-1582600606,-1582600708,1587769014,1858511214,-1016175965,-1157625672,1860726406,-1413467162,1080973473,-31123852,1851302911,1852048939,-1413467221,1851302315,-1016175453,-385851208,113764333,38186,100668136,-107747241,-2134702241,946747966,350815093,-398741502,-1796705277,654556017,1970524136,1744776708,1423361,283621609,661082371,1042774045,571811813,767378221,1076721961,1208823013,734411822,36423212,-732942636,785646638,1429132291,-734581036,1900931118,1849310848,-1607961510,-2034274758,1950563328,6733575,125118780,1849165454,-395053079,1048604971,1951493690,833542,-991472407,644761150,637689227,-1910096501,1943464199,-1334586392,1940645903,-397293261,106498041,313540951,1953719016,279990769,-1334602520,1938810937,1509903080,638059496,1593990539,1347571975,138775334,71641894,-148343744,-1960545565,132573400,213405778,112896,638045928,638076303,638207375,637814159,1493583247,-1195130142,-689373162,708247526,775356309,808910741]},{"sector":8,"length":512,"data":[842465173,571541,45734707,127526912,1845247625,644769441,637814153,411079,105221376,110440099,309335,-1200641560,417867582,856121088,1845273536,-1791883633,-1792014705,-1792145777,-1792407921,-326412861,-2011763581,-488047002,1849335922,1962821178,-400576393,208958107,-1342146584,1922164756,1693181812,-395320088,158691623,91574588,-344794136,5957635,-1360512592,1745260146,-63009938,1435182701,650283778,1342326151,-1923676590,-689378690,-401428457,-210472365,-2031610960,235780210,1610584808,643324423,1979860283,1166616068,-401297406,141914675,980302496,-1049231802,-385988982,-443846051,-1947679907,-401362696,922710609,-1070371332,-395445085,110098583,113667580,856200502,-1791384640,-1191666711,-1092026346,708247525,4096917,1098186862,1399997416,855643320,244187,637960936,-1995291249,-1334969282,1909319693,1460023157,654185704,1963146624,-401690594,-1960414731,-1960443299,-1960440755,1642598517,-351838458,9746455,-1192923927,1726546067,868234213,870003666,-16695,39684390,138774822,173377830,206407974,239453990,-1993932801,1721831541,1166616174,1170679300,-1929379834,782435909,-1202256235,870842372,1042542,1776813919,-1547685119,110063100,-1597795030,1010593338,742136948,557586548,574362740,658247796,300427124,-401297153,-546016981,983571435,1950104686,1949056015,1948335115,1965177860,17885192,1946159080,-383274779,-1957334719,149717996]}]],[[{"sector":1,"length":512,"data":[1901783120,-395422488,477458514,309678908,104579212,343240296,54889254,1845233211,79170165,-459020032,-946929869,-1929871735,196672070,1842079744,-1989073944,1183644798,1204168446,-56536318,1166616173,1856413955,88443174,-1792133493,-1927509722,914950517,-1024944850,833902843,141828412,574378420,297009780,-400193498,2126774635,1962871800,2105747004,896794631,-1360522064,-397692816,-1977192279,-58801147,1963276838,-58815145,-2080868723,75696901,687728651,763577973,187466507,653819588,-351844981,-401297369,745893951,954747824,855929968,-1004409920,-165217154,578101253,637543912,638338443,67913091,654081732,-1341700727,1880221716,-1017256565,-385842248,-1749490735,-473175808,1852311182,1845247627,209552166,637957376,67913159,-2094611712,1962937469,-2094611711,1979650173,1166747149,1166616066,1166222864,-1960443390,-654900667,1356396368,79223947,1520363520,-1960421288,70061125,729314304,116689888,113849175,108396326,1569400385,1960512266,2106271241,126756360,123726315,-1977209621,-13499555,41779238,637957458,-351831669,75074841,123570982,175430411,21334822,-1929625463,-1960378816,-16053891,-891105163,-1960442017,-372175795,1363798481,-1378317395,858783929,1515514066,-402651976,-497460675,-1578726422,-1993970050,1460014661,1610264040,-2048343289,-1506345105,387182,1856374415,179851459,310016,-401799495,-1070398537,71665958,105220390,138774822]},{"sector":2,"length":512,"data":[-51901008,101741934,3467351,-1993996449,246417477,1483678952,494218300,451417008,-396949905,-2144928983,242354237,1594066920,1166616071,1435051524,582533894,-494147328,-2081649835,1187448556,-973078278,-956105146,64582,-1461171536,-972786322,-402194874,1191116923,-401428228,-210473321,83773174,109973108,1656712760,977174528,443880302,-1226304592,-88217490,83773174,-2144990091,1131676733,87916582,434650484,-1202695677,1727463429,-529012484,1586125400,-61961218,637896998,637687177,-2096865912,-253622841,33310347,347142726,1970157288,-8656637,-1946532213,-1195155995,-286719874,1803282657,-1972406594,1073787908,-1497642869,-533206930,1776919795,1852237934,1055406512,42985582,71666470,140348198,544597770,-388824143,-668210221,43968579,146296914,506112,637699816,637814159,-1022999153,-385869896,703127961,1849335918,1006667455,-1087736765,691798118,922690420,-1863815514,571647,-1191181125,1357384968,-1792368382,71665958,105221926,-1792393591,939953859,38201454,146296914,310016,-401798983,-1893334485,-1893333947,-706148795,1842538605,1894267312,-399739539,-1977157277,1946369029,1946434602,1946500134,34531362,146296914,8436480,-402651975,-1893334541,-1893333947,-1899821499,-1083295738,-1195179930,-18284520,1838082272,753405872,-1911655315,-1083295738,-1195179898,-420937703,65661152,-210382325,-277486582,-344670198,15122256,1849165454,1375844328]},{"sector":3,"length":512,"data":[1095760,-1191181893,-1662516724,1167009281,1167009292,-1070376178,71665958,105220390,140347686,172329254,25880643,381636690,939953665,25094254,213405778,637184,637626088,637814159,637945231,638076303,-1341504113,1826875664,-1200815128,-617414640,-402649159,1460011331,637619176,638338441,1376671113,571472,-1191173957,686292999,643455745,637820297,-1190767223,1396834303,146297425,1767237632,38258214,1532582480,-1951677557,-1047811134,-1413467221,1357386416,-1327795092,1820583950,-768360053,-1157408536,78118913,1598226804,1166550535,1569269249,650130178,637814153,637945225,638078345,-1022737015,-2081649835,2123180268,294643948,205488166,465045107,-540022528,988288944,-662794900,991000808,125168734,1178321036,-1207536402,-1293352934,-498693153,736384651,1444673094,-1207534088,-1628897252,-163148833,-386378101,-930479391,-1948105077,-689380266,-387872254,29033227,1946462208,145244935,1128465012,653033156,-393605750,1375754216,1095760,-1962917144,-1993935290,1183515717,1166616312,-498693370,138774822,652494475,638207369,638338447,-1961998961,-389849627,1692954143,1031808759,638087692,33717635,-1195179657,585695261,1927828447,-1993974819,1569269261,-947141886,1465107084,1746832926,138316654,-337956096,142183175,259325707,990076298,-243989423,520376717,532896607,-385840968,-1977164059,-771804643,-1476448541,805449698,813969416,805449860,805449730]},{"sector":4,"length":512,"data":[831009087,831009127,831009160,831009160,1673015688,-558634752,-2081649835,2122908908,-28930820,-386105715,594889116,1849310848,-400788467,126484925,-1002183630,992410750,91554373,-346711064,6600775,-1327596311,1793583117,654081732,638213515,638090635,-1960441970,723912781,2126775373,1569400572,2106271238,126756356,-396949935,123731816,125323609,-1293413712,-1326584982,1789650958,-1017256565,-2081649835,2122909420,-28930820,16402119,1031808512,639988995,818563,922689140,-1960415562,100732997,-1064538442,241011494,869269689,1430579410,1857422991,1726483888,977174634,1366560366,654079684,1963146368,1149969938,-96060656,45615477,-96075520,-397080344,1198876982,1131762236,644504552,989939083,1031141958,719852464,1569400426,2106271239,126756357,38112038,-386251263,347143872,1953093352,-401690449,2126801417,1166747388,-96064766,-1957379864,-1195155995,-2098659284,6666461,1440578793,-326898549,-1923676652,585690238,-386626801,123412983,-1974474520,67056348,-466422178,-1957400600,650337765,1208108427,7596112,839354970,1992440804,-2000516348,1087384327,1414457426,1416096088,-2081649835,1460016364,-387154291,-192213287,-398203416,-420994645,638017314,1963605376,1166681610,-161575679,645338088,-1929230965,367588958,1575324500,-326412861,-1928008573,-1561793410,1065362958,-1962248948,1435175493,1575324428,2013379,1440536809,-326898549,-327250668,-401702680]},{"sector":5,"length":512,"data":[499402587,155156518,1569392501,1575324426,6731971,199013609,1964734674,2028210710,168457487,839088320,45138880,-1023102781,-1329396048,-92028148,-2146208257,125173756,58310666,180552112,-1341949468,229688069,1942239939,-154892798,141820356,41157288,17621200,-326412861,-972362621,23988742,-1560280392,-1410830862,1844224474,862842531,1844749248,-1553074525,1049335104,1166765538,1845011202,-395445597,1183383758,674693116,89450606,-1879423351,-395452922,1183383738,71624950,1844192899,1745260286,-29455506,1979648877,12380174,-385988983,1183383869,639691768,1946420726,61204494,-385988983,1183384555,-401806344,1183383882,44099838,-1946663287,2095643718,-28931247,-1957610008,938015302,-163675311,695468141,-189011024,1368975469,-395446597,109990344,1049325160,-1960415746,-1960443011,128979029,-1202803736,-722992612,1844755281,-1957582872,887682630,-129594543,-1588529688,103509678,-397382052,-794733854,1841734510,-828129229,1859298158,1483606690,-1017256565,1848116983,292815104,1843543691,990004619,1953364486,1845142276,-1010814013,1849704064,-1201373952,2028470276,1842782545,-148455282,16787462,638219520,184550561,-336759360,34650129,1848116983,58000384,-402516808,-919383729,1842742926,-1064431637,203328294,1065559552,1090680063,77669894,1975520000,-1340808215,1353377946,870003544,12145106,1362618416,-1326652839,1352067157,-387610184,-324972383,1958742893]},{"sector":6,"length":512,"data":[-1294403833,1318250732,-1202696727,-1964446583,-396513200,1048596596,2080403008,-389304312,870928488,-1070483376,-1202687768,-655884276,1344596304,-2081649835,1437598956,-1202697240,1458103689,-569968816,1946158189,-334066927,-1327827091,1300424704,-402599752,-324972373,1958742893,-1294403833,1311697132,1852311182,1845378699,-1980697112,82378310,-62486031,323848998,-485111933,106385692,71666214,39684902,641567526,954730382,1499399936,-502937725,1745260260,-29455506,100017773,639333408,637760907,-1341107061,1293608967,-402515784,1957711939,-395447109,-2014818338,1575324495,-388461629,1311371536,-61462018,1979841155,671545100,1947205742,-60390652,79951614,-2144980619,729088829,209552166,1378120704,201213579,-1962707758,52886598,-944107451,1305405446,-1960394612,12127837,-388877360,190468121,-1023314478,-1157740917,-1310179644,1460058189,-1957732120,-1917125562,1302521918,-396945736,-1977200815,1963539461,1166747149,333989890,3192908,121384939,-544535947,-1202978072,569049180,326435644,209552166,638350336,-401586805,548948974,638249730,-402504309,280513506,1333389568,1852311182,1845378699,537261606,-994569356,1324869702,-504887632,-1030965170,-347149080,100017689,638809152,637760907,-1341107061,1276569607,-402514760,-1960423617,-620031651,-1960419212,-1910108291,92939783,762514492,695470140,544475964,1182075452,637983162,-167684854,41157314,-1960431946,-654900667]},{"sector":7,"length":512,"data":[-397616152,720062385,-348756034,912375319,21362214,-1106414328,-165267875,1963196741,911851011,839682606,-1976678675,1314580484,-1984366622,1315170540,1307073968,1745260110,-29455506,-279189395,-1011824501,17167910,-877657484,-922874397,-1957810200,1312549057,-397543959,-269922780,1183449933,1183515647,1187251710,163745020,-1946532213,1452014686,1397799166,-1202842392,250106449,1465301070,-1202845464,48760350,-397037490,-1984410132,1308092645,191753377,-150506304,-387140904,-1196405784,-1588735000,-617386392,866123961,1316743378,-388460872,-1947644463,-326518707,-1337079576,1303570525,-400619592,1605914045,1303898206,-396797256,1538805169,1303111768,-1779904592,1298196813,1077316382,1745260181,-803303826,-1961366674,-1977220484,11993949,71404326,208977931,-1962785655,-167050124,-1021319819,5421087,-385628285,681695119,1843307374,-387465240,1656447323,1670834231,602418037,922702076,922709486,-13734298,110035287,110063206,190475758,-1844742958,-1840442648,-397617688,28527854,868234179,51758043,1396676178,1163149206,937958997,1278755374,423573691,963193401,1295717407,1714240659,933449533,1446878257,-1773054651,1066812223,1430230569,-1776795754,1066817599,-398515881,1053057153,-29659578,-2094649742,779419709,-401735898,330326932,107179240,-10819497,243792,-1328199192,-544495092,638017368,1407720841,1282206028,-385855304,1371068121,-690755328,1428627128,-327029621]},{"sector":8,"length":512,"data":[1720189058,1664346367,-8485177,501743616,-27358977,-8479091,-1605640984,1178234426,1007252735,-400788204,-487890124,-8479091,-397678872,1021901618,1276962892,-1956438040,-1195155995,2122317909,57999614,-385846856,-1957308807,451707884,-949812248,59462,15091399,-327250688,-1207420184,-890765244,-21305246,-1326823799,1652942886,-1377302923,-398030338,49446528,1183518325,-159481622,-1959496448,803989574,-386906485,1183533982,1268312298,15236739,-340785036,-387555699,1586318330,1277880568,-387430773,1586318206,1277094118,-1957981720,1438866917,-326898549,1653270550,15353543,-327250688,-1207449880,1458044964,-28907422,49446528,2122321781,74776822,770424883,16271047,1262282752,1586359216,1269098730,1347112424,-387293555,1183534032,1260710128,1260447832,-386376051,870861760,1575324491,-326412861,-1206457213,-957855681,-364475906,-387154291,2122319719,477430514,-2132130165,1962997374,-129579224,-340787200,-386376051,-68662446,-263812790,-386376051,1183533948,1255205098,-386906485,-471315766,1575324490,-326412861,-394335101,1187471836,-1929379710,-1125585794,639484946,1913405312,155579916,-167349245,1948256581,6404102,-1193990935,-1897398250,-662794911,-1157559832,501758728,-1207536543,183042106,-2040624683,-1922983960,-269958018,-562135040,-2147060478,1946339966,-662794978,-1337304856,1185212416,-2142606616,1946339966,-998339318,-969100056,-1207957435,1055391780,-47257503]}]],[[{"sector":1,"length":512,"data":[-1920711031,1988997246,10873048,-1920434547,-1662466954,-1333883648,-1953991027,-1976662434,-1545076409,-1669427968,-387156339,2123169923,-998863480,-1929348376,1988992126,-401887096,2123169926,-663319160,-1929353496,1989012606,1081206920,45514368,2122321781,74711226,1240186931,12207815,-934900992,-1958097432,-941040570,-1270445239,-1958100504,-1142362042,-1913933751,602440286,-1503752886,-397782040,1586298965,1246423170,-393984373,1183533470,1234757792,-390439283,-1410840008,1575324489,702915,-1510799586,-1007661687,-1929005080,-1796674442,433056024,-2144216856,1946289789,1231284245,-1928772214,-806876579,207457609,-381026328,-1916581525,1988881534,122025606,-1308003064,1955213054,1212868866,771752376,-402434934,1166231475,-1070398966,72649262,-2092456216,-1023276435,205915394,621805568,405276685,-2115204267,-402607380,-1070374864,-1979824503,1183448134,1317439994,-495022593,640703464,638351243,638476171,1988691854,-129594122,134694390,1290273652,1222109209,602407088,1223747653,-11624819,-1337423640,1606936633,-402615576,-1634907938,1994981198,-72685496,-11624819,-1337430808,1601300500,1048583797,1948741178,977174551,276047470,1586359216,1225058554,-386113907,-991213260,1290282672,-1339001505,-94466581,-1924600344,501808222,1217456201,-11624819,-397924120,-1634862244,518586190,977174600,125052782,1458050224,-1326912673,1599072295,-11624819,-1924651288,1183578718,1221257468,-386244979]},{"sector":2,"length":512,"data":[1407731936,1575324488,-144906045,-397908248,1957822542,-387442768,-1340508834,-159468932,1946347846,-1301106684,1586319990,1216145660,1509961192,-924314960,-1978632866,-27357758,-1924634136,-1712784290,-1966806200,-1929300798,1474886750,-27357880,-1337423896,1591470355,-389120371,1580925977,-1943243274,-129614912,1183458677,124095209,989189864,494266694,192152744,31997360,172329800,-1337455383,174426684,-1203239703,787021898,7387346,1439836393,-326898549,1588783190,-1989283679,1187511878,-1929379670,-1930892674,639484943,1946304384,1065362956,-1207536637,-85393333,250381265,-257821557,205818221,1844459145,-1945609079,1166674500,1946396681,1965074462,17090074,-1962851192,1149831749,205884162,-1962654583,1149832773,-1203705082,15204356,33867332,302073030,855786633,71600576,-402242423,-1159182575,-1984278465,38046526,1480963048,168201402,38046704,-402652667,333989284,-1436644025,-1337545496,1571940370,1659437941,-400248577,-773300767,-1436643847,-1958308632,-257687994,-1436643987,-398021912,-443857178,-437730467,-512038819,-1336207640,1572333647,-1956990744,997083670,-1206422826,-1880621048,146298831,-1031033877,109533355,-374631104,1354254002,-786437888,-10637336,-395418058,753401866,1711705857,1184426350,-2081649835,922683628,113667686,-1340510660,1567090701,686295472,1946267741,-401952757,11558175,-5242252,-386316664,1048599207,1968336442,1178518598,100017774,638415888]},{"sector":3,"length":512,"data":[637754763,637631883,-303364210,-1476031962,-2145618686,1946220926,67314716,-112818174,54889254,-1929623927,-242292542,654202505,-352238197,6928440,-2133815063,1399732798,1053053813,-2094633402,1946161021,100017736,-398297984,-1960384746,-1960439971,-1910107779,1065362949,637957129,-150845557,-96040488,16350848,1187382397,-504888839,1550903388,393527306,-213260208,83460185,-654900619,-335919615,-214308858,-1963309431,-12781242,11537781,16481920,28312180,-1963374968,46235848,41026108,-315488335,1592312203,-109670962,431006963,1968977640,-16455421,1849427654,-401690618,-1000383391,728655374,1575324623,-338754621,-1977200317,1946172421,1946238001,-1879000799,57934396,651165881,637885835,-1960441973,-1960443043,786956629,130515782,-1960438293,2129133893,63406917,-1977218581,1642594629,1497843525,-1183450821,-326412861,-399840125,918838308,-424645050,-2013003226,263257670,-1923354392,1575545470,358541356,-488107856,-401166245,2123193309,743106774,33441526,1172833652,-402396395,1988957486,108822762,-2145815294,1962937212,1152641043,-1572688,-28931520,-401972086,199968009,-1975472920,135069254,-398136344,-443857738,-1957313699,686588908,-387154291,499387604,1007127078,1011577856,1011315716,1011053573,-2145815290,1946551933,2139301390,208994308,1849310848,-402295786,535498854,1458050736,-662794917,-387156339,1988952094,899475692,-401382680,-142142307,-1959082264]},{"sector":4,"length":512,"data":[-443874235,733528925,-826283776,-2144985916,259262015,-1377241209,1962379065,5695503,-398885655,45681915,155379969,4646998,1065363038,-2143390455,1963067005,-1239512264,640992367,973227147,640316679,-1996400758,38112309,1124554120,-951760408,1093,411078,542150,-2079767098,-1995811447,1166609501,1592312590,899934208,-2134696508,-2140265970,-2147462936,2137924134,-2144985660,275909695,242715430,207588134,-1996190170,38112285,3139779,-2144985660,561319231,33979776,-1494738316,1132193845,873022858,207457537,-1924930072,367528541,1132587332,2668739,-389155607,-1682243361,1509353537,2045258357,1200238170,351044353,1464923275,-991363445,1610058496,732424280,-1022049149,-385865288,448318917,-843060992,-253218640,-2081655463,-192211732,-385971369,-823656293,1610058552,-2144985916,-730527937,72321830,106924838,-1962439130,1200301785,1602954764,394995214,992353732,-1166734265,241142566,1964456742,949479601,-399194904,2105545538,561316358,33979520,1569397621,-754732790,173802475,1300891530,132218890,19196114,-348913944,1038084130,-152504441,993847350,-1746339961,6338626,-398233880,1170621107,1974472456,-2093773592,113448132,134874882,168560907,202246925,3336207,-398338885,527784212,777623528,-2097068150,-192211732,-24422576,-1962928152,-396861449,-998036795,-1009128684,197124,138019076,954730830,1107933952,1968758760,1499654175,21465646]},{"sector":5,"length":512,"data":[-1961563005,-1957211916,1960190,1482684299,-2094362392,-638905148,84019139,588252674,470037763,1107640583,1535502342,-1151965464,-1578614137,777287000,-1006544897,1065362973,-166431482,1080959494,-2094647179,1946158207,233891852,-401637400,-546043111,108888259,640578822,552945654,-672651404,1103620109,-389019208,-655867355,138790465,-378163185,45691569,115795968,-1205240343,988348458,9418956,315372777,1119834627,1397039618,1398097333,1173228897,71639632,-83671557,1187133253,1363619382,1245923146,1196042567,1447557903,1276666195,1257068617,-397697193,-1981281957,1177994328,1552623214,1955276293,76424711,1166810505,1200236034,121997313,411078,542150,1850095300,-1476097498,638415888,637754507,637629579,-320141426,192153768,637593320,16860299,-154990011,1080959494,-1960419467,1435042132,1006838794,1009546240,1008890881,-1340771326,1418405382,1050077187,-389640520,1170620753,501942281,55872294,-352253208,155567636,-972756159,637602117,-1996274549,1166806085,83240462,-1173392380,-689424188,155567679,172345128,-857145344,146008128,52742282,326369340,175374652,779354684,22856742,280707819,-1157371136,-1960443886,-1960443580,52822900,478881335,1962933123,-1579678914,100888080,-1064407550,-1960437013,1364197700,57969446,56396326,1888288951,15984644,-670869415,1946468854,532948483,1166655539,155551748,-1945477751,-1195176891,-823590773,570881738]},{"sector":6,"length":512,"data":[1165312110,1850482315,175495947,863945913,6285522,1170614251,1200226310,155551745,-1996339317,1200294469,205883652,-1996077173,1065356869,-1173392383,317208772,155567679,172345128,149487616,133163072,-1075292666,8120320,106939430,-1945477751,123604037,155567811,1456914,-1023314578,571033030,108956601,1745260118,-29979794,83240557,640972048,1946375227,-1194459602,786988683,1955276288,1552557571,-1929332989,917505136,641722344,1963984118,1413162510,-1207405565,183008651,-1948587264,256193,-389871778,78659545,17102374,112198260,641711081,637623435,794115,639601446,925187,105351974,403047206,-1094546432,244027646,384003610,225772603,1963086907,106728200,1847068302,147227587,-1950815518,-910432000,1852311182,1845507723,-1977216021,-13499556,637825165,1963984118,1955276296,1979058947,1048626153,1946316346,1177994312,478881390,41192230,-1996190170,-1938957794,644733958,918816650,-964465082,1946762244,1963408393,2144549,-1977219349,1106063884,1088995723,-1239512737,-74754193,119473694,520529139,1874247263,-2091448546,102632135,96012063,111538944,516185887,495545818,-956152436,1093,33965510,542150,21465638,205488166,1166739826,206932746,-1997776664,-1712781499,107341909,280007,138790400,1177994240,83240558,-402426864,11599391,-1995716989,38112309,101074374,-1593358968,1166634574,1850777872,-384678519,229660000]},{"sector":7,"length":512,"data":[-397068056,246479569,-397070103,-397388574,1012464663,-1023314940,-1003236120,126494237,1349848124,33979776,95436148,-402168438,334031903,1040181304,1273495728,-654854086,134694390,-138929292,1045424336,-388827208,95960649,1044637697,-394067784,-759677379,1043851264,859695849,735196096,1427835461,738912524,645204540,33979776,-420997772,833153072,-398610200,901265203,1040967904,-2093105431,1946161789,326467588,188531584,116861557,8416734,-1964452747,-402608067,146290514,1038346432,-402426696,-2135409187,1037560054,-1041727312,1032186173,-385865288,-1981233159,-78518188,-1003285272,1065362973,638350349,1946959744,2734114,-2134385431,1946289789,795338769,17397120,-2029369973,1166609477,1971569418,-2134703862,1946289789,1025763366,1877475504,-789137351,67585526,-138932364,122025680,-402230264,-138920595,1030219986,-146990359,1442253397,501793548,105236052,-1983892734,1170605125,1166544135,172329224,-385071735,-396942162,-544481295,1065363039,-1341688573,1402333201,1392927092,-957870672,-117512109,-1092088144,126494291,39291686,495519579,-2147334772,1962935933,155579928,185759104,637957330,1963087675,1200236040,121997313,1930181827,1963473924,1065362968,637956876,1963474816,1200236044,719867905,2145998898,4044854,-389612311,1170670683,-973078524,-1207957435,-1766191103,977174528,510984558,-1957211568,1379985651,-141834102,1968724575,1408860173,-2077882251]},{"sector":8,"length":512,"data":[-385649628,-1031012902,1439088873,-327029621,1239941324,-1070377133,-1979955575,-2037776826,2123235124,-1190715724,-1410138096,-790097744,-1592887982,1187475000,-1996458244,-1846935994,-394359552,-1342123800,1387653143,2123182453,12839124,49184384,2122321525,141886170,-1947056501,585883222,-387416435,-1557559,-729903818,-398737176,-1464322314,-2143819008,1963126398,-230257883,-802434933,-259312270,-288160847,-511653750,-771641337,-1270740768,-696008496,-176600576,2123176427,998762728,-1204371992,1357381796,1000138812,-13328755,-1338297112,1379526674,1961427829,-401559297,548950633,-389510400,1988975575,519801780,1604645639,-1979943228,38112309,280007,105235968,138790402,173902080,-13320573,-401574912,786968399,882806075,990505215,-1959051544,-389849627,-756538748,-58817744,-1005161216,1200301597,1602954764,529212942,-1996484603,1586101318,639485182,638338955,638476171,268771211,-62506240,1580927093,-385649154,448269130,-982521600,-402469144,-1125625348,178435,-385874968,2105549466,359925254,-2144985660,225773119,1962998144,172327684,-404110590,570881536,-160087954,101088640,-1628934284,139296826,16351233,1173764468,611651593,537478646,-1196422539,-398796824,451623417,17384950,2105740917,141885450,-386365000,116079313,-402616902,-109037187,-2145487614,-1207695283,1173805196,208994569,-155153224,1963460933,-796084221,-1494687486,978970682,17188294,218580422]}]],[[{"sector":1,"length":512,"data":[607686,641057987,-1460321142,-1470401278,-167349232,1946224453,1961691729,1964288015,1946265673,2088969797,1047855352,17319366,1946220928,-390549474,-1940833712,1552623296,268483062,-152513997,-109029062,-2136574718,-1341913011,-390004040,-1064551888,-161707226,857735353,987228370,-1883730965,-1000609536,101088640,1166739572,206932746,-1159174933,-164248575,1963001669,1552623146,1960512508,1955276322,1149970168,175490064,-1960382461,1846583604,1845626371,-1960394610,1351296512,640674562,49628406,-1960428171,52885108,637537334,637682827,52835467,637537846,-92072821,52458751,269913026,369305198,-109051862,-1845398272,33965510,218580422,-1995815543,-1195176875,-823590773,-326412861,-399971197,1441268007,1177994320,478881390,41192230,-1996190170,38112285,21465638,1460094344,317198256,-327250608,-400523288,2112368317,-401362935,2123190273,544139480,-399594264,279972204,-162533144,1080959494,2123186293,954198252,736624816,-397365195,2123184424,953149656,468191152,-402149323,-396412648,1183463643,-532280588,1166544676,155567624,-1983892696,1166608965,239438092,861869547,71666112,-1962326648,1166664262,-163149046,-972274295,-1962932667,1438866917,-326898549,6809602,-1001413656,-1334950346,67249892,-1325513080,1332733967,-400564248,279972064,-2142280472,1963067005,172329745,175498250,1183506570,951052542,1189613803,-402477000,1183462546,-402125570,1357396108]},{"sector":2,"length":512,"data":[122013240,-28903934,-972786687,-972683451,-2147416507,-973010867,-1962931899,-154968603,-1066524154,-1195179659,-1628897147,570881730,24477806,8763587,-2084400919,7213118,-1195179660,-2098659189,16312514,101088640,116790901,1967156770,639484967,294787,-538437516,91154435,1946224872,108888287,-166890240,1971325253,-1883716857,-1035212544,-385844552,1048625733,1968401978,1177994340,2088969838,1500774415,-2147158490,-1108847756,1242991438,-138811282,-1075251321,-1980266536,-1960441275,-1960439972,-1910107788,-1944221436,-1977220539,1166541127,105235975,138790400,1200301568,651753218,1963540352,952416780,-969511704,858261829,172329408,-348691736,5302275,101088640,499388277,75465510,-401116160,-840432834,6809604,2105599604,125108230,-2146875914,-1195179659,-1427570566,2156737,-2144985660,292816447,1946174696,108888307,-167283456,1971325253,2058928897,-1048057600,-1152692504,-1981264567,772044109,-1207867393,1927872532,1375930561,-1252834625,1196052805,692537923,1398097738,1257068641,-1605809128,255618618,289148788,356255092,-373095308,602472911,-326413054,-1004606333,1065362973,637957121,1963540352,108888076,-167348992,1954548037,7976966,-389997335,499404204,138906406,174033702,-1962439130,1200301784,-398030588,-1931321719,-1923619770,-1578570626,739764466,-387811699,113640827,-402362814,113641137,-1962906046,499408887,71797542,106924838,-1962439130,-1944221224]},{"sector":3,"length":512,"data":[-1977220539,1166541127,1200301575,-431585022,33979520,1149964149,-398054646,31876855,-1578563003,-398030080,702965495,1183517253,11790566,-152416632,1965033797,2093550112,-386431204,128988657,-2026750488,-364475657,1329577558,1577102056,-348791576,-386431142,11548117,-2026757656,-364475657,175947786,1329184342,1577093864,1300239851,-1162869752,-1959393304,317253190,-487081930,-1976169240,-142145467,-2026823192,899410167,-142147408,-2026812440,-125060873,537478646,62391156,157551352,-399121176,1149908375,135209992,1300236357,902045705,20742182,-2144991628,175442236,686297776,-385649332,280035028,-1957930776,197352933,-1324124992,408848,-919400844,1944637761,-1073001989,-5176716,1913666755,76230170,775262440,-402504565,-1959905911,897837060,71600942,1010138345,-2146208254,-1979578291,-391008032,-1959905939,-385741820,20723045,108269170,-402355410,-1959905959,894691588,-1948200509,-775552016,66554855,641058046,1946303616,1015031302,-398625533,1048595448,1963028026,-1075292359,1610058570,1379676277,-1960435339,1157693764,1552623114,1955276293,76424711,1166810505,1200236034,121997313,-1337211927,-163518208,-385844808,750305061,-1088427776,-2144985660,108267583,-385844808,1894301457,1268705532,108497702,73370406,-1996190170,38112285,21465638,-402176632,-1070399485,570881731,1232420974,-2144055064,1962935933,952416776,-348955416,108888082,-1206749951,-1696020599]},{"sector":4,"length":512,"data":[-1030834124,859084008,-349654336,-1962495981,-974648235,-963725263,-1959493400,145885765,411078,-1995876984,619252293,108888116,-1005816830,-1004139939,173902111,-972274292,-1023408571,425344,1173769332,1484062983,-2094654012,1946221695,178255,-1006515480,14084149,604587402,863234063,-59441370,-126579930,272927526,-398619718,116863592,159198,616040052,880666626,503298648,-382577688,45626299,26077184,-1171023640,-1427629825,866773298,2662694,-1962837272,641058014,83182838,-165276555,1946350916,1284187667,-74754058,1609439976,1924688363,-1107826432,-180029914,-402295792,468385884,-128677082,326423051,1845499451,1437599605,-348940312,1996470534,653490408,32851190,-1064557964,1852311099,-1699736204,-1942783000,1552623296,805353974,115921459,-1340544204,862382094,1642653872,650153011,-1175036789,-768409600,-382465816,-165268713,1948316996,122025504,103445761,1038661808,274580531,-1960394612,12127839,-388877360,-351849503,1156982294,343163125,-151015240,1963198277,-1070483453,-1338825496,856614992,17253878,1173757813,225772039,-399332120,101460821,115955636,-1070483405,-1204616984,-85372848,-397015502,678753130,56396582,-1961867893,1223168597,1578726692,2126821639,-1293364685,155567858,172345128,112721920,852224343,-385839176,499432693,108497702,73370406,-1996190170,38112285,252200390,205488166,-2144990093,108267583,188710950,-1977216907]},{"sector":5,"length":512,"data":[1170604359,1166541062,155567623,-2144943360,158665279,84297158,34031046,16824515,-399566616,686371345,-326413006,10153089,-1960430140,-964491188,-147004662,7200262,855799048,-96040512,-10058041,229638144,1464396008,-402237871,1577517089,96895833,-1341688759,1221847058,-1335891221,1221322766,-10051955,-1959681304,650337765,637813898,637688971,-1910098805,-59340537,-1912715636,78177918,1988977013,-311367428,-386107763,-1259855122,32499712,-1977213500,1930181639,1946696733,1946565657,1946631189,1946762262,1946827807,1946893352,701556777,-1763152779,-395646164,1860707757,-396397568,1525359991,-400166168,1383333985,-349825560,708765773,-353874965,-398005462,1589967183,126494460,913571900,292817212,594871100,-1030962293,-387441212,-349998046,-569968880,1962938477,639484942,1946763136,1751057,1002151145,-1930005219,38091712,-1880559755,71666473,-10051955,-147803927,195142,2105543284,74712326,67716598,639485123,482609034,1963407910,853051918,786682367,1399429119,-1195179659,1391001626,-1940681541,-1940681645,-1940681645,-732718765,-1990974381,-1991014061,-1991014061,1783859539,-1010814124,70976907,1166739061,38025986,509040323,885341636,-1491503705,401086069,-1391364864,-1861388881,199756515,-1509591808,-152960395,-1017225441,-1391430233,1193118502,1958742855,529212934,-1022936173,-2094654012,1946158207,1334519356,1602954756,126756358,-1960388213,-1960440761]},{"sector":6,"length":512,"data":[-1960440225,639419415,294787,-1960437132,-1960442801,-1910110625,651791111,1963738939,1602954759,389752334,-1996190781,38046469,-1023261303,70976907,1166739829,38025986,-993853067,1200301596,1602954756,126756358,-2094606197,1946157695,639484960,637814667,637951883,-661977202,41911078,-1962248960,-1962571516,1166606916,499434242,206015270,241142566,-1005090010,1195058716,638022924,638476171,-993847493,1065362972,-1021086964,-1912555845,-345098234,13024025,1849165454,-692383509,939953664,-1157108882,109969638,2105568824,880083462,-1962261109,992349269,142542423,992354428,443679815,173488934,310315132,138885926,-1977217929,101318983,1166569026,1287176967,-1177556736,1843267319,1182007298,-14265594,-14284169,-14284681,-14285193,-594869129,-402650952,1397764230,-401756078,250095906,-402608081,-1078973606,1513052136,12146779,805562448,-402600776,216543175,147096367,-1977219237,101318983,-202805694,1174857768,1850089156,-2128639194,775946211,1432323979,1571290926,5724245,-329376512,-396485376,140473344,73364481,5756161,-1873232384,-1806123520,5825792,5847296,5979136,677110272,744219137,6078721,6092032,6110720,6120960,206961920,5648384,5779968,5800192,6065408,5682944,5703168,5721856,5867520,5910784,5952256,-1738860544,-1671751679,-1604642815,-1537451519,-1470342655,5659137,676747776,1281203464,1348312321]},{"sector":7,"length":512,"data":[5995521,139853056,5651200,-326413056,1343548547,1964405736,-327250666,-401240088,1961426576,772794390,1541931184,-1207506134,1726529585,-790079442,773646382,-1017256565,-189011024,778365037,-1909584407,-1955698682,644742718,1948255734,-1142181877,1273523702,771025198,-385836360,-1957316511,686588908,371255376,-387154291,499447247,205488166,2123186034,369617112,1170675060,-973078524,-956168635,68165,804295,-402003200,1183454476,664856819,1511386856,-1913880947,652793974,-386430168,1166802397,1575324420,6863043,1438123241,-326898549,365226044,-387154291,-974646200,-662794987,-401289240,-2098659888,364308520,-389775731,-1343744848,678684925,-1961516312,1072230470,-599356627,-1959970328,870893638,24164397,-399639832,-443863738,-1957313699,1022133228,-1927973400,-102175618,360114195,-388465011,1843926000,-998339307,-401311768,719912312,358213672,-386906485,1183526134,753985756,-389527925,-2135413526,766633985,-1959985688,-1195155995,-1528299248,753985837,-2081649835,602417388,-327250667,-1928073752,317249662,354019328,2123233163,591259884,-1962654325,113466853,2005608019,1602954758,76424708,54493222,313531765,1967348456,-1983892714,1166541893,537049096,-402614086,-2014777305,638643192,-402503797,-2001196634,759031808,-1892908312,38113029,17188294,218580422,252200390,607686,-326412861,-399971197,2123175078,327346412,108497702,73370406,637832742]},{"sector":8,"length":512,"data":[1963147136,-401428452,360006391,-857189626,-1207477257,-1715847164,-272242688,-336058904,2013210135,739239938,1478968808,-1205256728,-722993012,739895340,-1961599256,-443874235,-1957313699,686588908,-1928050200,334031998,340453395,-388465011,1441272660,339339516,-399780632,-2001197302,748546048,-970202392,-973011387,-972224699,-972093371,-402650811,-141880442,-387154291,1166746171,1575324420,-326412861,-399971197,2123174906,316074220,-1928070168,99145854,-66656237,-1928074520,-2098664322,649652267,-388465011,-1343739015,9222182,-399752472,-443864178,-1957313699,351044588,331147344,-387154291,-337112442,330688547,-386906485,-396874926,1743268891,1575324459,-326412861,-398660477,2123174806,316008684,-1928095768,820566142,328132626,-389775731,-1863839080,642509051,-1961657624,401141830,-599356629,-1003810328,-1960388514,-397934009,1183524918,721479880,-402632520,333982663,1575324459,-326412861,-398660477,2123174722,300280044,-1928117272,1307105406,-79304686,-400162584,2123174708,306112708,-386189592,552084977,-263812333,-1960133144,-1209476026,-934900950,-1205161496,2028470356,717547563,-1017256565,-2081649835,-202878740,-327250670,638719976,205260682,116867700,8416734,-1360519820,510715933,-1193771379,-2031615977,-998339321,-385876040,-1934096515,-399250559,115875258,-662794972,-402648648,2123171689,-18236,-1207475992,384500196,-386217752,2123179377,-390057000,1187448653]}]],[[{"sector":1,"length":512,"data":[-1207959352,-397409916,2123174548,288221360,-1961720088,602468422,-599356630,-1960174104,401131590,-1270445270,-1003875864,-1960398754,-397934009,-396875978,468200143,1575324458,-326412861,-398660477,2123174474,294250732,-1928180760,-253175682,300869873,1006733498,-1173064692,171737488,-390460044,1946893313,6797318,1353995497,304277586,-389775731,350752971,-327250670,-1960203032,-1410807738,1961383977,700049450,1946958936,1946893342,105235981,122013189,292743170,1170611435,1170604294,1894253575,-972035311,-973011387,-972224699,-402650811,1170608490,1988955912,448587992,-2013675288,535423223,-1962654325,1438866917,-326898549,296282152,-387154291,-1410854724,611313913,-1928223768,1021892734,295036944,-386906485,1183525170,690809052,651714244,1208108939,-1205448216,-387448428,691333161,-1017256565,-2081649835,-397404948,2123174242,279046380,-401514776,-396875527,921184711,688973841,-1017256565,-2081649835,1072179436,-327250671,-401617688,2123174208,276162776,-1961807128,-806817722,-599356632,-1205286424,1589903652,1065363180,-1207733244,-2065170156,684779561,-1017256565,-2081649835,-1557268,-327250672,638553320,1963278208,284878923,-388465011,2123173748,283109572,-102233227,-117774321,-349983512,1200301578,631826434,-399996184,1183518927,678226160,-388217205,1183524966,677439688,-402543432,-1763170009,678488080,-1017256565,-385859656,-1957317927,686588908,278456400,-387154291]},{"sector":2,"length":512,"data":[2123173669,71682008,-2144993280,829687103,75465510,-401378048,-2135420811,-400788224,-1914171508,591390968,-1960437781,-1960442809,-1910110625,651725575,-402503797,283649326,274065448,-386906485,1183524850,669837532,-329333672,71270438,-268106892,682223871,-401598232,-443865102,-1957313699,351044588,270592080,-387154291,-2144989523,393545023,-1961879832,-1276579770,2095601703,267118632,-1960327704,-1195155995,787021887,-326412878,-401281917,2123173870,243001580,71270438,-454551179,-263812337,-1205370392,1223164268,263710760,-1960341016,-1195155995,-85393345,-326412879,-401281917,2123173818,239593708,-1961904408,1407774790,19970087,653024964,1946435456,18921475,-400027928,1474826109,1575324455,-326412861,-399971197,2123173766,236185836,71270438,-2115490187,-662794993,-401699864,1055455125,258861090,-386906485,1183524618,654633180,-402565960,988293067,655681551,-1017256565,-385859656,-1957318275,351044588,-1928380952,-890704770,255453197,-386906485,884483798,664659969,-401666840,-443865370,-1957313699,686588908,-1928391192,-1561793410,253159437,-388465011,149425739,-263812337,-1960401432,-1612129210,20494374,-400070936,-1343746347,1575324454,-326412861,1347480707,-1928405528,1793649790,1065362957,644117764,294787,-773300875,-662794994,-401781784,2123173576,231925956,-386477080,2123178373,245885104,834146676,648800448,-397389640,1491609253,-402396378,-1729622705]},{"sector":3,"length":512,"data":[-263812338,-1960430104,803789894,-934900954,-1960433176,602453062,-320317402,240904230,-1960430104,-1195155995,-1628897217,-326412880,12643457,-939637111,64582,-12548409,1172832256,-385649650,2123170074,-500766488,-2144985660,108266559,88047654,1810376309,71666462,-2144985660,108266559,-369342839,1317732583,15776510,-385729560,2123170050,-504174360,-954525464,50246,-1977213500,1963539463,440264724,-1927400984,-1070345090,-1207785240,-1880555304,1946827776,1963670532,-569968830,1946189933,413919261,-1927713304,397988990,42199040,-1195344243,2062090239,-2133542910,-1209507093,520349720,-1194033523,1726480401,-1065448190,-385876040,-591920547,1011215105,-401378036,1793652161,-729903840,1189658675,14465026,222047979,1458049141,-729903840,854114355,14727170,238820075,1122504821,-729903840,518570035,14989314,1085802219,-1349261056,-330921136,-1960509976,-135735226,-1002009820,1478816232,-400180504,-1634917114,-1628897472,221505572,501810037,221636863,-1157871989,-236453632,1084132620,614852863,-385988981,-18340465,618194956,-1017256565,-2115204267,-1996444436,1187511878,-956301060,16733318,216983552,-169278604,-394359552,-991124760,1065362973,637957124,1963278208,487909414,-1006353013,1065362973,-1996065788,-1024852922,-28407040,-402584390,-571932444,-394359552,-387158296,154930284,-404218763,609216540,-1960436284,-397934009,-122150534,621930496,-383492632,2123169926]},{"sector":4,"length":512,"data":[1963605204,-1643788527,105235968,122013189,-2131445758,188501483,96932213,1170604194,1170604294,-524811257,1010363137,-954895092,-973019643,-973011387,-972224699,-1207957179,535494908,359992892,18220487,17188294,34031046,607686,-352255816,4241414,-391223063,-387439453,1849205027,-972929655,-1928394683,401139830,-199497707,1156118407,71666458,-11231603,-400331544,58002433,-385924375,1183517699,47868,-1928609816,-385919842,1183523699,610134270,-401879832,-443866202,-1957313699,-1662221844,-28931840,-2114169207,1946223865,-386301578,644903936,294787,-1960416908,-1960442809,-1960442273,-129595105,-939893111,16737414,196012032,-387678579,1580927528,-1941277192,-95011902,854082421,-62485725,-400294168,-1634917558,-488046748,192407586,2095634036,-28931317,-1927079448,-385915746,-2085084433,594274500,1441268912,188999715,-1960632856,-1195155995,-2031550401,1751213,1353548009,-1326967888,158685241,-401975320,183104335,537716766,-1004343575,644761118,-1007214709,125140992,1847723766,-148998784,1967128771,570881543,292896878,1073734529,775541736,1636665227,-1951924434,8763489,1068314857,-1946156952,-1946076054,-1946075030,-1946074006,-671004566,-671000470,2130795626,-1895825308,1056964706,-1090518941,-1083958429,795092323,1610612836,1761607780,637534308,2046820453,2046885733,-1728053147,-1721600155,-1721599131,-1721598107,-513637531,822083685,828530535,828528487]},{"sector":5,"length":512,"data":[828531559,828532583,828535655,828533607,1835167591,1835159399,1533170535,1533183848,1096977256,1342177385,-1828716439,-402653079,1577058409,822133866,-681419929,587202663,1157628010,-1224687510,-1040187292,-100663196,-1442840476,2046820455,1811939941,1677721702,1744949376,1812059264,1677847680,1879175297,1946285184,2013395072,-2147353472,-2080243584,2080507008,-1946023808,-1946151736,-1946153256,-1996481840,-1744824096,-1670839808,-395764480,1256720722,639484951,1963736960,108888158,-1337691134,124094981,-389048600,1173756810,494209031,-1339985688,498919424,-390067784,2042110409,566487042,-388433992,1894326717,559147041,-1612185424,2406429,-400418072,1170612575,-2084368632,2030046333,868233997,172305362,-385067749,650317684,1963605888,108888096,-401247230,266867789,555214869,-1206215960,1927864629,556132641,2131977600,-569968701,1962967149,553380062,-1008205648,-427771878,-1339992856,557770879,-400489751,-2144991070,1031081023,1703544240,-823007225,-166009368,1963460421,550234134,401080496,-386418659,-400481048,1300242647,-389872632,11542709,-1206058520,2095579176,549578785,252200390,-569968701,1946189933,331868190,-401307160,350757009,-1070221286,-400495384,985143819,551807177,-400517399,1994920914,-402608096,-659023298,557705217,1344307945,-402124824,-2141317607,1946289789,542632000,-1545076560,122025500,-166038264,1963198277,1149971978,547612673,773871337,-402439030]},{"sector":6,"length":512,"data":[1290346632,1149972000,546301956,105155374,773884136,-402111349,887693441,76164640,1157863832,206902026,17716201,88129790,-763166719,-922812672,77128,-402597245,-1427634263,122013205,108888064,-401181694,11542501,-1206111768,1055451344,535947296,-823561552,174424848,207979265,131066112,-402165784,-1142356089,124774407,-1341686040,432334850,-949077855,-1996417531,-389873083,-504887294,1065363163,-400132850,-1570821,449046767,-1205890840,1558708584,530704416,17188294,34031046,252200390,607686,6994115,-391510807,820512545,-385699833,384309622,119924743,-2146102040,1946289789,-402214881,1170610530,2105541127,74776582,-1022736897,-1205911320,-1628905336,525461791,839599498,-372100124,-555217548,350218246,33979776,112203380,-401003032,11542297,-1206163992,1927857286,522578207,-2046147189,-372100156,-1957360312,351044588,1460098536,-387154291,-1494743448,-278468588,122611807,-402236440,1508381849,121497839,-2131986803,1963067005,108822542,-1962380030,1166608964,-401806580,-655877427,138709534,-972536568,-401799355,-443873662,-397360291,-1863842042,-397321753,15262680,37509127,112199796,-384260632,1609107086,-152007930,1080959494,-1959912331,518252548,-971073816,-973011387,-972683451,-973010875,-385873595,1793590886,71682022,1170604032,1170604550,516161544,53347476,-1960443300,-388877561,1139346576,111208454,-1607295256,1362914874,1128029812]},{"sector":7,"length":512,"data":[691821172,1088968308,639485158,1963147136,2139301458,1265893388,273124134,-167099135,1080959494,250094709,948681246,-1206050584,1726481803,505014302,17188294,101139910,17321344,607686,-286774037,173917413,-1910535386,644748294,199952267,-1058019241,643817355,855787403,72714706,33965510,-402107000,552078344,96004358,-402254360,1048588819,1951493690,-440539089,-1763172924,1200301568,172294416,1847723766,-401705664,1170611605,11535879,-350626328,-443815887,638213572,1441466251,-1064048553,-396370037,116785253,1967156770,-1196403920,1528675304,-1960394612,12127839,-388877360,-1934090655,498591962,-971150616,-973011387,-2146629819,-972748723,-352319163,-448796632,241142566,270402342,126559744,1962934077,337021742,71681902,1170604032,1170604550,1575485448,91613195,637854185,1963147136,2139301384,24379404,9681091,-1196977943,-1964441461,-1343729497,116874756,8416734,-13758092,260302900,-401600280,-622325550,772991772,-402492161,669519810,483125264,-1813512016,-1796712426,484042781,252200390,1944604867,309061636,108888158,-400722686,-1070395575,1649409665,-1925185164,-1729623459,-1962439872,-639106473,76343562,-956326936,-973011387,-972224699,-385873595,1170670714,-973078524,-972945851,-972945595,-956299195,-1036711355,1745634759,239453985,1170725538,-943124720,1073746501,-402376727,729089184,-402407448,-1108867929,393210092,-1206108952,149422452]},{"sector":8,"length":512,"data":[474867741,17188294,101139910,252200390,607686,-150725143,-2140283386,-1206356736,-454557172,472508444,17188294,67585478,252200390,-1207700759,-857177736,470935580,84297158,34031046,252200390,-402403351,-396950462,-544489735,1065363039,-402230008,887746349,2209796,-1767481111,1847723766,773616960,-1863842677,467003420,17188294,218580422,252200390,607686,-402414103,-1959861335,333972084,71681792,1170604032,1170604550,-706215928,59304201,1053105751,1166765586,508922652,259375115,1965049131,1959922449,12747054,722660112,41099333,-1320107981,65590020,254105808,441789184,1160449394,84701976,-360513520,855929601,-976079936,99294333,-947661057,1979648776,-754667017,-2083877950,-494669599,532744975,1426309983,39136006,1023689987,74579984,1107300397,74646827,1241518085,106793923,990010667,-1961266470,220922957,-1048378253,-633648368,141690487,74631227,-745815669,54585539,-402509848,-1595407553,264431874,-2081649835,736629996,40757251,53405783,-387154291,552075875,-1159176445,-263812326,-1206208024,-2132279232,449177627,17188294,84362694,252200390,607686,-1962764824,1438866917,-326898549,48818216,1459759848,-1929188376,-169284482,-353507327,-401233688,2123170524,31910104,-387260696,-924314215,12082946,392423425,-1961206552,1541992518,-599356646,-1206233624,484966456,442624027,252200390,-1017256565,-2081649835,-1813506836]}]],[[{"sector":1,"length":512,"data":[25356290,-401672472,544539269,-327250601,1593951976,-1961221912,535359558,3979290,-400890136,1170610731,-605352184,-1962775832,-389849627,1894252981,355199210,-402587464,-219670791,24950809,-400900376,1170610691,-1092022520,447866881,-971376920,-973011387,-972748987,-972093371,-385873595,116785606,1967156770,-2234360,17319366,-507778877,1846681284,877103910,71681945,1170604032,1170604550,-437780472,26798343,32172112,-1070396812,-402652998,434831796,637565160,1946500992,1211979786,-1205373695,-397409952,1927807447,1088968729,28305434,-971406616,-973011387,-973076667,-972093371,-385873595,1069023581,-1545344768,27846736,637548776,1963212672,27387939,1478049000,-400946456,1290273145,105235993,122013185,138790413,155567631,18671872,-385859656,686334893,296282337,-389866044,-2144927756,108266559,88047654,-1195179659,-1897332659,-2168669,155156518,-1195179659,2129199170,-3217245,205488166,-2094659467,1963065983,1656275713,-1553471232,-991894808,1065362973,-1023314680,-385859144,-35085483,1065363156,-1023314680,-385855816,-303520955,231860436,-1005711128,1065362973,-1023314679,-385858632,-706174163,1065363156,-1023315444,-385865800,-974609635,1065363156,-1023314676,-385866056,-1243045107,639485140,205260682,188483700,171705460,-1195179659,-219611057,-5576542,-385026328,-1343745814,-4790272,-402608407,-1108868954,10873343,-402612760,-1662386236,108888064]},{"sector":2,"length":512,"data":[-2147191552,-1015019187,-949077855,-1996456443,-1581055419,96955960,1166606470,950125314,-1643788434,38111488,1849205187,10618311,-1023261303,-949077855,-1996429819,-1581055419,96955960,1166606590,499434242,1007127078,-150309621,-2140283386,-1342016512,-1072970998,-1078978955,-1592253464,-617386440,-393215815,515381453,405006679,-149437975,23977478,-1207536640,-2132213560,229688088,-1339133207,778955026,-1561784912,-384913362,313536157,-1574004503,1189647682,217311245,1055455111,216786957,499447687,-1006138842,121251356,646581877,205362498,1024422928,1081409550,-2029221144,210102519,2105603975,410321414,33979520,-286780811,175892489,-420939897,175368201,418117511,1843267319,-428539776,-401988120,-142144886,-401990168,-142144894,-991541528,260711965,-754974280,1109297888,-771804523,-2021314845,460614973,-13444726,-472783919,33979776,2088765557,41222662,-13745341,-1200791641,2129199145,-2141290335,1867804,1048592,1048592,3145776,-2130739152,16646399,-2130804482,1835262,0,0,0,0,0,0,-1627389952,1399724653,2138167665,1148123758,695209839,1399859568,-512632463,1399970160,1399970161,-2140022415,177553982,-1662515853,-402396406,-142144827,-2029338392,1111392503,41226133,-253167737,374925326,-1790833014,1963981184,-1191737598,-109051732,-1204259840,-109051728,-1204784127,-109051724,-1205308414,-109051720,-2146929654]},{"sector":3,"length":512,"data":[57936889,-402604872,1156060927,138790422,-2139836401,194331198,1974469237,-402189079,753407719,138790422,1465303823,-1962249077,119409277,-1610608455,3970370,20723316,37501556,171720820,188486772,255594612,-142146955,-1358623827,-119404939,-1477246229,41222320,1048576432,1963693378,1593914370,118352222,-1425732691,283900642,600897453,-119362811,598542059,-85808379,-2134679969,9781822,1692933749,-386431222,-142144969,-401727768,1018697094,375252992,-971660568,-1022425019,33979520,1552615541,4161546,2105545076,527761926,-2146804341,393543743,-402247192,-1070396852,-1996012408,1149831748,73066508,-401249559,-142145045,-2029394200,231598327,-1206569496,216531012,357689366,252200390,-378193477,1448543778,-1962246773,119409268,-1790820736,-2029358080,895478007,820600670,-1979348474,1929642704,855617538,-398438172,1398289787,-1947389354,-1426355209,-213464438,-930455900,-213464534,1600019364,-1022730871,-2029490456,141158647,1117845383,1009825429,-1240173552,1930050584,1006679566,-1240960000,1946237984,-2146912766,1946486397,108822549,-166956027,1963067205,121959945,-402426878,1156972667,527696391,1375761128,-2029483544,142928119,-2028699160,235792631,-1043562408,-488097104,1377102612,-402100760,-1302719382,122948312,1307113351,-1594390765,272405826,171717236,45624946,288483328,1054718544,-401410072,1079512525,-400127302,-1632627980,-401304600,28316759,134759434]},{"sector":4,"length":512,"data":[968558661,86305141,134759562,1089013829,-269987308,-956933628,-2147257312,-1916598026,1284311645,-1790795766,175245884,108269628,-382226456,1760101663,-569968841,1946189933,119793677,518584199,-369654009,1117847302,1947221141,1930050587,1946172424,1963080708,142376975,-2146864128,1962936445,76867587,556160,-1092086155,-402608109,-142144122,-1340885784,226289665,736884615,-1494681721,-402608109,-142144146,-397192520,1353716733,-401348632,11539345,-1207084568,-639106983,1600043027,-1609308952,272405826,171709300,-927461518,339863553,-1156348184,1542026553,28883460,292814908,1006746810,-1173720063,37487040,-994442380,-389903615,1625887771,-569968877,1962950765,1111392352,125044885,-1790820736,-397249273,-142146219,-2029694744,321120503,-1928772214,1301088861,1111392268,74713237,-645463756,-1961655832,330492121,48822151,-386431213,1149899543,138741768,-1962254963,2112358980,207457555,-401849205,1149899636,155551753,79947971,-1092028537,-1963489532,1686767429,-1058674681,-1790820736,-1475841273,604271876,1342442497,-2029205016,-1008183049,-386431220,1048576826,1913296194,122025488,-402295544,1139474852,-352171288,122025534,-1341492216,245819397,-344751685,-2147110888,60113470,1048578420,1946457410,-402542590,2075856524,-1790795662,-523115470,-670834479,39291694,-13699193,-386431209,1149899375,138741768,1111392451,460458645,-1962261109,1143671893,206838538,-2147433855]},{"sector":5,"length":512,"data":[-2147419519,-1073020299,-402437399,1860894723,1109297808,-771804523,-1208013085,1166766619,206932746,-1962259317,801311836,963785842,1064451186,1399998322,1685217138,57829746,-1009577023,-753155797,875162051,-399227415,-1047841726,-2084318325,108273633,-757997359,-2084308254,108273633,-657331503,600046306,-1009572927,-754204405,868299715,1166656467,206932234,-2000711448,-1547499707,-1556086670,-1220007822,-668403854,154728306,288946035,299946355,-1259810445,-1275060110,-1275066254,-2147471246,1963067005,175997707,-1979353855,298248646,-2146470423,1963067005,172329774,661962763,-784217805,1241215976,460701707,-1173729911,971759825,34031094,834144372,296216786,-1716517397,-2146332696,1963067005,28332551,1510834664,34031094,-427818124,272361719,67652992,-3348285,1776915120,108888081,-2096401150,1963002493,-373126395,-1336798871,223406081,-385741736,2105545053,326434822,33979520,-353890955,172264208,1692940466,-1339299057,217507841,33979520,2088966005,292880394,-155186760,1963198277,-1073170429,-351197976,-1292400887,247261240,1069283207,122025589,-1157401598,-1679198919,7579905,678668560,343130136,410238976,410241536,544456704,477347840,544450816,141797632,812886272,2145931776,178190,1510813928,91551242,-1729505654,246212878,-402542510,-380105550,-202895057,-930498305,-1206863640,-1293297015,-1547685104,1168348483,108822677,-1956219646,1141574212,-1606912756]},{"sector":6,"length":512,"data":[171742530,188482676,2105552245,477429766,-2146425624,-1325987995,225372160,34227587,-402650950,1300237846,1407910152,-1206908696,1726533641,-2142704880,1962935933,267905056,34227587,-1307818869,242083896,-2097134616,-1962800531,951192132,-351379736,-402280414,-142144528,-402652488,951192713,-401738008,-21495776,209447167,-1075300174,-1141405939,-1477937863,-1790729984,-1593162359,1166644549,512410380,-13462206,-1959861295,175412359,1342731456,-392870981,-1973940222,1958742724,-1790592250,-1022364183,7697664,2138864767,2138864767,1016414880,1007973130,1007711232,1007449090,1007186951,1006924808,-2145094391,1946289788,108888094,-2145815550,1946159228,142442514,-2146601984,1947142268,142442502,-1023314929,-1962931527,-1996126460,46629636,-503134589,351241202,-1609240957,272405826,205261172,914359666,-1023306430,747979424,-958976502,-972880315,-2013264059,-1070397115,-1995815543,-152499131,2004186358,1953919858,2105311093,512401278,-13462206,-472783919,1966195585,-6422096,-350849821,-351111918,-351373554,-351636982,-351898874,-1342015998,-963012608,-1996486843,1435044421,-156243700,-1977213756,1946762247,1946827793,1946893328,1946369042,1946696724,-1326857443,19392515,-402541335,-672595598,-1933341951,639485122,1946369920,-1960393941,-1960442809,-1910110625,651725575,1963147136,-993883101,1065362973,639202568,637816715,637951883,-645199986,1962937064,-1994603513,38112285,1065363139]},{"sector":7,"length":512,"data":[991655171,-1945733672,1959410625,1334519313,1602954760,638051082,-645199986,-2134645269,1963132541,235923513,-1928772214,2078804573,207457550,-1206998040,1592262832,49002510,-1928439576,-1712846243,28358670,-401715992,1170607615,1300234502,1170604296,-2134704119,1946355325,231729217,425344,-2135290507,215738424,300466226,-2145850610,1946224253,-1968132084,317196901,139296782,-1073170431,-401733400,1170607547,1170604806,-1070369527,-1995815543,-389870523,11537805,-1207313944,1173749761,158598151,122025536,1073902600,172877888,411078,302597574,-1341504119,168093696,-1005749527,1065362973,-2142735092,1963067005,173903112,-349095704,108888115,-166365952,1963460421,122025495,-1173785596,1173749983,192152071,1005063600,-6821881,-402596934,31984929,221636620,84297158,34031046,-1007355927,-2144985660,913640511,33979776,1569524597,820504586,-349090072,-401756130,-286783742,-402608116,-860354246,230025217,-972227864,-973011387,-972093371,-385611963,-993790781,1065362973,-400526069,11537605,-1207530008,-1930919504,215083021,84297158,34031046,252200390,-1007382551,-2144985660,745867839,33979776,1569523829,820635658,-2081941525,210495488,-394152776,-1662513833,105235980,138790401,122013199,-194647804,108888259,-1923058430,1200294493,2147427592,20784756,1026519612,712459262,134154231,-2126699403,1025012287,326582398,98179,2139295093,125108227,79233200]},{"sector":8,"length":512,"data":[-1341330688,571652,45090283,-2013263175,-397342907,-396873536,1170607498,1170604038,1435075593,207456522,-1022474871,84311424,-1863835020,201320703,-167716422,1946289989,170440194,-773322923,201713674,84297158,34031046,-2134887485,1963067005,173902633,855642297,1125583826,200991299,-1206422062,-957874144,10532872,-401830168,1170607059,-1195176184,2105540640,477430278,2144336,-401973877,1170607374,1170604038,1435075593,207456522,1477330313,425344,499394165,38222630,333979252,2144260,-402096920,499387253,-1207393560,1021837400,193062924,252200390,16824515,33979776,1569398389,839354890,-397393692,1170607290,1170604038,1435075593,207456522,1477330313,16824515,84311424,-397403276,-1075249205,719869955,186902536,-402641736,887622639,138790411,2105590543,779354118,33979776,1569394549,839354890,-388877340,-135661244,184019186,-402169928,149424981,105235979,155567616,172345128,1170604032,-672595449,639485170,1963868032,108888121,-1206422270,1088946178,-1979600853,126421605,-972399223,-385874107,-488050031,16824325,-402149144,1220020905,192276480,-972375320,-384890811,-389811595,561315876,52750416,-402587464,-2031614067,-1209509878,5027847,-401912088,1170606739,1323896584,499434482,20938790,-1960435595,-1960442809,-1910110625,651725575,1963868032,639484941,1023559563,41353471,-154943429,1080959494,-2134703755,1962935933,105236217]}]],[[{"sector":1,"length":512,"data":[639484930,205260682,-1612183182,121997824,1006908905,-385649400,188481682,-1947726731,173903104,-382838808,171766260,2078805877,121997824,-401973875,-504811917,1963539697,173917205,839354918,-930397980,-399875352,1569259619,121422602,-219664267,-1194292474,1290272800,509040170,1975846686,-1963226358,854405838,-1968507968,-1314589750,717892128,531297230,1569283679,20759306,904403061,-1961658881,417874120,1125091370,1258297064,-385196663,-1984368275,-1809848064,-1960436284,1569522255,509040138,1975846686,-201618678,1583292324,639485123,-13492342,-13704239,-210058329,-210046086,-210050182,528151418,528194939,-142886789,528226427,528162683,-998563973,35698717,274172710,209683238,-2028636928,26536183,-1880557689,-1004506111,1095709,39291686,-142126512,-402545944,-142145270,105179224,165537880,-2146884887,1963067004,172264278,1963738123,122025518,-400002044,834144497,156231872,-1461190480,122025478,-2096270328,-1342043579,110749696,34237827,17321344,-402069783,1149962441,112388106,134694390,1166216820,1149960714,111339532,34237827,-2029467927,145221879,-402111350,-142146526,-2029478680,-390057225,-142146484,-402045814,-1528232658,-386431224,216595665,141879297,499447687,-1207588120,1156055132,143255817,33979520,1552619893,4161546,1592267125,13023752,839348456,145156288,-2029491479,-51779337,-402599192,-142145478,-1960436284,-397934009,817366382]},{"sector":2,"length":512,"data":[151382016,-2029499671,-64952073,-2029511192,416922359,34031094,951452276,-402172662,-1830287624,136964353,33979520,115875701,172264200,-2096762904,-1962800571,-437777340,172327685,239373058,-351937560,-386431160,11536357,-2029933080,142442743,-1207208960,921195346,-397365240,-890763232,142442503,-1341426688,135456856,-396731464,11536413,-2096793880,-1342043579,91088899,34227587,1692926640,174949125,129362180,-1960436284,20775495,1024160768,192151554,1946158141,1170653963,-960299001,-1023146171,201803206,583875,65599367,-1007188224,425344,1659375733,780295,1471415820,-385368856,-154990737,1947208005,948812296,-351903512,155579938,-166431712,1963002181,175997702,-1206881280,-1830238335,-1341789433,125495487,-1979278104,414189925,1963050230,-166678512,158663364,-990510928,-1342016248,2105590536,779420166,-1977213756,1569521991,-1779937270,180049963,1946303488,1007203080,-1291684608,-1957999868,-397211071,190514194,-369986085,2105542383,460652550,-1006156406,1194993180,638416129,-402501749,-68680003,114419971,-386225688,482608817,38243110,166259890,-477513723,-402193176,1018167331,-1207505944,482615129,21432870,41157288,-353878092,256006,-1207526679,-555139635,387078,-974533200,-569968890,1946189933,512630284,243494504,520159272,7649475,-393155351,65537621,107604224,425344,112789109,59042048,199753904,1397929984,-1341743896]},{"sector":3,"length":512,"data":[109504848,17202560,-930473868,-402587464,62390293,1042438,-402193736,1170604041,1170604294,180555528,-1979550519,56289476,425344,1166214517,-1950154230,1166609477,239438602,-1022605943,-1979232886,108888296,-1960282878,1435175493,80082444,-157808523,41157317,-973675470,-1727499000,1946338806,-1982713086,1435044421,860744460,-153996352,259261637,1963246070,-157765622,57934529,-152817480,326371525,1963508214,139296782,-157699580,57934529,-1949158982,1960446936,1347571991,-1341816600,30205952,845912,583768,1493535464,-1022923384,175423499,57992202,-385497879,-2134702672,1963067004,89385025,134694390,2088965237,242549002,818307,-21886859,-385594392,1149961555,-1259843062,1173772803,326371335,34227587,-1978907509,281706710,-2096914712,-385742227,-2024667857,84928759,-402111350,-142147446,-2029714200,-390057225,-142147404,-1966175654,-422573708,-422517040,-102175094,122025475,-2096008184,-1962800571,281706961,65464336,34237827,-402330903,65537229,81914112,425344,1173758581,578028551,134694390,1166216820,-4586998,63170608,34237827,-399441990,468386745,17202560,11535732,-167713304,1946683205,-397234171,1353712860,-972761112,-1023146427,134694390,27791989,78125172,44570996,145234548,-1595204748,108266920,208931496,11572971,-1342133783,10807554,-1612119632,-385634304,2105540762,1316291590,17188294,134694390,1488202613]},{"sector":4,"length":512,"data":[-2080374343,-1273531199,33864026,242532740,45701556,1958839297,-1185172475,1292370696,158173192,1642710154,375044,1488503172,-1190759334,1505231114,139266139,-385258104,-1329396647,714753,45152135,-2030028312,1149551607,-401574648,11535325,-2030032408,64219383,1355020167,1342719242,-957810809,1139300355,-386430977,11535293,-2030040600,1776834807,-1007187969,1173801098,913573895,425344,-994960267,-523181872,-259333936,-1342001944,-2132702580,-864025916,65792192,-706211605,178176,-1979696920,-402520895,95420616,-1041758741,-771641344,105236192,138741761,-1022800504,485017738,122025473,-2096139256,-1979577787,-402520895,1837302027,-2134703606,1962935933,172294404,108888259,292097,-1950152379,1166477893,172329228,-1579643965,-1020563986,1843267319,141824000,1946286979,-121597,-1955729757,191753246,990147803,-1560054845,-389845524,-1917124653,27453502,-396945736,1170604881,650315014,637683594,637816715,637951883,-645199986,73894438,-321780815,-1840957,11587723,-1342150680,51571024,-787854079,174949353,822065666,-503199512,2105590772,544538630,678756412,805914102,1166680693,37742601,1173791152,41223175,-571957072,33548546,17202560,1161433973,-1023314679,-523203918,-523181872,2112483466,122025473,201880836,174426800,-1962752791,-771028395,-1207170444,-1962760216,45345218,-536166220,-523181872,-536158000,-1561775696,1962949634,155579932]},{"sector":5,"length":512,"data":[-1978239696,-689436347,-157044735,1963198277,-391991294,-1763114380,-796347903,-790572832,-370111776,-930414304,-402602310,-1047854824,67585526,1659437940,38725890,33979776,-1031136395,67585526,84675444,-1962787864,1189677637,-1979446270,1055459941,46825474,-504760782,108888064,-1962314494,-897578427,-1876431934,-1241265536,13887760,33979776,-897576843,-1327330622,34596993,-385202805,-897580535,-384780797,-930414411,1975597976,-1327330804,32761987,-571883126,-1327330815,31975553,-487997045,-1966568703,-159337742,1946421061,-1736199663,175425595,2129166770,-373191936,1994916293,-373192192,-397409876,-2141652261,-829774614,-2146967168,158598905,91602955,-1561738613,-1731687679,225820987,-1958687104,26470594,2112471434,-2133950463,-2031566197,-373191935,1173750145,141824265,-2131059992,1055630570,-1325755672,22734908,1173782704,175440393,1173749936,41224201,-802013008,1173758187,57934855,-2147366272,1963001469,158665227,-1950298496,20703682,-402045558,1166671993,1964025865,114196505,913580200,-1476135296,-2094238459,1962936957,-373126385,-830471915,1948297222,100040707,-1744157301,1963607355,1087275022,-85409141,172329728,-2147425303,-1031044914,-167711512,1963264325,172329734,1359012073,-1961998965,1435176029,1342224650,67716598,12127349,155580112,-1190955712,1659408384,-1463592703,-1273793263,1963108406,-1473858552,-1274907384,-372995538,-2084372332,141835839,50464643]},{"sector":6,"length":512,"data":[-1022916321,283660371,803756032,4777984,34064219,38242560,-787510333,-2096335639,126550723,1370195,-1007361445,-2030040856,256247,868480903,71665600,276086795,-1202694394,-605552637,-1442795384,123710296,321731,-1023130231,728625825,1953418758,-1202256365,-1142423551,-1442664312,109561739,123694578,1958742979,1347880464,-402652232,313559202,1605064874,1460060935,178256,-1333227032,-1437029884,113444703,62410839,-2004817920,1487537840,-1022926933,1858999947,1460017031,571472,-1333237272,-1437029880,1605091979,395035399,58053131,516097929,1859133070,1468783243,1976699650,38242807,126599967,-1073019095,113443189,62410839,-2010060800,1487539376,-1960388469,-1993997753,-1073020289,123728501,-2147440189,-1259862412,2147427832,-392515504,-1587806352,12152376,114438960,854086487,-1194849536,-202899449,-1441746809,1487651211,-1413313621,113444703,384324439,-1194849536,-672661497,-1441877881,1487651211,-1413313621,-1899821217,862883846,-337955841,87762444,-1977206924,2039284317,-1908524285,1374582126,-1907351978,915089088,-964493304,76162563,-1958739788,132552,-395407685,1465419665,-203911509,1579114404,-1010332839,-1000974586,-1955680746,728652862,1926245335,-1946973426,-1494001720,1192391775,-1947043510,-1141666872,1525182126,-1527556217,1852350815,1853234827,371971979,1600024156,1460060935,-1949791402,1857469427,-209241880,123690660,112835,1857422981,1472397685]},{"sector":7,"length":512,"data":[-1144485114,518549174,-205507705,-1017182294,-397191418,-938737851,-1157625672,115896006,-1413379193,-1031034024,1857462699,1851655723,-1022926933,1848116983,242483456,-402652232,313558754,1845141930,28879680,-2032867328,-391506768,-1612185592,-370182912,857604297,-1949158455,-1955680706,-1905397194,-1402023906,-13444982,1772617518,-2054783098,-1937340282,-1400466298,-1148799866,-779696506,-1383672186,-336557226,-672440614,-739555514,-2096970109,-873790777,-1996260215,-695532204,113673132,1006880643,-2085063445,-1276443961,-2096642429,-1410661689,-964477815,-2086343934,-947714362,146899714,-964453909,80184070,-351747709,46564238,-1994421781,-1986704882,731204630,-1989235138,-1013626818,-1949748450,-1902818250,-345059298,22842138,1143670667,8469763,-2109928833,-972718849,1091239748,184906891,534935030,1438894347,-326898549,116858380,16805416,-90093196,-133813395,98619757,-1631911924,-2048923538,-143785823,7219206,855799042,512469952,1200319970,-1365136626,-196703890,1851524651,1845010859,-1409923447,728627873,1080948742,-125924949,-1577433460,-1363438264,-2053117842,1252087558,1857993621,-1987734296,1183644798,-1962450946,-1955701738,-1905397194,-1402023906,-13444982,-1582825682,-1115179129,-1014513529,-477641081,-142085497,797446791,-1383571064,-336557226,-672440614,-1512772700,1017958891,872772843,-1425820671,-1381307984,126605451,36554539,-964449536,-1531647228,-1948742739,1221012231,80118698]},{"sector":8,"length":512,"data":[-964450837,-1952388350,-1950209081,-993817393,-1515848578,2122951589,-1896248324,-1413467197,-947157525,-812924373,2126824332,-1515870724,-58816085,-1014040181,-1414807501,-1375770391,1311492235,-1993902346,-947128762,-1980479957,1460073598,1039695556,124911744,-2146646906,-1429961046,-213270478,-125924950,921241439,116858879,16805416,1183516276,1855890424,-1017256565,-1904424216,644769798,276223,-1557741517,-2085093372,-2049644414,1852315275,728614561,1025471682,57806848,1343225784,-754667182,868781024,102665152,494987374,-805087142,-1008149781,1745260165,110044782,-1494745084,1105773436,42461186,-1593813016,44264902,10283118,-1593491480,-1064407594,-402285848,-1591343700,-1073020924,-694030219,203328365,281248622,690405518,637544990,184550561,703690176,695075358,-1586625506,-660378154,255754349,57999421,-1585227032,-1365021242,-1070349459,-1586642269,-1064407594,238979878,378217984,-1070399472,3056422,-1993995541,1157834245,147292930,-227149253,3318054,2794278,1876262,2925350,-1325396219,32035588,644727302,184550561,-1011124800,-1107295557,283639824,1228288,-1996485912,-2089958370,678949115,1842782659,-1960394610,1418405436,638380802,52829577,275907165,990431107,653293050,184550561,-1008896576,-385863240,1307084033,205422593,57999421,-402551576,-1070398934,1842742926,3056422,1849165454,3056422,862836385,650153673,3817091,1360294912,1841706751]}]],[[{"sector":1,"length":512,"data":[-402652737,1172832631,-972648702,641816941,184550561,198866368,869365193,-1790008384,-946511709,479549958,50587648,-1550496095,-1511494142,66250755,-2096885528,9789502,-2034756236,-2077693822,-1941884744,309722,1845894795,857467368,-1788959808,-1788737849,1688403972,1443284885,-1593828203,-1064407594,1841706751,82378547,748758529,104539648,74645550,3055910,-1987954456,-392866786,401081339,1048782341,1962934318,90105861,-337113877,98494470,-402196504,-806877630,65988614,-402322968,110036313,-1591317050,-1073020924,-303519627,1614709510,57933973,-1903969816,644732422,-1560268127,1048604102,1946172686,-1789877999,-1789782389,1846025867,-394938136,-617405034,1846025863,-2139783448,4001086,484967284,255754272,57999421,-1585350935,-1365021242,-694041747,650153581,1318539,-1591857685,-661754410,538251,-1929132413,210371199,-213843787,-1592888154,-1073020924,-1205869451,2129199240,-1993990269,652184327,1449531,-1591292811,-1073020924,-1581008011,-1064407594,283705139,113714688,48,303398,-361381877,378218179,-771030992,-1477942924,651725684,83892897,-266010609,198325247,638612735,1838731,637553640,1969803,1392526312,1534393576,-2105612282,-1938503960,-16054333,-1993992075,637547038,-402645855,-1993998288,637547550,-402645343,-1993998300,637548062,-402644831,-1993998312,-1962919906,-378674626,-1048349406,-253656305,-763117309,252035840,-754667264]},{"sector":2,"length":512,"data":[-1009253400,-1905404255,650130368,637549219,637549731,1207975587,238979878,378217984,82509844,113738667,-126485957,303398,-747257845,1852311182,205425446,1032529408,238945062,100607488,973537062,109888256,-1591306906,-1960443850,637537854,1054347,637543656,3933697,3711270,272534310,378217984,250085394,100738560,-2094661570,14910,-1547449227,-1070361240,552334899,4031270,-14281867,251602437,1448214586,283641431,1583286016,1963140698,147292932,-596248005,1435182787,-338296060,1745260141,210445973,41716518,-1788475762,-478029429,52826111,637539358,-1040775282,24387584,12711744,-148933504,1947205825,12711738,638350656,1195523,17155878,640215808,1064451,-1040772117,141901824,205390630,1032529408,238945062,1032005120,638088703,-14285313,-2097137146,-231012154,-1581019275,-1064407594,647319201,855648931,1049306816,-1960443890,-352317418,1032005136,638022911,52823433,-947715515,1979333384,512435948,-2094661572,11838,-1557777548,251985966,-754667264,130253800,-338492495,104579843,58103136,647323811,637537953,788011,-338569077,-1023153199,855646213,748889819,984320,-388823887,-1790048767,1042154278,-773598976,1511916003,-2095484267,-258647490,-1591340425,-1073020924,1709769588,-1790008833,-1016216925,-385848392,45842673,1097216,-1996483352,-1097507810,182976530,-1004631808,-251952275,-1581044105,-1064407594,641501990]},{"sector":3,"length":512,"data":[-352168821,1032005138,638153983,52829577,275907165,990431107,652899834,184550561,-1009289792,-385863240,110002337,-1960415688,637538366,312673675,1841602926,-1325396219,65590020,-1553071610,-1581027836,1927845210,1478396286,-1789091435,-1988204312,-1955720162,-1083300810,-118984922,-2105362411,-395368774,649729662,1906567279,-1586624349,252024154,-1039104,512479795,518614536,916530802,512435712,-1960443854,637537854,1054347,-1591340053,-1960443848,637547550,1064587,303467302,1711705088,-1788304491,-1788076407,-164373709,-1960433685,-49915,1856181364,1780386197,1448235925,367527511,1583286016,52845402,52822621,-947714955,1979333384,643154901,50621835,11004398,-1788344690,647081254,-1389980755,-1834146158,-1788475762,-410912373,52826111,637539390,-1040775794,578060288,1073791479,52825717,637538846,512427779,1223388674,270402342,117646848,1845632651,-1040762133,661995520,775848742,326369280,805356023,-1014297228,-338564143,537248515,638905088,794115,38208294,639601446,925187,637993766,2760331,-1788199228,-1040713213,242552832,536920567,369299317,-1037331090,-139769784,1948254401,1001100034,-385649419,-1017249966,3318054,-1789649269,238979878,378217984,317390864,3449126,1846812299,272534310,378217984,-164429806,-2094652437,376766269,102651734,38636326,-1908569306,-389837096,520557737,52846175,-947715467,1979333384,-1591295015]},{"sector":4,"length":512,"data":[-1960443850,637544990,933515,269912870,638774016,-1962919775,644743710,1064587,303467302,-1788304640,418117171,-12745946,1448217460,283641431,1583286016,1963140698,147292932,-462030277,227223235,72715046,1049351683,636196182,-1788344690,325414,639071264,50742411,83306177,41160704,109985856,-1951689384,-964449341,1978809096,1446939095,-1591295083,1755512886,870003605,1049306870,-1960443890,-352317418,1032005144,1376482559,-402237610,1594294288,52845150,-947714955,1979333384,-1960393756,1435182605,-1948908796,-1910313989,647325702,536872183,-1960438668,-1056766396,325414,1073902608,1409715776,-964449387,1978809096,-1008759846,1580662558,1681325973,1647771541,109971093,857707860,1070446847,-1413467221,-1420252328,-1426051423,-788513631,245476320,201730816,-773271296,-1420252184,855640249,-1951665216,-1207956426,-1381285939,-2085758837,225771515,925187,-75292789,50492671,-1413248040,1001046066,1962937910,520560346,3055910,-1788738047,-1788602749,1017193984,31510784,-2087362042,9790486,2793766,-1013621085,-1789651317,739150630,136219392,345500014,378257459,-1960405676,-1962922482,-378665442,-1070394210,-1789651317,1007586086,-1948135168,-378665442,1053037706,-617386478,-1591768794,-1993960098,-1788829435,38111526,244040332,512464220,1323855368,338880532,-1986703197,-1902816746,647321606,1735,1520523853,984469,-388823887,566054,1845626371]},{"sector":5,"length":512,"data":[-1789124981,-1324366973,65786628,634948547,78708767,-1557733165,-1014824958,-754601697,512304875,1520500740,1846677,-388896559,434982,93674657,78708751,100919507,512454146,-1014796758,-754667249,69075947,1612579694,-1579668587,-1023185364,-4717709,178464511,1848549632,57918211,654311352,-1593832285,-1557762556,715194382,279127662,113714688,1835032,302434086,-1912602624,644769798,802443,38112038,641567526,933379,-1912274138,647321606,637539491,1443527,-953810944,6662,-1950184448,-1953146354,-378664930,109974365,-13406568,1855340091,-1977209228,130515717,443876668,1859567191,-15629336,-395458506,1609039901,-939094272,109993837,-1977192808,1088696837,-856950781,1859566275,-1199850263,-692452096,299690094,-395389254,1956867350,-388461675,-771026196,-264428171,-1558153217,-1259825808,1914603897,-1950338155,1880001491,1948158869,1836902549,-1787552117,-1200803095,-1242890195,2023931955,-1787190635,-1567262046,2124584315,-1786797419,-946500446,-1500154362,1852350825,1358031080,-1556086771,223909244,-2136768512,-1896467563,999649798,1939173430,-1465113050,740324609,1008497280,-1978108126,654258904,1220936621,781550755,-1817602049,-1786497397,-1194005690,1290338351,-493624577,-493624685,-845946221,-493548141,-493580653,-476847469,-493598573,-493452141,848691859,2067693718,57933973,-2137891352,9797438,-1075313804,-20752238,647329798,1963211948,2015791696]},{"sector":6,"length":512,"data":[1015096981,209014595,41713958,74794308,-1787156856,1128038694,638350675,1157790849,-2012973753,647330342,1094990977,-2128212875,1096024700,646448245,-2128177794,1968391228,2088838668,1967604994,2116454404,65286805,-2076820496,-1013157227,-1787230466,-1951586746,-1968429360,982874406,1972730374,2066122770,-1144878187,-1360499026,1913032312,974187413,1972731398,2133231626,1477837205,1175024238,-2076820666,-1010732395,-385863240,-1406730649,1702215690,104508454,1567987067,637718760,1347815085,1946344424,94431265,1362907509,-1960424075,2106271285,93201922,54296614,-1108853387,89712642,2145911787,1009808645,640447827,1946682870,2106271270,1879477761,1853268334,1074104102,643306869,1577207177,909854215,-1535994492,3389635,-1191315735,1049296947,110007686,-1595304590,39839865,1843942918,-399281150,544539767,477450556,641043238,637697419,-2144991858,208995132,-402501656,74777834,1534350140,-1962920776,-1902803394,-376081914,-1981253277,-396528896,-394984385,1064588092,-529182148,268826150,-1960440460,-1960443043,-1910111875,653126407,52692362,1015021753,-1190693888,20758528,1460058741,-1024933748,185032687,1569400513,1435182595,638970625,1963066870,-1940453729,-274208576,-1960442017,-768409251,-1787412853,1873215361,92871284,-1996333687,109249621,1577489782,909854215,57906564,-1006682391,-385862216,1048640799,1963356022,1093975578,2009007902,-1176597649,-1494024186,2005732212]},{"sector":7,"length":512,"data":[2097053960,-102009535,-796152381,-1946157128,113689560,637572492,2064005804,639792533,-1786600531,1851539083,244054019,-836004476,109970974,-216043856,520560292,-1785985338,113689345,637572492,2064005804,638875029,-1786600531,1851539083,132708355,-2076820736,-1007193451,1448127782,-1072976602,-397407628,1213792242,317454453,-930436058,102690098,1857029774,514126623,-695525625,1967675486,-1007514667,-1785971072,645100544,618695340,1020408828,-1172999036,-1002696704,12193396,1959279648,805353991,1383451708,-14308314,-2113535229,653822869,-154629460,1047890369,1967178230,179054087,1174501824,-466441178,108642314,-527794396,-661935066,-1040793549,637695236,52320173,-1905370050,57585694,-1839259899,989859304,1922401334,951632782,-68032256,1963114998,2065578528,185234837,-1953137658,-345082338,2132687401,189429141,-1953136634,-345078242,-1948004071,65262027,-1601762343,-1533607063,-1566602391,-49815,1398217332,571472,-395395397,-1420266039,-1031034024,-1901373269,-1013616122,1547567902,-1340174738,521505134,3717315,-1980004631,647333430,-2009691732,65286805,-1976137232,106414997,-919348429,-1786112373,-1786233205,-1787689330,494205499,1191545382,359940156,108159292,41384508,-2008866772,-26249593,-339213624,-2000092449,-2005961186,-1989262322,999655486,-1017182214,-523122549,-402652667,-1047825091,-1411329720,-1410088909,7071939,-385874968,-397409432,1968702050,309254]},{"sector":8,"length":512,"data":[1349957097,1870007946,88146101,-1056767997,-394982168,512360481,589721156,39357724,638028582,-544522359,-1430244437,-210798914,-212379228,-1899798614,-1955698682,191757366,-1961986570,191757878,638285302,669323,1955276483,-1960393980,-2134702732,24001086,-1195179659,1659437058,1870052982,-2010805722,843466532,92939995,108159292,41384508,76029996,-922859961,-855713790,-620566667,1849958024,977174723,997523822,1847723766,1446737216,16377943,1497116277,-1377298315,-401494014,-1561853307,93202175,171871014,28436480,983700085,1243515246,1178503534,1208388718,-1017225362,-385875016,1465284077,1946273000,12183586,-694084236,650153581,2506379,1946255080,77669902,1975520000,243948,-394935063,1497104495,-2098720139,642872576,2506379,1963023080,5892324,594891068,641043238,637697419,-2144991858,812974908,1962958056,16050219,501793653,1968389122,1007348511,639202643,1964115446,4188179,-1960440203,417858941,-392006399,-471138281,-1953132383,-1989287394,32434183,-1567256672,1583312442,-1785748797,1850351241,1850097289,1850214028,1851137675,-1785717111,-2147365911,292436542,-1041758603,-21239551,-264860733,-1005589651,-2081945484,-1956088832,-1955705802,914951284,-167023028,110029173,915107432,518745600,56396326,1888288951,1139299844,1031036416,1852311182,268760614,-1960441739,-167050380,-1960386955,637536310,-1224516470,74484992,637832742,671371]}]],[[{"sector":1,"length":512,"data":[7465046,-1911655330,644769798,184972427,1323070966,-1007275069,92048166,5630038,638088286,1963984118,-1007285501,57969446,1850619529,1850738316,75270950,3532886,639136862,1963146368,1552623122,1960512266,1955276297,126756360,-1018437909,1852311182,1845245579,-931793397,1845376651,-1468664309,171871014,1142852096,488842862,39422758,477420299,-1972406600,-1234209258,2139963904,-1947170045,1957098442,529212937,-294266101,-1977171125,-1144847801,-694063242,-1239971219,-1064418816,138316582,63406848,-208942453,175417075,303398,-428490741,1504756552,136219430,-1976646912,1139618319,840403502,983581686,121253486,-637336204,-1018562590,1013856928,1007121412,839087107,1592509376,973486736,-1023314834,26236139,505630466,606414628,842414386,792282167,341067593,307630933,240651607,442107737,257627738,291311708,912201566,982862712,1970158086,-1877218557,-1181025349,-1959919592,1958885911,-498908410,-1979336971,-370920762,1397781357,1465274961,570881542,125124718,1843543691,-395993624,914948771,76246614,578076682,645017660,360069436,477249852,141974076,309485884,846690876,-352293400,11528218,11539947,439095787,556534316,-13444982,-13706493,-1566850921,1049325114,898199010,1594343475,1532582494,95994712,1929111808,-1682269254,-1669751659,-1682269254,-1658479467,-1657430735,-1656906439,-1656382143,-1654809256,-1653760663,-1652187776,-1651401798,-1682268779]},{"sector":2,"length":512,"data":[-1650614887,-1682269192,862942911,1006930633,1008955952,1007580729,604664927,1916878047,2002402325,-109033967,1206023231,92848638,-402470658,243849195,-318607498,1849962120,245963967,753423879,41180926,-1950154320,126567390,74592316,-176801476,1007146984,1007580229,-2145225426,494153468,1948908672,1874246424,1913355496,10401798,-1996444951,-1200728522,1122566150,175761522,-1230828174,-1206482577,15120495,-1996452119,-1200728522,652804103,8435826,-1995962648,1131394590,76204339,578103100,168069702,1007776960,1174893863,658244746,126412917,-387235517,1851143817,-385873736,1581019633,-1975118987,122873860,-395001846,-2009058234,-348044537,1965243585,1364411924,1493830376,-1980992677,-1200728522,-1024917497,-434206351,-1239512211,-1206941585,1967718534,21465616,-1550195662,378105782,381185976,1843045121,-1553057631,45116892,-2146586429,58011388,1178996656,1175367875,1174778051,1174646979,1175630019,1174712515,-2145931069,158609148,-58715728,-1341950679,-1018804720,1181629600,-2146193213,58015228,1178998448,1175761091,-2146914109,158613244,-58717520,-1341950659,-1018804724,1181630112,-2146848573,58015228,1178995632,1176023235,1175433411,1175498947,1175826627,977174723,393549166,1049319254,898330082,-18749362,-1955710302,-1989287362,-1017225419,-402648391,58001840,-1107289927,1386299772,66620270,-2017444415,1386423159,-217637266,-902394972,68479085,1946172544,59172879]},{"sector":3,"length":512,"data":[1859534464,-401837056,-370474467,8370371,-1200572183,-1293352830,-499217552,-1405777043,510967818,-143253444,570881614,712327278,2067530891,675087988,1176466730,1828934,116841963,1967156770,74246160,1049350517,898199010,-351960600,-1564258624,1015059854,-385649628,-398065107,1014104797,1485277998,1958742946,634424110,1015054335,151418155,-345102330,758939659,-789112459,1848116769,-2147425663,1848120867,-2142892427,-965465028,771879145,-1568626689,-385871432,-1108840419,24373250,-1962812183,-2089950658,37053,-396947596,-51904051,74735361,9473535,8435907,-1955597079,-2089950658,37053,-1912666252,-1427570544,8435713,-395322135,-1628962110,-499217663,-1992980115,-1200728522,-692453375,99149934,-692452432,95938670,50378832,-395389254,-1168636458,937979606,77260804,1843543691,-389859957,1021837888,1592283137,1049319425,-2046857758,-1073020784,-396948619,1952383359,-1869742332,501793536,18475010,-638856969,-402476568,544342505,1485277998,1958742946,2147427607,1848120971,1948990592,758939655,-755562891,-1309949405,-385931799,79168046,1859566080,-1341824536,1859566085,87025750,16247134,1912759272,1976699700,67124528,-264426638,-1557760001,837316138,1025405442,427270144,-395432797,292684324,1848378939,4000626,-1559857248,-1091998162,-19863296,1849704064,-165184256,40772102,-2048383372,-692365823,-88414098,-148496267,33564678,639464448,3016391]},{"sector":4,"length":512,"data":[-379650049,297271437,1858070784,-385839688,62418617,1857284352,-385838920,1307078317,2942977,-393187861,-1073020861,-1101653131,210398934,-1589514958,-125079982,-1069694717,-1559791737,-1527550382,2142815070,1853614336,184556264,1444246720,850196363,-1947204636,728650254,-1985678386,1584288318,1049319107,119434836,1044103219,359951954,-315486838,-1101573823,-1493995818,74733919,-420742909,-2134679992,2073398846,179048821,1006990528,-1007192707,1963069928,840231921,-1394570524,108314634,1965697341,-68631564,-1192463103,115933194,852636270,168070134,1007973568,169702439,1007252982,1025143931,343157288,1390865222,1510068712,-2118591115,1843128576,-320088330,-1901967802,607944853,1380331893,1509967080,-1014355598,1006698681,1955631114,33536288,-1869607876,28907380,-1877853184,1007580304,1955631124,-1877591032,855798928,-397258295,1499135837,74771722,74764810,-2081697534,-1983657718,-395422154,314507320,856100514,227157723,283372850,-692169151,1587999598,-117241996,-370457789,-1679244295,1446414592,977006,1859534464,-1023314944,-385875272,-617386683,1597768842,-551286156,460472636,393697852,-2021113018,-75272490,-1978895297,1915763716,1983462406,-1998853141,-1016146402,-1996466712,862869046,1006930651,1008563744,1008301098,1008039037,1007055457,738359162,-695760864,-2092743058,-579514373,1859553222,434684672,85357056,-763166705,-1190235648,-355401724,-85796655,24433163]},{"sector":5,"length":512,"data":[132695033,1446414592,83487086,-1073085302,540807028,742131830,993789044,-347733131,1090634731,1140933121,1178944518,21319241,1279591493,1157973331,1179206734,1224820225,1145456901,1225147973,1162104390,1179190598,22302799,21823820,21954894,89325906,1162104405,5636422,4231168,33024,33792,2097152,1,0,33280,-2013233024,262146,1048576,-1634165096,-1633771880,-1633182056,-1634165049,-1625579809,-1622630594,-1618174093,-1614242152,-1634165096,-1634164722,1843535499,-1727248501,285492993,-2135357865,-1949158656,-1922176970,119410815,1844059787,745861947,540820140,-492170638,1189629939,1049186048,196636246,1809312000,-529265348,863242812,-663437302,-562750916,669731406,-1497869743,-1176859543,-936677978,1843535499,-401973365,1499094434,-1956010306,-1982331938,191752734,850228672,512469696,1468624354,1959922444,38272781,1842087555,-837385471,914948205,2005757416,1446414608,-1009644690,1846165120,-1957464832,-2123505090,1955053823,-487620273,239438080,-1913484457,-402615619,-396427033,1166630066,-1836741366,138774784,-1995422323,1851171589,1166655539,71665922,-1996077687,1166543941,-1870296816,1843962624,-1989285213,-378674626,1991794004,1796466944,-385873480,1049324301,1569418722,1556867082,-1911661173,644782086,637749129,-1023060087,1846165120,-1957989120,997057086,1953358910,-1866628287,1081409536,-1956834328,-2065167779,-490241700,-499218176]},{"sector":6,"length":512,"data":[-16809619,-1960676204,1851171589,-1962654325,1157826133,13796108,-401973877,-1070375795,-1553078109,-571904534,179880796,1788602624,-385842760,1631349397,2050754162,539755127,256195,-2030040600,520494839,119456519,-930436436,-1527517902,-1316669,-352320280,-1408819482,1975519914,-622279686,321791,119461355,852003500,849671149,-1396462912,1193642534,-868562806,-863370634,82046258,41264883,-775699398,1940255721,-37510143,-117182205,-372158642,1319371123,-56233137,-434205757,1036190573,125203392,-1061436629,-1547500689,1354984934,179106443,-1946454592,-1949684786,460225,-395405637,1465411657,-1413467222,-1974883413,-225727807,-1017600781,-2115204267,1442882284,1451820631,516983806,1959922183,-25785538,179100467,1007449280,1022719068,-1946979026,200272862,-167283493,527728834,-24382581,-1439780785,-2143185730,-889319454,179046260,-335841856,178957557,-1963297344,266567902,-768408203,-1224691479,-1948004096,-2143180105,-294387652,1971373814,-27882671,593175272,-562741054,1946172544,1589546457,852636671,-1394570524,141869066,91503420,-236240214,989626446,-58717836,-1341885348,1447209564,-1392609653,1975519914,-1923981574,-385917290,-1037870369,-1133225408,-1098041109,-768344226,-527768526,1958742700,-347952636,989626613,-58717836,-1341885348,-1958565284,-25785377,-1073042772,977013876,1547437172,-74714507,-1232212245,2123104094,5224958,1958742700,-119363069,-1951743950]},{"sector":7,"length":512,"data":[1583286210,-1017256565,567099828,-919354372,45666867,-64893630,-919383982,12112435,-64893630,1371757144,-1030879657,-638060149,856678787,128644032,-1048356513,-253656305,-1910631965,-1261401126,-64893632,990212639,-1023314495,-385871688,-1910609807,-1150440418,2139095045,91553560,567099060,-75283460,535786772,-1957210429,-134575120,-1957539615,-1947994170,-137917480,1523092449,64160600,-1017225263,-1957341354,1961561065,-1663366302,-772339079,-1048325129,13861633,2040320523,-137300214,67026,-1962880381,872123377,-1109707831,-774832095,-835988527,74702619,-552350205,-774843915,-361411118,-149980771,-2083260463,-746389055,91856128,2040335851,-137300214,67026,1560334979,-1195155873,-957808578,607944807,-347732875,-1070362561,-561262029,-315487094,-2143622784,645073601,-268385545,-783211403,1389548000,-773795504,-773795374,-1056745006,1506874201,-763117309,1174894592,-214184213,-1007091337,-768360397,210427531,1919023488,552173571,-2143622784,192023233,-2145916544,343082689,-1257586304,-773795580,-32673070,183924173,-756332863,24638267,-472136711,1406874451,1071242379,1258296507,-2124677771,-2129707037,1526939643,508757699,1011949139,1007645696,1007842305,-1709870078,480314435,614077419,-350445310,37657100,99294369,-1593681766,123468828,621299595,-12746753,-1023314817,-385839944,503736041,-1705959853,487194633,-2147219460,113475644,508960339,760403,1543249263]},{"sector":8,"length":512,"data":[-1947204857,-14350265,-523157377,1381172931,1394529419,508698192,825942,1526472065,113444699,41418579,1394489343,1107388826,123468829,-1073084733,508762996,-1469794221,1207324686,125075465,-1593688422,-1710888164,480313892,1394496347,1107363738,-1990460387,39291143,175366865,108380683,-385856328,-1022925223,0,-2147483648,1392918526,1394496286,1577059994,123468829,508757699,-1705828781,492699722,-1962451972,38216455,1074022179,-1195179660,518586444,1946303590,508757540,1012080211,1007383552,-1710328828,490864640,194645227,-350409216,7903749,1543249198,37536519,1392922996,1394496286,594804796,796132412,1107328666,123468829,-788117621,187986912,38210311,1963214603,5027882,-1704606487,487653477,-1962451972,-2135293369,-1710298241,487653680,-1962451972,-256244153,1002578815,-1009355582,-1425276898,-1434080559,-1425692042,-1432966489,-1436898641,-1434670484,-1442403618,-1427330330,43589,1095763515,1145391939,121438208,1196380752,5062994,1225666304,1162629197,1414415693,1330205761,849957710,1414416649,1095127621,17731,1314194503,21577,1313409331,1381123412,5525589,1091050240,1280267074,4543573,1158162432,1380275288,4997454,1174874880,1096241743,-1452129198,1398080585,-1449962683,1095501108,4998466,1191456000,5198927,1225142528,1313426510,581548869,1397048330,1129665108,-1303228588,1124802985,1414745679,1413698898,21071,1230374731]}]],[[{"sector":1,"length":512,"data":[1096111186,950618188,1245859590,-1017887931,1392722089,-1448455099,1229325353,-1446165172,1313407536,55443456,5394264,1392722432,-1451601336,1213399873,889192524,1146047747,52668906,810961220,1308833450,-1449178039,1330512695,973078612,928141058,1090722986,-1452981170,1230439501,-1437448108,1094911007,-1443543725,1414727235,1196312914,104770047,1329808722,17490,1179583033,85830171,1095914049,547962457,1313817349,-1438755757,1498678341,-1441512112,1096155978,631901778,1464812550,-1655745458,1157899946,-2025499828,1426409641,1279874126,104835547,1162888530,-1436396479,1329857060,88910370,1279871063,1185595973,-934325246,1174612650,-1430760881,1213465668,-1440133563,1179189806,137144974,1129207110,1313818964,154970699,1129271888,1381319749,665507653,1145980163,85895928,1229407554,222199886,24444989,2144963,-2097125400,1049168071,109876626,378115476,1726518678,-1785552639,-1325396219,32035588,-395459066,-2051538523,1662314626,971559475,-1740732160,-1710846827,149586837,-1784932727,-2147348504,37555518,-488107918,222199810,57803581,-402446616,-1024981992,81455108,-1587349016,-962357868,512476013,-1014075962,728615073,722826947,-1173260606,-12714000,-1324977393,-1948200188,-1006685232,-385875528,1379689225,-1030992523,-1977251290,1007625412,-163809535,242487492,57510694,25004838,4623910,20767467,-1960441996,-352316882,780871173,52822032,-1960443027,-12779450]},{"sector":2,"length":512,"data":[638350591,-1912519421,35032002,-1909527698,642837442,37488010,-1960425100,637537326,637627651,933515,8258342,1023773478,796196863,38142758,706120486,-1841394944,-1774306411,-1207537003,2129199105,-1899656094,-1416260602,-1951677813,-980702266,-1841395285,-1010463083,203328294,1066083840,1979711363,-1960393983,-1960443321,637537822,-1960443645,-1962923498,999658046,1922405950,112646,-1939719959,-1811509563,-1031033963,1353496747,-1411871573,-1785577847,1438893454,1842749067,-1343700082,512435967,-1960443894,1105842447,-1960426685,1962281783,642139685,-1958345590,344598270,-100403662,1917992007,2001943559,-18946045,637791875,-167037813,-790439051,69110566,1977289472,516119991,-1785577787,989857982,-2096728841,48761071,1438850816,1465314443,-544484813,-763109885,-773140224,-119307301,1468729227,39074050,74582903,91423801,-351746429,39139824,74910578,91620665,-351735933,2012691440,309528,495393931,-964486007,46629634,-276565278,1995914000,-25282108,1988561267,-6297346,972977803,108461174,-386105717,-443809903,-890715299,-1157161470,1072189440,46131202,-1593656088,-1064407594,708741926,244000256,-1960443860,-2097149922,800719811,1189611088,-1591343360,-1073020924,119463029,1845640843,1841565323,-1957677893,2877651,1845771915,1848249995,-1957676613,1829075,91105953,78708751,100919507,-125080060,1069271347,-388789424,-1329397759,39512096,-488061045]},{"sector":3,"length":512,"data":[508757505,1346681607,855753192,-1962679333,-1014281255,-388896559,-388896559,-1024932093,-389838079,1220215327,27322448,-1293368949,1347205889,1526830568,260711943,-1947669198,-400510975,-377290224,-150375662,-400510759,-102628860,-628422882,-402558488,-389873167,119407085,-397389893,-488111774,-1811509759,573077,-1342056216,31123488,-796152538,1592306982,-398807039,-1031077428,-1191095064,548405255,-503201816,-1951586567,112010968,669565070,909838081,-932014702,1842782659,-4603762,378218239,-1960443880,-352317890,1972053565,-97530,-234671756,-2095215834,661979131,38046502,91537723,770230411,642928896,-485995381,1543710224,1418405380,180781830,-503290904,-2091296005,992348359,1962938430,77670076,1975520000,1055441827,20703233,503730515,1349696263,117485032,136219430,63144704,-1342135832,19327016,52843355,-2097146338,-1880619069,119408128,-397376325,637993094,532107,-402406525,-85458822,861624576,-1977170963,-1073068540,-1073084552,-342345100,-1971379192,76162784,-318025658,-689437835,1388481280,-402651462,-1336278904,13559840,2793766,-1342155544,12773434,1256768395,-444381952,-670869501,-1427586238,11003904,-1883568354,1894480,1842742926,205425446,915088896,52822030,76228149,38077222,-1023403800,-1977200301,-339146225,-1977203959,8054791,-176829954,113466201,1381061463,-1185943365,-796195836,-1785184572,-1031093549,-1428746460,-193606146]},{"sector":4,"length":512,"data":[-1785184631,1599822170,1364443911,-661957038,-1107294791,473649126,-964491917,737665538,-2029291823,-400510774,-102629332,800115335,472629502,470022771,-402471293,-287178728,1532582494,-256158781,-686873521,-1341658277,190477,1460013744,-1785184572,-1740731990,-1673643115,1929863061,1397801729,244011601,333682072,-1785198905,378208256,-1070361190,1845894795,1526053352,-1017619623,1841706751,-400509208,1994916445,260171779,-1895470360,-1016216058,1458342741,63408983,-1519162,-1953029098,-16731938,1956063254,-202684925,28368779,-1758980353,-347143308,2012691443,639041290,995051159,970487543,158596734,-385976697,1988886462,-59360770,2123040374,-5183236,-1017256565,-1189193898,-503906295,-257822581,-1898410347,-201378880,1583292324,-1185458493,-963969015,-259268105,-503855221,-1910572917,-392826850,1579090198,1008634719,512630423,1465292578,-422448341,-405669077,92734603,1599997065,50381599,33751297,1444807427,-164409257,-1962931783,-1948125245,-266432776,-1073063787,-142146955,-1968096581,119801925,-527771858,604521610,987180551,1999532740,1962949680,105155348,1913013563,-1960675552,1161495620,-350850556,1963015192,71600906,2130986299,-1962218744,-351978748,-352210936,167817218,526278592,509040323,-150991687,-1578071071,-661744054,-13385586,1595909363,1465303902,-1962931015,-1948125242,-137917456,519605217,-1773527410,520114664,512450398,508270354,-1759764850,-215263402]},{"sector":5,"length":512,"data":[-422451503,-405669077,76277713,76088711,-1021354146,1347900958,213513779,-138179840,-1896313887,1486244382,41271306,1150023559,138754824,41025968,-1073086288,-1021354401,92669066,1195771016,-1262225694,-64893630,-1195179662,1927872528,-971076772,-1581019539,-1020564024,-1037363850,-256241290,268385791,78710387,-796139309,-1195114701,1256783873,252006748,13796096,-788527943,-489106966,-971600902,-938570899,1003105133,17201089,1500366342,112835,1398546665,-1962518703,-1950183720,-425525,-1190955505,-783216641,-773729823,868234209,1504441343,-1056718708,-651444082,1594350967,-1950131367,-1992293308,-503902132,-1729624206,240421375,8108227,-1101276951,163157474,-2103296,-1181350210,-689438714,-1776763137,-402651975,1019150285,833942,-1090534168,146380384,-4462592,-1181317954,-1293418491,-1768505601,-402650183,-1463877719,178582,-1090543384,79271610,-6821888,-1181299522,-1897398264,-1774149121,571712,-1787633161,-1979767064,-1583932394,378246914,146380548,-2112976640,-2084502634,216531154,-13375233,-1769990519,-946412895,26668550,-768393216,-1979779352,-1583944682,113743604,104192,-388877504,378142435,1319212798,-1779129450,-1198118237,77791248,-167327850,-788528491,-388877344,378142403,213423618,-1774542080,-1775499577,-523173886,-1394027981,941001214,1095830,-946446685,43405318,870371584,-23729966,-1772349815,1692979763,570854654,-1981099625,-1902691818]},{"sector":6,"length":512,"data":[-1080655866,-1279393784,8436048,-1329355277,136219393,868823918,-30414638,-1986670941,-1953116138,-2082960438,-779931453,-1774288128,108265622,-2096053373,512295121,243897832,-492726806,-232327275,332923797,-98661942,-66156139,-1779129963,-1778112777,-904669181,-1777590647,-1777463671,-141162847,60167718,-1983245352,-1986650594,-1583996914,653760024,-670853592,512346643,243897904,715232818,975632278,332923798,1109297610,1141803414,-1774411370,-1773394185,-904669181,-1772872055,-1772745079,-141144415,60186150,-1983245352,-1986632162,-1583978482,653760096,-670853520,512346643,243897976,503551610,236164866,512333572,243897994,-2069784948,-1809385578,332923798,-1675720246,-1643214442,-1768513130,-1767495945,-904669181,-1766973815,-1766846839,-141121375,60209190,-1983245352,-1986609122,-1583955442,653760186,-670853430,512346643,243898066,-861825324,-601426026,332923798,-165770806,-133265002,-1762614890,-1761597705,-904669181,-1763434871,-1763307895,-16729661,125293067,2013200445,1355320066,-1949988014,-255006505,-1054123942,-788473213,-773205527,65655273,197823481,-1009617464,1224887435,-1336858762,136219392,139234158,-402238325,-1957036887,-503902140,285623297,-1957361580,2089488492,-5904370,-490814627,-3348331,-392825666,113180614,-4134762,-392816450,717160378,-4921194,-392807234,1321140142,-5707626,-392798018,-2067857502,-6494058,-392774978,-859897962,-7280490,-392761154]},{"sector":7,"length":512,"data":[-557908086,-8066922,-1962889021,-1955723234,-1953116146,-392835562,1048837169,1946195606,-871971066,-1191178091,-628359120,-392847688,1048834062,1946195606,1095947,-759637364,-268638059,-1325435928,136219392,2047773550,2014743446,-67901290,-1953037663,1435960342,-1962932035,-392789954,-1767768333,-1734131562,-1768505706,-1577118232,-1556048216,-1463904598,-16193386,1448199005,-964485545,653079043,-1958343542,1100406846,-1763701247,-1763176959,-1763043709,168230656,-1912190569,529984518,-1070422797,520560298,-1017553313,1614118,436615974,643265536,1457803,-1977202197,1946369029,1963211780,-1777819342,-1776933129,178385035,512630423,76125716,54889254,637682825,-1996143221,-1960901564,80118775,-31768,-6942714,848693254,1300899565,-947699449,653853447,1588795,1388556402,-1771921066,-1771034889,581038219,512630422,1143707246,105154820,1778843423,1644625814,-1017487722,1654740562,1881601942,-1578071146,378246690,-1910598146,-1986630114,344523844,1166747167,651725570,1443331,1465274707,-947652469,653079047,-1958277750,-1953017290,-1953017826,513204246,-1762910578,-1494001839,309614943,1928477507,-337956092,-8617970,1189704704,1015085035,535393536,-164376013,494197515,135674690,855929494,-2095911982,-1910634810,999691294,-394977508,-1756097021,1499357002,512630363,1418303086,1516117762,1381061571,-1776639658,-1775753481,-768354165,139299622,-1960426781,1963140660,1837835780]},{"sector":8,"length":512,"data":[180847366,639536670,92939926,2025851463,149657603,-527794396,1191545382,1946157117,-1993373429,-2092825993,-268237629,534438469,-1776151039,-1776675327,1532582494,915089091,-1960443890,-1157623786,-230948865,-1960433037,-8190340,52196607,1015228153,638874879,1946311995,-294133,-1293417612,-19601154,-2080411928,-756348730,1962933123,-23074557,-1771396669,-1772210549,1545506334,205818262,-1777295073,-1778108789,35556894,138709398,-1760911073,-1583918941,1386452704,-1777294953,-392735581,-1960378874,637540366,1707579,2028471156,512435967,-1960443862,184561166,637892041,2887307,1543933446,1581157270,-1778474602,-1413248085,-1951678413,244034497,237737534,165910288,60182177,-342422522,-22986492,-1047811179,1645120427,82004374,65750855,-1951678413,1049340865,-947677692,33984002,-1274892138,244034308,378246936,-903112938,48480307,-1951677813,244034497,-481716728,-347650300,-1413467389,-1951678069,513170998,-1772347762,-1961997173,-1424028604,128696715,205425446,868233984,361440969,1962932867,512435734,-637337586,638028582,50484619,1334519490,113912578,-661925493,-1774567797,-1774713202,-1760162165,-1760293333,65257523,-1416162143,1202438539,-18361,-1413248085,128696971,-326412861,1443032195,-1758027433,654198409,-372174965,378218049,1128464422,188189478,-1960282890,63407102,-1977162702,1207436037,-1756875205,1048579702,1946261318,1995586308,270002179,187992870]}]],[[{"sector":1,"length":512,"data":[-489130506,-1780178483,-1757673941,-1712782473,973486848,-1207535977,-1360461701,868780884,-13433152,-1759377778,1988865011,906923006,-473027689,-963948254,-150992711,519605217,-1759764850,520373643,-1759902165,-125050671,1185662603,-941694375,26682886,671532977,-944684393,-392748026,1010207664,-465663081,803753877,470191862,439782295,-1948349545,731245582,-1960647730,-772068354,512630503,93034274,1958742815,573197,-125048841,-1962621053,-498684986,1583286238,-1017256565,1431393879,654216019,638670219,-401652341,-259322957,-2145481186,572310,-661920777,212929139,-645078317,-628174589,1334511498,534378243,1006633661,-1122798333,-1293418493,-2084009110,-165280575,41156869,106643777,-1779431794,-1080695647,-403242999,-1014237045,-1413051477,866894219,-980702272,117376938,117413348,1499305452,868441950,-1756847168,88357158,958806644,880022340,-967354797,26692102,323783462,91523878,-2093743322,914949318,-24406200,839108483,92940004,-397936637,-141881683,-502675837,1532911589,243992259,-481716764,-268005825,638869,-1779681653,-1780206037,1569400390,109970946,146314880,-1947994368,1359770584,-489485135,-788282996,643416718,1965899648,2005476868,-947714292,-773700087,1048822535,1963038518,1185006337,-1760648298,-1550434655,28874514,906377984,-385650025,-1185939257,-503906296,-1910581109,-1953031138,2005598847,1465261830,204901158,1963140608,1049306625,52822030]},{"sector":2,"length":512,"data":[-1910614212,-1953031138,1200292943,522160898,-1583922013,653760062,-125069748,-1936331615,1243516634,-1996125802,1300825181,-1960420602,1141057031,138774786,38767398,38546214,-165258402,41158660,1300875571,-2454006,-392827850,113704661,-1593796790,1017353700,-1779654249,194452131,-402426661,-1070334398,89951014,225762059,60180129,-1550430714,887658306,-324969987,515976085,-1773527410,520242569,-1774319873,-1773795585,820592728,236358655,1175358359,1319192982,63439766,1993423824,11004163,-1555512693,-1031039170,-1760426453,110575779,725701201,-1077769270,109969412,1202427676,-85835705,-1759115577,113750470,-1308322008,-1759246649,915124653,1049335570,-397437378,1499132842,-1759770994,79610507,2009152256,1015752213,-1757528533,-405674031,-1425881213,1074054787,-1031018517,103536779,653760320,-125069748,-1912289405,-1953084922,-886357551,990219046,991589059,722892738,-778617338,-1948200480,512630512,1149998876,-1993990398,214401797,-955786526,26686982,1141294848,-1023410025,-141148511,-1953084378,651310072,184835211,-1957530405,63341555,-1977160398,1190200076,41714470,115635200,1459915558,-1912601921,-1953030650,-225030642,1341116847,-1906325621,-1416214010,-1951678413,-21451838,-1070355457,-1962431573,60182038,-6928874,-6930938,-342473210,977177510,512630422,1435080248,-1950146812,-476670450,109971016,197105316,1166681600,1962949642,-1960421582,15621,-1912200076]},{"sector":3,"length":512,"data":[-1147750906,-470351870,-1960380277,768773,-125049865,2105550343,41222154,-1977165589,643762757,-2096478840,-1042150457,244040455,-108816746,-385649408,-1912209221,-1080646650,46006283,1032005120,641496064,-1912207989,-1164541946,-487129080,1946221187,268483343,-138245296,63147235,1489211096,-1960388469,109969735,-1993959754,46564100,-6903135,127314438,637896998,101074315,-1769994610,-150992710,16417762,12259188,-1031057392,-1014176777,-1014048765,651725656,117524363,105220390,-502544509,179852,-1767240053,103932745,-1766455666,117738278,1358957503,-1768550773,105199910,-947714700,-1577721333,-1054108010,109971008,-1993959754,-2091317500,-807271738,915129095,178361860,512630423,76125698,915088927,2045247496,-1778474505,-2087239005,-315489338,51153446,1273513713,-1773755906,-1583936349,279156286,-1779654249,-1550379869,-459172070,-1757633643,1252180019,-1758813545,-963163997,26691078,169773862,772196096,-1593835369,816027296,-94771049,-1768538493,103969792,-1765276018,-150993736,-1953055706,775848920,141820055,647442593,99288969,509734,-1758551808,38242598,-1765538049,-1766062337,-1779654393,-1550379357,-459172070,-1757633643,-1757018426,512435712,113704998,38702,169753382,-1593216000,816027296,-101586793,-1768538493,104690688,-1764096370,-150992712,-1953051098,650130392,-1993996407,1048773191,1946195758,-1758420727,71797030,-953809173,1095,647442081]},{"sector":4,"length":512,"data":[-16365687,-6892026,127323654,-1550455647,117348120,-1578592470,-78255877,112835,-1550455645,279156222,-1776114794,-1550432605,2091095658,-1769036906,-1550409565,-995912014,-1764318314,-1550391133,-89942262,1260816534,1141294999,-2013265769,-1953026778,-1905404386,112835,-1550371165,446928356,-1777818730,-1550434653,-2036099486,-1768381546,-1550407005,-828139844,-1763662954,647426723,540299,637781891,-134019702,876513607,-27858793,-532760,647364102,269963,125098763,-184096685,-391582885,585694580,-1090052355,-71789154,1048816466,1946195606,34191365,146277355,-392058110,-367621226,77206,-1426007421,-1582579061,-1421306102,-1953037663,-1181285354,-235470840,-1769692757,-1780309589,-1589164117,1202427470,1007027015,413248406,111258518,1319218070,1621207958,-1070355562,1048619947,1946261319,-1431590139,-1582626581,-1330942462,-1582585342,-2085906704,9868862,-1085859980,-1767795246,-1465799786,-947672170,-1766153980,-1764974165,171754411,-58710923,-1341885184,-2142049522,74777340,1240142000,1963261056,-351293436,117211200,363869557,205273067,-58708619,-1341885183,-2144670974,74777340,569051312,1963326592,-352014332,117211160,179307637,-58716181,-1341885171,1392962310,-682502725,-1008455077,141934603,74830347,-1023409736,-1960387961,1004177183,1953380374,178841605,509022323,-628164469,1703544202,-396419327,650379120,637949323,-402373237,-259324801,173378342,138775334]},{"sector":5,"length":512,"data":[503608040,-1979949371,1200162423,1166747144,55019778,-987839713,-1960379298,1200161349,1200113667,516103941,108888870,855930112,-1962677258,1590030966,1166747388,55019778,520517513,654311355,-2096728693,57999614,-1962888727,63407102,-1977162702,1207436037,641007398,1392671872,637930357,-695532401,-351582835,1435182600,1166747143,66447365,-1996189914,-2144929210,1951597180,1166747181,-294143,-1019534220,1344151671,-1896593781,-1147760098,-470351867,130472075,1200183360,55035649,-14745600,642839622,1392671872,-1960442251,82512205,55413542,513215137,-196703408,-1768808818,-150993477,-1948742685,1200224838,1200183299,197145089,-1342016055,520587392,-196673701,-1946973208,1962281969,-11540221,-1960436029,-1960441259,1692928069,650676995,425347,-164428683,1988821995,-1767857678,-1767495945,-1532897141,-2082959722,158597625,1204227977,-352321278,509705,38258432,2005467136,38177540,637945737,-1995422325,1204160583,-1960900598,-6905802,-6907898,513187846,654073541,-1996339829,2005467975,-4514042,1972053759,16679686,-1226243211,-2080470272,-466484281,50694694,-14268424,2088773172,192238338,76490246,1166923403,638118667,638014859,-402307701,-1893334333,-96040700,2088773200,477451010,272465958,113643644,-1560176851,1122539307,755418630,-1960443753,82512205,55413542,513215137,-196703408,-1768808818,-150993477,-1948742685,1200224838,1200183299,197145089]},{"sector":6,"length":512,"data":[-1342016055,100017792,639464464,490883,1275855988,1208746731,537261606,1108083316,1074132518,1091306100,1528760200,-386644225,-242486700,57996811,-46359,-1013502458,-1756690746,29681665,650284038,-386382453,642779182,637685131,637814155,-402238069,-165216934,1946285381,-351948284,-1006521854,-970523554,-1993986809,-2010774705,-1993996969,-953809337,268439111,21481254,643301376,117983113,1435182787,1166747142,30795780,-1977159541,1371847429,1589976791,108497404,38112038,520308617,-466477373,-682502725,-1979943227,-1960442300,1149829701,1166747139,138709252,105220902,638207113,-1995946613,-1960440764,1149831749,516103950,-939755835,394820,71666470,638076041,-1996071541,-1960441252,1149831237,1166747148,239372554,38112038,1006847113,-1341885180,1008528134,-166890238,74727623,267060656,199952816,1950402550,-352014332,-2012696574,1472405252,240487206,205884198,1963349563,71711493,552085364,-129595135,-2145481186,572310,-661920777,212929139,-645078317,-628174589,520898443,-336181623,-129579174,1183514634,-163149326,139299622,415728449,-24381557,839108483,92940004,508033027,-1760944501,-253564845,-1896593781,-1097428450,-420020219,-1990659957,-1960443580,1149830213,312835,1963063683,-2147170813,-196673761,-964429941,1606148616,-59325154,640222406,-1996339829,-1960443068,1149830213,1166747144,172263686,138775334,638207113,-1995815541,1183517764]},{"sector":7,"length":512,"data":[105155064,-1980348789,-1021375420,-1756676480,-971803391,9915142,-1758839168,-2144635647,1083657230,113648875,503682892,-956539195,1204229639,-956301311,262983,1073890955,-2096740471,1586038979,639508476,637949323,-402373237,-1605305498,1590007628,587712252,83911,88573952,38112038,1476609929,520505225,1975520195,1976699656,112644,-2024779069,529213146,373021319,91516472,1929768424,-1957210076,-628220168,41713702,638219603,2081439104,-351227900,-1979348478,1595867493,1526375400,-1064546109,91541563,79987544,1431328963,-326898549,1364612879,2088773203,209015554,272465958,1187382908,300617969,-1957212154,-1030880130,-2012902874,1482682694,75401991,-2147054074,572310,-661920777,212929139,-1047731501,-1030827773,-1979824500,-1977156514,130190343,57982986,637573609,1392671872,-2036263052,-196703850,-1986621791,1302458950,-2046426729,-1912209002,-247035242,-1960910710,1371847627,-1897888041,-1999008806,20717351,-1897396875,1012788218,-402295550,1424751297,91554620,-335833368,1963342923,-23795707,272384747,-1075313291,1010428924,1007186952,1006924804,-402295545,686554371,91556156,-335905816,1963736095,-45619195,222041835,238814324,149423477,1007283197,-402295537,15465861,1600018779,1482548619,-1023097725,134608422,1183516277,-196703750,-1756690746,873892609,189107607,-1979804952,650377286,1963081088,-1960393983,637537310,637623555,637687691,52830091]},{"sector":8,"length":512,"data":[637537822,-12777589,-1023314433,-2081649835,1392905708,1573135952,-967309809,184611654,-972786472,1476522822,1187448667,50331892,-62486078,2793766,855525001,100017856,-1342016248,-163149816,-1986590047,1048640070,1946261293,-298915837,40143398,604342822,1963211839,-129579253,1187381280,1961597175,963969084,32734848,113642101,-402548916,535560006,519587527,708739072,74776983,49835651,326992678,-972524544,26692614,-1325452824,-163182064,-336116088,-209813449,-972393215,93801478,-335606296,-129579233,1048576031,1963038506,-126975228,2105746946,141819923,-1756625210,-17242107,1175064752,-146372362,-812924020,-1779431794,-1080695647,-403242999,1183578251,1048620026,1963038509,-1758748411,1183515627,1183558648,1183558652,1183493118,110013175,916559644,573335,-125048841,-1416150367,-1582579317,-1951689236,-5508026,-1953024506,-3961095,-6953978,-1953108986,-1581031963,1183421924,-469303298,-335085675,-1760910955,-386120055,1452010792,-163148808,-1979904280,-1912145338,-1953107962,163577414,-1947732224,-62485512,-96040021,-1413379157,-1968454773,128643398,1963343043,-1009634557,24379964,-1957474109,63144922,-1977162702,1138230023,-1757143493,-768408459,1460020203,470191697,-1758027369,146786443,-1947732224,149914616,39664422,-1960380448,1599669333,-1017619705,1448235344,-2080470185,-1363278905,653079120,-1494020726,-1031004299,93799585,-2014838773,109970946,146445952]}]],[[{"sector":1,"length":512,"data":[-1948059904,-1759862280,172329254,1516134151,1438865497,-326898549,1381061391,-1977199017,-58719644,1999794768,-4181453,-392758730,1918436542,-247019996,1166747141,-129595134,-1996125402,-617351610,-1761997253,-1960441739,-1960442275,-286784435,11725310,1968307328,-247019963,1166747142,-129595134,-1996125402,-617351610,-823604941,-96039938,1996496957,9103619,-2147054074,573334,-125048841,212929139,-1047731501,-1030827773,654067339,117523849,-58693397,-396659374,1584530587,-1757135229,-1962052608,647447582,2081439616,-15407101,1460062347,-1476031962,638415888,637754763,637631883,-320141426,-1140936984,1607946725,1245609991,41222551,1183320076,651856881,-1996012149,-1960380346,1183384901,-29103882,-58717973,-402426029,1600060633,-1956947622,1371758053,-1927391402,-315489163,1091340838,-1762509173,-1762521599,-1761997311,-33124858,-1527570538,1595868958,1371756894,-1927391402,179897461,-230782208,-233963114,-99745386,109971094,-216033538,520560292,-1017553313,100787250,-964454940,76162563,100778238,-293366048,-569966845,-1960393834,637540406,1717819,-1960432012,838866494,1166681828,650182151,1912814976,1031808530,-15960316,26664454,-6889466,93718534,-134021113,-646775237,512435907,992346136,1962940958,1364443905,238455590,378217984,-4653040,1945254911,2089494060,-31994,-83681676,-12811482,-1960438156,100730949,-1960405478,-1053097403,117376628,-930376094]},{"sector":2,"length":512,"data":[-351746429,-1017423408,37584934,1405288821,-1960422831,637537310,637623555,52830091,637537822,1962884995,-402542509,117440310,-1960405442,-92073643,638612736,1024411019,125108224,326992678,-1960414208,-1919470570,28379973,100688616,-1004122029,1476792157,1532549131,638219271,1963460086,-469303548,1569400469,1960512261,58779651,-1017423526,1913555793,186704790,184841664,504919250,538873430,972436375,956658948,175374932,-502741373,1495228146,1284228089,71600902,-1994432776,1503087886,2088773315,175461122,272465958,280298620,372968427,74815284,24626747,-1030991165,1526703592,-1957300621,1464881900,-2091691690,-2144992020,1968374396,1031808522,-1257997296,-1258099952,-1770872576,-1757936069,28837490,1103096064,-150992710,-1980199966,-1945701818,537300674,-62485609,-1413313621,-1761339765,-1147731295,-201916408,-1070355648,117376939,2123077234,-2132528388,125108477,-1979348442,-1979520024,1370733509,33948119,68584343,-544538473,20759946,-1960436363,-1960442281,844170311,-11933495,173509414,138906406,1509900008,1006724841,1008694274,-15174397,647403526,688003,-2094659723,1946159231,-1442382071,-385619050,-4521822,1972053759,16679686,887686005,-263796991,1191116800,-390057232,-24379994,839108483,92940004,1363671043,641007398,1392671872,-2144987019,92016701,-1243065420,-1893333503,-1915319548,28379973,-1960441109,-1960442027,-919468731,654229224,643368079]},{"sector":3,"length":512,"data":[1392671872,-1960439692,-75300539,990344447,-16549949,-661917626,41713702,637957459,-351701621,1972053508,1979058947,109971081,2123077408,-263812110,105220390,-2046426873,10611094,74712636,1349849148,1946286464,-226587870,101238659,-1759508850,-1414807501,-1962431573,1913061371,33981334,377686167,637572868,637949323,1359234443,-905197429,-919468684,654193384,-2096607861,41156857,-346487829,-569507504,1240160662,141822012,74712124,292882236,106400550,71797542,-389467567,-346423805,1963932716,1468737064,1200301582,-27903220,1178278773,639006204,1074284427,-1769601535,537300486,-228684905,105351462,79987463,1600018779,-1017256565,642995974,637689227,-1910096501,629810695,-2147000485,1064438268,-1073080713,-1977217676,-466484155,-234487488,-399840362,636222457,1997274240,1958742544,-234454265,367725206,-335803160,268206096,158666103,91537418,535347250,-104597252,106125251,-1476031962,638415888,637754763,637631883,-320141426,611778876,-1960441996,-352316898,512435717,52822032,-1960443043,-49913,52826996,378208581,116092418,21349414,-336018804,1527249153,1364443999,-58698153,2002285136,-11737064,28332402,654031336,637687179,-919468661,-335740184,1375502398,28316533,654025192,637687179,-919468661,-335746328,1392279590,1894259061,-1340312833,-75175935,123046694,88443686,-857159374,-2146898948,58151932,1593577960,-1017423521,-1960421801]},{"sector":4,"length":512,"data":[1105842447,-1960426685,1962281783,-2080470241,-466484281,50694694,-1977202696,914948708,1911068466,881534719,-512362997,1600050914,76228291,-1773257077,-1030953007,-1759639922,-1912239834,653669058,184841355,-2095680266,-1977220154,1190265620,41714470,-1543168,-342475258,-459160606,-502922859,-435799147,-1560055147,144807398,101056918,168180630,-1560055146,446797322,403046806,470170518,-1560055146,1050777116,1007026582,1074150294,-1560055146,1654756928,1611006358,1678130070,-1560055146,-2036230556,-2079981162,-2012857450,-1560055146,-1734240632,-1777991274,-1710882410,-1767202410,-1767373311,-1767111167,26655905,999733766,1922481670,-1765891325,26660513,999738374,1922486278,-1764711677,26665121,-2087254522,9898006,-1763572165,-492633230,-1762483818,-1762654719,-1762392517,-190643342,-1070349418,-1550457693,446928392,-1774279786,-1550425437,-1734109562,-1767201898,-1550402397,-526149938,-1762483306,-1898410813,-1194183744,753402880,504793569,-768407913,-1931412760,-1953030138,-1177406526,-235470840,127350947,-1631600589,23378325,113748723,16815874,-1550383965,144938758,-1756913001,1842749067,117425038,117413454,117413562,-2115463476,1048782591,1946157102,1191626245,-1960443497,-402651082,-964429394,652489219,-268237686,875989318,-26613609,639535910,-30611456,-386290712,-1914111517,512435966,-620036092,1923198581,571798,252043767,-754667264,538348520,-1982856297,-2089957866,9868862]},{"sector":5,"length":512,"data":[-1070397323,-1550402909,12818124,0,118904662,-1174613461,-1510801404,-773795411,-1410805294,1583328146,-326412853,637820612,-16220287,-1003653761,-2128214946,-2147481985,1589910901,1065559556,-1005292288,-2094660514,1962934911,73319434,75465510,-1207602176,48955393,15450163,311901,-2081649835,1465260780,175555870,-1696039283,480313344,-1928956219,10155134,521969920,-1914145139,1183511678,-28954098,855525000,1183380038,-263812338,1039949451,712212479,2147482497,-1019537805,1317670003,-229734146,-1812963703,-619972729,854279799,1183577995,-263812612,-1979824501,1183576646,-62506000,1183521909,-28951566,1187452020,-1207959310,12255232,47360,-373292870,-1959395068,1552627204,1284191746,1418409476,15919366,1077789483,-1998094592,-1959336378,1569404421,1300968962,1435186692,-414792186,-428965888,-2011595768,-997529786,-544545910,-846530166,-695539062,1853882550,-411236122,132540032,-355397516,-607004207,1590745297,-431030553,-13897611,949888,53879157,1544762884,1276327426,1410545156,-781683962,-774254118,-791096869,1191176030,-2141656080,906097270,456524843,456524380,456524876,410191444,32667264,-772287753,-789064713,-169386250,-552351981,-686567661,167788734,1311013110,1724913268,-774843929,332517843,-2081392174,1979793646,-1878201360,15746759,-230242816,-803214592,-954996890,-820781293,91477779,1191172817,-260144656,510885887,15761027,2126782324]},{"sector":6,"length":512,"data":[-1817445366,-1834249813,-263812181,1175118033,-1412902414,1187452651,-343932944,-263796987,-1070923776,-930359157,-756297589,-443851169,707165,-1326675115,1996443648,175570700,-16222465,-401734026,-899809758,-1957363704,1342288108,-15960321,1996425846,108461832,-32970738,576093,-2081649835,1465260268,175555870,-1696039283,480313344,-1928956219,10155134,521969920,821972618,1586229838,-263812100,1937768253,-294609,995718015,-1828621629,309641227,-30555389,-351571393,-4222859,-2147435905,-13957653,721420474,-1948742720,23980488,16547459,-1927934860,-397350842,-1072956077,1122697844,638213828,-16226431,-230230145,158597375,638213828,554881,22276480,15761027,-1927934860,-397347770,-1072956125,317391476,-1954545729,1586230342,-129070090,-369469813,12189975,2147467200,1183422955,-1946211344,-151548977,1954608966,-397505786,-152406389,1954605894,-196214001,334919187,-146344193,1325495424,1183570731,-328796172,-233584637,-1962879101,-1072957370,1727469428,331875304,14124018,-134723957,-268178842,-746325485,-196703488,65955575,-2080762896,1183514835,-328796170,-99356669,-1962880125,-1072956858,1727466100,334496744,13861882,-1957246677,-163148815,65955575,-2082860040,1183514833,1958743032,-328796393,-636225533,-1962880637,1727526982,332923886,14058442,200951435,-148605760,-133961114,-779888109,14058240,-134592885,-670831514,-696006125,-96040192,65955575]},{"sector":7,"length":512,"data":[-1947069496,-1956735018,-770969474,-783348872,-774843930,-774778413,367448530,-746389504,13730560,1929433731,1205522691,2147483521,2112422770,-990409730,-1409545602,-1416516717,-778654830,-230290720,1605093585,1575324510,1426065610,-326898549,-950577624,64582,175555870,-1697087859,480313344,-1928956219,10151038,521969920,853689994,1183379014,-327775238,-2116008309,1937768446,2147433769,-167037325,-1073017228,-33214860,1925589823,-1874728171,-1098907718,-1072988160,-4583051,-1073693057,-768931349,-12716501,737113215,-1948742720,29747656,638213828,-16226431,-96012417,158597375,638213828,554881,29223296,737691273,-564753463,1005221515,721647602,1183531478,368506844,-854458367,-1979756920,-1957628346,1586226246,-1961761818,1177151574,-631367208,433870361,-220012938,-1981352098,-1819083706,-670832905,1183566355,65468392,13796296,1727501970,-2084174870,1579876562,-632415272,467420699,1586093654,-632387112,-1948498295,-151524746,737605521,-1038878254,-802436589,435443337,1585509966,-1957691137,1586226246,-1961761818,1177151574,-664921604,433739289,-220013450,-1830357154,65468307,-1949690920,-419960762,-763115517,-141127168,-972821914,721474179,1310456926,-632939560,-1982048741,1317665886,-632911400,-135629173,-151547402,335139371,-1983245374,1308750406,-162131468,-1761651184,-1830398325,-471310709,-62510837,433610265,-169682346,-1819089161,-670832905,1183566355,65468394]},{"sector":8,"length":512,"data":[13796289,469524011,1444665414,-60913190,-1948760439,-167516042,-2081786229,74645718,300669575,-791551023,-151530799,-772343917,-791096853,-17954,-779423349,-789064713,368434934,1578303488,-196209678,318141971,-355401898,-556724877,-607004207,-556738351,737691391,334889727,333386695,-2131291185,1451950290,-1107004168,-2126348288,1920991226,-31397629,2147482241,401146738,176080126,-1416385540,-1416189039,182505874,-925763002,-1956749397,147480037,-326413056,-987867306,2126776950,138709766,139823910,-523117781,-489563184,-930357296,786680331,1031790394,-1036307844,829893234,637944971,1963345211,71600925,71645990,1149965429,1161504258,-1962183422,87762436,-1070922635,158798571,158718730,-335544392,1977289223,112887,-350240757,1566465792,1426065610,509013131,-1962510651,1418396740,3965702,2088963957,158662658,91586472,1946273014,-2134900198,-763166508,-787451136,-2567718,-4519868,140256127,-1340968893,-1982125312,39618844,-1996209015,-350288300,-1161811193,-403996672,80371038,-326413056,1443556483,1992629847,-159478518,96012054,-1510736896,1183651359,-401714954,1586233221,-788483586,-774778653,-294421,-2128382849,2126545091,-294609,-1977451264,1183579518,-788822277,-773205789,108971227,-1416385540,1586108651,-1209806595,-339727361,-16729112,-504643541,-1070867669,1583340523,-899816053,-1957363704,509040364,-1962510651,62259524,873132066,145228917]}]],[[{"sector":1,"length":512,"data":[67444340,723088128,56365531,268786705,208865116,-1089977089,2082701311,191907592,80148516,21268736,-1995445473,39618844,-956015479,-2147482044,1583345387,313949,-2081649835,1465256684,175555870,385253005,375047,530969596,-163148522,-1981280688,-146371585,-1946583413,1451948878,-27358211,2147476353,2147482497,-1014936204,1115603968,134216577,-489665155,-623842351,-209008886,-271458421,-623781679,-607004207,-657330223,-640558383,1725029329,-788523778,-774319633,-774254118,108971227,-1416385540,-1416451183,12198379,-2096108800,-355368990,-897324335,-1174148128,1725038560,735760894,-1948677175,1607658433,1575324510,1426065610,1465314443,175555836,637831974,721573003,-773664266,47918046,-2144176930,578093054,-109057149,-225781040,-393554806,2126774449,-1413469434,-1834249813,-16411733,-1413084353,-661969685,-604513782,-348127045,197823447,-2096204600,-355434517,-770523133,-347355016,-1073628169,1583333611,576093,1458342741,1992629847,108971018,721835147,-773664320,2106457560,92874248,-355269199,-92184204,1148454911,-360640333,93455359,187056127,1418439429,266764293,1284240138,22842115,11543690,-741220143,-758001199,-741220143,-758001199,-741220143,-758001199,-1416516718,-1416451181,-1873286369,-2096735094,1544228835,39586564,12196875,-1280347072,-1968444656,-477952420,73141007,184704011,-1174047460,-1762934783,-2147134325,1284181990,22842115,78652554]},{"sector":2,"length":512,"data":[-456079106,-774777903,-193342957,366672,84616764,11557035,1583324907,576093,1458342741,1992629847,-1962636534,1284178524,106203908,48927,310170123,-922016385,-620027531,-1073013387,-164947595,-755548693,-738733577,-2081040137,-779943725,13796096,-1107295809,-771030976,-779679115,-2087466105,-219475730,55446392,333124544,2043810761,-20545035,199676223,-993078793,-1409546626,-1416516717,-1416189038,-899850657,-1957363704,509040364,-1089833275,2082701311,-17858296,1073709887,-16054145,-768929923,12190699,-1950340224,-339178536,106203977,-1962652533,76218972,1999695747,-1950119152,734694361,281510866,-410782850,1960834831,281510670,-640554287,-657335343,-151683249,1954548036,-134862063,-137234478,-170330157,-837558765,2126829075,-1817445370,-1834249813,149914539,1566465823,1426065610,-326898549,142016264,369522431,1358448269,-10295282,-1711651189,1979471419,-27903221,-1953364363,99350598,12238891,1575324544,1426064586,-326898549,142016264,369522431,1358448269,-13703154,-1946663285,1317796438,-28439556,-4717196,-1949266945,80371173,-326413056,-1962349437,1183386182,205949944,-1711651191,-1979951479,-1927872938,-11470778,1996425334,1877478918,1575324670,1426065610,-326898549,172395272,-1946663287,1183386694,-1983894534,1183448134,1183651582,1996443896,108461832,-29300722,-899816053,-1957363704,-1000909076,-1960441218,182135573,-1962379822,-1949594637,639036371]},{"sector":3,"length":512,"data":[637695371,-1979429493,-2131391746,-1031700250,-847233154,108971136,-1413469188,-1416189037,-1416451183,-899850657,-1957363704,509040364,-66423099,-1382830675,-1382896239,637045535,2116911103,169637439,-1978436124,-2132553497,-779943724,13796096,-1057091213,-4715147,721611775,-1949791296,-788075568,-773336606,108971226,-1834249813,1566465963,1426065610,-326898549,-1957210614,-167048586,41510260,-25043209,58069895,-1156347970,-568131577,-472783919,1374471041,-16615425,-163148489,-1751494634,-1323482623,-1074867453,-167030260,-288287372,1183648883,508565238,39361111,-947708767,-991433974,1342572102,385238669,176063312,-1710786304,480314435,1486489067,1595711746,1575324510,1426065098,-326898549,509040140,-66423099,-678691021,-544485493,-1980465527,1017968254,1013412400,744716089,-619997136,-922017419,-771021963,-1164501131,-487129078,-763103229,13730560,-1962880125,1174533702,-2117080076,1930218747,-405712852,-774778159,1364448209,-405711022,-774778159,-405679151,-774778159,56153041,-804038408,1489507160,-346499053,-163148869,-196738752,775722219,2122517365,91554038,-336179457,-125924987,-1980082551,1586101326,-193033218,74728764,913663292,-1968383181,1949121736,1948990497,1915763741,2000239644,-386170600,739406595,-472803280,-472788085,-637279279,-340994045,771326176,-604568971,-1927283965,1343682630,101074628,39504,12066114,2113420272,1358441229,101074628,1022544]},{"sector":4,"length":512,"data":[-1000923801,1342572102,1728057242,726177309,15403590,-443851169,576093,-2081649835,1465259244,-2088763208,2130710142,1226758,-1995553145,2126835270,-226588410,519325324,-1928300859,118945406,375292,-1960860173,-919863738,-774774575,638222020,-388952695,-12776844,-1173196161,48988159,2126828075,-1430246906,1944699531,1073687809,2097158973,2092960524,-330905848,1189806088,1292941968,-1265374473,-45708723,-453582640,-763116797,-2082932992,1451819218,-296338452,146718332,-1192088832,-264564736,-265613956,-163148464,261771286,1444767488,385238669,1022544,1720261991,2013680,738086442,-160003109,-1946648949,1452014150,284787708,-561311886,-125044853,-768884085,1947265411,-315927276,-657331503,-556671023,-573449263,-846466334,2123192157,-1861806346,-1767140437,-1196730197,-1851047938,-991142261,1988883070,655407366,179958263,-168390044,989197970,705327813,-1336917051,5892145,3663960,-1980998007,1183707774,-2142234890,2013330814,374347277,39504,1854086466,109920510,1344164464,-1593681766,-1950340324,-25263664,-1536016385,-385920279,-1970143231,190700,-157760118,808453617,-1979710744,1966095556,1962818308,1325378054,990542862,92204638,-1142308021,-261714946,-160104901,736035663,1031808734,991392565,1340568830,809336870,334230900,100542031,960331814,-29685386,-970526091,641937669,83398,15451019,-443851169,969309,-91491445,-201586914,-1948349532]},{"sector":5,"length":512,"data":[1448199127,-208992681,119470731,-56298499,-678699381,1499356935,-1224280125,-1023409918,45549303,-138215422,134395654,116900608,67109559,-286783372,-402426625,-138149918,177926,-2120432888,268613390,-1664901888,48695031,91553801,1509062,-418479872,-2130704126,6414,-389833471,468196319,-1767783676,9675522,45162123,43392649,-1560110175,-1281294187,43754242,243974955,-1053162827,-1047920010,-1593732189,-813038964,-360000973,-503842166,-1023163645,-1023243613,346210355,48896,503324089,-1426850809,1949504,-218103367,-18262,-1191174465,-1426915325,-1090480200,112787490,-1330908416,3063552,-218081351,587646890,-956293629,503530502,51749376,51775174,772195850,113640192,-951123917,218206470,-1962889206,-788351730,-1342129439,43531904,-1610255353,-1196031103,-1996321118,-1996321778,-1023244266,-1560095327,329450257,50963203,-1560081501,262341389,2269955,-1560271197,94568490,419874563,-973078528,197638,2361031,645988503,-268500297,-18237,503760464,1609105152,-17569790,-1591912472,-1767702381,9806082,-402482269,512435436,130417379,282650650,48569993,-2061071528,646562560,512426117,-1957494043,-956112098,-955642617,-1476359418,-1224280284,1946165250,-21829626,-967709861,-16771322,45549303,91557888,1509062,-1223786240,-972029950,16784646,1543409640,45549303,443875840,2373375,50607871,1528650216,50601608,605981019]},{"sector":6,"length":512,"data":[498526208,-672657685,-1224280305,1946173442,260368387,8726155,2367115,1979662208,-1896120053,-402296063,-387246405,-400844824,645995008,-9502695,-402548248,243335758,2097847,1912652264,2025477,-998979861,1392649403,2734930,-1191170630,-1578565624,19261693,-399798296,-488105124,1948269821,1946762249,854085637,512448512,-75431900,611516815,1962775272,-689418235,126375952,1963801667,473622537,-383871256,-1763173592,605980958,487778560,-148505111,6406,-2125171711,-16770778,-42800898,-1964488332,2400527,41075515,-1749362549,1004177152,-1978370854,1948269575,1946762251,1979661316,537380358,-1159140541,-634716009,915069575,-700841213,130421106,-889306359,-822212236,130477172,-1007490049,-399840280,2134645432,540804211,784025971,17286656,235374659,-1094823161,-402606815,173736159,1395750336,-1256002370,13756417,1975519835,-550058973,11883266,1526776552,343146812,91619132,401195403,3121406,57876540,-1007042510,208980222,52697275,651756505,-1007085685,-1677715736,-399867928,117316172,-2008874962,58039559,-352320792,710928534,861131125,371099867,244115456,-1979699525,1958742535,-1975300078,369524743,132645376,-922855424,-1017385099,1982080,-402426880,540811960,1441334130,-1336913906,240052318,-398457768,-1017639352,1640183,745865217,-343221453,1445514,-109042973,-972720637,5894,-2146553368,7742,-1981283468,-400510942]},{"sector":7,"length":512,"data":[-69071336,1445512,1375711683,1392520891,-1977198245,-1073068540,-393583756,616621440,1371668031,1125091923,74694954,1407961090,126505119,-1869610948,-847247755,-1876432096,1965082102,1086715422,1631329396,2101085810,539755127,1954596342,1916877837,2002729990,-2143278078,975626213,1175680260,1976172099,1537104065,-1342130855,-1342016257,39371521,-1245148479,-336526592,13101447,1640183,192151553,1648257,1323892734,-134515671,537048838,-402295808,-780850879,-2145265688,-16771266,113693556,-1140916201,512294912,512229386,1541931032,248965133,-398786373,1122504018,-418973940,1946159362,956349192,705502440,100711168,1275925736,543518313,285260544,1124927720,2124911,1962613480,419478285,1225586920,1919251310,266862708,-1156745989,-420995072,1684949260,7630437,1962607848,654359306,1410127080,-402627999,192215804,-399834949,1766198469,-402625428,259324669,-399507269,1851067573,1701080681,-150965138,537048838,-402295808,1987389581,33752224,-33549562,403061440,-1575652352,12255256,212658197,-1977545752,-1342130216,7333891,671371,141885195,2244155,175260788,788167,1049296897,1223164629,571378448,735195904,504198351,1359654919,2484311,510941535,792065,-401932101,-1041757086,203328288,-402280448,512426021,512294946,283705354,-1359807472,172102773,-134777390,537048838,-386960384,-378263555,1355006011,300417205,-989702144,-393606284]},{"sector":8,"length":512,"data":[367534256,1976434188,-75250695,1949347840,655407665,-1174399512,266863592,6601216,-1174402584,65536010,113152,-634666958,-1057094542,-637273877,809250820,-318110603,-838940812,-972303383,-16739834,973845480,-628424672,-1975258485,509495,-352014013,503760424,1397882880,-56825770,-967156898,-16769530,141917043,-402640992,-504689591,9578122,9569990,1019316736,-972786432,1019412487,-1978895102,-969277116,1157546867,1014164225,-1978501884,-969277116,126530420,1140654568,-352238338,1963146478,7071751,-1645479051,158678588,9578120,-349755416,1948400672,1948466188,1946237960,1963080708,4712454,-2130740503,302001982,1894365556,-1841397505,209059584,3139664,113703797,1476395154,1149948042,1912879617,-11409149,-2013182722,1124567575,-1963157016,-969277116,1021903731,24414975,-1962985751,-1073086140,1291720564,1065372417,-402427104,-1041760256,136316938,184528896,183026624,3270656,51709638,-396694784,-1511519408,1852392970,599392356,-18880253,-401915160,1699875476,1667329136,1769414757,-1174378380,-957807804,187295998,1326087144,1869182064,-1174375570,-1293417706,-1824617730,-385830143,-1226306938,-3872513,-956310808,-2147281658,-655883285,387901691,-1995786776,-956297186,6918,-485586176,952578,-720467200,34507010,51886848,-318099574,2129331061,126501776,343357756,275918892,179327128,1781495,-1547566246,1592459291,1008541416,-2147125929]}]],[[{"sector":1,"length":512,"data":[16979214,91575612,51711616,1968061444,353271813,1195115011,243272309,-2146958571,-553446106,91570748,51711616,1967930384,353271836,645931011,1375142677,51580555,3721,51449483,134793,1968389209,353271813,-838975485,1048806261,1996554267,453428998,-1962934016,-1610612194,279446293,512427124,-2136473600,682101876,512427125,512294928,988282896,-164990430,-2147281658,1676151924,352777728,41166851,251651307,41156635,-1957438229,-402649058,-396683614,1609111198,3336441,-166291992,-2147281658,116787060,1965556501,165603561,1393113576,1668440421,1953701992,1735289202,1953459744,1970234912,-385850258,378210596,-68681003,-484537591,167045378,619702355,116787828,1946288917,-1871713533,270437203,373352448,373090395,-166519832,33756422,-1930930059,476571657,1819305298,543515489,-835725016,2112041,-1190350104,-1360527356,-1155238620,-397344668,-497476018,251706353,-1190603288,-1763180540,-1156811484,-397344668,-497476042,-388895759,1592272016,464381961,108288316,1534348860,1508425451,-153884651,54857354,1398472885,52731985,-930430678,41111711,116837886,1963983637,270437124,1402886144,-1159199884,-1973855738,1958808261,54967046,-386514456,854071163,-402033372,645993480,-196583,51709686,1527018768,1539562119,-326412861,509040209,75416582,-66554171,520595187,1566137951,-1308620606,-1308431615,-571976961,141879316,-1000670325,-1945934538]},{"sector":2,"length":512,"data":[1959136192,210445885,1179007203,3288712,-1964506955,-1340705536,-964471295,-1947706620,529212928,1949615142,-338654692,80118552,1962962152,1459597320,-351998333,80118752,-806763541,7792887,-50071438,92992739,70919753,1048589428,1946157106,121251565,-92215179,-2029423615,8186078,-629804153,-317995778,-100464008,1925851983,-890551867,-1099773397,1207577409,-92225301,-402295807,-1233846186,-629814018,-1276584053,648276756,637695231,1461597439,-1006688536,41418534,641204006,637695231,350762239,-1031093249,-1259828328,1020365569,722435840,-812955654,47517227,-117632654,-100463125,48434827,57855787,-1007136959,1443256094,-521612921,-1010137090,-402454082,-1589442735,-1019543516,-1014300042,-1094515575,-336919797,-352121410,51363558,512483819,-571998174,-1962642681,-1996299490,-1107094754,-890765306,-183047937,-1593157911,295895074,310787,-1847005973,572427027,287213824,128903171,512427123,512295651,-303561965,308996340,-2129276183,268613430,169994496,-1961662488,-385677026,1575490526,186551059,332720387,-1961667608,-385676002,1239946186,253659923,331409667,-1961672728,-385674978,904401846,320768787,330098947,45549303,443809808,1124506856,512480139,300417028,512447232,166199302,-1019521024,-1007091086,-75381768,192348559,41343547,-397223285,-1017510243,1929364968,50063610,1509062,576514048,-1946157251,-352095016,1354993666,112322566,1049320199]},{"sector":3,"length":512,"data":[915079953,76153619,80107088,734956314,83592143,-2025782922,495577338,242416263,57985067,1577547081,-385578920,102692326,495511583,6503711,-873927299,1936278533,1969627243,-402625428,-605354556,-402639942,901511669,4161536,386320067,-639107072,-49887,24500363,-488090685,40888563,48434827,32883073,47779371,-2028041391,-622266112,-1956947965,-1962899690,-1983370294,721457166,486926538,488237212,-400395363,149422165,90236934,1869771333,1701978226,1852400737,1768300647,-402627220,1407780176,1958820853,-91516604,447743774,-234494980,1325495726,1138723663,51584649,512481927,512295047,512426769,-634716016,1441319819,12511475,-1946870295,-1962899690,721457182,-2016703526,1458174163,-1316861,-402393623,-1779953216,82503685,1852404304,1735289204,-1224280320,1946161154,319720204,287214339,1926839043,-719418616,-485586174,1003631106,-1975749671,-1023524089,645079100,222087934,154934900,548412533,-31767832,-1031122238,378142900,-218758397,1510014080,-806623115,686346802,-402099685,-1015799695,-1021282328,990053793,1912803590,320768780,1942174467,85887236,20834307,-1293408141,24963314,8855179,51451531,51453577,512350467,-746126573,44558584,51453579,-384724504,-389871673,-93126385,-386759448,512426318,512295047,-654114031,51584649,-401466904,-1528229916,283830279,-1961894936,-402643938,507184261,1550975761,51584571,1323849335]},{"sector":4,"length":512,"data":[503760626,512425984,-1779956975,51618048,2229817,1347955315,141869066,-972733208,183181319,9960321,-397736844,243336531,16777241,-1961845784,-402644450,-898431812,277801048,1967814,486983423,1072169216,316533245,1374208856,61663236,1330795077,1327512146,1864397941,1886593126,6644577,-972842007,-16769530,-2113938456,-50325210,258599167,1902278,572427009,281077760,-384655640,548467582,-11933360,-380632912,995295043,1946342686,-12088822,57936444,-1980699829,-402644450,-1749348557,203548672,130420085,-75414752,-244186737,-1996449861,1509958686,-1224280125,1962938370,-389810174,-1958542487,-402643946,-169343991,605981455,58976256,8855177,286690131,-633650685,51582603,-633665422,-1073085325,512429291,-634715375,8986249,-1017394293,-1962852120,-150959858,-2028565543,287214336,-1008185085,-389850640,116854684,1049271,250142068,287214577,49080323,2236041,2498187,51451531,1926904642,320244496,1943681795,572427016,639535360,320768768,286690051,1943677699,-880033023,1364448135,276359324,-396666467,512426201,512294946,512295697,837288723,99739918,2228997,2752550,131072,51577617,393220,51053321,51315469,1448170320,-1195654773,440591,-2127066322,1996590908,1913927942,1124335874,1592648259,-1017619623,-1464117158,964879,959941422,688420356,1929656596,-2096854782,-320732477,46735044,1962933123,-721016025]},{"sector":5,"length":512,"data":[-485586174,-720491774,1065559554,638940415,192284473,639052070,57870137,-2096658138,-437582653,-46742522,197233666,53376206,637719814,-108852085,-2094893825,359988985,75026955,225757243,158517307,-935605717,-21429389,210315007,-352074109,1405290454,-352095663,378245169,1380057827,735741778,1539541978,1926835024,8972547,-397225077,1499070519,-1991622309,1107485462,57985291,-370184216,55836482,378229721,1111622371,-634660217,1515965323,74762507,1257194984,-485062326,535380482,-652309505,-634696958,-205962638,1943612161,-2133261510,7742,-397201036,-1252326953,19720192,1314013527,977751625,568852512,18671861,1954112032,695412837,1717922848,-320339852,420380932,-1023409920,-385874968,1048637706,1962868766,-44046077,-990035991,-66930378,-1073042394,-389873291,887624691,-391371244,-24439761,-4603854,-1359807233,92939855,1952201807,1949252616,1946041092,1190628336,342354246,1659438878,22210580,704687592,1310730794,1917132911,1936879474,1970226720,-402627474,-1612119908,224061680,721482216,-1006447330,-2096969418,-847970306,-12811482,-2094610572,1576993916,-436269708,654301928,1962884227,637594548,503520395,-14286123,803734132,16181248,-1224280232,1962967042,4778003,1869771333,-402644878,-1561848822,2112019,-400796696,-437775169,420380947,-1023409920,5302355,-805202784,1342797032,1476473832,-143275778,50667145,1527723752,-401780247]},{"sector":6,"length":512,"data":[-2115502046,325576980,-384529688,-387443871,319875093,-385649944,1048578611,1979645982,322562322,1982080,-1828162560,-402485342,-1013770668,-719439029,-1979026942,1963801607,11987187,-719418429,1358555906,-1883351471,16365825,540847357,-12843404,154927732,1962734561,-561297919,-1017620130,1140841704,2365067,-1090488856,-745865065,-896805077,-5239581,-234414340,1241740718,512489451,-637337566,-484557885,1007448834,1124758797,171706250,977469813,-1595358272,386319881,12255232,-9639936,-401359896,12255460,-10426368,1007927273,1006990357,-1021676517,-385886232,707460914,1313415210,1381123412,1163153493,635961412,-282531329,41081403,1002689415,-2029882406,1464976339,48434827,-819201141,-661907338,-1325612914,1974399501,1006995981,1191277834,1610145675,1610203993,507233113,964035285,1023362954,1258386698,1023362954,1258779917,47521339,229644150,1962886968,507202313,-193527083,126486507,24447548,-719439037,-1962642686,-134032098,1405352387,1224839097,-242484853,1993026382,-49865202,28943603,1121159936,1543255528,-4631613,-1143763969,-634715761,-398324364,-1958020062,1138396107,-957589016,536973062,780845915,-118947437,-1090052599,855376358,-1949791260,26452208,-1073561346,-299112309,1364389419,-1979544415,855805710,-135623982,56252897,-1976695832,-27933950,-3544896,-402294711,65732707,1560342504,507412675,-445251840,190549,-1818180771,-390005247]},{"sector":7,"length":512,"data":[2018115495,-2133708181,197694,484981620,1007127049,1129935885,48438843,-1023520141,1640183,410320900,343214396,-1979665328,51808962,-20839933,-151849272,1490062050,50599482,24430706,419886923,1946158080,-152546527,2400765,41337659,-1992042357,1526730270,990430952,1929383454,12249467,378169579,-1259863292,990349832,1929569054,1947024473,540820309,154944371,548413557,43656842,1354956459,-1262319022,51808768,-2131560957,1482293500,786688736,1074055403,44318336,-2146667519,7742,-974650508,-2146768111,7742,-1444412556,1937783825,-1708750311,-1023497470,126524642,1962784488,507200267,-227147037,-437583125,-1341622207,-1708750304,-2136214782,7742,-829740172,-1962809666,-2012836099,-1908506622,57999106,-1161583117,-1951595558,-657396504,-319095950,-76293936,-486823019,15254509,236862216,-1967557632,-12827897,540813684,154937203,1074012532,44318336,-2146667519,7742,837288820,-2146768111,7742,367526772,-1341986031,-1708750304,-1092441342,-335577623,-402606092,-1749352329,420380928,-402652160,646053483,-327655,-1709885,-401890583,512428352,-1209466141,9943817,2367113,-401991703,-2126250843,1912705019,26131203,2367113,-972422167,5894,45561473,-960299007,5894,45561473,-960299006,5894,45561473,-2117926904,177974,914473732,134218423,322865859,303991296,-63903488,2236043,1929183208,148039877]},{"sector":8,"length":512,"data":[2236043,-386075672,-1175977979,1405351943,2236041,2033350,352765440,-672596224,352765449,-1017446400,2236043,1929180136,-1645718639,-806659320,990053793,1946342662,143583329,512477491,507183138,108266245,1107087336,512226539,-1801453534,973220865,-402426424,-1957430084,-402644450,-1628898124,-42342145,-393155749,922683480,512426018,-919403771,26480266,1843972606,-1661213956,-1644200728,1004434011,1929577758,-61151016,-1950100501,990053662,1946165790,568873973,-1041540344,-1962402840,855835934,-1810986295,48857089,-486788120,-391451653,-1801451516,-1966539263,-1949791512,-402455266,-838927332,512358773,512426757,233308194,-1979981060,-402644450,954730754,-706166006,26517511,-393557762,512477322,367526661,1976434428,85887481,572427011,-66656256,-806618142,50667147,47519371,57989691,-401997080,512427936,512295637,512294946,-1209531643,109242376,-1996449861,-385866722,-745863060,-840414646,990212859,-118262822,9943235,-402643805,611516392,2236041,-1157202200,-1111621481,161998884,922686067,113705099,616366219,-1895698968,-134182138,-393615165,1609060725,-1152814338,-2081947497,1259173096,-1879342781,-394562815,-193723593,2367113,-402126871,512485529,-1006764014,-402592792,233309700,572427015,-80812032,2236041,-402614341,283639969,420381182,-1023344640,-386023192,443869242,1258330043,605961027,-402164736,-193723669,-1662514965,-4986627]}]],[[{"sector":1,"length":512,"data":[-1360488981,-401020673,512431988,1038614562,616414975,1929971944,-401872888,-689372043,312525569,512446464,512294948,113639432,-402653154,512427676,-397213662,110100255,-1571291102,-1528299502,503760389,512491264,378208292,-634716152,-746076298,-83629998,1512048582,-193606914,-402233368,243336575,16777241,-1979909399,-402643938,2011694908,88271111,-1947744024,-402648546,512360476,-1006764014,-1947664590,572427257,-94705664,-2114237720,6414,-397163775,-1142421980,780537,-110303141,-401753112,1405292311,-83463,1542953192,168626119,512475971,-2125791196,1912641531,-12615436,512357492,-706150364,605981446,-75414784,-294518385,98494659,2760331,-1980155416,-1962925538,-385864674,1810431857,4188160,2367115,1913129192,-75414777,-193855089,2367113,-386796568,183042085,572427250,-101521408,-397197966,-1990523492,-973069794,7942,-402213400,48759936,-1961038855,1258300446,9960321,-1024928910,1274311175,9960321,-1226308238,1140093703,2367113,-1157215255,-185925481,-1946626840,605981635,-1329382656,-33393920,9282240,-75414709,829555087,2236043,1928946664,87484495,2236043,-1980147736,-973069794,7942,-402241048,-1749351404,605980928,123725824,-102118798,123201541,-2126265485,1912705019,-1925283827,-1133182976,1140356328,1055428331,-337153529,572427143,-113580032,-429659965,1961244904,-402018298,-389814156,-328007705,1342182048]},{"sector":2,"length":512,"data":[2367115,532105,1967814,79882240,2236043,-46733229,2236041,-16527640,-956265674,-1124037882,-11999196,9111183,2229903,1221208,-972836120,-16769530,1977997032,-81139453,2367115,530059,-1804150229,-397225081,130480393,-889300448,1843983477,59107332,-386201879,-1958479907,605981643,1993026304,-439097331,-117315503,-386276775,-389871951,-1749293627,605980928,86435840,-385887000,512427064,1397948450,1526224872,-634713998,1968950155,-379862238,770179860,572427012,-130095104,99156851,28920579,1007127040,1258452234,-390067647,-1578568307,215476235,-402549600,-437714478,1007127042,1007055904,1006793737,1592312831,-145233691,2365067,-746071493,-521620366,-401574657,57869845,-402588183,183040115,-369593594,512426229,99090466,-385649672,65536229,-92542725,585680107,-149165851,512476043,-667221980,-1041648525,-451942400,2367115,1977940200,10152195,9960321,-1847000203,-1998040320,-401902081,-1014237459,-667200677,-2125788046,1912641531,-9312248,-346295180,512318321,113639432,-402653154,312476496,922701824,512426018,-857210846,-1962052869,-1962925026,989857814,-118787110,2229903,1221208,1088986195,503760386,512491264,1486684168,1263545458,9960321,-1125644942,1509223415,9955713,1363348451,1509396712,-501217338,512312309,243335204,16777241,-2125784085,1929418747,-14227197,1979662208,-141957115,512355563,-2132279260]},{"sector":3,"length":512,"data":[62318839,-1023069976,1408726760,-1946796824,-667198525,-924259469,-387549698,-152307869,-385875272,28894534,-448730880,-385875016,-1259805382,2353401,45549303,91488288,1964091624,3598341,-1662390669,-107353863,-402650904,-76349400,-1963356439,838868238,85887981,125061379,1928761320,-1007033853,48438923,-159192893,512427123,497025763,-1811531264,-30968063,973085958,1946161670,42967780,48438843,1357383027,-2134640393,7742,-840432780,-151590903,-1007041544,-389510576,-346488919,1364414680,-1006217386,-1945961162,1959136192,119408203,116853424,262169,512427124,-1946353630,734759931,1090704654,1202647631,-1957168057,-485585925,-473224446,1336865283,-1960442023,-49916,-29552012,990409983,990147265,-2096598329,-420805690,638577656,-1576909686,-1866792284,-1700604158,1594358018,1482381662,-7739197,-138215053,268613382,-2146732800,7742,837288820,-145702135,67115270,991458560,1912803614,320748352,-2143653117,7742,1172833140,-1590105335,-1891827708,-1591970303,104529954,494011153,1023411873,292946319,989864609,1996690182,1003547404,-351898920,1926773735,507412678,57933824,1476974568,507412675,292814848,-1974119856,-390005051,-397806089,1516107574,29082456,-194713600,-385305624,-140768791,33560838,1343255808,-397258413,57868311,1526175464,-1655153831,-496244541,1929381608,-142219261,646010307,-16842727,1642113,113704962,142]},{"sector":4,"length":512,"data":[-1560079967,329318404,434947,2242187,-88681934,503355327,-1229063161,440591,-1959901883,926613598,108394208,48447369,1017966315,1010398221,-1341819393,-502273921,-3998038,-33518074,1011971278,-1966377719,51284674,-20905469,-167725880,717881073,-1330154292,-1023497473,812961534,-1427376158,-919396176,-1426862454,2367115,-2147402776,7998,2033350,-1609665025,-922877923,1181242,1576534898,-68421181,-386659352,1766650726,1948280174,1814065007,543649391,1380130861,1936615712,1702130277,1307050084,26196979,-386682648,552139253,39971071,-689387541,-210507549,419886915,1962934784,-1830239487,244011763,-903151474,2236043,1793590243,421954033,1509948672,1049303267,-1749155806,-66642432,1962884268,1964653819,-1440698366,854127330,-745847821,263765333,771753657,-1962903925,-1879342820,990869249,-1962772774,-397258278,1499132733,1162157193,-1587682846,295895044,434435,-1023208541,-8460205,48438923,-1158489624,-754777863,378209395,-396688679,378270594,-2098724139,-1075293197,572426738,-886351616,7923793,1509835752,-486500421,1124567561,-109772996,512358370,585826340,1357132432,-13440941,-225384357,2236041,-1748795045,605980928,452608,-385859096,-1749352948,-1827763712,-1965413631,67513027,975073795,706114241,46202561,-1576860666,-1818230012,-1563886079,-1528233965,1286901,67502787,50635267,1246918,-174987008,1982080,-1947634688]},{"sector":5,"length":512,"data":[-1593637602,-1019542827,94569846,-1176990973,507052033,57999394,1996531433,572406594,-402229760,-347999492,85887476,302433795,113639680,872349727,26517696,477282619,49906505,29038199,-237443072,103213137,-502824216,-108832264,-1023314175,989909737,1929388574,-225253368,-348038286,1978469106,-1810462123,717326849,-17790270,-29199674,-2146798130,-16771778,1693123445,-2134442352,846660350,779338282,704650656,-1574471994,512426013,-292945147,-229709742,-49616813,1976434267,85887476,-889300477,1185416,302942403,512475904,-1605827835,36438420,-1047867254,-930430422,-838991245,-487449624,85887483,4843523,2033350,-16193025,-1593849880,-922877923,104467828,125043092,57985278,-1962926686,-402455266,512356844,-1511521531,26517756,-1946446359,-1979675850,76164647,141836604,57984058,-101520570,486983363,1405288704,-2130667589,1946259451,-12615668,954729589,-347911182,9944046,1065353649,-1976666871,51808961,-20839933,-167725880,-20804878,180628168,1343648960,-235935663,-968664999,-1040253177,1945827712,1976106508,1136787178,1929050496,-195434299,704746400,-1962929402,-2130697186,67115278,-231282688,1648257,-1017380869,218169644,38469634,150784,1946157683,38273026,-16691200,196353,1358955081,38207490,151296,1962934903,42205186,-16681472,-16646399,-16646399,-16646399,-16646399,-16646399,22151170,33489407,50266623]},{"sector":6,"length":512,"pattern":0,"data":[134304512,-16646399,-16646399,-16646399,-16646399,-16646399,-16646399,-16646399,197328641,-1023475439,297928977,33489172,33489407,33489407,33489407,33489407,33489407,33489407,33489407,33489407,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19660800,331419073,29426881,96536257,398530753,314645185,297927617,68272659,-1039855166,297932817,51495442,-4063295,-1055452734,34718463,-1039461950,297930769,823247408,-1036906046,381760273,432082625,-1055321662,-1056456428,34325119,-1039463486,197268491,806076936,-1036973118,197276171,51102259,-1038742590,197269771,386646546,197328833,67879440,264374721,336577033,-4063295,-4063295,-1039396414,297928209,-1056128767,319537680,-1038413374,12721425,252691038,-1039790142,197268751,353092105]},{"sector":7,"length":512,"data":[0,0,417208221,425400565,372775300,373822980,386537095,363402971,380835251,389027524,76354975,296223885,195036301,419498922,193071992,194382732,412358087,444275351,456792830,188947277,420875046,184814447,186387223,231934753,256052624,200019049,220136589,435749241,366941651,76350605,76350605,123346417,129894318,472908401,167709179,473701430,368186859,246156966,1529626172,724184669,1027223341,2105223464,660349790,167714875,1094795585,1094795585,1701013836,1684370286,1952533792,1634300517,1344286316,1919381362,1344302433,1701867378,544830578,1109419631,1095520847,-953269170,-821912314,-1626945754,-953748478,654483718,-1559837145,2124480258,2133232131,16854275,-1610441821,646579068,-1767701635,50128898,1918975171,2004499462,-1021301758,771770600,1701990432,1008759667,1044599621,1501184,-109765828,1364414659,-11118766,1577229590,1532582495,1364443992,-11118766,1577230102,1532582495,1364414659,1347835730,44111615,1499094878,1438865499,1585966219,777034754,172165002,-402295616,-202637349,1476550279,1438866845,1585966219,781996034,172165002,1008039104,-402295936,132841700,604033000,-387419009,-471072849,1585928349,1354980610,623491923,1397753323,-64625733,-1073042394,-738261132,-335573272,-1017619470,-388877486,-1017511934,-1090103466,119407269,-1962929688,-2955017,-1017225465,-388877486,-1017511934,1381061456,102651734]},{"sector":8,"length":512,"data":[-661971186,-919339951,-1272550722,-20958713,454831040,-143457708,1410538499,80118530,74828030,74762507,1101672452,-579482370,74828043,1101672624,1487585331,-1054138618,1329663862,-133957749,-1952123907,-215961400,1595869098,1532582494,1111540568,-2036334577,655360001,65536000,6553600,655360,65536,1048576000,1946157732,-1543059960,1692991490,1048625921,1946223268,-1543059720,1273561346,-1539407871,-378273022,44304070,-1818210301,43688450,1048626008,1946288804,-1543059756,-1605369342,-1700658542,-2134681598,-16604354,410386352,119408158,60038798,-1054933210,1025443586,11599871,-922877324,-1023409883,1962825448,44278011,44238534,1979661567,503717407,-1809936889,520037891,520553157,209043466,44246664,-469106512,61866613,1489232946,1381322842,1476449256,108334396,43390602,171729131,-956429707,43791930,1038832758,175441980,43390522,-889304972,121390315,246679669,281935666,-1269678357,-1174457847,512360449,281871002,985857626,1979882262,-1776907743,986119682,1979882550,1389297173,-1979317832,-1962763714,-1962764786,-855467242,45373968,281935666,-661929123,24464195,57581763,-1073486798,-1073496061,-725601712,1967675402,1407642615,-397061551,112459836,1049231792,-292945254,43388554,43718283,41283130,281919538,1532582493,1381061571,1501269,-655685708,43098192,1476565666,-1868541757,43688450,62178136,281935666,1381061571,-858027]}]],[[{"sector":1,"length":512,"data":[-1979318088,-1962763714,-1693021494,1561382146,-1017423526,58761301,74841916,281874356,43386566,-1761163776,121372674,11751351,1946387134,59686432,376701500,41026620,-5045328,225706812,20719543,-1070463116,-2000813901,43557379,43589256,43728520,-1868364661,38046466,-1962765661,-1801255868,-854608894,-1744422384,-1610124286,-466484584,-379776819,1397817187,-729131694,369356934,45351574,281935666,1482381917,-1974316861,-855264048,-1017619935,134005992,1397801728,1465274961,1030406,1558710155,989626620,1128465525,431229163,1090789837,-1993983308,172443397,-2144045587,796154943,1949253504,96871978,1202997084,-360656758,519539520,567090950,638874143,1946172800,1031808526,1191408640,-970524693,-1975034875,-66459641,410132540,1459620537,103368895,-218364146,1952384942,-2010758393,-538228987,378406,1516134151,-1017619623,992750370,1530805564,-1910604707,-10032934,-1023314657,-1006238178,520320822,321692,-1021376611,116064690,48956082,-919350734,-1073085046,-2142824332,-193723654,41233980,1547489163,792462452,-919345547,-921967893,-771094668,-108327307,76162639,1195771272,-176832502,-1707100989,259588098,-1707035453,259588098,99287666,-117439768,1052004547,-1017634355,-851332016,163797025,151587081,151587081,151587081,151587081,151587081,151587081,151587081,-2012673783,134744072,134744072,134744072,1191708680,1195853639,1195853639,134744135]},{"sector":2,"length":512,"data":[134744072,858927408,808595760,875704880,825242933,858928688,842019120,134754864,134744072,319951120,269619472,336728592,286266645,319952400,303042832,134746640,151521288,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,151587081,101255433,1448235344,119428439,-1962728258,-167768002,268637446,378212212,-1119223806,995098623,-351438854,1477457,113920,1182005819,-466965252,1172555915,613076483,1946287232,839223824,1960814788,1006437128,-336431622,116807461,1967129365,352777740,175440899,-352289816,13690888,-1595407381,1596421120,-96731901,-1946565003,-352317410,352777817,125075459,54869632,17069312,-1962930130,-134213602,116801771,1950417685,4078375,-1977519360,788474397,701728758,1539339600,507202387,208797698,-14016630,-746064338,-1418375127,1050255,116842379,1947206421,270437124,1599993856,1482250846,1364247303,-836020654,-685043340,192399931,1957098492,-8617978,1593209857,-1017620134,788487562,701728758,973304848,17613760,1448300739,1006578428,991786225,-1407748870,1946238023,-12242190,-542577292,1569327733,-3348225,17621364,-1017619618,1431720784]},{"sector":3,"length":512,"data":[-247726294,-96771980,-1392747916,1946238023,-12242418,-542635660,-1545057163,-1153075713,-359978541,1001128118,772569073,1947149527,1959148277,1003522801,-1977649923,-684833019,-210497756,-277559750,326627643,33520768,-1036385164,-259387275,-247739157,1330054774,49004603,-712310516,1482382941,606741699,36316202,1157694731,1330923844,82,1429012666,1465314443,-975664098,76416630,-1912173522,44941100,100727784,60072735,84084641,614662295,47554816,-1962871576,-11204026,-1588568622,-654900523,-1593776920,-1758658524,50832128,-1106870588,-974650707,1595889664,-1161077410,-1477759672,-349351238,760658594,1840946667,-1164383443,-1813303921,918882078,1153893083,-1943946232,1807682124,1095939,648344572,57620165,-1190954049,-1527578599,113712902,60162773,47652492,48826055,512491566,-1348402453,-643610622,-139204606,-1009550872,48694983,-270008320,1508426707,119456724,57620165,-1190954049,-201588711,-400619868,-1326843206,516983763,-717321465,209584898,48434827,179359531,74730236,-109793550,103532427,-1950154027,-717356040,-1962467838,856338632,-230490670,-1946454866,1448199106,12499287,1604645884,29579614,16966406,16978182,16978694,16963846,16975110,16966918,16976134,16976646,16977158,-1006432506,-1945961162,1960709059,478881301,1962933123,-17071347,19268468,63341316,-2084312085,223550,1223164789,1048822775,1962935145,-145823739]},{"sector":4,"length":512,"data":[106374123,45956804,-16414170,1946380558,1360942610,57216651,-141877498,-1527514042,123608921,505332575,-1809936889,-14266365,-1912419042,1492159426,505332511,-1809936889,520037891,-1021377811,-1912136162,637768734,49356543,1448461087,-1909580201,-13857250,1583292370,-1957313699,105286636,24951389,-1957305109,1465261804,-1962508604,1451952734,512634380,-1175966578,526278650,52061,1869505089,1818324338,1869770784,1835102823,1919251488,1634625901,1852795252,2573,0,0,0,0,38816,0,0,1968439296,544170610,1668505936,1126198369,1768320623,1634891111,1852795252,1818838560,1712229,6423040,73865,496968124,451674114,204937,545856312,722075652,336009,545859840,18087942,467081,545849622,18350088,598153,545856678,18874378,729225,545857836,724369420,860297,545860432,692453390,991369,545859980,445448208,1122441,545856422,0,218169344,436279058,1920291840,1344302946,1633907553,1766858860,1277193059,544502633,1701603654,436214304,606741504,36316202,1225065732,536888644,1936876886,544108393,3485237,16711696,2,1572889,131073,142219,730791938,131075,274257,793968642,131077,405333,794624002,131079,536415,794886146,131081,667479,795148290,131083,799659,1024196609,131085,929505]},{"sector":5,"length":512,"pattern":0,"data":[786628612,262159,1060583,1024262145,65554,1252152,730660866,131092,1376540,18481154,131094,1518483,1024327681,131096,1650535,795017218,131098,1781595,1024393217,131100,19672921,747831364,8388909,19803351,760676480,8388911,19934679,820510848,524593,20066027,787677192,524595,20197115,1017905232,8388917,20328369,736886788,5243191,20454970,743374916,196607,65783,1611727586,1179650,204426,1601699993,3538948,6561436,457900044,65637,6691671,458817568,2097255,6822778,1562837072,196607,247,0,858927408,926299444,1111570744,1178944579,0,120466741,1465320027,770]},{"sector":6,"length":512,"pattern":0,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,545850488]},{"sector":7,"length":512,"pattern":0,"data":[]},{"sector":8,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166723584,172493303,177146532,185993998,68382,131088,262159,524302,1048589,2097164,4194315,8388618,16777225,33554440,67108871,134217734,268435461,536870916,1073741827,-2147483646,1,226692420,227020150,217320840]}]],[[{"sector":1,"length":512,"data":[216993038,16518332,15990920,9175293,16646388,15990918,12845310,16646388,15990916,13631740,12845300,15990784,6422783,16253172,15991000,9240831,956236020,16003327,9386239,821952756,15991038,553001214,821952756,15995126,285159679,822052084,-2097929985,8388860,12976360,15728644,11010302,16253168,65680,2556135,16711681,65751,13107455,16711684,65737,885914879,-50395676,98842829,1020133375,-64036,84032973,13435135,16712962,65740,13500671,16711681,65691,15401215,15729406,66977904,14680316,16712702,50069737,15204607,16712956,49938666,10092799,15140090,38,15859966,16187392,16842947,12714231,16711939,16842959,181731326,16646146,14811244,7209214,16646368,14549158,10748158,16646366,14680236,11403518,16646370,14811306,101711871,-956366846,98319,6291710,16646145,65788,15991038,16646145,65688,15466748,16515073,131300,16253180,16515073,65692,5243120,15728641,65600,10486012,15073498,65542,12583166,956170482,15335622,16136446,16580842,15073385,-1357905921,16580836,15597672,11534576,16711916,240,14156024,244,65536,0,0,539885568,1701990432,-14650509,1129530627,3015935,1126178862,1769238127,1063613806,67053600]},{"sector":2,"length":512,"data":[788856665,-11664385,452995332,458119424,538979840,-11402241,1920230660,1919885433,1090780960,1868694783,4158578,1786194,1713401678,543517801,1701667182,1850277934,1768710518,1919164516,543520361,1679848047,1667592809,2037542772,1818838528,1919098981,1769234789,1696624239,1919906418,1818838528,1920409701,543519849,1869771365,1766195314,1663067500,1702063980,1920099616,1174434415,543517801,1914729321,543449445,2037149295,1381323776,1210994498,1409306700,1329746517,1396789280,541868355,1347175752,1279870496,1107308101,1212227705,1196433452,1464672300,1111695404,1245978668,1263542316,1851858988,1464279140,538451968,1635151433,543451500,1634038338,1768910955,2126958,1224998688,1852245247,744845935,1157889824,1634862335,539780467,-12385281,1634036740,1818304626,1633820780,-14668700,83841795,544237931,543976545,778330466,1162037504,1224743763,1919251310,1851859060,2036430713,1869566976,1851878688,1919033465,1886085477,1953393007,538968179,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,538976288,1124081696,1948741217,1852401184,1768300644,2123116,661545283,1667309684,1936942435,1867382816,1852121204,1751610735,1835363616,7959151,1095651150,1345209677,536892225,1735357008,544039282,1836213620,1952542313]},{"sector":3,"length":512,"data":[738223205,1852402720,1869881445,1868767343,1701605485,1428160632,544367987,1634038370,539754603,1735357040,544039282,1836213620,1952542313,536896613,2125417,1851867936,1713402919,543452777,1920298867,1713399139,744844393,1953391904,1847620197,1847621477,543518049,544165376,1969382756,1852383335,1629515622,1919950964,1634887535,1953701997,745828961,1853182496,2037276960,7954807,1679847246,1735746149,1718511904,1377840239,1629515381,1635219822,1867382905,1685021472,1701257317,1634887022,543450484,544370534,1936287860,1852402720,1917845605,1634887535,1868832877,1847620453,1663071343,1635020399,1713401449,543517801,1297040128,1128616019,1397703680,1920099616,1864397423,2019893358,1953850213,1124085349,1948741217,1853190688,1965056288,7629166,544173908,2037277037,1818846752,1835101797,1124103013,1948741217,1852401184,1480925284,1768300613,1124099436,1948741217,1634692128,1480925284,1768300613,1375757676,1140869376,1442858496,1275085312,1325420032,1291863296,536887552,1869903169,1769300512,1763730540,1919950958,1701996399,757101427,1124335392,762081908,537198403,-14650769,1920221955,1916939628,-9739931,1869881348,1769497888,1310720116,1310750565,543518049,1850023936,544367988,1701603654,1835093536,536879205,544695630,1701996868,1919906915,1342185593,543716449,544501614,1853189990,1126170724,1634561391,1277191278,543518313,1634885968,1702126957,2126706]},{"sector":4,"length":512,"data":[1852785440,543648102,1701603654,1226833952,1970037614,1142973796,1667592809,1769107316,2126693,1667846176,1766203499,1310745964,543518049,1682251776,1919906921,1650545696,2053722912,536879205,1835627088,544830049,1701603654,1110310944,1392528193,1668445551,1869422693,1768319332,539780197,1969382770,6581353,1651341651,1847618671,1713402991,1684960623,1698963456,1701734758,2035490916,1819239021,536879219,1702129221,1919950962,1684366191,543519349,1701667182,1394606112,1801675124,2053731104,1852383333,1954103840,2126693,1852394784,1836412265,1634027552,1767055472,1763730810,2034376814,544433524,1632444416,1970104696,1699225709,1394634849,543521385,1109421673,1936028793,1159725088,1969448312,1818386804,1766072421,1952671090,544830063,1649352704,1952671082,1919501344,1869898597,1936025970,1428160544,544500078,1701996868,1919906915,544433513,1968447488,544170610,1668505936,1142975585,1667592809,2037542772,1917124640,544370546,2125417,1969365036,1969430644,1852142194,1684349044,1713402985,543517801,544501614,1702257011,538979940,1702256979,1917132800,544370546,1919181889,544437093,1918981120,544499047,1919181921,544437093,544501614,1853189990,1411383396,1701278305,1684086900,1936028260,1868963955,6581877,1869771333,1409294450,543518841,1414092869,544175136,1970562418,1948282482,1968447599,544170610,1668505936,774794337,1850277934,1953654131,1936286752]},{"sector":5,"length":512,"data":[1953785195,1852383333,1769104416,2123126,1802725700,544434464,1953067639,1919954277,1667593327,543450484,1679847017,1702259058,1426079776,1869507438,1965059703,544500078,1679847023,1702259058,1140867104,543912809,1847620457,1914729583,2036621669,544106784,1986622052,4202597,1953067587,1818321769,1936286752,1919230059,544370546,1679847023,1702259058,1140867104,543257697,1702129257,1953067623,1919230073,544370546,1679847023,1702259058,1392525344,543909221,1869771365,1852776562,1769104416,1075864950,1802392832,1853321070,1684368672,1948279145,543518841,1679847017,1702259058,1392525344,1869898597,1869488242,1868963956,543452789,1679847023,1702259058,1342193696,1953393010,1864397413,1864397941,1634738278,7497072,1953067607,1634082917,544500853,1679847023,1702259058,1375748128,543449445,1819631974,1852776564,1769104416,1075864950,1918978048,1918990180,1634082917,1920298089,1852776549,1769104416,1075864950,1684095488,1835363616,544830063,1734438249,1718558821,1413563936,1952801824,1702126437,1917124708,544370546,1701012321,1852404595,539238503,1769366884,973104483,1684955424,1701998624,-14650509,1953383683,83849829,1701345056,1701978222,779707489,1633099776,543712116,1968119808,1953853556,1159725088,544500068,1699225600,2125932,1919243808,544826985,1917132800,544370546,1917001728,1667855465,1159752801,1919906418,1126170656,1768975727,1735289196,1226833952]},{"sector":6,"length":512,"data":[1919903342,1769234797,2125423,1818313504,1951604844,543908705,1701729536,1667592312,543450484,543452773,1713399407,543517801,2125423,1635151433,543451500,1718513507,1920296809,1869182049,1768300654,540697964,1851867904,1663071271,1952540018,1124081765,1948741217,1769109280,1948280180,536879215,1397768515,1310720032,2116949,1380143904,541871183,1986939136,1684630625,1818585120,1768300656,2123116,1868787273,1667592818,1702240372,1869181810,1718558830,1818585120,1768300656,2123116,1884645200,1147621423,1733296238,1409314901,1830842223,544829025,1701603686,1310720115,1830844261,543912801,1984241664,1635085409,2123124,2003127840,1818326560,2123125,1936020000,544500853,1851867904,1646294055,1869422693,1768319332,1107321957,1981834337,1702194273,1277173806,1818322789,1851879968,2123111,1919252047,1953067639,1107304549,1981834337,1702194273,1277173806,1818322789,1919903264,544498029,2021160994,2037987960,2259321,1869771333,1634934898,1735289206,1667854368,1768693867,1157657715,1919906418,1986097952,543649385,1718513507,1920296809,1869182049,1377828974,1835101797,1330520165,1162690894,1277165600,543449455,1701603654,1835093536,1224745061,1919251566,543973742,1869771333,539828338,1634036816,1914725747,1919905893,1869881460,1919894048,1684955500,1769497856,1919230068,544370546,738205757,1852405536,1869771365,540876914,1920291840,1344302946,1633907553]},{"sector":7,"length":512,"pattern":538976288,"data":[1866661996,1769109872,544499815,539583272,859322673,959520812,1646278968,1866596473,1851878514,1850286180,1852990836,1869182049,745300334,1668172064,1816723502,1634166124,1768300652,1847616876,979725665,1699872800,1696621665,1919906418,1869881344,1634476143,778397554,1918115872,1633906293,1426089332,1818386798,1869881445,1701867296,536879214,1684104530,1869365792,1176529763,544042866,1701603654,1461714976,1702127986,1869365792,1411410787,1766203503,2123116,1111565358,1178944579,1246316615,1313688651,1381060687,1448432723,1515804759,858927408,926299444,6240568,544501582,1970237029,1914726503,544042863,1763733364,1919251310,1702109300,1308652664,1696625775,1735749486,1869750376,1948282223,1684086895,1635197028,6841204,1684291872,1952536352,2123875,1768178976,1633099892,543712116,538987264,1229210880,542265172,536879130,538976288,538976288,1950556192,1110273138,1801545074,544175136,1953068401,538976288,538976288,538976288,1767984384,1768300654,3827052,1886220099,1852402793,1409301095,1818326127,538976288,1701603654,1852394496,1663071077,1768975727,979658092,538980384,538976288,3153952,1767994945,1818386796,1701650533,2037542765,536879162,1344282656,1936942450,2037276960,2036689696,2105376,538976288,538976288,538976288,538976288,538976288,538976288,1936028240,1851859059,1701519481,538976377]},{"sector":8,"length":512,"data":[538976288,1967325216,1852142194,1768169588,1952671090,544830063,1124081722,1701999221,1713402990,543517801,538976288,2112032,1701603654,2053731104,538976357,538976288,540680224,1397572864,1634956576,538994023,538976288,975183904,673185824,980967757,1766588448,544433518,1886220131,1684368489,536879162,1886220099,1852402793,1869881447,1936278560,536879211,1886220099,1852402793,1869881447,1835355424,544830063,1394614272,1701012341,538997619,538976288,975183904,1126178816,762081908,1634038338,538976363,975183904,1685013248,1763704933,1869488243,1986076788,1634494817,778398818,1852776448,1936286752,1763704939,1701650542,2037542765,1936269312,1634038304,1948285284,1970413679,536882798,1914729321,1768844917,3041134,1935763488,1836016416,1952803952,1914725477,1768844917,3041134,1954112032,1124103013,543515759,1702521203,538976288,538976288,538976288,538976288,538976288,538976288,1952531456,1769152609,538994042,538976288,538976288,538976288,538976288,538976288,1392517152,1801675124,2053731104,538976357,538976288,538976288,538976288,538976288,538976288,1852394752,1836412265,1634035744,1769152624,538994042,538976288,538976288,538976288,1291853856,1835628641,1746955637,544235877,1702521203,538976288,538976288,538976288,538976288,1853182464,1835627565,1919230053,544370546,1701080931,1342185504,1919381362,1696623969,544500088,1701080931]}]],[[{"sector":1,"length":512,"pattern":0,"data":[538976288,1381323776,1412321090,19536,0,0,-641679398,-1262242876,-641678654,-1262242876,-641678653,-1262242876,-641682238,-1262242876,-1127695415,-1177765171,-641682237,-1262242876,774766850,-65490,340852737,0,0,0,5224,0,0,341573632,0,0,0,3026478,707657770,65536,-15118336,255,0,0,0,0,-167419648,2132249,-1610612736,673220891,2069715753,574504061,673654562,19474986,-1994776831,-1994776544,553713952,572557594,18909466,-1994775807,-1994775520,620822816,639666458,18909466,-1994774784,-1994774496,687866144,706775322,35686682,-1994773760,-1994773216,32,0,0,16777216,-256,255,16776704,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,5199,445582339,450830473,1095442569,1097859072,444923904,1099767945,0,0,0,545856015,545856678,-65536,0,1117388800,1125253120,0,0,0,0,8]},{"sector":2,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,439287808,8329,1396789294,65536,1296367616,1482184781,12376,1330511873,1162690894,-65536,0,0,707002368,639642148,606479910,-201317334,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16776960,256,825229312,892613426,959985462,1145258561,973096517,0,1431568394,776946258,20564,293666815,297472419,301404632,303501784,306909741,310121063,313070227,314905048,453841638,131072,-16776449,37486594,196352,1073742399,37552130,142592,1124074093,40894466,148480,771752467,35717122,137216,1560281706,40632322,139264,1107296833,39911426,156928,805306942,40108034,157184,1610613343,16646146,131063,196596,-196616,-131083,-983068,-524303,-2031649,-1966115,-65546,-1900561,-1245203,-1441814,-1835029,-1114136,-1638425,1208025052,1280,402739200,1258291456,33559298,67325184,852736,83892996,17385216,1325402368,167773706,302729472]},{"sector":3,"length":512,"data":[1358957312,201327372,885760,527990,106037256,117920512,1640192,486542876,1190400,939528989,256180244,1132032,593978,554631200,1441791,-2080369033,393543702,1537536,1023475293,-197394187,16531456,1057023085,-264044296,15822848,1778448196,-295304970,15416832,1610671967,-362741530,15548672,1677782082,-379256600,16464640,1812003432,-585039633,14553600,771809043,-518520608,14888960,788587040,521601054,16592128,56574,1917695,0,0,65535,0,0,0,65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,131073,262147,393221,524295,-65536,65535,-1,-65536,65535,-1,-65536,65535,-1,-65536,65535,-1,-65536,757137407,1869357101,1713398881,543517801,2108717,0,0,0,0,0,0,0,0,757932032,1634692128,1768300644,757097836,8237,0,0,0,0,0,0,0,0,539831584,1684107116,1818846752,757932133,32,0,0,0,0,0,0,0,536870912,1814048045]},{"sector":4,"length":512,"data":[543449455,1701603686,539831584,0,0,0,0,0,0,0,0,757071872,1869357101,1713398881,543517801,2108717,0,0,0,0,0,0,0,0,757932032,1634692128,1768300644,757097836,8237,0,0,0,0,0,0,0,0,539831584,1684107116,1818846752,757932133,32,0,0,0,0,0,0,0,536870912,1814048045,543449455,1701603686,539831584,0,0,0,0,0,0,0,0,757071872,1869357101,1713398881,543517801,2108717,0,0,0,0,0,0,0,0,757932032,1634692128,1768300644,757097836,-771743699,941557022,-1642108129,69194015,1780496160,1409286176,1329746517,1262702638,707657728,1347694080,1381323776,1412321090,1431568464,776946258,4932432,2097169,2949136,742064128,1044130621,1566253692,1056973312,6029354,116,1024,1040,1125,1159,1192,0,0,0,0,1,1672806400,65536,65536,2112000,2097159,45,720896,0,131073,0,131072,1310740,131091,1179666,131073,327685]},{"sector":5,"length":512,"data":[393217,458759,393223,524296,393224,589833,589833,655370,655370,720907,720907,786444,786444,851981,851981,917518,917518,983055,983055,1048592,1048592,1114129,1114129,1376277,393217,1441814,1441814,1507351,1507351,1572888,1572888,1638425,1638425,1703962,1703962,1769499,1769499,1835036,1835036,1900573,1900573,581902928,591930107,599663460,606348302,591930417,613688356,581837998,618734793,622535938,631579965,643180008,646456149,658974431,669984666,681912415,1174667040,755302193,1886152008,67051552,83834182,1869568557,-14671763,-13220349,2001939716,1751348329,67051552,83834694,1634882605,538994019,944112639,1395459327,544236916,1174667040,755302201,1701536077,67051552,-13618874,1699556612,536900974,1398670335,1278018815,544499301,1577320224,755302212,1751607634,-14671756,-12231165,1884630276,67051552,83843166,2003780653,-14671762,-12493309,1867001092,538994029,1180566527,1160578303,536896622,980708417,1174667040,755302193,1953718604,1818585120,-14671760,-13416957,1766862084,538995555,910558207,1395459327,544235895,1174667040,755302201,1886220099,543517801,1476656928,1160578303,7629176,1174667040,755302193,1886152008,67051552,-10259643,1648438532,7631471,1577320224,755302227,1952867660]},{"sector":6,"length":512,"data":[67051552,83838046,1734955565,538997864,1197343743,1143801087,538995813,1214120959,1110246655,1936417633,1701011824,67051552,83843422,1818575917,1852402720,-14671771,-11379197,1699884292,1919906931,-14679963,-13548029,1699228932,538996844,877003775,1311573247,1830844261,543912801,402915104,-15001063,1749232900,1702063983,-14671840,-641451005,1395459327,1667591269,-14671756,1668498691,1093469439,1953656674,-14680032,1953251587,-13547987,1632382212,1746957427,7367781,1174667040,755302193,1886152008,67051520,83833158,1818576941,1852383344,544761188,402915104,-15066343,1766862084,1948281699,1667854447,67051552,-2505668,1866935556,544175136,1768976244,-14671773,1668498691,1160578303,544500088,1886152008,67051552,755302211,544503107,1632641062,6648947,1986089760,543649385,1953064005,1176531567,543517801,539893806,1277165614,1768186223,1159751534,1869900132,1766203506,773875052,773860896,1632837632,1735289206,1667846176,1766203499,773875052,773860896,1632837632,1735289206,1852785440,1969711462,1769234802,1176530543,543517801,539893806,1277165614,1768186223,1344300910,543908713,1701603654,773860896,536882720,1684107084,543649385,1718513475,1920296809,1869182049,1766203502,773875052,773860896,67051520,83833158,1818576941,-14671760,-13285885,1868180740,538996079,910558207,1395459327,1668573559,-14671768,808535555,1294796031]},{"sector":7,"length":512,"data":[544566885,1224998688,83850094,1684291885,67051552,-9673404,1698966788,1702126956,67051552,-2505668,1682255108,1998615657,1751348321,67051520,83838302,1851871277,544240928,1577320224,755302232,544104784,1853321060,67051552,83841886,1851871277,1717922848,-14671756,-12296701,1632644356,1769087086,7628903,1174667040,755302193,1886152008,67051552,83834182,1869568557,-14671763,-13220349,2001939716,1751348329,67051552,83834694,1634882605,538994019,944112639,1395459327,544236916,1174667040,755302201,1701536077,67051552,-13618874,1699556612,538998126,421004287,83827227,1851871277,-14680032,-13548029,1699228932,538996844,421004287,83827482,1919111981,543976559,67051552,-2505668,1767255300,1663072101,7105633,1174667040,755302193,1886152008,67051552,83834694,1634882605,538994019,944112639,1395459327,544236916,1174667040,83832881,1852132653,-14671755,1111577603,1127023871,1701602169,67051552,-2505668,1984244996,1635085409,536896884,826672127,1210909951,544238693,1174667040,755302199,1667330644,-14671771,-13089277,1951608068,538996837,826672127,755302192,1970169165,67051552,-12435116,2034445572,543517795,1006894880,83876292,1635140909,1952544108,-14671771,83827203,1919896877,1702109285,536900728,826672127,1210909951,544238693,1174667040,755302199,1667330644,-14671771,-13089277,1951608068,538996837]},{"sector":8,"length":512,"data":[826672127,755302192,1970169165,67051552,-12435116,2034445572,543517795,1006894880,83876292,1886339885,-14679943,-13548029,1699228932,538996844,927335423,1412236543,1701011826,67051552,83834950,1702122285,-14671760,808535555,1294796031,544566885,1409548064,83837505,1668891437,538994028,-1002699777,755302361,1768189773,536901990,826672127,1210909951,544238693,1174667040,755302197,1836019546,67051552,83834438,1769427757,543712116,1174667040,755302199,1667330644,-14671771,-13089277,1951608068,538996837,960889855,1294796031,543517537,1174667040,83832881,1852132653,-14671755,83827203,1919896877,1702109285,536900728,421004287,83827227,1987005741,1969430629,1919906674,67051552,-10259643,2017799428,1126200425,639661173,1935757344,1830839668,543515759,1107558176,1110246655,1852401509,1953850144,67051520,437983512,1294796031,543520367,1936880995,538997359,1933902847,755302243,1953069125,1953841952,1344284192,1702130529,1685024032,-14671771,83837443,1734689325,1663069801,538997877,-1002699777,755302361,1953718608,1702109285,29816,510727959,387927575,2132770583,1886396238,7434255,1887403776,28784,1886650368,1325400095,48,1886388224,28687,1313296128,7631951,1880060016,1879048192,7348080,117899264,1879508848,1879508751,259002119,124784399,251658255,117903119,7,7341839,7343872,0]}]],[[{"sector":1,"length":512,"data":[124784399,251658240,462607,1886388224,28687,1886416896,7,259000071,118452239,252145671,252645135,462704,252645120,7,118423552,251658352,112,252641280,1904,118427392,15,124784399,251658240,1011727,687865856,-60622,16778752,69711,117506336,-15523543,459007,102190864,16785409,322513166,83951615,356517135,1,2701312,16776960,1191708933,536871186,689242112,-60608,169739520,331050,822083584,-15513303,503644415,84748810,0,10524,83951615,407836672,2097152,2694144,16776960,1326991365,536870936,689700864,-65536,407110912,6216,469762080,-16777175,1057292543,1590296,8192,10538,83951615,6203,18874369,1361654016,16776979,657925,536872192,691994624,-60574,118751231,332603,822083616,-15513303,184549375,83886090,8192,10517,-1,255526675,1049861,1848196864,-237,1191381503,536872215,0,-60548,54853631,16848462,32,-16777216,16777215,17446656,8193,538976256,32,1946185743,258998272,7633008,1880060016,1879078008,2020609904,1886388340,1954050063,1879048192,983047,124782336,117444367,252145671,117440527,252643184,1879506944,986887,2013724672,671117312,2021132152,2021130352,1886943239,125304832,7370872,2013755392]},{"sector":2,"length":512,"pattern":0,"data":[-150966152,-30016715,305530677,506861878,758523446,1144404790,3557686,16777216,16777216,36408064,-1926532352,1929380395,36409131,-1859423488,1929380395,37555755,254505728,1929380413,973086251,-184541666,842419810,1026,9109504,53753438,4,35584,33554432,65535,65535,33554432,11201,56,736890789,131076,239285873,-1694236157,-2113894613,50545974,731186178,915472518,33753922,-2060738300,1412865536,67502861,8989680,22689447,-1492909564,-1275033045,51139382,735511552,139,-16646144,-16776961,255,-133824512,43]},{"sector":3,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1392508928,1143754512,1845501440,1143771920,2113936896,-2144545009,-1711268352,-2144512240,-2063589888,-2144479472,-1073734144,50746422,777454598,919928869,100862277,-1909563644,1228335616,67502858,9383527,123025151,1862534659,335581230,50876215,779551750,925434001,67309392,-1842628348,3619072,1090781184,11197,0,16776962,16776960,0,3047175,4194304,0,822086144,876098358,805306368,0,905969664,909325621,503316528,137292560,872416768,137294608,1358956032,137296656,1275069952,34820919,788726790,928448641,100799820,-2110846204,1211590400,67502612,8597267,0,16776962,16776960,0,3087107,16777216,256,256,256,16777216,16777472,36655360,1395356416]},{"sector":4,"length":512,"data":[1929380399,36656427,1462465280,1929380399,36657451,1529579264,1929380399,36658475,1596686080,-2097151441,36659499,1663792896,1929380399,36660523,1730900736,1929380399,43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1324354304,251691055,1379366656,67240452,7679849,39008134,1862533634,-1795131857,33900855,796197890,933363831,33687366,2049932036,1329050112,67240461,12267399,138491843,-2130443774,-838805201,33969719,797770754,937558139,33687874,2083492612,1312290048,67240460,8204185,239417352,-1627127294,302037551,35406904,799343618,941883512,34276940,-1204835580,1127756288,201720323,8335409,189610054,1006895106,32815,33554432,65535,65535,234881024,12345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1347694122,0]},{"sector":5,"length":512,"data":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,820514646,128,828903280,80,146700,905390971,136783,-1308622832,1396200192,268435991,11730944,407910492,1048578,1677767680,35210296,4096,181,-16646144,-16776961,255,-838598656,1832717617,35278136,838472707,947257526,33688140,2117191700,0,-65024,-65536,0,839844352,948043776,135235,1932579588,1278774016,67109403,12005925,289749138,973340674,-1644133332,51397688,785122304,950665255,100798288,-1791903732,1396225280,67109637,2686976,72497346,-1065089533,10289,16777216,65535,65535,117440512,12858,67116754,1,83888384,17104927,0,523763721,67072,150994944,2059008,263,589824,134225822,1,-788526848,17367071,0,537133065,68096,150994944,2111232,267,589824,201334890,1,-1660942080,17629216,0,953352201,131072,-16777216,255,-1677656064,436207666,1348962063,620756992,1346133007,-503316480,16862264,1024,955187211,66384,154339844,1312357376,67109137,786432,39008512,262145,218107136,17717049,857703430,957743119,100732740,305342340]},{"sector":6,"length":512,"data":[1127817216,67109136,1245184,307181867,1,872420352,-175815,1024,21,-16711680,-16776961,255,789118976,234881075,3976192,36940544,1093368576,167854905,0,961609833,656973,1778384896,1111056640,2567,7077888,38025575,-1392246262,1929407795,168314425,1024,964558958,67765584,1882433316,1194953728,2564,7405568,0,16776961,16776960,0,3388167,1094292736,67111937,10485760,38025648,12,-1124029952,201540921,1024,969408683,787538,-1409286144,3537408,17104896,0,89405915,12,-167731968,201737017,0,973865119,788310,-1392508928,0,-65280,-65536,0,873793536,268894208,5269841,975241216,139086,-1090519040,1396319744,544,12582912,557922860,2,49408,33554432,65535,65535,50331648,731067530,38091315,11,1224776192,184632122,0,979304601,101385030,-1540062580,1228566016,335675934,12397491,491993731,-1391197694,-1744782293,184894522,883622915,984154288,722002,-1358954496,0,-65280,-65536,0,884999936,985202688,590162,-1526726656,1346031360,2307,11010048,38222565,9,-83843328,151278650,0,990970011,591187,-1677721600,1429939968,1028,12451840,0,16776961,16776960]},{"sector":7,"length":512,"data":[0,3482118,1178287360,256,668562,4537154,6,1191185920,151015995,895746048,994771047,655427,1748238336,1329287936,512,7484039,4471643,218103819,1627428405,201343547,879558656,174,-16777216,-16776961,255,2030501888,53,257,0,0,0,0,0,1325400064,1325426278,1867710574,1635218534,939550066,792148016,942813240,1699545143,2037542765,1936278528,1699872875,1702388076,1951596644,1952672114,1869107968,1126200434,1969451625,1124103273,1819307375,6648933,1702132034,1919899392,892469348,1852402720,1768169573,1634496627,859046009,540030255,1701734764,1936286752,2036427888,1852785408,543648102,1869903201,1986097952,1682243685,1629516905,544175221,1702257011,1667318272,544241003,1701603686,1632895091,1769152610,1509975418,544042863,1684957559,7567215,1701995347,1931505253,6650473,1651668308,538976367,1768169504,1952671090,981037679,1163412736,1411393056,1679840592,1667592809,2037542772,1850277946,1685417059,1768169573,1952671090,1701409391,1426078323,544500078,1679826976,1667592809,1769107316,3830629,1701470799,538997859,1701996900,1919906915,980641129,1667846144,1768300651,1847616876,979725665,1920287488,1953391986,1667854368,1768300651,3827052,1667331155,1769152619,1275094394,538998639,1885431144,1835625504,1207989353,543713129,1885431144]},{"sector":8,"length":512,"data":[1835625504,1375761513,1701277281,1701339936,1852402531,1951596647,543908705,1667590243,1735289195,1328498944,1701339936,1852402531,1866858599,543515506,544366950,1819042147,1984888947,1634497125,1629516665,2003790956,1090544741,1852270956,1952539680,1633026145,1953705330,1735289202,1701339936,1852402531,1866596455,1634036847,1986338926,1635085409,1852795252,1836404224,1667854949,1869770784,1936942435,6778473,1819635013,1869182049,1698955374,543651170,1868983913,1952542066,7237481,1633906508,2037588076,1819239021,1866662003,1953064046,1634627433,1701060716,1701734758,1699545203,2037542765,2053731104,1392538469,1701668709,7566446,1818391888,7562089,1635018052,1684368489,1885424896,1818846752,1766588517,1646291822,1701209717,1866662002,1818849389,1275097701,1701539433,1850015858,1869769078,1852140910,1766064244,1952671090,1701409391,1632632947,1701667186,1936876916,1986089728,1886330981,1852795252,1699872883,1701409396,1864394102,1869182064,536900462,1701012818,1713402990,1936026729,1867251744,538993761,538976288,1342190406,543908713,1953251616,3360301,7824718,1702256979,538976288,843456544,1769101056,1948280180,1766064239,1952671090,7959151,1851877443,1679844711,1325429353,1752375379,7105637,1953068369,1092624416,1479373932,1836008192,1701603696,1816207392,960900468,1801538816,538976357,538976288,960897056,1769292288,1140876396,1769239397,1769234798]}]],[[{"sector":1,"length":512,"data":[1174433391,543452777,1869771365,1917845618,1918987625,1768300665,3827052,544499015,1868983913,1684291840,1952544544,538994787,538976288,538976288,1819440195,3622445,1701602628,1998611828,1751348321,1768178944,1635197044,6841204,1869440338,1629513078,1998613612,1751348321,1409315685,1818716015,1919033445,1886085477,1953393007,1950556192,1177382002,1816330296,544366949,543976545,1634038370,1768910955,7566446,2003134806,2019913248,1919033460,1886085477,1953393007,1852788224,1834156133,7631457,1635216449,1157657465,1970037110,543519841,538976288,1920221984,877014380,1818313472,1953701996,543908705,1126178848,762081908,1174418246,543452777,1668248176,1920296037,1850277989,1919378804,1684370529,1650811936,1768384373,1392535406,1684955508,1852796001,1701060709,1734833506,6778473,1886611780,544825708,1885435763,1735289200,1717916160,1752393074,1936286752,2036427888,1853182464,538976288,538976288,1126178848,762081908,1342191942,1919381362,1914727777,1952805733,1920221984,843459948,544163584,1663070068,1869836917,538976370,538976288,1409299526,1701011826,1953392928,538976367,538976288,927342624,1702122240,1986994288,538997349,538976288,538976288,1426077766,544367987,1701995379,538996325,1816207392,893791604,1818838528,1682243685,1375761513,1124101749,1768975727,1325426028,1869182064,1140880238,1735746149,1701986816,1999596385,1751348321,794361856]},{"sector":2,"length":512,"data":[249102336,12127,1024331469,247922688,12131,794234581,248053760,12117,795283141,248446976,12129,794496721,248709120,12113,793972419,224198656,12125,3787,248971267,143083,787677184,2,143099,800129024,1,262144,612040704,2894592,2097163309,612043277,2097160269,536873485,612040763,1229342020,2114894,8192,83886080,0,0,1095773738,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2764330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,687876128,1345202688,687887169,8250,16777216,117440512,1196380752,105726290,1414748499,8080709,8061051,8061051,8061051,8061051,3211312,3211312,707002492,707013156,84216321,1347243843,1380273225,-1795293184,38011203,72171592,273811536,1079517267,-905953244,-520078438,-1769994763]},{"sector":3,"length":512,"data":[1111490712,-2036334577,655360001,65536000,6553600,655360,65536,100663296,1397705795,1225081925,1414877262,1414876934,72635728,1313165391,1279872515,1381257220,1396900904,1141131077,71779667,1195725651,1279346181,1409566035,88429906,774778408,1850278185,1768710518,1329864804,1969627219,1769235310,1663069807,6644847,1818838530,1869488229,1868963956,6581877,1952534531,1869488232,1868963956,6581877,1869566980,1851878688,1886331001,1713401445,1936026729,1766196480,1629513068,1936024419,1701060723,1684367726,1850279424,1768710518,1768300644,1746953580,1818521185,1309147237,1696625775,1735749486,1701650536,2037542765,1850280960,1768710518,1768300644,1629513068,1936024419,1868767347,251684196,1635151433,543451500,1986622052,1970151525,1919246957,1631784960,1953459822,1835364896,543520367,1920103779,544501349,1701996900,1919906915,1125187705,1869508193,1701978228,1701667182,1919115552,544437103,1986622052,1677751141,1802725700,1634038304,1919230052,7499634,1936278629,1920409707,543519849,1869771365,1181089906,543517801,544501614,1769173857,1684368999,1766221568,1847616876,1864397935,7234928,1818838632,1869488229,1886330996,1713401445,1763734127,1953853550,1766222080,1847616876,1864397935,544105840,544370534,1886680431,1778414709,1635151433,543451500,1701672302,543385970,1836216166,-1778355103,1802725700,544434464,1953067639,1919954277,1667593327]},{"sector":4,"length":512,"data":[6579572,1769096344,1847616886,1914729583,2036621669,1380162048,1919230019,544370546,1679847017,6386785,1936278684,1702043755,1696623461,1919906418,1699978752,1919906915,1953459744,1970234912,-1627364242,1852404304,544367988,544503151,1881171567,1919250529,1698996224,1701013878,1769109280,1713399156,1953264993,1698996480,1701013878,1634038304,1634082916,7629941,1918978210,1918990180,1634082917,1920298089,1153957989,1936291433,544108393,2048948578,7303781,1851871945,1663067495,1801676136,1920099616,-905940369,1667331155,1986994283,1818653285,1696626543,1919906418,1699269376,1864396897,1718773110,544698220,1869771365,1238106226,1818326638,1881171049,1953393007,1864397413,1634887024,1852795252,1816579328,1769234799,1881171822,1953393007,1702260512,1869375090,1187905655,1952542572,543649385,1852403568,1853169780,1718773092,7827308,1986939343,1684630625,1869375008,1852404833,1869619303,544501353,1919250543,1869182049,1339031662,1819436406,1830844769,1734438497,1847620197,1763734639,1635021678,1684368492,1984942336,1634497125,1768300665,1914725740,543449445,1869771365,1339162738,1667590754,1869488244,1852383348,1634301033,1702521196,1375731812,1769238133,1696621933,1919906418,1392771072,4607045,1448038484,1380206918,1546801489,1380010310,-30256815,1380141382,238178641,1380272454,372396369,1381189958,103960913,1381452102,-1573039791,1380010566,1073762641,1380141638]},{"sector":5,"length":512,"data":[-1073721007,1381190214,-2147462831,1380275717,1292186933,1397703763,1431323397,1124415032,926438736,5456208,4544581,5591124,4866639,5259597,5396047,747842639,760687831,1632906711,1952802674,1684300064,1936942450,1970234912,1325425774,1864397941,1701650534,2037542765,1701071104,1718187118,544367977,1701869669,1684370531,1802392832,1853321070,1701079328,1718187118,7497065,1819309380,1952539497,1684611173,1769238117,1919248742,1853444864,544760180,1869771365,1917124722,544370546,1914728041,543973733,1936617315,1953390964,1920091392,1763734127,1852383342,1701274996,1868767346,1635021678,1392538734,1852404340,1868767335,1635021678,1696625774,1701143416,1814066020,6647401,544173908,2037277037,1936027168,543450484,1701603686,1851064435,1701869669,1684370531,1684956448,543584032,1701603686,1852394496,1869881445,1869357167,1409312622,543518841,1852138601,1768319348,1696625253,1667592312,6579572,544173908,2037277037,1701867296,1768300654,7562604,1635151433,543451500,1701603686,1701667182,1818838528,1869488229,1868963956,6581877,1802725700,1819633184,1850277996,1768710518,1868767332,1818849389,1679848037,1667592809,1702259060,1869566976,1851878688,1768300665,7562604,1701080661,1701734758,2037653604,1763730800,1869619310,1702129257,1701060722,1768843622,1852795252,1918981632,1818386793,1684611173,1769238117,1919248742,1886938400,1702126437,1917124708]},{"sector":6,"length":512,"data":[544370546,1948282473,6647929,1970435155,1920300131,1869881445,1634476143,6645618,544499027,1702060386,1887007776,1970217061,1718558836,1851879968,1174431079,543517801,1886220131,1852141167,1830843252,1847621985,1646294127,1768300645,544433516,1864397423,1667590754,1224766324,1818326638,1931502697,1852404340,1701584999,1752459118,1886999552,1768759397,1952542067,1224763491,1818326638,1931502697,1634886261,543516526,1702060386,1887007776,1867251813,544367991,1853189986,1919361124,1702125925,1752440946,1965059681,1919250544,1970233888,1325425774,1852400754,1948281953,543518841,1701869669,1684370531,1953384704,1919248229,1852793632,1851880563,2019893364,1952671088,1124099173,1953721967,544501345,1701869669,1684370531,1953384704,1919248229,544370464,1818322290,1852793632,1851880563,2019893364,1952671088,1342202981,1953393007,1948283493,543518841,1852138601,1768319348,1696625253,1667592312,6579572,1635151433,543451500,1668183398,1852795252,1936028192,544500853,1701869940,1650543616,1763732581,1953391972,1701406313,2019893362,1952671088,1107321957,1313425221,1886938400,1702126437,1313144932,2019893316,1952671088,1224762469,1734702190,1696625253,1701998712,1869181811,2019893358,1952671088,1325425765,1852400754,1696623713,1701998712,1869181811,2019893358,1952671088,1107321957,1701605231,1696624225,1701998712,1869181811,2019893358,1952671088,1325425765,1634887024,1948279918]},{"sector":7,"length":512,"data":[1936027769,544171040,544501614,1668571501,1886330984,1952543333,1157657199,1919906418,544106784,1919973477,1769173861,1224765039,1734700140,1629514849,1734964083,1852140910,1766195316,543452261,1852138601,1768319348,1696625253,1667592312,6579572,1701470799,1713402979,543517801,544173940,1735549292,1851064421,1768318308,543450478,1702131813,1818324594,1986939136,1684630625,1784835872,544498533,1701603686,1667592736,6582895,1701080899,1734701856,1953391981,1869575200,1918987296,1140876647,543257697,1835492723,544501349,544173940,1735549292,1329856613,1886938400,1702126437,1850277988,1768710518,1431314532,1128877122,1717920800,1953066601,7237481,1635151433,543451500,1381259333,1701060686,1768843622,1852795252,1869566976,1851878688,1480925305,542003796,1768318308,1769236846,7564911,1696613967,1667592312,6579572,1163152969,1128351314,2019893317,1952671088,1224762469,1818326638,1914725481,1668246629,1650553953,1914725740,1919247973,1701015141,1162368000,2019893326,1952671088,1409311845,1919885391,1464812576,542069838,1701869669,1684370531,1684952320,1852401253,1713398885,1635218031,25714,1635151433,543451500,1701869940,1935762208,1766064244,1769171318,1646292591,1702502521,1224765298,1818326638,1713398889,543517801,1701869940,1851867904,544501614,1684104530,544370464,1953067607,1635131493,1650551154,544433516,1948280431,544434536,1701869940,1768902656]},{"sector":8,"length":512,"data":[1919251566,1918989856,1818386793,2019893349,1952671088,1392534629,1852404340,1635131495,1650551154,1696621932,1667592312,6579572,1769108563,1696622446,1701998712,1869181811,2019893358,1952671088,1124099173,1969451625,544366956,1953066613,1717924384,1852142181,1426089315,544500078,1701667182,1936289056,1668571501,1851064424,1981838441,1769173605,1830841967,1634562921,6841204,1768838400,1768300660,1713399148,1634562671,1919230068,7499634,1280331081,1313164613,1230258516,1696616015,1667592312,6579572,1936617283,1953390964,1684955424,1396785952,2037653573,544433520,1847619428,1830843503,1751348321,1667584512,543453807,1769103734,1701601889,1886938400,1702126437,1866661988,1635021678,1864397934,1864397941,1634869350,6645614,1701603654,1918989856,1818386793,2019893349,1952671088,1342202981,1953393007,1696625253,1701998712,1869181811,2019893358,1952671088,1224762469,1734702190,1864397413,1701978226,1696623713,1701998712,1869181811,2019893358,1952671088,1275094117,1818583649,1953459744,1953068832,544106856,1920103779,544501349,1668246626,1632370795,543974754,1701997665,544826465,1768318308,6579566,1701080661,1701734758,1634476132,543974754,1881173609,1701012850,1735289188,1635021600,1701668212,1881175150,7631457,1635151433,543451500,1918967872,1701672295,1426093166,542394702,1701869669,1684370531,574300672,1886938400,1702126437,975306852,2019893282,1952671088]}]],[[{"sector":1,"length":512,"data":[570451045,1696604716,1667592312,6579572,539109410,1701869669,1684370531,573121024,1886938400,1702126437,1025638500,2019893282,1952671088,570451045,539114810,1701869669,1684370531,576397824,544370464,573450274,1886938400,1702126437,1562509412,1919885346,690889248,2019893282,1952671088,570451045,1696604718,1667592312,6579572,573451810,1886938400,1702126437,1867776100,1634541679,1981839726,1634300513,1936026722,1986939136,1684630625,1380927008,1852793632,1819243124,1918989856,1818386793,1850277989,1701274996,1635131506,1650551154,1696621932,1667592312,6579572,1701603654,1684955424,1869770784,1969513827,1948280178,1936027769,1701994784,1953459744,1819042080,1684371311,1919248416,1951596645,1735289202,1852140576,543716455,1836280173,1751348321,1986939136,1684630625,1685221152,1852404325,1718558823,1701406240,7562348,1769108563,1663068014,1953721967,544501345,1701869669,1684370531,1953384704,1919248229,544370464,1818322290,1918989856,1818386793,2019893349,1952671088,1325425765,1852400754,1981836385,1634300513,543517794,1701869669,1684370531,1280198912,541412937,1869771365,1749221490,1667330657,544367988,1919973477,1769173861,1696624239,1667592312,6579572,544173908,2037277037,1818587680,1952539503,544108393,1835365481,115,1836008192,1634494832,1852795252,1868718368,1684370546,1396785920,1868767301,1635021678,1864397934,1864397941,1634869350,6645614]},{"sector":2,"length":512,"data":[1869771333,1852383346,1635021600,1701668212,1124103278,1869508193,1633886324,1629514860,1852383342,1920099700,544501877,1668248176,1920296037,1291845733,544502645,1763730786,808984686,1830827832,543515759,1663070068,1768975727,1948280172,7563624,1735549268,1629516901,1701995620,1847620467,1713402991,1684960623,1668172032,1701082476,1818846752,1629516645,1847616882,1629516911,2003790956,1746953317,6648421,1279872512,1886938400,1702126437,1850277988,1768710518,1970348132,1718185057,7497065,1635151433,543451500,1769103734,1701601889,1717924384,1852142181,1409312099,1830842223,544829025,1651341683,7564399,1952543827,1852140901,1634738292,1948284018,1814065007,1701278305,1766195200,544433516,1953723757,543515168,544366966,1634886000,1702126957,1409315698,1830842223,544829025,1684959075,1869182057,543973742,1651341683,7564399,1886611789,1701011820,1868767332,1953064046,1634627433,1768169580,1952671090,6649449,1229213253,1768169542,1952671090,543520361,1936943469,6778473,1869771333,1852383346,1768843552,1818323316,1852793632,1769236836,1818324591,1717920800,1936027241,1634027520,544367972,1936027492,1953459744,1952541984,1881172067,1769366898,544437615,1768318308,1769236846,1124101743,1769236850,543973731,1802725732,1920099616,1124102767,1869508193,1986338932,1635085409,1948280180,544434536,1919973477,1769173861,1157656175,1701998712,1869181811,1852383342]},{"sector":3,"length":512,"data":[1920102243,1819566949,1702109305,1852403058,1684370529,1986939136,1684630625,1919903264,544498029,1667592307,1701406313,1850278002,1768710518,1852383332,1701996900,1914729571,1919247973,1701015141,1920226048,1970561909,543450482,1769103734,1701601889,1918967923,1869488229,1818304628,1702326124,1701322852,1124099442,1869508193,1986338932,1635085409,1998611828,1869116521,1394635893,1702130553,1853169773,1124103273,1869508193,1667309684,1936942435,1768453152,2037588083,1819239021,1986939136,1684630625,1869375008,1852404833,1869619303,544501353,1919250543,1869182049,1631780974,1953459822,1836016416,1701603696,1702260512,2036427890,1869881459,1835363616,7959151,1668248144,1920296037,1919885413,1853187616,1869182051,1635131502,1650551154,1696621932,1667592312,6579572,1635151433,543451500,1668248176,1920296037,1919885413,1853187616,1869182051,1701978222,1701995878,6644590,1852727619,1864397935,1819436406,1948285281,544434536,1953066613,1869566976,1851878688,1701716089,1684370547,1868788512,7562608,1701603654,1667457312,544437093,1768842596,1325425765,1667590754,2037653620,1696621936,1667592312,6579572,1633906508,1651449964,1952671082,1887007776,1629516645,1847616882,1629516911,2003790956,1442866277,1431589449,1696615489,1667592312,6579572,1752458573,1763730543,1953391972,1701406313,2019893362,1952671088,1442866277,1970565737,1663069281,1953721967,1952675186,544436847]},{"sector":4,"length":512,"data":[543519329,544501614,1869376609,6579575,1936617283,1668641396,544370548,1852138601,1768319348,1696625253,1667592312,6579572,1953719620,1952675186,1763734127,1953391972,1701406313,2019893362,1952671088,1174430821,543975777,2037149295,1819042080,1684371311,1953068832,544106856,1936617315,1668641396,1936879476,655360000,6554600,65546,858927408,926299444,1111570744,1178944579,1951604782,544502369,1869894432,538976368,1735288140,1310746740,543518049,538976288,538976288,538976288,1816338464,74675041,1162104643,1413563396,1414726977,72041281,1346454856,541601795,807421955,572540930,1681989664,1936028260,538976371,538976288,1968185376,1667853410,2036473971,1818318368,1276208501,543518313,1651340654,544436837,544370534,1931487498,1701668709,471889006,1735357008,544039282,1920233061,1869619321,544501353,807433313,976236592,1392787457,4607045,0,67108864,65536,-2147483648,2147483647,83886080,131072,0,-128,100663423,262144,0,-8388608,142606335,65536,0,-16777216,150994944,131072,0,-16777216,167772415,262144,0,-16777216,234881023,262144,251658240,524288,268435456,655360,234881024,393216,671088640,65536,201326592,65536,0,-16777216,117440512,524288,184549376,524288,721420288,655360,637534208,16777216]},{"sector":5,"length":512,"data":[654311424,8388608,369099008,262144,50331904,16777216,587202815,262144,587202881,262144,587202885,262144,587202817,262144,587202821,0,134217991,134744080,134744072,268961800,269488136,773725184,623060519,235733782,688662533,16843053,18356481,18553345,319947025,33554433,50331649,1,10,100,1000,10000,100000,1000000,10000000,0,-1094967296,16409,-910228480,1077186075,728806814,-1647989336,-1495973783,524943311,1087619704,-2132177696,-1816508471,-561102424,-335831559,1129425534,-1508994617,-484859730,202852003,1971749237,1296615798,-985834011,-1635042467,-1751426414,1375898144,1965409376,0,-1094967296,147481,65540,262146,1,65536,131073,2,262144,262148,1,1048576,1048585,16,524288,524292,524297,1812004880,-690486826,30870785,3200804,924893184,959590710,808596789,16776704,-33619984,-124113412,33554688,134218752,805310464,16384,16771584,1297040368,5325136,0,0,-438566912,-438508068,0,538976256,538976288,555819040,539042081,538976288,538976288,538976288,538976288,1077936416,1077952576,1077952576,1077952576,33686080,33686018,1073873410,1077952576,336871488,336860180,67372036,67372036,67372036,67372036,67372036,1077952576]},{"sector":6,"length":512,"pattern":0,"data":[404242496,404232216,134744072,134744072,134744072,134744072,134744072,1077952576,32]},{"sector":7,"length":512,"pattern":-151587082,"data":[]},{"sector":8,"length":512,"pattern":-151587082,"data":[]}]]]
      • ibm-basic-1.00.json
        [233,143,126,232,167,107,203,232,2,101,203,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,46,148,13,104,115,91,17,
        89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,27,45,254,17,88,30,240,27,
        145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,169,18,88,18,57,34,184,18,
        216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,67,108,65,109,65,206,65,47,
        83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,28,101,128,126,150,125,241,
        112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,41,248,40,11,41,128,34,71,41,
        13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,1,72,1,87,1,139,1,180,1,217,
        1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,3,101,3,105,3,106,3,85,84,207,
        170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,0,79,76,79,210,191,76,79,83,
        197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,30,79,211,12,72,82,164,22,
        65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,70,73,78,212,173,69,70,83,
        78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,166,82,82,79,210,167,82,204,
        212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,207,137,79,32,84,207,137,79,
        83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,208,242,78,75,69,89,164,222,
        0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,136,73,78,197,176,79,65,196,
        188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,82,71,197,189,79,196,243,73,
        68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,84,164,25,80,84,73,79,206,184,
        70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,212,199,79,73,78,212,220,69,
        206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,83,85,77,197,168,73,71,72,84,
        164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,144,87,65,208,164,65,86,197,
        190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,80,65,67,69,164,24,79,85,78,
        196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,168,206,207,204,65,206,13,0,
        83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,72,73,76,197,177,69,78,196,178,
        82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,190,230,189,231,188,232,0,121,
        121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,32,99,116,101,18,99,25,99,65,
        99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,116,32,70,79,82,0,83,121,110,
        116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,83,85,66,0,79,117,116,32,111,
        102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,0,79,118,101,114,102,108,
        111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,100,32,108,105,110,101,32,110,
        117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,103,101,0,68,117,112,108,105,
        99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,98,121,32,122,101,114,111,0,73,
        108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,99,104,0,79,117,116,32,111,102,
        32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,108,111,110,103,0,83,116,114,105,
        110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,97,110,39,116,32,99,111,110,116,105,
        110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,116,105,111,110,0,78,111,32,82,69,83,
        85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,85,110,112,114,105,110,116,97,98,108,
        101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,0,76,105,110,101,32,98,117,102,102,
        101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,117,116,0,68,101,118,105,99,101,
        32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,32,111,102,32,80,97,112,101,114,
        0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,105,116,104,111,117,116,32,87,72,
        73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,108,32,101,114,114,111,114,0,66,
        97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,111,117,110,100,0,66,97,100,32,
        102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,101,110,0,63,0,68,101,118,105,
        99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,0,63,0,
        63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,66,97,100,32,114,101,99,111,
        114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,105,114,101,99,116,32,115,116,
        97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,102,105,108,101,115,0,0,0,0,195,
        30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,7,32,0,0,0,0,0,0,0,0,0,0,
        1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,32,105,110,32,0,
        79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,241,60,130,116,1,195,138,15,
        67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,185,181,8,233,145,0,205,134,
        139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,178,57,185,178,54,185,178,53,
        185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,178,58,235,34,139,30,55,3,137,
        30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,178,13,50,192,162,54,5,162,95,
        0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,116,4,137,30,73,3,185,12,8,
        139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,138,199,34,195,254,192,116,
        10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,135,218,233,115,6,50,192,
        136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,138,208,46,138,7,67,10,
        192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,180,3,235,212,232,190,
        114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,232,241,34,176,89,205,
        138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,187,255,255,137,30,
        46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,132,40,90,115,14,
        50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,137,30,63,3,160,
        247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,147,38,117,3,233,
        118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,81,232,238,61,232,
        176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,89,81,115,3,232,214,
        24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,3,217,83,232,21,91,
        91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,73,138,193,10,197,
        117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,254,139,30,48,0,135,
        218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,232,253,4,232,249,4,
        235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,175,35,234,116,2,
        60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,30,48,0,139,203,
        138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,162,253,2,162,
        252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,187,183,0,50,
        192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,47,67,80,232,
        84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,218,80,138,7,
        67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,115,3,233,46,
        1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,233,8,0,186,101,11,232,8,0,117,38,176,141,89,233,
        173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,0,85,66,0,91,232,127,
        14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,46,172,36,127,117,3,233,
        171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,116,21,60,208,116,17,232,
        54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,0,89,90,12,128,80,176,255,
        232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,75,80,205,146,186,12,12,
        138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,147,158,137,142,205,141,
        0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,60,217,116,3,233,198,
        0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,3,233,137,0,160,253,
        2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,253,0,94,135,222,86,
        135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,251,2,60,2,117,26,
        139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,27,232,92,0,187,163,
        4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,242,46,172,36,127,
        117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,12,60,72,176,11,117,
        2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,23,233,155,250,205,
        147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,60,48,115,236,60,46,
        116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,233,159,254,75,138,
        7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,59,3,160,251,2,80,232,
        123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,117,30,3,217,82,75,138,
        55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,232,227,30,83,139,30,53,
        3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,193,249,156,232,14,9,157,
        83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,198,86,235,39,232,18,93,
        232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,244,92,232,147,85,232,18,
        109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,83,139,30,90,4,137,30,46,
        0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,181,130,81,235,66,233,203,
        248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,116,224,67,139,23,67,137,
        22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,19,205,150,232,155,29,137,
        38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,171,60,74,115,162,50,228,
        2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,192,254,200,195,10,192,116,
        251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,115,7,60,254,117,27,138,7,
        67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,254,2,75,138,63,235,225,232,
        55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,218,89,90,137,30,254,2,88,187,
        4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,13,114,19,139,30,2,3,117,10,67,
        67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,163,4,139,30,4,3,137,30,165,4,195,
        187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,65,138,200,138,232,232,5,255,60,
        234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,254,192,94,135,222,86,187,96,3,
        181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,232,179,14,121,155,178,5,233,
        122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,3,117,3,233,159,254,50,192,162,
        0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,218,3,219,3,218,3,219,88,158,44,
        48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,116,3,233,163,48,232,117,28,185,
        232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,196,80,134,196,81,235,4,81,232,
        123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,222,86,232,81,0,67,83,139,30,
        46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,217,195,178,8,233,163,246,205,
        152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,46,0,187,232,14,94,135,222,86,
        176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,116,186,67,60,34,116,233,254,
        192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,231,137,22,59,3,82,160,251,2,
        80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,163,4,60,5,114,3,186,159,4,83,
        60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,187,44,3,59,218,115,10,176,90,
        232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,24,253,232,236,27,137,232,95,
        254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,3,10,192,138,194,116,209,160,
        40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,201,138,197,117,3,233,185,252,
        232,26,254,60,44,117,167,235,238,186,79,3,139,242,172,10,192,117,3,233,104,245,254,192,162,40,0,139,250,170,138,7,60,131,
        116,16,232,245,253,117,133,11,210,116,3,233,113,254,254,192,235,6,232,151,252,116,1,195,139,30,75,3,135,218,139,30,71,3,137,
        30,46,0,135,218,117,237,138,7,10,192,117,4,67,67,67,67,67,233,178,254,232,112,12,117,218,10,192,117,3,233,164,253,233,32,
        245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,116,8,232,147,253,116,3,
        233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,245,232,44,4,138,7,60,
        44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,117,3,233,204,253,60,
        13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,117,238,235,209,232,
        106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,3,233,171,0,60,210,
        117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194,18,198,7,32,139,
        30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0,138,232,254,192,
        116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197,114,3,232,153,24,
        91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232,232,50,59,60,255,
        116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88,80,60,210,116,1,74,
        138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160,41,0,138,216,254,
        192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232,111,27,138,7,117,
        3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232,176,32,232,24,
        23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216,137,30,233,
        4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55,176,0,91,233,
        230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0,232,122,34,232,
        68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111,32,102,114,111,
        109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205,156,160,58,3,10,
        192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116,242,232,190,28,
        185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249,235,4,232,111,
        24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233,161,24,81,50,192,
        162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67,181,0,254,197,232,
        76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249,116,7,60,44,116,3,
        233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3,233,31,255,83,232,
        13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116,3,233,10,255,198,
        7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82,138,7,60,44,116,
        10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232,155,248,138,240,
        138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10,192,117,1,195,138,
        193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82,233,253,82,75,232,
        79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135,218,116,3,233,53,
        23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137,22,55,3,232,8,248,
        60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232,178,1,50,192,162,
        168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12,160,251,2,60,3,138,
        194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23,81,138,198,205,158,
        60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4,121,3,233,17,0,255,
        54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99,255,182,0,44,230,
        114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232,101,83,232,55,
        76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100,187,3,27,83,
        232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60,2,116,40,60,
        4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117,3,233,124,
        239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137,30,161,4,
        91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139,31,255,
        227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91,232,97,
        75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59,76,232,
        51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3,233,106,
        1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209,0,60,213,
        117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218,117,46,232,
        199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218,11,219,117,
        3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117,3,233,76,
        46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233,126,2,
        232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4,232,65,
        1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245,232,229,
        255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6,60,71,115,
        67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115,36,60,56,114,
        3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235,213,232,153,
        74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200,81,232,134,
        244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232,101,4,135,218,
        94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186,213,25,82,176,
        1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195,60,233,116,251,
        159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211,137,30,163,4,
        89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74,60,123,117,3,
        233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51,218,247,211,
        195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233,132,73,232,
        46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2,80,60,3,117,
        3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192,208,208,138,
        200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60,208,116,233,
        60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195,232,243,1,
        232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245,232,185,
        17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3,233,206,
        0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135,218,94,135,
        222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139,227,232,249,
        71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3,88,10,192,116,
        78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246,74,74,74,160,251,
        2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200,232,223,0,185,197,
        28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3,4,4,80,208,200,138,
        200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137,30,122,3,139,30,228,
        3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137,30,80,4,138,199,10,195,
        162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30,163,4,59,218,114,6,232,
        124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0,135,218,139,227,139,30,
        80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252,91,195,139,242,172,136,
        7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231,15,209,176,128,162,57,
        3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3,233,175,55,60,162,117,
        3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195,232,240,255,238,195,
        232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94,0,10,192,117,11,135,
        218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232,125,32,138,198,182,
        0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138,194,2,192,138,208,
        176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32,232,50,58,10,192,
        121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2,194,162,42,0,195,
        232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3,233,50,241,75,232,
        242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214,239,116,14,232,
        168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90,138,15,67,138,
        47,67,138,197,10,193,117,3,233,61,233,232,90,16,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135,218,59,218,89,
        115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232,24,0,187,247,
        1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2,50,192,162,94,
        4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56,60,34,117,10,
        160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192,121,3,233,60,
        0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170,65,254,206,117,
        1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67,208,216,208,216,
        115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191,73,139,241,172,
        60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233,53,255,160,252,
        2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117,3,232,229,255,
        138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177,116,1,75,83,81,
        82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46,138,7,58,197,
        117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91,117,7,50,192,
        162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194,235,6,46,138,
        7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233,100,254,232,
        191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3,233,96,66,60,
        12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249,170,65,254,206,
        116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117,3,232,82,67,138,
        7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158,117,4,60,46,116,
        8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254,2,233,174,253,
        232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0,238,187,45,7,232,
        246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217,137,30,88,3,195,
        232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90,6,142,6,80,3,139,
        250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4,60,144,117,237,232,
        171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11,82,232,116,237,138,
        238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228,11,210,117,3,233,74,
        237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233,44,237,90,89,88,83,
        82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135,218,90,116,12,138,
        7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222,86,135,218,67,137,
        23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7,117,1,195,67,139,23,
        67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235,60,137,117,228,232,
        92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159,73,158,176,13,114,
        63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101,102,105,110,101,
        100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247,35,83,139,30,
        254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232,170,9,83,232,
        166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138,7,44,48,115,
        3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0,67,235,243,159,
        134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115,3,233,143,9,82,
        67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110,117,109,98,101,
        114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0,135,218,139,30,
        46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60,161,116,29,60,
        205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60,143,117,7,81,
        232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178,117,161,254,205,
        117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139,30,90,4,137,30,46,
        0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30,46,0,91,82,195,159,
        80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90,81,80,232,214,2,88,
        138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254,192,115,241,254,206,
        254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174,74,232,47,0,232,137,
        2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232,149,0,187,44,3,83,
        136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117,239,60,34,117,3,
        232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135,218,138,193,232,
        180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91,138,7,117,155,186,
        16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13,117,3,232,165,5,65,
        235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59,218,114,15,137,30,
        47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38,81,139,30,10,3,137,
        30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137,30,78,4,139,30,90,3,
        137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0,50,192,138,208,182,
        0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135,218,3,218,137,30,
        75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47,67,88,83,3,217,60,
        3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197,39,81,50,192,10,7,
        159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91,94,135,222,86,59,218,
        94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75,138,31,183,0,3,217,
        138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139,30,163,4,94,135,222,
        86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219,253,90,232,72,0,94,
        135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94,135,222,86,138,7,
        67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139,30,163,4,135,218,
        232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137,30,47,3,91,195,205,
        238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192,138,240,138,7,10,192,
        195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30,45,3,136,23,89,233,
        114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83,232,236,241,116,5,
        232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254,205,116,188,139,
        30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114,3,138,197,186,
        177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254,90,232,13,255,
        233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152,230,81,232,181,
        1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138,232,114,243,138,
        234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229,232,190,63,89,
        91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232,243,244,10,192,
        117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217,236,232,163,3,
        41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138,200,58,7,176,0,
        115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81,82,94,135,222,
        86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50,192,195,91,90,
        90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57,83,82,135,218,
        67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222,86,232,241,
        2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232,94,135,222,
        86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193,138,205,254,
        201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117,1,195,139,242,
        172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2,41,195,232,150,
        239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196,83,232,37,4,116,
        3,233,221,23,91,88,134,196,158,81,159,80,60,8,117,16,232,103,35,10,192,116,25,254,200,232,99,35,176,8,235,56,60,9,117,16,
        176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116,11,254,205,58,
        197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232,188,3,116,61,
        232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160,239,4,10,192,
        116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192,116,248,235,
        11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50,192,195,205,
        183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,125,226,83,232,175,32,116,33,232,176,255,10,192,117,
        16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30,163,4,176,3,
        162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91,115,1,195,139,
        30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115,218,235,227,117,
        214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75,205,175,137,30,
        59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186,7,0,187,11,0,
        232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30,47,3,50,192,
        232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5,89,139,30,44,
        0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216,137,30,124,
        3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166,86,139,223,
        117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220,139,217,90,
        114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,31,21,157,137,30,67,3,187,14,3,137,
        30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232,245,253,157,
        187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11,219,186,17,
        0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139,30,90,3,94,
        135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135,218,83,139,
        30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57,3,232,115,
        8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59,218,139,242,
        172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182,88,134,196,
        158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238,232,146,254,
        44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153,223,116,3,
        233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115,25,135,218,
        137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10,3,235,186,
        139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27,48,139,30,
        86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31,232,94,0,50,
        192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176,1,58,195,116,
        221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139,30,86,0,232,
        9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216,42,199,114,
        150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254,200,117,
        3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114,16,58,
        199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197,58,195,
        115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200,117,
        249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242,172,
        138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233,138,
        200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254,203,
        3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32,232,
        7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175,255,
        232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,60,27,117,2,176,21,10,192,117,3,232,113,28,80,139,30,88,0,135,218,139,30,
        86,0,138,195,58,194,117,22,138,199,58,198,115,4,137,30,88,0,160,90,0,58,199,115,5,138,199,162,90,0,88,232,41,0,114,10,116,
        181,232,253,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,
        7,117,246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,
        32,0,80,138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,60,32,
        114,3,34,192,195,60,7,116,249,60,9,116,245,60,11,116,241,60,12,116,237,60,28,114,4,60,32,114,229,50,192,195,13,2,6,5,3,11,
        12,28,29,30,31,14,127,21,9,10,8,18,2,6,5,3,13,14,127,21,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,
        50,193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,
        205,117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,
        41,3,160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,
        66,138,193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,
        30,88,0,82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,
        1,254,195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,
        7,0,135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,
        235,247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,
        197,117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,
        160,114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,
        83,187,90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,
        230,1,88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,
        232,173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,
        86,91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,
        5,2,94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,
        41,0,138,248,160,80,0,138,200,81,232,34,26,89,254,207,116,10,10,192,116,243,58,193,116,239,254,199,254,199,232,36,26,50,192,
        195,232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,
        195,235,226,50,192,162,112,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,197,235,241,232,214,25,232,59,1,115,7,232,49,0,
        116,182,235,241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,
        114,7,232,23,0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,
        117,190,160,41,0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,
        22,0,139,250,170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,
        232,138,251,116,21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,
        116,25,254,199,232,196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,
        81,232,164,0,89,80,138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,
        114,47,116,34,139,30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,
        83,183,1,232,249,24,91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,
        114,18,60,65,114,243,60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,
        60,255,116,8,254,199,254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,
        34,195,254,192,135,218,116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,
        3,232,120,211,114,3,233,60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,
        188,232,187,247,1,232,169,232,232,87,245,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,
        160,209,60,10,116,3,233,107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,
        13,232,77,244,176,10,195,75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,
        232,201,247,115,3,233,63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,
        51,138,232,81,181,255,186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,
        116,228,138,197,60,39,114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,
        1,195,254,198,60,33,116,249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,
        251,2,232,18,215,160,57,3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,
        162,57,3,83,160,77,4,10,192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,
        36,50,192,162,74,4,139,30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,
        91,94,135,222,86,82,186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,
        2,197,254,192,138,200,81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,
        0,59,218,117,248,90,136,55,67,90,137,23,67,232,221,1,135,218,66,91,195,50,192,162,166,4,138,248,138,216,137,30,163,4,232,
        64,226,117,7,187,6,0,137,30,163,4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,
        135,218,4,2,208,216,138,200,232,195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,
        88,137,30,181,0,91,4,2,208,216,89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,
        92,4,10,192,116,8,11,210,117,3,233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,
        116,136,60,41,116,7,60,93,116,3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,
        139,30,90,3,233,175,44,160,250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,
        9,0,233,25,206,160,251,2,136,7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,
        245,242,67,67,137,30,49,3,136,15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,
        159,65,158,136,15,159,80,67,136,47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,
        242,232,220,242,137,30,92,3,75,198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,
        75,137,23,67,67,88,158,114,70,138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,
        42,3,218,88,254,200,139,203,117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,
        89,3,217,135,218,139,30,82,3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,
        172,138,232,254,197,139,242,172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,
        139,30,163,4,235,10,160,58,3,10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,197,117,3,233,95,213,67,
        139,31,235,36,138,213,83,177,2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,
        1,232,130,240,50,192,138,208,138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,
        205,117,3,233,46,1,60,43,176,8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,
        24,60,42,117,174,138,197,67,60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,
        254,194,177,0,254,205,116,97,138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,
        46,116,3,233,101,255,177,1,67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,
        195,58,7,117,251,67,58,7,117,246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,
        75,254,194,36,8,117,28,254,202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,
        116,101,81,82,232,2,219,90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,
        75,232,216,210,249,116,17,162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,
        182,0,138,208,139,31,3,218,138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,
        231,239,94,135,222,86,232,28,236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,
        254,205,232,69,0,91,157,116,208,81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,
        3,232,161,236,232,228,233,139,30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,
        177,238,235,244,80,138,198,10,192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,
        68,158,159,68,158,117,8,3,217,139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,
        0,117,103,139,227,137,30,69,3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,
        39,91,116,9,185,177,0,138,233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,
        0,58,193,117,7,185,16,0,3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,
        232,58,7,75,232,109,209,116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,
        242,172,60,32,117,9,66,136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,
        209,176,44,232,175,237,235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,
        83,138,242,232,135,1,116,9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,
        2,115,5,205,172,233,97,201,60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,
        123,115,2,44,32,81,138,232,139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,
        90,10,192,195,10,192,120,235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,
        200,75,89,66,68,255,83,67,82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,
        80,134,196,186,46,0,3,218,176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,
        138,216,183,0,3,218,46,138,23,67,46,138,55,135,218,90,94,135,222,86,195,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,232,17,216,83,232,140,233,138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,
        196,80,134,196,185,240,4,182,11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,
        88,134,196,158,159,134,196,80,134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,
        255,6,138,198,60,11,116,239,60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,
        246,235,186,138,7,67,254,202,195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,
        3,218,139,31,160,54,5,254,192,116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,
        7,10,192,249,195,75,232,53,207,60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,
        4,195,185,152,20,81,232,28,215,138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,
        1,60,73,116,21,178,2,60,79,116,15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,
        206,232,204,222,232,161,237,44,138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,
        138,7,60,130,178,4,117,89,232,165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,
        237,80,232,95,237,69,232,91,237,78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,
        237,85,232,60,237,84,178,2,235,17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,
        82,138,7,60,35,117,3,232,61,206,232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,
        94,135,222,86,138,194,159,134,196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,
        185,46,0,3,217,136,55,176,0,91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,
        83,176,2,115,3,233,113,253,205,224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,
        7,0,91,195,249,235,3,13,50,192,159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,
        106,236,82,88,158,249,159,80,159,80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,
        5,88,158,159,80,26,192,162,239,4,138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,
        253,205,234,75,232,70,205,178,128,249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,
        236,65,10,192,178,2,159,80,138,194,36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,
        4,138,7,91,36,128,117,3,233,20,221,83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,
        30,233,4,232,198,0,10,192,121,3,233,22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,
        2,0,235,231,232,160,0,60,252,117,3,233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,
        117,3,233,54,26,88,158,205,236,233,0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,
        4,232,171,0,50,192,232,241,252,198,7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,
        232,40,4,232,39,199,67,67,137,30,88,3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,
        135,218,139,30,47,3,135,218,59,218,114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,
        90,91,195,117,30,83,81,80,186,38,67,82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,
        138,7,60,35,117,3,232,218,203,232,214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,
        10,192,120,204,185,40,65,50,192,160,223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,
        239,50,192,162,54,5,232,149,233,139,30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,
        30,233,4,176,6,232,5,0,205,227,233,235,195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,
        202,0,88,134,196,158,94,135,222,86,91,233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,
        232,48,203,232,4,234,36,232,0,234,40,83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,
        11,232,9,203,232,205,251,91,50,192,138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,
        83,232,7,226,135,218,89,88,158,159,80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,
        233,51,226,88,158,139,30,46,0,137,30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,
        2,0,91,195,50,192,136,7,67,254,205,117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,
        194,176,10,115,3,233,18,250,205,230,233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,
        232,223,250,117,3,233,210,194,176,14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,
        178,66,233,242,194,60,35,117,173,232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,
        232,30,214,185,155,22,186,32,44,117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,
        138,240,138,208,80,81,83,232,165,254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,
        44,138,197,117,9,138,245,138,213,232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,
        91,60,10,117,36,138,200,138,194,60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,
        44,176,13,116,15,10,192,116,11,58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,
        232,32,254,114,32,60,32,116,247,60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,
        195,193,91,198,7,0,187,246,1,138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,
        3,232,196,35,88,158,114,3,232,196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,
        116,3,233,158,193,83,81,178,2,232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,
        125,193,254,200,162,96,0,83,81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,
        185,200,90,117,3,176,1,195,82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,
        135,218,3,217,137,30,4,7,135,218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,
        185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,
        42,197,46,50,7,80,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,
        11,254,205,117,188,181,13,235,184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,
        138,199,20,0,138,248,139,242,172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,
        139,250,170,66,254,201,117,2,177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,
        80,160,100,4,10,192,116,3,233,245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,
        7,60,207,156,117,3,232,152,199,232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,
        5,116,3,187,0,0,159,3,217,209,222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,
        137,30,57,5,135,218,91,195,50,192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,
        49,199,232,140,255,83,232,20,3,187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,
        232,12,199,116,11,232,222,229,44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,
        55,5,138,195,42,193,138,216,138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,
        5,138,195,42,194,138,216,138,199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,
        55,5,94,135,222,86,137,30,55,5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,
        44,232,88,229,66,117,3,233,96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,
        255,115,3,232,175,255,67,83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,
        197,10,193,117,227,91,195,81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,
        82,135,218,232,218,255,91,137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,
        5,139,203,232,183,255,91,195,205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,
        187,241,73,115,3,187,5,74,94,135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,
        94,135,222,86,137,30,249,6,187,213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,
        65,233,32,2,138,198,10,192,208,216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,
        195,139,30,243,6,129,251,0,32,114,9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,
        114,9,129,235,176,31,137,30,243,6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,
        6,243,6,195,138,193,138,14,85,0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,
        138,7,138,22,245,6,34,194,138,14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,
        233,160,245,6,246,208,38,34,7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,
        2,211,226,3,211,177,4,211,226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,
        210,232,162,245,6,177,3,211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,
        160,72,0,199,6,59,5,100,0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,
        198,6,85,0,0,195,60,4,115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,
        248,195,160,85,0,10,192,116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,
        129,250,200,0,114,4,186,199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,
        139,30,243,6,38,138,47,160,245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,
        210,204,115,239,139,30,243,6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,
        6,129,226,7,0,209,233,227,171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,
        142,198,195,232,127,254,3,22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,
        91,195,83,232,39,25,91,195,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,15,205,16,162,72,0,180,40,60,2,114,13,
        180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187,52,77,137,
        30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140,143,2,0,38,
        199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233,99,50,190,
        237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203,84,104,101,
        32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101,114,115,
        105,111,110,32,67,49,46,48,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49,255,13,0,
        50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44,34,76,80,
        84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156,80,30,82,
        186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17,160,106,
        0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160,106,0,10,
        192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117,19,187,52,
        78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137,30,107,0,
        254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204,137,30,
        107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107,0,10,
        192,116,2,121,160,180,1,140,203,138,30,110,0,58,223,115,2,254,204,136,38,106,0,36,127,117,138,91,95,94,233,58,255,30,48,46,
        32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224,116,9,70,
        254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83,127,79,14,
        117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232,44,2,116,
        4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81,46,255,183,
        225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138,62,73,0,138,
        30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243,255,138,232,
        138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0,254,193,181,
        0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232,21,0,138,62,
        73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180,2,205,16,
        90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205,16,232,
        28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1,117,32,
        138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83,82,80,
        186,0,0,180,0,205,23,246,196,32,117,14,246,196,4,117,13,246,196,1,116,13,178,24,235,6,178,27,235,2,178,25,233,190,183,88,
        80,60,13,117,5,176,10,232,206,255,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56,254,
        200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15,114,
        2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,117,0,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162,113,
        0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32,232,
        251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235,192,
        86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178,0,138,
        62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232,192,255,
        117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0,91,86,177,
        6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254,192,60,
        58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81,185,1,
        0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114,9,254,
        197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232,77,
        205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81,232,
        43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116,10,50,
        210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128,249,8,
        115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197,128,117,
        29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38,41,0,161,
        72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79,0,232,110,
        0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176,80,235,28,
        128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39,128,62,41,
        0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185,0,0,137,
        14,73,0,160,72,0,180,0,205,16,232,189,221,232,193,253,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190,81,0,128,
        62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249,138,221,
        128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254,193,128,
        249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200,81,232,
        117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232,43,218,
        44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194,128,229,
        7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0,136,46,
        79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116,4,60,25,
        115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224,114,43,
        90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89,10,232,
        81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232,131,
        186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137,22,
        86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91,139,
        14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
        255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84,38,140,
        14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0,38,143,
        6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10,233,116,
        80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202,138,62,
        73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41,88,10,
        192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232,42,201,
        89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232,27,201,
        60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107,86,114,
        86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140,245,
        180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0,233,
        154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63,0,254,
        192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1,187,15,
        0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0,185,4,0,
        88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184,60,149,
        116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215,168,1,116,
        14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156,80,85,86,
        87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54,0,160,69,
        0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117,7,186,97,
        0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,
        160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195,83,187,
        70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254,200,152,
        138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222,198,131,
        250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184,220,52,247,
        241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137,22,102,0,
        198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16,89,16,89,
        16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89,16,171,91,
        240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67,67,136,47,
        67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158,89,90,91,195,
        90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233,4,138,135,47,
        0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128,63,32,117,
        13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58,4,116,9,10,
        192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0,249,89,91,195,
        83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232,203,244,91,131,
        195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91,232,165,244,46,
        138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185,0,0,136,14,82,
        5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14,82,5,233,163,235,
        232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201,139,30,233,4,136,
        143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254,160,99,0,136,7,233,
        128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,116,15,254,7,83,232,149,254,91,56,7,114,7,176,13,235,
        231,198,7,0,138,7,232,124,254,136,7,195,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128,226,251,117,2,178,1,
        162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201,32,160,96,0,10,192,
        116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232,46,254,246,196,1,
        117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129,117,10,232,17,
        1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187,83,5,185,17,0,
        83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116,11,50,192,162,
        97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39,117,13,139,30,
        233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38,0,136,7,254,193,
        116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198,7,1,195,232,61,
        253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5,138,7,198,7,0,10,
        192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239,252,58,15,116,3,
        10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136,7,232,206,252,
        198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147,8,136,14,81,
        5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164,254,90,89,91,
        160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195,190,83,5,139,
        140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10,192,116,14,139,
        148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30,88,3,233,128,229,
        80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232,232,193,10,192,117,
        4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195,50,193,162,167,4,
        138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222,131,196,2,233,93,
        23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128,203,128,195,198,
        6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23,232,49,208,40,232,
        167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3,255,54,94,4,203,139,
        30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,
        38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30,30,29,29,29,29,28,
        28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18,18,17,17,17,16,16,
        16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4,3,3,3,3,2,2,2,1,1,
        1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248,248,248,247,247,
        247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239,239,238,238,238,
        238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230,229,229,229,228,
        228,228,228,227,227,227,226,226,226,225,225,225,225,224,35,199,83,237,220,199,89,2,118,92,84,20,234,28,8,6,147,115,105,153,
        36,36,42,9,120,208,195,191,45,173,84,12,75,98,218,151,60,236,4,16,222,250,208,189,75,39,38,19,149,57,69,173,30,177,79,22,
        253,67,75,44,179,206,1,26,253,20,94,247,95,66,34,29,60,154,53,245,247,210,74,32,203,0,131,242,181,135,125,35,127,224,145,
        183,209,116,30,39,158,88,118,37,6,18,70,42,198,238,211,174,135,150,119,45,60,117,68,205,20,190,26,49,139,146,149,0,154,109,
        65,52,45,247,186,128,0,201,113,55,124,218,116,80,160,29,23,59,27,17,146,100,8,229,60,62,98,149,182,125,74,30,108,65,94,29,
        146,142,238,146,19,69,181,164,54,50,170,119,56,72,226,77,196,190,148,149,102,75,173,176,58,247,124,29,16,79,217,92,9,53,220,
        36,52,82,15,180,75,66,19,46,97,85,137,80,111,9,204,188,12,89,172,36,203,11,255,235,47,92,214,237,189,206,254,230,91,95,166,
        180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27,71,
        172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204,204,
        76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67,145,
        0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64,183,
        67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191,201,
        27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128,122,
        23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64,97,81,
        89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33,225,
        79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224,195,
        86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80,153,
        118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226,176,
        77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243,90,
        0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0,128,
        150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255,255,
        127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254,117,
        126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129,0,
        0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0,48,
        49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,114,10,128,38,165,4,128,116,
        71,233,205,24,60,104,114,82,160,165,4,10,192,121,9,36,127,162,165,4,187,235,98,83,255,54,163,4,255,54,165,4,232,70,16,138,
        226,128,196,129,116,27,80,50,228,232,212,17,88,91,90,80,232,150,4,187,23,98,232,123,18,91,51,210,138,218,233,32,10,131,196,
        4,50,228,136,38,167,4,233,241,17,186,0,0,187,0,129,233,234,5,191,163,4,51,192,252,171,199,5,0,129,195,233,26,172,205,185,
        128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27,5,
        135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205,192,
        135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3,218,
        112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114,5,139,
        216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4,198,6,
        251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247,62,163,
        4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156,83,232,
        25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23,139,159,
        2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147,163,195,
        135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1,138,229,
        138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4,195,139,
        193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22,114,3,186,
        159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232,54,200,139,
        241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200,120,3,233,
        131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2,2,137,30,163,
        4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233,136,255,156,
        138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50,192,205,202,
        162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246,208,208,224,
        26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232,3,22,120,
        250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192,254,192,195,
        120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,199,6,165,4,0,0,121,6,199,6,165,4,255,255,
        11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192,152,3,240,59,245,
        117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220,10,192,116,16,152,
        145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139,243,139,46,92,3,
        252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117,233,58,44,117,
        229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139,222,233,5,211,
        232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192,116,226,161,165,
        4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134,195,246,217,162,
        167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,56,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158,4,190,170,4,185,
        4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250,233,233,17,173,
        25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200,233,244,12,233,
        141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116,240,128,54,165,
        4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217,134,223,137,30,
        166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25,114,18,157,137,
        54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,138,226,138,214,138,243,50,219,128,233,8,246,196,31,
        116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157,121,37,42,204,
        138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30,254,195,117,26,
        235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37,19,195,160,177,
        4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177,4,187,164,4,248,
        232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4,232,119,19,139,
        252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226,249,115,16,185,
        4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165,4,128,116,9,255,
        6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3,233,122,18,232,87,
        244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215,209,214,86,87,43,
        253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93,233,165,11,209,
        210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30,139,30,163,4,129,
        251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51,80,232,36,2,235,
        20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165,4,232,139,2,91,90,
        232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217,50,192,233,9,0,
        205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10,192,117,5,198,
        6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255,189,163,97,
        51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48,106,75,106,
        95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121,175,81,83,
        87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,232,221,0,233,11,0,232,188,0,233,5,0,50,192,232,182,0,157,
        117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,11,246,121,2,247,218,43,215,112,75,116,72,120,8,131,250,39,114,29,233,
        61,10,82,131,194,38,90,121,19,82,186,176,106,82,186,2,95,235,18,90,131,194,38,131,250,218,120,37,185,3,0,211,226,129,194,
        50,96,135,218,82,232,218,16,114,8,232,187,17,232,133,1,235,10,121,5,83,232,201,0,91,232,5,17,91,195,233,138,16,159,128,62,
        251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247,214,235,5,60,43,116,1,
        195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48,50,246,3,208,235,223,
        12,1,156,83,87,232,78,0,95,91,51,246,139,214,232,76,255,157,117,5,83,232,13,0,91,67,195,232,88,16,120,249,233,111,156,116,
        49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136,30,167,4,139,22,163,
        4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232,14,0,176,8,162,251,2,
        51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4,195,205,209,117,3,233,
        24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128,232,138,251,232,203,6,
        232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121,5,36,127,162,165,4,
        186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121,2,247,219,137,30,163,
        4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128,138,222,138,242,138,
        215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139,30,177,4,232,218,240,
        255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116,44,191,0,0,139,207,139,
        0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116,4,71,71,235,219,139,193,
        83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116,5,128,14,158,4,32,160,165,
        4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247,233,221,7,232,115,14,116,
        4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226,139,202,88,247,227,3,200,
        115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254,6,166,4,117,3,233,144,
        7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236,11,195,83,176,8,114,2,
        176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157,89,235,38,4,7,88,121,
        15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254,197,176,2,235,4,2,197,
        181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128,63,46,116,1,67,157,88,
        116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47,254,196,44,10,115,250,
        4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198,7,48,254,197,117,248,
        67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177,3,137,14,129,4,195,180,
        5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136,7,67,137,54,163,4,254,
        204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98,139,22,163,4,86,138,198,
        50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63,48,117,3,67,226,248,195,
        232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13,91,190,171,4,191,159,4,
        185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97,176,9,232,46,255,80,176,
        47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,60,58,117,9,198,7,49,67,198,7,48,235,2,136,7,67,88,254,200,117,215,81,
        190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116,11,137,30,165,4,137,22,163,
        4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83,82,232,94,13,93,176,47,80,
        88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136,7,67,88,254,200,117,206,66,
        66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195,81,185,7,0,191,159,4,248,252,
        46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,35,95,152,43,248,87,139,216,209,227,209,
        227,209,227,129,195,50,96,232,188,11,115,5,232,246,11,235,217,232,152,12,232,98,252,235,209,187,102,96,232,113,12,232,22,
        13,115,6,232,207,11,95,79,87,232,153,11,114,14,187,122,96,232,119,12,232,65,252,88,44,9,235,1,88,89,91,10,192,195,187,180,
        4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15,232,191,242,116,50,189,
        165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112,117,112,117,112,121,
        112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75,198,7,36,246,196,4,
        117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200,117,245,195,187,180,
        4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232,221,255,117,8,67,198,
        7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233,120,252,232,129,10,121,
        3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0,81,232,55,13,139,22,171,
        4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195,233,47,10,191,190,37,87,
        191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10,10,219,121,36,128,255,153,
        114,3,233,239,158,82,83,255,54,163,4,255,54,165,4,232,52,1,91,90,232,92,11,232,63,11,91,90,116,3,233,211,158,160,165,4,10,
        192,121,9,191,195,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4,232,4,1,90,91,232,44,11,117,30,
        82,83,186,0,0,187,0,144,232,31,11,91,90,121,15,157,90,91,233,60,0,186,0,0,187,0,129,233,18,247,157,121,14,83,82,232,47,1,
        138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191,176,125,87,83,82,232,21,1,90,91,
        232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209,46,178,4,115,7,90,91,83,82,232,222,
        250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12,232,130,10,235,214,90,91,195,138,14,
        166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12,128,136,135,1,0,198,135,2,0,184,157,
        156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189,1,195,81,83,248,232,122,9,91,89,226,
        246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67,235,249,91,195,138,14,166,4,128,233,
        152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4,152,128,203,128,157,156,121,6,131,234,
        1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254,195,157,115,5,50,228,233,169,1,158,121,
        10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102,8,126,81,186,0,0,187,0,129,232,190,9,117,
        9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11,187,118,97,232,24,2,90,91,232,16,11,232,
        124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26,244,187,49,128,186,24,114,233,157,249,
        233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186,0,0,137,30,83,4,116,3,232,233,195,137,
        30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82,131,195,4,246,135,255,255,128,120,65,185,
        2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239,4,185,2,0,243,165,50,192,116,3,232,75,240,
        95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240,235,39,131,195,4,139,15,67,67,94,139,20,246,
        6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83,232,165,241,91,89,42,197,232,31,241,116,11,137,
        22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63,44,117,9,232,230,154,232,66,255,233,147,147,233,
        168,154,81,83,86,87,82,178,56,187,158,4,191,165,4,190,166,4,235,25,83,185,4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,
        254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128,234,8,118,21,190,164,4,185,7,0,253,243,164,128,
        38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192,6,138,62,166,4,185,3,0,10,219,120,44,117,18,
        128,239,8,114,29,138,222,138,242,138,212,128,228,32,226,234,116,16,248,208,212,209,210,208,211,246,196,64,117,7,254,207,117,
        216,233,155,6,128,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232,45,0,187,10,4,235,12,83,232,2,0,91,195,232,
        31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232,137,175,176,10,232,132,175,195,252,10,255,
        190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4,0,235,9,131,198,4,191,163,4,185,2,0,46,165,
        226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46,138,7,152,232,246,8,80,67,46,139,7,163,163,
        4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217,232,131,247,91,83,46,139,23,46,139,159,2,
        0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214,6,232,47,7,114,9,91,232,35,251,75,198,
        7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2,197,42,6,130,4,121,5,246,216,232,194,
        250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192,10,194,116,6,232,179,250,232,57,248,143,
        6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138,240,2,194,138,200,120,4,50,192,138,200,
        121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2,197,121,23,160,130,4,232,90,250,198,7,46,
        67,50,201,50,192,42,194,42,197,232,75,250,235,22,160,130,4,82,255,54,129,4,42,197,42,194,2,193,120,3,232,54,250,232,39,0,
        255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103,1,2,194,254,200,120,3,232,15,250,233,
        91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117,2,138,200,195,232,254,4,180,7,114,
        2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246,156,10,210,116,2,254,202,2,242,
        157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4,88,254,196,117,247,232,191,4,232,
        142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232,85,6,235,14,187,110,96,138,196,152,
        3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2,50,228,246,220,160,130,4,2,224,254,
        196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46,130,4,232,94,247,88,10,228,126,5,138,
        196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157,114,21,2,196,138,38,130,4,42,196,10,
        228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246,196,64,180,3,117,2,50,228,163,131,4,
        137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121,8,198,7,45,83,232,226,5,91,67,198,7,
        48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116,3,136,47,67,198,7,0,187,179,4,67,139,
        62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42,116,226,180,1,75,83,80,232,234,234,50,
        228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75,235,3,75,136,7,88,10,228,116,248,131,
        196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139,22,129,4,115,11,83,82,232,69,243,50,192,
        90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75,254,200,120,6,232,20,248,198,7,0,143,6,129,
        4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161,11,0,46,247,38,107,98,139,248,138,202,160,
        109,98,50,228,247,38,11,0,2,200,50,228,160,13,0,46,247,38,107,98,2,200,50,228,46,139,22,110,98,3,215,46,138,30,111,98,18,
        217,136,38,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,184,251,187,179,4,185,32,0,3,7,67,67,226,250,
        36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167,4,233,143,251,83,81,187,158,4,129,7,128,
        0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158,4,255,117,5,128,38,159,4,254,187,165,4,
        138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,131,196,4,233,136,251,128,228,224,128,196,128,115,28,156,66,117,
        18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,88,233,106,251,157,117,3,128,226,254,86,190,163,4,137,20,70,70,138,62,
        167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232,9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,
        166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134,4,232,53,4,187,134,4,232,93,4,232,253,1,232,
        178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87,4,89,117,4,254,193,235,204,139,233,232,117,
        4,139,205,195,128,38,165,4,127,232,143,0,186,219,15,187,73,131,232,250,242,186,219,15,187,73,129,232,101,237,161,165,4,128,
        252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,100,0,160,166,4,60,116,115,9,186,219,15,187,73,131,233,
        200,242,51,210,187,128,127,128,227,127,232,150,2,120,42,128,203,128,232,41,237,232,40,1,156,120,16,51,210,187,128,128,232,
        27,237,232,26,1,120,3,232,80,3,51,210,187,0,127,232,11,237,157,120,3,232,66,3,187,165,4,50,192,10,7,156,121,3,128,55,128,
        187,52,98,232,190,250,157,121,6,187,165,4,128,55,128,195,187,99,98,232,247,1,232,255,240,232,190,241,232,173,3,232,164,247,
        232,0,2,232,195,3,232,246,235,232,7,3,232,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163,4,255,54,165,
        4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114,12,191,57,
        123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165,4,186,215,
        179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255,54,165,4,
        232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236,232,87,176,
        60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163,4,163,165,
        4,195,232,42,0,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165,4,10,192,116,
        7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106,97,232,206,0,
        232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96,114,7,232,171,
        0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0,209,23,67,67,
        226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0,187,170,4,138,
        39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201,116,15,81,248,
        232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255,226,247,195,191,
        124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234,191,159,4,235,229,
        191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91,89,195,81,83,87,
        187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63,233,137,0,83,87,
        138,195,50,6,165,4,120,63,10,219,120,22,161,165,4,43,195,114,66,117,58,161,163,4,43,194,114,57,117,49,50,192,235,95,139,195,
        43,6,165,4,114,43,117,35,139,194,43,6,163,4,114,33,117,25,50,192,235,71,83,87,191,165,4,139,7,50,6,165,4,121,19,138,38,165,
        4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135,247,253,167,117,6,226,
        251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,83,87,191,165,4,138,5,50,7,121,2,235,
        179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128,195,46,43,150,0,0,46,26,
        158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120,8,205,210,128,54,165,
        4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4,232,51,0,191,151,4,185,
        8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195,185,4,0,232,165,253,
        114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223,185,2,0,191,163,4,135,
        251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99,253,114,3,233,29,255,
        233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185,4,0,235,17,232,57,253,
        191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213,114,3,233,180,243,233,
        27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242,46,172,136,7,67,66,254,
        205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211,224,139,216,75,137,30,
        44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162,101,4,162,40,0,187,14,
        3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137,30,224,4,160,223,4,
        254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192,116,14,135,218,3,
        217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51,0,3,218,137,30,228,
        4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,104,173,
        177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173,137,30,10,3,135,218,
        137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128,229,187,220,127,232,
        127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0] 
        
      • ibm-basic-1.10.json
        [233,143,126,232,167,107,203,232,2,101,203,93,232,199,47,116,13,139,54,233,4,138,68,46,60,254,116,2,60,253,195,0,0,0,0,0,0,
        51,46,148,13,104,115,91,17,89,21,102,55,62,22,143,17,237,16,182,16,248,18,12,46,206,16,53,17,95,17,45,46,72,19,80,47,53,31,
        27,45,254,17,88,30,240,27,145,34,133,46,190,7,190,7,83,30,67,19,46,31,0,0,138,30,95,17,156,46,157,46,163,46,243,46,223,54,
        169,18,88,18,57,34,184,18,216,34,251,15,254,15,1,16,4,16,217,20,4,61,48,61,160,93,0,0,0,0,0,0,169,61,63,36,158,36,4,64,82,
        67,108,65,109,65,206,65,47,83,231,82,38,93,19,70,51,70,41,88,13,88,209,71,205,71,147,81,42,80,23,84,104,41,165,41,177,41,
        28,101,128,126,150,125,241,112,135,120,14,122,12,115,132,98,244,121,173,122,205,122,140,43,61,30,122,27,232,40,23,38,233,
        41,248,40,11,41,128,34,71,41,13,38,18,38,117,27,173,107,81,107,130,107,156,101,250,85,152,86,18,87,192,68,152,68,172,68,55,
        1,72,1,87,1,139,1,180,1,217,1,229,1,244,1,249,1,21,2,22,2,26,2,80,2,98,2,109,2,134,2,169,2,170,2,223,2,35,3,58,3,67,3,77,
        3,101,3,105,3,106,3,85,84,207,170,78,196,238,66,211,6,84,206,14,83,195,21,0,83,65,86,197,194,76,79,65,196,195,69,69,208,197,
        0,79,76,79,210,191,76,79,83,197,187,79,78,212,153,76,69,65,210,146,83,82,76,73,206,219,73,78,212,28,83,78,199,29,68,66,204,
        30,79,211,12,72,82,164,22,65,76,204,179,76,211,192,0,69,76,69,84,197,169,65,84,193,132,73,205,134,69,70,83,84,210,172,69,
        70,73,78,212,173,69,70,83,78,199,174,69,70,68,66,204,175,69,198,151,0,76,83,197,161,78,196,129,82,65,83,197,165,68,73,212,
        166,82,82,79,210,167,82,204,212,82,210,213,88,208,11,79,198,35,81,214,241,0,79,210,130,206,209,82,197,15,73,216,31,0,79,84,
        207,137,79,32,84,207,137,79,83,85,194,141,0,69,88,164,26,0,78,80,85,212,133,198,139,78,83,84,210,216,78,212,5,78,208,16,77,
        208,242,78,75,69,89,164,222,0,0,69,217,201,0,79,67,65,84,197,202,80,82,73,78,212,157,76,73,83,212,158,80,79,211,27,69,212,
        136,73,78,197,176,79,65,196,188,73,83,212,147,79,199,10,79,195,36,69,206,18,69,70,84,164,1,79,198,37,0,79,84,79,210,193,69,
        82,71,197,189,79,196,243,73,68,164,3,0,69,88,212,131,69,215,148,79,212,211,0,80,69,206,186,85,212,156,206,149,210,239,67,
        84,164,25,80,84,73,79,206,184,70,198,221,0,82,73,78,212,145,79,75,197,152,79,211,17,69,69,203,23,83,69,212,198,82,69,83,69,
        212,199,79,73,78,212,220,69,206,32,0,0,85,206,138,69,84,85,82,206,142,69,65,196,135,69,83,84,79,82,197,140,69,205,143,69,
        83,85,77,197,168,73,71,72,84,164,2,78,196,8,69,78,85,205,171,65,78,68,79,77,73,90,197,185,0,67,82,69,69,206,200,84,79,208,
        144,87,65,208,164,65,86,197,190,80,67,168,210,84,69,208,207,71,206,4,81,210,7,73,206,9,84,82,164,19,84,82,73,78,71,164,214,
        80,65,67,69,164,24,79,85,78,196,196,84,73,67,203,33,84,82,73,199,34,0,72,69,206,205,82,79,206,162,82,79,70,198,163,65,66,
        168,206,207,204,65,206,13,0,83,73,78,199,215,83,210,208,0,65,204,20,65,82,80,84,210,218,0,73,68,84,200,160,65,73,212,150,
        72,73,76,197,177,69,78,196,178,82,73,84,197,183,0,79,210,240,0,0,0,171,233,173,234,170,235,175,236,222,237,220,244,167,217,
        190,230,189,231,188,232,0,121,121,124,124,127,80,70,60,50,40,122,123,130,107,0,0,173,107,59,100,81,107,168,102,3,99,83,108,
        32,99,116,101,18,99,25,99,65,99,40,99,49,100,106,99,79,99,137,99,215,24,180,101,0,78,69,88,84,32,119,105,116,104,111,117,
        116,32,70,79,82,0,83,121,110,116,97,120,32,101,114,114,111,114,0,82,69,84,85,82,78,32,119,105,116,104,111,117,116,32,71,79,
        83,85,66,0,79,117,116,32,111,102,32,68,65,84,65,0,73,108,108,101,103,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,
        108,0,79,118,101,114,102,108,111,119,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,85,110,100,101,102,105,110,101,
        100,32,108,105,110,101,32,110,117,109,98,101,114,0,83,117,98,115,99,114,105,112,116,32,111,117,116,32,111,102,32,114,97,110,
        103,101,0,68,117,112,108,105,99,97,116,101,32,68,101,102,105,110,105,116,105,111,110,0,68,105,118,105,115,105,111,110,32,
        98,121,32,122,101,114,111,0,73,108,108,101,103,97,108,32,100,105,114,101,99,116,0,84,121,112,101,32,109,105,115,109,97,116,
        99,104,0,79,117,116,32,111,102,32,115,116,114,105,110,103,32,115,112,97,99,101,0,83,116,114,105,110,103,32,116,111,111,32,
        108,111,110,103,0,83,116,114,105,110,103,32,102,111,114,109,117,108,97,32,116,111,111,32,99,111,109,112,108,101,120,0,67,
        97,110,39,116,32,99,111,110,116,105,110,117,101,0,85,110,100,101,102,105,110,101,100,32,117,115,101,114,32,102,117,110,99,
        116,105,111,110,0,78,111,32,82,69,83,85,77,69,0,82,69,83,85,77,69,32,119,105,116,104,111,117,116,32,101,114,114,111,114,0,
        85,110,112,114,105,110,116,97,98,108,101,32,101,114,114,111,114,0,77,105,115,115,105,110,103,32,111,112,101,114,97,110,100,
        0,76,105,110,101,32,98,117,102,102,101,114,32,111,118,101,114,102,108,111,119,0,68,101,118,105,99,101,32,84,105,109,101,111,
        117,116,0,68,101,118,105,99,101,32,70,97,117,108,116,0,70,79,82,32,87,105,116,104,111,117,116,32,78,69,88,84,0,79,117,116,
        32,111,102,32,80,97,112,101,114,0,63,0,87,72,73,76,69,32,119,105,116,104,111,117,116,32,87,69,78,68,0,87,69,78,68,32,119,
        105,116,104,111,117,116,32,87,72,73,76,69,0,70,73,69,76,68,32,111,118,101,114,102,108,111,119,0,73,110,116,101,114,110,97,
        108,32,101,114,114,111,114,0,66,97,100,32,102,105,108,101,32,110,117,109,98,101,114,0,70,105,108,101,32,110,111,116,32,102,
        111,117,110,100,0,66,97,100,32,102,105,108,101,32,109,111,100,101,0,70,105,108,101,32,97,108,114,101,97,100,121,32,111,112,
        101,110,0,63,0,68,101,118,105,99,101,32,73,47,79,32,69,114,114,111,114,0,70,105,108,101,32,97,108,114,101,97,100,121,32,101,
        120,105,115,116,115,0,63,0,63,0,68,105,115,107,32,102,117,108,108,0,73,110,112,117,116,32,112,97,115,116,32,101,110,100,0,
        66,97,100,32,114,101,99,111,114,100,32,110,117,109,98,101,114,0,66,97,100,32,102,105,108,101,32,110,97,109,101,0,63,0,68,
        105,114,101,99,116,32,115,116,97,116,101,109,101,110,116,32,105,110,32,102,105,108,101,0,84,111,111,32,109,97,110,121,32,
        102,105,108,101,115,0,0,0,0,195,30,16,0,82,199,79,128,82,199,79,128,228,0,203,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,1,0,0,80,56,0,114,7,254,255,15,7,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,
        0,0,7,7,32,0,0,0,0,0,0,0,0,0,0,1,24,24,0,0,0,0,80,0,1,0,0,0,7,7,0,0,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,32,105,110,32,0,79,107,255,13,0,66,114,101,97,107,0,187,4,0,3,220,67,138,7,67,60,177,117,7,185,6,0,3,217,235,
        241,60,130,116,1,195,138,15,67,138,47,67,83,139,217,11,210,135,218,116,4,135,218,59,218,185,16,0,91,116,230,3,217,235,207,
        185,181,8,233,145,0,205,134,139,30,46,0,138,199,34,195,254,192,116,9,160,79,3,10,192,178,19,117,77,233,189,38,178,61,185,
        178,57,185,178,54,185,178,53,185,178,52,185,178,51,185,178,62,185,178,55,185,178,64,185,178,63,185,178,50,185,178,67,185,
        178,58,235,34,139,30,55,3,137,30,46,0,178,2,185,178,11,185,178,1,185,178,10,185,178,18,185,178,20,185,178,6,185,178,22,185,
        178,13,50,192,162,54,5,162,95,0,162,98,4,162,96,0,139,30,46,0,137,30,71,3,50,192,162,101,4,162,107,4,138,199,34,195,254,192,
        116,4,137,30,73,3,185,12,8,139,30,69,3,233,177,37,89,138,194,138,202,162,40,0,139,30,67,3,137,30,75,3,135,218,139,30,71,3,
        138,199,34,195,254,192,116,10,137,30,84,3,135,218,137,30,86,3,139,30,77,3,11,219,135,218,187,79,3,116,11,34,7,117,7,254,15,
        135,218,233,115,6,50,192,136,7,138,209,232,8,36,187,180,3,205,135,138,194,60,68,115,8,60,50,115,6,60,31,114,6,176,40,44,19,
        138,208,46,138,7,67,10,192,117,248,75,67,254,202,117,242,83,139,30,71,3,94,135,222,86,205,136,46,138,7,60,63,117,6,91,187,
        180,3,235,212,232,190,114,91,186,254,255,59,218,205,137,117,3,233,238,117,138,199,34,195,254,192,116,3,232,153,92,176,255,
        232,241,34,176,89,205,138,50,192,162,111,0,232,59,60,232,154,35,187,45,7,232,140,114,160,40,0,44,2,117,3,232,238,45,205,139,
        187,255,255,137,30,46,0,160,62,3,10,192,116,73,139,30,63,3,83,232,101,92,90,82,232,119,1,176,42,114,2,176,32,232,172,34,232,
        132,40,90,115,14,50,192,162,62,3,235,176,50,192,162,62,3,235,21,139,30,65,3,3,218,114,241,82,186,249,255,59,218,90,115,232,
        137,30,63,3,160,247,1,10,192,116,170,233,168,45,232,81,40,114,162,232,233,5,254,192,254,200,116,153,156,232,45,7,115,8,232,
        147,38,117,3,233,118,254,232,56,4,138,7,60,32,117,3,232,240,91,82,232,49,1,90,157,137,30,67,3,205,140,114,3,233,111,59,82,
        81,232,238,61,232,176,5,10,192,156,137,22,73,3,232,240,0,114,9,157,156,117,3,233,176,7,10,192,81,156,83,232,173,26,91,157,
        89,81,115,3,232,214,24,90,157,82,116,71,90,160,107,4,10,192,117,8,139,30,10,3,137,30,47,3,139,30,88,3,94,135,222,86,89,83,
        3,217,83,232,21,91,91,137,30,88,3,135,218,136,63,89,90,83,67,67,137,23,67,67,186,184,0,73,73,73,73,139,242,172,136,7,67,66,
        73,138,193,10,197,117,242,205,141,90,232,30,0,139,30,233,4,137,30,82,3,232,73,35,205,142,139,30,82,3,137,30,233,4,233,216,
        254,139,30,48,0,135,218,138,254,138,218,138,7,67,10,7,117,1,195,67,67,67,138,7,10,192,116,16,60,32,115,245,60,11,114,241,
        232,253,4,232,249,4,235,236,67,135,218,137,23,235,212,186,0,0,82,116,23,60,44,116,19,90,232,35,6,82,116,29,60,44,116,25,232,
        175,35,234,116,2,60,44,186,250,255,116,3,232,12,6,116,7,60,44,116,3,233,99,253,137,30,59,3,135,218,90,94,135,222,86,83,139,
        30,48,0,139,203,138,7,67,10,7,159,75,158,116,149,67,67,139,31,59,218,139,217,139,31,245,116,136,245,115,133,235,226,50,192,
        162,253,2,162,252,2,205,143,185,59,1,186,184,0,138,7,10,192,117,32,187,64,1,138,195,42,193,138,200,138,199,26,197,138,232,
        187,183,0,50,192,139,250,170,66,139,250,170,66,139,250,170,195,60,34,117,3,233,51,0,60,32,116,9,160,252,2,10,192,138,7,116,
        47,67,80,232,84,2,88,44,58,116,6,60,74,117,8,176,1,162,252,2,162,253,2,44,85,117,172,80,138,7,10,192,88,116,170,58,7,116,
        218,80,138,7,67,232,44,2,235,236,67,10,192,120,146,75,60,63,176,145,82,81,117,3,233,226,0,186,107,3,232,210,14,232,41,36,
        115,3,233,46,1,83,186,94,11,232,32,0,117,62,232,240,3,186,98,11,232,21,0,176,137,117,3,235,11,144,186,101,11,232,8,0,117,
        38,176,141,89,233,173,0,139,242,46,172,10,192,117,1,195,138,200,232,149,14,58,193,117,246,67,66,235,234,71,79,32,0,84,79,
        0,85,66,0,91,232,127,14,83,205,144,187,3,1,44,65,2,192,138,200,181,0,3,217,46,139,23,91,67,83,232,102,14,138,200,139,242,
        46,172,36,127,117,3,233,171,1,67,58,193,117,80,139,242,46,172,66,10,192,121,226,138,193,60,40,116,29,139,242,46,172,60,209,
        116,21,60,208,116,17,232,54,14,60,46,116,3,232,199,21,176,0,114,3,233,122,1,88,139,242,46,172,205,145,10,192,121,3,233,35,
        0,89,90,12,128,80,176,255,232,81,1,50,192,162,253,2,88,232,72,1,233,178,254,91,139,242,46,172,66,10,192,121,247,66,235,141,
        75,80,205,146,186,12,12,138,200,139,242,46,172,10,192,116,23,66,58,193,117,243,235,20,140,170,171,169,166,168,212,161,138,
        147,158,137,142,205,141,0,50,192,235,2,176,1,162,253,2,88,89,90,60,161,80,117,3,232,250,0,88,60,177,117,5,232,244,0,176,233,
        60,217,116,3,233,198,0,80,232,229,0,176,143,232,226,0,88,80,233,173,254,138,7,60,46,116,14,60,58,114,3,233,144,0,60,48,115,
        3,233,137,0,160,253,2,10,192,138,7,89,90,121,3,233,98,254,116,39,60,46,117,3,233,89,254,176,14,232,173,0,82,232,232,3,232,
        253,0,94,135,222,86,135,218,138,195,232,155,0,138,199,91,232,149,0,233,255,253,82,81,138,7,232,31,93,232,223,0,89,90,83,160,
        251,2,60,2,117,26,139,30,163,4,138,199,10,192,176,2,117,14,138,195,138,251,179,15,60,10,115,200,4,17,235,203,80,208,200,4,
        27,232,92,0,187,163,4,232,79,14,114,3,187,159,4,88,80,138,7,232,74,0,88,67,254,200,117,244,91,233,173,253,186,106,3,66,139,
        242,46,172,36,127,117,3,233,107,0,66,58,7,139,242,46,172,117,235,233,111,0,60,38,116,3,233,197,253,83,232,11,2,91,232,215,
        12,60,72,176,11,117,2,176,12,232,11,0,82,81,232,217,12,89,233,92,255,176,58,139,250,170,66,73,138,193,10,197,116,1,195,178,
        23,233,155,250,205,147,91,75,254,200,162,253,2,89,90,232,160,12,232,222,255,67,232,153,12,232,240,33,115,244,60,58,115,8,
        60,48,115,236,60,46,116,232,233,51,253,138,7,60,32,115,10,60,9,116,6,60,10,116,2,176,32,80,160,253,2,254,192,116,2,254,200,
        233,159,254,75,138,7,60,32,116,249,60,9,116,245,60,10,116,241,67,195,176,100,162,57,3,232,210,41,232,85,32,231,82,137,22,
        59,3,160,251,2,80,232,123,9,88,83,232,41,16,187,86,4,232,69,86,91,90,89,83,232,157,3,137,30,53,3,187,2,0,3,220,232,115,249,
        117,30,3,217,82,75,138,55,75,138,23,67,67,83,139,30,53,3,59,218,91,90,117,229,90,139,227,137,30,69,3,177,90,135,218,177,8,
        232,227,30,83,139,30,53,3,94,135,222,86,83,139,30,46,0,94,135,222,86,232,237,31,204,232,26,13,117,3,233,198,249,114,3,233,
        193,249,156,232,14,9,157,83,120,3,233,28,0,232,138,93,94,135,222,86,186,1,0,138,7,60,207,117,3,232,212,16,82,83,135,218,232,
        198,86,235,39,232,18,93,232,177,85,91,81,82,185,0,129,138,241,138,214,205,148,138,7,60,207,176,1,117,14,232,207,8,83,232,
        244,92,232,147,85,232,18,109,91,81,82,138,200,232,186,12,138,232,81,75,232,171,0,116,3,233,71,249,232,129,22,232,160,0,83,
        83,139,30,90,4,137,30,46,0,139,30,59,3,94,135,222,86,181,130,81,159,134,196,80,134,196,159,134,196,80,134,196,233,207,100,
        181,130,81,235,66,233,203,248,233,18,249,195,232,117,0,235,80,205,149,233,99,15,233,213,2,10,192,117,235,67,138,7,67,10,7,
        116,224,67,139,23,67,137,22,46,0,246,6,118,4,255,116,38,83,176,91,232,202,28,135,218,232,112,86,176,93,232,192,28,91,235,
        19,205,150,232,155,29,137,38,69,3,137,30,67,3,138,7,60,58,117,191,67,138,7,60,58,114,171,186,232,14,82,116,164,44,129,114,
        171,60,74,115,162,50,228,2,192,139,240,205,151,46,255,180,37,0,67,138,7,60,58,114,1,195,60,32,116,244,114,8,60,48,245,254,
        192,254,200,195,10,192,116,251,60,11,114,114,60,30,117,6,160,0,3,10,192,195,60,16,116,60,80,67,162,0,3,44,28,115,57,44,245,
        115,7,60,254,117,27,138,7,67,137,30,254,2,183,0,138,216,137,30,2,3,176,2,162,1,3,187,4,0,88,10,192,195,138,7,67,67,137,30,
        254,2,75,138,63,235,225,232,55,0,139,30,254,2,235,147,254,192,208,192,162,1,3,82,81,186,2,3,135,218,138,232,232,19,85,135,
        218,89,90,137,30,254,2,88,187,4,0,10,192,195,60,9,114,3,233,105,255,60,48,245,254,192,254,200,195,160,0,3,60,15,115,23,60,
        13,114,19,139,30,2,3,117,10,67,67,67,138,23,67,138,55,135,218,233,106,84,160,1,3,162,251,2,60,8,116,17,139,30,2,3,137,30,
        163,4,139,30,4,3,137,30,165,4,195,187,2,3,233,157,84,178,3,185,178,2,185,178,4,185,178,8,232,58,31,185,190,7,81,114,229,44,
        65,138,200,138,232,232,5,255,60,234,117,15,232,254,254,232,33,31,114,208,44,65,138,232,232,242,254,138,197,42,193,114,195,
        254,192,94,135,222,86,187,96,3,181,0,3,217,136,23,67,254,200,117,249,91,138,7,60,44,117,168,232,206,254,235,181,232,201,254,
        232,179,14,121,155,178,5,233,122,247,138,7,60,46,139,22,73,3,117,3,233,178,254,75,232,174,254,60,14,116,2,60,13,139,22,2,
        3,117,3,233,159,254,50,192,162,0,3,75,186,0,0,232,147,254,114,1,195,83,159,80,187,152,25,59,218,114,27,138,254,138,218,3,
        218,3,219,3,218,3,219,88,158,44,48,138,208,182,0,3,218,135,218,91,235,213,88,158,91,195,117,3,233,124,28,60,14,116,7,60,13,
        116,3,233,163,48,232,117,28,185,232,14,235,30,177,3,232,2,28,232,149,255,89,83,83,139,30,46,0,94,135,222,86,176,141,159,134,
        196,80,134,196,81,235,4,81,232,123,255,160,0,3,60,13,135,218,116,188,60,14,116,3,233,190,246,135,218,83,139,30,254,2,94,135,
        222,86,232,81,0,67,83,139,30,46,0,59,218,91,115,3,232,79,249,114,3,232,70,249,115,13,73,176,13,162,61,3,91,232,252,18,139,
        217,195,178,8,233,163,246,205,152,117,246,182,255,232,250,245,139,227,137,30,69,3,60,141,178,3,116,3,233,139,246,91,137,30,
        46,0,187,232,14,94,135,222,86,176,91,177,58,235,2,177,0,181,0,138,193,138,205,138,232,75,232,176,253,10,192,116,190,58,197,
        116,186,67,60,34,116,233,254,192,116,236,44,140,117,231,58,197,18,198,138,240,235,223,88,4,3,235,20,232,220,37,232,95,28,
        231,137,22,59,3,82,160,251,2,80,232,133,5,88,94,135,222,86,138,232,160,251,2,58,197,138,197,116,6,232,37,12,160,251,2,186,
        163,4,60,5,114,3,186,159,4,83,60,3,117,49,139,30,163,4,83,67,139,23,139,30,48,0,59,218,115,17,139,30,92,3,59,218,90,115,17,
        187,44,3,59,218,115,10,176,90,232,230,22,135,218,232,51,20,232,222,22,94,135,222,86,232,190,82,90,91,195,60,167,117,50,232,
        24,253,232,236,27,137,232,95,254,11,210,116,13,232,79,248,138,245,138,209,91,114,3,233,19,255,137,22,77,3,114,218,160,79,
        3,10,192,138,194,116,209,160,40,0,138,208,233,206,245,232,229,12,138,7,138,232,60,141,116,5,232,178,27,137,75,138,202,254,
        201,138,197,117,3,233,185,252,232,26,254,60,44,117,167,235,238,160,79,3,10,192,117,8,51,192,163,77,3,233,102,245,254,192,
        162,40,0,128,63,131,116,18,232,247,253,117,12,11,210,116,16,232,115,254,50,192,162,79,3,195,232,151,252,117,250,235,7,50,
        192,162,79,3,254,192,161,71,3,163,46,0,139,30,75,3,117,229,128,63,0,117,3,131,195,4,67,233,23,25,232,112,12,117,218,10,192,
        117,3,233,164,253,233,32,245,186,10,0,82,116,31,232,157,253,135,218,94,135,222,86,116,22,135,218,232,38,27,44,139,22,65,3,
        116,8,232,147,253,116,3,233,225,244,135,218,138,199,10,195,117,3,233,113,253,137,30,65,3,162,62,3,91,137,30,63,3,89,233,219,
        245,232,44,4,138,7,60,44,117,3,232,25,252,60,137,116,5,232,233,26,205,75,83,232,210,81,91,116,25,232,6,252,117,1,195,60,14,
        117,3,233,204,253,60,13,116,3,233,224,251,139,30,2,3,195,182,1,232,41,254,10,192,116,246,232,228,251,60,161,117,242,254,206,
        117,238,235,209,232,106,1,235,3,232,155,49,75,232,206,251,117,3,232,29,25,117,3,233,63,1,60,215,117,3,233,107,39,60,206,117,
        3,233,171,0,60,210,117,3,233,164,0,83,60,44,116,109,60,59,117,3,233,23,1,89,232,169,3,83,232,163,7,116,15,232,65,93,232,194,
        18,198,7,32,139,30,163,4,254,7,205,153,139,30,163,4,83,232,57,28,116,13,232,49,1,120,3,233,49,0,232,129,69,235,3,160,41,0,
        138,232,254,192,116,35,232,30,28,116,7,232,102,69,138,7,235,3,232,104,59,91,83,10,192,116,14,2,7,245,115,4,254,200,58,197,
        114,3,232,153,24,91,232,222,18,91,233,107,255,205,154,185,50,0,139,30,233,4,3,217,232,232,27,138,7,117,24,160,42,0,138,232,
        232,50,59,60,255,116,12,58,197,114,3,232,108,24,114,3,233,135,0,44,14,115,252,246,208,235,114,80,232,7,251,232,241,10,88,
        80,60,210,116,1,74,138,198,10,192,120,3,233,3,0,186,0,0,83,232,166,27,116,13,232,158,0,120,3,233,21,0,232,238,68,235,3,160,
        41,0,138,216,254,192,116,7,183,0,232,124,81,135,218,91,232,161,25,41,75,88,44,210,83,116,19,185,50,0,139,30,233,4,3,217,232,
        111,27,138,7,117,3,232,190,58,246,208,2,194,114,16,254,192,116,25,232,246,23,138,194,254,200,121,3,233,13,0,254,192,138,232,
        176,32,232,24,23,254,205,117,249,91,232,136,250,233,188,254,205,155,50,192,83,82,81,232,134,44,89,90,50,192,138,248,138,216,
        137,30,233,4,91,195,83,50,192,159,134,196,80,134,196,232,233,42,116,3,233,226,242,83,185,46,0,178,2,182,253,3,217,136,55,
        176,0,91,233,230,41,232,51,46,10,192,195,60,133,116,3,233,162,51,232,17,25,133,60,35,117,3,233,40,48,232,48,29,232,115,0,
        232,122,34,232,68,79,82,83,232,167,28,90,89,115,3,233,69,25,81,82,181,0,232,69,17,91,176,3,233,147,252,63,82,101,100,111,
        32,102,114,111,109,32,115,116,97,114,116,13,0,67,138,7,10,192,117,3,233,146,242,60,34,117,242,233,155,0,91,91,235,12,205,
        156,160,58,3,10,192,116,3,233,115,242,89,187,16,21,232,11,102,139,30,67,3,195,232,148,47,83,187,246,1,233,224,0,60,35,116,
        242,232,190,28,185,140,21,81,60,34,176,0,176,255,162,95,4,117,223,232,219,16,138,7,60,44,117,10,50,192,162,95,4,232,157,249,
        235,4,232,111,24,59,83,232,48,17,91,195,83,160,95,4,10,192,116,10,176,63,232,12,22,176,32,232,7,22,232,2,28,89,115,3,233,
        161,24,81,50,192,162,58,3,198,7,44,135,218,91,83,82,82,75,176,128,162,57,3,232,94,249,232,165,34,138,7,75,60,40,117,32,67,
        181,0,254,197,232,76,249,117,3,233,232,241,60,34,117,3,233,69,255,60,40,116,235,60,41,117,233,254,205,117,229,232,49,249,
        116,7,60,44,116,3,233,201,241,94,135,222,86,138,7,60,44,116,3,233,49,255,176,1,162,169,4,232,98,0,160,169,4,254,200,116,3,
        233,31,255,83,232,13,5,117,3,232,140,18,91,75,232,251,248,94,135,222,86,138,7,60,44,116,139,91,75,232,236,248,10,192,91,116,
        3,233,10,255,198,7,44,235,6,83,139,30,94,3,13,50,192,162,58,3,94,135,222,86,235,4,232,162,23,44,232,24,33,94,135,222,86,82,
        138,7,60,44,116,10,160,58,3,10,192,116,3,233,139,0,13,50,192,162,82,4,232,98,25,116,3,233,139,46,232,169,4,80,117,56,232,
        155,248,138,240,138,232,60,34,116,14,160,58,3,10,192,138,240,116,2,182,58,181,44,75,232,182,15,88,4,3,138,200,160,82,4,10,
        192,117,1,195,138,193,135,218,187,202,22,94,135,222,86,82,233,240,250,232,99,248,88,80,60,5,185,155,22,81,115,3,233,249,82,
        233,253,82,75,232,79,248,116,7,60,44,116,3,233,96,254,94,135,222,86,75,232,62,248,116,3,233,107,255,90,160,58,3,10,192,135,
        218,116,3,233,53,23,82,91,233,162,253,232,98,250,10,192,117,21,67,138,7,67,10,7,178,4,117,3,233,206,240,67,139,23,67,137,
        22,55,3,232,8,248,60,132,117,221,233,79,255,232,213,22,231,233,4,0,232,206,22,40,75,182,0,82,177,1,232,165,21,205,157,232,
        178,1,50,192,162,168,4,137,30,82,3,139,30,82,3,89,138,7,137,30,49,3,60,230,115,1,195,60,233,114,117,44,233,138,208,117,12,
        160,251,2,60,3,138,194,117,3,233,214,16,60,12,115,229,187,128,3,182,0,3,218,138,197,46,138,55,58,198,115,213,81,185,62,23,
        81,138,198,205,158,60,127,116,100,60,81,114,109,36,254,60,122,116,103,160,251,2,44,3,117,3,233,61,240,10,192,255,54,163,4,
        121,3,233,17,0,255,54,165,4,122,3,233,8,0,255,54,159,4,255,54,161,4,4,3,138,202,138,232,81,185,35,24,81,139,30,49,3,233,99,
        255,182,0,44,230,114,52,60,3,115,48,60,1,208,208,50,198,58,198,138,240,115,3,233,222,239,137,30,49,3,232,54,247,235,224,232,
        101,83,232,55,76,185,41,101,182,127,235,201,82,232,179,83,90,83,185,49,27,235,190,138,197,60,100,114,1,195,81,82,186,4,100,
        187,3,27,83,232,17,3,116,3,233,118,255,139,30,163,4,83,185,200,37,235,156,89,138,193,162,252,2,160,251,2,58,197,117,13,60,
        2,116,40,60,4,117,3,233,127,0,115,57,138,240,138,197,60,8,116,46,138,198,60,8,116,87,138,197,60,4,116,102,138,198,60,3,117,
        3,233,124,239,115,101,187,170,3,181,0,3,217,3,217,46,138,15,67,46,138,47,90,139,30,163,4,81,195,232,12,83,232,37,76,91,137,
        30,161,4,91,137,30,159,4,89,90,232,90,75,232,247,82,187,150,3,160,252,2,208,192,2,195,138,216,18,199,42,195,138,248,46,139,
        31,255,227,138,197,80,232,246,75,88,162,251,2,60,4,116,211,91,137,30,163,4,235,209,232,151,82,89,90,187,160,3,235,205,91,
        232,97,75,232,101,74,232,40,75,91,137,30,165,4,91,137,30,163,4,235,229,83,135,218,232,80,74,91,232,69,75,232,73,74,233,59,
        76,232,51,246,117,3,233,228,238,115,3,233,204,80,232,78,22,114,3,233,219,0,60,32,115,3,233,127,246,205,159,254,192,117,3,
        233,106,1,254,200,60,233,116,213,60,234,117,3,233,175,0,60,34,117,3,233,45,13,60,211,117,3,233,236,1,60,38,117,3,233,209,
        0,60,213,117,12,232,232,245,160,40,0,83,232,67,2,91,195,60,212,117,13,232,216,245,83,139,30,71,3,232,247,74,91,195,60,218,
        117,46,232,199,245,232,155,20,40,60,35,117,13,232,184,5,83,232,64,38,135,218,91,233,3,0,232,249,30,232,131,20,41,83,135,218,
        11,219,117,3,233,221,246,232,141,75,91,195,60,208,117,3,233,0,2,60,216,117,3,233,139,16,60,200,117,3,233,208,59,60,220,117,
        3,233,76,46,60,222,117,3,233,249,18,60,214,117,3,233,112,15,60,133,117,3,233,56,42,60,219,117,3,233,164,59,60,209,117,3,233,
        126,2,232,96,253,232,46,20,41,195,182,125,232,93,253,139,30,82,3,83,232,214,99,91,195,232,148,29,83,135,218,137,30,163,4,
        232,65,1,116,3,232,175,74,91,195,138,7,60,97,114,249,60,123,115,245,36,95,195,60,38,116,3,233,108,246,186,0,0,232,24,245,
        232,229,255,60,79,116,57,60,72,117,52,181,5,67,138,7,232,213,255,232,42,21,135,218,115,10,60,58,115,77,44,48,114,73,235,6,
        60,71,115,67,44,55,3,219,3,219,3,219,3,219,10,195,138,216,135,218,254,205,117,209,233,140,237,75,232,213,244,135,218,115,
        36,60,56,114,3,233,107,237,185,208,7,81,3,219,114,156,3,219,114,152,3,219,114,148,89,181,0,44,48,138,200,3,217,135,218,235,
        213,232,153,74,135,218,195,67,138,7,44,129,60,7,117,14,83,232,154,244,60,40,91,116,3,233,224,73,176,7,181,0,208,192,138,200,
        81,232,134,244,138,193,60,5,115,34,232,131,252,232,81,19,44,232,148,73,135,218,139,30,163,4,94,135,222,86,83,135,218,232,
        101,4,135,218,94,135,222,86,235,33,232,254,254,94,135,222,86,138,195,60,12,114,11,60,27,205,161,83,115,3,232,123,80,91,186,
        213,25,82,176,1,162,168,4,185,185,0,205,160,3,217,46,255,39,254,206,60,234,116,133,60,45,116,129,254,198,60,43,117,1,195,
        60,233,116,251,159,75,158,195,254,192,18,192,89,34,197,4,255,26,192,232,248,73,235,15,182,90,232,18,252,232,146,80,247,211,
        137,30,163,4,89,233,25,252,160,251,2,60,8,254,200,254,200,254,200,195,138,197,80,232,118,80,88,90,60,122,117,3,233,137,74,
        60,123,117,3,233,102,72,185,12,101,81,60,70,117,3,11,218,195,60,80,117,3,35,218,195,60,60,117,3,51,218,195,60,50,117,5,51,
        218,247,211,195,247,211,35,218,247,211,195,43,218,233,207,72,160,99,0,235,3,232,175,51,254,192,138,216,50,192,138,248,233,
        132,73,232,46,0,82,232,49,254,94,135,222,86,139,23,128,250,255,117,3,233,188,244,14,187,7,101,83,255,54,80,3,82,160,251,2,
        80,60,3,117,3,232,247,12,88,135,218,187,163,4,203,232,97,243,185,0,0,60,27,115,16,60,17,114,12,232,83,243,160,2,3,10,192,
        208,208,138,200,135,218,187,18,0,3,217,135,218,195,232,217,255,82,232,16,18,231,232,194,6,94,135,222,86,137,23,91,195,60,
        208,116,233,60,209,116,28,232,249,17,83,232,245,17,69,232,241,17,71,140,218,116,7,232,233,17,231,232,155,6,137,22,80,3,195,
        232,243,1,232,224,1,135,218,137,23,135,218,138,7,60,40,116,3,233,50,245,232,241,242,232,63,27,138,7,60,41,117,3,233,35,245,
        232,185,17,44,235,238,232,201,1,160,251,2,10,192,80,137,30,82,3,135,218,139,31,11,219,117,3,233,116,235,138,7,60,40,116,3,
        233,206,0,232,187,242,137,30,49,3,135,218,139,30,82,3,232,133,17,40,50,192,80,83,135,218,176,128,162,57,3,232,240,26,135,
        218,94,135,222,86,160,251,2,80,82,232,155,250,137,30,82,3,91,137,30,49,3,88,232,65,1,177,4,232,55,16,187,248,255,3,220,139,
        227,232,249,71,160,251,2,80,139,30,82,3,138,7,60,41,116,19,232,59,17,44,83,139,30,49,3,232,50,17,44,235,177,88,162,228,3,
        88,10,192,116,78,162,251,2,187,0,0,3,220,232,191,71,187,8,0,3,220,139,227,90,179,3,254,195,74,139,242,172,10,192,120,246,
        74,74,74,160,251,2,2,195,138,232,160,228,3,138,200,2,197,60,100,114,3,233,84,243,80,138,195,181,0,187,230,3,3,217,138,200,
        232,223,0,185,197,28,81,81,233,153,244,139,30,82,3,232,250,241,83,139,30,49,3,232,201,16,41,176,82,137,30,49,3,160,124,3,
        4,4,80,208,200,138,200,232,150,15,88,138,200,246,208,254,192,138,216,183,255,3,220,139,227,83,186,122,3,232,158,0,91,137,
        30,122,3,139,30,228,3,137,30,124,3,139,203,187,126,3,186,230,3,232,134,0,138,248,138,216,137,30,228,3,139,30,80,4,67,137,
        30,80,4,138,199,10,195,162,77,4,139,30,49,3,232,144,249,75,232,141,241,116,3,233,41,234,232,141,253,117,17,186,44,3,139,30,
        163,4,59,218,114,6,232,124,8,232,230,8,139,30,122,3,138,247,138,211,67,67,138,15,67,138,47,65,65,65,65,187,122,3,232,47,0,
        135,218,139,227,139,30,80,4,75,137,30,80,4,138,199,10,195,162,77,4,91,88,83,36,7,187,140,3,138,200,181,0,3,217,232,252,252,
        91,195,139,242,172,136,7,67,66,73,138,197,10,193,117,242,195,83,139,30,46,0,67,11,219,91,117,244,178,12,233,206,233,232,231,
        15,209,176,128,162,57,3,10,7,138,200,233,91,25,60,126,116,3,233,157,233,67,138,7,67,60,131,117,3,233,164,12,60,160,117,3,
        233,175,55,60,162,117,3,233,192,56,233,129,233,232,117,4,135,218,236,233,57,253,232,97,4,82,232,167,15,44,232,203,0,90,195,
        232,240,255,238,195,232,235,255,82,80,178,0,75,232,186,240,116,7,232,140,15,44,232,176,0,88,138,240,94,135,222,86,160,94,
        0,10,192,117,11,135,218,236,135,218,50,194,34,198,116,238,91,195,233,52,233,60,35,116,60,232,150,248,232,145,252,117,88,232,
        125,32,138,198,182,0,246,208,10,192,121,3,233,179,241,138,208,82,232,72,15,44,232,108,0,90,159,134,196,80,134,196,83,82,138,
        194,2,192,138,208,176,20,159,134,196,80,134,196,233,8,32,232,80,240,232,76,0,80,232,32,15,44,232,68,0,88,83,82,232,199,32,
        232,50,58,10,192,121,3,233,113,241,67,90,136,23,91,195,232,46,0,232,184,51,162,41,0,44,14,115,252,4,28,246,208,254,192,2,
        194,162,42,0,195,232,19,240,232,26,248,83,232,156,76,135,218,91,138,198,10,192,195,232,1,240,232,8,248,232,235,255,116,3,
        233,50,241,75,232,242,239,138,194,195,232,127,245,75,232,232,239,205,162,89,232,242,234,81,232,25,40,139,30,59,3,75,232,214,
        239,116,14,232,168,14,44,232,195,31,178,2,50,192,232,150,33,187,255,255,137,30,46,0,232,117,16,117,5,176,1,162,111,0,91,90,
        138,15,67,138,47,67,138,197,10,193,117,3,233,61,233,232,144,224,117,3,232,7,13,81,138,15,67,138,47,67,81,94,135,222,86,135,
        218,59,218,89,115,3,233,30,233,94,135,222,86,83,81,135,218,137,30,73,3,232,170,69,91,138,7,60,9,116,5,176,32,232,243,11,232,
        24,0,187,247,1,232,5,0,232,179,12,235,151,138,7,10,192,117,1,195,232,105,23,67,235,243,185,247,1,182,255,50,192,162,252,2,
        50,192,162,94,4,232,121,39,235,6,65,67,254,206,116,223,138,7,10,192,139,249,170,116,214,60,11,114,40,60,32,138,208,114,56,
        60,34,117,10,160,252,2,52,1,162,252,2,176,34,60,58,117,16,160,252,2,208,216,114,7,208,208,36,253,162,252,2,176,58,10,192,
        121,3,233,60,0,138,208,60,46,116,9,232,87,1,115,4,50,192,235,24,160,94,4,10,192,116,15,254,192,117,11,176,32,139,249,170,
        65,254,206,117,1,195,176,1,162,94,4,138,194,60,11,114,7,60,32,115,3,233,55,1,139,249,170,235,130,160,252,2,208,216,114,67,
        208,216,208,216,115,82,138,7,60,217,83,81,187,165,32,83,117,207,73,139,241,172,60,77,117,199,73,139,241,172,60,69,117,191,
        73,139,241,172,60,82,117,183,73,139,241,172,60,58,117,175,88,88,91,254,198,254,198,254,198,254,198,235,45,89,91,138,7,233,
        53,255,160,252,2,12,2,162,252,2,50,192,195,160,252,2,12,4,235,243,208,208,114,231,138,7,60,132,117,3,232,225,255,60,143,117,
        3,232,229,255,138,7,254,192,138,7,117,5,67,138,7,36,127,67,60,161,117,3,232,248,67,60,177,117,10,138,7,67,60,233,176,177,
        116,1,75,83,81,82,205,163,187,54,1,138,232,177,64,254,193,67,138,247,138,211,46,138,7,10,192,116,242,159,67,158,121,244,46,
        138,7,58,197,117,232,135,218,60,208,116,2,60,209,138,193,90,89,138,208,117,12,160,94,4,10,192,176,0,162,94,4,235,21,60,91,
        117,7,50,192,162,94,4,235,29,160,94,4,10,192,176,255,162,94,4,116,13,176,32,139,249,170,65,254,206,117,3,233,164,5,138,194,
        235,6,46,138,7,67,138,208,36,127,139,249,170,65,254,206,117,3,233,141,5,10,194,121,233,60,168,117,5,50,192,162,94,4,91,233,
        100,254,232,191,13,114,1,195,60,48,114,251,60,58,245,195,75,232,136,237,82,81,80,232,33,238,88,185,181,33,81,60,11,117,3,
        233,96,66,60,12,117,3,233,99,66,139,30,2,3,233,19,79,89,90,160,0,3,178,79,60,11,116,6,60,12,178,72,117,20,176,38,139,249,
        170,65,254,206,116,192,138,194,139,249,170,65,254,206,116,182,160,1,3,60,4,178,0,114,6,178,33,116,2,178,35,138,7,60,32,117,
        3,232,82,67,138,7,67,10,192,116,42,139,249,170,65,254,206,116,143,160,1,3,60,4,114,234,159,73,158,139,241,172,159,65,158,
        117,4,60,46,116,8,60,68,116,4,60,69,117,211,178,0,235,207,138,194,10,192,116,9,139,249,170,65,254,206,117,1,195,139,30,254,
        2,233,174,253,232,241,231,81,232,245,1,89,90,81,81,232,32,232,115,11,138,247,138,211,94,135,222,86,83,59,218,114,3,233,0,
        238,187,45,7,232,246,88,89,187,221,9,94,135,222,86,135,218,139,30,88,3,139,242,172,139,249,170,65,66,59,218,117,244,139,217,
        137,30,88,3,195,232,50,0,232,195,36,30,142,30,80,3,138,7,31,233,238,248,232,22,0,82,232,177,36,232,89,11,44,232,125,252,90,
        6,142,6,80,3,139,250,170,7,195,232,122,244,83,232,4,0,135,218,91,195,185,173,107,81,232,105,248,120,246,205,164,160,166,4,
        60,144,117,237,232,171,88,120,232,232,130,72,185,128,145,186,0,0,233,58,64,185,10,0,81,138,245,138,213,116,53,60,44,116,11,
        82,232,116,237,138,238,138,202,90,116,38,232,0,11,44,232,102,237,116,29,88,232,246,10,44,82,232,104,237,116,3,233,182,228,
        11,210,117,3,233,74,237,135,218,94,135,222,86,135,218,81,232,76,231,90,82,81,232,70,231,139,217,90,59,218,135,218,115,3,233,
        44,237,90,89,88,83,82,235,21,3,217,115,3,233,30,237,135,218,83,187,249,255,59,218,91,115,3,233,16,237,82,139,23,11,210,135,
        218,90,116,12,138,7,67,10,7,159,75,158,135,218,117,213,81,232,36,0,89,90,91,82,139,23,67,11,210,116,20,135,218,94,135,222,
        86,135,218,67,137,23,135,218,3,217,135,218,91,235,228,185,181,8,81,60,13,50,192,162,61,3,139,30,48,0,75,67,138,7,67,10,7,
        117,1,195,67,139,23,67,232,123,235,10,192,116,236,138,200,160,61,3,10,192,138,193,116,91,205,165,60,167,117,24,232,99,235,
        60,137,117,228,232,92,235,60,14,117,221,82,232,172,236,11,210,117,10,235,41,60,14,117,204,82,232,158,236,83,232,140,230,159,
        73,158,176,13,114,63,232,120,8,187,252,35,82,232,105,87,91,232,96,65,89,91,83,81,232,81,65,91,90,75,235,163,85,110,100,101,
        102,105,110,101,100,32,108,105,110,101,32,0,60,13,117,234,82,232,97,236,83,135,218,67,67,67,138,15,67,138,47,176,14,187,247,
        35,83,139,30,254,2,83,75,136,47,75,136,15,75,136,7,91,195,160,61,3,10,192,116,248,233,73,255,232,178,9,66,232,174,9,65,232,
        170,9,83,232,166,9,69,160,93,4,10,192,116,3,233,110,227,83,139,30,90,3,135,218,139,30,92,3,59,218,116,3,233,92,227,91,138,
        7,44,48,115,3,233,73,227,60,2,114,3,233,66,227,162,92,4,254,192,162,93,4,232,150,234,195,46,138,7,10,192,116,248,232,3,0,
        67,235,243,159,134,196,80,134,196,233,25,7,116,9,232,132,242,83,232,6,71,235,32,83,187,210,36,232,165,86,232,225,12,90,115,
        3,233,143,9,82,67,138,7,232,0,69,138,7,10,192,117,228,232,228,70,137,30,12,0,232,158,63,91,195,82,97,110,100,111,109,32,110,
        117,109,98,101,114,32,115,101,101,100,32,40,45,51,50,55,54,56,32,116,111,32,51,50,55,54,55,41,0,177,29,235,2,177,26,181,0,
        135,218,139,30,46,0,137,30,90,4,135,218,254,197,75,232,12,234,116,23,60,34,117,11,232,3,234,10,192,116,12,60,34,117,245,60,
        161,116,29,60,205,117,228,10,192,117,21,67,138,7,67,10,7,138,209,117,3,233,157,226,67,139,23,67,137,22,90,4,232,215,233,60,
        143,117,7,81,232,17,236,89,235,217,60,132,117,7,81,232,2,236,89,235,206,138,193,60,26,138,7,116,13,60,177,116,163,60,178,
        117,161,254,205,117,157,195,60,130,116,150,60,131,117,148,254,205,116,243,232,157,233,116,168,135,218,139,30,46,0,83,139,
        30,90,4,137,30,46,0,135,218,81,232,215,17,89,75,232,129,233,186,42,37,116,8,232,80,8,44,75,186,121,37,94,135,222,86,137,30,
        46,0,91,82,195,159,80,160,168,4,162,169,4,88,158,159,80,50,192,162,168,4,88,158,195,232,219,2,138,7,67,138,15,67,138,47,90,
        81,80,232,214,2,88,138,240,138,23,67,138,15,67,138,47,91,138,194,10,198,117,1,195,138,198,44,1,114,249,50,192,58,194,254,
        192,115,241,254,206,254,202,139,241,172,65,58,7,159,67,158,116,220,245,233,114,63,232,247,61,235,8,232,252,61,235,3,232,174,
        74,232,47,0,232,137,2,185,23,41,81,138,7,67,83,232,171,0,91,138,15,67,138,47,232,13,0,83,138,216,232,91,2,90,195,176,1,232,
        149,0,187,44,3,83,136,7,67,137,23,91,195,75,181,34,138,245,83,177,255,67,138,7,254,193,10,192,116,8,58,198,116,4,58,197,117,
        239,60,34,117,3,232,177,232,83,138,197,60,44,117,13,254,193,254,201,116,7,75,138,7,60,32,116,245,91,94,135,222,86,67,135,
        218,138,193,232,180,255,186,44,3,176,82,139,30,12,3,137,30,163,4,176,3,162,251,2,232,23,62,186,47,3,59,218,137,30,12,3,91,
        138,7,117,155,186,16,0,233,34,225,67,232,146,255,232,236,1,232,124,62,254,198,254,206,116,133,139,241,172,232,217,4,60,13,
        117,3,232,165,5,65,235,236,10,192,235,2,88,158,159,80,139,30,92,3,135,218,139,30,47,3,246,208,138,200,181,255,3,217,67,59,
        218,114,15,137,30,47,3,67,135,218,88,158,195,88,134,196,158,195,88,158,186,14,0,117,3,233,202,224,58,192,159,80,185,218,38,
        81,139,30,10,3,137,30,47,3,187,0,0,83,139,30,92,3,83,187,14,3,139,22,12,3,59,218,185,42,39,116,3,233,156,0,187,226,3,137,
        30,78,4,139,30,90,3,137,30,75,4,139,30,88,3,139,22,75,4,59,218,116,27,138,7,67,67,67,80,232,69,19,88,60,3,117,5,232,113,0,
        50,192,138,208,182,0,3,218,235,221,139,30,78,4,139,23,11,210,139,30,90,3,116,25,135,218,137,30,78,4,67,67,139,23,67,67,135,
        218,3,218,137,30,75,4,135,218,235,183,89,139,22,92,3,59,218,117,3,233,108,0,138,7,67,80,67,67,232,248,18,138,15,67,138,47,
        67,88,83,3,217,60,3,117,221,137,30,51,3,91,138,15,181,0,3,217,3,217,67,135,218,139,30,51,3,135,218,59,218,116,196,185,197,
        39,81,50,192,10,7,159,67,158,138,23,159,67,158,138,55,159,67,158,117,1,195,139,203,139,30,47,3,59,218,139,217,114,243,91,
        94,135,222,86,59,218,94,135,222,86,83,139,217,115,227,89,88,88,83,82,81,195,90,91,11,219,116,249,75,138,47,75,138,15,83,75,
        138,31,183,0,3,217,138,245,138,209,75,139,203,139,30,47,3,232,160,60,91,136,15,67,136,47,139,217,75,233,224,254,81,83,139,
        30,163,4,94,135,222,86,232,160,240,94,135,222,86,232,237,59,138,7,83,139,30,163,4,83,2,7,186,15,0,115,3,233,120,223,232,219,
        253,90,232,72,0,94,135,222,86,232,63,0,83,139,30,45,3,135,218,232,14,0,232,11,0,187,58,23,94,135,222,86,83,233,7,254,91,94,
        135,222,86,138,7,67,138,15,67,138,47,138,216,254,195,254,203,117,1,195,139,241,172,139,250,170,65,66,235,241,232,146,59,139,
        30,163,4,135,218,232,32,0,135,218,117,229,82,138,245,138,209,74,138,15,139,30,47,3,59,218,117,10,50,192,138,232,3,217,137,
        30,47,3,91,195,205,238,139,30,12,3,75,138,47,75,138,15,75,59,218,117,238,137,30,12,3,195,185,127,27,81,232,183,255,50,192,
        138,240,138,7,10,192,195,185,127,27,81,232,237,255,117,3,233,85,231,67,139,23,139,242,172,195,232,46,253,232,14,246,139,30,
        45,3,136,23,89,233,114,253,232,255,229,232,211,4,40,232,247,245,82,232,203,4,44,232,250,237,232,196,4,41,94,135,222,86,83,
        232,236,241,116,5,232,225,245,235,3,232,185,255,90,232,5,0,232,213,245,176,32,80,138,194,232,236,252,138,232,88,254,197,254,
        205,116,188,139,30,45,3,136,7,67,254,205,117,249,235,175,232,163,0,50,192,94,135,222,86,138,200,176,83,83,138,7,58,197,114,
        3,138,197,186,177,0,81,232,81,253,89,91,83,67,138,47,67,138,63,138,221,181,0,3,217,139,203,232,168,252,138,216,232,247,254,
        90,232,13,255,233,232,252,232,102,0,90,82,139,242,172,42,197,235,188,135,218,138,7,232,92,0,254,197,254,205,117,3,233,152,
        230,81,232,181,1,88,134,196,158,94,135,222,86,185,117,41,81,254,200,58,7,181,0,114,1,195,138,200,138,7,42,193,58,194,138,
        232,114,243,138,234,195,232,0,255,117,3,233,142,241,138,208,67,139,31,83,3,218,138,47,136,55,94,135,222,86,81,75,232,23,229,
        232,190,63,89,91,136,47,195,135,218,232,225,3,41,89,90,81,138,234,195,232,0,229,232,3,237,232,2,241,176,1,80,116,22,88,232,
        243,244,10,192,117,3,233,38,230,80,232,189,3,44,232,236,236,232,253,57,232,179,3,44,83,139,30,163,4,94,135,222,86,232,217,
        236,232,163,3,41,83,232,80,254,135,218,89,91,88,81,185,7,101,81,185,127,27,81,80,82,232,68,254,90,88,138,232,254,200,138,
        200,58,7,176,0,115,162,139,242,172,10,192,138,197,116,153,138,7,67,138,47,67,138,63,138,221,181,0,3,217,42,193,138,232,81,
        82,94,135,222,86,138,15,67,139,23,91,83,82,81,139,242,172,58,7,117,30,66,254,201,116,12,67,254,205,117,239,90,90,89,90,50,
        192,195,91,90,90,89,138,197,42,199,2,193,254,192,195,89,90,91,67,254,205,117,208,235,229,232,33,3,40,232,151,12,232,97,57,
        83,82,135,218,67,139,23,139,30,92,3,59,218,114,18,139,30,48,0,59,218,115,10,91,83,232,46,251,91,83,232,190,57,91,94,135,222,
        86,232,241,2,44,232,21,244,10,192,117,3,233,75,229,80,138,7,232,102,0,82,232,4,236,83,232,138,253,135,218,91,89,88,138,232,
        94,135,222,86,83,187,7,101,94,135,222,86,138,193,10,192,116,144,138,7,42,197,115,3,233,27,229,254,192,58,193,114,2,138,193,
        138,205,254,201,181,0,82,67,138,23,67,138,63,138,218,3,217,138,232,90,135,218,138,15,67,139,31,135,218,138,193,10,192,117,
        1,195,139,242,172,136,7,66,67,254,201,116,244,254,205,117,241,195,178,255,60,41,116,7,232,113,2,44,232,149,243,232,106,2,
        41,195,232,150,239,116,3,233,6,0,232,18,253,232,124,251,139,22,92,3,139,30,47,3,233,203,239,205,180,159,134,196,80,134,196,
        83,232,37,4,116,3,233,221,23,91,88,134,196,158,81,159,80,235,18,50,192,162,79,3,233,147,229,25,254,200,232,99,35,176,8,235,
        56,60,9,117,16,176,32,232,202,255,232,78,35,36,7,117,244,88,158,89,195,60,32,114,32,160,41,0,138,232,232,58,35,254,197,116,
        11,254,205,58,197,117,3,232,114,0,116,9,60,255,116,5,254,192,232,39,35,88,158,89,159,80,88,158,232,124,34,195,205,181,232,
        188,3,116,61,232,182,23,115,243,81,82,83,160,54,5,36,200,162,54,5,232,204,24,91,90,89,160,107,4,10,192,116,3,233,10,49,160,
        239,4,10,192,116,7,187,232,14,83,233,237,0,83,81,82,187,45,7,232,2,79,90,89,176,13,91,195,232,18,33,195,232,204,34,10,192,
        116,248,235,11,198,7,0,232,106,3,187,246,1,117,7,205,182,176,13,232,45,255,232,91,3,116,3,50,192,195,50,192,232,172,34,50,
        192,195,205,183,160,94,0,10,192,117,1,195,232,196,255,117,3,232,220,1,233,144,1,232,239,50,83,232,175,32,116,33,232,176,255,
        10,192,117,16,80,176,2,232,139,249,139,30,45,3,90,137,23,233,208,249,80,232,123,249,88,138,208,232,74,252,187,6,0,137,30,
        163,4,176,3,162,251,2,91,195,83,139,30,10,3,181,0,3,217,3,217,176,38,42,195,138,216,176,255,26,199,138,248,114,6,3,220,91,
        115,1,195,139,30,44,0,75,75,137,30,69,3,186,7,0,233,212,218,57,30,47,3,115,233,81,82,83,232,6,250,91,90,89,57,30,47,3,115,
        218,235,227,117,214,139,30,48,0,232,121,1,162,100,4,162,62,3,162,61,3,136,7,67,136,7,67,137,30,88,3,205,174,139,30,48,0,75,
        205,175,137,30,59,3,160,101,4,10,192,117,23,50,192,162,93,4,162,92,4,181,26,187,96,3,205,176,198,7,4,67,254,205,117,248,186,
        7,0,187,11,0,232,198,55,50,192,162,79,3,138,216,138,248,137,30,77,3,137,30,86,3,139,30,10,3,160,107,4,10,192,117,4,137,30,
        47,3,50,192,232,124,0,139,30,88,3,137,30,90,3,137,30,92,3,160,101,4,10,192,117,3,232,180,21,160,54,5,36,1,117,3,162,54,5,
        89,139,30,44,0,75,75,137,30,69,3,67,67,205,177,139,227,187,14,3,137,30,12,3,232,243,247,232,202,230,50,192,138,248,138,216,
        137,30,124,3,162,77,4,137,30,228,3,137,30,80,4,137,30,122,3,162,57,3,83,81,139,30,59,3,195,59,218,195,94,139,251,252,46,166,
        86,139,223,117,10,138,7,60,58,114,1,195,233,28,225,233,178,217,135,218,139,30,48,0,116,17,135,218,232,82,226,83,232,74,220,
        139,217,90,114,3,233,11,227,75,137,30,94,3,135,218,195,117,253,254,192,235,9,117,247,156,117,3,232,159,10,157,137,30,67,3,
        187,14,3,137,30,12,3,187,12,255,89,139,30,46,0,83,156,138,195,34,199,254,192,116,12,137,30,84,3,139,30,67,3,137,30,86,3,232,
        245,253,157,187,50,7,116,3,233,20,218,233,65,218,176,15,80,176,94,232,41,253,88,4,64,232,35,253,233,236,253,139,30,86,3,11,
        219,186,17,0,117,3,233,69,217,139,22,84,3,137,22,46,0,195,184,50,192,162,118,4,195,232,200,8,82,83,187,110,4,232,11,54,139,
        30,90,3,94,135,222,86,232,108,236,80,232,55,255,44,232,173,8,88,138,232,232,94,236,58,197,116,3,233,8,217,94,135,222,86,135,
        218,83,139,30,90,3,59,218,117,19,90,91,94,135,222,86,82,232,210,53,91,186,110,4,232,203,53,91,195,233,102,225,176,1,162,57,
        3,232,115,8,117,243,83,162,57,3,138,253,138,217,73,73,73,139,241,172,73,10,192,120,248,73,73,3,218,135,218,139,30,92,3,59,
        218,139,242,172,139,249,170,159,66,158,159,65,158,117,240,73,139,217,137,30,92,3,91,138,7,60,44,117,183,232,226,223,235,182,
        88,134,196,158,91,195,138,7,60,65,114,249,60,91,245,195,233,238,253,116,251,60,44,116,9,232,251,224,75,232,192,223,116,238,
        232,146,254,44,116,232,139,22,44,0,60,44,116,3,232,71,0,75,232,169,223,82,116,78,232,122,254,44,116,72,232,55,0,75,232,153,
        223,116,3,233,53,216,94,135,222,86,83,187,238,0,59,218,115,45,91,232,54,0,114,39,83,139,30,88,3,185,20,0,3,217,59,218,115,
        25,135,218,137,30,10,3,91,137,30,44,0,91,235,150,232,240,242,11,210,117,3,233,152,224,195,233,47,253,139,22,44,0,43,22,10,
        3,235,186,139,195,43,194,139,208,195,205,178,83,139,30,233,4,11,219,91,195,1,48,78,48,225,48,253,47,241,47,91,48,48,48,27,
        48,139,30,86,0,232,74,0,116,1,195,235,4,176,1,235,2,176,255,162,112,0,254,192,232,101,1,183,1,232,11,0,117,232,232,11,31,
        232,94,0,50,192,195,160,92,0,58,195,116,248,115,7,138,216,50,192,233,245,30,254,195,233,240,30,160,91,0,58,195,116,227,176,
        1,58,195,116,221,254,203,233,222,30,160,41,0,58,199,116,209,254,199,233,210,30,139,30,91,0,183,1,137,30,88,0,233,197,30,139,
        30,86,0,232,9,0,117,182,160,41,0,138,248,235,197,176,1,58,199,116,169,254,207,233,170,30,160,91,0,138,248,160,92,0,138,216,
        42,199,114,150,254,192,80,232,153,0,160,88,0,254,195,58,195,254,203,115,13,58,199,114,9,117,2,176,1,254,200,162,88,0,88,254,
        200,117,3,233,3,0,232,222,30,195,160,91,0,138,216,160,92,0,138,248,42,195,114,241,254,192,80,232,127,0,160,88,0,58,195,114,
        16,58,199,120,3,233,9,0,117,2,176,255,254,192,162,88,0,88,254,200,116,207,233,187,30,139,30,91,0,160,93,0,138,232,138,197,
        58,195,115,2,138,216,58,199,115,2,138,248,138,199,183,0,42,195,254,192,186,114,0,80,135,218,3,218,136,7,67,136,7,67,254,200,
        117,249,135,218,88,50,192,162,88,0,162,89,0,162,90,0,233,43,255,80,232,55,0,181,1,138,200,138,197,139,250,170,74,139,242,
        172,138,233,138,200,88,254,200,117,1,195,80,235,234,80,181,1,232,23,0,138,200,138,197,139,250,170,66,139,242,172,138,233,
        138,200,88,254,200,116,226,80,235,235,83,186,116,0,183,0,254,203,3,218,138,7,135,218,91,34,192,195,83,186,116,0,183,0,254,
        203,3,218,136,7,135,218,91,195,205,166,232,65,1,139,30,86,0,137,30,88,0,160,41,0,254,192,235,30,176,63,232,12,250,176,32,
        232,7,250,50,192,162,39,0,205,167,232,30,1,139,30,86,0,137,30,88,0,138,199,162,90,0,232,225,4,254,203,116,5,176,1,232,175,
        255,232,12,35,232,65,35,232,164,27,232,8,35,232,56,35,10,192,117,3,232,119,28,80,139,30,86,0,138,38,41,0,254,196,58,30,88,
        0,117,18,58,62,89,0,115,4,136,62,89,0,58,62,90,0,118,6,138,231,136,38,90,0,88,232,47,0,114,16,116,187,232,3,2,232,153,249,
        235,179,1,232,147,249,235,173,60,3,249,116,1,245,187,246,1,195,60,59,117,251,233,248,220,75,67,254,201,120,242,46,58,7,117,
        246,195,187,148,50,177,14,232,236,255,121,3,233,7,0,80,50,192,162,114,0,88,187,162,50,177,12,232,216,255,121,3,233,32,0,80,
        138,193,10,192,208,192,138,200,50,192,138,232,187,174,50,3,217,46,138,23,67,46,138,55,88,82,139,30,86,0,195,10,192,195,3,
        34,192,195,139,30,86,0,128,255,1,117,11,254,203,232,215,254,117,7,138,62,41,0,232,144,28,233,222,249,195,13,2,6,5,3,11,12,
        28,29,30,31,14,127,27,9,10,8,18,2,6,5,3,13,14,127,27,255,52,86,52,202,52,57,51,175,51,7,53,37,53,77,53,1,52,119,52,243,50,
        193,51,232,13,253,116,200,88,181,254,187,247,1,232,65,249,136,7,60,13,116,17,60,10,117,6,138,197,60,254,116,237,67,254,205,
        117,232,254,205,50,192,136,7,187,246,1,195,160,114,0,10,192,116,58,232,97,254,80,135,218,198,7,0,135,218,254,195,232,41,3,
        160,41,0,42,199,116,11,254,192,80,232,245,0,88,254,200,117,247,139,30,86,0,232,59,254,88,138,200,50,192,139,250,170,66,138,
        193,139,250,170,50,192,195,176,10,10,192,195,232,90,2,186,247,1,181,254,160,88,0,58,195,183,1,160,41,0,117,19,139,30,88,0,
        82,232,9,254,90,160,41,0,116,5,160,90,0,254,200,162,90,0,232,60,2,138,197,34,192,116,16,82,232,238,253,90,117,9,183,1,254,
        195,160,41,0,235,228,135,218,176,254,42,198,138,240,75,138,7,60,32,116,8,10,192,117,7,254,206,116,3,75,235,239,67,198,7,0,
        135,218,176,13,80,183,1,232,124,27,176,13,232,252,247,187,246,1,88,249,195,50,192,162,247,1,232,167,253,117,4,254,195,235,
        247,176,3,235,221,138,199,254,200,36,248,4,8,254,192,138,232,160,41,0,58,197,115,2,138,232,138,197,160,114,0,10,192,138,197,
        117,12,58,199,116,5,138,248,232,54,27,50,192,195,42,199,116,251,80,160,80,0,232,20,0,232,170,247,88,254,200,117,241,195,160,
        114,0,246,208,162,114,0,50,192,195,83,139,30,86,0,80,160,114,0,10,192,116,3,232,3,0,88,91,195,160,88,0,58,195,117,16,83,187,
        90,0,254,7,160,41,0,58,7,115,2,136,7,91,160,80,0,138,200,232,143,1,114,16,116,220,80,50,192,232,40,253,254,195,232,230,1,
        88,254,203,254,195,183,1,235,227,83,160,41,0,58,199,117,11,183,0,160,93,0,58,195,117,0,254,195,254,199,232,9,0,91,83,232,
        173,26,50,192,91,195,176,1,58,199,116,4,254,207,235,20,83,254,203,116,14,160,41,0,138,248,232,208,252,117,4,94,135,222,86,
        91,232,136,26,160,88,0,58,195,117,10,160,90,0,254,200,116,3,162,90,0,232,66,1,83,232,174,252,117,17,254,195,183,1,232,5,2,
        94,135,222,86,232,251,1,91,235,230,91,232,85,26,50,192,195,232,145,252,117,11,160,91,0,58,195,116,4,254,195,235,240,160,41,
        0,138,248,160,80,0,138,200,81,232,34,26,89,10,192,116,12,58,193,116,8,254,199,232,42,26,50,192,195,254,207,116,244,235,229,
        232,148,0,183,1,232,25,26,83,160,80,0,232,173,1,91,254,199,160,41,0,254,192,58,199,117,237,232,65,252,117,165,183,1,254,195,
        235,226,198,6,112,0,0,235,8,232,229,25,232,74,1,114,15,232,64,0,116,19,235,241,232,214,25,232,59,1,115,7,232,49,0,116,4,235,
        241,50,192,195,50,192,162,112,0,235,8,232,189,25,232,34,1,115,15,232,38,0,116,235,235,241,232,174,25,232,19,1,114,7,232,23,
        0,116,220,235,241,232,2,0,235,211,139,30,86,0,232,196,250,117,204,183,1,233,150,250,139,30,86,0,232,223,250,117,190,160,41,
        0,138,248,233,154,250,254,203,116,5,232,193,251,116,247,254,195,195,81,160,90,0,58,199,114,26,232,103,25,232,22,0,139,250,
        170,66,94,135,222,86,254,207,94,135,222,86,116,4,254,199,235,223,89,195,10,192,117,2,176,32,195,232,69,0,80,232,138,251,116,
        21,88,34,192,116,241,60,32,116,237,160,80,0,58,193,116,230,138,193,34,192,195,88,249,195,160,41,0,58,199,116,25,254,199,232,
        196,0,83,254,207,232,187,0,91,254,199,160,41,0,254,192,58,199,117,235,254,207,160,80,0,232,167,0,195,83,81,232,164,0,89,80,
        138,193,232,154,0,88,138,200,160,41,0,254,192,254,199,58,199,117,231,138,193,91,195,83,160,92,0,42,195,114,47,116,34,139,
        30,91,0,94,135,222,86,83,138,195,162,91,0,160,93,0,162,92,0,232,90,250,91,94,135,222,86,137,30,91,0,91,83,183,1,232,249,24,
        91,176,1,233,6,251,139,30,86,0,254,203,116,3,232,171,24,232,254,249,91,254,203,195,60,48,114,251,60,58,114,18,60,65,114,243,
        60,91,114,10,60,97,114,235,60,123,114,2,249,195,34,192,195,83,183,1,160,41,0,138,232,81,232,101,24,89,60,255,116,8,254,199,
        254,205,117,241,91,195,91,83,183,1,232,164,24,91,195,233,67,24,233,73,24,162,40,0,139,30,71,3,10,199,34,195,254,192,135,218,
        116,232,235,19,187,246,1,116,225,249,156,67,233,117,210,232,124,217,116,3,233,114,217,91,137,22,73,3,232,120,211,114,3,233,
        60,218,139,217,67,67,139,23,67,67,83,135,218,232,78,46,91,138,7,60,9,116,5,176,32,232,151,244,232,188,232,187,247,1,232,169,
        232,232,95,251,139,30,86,0,254,203,116,9,254,203,116,5,232,53,250,116,247,254,195,232,240,23,233,160,209,60,10,116,3,233,
        107,244,83,139,30,233,4,138,199,10,195,91,176,10,117,8,80,176,13,232,87,244,88,195,232,82,244,176,13,232,77,244,176,10,195,
        75,232,190,215,117,1,195,232,143,246,44,185,91,55,81,176,200,235,2,50,192,162,250,2,138,15,205,179,232,201,247,115,3,233,
        63,208,50,192,138,232,162,142,0,67,138,7,60,46,114,66,116,13,60,58,115,4,60,48,115,5,232,171,247,114,51,138,232,81,181,255,
        186,142,0,12,128,254,197,139,250,170,66,67,138,7,60,58,115,4,60,48,115,237,232,139,247,115,232,60,46,116,228,138,197,60,39,
        114,3,233,245,207,89,162,142,0,138,7,60,38,115,30,186,3,56,82,182,2,60,37,116,132,254,198,60,36,117,1,195,254,198,60,33,116,
        249,182,8,60,35,116,243,88,138,193,36,127,138,208,182,0,83,187,31,3,3,218,138,55,91,75,138,198,162,251,2,232,18,215,160,57,
        3,254,200,117,3,233,122,1,120,3,233,16,0,138,7,44,40,117,3,233,205,0,44,51,117,3,233,198,0,50,192,162,57,3,83,160,77,4,10,
        192,162,74,4,116,30,139,30,124,3,186,126,3,3,218,137,30,75,4,135,218,233,247,45,160,74,4,10,192,116,36,50,192,162,74,4,139,
        30,90,3,137,30,75,4,139,30,88,3,233,220,45,232,4,255,195,50,192,138,240,138,208,89,94,135,222,86,195,91,94,135,222,86,82,
        186,106,56,59,218,116,231,186,218,25,59,218,90,116,73,94,135,222,86,83,81,160,251,2,138,232,160,142,0,2,197,254,192,138,200,
        81,181,0,65,65,65,139,30,92,3,83,3,217,89,83,232,25,44,91,137,30,92,3,139,217,137,30,90,3,75,198,7,0,59,218,117,248,90,136,
        55,67,90,137,23,67,232,221,1,135,218,66,91,195,232,134,66,235,8,198,6,79,3,0,233,120,10,232,64,226,117,7,187,6,0,137,30,163,
        4,91,195,83,139,30,250,2,94,135,222,86,138,240,82,81,186,142,0,139,242,172,10,192,116,61,135,218,4,2,208,216,138,200,232,
        195,243,138,193,138,15,67,138,47,67,81,254,200,117,245,83,160,142,0,80,135,218,232,40,215,88,137,30,181,0,91,4,2,208,216,
        89,75,136,47,75,136,15,254,200,117,245,139,30,181,0,235,8,232,10,215,50,192,162,142,0,160,92,4,10,192,116,8,11,210,117,3,
        233,95,0,74,89,88,134,196,158,135,218,94,135,222,86,83,135,218,254,192,138,240,138,7,60,44,116,136,60,41,116,7,60,93,116,
        3,233,64,206,232,156,213,137,30,82,3,91,137,30,250,2,178,0,82,235,7,83,159,134,196,80,134,196,139,30,90,3,233,175,44,160,
        250,2,10,192,116,3,233,32,206,88,134,196,158,139,203,117,3,233,85,43,42,7,117,3,233,152,0,186,9,0,233,25,206,160,251,2,136,
        7,67,138,208,182,0,88,134,196,158,117,3,233,202,0,136,15,67,136,47,232,211,0,67,138,200,232,245,242,67,67,137,30,49,3,136,
        15,67,160,250,2,208,208,138,193,114,15,159,80,160,92,4,52,11,138,200,181,0,88,158,115,4,89,159,65,158,136,15,159,80,67,136,
        47,67,232,122,42,88,158,254,200,117,218,159,80,138,238,138,202,135,218,3,218,115,3,233,207,242,232,220,242,137,30,92,3,75,
        198,7,0,59,218,117,248,50,192,65,138,240,139,30,49,3,138,23,135,218,3,219,3,217,135,218,75,75,137,23,67,67,88,158,114,70,
        138,232,138,200,138,7,67,182,91,139,23,67,67,94,135,222,86,80,59,218,114,3,233,79,255,232,29,42,3,218,88,254,200,139,203,
        117,227,160,251,2,139,203,3,219,44,4,114,8,3,219,10,192,116,11,3,219,10,192,122,3,233,2,0,3,217,89,3,217,135,218,139,30,82,
        3,195,249,26,192,91,195,138,7,67,81,181,0,138,200,3,217,89,195,81,82,159,80,186,142,0,139,242,172,138,232,254,197,139,242,
        172,66,67,136,7,254,205,117,245,88,158,90,89,195,232,90,220,232,106,41,232,32,243,59,135,218,139,30,163,4,235,10,160,58,3,
        10,192,116,17,90,135,218,83,50,192,162,58,3,254,192,156,82,138,47,10,237,117,3,233,95,213,67,139,31,235,36,138,213,83,177,
        2,138,7,67,60,92,117,3,233,157,1,60,32,117,6,254,193,254,205,117,236,91,138,234,176,92,232,214,1,232,130,240,50,192,138,208,
        138,240,232,202,1,138,240,138,7,67,60,33,117,3,233,111,1,60,35,116,82,60,38,117,3,233,96,1,254,205,117,3,233,46,1,60,43,176,
        8,116,217,75,138,7,67,60,46,116,85,60,95,117,3,233,55,1,60,92,116,156,58,7,117,182,60,36,116,24,60,42,117,174,138,197,67,
        60,2,114,4,138,7,60,36,176,32,117,10,254,205,254,194,190,50,192,4,16,67,254,194,2,198,138,240,254,194,177,0,254,205,116,97,
        138,7,67,60,46,116,30,60,35,116,237,60,44,117,35,138,198,12,64,138,240,235,225,138,7,60,35,176,46,116,3,233,101,255,177,1,
        67,254,193,254,205,116,54,138,7,67,60,35,116,243,82,186,244,59,82,138,247,138,211,60,94,116,1,195,58,7,117,251,67,58,7,117,
        246,67,58,7,117,241,67,138,197,44,4,114,234,90,90,138,232,254,198,67,235,3,135,218,90,138,198,75,254,194,36,8,117,28,254,
        202,138,197,10,192,116,20,138,7,44,45,116,6,60,254,117,10,176,8,4,4,2,198,138,240,254,205,91,157,116,101,81,82,232,2,219,
        90,89,81,83,138,234,138,197,2,193,60,25,114,3,233,35,212,138,198,12,128,232,92,59,232,119,234,91,75,232,216,210,249,116,17,
        162,58,3,60,59,116,7,60,44,116,3,233,104,203,232,196,210,89,135,218,91,83,156,82,138,7,42,197,67,182,0,138,208,139,31,3,218,
        138,197,10,192,116,3,233,173,254,235,6,232,123,0,232,39,239,91,157,116,3,233,88,254,115,3,232,231,239,94,135,222,86,232,28,
        236,91,233,3,216,195,232,93,0,254,205,138,7,67,232,4,239,235,202,177,0,235,5,177,1,235,1,88,254,205,232,69,0,91,157,116,208,
        81,232,110,218,232,127,39,89,81,83,139,30,163,4,138,233,177,0,138,197,80,138,197,10,192,116,3,232,161,236,232,228,233,139,
        30,163,4,88,10,192,117,3,233,94,255,42,7,138,232,176,32,254,197,254,205,117,3,233,79,255,232,177,238,235,244,80,138,198,10,
        192,176,43,116,3,232,163,238,88,195,137,30,53,3,232,236,231,232,15,210,135,218,232,102,0,159,68,158,159,68,158,117,8,3,217,
        139,227,137,30,69,3,139,30,46,0,83,139,30,53,3,83,82,235,40,116,3,233,137,202,135,218,232,63,0,117,103,139,227,137,30,69,
        3,139,22,46,0,137,22,90,4,67,67,139,23,67,67,139,31,137,30,46,0,135,218,232,204,217,83,232,132,39,91,116,9,185,177,0,138,
        233,81,233,125,209,139,30,90,4,137,30,46,0,91,89,89,233,111,209,187,4,0,3,220,67,138,7,67,185,130,0,58,193,117,7,185,18,0,
        3,217,235,238,185,177,0,58,193,116,1,195,57,23,185,6,0,116,248,3,217,235,219,186,30,0,233,47,202,232,58,7,75,232,109,209,
        116,85,232,114,217,83,232,108,221,116,61,232,10,51,232,139,232,139,30,163,4,67,138,23,67,138,55,139,242,172,60,32,117,9,66,
        136,55,75,136,23,75,254,15,232,220,232,91,75,232,58,209,116,34,60,59,116,5,232,8,240,44,75,232,44,209,176,44,232,175,237,
        235,186,176,34,232,168,237,232,186,232,176,34,232,160,237,235,215,232,103,238,233,139,214,205,168,83,138,242,232,135,1,116,
        9,60,58,116,15,232,126,1,121,247,138,214,91,50,192,176,252,205,171,195,138,198,42,194,254,200,60,2,115,5,205,172,233,97,201,
        60,5,114,3,233,90,201,89,82,81,138,200,138,232,186,156,62,94,135,222,86,83,138,7,60,97,114,6,60,123,115,2,44,32,81,138,232,
        139,242,46,172,67,66,58,197,89,117,21,254,201,117,226,139,242,46,172,10,192,120,3,233,6,0,91,91,90,10,192,195,10,192,120,
        235,139,242,46,172,10,192,159,66,158,121,245,138,205,91,83,139,242,46,172,10,192,117,182,233,254,200,75,89,66,68,255,83,67,
        82,78,254,76,80,84,49,253,67,65,83,49,252,0,123,88,145,88,167,88,189,88,205,169,83,82,159,134,196,80,134,196,186,46,0,3,218,
        176,255,42,7,2,192,138,208,205,170,182,0,187,177,62,3,218,46,138,23,67,46,138,55,88,134,196,158,138,216,183,0,3,218,46,138,
        23,67,46,138,55,135,218,90,94,135,222,86,195,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,17,216,83,232,140,233,
        138,7,10,192,116,79,67,138,23,67,138,63,138,218,138,208,50,192,162,255,6,232,219,254,159,134,196,80,134,196,185,240,4,182,
        11,254,194,254,202,116,77,138,7,60,32,114,38,60,46,116,40,139,249,170,65,67,254,206,117,233,88,134,196,158,159,134,196,80,
        134,196,138,240,160,240,4,254,192,116,6,88,134,196,158,91,195,233,40,200,67,235,202,176,1,162,255,6,138,198,60,11,116,239,
        60,3,114,235,116,236,176,32,139,249,170,65,254,206,235,234,176,32,139,249,170,65,254,206,117,246,235,186,138,7,67,254,202,
        195,232,122,223,138,216,160,223,4,58,195,115,3,233,233,199,183,0,3,219,135,218,139,30,224,4,3,218,139,31,160,54,5,254,192,
        116,219,138,7,10,192,116,213,83,186,46,0,3,218,138,7,60,9,115,5,205,220,233,192,199,91,138,7,10,192,249,195,75,232,53,207,
        60,35,117,3,232,46,207,232,42,223,94,135,222,86,83,232,171,255,117,3,233,155,199,137,30,233,4,195,185,152,20,81,232,28,215,
        138,7,60,44,117,89,83,232,145,232,138,7,10,192,117,3,233,124,199,67,139,31,138,7,36,223,178,1,60,73,116,21,178,2,60,79,116,
        15,178,4,60,82,116,9,178,8,60,65,116,3,233,84,199,91,82,232,175,237,44,60,35,117,3,232,208,206,232,204,222,232,161,237,44,
        138,194,10,192,117,3,233,61,199,80,232,178,254,88,89,138,209,205,221,233,131,0,232,169,254,138,7,60,130,178,4,117,89,232,
        165,206,60,133,178,1,116,77,60,79,116,32,60,73,116,55,232,107,237,65,232,103,237,80,232,99,237,80,232,95,237,69,232,91,237,
        78,232,87,237,68,178,8,235,44,232,120,206,232,76,237,85,232,72,237,84,232,68,237,80,232,64,237,85,232,60,237,84,178,2,235,
        17,232,93,206,232,49,237,66,232,45,237,77,178,32,75,232,79,206,232,35,237,65,232,31,237,83,82,138,7,60,35,117,3,232,61,206,
        232,57,222,10,192,117,3,233,176,198,205,222,180,82,75,138,208,232,41,206,116,3,233,197,198,94,135,222,86,138,194,159,134,
        196,80,134,196,83,232,156,254,116,3,233,149,198,90,138,198,60,9,205,223,115,3,233,131,198,83,185,46,0,3,217,136,55,176,0,
        91,233,145,253,83,10,192,117,10,160,54,5,36,1,116,3,233,70,3,232,107,254,116,21,137,30,233,4,83,176,2,115,3,233,113,253,205,
        224,233,80,198,232,36,3,91,83,186,49,0,3,218,136,7,138,248,138,216,137,30,233,4,91,2,7,198,7,0,91,195,249,235,3,13,50,192,
        159,80,232,159,253,205,233,88,158,159,80,116,20,138,7,44,44,10,192,117,12,232,150,205,232,106,236,82,88,158,249,159,80,159,
        80,50,192,178,1,232,84,255,139,30,233,4,185,49,0,3,217,88,158,26,192,36,128,12,1,162,54,5,88,158,159,80,26,192,162,239,4,
        138,7,10,192,121,3,233,216,0,88,158,116,3,232,87,235,50,192,232,44,254,233,5,199,232,66,253,205,234,75,232,70,205,178,128,
        249,117,3,232,121,5,116,24,232,16,236,44,60,80,178,146,117,6,232,47,205,249,235,8,232,0,236,65,10,192,178,2,159,80,138,194,
        36,16,162,98,4,88,158,159,80,254,192,162,95,0,50,192,232,221,254,88,158,83,139,30,233,4,138,7,91,36,128,117,3,233,20,221,
        83,232,99,225,160,98,4,10,192,116,3,232,121,4,139,30,88,3,137,30,4,7,139,30,48,0,83,139,30,233,4,232,198,0,10,192,121,3,233,
        22,0,233,77,197,160,98,4,10,192,116,3,232,162,4,91,50,192,162,98,4,233,200,254,91,232,2,0,235,231,232,160,0,60,252,117,3,
        233,13,26,205,235,233,31,197,139,30,48,0,10,192,232,3,0,233,70,0,159,80,232,131,0,60,252,117,3,233,54,26,88,158,205,236,233,
        0,197,88,158,195,36,32,162,99,4,88,158,117,3,233,241,196,232,119,234,160,99,4,162,100,4,232,171,0,50,192,232,241,252,198,
        7,128,137,30,233,4,232,75,0,10,192,120,179,205,237,233,211,196,160,100,4,10,192,116,3,232,40,4,232,39,199,67,67,137,30,88,
        3,232,90,234,50,192,162,54,5,232,67,254,160,239,4,10,192,116,3,233,249,203,233,196,197,135,218,139,30,47,3,135,218,59,218,
        114,152,232,28,234,50,192,162,54,5,233,235,233,83,82,139,30,233,4,186,46,0,3,218,138,7,90,91,195,117,30,83,81,80,186,38,67,
        82,81,10,192,195,88,89,254,200,121,240,91,195,89,91,138,7,60,44,117,247,232,228,203,81,138,7,60,35,117,3,232,218,203,232,
        214,219,94,135,222,86,83,186,46,67,82,249,255,227,185,40,65,160,223,4,235,191,160,54,5,10,192,120,204,185,40,65,50,192,160,
        223,4,235,174,50,192,138,232,138,197,232,49,252,198,7,0,160,223,4,254,197,42,197,115,239,50,192,162,54,5,232,149,233,139,
        30,48,0,75,198,7,0,233,219,195,91,88,134,196,158,83,82,81,159,134,196,80,134,196,139,30,233,4,176,6,232,5,0,205,227,233,235,
        195,159,134,196,80,134,196,82,135,218,187,46,0,3,218,138,7,135,218,90,60,9,115,3,233,202,0,88,134,196,158,94,135,222,86,91,
        233,228,250,81,83,82,139,30,233,4,176,8,232,206,255,205,228,233,180,195,90,91,89,195,232,48,203,232,4,234,36,232,0,234,40,
        83,139,30,233,4,83,187,0,0,137,30,233,4,91,94,135,222,86,232,18,219,82,138,7,60,44,117,11,232,9,203,232,205,251,91,50,192,
        138,7,159,80,232,211,233,41,88,158,94,135,222,86,159,80,138,195,10,192,117,3,233,38,204,83,232,7,226,135,218,89,88,158,159,
        80,116,40,232,22,232,60,3,116,19,136,7,67,254,201,117,236,88,158,89,91,137,30,233,4,81,233,51,226,88,158,139,30,46,0,137,
        30,71,3,91,233,6,195,232,106,255,115,3,233,48,195,235,213,205,229,232,18,0,83,181,1,232,2,0,91,195,50,192,136,7,67,254,205,
        117,249,195,139,30,233,4,186,51,0,3,218,195,88,134,196,158,195,232,7,251,117,3,233,250,194,176,10,115,3,233,18,250,205,230,
        233,238,194,232,243,250,117,3,233,230,194,176,12,115,3,233,254,249,205,231,233,218,194,232,223,250,117,3,233,210,194,176,
        14,115,3,233,234,249,205,232,233,198,194,232,255,234,117,3,233,31,202,50,192,232,71,252,178,66,233,242,194,60,35,117,173,
        232,44,218,232,4,233,44,138,194,83,232,0,251,91,138,7,195,185,236,45,81,50,192,233,36,252,232,30,214,185,155,22,186,32,44,
        117,27,138,214,235,23,185,152,20,81,232,204,255,232,81,242,232,27,31,82,185,138,17,50,192,138,240,138,208,80,81,83,232,165,
        254,115,3,233,107,194,60,32,117,6,254,198,254,206,117,238,60,34,117,19,138,232,138,194,60,44,138,197,117,9,138,245,138,213,
        232,129,254,114,83,187,247,1,181,255,138,200,138,198,60,34,138,193,116,46,60,13,83,116,89,91,60,10,117,36,138,200,138,194,
        60,44,138,193,116,3,232,137,0,83,232,85,254,91,114,38,60,13,117,12,138,194,60,32,116,21,60,44,176,13,116,15,10,192,116,11,
        58,198,116,14,58,194,116,10,232,99,0,83,232,47,254,91,115,178,83,60,34,116,4,60,32,117,37,232,32,254,114,32,60,32,116,247,
        60,44,116,24,60,13,117,4,205,225,116,16,139,30,233,4,138,200,176,18,232,221,253,205,226,233,195,193,91,198,7,0,187,246,1,
        138,194,44,32,116,7,181,0,232,102,224,91,195,232,55,213,159,80,232,42,201,88,158,159,80,115,3,232,196,35,88,158,114,3,232,
        196,35,91,195,10,192,116,251,136,7,67,254,205,117,244,89,235,197,232,70,0,162,96,0,254,192,116,3,233,158,193,83,81,178,2,
        232,198,250,91,232,59,252,50,192,162,96,0,233,26,252,232,38,0,10,192,116,7,254,192,117,3,233,125,193,254,200,162,96,0,83,
        81,50,192,178,1,232,158,250,91,232,46,252,50,192,162,96,0,91,233,204,250,232,180,248,82,75,232,185,200,90,117,3,176,1,195,
        82,232,134,231,44,232,43,0,82,75,232,166,200,117,5,89,90,50,192,195,232,115,231,44,232,24,0,89,135,218,3,217,137,30,4,7,135,
        218,75,232,137,200,116,3,233,37,193,90,176,255,195,232,135,208,83,232,17,220,90,135,218,195,185,11,13,139,30,48,0,135,218,
        139,30,88,3,59,218,117,1,195,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,139,242,172,42,197,46,50,7,80,187,118,97,
        138,195,2,197,138,216,138,199,20,0,138,248,88,46,50,7,2,193,139,250,170,66,254,201,117,2,177,11,254,205,117,188,181,13,235,
        184,185,11,13,139,30,48,0,135,218,139,30,88,3,59,218,116,175,187,118,97,138,195,2,197,138,216,138,199,20,0,138,248,139,242,
        172,42,193,46,50,7,80,187,23,98,138,195,2,193,138,216,138,199,20,0,138,248,88,46,50,7,2,197,139,250,170,66,254,201,117,2,
        177,11,254,205,117,189,181,13,235,185,83,139,30,46,0,138,199,34,195,91,254,192,116,1,195,159,80,160,100,4,10,192,116,3,233,
        245,200,88,158,195,138,7,60,64,117,3,232,173,199,185,0,0,138,245,138,209,60,234,116,31,138,7,60,207,156,117,3,232,152,199,
        232,108,230,40,232,126,215,82,232,100,230,44,232,118,215,232,93,230,41,89,157,83,139,30,61,5,116,3,187,0,0,159,3,217,209,
        222,158,209,214,137,30,61,5,137,30,55,5,139,203,139,30,59,5,116,3,187,0,0,3,218,137,30,59,5,137,30,57,5,135,218,91,195,50,
        192,235,2,176,3,80,232,164,255,88,232,46,0,83,232,40,3,115,6,232,127,2,232,85,2,91,195,232,49,199,232,140,255,83,232,20,3,
        187,255,255,115,10,232,104,2,232,27,2,138,216,183,0,232,7,29,91,195,176,3,81,82,138,208,75,232,12,199,116,11,232,222,229,
        44,60,44,116,3,232,254,214,138,194,83,232,193,2,115,3,233,48,200,91,90,89,233,239,198,139,30,55,5,138,195,42,193,138,216,
        138,199,26,197,138,248,115,197,50,192,42,195,138,216,26,199,42,195,138,248,249,195,139,30,57,5,138,195,42,194,138,216,138,
        199,26,198,138,248,235,222,83,139,30,57,5,135,218,137,30,57,5,91,195,232,240,255,83,81,139,30,55,5,94,135,222,86,137,30,55,
        5,89,91,195,232,226,254,81,82,232,106,229,234,232,237,254,232,118,255,90,89,116,83,232,92,229,44,232,88,229,66,117,3,233,
        96,0,232,79,229,70,83,232,93,2,232,193,255,232,87,2,232,156,255,115,3,232,169,255,67,83,232,114,255,115,3,232,175,255,67,
        83,232,156,1,90,89,82,81,232,219,0,80,83,135,218,232,105,2,91,88,232,215,0,232,248,0,89,90,73,138,197,10,193,117,227,91,195,
        81,82,83,232,69,0,139,30,61,5,137,30,55,5,139,30,59,5,137,30,57,5,91,90,89,195,83,139,30,57,5,83,82,135,218,232,218,255,91,
        137,30,57,5,135,218,232,208,255,91,137,30,57,5,139,30,55,5,81,139,203,232,193,255,91,137,30,55,5,139,203,232,183,255,91,195,
        205,184,232,207,1,232,51,255,232,201,1,232,14,255,115,3,232,40,255,82,83,232,228,254,135,218,187,241,73,115,3,187,5,74,94,
        135,222,86,59,218,115,20,137,30,253,6,91,137,30,247,6,187,213,73,137,30,249,6,135,218,235,22,94,135,222,86,137,30,249,6,187,
        213,73,137,30,247,6,135,218,137,30,253,6,91,90,83,137,30,251,6,232,211,0,90,82,232,5,0,89,65,233,32,2,138,198,10,192,208,
        216,138,240,138,194,208,216,138,208,195,139,30,243,6,160,245,6,195,137,30,243,6,162,245,6,195,139,30,243,6,129,251,0,32,114,
        9,129,235,0,32,137,30,243,6,195,129,195,80,32,137,30,243,6,195,139,30,243,6,129,251,0,32,114,9,129,235,176,31,137,30,243,
        6,195,129,195,0,32,137,30,243,6,195,138,193,138,14,85,0,210,14,245,6,138,200,114,1,195,255,6,243,6,195,138,193,138,14,85,
        0,210,6,245,6,138,200,114,1,195,255,14,243,6,195,140,198,191,0,184,142,199,139,30,243,6,38,138,7,138,22,245,6,34,194,138,
        14,85,0,210,234,114,4,210,232,235,248,142,198,195,140,198,191,0,184,142,199,139,30,243,6,139,233,160,245,6,246,208,38,34,
        7,138,14,246,6,34,14,245,6,10,193,38,136,7,139,205,142,198,195,139,233,209,234,159,139,218,177,2,211,226,3,211,177,4,211,
        226,158,115,4,129,194,0,32,137,22,243,6,139,213,138,202,246,6,85,0,1,116,20,176,7,34,200,176,128,210,232,162,245,6,177,3,
        211,234,1,22,243,6,195,176,3,34,200,2,201,176,192,210,232,162,245,6,177,2,211,234,1,22,243,6,195,160,72,0,199,6,59,5,100,
        0,60,6,116,18,115,28,60,4,114,24,198,6,85,0,2,199,6,61,5,160,0,195,198,6,85,0,1,199,6,61,5,64,1,195,198,6,85,0,0,195,60,4,
        115,15,246,6,85,0,1,116,12,36,1,246,216,162,246,6,248,195,233,93,197,36,3,177,85,246,225,162,246,6,248,195,160,85,0,10,192,
        116,235,10,237,120,39,187,128,2,132,6,1,0,116,3,187,64,1,59,203,159,114,3,75,139,203,10,246,120,12,129,250,200,0,114,4,186,
        199,0,195,158,195,51,210,195,51,201,159,235,232,140,198,191,0,184,142,199,139,211,11,210,116,108,139,30,243,6,38,138,47,160,
        245,6,138,224,246,208,138,14,85,0,138,30,246,6,34,232,138,252,34,251,10,239,74,116,64,210,200,210,204,115,239,139,30,243,
        6,38,136,47,255,6,243,6,136,38,245,6,139,202,209,233,209,233,246,6,85,0,1,117,6,129,226,3,0,235,6,129,226,7,0,209,233,227,
        171,252,160,246,6,139,62,243,6,243,170,137,62,243,6,235,155,139,30,243,6,38,136,47,136,38,245,6,142,198,195,232,127,254,3,
        22,253,6,59,22,251,6,114,9,43,22,251,6,62,255,22,249,6,62,255,22,247,6,226,227,195,83,232,163,207,91,195,83,232,39,25,91,
        195,246,128,62,113,0,0,116,3,233,249,4,195,160,41,0,138,208,232,255,210,233,237,4,0,0,0,180,15,205,16,162,72,0,180,40,60,
        2,114,13,180,80,60,7,117,7,185,12,11,137,14,104,0,136,38,41,0,250,140,219,137,30,80,3,30,186,0,0,142,218,137,30,16,5,187,
        52,77,137,30,108,0,187,68,87,137,30,112,0,140,14,110,0,140,14,114,0,31,232,50,0,187,24,2,185,0,0,142,193,185,122,0,38,140,
        143,2,0,38,199,7,148,76,131,195,4,224,241,140,219,142,195,232,72,225,251,180,1,205,23,232,119,6,187,155,76,232,223,46,233,
        99,50,190,237,76,187,83,6,185,10,0,83,252,46,172,136,7,67,10,192,117,246,91,131,195,16,224,239,195,207,62,255,46,0,7,203,
        84,104,101,32,73,66,77,32,80,101,114,115,111,110,97,108,32,67,111,109,112,117,116,101,114,32,66,97,115,105,99,255,13,86,101,
        114,115,105,111,110,32,67,49,46,49,48,32,67,111,112,121,114,105,103,104,116,32,73,66,77,32,67,111,114,112,32,49,57,56,49,
        255,13,0,50,53,45,65,112,114,45,56,49,76,73,83,84,32,0,82,85,78,13,0,76,79,65,68,34,0,83,65,86,69,34,0,67,79,78,84,13,0,44,
        34,76,80,84,49,58,34,13,0,84,82,79,78,13,0,84,82,79,70,70,13,0,75,69,89,32,0,83,67,82,69,69,78,32,48,44,48,44,48,13,0,156,
        80,30,82,186,0,0,142,218,142,30,16,5,232,58,10,136,22,106,0,254,202,136,22,94,0,90,31,88,157,207,86,160,94,0,10,192,117,17,
        160,106,0,10,192,117,10,180,1,205,22,176,0,116,2,254,200,94,195,160,94,0,10,192,116,8,50,192,162,94,0,176,3,195,86,87,160,
        106,0,10,192,117,116,180,0,205,22,10,192,116,3,95,94,195,83,128,252,59,114,5,128,252,69,114,60,139,30,46,0,67,11,219,117,
        19,187,52,78,177,26,46,58,39,116,12,67,254,192,254,201,117,244,50,192,91,235,211,50,228,208,224,139,216,46,139,159,3,1,137,
        30,107,0,254,14,106,0,208,232,4,65,140,14,109,0,235,224,80,134,196,44,59,179,16,246,227,187,83,6,3,216,246,7,255,88,116,204,
        137,30,107,0,140,30,109,0,254,14,106,0,235,12,83,254,200,117,7,162,106,0,176,32,235,178,30,197,30,107,0,138,7,31,255,6,107,
        0,10,192,116,2,121,160,50,228,140,203,138,30,110,0,58,223,114,4,254,196,36,127,136,38,106,0,10,192,117,136,91,233,119,17,
        30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,19,31,20,22,47,17,45,21,44,83,81,86,190,108,78,177,14,252,46,172,58,224,
        116,9,70,254,201,117,244,50,192,235,2,46,172,94,89,91,195,71,11,72,30,75,29,77,28,80,31,28,10,116,6,115,2,118,1,82,18,83,
        127,79,14,117,5,119,12,31,30,29,28,13,12,11,10,156,83,81,82,80,60,7,116,77,60,13,117,10,246,6,111,0,255,116,3,232,139,0,232,
        44,2,116,4,60,255,116,57,60,12,116,34,187,135,78,185,8,0,67,254,201,120,28,46,58,7,117,246,208,225,139,217,185,233,78,81,
        46,255,183,225,47,139,30,86,0,195,232,14,4,235,14,232,62,0,232,14,0,232,13,225,235,3,232,36,9,88,90,89,91,157,195,80,138,
        62,73,0,138,30,78,0,185,1,0,180,9,205,16,88,195,83,232,113,0,232,231,255,91,195,83,232,104,0,180,8,205,16,91,195,232,243,
        255,138,232,138,204,195,139,30,86,0,137,30,86,0,156,83,232,77,0,91,157,195,160,87,0,254,200,195,80,138,14,41,0,42,14,87,0,
        254,193,181,0,138,62,73,0,138,30,79,0,176,32,180,9,205,16,139,22,86,0,134,242,254,206,254,202,180,2,205,16,88,195,83,232,
        21,0,138,62,73,0,138,30,79,0,138,14,41,0,181,0,176,32,180,9,205,16,91,80,82,139,211,134,242,254,206,254,202,138,62,73,0,180,
        2,205,16,90,88,195,83,82,177,0,138,239,138,243,232,27,0,180,6,205,16,235,15,83,82,177,0,138,235,138,247,232,10,0,180,7,205,
        16,232,28,0,90,91,195,232,17,0,138,22,41,0,254,202,254,206,254,205,176,1,138,62,79,0,195,160,73,0,235,3,160,74,0,232,6,1,
        117,32,138,38,72,0,128,252,7,116,23,82,186,0,8,128,252,2,114,2,208,230,50,228,247,226,30,142,218,163,78,4,31,90,195,156,83,
        82,80,186,0,0,180,0,205,23,138,196,128,228,40,128,252,40,116,13,246,196,8,117,12,168,1,116,13,178,24,235,6,178,27,235,2,178,
        25,233,186,183,88,80,60,13,233,93,15,88,90,91,157,195,60,147,116,96,60,149,116,70,60,221,116,70,232,227,206,10,192,116,56,
        254,200,60,10,115,50,186,16,0,246,226,138,208,129,194,83,6,82,232,162,221,44,232,209,198,83,232,76,216,138,15,128,249,15,
        114,2,177,15,67,139,55,91,95,83,181,0,252,243,164,136,45,232,114,251,91,195,233,225,191,176,255,235,2,176,0,58,6,113,0,162,
        113,0,116,3,232,94,0,232,144,190,195,83,190,83,6,185,10,0,254,197,86,176,70,232,8,219,81,138,221,183,0,232,171,20,176,32,
        232,251,218,89,94,86,81,252,172,10,192,116,5,232,19,0,235,245,176,13,232,231,218,89,94,131,198,16,254,201,117,206,91,235,
        192,86,60,13,117,2,176,27,232,209,218,94,195,80,160,72,0,60,7,116,4,60,4,115,2,50,192,10,192,88,195,83,205,173,182,24,178,
        0,138,62,73,0,180,2,205,16,160,113,0,10,192,117,19,138,30,79,0,138,14,41,0,181,0,180,9,205,16,232,13,254,91,195,179,7,232,
        192,255,117,9,160,76,0,10,192,117,2,179,112,190,83,6,181,5,160,41,0,60,40,176,49,116,2,181,10,80,83,138,30,78,0,232,55,0,
        91,86,177,6,81,252,172,10,192,156,86,117,2,50,192,232,37,0,94,157,117,1,78,89,254,201,117,232,232,22,0,94,131,198,16,88,254,
        192,60,58,114,2,176,48,254,205,117,199,232,175,253,91,195,50,192,83,10,192,117,6,176,32,138,30,79,0,60,13,117,2,176,27,81,
        185,1,0,180,9,205,16,254,194,180,2,205,16,89,91,195,138,14,73,0,181,0,138,38,72,0,246,196,1,116,3,128,205,128,128,252,4,114,
        9,254,197,128,252,6,114,2,254,197,81,60,44,116,12,232,97,205,89,138,232,81,232,92,189,116,64,232,45,220,44,60,44,116,21,232,
        77,205,10,192,116,2,176,128,89,128,229,3,10,232,81,232,63,189,116,35,232,16,220,44,60,44,116,12,232,48,205,89,138,200,81,
        232,43,189,116,15,232,252,219,44,232,32,205,138,240,89,235,6,233,85,190,89,138,241,138,38,41,0,138,197,36,127,10,192,116,
        10,50,210,10,214,10,209,117,230,235,27,128,252,40,116,12,128,254,4,115,218,128,249,4,114,12,235,211,128,254,8,115,206,128,
        249,8,115,201,138,209,10,192,116,32,128,62,72,0,7,116,92,177,6,60,2,180,80,116,42,180,40,254,201,254,200,117,172,246,197,
        128,117,29,254,201,235,25,177,2,128,252,40,116,9,246,197,128,116,13,254,193,235,9,254,201,246,197,128,117,2,254,201,136,38,
        41,0,161,72,0,136,14,72,0,137,22,73,0,58,193,116,26,184,7,0,163,75,0,134,196,163,77,0,136,38,79,0,232,58,254,116,3,162,79,
        0,232,110,0,160,74,0,180,5,205,16,195,58,6,41,0,116,52,138,38,72,0,60,80,116,7,60,40,116,3,233,152,189,128,252,7,117,4,176,
        80,235,28,128,244,2,128,252,7,117,2,254,204,80,162,41,0,136,38,72,0,199,6,73,0,0,0,232,45,0,88,195,83,232,218,252,178,39,
        128,62,41,0,40,116,2,178,79,182,24,138,62,79,0,185,0,0,138,193,180,6,205,16,186,0,0,138,62,73,0,180,2,205,16,235,15,83,185,
        0,0,137,14,73,0,160,72,0,180,0,205,16,232,189,221,232,201,248,232,138,247,232,157,252,91,195,232,164,253,116,91,177,0,190,
        81,0,128,62,72,0,6,117,3,233,22,189,138,44,86,81,232,212,187,116,64,60,44,116,7,232,201,203,89,138,232,81,89,81,83,138,249,
        138,221,128,255,0,117,8,128,251,8,114,3,128,203,16,180,11,205,16,91,232,171,187,116,3,232,165,187,89,94,136,44,116,8,70,254,
        193,128,249,4,114,189,198,6,79,0,0,195,89,94,195,255,54,77,0,255,54,75,0,60,44,116,16,232,126,203,60,32,115,24,89,138,200,
        81,232,117,187,116,44,232,70,218,44,60,44,116,19,232,102,203,60,16,114,3,233,156,188,89,138,232,81,232,90,187,116,17,232,
        43,218,44,232,79,203,60,16,115,233,89,90,138,208,82,81,89,90,138,241,128,230,15,137,14,75,0,138,197,208,224,36,16,10,194,
        128,229,7,208,229,208,229,208,229,208,229,246,193,16,116,3,128,205,128,10,238,83,138,216,183,0,36,15,162,77,0,136,46,78,0,
        136,46,79,0,180,11,205,16,91,195,255,54,86,0,60,44,116,32,232,250,202,10,192,116,91,60,26,115,87,138,38,113,0,10,228,116,
        4,60,25,115,75,90,138,208,82,232,225,186,116,123,232,178,217,44,60,44,116,24,232,210,202,10,192,116,51,138,38,41,0,58,224,
        114,43,90,138,240,82,232,193,186,116,91,255,54,104,0,232,142,217,44,60,44,116,25,232,174,202,10,192,176,0,117,2,176,32,89,
        10,232,81,232,161,186,116,45,235,3,233,213,187,232,109,217,44,232,145,202,60,32,115,242,89,128,229,32,10,232,138,200,81,232,
        131,186,116,15,232,84,217,44,232,120,202,60,32,115,217,89,138,200,81,89,81,128,229,15,137,14,104,0,89,180,1,205,16,90,137,
        22,86,0,134,242,254,206,254,202,83,138,62,73,0,180,2,205,16,91,195,80,176,0,235,3,80,176,32,156,81,83,80,232,61,250,88,91,
        139,14,104,0,246,6,114,0,255,116,2,181,4,10,232,180,1,205,16,89,157,88,195,0,0,0,0,255,255,255,255,255,255,255,255,255,255,
        255,255,80,156,232,201,251,116,75,83,81,82,140,198,191,0,0,142,199,38,255,54,124,0,38,255,54,126,0,38,199,6,124,0,248,84,
        38,140,14,126,0,142,198,176,129,2,6,114,0,179,131,138,62,73,0,185,1,0,180,9,205,16,140,198,191,0,0,142,199,38,143,6,126,0,
        38,143,6,124,0,142,198,90,89,91,157,88,195,232,189,185,160,86,0,233,114,246,232,180,185,232,101,0,10,238,117,86,10,234,10,
        233,116,80,138,38,41,0,58,226,114,72,128,249,26,115,67,160,113,0,10,192,116,5,128,249,25,115,55,83,138,241,254,206,254,202,
        138,62,73,0,180,2,205,16,180,8,205,16,91,80,232,119,185,60,44,116,4,176,0,235,7,232,66,216,44,232,102,201,80,232,58,216,41,
        88,10,192,88,116,2,138,196,233,18,246,233,144,186,232,5,0,232,37,216,41,195,232,32,216,40,232,50,201,82,232,24,216,44,232,
        42,201,89,195,232,56,185,60,149,116,8,232,8,216,221,50,192,235,5,232,41,185,176,255,162,52,0,195,160,52,0,10,192,116,48,232,
        27,201,60,10,115,41,83,86,186,26,86,82,50,228,209,224,139,240,46,255,180,29,86,195,94,91,195,52,86,63,86,70,86,76,86,107,
        86,114,86,120,86,128,86,136,86,144,86,233,37,186,187,53,0,138,7,198,7,0,233,159,245,139,30,55,0,233,198,14,160,57,0,233,140,
        245,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,63,0,88,138,196,254,200,246,208,233,115,245,139,30,58,0,
        233,154,14,160,60,0,233,96,245,160,62,0,254,192,233,88,245,160,61,0,254,192,233,80,245,160,64,0,254,192,233,72,245,160,63,
        0,254,192,233,64,245,232,132,200,10,192,116,18,60,4,115,84,180,0,83,187,65,0,3,216,138,7,91,233,39,245,83,186,1,2,185,1,1,
        187,15,0,250,238,236,36,15,58,195,225,249,227,11,50,195,138,225,80,254,199,50,216,235,236,10,255,116,26,138,215,187,65,0,
        185,4,0,88,246,212,2,226,208,232,115,2,136,39,67,226,247,254,202,117,232,251,91,160,65,0,233,225,244,233,95,185,232,32,184,
        60,149,116,8,232,240,214,221,50,192,235,5,232,17,184,176,255,162,69,0,195,160,69,0,10,192,116,222,232,3,200,60,4,115,215,
        168,1,116,14,180,16,254,200,116,2,180,64,232,208,0,233,172,244,83,187,70,0,10,192,116,1,67,138,7,198,7,0,91,233,154,244,156,
        80,85,86,87,30,186,0,0,142,218,142,30,16,5,161,102,0,10,196,116,9,255,14,102,0,117,3,232,39,0,160,52,0,10,192,116,3,232,54,
        0,160,69,0,10,192,116,3,232,105,0,31,95,94,93,88,157,207,198,6,101,0,0,161,102,0,11,192,116,24,82,250,246,6,101,0,255,117,
        7,186,97,0,236,36,252,238,199,6,102,0,0,0,251,90,195,83,81,82,180,4,205,16,80,10,228,116,12,137,30,58,0,136,46,60,0,137,22,
        63,0,88,160,54,0,50,196,116,25,10,228,136,38,54,0,116,17,137,30,55,0,136,46,57,0,137,22,61,0,176,255,162,53,0,90,89,91,195,
        83,187,70,0,128,63,0,117,7,180,16,232,17,0,136,7,67,128,63,0,117,7,180,64,232,4,0,136,7,91,195,82,186,1,2,236,34,196,254,
        200,152,138,196,90,195,232,9,0,184,211,5,186,4,0,82,235,56,139,22,102,0,10,242,116,7,198,6,101,0,255,235,241,195,232,222,
        198,131,250,37,114,18,82,232,191,213,44,232,113,202,89,82,11,210,117,7,90,233,59,255,233,19,184,232,208,255,186,18,0,184,
        220,52,247,241,246,6,101,0,255,117,8,80,186,67,0,176,182,238,88,186,66,0,238,138,196,238,117,7,186,97,0,236,12,3,238,90,137,
        22,102,0,198,6,101,0,0,195,10,90,77,65,89,16,89,16,25,90,89,16,89,16,89,16,89,16,45,90,89,16,52,90,77,65,89,16,69,90,89,16,
        89,16,89,16,89,16,89,16,89,16,93,90,99,90,77,65,89,16,124,90,89,16,89,16,89,16,89,16,89,16,89,16,170,90,177,90,110,91,89,
        16,171,91,240,91,89,16,89,16,108,92,89,16,118,92,89,16,34,194,117,34,156,80,83,137,30,233,4,136,23,131,195,45,198,7,0,67,
        67,136,47,67,198,7,0,67,136,15,67,198,7,0,91,88,157,195,233,152,174,88,91,195,128,250,128,117,2,178,2,195,88,134,196,158,
        89,90,91,195,90,91,89,195,131,195,46,138,7,246,208,195,139,30,233,4,131,195,43,195,139,30,233,4,131,195,50,195,139,30,233,
        4,138,135,47,0,195,86,87,81,198,6,63,5,165,190,240,4,191,64,5,185,8,0,252,164,226,253,89,95,94,195,83,81,187,64,5,177,8,128,
        63,32,117,13,67,254,201,117,246,190,92,5,191,72,5,235,16,190,84,5,191,64,5,177,8,252,166,117,39,254,201,117,249,138,5,58,
        4,116,9,10,192,117,25,246,4,1,117,20,138,4,139,30,233,4,136,135,49,0,187,244,89,232,14,0,50,192,235,7,187,254,89,232,4,0,
        249,89,91,195,83,139,30,46,0,67,11,219,116,2,91,195,187,83,5,83,67,177,8,138,7,232,213,244,67,254,201,117,246,176,46,232,
        203,244,91,131,195,9,176,68,246,7,225,116,23,176,80,246,7,32,117,16,176,66,246,7,128,117,9,176,65,246,7,64,117,2,176,77,91,
        232,165,244,46,138,7,67,10,192,117,245,195,32,70,111,117,110,100,46,255,13,0,32,83,107,105,112,112,101,100,46,255,13,0,185,
        0,0,136,14,82,5,176,234,232,189,254,233,227,254,187,82,5,138,7,198,7,0,10,192,117,5,232,70,243,10,192,233,226,254,136,14,
        82,5,233,163,235,232,200,254,138,46,41,0,177,0,176,237,232,145,254,233,183,254,88,80,134,196,232,68,244,138,14,87,0,254,201,
        139,30,233,4,136,143,50,0,233,170,254,88,134,196,233,73,248,138,46,98,0,177,0,232,147,254,176,109,232,98,254,232,175,254,
        160,99,0,136,7,233,128,254,88,80,134,196,232,3,0,233,129,254,232,106,245,187,99,0,60,13,117,3,233,228,4,60,32,115,1,195,254,
        7,83,232,141,254,91,254,192,116,244,254,200,56,7,233,197,4,88,134,196,162,98,0,195,160,97,0,10,192,116,3,233,232,172,128,
        226,251,117,2,178,1,162,81,5,254,192,162,80,5,138,202,128,225,128,128,233,1,245,26,201,128,225,128,246,194,16,116,3,128,201,
        32,160,96,0,10,192,116,2,177,1,10,201,117,9,246,6,95,0,255,116,2,177,64,136,14,72,5,181,255,176,104,232,210,253,138,39,232,
        46,254,246,196,1,117,12,246,193,129,117,3,232,47,0,176,255,235,31,232,51,0,232,48,254,114,248,139,30,233,4,246,135,49,0,129,
        117,10,232,17,1,115,5,198,6,80,5,0,176,1,162,97,0,232,231,253,198,7,1,233,186,253,187,63,5,185,17,0,180,3,205,21,195,187,
        83,5,185,17,0,83,180,2,205,21,115,3,233,2,1,91,160,94,0,10,192,117,6,128,63,165,117,230,195,233,41,172,160,97,0,254,192,116,
        11,50,192,162,97,0,162,96,0,233,205,229,139,30,233,4,246,135,49,0,129,117,234,232,59,0,232,31,1,235,226,83,187,97,0,56,39,
        117,13,139,30,233,4,246,135,49,0,129,91,117,1,195,233,233,171,180,255,232,227,255,88,80,134,196,232,3,0,233,77,253,232,38,
        0,136,7,254,193,116,11,232,93,253,136,15,195,232,87,253,138,15,187,83,5,181,0,254,201,65,136,15,180,3,205,21,232,68,253,198,
        7,1,195,232,61,253,138,15,181,0,187,83,5,3,217,195,180,1,232,158,255,232,3,0,233,20,253,160,80,5,44,1,115,1,195,187,81,5,
        138,7,198,7,0,10,192,116,1,195,232,10,0,115,7,198,6,80,5,0,10,192,195,232,195,255,138,7,254,193,232,252,252,136,15,232,239,
        252,58,15,116,3,10,192,195,128,63,0,117,221,80,232,2,0,88,195,187,83,5,185,0,1,180,2,205,21,114,21,160,83,5,232,203,252,136,
        7,232,206,252,198,7,1,254,200,249,116,1,248,195,128,252,4,117,5,178,24,233,111,171,233,37,171,160,80,5,44,1,26,192,233,147,
        8,136,14,81,5,233,90,233,198,6,95,0,0,83,137,30,77,5,139,22,80,3,137,22,75,5,139,14,4,7,43,203,137,14,73,5,81,82,232,164,
        254,90,89,91,160,96,0,10,192,6,116,2,142,194,180,3,205,21,7,232,137,0,186,5,0,185,0,0,73,117,253,74,117,250,232,118,0,195,
        190,83,5,139,140,10,0,160,96,0,10,192,156,81,117,13,80,83,81,86,3,217,232,22,230,94,89,91,88,60,1,117,4,139,156,14,0,6,10,
        192,116,14,139,148,12,0,254,200,116,4,139,22,80,3,142,194,180,2,205,21,7,114,18,89,157,117,11,139,30,48,0,3,217,67,137,30,
        88,3,233,128,229,80,232,5,208,88,128,252,4,117,5,178,24,233,181,170,233,107,170,75,232,243,177,117,5,160,100,0,235,3,232,
        232,193,10,192,117,4,176,1,235,2,176,0,162,100,0,138,224,205,21,195,205,219,249,235,1,248,139,243,156,139,14,165,4,138,195,
        50,193,162,167,4,138,199,50,228,138,221,50,255,157,115,7,3,195,45,1,1,235,2,43,195,10,228,120,13,61,128,0,114,21,139,222,
        131,196,2,233,93,23,5,128,0,121,11,139,222,131,196,2,233,223,29,5,128,0,162,166,4,187,165,4,128,15,128,139,222,50,255,128,
        203,128,195,198,6,57,3,128,232,198,217,83,139,218,232,234,6,232,4,197,137,30,94,4,177,32,232,27,207,91,232,96,177,116,23,
        232,49,208,40,232,167,217,82,138,7,60,44,117,5,232,76,177,235,241,232,30,208,41,137,30,59,3,14,184,233,93,80,255,54,80,3,
        255,54,94,4,203,139,30,59,3,195,83,232,14,5,60,108,116,10,60,76,116,6,60,113,116,2,60,81,91,195,38,38,38,38,38,38,38,38,38,
        38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,37,37,37,36,36,36,35,35,35,34,34,34,34,33,33,33,32,32,32,31,31,31,31,30,30,
        30,29,29,29,29,28,28,28,27,27,27,26,26,26,25,25,25,25,24,24,24,23,23,23,23,22,22,22,22,21,21,21,20,20,20,19,19,19,19,18,18,
        18,17,17,17,16,16,16,16,15,15,15,14,14,14,13,13,13,13,12,12,12,11,11,11,10,10,10,10,9,9,9,8,8,8,7,7,7,6,6,6,6,5,5,5,4,4,4,
        3,3,3,3,2,2,2,1,1,1,0,0,0,0,255,255,255,254,254,254,253,253,253,253,252,252,252,251,251,251,250,250,250,250,249,249,249,248,
        248,248,247,247,247,247,246,246,246,245,245,245,244,244,244,244,243,243,243,242,242,242,241,241,241,241,240,240,240,239,239,
        239,238,238,238,238,237,237,237,236,236,236,235,235,235,235,234,234,234,233,233,233,232,232,232,231,231,231,231,230,230,230,
        229,229,229,228,228,228,228,227,227,227,226,226,226,225,225,225,225,224,11,246,121,2,247,218,43,215,112,61,116,58,83,232,
        144,28,156,115,3,232,106,12,11,210,120,15,131,250,39,114,29,157,115,3,232,61,12,91,233,177,21,131,250,218,125,14,131,194,
        38,131,250,218,124,17,232,19,0,186,218,255,232,13,0,157,115,3,232,29,12,91,195,232,31,28,235,243,11,210,156,121,2,247,218,
        185,3,0,211,226,129,194,50,96,135,218,232,37,29,157,120,3,233,236,12,232,236,28,233,212,8,114,9,176,13,144,233,15,251,198,
        7,0,138,7,232,164,249,136,7,195,117,6,176,10,144,232,105,240,88,90,91,157,195,128,62,106,0,0,116,18,30,83,197,30,107,0,128,
        63,0,91,31,117,5,198,6,106,0,0,233,114,175,95,94,233,190,237,117,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,40,21,199,
        6,165,4,0,0,195,16,91,136,54,167,4,187,0,16,198,6,251,2,4,233,16,21,199,6,165,4,0,0,195,92,214,237,189,206,254,230,91,95,
        166,180,54,65,95,112,9,99,207,97,132,17,119,204,43,102,67,122,229,213,148,191,86,105,106,108,175,5,189,55,6,109,133,71,27,
        71,172,197,39,112,102,25,226,88,23,183,81,115,224,79,141,151,110,18,3,119,216,163,112,61,10,215,35,122,205,204,204,204,204,
        204,76,125,0,0,0,0,0,0,0,129,0,0,0,0,0,0,32,132,0,0,0,0,0,0,72,135,0,0,0,0,0,0,122,138,0,0,0,0,0,64,28,142,0,0,0,0,0,80,67,
        145,0,0,0,0,0,36,116,148,0,0,0,0,128,150,24,152,0,0,0,0,32,188,62,155,0,0,0,0,40,107,110,158,0,0,0,0,249,2,21,162,0,0,0,64,
        183,67,58,165,0,0,0,16,165,212,104,168,0,0,0,42,231,132,17,172,0,0,128,244,32,230,53,175,0,0,160,49,169,95,99,178,0,0,4,191,
        201,27,14,182,0,0,197,46,188,162,49,185,0,64,118,58,107,11,94,188,0,232,137,4,35,199,10,192,0,98,172,197,235,120,45,195,128,
        122,23,183,38,215,88,198,144,172,110,50,120,134,7,202,181,87,10,63,22,104,41,205,162,237,204,206,27,194,83,208,133,20,64,
        97,81,89,4,212,166,25,144,185,165,111,37,215,16,32,244,39,143,203,78,218,10,148,248,120,57,63,1,222,12,185,54,215,7,143,33,
        225,79,103,4,205,201,242,73,228,35,129,69,64,124,111,124,231,182,112,43,168,173,197,29,235,228,76,54,18,25,55,69,238,28,224,
        195,86,223,132,118,241,18,108,58,150,11,19,26,245,22,7,201,123,206,151,64,248,220,72,187,26,194,189,112,251,137,13,181,80,
        153,118,22,255,0,0,0,0,0,0,0,128,241,4,53,128,4,154,247,25,131,36,99,67,131,117,205,141,132,169,127,131,130,4,0,0,0,129,226,
        176,77,131,10,114,17,131,244,4,53,127,24,114,49,128,46,101,69,37,35,33,68,100,44,48,0,128,198,164,126,141,3,0,64,122,16,243,
        90,0,0,160,114,78,24,9,0,0,16,165,212,232,0,0,0,232,118,72,23,0,0,0,228,11,84,2,0,0,0,202,154,59,0,0,0,0,225,245,5,0,0,0,
        128,150,152,0,0,0,0,64,66,15,0,0,0,0,64,66,15,160,134,1,16,39,0,16,39,232,3,100,0,10,0,1,0,0,0,128,144,255,255,255,255,255,
        255,127,255,255,255,255,255,255,255,255,255,59,170,56,129,7,124,136,89,116,224,151,38,119,196,29,30,122,94,80,99,124,26,254,
        117,126,24,114,49,128,0,0,0,129,5,251,215,30,134,101,38,153,135,88,52,35,135,225,93,165,134,219,15,73,131,2,215,179,93,129,
        0,0,128,129,4,98,53,131,126,80,36,76,126,121,169,170,127,0,0,0,129,11,68,78,110,131,249,34,126,253,67,3,195,158,38,1,0,0,
        48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,186,59,170,187,56,129,232,114,10,160,166,4,60,136,115,60,60,104,114,75,255,
        54,163,4,255,54,165,4,232,96,16,138,226,128,196,129,116,35,80,246,6,167,4,128,232,67,16,50,228,232,230,17,88,91,90,80,232,
        168,4,187,23,98,232,141,18,91,51,210,138,218,233,50,10,131,196,4,128,38,165,4,128,116,3,233,145,24,50,228,136,38,167,4,233,
        249,17,191,163,4,144,51,192,252,171,199,5,0,129,195,232,175,24,117,3,233,222,164,195,252,171,199,5,0,129,195,233,26,172,205,
        185,128,54,165,4,128,128,54,177,4,128,233,138,3,205,186,135,217,233,90,4,205,187,135,217,233,71,4,205,188,232,51,25,233,27,
        5,135,217,233,177,5,205,189,137,30,163,4,233,107,8,205,190,82,152,139,208,232,238,8,90,195,205,191,135,217,233,183,9,205,
        192,135,217,233,237,13,129,251,0,128,117,19,205,193,232,211,8,51,210,187,128,144,232,5,4,232,75,26,233,69,8,247,219,83,3,
        218,112,4,88,233,153,1,205,194,232,181,8,90,255,54,163,4,255,54,165,4,232,169,8,91,90,233,234,3,139,195,82,247,234,90,114,
        5,139,216,233,118,1,205,195,83,232,145,8,90,255,54,163,4,255,54,165,4,232,133,8,91,90,233,82,9,11,219,117,12,136,54,167,4,
        198,6,251,2,4,233,45,17,137,30,163,4,184,0,0,163,165,4,146,11,192,121,3,186,255,255,11,219,121,6,199,6,165,4,255,255,247,
        62,163,4,139,216,233,42,1,135,217,232,215,24,135,217,195,83,232,69,26,91,131,195,4,195,139,22,163,4,139,14,165,4,195,156,
        83,232,25,26,91,131,195,4,157,195,232,171,190,137,30,163,4,233,103,10,232,161,190,137,30,163,4,233,101,10,205,196,139,23,
        139,159,2,0,233,77,3,94,255,54,163,4,255,54,165,4,255,230,205,197,135,217,232,160,24,135,217,195,232,100,23,116,3,233,147,
        163,195,135,218,232,205,0,50,192,181,152,205,198,187,166,4,138,200,136,47,181,0,67,136,47,208,208,205,199,115,3,232,32,1,
        138,229,138,217,233,51,16,232,146,254,83,51,219,137,30,163,4,183,129,137,30,165,4,198,6,251,2,4,232,4,20,91,198,6,251,2,4,
        195,139,193,247,226,146,115,3,233,37,213,195,187,171,4,186,183,100,233,6,0,187,171,4,186,185,100,82,186,163,4,232,247,22,
        114,3,186,159,4,195,138,205,50,237,235,8,135,218,160,251,2,152,139,200,252,139,242,139,251,243,164,139,214,139,223,195,232,
        54,200,139,241,139,251,253,43,202,65,243,164,139,218,139,207,65,252,195,156,73,157,195,232,188,22,117,3,233,235,162,205,200,
        120,3,233,131,22,161,163,4,11,192,116,6,176,1,121,2,176,255,195,51,192,11,219,117,243,195,91,195,152,139,216,198,6,251,2,
        2,137,30,163,4,195,198,6,251,2,4,195,232,196,255,233,231,255,205,201,91,90,233,181,3,232,37,6,91,90,233,11,12,185,4,0,233,
        136,255,156,138,23,67,157,156,138,55,67,139,15,67,157,156,67,157,195,83,187,40,7,232,6,22,91,185,182,38,81,232,181,255,50,
        192,205,202,162,49,3,187,180,4,198,7,32,10,7,67,198,7,48,233,106,11,205,203,160,165,4,235,9,205,204,232,229,23,116,8,246,
        208,208,224,26,192,116,61,195,205,205,128,54,167,4,128,51,219,246,221,139,195,27,194,139,208,138,195,26,193,138,200,195,232,
        3,22,120,250,205,206,232,207,21,120,3,233,213,24,232,2,24,232,207,24,233,252,23,139,195,43,194,116,14,112,7,120,7,50,192,
        254,192,195,120,249,249,26,192,195,59,218,117,5,51,219,233,38,0,139,194,137,30,163,4,11,219,232,211,249,144,144,144,121,6,
        199,6,165,4,255,255,11,192,186,0,0,121,3,186,255,255,247,62,163,4,139,218,137,30,163,4,195,173,58,225,116,17,70,2,4,254,192,
        152,3,240,59,245,117,239,139,214,233,57,210,58,6,251,2,117,233,58,44,117,229,70,138,208,172,58,6,142,0,116,4,2,194,235,220,
        10,192,116,16,152,145,191,143,0,243,166,145,116,6,3,240,138,194,235,200,139,214,91,195,139,243,139,46,75,4,252,235,190,139,
        243,139,46,92,3,252,233,13,0,173,58,225,116,17,70,172,152,3,240,173,3,240,59,238,117,239,139,222,233,83,211,58,6,251,2,117,
        233,58,44,117,229,70,172,58,6,142,0,117,223,10,192,116,14,152,145,191,143,0,243,166,145,116,4,3,240,235,208,173,139,208,139,
        222,233,5,211,232,24,22,195,161,165,4,10,228,116,245,128,54,165,4,128,205,215,176,0,162,158,4,162,170,4,160,178,4,10,192,
        116,226,161,165,4,10,228,116,216,139,30,177,4,128,14,165,4,128,128,14,177,4,128,138,204,42,207,162,167,4,116,34,115,18,134,
        195,246,217,162,167,4,136,62,166,4,80,81,232,111,21,89,88,128,249,57,115,95,83,248,232,33,21,160,167,4,91,50,195,187,158,
        4,190,170,4,185,4,0,248,252,120,30,173,17,7,67,67,226,249,115,18,187,166,4,254,7,116,52,75,75,185,4,0,209,31,75,75,226,250,
        233,233,17,173,25,7,67,67,226,249,115,26,246,151,1,0,185,4,0,75,75,247,23,226,250,185,4,0,255,7,117,6,67,67,226,248,116,200,
        233,244,12,233,141,13,160,167,4,36,128,128,38,165,4,127,8,6,165,4,195,137,30,165,4,137,22,163,4,195,161,165,4,10,228,116,
        240,128,54,165,4,128,10,255,116,239,161,165,4,10,228,116,224,51,201,139,54,163,4,162,167,4,138,204,42,207,115,13,246,217,
        134,223,137,30,166,4,134,223,147,135,214,138,224,50,227,156,180,128,10,196,10,220,50,228,138,252,11,201,116,70,131,249,25,
        114,18,157,137,54,163,4,138,38,167,4,37,127,128,10,196,162,165,4,195,128,249,8,114,28,233,5,3,144,138,243,50,219,128,233,
        8,246,196,31,116,208,128,204,32,235,203,128,204,32,226,3,235,14,248,208,219,209,218,208,220,246,196,16,117,237,226,243,157,
        121,37,42,204,138,225,27,242,139,214,26,195,138,216,115,47,246,22,167,4,246,212,247,210,246,211,254,196,117,33,66,117,30,
        254,195,117,26,235,6,3,214,18,216,115,12,254,6,166,4,116,9,208,219,209,218,208,220,233,36,17,233,169,12,233,104,12,232,37,
        19,195,160,177,4,162,167,4,233,167,12,246,6,166,4,255,116,240,246,6,178,4,255,116,229,139,30,177,4,232,243,244,137,30,177,
        4,187,164,4,248,232,161,19,187,176,4,248,232,154,19,255,54,166,4,232,94,21,143,6,166,4,185,64,0,81,235,8,81,248,187,170,4,
        232,119,19,139,252,131,236,8,131,239,2,190,176,4,185,4,0,253,243,165,190,120,4,185,4,0,187,170,4,248,252,173,25,7,67,67,226,
        249,115,16,185,4,0,139,244,191,170,4,252,243,165,139,230,248,235,4,131,196,8,249,187,158,4,232,56,19,89,226,182,246,6,165,
        4,128,116,9,255,6,166,4,117,9,233,7,12,187,158,4,232,31,19,233,49,16,232,148,18,117,7,136,30,167,4,233,0,12,10,255,117,3,
        233,122,18,232,87,244,139,250,51,210,138,254,139,243,138,223,185,32,0,85,139,46,163,4,160,165,4,138,231,235,5,248,209,215,
        209,214,86,87,43,253,27,240,115,4,95,94,235,4,131,196,4,248,245,209,210,209,211,226,228,11,219,121,10,254,6,166,4,117,8,93,
        233,165,11,209,210,209,211,138,226,138,214,138,243,138,223,93,233,13,16,19,249,83,87,81,44,48,80,232,80,18,88,152,121,30,
        139,30,163,4,129,251,205,12,115,25,139,203,209,227,209,227,3,217,209,227,3,216,120,11,137,30,163,4,235,72,80,114,8,235,51,
        80,232,36,2,235,20,199,6,124,4,0,36,199,6,126,4,116,148,187,126,4,232,131,19,121,22,232,60,18,90,255,54,163,4,255,54,165,
        4,232,139,2,91,90,232,204,253,235,19,232,231,1,232,35,18,232,238,18,90,232,119,2,232,218,1,232,238,252,89,95,91,195,205,217,
        50,192,233,9,0,205,218,176,1,198,6,251,2,8,198,6,168,4,1,190,180,37,86,51,255,139,207,139,247,247,209,80,232,134,17,88,10,
        192,117,5,198,6,251,2,2,138,7,60,38,117,3,233,7,176,60,45,156,116,5,60,43,116,1,75,232,251,248,115,6,232,61,255,233,245,255,
        189,163,97,51,210,139,242,46,58,134,0,0,116,10,129,253,156,97,116,36,77,233,239,255,129,237,156,97,209,229,46,255,166,48,
        106,75,106,95,106,95,106,103,106,109,106,115,106,64,106,64,106,50,192,232,156,0,232,65,0,233,45,0,65,117,247,232,81,17,121,
        175,81,83,87,232,72,1,95,91,89,233,163,255,232,140,243,116,225,233,219,255,67,235,219,233,11,0,232,188,0,233,5,0,50,192,232,
        182,0,157,117,13,232,45,19,232,33,17,122,5,83,232,237,18,91,195,233,118,244,198,6,85,4,255,232,137,164,139,212,233,227,8,
        10,255,117,5,232,232,16,249,195,160,166,4,10,192,117,8,138,195,246,208,232,228,16,249,195,232,228,255,93,114,20,235,16,83,
        139,31,232,217,255,91,93,114,8,83,87,191,165,4,144,85,195,254,192,44,1,195,246,196,255,138,226,116,3,128,204,32,138,214,233,
        237,252,16,159,128,62,251,2,8,117,4,158,233,8,0,158,83,87,232,92,0,95,91,51,246,139,214,232,4,248,114,19,60,45,117,4,247,
        214,235,5,60,43,116,1,195,232,242,247,114,1,195,129,250,204,12,114,5,186,255,127,235,239,80,184,10,0,247,226,90,128,234,48,
        50,246,3,208,235,223,12,1,83,87,117,7,232,28,0,235,5,144,144,232,70,0,95,91,51,246,139,214,232,189,243,67,195,232,88,16,120,
        249,233,111,156,116,49,232,78,16,123,86,117,3,233,123,156,205,207,121,5,232,63,0,235,72,176,4,162,251,2,138,30,165,4,136,
        30,167,4,139,22,163,4,138,38,162,4,128,204,64,128,203,128,233,213,13,232,29,16,115,37,117,3,233,74,156,205,208,121,3,232,
        14,0,176,8,162,251,2,51,192,163,159,4,163,161,4,195,82,86,139,22,163,4,232,131,0,94,90,195,232,242,15,121,5,139,30,163,4,
        195,205,209,117,3,233,24,156,160,166,4,60,144,114,49,116,3,233,6,156,160,165,4,10,192,120,3,233,252,155,186,0,0,187,0,128,
        232,138,251,232,203,6,232,205,17,186,0,0,187,128,144,232,236,16,116,3,233,223,155,187,0,128,235,45,160,165,4,10,192,156,121,
        5,36,127,162,165,4,186,0,0,187,0,128,232,103,251,160,166,4,60,144,117,6,157,120,219,233,183,155,232,231,6,139,218,157,121,
        2,247,219,137,30,163,4,198,6,251,2,2,195,51,219,50,228,190,167,4,198,132,255,255,144,198,4,0,11,210,121,5,247,218,198,4,128,
        138,222,138,242,138,215,198,6,251,2,4,233,75,8,205,214,160,166,4,10,192,116,10,160,178,4,10,192,117,4,233,248,14,195,139,
        30,177,4,232,218,240,255,54,166,4,137,30,177,4,232,86,17,139,240,163,166,4,187,120,4,163,178,4,189,171,4,139,0,11,192,116,
        44,191,0,0,139,207,139,0,247,35,83,139,222,3,223,129,195,151,4,3,7,115,1,66,3,193,115,1,66,137,7,139,202,91,131,255,6,116,
        4,71,71,235,219,139,193,83,187,159,4,137,0,91,131,254,6,116,4,70,70,235,190,190,157,4,253,185,7,0,172,10,192,225,251,116,
        5,128,14,158,4,32,160,165,4,10,192,143,6,166,4,120,15,187,158,4,185,4,0,209,23,67,67,226,250,233,25,12,254,6,166,4,117,247,
        233,221,7,232,115,14,116,4,10,255,117,3,233,96,14,232,58,240,139,14,165,4,50,237,161,163,4,138,253,83,81,82,81,80,247,226,
        139,202,88,247,227,3,200,115,1,66,139,218,90,88,247,226,3,200,115,1,66,3,218,90,88,246,226,3,216,115,13,209,219,209,217,254,
        6,166,4,117,3,233,144,7,10,255,121,9,254,6,166,4,117,7,233,131,7,209,209,209,211,138,213,138,243,138,223,138,225,233,236,
        11,195,83,176,8,114,2,176,17,138,232,138,200,81,156,232,72,2,10,192,116,2,121,12,157,89,80,123,11,4,16,88,121,26,235,9,157,
        89,235,38,4,7,88,121,15,80,232,246,11,88,138,224,2,225,126,22,2,232,235,12,2,197,254,197,58,232,181,3,114,12,138,232,254,
        197,176,2,235,4,2,197,181,3,254,200,254,200,91,80,156,50,201,232,77,0,198,7,48,117,1,67,232,232,0,75,128,63,48,116,250,128,
        63,46,116,1,67,157,88,116,43,156,80,232,191,13,180,69,123,2,180,68,136,39,67,88,157,198,7,43,121,5,198,7,45,246,216,180,47,
        254,196,44,10,115,250,4,58,67,134,196,137,7,67,67,198,7,0,135,217,187,180,4,195,254,205,121,22,137,30,82,3,198,7,46,67,198,
        7,48,254,197,117,248,67,51,201,235,26,254,205,117,12,198,7,46,137,30,82,3,67,51,201,235,10,254,201,117,6,198,7,44,67,177,
        3,137,14,129,4,195,180,5,189,245,97,232,217,255,46,139,150,0,0,69,69,139,54,163,4,176,47,254,192,43,242,115,250,3,242,136,
        7,67,137,54,163,4,254,204,117,221,232,182,255,198,7,0,195,185,1,3,190,6,0,235,6,185,4,4,190,4,0,191,179,4,252,187,116,98,
        139,22,163,4,86,138,198,50,228,211,224,134,224,46,215,170,211,226,138,205,78,117,238,198,5,0,187,179,4,89,254,201,128,63,
        48,117,3,67,226,248,195,232,233,12,123,119,81,83,190,159,4,191,171,4,185,4,0,252,243,165,232,117,3,83,187,177,4,232,253,13,
        91,190,171,4,191,159,4,185,4,0,252,243,165,116,3,232,206,12,138,14,166,4,128,233,184,246,217,248,232,90,3,91,89,190,166,97,
        176,9,232,46,255,80,176,47,80,88,254,192,80,232,148,0,115,247,232,163,0,88,235,11,117,9,198,7,49,67,198,7,48,235,2,136,7,
        67,88,254,200,117,215,81,190,159,4,191,163,4,185,2,0,252,243,165,89,235,41,83,81,232,24,15,232,113,3,90,91,232,153,13,116,
        11,137,30,165,4,137,22,163,4,232,115,12,176,1,232,178,3,137,30,165,4,137,22,163,4,89,91,176,3,186,236,97,232,199,254,80,83,
        82,232,94,13,93,176,47,80,88,254,192,80,232,23,14,115,247,46,3,150,0,0,46,18,158,2,0,69,69,69,232,56,13,88,135,213,91,136,
        7,67,88,254,200,117,206,66,66,139,234,180,4,233,179,254,81,86,185,7,0,191,159,4,248,252,46,172,24,5,71,226,249,94,89,195,
        81,185,7,0,191,159,4,248,252,46,172,16,5,71,226,249,89,195,83,81,51,255,87,187,2,94,160,166,4,46,215,10,192,116,12,95,152,
        43,248,87,139,208,232,50,239,235,232,187,102,96,232,136,12,232,45,13,115,6,232,230,11,95,79,87,232,176,11,114,31,187,122,
        96,232,142,12,232,88,252,88,44,9,80,187,246,127,232,109,12,232,87,13,118,7,232,185,11,88,254,192,80,88,89,91,10,192,195,88,
        89,91,10,192,195,187,180,4,138,47,177,32,138,38,131,4,246,196,32,116,13,58,233,177,42,117,7,246,196,4,117,2,138,233,136,15,
        232,191,242,116,50,189,165,97,46,58,134,0,0,116,9,129,253,156,97,116,38,77,235,240,129,237,156,97,209,229,46,255,166,97,112,
        117,112,117,112,121,112,121,112,121,112,121,112,117,112,121,112,60,112,60,112,75,198,7,48,138,38,131,4,246,196,16,116,4,75,
        198,7,36,246,196,4,117,5,75,136,47,50,237,195,10,192,235,6,198,7,48,67,254,200,117,248,195,232,137,253,198,7,48,67,254,200,
        117,245,195,187,180,4,198,7,32,83,232,193,10,91,156,121,10,198,7,45,83,232,236,12,91,12,1,67,198,7,48,157,195,205,216,232,
        221,255,117,8,67,198,7,0,187,180,4,195,232,200,10,121,18,185,0,7,51,192,163,131,4,137,14,129,4,232,94,253,233,49,255,233,
        120,252,232,129,10,121,3,233,96,159,117,1,195,160,166,4,208,232,80,198,6,166,4,64,208,22,166,4,187,171,4,232,9,13,185,4,0,
        81,232,55,13,139,22,171,4,139,30,173,4,232,187,247,90,91,232,75,246,254,14,166,4,89,116,10,226,227,88,4,192,0,6,166,4,195,
        233,47,10,191,190,37,87,191,168,4,198,5,1,232,44,10,117,3,233,54,241,121,7,10,255,117,10,233,147,3,10,255,117,3,233,13,10,
        10,219,121,38,128,62,166,4,153,114,3,233,237,158,82,83,255,54,163,4,255,54,165,4,232,50,1,91,90,232,90,11,232,61,11,91,90,
        116,3,233,209,158,160,165,4,10,192,121,9,191,196,113,87,36,127,162,165,4,83,82,128,203,127,156,255,54,165,4,255,54,163,4,
        232,2,1,90,91,232,42,11,117,28,82,83,51,210,187,0,144,232,30,11,91,90,121,14,157,90,91,235,60,144,51,210,187,0,129,233,18,
        247,157,121,14,83,82,232,47,1,138,194,232,197,2,90,91,208,216,143,6,163,4,143,6,165,4,159,128,38,165,4,127,158,115,4,191,
        176,125,87,83,82,232,21,1,90,91,232,3,251,233,133,240,83,82,232,255,0,137,22,178,4,199,6,163,4,0,0,199,6,165,4,0,129,209,
        46,178,4,115,7,90,91,83,82,232,222,250,247,6,178,4,255,255,116,21,90,91,232,33,12,232,141,10,232,203,250,90,91,232,22,12,
        232,130,10,235,214,90,91,195,138,14,166,4,128,233,184,115,57,246,217,156,187,164,4,138,135,1,0,136,135,3,0,10,192,156,12,
        128,136,135,1,0,198,135,2,0,184,157,156,121,3,232,34,0,50,237,232,18,0,157,121,3,232,38,0,198,6,158,4,0,157,115,3,233,189,
        1,195,81,83,248,232,122,9,91,89,226,246,195,83,187,159,4,131,47,1,115,4,67,67,235,247,91,195,83,187,159,4,254,7,117,3,67,
        235,249,91,195,138,14,166,4,128,233,152,115,65,246,217,156,139,22,163,4,139,30,165,4,10,219,156,136,30,167,4,198,6,166,4,
        152,128,203,128,157,156,121,6,131,234,1,128,219,0,50,237,10,201,116,6,208,235,209,218,226,250,157,159,121,5,66,117,2,254,
        195,157,115,5,50,228,233,169,1,158,121,10,247,210,246,211,131,194,1,128,211,0,195,177,152,42,14,166,4,248,235,170,232,102,
        8,126,81,186,0,0,187,0,129,232,190,9,117,9,137,22,163,4,137,22,165,4,195,160,166,4,44,128,152,80,198,6,166,4,128,232,27,11,
        187,118,97,232,24,2,90,91,232,16,11,232,124,9,187,135,97,232,10,2,90,91,232,145,245,90,232,254,10,232,217,248,90,91,232,26,
        244,187,49,128,186,24,114,233,157,249,233,244,156,233,92,148,159,134,224,80,176,1,235,2,50,192,162,85,4,88,134,196,158,186,
        0,0,137,30,83,4,116,3,232,233,195,137,30,59,3,232,172,147,117,215,139,227,139,54,83,4,57,55,117,205,82,138,167,2,0,80,82,
        131,195,4,246,135,255,255,128,120,65,185,2,0,252,139,243,191,163,4,243,165,91,86,83,246,6,85,4,255,117,15,190,86,4,131,239,
        4,185,2,0,243,165,50,192,116,3,232,75,240,95,190,163,4,185,2,0,252,243,165,94,139,20,139,140,2,0,131,198,4,86,232,73,240,
        235,39,131,195,4,139,15,67,67,94,139,20,246,6,85,4,255,117,6,139,22,86,4,235,4,3,209,112,53,137,20,82,139,23,67,67,88,83,
        232,165,241,91,89,42,197,232,31,241,116,11,137,22,46,0,139,209,135,211,233,124,154,139,227,137,30,69,3,139,30,59,3,128,63,
        44,117,9,232,85,246,232,66,255,233,147,147,233,168,154,81,83,86,87,82,178,57,187,158,4,191,165,4,190,166,4,235,25,83,185,
        4,0,248,209,23,67,67,226,250,91,246,7,64,117,41,254,12,116,42,254,202,116,38,246,5,255,120,33,117,224,128,44,8,118,26,128,
        234,8,118,21,190,164,4,185,7,0,253,243,164,128,38,158,4,32,235,190,128,15,32,235,210,90,95,94,91,89,118,3,233,116,4,233,192,
        6,138,62,166,4,185,4,0,10,219,120,33,117,17,128,239,8,114,23,138,222,138,242,138,212,50,228,226,235,116,11,248,208,212,209,
        210,208,211,254,207,117,222,233,161,6,136,62,166,4,233,131,4,204,32,235,244,136,62,166,4,233,120,4,83,232,2,0,91,195,232,
        45,0,187,10,4,235,12,83,232,2,0,91,195,232,31,0,187,99,4,128,62,168,4,1,120,7,117,18,198,6,168,4,2,232,129,175,176,13,232,
        137,175,176,10,232,132,175,195,252,10,255,190,3,98,116,10,246,6,167,4,128,121,3,190,11,98,232,123,6,114,8,191,159,4,185,4,
        0,235,9,131,198,4,191,163,4,185,2,0,46,165,226,252,195,232,13,9,83,232,129,7,232,182,247,91,232,5,0,90,91,233,173,247,46,
        138,7,152,232,246,8,80,67,46,139,7,163,163,4,131,195,2,46,139,7,163,165,4,131,195,2,88,90,89,72,116,28,81,82,80,83,135,217,
        232,131,247,91,83,46,139,23,46,139,159,2,0,232,234,241,91,131,195,4,235,222,195,83,208,232,115,3,233,9,1,187,178,96,232,214,
        6,232,47,7,114,9,91,232,35,251,75,198,7,37,195,232,243,5,181,16,115,2,181,7,232,189,5,116,3,232,4,250,91,120,63,138,208,2,
        197,42,6,130,4,121,5,246,216,232,194,250,50,201,232,177,0,255,54,129,4,82,232,218,248,90,143,6,129,4,255,54,129,4,50,192,
        10,194,116,6,232,179,250,232,57,248,143,6,129,4,255,54,129,4,160,129,4,233,114,2,138,208,160,129,4,10,192,116,2,254,200,138,
        240,2,194,138,200,120,4,50,192,138,200,121,17,80,81,82,83,232,169,5,91,90,89,88,254,192,120,241,138,225,138,194,42,193,2,
        197,121,23,160,130,4,232,90,250,198,7,46,137,30,82,3,67,50,201,138,198,42,197,233,161,9,160,130,4,82,255,54,129,4,42,197,
        42,194,2,193,120,3,232,54,250,232,39,0,255,54,129,4,232,81,248,160,130,4,143,6,129,4,10,192,88,90,117,7,139,30,82,3,233,103,
        1,2,194,254,200,120,3,232,15,250,233,91,1,138,197,2,194,42,193,254,192,138,232,44,3,127,252,4,3,138,200,160,131,4,36,64,117,
        2,138,200,195,232,254,4,180,7,114,2,180,16,232,200,4,91,249,116,9,83,80,232,11,249,90,91,138,230,156,80,139,22,129,4,10,246,
        156,10,210,116,2,254,202,2,242,157,116,9,246,6,131,4,4,117,2,254,206,42,244,138,230,80,120,3,233,78,0,83,80,80,232,225,4,
        88,254,196,117,247,232,191,4,232,142,7,88,80,185,3,0,210,228,232,166,4,114,16,138,196,152,187,178,96,3,216,232,107,5,232,
        85,6,235,14,187,110,96,138,196,152,3,216,232,83,5,232,248,5,88,91,120,17,88,89,254,193,81,80,83,80,232,157,4,88,91,235,2,
        50,228,246,220,160,130,4,2,224,254,196,10,192,116,9,246,6,131,4,4,117,2,254,204,138,236,50,201,88,255,54,129,4,80,136,46,
        130,4,232,94,247,88,10,228,126,5,138,196,232,63,249,88,163,129,4,10,192,117,12,75,138,7,60,46,116,1,67,137,30,82,3,88,157,
        114,21,2,196,138,38,130,4,42,196,10,228,116,9,246,6,131,4,4,117,2,254,192,10,192,232,74,246,139,217,233,71,0,138,224,246,
        196,64,180,3,117,2,50,228,163,131,4,137,14,129,4,138,224,187,180,4,198,7,32,246,196,8,116,3,198,7,43,83,232,182,3,91,121,
        8,198,7,45,83,232,226,5,91,67,198,7,48,232,209,3,161,131,4,139,14,129,4,120,3,233,179,253,233,104,0,83,232,59,248,91,116,
        3,136,47,67,198,7,0,187,179,4,67,139,62,82,3,139,22,129,4,160,130,4,50,228,43,251,43,248,116,67,138,7,60,32,116,230,60,42,
        116,226,180,1,75,83,80,232,234,234,50,228,60,45,116,246,60,43,116,242,60,36,116,238,60,48,117,22,67,232,212,234,115,16,75,
        235,3,75,136,7,88,10,228,116,248,131,196,2,235,179,88,10,228,116,251,91,198,7,37,195,161,131,4,138,204,181,6,208,232,139,
        22,129,4,115,11,83,82,232,69,243,50,192,90,233,63,254,138,198,44,5,120,3,232,38,248,82,232,218,245,88,80,10,192,117,1,75,
        254,200,120,6,232,20,248,198,7,0,143,6,129,4,233,89,255,232,235,2,116,109,121,12,161,163,4,163,11,0,160,165,4,162,13,0,161,
        11,0,46,247,38,107,98,139,248,138,202,46,160,109,98,246,38,11,0,2,200,46,160,13,0,46,246,38,107,98,2,200,50,192,46,139,22,
        110,98,3,215,46,138,30,112,98,18,217,162,167,4,176,128,162,166,4,137,22,11,0,136,30,13,0,176,4,162,251,2,233,187,251,0,0,
        0,187,179,4,185,32,0,3,7,67,67,226,250,36,254,163,11,0,235,161,139,22,11,0,138,30,13,0,51,192,176,128,162,166,4,136,38,167,
        4,233,143,251,83,81,187,158,4,129,7,128,0,185,3,0,115,14,67,67,255,7,117,8,226,248,254,6,166,4,209,31,89,116,32,246,6,158,
        4,255,117,5,128,38,159,4,254,187,165,4,138,7,138,167,2,0,36,127,128,228,128,10,224,136,39,91,195,144,144,144,233,136,251,
        128,228,224,128,196,128,115,28,156,66,117,18,157,254,195,117,19,249,208,219,254,6,166,4,117,10,144,233,106,251,157,117,3,
        128,226,254,86,190,163,4,137,20,70,70,138,62,167,4,129,227,127,128,10,223,136,28,94,195,139,241,232,180,4,139,206,81,232,
        9,2,114,9,128,62,166,4,184,121,15,235,7,128,62,166,4,152,121,6,232,0,2,232,207,4,187,134,4,232,81,4,89,81,191,142,4,187,134,
        4,232,53,4,187,134,4,232,93,4,232,253,1,232,178,4,187,134,4,232,52,4,232,251,1,187,148,4,232,197,1,115,3,131,235,4,232,87,
        4,89,117,4,254,193,235,204,139,233,232,117,4,139,205,195,128,38,165,4,127,232,134,0,232,165,0,198,6,178,4,127,232,163,236,
        232,132,0,235,27,101,237,161,165,4,128,252,119,115,1,195,10,192,121,9,36,127,162,165,4,184,176,125,80,232,91,0,160,166,4,
        10,192,116,5,128,6,166,4,2,232,97,0,161,177,4,128,252,130,156,246,196,1,117,2,168,64,156,232,73,0,157,116,9,187,50,96,232,
        55,2,232,72,236,128,46,166,4,2,115,3,232,0,1,232,3,241,160,166,4,60,116,115,11,186,219,15,187,73,131,232,142,242,235,6,187,
        52,98,232,198,250,157,117,5,128,54,165,4,128,195,187,99,98,232,0,2,232,8,241,232,199,241,232,6,0,232,8,236,233,25,3,232,173,
        3,232,164,247,232,0,2,232,195,3,195,187,50,96,233,222,1,184,240,195,255,54,165,4,255,54,163,4,232,86,255,90,91,255,54,163,
        4,255,54,165,4,232,249,1,232,44,255,91,90,233,17,238,161,165,4,10,192,121,9,191,176,125,87,36,127,162,165,4,128,252,129,114,
        12,191,57,123,87,51,210,187,0,129,232,240,237,186,162,48,187,9,127,232,225,1,120,58,191,66,123,87,255,54,163,4,255,54,165,
        4,186,215,179,187,93,129,232,101,236,91,90,255,54,163,4,255,54,165,4,232,163,1,187,73,98,232,49,250,91,90,255,54,163,4,255,
        54,165,4,232,144,1,91,90,232,171,237,187,82,98,233,6,250,186,219,15,187,73,129,233,37,236,186,146,10,187,6,128,233,40,236,
        232,87,176,60,13,117,3,232,35,177,46,138,7,67,10,192,117,238,195,191,159,4,185,4,0,184,0,0,252,243,171,195,184,0,0,163,163,
        4,163,165,4,195,232,120,231,121,14,161,163,4,11,192,116,32,176,1,121,28,246,216,195,205,212,160,166,4,10,192,116,16,160,165,
        4,10,192,116,7,176,1,121,5,246,216,195,12,1,195,160,251,2,60,8,254,200,254,200,254,200,195,232,241,255,114,12,83,187,106,
        97,232,206,0,232,237,234,91,195,51,210,187,0,128,232,172,235,195,232,215,255,187,42,96,114,17,235,8,232,205,255,187,58,96,
        114,7,232,171,0,232,117,240,195,255,54,165,4,255,54,163,4,198,6,251,2,8,232,156,0,232,112,239,90,91,232,6,241,195,185,4,0,
        209,23,67,67,226,250,195,185,4,0,209,31,75,75,226,250,195,128,143,2,0,32,226,1,195,187,176,4,128,249,8,114,38,81,185,7,0,
        187,170,4,138,39,138,135,1,0,136,7,67,226,247,50,192,136,7,89,128,233,8,128,228,32,116,217,8,38,170,4,233,210,255,10,201,
        116,15,81,248,232,183,255,89,246,135,2,0,16,117,185,226,191,195,190,159,4,191,171,4,252,185,4,0,139,5,165,137,132,254,255,
        226,247,195,191,124,4,185,2,0,235,6,191,120,4,185,4,0,252,46,139,7,171,67,67,226,248,139,223,75,75,195,191,171,4,235,234,
        191,159,4,235,229,191,171,4,185,4,0,135,222,252,243,165,135,222,195,81,83,87,187,159,4,191,171,4,185,4,0,232,233,255,95,91,
        89,195,81,83,87,187,171,4,191,159,4,235,235,137,22,163,4,137,30,165,4,195,139,22,163,4,139,30,165,4,195,232,207,254,114,63,
        233,137,0,232,215,237,83,87,138,195,50,6,165,4,120,60,10,219,120,16,161,165,4,43,195,114,63,117,55,161,163,4,43,194,235,16,
        139,195,43,6,165,4,114,46,117,38,139,194,43,6,163,4,114,36,117,28,50,192,235,74,192,235,71,232,163,237,144,144,139,7,50,6,
        165,4,121,19,138,38,165,4,10,228,120,6,176,1,10,192,235,44,176,255,249,235,39,81,185,2,0,135,222,160,165,4,10,192,121,2,135,
        247,253,167,117,6,226,251,176,0,235,13,115,6,176,1,10,192,235,5,176,255,10,192,249,89,95,91,195,187,177,4,232,86,237,144,
        144,138,5,50,7,121,2,235,179,81,185,4,0,235,196,187,255,97,232,242,254,232,151,255,117,11,198,6,251,2,2,199,6,163,4,0,128,
        195,46,43,150,0,0,46,26,158,2,0,195,232,9,254,120,8,160,165,4,10,192,120,14,195,161,163,4,11,192,120,17,195,232,244,253,120,
        8,205,210,128,54,165,4,128,195,161,163,4,61,0,128,117,10,205,211,83,232,219,237,91,233,230,255,247,30,163,4,195,187,121,4,
        232,51,0,191,151,4,185,8,0,184,0,0,252,243,171,162,120,4,162,170,4,195,232,183,253,114,3,233,162,254,139,23,139,159,2,0,195,
        185,4,0,232,165,253,114,3,233,150,254,185,2,0,233,144,254,185,4,0,135,251,187,159,4,232,143,253,114,3,233,128,254,135,223,
        185,2,0,191,163,4,135,251,233,115,254,185,4,0,191,159,4,232,116,253,114,3,233,101,254,185,2,0,191,163,4,233,92,254,232,99,
        253,114,3,233,29,255,233,205,254,232,88,253,185,4,0,115,3,185,2,0,93,191,165,4,255,53,79,79,226,250,85,195,191,171,4,185,
        4,0,235,17,232,57,253,191,159,4,185,4,0,115,6,191,163,4,185,2,0,88,143,5,71,71,226,250,80,195,232,31,253,121,1,195,205,213,
        114,3,233,180,243,233,27,244,0,0,250,186,96,0,142,218,142,194,142,210,50,192,162,100,4,181,145,187,0,0,186,154,6,139,242,
        46,172,136,7,67,66,254,205,117,244,188,14,7,205,18,250,187,64,0,247,227,140,219,43,195,187,0,0,246,196,240,117,6,177,4,211,
        224,139,216,75,137,30,44,0,139,227,233,34,205,176,44,162,246,1,187,183,0,198,7,58,50,192,162,249,2,162,6,0,162,107,4,162,
        101,4,162,40,0,187,14,3,137,30,12,3,187,122,3,137,30,226,3,139,30,44,0,75,137,30,10,3,75,83,187,14,7,176,4,162,223,4,83,137,
        30,224,4,160,223,4,254,192,2,192,138,208,182,0,3,218,90,135,218,139,30,224,4,136,23,67,136,55,67,160,223,4,185,52,0,10,192,
        116,14,135,218,3,217,135,218,137,23,67,67,254,200,117,242,135,218,3,217,67,83,254,200,162,54,5,139,30,224,4,139,23,187,51,
        0,3,218,137,30,228,4,91,67,137,30,48,0,137,30,69,3,90,138,194,36,254,138,208,138,194,42,195,138,216,138,198,26,199,138,248,
        115,3,233,104,173,177,3,211,235,138,199,60,2,114,3,187,0,2,138,194,42,195,138,216,138,198,26,199,138,248,115,3,233,74,173,
        137,30,10,3,135,218,137,30,44,0,137,30,47,3,139,227,137,30,69,3,139,30,48,0,135,218,232,61,173,43,218,75,75,83,91,232,128,
        229,187,220,127,232,127,251,232,152,172,233,143,195,32,66,121,116,101,115,32,102,114,101,101,0,20,232,165,240,51,201,82,255,
        54,129,4,233,104,246,253,255,3,191,201,27,14,182,0,0] 
        
      • ibm-ega-128kb-lock.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" autolock="true" pos="center" padding="8px">
        	<menu>
        		<title>Enhanced Color Display</title>
        		<control type="container" pos="right">
        			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
        			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
        			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
        			<control type="button" binding="fullScreen" padleft="8px">Full Screen</control>
        		</control>
        	</menu>
        </video>
        
      • ibm-ega-640-128kb-lock.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" width="640px" autolock="true" pos="center" padding="8px">
        	<menu>
        		<title>Enhanced Color Display</title>
        		<control type="container" pos="right">
        			<control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
        			<control type="led" label="Num" binding="num-lock" padleft="8px"/>
        			<control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
        			<control type="button" binding="lockPointer" padleft="8px">Lock Pointer</control>
        		</control>
        	</menu>
        </video>
        
      • ibm-ega.json
        {"bytes":[
        85,170,32,235,40,50,52,48,48,54,50,55,55,51,53,54,
        32,40,67,41,67,79,80,89,82,73,71,72,84,32,73,66,
        77,32,49,57,56,52,57,47,49,51,47,56,52,182,3,178,
        218,236,178,186,236,178,192,176,0,238,43,210,142,218,250,199,
        6,64,0,215,12,140,14,66,0,199,6,8,1,101,240,199,
        6,10,1,0,240,199,6,168,4,12,1,140,14,170,4,199,
        6,124,0,96,53,140,14,126,0,199,6,12,1,96,49,140,
        14,14,1,251,198,6,135,4,4,232,31,0,136,30,136,4,
        232,75,0,8,6,136,4,138,30,136,4,232,101,0,233,179,
        1,203,238,80,88,236,36,16,208,232,195,182,3,178,194,176,
        1,238,176,13,232,235,255,208,232,208,232,208,232,138,216,176,
        9,232,222,255,208,232,208,232,10,216,176,5,232,211,255,208,
        232,10,216,176,1,232,202,255,10,216,128,227,15,195,182,3,
        178,186,176,1,238,178,218,238,178,194,236,36,96,208,232,138,
        216,178,186,176,2,238,178,218,238,178,194,236,36,96,208,224,
        10,195,195,42,255,128,227,15,209,227,82,182,3,138,230,90,
        128,228,1,254,196,246,212,46,255,167,40,1,23,7,0,192,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,115,1,126,1,126,1,137,1,
        148,1,168,1,188,1,199,1,199,1,210,1,221,1,241,1,
        4,2,4,2,4,2,4,2,128,38,16,4,207,128,14,16,
        4,16,184,1,0,205,16,195,128,38,16,4,207,128,14,16,
        4,32,184,3,0,205,16,195,128,14,16,4,48,184,7,0,
        205,16,195,32,38,135,4,232,206,255,232,235,255,195,32,38,
        135,4,232,211,255,232,224,255,195,32,38,135,4,232,200,255,
        232,213,255,195,182,3,178,194,176,0,238,246,212,8,38,135,
        4,232,196,255,232,161,255,195,182,3,178,194,176,0,238,246,
        212,8,38,135,4,232,176,255,232,157,255,195,32,38,135,4,
        232,165,255,232,130,255,195,32,38,135,4,232,154,255,232,135,
        255,195,32,38,135,4,232,143,255,232,124,255,195,182,3,178,
        194,176,0,238,246,212,8,38,135,4,232,91,255,232,120,255,
        195,182,3,178,194,176,0,238,246,212,8,38,135,4,232,87,
        255,232,100,255,195,83,187,127,0,139,251,80,232,29,0,139,
        240,88,80,232,32,0,88,80,232,17,0,59,199,88,117,3,
        235,5,144,51,192,91,195,184,1,0,91,195,82,139,208,176,
        14,238,66,236,90,195,80,82,139,208,180,14,176,127,232,212,
        10,90,88,195,232,183,10,246,6,135,4,2,117,18,184,180,
        3,232,177,255,61,1,0,116,3,233,187,0,180,48,235,16,
        184,212,3,232,159,255,61,1,0,116,3,233,169,0,180,32,
        80,187,0,176,186,184,3,185,0,16,176,1,128,252,48,116,
        8,183,184,178,216,181,64,254,200,238,139,46,114,4,129,253,
        52,18,142,195,116,7,142,219,232,68,0,117,46,88,80,184,
        32,112,43,255,185,40,0,243,171,88,80,128,252,48,186,186,
        3,116,2,178,218,180,8,43,201,236,34,196,117,4,226,249,
        235,9,43,201,236,34,196,116,10,226,249,186,2,1,232,247,
        3,235,6,177,3,210,236,117,222,88,235,59,185,0,64,252,
        139,217,184,170,170,186,85,255,43,255,243,170,79,253,139,247,
        139,203,172,50,196,117,30,138,194,170,226,246,34,228,116,19,
        138,224,134,242,34,228,117,4,138,212,235,224,252,71,116,222,
        79,235,217,176,0,252,195,131,236,10,139,236,232,223,9,176,
        48,230,67,176,0,230,64,246,6,135,4,2,116,31,232,55,
        254,199,70,2,94,1,199,70,4,153,141,199,70,6,98,184,
        178,180,180,1,176,39,232,204,9,178,186,235,42,232,248,253,
        232,71,11,115,17,178,212,180,1,176,20,232,183,9,199,70,
        2,94,1,235,6,144,199,70,2,200,0,199,70,4,172,160,
        199,70,6,96,196,178,218,184,0,5,205,16,43,201,236,168,
        8,117,7,226,249,179,0,233,190,0,176,0,230,64,43,219,
        51,201,236,168,8,116,7,226,249,179,1,233,170,0,43,201,
        236,168,1,116,21,168,8,117,35,226,245,179,2,233,152,0,
        179,3,233,147,0,179,4,233,142,0,168,8,117,242,236,168,
        1,225,251,227,240,67,116,4,168,8,116,210,176,0,230,67,
        59,94,2,116,4,179,5,235,111,228,64,138,224,144,228,64,
        134,224,144,144,59,70,4,125,4,179,6,235,91,59,70,6,
        126,4,179,7,235,82,184,219,9,187,15,0,185,80,0,205,
        16,236,82,178,192,180,15,176,63,232,9,9,184,15,0,90,
        80,82,178,192,180,50,232,252,8,90,88,43,201,236,168,48,
        117,9,226,249,179,16,10,220,235,30,144,43,201,236,168,48,
        116,8,226,249,179,32,10,220,235,14,254,196,128,252,48,116,
        37,128,204,15,138,196,235,200,185,6,0,186,3,1,232,119,
        2,131,196,10,176,54,230,67,42,192,230,64,144,144,230,64,
        189,1,0,233,43,252,232,149,8,184,0,5,205,16,176,54,
        230,67,42,192,230,64,144,144,230,64,131,196,10,189,0,0,
        30,232,122,8,246,6,135,4,2,116,18,128,14,16,4,48,
        184,15,0,128,14,135,4,96,184,15,0,235,13,128,38,16,
        4,207,128,14,16,4,32,184,14,0,205,16,131,236,6,139,
        236,184,0,160,142,216,142,192,199,70,2,0,0,199,70,4,
        0,0,182,3,178,196,184,1,2,232,73,8,178,206,184,0,
        4,232,65,8,82,178,218,236,178,192,184,0,50,232,53,8,
        232,172,1,128,252,0,116,3,233,226,0,232,235,0,128,252,
        0,116,3,233,215,0,90,178,196,184,2,2,232,22,8,178,
        206,184,1,4,232,14,8,82,178,218,236,178,192,184,0,50,
        232,2,8,199,70,4,0,0,232,116,1,128,252,0,116,3,
        233,170,0,232,179,0,128,252,0,116,3,233,159,0,90,178,
        196,184,4,2,232,222,7,82,178,206,184,2,4,232,213,7,
        178,218,236,178,192,184,0,50,232,202,7,199,70,4,0,0,
        232,60,1,128,252,0,116,3,235,115,144,232,123,0,128,252,
        0,116,3,235,104,144,90,178,196,184,8,2,232,166,7,178,
        206,184,3,4,232,158,7,82,178,218,236,178,192,184,0,50,
        232,146,7,199,70,4,0,0,232,4,1,128,252,0,117,61,
        232,70,0,128,252,0,117,53,85,189,0,0,94,90,232,93,
        7,54,139,92,2,177,6,211,235,75,177,5,211,227,128,227,
        96,128,38,135,4,159,8,30,135,4,128,14,135,4,4,138,
        30,136,4,232,45,251,131,196,6,31,233,196,250,186,3,1,
        232,245,0,85,189,1,0,235,195,187,0,160,142,219,142,195,
        139,70,4,138,232,42,201,209,225,232,15,0,128,252,0,117,
        9,139,70,4,1,70,2,184,0,0,195,85,252,43,255,43,
        192,232,250,6,139,30,114,4,129,251,52,18,140,194,142,218,
        116,98,129,251,33,67,116,92,136,5,138,5,50,196,117,64,
        254,196,138,196,117,242,139,233,184,85,170,139,216,186,170,85,
        243,171,79,79,253,139,247,139,205,173,51,195,117,34,139,194,
        171,226,246,139,205,252,70,70,139,254,173,51,194,117,17,171,
        226,248,253,78,78,139,205,173,11,192,117,4,226,249,235,17,
        139,200,50,228,10,237,116,2,180,1,10,201,116,3,128,196,
        2,93,252,195,80,82,182,3,178,196,184,15,2,232,149,6,
        90,88,243,171,232,119,6,137,30,114,4,142,218,235,226,140,
        218,43,219,142,194,43,255,184,85,170,139,200,38,137,5,176,
        15,38,139,5,51,193,117,20,185,0,32,243,171,129,194,0,
        4,131,195,16,128,254,176,117,218,235,1,144,128,254,160,116,
        6,1,94,4,184,0,0,195,156,250,30,232,48,6,10,246,
        116,11,179,6,232,73,6,226,254,254,206,117,245,179,1,232,
        62,6,226,254,254,202,117,245,226,254,226,254,31,157,195,179,
        14,239,16,87,17,134,17,157,17,164,18,14,21,176,21,210,
        23,153,24,221,24,117,26,203,27,159,28,1,29,133,29,197,
        29,152,31,191,32,24,33,40,24,8,0,8,11,3,0,3,
        35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
        0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,40,24,8,0,8,11,3,0,3,
        35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
        0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,3,
        35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
        0,225,36,199,40,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,80,24,8,0,16,1,3,0,3,
        35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
        0,225,36,199,40,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,40,24,8,0,64,11,3,0,2,
        35,55,39,45,55,48,20,4,17,0,1,0,0,0,0,0,
        0,225,36,199,20,0,224,240,162,255,0,19,21,23,2,4,
        6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,
        0,0,0,48,15,0,255,40,24,8,0,64,11,3,0,2,
        35,55,39,45,55,48,20,4,17,0,1,0,0,0,0,0,
        0,225,36,199,20,0,224,240,162,255,0,19,21,23,2,4,
        6,7,16,17,18,19,20,21,22,23,1,0,3,0,0,0,
        0,0,0,48,15,0,255,80,24,8,0,64,1,1,0,6,
        35,112,79,89,45,94,6,4,17,0,1,0,0,0,0,0,
        0,224,35,199,40,0,223,239,194,255,0,23,23,23,23,23,
        23,23,23,23,23,23,23,23,23,23,1,0,1,0,0,0,
        0,0,0,0,13,0,255,80,24,14,0,16,0,3,0,3,
        166,96,79,86,58,81,96,112,31,0,13,11,12,0,0,0,
        0,94,46,93,40,13,94,110,163,255,0,8,8,8,8,8,
        8,8,16,24,24,24,24,24,24,24,14,0,15,8,0,0,
        0,0,0,16,10,0,255,40,24,8,0,64,0,0,0,3,
        35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
        0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,40,24,8,0,64,0,0,0,3,
        35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
        0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,40,24,8,0,64,0,0,0,3,
        35,55,39,45,55,49,21,4,17,0,7,6,7,0,0,0,
        0,225,36,199,20,8,224,240,163,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,8,0,15,0,0,0,
        0,0,0,16,14,0,255,80,24,8,0,16,1,4,0,7,
        35,112,79,92,47,95,7,4,17,0,7,6,7,0,0,0,
        0,225,36,199,40,8,224,240,163,255,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,
        0,0,0,0,4,0,255,80,24,14,0,16,0,4,0,7,
        166,96,79,86,58,81,96,112,31,0,13,11,12,0,0,0,
        0,94,46,93,40,13,94,110,163,255,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,14,0,15,8,0,0,
        0,0,0,0,4,0,255,40,24,8,0,32,11,15,0,6,
        35,55,39,45,55,48,20,4,17,0,0,0,0,0,0,0,
        0,225,36,199,20,0,224,240,227,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,
        0,0,0,0,5,15,255,80,24,8,0,64,1,15,0,6,
        35,112,79,89,45,94,6,4,17,0,0,0,0,0,0,0,
        0,224,35,199,40,0,223,239,227,255,0,1,2,3,4,5,
        6,7,16,17,18,19,20,21,22,23,1,0,15,0,0,0,
        0,0,0,0,5,15,255,80,24,14,0,128,5,15,0,0,
        162,96,79,86,26,80,224,112,31,0,0,0,0,0,0,0,
        0,94,46,93,20,13,94,110,139,255,0,8,0,0,24,24,
        0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,
        0,0,0,16,7,15,255,80,24,14,0,128,5,15,0,0,
        167,91,79,83,23,80,186,108,31,0,0,0,0,0,0,0,
        0,94,43,93,20,15,95,10,139,255,0,1,0,0,4,7,
        0,0,0,1,0,0,4,7,0,0,1,0,5,0,0,0,
        0,0,0,16,7,15,255,80,24,14,0,128,1,15,0,6,
        162,96,79,86,58,80,96,112,31,0,0,0,0,0,0,0,
        0,94,46,93,40,13,94,110,227,255,0,8,0,0,24,24,
        0,0,0,8,0,0,0,24,0,0,11,0,5,0,0,0,
        0,0,0,0,5,15,255,80,24,14,0,128,1,15,0,6,
        167,91,79,83,55,82,0,108,31,0,0,0,0,0,0,0,
        0,94,43,93,40,15,95,10,227,255,0,1,2,3,4,5,
        20,7,56,57,58,59,60,61,62,63,1,0,15,0,0,0,
        0,0,0,0,5,15,255,40,24,14,0,8,11,3,0,3,
        167,45,39,43,45,40,109,108,31,0,13,6,7,0,0,0,
        0,94,43,93,20,15,94,10,163,255,0,1,2,3,4,5,
        20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
        0,0,0,16,14,0,255,40,24,14,0,8,11,3,0,3,
        167,45,39,43,45,40,109,108,31,0,13,6,7,0,0,0,
        0,94,43,93,20,15,94,10,163,255,0,1,2,3,4,5,
        20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
        0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,3,
        167,91,79,83,55,81,91,108,31,0,13,6,7,0,0,0,
        0,94,43,93,40,15,94,10,163,255,0,1,2,3,4,5,
        20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
        0,0,0,16,14,0,255,80,24,14,0,16,1,3,0,3,
        167,91,79,83,55,81,91,108,31,0,13,6,7,0,0,0,
        0,94,43,93,40,15,94,10,163,255,0,1,2,3,4,5,
        20,7,56,57,58,59,60,61,62,63,8,0,15,0,0,0,
        0,0,0,16,14,0,255,251,252,85,6,30,82,81,83,86,
        87,80,138,196,50,228,209,224,139,240,61,40,0,114,6,88,
        205,66,233,169,20,232,6,0,88,46,255,164,239,6,80,43,
        192,142,216,88,195,30,232,245,255,139,22,99,4,128,226,240,
        128,202,10,31,195,134,196,238,66,134,196,238,74,195,238,195,
        82,186,67,0,176,182,232,245,255,184,51,5,74,232,238,255,
        138,196,232,233,255,186,97,0,236,138,224,12,3,232,222,255,
        43,201,226,254,254,203,117,250,138,196,232,209,255,90,195,232,
        172,255,196,30,168,4,38,196,31,195,81,82,232,240,255,138,
        38,73,4,246,6,135,4,96,116,24,128,252,15,117,7,129,
        195,64,4,235,51,144,128,252,16,117,7,129,195,128,4,235,
        39,144,128,252,3,119,20,160,136,4,36,15,60,3,116,7,
        60,9,116,3,235,5,144,129,195,192,4,138,14,73,4,42,
        237,227,5,131,195,64,226,251,90,89,195,232,172,255,131,195,
        5,182,3,178,196,184,1,0,250,232,89,255,38,138,7,254,
        196,232,81,255,254,196,67,38,138,7,232,72,255,128,252,5,
        114,242,38,138,7,67,178,194,238,178,196,184,3,0,232,52,
        255,251,139,22,99,4,42,228,38,138,7,232,39,255,67,254,
        196,128,252,25,114,242,38,139,71,241,134,224,163,96,4,139,
        243,232,1,255,236,178,192,42,228,38,138,7,134,224,238,134,
        224,238,67,254,196,128,252,20,114,239,176,0,238,30,6,196,
        62,168,4,38,196,125,4,140,192,11,199,116,9,31,30,185,
        16,0,243,164,70,164,7,31,178,204,176,0,238,178,202,176,
        1,238,178,206,42,228,38,138,7,232,201,254,67,254,196,128,
        252,9,114,242,195,160,135,4,168,128,117,57,186,0,184,160,
        73,4,60,6,118,10,186,0,176,60,7,116,3,186,0,160,
        187,32,7,60,4,114,6,60,7,116,2,43,219,142,194,139,
        14,76,4,227,16,185,0,128,128,254,160,116,2,181,64,139,
        195,43,255,243,171,195,232,30,15,195,80,30,232,95,254,160,
        136,4,31,36,15,60,3,116,7,60,9,116,3,88,248,195,
        88,249,195,250,199,6,12,1,96,49,140,14,14,1,251,128,
        38,135,4,243,80,246,6,135,4,2,116,44,161,16,4,36,
        48,60,48,116,72,198,6,132,4,24,199,6,133,4,8,0,
        88,128,14,135,4,8,60,1,118,9,60,4,115,5,128,14,
        135,4,4,205,66,233,166,18,161,16,4,36,48,60,48,117,
        64,198,6,132,4,24,199,6,133,4,14,0,88,205,66,199,
        6,96,4,12,11,128,14,135,4,8,233,129,18,88,80,182,
        3,36,128,128,38,135,4,127,8,6,135,4,88,36,127,60,
        15,116,2,176,7,162,73,4,178,180,137,22,99,4,235,28,
        144,88,80,182,3,36,128,128,38,135,4,127,8,6,135,4,
        88,36,127,162,73,4,178,212,137,22,99,4,199,6,78,4,
        0,0,198,6,98,4,0,185,8,0,191,80,4,30,7,43,
        192,243,171,232,228,253,38,138,7,42,228,163,74,4,38,138,
        71,1,162,132,4,38,138,71,2,42,228,163,133,4,38,139,
        71,3,163,76,4,43,219,176,1,138,38,73,4,128,252,7,
        116,12,128,252,3,119,53,232,240,254,114,2,176,2,232,253,
        14,232,74,253,138,38,73,4,128,252,7,116,3,235,29,144,
        189,48,48,187,0,14,14,7,38,139,86,0,11,210,116,12,
        185,1,0,69,232,31,15,131,197,14,235,234,232,204,253,232,
        115,254,232,177,254,232,22,253,128,62,73,4,15,114,6,199,
        6,12,1,48,34,128,62,73,4,7,119,9,116,75,128,62,
        73,4,3,118,68,196,30,168,4,131,195,12,38,196,31,140,
        192,11,195,116,50,190,7,0,38,138,0,60,255,116,122,58,
        6,73,4,116,3,70,235,240,250,38,138,7,254,200,162,132,
        4,38,139,71,1,163,133,4,38,139,71,3,163,12,1,38,
        139,71,5,163,14,1,251,235,80,196,30,168,4,131,195,8,
        38,196,31,140,192,11,195,116,64,190,11,0,38,138,0,60,
        255,116,54,58,6,73,4,116,3,70,235,240,38,138,39,38,
        138,71,1,38,139,79,2,38,139,87,4,38,139,111,6,38,
        142,71,8,83,139,216,184,16,17,205,16,91,38,138,71,10,
        60,255,116,5,254,200,162,132,4,232,98,252,128,62,73,4,
        7,119,30,187,200,16,160,73,4,42,228,3,216,46,138,7,
        162,101,4,176,48,128,62,73,4,6,117,2,176,63,162,102,
        4,139,14,96,4,235,40,144,44,40,45,41,42,46,30,41,
        128,253,0,117,4,254,193,235,10,254,193,58,14,133,4,114,
        2,42,201,81,42,205,128,249,16,89,117,2,254,193,195,180,
        10,137,14,96,4,246,6,135,4,8,117,51,138,197,36,96,
        60,32,117,5,185,0,30,235,38,246,6,135,4,1,117,31,
        128,62,73,4,3,119,21,232,128,253,115,16,128,253,4,118,
        3,128,197,5,128,249,4,118,3,128,193,5,232,161,255,232,
        3,0,233,105,16,139,22,99,4,138,197,232,215,251,254,196,
        138,193,232,208,251,195,83,139,216,138,196,246,38,74,4,50,
        255,3,195,209,224,91,195,232,3,0,233,65,16,138,207,50,
        237,209,225,139,241,137,148,80,4,56,62,98,4,117,5,139,
        194,232,1,0,195,232,206,255,139,200,3,14,78,4,209,249,
        180,14,232,176,255,195,138,223,50,255,209,227,139,151,80,4,
        139,14,96,4,95,94,91,88,88,31,7,93,207,160,73,4,
        60,7,119,55,246,6,135,4,2,116,7,60,7,116,44,235,
        5,144,60,6,118,37,205,66,95,94,131,196,6,31,7,93,
        207,6,6,7,7,5,5,4,5,0,0,0,0,0,5,6,
        4,4,4,4,6,6,4,7,4,7,4,139,22,99,4,131,
        194,6,236,168,4,180,0,116,3,233,165,0,168,2,117,3,
        233,168,0,180,16,139,22,99,4,138,196,238,66,80,236,138,
        232,88,74,254,196,138,196,238,66,236,138,229,138,30,73,4,
        42,255,46,138,159,193,17,43,195,139,30,78,4,209,235,43,
        195,121,2,43,192,177,3,128,62,73,4,4,114,77,128,62,
        73,4,7,116,70,128,62,73,4,6,119,40,117,2,209,232,
        178,40,246,242,138,232,2,237,138,220,42,255,128,62,73,4,
        6,117,4,177,4,208,228,211,227,138,212,138,240,208,238,208,
        238,235,44,144,153,247,54,74,4,139,218,211,227,139,200,82,
        153,247,54,133,4,90,138,240,235,21,144,246,54,74,4,138,
        240,138,212,138,220,50,255,211,227,246,38,133,4,139,200,180,
        1,82,139,22,99,4,131,194,7,238,90,95,94,131,196,6,
        31,7,93,207,162,98,4,139,14,76,4,152,80,247,225,163,
        78,4,139,200,138,30,73,4,128,251,7,119,2,209,249,180,
        12,232,113,254,91,209,227,139,135,80,4,232,167,254,233,205,
        14,80,138,230,42,229,254,196,58,224,88,117,2,42,192,195,
        83,30,232,25,250,139,30,74,4,31,81,138,202,42,237,86,
        87,243,164,95,94,3,243,3,251,89,226,238,91,195,83,30,
        232,251,249,139,30,74,4,31,81,138,202,42,237,86,87,243,
        164,95,94,43,243,43,251,89,226,238,91,195,82,182,3,178,
        196,184,15,2,232,238,249,90,43,192,138,202,42,237,87,243,
        170,95,138,198,82,182,3,178,196,180,2,232,215,249,90,176,
        255,138,202,87,243,170,95,195,182,3,178,196,184,15,2,232,
        195,249,195,30,232,167,249,138,247,42,255,80,82,139,195,247,
        38,133,4,139,216,90,88,31,232,177,255,30,232,143,249,3,
        62,74,4,31,75,117,241,232,206,255,195,30,232,127,249,138,
        247,42,255,80,82,139,195,247,38,133,4,139,216,90,88,31,
        232,137,255,30,232,103,249,43,62,74,4,31,75,117,241,232,
        166,255,195,138,216,232,67,3,128,252,4,114,8,128,252,7,
        116,3,233,191,0,83,139,193,232,55,0,116,49,3,240,138,
        230,42,227,232,108,0,3,245,3,253,254,204,117,245,88,176,
        32,232,103,0,3,253,254,203,117,247,232,33,249,128,62,73,
        4,7,116,7,160,101,4,186,216,3,238,233,176,13,138,222,
        235,220,246,6,135,4,4,116,18,82,182,3,178,218,80,236,
        168,8,116,251,176,37,178,216,238,88,90,232,56,253,3,6,
        78,4,139,248,139,240,43,209,254,198,254,194,50,237,139,46,
        74,4,3,237,138,195,246,38,74,4,3,192,6,31,128,251,
        0,195,138,202,86,87,243,165,95,94,195,138,202,87,243,171,
        95,195,253,138,216,232,163,2,83,139,194,232,164,255,116,32,
        43,240,138,230,42,227,232,217,255,43,245,43,253,254,204,117,
        245,88,176,32,232,212,255,43,253,254,203,117,247,233,106,255,
        138,222,235,237,138,216,139,193,232,44,2,139,248,43,209,129,
        194,1,1,208,230,208,230,128,62,73,4,6,115,4,208,226,
        209,231,6,31,42,237,208,227,208,227,116,45,138,195,180,80,
        246,228,139,247,3,240,138,230,42,227,232,32,0,129,238,176,
        31,129,239,176,31,254,204,117,241,138,199,232,40,0,129,239,
        176,31,254,203,117,245,233,213,12,138,222,235,236,138,202,86,
        87,243,164,95,94,129,198,0,32,129,199,0,32,86,87,138,
        202,243,164,95,94,195,138,202,87,243,170,95,129,199,0,32,
        87,138,202,243,170,95,195,80,30,232,2,248,138,38,135,4,
        128,228,96,31,88,116,2,249,195,248,195,233,149,254,232,192,
        253,138,38,73,4,128,252,7,118,241,128,252,13,115,23,233,
        124,12,186,0,160,189,17,5,128,252,15,114,8,232,199,255,
        115,3,189,1,5,195,82,232,232,255,142,194,90,138,216,139,
        193,83,138,62,98,4,232,125,1,91,139,248,43,209,129,194,
        1,1,42,228,138,195,82,247,38,133,4,247,38,74,4,139,
        247,3,240,6,31,90,10,219,116,63,138,206,42,203,42,237,
        30,232,138,247,80,82,139,193,247,38,133,4,139,200,90,88,
        31,82,139,197,182,3,178,206,232,138,247,178,196,184,15,2,
        232,130,247,90,232,73,253,82,77,139,197,182,3,178,206,232,
        115,247,90,232,173,253,233,245,11,138,222,235,246,233,146,254,
        232,30,253,138,38,73,4,128,252,3,118,241,128,252,7,116,
        236,128,252,13,115,12,128,252,6,119,4,180,7,205,66,233,
        204,11,253,138,216,82,232,73,255,142,194,90,139,194,254,196,
        83,138,62,98,4,232,222,0,91,43,6,74,4,139,248,43,
        209,129,194,1,1,42,228,138,195,82,247,38,133,4,247,38,
        74,4,139,247,43,240,6,31,90,10,219,116,64,138,206,42,
        203,42,237,30,232,231,246,80,82,139,193,247,38,133,4,139,
        200,90,88,31,82,139,197,182,3,178,206,232,231,246,178,196,
        184,15,2,232,223,246,90,232,196,252,82,77,139,197,182,3,
        178,206,232,208,246,90,232,50,253,252,233,81,11,138,222,235,
        245,138,207,50,237,139,241,209,230,139,132,80,4,51,219,227,
        6,3,30,76,4,226,250,232,220,250,3,216,195,128,227,3,
        138,195,81,185,3,0,208,224,208,224,10,216,226,248,138,251,
        89,195,82,81,83,43,210,185,1,0,139,216,35,217,11,211,
        209,224,209,225,139,216,35,217,11,211,209,225,115,236,139,194,
        91,89,90,195,161,80,4,83,139,216,138,196,246,38,74,4,
        209,224,209,224,42,255,3,195,91,195,83,138,223,42,255,209,
        227,139,135,80,4,91,83,81,82,42,237,138,207,139,216,138,
        196,246,38,74,4,247,38,133,4,42,255,3,195,139,30,76,
        4,227,4,3,195,226,252,90,89,91,195,190,0,184,139,62,
        16,4,129,231,48,0,131,255,48,117,3,190,0,176,142,198,
        195,232,231,255,232,74,255,139,243,139,22,99,4,131,194,6,
        246,6,135,4,4,6,31,116,11,236,168,1,117,251,250,236,
        168,1,116,251,173,233,118,10,138,36,138,68,1,185,0,192,
        178,0,133,193,248,116,1,249,208,210,209,233,209,233,115,242,
        136,86,0,69,195,232,163,255,232,89,255,139,240,131,236,8,
        139,236,128,62,73,4,6,6,31,114,26,182,4,138,4,136,
        70,0,69,138,132,0,32,136,70,0,69,131,198,80,254,206,
        117,235,235,23,144,209,230,182,4,232,172,255,129,198,0,32,
        232,165,255,129,238,176,31,254,206,117,238,30,232,111,245,196,
        62,12,1,31,131,237,8,139,245,252,176,0,22,31,186,128,
        0,86,87,185,8,0,243,166,95,94,116,29,254,192,131,199,
        8,74,117,237,60,0,116,17,232,67,245,196,62,124,0,140,
        192,11,199,116,4,176,128,235,211,131,196,8,233,207,9,233,
        47,255,138,38,73,4,128,252,7,116,244,128,252,3,118,239,
        128,252,6,119,3,233,93,255,128,252,15,114,82,232,7,253,
        114,77,235,10,128,252,13,115,70,176,0,233,160,9,186,0,
        160,142,194,232,180,254,139,240,139,30,133,4,43,227,139,236,
        83,36,1,138,200,176,5,210,224,180,7,182,3,178,206,232,
        243,244,184,24,5,232,237,244,38,138,4,246,208,136,70,0,
        69,3,54,74,4,75,117,240,91,184,16,5,235,50,144,186,
        0,160,142,194,232,115,254,139,240,139,30,133,4,43,227,139,
        236,182,3,178,206,184,8,5,232,186,244,83,38,138,4,246,
        208,136,70,0,69,3,54,74,4,75,117,240,91,184,0,5,
        232,162,244,196,62,12,1,43,235,139,245,252,176,0,22,31,
        186,0,1,86,87,139,203,243,166,95,94,116,7,254,192,3,
        251,74,117,239,3,227,233,5,9,232,98,244,138,38,73,4,
        128,252,4,114,8,128,252,7,116,3,235,116,144,232,59,254,
        138,227,80,81,232,154,253,139,251,89,91,139,22,99,4,131,
        194,6,246,6,135,4,4,116,11,236,168,1,117,251,250,236,
        168,1,116,251,139,195,171,251,226,232,233,193,8,232,30,244,
        138,38,73,4,128,252,4,114,8,128,252,7,116,3,235,48,
        144,232,247,253,80,81,232,88,253,139,251,89,91,139,22,99,
        4,131,194,6,246,6,135,4,4,116,11,236,168,1,117,251,
        250,236,168,1,116,251,138,195,170,251,71,226,231,233,126,8,
        128,252,7,114,3,233,175,0,232,192,253,180,0,80,232,115,
        253,139,248,88,60,128,115,6,197,54,12,1,235,6,44,128,
        197,54,124,0,209,224,209,224,209,224,3,240,30,232,174,243,
        128,62,73,4,6,31,114,44,87,86,182,4,172,246,195,128,
        117,22,170,172,38,136,133,255,31,131,199,79,254,206,117,236,
        94,95,71,226,227,233,38,8,38,50,5,170,172,38,50,133,
        255,31,235,224,138,211,209,231,232,226,252,87,86,182,4,172,
        232,239,252,35,195,246,194,128,116,7,38,50,37,38,50,69,
        1,38,136,37,38,136,69,1,172,232,214,252,35,195,246,194,
        128,116,10,38,50,165,0,32,38,50,133,1,32,38,136,165,
        0,32,38,136,133,1,32,131,199,80,254,206,117,193,94,95,
        71,71,226,183,233,199,7,128,252,15,114,14,232,24,251,114,
        9,128,227,133,138,227,208,228,10,220,42,228,247,38,133,4,
        80,232,198,252,139,248,139,46,133,4,186,0,160,142,194,197,
        54,12,1,88,3,240,182,3,246,195,128,116,11,178,206,184,
        24,3,232,0,243,235,30,144,87,178,196,184,15,2,232,244,
        242,43,192,81,139,205,30,232,212,242,170,3,62,74,4,79,
        226,248,31,89,95,178,196,180,2,138,195,232,215,242,87,83,
        81,139,221,30,232,183,242,139,14,74,4,31,138,4,38,138,
        37,38,136,5,70,3,249,75,117,242,89,91,43,245,95,71,
        226,166,178,206,184,0,3,232,171,242,178,196,184,15,2,232,
        163,242,233,41,7,128,62,99,4,180,116,9,246,6,135,4,
        2,116,5,205,66,233,22,7,43,192,139,232,196,62,168,4,
        131,199,4,38,196,61,140,192,11,199,116,1,69,232,32,3,
        10,255,117,101,138,251,160,102,4,36,224,128,227,31,10,195,
        162,102,4,138,223,128,231,8,208,231,138,232,128,229,239,10,
        237,128,227,15,138,251,208,227,128,227,16,128,231,7,10,223,
        160,73,4,60,3,118,14,180,0,138,195,232,193,2,11,237,
        116,3,38,136,29,128,62,73,4,3,119,5,232,171,243,114,
        7,180,17,138,195,232,167,2,11,237,116,4,38,136,93,16,
        138,221,128,227,32,177,5,210,235,128,62,73,4,3,118,74,
        160,102,4,36,223,128,227,1,116,2,12,32,162,102,4,36,
        16,12,2,10,216,180,1,138,195,232,115,2,11,237,116,4,
        38,136,93,1,254,195,254,195,180,2,138,195,232,96,2,11,
        237,116,4,38,136,93,2,254,195,254,195,180,3,138,195,232,
        77,2,11,237,116,4,38,136,93,3,232,90,2,233,62,6,
        247,38,74,4,81,209,233,209,233,209,233,3,193,138,223,42,
        255,139,203,139,30,76,4,227,4,3,195,226,252,89,139,216,
        128,225,7,176,128,210,232,195,83,80,176,40,82,128,226,254,
        246,226,90,246,194,1,116,3,5,0,32,139,240,88,139,209,
        187,192,2,185,2,3,128,62,73,4,6,114,6,187,128,1,
        185,3,7,34,234,211,234,3,242,138,247,42,201,208,200,2,
        205,254,207,117,248,138,227,210,236,91,195,128,62,73,4,7,
        119,42,82,186,0,184,142,194,90,80,80,232,170,255,210,232,
        34,196,38,138,12,91,246,195,128,117,13,246,212,34,204,10,
        193,38,136,4,88,233,166,5,50,193,235,245,128,62,73,4,
        15,114,13,232,241,248,114,8,36,133,138,224,208,228,10,196,
        80,139,194,232,74,255,182,3,178,206,180,8,232,246,240,82,
        186,0,160,142,194,90,88,138,232,246,197,128,116,10,180,3,
        176,24,232,224,240,235,18,144,178,196,180,2,176,255,232,212,
        240,38,138,7,42,192,38,136,7,178,196,180,2,138,197,36,
        15,232,193,240,38,138,7,176,255,38,136,7,232,182,240,178,
        206,180,3,42,192,232,173,240,180,8,176,255,232,166,240,233,
        44,5,80,82,186,0,160,142,194,90,88,139,194,232,224,254,
        181,7,42,233,43,210,176,0,195,138,205,180,4,82,182,3,
        178,206,232,128,240,90,38,138,39,210,236,128,228,1,195,128,
        62,73,4,7,119,24,82,186,0,184,142,194,90,232,216,254,
        38,138,4,34,196,210,224,138,206,210,192,233,224,4,128,62,
        73,4,15,114,37,232,47,248,114,32,232,165,255,232,185,255,
        10,212,208,228,10,212,176,2,232,174,255,208,228,208,228,10,
        212,208,228,10,212,138,194,233,180,4,232,133,255,232,153,255,
        138,200,210,228,10,212,254,192,60,3,118,241,138,194,233,157,
        4,80,138,62,98,4,83,138,223,50,255,209,227,139,151,80,
        4,91,60,13,116,92,60,10,116,92,60,8,116,76,60,7,
        116,92,180,10,185,1,0,205,16,254,194,58,22,74,4,117,
        53,42,210,58,54,132,4,117,43,232,33,244,160,73,4,60,
        4,114,6,42,255,60,7,117,6,180,8,205,16,138,252,184,
        1,6,43,201,138,54,132,4,138,22,74,4,254,202,205,16,
        88,233,58,4,254,198,180,2,235,244,10,210,116,248,254,202,
        235,244,42,210,235,240,58,54,132,4,117,232,235,187,179,2,
        232,157,239,235,219,138,38,74,4,138,62,98,4,160,135,4,
        36,128,10,6,73,4,95,94,89,89,90,31,7,93,207,80,
        232,98,239,250,236,168,8,116,251,88,178,192,134,196,238,134,
        196,238,176,32,238,251,195,232,6,0,178,192,176,32,238,195,
        232,66,239,236,195,246,6,135,4,2,117,7,128,62,99,4,
        180,116,51,138,224,10,228,117,48,43,237,196,62,168,4,131,
        199,4,38,196,61,140,192,11,199,116,1,69,232,209,255,138,
        227,138,199,232,169,255,232,190,255,11,237,116,9,138,199,42,
        255,3,251,38,136,5,233,149,3,254,204,117,45,43,237,196,
        62,168,4,131,199,4,38,196,61,140,192,11,199,116,1,69,
        232,157,255,180,17,138,199,232,117,255,232,138,255,11,237,116,
        213,131,199,17,38,136,61,233,100,3,254,204,117,64,30,6,
        196,62,168,4,131,199,4,38,196,61,140,192,11,199,116,9,
        31,30,139,242,185,17,0,243,164,7,31,139,218,232,96,255,
        42,228,38,138,7,232,55,255,254,196,67,128,252,16,114,242,
        254,196,38,138,7,232,39,255,232,60,255,233,32,3,254,204,
        117,41,83,232,212,238,131,195,51,38,138,7,91,10,219,117,
        10,128,38,101,4,223,36,247,235,12,144,254,203,117,7,128,
        14,101,4,32,12,8,180,16,232,244,254,233,240,2,80,85,
        83,81,82,6,232,71,238,160,73,4,80,60,7,116,7,198,
        6,73,4,11,235,5,198,6,73,4,12,232,221,238,232,45,
        238,88,162,73,4,7,90,89,91,93,88,10,192,116,23,14,
        7,43,210,185,0,1,254,200,117,7,183,14,189,48,34,235,
        5,183,8,189,96,49,6,31,82,186,0,160,142,194,90,81,
        177,5,211,226,89,10,219,116,8,129,194,0,64,254,203,117,
        248,138,199,42,228,139,250,139,245,227,13,81,139,200,243,164,
        43,248,131,199,32,89,226,243,195,232,210,237,163,133,4,139,
        22,99,4,128,62,73,4,7,117,5,180,20,232,214,237,254,
        200,180,9,232,207,237,254,200,138,232,138,200,254,193,180,1,
        205,16,138,30,73,4,184,94,1,128,251,3,119,8,232,57,
        239,114,3,184,200,0,153,247,54,133,4,72,162,132,4,254,
        192,42,228,247,38,133,4,72,139,22,99,4,180,18,232,148,
        237,160,132,4,254,192,246,38,74,4,209,224,5,0,1,163,
        76,4,232,1,239,233,6,2,60,16,115,55,60,3,115,23,
        232,11,255,232,5,238,232,237,238,232,82,237,139,14,96,4,
        180,1,205,16,233,231,1,117,23,182,3,178,196,184,1,0,
        232,82,237,180,3,138,195,232,75,237,184,3,0,232,69,237,
        233,203,1,60,32,115,38,44,16,60,2,119,243,80,83,232,
        204,254,232,198,237,91,88,138,224,10,228,138,199,116,9,176,
        8,128,252,1,117,2,176,14,42,228,233,44,255,60,48,115,
        106,44,32,117,17,43,210,142,218,250,137,46,124,0,140,6,
        126,0,251,233,136,1,82,43,210,142,218,90,60,3,119,243,
        254,200,116,20,14,7,254,200,117,8,185,14,0,189,48,34,
        235,6,185,8,0,189,96,49,250,137,46,12,1,140,6,14,
        1,251,232,185,236,137,14,133,4,138,195,187,103,32,10,192,
        117,5,138,194,235,9,144,60,3,118,2,176,2,46,215,254,
        200,162,132,4,233,55,1,0,14,25,43,60,48,116,3,233,
        44,1,139,14,133,4,138,22,132,4,128,255,7,119,240,128,
        255,1,119,24,82,43,210,142,218,90,10,255,117,7,196,46,
        124,0,235,26,144,196,46,12,1,235,19,144,128,239,2,138,
        223,42,255,209,227,129,195,183,32,46,139,47,14,7,95,94,
        91,88,88,31,88,88,207,48,34,96,49,96,53,48,48,128,
        251,16,114,81,116,27,128,251,32,116,3,233,208,0,43,210,
        142,218,250,199,6,20,0,167,33,140,14,22,0,251,233,189,
        0,138,62,135,4,128,231,2,208,239,160,135,4,36,96,177,
        5,210,232,138,216,138,14,136,4,138,233,128,225,15,208,237,
        208,237,208,237,208,237,128,229,15,95,94,90,90,90,31,7,
        93,207,233,137,0,233,134,0,60,4,115,249,227,247,83,138,
        223,42,255,209,227,139,183,80,4,91,86,80,184,0,2,205,
        16,88,81,83,80,134,224,38,138,70,0,69,60,13,116,61,
        60,10,116,57,60,8,116,53,60,7,116,49,185,1,0,128,
        252,2,114,5,38,138,94,0,69,180,9,205,16,254,194,58,
        22,74,4,114,17,58,54,132,4,117,7,184,10,14,205,16,
        254,206,254,198,42,210,184,0,2,205,16,235,14,180,14,205,
        16,138,223,42,255,209,227,139,151,80,4,88,91,89,226,162,
        90,60,1,116,9,60,3,116,5,184,0,2,205,16,95,94,
        91,89,90,31,7,93,207,251,30,80,83,81,82,232,78,235,
        128,62,0,5,1,116,99,198,6,0,5,1,180,15,205,16,
        138,204,138,46,132,4,254,197,232,85,0,81,180,3,205,16,
        89,82,51,210,180,2,205,16,180,8,205,16,10,192,117,2,
        176,32,82,51,210,50,228,205,23,90,246,196,41,117,33,254,
        194,58,202,117,223,50,210,138,226,82,232,35,0,90,254,198,
        58,238,117,208,90,180,2,205,16,198,6,0,5,0,235,10,
        90,180,2,205,16,198,6,0,5,255,90,89,91,88,31,207,
        51,210,50,228,176,13,205,23,50,228,176,10,205,23,195,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        126,129,165,129,129,189,153,129,126,0,0,0,0,0,126,255,
        219,255,255,195,231,255,126,0,0,0,0,0,0,108,254,254,
        254,254,124,56,16,0,0,0,0,0,0,16,56,124,254,124,
        56,16,0,0,0,0,0,0,24,60,60,231,231,231,24,24,
        60,0,0,0,0,0,24,60,126,255,255,126,24,24,60,0,
        0,0,0,0,0,0,0,24,60,60,24,0,0,0,0,0,
        255,255,255,255,255,231,195,195,231,255,255,255,255,255,0,0,
        0,0,60,102,66,66,102,60,0,0,0,0,255,255,255,255,
        195,153,189,189,153,195,255,255,255,255,0,0,30,14,26,50,
        120,204,204,204,120,0,0,0,0,0,60,102,102,102,60,24,
        126,24,24,0,0,0,0,0,63,51,63,48,48,48,112,240,
        224,0,0,0,0,0,127,99,127,99,99,99,103,231,230,192,
        0,0,0,0,24,24,219,60,231,60,219,24,24,0,0,0,
        0,0,128,192,224,248,254,248,224,192,128,0,0,0,0,0,
        2,6,14,62,254,62,14,6,2,0,0,0,0,0,24,60,
        126,24,24,24,126,60,24,0,0,0,0,0,102,102,102,102,
        102,102,0,102,102,0,0,0,0,0,127,219,219,219,123,27,
        27,27,27,0,0,0,0,124,198,96,56,108,198,198,108,56,
        12,198,124,0,0,0,0,0,0,0,0,0,254,254,254,0,
        0,0,0,0,24,60,126,24,24,24,126,60,24,126,0,0,
        0,0,24,60,126,24,24,24,24,24,24,0,0,0,0,0,
        24,24,24,24,24,24,126,60,24,0,0,0,0,0,0,0,
        24,12,254,12,24,0,0,0,0,0,0,0,0,0,48,96,
        254,96,48,0,0,0,0,0,0,0,0,0,0,192,192,192,
        254,0,0,0,0,0,0,0,0,0,40,108,254,108,40,0,
        0,0,0,0,0,0,0,16,56,56,124,124,254,254,0,0,
        0,0,0,0,0,254,254,124,124,56,56,16,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        24,60,60,60,24,24,0,24,24,0,0,0,0,102,102,102,
        36,0,0,0,0,0,0,0,0,0,0,0,108,108,254,108,
        108,108,254,108,108,0,0,0,24,24,124,198,194,192,124,6,
        134,198,124,24,24,0,0,0,0,0,194,198,12,24,48,102,
        198,0,0,0,0,0,56,108,108,56,118,220,204,204,118,0,
        0,0,0,48,48,48,96,0,0,0,0,0,0,0,0,0,
        0,0,12,24,48,48,48,48,48,24,12,0,0,0,0,0,
        48,24,12,12,12,12,12,24,48,0,0,0,0,0,0,0,
        102,60,255,60,102,0,0,0,0,0,0,0,0,0,24,24,
        126,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
        24,24,24,48,0,0,0,0,0,0,0,0,254,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,
        0,0,0,0,2,6,12,24,48,96,192,128,0,0,0,0,
        0,0,124,198,206,222,246,230,198,198,124,0,0,0,0,0,
        24,56,120,24,24,24,24,24,126,0,0,0,0,0,124,198,
        6,12,24,48,96,198,254,0,0,0,0,0,124,198,6,6,
        60,6,6,198,124,0,0,0,0,0,12,28,60,108,204,254,
        12,12,30,0,0,0,0,0,254,192,192,192,252,6,6,198,
        124,0,0,0,0,0,56,96,192,192,252,198,198,198,124,0,
        0,0,0,0,254,198,6,12,24,48,48,48,48,0,0,0,
        0,0,124,198,198,198,124,198,198,198,124,0,0,0,0,0,
        124,198,198,198,126,6,6,12,120,0,0,0,0,0,0,24,
        24,0,0,0,24,24,0,0,0,0,0,0,0,24,24,0,
        0,0,24,24,48,0,0,0,0,0,6,12,24,48,96,48,
        24,12,6,0,0,0,0,0,0,0,0,126,0,0,126,0,
        0,0,0,0,0,0,96,48,24,12,6,12,24,48,96,0,
        0,0,0,0,124,198,198,12,24,24,0,24,24,0,0,0,
        0,0,124,198,198,222,222,222,220,192,124,0,0,0,0,0,
        16,56,108,198,198,254,198,198,198,0,0,0,0,0,252,102,
        102,102,124,102,102,102,252,0,0,0,0,0,60,102,194,192,
        192,192,194,102,60,0,0,0,0,0,248,108,102,102,102,102,
        102,108,248,0,0,0,0,0,254,102,98,104,120,104,98,102,
        254,0,0,0,0,0,254,102,98,104,120,104,96,96,240,0,
        0,0,0,0,60,102,194,192,192,222,198,102,58,0,0,0,
        0,0,198,198,198,198,254,198,198,198,198,0,0,0,0,0,
        60,24,24,24,24,24,24,24,60,0,0,0,0,0,30,12,
        12,12,12,12,204,204,120,0,0,0,0,0,230,102,108,108,
        120,108,108,102,230,0,0,0,0,0,240,96,96,96,96,96,
        98,102,254,0,0,0,0,0,198,238,254,254,214,198,198,198,
        198,0,0,0,0,0,198,230,246,254,222,206,198,198,198,0,
        0,0,0,0,56,108,198,198,198,198,198,108,56,0,0,0,
        0,0,252,102,102,102,124,96,96,96,240,0,0,0,0,0,
        124,198,198,198,198,214,222,124,12,14,0,0,0,0,252,102,
        102,102,124,108,102,102,230,0,0,0,0,0,124,198,198,96,
        56,12,198,198,124,0,0,0,0,0,126,126,90,24,24,24,
        24,24,60,0,0,0,0,0,198,198,198,198,198,198,198,198,
        124,0,0,0,0,0,198,198,198,198,198,198,108,56,16,0,
        0,0,0,0,198,198,198,198,214,214,254,124,108,0,0,0,
        0,0,198,198,108,56,56,56,108,198,198,0,0,0,0,0,
        102,102,102,102,60,24,24,24,60,0,0,0,0,0,254,198,
        140,24,48,96,194,198,254,0,0,0,0,0,60,48,48,48,
        48,48,48,48,60,0,0,0,0,0,128,192,224,112,56,28,
        14,6,2,0,0,0,0,0,60,12,12,12,12,12,12,12,
        60,0,0,0,16,56,108,198,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,
        48,48,24,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,120,12,124,204,204,118,0,0,0,0,0,224,96,
        96,120,108,102,102,102,124,0,0,0,0,0,0,0,0,124,
        198,192,192,198,124,0,0,0,0,0,28,12,12,60,108,204,
        204,204,118,0,0,0,0,0,0,0,0,124,198,254,192,198,
        124,0,0,0,0,0,56,108,100,96,240,96,96,96,240,0,
        0,0,0,0,0,0,0,118,204,204,204,124,12,204,120,0,
        0,0,224,96,96,108,118,102,102,102,230,0,0,0,0,0,
        24,24,0,56,24,24,24,24,60,0,0,0,0,0,6,6,
        0,14,6,6,6,6,102,102,60,0,0,0,224,96,96,102,
        108,120,108,102,230,0,0,0,0,0,56,24,24,24,24,24,
        24,24,60,0,0,0,0,0,0,0,0,236,254,214,214,214,
        198,0,0,0,0,0,0,0,0,220,102,102,102,102,102,0,
        0,0,0,0,0,0,0,124,198,198,198,198,124,0,0,0,
        0,0,0,0,0,220,102,102,102,124,96,96,240,0,0,0,
        0,0,0,118,204,204,204,124,12,12,30,0,0,0,0,0,
        0,220,118,102,96,96,240,0,0,0,0,0,0,0,0,124,
        198,112,28,198,124,0,0,0,0,0,16,48,48,252,48,48,
        48,54,28,0,0,0,0,0,0,0,0,204,204,204,204,204,
        118,0,0,0,0,0,0,0,0,102,102,102,102,60,24,0,
        0,0,0,0,0,0,0,198,198,214,214,254,108,0,0,0,
        0,0,0,0,0,198,108,56,56,108,198,0,0,0,0,0,
        0,0,0,198,198,198,198,126,6,12,248,0,0,0,0,0,
        0,254,204,24,48,102,254,0,0,0,0,0,14,24,24,24,
        112,24,24,24,14,0,0,0,0,0,24,24,24,24,0,24,
        24,24,24,0,0,0,0,0,112,24,24,24,14,24,24,24,
        112,0,0,0,0,0,118,220,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,16,56,108,198,198,254,0,0,0,0,
        0,0,60,102,194,192,192,194,102,60,12,6,124,0,0,0,
        204,204,0,204,204,204,204,204,118,0,0,0,0,12,24,48,
        0,124,198,254,192,198,124,0,0,0,0,16,56,108,0,120,
        12,124,204,204,118,0,0,0,0,0,204,204,0,120,12,124,
        204,204,118,0,0,0,0,96,48,24,0,120,12,124,204,204,
        118,0,0,0,0,56,108,56,0,120,12,124,204,204,118,0,
        0,0,0,0,0,0,60,102,96,102,60,12,6,60,0,0,
        0,16,56,108,0,124,198,254,192,198,124,0,0,0,0,0,
        204,204,0,124,198,254,192,198,124,0,0,0,0,96,48,24,
        0,124,198,254,192,198,124,0,0,0,0,0,102,102,0,56,
        24,24,24,24,60,0,0,0,0,24,60,102,0,56,24,24,
        24,24,60,0,0,0,0,96,48,24,0,56,24,24,24,24,
        60,0,0,0,0,198,198,16,56,108,198,198,254,198,198,0,
        0,0,56,108,56,0,56,108,198,198,254,198,198,0,0,0,
        24,48,96,0,254,102,96,124,96,102,254,0,0,0,0,0,
        0,0,204,118,54,126,216,216,110,0,0,0,0,0,62,108,
        204,204,254,204,204,204,206,0,0,0,0,16,56,108,0,124,
        198,198,198,198,124,0,0,0,0,0,198,198,0,124,198,198,
        198,198,124,0,0,0,0,96,48,24,0,124,198,198,198,198,
        124,0,0,0,0,48,120,204,0,204,204,204,204,204,118,0,
        0,0,0,96,48,24,0,204,204,204,204,204,118,0,0,0,
        0,0,198,198,0,198,198,198,198,126,6,12,120,0,0,198,
        198,56,108,198,198,198,198,108,56,0,0,0,0,198,198,0,
        198,198,198,198,198,198,124,0,0,0,0,24,24,60,102,96,
        96,102,60,24,24,0,0,0,0,56,108,100,96,240,96,96,
        96,230,252,0,0,0,0,0,102,102,60,24,126,24,126,24,
        24,0,0,0,0,248,204,204,248,196,204,222,204,204,198,0,
        0,0,0,14,27,24,24,24,126,24,24,24,24,216,112,0,
        0,24,48,96,0,120,12,124,204,204,118,0,0,0,0,12,
        24,48,0,56,24,24,24,24,60,0,0,0,0,24,48,96,
        0,124,198,198,198,198,124,0,0,0,0,24,48,96,0,204,
        204,204,204,204,118,0,0,0,0,0,118,220,0,220,102,102,
        102,102,102,0,0,0,118,220,0,198,230,246,254,222,206,198,
        198,0,0,0,0,60,108,108,62,0,126,0,0,0,0,0,
        0,0,0,56,108,108,56,0,124,0,0,0,0,0,0,0,
        0,0,48,48,0,48,48,96,198,198,124,0,0,0,0,0,
        0,0,0,0,254,192,192,192,0,0,0,0,0,0,0,0,
        0,0,254,6,6,6,0,0,0,0,0,192,192,198,204,216,
        48,96,220,134,12,24,62,0,0,192,192,198,204,216,48,102,
        206,158,62,6,6,0,0,0,24,24,0,24,24,60,60,60,
        24,0,0,0,0,0,0,0,54,108,216,108,54,0,0,0,
        0,0,0,0,0,0,216,108,54,108,216,0,0,0,0,0,
        17,68,17,68,17,68,17,68,17,68,17,68,17,68,85,170,
        85,170,85,170,85,170,85,170,85,170,85,170,221,119,221,119,
        221,119,221,119,221,119,221,119,221,119,24,24,24,24,24,24,
        24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,
        24,24,24,24,24,24,24,24,24,24,24,248,24,248,24,24,
        24,24,24,24,54,54,54,54,54,54,54,246,54,54,54,54,
        54,54,0,0,0,0,0,0,0,254,54,54,54,54,54,54,
        0,0,0,0,0,248,24,248,24,24,24,24,24,24,54,54,
        54,54,54,246,6,246,54,54,54,54,54,54,54,54,54,54,
        54,54,54,54,54,54,54,54,54,54,0,0,0,0,0,254,
        6,246,54,54,54,54,54,54,54,54,54,54,54,246,6,254,
        0,0,0,0,0,0,54,54,54,54,54,54,54,254,0,0,
        0,0,0,0,24,24,24,24,24,248,24,248,0,0,0,0,
        0,0,0,0,0,0,0,0,0,248,24,24,24,24,24,24,
        24,24,24,24,24,24,24,31,0,0,0,0,0,0,24,24,
        24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,0,
        0,0,0,255,24,24,24,24,24,24,24,24,24,24,24,24,
        24,31,24,24,24,24,24,24,0,0,0,0,0,0,0,255,
        0,0,0,0,0,0,24,24,24,24,24,24,24,255,24,24,
        24,24,24,24,24,24,24,24,24,31,24,31,24,24,24,24,
        24,24,54,54,54,54,54,54,54,55,54,54,54,54,54,54,
        54,54,54,54,54,55,48,63,0,0,0,0,0,0,0,0,
        0,0,0,63,48,55,54,54,54,54,54,54,54,54,54,54,
        54,247,0,255,0,0,0,0,0,0,0,0,0,0,0,255,
        0,247,54,54,54,54,54,54,54,54,54,54,54,55,48,55,
        54,54,54,54,54,54,0,0,0,0,0,255,0,255,0,0,
        0,0,0,0,54,54,54,54,54,247,0,247,54,54,54,54,
        54,54,24,24,24,24,24,255,0,255,0,0,0,0,0,0,
        54,54,54,54,54,54,54,255,0,0,0,0,0,0,0,0,
        0,0,0,255,0,255,24,24,24,24,24,24,0,0,0,0,
        0,0,0,255,54,54,54,54,54,54,54,54,54,54,54,54,
        54,63,0,0,0,0,0,0,24,24,24,24,24,31,24,31,
        0,0,0,0,0,0,0,0,0,0,0,31,24,31,24,24,
        24,24,24,24,0,0,0,0,0,0,0,63,54,54,54,54,
        54,54,54,54,54,54,54,54,54,255,54,54,54,54,54,54,
        24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,24,
        24,24,24,24,24,248,0,0,0,0,0,0,0,0,0,0,
        0,0,0,31,24,24,24,24,24,24,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,
        255,255,255,255,255,255,240,240,240,240,240,240,240,240,240,240,
        240,240,240,240,15,15,15,15,15,15,15,15,15,15,15,15,
        15,15,255,255,255,255,255,255,255,0,0,0,0,0,0,0,
        0,0,0,0,0,118,220,216,216,220,118,0,0,0,0,0,
        0,0,124,198,252,198,198,252,192,192,64,0,0,0,254,198,
        198,192,192,192,192,192,192,0,0,0,0,0,0,0,254,108,
        108,108,108,108,108,0,0,0,0,0,254,198,96,48,24,48,
        96,198,254,0,0,0,0,0,0,0,0,126,216,216,216,216,
        112,0,0,0,0,0,0,0,102,102,102,102,124,96,96,192,
        0,0,0,0,0,0,118,220,24,24,24,24,24,0,0,0,
        0,0,126,24,60,102,102,102,60,24,126,0,0,0,0,0,
        56,108,198,198,254,198,198,108,56,0,0,0,0,0,56,108,
        198,198,198,108,108,108,238,0,0,0,0,0,30,48,24,12,
        62,102,102,102,60,0,0,0,0,0,0,0,0,126,219,219,
        126,0,0,0,0,0,0,0,3,6,126,219,219,243,126,96,
        192,0,0,0,0,0,28,48,96,96,124,96,96,48,28,0,
        0,0,0,0,0,124,198,198,198,198,198,198,198,0,0,0,
        0,0,0,254,0,0,254,0,0,254,0,0,0,0,0,0,
        0,24,24,126,24,24,0,0,255,0,0,0,0,0,48,24,
        12,6,12,24,48,0,126,0,0,0,0,0,12,24,48,96,
        48,24,12,0,126,0,0,0,0,0,14,27,27,24,24,24,
        24,24,24,24,24,24,24,24,24,24,24,24,24,24,216,216,
        112,0,0,0,0,0,0,24,24,0,126,0,24,24,0,0,
        0,0,0,0,0,0,118,220,0,118,220,0,0,0,0,0,
        0,56,108,108,56,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,
        0,0,0,24,0,0,0,0,0,0,0,15,12,12,12,12,
        12,236,108,60,28,0,0,0,0,216,108,108,108,108,108,0,
        0,0,0,0,0,0,0,112,216,48,96,200,248,0,0,0,
        0,0,0,0,0,0,0,0,124,124,124,124,124,124,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        29,0,0,0,0,36,102,255,102,36,0,0,0,0,0,34,
        0,99,99,99,34,0,0,0,0,0,0,0,0,0,43,0,
        0,0,24,24,24,255,24,24,24,0,0,0,0,45,0,0,
        0,0,0,0,255,0,0,0,0,0,0,0,77,0,0,195,
        231,255,219,195,195,195,195,195,0,0,0,84,0,0,255,219,
        153,24,24,24,24,24,60,0,0,0,86,0,0,195,195,195,
        195,195,195,102,60,24,0,0,0,87,0,0,195,195,195,195,
        219,219,255,102,102,0,0,0,88,0,0,195,195,102,60,24,
        60,102,195,195,0,0,0,89,0,0,195,195,195,102,60,24,
        24,24,60,0,0,0,90,0,0,255,195,134,12,24,48,97,
        195,255,0,0,0,109,0,0,0,0,0,230,255,219,219,219,
        219,0,0,0,118,0,0,0,0,0,195,195,195,102,60,24,
        0,0,0,119,0,0,0,0,0,195,195,219,219,255,102,0,
        0,0,145,0,0,0,0,110,59,27,126,216,220,119,0,0,
        0,155,0,24,24,126,195,192,192,195,126,24,24,0,0,0,
        157,0,0,195,102,60,24,255,24,255,24,24,0,0,0,158,
        0,252,102,102,124,98,102,111,102,102,243,0,0,0,241,0,
        0,24,24,24,255,24,24,24,0,255,0,0,0,246,0,0,
        24,24,0,0,255,0,0,24,24,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,
        126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,
        16,56,124,254,124,56,16,0,56,124,56,254,254,124,56,124,
        16,16,56,124,254,124,56,124,0,0,24,60,60,24,0,0,
        255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,
        255,195,153,189,189,153,195,255,15,7,15,125,204,204,204,120,
        60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,
        127,99,127,99,99,103,230,192,153,90,60,231,231,60,90,153,
        128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,
        24,60,126,24,24,126,60,24,102,102,102,102,102,0,102,0,
        127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,
        0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,
        24,60,126,24,24,24,24,0,24,24,24,24,126,60,24,0,
        0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,
        0,0,192,192,192,254,0,0,0,36,102,255,102,36,0,0,
        0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,
        0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,
        108,108,108,0,0,0,0,0,108,108,254,108,254,108,108,0,
        48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,
        56,108,56,118,220,204,118,0,96,96,192,0,0,0,0,0,
        24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,
        0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,
        0,0,0,0,0,48,48,96,0,0,0,252,0,0,0,0,
        0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,
        124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,
        120,204,12,56,96,204,252,0,120,204,12,56,12,204,120,0,
        28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,
        56,96,192,248,204,204,120,0,252,204,12,24,48,48,48,0,
        120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,
        0,48,48,0,0,48,48,0,0,48,48,0,0,48,48,96,
        24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,
        96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,
        124,198,222,222,222,192,120,0,48,120,204,204,252,204,204,0,
        252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,
        248,108,102,102,102,108,248,0,254,98,104,120,104,98,254,0,
        254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,
        204,204,204,252,204,204,204,0,120,48,48,48,48,48,120,0,
        30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,
        240,96,96,96,98,102,254,0,198,238,254,254,214,198,198,0,
        198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,
        252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
        252,102,102,124,108,102,230,0,120,204,224,112,28,204,120,0,
        252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,
        204,204,204,204,204,120,48,0,198,198,198,214,254,238,198,0,
        198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,
        254,198,140,24,50,102,254,0,120,96,96,96,96,96,120,0,
        192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,
        16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,255,
        48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,
        224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,
        28,12,12,124,204,204,118,0,0,0,120,204,252,192,120,0,
        56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,
        224,96,108,118,102,102,230,0,48,0,112,48,48,48,120,0,
        12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,
        112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
        0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,
        0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,
        0,0,220,118,102,96,240,0,0,0,124,192,120,12,248,0,
        16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,
        0,0,204,204,204,120,48,0,0,0,198,214,254,254,108,0,
        0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,
        0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,
        24,24,24,0,24,24,24,0,224,48,48,28,48,48,224,0,
        118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,
        120,204,192,204,120,24,12,120,0,204,0,204,204,204,126,0,
        28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,
        204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,0,
        48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,
        126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,
        224,0,120,204,252,192,120,0,204,0,112,48,48,48,120,0,
        124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,
        198,56,108,198,254,198,198,0,48,48,0,120,204,252,204,0,
        28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,
        62,108,204,254,204,204,206,0,120,204,0,120,204,204,120,0,
        0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,
        120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,
        0,204,0,204,204,124,12,248,195,24,60,102,102,60,24,0,
        204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,
        56,108,100,240,96,230,252,0,204,204,120,252,48,252,48,48,
        248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,
        28,0,120,12,124,204,126,0,56,0,112,48,48,48,120,0,
        0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,
        0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,
        60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,
        48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,
        0,0,0,252,12,12,0,0,195,198,204,222,51,102,204,15,
        195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,
        0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,
        34,136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,
        219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,
        24,24,24,24,248,24,24,24,24,24,248,24,248,24,24,24,
        54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,
        0,0,248,24,248,24,24,24,54,54,246,6,246,54,54,54,
        54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,
        54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,
        24,24,248,24,248,0,0,0,0,0,0,0,248,24,24,24,
        24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,
        0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,
        0,0,0,0,255,0,0,0,24,24,24,24,255,24,24,24,
        24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,
        54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,
        54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,
        54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,
        54,54,247,0,247,54,54,54,24,24,255,0,255,0,0,0,
        54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,
        0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,
        24,24,31,24,31,0,0,0,0,0,31,24,31,24,24,24,
        0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,
        24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,
        0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,
        0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,
        15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,
        0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,
        0,252,204,192,192,192,192,0,0,254,108,108,108,108,108,0,
        252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,
        0,102,102,102,102,124,96,192,0,118,220,24,24,24,24,0,
        252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,
        56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,
        0,0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,
        56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,
        0,252,0,252,0,252,0,0,48,48,252,48,48,0,252,0,
        96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,
        14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,112,
        48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,
        56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,
        0,0,0,0,24,0,0,0,15,12,12,12,236,108,60,28,
        120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,
        0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70]
        ,"symbols":{"VIDEO_SETUP":{"o":3},"POR_1":{"o":146},"RD_SWS":{"o":155},"F_BTS":{"o":206},"MK_ENV":{"o":243},"ENV_X":{"o":328,"c":"SET 40x25 COLOR ALPHA"}}}
      • ibm-mda-cga.json
        [0,0,0,0,0,0,0,0,0,0,126,129,165,129,129,189,0,0,126,255,219,255,255,195,0,0,0,54,127,127,127,127,0,0,0,8,28,62,127,62,0,0,
        24,60,60,231,231,231,0,0,24,60,126,255,255,126,0,0,0,0,0,24,60,60,255,255,255,255,255,231,195,195,0,0,0,0,60,102,66,66,255,
        255,255,255,195,153,189,189,0,0,15,7,13,25,60,102,0,0,60,102,102,102,60,24,0,0,63,51,63,48,48,48,0,0,127,99,127,99,99,99,
        0,0,24,24,219,60,231,60,0,0,64,96,112,124,127,124,0,0,1,3,7,31,127,31,0,0,24,60,126,24,24,24,0,0,51,51,51,51,51,51,0,0,127,
        219,219,219,123,27,0,62,99,48,28,54,99,99,0,0,0,0,0,0,0,0,0,0,24,60,126,24,24,24,0,0,24,60,126,24,24,24,0,0,24,24,24,24,24,
        24,0,0,0,0,12,6,127,6,0,0,0,0,24,48,127,48,0,0,0,0,0,96,96,96,0,0,0,0,36,102,255,102,0,0,0,8,28,28,62,62,0,0,0,127,127,62,
        62,28,0,0,0,0,0,0,0,0,0,0,24,60,60,60,24,24,0,99,99,99,34,0,0,0,0,0,54,54,127,54,54,54,12,12,62,99,97,96,62,3,0,0,0,0,97,
        99,6,12,0,0,28,54,54,28,59,110,0,48,48,48,96,0,0,0,0,0,12,24,48,48,48,48,0,0,24,12,6,6,6,6,0,0,0,0,102,60,255,60,0,0,0,24,
        24,24,255,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,1,3,6,12,24,48,0,0,62,99,103,111,123,115,0,0,12,28,60,
        12,12,12,0,0,62,99,3,6,12,24,0,0,62,99,3,3,30,3,0,0,6,14,30,54,102,127,0,0,127,96,96,96,126,3,0,0,28,48,96,96,126,99,0,0,
        127,99,3,6,12,24,0,0,62,99,99,99,62,99,0,0,62,99,99,99,63,3,0,0,0,24,24,0,0,0,0,0,0,24,24,0,0,0,0,0,6,12,24,48,96,48,0,0,
        0,0,0,126,0,0,0,0,96,48,24,12,6,12,0,0,62,99,99,6,12,12,0,0,62,99,99,111,111,111,0,0,8,28,54,99,99,127,0,0,126,51,51,51,62,
        51,0,0,30,51,97,96,96,96,0,0,124,54,51,51,51,51,0,0,127,51,49,52,60,52,0,0,127,51,49,52,60,52,0,0,30,51,97,96,96,111,0,0,
        99,99,99,99,127,99,0,0,60,24,24,24,24,24,0,0,15,6,6,6,6,6,0,0,115,51,54,54,60,54,0,0,120,48,48,48,48,48,0,0,195,231,255,219,
        195,195,0,0,99,115,123,127,111,103,0,0,28,54,99,99,99,99,0,0,126,51,51,51,62,48,0,0,62,99,99,99,99,107,0,0,126,51,51,51,62,
        54,0,0,62,99,99,48,28,6,0,0,255,219,153,24,24,24,0,0,99,99,99,99,99,99,0,0,195,195,195,195,195,195,0,0,195,195,195,195,219,
        219,0,0,195,195,102,60,24,60,0,0,195,195,195,102,60,24,0,0,255,195,134,12,24,48,0,0,60,48,48,48,48,48,0,0,64,96,112,56,28,
        14,0,0,60,12,12,12,12,12,8,28,54,99,0,0,0,0,0,0,0,0,0,0,0,0,24,24,12,0,0,0,0,0,0,0,0,0,0,60,6,62,0,0,112,48,48,60,54,51,0,
        0,0,0,0,62,99,96,0,0,14,6,6,30,54,102,0,0,0,0,0,62,99,127,0,0,28,54,50,48,124,48,0,0,0,0,0,59,102,102,0,0,112,48,48,54,59,
        51,0,0,12,12,0,28,12,12,0,0,6,6,0,14,6,6,0,0,112,48,48,51,54,60,0,0,28,12,12,12,12,12,0,0,0,0,0,230,255,219,0,0,0,0,0,110,
        51,51,0,0,0,0,0,62,99,99,0,0,0,0,0,110,51,51,0,0,0,0,0,59,102,102,0,0,0,0,0,110,59,51,0,0,0,0,0,62,99,56,0,0,8,24,24,126,
        24,24,0,0,0,0,0,102,102,102,0,0,0,0,0,195,195,195,0,0,0,0,0,195,195,219,0,0,0,0,0,99,54,28,0,0,0,0,0,99,99,99,0,0,0,0,0,127,
        102,12,0,0,14,24,24,24,112,24,0,0,24,24,24,24,0,24,0,0,112,24,24,24,14,24,0,0,59,110,0,0,0,0,0,0,0,0,8,28,54,99,0,0,30,51,
        97,96,96,97,0,0,102,102,0,102,102,102,0,6,12,24,0,62,99,127,0,8,28,54,0,60,6,62,0,0,102,102,0,60,6,62,0,48,24,12,0,60,6,62,
        0,28,54,28,0,60,6,62,0,0,0,0,60,102,96,102,0,8,28,54,0,62,99,127,0,0,102,102,0,62,99,127,0,48,24,12,0,62,99,127,0,0,102,102,
        0,56,24,24,0,24,60,102,0,56,24,24,0,96,48,24,0,56,24,24,0,99,99,8,28,54,99,99,28,54,28,0,28,54,99,99,12,24,48,0,127,51,48,
        62,0,0,0,0,110,59,27,126,0,0,31,54,102,102,127,102,0,8,28,54,0,62,99,99,0,0,99,99,0,62,99,99,0,48,24,12,0,62,99,99,0,24,60,
        102,0,102,102,102,0,48,24,12,0,102,102,102,0,0,99,99,0,99,99,99,0,99,99,28,54,99,99,99,0,99,99,0,99,99,99,99,0,24,24,126,
        195,192,192,195,0,28,54,50,48,120,48,48,0,0,195,102,60,24,255,24,0,252,102,102,124,98,102,111,0,14,27,24,24,24,126,24,0,12,
        24,48,0,60,6,62,0,12,24,48,0,56,24,24,0,12,24,48,0,62,99,99,0,12,24,48,0,102,102,102,0,0,59,110,0,110,51,51,59,110,0,99,115,
        123,127,111,0,60,108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,0,24,24,0,24,24,48,0,0,0,0,0,0,127,96,0,0,0,0,0,0,127,3,0,96,
        224,99,102,108,24,48,0,96,224,99,102,108,24,51,0,0,24,24,0,24,24,60,0,0,0,0,27,54,108,54,0,0,0,0,108,54,27,54,17,68,17,68,
        17,68,17,68,85,170,85,170,85,170,85,170,221,119,221,119,221,119,221,119,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,248,
        24,24,24,24,24,248,24,248,54,54,54,54,54,54,54,246,0,0,0,0,0,0,0,254,0,0,0,0,0,248,24,248,54,54,54,54,54,246,6,246,54,54,
        54,54,54,54,54,54,0,0,0,0,0,254,6,246,54,54,54,54,54,246,6,254,54,54,54,54,54,54,54,254,24,24,24,24,24,248,24,248,0,0,0,0,
        0,0,0,248,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,0,0,0,0,0,0,0,255,24,
        24,24,24,24,24,24,255,24,24,24,24,24,31,24,31,54,54,54,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,54,54,
        54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,0,0,0,0,0,255,0,255,54,54,54,54,54,247,0,247,24,24,24,24,24,255,
        0,255,54,54,54,54,54,54,54,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,54,54,54,54,54,54,54,63,24,24,24,24,24,31,24,31,0,0,
        0,0,0,31,24,31,0,0,0,0,0,0,0,63,54,54,54,54,54,54,54,255,24,24,24,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,0,0,0,0,
        31,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,
        255,255,255,255,0,0,0,0,0,0,59,110,108,0,0,0,0,62,99,126,99,0,0,127,99,99,96,96,96,0,0,0,0,127,54,54,54,0,0,127,99,48,24,
        12,24,0,0,0,0,0,63,108,108,0,0,0,0,51,51,51,51,0,0,0,0,59,110,12,12,0,0,126,24,60,102,102,102,0,0,28,54,99,99,127,99,0,0,
        28,54,99,99,99,54,0,0,30,48,24,12,62,102,0,0,0,0,0,126,219,219,0,0,3,6,126,219,219,243,0,0,28,48,96,96,124,96,0,0,0,62,99,
        99,99,99,0,0,0,127,0,0,127,0,0,0,24,24,24,255,24,24,0,0,48,24,12,6,12,24,0,0,12,24,48,96,48,24,0,0,14,27,27,24,24,24,24,24,
        24,24,24,24,24,24,0,0,24,24,0,0,255,0,0,0,0,0,59,110,0,59,0,56,108,108,56,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,15,12,
        12,12,12,12,236,0,216,108,108,108,108,108,0,0,112,216,48,96,200,248,0,0,0,0,0,62,62,62,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        153,129,126,0,0,0,0,0,231,255,126,0,0,0,0,0,62,28,8,0,0,0,0,0,28,8,0,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,0,
        0,0,0,0,0,0,231,255,255,255,255,255,0,0,102,60,0,0,0,0,0,0,153,195,255,255,255,255,0,0,102,102,60,0,0,0,0,0,126,24,24,0,0,
        0,0,0,112,240,224,0,0,0,0,0,103,231,230,192,0,0,0,0,219,24,24,0,0,0,0,0,112,96,64,0,0,0,0,0,7,3,1,0,0,0,0,0,126,60,24,0,0,
        0,0,0,0,51,51,0,0,0,0,0,27,27,27,0,0,0,0,0,54,28,6,99,62,0,0,0,127,127,127,0,0,0,0,0,126,60,24,126,0,0,0,0,24,24,24,0,0,0,
        0,0,126,60,24,0,0,0,0,0,12,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,127,127,0,0,0,0,0,0,28,8,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,127,54,54,0,0,0,0,0,67,99,62,12,12,0,0,0,24,51,99,0,0,0,0,0,102,
        102,59,0,0,0,0,0,0,0,0,0,0,0,0,0,48,24,12,0,0,0,0,0,6,12,24,0,0,0,0,0,102,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,24,24,24,48,0,0,
        0,0,0,0,0,0,0,0,0,0,0,24,24,0,0,0,0,0,96,64,0,0,0,0,0,0,99,99,62,0,0,0,0,0,12,12,63,0,0,0,0,0,48,99,127,0,0,0,0,0,3,99,62,
        0,0,0,0,0,6,6,15,0,0,0,0,0,3,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,24,24,24,0,0,0,0,0,99,99,62,0,0,0,0,0,3,6,60,0,0,0,0,0,24,
        24,0,0,0,0,0,0,24,24,48,0,0,0,0,0,24,12,6,0,0,0,0,0,126,0,0,0,0,0,0,0,24,48,96,0,0,0,0,0,0,12,12,0,0,0,0,0,110,96,62,0,0,
        0,0,0,99,99,99,0,0,0,0,0,51,51,126,0,0,0,0,0,97,51,30,0,0,0,0,0,51,54,124,0,0,0,0,0,49,51,127,0,0,0,0,0,48,48,120,0,0,0,0,
        0,99,51,29,0,0,0,0,0,99,99,99,0,0,0,0,0,24,24,60,0,0,0,0,0,102,102,60,0,0,0,0,0,54,51,115,0,0,0,0,0,49,51,127,0,0,0,0,0,195,
        195,195,0,0,0,0,0,99,99,99,0,0,0,0,0,99,54,28,0,0,0,0,0,48,48,120,0,0,0,0,0,111,62,6,7,0,0,0,0,51,51,115,0,0,0,0,0,99,99,
        62,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,60,24,0,0,0,0,0,255,102,102,0,0,0,0,0,102,195,195,0,0,0,0,0,24,24,
        60,0,0,0,0,0,97,195,255,0,0,0,0,0,48,48,60,0,0,0,0,0,7,3,1,0,0,0,0,0,12,12,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,
        0,0,0,0,0,0,0,0,102,102,59,0,0,0,0,0,51,51,110,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,48,48,
        120,0,0,0,0,0,102,62,6,102,60,0,0,0,51,51,115,0,0,0,0,0,12,12,30,0,0,0,0,0,6,6,102,102,60,0,0,0,54,51,115,0,0,0,0,0,12,12,
        30,0,0,0,0,0,219,219,219,0,0,0,0,0,51,51,51,0,0,0,0,0,99,99,62,0,0,0,0,0,51,62,48,48,120,0,0,0,102,62,6,6,15,0,0,0,48,48,
        120,0,0,0,0,0,14,99,62,0,0,0,0,0,24,27,14,0,0,0,0,0,102,102,59,0,0,0,0,0,102,60,24,0,0,0,0,0,219,255,102,0,0,0,0,0,28,54,
        99,0,0,0,0,0,99,63,3,6,60,0,0,0,24,51,127,0,0,0,0,0,24,24,14,0,0,0,0,0,24,24,24,0,0,0,0,0,24,24,112,0,0,0,0,0,0,0,0,0,0,0,
        0,0,99,127,0,0,0,0,0,0,51,30,6,3,62,0,0,0,102,102,59,0,0,0,0,0,96,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,
        0,102,102,59,0,0,0,0,0,102,102,59,0,0,0,0,0,60,12,6,60,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,96,99,62,0,0,0,0,0,24,
        24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,24,24,60,0,0,0,0,0,127,99,99,0,0,0,0,0,127,99,99,0,0,0,0,0,48,51,127,0,0,0,0,0,216,220,
        119,0,0,0,0,0,102,102,103,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,59,0,0,0,0,0,102,102,
        59,0,0,0,0,0,99,63,3,6,60,0,0,0,99,54,28,0,0,0,0,0,99,99,62,0,0,0,0,0,126,24,24,0,0,0,0,0,48,115,126,0,0,0,0,0,255,24,24,
        0,0,0,0,0,102,102,243,0,0,0,0,0,24,24,24,216,112,0,0,0,102,102,59,0,0,0,0,0,24,24,60,0,0,0,0,0,99,99,62,0,0,0,0,0,102,102,
        59,0,0,0,0,0,51,51,51,0,0,0,0,0,103,99,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,99,99,62,0,0,0,0,0,96,96,0,0,0,0,0,0,
        3,3,0,0,0,0,0,0,110,195,6,12,31,0,0,0,103,207,31,3,3,0,0,0,60,60,24,0,0,0,0,0,27,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,17,68,17,
        68,17,68,0,0,85,170,85,170,85,170,0,0,221,119,221,119,221,119,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,24,24,24,24,
        24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,54,
        54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,
        0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,54,
        54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,24,24,24,24,24,24,0,0,54,54,54,54,54,54,0,0,54,54,54,54,54,54,0,0,24,24,24,24,24,24,0,0,0,0,0,0,0,0,0,0,24,24,24,24,
        24,24,0,0,255,255,255,255,255,255,0,0,255,255,255,255,255,255,0,0,240,240,240,240,240,240,0,0,15,15,15,15,15,15,0,0,0,0,0,
        0,0,0,0,0,108,110,59,0,0,0,0,0,99,126,96,96,32,0,0,0,96,96,96,0,0,0,0,0,54,54,54,0,0,0,0,0,48,99,127,0,0,0,0,0,108,108,56,
        0,0,0,0,0,62,48,48,96,0,0,0,0,12,12,12,0,0,0,0,0,60,24,126,0,0,0,0,0,99,54,28,0,0,0,0,0,54,54,119,0,0,0,0,0,102,102,60,0,
        0,0,0,0,126,0,0,0,0,0,0,0,126,96,192,0,0,0,0,0,96,48,28,0,0,0,0,0,99,99,99,0,0,0,0,0,0,127,0,0,0,0,0,0,24,0,255,0,0,0,0,0,
        48,0,126,0,0,0,0,0,12,0,126,0,0,0,0,0,24,24,24,24,24,24,0,0,216,216,112,0,0,0,0,0,0,24,24,0,0,0,0,0,110,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,60,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,62,62,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,
        124,254,124,56,16,0,56,124,56,254,254,214,16,56,16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,
        255,0,60,102,66,66,102,60,0,255,195,153,189,189,153,195,255,15,3,5,125,132,132,132,120,60,66,66,66,60,24,126,24,63,33,63,
        32,32,96,224,192,63,33,63,33,35,103,230,192,24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,
        0,24,60,126,24,24,126,60,24,36,36,36,36,36,0,36,0,127,146,146,114,18,18,18,0,62,99,56,68,68,56,204,120,0,0,0,0,126,126,126,
        0,24,60,126,24,126,60,24,255,16,56,124,84,16,16,16,0,16,16,16,84,124,56,16,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,
        0,0,64,64,64,126,0,0,0,36,102,255,102,36,0,0,0,16,56,124,254,254,0,0,0,254,254,124,56,16,0,0,0,0,0,0,0,0,0,0,16,56,56,16,
        16,0,16,0,36,36,36,0,0,0,0,0,36,36,126,36,126,36,36,0,24,62,64,60,2,124,24,0,0,98,100,8,16,38,70,0,48,72,48,86,136,136,118,
        0,16,16,32,0,0,0,0,0,16,32,64,64,64,32,16,0,32,16,8,8,8,16,32,0,0,68,56,254,56,68,0,0,0,16,16,124,16,16,0,0,0,0,0,0,0,16,
        16,32,0,0,0,126,0,0,0,0,0,0,0,0,0,16,16,0,0,2,4,8,16,32,64,0,60,66,70,74,82,98,60,0,16,48,80,16,16,16,124,0,60,66,2,12,48,
        66,126,0,60,66,2,28,2,66,60,0,8,24,40,72,254,8,28,0,126,64,124,2,2,66,60,0,28,32,64,124,66,66,60,0,126,66,4,8,16,16,16,0,
        60,66,66,60,66,66,60,0,60,66,66,62,2,4,56,0,0,16,16,0,0,16,16,0,0,16,16,0,0,16,16,32,8,16,32,64,32,16,8,0,0,0,126,0,0,126,
        0,0,16,8,4,2,4,8,16,0,60,66,2,4,8,0,8,0,60,66,94,82,94,64,60,0,24,36,66,66,126,66,66,0,124,34,34,60,34,34,124,0,28,34,64,
        64,64,34,28,0,120,36,34,34,34,36,120,0,126,34,40,56,40,34,126,0,126,34,40,56,40,32,112,0,28,34,64,64,78,34,30,0,66,66,66,
        126,66,66,66,0,56,16,16,16,16,16,56,0,14,4,4,4,68,68,56,0,98,36,40,48,40,36,99,0,112,32,32,32,32,34,126,0,99,85,73,65,65,
        65,65,0,98,82,74,70,66,66,66,0,24,36,66,66,66,36,24,0,124,34,34,60,32,32,112,0,60,66,66,66,74,60,3,0,124,34,34,60,40,36,114,
        0,60,66,64,60,2,66,60,0,127,73,8,8,8,8,28,0,66,66,66,66,66,66,60,0,65,65,65,65,34,20,8,0,65,65,65,73,73,73,54,0,65,34,20,
        8,20,34,65,0,65,34,20,8,8,8,28,0,127,66,4,8,16,33,127,0,120,64,64,64,64,64,120,0,128,64,32,16,8,4,2,0,120,8,8,8,8,8,120,0,
        16,40,68,130,0,0,0,0,0,0,0,0,0,0,0,255,16,16,8,0,0,0,0,0,0,0,60,2,62,66,63,0,96,32,32,46,49,49,46,0,0,0,60,66,64,66,60,0,
        6,2,2,58,70,70,59,0,0,0,60,66,126,64,60,0,12,18,16,56,16,16,56,0,0,0,61,66,66,62,2,124,96,32,44,50,34,34,98,0,16,0,48,16,
        16,16,56,0,2,0,6,2,2,66,66,60,96,32,36,40,48,40,38,0,48,16,16,16,16,16,56,0,0,0,118,73,73,73,73,0,0,0,92,98,66,66,66,0,0,
        0,60,66,66,66,60,0,0,0,108,50,50,44,32,112,0,0,54,76,76,52,4,14,0,0,108,50,34,32,112,0,0,0,62,64,60,2,124,0,16,16,124,16,
        16,18,12,0,0,0,66,66,66,70,58,0,0,0,65,65,34,20,8,0,0,0,65,73,73,73,54,0,0,0,68,40,16,40,68,0,0,0,66,66,66,62,2,124,0,0,124,
        8,16,32,124,0,12,16,16,96,16,16,12,0,16,16,16,0,16,16,16,0,48,8,8,6,8,8,48,0,50,76,0,0,0,0,0,0,0,8,20,34,65,65,127,0,60,66,
        64,66,60,12,2,60,0,68,0,68,68,68,62,0,12,0,60,66,126,64,60,0,60,66,56,4,60,68,62,0,66,0,56,4,60,68,62,0,48,0,56,4,60,68,62,
        0,16,0,56,4,60,68,62,0,0,0,60,64,64,60,6,28,60,66,60,66,126,64,60,0,66,0,60,66,126,64,60,0,48,0,60,66,126,64,60,0,36,0,24,
        8,8,8,28,0,124,130,48,16,16,16,56,0,48,0,24,8,8,8,28,0,66,24,36,66,126,66,66,0,24,24,0,60,66,126,66,0,12,0,124,32,56,32,124,
        0,0,0,51,12,63,68,59,0,31,36,68,127,68,68,71,0,24,36,0,60,66,66,60,0,0,66,0,60,66,66,60,0,32,16,0,60,66,66,60,0,24,36,0,66,
        66,66,60,0,32,16,0,66,66,66,60,0,0,66,0,66,66,62,2,60,66,24,36,66,66,36,24,0,66,0,66,66,66,66,60,0,8,8,62,64,64,62,8,8,24,
        36,32,112,32,66,124,0,68,40,124,16,124,16,16,0,248,76,120,68,79,68,69,230,28,18,16,124,16,16,144,96,12,0,56,4,60,68,62,0,
        12,0,24,8,8,8,28,0,4,8,0,60,66,66,60,0,0,4,8,66,66,66,60,0,50,76,0,124,66,66,66,0,52,76,0,98,82,74,70,0,60,68,68,62,0,126,
        0,0,56,68,68,56,0,124,0,0,16,0,16,32,64,66,60,0,0,0,0,126,64,64,0,0,0,0,0,126,2,2,0,0,66,196,72,246,41,67,140,31,66,196,74,
        246,42,95,130,2,0,16,0,16,16,16,16,0,0,18,36,72,36,18,0,0,0,72,36,18,36,72,0,0,34,136,34,136,34,136,34,136,85,170,85,170,
        85,170,85,170,219,119,219,238,219,119,219,238,16,16,16,16,16,16,16,16,16,16,16,16,240,16,16,16,16,16,240,16,240,16,16,16,
        20,20,20,20,244,20,20,20,0,0,0,0,252,20,20,20,0,0,240,16,240,16,16,16,20,20,244,4,244,20,20,20,20,20,20,20,20,20,20,20,0,
        0,252,4,244,20,20,20,20,20,244,4,252,0,0,0,20,20,20,20,252,0,0,0,16,16,240,16,240,0,0,0,0,0,0,0,240,16,16,16,16,16,16,16,
        31,0,0,0,16,16,16,16,255,0,0,0,0,0,0,0,255,16,16,16,16,16,16,16,31,16,16,16,0,0,0,0,255,0,0,0,16,16,16,16,255,16,16,16,16,
        16,31,16,31,16,16,16,20,20,20,20,23,20,20,20,20,20,23,16,31,0,0,0,0,0,31,16,23,20,20,20,20,20,247,0,255,0,0,0,0,0,255,0,247,
        20,20,20,20,20,23,16,23,20,20,20,0,0,255,0,255,0,0,0,20,20,247,0,247,20,20,20,16,16,255,0,255,0,0,0,20,20,20,20,255,0,0,0,
        0,0,255,0,255,16,16,16,0,0,0,0,255,20,20,20,20,20,20,20,31,0,0,0,16,16,31,16,31,0,0,0,0,0,31,16,31,16,16,16,0,0,0,0,31,20,
        20,20,20,20,20,20,255,20,20,20,16,16,255,16,255,16,16,16,16,16,16,16,240,0,0,0,0,0,0,0,31,16,16,16,255,255,255,255,255,255,
        255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,15,15,15,255,255,255,255,0,0,0,0,0,0,49,74,
        68,74,49,0,0,60,66,124,66,124,64,64,0,126,66,64,64,64,64,0,0,63,84,20,20,20,20,0,126,66,32,24,32,66,126,0,0,0,62,72,72,72,
        48,0,0,68,68,68,122,64,64,128,0,51,76,8,8,8,8,0,124,16,56,68,68,56,16,124,24,36,66,126,66,36,24,0,24,36,66,66,36,36,102,0,
        28,32,24,60,66,66,60,0,0,98,149,137,149,98,0,0,2,4,60,74,82,60,64,128,12,16,32,60,32,16,12,0,60,66,66,66,66,66,66,0,0,126,
        0,126,0,126,0,0,16,16,124,16,16,0,124,0,16,8,4,8,16,0,126,0,8,16,32,16,8,0,126,0,12,18,18,16,16,16,16,16,16,16,16,16,16,144,
        144,96,24,24,0,126,0,24,24,0,0,50,76,0,50,76,0,0,48,72,72,48,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,8,8,8,8,200,40,
        24,120,68,68,68,68,0,0,0,48,72,16,32,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,129,165,129,189,153,
        129,126,126,255,219,255,195,231,255,126,108,254,254,254,124,56,16,0,16,56,124,254,124,56,16,0,56,124,56,254,254,214,16,56,
        16,16,56,124,254,124,16,56,0,0,24,60,60,24,0,0,255,255,231,195,195,231,255,255,0,60,102,66,66,102,60,0,255,195,153,189,189,
        153,195,255,15,7,15,125,204,204,204,120,60,102,102,102,60,24,126,24,63,51,63,48,48,112,240,224,127,99,127,99,99,103,230,192,
        24,219,60,231,231,60,219,24,128,224,248,254,248,224,128,0,2,14,62,254,62,14,2,0,24,60,126,24,24,126,60,24,102,102,102,102,
        102,0,102,0,127,219,219,123,27,27,27,0,62,99,56,108,108,56,204,120,0,0,0,0,126,126,126,0,24,60,126,24,126,60,24,255,24,60,
        126,24,24,24,24,0,24,24,24,24,126,60,24,0,0,24,12,254,12,24,0,0,0,48,96,254,96,48,0,0,0,0,192,192,192,254,0,0,0,36,102,255,
        102,36,0,0,0,24,60,126,255,255,0,0,0,255,255,126,60,24,0,0,0,0,0,0,0,0,0,0,48,120,120,48,48,0,48,0,108,108,108,0,0,0,0,0,
        108,108,254,108,254,108,108,0,48,124,192,120,12,248,48,0,0,198,204,24,48,102,198,0,56,108,56,118,220,204,118,0,96,96,192,
        0,0,0,0,0,24,48,96,96,96,48,24,0,96,48,24,24,24,48,96,0,0,102,60,255,60,102,0,0,0,48,48,252,48,48,0,0,0,0,0,0,0,48,48,96,
        0,0,0,252,0,0,0,0,0,0,0,0,0,48,48,0,6,12,24,48,96,192,128,0,124,198,206,222,246,230,124,0,48,112,48,48,48,48,252,0,120,204,
        12,56,96,204,252,0,120,204,12,56,12,204,120,0,28,60,108,204,254,12,30,0,252,192,248,12,12,204,120,0,56,96,192,248,204,204,
        120,0,252,204,12,24,48,48,48,0,120,204,204,120,204,204,120,0,120,204,204,124,12,24,112,0,0,48,48,0,0,48,48,0,0,48,48,0,0,
        48,48,96,24,48,96,192,96,48,24,0,0,0,252,0,0,252,0,0,96,48,24,12,24,48,96,0,120,204,12,24,48,0,48,0,124,198,222,222,222,192,
        120,0,48,120,204,204,252,204,204,0,252,102,102,124,102,102,252,0,60,102,192,192,192,102,60,0,248,108,102,102,102,108,248,
        0,254,98,104,120,104,98,254,0,254,98,104,120,104,96,240,0,60,102,192,192,206,102,62,0,204,204,204,252,204,204,204,0,120,48,
        48,48,48,48,120,0,30,12,12,12,204,204,120,0,230,102,108,120,108,102,230,0,240,96,96,96,98,102,254,0,198,238,254,254,214,198,
        198,0,198,230,246,222,206,198,198,0,56,108,198,198,198,108,56,0,252,102,102,124,96,96,240,0,120,204,204,204,220,120,28,0,
        252,102,102,124,108,102,230,0,120,204,96,48,24,204,120,0,252,180,48,48,48,48,120,0,204,204,204,204,204,204,252,0,204,204,
        204,204,204,120,48,0,198,198,198,214,254,238,198,0,198,198,108,56,56,108,198,0,204,204,204,120,48,48,120,0,254,198,140,24,
        50,102,254,0,120,96,96,96,96,96,120,0,192,96,48,24,12,6,2,0,120,24,24,24,24,24,120,0,16,56,108,198,0,0,0,0,0,0,0,0,0,0,0,
        255,48,48,24,0,0,0,0,0,0,0,120,12,124,204,118,0,224,96,96,124,102,102,220,0,0,0,120,204,192,204,120,0,28,12,12,124,204,204,
        118,0,0,0,120,204,252,192,120,0,56,108,96,240,96,96,240,0,0,0,118,204,204,124,12,248,224,96,108,118,102,102,230,0,48,0,112,
        48,48,48,120,0,12,0,12,12,12,204,204,120,224,96,102,108,120,108,230,0,112,48,48,48,48,48,120,0,0,0,204,254,254,214,198,0,
        0,0,248,204,204,204,204,0,0,0,120,204,204,204,120,0,0,0,220,102,102,124,96,240,0,0,118,204,204,124,12,30,0,0,220,118,102,
        96,240,0,0,0,124,192,120,12,248,0,16,48,124,48,48,52,24,0,0,0,204,204,204,204,118,0,0,0,204,204,204,120,48,0,0,0,198,214,
        254,254,108,0,0,0,198,108,56,108,198,0,0,0,204,204,204,124,12,248,0,0,252,152,48,100,252,0,28,48,48,224,48,48,28,0,24,24,
        24,0,24,24,24,0,224,48,48,28,48,48,224,0,118,220,0,0,0,0,0,0,0,16,56,108,198,198,254,0,120,204,192,204,120,24,12,120,0,204,
        0,204,204,204,126,0,28,0,120,204,252,192,120,0,126,195,60,6,62,102,63,0,204,0,120,12,124,204,126,0,224,0,120,12,124,204,126,
        0,48,48,120,12,124,204,126,0,0,0,120,192,192,120,12,56,126,195,60,102,126,96,60,0,204,0,120,204,252,192,120,0,224,0,120,204,
        252,192,120,0,204,0,112,48,48,48,120,0,124,198,56,24,24,24,60,0,224,0,112,48,48,48,120,0,198,56,108,198,254,198,198,0,48,
        48,0,120,204,252,204,0,28,0,252,96,120,96,252,0,0,0,127,12,127,204,127,0,62,108,204,254,204,204,206,0,120,204,0,120,204,204,
        120,0,0,204,0,120,204,204,120,0,0,224,0,120,204,204,120,0,120,204,0,204,204,204,126,0,0,224,0,204,204,204,126,0,0,204,0,204,
        204,124,12,248,195,24,60,102,102,60,24,0,204,0,204,204,204,204,120,0,24,24,126,192,192,126,24,24,56,108,100,240,96,230,252,
        0,204,204,120,252,48,252,48,48,248,204,204,250,198,207,198,199,14,27,24,60,24,24,216,112,28,0,120,12,124,204,126,0,56,0,112,
        48,48,48,120,0,0,28,0,120,204,204,120,0,0,28,0,204,204,204,126,0,0,248,0,248,204,204,204,0,252,0,204,236,252,220,204,0,60,
        108,108,62,0,126,0,0,56,108,108,56,0,124,0,0,48,0,48,96,192,204,120,0,0,0,0,252,192,192,0,0,0,0,0,252,12,12,0,0,195,198,204,
        222,51,102,204,15,195,198,204,219,55,111,207,3,24,24,0,24,24,24,24,0,0,51,102,204,102,51,0,0,0,204,102,51,102,204,0,0,34,
        136,34,136,34,136,34,136,85,170,85,170,85,170,85,170,219,119,219,238,219,119,219,238,24,24,24,24,24,24,24,24,24,24,24,24,
        248,24,24,24,24,24,248,24,248,24,24,24,54,54,54,54,246,54,54,54,0,0,0,0,254,54,54,54,0,0,248,24,248,24,24,24,54,54,246,6,
        246,54,54,54,54,54,54,54,54,54,54,54,0,0,254,6,246,54,54,54,54,54,246,6,254,0,0,0,54,54,54,54,254,0,0,0,24,24,248,24,248,
        0,0,0,0,0,0,0,248,24,24,24,24,24,24,24,31,0,0,0,24,24,24,24,255,0,0,0,0,0,0,0,255,24,24,24,24,24,24,24,31,24,24,24,0,0,0,
        0,255,0,0,0,24,24,24,24,255,24,24,24,24,24,31,24,31,24,24,24,54,54,54,54,55,54,54,54,54,54,55,48,63,0,0,0,0,0,63,48,55,54,
        54,54,54,54,247,0,255,0,0,0,0,0,255,0,247,54,54,54,54,54,55,48,55,54,54,54,0,0,255,0,255,0,0,0,54,54,247,0,247,54,54,54,24,
        24,255,0,255,0,0,0,54,54,54,54,255,0,0,0,0,0,255,0,255,24,24,24,0,0,0,0,255,54,54,54,54,54,54,54,63,0,0,0,24,24,31,24,31,
        0,0,0,0,0,31,24,31,24,24,24,0,0,0,0,63,54,54,54,54,54,54,54,255,54,54,54,24,24,255,24,255,24,24,24,24,24,24,24,248,0,0,0,
        0,0,0,0,31,24,24,24,255,255,255,255,255,255,255,255,0,0,0,0,255,255,255,255,240,240,240,240,240,240,240,240,15,15,15,15,15,
        15,15,15,255,255,255,255,0,0,0,0,0,0,118,220,200,220,118,0,0,120,204,248,204,248,192,192,0,252,204,192,192,192,192,0,0,254,
        108,108,108,108,108,0,252,204,96,48,96,204,252,0,0,0,126,216,216,216,112,0,0,102,102,102,102,124,96,192,0,118,220,24,24,24,
        24,0,252,48,120,204,204,120,48,252,56,108,198,254,198,108,56,0,56,108,198,198,108,108,238,0,28,48,24,124,204,204,120,0,0,
        0,126,219,219,126,0,0,6,12,126,219,219,126,96,192,56,96,192,248,192,96,56,0,120,204,204,204,204,204,204,0,0,252,0,252,0,252,
        0,0,48,48,252,48,48,0,252,0,96,48,24,48,96,0,252,0,24,48,96,48,24,0,252,0,14,27,27,24,24,24,24,24,24,24,24,24,24,216,216,
        112,48,48,0,252,0,48,48,0,0,118,220,0,118,220,0,0,56,108,108,56,0,0,0,0,0,0,0,24,24,0,0,0,0,0,0,0,24,0,0,0,15,12,12,12,236,
        108,60,28,120,108,108,108,108,0,0,0,112,24,48,96,120,0,0,0,0,0,60,60,60,60,0,0,0,0,0,0,0,0,0,0] 
        
      • ibm-xebec-1982.json
        [85,170,16,235,30,53,48,48,48,48,53,57,32,40,67,41,67,79,80,89,82,73,71,72,84,32,32,73,66,77,32,49,57,56,50,43,192,142,216,
        250,161,76,0,163,0,1,161,78,0,163,2,1,199,6,76,0,86,2,140,14,78,0,184,96,7,163,52,0,140,14,54,0,199,6,100,0,134,1,140,14,
        102,0,199,6,4,1,231,3,140,14,6,1,251,184,64,0,142,216,198,6,116,0,0,198,6,117,0,0,198,6,67,0,0,198,6,119,0,0,185,37,0,232,
        242,0,115,5,226,249,233,191,0,185,1,0,186,128,0,184,0,18,205,19,115,3,233,175,0,184,0,20,205,19,115,3,233,165,0,199,6,108,
        0,0,0,161,114,0,61,52,18,117,6,199,6,108,0,154,1,228,33,36,254,230,33,232,180,0,114,7,184,0,16,205,19,115,11,161,108,0,61,
        190,1,114,236,235,117,144,185,1,0,186,128,0,184,0,17,205,19,114,103,184,0,9,205,19,114,96,184,0,200,142,192,43,219,184,0,
        15,205,19,114,82,254,6,117,0,186,19,2,176,0,238,186,33,3,236,36,15,60,15,116,6,199,6,108,0,164,1,186,19,2,176,255,238,185,
        1,0,186,129,0,43,192,205,19,114,64,184,0,17,205,19,115,11,161,108,0,61,190,1,114,235,235,47,144,184,0,9,205,19,114,39,254,
        6,117,0,129,250,129,0,115,29,66,235,212,189,15,0,43,192,139,240,185,6,0,144,183,0,46,138,132,104,1,180,14,205,16,70,226,244,
        249,250,228,33,12,1,230,33,251,232,165,0,203,49,55,48,49,13,10,81,82,248,185,0,1,232,7,6,238,232,3,6,236,36,2,116,3,226,242,
        249,90,89,195,43,192,142,216,250,199,6,4,1,231,3,140,14,6,1,199,6,120,0,1,2,140,14,122,0,251,185,3,0,81,43,210,43,192,205,
        19,114,15,184,1,2,43,210,142,194,187,0,124,185,1,0,205,19,89,115,10,128,252,128,116,10,226,222,235,6,144,234,0,124,0,0,43,
        192,43,210,205,19,185,3,0,81,186,128,0,43,192,205,19,114,18,184,1,2,43,219,142,195,187,0,124,186,128,0,185,1,0,205,19,89,
        114,8,161,254,125,61,85,170,116,203,226,215,205,24,207,2,37,2,8,42,255,80,246,25,4,30,184,64,0,142,216,138,38,119,0,80,198,
        6,119,0,0,232,105,5,42,192,238,198,6,119,0,4,232,94,5,42,192,238,198,6,119,0,8,232,83,5,42,192,238,198,6,119,0,12,232,72,
        5,42,192,238,176,7,230,10,250,228,33,12,32,230,33,251,88,136,38,119,0,31,195,128,250,128,115,5,205,64,202,2,0,251,10,228,
        117,9,205,64,42,228,128,250,129,119,239,128,252,8,117,3,233,26,1,83,81,82,30,6,86,87,232,106,0,80,232,136,255,184,64,0,142,
        216,88,138,38,116,0,128,252,1,245,95,94,7,31,90,89,91,202,2,0,56,3,77,3,86,3,96,3,106,3,114,3,121,3,128,3,48,3,39,4,207,4,
        221,4,242,4,56,3,249,4,7,5,21,5,28,5,35,5,42,5,49,5,198,6,116,0,0,81,138,234,128,202,1,254,202,208,226,136,22,119,0,138,213,
        128,226,1,177,5,210,226,10,214,136,22,67,0,89,195,80,184,64,0,142,216,88,128,252,1,117,3,235,85,144,128,234,128,128,250,8,
        115,47,232,194,255,254,201,198,6,66,0,0,136,14,68,0,136,46,69,0,162,70,0,160,118,0,162,71,0,80,138,196,50,228,209,224,139,
        240,61,42,0,88,115,5,46,255,164,156,2,198,6,116,0,1,176,0,195,232,67,4,238,232,63,4,236,36,2,116,6,198,6,116,0,5,195,233,
        218,0,160,116,0,198,6,116,0,0,195,176,71,198,6,66,0,8,233,229,1,176,75,198,6,66,0,10,233,219,1,198,6,66,0,5,233,196,1,198,
        6,66,0,6,235,12,198,6,66,0,7,235,5,198,6,66,0,4,160,68,0,36,192,162,68,0,233,166,1,30,6,83,43,192,142,216,196,30,4,1,184,
        64,0,142,216,128,234,128,128,250,8,115,47,232,27,255,232,223,3,114,39,3,216,38,139,7,45,2,0,138,232,37,0,3,209,232,209,232,
        12,17,138,200,38,138,119,2,254,206,138,22,117,0,43,192,91,7,31,202,2,0,198,6,116,0,7,180,7,42,192,43,210,43,201,249,235,234,
        50,1,2,50,1,0,0,11,0,12,180,40,0,0,0,0,119,1,8,119,1,0,0,11,5,12,180,40,0,0,0,0,50,1,6,128,0,0,1,11,5,12,180,40,0,0,0,0,50,
        1,4,50,1,0,0,11,5,12,180,40,0,0,0,0,198,6,66,0,12,198,6,67,0,0,232,16,0,114,13,198,6,66,0,12,198,6,67,0,32,232,1,0,195,42,
        192,232,25,1,115,1,195,30,43,192,142,216,196,30,4,1,31,232,52,3,114,87,3,216,191,1,0,232,95,0,114,77,191,0,0,232,87,0,114,
        69,191,2,0,232,79,0,114,61,191,4,0,232,71,0,114,53,191,3,0,232,63,0,114,45,191,6,0,232,55,0,114,37,191,5,0,232,47,0,114,29,
        191,7,0,232,39,0,114,21,191,8,0,38,138,1,162,118,0,43,201,232,211,2,236,168,2,117,9,226,246,198,6,116,0,7,249,195,232,181,
        2,236,36,2,117,241,195,232,197,1,114,7,232,167,2,38,138,1,238,195,232,25,0,114,107,198,6,66,0,229,176,71,235,104,232,11,0,
        114,93,198,6,66,0,230,176,75,235,90,160,70,0,60,128,245,195,198,6,66,0,11,235,61,198,6,66,0,14,198,6,70,0,1,176,71,235,62,
        198,6,66,0,15,198,6,70,0,1,176,75,235,48,198,6,66,0,0,235,26,198,6,66,0,1,235,19,198,6,66,0,224,235,12,198,6,66,0,227,235,
        5,198,6,66,0,228,176,2,232,39,0,114,33,235,22,198,6,116,0,9,195,232,87,1,114,245,176,3,232,19,0,114,13,176,3,230,10,228,33,
        36,223,230,33,232,170,1,232,59,0,195,190,66,0,232,27,2,238,232,28,2,238,43,201,232,12,2,236,36,15,60,13,116,9,226,247,198,
        6,116,0,128,249,195,252,185,6,0,232,232,1,172,238,226,249,232,238,1,236,168,1,116,6,198,6,116,0,32,249,195,160,116,0,10,192,
        117,1,195,184,64,0,142,192,43,192,139,248,198,6,66,0,3,42,192,232,171,255,114,35,185,4,0,232,203,0,114,32,232,173,1,236,38,
        136,69,66,71,232,177,1,226,237,232,184,0,114,13,232,154,1,236,168,2,116,15,198,6,116,0,255,249,195,26,6,39,6,106,6,119,6,
        38,138,30,66,0,138,195,36,15,128,227,48,42,255,177,3,211,235,46,255,167,227,5,0,32,64,32,128,0,32,0,64,16,16,2,0,4,64,0,0,
        17,11,1,2,32,32,16,187,2,6,60,9,115,99,46,215,162,116,0,195,187,11,6,139,200,60,10,115,84,46,215,162,116,0,128,225,8,128,
        249,8,117,42,198,6,66,0,13,42,192,232,27,255,114,30,232,62,0,114,25,232,32,1,236,138,200,232,51,0,114,14,232,21,1,236,168,
        1,116,6,198,6,116,0,32,249,138,193,195,187,21,6,60,2,115,19,46,215,162,116,0,195,187,23,6,60,3,115,6,46,215,162,116,0,195,
        198,6,116,0,187,195,81,43,201,232,238,0,236,168,1,117,8,226,249,198,6,116,0,128,249,89,195,80,160,70,0,60,129,88,114,2,249,
        195,81,250,230,12,80,88,230,11,140,192,177,4,211,192,138,232,36,240,3,195,115,2,254,197,80,230,6,138,196,230,6,138,197,36,
        15,230,130,160,70,0,208,224,254,200,138,224,176,255,80,160,66,0,60,229,116,7,60,230,116,3,88,235,17,88,184,4,2,83,42,255,
        138,30,70,0,82,247,227,90,91,72,80,230,7,138,196,230,7,251,89,88,3,193,89,195,251,83,81,6,86,30,43,192,142,216,196,54,4,1,
        31,42,255,38,138,92,9,138,38,66,0,128,252,4,117,6,38,138,92,10,235,9,128,252,227,117,4,38,138,92,11,43,201,232,68,0,236,36,
        32,60,32,116,10,226,244,75,117,241,198,6,116,0,128,232,35,0,236,36,2,8,6,116,0,232,48,0,50,192,238,94,7,89,91,195,80,176,
        32,230,32,176,7,230,10,228,33,12,32,230,33,88,207,186,32,3,80,42,228,160,119,0,3,208,88,195,232,240,255,66,195,232,248,255,
        66,195,232,248,255,66,195,232,243,255,236,80,232,233,255,236,36,2,88,117,22,138,38,67,0,128,228,32,117,4,208,232,208,232,
        36,3,177,4,210,224,42,228,195,249,195,48,56,47,49,54,47,56,50,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
        255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,201] 
        
      • sample1.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <machine id="sample1" class="pc" width="720px">
        	<computer id="pc" name="IBM PC" resume="1"/>
        	<cpu id="cpu8088" model="8088" autostart="true"/>
        	<ram id="ramLow" addr="0x00000" size="0x10000"/>
        	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="ibm-basic-1.00.json"/>
        	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="1981-04-24.json"/>
        	<keyboard id="keyboard"/>
        	<video id="videoMDA" screenwidth="720" screenheight="350" charset="ibm-mda-cga.json">
        		<menu>
        			<title>Monochrome Display</title>
        		</menu>
        	</video>
        	<chipset id="chipset" model="5150" sw1="01000001" sw2="11110000"/>
        </machine>
        
      • sample2.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <machine id="sample2" class="pc" width="720px">
        	<computer id="pc" name="IBM PC"/>
        	<ram id="ramLow" addr="0x00000" size="0x10000"/>
        	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="ibm-basic-1.00.json"/>
        	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="1981-04-24.json"/>
        	<keyboard id="keyboard"/>
        	<video id="videoMDA" screenwidth="720" screenheight="350" charset="ibm-mda-cga.json">
        		<menu>
        			<title>Monochrome Display</title>
        		</menu>
        	</video>
        	<cpu id="cpu8088" model="8088" autostart="true" pos="left">
        		<control type="button" binding="run">Run</control>
        	</cpu>
        	<fdc id="fdcNEC" automount='{A: {name: "PC-DOS 1.00", path: "PCDOS100.json"}}' pos="left">
        		<control type="container">
        			<control type="list" binding="listDrives"/>
        			<control type="list" binding="listDisks">
        				<disk path="">None</disk>
        				<disk path="PCDOS100.json">PC-DOS 1.00</disk>
        			</control>
        			<control type="button" binding="loadDrive">Load</control>
        		</control>
        	</fdc>
        	<chipset id="chipset" model="5150" sw1="01000001" sw2="11110000"/>
        </machine>
        
      • sample3a.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <machine id="sample3" class="pc" border="0" width="900px">
        	<computer id="pc" name="IBM PC"/>
        	<cpu id="cpu8088" model="8088" autostart="true"/>
        	<debugger id="debugger"/>
        	<ram id="ramLow" addr="0x00000" size="0x10000"/>
        	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="ibm-basic-1.00.json"/>
        	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="1981-04-24.json"/>
        	<keyboard id="keyboard"/>
        	<video id="videoMDA" screenwidth="720" screenheight="350" charset="ibm-mda-cga.json">
        		<menu>
        			<title>Monochrome Display</title>
        		</menu>
        	</video>
        	<panel id="panel" padtop="8px">
        		<name>Control Panel</name>
        		<control type="container" width="500px">
        			<control type="textarea" binding="print" width="480px" height="280px"/>
        			<control type="container">
        				<control type="text" binding="debugInput" width="380px"/>
        				<control type="button" binding="debugEnter">Enter</control>
        				<control type="button" binding="clear">Clear</control>
        			</control>
        		</control>
        		<control type="container" width="320px">
        			<control type="register" label="AX" binding="AX" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="BX" binding="BX" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="CX" binding="CX" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="DX" binding="DX" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="SP" binding="SP" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="BP" binding="BP" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="SI" binding="SI" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="DI" binding="DI" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="DS" binding="DS" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="ES" binding="ES" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="SS" binding="SS" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="CS" binding="CS" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="register" label="IP" binding="IP" width="40px" padright="8px" padbottom="8px">0000</control>
        			<control type="flag" label="V" binding="V" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="D" binding="D" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="I" binding="I" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="T" binding="T" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="S" binding="S" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="Z" binding="Z" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="A" binding="A" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="P" binding="P" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="flag" label="C" binding="C" left="0px" width="8px" padright="4px" padbottom="8px">0</control>
        			<control type="status" binding="speed" left="0px" padbottom="8px">Stopped</control>
        			<control type="button" binding="run">Run</control>
        			<control type="button" binding="step">Step</control>
        			<control type="button" binding="reset">Reset</control>
        			<control type="button" binding="setSpeed">Fast</control>
        		</control>
        	</panel>
        	<fdc id="fdcNEC" automount='{A: {name: "PC-DOS 1.00", path: "PCDOS100.json"}, B: {name: "VisiCalc", path: "visicalc.json"}}' width="320px" pos="left" padtop="16px">
        		<control type="container">
        			<control type="list" binding="listDrives"/>
        			<control type="list" binding="listDisks">
        				<disk path="">None</disk>
        				<disk path="PCDOS100.json">PC-DOS 1.00</disk>
        				<disk path="visicalc.json" href="http://www.bricklin.com/history/vclicense.htm" desc="VisiCalc License">VisiCalc</disk>
        			</control>
        			<control type="button" binding="loadDrive">Load</control>
        			<control type="description" binding="descDisk" padleft="8px"/>
        		</control>
        	</fdc>
        	<chipset id="chipset" model="5150" sw1="01000001" sw2="11110000" pos="left">
        		<control type="container" padtop="16px">
        			<control type="switches" label="SW1" binding="sw1" left="0px"/>
        			<control type="switches" label="SW2" binding="sw2" left="0px"/>
        			<control type="description" binding="swdesc" left="0px" padtop="8px"/>
        		</control>
        	</chipset>
        </machine>
        
      • turbo.xml
        <?xml version="1.0" encoding="UTF-8"?>
        <machine id="sample2" class="pc" width="720px">
        
        	<computer id="pc" name="IBM PC" resume="1"/>
        
        	<cpu id="cpu8088" model="8088" autostart="true"/>
        
        	<ram id="ramLow" addr="0x00000" test="false" size="0xa0000" comment="0xa0000 (640Kb) size overrides SW1|ROM BIOS memory test has been disabled"/>
        
        	<rom id="romEGA" addr="0xc0000" size="0x4000" file="ibm-ega.json" notify="videoEGA"/>
        	<rom id="romHDC" addr="0xc8000" size="0x2000" file="ibm-xebec-1982.json"/>
        	<rom id="romEGA" addr="0xc0000" size="0x4000" file="ibm-ega.json" notify="videoEGA"/>
        	<rom id="romBASIC" addr="0xf6000" size="0x8000" file="ibm-basic-1.10.json"/>
        	<rom id="romBIOS" addr="0xfe000" size="0x2000" file="1982-11-08.json"/>
        
        	<keyboard id="keyboard"/>
        
        	<video id="videoEGA" model="ega" memory="0x20000" screenwidth="640" screenheight="350" autolock="true" pos="center" padding="8px">
            <menu>
              <title>Enhanced Color Display</title>
              <control type="container" pos="right">
                <control type="led" label="Caps" binding="caps-lock" padleft="8px"/>
                <control type="led" label="Num" binding="num-lock" padleft="8px"/>
                <control type="led" label="Scroll" binding="scroll-lock" padleft="8px"/>
                <control type="button" binding="fullScreen" padleft="8px">Full Screen</control>
              </control>
            </menu>
          </video>
        
        	<fdc id="fdcNEC" automount='{A: {name: "MSDOS 3.20", path: "MSDOS320-DISK1.json"}}' pos="right">
        		<control type="container">
        			<control type="list" binding="listDrives"/>
        			<control type="list" binding="listDisks">
        				<disk path="">None</disk>
        				<disk path="MSDOS320-DISK1.json">MSDOS 3.20</disk>
        				<disk path="fd1.json">Turbo 1</disk>
        				<disk path="fd2.json">Turbo 2</disk>
        			</control>
        			<control type="button" binding="loadDrive">Load</control>
        		</control>
        	</fdc>
        
        	<hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",path:"10mb-ega.json",type:3}]'/>
        
        	<chipset id="chipset" model="5160" sw1="01001101"/>
        
        </machine>
        
      • visicalc.json
        [[[{sector:1,data:[1234239211,538987842,3157553,65794,1073758210,130561,65544]},{sector:2,data:[67108862,1610940480,8390400,184590345,3758948544,16781056,318840849,1611989312,25171713,453091353,3759997376,33562369,587341857,1613038144,41953026,721592361,3761046208,50343682,855842865,1614086976,4293932803,4095]},{sector:3,data:[67108862,1610940480,8390400,184590345,3758948544,16781056,318840849,1611989312,25171713,453091353,3759997376,33562369,587341857,1613038144,41953026,721592361,3761046208,50343682,855842865,1614086976,4293932803,4095]},{sector:4,data:[538985302,538976288,5066563,0,0,3087007744,131984,27520,1145128274,538985805,5527636,0,0,1441988608,3686760,97,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229]},{sector:5,data:[229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229]},{sector:6,data:[229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229]},{sector:7,data:[229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229,0,0,0,0,0,0,0,229]},{sector:8,data:[587205097,808464432,2150641712,3633236108,3230584974,1922041484,3161137896,646542236,4259869326,8382567,3892365032,646668259,2296935054,7333888,3899212776,512444074,3822155095,3146734985,3280172380,3540300047,31100139,2313408979,3337130333,2969679171,1113778177,3903741321,108215989,3914781160,2515075066,2220723010,1124075462,2952792006,1510533129,1166558128,2281812128,1149775428,1304623,3909092328,1424498244,1903213312,1903042185,3190337769,3854527757,709150316,725927679,312896,2147566790,3137384643,2847566949,2091008,3127709115,384303175,1834203904,3892621754,512425997,1555723607,432015477,2295564243,4132061959,4151607494,2281746627,2289277958,2289278214,3899950598,48848254,1569843202,109576368,2311287709,2960368670,2735114495,2258617203,3766898912,1969074920,3766900741,1381221278,3898037841,2196266421,3892540509,1583284660,1482381913,3281969286,3909092328,2258567188,3766898912,109576368,2253943710,3905134304,1364394409,1493173992,2839906907,4289652931,1939670666,141869064,2952886248,11004187,1939736202,74760200,3282650506,1939867274,1939932808,863289352,1954940554,109766794,3896013188,11537266,1939867272,401149360,2215021056,3049818737,1904589568,3254700801,109625738,126513540,2315279593,141794310,3909317824,1173749988,57966776,3138749928,662729638,1557391487,99092596,3910905857,2028470325,2316792669,141795846,3893131456,417857873]}]],[[{sector:1,data:[1940044546,3917483904,109641687,3314185119,2155061947,2258599719,3766898912,1483111912,3902726278,109707285,3221779363,1166673524,125097,2753465283,2330197875,2290135272,2322832902,620736965,3766919039,2329970256,141795078,1477080256,3919503494,82378788,3766900736,1963474078,1008447490,1007055425,2969728858,1915763713,2000239622,3909267714,3142647828,11862961,121243057,3768402844,41245177,1166540977,2839906472,192045372,125270588,539754929,2326349192,2856683713,50397891,4276618756,2955507035,2806351872,1939801736,1918851048,1954489353,4283689219,54264752,11534965,3903276424,2646301642,2148499571,2969466089,2651228160,109757299,3221779357,3905094004,2884108298,1939716955,3279949696,3899129832,11534759,2292336008,2289279750,2289279494,3899891206,109731017,3221779356,11540852,1939605128,1935551976,2330495502,3221792581,3314156917,3282519432,2158120320,2158185856,2155060411,3905126415,12281162,1694623746,2310299019,2322835486,3901404741,3894967728,1940784776,2277199676,2298966893,3916671518,1166671913,2025851066,2315940876,16824016,2820573651,2969613683,2820574031,432015475,2854128075,2286923891,2339614214,2322836510,1979661511,2854128398,2919664243,1705175155,2332043753,2339613726,141797902,1405819328,512476042,2313712554,2919664229,3358087539,1940784776,1940659851,3278208232,1399100904,1954940554,427343880,3901364084,3626520752,74901560,1954940554]},{sector:2,data:[3899753915,1944610132,1019710052,3892540674,3898303953,1760126019,2873461348,276348936,1954940554,91799560,1441268596,256356,4167323624,3125119683,276348936,3632926324,2277114039,2312307053,3279137822,1018578314,2332587133,512341085,3150148524,512360447,3150148524,2277141896,8173933,2280884124,2767453434,4203213703,3058040477,1018840458,4261836031,99203661,2289872896,512473669,3347739564,91553596,2887682379,2696659827,2148499571,2155061691,11567119,1904477832,2281746627,2289278982,3279134982,2701560568,2042628211,3049519361,3137384458,126383073,1976434243,2258617337,3766898912,3138041169,3954865121,2333051507,4623082,3247048584,1183378059,4265755392,1508537805,2665514584,1944173507,1942625929,109579440,3905123276,74579975,4177506536,3422980803,1975519347,2289217544,4185153030,3390999491,702835,3405892353,2345895755,24365598,3390998987,109726579,221017036,179427574,2280884124,2767453690,4203213703,1976106653,3422980845,2294873715,4168338438,4285196483,1942750858,930548540,3640003628,3128161723,179925995,4085750784,4093442695,2280884132,3372129786,512486517,179925962,432015360,3390998987,3422980723,2294349427,3279145990,1942750858,141822780,109605552,3287905254,1323877368,4293978623,209305608,132700406,2298458112,3279153414,1356891807,854122630,3766900991,3766919070,3051390544,1919171584,4267977734,2297853381,2322851078,3859187909,2281877619]},{sector:3,data:[3899910662,2253914688,3905134304,2258567201,3766898912,4134791611,41189383,2258622710,3766898912,1509901032,2665514584,2328085898,141813254,4160910784,3926297283,1929460851,4160794628,2315941315,1014228486,4160910180,4184125635,3926297283,1975519347,3859188240,1975519347,32110596,803862784,1963015168,3859188232,602536051,1963080704,3859188254,1929591923,128629522,11980938,109761281,117601253,4177527273,4177527273,1356891807,3303596166,3766900990,1677771678,3451519176,256371,3144931258,179925985,4085750784,4093442695,2280884132,3150159354,65631181,1943517952,4265076819,1944173147,2617248441,4203213703,2275734524,2650441715,85584067,1944454794,58048520,2331930345,141815814,3909318080,109772390,3901387764,1944716938,57796648,2030427113,3906532869,104660408,2666070898,3766918912,3152053840,11891691,3405891722,745794490,2329474566,2617292232,4203213703,2275734524,2650441715,2665514584,11593866,158911998,1183378059,4092150272,3909520127,2328398451,812905222,2160129736,1525163893,2330626816,117571654,1681704960,1680607090,48824753,2332078336,4622570,3455992387,719970165,9299968,904397683,2877693,1183509131,671558144,67598792,3909202276,11599874,1183378059,4265755392,3907089869,2749956224,17492221,3053395689,3120607496,3954930657,109757299,3901387753,1945306762,24438840,2160457411,82315124,4110513152,4026960579,2330495603,141813254]},{sector:4,data:[939947456,233423848,147163648,2315744704,947119622,109757416,2150396916,109766794,2150396906,24438840,1944500931,3044274363,2043543046,3284154371,1183509131,2617719296,1956465482,109757420,3221779434,3237350265,3909317952,149488781,1086387712,1407779700,1944632317,126486709,57982984,1258293481,4067806718,2315545833,1963338949,3901408001,1944716938,109635584,3321263082,3106108800,3221749765,3787115289,2617815411,4203213703,2275734524,2650441715,2298478779,3916687134,3870949411,80054899,3049818630,4085750784,4093508231,2280884132,103587322,797496199,1975582283,109757433,3221779430,109709940,2150921193,1944651400,52291779,1929309160,4225951747,3908859369,3722969871,3892540414,1743387604,50456828,3908571112,109707907,3901387754,1945372298,109635584,2998629321,1944828531,1381172917,2330626897,3221749830,3364495732,3044270522,1364349702,1183509131,149457408,3892540608,1515782235,4265820763,1508275661,1128422234,3396718078,3908832744,3216767845,2316219763,1958742023,583939,1976434251,57403890,1942554250,204269568,1944716936,2977162938,4085750790,2768108167,4203213703,3247086921,3983917064,1942488714,1944651400,12276675,3067447808,1944702976,2329084172,2019830979,2328362500,3504525528,750947030,4261705828,2328922822,1975519425,1540589532,3489662858,74605628,3338560556,2319648648,1022361607,738685540,3909203556,11927554,2319648648,1975519430,149472230]},{sector:5,data:[4145473538,1944454794,58048520,2315445225,141815814,3909318080,1961425743,3926297089,2330495603,678687750,3372648680,1945221747,3111383227,2275147782,4261054451,4085753075,2963143303,3943073792,3037180275,1944173320,126484662,4026589392,124937276,28730412,3053454057,1124567040,3866480126,3681929726,1944585866,611696648,3128158139,129594344,4085750784,4093508231,2280884132,109616634,109736929,3237901257,1942554248,2306077371,2960371486,2969995272,1941551987,1364396213,3128156603,146371514,4085750784,4093442695,2280884132,2159648250,3250213120,2938014579,2969995891,3907553907,192413015,146901593,1374194408,3137369320,146109377,3221749937,41093002,3905971204,4266329992,1508996557,3922773386,512476021,2303423407,3144920862,268334001,126376793,1976434251,1941093265,3111379386,2275147784,4244277235,4085753075,2325609095,745785606,3926296578,4267501683,2331803880,1014228486,739209828,3859187812,2281812083,3899909894,3133406444,3267064811,2969995891,2315302259,432015560,2984807115,2330626816,120193094,125421608,28402692,2969567977,2297072384,1111687238,3782594046,3909520067,2330495603,812905222,3355871464,1941093235,11540149,4265805704,3287905741,504629760,1178350120,2321832528,1014221830,3892670988,3287939576,109757432,205288396,3924297330,1042937,1944454794,1929439464,2294544386,1534322182,109757433,205288396,3387426418,977401,1944454794,1912647400]},{sector:6,data:[109626113,4183520230,3422980803,1913338995,1913404432,4188465155,109605552,904492006,9955328,109710707,2598925296,3271652096,2281708777,2322851334,3899912198,124977289,1944454794,1006635241,2315548017,2289296902,3899912198,4183554323,3422980803,1913338995,1913404432,4183222275,109605552,971600870,3859188224,3532915,109710706,753431536,3271651840,2281708777,2322851334,3899912198,124911643,1944454794,1006635241,2315548017,2289296902,3899912198,4183554239,1920154819,1019475970,2952950640,2328099186,3899909638,109576197,1019442150,2669113968,2253447302,1920154848,3766900745,3916607646,2253914116,2965610208,3138041088,126383073,1976434243,3219702777,4168411640,2331955176,745794054,2044261893,104645377,3135832946,2315302391,1944173512,11586305,4266329992,3925440969,11598628,1944651400,4275955907,3908665320,2145974327,4187220217,3908879336,2330525626,4223789305,3908800488,2699622791,3909520121,2042628211,4185122822,3287913192,4182698067,2969003240,4167886849,134711899,1394309312,1543061992,1392516328,3908799208,1357445487,4182239481,3925573352,3706322910,48782327,1407450880,3120003304,3126525958,2275177441,4244277235,4085753075,2325609095,3926296583,126501747,1944651400,3504915267,806552575,2828894,3303588608,1426661119,16915993,3102262016,1547773183,16977423,2900935424,1612727551,16857351,109757184,3771757546,1952646792,1944454794,225643068,3555199664]},{sector:7,data:[4211206391,4269040571,2281746447,3279153670,3925280488,2984835823,3909520125,2042628211,4153469187,1944454794,58048520,3908535785,1491664824,1296171775,16977942,4207273984,2969070568,4153206785,3908665064,28375165,3908534760,2783508631,4139641083,3908483816,3035167395,322092022,3909022184,1404827240,4276676627,3908798440,109771403,1139307619,4167690487,16713448,0,3909091378,2179529015,4281264383,3908725481,434699564,4200720639,1944651402,1952974472,3908463336,109772358,3221779560,4289726585,3908503016,4025022507,4195281143,3908575976,887684856,3892490490,636024574,4131252475,3909038568,196147148,2683760104,2253447302,4212058336,2665514584,2258567724,3766898912,3908490728,2253977579,20750048,2258571124,3766898912,3908548840,3572102592,4209174783,2968910568,4138788865,3908552424,2850616748,3892424953,3102275234,4207339767,1944716938,2213077200,4153272566,2331485928,1014229510,2316006401,141813254,3909317824,109770330,3921376230,2148005491,3640001140,1356891807,4176011398,3766900981,2298007710,1936976390,3893014536,2162751058,2162738169,3859188476,1728481395,3909519988,1711704179,4114278516,1944454794,1952777864,1944651402,1952712328,1952712330,1551482888,1952908938,209043464,3908414184,28374439,3287682536,3908373480,669578571,4161202429,2431125876,4119718133,3908425193,109770119,103576554,91871478,266928304,3049818624,1944173312,126536449,3637573840]},{sector:8,data:[1952712328,2968834024,3909519360,2419059,1952777866,477478920,1952843402,242794504,1952908938,108314632,3925163752,954791065,4118866421,3908983784,1592326347,1678150398,2290099316,3279153414,2331738088,2289297670,3899942918,3236494540,4253214964,3908881128,2045310068,4187416829,1743258800,4240042229,2331805160,2675172870,2253447302,4108970208,2665514584,443799760,1356891807,1307107462,3766900989,1926811806,4097501187,3925289704,3637510151,770179955,3926297336,2042628211,1946106887,3270915,3908329192,1958477138,4237879315,2331524840,141814278,2316992192,2675173638,2253447302,4102940896,4092068272,3766900980,3909519518,1745259123,2330495604,812902662,3909519592,3790127987,4126009596,3909043689,1072231443,4090161407,3925863400,2028533996,252,3276800,4268157184,2331682792,611576070,1762035840,2281746548,3899910406,190315607,1179059790,2582118400,3895423990,28374051,3908340200,108263052,3925087976,2112418910,4239714547,3908532200,2917725579,1762036479,2285898868,3916720390,4108845059,3926297331,2042628211,1929329668,4086687774,3908864488,3048993679,4224509971,3153282024,3286766558,4167231739,3153553128,133592169,3892933696,837351212,4114475260,1953040010,3901390884,1944651402,109635632,3905123305,233373530,4229097719,3908378345,109771256,2149872617,1953040008,109576368,28341225,3908300264,326366704,1953040010,109592588,3722998889,4160940274,3892315113]}]],[[{sector:1,data:[109769575,3221779434,4282124153,2397635443,4077250815,3908827624,129757951,4215072788,3153245160,870847536,4157794555,3925268200,526516077,138294086,224329473,189137679,1445462017,56433938,840564481,322715409,201261056,1560305182,805241097,1308954881,872415504,221649243,16711944,0,4278190337,0,65792,1111638595,4278194242,555819297,16732961,689594921,4294902114,958356503,16646731,873091925,4294771250,990127652,16515388,270868305,4294593583,1598051327,19147269,222826496,21448024,1029772543,19726368,1109466880,17378653,1193030143,2378524,1079181056,606733663,1661206529,1296849164,929300225,924262402,660013057,237850927,65281,16777216,1493106689,1345082888,1593835850,307516695,939524609,823345951,1375732023,926298687,889192711,1498823200,4278190093,743835738,84560,1310798910,131371,1480008513,88109,235214341,70241,0,65792,4055099647,109605808,3905123302,1957753257,1944454792,4168804547,1944454794,91583292,48854192,2289283072,141813254,3504915392,3859188472,1953709171,4026960388,3766919027,3907028560,2253976011,109616864,3221779430,4172146883,1944454794,74740796,1945110154,1356891807,2833834118,3766900977,3859187870,3284142195,2683571176,2253447302,4052871392,2665514584,4158384323,2328035699,3899909638,309590211,1945110154,1945680616,4161923081,3925856744,1491599385]},{sector:2,data:[3859188472,1945156467,2258569018,3766898912,1492211432,1973346438,4282443782,3892315113,3221815108,4290111683,1088947058,3639133183,4288211191,602408563,256511,150939624,3924345792,3892540159,3905158947,2078865339,3892737791,65666822,4278904832,3905142792,57868265,3288270568,1945587944,109757185,1899787238,3823634037,256510,150923240,921224128,3271652343,1944454794,108360252,3925789160,3454533635,3284142334,74776636,2143380864,2147513064,2155852645,2155855973,2155856229,2323629413,260719407,4130835011,108298437,3913449192,3247046658,2294564232,3321282117,2150986816,4135633229,74719429,2160086400,1947256310,3008200708,147191424,1300236916,3321266373,3271652368,583353738,1166590277,3209021121,3279259648,2305688763,1166720093,3192228036,3766919107,3907028560,2253914433,1166581472,2315302331,376749000,260754177,1127189059,1922436745,3321245578,2147972368,3917460325,1300234244,2680389811,2253447302,1397903840,1922440843,1526731752,141777242,2665514584,387577,2665514584,3825189880,22584,1746339840,403898446,134217728,4278245399,6437,2721280,385613824,134217936,21915671,1124567643,41533448,2800280575,4294044159,3221751690,3905094009,3913547673,806158322,2684326121,2253447302,1098770656,2253973642,199859936,3907553792,3894952303,548464778,24759806,4285262019,2332030441,171752261,3488154485,1964260353,38463747,3275833320,141888828]},{sector:3,data:[2952814824,310307085,1356891807,2800279686,3192228352,108380168,2665514584,3372139513,2344502664,2253962333,126394080,3160246595,1166722040,3192203972,79423626,2026765934,3892808200,1933770773,2316268276,3456024173,2965569913,256032,1405351027,304539729,4139998041,1971372357,1702937345,1173782465,58032325,2332015593,4282172229,2328035701,1569375101,1372711103,2322465979,1160430661,3225810622,3892737152,65622725,1387980800,4139664778,1954594885,1392371718,3892315113,2160284390,2155921485,3279995213,2143315328,3087004905,3766918914,1373668944,870863698,1499093842,2665514584,2667689923,2253447302,1397903840,1532108264,2253936986,1371774688,2108745866,2327201066,1078585544,292997176,46238291,3632971589,2328067466,1376315589,2680379739,2253447302,3026029536,146425226,1962884288,1920810007,3979864067,3048885642,1837611776,1174326017,1305018,146163082,4128011712,1971370309,3766900742,1489238430,2292113542,3026029319,3026028867,4172697086,884491658,2873460991,2875556035,4294949759,1940659849,602409648,3093659901,3110436991,3076882559,2286274175,1837611776,3048496521,3060631677,4290397638,4291684547,2332017129,171752261,2447901556,985893439,141931589,1161480074,3271652789,321619,3286922075,1018578314,2333373565,3221795933,548406388,2303395720,1174320221,4190369974,4240238787,3925791976,770243878,2953540160,4293781519,3909009640,3905158765,24330254,677153731]},{sector:4,data:[2315672713,2258615109,3766898912,1916817896,3893342219,2598960262,304867582,2665514584,4177327848,3766919107,3907028560,2253979329,3739852512,4263555326,3001595461,3058564862,4041786360,4286114047,3966822595,968558194,3904628762,109576368,669545580,3766918912,2967504464,2735114240,1812367987,2042628212,3766900750,3892359326,11598882,1478034665,3281969286,1953113737,266865328,4278839548,2147533800,2138336806,2144494976,1946512872,4127689273,779387072,108392508,3909361384,3913023592,3237355636,2317055040,1021322472,2316793280,3038717125,3150481920,3405860250,2149844874,1300235381,3619389650,774367305,4127440104,1954599493,1022552078,219865984,1006443238,3909032675,456976484,1239944821,63564008,1625883507,4287097342,1929545448,83421193,82314357,1995031296,3766919167,3907028560,91417494,2665514584,2298458307,2339668742,4185156134,3766919107,1021347408,3893261573,4289783812,1953236616,1953113739,3766900931,645972894,3900666990,2109074339,3050401160,1892662143,2966379913,1124567295,4185247230,2305709243,11586909,1421606581,1867692654,2336425864,4622570,1976434242,3026029555,1867652745,2305871803,3278787614,3766918995,2329970256,3221803333,243274357,3900732526,2280193895,3766900797,1108382,1489984907,2292113542,1569276679,3511549647,2337456987,394972509,1261931075,1183509131,3905116672,2867396407,1037690902,3892321512,4108926377,3766918943,2967504464,1829144831]},{sector:5,data:[3766900852,1304734,2670446568,2253447302,2281746656,1484025094,3902726278,317200894,2281746432,3899785734,233373792,256042,3895068649,3941133174,2282795049,3899785734,62598709,4261906546,3041124173,1944173062,1183509131,1975519232,3455992325,3871011445,2330626931,1882980422,28639858,259575294,1183509131,1124567040,3746430538,2315251177,130473309,260066303,1421591424,1125616238,2336438154,4623082,4050968636,2160129619,394925685,2335672899,4623082,141950780,109580464,3277550082,2336039400,512351581,1264284783,1884272971,1843941715,2321242368,931808023,1364410691,1183509131,1019225088,2317186432,4134825222,343179456,3918221657,4127213194,141852864,1323881351,3270912,1125616210,378091402,2337961074,1400139550,2330626907,126353478,58064700,1107301865,512447299,3221779570,3833058073,1864272219,4288080244,3119012697,512475964,2394584175,432015474,3892540115,3905108976,1284193589,677153604,3892365194,3280662666,3498756096,2318554249,3221762628,4282129780,1149901171,1958742067,1933589522,1864272654,1026025588,1953439369,2952793577,1864272833,1124567156,1953439369,3527800515,3894113664,3491969600,512327966,2183039360,1006444031,788340361,1614814719,2447965983,3766919141,2967504464,1946585343,3766900852,3527800478,2670032000,2253447302,2281746656,1484026886,1017045126,3909317923,557580741,3974693749,1965964289,36563203,296812725,21824443,3143259083]},{sector:6,data:[3405860116,1356891807,2253971590,2258607840,3766898912,3388885579,2253916793,4243103456,991750652,3799320378,1953760906,3935037578,805324426,1490254056,1017045126,3893523774,99154189,966191333,4280119101,820580016,1966881792,4176996373,3907317736,1950169472,494485021,3910119679,3247046679,2952794089,911629,149490864,3909857280,3387424771,1930378468,3923774469,2258567183,3766898912,199815088,3766900989,4244957342,2147519721,2340403045,1421528413,432015470,1867692755,126538497,2319419971,4209240280,3050265995,940018431,2282058984,4294306095,3445459907,1413268362,1156056437,1271134716,1125616203,3330946954,91607048,4194054888,1569278915,3478489549,4177504488,976677059,3909066985,24321373,728754371,3053229544,1944173318,3221751690,126487924,1140622824,4134915582,1124074985,3900034558,4142415592,2155113990,2565342580,3905157631,1702952805,1390968759,3445459731,1312605066,394926965,2268564035,2332014035,1961375751,1127188486,3909088489,3689544635,2302886713,1435225437,1125615823,3125491592,3221778004,1387975449,2345861487,394835029,4164388931,516417731,2364015731,1569440763,991422671,243272563,3900732526,2615802747,3479013689,3909058793,108200021,3925568232,1552628106,878479656,3896122856,1569390636,3897248717,15210278,4281723391,3896111848,753473316,3815696639,3893771752,1911089356,4186040571,3924353256,468254487,4177687808,604474051,1971338432,32110596]},{sector:7,data:[3905157376,24379368,980937155,2328714635,1968454851,2320220929,529156871,3624466570,4292864195,4108846707,957671930,2301123723,4038079580,3908985576,925775780,1223229215,3271652351,2301779083,1911043676,3893326623,4125686475,4269140194,3912820201,3287810049,3941089456,3445459958,583763,3892605787,3287940715,3897360571,24328137,1294318275,1929385704,3247096577,334020620,4271630587,674712552,4177469335,2332078531,3935013981,1006651018,4177688063,619219651,1963407999,1166689053,1977104564,3041233425,175503416,1954596342,3921934338,3913416708,3935043536,1107314314,1954595062,3921805045,3739811773,671934464,3892316648,1994930353,4294044151,2330071784,1170646853,3221749927,2258571380,3766898912,1492673256,3919503494,1173751895,460685474,2158183926,3555198580,171436058,2158314998,1676150388,946857994,3892315113,3216717426,916711497,2166481024,1233265263,577708569,4246761243,4246292779,4246292781,4246292771,4246292782,4246292800,555305256,1530804976,544223009,991981325,3288227137,3897155003,1882142309,577187104,1126214210,239345879,848250190,1193337926,1967726971,1303989582,1381160784,1800622019,1580422228,1478541142,1146561281,3169386075,2290135287,3585837637,908322891,2149754125,3908969125,1300297639,62619832,4125157377,3897291707,3909039625,3150182291,3686419425,905504843,4261490265,2281707240,1307156293,911396,108314632,3902096776,2666072466,1270856503]},{sector:8,data:[3894871272,2258624856,3766898912,1491155944,3147751558,129311066,91555642,3372139914,3455994819,3915117173,2258581270,3766898912,1018905994,2953147653,4111722528,804609512,2253946950,1421582048,2315302177,2328560072,4110149895,709436484,3142341191,2800241178,466479142,1558709875,15919415,3895930088,1552615800,677153074,3140953065,1525172872,562971445,1327613522,3980796329,2562457120,645130314,1914279912,1912814602,1011083270,3892884713,2313762458,1252375350,1379216616,3141738934,1387331105,2952790761,2688911427,3909680360,3082492195,890234954,1294062401,3908968923,1702893850,2160295841,3279987021,3892905960,3051945987,888334390,35783169,4228063802,573834273,4263662342,3916238270,247332867,675580525,1964131386,2330495503,1144663620,3909317138,3314155588,58050814,973093865,58134596,2281714665,230565956,4140034413,3916238270,247332867,675580525,1144701182,3909317162,1149763604,1829617192,2968954089,675579905,3911795848,230618777,1236002925,2968948969,1237760912,2952791529,1237367680,3901375880,2582128013,4128892982,1166674613,1962884291,4133152773,3314160821,3908455144,108209411,3909629672,1038628349,581242164,33983231,3766919026,3907028560,1166680689,1954364598,2319813164,1912735368,3127740347,2108715523,1958102314,2315302161,4085750984,4093442695,2280884132,4289764858,1183378059,575858688,4092068723,3766900981,2025851038,401729795,2290135235,2766768709]}]],[[{sector:1,data:[1283963903,1043584232,878060311,591022115,555973421,3908969339,1170669121,1149895307,2294873640,4266002500,4067789645,1843940942,119793973,3916238526,230555651,230577773,3892555885,3857201222,745692695,1971324150,1997945872,1912683555,2294349343,300483652,2001353728,1913011219,1426491407,2281877613,1157497924,944891950,3278704062,1953834633,3139726824,1390955237,596659251,4263862355,3897226682,364586077,611051595,1929602024,80668931,3190459624,57896205,3892359401,12312718,677153024,3908349672,57877462,3120602345,2277188942,2354940269,1929104104,1019316768,1008759808,2332652801,2347297909,4292143360,158663228,3907941771,3353935998,19523839,3909075433,1170604323,1149895307,776208936,1149815038,1308509736,1324316043,484501582,2330883467,1149775428,1829617192,3892379880,1111285278,4142408565,3967126272,2284733578,230565956,1566829,3892331752,1972044001,675610350,1970081214,3753371862,3893794537,109764036,3221779357,2344812917,3899946278,4092125086,4292995389,3892360424,3051880593,3892540183,1149829093,1829617192,3892354537,2062032909,1962884096,1963015254,9431078,3908293352,574414276,2850554741,586541277,1270111627,574359434,921174901,4265994482,3892322025,2733171015,3909317398,1592328093,1894400,2464744307,4133349631,2330526579,3967126527,3190310142,1122528525,3282072320,1446115304,3909035266,3991462267,925713713,1412900942,1665537113,753467156]},{sector:2,data:[3905157394,854127459,374597632,1323828083,2615551,1944188136,4282640387,256195,3892314344,904462125,3709790429,58006332,1023356137,3271652621,3909085417,540859680,742130292,3287810676,3923574760,1095041005,1163313492,1380930627,1347769555,4292035916,3897229242,884679309,580642891,3894862523,57868704,3137534953,3253226249,3892736814,3303617214,682354688,3169387379,3893997568,132706314,1111577841,806176076,571289900,1163267362,1380930627,741346643,3967126400,3892353512,571338982,1431571746,1397050448,2150379533,3907941771,3488088194,572657136,1413563405,741346625,572656944,1552646157,677153070,770749928,221260849,4000680832,976635018,230565956,2336649837,1149955189,675579950,3899461054,1329787026,3900706132,2646334472,2148005491,753468276,3967126272,976635018,242362436,3899461054,1972043820,675610348,1972099445,675610350,1970081214,4032358563,222580549,795339136,708199562,3237881924,3916238270,921175792,33983006,2042628210,4029999123,221260849,3605561378,4029212676,3279949090,821043688,2045280300,3859188239,1919958131,652065600,61931701,91490106,1976172107,652131319,126536449,1356891807,373088390,4024961397,2148348399,3892315881,221310950,3766900864,174057630,3906971368,2148397014,3049304515,3893669892,3353872004,223743471,1936900992,369193332,1229193239,1129742406,1179206688,1061573200,2159034175,3911640762,2159018021,3911643066]},{sector:3,data:[2159018013,3911641530,1085276181,3911640762,1085276173,3911641530,1085276165,2284252346,2306111238,3899947030,1827205487,2953016096,1166721795,3766919080,3907028560,2253970188,2042339040,309543,1134298938,1979310237,2025731,3892509160,24313891,3795139,1019412850,3137959184,3303548913,3271651903,3421029369,2984900656,67175423,1996917254,1967144052,2164688915,3598452,2328035699,2289336582,4168382214,3058010819,3640032556,1954285192,2305656763,2322889246,2322889734,2315302344,2339665670,2339665942,3916724766,2159032771,1953957512,1946144488,3150182402,115886931,669210927,3664701695,2955960808,3905157379,24379315,987490499,4173529459,2766688963,3935001328,1006651018,3892802573,3913477709,3588816880,675676718,19414788,1057171519,675218984,3657361663,1939670666,74760200,3287876272,1946091496,1963146255,3909267461,3901358084,3287876528,3905094832,3925356542,95485888,1085326329,1953957512,2301029562,2306111510,2322889246,2080803009,4282902644,3766919107,3907028560,2253928942,54304480,2328035701,686406632,1011025802,940668159,4128077032,74809351,4294437187,4293454147,1356891807,2958286982,3975997450,552466920,3075309696,3991988352,1330795077,2149595730,3766900827,1979661470,3990677520,542060361,1869771365,250183794,4127689216,125141184,1139636456,3909087977,1609095977,3648710703,4193223400,1631717315,1768300644,1847616876,2154130785,1818838529,1869488229]},{sector:4,data:[1868963956,2154065525,1634030092,1919230052,2154983282,1769101070,1881171316,1702129522,1684370531,1766065536,1713400691,2154589301,1986348054,543515497,544501614,1767994977,1818386796,1344110693,2004054881,543453807,1970365810,1684370025,1699881088,1864393825,544828526,1701603686,2035490688,1835365491,1818846752,1141735525,1702259058,1920099616,58749551,109641600,2380821632,1954397144,1954547702,1894407,1954547338,1933138920,4274120717,109609136,3925439389,2331508737,3279192070,141893692,4269047483,3287833351,175377724,1929390568,3921894146,2142961691,2148005492,28314997,1954416264,1929384424,3150142210,662729855,2281746559,3279191558,2155118523,2109440015,4163883124,1954416266,527745032,1954547338,1356891807,548462726,1543468008,109627274,124941440,4269047483,2682352911,2253447302,1954397152,2253924304,2680397536,2253447302,1954528224,3145672576,260076669,2281746560,1484029446,3281969286,2155118011,3905126183,1055457283,496035886,3894248936,3941080466,1074980909,3892463336,1702887501,334004131,2571471360,158646280,3895664872,451411974,775547187,2141545856,3895312616,11546182,2953069704,88377344,4261436392,1149896004,189020677,1157558898,71600644,1913275450,775350498,3073267689,2320413440,1340645445,3894456383,2464759631,776136733,1189610354,2571471360,158646280,3895640296,3135766585,1166721842,3766919071,3907028560,2253914120,1166581472,1525203871]},{sector:5,data:[2317120301,2258615109,3766898912,2955825640,3934840847,1491978728,3902726278,4140034811,1954587461,3991454465,3940608045,2328035699,2258615109,3766898912,1609043888,518378,2665514584,3907703529,3035164054,423880922,2318205160,3221760324,1149896052,1975519272,10479875,1912735370,846774280,3151667432,126513667,427343880,1126051304,2322851514,619219463,2297072511,1245904966,1954596342,749857006,1837811966,3909136799,4030464440,2151435380,1166681973,1975519391,2504362499,376767804,3044148155,1007127040,1124496639,4108961278,3905260287,585755399,1972386816,3007706650,2316334208,1014104838,3892671743,4218617869,3892315113,3905093637,3150130252,126513667,1979661379,1405351938,1542082792,3905155187,1149954989,1958742057,3007706678,2315940992,3905995845,3186157706,692357866,439091381,3321759102,83884009,2328398362,1958742213,1074548999,1508513000,1074577802,2330594536,3221760068,2280134004,2323689946,3221760324,3232825972,61866677,3271620584,2318135528,1144663364,2315875625,1144663108,3271652648,2301123723,1166683228,3766919099,2967504464,3910461445,3909057512,2253914157,2229903072,733735145,2679850378,2253447302,3893014752,317253878,3766900736,3916032158,1912735370,2286006467,2328046916,171752261,1166674548,1958742175,4099860483,1018905994,2953147653,3916949536,1912735370,58245128,2315275753,1014104582,2317317504,171752261,87823732,2749893749,1277698281,3917488169]},{sector:6,data:[2548563973,3917488873,2419916517,1166680437,1946827963,1963277335,3917539341,758065184,3917488169,1944584198,2150445033,3288252649,1018905994,1007514634,3892933893,673245534,2149591382,3910765544,2280129552,3036917977,3921719554,65536000,3641567488,1356891807,3897680006,1482231522,2292113542,1837631301,139298822,4128201960,1954591557,138802699,2953147776,3905415200,134628746,2315679168,1166579013,1963342854,139296772,3859188288,1919958131,3007706685,2953147776,3902793792,1944454794,28378806,74805564,11600822,74806076,380700086,74806332,397477558,1173800586,91570184,3908429905,3921775193,1166672701,1963146246,50718979,4256894133,134711916,1258649024,4118138366,4263669128,4261640653,109709637,3221779433,1170605177,4273340187,2282309002,3221759301,3455977081,50647286,4263789960,188490829,3455976050,1157809546,642091015,134825354,2282059968,11541573,2317174152,20710981,45091189,2149666176,1006638057,2953409794,558727168,452992,706889098,3221752133,11534969,1008747912,3037032961,527272191,34030986,1160387397,3909318940,359989757,2149664246,1173752180,57966623,2281853417,1166548805,524616224,1173809290,712343585,2031961346,30664963,1173801098,443908131,2149402102,1161434228,2316268322,1157768773,952696347,3909317320,3314155953,1931494714,558233100,3909317760,1166541318,541403680,4226351993,509968385,558233215,2316924032,476941000]},{sector:7,data:[3221800330,209043850,3221809290,1300235892,3372122142,1074284022,1166541685,59674,35407242,1157767237,1827846941,3498705078,205312769,1381197683,4265803957,1930181824,3912206341,1532690420,3053826131,459264,1913273584,3054119943,190721,126353590,4266328240,1541831114,126353584,762638344,3137342393,4256853244,4085750892,4093508231,2280884132,28351994,4262282632,1173752133,108298275,3911337470,1340735134,1827847166,2953469321,205883404,1308500144,3892738074,4125746845,457570047,3038147712,507901485,2315875456,3221753157,816841333,2129184138,507901670,2953147520,3866355760,3894177162,1173749882,91521055,1659383472,4261458150,41426245,3253209461,541982438,2332029161,1474830445,3007706624,3897586816,11872311,79415434,2328559982,3388886000,126489720,809271076,775746420,758968180,548406389,2133067656,594878524,2319696382,1014965255,4263015728,3247064001,259256376,2133067658,125120572,2957756926,3272050720,108580350,3909092584,1405353974,173902673,135021962,2316072128,1308508935,173902092,2952790761,3862358016,4139998041,1954554181,6088963,2149795318,1407779700,592281600,642091648,2953266568,155551745,2969406952,3852462149,2149926390,766510452,3152385256,1569287410,2282532874,1166675013,738243876,4261771274,4294437317,2258569732,3766898912,3221800330,3588752244,3766900965,3855542686,3471392432,3909520101,2025850995,2323625241,141814278]},{sector:8,data:[1007648448,2315678977,2322851334,3895111912,2965628362,3845646400,2315340264,2317296647,3150482152,3455995173,133565816,1124365696,1140848617,2332028905,3900646407,133621009,1124365696,3053449449,1301986048,126536449,91521060,4142409904,652788708,1850915584,3905772937,1569444020,2302886861,126537053,2319419971,1962412248,3479013641,3909096680,2328100833,611372806,1971338432,3895177221,3905152189,971515581,1851046633,3541680136,24072890,3025505235,2286098312,2025850935,7727116,78975664,2582233265,1086387963,2414412661,1979661312,4047291137,1019412853,3892868592,774825158,4140007470,58007744,4143919337,980750528,3137940968,3364506900,3405840565,611453756,544411196,1356891807,126541958,1491355880,1017045126,2953147659,190782,921189808,387556,787023754,2011743204,2151628772,3554928835,2315269608,393537543,4265803957,2148005573,3456039028,4269008570,1259108557,3934979978,1241532040,3288330473,3892317672,2850563881,777817081,3274202249,2328714635,1066025735,2965624970,2215020544,2231797876,2248575092,870693748,2952837353,2231798015,856210292,3892355305,15263191,2181466362,2298458228,2960425990,2231797760,3058010740,58031420,2952830697,2248574976,19327092,1954678410,209240072,2957643195,2231798015,911732,108363836,3913942971,4139450371,355199049,1954678410,108576776,3912435899,2151415821,1874527861,256290,3894568891,2258567233,3766898912]}]],[[{sector:1,data:[1491429096,3281969286,1954940554,477413384,3716868234,2226782391,2966618481,1963407904,3455994629,3314218869,1954940552,2967870185,2248574976,2298458228,2306114566,2960426782,3125119231,1929389032,216646401,124928,387267,4175762152,2298458307,3899950598,2213073487,345565204,109757432,3221779357,3706193273,3905157631,4000514098,1929474792,3498108970,2305656763,2108732509,2327201160,141657094,2316399808,4268852230,2215020744,3892671601,4017291537,3288317929,3897168827,1273500729,589752340,4248038427,2153265165,3925816262,367525943,877658403,53783810,3842257886,1911095091,942336206,2045297656,4177228544,13625539,3287874419,1018578314,3892671869,3287824409,4175742440,1954921411,3221751690,1166673524,256425,3903341962,540855864,2134640498,99156851,937879552,2258617336,3766898912,1954940554,1166723210,2968029878,4175964285,2101135360,3471313266,3766900791,1489238174,3902726278,3287868357,1929381864,934799363,2108736504,1974879546,2344876290,2320217181,3766918919,3907028560,109765710,3221779590,3364495220,3632922805,2243559607,2329084273,1272154871,2280884124,2767453690,4203213703,3766900893,2231797918,2248575601,2294349428,4168386054,518339,1525154675,2328098871,141854214,4177688000,2231798467,3813402737,1954940554,11913354,2322695610,1138395902,2280884124,2767453434,4203213703,2248575645,2294873716,4168386054,2215021251,2042628212,3444500483,3909017576]},{sector:2,data:[11587740,1954743944,4160752616,1954743946,24756232,512476153,3825169543,3894656488,3454533649,590080035,1021683688,3909317887,2311311567,3144976678,1569287764,1901116365,3906166153,3102264532,2722494160,2333766784,2322486302,2160129543,512429429,126512726,58064700,4177314536,3445459907,3795027,3443886683,58054712,3909092329,1569456107,1019448019,1259893840,139134858,2299164096,126538589,24509500,20179139,4177518569,3892555971,3236495579,3844532479,1971372278,4235585543,3271568872,24510268,1086387907,686294645,1894656,3762090020,2062091125,1021322240,3909318080,132645140,2301004544,3491621236,1137532299,3445459267,3840075971,2319648650,3906505279,317203337,239790288,3905094003,2562394772,178548,126536449,41533448,4131636217,41189383,126534648,3121841640,112292838,3388869813,4265810808,2668071629,2253447302,2340365536,4622570,3766900810,2042628254,3905157345,3353928836,3766918916,3051390544,3150481920,3405860099,3221751690,1971372278,6547459,2665514584,58001724,1006646761,3909317898,1676148782,2328398591,1849480005,1357448053,3051475199,1285274368,1435224833,2617422291,4203213703,2275734524,2650441715,3285407113,1020478858,3271652688,1272143243,139134858,3892540608,126493048,108396348,3906166153,2344877846,3280655197,359944252,134711883,1259238592,2329107849,3908602399,3806977928,3790128127,4277201123,3364495140,2595946677,2328559949]},{sector:3,data:[3152138247,3405860029,2319658890,618498623,3892606240,1405345628,3908994792,1918567299,4273596675,3286191080,48853424,2675093504,2253447302,3470256352,2665514584,1944454792,3404223427,1569283022,2281746687,1569391173,2319664077,1066025735,126539914,393605180,1929546216,4276667137,2332652034,32046941,4294109663,4261421545,1166672453,3766918914,2346747472,3897818973,2304507415,2253979485,1166581472,3738888194,1929578216,3988505521,4288538887,3892734395,3169386391,38111950,3150914025,2296907757,38111999,3922662888,3921400636,1392553993,1356891807,1055449222,3766900942,3909519518,2953229683,1944173155,1183378059,3455992320,1068562037,1944716936,4283623771,2953443259,4291553791,3555197360,3892424910,2565394126,3487688957,3906138088,3001601948,42592461,1156121459,30205954,3905094003,1055392413,3893129730,2598948799,3520194767,3909087209,57803367,3271697129,3908919016,1618084443,1912709608,38922331,1173771891,1349877761,1926586600,1702937345,48791299,3894505986,2258620528,3766898912,1489893096,1990123654,4217211656,132714494,55410688,4292536704,4140687080,1971323717,3447449610,109605296,2344842214,268368733,4278017419,4250069255,3892426473,2260458421,4284320020,3288240104,3151732456,1569264809,4269992191,4242139331,1929500392,2289217544,4185122310,5236931,4226286963,2328099072,2675172870,2253447302,3447580896,2665514584,443904828,3908872936,91423143,4194184936]},{sector:4,data:[14674115,619185522,3921934846,3538419735,3892671232,3287940631,3908863720,91357571,4194175720,3905157315,3905147840,1894317171,3892867841,4108897587,3905157629,91422870,4177565160,3909520067,2366015603,3456493684,3555199091,8448253,3982329,2377845620,2148005492,149488501,4257015808,4177553896,2330495683,2675215110,2253447302,2349239008,3766919028,2329970256,2332461253,1955380084,3145672576,1569274296,4255836415,4134833339,58032135,1493008872,2292113542,1484033030,2292113542,3279194886,4134833339,57966599,3150751465,268334219,2632516468,1955380172,3279949696,3285382120,2298898875,1709768541,3905157373,2162752443,11921868,3892375528,1836195729,2301123723,3890756700,3771918587,1568010300,3908820456,1994916052,2337436191,1552492636,4224510014,977159306,259341380,3127719611,1821011253,1829682751,3137342697,918187317,1047300717,2288848318,1569260653,4250241531,977028234,91373124,48889776,2281811968,230555973,1012697965,4163394697,3427854531,2348513001,126548829,2147567094,1161432180,4177687300,3925848259,1161429001,4177688068,2667688131,2253447302,1776833504,4261638907,1482359365,43966598,4161243143,3761170627,1964032246,7137286,4177527529,1963605187,4214024197,154977272,602407797,3334732283,2315422533,1820998724,1044678718,1178365064,1972063742,3914223342,1569455930,1124567757,3632938890,2705716931,3271652480,3894239464,12054516,565202867,788850771]},{sector:5,data:[3896184763,2958757353,789375008,3908022505,3186100609,3757304075,255594276,1569394549,1125616333,1112225674,1183509131,954778368,16181469,2680357235,2253447302,463399136,976965645,3909040976,2253970719,3287916256,1490884328,4171161734,911555,3905845225,1496128380,996748091,6285567,3905094003,1144833772,1161561204,3538440053,3335186650,756767720,2821405592,1001095739,4282094363,3894190056,3287927507,3906647272,57868428,4143968489,780760,3906643176,57868412,2684346601,2253447302,18344160,2665514584,2282308866,2397571397,3150182400,1927826683,3271652123,3905566952,3521642589,1011249691,2147972398,3917486413,254083056,1166677365,1963736076,424015372,4261639296,3655928141,4127240447,1971329349,155581955,1308551306,2332850188,797444701,173902147,4261413865,3051949125,3139839,4273718264,4288604236,3905094003,3049507615,976915,1166544048,1827846924,3272236425,4005240757,2281746540,3455992583,3905157493,1166723437,29423113,1166689140,1975519245,156106268,3127702459,196701426,4085750784,4093442695,2280884132,468295162,155581952,3127704763,196701437,4085750784,4093508231,2280884132,11574778,1183378059,155552256,109639888,112554986,3127702203,126514150,3364544720,3771785424,37996544,3934995207,1241532040,3866480126,3905713129,3871014753,1827847027,3934979761,1241532042,170655925,3321759096,83884009,1127188490,4265805704,2330165193,7596550]},{sector:6,data:[155551936,135087498,2317710784,3221753413,4089126516,1827846764,2617248697,4203213703,2275734524,2650441715,1166540976,156106264,3680889027,3906805736,225574937,219783144,1312439630,3924361021,3676170266,417907705,3905157339,484973423,3766918912,2346747472,1552492636,459139122,1476864232,1939792006,449636355,426174659,2168322432,1967013257,4181458237,1480071997,3302156542,752402664,692357184,2328145384,20752965,1166684021,3635144873,1009337482,3909317123,4072348295,3067120189,2329084160,2839906871,4026548268,57819196,2283433705,2011703620,4267370692,1625883507,675579930,58048520,1008359145,3909317375,1166678607,1964719273,440789251,436257784,2187873844,3076882588,3674466431,3906968808,1441328640,3974031556,991481832,454770208,1042710590,3905157375,3287932891,3911132392,3236429830,59875,3909078761,2850610212,1480071960,3763202303,1592264307,4293847519,2346761448,1552492636,412018740,977175309,1563311747,1051269950,3770804479,1760036467,4292667871,219706344,1966751349,1048189758,441313535,1357431800,3746425055,2969551337,3692620016,3336544488,2315422533,1149776964,910460978,2337144390,1313796469,3906990056,3437821976,3743541503,3909059561,1552669604,844925224,3923761128,1702952838,1284210660,911510324,4030252426,3247052917,175296568,2162445696,2285259912,230372436,3764226413,3247096824,410374200,4030252426,1300236914,1820885220,896829495,2305625787]},{sector:7,data:[3287867485,1569440761,147294852,3271652800,4263774090,130470026,931808000,2298480582,3899952662,4218617863,1922041486,1829617347,1955464842,101380132,259290255,1955470987,2315182976,3514076702,2328071915,611618310,2399537904,4177687924,2383842243,770200180,1435193857,214076032,3905980929,2304377126,1517587990,2340443529,1098029070,1922567817,1569440760,2384365952,1829617268,1955464842,101380132,259290255,1955470987,2315182976,3514076702,2328071915,611618310,2399537904,3892737396,24313876,13822147,2340443529,1232246798,1922567817,1273545720,4177688320,1370307,3905045480,3263824052,3933471012,3892314298,3287810222,3117112715,3221749762,1569311513,2384366027,1829617268,1955464842,101380132,259290255,1955470987,2315182976,3514076702,3284373227,1003183499,3200502109,1569418509,4276322447,2307874185,2339672094,230600285,47725,1922569865,2749946508,3377826048,2332037306,3511929181,1539542763,1002555368,1937018910,4280018964,443942,3247177984,2210500161,3823698627,1829617407,2298478779,1569423453,29590473,2315182976,1569442141,3411904911,1922041486,2334573560,3271557142,1476902,99140352,2416348672,1381221234,47953,3111426234,102629392,2275149599,4244277235,4085753075,513669767,1493638918,1405311834,2562412882,47732,2617249977,4203213703,2275734524,2650441715,3277544025,3280163155,3540300047,3657521643,3286421851,42681798,975717514,108146756]},{sector:8,data:[3916238270,4266000394,3967126349,3287830094,3899461054,1284184006,501764400,158554368,2305625534,401092684,3766918935,3907028560,786962368,3766900743,1170654110,1157497483,4177687848,809798339,1932018746,675580419,1982481466,2294544642,1149773892,1308509760,1323005323,2315302478,3271436628,2315255995,3905955908,3540058739,3604013776,4067803144,3620791248,2438302547,3666664075,3542737617,3822183377,22733777,3666629587,2348762600,2438302682,1996545256,3287898883,3901707659,57802961,2311321947,2304493917,2900902492,2925366270,1922702985,2298478779,971515996,12314626,2344812915,1128498269,2340707721,2666049109,2347397632,1435189852,1078758318,2317896841,1958742209,2328493643,1958742213,2966289981,126372608,2315749451,809777857,3314166131,1932608570,2336901666,4623082,11536264,1183378059,2336375552,4623082,11536264,1183378059,3913960192,1821048765,4289718593,2302827659,1284222557,24569920,2345227659,3520761050,3520276962,3521368547,2585168867,432015474,3489969619,4275818735,2281207245,2552138707,432015474,2552138195,2328098930,1961900231,3280651009,2344865848,512328797,2830857358,2148499572,1955468939,1955731081,4134840507,108363783,3925729256,3666542599,2319652746,2383841591,1829617268,1955464842,101380132,259290255,1955470987,2315182976,3514076702,2328071915,611618310,2399537904,2333766772,2339671574,3661220189,300418675,3271652096,2155129019,2615770919]}]],[[{sector:1,data:[2416348927,378127218,2515039382,4235389181,1569394547,3378350510,1922041486,4194127592,4255377603,1955468939,1955862153,1955731083,4134840507,745897991,1955468937,2322402750,611618310,2399537904,2333045876,2155122206,512360163,3956372622,378258318,870872212,780797,378264203,394818708,2335672387,2306119190,3195309590,109735181,4028920974,1955530250,512429940,3816846478,2384366078,2397819252,3053564611,4244170752,2348538088,2306118678,3195309590,109735181,4028920974,1955530250,512429940,3816846478,2384366078,2397819252,1284096963,2438302512,3666664075,3542737617,3822183377,3058951121,30509568,1523778003,2292997513,3448374605,3788505269,3280655824,1183378059,3347726848,1183378059,3405857280,1963281918,1149944809,809777704,1149907059,826554921,1435183219,2363132817,702730714,3521368531,3051606499,676104704,3405892353,1284120459,30081321,2220722635,12305400,2220722432,3186148345,3138089983,1569259520,2384365954,529253236,2307022217,3195309598,109735181,4028920974,1955530250,512429940,3816846478,2384366078,2397819252,2382793411,183510132,1970573062,32110852,3200514048,2984799501,2316530687,254050885,2963228040,33982704,2416348786,45859698,2837350770,4226476148,3044317883,2836826894,2332527220,4622570,108330812,3455992387,378138485,4282152105,2984784244,2383841787,1829617268,1955464842,101380132,259290255,1955470987,2315182976,3514076702,2328071915]},{sector:2,data:[611618310,2399537904,2326426996,2322727430,2282693864,3314196293,109637668,109998594,3049484944,3748497548,45875120,2953283698,33982704,32031602,230605568,4278904941,142951818,3893458368,158596038,1922041486,4190018536,4293257667,3908676584,2258567283,3766898912,1569412467,2582139780,1569283065,33983108,1022370930,1007514624,3892933648,2666068356,2812415,1356891807,110026886,2565370512,3583764721,2665514584,125108284,1912735368,3906331624,108199975,3908655080,1552678769,777816360,2316469736,611451398,33982704,2416348786,3842369650,2665514584,2416348867,3873302642,1912735370,4028950666,2292139274,2339504646,3314189405,4030525476,1166676085,1124567199,126353584,1922041486,512345080,2830857358,2148499572,2305950395,2339679262,2306117142,3899959830,158595428,1922041486,4189964264,2383842243,378229364,2830857386,2148005492,378087797,230585486,2382793325,183510132,1953795846,2384366351,4276322420,1955470985,3280923601,4197771354,2332035305,394812122,2302117955,3195309590,109735181,4028920974,1955530250,512429940,3816846478,2384366078,2397819252,1956166595,1124075462,2332035014,3044322326,2330626830,2286092358,1962884103,3455992325,378138485,2258597036,3766898912,3153726696,662729896,3766900863,1962884254,4282902787,1922041486,2179515384,1892661971,1912735370,1081413692,2328972798,611451654,2297072511,3141664838,11891203,1971324918,3321774854,2332030441]},{sector:3,data:[1958742213,604473874,2297072511,1112211526,4275129854,3119412685,1508404822,5630208,4134667195,74809351,4294437187,3713894723,2322486969,1927335943,2148005390,1189611125,4294306048,2315263209,1962884103,1978612764,3401734,3489663465,1927336160,2615299,3892323560,3404267536,1892662271,3150929289,1569287764,3263873997,1183377803,3330949376,1183377803,2328051968,2297072391,1111687238,3285274110,48857264,2281746432,1038650181,1205798159,4249341979,2152193293,3909044189,1166719640,1975519371,2823129606,2315256809,540846405,2134640498,2196243315,4291750350,1942951144,3499223045,3253322745,2965633279,3451447296,3286927592,2315255739,3279203870,2315255738,3279066134,2298544059,3279065630,1922178699,3892319465,3548844105,1922178699,3541680136,1256784757,2329118464,2258615109,3766898912,3894653011,512478578,2319676590,1960315079,1944603402,3462457550,2340429882,1131582494,3624454026,3897231988,1273548382,2149595854,2451474779,3461408882,2665514584,2345514728,3497170974,3503804643,2329399523,3041833927,1913273344,4262079494,2683730373,2253447302,1019579104,2669441802,2253447302,1678150368,1958742124,4263555079,4843723,2665514584,2281709545,3043779590,751173120,1930050570,2680946424,2253447302,3905260256,2253914149,518561504,3766900736,1566878,1922631306,242597896,1922565770,108204092,3897405515,214159091,3471697968,2311308286,1166726493,1967340704,1832237839,2322413242]},{sector:4,data:[1284124780,846129,3127719611,1821011253,810322481,2295819656,1569314893,3679816153,3934978224,2952808072,3646786304,3924297608,4212582584,2317756018,603980294,2416348912,1962949746,261416983,3906297227,158584100,3893338088,1122569962,261548047,4275658123,3611658759,3380021050,4275789195,3628435975,3010922298,2316248297,1014228486,2953146992,3284142080,1944716938,1077682180,921176946,2289217724,2960385542,2330495488,141814022,2042989248,3275754498,3901390628,2149900496,1944651400,1059374474,109633540,2160292842,1700946252,1632403564,980182370,1885688352,1769234789,1451255662,1702194273,1836008320,1684955501,1128407098,1195787588,1380994377,1465275475,1632403501,980182370,1885688352,1769234789,1283483502,1818583649,1818318464,1535141237,1953064005,1866956893,980382752,1869562656,1852400754,2154132577,1819305298,1952539497,1394621029,1668445551,1634869349,543516526,1159754351,1380275278,1885688448,1633905004,540697972,1735549268,1914729573,1701277281,1885688448,1633905004,540697972,1867398478,1634222880,744843118,1379750432,1952541797,2154133097,1651469383,540699745,542056515,2152079442,1970040643,1998614125,1752458345,1701139072,543973750,1701081679,1377843826,1384137504,1818321765,1092631139,1468026144,1868852841,1210071671,824202784,1428181792,1953059968,980641132,1444956192,1310736928,1952531584,1394621025,543520353,1684107084,1952531584,1869357153,1149264993]},{sector:5,data:[543257697,1702257011,2003782784,1914729061,1952999273,1818838656,1869881445,1634683936,1867284580,1852400737,1867284583,1852400737,2150244455,1701603654,1919903264,1986089760,2154262121,1701603654,544175136,1701602628,1182819700,543517801,1936291941,539915124,1869881433,1885696544,1701011820,1818576000,543519845,1701603654,1869894528,1701273970,1769296256,541884532,541335635,2149785681,1702063689,1149269106,1952803941,542277733,542277699,1919885379,1414415648,1300255301,979727983,1869760032,774778477,1182822228,1634562671,1142962804,1226852128,1377848352,706749472,1634484864,1132489582,1918985580,1886999680,542711909,1663070068,1768320623,679505266,824191299,741947193,825768241,1718571808,1918990196,1916870757,539784052,778268233,538976288,825049942,844707383,1296189741,1397052461,1350574164,1953393010,1867259962,544367991,1751607666,572533876,1970562387,757083248,2149982252,1852404304,1176517236,744844393,1769099296,1919251566,1769099392,540701806,1970562387,1919885424,1414415648,1350586949,1953393010,1766203450,1634624876,1484809581,1769099392,1919251566,1953459744,1634038304,964720996,4278834776,3976264704,84461831,2248867338,4244700688,1108681984,773152533,3709160213,758589460,4231503415,4097294903,2755149879,4164399927,1208885773,51509777,3272744978,370331410,2601488911,302961167,1662277906,1746169108,3088417301,3308825400,2184784696,4286775086]},{sector:6,data:[2164228482,8421504,0,0,0,2633003,791293227,1009527134,1010712124,1170296381,3528413778,1322079571,1229837904,3628158414,1263488844,1329844309,1104432725,1095910742,1313457479,3544334804,1137592659,1096078159,1230193102,1329807822,1096040915,1196379342,3461132337,1355831365,1381061577,1431459028,1279346373,1330562387,1314081236,1163086273,3528413778,1338265153,1137068498,1397706568,65477,2155905152,2692776064,2694881440,2694881440,2684395680,2694840320,2155905184,11331712,2163821952,3897274299,3504929345,4041468106,1642660723,3764226826,3907804553,1552614633,677153078,1945309672,1972093697,4143952108,1954604101,3909201925,1291714563,4131751990,2285126794,1149957189,4114974774,3916238270,2545549493,4192200779,1929383144,1300284161,4289757431,3892350185,2663055426,145745995,1380865347,3908980315,820510770,1268956106,1124637928,1532120661,1314590030,4283328027,3904109544,3840477678,1829682175,3137340393,1569287437,73394412,3287925752,2146919808,2146985344,2147050880,4150624451,1267776127,3908662504,24379297,3967126467,976110730,24260676,1829617347,2301648011,1972054108,676134638,3899461054,24375914,4165828803,2281812096,1972106821,776243948,2331264392,3372101700,2348107144,11595381,3190310024,1239969037,4114975411,4277421354,3880093888,3135832949,3967126281,2163623414,1166673524,256500,2297775498,230565956,4111394925,142951818]},{sector:7,data:[3909318080,31984021,4148557557,3892540544,1569452020,1125616260,4132124554,1954608965,47625,2286098312,1435061047,4032662002,3904038888,1435235540,2220723184,178515,2280884124,2767453434,4203213703,3142736541,45706455,4085750784,4093442695,2280884132,2304482810,1972105309,675580652,2297840938,1308502084,1829617383,1972090485,675610350,975717514,57880644,3204399337,1166699789,3766919075,2162198096,3145769805,1173770783,158695672,2158052854,3183149941,4181715023,2665514584,3903014280,3119111419,39839962,3152760041,1055410732,452856,417858418,3303588843,4007127240,3905094003,540722878,1246608256,2348294376,1552495708,3765799738,2330293641,1166554692,1829617379,1944989928,3857236737,912034778,3894959241,24375526,2681027,3287810675,4276450699,1157510212,910461494,1965704250,911015427,4265231498,230570564,3812964973,3287865202,2345151208,1552497244,3686721576,986075624,1552646176,677153076,3906711528,774817346,1552646190,677153078,3906707432,540722738,3017795712,2302303371,451422300,33983220,3796207730,108576776,3909103080,45809687,1892661874,2617278393,4203213703,2275734524,2650441715,3766919160,3907028560,2253969984,24354528,11004355,3905437928,4176016345,3684755675,1354465205,2281746544,3455992583,3001612661,1851046880,2345491849,512341085,1702915922,1300266936,3924328633,1962884297,1019225173,2152101248,3900749645,2531832891,3008358624]},{sector:8,data:[3897189819,592315861,1360417361,4283971611,3909558248,938016746,3136016384,3540086864,2155876224,3900684133,1387921446,2329084271,1066025735,1726535818,3763857607,3909093608,2783510436,2344876249,1128516957,3285015945,3134021003,3221778004,3334722329,2315422533,1149776964,709114408,230556786,1143653229,944015418,2337144390,1313793397,1021461898,3137959168,1552482304,6350916,2298478779,1972058204,2281812192,230570052,2960844909,149046666,3893131456,24365387,3991747,3892324073,3485201261,1912781424,2617278393,4203213703,2275734524,2650441715,3935043504,3892332168,24376164,3765799875,2317894910,1144662084,1829617206,3287855990,2335726731,3347727436,3901417472,3355493258,1284098186,114878532,2302303371,2263361628,4106414322,3272007656,2328714635,1066025735,3905149066,109769329,3221778946,115868536,2951407616,3908241385,2749953180,3365332998,108396348,3909529576,3223636292,1853194300,3909076456,1972045617,675580652,1928611130,4129387869,1954608709,4148557339,3893326976,3249602470,2957182856,3909585137,1166671936,2681333,1995785530,4182111753,3909317760,1161429036,4128404981,1971385925,4165334540,2315482496,65664069,4131717632,3190310024,1552641293,844925224,3909049832,230557429,4270319725,2331997929,222096453,247137909,256365,2305625531,3150179933,4276636748,1392264707,4283623248,3137370857,79254584,452864,3109305531,1374158850,649685,3897325499]}]],[[{sector:1,data:[367588613,3909317588,2364069224,3609454789,3897306043,1948386245,1412376147,4283705901,1929453288,3795203,1877483184,910461634,1915241530,793020969,3895018632,24314076,927238851,1915307066,3289901067,4275566824,3883215172,4142402992,675610306,166317941,452608,3920552936,11535574,3905039848,3287879402,3897319867,485029005,4095338693,1939670666,57982984,3909083113,2277224124,2954791277,977012,3924297330,4294306261,3923162344,1391001450,1969110016,4974632,1631354660,3743679090,1124338408,3863499735,1407011923,1163124818,3697169379,2965078099,2953838196,3905157214,522453025,3272257731,2965573040,317244187,2986772480,780404,109762698,4169823410,2332292585,2339680286,435729493,1476817619,4187938950,2954791875,1124567668,1957699209,4259890168,1939717037,1954547702,4282575107,11584504,2952790761,50759808,4275628405,978604624,3337114170,3907905779,2344812915,1552495196,74836022,42681798,976635018,91433028,4184673726,1308509891,1324184971,3150182478,2042252166,40167499,1146400339,2082690180,1450658851,4267086161,3897246907,1843983229,3909317586,3787183072,1265482315,1493319144,3908981925,3085501342,236972045,3102278515,884720595,4082362443,1943163880,3551979779,3689421232,809798336,2317894792,1149776196,2907367465,1939670666,58310664,3892369641,3001549822,33983215,1978678386,2672134663,158646280,3892410344,3488143301,66512896,1965640958]},{sector:2,data:[676134604,2481504629,827797441,1330065165,2688912000,3904977128,789430658,2961199687,2705716801,2952950912,3240355917,2315295208,3221789253,1793590132,2571471368,1651818504,801200616,1173782616,141852827,230574261,387437,247355061,239372909,3188474922,2258595085,3766898912,3806905738,3766900928,3621185694,3892335080,1001390163,3904950504,1223165985,2655357440,91602952,3202890672,2638608064,3892868224,1462747394,3917483347,686292995,2156544,2147485929,2138354470,2147485161,2155131662,1930207720,3003577866,57966708,3285363688,2196311472,2504362688,578076680,3364487349,18961595,2668071627,2253447302,3233081568,2152089391,2665514584,3904920808,2749956050,1128738752,2470808192,3906422760,1149960130,323226130,1284194420,4843536,42681798,135414922,4263998656,675580104,1829617238,3892330472,1412415598,83254912,2953147776,190792,3897972400,2213068813,4266024703,3430255437,1284197966,649224,2298891403,233384012,4274388480,676104641,801125864,1051754584,3904889064,984667540,3149912297,2330479381,3497191665,3991470963,2914576593,109576624,334066869,1273084672,3897262522,2656632894,3723034198,363063571,4269061563,3324802319,3032158215,2148005492,130421364,1266268672,3153147112,1458064162,1042929,3137275846,585649017,1261091825,3287368936,3908114664,2112418089,2303557803,126507904,2042628163,1979595824,20900099,125173052,2139710848,1023404009]},{sector:3,data:[2315613695,3277039941,1161461540,2315875754,636070213,190720,384385859,2839886336,1173753717,57966729,3920306152,48824332,2151891712,3917515085,394985388,2268564035,2313420755,1435208029,2354416052,1166540976,2869618830,359996220,2326458344,3221786181,3287876213,4274084328,417959501,1632256,1166673267,2328098985,3538463045,4261638846,3320352325,4291422634,2324258187,2042628103,1962884112,981410839,41265733,132760568,2839886336,3287810677,4292864323,1166722041,1975519374,2344876290,126520413,2354940227,4170075646,3053881539,126507892,74809404,443742531,109768842,4030231734,2319649653,931808023,1945686919,1128481541,3825196149,451463050,3271652096,3771785424,3771785424,1958151816,115917706,1958198016,616761098,1918975103,1021256706,4177687344,1916419267,1933655053,1019476226,3271651911,254019372,199803896,2853365760,65586169,4294830336,4178822120,692357827,58048520,2328036272,4140012357,1954587205,3334691585,2315422533,3221750852,1144661364,33977876,65603652,272892416,230557043,147061101,4261574080,709114560,230557042,2294544749,4266010692,3413478221,1911049806,3905157355,1170604071,1149895307,776243240,1174815880,1972063742,2320387825,1166580293,3225151646,3904875240,2615798737,2655357651,1956267322,80996358,2345790696,1552494172,3223054632,512446803,1284206958,1127188520,2302873480,1500605982,1364443995,1903042187,1259309643,1284059018]},{sector:4,data:[1847494952,3277543793,4127198184,1954587205,3905157378,4289724665,3334686088,2315422533,3221760068,1144660596,974156562,91689028,4184673726,272902851,704646633,1144653892,3188029204,3287903501,1913275450,1829617157,1149813753,1308509700,1321497995,4277397582,2327707880,1140982852,3276113932,1284112565,1834203909,126536449,3904849288,1166606023,2328099012,619219463,1971338432,616925712,692357183,2282195523,4165675076,2281812163,1149773892,2160326953,2155132942,2147485161,2138355750,1958217462,2315809920,54320965,2315257321,54317381,3287876211,1958217462,4262032512,1308548941,453087,4275129854,1284231501,146901554,2952951232,1929329665,1140764674,3314157448,41271304,1077674416,1068499570,2148286244,1124567115,3905157187,3890741318,2638607872,2335995008,1552489052,2621830658,3188094080,65629453,1829682688,973620362,477370948,1444562056,1577280744,973620362,57872452,3187949800,2884136205,55568384,3278704062,42681798,2315275752,3221754436,1144655988,2316006952,1144655940,3892540168,1149895701,1958742056,306461222,1149903218,172243460,4276620402,72154627,3909633278,1144651789,4261967636,1157498956,1189049604,1972063742,3276689075,2282243210,1149895236,1975519272,138708998,973093353,108204612,2282777738,1144653932,3892541200,1143604153,2316006152,3372099652,3909633160,1144651792,2316005898,1143613508,2294349322,1149896772,138684968,3271836808,2158314998]},{sector:5,data:[2280194932,38046415,1963476010,54823450,1963541546,20759297,149488501,1979661316,65923331,2315262697,54823656,1963541562,1019578896,3909317889,4282123115,1944650613,3477661955,3897213883,3091790737,1539462747,1398502193,1851087706,1166736987,1975519385,4242336003,2157792640,3909213416,1702887897,2328067997,3221788997,2965569909,2571470848,2325628296,65573701,3469469952,1356891807,1153884294,11535116,2282570888,1166580037,2640674970,239388287,256165400,172279376,3766900758,36432286,1958295177,3916238270,914948103,247362745,2571471469,57982984,2315348201,37487684,1592329075,2147808769,1702890357,1300266908,149520539,2622324736,2607120512,2571501183,3144448954,62483576,4085750784,4093442695,2280884132,599432698,1829878637,2617250489,4203213703,2275734524,2650441715,3144510906,448359763,4085750784,4093442695,2280884132,1149935098,71565832,1149815038,239372826,2334147720,2306128158,1400158518,106728286,2333629577,2306128158,1400158518,71600734,4262085768,83242572,3037623424,3150481920,3405868371,65603466,205783552,2282636424,1149902404,172239388,2317108360,1143611460,2147808798,104617844,2380858227,1829617152,4261476584,1149897540,3766918923,3907028560,2253914406,1144692448,2317972491,2473429704,3314208254,3247047484,2258573938,3766898912,115918218,3766900737,189020830,1174275700,16050323,3892360424,183042286,1929460736,3598595,3893251326]},{sector:6,data:[2666004492,452608,3909130472,915000649,1173779641,108298395,3916238270,247332867,172264045,739525674,3892541698,230555997,230605677,4265338989,3204122089,4293487885,256250,2331727849,3221788997,4025025397,3449219322,2298498280,4134844726,1954585669,1829617158,3187672041,1149922574,3766918952,2346747472,2306128158,1400158518,106728286,2334678153,2306128158,1400158518,3766900830,2638608030,2281927808,230565956,3441420397,2327532777,20224581,3130672520,2025548923,3892557164,599392275,1829878637,149426869,1835907584,3043840955,2330626842,260702278,3247048584,1183378059,4265755392,3286922701,1016284554,2952950531,1921006595,2290069506,1149932357,1834203917,71501704,2971317507,1124567041,1157808638,256129683,125045874,2966027851,3909584896,3455975428,1284039541,1959394827,4274255874,1166709581,1929591955,3150182846,2733132501,1581861112,1314804566,1178754681,183041630,3107358976,1829617268,2298480617,3195320630,1149922574,272926728,2284340362,1157501508,272902674,3188999304,1300262157,585728165,1170626298,182977163,1308509696,1324840331,2680381006,2253447302,2773319904,2281746560,1149768260,340035600,2665514584,340036291,1149812990,3053565700,846082,4262085770,71600328,28705463,34358410,2258572356,3766898912,4169857024,1477270666,10412166,2331020016,256150227,2316125226,172264136,739525674,3907553794,3890744316,2281746681,2258568516,3766898912]},{sector:7,data:[1489763304,4271825030,189020864,3790203250,189041401,1149815038,2470808069,3498760438,233374385,356813312,1149812990,2471856645,1149895089,2328363029,3137385928,3405868371,2089426826,12814860,2328922832,189041399,739591210,2316530690,33599720,3456013125,3364551029,3892997258,1877478318,172264185,1149815038,3414616068,2030324990,4185057784,3334085552,3441800287,3439506465,2282759190,3899982342,15270225,3092258304,3633184768,1361477720,3273621252,12079134,1490587136,72420992,516104064,47184,4133017742,2147766534,1344193311,2382364856,243292376,528483409,3439506639,974136342,1953825286,28623617,3032684237,605474050,33962512,2282321013,1953825286,6547715,382534068,4108911477,3439375360,1963146262,5236995,1962811019,1962942089,1929386472,14280963,266872712,3909317376,126353615,1958416000,4289980800,1962804991,1962819201,108360956,1962804935,512455868,507213054,225801468,1962942091,1962811017,4178291688,3905157315,1139277957,4286572799,4286310595,3287876213,134223336,2315744457,3909136617,1139277832,3909317376,3287875555,1962673919,1962688129,108360956,1962673863,512455868,797603068,1962673919,1962688129,108360956,1962673863,512455868,260732156,1962810939,645924213,3279910075,4290495882,440672,4183885242,74778426,387576,3795993155,2332521203,1124567770,3351457674,3161783302,4261857140,2155134068,2138356518,3137795779,1304658036]},{sector:8,data:[1196443723,2147647571,2147713025,425988,51281928,1491632245,8436225,567089844,12079134,1490587136,72361600,615522175,3026356154,3894529317,3905093637,3452109086,3223605265,3906078385,109625598,3833623833,3523654080,438733036,3833616501,2297221134,3279231782,1356891807,109764742,3962122,2253916276,347119328,2253964281,109616864,1323922698,1364414464,13690962,1482381658,1963591304,1963923081,3044355514,1019316736,2953147921,17623303,225755144,2280884124,2767453434,4203213703,2332930205,4622570,3899993531,57869885,3892373481,57868327,2315313129,1014303494,3909317956,1379664209,2749956981,1968192515,78571779,58017596,4177827817,1964947651,3110211771,817496067,2943074,109578610,243299595,3279975692,1142956064,1142956097,1142956098,1142956099,1142956100,1347702860,1380798275,1196708432,2315016022,2306162182,2339717134,2339716670,1074695155,1973875573,4161047046,63135327,1131757598,3815953209,3277742073,1963591306,41222204,512476152,3825169672,4160750312,2281746627,3145009670,512320195,512324868,512324870,516125960,47184,2337855630,1963080903,3910578181,3932171,246416757,2952790761,1342605322,1343127556,11567108,129027871,1356891807,3035160710,3766900991,2965633438,2328099074,1014303238,3909317888,109772785,1144812811,128976244,3137328617,330563676,2817008077,1958742016,4285327368,3219718576,4286179583,222086136,401087093]}]],[[{sector:1,data:[3271652096,1963722486,4127945856,2155152134,3921871989,179306498,1963335307,149480447,3271652096,4134799932,69110723,3907256181,57868413,2164227561,2138377254,1964451456,405176447,2380824437,10479616,1964508918,3892802688,280035099,11584505,8128136,2315279546,1014303238,3892737408,65601720,13690880,1005126515,369527039,8436597,1964252809,2305060027,3899983902,3287810444,12079134,1490587136,72353526,2148430976,2130989094,72353418,132733727,2328043519,1014308358,2953278752,3925849088,1076625412,109633674,646447196,104494354,74872089,3287881392,582730744,1007127157,2953082144,3121055786,146079837,3137346793,126514474,192225340,1964050166,2332324992,3128233758,62193765,2315256041,1965702151,77457667,91569980,1964510848,2297072512,1111687238,3816148478,263504888,1676157389,2042628351,4177637380,1109819587,716930933,69110117,3271667829,567087028,150947304,3271652800,3019922618,3894529302,3221815094,95421561,3401303033,102664548,3271602293,108363836,3909108712,109707327,3221779734,2129139316,2668720896,2253447302,2812128,1493033704,3281969286,1929388008,3572024065,386332413,292913269,3152576688,3909317884,384368134,3271652350,1555743683,3440423936,4275103777,91865096,3957850544,2258617341,3766898912,1964445312,3766900864,337546142,1124567157,1964377738,2151465214,317197173,3271652096,2952822971,369526784,337545589,3133405301]},{sector:2,data:[364118108,2280137165,1958742270,2281746445,3899987462,95485254,11584505,3036709051,1124567168,4185247230,512476152,109737236,3372119318,116797557,1954575682,4188419,3019922618,3894529300,3221814854,20714356,719913845,1946369024,2025731,1967263360,3145773184,109576320,126514454,337545539,1975519349,518403,179356664,2952790761,3622326275,3287898364,1963591306,41254972,1488700409,102664550,1651293045,1963466377,1929392872,4245481731,1929400296,4244826371,1929414632,4244433155,1964770954,1710818952,11847934,23476411,486968003,3322382453,1382451462,1965145027,540805002,109709173,48850425,976235520,1987386118,4179013638,2281702889,4168424454,582681027,1007127157,3271652640,41173564,2336474105,1713421251,3120562873,401106488,2281992956,3279232262,822096177,808649013,53491202,839135793,942933300,120994054,11928066,1964775050,109759230,95515933,118284498,348979380,2160391928,3287875956,1967326856,11927988,1710823050,349031166,1967326858,3892315880,3899916300,3304519875,3271652764,74630137,3271675008,4193857768,548425923,1965098632,1720270464,3909317970,109772526,2151445770,3287876213,2305234107,3145008670,512320108,468219144,3909317376,954792954,3909317376,109771762,109606172,113665780,3276826249,2322932155,1965046791,4094069255,190822,104476716,108426522,3925415600,109576197,3287840028,3053564929,471239168,3452632693]},{sector:3,data:[3304519703,2953016321,4173592854,1974060278,3287925505,1967392392,4102684852,1727272586,399362814,1967392394,3909083368,3899981648,220105155,4167166069,1964115594,108396348,567089588,109625598,31981660,767214336,10479733,3019922618,3894529297,4282186802,28312693,1323877369,3271652600,1912621032,317244161,6076928,567087796,1023152616,2967696895,1019476227,3271652613,1356891807,3897680006,1482291910,1017045126,2315613443,977349,91554364,99156912,3909136384,1499004928,800769017,8502133,552077493,2335092736,4622570,9026370,283640757,2332930048,4622570,2339712442,4285861150,1007127267,2332783648,4622570,3455992387,79949685,2297072448,2957115462,2297072442,3049455686,1964947983,3892349672,24313878,3270851,3905094003,24313907,1947024579,3284400386,1964948051,1072170165,1526887168,1966750915,3913505285,78970889,3899989690,4166713427,1965210307,535365813,1949187072,286162952,300515445,716849920,3892557173,24313866,287736003,3287842677,126505299,3892326376,74776649,3287833433,1929401064,3277543683,1183378059,1532576256,1976434243,4161243867,2334175427,4622570,1976434242,1631372278,2050754162,539755127,2336207043,4622570,1976434242,403603700,3150151797,79259853,2617719296,4192247107,539889091,1759689530,973095097,2638453767,24443360,1650574329,1717920867,1785292903,1852664939,1920036975,1987409011,2054781047,1145258561]},{sector:4,data:[1212630597,1280002633,1347374669,1414746705,1482118741,825252441,892613426,959985462,250096191,1294368768,45121397,281870516,3439414249,875570193,2148431152,2138395686,1967457991,199864320,1410236416,113737845,3087037765,1353914807,1226738115,2315302517,3540431319,2315302114,3540300231,3520070112,3489708000,2311258595,3279243038,1967726219,401130435,1292795904,1465286773,1967601291,915013259,552105291,3277741824,1967982326,3271652736,1967990400,1465274495,1967863435,82378379,1482579712,109971139,2350806341,1409742529,242516085,3959675578,4218749352,27847930,3650026356,2149579693,91555836,48853172,2332537856,1409742536,242516085,3959675578,4218749352,27847930,3247176564,3272080299,4283557968,4287686744,1158057478,3892819061,3272015894,4282247248,4286376024,1158057478,3899700341,3272015874,1195281239,4140338037,2155172870,3669626484,27847683,3975871349,4218683816,4222337419,1967589119,1967589119,1967720191,129287007,3019899625,4281919600,24444988,109971139,3901388101,3897624458,1129971638,4101361150,468239111,3020075263,3071331584,2988160512,3439506432,47888,3288253160,1023345128,3271652608,129296522,300490928,4277200896,24444988,3035138755,3911233648,512425984,2337502537,1400194846,1158057478,3897643125,1482293086,4118138366,512318215,2304472391,3279243550,2348709608,2960476446,3923257424,4253089706,3271652608,1962998144,4243112705,106386944]},{sector:5,data:[1967457934,158793272,3892360168,65601650,3074048,3277741831,1962999168,4185965313,3271652608,1442894568,109971031,3661133125,2313685366,4777984,3892315113,1594294276,116835166,1954575700,64666126,1963501804,3123032315,4243456984,1968049801,3892346344,117309553,117339475,244020561,3456005454,116844149,1954575700,3123294214,3287155672,1968441078,3121509504,2834039770,2969269512,64535077,243924462,1072198990,3401728,1968377598,1968246526,1968049803,3866480126,1968441078,2953213056,64535081,3405890542,3422474238,1968184969,3472804353,378129150,516126034,1967464078,3273631219,1968184971,2348644072,2339718966,3900002846,1049361771,244020551,11892046,1309575619,1344178549,1377208693,113754997,83916117,3338667753,7689478,3065051666,109790182,1122399573,1122419850,3767165412,1642464012,3104289787,4276228096,4151692286,1642513546,35556291,512314112,3905123671,12189708,3070407680,3440430336,1203356448,2347356523,16826353,3282367484]},{sector:6,data:[543515987,1886680168,1999580986,1647212407,1801677170,778987884,795701091,1953720680,796488303,2019910518,1953850213,1701601889,1836345390,1919903264,1919905056,1852383333,1836216166,1869182049,1650532462,544503151,1936287860,1886413088,1633905004,1852795252,46]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]],[[{sector:1,data:[]},{sector:2,data:[]},{sector:3,data:[]},{sector:4,data:[]},{sector:5,data:[]},{sector:6,data:[]},{sector:7,data:[]},{sector:8,data:[]}]]]
    • embed
      • embed.ts
        declare var require;
        
        module shell {
        
          function start(complete: () => string) {
        
            document.body.style.color = 'gray';
            //document.body.style.overflow = 'hidden';
            //document.body.parentElement.style.overflow = 'hidden';
        
            var drive: persistence.Drive = require('nodrive');
        
            var pcjsScope = redirectWindow(drive, window, '/cache/', '/demos/');
        
            var comp;
        
            (<any>pcjsScope).pcjs(loadedComp => {
              comp = loadedComp;
              (<any>nowin).nodrive = drive;
              (<any>nowin).computer = comp;
              console.log('nodrive: ', drive, ' computer: ', comp);
              var width = nowin.innerWidth || (nowin.document.body.parentElement ? nowin.document.body.parentElement.clientWidth : 0) || nowin.document.body.clientWidth;
              var height = nowin.innerHeight || (nowin.document.body.parentElement ? nowin.document.body.parentElement.clientHeight : 0) || nowin.document.body.clientHeight;
              updateSize(width, height);
              installAutosave();
              var textar = document.getElementsByTagName('textarea')[0];
              if (textar) {
                setTimeout(() => textar.focus(), 400);
              }
              complete();
            });
            var embedPC = (<any>pcjsScope).embedPC;
        
            var root = document.createElement('div');
            root.id = 'root';
            document.body.appendChild(root);
        
        
            var rootInner = document.createElement('div');
            rootInner.id = require('uniqueKey');;
            root.appendChild(rootInner);
        
            var emb = embedPC(
              root.id,
              '/demos/turbo.xml',
            //'/demos/sample1.xml',
            //'/demos/sample3a.xml',
            //'/demos/sample2.xml',
            //'/devices/pc/machine/5170/ega/1152kb/rev3/machine.xml');
              '/demos/components.xsl');
        
        
            if (pcjsScope.onload)
              (<any>pcjsScope).onload();
        
            var nowin: Window = require('nowindow');
            nowin.onunload = (e) => {
              if (pcjsScope.onunload)
                pcjsScope.onunload(e);
            };
            nowin.onbeforeunload = (e) => {
              if (pcjsScope.onbeforeunload)
                pcjsScope.onbeforeunload(e);
            };
        
            var resizeMod = require('resize');
            resizeMod.on(winMetrics => {
              winMetrics.windowWidth;
              winMetrics.windowHeight;
              updateSize(winMetrics.windowWidth, winMetrics.windowHeight);
            });
        
            function updateSize(width: number, height: number) {
              root = <any>document.getElementById('root');
              root.style.overflow = 'hidden';
              var display = <HTMLDivElement>root.children[0];
              if (display) {
                display.style.maxWidth = Math.min((height - 40) * 640 / 350, width - 10) + 'px';
                display.style.overflow = 'hidden';
                var links = display.getElementsByTagName('a');
                for (var i = 0; i < links.length; i++) {
                  var a = links[i];
                  if (a.innerHTML === 'XML') {
                    a.innerHTML = 'Save';
                    a.href = '';
                    a.onclick = (e: Event) => {
                      if (e.cancelable) e.cancelBubble = true;
                      if (e.preventDefault) e.preventDefault();
                      save();
                    };
                  }
                }
              }
            }
        
            function installAutosave() {
              return;
              setTimeout(() => {
                var root = document.getElementById('root');
                if (!root) return;
                var canv = root.getElementsByTagName('canvas')[0];
                if (!canv) return;
                var textar = root.getElementsByTagName('textarea')[0];
                if (!textar) return;
        
                canv.addEventListener('mousemove', () => eventDelaySave(), true);
                canv.addEventListener('touchmove', () => eventDelaySave(), true);
                textar.addEventListener('keydown', () => eventDelaySave(), true);
        
                try {
                  var snapshot = canv.toDataURL('image/png');
                }
                catch (error) {
                  return;
                }
        
                var _delaySave = 0;
                eventDelaySave(30 * 1000);
                console.log('Installed autosave');
        
        
                function eventDelaySave(time?: number) {
                  time = time || 30 * 983;
                  clearTimeout(_delaySave);
                  _delaySave = setTimeout(checkStableAndSave, time);
                }
        
                function checkStableAndSave() {
                  var newSnapshot = canv.toDataURL('image/png');
                  if (newSnapshot !== snapshot) { // TODO: pass on small changes too
                    snapshot = newSnapshot;
                    eventDelaySave();
                    console.log('Screen is not stable, continue watching...');
                    return;
                  }
        
                  console.log('Saving snapshot...');
                  drive.write('/splash.img', snapshot);
                  comp.powerOff(true, true);
                  setTimeout(() => {
                    comp.powerOn(true);
                    eventDelaySave(5 * 60 * 1000);
                    console.log('Snapshot saved, continue watching...');
                  }, 50);
                }
        
              }, 3 * 60 * 1000); // install after half a minute
            }
        
            function save() {
              nowin.console.log('poweroff...');
              comp.powerOff(true, true);
              var root = document.getElementById('root');
              if (root) {
                var canv = root.getElementsByTagName('canvas')[0];
                if (canv) {
                  try {
                    var dt = canv.toDataURL('image/png');
                    drive.write('/splash.img', dt);
                  }
                  catch (errorCanv) {
                    console.error('Snapshot of the screen failed');
                  }
                }
                root.style.opacity = '0.2';
              }
        
              setTimeout(() => {
                nowin.console.log('save HTML...');
                saveHTML();
                comp.powerOn(true);
                if (root) {
                  root.style.opacity = '1';
                }
              }, 5000);
        
              function saveHTML() {
        
                var filename = saveFileName();
                exportBlob(filename, ['<!doctype html>\n', nowin.document.documentElement.outerHTML]);
        
                function exportBlob(filename: string, textChunks: string[]) {
                  try {
                    var blob: Blob = new (<any>Blob)(textChunks, { type: 'application/octet-stream' });
                  }
                  catch (blobError) {
                    exportDocumentWrite(filename, textChunks.join(''));
                    return;
                  }
        
                  exportBlobHTML5(filename, blob);
                }
        
                function exportBlobHTML5(filename, blob: Blob) {
                  var url = URL.createObjectURL(blob);
                  var a = document.createElement('a');
                  a.href = url;
                  a.setAttribute('download', filename);
                  try {
                    // safer save method, supposed to work with FireFox
                    var evt = document.createEvent("MouseEvents");
                    (<any>evt).initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                    a.dispatchEvent(evt);
                  }
                  catch (e) {
                    a.click();
                  }
                }
        
                function exportDocumentWrite(filename: string, content: string) {
                  var win = document.createElement('iframe');
                  win.style.width = '100px';
                  win.style.height = '100px';
                  win.style.display = 'none';
                  document.body.appendChild(win);
        
                  setTimeout(() => {
                    var doc = win.contentDocument || (<any>win).document;
                    doc.open();
                    doc.write(content);
                    doc.close();
        
                    doc.execCommand('SaveAs', null, filename);
                  }, 200);
        
                }
        
                function saveFileName() {
        
                  if (nowin.location.protocol.toLowerCase() === 'blob:')
                    return 'pcjs-app.html';
        
                  var urlParts = nowin.location.pathname.split('/');
                  var currentFileName = decodeURI(urlParts[urlParts.length - 1]);
                  var lastDot = currentFileName.indexOf('.');
                  if (lastDot > 0) {
                    currentFileName = currentFileName.slice(0, lastDot) + '.html';
                  }
                  else {
                    currentFileName += '.html';
                  }
                  return currentFileName;
                }
              }
            }
          }
        
          (<any>shell).start = start;
        
        }
      • redirectLocalStorage.ts
        module shell {
        
          export function redirectLocalStorage(drive: persistence.Drive, cachePath: string) {
        
            var keys: string[] = null;
        
            function updateKeys() {
              if (keys) return;
              keys = [];
              var files = drive.files();
              for (var i = 0; i < files.length; i++) {
                if (files[i].length > cachePath.length && files[i].slice(0, cachePath.length) === cachePath) {
                  keys.push(files[i].slice(cachePath.length));
                }
              }
            }
        
            class LocalStorageOverride {
        
              constructor() {
                Object.defineProperty(this, 'length', {
                  get: () => {
                    updateKeys();
                    return keys.length;
                  }
                });
              }
        
              key(index: number) {
                updateKeys();
                return keys[index];
              }
        
              getItem(key: string) {
                console.log('localStorage.getItem(', key, ')');
                return drive.read(cachePath + key);
              }
        
              setItem(key: string, value: string) {
                console.log('localStorage.setItem(', key, ', ', value, ')');
                drive.write(cachePath + key, value || '');
                keys = null;
              }
        
              removeItem(key: string) {
                console.log('localStorage.removeItem(', key, ')');
                drive.write(cachePath + key, null);
                keys = null;
              }
            }
        
            return new LocalStorageOverride();
          }
        
        }
      • redirectWindow.ts
        module shell {
        
          export function redirectWindow(drive: persistence.Drive, window: Window, cachePath: string, cwd: string) {
        
            function WindowOverride() {
              var _this = this;
        
              var xhrOverride = redirectXMLHttpRequest(drive, cwd);
              var lsOverride = redirectLocalStorage(drive, cachePath);
              Object.defineProperty(this, 'XMLHttpRequest', { get: function() { return xhrOverride; } });
              Object.defineProperty(this, 'localStorage', { get: function() { return lsOverride; } });
              Object.defineProperty(this, 'window', { get: function() { return _this; } });
              var _onload;
              Object.defineProperty(this, 'onload', { get: function() { return _onload; }, set: function(v) { _onload = v; } });
              Object.defineProperty(this, 'addEventListener', {
                get: function() {
                  return function(evtName: string, handler: any, other: any) {
                    if (evtName === 'unload') {
                      _this.onunload = handler;
                    }
                    else if (evtName === 'onbeforeunload') {
                      _this.onbeforeunload = handler;
                    }
                    else {
                      window.addEventListener(evtName, handler, other);
                    }
                  }
                }
              });
              Object.defineProperty(this, 'alert', { get: function() { function redirectAlert(msg) { window.console.log('alert', msg); }; return redirectAlert; } });
        
              function defineProxy(k) {
                Object.defineProperty(_this, k, {
                  get: function() {
                    var res: any = window[k];
                    if (typeof res === 'function' && !/pcjs/.test(k)) {
                      return (<Function>res).bind(window);
                    }
                    return res;
                  },
                  set: function(v) {
                    window[k] = v;
                  }
                });
              }
              for (var k in window) {
                if (!(k in this)) {
                  defineProxy(k);
                }
              }
              if (Object.getOwnPropertyNames) {
                var props = Object.getOwnPropertyNames(window)
                for (var i = 0; i < props.length; i++) {
                  if (!(props[i] in this)) {
                    defineProxy(props[i]);
                  }
                }
              }
        
        
            }
        
            var win: Window = new WindowOverride();
        
            return win;
          }
        
        }
      • redirectXMLHttpRequest.ts
        module shell {
        
          export function redirectXMLHttpRequest(drive: persistence.Drive, cwd?: string) {
        
            class XMLHttpRequestOverride {
        
              private _url: string;
        
              status = 0;
              readyState = 0;
              responseText: string = null;
              onreadystatechange: () => void = null;
        
              open(method: string, url: string) { this._url = url; }
        
              send() {
                var path = '/pcjs-embed' + (this._url.charAt(0) === '/' ? '' : cwd) + this._url;
                this.responseText = drive.read(path);
                if (this.responseText) {
                  console.log('responding ' + path + ' [' + this.responseText.length + ']');
                }
                else {
                  console.log('failed to load ' + path);
                }
                this.status = 200;
                this.readyState = 4;
                setTimeout(() => this.onreadystatechange());
              }
            }
        
            return XMLHttpRequestOverride;
        
          }
        }
    • modules
      • pcjs
        • lib
          • .jshintrc
            {
              "boss": true,
              "eqnull": true,
              "evil": true,
              "loopfunc": true,
              "sub": true,
              "globalstrict": true,
              "globals": {
                "APPNAME": false,
                "APPVERSION": false,
                "SITEHOST": false,
                "COMPILED": true,
                "DEBUG": true,
                "MAXDEBUG": false,
                "PCJSCLASS": true,
                "DEBUGGER": true,
                "PREFETCH": true,
                "FATARRAYS": true,
                "TYPEDARRAYS": true,
                "BACKTRACK": true,
                "SAMPLER": true,
                "BUGS_8086": true,
                "I386": true,
                "COMPAQ386": true,
                "Component": true,
                "State": true,
                "Bus": true,
                "ChipSet": true,
                "Computer": true,
                "CPU": true,
                "Debugger": true,
                "Disk": true,
                "FDC": true,
                "HDC": true,
                "Keyboard": true,
                "Memory": true,
                "Mouse": true,
                "Panel": true,
                "RAM": true,
                "ROM": true,
                "SerialPort": true,
                "Video": true,
                "X86": true,
                "X86Seg": true,
                "X86CPU": true,
                "X86Func": true,
                "X86OpXX": true,
                "X86Op0F": true,
                "X86ModB": true,
                "X86ModW": true,
                "X86ModB32": true,
                "X86ModW32": true,
                "X86ModSIB": true,
                "str": true,
                "usr": true,
                "web": true,
                "document": true,
                "global": true,
                "module": true,
                "require": true,
                "ArrayBuffer": false,
                "DataView": false,
                "FileReader": false,
                "Uint8Array": false,
                "Uint16Array": false,
                "Int32Array": false,
                "setTimeout": false,
                "clearTimeout": false,
                "webkitAudioContext": false,
                "window": true
              }
            }
            
          • README.md
            PCjs Sources
            ===
            
            Structure
            ---
            These JavaScript files divide PCjs functionality into major PC components.  Most of the files are device
            components, implementing a specific device (or set of devices, in the case of [chipset.js](chipset.js)).
            
            Be aware that *component* is an overloaded term, since **Component** is also the name of the
            shared base class in [component.js](../../shared/lib/component.js) used by most machine components.
            A few low-level components (eg, the **Memory** and **State** components, the Card class of the **Video**
            component, the Color and Rectangle classes of the **Panel** component, etc) do not extend **Component**,
            so don't assume that every PCjs object has access to [component.js](../../shared/lib/component.js) methods.
            
            Examples of non-device components include UI components like [panel.js](panel.js) and [debugger.js](debugger.js),
            and sub-components like [x86opxx.js](x86opxx.js) and [x86func.js](x86func.js) that separate the CPU
            functionality of [x86.js](x86.js) into more manageable pieces.
            
            These components should always be loaded or compiled in the order listed by the *pcJSFiles* property in
            [package.json](../../../package.json), which includes all the necessary *shared* components as well.
            At the time of this writing, the recommended order is:
            
            * [shared/defines.js](../../shared/lib/defines.js)
            * [shared/diskapi.js](../../shared/lib/diskapi.js)
            * [shared/dumpapi.js](../../shared/lib/dumpapi.js)
            * [shared/reportapi.js](../../shared/lib/reportapi.js)
            * [shared/userapi.js](../../shared/lib/userapi.js)
            * [shared/strlib.js](../../shared/lib/strlib.js)
            * [shared/usrlib.js](../../shared/lib/usrlib.js)
            * [shared/weblib.js](../../shared/lib/weblib.js)
            * [shared/component.js](../../shared/lib/component.js)
            * [pcjs/defines.js](defines.js)
            * [pcjs/interrupts.js](interrupts.js)
            * [pcjs/messages.js](messages.js)
            * [pcjs/panel.js](panel.js)
            * [pcjs/bus.js](bus.js)
            * [pcjs/memory.js](memory.js)
            * [pcjs/cpu.js](cpu.js)
            * [pcjs/x86.js](x86.js)
            * [pcjs/x86seg.js](x86seg.js)
            * [pcjs/x86cpu.js](x86cpu.js)
            * [pcjs/x86func.js](x86func.js)
            * [pcjs/x86opxx.js](x86opxx.js)
            * [pcjs/x86op0f.js](x86op0f.js)
            * [pcjs/x86modb.js](x86modb.js)
            * [pcjs/x86modw.js](x86modw.js)
            * [pcjs/x86modb16.js](x86modb16.js)
            * [pcjs/x86modw16.js](x86modw16.js)
            * [pcjs/x86modb32.js](x86modb32.js)
            * [pcjs/x86modw32.js](x86modw32.js)
            * [pcjs/x86modsib.js](x86modsib.js)
            * [pcjs/chipset.js](chipset.js)
            * [pcjs/rom.js](rom.js)
            * [pcjs/ram.js](ram.js)
            * [pcjs/keyboard.js](keyboard.js)
            * [pcjs/video.js](video.js)
            * [pcjs/serialport.js](serialport.js)
            * [pcjs/mouse.js](mouse.js)
            * [pcjs/disk.js](disk.js)
            * [pcjs/fdc.js](fdc.js)
            * [pcjs/hdc.js](hdc.js)
            * [pcjs/debugger.js](debugger.js)
            * [pcjs/state.js](state.js)
            * [pcjs/computer.js](computer.js)
            * [shared/embed.js](../../shared/lib/embed.js)
            
            Some of the components *can* be reordered or even omitted (eg, [debugger.js](debugger.js) or
            [embed.js](../../shared/lib/embed.js)), but you should observe the following:
            
            * [component.js](../../shared/lib/component.js) must be listed before any component that extends **Component**
            * [panel.js](panel.js) should be loaded early to initialize the Control Panel (if any) as soon as possible
            * [computer.js](computer.js) should be the last device component, as it supervises and notifies all the other device components
            
            To minimize ordering requirements, the init() handlers and constructors of all components should avoid
            referencing other components.  Device components should define an initBus() notification handler, which the
            *Computer* component will call after it has created/initialized the *Bus* component.
            
            Features
            ---
            
            [List of major existing features goes here]
            
            ### BackTrack Support
            
            The next major feature to be implemented is referred to as BackTrack Support, or simply BackTracks.  When BackTracks
            are enabled, every memory location (at the byte level) and every general-purpose byte register may have an optional link
            back to its source.  These links are called BackTrack indexes.
            
            All the code that a virtual machine initially executes enters the machine either via ROM or disk sectors, and as that
            code executes, the machine is loading data into registers from memory locations and/or I/O ports and writing the results
            to other memory locations and/or I/O ports.  BackTracks keep track of that data flow, allowing us to examine the history
            of any piece of data at any time, down to the byte level; while this feature could be extended to the bit level, it
            would make the feature dramatically more expensive, both in terms of size and speed.
            
            A BackTrack index is encoded as a 32-bit value with three parts:
            
            - Bits 0-8: 9-bit BackTrack object offset (0-511)
            - Bits 9-15: 7-bit type and access info
            - Bits 16-30: 15-bit BackTrack object number (1-32767, 0 reserved for dynamic data)
            
            This represents a total of 31 bits, with bit 31 reserved.
            
            For example, look at one of the last things a ROM does during boot: loading a disk sector into RAM.  It will be up to the
            disk controller (or DMA controller, if used) to create a BackTrack object representing the sector that was read,
            adding that object to the global BackTrack object array, and then associating the corresponding BackTrack index with
            the first byte of RAM where the sector was loaded.  Subsequent bytes of RAM containing the rest of the sector will refer
            to the same BackTrack object, using BackTrack indexes containing offsets 1-511.
            
          • bus.js
            /**
             * @fileoverview Implements the PCjs Bus component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-04
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var usr         = require("../../shared/lib/usrlib");
                var Component   = require("../../shared/lib/component");
                var Memory      = require("./memory");
                var Messages    = require("./messages");
                var State       = require("./state");
                var X86         = require("./x86");
            }
            
            /**
             * Bus(cpu, dbg)
             *
             * The Bus component manages physical memory and I/O address spaces.
             *
             * The Bus component has no UI elements, so it does not require an init() handler,
             * but it still inherits from the Component class and must be allocated like any
             * other device component.  It's currently allocated by the Computer's init() handler,
             * which then calls the initBus() method of all the other components.
             *
             * When initMemory() initializes the entire address space, it also passes aMemBlocks
             * to the CPU object, so that the CPU can perform its own address-to-block calculations
             * (essential, for example, when the CPU enables paging).
             *
             * For memory beyond the simple needs of the ROM and RAM components (ie, memory-mapped
             * devices), the address space must still be allocated through the Bus component via
             * addMemory().  If the component needs something more than simple read/write storage,
             * it must provide a controller with getMemoryBuffer() and getMemoryAccess() methods.
             *
             * By contrast, all port (I/O) operations are defined by external handlers; they register
             * with us, and we manage those registrations, as well as support for I/O breakpoints,
             * but unlike memory accesses, we're not involved with port data accesses.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsBus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            function Bus(parmsBus, cpu, dbg)
            {
                Component.call(this, "Bus", parmsBus, Bus);
            
                this.cpu = cpu;
                this.dbg = dbg;
            
                this.nBusWidth = parmsBus['buswidth'] || 20;
            
                /*
                 * Compute all Bus memory block parameters, based on the width of the bus.
                 *
                 * Regarding blockTotal, we want to avoid using block overflow expressions like:
                 *
                 *      iBlock < this.nBlockTotal? iBlock : 0
                 *
                 * As long as we know that blockTotal is a power of two (eg, 256 or 0x100, in the case of
                 * nBusWidth == 20 and blockSize == 4096), we can define blockMask as (blockTotal - 1) and
                 * rewrite the previous expression as:
                 *
                 *      iBlock & this.nBlockMask
                 *
                 * Similarly, we mask addresses with busMask to enforce "A20 wrap" on 20-bit busses.
                 * For larger busses, A20 wrap can be simulated by either clearing bit 20 of busMask or by
                 * changing all the block entries for the 2nd megabyte to match those in the 1st megabyte.
                 *
                 *      Bus Property        Old hard-coded values (when nBusWidth was always 20)
                 *      ------------        ----------------------------------------------------
                 *      this.nBusLimit      0xfffff
                 *      this.nBusMask       [same as busLimit]
                 *      this.nBlockSize     4096
                 *      this.nBlockLen      (this.nBlockSize >> 2)
                 *      this.nBlockShift    12
                 *      this.nBlockLimit    0xfff
                 *      this.nBlockTotal    ((this.nBusLimit + this.nBlockSize) / this.nBlockSize) | 0
                 *      this.nBlockMask     (this.nBlockTotal - 1) [ie, 0xff]
                 *
                 * Note that we choose a nBlockShift value (and thus a physical memory block size) based on "buswidth":
                 *
                 *      Bus Width                       Block Shift     Block Size
                 *      ---------                       -----------     ----------
                 *      20 bits (1Mb address space):    12              4Kb (256 maximum blocks)
                 *      24 bits (16Mb address space):   14              16Kb (1K maximum blocks)
                 *      32 bits (4Gb address space);    15              32Kb (128K maximum blocks)
                 *
                 * The coarser block granularities (ie, 16Kb and 32Kb) may cause problems for certain RAM and/or ROM
                 * allocations that are contiguous but are allocated out of order, or that have different controller
                 * requirements.  Your choices, for the moment, are either to ensure the allocations are performed in
                 * order, or to choose smaller nBlockShift values (at the expense of a generating a larger block array).
                 *
                 * Note that if PAGEBLOCKS is set, then for a bus width of 32 bits, the block size is fixed at 4Kb.
                 */
                this.addrTotal = Math.pow(2, this.nBusWidth);
                this.nBusLimit = this.nBusMask = (this.addrTotal - 1) | 0;
                this.nBlockShift = (PAGEBLOCKS && this.nBusWidth == 32 || this.nBusWidth <= 20)? 12 : (this.nBusWidth <= 24? 14 : 15);
                this.nBlockSize = 1 << this.nBlockShift;
                this.nBlockLen = this.nBlockSize >> 2;
                this.nBlockLimit = this.nBlockSize - 1;
                this.nBlockTotal = (this.addrTotal / this.nBlockSize) | 0;
                this.nBlockMask = this.nBlockTotal - 1;
                this.assert(this.nBlockMask <= Bus.BlockInfo.num.mask);
            
                /*
                 * Lists of I/O notification functions: aPortInputNotify and aPortOutputNotify are arrays, indexed by
                 * port, of sub-arrays which contain:
                 *
                 *      [0]: registered component
                 *      [1]: registered function to call for every I/O access
                 *
                 * The registered function is called with the port address, and if the access was triggered by the CPU,
                 * the linear instruction pointer (LIP) at the point of access.
                 *
                 * WARNING: Unlike the (old) read and write memory notification functions, these support only one
                 * pair of input/output functions per port.  A more sophisticated architecture could support a list
                 * of chained functions across multiple components, but I doubt that will be necessary here.
                 *
                 * UPDATE: The Debugger now piggy-backs on these arrays to indicate ports for which it wants notification
                 * of I/O.  In those cases, the registered component/function elements may or may not be set, but the following
                 * additional element will be set:
                 *
                 *      [2]: true to break on I/O, false to ignore I/O
                 *
                 * The false case is important if fPortInputBreakAll and/or fPortOutputBreakAll is set, because it allows the
                 * Debugger to selectively ignore specific ports.
                 */
                this.aPortInputNotify = [];
                this.aPortOutputNotify = [];
                this.fPortInputBreakAll = this.fPortOutputBreakAll = false;
            
                /*
                 * Allocate empty Memory blocks to span the entire physical address space.
                 */
                this.initMemory();
            
                if (BACKTRACK) {
                    this.abtObjects = [];
                    this.cbtDeletions = 0;
                    this.ibtLastAlloc = -1;
                    this.ibtLastDelete = 0;
                }
            
                this.setReady();
            }
            
            Component.subclass(Bus);
            
            if (BACKTRACK) {
                /**
                 * BackTrack object definition
                 *
                 *  obj:        reference to the source object (eg, ROM object, Sector object)
                 *  off:        the offset within the source object that this object refers to
                 *  slot:       the slot (+1) in abtObjects which this object currently occupies
                 *  refs:       the number of memory references, as recorded by writeBackTrack()
                 *
                 * @typedef {{
                 *  obj:        Object,
                 *  off:        number,
                 *  slot:       number,
                 *  refs:       number
                 * }}
                 */
                var BackTrack;
            
                /*
                 * BackTrack indexes are 31-bit values, where bits 0-8 store an object offset (0-511) and bits 16-30 store
                 * an object number (1-32767).  Object number 0 is reserved for dynamic data (ie, data created independent
                 * of any source); examples include zero values produced by instructions such as "SUB AX,AX" or "XOR AX,AX".
                 * We must special-case instructions like that, because even though AX will almost certainly contain some source
                 * data prior to the instruction, the result no longer has any connection to the source.  Similarly, "SBB AX,AX"
                 * may produce 0 or -1, depending on carry, but since we don't track the source of individual bits (including the
                 * carry flag), AX is now source-less.  TODO: This is an argument for maintaining source info on selected flags,
                 * even though it would be rather expensive.
                 *
                 * The 7 middle bits (9-15) record type and access information, as follows:
                 *
                 *      bit 15: set to indicate a "data" byte, clear to indicate a "code" byte
                 *
                 * All bytes start out as "data" bytes; only once they've been executed do they become "code" bytes.  For code
                 * bytes, the remaining 6 middle bits (9-14) represent an execution count that starts at 1 (on the byte's initial
                 * transition from data to code) and tops out at 63.
                 *
                 * For data bytes, the remaining middle bits indicate any transformations the data has undergone; eg:
                 *
                 *      bit 14: ADD/SUB/INC/DEC
                 *      bit 13: MUL/DIV
                 *      bit 12: OR/AND/XOR/NOT
                 *
                 * We make no attempt to record the original data or the transformation data, only that the transformation occurred.
                 *
                 * Other middle bits indicate whether the data was ever read and/or written:
                 *
                 *      bit 11: READ
                 *      bit 10: WRITE
                 *
                 * Bit 9 is reserved for now.
                 */
                Bus.BACKTRACK = {
                    SLOT_MAX:       32768,
                    SLOT_SHIFT:     16,
                    TYPE_DATA:      0x8000,
                    TYPE_ADDSUB:    0x4000,
                    TYPE_MULDIV:    0x2000,
                    TYPE_LOGICAL:   0x1000,
                    TYPE_READ:      0x0800,
                    TYPE_WRITE:     0x0400,
                    TYPE_COUNT_INC: 0x0200,
                    TYPE_COUNT_MAX: 0x7E00,
                    TYPE_MASK:      0xFE00,
                    TYPE_SHIFT:     9,
                    OFF_MAX:        512,
                    OFF_MASK:       0x1FF
                };
            }
            
            /**
             * @typedef {number}
             */
            var BlockInfo;
            
            /**
             * This defines the BlockInfo bit fields used by scanMemory() when it creates the aBlocks array.
             *
             * @typedef {{
             *  num:    BitField,
             *  count:  BitField,
             *  btmod:  BitField,
             *  type:   BitField
             * }}
             */
            Bus.BlockInfo = usr.defineBitFields({num:20, count:8, btmod:1, type:3});
            
            /**
             * BusInfo object definition (returned by scanMemory())
             *
             *  cbTotal:    total bytes allocated
             *  cBlocks:    total Memory blocks allocated
             *  aBlocks:    array of allocated Memory block numbers
             *
             * @typedef {{
             *  cbTotal:    number,
             *  cBlocks:    number,
             *  aBlocks:    Array.<BlockInfo>
             * }}
             */
            var BusInfo;
            
            /**
             * initMemory()
             *
             * Allocate enough (empty) Memory blocks to span the entire physical address space.
             *
             * @this {Bus}
             */
            Bus.prototype.initMemory = function()
            {
                var block = new Memory();
                this.aMemBlocks = new Array(this.nBlockTotal);
                for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
                    this.aMemBlocks[iBlock] = block;
                }
                this.cpu.initMemory(this.aMemBlocks, this.nBlockShift);
                this.cpu.setAddressMask(this.nBusMask);
            };
            
            /**
             * reset()
             *
             * @this {Bus}
             */
            Bus.prototype.reset = function()
            {
                this.setA20(true);
                if (BACKTRACK) this.ibtLastDelete = 0;
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * We don't need a powerDown() handler, because for largely historical reasons, our state (including the A20 state)
             * is saved by saveMemory().
             *
             * However, we do need a powerUp() handler, because on resumable machines, the Computer's onReset() function calls
             * everyone's powerUp() handler rather than their reset() handler.
             *
             * TODO: Perhaps Computer should be smarter: if there's no powerUp() handler, then fallback to the reset() handler.
             * In that case, however, we'd either need to remove the powerUp() stub in Component, or detect the existence of the stub.
             *
             * @this {Bus}
             * @param {Object|null} data (always null because we supply no powerDown() handler)
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            Bus.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) this.reset();
                return true;
            };
            
            /**
             * addMemory(addr, size, type, controller)
             *
             * Adds new Memory blocks to the specified address range.  Any Memory blocks previously
             * added to that range must first be removed via removeMemory(); otherwise, you'll get
             * an allocation conflict error.  This helps prevent address calculation errors, redundant
             * allocations, etc.
             *
             * We've relaxed some of the original requirements (ie, that addresses must start at a
             * block-granular address, or that sizes must be equal to exactly one or more blocks), because
             * machines with large block sizes can make it impossible to load certain ROMs at at their
             * required addresses.
             *
             * Even so, Bus memory management does NOT provide a general-purpose heap.  Most memory
             * allocations occur during machine initialization and never change.  The only notable
             * exception is the Video frame buffer, which ranges from 4Kb (MDA) to 16Kb (CGA) to
             * 32Kb/64Kb/128Kb (EGA), and only the EGA changes its buffer address post-initialization.
             *
             * Each Memory block keeps track of a single address (addr) and length (used), indicating
             * the used space within the block; any free space that precedes or follows that used space
             * can be allocated later, by simply extending the beginning or ending of the previously used
             * space.  However, any holes that might have existed between the original allocation and an
             * extension are subsumed by the extension.
             *
             * @this {Bus}
             * @param {number} addr is the starting physical address of the request
             * @param {number} size of the request, in bytes
             * @param {number} type is one of the Memory.TYPE constants
             * @param {Object} [controller] is an optional memory controller component
             * @return {boolean} true if successful, false if not
             */
            Bus.prototype.addMemory = function(addr, size, type, controller)
            {
                var iBlock = addr >>> this.nBlockShift;
                while (size > 0 && iBlock < this.aMemBlocks.length) {
                    var block = this.aMemBlocks[iBlock];
                    var addrBlock = iBlock * this.nBlockSize;
                    var sizeBlock = size > this.nBlockSize? this.nBlockSize : size;
            
                    if (block && block.size) {
                        if (block.type == type && block.controller == controller) {
                            /*
                             * Where there is already a block with a non-zero size, we can allow the allocation only if:
                             *
                             *   1) addr + size <= block.addr (the request precedes the used portion of the current block)
                             * or:
                             *   2) addr >= block.addr + block.used (the request follows the used portion of the current block)
                             */
                            if (addr + size <= block.addr) {
                                block.used += (block.addr - addr);
                                block.addr = addr;
                                return true;
                            }
                            if (addr >= block.addr + block.used) {
                                var sizeAvail = block.size - (addr - addrBlock);
                                if (sizeAvail > size) sizeAvail = size;
                                block.used = addr - block.addr + sizeAvail;
                                size -= sizeAvail;
                                addr = addrBlock + this.nBlockSize;
                                continue;
                            }
                        }
                        return this.reportError(1, addr, size);
                    }
                    block = this.aMemBlocks[iBlock++] = new Memory(addr, sizeBlock, this.nBlockSize, type, controller);
                    if (DEBUGGER && this.dbg) {
                        block.setDebugger(this.dbg, addr, this.nBlockSize);
                    }
                    size -= sizeBlock;
                    addr = addrBlock + this.nBlockSize;
                }
                if (size > 0) {
                    return this.reportError(2, addr, size);
                }
                return true;
            };
            
            /**
             * cleanMemory(addr, size)
             *
             * @this {Bus}
             * @param {number} addr
             * @param {number} size
             * @return {boolean} true if all blocks were clean, false if dirty; all blocks are cleaned in the process
             */
            Bus.prototype.cleanMemory = function(addr, size)
            {
                var fClean = true;
                var iBlock = addr >>> this.nBlockShift;
                while (size > 0 && iBlock < this.aMemBlocks.length) {
                    if (this.aMemBlocks[iBlock].fDirty) {
                        this.aMemBlocks[iBlock].fDirty = fClean = false;
                        this.aMemBlocks[iBlock].fDirtyEver = true;
                    }
                    size -= this.nBlockSize;
                    iBlock++;
                }
                return fClean;
            };
            
            /**
             * scanMemory(info, addr, size)
             *
             * Returns a BusInfo object for the specified address range.
             *
             * @this {Bus}
             * @param {Object} [info] previous BusInfo, if any
             * @param {number} [addr] starting address of range (0 if none provided)
             * @param {number} [size] size of range, in bytes (up to end of address space if none provided)
             * @return {Object} updated info (or new info if no previous info provided)
             */
            Bus.prototype.scanMemory = function(info, addr, size)
            {
                if (addr == null) addr = 0;
                if (size == null) size = (this.addrTotal - addr) | 0;
                if (info == null) info = {cbTotal: 0, cBlocks: 0, aBlocks: []};
            
                var iBlock = addr >>> this.nBlockShift;
                var iBlockMax = ((addr + size - 1) >>> this.nBlockShift);
            
                info.cbTotal = 0;
                info.cBlocks = 0;
                while (iBlock <= iBlockMax) {
                    var block = this.aMemBlocks[iBlock];
                    info.cbTotal += block.size;
                    if (block.size) {
                        var btmod = (BACKTRACK && block.modBackTrack(false)? 1 : 0);
                        info.aBlocks.push(usr.initBitFields(Bus.BlockInfo, iBlock, 0, btmod, block.type));
                        info.cBlocks++
                    }
                    iBlock++;
                }
                return info;
            };
            
            /**
             * getA20()
             *
             * @this {Bus}
             * @return {boolean} true if enabled, false if disabled
             */
            Bus.prototype.getA20 = function()
            {
                return !this.aBlocks2Mb && this.nBusLimit == this.nBusMask;
            };
            
            /**
             * setA20(fEnable)
             *
             * On 32-bit bus machines, I've adopted the approach that Compaq took with DeskPro 386 machines,
             * which is to map the 1st Mb to the 2nd Mb whenever A20 is disabled, rather than blindly masking
             * the A20 address bit from all addresses; in fact, this is what the DeskPro 386 ROM BIOS requires.
             *
             * For 24-bit bus machines, we take the same approach that most if not all 80286 systems took, which
             * is simply masking the A20 address bit.  A lot of 32-bit machines probably took the same approach.
             *
             * TODO: On machines with a 32-bit bus, look into whether we can eliminate address masking altogether,
             * which seems feasible, provided all incoming addresses are already pre-truncated to 32 bits.  Also,
             * confirm that DeskPro 386 machines mapped the ENTIRE 1st Mb to the 2nd, and not simply the first 64Kb,
             * which is technically all that 8086 address wrap-around compatibility would require.
             *
             * @this {Bus}
             * @param {boolean} fEnable is true to enable A20 (default), false to disable
             */
            Bus.prototype.setA20 = function(fEnable)
            {
                if (this.nBusWidth == 32) {
                    if (fEnable) {
                        if (this.aBlocks2Mb) {
                            this.setMemoryBlocks(0x100000, 0x100000, this.aBlocks2Mb);
                            this.aBlocks2Mb = null;
                        }
                    } else {
                        if (!this.aBlocks2Mb) {
                            this.aBlocks2Mb = this.getMemoryBlocks(0x100000, 0x100000);
                            this.setMemoryBlocks(0x100000, 0x100000, this.getMemoryBlocks(0x0, 0x100000));
                        }
                    }
                }
                else if (this.nBusWidth > 20) {
                    var addrMask = (this.nBusMask & ~0x100000) | (fEnable? 0x100000 : 0);
                    if (addrMask != this.nBusMask) {
                        this.nBusMask = addrMask;
                        if (this.cpu) this.cpu.setAddressMask(addrMask);
                    }
                }
            };
            
            /**
             * getWidth()
             *
             * @this {Bus}
             * @return {number}
             */
            Bus.prototype.getWidth = function()
            {
                return this.nBusWidth;
            };
            
            /**
             * setMemoryAccess(addr, size)
             *
             * Updates the access functions in every block of the specified address range.  Since the only components
             * that should be dynamically modifying the memory access functions are those that use addMemory() with a custom
             * memory controller, we require that the block(s) being updated do in fact have a controller.
             *
             * @this {Bus}
             * @param {number} addr
             * @param {number} size
             * @param {Array.<function()>} [afn]
             * @return {boolean} true if successful, false if not
             */
            Bus.prototype.setMemoryAccess = function(addr, size, afn)
            {
                if (!(addr & this.nBlockLimit) && size && !(size & this.nBlockLimit)) {
                    var iBlock = addr >>> this.nBlockShift;
                    while (size > 0) {
                        var block = this.aMemBlocks[iBlock];
                        if (!block.controller) {
                            return this.reportError(5, addr, size);
                        }
                        block.setAccess(afn);
                        size -= this.nBlockSize;
                        iBlock++;
                    }
                    return true;
                }
                return this.reportError(3, addr, size);
            };
            
            /**
             * removeMemory(addr, size)
             *
             * Replaces every block in the specified address range with empty Memory blocks that will ignore all reads/writes.
             *
             * TODO: Update the removeMemory() interface to reflect the relaxed requirements of the addMemory() interface.
             *
             * @this {Bus}
             * @param {number} addr
             * @param {number} size
             * @return {boolean} true if successful, false if not
             */
            Bus.prototype.removeMemory = function(addr, size)
            {
                if (!(addr & this.nBlockLimit) && size && !(size & this.nBlockLimit)) {
                    var iBlock = addr >>> this.nBlockShift;
                    while (size > 0) {
                        addr = iBlock * this.nBlockSize;
                        var block = this.aMemBlocks[iBlock++] = new Memory(addr);
                        if (DEBUGGER && this.dbg) {
                            block.setDebugger(this.dbg, addr, this.nBlockSize);
                        }
                        size -= this.nBlockSize;
                    }
                    return true;
                }
                return this.reportError(4, addr, size);
            };
            
            /**
             * getMemoryBlocks(addr, size)
             *
             * @this {Bus}
             * @param {number} addr is the starting physical address
             * @param {number} size of the request, in bytes
             * @return {Array} of Memory blocks
             */
            Bus.prototype.getMemoryBlocks = function(addr, size)
            {
                var aBlocks = [];
                var iBlock = addr >>> this.nBlockShift;
                while (size > 0 && iBlock < this.aMemBlocks.length) {
                    aBlocks.push(this.aMemBlocks[iBlock++]);
                    size -= this.nBlockSize;
                }
                return aBlocks;
            };
            
            /**
             * setMemoryBlocks(addr, size, aBlocks, type)
             *
             * If no type is specified, then specified address range uses all the provided blocks as-is;
             * this form of setMemoryBlocks() is used for complete physical aliases.
             *
             * Otherwise, new blocks are allocated with the specified type; the underlying memory from the
             * provided blocks is still used, but the new blocks may have different access to that memory.
             *
             * @this {Bus}
             * @param {number} addr is the starting physical address
             * @param {number} size of the request, in bytes
             * @param {Array} aBlocks as returned by getMemoryBlocks()
             * @param {number} [type] is one of the Memory.TYPE constants
             */
            Bus.prototype.setMemoryBlocks = function(addr, size, aBlocks, type)
            {
                var i = 0;
                var iBlock = addr >>> this.nBlockShift;
                while (size > 0 && iBlock < this.aMemBlocks.length) {
                    var block = aBlocks[i++];
                    this.assert(block);
                    if (!block) break;
                    if (type !== undefined) {
                        var blockNew = new Memory(addr);
                        if (DEBUGGER && this.dbg) {
                            blockNew.setDebugger(this.dbg, addr, this.nBlockSize);
                        }
                        blockNew.clone(block, type);
                        block = blockNew;
                    }
                    this.aMemBlocks[iBlock++] = block;
                    size -= this.nBlockSize;
                }
            };
            
            /**
             * getByte(addr)
             *
             * For physical addresses only; for linear addresses, use cpu.getByte().
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number} byte (8-bit) value at that address
             */
            Bus.prototype.getByte = function(addr)
            {
                return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
            };
            
            /**
             * getByteDirect(addr)
             *
             * This is useful for the Debugger and other components that want to bypass getByte() breakpoint detection.
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number} byte (8-bit) value at that address
             */
            Bus.prototype.getByteDirect = function(addr)
            {
                return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readByteDirect(addr & this.nBlockLimit, addr);
            };
            
            /**
             * getShort(addr)
             *
             * For physical addresses only; for linear addresses, use cpu.getShort().
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number} word (16-bit) value at that address
             */
            Bus.prototype.getShort = function(addr)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off != this.nBlockLimit) {
                    return this.aMemBlocks[iBlock].readShort(off, addr);
                }
                return this.aMemBlocks[iBlock++].readByte(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByte(0, addr + 1) << 8);
            };
            
            /**
             * getShortDirect(addr)
             *
             * This is useful for the Debugger and other components that want to bypass getShort() breakpoint detection.
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number} word (16-bit) value at that address
             */
            Bus.prototype.getShortDirect = function(addr)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off != this.nBlockLimit) {
                    return this.aMemBlocks[iBlock].readShortDirect(off, addr);
                }
                return this.aMemBlocks[iBlock++].readByteDirect(off, addr) | (this.aMemBlocks[iBlock & this.nBlockMask].readByteDirect(0, addr + 1) << 8);
            };
            
            /**
             * getLong(addr)
             *
             * For physical addresses only; for linear addresses, use cpu.getLong().
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number} long (32-bit) value at that address
             */
            Bus.prototype.getLong = function(addr)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off < this.nBlockLimit - 2) {
                    return this.aMemBlocks[iBlock].readLong(off, addr);
                }
                var nShift = (off & 0x3) << 3;
                return (this.aMemBlocks[iBlock].readLong(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLong(0, addr + 3) << (32 - nShift));
            };
            
            /**
             * getLongDirect(addr)
             *
             * This is useful for the Debugger and other components that want to bypass getLong() breakpoint detection.
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number} long (32-bit) value at that address
             */
            Bus.prototype.getLongDirect = function(addr)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off < this.nBlockLimit - 2) {
                    return this.aMemBlocks[iBlock].readLongDirect(off, addr);
                }
                var nShift = (off & 0x3) << 3;
                return (this.aMemBlocks[iBlock].readLongDirect(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLongDirect(0, addr + 3) << (32 - nShift));
            };
            
            /**
             * setByte(addr, b)
             *
             * For physical addresses only; for linear addresses, use cpu.setByte().
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
             */
            Bus.prototype.setByte = function(addr, b)
            {
                this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
            };
            
            /**
             * setByteDirect(addr, b)
             *
             * This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
             * memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} b is the byte (8-bit) value to write (we truncate it to 8 bits to be safe)
             */
            Bus.prototype.setByteDirect = function(addr, b)
            {
                this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeByteDirect(addr & this.nBlockLimit, b & 0xff, addr);
            };
            
            /**
             * setShort(addr, w)
             *
             * For physical addresses only; for linear addresses, use cpu.setShort().
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
             */
            Bus.prototype.setShort = function(addr, w)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off != this.nBlockLimit) {
                    this.aMemBlocks[iBlock].writeShort(off, w & 0xffff, addr);
                    return;
                }
                this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
                this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
            };
            
            /**
             * setShortDirect(addr, w)
             *
             * This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
             * memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} w is the word (16-bit) value to write (we truncate it to 16 bits to be safe)
             */
            Bus.prototype.setShortDirect = function(addr, w)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off != this.nBlockLimit) {
                    this.aMemBlocks[iBlock].writeShortDirect(off, w & 0xffff, addr);
                    return;
                }
                this.aMemBlocks[iBlock++].writeByteDirect(off, w & 0xff, addr);
                this.aMemBlocks[iBlock & this.nBlockMask].writeByteDirect(0, (w >> 8) & 0xff, addr + 1);
            };
            
            /**
             * setLong(addr, l)
             *
             * For physical addresses only; for linear addresses, use cpu.setLong().
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} l is the long (32-bit) value to write
             */
            Bus.prototype.setLong = function(addr, l)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off < this.nBlockLimit - 2) {
                    this.aMemBlocks[iBlock].writeLong(off, l);
                    return;
                }
                var lPrev, nShift = (off & 0x3) << 3;
                off &= ~0x3;
                lPrev = this.aMemBlocks[iBlock].readLong(off, addr);
                this.aMemBlocks[iBlock].writeLong(off, (lPrev & ~((0xffffffff|0) << nShift)) | (l << nShift), addr);
                iBlock = (iBlock + 1) & this.nBlockMask;
                addr += 3;
                lPrev = this.aMemBlocks[iBlock].readLong(0, addr);
                this.aMemBlocks[iBlock].writeLong(0, (lPrev & ((0xffffffff|0) << nShift)) | (l >>> (32 - nShift)), addr);
            };
            
            /**
             * setLongDirect(addr, l)
             *
             * This is useful for the Debugger and other components that want to bypass breakpoint detection AND read-only
             * memory protection (for example, this is an interface the ROM component could use to initialize ROM contents).
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} l is the long (32-bit) value to write
             */
            Bus.prototype.setLongDirect = function(addr, l)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                if (off < this.nBlockLimit - 2) {
                    this.aMemBlocks[iBlock].writeLongDirect(off, l, addr);
                    return;
                }
                var lPrev, nShift = (off & 0x3) << 3;
                off &= ~0x3;
                lPrev = this.aMemBlocks[iBlock].readLongDirect(off, addr);
                this.aMemBlocks[iBlock].writeLongDirect(off, (lPrev & ~((0xffffffff|0) << nShift)) | (l << nShift), addr);
                iBlock = (iBlock + 1) & this.nBlockMask;
                addr += 3;
                lPrev = this.aMemBlocks[iBlock].readLongDirect(0, addr);
                this.aMemBlocks[iBlock].writeLongDirect(0, (lPrev & ((0xffffffff|0) << nShift)) | (l >>> (32 - nShift)), addr);
            };
            
            /**
             * addBackTrackObject(obj, bto, off)
             *
             * If bto is null, then we create bto (ie, an object that wraps obj and records off).
             *
             * If bto is NOT null, then we verify that off is within the given bto's range; if not,
             * then we must create a new bto and return that instead.
             *
             * @this {Bus}
             * @param {Object} obj
             * @param {BackTrack} bto
             * @param {number} off (the offset within obj that this wrapper object is relative to)
             * @return {BackTrack|null}
             */
            Bus.prototype.addBackTrackObject = function(obj, bto, off)
            {
                if (BACKTRACK && obj) {
                    var cbtObjects = this.abtObjects.length;
                    if (!bto) {
                        /*
                         * Try the most recently created bto, on the off-chance it's what the caller needs
                         */
                        if (this.ibtLastAlloc >= 0) bto = this.abtObjects[this.ibtLastAlloc];
                    }
                    if (!bto || bto.obj != obj || off < bto.off || off >= bto.off + Bus.BACKTRACK.OFF_MAX) {
            
                        bto = {obj: obj, off: off, slot: 0, refs: 0};
            
                        var slot;
                        if (!this.cbtDeletions) {
                            slot = cbtObjects;
                        } else {
                            for (slot = this.ibtLastDelete; slot < cbtObjects; slot++) {
                                var btoTest = this.abtObjects[slot];
                                if (!btoTest || !btoTest.refs && !this.isBackTrackWeak(slot << Bus.BACKTRACK.SLOT_SHIFT)) {
                                    this.ibtLastDelete = slot + 1;
                                    this.cbtDeletions--;
                                    break;
                                }
                            }
                            /*
                             * There's no longer any guarantee that simply because cbtDeletions was non-zero that there WILL
                             * be an available (existing) slot, because cbtDeletions also counts weak references that may still
                             * be weak.
                             *
                             *      this.assert(slot < cbtObjects);
                             */
                        }
                        this.assert(slot < Bus.BACKTRACK.SLOT_MAX);
                        this.ibtLastAlloc = slot;
                        bto.slot = slot + 1;
                        if (slot == cbtObjects) {
                            this.abtObjects.push(bto);
                        } else {
                            this.abtObjects[slot] = bto;
                        }
                    }
                    return bto;
                }
                return null;
            };
            
            /**
             * getBackTrackIndex(bto, off)
             *
             * @this {Bus}
             * @param {BackTrack|null} bto
             * @param {number} off
             * @return {number}
             */
            Bus.prototype.getBackTrackIndex = function(bto, off)
            {
                var bti = 0;
                if (BACKTRACK && bto) {
                    bti = (bto.slot << Bus.BACKTRACK.SLOT_SHIFT) | Bus.BACKTRACK.TYPE_DATA | (off - bto.off);
                }
                return bti;
            };
            
            /**
             * writeBackTrackObject(addr, bto, off)
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {BackTrack|null} bto
             * @param {number} off
             */
            Bus.prototype.writeBackTrackObject = function(addr, bto, off)
            {
                if (BACKTRACK && bto) {
                    this.assert(off - bto.off >= 0 && off - bto.off < Bus.BACKTRACK.OFF_MAX);
                    var bti = (bto.slot << Bus.BACKTRACK.SLOT_SHIFT) | Bus.BACKTRACK.TYPE_DATA | (off - bto.off);
                    this.writeBackTrack(addr, bti);
                }
            };
            
            /**
             * readBackTrack(addr)
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @return {number}
             */
            Bus.prototype.readBackTrack = function(addr)
            {
                if (BACKTRACK) {
                    return this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].readBackTrack(addr & this.nBlockLimit);
                }
                return 0;
            };
            
            /**
             * writeBackTrack(addr, bti)
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} bti
             */
            Bus.prototype.writeBackTrack = function(addr, bti)
            {
                if (BACKTRACK) {
                    var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
                    var iBlock = (addr & this.nBusMask) >>> this.nBlockShift;
                    var btiPrev = this.aMemBlocks[iBlock].writeBackTrack(addr & this.nBlockLimit, bti);
                    var slotPrev = btiPrev >>> Bus.BACKTRACK.SLOT_SHIFT;
                    if (slot != slotPrev) {
                        this.aMemBlocks[iBlock].modBackTrack(true);
                        if (btiPrev && slotPrev) {
                            var btoPrev = this.abtObjects[slotPrev-1];
                            if (!btoPrev) {
                                if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.WARN)) {
                                    this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to empty slot (" + slotPrev + ")");
                                }
                            }
                            else if (btoPrev.refs <= 0) {
                                if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.WARN)) {
                                    this.dbg.message("writeBackTrack(%" + str.toHex(addr) + ',' + str.toHex(bti) + "): previous index (" + str.toHex(btiPrev) + ") refers to object with bad ref count (" + btoPrev.refs + ")");
                                }
                            } else if (!--btoPrev.refs) {
                                /*
                                 * We used to just slam a null into the previous slot and consider it gone, but there may still
                                 * be "weak references" to that slot (ie, it may still be associated with a register bti).
                                 *
                                 * The easiest way to handle weak references is to leave the slot allocated, with the object's ref
                                 * count sitting at zero, and change addBackTrackObject() to look for both empty slots AND non-empty
                                 * slots with a ref count of zero; in the latter case, it should again check for weak references,
                                 * after which we can re-use the slot if all its weak references are now gone.
                                 */
                                if (!this.isBackTrackWeak(btiPrev)) this.abtObjects[slotPrev-1] = null;
                                /*
                                 * TODO: Consider what the appropriate trigger should be for resetting ibtLastDelete to zero;
                                 * if we don't OCCASIONALLY set it to zero, we may never clear out obsolete weak references,
                                 * whereas if we ALWAYS set it to zero, we may be forcing addBackTrackObject() to scan the entire
                                 * table too often.
                                 *
                                 * I'd prefer to do something like this:
                                 *
                                 *      if (this.ibtLastDelete > slotPrev-1) this.ibtLastDelete = slotPrev-1;
                                 *
                                 * or even this:
                                 *
                                 *      if (this.ibtLastDelete > slotPrev-1) this.ibtLastDelete = 0;
                                 *
                                 * But neither one of those guarantees that we will at least occasionally scan the entire table.
                                 */
                                this.ibtLastDelete = 0;
                                this.cbtDeletions++;
                            }
                        }
                        if (bti && slot) {
                            var bto = this.abtObjects[slot-1];
                            if (bto) {
                                this.assert(slot == bto.slot);
                                bto.refs++;
                            }
                        }
                    }
                }
            };
            
            /**
             * isBackTrackWeak(bti)
             *
             * @param {number} bti
             * @returns {boolean} true if the given bti is still referenced by a register, false if not
             */
            Bus.prototype.isBackTrackWeak = function(bti)
            {
                var bt = this.cpu.backTrack;
                var slot = bti >> Bus.BACKTRACK.SLOT_SHIFT;
                return (bt.btiAL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiAH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiBL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiBH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiCL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiCH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiDL   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiDH   >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiBPLo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiBPHi >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiSILo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiSIHi >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiDILo >> Bus.BACKTRACK.SLOT_SHIFT == slot ||
                        bt.btiDIHi >> Bus.BACKTRACK.SLOT_SHIFT == slot
                );
            };
            
            /**
             * updateBackTrackCode(addr, bti)
             *
             * @this {Bus}
             * @param {number} addr is a physical address
             * @param {number} bti
             */
            Bus.prototype.updateBackTrackCode = function(addr, bti)
            {
                if (BACKTRACK) {
                    if (bti & Bus.BACKTRACK.TYPE_DATA) {
                        bti = (bti & ~Bus.BACKTRACK.TYPE_MASK) | Bus.BACKTRACK.TYPE_COUNT_INC;
                    } else if ((bti & Bus.BACKTRACK.TYPE_MASK) < Bus.BACKTRACK.TYPE_COUNT_MAX) {
                        bti += Bus.BACKTRACK.TYPE_COUNT_INC;
                    } else {
                        return;
                    }
                    this.aMemBlocks[(addr & this.nBusMask) >>> this.nBlockShift].writeBackTrack(addr & this.nBlockLimit, bti);
                }
            };
            
            /**
             * getBackTrackObject(bti)
             *
             * @this {Bus}
             * @param {number} bti
             * @return {Object|null}
             */
            Bus.prototype.getBackTrackObject = function(bti)
            {
                if (BACKTRACK) {
                    var slot = bti >>> Bus.BACKTRACK.SLOT_SHIFT;
                    if (slot) {
                        var bto = this.abtObjects[slot-1];
                        if (bto) return bto.obj;
                    }
                }
                return null;
            };
            
            /**
             * getBackTrackObjectFromAddr(addr)
             *
             * @this {Bus}
             * @param {number} addr
             * @return {Object|null}
             */
            Bus.prototype.getBackTrackObjectFromAddr = function(addr)
            {
                return BACKTRACK? this.getBackTrackObject(this.readBackTrack(addr)) : null;
            };
            
            /**
             * getBackTrackInfo(bti)
             *
             * @this {Bus}
             * @param {number} bti
             * @return {string|null}
             */
            Bus.prototype.getBackTrackInfo = function(bti)
            {
                if (BACKTRACK) {
                    var bto = this.getBackTrackObject(bti);
                    if (bto) {
                        var off = bti & Bus.BACKTRACK.OFF_MASK;
                        var file = bto.obj.file;
                        if (file) {
                            this.assert(!bto.off);
                            return file.sName + '[' + (bto.obj.offFile + off) + ']';
                        }
                        return bto.obj.idComponent + '[' + (bto.off + off) + ']';
                    }
                }
                return null;
            };
            
            /**
             * getBackTrackInfoFromAddr(addr)
             *
             * @this {Bus}
             * @param {number} addr
             * @return {string|null}
             */
            Bus.prototype.getBackTrackInfoFromAddr = function(addr)
            {
                return BACKTRACK? this.getBackTrackInfo(this.readBackTrack(addr)) : null;
            };
            
            /**
             * saveMemory()
             *
             * The only memory blocks we save are those marked as dirty; most likely all of RAM will have been marked dirty,
             * and even if our dirty-memory flags were as smart as our dirty-sector flags (ie, were set only when a write changed
             * what was already there), it's unlikely that would reduce the number of RAM blocks we must save/restore.  At least
             * all the ROM blocks should be clean (except in the unlikely event that the Debugger was used to modify them).
             *
             * All dirty blocks will be stored in a single array, as pairs of block numbers and data arrays, like so:
             *
             *      [iBlock0, [dw0, dw1, ...], iBlock1, [dw0, dw1, ...], ...]
             *
             * In a normal 4Kb block, there will be 1K DWORD values in the data array.  Remember that each DWORD is a signed 32-bit
             * integer (because they are formed using bit-wise operator rather than floating-point math operators), so don't be
             * surprised to see negative numbers in the data.
             *
             * The above example assumes "uncompressed" data arrays.  If we choose to use "compressed" data arrays, the data arrays
             * will look like:
             *
             *      [count0, dw0, count1, dw1, ...]
             *
             * where each count indicates how many times the following DWORD value occurs.  A data array length less than 1K indicates
             * that it's compressed, since we'll only store them in compressed form if they actually shrank, and we'll use State
             * helper methods compress() and decompress() to create and expand the compressed data arrays.
             *
             * @this {Bus}
             * @return {Array} a
             */
            Bus.prototype.saveMemory = function()
            {
                var i = 0;
                var a = [];
                for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
                    var block = this.aMemBlocks[iBlock];
                    /*
                     * We have to check both fDirty and fDirtyEver, because we may have called cleanMemory() on some of
                     * the memory blocks (eg, video memory), and while cleanMemory() will clear a dirty block's fDirty flag,
                     * it also sets the dirty block's fDirtyEver flag, which is left set for the lifetime of the machine.
                     */
                    if (block.fDirty || block.fDirtyEver) {
                        a[i++] = iBlock;
                        a[i++] = State.compress(block.save());
                    }
                }
                a[i] = this.getA20();
                return a;
            };
            
            /**
             * restoreMemory(a)
             *
             * This restores the contents of all Memory blocks; called by X86CPU.restore().
             *
             * In theory, we ONLY have to save/restore block contents.  Other block attributes,
             * like the type, the memory controller (if any), and the active memory access functions,
             * should already be restored, since every component (re)allocates all the memory blocks
             * it was using when it's restored.  And since the CPU is guaranteed to be the last
             * component to be restored, all those blocks (and their attributes) should be in place now.
             *
             * See saveMemory() for a description of how the memory block contents are saved.
             *
             * @this {Bus}
             * @param {Array} a
             * @return {boolean} true if successful, false if not
             */
            Bus.prototype.restoreMemory = function(a)
            {
                var i;
                for (i = 0; i < a.length - 1; i += 2) {
                    var iBlock = a[i];
                    var adw = a[i+1];
                    if (adw && adw.length < this.nBlockLen) {
                        adw = State.decompress(adw, this.nBlockLen);
                    }
                    var block = this.aMemBlocks[iBlock];
                    if (!block || !block.restore(adw)) {
                        /*
                         * Either the block to restore hasn't been allocated, indicating a change in the machine
                         * configuration since it was last saved (the most likely explanation) or there's some internal
                         * inconsistency (eg, the block size is wrong).
                         */
                        Component.error("Unable to restore memory block " + iBlock);
                        return false;
                    }
                }
                if (a[i] !== undefined) this.setA20(a[i]);
                return true;
            };
            
            /**
             * addMemBreak(addr, fWrite)
             *
             * @this {Bus}
             * @param {number} addr
             * @param {boolean} fWrite is true for a memory write breakpoint, false for a memory read breakpoint
             */
            Bus.prototype.addMemBreak = function(addr, fWrite)
            {
                if (DEBUGGER) {
                    var iBlock = addr >>> this.nBlockShift;
                    this.aMemBlocks[iBlock].addBreakpoint(addr & this.nBlockLimit, fWrite);
                }
            };
            
            /**
             * removeMemBreak(addr, fWrite)
             *
             * @this {Bus}
             * @param {number} addr
             * @param {boolean} fWrite is true for a memory write breakpoint, false for a memory read breakpoint
             */
            Bus.prototype.removeMemBreak = function(addr, fWrite)
            {
                if (DEBUGGER) {
                    var iBlock = addr >>> this.nBlockShift;
                    this.aMemBlocks[iBlock].removeBreakpoint(addr & this.nBlockLimit, fWrite);
                }
            };
            
            /**
             * addPortInputBreak(port)
             *
             * @this {Bus}
             * @param {number} [port]
             * @return {boolean} true if break on port input enabled, false if disabled
             */
            Bus.prototype.addPortInputBreak = function(port)
            {
                if (port === undefined) {
                    this.fPortInputBreakAll = !this.fPortInputBreakAll;
                    return this.fPortInputBreakAll;
                }
                if (this.aPortInputNotify[port] === undefined) {
                    this.aPortInputNotify[port] = [null, null, false];
                }
                this.aPortInputNotify[port][2] = !this.aPortInputNotify[port][2];
                return this.aPortInputNotify[port][2];
            };
            
            /**
             * addPortInputNotify(start, end, component, fn)
             *
             * Add a port input-notification handler to the list of such handlers.
             *
             * @this {Bus}
             * @param {number} start port address
             * @param {number} end port address
             * @param {Component} component
             * @param {function(number,number)} fn is called with the port and LIP values at the time of the input
             */
            Bus.prototype.addPortInputNotify = function(start, end, component, fn)
            {
                if (fn !== undefined) {
                    for (var port = start; port <= end; port++) {
                        if (this.aPortInputNotify[port] !== undefined) {
                            Component.warning("Input port " + str.toHexWord(port) + " registered by " + this.aPortInputNotify[port][0].id + ", ignoring " + component.id);
                            continue;
                        }
                        this.aPortInputNotify[port] = [component, fn, false, false];
                        if (MAXDEBUG) this.log("addPortInputNotify(" + str.toHexWord(port) + "," + component.id + ")");
                    }
                }
            };
            
            /**
             * addPortInputTable(component, table, offset)
             *
             * Add port input-notification handlers from the specified table (a batch version of addPortInputNotify)
             *
             * @this {Bus}
             * @param {Component} component
             * @param {Object} table
             * @param {number} [offset] is an optional port offset
             */
            Bus.prototype.addPortInputTable = function(component, table, offset)
            {
                if (offset === undefined) offset = 0;
                for (var port in table) {
                    this.addPortInputNotify(+port + offset, +port + offset, component, table[port]);
                }
            };
            
            /**
             * checkPortInputNotify(port, addrLIP)
             *
             * @this {Bus}
             * @param {number} port
             * @param {number} [addrLIP] is the LIP value at the time of the input
             * @return {number} simulated port value (0xff if none)
             *
             * NOTE: It seems that at least parts of the ROM BIOS (like the RS-232 probes around F000:E5D7 in the 5150 BIOS)
             * assume that ports for non-existent hardware return 0xff rather than 0x00, hence my new default (0xff) below.
             */
            Bus.prototype.checkPortInputNotify = function(port, addrLIP)
            {
                var bIn = 0xff;
                var aNotify = this.aPortInputNotify[port];
            
                if (BACKTRACK) {
                    this.cpu.backTrack.btiIO = 0;
                }
                if (aNotify !== undefined) {
                    if (aNotify[1]) {
                        var b = aNotify[1].call(aNotify[0], port, addrLIP);
                        if (b !== undefined) bIn = b;
                    }
                    if (DEBUGGER && this.dbg && this.fPortInputBreakAll != aNotify[2]) {
                        this.dbg.checkPortInput(port, bIn);
                    }
                }
                else {
                    if (DEBUGGER && this.dbg) {
                        this.dbg.messageIO(this, port, null, addrLIP);
                        if (this.fPortInputBreakAll) this.dbg.checkPortInput(port, bIn);
                    }
                }
                return bIn;
            };
            
            /**
             * removePortInputNotify(start, end, component, fn)
             *
             * Remove a port input-notification handler from the list of such handlers (to be ENABLED later if needed)
             *
             * @this {Bus}
             * @param {number} start address
             * @param {number} end address
             * @param {Component} component
             * @param {function(number,number)} fn of previously added handler
             *
            Bus.prototype.removePortInputNotify = function(start, end, component, fn)
             {
                for (var port = start; port < end; port++) {
                    if (this.aPortInputNotify[port] && this.aPortInputNotify[port][0] == component && this.aPortInputNotify[port][1] == fn) {
                        this.aPortInputNotify[port] = undefined;
                    }
                }
            };
             */
            
            /**
             * addPortOutputBreak(port)
             *
             * @this {Bus}
             * @param {number} [port]
             * @return {boolean} true if break on port output enabled, false if disabled
             */
            Bus.prototype.addPortOutputBreak = function(port)
            {
                if (port === undefined) {
                    this.fPortOutputBreakAll = !this.fPortOutputBreakAll;
                    return this.fPortOutputBreakAll;
                }
                if (this.aPortOutputNotify[port] === undefined) {
                    this.aPortOutputNotify[port] = [null, null, false];
                }
                this.aPortOutputNotify[port][2] = !this.aPortOutputNotify[port][2];
                return this.aPortOutputNotify[port][2];
            };
            
            /**
             * addPortOutputNotify(start, end, component, fn)
             *
             * Add a port output-notification handler to the list of such handlers.
             *
             * @this {Bus}
             * @param {number} start port address
             * @param {number} end port address
             * @param {Component} component
             * @param {function(number,number)} fn is called with the port and LIP values at the time of the output
             */
            Bus.prototype.addPortOutputNotify = function(start, end, component, fn)
            {
                if (fn !== undefined) {
                    for (var port = start; port <= end; port++) {
                        if (this.aPortOutputNotify[port] !== undefined) {
                            Component.warning("Output port " + str.toHexWord(port) + " registered by " + this.aPortOutputNotify[port][0].id + ", ignoring " + component.id);
                            continue;
                        }
                        this.aPortOutputNotify[port] = [component, fn, false, false];
                        if (MAXDEBUG) this.log("addPortOutputNotify(" + str.toHexWord(port) + "," + component.id + ")");
                    }
                }
            };
            
            /**
             * addPortOutputTable(component, table, offset)
             *
             * Add port output-notification handlers from the specified table (a batch version of addPortOutputNotify)
             *
             * @this {Bus}
             * @param {Component} component
             * @param {Object} table
             * @param {number} [offset] is an optional port offset
             */
            Bus.prototype.addPortOutputTable = function(component, table, offset)
            {
                if (offset === undefined) offset = 0;
                for (var port in table) {
                    this.addPortOutputNotify(+port + offset, +port + offset, component, table[port]);
                }
            };
            
            /**
             * checkPortOutputNotify(port, bOut, addrLIP)
             *
             * @this {Bus}
             * @param {number} port
             * @param {number} bOut
             * @param {number} [addrLIP] is the LIP value at the time of the output
             */
            Bus.prototype.checkPortOutputNotify = function(port, bOut, addrLIP)
            {
                var aNotify = this.aPortOutputNotify[port];
                if (aNotify !== undefined) {
                    if (aNotify[1]) {
                        aNotify[1].call(aNotify[0], port, bOut, addrLIP);
                    }
                    if (DEBUGGER && this.dbg && this.fPortOutputBreakAll != aNotify[2]) {
                        this.dbg.checkPortOutput(port, bOut);
                    }
                }
                else {
                    if (DEBUGGER && this.dbg) {
                        this.dbg.messageIO(this, port, bOut, addrLIP);
                        if (this.fPortOutputBreakAll) this.dbg.checkPortOutput(port, bOut);
                    }
                }
            };
            
            /**
             * removePortOutputNotify(start, end, component, fn)
             *
             * Remove a port output-notification handler from the list of such handlers (to be ENABLED later if needed)
             *
             * @this {Bus}
             * @param {number} start address
             * @param {number} end address
             * @param {Component} component
             * @param {function(number,number)} fn of previously added handler
             *
            Bus.prototype.removePortOutputNotify = function(start, end, component, fn)
             {
                for (var port = start; port < end; port++) {
                    if (this.aPortOutputNotify[port] && this.aPortOutputNotify[port][0] == component && this.aPortOutputNotify[port][1] == fn) {
                        this.aPortOutputNotify[port] = undefined;
                    }
                }
            };
             */
            
            /**
             * reportError(op, addr, size)
             *
             * @this {Bus}
             * @param {number} op
             * @param {number} addr
             * @param {number} size
             * @return {boolean} false
             */
            Bus.prototype.reportError = function(op, addr, size)
            {
                Component.error("Memory block error (" + op + "," + str.toHex(addr) + "," + str.toHex(size) + ")");
                return false;
            };
            
            if (typeof module !== 'undefined') module.exports = Bus;
            
          • chipset.js
            /**
             * @fileoverview Implements the PCjs ChipSet component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-14
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var usr         = require("../../shared/lib/usrlib");
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Interrupts  = require("./interrupts");
                var Messages    = require("./messages");
                var State       = require("./state");
            }
            
            /**
             * ChipSet(parmsChipSet)
             *
             * The ChipSet component has the following component-specific (parmsChipSet) properties:
             *
             *      model:          "5150", "5160", "5170" or "deskpro386" (should be a member of ChipSet.MODELS)
             *      sw1:            8-character binary string representing the SW1 DIP switches (SW1[1-8])
             *      sw2:            8-character binary string representing the SW2 DIP switches (SW2[1-8]) (MODEL_5150 only)
             *      sound:          true to enable (experimental) sound support (default); false to disable
             *      scaleTimers:    true to divide timer cycle counts by the CPU's cycle multiplier (default is false)
             *      floppies:       array of floppy drive sizes in Kb (default is "[360, 360]" if no sw1 value provided)
             *      monitor:        none|tv|color|mono|ega|vga (if no sw1 value provided, default is "ega" for 5170, "mono" otherwise)
             *      rtcDate:        optional RTC date/time (in GMT) to use on reset; use the ISO 8601 format; eg: "2014-10-01T08:00:00"
             *
             * The conventions used for the sw1 and sw2 strings are that the left-most character represents DIP switch [1],
             * the right-most character represents DIP switch [8], and "1" means the DIP switch is ON and "0" means it is OFF.
             *
             * Internally, we convert the above strings into binary values that the 8255A PPI returns, where DIP switch [1]
             * is bit 0 and DIP switch [8] is bit 7, and 0 indicates the switch is ON and 1 indicates it is OFF.
             *
             * For reference, here's how the SW1 and SW2 switches correspond to the internal 8255A PPI bit values:
             *
             *      SW1[1]    (bit 0)     "0xxxxxxx" (1):  IPL,  "1xxxxxxx" (0):  No IPL
             *      SW1[2]    (bit 1)     reserved
             *      SW1[3,4]  (bits 3-2)  "xx11xxxx" (00): 16Kb, "xx01xxxx" (01): 32Kb,  "xx10xxxx" (10): 48Kb,  "xx00xxxx" (11): 64Kb
             *      SW1[5,6]  (bits 5-4)  "xxxx11xx" (00): none, "xxxx01xx" (01): tv,    "xxxx10xx" (10): color, "xxxx00xx" (11): mono
             *      SW1[7,8]  (bits 7-6)  "xxxxxx11" (00): 1 FD, "xxxxxx01" (01): 2 FD,  "xxxxxx10" (10): 3 FD,  "xxxxxx00" (11): 4 FD
             *
             * Note: FD refers to floppy drive, and IPL refers to an "Initial Program Load" floppy drive.
             *
             *      SW2[1-4]    (bits 3-0)  "NNNNxxxx": number of 32Kb blocks of I/O expansion RAM present
             *
             * TODO: There are cryptic references to SW2[5] in the original (5150) TechRef, and apparently the 8255A PPI can
             * be programmed to return it (which we support), but its purpose remains unclear to me (see PPI_B.ENABLE_SW2).
             *
             * For example, sw1="01110011" indicates that all SW1 DIP switches are ON, except for SW1[1], SW1[5] and SW1[6],
             * which are OFF.  Internally, the order of these bits must reversed (to 11001110) and then inverted (to 00110001)
             * to yield the value that the 8255A PPI returns.  Reading the final value right-to-left, 00110001 indicates an
             * IPL floppy drive, 1X of RAM (where X is 16Kb on a MODEL_5150 and 64Kb on a MODEL_5160), MDA, and 1 floppy drive.
             *
             * WARNING: It is possible to set SW1 to indicate more memory than the RAM component has been configured to provide.
             * This is a configuration error which will cause the machine to crash after reporting a "201" error code (memory
             * test failure), which is presumably what a real machine would do if it was similarly misconfigured.  Surprisingly,
             * the BIOS forges ahead, setting SP to the top of the memory range indicated by SW1 (via INT 0x12), but the lack of
             * a valid stack causes the system to crash after the next IRET.  The BIOS should have either halted or modified
             * the actual memory size to match the results of the memory test.
             *
             * This module provides support for many of the following components (except where a separate component is noted).
             * This list is taken from p.1-8 ("System Unit") of the IBM 5160 (PC XT) Technical Reference Manual (as revised
             * April 1983), only because I didn't see a similar listing in the original 5150 TechRef.
             *
             *      Port(s)         Description
             *      -------         -----------
             *      000-00F         DMA Chip 8237A-5                                [see below]
             *      020-021         Interrupt 8259A                                 [see below]
             *      040-043         Timer 8253-5                                    [see below]
             *      060-063         PPI 8255A-5                                     [see below]
             *      080-083         DMA Page Registers                              [see below]
             *          0Ax [1]     NMI Mask Register                               [see below]
             *          0Cx         Reserved
             *          0Ex         Reserved
             *      200-20F         Game Control
             *      210-217         Expansion Unit
             *      220-24F         Reserved
             *      278-27F         Reserved
             *      2F0-2F7         Reserved
             *      2F8-2FF         Asynchronous Communications (Secondary)         [see the SerialPort component]
             *      300-31F         Prototype Card
             *      320-32F         Hard Drive Controller (XTC)                     [see the HDC component]
             *      378-37F         Printer
             *      380-38C [2]     SDLC Communications
             *      380-389 [2]     Binary Synchronous Communications (Secondary)
             *      3A0-3A9         Binary Synchronous Communications (Primary)
             *      3B0-3BF         IBM Monochrome Display/Printer                  [see the Video component]
             *      3C0-3CF         Reserved
             *      3D0-3DF         Color/Graphics (Motorola 6845)                  [see the Video component]
             *      3EO-3E7         Reserved
             *      3FO-3F7         Floppy Drive Controller                         [see the FDC component]
             *      3F8-3FF         Asynchronous Communications (Primary)           [see the SerialPort component]
             *
             * [1] At power-on time, NMI is masked off, perhaps because models 5150 and 5160 also tie coprocessor
             * interrupts to NMI.  Suppressing NMI by default seems odd, because that would also suppress memory
             * parity errors.  TODO: Determine whether "power-on time" refers to the initial power-on state of the
             * NMI Mask Register or the state that the BIOS "POST" (Power-On Self-Test) sets.
             *
             * [2] These devices cannot be used together since their port addresses overlap.
             *
             *      MODEL_5170      Description
             *      ----------      -----------
             *          070 [3]     CMOS Address                                    ChipSet.CMOS.ADDR.PORT
             *          071         CMOS Data                                       ChipSet.CMOS.DATA.PORT
             *          0F0         Coprocessor Clear Busy (output 0x00)
             *          0F1         Coprocessor Reset (output 0x00)
             *      1F0-1F7         Hard Drive Controller (ATC)                     [see the HDC component]
             *
             * [3] Port 0x70 doubles as the NMI Mask Register: output a CMOS address with bit 7 clear to enable NMI
             * or with bit 7 set to disable NMI (apparently the inverse of the older NMI Mask Register at port 0xA0).
             * Also, apparently unlike previous models, the MODEL_5170 POST leaves NMI enabled.  And fortunately, the
             * coprocessor interrupt line is no longer tied to NMI (it uses IRQ 13).
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsChipSet
             */
            function ChipSet(parmsChipSet)
            {
                Component.call(this, "ChipSet", parmsChipSet, ChipSet, Messages.CHIPSET);
            
                this.model = parmsChipSet['model'];
                this.model = this.model && ChipSet.MODELS[this.model] || ChipSet.MODEL_5150;
            
                /*
                 * SW1 describes the number of floppy drives, the amount of base memory, the primary monitor type,
                 * and (on the MODEL_5160) whether or not a coprocessor is installed.  If no SW1 settings are provided,
                 * we look for individual 'floppies' and 'monitor' settings and build a default SW1 value.
                 *
                 * The defaults below select max memory, monochrome monitor (EGA monitor for MODEL_5170), and two floppies.
                 * Don't get too excited about "max memory" either: on a MODEL_5150, the max was 64Kb, and on a MODEL_5160,
                 * the max was 256Kb.  However, the RAM component is free to install as much base memory as it likes,
                 * overriding the SW1 memory setting.
                 *
                 * Given that the ROM BIOS is hard-coded to load boot sectors @0000:7C00, the minimum amount of system RAM
                 * required to boot is therefore 32Kb.  Whether that's actually enough to run any or all versions of PC-DOS is
                 * a separate question.  FYI, with only 16Kb, the ROM BIOS will still try to boot, and fail miserably.
                 */
                this.sw1Init = 0;
                var sw1 = parmsChipSet['sw1'];
                if (sw1) {
                    this.sw1Init = this.parseSwitches(sw1, ChipSet.PPI_SW.MEMORY.X4 | ChipSet.PPI_SW.MONITOR.MONO);
                } else {
                    this.aFloppyDrives = [360, 360];
                    var aFloppyDrives = parmsChipSet['floppies'];
                    if (aFloppyDrives && aFloppyDrives.length) this.aFloppyDrives = aFloppyDrives;
                    var nDrives = this.aFloppyDrives.length;
                    if (nDrives) {
                        this.sw1Init |= ChipSet.PPI_SW.FDRIVE.IPL;
                        nDrives--;
                        this.sw1Init |= ((nDrives & 0x3) << ChipSet.PPI_SW.FDRIVE.SHIFT);
                    }
                    var sMonitor = parmsChipSet['monitor'] || (this.model < ChipSet.MODEL_5170? "mono" : "ega");
                    if (sMonitor && ChipSet.aMonitorSwitches[sMonitor] !== undefined) {
                        this.sw1Init |= (ChipSet.aMonitorSwitches[sMonitor] << ChipSet.PPI_SW.MONITOR.SHIFT);
                    }
                }
            
                /*
                 * SW2 describes the number of 32Kb blocks of I/O expansion RAM that's present in the system. The MODEL_5150
                 * ROM BIOS only checked/supported the first four switches, so the maximum amount of additional RAM specifiable
                 * was 15 * 32Kb, or 480Kb.  With a maximum of 64Kb on the motherboard, the MODEL_5150 ROM BIOS could support
                 * a grand total of 544Kb.
                 *
                 * For MODEL_5160 (PC XT) and up, memory expansion cards had their own configuration switches, and the motherboard
                 * SW2 switches for I/O expansion RAM were eliminated.  Instead, the ROM BIOS scans the entire address space
                 * (up to 0xA0000) looking for additional memory.  As a result, the only mechanism we provide for adding RAM
                 * (above the maximum of 256Kb supported on the motherboard) is the "size" parameter of the RAM component.
                 *
                 * NOTE: If you use the "size" parameter, you will not be able to dynamically alter the memory configuration;
                 * the RAM component will ignore any changes to SW1.
                 */
                this.sw2Init = this.parseSwitches(parmsChipSet['sw2'] || "11110000", 0);
            
                /*
                 * The SW1 memory setting is actually just a multiplier: it's multiplied by 16Kb on a MODEL_5150, 64Kb otherwise.
                 */
                this.kbSW = (this.model == ChipSet.MODEL_5150? 16 : 64);
            
                this.cDMACs = this.cPICs = 1;
                if (this.model >= ChipSet.MODEL_5170) {
                    this.cDMACs = this.cPICs = 2;
                }
            
                this.fScaleTimers = parmsChipSet['scaleTimers'] || false;
                this.sRTCDate = parmsChipSet['rtcDate'];
            
                /*
                 * Here, I'm finally getting around to trying the Web Audio API.  Fortunately, based on what little I know about
                 * sound generation, using the API to make the same noises as the IBM PC speaker seems straightforward.
                 *
                 * To start, we create an audio context, unless the 'sound' parameter has been explicitly set to false.
                 *
                 * From:
                 *
                 *      http://developer.apple.com/library/safari/#documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/PlayingandSynthesizingSounds/PlayingandSynthesizingSounds.html
                 *
                 * "Similar to how HTML5 canvas requires a context on which lines and curves are drawn, Web Audio requires an audio context
                 *  on which sounds are played and manipulated. This context will be the parent object of further audio objects to come....
                 *  Your audio context is typically created when your page initializes and should be long-lived. You can play multiple sounds
                 *  coming from multiple sources within the same context, so it is unnecessary to create more than one audio context per page."
                 */
                this.fSpeaker = false;
                if (parmsChipSet['sound']) {
                    this.classAudio = this.contextAudio = null;
                    if (window) {
                        this.classAudio = window['AudioContext'] || window['webkitAudioContext'];
                    }
                    if (this.classAudio) {
                        this.contextAudio = new this.classAudio();
                    } else {
                        if (DEBUG) this.log("AudioContext not available");
                    }
                }
            
                /*
                 * I used to defer ChipSet's reset() to powerUp(), which then gave us the option of doing either
                 * reset() OR restore(), instead of both.  However, on MODEL_5170 machines, the initial CMOS data
                 * needs to be created earlier, so that when other components are initializing their state (eg, when
                 * HDC calls setCMOSDriveType() or RAM calls addCMOSMemory()), the CMOS will be ready to take their calls.
                 */
                this.reset(true);
            
                this.setReady();
            }
            
            Component.subclass(ChipSet);
            
            /*
             * Supported model numbers
             *
             * Unless otherwise noted, all BIOS references refer to the *original* BIOS released with each model.
             */
            ChipSet.MODEL_5150      = 5150;         // used in reference to the 1st 5150 BIOS, dated Apr 24, 1981
            ChipSet.MODEL_5160      = 5160;         // used in reference to the 1st 5160 BIOS, dated Nov 8, 1982
            ChipSet.MODEL_5170      = 5170;         // used in reference to the 1st 5170 BIOS, dated Jan 10, 1984
            
            /*
             * The following are fake model numbers, used only to document issues/features in later IBM PC AT BIOS revisions.
             */
            ChipSet.MODEL_5170_REV2 = 5170.2;       // used in reference to the 2nd 5170 BIOS, dated Jun 10, 1985
            ChipSet.MODEL_5170_REV3 = 5170.3;       // used in reference to the 3rd 5170 BIOS, dated Nov 15, 1985
            
            /*
             * The following are even more fake model numbers, as we begin to depart from the IBM lineage.  All that
             * really matters at this point is that MODEL_DESKPRO386 > MODEL_5170.
             */
            ChipSet.MODEL_DESKPRO386 = 5180;
            
            /*
             * Last but not least, a complete list of supported model strings, and corresponding internal model numbers.
             */
            ChipSet.MODELS = {
                "5150":         ChipSet.MODEL_5150,
                "5160":         ChipSet.MODEL_5160,
                "5170":         ChipSet.MODEL_5170,
                "deskpro386":   ChipSet.MODEL_DESKPRO386
            };
            
            /*
             * Values returned by ChipSet.getSWVideoMonitor()
             */
            ChipSet.MONITOR = {
                NONE:               0,
                TV:                 1,  // Composite monitor (lower resolution; no support)
                COLOR:              2,  // Color Display (5153)
                MONO:               3,  // Monochrome Display (5151)
                EGACOLOR:           4,  // Enhanced Color Display (5154) in High-Res Mode
                EGAEMULATION:       6,  // Enhanced Color Display (5154) in Emulation Mode
                VGACOLOR:           7   // VGA Color Display
            };
            
            /*
             * Lookup table for converting ChipSet "monitor" values into the corresponding SW1 switch bits
             * (they must be shifted left by ChipSet.PPI_SW.MONITOR.SHIFT before OR'ing them into sw1/sw1Init).
             */
            ChipSet.aMonitorSwitches = {
                "none":             0x0,
                "tv":               0x1,
                "color":            0x2,
                "mono":             0x3,
                "ega":              0x0,
                "vga":              0x0
            };
            
            /*
             *  8237A DMA Controller (DMAC) I/O ports
             *
             *  MODEL_5150 and up uses DMA channel 0 for memory refresh cycles and channel 2 for the FDC.
             *
             *  MODEL_5160 and up uses DMA channel 3 for HDC transfers (XTC only).
             *
             *  DMA0 refers to the original DMA controller found on all models, and DMA1 refers to the additional
             *  controller found on MODEL_5170 and up; channel 4 on DMA1 is used to "cascade" channels 0-3 from DMA0,
             *  so only channels 5-7 are available on DMA1.
             *
             *  For FDC DMA notes, refer to http://wiki.osdev.org/ISA_DMA
             *  For general DMA notes, refer to http://www.freebsd.org/doc/en/books/developers-handbook/dma.html
             *
             *  TODO: Determine why the MODEL_5150 ROM BIOS sets the DMA channel 1 page register (port 0x83) to zero.
             */
            ChipSet.DMA0 = {
                INDEX:              0,
                PORT: {
                    CH0_ADDR:       0x00,   // OUT: starting address        IN: current address
                    CH0_COUNT:      0x01,   // OUT: starting word count     IN: remaining word count
                    CH1_ADDR:       0x02,   // OUT: starting address        IN: current address
                    CH1_COUNT:      0x03,   // OUT: starting word count     IN: remaining word count
                    CH2_ADDR:       0x04,   // OUT: starting address        IN: current address
                    CH2_COUNT:      0x05,   // OUT: starting word count     IN: remaining word count
                    CH3_ADDR:       0x06,   // OUT: starting address        IN: current address
                    CH3_COUNT:      0x07,   // OUT: starting word count     IN: remaining word count
                    CMD_STATUS:     0x08,   // OUT: command register        IN: status register
                    REQUEST:        0x09,
                    MASK:           0x0A,
                    MODE:           0x0B,
                    RESET_FF:       0x0C,   // reset flip-flop
                    MASTER_CLEAR:   0x0D,   // master clear
                    MASK_CLEAR:     0x0E,   // TODO: Provide handlers
                    MASK_ALL:       0x0F,   // TODO: Provide handlers
                    CH2_PAGE:       0x81,   // OUT: DMA channel 2 page register
                    CH3_PAGE:       0x82,   // OUT: DMA channel 3 page register
                    CH1_PAGE:       0x83,   // OUT: DMA channel 1 page register
                    CH0_PAGE:       0x87    // OUT: DMA channel 0 page register (unusable; See "The Inside Out" book, p.246)
                }
            };
            ChipSet.DMA1 = {
                INDEX:              1,
                PORT: {
                    CH6_PAGE:       0x89,   // OUT: DMA channel 6 page register (MODEL_5170)
                    CH7_PAGE:       0x8A,   // OUT: DMA channel 7 page register (MODEL_5170)
                    CH5_PAGE:       0x8B,   // OUT: DMA channel 5 page register (MODEL_5170)
                    CH4_PAGE:       0x8F,   // OUT: DMA channel 4 page register (MODEL_5170; unusable; aka "Refresh" page register?)
                    CH4_ADDR:       0xC0,   // OUT: starting address        IN: current address
                    CH4_COUNT:      0xC2,   // OUT: starting word count     IN: remaining word count
                    CH5_ADDR:       0xC4,   // OUT: starting address        IN: current address
                    CH5_COUNT:      0xC6,   // OUT: starting word count     IN: remaining word count
                    CH6_ADDR:       0xC8,   // OUT: starting address        IN: current address
                    CH6_COUNT:      0xCA,   // OUT: starting word count     IN: remaining word count
                    CH7_ADDR:       0xCC,   // OUT: starting address        IN: current address
                    CH7_COUNT:      0xCE,   // OUT: starting word count     IN: remaining word count
                    CMD_STATUS:     0xD0,   // OUT: command register        IN: status register
                    REQUEST:        0xD2,
                    MASK:           0xD4,
                    MODE:           0xD6,
                    RESET_FF:       0xD8,   // reset flip-flop
                    MASTER_CLEAR:   0xDA,   // master clear
                    MASK_CLEAR:     0xDC,   // TODO: Provide handlers
                    MASK_ALL:       0xDE    // TODO: Provide handlers
                }
            };
            
            ChipSet.DMA_CMD = {
                M2M_ENABLE:         0x01,
                CH0HOLD_ENABLE:     0x02,
                CTRL_DISABLE:       0x04,
                COMP_TIMING:        0x08,
                ROT_PRIORITY:       0x10,
                EXT_WRITE_SEL:      0x20,
                DREQ_ACTIVE_LO:     0x40,
                DACK_ACTIVE_HI:     0x80
            };
            
            ChipSet.DMA_STATUS = {
                CH0_TC:             0x01,   // Channel 0 has reached Terminal Count (TC)
                CH1_TC:             0x02,   // Channel 1 has reached Terminal Count (TC)
                CH2_TC:             0x04,   // Channel 2 has reached Terminal Count (TC)
                CH3_TC:             0x08,   // Channel 3 has reached Terminal Count (TC)
                ALL_TC:             0x0f,   // all TC bits are cleared whenever DMA_STATUS is read
                CH0_REQ:            0x10,   // Channel 0 DMA requested
                CH1_REQ:            0x20,   // Channel 1 DMA requested
                CH2_REQ:            0x40,   // Channel 2 DMA requested
                CH3_REQ:            0x80    // Channel 3 DMA requested
            };
            
            ChipSet.DMA_MASK = {
                CHANNEL:            0x03,
                CHANNEL_SET:        0x04
            };
            
            ChipSet.DMA_MODE = {
                CHANNEL:            0x03,   // bits 0-1 select 1 of 4 possible channels
                TYPE:               0x0C,   // bits 2-3 select 1 of 3 valid (4 possible) transfer types
                TYPE_VERIFY:        0x00,   // pseudo transfer (generates addresses, responds to EOP, but nothing is moved)
                TYPE_WRITE:         0x04,   // write to memory (move data FROM an I/O device; eg, reading a sector from a disk)
                TYPE_READ:          0x08,   // read from memory (move data TO an I/O device; eg, writing a sector to a disk)
                AUTOINIT:           0x10,
                DECREMENT:          0x20,   // clear for INCREMENT
                MODE:               0xC0,   // bits 6-7 select 1 of 4 possible transfer modes
                MODE_DEMAND:        0x00,
                MODE_SINGLE:        0x40,
                MODE_BLOCK:         0x80,
                MODE_CASCADE:       0xC0
            };
            
            ChipSet.DMA_REFRESH   = 0x00;   // DMA channel assigned to memory refresh
            ChipSet.DMA_FDC       = 0x02;   // DMA channel assigned to the Floppy Drive Controller (FDC)
            ChipSet.DMA_HDC       = 0x03;   // DMA channel assigned to the Hard Drive Controller (HDC; XTC only)
            
            /*
             * 8259A Programmable Interrupt Controller (PIC) I/O ports
             *
             * Internal registers:
             *
             *      ICW1    Initialization Command Word 1 (sent to port ChipSet.PIC_LO)
             *      ICW2    Initialization Command Word 2 (sent to port ChipSet.PIC_HI)
             *      ICW3    Initialization Command Word 3 (sent to port ChipSet.PIC_HI)
             *      ICW4    Initialization Command Word 4 (sent to port ChipSet.PIC_HI)
             *      IMR     Interrupt Mask Register
             *      IRR     Interrupt Request Register
             *      ISR     Interrupt Service Register
             *      IRLow   (IR having lowest priority; IR+1 will have highest priority; default is 7)
             *
             * Note that ICW2 effectively contains the starting IDT vector number (ie, for IRQ 0),
             * which must be multiplied by 4 to calculate the vector offset, since every vector is 4 bytes long.
             *
             * Also, since the low 3 bits of ICW2 are ignored in 8086/8088 mode (ie, they are effectively
             * treated as zeros), this means that the starting IDT vector can only be a multiple of 8.
             *
             * So, if ICW2 is set to 0x08, the starting vector number (ie, for IRQ 0) will be 0x08, and the
             * 4-byte address for the corresponding ISR will be located at offset 0x20 in the real-mode IDT.
             *
             * ICW4 is typically set to 0x09, indicating 8086 mode, non-automatic EOI, buffered/slave mode.
             *
             * TODO: Determine why the original ROM BIOS chose buffered/slave over buffered/master.
             * Did it simply not matter in pre-AT systems with only one PIC, or am I misreading something?
             *
             * TODO: Consider support for level-triggered PIC interrupts, even though the original IBM PCs
             * (up through MODEL_5170) used only edge-triggered interrupts.
             */
            ChipSet.PIC0 = {                // all models: the "master" PIC
                INDEX:              0,
                PORT_LO:            0x20,
                PORT_HI:            0x21
            };
            
            ChipSet.PIC1 = {                // MODEL_5170 and up: the "slave" PIC
                INDEX:              1,
                PORT_LO:            0xA0,
                PORT_HI:            0xA1
            };
            
            ChipSet.PIC_LO = {              // ChipSet.PIC1.PORT_LO or ChipSet.PIC2.PORT_LO
                ICW1:               0x10,   // set means ICW1
                ICW1_ICW4:          0x01,   // ICW4 needed (otherwise ICW4 must be sent)
                ICW1_SNGL:          0x02,   // single PIC (and therefore no ICW3; otherwise there is another "cascaded" PIC)
                ICW1_ADI:           0x04,   // call address interval is 4 (otherwise 8; presumably ignored in 8086/8088 mode)
                ICW1_LTIM:          0x08,   // level-triggered interrupt mode (otherwise edge-triggered mode, which is what PCs use)
                OCW2:               0x00,   // bit 3 (PIC_LO.OCW3) and bit 4 (ChipSet.PIC_LO.ICW1) are clear in an OCW2 command byte
                OCW2_IR_LVL:        0x07,
                OCW2_OP_MASK:       0xE0,   // of the following valid OCW2 operations, the first 4 are EOI commands (all have ChipSet.PIC_LO.OCW2_EOI set)
                OCW2_EOI:           0x20,   // non-specific EOI (end-of-interrupt)
                OCW2_EOI_SPEC:      0x60,   // specific EOI
                OCW2_EOI_ROT:       0xA0,   // rotate on non-specific EOI
                OCW2_EOI_ROTSPEC:   0xE0,   // rotate on specific EOI
                OCW2_SET_ROTAUTO:   0x80,   // set rotate in automatic EOI mode
                OCW2_CLR_ROTAUTO:   0x00,   // clear rotate in automatic EOI mode
                OCW2_SET_PRI:       0xC0,   // bits 0-2 specify the lowest priority interrupt
                OCW3:               0x08,   // bit 3 (PIC_LO.OCW3) is set and bit 4 (PIC_LO.ICW1) clear in an OCW3 command byte (bit 7 should be clear, too)
                OCW3_READ_IRR:      0x02,   // read IRR register
                OCW3_READ_ISR:      0x03,   // read ISR register
                OCW3_READ_CMD:      0x03,
                OCW3_POLL_CMD:      0x04,   // poll
                OCW3_SMM_RESET:     0x40,   // special mask mode: reset
                OCW3_SMM_SET:       0x60,   // special mask mode: set
                OCW3_SMM_CMD:       0x60
            };
            
            ChipSet.PIC_HI = {              // ChipSet.PIC1.PORT_HI or ChipSet.PIC2.PORT_HI
                ICW2_VECTOR:        0xF8,   // starting vector number (bits 0-2 are effectively treated as zeros in 8086/8088 mode)
                ICW4_8086:          0x01,
                ICW4_AUTO_EOI:      0x02,
                ICW4_MASTER:        0x04,
                ICW4_BUFFERED:      0x08,
                ICW4_FULLY_NESTED:  0x10,
                OCW1_IMR:           0xFF
            };
            
            /*
             * The priorities of IRQs 0-7 are normally high to low, unless the master PIC has been reprogrammed.
             * Also, if a slave PIC is present, the priorities of IRQs 8-15 fall between the priorities of IRQs 1 and 3.
             *
             * As the MODEL_5170 TechRef states:
             *
             *      "Interrupt requests are prioritized, with IRQ9 through IRQ12 and IRQ14 through IRQ15 having the
             *      highest priority (IRQ9 is the highest) and IRQ3 through IRQ7 having the lowest priority (IRQ7 is
             *      the lowest).
             *
             *      Interrupt 13 (IRQ.COPROC) is used on the system board and is not available on the I/O channel.
             *      Interrupt 8 (IRQ.RTC) is used for the real-time clock."
             *
             * This priority scheme is a byproduct of IRQ8 through IRQ15 (slave PIC interrupts) being tied to IRQ2 of
             * the master PIC.  As a result, the two other system board interrupts, IRQ0 and IRQ1, continue to have the
             * highest priority, by default.
             */
            ChipSet.IRQ = {
                TIMER0:             0x00,
                KBD:                0x01,
                SLAVE:              0x02,   // MODEL_5170
                COM2:               0x03,
                COM1:               0x04,
                XTC:                0x05,   // MODEL_5160 uses IRQ 5 for HDC (XTC version)
                LPT2:               0x05,   // MODEL_5170 uses IRQ 5 for LPT2
                FDC:                0x06,
                LPT1:               0x07,
                RTC:                0x08,   // MODEL_5170
                IRQ2:               0x09,   // MODEL_5170
                COPROC:             0x0D,   // MODEL_5170
                ATC:                0x0E    // MODEL_5170 uses IRQ 14 for HDC (ATC version)
            };
            
            /*
             * 8253 Programmable Interval Timer (PIT) I/O ports
             *
             * Although technically, a PIT provides 3 "counters" rather than 3 "timers", we have
             * adopted IBM's TechRef nomenclature, which refers to the PIT's counters as TIMER0,
             * TIMER1, and TIMER2.  For machines with a second PIT (eg, the DeskPro 386), we refer
             * to those additional counters as TIMER3, TIMER4, and TIMER5.
             *
             * In addition, if there's a need to refer to a specfic PIT, use PIT0 for the first PIT
             * and PIT1 for the second.  This mirrors how we refer to multiple DMA controllers
             * (eg, DMA0 and DMA1) and multiple PICs (eg, PIC0 and PIC1).
             *
             * This differs from Compaq's nomenclature, which used "Timer 1" to refer to the first
             * PIT, and "Timer 2" for the second PIT, and then referred to "Counter 0", "Counter 1",
             * and "Counter 2" within each PIT.
             */
            ChipSet.PIT0 = {
                PORT:               0x40,
                TIMER0:             0,      // used for time-of-day (prior to MODEL_5170)
                TIMER1:             1,      // used for memory refresh
                TIMER2:             2       // used for speaker tone generation
            };
            
            ChipSet.PIT1 = {
                PORT:               0x48,   // MODEL_DESKPRO386 only
                TIMER3:             0,      // used for fail-safe clock
                TIMER4:             1,      // N/A
                TIMER5:             2       // used for refresher request extend/speed control
            };
            
            ChipSet.PIT_CTRL = {
                PORT1:              0x43,   // write-only control register (use the Read-Back command to get status)
                PORT2:              0x4B,   // write-only control register (use the Read-Back command to get status)
                BCD:                0x01,
                MODE:               0x0E,
                MODE0:              0x00,   // interrupt on Terminal Count (TC)
                MODE1:              0x02,   // programmable one-shot
                MODE2:              0x04,   // rate generator
                MODE3:              0x06,   // square wave generator
                MODE4:              0x08,   // software-triggered strobe
                MODE5:              0x0A,   // hardware-triggered strobe
                RW:                 0x30,
                RW_LATCH:           0x00,
                RW_LSB:             0x10,
                RW_MSB:             0x20,
                RW_BOTH:            0x30,
                SC:                 0xC0,
                SC_CTR0:            0x00,
                SC_CTR1:            0x40,
                SC_CTR2:            0x80,
                SC_BACK:            0xC0
            };
            
            ChipSet.TIMER_TICKS_PER_SEC = 1193181;
            
            /*
             * 8255A Programmable Peripheral Interface (PPI) I/O ports, for Cassette/Speaker/Keyboard/SW1/etc
             *
             * Normally, 0x99 is written to PPI_CTRL.PORT, indicating that PPI_A.PORT and PPI_C.PORT are INPUT ports
             * and PPI_B.PORT is an OUTPUT port.
             *
             * However, the MODEL_5160 ROM BIOS initially writes 0x89 instead, making PPI_A.PORT an OUTPUT port.
             * I'm guessing that's just part of some "diagnostic mode", because all it writes to PPI_A.PORT are a series
             * of "checkpoint" values (ie, 0x01, 0x02, and 0x03) before updating PPI_CTRL.PORT with the usual 0x99.
             */
            ChipSet.PPI_A = {               // this.bPPIA (port 0x60)
                PORT:               0x60    // INPUT: keyboard scan code (PPI_B.CLEAR_KBD must be clear)
            };
            
            ChipSet.PPI_B = {               // this.bPPIB (port 0x61)
                PORT:               0x61,   // OUTPUT (although it has to be treated as INPUT, too: the keyboard interrupt handler reads it, OR's PPI_B.CLEAR_KBD, writes it, and then rewrites the original read value)
                CLK_TIMER2:         0x01,   // ALL: set to enable clock to TIMER2
                SPK_TIMER2:         0x02,   // ALL: set to connect output of TIMER2 to speaker (MODEL_5150: clear for cassette)
                ENABLE_SW2:         0x04,   // MODEL_5150: set to enable SW2[1-4] through PPI_C.PORT, clear to enable SW2[5]; MODEL_5160: unused (there is no SW2 switch block on the MODEL_5160 motherboard)
                CASS_MOTOR_OFF:     0x08,   // MODEL_5150: cassette motor off
                ENABLE_SW_HI:       0x08,   // MODEL_5160: clear to read SW1[1-4], set to read SW1[5-8]
                DISABLE_RW_MEM:     0x10,   // ALL: clear to enable RAM parity check, set to disable
                DISABLE_IO_CHK:     0x20,   // ALL: clear to enable I/O channel check, set to disable
                CLK_KBD:            0x40,   // ALL: clear to force keyboard clock low
                CLEAR_KBD:          0x80    // ALL: clear to enable keyboard scan codes (MODEL_5150: set to enable SW1 through PPI_A.PORT)
            };
            
            ChipSet.PPI_C = {               // this.bPPIC (port 0x62)
                PORT:               0x62,   // INPUT (see below)
                SW:                 0x0F,   // MODEL_5150: SW2[1-4] or SW2[5], depending on whether PPI_B.ENABLE_SW2 is set or clear; MODEL_5160: SW1[1-4] or SW1[5-8], depending on whether PPI_B.ENABLE_SW_HI is clear or set
                CASS_DATA_IN:       0x10,
                TIMER2_OUT:         0x20,
                IO_CHANNEL_CHK:     0x40,   // used by NMI handler to detect I/O channel errors
                RW_PARITY_CHK:      0x80    // used by NMI handler to detect R/W memory parity errors
            };
            
            ChipSet.PPI_CTRL = {            // this.bPPICtrl (port 0x63)
                PORT:               0x63,   // OUTPUT: initialized to 0x99, defining PPI_A and PPI_C as INPUT and PPI_B as OUTPUT
                A_IN:               0x10,
                B_IN:               0x02,
                C_IN_LO:            0x01,
                C_IN_HI:            0x08,
                B_MODE:             0x04,
                A_MODE:             0x60
            };
            
            /*
             * On the MODEL_5150, the following PPI_SW bits are exposed through PPI_A.
             *
             * On the MODEL_5160, either the low or high 4 bits are exposed through PPI_C.SW, if PPI_B.ENABLE_SW_HI is clear or set.
             */
            ChipSet.PPI_SW = {
                FDRIVE: {
                    IPL:            0x01,   // MODEL_5150: IPL ("Initial Program Load") floppy drive attached; MODEL_5160: "Loop on POST"
                    ONE:            0x00,   // 1 floppy drive attached (or 0 drives if PPI_SW.FDRIVE_IPL is not set -- MODEL_5150 only)
                    TWO:            0x40,   // 2 floppy drives attached
                    THREE:          0x80,   // 3 floppy drives attached
                    FOUR:           0xC0,   // 4 floppy drives attached
                    MASK:           0xC0,
                    SHIFT:          6
                },
                COPROC:             0x02,   // MODEL_5150: reserved; MODEL_5160: coprocessor installed
                MEMORY: {                   // MODEL_5150: "X" is 16Kb; MODEL_5160: "X" is 64Kb
                    X1:             0x00,   // 16Kb or 64Kb
                    X2:             0x04,   // 32Kb or 128Kb
                    X3:             0x08,   // 48Kb or 192Kb
                    X4:             0x0C,   // 64Kb or 256Kb
                    MASK:           0x0C,
                    SHIFT:          2
                },
                MONITOR: {
                    TV:             0x10,
                    COLOR:          0x20,
                    MONO:           0x30,
                    MASK:           0x30,
                    SHIFT:          4
                }
            };
            
            /*
             * 8042 Keyboard Controller I/O ports (MODEL_5170)
             *
             * On the MODEL_5170, port 0x60 is designated KBC.DATA rather than PPI_A, although the BIOS also refers to it
             * as "PORT_A: 8042 KEYBOARD SCAN/DIAG OUTPUTS").  This is the 8042's output buffer and should be read only when
             * KBC.STATUS.OUTBUFF_FULL is set.
             *
             * Similarly, port 0x61 is designated KBC.RWREG rather than PPI_B; the BIOS also refers to it as "PORT_B: 8042
             * READ WRITE REGISTER", but it is not otherwise discussed in the MODEL_5170 TechRef's 8042 documentation.
             *
             * There are brief references to bits 0 and 1 (KBC.RWREG.CLK_TIMER2 and KBC.RWREG.SPK_TIMER2), and the BIOS sets
             * bits 2-7 to "DISABLE PARITY CHECKERS" (principally KBC.RWREG.DISABLE_NMI, which are bits 2 and 3); why the BIOS
             * also sets bits 4-7 (or if those bits are even settable) is unclear, since it uses 11111100b rather than defined
             * constants.
             *
             * The bottom line: on a MODEL_5170, port 0x61 is still used for speaker control and parity checking, so we use
             * the same register (bPPIB) but install different I/O handlers.  It's also bi-directional: at one point, the BIOS
             * reads KBC.RWREG.REFRESH_BIT (bit 4) to verify that it's alternating.
             *
             * PPI_C and PPI_CTRL don't seem to be documented or used by the MODEL_5170 BIOS, so I'm assuming they're obsolete.
             *
             * NOTE: For more information on the 8042 Controller, including information on undocumented commands, refer to the
             * documents in /devices/pc/keyboard, as well as the following websites:
             *
             *      http://halicery.com/8042/8042_INTERN_TXT.htm
             *      http://www.os2museum.com/wp/ibm-pcat-8042-keyboard-controller-commands/
             */
            ChipSet.KBC = {
                DATA: {                     // this.b8042OutBuff (PPI_A on previous models, still referred to as "PORT A" by the MODEL_5170 BIOS)
                    PORT:           0x60,
                    CMD: {                  // this.b8042CmdData (KBC.DATA.CMD "data bytes" written to port 0x60, after writing a KBC.CMD byte to port 0x64)
                        INT_ENABLE: 0x01,   // generate an interrupt when the controller places data in the output buffer
                        SYS_FLAG:   0x04,   // this value is propagated to ChipSet.KBC.STATUS.SYS_FLAG
                        NO_INHIBIT: 0x08,   // disable inhibit function
                        NO_CLOCK:   0x10,   // disable keyboard by driving "clock" line low
                        PC_MODE:    0x20,
                        PC_COMPAT:  0x40    // generate IBM PC-compatible scan codes
                    },
                    SELF_TEST: {            // result of ChipSet.KBC.CMD.SELF_TEST command (0xAA)
                        OK:         0x55
                    },
                    INTF_TEST: {            // result of ChipSet.KBC.CMD.INTF_TEST command (0xAB)
                        OK:         0x00,   // no error
                        CLOCK_LO:   0x01,   // keyboard clock line stuck low
                        CLOCK_HI:   0x02,   // keyboard clock line stuck high
                        DATA_LO:    0x03,   // keyboard data line stuck low
                        DATA_HI:    0x04    // keyboard data line stuck high
                    }
                },
                INPORT: {                   // this.b8042InPort
                    COMPAQ_50MHZ:   0x01,   // 50Mhz system clock enabled (0=48Mhz); see Compaq 386/25 TechRef p2-106
                    UNDEFINED:      0x02,   // undefined
                    COMPAQ_NO80387: 0x04,   // 80387 coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
                    COMPAQ_NOWEITEK:0x08,   // Weitek coprocessor NOT installed; see Compaq 386/25 TechRef p2-106
                    ENABLE_256KB:   0x10,   // enable 2nd 256Kb of system board RAM
                    COMPAQ_HISPEED: 0x10,   // high-speed enabled (0=auto); see Compaq 386/25 TechRef p2-106
                    MFG_OFF:        0x20,   // manufacturing jumper not installed
                    COMPAQ_DIP5OFF: 0x20,   // system board DIP switch #5 OFF (0=ON); see Compaq 386/25 TechRef p2-106
                    MONO:           0x40,   // monochrome monitor is primary display
                    COMPAQ_NONDUAL: 0x40,   // Compaq Dual-Mode monitor NOT installed; see Compaq 386/25 TechRef p2-106
                    KBD_UNLOCKED:   0x80    // keyboard not inhibited (in Compaq parlance: security lock is unlocked)
                },
                OUTPORT: {                  // this.b8042OutPort
                    NO_RESET:       0x01,   // set by default
                    A20_ON:         0x02,   // set by default
                    COMPAQ_SLOWD:   0x08,   // SL0WD* NOT asserted (refer to timer 2, counter 2); see Compaq 386/25 TechRef p2-105
                    OUTBUFF_FULL:   0x10,   // output buffer full
                    INBUFF_EMPTY:   0x20,   // input buffer empty
                    KBD_CLOCK:      0x40,   // keyboard clock (output)
                    KBD_DATA:       0x80    // keyboard data (output)
                },
                TESTPORT: {                 // generated "on the fly"
                    KBD_CLOCK:      0x01,   // keyboard clock (input)
                    KBD_DATA:       0x02    // keyboard data (input)
                },
                RWREG: {                    // this.bPPIB (since CLK_TIMER2 and SPK_TIMER2 are in both PPI_B and RWREG)
                    PORT:           0x61,
                    CLK_TIMER2:     0x01,   // set to enable clock to TIMER2 (R/W)
                    SPK_TIMER2:     0x02,   // set to connect output of TIMER2 to speaker (R/W)
                    COMPAQ_FSNMI:   0x04,   // set to disable RAM/FS NMI (R/W, DESKPRO386)
                    COMPAQ_IONMI:   0x08,   // set to disable IOCHK NMI (R/W, DESKPRO386)
                    DISABLE_NMI:    0x0C,   // set to disable IOCHK and RAM/FS NMI, clear to enable (R/W)
                    REFRESH_BIT:    0x10,   // 0 if RAM refresh occurring, 1 if RAM not in refresh cycle (R/O)
                    OUT_TIMER2:     0x20,   // state of TIMER2 output signal (R/O, DESKPRO386)
                    IOCHK_NMI:      0x40,   // IOCHK NMI (R/O); to reset, pulse bit 3 (0x08)
                    RAMFS_NMI:      0x80,   // RAM/FS (parity or fail-safe) NMI (R/O); to reset, pulse bit 2 (0x04)
                    NMI_ERROR:      0xC0
                },
                CMD: {                      // this.b8042InBuff (on write to port 0x64, interpret this as a CMD)
                    PORT:           0x64,
                    READ_CMD:       0x20,   // sends the current CMD byte (this.b8042CmdData) to KBC.DATA.PORT
                    WRITE_CMD:      0x60,   // followed by a command byte written to KBC.DATA.PORT (see KBC.DATA.CMD)
                    COMPAQ_SLOWD:   0xA3,   // enable system slow down; see Compaq 386/25 TechRef p2-111
                    COMPAQ_TOGGLE:  0xA4,   // toggle speed-control bit; see Compaq 386/25 TechRef p2-111
                    COMPAQ_SPCREAD: 0xA5,   // special read of "port 2"; see Compaq 386/25 TechRef p2-111
                    SELF_TEST:      0xAA,   // self-test (KBC.DATA.SELF_TEST.OK is placed in the output buffer if no errors)
                    INTF_TEST:      0xAB,   // interface test
                    DIAG_DUMP:      0xAC,   // diagnostic dump
                    DISABLE_KBD:    0xAD,   // disable keyboard
                    ENABLE_KBD:     0xAE,   // enable keyboard
                    READ_INPORT:    0xC0,   // read input port and place data in output buffer (use only if output buffer empty)
                    READ_OUTPORT:   0xD0,   // read output port and place data in output buffer (use only if output buffer empty)
                    WRITE_OUTPORT:  0xD1,   // next byte written to KBC.DATA.PORT (port 0x60) is placed in the output port (see KBC.OUTPORT)
                    READ_TEST:      0xE0,
                    PULSE_OUTPORT:  0xF0    // this is the 1st of 16 commands (0xF0-0xFF) that pulse bits 0-3 of the output port
                },
                STATUS: {                   // this.b8042Status (on read from port 0x64)
                    PORT:           0x64,
                    OUTBUFF_FULL:   0x01,
                    INBUFF_FULL:    0x02,   // set if the controller has received but not yet read data from the input buffer (not normally set)
                    SYS_FLAG:       0x04,
                    CMD_FLAG:       0x08,   // set on write to KBC.CMD (port 0x64), clear on write to KBC.DATA (port 0x60)
                    NO_INHIBIT:     0x10,   // (in Compaq parlance: security lock not engaged)
                    XMT_TIMEOUT:    0x20,
                    RCV_TIMEOUT:    0x40,
                    PARITY_ERR:     0x80,   // last byte of data received had EVEN parity (ODD parity is normally expected)
                    OUTBUFF_DELAY:  0x100
                }
            };
            
            /*
             * MC146818A RTC/CMOS Ports (MODEL_5170)
             *
             * Write a CMOS address to ChipSet.CMOS.ADDR.PORT, then read/write data from/to ChipSet.CMOS.DATA.PORT.
             *
             * The ADDR port also controls NMI: write an address with bit 7 clear to enable NMI or set to disable NMI.
             */
            ChipSet.CMOS = {
                ADDR: {                     // this.bCMOSAddr
                    PORT:           0x70,
                    RTC_SEC:        0x00,
                    RTC_SEC_ALRM:   0x01,
                    RTC_MIN:        0x02,
                    RTC_MIN_ALRM:   0x03,
                    RTC_HOUR:       0x04,
                    RTC_HOUR_ALRM:  0x05,
                    RTC_WEEK_DAY:   0x06,
                    RTC_MONTH_DAY:  0x07,
                    RTC_MONTH:      0x08,
                    RTC_YEAR:       0x09,
                    STATUSA:        0x0A,
                    STATUSB:        0x0B,
                    STATUSC:        0x0C,
                    STATUSD:        0x0D,
                    DIAG:           0x0E,
                    SHUTDOWN:       0x0F,
                    FDRIVE:         0x10,
                    HDRIVE:         0x12,
                    EQUIP:          0x14,
                    BASEMEM_LO:     0x15,
                    BASEMEM_HI:     0x16,   // the BASEMEM values indicate the total Kb of base memory, up to 0x280 (640Kb)
                    EXTMEM_LO:      0x17,
                    EXTMEM_HI:      0x18,   // the EXTMEM values indicate the total Kb of extended memory, up to 0x3C00 (15Mb)
                    CHKSUM_HI:      0x2E,
                    CHKSUM_LO:      0x2F,   // CMOS bytes included in the checksum calculation: 0x10-0x2D
                    EXTMEM2_LO:     0x30,
                    EXTMEM2_HI:     0x31,
                    CENTURY_DATE:   0x32,   // BCD value for the current century (eg, 0x19 for 20th century, 0x20 for 21st century)
                    BOOT_INFO:      0x33,   // 0x80 if 128Kb expansion memory installed, 0x40 if Setup Utility wants an initial setup message
                    MASK:           0x3F,
                    TOTAL:          0x40,
                    NMI_DISABLE:    0x80
                },
                DATA: {                     // this.abCMOSData
                    PORT:           0x71
                },
                STATUSA: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSA]
                    UIP:            0x80,   // bit 7: 1 indicates Update-In-Progress, 0 indicates date/time ready to read
                    DV:             0x70,   // bits 6-4 (DV2-DV0) are programmed to 010 to select a 32.768Khz time base
                    RS:             0x0F    // bits 3-0 (RS3-RS0) are programmed to 0110 to select a 976.562us interrupt rate
                },
                STATUSB: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSB]
                    SET:            0x80,   // bit 7: 1 to set any/all of the 14 time-bytes
                    PIE:            0x40,   // bit 6: 1 for Periodic Interrupt Enable
                    AIE:            0x20,   // bit 5: 1 for Alarm Interrupt Enable
                    UIE:            0x10,   // bit 4: 1 for Update Interrupt Enable
                    SQWE:           0x08,   // bit 3: 1 for Square Wave Enabled (as set by the STATUSA rate selection bits)
                    BINARY:         0x04,   // bit 2: 1 for binary Date Mode, 0 for BCD Date Mode
                    HOUR24:         0x02,   // bit 1: 1 for 24-hour mode, 0 for 12-hour mode
                    DST:            0x01    // bit 0: 1 for Daylight Savings Time enabled
                },
                STATUSC: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSC]
                    IRQF:           0x80,   // bit 7: 1 indicates one or more of the following bits (PF, AF, UF) are set
                    PF:             0x40,   // bit 6: 1 indicates Periodic Interrupt
                    AF:             0x20,   // bit 5: 1 indicates Alarm Interrupt
                    UF:             0x10,   // bit 4: 1 indicates Update Interrupt
                    RESERVED:       0x0F
                },
                STATUSD: {                  // abCMOSData[ChipSet.CMOS.ADDR.STATUSD]
                    VRB:            0x80,   // bit 7: 1 indicates Valid RAM Bit (0 implies power was and/or is lost)
                    RESERVED:       0x7F
                },
                DIAG: {                     // abCMOSData[ChipSet.CMOS.ADDR.DIAG]
                    RTCFAIL:        0x80,   // bit 7: 1 indicates RTC lost power
                    CHKSUMFAIL:     0x40,   // bit 6: 1 indicates bad CMOS checksum
                    CONFIGFAIL:     0x20,   // bit 5: 1 indicates bad CMOS configuration info
                    MEMSIZEFAIL:    0x10,   // bit 4: 1 indicates memory size miscompare
                    HDRIVEFAIL:     0x08,   // bit 3: 1 indicates hard drive controller or drive init failure
                    TIMEFAIL:       0x04,   // bit 2: 1 indicates time failure
                    RESERVED:       0x03
                },
                FDRIVE: {                   // abCMOSData[ChipSet.CMOS.ADDR.FDRIVE]
                    D0_MASK:        0xF0,   // Drive 0 type in high nibble
                    D1_MASK:        0x0F,   // Drive 1 type in lower nibble
                    NONE:           0,      // no drive
                    /*
                     * There's at least one floppy drive type that IBM didn't bother defining a CMOS drive type for:
                     * single-sided drives that were only capable of storing 160Kb (or 180Kb when using 9 sectors/track).
                     * So, as you can see in getSWFloppyDriveType(), we lump all standard diskette capacities <= 360Kb
                     * into the FD360 bucket.
                     */
                    FD360:          1,      // 5.25-inch double-sided double-density (DSDD 48TPI) drive: 40 tracks, 9 sectors/track, 360Kb max
                    FD1200:         2,      // 5.25-inch double-sided high-density (DSHD 96TPI) drive: 80 tracks, 15 sectors/track, 1200Kb max
                    FD720:          3,      // 3.5-inch drive capable of storing 80 tracks and up to 9 sectors/track, 720Kb max
                    FD1440:         4       // 3.5-inch drive capable of storing 80 tracks and up to 18 sectors/track, 1440Kb max
                },
                /*
                 * HDRIVE types are defined by table in the HDC component, which uses setCMOSDriveType() to update the CMOS
                 */
                HDRIVE: {                   // abCMOSData[ChipSet.CMOS.ADDR.HDRIVE]
                    D0_MASK:        0xF0,   // Drive 0 type in high nibble
                    D1_MASK:        0x0F    // Drive 1 type in lower nibble
                },
                /*
                 * The CMOS equipment flags use the same format as the older PPI equipment flags
                 */
                EQUIP: {                    // abCMOSData[ChipSet.CMOS.ADDR.EQUIP]
                    MONITOR:        ChipSet.PPI_SW.MONITOR,         // PPI_SW.MONITOR.MASK == 0x30
                    COPROC:         ChipSet.PPI_SW.COPROC,          // PPI_SW.COPROC == 0x02
                    FDRIVE:         ChipSet.PPI_SW.FDRIVE           // PPI_SW.FDRIVE.IPL == 0x01 and PPI_SW.FDRIVE.MASK = 0xC0
                }
            };
            
            /*
             * DMA Page Registers
             *
             * The MODEL_5170 TechRef lists 0x80-0x9F as the range for DMA page registers, but that may be a bit
             * overbroad.  There are a total of 8 (7 usable) DMA channels on the MODEL_5170, each of which has the
             * following assigned DMA page registers:
             *
             *      Channel #   Page Reg
             *      ---------   --------
             *          0         0x87
             *          1         0x83
             *          2         0x81
             *          3         0x82
             *          4         0x8F (not usable; the 5170 TechRef refers to this as the "Refresh" page register)
             *          5         0x8B
             *          6         0x89
             *          7         0x8A
             *
             * That leaves 0x80, 0x84, 0x85, 0x86, 0x88, 0x8C, 0x8D and 0x8E unaccounted for in the range 0x80-0x8F.
             * (I'm saving the question of what, if anything, is available in the range 0x90-0x9F for another day.)
             *
             * As for port 0x80, the TechRef says:
             *
             *      "I/O address hex 080 is used as a diagnostic-checkpoint port or register.
             *      This port corresponds to a read/write register in the DMA page register (74LS612)."
             *
             * so I used to have dedicated handlers and storage (bMFGData) for the register at port 0x80, but I've since
             * appended it to abDMAPageSpare, an 8-element array that captures all I/O to the 8 unassigned (aka "spare")
             * DMA page registers.  The 5170 BIOS uses 0x80 as a "checkpoint" register, and the DESKPRO386 uses 0x84 in a
             * similar fashion.  The 5170 also contains "MFG_TST" code that uses other unassigned DMA page registers as
             * scratch registers, which come in handy when RAM hasn't been tested/initialized yet.
             *
             * Here's our mapping of entries in the abDMAPageSpare array to the unassigned ("spare") DMA page registers:
             *
             *      Index #     Page Reg
             *      --------    --------
             *          0         0x84
             *          1         0x85
             *          2         0x86
             *          3         0x88
             *          4         0x8C
             *          5         0x8D
             *          6         0x8E
             *          7         0x80
             *
             * The only reason port 0x80 is out of sequence (ie, at the end of the array, at index 7 instead of index 0) is
             * because it was added the array later, and the entire array gets written to our save/restore data structures, so
             * reordering the elements would be a bad idea.
             */
            
            /*
             * NMI Mask Register (MODEL_5150 and MODEL_5160 only)
             */
            ChipSet.NMI = {                 // this.bNMI
                PORT:               0xA0,
                ENABLE:             0x80,
                DISABLE:            0x00
            };
            
            /*
             * Coprocessor Control Registers (MODEL_5170)
             */
            ChipSet.COPROC = {              // TODO: Define a variable for this
                PORT_CLEAR:         0xF0,   // clear the coprocessor's "busy" state
                PORT_RESET:         0xF1    // reset the coprocessor
            };
            
            /**
             * @this {ChipSet}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "sw1")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            ChipSet.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                switch (sBinding) {
                    case "sw1":
                        this.bindings[sBinding] = control;
                        this.addSwitches(sBinding, control, 8, this.sw1Init, {
                            0: (this.model == ChipSet.MODEL_5150? "Bootable Floppy Drive" : "Loop on POST"),
                            1: (this.model == ChipSet.MODEL_5150? "Reserved" : "Coprocessor"),
                            2: "Base Memory Size",          // up to 64Kb on a MODEL_5150, 256Kb on a MODEL_5160
                            4: "Monitor Type",
                            6: "Number of Floppy Drives"
                        });
                        return true;
                    case "sw2":
                        if (this.model == ChipSet.MODEL_5150) {
                            this.bindings[sBinding] = control;
                            this.addSwitches(sBinding, control, 8, this.sw2Init, {
                                0: "Expansion Memory Size", // up to 480Kb, which, when combined with 64Kb of MODEL_5150 base memory, gives a maximum of 544Kb
                                4: "Reserved"
                            });
                            return true;
                        }
                        break;
                    case "swdesc":
                        this.bindings[sBinding] = control;
                        return true;
                    default:
                        break;
                }
                return false;
            };
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {ChipSet}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            ChipSet.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.cmp = cmp;
                this.kbd = cmp.getComponentByType("Keyboard");
                /*
                 * This divisor is invariant, so we calculate it as soon as we're able to query the CPU's base speed.
                 */
                this.nTicksDivisor = (cpu.getCyclesPerSecond() / ChipSet.TIMER_TICKS_PER_SEC);
            
                bus.addPortInputTable(this, ChipSet.aPortInput);
                bus.addPortOutputTable(this, ChipSet.aPortOutput);
                if (this.model < ChipSet.MODEL_5170) {
                    bus.addPortInputTable(this, ChipSet.aPortInput5150);
                    bus.addPortOutputTable(this, ChipSet.aPortOutput5150);
                } else {
                    bus.addPortInputTable(this, ChipSet.aPortInput5170);
                    bus.addPortOutputTable(this, ChipSet.aPortOutput5170);
                }
                if (DEBUGGER) {
                    if (dbg) {
                        var chipset = this;
                        /*
                         * TODO: Add more "dumpers" (eg, for DMA, RTC, 8042, etc)
                         */
                        dbg.messageDump(Messages.PIC, function onDumpPIC() {
                            chipset.dumpPIC();
                        });
                        dbg.messageDump(Messages.TIMER, function onDumpTimer() {
                            chipset.dumpTimer();
                        });
                        dbg.messageDump(Messages.CMOS, function onDumpCMOS() {
                            chipset.dumpCMOS();
                        });
                    }
                    cpu.addIntNotify(Interrupts.RTC.VECTOR, this, this.intBIOSRTC);
                }
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {ChipSet}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            ChipSet.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data) {
                        this.reset();
                    } else {
                        if (!this.restore(data)) return false;
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {ChipSet}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            ChipSet.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save? this.save() : true;
            };
            
            /**
             * reset(fHard)
             *
             * @this {ChipSet}
             * @param {boolean} [fHard] true on the initial reset (not a normal "soft" reset)
             */
            ChipSet.prototype.reset = function(fHard)
            {
                /*
                 * We propagate the sw1Init/sw2Init values to sw1/sw2 at reset; the user is only
                 * allowed to tweak sw1Init/sw2Init, which doesn't take effect until the next reset.
                 */
                var i;
                this.sw1 = this.sw1Init;
                this.sw2 = this.sw2Init;
                this.updateSwitchDesc();
            
                /*
                 * DMA (Direct Memory Access) Controller initialization
                 */
                this.aDMACs = new Array(this.cDMACs);
                for (i = 0; i < this.cDMACs; i++) {
                    this.initDMAController(i);
                }
            
                /*
                 * PIC (Programmable Interupt Controller) initialization
                 */
                this.aPICs = new Array(this.cPICs);
                this.initPIC(ChipSet.PIC0.INDEX, ChipSet.PIC0.PORT_LO);
                if (this.cPICs > 1) {
                    this.initPIC(ChipSet.PIC1.INDEX, ChipSet.PIC1.PORT_LO);
                }
            
                /*
                 * PIT (Programmable Interval Timer) initialization
                 *
                 * Although the DeskPro 386 refers to the timers in the first PIT as "Timer 1, Counter 0",
                 * "Timer 1, Counter 1" and "Timer 1, Counter 2", we're sticking with IBM's nomenclature:
                 * TIMER0, TIMER1 and TIMER2.  Which means that we refer to the "counters" in the second PIT
                 * as TIMER3, TIMER4 and TIMER5; that numbering also matches their indexes in the aTimers array.
                 */
                this.bPIT1Ctrl = null;          // tracks writes to port 0x43
                this.bPIT2Ctrl = null;          // tracks writes to port 0x4B (MODEL_DESKPRO386 only)
                this.aTimers = new Array(this.model == ChipSet.MODEL_DESKPRO386? 6 : 3);
                for (i = 0; i < this.aTimers.length; i++) {
                    this.initTimer(i);
                }
            
                /*
                 * PPI and other misc ports
                 */
                this.bPPIA = null;              // tracks writes to port 0x60, in case PPI_CTRL.A_IN is not set
                this.bPPIB = null;              // tracks writes to port 0x61, in case PPI_CTRL.B_IN is not set
                this.bPPIC = null;              // tracks writes to port 0x62, in case PPI_CTRL.C_IN_LO or PPI_CTRL.C_IN_HI is not set
                this.bPPICtrl = null;           // tracks writes to port 0x63 (eg, 0x99); read-only
                this.bNMI = ChipSet.NMI.DISABLE;// tracks writes to the NMI Mask Register
            
                /*
                 * ChipSet state introduced by the MODEL_5170
                 */
                if (this.model >= ChipSet.MODEL_5170) {
                    /*
                     * The 8042 input buffer is treated as a "command byte" when written via port 0x64 and as a "data byte"
                     * when written via port 0x60.  So, whenever the KBC.CMD.WRITE_CMD "command byte" is written to the input
                     * buffer, the subsequent command data byte is saved in b8042CmdData.  Similarly, for KBC.CMD.WRITE_OUTPORT,
                     * the subsequent data byte is saved in b8042OutPort.
                     *
                     * TODO: Consider a UI for the Keyboard INHIBIT switch.  By default, our keyboard is never inhibited
                     * (ie, locked).  Also, note that the hardware changes this bit only when new data is sent to b8042OutBuff.
                     */
                    this.b8042Status = ChipSet.KBC.STATUS.NO_INHIBIT;
                    this.b8042InBuff = 0;
                    this.b8042CmdData = ChipSet.KBC.DATA.CMD.NO_CLOCK;
                    this.b8042OutBuff = 0;
            
                    /*
                     * TODO: Provide more control over these 8042 "Input Port" bits (eg, the keyboard lock)
                     */
                    this.b8042InPort = ChipSet.KBC.INPORT.MFG_OFF | ChipSet.KBC.INPORT.KBD_UNLOCKED;
            
                    if (this.getSWMemorySize() >= 512) {
                        this.b8042InPort |= ChipSet.KBC.INPORT.ENABLE_256KB;
                    }
            
                    if (this.getSWVideoMonitor() == ChipSet.MONITOR.MONO) {
                        this.b8042InPort |= ChipSet.KBC.INPORT.MONO;
                    }
            
                    if (COMPAQ386 && this.model == ChipSet.MODEL_DESKPRO386) {
                        this.b8042InPort |= ChipSet.KBC.INPORT.COMPAQ_NO80387 | ChipSet.KBC.INPORT.COMPAQ_NOWEITEK;
                    }
            
                    this.b8042OutPort = ChipSet.KBC.OUTPORT.NO_RESET | ChipSet.KBC.OUTPORT.A20_ON;
            
                    this.abDMAPageSpare = new Array(8);
            
                    this.bCMOSAddr = 0;         // NMI is enabled, since the ChipSet.CMOS.ADDR.NMI_DISABLE bit is not set in bCMOSAddr
            
                    /*
                     * Now that we call reset() from the ChipSet constructor, enabling other components to update
                     * their own CMOS information as needed, we must distinguish between the initial ("hard") reset
                     * and any later ("soft") resets (eg, from powerUp() calls), and make sure the latter preserves
                     * existing CMOS information.
                     */
                    if (fHard) {
                        this.abCMOSData = new Array(ChipSet.CMOS.ADDR.TOTAL);
                    }
            
                    this.initRTCTime(this.sRTCDate);
            
                    /*
                     * initCMOSData() will initialize a variety of "legacy" CMOS bytes, but it will NOT overwrite any memory
                     * size or hard drive type information that might have been set, via addCMOSMemory() or setCMOSDriveType().
                     */
                    this.initCMOSData();
                }
            
                if (DEBUGGER && MAXDEBUG) {
                    /*
                     * Arrays for interrupt counts (one count per IRQ) and timer data
                     */
                    this.acInterrupts = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
                    this.acTimersFired = [0, 0, 0];
                    this.acTimer0Counts = [];
                }
            };
            
            /**
             * initRTCTime(sDate)
             *
             * Initialize the RTC portion of the CMOS registers to match the specified date/time (or if none is specified,
             * the current date/time).  The date/time should be expressed in the ISO 8601 format; eg: "2011-10-10T14:48:00".
             *
             * NOTE: There are two approaches we could take here: always store the RTC bytes in binary, and convert them
             * to/from BCD on-demand (ie, as the simulation reads/writes the CMOS RTC registers); or init/update them in the
             * format specified by CMOS.STATUSB.BINARY (1 for binary, 0 for BCD).  Both approaches require BCD conversion
             * functions, but the former seems more efficient, in part because the periodic calls to updateRTCTime() won't
             * require any conversions.
             *
             * We take the same approach with the CMOS.STATUSB.HOUR24 setting: internally, we always operate in 24-hour mode,
             * but externally, we convert the RTC hour values to the 12-hour format as needed.
             *
             * Thus, all I/O to the RTC bytes must be routed through the getRTCByte() and setRTCByte() functions, to ensure
             * that all the necessary on-demand conversions occur.
             *
             * @this {ChipSet}
             * @param {string} [sDate]
             */
            ChipSet.prototype.initRTCTime = function(sDate)
            {
                /*
                 * NOTE: I've already been burned once by a JavaScript library function that did NOT treat an undefined
                 * parameter (ie, a parameter === undefined) the same as an omitted parameter (eg, the async parameter in
                 * xmlHTTP.open() in IE), so I'm taking no chances here: if sDate is undefined, then explicitly call Date()
                 * with no parameters.
                 */
                var date = sDate? new Date(sDate) : new Date();
            
                /*
                 * Example of a valid Date string:
                 *
                 *      2014-10-01T08:00:00 (interpreted as GMT, resulting in "Wed Oct 01 2014 01:00:00 GMT-0700 (PDT)")
                 *
                 * Examples of INVALID Date strings:
                 *
                 *      2014-10-01T08:00:00PST
                 *      2014-10-01T08:00:00-0700 (actually, this DOES work in Chrome, but NOT in Safari)
                 *
                 * In the case of INVALID Date strings, the Date object is invalid, but there's no obvious test for an "invalid"
                 * object, so I've adapted the following test from StackOverflow.
                 *
                 * See http://stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript
                 */
                if (Object.prototype.toString.call(date) !== "[object Date]" || isNaN(date.getTime())) {
                    date = new Date();
                    this.println("CMOS date invalid (" + sDate + "), using " + date);
                } else if (sDate) {
                    this.println("CMOS date: " + date);
                }
            
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] = date.getSeconds();
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC_ALRM] = 0;
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] = date.getMinutes();
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN_ALRM] = 0;
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] = date.getHours();
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR_ALRM] = 0;
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] = date.getDay() + 1;
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] = date.getDate();
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] = date.getMonth() + 1;
                var nYear = date.getFullYear();
                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] = nYear % 100;
                var nCentury = (nYear / 100);
                this.abCMOSData[ChipSet.CMOS.ADDR.CENTURY_DATE] = (nCentury % 10) | ((nCentury / 10) << 4);
            
                this.abCMOSData[ChipSet.CMOS.ADDR.STATUSA] = 0x26;                          // hard-coded default; refer to ChipSet.CMOS.STATUSA.DV and ChipSet.CMOS.STATUSA.RS
                this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] = ChipSet.CMOS.STATUSB.HOUR24;   // default to BCD mode (ChipSet.CMOS.STATUSB.BINARY not set)
                this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] = 0x00;
                this.abCMOSData[ChipSet.CMOS.ADDR.STATUSD] = ChipSet.CMOS.STATUSD.VRB;
            
                this.nRTCCyclesLastUpdate = this.nRTCCyclesNextUpdate = 0;
                this.nRTCPeriodsPerSecond = this.nRTCCyclesPerPeriod = null;
            };
            
            /**
             * getRTCByte(iRTC)
             *
             * @param {number} iRTC
             * @return {number} b
             */
            ChipSet.prototype.getRTCByte = function(iRTC)
            {
                this.assert(iRTC >= 0 && iRTC <= ChipSet.CMOS.ADDR.STATUSD);
            
                var b = this.abCMOSData[iRTC];
            
                if (iRTC < ChipSet.CMOS.ADDR.STATUSA) {
                    var f12HourValue = false;
                    if (iRTC == ChipSet.CMOS.ADDR.RTC_HOUR || iRTC == ChipSet.CMOS.ADDR.RTC_HOUR_ALRM) {
                        if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.HOUR24)) {
                            if (b < 12) {
                                b = (!b? 12 : b);
                            } else {
                                b -= 12;
                                b = (!b? 0x8c : b + 0x80);
                            }
                            f12HourValue = true;
                        }
                    }
                    if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.BINARY)) {
                        /*
                         * We're in BCD mode, so we must convert b from BINARY to BCD.  But first:
                         *
                         *      If b is a 12-hour value (ie, we're in 12-hour mode) AND the hour is a PM value
                         *      (ie, in the range 0x81-0x8C), then it must be adjusted to yield 81-92 in BCD.
                         *
                         *      AM hour values (0x01-0x0C) need no adjustment; they naturally convert to 01-12 in BCD.
                         */
                        if (f12HourValue && b > 0x80) {
                            b -= (0x81 - 81);
                        }
                        b = (b % 10) | ((b / 10) << 4);
                    }
                } else {
                    if (iRTC == ChipSet.CMOS.ADDR.STATUSA) {
                        /*
                         * HACK: Perform a mindless toggling of the "Update-In-Progress" bit, so that it's flipped
                         * on the next read; this makes the MODEL_5170 BIOS ("POST2_RTCUP") happy.
                         */
                        this.abCMOSData[iRTC] ^= ChipSet.CMOS.STATUSA.UIP;
                    }
                }
                return b;
            };
            
            /**
             * setRTCByte(iRTC, b)
             *
             * @param {number} iRTC
             * @param {number} b proposed byte to write
             * @return {number} actual byte to write
             */
            ChipSet.prototype.setRTCByte = function(iRTC, b)
            {
                this.assert(iRTC >= 0 && iRTC <= ChipSet.CMOS.ADDR.STATUSD);
            
                if (iRTC < ChipSet.CMOS.ADDR.STATUSA) {
                    var fBCD = false;
                    if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.BINARY)) {
                        /*
                         * We're in BCD mode, so we must convert b from BCD to BINARY (we assume it's valid
                         * BCD; ie, that both nibbles contain only 0-9, not A-F).
                         */
                        b = (b >> 4) * 10 + (b & 0xf);
                        fBCD = true;
                    }
                    if (iRTC == ChipSet.CMOS.ADDR.RTC_HOUR || iRTC == ChipSet.CMOS.ADDR.RTC_HOUR_ALRM) {
                        if (fBCD) {
                            /*
                             * If the original BCD hour was 0x81-0x92, then the previous BINARY-to-BCD conversion
                             * transformed it to 0x51-0x5C, so we must add 0x30.
                             */
                            if (b > 23) {
                                this.assert(b >= 0x51 && b <= 0x5c);
                                b += 0x30;
                            }
                        }
                        if (!(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.HOUR24)) {
                            if (b <= 12) {
                                b = (b == 12? 0 : b);
                            } else {
                                b -= (0x80 - 12);
                                b = (b == 24? 12 : b);
                            }
                        }
                    }
                }
                return b;
            };
            
            /**
             * calcRTCCyclePeriod()
             *
             * This should be called whenever the timings in STATUSA may have changed.
             *
             * TODO: 1024 is a hard-coded number of periods per second based on the default interrupt rate of 976.562us
             * (ie, 1000000 / 976.562).  Calculate the actual number based on the values programmed in the STATUSA register.
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.calcRTCCyclePeriod = function()
            {
                this.nRTCCyclesLastUpdate = this.cpu.getCycles(this.fScaleTimers);
                this.nRTCPeriodsPerSecond = 1024;
                this.nRTCCyclesPerPeriod = Math.floor(this.cpu.getCyclesPerSecond() / this.nRTCPeriodsPerSecond);
                this.setRTCCycleLimit();
            };
            
            /**
             * getRTCCycleLimit(nCycles)
             *
             * This is called by the CPU to determine the maximum number of cycles it can process for the current burst.
             *
             * @this {ChipSet}
             * @param {number} nCycles desired
             * @return {number} maximum number of cycles (<= nCycles)
             */
            ChipSet.prototype.getRTCCycleLimit = function(nCycles)
            {
                if (this.abCMOSData && this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
                    var nCyclesUpdate = this.nRTCCyclesNextUpdate - this.cpu.getCycles(this.fScaleTimers);
                    if (nCyclesUpdate > 0) {
                        if (nCycles > nCyclesUpdate) {
                            if (DEBUG && this.messageEnabled(Messages.RTC)) {
                                this.printMessage("getRTCCycleLimit(" + nCycles + "): reduced to " + nCyclesUpdate + " cycles", true);
                            }
                            nCycles = nCyclesUpdate;
                        } else {
                            if (DEBUG && this.messageEnabled(Messages.RTC)) {
                                this.printMessage("getRTCCycleLimit(" + nCycles + "): already less than " + nCyclesUpdate + " cycles", true);
                            }
                        }
                    } else {
                        if (DEBUG && this.messageEnabled(Messages.RTC)) {
                            this.printMessage("RTC next update has passed by " + nCyclesUpdate + " cycles", true);
                        }
                    }
                }
                return nCycles;
            };
            
            /**
             * setRTCCycleLimit(nCycles)
             *
             * This should be called when PIE becomes set in STATUSB (and whenever PF is cleared in STATUSC while PIE is still set).
             *
             * @this {ChipSet}
             * @param {number} [nCycles]
             */
            ChipSet.prototype.setRTCCycleLimit = function(nCycles)
            {
                if (nCycles === undefined) nCycles = this.nRTCCyclesPerPeriod;
                this.nRTCCyclesNextUpdate = this.cpu.getCycles(this.fScaleTimers) + nCycles;
                if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
                    this.cpu.setBurstCycles(nCycles);
                }
            };
            
            /**
             * updateRTCTime()
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.updateRTCTime = function()
            {
                var nCyclesPerSecond = this.cpu.getCyclesPerSecond();
                var nCyclesUpdate = this.cpu.getCycles(this.fScaleTimers);
            
                /*
                 * We must arrange for the very first calcRTCCyclePeriod() call to occur here, on the very first
                 * updateRTCTime() call, because this is the first point we can be guaranteed that CPU cycle counts
                 * are initialized (the CPU is the last component to be powered up/restored).
                 *
                 * TODO: A side-effect of this is that it undermines the save/restore code's preservation of last
                 * and next RTC cycle counts, which may affect when the next RTC event is delivered.
                 */
                if (this.nRTCCyclesPerPeriod == null) this.calcRTCCyclePeriod();
            
                /*
                 * Step 1: Deal with Periodic Interrupts
                 */
                if (nCyclesUpdate >= this.nRTCCyclesNextUpdate) {
                    var bPrev = this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC];
                    this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.PF;
                    if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE) {
                        /*
                         * When PIE is set, setBurstCycles() should be getting called as needed to ensure
                         * that updateRTCTime() is called more frequently, so let's assert that we don't have
                         * an excess of cycles and thus possibly some missed Periodic Interrupts.
                         */
                        if (DEBUG) {
                            if (nCyclesUpdate - this.nRTCCyclesNextUpdate > this.nRTCCyclesPerPeriod) {
                                if (bPrev & ChipSet.CMOS.STATUSC.PF) {
                                    this.printMessage("RTC interrupt handler failed to clear STATUSC", Messages.RTC);
                                } else {
                                    this.printMessage("CPU took too long trigger new RTC periodic interrupt", Messages.RTC);
                                }
                            }
                        }
                        this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
                        this.setIRR(ChipSet.IRQ.RTC);
                        /*
                         * We could also call setRTCCycleLimit() at this point, but I don't think there's any
                         * benefit until the interrupt had been acknowledged and STATUSC has been read, thereby
                         * clearing the way for another Periodic Interrupt; it seems to me that when STATUSC
                         * is read, that's the more appropriate time to call setRTCCycleLimit().
                         */
                    }
                    this.nRTCCyclesNextUpdate = nCyclesUpdate + this.nRTCCyclesPerPeriod;
                }
            
                /*
                 * Step 2: Deal with Alarm Interrupts
                 */
                if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC_ALRM]) {
                    if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN_ALRM]) {
                        if (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] == this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR_ALRM]) {
                            this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.AF;
                            if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.AIE) {
                                this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
                                this.setIRR(ChipSet.IRQ.RTC);
                            }
                        }
                    }
                }
            
                /*
                 * Step 3: Update the RTC date/time and deal with Update Interrupts
                 */
                var nCyclesDelta = nCyclesUpdate - this.nRTCCyclesLastUpdate;
                this.assert(nCyclesDelta >= 0);
                var nSecondsDelta = Math.floor(nCyclesDelta / nCyclesPerSecond);
            
                /*
                 * We trust that updateRTCTime() is being called as part of updateAllTimers(), and is therefore
                 * being called often enough to ensure that nSecondsDelta will never be greater than one.  In fact,
                 * it would always be LESS than one if it weren't also for the fact that we plow any "unused" cycles
                 * (nCyclesDelta % nCyclesPerSecond) back into nRTCCyclesLastUpdate, so that we will eventually
                 * see a one-second delta.
                 */
                this.assert(nSecondsDelta <= 1);
            
                /*
                 * Make sure that CMOS.STATUSB.SET isn't set; if it is, then the once-per-second RTC updates must be
                 * disabled so that software can write new RTC date/time values without interference.
                 */
                if (nSecondsDelta && !(this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.SET)) {
                    while (nSecondsDelta--) {
                        if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] >= 60) {
                            this.abCMOSData[ChipSet.CMOS.ADDR.RTC_SEC] = 0;
                            if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] >= 60) {
                                this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MIN] = 0;
                                if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] >= 24) {
                                    this.abCMOSData[ChipSet.CMOS.ADDR.RTC_HOUR] = 0;
                                    this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] = (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_WEEK_DAY] % 7) + 1;
                                    var nDayMax = usr.getMonthDays(this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH], this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR]);
                                    if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] > nDayMax) {
                                        this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH_DAY] = 1;
                                        if (++this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] > 12) {
                                            this.abCMOSData[ChipSet.CMOS.ADDR.RTC_MONTH] = 1;
                                            this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] = (this.abCMOSData[ChipSet.CMOS.ADDR.RTC_YEAR] + 1) % 100;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.UF;
                    if (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.UIE) {
                        this.abCMOSData[ChipSet.CMOS.ADDR.STATUSC] |= ChipSet.CMOS.STATUSC.IRQF;
                        this.setIRR(ChipSet.IRQ.RTC);
                    }
                }
            
                this.nRTCCyclesLastUpdate = nCyclesUpdate - (nCyclesDelta % nCyclesPerSecond);
            };
            
            /**
             * initCMOSData()
             *
             * Initialize all the CMOS configuration bytes in the range 0x0E-0x2F (TODO: Decide what to do about 0x30-0x3F)
             *
             * Note that the MODEL_5170 "SETUP" utility is normally what sets all these bytes, including the checksum, and then
             * the BIOS verifies it, but since we want our machines to pass BIOS verification "out of the box", we go the extra
             * mile here, even though it's not really our responsibility.
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.initCMOSData = function()
            {
                /*
                 * On all reset() calls, the RAM component(s) will (re)add their totals, so we have to make sure that
                 * the addition always starts with 0.  That also means that ChipSet must always be initialized before RAM.
                 */
                var iCMOS;
                for (iCMOS = ChipSet.CMOS.ADDR.BASEMEM_LO; iCMOS <= ChipSet.CMOS.ADDR.EXTMEM_HI; iCMOS++) {
                    this.abCMOSData[iCMOS] = 0;
                }
            
                /*
                 * Make sure all the "checksummed" CMOS bytes are initialized (not just the handful we set below) to ensure
                 * that the checksum will be valid.
                 */
                for (iCMOS = ChipSet.CMOS.ADDR.DIAG; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
                    if (this.abCMOSData[iCMOS] === undefined) this.abCMOSData[iCMOS] = 0;
                }
            
                /*
                 * We propagate all compatible "legacy" SW1 bits to the CMOS.EQUIP byte using the old SW masks, but any further
                 * access to CMOS.ADDR.EQUIP should use the new CMOS_EQUIP flags (eg, CMOS.EQUIP.COPROC, CMOS.EQUIP.MONITOR.CGA80, etc).
                 */
                this.abCMOSData[ChipSet.CMOS.ADDR.EQUIP] = this.sw1 & (ChipSet.PPI_SW.MONITOR.MASK | ChipSet.PPI_SW.COPROC | ChipSet.PPI_SW.FDRIVE.IPL | ChipSet.PPI_SW.FDRIVE.MASK);
                this.abCMOSData[ChipSet.CMOS.ADDR.FDRIVE] = (this.getSWFloppyDriveType(0) << 4) | this.getSWFloppyDriveType(1);
            
                /*
                 * The final step is calculating the CMOS checksum, which we then store into the CMOS as a courtesy, so that the
                 * user doesn't get unnecessary CMOS errors.
                 */
                this.updateCMOSChecksum();
            };
            
            /**
             * setCMOSByte(iCMOS, b)
             *
             * This is ONLY for use by components that need to update CMOS configuration bytes to match their internal configuration.
             *
             * @this {ChipSet}
             * @param {number} iCMOS
             * @param {number} b
             * @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
             */
            ChipSet.prototype.setCMOSByte = function(iCMOS, b)
            {
                if (this.abCMOSData) {
                    this.assert(iCMOS >= ChipSet.CMOS.ADDR.FDRIVE && iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI);
                    this.abCMOSData[iCMOS] = b;
                    this.updateCMOSChecksum();
                    return true;
                }
                return false;
            };
            
            /**
             * addCMOSMemory(addr, size)
             *
             * For use by the RAM component, to dynamically update the CMOS memory configuration.
             *
             * @this {ChipSet}
             * @param {number} addr (if 0, BASEMEM_LO/BASEMEM_HI is updated; if >= 0x100000, then EXTMEM_LO/EXTMEM_HI is updated)
             * @param {number} size (in bytes; we convert to Kb)
             * @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
             */
            ChipSet.prototype.addCMOSMemory = function(addr, size)
            {
                if (this.abCMOSData) {
                    var iCMOS = (addr < 0x100000? ChipSet.CMOS.ADDR.BASEMEM_LO : ChipSet.CMOS.ADDR.EXTMEM_LO);
                    var wKb = this.abCMOSData[iCMOS] | (this.abCMOSData[iCMOS+1] << 8);
                    wKb += (size >> 10);
                    this.abCMOSData[iCMOS] = wKb & 0xff;
                    this.abCMOSData[iCMOS+1] = wKb >> 8;
                    this.updateCMOSChecksum();
                    return true;
                }
                return false;
            };
            
            /**
             * setCMOSDriveType(iDrive, bType)
             *
             * For use by the HDC component, to update the CMOS drive configuration to match HDC's internal configuration.
             *
             * TODO: Consider extending this to support FDC drive updates, so that the FDC can specify diskette drive types
             * (ie, FD360 or FD1200) in the same way that HDC does.  However, historically, the ChipSet has been responsible for
             * floppy drive configuration, at least in terms of *number* of drives, through the use of SW1 settings, and we've
             * continued that tradition with the addition of the ChipSet 'floppies' parameter, which allows both the number *and*
             * capacity of drives to be specified with a simple array (eg, [360, 360] for two 360Kb drives).
             *
             * @this {ChipSet}
             * @param {number} iDrive
             * @param {number} bType
             * @return {boolean} true if successful, false if not (eg, CMOS not initialized yet, or no CMOS on this machine)
             */
            ChipSet.prototype.setCMOSDriveType = function(iDrive, bType)
            {
                if (this.abCMOSData) {
                    var b = this.abCMOSData[ChipSet.CMOS.ADDR.HDRIVE];
                    this.assert(bType > 0 && bType < 0xf);
                    if (iDrive) {
                        b = (b & ChipSet.CMOS.HDRIVE.D0_MASK) | bType;
                    } else {
                        b = (b & ChipSet.CMOS.HDRIVE.D1_MASK) | (bType << 4);
                    }
                    this.setCMOSByte(ChipSet.CMOS.ADDR.HDRIVE, b);
                    return true;
                }
                return false;
            };
            
            /**
             * updateCMOSChecksum()
             *
             * This sums all the CMOS bytes from 0x10-0x2D, creating a 16-bit checksum.  That's a total of 30 (unsigned) 8-bit
             * values which could sum to at most 30*255 or 7650 (0x1DE2).  Since there's no way that can overflow 16 bits, we don't
             * worry about masking it with 0xffff.
             *
             * WARNING: The IBM PC AT TechRef, p.1-53 (p.75) claims that the checksum is on bytes 0x10-0x20, but that's simply wrong.
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.updateCMOSChecksum = function()
            {
                var wChecksum = 0;
                for (var iCMOS = ChipSet.CMOS.ADDR.FDRIVE; iCMOS < ChipSet.CMOS.ADDR.CHKSUM_HI; iCMOS++) {
                    wChecksum += this.abCMOSData[iCMOS];
                }
                this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_LO] = wChecksum & 0xff;
                this.abCMOSData[ChipSet.CMOS.ADDR.CHKSUM_HI] = wChecksum >> 8;
            };
            
            /**
             * save()
             *
             * @this {ChipSet}
             * @return {Object}
             *
             * This implements save support for the ChipSet component.
             */
            ChipSet.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, [this.sw1Init, this.sw2Init, this.sw1, this.sw2]);
                state.set(1, [this.saveDMAControllers()]);
                state.set(2, [this.savePICs()]);
                state.set(3, [this.bPIT1Ctrl, this.saveTimers(), this.bPIT2Ctrl]);
                state.set(4, [this.bPPIA, this.bPPIB, this.bPPIC, this.bPPICtrl, this.bNMI]);
                if (this.model >= ChipSet.MODEL_5170) {
                    state.set(5, [this.b8042Status, this.b8042InBuff, this.b8042CmdData,
                                  this.b8042OutBuff, this.b8042InPort, this.b8042OutPort]);
                    state.set(6, [this.abDMAPageSpare[7], this.abDMAPageSpare, this.bCMOSAddr, this.abCMOSData, this.nRTCCyclesLastUpdate, this.nRTCCyclesNextUpdate]);
                }
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * @this {ChipSet}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             *
             * This implements restore support for the ChipSet component.
             */
            ChipSet.prototype.restore = function(data)
            {
                var a, i;
                a = data[0];
                this.sw1Init = a[0];
                this.sw2Init = a[1];
                this.sw1 = a[2];
                this.sw2 = a[3];
            
                a = data[1];
                for (i = 0; i < this.cDMACs; i++) {
                    this.initDMAController(i, a.length == 1? a[0][i] : a);
                }
            
                a = data[2];
                for (i = 0; i < this.cPICs; i++) {
                    this.initPIC(i, i === 0? ChipSet.PIC0.PORT_LO : ChipSet.PIC1.PORT_LO, a[0][i]);
                }
            
                a = data[3];
                this.bPIT1Ctrl = a[0];
                this.bPIT2Ctrl = a[2];
                for (i = 0; i < this.aTimers.length; i++) {
                    this.initTimer(i, a[1][i]);
                }
            
                a = data[4];
                this.bPPIA = a[0];
                this.bPPIB = a[1];
                this.bPPIC = a[2];
                this.bPPICtrl = a[3];
                this.bNMI  = a[4];
            
                a = data[5];
                if (a) {
                    this.assert(this.model >= ChipSet.MODEL_5170);
                    this.b8042Status = a[0];
                    this.b8042InBuff = a[1];
                    this.b8042CmdData = a[2];
                    this.b8042OutBuff = a[3];
                    this.b8042InPort = a[4];
                    this.b8042OutPort = a[5];
                }
            
                a = data[6];
                if (a) {
                    this.assert(this.model >= ChipSet.MODEL_5170);
                    this.abDMAPageSpare = a[1];
                    this.abDMAPageSpare[7] = a[0];  // formerly bMFGData
                    this.bCMOSAddr = a[2];
                    this.abCMOSData = a[3];
                    this.nRTCCyclesLastUpdate = a[4];
                    this.nRTCCyclesNextUpdate = a[5];
                    /*
                     * TODO: Decide whether restore() should faithfully preserve the RTC date/time that save() saved,
                     * or always reinitialize the date/time, or give the user (or the machine configuration) the option.
                     *
                     * For now, we're always reinitializing the RTC date.  Alternatively, we could selectively update
                     * the CMOS bytes above, instead of overwriting them all, in which case this extra call to initRTCTime()
                     * could be avoided.
                     */
                    this.initRTCTime();
                }
                return true;
            };
            
            ChipSet.aDMAControllerInit = [0, null, null, 0, new Array(4)];
            
            /**
             * initDMAController(iDMAC, aState)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {Array} [aState]
             */
            ChipSet.prototype.initDMAController = function(iDMAC, aState)
            {
                var controller = this.aDMACs[iDMAC];
                if (!controller) {
                    this.assert(!aState);
                    controller = {
                        aChannels: new Array(4)
                    };
                }
                var a = aState && aState.length == 5? aState : ChipSet.aDMAControllerInit;
                controller.bStatus = a[0];
                controller.bCmd = a[1];
                controller.bReq = a[2];
                controller.bIndex = a[3];
                controller.nChannelBase = iDMAC << 2;
                for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
                    this.initDMAChannel(controller, iChannel, a[4][iChannel]);
                }
                this.aDMACs[iDMAC] = controller;
            };
            
            ChipSet.aDMAChannelInit = [true, [0,0], [0,0], [0,0], [0,0]];
            
            /**
             * initDMAChannel(controller, iChannel, aState)
             *
             * @this {ChipSet}
             * @param {Object} controller
             * @param {number} iChannel
             * @param {Array} [aState]
             */
            ChipSet.prototype.initDMAChannel = function(controller, iChannel, aState)
            {
                var channel = controller.aChannels[iChannel];
                if (!channel) {
                    this.assert(!aState);
                    channel = {
                        addrInit: [0,0],
                        countInit: [0,0],
                        addrCurrent: [0,0],
                        countCurrent: [0,0]
                    };
                }
                var a = aState && aState.length == 8? aState : ChipSet.aDMAChannelInit;
                channel.masked = a[0];
                channel.addrInit[0] = a[1][0]; channel.addrInit[1] = a[1][1];
                channel.countInit[0] = a[2][0];  channel.countInit[1] = a[2][1];
                channel.addrCurrent[0] = a[3][0]; channel.addrCurrent[1] = a[3][1];
                channel.countCurrent[0] = a[4][0]; channel.countCurrent[1] = a[4][1];
                channel.mode = a[5];
                channel.bPage = a[6];
                // a[7] is deprecated
                channel.controller = controller;
                channel.iChannel = iChannel;
                this.initDMAFunction(channel, a[8], a[9]);
                controller.aChannels[iChannel] = channel;
            };
            
            /**
             * initDMAFunction(channel)
             *
             * @param {Object} channel
             * @param {Component|string} [component]
             * @param {string} [sFunction]
             * @param {Object} [obj]
             * @return {*}
             */
            ChipSet.prototype.initDMAFunction = function(channel, component, sFunction, obj)
            {
                if (typeof component == "string") {
                    component = Component.getComponentByID(component);
                }
                if (component) {
                    channel.done = null;
                    channel.sDevice = component.id;
                    channel.sFunction = sFunction;
                    channel.component = component;
                    channel.fnTransfer = component[sFunction];
                    channel.obj = obj;
                }
                return channel.fnTransfer;
            };
            
            /**
             * saveDMAControllers()
             *
             * @this {ChipSet}
             * @return {Array}
             */
            ChipSet.prototype.saveDMAControllers = function()
            {
                var data = [];
                for (var iDMAC = 0; iDMAC < this.aDMACs; iDMAC++) {
                    var controller = this.aDMACs[iDMAC];
                    data[iDMAC] = [
                        controller.bStatus,
                        controller.bCmd,
                        controller.bReq,
                        controller.bIndex,
                        this.saveDMAChannels(controller)
                    ];
                }
                return data;
            };
            
            /**
             * saveDMAChannels(controller)
             *
             * @this {ChipSet}
             * @param {Object} controller
             * @return {Array}
             */
            ChipSet.prototype.saveDMAChannels = function(controller)
            {
                var data = [];
                for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
                    var channel = controller.aChannels[iChannel];
                    data[iChannel] = [
                        channel.masked,
                        channel.addrInit,
                        channel.countInit,
                        channel.addrCurrent,
                        channel.countCurrent,
                        channel.mode,
                        channel.bPage,
                        channel.sDevice,
                        channel.sFunction
                    ];
                }
                return data;
            };
            
            ChipSet.aPICInit = [0, new Array(4)];
            
            /**
             * initPIC(iPIC, port, aState)
             *
             * @this {ChipSet}
             * @param {number} iPIC
             * @param {number} port
             * @param {Array} [aState]
             */
            ChipSet.prototype.initPIC = function(iPIC, port, aState)
            {
                var pic = this.aPICs[iPIC];
                if (!pic) {
                    pic = {
                        aICW:   [null,null,null,null]
                    };
                }
                var a = aState && aState.length == 8? aState : ChipSet.aPICInit;
                pic.port = port;
                pic.nIRQBase = iPIC << 3;
                pic.nDelay = a[0];
                pic.aICW[0] = a[1][0]; pic.aICW[1] = a[1][1]; pic.aICW[2] = a[1][2]; pic.aICW[3] = a[1][3];
                pic.nICW = a[2];
                pic.bIMR = a[3];
                pic.bIRR = a[4];
                pic.bISR = a[5];
                pic.bIRLow = a[6];
                pic.bOCW3 = a[7];
                this.aPICs[iPIC] = pic;
            };
            
            /**
             * savePICs()
             *
             * @this {ChipSet}
             * @return {Array}
             */
            ChipSet.prototype.savePICs = function()
            {
                var data = [];
                for (var iPIC = 0; iPIC < this.aPICs.length; iPIC++) {
                    var pic = this.aPICs[iPIC];
                    data[iPIC] = [
                        pic.nDelay,
                        pic.aICW,
                        pic.nICW,
                        pic.bIMR,
                        pic.bIRR,
                        pic.bISR,
                        pic.bIRLow,
                        pic.bOCW3
                    ];
                }
                return data;
            };
            
            ChipSet.aTimerInit = [[0,0], [0,0], [0,0], [0,0]];
            
            /**
             * initTimer(iTimer, aState)
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @param {Array} [aState]
             */
            ChipSet.prototype.initTimer = function(iTimer, aState)
            {
                var timer = this.aTimers[iTimer];
                if (!timer) {
                    timer = {
                        countInit: [0,0],
                        countStart: [0,0],
                        countCurrent: [0,0],
                        countLatched: [0,0]
                    };
                }
                var a = aState && aState.length == 13? aState : ChipSet.aTimerInit;
                timer.countInit[0] = a[0][0]; timer.countInit[1] = a[0][1];
                timer.countStart[0] = a[1][0]; timer.countStart[1] = a[1][1];
                timer.countCurrent[0] = a[2][0]; timer.countCurrent[1] = a[2][1];
                timer.countLatched[0] = a[3][0]; timer.countLatched[1] = a[3][1];
                timer.bcd = a[4];
                timer.mode = a[5];
                timer.rw = a[6];
                timer.countIndex = a[7];
                timer.countBytes = a[8];
                timer.fOUT = a[9];
                timer.fLatched = a[10];
                timer.fCounting = a[11];
                timer.nCyclesStart = a[12];
                this.aTimers[iTimer] = timer;
            };
            
            /**
             * saveTimers()
             *
             * @this {ChipSet}
             * @return {Array}
             */
            ChipSet.prototype.saveTimers = function()
            {
                var data = [];
                for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
                    var timer = this.aTimers[iTimer];
                    data[iTimer] = [
                        timer.countInit,
                        timer.countStart,
                        timer.countCurrent,
                        timer.countLatched,
                        timer.bcd,
                        timer.mode,
                        timer.rw,
                        timer.countIndex,
                        timer.countBytes,
                        timer.fOUT,
                        timer.fLatched,
                        timer.fCounting,
                        timer.nCyclesStart
                    ];
                }
                return data;
            };
            
            /**
             * getSWMemorySize(fInit)
             *
             * @this {ChipSet}
             * @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
             * @return {number} number of Kb of specified memory (NOT necessarily the same as installed memory; see RAM component)
             */
            ChipSet.prototype.getSWMemorySize = function(fInit)
            {
                var sw1 = (fInit? this.sw1Init : this.sw1);
                var sw2 = (fInit? this.sw2Init : this.sw2);
                return (((sw1 & ChipSet.PPI_SW.MEMORY.MASK) >> ChipSet.PPI_SW.MEMORY.SHIFT) + 1) * this.kbSW + (sw2 & ChipSet.PPI_C.SW) * 32;
            };
            
            /**
             * getSWFloppyDrives(fInit)
             *
             * @this {ChipSet}
             * @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
             * @return {number} number of floppy drives specified by SW1 (range is 0 to 4)
             */
            ChipSet.prototype.getSWFloppyDrives = function(fInit)
            {
                var sw1 = (fInit? this.sw1Init : this.sw1);
                return ((this.model != ChipSet.MODEL_5150) || (sw1 & ChipSet.PPI_SW.FDRIVE.IPL))? ((sw1 & ChipSet.PPI_SW.FDRIVE.MASK) >> ChipSet.PPI_SW.FDRIVE.SHIFT) + 1 : 0;
            };
            
            /**
             * getSWFloppyDriveType(iDrive)
             *
             * @this {ChipSet}
             * @param {number} iDrive (0-based)
             * @return {number} one of the ChipSet.CMOS.FDRIVE.FD* values (FD360, FD1200, etc)
             */
            ChipSet.prototype.getSWFloppyDriveType = function(iDrive)
            {
                if (iDrive < this.getSWFloppyDrives()) {
                    if (!this.aFloppyDrives) {
                        return ChipSet.CMOS.FDRIVE.FD360;
                    }
                    if (iDrive < this.aFloppyDrives.length) {
                        switch(this.aFloppyDrives[iDrive]) {
                        case 160:
                        case 180:
                        case 320:
                        case 360:
                            return ChipSet.CMOS.FDRIVE.FD360;
                        case 720:
                            return ChipSet.CMOS.FDRIVE.FD720;
                        case 1200:
                            return ChipSet.CMOS.FDRIVE.FD1200;
                        case 1440:
                            return ChipSet.CMOS.FDRIVE.FD1440;
                        }
                    }
                    this.assert(false);  // we should never get here (else something is out of out sync)
                }
                return ChipSet.CMOS.FDRIVE.NONE;
            };
            
            /**
             * getSWFloppyDriveSize(iDrive)
             *
             * @this {ChipSet}
             * @param {number} iDrive (0-based)
             * @return {number} capacity of drive in Kb (eg, 360, 1200, 1440, etc), or 0 if none
             */
            ChipSet.prototype.getSWFloppyDriveSize = function(iDrive)
            {
                if (iDrive < this.getSWFloppyDrives()) {
                    if (!this.aFloppyDrives) {
                        return 360;
                    }
                    if (iDrive < this.aFloppyDrives.length) {
                        return this.aFloppyDrives[iDrive];
                    }
                    this.assert(false);  // we should never get here (else something is out of out sync)
                }
                return 0;
            };
            
            /**
             * getSWVideoMonitor(fInit)
             *
             * @this {ChipSet}
             * @param {boolean} [fInit] is true for init switch value(s) only, current value(s) otherwise
             * @return {number} one of ChipSet.MONITOR.*
             */
            ChipSet.prototype.getSWVideoMonitor = function(fInit)
            {
                var sw1 = (fInit? this.sw1Init : this.sw1);
                return (sw1 & ChipSet.PPI_SW.MONITOR.MASK) >> ChipSet.PPI_SW.MONITOR.SHIFT;
            };
            
            /**
             * addSwitches(s, control, n, v, oTips)
             *
             * @this {ChipSet}
             * @param {string} s is the name of the control
             * @param {Object} control is the HTML control DOM object
             * @param {number} n is the number of switches to add
             * @param {number} v contains the current value(s) of the switches
             * @param {Object} oTips contains tooltips for the various cells
             */
            ChipSet.prototype.addSwitches = function(s, control, n, v, oTips)
            {
                var sHTML = "";
                var sCellClass = PCJSCLASS + "-bitCell";
                for (var i = 1; i <= n; i++) {
                    var sCellClasses = sCellClass;
                    if (!i) sCellClasses += " " + PCJSCLASS + "-bitCellLeft";
                    var sCellID = s + "-" + i;
                    sHTML += "<div id=\"" + sCellID + "\" class=\"" + sCellClasses + "\" data-value=\"0\">" + i + "</div>\n";
                }
                control.innerHTML = sHTML;
                var aeCells = Component.getElementsByClass(control, sCellClass);
                var sTip = null;
                for (i = 0; i < aeCells.length; i++) {
                    if (oTips != null && oTips[i] != null) {
                        sTip = oTips[i];
                    }
                    if (sTip) aeCells[i].setAttribute("title", sTip);
                    this.setSwitch(aeCells[i], (v & (0x1 << i))? false : true);
                    aeCells[i].onclick = function(chipset, eSwitch) {
                        /*
                         *  If we defined the onclick handler below as "function(e)" instead of simply "function()", then we could
                         *  also receive an event object (e); however, IE reportedly requires that we examine a global (window.event)
                         *  instead.  If that's true, and if we ever care to get more details about the click event, then we might
                         *  have to worry about that (eg, define a local var: "var event = window.event || e").
                         */
                        return function onClickSwitch() {
                            chipset.toggleSwitch(eSwitch);
                        };
                    }(this, aeCells[i]);
                }
            };
            
            /**
             * getSwitch(control)
             *
             * @this {ChipSet}
             * @param {Object} control is an HTML control DOM object
             * @return {boolean} true if the switch represented by e is "on", false if "off"
             */
            ChipSet.prototype.getSwitch = function(control)
            {
                return control.getAttribute("data-value") == "1";
            };
            
            /**
             * setSwitch(control, f)
             *
             * @this {ChipSet}
             * @param {Object} control is an HTML control DOM object
             * @param {boolean} f is true if the switch represented by control should be "on", false if "off"
             */
            ChipSet.prototype.setSwitch = function(control, f)
            {
                control.setAttribute("data-value", f? "1" : "0");
                control.style.color = (f? "#ffffff" : "#000000");
                control.style.backgroundColor = (f? "#000000" : "#ffffff");
            };
            
            /**
             * toggleSwitch(control)
             *
             * @this {ChipSet}
             * @param {Object} control is an HTML control DOM object
             */
            ChipSet.prototype.toggleSwitch = function(control)
            {
                var f = !this.getSwitch(control);
                this.setSwitch(control, f);
                var sID = control.getAttribute("id");
                var asParts = sID.split("-");
                var b = (0x1 << (+asParts[1] - 1));
                switch (asParts[0]) {
                case "sw1":
                    this.sw1Init = (this.sw1Init & ~b) | (f? 0 : b);
                    break;
                case "sw2":
                    this.sw2Init = (this.sw2Init & ~b) | (f? 0 : b);
                    break;
                default:
                    break;
                }
                this.updateSwitchDesc();
            };
            
            /**
             * updateSwitchDesc()
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.updateSwitchDesc = function()
            {
                var controlDesc = this.bindings["swdesc"];
                /*
                 * TODO: Monitor type 0 used to be "No" (as in "No Monitor"), which was correct in the pre-EGA world,
                 * but in the post-EGA world, it depends.  We could ask the Video component for a definitive answer, but
                 * but what we print here isn't that critical, because most people won't bother with a Control Panel,
                 * which is really the only beneficiary of this code.
                 */
                var asMonitorTypes = {
                    0: "Enhanced Color",
                    1: "TV",
                    2: "Color",
                    3: "Monochrome"
                };
                if (controlDesc != null) {
                    var sText = "";
                    sText += this.getSWMemorySize(true) + "Kb";
                    sText += ", " + asMonitorTypes[this.getSWVideoMonitor(true)] + " Monitor";
                    sText += ", " + this.getSWFloppyDrives(true) + " Floppy Drives";
                    if (this.sw1 != null && this.sw1 != this.sw1Init || this.sw2 != null && this.sw2 != this.sw2Init) {
                        sText += " (Reset required)";
                    }
                    controlDesc.textContent = sText;
                }
            };
            
            /**
             * dumpPIC()
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.dumpPIC = function()
            {
                if (DEBUGGER) {
                    for (var iPIC = 0; iPIC < this.aPICs.length; iPIC++) {
                        var pic = this.aPICs[iPIC];
                        var sDump = "PIC" + iPIC + ":";
                        for (var i = 0; i < pic.aICW.length; i++) {
                            var b = pic.aICW[i];
                            sDump += " IC" + (i + 1) + '=' + str.toHexByte(b);
                        }
                        sDump += " IMR=" + str.toHexByte(pic.bIMR) + " IRR=" + str.toHexByte(pic.bIRR) + " ISR=" + str.toHexByte(pic.bISR) + " DELAY=" + pic.nDelay;
                        this.dbg.println(sDump);
                    }
                }
            };
            
            /**
             * dumpTimer()
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.dumpTimer = function()
            {
                if (DEBUGGER) {
                    for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
                        this.updateTimer(iTimer);
                        var timer = this.aTimers[iTimer];
                        var sDump = "TIMER" + iTimer + ":";
                        var count = 0;
                        if (timer.countBytes != null) {
                            for (var i = 0; i <= timer.countBytes; i++) {
                                count |= (timer.countCurrent[i] << (i * 8));
                            }
                        }
                        sDump += " mode=" + timer.mode + " bytes=" + timer.countBytes + " count=" + str.toHexWord(count);
                        this.dbg.println(sDump);
                    }
                }
            };
            
            /**
             * dumpCMOS()
             *
             * @this {ChipSet}
             */
            ChipSet.prototype.dumpCMOS = function()
            {
                if (DEBUGGER) {
                    var sDump = "";
                    for (var iCMOS = 0; iCMOS < ChipSet.CMOS.ADDR.TOTAL; iCMOS++) {
                        var b = (iCMOS <= ChipSet.CMOS.ADDR.STATUSD? this.getRTCByte(iCMOS) : this.abCMOSData[iCMOS]);
                        if (sDump) sDump += '\n';
                        sDump += "CMOS[" + str.toHexByte(iCMOS) + "]: " + str.toHexByte(b);
                    }
                    this.dbg.println(sDump);
                }
            };
            
            /**
             * inDMAChannelAddr(iDMAC, iChannel, port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} iChannel
             * @param {number} port (0x00, 0x02, 0x04, 0x06 for DMAC 0, 0xC0, 0xC4, 0xC8, 0xCC for DMAC 1)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inDMAChannelAddr = function(iDMAC, iChannel, port, addrFrom)
            {
                var controller = this.aDMACs[iDMAC];
                var channel = controller.aChannels[iChannel];
                var b = channel.addrCurrent[controller.bIndex];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".ADDR[" + controller.bIndex + "]", b, true);
                }
                controller.bIndex ^= 0x1;
                /*
                 * Technically, aTimers[1].fOut is what drives DMA requests for DMA channel 0 (ChipSet.DMA_REFRESH),
                 * every 15us, once the BIOS has initialized the channel's "mode" with MODE_SINGLE, INCREMENT, AUTOINIT,
                 * and TYPE_READ (0x58) and initialized TIMER1 appropriately.
                 *
                 * However, we don't need to be that particular.  Simply simulate an ever-increasing address after every
                 * read of the full DMA channel 0 address.
                 */
                if (!iDMAC && iChannel == ChipSet.DMA_REFRESH && !controller.bIndex) {
                    channel.addrCurrent[0]++;
                    if (channel.addrCurrent[0] > 0xff) {
                        channel.addrCurrent[0] = 0;
                        channel.addrCurrent[1]++;
                        if (channel.addrCurrent[1] > 0xff) {
                            channel.addrCurrent[1] = 0;
                        }
                    }
                }
                return b;
            };
            
            /**
             * outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} iChannel
             * @param {number} port (0x00, 0x02, 0x04, 0x06 for DMAC 0, 0xC0, 0xC4, 0xC8, 0xCC for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAChannelAddr = function outDMAChannelAddr(iDMAC, iChannel, port, bOut, addrFrom)
            {
                var controller = this.aDMACs[iDMAC];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".ADDR[" + controller.bIndex + "]", null, true);
                }
                var channel = controller.aChannels[iChannel];
                channel.addrCurrent[controller.bIndex] = channel.addrInit[controller.bIndex] = bOut;
                controller.bIndex ^= 0x1;
            };
            
            /**
             * inDMAChannelCount(iDMAC, iChannel, port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} iChannel
             * @param {number} port (0x01, 0x03, 0x05, 0x07 for DMAC 0, 0xC2, 0xC6, 0xCA, 0xCE for DMAC 1)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inDMAChannelCount = function(iDMAC, iChannel, port, addrFrom)
            {
                var controller = this.aDMACs[iDMAC];
                var channel = controller.aChannels[iChannel];
                var b = channel.countCurrent[controller.bIndex];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".COUNT[" + controller.bIndex + "]", b, true);
                }
                controller.bIndex ^= 0x1;
                /*
                 * Technically, aTimers[1].fOut is what drives DMA requests for DMA channel 0 (ChipSet.DMA_REFRESH),
                 * every 15us, once the BIOS has initialized the channel's "mode" with MODE_SINGLE, INCREMENT, AUTOINIT,
                 * and TYPE_READ (0x58) and initialized TIMER1 appropriately.
                 *
                 * However, we don't need to be that particular.  Simply simulate an ever-decreasing count after every
                 * read of the full DMA channel 0 count.
                 */
                if (!iDMAC && iChannel == ChipSet.DMA_REFRESH && !controller.bIndex) {
                    channel.countCurrent[0]--;
                    if (channel.countCurrent[0] < 0) {
                        channel.countCurrent[0] = 0xff;
                        channel.countCurrent[1]--;
                        if (channel.countCurrent[1] < 0) {
                            channel.countCurrent[1] = 0xff;
                            /*
                             * This is the logical point to indicate Terminal Count (TC), but again, there's no need to be
                             * so particular; inDMAStatus() has its own logic for periodically signalling TC.
                             */
                        }
                    }
                }
                return b;
            };
            
            /**
             * outDMAChannelCount(iDMAC, iChannel, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} iChannel (ports 0x01, 0x03, 0x05, 0x07)
             * @param {number} port (0x01, 0x03, 0x05, 0x07 for DMAC 0, 0xC2, 0xC6, 0xCA, 0xCE for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAChannelCount = function(iDMAC, iChannel, port, bOut, addrFrom)
            {
                var controller = this.aDMACs[iDMAC];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".COUNT[" + controller.bIndex + "]", null, true);
                }
                var channel = controller.aChannels[iChannel];
                channel.countCurrent[controller.bIndex] = channel.countInit[controller.bIndex] = bOut;
                controller.bIndex ^= 0x1;
            };
            
            /**
             * inDMAStatus(iDMAC, port, addrFrom)
             *
             * From the 8237A spec:
             *
             * "The Status register is available to be read out of the 8237A by the microprocessor.
             * It contains information about the status of the devices at this point. This information includes
             * which channels have reached Terminal Count (TC) and which channels have pending DMA requests.
             *
             * Bits 0–3 are set every time a TC is reached by that channel or an external EOP is applied.
             * These bits are cleared upon Reset and on each Status Read.
             *
             * Bits 4–7 are set whenever their corresponding channel is requesting service."
             *
             * TRIVIA: This hook wasn't installed when I was testing with the MODEL_5150 ROM BIOS, and it
             * didn't matter, but the MODEL_5160 ROM BIOS checks it several times, including @F000:E156, where
             * it verifies that TIMER1 didn't request service on channel 0.
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x08 for DMAC 0, 0xD0 for DMAC 1)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inDMAStatus = function(iDMAC, port, addrFrom)
            {
                /*
                 * HACK: Unlike the MODEL_5150, the MODEL_5160 ROM BIOS checks DMA channel 0 for TC (@F000:E4DF)
                 * after running a number of unrelated tests, since enough time would have passed for channel 0 to
                 * have reached TC at least once.  So I simply OR in a hard-coded TC bit for channel 0 every time
                 * status is read.
                 */
                var controller = this.aDMACs[iDMAC];
                var b = controller.bStatus | ChipSet.DMA_STATUS.CH0_TC;
                controller.bStatus &= ~ChipSet.DMA_STATUS.ALL_TC;
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".STATUS", b, true);
                }
                return b;
            };
            
            /**
             * outDMACmd(iDMAC, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x08 for DMAC 0, 0xD0 for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMACmd = function(iDMAC, port, bOut, addrFrom)
            {
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CMD", null, true);
                }
                this.aDMACs[iDMAC].bCmd = bOut;
            };
            
            /**
             * outDMAReq(iDMAC, port, bOut, addrFrom)
             *
             * From the 8237A spec:
             *
             * "The 8237A can respond to requests for DMA service which are initiated by software as well as by a DREQ.
             * Each channel has a request bit associated with it in the 4-bit Request register. These are non-maskable and subject
             * to prioritization by the Priority Encoder network. Each register bit is set or reset separately under software
             * control or is cleared upon generation of a TC or external EOP. The entire register is cleared by a Reset.
             *
             * To set or reset a bit the software loads the proper form of the data word.... In order to make a software request,
             * the channel must be in Block Mode."
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x09 for DMAC 0, 0xD2 for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAReq = function(iDMAC, port, bOut, addrFrom)
            {
                var controller = this.aDMACs[iDMAC];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".REQ", null, true);
                }
                /*
                 * Bits 0-1 contain the channel number
                 */
                var iChannel = (bOut & 0x3);
                /*
                 * Bit 2 is the request bit (0 to reset, 1 to set), which must be propagated to the corresponding bit (4-7) in the status register
                 */
                var iChannelBit = ((bOut & 0x4) << (iChannel + 2));
                controller.bStatus = (controller.bStatus & ~(0x10 << iChannel)) | iChannelBit;
                controller.bReq = bOut;
            };
            
            /**
             * outDMAMask(iDMAC, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x0A for DMAC 0, 0xD4 for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAMask = function(iDMAC, port, bOut, addrFrom)
            {
                var controller = this.aDMACs[iDMAC];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MASK", null, true);
                }
                var iChannel = bOut & ChipSet.DMA_MASK.CHANNEL;
                var channel = controller.aChannels[iChannel];
                channel.masked = !!(bOut & ChipSet.DMA_MASK.CHANNEL_SET);
                if (!channel.masked) this.requestDMA(controller.nChannelBase + iChannel);
            };
            
            /**
             * outDMAMode(iDMAC, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x0B for DMAC 0, 0xD6 for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAMode = function(iDMAC, port, bOut, addrFrom)
            {
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MODE", null, true);
                }
                var iChannel = bOut & ChipSet.DMA_MODE.CHANNEL;
                this.aDMACs[iDMAC].aChannels[iChannel].mode = bOut;
            };
            
            /**
             * outDMAResetFF(iDMAC, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x0C for DMAC 0, 0xD8 for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             *
             * Any write to this port simply resets the controller's "first/last flip-flop", which determines whether
             * the even or odd byte of a DMA address or count register will be accessed next.
             */
            ChipSet.prototype.outDMAResetFF = function(iDMAC, port, bOut, addrFrom)
            {
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".RESET_FF", null, true);
                }
                this.aDMACs[iDMAC].bIndex = 0;
            };
            
            /**
             * outDMAMasterClear(iDMAC, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} port (0x0D for DMAC 0, 0xDA for DMAC 1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAMasterClear = function(iDMAC, port, bOut, addrFrom)
            {
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".MASTER_CLEAR", null, true);
                }
                /*
                 * The value written to this port doesn't matter; any write triggers a "master clear" operation
                 *
                 * TODO: Can't we just call initDMAController(), which would also take care of clearing controller.bStatus?
                 */
                var controller = this.aDMACs[iDMAC];
                for (var i = 0; i < controller.aChannels.length; i++) {
                    this.initDMAChannel(controller, i);
                }
            };
            
            /**
             * inDMAPageReg(iDMAC, iChannel, port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} iChannel
             * @param {number} port
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inDMAPageReg = function(iDMAC, iChannel, port, addrFrom)
            {
                var bIn = this.aDMACs[iDMAC].aChannels[iChannel].bPage;
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".PAGE", bIn, true);
                }
                return bIn;
            };
            
            /**
             * outDMAPageReg(iDMAC, iChannel, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iDMAC
             * @param {number} iChannel
             * @param {number} port
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAPageReg = function(iDMAC, iChannel, port, bOut, addrFrom)
            {
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA" + iDMAC + ".CHANNEL" + iChannel + ".PAGE", null, true);
                }
                this.aDMACs[iDMAC].aChannels[iChannel].bPage = bOut;
            };
            
            /**
             * inDMAPageSpare(iSpare, port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iSpare
             * @param {number} port
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inDMAPageSpare = function(iSpare, port, addrFrom)
            {
                var bIn = this.abDMAPageSpare[iSpare];
                if (this.messageEnabled(Messages.DMA | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "DMA.SPARE" + iSpare + ".PAGE", bIn, true);
                }
                return bIn;
            };
            
            /**
             * outDMAPageSpare(iSpare, port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iSpare
             * @param {number} port
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outDMAPageSpare = function(iSpare, port, bOut, addrFrom)
            {
                /*
                 * TODO: Remove this DEBUG-only DESKPRO386 code once we're done debugging DeskPro 386 ROMs;
                 * it enables logging of all DeskPro ROM checkpoint I/O to port 0x84.
                 */
                if (this.messageEnabled(Messages.DMA | Messages.PORT) || DEBUG && this.model == ChipSet.MODEL_DESKPRO386 && port == 0x84) {
                    this.printMessageIO(port, bOut, addrFrom, "DMA.SPARE" + iSpare + ".PAGE", null, true);
                }
                this.abDMAPageSpare[iSpare] = bOut;
            };
            
            /**
             * checkDMA()
             *
             * Called by the CPU whenever INTR.DMA is set.
             *
             * @return {boolean} true if one or more async DMA channels are still active (unmasked), false to reset INTR.DMA
             */
            ChipSet.prototype.checkDMA = function()
            {
                var fActive = false;
                for (var iDMAC = 0; iDMAC < this.aDMACs; iDMAC++) {
                    var controller = this.aDMACs[iDMAC];
                    for (var iChannel = 0; iChannel < controller.aChannels.length; iChannel++) {
                        var channel = controller.aChannels[iChannel];
                        if (!channel.masked) {
                            this.advanceDMA(channel);
                            if (!channel.masked) fActive = true;
                        }
                    }
                }
                return fActive;
            };
            
            /**
             * connectDMA(iDMAChannel, component, sFunction, obj)
             *
             * @param {number} iDMAChannel
             * @param {Component|string} component
             * @param {string} sFunction
             * @param {Object} obj (eg, when the HDC connects, it passes a drive object)
             */
            ChipSet.prototype.connectDMA = function(iDMAChannel, component, sFunction, obj)
            {
                var iDMAC = iDMAChannel >> 2;
                var controller = this.aDMACs[iDMAC];
            
                var iChannel = iDMAChannel & 0x3;
                var channel = controller.aChannels[iChannel];
            
                this.initDMAFunction(channel, component, sFunction, obj);
            };
            
            /**
             * requestDMA(iDMAChannel, done)
             *
             * @this {ChipSet}
             * @param {number} iDMAChannel
             * @param {function(boolean)} [done]
             *
             * For DMA_MODE.TYPE_WRITE transfers, fnTransfer(-1) must return bytes as long as we request them (although it may
             * return -1 if it runs out of bytes prematurely).
             *
             * Similarly, for DMA_MODE.TYPE_READ transfers, fnTransfer(b) must accept bytes as long as we deliver them (although
             * it is certainly free to ignore bytes it no longer wants).
             */
            ChipSet.prototype.requestDMA = function(iDMAChannel, done)
            {
                var iDMAC = iDMAChannel >> 2;
                var controller = this.aDMACs[iDMAC];
            
                var iChannel = iDMAChannel & 0x3;
                var channel = controller.aChannels[iChannel];
            
                if (!channel.component || !channel.fnTransfer || !channel.obj) {
                    if (DEBUG && this.messageEnabled(Messages.DMA | Messages.DATA)) {
                        this.printMessage("requestDMA(" + iDMAChannel + "): not connected to a component", true);
                    }
                    if (done) done(true);
                    return;
                }
            
                /*
                 * We can't simply slam done into channel.done; that would be fine if requestDMA() was called only by functions
                 * like HDC.doRead() and HDC.doWrite(), but we're also called whenever a DMA channel is unmasked, and in those cases,
                 * we need to preserve whatever handler may have been previously set.
                 *
                 * However, in an effort to ensure we don't end up with stale done handlers, connectDMA() will reset channel.done.
                 */
                if (done) channel.done = done;
            
                if (channel.masked) {
                    if (DEBUG && this.messageEnabled(Messages.DMA | Messages.DATA)) {
                        this.printMessage("requestDMA(" + iDMAChannel + "): channel masked, request queued", true);
                    }
                    return;
                }
            
                /*
                 * Let's try to do async DMA without asking the CPU for help...
                 *
                 *      this.cpu.setDMA(true);
                 */
                this.advanceDMA(channel, true);
            };
            
            /**
             * advanceDMA(channel, fInit)
             *
             * @this {ChipSet}
             * @param {Object} channel
             * @param {boolean} [fInit]
             */
            ChipSet.prototype.advanceDMA = function(channel, fInit)
            {
                if (fInit) {
                    channel.count = (channel.countCurrent[1] << 8) | channel.countCurrent[0];
                    channel.type = (channel.mode & ChipSet.DMA_MODE.TYPE);
                    channel.fWarning = channel.fError = false;
                    if (DEBUG && DEBUGGER) {
                        channel.cbDebug = channel.count + 1;
                        channel.sAddrDebug = (DEBUG && DEBUGGER? null : undefined);
                    }
                }
                /*
                 * To support async DMA without requiring help from the CPU (ie, without relying upon cpu.setDMA()), we require that
                 * the data transfer functions provide an fAsync parameter to their callbacks; fAsync must be true if the callback was
                 * truly asynchronous (ie, it had to wait for a remote I/O request to finish), or false if the data was already available
                 * and the callback was performed synchronously.
                 *
                 * Whenever a callback is issued asynchronously, we will immediately daisy-chain another pair of updateDMA()/advanceDMA()
                 * calls, which will either finish the DMA operation if no more remote I/O requests are required, or will queue up another
                 * I/O request, which will in turn trigger another async callback.  Thus, the DMA request keeps itself going without
                 * requiring any special assistance from the CPU via setDMA().
                 */
                var bto = null;
                var chipset = this;
                var fAsyncRequest = false;
                var controller = channel.controller;
                var iDMAChannel = controller.nChannelBase + channel.iChannel;
            
                while (true) {
                    if (channel.count >= 0) {
                        var b;
                        var addr = (channel.bPage << 16) | (channel.addrCurrent[1] << 8) | channel.addrCurrent[0];
                        if (DEBUG && DEBUGGER && channel.sAddrDebug === null) {
                            channel.sAddrDebug = str.toHex(addr >> 4, 4) + ":" + str.toHex(addr & 0xf, 4);
                            if (this.messageEnabled(this.messageBitsDMA(iDMAChannel)) && channel.type != ChipSet.DMA_MODE.TYPE_WRITE) {
                                this.printMessage("advanceDMA(" + iDMAChannel + ") transferring " + channel.cbDebug + " bytes from " + channel.sAddrDebug, true);
                                this.dbg.doDump("db", channel.sAddrDebug, "l" + channel.cbDebug);
                            }
                        }
                        if (channel.type == ChipSet.DMA_MODE.TYPE_WRITE) {
                            fAsyncRequest = true;
                            (function advanceDMAWrite(addrCur) {
                                channel.fnTransfer.call(channel.component, channel.obj, -1, function onTransferDMA(b, fAsync, obj, off) {
                                    if (b < 0) {
                                        if (!channel.fWarning) {
                                            if (DEBUG && chipset.messageEnabled(Messages.DMA)) {
                                                chipset.printMessage("advanceDMA(" + iDMAChannel + ") ran out of data, assuming 0xff", true);
                                            }
                                            channel.fWarning = true;
                                        }
                                        /*
                                         * TODO: Determine whether to abort, as we do for DMA_MODE.TYPE_READ.
                                         */
                                        b = 0xff;
                                    }
                                    if (!channel.masked) {
                                        chipset.bus.setByte(addrCur, b);
                                        if (BACKTRACK) {
                                            if (!off && obj.file && chipset.messageEnabled(Messages.DISK)) {
                                                chipset.printMessage("loading " + obj.file.sPath + '[' + obj.offFile + "] at %" + str.toHex(addrCur), true);
                                            }
                                            bto = chipset.bus.addBackTrackObject(obj, bto, off);
                                            chipset.bus.writeBackTrackObject(addrCur, bto, off);
                                        }
                                    }
                                    fAsyncRequest = fAsync;
                                    if (fAsync) {
                                        setTimeout(function() {
                                            if (!chipset.updateDMA(channel)) chipset.advanceDMA(channel);
                                        }, 0);
                                    }
                                });
                            }(addr));
                        }
                        else if (channel.type == ChipSet.DMA_MODE.TYPE_READ) {
                            /*
                             * TODO: Determine whether we should support async dmaWrite() functions (currently not required)
                             */
                            b = chipset.bus.getByte(addr);
                            if (channel.fnTransfer.call(channel.component, channel.obj, b) < 0) {
                                /*
                                 * In this case, I think I have no choice but to terminate the DMA operation in response to a failure,
                                 * because the ROM BIOS FDC.REG_DATA.CMD.FORMAT_TRACK command specifies a count that is MUCH too large
                                 * (a side-effect of the ROM BIOS using the same "DMA_SETUP" code for reads, writes AND formats).
                                 */
                                channel.fError = true;
                            }
                        }
                        else if (channel.type == ChipSet.DMA_MODE.TYPE_VERIFY) {
                            /*
                             * Nothing to read or write; just call updateDMA()
                             */
                        }
                        else {
                            if (DEBUG && this.messageEnabled(Messages.DMA | Messages.WARN)) {
                                this.printMessage("advanceDMA(" + iDMAChannel + ") unsupported transfer type: " + str.toHexWord(channel.type), true);
                            }
                            channel.fError = true;
                        }
                    }
                    if (fAsyncRequest || this.updateDMA(channel)) break;
                }
            };
            
            /**
             * updateDMA(channel)
             *
             * @this {ChipSet}
             * @param {Object} channel
             * @return {boolean} true if DMA operation complete, false if not
             */
            ChipSet.prototype.updateDMA = function(channel)
            {
                if (!channel.fError && --channel.count >= 0) {
                    if (channel.mode & ChipSet.DMA_MODE.DECREMENT) {
                        channel.addrCurrent[0]--;
                        if (channel.addrCurrent[0] < 0) {
                            channel.addrCurrent[0] = 0xff;
                            channel.addrCurrent[1]--;
                            if (channel.addrCurrent[1] < 0) channel.addrCurrent[1] = 0xff;
                        }
                    } else {
                        channel.addrCurrent[0]++;
                        if (channel.addrCurrent[0] > 0xff) {
                            channel.addrCurrent[0] = 0x00;
                            channel.addrCurrent[1]++;
                            if (channel.addrCurrent[1] > 0xff) channel.addrCurrent[1] = 0x00;
                        }
                    }
                    /*
                     * In situations where an HDC DMA operation took too long, the Fixed Disk BIOS would give up, but the DMA operation would continue.
                     *
                     * TODO: Verify that the Fixed Disk BIOS shuts down (ie, re-masks) a DMA channel for failed requests, and that this handles those failures.
                     */
                    if (!channel.masked) return false;
                }
            
                var controller = channel.controller;
                var iDMAChannel = controller.nChannelBase + channel.iChannel;
                controller.bStatus = (controller.bStatus & ~(0x10 << channel.iChannel)) | (0x1 << channel.iChannel);
            
                /*
                 * EOP is supposed to automatically (re)mask the channel, unless it's set for auto-initialize.
                 */
                if (!(channel.mode & ChipSet.DMA_MODE.AUTOINIT)) {
                    channel.masked = true;
                    channel.component = channel.obj = null;
                }
            
                if (DEBUG && this.messageEnabled(this.messageBitsDMA(iDMAChannel)) && channel.type == ChipSet.DMA_MODE.TYPE_WRITE && channel.sAddrDebug) {
                    this.printMessage("updateDMA(" + iDMAChannel + ") transferred " + channel.cbDebug + " bytes to " + channel.sAddrDebug, true);
                    this.dbg.doDump("db", channel.sAddrDebug, "l" + channel.cbDebug);
                }
            
                if (channel.done) {
                    channel.done(!channel.fError);
                    channel.done = null;
                }
            
                /*
                 * While it might make sense to call cpu.setDMA() here, it's simpler to let the CPU issue one more call
                 * to chipset.checkDMA() and let the CPU update INTR.DMA on its own, based on the return value from checkDMA().
                 */
                return true;
            };
            
            /**
             * inPICLo(iPIC, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iPIC
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inPICLo = function(iPIC, addrFrom)
            {
                var b = 0;
                var pic = this.aPICs[iPIC];
                if (pic.bOCW3 != null) {
                    var bReadReg = pic.bOCW3 & ChipSet.PIC_LO.OCW3_READ_CMD;
                    switch (bReadReg) {
                        case ChipSet.PIC_LO.OCW3_READ_IRR:
                            b = pic.bIRR;
                            break;
                        case ChipSet.PIC_LO.OCW3_READ_ISR:
                            b = pic.bISR;
                            break;
                        default:
                            break;
                    }
                }
                if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                    this.printMessageIO(pic.port, null, addrFrom, "PIC" + iPIC, b, true);
                }
                return b;
            };
            
            /**
             * outPICLo(iPIC, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iPIC
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outPICLo = function(iPIC, bOut, addrFrom)
            {
                var pic = this.aPICs[iPIC];
                if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                    this.printMessageIO(pic.port, bOut, addrFrom, "PIC" + iPIC, null, true);
                }
                if (bOut & ChipSet.PIC_LO.ICW1) {
                    /*
                     * This must be an ICW1...
                     */
                    pic.nICW = 0;
                    pic.aICW[pic.nICW++] = bOut;
                    /*
                     * I used to do the rest of this initialization in outPICHi(), once all the ICW commands had been received,
                     * but a closer reading of the 8259A spec indicates that that should happen now, on receipt on ICW1.
                     *
                     * Also, on p.10 of that spec, it says "The Interrupt Mask Register is cleared".  I originally took that to
                     * mean that all interrupts were masked, but based on what MS-DOS 4.0M expects to happen after this code runs:
                     *
                     *      0070:44C6 B013          MOV      AL,13
                     *      0070:44C8 E620          OUT      20,AL
                     *      0070:44CA B050          MOV      AL,50
                     *      0070:44CC E621          OUT      21,AL
                     *      0070:44CE B009          MOV      AL,09
                     *      0070:44D0 E621          OUT      21,AL
                     *
                     * (ie, it expects its next call to INT 0x13 will still generate an interrupt), I've decided the spec
                     * must be read literally, meaning that all IMR bits must be zeroed.  Unmasking all possible interrupts by
                     * default seems unwise to me, but who am I to judge....
                     */
                    pic.bIMR = 0x00;
                    pic.bIRLow = 7;
                    /*
                     * TODO: I'm also zeroing both IRR and ISR, even though that's not actually mentioned as part of the ICW
                     * sequence, because they need to be (re)initialized at some point.  However, if some component is currently
                     * requesting an interrupt, what should I do about that?  Originally, I had decided to clear them ONLY if they
                     * were still undefined, but that change appeared to break the ROM BIOS handling of CTRL-ALT-DEL, so I'm back
                     * to unconditionally zeroing them.
                     */
                    pic.bIRR = pic.bISR = 0;
                    /*
                     * The spec also says that "Special Mask Mode is cleared and Status Read is set to IRR".  I attempt to insure
                     * the latter, but as for special mask mode... well, that mode isn't supported yet.
                     */
                    pic.bOCW3 = ChipSet.PIC_LO.OCW3 | ChipSet.PIC_LO.OCW3_READ_IRR;
                }
                else if (!(bOut & ChipSet.PIC_LO.OCW3)) {
                    /*
                     * This must be an OCW2...
                     */
                    var bOCW2 = bOut & ChipSet.PIC_LO.OCW2_OP_MASK;
                    if (bOCW2 & ChipSet.PIC_LO.OCW2_EOI) {
                        /*
                         * This OCW2 must be an EOI command...
                         */
                        var nIRL, bIREnd = 0;
                        if ((bOCW2 & ChipSet.PIC_LO.OCW2_EOI_SPEC) == ChipSet.PIC_LO.OCW2_EOI_SPEC) {
                            /*
                             * More "specifically", a specific EOI command...
                             */
                            nIRL = bOut & ChipSet.PIC_LO.OCW2_IR_LVL;
                            bIREnd = 1 << nIRL;
                        } else {
                            /*
                             * Less "specifically", a non-specific EOI command.  The search for the highest priority in-service
                             * interrupt must start with whichever interrupt is opposite the lowest priority interrupt (normally 7,
                             * but technically whatever bIRLow is currently set to).  For example:
                             *
                             *      If bIRLow is 7, then the priority order is: 0, 1, 2, 3, 4, 5, 6, 7.
                             *      If bIRLow is 6, then the priority order is: 7, 0, 1, 2, 3, 4, 5, 6.
                             *      If bIRLow is 5, then the priority order is: 6, 7, 0, 1, 2, 3, 4, 5.
                             *      etc.
                             */
                            nIRL = pic.bIRLow + 1;
                            while (true) {
                                nIRL &= 0x7;
                                var bIR = 1 << nIRL;
                                if (pic.bISR & bIR) {
                                    bIREnd = bIR;
                                    break;
                                }
                                if (nIRL++ == pic.bIRLow) break;
                            }
                            if (DEBUG && !bIREnd) nIRL = null;      // for unexpected non-specific EOI commands, there's no IRQ to report
                        }
                        var nIRQ = (nIRL == null? undefined : pic.nIRQBase + nIRL);
                        if (pic.bISR & bIREnd) {
                            if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ))) {
                                this.printMessage("outPIC" + iPIC + '(' + str.toHexByte(pic.port) + "): IRQ " + nIRQ + " ending @" + this.dbg.hexOffset(this.cpu.getIP(), this.cpu.getCS()) + " stack=" + this.dbg.hexOffset(this.cpu.getSP(), this.cpu.getSS()), true);
                            }
                            pic.bISR &= ~bIREnd;
                            this.checkIRR();
                        } else {
                            if (DEBUG && this.messageEnabled(Messages.PIC | Messages.WARN)) {
                                this.printMessage("outPIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unexpected EOI command, IRQ " + nIRQ + " not in service", true);
                                if (!SAMPLER && MAXDEBUG) this.dbg.stopCPU();
                            }
                        }
                        /*
                         * TODO: Support EOI commands with automatic rotation (eg, ChipSet.PIC_LO.OCW2_EOI_ROT and ChipSet.PIC_LO.OCW2_EOI_ROTSPEC)
                         */
                        if (bOCW2 & ChipSet.PIC_LO.OCW2_SET_ROTAUTO) {
                            this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW2 rotate command: " + str.toHexByte(bOut));
                        }
                    }
                    else  if (bOCW2 == ChipSet.PIC_LO.OCW2_SET_PRI) {
                        /*
                         * This OCW2 changes the lowest priority interrupt to the specified level (the default is 7)
                         */
                        pic.bIRLow = bOut & ChipSet.PIC_LO.OCW2_IR_LVL;
                    }
                    else {
                        /*
                         * TODO: Remaining commands to support: ChipSet.PIC_LO.OCW2_SET_ROTAUTO and ChipSet.PIC_LO.OCW2_CLR_ROTAUTO
                         */
                        this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW2 automatic EOI command: " + str.toHexByte(bOut));
                    }
                } else {
                    /*
                     * This must be an OCW3 request. If it's a "Read Register" command (PIC_LO.OCW3_READ_CMD), inPICLo() will take care it.
                     *
                     * TODO: If OCW3 specified a "Poll" command (PIC_LO.OCW3_POLL_CMD) or a "Special Mask Mode" command (PIC_LO.OCW3_SMM_CMD),
                     * that's unfortunate, because I don't support them yet.
                     */
                    if (bOut & (ChipSet.PIC_LO.OCW3_POLL_CMD | ChipSet.PIC_LO.OCW3_SMM_CMD)) {
                        this.notice("PIC" + iPIC + '(' + str.toHexByte(pic.port) + "): unsupported OCW3 command: " + str.toHexByte(bOut));
                    }
                    pic.bOCW3 = bOut;
                }
            };
            
            /**
             * inPICHi(iPIC, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iPIC
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inPICHi = function(iPIC, addrFrom)
            {
                var pic = this.aPICs[iPIC];
                var b = pic.bIMR;
                if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                    this.printMessageIO(pic.port+1, null, addrFrom, "PIC" + iPIC, b, true);
                }
                return b;
            };
            
            /**
             * outPICHi(iPIC, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iPIC
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outPICHi = function(iPIC, bOut, addrFrom)
            {
                var pic = this.aPICs[iPIC];
                if (this.messageEnabled(Messages.PIC | Messages.PORT | Messages.CHIPSET)) {
                    this.printMessageIO(pic.port+1, bOut, addrFrom, "PIC" + iPIC, null, true);
                }
                if (pic.nICW < pic.aICW.length) {
                    pic.aICW[pic.nICW++] = bOut;
                    if (pic.nICW == 2 && (pic.aICW[0] & ChipSet.PIC_LO.ICW1_SNGL))
                        pic.nICW++;
                    if (pic.nICW == 3 && !(pic.aICW[0] & ChipSet.PIC_LO.ICW1_ICW4))
                        pic.nICW++;
                }
                else {
                    /*
                     * We have all our ICW "words" (ie, bytes), so this must be an OCW1 write (which is simply an IMR write)
                     */
                    pic.bIMR = bOut;
                    /*
                     * See the CPU's delayINTR() function for an explanation of why this explicit delay is necessary.
                     */
                    this.cpu.delayINTR();
                    /*
                     * Alas, we need a longer delay for the MODEL_5170's "KBD_RESET" function (F000:17D2), which must drop
                     * into a loop and decrement CX at least once after unmasking the KBD IRQ.  The "KBD_RESET" function on
                     * previous models could be handled with a 4-instruction delay provided by the Keyboard.resetDevice() call
                     * to setIRR(), but the MODEL_5170 needs a roughly 6-instruction delay after it unmasks the KBD IRQ.
                     */
                    this.checkIRR(!iPIC && bOut == 0xFD? 6 : 0);
                }
            };
            
            /**
             * checkIMR(nIRQ)
             *
             * @this {ChipSet}
             * @param {number} nIRQ
             * @return {boolean} true if the specified IRQ is masked, false if not
             */
            ChipSet.prototype.checkIMR = function(nIRQ)
            {
                var iPIC = nIRQ >> 3;
                var nIRL = nIRQ & 0x7;
                var pic = this.aPICs[iPIC];
                return (pic.bIMR & (0x1 << nIRL))? true : false;
            };
            
            /**
             * setIRR(nIRQ, nDelay)
             *
             * @this {ChipSet}
             * @param {number} nIRQ (IRQ 0-7 implies iPIC 0, and IRQ 8-15 implies iPIC 1)
             * @param {number} [nDelay] is an optional number of instructions to delay acknowledgment of the IRQ (see getIRRVector)
             */
            ChipSet.prototype.setIRR = function(nIRQ, nDelay)
            {
                var iPIC = nIRQ >> 3;
                var nIRL = nIRQ & 0x7;
                var pic = this.aPICs[iPIC];
                var bIRR = (1 << nIRL);
                if (!(pic.bIRR & bIRR)) {
                    pic.bIRR |= bIRR;
                    if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ) | Messages.CHIPSET)) {
                        this.printMessage("setIRR(" + nIRQ + ")", true);
                    }
                    pic.nDelay = nDelay || 0;
                    this.checkIRR();
                }
            };
            
            /**
             * clearIRR(nIRQ)
             *
             * @this {ChipSet}
             * @param {number} nIRQ (IRQ 0-7 implies iPIC 0, and IRQ 8-15 implies iPIC 1)
             */
            ChipSet.prototype.clearIRR = function(nIRQ)
            {
                var iPIC = nIRQ >> 3;
                var nIRL = nIRQ & 0x7;
                var pic = this.aPICs[iPIC];
                var bIRR = (1 << nIRL);
                if (pic.bIRR & bIRR) {
                    pic.bIRR &= ~bIRR;
                    if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ) | Messages.CHIPSET)) {
                        this.printMessage("clearIRR(" + nIRQ + ")", true);
                    }
                    this.checkIRR();
                }
            };
            
            /**
             * checkIRR(nDelay)
             *
             * @this {ChipSet}
             * @param {number} [nDelay] is an optional number of instructions to delay acknowledgment of a pending interrupt
             */
            ChipSet.prototype.checkIRR = function(nDelay)
            {
                /*
                 * Look for any IRR bits that aren't masked and aren't already in service; in theory, all we'd have to
                 * check is the master PIC (which is the *only* PIC on pre-5170 models), because when any IRQs are set or
                 * cleared on the slave, that would automatically be reflected in IRQ.SLAVE on the master; that's what
                 * setIRR() and clearIRR() used to do.
                 *
                 * Unfortunately, despite setIRR() and clearIRR()'s efforts, whenever a slave interrupt is acknowledged,
                 * getIRRVector() ends up clearing the IRR bits for BOTH the slave's IRQ and the master's IRQ.SLAVE.
                 * So if another lower-priority slave IRQ is waiting to be dispatched, that fact is no longer reflected
                 * in IRQ.SLAVE.
                 *
                 * Since checkIRR() is called on every EOI, we can resolve that problem here, by first checking the slave
                 * PIC for any unmasked, unserviced interrupts and updating the master's IRQ.SLAVE.
                 *
                 * And since this is ALSO called by both setIRR() and clearIRR(), those functions no longer need to perform
                 * their own IRQ.SLAVE updates.  This function consolidates the propagation of slave interrupts to the master.
                 */
                var pic;
                var bIR = -1;
            
                if (this.cPICs > 1) {
                    pic = this.aPICs[1];
                    bIR = ~(pic.bISR | pic.bIMR) & pic.bIRR;
                }
            
                pic = this.aPICs[0];
            
                if (bIR >= 0) {
                    if (bIR) {
                        pic.bIRR |= (1 << ChipSet.IRQ.SLAVE);
                    } else {
                        pic.bIRR &= ~(1 << ChipSet.IRQ.SLAVE);
                    }
                }
            
                bIR = ~(pic.bISR | pic.bIMR) & pic.bIRR;
            
                this.cpu.updateINTR(!!bIR);
            
                if (bIR && nDelay) pic.nDelay = nDelay;
            };
            
            /**
             * getIRRVector()
             *
             * getIRRVector() is called by the CPU whenever PS_IF is set and OP_NOINTR is clear.  Ordinarily, an immediate
             * response would seem perfectly reasonable, but unfortunately, there are places in the original ROM BIOS like
             * "KBD_RESET" (F000:E688) that enable interrupts but still expect nothing to happen for several more instructions.
             *
             * So, in addition to the two normal responses (an IDT vector #, or -1 indicating no pending interrupts), we must
             * support a third response (-2) that basically means: don't change the CPU interrupt state, just keep calling until
             * we return one of the first two responses.  The number of times we delay our normal response is determined by the
             * component that originally called setIRR with an optional delay parameter.
             *
             * @this {ChipSet}
             * @param {number} [iPIC]
             * @return {number} IDT vector # of the next highest-priority interrupt, -1 if none, or -2 for "please try your call again later"
             */
            ChipSet.prototype.getIRRVector = function(iPIC)
            {
                if (iPIC === undefined) iPIC = 0;
            
                /*
                 * Look for any IRR bits that aren't masked and aren't already in service...
                 */
                var nIDT = -1;
                var pic = this.aPICs[iPIC];
                if (!pic.nDelay) {
                    var bIR = pic.bIRR & ((pic.bISR | pic.bIMR) ^ 0xff);
                    /*
                     * The search for the next highest priority requested interrupt (that's also not in-service and not masked)
                     * must start with whichever interrupt is opposite the lowest priority interrupt (normally 7, but technically
                     * whatever bIRLow is currently set to).  For example:
                     *
                     *      If bIRLow is 7, then the priority order is: 0, 1, 2, 3, 4, 5, 6, 7.
                     *      If bIRLow is 6, then the priority order is: 7, 0, 1, 2, 3, 4, 5, 6.
                     *      If bIRLow is 5, then the priority order is: 6, 7, 0, 1, 2, 3, 4, 5.
                     *      etc.
                     *
                     * This process is similar to the search performed by non-specific EOIs, except those apply only to a single
                     * PIC (which is why a slave interrupt must be EOI'ed twice: once for the slave PIC and again for the master),
                     * whereas here we must search across all PICs.
                     */
                    var nIRL = pic.bIRLow + 1;
                    while (true) {
                        nIRL &= 0x7;
            
                        var bIRNext = 1 << nIRL;
                        if (bIR & bIRNext) {
            
                            if (!iPIC && nIRL == ChipSet.IRQ.SLAVE) {
                                /*
                                 * Slave interrupts are tied to the master PIC on IRQ2; query the slave PIC for the vector #
                                 */
                                nIDT = this.getIRRVector(1);
                            } else {
                                /*
                                 * Get the starting IDT vector # from ICW2 and add the IR level to obtain the target IDT vector #
                                 */
                                nIDT = pic.aICW[1] + nIRL;
                            }
            
                            if (nIDT >= 0) {
                                pic.bISR |= bIRNext;
            
                                /*
                                 * Setting the ISR implies clearing the IRR, but clearIRR() has side-effects we don't want
                                 * (eg, clearing the slave IRQ, notifying the CPU, etc), so we clear the IRR ourselves.
                                 */
                                pic.bIRR &= ~bIRNext;
            
                                var nIRQ = pic.nIRQBase + nIRL;
                                if (DEBUG && this.messageEnabled(this.messageBitsIRQ(nIRQ))) {
                                    this.printMessage("getIRRVector(): IRQ " + nIRQ + " interrupting @" + this.dbg.hexOffset(this.cpu.getIP(), this.cpu.getCS()) + " stack=" + this.dbg.hexOffset(this.cpu.getSP(), this.cpu.getSS()), true);
                                }
                                if (MAXDEBUG && DEBUGGER) {
                                    this.acInterrupts[nIRQ]++;
                                }
                            }
                            break;
                        }
            
                        if (nIRL++ == pic.bIRLow) break;
                    }
                } else {
                    nIDT = -2;
                    pic.nDelay--;
                }
                return nIDT;
            };
            
            /**
             * inTimer(iTimer, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @param {number} port (0x40, 0x41, 0x42, etc)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inTimer = function(iTimer, port, addrFrom)
            {
                var b;
                var timer = this.aTimers[iTimer];
                if (timer.countIndex == timer.countBytes) this.resetTimerIndex(iTimer);
                if (timer.fLatched) {
                    return timer.countLatched[timer.countIndex++];
                }
                this.updateTimer(iTimer);
                b = timer.countCurrent[timer.countIndex++];
                if (this.messageEnabled(Messages.TIMER | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "TIMER" + iTimer, b, true);
                }
                return b;
            };
            
            /**
             * outTimer(iTimer, port, bOut, addrFrom)
             *
             * We now rely EXCLUSIVELY on setBurstCycles() to address situations where quick timer interrupt turn-around
             * is expected; eg, by the ROM BIOS POST when it sets TIMER0 to a low test count (0x16); since we typically
             * don't update any of the timers until after we've finished a burst of CPU cycles, we must reduce the current
             * burst cycle count, so that the current instruction burst will end at the same time a timer interrupt is expected.
             *
             * Note that in some cases, if the number of cycles remaining in the current burst is less than the target,
             * this may have the effect of *lengthening* the current burst instead of shortening it, but stepCPU() should be
             * OK with that.
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @param {number} port (0x40, 0x41, 0x42, etc)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outTimer = function(iTimer, port, bOut, addrFrom)
            {
                if (this.messageEnabled(Messages.TIMER | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "TIMER" + iTimer, null, true);
                }
                var timer = this.aTimers[iTimer];
                if (timer.countIndex == timer.countBytes) this.resetTimerIndex(iTimer);
                timer.countInit[timer.countIndex++] = bOut;
                if (timer.countIndex == timer.countBytes) {
                    /*
                     * In general, writing a new count to a timer that's already counting isn't supposed to affect the current
                     * count, with the notable exceptions of MODE0 and MODE4.
                     */
                    if (!timer.fCounting || timer.mode == ChipSet.PIT_CTRL.MODE0 || timer.mode == ChipSet.PIT_CTRL.MODE4) {
                        timer.fLatched = false;
                        timer.countCurrent[0] = timer.countStart[0] = timer.countInit[0];
                        timer.countCurrent[1] = timer.countStart[1] = timer.countInit[1];
                        timer.nCyclesStart = this.cpu.getCycles(this.fScaleTimers);
                        timer.fCounting = true;
            
                        /*
                         * I believe MODE0 is the only mode where "OUT" (fOUT) starts out "low" (false); for the rest of the modes,
                         * "OUT" (fOUT) starts "high" (true).  It's also my understanding that the way edge-triggered interrupts work
                         * on the original PC is that an interrupt is requested only when the corresponding "OUT" transitions from
                         * "low" to "high".
                         */
                        timer.fOUT = (timer.mode != ChipSet.PIT_CTRL.MODE0);
            
                        if (iTimer == ChipSet.PIT0.TIMER0) {
                            /*
                             * TODO: Determine if there are situations/modes where I should NOT automatically clear IRQ0 on behalf of TIMER0.
                             */
                            this.clearIRR(ChipSet.IRQ.TIMER0);
                            var countInit = this.getTimerInit(ChipSet.PIT0.TIMER0);
                            var nCyclesRemain = (countInit * this.nTicksDivisor) | 0;
                            if (timer.mode == ChipSet.PIT_CTRL.MODE3) nCyclesRemain >>= 1;
                            this.cpu.setBurstCycles(nCyclesRemain);
                        }
                    }
            
                    if (iTimer == ChipSet.PIT0.TIMER2) this.setSpeaker();
                }
            };
            
            /**
             * inPIT1Ctrl(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x43)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number|null} simulated port value
             */
            ChipSet.prototype.inPIT1Ctrl = function(port, addrFrom)
            {
                this.printMessageIO(port, null, addrFrom, "PIT1_CTRL", null, Messages.TIMER);
                if (DEBUG) this.printMessage("PIT1_CTRL: Read-Back command not supported (yet)", Messages.TIMER);
                return null;
            };
            
            /**
             * outPIT1Ctrl(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x43)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outPIT1Ctrl = function(port, bOut, addrFrom)
            {
                this.bPIT1Ctrl = bOut;
                this.printMessageIO(port, bOut, addrFrom, "PIT1_CTRL", null, Messages.TIMER);
                /*
                 * Extract the SC (Select Counter) bits
                 */
                var iTimer = (bOut & ChipSet.PIT_CTRL.SC) >> 6;
                if (iTimer == 0x3) {
                    if (DEBUG) this.printMessage("PIT1_CTRL: Read-Back command not supported (yet)", Messages.TIMER);
                    return;
                }
                /*
                 * Extract the BCD, MODE, and RW bits, which we simply store as-is (see setTimerMode)
                 */
                var bcd = (bOut & ChipSet.PIT_CTRL.BCD);
                var mode = (bOut & ChipSet.PIT_CTRL.MODE);
                var rw = (bOut & ChipSet.PIT_CTRL.RW);
                if (!rw) {
                    this.latchTimer(iTimer);
                } else {
                    this.setTimerMode(iTimer, bcd, mode, rw);
            
                    /*
                     * The 5150 ROM BIOS code @F000:E285 ("TEST.7") would fail after a warm boot (eg, after a CTRL-ALT-DEL) because
                     * it assumed that no TIMER0 interrupt would occur between the point it unmasked the TIMER0 interrupt and the
                     * point it started reprogramming TIMER0.
                     *
                     * Similarly, the 5160 ROM BIOS @F000:E35D ("8253 TIMER CHECKOUT") would fail after initializing the EGA BIOS,
                     * because the EGA BIOS uses TIMER0 during its diagnostics; as in the previous example, by the time the 8253
                     * test code runs later, there's now a pending TIMER0 interrupt, which triggers an interrupt as soon as IRQ0 is
                     * unmasked @F000:E364.
                     *
                     * After looking at this problem at bit more closely the second time around (while debugging the EGA BIOS),
                     * it turns out I missed an important 8253 feature: whenever a new MODE0 control word OR a new MODE0 count
                     * is written, fOUT (which is what drives IRQ0) goes low.  So, by simply adding an appropriate clearIRR() call
                     * both here and in outTimer(), this annoying problem seems to be gone.
                     *
                     * TODO: Determine if there are situations/modes where I should NOT automatically clear IRQ0 on behalf of TIMER0.
                     */
                    if (iTimer == ChipSet.PIT0.TIMER0) this.clearIRR(ChipSet.IRQ.TIMER0);
            
                    /*
                     * Another TIMER0 HACK: The "CASSETTE DATA WRAP TEST" @F000:E51E occasionally reports an error when the second of
                     * two TIMER0 counts it latches is greater than the first.  You would think the ROM BIOS would expect this, since
                     * TIMER0 can reload its count at any time.  Is the ROM BIOS assuming that TIMER0 was initialized sufficiently
                     * recently that this should never happen?  I'm not sure, but for now, let's try resetting TIMER0's count immediately
                     * after TIMER2 has been reprogrammed for the test in question (ie, when interrupts are masked and PPIB is set as
                     * shown below).
                     *
                     * FWIW, I believe the cassette hardware was discontinued after MODEL_5150, and even if the test fails, it's non-fatal;
                     * the ROM BIOS displays an error (131) and moves on.
                     */
                    if (iTimer == ChipSet.PIT0.TIMER2) {
                        var pic = this.aPICs[0];
                        if (pic.bIMR == 0xff && this.bPPIB == (ChipSet.PPI_B.CLK_TIMER2 | ChipSet.PPI_B.ENABLE_SW2 | ChipSet.PPI_B.CASS_MOTOR_OFF | ChipSet.PPI_B.CLK_KBD)) {
                            var timer = this.aTimers[0];
                            timer.countStart[0] = timer.countInit[0];
                            timer.countStart[1] = timer.countInit[1];
                            timer.nCyclesStart = this.cpu.getCycles(this.fScaleTimers);
                            if (DEBUG && this.messageEnabled(Messages.TIMER)) {
                                this.printMessage("TIMER0 count reset @" + timer.nCyclesStart + " cycles", true);
                            }
                        }
                    }
                }
            };
            
            /**
             * getTimerInit(iTimer)
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @return {number} initial timer count
             */
            ChipSet.prototype.getTimerInit = function(iTimer)
            {
                var timer = this.aTimers[iTimer];
                var countInit = (timer.countInit[1] << 8) | timer.countInit[0];
                if (!countInit) countInit = (timer.countBytes == 1? 0x100 : 0x10000);
                return countInit;
            };
            
            /**
             * getTimerStart(iTimer)
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @return {number} starting timer count (from the initial timer count for the current countdown)
             */
            ChipSet.prototype.getTimerStart = function(iTimer)
            {
                var timer = this.aTimers[iTimer];
                var countStart = (timer.countStart[1] << 8) | timer.countStart[0];
                if (!countStart) countStart = (timer.countBytes == 1? 0x100 : 0x10000);
                return countStart;
            };
            
            /**
             * getTimerCycleLimit(iTimer, nCycles)
             *
             * This is called by the CPU to determine the maximum number of cycles it can process for the current burst.
             * It's presumed that no instructions have been executed since the last updateTimer(iTimer) call.
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @param {number} nCycles desired
             * @return {number} maximum number of cycles remaining for the specified timer (<= nCycles)
             */
            ChipSet.prototype.getTimerCycleLimit = function(iTimer, nCycles)
            {
                var timer = this.aTimers[iTimer];
                if (timer.fCounting) {
                    var nCyclesUpdate = this.cpu.getCycles(this.fScaleTimers);
                    var ticksElapsed = ((nCyclesUpdate - timer.nCyclesStart) / this.nTicksDivisor) | 0;
                    this.assert(ticksElapsed >= 0);
                    var countStart = this.getTimerStart(iTimer);
                    var count = countStart - ticksElapsed;
                    if (timer.mode == ChipSet.PIT_CTRL.MODE3) count -= ticksElapsed;
                    this.assert(count > 0);
                    var nCyclesRemain = (count * this.nTicksDivisor) | 0;
                    if (timer.mode == ChipSet.PIT_CTRL.MODE3) nCyclesRemain >>= 1;
                    if (nCycles > nCyclesRemain) nCycles = nCyclesRemain;
                }
                return nCycles;
            };
            
            /**
             * latchTimer(iTimer)
             *
             * @this {ChipSet}
             * @param {number} iTimer
             */
            ChipSet.prototype.latchTimer = function(iTimer)
            {
                /*
                 * Update the timer's current count
                 */
                this.updateTimer(iTimer);
            
                /*
                 * Now we can latch it
                 */
                var timer = this.aTimers[iTimer];
                timer.countLatched[0] = timer.countCurrent[0];
                timer.countLatched[1] = timer.countCurrent[1];
                timer.fLatched = true;
            
                /*
                 * VERIFY: That a latch request resets the timer index
                 */
                this.resetTimerIndex(iTimer);
            };
            
            /**
             * setTimerMode(iTimer, bcd, mode, rw)
             *
             * FYI: After setting a timer's mode, the CPU must set the timer's count before it becomes operational;
             * ie, before fCounting becomes true.
             *
             * @this {ChipSet}
             * @param {number} iTimer
             * @param {number} bcd
             * @param {number} mode
             * @param {number} rw
             */
            ChipSet.prototype.setTimerMode = function(iTimer, bcd, mode, rw)
            {
                var timer = this.aTimers[iTimer];
                timer.rw = rw;
                timer.mode = mode;
                timer.bcd = bcd;
                timer.countInit = [0, 0];
                timer.countCurrent = [0, 0];
                timer.countLatched = [0, 0];
                timer.fOUT = false;
                timer.fLatched = false;
                timer.fCounting = false;
                this.resetTimerIndex(iTimer);
            };
            
            /**
             * resetTimerIndex(iTimer)
             *
             * @this {ChipSet}
             * @param {number} iTimer
             */
            ChipSet.prototype.resetTimerIndex = function(iTimer)
            {
                var timer = this.aTimers[iTimer];
                timer.countIndex = (timer.rw == ChipSet.PIT_CTRL.RW_MSB? 1 : 0);
                timer.countBytes = (timer.rw == ChipSet.PIT_CTRL.RW_BOTH? 2 : 1);
            };
            
            /**
             * updateTimer(iTimer, fCycleReset)
             *
             * updateTimer() calculates and updates a timer's current count purely on an "on-demand" basis; we don't
             * actually adjust timer counters every 4 CPU cycles on a 4.77Mhz PC, since updating timers that frequently
             * would be prohibitively slow.  If you're single-stepping the CPU, then yes, updateTimer() will be called
             * after every stepCPU(), via updateAllTimers(), but if we're doing our job correctly here, the frequency
             * of calls to updateTimer() should not affect timer counts across otherwise identical runs.
             *
             * TODO: Implement support for all TIMER modes, and verify that all the modes currently implemented are
             * "up to spec"; they're close enough to make the ROM BIOS happy, but beyond that, I've done very little.
             *
             * @this {ChipSet}
             * @param {number} iTimer
             *      0: Time-of-Day interrupt (~18.2 interrupts/second)
             *      1: DMA refresh
             *      2: Sound/Cassette
             * @param {boolean} [fCycleReset] is true if a cycle-count reset is about to occur
             * @return {Object} timer
             */
            ChipSet.prototype.updateTimer = function(iTimer, fCycleReset)
            {
                var timer = this.aTimers[iTimer];
            
                /*
                 * Every timer's counting state is gated by its own fCounting flag; TIMER2 is further gated by PPI_B's
                 * CLK_TIMER2 bit.
                 */
                if (timer.fCounting && (iTimer != ChipSet.PIT0.TIMER2 || (this.bPPIB & ChipSet.PPI_B.CLK_TIMER2))) {
                    /*
                     * We determine the current timer count based on how many instruction cycles have elapsed since we started
                     * the timer.  Timers are supposed to be "ticking" at a rate of 1193181.8181 times per second, which is
                     * the system clock of 14.31818Mhz, divided by 12.
                     *
                     * Similarly, for an 8088, there are supposed to be 4.77Mhz instruction cycles per second, which comes from
                     * the system clock of 14.31818Mhz, divided by 3.
                     *
                     * If we divide 4,772,727 CPU cycles per second by 1,193,181 ticks per second, we get 4 cycles per tick,
                     * which agrees with the ratio of the clock divisors: 12 / 3 == 4.
                     *
                     * However, if getCycles() is being called with fScaleTimers == true AND the CPU is running faster than its
                     * base cycles-per-second setting, then getCycles() will divide the cycle count by the CPU's cycle multiplier,
                     * so that the timers fire with the same real-world frequency that the user expects.  However, that will
                     * break any code (eg, the ROM BIOS diagnostics) that assumes that the timers are ticking once every 4 cycles
                     * (or more like every 5 cycles on a 6Mhz 80286).
                     *
                     * So, when using a machine with the ChipSet "scaletimers" property set, make sure you reset the machine's
                     * speed prior to rebooting, otherwise you're likely to see ROM BIOS errors.  Ditto for any application code
                     * that makes similar assumptions about the relationship between CPU and timer speeds.
                     *
                     * In general, you're probably better off NOT using the "scaletimers" property, and simply allowing the timers
                     * to tick faster as you increase CPU speed (which is why fScaleTimers defaults to false).
                     */
                    var nCycles = this.cpu.getCycles(this.fScaleTimers);
            
                    /*
                     * Instead of maintaining partial tick counts, we calculate a fresh countCurrent from countStart every
                     * time we're called, using the cycle count recorded when the timer was initialized.  countStart is set
                     * to countInit when fCounting is first set, and then it is refreshed from countInit at the expiration of
                     * every count, so that if someone loaded a new countInit in the meantime (eg, BASICA), we'll pick it up.
                     *
                     * For the original MODEL_5170, the number of cycles per tick is approximately 6,000,000 / 1,193,181,
                     * or 5.028575, so we can no longer always divide cycles by 4 with a simple right-shift by 2.  The proper
                     * divisor (eg, 4 for MODEL_5150 and MODEL_5160, 5 for MODEL_5170, etc) is nTicksDivisor, which initBus()
                     * calculates using the base CPU speed returned by cpu.getCyclesPerSecond().
                     */
                    var ticksElapsed = ((nCycles - timer.nCyclesStart) / this.nTicksDivisor) | 0;
            
                    if (ticksElapsed < 0) {
                        if (DEBUG && this.messageEnabled(Messages.TIMER)) {
                            this.printMessage("updateTimer(" + iTimer + "): negative tick count (" + ticksElapsed + ")", true);
                        }
                        timer.nCyclesStart = nCycles;
                        ticksElapsed = 0;
                    }
            
                    var countInit = this.getTimerInit(iTimer);
                    var countStart = this.getTimerStart(iTimer);
            
                    var fFired = false;
                    var count = countStart - ticksElapsed;
            
                    /*
                     * NOTE: This mode is used by ROM BIOS test code that wants to verify timer interrupts are arriving
                     * neither too slowly nor too quickly.  As a result, I've had to add some corresponding trickery
                     * in outTimer() to force interrupt simulation immediately after a low initial count (0x16) has been set.
                     */
                    if (timer.mode == ChipSet.PIT_CTRL.MODE0) {
                        if (count <= 0) count = 0;
                        if (DEBUG && this.messageEnabled(Messages.TIMER)) {
                            this.printMessage("updateTimer(" + iTimer + "): MODE0 timer count=" + count, true);
                        }
                        if (!count) {
                            timer.fOUT = true;
                            timer.fCounting = false;
                            if (!iTimer) {
                                fFired = true;
                                this.setIRR(ChipSet.IRQ.TIMER0);
                                if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
                            }
                        }
                    }
                    /*
                     * Early implementation of this mode was minimal because when using this mode, the ROM BIOS simply wanted
                     * to see the count changing; it wasn't looking for interrupts.  See ROM BIOS "TEST.03" code @F000:E0DE,
                     * where TIMER1 is programmed for MODE2, LSB (the same settings, incidentally, used immediately afterward
                     * for TIMER1 in conjunction with DMA channel 0 memory refreshes).
                     *
                     * Now this mode generates interrupts.  Note that "OUT" goes "low" when the count reaches 1, then "high"
                     * one tick later, at which point the count is reloaded and counting continues.
                     *
                     * Chances are, we will often miss the exact point at which the count becomes 1 (or more importantly, one
                     * tick later, when the count *would* become 0, since that's when "OUT" transitions from "low" to "high"),
                     * but as with MODE3, hopefully no one will mind.
                     *
                     * FYI, technically, it appears that the count is never supposed to reach 0, and that an initial count of 1
                     * is "illegal", whatever that means.
                     */
                    else if (timer.mode == ChipSet.PIT_CTRL.MODE2) {
                        timer.fOUT = (count != 1);          // yes, this line does seem rather pointless....
                        if (count <= 0) {
                            count = countInit + count;
                            if (count <= 0) {
                                /*
                                 * TODO: Consider whether we ever care about TIMER1 or TIMER2 underflow
                                 */
                                if (DEBUG && this.messageEnabled(Messages.TIMER) && !iTimer) {
                                    this.printMessage("updateTimer(" + iTimer + "): mode=2, underflow=" + count, true);
                                }
                                count = countInit;
                            }
                            timer.countStart[0] = count & 0xff;
                            timer.countStart[1] = count >> 8;
                            timer.nCyclesStart = nCycles;
                            if (!iTimer && timer.fOUT) {
                                fFired = true;
                                this.setIRR(ChipSet.IRQ.TIMER0);
                                if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
                            }
                        }
                    }
                    /*
                     * NOTE: This is the normal mode for TIMER0, which the ROM BIOS uses to generate h/w interrupts roughly
                     * 18.2 times per second.  In this mode, the count must be decremented twice as fast (hence the extra ticks
                     * subtraction below, in addition to the subtraction above), but IRQ_TIMER0 is raised only on alternate
                     * iterations; ie, only when fOUT transitions to true ("high").  The equal alternating fOUT states is why
                     * this mode is referred to as "square wave" mode.
                     *
                     * TODO: Implement the correct behavior for this mode when the count is ODD.  In that case, fOUT is supposed
                     * to be "high" for (N + 1) / 2 ticks and "low" for (N - 1) / 2 ticks.
                     */
                    else if (timer.mode == ChipSet.PIT_CTRL.MODE3) {
                        count -= ticksElapsed;
                        if (count <= 0) {
                            timer.fOUT = !timer.fOUT;
                            count = countInit + count;
                            if (count <= 0) {
                                /*
                                 * TODO: Consider whether we ever care about TIMER1 or TIMER2 underflow
                                 */
                                if (DEBUG && this.messageEnabled(Messages.TIMER) && !iTimer) {
                                    this.printMessage("updateTimer(" + iTimer + "): mode=3, underflow=" + count, true);
                                }
                                count = countInit;
                            }
                            if (MAXDEBUG && DEBUGGER && !iTimer) {
                                var nCycleDelta = 0;
                                if (this.acTimer0Counts.length > 0) nCycleDelta = nCycles - this.acTimer0Counts[0][1];
                                this.acTimer0Counts.push([count, nCycles, nCycleDelta]);
                            }
                            timer.countStart[0] = count & 0xff;
                            timer.countStart[1] = count >> 8;
                            timer.nCyclesStart = nCycles;
                            if (!iTimer && timer.fOUT) {
                                fFired = true;
                                this.setIRR(ChipSet.IRQ.TIMER0);
                                if (MAXDEBUG && DEBUGGER) this.acTimersFired[iTimer]++;
                            }
                        }
                    }
            
                    if (DEBUG && this.messageEnabled(Messages.TIMER | Messages.LOG)) {
                        this.log("TIMER" + iTimer + " count: " + count + ", ticks: " + ticksElapsed + ", fired: " + (fFired? "true" : "false"));
                    }
            
                    timer.countCurrent[0] = count & 0xff;
                    timer.countCurrent[1] = count >> 8;
                    if (fCycleReset) this.nCyclesStart = 0;
                }
                return timer;
            };
            
            /**
             * updateAllTimers(fCycleReset)
             *
             * @this {ChipSet}
             * @param {boolean} [fCycleReset] is true if a cycle-count reset is about to occur
             */
            ChipSet.prototype.updateAllTimers = function(fCycleReset)
            {
                for (var iTimer = 0; iTimer < this.aTimers.length; iTimer++) {
                    this.updateTimer(iTimer, fCycleReset);
                }
                if (this.model >= ChipSet.MODEL_5170) this.updateRTCTime();
            };
            
            /**
             * inPPIA(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x60)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inPPIA = function(port, addrFrom)
            {
                var b = this.bPPIA;
                if (this.bPPICtrl & ChipSet.PPI_CTRL.A_IN) {
                    if (this.bPPIB & ChipSet.PPI_B.CLEAR_KBD) {
                        b = this.sw1;
                    }
                    else if (this.kbd) {
                        b = this.kbd.readScanCode();
                    }
                }
                this.printMessageIO(port, null, addrFrom, "PPI_A", b);
                return b;
            };
            
            /**
             * outPPIA(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x60)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outPPIA = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "PPI_A");
                this.bPPIA = bOut;
            };
            
            /**
             * inPPIB(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x61)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inPPIB = function(port, addrFrom)
            {
                var b = this.bPPIB;
                this.printMessageIO(port, null, addrFrom, "PPI_B", b);
                return b;
            };
            
            /**
             * outPPIB(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x61)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outPPIB = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "PPI_B");
                this.updatePPIB(bOut);
                if (this.kbd) this.kbd.setEnabled((bOut & ChipSet.PPI_B.CLEAR_KBD)? false : true, (bOut & ChipSet.PPI_B.CLK_KBD)? true : false);
            };
            
            /**
             * updatePPIB(bOut)
             *
             * On MODEL_5170 and up, this updates the "simulated" PPI_B.  The only common (and well-documented) PPI_B bits
             * across all models are PPI_B.CLK_TIMER2 and PPI_B.SPK_TIMER2, so its possible that this function may need to
             * limit its updates to just those bits, and move any model-specific requirements back into the appropriate I/O
             * handlers (PPIB or 8042RWReg).  We'll see.
             *
             * @this {ChipSet}
             * @param {number} bOut
             */
            ChipSet.prototype.updatePPIB = function(bOut)
            {
                var fNewSpeaker = !!(bOut & ChipSet.PPI_B.SPK_TIMER2);
                var fOldSpeaker = !!(this.bPPIB & ChipSet.PPI_B.SPK_TIMER2);
                this.bPPIB = bOut;
                if (fNewSpeaker != fOldSpeaker) {
                    /*
                     * Originally, this code didn't catch the "ERROR_BEEP" case @F000:EC34, which first turns both PPI_B.CLK_TIMER2 (0x01)
                     * and PPI_B.SPK_TIMER2 (0x02) off, then turns on only PPI_B.SPK_TIMER2 (0x02), then restores the original port value.
                     *
                     * So, when the ROM BIOS keyboard buffer got full, we didn't issue a BEEP alert.  I've fixed that by limiting the test
                     * to PPI_B.SPK_TIMER2 and ignoring PPI_B.CLK_TIMER2.
                     */
                    this.setSpeaker(fNewSpeaker);
                }
            };
            
            /**
             * inPPIC(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x62)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inPPIC = function(port, addrFrom)
            {
                var b = 0;
            
                /*
                 * If you ever wanted to simulate I/O channel errors or R/W memory parity errors, you could
                 * add either PPI_C.IO_CHANNEL_CHK (0x40) or PPI_C.RW_PARITY_CHK (0x80) to the return value (b).
                 */
                if (this.model == ChipSet.MODEL_5150) {
                    if (this.bPPIB & ChipSet.PPI_B.ENABLE_SW2) {
                        b |= this.sw2 & ChipSet.PPI_C.SW;
                    } else {
                        b |= (this.sw2 >> 4) & 0x1;     // QUESTION: Does any component actually care about SW2[5] on a MODEL_5150?
                    }
                } else {
                    if (this.bPPIB & ChipSet.PPI_B.ENABLE_SW_HI) {
                        b |= this.sw1 >> 4;
                    } else {
                        b |= this.sw1 & 0xf;
                    }
                }
            
                if (this.bPPIB & ChipSet.PPI_B.CLK_TIMER2) {
                    var timer = this.updateTimer(ChipSet.PIT0.TIMER2);
                    if (timer.fOUT) {
                        if (this.bPPIB & ChipSet.PPI_B.SPK_TIMER2)
                            b |= ChipSet.PPI_C.TIMER2_OUT;
                        else
                            b |= ChipSet.PPI_C.CASS_DATA_IN;
                    }
                }
            
                /*
                 * The ROM BIOS polls this port incessantly during its memory tests, checking for memory parity errors
                 * (which of course we never report), so we further restrict these port messages to Messages.MEM.
                 */
                this.printMessageIO(port, null, addrFrom, "PPI_C", b, Messages.CHIPSET | Messages.MEM);
                return b;
            };
            
            /**
             * outPPIC(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x62)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.outPPIC = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "PPI_C");
                this.bPPIC = bOut;
            };
            
            /**
             * inPPICtrl(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x63)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inPPICtrl = function(port, addrFrom)
            {
                var b = this.bPPICtrl;
                this.printMessageIO(port, null, addrFrom, "PPI_CTRL", b);
                return b;
            };
            
            /**
             * outPPICtrl(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x63)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.outPPICtrl = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "PPI_CTRL");
                this.bPPICtrl = bOut;
            };
            
            /**
             * in8042OutBuff(port, addrFrom)
             *
             * Return the contents of the OUTBUFF register and clear the OUTBUFF_FULL status bit.
             *
             * This function then calls kbd.checkScanCode(), on the theory that the next buffered scan
             * code, if any, can now be delivered to OUTBUFF.  However, there are applications like
             * BASICA that install a keyboard interrupt handler that reads OUTBUFF, do some scan code
             * preprocessing, and then pass control on to the ROM's interrupt handler.  As a result,
             * OUTBUFF is read multiple times during a single interrupt, so filling it with new data
             * after every read would result in lost scan codes.
             *
             * To avoid that problem, kbd.checkScanCode() also requires that kbd.setEnabled() be called
             * before it supplies any more data via notifyKbdData().  That will happen as soon as the
             * ROM re-enables the controller, and is why KBC.CMD.ENABLE_KBD processing also ends with a
             * call to kbd.checkScanCode().
             *
             * Note that, the foregoing notwithstanding, I still clear the OUTBUFF_FULL bit here (as I
             * believe I should); fortunately, none of the interrupt handlers rely on OUTBUFF_FULL as a
             * prerequisite for reading OUTBUFF (not the BASICA handler, and not the ROM).  The assumption
             * seems to be that if an interrupt occurred, OUTBUFF must contain data, regardless of the
             * state of OUTBUFF_FULL.
             *
             * @this {ChipSet}
             * @param {number} port (0x60)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.in8042OutBuff = function(port, addrFrom)
            {
                var b = this.b8042OutBuff;
                this.printMessageIO(port, null, addrFrom, "8042_OUTBUFF", b, Messages.C8042);
                this.b8042Status &= ~(ChipSet.KBC.STATUS.OUTBUFF_FULL | ChipSet.KBC.STATUS.OUTBUFF_DELAY);
                if (this.kbd) this.kbd.checkScanCode();
                return b;
            };
            
            /**
             * out8042InBuffData(port, bOut, addrFrom)
             *
             * This writes to the 8042's input buffer; using this port (ie, 0x60 instead of 0x64) designates the
             * the byte as a KBC.DATA.CMD "data byte".  Before clearing KBC.STATUS.CMD_FLAG, however, we see if it's set,
             * and then based on the previous KBC.CMD "command byte", we do whatever needs to be done with this "data byte".
             *
             * @this {ChipSet}
             * @param {number} port (0x60)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.out8042InBuffData = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "8042_INBUF.DATA", null, Messages.C8042);
            
                if (this.b8042Status & ChipSet.KBC.STATUS.CMD_FLAG) {
                    switch (this.b8042InBuff) {
            
                    case ChipSet.KBC.CMD.WRITE_CMD:
                        this.set8042CmdData(bOut);
                        break;
            
                    case ChipSet.KBC.CMD.WRITE_OUTPORT:
                        this.set8042OutPort(bOut);
                        break;
            
                    /*
                     * This case is reserved for command bytes that the 8042 is not expecting, which should therefore be passed on
                     * to the Keyboard itself.
                     *
                     * Here's some relevant MODEL_5170 ROM BIOS code, "XMIT_8042" (missing from the original MODEL_5170 ROM BIOS listing),
                     * which sends a command code in AL to the Keyboard and waits for a response, returning it in AL.  Note that
                     * the only "success" exit path from this function involves LOOPing 64K times before finally reading the Keyboard's
                     * response; either the hardware and/or this code seems a bit brain-damaged if that's REALLY what you had to do to ensure
                     * a valid response....
                     *
                     *      F000:1B25 86E0          XCHG     AH,AL
                     *      F000:1B27 2BC9          SUB      CX,CX
                     *      F000:1B29 E464          IN       AL,64
                     *      F000:1B2B A802          TEST     AL,02      ; WAIT FOR INBUFF_FULL TO BE CLEAR
                     *      F000:1B2D E0FA          LOOPNZ   1B29
                     *      F000:1B2F E334          JCXZ     1B65       ; EXIT WITH ERROR (CX == 0)
                     *      F000:1B31 86E0          XCHG     AH,AL
                     *      F000:1B33 E660          OUT      60,AL      ; SAFE TO WRITE KEYBOARD CMD TO INBUFF NOW
                     *      F000:1B35 2BC9          SUB      CX,CX
                     *      F000:1B37 E464          IN       AL,64
                     *      F000:1B39 8AE0          MOV      AH,AL
                     *      F000:1B3B A801          TEST     AL,01
                     *      F000:1B3D 7402          JZ       1B41
                     *      F000:1B3F E460          IN       AL,60      ; READ PORT 0x60 IF OUTBUFF_FULL SET ("FLUSH"?)
                     *      F000:1B41 F6C402        TEST     AH,02
                     *      F000:1B44 E0F1          LOOPNZ   1B37
                     *      F000:1B46 751D          JNZ      1B65       ; EXIT WITH ERROR (CX == 0)
                     *      F000:1B48 B306          MOV      BL,06
                     *      F000:1B4A 2BC9          SUB      CX,CX
                     *      F000:1B4C E464          IN       AL,64
                     *      F000:1B4E A801          TEST     AL,01
                     *      F000:1B50 E1FA          LOOPZ    1B4C
                     *      F000:1B52 7508          JNZ      1B5C       ; PROCEED TO EXIT NOW THAT OUTBUFF_FULL IS SET
                     *      F000:1B54 FECB          DEC      BL
                     *      F000:1B56 75F4          JNZ      1B4C
                     *      F000:1B58 FEC3          INC      BL
                     *      F000:1B5A EB09          JMP      1B65       ; EXIT WITH ERROR (CX == 0)
                     *      F000:1B5C 2BC9          SUB      CX,CX
                     *      F000:1B5E E2FE          LOOP     1B5E       ; LOOOOOOPING....
                     *      F000:1B60 E460          IN       AL,60
                     *      F000:1B62 83E901        SUB      CX,0001    ; EXIT WITH SUCCESS (CX != 0)
                     *      F000:1B65 C3            RET
                     *
                     * But WAIT, the FUN doesn't end there.  After this function returns, "KBD_RESET" waits for a Keyboard interrupt
                     * to occur, hoping for scan code 0xAA as the Keyboard's final response.  "KBD_RESET" also returns CX to the caller,
                     * and the caller ("TEST.21") assumes there was no interrupt if CX is zero.
                     *
                     *              MOV     AL,0FDH
                     *              OUT     INTA01,AL
                     *              MOV     INTR_FLAG,0
                     *              STI
                     *              MOV     BL,10
                     *              SUB     CX,CX
                     *      G11:    TEST    [1NTR_FLAG],02H
                     *              JNZ     G12
                     *              LOOP    G11
                     *              DEC     BL
                     *              JNZ     G11
                     *              ...
                     *
                     * However, if [INTR_FLAG] is set immediately, the above code will exit immediately, without ever decrementing CX.
                     * CX can be zero not only if the loop exhausted it, but also if no looping was required; the latter is not an
                     * error, but "TEST.21" assumes that it is.
                     */
                    default:
                        this.set8042CmdData(this.b8042CmdData & ~ChipSet.KBC.DATA.CMD.NO_CLOCK);
                        if (this.kbd) this.set8042OutBuff(this.kbd.sendCmd(bOut));
                        break;
                    }
                }
                this.b8042InBuff = bOut;
                this.b8042Status &= ~ChipSet.KBC.STATUS.CMD_FLAG;
            };
            
            /**
             * in8042RWReg(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x61)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.in8042RWReg = function(port, addrFrom)
            {
                /*
                 * Normally, we return whatever was last written to this port, but we do need to mask the
                 * two upper-most bits (KBC.RWREG.NMI_ERROR), as those are output-only bits used to signal
                 * parity errors.
                 *
                 * Also, "TEST.09" of the MODEL_5170 BIOS expects the REFRESH_BIT to alternate, so we used to
                 * do this:
                 *
                 *      this.bPPIB ^= ChipSet.KBC.RWREG.REFRESH_BIT;
                 *
                 * However, the MODEL_5170_REV3 BIOS not only checks REFRESH_BIT in "TEST.09", but includes
                 * an additional test right before "TEST.11A", which requires the bit change "a bit less"
                 * frequently.  This new test sets CX to zero, and at the end of the test (@F000:05B8), CX
                 * must be in the narrow range of 0xF600 through 0xF9FD.
                 *
                 * In fact, the new "WAITF" function @F000:1A3A tells us exactly how frequently REFRESH_BIT
                 * is expected to change now.  That function performs a "FIXED TIME WAIT", where CX is a
                 * "COUNT OF 15.085737us INTERVALS TO WAIT".
                 *
                 * So we now tie the state of the REFRESH_BIT to bit 6 of the current CPU cycle count,
                 * effectively toggling the bit after every 64 cycles.  On an 8Mhz CPU that can do 8 cycles
                 * in 1us, 64 cycles represents 8us, so that might be a bit fast for "WAITF", but bit 6
                 * is the only choice that also satisfies the pre-"TEST.11A" test as well.
                 */
                var b = this.bPPIB & ~(ChipSet.KBC.RWREG.NMI_ERROR | ChipSet.KBC.RWREG.REFRESH_BIT) | ((this.cpu.getCycles() & 0x40)? ChipSet.KBC.RWREG.REFRESH_BIT : 0);
                /*
                 * Thanks to the WAITF function, this has become a very "busy" port, so if this generates too
                 * many messages, try adding Messages.LOG to the criteria.
                 */
                this.printMessageIO(port, null, addrFrom, "8042_RWREG", b, Messages.C8042);
                return b;
            };
            
            /**
             * out8042RWReg(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x61)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             */
            ChipSet.prototype.out8042RWReg = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "8042_RWREG", null, Messages.C8042);
                this.updatePPIB(bOut);
            };
            
            /**
             * in8042Status(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x64)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.in8042Status = function(port, addrFrom)
            {
                this.printMessageIO(port, null, addrFrom, "8042_STATUS", this.b8042Status, Messages.C8042);
                var b = this.b8042Status & 0xff;
                /*
                 * There's code in the 5170 BIOS (F000:03BF) that writes an 8042 command (0xAA), waits for
                 * KBC.STATUS.INBUFF_FULL to go clear (which it always is, because we always accept commands
                 * immediately), then checks KBC.STATUS.OUTBUFF_FULL and performs a "flush" on port 0x60 if
                 * it's set, then waits for KBC.STATUS.OUTBUFF_FULL *again*.  Unfortunately, the "flush" throws
                 * away our response if we respond immediately.
                 *
                 * So now when out8042InBuffCmd() has a response, it sets KBC.STATUS.OUTBUFF_DELAY instead
                 * (which is outside the 0xff range of bits we return); when we see KBC.STATUS.OUTBUFF_DELAY,
                 * we clear it and set KBC.STATUS.OUTBUFF_FULL, which will be returned on the next read.
                 *
                 * This provides a single poll delay, so that the aforementioned "flush" won't toss our response.
                 * If longer delays are needed down the road, we may need to set a delay count in the upper (hidden)
                 * bits of b8042Status, instead of using a single delay bit.
                 */
                if (this.b8042Status & ChipSet.KBC.STATUS.OUTBUFF_DELAY) {
                    this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_FULL;
                    this.b8042Status &= ~ChipSet.KBC.STATUS.OUTBUFF_DELAY;
                }
                return b;
            };
            
            /**
             * out8042InBuffCmd(port, bOut, addrFrom)
             *
             * This writes to the 8042's input buffer; using this port (ie, 0x64 instead of 0x60) designates the
             * the byte as a "command byte".  We immediately set KBC.STATUS.CMD_FLAG, and then see if we can act upon
             * the command immediately (some commands requires us to wait for a "data byte").
             *
             * @this {ChipSet}
             * @param {number} port (0x64)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.out8042InBuffCmd = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "8042_INBUFF.CMD", null, Messages.C8042);
                this.assert(!(this.b8042Status & ChipSet.KBC.STATUS.INBUFF_FULL));
                this.b8042InBuff = bOut;
            
                this.b8042Status |= ChipSet.KBC.STATUS.CMD_FLAG;
            
                var bPulseBits = 0;
                if (this.b8042InBuff >= ChipSet.KBC.CMD.PULSE_OUTPORT) {
                    bPulseBits = (this.b8042InBuff ^ 0xf);
                    /*
                     * Now that we have isolated the bit(s) to pulse, map all pulse commands to KBC.CMD.PULSE_OUTPORT
                     */
                    this.b8042InBuff = ChipSet.KBC.CMD.PULSE_OUTPORT;
                }
            
                switch (this.b8042InBuff) {
                case ChipSet.KBC.CMD.READ_CMD:          // 0x20
                    this.set8042OutBuff(this.b8042CmdData);
                    break;
            
                case ChipSet.KBC.CMD.WRITE_CMD:         // 0x60
                    /*
                     * No further action required for this command; more data is expected via out8042InBuffData()
                     */
                    break;
            
                case ChipSet.KBC.CMD.DISABLE_KBD:       // 0xAD
                    this.set8042CmdData(this.b8042CmdData | ChipSet.KBC.DATA.CMD.NO_CLOCK);
                    if (DEBUG) this.printMessage("keyboard disabled", Messages.KEYBOARD | Messages.PORT);
                    /*
                     * NOTE: The MODEL_5170 BIOS calls "KBD_RESET" (F000:17D2) while the keyboard interface is disabled,
                     * yet we must still deliver the Keyboard's CMDRES.BAT_OK response code?  Seems like an odd thing for
                     * a "disabled interface" to do.
                     */
                    break;
            
                case ChipSet.KBC.CMD.ENABLE_KBD:        // 0xAE
                    this.set8042CmdData(this.b8042CmdData & ~ChipSet.KBC.DATA.CMD.NO_CLOCK);
                    if (DEBUG) this.printMessage("keyboard re-enabled", Messages.KEYBOARD | Messages.PORT);
                    if (this.kbd) this.kbd.checkScanCode();
                    break;
            
                case ChipSet.KBC.CMD.SELF_TEST:         // 0xAA
                    if (this.kbd) this.kbd.flushScanCode();
                    this.set8042CmdData(this.b8042CmdData | ChipSet.KBC.DATA.CMD.NO_CLOCK);
                    if (DEBUG) this.printMessage("keyboard disabled on reset", Messages.KEYBOARD | Messages.PORT);
                    this.set8042OutBuff(ChipSet.KBC.DATA.SELF_TEST.OK);
                    this.set8042OutPort(ChipSet.KBC.OUTPORT.NO_RESET | ChipSet.KBC.OUTPORT.A20_ON);
                    break;
            
                case ChipSet.KBC.CMD.INTF_TEST:         // 0xAB
                    /*
                     * TODO: Determine all the side-effects of the Interface Test, if any.
                     */
                    this.set8042OutBuff(ChipSet.KBC.DATA.INTF_TEST.OK);
                    break;
            
                case ChipSet.KBC.CMD.READ_INPORT:       // 0xC0
                    this.set8042OutBuff(this.b8042InPort);
                    break;
            
                case ChipSet.KBC.CMD.READ_OUTPORT:      // 0xD0
                    this.set8042OutBuff(this.b8042OutPort);
                    break;
            
                case ChipSet.KBC.CMD.WRITE_OUTPORT:     // 0xD1
                    /*
                     * No further action required for this command; more data is expected via out8042InBuffData()
                     */
                    break;
            
                case ChipSet.KBC.CMD.READ_TEST:         // 0xE0
                    this.set8042OutBuff((this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK)? 0 : ChipSet.KBC.TESTPORT.KBD_CLOCK);
                    break;
            
                case ChipSet.KBC.CMD.PULSE_OUTPORT:     // 0xF0-0xFF
                    if (bPulseBits & 0x1) {
                        /*
                         * Bit 0 of the 8042's output port is connected to RESET.  If it's pulsed, the processor resets.
                         * We don't want to clear *all* CPU state (eg, cycle counts), so we call cpu.resetRegs() instead
                         * of cpu.reset().
                         */
                        this.cpu.resetRegs();
                    }
                    break;
            
                default:
                    if (DEBUG && this.messageEnabled(Messages.C8042)) {
                        this.printMessage("unrecognized 8042 command: " + str.toHexByte(this.b8042InBuff), true);
                        this.dbg.stopCPU();
                    }
                    break;
                }
            };
            
            /**
             * set8042CmdData(b)
             *
             * @this {ChipSet}
             * @param {number} b
             */
            ChipSet.prototype.set8042CmdData = function(b)
            {
                var bClockWasEnabled = !(this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK);
                this.b8042CmdData = b;
                this.assert(ChipSet.KBC.DATA.CMD.SYS_FLAG === ChipSet.KBC.STATUS.SYS_FLAG);
                this.b8042Status = (this.b8042Status & ~ChipSet.KBC.STATUS.SYS_FLAG) | (b & ChipSet.KBC.DATA.CMD.SYS_FLAG);
                if (this.kbd) {
                    /*
                     * This seems to be what the doctor ordered for the MODEL_5170_REV3 BIOS @F000:0A6D, where it
                     * sends ChipSet.KBC.CMD.WRITE_CMD to port 0x64, followed by 0x4D to port 0x60, which clears NO_CLOCK
                     * and enables the keyboard.  The BIOS then waits for OUTBUFF_FULL to be set, at which point it seems
                     * to be anticipating an 0xAA response in the output buffer.
                     *
                     * And indeed, if we call the original MODEL_5150/MODEL_5160 setEnabled() Keyboard interface here,
                     * and both the data and clock lines have transitioned high (ie, both parameters are true), then it
                     * will call resetDevice(), generating a Keyboard.CMDRES.BAT_OK response.
                     *
                     * This agrees with my understanding of what happens when the 8042 toggles the clock line high
                     * (ie, clears NO_CLOCK): the TechRef's "Basic Assurance Test" section says that when the Keyboard is
                     * powered on, it performs the BAT, and then when the clock and data lines go high, the keyboard sends
                     * a completion code (eg, 0xAA for success, or 0xFC or something else for failure).
                     */
                    var bClockEnabled = !(b & ChipSet.KBC.DATA.CMD.NO_CLOCK);
                    this.kbd.setEnabled(!!(b & ChipSet.KBC.DATA.CMD.NO_INHIBIT), bClockEnabled);
                }
            };
            
            /**
             * set8042OutBuff(b, fNoDelay)
             *
             * The 5170 ROM BIOS assumed there would be a slight delay after certain 8042 commands, like SELF_TEST
             * (0xAA), before there was an OUTBUFF response; in fact, there is BIOS code that will fail without such
             * a delay.  This is discussed in greater detail in in8042Status().
             *
             * So we default to a "single poll" delay, setting OUTBUFF_DELAY instead of OUTBUFF_FULL, unless the caller
             * explicitly asks for no delay.  The fNoDelay parameter was added later, so that notifyKbdData() could
             * request immediate delivery of keyboard scan codes, because some operating systems (eg, Microport's 1986
             * version of Unix for PC AT machines) poll the status port only once, immediately giving up if no data is
             * available.
             *
             * TODO: Determine if we can/should invert the fNoDelay default (from false to true) and delay only in
             * specific cases; perhaps only the SELF_TEST command required a delay.
             *
             * @this {ChipSet}
             * @param {number} b
             * @param {boolean} [fNoDelay]
             */
            ChipSet.prototype.set8042OutBuff = function(b, fNoDelay)
            {
                if (b >= 0) {
                    this.b8042OutBuff = b;
                    if (fNoDelay) {
                        this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_FULL;
                    } else {
                        this.b8042Status &= ~ChipSet.KBC.STATUS.OUTBUFF_FULL;
                        this.b8042Status |= ChipSet.KBC.STATUS.OUTBUFF_DELAY;
                    }
                    if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                        this.printMessage("set8042OutBuff(" + str.toHexByte(b) + ")", true);
                    }
                }
            };
            
            /**
             * set8042OutPort(b)
             *
             * @this {ChipSet}
             * @param {number} b
             */
            ChipSet.prototype.set8042OutPort = function(b)
            {
                this.b8042OutPort = b;
            
                this.bus.setA20(!!(b & ChipSet.KBC.OUTPORT.A20_ON));
            
                if (!(b & ChipSet.KBC.OUTPORT.NO_RESET)) {
                    /*
                     * Bit 0 of the 8042's output port is connected to RESET.  Normally, it's "pulsed" with the
                     * KBC.CMD.PULSE_OUTPORT command, so if a RESET is detected via this command, we should try to
                     * determine if that's what the caller intended.
                     */
                    if (DEBUG && this.messageEnabled(Messages.C8042)) {
                        this.printMessage("unexpected 8042 output port reset: " + str.toHexByte(b), true);
                        this.dbg.stopCPU();
                    }
                    this.cpu.resetRegs();
                }
            };
            
            /**
             * notifyKbdData(b)
             *
             * In the old days of PCjs, the Keyboard component would simply call setIRR() when it had some data for the
             * keyboard controller.  However, the Keyboard's sole responsibility is to emulate an actual keyboard and call
             * notifyKbdData() whenever it has some data; it's not allowed to mess with IRQ lines.
             *
             * If there's an 8042, we check (this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK); if NO_CLOCK is clear,
             * we can raise the IRQ immediately.  Well, not quite immediately....
             *
             * Notes regarding the MODEL_5170 (eg, /devices/pc/machine/5170/ega/1152kb/rev3/machine.xml):
             *
             * The "Rev3" BIOS, dated 11-Nov-1985, contains the following code in the keyboard interrupt handler at K26A:
             *
             *      F000:3704 FA            CLI
             *      F000:3705 B020          MOV      AL,20
             *      F000:3707 E620          OUT      20,AL
             *      F000:3709 B0AE          MOV      AL,AE
             *      F000:370B E88D02        CALL     SHIP_IT
             *      F000:370E FA            CLI                     <-- window of opportunity
             *      F000:370F 07            POP      ES
             *      F000:3710 1F            POP      DS
             *      F000:3711 5F            POP      DI
             *      F000:3712 5E            POP      SI
             *      F000:3713 5A            POP      DX
             *      F000:3714 59            POP      CX
             *      F000:3715 5B            POP      BX
             *      F000:3716 58            POP      AX
             *      F000:3717 5D            POP      BP
             *      F000:3718 CF            IRET
             *
             * and SHIP_IT looks like this:
             *
             *      F000:399B 50            PUSH     AX
             *      F000:399C FA            CLI
             *      F000:399D 2BC9          SUB      CX,CX
             *      F000:399F E464          IN       AL,64
             *      F000:39A1 A802          TEST     AL,02
             *      F000:39A3 E0FA          LOOPNZ   399F
             *      F000:39A5 58            POP      AX
             *      F000:39A6 E664          OUT      64,AL
             *      F000:39A8 FB            STI
             *      F000:39A9 C3            RET
             *
             * This code *appears* to be trying to ensure that another keyboard interrupt won't occur until after the IRET,
             * but sadly, it looks to me like the CLI following the call to SHIP_IT is too late.  SHIP_IT should have been
             * written with PUSHF/CLI and POPF intro/outro sequences, thereby honoring the first CLI at the top of K26A and
             * eliminating the need for the second CLI (@F000:370E).
             *
             * Of course, in "real life", this was probably never a problem, because the 8042 probably wasn't fast enough to
             * generate another interrupt so soon after receiving the ChipSet.KBC.CMD.ENABLE_KBD command.  In my case, I ran
             * into this problem by 1) turning on "kbd" Debugger messages and 2) rapidly typing lots of keys.  The Debugger
             * messages bogged the machine down enough for me to hit the "window of opportunity", generating this message in
             * PC-DOS 3.20:
             *
             *      "FATAL: Internal Stack Failure, System Halted."
             *
             * and halting the system @0070:0923 (JMP 0923).
             *
             * That wasn't the only spot in the BIOS where I hit this problem; here's another "window of opportunity":
             *
             *      F000:3975 FA            CLI
             *      F000:3976 B020          MOV      AL,20
             *      F000:3978 E620          OUT      20,AL
             *      F000:397A B0AE          MOV      AL,AE
             *      F000:397C E81C00        CALL     SHIP_IT
             *      F000:397F B80291        MOV      AX,9102        <-- window of opportunity
             *      F000:3982 CD15          INT      15
             *      F000:3984 80269600FC    AND      [0096],FC
             *      F000:3989 E982FD        JMP      370E
             *
             * In this second, lengthier, example, I counted about 60 instructions being executed from the EOI @F000:3978 to
             * the final IRET @F000:3718, most of them in the INT 0x15 handler.  So, I'm going to double that count to 120
             * instructions, just to be safe, and pass that along to every setIRR() call we make here.
             *
             * @this {ChipSet}
             * @param {number} b
             */
            ChipSet.prototype.notifyKbdData = function(b)
            {
                if (this.model < ChipSet.MODEL_5170) {
                    /*
                     * TODO: Should we be checking bPPI for PPI_B.CLK_KBD on these older machines, before calling setIRR()?
                     */
                    this.setIRR(ChipSet.IRQ.KBD, 4);
                }
                else {
                    if (!(this.b8042CmdData & ChipSet.KBC.DATA.CMD.NO_CLOCK)) {
                        /*
                         * The next read of b8042OutBuff will clear both of these bits and call kbd.checkScanCode(),
                         * which will call notifyKbdData() again if there's still keyboard data to process.
                         */
                        if (!(this.b8042Status & (ChipSet.KBC.STATUS.OUTBUFF_FULL | ChipSet.KBC.STATUS.OUTBUFF_DELAY))) {
                            this.set8042OutBuff(b, true);
                            this.kbd.shiftScanCode();
                            /*
                             * A delay of 4 instructions was originally requested as part of the the Keyboard's resetDevice()
                             * response, but a larger delay (120) is now needed for MODEL_5170 machines, per the discussion above.
                             */
                            this.setIRR(ChipSet.IRQ.KBD, 120);
                        }
                        else {
                            if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                                this.printMessage("notifyKbdData(" + str.toHexByte(b) + "): output buffer full", true);
                            }
                        }
                    } else {
                        if (DEBUG && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                            this.printMessage("notifyKbdData(" + str.toHexByte(b) + "): disabled", true);
                        }
                    }
                }
            };
            
            /**
             * inCMOSAddr(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x70)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inCMOSAddr = function(port, addrFrom)
            {
                this.printMessageIO(port, null, addrFrom, "CMOS.ADDR", this.bCMOSAddr, Messages.CMOS);
                return this.bCMOSAddr;
            };
            
            /**
             * outCMOSAddr(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x70)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.outCMOSAddr = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "CMOS.ADDR", null, Messages.CMOS);
                this.bCMOSAddr = bOut;
                this.bNMI = (bOut & ChipSet.CMOS.ADDR.NMI_DISABLE)? ChipSet.NMI.DISABLE : ChipSet.NMI.ENABLE;
            };
            
            /**
             * inCMOSData(port, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x71)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to read the specified port)
             * @return {number} simulated port value
             */
            ChipSet.prototype.inCMOSData = function(port, addrFrom)
            {
                var bAddr = this.bCMOSAddr & ChipSet.CMOS.ADDR.MASK;
                var bIn = (bAddr <= ChipSet.CMOS.ADDR.STATUSD? this.getRTCByte(bAddr) : this.abCMOSData[bAddr]);
                if (this.messageEnabled(Messages.CMOS | Messages.PORT)) {
                    this.printMessageIO(port, null, addrFrom, "CMOS.DATA[" + str.toHexByte(bAddr) + "]", bIn, true);
                }
                if (addrFrom != null) {
                    if (bAddr == ChipSet.CMOS.ADDR.STATUSC) {
                        /*
                         * When software reads the STATUSC port, all interrupt bits (PF, AF, and UF) are automatically
                         * cleared, which in turn clears the IRQF bit, which in turn clears the IRQ.
                         */
                        this.abCMOSData[bAddr] &= ChipSet.CMOS.STATUSC.RESERVED;
                        if (bIn & ChipSet.CMOS.STATUSC.IRQF) this.clearIRR(ChipSet.IRQ.RTC);
                        /*
                         * If we just cleared PF, and PIE is still set, then we need to make sure the next Periodic Interrupt
                         * occurs in a timely manner, too.
                         */
                        if ((bIn & ChipSet.CMOS.STATUSC.PF) && (this.abCMOSData[ChipSet.CMOS.ADDR.STATUSB] & ChipSet.CMOS.STATUSB.PIE)) {
                            if (DEBUG) this.printMessage("RTC periodic interrupt cleared", Messages.RTC);
                            this.setRTCCycleLimit();
                        }
                    }
                }
                return bIn;
            };
            
            /**
             * outCMOSData(port, bOut, addrFrom)
             *
             * @this {ChipSet}
             * @param {number} port (0x71)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.outCMOSData = function(port, bOut, addrFrom)
            {
                var bAddr = this.bCMOSAddr & ChipSet.CMOS.ADDR.MASK;
                if (this.messageEnabled(Messages.CMOS | Messages.PORT)) {
                    this.printMessageIO(port, bOut, addrFrom, "CMOS.DATA[" + str.toHexByte(bAddr) + "]", null, true);
                }
                var bDelta = bOut ^ this.abCMOSData[bAddr];
                this.abCMOSData[bAddr] = (bAddr <= ChipSet.CMOS.ADDR.STATUSD? this.setRTCByte(bAddr, bOut) : bOut);
                if (bAddr == ChipSet.CMOS.ADDR.STATUSB && (bDelta & ChipSet.CMOS.STATUSB.PIE)) {
                    if (bOut & ChipSet.CMOS.STATUSB.PIE) {
                        if (DEBUG) this.printMessage("RTC periodic interrupts enabled", Messages.RTC);
                        this.setRTCCycleLimit();
                    } else {
                        if (DEBUG) this.printMessage("RTC periodic interrupts disabled", Messages.RTC);
                    }
                }
            };
            
            /**
             * outNMI(port, bOut, addrFrom)
             *
             * This handler is installed only for models before MODEL_5170.
             *
             * @this {ChipSet}
             * @param {number} port (0xA0)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.outNMI = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "NMI");
                this.bNMI = bOut;
            };
            
            /**
             * outCoprocClear(port, bOut, addrFrom)
             *
             * This handler is installed only for MODEL_5170.
             *
             * @this {ChipSet}
             * @param {number} port (0xF0)
             * @param {number} bOut (0x00 is the only expected output)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.outCoprocClear = function(port, bOut, addrFrom)
            {
                /*
                 * TODO: Implement
                 */
                this.printMessageIO(port, bOut, addrFrom, "COPROC.CLEAR");
                this.assert(!bOut);
            };
            
            /**
             * outCoprocReset(port, bOut, addrFrom)
             *
             * This handler is installed only for MODEL_5170.
             *
             * @this {ChipSet}
             * @param {number} port (0xF1)
             * @param {number} bOut (0x00 is the only expected output)
             * @param {number} [addrFrom] (not defined if the Debugger is trying to write the specified port)
             */
            ChipSet.prototype.outCoprocReset = function(port, bOut, addrFrom)
            {
                /*
                 * TODO: Implement
                 */
                this.printMessageIO(port, bOut, addrFrom, "COPROC.RESET");
                this.assert(!bOut);
            };
            
            /**
             * intBIOSRTC(addr)
             *
             * INT 0x1A Quick Reference:
             *
             *      AH
             *      ----
             *      0x00    Get current clock count in CX:DX
             *      0x01    Set current clock count from CX:DX
             *      0x02    Get real-time clock using BCD (CH=hours, CL=minutes, DH=seconds)
             *      0x03    Set real-time clock using BCD (CH=hours, CL=minutes, DH=seconds, DL=1 if Daylight Savings Time option)
             *      0x04    Get real-time date using BCD (CH=century, CL=year, DH=month, DL=day)
             *      0x05    Set real-time date using BCD (CH=century, CL=year, DH=month, DL=day)
             *      0x06    Set alarm using BCD (CH=hours, CL=minutes, DH=seconds)
             *      0x07    Reset alarm
             *
             * @this {ChipSet}
             * @param {number} addr
             * @return {boolean} true to proceed with the INT 0x1A software interrupt, false to skip
             */
            ChipSet.prototype.intBIOSRTC = function(addr)
            {
                if (DEBUGGER) {
                    if (this.messageEnabled(Messages.RTC) && this.dbg.messageInt(Interrupts.RTC.VECTOR, addr)) {
                        /*
                         * By computing AH now, we get the incoming AH value; if we computed it below, along with
                         * the rest of the register values, we'd get the outgoing AH value, which is not what we want.
                         */
                        var AH = this.cpu.regEAX >> 8;
                        this.cpu.addIntReturn(addr, function(chipset, nCycles) {
                            return function onBIOSRTCReturn(nLevel) {
                                nCycles = chipset.cpu.getCycles() - nCycles;
                                var sResult;
                                var CL = chipset.cpu.regEDX & 0xff;
                                var CH = chipset.cpu.regEDX >> 8;
                                var DL = chipset.cpu.regEDX & 0xff;
                                var DH = chipset.cpu.regEDX >> 8;
                                if (AH == 0x02 || AH == 0x03) {
                                    sResult = " CH(hour)=" + str.toHexWord(CH) + " CL(min)=" + str.toHexByte(CL) + " DH(sec)=" + str.toHexByte(DH);
                                } else if (AH == 0x04 || AH == 0x05) {
                                    sResult = " CX(year)=" + str.toHexWord(chipset.cpu.regECX) + " DH(month)=" + str.toHexByte(DH) + " DL(day)=" + str.toHexByte(DL);
                                }
                                chipset.dbg.messageIntReturn(Interrupts.RTC.VECTOR, nLevel, nCycles, sResult);
                            };
                        }(this, this.cpu.getCycles()));
                    }
                }
                return true;
            };
            
            /**
             * parseSwitches(s, def)
             *
             * @this {ChipSet}
             * @param {string|undefined} s describing switch settings
             * @param {number} def is a default value to use if s is undefined
             * @return {number} value representing the switch settings
             */
            ChipSet.prototype.parseSwitches = function(s, def)
            {
                if (s === undefined) return def;
                /*
                 * NOTE: We can't simply use parseInt() with a base of 2, because the bit order is reversed, as well as the bit sense.
                 */
                var b = 0, bit = 0x1;
                for (var i = 0; i < s.length; i++) {
                    if (s.charAt(i) == "0") b |= bit;
                    bit <<= 1;
                }
                return b;
            };
            
            /**
             * setSpeaker(fOn)
             *
             * @this {ChipSet}
             * @param {boolean} [fOn] true to turn speaker on, false to turn off, otherwise update as appropriate
             */
            ChipSet.prototype.setSpeaker = function(fOn)
            {
                if (this.contextAudio) {
                    try {
                        if (fOn !== undefined) {
                            this.fSpeaker = fOn;
                        } else {
                            fOn = this.fSpeaker && this.cpu && this.cpu.isRunning();
                        }
                        var freq = Math.round(ChipSet.TIMER_TICKS_PER_SEC / this.getTimerInit(ChipSet.PIT0.TIMER2));
                        /*
                         * Treat frequencies outside the normal hearing range (below 20hz or above 20Khz) as a clever attempt
                         * to turn sound off; we have to explicitly turn the sound off in those cases, to prevent the Audio API
                         * from "easing" the audio to the target frequency and creating odd sound effects.
                         */
                        if (freq < 20 || freq > 20000) fOn = false;
                        if (fOn) {
                            if (this.sourceAudio) {
                                this.sourceAudio['frequency']['value'] = freq;
                                if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker set to " + freq + "hz", true);
                            } else {
                                this.sourceAudio = this.contextAudio['createOscillator']();
                                if (this.sourceAudio) {
                                    if (typeof this.sourceAudio['type'] == "number") {
                                        this.sourceAudio['type'] = 1;   // deprecated: 0: "sine", 1: "square", 2: "sawtooth", 3: "triangle"
                                    } else {
                                        this.sourceAudio['type'] = "square";
                                    }
                                    this.sourceAudio['connect'](this.contextAudio['destination']);
                                    this.sourceAudio['frequency']['value'] = freq;
                                    if ('start' in this.sourceAudio) {
                                        this.sourceAudio['start'](0);
                                    } else {
                                        this.sourceAudio['noteOn'](0);  // deprecated: this.sourceAudio['noteOn'](0)
                                    }
                                    if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker on at  " + freq + "hz", true);
                                }
                            }
                        } else {
                            if (this.sourceAudio) {
                                if ('stop' in this.sourceAudio) {
                                    this.sourceAudio['stop'](0);
                                } else {
                                    this.sourceAudio['noteOff'](0);     // deprecated: this.sourceAudio['noteOff'](0)
                                }
                                this.sourceAudio['disconnect']();       // QUESTION: is this automatic following a stop(), since this particular source cannot be started again?
                                delete this.sourceAudio;                // QUESTION: ditto?
                                if (this.messageEnabled(Messages.SPEAKER)) this.printMessage("speaker off at " + freq + "hz", true);
                            }
                        }
                    } catch(e) {
                        this.notice("AudioContext exception: " + e.message);
                        this.contextAudio = null;
                    }
                } else if (fOn) {
                    this.printMessage("BEEP", Messages.SPEAKER);
                }
            };
            
            /**
             * messageBitsDMA(iChannel)
             *
             * @this {ChipSet}
             * @param {number} [iChannel] if the message is associated with a particular IRQ #
             * @return {number}
             */
            ChipSet.prototype.messageBitsDMA = function(iChannel)
            {
                var bitsMessage = Messages.DATA;
                if (iChannel == ChipSet.DMA_FDC) {
                    bitsMessage |= Messages.FDC;
                } else if (iChannel == ChipSet.DMA_HDC) {
                    bitsMessage |= Messages.HDC;
                }
                return bitsMessage;
            };
            
            /**
             * messageBitsIRQ(nIRQ)
             *
             * @this {ChipSet}
             * @param {number|undefined} [nIRQ] if the message is associated with a particular IRQ #
             * @return {number}
             */
            ChipSet.prototype.messageBitsIRQ = function(nIRQ)
            {
                var bitsMessage = Messages.PIC;
                if (nIRQ == ChipSet.IRQ.TIMER0) {           // IRQ 0
                    bitsMessage |= Messages.TIMER;
                } else if (nIRQ == ChipSet.IRQ.KBD) {       // IRQ 1
                    bitsMessage |= Messages.KEYBOARD;
                } else if (nIRQ == ChipSet.IRQ.SLAVE) {     // IRQ 2 (MODEL_5170 and up)
                    bitsMessage |= Messages.CHIPSET;
                } else if (nIRQ == ChipSet.IRQ.COM1 || nIRQ == ChipSet.IRQ.COM2) {
                    bitsMessage |= Messages.SERIAL;
                } else if (nIRQ == ChipSet.IRQ.XTC) {       // IRQ 5 (MODEL_5160)
                    bitsMessage |= Messages.HDC;
                } else if (nIRQ == ChipSet.IRQ.FDC) {       // IRQ 6
                    bitsMessage |= Messages.FDC;
                } else if (nIRQ == ChipSet.IRQ.RTC) {       // IRQ 8 (MODEL_5170 and up)
                    bitsMessage |= Messages.RTC;
                } else if (nIRQ == ChipSet.IRQ.ATC) {       // IRQ 14 (MODEL_5170 and up)
                    bitsMessage |= Messages.HDC;
                }
                return bitsMessage;
            };
            
            /*
             * Port input notification tables
             */
            ChipSet.aPortInput = {
                0x00: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 0, port, addrFrom); },
                0x01: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 0, port, addrFrom); },
                0x02: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
                0x03: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
                0x04: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
                0x05: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
                0x06: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
                0x07: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
                0x08: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA0.INDEX, port, addrFrom); },
                0x20: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICLo(ChipSet.PIC0.INDEX, addrFrom); },
                0x21: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICHi(ChipSet.PIC0.INDEX, addrFrom); },
                0x40: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER0, port, addrFrom); },
                0x41: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER1, port, addrFrom); },
                0x42: /** @this {ChipSet} */ function(port, addrFrom) { return this.inTimer(ChipSet.PIT0.TIMER2, port, addrFrom); },
                0x43: ChipSet.prototype.inPIT1Ctrl,
                0x81: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 2, port, addrFrom); },
                0x82: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 3, port, addrFrom); },
                0x83: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 1, port, addrFrom); },
                0x87: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA0.INDEX, 0, port, addrFrom); }
            };
            
            ChipSet.aPortInput5150 = {
                0x60: ChipSet.prototype.inPPIA,
                0x61: ChipSet.prototype.inPPIB,
                0x62: ChipSet.prototype.inPPIC,
                0x63: ChipSet.prototype.inPPICtrl   // technically, not actually readable, but I want the Debugger to be able to read this
            };
            
            ChipSet.aPortInput5170 = {
                0x60: ChipSet.prototype.in8042OutBuff,
                0x61: ChipSet.prototype.in8042RWReg,
                0x64: ChipSet.prototype.in8042Status,
                0x70: ChipSet.prototype.inCMOSAddr,
                0x71: ChipSet.prototype.inCMOSData,
                0x80: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(7, port, addrFrom); },
                0x84: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(0, port, addrFrom); },
                0x85: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(1, port, addrFrom); },
                0x86: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(2, port, addrFrom); },
                0x88: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(3, port, addrFrom); },
                0x89: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
                0x8A: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
                0x8B: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
                0x8C: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(4, port, addrFrom); },
                0x8D: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(5, port, addrFrom); },
                0x8E: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageSpare(6, port, addrFrom); },
                0x8F: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAPageReg(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
                0xA0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICLo(ChipSet.PIC1.INDEX, addrFrom); },
                0xA1: /** @this {ChipSet} */ function(port, addrFrom) { return this.inPICHi(ChipSet.PIC1.INDEX, addrFrom); },
                0xC0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
                0xC2: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 0, port, addrFrom); },
                0xC4: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
                0xC6: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 1, port, addrFrom); },
                0xC8: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
                0xCA: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, addrFrom); },
                0xCC: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
                0xCE: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, addrFrom); },
                0xD0: /** @this {ChipSet} */ function(port, addrFrom) { return this.inDMAStatus(ChipSet.DMA1.INDEX, port, addrFrom); }
            };
            
            /*
             * Port output notification tables
             */
            ChipSet.aPortOutput = {
                0x00: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); },
                0x01: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); },
                0x02: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
                0x03: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
                0x04: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
                0x05: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
                0x06: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
                0x07: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
                0x08: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMACmd(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                0x09: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAReq(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                0x0A: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                0x0B: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                0x0C: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAResetFF(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                0x0D: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMasterClear(ChipSet.DMA0.INDEX, port, bOut, addrFrom); },
                0x20: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICLo(ChipSet.PIC0.INDEX, bOut, addrFrom); },
                0x21: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICHi(ChipSet.PIC0.INDEX, bOut, addrFrom); },
                0x40: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER0, port, bOut, addrFrom); },
                0x41: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER1, port, bOut, addrFrom); },
                0x42: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outTimer(ChipSet.PIT0.TIMER2, port, bOut, addrFrom); },
                0x43: ChipSet.prototype.outPIT1Ctrl,
                0x81: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 2, port, bOut, addrFrom); },
                0x82: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 3, port, bOut, addrFrom); },
                0x83: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 1, port, bOut, addrFrom); },
                0x87: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA0.INDEX, 0, port, bOut, addrFrom); }
            };
            
            ChipSet.aPortOutput5150 = {
                0x60: ChipSet.prototype.outPPIA,
                0x61: ChipSet.prototype.outPPIB,
                0x62: ChipSet.prototype.outPPIC,
                0x63: ChipSet.prototype.outPPICtrl,
                0xA0: ChipSet.prototype.outNMI
            };
            
            ChipSet.aPortOutput5170 = {
                0x60: ChipSet.prototype.out8042InBuffData,
                0x61: ChipSet.prototype.out8042RWReg,
                0x64: ChipSet.prototype.out8042InBuffCmd,
                0x70: ChipSet.prototype.outCMOSAddr,
                0x71: ChipSet.prototype.outCMOSData,
                0x80: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(7, port, bOut, addrFrom); },
                0x84: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(0, port, bOut, addrFrom); },
                0x85: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(1, port, bOut, addrFrom); },
                0x86: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(2, port, bOut, addrFrom); },
                0x88: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(3, port, bOut, addrFrom); },
                0x89: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
                0x8A: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
                0x8B: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
                0x8C: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(4, port, bOut, addrFrom); },
                0x8D: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(5, port, bOut, addrFrom); },
                0x8E: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageSpare(6, port, bOut, addrFrom); },
                0x8F: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAPageReg(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
                0xA0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICLo(ChipSet.PIC1.INDEX, bOut, addrFrom); },
                0xA1: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outPICHi(ChipSet.PIC1.INDEX, bOut, addrFrom); },
                0xC0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
                0xC2: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 0, port, bOut, addrFrom); },
                0xC4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
                0xC6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 1, port, bOut, addrFrom); },
                0xC8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
                0xCA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 2, port, bOut, addrFrom); },
                0xCC: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelAddr(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
                0xCE: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAChannelCount(ChipSet.DMA1.INDEX, 3, port, bOut, addrFrom); },
                0xD0: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMACmd(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                0xD2: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAReq(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                0xD4: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMask(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                0xD6: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMode(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                0xD8: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAResetFF(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                0xDA: /** @this {ChipSet} */ function(port, bOut, addrFrom) { this.outDMAMasterClear(ChipSet.DMA1.INDEX, port, bOut, addrFrom); },
                0xF0: ChipSet.prototype.outCoprocClear,
                0xF1: ChipSet.prototype.outCoprocReset
            };
            
            /**
             * ChipSet.init()
             *
             * This function operates on every HTML element of class "chipset", extracting the
             * JSON-encoded parameters for the ChipSet constructor from the element's "data-value"
             * attribute, invoking the constructor to create a ChipSet component, and then binding
             * any associated HTML controls to the new component.
             */
            ChipSet.init = function()
            {
                var aeChipSet = Component.getElementsByClass(window.document, PCJSCLASS, "chipset");
                for (var iChip = 0; iChip < aeChipSet.length; iChip++) {
                    var eChipSet = aeChipSet[iChip];
                    var parmsChipSet = Component.getComponentParms(eChipSet);
                    var chipset = new ChipSet(parmsChipSet);
                    Component.bindComponentControls(chipset, eChipSet, PCJSCLASS);
                    chipset.updateSwitchDesc();
                }
            };
            
            /*
             * Initialize every ChipSet module on the page.
             */
            web.onInit(ChipSet.init);
            
            if (typeof module !== 'undefined') module.exports = ChipSet;
            
          • computer.js
            /**
             * @fileoverview Implements the PCjs Computer component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-15
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            /*
             * BUILD INSTRUCTIONS
             *
             * To build PCjs (pc.js), run Google's Closure Compiler, replacing "*.js" with
             * the input file sequence defined by the "pcJSFiles" property in package.json:
             *
             *      java -jar compiler.jar
             *          --compilation_level ADVANCED_OPTIMIZATIONS
             *          --define='DEBUG=false'
             *          --warning_level=VERBOSE
             *          --js *.js
             *          --js_output_file pc.js
             *
             * Google's Closure Compiler (compiler.jar) is documented at
             * https://developers.google.com/closure/compiler/ and is available
             * for download here:
             *
             *      http://closure-compiler.googlecode.com/files/compiler-latest.zip
             *
             * The PCjs JavaScript files do have some initialization-order dependencies.
             * If you load the files individually, it's recommended that you load them in
             * the same order that they're compiled.
             *
             * Generally speaking, component.js should be first, computer.js should be
             * last (of the files based on component.js), and panel.js should be listed
             * early so that the Control Panel is ready as soon as possible.
             *
             * Another recent ordering requirement is that rom.js must be loaded before
             * ram.js; this was true before, but now it's required, because I'm starting
             * to add ROM BIOS Data Area definitions to rom.js, and since the data area
             * is in RAM, ram.js may want access to some of those definitions.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var usr         = require("../../shared/lib/usrlib");
                var web         = require("../../shared/lib/weblib");
                var UserAPI     = require("../../shared/lib/userapi");
                var ReportAPI   = require("../../shared/lib/reportapi");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var Bus         = require("./bus");
                var State       = require("./state");
            }
            
            /**
             * Computer(parmsComputer, parmsMachine, fSuspended)
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsComputer
             * @param {Object} [parmsMachine]
             * @param {boolean} [fSuspended]
             *
             * The Computer component has no required (parmsComputer) properties, but does
             * support the following:
             *
             *      busWidth: number of memory address lines (address bits) on the computer's "bus";
             *      20 is the minimum (and the default), which implies 8086/8088 real-mode addressing,
             *      while 24 is required for 80286 protected-mode addressing.  This value is passed
             *      directly through to the Bus component; see that component for more details.
             *
             *      resume: one of the Computer.RESUME constants, which are as follows:
             *          '0' if resume disabled (default)
             *          '1' if enabled without prompting
             *          '2' if enabled with prompting
             *          '3' if enabled with prompting and auto-delete
             *          or a string containing the path of a predefined JSON-encoded state
             *
             *      state: the path to JSON-encoded state file (see details regarding 'state' below)
             *
             * If a predefined state is supplied AND it's successfully loaded, then resume behavior
             * defaults to '1' (ie, resume enabled without prompting).
             *
             * This component insures that all components are ready before "powering" them.
             *
             * Different components become ready at different times, and initialization order (ie,
             * the order the scripts are combined on the page) only partially determines readiness.
             * This is because components like ROM and Video must finish loading their resource files
             * before they are ready.  Other components become ready after we call their initBus()
             * function, because they have a Bus or CPU dependency, such as access to memory management
             * functions.  And other components, like CPU and Panel, are ready as soon as their
             * constructor finishes.
             *
             * Once a component has indicated it's ready, we call its powerUp() notification
             * function (if it has one--it's optional).  We call the CPU's powerUp() function last,
             * so that the CPU is assured that all other components are ready and "powered".
             */
            function Computer(parmsComputer, parmsMachine, fSuspended) {
            
                Component.call(this, "Computer", parmsComputer, Computer, Messages.COMPUTER);
            
                this.aFlags.fPowered = false;
                /*
                 * TODO: Deprecate 'buswidth' (it should have always used camelCase)
                 */
                this.nBusWidth = parmsComputer['busWidth'] || parmsComputer['buswidth'];
                this.resume = Computer.RESUME_NONE;
                this.sStateData = null;
                this.fServerState = false;
                this.url = parmsMachine? parmsMachine['url'] : null;
            
                /*
                 * Generate a random number x (where 0 <= x < 1), add 0.1 so that it's guaranteed to be
                 * non-zero, convert to base 36, and chop off the leading digit and "decimal" point.
                 */
                this.sMachineID = (Math.random() + 0.1).toString(36).substr(2,12);
                this.sUserID = this.queryUserID();
            
                /*
                 * Find the appropriate CPU (and Debugger and Control Panel, if any)
                 *
                 * CLOSURE COMPILER TIP: To override the type of a right-hand expression (as we need to do here,
                 * where we know getComponentByType() will only return an X86CPU object or null), wrap the expression
                 * in parentheses.  I never knew this until I stumbled across it in "Closure: The Definitive Guide".
                 */
                this.cpu = /** @type {X86CPU} */ (Component.getComponentByType("CPU", this.id));
                if (!this.cpu) {
                    Component.error("Unable to find CPU component");
                    return;
                }
                this.dbg = /** @type {Debugger} */ (Component.getComponentByType("Debugger", this.id));
            
                /*
                 * Initialize the Bus component
                 */
                this.bus = new Bus({'id': this.idMachine + '.bus', 'buswidth': this.nBusWidth}, this.cpu, this.dbg);
            
                /*
                 * Iterate through all the components and connect them to the Control Panel, if any
                 */
                var iComponent, component;
                var aComponents = Component.getComponents(this.id);
                this.panel = Component.getComponentByType("Panel", this.id);
            
                if (this.panel && this.panel.controlPrint) {
                    for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                        component = aComponents[iComponent];
                        /*
                         * I can think of many "cleaner" ways for the Control Panel component to pass its
                         * notice(), println(), etc, overrides on to all the other components, but it's just
                         * too darn convenient to slam those overrides into the components directly.
                         */
                        component.notice = this.panel.notice;
                        component.println = this.panel.println;
                        component.controlPrint = this.panel.controlPrint;
                    }
                }
            
                if (DEBUG && this.messageEnabled()) this.printMessage("PREFETCH: " + PREFETCH + ", TYPEDARRAYS: " + TYPEDARRAYS);
            
                /*
                 * Iterate through all the components again and call their initBus() handler, if any
                 */
                for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    component = aComponents[iComponent];
                    if (component.initBus) component.initBus(this, this.bus, this.cpu, this.dbg);
                }
            
                var sStatePath = null;
                var sResume = parmsComputer['resume'];
                if (sResume !== undefined) {
                    /*
                     * DEPRECATE: This goofiness is a holdover from when the 'resume' property was a string (either a
                     * single-digit string or a path); now it's always a number, so it never has a 'length' property and
                     * the call to parseInt() is unnecessary.
                     */
                    if (sResume.length > 1) {
                        sStatePath = this.sResumePath = sResume;
                    } else {
                        this.resume = parseInt(sResume, 10);
                    }
                }
            
                /*
                 * The Computer 'state' property allows a state file to be specified independent of the 'resume' feature;
                 * previously, you could only use 'resume' to load a state file -- which we still support, but loading a state
                 * file that way prevents the machine's state from being saved, since we always resume from the 'resume' file.
                 *
                 * The other wrinkle is on the restore side: we need to IGNORE the 'state' property if a saved state now exists.
                 * So we have to peek at localStorage, and unfortunately, the only way to "peek" is to actually load the data,
                 * but we're not ready to use it yet, so powerUp() has been changed to use any existing stateComputer that we've
                 * already loaded.
                 *
                 * However, there's now a wrinkle to the wrinkle: if a 'state' parameter has been passed via the URL, then that
                 * OVERRIDES everything; it overrides any 'state' Computer parameter AND it disables resume of any saved state in
                 * localStorage (in other words, it prevents fAllowResume from being true, and forcing resume off).
                 */
                var fAllowResume;
                var sState = Component.parmsURL && Component.parmsURL['state'] || (fAllowResume = true) && parmsComputer['state'];
            
                if (sState) {
                    sStatePath = this.sStatePath = sState;
                    if (!fAllowResume) {
                        this.fServerState = true;
                        this.resume = Computer.RESUME_NONE;
                    }
                    if (this.resume) {
                        this.stateComputer = new State(this, Computer.sAppVer);
                        if (this.stateComputer.load()) {
                            sStatePath = null;
                        } else {
                            delete this.stateComputer;
                        }
                    }
                }
            
                /*
                 * If sStatePath is set, we must use it.  But if there's no sStatePath AND resume is set,
                 * then we have the option of resuming from a server-side state, assuming a valid USERID.
                 */
                if (!sStatePath && this.resume) {
                    sStatePath = this.getServerStatePath();
                    if (sStatePath) this.fServerState = true;
                }
            
                if (!sStatePath) {
                    this.setReady();
                } else {
                    web.loadResource(sStatePath, true, null, this, this.onLoadSetReady);
                }
            
                if (!fSuspended) {
                    /*
                     * Power "up" the computer, giving every component the opportunity to reset or restore itself.
                     */
                    this.wait(this.powerOn);
                }
            }
            
            Component.subclass(Computer);
            
            /*
             * NOTE: 1.01 is the first version to provide limited save/restore support using localStorage.
             * From this point on, care must be taken to insure that any new version that's incompatible with
             * previous localStorage data be released with a version number that is at least 1 greater,
             * since we're tagging the localStorage data with the integer portion of the version string.
             */
            Computer.sAppName = APPNAME || "PCjs";
            Computer.sAppVer = APPVERSION;
            Computer.sCopyright = "Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>";
            
            /*
             * I think it's a good idea to also display a GPL notice, putting people on notice that even
             * the "compiled" source code has all the same GPL requirements as the uncompiled source code.
             */
            Computer.LICENSE = "License: GPL version 3 or later <http://gnu.org/licenses/gpl.html>";
            
            Computer.STATE_FAILSAFE  = "failsafe";
            Computer.STATE_VALIDATE  = "validate";
            Computer.STATE_TIMESTAMP = "timestamp";
            Computer.STATE_VERSION   = "version";
            Computer.STATE_HOSTURL   = "url";
            Computer.STATE_BROWSER   = "browser";
            Computer.STATE_USERID    = "user";
            
            /*
             * The following constants define all the resume options.  Negative values (eg, RESUME_REPOWER) are for
             * internal use only, and RESUME_DELETE is not documented (it provides a way of deleting ALL saved states
             * whenever a resume is declined).  As a result, the only "end-user" values are 0, 1 and 2.
             */
            Computer.RESUME_REPOWER = -1;   // resume without changing any state (for internal use only)
            Computer.RESUME_NONE    = 0;    // default (no resume)
            Computer.RESUME_AUTO    = 1;    // automatically save/restore state
            Computer.RESUME_PROMPT  = 2;    // automatically save but conditionally restore (WARNING: if restore is declined, any state is discarded)
            Computer.RESUME_DELETE  = 3;    // same as RESUME_PROMPT but discards ALL machines states whenever ANY machine restore is declined (undocumented)
            
            /**
             * getMachineID()
             *
             * @return {string}
             */
            Computer.prototype.getMachineID = function()
            {
                return this.sMachineID;
            };
            
            /**
             * getUserID()
             *
             * @return {string}
             */
            Computer.prototype.getUserID = function()
            {
                return this.sUserID? this.sUserID : "";
            };
            
            /**
             * onLoadSetReady(sStateFile, sStateData, nErrorCode)
             *
             * @this {Computer}
             * @param {string} sStateFile
             * @param {string} sStateData
             * @param {number} nErrorCode
             */
            Computer.prototype.onLoadSetReady = function(sStateFile, sStateData, nErrorCode)
            {
                if (!nErrorCode) {
                    this.sStateData = sStateData;
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("loaded state file " + sStateFile.replace(this.sUserID || "xxx", "xxx"));
                    }
                } else {
                    this.sResumePath = null;
                    this.fServerState = false;
                    this.notice('Unable to load machine state from server (error ' + nErrorCode + (sStateData? ': ' + str.trim(sStateData) : '') + ')');
                }
                this.setReady();
            };
            
            /**
             * wait(fn, parms)
             *
             * wait() waits until every component is ready (including ourselves, the last component we check),
             * then calls the specified Computer method.
             *
             * TODO: As with web.loadResource(), the Closure Compiler makes it difficult for us to define
             * a function type for "fn" that works in all cases; sometimes we want to pass a function that takes
             * only a "number", and other times we want to pass a function that takes only an "Array" (the type
             * will mirror that of the "parms" parameter). However, the Closure Compiler insists that both functions
             * must be declared as accepting both types of parameters. So once again, we must use an untyped function
             * declaration, instead of something stricter like:
             *
             *      param {function(this:Computer, (number|Array|undefined)): undefined} fn
             *
             * @this {Computer}
             * @param {function(...)} fn
             * @param {number|Array} [parms] optional parameters
             */
            Computer.prototype.wait = function(fn, parms)
            {
                var computer = this;
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent <= aComponents.length; iComponent++) {
                    var component = (iComponent < aComponents.length ? aComponents[iComponent] : this);
                    if (!component.isReady()) {
                        component.isReady(function onComponentReady() {
                            computer.wait(fn, parms);
                        });
                        return;
                    }
                }
                if (DEBUG && this.messageEnabled()) this.printMessage("Computer.wait(ready)");
                fn.call(this, parms);
            };
            
            /**
             * validateState(stateComputer)
             *
             * NOTE: We clear() stateValidate only when there's no stateComputer.
             *
             * @this {Computer}
             * @param {State|null} [stateComputer]
             * @return {boolean} true if state passes validation, false if not
             */
            Computer.prototype.validateState = function(stateComputer)
            {
                var fValid = true;
                var stateValidate = new State(this, Computer.sAppVer, Computer.STATE_VALIDATE);
                if (stateValidate.load() && stateValidate.parse()) {
                    var sTimestampValidate = stateValidate.get(Computer.STATE_TIMESTAMP);
                    var sTimestampComputer = stateComputer ? stateComputer.get(Computer.STATE_TIMESTAMP) : "unknown";
                    if (sTimestampValidate != sTimestampComputer) {
                        this.notice("Machine state may be out-of-date\n(" + sTimestampValidate + " vs. " + sTimestampComputer + ")\nCheck your browser's local storage limits");
                        fValid = false;
                        if (!stateComputer) stateValidate.clear();
                    } else {
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("Last state: " + sTimestampComputer + " (validate: " + sTimestampValidate + ")");
                        }
                    }
                }
                return fValid;
            };
            
            /**
             * powerOn(resume)
             *
             * Power every component "up", applying any previously available state information.
             *
             * @this {Computer}
             * @param {number} [resume] is a valid RESUME value; default is this.resume
             */
            Computer.prototype.powerOn = function(resume)
            {
                if (resume === undefined) {
                    resume = this.resume || (this.sStateData? Computer.RESUME_AUTO : Computer.RESUME_NONE);
                }
            
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("Computer.powerOn(" + (resume == Computer.RESUME_REPOWER ? "repower" : (resume ? "resume" : "")) + ")");
                }
            
                var fRepower = false;
                var fRestore = false;
                this.fRestoreError = false;
                var stateComputer = this.stateComputer || new State(this, Computer.sAppVer);
            
                if (resume == Computer.RESUME_REPOWER) {
                    fRepower = true;
                }
                else if (resume > Computer.RESUME_NONE) {
                    if (stateComputer.load(this.sStateData)) {
                        /*
                         * Since we're resuming something (either a predefined state or a state from localStorage), let's
                         * create a "failsafe" checkpoint in localStorage, and destroy it at the end of a successful powerOn().
                         * Which means, of course, that if a previous "failsafe" checkpoint already exists, something bad
                         * may have happened the last time around.
                         */
                        this.stateFailSafe = new State(this, Computer.sAppVer, Computer.STATE_FAILSAFE);
                        if (this.stateFailSafe.load()) {
                            this.powerReport(stateComputer);
                            /*
                             * We already know resume is something other than RESUME_NONE, so we'll go ahead and bump it
                             * all the way to RESUME_PROMPT, so that the user will be prompted, and if the user declines to
                             * restore, the state will be removed.
                             */
                            resume = Computer.RESUME_PROMPT;
                            /*
                             * To ensure that the set() below succeeds, we need to call unload(), otherwise it may fail
                             * with a "read only" error (eg, "TypeError: Cannot assign to read only property 'timestamp'").
                             */
                            this.stateFailSafe.unload();
                        }
            
                        this.stateFailSafe.set(Computer.STATE_TIMESTAMP, usr.getTimestamp());
                        this.stateFailSafe.store();
            
                        var fValidate = this.resume && !this.fServerState;
                        if (resume == Computer.RESUME_AUTO || web.confirmUser("Click OK to restore the previous " + Computer.sAppName + " machine state, or CANCEL to reset the machine.")) {
                            fRestore = stateComputer.parse();
                            if (fRestore) {
                                var sCode = stateComputer.get(UserAPI.RES.CODE);
                                var sData = stateComputer.get(UserAPI.RES.DATA);
                                if (sCode) {
                                    if (sCode == UserAPI.CODE.OK) {
                                        stateComputer.load(sData);
                                    } else {
                                        /*
                                         * A missing (or not yet created) state file is no cause for alarm, but other errors might be
                                         */
                                        if (sCode == UserAPI.CODE.FAIL && sData != UserAPI.FAIL.NOSTATE) {
                                            this.notice("Error: " + sData);
                                            if (sData == UserAPI.FAIL.VERIFY) this.resetUserID();
                                        } else {
                                            this.println(sCode + ": " + sData);
                                        }
                                        /*
                                         * Try falling back to the state that we should have saved in localStorage, as a backup to the
                                         * server-side state.
                                         */
                                        stateComputer.unload();     // discard the invalid server-side state first
                                        if (stateComputer.load()) {
                                            fRestore = stateComputer.parse();
                                            fValidate = true;
                                        } else {
                                            fRestore = false;       // hmmm, there was nothing in localStorage either
                                        }
                                    }
                                }
                            }
                            /*
                             * If the load/parse was successful, and it was from localStorage (not sStateData),
                             * then we should to try verify that localStorage snapshot is current.  One reason it may
                             * NOT be current is if localStorage was full and we got a quota error during the last
                             * powerOff().
                             */
                            if (fValidate) this.validateState(fRestore? stateComputer : null);
                        } else {
                            /*
                             * RESUME_PROMPT indicates we should delete the state if they clicked Cancel to confirm() above.
                             */
                            if (resume == Computer.RESUME_PROMPT) stateComputer.clear();
                        }
                    } else {
                        /*
                         * If there's no state, then there should also be no validation timestamp; if there is, then once again,
                         * we're probably dealing with a quota error.
                         */
                        this.validateState();
                    }
                    delete this.sStateData;
                    delete this.stateComputer;
                }
            
                /*
                 * Start powering all components, including any data they may need to restore their state;
                 * we restore power to the CPU last.
                 */
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    var component = aComponents[iComponent];
                    if (component !== this && component != this.cpu) {
                        fRestore = this.powerRestore(component, stateComputer, fRepower, fRestore);
                    }
                }
            
                /*
                 * Assuming this is not a repower, we must perform another wait, because some components may
                 * have marked themselves as "not ready" again (eg, the FDC component, if the restore forced it
                 * to mount one or more additional disk images).
                 */
                var aParms = [stateComputer, resume, fRestore];
            
                if (resume != Computer.RESUME_REPOWER) {
                    this.wait(this.donePowerOn, aParms);
                    return;
                }
                this.donePowerOn(aParms);
            };
            
            /**
             * powerRestore(component, stateComputer, fRepower, fRestore)
             *
             * @this {Computer}
             * @param {Component} component
             * @param {State} stateComputer
             * @param {boolean} fRepower
             * @param {boolean} fRestore
             * @return {boolean} true if restore should continue, false if not
             */
            Computer.prototype.powerRestore = function(component, stateComputer, fRepower, fRestore)
            {
                if (!component.aFlags.fPowered) {
            
                    component.aFlags.fPowered = true;
            
                    if (component.powerUp) {
            
                        var data = null;
                        if (fRestore) {
                            data = stateComputer.get(component.id);
                            if (!data) {
                                /*
                                 * This is a hack that makes it possible for a machine whose ID has been
                                 * supplemented with a suffix (a single letter or digit) to find object IDs
                                 * in states created from a machine without the suffix.
                                 *
                                 * For example, if a state file was created from a machine with ID "ibm5160"
                                 * but the current machine is "ibm5160a", this attempts a second lookup with
                                 * "ibm5160", enabling us to find objects that match the original machine ID
                                 * (eg, "ibm5160.romEGA").
                                 */
                                data = stateComputer.get(component.id.replace(/[a-z0-9]\./i, '.'));
                            }
                        }
            
                        /*
                         * State.get() will return whatever was originally passed to State.set() (eg, an
                         * Object or a string), but components are supposed to store only Objects, so if a
                         * string comes back, something went wrong.  By explicitly eliminating "string" data,
                         * the Closure Compiler stops complaining that we might be passing strings to our
                         * powerUp() functions (even though we know we're not).
                         *
                         * TODO: Determine if there's some way to coerce the Closure Compiler into treating
                         * data as Object or null, without having to include this runtime check.  An assert
                         * would be a good idea, but this is overkill.
                         */
                        if (typeof data === "string") data = null;
            
                        /*
                         * If computer is null, this is simply a repower notification, which most components
                         * don't do anything with.  Exceptions include: CPU (since it may be halted) and Video
                         * (since its screen may be "turned off").
                         */
                        if (!component.powerUp(data, fRepower) && data) {
            
                            Component.error("Unable to restore state for " + component.type);
                            /*
                             * If this is a resume error for a machine that also has a predefined state
                             * AND we're not restoring from that state, then throw away the current state,
                             * prevent any new state from being created, and then force a reload, which will
                             * hopefully restore us to the functioning predefined state.
                             *
                             * TODO: Considering doing this in ALL cases, not just in situations where a
                             * 'state' exists but we're not actually resuming from it.
                             */
                            if (this.sStatePath && !this.sStateData) {
                                stateComputer.clear();
                                this.resume = Computer.RESUME_NONE;
                                web.reloadPage();
                            } else {
                                /*
                                 * In all other cases, we set fRestoreError, which should trigger a call to
                                 * powerReport() and then delete the offending state.
                                 */
                                this.fRestoreError = true;
                            }
                            /*
                             * Any failure triggers an automatic to call powerUp() again, without any state,
                             * in the hopes that the component can recover by performing a reset.
                             */
                            component.powerUp(null);
                            /*
                             * We also disable the rest of the restore operation, because it's not clear
                             * the remaining state information can be trusted;  the machine is already in an
                             * inconsistent state, so we're not likely to make things worse, and the only
                             * alternative (starting over and performing a state-less reset) isn't likely to make
                             * the user any happier.  But, we'll see... we need some experience with the code.
                             */
                            fRestore = false;
                        }
                    }
            
                    if (!fRepower && component.comment) {
                        var asComments = component.comment.split("|");
                        for (var i = 0; i < asComments.length; i++) {
                            component.status(asComments[i]);
                        }
                    }
                }
                return fRestore;
            };
            
            /**
             * donePowerOn(aParms)
             *
             * This is nothing more than a continuation of powerOn(), giving us the option of calling wait() one more time.
             *
             * @this {Computer}
             * @param {Array} aParms containing [stateComputer, resume, fRestore]
             */
            Computer.prototype.donePowerOn = function(aParms)
            {
                var stateComputer = aParms[0];
                var fRepower = (aParms[1] < 0);
                var fRestore = aParms[2];
            
                if (DEBUG && this.aFlags.fPowered && this.messageEnabled()) {
                    this.printMessage("Computer.donePowerOn(): redundant");
                }
            
                this.aFlags.fPowered = true;
            
                if (!this.fInitialized) {
                    this.println(Computer.sAppName + " v" + Computer.sAppVer + "\n" + Computer.sCopyright + "\n" + Computer.LICENSE);
                    this.fInitialized = true;
                }
            
                /*
                 * Once we get to this point, we're guaranteed that all components are ready, so it's safe to power the CPU;
                 * the CPU should begin executing immediately, unless a debugger is attached.
                 */
                if (this.cpu) {
                    /*
                     * TODO: Do we not care about the return value here? (ie, is checking fRestoreError sufficient)?
                     */
                    this.powerRestore(this.cpu, stateComputer, fRepower, fRestore);
                    this.cpu.autoStart();
                }
            
                /*
                 * If the state was bad, offer to report it and then delete it.  Deleting may be moot, since invariably a new
                 * state will be created on powerOff() before the next powerOn(), but it seems like good paranoia all the same.
                 */
                if (this.fRestoreError) {
                    this.powerReport(stateComputer);
                    stateComputer.clear();
                }
            
                if (!fRepower && this.stateFailSafe) {
                    this.stateFailSafe.clear();
                    delete this.stateFailSafe;
                }
            };
            
            /**
             * checkPower()
             *
             * @this {Computer}
             * @return {boolean} true if the computer is fully powered, false otherwise
             */
            Computer.prototype.checkPower = function()
            {
                if (this.aFlags.fPowered) return true;
            
                var component = null, iComponent;
                var aComponents = Component.getComponents(this.id);
                for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    component = aComponents[iComponent];
                    if (component !== this && !component.aFlags.fReady) break;
                }
                if (iComponent == aComponents.length) {
                    for (iComponent = 0; iComponent < aComponents.length; iComponent++) {
                        component = aComponents[iComponent];
                        if (component !== this && !component.aFlags.fPowered) break;
                    }
                }
                if (iComponent == aComponents.length) component = this;
                var s = "The " + component.type + " component (" + component.id + ") is not " + (!component.aFlags.fReady? "ready yet" + (component.fnReady? " (waiting for notification)" : "") : "powered yet") + ".";
                web.alertUser(s);
                return false;
            };
            
            /**
             * powerReport(stateComputer)
             *
             * @this {Computer}
             * @param {State} stateComputer
             */
            Computer.prototype.powerReport = function(stateComputer)
            {
                if (web.confirmUser("There may be a problem with your " + Computer.sAppName + " machine.\n\nTo help us diagnose it, click OK to send this " + Computer.sAppName + " machine state to http://" + SITEHOST + ".")) {
                    web.sendReport(Computer.sAppName, Computer.sAppVer, this.url, this.getUserID(), ReportAPI.TYPE.BUG, stateComputer.toString());
                }
            };
            
            /**
             * powerOff(fSave, fShutdown)
             *
             * Power every component "down" and optionally save the machine state.
             *
             * There's one scenario that powerOff() isn't currently able to deal with very effectively: what to do when
             * the user switches away while it's still being restored, causing Disk loadResource() calls to fail.  The
             * Disk component calls notify() when that happens -- see Disk.mount() -- but the FDC and HDC controllers don't
             * notify *us* of those problems, so Computer assumes that the restore was completely successful, when in fact
             * it was only partially successful.
             *
             * Then we immediately arrive here to perform a save, following that incomplete restore.  It would be wrong to
             * deal with that incomplete restore by setting fRestoreError, because we don't want to trigger a powerReport()
             * and the deletion of the previous state, because the state itself was presumably OK.  Unfortunately, the new
             * state we now save will no longer include manually mounted disk images whose remounts were interrupted, so future
             * restores won't remount them either.
             *
             * We could perhaps solve this by having the Disk component notify us in those situations, set a new flag
             * (fRestoreIncomplete?), and set fSave to false if that's ever set.  Be careful though: when fSave is false,
             * that means MORE than not saving; it also means deleting any previous state, which is NOT what you'd want to
             * do in a "fRestoreIncomplete" situation.  Also, we have to worry about Disk operations that fail for other reasons,
             * making sure those failures don't interfere with the save process in the same way.
             *
             * As it stands, the worst that happens is any manually mounted disk images might have to be manually remounted,
             * which doesn't seem like a huge problem.
             *
             * @this {Computer}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown] is true if the machine is being shut down
             * @return {string|null} string representing the captured state (or null if error)
             */
            Computer.prototype.powerOff = function(fSave, fShutdown)
            {
                var data;
                var sState = "none";
            
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("Computer.powerOff(" + (fSave ? "save" : "nosave") + (fShutdown ? ",shutdown" : "") + ")");
                }
            
                var stateComputer = new State(this, Computer.sAppVer);
                var stateValidate = new State(this, Computer.sAppVer, Computer.STATE_VALIDATE);
            
                var sTimestamp = usr.getTimestamp();
                stateValidate.set(Computer.STATE_TIMESTAMP, sTimestamp);
                stateComputer.set(Computer.STATE_TIMESTAMP, sTimestamp);
                stateComputer.set(Computer.STATE_VERSION, APPVERSION);
                stateComputer.set(Computer.STATE_HOSTURL, web.getHostURL());
                stateComputer.set(Computer.STATE_BROWSER, web.getUserAgent());
            
                /*
                 * Always power the CPU "down" first, just to insure it doesn't ask other
                 * components to do anything after they're no longer ready.
                 */
                if (this.cpu && this.cpu.powerDown) {
                    if (fShutdown) this.cpu.stopCPU();
                    data = this.cpu.powerDown(fSave, fShutdown);
                    if (typeof data === "object") stateComputer.set(this.cpu.id, data);
                    if (fShutdown) {
                        this.cpu.aFlags.fPowered = false;
                        if (data === false) sState = null;
                    }
                }
            
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    var component = aComponents[iComponent];
                    if (component.aFlags.fPowered) {
                        if (component.powerDown) {
                            data = component.powerDown(fSave, fShutdown);
                            if (typeof data === "object") stateComputer.set(component.id, data);
                        }
                        if (fShutdown) {
                            component.aFlags.fPowered = false;
                            if (data === false) sState = null;
                        }
                    }
                }
            
                if (sState) {
                    if (fShutdown) {
                        var fClear = false;
                        var fClearAll = false;
                        if (fSave) {
                            if (this.sUserID) {
                                this.saveServerState(this.sUserID, stateComputer.toString());
                            }
                            if (!stateValidate.store() || !stateComputer.store()) {
                                sState = null;
                                /*
                                 * New behavior as of v1.13.2:  if it appears that localStorage is full, we blow it ALL away.
                                 * Dedicated server-side storage is the only way we'll ever be able to reliably preserve a
                                 * particular machine's state.  Historically, attempting to limp along with whatever localStorage
                                 * is left just generates the same useless and annoying warnings over and over.
                                 */
                                fClear = fClearAll = true;
                            }
                        }
                        else {
                            /*
                             * I used to ALWAYS clear (ie, delete) any associated computer state, but now I do this only if the
                             * current machine is "resumable", because there are situations where I have two configurations
                             * for the same machine -- one resumable and one not -- and I don't want the latter throwing away the
                             * state of the former.
                             *
                             * So this code is here now strictly for callers to delete the state of a "resumable" machine, not as
                             * some paranoid clean-up operation.
                             *
                             * An undocumented feature of this operation is that if your configuration uses the special 'resume="3"'
                             * value, and you click the "Reset" button, and then you click OK to reset the everything, this will
                             * actually reset EVERYTHING (ie, all localStorage for ALL configs will be reclaimed).
                             */
                            if (this.resume) {
                                fClear = true;
                                fClearAll = (this.resume == Computer.RESUME_DELETE);
                            }
                        }
                        if (fClear) {
                            stateComputer.clear(fClearAll);
                        }
                    } else {
                        sState = stateComputer.toString();
                    }
                }
            
                if (fShutdown) this.aFlags.fPowered = false;
            
                return sState;
            };
            
            /**
             * reset()
             *
             * Notify all (other) components with a reset() method that the Computer is being reset.
             *
             * NOTE: We'd like to reset the Bus first (due to the importance of the A20 line), but since we
             * allocated the Bus object ourselves, after all the other components were allocated, it ends
             * up near the end of Component's list of components.  Hence the special case for this.bus below.
             *
             * @this {Computer}
             */
            Computer.prototype.reset = function()
            {
                if (this.bus && this.bus.reset) {
                    /*
                     * TODO: Why does WebStorm think that this.bus.type is undefined? The base class (Component)
                     * constructor defines it.
                     */
                    this.printMessage("Resetting " + this.bus.type);
                    this.bus.reset();
                }
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    var component = aComponents[iComponent];
                    if (component !== this && component !== this.bus && component.reset) {
                        this.printMessage("Resetting " + component.type);
                        component.reset();
                    }
                }
            };
            
            /**
             * start(ms, nCycles)
             *
             * Notify all (other) components with a start() method that the CPU has started.
             *
             * Note that we're called by runCPU(), which is why we exclude the CPU component,
             * as well as ourselves.
             *
             * @this {Computer}
             * @param {number} ms
             * @param {number} nCycles
             */
            Computer.prototype.start = function(ms, nCycles)
            {
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    var component = aComponents[iComponent];
                    if (component.type == "CPU" || component === this) continue;
                    if (component.start) {
                        component.start(ms, nCycles);
                    }
                }
            };
            
            /**
             * stop(ms, nCycles)
             *
             * Notify all (other) components with a stop() method that the CPU has stopped.
             *
             * Note that we're called by runCPU(), which is why we exclude the CPU component,
             * as well as ourselves.
             *
             * @this {Computer}
             * @param {number} ms
             * @param {number} nCycles
             */
            Computer.prototype.stop = function(ms, nCycles)
            {
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    var component = aComponents[iComponent];
                    if (component.type == "CPU" || component === this) continue;
                    if (component.stop) {
                        component.stop(ms, nCycles);
                    }
                }
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {Computer}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            Computer.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                var computer = this;
                switch (sBinding) {
                    case "save":
                        this.bindings[sBinding] = control;
                        control.onclick = function onClickSave() {
                            var sUserID = computer.queryUserID(true);
                            if (sUserID) {
                                var fSave = !!(computer.resume && !computer.sResumePath);
                                var sState = computer.powerOff(fSave);
                                if (fSave) {
                                    computer.saveServerState(sUserID, sState);
                                } else {
                                    computer.notice("Resume disabled, machine state not saved");
                                }
                            }
                        };
                        return true;
                    case "reset":
                        this.bindings[sBinding] = control;
                        control.onclick = function onClickReset() {
                            computer.onReset();
                        };
                        return true;
                    default:
                        break;
                }
                return false;
            };
            
            /**
             * resetUserID()
             */
            Computer.prototype.resetUserID = function()
            {
                web.setLocalStorageItem(Computer.STATE_USERID, "");
                this.sUserID = null;
            };
            
            /**
             * queryUserID(fPrompt)
             *
             * @param {boolean} [fPrompt]
             * @returns {string|null|undefined}
             */
            Computer.prototype.queryUserID = function(fPrompt)
            {
                var sUserID = this.sUserID;
                if (!sUserID) {
                    sUserID = web.getLocalStorageItem(Computer.STATE_USERID);
                    if (sUserID !== undefined) {
                        if (!sUserID && fPrompt) {
                            sUserID = web.promptUser("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.");
                            if (sUserID) {
                                sUserID = this.verifyUserID(sUserID);
                                if (!sUserID) this.notice("Your user ID has not been approved.");
                            }
                        }
                    } else if (fPrompt) {
                        this.notice("Browser local storage is not available");
                    }
                }
                return sUserID;
            };
            
            /**
             * verifyUserID(sUserID)
             *
             * @this {Computer}
             * @param {string} sUserID
             * @return {string} validated user ID, or null if error
             */
            Computer.prototype.verifyUserID = function(sUserID)
            {
                this.sUserID = null;
                var fMessages = DEBUG && this.messageEnabled();
                if (fMessages) this.printMessage("verifyUserID(" + sUserID + ")");
                var sRequest = web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.VERIFY + '&' + UserAPI.QUERY.USER + '=' + sUserID;
                var response = web.loadResource(sRequest);
                var nErrorCode = response[0];
                var sResponse = response[1];
                if (!nErrorCode && sResponse) {
                    try {
                        response = eval("(" + sResponse + ")");
                        if (response.code && response.code == UserAPI.CODE.OK) {
                            web.setLocalStorageItem(Computer.STATE_USERID, response.data);
                            if (fMessages) this.printMessage(Computer.STATE_USERID + " updated: " + response.data);
                            this.sUserID = response.data;
                        } else {
                            if (fMessages) this.printMessage(response.code + ": " + response.data);
                        }
                    } catch (e) {
                        Component.error(e.message + " (" + sResponse + ")");
                    }
                } else {
                    if (fMessages) this.printMessage("invalid response (error " + nErrorCode + ")");
                }
                return this.sUserID;
            };
            
            /**
             * getServerStatePath()
             *
             * @this {Computer}
             * @return {string|null} sStatePath (null if no localStorage or no USERID stored in localStorage)
             */
            Computer.prototype.getServerStatePath = function()
            {
                var sStatePath = null;
                if (this.sUserID) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage(Computer.STATE_USERID + " for load: " + this.sUserID);
                    }
                    sStatePath = web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.LOAD + '&' + UserAPI.QUERY.USER + '=' + this.sUserID + '&' + UserAPI.QUERY.STATE + '=' + State.key(this, Computer.sAppVer);
                } else {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage(Computer.STATE_USERID + " unavailable");
                    }
                }
                return sStatePath;
            };
            
            /**
             * saveServerState(sUserID, sState)
             *
             * @param {string} sUserID
             * @param {string|null} sState
             */
            Computer.prototype.saveServerState = function(sUserID, sState)
            {
                /*
                 * We must pass fSync == true, because (as I understand it) browsers will blow off any async
                 * requests when a page is being closed.  Since our request is synchronous, storeServerState()
                 * should also return a result, but there's not much we can do with it, since browsers ALSO
                 * tend to blow off alerts() and the like when closing down.
                 */
                if (sState) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("size of server state: " + sState.length + " bytes");
                    }
                    var response = this.storeServerState(sUserID, sState, true);
                    if (response && response[UserAPI.RES.CODE] == UserAPI.CODE.OK) {
                        this.notice("Machine state saved to server");
                    } else if (sState) {
                        var sError = (response && response[UserAPI.RES.DATA]) || UserAPI.FAIL.BADSTORE;
                        if (response[UserAPI.RES.CODE] == UserAPI.CODE.FAIL) {
                            sError = "Error: " + sError;
                        } else {
                            sError = "Error " + response[UserAPI.RES.CODE] + ": " + sError;
                        }
                        this.notice(sError);
                        this.resetUserID();
                    }
                } else {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("no state to store");
                    }
                }
            };
            
            /**
             * storeServerState(sUserID, sState, fSync)
             *
             * @this {Computer}
             * @param {string} sUserID
             * @param {string} sState
             * @param {boolean} [fSync] is true if we're powering down and should perform a synchronous request (default is async)
             * @return {*} server response if fSync is true and a response was received; otherwise null
             */
            Computer.prototype.storeServerState = function(sUserID, sState, fSync)
            {
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage(Computer.STATE_USERID + " for store: " + sUserID);
                }
                /*
                 * TODO: Determine whether or not any browsers cancel our request if we're called during a browser "shutdown" event,
                 * and whether or not it matters if we do an async request (currently, we're not, to try to ensure the request goes through).
                 */
                var data = {};
                data[UserAPI.QUERY.REQ] = UserAPI.REQ.STORE;
                data[UserAPI.QUERY.USER] = sUserID;
                data[UserAPI.QUERY.STATE] = State.key(this, Computer.sAppVer);
                data[UserAPI.QUERY.DATA] = sState;
                var sRequest = web.getHost() + UserAPI.ENDPOINT;
                if (!fSync) {
                    web.loadResource(sRequest, true, data);
                } else {
                    var response = web.loadResource(sRequest, false, data);
                    var sResponse = response[1];
                    if (response[0]) {
                        if (sResponse) {
                            var i = sResponse.indexOf('\n');
                            if (i > 0) sResponse = sResponse.substr(0, i);
                            if (!sResponse.indexOf("Error: ")) sResponse = sResponse.substr(7);
                        }
                        sResponse = '{"' + UserAPI.RES.CODE + '":' + response[0] + ',"' + UserAPI.RES.DATA + '":"' + sResponse + '"}';
                    }
                    if (DEBUG && this.messageEnabled()) this.printMessage(sResponse);
                    return JSON.parse(sResponse);
                }
                return null;
            };
            
            /**
             * onReset()
             *
             * @this {Computer}
             */
            Computer.prototype.onReset = function()
            {
                /*
                 * If this is a "resumable" machine (and it's not using a predefined state), then we overload the reset
                 * operation to offer an explicit "save or discard" option first.  This is currently the only UI we offer to
                 * discard a machine's state, including any disk changes.  The traditional "reset" operation is still available
                 * for non-resumable machines.
                 *
                 * TODO: Break this behavior out into a separate "discard" operation, in case the designer of the machine really
                 * wants to clutter the UI with confusing options. ;-)
                 */
                if (this.resume && !this.sResumePath) {
                    /*
                     * I used to bypass the prompt if this.resume == Computer.RESUME_AUTO, setting fSave to true automatically,
                     * but that gives the user no means of resetting a resumable machine that contains errors in its resume state.
                     */
                    var fSave = (/* this.resume == Computer.RESUME_AUTO || */ web.confirmUser("Click OK to save changes to this " + Computer.sAppName + " machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded."));
                    this.powerOff(fSave, true);
                    /*
                     * Forcing the page to reload is an expedient option, but ugly. It's preferable to call powerOn()
                     * and rely on all the components to reset themselves to their default state.  The components with
                     * the greatest burden here are FDC and HDC, which must rely on the fReload flag to determine whether
                     * or not to unload/reload all their original auto-mounted disk images.
                     *
                     * However, if we started with a predefined state (ie, sStatePath is set), we take this shortcut, because
                     * we don't (yet) have code in place to gracefully reload the initial state (requires calling loadResource()
                     * again); alternatively, we could avoid throwing that state away, but it seems better to save the memory.
                     *
                     * TODO: Make this more graceful, so that we can stop using the reloadPage() sledgehammer.
                     */
                    if (!fSave && this.sStatePath) {
                        web.reloadPage();
                        return;
                    }
                    if (!fSave) this.fReload = true;
                    this.powerOn(Computer.RESUME_NONE);
                    this.fReload = false;
                } else {
                    this.reset();
                    if (this.cpu) this.cpu.autoStart();
                }
            };
            
            /**
             * getComponentByType(sType, componentPrev)
             *
             * @this {Computer}
             * @param {string} sType
             * @param {Component|null} [componentPrev] of previously returned component, if any
             * @return {Component|null}
             */
            Computer.prototype.getComponentByType = function(sType, componentPrev)
            {
                var aComponents = Component.getComponents(this.id);
                for (var iComponent = 0; iComponent < aComponents.length; iComponent++) {
                    var component = aComponents[iComponent];
                    if (componentPrev) {
                        if (componentPrev == component) componentPrev = null;
                        continue;
                    }
                    if (component.type == sType) return component;
                }
                return null;
            };
            
            /**
             * Computer.init()
             *
             * For every machine represented by an HTML element of class "pcjs-machine", this function
             * locates the HTML element of class "computer", extracting the JSON-encoded parameters for the
             * Computer constructor from the element's "data-value" attribute, invoking the constructor to
             * create a Computer component, and then binding any associated HTML controls to the new component.
             */
            Computer.init = function()
            {
                var aeMachines = Component.getElementsByClass(window.document, PCJSCLASS + "-machine");
            
                for (var iMachine = 0; iMachine < aeMachines.length; iMachine++) {
            
                    var eMachine = aeMachines[iMachine];
                    var parmsMachine = Component.getComponentParms(eMachine);
            
                    var aeComputers = Component.getElementsByClass(eMachine, PCJSCLASS, "computer");
            
                    for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
            
                        var eComputer = aeComputers[iComputer];
                        var parmsComputer = Component.getComponentParms(eComputer);
            
                        /*
                         * We set fSuspended in the Computer constructor because we want to "power up" the
                         * computer ourselves, after any/all bindings are in place.
                         */
                        var computer = new Computer(parmsComputer, parmsMachine, true);
            
                        if (DEBUG && computer.messageEnabled()) {
                            computer.printMessage("onInit(" + computer.aFlags.fPowered + ")");
                        }
            
                        /*
                         * For now, all we support are "reset" and "save" buttons. We may eventually add a "power"
                         * button to manually suspend/resume the machine.  An "erase" button was also considered, but
                         * "reset" now provides a way to force the machine to start from scratch again, so "erase"
                         * might be redundant now.
                         */
                        Component.bindComponentControls(computer, eComputer, PCJSCLASS);
            
                        /*
                         * Power "up" the computer, giving every component the opportunity to reset or restore itself.
                         */
                        computer.wait(computer.powerOn);
                    }
                }
            };
            
            /**
             * Computer.show()
             *
             * When exit() is using an "onbeforeunload" handler, this "onpageshow" handler allows us to repower everything,
             * without either resetting or restoring.  We call powerOn() with a special resume value (RESUME_REPOWER) if the
             * computer is already marked as "ready", meaning the browser didn't change anything.  This "repower" process
             * should be very quick, essentially just marking all components as powered again (so that, for example, the Video
             * component will start drawing again) and firing the CPU up again.
             */
            Computer.show = function()
            {
                var aeComputers = Component.getElementsByClass(window.document, PCJSCLASS, "computer");
                for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
                    var eComputer = aeComputers[iComputer];
                    var parmsComputer = Component.getComponentParms(eComputer);
                    var computer = Component.getComponentByType("Computer", parmsComputer['id']);
                    if (computer) {
            
                        if (DEBUG && computer.messageEnabled()) {
                            computer.printMessage("onShow(" + computer.fInitialized + "," + computer.aFlags.fPowered + ")");
                        }
            
                        if (computer.fInitialized && !computer.aFlags.fPowered) {
                            /**
                             * Repower the computer, notifying every component to continue running as-is.
                             */
                            computer.powerOn(Computer.RESUME_REPOWER);
                        }
                    }
                }
            };
            
            /**
             * Computer.exit()
             *
             * The Computer is currently the only component that uses an "exit" handler, which web.onExit() defines as
             * either an "unload" or "onbeforeunload" handler.  This gives us the opportunity to save the machine state,
             * using our powerOff() function, before the page goes away.
             *
             * It's worth noting that "onbeforeunload" offers one nice feature when used instead of "onload": the entire
             * page (and therefore this entire application) is retained in its current state by the browser (well, some
             * browsers), so that if you go to a new URL, either by entering a new URL in the same window/tab, or by pressing
             * the FORWARD button, and then you press the BACK button, the page is immediately restored to its previous state.
             *
             * In fact, that's how some browsers operate whether you have an "onbeforeunload" handler or not; in other words,
             * an "onbeforeunload" handler doesn't change the page retention behavior of the browser.  By contrast, the mere
             * presence of an "onunload" handler generally causes a browser to throw the page away once the handler returns.
             *
             * However, in order to safely use "onbeforeunload", we must add yet another handler ("onpageshow") to repower
             * everything, without either resetting or restoring.  Hence, the Computer.show() function, which calls powerOn()
             * with a special resume value (RESUME_REPOWER) if the computer is already marked as "ready", meaning the browser
             * didn't change anything.  This "repower" process should be very quick, essentially just marking all components as
             * powered again (so that, for example, the Video component will start drawing again) and firing the CPU up again.
             *
             * Reportedly, some browsers (eg, Opera) don't support "onbeforeunload", in which case Component will have to use
             * "unload" instead.  But even when the page must be rebuilt from scratch, the combination of browser cache and
             * localStorage means the simulation should be restored and become operational almost immediately.
             */
            Computer.exit = function()
            {
                var aeComputers = Component.getElementsByClass(window.document, PCJSCLASS, "computer");
                for (var iComputer = 0; iComputer < aeComputers.length; iComputer++) {
                    var eComputer = aeComputers[iComputer];
                    var parmsComputer = Component.getComponentParms(eComputer);
                    var computer = Component.getComponentByType("Computer", parmsComputer['id']);
                    if (computer) {
            
                        if (DEBUG && computer.messageEnabled()) {
                            computer.printMessage("onExit(" + computer.aFlags.fPowered + ")");
                        }
            
                        if (computer.aFlags.fPowered) {
                            /**
                             * Power "down" the computer, giving every component an opportunity to save its state,
                             * but only if 'resume' has been set AND there is no valid resume path (because if a valid resume
                             * path exists, we'll always load our state from there, and not from whatever we save here).
                             */
                            computer.powerOff(!!(computer.resume && !computer.sResumePath), true);
                        }
                    }
                }
            };
            
            /*
             * Initialize every Computer on the page.
             */
            web.onInit(Computer.init);
            web.onShow(Computer.show);
            web.onExit(Computer.exit);
            
            if (typeof module !== 'undefined') module.exports = Computer;
            
          • cpu.js
            /**
             * @fileoverview Implements the PCjs CPU component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-04
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var usr         = require("../../shared/lib/usrlib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
            }
            
            /**
             * CPU(parmsCPU, nCyclesDefault)
             *
             * The CPU class supports the following (parmsCPU) properties:
             *
             *      cycles: the machine's base cycles per second; the X86CPU constructor will
             *      provide us with a default (based on the CPU model) to use as a fallback
             *
             *      multiplier: base cycle multiplier; default is 1
             *
             *      autoStart: true to automatically start, false to not, or null (default)
             *      to make the autoStart decision based on whether or not a Debugger is
             *      installed (if there's no Debugger AND no "Run" button, then auto-start,
             *      otherwise don't)
             *
             *      csStart: the number of cycles that runCPU() must wait before generating
             *      checksum records; -1 if disabled. checksum records are a diagnostic aid
             *      used to help compare one CPU run to another.
             *
             *      csInterval: the number of cycles that runCPU() must execute before
             *      generating a checksum record; -1 if disabled.
             *
             *      csStop: the number of cycles to stop generating checksum records.
             *
             * This component is primarily responsible for interfacing the CPU with the outside
             * world (eg, Panel and Debugger components), and managing overall CPU operation.
             *
             * It is extended by the X86CPU component, where all the x86-specific logic resides.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsCPU
             * @param {number} nCyclesDefault
             */
            function CPU(parmsCPU, nCyclesDefault)
            {
                Component.call(this, "CPU", parmsCPU, CPU, Messages.CPU);
            
                var nCycles = parmsCPU['cycles'] || nCyclesDefault;
            
                var nMultiplier = parmsCPU['multiplier'] || 1;
            
                this.aCounts = {};
                this.aCounts.nCyclesPerSecond = nCycles;
            
                /*
                 * nCyclesMultiplier replaces the old "speed" variable (0, 1, 2) and eliminates the need for
                 * the constants (SPEED_SLOW, SPEED_FAST and SPEED_MAX).  The UI simply doubles the multiplier
                 * until we've exceeded the host's speed limit and then starts the multiplier over at 1.
                 */
                this.aCounts.nCyclesMultiplier = nMultiplier;
                this.aCounts.mhzDefault = Math.round(this.aCounts.nCyclesPerSecond / 10000) / 100;
                /*
                 * TODO: Take care of this with an initial setSpeed() call instead?
                 */
                this.aCounts.mhzTarget = this.aCounts.mhzDefault * this.aCounts.nCyclesMultiplier;
            
                /*
                 * We add a number of flags to the set initialized by Component
                 */
                this.aFlags.fRunning = false;
                this.aFlags.fStarting = false;
                this.aFlags.fAutoStart = parmsCPU['autoStart'];
            
                /*
                 * TODO: Add some UI for fDisplayLiveRegs (either an XML property, or a UI checkbox, or both)
                 */
                this.aFlags.fDisplayLiveRegs = false;
            
                /*
                 * Provide a power-saving URL-based way of overriding the 'autostart' setting;
                 * if an "autostart" parameter is specified on the URL, anything other than "true"
                 * or "false" is treated as the null setting (see above for details).
                 */
                var sAutoStart = Component.parmsURL['autostart'];
                if (sAutoStart !== undefined) {
                    this.aFlags.fAutoStart = (sAutoStart == "true"? true : (sAutoStart  == "false"? false : null));
                }
            
                /*
                 * Get checksum parameters, if any. runCPU() behavior is not affected until fChecksum
                 * is true, which won't happen until resetChecksum() is called with nCyclesChecksumInterval
                 * ("csInterval") set to a positive value.
                 *
                 * As above, any of these parameters can also be set with the Debugger's execution options
                 * command ("x"); for example, "x cs int 5000" will set nCyclesChecksumInterval to 5000
                 * and call resetChecksum().
                 */
                this.aFlags.fChecksum = false;
                this.aCounts.nChecksum = this.aCounts.nCyclesChecksumNext = 0;
                this.aCounts.nCyclesChecksumStart = parmsCPU["csStart"];
                this.aCounts.nCyclesChecksumInterval = parmsCPU["csInterval"];
                this.aCounts.nCyclesChecksumStop = parmsCPU["csStop"];
            
                /*
                 * Initially, no video devices are attached that require CPU-driven updates.  initBus() will update this.
                 */
                this.aVideo = [];
            
                var cpu = this;
                this.onRunTimeout = function() { cpu.runCPU(); };
            
                this.setReady();
            }
            
            Component.subclass(CPU);
            
            /*
             * Constants that control the frequency at which various updates should occur.
             *
             * These values do NOT control the simulation directly.  Instead, they are used by
             * calcCycles(), which uses the nCyclesPerSecond passed to the constructor as a starting
             * point and computes the following variables:
             *
             *      this.aCounts.nCyclesPerYield         (this.aCounts.nCyclesPerSecond / CPU.YIELDS_PER_SECOND)
             *      this.aCounts.nCyclesPerVideoUpdate   (this.aCounts.nCyclesPerSecond / CPU.VIDEO_UPDATES_PER_SECOND)
             *      this.aCounts.nCyclesPerStatusUpdate  (this.aCounts.nCyclesPerSecond / CPU.STATUS_UPDATES_PER_SECOND)
             *
             * The above variables are also multiplied by any cycle multiplier in effect, via setSpeed(),
             * and then they're used to initialize another set of variables for each runCPU() iteration:
             *
             *      this.aCounts.nCyclesNextYield        <= this.aCounts.nCyclesPerYield
             *      this.aCounts.nCyclesNextVideoUpdate  <= this.aCounts.nCyclesPerVideoUpdate
             *      this.aCounts.nCyclesNextStatusUpdate <= this.aCounts.nCyclesPerStatusUpdate
             */
            CPU.YIELDS_PER_SECOND         = 30;
            CPU.VIDEO_UPDATES_PER_SECOND  = 60;     // WARNING: if you change this, beware of side-effects in the Video component
            CPU.STATUS_UPDATES_PER_SECOND = 2;
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {CPU}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {CPU} cpu
             * @param {Debugger} dbg
             */
            CPU.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.dbg = dbg;
                this.cmp = cmp;
                /*
                 * Attach the Video component to the CPU, so that the CPU can periodically update
                 * the video display via updateVideo(), as cycles permit.
                 */
                for (var video = null; (video = cmp.getComponentByType("Video", video));) {
                    this.aVideo.push(video);
                }
                /*
                 * Attach the ChipSet component to the CPU, so that it can obtain the IDT vector number of
                 * pending hardware interrupts, in response to ChipSet's updateINTR() notifications.
                 *
                 * We must also call chipset.updateAllTimers() periodically; stepCPU() takes care of that.
                 */
                this.chipset = cmp.getComponentByType("ChipSet");
                this.setReady();
            };
            
            /**
             * reset()
             *
             * This is a placeholder for reset (overridden by the X86CPU component).
             *
             * @this {CPU}
             */
            CPU.prototype.reset = function()
            {
            };
            
            /**
             * save()
             *
             * This is a placeholder for save support (overridden by the X86CPU component).
             *
             * @this {CPU}
             * @return {Object|null}
             */
            CPU.prototype.save = function()
            {
                return null;
            };
            
            /**
             * restore(data)
             *
             * This is a placeholder for restore support (overridden by the X86CPU component).
             *
             * @this {CPU}
             * @param {Object} data
             * @return {boolean} true if restore successful, false if not
             */
            CPU.prototype.restore = function(data)
            {
                return false;
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {CPU}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            CPU.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data || !this.restore) {
                        this.reset();
                    } else {
                        this.resetCycles();
                        if (!this.restore(data)) return false;
                        this.resetChecksum();
                    }
                    /*
                     * Give the Debugger a chance to do/print something once we've powered up
                     */
                    if (DEBUGGER && this.dbg) {
                        this.dbg.init();
                    } else {
                        /*
                         * The Computer (this.cmp) knows if there's a Control Panel (this.cmp.panel), and the Control Panel
                         * knows if there's a "print" control (this.cmp.panel.controlPrint), and if there IS a "print" control
                         * but no debugger, the machine is probably misconfigured (most likely, the page simply neglected to
                         * load the Debugger component).
                         *
                         * However, we don't actually need to check all that; it's always safe use println(), regardless whether
                         * a Control Panel with a "print" control is present or not.
                         */
                        this.println("No debugger detected");
                    }
                }
                /*
                 * The Computer component (which is responsible for all powerDown and powerUp notifications)
                 * is now responsible for managing a component's fPowered flag, not us.
                 *
                 *      this.aFlags.fPowered = true;
                 */
                this.updateCPU();
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {CPU}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            CPU.prototype.powerDown = function(fSave, fShutdown)
            {
                /*
                 * The Computer component (which is responsible for all powerDown and powerUp notifications)
                 * is now responsible for managing a component's fPowered flag, not us.
                 *
                 *      this.aFlags.fPowered = false;
                 */
                return fSave && this.save ? this.save() : true;
            };
            
            /**
             * autoStart()
             *
             * @this {CPU}
             * @return {boolean} true if started, false if not
             */
            CPU.prototype.autoStart = function()
            {
                if (this.aFlags.fAutoStart === true || this.aFlags.fAutoStart === null && (!DEBUGGER || !this.dbg) && this.bindings["run"] === undefined) {
                    this.runCPU();      // start running automatically on power-up, assuming there's no Debugger and no "Run" button
                    return true;
                }
                return false;
            };
            
            /**
             * isPowered()
             *
             * @this {CPU}
             * @return {boolean}
             */
            CPU.prototype.isPowered = function()
            {
                if (!this.aFlags.fPowered) {
                    this.println(this.toString() + " not powered");
                    return false;
                }
                return true;
            };
            
            /**
             * isRunning()
             *
             * @this {CPU}
             * @return {boolean}
             */
            CPU.prototype.isRunning = function()
            {
                return this.aFlags.fRunning;
            };
            
            /**
             * getChecksum()
             *
             * This will be implemented by the X86CPU component.
             *
             * @this {CPU}
             * @return {number} a 32-bit summation of key elements of the current CPU state (used by the CPU checksum code)
             */
            CPU.prototype.getChecksum = function()
            {
                return 0;
            };
            
            /**
             * resetChecksum()
             *
             * If checksum generation is enabled (fChecksum is true), this resets the running 32-bit checksum and the
             * cycle counter that will trigger the next displayChecksum(); called by resetCycles(), which is called whenever
             * the CPU is reset or restored.
             *
             * @this {CPU}
             * @return {boolean} true if checksum generation enabled, false if not
             */
            CPU.prototype.resetChecksum = function()
            {
                if (this.aCounts.nCyclesChecksumStart === undefined) this.aCounts.nCyclesChecksumStart = 0;
                if (this.aCounts.nCyclesChecksumInterval === undefined) this.aCounts.nCyclesChecksumInterval = -1;
                if (this.aCounts.nCyclesChecksumStop === undefined) this.aCounts.nCyclesChecksumStop = -1;
                this.aFlags.fChecksum = (this.aCounts.nCyclesChecksumStart >= 0 && this.aCounts.nCyclesChecksumInterval > 0);
                if (this.aFlags.fChecksum) {
                    this.aCounts.nChecksum = 0;
                    this.aCounts.nCyclesChecksumNext = this.aCounts.nCyclesChecksumStart - this.nTotalCycles;
                    // this.aCounts.nCyclesChecksumNext = this.aCounts.nCyclesChecksumStart + this.aCounts.nCyclesChecksumInterval - (this.nTotalCycles % this.aCounts.nCyclesChecksumInterval);
                    return true;
                }
                return false;
            };
            
            /**
             * updateChecksum(nCycles)
             *
             * When checksum generation is enabled (fChecksum is true), runCPU() asks stepCPU() to execute a minimum
             * number of cycles (1), effectively limiting execution to a single instruction, and then we're called with
             * the exact number cycles that were actually executed.  This should give us instruction-granular checksums
             * at precise intervals that are 100% repeatable.
             *
             * @this {CPU}
             * @param {number} nCycles
             */
            CPU.prototype.updateChecksum = function(nCycles)
            {
                if (this.aFlags.fChecksum) {
                    /*
                     * Get a 32-bit summation of the current CPU state and add it to our running 32-bit checksum
                     */
                    var fDisplay = false;
                    this.aCounts.nChecksum = (this.aCounts.nChecksum + this.getChecksum())|0;
                    this.aCounts.nCyclesChecksumNext -= nCycles;
                    if (this.aCounts.nCyclesChecksumNext <= 0) {
                        this.aCounts.nCyclesChecksumNext += this.aCounts.nCyclesChecksumInterval;
                        fDisplay = true;
                    }
                    if (this.aCounts.nCyclesChecksumStop >= 0) {
                        if (this.aCounts.nCyclesChecksumStop <= this.getCycles()) {
                            this.aCounts.nCyclesChecksumInterval = this.aCounts.nCyclesChecksumStop = -1;
                            this.resetChecksum();
                            this.stopCPU();
                            fDisplay = true;
                        }
                    }
                    if (fDisplay) this.displayChecksum();
                }
            };
            
            /**
             * displayChecksum()
             *
             * When checksum generation is enabled (fChecksum is true), this is called to provide a crude log of all
             * checksums generated at the specified cycle intervals, as specified by the "csStart" and "csInterval" parmsCPU
             * properties).
             *
             * @this {CPU}
             */
            CPU.prototype.displayChecksum = function()
            {
                this.println(this.getCycles() + " cycles: " + "checksum=" + str.toHex(this.aCounts.nChecksum));
            };
            
            /**
             * displayValue(sLabel, nValue, cch)
             *
             * This is principally for displaying register values, but in reality, it can be used to display any
             * numeric (hex) value bound to the given label.
             *
             * @this {CPU}
             * @param {string} sLabel
             * @param {number} nValue
             * @param {number} cch
             */
            CPU.prototype.displayValue = function(sLabel, nValue, cch)
            {
                if (this.bindings[sLabel]) {
                    if (nValue === undefined) {
                        this.setError("Value for " + sLabel + " is invalid");
                        this.stopCPU();
                    }
                    var sVal;
                    if (!this.aFlags.fRunning || this.aFlags.fDisplayLiveRegs) {
                        sVal = str.toHex(nValue, cch);
                    } else {
                        sVal = "--------".substr(0, cch);
                    }
                    /*
                     * TODO: Determine if this test actually avoids any redrawing when a register hasn't changed, and/or if
                     * we should maintain our own (numeric) cache of displayed register values (to avoid creating these temporary
                     * string values that will have to garbage-collected), and/or if this is actually slower, and/or if I'm being
                     * too obsessive.
                     */
                    if (this.bindings[sLabel].textContent != sVal) this.bindings[sLabel].textContent = sVal;
                }
            };
            
            /**
             * updateStatus(fForce)
             *
             * This provides periodic Control Panel updates (eg, a few times per second; see STATUS_UPDATES_PER_SECOND).
             * The X86CPU subclasses updateStatus() to take care of any DOM updates (eg, register values) while the CPU is running.
             *
             * @this {CPU}
             * @param {boolean} [fForce]
             */
            CPU.prototype.updateStatus = function(fForce)
            {
                if (this.cmp && this.cmp.panel) this.cmp.panel.updateStatus();
            };
            
            /**
             * updateVideo()
             *
             * Any high-frequency updates should be performed here.  Avoid DOM updates, since updateVideo() can be called up to
             * 60 times per second (see VIDEO_UPDATES_PER_SECOND).
             *
             * @this {CPU}
             */
            CPU.prototype.updateVideo = function()
            {
                for (var i = 0; i < this.aVideo.length; i++) {
                    this.aVideo[i].updateScreen();
                }
                if (this.cmp && this.cmp.panel) this.cmp.panel.updateAnimation();
            };
            
            /**
             * setFocus()
             *
             * @this {CPU}
             */
            CPU.prototype.setFocus = function()
            {
                if (this.aVideo.length) this.aVideo[0].setFocus();
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {CPU}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "run")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            CPU.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                var cpu = this;
                var fBound = false;
                switch (sBinding) {
                case "run":
                    this.bindings[sBinding] = control;
                    control.onclick = function onClickRun() {
                        if (!cpu.cmp || !cpu.cmp.checkPower()) return;
                        if (!cpu.aFlags.fRunning)
                            cpu.runCPU(true);
                        else
                            cpu.stopCPU(true);
                    };
                    fBound = true;
                    break;
            
                case "reset":
                    /*
                     * A "reset" button is really a function of the entire computer, not just the CPU, but
                     * it's not always convenient to stick a reset button in the computer component definition,
                     * so we support a "reset" binding both here AND in the Computer component.
                     */
                    this.bindings[sBinding] = control;
                    control.onclick = function onClickReset() {
                        if (cpu.cmp) cpu.cmp.onReset();
                    };
                    fBound = true;
                    break;
            
                case "speed":
                    this.bindings[sBinding] = control;
                    fBound = true;
                    break;
            
                case "setSpeed":
                    this.bindings[sBinding] = control;
                    control.onclick = function onClickSetSpeed() {
                        cpu.setSpeed(cpu.aCounts.nCyclesMultiplier << 1, true);
                    };
                    control.textContent = this.getSpeedTarget();
                    fBound = true;
                    break;
            
                default:
                    break;
                }
                return fBound;
            };
            
            /**
             * setBurstCycles(nCycles)
             *
             * This function is used by the ChipSet component whenever a very low timer count is set,
             * in anticipation of the timer requiring an update sooner than the normal nCyclesPerYield
             * period in runCPU() would normally provide.
             *
             * @this {CPU}
             * @param {number} nCycles is the target number of cycles to drop the current burst to
             * @return {boolean}
             */
            CPU.prototype.setBurstCycles = function(nCycles)
            {
                if (this.aFlags.fRunning) {
                    var nDelta = this.nStepCycles - nCycles;
                    /*
                     * NOTE: If nDelta is negative, we will actually be increasing nStepCycles and nBurstCycles.
                     * Which is OK, but if we're also taking snapshots of the cycle counts, to make sure that instruction
                     * costs are being properly assessed, then we need to update nSnapCycles as well.
                     *
                     * TODO: If the delta is negative, we could simply ignore the request, but we must first carefully
                     * consider the impact on the ChipSet timers.
                     */
                    if (DEBUG) this.nSnapCycles -= nDelta;
                    this.nStepCycles -= nDelta;
                    this.nBurstCycles -= nDelta;
                    return true;
                }
                return false;
            };
            
            /**
             * addCycles(nCycles, fEndStep)
             *
             * @this {CPU}
             * @param {number} nCycles
             * @param {boolean} [fEndStep]
             */
            CPU.prototype.addCycles = function(nCycles, fEndStep)
            {
                this.nTotalCycles += nCycles;
                if (fEndStep) {
                    this.nBurstCycles = this.nStepCycles = 0;
                }
            };
            
            /**
             * calcCycles(fRecalc)
             *
             * Calculate the number of cycles to process for each "burst" of CPU activity.  The size of a burst
             * is driven by the following values:
             *
             *      CPU.YIELDS_PER_SECOND (eg, 30)
             *      CPU.VIDEO_UPDATES_PER_SECOND (eg, 60)
             *      CPU.STATUS_UPDATES_PER_SECOND (eg, 5)
             *
             * The largest of the above values forces the size of the burst to its smallest value.  Let's say that
             * largest value is 30.  Assuming nCyclesPerSecond is 1,000,000, that results in bursts of 33,333 cycles.
             *
             * At the end of each burst, we subtract burst cycles from yield, video, and status cycle "threshold"
             * counters. Whenever the "next yield" cycle counter goes to (or below) zero, we compare elapsed time
             * to the time we expected the virtual hardware to take (eg, 1000ms/50 or 20ms), and if we still have time
             * remaining, we sleep the remaining time (or 0ms if there's no remaining time), and then restart runCPU().
             *
             * Similarly, whenever the "next video update" cycle counter goes to (or below) zero, we call updateVideo(),
             * and whenever the "next status update" cycle counter goes to (or below) zero, we call updateStatus().
             *
             * @this {CPU}
             * @param {boolean} [fRecalc] is true if the caller wants to recalculate thresholds based on the most recent
             * speed calculation (see calcSpeed).
             */
            CPU.prototype.calcCycles = function(fRecalc)
            {
                /*
                 * Calculate the most cycles we're allowed to execute in a single "burst"
                 */
                var nMostUpdatesPerSecond = CPU.YIELDS_PER_SECOND;
                if (nMostUpdatesPerSecond < CPU.VIDEO_UPDATES_PER_SECOND) nMostUpdatesPerSecond = CPU.VIDEO_UPDATES_PER_SECOND;
                if (nMostUpdatesPerSecond < CPU.STATUS_UPDATES_PER_SECOND) nMostUpdatesPerSecond = CPU.STATUS_UPDATES_PER_SECOND;
            
                /*
                 * Calculate cycle "per" values for the yield, video update, and status update cycle counters
                 */
                var vMultiplier = 1;
                if (fRecalc) {
                    if (this.aCounts.nCyclesMultiplier > 1 && this.aCounts.mhz) {
                        vMultiplier = (this.aCounts.mhz / this.aCounts.mhzDefault);
                    }
                }
            
                this.aCounts.msPerYield = Math.round(1000 / CPU.YIELDS_PER_SECOND);
                this.aCounts.nCyclesPerBurst = Math.floor(this.aCounts.nCyclesPerSecond / nMostUpdatesPerSecond * vMultiplier);
                this.aCounts.nCyclesPerYield = Math.floor(this.aCounts.nCyclesPerSecond / CPU.YIELDS_PER_SECOND * vMultiplier);
                this.aCounts.nCyclesPerVideoUpdate = Math.floor(this.aCounts.nCyclesPerSecond / CPU.VIDEO_UPDATES_PER_SECOND * vMultiplier);
                this.aCounts.nCyclesPerStatusUpdate = Math.floor(this.aCounts.nCyclesPerSecond / CPU.STATUS_UPDATES_PER_SECOND * vMultiplier);
            
                /*
                 * And initialize "next" yield, video update, and status update cycle "threshold" counters to those "per" values
                 */
                if (!fRecalc) {
                    this.aCounts.nCyclesNextYield = this.aCounts.nCyclesPerYield;
                    this.aCounts.nCyclesNextVideoUpdate = this.aCounts.nCyclesPerVideoUpdate;
                    this.aCounts.nCyclesNextStatusUpdate = this.aCounts.nCyclesPerStatusUpdate;
                }
                this.aCounts.nCyclesRecalc = 0;
            };
            
            /**
             * getCycles(fScaled)
             *
             * getCycles() returns the number of cycles executed so far.  Note that we can be called after
             * runCPU() OR during runCPU(), perhaps from a handler triggered during the current run's stepCPU(),
             * so nRunCycles must always be adjusted by number of cycles stepCPU() was asked to run (nBurstCycles),
             * less the number of cycles it has yet to run (nStepCycles).
             *
             * nRunCycles is zeroed whenever the CPU is halted or the CPU speed is changed, which is why we also
             * have nTotalCycles, which accumulates all nRunCycles before we zero it.  However, nRunCycles and
             * nTotalCycles eventually get reset by calcSpeed(), to avoid overflow, so components that rely on
             * getCycles() returning steadily increasing values should also be prepared for a reset at any time.
             *
             * @this {CPU}
             * @param {boolean} [fScaled] is true if the caller wants a cycle count relative to a multiplier of 1
             * @return {number}
             */
            CPU.prototype.getCycles = function(fScaled)
            {
                var nCycles = this.nTotalCycles + this.nRunCycles + this.nBurstCycles - this.nStepCycles;
                if (fScaled && this.aCounts.nCyclesMultiplier > 1 && this.aCounts.mhz > this.aCounts.mhzDefault) {
                    /*
                     * We could scale the current cycle count by the current effective speed (this.aCounts.mhz); eg:
                     *
                     *      nCycles = Math.round(nCycles / (this.aCounts.mhz / this.aCounts.mhzDefault));
                     *
                     * but that speed will fluctuate somewhat: large fluctuations at first, but increasingly smaller
                     * fluctuations after each burst of instructions that runCPU() executes.
                     *
                     * Alternatively, we can scale the cycle count by the multiplier, which is good in that the
                     * multiplier doesn't vary once the user changes it, but a potential downside is that the
                     * multiplier might be set too high, resulting in a target speed that's higher than the effective
                     * speed is able to reach.
                     *
                     * Also, if multipliers were always limited to a power-of-two, then this could be calculated
                     * with a simple shift.  However, only the "setSpeed" UI binding limits it that way; the Debugger
                     * interface allows any value, as does the CPU "multiplier" parmsCPU property (from the machine's
                     * XML file).
                     */
                    nCycles = Math.round(nCycles / this.aCounts.nCyclesMultiplier);
                }
                return nCycles;
            };
            
            /**
             * getCyclesPerSecond()
             *
             * This returns the CPU's "base" speed (ie, the original cycles per second defined for the machine)
             *
             * @this {CPU}
             * @return {number}
             */
            CPU.prototype.getCyclesPerSecond = function()
            {
                return this.aCounts.nCyclesPerSecond;
            };
            
            /**
             * resetCycles()
             *
             * Resets speed and cycle information as part of any reset() or restore(); this typically occurs during powerUp().
             * It's important that this be called BEFORE the actual restore() call, because restore() may want to call setSpeed(),
             * which in turn assumes that all the cycle counts have been initialized to sensible values.
             *
             * @this {CPU}
             */
            CPU.prototype.resetCycles = function()
            {
                this.aCounts.mhz = 0;
                this.nTotalCycles = this.nRunCycles = this.nBurstCycles = this.nStepCycles = 0;
                this.resetChecksum();
                this.setSpeed(1);
            };
            
            /**
             * getSpeed()
             *
             * @this {CPU}
             * @return {number} the current speed multiplier
             */
            CPU.prototype.getSpeed = function()
            {
                return this.aCounts.nCyclesMultiplier;
            };
            
            /**
             * getSpeedCurrent()
             *
             * @this {CPU}
             * @return {string} the current speed, in mhz, as a string formatted to two decimal places
             */
            CPU.prototype.getSpeedCurrent = function()
            {
                /*
                 * TODO: Has toFixed() been "fixed" in all browsers (eg, IE) to return a rounded value now?
                 */
                return ((this.aFlags.fRunning && this.aCounts.mhz)? (this.aCounts.mhz.toFixed(2) + "Mhz") : "Stopped");
            };
            
            /**
             * getSpeedTarget()
             *
             * @this {CPU}
             * @return {string} the target speed, in mhz, as a string formatted to two decimal places
             */
            CPU.prototype.getSpeedTarget = function()
            {
                /*
                 * TODO: Has toFixed() been "fixed" in all browsers (eg, IE) to return a rounded value now?
                 */
                return this.aCounts.mhzTarget.toFixed(2) + "Mhz";
            };
            
            /**
             * setSpeed(nMultiplier, fOnClick)
             *
             * NOTE: This used to return the target speed, in mhz, but no callers appear to care at this point.
             *
             * @this {CPU}
             * @param {number} [nMultiplier] is the new proposed multiplier (reverts to 1 if the target was too high)
             * @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
             * @desc Whenever the speed is changed, the running cycle count and corresponding start time must be reset,
             * so that the next effective speed calculation obtains sensible results.  In fact, when runCPU() initially calls
             * setSpeed() with no parameters, that's all this function does (it doesn't change the current speed setting).
             */
            CPU.prototype.setSpeed = function(nMultiplier, fOnClick)
            {
                if (nMultiplier !== undefined) {
                    /*
                     * If we couldn't reach at least 80% (0.8) of the current target speed,
                     * then revert the multiplier back to one.
                     */
                    if (this.aCounts.mhz / this.aCounts.mhzTarget < 0.8) nMultiplier = 1;
                    this.aCounts.nCyclesMultiplier = nMultiplier;
                    var mhz = this.aCounts.mhzDefault * this.aCounts.nCyclesMultiplier;
                    if (this.aCounts.mhzTarget != mhz) {
                        this.aCounts.mhzTarget = mhz;
                        var sSpeed = this.getSpeedTarget();
                        var controlSpeed = this.bindings["setSpeed"];
                        if (controlSpeed) controlSpeed.textContent = sSpeed;
                        this.println("target speed: " + sSpeed);
                    }
                    if (fOnClick) this.setFocus();
                }
                this.addCycles(this.nRunCycles);
                this.nRunCycles = 0;
                this.aCounts.msStartRun = usr.getTime();
                this.aCounts.msEndThisRun = 0;
                this.calcCycles();
            };
            
            /**
             * calcSpeed(nCycles, msElapsed)
             *
             * @this {CPU}
             * @param {number} nCycles
             * @param {number} msElapsed
             */
            CPU.prototype.calcSpeed = function(nCycles, msElapsed)
            {
                if (msElapsed) {
                    this.aCounts.mhz = Math.round(nCycles / (msElapsed * 10)) / 100;
                    if (msElapsed >= 86400000) {
                        this.nTotalCycles = 0;
                        if (this.chipset) this.chipset.updateAllTimers(true);
                        this.setSpeed();        // reset all counters once per day so that we never have to worry about overflow
                    }
                }
            };
            
            /**
             * calcStartTime()
             *
             * @this {CPU}
             */
            CPU.prototype.calcStartTime = function()
            {
                if (this.aCounts.nCyclesRecalc >= this.aCounts.nCyclesPerSecond) {
                    this.calcCycles(true);
                }
                this.aCounts.nCyclesThisRun = 0;
                this.aCounts.msStartThisRun = usr.getTime();
            
                /*
                 * Try to detect situations where the browser may have throttled us, such as when the user switches
                 * to a different tab; in those situations, Chrome and Safari may restrict setTimeout() callbacks
                 * to roughly one per second.
                 *
                 * Another scenario: the user resizes the browser window.  setTimeout() callbacks are not throttled,
                 * but there can still be enough of a lag between the callbacks that CPU speed will be noticeably
                 * erratic if we don't compensate for it here.
                 *
                 * We can detect throttling/lagging by verifying that msEndThisRun (which was set at the end of the
                 * previous run and includes any requested sleep time) is comparable to the current msStartThisRun;
                 * if the delta is significant, we compensate by bumping msStartRun forward by that delta.
                 *
                 * This shouldn't be triggered when the Debugger halts the CPU, because setSpeed() -- which is called
                 * whenever the CPU starts running again -- zeroes msEndThisRun.
                 *
                 * This also won't do anything about other internal delays; for example, Debugger message() calls.
                 * By the time the message() function has called yieldCPU(), the cost of the message has already been
                 * incurred, so it will be end up being charged against the instruction(s) that triggered it.
                 *
                 * TODO: Consider calling yieldCPU() sooner from message(), so that it can arrange for the msEndThisRun
                 * "snapshot" to occur sooner; it's unclear, however, whether that will really improve the CPU's ability
                 * to hit its target speed, since you would expect any instruction that displays a message to be an
                 * EXTREMELY slow instruction.
                 */
                if (this.aCounts.msEndThisRun) {
                    var msDelta = this.aCounts.msStartThisRun - this.aCounts.msEndThisRun;
                    if (msDelta > this.aCounts.msPerYield) {
                        if (MAXDEBUG) this.println("large time delay: " + msDelta + "ms");
                        this.aCounts.msStartRun += msDelta;
                        /*
                         * Bumping msStartRun forward should NEVER cause it to exceed msStartThisRun; however, just
                         * in case, I make absolutely sure it cannot happen, since doing so could result in negative
                         * speed calculations.
                         */
                        this.assert(this.aCounts.msStartRun <= this.aCounts.msStartThisRun);
                        if (this.aCounts.msStartRun > this.aCounts.msStartThisRun) {
                            this.aCounts.msStartRun = this.aCounts.msStartThisRun;
                        }
                    }
                }
            };
            
            /**
             * calcRemainingTime()
             *
             * @this {CPU}
             * @return {number}
             */
            CPU.prototype.calcRemainingTime = function()
            {
                this.aCounts.msEndThisRun = usr.getTime();
            
                var msYield = this.aCounts.msPerYield;
                if (this.aCounts.nCyclesThisRun) {
                    /*
                     * Normally, we would assume we executed a full quota of work over msPerYield, but since the CPU
                     * now has the option of calling yieldCPU(), that might not be true.  If nCyclesThisRun is correct, then
                     * the ratio of nCyclesThisRun/nCyclesPerYield should represent the percentage of work we performed,
                     * and so applying that percentage to msPerYield should give us a better estimate of work vs. time.
                     */
                    msYield = Math.round(msYield * this.aCounts.nCyclesThisRun / this.aCounts.nCyclesPerYield);
                }
            
                var msElapsedThisRun = this.aCounts.msEndThisRun - this.aCounts.msStartThisRun;
                var msRemainsThisRun = msYield - msElapsedThisRun;
            
                /*
                 * We could pass only "this run" results to calcSpeed():
                 *
                 *      nCycles = this.aCounts.nCyclesThisRun;
                 *      msElapsed = msElapsedThisRun;
                 *
                 * but it seems preferable to use longer time periods and hopefully get a more accurate speed.
                 *
                 * Also, if msRemainsThisRun >= 0 && this.aCounts.nCyclesMultiplier == 1, we could pass these results instead:
                 *
                 *      nCycles = this.aCounts.nCyclesThisRun;
                 *      msElapsed = this.aCounts.msPerYield;
                 *
                 * to insure that we display a smooth, constant N Mhz.  But for now, I prefer seeing any fluctuations.
                 */
                var nCycles = this.nRunCycles;
                var msElapsed = this.aCounts.msEndThisRun - this.aCounts.msStartRun;
            
                if (MAXDEBUG && msRemainsThisRun < 0 && this.aCounts.nCyclesMultiplier > 1) {
                    this.println("warning: updates @" + msElapsedThisRun + "ms (prefer " + Math.round(msYield) + "ms)");
                }
            
                this.calcSpeed(nCycles, msElapsed);
            
                if (msRemainsThisRun < 0 || this.aCounts.mhz < this.aCounts.mhzTarget) {
                    /*
                     * If the last burst took MORE time than we allotted (ie, it's taking more than 1 second to simulate
                     * nCyclesPerSecond), all we can do is yield for as little time as possible (ie, 0ms) and hope that the
                     * simulation is at least usable.
                     */
                    msRemainsThisRun = 0;
                }
            
                /*
                 * Last but not least, update nCyclesRecalc, so that when runCPU() starts up again and calls calcStartTime(),
                 * it'll be ready to decide if calcCycles() should be called again.
                 */
                this.aCounts.nCyclesRecalc += this.aCounts.nCyclesThisRun;
            
                if (DEBUG && this.messageEnabled(Messages.LOG) && msRemainsThisRun) {
                    this.log("calcRemainingTime: " + msRemainsThisRun + "ms to sleep after " + this.aCounts.msEndThisRun + "ms");
                }
            
                this.aCounts.msEndThisRun += msRemainsThisRun;
                return msRemainsThisRun;
            };
            
            /**
             * runCPU(fOnClick)
             *
             * @this {CPU}
             * @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
             */
            CPU.prototype.runCPU = function(fOnClick)
            {
                if (!this.setBusy(true)) {
                    this.updateCPU();
                    if (this.cmp) this.cmp.stop(usr.getTime(), this.getCycles());
                    return;
                }
            
                this.startCPU(fOnClick);
            
                /*
                 *  calcStartTime() initializes the cycle counter and timestamp for this runCPU() invocation, and optionally
                 *  recalculates the the maximum number of cycles for each burst if the nCyclesRecalc threshold has been reached.
                 */
                this.calcStartTime();
                try {
                    do {
                        var nCyclesPerBurst = (this.aFlags.fChecksum? 1 : this.aCounts.nCyclesPerBurst);
            
                        if (this.chipset) {
                            this.chipset.updateAllTimers();
                            nCyclesPerBurst = this.chipset.getTimerCycleLimit(0, nCyclesPerBurst);
                            nCyclesPerBurst = this.chipset.getRTCCycleLimit(nCyclesPerBurst);
                        }
            
                        /*
                         * nCyclesPerBurst is how many cycles we WANT to run on each iteration of stepCPU(), but it may run
                         * significantly less (or slightly more, since we can't execute partial instructions).
                         */
                        this.stepCPU(nCyclesPerBurst);
            
                        /*
                         * nBurstCycles, less any remaining nStepCycles, is how many cycles stepCPU() ACTUALLY ran (nCycles).
                         * We add that to nCyclesThisRun, as well as nRunCycles, which is the cycle count since the CPU first
                         * started running.
                         */
                        var nCycles = this.nBurstCycles - this.nStepCycles;
                        this.nRunCycles += nCycles;
                        this.aCounts.nCyclesThisRun += nCycles;
                        this.addCycles(0, true);
                        this.updateChecksum(nCycles);
            
                        this.aCounts.nCyclesNextVideoUpdate -= nCycles;
                        if (this.aCounts.nCyclesNextVideoUpdate <= 0) {
                            this.aCounts.nCyclesNextVideoUpdate += this.aCounts.nCyclesPerVideoUpdate;
                            this.updateVideo();
                        }
            
                        this.aCounts.nCyclesNextStatusUpdate -= nCycles;
                        if (this.aCounts.nCyclesNextStatusUpdate <= 0) {
                            this.aCounts.nCyclesNextStatusUpdate += this.aCounts.nCyclesPerStatusUpdate;
                            this.updateStatus();
                        }
            
                        this.aCounts.nCyclesNextYield -= nCycles;
                        if (this.aCounts.nCyclesNextYield <= 0) {
                            this.aCounts.nCyclesNextYield += this.aCounts.nCyclesPerYield;
                            break;
                        }
                    } while (this.aFlags.fRunning);
                }
                catch (e) {
                    this.stopCPU();
                    this.updateCPU();
                    if (this.cmp) this.cmp.stop(usr.getTime(), this.getCycles());
                    this.setBusy(false);
                    this.setError(e.stack || e.message);
                    return;
                }
                setTimeout(this.onRunTimeout, this.calcRemainingTime());
            };
            
            /**
             * startCPU(fSetFocus)
             *
             * WARNING: Other components must use runCPU() to get the CPU running; this is a runCPU() helper function only.
             *
             * @param {boolean} [fSetFocus]
             */
            CPU.prototype.startCPU = function(fSetFocus)
            {
                if (!this.aFlags.fRunning) {
                    /*
                     *  setSpeed() without a speed parameter leaves the selected speed in place, but also resets the
                     *  cycle counter and timestamp for the current series of runCPU() calls, calculates the maximum number
                     *  of cycles for each burst based on the last known effective CPU speed, and resets the nCyclesRecalc
                     *  threshold counter.
                     */
                    this.setSpeed();
                    if (this.cmp) this.cmp.start(this.aCounts.msStartRun, this.getCycles());
                    this.aFlags.fRunning = true;
                    this.aFlags.fStarting = true;
                    if (this.chipset) this.chipset.setSpeaker();
                    var controlRun = this.bindings["run"];
                    if (controlRun) controlRun.textContent = "Halt";
                    this.updateStatus(true);
                    if (fSetFocus) this.setFocus();
                }
            };
            
            /**
             * stepCPU(nMinCycles)
             *
             * This will be implemented by the X86CPU component.
             *
             * @this {CPU}
             * @param {number} nMinCycles (0 implies a single-step, and therefore breakpoints should be ignored)
             * @return {number} of cycles executed; 0 indicates that the last instruction was not executed
             */
            CPU.prototype.stepCPU = function(nMinCycles)
            {
                return 0;
            };
            
            /**
             * stopCPU(fComplete)
             *
             * For use by any component that wants to stop the CPU.
             *
             * This similar to yieldCPU(), but it doesn't need to zero nCyclesNextYield to break out of runCPU();
             * it simply needs to clear fRunning (well, "simply" may be oversimplifying a bit....)
             *
             * @this {CPU}
             * @param {boolean} [fComplete]
             */
            CPU.prototype.stopCPU = function(fComplete)
            {
                this.isBusy(true);
                this.nBurstCycles -= this.nStepCycles;
                this.nStepCycles = 0;
                this.addCycles(this.nRunCycles);
                this.nRunCycles = 0;
                if (this.aFlags.fRunning) {
                    this.aFlags.fRunning = false;
                    if (this.chipset) this.chipset.setSpeaker();
                    var controlRun = this.bindings["run"];
                    if (controlRun) controlRun.textContent = "Run";
                }
                this.aFlags.fComplete = fComplete;
            };
            
            /**
             * updateCPU()
             *
             * This used to be performed at the end of every stepCPU(), but runCPU() -- which relies upon
             * stepCPU() -- needed to have more control over when these updates are performed.  However, for
             * other callers of stepCPU(), such as the Debugger, the combination of stepCPU() + updateCPU()
             * provides the old behavior.
             *
             * @this {CPU}
             */
            CPU.prototype.updateCPU = function()
            {
                this.updateVideo();
                this.updateStatus();
            };
            
            /**
             * yieldCPU()
             *
             * Similar to stopCPU() with regard to how it resets various cycle countdown values, but the CPU
             * remains in a "running" state.
             *
             * @this {CPU}
             */
            CPU.prototype.yieldCPU = function()
            {
                this.aCounts.nCyclesNextYield = 0;  // this will break us out of runCPU(), once we break out of stepCPU()
                this.nBurstCycles -= this.nStepCycles;
                this.nStepCycles = 0;               // this will break us out of stepCPU()
                if (DEBUG) this.nSnapCycles = this.nBurstCycles;
                /*
                 * The Debugger calls yieldCPU() after every message() to ensure browser responsiveness, but it looks
                 * odd for those messages to show CPU state changes but for the CPU's own status display to not (ditto
                 * for the Video display), so I've added this call to try to keep things looking synchronized.
                 */
                this.updateCPU();
            };
            
            if (typeof module !== 'undefined') module.exports = CPU;
            
          • debugger.js
            /**
             * @fileoverview Implements the PCjs Debugger component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-21
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (DEBUGGER) {
                if (typeof module !== 'undefined') {
                    var str         = require("../../shared/lib/strlib");
                    var usr         = require("../../shared/lib/usrlib");
                    var web         = require("../../shared/lib/weblib");
                    var Component   = require("../../shared/lib/component");
                    var Interrupts  = require("./interrupts");
                    var Messages    = require("./messages");
                    var Bus         = require("./bus");
                    var Memory      = require("./memory");
                    var Keyboard    = require("./keyboard");
                    var State       = require("./state");
                    var CPU         = require("./cpu");
                    var X86         = require("./x86");
                    var X86Seg      = require("./x86seg");
                }
            }
            
            /**
             * Debugger Address Object
             *
             * When off is null, the entire address is considered invalid.
             *
             * When sel is null, addr must be set to a valid linear address.
             *
             * When addr is null (or reset to null), it will be recomputed from sel:off.
             *
             * NOTE: I originally tried to define DbgAddr as a record typedef, which allowed me to reference the type
             * as {DbgAddr} instead of {{DbgAddr}}, but my IDE (WebStorm) did not recognize all instances of {DbgAddr}.
             * Using this @class definition is a bit cleaner, and it makes both WebStorm and the Closure Compiler happier,
             * at the expense of making all references {{DbgAddr}}.  Defining a typedef based on this class doesn't help.
             *
             * @class DbgAddr
             * @property {number|null|undefined} off (offset, if any)
             * @property {number|null|undefined} sel (selector, if any)
             * @property {number|null|undefined} addr (linear address, if any)
             * @property {boolean|undefined} fData32 (true if 32-bit operand size in effect)
             * @property {boolean|undefined} fAddr32 (true if 32-bit address size in effect)
             * @property {boolean|undefined} fOverride (true if any overrides were processed with this address)
             * @property {boolean|undefined} fComplete (true if a complete instruction was processed with this address)
             * @property {boolean|undefined} fTempBreak (true if this is a temporary breakpoint address)
             */
            
            /**
             * Debugger(parmsDbg)
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsDbg
             *
             * The Debugger component supports the following optional (parmsDbg) properties:
             *
             *      commands: string containing zero or more commands, separated by ';'
             *
             *      messages: string containing zero or more message categories to enable;
             *      multiple categories must be separated by '|' or ';'.  Parsed by messageInit().
             *
             * The Debugger component is an optional component that implements a variety of user
             * commands for controlling the CPU, dumping and editing memory, etc.
             */
            function Debugger(parmsDbg)
            {
                if (DEBUGGER) {
            
                    Component.call(this, "Debugger", parmsDbg, Debugger);
            
                    /*
                     * These keep track of instruction activity, but only when tracing or when Debugger checks
                     * have been enabled (eg, one or more breakpoints have been set).
                     *
                     * They are zeroed by the reset() notification handler.  cInstructions is advanced by
                     * stepCPU() and checkInstruction() calls.  nCycles is updated by every stepCPU() or stop()
                     * call and simply represents the number of cycles performed by the last run of instructions.
                     */
                    this.nCycles = -1;
                    this.cInstructions = -1;
            
                    /*
                     * Default number of hex chars in a register and a linear address (ie, for real-mode);
                     * updated by initBus().
                     */
                    this.cchReg = 4;
                    this.maskReg = 0xffff;
                    this.cchAddr = 5;
                    this.maskAddr = 0xfffff;
            
                    /*
                     * Most commands that require an address call parseAddr(), which defaults to dbgAddrNextCode
                     * or dbgAddrNextData when no address has been given.  doDump() and doUnassemble(), in turn,
                     * update dbgAddrNextData and dbgAddrNextCode, respectively, when they're done.
                     *
                     * All dbgAddr variables contain properties off, sel, and addr, where sel:off represents the
                     * segmented address and addr is the corresponding linear address (if known).  For certain
                     * segmented addresses (eg, breakpoint addresses), we pre-compute the linear address and save
                     * that in addr, so that the breakpoint will still operate as intended even if the mode changes
                     * later (eg, from real-mode to protected-mode).
                     *
                     * Finally, for TEMPORARY breakpoint addresses, we set fTempBreak to true, so that they can be
                     * automatically cleared when they're hit.
                     */
                    this.dbgAddrNextCode = this.newAddr();
                    this.dbgAddrNextData = this.newAddr();
            
                    /*
                     * This maintains command history.  New commands are inserted at index 0 of the array.
                     * When Enter is pressed on an empty input buffer, we default to the command at aPrevCmds[0].
                     */
                    this.iPrevCmd = -1;
                    this.aPrevCmds = [];
            
                    /*
                     * fAssemble is true when "assemble mode" is active, false when not.
                     */
                    this.fAssemble = false;
                    this.dbgAddrAssemble = this.newAddr();
            
                    /*
                     * aSymbolTable is an array of 4-element arrays, one per ROM or other chunk of address space.
                     * Each 4-element arrays contains:
                     *
                     *      [0]: addr
                     *      [1]: size
                     *      [2]: aSymbols
                     *      [3]: aOffsetPairs
                     *
                     * See addSymbols() for more details, since that's how callers add sets of symbols to the table.
                     */
                    this.aSymbolTable = [];
            
                    /*
                     * clearBreakpoints() initializes the breakpoints lists: aBreakExec is a list of addresses
                     * to halt on whenever attempting to execute an instruction at the corresponding address,
                     * and aBreakRead and aBreakWrite are lists of addresses to halt on whenever a read or write,
                     * respectively, occurs at the corresponding address.
                     */
                    this.clearBreakpoints();
            
                    /*
                     * Execution history is allocated by historyInit() whenever checksEnabled() conditions change.
                     * Execution history is updated whenever the CPU calls checkInstruction(), which will happen
                     * only when checksEnabled() returns true (eg, whenever one or more breakpoints have been set).
                     * This ensures that, by default, the CPU runs as fast as possible.
                     */
                    this.historyInit();
            
                    /*
                     * Initialize Debugger message support
                     */
                    this.messageInit(parmsDbg['messages']);
            
                    /*
                     * The instruction trace buffer is a lightweight logging mechanism with minimal impact
                     * on the browser (unlike printing to either console.log or an HTML control, which can
                     * make the browser unusable if printing is too frequent).  The Debugger's info command
                     * ("n dump [#]") dumps this buffer.  Note that dumping too much at once can also bog
                     * things down, but by that point, you've presumably already captured the info you need
                     * and are willing to wait.
                     */
                    if (DEBUG) this.traceInit();
            
                    this.sInitCommands = parmsDbg['commands'];
            
                    /*
                     * Make it easier to access Debugger commands from an external REPL (eg, the WebStorm
                     * "live" console window); eg:
                     *
                     *      $('r')
                     *      $('dw 0:0')
                     *      $('h')
                     *      ...
                     */
                    var dbg = this;
                    if (window) {
                        if (window['$'] === undefined) {
                            window['$'] = function(s) { return dbg.doCommand(s); };
                        }
                    } else {
                        if (global['$'] === undefined) {
                            global['$'] = function(s) { return dbg.doCommand(s); };
                        }
                    }
            
                }   // endif DEBUGGER
            }
            
            if (DEBUGGER) {
            
                Component.subclass(Debugger);
            
                /*
                 * Information regarding interrupts of interest (used by messageInt() and others)
                 */
                Debugger.INT_MESSAGES = {
                    0x10:       Messages.VIDEO,
                    0x13:       Messages.FDC,
                    0x15:       Messages.CHIPSET,
                    0x16:       Messages.KEYBOARD,
                 // 0x1a:       Messages.RTC,       // ChipSet contains its own custom messageInt() handler for the RTC
                    0x1c:       Messages.TIMER,
                    0x21:       Messages.DOS,
                    0x33:       Messages.MOUSE
                };
            
                Debugger.COMMANDS = {
                    '?':     "help",
                    'a [#]': "assemble",
                    'b [#]': "breakpoint",
                    'c':     "clear output",
                    'd [#]': "dump memory",
                    'e [#]': "edit memory",
                    'f':     "frequencies",
                    'g [#]': "go [to #]",
                    'h [#]': "halt/history",
                    'i [#]': "input port #",
                    'k':     "stack trace",
                    'l':     "load sector(s)",
                    'm':     "messages",
                    'o [#]': "output port #",
                    'p':     "step over",
                    'r':     "dump/edit registers",
                    't [#]': "step instruction(s)",
                    'u [#]': "unassemble",
                    'x':     "execution options",
                    'reset': "reset computer",
                    'ver':   "display version"
                };
            
                /*
                 * Address types for parseAddr(), to help choose between dbgAddrNextCode and dbgAddrNextData
                 */
                Debugger.ADDR_CODE = 1;
                Debugger.ADDR_DATA = 2;
            
                /*
                 * Instruction ordinals
                 */
                Debugger.INS = {
                    NONE:   0,   AAA:    1,   AAD:    2,   AAM:    3,   AAS:    4,   ADC:    5,   ADD:    6,   AND:    7,
                    ARPL:   8,   AS:     9,   BOUND:  10,  BSF:    11,  BSR:    12,  BT:     13,  BTC:    14,  BTR:    15,
                    BTS:    16,  CALL:   17,  CBW:    18,  CLC:    19,  CLD:    20,  CLI:    21,  CLTS:   22,  CMC:    23,
                    CMP:    24,  CMPSB:  25,  CMPSW:  26,  CS:     27,  CWD:    28,  DAA:    29,  DAS:    30,  DEC:    31,
                    DIV:    32,  DS:     33,  ENTER:  34,  ES:     35,  ESC:    36,  FADD:   37,  FBLD:   38,  FBSTP:  39,
                    FCOM:   40,  FCOMP:  41,  FDIV:   42,  FDIVR:  43,  FIADD:  44,  FICOM:  45,  FICOMP: 46,  FIDIV:  47,
                    FIDIVR: 48,  FILD:   49,  FIMUL:  50,  FIST:   51,  FISTP:  52,  FISUB:  53,  FISUBR: 54,  FLD:    55,
                    FLDCW:  56,  FLDENV: 57,  FMUL:   58,  FNSAVE: 59,  FNSTCW: 60,  FNSTENV:61,  FNSTSW: 62,  FRSTOR: 63,
                    FS:     64,  FST:    65,  FSTP:   66,  FSUB:   67,  FSUBR:  68,  GS:     69,  HLT:    70,  IDIV:   71,
                    IMUL:   72,  IN:     73,  INC:    74,  INS:    75,  INT:    76,  INT3:   77,  INTO:   78,  IRET:   79,
                    JBE:    80,  JC:     81,  JCXZ:   82,  JG:     83,  JGE:    84,  JL:     85,  JLE:    86,  JMP:    87,
                    JA:     88,  JNC:    89,  JNO:    90,  JNP:    91,  JNS:    92,  JNZ:    93,  JO:     94,  JP:     95,
                    JS:     96,  JZ:     97,  LAHF:   98,  LAR:    99,  LDS:    100, LEA:    101, LEAVE:  102, LES:    103,
                    LFS:    104, LGDT:   105, LGS:    106, LIDT:   107, LLDT:   108, LMSW:   109, LOADALL:110, LOCK:   111,
                    LODSB:  112, LODSW:  113, LOOP:   114, LOOPNZ: 115, LOOPZ:  116, LSL:    117, LSS:    118, LTR:    119,
                    MOV:    120, MOVSB:  121, MOVSW:  122, MOVSX:  123, MOVZX:  124, MUL:    125, NEG:    126, NOP:    127,
                    NOT:    128, OR:     129, OS:     130, OUT:    131, OUTS:   132, POP:    133, POPA:   134, POPF:   135,
                    PUSH:   136, PUSHA:  137, PUSHF:  138, RCL:    139, RCR:    140, REPNZ:  141, REPZ:   142, RET:    143,
                    RETF:   144, ROL:    145, ROR:    146, SAHF:   147, SALC:   148, SAR:    149, SBB:    150, SCASB:  151,
                    SCASW:  152, SETBE:  153, SETC:   154, SETG:   155, SETGE:  156, SETL:   157, SETLE:  158, SETNBE: 159,
                    SETNC:  160, SETNO:  161, SETNP:  162, SETNS:  163, SETNZ:  164, SETO:   165, SETP:   166, SETS:   167,
                    SETZ:   168, SGDT:   169, SHL:    170, SHLD:   171, SHR:    172, SHRD:   173, SIDT:   174, SLDT:   175,
                    SMSW:   176, SS:     177, STC:    178, STD:    179, STI:    180, STOSB:  181, STOSW:  182, STR:    183,
                    SUB:    184, TEST:   185, VERR:   186, VERW:   187, WAIT:   188, XCHG:   189, XLAT:   190, XOR:    191,
                    GRP1B:  192, GRP1W:  193, GRP1SW: 194, GRP2B:  195, GRP2W:  196, GRP2B1: 197, GRP2W1: 198, GRP2BC: 199,
                    GRP2WC: 200, GRP3B:  201, GRP3W:  202, GRP4B:  203, GRP4W:  204, OP0F:   205, GRP6:   206, GRP7:   207,
                    GRP8:   208
                };
            
                /*
                 * Instruction names (mnemonics), indexed by instruction ordinal (above)
                 */
                Debugger.INS_NAMES = [
                    "INVALID","AAA",    "AAD",    "AAM",    "AAS",    "ADC",    "ADD",    "AND",
                    "ARPL",   "AS:",    "BOUND",  "BSF",    "BSR",    "BT",     "BTC",    "BTR",
                    "BTS",    "CALL",   "CBW",    "CLC",    "CLD",    "CLI",    "CLTS",   "CMC",
                    "CMP",    "CMPSB",  "CMPSW",  "CS:",    "CWD",    "DAA",    "DAS",    "DEC",
                    "DIV",    "DS:",    "ENTER",  "ES:",    "ESC",    "FADD",   "FBLD",   "FBSTP",
                    "FCOM",   "FCOMP",  "FDIV",   "FDIVR",  "FIADD",  "FICOM",  "FICOMP", "FIDIV",
                    "FIDIVR", "FILD",   "FIMUL",  "FIST",   "FISTP",  "FISUB",  "FISUBR", "FLD",
                    "FLDCW",  "FLDENV", "FMUL",   "FNSAVE", "FNSTCW", "FNSTENV","FNSTSW", "FRSTOR",
                    "FS:",    "FST",    "FSTP",   "FSUB",   "FSUBR",  "GS:",    "HLT",    "IDIV",
                    "IMUL",   "IN",     "INC",    "INS",    "INT",    "INT3",   "INTO",   "IRET",
                    "JBE",    "JC",     "JCXZ",   "JG",     "JGE",    "JL",     "JLE",    "JMP",
                    "JA",     "JNC",    "JNO",    "JNP",    "JNS",    "JNZ",    "JO",     "JP",
                    "JS",     "JZ",     "LAHF",   "LAR",    "LDS",    "LEA",    "LEAVE",  "LES",
                    "LFS",    "LGDT",   "LGS",    "LIDT",   "LLDT",   "LMSW",   "LOADALL","LOCK",
                    "LODSB",  "LODSW",  "LOOP",   "LOOPNZ", "LOOPZ",  "LSL",    "LSS",    "LTR",
                    "MOV",    "MOVSB",  "MOVSW",  "MOVSX",  "MOVZX",  "MUL",    "NEG",    "NOP",
                    "NOT",    "OR",     "OS:",    "OUT",    "OUTS",   "POP",    "POPA",   "POPF",
                    "PUSH",   "PUSHA",  "PUSHF",  "RCL",    "RCR",    "REPNZ",  "REPZ",   "RET",
                    "RETF",   "ROL",    "ROR",    "SAHF",   "SALC",   "SAR",    "SBB",    "SCASB",
                    "SCASW",  "SETBE",  "SETC",   "SETG",   "SETGE",  "SETL",   "SETLE",  "SETNBE",
                    "SETNC",  "SETNO",  "SETNP",  "SETNS",  "SETNZ",  "SETO",   "SETP",   "SETS",
                    "SETZ",   "SGDT",   "SHL",    "SHLD",   "SHR",    "SHRD",   "SIDT",   "SLDT",
                    "SMSW",   "SS:",    "STC",    "STD",    "STI",    "STOSB",  "STOSW",  "STR",
                    "SUB",    "TEST",   "VERR",   "VERW",   "WAIT",   "XCHG",   "XLAT",   "XOR"
                ];
            
                Debugger.CPU_8086  = 0;
                Debugger.CPU_80186 = 1;
                Debugger.CPU_80286 = 2;
                Debugger.CPU_80386 = 3;
                Debugger.CPUS = [8086, 80186, 80286, 80386];
            
                /*
                 * ModRM masks and definitions
                 */
                Debugger.REG_AL  = 0x00;             // bits 0-2 are standard Reg encodings
                Debugger.REG_CL  = 0x01;
                Debugger.REG_DL  = 0x02;
                Debugger.REG_BL  = 0x03;
                Debugger.REG_AH  = 0x04;
                Debugger.REG_CH  = 0x05;
                Debugger.REG_DH  = 0x06;
                Debugger.REG_BH  = 0x07;
                Debugger.REG_AX  = 0x08;
                Debugger.REG_CX  = 0x09;
                Debugger.REG_DX  = 0x0A;
                Debugger.REG_BX  = 0x0B;
                Debugger.REG_SP  = 0x0C;
                Debugger.REG_BP  = 0x0D;
                Debugger.REG_SI  = 0x0E;
                Debugger.REG_DI  = 0x0F;
                Debugger.REG_SEG = 0x10;
                Debugger.REG_IP  = 0x16;
                Debugger.REG_PS  = 0x17;
                Debugger.REG_EAX = 0x18;
                Debugger.REG_ECX = 0x19;
                Debugger.REG_EDX = 0x1A;
                Debugger.REG_EBX = 0x1B;
                Debugger.REG_ESP = 0x1C;
                Debugger.REG_EBP = 0x1D;
                Debugger.REG_ESI = 0x1E;
                Debugger.REG_EDI = 0x1F;
                Debugger.REG_CR0 = 0x20;
                Debugger.REG_CR1 = 0x21;
                Debugger.REG_CR2 = 0x22;
                Debugger.REG_CR3 = 0x23;
            
                Debugger.REGS = [
                    "AL",  "CL",  "DL",  "BL",  "AH",  "CH",  "DH",  "BH",
                    "AX",  "CX",  "DX",  "BX",  "SP",  "BP",  "SI",  "DI",
                    "ES",  "CS",  "SS",  "DS",  "FS",  "GS",  "IP",  "PS",
                    "EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI",
                    "CR0", "CR1", "CR2", "CR3"
                ];
            
                Debugger.REG_ES         = 0x00;     // bits 0-1 are standard SegReg encodings
                Debugger.REG_CS         = 0x01;
                Debugger.REG_SS         = 0x02;
                Debugger.REG_DS         = 0x03;
                Debugger.REG_FS         = 0x04;
                Debugger.REG_GS         = 0x05;
                Debugger.REG_UNKNOWN    = 0x00;
            
                Debugger.MOD_NODISP     = 0x00;     // use RM below, no displacement
                Debugger.MOD_DISP8      = 0x01;     // use RM below + 8-bit displacement
                Debugger.MOD_DISP16     = 0x02;     // use RM below + 16-bit displacement
                Debugger.MOD_REGISTER   = 0x03;     // use REG above
            
                Debugger.RM_BXSI        = 0x00;
                Debugger.RM_BXDI        = 0x01;
                Debugger.RM_BPSI        = 0x02;
                Debugger.RM_BPDI        = 0x03;
                Debugger.RM_SI          = 0x04;
                Debugger.RM_DI          = 0x05;
                Debugger.RM_BP          = 0x06;
                Debugger.RM_IMMOFF      = Debugger.RM_BP;       // only if MOD_NODISP
                Debugger.RM_BX          = 0x07;
            
                Debugger.RMS = [
                    "BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI",    "DI",    "BP",    "BX",
                    "EAX",   "ECX",   "EDX",   "EBX",   "ESP",   "EBP",   "ESI",   "EDI"
                ];
            
                /*
                 * Operand type descriptor masks and definitions
                 *
                 * Note that the letters in () in the comments refer to Intel's
                 * nomenclature used in Appendix A of the 80386 Programmers Reference Manual.
                 */
                Debugger.TYPE_SIZE      = 0x000F;   // size field
                Debugger.TYPE_MODE      = 0x00F0;   // mode field
                Debugger.TYPE_IREG      = 0x0F00;   // implied register field
                Debugger.TYPE_OTHER     = 0xF000;   // "other" field
            
                /*
                 * TYPE_SIZE values.  Some of the values (eg, TYPE_WORDIB and TYPE_WORDIW)
                 * imply the presence of a third operand, for those weird cases....
                 */
                Debugger.TYPE_NONE      = 0x0000;   //     (all other TYPE fields ignored)
                Debugger.TYPE_BYTE      = 0x0001;   // (b) byte, regardless of operand size
                Debugger.TYPE_SBYTE     = 0x0002;   //     byte sign-extended to word
                Debugger.TYPE_WORD      = 0x0003;   // (w) word, regardless...
                Debugger.TYPE_VWORD     = 0x0004;   // (v) word or double-word, depending...
                Debugger.TYPE_DWORD     = 0x0005;   // (d) double-word, regardless...
                Debugger.TYPE_SEGP      = 0x0006;   // (p) 32-bit or 48-bit pointer
                Debugger.TYPE_FARP      = 0x0007;   // (p) 32-bit or 48-bit pointer for JMP/CALL
                Debugger.TYPE_2WORD     = 0x0008;   // (a) two memory operands (BOUND only)
                Debugger.TYPE_DESC      = 0x0009;   // (s) 6 byte pseudo-descriptor
                Debugger.TYPE_WORDIB    = 0x000A;   //     two source operands (eg, IMUL)
                Debugger.TYPE_WORDIW    = 0x000B;   //     two source operands (eg, IMUL)
                Debugger.TYPE_PREFIX    = 0x000F;   //     (treat similarly to TYPE_NONE)
            
                /*
                 * TYPE_MODE values.  Order is somewhat important, as all values implying
                 * the presence of a ModRM byte are assumed to be >= TYPE_MODRM.
                 */
                Debugger.TYPE_IMM       = 0x0000;   // (I) immediate data
                Debugger.TYPE_ONE       = 0x0010;   //     implicit 1 (eg, shifts/rotates)
                Debugger.TYPE_IMMOFF    = 0x0020;   // (A) immediate offset
                Debugger.TYPE_IMMREL    = 0x0030;   // (J) immediate relative
                Debugger.TYPE_DSSI      = 0x0040;   // (X) memory addressed by DS:SI
                Debugger.TYPE_ESDI      = 0x0050;   // (Y) memory addressed by ES:DI
                Debugger.TYPE_IMPREG    = 0x0060;   //     implicit register in TYPE_IREG
                Debugger.TYPE_IMPSEG    = 0x0070;   //     implicit segment register in TYPE_IREG
                Debugger.TYPE_MODRM     = 0x0080;   // (E) standard ModRM decoding
                Debugger.TYPE_MEM       = 0x0090;   // (M) ModRM refers to memory only
                Debugger.TYPE_REG       = 0x00A0;   // (G) standard Reg decoding
                Debugger.TYPE_SEGREG    = 0x00B0;   // (S) Reg selects segment register
                Debugger.TYPE_MODREG    = 0x00C0;   // (R) Mod refers to register only
                Debugger.TYPE_CTLREG    = 0x00D0;   // (C) Reg selects control register
                Debugger.TYPE_DBGREG    = 0x00E0;   // (D) Reg selects debug register
                Debugger.TYPE_TSTREG    = 0x00F0;   // (T) Reg selects test register
            
                /*
                 * TYPE_IREG values, based on the REG_* constants.
                 * For convenience, they include TYPE_IMPREG or TYPE_IMPSEG as appropriate.
                 */
                Debugger.TYPE_AL = (Debugger.REG_AL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_CL = (Debugger.REG_CL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_DL = (Debugger.REG_DL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_BL = (Debugger.REG_BL << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_AH = (Debugger.REG_AH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_CH = (Debugger.REG_CH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_DH = (Debugger.REG_DH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_BH = (Debugger.REG_BH << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_BYTE);
                Debugger.TYPE_AX = (Debugger.REG_AX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_CX = (Debugger.REG_CX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_DX = (Debugger.REG_DX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_BX = (Debugger.REG_BX << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_SP = (Debugger.REG_SP << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_BP = (Debugger.REG_BP << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_SI = (Debugger.REG_SI << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_DI = (Debugger.REG_DI << 8 | Debugger.TYPE_IMPREG | Debugger.TYPE_VWORD);
                Debugger.TYPE_ES = (Debugger.REG_ES << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                Debugger.TYPE_CS = (Debugger.REG_CS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                Debugger.TYPE_SS = (Debugger.REG_SS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                Debugger.TYPE_DS = (Debugger.REG_DS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                Debugger.TYPE_FS = (Debugger.REG_FS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
                Debugger.TYPE_GS = (Debugger.REG_GS << 8 | Debugger.TYPE_IMPSEG | Debugger.TYPE_WORD);
            
                /*
                 * TYPE_OTHER bit definitions
                 */
                Debugger.TYPE_IN    = 0x1000;        // operand is input
                Debugger.TYPE_OUT   = 0x2000;        // operand is output
                Debugger.TYPE_BOTH  = (Debugger.TYPE_IN | Debugger.TYPE_OUT);
                Debugger.TYPE_8086  = (Debugger.CPU_8086 << 14);
                Debugger.TYPE_80186 = (Debugger.CPU_80186 << 14);
                Debugger.TYPE_80286 = (Debugger.CPU_80286 << 14);
                Debugger.TYPE_80386 = (Debugger.CPU_80386 << 14);
                Debugger.TYPE_CPU_SHIFT = 14;
            
                /*
                 * Message categories supported by the messageEnabled() function and other assorted message
                 * functions. Each category has a corresponding bit value that can be combined (ie, OR'ed) as
                 * needed.  The Debugger's message command ("m") is used to turn message categories on and off,
                 * like so:
                 *
                 *      m port on
                 *      m port off
                 *      ...
                 *
                 * NOTE: The order of these categories can be rearranged, alphabetized, etc, as desired; just be
                 * aware that changing the bit values could break saved Debugger states (not a huge concern, just
                 * something to be aware of).
                 */
                Debugger.MESSAGES = {
                    "cpu":      Messages.CPU,
                    "seg":      Messages.SEG,
                    "desc":     Messages.DESC,
                    "tss":      Messages.TSS,
                    "int":      Messages.INT,
                    "fault":    Messages.FAULT,
                    "bus":      Messages.BUS,
                    "mem":      Messages.MEM,
                    "port":     Messages.PORT,
                    "dma":      Messages.DMA,
                    "pic":      Messages.PIC,
                    "timer":    Messages.TIMER,
                    "cmos":     Messages.CMOS,
                    "rtc":      Messages.RTC,
                    "8042":     Messages.C8042,
                    "chipset":  Messages.CHIPSET,   // ie, anything else in ChipSet besides DMA, PIC, TIMER, CMOS, RTC and 8042
                    "keyboard": Messages.KEYBOARD,
                    "key":      Messages.KEYS,      // using "keys" instead of "key" causes an unfortunate JavaScript property collision
                    "video":    Messages.VIDEO,
                    "fdc":      Messages.FDC,
                    "hdc":      Messages.HDC,
                    "disk":     Messages.DISK,
                    "serial":   Messages.SERIAL,
                    "speaker":  Messages.SPEAKER,
                    "state":    Messages.STATE,
                    "mouse":    Messages.MOUSE,
                    "computer": Messages.COMPUTER,
                    "dos":      Messages.DOS,
                    "data":     Messages.DATA,
                    "log":      Messages.LOG,
                    "warn":     Messages.WARN,
                    /*
                     * Now we turn to message actions rather than message types; for example, setting "halt"
                     * on or off doesn't enable "halt" messages, but rather halts the CPU on any message above.
                     */
                    "halt":     Messages.HALT
                };
            
                /*
                 * Instruction trace categories supported by the traceLog() function.  The Debugger's info
                 * command ("n") is used to turn trace categories on and off, like so:
                 *
                 *      n shl on
                 *      n shl off
                 *      ...
                 *
                 * Note that there are usually multiple entries for each category (one for each supported operand size);
                 * all matching entries are enabled or disabled as a group.
                 */
                Debugger.TRACE = {
                    ROLB:   {ins: Debugger.INS.ROL,  size: 8},
                    ROLW:   {ins: Debugger.INS.ROL,  size: 16},
                    RORB:   {ins: Debugger.INS.ROR,  size: 8},
                    RORW:   {ins: Debugger.INS.ROR,  size: 16},
                    RCLB:   {ins: Debugger.INS.RCL,  size: 8},
                    RCLW:   {ins: Debugger.INS.RCL,  size: 16},
                    RCRB:   {ins: Debugger.INS.RCR,  size: 8},
                    RCRW:   {ins: Debugger.INS.RCR,  size: 16},
                    SHLB:   {ins: Debugger.INS.SHL,  size: 8},
                    SHLW:   {ins: Debugger.INS.SHL,  size: 16},
                    MULB:   {ins: Debugger.INS.MUL,  size: 16}, // dst is 8-bit (AL), src is 8-bit (operand), result is 16-bit (AH:AL)
                    IMULB:  {ins: Debugger.INS.IMUL, size: 16}, // dst is 8-bit (AL), src is 8-bit (operand), result is 16-bit (AH:AL)
                    DIVB:   {ins: Debugger.INS.DIV,  size: 16}, // dst is 16-bit (AX), src is 8-bit (operand), result is 16-bit (AH:AL, remainder:quotient)
                    IDIVB:  {ins: Debugger.INS.IDIV, size: 16}, // dst is 16-bit (AX), src is 8-bit (operand), result is 16-bit (AH:AL, remainder:quotient)
                    MULW:   {ins: Debugger.INS.MUL,  size: 32}, // dst is 16-bit (AX), src is 16-bit (operand), result is 32-bit (DX:AX)
                    IMULW:  {ins: Debugger.INS.IMUL, size: 32}, // dst is 16-bit (AX), src is 16-bit (operand), result is 32-bit (DX:AX)
                    DIVW:   {ins: Debugger.INS.DIV,  size: 32}, // dst is 32-bit (DX:AX), src is 16-bit (operand), result is 32-bit (DX:AX, remainder:quotient)
                    IDIVW:  {ins: Debugger.INS.IDIV, size: 32}  // dst is 32-bit (DX:AX), src is 16-bit (operand), result is 32-bit (DX:AX, remainder:quotient)
                };
            
                Debugger.TRACE_LIMIT = 100000;
            
                /*
                 * Opcode 0x0F has a distinguished history:
                 *
                 *      On the 8086, it functioned as POP CS
                 *      On the 80186, it generated an Invalid Opcode (UD_FAULT) exception
                 *      On the 80286, it introduced a new (and growing) series of two-byte opcodes
                 *
                 * Based on the active CPU model, we make every effort to execute and disassemble this (and every other)
                 * opcode appropriately, by setting the opcode's entry in aaOpDescs accordingly.  0x0F in aaOpDescs points
                 * to the 8086 table: aOpDescPopCS.
                 *
                 * Note that we must NOT modify aaOpDescs directly.  this.aaOpDescs will point to Debugger.aaOpDescs
                 * if the processor is an 8086, because that's the processor that the hard-coded contents of the table
                 * represent; for all other processors, this.aaOpDescs will contain a copy of the table that we can modify.
                 */
                Debugger.aOpDescPopCS     = [Debugger.INS.POP,  Debugger.TYPE_CS   | Debugger.TYPE_OUT];
                Debugger.aOpDescUndefined = [Debugger.INS.NONE, Debugger.TYPE_NONE];
                Debugger.aOpDesc0F        = [Debugger.INS.OP0F, Debugger.TYPE_WORD | Debugger.TYPE_BOTH];
            
                /*
                 * The aaOpDescs array is indexed by opcode, and each element is a sub-array (aOpDesc) that describes
                 * the corresponding opcode. The sub-elements are as follows:
                 *
                 *      [0]: {number} of the opcode name (see INS.*)
                 *      [1]: {number} containing the destination operand descriptor bit(s), if any
                 *      [2]: {number} containing the source operand descriptor bit(s), if any
                 *      [3]: {number} containing the occasional third operand descriptor bit(s), if any
                 *
                 * These sub-elements are all optional. If [0] is not present, the opcode is undefined; if [1] is not
                 * present (or contains zero), the opcode has no (or only implied) operands; if [2] is not present, the
                 * opcode has only a single operand.  And so on.
                 */
                Debugger.aaOpDescs = [
                /* 0x00 */ [Debugger.INS.ADD,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x01 */ [Debugger.INS.ADD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x02 */ [Debugger.INS.ADD,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x03 */ [Debugger.INS.ADD,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x04 */ [Debugger.INS.ADD,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x05 */ [Debugger.INS.ADD,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x06 */ [Debugger.INS.PUSH,  Debugger.TYPE_ES     | Debugger.TYPE_IN],
                /* 0x07 */ [Debugger.INS.POP,   Debugger.TYPE_ES     | Debugger.TYPE_OUT],
            
                /* 0x08 */ [Debugger.INS.OR,    Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x09 */ [Debugger.INS.OR,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x0A */ [Debugger.INS.OR,    Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x0B */ [Debugger.INS.OR,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x0C */ [Debugger.INS.OR,    Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x0D */ [Debugger.INS.OR,    Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x0E */ [Debugger.INS.PUSH,  Debugger.TYPE_CS     | Debugger.TYPE_IN],
                /* 0x0F */ Debugger.aOpDescPopCS,
            
                /* 0x10 */ [Debugger.INS.ADC,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x11 */ [Debugger.INS.ADC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x12 */ [Debugger.INS.ADC,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x13 */ [Debugger.INS.ADC,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x14 */ [Debugger.INS.ADC,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x15 */ [Debugger.INS.ADC,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x16 */ [Debugger.INS.PUSH,  Debugger.TYPE_SS     | Debugger.TYPE_IN],
                /* 0x17 */ [Debugger.INS.POP,   Debugger.TYPE_SS     | Debugger.TYPE_OUT],
            
                /* 0x18 */ [Debugger.INS.SBB,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x19 */ [Debugger.INS.SBB,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x1A */ [Debugger.INS.SBB,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x1B */ [Debugger.INS.SBB,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x1C */ [Debugger.INS.SBB,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x1D */ [Debugger.INS.SBB,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x1E */ [Debugger.INS.PUSH,  Debugger.TYPE_DS     | Debugger.TYPE_IN],
                /* 0x1F */ [Debugger.INS.POP,   Debugger.TYPE_DS     | Debugger.TYPE_OUT],
            
                /* 0x20 */ [Debugger.INS.AND,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x21 */ [Debugger.INS.AND,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x22 */ [Debugger.INS.AND,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x23 */ [Debugger.INS.AND,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x24 */ [Debugger.INS.AND,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x25 */ [Debugger.INS.AND,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x26 */ [Debugger.INS.ES,    Debugger.TYPE_PREFIX],
                /* 0x27 */ [Debugger.INS.DAA],
            
                /* 0x28 */ [Debugger.INS.SUB,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x29 */ [Debugger.INS.SUB,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x2A */ [Debugger.INS.SUB,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x2B */ [Debugger.INS.SUB,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x2C */ [Debugger.INS.SUB,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x2D */ [Debugger.INS.SUB,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x2E */ [Debugger.INS.CS,    Debugger.TYPE_PREFIX],
                /* 0x2F */ [Debugger.INS.DAS],
            
                /* 0x30 */ [Debugger.INS.XOR,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x31 */ [Debugger.INS.XOR,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x32 */ [Debugger.INS.XOR,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x33 */ [Debugger.INS.XOR,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x34 */ [Debugger.INS.XOR,   Debugger.TYPE_AL     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x35 */ [Debugger.INS.XOR,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x36 */ [Debugger.INS.SS,    Debugger.TYPE_PREFIX],
                /* 0x37 */ [Debugger.INS.AAA],
            
                /* 0x38 */ [Debugger.INS.CMP,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x39 */ [Debugger.INS.CMP,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x3A */ [Debugger.INS.CMP,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x3B */ [Debugger.INS.CMP,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x3C */ [Debugger.INS.CMP,   Debugger.TYPE_AL     | Debugger.TYPE_IN,     Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x3D */ [Debugger.INS.CMP,   Debugger.TYPE_AX     | Debugger.TYPE_IN,     Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x3E */ [Debugger.INS.DS,    Debugger.TYPE_PREFIX],
                /* 0x3F */ [Debugger.INS.AAS],
            
                /* 0x40 */ [Debugger.INS.INC,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH],
                /* 0x41 */ [Debugger.INS.INC,   Debugger.TYPE_CX     | Debugger.TYPE_BOTH],
                /* 0x42 */ [Debugger.INS.INC,   Debugger.TYPE_DX     | Debugger.TYPE_BOTH],
                /* 0x43 */ [Debugger.INS.INC,   Debugger.TYPE_BX     | Debugger.TYPE_BOTH],
                /* 0x44 */ [Debugger.INS.INC,   Debugger.TYPE_SP     | Debugger.TYPE_BOTH],
                /* 0x45 */ [Debugger.INS.INC,   Debugger.TYPE_BP     | Debugger.TYPE_BOTH],
                /* 0x46 */ [Debugger.INS.INC,   Debugger.TYPE_SI     | Debugger.TYPE_BOTH],
                /* 0x47 */ [Debugger.INS.INC,   Debugger.TYPE_DI     | Debugger.TYPE_BOTH],
            
                /* 0x48 */ [Debugger.INS.DEC,   Debugger.TYPE_AX     | Debugger.TYPE_BOTH],
                /* 0x49 */ [Debugger.INS.DEC,   Debugger.TYPE_CX     | Debugger.TYPE_BOTH],
                /* 0x4A */ [Debugger.INS.DEC,   Debugger.TYPE_DX     | Debugger.TYPE_BOTH],
                /* 0x4B */ [Debugger.INS.DEC,   Debugger.TYPE_BX     | Debugger.TYPE_BOTH],
                /* 0x4C */ [Debugger.INS.DEC,   Debugger.TYPE_SP     | Debugger.TYPE_BOTH],
                /* 0x4D */ [Debugger.INS.DEC,   Debugger.TYPE_BP     | Debugger.TYPE_BOTH],
                /* 0x4E */ [Debugger.INS.DEC,   Debugger.TYPE_SI     | Debugger.TYPE_BOTH],
                /* 0x4F */ [Debugger.INS.DEC,   Debugger.TYPE_DI     | Debugger.TYPE_BOTH],
            
                /* 0x50 */ [Debugger.INS.PUSH,  Debugger.TYPE_AX     | Debugger.TYPE_IN],
                /* 0x51 */ [Debugger.INS.PUSH,  Debugger.TYPE_CX     | Debugger.TYPE_IN],
                /* 0x52 */ [Debugger.INS.PUSH,  Debugger.TYPE_DX     | Debugger.TYPE_IN],
                /* 0x53 */ [Debugger.INS.PUSH,  Debugger.TYPE_BX     | Debugger.TYPE_IN],
                /* 0x54 */ [Debugger.INS.PUSH,  Debugger.TYPE_SP     | Debugger.TYPE_IN],
                /* 0x55 */ [Debugger.INS.PUSH,  Debugger.TYPE_BP     | Debugger.TYPE_IN],
                /* 0x56 */ [Debugger.INS.PUSH,  Debugger.TYPE_SI     | Debugger.TYPE_IN],
                /* 0x57 */ [Debugger.INS.PUSH,  Debugger.TYPE_DI     | Debugger.TYPE_IN],
            
                /* 0x58 */ [Debugger.INS.POP,   Debugger.TYPE_AX     | Debugger.TYPE_OUT],
                /* 0x59 */ [Debugger.INS.POP,   Debugger.TYPE_CX     | Debugger.TYPE_OUT],
                /* 0x5A */ [Debugger.INS.POP,   Debugger.TYPE_DX     | Debugger.TYPE_OUT],
                /* 0x5B */ [Debugger.INS.POP,   Debugger.TYPE_BX     | Debugger.TYPE_OUT],
                /* 0x5C */ [Debugger.INS.POP,   Debugger.TYPE_SP     | Debugger.TYPE_OUT],
                /* 0x5D */ [Debugger.INS.POP,   Debugger.TYPE_BP     | Debugger.TYPE_OUT],
                /* 0x5E */ [Debugger.INS.POP,   Debugger.TYPE_SI     | Debugger.TYPE_OUT],
                /* 0x5F */ [Debugger.INS.POP,   Debugger.TYPE_DI     | Debugger.TYPE_OUT],
            
                /* 0x60 */ [Debugger.INS.PUSHA, Debugger.TYPE_NONE   | Debugger.TYPE_80286],
                /* 0x61 */ [Debugger.INS.POPA,  Debugger.TYPE_NONE   | Debugger.TYPE_80286],
                /* 0x62 */ [Debugger.INS.BOUND, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80286, Debugger.TYPE_MODRM | Debugger.TYPE_2WORD | Debugger.TYPE_IN],
                /* 0x63 */ [Debugger.INS.ARPL,  Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_OUT,                        Debugger.TYPE_REG   | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                /* 0x64 */ [Debugger.INS.FS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
                /* 0x65 */ [Debugger.INS.GS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
                /* 0x66 */ [Debugger.INS.OS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
                /* 0x67 */ [Debugger.INS.AS,    Debugger.TYPE_PREFIX | Debugger.TYPE_80386],
            
                /* 0x68 */ [Debugger.INS.PUSH,  Debugger.TYPE_IMM    | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80286],
                /* 0x69 */ [Debugger.INS.IMUL,  Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH | Debugger.TYPE_80286,   Debugger.TYPE_MODRM | Debugger.TYPE_WORDIW | Debugger.TYPE_IN],
                /* 0x6A */ [Debugger.INS.PUSH,  Debugger.TYPE_IMM    | Debugger.TYPE_SBYTE | Debugger.TYPE_IN   | Debugger.TYPE_80286],
                /* 0x6B */ [Debugger.INS.IMUL,  Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH | Debugger.TYPE_80286,   Debugger.TYPE_MODRM | Debugger.TYPE_WORDIB | Debugger.TYPE_IN],
                /* 0x6C */ [Debugger.INS.INS,   Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80286,   Debugger.TYPE_DX    | Debugger.TYPE_IN],
                /* 0x6D */ [Debugger.INS.INS,   Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80286,   Debugger.TYPE_DX    | Debugger.TYPE_IN],
                /* 0x6E */ [Debugger.INS.OUTS,  Debugger.TYPE_DX     | Debugger.TYPE_IN    | Debugger.TYPE_80286,   Debugger.TYPE_DSSI | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x6F */ [Debugger.INS.OUTS,  Debugger.TYPE_DX     | Debugger.TYPE_IN    | Debugger.TYPE_80286,   Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
            
                /* 0x70 */ [Debugger.INS.JO,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x71 */ [Debugger.INS.JNO,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x72 */ [Debugger.INS.JC,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x73 */ [Debugger.INS.JNC,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x74 */ [Debugger.INS.JZ,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x75 */ [Debugger.INS.JNZ,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x76 */ [Debugger.INS.JBE,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x77 */ [Debugger.INS.JA,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
            
                /* 0x78 */ [Debugger.INS.JS,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x79 */ [Debugger.INS.JNS,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x7A */ [Debugger.INS.JP,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x7B */ [Debugger.INS.JNP,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x7C */ [Debugger.INS.JL,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x7D */ [Debugger.INS.JGE,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x7E */ [Debugger.INS.JLE,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x7F */ [Debugger.INS.JG,    Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
            
                /* 0x80 */ [Debugger.INS.GRP1B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x81 */ [Debugger.INS.GRP1W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x82 */ [Debugger.INS.GRP1B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x83 */ [Debugger.INS.GRP1SW,Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x84 */ [Debugger.INS.TEST,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x85 */ [Debugger.INS.TEST,  Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_REG   | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x86 */ [Debugger.INS.XCHG,  Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                /* 0x87 */ [Debugger.INS.XCHG,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
            
                /* 0x88 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,  Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x89 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x8A */ [Debugger.INS.MOV,   Debugger.TYPE_REG    | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0x8B */ [Debugger.INS.MOV,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x8C */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_SEGREG | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                /* 0x8D */ [Debugger.INS.LEA,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,  Debugger.TYPE_MEM    | Debugger.TYPE_VWORD],
                /* 0x8E */ [Debugger.INS.MOV,   Debugger.TYPE_SEGREG | Debugger.TYPE_WORD  | Debugger.TYPE_OUT,  Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0x8F */ [Debugger.INS.POP,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT],
            
                /* 0x90 */ [Debugger.INS.NOP],
                /* 0x91 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_CX | Debugger.TYPE_BOTH],
                /* 0x92 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_DX | Debugger.TYPE_BOTH],
                /* 0x93 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_BX | Debugger.TYPE_BOTH],
                /* 0x94 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_SP | Debugger.TYPE_BOTH],
                /* 0x95 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_BP | Debugger.TYPE_BOTH],
                /* 0x96 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_SI | Debugger.TYPE_BOTH],
                /* 0x97 */ [Debugger.INS.XCHG,  Debugger.TYPE_AX     | Debugger.TYPE_BOTH, Debugger.TYPE_DI | Debugger.TYPE_BOTH],
            
                /* 0x98 */ [Debugger.INS.CBW],
                /* 0x99 */ [Debugger.INS.CWD],
                /* 0x9A */ [Debugger.INS.CALL,  Debugger.TYPE_IMM    | Debugger.TYPE_FARP | Debugger.TYPE_IN],
                /* 0x9B */ [Debugger.INS.WAIT],
                /* 0x9C */ [Debugger.INS.PUSHF],
                /* 0x9D */ [Debugger.INS.POPF],
                /* 0x9E */ [Debugger.INS.SAHF],
                /* 0x9F */ [Debugger.INS.LAHF],
            
                /* 0xA0 */ [Debugger.INS.MOV,   Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_IMMOFF | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xA1 */ [Debugger.INS.MOV,   Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_IMMOFF | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xA2 */ [Debugger.INS.MOV,   Debugger.TYPE_IMMOFF | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,     Debugger.TYPE_AL    | Debugger.TYPE_IN],
                /* 0xA3 */ [Debugger.INS.MOV,   Debugger.TYPE_IMMOFF | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,     Debugger.TYPE_AX    | Debugger.TYPE_IN],
                /* 0xA4 */ [Debugger.INS.MOVSB, Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,     Debugger.TYPE_DSSI  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xA5 */ [Debugger.INS.MOVSW, Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,     Debugger.TYPE_DSSI  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xA6 */ [Debugger.INS.CMPSB, Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,      Debugger.TYPE_DSSI  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xA7 */ [Debugger.INS.CMPSW, Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_IN,      Debugger.TYPE_DSSI  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
            
                /* 0xA8 */ [Debugger.INS.TEST,  Debugger.TYPE_AL     | Debugger.TYPE_IN,     Debugger.TYPE_IMM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xA9 */ [Debugger.INS.TEST,  Debugger.TYPE_AX     | Debugger.TYPE_IN,     Debugger.TYPE_IMM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xAA */ [Debugger.INS.STOSB, Debugger.TYPE_ESDI   | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT,   Debugger.TYPE_AL    | Debugger.TYPE_IN],
                /* 0xAB */ [Debugger.INS.STOSW, Debugger.TYPE_ESDI   | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,   Debugger.TYPE_AX    | Debugger.TYPE_IN],
                /* 0xAC */ [Debugger.INS.LODSB, Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_DSSI | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xAD */ [Debugger.INS.LODSW, Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_DSSI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xAE */ [Debugger.INS.SCASB, Debugger.TYPE_AL     | Debugger.TYPE_IN,     Debugger.TYPE_ESDI | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xAF */ [Debugger.INS.SCASW, Debugger.TYPE_AX     | Debugger.TYPE_IN,     Debugger.TYPE_ESDI | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
            
                /* 0xB0 */ [Debugger.INS.MOV,   Debugger.TYPE_AL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB1 */ [Debugger.INS.MOV,   Debugger.TYPE_CL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB2 */ [Debugger.INS.MOV,   Debugger.TYPE_DL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB3 */ [Debugger.INS.MOV,   Debugger.TYPE_BL     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB4 */ [Debugger.INS.MOV,   Debugger.TYPE_AH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB5 */ [Debugger.INS.MOV,   Debugger.TYPE_CH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB6 */ [Debugger.INS.MOV,   Debugger.TYPE_DH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xB7 */ [Debugger.INS.MOV,   Debugger.TYPE_BH     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
            
                /* 0xB8 */ [Debugger.INS.MOV,   Debugger.TYPE_AX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xB9 */ [Debugger.INS.MOV,   Debugger.TYPE_CX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xBA */ [Debugger.INS.MOV,   Debugger.TYPE_DX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xBB */ [Debugger.INS.MOV,   Debugger.TYPE_BX     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xBC */ [Debugger.INS.MOV,   Debugger.TYPE_SP     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xBD */ [Debugger.INS.MOV,   Debugger.TYPE_BP     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xBE */ [Debugger.INS.MOV,   Debugger.TYPE_SI     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xBF */ [Debugger.INS.MOV,   Debugger.TYPE_DI     | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
            
                /* 0xC0 */ [Debugger.INS.GRP2B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH | Debugger.TYPE_80186, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xC1 */ [Debugger.INS.GRP2W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80186, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xC2 */ [Debugger.INS.RET,   Debugger.TYPE_IMM    | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                /* 0xC3 */ [Debugger.INS.RET],
                /* 0xC4 */ [Debugger.INS.LES,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                /* 0xC5 */ [Debugger.INS.LDS,   Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_MEM | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                /* 0xC6 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xC7 */ [Debugger.INS.MOV,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
            
                /* 0xC8 */ [Debugger.INS.ENTER, Debugger.TYPE_IMM    | Debugger.TYPE_WORD  | Debugger.TYPE_IN | Debugger.TYPE_80286,  Debugger.TYPE_IMM   | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xC9 */ [Debugger.INS.LEAVE, Debugger.TYPE_NONE   | Debugger.TYPE_80286],
                /* 0xCA */ [Debugger.INS.RETF,  Debugger.TYPE_IMM    | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                /* 0xCB */ [Debugger.INS.RETF],
                /* 0xCC */ [Debugger.INS.INT3],
                /* 0xCD */ [Debugger.INS.INT,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xCE */ [Debugger.INS.INTO],
                /* 0xCF */ [Debugger.INS.IRET],
            
                /* 0xD0 */ [Debugger.INS.GRP2B1,Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_ONE    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xD1 */ [Debugger.INS.GRP2W1,Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xD2 */ [Debugger.INS.GRP2BC,Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL |   Debugger.TYPE_IN],
                /* 0xD3 */ [Debugger.INS.GRP2WC,Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL |   Debugger.TYPE_IN],
                /* 0xD4 */ [Debugger.INS.AAM,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE],
                /* 0xD5 */ [Debugger.INS.AAD,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE],
                /* 0xD6 */ [Debugger.INS.SALC],
                /* 0xD7 */ [Debugger.INS.XLAT],
            
                /* 0xD8 */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xD9 */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xDA */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xDB */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xDC */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xDD */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xDE */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xDF */ [Debugger.INS.ESC,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
            
                /* 0xE0 */ [Debugger.INS.LOOPNZ,Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xE1 */ [Debugger.INS.LOOPZ, Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xE2 */ [Debugger.INS.LOOP,  Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xE3 */ [Debugger.INS.JCXZ,  Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xE4 */ [Debugger.INS.IN,    Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xE5 */ [Debugger.INS.IN,    Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                /* 0xE6 */ [Debugger.INS.OUT,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_AL   | Debugger.TYPE_IN],
                /* 0xE7 */ [Debugger.INS.OUT,   Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_AX   | Debugger.TYPE_IN],
            
                /* 0xE8 */ [Debugger.INS.CALL,  Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xE9 */ [Debugger.INS.JMP,   Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                /* 0xEA */ [Debugger.INS.JMP,   Debugger.TYPE_IMM    | Debugger.TYPE_FARP  | Debugger.TYPE_IN],
                /* 0xEB */ [Debugger.INS.JMP,   Debugger.TYPE_IMMREL | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                /* 0xEC */ [Debugger.INS.IN,    Debugger.TYPE_AL     | Debugger.TYPE_OUT,    Debugger.TYPE_DX | Debugger.TYPE_IN],
                /* 0xED */ [Debugger.INS.IN,    Debugger.TYPE_AX     | Debugger.TYPE_OUT,    Debugger.TYPE_DX | Debugger.TYPE_IN],
                /* 0xEE */ [Debugger.INS.OUT,   Debugger.TYPE_DX     | Debugger.TYPE_IN,     Debugger.TYPE_AL | Debugger.TYPE_IN],
                /* 0xEF */ [Debugger.INS.OUT,   Debugger.TYPE_DX     | Debugger.TYPE_IN,     Debugger.TYPE_AX | Debugger.TYPE_IN],
            
                /* 0xF0 */ [Debugger.INS.LOCK,  Debugger.TYPE_PREFIX],
                /* 0xF1 */ [Debugger.INS.NONE],
                /* 0xF2 */ [Debugger.INS.REPNZ, Debugger.TYPE_PREFIX],
                /* 0xF3 */ [Debugger.INS.REPZ,  Debugger.TYPE_PREFIX],
                /* 0xF4 */ [Debugger.INS.HLT],
                /* 0xF5 */ [Debugger.INS.CMC],
                /* 0xF6 */ [Debugger.INS.GRP3B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                /* 0xF7 */ [Debugger.INS.GRP3W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
            
                /* 0xF8 */ [Debugger.INS.CLC],
                /* 0xF9 */ [Debugger.INS.STC],
                /* 0xFA */ [Debugger.INS.CLI],
                /* 0xFB */ [Debugger.INS.STI],
                /* 0xFC */ [Debugger.INS.CLD],
                /* 0xFD */ [Debugger.INS.STD],
                /* 0xFE */ [Debugger.INS.GRP4B, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                /* 0xFF */ [Debugger.INS.GRP4W, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH]
                ];
            
                Debugger.aaOp0FDescs = {
                    0x00: [Debugger.INS.GRP6,   Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH],
                    0x01: [Debugger.INS.GRP7,   Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_BOTH],
                    0x02: [Debugger.INS.LAR,    Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_OUT  | Debugger.TYPE_80286, Debugger.TYPE_MEM    | Debugger.TYPE_WORD | Debugger.TYPE_IN],
                    0x03: [Debugger.INS.LSL,    Debugger.TYPE_REG    | Debugger.TYPE_WORD  | Debugger.TYPE_OUT  | Debugger.TYPE_80286, Debugger.TYPE_MEM    | Debugger.TYPE_WORD | Debugger.TYPE_IN],
                    0x05: [Debugger.INS.LOADALL,Debugger.TYPE_80286],
                    0x06: [Debugger.INS.CLTS,   Debugger.TYPE_80286],
                    0x20: [Debugger.INS.MOV,    Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_CTLREG | Debugger.TYPE_DWORD | Debugger.TYPE_IN],
                    0x22: [Debugger.INS.MOV,    Debugger.TYPE_CTLREG | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_IN],
                    0x80: [Debugger.INS.JO,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x81: [Debugger.INS.JNO,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x82: [Debugger.INS.JC,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x83: [Debugger.INS.JNC,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x84: [Debugger.INS.JZ,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x85: [Debugger.INS.JNZ,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x86: [Debugger.INS.JBE,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x87: [Debugger.INS.JA,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x88: [Debugger.INS.JS,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x89: [Debugger.INS.JNS,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x8A: [Debugger.INS.JP,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x8B: [Debugger.INS.JNP,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x8C: [Debugger.INS.JL,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x8D: [Debugger.INS.JGE,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x8E: [Debugger.INS.JLE,    Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x8F: [Debugger.INS.JG,     Debugger.TYPE_IMMREL | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386],
                    0x90: [Debugger.INS.SETO,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x91: [Debugger.INS.SETNO,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x92: [Debugger.INS.SETC,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x93: [Debugger.INS.SETNC,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x94: [Debugger.INS.SETZ,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x95: [Debugger.INS.SETNZ,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x96: [Debugger.INS.SETBE,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x97: [Debugger.INS.SETNBE, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x98: [Debugger.INS.SETS,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x99: [Debugger.INS.SETNS,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x9A: [Debugger.INS.SETP,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x9B: [Debugger.INS.SETNP,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x9C: [Debugger.INS.SETL,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x9D: [Debugger.INS.SETGE,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x9E: [Debugger.INS.SETLE,  Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0x9F: [Debugger.INS.SETG,   Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_OUT  | Debugger.TYPE_80386],
                    0xA0: [Debugger.INS.PUSH,   Debugger.TYPE_FS     | Debugger.TYPE_IN    | Debugger.TYPE_80386],
                    0xA1: [Debugger.INS.POP,    Debugger.TYPE_FS     | Debugger.TYPE_OUT   | Debugger.TYPE_80386],
                    0xA3: [Debugger.INS.BT,     Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN   | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xA4: [Debugger.INS.SHLD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    0xA5: [Debugger.INS.SHLD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMPREG | Debugger.TYPE_CL   | Debugger.TYPE_IN],
                    0xA8: [Debugger.INS.PUSH,   Debugger.TYPE_GS     | Debugger.TYPE_IN    | Debugger.TYPE_80386],
                    0xA9: [Debugger.INS.POP,    Debugger.TYPE_GS     | Debugger.TYPE_OUT   | Debugger.TYPE_80386],
                    0xAB: [Debugger.INS.BTS,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xAC: [Debugger.INS.SHRD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMM    | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    0xAD: [Debugger.INS.SHRD,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN, Debugger.TYPE_IMPREG | Debugger.TYPE_CL   | Debugger.TYPE_IN],
                    0xAF: [Debugger.INS.IMUL,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xB2: [Debugger.INS.LSS,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,                        Debugger.TYPE_MEM    | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                    0xB3: [Debugger.INS.BTR,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xB4: [Debugger.INS.LFS,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,                        Debugger.TYPE_MEM    | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                    0xB5: [Debugger.INS.LGS,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT,                        Debugger.TYPE_MEM    | Debugger.TYPE_SEGP  | Debugger.TYPE_IN],
                    0xB6: [Debugger.INS.MOVZX,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                    0xB7: [Debugger.INS.MOVZX,  Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_IN],
                    0xBA: [Debugger.INS.GRP8,   Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80386, Debugger.TYPE_IMM    | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                    0xBB: [Debugger.INS.BTC,    Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xBC: [Debugger.INS.BSF,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xBD: [Debugger.INS.BSR,    Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    0xBE: [Debugger.INS.MOVSX,  Debugger.TYPE_REG    | Debugger.TYPE_VWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                    0xBF: [Debugger.INS.MOVSX,  Debugger.TYPE_REG    | Debugger.TYPE_DWORD | Debugger.TYPE_OUT  | Debugger.TYPE_80386, Debugger.TYPE_MODRM  | Debugger.TYPE_WORD  | Debugger.TYPE_IN]
                };
            
                Debugger.aaGrpDescs = [
                  [
                    /* GRP1B */
                    [Debugger.INS.ADD,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.OR,   Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.ADC,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SBB,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.AND,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SUB,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.XOR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.CMP,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP1W */
                    [Debugger.INS.ADD,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.OR,   Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.ADC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.SBB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.AND,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.SUB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.XOR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.CMP,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP1SW */
                    [Debugger.INS.ADD,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.OR,   Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.ADC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SBB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.AND,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SUB,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.XOR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN],
                    [Debugger.INS.CMP,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_SBYTE | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP2B */
                    [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP2W */
                    [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH | Debugger.TYPE_80286, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP2B1 */
                    [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP2W1 */
                    [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_ONE | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP2BC */
                    [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP2WC */
                    [Debugger.INS.ROL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.ROR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.RCL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.RCR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.SHL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                    [Debugger.INS.SHR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.SAR,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH, Debugger.TYPE_IMPREG | Debugger.TYPE_CL | Debugger.TYPE_IN]
                  ],
                  [
                    /* GRP3B */
                    [Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.NOT,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                    [Debugger.INS.NEG,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                    [Debugger.INS.MUL,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                    [Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                    [Debugger.INS.DIV,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_IN],
                    [Debugger.INS.IDIV, Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH]
                  ],
                  [
                    /* GRP3W */
                    [Debugger.INS.TEST, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN,   Debugger.TYPE_IMM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.NOT,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                    [Debugger.INS.NEG,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                    [Debugger.INS.MUL,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.IMUL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                    [Debugger.INS.DIV,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.IDIV, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH]
                  ],
                  [
                    /* GRP4B */
                    [Debugger.INS.INC,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                    [Debugger.INS.DEC,  Debugger.TYPE_MODRM | Debugger.TYPE_BYTE  | Debugger.TYPE_BOTH],
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined
                  ],
                  [
                    /* GRP4W */
                    [Debugger.INS.INC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                    [Debugger.INS.DEC,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_BOTH],
                    [Debugger.INS.CALL, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.CALL, Debugger.TYPE_MODRM | Debugger.TYPE_FARP  | Debugger.TYPE_IN],
                    [Debugger.INS.JMP,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                    [Debugger.INS.JMP,  Debugger.TYPE_MODRM | Debugger.TYPE_FARP  | Debugger.TYPE_IN],
                    [Debugger.INS.PUSH, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN],
                     Debugger.aOpDescUndefined
                  ],
                  [ /* OP0F */ ],
                  [
                    /* GRP6 */
                    [Debugger.INS.SLDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                    [Debugger.INS.STR,  Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                    [Debugger.INS.LLDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                    [Debugger.INS.LTR,  Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                    [Debugger.INS.VERR, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                    [Debugger.INS.VERW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined
                  ],
                  [
                    /* GRP7 */
                    [Debugger.INS.SGDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                    [Debugger.INS.SIDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                    [Debugger.INS.LGDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                    [Debugger.INS.LIDT, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                    [Debugger.INS.SMSW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_OUT | Debugger.TYPE_80286],
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.LMSW, Debugger.TYPE_MODRM | Debugger.TYPE_WORD | Debugger.TYPE_IN  | Debugger.TYPE_80286],
                     Debugger.aOpDescUndefined
                  ],
                  [
                    /* GRP8 */
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                     Debugger.aOpDescUndefined,
                    [Debugger.INS.BT,  Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_IN  | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.BTS, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.BTR, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN],
                    [Debugger.INS.BTC, Debugger.TYPE_MODRM | Debugger.TYPE_VWORD | Debugger.TYPE_OUT | Debugger.TYPE_80386, Debugger.TYPE_IMM | Debugger.TYPE_BYTE | Debugger.TYPE_IN]
                  ]
                ];
            
                Debugger.INT_FUNCS = {
                    0x13: {
                        0x00: "disk reset",
                        0x01: "get status",
                        0x02: "read drive DL (CH:DH:CL,AL) into ES:BX",
                        0x03: "write drive DL (CH:DH:CL,AL) from ES:BX",
                        0x04: "verify drive DL (CH:DH:CL,AL)",
                        0x05: "format drive DL using ES:BX",
                        0x08: "read drive DL parameters into ES:DI",
                        0x15: "get drive DL DASD type",
                        0x16: "get drive DL change line status",
                        0x17: "set drive DL DASD type",
                        0x18: "set drive DL media type"
                    },
                    0x15: {
                        0x80: "open device",
                        0x81: "close device",
                        0x82: "program termination",
                        0x83: "wait CX:DXus for event",
                        0x84: "joystick support",
                        0x85: "SYSREQ pressed",
                        0x86: "wait CX:DXus",
                        0x87: "move block (CX words)",
                        0x88: "get extended memory size",
                        0x89: "processor to virtual mode",
                        0x90: "device busy loop",
                        0x91: "interrupt complete flag set"
                    },
                    0x21: {
                        0x00: "terminate program",
                        0x01: "read character (al) from stdin with echo",
                        0x02: "write character DL to stdout",
                        0x03: "read character (al) from stdaux",                            // eg, COM1
                        0x04: "write character DL to stdaux",                               // eg, COM1
                        0x05: "write character DL to stdprn",                               // eg, LPT1
                        0x06: "direct console output (input if DL=FF)",
                        0x07: "direct console input without echo",
                        0x08: "read character (al) from stdin without echo",
                        0x09: "write $-terminated string DS:DX to stdout",
                        0x0A: "buffered input (ds:dx)",                                     // byte 0 is maximum chars, byte 1 is number of previous characters, byte 2 is number of characters read
                        0x0B: "get stdin status",
                        0x0C: "flush buffer and read stdin",                                // AL is a function # (0x01, 0x06, 0x07, 0x08, or 0x0A)
                        0x0D: "disk reset",
                        0x0E: "select default drive DL",                                    // returns # of available drives in AL
                        0x0F: "open file using fcb DS:DX",                                  // DS:DX -> unopened File Control Block
                        0x10: "close file using fcb DS:DX",
                        0x11: "find first matching file using fcb DS:DX",
                        0x12: "find next matching file using fcb DS:DX",
                        0x13: "delete file using fcb DS:DX",
                        0x14: "sequential read from file using fcb DS:DX",
                        0x15: "sequential write to file using fcb DS:DX",
                        0x16: "create or truncate file using fcb DS:DX",
                        0x17: "rename file using fcb DS:DX",
                        0x19: "get current default drive (al)",
                        0x1A: "set disk transfer area (dta) DS:DX",
                        0x1B: "get allocation information for default drive",
                        0x1C: "get allocation information for specific drive DL",
                        0x1F: "get drive parameter block for default drive",
                        0x21: "read random record from file using fcb DS:DX",
                        0x22: "write random record to file using fcb DS:DX",
                        0x23: "get file size using fcb DS:DX",
                        0x24: "set random record number for fcb DS:DX",
                        0x25: "set address DS:DX of interrupt vector AL",
                        0x26: "create new program segment prefix (psp) at segment DX",
                        0x27: "random block read from file using fcb DS:DX",
                        0x28: "random block write to file using fcb DS:DX",
                        0x29: "parse filename DS:SI into fcb ES:DI using AL",
                        0x2A: "get system date (year=cx, mon=dh, day=dl)",
                        0x2B: "set system date (year=CX, mon=DH, day=DL)",
                        0x2C: "get system time (hour=ch, min=cl, sec=dh, 100ths=dl)",
                        0x2D: "set system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
                        0x2E: "set verify flag AL",
                        0x2F: "get disk transfer area address (es:bx)",                     // DOS 2.00+
                        0x30: "get DOS version (al=major, ah=minor)",
                        0x31: "terminate and stay resident",
                        0x32: "get drive parameter block (dpb=ds:bx) for drive DL",
                        0x33: "extended break check",
                        0x34: "get address (es:bx) of InDOS flag",
                        0x35: "get address (es:bx) of interrupt vector AL",
                        0x36: "get free disk space of drive DL",
                        0x37: "get(0)/set(1) switch character DL (AL)",
                        0x38: "get country-specific information",
                        0x39: "create subdirectory DS:DX",
                        0x3A: "remove subdirectory DS:DX",
                        0x3B: "set current directory DS:DX",
                        0x3C: "create or truncate file DS:DX with attributes CX",
                        0x3D: "open existing file DS:DX with mode AL",
                        0x3E: "close file BX",
                        0x3F: "read CX bytes from file BX into buffer DS:DX",
                        0x40: "write CX bytes to file BX from buffer DS:DX",
                        0x41: "delete file DS:DX",
                        0x42: "set position CX:DX of file BX relative to AL",
                        0x43: "get(0)/set(1) attributes CX of file DS:DX (AL)",
                        0x44: "get device information (IOCTL)",
                        0x45: "duplicate file handle BX",
                        0x46: "force file handle CX to duplicate file handle BX",
                        0x47: "get current directory (ds:si) for drive DL",
                        0x48: "allocate memory segment with BX paragraphs",
                        0x49: "free memory segment ES",
                        0x4A: "resize memory segment ES to BX paragraphs",
                        0x4B: "load program DS:DX using parameter block ES:BX",
                        0x4C: "terminate with return code AL",
                        0x4D: "get return code (al)",
                        0x4E: "find first matching file DS:DX with attributes CX",
                        0x4F: "find next matching file",
                        0x50: "set current psp BX",
                        0x51: "get current psp (bx)",
                        0x52: "get system variables (es:bx)",
                        0x53: "translate bpb DS:SI to dpb (es:bp)",
                        0x54: "get verify flag (al)",
                        0x55: "create child psp at segment DX",
                        0x56: "rename file DS:DX to name ES:DI",
                        0x57: "get(0)/set(1) file date DX and time CX (AL)",
                        0x58: "get(0)/set(1) memory allocation strategy (AL)",              // DOS 2.11+
                        0x59: "get extended error information",                             // DOS 3.00+
                        0x5A: "create temporary file DS:DX with attributes CX",             // DOS 3.00+
                        0x5B: "create file DS:DX with attributes CX",                       // DOS 3.00+ (doesn't truncate existing files like 0x3C)
                        0x5C: "lock(0)/unlock(1) file BX region CX:DX length SI:DI (AL)"    // DOS 3.00+
                    }
                };
            
                /**
                 * initBus(bus, cpu, dbg)
                 *
                 * @this {Debugger}
                 * @param {Computer} cmp
                 * @param {Bus} bus
                 * @param {X86CPU} cpu
                 * @param {Debugger} dbg
                 */
                Debugger.prototype.initBus = function(cmp, bus, cpu, dbg)
                {
                    this.bus = bus;
                    this.cpu = cpu;
                    this.cmp = cmp;
                    this.fdc = cmp.getComponentByType("FDC");
                    this.hdc = cmp.getComponentByType("HDC");
                    if (MAXDEBUG) this.chipset = cmp.getComponentByType("ChipSet");
            
                    this.cchAddr = bus.getWidth() >> 2;
                    this.maskAddr = bus.nBusLimit;
            
                    this.aaOpDescs = Debugger.aaOpDescs;
                    if (this.cpu.model >= X86.MODEL_80186) {
                        this.aaOpDescs = Debugger.aaOpDescs.slice();
                        this.aaOpDescs[0x0F] = Debugger.aOpDescUndefined;
                        if (this.cpu.model >= X86.MODEL_80286) {
                            this.aaOpDescs[0x0F] = Debugger.aOpDesc0F;
                            if (I386 && this.cpu.model >= X86.MODEL_80386) {
                                this.cchReg = 8;
                                this.maskReg = 0xffffffff|0;
                            }
                        }
                    }
            
                    this.messageDump(Messages.BUS,  function onDumpBus(s)  { dbg.dumpBus(s); });
                    this.messageDump(Messages.DESC, function onDumpDesc(s) { dbg.dumpDesc(s); });
                    this.messageDump(Messages.TSS,  function onDumpTSS(s)  { dbg.dumpTSS(s); });
                    this.messageDump(Messages.DOS,  function onDumpDOS(s)  { dbg.dumpDOS(s); });
            
                    this.setReady();
                };
            
                /**
                 * setBinding(sHTMLType, sBinding, control)
                 *
                 * @this {Debugger}
                 * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
                 * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "debugInput")
                 * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
                 * @return {boolean} true if binding was successful, false if unrecognized binding request
                 */
                Debugger.prototype.setBinding = function(sHTMLType, sBinding, control)
                {
                    var dbg = this;
                    switch (sBinding) {
            
                    case "debugInput":
                        this.bindings[sBinding] = control;
                        this.controlDebug = control;
                        /*
                         * For halted machines, this is fine, but for auto-start machines, it can be annoying.
                         *
                         *      control.focus();
                         */
                        control.onkeydown = function onKeyDownDebugInput(event) {
                            var sInput;
                            if (event.keyCode == Keyboard.KEYCODE.CR) {
                                sInput = control.value;
                                control.value = "";
                                var a = dbg.parseCommand(sInput, true);
                                for (var s in a) dbg.doCommand(a[s]);
                            }
                            else if (event.keyCode == Keyboard.KEYCODE.ESC) {
                                control.value = sInput = "";
                            }
                            else {
                                if (event.keyCode == Keyboard.KEYCODE.UP) {
                                    if (dbg.iPrevCmd < dbg.aPrevCmds.length - 1) {
                                        sInput = dbg.aPrevCmds[++dbg.iPrevCmd];
                                    }
                                }
                                else if (event.keyCode == Keyboard.KEYCODE.DOWN) {
                                    if (dbg.iPrevCmd > 0) {
                                        sInput = dbg.aPrevCmds[--dbg.iPrevCmd];
                                    } else {
                                        sInput = "";
                                        dbg.iPrevCmd = -1;
                                    }
                                }
                                if (sInput != null) {
                                    var cch = sInput.length;
                                    control.value = sInput;
                                    control.setSelectionRange(cch, cch);
                                }
                            }
                            if (sInput != null && event.preventDefault) event.preventDefault();
                        };
                        return true;
            
                    case "debugEnter":
                        this.bindings[sBinding] = control;
                        web.onClickRepeat(
                            control,
                            500, 100,
                            function onClickDebugEnter(fRepeat) {
                                if (dbg.controlDebug) {
                                    var sInput = dbg.controlDebug.value;
                                    dbg.controlDebug.value = "";
                                    var a = dbg.parseCommand(sInput, true);
                                    for (var s in a) dbg.doCommand(a[s]);
                                    return true;
                                }
                                if (DEBUG) dbg.log("no debugger input buffer");
                                return false;
                            }
                        );
                        return true;
            
                    case "step":
                        this.bindings[sBinding] = control;
                        web.onClickRepeat(
                            control,
                            500, 100,
                            function onClickStep(fRepeat) {
                                var fCompleted = false;
                                if (!dbg.isBusy(true)) {
                                    dbg.setBusy(true);
                                    fCompleted = dbg.stepCPU(fRepeat? 1 : 0);
                                    dbg.setBusy(false);
                                }
                                return fCompleted;
                            }
                        );
                        return true;
            
                    default:
                        break;
                    }
                    return false;
                };
            
                /**
                 * setFocus()
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.setFocus = function()
                {
                    if (this.controlDebug) this.controlDebug.focus();
                };
            
                /**
                 * getSegment(sel)
                 *
                 * If the selector matches that of any of the CPU segment registers, then return the CPU's segment
                 * register, instead of creating our own dummy segment register.  This makes it possible for us to
                 * see what the CPU is seeing at certain critical junctures, such as after an LMSW instruction has
                 * switched the processor from real to protected mode.  Actually loading the selector from the GDT/LDT
                 * should be done only as a last resort.
                 *
                 * @param {number|null|undefined} sel
                 * @return {X86Seg|null} seg
                 */
                Debugger.prototype.getSegment = function(sel)
                {
                    if (sel === this.cpu.getCS()) return this.cpu.segCS;
                    if (sel === this.cpu.getDS()) return this.cpu.segDS;
                    if (sel === this.cpu.getES()) return this.cpu.segES;
                    if (sel === this.cpu.getSS()) return this.cpu.segSS;
                    if (I386 && this.cpu.model >= X86.MODEL_80386) {
                        if (sel === this.cpu.getFS()) return this.cpu.segFS;
                        if (sel === this.cpu.getGS()) return this.cpu.segGS;
                    }
                    if (this.nBreakSuppress) return null;
                    var seg = new X86Seg(this.cpu, X86Seg.ID.DEBUG, "DBG");
                    /*
                     * Note the load() function's fSuppress parameter, which the Debugger should ALWAYS set to true
                     * to avoid triggering a fault.
                     *
                     * TODO: Confirm that it's OK for getSegment() to drop any error from seg.load() on the floor....
                     */
                    seg.load(sel, true);
                    return seg;
                };
            
                /**
                 * getAddr(dbgAddr, fWrite, cb)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} [fWrite]
                 * @param {number} [cb] is number of bytes to check (1, 2 or 4); default is 1
                 * @return {number} is the corresponding linear address, or X86.ADDR_INVALID
                 */
                Debugger.prototype.getAddr = function(dbgAddr, fWrite, cb)
                {
                    /*
                     * Some addresses (eg, breakpoint addresses) save their original linear address in dbgAddr.addr,
                     * so we want to use that if it's there, but otherwise, dbgAddr is assumed to be a segmented address
                     * whose linear address must always be (re)calculated based on current machine state (mode, active
                     * descriptor tables, etc).
                     */
                    var addr = dbgAddr.addr;
                    if (addr == null) {
                        addr = X86.ADDR_INVALID;
                        var seg = this.getSegment(dbgAddr.sel);
                        if (seg) {
                            if (!fWrite) {
                                addr = seg.checkRead(dbgAddr.off, cb || 1, true);
                            } else {
                                addr = seg.checkWrite(dbgAddr.off, cb || 1, true);
                            }
                            dbgAddr.addr = addr;
                        }
                    }
                    return addr;
                };
            
                /**
                 * getByte(dbgAddr, inc)
                 *
                 * We must route all our memory requests through the CPU now, in case paging is enabled.
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number} [inc]
                 * @return {number}
                 */
                Debugger.prototype.getByte = function(dbgAddr, inc)
                {
                    var b = 0xff;
                    var addr = this.getAddr(dbgAddr, false, 1);
                    if (addr !== X86.ADDR_INVALID) {
                        b = this.cpu.probeAddr(addr) | 0;
                        if (inc) this.incAddr(dbgAddr, inc);
                    }
                    return b;
                };
            
                /**
                 * getWord(dbgAddr, fAdvance)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} [fAdvance]
                 * @return {number}
                 */
                Debugger.prototype.getWord = function(dbgAddr, fAdvance)
                {
                    if (!dbgAddr.fData32) {
                        return this.getShort(dbgAddr, fAdvance? 2 : 0);
                    }
                    return this.getLong(dbgAddr, fAdvance? 4 : 0);
                };
            
                /**
                 * getShort(dbgAddr, inc)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number} [inc]
                 * @return {number}
                 */
                Debugger.prototype.getShort = function(dbgAddr, inc)
                {
                    var w = 0xffff;
                    var addr = this.getAddr(dbgAddr, false, 2);
                    if (addr !== X86.ADDR_INVALID) {
                        w = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8);
                        if (inc) this.incAddr(dbgAddr, inc);
                    }
                    return w;
                };
            
                /**
                 * getLong(dbgAddr, inc)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number} [inc]
                 * @return {number}
                 */
                Debugger.prototype.getLong = function(dbgAddr, inc)
                {
                    var l = -1;
                    var addr = this.getAddr(dbgAddr, false, 4);
                    if (addr !== X86.ADDR_INVALID) {
                        l = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8) | (this.cpu.probeAddr(addr + 2) << 16) | (this.cpu.probeAddr(addr + 3) << 24);
                        if (inc) this.incAddr(dbgAddr, inc);
                    }
                    return l;
                };
            
                /**
                 * setByte(dbgAddr, b, inc)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number} b
                 * @param {number} [inc]
                 */
                Debugger.prototype.setByte = function(dbgAddr, b, inc)
                {
                    var addr = this.getAddr(dbgAddr, true, 1);
                    if (addr !== X86.ADDR_INVALID) {
                        this.cpu.setByte(addr, b);
                        if (inc) this.incAddr(dbgAddr, inc);
                        this.cpu.updateCPU();
                    }
                };
            
                /**
                 * setShort(dbgAddr, w, inc)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number} w
                 * @param {number} [inc]
                 */
                Debugger.prototype.setShort = function(dbgAddr, w, inc)
                {
                    var addr = this.getAddr(dbgAddr, true, 2);
                    if (addr !== X86.ADDR_INVALID) {
                        this.cpu.setShort(addr, w);
                        if (inc) this.incAddr(dbgAddr, inc);
                        this.cpu.updateCPU();
                    }
                };
            
                /**
                 * newAddr(off, sel, addr, fData32, fAddr32)
                 *
                 * @this {Debugger}
                 * @param {number|null|undefined} [off] (default is zero)
                 * @param {number|null|undefined} [sel] (default is undefined)
                 * @param {number|null|undefined} [addr] (default is undefined)
                 * @param {boolean} [fData32] (default is false)
                 * @param {boolean} [fAddr32] (default is false)
                 * @return {{DbgAddr}}
                 */
                Debugger.prototype.newAddr = function(off, sel, addr, fData32, fAddr32)
                {
                    if (fData32 === undefined) fData32 = (this.cpu && this.cpu.segCS.dataSize == 4);
                    if (fAddr32 === undefined) fAddr32 = (this.cpu && this.cpu.segCS.addrSize == 4);
                    return {off: off || 0, sel: sel, addr: addr, fTempBreak: false, fData32: fData32 || false, fAddr32: fAddr32 || false};
                };
            
                /**
                 * packAddr(dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @return {Array}
                 */
                Debugger.prototype.packAddr = function(dbgAddr)
                {
                    return [dbgAddr.off, dbgAddr.sel, dbgAddr.addr, dbgAddr.fTempBreak, dbgAddr.fData32, dbgAddr.fAddr32, dbgAddr.fOverride, dbgAddr.fComplete];
                };
            
                /**
                 * unpackAddr(aAddr)
                 *
                 * @this {Debugger}
                 * @param {Array} aAddr
                 * @return {{DbgAddr}}
                 */
                Debugger.prototype.unpackAddr = function(aAddr)
                {
                    return {off: aAddr[0], sel: aAddr[1], addr: aAddr[2], fTempBreak: aAddr[3], fData32: aAddr[4], fAddr32: aAddr[5], fOverride: aAddr[6], fComplete: aAddr[7]};
                };
            
                /**
                 * checkLimit(dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 */
                Debugger.prototype.checkLimit = function(dbgAddr)
                {
                    if (dbgAddr.sel != null) {
                        var seg = this.getSegment(dbgAddr.sel);
                        if (!seg || dbgAddr.off > seg.limit) {
                            /*
                             * TODO: This automatic wrap-to-zero is OK for normal segments, but for expand-down segments, not so much.
                             */
                            dbgAddr.off = 0;
                            dbgAddr.addr = null;
                        }
                    }
                };
            
                /**
                 * incAddr(dbgAddr, inc)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number|undefined} inc contains value to increment dbgAddr by (default is 1)
                 */
                Debugger.prototype.incAddr = function(dbgAddr, inc)
                {
                    inc = inc || 1;
                    if (dbgAddr.addr != null) {
                        dbgAddr.addr += inc;
                    }
                    if (dbgAddr.sel != null) {
                        dbgAddr.off += inc;
                        this.checkLimit(dbgAddr);
                    }
                };
            
                /**
                 * hexOffset(off, sel, fAddr32)
                 *
                 * @this {Debugger}
                 * @param {number|null} [off]
                 * @param {number|null} [sel]
                 * @param {boolean} [fAddr32] is true for 32-bit ADDRESS size
                 * @return {string} the hex representation of off (or sel:off)
                 */
                Debugger.prototype.hexOffset = function(off, sel, fAddr32)
                {
                    if (sel != null) {
                        return str.toHex(sel, 4) + ":" + str.toHex(off, (off & (0xffff0000|0)) || fAddr32? 8 : 4);
                    }
                    return str.toHex(off);
                };
            
                /**
                 * hexAddr(dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @return {string} the hex representation of the address
                 */
                Debugger.prototype.hexAddr = function(dbgAddr)
                {
                    return dbgAddr.sel == null? ("%" + str.toHex(dbgAddr.addr)) : this.hexOffset(dbgAddr.off, dbgAddr.sel, dbgAddr.fAddr32);
                };
            
                /**
                 * dumpSZ(dbgAddr, cchMax)
                 *
                 * Dump helper for zero-terminated strings.
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {number} [cchMax]
                 * @return {string} (and dbgAddr advanced past the terminating zero)
                 */
                Debugger.prototype.dumpSZ = function(dbgAddr, cchMax)
                {
                    var sChars = "";
                    cchMax = cchMax || 256;
                    while (sChars.length < cchMax) {
                        var b = this.getByte(dbgAddr, 1);
                        if (!b) break;
                        sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                    }
                    return sChars;
                };
            
                /**
                 * dumpDOS(s)
                 *
                 * This dumps DOS MCBs (Memory Control Blocks).
                 *
                 * @this {Debugger}
                 * @param {string} [s]
                 */
                Debugger.prototype.dumpDOS = function(s)
                {
                    if (!s) {
                        this.println("no MCB");
                        return;
                    }
            
                    this.println("dumpDOS(" + s + ")");
            
                    /*
                     * If s is provided and str.parseInt(s) succeeds, then we assume it represents a starting
                     * MCB (Memory Control Block) segment, and we dump the corresponding blocks.
                     */
                    var sel = this.parseValue(s);
                    while (sel) {
                        var dbgAddr = this.newAddr(0, sel);
                        var bSig = this.getByte(dbgAddr, 1);
                        var wPID = this.getShort(dbgAddr, 2);
                        var wParas = this.getShort(dbgAddr, 5);
                        if (bSig != 0x4D && bSig != 0x5A) break;
                        this.println(this.hexOffset(0, sel) + ": '" + String.fromCharCode(bSig) + "' PID=" + str.toHexWord(wPID) + " LEN=" + str.toHexWord(wParas) + ' "' + this.dumpSZ(dbgAddr, 8) + '"');
                        sel += 1 + wParas;
                    }
                };
            
                Debugger.aTSSFields = {
                    "PREV_TSS":     0x00,
                    "CPL0_SP":      0x02,
                    "CPL0_SS":      0x04,
                    "CPL1_SP":      0x06,
                    "CPL1_SS":      0x08,
                    "CPL2_SP":      0x0a,
                    "CPL2_SS":      0x0c,
                    "TASK_IP":      0x0e,
                    "TASK_PS":      0x10,
                    "TASK_AX":      0x12,
                    "TASK_CX":      0x14,
                    "TASK_DX":      0x16,
                    "TASK_BX":      0x18,
                    "TASK_SP":      0x1a,
                    "TASK_BP":      0x1c,
                    "TASK_SI":      0x1e,
                    "TASK_DI":      0x20,
                    "TASK_ES":      0x22,
                    "TASK_CS":      0x24,
                    "TASK_SS":      0x26,
                    "TASK_DS":      0x28,
                    "TASK_LDT":     0x2a
                };
            
                /**
                 * dumpBus(s)
                 *
                 * This dumps Bus allocations.
                 *
                 * @this {Debugger}
                 * @param {string} [s]
                 */
                Debugger.prototype.dumpBus = function(s)
                {
                    this.println("id       physaddr   blkaddr   used    size    type");
                    this.println("-------- ---------  --------  ------  ------  ----");
                    for (var i = 0; i < this.cpu.aMemBlocks.length; i++) {
                        var block = this.cpu.aBusBlocks[i];
                        if (block.type === Memory.TYPE.NONE) continue;
                        this.println(str.toHex(block.id) + " %" + str.toHex(i << this.cpu.nBlockShift) + ": " + str.toHex(block.addr) + "  " + str.toHexWord(block.used) + "  " + str.toHexWord(block.size) + "  " + Memory.TYPE.NAMES[block.type]);
                    }
                };
            
                /**
                 * dumpDesc(s)
                 *
                 * This dumps a descriptor for the given selector.
                 *
                 * @this {Debugger}
                 * @param {string} [s]
                 */
                Debugger.prototype.dumpDesc = function(s)
                {
                    if (!s) {
                        this.println("no selector");
                        return;
                    }
            
                    var sel = this.parseValue(s);
                    if (sel === undefined) {
                        this.println("invalid selector: " + s);
                        return;
                    }
            
                    var seg = this.getSegment(sel);
                    this.println("dumpDesc(" + str.toHexWord(seg? seg.sel : sel) + "): %" + str.toHex(seg? seg.addrDesc : null, this.cchAddr));
                    if (!seg) return;
            
                    var sType;
                    var fGate = false;
                    if (seg.type & X86.DESC.ACC.TYPE.SEG) {
                        if (seg.type & X86.DESC.ACC.TYPE.CODE) {
                            sType = "code";
                            sType += (seg.type & X86.DESC.ACC.TYPE.READABLE)? ",readable" : ",execonly";
                            if (seg.type & X86.DESC.ACC.TYPE.CONFORMING) sType += ",conforming";
                        }
                        else {
                            sType = "data";
                            sType += (seg.type & X86.DESC.ACC.TYPE.WRITABLE)? ",writable" : ",readonly";
                            if (seg.type & X86.DESC.ACC.TYPE.EXPDOWN) sType += ",expdown";
                        }
                        if (seg.type & X86.DESC.ACC.TYPE.ACCESSED) sType += ",accessed";
                    }
                    else {
                        switch(seg.type) {
                        case X86.DESC.ACC.TYPE.TSS:
                            sType = "tss";
                            break;
                        case X86.DESC.ACC.TYPE.LDT:
                            sType = "ldt";
                            break;
                        case X86.DESC.ACC.TYPE.TSS_BUSY:
                            sType = "busy tss";
                            break;
                        case X86.DESC.ACC.TYPE.GATE_CALL:
                            sType = "call gate";
                            fGate = true;
                            break;
                        case X86.DESC.ACC.TYPE.GATE_TASK:
                            sType = "task gate";
                            fGate = true;
                            break;
                        case X86.DESC.ACC.TYPE.GATE_INT:
                            sType = "int gate";
                            fGate = true;
                            break;
                        case X86.DESC.ACC.TYPE.GATE_TRAP:
                            sType = "trap gate";
                            fGate = true;
                            break;
                        default:
                            break;
                        }
                    }
            
                    if (sType && !(seg.acc & X86.DESC.ACC.PRESENT)) sType += ",not present";
            
                    var sDump;
                    if (fGate) {
                        sDump = "seg=" + str.toHexWord(seg.base & 0xffff) + " off=" + str.toHexWord(seg.limit);
                    } else {
                        sDump = "base=" + str.toHex(seg.base, this.cchAddr) + " limit=" + str.toHex(seg.limit, (seg.limit & ~0xffff)? 8 : 4);
                    }
                    /*
                     * When we dump the EXT word, we mask off the LIMIT1619 and BASE2431 bits, because those have already
                     * been incorporated into the limit and base properties of the segment register; all we care about here
                     * are whether EXT contains any of the AVAIL (0x10), BIG (0x40) or LIMITPAGES (0x80) bits.
                     */
                    this.println(sDump + " type=" + str.toHexByte(seg.type >> 8) + " (" + sType + ")" + " ext=" + str.toHexWord(seg.ext & ~(X86.DESC.EXT.LIMIT1619 | X86.DESC.EXT.BASE2431)) + " dpl=" + str.toHexByte(seg.dpl));
                };
            
                /**
                 * dumpHistory(sCount)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sCount is the number of instructions to rewind to (default is 10)
                 */
                Debugger.prototype.dumpHistory = function(sCount)
                {
                    var sMore = "";
                    var cLines = 10;
                    var iHistory = this.iOpcodeHistory;
                    var aHistory = this.aOpcodeHistory;
                    if (aHistory.length) {
                        var n = (sCount === undefined? this.nextHistory : +sCount);
                        if (isNaN(n))
                            n = cLines;
                        else
                            sMore = "more ";
                        if (n > aHistory.length) {
                            this.println("note: only " + aHistory.length + " available");
                            n = aHistory.length;
                        }
                        iHistory -= n;
                        if (iHistory < 0) {
                            if (aHistory[aHistory.length - 1][1] != null) {
                                iHistory += aHistory.length;
                            } else {
                                n = iHistory + n;
                                iHistory = 0;
                            }
                        }
                        if (sCount !== undefined) {
                            this.println(n + " instructions earlier:");
                        }
                        while (cLines && iHistory != this.iOpcodeHistory) {
                            var dbgAddr = aHistory[iHistory++];
                            if (dbgAddr.sel == null) break;
                            /*
                             * We must create a new dbgAddr from the address we obtained from aHistory, because dbgAddr
                             * was a reference, not a copy, and we don't want getInstruction() modifying the original.
                             */
                            dbgAddr = this.newAddr(dbgAddr.off, dbgAddr.sel, dbgAddr.addr);
                            this.println(this.getInstruction(dbgAddr, "history", n--));
                            /*
                             * If there was an OPERAND or ADDRESS override on the previous instruction, getInstruction()
                             * will have automatically disassembled the next instruction, so skip one more history entry.
                             */
                            if (dbgAddr.fOverride) {
                                iHistory++; n--;
                            }
                            if (iHistory >= aHistory.length) iHistory = 0;
                            this.nextHistory = n;
                            cLines--;
                        }
                    }
                    if (cLines == 10) {
                        this.println("no " + sMore + "history available");
                        this.nextHistory = undefined;
                    }
                };
            
                /**
                 * dumpTSS(s)
                 *
                 * This dumps a TSS using the given selector.  If none is specified, the current TR is used.
                 *
                 * @this {Debugger}
                 * @param {string} [s]
                 */
                Debugger.prototype.dumpTSS = function(s)
                {
                    var seg;
                    if (!s) {
                        seg = this.cpu.segTSS;
                    } else {
                        var sel = this.parseValue(s);
                        if (sel === undefined) {
                            this.println("invalid task selector: " + s);
                            return;
                        }
                        seg = this.getSegment(sel);
                    }
            
                    this.println("dumpTSS(" + str.toHexWord(seg? seg.sel : sel) + "): %" + str.toHex(seg? seg.base : null, this.cchAddr));
                    if (!seg) return;
            
                    var sDump = "";
                    for (var sField in Debugger.aTSSFields) {
                        var off = Debugger.aTSSFields[sField];
                        var ch = (sField.length < 8? ' ' : '');
                        var addr = seg.base + off;
                        var w = this.cpu.probeAddr(addr) | (this.cpu.probeAddr(addr + 1) << 8);
                        if (sDump) sDump += '\n';
                        sDump += str.toHexWord(off) + " " + sField + ": " + ch + str.toHexWord(w);
                    }
            
                    this.println(sDump);
                };
            
                /**
                 * messageInit(sEnable)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sEnable contains zero or more message categories to enable, separated by '|' or ';'
                 */
                Debugger.prototype.messageInit = function(sEnable)
                {
                    this.dbg = this;
                    this.bitsMessage = this.bitsWarning = Messages.WARN;
                    this.sMessagePrev = null;
                    this.afnDumpers = [];
                    var aEnable = this.parseCommand(sEnable.replace("keys","key").replace("kbd","keyboard"));
                    if (aEnable.length) {
                        for (var m in Debugger.MESSAGES) {
                            if (usr.indexOf(aEnable, m) >= 0) {
                                this.bitsMessage |= Debugger.MESSAGES[m];
                                this.println(m + " messages enabled");
                            }
                        }
                    }
                };
            
                /**
                 * messageDump(bitMessage, fnDumper)
                 *
                 * @this {Debugger}
                 * @param {number} bitMessage is one Messages category flag
                 * @param {function(string)} fnDumper is a function the Debugger can use to dump data for that category
                 * @return {boolean} true if successfully registered, false if not
                 */
                Debugger.prototype.messageDump = function(bitMessage, fnDumper)
                {
                    for (var m in Debugger.MESSAGES) {
                        if (bitMessage == Debugger.MESSAGES[m]) {
                            this.afnDumpers[m] = fnDumper;
                            return true;
                        }
                    }
                    return false;
                };
            
                /**
                 * getRegIndex(sReg)
                 *
                 * @this {Debugger}
                 * @param {string} sReg
                 * @return {number}
                 */
                Debugger.prototype.getRegIndex = function(sReg) {
                    return usr.indexOf(Debugger.REGS, sReg.toUpperCase());
                };
            
                /**
                 * getRegValue(iReg)
                 *
                 * @this {Debugger}
                 * @param {number} iReg
                 * @return {string}
                 */
                Debugger.prototype.getRegValue = function(iReg) {
                    var s = "??";
                    if (iReg >= 0) {
                        var n, cch;
                        var cpu = this.cpu;
                        switch(iReg) {
                        case Debugger.REG_AL:
                            n = cpu.regEAX;  cch = 2;
                            break;
                        case Debugger.REG_CL:
                            n = cpu.regECX;  cch = 2;
                            break;
                        case Debugger.REG_DL:
                            n = cpu.regEDX;  cch = 2;
                            break;
                        case Debugger.REG_BL:
                            n = cpu.regEBX;  cch = 2;
                            break;
                        case Debugger.REG_AH:
                            n = cpu.regEAX >> 8; cch = 2;
                            break;
                        case Debugger.REG_CH:
                            n = cpu.regECX >> 8; cch = 2;
                            break;
                        case Debugger.REG_DH:
                            n = cpu.regEDX >> 8; cch = 2;
                            break;
                        case Debugger.REG_BH:
                            n = cpu.regEBX >> 8; cch = 2;
                            break;
                        case Debugger.REG_AX:
                            n = cpu.regEAX;  cch = 4;
                            break;
                        case Debugger.REG_CX:
                            n = cpu.regECX;  cch = 4;
                            break;
                        case Debugger.REG_DX:
                            n = cpu.regEDX;  cch = 4;
                            break;
                        case Debugger.REG_BX:
                            n = cpu.regEBX;  cch = 4;
                            break;
                        case Debugger.REG_SP:
                            n = cpu.getSP(); cch = 4;
                            break;
                        case Debugger.REG_BP:
                            n = cpu.regEBP;  cch = 4;
                            break;
                        case Debugger.REG_SI:
                            n = cpu.regESI;  cch = 4;
                            break;
                        case Debugger.REG_DI:
                            n = cpu.regEDI;  cch = 4;
                            break;
                        case Debugger.REG_IP:
                            n = cpu.getIP(); cch = this.cchReg;
                            break;
                        case Debugger.REG_PS:
                            n = cpu.getPS(); cch = this.cchReg;
                            break;
                        case Debugger.REG_SEG + Debugger.REG_ES:
                            n = cpu.getES(); cch = 4;
                            break;
                        case Debugger.REG_SEG + Debugger.REG_CS:
                            n = cpu.getCS(); cch = 4;
                            break;
                        case Debugger.REG_SEG + Debugger.REG_SS:
                            n = cpu.getSS(); cch = 4;
                            break;
                        case Debugger.REG_SEG + Debugger.REG_DS:
                            n = cpu.getDS(); cch = 4;
                            break;
                        }
                        if (!cch) {
                            if (this.cpu.model == X86.MODEL_80286) {
                                if (iReg == Debugger.REG_CR0) {
                                    n = cpu.regCR0;  cch = 4;
                                }
                            }
                            else if (I386 && this.cpu.model >= X86.MODEL_80386) {
                                switch(iReg) {
                                case Debugger.REG_EAX:
                                    n = cpu.regEAX;  cch = 8;
                                    break;
                                case Debugger.REG_ECX:
                                    n = cpu.regECX;  cch = 8;
                                    break;
                                case Debugger.REG_EDX:
                                    n = cpu.regEDX;  cch = 8;
                                    break;
                                case Debugger.REG_EBX:
                                    n = cpu.regEBX;  cch = 8;
                                    break;
                                case Debugger.REG_ESP:
                                    n = cpu.getSP(); cch = 8;
                                    break;
                                case Debugger.REG_EBP:
                                    n = cpu.regEBP;  cch = 8;
                                    break;
                                case Debugger.REG_ESI:
                                    n = cpu.regESI;  cch = 8;
                                    break;
                                case Debugger.REG_EDI:
                                    n = cpu.regEDI;  cch = 8;
                                    break;
                                case Debugger.REG_CR0:
                                    n = cpu.regCR0;  cch = 8;
                                    break;
                                case Debugger.REG_CR1:
                                    n = cpu.regCR1;  cch = 8;
                                    break;
                                case Debugger.REG_CR2:
                                    n = cpu.regCR2;  cch = 8;
                                    break;
                                case Debugger.REG_CR3:
                                    n = cpu.regCR3;  cch = 8;
                                    break;
                                case Debugger.REG_SEG + Debugger.REG_FS:
                                    n = cpu.getFS(); cch = 4;
                                    break;
                                case Debugger.REG_SEG + Debugger.REG_GS:
                                    n = cpu.getGS(); cch = 4;
                                    break;
                                }
                            }
                        }
                        if (cch) s = str.toHex(n, cch);
                    }
                    return s;
                };
            
                /**
                 * replaceRegs()
                 *
                 * @this {Debugger}
                 * @param {string} s
                 * @return {string}
                 */
                Debugger.prototype.replaceRegs = function(s) {
                    for (var iReg = 0; iReg < Debugger.REGS.length; iReg++) {
                        var sReg = Debugger.REGS[iReg];
                        if (s.indexOf(sReg) >= 0) {
                            s = str.replaceAll(sReg, this.getRegValue(iReg), s);
                        }
                    }
                    return s;
                };
            
                /**
                 * message(sMessage, fAddress)
                 *
                 * @this {Debugger}
                 * @param {string} sMessage is any caller-defined message string
                 * @param {boolean} [fAddress] is true to display the current CS:IP
                 */
                Debugger.prototype.message = function(sMessage, fAddress)
                {
                    if (fAddress) {
                        sMessage += " @" + this.hexOffset(this.cpu.getIP(), this.cpu.getCS());
                    }
            
                    if (this.sMessagePrev && sMessage == this.sMessagePrev) return;
            
                    if (!SAMPLER) this.println(sMessage);   // + " (" + this.cpu.getCycles() + " cycles)"
            
                    this.sMessagePrev = sMessage;
            
                    if (this.cpu) {
                        if (this.bitsMessage & Messages.HALT) {
                            this.stopCPU();
                        }
                        /*
                         * We have no idea what the frequency of println() calls might be; all we know is that they easily
                         * screw up the CPU's careful assumptions about cycles per burst.  So we call yieldCPU() after every
                         * message, to effectively end the current burst and start fresh.
                         *
                         * TODO: See CPU.calcStartTime() for a discussion of why we might want to call yieldCPU() *before*
                         * we display the message.
                         */
                        this.cpu.yieldCPU();
                    }
                };
            
                /**
                 * messageInt(nInt, addr)
                 *
                 * @this {Debugger}
                 * @param {number} nInt
                 * @param {number} addr (LIP after the "INT n" instruction has been fetched but not dispatched)
                 * @return {boolean} true if message generated (which in turn triggers addIntReturn() inside checkIntNotify()), false if not
                 */
                Debugger.prototype.messageInt = function(nInt, addr)
                {
                    var AH;
                    var fMessage = false;
                    var nCategory = Debugger.INT_MESSAGES[nInt];
                    if (nCategory) {
                        AH = this.cpu.regEAX >> 8;
                        if (this.messageEnabled(nCategory)) {
                            fMessage = true;
                        } else {
                            fMessage = (nCategory == Messages.FDC && this.messageEnabled(nCategory = Messages.HDC));
                        }
                    }
                    if (fMessage) {
                        var DL = this.cpu.regEDX & 0xff;
                        if (nInt == Interrupts.DOS.VECTOR && AH == 0x0b ||
                            nCategory == Messages.FDC && DL >= 0x80 || nCategory == Messages.HDC && DL < 0x80) {
                            fMessage = false;
                        }
                    }
                    if (fMessage) {
                        var aFuncs = Debugger.INT_FUNCS[nInt];
                        var sFunc = (aFuncs && aFuncs[AH]) || "";
                        if (sFunc) sFunc = ' ' + this.replaceRegs(sFunc);
                        /*
                         * For purposes of display only, rewind addr to the address of the responsible "INT n" instruction; we
                         * know it's the two-byte "INT n" instruction because that's the only opcode handler that calls checkIntNotify()
                         * at the moment.  If that changes, then this will have to change as well.
                         */
                        addr -= 2;
                        this.message("INT " + str.toHexByte(nInt) + ": AH=" + str.toHexByte(AH) + " @" + this.hexOffset(addr - this.cpu.segCS.base, this.cpu.getCS()) + sFunc);
                    }
                    return fMessage;
                };
            
                /**
                 * messageIntReturn(nInt, nLevel, nCycles)
                 *
                 * @this {Debugger}
                 * @param {number} nInt
                 * @param {number} nLevel
                 * @param {number} nCycles
                 * @param {string} [sResult]
                 */
                Debugger.prototype.messageIntReturn = function(nInt, nLevel, nCycles, sResult)
                {
                    this.message("INT " + str.toHexByte(nInt) + ": C=" + (this.cpu.getCF()? 1 : 0) + (sResult || "") + " (cycles=" + nCycles + (nLevel? ",level=" + (nLevel+1) : "") + ")");
                };
            
                /**
                 * messageIO(component, port, bOut, addrFrom, name, bIn, bitsMessage)
                 *
                 * @this {Debugger}
                 * @param {Component} component
                 * @param {number} port
                 * @param {number|null} bOut if an output operation
                 * @param {number|null} [addrFrom]
                 * @param {string|null} [name] of the port, if any
                 * @param {number|null} [bIn] is the input value, if known, on an input operation
                 * @param {number} [bitsMessage] is one or more Messages category flag(s)
                 */
                Debugger.prototype.messageIO = function(component, port, bOut, addrFrom, name, bIn, bitsMessage)
                {
                    bitsMessage |= Messages.PORT;
                    if (addrFrom == null || (this.bitsMessage & bitsMessage) == bitsMessage) {
                        var selFrom = null;
                        if (addrFrom != null) {
                            selFrom = this.cpu.getCS();
                            addrFrom -= this.cpu.segCS.base;
                        }
                        this.message(component.idComponent + "." + (bOut != null? "outPort" : "inPort") + '(' + str.toHexWord(port) + ',' + (name? name : "unknown") + (bOut != null? ',' + str.toHexByte(bOut) : "") + ")" + (bIn != null? (": " + str.toHexByte(bIn)) : "") + (addrFrom != null? (" @" + this.hexOffset(addrFrom, selFrom)) : ""));
                    }
                };
            
                /**
                 * traceInit()
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.traceInit = function()
                {
                    if (DEBUG) {
                        this.traceEnabled = {};
                        for (var prop in Debugger.TRACE) {
                            this.traceEnabled[prop] = false;
                        }
                        this.iTraceBuffer = 0;
                        this.aTraceBuffer = [];     // we now defer TRACE_LIMIT allocation until the first traceLog() call
                    }
                };
            
                /**
                 * traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
                 *
                 * @this {Debugger}
                 * @param {string} prop
                 * @param {number} dst
                 * @param {number} src
                 * @param {number|null} flagsIn
                 * @param {number|null} flagsOut
                 * @param {number} resultLo
                 * @param {number} [resultHi]
                 */
                Debugger.prototype.traceLog = function(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
                {
                    if (DEBUG) {
                        if (this.traceEnabled !== undefined && this.traceEnabled[prop]) {
                            var trace = Debugger.TRACE[prop];
                            var len = (trace.size >> 2);
                            var s = this.hexOffset(this.cpu.opLIP - this.cpu.segCS.base, this.cpu.getCS()) + " " + Debugger.INS_NAMES[trace.ins] + "(" + str.toHex(dst, len) + "," + str.toHex(src, len) + "," + (flagsIn === null? "-" : str.toHexWord(flagsIn)) + ") " + str.toHex(resultLo, len) + "," + (flagsOut === null? "-" : str.toHexWord(flagsOut));
                            if (!this.aTraceBuffer.length) this.aTraceBuffer = new Array(Debugger.TRACE_LIMIT);
                            this.aTraceBuffer[this.iTraceBuffer++] = s;
                            if (this.iTraceBuffer >= this.aTraceBuffer.length) {
                                /*
                                 * Instead of wrapping the buffer, we're going to turn all tracing off.
                                 *
                                 *      this.iTraceBuffer = 0;
                                 */
                                for (prop in this.traceEnabled) {
                                    this.traceEnabled[prop] = false;
                                }
                                this.println("trace buffer full");
                            }
                        }
                    }
                };
            
                /**
                 * init()
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.init = function()
                {
                    this.println("Type ? for list of debugger commands");
                    this.updateStatus();
                    if (this.sInitCommands) {
                        var a = this.parseCommand(this.sInitCommands);
                        delete this.sInitCommands;
                        for (var s in a) this.doCommand(a[s]);
                    }
                };
            
                /**
                 * historyInit()
                 *
                 * This function is intended to be called by the constructor, reset(), addBreakpoint(), findBreakpoint()
                 * and any other function that changes the checksEnabled() criteria used to decide whether checkInstruction()
                 * should be called.
                 *
                 * That is, if the history arrays need to be allocated and haven't already been allocated, then allocate them,
                 * and if the arrays are no longer needed, then deallocate them.
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.historyInit = function()
                {
                    var i;
                    if (!this.checksEnabled()) {
                        this.iOpcodeHistory = 0;
                        this.aOpcodeHistory = [];
                        this.aaOpcodeCounts = [];
                        return;
                    }
                    if (!this.aOpcodeHistory || !this.aOpcodeHistory.length) {
                        this.aOpcodeHistory = new Array(10000);
                        for (i = 0; i < this.aOpcodeHistory.length; i++) {
                            /*
                             * Preallocate dummy Addr (Array) objects in every history slot, so that
                             * checkInstruction() doesn't need to call newAddr() on every slot update.
                             */
                            this.aOpcodeHistory[i] = this.newAddr();
                        }
                        this.iOpcodeHistory = 0;
                    }
                    if (!this.aaOpcodeCounts || !this.aaOpcodeCounts.length) {
                        this.aaOpcodeCounts = new Array(256);
                        for (i = 0; i < this.aaOpcodeCounts.length; i++) {
                            this.aaOpcodeCounts[i] = [i, 0];
                        }
                    }
                };
            
                /**
                 * runCPU(fOnClick)
                 *
                 * @this {Debugger}
                 * @param {boolean} [fOnClick] is true if called from a click handler that might have stolen focus
                 * @return {boolean} true if run request successful, false if not
                 */
                Debugger.prototype.runCPU = function(fOnClick)
                {
                    if (!this.isCPUAvail()) return false;
                    this.cpu.runCPU(fOnClick);
                    return true;
                };
            
                /**
                 * stepCPU(nCycles, fRegs, fUpdateCPU)
                 *
                 * @this {Debugger}
                 * @param {number} nCycles (0 for one instruction without checking breakpoints)
                 * @param {boolean} [fRegs] is true to display registers after step (default is false)
                 * @param {boolean} [fUpdateCPU] is false to disable calls to updateCPU() (default is true)
                 * @return {boolean}
                 */
                Debugger.prototype.stepCPU = function(nCycles, fRegs, fUpdateCPU)
                {
                    if (!this.isCPUAvail()) return false;
            
                    this.nCycles = 0;
                    do {
                        if (!nCycles) {
                            /*
                             * When single-stepping, the CPU won't call checkInstruction(), which is good for
                             * avoiding breakpoints, but bad for instruction data collection if checks are enabled.
                             * So we call checkInstruction() ourselves.
                             */
                            if (this.checksEnabled()) this.checkInstruction(this.cpu.regLIP, 0);
                        }
                        try {
                            var nCyclesStep = this.cpu.stepCPU(nCycles);
                            if (nCyclesStep > 0) {
                                this.nCycles += nCyclesStep;
                                this.cpu.addCycles(nCyclesStep, true);
                                this.cpu.updateChecksum(nCyclesStep);
                                this.cInstructions++;
                            }
                        }
                        catch (e) {
                            this.nCycles = 0;
                            this.cpu.setError(e.stack || e.message);
                        }
                    } while (this.cpu.opFlags & X86.OPFLAG_PREFIXES);
            
                    /*
                     * Because we called cpu.stepCPU() and not cpu.runCPU(), we must nudge the cpu's update code,
                     * and then update our own state.  Normally, the only time fUpdateCPU will be false is when doStep()
                     * is calling us in a loop, in which case it will perform its own updateCPU() when it's done.
                     */
                    if (fUpdateCPU !== false) this.cpu.updateCPU();
            
                    this.updateStatus(fRegs || false, false);
                    return (this.nCycles > 0);
                };
            
                /**
                 * stopCPU()
                 *
                 * @this {Debugger}
                 * @param {boolean} [fComplete]
                 */
                Debugger.prototype.stopCPU = function(fComplete)
                {
                    if (this.cpu) this.cpu.stopCPU(fComplete);
                };
            
                /**
                 * updateStatus(fRegs, fCompact)
                 *
                 * @this {Debugger}
                 * @param {boolean} [fRegs] (default is true)
                 * @param {boolean} [fCompact] (default is true)
                 */
                Debugger.prototype.updateStatus = function(fRegs, fCompact)
                {
                    if (fRegs === undefined) fRegs = true;
                    if (fCompact === undefined) fCompact = true;
            
                    this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                    /*
                     * this.fProcStep used to be a simple boolean, but now it's 0 (or undefined)
                     * if inactive, 1 if stepping over an instruction without a register dump, or 2
                     * if stepping over an instruction with a register dump.
                     */
                    if (!fRegs || this.fProcStep == 1)
                        this.doUnassemble();
                    else {
                        this.doRegisters(null, fCompact);
                    }
                };
            
                /**
                 * isCPUAvail()
                 *
                 * Make sure the CPU is ready (finished initializing), not busy (already running), and not in an error state.
                 *
                 * @this {Debugger}
                 * @return {boolean}
                 */
                Debugger.prototype.isCPUAvail = function()
                {
                    if (!this.cpu)
                        return false;
                    if (!this.cpu.isReady())
                        return false;
                    if (!this.cpu.isPowered())
                        return false;
                    if (this.cpu.isBusy())
                        return false;
                    return !this.cpu.isError();
                };
            
                /**
                 * powerUp(data, fRepower)
                 *
                 * @this {Debugger}
                 * @param {Object|null} data
                 * @param {boolean} [fRepower]
                 * @return {boolean} true if successful, false if failure
                 */
                Debugger.prototype.powerUp = function(data, fRepower)
                {
                    if (!fRepower) {
                        /*
                         * Because Debugger save/restore support is somewhat limited (and didn't always exist),
                         * we deviate from the typical save/restore design pattern: instead of reset OR restore,
                         * we always reset and then perform a (potentially limited) restore.
                         */
                        this.reset(true);
            
                        // this.println(data? "resuming" : "powering up");
            
                        if (data && this.restore) {
                            if (!this.restore(data)) return false;
                        }
                    }
                    return true;
                };
            
                /**
                 * powerDown(fSave, fShutdown)
                 *
                 * @this {Debugger}
                 * @param {boolean} fSave
                 * @param {boolean} [fShutdown]
                 * @return {Object|boolean}
                 */
                Debugger.prototype.powerDown = function(fSave, fShutdown)
                {
                    if (fShutdown) this.println(fSave? "suspending" : "shutting down");
                    return fSave && this.save? this.save() : true;
                };
            
                /**
                 * reset(fQuiet)
                 *
                 * This is a notification handler, called by the Computer, to inform us of a reset.
                 *
                 * @this {Debugger}
                 * @param {boolean} fQuiet (true only when called from our own powerUp handler)
                 */
                Debugger.prototype.reset = function(fQuiet)
                {
                    this.historyInit();
                    this.cInstructions = 0;
                    this.sMessagePrev = null;
                    this.nCycles = 0;
                    this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                    /*
                     * fRunning is set by start() and cleared by stop().  In addition, we clear
                     * it here, so that if the CPU is reset while running, we can prevent stop()
                     * from unnecessarily dumping the CPU state.
                     */
                    if (this.aFlags.fRunning !== undefined && !fQuiet) this.println("reset");
                    this.aFlags.fRunning = false;
                    this.clearTempBreakpoint();
                    if (!fQuiet) this.updateStatus();
                };
            
                /**
                 * save()
                 *
                 * This implements (very rudimentary) save support for the Debugger component.
                 *
                 * @this {Debugger}
                 * @return {Object}
                 */
                Debugger.prototype.save = function()
                {
                    var state = new State(this);
                    state.set(0, this.packAddr(this.dbgAddrNextCode));
                    state.set(1, this.packAddr(this.dbgAddrAssemble));
                    state.set(2, [this.aPrevCmds, this.fAssemble, this.bitsMessage]);
                    return state.data();
                };
            
                /**
                 * restore(data)
                 *
                 * This implements (very rudimentary) restore support for the Debugger component.
                 *
                 * @this {Debugger}
                 * @param {Object} data
                 * @return {boolean} true if successful, false if failure
                 */
                Debugger.prototype.restore = function(data)
                {
                    var i = 0;
                    if (data[2] !== undefined) {
                        this.dbgAddrNextCode = this.unpackAddr(data[i++]);
                        this.dbgAddrAssemble = this.unpackAddr(data[i++]);
                        this.aPrevCmds = data[i][0];
                        if (typeof this.aPrevCmds == "string") this.aPrevCmds = [this.aPrevCmds];
                        this.fAssemble = data[i][1];
                        if (!this.bitsMessage) {
                            /*
                             * It's actually kind of annoying that a restored (or predefined) state will trump my initial state,
                             * at least in situations where I've changed the initial state, if I want to diagnose something.
                             * Perhaps I should save/restore both the initial and current bitsMessageEnabled, and if the initial
                             * values don't agree, then leave the current value alone.
                             *
                             * But, it's much easier to just leave bitsMessageEnabled alone whenever it already contains set bits.
                             */
                            this.bitsMessage = data[i][2];
                        }
                    }
                    return true;
                };
            
                /**
                 * start(ms, nCycles)
                 *
                 * This is a notification handler, called by the Computer, to inform us the CPU has started.
                 *
                 * @this {Debugger}
                 * @param {number} ms
                 * @param {number} nCycles
                 */
                Debugger.prototype.start = function(ms, nCycles)
                {
                    if (!this.fProcStep) this.println("running");
                    this.aFlags.fRunning = true;
                    this.msStart = ms;
                    this.nCyclesStart = nCycles;
                };
            
                /**
                 * stop(ms, nCycles)
                 *
                 * This is a notification handler, called by the Computer, to inform us the CPU has now stopped.
                 *
                 * @this {Debugger}
                 * @param {number} ms
                 * @param {number} nCycles
                 */
                Debugger.prototype.stop = function(ms, nCycles)
                {
                    if (this.aFlags.fRunning) {
                        this.aFlags.fRunning = false;
                        this.nCycles = nCycles - this.nCyclesStart;
                        if (!this.fProcStep) {
                            var sStopped = "stopped";
                            if (this.nCycles) {
                                var msTotal = ms - this.msStart;
                                var nCyclesPerSecond = (msTotal > 0? Math.round(this.nCycles * 1000 / msTotal) : 0);
                                sStopped += " (";
                                if (this.checksEnabled()) {
                                    sStopped += this.cInstructions + " ops, ";
                                    this.cInstructions = 0;     // remove this line if you want to maintain a longer total
                                }
                                sStopped += this.nCycles + " cycles, " + msTotal + " ms, " + nCyclesPerSecond + " hz)";
                                if (MAXDEBUG && this.chipset) {
                                    var i, c, n;
                                    for (i = 0; i < this.chipset.acInterrupts.length; i++) {
                                        c = this.chipset.acInterrupts[i];
                                        if (!c) continue;
                                        n = c / Math.round(msTotal / 1000);
                                        this.println("IRQ" + i + ": " + c + " interrupts (" + n + " per sec)");
                                        this.chipset.acInterrupts[i] = 0;
                                    }
                                    for (i = 0; i < this.chipset.acTimersFired.length; i++) {
                                        c = this.chipset.acTimersFired[i];
                                        if (!c) continue;
                                        n = c / Math.round(msTotal / 1000);
                                        this.println("TIMER" + i + ": " + c + " fires (" + n + " per sec)");
                                        this.chipset.acTimersFired[i] = 0;
                                    }
                                    n = 0;
                                    for (i = 0; i < this.chipset.acTimer0Counts.length; i++) {
                                        var a = this.chipset.acTimer0Counts[i];
                                        n += a[0];
                                        this.println("TIMER0 update #" + i + ": [" + a[0] + "," + a[1] + "," + a[2] + "]");
                                    }
                                    this.chipset.acTimer0Counts = [];
                                }
                            }
                            this.println(sStopped);
                        }
                        this.updateStatus(true, this.fProcStep != 2);
                        this.setFocus();
                        this.clearTempBreakpoint(this.cpu.regLIP);
                    }
                };
            
                /**
                 * checksEnabled(fRelease)
                 *
                 * This "check" function is called by the CPU; we indicate whether or not every instruction needs to be checked.
                 *
                 * Originally, this returned true even when there were only read and/or write breakpoints, but those breakpoints
                 * no longer require the intervention of checkInstruction(); the Bus component automatically swaps in/out appropriate
                 * functions to deal with those breakpoints in the appropriate memory blocks.  So I've simplified the test below.
                 *
                 * @this {Debugger}
                 * @param {boolean} [fRelease] is true for release criteria only; default is false (any criteria)
                 * @return {boolean} true if every instruction needs to pass through checkInstruction(), false if not
                 */
                Debugger.prototype.checksEnabled = function(fRelease)
                {
                    return ((DEBUG && !fRelease)? true : (this.aBreakExec.length > 1 || this.messageEnabled(Messages.INT) /* || this.aBreakRead.length > 1 || this.aBreakWrite.length > 1 */));
                };
            
                /**
                 * checkInstruction(addr, nState)
                 *
                 * This "check" function is called by the CPU to inform us about the next instruction to be executed,
                 * giving us an opportunity to look for "exec" breakpoints and update opcode frequencies and instruction history.
                 *
                 * @this {Debugger}
                 * @param {number} addr
                 * @param {number} nState is < 0 if stepping, 0 if starting, or > 0 if running
                 * @return {boolean} true if breakpoint hit, false if not
                 */
                Debugger.prototype.checkInstruction = function(addr, nState)
                {
                    if (nState > 0) {
                        if (this.checkBreakpoint(addr, this.aBreakExec)) {
                            return true;
                        }
                        /*
                         * Halt whenever ring 3 code is running with interrupts disabled, because that's likely an
                         * error (TODO: we should also check the IOPL, too, because if IOPL is 3, then this is OK).
                         */
                        if (this.cpu.segCS.cpl == 3 && !(this.cpu.regPS & X86.PS.IF)) {
                            return true;
                        }
                    }
            
                    /*
                     * The rest of the instruction tracking logic can only be performed if historyInit() has allocated the
                     * necessary data structures.  Note that there is no explicit UI for enabling/disabling history, other than
                     * adding/removing breakpoints, simply because it's breakpoints that trigger the call to checkInstruction();
                     * well, OK, and a few other things now, like enabling Messages.INT messages.
                     */
                    if (nState >= 0 && this.aaOpcodeCounts.length) {
                        this.cInstructions++;
                        var bOpcode = this.cpu.probeAddr(addr);
                        if (bOpcode != null) {
                            this.aaOpcodeCounts[bOpcode][1]++;
                            var dbgAddr = this.aOpcodeHistory[this.iOpcodeHistory];
                            dbgAddr.off = this.cpu.getIP();
                            dbgAddr.sel = this.cpu.getCS();
                            dbgAddr.addr = addr;
                            if (++this.iOpcodeHistory == this.aOpcodeHistory.length) this.iOpcodeHistory = 0;
                        }
                    }
                    return false;
                };
            
                /**
                 * checkMemoryRead(addr)
                 *
                 * This "check" function is called by a Memory block to inform us that a memory read occurred, giving us an
                 * opportunity to track the read if we want, and look for a matching "read" breakpoint, if any.
                 *
                 * @this {Debugger}
                 * @param {number} addr
                 * @return {boolean} true if breakpoint hit, false if not
                 */
                Debugger.prototype.checkMemoryRead = function(addr)
                {
                    if (this.checkBreakpoint(addr, this.aBreakRead)) {
                        this.stopCPU(true);
                        return true;
                    }
                    return false;
                };
            
                /**
                 * checkMemoryWrite(addr)
                 *
                 * This "check" function is called by a Memory block to inform us that a memory write occurred, giving us an
                 * opportunity to track the write if we want, and look for a matching "write" breakpoint, if any.
                 *
                 * @this {Debugger}
                 * @param {number} addr
                 * @return {boolean} true if breakpoint hit, false if not
                 */
                Debugger.prototype.checkMemoryWrite = function(addr)
                {
                    if (this.checkBreakpoint(addr, this.aBreakWrite)) {
                        this.stopCPU(true);
                        return true;
                    }
                    return false;
                };
            
                /**
                 * checkPortInput(port, bIn)
                 *
                 * This "check" function is called by the Bus component to inform us that port input occurred.
                 *
                 * @this {Debugger}
                 * @param {number} port
                 * @param {number} bIn
                 * @return {boolean} true if breakpoint hit, false if not
                 */
                Debugger.prototype.checkPortInput = function(port, bIn)
                {
                    /*
                     * We trust that the Bus component won't call us unless we told it to, so we halt unconditionally
                     */
                    this.println("break on input from port " + str.toHexWord(port) + ": " + str.toHexByte(bIn));
                    this.stopCPU(true);
                    return true;
                };
            
                /**
                 * checkPortOutput(port, bOut)
                 *
                 * This "check" function is called by the Bus component to inform us that port output occurred.
                 *
                 * @this {Debugger}
                 * @param {number} port
                 * @param {number} bOut
                 * @return {boolean} true if breakpoint hit, false if not
                 */
                Debugger.prototype.checkPortOutput = function(port, bOut)
                {
                    /*
                     * We trust that the Bus component won't call us unless we told it to, so we halt unconditionally
                     */
                    this.println("break on output to port " + str.toHexWord(port) + ": " + str.toHexByte(bOut));
                    this.stopCPU(true);
                    return true;
                };
            
                /**
                 * clearBreakpoints()
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.clearBreakpoints = function()
                {
                    var i;
                    this.aBreakExec = ["exec"];
                    if (this.aBreakRead !== undefined) {
                        for (i = 1; i < this.aBreakRead.length; i++) {
                            this.bus.removeMemBreak(this.getAddr(this.aBreakRead[i]), false);
                        }
                    }
                    this.aBreakRead = ["read"];
                    if (this.aBreakWrite !== undefined) {
                        for (i = 1; i < this.aBreakWrite.length; i++) {
                            this.bus.removeMemBreak(this.getAddr(this.aBreakWrite[i]), true);
                        }
                    }
                    this.aBreakWrite = ["write"];
                    /*
                     * nBreakSuppress ensures we can't get into an infinite loop where a breakpoint lookup requires
                     * reading a segment descriptor via getSegment(), and that triggers more memory reads, which triggers
                     * more breakpoint checks.
                     */
                    this.nBreakSuppress = 0;
                };
            
                /**
                 * addBreakpoint(aBreak, dbgAddr, fTempBreak)
                 *
                 * @this {Debugger}
                 * @param {Array} aBreak
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} [fTempBreak]
                 * @return {boolean} true if breakpoint added, false if already exists
                 */
                Debugger.prototype.addBreakpoint = function(aBreak, dbgAddr, fTempBreak)
                {
                    if (!this.findBreakpoint(aBreak, dbgAddr)) {
                        dbgAddr.fTempBreak = fTempBreak;
                        aBreak.push(dbgAddr);
                        if (aBreak != this.aBreakExec) {
                            this.bus.addMemBreak(this.getAddr(dbgAddr), aBreak == this.aBreakWrite);
                        }
                        if (fTempBreak) {
                            /*
                             * Force temporary breakpoints to be interpreted as linear breakpoints
                             * (hence the assertion that there IS a linear address stored in dbgAddr);
                             * this allows us to step over calls or interrupts that change the processor mode
                             */
                            dbgAddr.sel = null;
                            this.assert(dbgAddr.addr);
                        } else {
                            this.println("breakpoint enabled: " + this.hexAddr(dbgAddr) + " (" + aBreak[0] + ")");
                        }
                        this.historyInit();
                        return true;
                    }
                    return false;
                };
            
                /**
                 * findBreakpoint(aBreak, dbgAddr, fRemove)
                 *
                 * @this {Debugger}
                 * @param {Array} aBreak
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} [fRemove]
                 * @return {boolean} true if found, false if not
                 */
                Debugger.prototype.findBreakpoint = function(aBreak, dbgAddr, fRemove)
                {
                    var fFound = false;
                    var addr = this.mapBreakpoint(this.getAddr(dbgAddr));
                    for (var i = 1; i < aBreak.length; i++) {
                        var dbgAddrBreak = aBreak[i];
                        if (addr == this.mapBreakpoint(this.getAddr(dbgAddrBreak))) {
                            fFound = true;
                            if (fRemove) {
                                aBreak.splice(i, 1);
                                if (aBreak != this.aBreakExec) {
                                    this.bus.removeMemBreak(addr, aBreak == this.aBreakWrite);
                                }
                                if (!dbgAddrBreak.fTempBreak) this.println("breakpoint cleared: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
                                this.historyInit();
                                break;
                            }
                            this.println("breakpoint exists: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
                            break;
                        }
                    }
                    return fFound;
                };
            
                /**
                 * listBreakpoints(aBreak)
                 *
                 * TODO: We may need to start listing linear addresses also, because segmented address can be ambiguous.
                 *
                 * @this {Debugger}
                 * @param {Array} aBreak
                 * @return {number} of breakpoints listed, 0 if none
                 */
                Debugger.prototype.listBreakpoints = function(aBreak)
                {
                    for (var i = 1; i < aBreak.length; i++) {
                        this.println("breakpoint enabled: " + this.hexAddr(aBreak[i]) + " (" + aBreak[0] + ")");
                    }
                    return aBreak.length - 1;
                };
            
                /**
                 * redoBreakpoints()
                 *
                 * This function is for the Memory component: whenever the Bus allocates a new Memory block, it calls
                 * the block's setDebugger() method, which clears the memory block's breakpoint counts.  setDebugger(),
                 * in turn, must call this function to re-apply any existing breakpoints to that block.
                 *
                 * This ensures that, even if a memory region is remapped (which creates new Memory blocks in the process),
                 * any breakpoints that were previously applied to that region will still work.
                 *
                 * @this {Debugger}
                 * @param {number} addr of memory block
                 * @param {number} size of memory block
                 * @param {Array} [aBreak]
                 */
                Debugger.prototype.redoBreakpoints = function(addr, size, aBreak)
                {
                    if (aBreak === undefined) {
                        this.redoBreakpoints(addr, size, this.aBreakRead);
                        this.redoBreakpoints(addr, size, this.aBreakWrite);
                        return;
                    }
                    for (var i = 1; i < aBreak.length; i++) {
                        var addrBreak = this.getAddr(aBreak[i]);
                        if (addrBreak >= addr && addrBreak < addr + size) {
                            this.bus.addMemBreak(addrBreak, aBreak == this.aBreakWrite);
                        }
                    }
                };
            
                /**
                 * setTempBreakpoint(dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr of new temp breakpoint
                 */
                Debugger.prototype.setTempBreakpoint = function(dbgAddr)
                {
                    this.addBreakpoint(this.aBreakExec, dbgAddr, true);
                };
            
                /**
                 * clearTempBreakpoint(addr)
                 *
                 * @this {Debugger}
                 * @param {number|undefined} [addr] clear all temp breakpoints if no address specified
                 */
                Debugger.prototype.clearTempBreakpoint = function(addr)
                {
                    if (addr !== undefined) {
                        this.checkBreakpoint(addr, this.aBreakExec, true);
                        this.fProcStep = 0;
                    } else {
                        for (var i = 1; i < this.aBreakExec.length; i++) {
                            var dbgAddrBreak = this.aBreakExec[i];
                            if (dbgAddrBreak.fTempBreak) {
                                if (!this.findBreakpoint(this.aBreakExec, dbgAddrBreak, true)) break;
                                i = 0;
                            }
                        }
                    }
                };
            
                /**
                 * mapBreakpoint(addr)
                 *
                 * @this {Debugger}
                 * @param {number} addr
                 * @return {number}
                 */
                Debugger.prototype.mapBreakpoint = function(addr)
                {
                    /*
                     * Map addresses in the top 64Kb at the top of the address space (assuming either a 16Mb or 4Gb
                     * address space) to the top of the 1Mb range.
                     *
                     * The fact that those two 64Kb regions are aliases of each other on an 80286 is a pain in the BUTT,
                     * because any CS-based breakpoint you set immediately after a CPU reset will have a physical address
                     * in the top 16Mb, yet after the first inter-segment JMP, you will be running in the first 1Mb.
                     */
                    var mask = (this.maskAddr & ~0xffff);
                    if ((addr & mask) == mask) addr &= 0x000fffff;
                    return addr;
                };
            
                /**
                 * checkBreakpoint(addr, aBreak, fTemp)
                 *
                 * @this {Debugger}
                 * @param {number} addr
                 * @param {Array} aBreak
                 * @param {boolean} [fTemp]
                 * @return {boolean} true if breakpoint has been hit, false if not
                 */
                Debugger.prototype.checkBreakpoint = function(addr, aBreak, fTemp)
                {
                    /*
                     * Time to check for execution breakpoints; note that this should be done BEFORE updating frequency
                     * or history data (see checkInstruction), since we might not actually execute the current instruction.
                     */
                    var fBreak = false;
                    if (!this.nBreakSuppress++) {
            
                        addr = this.mapBreakpoint(addr);
            
                        /*
                         * As discussed in opINT3(), I decided to check for INT3 instructions here: we'll tell the CPU to
                         * stop on INT3 whenever both the INT and HALT message bits are set; a simple "g" command allows you
                         * to continue.
                         */
                        if (this.messageEnabled(Messages.INT | Messages.HALT)) {
                            if (this.cpu.probeAddr(addr) == X86.OPCODE.INT3) {
                                fBreak = true;
                            }
                        }
            
                        for (var i = 1; !fBreak && i < aBreak.length; i++) {
            
                            var dbgAddrBreak = aBreak[i];
            
                            /*
                             * We need to zap the linear address field of the breakpoint address before
                             * calling getAddr(), to force it to recalculate the linear address every time,
                             * unless this is a breakpoint on a linear address (as indicated by a null sel).
                             */
                            if (dbgAddrBreak.sel != null) dbgAddrBreak.addr = null;
            
                            /*
                             * We used to calculate the linear address of the breakpoint at the time the
                             * breakpoint was added, so that a breakpoint set in one mode (eg, in real-mode)
                             * would still work as intended if the mode changed later (eg, to protected-mode).
                             *
                             * However, that created difficulties setting protected-mode breakpoints in segments
                             * that might not be defined yet, or that could move in physical memory.
                             *
                             * If you want to create a real-mode breakpoint that will break regardless of mode,
                             * use the physical address of the real-mode memory location instead.
                             */
                            if (addr == this.mapBreakpoint(this.getAddr(dbgAddrBreak))) {
                                if (dbgAddrBreak.fTempBreak) {
                                    this.findBreakpoint(aBreak, dbgAddrBreak, true);
                                } else if (!fTemp) {
                                    this.println("breakpoint hit: " + this.hexAddr(dbgAddrBreak) + " (" + aBreak[0] + ")");
                                }
                                fBreak = true;
                            }
                        }
                    }
                    this.nBreakSuppress--;
                    return fBreak;
                };
            
                /**
                 * getInstruction(dbgAddr, sComment, nSequence)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {string} [sComment] is an associated comment
                 * @param {number} [nSequence] is an associated sequence number, undefined if none
                 * @return {string} (and dbgAddr is updated to the next instruction)
                 */
                Debugger.prototype.getInstruction = function(dbgAddr, sComment, nSequence)
                {
                    var dbgAddrIns = this.newAddr(dbgAddr.off, dbgAddr.sel, dbgAddr.addr);
            
                    var bOpcode = this.getByte(dbgAddr, 1);
            
                    /*
                     * Incorporate the following prefixes into the current instruction byte stream.
                     * TODO: Determine the actual effect of multiple OS (and/or multiple AS) prefixes.
                     */
                    var cMax = 2;           // let's make sure unfortunate memory contents don't screw us
                    while ((bOpcode == X86.OPCODE.OS || bOpcode == X86.OPCODE.AS) && cMax--) {
                        if (bOpcode == X86.OPCODE.OS) {
                            dbgAddr.fData32 = !dbgAddr.fData32;
                        } else {
                            dbgAddr.fAddr32 = !dbgAddr.fAddr32;
                        }
                        bOpcode = this.getByte(dbgAddr, 1);
                    }
            
                    var aOpDesc = this.aaOpDescs[bOpcode];
                    var iIns = aOpDesc[0];
                    var bModRM = -1;
            
                    if (iIns == Debugger.INS.OP0F) {
                        var b = this.getByte(dbgAddr, 1);
                        aOpDesc = Debugger.aaOp0FDescs[b] || Debugger.aOpDescUndefined;
                        bOpcode |= (b << 8);
                        iIns = aOpDesc[0];
                    }
            
                    if (iIns >= Debugger.INS_NAMES.length) {
                        bModRM = this.getByte(dbgAddr, 1);
                        aOpDesc = Debugger.aaGrpDescs[iIns - Debugger.INS_NAMES.length][(bModRM >> 3) & 0x7];
                    }
            
                    var sOpcode = Debugger.INS_NAMES[aOpDesc[0]];
                    var cOperands = aOpDesc.length - 1;
                    var sOperands = "";
                    if (this.isStringIns(bOpcode)) {
                        cOperands = 0;              // suppress display of operands for string instructions
                        if (dbgAddr.fData32 && sOpcode.slice(-1) == 'W') sOpcode = sOpcode.slice(0, -1) + 'D';
                    }
            
                    var typeCPU = null;
                    var fNonPrefix = true;
            
                    for (var iOperand = 1; iOperand <= cOperands; iOperand++) {
            
                        var disp, offset, cch;
                        var sOperand = "";
                        var type = aOpDesc[iOperand];
                        if (type === undefined) continue;
            
                        if (typeCPU == null) typeCPU = type >> Debugger.TYPE_CPU_SHIFT;
            
                        var typeSize = type & Debugger.TYPE_SIZE;
                        if (typeSize == Debugger.TYPE_NONE) {
                            continue;
                        }
                        if (typeSize == Debugger.TYPE_PREFIX) {
                            fNonPrefix = false;
                            continue;
                        }
                        var typeMode = type & Debugger.TYPE_MODE;
                        if (typeMode >= Debugger.TYPE_MODRM) {
                            if (bModRM < 0) {
                                bModRM = this.getByte(dbgAddr, 1);
                            }
                            if (typeMode >= Debugger.TYPE_REG) {
                                sOperand = this.getRegOperand((bModRM >> 3) & 0x7, type, dbgAddr);
                            }
                            else {
                                sOperand = this.getModRMOperand(bModRM, type, dbgAddr);
                            }
                        }
                        else if (typeMode == Debugger.TYPE_ONE) {
                            sOperand = "1";
                        }
                        else if (typeMode == Debugger.TYPE_IMM) {
                            sOperand = this.getImmOperand(type, dbgAddr);
                        }
                        else if (typeMode == Debugger.TYPE_IMMOFF) {
                            if (!dbgAddr.fAddr32) {
                                cch = 4;
                                offset = this.getShort(dbgAddr, 2);
                            } else {
                                cch = 8;
                                offset = this.getLong(dbgAddr, 4);
                            }
                            sOperand = "[" + str.toHex(offset, cch) + "]";
                        }
                        else if (typeMode == Debugger.TYPE_IMMREL) {
                            if (typeSize == Debugger.TYPE_BYTE) {
                                disp = ((this.getByte(dbgAddr, 1) << 24) >> 24);
                            }
                            else {
                                disp = this.getWord(dbgAddr, true);
                            }
                            offset = (dbgAddr.off + disp) & (dbgAddr.fData32? -1 : 0xffff);
                            var aSymbol = this.findSymbolAtAddr(this.newAddr(offset, dbgAddr.sel));
                            sOperand = aSymbol[0] || str.toHex(offset, dbgAddr.fData32? 8: 4);
                        }
                        else if (typeMode == Debugger.TYPE_IMPREG) {
                            sOperand = this.getRegOperand((type & Debugger.TYPE_IREG) >> 8, type, dbgAddr);
                        }
                        else if (typeMode == Debugger.TYPE_IMPSEG) {
                            sOperand = this.getRegOperand((type & Debugger.TYPE_IREG) >> 8, Debugger.TYPE_SEGREG, dbgAddr);
                        }
                        else if (typeMode == Debugger.TYPE_DSSI) {
                            sOperand = "DS:[SI]";
                        }
                        else if (typeMode == Debugger.TYPE_ESDI) {
                            sOperand = "ES:[DI]";
                        }
                        if (!sOperand || !sOperand.length) {
                            sOperands = "INVALID";
                            break;
                        }
                        if (sOperands.length > 0) sOperands += ",";
                        sOperands += sOperand;
                    }
            
                    var sLine = this.hexAddr(dbgAddrIns) + " ";
                    var sBytes = "";
                    do {
                        sBytes += str.toHex(this.getByte(dbgAddrIns, 1), 2);
                    } while (dbgAddrIns.addr != dbgAddr.addr);
            
                    sLine += str.pad(sBytes, 16);
                    sLine += str.pad(sOpcode, 8);
                    if (sOperands) sLine += " " + sOperands;
            
                    if (this.cpu.model < Debugger.CPUS[typeCPU]) {
                        sComment = Debugger.CPUS[typeCPU] + " CPU only";
                    }
            
                    if (sComment && fNonPrefix) {
                        sLine = str.pad(sLine, 56) + ';' + sComment;
                        if (!this.cpu.aFlags.fChecksum) {
                            sLine += (nSequence != null? '=' + nSequence.toString() : "");
                        } else {
                            var nCycles = this.cpu.getCycles();
                            sLine += "cycles=" + nCycles.toString() + " cs=" + str.toHex(this.cpu.aCounts.nChecksum);
                        }
                    }
            
                    this.initAddrSize(dbgAddr, fNonPrefix);
                    return sLine;
                };
            
                /**
                 * getImmOperand(type, dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {number} type
                 * @param {{DbgAddr}} dbgAddr
                 * @return {string} operand
                 */
                Debugger.prototype.getImmOperand = function(type, dbgAddr)
                {
                    var sOperand = " ";
                    var typeSize = type & Debugger.TYPE_SIZE;
                    switch (typeSize) {
                    case Debugger.TYPE_BYTE:
                        /*
                         * There's the occasional immediate byte we don't need to display (eg, the 0x0A
                         * following an AAM or AAD instruction), so we suppress the byte if it lacks a TYPE_IN
                         * or TYPE_OUT designation (and TYPE_BOTH, as the name implies, includes both).
                         */
                        if (type & Debugger.TYPE_BOTH) {
                            sOperand = str.toHex(this.getByte(dbgAddr, 1), 2);
                        }
                        break;
                    case Debugger.TYPE_SBYTE:
                        sOperand = str.toHex((this.getByte(dbgAddr, 1) << 24) >> 24, 4);
                        break;
                    case Debugger.TYPE_VWORD:
                    case Debugger.TYPE_2WORD:
                        if (dbgAddr.fData32) {
                            sOperand = str.toHex(this.getLong(dbgAddr, 4));
                            break;
                        }
                        /* falls through */
                    case Debugger.TYPE_WORD:
                        sOperand = str.toHex(this.getShort(dbgAddr, 2), 4);
                        break;
                    case Debugger.TYPE_FARP:
                        sOperand = this.hexAddr(this.newAddr(this.getWord(dbgAddr, true), this.getShort(dbgAddr, 2), null, dbgAddr.fData32, dbgAddr.fAddr32));
                        break;
                    default:
                        sOperand = "imm(" + str.toHexWord(type) + ")";
                        break;
                    }
                    return sOperand;
                };
            
                /**
                 * getRegOperand(bReg, type, dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {number} bReg
                 * @param {number} type
                 * @param {{DbgAddr}} dbgAddr
                 * @return {string} operand
                 */
                Debugger.prototype.getRegOperand = function(bReg, type, dbgAddr)
                {
                    var typeMode = type & Debugger.TYPE_MODE;
                    if (typeMode == Debugger.TYPE_SEGREG) {
                        if (bReg > Debugger.REG_GS ||
                            bReg >= Debugger.REG_FS && this.cpu.model < X86.MODEL_80386) return "??";
                        bReg += Debugger.REG_SEG;
                    }
                    else if (typeMode == Debugger.TYPE_CTLREG) {
                        bReg += Debugger.REG_CR0;
                    }
                    else {
                        var typeSize = type & Debugger.TYPE_SIZE;
                        if (typeSize >= Debugger.TYPE_WORD) {
                            if (bReg < Debugger.REG_AX) {
                                bReg += Debugger.REG_AX - Debugger.REG_AL;
                            }
                            if (typeSize == Debugger.TYPE_DWORD || typeSize == Debugger.TYPE_VWORD && dbgAddr.fData32) {
                                bReg += Debugger.REG_EAX - Debugger.REG_AX;
                            }
                        }
                    }
                    return Debugger.REGS[bReg];
                };
            
                /**
                 * getSIBOperand(bMod, dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {number} bMod
                 * @param {{DbgAddr}} dbgAddr
                 * @return {string} operand
                 */
                Debugger.prototype.getSIBOperand = function(bMod, dbgAddr)
                {
                    var bSIB = this.getByte(dbgAddr, 1);
                    var bScale = bSIB >> 6;
                    var bIndex = (bSIB >> 3) & 0x7;
                    var bBase = bSIB & 0x7;
                    var sOperand = "";
                    if (bMod || bBase != 5) {
                        sOperand = Debugger.RMS[bBase + 8];
                    }
                    if (bIndex != 4) {
                        if (sOperand) sOperand += '+';
                        sOperand += Debugger.RMS[bIndex + 8];
                        if (bScale) sOperand += '*' + (0x1 << bScale);
                    }
                    return sOperand;
                };
            
                /**
                 * getModRMOperand(bModRM, type, dbgAddr)
                 *
                 * @this {Debugger}
                 * @param {number} bModRM
                 * @param {number} type
                 * @param {{DbgAddr}} dbgAddr
                 * @return {string} operand
                 */
                Debugger.prototype.getModRMOperand = function(bModRM, type, dbgAddr)
                {
                    var sOperand = "";
                    var bMod = bModRM >> 6;
                    var bRM = bModRM & 0x7;
                    if (bMod < 3) {
                        var disp;
                        if (!bMod && (!dbgAddr.fAddr32 && bRM == 6 || dbgAddr.fAddr32 && bRM == 5)) {
                            bMod = 2;
                        } else {
                            if (dbgAddr.fAddr32) {
                                if (bRM != 4) {
                                    bRM += 8;
                                } else {
                                    sOperand = this.getSIBOperand(bMod, dbgAddr);
                                }
                            }
                            if (!sOperand) sOperand = Debugger.RMS[bRM];
                        }
                        if (bMod == 1) {
                            disp = this.getByte(dbgAddr, 1);
                            if (!(disp & 0x80)) {
                                sOperand += "+" + str.toHex(disp, 2);
                            }
                            else {
                                disp = ((disp << 24) >> 24);
                                sOperand += "-" + str.toHex(-disp, 2);
                            }
                        }
                        else if (bMod == 2) {
                            if (sOperand) sOperand += '+';
                            if (!dbgAddr.fAddr32) {
                                disp = this.getShort(dbgAddr, 2);
                                sOperand += str.toHex(disp, 4);
                            } else {
                                disp = this.getLong(dbgAddr, 4);
                                sOperand += str.toHex(disp);
                            }
                        }
                        sOperand = "[" + sOperand + "]";
                        if ((type & Debugger.TYPE_SIZE) == Debugger.TYPE_FARP) sOperand = "FAR " + sOperand;
                    }
                    else {
                        sOperand = this.getRegOperand(bRM, type, dbgAddr);
                    }
                    return sOperand;
                };
            
                /**
                 * parseInstruction(sOp, sOperand, addr)
                 *
                 * This generally requires an exact match of both the operation code (sOp) and mode operand
                 * (sOperand) against the aOps[] and aOpMods[] arrays, respectively; however, the regular
                 * expression built from aOpMods and stored in regexOpModes does relax the matching criteria
                 * slightly; ie, a 4-digit hex value ("nnnn") will be satisfied with either 3 or 4 digits, and
                 * similarly, a 2-digit hex address (nn) will be satisfied with either 1 or 2 digits.
                 *
                 * Note that this function does not actually store the instruction into memory, even though it requires
                 * a target address (addr); that parameter is currently needed ONLY for "branch" instructions, because in
                 * order to calculate the branch displacement, it needs to know where the instruction will ultimately be
                 * stored, relative to its target address.
                 *
                 * Another handy feature of this function is its ability to display all available modes for a particular
                 * operation. For example, while in "assemble mode", if one types:
                 *
                 *      ldy?
                 *
                 * the Debugger will display:
                 *
                 *      supported opcodes:
                 *           A0: LDY nn
                 *           A4: LDY [nn]
                 *           AC: LDY [nnnn]
                 *           B4: LDY [nn+X]
                 *           BC: LDY [nnnn+X]
                 *
                 * Use of a trailing "?" on any opcode will display all variations of that opcode; no instruction will be
                 * assembled, and the operand parameter, if any, will be ignored.
                 *
                 * Although this function is capable of reporting numerous errors, roughly half of them indicate internal
                 * consistency errors, not user errors; the former should really be asserts, but I'm not comfortable bombing
                 * out because of my error as opposed to their error.  The only errors a user should expect to see:
                 *
                 *      "unknown operation":    sOp is not a valid operation (per aOps)
                 *      "unknown operand":      sOperand is not a valid operand (per aOpMods)
                 *      "unknown instruction":  the combination of sOp + sOperand does not exist (per aaOpDescs)
                 *      "branch out of range":  the branch address, relative to addr, is too far away
                 *
                 * @this {Debugger}
                 * @param {string} sOp
                 * @param {string|undefined} sOperand
                 * @param {{DbgAddr}} dbgAddr of memory where this instruction is being assembled
                 * @return {Array.<number>} of opcode bytes; if the instruction can't be parsed, the array will be empty
                 */
                Debugger.prototype.parseInstruction = function(sOp, sOperand, dbgAddr)
                {
                    var aOpBytes = [];
                    this.println("not supported yet");
                    return aOpBytes;
                };
            
                /**
                 * getFlagStr(sFlag)
                 *
                 * @this {Debugger}
                 * @param {string} sFlag
                 * @return {string} value of flag
                 */
                Debugger.prototype.getFlagStr = function(sFlag)
                {
                    var b;
                    switch (sFlag) {
                    case "V":
                        b = this.cpu.getOF();
                        break;
                    case "D":
                        b = this.cpu.getDF();
                        break;
                    case "I":
                        b = this.cpu.getIF();
                        break;
                    case "T":
                        b = this.cpu.getTF();
                        break;
                    case "S":
                        b = this.cpu.getSF();
                        break;
                    case "Z":
                        b = this.cpu.getZF();
                        break;
                    case "A":
                        b = this.cpu.getAF();
                        break;
                    case "P":
                        b = this.cpu.getPF();
                        break;
                    case "C":
                        b = this.cpu.getCF();
                        break;
                    default:
                        b = 0;
                        break;
                    }
                    return sFlag + (b? '1' : '0') + ' ';
                };
            
                /**
                 * getRegString(iReg)
                 *
                 * @this {Debugger}
                 * @param {number} iReg
                 * @return {string}
                 */
                Debugger.prototype.getRegString = function(iReg)
                {
                    if (iReg >= Debugger.REG_AX && iReg <= Debugger.REG_DI && this.cchReg > 4) iReg += Debugger.REG_EAX - Debugger.REG_AX;
                    var sReg = Debugger.REGS[iReg];
                    if (iReg == Debugger.REG_CR0 && this.cpu.model == X86.MODEL_80286) sReg = "MS";
                    return sReg + '=' + this.getRegValue(iReg) + ' ';
                };
            
                /**
                 * getSegString(seg, fProt)
                 *
                 * @this {Debugger}
                 * @param {X86Seg} seg
                 * @param {boolean} [fProt]
                 * @return {string}
                 */
                Debugger.prototype.getSegString = function(seg, fProt)
                {
                    return seg.sName + '=' + str.toHex(seg.sel, 4) + (fProt? '[' + str.toHex(seg.base, this.cchAddr) + ',' + str.toHex(seg.limit, (seg.limit & ~0xffff)? 8 : 4) + ']' : "");
                };
            
                /**
                 * getDTRString(sName, sel, addr, addrLimit)
                 *
                 * @this {Debugger}
                 * @param {string} sName
                 * @param {number|null} sel
                 * @param {number} addr
                 * @param {number} addrLimit
                 * @return {string}
                 */
                Debugger.prototype.getDTRString = function(sName, sel, addr, addrLimit)
                {
                    return sName + '=' + (sel != null? str.toHex(sel, 4) : "") + '[' + str.toHex(addr, this.cchAddr) + ',' + str.toHex(addrLimit - addr, 4) + ']';
                };
            
                /**
                 * getRegDump(fProt)
                 *
                 * Sample 8086 and 80286 real-mode register dump:
                 *
                 *      AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
                 *      SS=0000 DS=0000 ES=0000 PS=0002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                 *      F000:FFF0 EA5BE000F0    JMP      F000:E05B
                 *
                 * Sample 80386 real-mode register dump:
                 *
                 *      EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
                 *      ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000
                 *      SS=0000 DS=0000 ES=0000 FS=0000 GS=0000 PS=00000002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                 *      F000:FFF0 EA05F900F0    JMP      F000:F905
                 *
                 * Sample 80286 protected-mode register dump:
                 *
                 *      AX=0000 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
                 *      SS=0000[000000,FFFF] DS=0000[000000,FFFF] ES=0000[000000,FFFF] A20=ON
                 *      CS=F000[FF0000,FFFF] LD=0000[000000,FFFF] GD=[000000,FFFF] ID=[000000,03FF]
                 *      TR=0000 MS=FFF0 PS=0002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                 *      F000:FFF0 EA5BE000F0    JMP      F000:E05B
                 *
                 * Sample 80386 protected-mode register dump:
                 *
                 *      EAX=00000000 EBX=00000000 ECX=00000000 EDX=00000000
                 *      ESP=00000000 EBP=00000000 ESI=00000000 EDI=00000000
                 *      SS=0000[00000000,FFFF] DS=0000[00000000,FFFF] ES=0000[00000000,FFFF]
                 *      CS=F000[FFFF0000,FFFF] FS=0000[00000000,FFFF] GS=0000[00000000,FFFF]
                 *      LD=0000[00000000,FFFF] GD=[00000000,FFFF] ID=[00000000,03FF] TR=0000 A20=ON
                 *      CR0=00000010 CR2=00000000 CR3=00000000 PS=00000002 V0 D0 I0 T0 S0 Z0 A0 P0 C0
                 *      F000:0000FFF0 EA05F900F0    JMP      F000:0000F905
                 *
                 * This no longer includes CS in real-mode (or EIP in any mode), because that information can be obtained from the
                 * first line of disassembly, which an "r" or "rp" command will also display.
                 *
                 * Note that even when the processor is in real mode, you can always use the "rp" command to force a protected-mode
                 * dump, in case you need to verify any selector base or limit values, since those do affect real-mode operation.
                 *
                 * @this {Debugger}
                 * @param {boolean} [fProt]
                 * @return {string}
                 */
                Debugger.prototype.getRegDump = function(fProt)
                {
                    var s;
                    if (fProt === undefined) {
                        fProt = !!(this.cpu.regCR0 & X86.CR0.MSW.PE);
                    }
                    s = this.getRegString(Debugger.REG_AX) +
                        this.getRegString(Debugger.REG_BX) +
                        this.getRegString(Debugger.REG_CX) +
                        this.getRegString(Debugger.REG_DX) + (this.cchReg > 4? '\n' : '') +
                        this.getRegString(Debugger.REG_SP) +
                        this.getRegString(Debugger.REG_BP) +
                        this.getRegString(Debugger.REG_SI) +
                        this.getRegString(Debugger.REG_DI) + '\n' +
                        this.getSegString(this.cpu.segSS, fProt) + ' ' +
                        this.getSegString(this.cpu.segDS, fProt) + ' ' +
                        this.getSegString(this.cpu.segES, fProt) + ' ';
                    if (fProt) {
                        var sTR = "TR=" + str.toHex(this.cpu.segTSS.sel, 4);
                        var sA20 = "A20=" + (this.bus.getA20()? "ON " : "OFF ");
                        if (this.cpu.model < X86.MODEL_80386) {
                            sTR = '\n' + sTR;
                            s += sA20; sA20 = '';
                        }
                        s += '\n' + this.getSegString(this.cpu.segCS, fProt) + ' ';
                        if (I386 && this.cpu.model >= X86.MODEL_80386) {
                            sA20 += '\n';
                            s += this.getSegString(this.cpu.segFS, fProt) + ' ' +
                                 this.getSegString(this.cpu.segGS, fProt) + '\n';
                        }
                        s += this.getDTRString("LD", this.cpu.segLDT.sel, this.cpu.segLDT.base, this.cpu.segLDT.base + this.cpu.segLDT.limit) + ' ' +
                             this.getDTRString("GD", null, this.cpu.addrGDT, this.cpu.addrGDTLimit) + ' ' +
                             this.getDTRString("ID", null, this.cpu.addrIDT, this.cpu.addrIDTLimit) + ' ';
                        s += sTR + ' ' + sA20;
                        s += this.getRegString(Debugger.REG_CR0);
                        if (I386 && this.cpu.model >= X86.MODEL_80386) {
                            s += this.getRegString(Debugger.REG_CR2) + this.getRegString(Debugger.REG_CR3);
                        }
                    } else {
                        if (I386 && this.cpu.model >= X86.MODEL_80386) {
                            s += this.getSegString(this.cpu.segFS, fProt) + ' ' +
                                 this.getSegString(this.cpu.segGS, fProt) + ' ';
                        }
                    }
                    s += this.getRegString(Debugger.REG_PS) +
                         this.getFlagStr("V") + this.getFlagStr("D") + this.getFlagStr("I") + this.getFlagStr("T") +
                         this.getFlagStr("S") + this.getFlagStr("Z") + this.getFlagStr("A") + this.getFlagStr("P") + this.getFlagStr("C");
                    return s;
                };
            
                /**
                 * parseAddr(sAddr, type)
                 *
                 * As discussed above, dbgAddr variables contain one or more of: off, sel, and addr.  They represent
                 * a segmented address (sel:off) when sel is defined or a linear address (addr) when sel is undefined
                 * (or null).
                 *
                 * To create a segmented address, specify two values separated by ":"; for a linear address, use
                 * a "%" prefix.  We check for ":" after "%", so if for some strange reason you specify both, the
                 * address will be treated as segmented, not linear.
                 *
                 * The "%" syntax is similar to that used by the Windows 80386 kernel debugger (wdeb386) for linear
                 * addresses.  If/when we add support for processors with page tables, we will likely adopt the same
                 * convention for linear addresses and provide a different syntax (eg, "%%") physical memory references.
                 *
                 * Address evaluation and validation (eg, range checks) are no longer performed at this stage.  That's
                 * done later, by getAddr(), which returns X86.ADDR_INVALID for invalid segments, out-of-range offsets,
                 * etc.  The Debugger's low-level get/set memory functions verify all getAddr() results, but even if an
                 * invalid address is passed through to the Bus memory interfaces, the address will simply be masked with
                 * Bus.nBusLimit; in the case of X86.ADDR_INVALID, that will generally refer to the top of the physical
                 * address space.
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sAddr
                 * @param {number|undefined} type is the address segment type, in case sAddr doesn't specify a segment
                 * @return {{DbgAddr}}
                 */
                Debugger.prototype.parseAddr = function(sAddr, type)
                {
                    var dbgAddr;
                    var dbgAddrNext = (type == Debugger.ADDR_DATA? this.dbgAddrNextData : this.dbgAddrNextCode);
                    var off = dbgAddrNext.off, sel = dbgAddrNext.sel, addr = dbgAddrNext.addr;
            
                    if (sAddr !== undefined) {
            
                        if (sAddr.charAt(0) == '%') {
                            sAddr = sAddr.substr(1);
                            off = 0;
                            sel = null;
                            addr = 0;
                        }
            
                        dbgAddr = this.findSymbolAddr(sAddr);
                        if (dbgAddr && dbgAddr.off != null) return dbgAddr;
            
                        var iColon = sAddr.indexOf(":");
                        if (iColon < 0) {
                            if (sel != null) {
                                off = this.parseValue(sAddr);
                                addr = null;
                            } else {
                                addr = this.parseValue(sAddr);
                            }
                        }
                        else {
                            sel = this.parseValue(sAddr.substring(0, iColon));
                            off = this.parseValue(sAddr.substring(iColon + 1));
                            addr = null;
                        }
                    }
            
                    dbgAddr = this.newAddr(off, sel, addr);
                    this.checkLimit(dbgAddr);
                    return dbgAddr;
                };
            
                /**
                 * parseValue(sValue, sName)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sValue
                 * @param {string} [sName] is the name of the value, if any
                 * @return {number|undefined} numeric value, or undefined if sValue is either undefined or invalid
                 */
                Debugger.prototype.parseValue = function(sValue, sName)
                {
                    var value;
                    if (sValue !== undefined) {
                        var iReg = this.getRegIndex(sValue);
                        if (iReg >= 0) sValue = this.getRegValue(iReg);
                        value = str.parseInt(sValue);
                        if (value === undefined) this.println("invalid " + (sName? sName : "value") + ": " + sValue);
                    } else {
                        this.println("missing " + (sName || "value"));
                    }
                    return value;
                };
            
                /**
                 * addSymbols(addr, size, aSymbols)
                 *
                 * As filedump.js (formerly convrom.php) explains, aSymbols is a JSON-encoded object whose properties consist
                 * of all the symbols (in upper-case), and the values of those properties are objects containing any or all of
                 * the following properties:
                 *
                 *      "v": the value of an absolute (unsized) value
                 *      "b": either 1, 2, 4 or undefined if an unsized value
                 *      "s": either a hard-coded segment or undefined
                 *      "o": the offset of the symbol within the associated address space
                 *      "l": the original-case version of the symbol, present only if it wasn't originally upper-case
                 *      "a": annotation for the specified offset; eg, the original assembly language, with optional comment
                 *
                 * To that list of properties, we also add:
                 *
                 *      "p": the physical address (calculated whenever both "s" and "o" properties are defined)
                 *
                 * Note that values for any "v", "b", "s" and "o" properties are unquoted decimal values, and the values
                 * for any "l" or "a" properties are quoted strings. Also, if double-quotes were used in any of the original
                 * annotation ("a") values, they will have been converted to two single-quotes, so we're responsible for
                 * converting them back to individual double-quotes.
                 *
                 * For example:
                 *      {
                 *          "HF_PORT": {
                 *              "v":800
                 *          },
                 *          "HDISK_INT": {
                 *              "b":4, "s":0, "o":52
                 *          },
                 *          "ORG_VECTOR": {
                 *              "b":4, "s":0, "o":76
                 *          },
                 *          "CMD_BLOCK": {
                 *              "b":1, "s":64, "o":66
                 *          },
                 *          "DISK_SETUP": {
                 *              "o":3
                 *          },
                 *          ".40": {
                 *              "o":40, "a":"MOV AX,WORD PTR ORG_VECTOR ;GET DISKETTE VECTOR"
                 *          }
                 *      }
                 *
                 * If a symbol only has an offset, then that offset value can be assigned to the symbol property directly:
                 *
                 *          "DISK_SETUP": 3
                 *
                 * The last property is an example of an "anonymous" entry, for offsets where there is no associated symbol.
                 * Such entries are identified by a period followed by a unique number (usually the offset of the entry), and
                 * they usually only contain offset ("o") and annotation ("a") properties.  I could eliminate the leading
                 * period, but it offers a very convenient way of quickly discriminating among genuine vs. anonymous symbols.
                 *
                 * We add all these entries to our internal symbol table, which is an array of 4-element arrays, each of which
                 * look like:
                 *
                 *      [addr, size, aSymbols, aOffsetPairs]
                 *
                 * There are two basic symbol operations: findSymbolAddr(), which takes a string and attempts to match it
                 * to a non-anonymous symbol with a matching offset ("o") property, and findSymbolAtAddr(), which takes an
                 * address and finds the symbol, if any, at that address.
                 *
                 * To implement findSymbolAtAddr() efficiently, addSymbols() creates an array of [offset, sSymbol] pairs
                 * (aOffsetPairs), one pair for each symbol that corresponds to an offset within the specified address space.
                 *
                 * We guarantee the elements of aOffsetPairs are in offset order, because we build it using binaryInsert();
                 * it's quite likely that the MAP file already ordered all its symbols in offset order, but since they're
                 * hand-edited files, we can't assume that.  This insures that findSymbolAtAddr()'s binarySearch() will operate
                 * properly.
                 *
                 * @this {Debugger}
                 * @param {number} addr is the physical address of the region where the given symbols are located
                 * @param {number} size is the size of the region, in bytes
                 * @param {Object} aSymbols is the collection of symbols (the format of this object is described below)
                 */
                Debugger.prototype.addSymbols = function(addr, size, aSymbols)
                {
                    var dbgAddr = {};
                    var aOffsetPairs = [];
                    var fnComparePairs = function(p1, p2) {
                        return p1[0] > p2[0]? 1 : p1[0] < p2[0]? -1 : 0;
                    };
                    for (var sSymbol in aSymbols) {
                        var symbol = aSymbols[sSymbol];
                        if (typeof symbol == "number") {
                            aSymbols[sSymbol] = symbol = {'o': symbol};
                        }
                        var off = symbol['o'];
                        var sel = symbol['s'];
                        var sAnnotation = symbol['a'];
                        if (off !== undefined) {
                            if (sel !== undefined) {
                                dbgAddr.off = off;
                                dbgAddr.sel = sel;
                                dbgAddr.addr = null;
                                /*
                                 * getAddr() computes the corresponding physical address and saves it in dbgAddr.addr.
                                 */
                                this.getAddr(dbgAddr);
                                /*
                                 * The physical address for any symbol located in the top 64Kb of the machine's address space
                                 * should be relocated to the top 64Kb of the first 1Mb, so that we're immune from any changes
                                 * to the A20 line.
                                 */
                                if ((dbgAddr.addr & ~0xffff) == (this.bus.nBusLimit & ~0xffff)) {
                                    dbgAddr.addr &= 0x000fffff;
                                }
                                symbol['p'] = dbgAddr.addr;
                            }
                            usr.binaryInsert(aOffsetPairs, [off, sSymbol], fnComparePairs);
                        }
                        if (sAnnotation) symbol['a'] = sAnnotation.replace(/''/g, "\"");
                    }
                    this.aSymbolTable.push([addr, size, aSymbols, aOffsetPairs]);
                };
            
                /**
                 * dumpSymbols()
                 *
                 * TODO: Add "numerical" and "alphabetical" dump options. This is simply dumping them in whatever
                 * order they appeared in the original MAP file.
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.dumpSymbols = function()
                {
                    for (var i = 0; i < this.aSymbolTable.length; i++) {
                        var addr = this.aSymbolTable[i][0];
                      //var size = this.aSymbolTable[i][1];
                        var aSymbols = this.aSymbolTable[i][2];
                        for (var sSymbol in aSymbols) {
                            if (sSymbol.charAt(0) == '.') continue;
                            var symbol = aSymbols[sSymbol];
                            var off = symbol['o'];
                            if (off === undefined) continue;
                            var sel = symbol['s'];
                            if (sel === undefined) sel = (addr >>> 4);
                            var sSymbolOrig = aSymbols[sSymbol]['l'];
                            if (sSymbolOrig) sSymbol = sSymbolOrig;
                            this.println(this.hexOffset(off, sel) + " " + sSymbol);
                        }
                    }
                };
            
                /**
                 * findSymbolAddr(sSymbol)
                 *
                 * Search aSymbolTable for sSymbol, and if found, return a dbgAddr (same as parseAddr())
                 *
                 * @this {Debugger}
                 * @param {string} sSymbol
                 * @return {{DbgAddr}|null} a valid dbgAddr if a valid symbol, an empty dbgAddr if an unknown symbol, or null if not a symbol
                 */
                Debugger.prototype.findSymbolAddr = function(sSymbol)
                {
                    var dbgAddr = null;
                    if (sSymbol.match(/^[a-z_][a-z0-9_]*$/i)) {
                        dbgAddr = {};
                        var sUpperCase = sSymbol.toUpperCase();
                        for (var i = 0; i < this.aSymbolTable.length; i++) {
                            var addr = this.aSymbolTable[i][0];
                            //var size = this.aSymbolTable[i][1];
                            var aSymbols = this.aSymbolTable[i][2];
                            var symbol = aSymbols[sUpperCase];
                            if (symbol !== undefined) {
                                var off = symbol['o'];
                                if (off !== undefined) {
                                    /*
                                     * We assume that every ROM is ORG'ed at 0x0000, and therefore unless the symbol has an
                                     * explicitly-defined segment, we return the segment as "addr >>> 4".  Down the road, we may
                                     * want/need to support a special symbol entry (eg, ".ORG") that defines an alternate origin.
                                     */
                                    var sel = symbol['s'];
                                    if (sel === undefined) sel = addr >>> 4;
                                    // dbgAddr = this.newAddr(off, sel);
                                    dbgAddr.off = off;
                                    dbgAddr.sel = sel;
                                    if (symbol['p'] !== undefined) dbgAddr.addr = symbol['p'];
                                }
                                /*
                                 * The symbol matched, but it wasn't for an address (no "o" offset), and there's no point
                                 * looking any farther, since each symbol appears only once, so we indicate it's an unknown symbol.
                                 */
                                break;
                            }
                        }
                    }
                    return dbgAddr;
                };
            
                /**
                 * findSymbolAtAddr(dbgAddr, fNearest)
                 *
                 * Search aSymbolTable for dbgAddr, and return an Array for the corresponding symbol (empty if not found).
                 *
                 * If fNearest is true, and no exact match was found, then the Array returned will contain TWO sets of
                 * entries: [0]-[3] will refer to closest preceding symbol, and [4]-[7] will refer to the closest subsequent symbol.
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} [fNearest]
                 * @return {Array|null} where [0] == symbol name, [1] == symbol value, [2] == any annotation, and [3] == any associated comment
                 */
                Debugger.prototype.findSymbolAtAddr = function(dbgAddr, fNearest)
                {
                    var aSymbol = [];
                    var addr = this.getAddr(dbgAddr);
                    for (var iTable = 0; iTable < this.aSymbolTable.length; iTable++) {
                        var addrSymbol = this.aSymbolTable[iTable][0];
                        var sizeSymbol = this.aSymbolTable[iTable][1];
                        if (addr >= addrSymbol && addr < addrSymbol + sizeSymbol) {
                            var offset = dbgAddr.off;
                            var aOffsetPairs = this.aSymbolTable[iTable][3];
                            var fnComparePairs = function(p1, p2)
                            {
                                return p1[0] > p2[0]? 1 : p1[0] < p2[0]? -1 : 0;
                            };
                            var result = usr.binarySearch(aOffsetPairs, [offset], fnComparePairs);
                            if (result >= 0) {
                                this.returnSymbol(iTable, result, aSymbol);
                            }
                            else if (fNearest) {
                                result = ~result;
                                this.returnSymbol(iTable, result-1, aSymbol);
                                this.returnSymbol(iTable, result, aSymbol);
                            }
                            break;
                        }
                    }
                    return aSymbol;
                };
            
                /**
                 * returnSymbol(iTable, iOffset, aSymbol)
                 *
                 * Helper function for findSymbolAtAddr().
                 *
                 * @param {number} iTable
                 * @param {number} iOffset
                 * @param {Array} aSymbol is updated with the specified symbol, if it exists
                 */
                Debugger.prototype.returnSymbol = function(iTable, iOffset, aSymbol)
                {
                    var symbol = {};
                    var aOffsetPairs = this.aSymbolTable[iTable][3];
                    var offset = 0, sSymbol = null;
                    if (iOffset >= 0 && iOffset < aOffsetPairs.length) {
                        offset = aOffsetPairs[iOffset][0];
                        sSymbol = aOffsetPairs[iOffset][1];
                    }
                    if (sSymbol) {
                        symbol = this.aSymbolTable[iTable][2][sSymbol];
                        sSymbol = (sSymbol.charAt(0) == '.'? null : (symbol['l'] || sSymbol));
                    }
                    aSymbol.push(sSymbol);
                    aSymbol.push(offset);
                    aSymbol.push(symbol['a']);
                    aSymbol.push(symbol['c']);
                };
            
                /**
                 * doHelp()
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.doHelp = function()
                {
                    var s = "commands:";
                    for (var sCommand in Debugger.COMMANDS) {
                        s += '\n' + str.pad(sCommand, 7) + Debugger.COMMANDS[sCommand];
                    }
                    if (!this.checksEnabled()) s += "\nnote: frequency/history disabled if no exec breakpoints";
                    this.println(s);
                };
            
                /**
                 * doAssemble(asArgs)
                 *
                 * This always receives the complete argument array, where the order of the arguments is:
                 *
                 *      [0]: the assemble command (assumed to be "a")
                 *      [1]: the target address (eg, "200")
                 *      [2]: the operation code, aka instruction name (eg, "adc")
                 *      [3]: the operation mode operand, if any (eg, "14", "[1234]", etc)
                 *
                 * The Debugger enters "assemble mode" whenever only the first (or first and second) arguments are present.
                 * As long as "assemble mode is active, the user can omit the first two arguments on all later assemble commands
                 * until "assemble mode" is cancelled with an empty command line; the command processor automatically prepends "a"
                 * and the next available target address to the argument array.
                 *
                 * Entering "assemble mode" is optional; one could enter a series of fully-qualified assemble commands; eg:
                 *
                 *      a ff00 cld
                 *      a ff01 ldx 28
                 *      ...
                 *
                 * without ever entering "assemble mode", but of course, that requires more typing and doesn't take advantage
                 * of automatic target address advancement (see dbgAddrAssemble).
                 *
                 * NOTE: As the previous example implies, you can even assemble new instructions into ROM address space;
                 * as our setByte() function explains, the ROM write-notification handlers only refuse writes from the CPU.
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} asArgs is the complete argument array, beginning with the "a" command in asArgs[0]
                 */
                Debugger.prototype.doAssemble = function(asArgs)
                {
                    var dbgAddr = this.parseAddr(asArgs[1], Debugger.ADDR_CODE);
                    if (dbgAddr.off == null) return;
            
                    this.dbgAddrAssemble = dbgAddr;
                    if (asArgs[2] === undefined) {
                        this.println("begin assemble @" + this.hexAddr(dbgAddr));
                        this.fAssemble = true;
                        this.cpu.updateCPU();
                        return;
                    }
            
                    var aOpBytes = this.parseInstruction(asArgs[2], asArgs[3], dbgAddr);
                    if (aOpBytes.length) {
                        for (var i = 0; i < aOpBytes.length; i++) {
                            this.setByte(dbgAddr, aOpBytes[i], 1);
                        }
                        /*
                         * Since getInstruction() also updates the specified address, dbgAddrAssemble is automatically advanced.
                         */
                        this.println(this.getInstruction(this.dbgAddrAssemble));
                    }
                };
            
                /**
                 * doBreak(sCmd, sAddr)
                 *
                 * As the "help" output below indicates, the following breakpoint commands are supported:
                 *
                 *      bp [a]  set exec breakpoint on linear addr [a]
                 *      br [a]  set read breakpoint on linear addr [a]
                 *      bw [a]  set write breakpoint on linear addr [a]
                 *      bc [a]  clear breakpoint on linear addr [a] (use "*" for all breakpoints)
                 *      bl      list breakpoints
                 *
                 * to which we have recently added the following I/O breakpoint commands:
                 *
                 *      bi [p]  toggle input breakpoint on port [p] (use "*" for all input ports)
                 *      bo [p]  toggle output breakpoint on port [p] (use "*" for all output ports)
                 *
                 * These two new commands operate as toggles so that if "*" is used to trap all input (or output),
                 * you can also use these commands to NOT trap specific ports.
                 *
                 * @this {Debugger}
                 * @param {string} sCmd
                 * @param {string} [sAddr]
                 */
                Debugger.prototype.doBreak = function(sCmd, sAddr)
                {
                    var sParm = sCmd.charAt(1);
                    if (!sParm || sParm == "?") {
                        this.println("\nbreakpoint commands:");
                        this.println("\tbi [p]\ttoggle break on input port [p]");
                        this.println("\tbo [p]\ttoggle break on output port [p]");
                        this.println("\tbp [a]\tset exec breakpoint at addr [a]");
                        this.println("\tbr [a]\tset read breakpoint at addr [a]");
                        this.println("\tbw [a]\tset write breakpoint at addr [a]");
                        this.println("\tbc [a]\tclear breakpoint at addr [a]");
                        this.println("\tbl\tlist all breakpoints");
                        return;
                    }
                    if (sParm == "l") {
                        var cBreaks = 0;
                        cBreaks += this.listBreakpoints(this.aBreakExec);
                        cBreaks += this.listBreakpoints(this.aBreakRead);
                        cBreaks += this.listBreakpoints(this.aBreakWrite);
                        if (!cBreaks) this.println("no breakpoints");
                        return;
                    }
                    if (sAddr === undefined) {
                        this.println("missing breakpoint address");
                        return;
                    }
                    var dbgAddr = {};
                    if (sAddr != "*") {
                        dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
                        if (dbgAddr.off == null) return;
                    }
                    sAddr = (dbgAddr.off == null? sAddr : str.toHexWord(dbgAddr.off));
                    if (sParm == "c") {
                        if (dbgAddr.off == null) {
                            this.clearBreakpoints();
                            this.println("all breakpoints cleared");
                            return;
                        }
                        if (this.findBreakpoint(this.aBreakExec, dbgAddr, true))
                            return;
                        if (this.findBreakpoint(this.aBreakRead, dbgAddr, true))
                            return;
                        if (this.findBreakpoint(this.aBreakWrite, dbgAddr, true))
                            return;
                        this.println("breakpoint missing: " + this.hexAddr(dbgAddr));
                        return;
                    }
                    if (sParm == "i") {
                        this.println("breakpoint " + (this.bus.addPortInputBreak(dbgAddr.off)? "enabled" : "cleared") + ": port " + sAddr + " (input)");
                        return;
                    }
                    if (sParm == "o") {
                        this.println("breakpoint " + (this.bus.addPortOutputBreak(dbgAddr.off)? "enabled" : "cleared") + ": port " + sAddr + " (output)");
                        return;
                    }
                    if (dbgAddr.off == null) return;
                    if (sParm == "p") {
                        this.addBreakpoint(this.aBreakExec, dbgAddr);
                        return;
                    }
                    if (sParm == "r") {
                        this.addBreakpoint(this.aBreakRead, dbgAddr);
                        return;
                    }
                    if (sParm == "w") {
                        this.addBreakpoint(this.aBreakWrite, dbgAddr);
                        return;
                    }
                    this.println("unknown breakpoint command: " + sParm);
                };
            
                /**
                 * doClear(sCmd)
                 *
                 * @this {Debugger}
                 * @param {string} sCmd (eg, "cls" or "clear")
                 */
                Debugger.prototype.doClear = function(sCmd)
                {
                    /*
                     * TODO: There should be a clear() component method that the Control Panel overrides to perform this function.
                     */
                    if (this.controlPrint) this.controlPrint.value = "";
                };
            
                /**
                 * doDump(sCmd, sAddr, sLen)
                 *
                 * While sLen is interpreted as a number of bytes or words, it's converted to the appropriate number of lines,
                 * because we always display whole lines.  If sLen is omitted/undefined, then we default to 8 lines, regardless
                 * whether dumping bytes or words.
                 *
                 * Also, unlike sAddr, sLen is interpreted as a decimal number, unless a radix specifier is included (eg, "0x100");
                 * sLen also supports the DEBUG.COM-style syntax of a preceding "l" (eg, "l16").
                 *
                 * @this {Debugger}
                 * @param {string} sCmd
                 * @param {string|undefined} sAddr
                 * @param {string|undefined} sLen (if present, it can be preceded by an "l", which we simply ignore)
                 */
                Debugger.prototype.doDump = function(sCmd, sAddr, sLen)
                {
                    var m;
                    if (sAddr == "?") {
                        var sDumpers = "";
                        for (m in Debugger.MESSAGES) {
                            if (this.afnDumpers[m]) {
                                if (sDumpers) sDumpers += ",";
                                sDumpers = sDumpers + m;
                            }
                        }
                        sDumpers += ",state,symbols";
                        this.println("\ndump commands:");
                        this.println("\tdb [a] [#]    dump # bytes at address a");
                        this.println("\tdw [a] [#]    dump # words at address a");
                        this.println("\tdd [a] [#]    dump # dwords at address a");
                        this.println("\tdh [#]        dump # instructions prior");
                        if (BACKTRACK) this.println("\tdi [a]        dump backtrack info at address a");
                        if (sDumpers.length) this.println("dump extensions:\n\t" + sDumpers);
                        return;
                    }
                    if (sAddr == "state") {
                        this.println(this.cmp.powerOff(true));
                        return;
                    }
                    if (sAddr == "symbols") {
                        this.dumpSymbols();
                        return;
                    }
                    if (sCmd == "dh") {
                        this.dumpHistory(sAddr);
                        return;
                    }
                    if (sCmd == "ds") {     // transform a "ds" command into a "d desc" command
                        sCmd = 'd';
                        sLen = sAddr;
                        sAddr = "desc";
                    }
                    for (m in Debugger.MESSAGES) {
                        if (sAddr == m) {
                            var fnDumper = this.afnDumpers[m];
                            if (fnDumper) {
                                fnDumper(sLen);
                            } else {
                                this.println("no dump registered for " + sAddr);
                            }
                            return;
                        }
                    }
                    var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_DATA);
                    if (dbgAddr.off == null || dbgAddr.sel == null && dbgAddr.addr == null) return;
            
                    var sDump = "";
                    if (BACKTRACK && sCmd == "di") {
                        var addr = this.getAddr(dbgAddr);
                        sDump += '%' + str.toHex(addr) + ": ";
                        var sInfo = this.bus.getBackTrackInfoFromAddr(addr);
                        sDump += sInfo || "no information";
                    }
                    else {
                        var cLines = 0;
                        var cBytes = (sCmd == "dd"? 4 : (sCmd == "dw"? 2 : 1));
                        var cNumbers = (16 / cBytes)|0;
                        if (sLen) {
                            if (sLen.charAt(0) == "l") sLen = sLen.substr(1);
                            cLines = +sLen;
                            if (cLines) cLines = ((cLines + cNumbers - 1) / cNumbers)|0;
                        }
                        if (!cLines) cLines = 8;
                        for (var iLine = 0; iLine < cLines; iLine++) {
                            var data = 0, iByte = 0;
                            var sData = "", sChars = "";
                            sAddr = this.hexAddr(dbgAddr);
                            for (var i = 0; i < 16; i++) {
                                var b = this.getByte(dbgAddr, 1);
                                data |= (b << (iByte++ << 3));
                                if (iByte == cBytes) {
                                    sData += str.toHex(data, cBytes * 2);
                                    sData += (cBytes == 1? (i == 7? '-' : ' ') : "  ");
                                    data = iByte = 0;
                                }
                                sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                            }
                            if (sDump) sDump += "\n";
                            sDump += sAddr + "  " + sData + " " + sChars;
                        }
                    }
                    if (sDump) this.println(sDump);
                    this.dbgAddrNextData = dbgAddr;
                };
            
                /**
                 * doEdit(asArgs)
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} asArgs
                 */
                Debugger.prototype.doEdit = function(asArgs)
                {
                    var sAddr = asArgs[1];
                    if (sAddr === undefined) {
                        this.println("missing address");
                        return;
                    }
                    var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_DATA);
                    if (dbgAddr.off == null) return;
                    for (var i = 2; i < asArgs.length; i++) {
                        var b = str.parseInt(asArgs[i], 16);
                        if (b === undefined) {
                            this.println("unrecognized value: " + str.toHexByte(b));
                            break;
                        }
                        this.println("setting " + this.hexAddr(dbgAddr) + " to " + str.toHexByte(b));
                        this.setByte(dbgAddr, b, 1);
                    }
                };
            
                /**
                 * doFreqs(sParm)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sParm
                 */
                Debugger.prototype.doFreqs = function(sParm)
                {
                    if (sParm == "?") {
                        this.println("\nfrequency commands:");
                        this.println("\tclear\tclear all frequency counts");
                        return;
                    }
                    var i;
                    var cData = 0;
                    if (this.aaOpcodeCounts) {
                        if (sParm == "clear") {
                            for (i = 0; i < this.aaOpcodeCounts.length; i++)
                                this.aaOpcodeCounts[i] = [i, 0];
                            this.println("frequency data cleared");
                            cData++;
                        }
                        else if (sParm !== undefined) {
                            this.println("unknown frequency command: " + sParm);
                            cData++;
                        }
                        else {
                            var aaSortedOpcodeCounts = this.aaOpcodeCounts.slice();
                            aaSortedOpcodeCounts.sort(function(p, q) {
                                return q[1] - p[1];
                            });
                            for (i = 0; i < aaSortedOpcodeCounts.length; i++) {
                                var bOpcode = aaSortedOpcodeCounts[i][0];
                                var cFreq = aaSortedOpcodeCounts[i][1];
                                if (cFreq) {
                                    this.println((Debugger.INS_NAMES[this.aaOpDescs[bOpcode][0]] + "  ").substr(0, 5) + " (" + str.toHexByte(bOpcode) + "): " + cFreq + " times");
                                    cData++;
                                }
                            }
                        }
                    }
                    if (!cData) {
                        this.println("no frequency data available");
                    }
                };
            
                /**
                 * doHalt(sCount)
                 *
                 * If the CPU is running and no count is provided, we halt the CPU; otherwise we treat this as a history command.
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sCount is the number of instructions to rewind to (default is 10)
                 */
                Debugger.prototype.doHalt = function(sCount)
                {
                    if (this.aFlags.fRunning && sCount === undefined) {
                        this.println("halting");
                        this.stopCPU();
                        return;
                    }
                    this.dumpHistory(sCount);
                };
            
                /**
                 * doInfo(asArgs)
                 *
                 * Prints the contents of the Debugger's instruction trace buffer.
                 *
                 * Examples:
                 *
                 *      n shl
                 *      n shl on
                 *      n shl off
                 *      n dump 100
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} asArgs
                 * @return {boolean} true only if the instruction info command ("n") is supported
                 */
                Debugger.prototype.doInfo = function(asArgs)
                {
                    if (DEBUG) {
                        var sCategory = asArgs[1];
                        if (sCategory !== undefined) {
                            sCategory = sCategory.toUpperCase();
                        }
                        var sEnable = asArgs[2];
                        var fPrint = false;
                        if (sCategory == "DUMP") {
                            var sDump = "";
                            var cLines = (sEnable === undefined? -1 : +sEnable);
                            var i = this.iTraceBuffer;
                            do {
                                var s = this.aTraceBuffer[i++];
                                if (s !== undefined) {
                                    /*
                                     * The browser is MUCH happier if we buffer all the lines for one single enormous print
                                     *
                                     *      this.println(s);
                                     */
                                    sDump += (sDump? "\n" : "") + s;
                                    cLines--;
                                }
                                if (i >= this.aTraceBuffer.length)
                                    i = 0;
                            } while (cLines && i != this.iTraceBuffer);
                            if (!sDump) sDump = "nothing to dump";
                            this.println(sDump);
                            this.println("msPerYield: " + this.cpu.aCounts.msPerYield);
                            this.println("nCyclesPerBurst: " + this.cpu.aCounts.nCyclesPerBurst);
                            this.println("nCyclesPerYield: " + this.cpu.aCounts.nCyclesPerYield);
                            this.println("nCyclesPerVideoUpdate: " + this.cpu.aCounts.nCyclesPerVideoUpdate);
                            this.println("nCyclesPerStatusUpdate: " + this.cpu.aCounts.nCyclesPerStatusUpdate);
                        } else {
                            var fEnable = (sEnable == "on");
                            for (var prop in this.traceEnabled) {
                                var trace = Debugger.TRACE[prop];
                                if (sCategory === undefined || sCategory == "ALL" || sCategory == Debugger.INS_NAMES[trace.ins]) {
                                    if (fEnable !== undefined) {
                                        this.traceEnabled[prop] = fEnable;
                                    }
                                    this.println(Debugger.INS_NAMES[trace.ins] + trace.size + ": " + (this.traceEnabled[prop]? "on" : "off"));
                                    fPrint = true;
                                }
                            }
                            if (!fPrint) this.println("no match");
                        }
                        return true;
                    }
                    return false;
                };
            
                /**
                 * doInput(sPort)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sPort
                 */
                Debugger.prototype.doInput = function(sPort)
                {
                    if (!sPort || sPort == "?") {
                        this.println("\ninput commands:");
                        this.println("\ti [p]\tread port [p]");
                        /*
                         * TODO: Regarding this warning, consider adding an "unchecked" version of
                         * bus.checkPortInputNotify(), since all Debugger memory accesses are unchecked, too.
                         *
                         * All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
                         * but changing them all to be non-destructive would take time, and situations where you
                         * actually want to affect the hardware state are just as likely as not....
                         */
                        this.println("warning: port accesses can affect hardware state");
                        return;
                    }
                    var port = this.parseValue(sPort);
                    if (port !== undefined) {
                        var bIn = this.bus.checkPortInputNotify(port);
                        this.println(str.toHexWord(port) + ": " + str.toHexByte(bIn));
                    }
                };
            
                /**
                 * doList(sSymbol)
                 *
                 * @this {Debugger}
                 * @param {string} sSymbol
                 */
                Debugger.prototype.doList = function(sSymbol)
                {
                    var dbgAddr = this.parseAddr(sSymbol, Debugger.ADDR_CODE);
            
                    if (dbgAddr.off == null && dbgAddr.addr == null) return;
            
                    var addr = this.getAddr(dbgAddr);
                    sSymbol = sSymbol? (sSymbol + ": ") : "";
                    this.println(sSymbol + this.hexAddr(dbgAddr) + " (%" + str.toHex(addr, this.cchAddr) + ")");
            
                    var aSymbol = this.findSymbolAtAddr(dbgAddr, true);
                    if (aSymbol.length) {
                        var nDelta, sDelta;
                        if (aSymbol[0]) {
                            sDelta = "";
                            nDelta = dbgAddr.off - aSymbol[1];
                            if (nDelta) sDelta = " + " + str.toHexWord(nDelta);
                            this.println(aSymbol[0] + " (" + this.hexOffset(aSymbol[1], dbgAddr.sel) + ")" + sDelta);
                        }
                        if (aSymbol.length > 4 && aSymbol[4]) {
                            sDelta = "";
                            nDelta = aSymbol[5] - dbgAddr.off;
                            if (nDelta) sDelta = " - " + str.toHexWord(nDelta);
                            this.println(aSymbol[4] + " (" + this.hexOffset(aSymbol[5], dbgAddr.sel) + ")" + sDelta);
                        }
                    } else {
                        this.println("no symbols");
                    }
                };
            
                /**
                 * doLoad(asArgs)
                 *
                 * The format of this command mirrors the DOS DEBUG "L" command:
                 *
                 *      l [address] [drive #] [sector #] [# sectors]
                 *
                 * The only optional parameter is the last, which defaults to 1 sector if not specified.
                 *
                 * As a quick-and-dirty way of getting the current contents of a disk image as a JSON dump
                 * (which you can then save as .json disk image file), I also allow this command format:
                 *
                 *      l json [drive #]
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} asArgs
                 */
                Debugger.prototype.doLoad = function(asArgs)
                {
                    if (asArgs[0] == 'l' && asArgs[1] === undefined || asArgs[1] == "?") {
                        this.println("\nlist/load commands:");
                        this.println("\tl [address] [drive #] [sector #] [# sectors]");
                        this.println("\tln [address] lists symbol(s) nearest to address");
                        return;
                    }
            
                    if (asArgs[0] == "ln") {
                        this.doList(asArgs[1]);
                        return;
                    }
            
                    var fJSON = (asArgs[1] == "json");
                    var iDrive, iSector = 0, nSectors = 0;
                    var dbgAddr = (fJSON? {} : this.parseAddr(asArgs[1], Debugger.ADDR_DATA));
            
                    iDrive = this.parseValue(asArgs[2], "drive #");
                    if (iDrive === undefined) return;
                    if (!fJSON) {
                        iSector = this.parseValue(asArgs[3], "sector #");
                        if (iSector === undefined) return;
                        nSectors = this.parseValue(asArgs[4], "# of sectors");
                        if (nSectors === undefined) nSectors = 1;
                    }
            
                    /*
                     * We choose the disk controller very simplistically: FDC for drives 0 or 1, and HDC for drives 2
                     * and up, unless no HDC is present, in which case we assume FDC for all drive numbers.
                     *
                     * Both controllers must obviously support the same interfaces; ie, copyDrive(), seekDrive(),
                     * and readByte().  We also rely on the disk property to determine whether the drive is "loaded".
                     *
                     * In the case of the HDC, if the drive is valid, then by definition it is also "loaded", since an HDC
                     * drive and its disk are inseparable; it's certainly possible that its disk object may be empty at
                     * this point, but that will only affect whether the read succeeds or not.
                     */
                    var dc = this.fdc;
                    if (iDrive >= 2 && this.hdc) {
                        iDrive -= 2;
                        dc = this.hdc;
                    }
                    if (dc) {
                        var drive = dc.copyDrive(iDrive);
                        if (drive) {
                            if (drive.disk) {
                                if (fJSON) {
                                    /*
                                     * This is an interim solution to dumping disk images in JSON.  It has many problems, the
                                     * "biggest" being that the large disk images really need to be compressed first, because they
                                     * get "inflated" with use.  See the dump() method in the Disk component for more details.
                                     */
                                    this.println(drive.disk.toJSON());
                                    return;
                                }
                                if (dc.seekDrive(drive, iSector, nSectors)) {
                                    var cb = 0;
                                    var fAbort = false;
                                    var sAddr = this.hexAddr(dbgAddr);
                                    while (!fAbort && drive.nBytes-- > 0) {
                                        (function(dbg, dbgAddrCur) {
                                            dc.readByte(drive, function(b, fAsync) {
                                                if (b < 0) {
                                                    dbg.println("out of data at address " + dbg.hexAddr(dbgAddrCur));
                                                    fAbort = true;
                                                    return;
                                                }
                                                dbg.setByte(dbgAddrCur, b, 1);
                                                cb++;
                                            });
                                        }(this, dbgAddr));
                                    }
                                    this.println(cb + " bytes read at " + sAddr);
                                } else {
                                    this.println("sector " + iSector + " request out of range");
                                }
                            } else {
                                this.println("drive " + iDrive + " not loaded");
                            }
                        } else {
                            this.println("invalid drive: " + iDrive);
                        }
                    } else {
                        this.println("disk controller not present");
                    }
                };
            
                /**
                 * doMessages(asArgs)
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} asArgs
                 */
                Debugger.prototype.doMessages = function(asArgs)
                {
                    var m;
                    var fCriteria = null;
                    var sCategory = asArgs[1];
                    if (sCategory == "?") sCategory = undefined;
            
                    if (sCategory !== undefined) {
                        var bitsMessage = 0;
                        if (sCategory == "all") {
                            bitsMessage = (0xffffffff|0) & ~(Messages.HALT | Messages.KEYS | Messages.LOG);
                            sCategory = null;
                        } else if (sCategory == "on") {
                            fCriteria = true;
                            sCategory = null;
                        } else if (sCategory == "off") {
                            fCriteria = false;
                            sCategory = null;
                        } else {
                            if (sCategory == "keys") sCategory = "key";
                            if (sCategory == "kbd") sCategory = "keyboard";
                            for (m in Debugger.MESSAGES) {
                                if (sCategory == m) {
                                    bitsMessage = Debugger.MESSAGES[m];
                                    fCriteria = !!(this.bitsMessage & bitsMessage);
                                    break;
                                }
                            }
                            if (!bitsMessage) {
                                this.println("unknown message category: " + sCategory);
                                return;
                            }
                        }
                        if (bitsMessage) {
                            if (asArgs[2] == "on") {
                                this.bitsMessage |= bitsMessage;
                                fCriteria = true;
                            }
                            else if (asArgs[2] == "off") {
                                this.bitsMessage &= ~bitsMessage;
                                fCriteria = false;
                            }
                        }
                    }
            
                    /*
                     * Display those message categories that match the current criteria (on or off)
                     */
                    var n = 0;
                    var sCategories = "";
                    for (m in Debugger.MESSAGES) {
                        if (!sCategory || sCategory == m) {
                            var bitMessage = Debugger.MESSAGES[m];
                            var fEnabled = !!(this.bitsMessage & bitMessage);
                            if (fCriteria !== null && fCriteria != fEnabled) continue;
                            if (sCategories) sCategories += ",";
                            if (!(++n % 10)) sCategories += "\n\t";     // jshint ignore:line
                            if (m == "key") m = "keys";
                            sCategories += m;
                        }
                    }
            
                    if (sCategory === undefined) {
                        this.println("\nmessage commands:\n\tm [category] [on|off]\tturn categories on/off");
                    }
            
                    this.println((fCriteria !== null? (fCriteria? "messages on:  " : "messages off: ") : "message categories:\n\t") + (sCategories || "none"));
                };
            
                /**
                 * doExecOptions(asArgs)
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} asArgs
                 */
                Debugger.prototype.doExecOptions = function(asArgs)
                {
                    if (asArgs[1] === undefined || asArgs[1] == "?") {
                        this.println("\nexecution options:");
                        this.println("\tcs int #\tset checksum cycle interval to #");
                        this.println("\tcs start #\tset checksum cycle start count to #");
                        this.println("\tcs stop #\tset checksum cycle stop count to #");
                        this.println("\tsp #\t\tset speed multiplier to #");
                        return;
                    }
                    switch (asArgs[1]) {
                        case "cs":
                            var nCycles;
                            if (asArgs[3] !== undefined) nCycles = +asArgs[3];
                            switch (asArgs[2]) {
                                case "int":
                                    this.cpu.aCounts.nCyclesChecksumInterval = nCycles;
                                    break;
                                case "start":
                                    this.cpu.aCounts.nCyclesChecksumStart = nCycles;
                                    break;
                                case "stop":
                                    this.cpu.aCounts.nCyclesChecksumStop = nCycles;
                                    break;
                                default:
                                    this.println("unknown cs option");
                                    return;
                            }
                            if (nCycles !== undefined) {
                                this.cpu.resetChecksum();
                            }
                            this.println("checksums " + (this.cpu.aFlags.fChecksum? "enabled" : "disabled"));
                            break;
                        case "sp":
                            if (asArgs[2] !== undefined) {
                                this.cpu.setSpeed(+asArgs[2]);
                            }
                            this.println("target speed: " + this.cpu.getSpeedTarget() + " (" + this.cpu.getSpeed() + "x)");
                            break;
                        default:
                            this.println("unknown option: " + asArgs[1]);
                            break;
                    }
                };
            
                /**
                 * doOutput(sPort, sByte)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sPort
                 * @param {string|undefined} sByte (string representation of 1 byte)
                 */
                Debugger.prototype.doOutput = function(sPort, sByte)
                {
                    if (!sPort || sPort == "?") {
                        this.println("\noutput commands:");
                        this.println("\to [p] [b]\twrite byte [b] to port [p]");
                        /*
                         * TODO: Regarding this warning, consider adding an "unchecked" version of
                         * bus.checkPortOutputNotify(), since all Debugger memory accesses are unchecked, too.
                         *
                         * All port I/O handlers ARE aware when the Debugger is calling (addrFrom is undefined),
                         * but changing them all to be non-destructive would take time, and situations where you
                         * actually want to affect the hardware state are just as likely as not....
                         */
                        this.println("warning: port accesses can affect hardware state");
                        return;
                    }
                    var port = this.parseValue(sPort, "port #");
                    var bOut = this.parseValue(sByte);
                    if (port !== undefined && bOut !== undefined) {
                        this.bus.checkPortOutputNotify(port, bOut);
                        this.println(str.toHexWord(port) + ": " + str.toHexByte(bOut));
                    }
                };
            
                /**
                 * doRegisters(asArgs, fCompact)
                 *
                 * @this {Debugger}
                 * @param {Array.<string>} [asArgs]
                 * @param {boolean} [fCompact]
                 */
                Debugger.prototype.doRegisters = function(asArgs, fCompact)
                {
                    if (asArgs && asArgs[1] == "?") {
                        this.println("\nregister commands:");
                        this.println("\tr\t\tdisplay all registers");
                        this.println("\tr [target=#]\tmodify target register");
                        this.println("supported targets:");
                        this.println("\tall registers and flags V,D,I,S,Z,A,P,C");
                        return;
                    }
                    var fIns = true, fProt;
                    if (asArgs != null && asArgs.length > 1) {
                        var sReg = asArgs[1];
                        if (sReg == 'p') {
                            fProt = (this.cpu.model >= X86.MODEL_80286);
                        } else {
                         // fIns = false;
                            var sValue = null;
                            var i = sReg.indexOf("=");
                            if (i > 0) {
                                sValue = sReg.substr(i + 1);
                                sReg = sReg.substr(0, i);
                            }
                            else if (asArgs.length > 2) {
                                sValue = asArgs[2];
                            }
                            else {
                                this.println("missing value for " + asArgs[1]);
                                return;
                            }
                            var fValid = false;
                            var w = str.parseInt(sValue, 16);
                            if (!isNaN(w)) {
                                fValid = true;
                                var sRegMatch = sReg.toUpperCase();
                                if (sRegMatch.charAt(0) == 'E' && this.cchReg <= 4) {
                                    sRegMatch = null;
                                }
                                switch (sRegMatch) {
                                case "AL":
                                    this.cpu.regEAX = (this.cpu.regEAX & ~0xff) | (w & 0xff);
                                    break;
                                case "AH":
                                    this.cpu.regEAX = (this.cpu.regEAX & ~0xff00) | ((w << 8) & 0xff);
                                    break;
                                case "AX":
                                    this.cpu.regEAX = (this.cpu.regEAX & ~0xffff) | (w & 0xffff);
                                    break;
                                case "BL":
                                    this.cpu.regEBX = (this.cpu.regEBX & ~0xff) | (w & 0xff);
                                    break;
                                case "BH":
                                    this.cpu.regEBX = (this.cpu.regEBX & ~0xff00) | ((w << 8) & 0xff);
                                    break;
                                case "BX":
                                    this.cpu.regEBX = (this.cpu.regEBX & ~0xffff) | (w & 0xffff);
                                    break;
                                case "CL":
                                    this.cpu.regECX = (this.cpu.regECX & ~0xff) | (w & 0xff);
                                    break;
                                case "CH":
                                    this.cpu.regECX = (this.cpu.regECX & ~0xff00) | ((w << 8) & 0xff);
                                    break;
                                case "CX":
                                    this.cpu.regECX = (this.cpu.regECX & ~0xffff) | (w & 0xffff);
                                    break;
                                case "DL":
                                    this.cpu.regEDX = (this.cpu.regEDX & ~0xff) | (w & 0xff);
                                    break;
                                case "DH":
                                    this.cpu.regEDX = (this.cpu.regEDX & ~0xff00) | ((w << 8) & 0xff);
                                    break;
                                case "DX":
                                    this.cpu.regEDX = (this.cpu.regEDX & ~0xffff) | (w & 0xffff);
                                    break;
                                case "SP":
                                    this.cpu.setSP((this.cpu.getSP() & ~0xffff) | (w & 0xffff));
                                    break;
                                case "BP":
                                    this.cpu.regEBP = (this.cpu.regEBP & ~0xffff) | (w & 0xffff);
                                    break;
                                case "SI":
                                    this.cpu.regESI = (this.cpu.regESI & ~0xffff) | (w & 0xffff);
                                    break;
                                case "DI":
                                    this.cpu.regEDI = (this.cpu.regEDI & ~0xffff) | (w & 0xffff);
                                    break;
                                case "DS":
                                    this.cpu.setDS(w);
                                    break;
                                case "ES":
                                    this.cpu.setES(w);
                                    break;
                                case "SS":
                                    this.cpu.setSS(w);
                                    break;
                                case "CS":
                                 // fIns = true;
                                    this.cpu.setCS(w);
                                    this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                                    break;
                                case "IP":
                                 // fIns = true;
                                    this.cpu.setIP(w);
                                    this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                                    break;
                                /*
                                 * I used to alias "PC" to "IP", until I discovered that early (perhaps ALL) versions of
                                 * DEBUG.COM treat "PC" as an alias for the 16-bit flags register.  I, of course, prefer "PS".
                                 */
                                case "PC":
                                case "PS":
                                    this.cpu.setPS(w);
                                    break;
                                case "C":
                                    if (w) this.cpu.setCF(); else this.cpu.clearCF();
                                    break;
                                case "P":
                                    if (w) this.cpu.setPF(); else this.cpu.clearPF();
                                    break;
                                case "A":
                                    if (w) this.cpu.setAF(); else this.cpu.clearAF();
                                    break;
                                case "Z":
                                    if (w) this.cpu.setZF(); else this.cpu.clearZF();
                                    break;
                                case "S":
                                    if (w) this.cpu.setSF(); else this.cpu.clearSF();
                                    break;
                                case "I":
                                    if (w) this.cpu.setIF(); else this.cpu.clearIF();
                                    break;
                                case "D":
                                    if (w) this.cpu.setDF(); else this.cpu.clearDF();
                                    break;
                                case "V":
                                    if (w) this.cpu.setOF(); else this.cpu.clearOF();
                                    break;
                                default:
                                    var fUnknown = true;
                                    if (this.cpu.model >= X86.MODEL_80286) {
                                        fUnknown = false;
                                        switch(sRegMatch){
                                        case "MS":
                                            this.cpu.setMSW(w);
                                            break;
                                        case "TR":
                                            if (this.cpu.segTSS.load(w, true) === X86.ADDR_INVALID) {
                                                fValid = false;
                                            }
                                            break;
                                        /*
                                         * TODO: Add support for GDTR (addr and limit), IDTR (addr and limit), and perhaps
                                         * even the ability to edit descriptor information associated with each segment register.
                                         */
                                        default:
                                            fUnknown = true;
                                            if (I386 && this.cpu.model >= X86.MODEL_80386) {
                                                fUnknown = false;
                                                switch(sRegMatch){
                                                case "EAX":
                                                    this.cpu.regEAX = w;
                                                    break;
                                                case "EBX":
                                                    this.cpu.regEBX = w;
                                                    break;
                                                case "ECX":
                                                    this.cpu.regECX = w;
                                                    break;
                                                case "EDX":
                                                    this.cpu.regEDX = w;
                                                    break;
                                                case "ESP":
                                                    this.cpu.setSP(w);
                                                    break;
                                                case "EBP":
                                                    this.cpu.regEBP = w;
                                                    break;
                                                case "ESI":
                                                    this.cpu.regESI = w;
                                                    break;
                                                case "EDI":
                                                    this.cpu.regEDI = w;
                                                    break;
                                                case "FS":
                                                    this.cpu.setFS(w);
                                                    break;
                                                case "GS":
                                                    this.cpu.setGS(w);
                                                    break;
                                                case "CR0":
                                                    this.cpu.regCR0 = w;
                                                    break;
                                                case "CR2":
                                                    this.cpu.regCR2 = w;
                                                    break;
                                                case "CR3":
                                                    this.cpu.regCR3 = w;
                                                    break;
                                                /*
                                                 * TODO: Add support for DR0-DR7 and TR6-TR7.
                                                 */
                                                default:
                                                    fUnknown = true;
                                                    break;
                                                }
                                            }
                                            break;
                                        }
                                    }
                                    if (fUnknown) {
                                        this.println("unknown register: " + sReg);
                                        return;
                                    }
                                }
                            }
                            if (!fValid) {
                                this.println("invalid value: " + sValue);
                                return;
                            }
                            this.cpu.updateCPU();
                            this.println("\nupdated registers:");
                            fCompact = true;
                        }
                    }
            
                    this.println((fCompact? '' : '\n') + this.getRegDump(fProt));
            
                    if (fIns) {
                        this.dbgAddrNextCode = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                        this.doUnassemble(this.hexAddr(this.dbgAddrNextCode));
                    }
                };
            
                /**
                 * doRun(sAddr)
                 *
                 * @this {Debugger}
                 * @param {string} sAddr
                 */
                Debugger.prototype.doRun = function(sAddr)
                {
                    if (sAddr !== undefined) {
                        var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
                        if (dbgAddr.off == null) return;
                        this.setTempBreakpoint(dbgAddr);
                    }
                    if (!this.runCPU(true)) {
                        this.println('cpu busy, "g" command ignored');
                    }
                };
            
                /**
                 * doProcStep(sCmd)
                 *
                 * @this {Debugger}
                 * @param {string} [sCmd] "p" or "pr"
                 */
                Debugger.prototype.doProcStep = function(sCmd)
                {
                    var fCallStep = true;
                    var fRegs = (sCmd == "pr"? 1 : 0);
                    /*
                     * Set up the value for this.fProcStep (ie, 1 or 2) depending on whether the user wants
                     * a subsequent register dump ("pr") or not ("p").
                     */
                    var fProcStep = 1 + fRegs;
                    if (!this.fProcStep) {
                        var fPrefix;
                        var fRepeat = false;
                        var dbgAddr = this.newAddr(this.cpu.getIP(), this.cpu.getCS());
                        do {
                            fPrefix = false;
                            var bOpcode = this.getByte(dbgAddr);
                            switch (bOpcode) {
                            case X86.OPCODE.ES:
                            case X86.OPCODE.CS:
                            case X86.OPCODE.SS:
                            case X86.OPCODE.DS:
                            case X86.OPCODE.FS:     // I386 only
                            case X86.OPCODE.GS:     // I386 only
                            case X86.OPCODE.OS:     // I386 only
                            case X86.OPCODE.AS:     // I386 only
                            case X86.OPCODE.LOCK:
                                this.incAddr(dbgAddr, 1);
                                fPrefix = true;
                                break;
                            case X86.OPCODE.INT3:
                            case X86.OPCODE.INTO:
                                this.fProcStep = fProcStep;
                                this.incAddr(dbgAddr, 1);
                                break;
                            case X86.OPCODE.INTn:
                            case X86.OPCODE.LOOPNZ:
                            case X86.OPCODE.LOOPZ:
                            case X86.OPCODE.LOOP:
                                this.fProcStep = fProcStep;
                                this.incAddr(dbgAddr, 2);
                                break;
                            case X86.OPCODE.CALL:
                                if (fCallStep) {
                                    this.fProcStep = fProcStep;
                                    this.incAddr(dbgAddr, 3);
                                }
                                break;
                            case X86.OPCODE.CALLF:
                                if (fCallStep) {
                                    this.fProcStep = fProcStep;
                                    this.incAddr(dbgAddr, 5);
                                }
                                break;
                            case X86.OPCODE.GRP4W:
                                if (fCallStep) {
                                    var w = this.getWord(dbgAddr) & X86.OPCODE.CALLMASK;
                                    this.fProcStep = ((w == X86.OPCODE.CALLW || w == X86.OPCODE.CALLFDW)? fProcStep : 0);
                                }
                                break;
                            case X86.OPCODE.REPZ:
                            case X86.OPCODE.REPNZ:
                                this.incAddr(dbgAddr, 1);
                                fRepeat = fPrefix = true;
                                break;
                            case X86.OPCODE.INSB:
                            case X86.OPCODE.INSW:
                            case X86.OPCODE.OUTSB:
                            case X86.OPCODE.OUTSW:
                            case X86.OPCODE.MOVSB:
                            case X86.OPCODE.MOVSW:
                            case X86.OPCODE.CMPSB:
                            case X86.OPCODE.CMPSW:
                            case X86.OPCODE.STOSB:
                            case X86.OPCODE.STOSW:
                            case X86.OPCODE.LODSB:
                            case X86.OPCODE.LODSW:
                            case X86.OPCODE.SCASB:
                            case X86.OPCODE.SCASW:
                                if (fRepeat) {
                                    this.fProcStep = fProcStep;
                                    this.incAddr(dbgAddr, 1);
                                }
                                break;
                            default:
                                break;
                            }
                        } while (fPrefix);
            
                        if (this.fProcStep) {
                            this.setTempBreakpoint(dbgAddr);
                            if (!this.runCPU()) {
                                this.cpu.setFocus();
                                this.fProcStep = 0;
                            }
                            /*
                             * A successful run will ultimately call stop(), which will in turn call clearTempBreakpoint(),
                             * which will clear fProcStep, so there's your assurance that fProcStep will be reset.  Now we may
                             * have stopped for reasons unrelated to the temporary breakpoint, but that's OK.
                             */
                        } else {
                            this.doStep(fRegs? "tr" : "t");
                        }
                    } else {
                        this.println("step in progress");
                    }
                };
            
                /**
                 * getCall(dbgAddr, fFar)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} [fFar]
                 * @return {string|null} CALL instruction at or near dbgAddr, or null if none
                 */
                Debugger.prototype.getCall = function(dbgAddr, fFar)
                {
                    var sCall = null;
                    var off = dbgAddr.off;
                    var offOrig = off;
                    for (var n = 1; n <= 6; n++) {
                        if (n > 2) {
                            dbgAddr.off = off;
                            dbgAddr.addr = null;
                            var s = this.getInstruction(dbgAddr);
                            if (s.indexOf("CALL") > 0 || fFar && s.indexOf("INT") > 0) {
                                sCall = s;
                                break;
                            }
                        }
                        if (!--off) break;
                    }
                    dbgAddr.off = offOrig;
                    return sCall;
                };
            
                /**
                 * doStackTrace()
                 *
                 * @this {Debugger}
                 */
                Debugger.prototype.doStackTrace = function()
                {
                    var nFrames = 10, cFrames = 0;
                    var selCode = this.cpu.segCS.sel;
                    var dbgAddrCall = this.newAddr();
                    var dbgAddrStack = this.newAddr(this.cpu.getSP(), this.cpu.getSS());
                    this.println("stack trace for " + this.hexAddr(dbgAddrStack));
                    while (cFrames < nFrames) {
                        var sCall = null, cTests = 256;
                        while ((dbgAddrStack.off >>> 0) < (this.cpu.regLSPLimit >>> 0)) {
                            dbgAddrCall.off = this.getWord(dbgAddrStack, true);
                            /*
                             * Because we're using the auto-increment feature of getWord(), and because that will automatically
                             * wrap the offset around the end of the segment, we must also check the addr property to detect the wrap.
                             */
                            if (dbgAddrStack.addr == null || !cTests--) break;
                            dbgAddrCall.sel = selCode;
                            sCall = this.getCall(dbgAddrCall);
                            if (sCall) {
                                break;
                            }
                            dbgAddrCall.sel = this.getWord(dbgAddrStack);
                            sCall = this.getCall(dbgAddrCall, true);
                            if (sCall) {
                                selCode = this.getWord(dbgAddrStack, true);
                                /*
                                 * It's not strictly necessary that we skip over the flags word that's pushed as part of any INT
                                 * instruction, but it reduces the risk of misinterpreting it as a return address on the next iteration.
                                 */
                                if (sCall.indexOf("INT") > 0) this.getWord(dbgAddrStack, true);
                                break;
                            }
                        }
                        if (!sCall) break;
                        sCall = str.pad(sCall, 50) + ";stack=" + this.hexAddr(dbgAddrStack) + " return=" + this.hexAddr(dbgAddrCall);
                        this.println(sCall);
                        cFrames++;
                    }
                    if (!cFrames) this.println("no return addresses found");
                };
            
                /**
                 * doStep(sCmd, sCount)
                 *
                 * @this {Debugger}
                 * @param {string} [sCmd] "t" or "tr"
                 * @param {string} [sCount] # of instructions to step
                 */
                Debugger.prototype.doStep = function(sCmd, sCount)
                {
                    var dbg = this;
                    var fRegs = (sCmd == "tr");
                    var count = (sCount != null? +sCount : 1);
                    var nCycles = (count == 1? 0 : 1);
                    web.onCountRepeat(
                        count,
                        function onCountStep() {
                            return dbg.setBusy(true) && dbg.stepCPU(nCycles, fRegs, false);
                        },
                        function onCountStepComplete() {
                            /*
                             * We explicitly called stepCPU() with fUpdateCPU === false, because repeatedly
                             * calling updateCPU() can be very slow, especially when fDisplayLiveRegs is true,
                             * so once the repeat count has been exhausted, we must perform a final updateCPU().
                             */
                            dbg.cpu.updateCPU();
                            dbg.setBusy(false);
                        }
                    );
                };
            
                /**
                 * initAddrSize(dbgAddr, fNonPrefix)
                 *
                 * @this {Debugger}
                 * @param {{DbgAddr}} dbgAddr
                 * @param {boolean} fNonPrefix
                 */
                Debugger.prototype.initAddrSize = function(dbgAddr, fNonPrefix)
                {
                    /*
                     * Use dbgAddr.fOverride to record whether we previously processed any OPERAND or ADDRESS overrides.
                     */
                    dbgAddr.fOverride = (dbgAddr.fData32 || dbgAddr.fAddr32);
                    /*
                     * For proper disassembly of instructions preceded by an OPERAND (0x66) size prefix, we set
                     * dbgAddr.fData32 to true whenever the operand size is 32-bit; similarly, for an ADDRESS (0x67)
                     * size prefix, we set dbgAddr.fAddr32 to true whenever the address size is 32-bit.  Initially,
                     * both fields must be set to match the size of the current code segment.
                     */
                    if (fNonPrefix) {
                        dbgAddr.fData32 = (this.cpu.segCS.dataSize == 4);
                        dbgAddr.fAddr32 = (this.cpu.segCS.addrSize == 4);
                    }
                    /*
                     * We also use dbgAddr.fComplete to record whether the caller (ie, getInstruction()) is reporting that
                     * it processed a complete instruction (ie, a non-prefix) or not.
                     */
                    dbgAddr.fComplete = fNonPrefix;
                };
            
                /**
                 * isStringIns(bOpcode)
                 *
                 * @this {Debugger}
                 * @param {number} bOpcode
                 * @return {boolean} true if string instruction, false if not
                 */
                Debugger.prototype.isStringIns = function(bOpcode)
                {
                    return (bOpcode >= X86.OPCODE.MOVSB && bOpcode <= X86.OPCODE.CMPSW || bOpcode >= X86.OPCODE.STOSB && bOpcode <= X86.OPCODE.SCASW);
                };
            
                /**
                 * doUnassemble(sAddr, sAddrEnd, n)
                 *
                 * @this {Debugger}
                 * @param {string} [sAddr]
                 * @param {string} [sAddrEnd]
                 * @param {number} [n]
                 */
                Debugger.prototype.doUnassemble = function(sAddr, sAddrEnd, n)
                {
                    var dbgAddr = this.parseAddr(sAddr, Debugger.ADDR_CODE);
                    if (dbgAddr.off == null) return;
            
                    if (n === undefined) n = 1;
                    var dbgAddrEnd = this.newAddr(this.maskReg, dbgAddr.sel, this.bus.nBusLimit);
            
                    var cb = 0x100;
                    if (sAddrEnd !== undefined) {
            
                        dbgAddrEnd = this.parseAddr(sAddrEnd, Debugger.ADDR_CODE);
                        if (dbgAddrEnd.off == null || dbgAddrEnd.off < dbgAddr.off) return;
            
                        cb = dbgAddrEnd.off - dbgAddr.off;
                        if (!DEBUG && cb > 0x100) {
                            /*
                             * Limiting the amount of disassembled code to 256 bytes in non-DEBUG builds is partly to
                             * prevent the user from wedging the browser by dumping too many lines, but also a recognition
                             * that, in non-DEBUG builds, this.println() keeps print output buffer truncated to 8Kb anyway.
                             */
                            this.println("range too large");
                            return;
                        }
                        n = -1;
                    }
            
                    var fBlank = (dbgAddr.off != this.dbgAddrNextCode.off);
            
                    var cLines = 0;
                    this.initAddrSize(dbgAddr, true);
            
                    while (cb > 0 && n--) {
            
                        var bOpcode = this.getByte(dbgAddr);
                        var addr = dbgAddr.addr;
                        var nSequence = (this.isBusy(false) || this.fProcStep)? this.nCycles : null;
                        var sComment = (nSequence != null? "cycles" : null);
                        var aSymbol = this.findSymbolAtAddr(dbgAddr);
            
                        if (aSymbol[0]) {
                            var sLabel = aSymbol[0] + ":";
                            fBlank = false;
                            if (aSymbol[2]) sLabel += " " + aSymbol[2];
                            this.println(sLabel);
                        }
            
                        if (fBlank) this.println();
            
                        if (aSymbol[3]) {
                            sComment = aSymbol[3];
                            nSequence = null;
                        }
            
                        var sIns = this.getInstruction(dbgAddr, sComment, nSequence);
            
                        /*
                         * If getInstruction() reported that it did not yet process a complete instruction (via dbgAddr.fComplete),
                         * then bump the instruction count by one, so that we display one more line (and hopefully the complete
                         * instruction).
                         */
                        if (!dbgAddr.fComplete && !n) n++;
            
                        this.println(sIns);
                        this.dbgAddrNextCode = dbgAddr;
                        cb -= dbgAddr.addr - addr;
                        fBlank = false;
                        cLines++;
                    }
                };
            
                /**
                 * parseCommand(sCmd, fSave)
                 *
                 * @this {Debugger}
                 * @param {string|undefined} sCmd
                 * @param {boolean} [fSave] is true to save the command, false if not
                 * @return {Array.<string>}
                 */
                Debugger.prototype.parseCommand = function(sCmd, fSave)
                {
                    if (fSave) {
                        if (!sCmd) {
                            sCmd = this.aPrevCmds[this.iPrevCmd+1];
                        } else {
                            if (this.iPrevCmd < 0 && this.aPrevCmds.length) {
                                this.iPrevCmd = 0;
                            }
                            if (this.iPrevCmd < 0 || sCmd != this.aPrevCmds[this.iPrevCmd]) {
                                this.aPrevCmds.splice(0, 0, sCmd);
                                this.iPrevCmd = 0;
                            }
                            this.iPrevCmd--;
                        }
                    }
                    var a = (sCmd? sCmd.split(sCmd.indexOf('|') >= 0? '|' : ';') : ['']);
                    for (var s in a) {
                        a[s] = str.trim(a[s]);
                    }
                    return a;
                };
            
                /**
                 * doCommand(sCmd, fQuiet)
                 *
                 * @this {Debugger}
                 * @param {string} sCmd
                 * @param {boolean} [fQuiet]
                 * @return {boolean} true if command processed, false if unrecognized
                 */
                Debugger.prototype.doCommand = function(sCmd, fQuiet)
                {
                    var result = true;
            
                    try {
                        if (!sCmd.length) {
                            if (this.fAssemble) {
                                this.println("ended assemble @" + this.hexAddr(this.dbgAddrAssemble));
                                this.dbgAddrNextCode = this.dbgAddrAssemble;
                                this.fAssemble = false;
                            } else {
                                sCmd = '?';
                            }
                        }
            
                        sCmd = sCmd.toLowerCase();
            
                        /*
                         * I'm going to try relaxing the !isBusy() requirement for doCommand(), to maximize our
                         * ability to issue Debugger commands externally.
                         */
                        if (this.isReady() /* && !this.isBusy(true) */ && sCmd.length > 0) {
            
                            if (this.fAssemble) {
                                sCmd = "a " + this.hexAddr(this.dbgAddrAssemble) + " " + sCmd;
                            }
                            else {
                                /*
                                 * Process any "whole" commands here first (eg, "debug", "nodebug", "reset", etc.)
                                 *
                                 * For all other commands, if they lack a space between the command and argument portions,
                                 * insert a space before the first non-alpha character, so that split() will have the desired effect.
                                 */
                                if (!COMPILED) {
                                    if (sCmd == "debug") {
                                        window.DEBUG = true;
                                        this.println("DEBUG checks on");
                                        return true;
                                    }
                                    else if (sCmd == "nodebug") {
                                        window.DEBUG = false;
                                        this.println("DEBUG checks off");
                                        return true;
                                    }
                                }
            
                                var ch, ch0, i;
                                switch (sCmd) {
                                case "reset":
                                    if (this.cmp) this.cmp.reset();
                                    return true;
                                case "ver":
                                    this.println((APPNAME || "PCjs") + " version " + APPVERSION + " (" + this.cpu.model + (COMPILED? ",RELEASE" : (DEBUG? ",DEBUG" : ",NODEBUG")) + (PREFETCH? ",PREFETCH" : ",NOPREFETCH") + (TYPEDARRAYS? ",TYPEDARRAYS" : (FATARRAYS? ",FATARRAYS" : ",LONGARRAYS")) + (BACKTRACK? ",BACKTRACK" : ",NOBACKTRACK") + ")");
                                    return true;
                                default:
                                    ch0 = sCmd.charAt(0);
                                    for (i = 1; i < sCmd.length; i++) {
                                        ch = sCmd.charAt(i);
                                        if (ch == " ") break;
                                        if (ch0 == "r" || ch < "a" || ch > "z") {
                                            sCmd = sCmd.substring(0, i) + " " + sCmd.substring(i);
                                            break;
                                        }
                                    }
                                    break;
                                }
                            }
            
                            var asArgs = sCmd.split(" ");
                            switch (asArgs[0].charAt(0)) {
                            case "a":
                                this.doAssemble(asArgs);
                                break;
                            case "b":
                                this.doBreak(asArgs[0], asArgs[1]);
                                break;
                            case "c":
                                this.doClear(asArgs[0]);
                                break;
                            case "d":
                                this.doDump(asArgs[0], asArgs[1], asArgs[2]);
                                break;
                            case "e":
                                this.doEdit(asArgs);
                                break;
                            case "f":
                                this.doFreqs(asArgs[1]);
                                break;
                            case "g":
                                this.doRun(asArgs[1]);
                                break;
                            case "h":
                                this.doHalt(asArgs[1]);
                                break;
                            case "i":
                                this.doInput(asArgs[1]);
                                break;
                            case "k":
                                this.doStackTrace();
                                break;
                            case "l":
                                this.doLoad(asArgs);
                                break;
                            case "m":
                                this.doMessages(asArgs);
                                break;
                            case "o":
                                this.doOutput(asArgs[1], asArgs[2]);
                                break;
                            case "p":
                            case "pr":
                                this.doProcStep(asArgs[0]);
                                break;
                            case "r":
                                this.doRegisters(asArgs);
                                break;
                            case "t":
                            case "tr":
                                this.doStep(asArgs[0], asArgs[1]);
                                break;
                            case "u":
                                this.doUnassemble(asArgs[1], asArgs[2], 8);
                                break;
                            case "x":
                                this.doExecOptions(asArgs);
                                break;
                            case "?":
                                this.doHelp();
                                break;
                            case "n":
                                if (this.doInfo(asArgs)) break;
                                /* falls through */
                            default:
                                if (!fQuiet) this.println("unknown command: " + sCmd);
                                result = false;
                                break;
                            }
                        }
                    } catch(e) {
                        this.println("debugger error: " + (e.stack || e.message));
                        result = false;
                    }
                    return result;
                };
            
                /**
                 * Debugger.init()
                 *
                 * This function operates on every HTML element of class "debugger", extracting the
                 * JSON-encoded parameters for the Debugger constructor from the element's "data-value"
                 * attribute, invoking the constructor to create a Debugger component, and then binding
                 * any associated HTML controls to the new component.
                 */
                Debugger.init = function()
                {
                    var aeDbg = Component.getElementsByClass(window.document, PCJSCLASS, "debugger");
                    for (var iDbg = 0; iDbg < aeDbg.length; iDbg++) {
                        var eDbg = aeDbg[iDbg];
                        var parmsDbg = Component.getComponentParms(eDbg);
                        var dbg = new Debugger(parmsDbg);
                        Component.bindComponentControls(dbg, eDbg, PCJSCLASS);
                    }
                };
            
                /*
                 * Initialize every Debugger module on the page (as IF there's ever going to be more than one ;-))
                 */
                web.onInit(Debugger.init);
            
            }   // endif DEBUGGER
            
            if (typeof module !== 'undefined') module.exports = Debugger;
            
          • defines.js
            /**
             * @fileoverview PCjs-specific compile-time definitions.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-08
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /**
             * @define {string}
             */
            var PCJSCLASS = "pcjs";         // this @define is the default application class (formerly APPCLASS) to use for PCjs
            
            /**
             * @define {boolean}
             *
             * WARNING: DEBUGGER needs to accurately reflect whether or not the Debugger component is (or will be) loaded.
             * In the compiled case, we rely on the Closure Compiler to override DEBUGGER as appropriate.  When it's *false*,
             * nearly all of debugger.js will be conditionally removed by the compiler, reducing it to little more than a
             * "type skeleton", which also solves some type-related warnings we would otherwise have if we tried to remove
             * debugger.js from the compilation process altogether.
             *
             * However, when we're in "development mode" and running uncompiled code in debugger-less configurations,
             * I would like to skip loading debugger.js altogether.  When doing that, we must ALSO arrange for an additional file
             * (nodebugger.js) to be loaded immediately after this file, which *explicitly* overrides DEBUGGER with *false*.
             */
            var DEBUGGER = true;            // this @define is overridden by the Closure Compiler to remove Debugger-related support
            
            /**
             * @define {boolean}
             *
             * PREFETCH enables the use of a prefetch queue.
             *
             * See the Bus component for details.
             */
            var PREFETCH = false;
            
            /**
             * @define {boolean}
             *
             * FATARRAYS is a Closure Compiler compile-time option that allocates an Array of numbers for every Memory block,
             * where each a number represents ONE byte; very wasteful, but potentially slightly faster.
             *
             * See the Memory component for details.
             */
            var FATARRAYS = false;
            
            /**
             * TYPEDARRAYS enables use of typed arrays for Memory blocks.  This used to be a compile-time-only option, but I've
             * added Memory access functions for typed arrays (see Memory.afnTypedArray), so support can be enabled dynamically.
             *
             * See the Memory component for details.
             */
            var TYPEDARRAYS = (typeof ArrayBuffer !== 'undefined');
            
            /**
             * @define {boolean}
             *
             * BACKTRACK enables backtracking: a mechanism that allows us to tag every byte of incoming data and follow the
             * flow of that data.
             *
             * This is set to !COMPILED, disabling backtracking in all compiled versions, but we may eventually set it to
             * match the DEBUGGER setting -- unless it slows down machines using the built-in Debugger too much, in which case
             * we'll have to rethink that choice OR provide a Debugger command that dynamically enables/disables as much of
             * the backtracking support as possible.
             */
            var BACKTRACK = !COMPILED;
            
            /**
             * @define {boolean}
             *
             * SAMPLER enables instruction sampling (a work-in-progress).  This was used briefly as an internal debugging aid,
             * to periodically record LIP values in a fixed-length sampling buffer, halting execution once the sampling buffer
             * was full, and then compare those sampled LIP values to corresponding LIP values on subsequent runs, to look
             * for deviations.  In theory, every run is supposed to be absolutely identical, even if you interrupt execution
             * with the Debugger or enable/disable different sets of messages, but in practice, that's hard to guarantee.
             */
            var SAMPLER = false;
            
            /**
             * @define {boolean}
             *
             * BUGS_8086 enables support for known 8086 bugs.  It's turned off by default, because 1) it adds overhead, and
             * 2) it's hard to imagine any software actually being dependent on any of the bugs covered by this (eg, the failure
             * to properly restart string instructions with multiple prefixes, or the failure to inhibit hardware interrupts
             * following SS segment loads).
             */
            var BUGS_8086 = false;
            
            /**
             * @define {boolean}
             *
             * I386 enables 80386 support.  My preference continues to be one "binary" that supports all implemented CPUs, but
             * I'm providing this to enable a slimmed-down binary, at least until 80386 support is actually finished; at the
             * moment, there's just a lot of scaffolding that bloats the compiled version without adding any real functionality.
             */
            var I386 = true;
            
            /**
             * @define {boolean}
             *
             * COMPAQ386 enables Compaq DeskPro 386 support.
             */
            var COMPAQ386 = true;
            
            /**
             * @define {boolean}
             *
             * PAGEBLOCKS enables 80386 paging support with assistance from the Bus component.  This affects how the Bus component
             * defines physical memory parameters for a 32-bit bus.  With the 8086 and 80286 processors, the Bus component was free
             * to choose any block size for physical memory allocations that made sense for the bus width (eg, 4Kb blocks for a
             * 20-bit bus, or 16Kb blocks for 24-bit bus).
             *
             * However, for the 80386 processor, it makes more sense to choose a block size that matches the page size (ie, 4Kb),
             * because then we have the option of altering the address-to-memory mapping for any block to match whatever page table
             * mapping is in effect for that address, if any, without requiring another layer of address translation.
             */
            var PAGEBLOCKS = I386;
            
            if (typeof module !== 'undefined') {
                global.PCJSCLASS = PCJSCLASS;
                global.DEBUGGER = DEBUGGER;
                global.PREFETCH = PREFETCH;
                global.FATARRAYS = FATARRAYS;
                global.TYPEDARRAYS = TYPEDARRAYS;
                global.BACKTRACK = BACKTRACK;
                global.SAMPLER = SAMPLER;
                global.BUGS_8086 = BUGS_8086;
                global.I386 = I386;
                global.COMPAQ386 = COMPAQ386;
                global.PAGEBLOCKS = PAGEBLOCKS;
                /*
                 * TODO: When we're "required" by Node, should we return anything via module.exports?
                 */
            }
            
          • disk.js
            /**
             * @fileoverview Implements disk image support for both FDC and HDC.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Nov-26
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            /*
             *  The Disk component provides methods for:
             *
             *      1) creating an empty disk: create()
             *      2) loading a disk image: load()
             *      3) getting disk information: info()
             *      4) seeking a disk sector: seek()
             *      5) reading data from a sector: read()
             *      6) writing data to a sector: write()
             *      7) save disk deltas: save()
             *      8) restore disk deltas: restore()
             *      9) converting disk contents: toJSON()
             *
             *  More functionality may be factored out of the FDC and HDC components later and moved here, to
             *  further reduce some of the duplication between them, but the above functionality is a good start.
             */
            
            /*
             * Client/Server Disk I/O
             *
             * To support large disks without consuming large amounts of client-side memory, and to push
             * client-side disk changes back the server, we need a DiskIO API that can be used in place of
             * the DiskDump API.
             *
             * Use of the DiskIO API and any associated disk images must be tightly coupled to per-user
             * storage and specific machine configurations, to prevent the disk images from being corrupted
             * by inconsistent I/O operations.  Our basic User API (userapi.js) already provides some
             * per-user storage that we can use to get the design rolling.
             *
             * The DiskIO API must also provide the ability to create new (empty) hard disk images in per-user
             * storage and automatically associate them with the machine configurations that requested them.
             *
             * Principles
             * ---
             * Originally, when the Disk class was given a disk image to load and mount, it would request the
             * ENTIRE disk image from the DiskDump module.  That works well for small (floppy) disk images, but
             * for larger disks -- let's just say anything stored on the server as an "img" file -- we'd prefer
             * to interact with that disk using "On-Demand I/O".  Any "img" file on the same server as the PCjs
             * application should be a candidate for on-demand access.
             *
             * On-Demand I/O means that nothing is initially transferred from the server.  As sectors are
             * requested by the PCjs machine, PCjs requests them from the server, and maintains an MRU cache
             * of sectors, periodically discarding the least-used clean sectors above a certain memory limit.
             * Dirty sectors (ie, those that the PCjs machine has written to) must be periodically sent
             * back to the server and then marked as clean, so that they can be discarded like any other
             * sector.
             *
             * We also support "local" init-only disk images, which means that dirty sectors are never sent
             * back to the server and are instead retained by the client for the lifetime of the app; such
             * images are "read-only" as far as the server is concerned, but "read-write" as far as the client
             * is concerned.  Reloading/restarting an app with an "local" disk will return the disk to its
             * initial state.
             *
             * Practice
             * ---
             * Let's first look at what we *already* do for the HDC component:
             *
             *  1) Creating new (empty) disk images
             *  2) Pre-loading pre-built JSON-encoded disk images (converting them to JSON on the fly as needed)
             *
             * An example of #1 is in /devices/pc/machine/5160/cga/256kb/demo/machine.xml:
             *
             *      <hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",type:3}]'/>
             *
             * and an example of #2 is in /disks/pc/fixed/win101.xml:
             *
             *      <hdc id="hdcXT" drives='[{name:"10Mb Hard Disk",path:"/disks/pc/fixed/win101/10mb.json",type:3}]'/>
             *
             * The HDC component expects an array of drive entries.  Array position determines drive numbering
             * (the first entry is drive 0, the second is drive 1, etc), and each entry contains the following
             * properties:
             *
             *      'name': user-friendly name for the disk, if any
             *      'path': URL of the disk image, if any
             *      'type': a drive type
             *
             * Of those properties, only 'type' is required, which provides an index into an HDC "Drive Type"
             * table that determines disk geometry and therefore disk size.  As we add support for larger disks and
             * newer disk controllers, the 'type' parameter will be superseded by either a user-defined 'geometry'
             * parameter that will define number of heads, cylinders, tracks, sectors per track, and (max) bytes per
             * sector, or perhaps a generic 'size' parameter that leaves geometry choices to the HDC component,
             * which will then pass those decisions on to the Disk component.
             *
             * We will enable on-demand I/O for a disk image with a new 'mode' parameter that looks like:
             *
             *      'mode': one of "local", "preload", "demandrw", "demandro"
             *
             * "preload" means the disk image will be completely preloaded, exactly as before; "demandrw" enables
             * full on-demand I/O support; and "demandro" enables on-demand I/O for reads only (all writes are retained
             * and never written back to the server).
             *
             * "ro" will be the fallback for "rw" unless TWO other important criteria are met: 1) the user has a
             * private user key, and therefore per-user storage; and 2) the disk image 'path' contains an asterisk (*)
             * that the server can internally remap to a directory in the user's storage; eg:
             *
             *      'path': <asterisk>/10mb.img (path components following the asterisk are optional)
             *
             * If the disk image does not already exist, it will be created (but not formatted).
             *
             * This preserves the promise that EVERYTHING a user does within a PCjs machine is private (ie, not
             * visible to any other PCjs users).  I don't want to be in the business of saving any user machine
             * states or disk changes, but at least those operations are limited to users who have asked for (and
             * received) a private user key.
             *
             * Another important consideration at this stage is dealing with multiple machines writing to the same
             * disk image; even though we're limiting the "demandrw" mode to per-user images, a single user may still
             * inadvertently start up multiple machines that refer to the same disk image.
             *
             * So, every PCjs machine needs to generate a unique token and include that token with every Disk I/O API
             * operation, so that the server can revoke a previous machine's "rw" access to a disk image when a new
             * machine requests "rw" access to the same disk image.
             *
             * From the client's perspective, revocation can be quietly dealt with by reverting to "demandro" mode;
             * that client becomes stuck with all their dirty sectors until they can reclaim "rw" access, which should
             * only happen if no intervening writes to the disk image on the server have occurred (if I bother allowing
             * reclamation at all).
             *
             * The real challenge here is avoiding revocation of a machine that still has critical changes to commit,
             * but since we can't even solve the problem of a user closing their browser at an inopportune time
             * and potentially leaving a disk image in an inconsistent state, premature revocation is the least of
             * our problems.  Since a real hard disk could suffer the same fate if the machine's power was turned off
             * at the wrong time, you could say that we're simply providing a faithful simulation of reality.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var usr         = require("../../shared/lib/usrlib");
                var web         = require("../../shared/lib/weblib");
                var DiskAPI     = require("../../shared/lib/diskapi");
                var DumpAPI     = require("../../shared/lib/dumpapi");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
            }
            
            /**
             * Disk(controller, drive, mode)
             *
             * Disk contents are stored as an array (aDiskData) of cylinders, each of which is an array of
             * heads, each of which is an array of sector objects; the latter contain sector numbers and
             * sector data, where sector data is an array of dwords.  The format does not impose any
             * limitations on number of cylinders, number of heads, sectors per track, or bytes per sector.
             *
             * WARNING: All accesses to disk sector properties must be via their string names, not their
             * "dot" names, otherwise code will break after it's been processed by the Closure Compiler,
             * and any dumped disks may be unmountable.  This is a side-effect of how we mount and dump
             * disk images (ie, as JSON-encoded streams).
             *
             * This means, for example, that all references to "track[iSector].data" must actually appear as
             * "track[iSector]['data']".
             *
             * @constructor
             * @extends Component
             * @param {HDC|FDC} controller
             * @param {Object} drive
             * @param {string} mode
             */
            function Disk(controller, drive, mode)
            {
                Component.call(this, "Disk", {'id': controller.idMachine + ".disk" + (++Disk.nDisks)}, Disk, Messages.DISK);
            
                /*
                 * Route all non-Debugger messages (eg, notice() and println() calls) through
                 * this.controller (eg, controller.notice() and controller.println()), because
                 * the Computer component is unaware of any Disk objects and therefore will not
                 * set up the usual overrides when a Control Panel is installed.
                 */
                this.controller = controller;
                this.cmp = controller.cmp;
                this.dbg = controller.dbg;
                this.drive = drive;
            
                /*
                 * We pull out a number of drive properties that we may or may not need as defaults
                 */
                this.sDiskName = drive.name;
                this.fRemovable = drive.fRemovable;
                this.fOnDemand = this.fRemote = false;
            
                /*
                 * Initialize the disk contents
                 */
                this.create(mode, drive.nCylinders, drive.nHeads, drive.nSectors, drive.cbSector);
            
                /*
                 * The following dirty sector and timer properties are used only with fOnDemand disks,
                 * assuming fRemote was successfully set.
                 */
                this.aDirtySectors = [];
                this.aDirtyTimestamps = [];         // this array is parallel to aDirtySectors
                this.timerWrite = null;             // REMOTE_WRITE_DELAY timer in effect, if any
                this.msTimerWrite = 0;              // the time that the write timer, if any, is set to fire
                this.fWriteInProgress = false;
            
                this.setReady();
            }
            
            /**
             * @typedef {{
             *  sPath:  string,
             *  sName:  string,
             *  bAttr:  number,
             *  cbSize: number,
             *  apba:   Array.<number>,
             *  disk:   Disk
             * }}
             */
            var FileInfo;
            
            /**
             * Every Sector object (once loaded and fully parsed) should have ALL of the following named properties:
             *
             *      'sector':   sector number
             *      'length':   size of the sector, in bytes
             *      'data':     array of dwords
             *      'pattern':  dword pattern to use for empty or partial sectors (or null if sector still needs to be loaded)
             *
             * initSector() also sets the following properties, to help us quickly identify its location within aDiskData:
             *
             *      iCylinder
             *      iHead
             *
             * In addition, we will maintain the following information on a per-sector basis, as sectors are modified:
             *
             *      iModify:    index of first modified dword in sector
             *      cModify:    number of modified dwords in sector
             *      fDirty:     true if sector is dirty, false if clean (or cleaning in progress)
             *
             * fDirty is used in conjunction with "demandrw" disks; it is set to true whenever the sector is modified, and is
             * set to false whenever the sector has been sent to the server.  If the server write succeeds and fDirty is still
             * false, then the sector modifications are removed (cModify is set to zero).  If the write succeeds but fDirty was
             * set to true again in the meantime, then all the sector modifications (even those that were just written) remain
             * in place (since we don't keep track of more than one modification range within a sector).  And if the write failed,
             * then fDirty is set back to true and again all modifications remain in place; the best we can do is schedule another
             * write attempt.
             *
             * TODO: Perhaps we should also maintain a failure count and stop trying to write sectors that reach a certain
             * threshold.  Error-handling, as usual, is the thorniest problem.
             *
             * @typedef {{
             *  sector:     number,
             *  length:     number,
             *  data:       Array.<number>,
             *  pattern:    (number|null),
             *  iCylinder:  number,
             *  iHead:      number,
             *  iModify:    number,
             *  cModify:    number
             * }}
             */
            var SectorData;
            
            /**
             * @class SectorInfo
             * @property {number} 0 contains iCylinder
             * @property {number} 1 contains iHead
             * @property {number} 2 contains iSector
             * @property {number} 3 contains nSectors
             * @property {boolean} 4 contains fAsync
             * @property {function(nErrorCode:number,fAsync:boolean)} 5 contains done
             */
            
            /**
             * The default number of milliseconds to wait before writing a dirty sector back to a remote disk image
             *
             * @const {number}
             */
            Disk.REMOTE_WRITE_DELAY = 2000;         // 2-second delay
            
            /*
             * A global disk count, used to form unique Disk component IDs
             */
            Disk.nDisks = 0;
            
            Component.subclass(Disk);
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * We have no real interest in this notification, other than to obtain a reference to the Debugger
             * for every disk loaded BEFORE the initBus() phase; any disk loaded AFTER that point will get its Debugger
             * reference, if any, from the disk controller passed to the Disk() constructor.
             *
             * @this {ChipSet}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            Disk.prototype.initBus = function(cmp, bus, cpu, dbg) {
                this.dbg = dbg;
            };
            
            /**
             * isRemote()
             *
             * @this {Disk}
             * @return {boolean} true if remote disk, false if not
             */
            Disk.prototype.isRemote = function() {
                /*
                 * Ironically, we can't rely on fRemote, because that is cleared and set across disconnect and
                 * reconnect operations.  fOnDemand is the next best thing.
                 */
                return this.fOnDemand;
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * As with powerDown(), our sole concern here is for REMOTE disks: if a powerDown() call disconnected an
             * "on-demand" disk, we need to get reconnected.  Calling our own load() function should get the job done.
             *
             * The HDC component could have triggered this as well, but its powerUp() function only calls autoMount()
             * in case of page (ie, application) reload, which is fine for local disks but insufficient for remote disks,
             * which have a server connection that must be re-established.
             *
             * @this {Disk}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            Disk.prototype.powerUp = function(data, fRepower) {
                if (!fRepower) {
                    if (this.fOnDemand && !this.fRemote) {
                        this.setReady(false);
                        this.load(this.sDiskName, this.sDiskPath, null, this.donePowerUp, this);
                    }
                }
                return true;
            };
            
            /**
             * donePowerUp(drive, disk, sDiskName, sDiskPath)
             *
             * This is a callback issued by the Disk component once the load() from powerUp() has finished.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {Disk} disk is set if the disk was successfully mounted, null if not
             * @param {string} sDiskName
             * @param {string} sDiskPath
             */
            Disk.prototype.donePowerUp = function(drive, disk, sDiskName, sDiskPath)
            {
                this.setReady(true);
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * Our sole concern here is for REMOTE disks, making sure any unwritten changes get flushed to
             * the server during a shutdown.  No local state is ever returned, so fSave is ignored.
             *
             * Local disks are managed by the controller (ie, FDC or HDC) that mounted them; the controller's
             * powerDown() handler will take care of calling save() as needed.
             *
             * TODO: Consider taking responsibility for saving the state of local disks as well; the only reason
             * the controllers still take care of them is historical, because this component originally didn't
             * exist, and even after it was created, it didn't originally receive powerDown() notifications.
             *
             * @this {Disk}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean}
             */
            Disk.prototype.powerDown = function(fSave, fShutdown)
            {
                /*
                 * If we're connected to a remote disk, take this opportunity to flush any remaining unwritten
                 * changes and then close the connection.
                 */
                if (this.fRemote) {
                    var response;
                    var nErrorCode = 0;
                    if (this.fWriteInProgress) {
                        /*
                         * TODO: Verify that the Computer's powerOff() handler will actually honor a false return value.
                         */
                        if (!web.confirmUser("Disk writes are still in progress, shut down anyway?")) {
                            return false;
                        }
                    }
                    while ((response = this.findDirtySectors(false))) {
                        if ((nErrorCode = response[0])) {
                            this.controller.notice('Unable to save "' + this.sDiskName + '" (error ' + nErrorCode + ')');
                            break;
                        }
                    }
                    if (fShutdown) {
                        this.disconnectRemoteDisk();
                    }
                    /*
                     * I only report that changes to the disk have been "saved" if fSave is true, to avoid confusing
                     * users who might not understand the difference between discarding local changes (which should restore
                     * all diskettes to their original state) and discarding remote changes (which could leave the remote disk
                     * in a bad state).
                     */
                    if (!nErrorCode && fSave) this.controller.notice(this.sDiskName + " saved");
                }
                return true;
            };
            
            /**
             * create()
             *
             * @param {string} mode
             * @param {number} nCylinders
             * @param {number} nHeads
             * @param {number} nSectors (per track)
             * @param {number} cbSector
             *
             * Initializes the disk contents according to the current drive mode and parameters.
             */
            Disk.prototype.create = function(mode, nCylinders, nHeads, nSectors, cbSector)
            {
                this.mode = mode;
                this.nCylinders = nCylinders;
                this.nHeads = nHeads;
                this.nSectors = nSectors;
                this.cbSector = cbSector;
                this.aDiskData = [];
                /*
                 * If the drive is using PRELOAD mode, then it will use the load()/mount() process to initialize the disk contents;
                 * it wouldn't hurt to let create() do its thing, too, but it's a waste of time.
                 */
                if (this.mode != DiskAPI.MODE.PRELOAD) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("blank disk for \"" + this.sDiskName + "\": " + this.nCylinders + " cylinders, " + this.nHeads + " head(s)");
                    }
                    var aCylinders = new Array(this.nCylinders);
                    for (var iCylinder = 0; iCylinder < aCylinders.length; iCylinder++) {
                        var aHeads = new Array(this.nHeads);
                        for (var iHead = 0; iHead < aHeads.length; iHead++) {
                            var aSectors = new Array(this.nSectors);
                            for (var iSector = 1; iSector <= aSectors.length; iSector++) {
                                /*
                                 * Now that our read() and write() functions can deal with unallocated data
                                 * arrays, and can read/write the specified pattern on-the-fly, we no longer need
                                 * to pre-allocate and pre-initialize the 'data' array.
                                 *
                                 * For "local" disks, we can assume a 'pattern' of 0, but for "demandrw" and "demandro"
                                 * disks, 'pattern' is set to null, as yet another indication that I/O is required to load
                                 * the sector from the server (or to write it back to the server).
                                 */
                                aSectors[iSector - 1] = this.initSector(null, iCylinder, iHead, iSector, this.cbSector, (this.mode == DiskAPI.MODE.LOCAL? 0 : null));
                            }
                            aHeads[iHead] = aSectors;
                        }
                        aCylinders[iCylinder] = aHeads;
                    }
                    this.aDiskData = aCylinders;
                }
                this.dwChecksum = null;
            };
            
            /**
             * load(sDiskName, sDiskPath, file, fnNotify)
             *
             * TODO: Figure out how we can strongly type fnNotify, because the Closure Compiler has issues with:
             *
             *      param {function(Component,Object,Disk,string,string)} fnNotify
             *
             * for:
             *
             *     this.fnNotify.call(this.controller, this.drive, disk, this.sDiskName, this.sDiskPath);
             *
             * Also, while we're at it, learn if there are ways to:
             *
             *      1) declare a function taking NO parameters (ie, generate a warning if any parameters are specified)
             *      2) declare a type for a function's return value
             *
             * @this {Disk}
             * @param {string} sDiskName
             * @param {string} sDiskPath
             * @param {File} [file] is set if there's an associated File object
             * @param {function(...)} [fnNotify]
             * @param {Component} [controller]
             */
            Disk.prototype.load = function(sDiskName, sDiskPath, file, fnNotify, controller)
            {
                var sDiskURL = sDiskPath;
            
                /*
                 * We could use this.log() as well, but it wouldn't display which component initiated the load.
                 */
                if (DEBUG) {
                    var sMessage = 'load("' + sDiskName + '","' + sDiskPath + '")';
                    this.controller.log(sMessage);
                    this.printMessage(sMessage);
                }
            
                if (this.fnNotify) {
                    if (DEBUG) this.controller.log('too many load requests for "' + sDiskName + '" (' + sDiskPath + ')');
                    return;
                }
            
                this.sDiskName = sDiskName;
                this.sDiskPath = sDiskPath;
                this.fnNotify = fnNotify;
                this.controllerNotify = controller || this.controller;
            
                if (file) {
                    var disk = this;
                    var reader = new FileReader();
                    reader.onload = function() {
                        disk.build(reader.result, true);
                    };
                    reader.readAsArrayBuffer(file);
                    return;
                }
            
                /*
                 * If there's an occurrence of API_ENDPOINT anywhere in the path, we assume we can use it as-is;
                 * ie, that the user has already formed a URL of the type we use ourselves for unconverted disk images.
                 */
                if (sDiskPath.indexOf(DumpAPI.ENDPOINT) < 0) {
                    /*
                     * If the selected disk image has a "json" extension, then we assume it's a pre-converted
                     * JSON-encoded disk image, so we load it as-is; otherwise, we ask our server-side disk image
                     * converter to return the corresponding JSON-encoded data.
                     */
                    var sDiskExt = str.getExtension(sDiskPath);
                    if (sDiskExt == DumpAPI.FORMAT.JSON) {
                        sDiskURL = encodeURI(sDiskPath);
                    } else {
                        if (this.mode == DiskAPI.MODE.DEMANDRW || this.mode == DiskAPI.MODE.DEMANDRO) {
                            sDiskURL = this.connectRemoteDisk(sDiskPath);
                            this.fOnDemand = true;
                        } else {
                            var sDiskParm = DumpAPI.QUERY.PATH;
                            var sSizeParm = '&' + DumpAPI.QUERY.MBHD + "=10";
                            /*
                             * 'mbhd' is a new parm added for hard disk support.  In the case of 'file' or 'dir' requests,
                             * 'mbhd' informs DumpAPI.ENDPOINT that it should create a hard disk image, and one not larger than
                             * the specified size (eg, 10mb).  In fact, until DumpAPI.ENDPOINT is changed to create custom hard
                             * disk BPBs, you'll always get a standard PC XT 10mb disk image, so if the 'file' or 'dir' contains
                             * more than 10mb of data, the request will fail.  Ultimately, I want to honor the controller's
                             * driveConfig 'size' parm, or to match the capacity required by the driveConfig 'type' parameter.
                             *
                             * If a 'disk' is specified, we pass mbhd=0, because the actual size will depend on the image.
                             * However, I don't currently have any "dsk" or "img" files containing hard disk images; those formats
                             * were really intended for floppy disk images.  If I never create any hard disk image files, then
                             * we can simply eliminate sSizeParm in the 'disk' case.
                             *
                             * Added more extensions to the list of paths-treated-as-disk-images, so that URLs to files located here:
                             *
                             *      ftp://ftp.oldskool.org/pub/TOPBENCH/dskimage/
                             *
                             * can be used as-is.  TODO: There's a TODO in netlib.getFile() regarding remote support that needs
                             * to be resolved first; DiskDump relies on that function for its remote requests, and it currently
                             * supports only HTTP.
                             */
                            if (!sDiskPath.indexOf("http:") || !sDiskPath.indexOf("ftp:") || ["dsk", "ima", "img", "360", "720", "12", "144"].indexOf(sDiskExt) >= 0) {
                                sDiskParm = DumpAPI.QUERY.DISK;
                                sSizeParm = '&' + DumpAPI.QUERY.MBHD + "=0";
                            } else if (str.endsWith(sDiskPath, '/')) {
                                sDiskParm = DumpAPI.QUERY.DIR;
                            }
                            sDiskURL = web.getHost() + DumpAPI.ENDPOINT + '?' + sDiskParm + '=' + encodeURIComponent(sDiskPath) + (this.fRemovable ? "" : sSizeParm) + "&" + DumpAPI.QUERY.FORMAT + "=" + DumpAPI.FORMAT.JSON;
                        }
                    }
                }
                web.loadResource(sDiskURL, true, null, this, this.doneLoad, sDiskPath);
            };
            
            /**
             *
             * build(buffer, fModified)
             *
             * Builds a disk image from an ArrayBuffer (eg, from a FileReader object), rather than from JSON-encoded data.
             *
             * @this {Disk}
             * @param {?} buffer (we KNOW this is an ArrayBuffer, but we can't seem to convince the Closure Compiler)
             * @param {boolean} [fModified] is true if we should mark the entire disk modified (to ensure that we save/restore it)
             */
            Disk.prototype.build = function(buffer, fModified)
            {
                var disk;
                var cbDiskData = buffer? buffer.byteLength : 0;
                var disketteFormat = DiskAPI.DISKETTE_FORMATS[cbDiskData];
            
                if (disketteFormat) {
                    this.nCylinders = disketteFormat[0];
                    this.nHeads = disketteFormat[1];
                    this.nSectors = disketteFormat[2];
                    this.cbSector = 512;
            
                    var cdw = this.cbSector >> 2, dwPattern = 0, dwChecksum = 0;
                    var ib = 0;
                    var dv = new DataView(buffer, 0, cbDiskData);
            
                    this.aDiskData = new Array(this.nCylinders);
                    for (var iCylinder = 0; iCylinder < this.aDiskData.length; iCylinder++) {
                        var cylinder = this.aDiskData[iCylinder] = new Array(this.nHeads);
                        for (var iHead = 0; iHead < cylinder.length; iHead++) {
                            var head = cylinder[iHead] = new Array(this.nSectors);
                            for (var iSector = 0; iSector < head.length; iSector++) {
                                var sector = this.initSector(null, iCylinder, iHead, iSector + 1, this.cbSector, dwPattern);
                                var adw = sector['data'];
                                for (var idw = 0; idw < cdw; idw++, ib += 4) {
                                    var dw = adw[idw] = dv.getInt32(ib, true);
                                    dwChecksum = (dwChecksum + dw) & (0xffffffff|0);
                                }
                                if (fModified) sector.cModify = cdw;
                                head[iSector] = sector;
                            }
                        }
                    }
                    this.dwChecksum = dwChecksum;
                    disk = this;
                } else {
                    this.notice("Unrecognized diskette format (" + cbDiskData + " bytes)");
                }
            
                if (this.fnNotify) {
                    this.fnNotify.call(this.controller, this.drive, disk, this.sDiskName, this.sDiskPath);
                    this.fnNotify = null;
                }
            };
            
            /**
             * doneLoad(sDiskFile, sDiskData, nErrorCode, sDiskPath)
             *
             * This function was originally called mount().  If the mount is successful, we pass the Disk object to the
             * caller's fnNotify handler; otherwise, we pass null.
             *
             * @this {Disk}
             * @param {string} sDiskFile
             * @param {string} sDiskData
             * @param {number} nErrorCode (response from server if anything other than 200)
             * @param {string} sDiskPath (passed through from load() to loadResource())
             */
            Disk.prototype.doneLoad = function(sDiskFile, sDiskData, nErrorCode, sDiskPath)
            {
                var disk = null;
                this.fWriteProtected = false;
                var fPrintOnly = (nErrorCode < 0 && this.cmp && !this.cmp.aFlags.fPowered);
            
                this.sDiskFile = sDiskFile;
            
                if (this.fOnDemand) {
                    if (!nErrorCode) {
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage('doneLoad("' + sDiskFile + '","' + sDiskPath + '")');
                        }
                        this.fRemote = true;
                        this.buildFileTable();
                        disk = this;
                    } else {
                        this.controller.notice('Unable to connect to disk "' + sDiskPath + '" (error ' + nErrorCode + ': ' + sDiskData + ')', fPrintOnly);
                    }
                }
                else if (nErrorCode) {
                    /*
                     * This can happen for innocuous reasons, such as the user switching away too quickly, forcing
                     * the request to be cancelled.  And unfortunately, the browser cancels XMLHttpRequest requests
                     * BEFORE it notifies any page event handlers, so if the Computer's being powered down, we won't know
                     * that yet.  For now, we rely on the lack of a specific error (nErrorCode < 0), and suppress the
                     * notify() alert if there's no specific error AND the computer is not powered up yet.
                     */
                    this.controller.notice("Unable to load disk \"" + this.sDiskName + "\" (error " + nErrorCode + ")", fPrintOnly);
                } else {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage('doneLoad("' + sDiskFile + '","' + sDiskPath + '")');
                    }
                    try {
                        /*
                         * The following code was a hack to turn on write-protection for a disk image if there was
                         * an initial comment line containing the string "write-protected".  However, since comments
                         * are technically not allowed in JSON, I needed an alternative solution.  So, if the basename
                         * contains the suffix "-readonly", then I'll turn on write-protection for that disk as well.
                         *
                         * TODO: Provide some UI for turning write-protection on/off for disks at will, and provide
                         * an XML-based solution (ie, a per-disk XML configuration option) for controlling it as well.
                         */
                        var sBaseName = str.getBaseName(sDiskFile, true).toLowerCase();
                        if (sBaseName.indexOf("-readonly") > 0) {
                            this.fWriteProtected = true;
                        } else {
                            var iEOL = sDiskData.indexOf("\n");
                            if (iEOL > 0 && iEOL < 1024) {
                                var sConfig = sDiskData.substring(0, iEOL);
                                if (sConfig.indexOf("write-protected") > 0) {
                                    this.fWriteProtected = true;
                                }
                            }
                        }
                        /*
                         * The most likely source of any exception will be here, where we're parsing the disk data.
                         *
                         * TODO: IE9 is rather unfriendly and restrictive with regard to how much data it's willing to
                         * eval().  In particular, the 10Mb disk image we use for the Windows 1.01 demo config fails in
                         * IE9 with an "Out of memory" exception.  One work-around would be to chop the data into chunks
                         * (perhaps one track per chunk, using regular expressions) and then manually re-assemble it.
                         *
                         * However, it turns out that using JSON.parse(sDiskData) instead of eval("(" + sDiskData + ")")
                         * is a much easier fix. The only drawback is that we must first quote any unquoted property names
                         * and remove any comments, because while eval() was cool with them, JSON.parse() is more particular;
                         * the following RegExp replacements take care of those requirements.
                         *
                         * The use of hex values is something else that eval() was OK with, but JSON.parse() is not, and
                         * while I've stopped using hex values in DumpAPI responses (at least when "format=json" is specified),
                         * I can't guarantee they won't show up in "legacy" images, and there's no simple RegExp replacement
                         * for transforming hex values into decimal values, so I cop out and fall back to eval() if I detect
                         * any hex prefixes ("0x") in the sequence.  Ditto for error messages, which appear like so:
                         *
                         *      ["unrecognized disk path: test.img"]
                         */
                        var aDiskData;
                        if (sDiskData.substr(0, 1) == "<") {        // if the "data" begins with a "<"...
                            /*
                             * Early server configs reported an error (via the nErrorCode parameter) if a disk URL was invalid,
                             * but more recent server configs now display a somewhat friendlier HTML error page.  The downside,
                             * however, is that the original error has been buried, and we've received "data" that isn't actually
                             * disk data.
                             *
                             * So, if the data we've received appears to be "HTML-like", all we can really do is assume that the
                             * disk image is missing.  And so we pretend we received an error message to that effect.
                             */
                            aDiskData = ["Missing disk image: " + this.sDiskName];
                        } else {
                            if (sDiskData.indexOf("0x") < 0 && sDiskData.substr(0, 2) != "[\"") {
                                aDiskData = JSON.parse(sDiskData.replace(/([a-z]+):/gm, "\"$1\":").replace(/\/\/[^\n]*/gm, ""));
                            } else {
                                aDiskData = eval("(" + sDiskData + ")");
                            }
                        }
            
                        if (!aDiskData.length) {
                            Component.error("Empty disk image: " + this.sDiskName);
                        }
                        else if (aDiskData.length == 1) {
                            Component.error(aDiskData[0]);
                        }
                        /*
                         * aDiskData is an array of cylinders, each of which is an array of heads, each of which
                         * is an array of sector objects.  The format does not impose any limitations on number of
                         * cylinders, number of heads, or number of bytes in any of the sector object byte-arrays.
                         *
                         * WARNING: All accesses to sector object properties must be via their string names, not their
                         * "dot" names, otherwise code will break after it's been processed by the Closure Compiler.
                         *
                         * Sector object properties include:
                         *
                         *      'sector'    the sector number (1-based, not required to be sequential)
                         *      'length'    the byte-length (ie, formatted length) of the sector
                         *      'data'      the dword-array containing the sector data
                         *      'pattern'   if the dword-array length is less than 'length'/4, this value must be used
                         *                  to pad out the sector; if no 'pattern' is specified, it's assumed to be zero
                         *
                         * We still support the older JSON encoding, where sector data was encoded as an array of 'bytes'
                         * rather than a dword 'data' array.  However, our support is strictly limited to an on-the-fly
                         * conversion to a forward-compatible 'data' array.
                         */
                        else {
                            if (MAXDEBUG && this.messageEnabled()) {
                                var sCylinders = aDiskData.length + " track" + (aDiskData.length > 1 ? "s" : "");
                                var nHeads = aDiskData[0].length;
                                var sHeads = nHeads + " head" + (nHeads > 1 ? "s" : "");
                                var nSectorsPerTrack = aDiskData[0][0].length;
                                var sSectorsPerTrack = nSectorsPerTrack + " sector" + (nSectorsPerTrack > 1 ? "s" : "") + "/track";
                                this.printMessage(sCylinders + ", " + sHeads + ", " + sSectorsPerTrack);
                            }
                            /*
                             * Before the image is usable, we must "normalize" all the sectors.  In the past, this meant
                             * "inflating" them all.  However, that's no longer strictly necessary.  Mainly, it just means
                             * setting 'length', 'data', and 'pattern' properties, so that all the sectors are well-defined.
                             * This includes detecting sector data in older formats (eg, the old array of 'bytes' instead
                             * of the new 'data' array of dwords) and converting them on-the-fly to the current format.
                             */
                            this.nCylinders = aDiskData.length;
                            this.nHeads = aDiskData[0].length;
                            this.nSectors = aDiskData[0][0].length;
                            var sector = aDiskData[0][0][0];
                            this.cbSector = (sector && sector['length']) || 512;
            
                            var dwChecksum = 0;
                            for (var iCylinder = 0; iCylinder < this.nCylinders; iCylinder++) {
                                for (var iHead = 0; iHead < this.nHeads; iHead++) {
                                    for (var iSector = 0; iSector < this.nSectors; iSector++) {
                                        sector = aDiskData[iCylinder][iHead][iSector];
                                        if (!sector) continue;          // non-standard (eg, XDF) disk images may have "unused" (null) sectors
                                        var length = sector['length'];
                                        if (length === undefined) {     // provide backward-compatibility with older JSON...
                                            length = sector['length'] = 512;
                                        }
                                        length >>= 2;                   // convert length from a byte-length to a dword-length
                                        var dwPattern = sector['pattern'];
                                        if (dwPattern === undefined) {
                                            dwPattern = sector['pattern'] = 0;
                                        }
                                        var adw = sector['data'];
                                        if (adw === undefined) {
                                            var ab = sector['bytes'];
                                            if (ab === undefined || !ab.length) {
                                                /*
                                                 * It would be odd if there was neither a 'bytes' nor 'data' array; I'm just
                                                 * being paranoid.  It's more likely that the 'bytes' array is simply empty,
                                                 * in which case we need only create an empty 'data' array and turn the byte
                                                 * pattern, if any, into a dword pattern.
                                                 */
                                                adw = [];
                                                this.assert((dwPattern & 0xff) == dwPattern);
                                                dwPattern = sector['pattern'] = (dwPattern | (dwPattern << 8) | (dwPattern << 16) | (dwPattern << 24));
                                                sector['data'] = adw;
                                            } else {
                                                /*
                                                 * To keep the conversion code simple, we'll do any necessary pattern-filling first,
                                                 * to fully "inflate" the sector, eliminating the possibility of partial dwords and
                                                 * saving any code downstream from dealing with byte-size patterns.
                                                 */
                                                var cb = length << 2;
                                                for (var ib = ab.length; ib < cb; ib++) {
                                                    ab[ib] = dwPattern; // the pattern for byte-arrays was only a byte
                                                }
                                                this.fill(sector, ab, 0);
                                            }
                                            delete sector['bytes'];
                                        }
                                        this.initSector(sector, iCylinder, iHead);
                                        /*
                                         * For the disk as a whole, we maintain a checksum of the original unmodified data:
                                         *
                                         *      dwChecksum: summation of all dwords in all non-empty sectors
                                         *
                                         * Pattern-filling of sectors is deferred until absolutely necessary (eg, when a sector is
                                         * being written).  So all we need to do at this point is checksum all the initial sector data.
                                         */
                                        for (var idw = 0; idw < adw.length; idw++) {
                                            dwChecksum = (dwChecksum + adw[idw]) & (0xffffffff|0);
                                        }
                                    }
                                }
                            }
                            this.aDiskData = aDiskData;
                            this.dwChecksum = dwChecksum;
                            this.buildFileTable();
                            disk = this;
                        }
                    } catch (e) {
                        Component.error("Disk image error: " + e.message);
                    }
                }
            
                if (this.fnNotify) {
                    this.fnNotify.call(this.controllerNotify, this.drive, disk, this.sDiskName, this.sDiskPath);
                    this.fnNotify = null;
                }
            };
            
            /**
             * buildFileTable()
             *
             * This function builds a complete file table from the (first) FAT volume found on the current disk, and
             * then updates all the sector objects to point back to the corresponding file.  Used for BACKTRACK support.
             *
             * Note that while most of the methods in this module use CHS-style parameters, because our primary clients
             * are old disk controllers that deal exclusively with cylinder/head/sector values, here we use 0-based
             * "logical" sector numbers for volume-relative block addresses (aka LBAs or Logical Block Addresses), and
             * 0-based "physical" sector numbers for disk-relative block addresses (aka PBAs or Physical Block Addresses).
             *
             * Also, our use of the term LBA differs from that of more modern disk controllers; in the pre-modern world
             * of PCjs, what we call PBA numbers are what those controllers would later call LBA numbers.
             *
             * @this {Disk}
             */
            Disk.prototype.buildFileTable = function()
            {
                if (BACKTRACK) {
                    var i, off, dir = {};
            
                    this.aFileTable = [];
            
                    dir.pbaVolume = dir.lbaTotal = 0;
            
                    var cbDisk = this.nCylinders * this.nHeads * this.nSectors * this.cbSector;
            
                    /*
                     * At this point, if this is a remote disk, you may see some warning messages in your browser's console,
                     * like this message from Chrome:
                     *
                     *      "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects
                     *      to the end user's experience. For more help, check http://xhr.spec.whatwg.org/."
                     *
                     * This is because I was lazy and made the buildFileTable() worker function getSector() use the synchronous
                     * form of seek().  For development purposes, that was fine, but...  TODO: Eventually change buildFileTable()
                     * to use async I/O.
                     */
                    if (this.fRemote) this.log("ignore any synchronous XMLHttpRequest warnings here (for now)");
            
                    var sectorBoot = this.getSector(0);
                    if (!sectorBoot) {
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("buildFileTable(): unable to read boot sector");
                        }
                        return;
                    }
            
                    dir.cbSector = this.getSectorData(sectorBoot, DiskAPI.BPB.SECTOR_BYTES, 2);
            
                    var fValid = true;
                    if (dir.cbSector != this.cbSector) {
                        /*
                         * When the first sector doesn't appear to contain a valid BPB, the most likely explanations are:
                         *
                         *      1. The image is from a diskette formatted by DOS 1.xx, which didn't use BPBs
                         *      2. The image is a fixed (partitioned) disk and the first sector is actually an MBR
                         *      3. The image is from a diskette that used a non-standard sector size (ie, not 512)
                         *
                         * To start, if this is an 160Kb disk (circa DOS 1.00) or a 320Kb disk (circa DOS 1.10), then we'll
                         * assume it's a 12-bit FAT, set assorted BPB values accordingly, and see if our assumption holds up.
                         */
                        fValid = false;
                        dir.lbaFAT = 1;
                        dir.nFATBits = 12;
                        dir.lbaRoot = dir.lbaFAT + 2;   // both 160Kb and 320Kb disks contained 2 FATs, each containing 1 sector
                        dir.nClusterSecs = 1;
                        dir.cbSector = this.cbSector;
            
                        if (cbDisk == 160 * 1024 && this.getClusterEntry(dir, 0, 0) == DiskAPI.FAT.MEDIA_160KB) {
                            dir.lbaTotal = 320;
                            dir.nEntries = 64;
                            fValid = true;
                        }
                        else if (cbDisk == 320 * 1024 && this.getClusterEntry(dir, 0, 0) == DiskAPI.FAT.MEDIA_320KB) {
                            dir.lbaTotal = 640;
                            dir.nEntries = 112;
                            fValid = true;
                        }
                        else {
                            /*
                             * So, this is either a fixed (partitioned) disk, or a disk using a non-standard sector size; let's assume
                             * the former and check for an MBR.  For now, we're only going to process the first active partition we find.
                             */
                            off = DiskAPI.MBR.PARTITIONS.OFFSET;
                            for (i = 0; i < 4; i++) {
                                var bStatus = this.getSectorData(sectorBoot, off + DiskAPI.MBR.PARTITIONS.ENTRY.STATUS, 1);
                                if (bStatus == DiskAPI.MBR.PARTITIONS.STATUS.ACTIVE) {
                                    dir.pbaVolume = this.getSectorData(sectorBoot, off + DiskAPI.MBR.PARTITIONS.ENTRY.LBA_FIRST, 4);
                                    sectorBoot = this.getSector(dir.pbaVolume);
                                    if (sectorBoot) fValid = true;
                                    break;
                                }
                                off += DiskAPI.MBR.PARTITIONS.ENTRY.LENGTH;
                            }
                        }
                        if (!fValid) {
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("buildFileTable(): unrecognized " + cbDisk + "-byte disk image with " + this.cbSector + "-byte sectors");
                            }
                            return;
                        }
                    }
            
                    if (!dir.lbaTotal) {
                        dir.lbaTotal = this.getSectorData(sectorBoot, DiskAPI.BPB.TOTAL_SECS, 2) || this.getSectorData(sectorBoot, DiskAPI.BPB.LARGE_SECS, 4);
                        dir.lbaFAT = this.getSectorData(sectorBoot, DiskAPI.BPB.RESERVED_SECS, 2);
                        dir.lbaRoot = dir.lbaFAT + this.getSectorData(sectorBoot, DiskAPI.BPB.FAT_SECS, 2) * this.getSectorData(sectorBoot, DiskAPI.BPB.TOTAL_FATS, 1);
                        dir.nEntries = this.getSectorData(sectorBoot, DiskAPI.BPB.ROOT_DIRENTS, 2);
                        dir.nClusterSecs = this.getSectorData(sectorBoot, DiskAPI.BPB.CLUSTER_SECS, 1);
                    }
            
                    dir.lbaData = dir.lbaRoot + (((dir.nEntries * DiskAPI.DIRENT.LENGTH + (dir.cbSector - 1)) / dir.cbSector) | 0);
                    dir.nClusters = (((dir.lbaTotal - dir.lbaData) / dir.nClusterSecs) | 0);
            
                    /*
                     * In all FATs, the first valid cluster number is 2, as 0 is used to indicate a free cluster and 1 is reserved.
                     *
                     * In a 12-bit FAT chain, the largest valid cluster number (iClusterMax) is 0xFF6; 0xFF7 is reserved for marking
                     * bad clusters and should NEVER appear in a cluster chain, and 0xFF8-0xFFF are used to indicate the end of a chain.
                     * Reports that cluster numbers 0xFF0-0xFF6 are "reserved" (eg, http://support.microsoft.com/KB/65541) should be
                     * ignored; those numbers may have been considered "reserved" at some early point in FAT's history, but no longer.
                     *
                     * Since 12 bits yield 4096 possible values, and since 11 of the values (0, 1, and 0xFF7-0xFFF) cannot be used to
                     * refer to an actual cluster, that leaves a theoretical maximum of 4085 clusters for a 12-bit FAT.  However, for
                     * reasons that only a small (and shrinking -- RIP AAR) number of people know, the actual cut-off is 4084.
                     *
                     * So, a FAT volume with 4084 or fewer clusters uses a 12-bit FAT, a FAT volume with 4085 to 65524 clusters uses
                     * a 16-bit FAT, and a FAT volume with more than 65524 clusters uses a 32-bit FAT.
                     *
                     * TODO: Eventually add support for FAT32.
                     */
                    dir.nFATBits = (dir.nClusters <= DiskAPI.FAT12.MAX_CLUSTERS? 12 : 16);
                    dir.iClusterMax = (dir.nFATBits == 12? DiskAPI.FAT12.CLUSNUM_MAX : DiskAPI.FAT16.CLUSNUM_MAX);
            
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("buildFileTable()\n\tlbaFAT: " + dir.lbaFAT + "\n\tlbaRoot: " + dir.lbaRoot + "\n\tlbaData: " + dir.lbaData + "\n\tlbaTotal: " + dir.lbaTotal + "\n\tnClusterSecs: " + dir.nClusterSecs + "\n\tnClusters: " + dir.nClusters);
                    }
            
                    /*
                     * The following assertion is here only to catch anomalies; it is NOT a requirement that the number of data sectors
                     * be a perfect multiple of nClusterSecs, but if it ever happens, it's worth verifying we didn't miscalculate something.
                     */
                    i = (dir.lbaTotal - dir.lbaData) % dir.nClusterSecs;
                    if (i) {
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("buildFileTable(): " + cbDisk + "-byte disk image wasting " + i + " sectors");
                        }
                    }
            
                    /*
                     * Similarly, it is NOT a requirement that the size of all root directory entries be a perfect multiple of the sector
                     * size (cbSector), but it may indicate a problem if it's not.  Note that when it comes time to read the root directory,
                     * we treat it exactly like any other directory; that is, we ignore the nEntries value and scan the entire contents of
                     * every sector allocated to the directory.  TODO: Determine whether DOS reads all root sector contents or only nEntries
                     * (ie, create a test volume where nEntries * 32 is NOT a multiple of cbSector and watch what happens).
                     */
                    this.assert(!((dir.nEntries * DiskAPI.DIRENT.LENGTH) % dir.cbSector));
            
                    var apba = [];
                    for (var lba = dir.lbaRoot; lba < dir.lbaData; lba++) apba.push(dir.pbaVolume + lba);
                    this.getDir(dir, this.sDiskFile, "", apba);
            
                    /*
                     * Create the sector-to-file mappings now.
                     */
                    for (i = 0; i < this.aFileTable.length; i++) {
                        var file = this.aFileTable[i];
                        off = 0;
                        for (var iSector = 0; iSector < file.apba.length; iSector++) {
                            this.updateSector(file, file.apba[iSector], off);
                            off += this.cbSector;
                        }
                    }
                }
            };
            
            /**
             * getDir(dir, sDisk, sDir, apba)
             *
             * @this {Disk}
             * @param {Object} dir
             * @param {string} sDisk
             * @param {string} sDir
             * @param {Array.<number>} apba
             */
            Disk.prototype.getDir = function(dir, sDisk, sDir, apba)
            {
                var iStart = this.aFileTable.length;
                var nEntriesPerSector = (dir.cbSector / DiskAPI.DIRENT.LENGTH) | 0;
            
                dir.sDir = sDir + "\\";
            
                if (DEBUG && this.messageEnabled()) this.printMessage('getDir("' + sDisk + '","' + dir.sDir + '")');
            
                for (var iSector = 0; iSector < apba.length; iSector++) {
                    var pba = apba[iSector];
                    for (var iEntry = 0; iEntry < nEntriesPerSector; iEntry++) {
                        if (!this.getDirEntry(dir, pba, iEntry)) {
                            iSector = apba.length;
                            break;
                        }
                        if (dir.sName == null || dir.sName == "." || dir.sName == "..") continue;
                        var sPath = dir.sDir + dir.sName;
                        if (DEBUG && this.messageEnabled(Messages.DISK | Messages.DATA)) {
                            this.printMessage('"' + sPath + '" size=' + dir.cbSize + ' cluster=' + dir.iCluster + ' sectors=' + JSON.stringify(dir.apba));
                            if (dir.apba.length) this.printMessage(this.dumpSector(this.getSector(dir.apba[0]), dir.apba[0], sPath));
                        }
                        this.aFileTable.push({sPath: sPath, sName: dir.sName, bAttr: dir.bAttr, cbSize: dir.cbSize, apba: dir.apba, disk: this});
                    }
                }
            
                var iEnd = this.aFileTable.length;
            
                for (var i = iStart; i < iEnd; i++) {
                    var file = this.aFileTable[i];
                    if (file.bAttr & DiskAPI.ATTR.SUBDIR && file.apba.length) this.getDir(dir, sDisk, sDir + "\\" + file.sName, file.apba);
                }
            };
            
            /**
             * getDirEntry(dir, pba, i)
             *
             * This sets the following properties on the 'dir' object:
             *
             *      sName (null if invalid/deleted entry)
             *      bAttr
             *      cbSize
             *      iCluster
             *      apba (ie, array of physical block addresses)
             *
             * On return, it's the caller's responsibility to copy out any data into a new object
             * if it wants to preserve any of the above information.
             *
             * This function also caches the following properties in the 'dir' object:
             *
             *      pbaDirCache (of the last directory sector read, if any)
             *      sectorDirCache (of the last directory sector read, if any)
             *
             * Also, the caller must also set the following 'dir' helper properties, so that clusters
             * can be located and converted to sectors (see convertClusterToSectors):
             *
             *      lbaFAT
             *      lbaData
             *      cbSector
             *      iClusterMax
             *      nClusterSecs
             *      nFATBits
             *
             * @this {Disk}
             * @param {Object} dir (to be filled in)
             * @param {number} pba (a sector of the directory)
             * @param {number} i (an entry in the directory sector, 0-based)
             * @returns {boolean} true if entry was returned (even if invalid/deleted), false if no more entries
             */
            Disk.prototype.getDirEntry = function(dir, pba, i)
            {
                if (!dir.sectorDirCache || !dir.pbaDirCache || dir.pbaDirCache != pba) {
                    dir.pbaDirCache = pba;
                    dir.sectorDirCache = this.getSector(dir.pbaDirCache);
                    if (DEBUG && this.messageEnabled(Messages.DISK | Messages.DATA)) {
                        this.printMessage(this.dumpSector(dir.sectorDirCache, dir.pbaDirCache, dir.sDir));
                    }
                }
                if (dir.sectorDirCache) {
                    var off = i * DiskAPI.DIRENT.LENGTH;
                    var b = this.getSectorData(dir.sectorDirCache, off, 1);
                    if (b == DiskAPI.DIRENT.UNUSED) {
                        return false;
                    }
                    if (b == DiskAPI.DIRENT.INVALID) {
                        dir.sName = null;
                        return true;
                    }
                    dir.sName = str.trim(this.getSectorString(dir.sectorDirCache, off + DiskAPI.DIRENT.NAME, 8));
                    var s = str.trim(this.getSectorString(dir.sectorDirCache, off + DiskAPI.DIRENT.EXT, 3));
                    if (s.length) dir.sName += '.' + s;
                    dir.bAttr = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.ATTR, 1);
                    dir.cbSize = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.SIZE, 2);
                    dir.iCluster = this.getSectorData(dir.sectorDirCache, off + DiskAPI.DIRENT.CLUSTER, 2);
                    dir.apba = this.convertClusterToSectors(dir);
                    return true;
                }
                return false;
            };
            
            /**
             * convertClusterToSectors(dir)
             *
             * @this {Disk}
             * @param {Object} dir
             * @return {Array.<number>} of PBAs (physical block addresses)
             */
            Disk.prototype.convertClusterToSectors = function(dir)
            {
                var apba = [];
                var iCluster = dir.iCluster;
                if (iCluster) {
                    do {
                        if (iCluster < DiskAPI.FAT12.CLUSNUM_MIN) {
                            this.assert(false);
                            break;
                        }
                        var lba = dir.lbaData + ((iCluster - DiskAPI.FAT12.CLUSNUM_MIN) * dir.nClusterSecs);
                        for (var i = 0; i < dir.nClusterSecs; i++) {
                            apba.push(dir.pbaVolume + lba++);
                        }
                        iCluster = this.getClusterEntry(dir, iCluster, 0) | this.getClusterEntry(dir, iCluster, 1);
                    } while (iCluster <= dir.iClusterMax);
                    this.assert(iCluster != dir.iClusterMax + 1);       // make sure we never see CLUSNUM_BAD in a cluster chain
                }
                return apba;
            };
            
            /**
             * getClusterEntry(dir, iCluster, iByte)
             *
             * @this {Disk}
             * @param {Object} dir
             * @param {number} iCluster
             * @param {number} iByte (0 for low byte of cluster entry, 1 for high byte)
             * @return {number}
             */
            Disk.prototype.getClusterEntry = function(dir, iCluster, iByte)
            {
                var w = 0;
                var cbitsSector = dir.cbSector * 8;
                var offBits = dir.nFATBits * iCluster + (iByte? 8 : 0);
                var iSector = (offBits / cbitsSector) | 0;
                if (!dir.sectorFATCache || !dir.lbaFATCache || dir.lbaFATCache != dir.lbaFAT + iSector) {
                    dir.lbaFATCache = dir.lbaFAT + iSector;
                    dir.sectorFATCache = this.getSector(dir.pbaVolume + dir.lbaFATCache);
                }
                if (dir.sectorFATCache) {
                    offBits = (offBits % cbitsSector) | 0;
                    var off = (offBits >> 3);
                    w = this.getSectorData(dir.sectorFATCache, off, 1);
                    if (!iByte) {
                        if (offBits & 0x7) w >>= 4;
                    } else {
                        if (dir.nFATBits == 16) {
                            w <<= 8;
                        } else {
                            this.assert(dir.nFATBits == 12);
                            if (offBits & 0x7) {
                                w <<= 4;
                            } else {
                                w = (w & 0xf) << 8;
                            }
                        }
                    }
                }
                return w;
            };
            
            /**
             * getSector(pba)
             *
             * @this {Disk}
             * @param {number} pba (physical block address)
             * @return {Object} sector
             */
            Disk.prototype.getSector = function(pba)
            {
                var nSectorsPerCylinder = this.nHeads * this.nSectors;
                var iCylinder = (pba / nSectorsPerCylinder) | 0;
                this.assert(iCylinder < this.nCylinders);
                var nSectorsRemaining = (pba % nSectorsPerCylinder);
                var iHead = (nSectorsRemaining / this.nSectors) | 0;
                /*
                 * PBA numbers are 0-based, but the sector numbers in CHS addressing are 1-based, so add one to iSector
                 */
                var iSector = (nSectorsRemaining % this.nSectors) + 1;
                return this.seek(iCylinder, iHead, iSector);
            };
            
            /**
             * updateSector(file, pba, off)
             *
             * Like getSector(), this must convert a PBA into CHS values; consider factoring that conversion code out.
             *
             * @this {Disk}
             * @param {Object} file
             * @param {number} pba (physical block address from the file's apba)
             * @param {number} off (file offset corresponding to the given pba of the given file)
             * @return {boolean} true if successfully updated, false if not
             */
            Disk.prototype.updateSector = function(file, pba, off)
            {
                var nSectorsPerCylinder = this.nHeads * this.nSectors;
                var iCylinder = (pba / nSectorsPerCylinder) | 0;
                var nSectorsRemaining = (pba % nSectorsPerCylinder);
                var iHead = (nSectorsRemaining / this.nSectors) | 0;
                var iSector = (nSectorsRemaining % this.nSectors);
                var cylinder, head, sector;
                if ((cylinder = this.aDiskData[iCylinder]) && (head = cylinder[iHead]) && (sector = head[iSector])) {
                    this.assert(sector['sector'] == iSector +1);
                    if (sector.file) {
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage('"' + sector.file.sPath + '" cross-linked at offset ' + sector.file.offFile + ' with "' + file.sPath + '" at offset ' + off);
                        }
                        return false;
                    }
                    sector.file = file;
                    sector.offFile = off;
                    return true;
                }
                if (DEBUG && this.messageEnabled()) this.printMessage("unable to map PBA " + pba + " to CHS");
                return false;
            };
            
            /**
             * getSectorData(sector, off, len)
             *
             * NOTE: Yes, this function is not the most efficient way to read a byte/word/dword value from within a sector,
             * but given the different states a sector may be in, it's certainly the simplest and safest, and since this is
             * only used by buildFileTable() and its progeny, it's not clear that we need to be superfast anyway.
             *
             * @this {Disk}
             * @param {Object} sector
             * @param {number} off (byte offset)
             * @param {number} len (1 to 4 bytes)
             * @return {number}
             */
            Disk.prototype.getSectorData = function(sector, off, len)
            {
                var dw = 0;
                var nShift = 0;
                this.assert(len > 0 && len <= 4);
                while (len--) {
                    this.assert(off < sector['length']);
                    var b = this.read(sector, off++);
                    this.assert(b >= 0);
                    if (b < 0) break;
                    dw |= (b << nShift);
                    nShift += 8;
                }
                return dw;
            };
            
            /**
             * getSectorString(sector, off, len)
             *
             * @this {Disk}
             * @param {Object} sector
             * @param {number} off (byte offset)
             * @param {number} len (use -1 to read a null-terminated string)
             * @return {string}
             */
            Disk.prototype.getSectorString = function(sector, off, len)
            {
                var s = "";
                while (len--) {
                    var b = this.read(sector, off++);
                    if (b <= 0) break;
                    s += String.fromCharCode(b);
                }
                return s;
            };
            
            /**
             * initSector(sector, iCylinder, iHead, iSector, cbSector, dwPattern)
             *
             * Ensures every sector has ALL the properties of a proper Sector object; ie:
             *
             *      'sector':   sector number
             *      'length':   size of the sector, in bytes
             *      'data':     array of dwords
             *      'pattern':  dword pattern to use for empty or partial sectors (null for unread remote sectors)
             *
             * In addition, we will maintain the following information on a per-sector basis,
             * as sectors are modified:
             *
             *      iModify:    index of first modified dword in sector
             *      cModify:    number of modified dwords in sector
             *      fDirty:     true if sector is dirty, false if clean (or cleaning in progress)
             *
             * @param {Object} sector
             * @param {number} iCylinder
             * @param {number} iHead
             * @param {number} [iSector]
             * @param {number} [cbSector]
             * @param {number|null} [dwPattern]
             * @return {Object}
             */
            Disk.prototype.initSector = function(sector, iCylinder, iHead, iSector, cbSector, dwPattern)
            {
                if (!sector) {
                    sector = {'sector': iSector, 'length': cbSector, 'data': [], 'pattern': dwPattern};
                }
                sector.iCylinder = iCylinder;
                sector.iHead = iHead;
                sector.iModify = sector.cModify = 0;
                sector.fDirty = false;
                return sector;
            };
            
            /**
             * connectRemoteDisk(sDiskPath)
             *
             * Unlike disconnect(), we don't issue the connect request ourselves; instead, we piggyback on the existing
             * preload code in load() to establish the connection.  That, in turn, will trigger a call to mount(), which
             * will check fOnDemand and set fRemote if the connection was successful.
             *
             * @this {Disk}
             * @param {string} sDiskPath
             * @return {string} is the URL connection string required to connect to sDiskPath
             */
            Disk.prototype.connectRemoteDisk = function(sDiskPath)
            {
                var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.OPEN;
                sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + sDiskPath;
                sParms += '&' + DiskAPI.QUERY.MODE + '=' + this.mode;
                sParms += '&' + DiskAPI.QUERY.CHS + '=' + this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
                sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
                sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
                return web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
            };
            
            /**
             * readRemoteSectors(iCylinder, iHead, iSector, nSectors, fAsync, done)
             *
             * @param {number} iCylinder
             * @param {number} iHead
             * @param {number} iSector
             * @param {number} nSectors (to read)
             * @param {boolean} fAsync
             * @param {function(number,boolean)} [done]
             */
            Disk.prototype.readRemoteSectors = function(iCylinder, iHead, iSector, nSectors, fAsync, done)
            {
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("readRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ")");
                }
            
                if (this.fRemote) {
                    var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.READ;
                    sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + this.sDiskPath;
                    sParms += '&' + DiskAPI.QUERY.CHS + '=' + this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
                    sParms += '&' + DiskAPI.QUERY.ADDR + '=' + iCylinder + ':' + iHead + ':' + iSector + ':' + nSectors;
                    sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
                    sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
                    var sDiskURL = web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
                    web.loadResource(sDiskURL, fAsync, null, this, this.doneReadRemoteSectors, [iCylinder, iHead, iSector, nSectors, fAsync, done]);
                    return;
                }
                if (done) done(-1, false);
            };
            
            /**
             * doneReadRemoteSectors(sURLName, sURLData, nErrorCode, sectorInfo)
             *
             * @param {string} sURLName
             * @param {string} sURLData
             * @param {number} nErrorCode
             * @param {Array} sectorInfo
             */
            Disk.prototype.doneReadRemoteSectors = function(sURLName, sURLData, nErrorCode, sectorInfo)
            {
                var fAsync = false;
            
                var iCylinder = sectorInfo[0];
                var iHead = sectorInfo[1];
                var iSector = sectorInfo[2];
                var nSectors = sectorInfo[3];
            
                if (!nErrorCode) {
                    var abData = JSON.parse(sURLData);
                    var offData = 0;
                    while (nSectors--) {
                        /*
                         * We call seek with fWrite == true to prevent seek() from triggering another call
                         * to readRemoteSectors() and endlessly recursing.  That also forces seek() to:
                         *
                         *  1) zero the sector's 'pattern'
                         *  2) disable warning about reading an uninitialized sector
                         *
                         * We KNOW this is an uninitialized sector, because we're about to initialize it.
                         */
                        var sector = this.seek(iCylinder, iHead, iSector, true);
                        if (!sector) {
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("doneReadRemoteSectors(): seek(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ") failed");
                            }
                            break;
                        }
                        this.fill(sector, abData, offData);
                        offData += sector['length'];
                        /*
                         * We happen to know that when seek() calls readRemoteSectors(), it limits the number of sectors
                         * to the current track, so the only variable we need to advance is iSector.
                         */
                        iSector++;
                    }
                    fAsync = sectorInfo[4];
                } else {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("doneReadRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ") returned error " + nErrorCode);
                    }
                }
                var done = sectorInfo[5];
                if (done) done(nErrorCode, fAsync);
            };
            
            /**
             * writeRemoteSectors(iCylinder, iHead, iSector, nSectors, abSectors, fAsync)
             *
             * Writes to a remote disk are performed on a timer-driven basis.  When a sector is modified for the first time,
             * a reference to that sector is "pushed" onto (ie, appended to the end of) aDirtySectors, and if aDirtySectors was
             * originally empty, then a REMOTE_WRITE_DELAY timer is set.
             *
             * When the timer fires, the first batch of contiguous sectors is sent off the server, and when the server responds
             * (ie, when cleanDirtySectors() is called), if the response indicates success, every sector that was sent is marked
             * clean -- unless one or more writes to the sector occurred in the meantime, which we track through a per-sector
             * fDirty flag.
             *
             * @param {number} iCylinder
             * @param {number} iHead
             * @param {number} iSector
             * @param {number} nSectors (to write)
             * @param {Array.<number>} abSectors
             * @param {boolean} fAsync
             * @return {boolean|Array}
             */
            Disk.prototype.writeRemoteSectors = function(iCylinder, iHead, iSector, nSectors, abSectors, fAsync)
            {
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("writeRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + iSector + ",N=" + nSectors + ")");
                }
            
                if (this.fRemote) {
                    var data = {};
                    this.fWriteInProgress = true;
                    data[DiskAPI.QUERY.ACTION] = DiskAPI.ACTION.WRITE;
                    data[DiskAPI.QUERY.VOLUME] = this.sDiskPath;
                    data[DiskAPI.QUERY.CHS] = this.nCylinders + ':' + this.nHeads + ':' + this.nSectors + ':' + this.cbSector;
                    data[DiskAPI.QUERY.ADDR] = iCylinder + ':' + iHead + ':' + iSector + ':' + nSectors;
                    data[DiskAPI.QUERY.MACHINE] = this.controller.getMachineID();
                    data[DiskAPI.QUERY.USER] = this.controller.getUserID();
                    data[DiskAPI.QUERY.DATA] = JSON.stringify(abSectors);
                    var sDiskURL = web.getHost() + DiskAPI.ENDPOINT;
                    return web.loadResource(sDiskURL, fAsync, data, this, this.doneWriteRemoteSectors, [iCylinder, iHead, iSector, nSectors, fAsync]);
                }
                return false;
            };
            
            /**
             * doneWriteRemoteSectors(sURLName, sURLData, nErrorCode, sectorInfo)
             *
             * @param {string} sURLName
             * @param {string} sURLData
             * @param {number} nErrorCode
             * @param {Array} sectorInfo
             */
            Disk.prototype.doneWriteRemoteSectors = function(sURLName, sURLData, nErrorCode, sectorInfo)
            {
                var iCylinder = sectorInfo[0];
                var iHead = sectorInfo[1];
                var iSector = sectorInfo[2];
                var nSectors = sectorInfo[3];
                var fAsync = sectorInfo[4];
                this.fWriteInProgress = false;
            
                if (iCylinder >= 0 && iCylinder < this.aDiskData.length && iHead >= 0 && iHead < this.aDiskData[iCylinder].length) {
                    for (var i = iSector - 1; nSectors-- > 0 && i >= 0 && i < this.aDiskData[iCylinder][iHead].length; i++) {
                        var sector = this.aDiskData[iCylinder][iHead][i];
            
                        if (!nErrorCode) {
                            if (!sector.fDirty) {
                                sector.iModify = sector.cModify = 0;
                            }
                        } else {
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("doneWriteRemoteSectors(CHS=" + iCylinder + ':' + iHead + ':' + sector['sector'] + ") returned error " + nErrorCode);
                            }
                            this.queueDirtySector(sector, false);
                        }
                    }
                }
                if (fAsync) this.updateWriteTimer();
            };
            
            /**
             * disconnectRemoteDisk()
             *
             * This is called by our powerDown() notification handler.  If fRemote is true, we issue the disconnect
             * request and then immediately set fRemote to false; we don't wait for (or test) the response.
             *
             * @this {Disk}
             */
            Disk.prototype.disconnectRemoteDisk = function()
            {
                if (this.fRemote) {
                    var sParms = DiskAPI.QUERY.ACTION + '=' + DiskAPI.ACTION.CLOSE;
                    sParms += '&' + DiskAPI.QUERY.VOLUME + '=' + this.sDiskPath;
                    sParms += '&' + DiskAPI.QUERY.MACHINE + '=' + this.controller.getMachineID();
                    sParms += '&' + DiskAPI.QUERY.USER + '=' + this.controller.getUserID();
                    var sDiskURL = web.getHost() + DiskAPI.ENDPOINT + '?' + sParms;
                    web.loadResource(sDiskURL, true);
                    this.fRemote = false;
                }
            };
            
            /**
             * queueDirtySector(sector, fAsync)
             *
             * Mark the specified sector as dirty, add it to the queue (aDirtySectors) if not already added,
             * and establish a timeout handler (findDirtySectors) if not already established.
             *
             * A freshly dirtied sector should sit in the queue for a short period of time (eg, 2 seconds)
             * before we attempt to write it; that is, a REMOTE_WRITE_DELAY timer should start ticking again
             * for any sector that is rewritten.  However, there will be exceptions; for example, when a sector
             * is finally written, we want to take advantage of the write request to write any additional dirty
             * sectors that follow it, even if those additional sectors were written less than 2 seconds ago.
             *
             * @param {Object} sector
             * @param {boolean} fAsync (true to update write timer, false to not)
             * @return {boolean} true if write timer set, false if not
             */
            Disk.prototype.queueDirtySector = function(sector, fAsync)
            {
                sector.fDirty = true;
            
                var j = this.aDirtySectors.indexOf(sector);
                if (j >= 0) {
                    this.aDirtySectors.splice(j, 1);
                    this.aDirtyTimestamps.splice(j, 1);
                }
                this.aDirtySectors.push(sector);
                this.aDirtyTimestamps.push(usr.getTime());
            
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("queueDirtySector(CHS=" + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + "): " + this.aDirtySectors.length + " dirty");
                }
            
                return fAsync && this.updateWriteTimer();
            };
            
            /**
             * updateWriteTimer()
             *
             * If a timer is already active, make sure it's still valid (ie, the time the timer is scheduled to fire is
             * >= the timestamp of the next dirty sector + REMOTE_WRITE_DELAY); if not, cancel the timer and start a new one.
             *
             * @return {boolean} true if write timer set, false if not
             */
            Disk.prototype.updateWriteTimer = function()
            {
                if (this.aDirtySectors.length) {
                    var msWrite = this.aDirtyTimestamps[0] + Disk.REMOTE_WRITE_DELAY;
                    if (this.timerWrite) {
                        if (this.msTimerWrite < msWrite) {
                            clearTimeout(this.timerWrite);
                            this.timerWrite = null;
                        }
                    }
                    if (!this.timerWrite) {
                        var obj = this;
                        var msNow = usr.getTime();
                        var msDelay = msWrite - msNow;
                        if (msDelay < 0) msDelay = 0;
                        if (msDelay > Disk.REMOTE_WRITE_DELAY) msDelay = Disk.REMOTE_WRITE_DELAY;
                        this.timerWrite = setTimeout(function() {
                            obj.findDirtySectors(true);
                        }, msDelay);
                        this.msTimerWrite = msNow + msDelay;
                    }
                } else {
                    if (this.timerWrite) {
                        clearTimeout(this.timerWrite);
                        this.timerWrite = null;
                    }
                }
                return this.timerWrite !== null;
            };
            
            /**
             * findDirtySectors(fAsync)
             *
             * @param {boolean} fAsync is true if this function is being called asynchronously, false otherwise
             * @return {boolean|Array} false if no dirty sectors, otherwise true (or a response array if not fAsync)
             *
             * Starting with the oldest dirty sector in the queue (aDirtySectors), determine the longest contiguous stretch of
             * dirty sectors (currently limited to the same track), mark them all as not dirty, and then call writeRemoteSectors().
             */
            Disk.prototype.findDirtySectors = function(fAsync)
            {
                if (fAsync) {
                    this.timerWrite = null;
                }
                var sector = this.aDirtySectors[0];
                if (sector) {
                    var iCylinder = sector.iCylinder;
                    var iHead = sector.iHead;
                    var iSector = sector['sector'];
                    var nSectors = 0;
                    var abSectors = [];
                    for (var i = iSector - 1; i < this.aDiskData[iCylinder][iHead].length; i++) {
                        var sectorNext = this.aDiskData[iCylinder][iHead][i];
                        if (!sectorNext.fDirty) break;
                        var j = this.aDirtySectors.indexOf(sectorNext);
                        this.assert(j >= 0, "findDirtySectors(CHS=" + iCylinder + ':' + iHead + ':' + sectorNext['sector'] + ") missing from aDirtySectors");
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("findDirtySectors(CHS=" + iCylinder + ':' + iHead + ':' + sectorNext['sector'] + ")");
                        }
                        this.aDirtySectors.splice(j, 1);
                        this.aDirtyTimestamps.splice(j, 1);
                        abSectors = abSectors.concat(this.toBytes(sectorNext));
                        sectorNext.fDirty = false;
                        nSectors++;
                    }
                    this.assert(!!abSectors.length, "no data for dirty sector (CHS=" + iCylinder + ':' + iHead + ':' + sector['sector'] + ")");
                    var response = this.writeRemoteSectors(iCylinder, iHead, iSector, nSectors, abSectors, fAsync);
                    return fAsync || response;
                }
                return false;
            };
            
            /**
             * info()
             *
             * @this {Disk}
             * @return {Array} containing: [nCylinders, nHeads, nSectorsPerTrack, nBytesPerSector]
             */
            Disk.prototype.info = function()
            {
                if (!this.aDiskData.length) {
                    return [0, 0, 0, 0];
                }
                return [this.aDiskData.length, this.aDiskData[0].length, this.aDiskData[0][0].length, this.aDiskData[0][0][0]['length']];
            };
            
            /**
             * seek(iCylinder, iHead, iSector, fWrite, done)
             *
             * TODO: There's some dodgy code in seek() that allows floppy images to be dynamically
             * reconfigured with more heads and/or sectors/track, and it does so by peeking at more drive
             * properties.  That code used to be in the FDC component, where it was perfectly reasonable
             * to access those properties.  We need a cleaner interface back to the drive, similar to the
             * info() interface we provide to the controller.
             *
             * Whether or not the "dynamic reconfiguration" feature itself is perfectly reasonable is,
             * of course, a separate question.
             *
             * @this {Disk}
             * @param {number} iCylinder
             * @param {number} iHead
             * @param {number} iSector
             * @param {boolean} [fWrite]
             * @param {function(Object,boolean)} [done]
             * @return {Object|null} is the requested sector, or null if not found (or not available yet)
             */
            Disk.prototype.seek = function(iCylinder, iHead, iSector, fWrite, done)
            {
                var sector = null;
                var drive = this.drive;
                var cylinder = this.aDiskData[iCylinder];
                if (cylinder) {
                    var i;
                    var track = cylinder[iHead];
                    /*
                     * The following code allows a single-sided diskette image to be reformatted (ie, "expanded")
                     * as a double-sided image, provided the drive has more than one head (see drive.nHeads).
                     */
                    if (!track && drive.bFormatting && iHead < drive.nHeads) {
                        track = cylinder[iHead] = new Array(drive.bSectorEnd);
                        for (i = 0; i < track.length; i++) {
                            track[i] = this.initSector(null, iCylinder, iHead, i + 1, drive.nBytes, 0);
                        }
                    }
                    if (track) {
                        for (i = 0; i < track.length; i++) {
                            if (track[i] && track[i]['sector'] == iSector) {
                                /*
                                 * If the sector's pattern is null, then this sector's true contents have not yet
                                 * been fetched from the server.
                                 */
                                sector = track[i];
                                if (sector['pattern'] === null) {
                                    if (fWrite) {
                                        /*
                                         * Optimization: if the caller has explicitly told us that they're about to WRITE to the
                                         * sector, then we shouldn't need to read it from the server; assume a zero pattern and return.
                                         */
                                        sector['pattern'] = 0;
                                    } else {
                                        var nSectors = 1;
                                        /*
                                         * We know we need to read at least 1 sector, but let's count the number of trailing sectors
                                         * on the same track that may also be required.
                                         */
                                        while (++i < track.length) {
                                            if (track[i]['pattern'] === null) nSectors++;
                                        }
                                        this.readRemoteSectors(iCylinder, iHead, iSector, nSectors, done != null, function onReadRemoteComplete(err, fAsync) {
                                            if (err) sector = null;
                                            if (done) { //noinspection JSReferencingMutableVariableFromClosure
                                                done(sector, fAsync);
                                            }
                                        });
                                        return done? null : sector;
                                    }
                                }
                                break;
                            }
                        }
                        /*
                         * The following code allows an 8-sector track to be reformatted (ie, "expanded") as a 9-sector track.
                         */
                        if (!sector && drive.bFormatting && drive.bSector == 9) {
                            sector = track[i] = this.initSector(null, iCylinder, iHead, drive.bSector, drive.nBytes, 0);
                        }
                    }
                }
                if (done) done(sector, false);
                return sector;
            };
            
            /**
             * fill(sector, ab, off)
             *
             * @param {Object} sector
             * @param {*} ab (technically, this should be typed as Array.<number> but I'm having trouble coercing JSON.parse() to that)
             * @param {number} off
             */
            Disk.prototype.fill = function(sector, ab, off)
            {
                var cdw = sector['length'] >> 2;
                var adw = new Array(cdw);
                for (var idw = 0; idw < cdw; idw++) {
                    adw[idw] = ab[off] | (ab[off + 1] << 8) | (ab[off + 2] << 16) | (ab[off + 3] << 24);
                    off += 4;
                }
                sector['data'] = adw;
                /*
                 * TODO: Consider taking this opportunity to shrink 'data' down by the number of dwords at the end of the buffer that
                 * contain the same pattern, and setting 'pattern' accordingly.
                 */
            };
            
            /**
             * toBytes(sector)
             *
             * @param {Object} sector
             * @return {Array.<number>} is an array of bytes
             */
            Disk.prototype.toBytes = function(sector)
            {
                var cb = sector['length'];
                var ab = new Array(cb);
                var ib = 0;
                var cdw = cb >> 2;
                var adw = sector['data'];
                var dwPattern = sector['pattern'];
                for (var idw = 0; idw < cdw; idw++) {
                    var dw = (idw < adw.length? adw[idw] : dwPattern);
                    ab[ib++] = dw & 0xff;
                    ab[ib++] = (dw >> 8) & 0xff;
                    ab[ib++] = (dw >> 16) & 0xff;
                    ab[ib++] = (dw >> 24) & 0xff;
                }
                return ab;
            };
            
            /**
             * read(sector, ibSector, fCompare)
             *
             * @this {Disk}
             * @param {Object} sector (returned from a previous seek)
             * @param {number} ibSector a byte index within the given sector
             * @param {boolean} [fCompare] is true if this write-compare read
             * @return {number} the specified (unsigned) byte, or -1 if no more data in the sector
             */
            Disk.prototype.read = function(sector, ibSector, fCompare)
            {
                var b = -1;
                if (sector) {
                    if (DEBUG && !ibSector && !fCompare && this.messageEnabled()) {
                        this.printMessage('read("' + this.sDiskFile + '",CHS=' + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + ')');
                    }
                    if (ibSector < sector['length']) {
                        var adw = sector['data'];
                        var idw = ibSector >> 2;
                        var dw = (idw < adw.length ? adw[idw] : sector['pattern']);
                        b = ((dw >> ((ibSector & 0x3) << 3)) & 0xff);
                    }
                }
                return b;
            };
            
            /**
             * write(sector, ibSector, b)
             *
             * @this {Disk}
             * @param {Object} sector (returned from a previous seek)
             * @param {number} ibSector a byte index within the given sector
             * @param {number} b the byte value to write
             * @return {boolean|null} true if write successful, false if write-protected, null if out of bounds
             */
            Disk.prototype.write = function(sector, ibSector, b)
            {
                if (this.fWriteProtected)
                    return false;
            
                if (DEBUG && !ibSector && this.messageEnabled()) {
                    this.printMessage('write("' + this.sDiskFile + '",CHS=' + sector.iCylinder + ':' + sector.iHead + ':' + sector['sector'] + ')');
                }
            
                if (ibSector < sector['length']) {
                    if (b != this.read(sector, ibSector, true)) {
                        var adw = sector['data'];
                        var dwPattern = sector['pattern'];
                        var idw = ibSector >> 2;
                        var nShift = (ibSector & 0x3) << 3;
                        /*
                         * Ensure every byte up to the specified byte is properly initialized.
                         */
                        for (var i = adw.length; i <= idw; i++) adw[i] = dwPattern;
            
                        if (!sector.cModify) {
                            sector.iModify = idw;
                            sector.cModify = 1;
                        } else if (idw < sector.iModify) {
                            sector.cModify += sector.iModify - idw;
                            sector.iModify = idw;
                        } else if (idw >= sector.iModify + sector.cModify) {
                            sector.cModify += idw - (sector.iModify + sector.cModify) + 1;
                        }
                        adw[idw] = (adw[idw] & ~(0xff << nShift)) | (b << nShift);
            
                        if (this.fRemote) this.queueDirtySector(sector, true);
                    }
                    return true;
                }
                return null;
            };
            
            /**
             * save()
             *
             * The first array entry contains some disk information:
             *
             *      [sDiskPath, dwChecksum, nCylinders, nHeads, nSectors, cbSector]
             *
             * Each subsequent entry in the returned array contains the following:
             *
             *      [iCylinder, iHead, iSector, iModify, [...]]
             *
             * where [...] is an array of modified dword(s) in the corresponding sector.
             *
             * @this {Disk}
             * @return {Array} of modified sectors
             */
            Disk.prototype.save = function()
            {
                var i = 0;
                var deltas = [];
                deltas[i++] = [this.sDiskPath, this.dwChecksum, this.nCylinders, this.nHeads, this.nSectors, this.cbSector];
                if (!this.fRemote && !this.fWriteProtected) {
                    var aDiskData = this.aDiskData;
                    for (var iCylinder = 0; iCylinder < aDiskData.length; iCylinder++) {
                        for (var iHead = 0; iHead < aDiskData[iCylinder].length; iHead++) {
                            for (var iSector = 0; iSector < aDiskData[iCylinder][iHead].length; iSector++) {
                                var sector = aDiskData[iCylinder][iHead][iSector];
                                if (sector && sector.cModify) {
                                    var mods = [], n = 0;
                                    var iModify = sector.iModify, iModifyLimit = sector.iModify + sector.cModify;
                                    while (iModify < iModifyLimit) {
                                        mods[n++] = sector['data'][iModify++];
                                    }
                                    deltas[i++] = [iCylinder, iHead, iSector, sector.iModify, mods];
                                }
                            }
                        }
                    }
                }
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage('save("' + this.sDiskName + '"): saved ' + (deltas.length - 1) + ' change(s)');
                }
                return deltas;
            };
            
            /**
             * restore(deltas)
             *
             * The first array entry contains some disk information:
             *
             *      [sDiskPath, dwChecksum, nCylinders, nHeads, nSectors, cbSector]
             *
             * Each subsequent entry in the supplied array contains the following:
             *
             *      [iCylinder, iHead, iSector, iModify, [...]]
             *
             * where [...] is an array of modified dword(s) in the corresponding sector.
             *
             * @this {Disk}
             * @param {Array} deltas
             * @return {number} 0 if no changes applied, -1 if an error occurred, otherwise the number of sectors modified
             */
            Disk.prototype.restore = function(deltas)
            {
                /*
                 * If deltas is undefined, that's not necessarily an error;  the controller may simply be (re)initializing
                 * itself (although neither controller should be calling restore() under those conditions anymore).
                 */
                var nChanges = 0;
                var sReason = "unsupported restore format";
                /*
                 * I originally added a check for aDiskData here on the assumption that if there was an error loading
                 * a disk image, we will have already notified the user, so any additional errors about differing checksums,
                 * failure to restore the disk state, etc, would just be annoying.  HOWEVER, HDC will create an empty disk
                 * image if its initialization code discovers that no disk was loaded earlier (see verifyDrive).  So while
                 * checking aDiskData is still a good idea, be aware that it won't necessarily avoid redundant error messages
                 * (at least in the case of HDC).
                 */
                if (deltas && deltas.length > 0) {
            
                    var i = 0;
                    var aDiskInfo = deltas[i++];
            
                    if (aDiskInfo && aDiskInfo.length >= 2) {
                        /*
                         * Before getting to the checksum, we have to deal with a new situation: restoring an uninitialized
                         * disk image from a complete set of deltas.  And that is only possible if the disk was saved with the
                         * original disk geometry.
                         */
                        if (!this.aDiskData.length && aDiskInfo.length >= 6) {
                            this.create(DiskAPI.MODE.LOCAL, aDiskInfo[2], aDiskInfo[3], aDiskInfo[4], aDiskInfo[5]);
                            /*
                             * TODO: Consider setting a flag here that we can check at the end of the restore() function
                             * that indicates we should recalculate dwChecksum, because we currently have an inconsistency
                             * between local disks that are mounted via build() and the same disks that are "remounted"
                             * later by this code; the former has the correct checksum, while the latter has a null checksum.
                             *
                             * As you can see below, we currently deal with this by simply ignoring null checksums....
                             */
                        }
                        /*
                         * v1.01 failed to indicate an error if either one of these failure conditions occurred.  Although maybe that's
                         * just as well, since v1.01 also failed to properly deal with situations where the user mounted different diskette(s)
                         * prior to exiting (hopefully fixed in v1.02).
                         */
                        else if (aDiskInfo[1] != null && this.dwChecksum != null && aDiskInfo[1] != this.dwChecksum) {
                            sReason = "original checksum (" + aDiskInfo[1] + ") differs from current checksum (" + this.dwChecksum + ")";
                            nChanges = -2;
                        }
                        /*
                         * Checksum is more important than disk path, and for now, I want the flexibility to move disk images.
                         *
                        else if (aDiskInfo[0] != this.sDiskPath) {
                            sReason = "original path '" + aDiskInfo[0] + "' differs from current path '" + this.sDiskPath + "'";
                            nChanges = -1;
                        }
                         */
                    }
            
                    if (!this.aDiskData.length) nChanges = -1;
            
                    while (i < deltas.length && nChanges >= 0) {
                        var m = 0;
                        var mod = deltas[i++];
                        var iCylinder = mod[m++];
                        var iHead = mod[m++];
                        var iSector = mod[m++];
                        /*
                         * Note the buried test for write-protection.  Yes, an invariant condition should be tested
                         * outside the loop, not inside, but (a) it's a trivial test, (b) the test should never fail
                         * because save() should never generate any mods for a write-protected disk, and (c) it
                         * centralizes all the failure conditions we're currently checking (which, admittedly, ain't much).
                         */
                        if (iCylinder >= this.aDiskData.length || iHead >= this.aDiskData[iCylinder].length || iSector >= this.aDiskData[iCylinder][iHead].length) {
                            sReason = "sector (CHS=" + iCylinder + ':' + iHead + ':' + iSector + ") out of range (" + nChanges + " changes applied)";
                            nChanges = -1;
                            break;
                        }
                        if (this.fWriteProtected) {
                            sReason = "unable to modify write-protected disk";
                            nChanges = -1;
                            break;
                        }
                        var iModify = mod[m++];
                        var mods = mod[m++];
                        var iModifyLimit = iModify + mods.length;
                        var sector = this.aDiskData[iCylinder][iHead][iSector];
                        if (!sector) continue;
                        /*
                         * Since write() now deals with empty/partial sectors, we no longer need to completely "inflate" the sector prior
                         * to applying modifications.  So let's just make sure that the sector is "inflated" up to iModify.
                         */
                        var idw = sector['data'].length;
                        while (idw < iModify) {
                            sector['data'][idw++] = sector['pattern'];
                        }
                        var n = 0;
                        sector.iModify = iModify;
                        sector.cModify = mods.length;
                        while (iModify < iModifyLimit) {
                            sector['data'][iModify++] = mods[n++];
                        }
                        nChanges++;
                    }
                }
            
                if (nChanges < 0) {
                    /*
                     * We're suppressing checksum messages for the general public for now....
                     */
                    if (DEBUG || nChanges != -2) {
                        this.controller.notice("Unable to restore disk '" + this.sDiskName + ": " + sReason);
                    }
                } else {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage('restore("' + this.sDiskName + '"): restored ' + nChanges + ' change(s)');
                    }
                }
                return nChanges;
            };
            
            /**
             * toJSON()
             *
             * We perform some RegExp massaging on the JSON data to eliminate unnecessary properties
             * (eg, 'length' values of 512, 'pattern' values of 0, quotes around the property names, etc).
             * Sectors that were initially compressed should remain compressed unless/until they were modified.
             *
             * TODO: Check sectors (or at least modified sectors) to see if they can be recompressed.
             *
             * @this {Disk}
             * @return {string} containing the entire disk image as JSON-encoded data
             */
            Disk.prototype.toJSON = function()
            {
                var s = JSON.stringify(this.aDiskData);
                s = s.replace(/,"length":512/gm, "").replace(/,"pattern":0/gm, "");
                /*
                 * I don't really want to strip quotes from disk image property names, since I would have to put them
                 * back again during mount() -- or whenever JSON.parse() is used instead of eval().  But I still remove
                 * them temporarily, so that any remaining property names (eg, "iModify", "cModify", "fDirty") can
                 * easily be stripped out, by virtue of their being the only quoted properties left.  We then "requote"
                 * all the property names that remain.
                 */
                s = s.replace(/"(sector|length|data|pattern)":/gm, "$1:");
                /*
                 * The next line will remove any other numeric or boolean properties that were added at runtime, although
                 * they may have completely different ("minified") names if the code has been compiled.
                 */
                s = s.replace(/,"[^"]*":([0-9]+|true|false)/gm, "");
                s = s.replace(/(sector|length|data|pattern):/gm, "\"$1\":");
                return s;
            };
            
            /**
             * dumpSector(sector, pba, sDesc)
             *
             * @param {Object} sector (returned from a previous seek)
             * @param {number} [pba]
             * @param {string} [sDesc]
             * @return {string}
             */
            Disk.prototype.dumpSector = function(sector, pba, sDesc)
            {
                var sDump = "";
                if (DEBUG && sector) {
                    if (pba != null) sDump += "sector " + pba + (sDesc? (" for " + sDesc) : "") + ':';
                    var sBytes = "", sChars = "";
                    var cbSector = sector['length'];
                    var cdwData = sector['data'].length;
                    var dw = 0;
                    for (var i = 0; i < cbSector; i++) {
                        if ((i % 16) === 0) {
                            if (sDump) sDump += sBytes + ' ' + sChars + '\n';
                            sDump += str.toHex(i, 4) + ": ";
                            sBytes = sChars = "";
                        }
                        if ((i % 4) === 0) {
                            var idw = i >> 2;
                            dw = (idw < cdwData? sector['data'][idw] : sector['pattern']);
                        }
                        var b = dw & 0xff;
                        dw >>>= 8;
                        sBytes += str.toHex(b, 2) + (i % 16 == 7? "-" : " ");
                        sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                    }
                    if (sBytes) sDump += sBytes + ' ' + sChars;
                }
                return sDump;
            };
            
            if (typeof module !== 'undefined') module.exports = Disk;
            
          • fdc.js
            /**
             * @fileoverview Implements the PCjs Floppy Drive Controller (FDC) component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Aug-09
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var DiskAPI     = require("../../shared/lib/diskapi");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var ChipSet     = require("./chipset");
                var Disk        = require("./disk");
                var Computer    = require("./computer");
                var State       = require("./state");
            }
            
            /*
             * FDC Terms (see FDC.TERMS)
             *
             *      C       Cylinder Number         the current or selected cylinder number
             *
             *      D       Data                    the data pattern to be written to a sector
             *
             *      DS      Drive Select            the selected driver number encoded the same as bits 0 and 1 of the Digital Output
             *                                      Register (DOR); eg, DS0, DS1, DS2, or DS3
             *
             *      DTL     Data Length             when N is 00, DTL is the data length to be read from or written to a sector
             *
             *      EOT     End Of Track            the final sector number on a cylinder
             *
             *      GPL     Gap Length              the length of gap 3 (spacing between sectors excluding the VCO synchronous field)
             *
             *      H       Head Address            the head number, either 0 or 1, as specified in the ID field
             *
             *      HD      Head                    the selected head number, 0 or 1 (H = HD in all command words)
             *
             *      HLT     Head Load Time          the head load time in the selected drive (2 to 256 milliseconds in 2-millisecond
             *                                      increments for the 1.2M-byte drive and 4 to 512 milliseconds in 4 millisecond increments
             *                                      for the 320K-byte drive)
             *
             *      HUT     Head Unload Time        the head unload time after a read or write operation (0 to 240 milliseconds in
             *                                      16-millisecond increments for the 1.2M-byte drive and 0 to 480 milliseconds in
             *                                      32-millisecond increments for the 320K-byte drive)
             *
             *      MF      FM or MFM Mode          0 selects FM mode and 1 selects MFM (MFM is selected only if it is implemented)
             *
             *      MT      Multitrack              1 selects multitrack operation (both HD0 and HD1 will be read or written)
             *
             *      N       Number                  the number of data bytes written in a sector
             *
             *      NCN     New Cylinder Number     the new cylinder number for a SEEK operation
             *
             *      ND      Non-Data Mode           indicates an operation in the non-data mode
             *
             *      PCN     Present Cylinder Number the cylinder number at the completion of a SENSE INTERRUPT STATUS command
             *                                      (present position of the head)
             *
             *      R       Record                  the sector number to be read or written
             *
             *      SC      Sectors Per Cylinder    the number of sectors per cylinder
             *
             *      SK      Skip                    this stands for skip deleted-data address mark
             *
             *      SRT     Stepping Rate           this 4 bit byte indicates the stepping rate for the diskette drive as follows:
             *                                      1.2M-Byte Diskette Drive: 1111=1ms, 1110=2ms, 1101=3ms
             *                                      320K-Byte Diskette Drive: 1111=2ms, 1110=4ms, 1101=6ms
             *
             *      STP     STP Scan Test           if STP is 1, the data in contiguous sectors is compared with the data sent
             *                                      by the processor during a scan operation; if STP is 2, then alternate sections
             *                                      are read and compared
             */
            
            /**
             * FDC(parmsFDC)
             *
             * The FDC component simulates a NEC µPD765A or Intel 8272A compatible floppy disk controller, and has one
             * component-specific property:
             *
             *      autoMount: one or more JSON-encoded objects, each containing 'name' and 'path' properties
             *
             * Regarding early diskette drives: the IBM PC Model 5150 originally shipped with single-sided drives,
             * and therefore supported only 160Kb diskettes.  That's the only diskette format PC-DOS 1.00 supported, too.
             *
             * At some point, 5150's started shipping with double-sided drives, but I'm not sure whether the ROMs changed;
             * they probably did NOT change, because the original ROM BIOS already supported drives with multiple heads.
             * However, what the ROM BIOS did NOT do was provide any indication of drive type, which as far as I can tell,
             * meant you had to simply read/write/format tracks with the second head and check for errors.
             *
             * Presumably at the same time double-sided drives started shipping, PC-DOS 1.10 shipped, which added
             * support for 320Kb diskettes.  And the FORMAT command changed as well, defaulting to a double-sided format
             * operation UNLESS you specified "FORMAT /1".  If I run PC-DOS 1.10 and try to simulate a single-sided drive
             * (by setting drive.nHeads = 1 in initDrive), FORMAT will balk with "Track 0 bad - disk unusable".  I have to
             * wonder if everyone with single-sided drives who upgraded to PC-DOS 1.10 also got that error, forcing them
             * to always specify "FORMAT /1", or if I'm doing something wrong wrt single-sided drive simulation.
             *
             * I've noticed that if I turn FDC messages on ("m fdc on"), and then run "FORMAT B:/1", the command still
             * tries to format head 1/track 0, followed by head 0/track 0, and then the FDC is reset, and the format operation
             * proceeds with only head 0 for all tracks 0 through 39.  FORMAT successfully creates a 160Kb single-sided diskette,
             * but why it also tries to initially format track 0 using the second head remains a bit of a mystery.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsFDC
             */
            function FDC(parmsFDC) {
                /*
                 * TODO: Indicate the type of diskette image being loaded (this might help folks understand what's going
                 * on when they try to load a diskette image that's larger than what the selected operating system supports).
                 */
                Component.call(this, "FDC", parmsFDC, FDC, Messages.FDC);
            
                this['dmaRead'] = this.dmaRead;
                this['dmaWrite'] = this.dmaWrite;
                this['dmaFormat'] = this.dmaFormat;
            
                this.configMount = null;
                if (parmsFDC['autoMount']) {
                    this.configMount = parmsFDC['autoMount'];
                    if (typeof this.configMount == "string") {
                        try {
                            /*
                             * The most likely source of any exception will be right here, where we're parsing
                             * the JSON-encoded diskette data.
                             */
                            this.configMount = eval("(" + parmsFDC['autoMount'] + ")");
                        } catch (e) {
                            Component.error("FDC auto-mount error: " + e.message + " (" + parmsFDC['autoMount'] + ")");
                            this.configMount = null;
                        }
                    }
                }
            
                /*
                 * The following array keeps track of every disk image we've ever mounted.  Each entry in the
                 * array is another array whose elements are:
                 *
                 *      [0]: name of disk
                 *      [1]: path of disk
                 *      [2]: array of deltas, uninitialized until the disk is unmounted and/or all state is saved
                 *
                 * See functions addDiskHistory() and updateDiskHistory().
                 */
                this.aDiskHistory = [];
            
                /*
                 * Support for local disk images is currently limited to desktop browsers with FileReader support;
                 * when this flag is set, setBinding() allows local disk bindings and informs initBus() to update the
                 * "listDisks" binding accordingly.
                 */
                this.fLocalDisks = (!web.isMobile() && window && 'FileReader' in window);
            
                /*
                 * The remainder of FDC initialization now takes place in our initBus() handler, largely because we
                 * want initController() to have access to the ChipSet component, so that it can query switches and/or CMOS
                 * settings that determine the number of drives and their characteristics (eg, 40-track vs. 80-track),
                 * which it can then pass on to initDrive().
                 */
            }
            
            Component.subclass(FDC);
            
            FDC.DEFAULT_DRIVE_NAME = "Floppy Drive";
            
            if (DEBUG) {
                FDC.TERMS = {
                    C:   "C",       // Cylinder Number
                    D:   "D",       // Data (eg, pattern to be written to a sector)
                    H:   "H",       // Head Address
                    R:   "R",       // Record (ie, sector number to be read or written)
                    N:   "N",       // Number (ie, number of data bytes to write)
                    DS:  "DS",      // Drive Select
                    SC:  "SC",      // Sectors per Cylinder
                    DTL: "DTL",     // Data Length
                    EOT: "EOT",     // End of Track
                    GPL: "GPL",     // Gap Length
                    HLT: "HLT",     // Head Load Time
                    NCN: "NCN",     // New Cylinder Number
                    PCN: "PCN",     // Present Cylinder Number
                    SRT: "SRT",     // Stepping Rate
                    ST0: "ST0",     // Status Register 0
                    ST1: "ST1",     // Status Register 1
                    ST2: "ST2",     // Status Register 2
                    ST3: "ST3"      // Status Register 3
                };
            } else {
                FDC.TERMS = {};
            }
            
            /*
             * FDC Digital Output Register (DOR) (0x3F2, write-only)
             *
             * NOTE: Reportedly, a drive's MOTOR had to be ON before the drive could be selected; however, outFDCOutput() no
             * longer verifies that.  Also, motor start time for original drives was 500ms, but we make no attempt to simulate that.
             *
             * On the MODEL_5170 "PC AT Fixed Disk and Diskette Drive Adapter", this port is called the Digital Output Register
             * or DOR.  It uses the same bit definitions as the original FDC Output Register, except that only two diskette drives
             * are supported, hence bit 1 is always 0 (ie, FDC.REG_OUTPUT.DS2 and FDC.REG_OUTPUT.DS3 are not supported) and bits
             * 6 and 7 are unused (FDC.REG_OUTPUT.MOTOR_D2 and FDC.REG_OUTPUT.MOTOR_D3 are not supported).
             */
            FDC.REG_OUTPUT = {
                PORT:      0x3F2,
                DS:         0x03,   // drive select bits
                DS0:        0x00,
                DS1:        0x01,
                DS2:        0x02,   // reserved on the MODEL_5170
                DS3:        0x03,   // reserved on the MODEL_5170
                ENABLE:     0x04,   // clearing this bit resets the FDC
                INT_ENABLE: 0x08,   // enables both FDC and DMA (Channel 2) interrupt requests (IRQ 6)
                MOTOR_D0:   0x10,
                MOTOR_D1:   0x20,
                MOTOR_D2:   0x40,   // reserved on the MODEL_5170
                MOTOR_D3:   0x80    // reserved on the MODEL_5170
            };
            
            /*
             * FDC Main Status Register (0x3F4, read-only)
             *
             * On the MODEL_5170 "PC AT Fixed Disk and Diskette Drive Adapter", bits 2 and 3 are reserved, since that adapter
             * supported a maximum of two diskette drives.
             */
            FDC.REG_STATUS = {
                PORT:      0x3F4,
                BUSY_A:     0x01,
                BUSY_B:     0x02,
                BUSY_C:     0x04,   // reserved on the MODEL_5170
                BUSY_D:     0x08,   // reserved on the MODEL_5170
                BUSY:       0x10,   // a read or write command is in progress
                NON_DMA:    0x20,   // FDC is in non-DMA mode
                READ_DATA:  0x40,   // transfer is from FDC Data Register to processor (if clear, then transfer is from processor to the FDC Data Register)
                RQM:        0x80    // indicates FDC Data Register is ready to send or receive data to or from the processor (Request for Master)
            };
            
            /*
             * FDC Data Register (0x3F5, read-write)
             */
            FDC.REG_DATA = {
                PORT:      0x3F5,
                /*
                 * FDC Commands
                 *
                 * NOTE: FDC command bytes need to be masked with FDC.REG_DATA.CMD.MASK before comparing to the values below, since a
                 * number of commands use the following additional bits as follows:
                 *
                 *      SK (0x20): Skip Deleted Data Address Mark
                 *      MF (0x40): Modified Frequency Modulation (as opposed to FM or Frequency Modulation)
                 *      MT (0x80): multi-track operation (ie, data processed under both head 0 and head 1)
                 *
                 * We don't support MT (Multi-Track) operations at this time, and the MF and SK designations cannot be supported as long
                 * as our diskette images contain only the original data bytes without any formatting information.
                 */
                CMD: {
                    READ_TRACK:     0x02,
                    SPECIFY:        0x03,
                    SENSE_DRIVE:    0x04,
                    WRITE_DATA:     0x05,
                    READ_DATA:      0x06,
                    RECALIBRATE:    0x07,
                    SENSE_INT:      0x08,       // this command is used to clear the FDC interrupt following the clearing/setting of FDC.REG_OUTPUT.ENABLE
                    WRITE_DEL_DATA: 0x09,
                    READ_ID:        0x0A,
                    READ_DEL_DATA:  0x0C,
                    FORMAT_TRACK:   0x0D,
                    SEEK:           0x0F,
                    SCAN_EQUAL:     0x11,
                    SCAN_LO_EQUAL:  0x19,
                    SCAN_HI_EQUAL:  0x1D,
                    MASK:           0x1F,
                    SK:             0x20,       // SK (Skip Deleted Data Address Mark)
                    MF:             0x40,       // MF (Modified Frequency Modulation)
                    MT:             0x80        // MT (Multi-Track; ie, data under both heads will be processed)
                },
                /*
                 * FDC status/error results, generally assigned according to the corresponding ST0, ST1, ST2 or ST3 status bit.
                 *
                 * TODO: Determine when EQUIP_CHECK is *really* set; also, "77 step pulses" sounds suspiciously like a typo (it's not 79?)
                 */
                RES: {
                    NONE:           0x00000000, // ST0 (IC): Normal termination of command (NT)
                    NOT_READY:      0x00000008, // ST0 (NR): When the FDD is in the not-ready state and a read or write command is issued, this flag is set; if a read or write command is issued to side 1 of a single sided drive, then this flag is set
                    EQUIP_CHECK:    0x00000010, // ST0 (EC): If a fault signal is received from the FDD, or if the track 0 signal fails to occur after 77 step pulses (recalibrate command), then this flag is set
                    SEEK_END:       0x00000020, // ST0 (SE): When the FDC completes the Seek command, this flag is set to 1 (high)
                    INCOMPLETE:     0x00000040, // ST0 (IC): Abnormal termination of command (AT); execution of command was started, but was not successfully completed
                    RESET:          0x000000C0, // ST0 (IC): Abnormal termination because during command execution the ready signal from the drive changed state
                    INVALID:        0x00000080, // ST0 (IC): Invalid command issue (IC); command which was issued was never started
                    ST0:            0x000000FF,
                    NO_ID_MARK:     0x00000100, // ST1 (MA): If the FDC cannot detect the ID Address Mark, this flag is set; at the same time, the MD (Missing Address Mark in Data Field) of Status Register 2 is set
                    NOT_WRITABLE:   0x00000200, // ST1 (NW): During Execution of a Write Data, Write Deleted Data, or Format a Cylinder command, if the FDC detects a write protect signal from the FDD, then this flag is set
                    NO_DATA:        0x00000400, // ST1 (ND): FDC cannot find specified sector (or specified ID if READ_ID command)
                    DMA_OVERRUN:    0x00001000, // ST1 (OR): If the FDC is not serviced by the main systems during data transfers within a certain time interval, this flag is set
                    CRC_ERROR:      0x00002000, // ST1 (DE): When the FDC detects a CRC error in either the ID field or the data field, this flag is set
                    END_OF_CYL:     0x00008000, // ST1 (EN): When the FDC tries to access a sector beyond the final sector of a cylinder, this flag is set
                    ST1:            0x0000FF00,
                    NO_DATA_MARK:   0x00010000, // ST2 (MD): When data is read from the medium, if the FDC cannot find a Data Address Mark or Deleted Data Address Mark, then this flag is set
                    BAD_CYL:        0x00020000, // ST2 (BC): This bit is related to the ND bit, and when the contents of C on the medium are different from that stored in the ID Register, and the content of C is FF, then this flag is set
                    SCAN_FAILED:    0x00040000, // ST2 (SN): During execution of the Scan command, if the FDC cannot find a sector on the cylinder which meets the condition, then this flag is set
                    SCAN_EQUAL:     0x00080000, // ST2 (SH): During execution of the Scan command, if the condition of "equal" is satisfied, this flag is set
                    WRONG_CYL:      0x00100000, // ST2 (WC): This bit is related to the ND bit, and when the contents of C on the medium are different from that stored in the ID Register, this flag is set
                    DATA_FIELD:     0x00200000, // ST2 (DD): If the FDC detects a CRC error in the data, then this flag is set
                    STRL_MARK:      0x00400000, // ST2 (CM): During execution of the Read Data or Scan command, if the FDC encounters a sector which contains a Deleted Data Address Mark, this flag is set
                    ST2:            0x00FF0000,
                    DRIVE:          0x03000000, // ST3 (Ux): Status of the "Drive Select" signals from the diskette drive
                    HEAD:           0x04000000, // ST3 (HD): Status of the "Side Select" signal from the diskette drive
                    TWOSIDE:        0x08000000, // ST3 (TS): Status of the "Two Side" signal from the diskette drive
                    TRACK0:         0x10000000, // ST3 (T0): Status of the "Track 0" signal from the diskette drive
                    READY:          0x20000000, // ST3 (RY): Status of the "Ready" signal from the diskette drive
                    WRITEPROT:      0x40000000, // ST3 (WP): Status of the "Write Protect" signal from the diskette drive
                    FAULT:          0x80000000|0, // ST3 (FT): Status of the "Fault" signal from the diskette drive
                    ST3:            0xFF000000|0
                }
            };
            
            /*
             * FDC "Fixed Disk" Register (0x3F6, write-only)
             *
             * Since this register's functions are all specific to the Hard Disk Controller, see the HDC component for details.
             * The fact that this HDC register is in the middle of the FDC I/O port range is an oddity of the "HFCOMBO" controller.
             */
            
            /*
             * FDC Digital Input Register (0x3F7, read-only, MODEL_5170 only)
             *
             * Bit 7 indicates a diskette change (the MODEL_5170 introduced change-line support).  Bits 0-6 are for the selected
             * hard disk drive, so this port must be shared with the HDC; bits 0-6 are valid for 50 microseconds after a write to
             * the Drive Head Register.
             */
            FDC.REG_INPUT = {
                PORT:      0x3F7,
                DS0:        0x01,   // Drive Select 0
                DS1:        0x02,   // Drive Select 1
                HS0:        0x04,   // Head Select 0
                HS1:        0x08,   // Head Select 1
                HS2:        0x10,   // Head Select 2
                HS3:        0x20,   // Head Select 3
                WRITE_GATE: 0x40,   // Write Gate
                DISK_CHANGE:0x80    // Diskette Change
            };
            
            /*
             * FDC Diskette Control Register (0x3F7, write-only, MODEL_5170 only)
             *
             * Only bits 0-1 are used; bits 2-7 are reserved.
             */
            FDC.REG_CONTROL = {
                PORT:      0x3F7,
                RATE500K:   0x00,   // 500,000 bps
                RATE300K:   0x02,   // 300,000 bps
                RATE250K:   0x01,   // 250,000 bps
                RATEUNUSED: 0x03
            };
            
            /*
             * FDC Command Sequences
             *
             * For each command, cbReq indicates the total number of bytes in the command request sequence,
             * including the first (command) byte; cbRes indicates total number of bytes in the response sequence.
             */
            if (DEBUG) {
                FDC.CMDS = {
                    SPECIFY:      "SPECIFY",
                    SENSE_DRIVE:  "SENSE DRIVE",
                    WRITE_DATA:   "WRITE DATA",
                    READ_DATA:    "READ DATA",
                    RECALIBRATE:  "RECALIBRATE",
                    SENSE_INT:    "SENSE INTERRUPT",
                    READ_ID:      "READ ID",
                    FORMAT:       "FORMAT",
                    SEEK:         "SEEK"
                };
            } else {
                FDC.CMDS = {};
            }
            
            FDC.aCmdInfo = {
                0x03: {cbReq: 3, cbRes: 0, name: FDC.CMDS.SPECIFY},
                0x04: {cbReq: 2, cbRes: 1, name: FDC.CMDS.SENSE_DRIVE},
                0x05: {cbReq: 9, cbRes: 7, name: FDC.CMDS.WRITE_DATA},
                0x06: {cbReq: 9, cbRes: 7, name: FDC.CMDS.READ_DATA},
                0x07: {cbReq: 2, cbRes: 0, name: FDC.CMDS.RECALIBRATE},
                0x08: {cbReq: 1, cbRes: 2, name: FDC.CMDS.SENSE_INT},
                0x0A: {cbReq: 2, cbRes: 7, name: FDC.CMDS.READ_ID},
                0x0D: {cbReq: 6, cbRes: 7, name: FDC.CMDS.FORMAT},
                0x0F: {cbReq: 3, cbRes: 0, name: FDC.CMDS.SEEK}
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {FDC}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "listDisks")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            FDC.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                var fdc = this;
            
                switch (sBinding) {
            
                case "listDisks":
                    this.bindings[sBinding] = control;
            
                    control.onchange = function onChangeListDisks(event) {
                        var controlDesc = fdc.bindings["descDisk"];
                        var controlOption = control.options[control.selectedIndex];
                        if (controlDesc && controlOption) {
                            var dataValue = {};
                            var sValue = controlOption.getAttribute("data-value");
                            if (sValue) {
                                try {
                                    dataValue = eval("({" + sValue + "})");
                                } catch (e) {
                                    Component.error("FDC option error: " + e.message);
                                }
                            }
                            var sHTML = dataValue['desc'];
                            if (sHTML === undefined) sHTML = "";
                            var sHRef = dataValue['href'];
                            if (sHRef !== undefined) sHTML = "<a href=\"" + sHRef + "\" target=\"_blank\">" + sHTML + "</a>";
                            controlDesc.innerHTML = sHTML;
                        }
                    };
                    return true;
            
                case "descDisk":
                case "listDrives":
                    this.bindings[sBinding] = control;
                    /*
                     * I tried going with onclick instead of onchange, so that if you wanted to confirm what's
                     * loaded in a particular drive, you could click the drive control without having to change it.
                     * However, that doesn't seem to work for all browsers, so I've reverted to onchange.
                     */
                    control.onchange = function onChangeListDrives(event) {
                        var iDrive = str.parseInt(control.value, 10);
                        if (iDrive != null) fdc.displayDiskette(iDrive);
                    };
                    return true;
            
                case "loadDrive":
                    this.bindings[sBinding] = control;
                    control.onclick = function onClickLoadDrive(event) {
                        var controlDisks = fdc.bindings["listDisks"];
                        if (controlDisks) {
                            var sDisketteName = controlDisks.options[controlDisks.selectedIndex].text;
                            var sDiskettePath = controlDisks.value;
                            fdc.loadSelectedDrive(sDisketteName, sDiskettePath);
                        }
                    };
                    return true;
            
                case "mountDrive":
                    if (this.fLocalDisks) {
                        this.bindings[sBinding] = control;
                        /*
                         * Enable "Mount" button only if a file is actually selected
                         */
                        control.addEventListener('change', function() {
                            var fieldset = control.children[0];
                            var files = fieldset.children[0].files;
                            var submit = fieldset.children[1];
                            submit.disabled = !files.length;
                        });
            
                        control.onsubmit = function(event) {
                            var file = event.currentTarget[1].files[0];
                            if (file) {
                                var sDiskettePath = file.name;
                                var sDisketteName = str.getBaseName(sDiskettePath, true);
                                fdc.loadSelectedDrive(sDisketteName, sDiskettePath, file);
                            }
                            /*
                             * Prevent reloading of web page after form submission
                             */
                            return false;
                        };
                    }
                    else {
                        if (DEBUG) this.log("Local file support not available");
                        control.parentNode.removeChild(control);
                    }
                    return true;
            
                default:
                    break;
                }
                return false;
            };
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {FDC}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            FDC.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.cmp = cmp;
            
                this.chipset = cmp.getComponentByType("ChipSet");
            
                /*
                 * If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp() notification,
                 * at which point reset() would call initController(), or restore() would restore the controller; in that case, all we'd need
                 * to do here is call setReady().
                 */
                this.initController();
            
                bus.addPortInputTable(this, FDC.aPortInput);
                bus.addPortOutputTable(this, FDC.aPortOutput);
            
                if (this.fLocalDisks) {
                    this.addDiskette("Local Disk", "?");
                }
                this.addDiskette("Remote Disk", "??");
            
                if (!this.autoMount()) this.setReady();
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {FDC}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            FDC.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data || !this.restore) {
                        this.reset();
                        if (this.cmp.fReload) {
                            /*
                             * If the computer's fReload flag is set, we're required to toss all currently
                             * loaded disks and remount all disks specified in the auto-mount configuration.
                             */
                            this.unloadAllDrives(true);
                            this.autoMount(true);
                        }
                    } else {
                        if (!this.restore(data)) return false;
                    }
                    /*
                     * Populate the HTML controls to match the actual (well, um, specified) number of floppy drives.
                     */
                    var controlDrives;
                    if ((controlDrives = this.bindings['listDrives'])) {
                        while (controlDrives.firstChild) {
                            controlDrives.removeChild(controlDrives.firstChild);
                        }
                        controlDrives.textContent = "";
                        for (var iDrive = 0; iDrive < this.nDrives; iDrive++) {
                            var controlOption = window.document.createElement("option");
                            controlOption['value'] = iDrive;
                            /*
                             * TODO: This conversion of drive number to drive letter, starting with A:, is very simplistic
                             * and will NOT match the drive mappings that DOS ultimately uses.  We'll need to spiff this up at
                             * some point.
                             */
                            controlOption.textContent = String.fromCharCode(0x41 + iDrive) + ":";
                            controlDrives.appendChild(controlOption);
                        }
                        if (this.nDrives > 0) {
                            controlDrives.value = "0";
                            this.displayDiskette(0);
                        }
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {FDC}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            FDC.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save? this.save() : true;
            };
            
            /**
             * reset()
             *
             * NOTE: initController() establishes the maximum possible number of drives, but it's not until
             * we interrogate the current SW1 settings that we will have an ACTUAL number of drives (nDrives),
             * at which point we can also update the contents of the "listDrives" HTML control, if any.
             *
             * @this {FDC}
             */
            FDC.prototype.reset = function()
            {
                /*
                 * NOTE: The controller is also initialized by the constructor, to assist with auto-mount support,
                 * so think about whether we can skip powerUp initialization.
                 */
                this.initController();
            };
            
            /**
             * save()
             *
             * This implements save support for the FDC component.
             *
             * @this {FDC}
             * @return {Object}
             */
            FDC.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, this.saveController());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the FDC component.
             *
             * @this {FDC}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             */
            FDC.prototype.restore = function(data)
            {
                return this.initController(data[0]);
            };
            
            /**
             * initController(data)
             *
             * @this {FDC}
             * @param {Array} [data]
             * @return {boolean} true if successful, false if failure
             */
            FDC.prototype.initController = function(data)
            {
                var i = 0, iDrive;
                var fSuccess = true;
            
                if (data === undefined) {
                    data = [0, 0, FDC.REG_STATUS.RQM, new Array(9), 0, 0, 0, []];
                }
            
                /*
                 * Selected drive (from regOutput), which can only be selected if its motor is on (see regOutput).
                 */
                this.iDrive = data[i++];
                i++;                        // unused slot (if reused, bias by +4, since it was formerly a unit #)
            
                /*
                 * Defaults to FDC.REG_STATUS.RQM set (ready for command) and FDC.REG_STATUS.READ_DATA clear (data direction
                 * is from processor to the FDC Data Register).
                 */
                this.regStatus = data[i++];
            
                /*
                 * There can be up to 9 command bytes, and 7 result bytes, so 9 data registers are sufficient for communicating
                 * in both directions (hence, the new Array(9) default above).
                 */
                this.regDataArray = data[i++];
            
                /*
                 * Determines the next data byte to be received.
                 */
                this.regDataIndex = data[i++];
            
                /*
                 * Determines the next data byte to be sent (internally, we use regDataIndex to read data bytes, up to this total).
                 */
                this.regDataTotal = data[i++];
                this.regOutput = data[i++];
                var dataDrives = data[i++];
            
                /*
                 * Initialize the disk history (if available) before initializing the drives, so that any disk deltas can be
                 * applied to disk images that are already loaded.
                 */
                var aDiskHistory = data[i++];
                if (aDiskHistory != null) this.aDiskHistory = aDiskHistory;
            
                if (this.aDrives === undefined) {
                    this.nDrives = 4;                       // default to the maximum number of drives
                    if (this.chipset) this.nDrives = this.chipset.getSWFloppyDrives();
                    /*
                     * I would prefer to allocate only nDrives, but as discussed in the handling of the FDC.REG_DATA.CMD.SENSE_INT
                     * command, we're faced with situations where the controller must respond to any drive in the range 0-3, regardless
                     * how many drives are actually installed.  We still rely upon nDrives to determine the number of drives displayed
                     * to the user, however.
                     */
                    this.aDrives = new Array(4);
                }
            
                for (iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    var drive = this.aDrives[iDrive];
                    if (drive === undefined) {
                        /*
                         * The first time each drive is initialized, we query its capacity (based on switches or CMOS) and set
                         * the drive's physical limits accordingly (ie, max tracks, max heads, and max sectors/track).
                         */
                        drive = this.aDrives[iDrive] = {};
                        var nKb = (this.chipset? this.chipset.getSWFloppyDriveSize(iDrive) : 0);
                        switch(nKb) {
                        case 160:
                        case 180:
                            drive.nHeads = 1;       // required for single-sided drives only (all others default to double-sided)
                            /* falls through */
                        case 320:
                        case 360:
                            /* falls through */
                        default:                    // drives that don't have a recognized capacity default to 360
                            drive.nCylinders = 40;
                            drive.nSectors = 9;     // drives capable of writing 8 sectors/track can also write 9 sectors/track
                            break;
                        case 720:
                            drive.nCylinders = 80;
                            drive.nSectors = 9;
                            break;
                        case 1200:
                            drive.nCylinders = 80;
                            drive.nSectors = 15;
                            break;
                        case 1440:
                            drive.nCylinders = 80;
                            drive.nSectors = 18;
                            break;
                        }
                    }
                    if (!this.initDrive(drive, iDrive, dataDrives[iDrive])) {
                        fSuccess = false;
                    }
                }
            
                /*
                 * regInput and regControl (port 0x3F7) were not present on controllers prior to MODEL_5170, which is why
                 * we don't include initializers for them in the default data array; we could eliminate them on older models,
                 * but we don't have access to the model info right now, and there's no real cost to always including them
                 * in the FDC state.
                 *
                 * The bigger compatibility question is whether to always include hooks for them (see aPortInput and aPortOutput).
                 */
                this.regInput = data[i++] || 0;                             // TODO: Determine if we should default to FDC.REG_INPUT.DISK_CHANGE instead of 0
                this.regControl = data[i] || FDC.REG_CONTROL.RATE500K;      // default to maximum data rate
            
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("FDC initialized for " + this.aDrives.length + " drive(s)");
                }
                return fSuccess;
            };
            
            /**
             * saveController()
             *
             * @this {FDC}
             * @return {Array}
             */
            FDC.prototype.saveController = function()
            {
                var i = 0;
                var data = [];
                data[i++] = this.iDrive;
                data[i++] = 0;
                data[i++] = this.regStatus;
                data[i++] = this.regDataArray;
                data[i++] = this.regDataIndex;
                data[i++] = this.regDataTotal;
                data[i++] = this.regOutput;
                data[i++] = this.saveDrives();
                data[i++] = this.saveDeltas();
                data[i++] = this.regInput;
                data[i] = this.regControl;
                return data;
            };
            
            /**
             * initDrive(drive, iDrive, data)
             *
             * TODO: Consider a separate Drive class that both FDC and HDC can use, since there's a lot of commonality
             * between the drive objects created by both controllers.  This will clean up overall drive management and allow
             * us to factor out some common Drive methods (eg, advanceSector()).
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} iDrive
             * @param {Array|undefined} data
             * @return {boolean} true if successful, false if failure
             */
            FDC.prototype.initDrive = function(drive, iDrive, data)
            {
                var i = 0;
                var fSuccess = true;
            
                drive.iDrive = iDrive;
                drive.fBusy = drive.fLocal = false;
            
                if (data === undefined) {
                    /*
                     * We set a default of two heads (MODEL_5150 PCs originally shipped with single-sided drives,
                     * but the ROM BIOS appears to have always supported both drive types).
                     */
                    data = [FDC.REG_DATA.RES.RESET, true, 0, 2, 0];
                }
            
                if (typeof data[1] == "boolean") {
                    /*
                     * Note that when no data is provided (eg, when the controller is being reinitialized), we now take
                     * care to preserve any drive defaults that initController() already obtained for us, falling back to
                     * bare minimums only when all else fails.
                     */
                    data[1] = [
                        FDC.DEFAULT_DRIVE_NAME, // a[0]
                        drive.nCylinders || 40, // a[1]
                        drive.nHeads || data[3],// a[2]
                        drive.nSectors || 9,    // a[3]
                        drive.cbSector || 512,  // a[4]
                        data[1],                // a[5]
                        drive.nDiskCylinders,   // a[6]
                        drive.nDiskHeads,       // a[7]
                        drive.nDiskSectors      // a[8]
                    ];
                }
            
                /*
                 * resCode used to be an FDC global, but in order to insulate FDC state from the operation of various functions
                 * that operate on drive objects (eg, readData and writeData), I've made it a per-drive variable.  This choice,
                 * similar to my choice for handling PCN, may be contrary to how the actual hardware works, but I prefer this
                 * approach, as long as it doesn't expose any incompatibilities that any software actually cares about.
                 */
                drive.resCode = data[i++];
            
                /*
                 * Some additional drive properties/defaults that are largely for the Disk component's benefit.
                 */
                var a = data[i++];
                drive.name = a[0];
                drive.nCylinders = a[1];          // cylinders
                drive.nHeads = a[2];              // heads/cylinders
                drive.nSectors = a[3];            // sectors/track
                drive.cbSector = a[4];            // bytes/sector
                drive.fRemovable = a[5];
                /*
                 * If we have current media parameters, restore them; otherwise, default to the drive's physical parameters.
                 */
                if (drive.nDiskCylinders = a[6]) {
                    drive.nDiskHeads = a[7];
                    drive.nDiskSectors = a[8];
                } else {
                    drive.nDiskCylinders = drive.nCylinders;
                    drive.nDiskHeads = drive.nHeads;
                    drive.nDiskSectors = drive.nSectors;
                }
            
                /*
                 * The next group of properties are set by various FDC command sequences.
                 *
                 * We initialize this.iDrive (above) and drive.bHead and drive.bCylinder (below) to zero, but leave the rest undefined,
                 * awaiting their first FDC command.  We do this because the initial SENSE_INT command returns a PCN, which will also
                 * be undefined unless we have at least zeroed both the current drive and the "present" cylinder on that drive.
                 *
                 * Alternatively, I could make PCN a global FDC variable.  That may be closer to how the actual hardware operates,
                 * but I'm using per-drive variables so that the FDC component can be a good client to both the CPU and other components.
                 *
                 * COMPATIBILITY ALERT: The MODEL_5170 BIOS ("DSKETTE_SETUP") attempts to discern the drive type (double-density vs.
                 * high-capacity) by "slapping" the heads around -- "litrally" (it uses a constant named "TRK_SLAP" equal to 48).
                 * After seeking to "TRK_SLAP", the BIOS performs a series of seeks, looking for the precise point where the heads
                 * return to track 0.
                 *
                 * Here's how it works: the BIOS seeks to track 48 (which is fine on an 80-track 1.2Mb high-capacity drive, but 9 tracks
                 * too far on a 40-track 360Kb double-density drive), then seeks to track 10, and then seeks in single-track increments
                 * up to 10 more times until the SENSE_DRIVE command returns ST3 with the TRACK0 bit set.
                 *
                 * This implies that SEEK isn't really seeking to a specified cylinder, but rather it is calculating a delta from
                 * the previous cylinder to the specified cylinder, and stepping over that number of tracks.  Which means that SEEK
                 * is updating a "logical" cylinder number, not the "physical" (actual) cylinder number.  Presumably a RECALIBRATE
                 * command will bring the logical and physical values into sync, but once an out-of-bounds cylinder is requested, they
                 * will be out of sync.
                 *
                 * To simulate this, bCylinder is now treated as the "physical" cylinder (since that's how it's ALWAYS been used here),
                 * and bCylinderSeek will now track (pun intended) the "logical" cylinder that's programmed via SEEK commands.
                 */
                drive.bHead = data[i++];
                drive.bCylinderSeek = data[i++];        // the data[] slot where we used to store drive.nHeads (or -1)
                drive.bCylinder = data[i++];
                if (drive.bCylinderSeek >= 100) {       // verify that the saved bCylinderSeek is valid, otherwise sync it with bCylinder
                    drive.bCylinderSeek -= 100;
                } else {
                    drive.bCylinderSeek -= drive.bCylinder;
                }
                drive.bSector = data[i++];
                drive.bSectorEnd = data[i++];           // aka EOT
                drive.nBytes = data[i++];
            
                /*
                 * We no longer reinitialize drive.disk, in order to retain previously mounted diskette across resets.
                 */
            
                /*
                 * The next group of properties are managed by worker functions (eg, doRead()) to maintain state across DMA requests.
                 */
                drive.ibSector = data[i++];             // location of the next byte to be accessed in the current sector
                drive.sector = null;
            
                if (!drive.disk) {
                    drive.sDiskettePath = "";           // ensure this is initialized to a default that displayDiskette() can deal with
                }
            
                var deltas = data[i++];
                if (deltas == 102) deltas = false;      // v1.02 backward-compatibility
            
                if (typeof deltas == "boolean") {
                    var fLocal = deltas;
                    var sDisketteName = data[i++];
                    var sDiskettePath = data[i];
                    /*
                     * If we're restoring a local disk image, then the entire disk contents should be captured in aDiskHistory,
                     * so all we have to do is mount a blank diskette and let disk.restore() do the rest; ie, there's nothing to
                     * "load" (it's a purely synchronous operation).
                     *
                     * Otherwise, we must call loadDiskette(); in the common case, loadDiskette() will have already "auto-mounted"
                     * the diskette, so it will return true, and then we restore any deltas to the current image.
                     *
                     * However, if loadDiskette() returns false, then it has initiated the load for a *different* disk image,
                     * so we must mark ourselves as "not ready" again, and add another "wait for ready" test in Computer before
                     * finally powering the CPU.
                     */
                    if (fLocal) {
                        this.mountDiskette(iDrive, sDisketteName, sDiskettePath);
                    }
                    else if (this.loadDiskette(iDrive, sDisketteName, sDiskettePath, true)) {
                        if (drive.disk) {
                            if (sDiskettePath) {
                                this.addDiskHistory(sDisketteName, sDiskettePath, drive.disk);
                            } else {
                                if (DEBUG) Component.warning("Disk '" + (drive.disk.sDiskName || sDisketteName) + "' not recorded properly in drive " + iDrive);
                            }
                        }
                    } else {
                        this.setReady(false);
                    }
                } else if (deltas !== undefined) {
                    /*
                     * If there's any data at all (ie, if this is a restore and not a reset), then it must be in the
                     * pre-v1.02 save/restore format, so we'll restore as best we can, but be aware that if disk.restore()
                     * notices that the currently mounted disk image differs from the disk image that these deltas belong to,
                     * it will return false, and the restore operation will be aborted.
                     */
                    if (drive.disk && drive.disk.restore(deltas) < 0) {
                        fSuccess = false;
                    }
                }
            
                /*
                 * TODO: If loadDiskette() returned true, then this can happen immediately.  Otherwise, loadDiskette()
                 * will have merely "queued up" the load request and drive.disk won't be ready yet, so figure out how/when
                 * we can properly restore drive.sector in that case.
                 */
                if (fSuccess && drive.disk && drive.ibSector !== undefined) {
                    drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
                }
                return fSuccess;
            };
            
            /**
             * saveDrives()
             *
             * @this {FDC}
             * @return {Array}
             */
            FDC.prototype.saveDrives = function()
            {
                var i = 0;
                var data = [];
                for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    data[i++] = this.saveDrive(this.aDrives[iDrive]);
                }
                return data;
            };
            
            /**
             * saveDrive(drive)
             *
             * @this {FDC}
             * @return {Array}
             */
            FDC.prototype.saveDrive = function(drive)
            {
                var i = 0;
                var data = [];
                data[i++] = drive.resCode;
                data[i++] = [drive.name, drive.nCylinders, drive.nHeads, drive.nSectors, drive.cbSector, drive.fRemovable, drive.nDiskCylinders, drive.nDiskHeads, drive.nDiskSectors];
                data[i++] = drive.bHead;
                /*
                 * We used to store drive.nHeads in the next slot, but now we store bCylinderSeek,
                 * and we bias it by +100 so that initDrive() can distinguish it from older values.
                 */
                data[i++] = drive.bCylinderSeek + 100;
                data[i++] = drive.bCylinder;
                data[i++] = drive.bSector;
                data[i++] = drive.bSectorEnd;
                data[i++] = drive.nBytes;
                data[i++] = drive.ibSector;
                /*
                 * Now we deviate from the 1.01a save format: instead of next storing all the deltas for the
                 * currently mounted disk (if any), we store only the name and path of the currently mounted disk
                 * (if any).  Deltas for ALL disks, both currently mounted and previously mounted, are stored later.
                 *
                 *      data[i++] = drive.disk? drive.disk.save() : null;
                 *
                 * To indicate this deviation, we store neither a null nor a delta array, but a boolean (fLocal);
                 * if that boolean is not present, then the restore code will know it's dealing with a pre-v1.02 state.
                 */
                data[i++] = drive.fLocal;
                data[i++] = drive.sDisketteName;
                data[i] = drive.sDiskettePath;
                if (DEBUG && !drive.sDiskettePath && drive.disk && drive.disk.sDiskPath) {
                    Component.warning("Disk '" + drive.disk.sDiskName + "' not saved properly in drive " + drive.iDrive);
                }
                return data;
            };
            
            /**
             * saveDeltas()
             *
             * This returns an array of entries, one for each disk image we've ever mounted, including any deltas; ie:
             *
             *      [name, path, deltas]
             *
             * aDiskHistory contains exactly that, except that deltas may not be up-to-date for any currently mounted
             * disk image(s), so we call updateHistory() for all those disks, and then aDiskHistory is ready to be saved.
             *
             * @this {FDC}
             * @return {Array}
             */
            FDC.prototype.saveDeltas = function()
            {
                for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    var drive = this.aDrives[iDrive];
                    if (drive.disk) {
                        this.updateDiskHistory(drive.sDisketteName, drive.sDiskettePath, drive.disk);
                    }
                }
                return this.aDiskHistory;
            };
            
            /**
             * copyDrive(iDrive)
             *
             * @this {FDC}
             * @param {number} iDrive
             * @return {Object|undefined} drive (which may be undefined if the requested drive does not exist)
             */
            FDC.prototype.copyDrive = function(iDrive)
            {
                var driveNew;
                var driveOld = this.aDrives[iDrive];
                if (driveOld !== undefined) {
                    driveNew = {};
                    for (var p in driveOld) {
                        driveNew[p] = driveOld[p];
                    }
                }
                return driveNew;
            };
            
            /**
             * seekDrive(drive, iSector, nSectors)
             *
             * The FDC doesn't need this function, since all FDC requests from the CPU are handled by doCmd().  This function
             * is used by other components (eg, Debugger) to mimic an FDC request, using a drive object obtained from copyDrive(),
             * to avoid disturbing the internal state of the FDC's drive objects.
             *
             * Also note that in an actual FDC request, drive.nBytes is initialized to the size of a single sector; the extent
             * of the entire transfer is actually determined by a count that has been pre-loaded into the DMA controller.  The FDC
             * isn't even aware of the extent of the transfer, so in the case of a read request, all readData() can do is return
             * bytes until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
             *
             * Since seekDrive() is for use with non-DMA requests, we use nBytes to specify the length of the entire transfer.
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} iSector (a "logical" sector number, relative to the entire disk, NOT a physical sector number)
             * @param {number} nSectors
             * @return {boolean} true if successful, false if invalid position request
             */
            FDC.prototype.seekDrive = function(drive, iSector, nSectors)
            {
                if (drive.disk) {
                    var aDiskInfo = drive.disk.info();
                    var nCylinders = aDiskInfo[0];
                    var nHeads = aDiskInfo[1];
                    var nSectorsPerTrack = aDiskInfo[2];
                    var nSectorsPerCylinder = nHeads * nSectorsPerTrack;
                    var nSectorsPerDisk = nCylinders * nSectorsPerCylinder;
                    if (iSector + nSectors <= nSectorsPerDisk) {
                        drive.bCylinder = Math.floor(iSector / nSectorsPerCylinder);
                        iSector %= nSectorsPerCylinder;
                        drive.bHead = Math.floor(iSector / nSectorsPerTrack);
                        drive.bSector = (iSector % nSectorsPerTrack) + 1;
                        drive.nBytes = nSectors * aDiskInfo[3];
                        /*
                         * NOTE: We don't set bSectorEnd, as an FDC command would, but it's irrelevant, because we don't actually
                         * do anything with bSectorEnd at this point.  Perhaps someday, when we faithfully honor/restrict requests
                         * to a single track (or a single cylinder, in the case of multi-track requests).
                         */
                        drive.resCode = FDC.REG_DATA.RES.NONE;
                        /*
                         * At this point, we've finished simulating what an FDC.REG_DATA.CMD.READ_DATA command would have performed,
                         * up through doRead().  Now it's the caller responsibility to call readData(), just like the DMA Controller would.
                         */
                        return true;
                    }
                }
                return false;
            };
            
            /**
             * autoMount(fRemount)
             *
             * @this {FDC}
             * @param {boolean} [fRemount] is true if we're remounting all auto-mounted diskettes
             * @return {boolean} true if one or more diskette images are being auto-mounted, false if none
             */
            FDC.prototype.autoMount = function(fRemount)
            {
                if (!fRemount) this.cAutoMount = 0;
                if (this.configMount) {
                    for (var sDrive in this.configMount) {
                        var configDrive = this.configMount[sDrive];
                        if (configDrive['name'] && configDrive['path']) {
                            /*
                             * WARNING: This conversion of drive letter to drive number, starting with A:, is very simplistic
                             * and is not guaranteed to match the drive mapping that DOS ultimately uses.
                             */
                            var iDrive = sDrive.charCodeAt(0) - 0x41;
                            if (iDrive >= 0 && iDrive < this.aDrives.length) {
                                if (!this.loadDiskette(iDrive, configDrive['name'], configDrive['path'], true) && fRemount)
                                    this.setReady(false);
                                continue;
                            }
                        }
                        this.notice("Unrecognized auto-mount specification for drive " + sDrive);
                    }
                }
                return !!this.cAutoMount;
            };
            
            /**
             * loadSelectedDrive(sDisketteName, sDiskettePath, file)
             *
             * @this {FDC}
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             * @param {File} [file] is set if there's an associated File object
             */
            FDC.prototype.loadSelectedDrive = function(sDisketteName, sDiskettePath, file)
            {
                var iDrive;
                var controlDrives = this.bindings["listDrives"];
                if (controlDrives && !isNaN(iDrive = str.parseInt(controlDrives.value, 10)) && iDrive >= 0 && iDrive < this.aDrives.length) {
            
                    if (!sDiskettePath) {
                        this.unloadDrive(iDrive);
                        return;
                    }
            
                    if (sDiskettePath == "?") {
                        this.notice('Use "Choose File" and "Mount" to select and load a local disk.');
                        return;
                    }
            
                    /*
                     * If the special path of "??" is selected, then we want to prompt the user for a URL.  Oh, and
                     * make sure we pass an empty string as the 2nd parameter to prompt(), so that IE won't display
                     * "undefined" -- because after all, undefined and "undefined" are EXACTLY the same thing, right?
                     *
                     * TODO: This is literally all I've done to support remote disk images. There's probably more
                     * I should do, like dynamically updating "listDisks" to include new entries, and adding new entries
                     * to the save/restore data.
                     */
                    if (sDiskettePath == "??") {
                        sDiskettePath = window.prompt("Enter the URL of a remote disk image.", "") || "";
                        if (!sDiskettePath) return;
                        sDisketteName = str.getBaseName(sDiskettePath);
                        this.println("Attempting to load " + sDiskettePath + " as \"" + sDisketteName + "\"");
                    }
            
                    this.println("loading disk " + sDiskettePath + "...");
            
                    while (this.loadDiskette(iDrive, sDisketteName, sDiskettePath, false, file)) {
                        if (!window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)")) {
                            return;
                        }
                        /*
                         * So here's the story: loadDiskette() returned true, which it does ONLY if the specified disk is already
                         * mounted, AND the user clicked OK to reload the original disk image.  So we must toss any history we have
                         * for the disk, unload it, and then loop back around to loadDiskette().
                         *
                         * loadDiskette() should NEVER return true the second time, since no disk is loaded. In other words,
                         * this isn't really a loop so much as a one-time retry operation.
                         */
                        this.removeDiskHistory(sDisketteName, sDiskettePath);
                        this.unloadDrive(iDrive, false, true);
                    }
                    return;
                }
                this.notice("Nothing to load");
            };
            
            /**
             * mountDiskette(iDrive, sDisketteName, sDiskettePath)
             *
             * @this {FDC}
             * @param {number} iDrive
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             */
            FDC.prototype.mountDiskette = function(iDrive, sDisketteName, sDiskettePath)
            {
                var drive = this.aDrives[iDrive];
                this.unloadDrive(iDrive, true, true);
                drive.fLocal = true;
                var disk = new Disk(this, drive, DiskAPI.MODE.PRELOAD);
                this.doneLoadDiskette(drive, disk, sDisketteName, sDiskettePath, true);
            };
            
            /**
             * loadDiskette(iDrive, sDisketteName, sDiskettePath, fAutoMount, file)
             *
             * NOTE: If sDiskettePath is already loaded in the drive, nothing needs to be done.
             *
             * @this {FDC}
             * @param {number} iDrive
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             * @param {boolean} [fAutoMount]
             * @param {File} [file] is set if there's an associated File object
             * @return {boolean} true if diskette (already) loaded, false if queued up (or busy)
             */
            FDC.prototype.loadDiskette = function(iDrive, sDisketteName, sDiskettePath, fAutoMount, file)
            {
                var drive = this.aDrives[iDrive];
                if (sDiskettePath && drive.sDiskettePath != sDiskettePath) {
                    this.unloadDrive(iDrive, fAutoMount, true);
                    if (drive.fBusy) {
                        this.notice("Drive " + iDrive + " busy");
                        return true;
                    }
                    drive.fBusy = true;
                    if (fAutoMount) {
                        drive.fAutoMount = true;
                        this.cAutoMount++;
                        if (this.messageEnabled()) this.printMessage("loading diskette '" + sDisketteName + "'");
                    }
                    drive.fLocal = !!file;
                    var disk = new Disk(this, drive, DiskAPI.MODE.PRELOAD);
                    disk.load(sDisketteName, sDiskettePath, file, this.doneLoadDiskette);
                    return false;
                }
                return true;
            };
            
            /**
             * doneLoadDiskette(drive, disk, sDisketteName, sDiskettePath, fAutoMount)
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {Disk} disk is set if the disk was successfully loaded, null if not
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             * @param {boolean} [fAutoMount]
             */
            FDC.prototype.doneLoadDiskette = function onFDCLoadNotify(drive, disk, sDisketteName, sDiskettePath, fAutoMount)
            {
                var aDiskInfo;
            
                drive.fBusy = false;
            
                if (disk) {
                    /*
                     * We shouldn't mount the diskette unless the drive is able to handle it; for example, FD360 (40-track)
                     * drives cannot read FD1200 (80-track) diskettes.  However, I no longer require that the diskette's
                     * sectors/track fall within the drive's standard maximum, because XDF diskettes use 19 physical sectors/track
                     * on the first cylinder (1 more than the typical 18 sectors/track found on 1.44Mb diskettes) but declare
                     * a larger logical size (23 512-byte sectors/track) to reflect the actual capacity of XDF tracks beyond the
                     * first cylinder (ie, one 8Kb sector, one 2Kb sector, one 1Kb sector, and one 512-byte sector).
                     */
                    aDiskInfo = disk.info();
                    if (disk && aDiskInfo[0] > drive.nCylinders || aDiskInfo[1] > drive.nHeads /* || aDiskInfo[2] > drive.nSectors */) {
                        this.notice("Diskette \"" + sDisketteName + "\" too large for drive " + String.fromCharCode(0x41 + drive.iDrive));
                        disk = null;
                    }
                }
            
                if (disk) {
                    drive.disk = disk;
                    drive.sDisketteName = sDisketteName;
                    drive.sDiskettePath = sDiskettePath;
            
                    /*
                     * Adding local disk image names to the disk list seems like a nice idea, but it's too confusing,
                     * because then it looks like the "Mount" button should be able to (re)load them, and that can NEVER
                     * happen, for security reasons; local disk images can ONLY be loaded via the "Mount" button after
                     * the user has selected them via the "Choose File" button.
                     *
                     *      this.addDiskette(sDisketteName, sDiskettePath);
                     *
                     * So we're going to take a different approach: when displayDiskette() is asked to display the name
                     * of a local disk image, it will map all such disks to "Local Disk", and any attempt to "Mount" such
                     * a disk, will essentially result in a "Disk not found" error.
                     */
            
                    this.addDiskHistory(sDisketteName, sDiskettePath, disk);
            
                    /*
                     * For a local disk (ie, one loaded via mountDiskette()), the disk.restore() performed by addDiskHistory()
                     * may have altered the disk geometry, so refresh the disk info.
                     */
                    aDiskInfo = disk.info();
            
                    /*
                     * Clearly, a successful mount implies a disk change, and I suppose that, technically, an *unsuccessful*
                     * mount should imply the same, but what would the real-world analog be?  Inserting a piece of cardboard
                     * instead of an actual diskette?  In any case, if we can do the user a favor by pretending (as far as the
                     * disk change line is concerned) that an unsuccessful mount never happened, let's do it.
                     *
                     * Successful unmounts are a different story, however; those *do* trigger a change. See unloadDrive().
                     */
                    this.regInput |= FDC.REG_INPUT.DISK_CHANGE;
            
                    /*
                     * With the addition of notify(), users are now "alerted" whenever a diskette has finished loading;
                     * notify() is selective about its output, using print() if a print window is open, alert() otherwise.
                     *
                     * WARNING: This conversion of drive number to drive letter, starting with A:, is very simplistic
                     * and will not match the drive mappings that DOS ultimately uses (ie, for drives beyond B:).
                     */
                    this.notice("Mounted diskette \"" + sDisketteName + "\" in drive " + String.fromCharCode(0x41 + drive.iDrive), drive.fAutoMount || fAutoMount);
            
                    /*
                     * Update the drive's current media parameters to match the disk's.
                     */
                    drive.nDiskCylinders = aDiskInfo[0];
                    drive.nDiskHeads = aDiskInfo[1];
                    drive.nDiskSectors = aDiskInfo[2];
                }
                else {
                    drive.fLocal = false;
                }
            
                if (drive.fAutoMount) {
                    drive.fAutoMount = false;
                    if (!--this.cAutoMount) this.setReady();
                }
            
                this.displayDiskette(drive.iDrive);
            };
            
            /**
             * addDiskette(sName, sPath)
             *
             * @param {string} sName
             * @param {string} sPath
             */
            FDC.prototype.addDiskette = function(sName, sPath)
            {
                var controlDisks = this.bindings["listDisks"];
                if (controlDisks) {
                    for (var i = 0; i < controlDisks.options.length; i++) {
                        if (controlDisks.options[i].value == sPath) return;
                    }
                    var controlOption = window.document.createElement("option");
                    controlOption['value'] = sPath;
                    controlOption.textContent = sName;
                    controlDisks.appendChild(controlOption);
                }
            };
            
            /**
             * displayDiskette(iDrive, fUpdateDrive)
             *
             * @this {FDC}
             * @param {number} iDrive (unvalidated)
             * @param {boolean} [fUpdateDrive] is true to update the drive list to match the specified drive (eg, the auto-mount case)
             */
            FDC.prototype.displayDiskette = function(iDrive, fUpdateDrive)
            {
                /*
                 * First things first: validate iDrive.
                 */
                if (iDrive >= 0 && iDrive < this.aDrives.length) {
                    var drive = this.aDrives[iDrive];
                    var controlDisks = this.bindings["listDisks"];
                    var controlDrives = this.bindings["listDrives"];
                    /*
                     * Next, make sure controls for both drives and disks exist.
                     */
                    if (controlDisks && controlDrives) {
                        /*
                         * Next, make sure the drive whose disk we're updating is the currently selected drive.
                         */
                        var i;
                        var iDriveSelected = str.parseInt(controlDrives.value, 10);
                        var sTargetPath = (drive.fLocal? "?" : drive.sDiskettePath);
                        if (!isNaN(iDriveSelected) && iDriveSelected == iDrive) {
                            for (i = 0; i < controlDisks.options.length; i++) {
                                if (controlDisks.options[i].value == sTargetPath) {
                                    if (controlDisks.selectedIndex != i) {
                                        controlDisks.selectedIndex = i;
                                    }
                                    break;
                                }
                            }
                            if (i == controlDisks.options.length) controlDisks.selectedIndex = 0;
                        }
                        if (fUpdateDrive) {
                            for (i = 0; i < controlDrives.options.length; i++) {
                                if (str.parseInt(controlDrives.options[i].value, 10) == drive.iDrive) {
                                    if (controlDrives.selectedIndex != i) {
                                        controlDrives.selectedIndex = i;
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            };
            
            /**
             * unloadDrive(iDrive, fAutoUnload, fQuiet)
             *
             * @this {FDC}
             * @param {number} iDrive (pre-validated)
             * @param {boolean} [fAutoUnload] is true if this unload is being forced as part of an automount and/or restored mount
             * @param {boolean} [fQuiet]
             */
            FDC.prototype.unloadDrive = function(iDrive, fAutoUnload, fQuiet)
            {
                var drive = this.aDrives[iDrive];
                if (drive.disk) {
                    /*
                     * Before we toss the disk's information, capture any deltas that may have occurred.
                     */
                    this.updateDiskHistory(drive.sDisketteName, drive.sDiskettePath, drive.disk);
                    drive.sDisketteName = "";
                    drive.sDiskettePath = "";
                    drive.disk = null;
                    drive.fLocal = false;
            
                    this.regInput |= FDC.REG_INPUT.DISK_CHANGE;
            
                    /*
                     * WARNING: This conversion of drive number to drive letter, starting with A:, is very simplistic
                     * and is not guaranteed to match the drive mapping that DOS ultimately uses.
                     */
                    if (!fQuiet) {
                        this.notice("Drive " + String.fromCharCode(0x41 + iDrive) + " unloaded", fAutoUnload);
                    }
                    /*
                     * Try to avoid any unnecessary hysteresis regarding the diskette display if this unload is merely
                     * a prelude to another load.
                     */
                    if (!fAutoUnload && !fQuiet) {
                        this.displayDiskette(iDrive);
                    }
                }
            };
            
            /**
             * unloadAllDrives(fDiscard)
             *
             * @this {FDC}
             * @param {boolean} fDiscard to discard all disk history before unloading
             */
            FDC.prototype.unloadAllDrives = function(fDiscard)
            {
                if (fDiscard) {
                    this.aDiskHistory = [];
                }
                for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    this.unloadDrive(iDrive, true);
                }
            };
            
            /**
             * addDiskHistory(sDisketteName, sDiskettePath, disk)
             *
             * @this {FDC}
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             * @param {Disk} disk containing corresponding disk image
             */
            FDC.prototype.addDiskHistory = function(sDisketteName, sDiskettePath, disk)
            {
                var i;
                this.assert(!!sDiskettePath);
                for (i = 0; i < this.aDiskHistory.length; i++) {
                    if (this.aDiskHistory[i][1] == sDiskettePath) {
                        var nChanges = disk.restore(this.aDiskHistory[i][2]);
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("disk '" + sDisketteName + "' restored from history (" + nChanges + " changes)");
                        }
                        return;
                    }
                }
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("disk '" + sDisketteName + "' added to history (nothing to restore)");
                }
                this.aDiskHistory[i] = [sDisketteName, sDiskettePath, []];
            };
            
            /**
             * removeDiskHistory(sDisketteName, sDiskettePath)
             *
             * @this {FDC}
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             */
            FDC.prototype.removeDiskHistory = function(sDisketteName, sDiskettePath)
            {
                var i;
                for (i = 0; i < this.aDiskHistory.length; i++) {
                    if (this.aDiskHistory[i][1] == sDiskettePath) {
                        this.aDiskHistory.splice(i, 1);
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("disk '" + sDisketteName + "' removed from history");
                        }
                        return;
                    }
                }
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("unable to remove disk '" + sDisketteName + "' from history (" + sDiskettePath + ")");
                }
            };
            
            /**
             * updateDiskHistory(sDisketteName, sDiskettePath, disk)
             *
             * @this {FDC}
             * @param {string} sDisketteName
             * @param {string} sDiskettePath
             * @param {Disk} disk containing corresponding disk image, with possible deltas
             */
            FDC.prototype.updateDiskHistory = function(sDisketteName, sDiskettePath, disk)
            {
                var i;
                for (i = 0; i < this.aDiskHistory.length; i++) {
                    if (this.aDiskHistory[i][1] == sDiskettePath) {
                        this.aDiskHistory[i][2] = disk.save();
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("disk '" + sDisketteName + "' updated in history");
                        }
                        return;
                    }
                }
                /*
                 * I used to report this as an error (at least in the DEBUG release), but it's no longer really
                 * an error, because if we're trying to re-mount a clean copy of a disk, we toss its history, then
                 * unload, and then reload/remount.  And since unloadDrive's normal behavior is to call updateDiskHistory()
                 * before unloading, the fact that the disk is no longer listed here can't be treated as an error.
                 */
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("unable to update disk '" + sDisketteName + "' in history (" + sDiskettePath + ")");
                }
            };
            
            /**
             * outFDCOutput(port, bOut, addrFrom)
             *
             * @this {FDC}
             * @param {number} port (0x3F2, output only)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            FDC.prototype.outFDCOutput = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "OUTPUT");
                if (!(bOut & FDC.REG_OUTPUT.ENABLE)) {
                    this.initController();
                    /*
                     * initController() resets, among other things, the selected drive (this.iDrive), so if we were
                     * still updating this.iDrive below based on the "drive select" bits in regOutput, we would want
                     * to make sure those bits now match what initController() set.  But since we no longer do that
                     * (see below), this is no longer needed either.
                     *
                     *      bOut = (bOut & ~FDC.REG_OUTPUT.DS) | this.iDrive;
                     */
                }
                else if (!(this.regOutput & FDC.REG_OUTPUT.ENABLE)) {
                    /*
                     * When FDC.REG_OUTPUT.ENABLE transitions from 0 to 1, generate an interrupt.
                     */
                    if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
                        if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.FDC);
                    }
                }
                /*
                 * This no longer updates the internally selected drive (this.iDrive) based on regOutput, because (a) there seems
                 * to be no point, as all drive-related commands include their own "drive select" bits, and (b) it breaks the
                 * MODEL_5170 boot code.  Here's why:
                 *
                 * Unlike previous models, the MODEL_5170 BIOS probes all installed diskette drives to determine drive type;
                 * ie, FD360 (40-track) or FD1200 (80-track).  So if there are two drives, the last selected drive will be drive 1.
                 * Immediately before booting, the BIOS issues an INT 0x13/AH=0 reset, which writes regOutput two times: first
                 * with FDC.REG_OUTPUT.ENABLE clear, and then with it set.  However, both times, it ALSO loads the last selected
                 * drive number into regOutput's "drive select" bits.
                 *
                 * If we switched our selected drive to match regOutput, then the ST0 value we returned on an SENSE_INT command
                 * following the regOutput reset operation would indicate drive 1 instead of drive 0.  But the BIOS requires
                 * the ST0 result from the SENSE_INT command ALWAYS be 0xC0 (not 0xC1), so the controller must not be propagating
                 * regOutput's "drive select" bits in the way I originally assumed.
                 *
                 *      var iDrive = bOut & FDC.REG_OUTPUT.DS;
                 *      if (bOut & (FDC.REG_OUTPUT.MOTOR_D0 << iDrive)) this.iDrive = iDrive;
                 */
                this.regOutput = bOut;
            };
            
            /**
             * inFDCStatus(port, addrFrom)
             *
             * @this {FDC}
             * @param {number} port (0x3F4, input only)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            FDC.prototype.inFDCStatus = function(port, addrFrom)
            {
                this.printMessageIO(port, null, addrFrom, "STATUS", this.regStatus);
                return this.regStatus;
            };
            
            /**
             * inFDCData(port, addrFrom)
             *
             * @this {FDC}
             * @param {number} port (0x3F5, input/output)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            FDC.prototype.inFDCData = function(port, addrFrom)
            {
                var bIn = 0;
                if (this.regDataIndex < this.regDataTotal) {
                    bIn = this.regDataArray[this.regDataIndex];
                }
                /*
                 * As per the discussion in doCmd(), once the first byte of the Result Phase has been read, the interrupt must be cleared.
                 */
                if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
                    if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.FDC);
                }
                if (this.messageEnabled()) {
                    this.printMessageIO(port, null, addrFrom, "DATA[" + this.regDataIndex + "]", bIn);
                }
                if (++this.regDataIndex >= this.regDataTotal) {
                    this.regStatus &= ~(FDC.REG_STATUS.READ_DATA | FDC.REG_STATUS.BUSY);
                    this.regDataIndex = this.regDataTotal = 0;
                }
                return bIn;
            };
            
            /**
             * outFDCData(port, bOut, addrFrom)
             *
             * @this {FDC}
             * @param {number} port (0x3F5, input/output)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            FDC.prototype.outFDCData = function(port, bOut, addrFrom)
            {
                if (this.messageEnabled()) {
                    this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.regDataTotal + "]");
                }
            
                if (this.regDataTotal < this.regDataArray.length) {
                    this.regDataArray[this.regDataTotal++] = bOut;
                }
                var bCmd = this.regDataArray[0];
                var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
                if (FDC.aCmdInfo[bCmdMasked] !== undefined) {
                    if (this.regDataTotal >= FDC.aCmdInfo[bCmdMasked].cbReq) {
                        this.doCmd();
                    }
                    return;
                }
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("unsupported FDC command: " + str.toHexByte(bCmd));
                    this.dbg.stopCPU();
                }
            };
            
            /**
             * inFDCInput(port, addrFrom)
             *
             * @this {FDC}
             * @param {number} port (0x3F7, input only, MODEL_5170 only)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            FDC.prototype.inFDCInput = function(port, addrFrom)
            {
                var bIn = this.regInput;
                /*
                 * TODO: Determine when the DISK_CHANGE bit is *really* cleared (this is just a guess)
                 */
                this.regInput &= ~FDC.REG_INPUT.DISK_CHANGE;
                this.printMessageIO(port, null, addrFrom, "INPUT", bIn);
                return bIn;
            };
            
            /**
             * outFDCControl(port, bOut, addrFrom)
             *
             * @this {FDC}
             * @param {number} port (0x3F7, output only, MODEL_5170 only)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            FDC.prototype.outFDCControl = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "CONTROL");
                this.regControl  = bOut;
            };
            
            /**
             * doCmd()
             *
             * @this {FDC}
             */
            FDC.prototype.doCmd = function()
            {
                var fIRQ = false;
                this.regDataIndex = 0;
                var bCmd = this.popCmd();
                var drive, bDrive, bHead, c, h, r, n;
            
                /*
                 * NOTE: We currently ignore the FDC.REG_DATA.CMD.SK, FDC.REG_DATA.CMD.MF and FDC.REG_DATA.CMD.MT bits of every command.
                 * The only command bit of possible interest down the road might be the FDC.REG_DATA.CMD.MT (Multi-Track); the rest relate
                 * to storage format details that we cannot emulate as long as our diskette images contain nothing more than sector
                 * data without any formatting data.
                 *
                 * Similarly, we ignore parameters like SRT, HUT, HLT and the like, since our "motors" don't require physical delays;
                 * however, if timing issues become compatibility issues, we'll have to revisit those delays.  In any case, the maximum
                 * speed of the simulation will still be limited by various spin-loops in the ROM BIOS that wait prescribed times, so even
                 * with infinitely fast hardware, the simulation will never run as fast as it theoretically could, unless we opt to identify
                 * those spin-loops and either patch them or skip over them.
                 */
                var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
            
                switch (bCmdMasked) {
                case FDC.REG_DATA.CMD.SPECIFY:                      // 0x03
                    this.popSRT();                                  // SRT and HUT (encodings?)
                    this.popHLT();                                  // HLT and ND (encodings?)
                    this.beginResult();
                    /*
                     * No results are provided by this command, and fIRQ should remain false
                     */
                    break;
            
                case FDC.REG_DATA.CMD.SENSE_DRIVE:                  // 0x04
                    bDrive = this.popCmd(FDC.TERMS.DS);
                    bHead = (bDrive >> 2) & 0x1;
                    this.iDrive = (bDrive & 0x3);
                    drive = this.aDrives[this.iDrive];
                    this.beginResult();
                    this.pushST3(drive);
                    break;
            
                case FDC.REG_DATA.CMD.WRITE_DATA:                   // 0x05
                case FDC.REG_DATA.CMD.READ_DATA:                    // 0x06
                    bDrive = this.popCmd(FDC.TERMS.DS);             // Drive Select
                    bHead = (bDrive >> 2) & 0x1;                    // isolate HD (Head Select) bits
                    this.iDrive = (bDrive & 0x3);                   // isolate DS (Drive Select, aka Unit Select) bits
                    drive = this.aDrives[this.iDrive];
                    drive.bHead = bHead;
                    c = drive.bCylinder = this.popCmd(FDC.TERMS.C); // C
                    h = this.popCmd(FDC.TERMS.H);                   // H
                    /*
                     * Controller docs say that H should always match HD, so I assert that, but what if someone
                     * made a mistake and didn't program them identically -- what would happen?  Which should we honor?
                     */
                    this.assert(h == bHead);
                    r = drive.bSector = this.popCmd(FDC.TERMS.R);   // R
                    n = this.popCmd(FDC.TERMS.N);                   // N
                    drive.nBytes = 128 << n;                        // 0 => 128, 1 => 256, 2 => 512, 3 => 1024
                    drive.bSectorEnd = this.popCmd(FDC.TERMS.EOT);  // EOT (final sector number on a cylinder)
                    this.popCmd(FDC.TERMS.GPL);                     // GPL (spacing between sectors, excluding VCO Sync Field; 3)
                    this.popCmd(FDC.TERMS.DTL);                     // DTL (when N is 0, DTL stands for the data length to read out or write into the sector)
                    if (bCmdMasked == FDC.REG_DATA.CMD.READ_DATA)
                        this.doRead(drive);
                    else
                        this.doWrite(drive);
                    this.pushResults(drive, bCmd, bHead, c, h, r, n);
                    fIRQ = true;
                    break;
            
                case FDC.REG_DATA.CMD.RECALIBRATE:                  // 0x07
                    bDrive = this.popCmd(FDC.TERMS.DS);
                    this.iDrive = (bDrive & 0x3);
                    drive = this.aDrives[this.iDrive];
                    drive.bCylinder = drive.bCylinderSeek = 0;
                    drive.resCode = FDC.REG_DATA.RES.SEEK_END | FDC.REG_DATA.RES.TRACK0;
                    this.beginResult();                             // no results provided; this command is typically followed by FDC.REG_DATA.CMD.SENSE_INT
                    fIRQ = true;
                    break;
            
                case FDC.REG_DATA.CMD.SENSE_INT:                    // 0x08
                    drive = this.aDrives[this.iDrive];
                    drive.bHead = 0;                                // this command is documented as ALWAYS returning a head address of 0 in ST0; see pushST0()
                    this.beginResult();
                    this.pushST0(drive);
                    this.pushResult(drive.bCylinder, FDC.TERMS.PCN);
                    /*
                     * For some strange reason, the "DISK_RESET" function in the MODEL_5170_REV3 BIOS resets the
                     * adapter and then issues FOUR -- that's right, not ONE but FOUR -- SENSE INTERRUPT STATUS commands
                     * in a row, and expects ST0 to contain a different drive number after each command (first 0, then 1,
                     * then 2, and finally 3).  What makes this doubly weird is SENSE INTERRUPT STATUS (unlike SENSE
                     * DRIVE STATUS) is a drive-agnostic command.
                     *
                     * Didn't the original PC AT "HFCOMBO" controller limit support to TWO diskette drives max?
                     * And even if the PC AT supported other FDC controllers that DID support up to FOUR diskette drives,
                     * why should "DISK_RESET" hard-code a 4-drive loop?
                     *
                     * Well, whatever.  All this head-scratching doesn't change the fact that I apparently have to
                     * "auto-increment" the internal drive number (this.iDrive) after each SENSE INTERRUPT STATUS command.
                     */
                    this.iDrive = (this.iDrive + 1) & 0x3;
                    /*
                     * No interrupt is generated by this command, so fIRQ should remain false.
                     */
                    break;
            
                case FDC.REG_DATA.CMD.READ_ID:                      // 0x0A
                    /*
                     * This command is used by "SETUP_DBL" in the MODEL_5170_REV3 BIOS to determine if a double-density
                     * (40-track) diskette has been inserted in a high-density (80-track) drive; ie, whether "double stepping"
                     * is required, since only 40 of the 80 possible "steps" are valid for a double-density diskette.
                     *
                     * To start, we'll focus on making this work in the normal case (80-track diskette in 80-track drive).
                     */
                    bDrive = this.popCmd(FDC.TERMS.DS);
                    bHead = (bDrive >> 2) & 0x1;
                    this.iDrive = (bDrive & 0x3);
                    drive = this.aDrives[this.iDrive];
                    c = drive.bCylinder;
                    h = drive.bHead = bHead;
                    r = drive.bSector = 1;
                    n = 0;
                    drive.resCode = FDC.REG_DATA.RES.NONE;
                    if (drive.disk && (drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector))) {
                        n = drive.sector.length;
                    } else {
                        /*
                         * TODO: Determine the appropriate response code(s) for the possible errors that can occur here.
                         */
                        drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
                    }
                    this.pushResults(drive, bCmd, bHead, c, h, r, n);
                    fIRQ = true;
                    break;
            
                case FDC.REG_DATA.CMD.FORMAT_TRACK:                 // 0x0D
                    bDrive = this.popCmd(FDC.TERMS.DS);
                    bHead = (bDrive >> 2) & 0x1;
                    this.iDrive = (bDrive & 0x3);
                    drive = this.aDrives[this.iDrive];
                    c = drive.bCylinder;
                    h = drive.bHead = bHead;
                    r = 1;
                    n = this.popCmd(FDC.TERMS.N);                   // N
                    drive.nBytes = 128 << n;                        // 0 => 128, 1 => 256, 2 => 512, 3 => 1024 (bytes/sector)
                    drive.bSectorEnd = this.popCmd(FDC.TERMS.SC);   // SC (sectors/track)
                    this.popCmd(FDC.TERMS.GPL);                     // GPL (spacing between sectors, excluding VCO Sync Field; 3)
                    drive.bFiller = this.popCmd(FDC.TERMS.D);       // D (filler byte)
                    this.doFormat(drive);
                    this.pushResults(drive, bCmd, bHead, c, h, r, n);
                    fIRQ = true;
                    break;
            
                case FDC.REG_DATA.CMD.SEEK:                         // 0x0F
                    bDrive = this.popCmd(FDC.TERMS.DS);
                    bHead = (bDrive >> 2) & 0x1;
                    this.iDrive = (bDrive & 0x3);
                    drive = this.aDrives[this.iDrive];
                    drive.bHead = bHead;
                    /*
                     * As discussed in initDrive(), we can no longer simply set bCylinder to the specified NCN;
                     * instead, we must calculate the delta between bCylinderSeek and the NCN, and adjust bCylinder
                     * by that amount.  Then we simply move the NCN into bCylinderSeek without any range checking.
                     *
                     * Since bCylinder is now expressly defined as the "physical" cylinder number, it must never
                     * be allowed to exceed the physical boundaries of the drive (ie, never lower than 0, and never
                     * greater than or equal to nCylinders).
                     */
                    c = this.popCmd(FDC.TERMS.NCN);
                    drive.bCylinder += c - drive.bCylinderSeek;
                    if (drive.bCylinder < 0) drive.bCylinder = 0;
                    if (drive.bCylinder >= drive.nCylinders) drive.bCylinder = drive.nCylinders - 1;
                    drive.bCylinderSeek = c;
                    drive.resCode = FDC.REG_DATA.RES.SEEK_END;
                    /*
                     * TODO: To properly support ALL the ST3 result bits (not just TRACK0), we need a resCode
                     * update() function that all FDC commands can use.  This code is merely sufficient to get us
                     * through the "DSKETTE_SETUP" gauntlet in the MODEL_5170 BIOS.
                     */
                    if (!drive.bCylinder) {
                        drive.resCode |= FDC.REG_DATA.RES.TRACK0;
                    }
                    this.beginResult();                             // like FDC.REG_DATA.CMD.RECALIBRATE, no results are provided
                    fIRQ = true;
                    break;
            
                default:
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("FDC operation unsupported (command=" + str.toHexByte(bCmd) + ")");
                        this.dbg.stopCPU();
                    }
                    break;
                }
            
                if (this.regDataTotal > 0) this.regStatus |= (FDC.REG_STATUS.READ_DATA | FDC.REG_STATUS.BUSY);
            
                /*
                 * After the Execution Phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written),
                 * an interrupt is supposed to occur, signaling the beginning of the Result Phase.  Once the first byte of the
                 * result has been read, the interrupt is cleared (see inFDCData).
                 *
                 * TODO: Technically, interrupt request status should be cleared by the FDC.REG_DATA.CMD.SENSE_INT command; in fact,
                 * if that command is issued and no interrupt was pending, then FDC.REG_DATA.RES.INVALID should be returned (via ST0).
                 */
                if (this.regOutput & FDC.REG_OUTPUT.INT_ENABLE) {
                    if (drive && !(drive.resCode & FDC.REG_DATA.RES.NOT_READY) && fIRQ) {
                        if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.FDC);
                    }
                }
            };
            
            /**
             * pushResults(drive, bCmd, bHead, c, h, r, n)
             *
             * @param {Object} drive
             * @param {number} bCmd
             * @param {number} bHead
             * @param {number} c
             * @param {number} h
             * @param {number} r
             * @param {number} n
             */
            FDC.prototype.pushResults = function(drive, bCmd, bHead, c, h, r, n)
            {
                this.beginResult();
                this.pushST0(drive);
                this.pushST1(drive);
                this.pushST2(drive);
                /*
                 * NOTE: I used to set the following C/H/R/N results using the values that advanceSector() had "advanced"
                 * them to, which seemed logical but was technically incorrect.  For non-multi-track reads, they should match
                 * the programmed C/H/R/N values, except when EOT has been reached, in which case C = C + 1 and R = 1.
                 *
                 * For multi-track, the LSB of H should be complemented whenever EOT has been reached, which I "informally"
                 * detect by testing if the drive's current bCylinder and/or bHead positions advanced to a new cylinder or head,
                 * and apparently, C should never be advanced if H was initially 0.
                 *
                 * I don't do strict EOT comparisons here or elsewhere, because it allows the controller to work with a wider
                 * range of disks (eg, "fake" XDF disk images that contain 23 512-byte sectors/track).
                 */
                var i = 0;
                if (c != drive.bCylinder || h != drive.bHead) {
                    i = r = 1;
                }
                if (bCmd & FDC.REG_DATA.CMD.MT) {
                    h ^= i;
                    if (!bHead) i = 0;
                }
                c += i;
                this.pushResult(c, FDC.TERMS.C);                // formerly drive.bCylinder
                this.pushResult(h, FDC.TERMS.H);                // formerly drive.bHead
                this.pushResult(r, FDC.TERMS.R);                // formerly drive.bSector
                this.pushResult(n, FDC.TERMS.N);
            };
            
            /**
             * popCmd(name)
             *
             * @this {FDC}
             * @param {string|undefined} [name]
             * @return {number}
             */
            FDC.prototype.popCmd = function(name)
            {
                this.assert((!this.regDataIndex || name !== undefined) && this.regDataIndex < this.regDataTotal);
                var bCmd = this.regDataArray[this.regDataIndex];
                if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) {
                    var bCmdMasked = bCmd & FDC.REG_DATA.CMD.MASK;
                    if (!name && !this.regDataIndex && FDC.aCmdInfo[bCmdMasked]) name = FDC.aCmdInfo[bCmdMasked].name;
                    this.printMessage("FDC.CMD[" + (name || this.regDataIndex) + "]: " + str.toHexByte(bCmd), true);
                }
                this.regDataIndex++;
                return bCmd;
            };
            
            /**
             * popHLT()
             *
             * NOTE: This byte is actually a combination of HLT (Head Load Time) and ND (Non-DMA Mode)
             *
             * @this {FDC}
             */
            FDC.prototype.popHLT = function()
            {
                this.popCmd(FDC.TERMS.HLT);
             // this.nHLT = this.popCmd(FDC.TERMS.HLT);
            };
            
            /**
             * popSRT()
             *
             * NOTE: This byte is actually a combination of SRT (Step Rate Time) and HUT (Head Unload Time)
             *
             * @this {FDC}
             */
            FDC.prototype.popSRT = function()
            {
                this.popCmd(FDC.TERMS.SRT);
             // this.nSRT = this.popCmd(FDC.TERMS.SRT);
            };
            
            /**
             * beginResult()
             *
             * @this {FDC}
             */
            FDC.prototype.beginResult = function()
            {
                this.regDataIndex = this.regDataTotal = 0;
            };
            
            /**
             * pushResult(bResult, name)
             *
             * @this {FDC}
             * @param {number} bResult
             * @param {string|undefined} [name]
             */
            FDC.prototype.pushResult = function(bResult, name)
            {
                if (DEBUG && this.messageEnabled(Messages.PORT | Messages.FDC)) {
                    this.printMessage("FDC.RES[" + (name || this.regDataTotal) + "]: " + str.toHexByte(bResult), true);
                }
                this.regDataArray[this.regDataTotal++] = bResult;
            };
            
            /**
             * pushST0(drive)
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.pushST0 = function(drive)
            {
                this.pushResult(drive.iDrive | (drive.bHead << 2) | (drive.resCode & FDC.REG_DATA.RES.ST0), FDC.TERMS.ST0);
            };
            
            /**
             * pushST1(drive)
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.pushST1 = function(drive)
            {
                this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST1) >>> 8, FDC.TERMS.ST1);
            };
            
            /**
             * pushST2(drive)
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.pushST2 = function(drive)
            {
                this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST2) >>> 16, FDC.TERMS.ST2);
            };
            
            /**
             * pushST3(drive)
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.pushST3 = function(drive)
            {
                this.pushResult((drive.resCode & FDC.REG_DATA.RES.ST3) >>> 24, FDC.TERMS.ST3);
            };
            
            /**
             * dmaRead(drive, b, done)
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} b
             * @param {function(number,boolean)} done
             */
            FDC.prototype.dmaRead = function(drive, b, done)
            {
                if (b === undefined || b < 0) {
                    this.readData(drive, done);
                    return;
                }
                /*
                 * The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaRead(): invalid DMA acknowledgement");
                done(-1, false);
            };
            
            /**
             * dmaWrite(drive, b)
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} b
             * @return {number}
             */
            FDC.prototype.dmaWrite = function(drive, b)
            {
                if (b !== undefined && b >= 0)
                    return this.writeData(drive, b);
                /*
                 * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaWrite(): invalid DMA acknowledgement");
                return -1;
            };
            
            /**
             * dmaFormat(drive, b)
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} b
             * @returns {number}
             */
            FDC.prototype.dmaFormat = function(drive, b)
            {
                if (b !== undefined && b >= 0)
                    return this.writeFormat(drive, b);
                /*
                 * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaFormat(): invalid DMA acknowledgement");
                return -1;
            };
            
            /**
             * doRead(drive)
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.doRead = function(drive)
            {
                /*
                 * With only NOT_READY and INCOMPLETE set, an empty drive causes DOS to report "General Failure";
                 * with the addition of NO_DATA, DOS reports "Sector not found".  The traditional "Drive not ready"
                 * error message is not triggered by anything we return here, but simply by BIOS commands timing out.
                 */
                drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
            
                if (drive.disk) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("FDC.doRead(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')');
                    }
                    drive.sector = null;
                    drive.resCode = FDC.REG_DATA.RES.NONE;
                    if (this.chipset) {
                        this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaRead', drive);
                        this.chipset.requestDMA(ChipSet.DMA_FDC);
                    }
                }
            };
            
            /**
             * doWrite(drive)
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.doWrite = function(drive)
            {
                drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
            
                if (drive.disk) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("FDC.doWrite(CHS=" + drive.bCylinder + ':' + drive.bHead + ':' + drive.bSector + ",PBA=" + (drive.bCylinder * (drive.disk.nHeads * drive.disk.nSectors) + drive.bHead * drive.disk.nSectors + drive.bSector-1) + ')');
                    }
                    if (drive.disk.fWriteProtected) {
                        drive.resCode = FDC.REG_DATA.RES.NOT_WRITABLE | FDC.REG_DATA.RES.INCOMPLETE;
                        return;
                    }
                    drive.sector = null;
                    drive.resCode = FDC.REG_DATA.RES.NONE;
                    if (this.chipset) {
                        this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaWrite', drive);
                        this.chipset.requestDMA(ChipSet.DMA_FDC);
                    }
                }
            };
            
            /**
             * doFormat(drive)
             *
             * drive is initialized by doCmd() to the following extent:
             *
             *      drive.bHead (ignored)
             *      drive.nBytes (bytes/sector)
             *      drive.bSectorEnd (sectors/track)
             *      drive.bFiller (fill byte)
             *
             * and we expect the DMA controller to provide C, H, R and N (ie, 4 bytes) for each sector to be formatted.
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.doFormat = function(drive)
            {
                drive.resCode = FDC.REG_DATA.RES.NOT_READY | FDC.REG_DATA.RES.INCOMPLETE;
            
                if (drive.disk) {
                    drive.sector = null;
                    drive.resCode = FDC.REG_DATA.RES.NONE;
                    if (this.chipset) {
                        drive.cbFormat = 0;
                        drive.abFormat = new Array(4);
                        drive.bFormatting = true;
                        drive.cSectorsFormatted = 0;
                        this.chipset.connectDMA(ChipSet.DMA_FDC, this, 'dmaFormat', drive);
                        this.chipset.requestDMA(ChipSet.DMA_FDC);
                        drive.bFormatting = false;
                    }
                }
            };
            
            /**
             * readData(drive, done)
             *
             * The following drive properties must have been setup prior to our first call:
             *
             *      drive.bHead
             *      drive.bCylinder
             *      drive.bSector
             *      drive.sector (initialized to null)
             *
             * On the first readData() request, since drive.sector will be null, we ask the Disk object to look
             * up the first sector of the request.  We then ask the Disk for bytes from that sector until the sector
             * is exhausted, and then we look up the next sector and continue the process.
             *
             * NOTE: Since the FDC isn't aware of the extent of the transfer, all readData() can do is return bytes
             * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
             *
             * TODO: Research the requirements, if any, for multi-track I/O and determine what else needs to be done.
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {function(number,boolean,Object,number)} done (number is next available byte from drive, or -1 if no more bytes available)
             */
            FDC.prototype.readData = function(drive, done)
            {
                var b = -1;
                var obj = null, off = 0;    // these variables are purely for BACKTRACK purposes
            
                if (!drive.resCode && drive.disk) {
                    do {
                        if (drive.sector) {
                            off = drive.ibSector;
                            if ((b = drive.disk.read(drive.sector, drive.ibSector++)) >= 0) {
                                obj = drive.sector;
                                break;
                            }
                        }
                        /*
                         * Locate the next sector, and then try reading again.
                         */
                        drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
                        if (!drive.sector) {
                            drive.resCode = FDC.REG_DATA.RES.NO_DATA | FDC.REG_DATA.RES.INCOMPLETE;
                            break;
                        }
                        drive.ibSector = 0;
                        /*
                         * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                         * This allows the initial call to readData() to perform a seek without triggering an unwanted advance.
                         */
                        this.advanceSector(drive);
                    } while (true);
                }
                done(b, false, obj, off);
            };
            
            /**
             * writeData(drive, b)
             *
             * The following drive properties must have been setup prior to our first call:
             *
             *      drive.bHead
             *      drive.bCylinder
             *      drive.bSector
             *      drive.sector (initialized to null)
             *
             * On the first writeData() request, since drive.sector will be null, we ask the Disk object to look
             * up the first sector of the request.  We then send the Disk bytes for that sector until the sector
             * is full, and then we look up the next sector and continue the process.
             *
             * NOTE: Since the FDC isn't aware of the extent of the transfer, all writeData() can do is accept bytes
             * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
             *
             * TODO: Research the requirements, if any, for multi-track I/O and determine what else needs to be done.
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} b containing next byte to write
             * @return {number} (b unchanged; return -1 if command should be terminated)
             */
            FDC.prototype.writeData = function(drive, b)
            {
                if (drive.resCode || !drive.disk) return -1;
                do {
                    if (drive.sector) {
                        if (drive.disk.write(drive.sector, drive.ibSector++, b))
                            break;
                    }
                    /*
                     * Locate the next sector, and then try writing again.
                     */
                    drive.sector = drive.disk.seek(drive.bCylinder, drive.bHead, drive.bSector);
                    if (!drive.sector) {
                        /*
                         * TODO: Determine whether this should be FDC.REG_DATA.RES.CRC_ERROR or FDC.REG_DATA.RES.DATA_FIELD
                         */
                        drive.resCode = FDC.REG_DATA.RES.CRC_ERROR | FDC.REG_DATA.RES.INCOMPLETE;
                        b = -1;
                        break;
                    }
                    drive.ibSector = 0;
                    /*
                     * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                     * This allows the initial call to writeData() to perform a seek without triggering an unwanted advance.
                     */
                    this.advanceSector(drive);
                } while (true);
                return b;
            };
            
            /**
             * advanceSector(drive)
             *
             * This increments the sector number; when the sector number reaches drive.nDiskSectors on the current track, we
             * increment drive.bHead and reset drive.bSector, and when drive.bHead reaches drive.nDiskHeads, we reset drive.bHead
             * and increment drive.bCylinder.
             *
             * @this {FDC}
             * @param {Object} drive
             */
            FDC.prototype.advanceSector = function(drive)
            {
                this.assert(drive.bCylinder < drive.nDiskCylinders);
                drive.bSector++;
                var bSectorStart = 1;
                if (drive.bSector >= drive.nDiskSectors + bSectorStart) {
                    drive.bSector = bSectorStart;
                    drive.bHead++;
                    if (drive.bHead >= drive.nDiskHeads) {
                        drive.bHead = 0;
                        drive.bCylinder++;
                    }
                }
            };
            
            /**
             * writeFormat(drive, b)
             *
             * @this {FDC}
             * @param {Object} drive
             * @param {number} b containing a format command byte
             * @return {number} (b if successful, -1 if command should be terminated)
             */
            FDC.prototype.writeFormat = function(drive, b)
            {
                if (drive.resCode) return -1;
                drive.abFormat[drive.cbFormat++] = b;
                if (drive.cbFormat == drive.abFormat.length) {
                    drive.bCylinder = drive.abFormat[0];    // C
                    drive.bHead = drive.abFormat[1];        // H
                    drive.bSector = drive.abFormat[2];      // R
                    drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024)
                    drive.cbFormat = 0;
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("writeFormat(head=" + str.toHexByte(drive.bHead) + ",cyl=" + str.toHexByte(drive.bCylinder) + ",sec=" + str.toHexByte(drive.bSector) + ",len=" + str.toHexWord(drive.nBytes) + ")");
                    }
                    for (var i = 0; i < drive.nBytes; i++) {
                        if (this.writeData(drive, drive.bFiller) < 0) {
                            return -1;
                        }
                    }
                    drive.cSectorsFormatted++;
                }
                if (drive.cSectorsFormatted >= drive.bSectorEnd) b = -1;
                return b;
            };
            
            /*
             * Port input notification table
             *
             * TODO: Even though port 0x3F7 was not present on controllers prior to MODEL_5170, I'm taking the easy
             * way out and always emulating it.  So, consider an FDC parameter to disable that feature for stricter compatibility.
             */
            FDC.aPortInput = {
                0x3F4: FDC.prototype.inFDCStatus,
                0x3F5: FDC.prototype.inFDCData,
                0x3F7: FDC.prototype.inFDCInput
            };
            
            /*
             * Port output notification table
             *
             * TODO: Even though port 0x3F7 was not present on controllers prior to MODEL_5170, I'm taking the easy
             * way out and always emulating it.  So, consider an FDC parameter to disable that feature for stricter compatibility.
             */
            FDC.aPortOutput = {
                0x3F2: FDC.prototype.outFDCOutput,
                0x3F5: FDC.prototype.outFDCData,
                0x3F7: FDC.prototype.outFDCControl
            };
            
            /**
             * FDC.init()
             *
             * This function operates on every HTML element of class "fdc", extracting the
             * JSON-encoded parameters for the FDC constructor from the element's "data-value"
             * attribute, invoking the constructor to create a FDC component, and then binding
             * any associated HTML controls to the new component.
             */
            FDC.init = function() {
                var aeFDC = Component.getElementsByClass(window.document, PCJSCLASS, "fdc");
                for (var iFDC = 0; iFDC < aeFDC.length; iFDC++) {
                    var eFDC = aeFDC[iFDC];
                    var parmsFDC = Component.getComponentParms(eFDC);
                    var fdc = new FDC(parmsFDC);
                    Component.bindComponentControls(fdc, eFDC, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every Floppy Drive Controller (FDC) module on the page.
             */
            web.onInit(FDC.init);
            
            if (typeof module !== 'undefined') module.exports = FDC;
            
          • hdc.js
            /**
             * @fileoverview Implements the PCjs Hard Drive Controller (HDC) component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Nov-26
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var DiskAPI     = require("../../shared/lib/diskapi");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var ChipSet     = require("./chipset");
                var Disk        = require("./disk");
                var State       = require("./state");
            }
            
            /**
             * HDC(parmsHDC)
             *
             * The HDC component simulates an STC-506/412 interface to an IBM-compatible fixed disk drive. The first
             * such drive was a 10Mb 5.25-inch drive containing two platters and 4 heads. Data spanned 306 cylinders
             * for a total of 1224 tracks, with 17 sectors/track and 512 bytes/sector.  Support has since been expanded
             * to include the original PC AT Western Digital controller.
             *
             * HDC supports the following component-specific properties:
             *
             *      drives: an array of driveConfig objects, each containing 'name', 'path', 'size' and 'type' properties
             *      type:   either 'xt' (for the PC XT Xebec controller) or 'at' (for the PC AT Western Digital controller)
             *
             * The 'type' parameter defaults to 'xt'.  All ports for the PC XT controller are referred to as XTC ports,
             * and similarly, all PC AT controller ports are referred to as ATC ports.
             *
             * If 'path' is empty, a scratch disk image is created; otherwise, we make a note of the path, but we will NOT
             * pre-load it like we do for floppy disk images.
             *
             * My current plan is to read all disk data on-demand, keeping a cache of what we've read, and possibly adding
             * some read-ahead as well. Any portions of the disk image that are written before being read will never be read.
             *
             * TRIVIA: On p.1-179 of the PC XT Technical Reference Manual (revised APR83), it reads:
             *
             *      "WARNING: The last cylinder on the fixed disk drive is reserved for diagnostic use.
             *      Diagnostic write tests will destroy any data on this cylinder."
             *
             * Does FDISK insure that the last cylinder is reserved?  I'm sure we'll eventually find out.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsHDC
             */
            function HDC(parmsHDC) {
            
                Component.call(this, "HDC", parmsHDC, HDC, Messages.HDC);
            
                this['dmaRead'] = this.dmaRead;
                this['dmaWrite'] = this.dmaWrite;
                this['dmaWriteBuffer'] = this.dmaWriteBuffer;
                this['dmaWriteFormat'] = this.dmaWriteFormat;
            
                this.aDriveConfigs = [];
            
                if (parmsHDC['drives']) {
                    try {
                        /*
                         * The most likely source of any exception will be right here, where we're parsing
                         * the JSON-encoded drive data.
                         */
                        this.aDriveConfigs = eval("(" + parmsHDC['drives'] + ")");
                        /*
                         * Nothing more to do with aDriveConfigs now. initController() and autoMount() (if there are
                         * any disk image "path" properties to process) will take care of the rest.
                         */
                    } catch (e) {
                        Component.error("HDC drive configuration error: " + e.message + " (" + parmsHDC['drives'] + ")");
                    }
                }
            
                /*
                 * Set fATC (AT Controller flag) according to the 'type' parameter.  This in turn determines other
                 * defaults.  For example, the default XT drive type is 3 (for a 10Mb disk drive), whereas the default
                 * AT drive type is 2 (for a 20Mb disk drive).
                 */
                this.fATC = (parmsHDC['type'] == "at");
                this.iHDC = this.fATC? 1 : 0;
                this.iDriveTypeDefault = this.fATC? 2 : 3;
            
                /*
                 * The remainder of HDC initialization now takes place in our initBus() handler
                 */
            }
            
            Component.subclass(HDC);
            
            /*
             * HDC defaults, in case drive parameters weren't specified
             */
            HDC.DEFAULT_DRIVE_NAME = "Hard Drive";
            
            /*
             * Each of the following DriveType entries contain (up to) 4 values:
             *
             *      [0]: total cylinders
             *      [1]: total heads
             *      [2]: total sectors/tracks (optional; default is 17)
             *      [3]: total bytes/sector (optional; default is 512)
             *
             * verifyDrive() attempts to confirm that these values agree with the programmed drive characteristics.
             */
            HDC.aDriveTypes = [
                {
                    0x00: [306, 2],
                    0x01: [375, 8],
                    0x02: [306, 6],
                    0x03: [306, 4]         // 10Mb (default XTC drive type)
                },
                /*
                 * Sadly, drive types differ across controller models (XTC drive types don't match ATC drive types),
                 * so aDriveTypes must first be indexed by a controller index (this.iHDC).
                 *
                 * The following is a more complete description of the drive types supported by the MODEL_5170, where C is
                 * Cylinders, H is Heads, WP is Write Pre-Comp, and LZ is Landing Zone (in practice, we don't need WP or LZ).
                 *
                 * Type    C    H   WP   LZ
                 * ----  ---   --  ---  ---
                 *   1   306    4  128  305
                 *   2   615    4  300  615
                 *   3   615    6  300  615
                 *   4   940    8  512  940
                 *   5   940    6  512  940
                 *   6   615    4   no  615
                 *   7   462    8  256  511
                 *   8   733    5   no  733
                 *   9   900   15  no8  901
                 *  10   820    3   no  820
                 *  11   855    5   no  855
                 *  12   855    7   no  855
                 *  13   306    8  128  319
                 *  14   733    7   no  733
                 *  15  (reserved--all zeros)
                 */
                {
                    0x01: [306, 4],         // 10Mb
                    0x02: [615, 4],         // 20Mb (default ATC drive type)
                    0x03: [615, 6],
                    0x04: [940, 8],
                    0x05: [940, 6],
                    0x06: [615, 4],
                    0x07: [462, 8],
                    0x08: [733, 5],
                    0x09: [900,15],
                    0x0A: [820, 3],
                    0x0B: [855, 5],
                    0x0C: [855, 7],
                    0x0D: [306, 8],
                    0x0E: [733, 7]
                }
            ];
            
            /*
             * ATC (AT Controller) Registers
             *
             * The "IBM Personal Computer AT Fixed Disk and Diskette Drive Adapter", aka the HFCOMBO card, contains what we refer
             * to here as the ATC (AT Controller).  Even though that card contains both Fixed Disk and Diskette Drive controllers,
             * this component (HDC) still deals only with the "Fixed Disk" portion.  Fortunately, the "Diskette Drive Adapter"
             * portion of the card is compatible with the existing FDC component, so that component continues to be responsible
             * for all diskette operations.
             *
             * ATC ports default to their primary addresses; secondary port addresses are 0x80 lower (eg, 0x170 instead of 0x1F0).
             *
             * It's important to know that the MODEL_5170 BIOS has a special relationship with the "Combo Hard File/Diskette
             * (HFCOMBO) Card" (see @F000:144C).  Initially, the ChipSet component intercepted reads for HFCOMBO's STATUS port
             * and returned the BUSY bit clear to reduce boot time; however, it turned out that was also a prerequisite for the
             * BIOS to write test patterns to the CYLLO port and set the "DUAL" bit (bit 0) of the "HFCNTRL" byte at 40:8Fh if
             * those CYLLO operations succeeded (now that the HDC is "ATC-aware", those ChipSet port intercepts have been removed).
             *
             * Without the "DUAL" bit set, when it came time later to report the diskette drive type, the "DISK_TYPE" function
             * (@F000:273D) would branch to one of two almost-identical blocks of code -- specifically, a block that disallowed
             * diskette drive types >= 2 (ChipSet.CMOS.FDRIVE.FD360) instead of >= 3 (ChipSet.CMOS.FDRIVE.FD1200).
             *
             * In other words, the "Fixed Disk" portion of the HFCOMBO controller has to be present and operational if the user
             * wants to use high-capacity (80-track) diskettes with "Diskette Drive" portion of the controller.  This may not be
             * immediately obvious to anyone creating a 5170 machine configuration with the FDC component but no HDC component.
             *
             * TODO: Investigate what a MODEL_5170 can do, if anything, with diskettes if an "HFCOMBO card" was NOT installed
             * (eg, was there Diskette-only Controller that could be installed, and if so, did it support high-capacity diskettes?)
             * Also, consider making the FDC component able to detect when the HDC is missing and provide the same minimal HFCOMBO
             * port intercepts that ChipSet once provided (this is not a compatibility requirement, just a usability improvement).
             */
            HDC.ATC = {
                DATA:   { PORT: 0x1F0},     // no register (read-write)
                DIAG:   {                   // this.regError (read-only)
                    PORT:       0x1F1,
                    NO_ERROR:    0x01,
                    CTRL_ERROR:  0x02,
                    SEC_ERROR:   0x03,
                    ECC_ERROR:   0x04,
                    PROC_ERROR:  0x05
                },
                ERROR: {                    // this.regError (read-only)
                    PORT:       0x1F1,
                    NONE:        0x00,
                    NO_DAM:      0x01,      // Data Address Mark (DAM) not found
                    NO_TRK0:     0x02,      // Track 0 not detected
                    CMD_ABORT:   0x04,      // Aborted Command
                    NO_CHS:      0x10,      // ID field with the specified C:H:S not found
                    ECC_ERR:     0x40,      // Data ECC Error
                    BAD_BLOCK:   0x80       // Bad Block Detect
                },
                WPREC:  { PORT: 0x1F1},     // this.regWPreC (write-only)
                SECCNT: { PORT: 0x1F2},     // this.regSecCnt (read-write; 0 implies a 256-sector request)
                SECNUM: { PORT: 0x1F3},     // this.regSecNum (read-write)
                CYLLO:  { PORT: 0x1F4},     // this.regCylLo (read-write; all 8 bits are used)
                CYLHI:  {                   // this.regCylHi (read-write; only bits 0-1 are used, for a total of 10 bits, or 1024 max cylinders)
                    PORT:       0x1F5,
                    MASK:        0x03
                },
                DRVHD:  {                   // this.regDrvHd (read-write)
                    PORT:       0x1F6,
                    HEAD_MASK:   0x0F,      // set this to the max number of heads before issuing a SET PARAMETERS command
                    DRIVE_MASK:  0x10,
                    SET_MASK:    0xE0,
                    SET_BITS:    0xA0       // for whatever reason, these bits must always be set
                },
                STATUS: {                   // this.regStatus (read-only; reading clears IRQ.ATC)
                    PORT:       0x1F7,
                    BUSY:        0x80,      // if this is set, no other STATUS bits are valid
                    READY:       0x40,      // if this is set (along with the SEEK_OK bit), the drive is ready to read/write/seek again
                    WFAULT:      0x20,      // write fault
                    SEEK_OK:     0x10,      // seek operation complete
                    DATA_REQ:    0x08,      // indicates that "the sector buffer requires servicing during a Read or Write command. If either bit 7 (BUSY) or this bit is active, a command is being executed. Upon receipt of any command, this bit is reset."
                    CORRECTED:   0x04,
                    INDEX:       0x02,      // set once for every revolution of the disk
                    ERROR:       0x01       // set when the previous command ended in an error; one or more bits are set in the ERROR register (the next command to the controller resets the ERROR bit)
                },
                COMMAND: {                  // this.regCommand (write-only)
                    PORT:       0x1F7,
                    RESTORE:     0x10,      // low nibble x 500us equal stepping rate (except for 0, which corresponds to 35us) (aka RECALIBRATE)
                    READ_DATA:   0x20,      // also supports NO_RETRIES and WITH_ECC
                    WRITE_DATA:  0x30,      // also supports NO_RETRIES and WITH_ECC
                    READ_VERF:   0x40,      // also supports NO_RETRIES
                    FORMAT_TRK:  0x50,
                    SEEK:        0x70,      // low nibble x 500us equal stepping rate (except for 0, which corresponds to 35us)
                    DIAGNOSE:    0x90,
                    SETPARMS:    0x91,
                    NO_RETRIES:  0x01,
                    WITH_ECC:    0x02,
                    MASK:        0xF0
                },
                FDR: {                      // this.regFDR
                    PORT:       0x3F6,
                    INT_DISABLE: 0x02,      // a logical 0 enables fixed disk interrupts
                    RESET:       0x04,      // a logical 1 enables reset fixed disk function
                    HS3:         0x08,      // a logical 1 enables head select 3 (a logical 0 enables reduced write current)
                    RESERVED:    0xF1
                }
            };
            
            /*
             * XTC (XT Controller) Registers
             */
            HDC.XTC = {
                /*
                 * XTC Data Register (0x320, read-write)
                 *
                 * Writes to this register are discussed below; see HDC Commands.
                 *
                 * Reads from this register after a command has been executed retrieve a "status byte",
                 * which must NOT be confused with the Status Register (see below).  This data "status byte"
                 * contains only two bits of interest: XTC.DATA.STATUS.ERROR and XTC.DATA.STATUS.UNIT.
                 */
                DATA: {
                    PORT:          0x320,   // port address
                    STATUS: {
                        OK:         0x00,   // no error
                        ERROR:      0x02,   // error occurred during command execution
                        UNIT:       0x20    // logical unit number of the drive
                    },
                    /*
                     * XTC Commands, as issued to XTC_DATA
                     *
                     * Commands are multi-byte sequences sent to XTC_DATA, starting with a XTC_DATA.CMD byte,
                     * and followed by 5 more bytes, for a total of 6 bytes, which collectively are called a
                     * Device Control Block (DCB).  Not all commands use all 6 bytes, but all 6 bytes must be present;
                     * unused bytes are simply ignored.
                     *
                     *      XTC_DATA.CMD    (3-bit class code, 5-bit operation code)
                     *      XTC_DATA.HEAD   (1-bit drive number, 5-bit head number)
                     *      XTC_DATA.CLSEC  (upper bits of 10-bit cylinder number, 6-bit sector number)
                     *      XTC_DATA.CH     (lower bits of 10-bit cylinder number)
                     *      XTC_DATA.COUNT  (8-bit interleave or block count)
                     *      XTC_DATA.CTRL   (8-bit control field)
                     *
                     * One command, HDC.XTC.DATA.CMD.INIT_DRIVE, must include 8 additional bytes following the DCB:
                     *
                     *      maximum number of cylinders (high)
                     *      maximum number of cylinders (low)
                     *      maximum number of heads
                     *      start reduced write current cylinder (high)
                     *      start reduced write current cylinder (low)
                     *      start write precompensation cylinder (high)
                     *      start write precompensation cylinder (low)
                     *      maximum ECC data burst length
                     *
                     * Note that the 3 word values above are stored in "big-endian" format (high byte followed by low byte),
                     * rather than the more typical "little-endian" format (low byte followed by high byte).
                     */
                    CMD: {
                        TEST_READY:     0x00,       // Test Drive Ready
                        RECALIBRATE:    0x01,       // Recalibrate
                        REQUEST_SENSE:  0x03,       // Request Sense Status
                        FORMAT_DRIVE:   0x04,       // Format Drive
                        READ_VERF:      0x05,       // Read Verify
                        FORMAT_TRK:     0x06,       // Format Track
                        FORMAT_BAD:     0x07,       // Format Bad Track
                        READ_DATA:      0x08,       // Read
                        WRITE_DATA:     0x0A,       // Write
                        SEEK:           0x0B,       // Seek
                        INIT_DRIVE:     0x0C,       // Initialize Drive Characteristics
                        READ_ECC_BURST: 0x0D,       // Read ECC Burst Error Length
                        READ_BUFFER:    0x0E,       // Read Data from Sector Buffer
                        WRITE_BUFFER:   0x0F,       // Write Data to Sector Buffer
                        RAM_DIAGNOSTIC: 0xE0,       // RAM Diagnostic
                        DRV_DIAGNOSTIC: 0xE3,       // HDC BIOS: CHK_DRV_CMD
                        CTL_DIAGNOSTIC: 0xE4,       // HDC BIOS: CNTLR_DIAG_CMD
                        READ_LONG:      0xE5,       // HDC BIOS: RD_LONG_CMD
                        WRITE_LONG:     0xE6        // HDC BIOS: WR_LONG_CMD
                    },
                    ERR: {
                        /*
                         * HDC error conditions, as returned in byte 0 of the (4) bytes returned by the Request Sense Status command
                         */
                        NONE:           0x00,
                        NO_INDEX:       0x01,       // no index signal detected
                        SEEK_INCOMPLETE:0x02,       // no seek-complete signal
                        WRITE_FAULT:    0x03,
                        NOT_READY:      0x04,       // after the controller selected the drive, the drive did not respond with a ready signal
                        NO_TRACK:       0x06,       // after stepping the max number of cylinders, the controller did not receive the track 00 signal from the drive
                        STILL_SEEKING:  0x08,
                        ECC_ID_ERROR:   0x10,
                        ECC_DATA_ERROR: 0x11,
                        NO_ADDR_MARK:   0x12,
                        NO_SECTOR:      0x14,
                        BAD_SEEK:       0x15,       // seek error: the cylinder and/or head address did not compare with the expected target address
                        ECC_CORRECTABLE:0x18,       // correctable data error
                        BAD_TRACK:      0x19,
                        BAD_CMD:        0x20,
                        BAD_DISK_ADDR:  0x21,
                        RAM:            0x30,
                        CHECKSUM:       0x31,
                        POLYNOMIAL:     0x32,
                        MASK:           0x3F
                    },
                    SENSE: {
                        ADDR_VALID:     0x80
                    }
                },
                /*
                 * XTC Status Register (0x321, read-only)
                 *
                 * WARNING: The IBM Technical Reference Manual *badly* confuses the XTC_DATA "status byte" (above)
                 * that the controller sends following an HDC.XTC.DATA.CMD operation with the Status Register (below).
                 * In fact, it's so badly confused that it completely fails to document any of the Status Register
                 * bits below; I'm forced to guess at their meanings from the HDC BIOS listing.
                 */
                STATUS: {
                    PORT:          0x321,   // port address
                    NONE:           0x00,
                    REQ:            0x01,   // HDC BIOS: request bit
                    IOMODE:         0x02,   // HDC BIOS: mode bit (GUESS: set whenever XTC_DATA contains a response?)
                    BUS:            0x04,   // HDC BIOS: command/data bit (GUESS: set whenever XTC_DATA ready for request?)
                    BUSY:           0x08,   // HDC BIOS: busy bit
                    INTERRUPT:      0x20    // HDC BIOS: interrupt bit
                }
            };
            
            /*
             * XTC Config Register (0x322, read-only)
             *
             * This register is used to read HDC card switch settings that defined the "Drive Type" for
             * drives 0 and 1.  SW[1],SW[2] (for drive 0) and SW[3],SW[4] (for drive 1) are set as follows:
             *
             *      ON,  ON     Drive Type 0   (306 cylinders, 2 heads)
             *      ON,  OFF    Drive Type 1   (375 cylinders, 8 heads)
             *      OFF, ON     Drive Type 2   (306 cylinders, 6 heads)
             *      OFF, OFF    Drive Type 3   (306 cylinders, 4 heads)
             */
            
            /*
             * HDC Command Sequences
             *
             * Unlike the FDC, all the HDC commands have fixed-length command request sequences (well, OK, except for
             * HDC.XTC.DATA.CMD.INIT_DRIVE) and fixed-length response sequences (well, OK, except for HDC.XTC.DATA.CMD.REQUEST_SENSE),
             * so a table of byte-lengths isn't much use, but having names for all the commands is still handy for debugging.
             */
            if (DEBUG) {
                HDC.aATCCommands = {
                    0x10: "Restore (Recalibrate)",
                    0x20: "Read",
                    0x30: "Write",
                    0x40: "Read Verify",
                    0x50: "Format Track",
                    0x70: "Seek",
                    0x90: "Diagnose",
                    0x91: "Set Parameters"
                };
                HDC.aXTCCommands = {
                    0x00: "Test Drive Ready",
                    0x01: "Recalibrate",
                    0x03: "Request Sense Status",
                    0x04: "Format Drive",
                    0x05: "Read Verify",
                    0x06: "Format Track",
                    0x07: "Format Bad Track",
                    0x08: "Read",
                    0x0A: "Write",
                    0x0B: "Seek",
                    0x0C: "Initialize Drive Characteristics",
                    0x0D: "Read ECC Burst Error Length",
                    0x0E: "Read Data from Sector Buffer",
                    0x0F: "Write Data to Sector Buffer",
                    0xE0: "RAM Diagnostic",
                    0xE3: "Drive Diagnostic",
                    0xE4: "Controller Diagnostic",
                    0xE5: "Read Long",
                    0xE6: "Write Long"
                };
            }
            
            /*
             * HDC BIOS interrupts, functions, and other parameters
             *
             * When the HDC BIOS overwrites the ROM BIOS INT 0x13 address, it saves the original INT 0x13 address
             * in the INT 0x40 vector.
             */
            HDC.BIOS = {
                INT_DISK:       0x13,
                INT_DISKETTE:   0x40
            };
            
            /*
             * NOTE: These are useful values for reference, but they're not actually used for anything at the moment.
             */
            HDC.BIOS.DISK_CMD = {
                RESET:          0x00,
                GET_STATUS:     0x01,
                READ_SECTORS:   0x02,
                WRITE_SECTORS:  0x03,
                VERIFY_SECTORS: 0x04,
                FORMAT_TRK:     0x05,
                FORMAT_BAD:     0x06,
                FORMAT_DRIVE:   0x07,
                GET_DRIVEPARMS: 0x08,
                SET_DRIVEPARMS: 0x09,
                READ_LONG:      0x0A,
                WRITE_LONG:     0x0B,
                SEEK:           0x0C,
                ALT_RESET:      0x0D,
                READ_BUFFER:    0x0E,
                WRITE_BUFFER:   0x0F,
                TEST_READY:     0x10,
                RECALIBRATE:    0x11,
                RAM_DIAGNOSTIC: 0x12,
                DRV_DIAGNOSTIC: 0x13,
                CTL_DIAGNOSTIC: 0x14
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {HDC}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "listDisks")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            HDC.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                /*
                 * This is reserved for future use; for now, hard disk images can be specified during initialization only (no "hot-swapping")
                 */
                return false;
            };
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {HDC}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            HDC.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.cmp = cmp;
            
                /*
                 * We need access to the ChipSet component, because we need to communicate with
                 * the PIC and DMA controller.
                 */
                this.chipset = cmp.getComponentByType("ChipSet");
            
                bus.addPortInputTable(this, this.fATC? HDC.aATCPortInput : HDC.aXTCPortInput);
                bus.addPortOutputTable(this, this.fATC? HDC.aATCPortOutput : HDC.aXTCPortOutput);
            
                cpu.addIntNotify(HDC.BIOS.INT_DISK, this, this.intBIOSDisk);
                cpu.addIntNotify(HDC.BIOS.INT_DISKETTE, this, this.intBIOSDiskette);
            
                /*
                 * The following code used to be performed in the HDC constructor, but now we need to wait for information
                 * about the Computer to be available (eg, getMachineID() and getUserID()) before we start loading and/or
                 * connecting to disk images.
                 *
                 * If we didn't need auto-mount support, we could defer controller initialization until we received a powerUp()
                 * notification, at which point reset() would call initController(), or restore() would restore the controller;
                 * in that case, all we'd need to do here is call setReady().
                 */
                this.reset();
            
                if (!this.autoMount()) this.setReady();
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {HDC}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            HDC.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data || !this.restore) {
                        this.initController();
                        if (this.cmp.fReload) {
                            /*
                             * If the computer's fReload flag is set, we're required to toss all currently
                             * loaded disks and remount all disks specified in the auto-mount configuration.
                             */
                            this.autoMount(true);
                        }
                    } else {
                        if (!this.restore(data)) return false;
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {HDC}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean}
             */
            HDC.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save? this.save() : true;
            };
            
            /**
             * getMachineID()
             *
             * @return {string}
             */
            HDC.prototype.getMachineID = function()
            {
                return this.cmp? this.cmp.getMachineID() : "";
            };
            
            /**
             * getUserID()
             *
             * @return {string}
             */
            HDC.prototype.getUserID = function()
            {
                return this.cmp? this.cmp.getUserID() : "";
            };
            
            /**
             * reset()
             *
             * @this {HDC}
             */
            HDC.prototype.reset = function()
            {
                /*
                 * TODO: The controller is also initialized by the constructor, to assist with auto-mount support,
                 * so think about whether we can skip powerUp initialization.
                 */
                this.initController(null, true);
            };
            
            /**
             * save()
             *
             * This implements save support for the HDC component.
             *
             * @this {HDC}
             * @return {Object}
             */
            HDC.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, this.saveController());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the HDC component.
             *
             * @this {HDC}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             */
            HDC.prototype.restore = function(data)
            {
                return this.initController(data[0]);
            };
            
            /**
             * initController(data, fHard)
             *
             * @this {HDC}
             * @param {Array} [data]
             * @param {boolean} [fHard] true if a machine reset (not just a controller reset)
             * @return {boolean} true if successful, false if failure
             */
            HDC.prototype.initController = function(data, fHard)
            {
                var i = 0;
                var fSuccess = true;
            
                /*
                 * At this point, it's worth calling into question my decision to NOT split the HDC component into separate XTC
                 * and ATC components, given all the differences, and given that I'm about to write some "if (ATC) else (XTC) ..."
                 * code.  And all I can say in my defense is, yes, it's definitely worth calling that into question.
                 *
                 * However, there's also some common code, mostly in the area of disk management rather than controller management,
                 * and if the components were split, then I'd have to create a third component for that common code (although again,
                 * disk management probably belongs in its own component anyway).
                 *
                 * However, let's not forget that since my overall plan is to have only one PCjs "binary", everything's going to end
                 * up in the same bucket anyway, so let's not be too obsessive about organizational details.  As long as the number
                 * of these conditionals is small and they're not performance-critical, this seems much ado about nothing.
                 */
                if (this.fATC) {
                    /*
                     * Since there's no way (and never will be a way) for an HDC to change its "personality" (from 'xt' to 'at'
                     * or vice versa), we're under no obligation to use the same number of registers, or save/restore format, etc,
                     * as the original XT controller.
                     */
                    if (data == null) data = [0, 0, 0, 0, 0, 0, 0, 0, HDC.ATC.STATUS.READY, 0];
                    this.regError   = data[i++];
                    this.regWPreC   = data[i++];
                    this.regSecCnt  = data[i++];
                    this.regSecNum  = data[i++];
                    this.regCylLo   = data[i++];
                    this.regCylHi   = data[i++];
                    this.regDrvHd   = data[i++];
                    this.regStatus  = data[i++];
                    this.regCommand = data[i++];
                    this.regFDR     = data[i++];
                    /*
                     * Additional state is maintained by the Drive object (eg, abSector, ibSector)
                     */
                } else {
                    if (data == null) data = [0, HDC.XTC.STATUS.NONE, new Array(14), 0, 0];
                    this.regConfig    = data[i++];
                    this.regStatus    = data[i++];
                    this.regDataArray = data[i++];  // there can be up to 14 command bytes (6 for normal commands, plus 8 more for HDC.XTC.DATA.CMD.INIT_DRIVE)
                    this.regDataIndex = data[i++];  // used to control the next data byte to be received
                    this.regDataTotal = data[i++];  // used to control the next data byte to be sent (internally, we use regDataIndex to read data bytes, up to this total)
                    this.regReset     = data[i++];
                    this.regPulse     = data[i++];
                    this.regPattern   = data[i++];
                    /*
                     * Initialize iDriveAllowFail only if it's never been initialized, otherwise its entire purpose will be defeated.
                     * See the related HACK in intBIOSDisk() for more details.
                     */
                    var iDriveAllowFail = data[i++];
                    if (iDriveAllowFail !== undefined) {
                        this.iDriveAllowFail = iDriveAllowFail;
                    } else {
                        if (this.iDriveAllowFail === undefined) this.iDriveAllowFail = -1;
                    }
                }
            
                if (this.aDrives === undefined) {
                    this.aDrives = new Array(this.aDriveConfigs.length);
                }
            
                var dataDrives = data[i];
                if (dataDrives === undefined) dataDrives = [];
            
                for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    if (this.aDrives[iDrive] === undefined) {
                        this.aDrives[iDrive] = {};
                    }
                    var drive = this.aDrives[iDrive];
                    var driveConfig = this.aDriveConfigs[iDrive];
                    if (!this.initDrive(iDrive, drive, driveConfig, dataDrives[iDrive], fHard)) {
                        fSuccess = false;
                    }
                    /*
                     * XTC only: the original STC-506/412 controller had two pairs of DIP switches to indicate a drive
                     * type (0, 1, 2 or 3) for drives 0 and 1.  Those switch settings are recorded in regConfig, now that
                     * drive.type has been validated by initDrive().
                     */
                    if (this.regConfig != null && iDrive <= 1) {
                        this.regConfig |= (drive.type & 0x3) << ((1 - iDrive) << 1);
                    }
                }
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("HDC initialized for " + this.aDrives.length + " drive(s)");
                }
                return fSuccess;
            };
            
            /**
             * saveController()
             *
             * @this {HDC}
             * @return {Array}
             */
            HDC.prototype.saveController = function()
            {
                var i = 0;
                var data = [];
                if (this.fATC) {
                    data[i++] = this.regError;
                    data[i++] = this.regWPreC;
                    data[i++] = this.regSecCnt;
                    data[i++] = this.regSecNum;
                    data[i++] = this.regCylLo;
                    data[i++] = this.regCylHi;
                    data[i++] = this.regDrvHd;
                    data[i++] = this.regStatus;
                    data[i++] = this.regCommand;
                    data[i++] = this.regFDR;
                } else {
                    data[i++] = this.regConfig;
                    data[i++] = this.regStatus;
                    data[i++] = this.regDataArray;
                    data[i++] = this.regDataIndex;
                    data[i++] = this.regDataTotal;
                    data[i++] = this.regReset;
                    data[i++] = this.regPulse;
                    data[i++] = this.regPattern;
                    data[i++] = this.iDriveAllowFail;
                }
                data[i] = this.saveDrives();
                return data;
            };
            
            /**
             * initDrive(iDrive, drive, driveConfig, data, fHard)
             *
             * TODO: Consider a separate Drive class that both FDC and HDC can use, since there's a lot of commonality
             * between the drive objects created by both controllers.  This will clean up overall drive management and allow
             * us to factor out some common Drive methods (eg, advanceSector()).
             *
             * @this {HDC}
             * @param {number} iDrive
             * @param {Object} drive
             * @param {Object} driveConfig (contains one or more of the following properties: 'name', 'path', 'size', 'type')
             * @param {Array} [data]
             * @param {boolean} [fHard] true if a machine reset (not just a controller reset)
             * @return {boolean} true if successful, false if failure
             */
            HDC.prototype.initDrive = function(iDrive, drive, driveConfig, data, fHard)
            {
                var i = 0;
                var fSuccess = true;
                if (data === undefined) data = [HDC.XTC.DATA.ERR.NONE, 0, false, new Array(8)];
            
                drive.iDrive = iDrive;
            
                /*
                 * errorCode could be an HDC global, but in order to insulate HDC state from the operation of various functions
                 * that operate on drive objects (eg, readData and writeData), I've made it a per-drive variable.  This choice may
                 * be contrary to how the actual hardware works, but I prefer this approach, as long as it doesn't expose any
                 * incompatibilities that any software actually cares about.
                 */
                drive.errorCode = data[i++];
                drive.senseCode = data[i++];
                drive.fRemovable = data[i++];
                drive.abDriveParms = data[i++];         // captures drive parameters programmed via HDC.XTC.DATA.CMD.INIT_DRIVE
            
                /*
                 * TODO: Make abSector a DWORD array rather than a BYTE array (we could even allocate a Memory block for it);
                 * alternatively, eliminate the buffer entirely and re-establish a reference to the appropriate Disk sector object.
                 */
                drive.abSector = data[i++];
            
                /*
                 * The next group of properties are set by various HDC command sequences.
                 */
                drive.bHead = data[i++];
                drive.nHeads = data[i++];
                drive.wCylinder = data[i++];
                drive.bSector = data[i++];
                drive.bSectorEnd = data[i++];           // aka EOT
                drive.nBytes = data[i++];
                drive.bSectorBias = (this.fATC? 0: 1);
            
                drive.name = driveConfig['name'];
                if (drive.name === undefined) drive.name = HDC.DEFAULT_DRIVE_NAME;
                drive.path = driveConfig['path'];
            
                /*
                 * If no 'mode' is specified, we fall back to the original behavior, which is to completely preload
                 * any specific disk image, or create an empty (purely local) disk image.
                 */
                drive.mode = driveConfig['mode'] || (drive.path? DiskAPI.MODE.PRELOAD : DiskAPI.MODE.LOCAL);
            
                /*
                 * On-demand I/O of raw disk images is supported only if there's a valid user ID; fall back to an empty
                 * local disk image if there's not.
                 */
                if (drive.mode == DiskAPI.MODE.DEMANDRO || drive.mode == DiskAPI.MODE.DEMANDRW) {
                    if (!this.getUserID()) drive.mode = DiskAPI.MODE.LOCAL;
                }
            
                drive.type = driveConfig['type'];
                if (drive.type === undefined || HDC.aDriveTypes[this.iHDC][drive.type] === undefined) drive.type = this.iDriveTypeDefault;
            
                var driveType = HDC.aDriveTypes[this.iHDC][drive.type];
                drive.nSectors = driveType[2] || 17;    // sectors/track
                drive.cbSector = driveType[3] || 512;   // bytes/sector (default is 512 if unspecified in the table)
            
                /*
                 * On a full machine reset, pass the current drive type to setCMOSDriveType() (a no-op on pre-CMOS machines)
                 */
                if (fHard && this.chipset) {
                    this.chipset.setCMOSDriveType(iDrive, drive.type);
                }
            
                /*
                 * The next group of properties are set by user requests to load/unload disk images.
                 *
                 * We no longer reinitialize drive.disk, in order to retain previously mounted disk across resets.
                 */
                if (drive.disk === undefined) {
                    drive.disk = null;
                    this.notice("Type " + drive.type + " \"" + drive.name + "\" is fixed disk " + iDrive, true);
                }
            
                /*
                 * With the advent of save/restore, we need to verify every drive at initialization, not just whenever
                 * drive characteristics are initialized.  Thus, if we've restored a sensible set of drive characteristics,
                 * then verifyDrive will create an empty disk if none has been provided, insuring we are ready for
                 * disk.restore().
                 */
                this.verifyDrive(drive);
            
                /*
                 * The next group of properties are managed by worker functions (eg, doDMARead()) to maintain state across DMA requests.
                 */
                drive.ibSector = data[i++];             // location of the next byte to be accessed in the above sector
                drive.sector = null;                    // initialized to null by worker, and then set to the next sector satisfying the request
            
                if (drive.disk) {
                    var deltas = data[i];
                    if (deltas !== undefined && drive.disk.restore(deltas) < 0) {
                        fSuccess = false;
                    }
                    if (fSuccess && drive.ibSector !== undefined) {
                        drive.sector = drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias);
                    }
                }
                return fSuccess;
            };
            
            /**
             * saveDrives()
             *
             * @this {HDC}
             * @return {Array}
             */
            HDC.prototype.saveDrives = function()
            {
                var i = 0;
                var data = [];
                for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    data[i++] = this.saveDrive(this.aDrives[iDrive]);
                }
                return data;
            };
            
            /**
             * saveDrive(drive)
             *
             * @this {HDC}
             * @return {Array}
             */
            HDC.prototype.saveDrive = function(drive)
            {
                var i = 0;
                var data = [];
                data[i++] = drive.errorCode;
                data[i++] = drive.senseCode;
                data[i++] = drive.fRemovable;
                data[i++] = drive.abDriveParms;
                data[i++] = drive.abSector;
                data[i++] = drive.bHead;
                data[i++] = drive.nHeads;
                data[i++] = drive.wCylinder;
                data[i++] = drive.bSector;
                data[i++] = drive.bSectorEnd;
                data[i++] = drive.nBytes;
                data[i++] = drive.ibSector;
                data[i] = drive.disk? drive.disk.save() : null;
                return data;
            };
            
            /**
             * copyDrive(iDrive)
             *
             * @this {HDC}
             * @param {number} iDrive
             * @return {Object|undefined} (undefined if the requested drive does not exist)
             */
            HDC.prototype.copyDrive = function(iDrive)
            {
                var driveNew;
                var driveOld = this.aDrives[iDrive];
                if (driveOld !== undefined) {
                    driveNew = {};
                    for (var p in driveOld) {
                        driveNew[p] = driveOld[p];
                    }
                }
                return driveNew;
            };
            
            /**
             * verifyDrive(drive, type)
             *
             * If no disk image is attached, create an empty disk with the specified drive characteristics.
             * Normally, we'd rely on the drive characteristics programmed via the HDC.XTC.DATA.CMD.INIT_DRIVE
             * command, but if an explicit drive type is specified, then we use the characteristics (geometry)
             * associated with that type.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} [type] to create a disk of the specified type, if no disk exists yet
             */
            HDC.prototype.verifyDrive = function(drive, type)
            {
                if (drive) {
                    var nHeads = 0, nCylinders = 0;
                    if (type == null) {
                        /*
                         * If the caller wants us to use the programmed drive parameters, we use those,
                         * but if there aren't any drive parameters (yet), then use default parameters based
                         * on drive.type.
                         *
                         * We used to do the last step ONLY if there was no drive.path -- otherwise, we'd waste
                         * time creating an empty disk if autoMount() was going to load an image from drive.path;
                         * but hopefully the Disk component is smarter now.
                         */
                        nHeads = drive.abDriveParms[2];
                        if (nHeads) {
                            nCylinders = (drive.abDriveParms[0] << 8) | drive.abDriveParms[1];
                        } else {
                            type = drive.type;
                        }
                    }
                    if (type != null && !nHeads) {
                        nHeads = HDC.aDriveTypes[this.iHDC][type][1];
                        nCylinders = HDC.aDriveTypes[this.iHDC][type][0];
                    }
                    if (nHeads) {
                        /*
                         * The assumption here is that if the 3rd drive parameter byte (abDriveParms[2]) has been set
                         * (ie, if nHeads is valid) then the first two bytes (ie, the low and high cylinder byte values)
                         * must have been set as well.
                         *
                         * Do these values agree with those for the given drive type?  Even if they don't, all we do is warn.
                         */
                        var driveType = HDC.aDriveTypes[this.iHDC][drive.type];
                        if (driveType) {
                            if (nCylinders != driveType[0] && nHeads != driveType[1]) {
                                this.notice("Warning: drive parameters (" + nCylinders + "," + nHeads + ") do not match drive type " + drive.type + " (" + driveType[0] + "," + driveType[1] + ")");
                            }
                        }
                        drive.nCylinders = nCylinders;
                        drive.nHeads = nHeads;
                        if (drive.disk == null) {
                            drive.disk = new Disk(this, drive, drive.mode);
                        }
                    }
                }
            };
            
            /**
             * seekDrive(drive, iSector, nSectors)
             *
             * The HDC doesn't need this function, since all HDC requests from the CPU are handled by doXTCmd().  This function
             * is used by other components (eg, Debugger) to mimic an HDC request, using a drive object obtained from copyDrive(),
             * to avoid disturbing the internal state of the HDC's drive objects.
             *
             * Also note that in an actual HDC request, drive.nBytes is initialized to the size of a single sector; the extent
             * of the entire transfer is actually determined by a count that has been pre-loaded into the DMA controller.  The HDC
             * isn't aware of the extent of the transfer, so in the case of a read request, all readData() can do is return bytes
             * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
             *
             * Since seekDrive() is for use with non-DMA requests, we use nBytes to specify the length of the entire transfer.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} iSector (a "logical" sector number, relative to the entire disk, NOT a physical sector number)
             * @param {number} nSectors
             * @return {boolean} true if successful, false if invalid position request
             */
            HDC.prototype.seekDrive = function(drive, iSector, nSectors)
            {
                if (drive.disk) {
                    var aDiskInfo = drive.disk.info();
                    var nCylinders = aDiskInfo[0];
                    /*
                     * If nCylinders is zero, we probably have an empty disk image, awaiting initialization (see verifyDrive())
                     */
                    if (nCylinders) {
                        var nHeads = aDiskInfo[1];
                        var nSectorsPerTrack = aDiskInfo[2];
                        var nSectorsPerCylinder = nHeads * nSectorsPerTrack;
                        var nSectorsPerDisk = nCylinders * nSectorsPerCylinder;
                        if (iSector + nSectors <= nSectorsPerDisk) {
                            drive.wCylinder = Math.floor(iSector / nSectorsPerCylinder);
                            iSector %= nSectorsPerCylinder;
                            drive.bHead = Math.floor(iSector / nSectorsPerTrack);
                            /*
                             * Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers, so unlike
                             * FDC.seekDrive(), we must NOT add 1 to bSector below.  I could change how sector numbers are stored in
                             * hard disk images, but it seems preferable to keep the image format consistent and controller-independent.
                             */
                            drive.bSector = (iSector % nSectorsPerTrack);
                            drive.nBytes = nSectors * aDiskInfo[3];
                            /*
                             * NOTE: We don't set nSectorEnd, as an HDC command would, but it's irrelevant, because we don't actually
                             * do anything with nSectorEnd at this point.  Perhaps someday, when we faithfully honor/restrict requests
                             * to a single track (or a single cylinder, in the case of multi-track requests).
                             */
                            drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                            /*
                             * At this point, we've finished simulating what an HDC.XTC.DATA.CMD.READ_DATA command would have performed,
                             * up through doDMARead().  Now it's the caller responsibility to call readData(), like the DMA Controller would.
                             */
                            return true;
                        }
                    }
                }
                return false;
            };
            
            /**
             * autoMount(fRemount)
             *
             * @this {HDC}
             * @param {boolean} [fRemount] is true if we're remounting all auto-mounted disks
             * @return {boolean} true if one or more disk images are being auto-mounted, false if none
             */
            HDC.prototype.autoMount = function(fRemount)
            {
                if (!fRemount) this.cAutoMount = 0;
            
                for (var iDrive = 0; iDrive < this.aDrives.length; iDrive++) {
                    var drive = this.aDrives[iDrive];
                    if (drive.name && drive.path) {
            
                        if (fRemount && drive.disk && drive.disk.isRemote()) {
                            /*
                             * The Disk component has its own logic for remounting remote disks, so skip this disk.
                             *
                             * TODO: Consider rewriting how ALL disks are automounted/remounted, now that the Disk component
                             * is receiving its own powerDown() and powerUp() notifications (originally, it didn't receive them).
                             */
                            continue;
                        }
            
                        if (!this.loadDisk(iDrive, drive.name, drive.path, true) && fRemount)
                            this.setReady(false);
                        continue;
                    }
                    if (fRemount && drive.type !== undefined) {
                        drive.disk = null;
                        this.verifyDrive(drive, drive.type);
                    }
                }
                return !!this.cAutoMount;
            };
            
            /**
             * loadDisk(iDrive, sDiskName, sDiskPath, fAutoMount)
             *
             * @this {HDC}
             * @param {number} iDrive
             * @param {string} sDiskName
             * @param {string} sDiskPath
             * @param {boolean} fAutoMount
             * @return {boolean} true if disk (already) loaded, false if queued up (or busy)
             */
            HDC.prototype.loadDisk = function(iDrive, sDiskName, sDiskPath, fAutoMount)
            {
                var drive = this.aDrives[iDrive];
                if (drive.fBusy) {
                    this.notice("Drive " + iDrive + " busy");
                    return true;
                }
                drive.fBusy = true;
                if (fAutoMount) {
                    drive.fAutoMount = true;
                    this.cAutoMount++;
                    if (this.messageEnabled()) this.printMessage("loading " + sDiskName);
                }
                var disk = drive.disk || new Disk(this, drive, drive.mode);
                disk.load(sDiskName, sDiskPath, null, this.doneLoadDisk);
                return false;
            };
            
            /**
             * doneLoadDisk(drive, disk, sDiskName, sDiskPath)
             *
             * This is a callback issued by the Disk component once the load() operation has finished.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {Disk} disk is set if the disk was successfully mounted, null if not
             * @param {string} sDiskName
             * @param {string} sDiskPath
             */
            HDC.prototype.doneLoadDisk = function(drive, disk, sDiskName, sDiskPath)
            {
                drive.fBusy = false;
                if ((drive.disk = disk)) {
                    /*
                     * With the addition of notify(), users are now "alerted" whenever a diskette has finished loading;
                     * notify() is selective about its output, using print() if a print window is open, otherwise alert().
                     *
                     * WARNING: This conversion of drive number to drive letter, starting with "C:" (0x43), is very simplistic
                     * and is not guaranteed to match the drive mapping that DOS ultimately uses.
                     */
                    this.notice("Mounted disk \"" + sDiskName + "\" in drive " + String.fromCharCode(0x43 + drive.iDrive), drive.fAutoMount);
                }
                if (drive.fAutoMount) {
                    drive.fAutoMount = false;
                    if (!--this.cAutoMount) this.setReady();
                }
            };
            
            /**
             * unloadDrive(iDrive)
             *
             * NOTE: At the moment, we support only auto-mounts; there is no user interface for selecting hard disk images,
             * let alone unloading them, so there is currently no need for the following function.
             *
             * @this {HDC}
             * @param {number} iDrive
             *
             HDC.prototype.unloadDrive = function(iDrive)
             {
                this.aDrives[iDrive].disk = null;
                //
                // WARNING: This conversion of drive number to drive letter, starting with "C:" (0x43), is very simplistic
                // and is not guaranteed to match the drive mapping that DOS ultimately uses.
                //
                this.notice("Drive " + String.fromCharCode(0x43 + iDrive) + " unloaded");
            };
             */
            
            /**
             * intXTCData(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x320)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inXTCData = function(port, addrFrom)
            {
                var bIn = 0;
                if (this.regDataIndex < this.regDataTotal) {
                    bIn = this.regDataArray[this.regDataIndex];
                }
                if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.XTC);
                this.regStatus &= ~HDC.XTC.STATUS.INTERRUPT;
            
                this.printMessageIO(port, null, addrFrom, "DATA[" + this.regDataIndex + "]", bIn);
                if (++this.regDataIndex >= this.regDataTotal) {
                    this.regDataIndex = this.regDataTotal = 0;
                    this.regStatus &= ~(HDC.XTC.STATUS.IOMODE | HDC.XTC.STATUS.BUS | HDC.XTC.STATUS.BUSY);
                }
                return bIn;
            };
            
            /**
             * outXTCData(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x320)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outXTCData = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.regDataTotal + "]");
                if (this.regDataTotal < this.regDataArray.length) {
                    this.regDataArray[this.regDataTotal++] = bOut;
                }
                var bCmd = this.regDataArray[0];
                var cbCmd = (bCmd != HDC.XTC.DATA.CMD.INIT_DRIVE? 6 : this.regDataArray.length);
                if (this.regDataTotal == 6) {
                    /*
                     * XTC.STATUS.REQ must be CLEAR following any 6-byte command sequence that the HDC BIOS "COMMAND" function outputs,
                     * yet it must also be SET before the HDC BIOS will proceed with the remaining the 8-byte sequence that's part of
                     * HDC.XTC.DATA.CMD.INIT_DRIVE command. See inXTCStatus() for HACK details.
                     */
                    this.regStatus &= ~HDC.XTC.STATUS.REQ;
                }
                if (this.regDataTotal >= cbCmd) {
                    /*
                     * It's essential that XTC.STATUS.IOMODE be set here, at least after the final 8-byte HDC.XTC.DATA.CMD.INIT_DRIVE sequence.
                     */
                    this.regStatus |= HDC.XTC.STATUS.IOMODE;
                    this.regStatus &= ~HDC.XTC.STATUS.REQ;
                    this.doXTC();
                }
            };
            
            /**
             * inXTCStatus(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x321)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inXTCStatus = function(port, addrFrom)
            {
                var b = this.regStatus;
                this.printMessageIO(port, null, addrFrom, "STATUS", b);
                /*
                 * HACK: The HDC BIOS will not finish the HDC.XTC.DATA.CMD.INIT_DRIVE sequence unless it sees XTC.STATUS.REQ set again, nor will
                 * it read any of the XTC.DATA bytes returned from a HDC.XTC.DATA.CMD.REQUEST_SENSE command unless XTC.STATUS.REQ is set again, so
                 * we turn it back on if there are unprocessed data bytes.
                 */
                if (this.regDataIndex < this.regDataTotal) {
                    this.regStatus |= HDC.XTC.STATUS.REQ;
                }
                return b;
            };
            
            /**
             * outXTCReset(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x321)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outXTCReset = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "RESET");
                /*
                 * Not sure what to do with this value, and the value itself may be "don't care", but we'll save it anyway.
                 */
                this.regReset = bOut;
                if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.XTC);
                this.initController();
            };
            
            /**
             * inXTCConfig(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x322)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inXTCConfig = function(port, addrFrom)
            {
                this.printMessageIO(port, null, addrFrom, "CONFIG", this.regConfig);
                return this.regConfig;
            };
            
            /**
             * outXTCPulse(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x322)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outXTCPulse = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "PULSE");
                /*
                 * Not sure what to do with this value, and the value itself may be "don't care", but we'll save it anyway.
                 */
                this.regPulse = bOut;
                /*
                 * The HDC BIOS "COMMAND" function (@C800:0562) waits for these ALL status bits after writing to both regPulse
                 * and regPattern, so we must oblige it.
                 *
                 * TODO: Figure out exactly when either XTC.STATUS.BUS or XTC.STATUS.BUSY are supposed to be cleared.
                 * The HDC BIOS doesn't care much about them, except for the one location mentioned above. However, MS-DOS 4.0
                 * (aka the unreleased "multitasking" version of MS-DOS) cares, so I'm going to start by clearing them at the
                 * same point I clear XTC.STATUS.IOMODE.
                 */
                this.regStatus = HDC.XTC.STATUS.REQ | HDC.XTC.STATUS.BUS | HDC.XTC.STATUS.BUSY;
            };
            
            /**
             * outXTCPattern(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x323)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outXTCPattern = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "PATTERN");
                this.regPattern = bOut;
            };
            
            /**
             * outXTCNoise(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x327, 0x32B or 0x32F)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outXTCNoise = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "NOISE");
            };
            
            /**
             * inATCData(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F0)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCData = function(port, addrFrom)
            {
                var bIn = -1;
            
                if (this.drive) {
                    /*
                     * We use the synchronous form of readData() at this point because we have no choice; an I/O instruction
                     * has just occurred and cannot be delayed.  The good news is that doATCommand() should have already primed
                     * the pump; all we can do is assert that the pump has something in it.  If bIn is inexplicably negative,
                     * well, then the caller will get 0xff.
                     */
                    var hdc = this;
                    bIn = this.readData(this.drive, function(b, fAsync, obj, off) {
                        hdc.assert(!fAsync);
                        if (BACKTRACK) {
                            if (!off && obj.file && hdc.messageEnabled(Messages.DISK)) {
                                hdc.printMessage("loading " + obj.file.sPath + '[' + obj.offFile + "] via port " + str.toHexWord(port), true);
                            }
                            /*
                             * TODO: We could define a cached BTO that's reset prior to a new ATC command, and then pass that
                             * to addBackTrackObject() here instead of null; but for now, we're going to rely on that function's
                             * simplistic MRU logic.  If that fails, the worst that will (or should) happen is we'll burn through
                             * more BackTrack wrapper objects than necessary, and risk running out.
                             */
                            var bto = hdc.bus.addBackTrackObject(obj, null, off);
                            hdc.cpu.backTrack.btiIO = hdc.bus.getBackTrackIndex(bto, off);
                        }
                    });
                    this.assert(bIn >= 0);
            
                    if (this.drive.ibSector == 1) {
                        /*
                         * printMessageIO() calls, if enabled, can be overwhelming for this port, so limit them to the first byte
                         * of each sector.
                         */
                        if (this.messageEnabled(Messages.PORT | Messages.HDC)) {
                            this.printMessageIO(port, null, addrFrom, "DATA[" + this.drive.ibSector + "]", bIn);
                        }
                    }
                    else if (this.drive.ibSector == this.drive.cbSector) {
                        /*
                         * Now that we've supplied a full sector of data, see if the caller's expecting additional sectors;
                         * if so, prime the pump again.  The caller should not poll us again until another interrupt's been delivered.
                         */
                        if (this.messageEnabled(Messages.DATA | Messages.HDC)) {
                            var sDump = this.drive.disk.dumpSector(this.drive.sector);
                            if (sDump) this.dbg.message(sDump);
                        }
            
                        this.drive.nBytes -= this.drive.cbSector;
                        this.regSecCnt = (this.regSecCnt - 1) & 0xff;
                        /*
                         * TODO: If the WITH_ECC bit is set in the READ_DATA command, then we need to support "stuffing" 4
                         * additional bytes into the inATCData() stream.  And we must first set DATA_REQ in the STATUS register.
                         */
                        if (this.drive.nBytes >= this.drive.cbSector) {
                            hdc.regStatus = HDC.ATC.STATUS.BUSY | HDC.ATC.STATUS.DATA_REQ;
                            this.readData(this.drive, function(b, fAsync) {
                                if (b >= 0) {
                                    hdc.setATCIRR();
                                    hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                                } else {
                                    /*
                                     * TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
                                     * Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
                                     */
                                     hdc.regStatus = HDC.ATC.STATUS.ERROR;
                                     hdc.regError = HDC.ATC.ERROR.NO_CHS;
                                    if (DEBUG) hdc.printMessage("HDC.inATCData(): read failed");
                                }
                            }, false);
                        } else {
                            this.assert(!this.drive.nBytes);
                            this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                        }
                    }
                }
                return bIn;
            };
            
            /**
             * outATCData(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F0)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCData = function(port, bOut, addrFrom)
            {
                if (this.drive) {
                    if (this.drive.nBytes >= this.drive.cbSector) {
                        if (this.writeData(this.drive, bOut) < 0) {
                            /*
                             * TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
                             * Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
                             */
                            this.regStatus = HDC.ATC.STATUS.ERROR;
                            this.regError = HDC.ATC.ERROR.NO_CHS;
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write failed");
                            }
                        }
                        else if (this.drive.ibSector == 1) {
                            /*
                             * printMessageIO() calls, if enabled, can be overwhelming for this port, so limit them to the first byte
                             * of each sector.
                             */
                            if (this.messageEnabled(Messages.PORT | Messages.HDC)) {
                                this.printMessageIO(port, bOut, addrFrom, "DATA[" + this.drive.ibSector + "]");
                            }
                        }
                        else if (this.drive.ibSector == this.drive.cbSector) {
            
                            if (this.messageEnabled(Messages.DATA | Messages.HDC)) {
                                var sDump = this.drive.disk.dumpSector(this.drive.sector);
                                if (sDump) this.dbg.message(sDump);
                            }
            
                            this.drive.nBytes -= this.drive.cbSector;
                            this.regSecCnt = (this.regSecCnt - 1) & 0xff;
                            this.setATCIRR(true);
                            this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                            if (this.drive.nBytes >= this.drive.cbSector) {
                                this.regStatus |= HDC.ATC.STATUS.DATA_REQ;
                            } else {
                                this.assert(!this.drive.nBytes);
                            }
                        }
                    } else {
                        /*
                         * TODO: What to do about unexpected writes? The number of bytes has exceeded what the command specified.
                         */
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write exceeds count (" + this.drive.nBytes + ")");
                        }
                    }
                } else {
                    /*
                     * TODO: What to do about unexpected writes? No command was specified.
                     */
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("HDC.outATCData(" + str.toHexByte(bOut) + "): write without command");
                    }
                }
            };
            
            /**
             * inATCError(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F1)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCError = function(port, addrFrom)
            {
                var bIn = this.regError;
                this.printMessageIO(port, null, addrFrom, "ERROR", bIn);
                return bIn;
            };
            
            /**
             * outATCWPreC(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F1)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCWPreC = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "WPREC");
                this.regWPreC = bOut;
            };
            
            /**
             * inATCSecCnt(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F2)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCSecCnt = function(port, addrFrom)
            {
                var bIn = this.regSecCnt;
                this.printMessageIO(port, null, addrFrom, "SECCNT", bIn);
                return bIn;
            };
            
            /**
             * outATCSecCnt(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F2)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCSecCnt = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "SECCNT");
                this.regSecCnt = bOut;
            };
            
            /**
             * inATCSecNum(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F3)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCSecNum = function(port, addrFrom)
            {
                var bIn = this.regSecNum;
                this.printMessageIO(port, null, addrFrom, "SECNUM", bIn);
                return bIn;
            };
            
            /**
             * outATCSecNum(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F3)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCSecNum = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "SECNUM");
                this.regSecNum = bOut;
            };
            
            /**
             * inATCCylLo(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F4)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCCylLo = function(port, addrFrom)
            {
                var bIn = this.regCylLo;
                this.printMessageIO(port, null, addrFrom, "CYLLO", bIn);
                return bIn;
            };
            
            /**
             * outATCCylLo(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F4)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCCylLo = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "CYLLO");
                this.regCylLo = bOut;
            };
            
            /**
             * inATCCylHi(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F5)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCCylHi = function(port, addrFrom)
            {
                var bIn = this.regCylHi;
                this.printMessageIO(port, null, addrFrom, "CYLHI", bIn);
                return bIn;
            };
            
            /**
             * outATCCylHi(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F5)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCCylHi = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "CYLHI");
                this.regCylHi = bOut;
            };
            
            /**
             * inATCDrvHd(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F6)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCDrvHd = function(port, addrFrom)
            {
                var bIn = this.regDrvHd;
                this.printMessageIO(port, null, addrFrom, "DRVHD", bIn);
                return bIn;
            };
            
            /**
             * outATCDrvHd(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F6)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCDrvHd = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "DRVHD");
                this.regDrvHd = bOut;
                /*
                 * The MODEL_5170_REV3 BIOS (see "POST2_CHK_HF2" @F000:14FC) probes for a 2nd hard drive when the number
                 * of configured hard drives is something other than 2, using INT 0x13/AH=0x10.  This in turn calls the
                 * BIOS "TST_RDY" function, which selects the drive in this register (see DRIVE_MASK), and then immediately
                 * expects regStatus to reflect success or failure.
                 *
                 * We were always returning success, because no ATC command was actually issued, and so the user would
                 * always get a spurious CMOS configuration error: "System Options Not Set-(Run SETUP)".
                 *
                 * So now we update regStatus here.  I'm not sure which status bits are normally set to indicate failure,
                 * but it should be sufficient to set or clear the READY bit according to whether the drive exists or not.
                 *
                 * TODO: Dig into the ATC documentation some more, and determine what other situations, if any, regStatus
                 * needs to be updated.
                 */
                var iDrive = (this.regDrvHd & HDC.ATC.DRVHD.DRIVE_MASK? 1 : 0);
                if (this.aDrives[iDrive]) {
                    this.regStatus |= HDC.ATC.STATUS.READY;
                } else {
                    this.regStatus &= ~HDC.ATC.STATUS.READY;
                }
            };
            
            /**
             * inATCStatus(port, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F7)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            HDC.prototype.inATCStatus = function(port, addrFrom)
            {
                var bIn = this.regStatus;
                this.printMessageIO(port, null, addrFrom, "STATUS", bIn);
                /*
                 * Despite what IBM's documentation for the "Personal Computer AT Fixed Disk and Diskette Drive Adapter"
                 * (August 31, 1984) says (ie, "A read of the status register clears interrupt request 14"), we cannot
                 * unilaterally clear the IRQ on any read of STATUS.  For starters, that would completely break the PC AT
                 * ROM BIOS; here's what it does for multi-sector reads:
                 *
                 *      (1) read sector (REP INSW)
                 *      (2) check STATUS
                 *      (3) check sector count, exit if done
                 *      (4) wait for interrupt
                 *      (5) repeat
                 *
                 * Since we set the IRR immediately after (1), we cannot immediately clear the IRR at (2), otherwise the
                 * interrupt at (4) never happens.  So, maybe there are SOME situations where IRR should be cleared on
                 * a read, but I don't know what they are.
                 *
                 *      if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.ATC);
                 */
                return bIn;
            };
            
            /**
             * outATCCommand(port, bOut, addrFrom)
             *
             * @this {HDC}
             * @param {number} port (0x1F7)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCCommand = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "COMMAND");
                this.regCommand = bOut;
                if (this.chipset) this.chipset.clearIRR(ChipSet.IRQ.ATC);
                this.doATC();
            };
            
            /**
             * outATCFDR(port, bOut, addrFrom)
             *
             * This is referred to in IBM's docs as the "Fixed Disk Register" (write-only)
             *
             * @this {HDC}
             * @param {number} port (0x3F6)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            HDC.prototype.outATCFDR = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "FDR");
                /*
                 * I'm not really sure if I should set HDC.ATC.DIAG.NO_ERROR in regError after *every* write where
                 * HDC.ATC.FDR.RESET is clear, or only after it has transitioned from set to clear; since the BIOS only
                 * requires the latter, I'm going to be conservative and restrict regError updates to the latter.
                 */
                if ((this.regFDR & HDC.ATC.FDR.RESET) && !(bOut & HDC.ATC.FDR.RESET)) this.regError = HDC.ATC.DIAG.NO_ERROR;
                this.regFDR = bOut;
            };
            
            /**
             * doATC()
             *
             * Handles ATC (AT Controller) commands
             *
             * @this {HDC}
             */
            HDC.prototype.doATC = function()
            {
                var hdc = this;
                var fInterrupt = false;
                var bCmd = this.regCommand;
                var iDrive = (this.regDrvHd & HDC.ATC.DRVHD.DRIVE_MASK? 1 : 0);
                var nHead = this.regDrvHd & HDC.ATC.DRVHD.HEAD_MASK;
                var nCylinder = this.regCylLo | ((this.regCylHi & HDC.ATC.CYLHI.MASK) << 8);
                var nSector = this.regSecNum;
                var nSectors = this.regSecCnt || 256;
            
                this.drive = null;
                this.regError = HDC.ATC.ERROR.NONE;
                this.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
            
                var drive = this.aDrives[iDrive];
                if (!drive) {
                    bCmd = -1;
                } else {
                    /*
                     * Update the Drive object with the new positional information associated with this command.
                     */
                    drive.wCylinder = nCylinder;
                    drive.bHead = nHead;
                    drive.bSector = nSector;
                    drive.nBytes = nSectors * drive.cbSector;
                    bCmd = (bCmd >= HDC.ATC.COMMAND.DIAGNOSE? bCmd : (bCmd & HDC.ATC.COMMAND.MASK));
                    /*
                     * Since the ATC doesn't use DMA, we must now set some additional Drive state for the benefit of any
                     * follow-up I/O instructions.  For example, any subsequent inATCData() and outATCData() calls need to
                     * know which drive to talk to ("this.drive"), to issue their own readData() and writeData() calls.
                     *
                     * The XTC didn't need this, because it used doDMARead(), doDMAWrite(), doDMAFormat() helper functions,
                     * which reset the current drive's "sector" and "errorCode" properties themselves and then used DMA
                     * functions that delivered drive data with direct calls to readData() and writeData().
                     */
                    drive.sector = null;
                    drive.ibSector = 0;
                    drive.errorCode = 0;
                    this.drive = drive;
                }
            
                if (DEBUG && this.messageEnabled(Messages.HDC)) {
                    this.printMessage("HDC.doATC(" + str.toHexByte(bCmd) + "): " + HDC.aATCCommands[bCmd], true);
                }
            
                switch (bCmd & HDC.ATC.COMMAND.MASK) {
            
                case HDC.ATC.COMMAND.READ_DATA:
                    if (DEBUG && this.messageEnabled(Messages.HDC)) {
                        this.printMessage("HDC.doRead(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true);
                    }
                    /*
                     * We're using a call to readData() that disables auto-increment, so that once we've got the first
                     * byte of the next sector, we can signal an interrupt without also consuming the first byte, allowing
                     * inATCData() to begin with that byte.
                     *
                     * As with the WRITE_DATA command, I'm not sure which of BUSY and DATA_REQ (or both) should be set here,
                     * so I'm setting both of them for now.  I clear them as soon as I have data.
                     */
                    hdc.regStatus = HDC.ATC.STATUS.BUSY | HDC.ATC.STATUS.DATA_REQ;
            
                    this.readData(drive, function(b, fAsync) {
                        if (b >= 0 && hdc.chipset) {
                            hdc.setATCIRR();
                            hdc.regStatus = HDC.ATC.STATUS.READY | HDC.ATC.STATUS.SEEK_OK;
                        } else {
                            /*
                             * TODO: It would be nice to be a bit more specific about the error (if any) that just occurred.
                             * Consult drive.errorCode (it uses older XTC error codes, but mapping those codes should be trivial).
                             */
                            hdc.regStatus = HDC.ATC.STATUS.ERROR;
                            hdc.regError = HDC.ATC.ERROR.NO_CHS;
                        }
                    }, false);
                    break;
            
                case HDC.ATC.COMMAND.WRITE_DATA:
                    if (DEBUG && this.messageEnabled(Messages.HDC)) {
                        this.printMessage("HDC.doWrite(" + iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + nSectors + ")", true);
                    }
                    this.regStatus = HDC.ATC.STATUS.DATA_REQ;
                    break;
            
                case HDC.ATC.COMMAND.RESTORE:
                    /*
                     * Physically, this retracts the heads to cylinder 0, but logically, there isn't anything to do.
                     */
                    fInterrupt = true;
                    break;
            
                case HDC.ATC.COMMAND.READ_VERF:
                    /*
                     * Since the READ VERIFY command returns no data, once again, logically, there isn't much we HAVE to
                     * to do, but... TODO: Verify that all the disk parameters are valid, and return an error if they're not.
                     */
                    fInterrupt = true;
                    break;
            
                case HDC.ATC.COMMAND.DIAGNOSE:
                    this.regError = HDC.ATC.DIAG.NO_ERROR;
                    fInterrupt = true;
                    break;
            
                case HDC.ATC.COMMAND.SETPARMS:
                    /*
                     * The documentation implies that the only parameters this command really affects are the number
                     * of heads (from regDrvHd) and sectors/track (from regSecCnt) -- this despite the fact that the BIOS
                     * programs all the other registers.  For a type 2 drive, that includes:
                     *
                     *      WPREC:   0x4B
                     *      SECCNT:  0x11 (for 17 sectors per track)
                     *      CYL:    0x100 (256 -- huh?)
                     *      SECNUM:  0x0C (12 -- huh?)
                     *      DRVHD:   0xA3 (max head of 0x03, for 4 total heads)
                     *
                     * The importance of SECCNT (nSectors) and DRVHD (nHeads) is controlling how multi-sector operations
                     * advance to the next sector; see advanceSector().
                     */
                    this.assert(drive.nHeads == nHead + 1);
                    this.assert(drive.nSectors == nSectors);
                    drive.nHeads = nHead + 1;
                    drive.nSectors = nSectors;
                    fInterrupt = true;
                    break;
            
                default:
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("HDC.doATC(" + str.toHexByte(this.regCommand) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation"));
                        if (bCmd >= 0) this.dbg.stopCPU();
                    }
                    break;
                }
            
                if (fInterrupt) this.setATCIRR();
            };
            
            /**
             * setATCIRR(fWrite)
             *
             * Raise the ATC's IRQ, provided ATC interrupts are enabled.
             *
             * @this {HDC}
             * @param {boolean} [fWrite] is true on completion of a write to the sector buffer
             */
            HDC.prototype.setATCIRR = function(fWrite)
            {
                if (this.chipset) {
                    if (!(this.regFDR & HDC.ATC.FDR.INT_DISABLE)) {
                        /*
                         * TODO: Determine what the "correct" instruction delay should be here.  When the OS/2 1.0 Install Disk
                         * begins copying files to the hard disk, at one point it performs the following 125-sector write (use the
                         * Debugger's "m hdc on" and "m pic on" commands to enable HDC and PIC messages, along with "m data on"
                         * if you also want to see the actual sector data being written):
                         *
                         *      HDC.doATC(0x30): Write
                         *      HDC.doWrite(0,2:0:5,125)
                         *
                         * As the write progresses, you'll notice that the HDC interrupt after each sector occurs at decreasingly
                         * lower points in the stack, until we eventually start overwriting non-stack data:
                         *
                         *      getIRRVector(): IRQ 14 interrupting @0090:52A6 stack=0050:1906
                         *      getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:18D6
                         *      getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:18A6
                         *      ...
                         *      getIRRVector(): IRQ 14 interrupting @0318:196B stack=0050:1156
                         *
                         * At roughly this point, very bad things start happening.  I decided to try an arbitrarily large delay
                         * on the setIRR() call here (120), and the problem vanished, so it seems likely that the OS/2 disk driver
                         * has a low tolerance for fast controller interrupts during multi-sector operations.
                         */
                        this.chipset.setIRR(ChipSet.IRQ.ATC, 120);
                        if (DEBUG) this.printMessage("HDC.setATCIRR(): enabled", Messages.PIC | Messages.HDC);
                    } else {
                        if (DEBUG) this.printMessage("HDC.setATCIRR(): disabled", Messages.PIC | Messages.HDC);
                    }
                }
            };
            
            /**
             * doXTC()
             *
             * Handles XTC (XT Controller) commands
             *
             * @this {HDC}
             */
            HDC.prototype.doXTC = function()
            {
                var hdc = this;
                this.regDataIndex = 0;
            
                var bCmd = this.popCmd();
                var bCmdOrig = bCmd;
                var b1 = this.popCmd();
                var bDrive = b1 & 0x20;
                var iDrive = (bDrive >> 5);
            
                var bHead = b1 & 0x1f;
                var b2 = this.popCmd();
                var b3 = this.popCmd();
                var wCylinder = ((b2 << 2) & 0x300) | b3;
                var bSector = b2 & 0x3f;
                var bCount = this.popCmd();             // block count or interleave count, depending on the command
                var bControl = this.popCmd();
                var bParm, bDataStatus;
            
                var drive = this.aDrives[iDrive];
                if (drive) {
                    drive.wCylinder = wCylinder;
                    drive.bHead = bHead;
                    drive.bSector = bSector;
                    drive.nBytes = bCount * drive.cbSector;
                }
            
                /*
                 * I tried to save normal command processing from having to deal with invalid drives,
                 * but the HDC BIOS initializes both drive 0 AND drive 1 on a HDC.XTC.DATA.CMD.INIT_DRIVE command,
                 * and apparently that particular command has no problem with non-existent drives.
                 *
                 * So I've separated the commands into two groups: drive-ambivalent commands should be
                 * processed in the first group, and all the rest should be processed in the second group.
                 */
                switch (bCmd) {
            
                case HDC.XTC.DATA.CMD.REQUEST_SENSE:        // 0x03
                    this.beginResult(drive? drive.errorCode : HDC.XTC.DATA.ERR.NOT_READY);
                    this.pushResult(b1);
                    this.pushResult(b2);
                    this.pushResult(b3);
                    /*
                     * Although not terribly clear from IBM's "Fixed Disk Adapter" documentation, a data "status byte"
                     * also follows the 4 "sense bytes".  Interestingly, The HDC BIOS checks that data status byte for
                     * XTC.DATA.STATUS.ERROR, but I have to wonder if it would have ever been set for this command....
                     *
                     * The whole point of the HDC.XTC.DATA.CMD.REQUEST_SENSE command is to obtain details about a
                     * previous error, so if HDC.XTC.DATA.CMD.REQUEST_SENSE itself reports an error, what would that mean?
                     */
                    this.pushResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                    bCmd = -1;                              // mark the command as complete
                    break;
            
                case HDC.XTC.DATA.CMD.INIT_DRIVE:           // 0x0C
                    /*
                     * Pop off all the extra "Initialize Drive Characteristics" bytes and store them, for the benefit of
                     * other functions, like verifyDrive().
                     */
                    var i = 0;
                    while ((bParm = this.popCmd()) >= 0) {
                        if (drive && i < drive.abDriveParms.length) {
                            drive.abDriveParms[i++] = bParm;
                        }
                    }
                    if (drive) this.verifyDrive(drive);
                    bDataStatus = HDC.XTC.DATA.STATUS.OK;
                    if (!drive && this.iDriveAllowFail == iDrive) {
                        this.iDriveAllowFail = -1;
                        if (DEBUG) this.printMessage("HDC.doXTC(): fake failure triggered");
                        bDataStatus = HDC.XTC.DATA.STATUS.ERROR;
                    }
                    this.beginResult(bDataStatus | bDrive);
                    bCmd = -1;                              // mark the command as complete
                    break;
            
                case HDC.XTC.DATA.CMD.RAM_DIAGNOSTIC:       // 0xE0
                case HDC.XTC.DATA.CMD.CTL_DIAGNOSTIC:       // 0xE4
                    this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                    bCmd = -1;                              // mark the command as complete
                    break;
            
                default:
                    break;
                }
            
                if (bCmd >= 0) {
                    if (drive === undefined) {
                        bCmd = -1;
                    } else {
                        /*
                         * In preparation for this command, zero out the drive's errorCode and senseCode.
                         * Commands that require a disk address should update senseCode with HDC.XTC.DATA.SENSE_ADDR_VALID.
                         * And of course, any command that encounters an error should set the appropriate error code.
                         */
                        drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                        drive.senseCode = 0;
                    }
                    switch (bCmd) {
                    case HDC.XTC.DATA.CMD.TEST_READY:       // 0x00
                        this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                        break;
            
                    case HDC.XTC.DATA.CMD.RECALIBRATE:      // 0x01
                        drive.bControl = bControl;
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("HDC.doXTC(): drive " + iDrive + " control byte: " + str.toHexByte(bControl));
                        }
                        this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                        break;
            
                    case HDC.XTC.DATA.CMD.READ_VERF:        // 0x05
                        /*
                         * This is a non-DMA operation, so we simply pretend everything is OK for now.  TODO: Revisit.
                         */
                        this.beginResult(HDC.XTC.DATA.STATUS.OK | bDrive);
                        break;
            
                    case HDC.XTC.DATA.CMD.READ_DATA:        // 0x08
                        this.doDMARead(drive, function(bStatus) {
                            hdc.beginResult(bStatus | bDrive);
                        });
                        break;
            
                    case HDC.XTC.DATA.CMD.WRITE_DATA:       // 0x0A
                        /*
                         * QUESTION: The IBM TechRef (p.1-188) implies that bCount is used as part of HDC.XTC.DATA.CMD.WRITE_DATA command,
                         * but it is omitted from the HDC.XTC.DATA.CMD.READ_DATA command.  Is that correct?  Note that, as far as the length
                         * of the transfer is concerned, we rely exclusively on the DMA controller being programmed with the appropriate byte count.
                         */
                        this.doDMAWrite(drive, function(bStatus) {
                            hdc.beginResult(bStatus | bDrive);
                        });
                        break;
            
                    case HDC.XTC.DATA.CMD.WRITE_BUFFER:     // 0x0F
                        this.doDMAWriteBuffer(drive, function(bStatus) {
                            hdc.beginResult(bStatus | bDrive);
                        });
                        break;
            
                    default:
                        this.beginResult(HDC.XTC.DATA.STATUS.ERROR | bDrive);
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("HDC.doXTC(" + str.toHexByte(bCmdOrig) + "): " + (bCmd < 0? ("invalid drive (" + iDrive + ")") : "unsupported operation"));
                            if (bCmd >= 0) this.dbg.stopCPU();
                        }
                        break;
                    }
                }
            };
            
            /**
             * popCmd()
             *
             * @this {HDC}
             * @return {number}
             */
            HDC.prototype.popCmd = function()
            {
                var bCmd = -1;
                var bCmdIndex = this.regDataIndex;
                if (bCmdIndex < this.regDataTotal) {
                    bCmd = this.regDataArray[this.regDataIndex++];
                    if (DEBUG && this.messageEnabled((bCmdIndex > 0? Messages.PORT : 0) | Messages.HDC)) {
                        this.printMessage("HDC.CMD[" + bCmdIndex + "]: " + str.toHexByte(bCmd) + (!bCmdIndex && HDC.aXTCCommands[bCmd]? (" (" + HDC.aXTCCommands[bCmd] + ")") : ""), true);
                    }
                }
                return bCmd;
            };
            
            /**
             * beginResult(bResult)
             *
             * @this {HDC}
             * @param {number} [bResult]
             */
            HDC.prototype.beginResult = function(bResult)
            {
                this.regDataIndex = this.regDataTotal = 0;
            
                if (bResult !== undefined) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("HDC.beginResult(" + str.toHexByte(bResult) + ")");
                    }
                    this.pushResult(bResult);
                }
                /*
                 * After the Execution phase (eg, DMA Terminal Count has occurred, or the EOT sector has been read/written),
                 * an interrupt is supposed to occur, signaling the beginning of the Result Phase.  Once the data "status byte"
                 * has been read from XTC.DATA, the interrupt is cleared (see inXTCData).
                 */
                if (this.chipset) this.chipset.setIRR(ChipSet.IRQ.XTC);
                this.regStatus |= HDC.XTC.STATUS.INTERRUPT;
            };
            
            /**
             * pushResult(bResult)
             *
             * @this {HDC}
             * @param {number} bResult
             */
            HDC.prototype.pushResult = function(bResult)
            {
                if (DEBUG && this.messageEnabled((this.regDataTotal > 0? Messages.PORT : 0) | Messages.HDC)) {
                    this.printMessage("HDC.RES[" + this.regDataTotal + "]: " + str.toHexByte(bResult), true);
                }
                this.regDataArray[this.regDataTotal++] = bResult;
            };
            
            /**
             * dmaRead(drive, b, done)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b
             * @param {function(number,boolean)} done
             */
            HDC.prototype.dmaRead = function(drive, b, done)
            {
                if (b === undefined || b < 0) {
                    this.readData(drive, done);
                    return;
                }
                /*
                 * The DMA controller should be ASKING for data, not GIVING us data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaRead(): invalid DMA acknowledgement");
                done(-1, false);
            };
            
            /**
             * dmaWrite(drive, b)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b
             * @return {number}
             */
            HDC.prototype.dmaWrite = function(drive, b)
            {
                if (b !== undefined && b >= 0)
                    return this.writeData(drive, b);
                /*
                 * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaWrite(): invalid DMA acknowledgement");
                return -1;
            };
            
            /**
             * dmaWriteBuffer(drive, b)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b
             * @return {number}
             */
            HDC.prototype.dmaWriteBuffer = function(drive, b)
            {
                if (b !== undefined && b >= 0)
                    return this.writeBuffer(drive, b);
                /*
                 * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaWriteBuffer(): invalid DMA acknowledgement");
                return -1;
            };
            
            /**
             * dmaWriteFormat(drive, b)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b
             * @returns {number}
             */
            HDC.prototype.dmaWriteFormat = function(drive, b)
            {
                if (b !== undefined && b >= 0)
                    return this.writeFormat(drive, b);
                /*
                 * The DMA controller should be GIVING us data, not ASKING for data; this suggests an internal DMA miscommunication
                 */
                if (DEBUG) this.printMessage("dmaWriteFormat(): invalid DMA acknowledgement");
                return -1;
            };
            
            /**
             * doDMARead(drive, done)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
             */
            HDC.prototype.doDMARead = function(drive, done)
            {
                drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
            
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("HDC.doDMARead(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")");
                }
            
                if (drive.disk) {
                    drive.sector = null;
                    if (this.chipset) {
                        /*
                         * We need to reverse the original logic, and default to success unless/until an actual error occurs;
                         * otherwise dmaRead()/readData() will bail on us.  The original approach used to work because requestDMA()
                         * would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                         * now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                         */
                        drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                        this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaRead', drive);
                        this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                            if (!fComplete) {
                                /*
                                 * If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                                 * (ie, revert to the default failure code that we originally set above).
                                 */
                                if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                    drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                                }
                            }
                            done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                        });
                        return;
                    }
                }
                done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
            };
            
            /**
             * doDMAWrite(drive, done)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
             */
            HDC.prototype.doDMAWrite = function(drive, done)
            {
                drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
            
                if (DEBUG && this.messageEnabled()) {
                    this.printMessage("HDC.doDMAWrite(" + drive.iDrive + ',' + drive.wCylinder + ':' + drive.bHead + ':' + drive.bSector + ',' + ((drive.nBytes / drive.cbSector)|0) + ")");
                }
            
                if (drive.disk) {
                    drive.sector = null;
                    if (this.chipset) {
                        /*
                         * We need to reverse the original logic, and default to success unless/until an actual error occurs;
                         * otherwise dmaWrite()/writeData() will bail on us.  The original approach would work because requestDMA()
                         * would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                         * now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                         */
                        drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                        this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWrite', drive);
                        this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                            if (!fComplete) {
                                /*
                                 * If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                                 * (ie, revert to the default failure code that we originally set above).
                                 */
                                if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                    drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                                }
                                /*
                                 * Mask any error that's the result of an attempt to write beyond the end of the track (which is
                                 * something the MS-DOS 4.0M's FORMAT utility seems to like to do).
                                 */
                                if (drive.errorCode == HDC.XTC.DATA.ERR.NO_SECTOR) {
                                    drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                                }
                            }
                            done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                        });
                        return;
                    }
                }
                done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
            };
            
            /**
             * doDMAWriteBuffer(drive, done)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
             */
            HDC.prototype.doDMAWriteBuffer = function(drive, done)
            {
                drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
            
                if (DEBUG) this.printMessage("HDC.doDMAWriteBuffer()");
            
                if (!drive.abSector || drive.abSector.length != drive.nBytes) {
                    drive.abSector = new Array(drive.nBytes);
                }
                drive.ibSector = 0;
                if (this.chipset) {
                    /*
                     * We need to reverse the original logic, and default to success unless/until an actual error occurs;
                     * otherwise dmaWriteBuffer() will bail on us.  The original approach would work because requestDMA()
                     * would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                     * now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                     */
                    drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                    this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWriteBuffer', drive);
                    this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                        if (!fComplete) {
                            /*
                             * If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                             * (ie, revert to the default failure code that we originally set above).
                             */
                            if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                            }
                        }
                        done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                    });
                    return;
                }
                done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
            };
            
            /**
             * doDMAFormat(drive, done)
             *
             * The drive variable is initialized by doXTC() to the following extent:
             *
             *      drive.bHead (ignored)
             *      drive.nBytes (bytes/sector)
             *      drive.bSectorEnd (sectors/track)
             *      drive.bFiller (fill byte)
             *
             * and we expect the DMA controller to provide C, H, R and N (ie, 4 bytes) for each sector to be formatted.
             *
             * NOTE: This function is not currently used.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {function(number)} done (dataStatus is XTC.DATA.STATUS.OK or XTC.DATA.STATUS.ERROR; if error, then drive.errorCode should be set as well)
             *
            HDC.prototype.doDMAFormat = function(drive, done)
            {
                drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
            
                if (drive.disk) {
                    drive.sector = null;
                    if (this.chipset) {
                        drive.cbFormat = 0;
                        drive.abFormat = new Array(4);
                        drive.bFormatting = true;
                        drive.cSectorsFormatted = 0;
                        //
                        // We need to reverse the original logic, and default to success unless/until an actual error occurs;
                        // otherwise dmaWriteFormat() will bail on us.  The original approach would work because requestDMA()
                        // would immediately call us back with fComplete set to true EVEN if the DMA channel was not yet unmasked;
                        // now the callback is deferred until the DMA channel has been unmasked and the DMA request has finished.
                        //
                        drive.errorCode = HDC.XTC.DATA.ERR.NONE;
                        this.chipset.connectDMA(ChipSet.DMA_HDC, this, 'dmaWriteFormat', drive);
                        this.chipset.requestDMA(ChipSet.DMA_HDC, function(fComplete) {
                            if (!fComplete) {
                                //
                                // If an incomplete request wasn't triggered by an explicit error, then let's make explicit
                                // (ie, revert to the default failure code that we originally set above).
                                //
                                if (drive.errorCode == HDC.XTC.DATA.ERR.NONE) {
                                    drive.errorCode = HDC.XTC.DATA.ERR.NOT_READY;
                                }
                            }
                            drive.bFormatting = false;
                            done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
                        });
                        return;
                    }
                }
                done(drive.errorCode? HDC.XTC.DATA.STATUS.ERROR : HDC.XTC.DATA.STATUS.OK);
            };
             */
            
            /**
             * readData(drive, done)
             *
             * The following drive variable properties must have been setup prior to our first call:
             *
             *      drive.wCylinder
             *      drive.bHead
             *      drive.bSector
             *      drive.sector (initialized to null)
             *
             * On the first readData() request, since drive.sector will be null, we ask the Disk object to look
             * up the first sector of the request.  We then ask the Disk for bytes from that sector until the sector
             * is exhausted, and then we look up the next sector and continue the process.
             *
             * NOTE: Since the HDC isn't aware of the extent of the transfer, all readData() can do is return bytes
             * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {function(number,boolean,Object,number)} [done] (number is next available byte from drive, or -1 if no more bytes available)
             * @param {boolean} [fAutoInc] (default is true to auto-increment)
             * @return {number} the requested byte, or -1 if unavailable
             */
            HDC.prototype.readData = function(drive, done, fAutoInc)
            {
                var b = -1;
                var obj = null, off = 0;    // these variables are purely for BACKTRACK purposes
            
                if (drive.errorCode) {
                    if (done) done(b, false, obj, off);
                    return b;
                }
            
                var inc = (fAutoInc !== false? 1 : 0);
            
                if (drive.sector) {
                    off = drive.ibSector;
                    b = drive.disk.read(drive.sector, drive.ibSector);
                    drive.ibSector += inc;
                    if (b >= 0) {
                        obj = drive.sector;
                        if (done) done(b, false, obj, off);
                        return b;
                    }
                }
            
                /*
                 * Locate the next sector, and then try reading again.
                 *
                 * Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers,
                 * hence the bSectorBias below.  I could change how sector numbers are stored in the image,
                 * but it seems preferable to keep the image format consistent and controller-independent.
                 */
                if (done) {
                    var hdc = this;
                    if (drive.disk) {
                        drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias, false, function(sector, fAsync) {
                            if ((drive.sector = sector)) {
                                obj = sector;
                                off = drive.ibSector = 0;
                                /*
                                 * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                                 * This allows the initial call to readData() to perform a seek without triggering an unwanted advance.
                                 */
                                hdc.advanceSector(drive);
                                b = drive.disk.read(drive.sector, drive.ibSector);
                                drive.ibSector += inc;
                            } else {
                                drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                            }
                            done(b, fAsync, obj, off);
                        });
                        return b;
                    }
                    drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                    done(b, false, obj, off);
                }
                return b;
            };
            
            /**
             * writeData(drive, b)
             *
             * The following drive variable properties must have been setup prior to our first call:
             *
             *      drive.wCylinder
             *      drive.bHead
             *      drive.bSector
             *      drive.sector (initialized to null)
             *
             * On the first writeData() request, since drive.sector will be null, we ask the Disk object to look
             * up the first sector of the request.  We then send the Disk bytes for that sector until the sector
             * is full, and then we look up the next sector and continue the process.
             *
             * NOTE: Since the HDC isn't aware of the extent of the transfer, all writeData() can do is accept bytes
             * until the current track (or, in the case of a multi-track request, the current cylinder) has been exhausted.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b containing next byte to write
             * @return {number} (b unchanged; return -1 if command should be terminated)
             */
            HDC.prototype.writeData = function(drive, b)
            {
                if (drive.errorCode) return -1;
                do {
                    if (drive.sector) {
                        if (drive.disk.write(drive.sector, drive.ibSector++, b))
                            break;
                    }
                    /*
                     * Locate the next sector, and then try writing again.
                     *
                     * Important difference between the FDC and the XTC: the XTC uses 0-based sector numbers,
                     * hence the bSectorBias below.  I could change how sector numbers are stored in the image,
                     * but it seems preferable to keep the image format consistent and controller-independent.
                     */
                    if (drive.disk) {
                        drive.disk.seek(drive.wCylinder, drive.bHead, drive.bSector + drive.bSectorBias, true, function(sector, fAsync) {
                            drive.sector = sector;
                        });
                    }
                    if (!drive.sector) {
                        drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                        b = -1;
                        break;
                    }
                    drive.ibSector = 0;
                    /*
                     * We "pre-advance" bSector et al now, instead of waiting to advance it right before the seek().
                     * This allows the initial call to writeData() to perform a seek without triggering an unwanted advance.
                     */
                    this.advanceSector(drive);
                } while (true);
                return b;
            };
            
            /**
             * advanceSector(drive)
             *
             * This increments the sector number; when the sector number reaches drive.nSectors on the current track, we
             * increment drive.bHead and reset drive.bSector, and when drive.bHead reaches drive.nHeads, we reset drive.bHead
             * and increment drive.wCylinder.
             *
             * One wrinkle is that the ATC uses 1-based sector numbers (bSectorBias is 0), whereas the XTC uses 0-based sector
             * numbers (bSectorBias is 1).  Thus, the correct "reset" value for bSector is (1 - bSectorBias), and the correct
             * limit for bSector is (nSectors + bSectorStart).
             *
             * @this {HDC}
             * @param {Object} drive
             */
            HDC.prototype.advanceSector = function(drive)
            {
                this.assert(drive.wCylinder < drive.nCylinders);
                drive.bSector++;
                var bSectorStart = (1 - drive.bSectorBias);
                if (drive.bSector >= drive.nSectors + bSectorStart) {
                    drive.bSector = bSectorStart;
                    drive.bHead++;
                    if (drive.bHead >= drive.nHeads) {
                        drive.bHead = 0;
                        drive.wCylinder++;
                    }
                }
            };
            
            /**
             * writeBuffer(drive, b)
             *
             * NOTE: Since the HDC isn't aware of the extent of the transfer, all writeBuffer() can do is accept bytes
             * until the buffer is full.
             *
             * TODO: Support for HDC.XTC.DATA.CMD.READ_BUFFER is missing, and support for HDC.XTC.DATA.CMD.WRITE_BUFFER may not be complete;
             * tests required.
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b containing next byte to write
             * @return {number} (b unchanged; return -1 if command should be terminated)
             */
            HDC.prototype.writeBuffer = function(drive, b)
            {
                if (drive.ibSector < drive.abSector.length) {
                    drive.abSector[drive.ibSector++] = b;
                } else {
                    /*
                     * TODO: Determine the proper error code to return here.
                     */
                    drive.errorCode = HDC.XTC.DATA.ERR.NO_SECTOR;
                    b = -1;
                }
                return b;
            };
            
            /**
             * writeFormat(drive, b)
             *
             * @this {HDC}
             * @param {Object} drive
             * @param {number} b containing a format command byte
             * @return {number} (b if successful, -1 if command should be terminated)
             */
            HDC.prototype.writeFormat = function(drive, b)
            {
                if (drive.errorCode) return -1;
                drive.abFormat[drive.cbFormat++] = b;
                if (drive.cbFormat == drive.abFormat.length) {
                    drive.wCylinder = drive.abFormat[0];    // C
                    drive.bHead = drive.abFormat[1];        // H
                    drive.bSector = drive.abFormat[2];      // R
                    drive.nBytes = 128 << drive.abFormat[3];// N (0 => 128, 1 => 256, 2 => 512, 3 => 1024)
                    drive.cbFormat = 0;
            
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("HDC.writeFormat(" + drive.wCylinder + ":" + drive.bHead + ":" + drive.bSector + ":" + drive.nBytes + ")");
                    }
            
                    for (var i = 0; i < drive.nBytes; i++) {
                        if (this.writeData(drive, drive.bFiller) < 0) {
                            return -1;
                        }
                    }
                    drive.cSectorsFormatted++;
                }
                if (drive.cSectorsFormatted >= drive.bSectorEnd) b = -1;
                return b;
            };
            
            /**
             * intBIOSDisk(addr)
             *
             * NOTE: This function differentiates HDC requests from FDC requests, based on whether the INT 0x13 drive number
             * in DL is >= 0x80.
             *
             * HACK: The HDC BIOS code for both INT 0x13/AH=0x00 and INT 0x13/AH=0x09 calls "INIT_DRV" @C800:0427, which is
             * hard-coded to issue the HDC.XTC.DATA.CMD.INIT_DRIVE command for BOTH drives 0 and 1 (aka drive numbers 0x80 and
             * 0x81), regardless of the drive number specified in DL; this means that the HDC.XTC.DATA.CMD.INIT_DRIVE command
             * must always succeed for drive 1 if it also succeeds for drive 0 -- even if there is no drive 1.  Bizarre, but OK,
             * whatever.
             *
             * So assuming we a have drive 0, when the power-on diagnostics in "DISK_SETUP" @C800:0003 call INT 0x13/AH=0x09
             * (@C800:00DB) for drive 0, it must succeed.  No problem.  But when "DISK_SETUP" starts probing for additional drives,
             * it first issues INT 0x13/AH=0x00, followed by INT 0x13/AH=0x11, and finally INT 0x13/AH=0x09.  If the first
             * (AH=0x00) or third (AH=0x09) INT 0x13 fails, it quickly moves on (ie, it jumps to "POD_DONE").  But as we just
             * discussed, both those operations call "INIT_DRV", which can't return an error.  This means the only function that
             * can return an error in this context is the recalibrate function (AH=0x11).  That sucks, because the way the HDC
             * BIOS is written, it will loop for anywhere from 1.5 seconds to 25 seconds (depending on whether the controller
             * is part of the "System Unit" or not; see port 0x213), attempting to recalibrate drive 1 until it finally times out.
             *
             * Normally, you'll only experience the 1.5 second delay, but even so, it's a ridiculous waste of time and a lot of
             * useless INT 0x13 calls.  So I monitor INT 0x13/AH=0x00 for DL >= 0x80 and set a special HDC.XTC.DATA.CMD.INIT_DRIVE
             * override flag (iDriveAllowFail) that will allow that command to fail, and in theory, make the the HDC BIOS
             * "DISK_SETUP" code much more efficient.
             *
             * @this {HDC}
             * @param {number} addr
             * @return {boolean} true to proceed with the INT 0x13 software interrupt, false to skip
             */
            HDC.prototype.intBIOSDisk = function(addr)
            {
                var AH = this.cpu.regEAX >> 8;
                var DL = this.cpu.regEDX & 0xff;
                if (!AH && DL > 0x80) this.iDriveAllowFail = DL - 0x80;
                return true;
            };
            
            /**
             * intBIOSDiskette(addr)
             *
             * When the HDC BIOS overwrites the ROM BIOS INT 0x13 address, it saves the original INT 0x13 address
             * in the INT 0x40 vector.  This function intercepts calls to that vector to work around a minor nuisance.
             *
             * The HDC BIOS's plan was simple, albeit slightly flawed: assign fixed disks drive numbers >= 0x80,
             * and whenever someone calls INT 0x13 with a drive number < 0x80, invoke the original INT 0x13 diskette
             * code via INT 0x40 and return via RET 2.
             *
             * Unfortunately, not all original INT 0x13 functions required a drive number in DL (eg, the "reset"
             * function, where AH=0).  And the HDC BIOS knew this, which is why, in the case of the "reset" function,
             * the HDC BIOS performs BOTH an INT 0x40 diskette reset AND an HDC reset -- it can't be sure which
             * controller the caller really wants to reset.
             *
             * An unfortunate side-effect of this behavior: when the HDC BIOS is initialized for the first time, it may
             * issue several resets internally, depending on whether there are 0, 1 or 2 hard disks installed, and each
             * of those resets also triggers completely useless diskette resets, each wasting up to two seconds waiting
             * for the FDC to interrupt.  The FDC tries to interrupt, but it can't, because at this early stage of
             * ROM BIOS initialization, IRQ.FDC hasn't been unmasked yet.
             *
             * My work-around: have the HDC component hook INT 0x40, and every time an INT 0x40 is issued with AH=0 and
             * IRQ.FDC masked, bypass the INT 0x40 interrupt.  This is as close as PCjs has come to patching any BIOS code
             * (something I've refused to do), and even here, I'm not doing it out of necessity, just annoyance.
             *
             * @this {HDC}
             * @param {number} addr
             * @return {boolean} true to proceed with the INT 0x40 software interrupt, false to skip
             */
            HDC.prototype.intBIOSDiskette = function(addr)
            {
                var AH = this.cpu.regEAX >> 8;
                if ((!AH && this.chipset && this.chipset.checkIMR(ChipSet.IRQ.FDC))) {
                    if (DEBUG) this.printMessage("HDC.intBIOSDiskette(): skipping useless INT 0x40 diskette reset");
                    return false;
                }
                return true;
            };
            
            /*
             * Port input notification tables
             */
            HDC.aXTCPortInput = {
                0x320:  HDC.prototype.inXTCData,
                0x321:  HDC.prototype.inXTCStatus,
                0x322:  HDC.prototype.inXTCConfig
            };
            
            HDC.aATCPortInput = {
                0x1F0:  HDC.prototype.inATCData,
                0x1F1:  HDC.prototype.inATCError,
                0x1F2:  HDC.prototype.inATCSecCnt,
                0x1F3:  HDC.prototype.inATCSecNum,
                0x1F4:  HDC.prototype.inATCCylLo,
                0x1F5:  HDC.prototype.inATCCylHi,
                0x1F6:  HDC.prototype.inATCDrvHd,
                0x1F7:  HDC.prototype.inATCStatus
            };
            
            /*
             * Port output notification tables
             */
            HDC.aXTCPortOutput = {
                0x320:  HDC.prototype.outXTCData,
                0x321:  HDC.prototype.outXTCReset,
                0x322:  HDC.prototype.outXTCPulse,
                0x323:  HDC.prototype.outXTCPattern,
                /*
                 * The PC XT Fixed Disk BIOS includes some additional "housekeeping" that it performs
                 * not only on port 0x323 but also on three additional ports, at increments of 4 (see all
                 * references to "RESET INT/DMA MASK" in the Fixed Disk BIOS).  It's not clear to me if
                 * those ports refer to additional HDC controllers, and I haven't seen other references to
                 * them, but in any case, they represent a lot of "I/O noise" that we simply squelch here.
                 */
                0x327:  HDC.prototype.outXTCNoise,
                0x32B:  HDC.prototype.outXTCNoise,
                0x32F:  HDC.prototype.outXTCNoise
            };
            
            HDC.aATCPortOutput = {
                0x1F0:  HDC.prototype.outATCData,
                0x1F1:  HDC.prototype.outATCWPreC,
                0x1F2:  HDC.prototype.outATCSecCnt,
                0x1F3:  HDC.prototype.outATCSecNum,
                0x1F4:  HDC.prototype.outATCCylLo,
                0x1F5:  HDC.prototype.outATCCylHi,
                0x1F6:  HDC.prototype.outATCDrvHd,
                0x1F7:  HDC.prototype.outATCCommand,
                0x3F6:  HDC.prototype.outATCFDR
            };
            
            /**
             * HDC.init()
             *
             * This function operates on every HTML element of class "hdc", extracting the
             * JSON-encoded parameters for the HDC constructor from the element's "data-value"
             * attribute, invoking the constructor to create a HDC component, and then binding
             * any associated HTML controls to the new component.
             */
            HDC.init = function()
            {
                var aeHDC = Component.getElementsByClass(window.document, PCJSCLASS, "hdc");
                for (var iHDC = 0; iHDC < aeHDC.length; iHDC++) {
                    var eHDC = aeHDC[iHDC];
                    var parmsHDC = Component.getComponentParms(eHDC);
                    var hdc = new HDC(parmsHDC);
                    Component.bindComponentControls(hdc, eHDC, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every Hard Drive Controller (HDC) module on the page.
             */
            web.onInit(HDC.init);
            
            if (typeof module !== 'undefined') module.exports = HDC;
            
          • interrupts.js
            /**
             * @fileoverview PCjs-specific BIOS/DOS interrupt definitions.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-Dec-11
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /*
             * Components that previously used Debugger interrupt definitions by including:
             *
             *     var Debugger = require("./debugger");
             *
             * and using:
             *
             *      Debugger.INT.FOO
             *
             * must now instead include:
             *
             *      var Interrupts = require("./interrupts");
             *
             * and then replace all occurrences of "Debugger.INT.FOO" with "Interrupts.FOO.VECTOR".
             */
            
            var Interrupts = {
                VIDEO: {
                    VECTOR: 0x10
                },
                DISK: {
                    VECTOR: 0x13
                },
                CASSETTE: {
                    VECTOR: 0x15
                },
                KBD: {
                    VECTOR: 0x16
                },
                RTC: {
                    VECTOR: 0x1a
                },
                TIMER_TICK: {
                    VECTOR: 0x1c
                },
                DOS: {
                    VECTOR: 0x21
                },
                MOUSE: {
                    VECTOR: 0x33
                }
            };
            
            if (typeof module !== 'undefined') module.exports = Interrupts;
            
          • keyboard.js
            /**
             * @fileoverview Implements the PCjs Keyboard component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-20
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var ChipSet     = require("./chipset");
                var State       = require("./state");
                var CPU         = require("./cpu");
            }
            
            /**
             * Keyboard(parmsKbd)
             *
             * The Keyboard component can be configured with the following (parmsKbd) properties:
             *
             *      model: model string; should be one of:
             *
             *          us83 (default)
             *          us84 (TODO: awaiting implementation)
             *          us101 (TODO: awaiting implementation)
             *
             * Its main purpose is to receive binding requests for various keyboard events, and to use those events
             * to simulate the PC's keyboard hardware.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsKbd
             */
            function Keyboard(parmsKbd)
            {
                Component.call(this, "Keyboard", parmsKbd, Keyboard, Messages.KEYBOARD);
            
                this.nDefaultModel = parmsKbd['model'];
            
                this.fMobile = web.isMobile();
                this.fMSIE = web.isUserAgent("MSIE");
                this.printMessage("mobile keyboard support: " + (this.fMobile? "true" : "false"));
            
                /*
                 * This is count of the number of "soft keyboard" keys present.  At the moment, its only
                 * purpose is to signal findBinding() whether to waste any time looking for SOFTCODE matches.
                 */
                this.cSoftCodes = 0;
            
                /*
                 * Updated by onFocusChange()
                 */
                this.fHasFocus = true;
            
                /*
                 * This is true whenever the physical Escape key is disabled (eg, by pointer locking code),
                 * giving us the opportunity to map a different physical key to machine's virtual Escape key.
                 */
                this.fEscapeDisabled = false;
            
                /*
                 * This is set whenever we notice a discrepancy between our internal CAPS_LOCK state and its
                 * apparent state; we check whenever aKeysActive has been emptied.
                 */
                this.fToggleCapsLock = false;
            
                /*
                 * New unified approach to key event processing: When we process a key on the "down" event,
                 * we check the aKeysActive array: if the key is already active, do nothing; otherwise, insert
                 * it into the table, generate the "make" scan code(s), and set a timeout for "repeat" if it's
                 * a repeatable key (most are).
                 *
                 * Similarly, when a key goes "up", if it's already not active, do nothing; otherwise, generate
                 * the "break" scan code(s), cancel any pending timeout, and remove it from the active key table.
                 *
                 * If a "press" event is received, then if the key is already active, remove it and (re)insert
                 * it at the head of the table, generate the "make" scan code(s), set nRepeat to -1, and set a
                 * timeout for "break".
                 *
                 * This requires an aKeysActive array that keeps track of the status of every active key; only the
                 * first entry in the array is allowed to repeat.  Each entry is a key object with the following
                 * properties:
                 *
                 *      simCode:    our simulated keyCode from onKeyDown, onKeyUp, or onKeyPress
                 *      fDown:      next state to simulate (true for down, false for up)
                 *      nRepeat:    > 0 if timer should generate more "make" scan code(s), -1 for "break" scan code(s)
                 *      timer:      timer for next key operation, if any
                 *
                 * Keys are inserted at the head of aKeysActive, using splice(0, 0, key), but not before zeroing
                 * nRepeat of any repeating key that already occupies the head (index 0), so that at most only one
                 * key (ie, the most recent) will ever be in a repeating state.
                 *
                 * IBM PC keyboard repeat behavior: when pressing CTRL, then C, and then releasing CTRL while still
                 * holding C, the repeated CTRL_C characters turn into 'c' characters.  We emulate that behavior.
                 * However, when pressing C, then CTRL, all repeating stops: not a single CTRL_C is generated, and
                 * even if the CTRL is released before the C, no more more 'c' characters are generated either.
                 * We do NOT fully emulate that behavior -- we DO stop the repeating, but we also generate one CTRL_C.
                 * More investigation is required, because I need to confirm whether the IBM keyboard automatically
                 * "breaks" all non-shift keys before it "makes" the CTRL.
                 */
                this.aKeysActive = [];
            
                this.msAutoRepeat   = 500;
                this.msNextRepeat   = 100;
                this.msAutoRelease  = 50;
                this.msInjectDelay  = 300;          // number of milliseconds between injected keystrokes
            
                /*
                 * HACK: We set fAllDown to false to ignore all down/up events for keys not explicitly marked as ONDOWN;
                 * even though that prevents those keys from being repeated properly (ie, at the simulation's repeat rate
                 * rather than the browser's repeat rate), it's the safest thing to do when dealing with international keyboards,
                 * because our mapping tables are designed for US keyboards, and testing all the permutations of international
                 * keyboards and web browsers is more work than I can take on right now.  TODO: Dig into this some day.
                 */
                this.fAllDown = false;
            
                this.setReady();
            }
            
            Component.subclass(Keyboard);
            
            /**
             * Alphanumeric and other common (printable) ASCII codes.
             *
             * TODO: Determine what we can do to get ALL constants like these inlined (enum doesn't seem to
             * get the job done); the problem seems to be limited to property references that use quotes, which
             * is why I've 'unquoted' as many of them as possible.
             *
             * @enum {number}
             */
            Keyboard.ASCII = {
             CTRL_A:  1, CTRL_C:  3, CTRL_Z: 26,
                ' ': 32,    '!': 33,    '"': 34,    '#': 35,    '$': 36,    '%': 37,    '&': 38,    "'": 39,
                '(': 40,    ')': 41,    '*': 42,    '+': 43,    ',': 44,    '-': 45,    '.': 46,    '/': 47,
                '0': 48,    '1': 49,    '2': 50,    '3': 51,    '4': 52,    '5': 53,    '6': 54,    '7': 55,
                '8': 56,    '9': 57,    ':': 58,    ';': 59,    '<': 60,    '=': 61,    '>': 62,    '?': 63,
                '@': 64,     A:  65,     B:  66,     C:  67,     D:  68,     E:  69,     F:  70,     G:  71,
                 H:  72,     I:  73,     J:  74,     K:  75,     L:  76,     M:  77,     N:  78,     O:  79,
                 P:  80,     Q:  81,     R:  82,     S:  83,     T:  84,     U:  85,     V:  86,     W:  87,
                 X:  88,     Y:  89,     Z:  90,    '[': 91,    '\\':92,    ']': 93,    '^': 94,    '_': 95,
                '`': 96,     a:  97,     b:  98,     c:  99,     d: 100,     e: 101,     f: 102,     g: 103,
                 h:  104,    i: 105,     j: 106,     k: 107,     l: 108,     m: 109,     n: 110,     o: 111,
                 p:  112,    q: 113,     r: 114,     s: 115,     t: 116,     u: 117,     v: 118,     w: 119,
                 x:  120,    y: 121,     z: 122,    '{':123,    '|':124,    '}':125,    '~':126
            };
            
            /**
             * Browser keyCodes we must pay particular attention to.  For the most part, these are
             * non-alphanumeric or function keys, some which may require special treatment (eg,
             * preventDefault() if returning false on the initial keyDown event is insufficient).
             *
             * keyCodes for most common ASCII keys can simply use the appropriate ASCII code above.
             *
             * Most of these represent non-ASCII keys (eg, the LEFT arrow key), yet for some reason,
             * browsers defined them using ASCII codes (eg, the LEFT arrow key uses the ASCII code
             * for '%' or 37).  This conflict is discussed further in the definition of CLICKCODE below.
             *
             * @enum {number}
             */
            Keyboard.KEYCODE = {
                /* 0x08 */ BS:          8,
                /* 0x09 */ TAB:         9,
                /* 0x0A */ LF:          10,
                /* 0x0D */ CR:          13,
                /* 0x10 */ SHIFT:       16,
                /* 0x11 */ CTRL:        17,
                /* 0x12 */ ALT:         18,
                /* 0x13 */ PAUSE:       19,         // PAUSE/BREAK
                /* 0x14 */ CAPS_LOCK:   20,
                /* 0x1B */ ESC:         27,
                /* 0x21 */ PGUP:        33,
                /* 0x22 */ PGDN:        34,
                /* 0x23 */ END:         35,
                /* 0x24 */ HOME:        36,
                /* 0x25 */ LEFT:        37,
                /* 0x26 */ UP:          38,
                /* 0x27 */ RIGHT:       39,
                /* 0x27 */ FF_QUOTE:    39,
                /* 0x28 */ DOWN:        40,
                /* 0x2C */ FF_COMMA:    44,
                /* 0x2C */ PRTSC:       44,
                /* 0x2D */ INS:         45,
                /* 0x2E */ DEL:         46,
                /* 0x2E */ FF_PERIOD:   46,
                /* 0x2F */ FF_SLASH:    47,
                /* 0x3B */ FF_SEMI:     59,
                /* 0x3D */ FF_EQUALS:   61,
                /* 0x5B */ CMD:         91,         // aka WIN
                /* 0x5B */ FF_LBRACK:   91,
                /* 0x5C */ FF_BSLASH:   92,
                /* 0x5D */ RCMD:        93,         // aka MENU
                /* 0x5D */ FF_RBRACK:   93,
                /* 0x60 */ NUM_INS:     96,         // 0
                /* 0x60 */ FF_BQUOTE:   96,
                /* 0x61 */ NUM_END:     97,         // 1
                /* 0x62 */ NUM_DOWN:    98,         // 2
                /* 0x63 */ NUM_PGDN:    99,         // 3
                /* 0x64 */ NUM_LEFT:    100,        // 4
                /* 0x65 */ NUM_CENTER:  101,        // 5
                /* 0x66 */ NUM_RIGHT:   102,        // 6
                /* 0x67 */ NUM_HOME:    103,        // 7
                /* 0x68 */ NUM_UP:      104,        // 8
                /* 0x69 */ NUM_PGUP:    105,        // 9
                /* 0x6A */ NUM_MUL:     106,
                /* 0x6B */ NUM_ADD:     107,
                /* 0x6D */ NUM_SUB:     109,
                /* 0x6E */ NUM_DEL:     110,        // .
                /* 0x6F */ NUM_DIV:     111,
                /* 0x70 */ F1:          112,
                /* 0x71 */ F2:          113,
                /* 0x72 */ F3:          114,
                /* 0x73 */ F4:          115,
                /* 0x74 */ F5:          116,
                /* 0x75 */ F6:          117,
                /* 0x76 */ F7:          118,
                /* 0x77 */ F8:          119,
                /* 0x78 */ F9:          120,
                /* 0x79 */ F10:         121,
                /* 0x7A */ F11:         122,
                /* 0x7B */ F12:         123,
                /* 0x90 */ NUM_LOCK:    144,
                /* 0x91 */ SCROLL_LOCK: 145,
                /* 0xAD */ FF_DASH:     173,
                /* 0xBA */ SEMI:        186,        // Firefox: 59
                /* 0xBB */ EQUALS:      187,        // Firefox: 61
                /* 0xBC */ COMMA:       188,        // Firefox: 44
                /* 0xBD */ DASH:        189,        // Firefox: 173
                /* 0xBE */ PERIOD:      190,        // Firefox: 46
                /* 0xBF */ SLASH:       191,        // Firefox: 47
                /* 0xC0 */ BQUOTE:      192,        // Firefox: 96
                /* 0xDB */ LBRACK:      219,        // Firefox: 91
                /* 0xDC */ BSLASH:      220,        // Firefox: 92
                /* 0xDD */ RBRACK:      221,        // Firefox: 93
                /* 0xDE */ QUOTE:       222,        // Firefox: 39
                /* 0xE0 */ FF_CMD:      224,        // Firefox only (used for both CMD and RCMD)
                //
                // The following biases use what I'll call Decimal Coded Binary or DCB (the opposite of BCD),
                // where the thousands digit is used to store the sum of "binary" digits 1 and/or 2 and/or 4.
                //
                // Technically, that makes it DCO (Decimal Coded Octal), but then again, BCD should have really
                // been called HCD (Hexadecimal Coded Decimal), so if "they" can take liberties, so can I.
                //
                // ONDOWN is a bias we add to browser keyCodes that we want to handle on "down" rather than on "press".
                //
                ONDOWN:                 1000,
                //
                // ONRIGHT is a bias we add to browser keyCodes that need to check for a "right" location (default is "left")
                //
                ONRIGHT:                2000,
                //
                // FAKE is a bias we add to signal these are fake keyCodes corresponding to internal keystroke combinations.
                // The actual values are for internal use only and merely need to be unique and used consistently.
                //
                FAKE:                   4000
            };
            
            /*
             * Maps "stupid" keyCodes to their "non-stupid" counterparts
             */
            Keyboard.STUPID_KEYCODES = {};
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.SEMI]    = Keyboard.ASCII[';'];   // 186 -> 59
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.EQUALS]  = Keyboard.ASCII['='];   // 187 -> 61
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.COMMA]   = Keyboard.ASCII[','];   // 188 -> 44
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.DASH]    = Keyboard.ASCII['-'];   // 189 -> 45
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.PERIOD]  = Keyboard.ASCII['.'];   // 190 -> 46
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.SLASH]   = Keyboard.ASCII['/'];   // 191 -> 47
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.BQUOTE]  = Keyboard.ASCII['`'];   // 192 -> 96
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.LBRACK]  = Keyboard.ASCII['['];   // 219 -> 91
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.BSLASH]  = Keyboard.ASCII['\\'];  // 220 -> 92
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.RBRACK]  = Keyboard.ASCII[']'];   // 221 -> 93
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.QUOTE]   = Keyboard.ASCII["'"];   // 222 -> 39
            Keyboard.STUPID_KEYCODES[Keyboard.KEYCODE.FF_DASH] = Keyboard.ASCII['-'];
            
            /*
             * Maps unshifted keyCodes to their shifted counterparts; to be used when a shift-key is down.
             * Alphabetic characters are handled in code, since they must also take CAPS_LOCK into consideration.
             */
            Keyboard.SHIFTED_KEYCODES = {};
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['1']]     = Keyboard.ASCII['!'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['2']]     = Keyboard.ASCII['@'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['3']]     = Keyboard.ASCII['#'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['4']]     = Keyboard.ASCII['$'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['5']]     = Keyboard.ASCII['%'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['6']]     = Keyboard.ASCII['^'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['7']]     = Keyboard.ASCII['&'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['8']]     = Keyboard.ASCII['*'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['9']]     = Keyboard.ASCII['('];
            Keyboard.SHIFTED_KEYCODES[Keyboard.ASCII['0']]     = Keyboard.ASCII[')'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.SEMI]   = Keyboard.ASCII[':'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.EQUALS] = Keyboard.ASCII['+'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.COMMA]  = Keyboard.ASCII['<'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.DASH]   = Keyboard.ASCII['_'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.PERIOD] = Keyboard.ASCII['>'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.SLASH]  = Keyboard.ASCII['?'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.BQUOTE] = Keyboard.ASCII['~'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.LBRACK] = Keyboard.ASCII['{'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.BSLASH] = Keyboard.ASCII['|'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.RBRACK] = Keyboard.ASCII['}'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.QUOTE]  = Keyboard.ASCII['"'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_DASH]   = Keyboard.ASCII['_'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_EQUALS] = Keyboard.ASCII['+'];
            Keyboard.SHIFTED_KEYCODES[Keyboard.KEYCODE.FF_SEMI]   = Keyboard.ASCII[':'];
            
            Keyboard.SIMCODE = {
                BS:           Keyboard.KEYCODE.BS          + Keyboard.KEYCODE.ONDOWN,
                TAB:          Keyboard.KEYCODE.TAB         + Keyboard.KEYCODE.ONDOWN,
                SHIFT:        Keyboard.KEYCODE.SHIFT       + Keyboard.KEYCODE.ONDOWN,
                RSHIFT:       Keyboard.KEYCODE.SHIFT       + Keyboard.KEYCODE.ONDOWN + Keyboard.KEYCODE.ONRIGHT,
                CTRL:         Keyboard.KEYCODE.CTRL        + Keyboard.KEYCODE.ONDOWN,
                ALT:          Keyboard.KEYCODE.ALT         + Keyboard.KEYCODE.ONDOWN,
                CAPS_LOCK:    Keyboard.KEYCODE.CAPS_LOCK   + Keyboard.KEYCODE.ONDOWN,
                ESC:          Keyboard.KEYCODE.ESC         + Keyboard.KEYCODE.ONDOWN,
                F1:           Keyboard.KEYCODE.F1          + Keyboard.KEYCODE.ONDOWN,
                F2:           Keyboard.KEYCODE.F2          + Keyboard.KEYCODE.ONDOWN,
                F3:           Keyboard.KEYCODE.F3          + Keyboard.KEYCODE.ONDOWN,
                F4:           Keyboard.KEYCODE.F4          + Keyboard.KEYCODE.ONDOWN,
                F5:           Keyboard.KEYCODE.F5          + Keyboard.KEYCODE.ONDOWN,
                F6:           Keyboard.KEYCODE.F6          + Keyboard.KEYCODE.ONDOWN,
                F7:           Keyboard.KEYCODE.F7          + Keyboard.KEYCODE.ONDOWN,
                F8:           Keyboard.KEYCODE.F8          + Keyboard.KEYCODE.ONDOWN,
                F9:           Keyboard.KEYCODE.F9          + Keyboard.KEYCODE.ONDOWN,
                F10:          Keyboard.KEYCODE.F10         + Keyboard.KEYCODE.ONDOWN,
                F11:          Keyboard.KEYCODE.F11         + Keyboard.KEYCODE.ONDOWN,
                F12:          Keyboard.KEYCODE.F12         + Keyboard.KEYCODE.ONDOWN,
                NUM_LOCK:     Keyboard.KEYCODE.NUM_LOCK    + Keyboard.KEYCODE.ONDOWN,
                SCROLL_LOCK:  Keyboard.KEYCODE.SCROLL_LOCK + Keyboard.KEYCODE.ONDOWN,
                PRTSC:        Keyboard.KEYCODE.PRTSC       + Keyboard.KEYCODE.ONDOWN,
                HOME:         Keyboard.KEYCODE.HOME        + Keyboard.KEYCODE.ONDOWN,
                UP:           Keyboard.KEYCODE.UP          + Keyboard.KEYCODE.ONDOWN,
                PGUP:         Keyboard.KEYCODE.PGUP        + Keyboard.KEYCODE.ONDOWN,
                NUM_SUB:      Keyboard.KEYCODE.NUM_SUB     + Keyboard.KEYCODE.ONDOWN,
                LEFT:         Keyboard.KEYCODE.LEFT        + Keyboard.KEYCODE.ONDOWN,
                NUM_CENTER:   Keyboard.KEYCODE.NUM_CENTER  + Keyboard.KEYCODE.ONDOWN,
                RIGHT:        Keyboard.KEYCODE.RIGHT       + Keyboard.KEYCODE.ONDOWN,
                NUM_ADD:      Keyboard.KEYCODE.NUM_ADD     + Keyboard.KEYCODE.ONDOWN,
                END:          Keyboard.KEYCODE.END         + Keyboard.KEYCODE.ONDOWN,
                DOWN:         Keyboard.KEYCODE.DOWN        + Keyboard.KEYCODE.ONDOWN,
                PGDN:         Keyboard.KEYCODE.PGDN        + Keyboard.KEYCODE.ONDOWN,
                INS:          Keyboard.KEYCODE.INS         + Keyboard.KEYCODE.ONDOWN,
                DEL:          Keyboard.KEYCODE.DEL         + Keyboard.KEYCODE.ONDOWN,
                CMD:          Keyboard.KEYCODE.CMD         + Keyboard.KEYCODE.ONDOWN,
                RCMD:         Keyboard.KEYCODE.RCMD        + Keyboard.KEYCODE.ONDOWN,
                FF_CMD:       Keyboard.KEYCODE.FF_CMD      + Keyboard.KEYCODE.ONDOWN,
                CTRL_C:       Keyboard.ASCII.CTRL_C        + Keyboard.KEYCODE.FAKE,
                CTRL_BREAK:   Keyboard.KEYCODE.BS          + Keyboard.KEYCODE.FAKE,
                CTRL_ALT_DEL: Keyboard.KEYCODE.DEL         + Keyboard.KEYCODE.FAKE
            };
            
            /*
             * Scan code constants
             */
            Keyboard.SCANCODE = {
                /* 0x01 */ ESC:         1,
                /* 0x02 */ ONE:         2,
                /* 0x03 */ TWO:         3,
                /* 0x04 */ THREE:       4,
                /* 0x05 */ FOUR:        5,
                /* 0x06 */ FIVE:        6,
                /* 0x07 */ SIX:         7,
                /* 0x08 */ SEVEN:       8,
                /* 0x09 */ EIGHT:       9,
                /* 0x0A */ NINE:        10,
                /* 0x0B */ ZERO:        11,
                /* 0x0C */ DASH:        12,
                /* 0x0D */ EQUALS:      13,
                /* 0x0E */ BS:          14,
                /* 0x0F */ TAB:         15,
                /* 0x10 */ Q:           16,
                /* 0x11 */ W:           17,
                /* 0x12 */ E:           18,
                /* 0x13 */ R:           19,
                /* 0x14 */ T:           20,
                /* 0x15 */ Y:           21,
                /* 0x16 */ U:           22,
                /* 0x17 */ I:           23,
                /* 0x18 */ O:           24,
                /* 0x19 */ P:           25,
                /* 0x1A */ LBRACK:      26,
                /* 0x1B */ RBRACK:      27,
                /* 0x1C */ ENTER:       28,
                /* 0x1D */ CTRL:        29,
                /* 0x1E */ A:           30,
                /* 0x1F */ S:           31,
                /* 0x20 */ D:           32,
                /* 0x21 */ F:           33,
                /* 0x22 */ G:           34,
                /* 0x23 */ H:           35,
                /* 0x24 */ J:           36,
                /* 0x25 */ K:           37,
                /* 0x26 */ L:           38,
                /* 0x27 */ SEMI:        39,
                /* 0x28 */ QUOTE:       40,
                /* 0x29 */ BQUOTE:      41,
                /* 0x2A */ SHIFT:       42,
                /* 0x2B */ BSLASH:      43,
                /* 0x2C */ Z:           44,
                /* 0x2D */ X:           45,
                /* 0x2E */ C:           46,
                /* 0x2F */ V:           47,
                /* 0x30 */ B:           48,
                /* 0x31 */ N:           49,
                /* 0x32 */ M:           50,
                /* 0x33 */ COMMA:       51,
                /* 0x34 */ PERIOD:      52,
                /* 0x35 */ SLASH:       53,
                /* 0x36 */ RSHIFT:      54,
                /* 0x37 */ PRTSC:       55,         // unshifted '*'; becomes dedicated 'Print Screen' key on 101-key keyboards
                /* 0x38 */ ALT:         56,
                /* 0x39 */ SPACE:       57,
                /* 0x3A */ CAPS_LOCK:   58,
                /* 0x3B */ F1:          59,
                /* 0x3C */ F2:          60,
                /* 0x3D */ F3:          61,
                /* 0x3E */ F4:          62,
                /* 0x3F */ F5:          63,
                /* 0x40 */ F6:          64,
                /* 0x41 */ F7:          65,
                /* 0x42 */ F8:          66,
                /* 0x43 */ F9:          67,
                /* 0x44 */ F10:         68,
                /* 0x45 */ NUM_LOCK:    69,
                /* 0x46 */ SCROLL_LOCK: 70,
                /* 0x47 */ NUM_HOME:    71,
                /* 0x48 */ NUM_UP:      72,
                /* 0x49 */ NUM_PGUP:    73,
                /* 0x4A */ NUM_SUB:     74,
                /* 0x4B */ NUM_LEFT:    75,
                /* 0x4C */ NUM_CENTER:  76,
                /* 0x4D */ NUM_RIGHT:   77,
                /* 0x4E */ NUM_ADD:     78,
                /* 0x4F */ NUM_END:     79,
                /* 0x50 */ NUM_DOWN:    80,
                /* 0x51 */ NUM_PGDN:    81,
                /* 0x52 */ NUM_INS:     82,
                /* 0x53 */ NUM_DEL:     83,
                /* 0x54 */ SYSREQ:      84,         // 84-key keyboard only (simulated with 'alt'+'prtsc' on 101-key keyboards)
                /* 0x54 */ PAUSE:       84,         // 101-key keyboard only
                /* 0x57 */ F11:         87,
                /* 0x58 */ F12:         88,
                /* 0x5B */ WIN:         91,         // aka CMD
                /* 0x5C */ RWIN:        92,
                /* 0x5D */ MENU:        93,         // aka CMD + ONRIGHT
                /* 0x7F */ MAKE:        127,
                /* 0x80 */ BREAK:       128,
                /* 0xE0 */ EXTEND1:     224,
                /* 0xE1 */ EXTEND2:     225
            };
            
            /**
             * The set of values that a browser may store in the 'location' property of a keyboard event object
             * which we also support.
             *
             * @enum {number}
             */
            Keyboard.LOCATION = {
                LEFT:           1,
                RIGHT:          2,
                NUMPAD:         3
            };
            
            /**
             * These internal "shift key" states are used to indicate BOTH the physical shift-key states (in bitsState)
             * and the simulated shift-key states (in bitsStateSim).  The LOCK keys are problematic in both cases: the
             * browsers give us no way to query the LOCK key states, so we can only infer them, and because they are "soft"
             * locks, the machine's notion of their state is subject to change at any time as well.  Granted, the IBM PC
             * ROM BIOS will store its LOCK states in the ROM BIOS Data Area (@0040:0017), but that's just a BIOS convention.
             *
             * Also, because this is purely for internal use, don't make the mistake of thinking that these bits have any
             * connection to the ROM BIOS bits @0040:0017 (they don't).  We emulate hardware, not ROMs.
             *
             * TODO: Consider taking notice of the ROM BIOS Data Area state anyway, even though I'd rather remain ROM-agnostic;
             * at the very least, it would help us keep our LOCK LEDs in sync with the machine's LOCK states.  However, the LED
             * issue will be largely moot (at least for MODEL_5170 machines) once we add support for PC AT keyboard LED commands.
             *
             * Note that right-hand state bits are equal to the left-hand bits shifted right 1 bit; makes sense, "right"? ;-)
             *
             * @enum {number}
             */
            Keyboard.STATE = {
                RSHIFT:         0x0001,
                SHIFT:          0x0002,
                RCTRL:          0x0004,             // 101-key keyboard only
                CTRL:           0x0008,
                CTRLS:          0x000c,
                RALT:           0x0010,             // 101-key keyboard only
                ALT:            0x0020,
                ALTS:           0x0030,
                RCMD:           0x0040,             // 101-key keyboard only
                CMD:            0x0080,             // 101-key keyboard only
                CMDS:           0x00c0,
                ALL_RIGHT:      0x0055,             // RSHIFT | RCTRL | RALT | RCMD
                ALL_SHIFT:      0x00ff,             // SHIFT | RSHIFT | CTRL | RCTRL | ALT | RALT | CMD | RCMD
                INSERT:         0x0100,             // TODO: Placeholder (we currently have no notion of any "insert" states)
                CAPS_LOCK:      0x0200,
                NUM_LOCK:       0x0400,
                SCROLL_LOCK:    0x0800,
                ALL_LOCKS:      0x0e00              // CAPS_LOCK | NUM_LOCK | SCROLL_LOCK
            };
            
            /**
             * Maps KEYCODES of shift/modifier keys to their corresponding (default) STATES bit above.
             *
             * @enum {number}
             */
            Keyboard.KEYSTATES = {};
            Keyboard.KEYSTATES[Keyboard.SIMCODE.RSHIFT]      = Keyboard.STATE.RSHIFT;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.SHIFT]       = Keyboard.STATE.SHIFT;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.CTRL]        = Keyboard.STATE.CTRL;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.ALT]         = Keyboard.STATE.ALT;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.CMD]         = Keyboard.STATE.CMD;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.RCMD]        = Keyboard.STATE.RCMD;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.FF_CMD]      = Keyboard.STATE.CMD;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.CAPS_LOCK]   = Keyboard.STATE.CAPS_LOCK;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.NUM_LOCK]    = Keyboard.STATE.NUM_LOCK;
            Keyboard.KEYSTATES[Keyboard.SIMCODE.SCROLL_LOCK] = Keyboard.STATE.SCROLL_LOCK;
            
            /**
             * Maps CLICKCODE (string) to SIMCODE (number).
             *
             * @enum {number}
             */
            Keyboard.CLICKCODES = {
                'TAB':          Keyboard.SIMCODE.TAB,
                'ESC':          Keyboard.SIMCODE.ESC,
                'F1':           Keyboard.SIMCODE.F1,
                'F2':           Keyboard.SIMCODE.F2,
                'F3':           Keyboard.SIMCODE.F3,
                'F4':           Keyboard.SIMCODE.F4,
                'F5':           Keyboard.SIMCODE.F5,
                'F6':           Keyboard.SIMCODE.F6,
                'F7':           Keyboard.SIMCODE.F7,
                'F8':           Keyboard.SIMCODE.F8,
                'F9':           Keyboard.SIMCODE.F9,
                'F10':          Keyboard.SIMCODE.F10,
                'LEFT':         Keyboard.SIMCODE.LEFT,      // formerly "left-arrow"
                'UP':           Keyboard.SIMCODE.UP,        // formerly "up-arrow"
                'RIGHT':        Keyboard.SIMCODE.RIGHT,     // formerly "right-arrow"
                'DOWN':         Keyboard.SIMCODE.DOWN,      // formerly "down-arrow"
                /*
                 * These bindings are for convenience (common key combinations that can be bound to a single control)
                 */
                'CTRL_C':       Keyboard.SIMCODE.CTRL_C,
                'CTRL_BREAK':   Keyboard.SIMCODE.CTRL_BREAK,
                'CTRL_ALT_DEL': Keyboard.SIMCODE.CTRL_ALT_DEL
            };
            
            /**
             * Maps SOFTCODE (string) to KEYCODE or SIMCODE (number).
             *
             * We define identifiers for all possible keys, based on their primary (unshifted) character or function.
             * This also serves as a definition of all supported keys, making it possible to create full-featured
             * "soft keyboards".
             *
             * One exception to the (unshifted) rule above is 'prtsc': on the original IBM 83-key and 84-key keyboards,
             * its primary (unshifted) character was '*', but on 101-key keyboards, it became a separate key ('prtsc',
             * now labeled "Print Screen"), as did the num-pad '*' ('num-mul'), so 'prtsc' seems worthy of an exception
             * to the rule.
             *
             * On 83-key and 84-key keyboards, 'ctrl'+'num-lock' triggered a "pause" operation and 'ctrl'+'scroll-lock'
             * triggered a "break" operation.
             *
             * On 101-key keyboards, IBM decided to move both those special operations to a new 'pause' ("Pause/Break")
             * key, near the new dedicated 'prtsc' ("Print Screen/SysRq") key -- and to drop the "e" from "SysReq".
             * Those keys behave as follows:
             *
             *      When 'pause' is pressed alone, it generates 0xe1 0x1d 0x45 0xe1 0x9d 0xc5 on make (nothing on break),
             *      which essentially simulates the make-and-break of the 'ctrl' and 'num-lock' keys (ignoring the 0xe1),
             *      triggering a "pause" operation.
             *
             *      When 'pause' is pressed with 'ctrl', it generates 0xe0 0x46 0xe0 0xc6 on make (nothing on break) and
             *      does not repeat, which essentially simulates the make-and-break of 'scroll-lock', which, in conjunction
             *      with the separate make-and-break of 'ctrl', triggers a "break" operation.
             *
             *      When 'prtsc' is pressed alone, it generates 0xe0 0x2a 0xe0 0x37, simulating the make of both 'shift'
             *      and 'prtsc'; when pressed with 'shift' or 'ctrl', it generates only 0xe0 0x37; and when pressed with
             *      'alt', it generates only 0x54 (to simulate 'sysreq').
             *
             *      TODO: Implement the above behaviors.
             *
             * All key identifiers must be quotable using single-quotes, because that's how components.xsl will encode them
             * *inside* the "data-value" attribute of the corresponding HTML control.  Which, in turn, is why the single-quote
             * key is defined as 'quote' rather than "'".  Similarly, if there was unshifted "double-quote" key, it could
             * not be called '"', because components.xsl quotes the *entire* "data-value" attribute using double-quotes.
             *
             * In the (informal) numbering of keys below, two keys are deliberately numbered 84, reflecting the fact that
             * the 'sysreq' key was added to the 84-key keyboard but then dropped from the 101-key keyboard as a stand-alone key.
             *
             * @enum {number}
             */
            Keyboard.SOFTCODES = {
                /*  1 */    'esc':          Keyboard.SIMCODE.ESC,
                /*  2 */    '1':            Keyboard.ASCII['1'],
                /*  3 */    '2':            Keyboard.ASCII['2'],
                /*  4 */    '3':            Keyboard.ASCII['3'],
                /*  5 */    '4':            Keyboard.ASCII['4'],
                /*  6 */    '5':            Keyboard.ASCII['5'],
                /*  7 */    '6':            Keyboard.ASCII['6'],
                /*  8 */    '7':            Keyboard.ASCII['7'],
                /*  9 */    '8':            Keyboard.ASCII['8'],
                /* 10 */    '9':            Keyboard.ASCII['9'],
                /* 11 */    '0':            Keyboard.ASCII['0'],
                /* 12 */    '-':            Keyboard.ASCII['-'],
                /* 13 */    '=':            Keyboard.ASCII['='],
                /* 14 */    'bs':           Keyboard.SIMCODE.BS,
                /* 15 */    'tab':          Keyboard.SIMCODE.TAB,
                /* 16 */    'q':            Keyboard.ASCII.Q,
                /* 17 */    'w':            Keyboard.ASCII.W,
                /* 18 */    'e':            Keyboard.ASCII.E,
                /* 19 */    'r':            Keyboard.ASCII.R,
                /* 20 */    't':            Keyboard.ASCII.T,
                /* 21 */    'y':            Keyboard.ASCII.Y,
                /* 22 */    'u':            Keyboard.ASCII.U,
                /* 23 */    'i':            Keyboard.ASCII.I,
                /* 24 */    'o':            Keyboard.ASCII.O,
                /* 25 */    'p':            Keyboard.ASCII.P,
                /* 26 */    '[':            Keyboard.ASCII['['],
                /* 27 */    ']':            Keyboard.ASCII[']'],
                /* 28 */    'enter':        Keyboard.KEYCODE.CR,
                /* 29 */    'ctrl':         Keyboard.SIMCODE.CTRL,
                /* 30 */    'a':            Keyboard.ASCII.A,
                /* 31 */    's':            Keyboard.ASCII.S,
                /* 32 */    'd':            Keyboard.ASCII.D,
                /* 33 */    'f':            Keyboard.ASCII.F,
                /* 34 */    'g':            Keyboard.ASCII.G,
                /* 35 */    'h':            Keyboard.ASCII.H,
                /* 36 */    'j':            Keyboard.ASCII.J,
                /* 37 */    'k':            Keyboard.ASCII.K,
                /* 38 */    'l':            Keyboard.ASCII.L,
                /* 39 */    ';':            Keyboard.ASCII[';'],
                /* 40 */    'quote':        Keyboard.ASCII["'"],            // formerly "squote"
                /* 41 */    '`':            Keyboard.ASCII['`'],            // formerly "bquote"
                /* 42 */    'shift':        Keyboard.SIMCODE.SHIFT,         // formerly "lshift"
                /* 43 */    '\\':           Keyboard.ASCII['\\'],           // formerly "bslash"
                /* 44 */    'z':            Keyboard.ASCII.Z,
                /* 45 */    'x':            Keyboard.ASCII.X,
                /* 46 */    'c':            Keyboard.ASCII.C,
                /* 47 */    'v':            Keyboard.ASCII.V,
                /* 48 */    'b':            Keyboard.ASCII.B,
                /* 49 */    'n':            Keyboard.ASCII.N,
                /* 50 */    'm':            Keyboard.ASCII.M,
                /* 51 */    ',':            Keyboard.ASCII[','],
                /* 52 */    '.':            Keyboard.ASCII['.'],
                /* 53 */    '/':            Keyboard.ASCII['/'],
                /* 54 */    'right-shift':  Keyboard.SIMCODE.RSHIFT,        // formerly "rshift"
                /* 55 */    'prtsc':        Keyboard.SIMCODE.PRTSC,         // unshifted '*'; becomes dedicated 'Print Screen' key on 101-key keyboards
                /* 56 */    'alt':          Keyboard.SIMCODE.ALT,
                /* 57 */    'space':        Keyboard.ASCII[' '],
                /* 58 */    'caps-lock':    Keyboard.SIMCODE.CAPS_LOCK,
                /* 59 */    'f1':           Keyboard.SIMCODE.F1,
                /* 60 */    'f2':           Keyboard.SIMCODE.F2,
                /* 61 */    'f3':           Keyboard.SIMCODE.F3,
                /* 62 */    'f4':           Keyboard.SIMCODE.F4,
                /* 63 */    'f5':           Keyboard.SIMCODE.F5,
                /* 64 */    'f6':           Keyboard.SIMCODE.F6,
                /* 65 */    'f7':           Keyboard.SIMCODE.F7,
                /* 66 */    'f8':           Keyboard.SIMCODE.F8,
                /* 67 */    'f9':           Keyboard.SIMCODE.F9,
                /* 68 */    'f10':          Keyboard.SIMCODE.F10,
                /* 69 */    'num-lock':     Keyboard.SIMCODE.NUM_LOCK,
                /* 70 */    'scroll-lock':  Keyboard.SIMCODE.SCROLL_LOCK,   // TODO: 0xe046 on 101-key keyboards?
                /* 71 */    'num-home':     Keyboard.SIMCODE.HOME,          // formerly "home"
                /* 72 */    'num-up':       Keyboard.SIMCODE.UP,            // formerly "up-arrow"
                /* 73 */    'num-pgup':     Keyboard.SIMCODE.PGUP,          // formerly "page-up"
                /* 74 */    'num-sub':      Keyboard.SIMCODE.NUM_SUB,       // formerly "num-minus"
                /* 75 */    'num-left':     Keyboard.SIMCODE.LEFT,          // formerly "left-arrow"
                /* 76 */    'num-center':   Keyboard.SIMCODE.NUM_CENTER,    // formerly "center"
                /* 77 */    'num-right':    Keyboard.SIMCODE.RIGHT,         // formerly "right-arrow"
                /* 78 */    'num-add':      Keyboard.SIMCODE.NUM_ADD,       // formerly "num-plus"
                /* 79 */    'num-end':      Keyboard.SIMCODE.END,           // formerly "end"
                /* 80 */    'num-down':     Keyboard.SIMCODE.DOWN,          // formerly "down-arrow"
                /* 81 */    'num-pgdn':     Keyboard.SIMCODE.PGDN,          // formerly "page-down"
                /* 82 */    'num-ins':      Keyboard.SIMCODE.INS,           // formerly "ins"
                /* 83 */    'num-del':      Keyboard.SIMCODE.DEL            // formerly "del"
            //  /* 84 */    'sysreq':       Keyboard.SCANCODE.SYSREQ,       // 84-key keyboard only (simulated with 'alt'+'prtsc' on 101-key keyboards)
            //  /* 84 */    'pause':        Keyboard.SCANCODE.PAUSE,        // 101-key keyboard only
            //  /* 85 */    'f11':          Keyboard.SCANCODE.F11,
            //  /* 86 */    'f12':          Keyboard.SCANCODE.F12,
            //  /* 87 */    'num-enter':    Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.ENTER << 8),
            //  /* 88 */    'right-ctrl':   Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.CTRL << 8),
            //  /* 89 */    'num-div':      Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.SLASH << 8),
            //  /* 90 */    'num-mul':      Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.PRTSC << 8),
            //  /* 91 */    'right-alt':    Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.ALT << 8),
            //  /* 92 */    'home':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_HOME << 8),
            //  /* 93 */    'up':           Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_UP << 8),
            //  /* 94 */    'pgup':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_PGUP << 8),
            //  /* 95 */    'left':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_LEFT << 8),
            //  /* 96 */    'right':        Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_RIGHT << 8),
            //  /* 97 */    'end':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_END << 8),
            //  /* 98 */    'down':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_DOWN << 8),
            //  /* 99 */    'pgdn':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_PGDN << 8),
            //  /*100 */    'ins':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_INS << 8),
            //  /*101 */    'del':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.NUM_DEL << 8),
            //              'win':          Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.WIN << 8),
            //              'right-win':    Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.RWIN << 8),
            //              'menu':         Keyboard.SCANCODE.EXTEND1 | (Keyboard.SCANCODE.MENU << 8)
            };
            
            /**
             * Maps "soft-key" definitions (above) of shift/modifier keys to their corresponding (default) STATES bit.
             *
             * @enum {number}
             */
            Keyboard.LEDSTATES = {
                'caps-lock':    Keyboard.STATE.CAPS_LOCK,
                'num-lock':     Keyboard.STATE.NUM_LOCK,
                'scroll-lock':  Keyboard.STATE.SCROLL_LOCK
            };
            
            /**
             * Maps SIMCODE (number) to SCANCODE (number(s)).
             *
             * This array is used by keySimulate() to lookup a given SIMCODE and convert it to a SCANCODE
             * (lower byte), plus any required shift key SCANCODES (upper bytes).
             *
             * Using keyCodes from keyPress events proved to be more robust than using keyCodes from keyDown and
             * keyUp events, in part because of differences in the way browsers generate the keyDown and keyUp events.
             * For example, Safari on iOS devices will not generate up/down events for shift keys, and for other keys,
             * the up/down events are usually generated after the actual press is complete, and in rapid succession.
             *
             * The other problem (which is more of a problem with keyboards like the C1P than any IBM keyboards) is
             * that the shift/modifier state for a character on the "source" keyboard may not match the shift/modifier
             * state for the same character on the "target" keyboard.  And since this code is inherited from C1Pjs,
             * we've inherited the same solution: keySimulate() has the ability to "undo" any states in bitsState
             * that conflict with the state(s) required for the character in question.
             *
             * @enum {number}
             */
            Keyboard.SIMCODES = {};
            Keyboard.SIMCODES[Keyboard.SIMCODE.ESC]          = Keyboard.SCANCODE.ESC;
            Keyboard.SIMCODES[Keyboard.ASCII['1']]           = Keyboard.SCANCODE.ONE;
            Keyboard.SIMCODES[Keyboard.ASCII['!']]           = Keyboard.SCANCODE.ONE    | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['2']]           = Keyboard.SCANCODE.TWO;
            Keyboard.SIMCODES[Keyboard.ASCII['@']]           = Keyboard.SCANCODE.TWO    | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['3']]           = Keyboard.SCANCODE.THREE;
            Keyboard.SIMCODES[Keyboard.ASCII['#']]           = Keyboard.SCANCODE.THREE  | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['4']]           = Keyboard.SCANCODE.FOUR;
            Keyboard.SIMCODES[Keyboard.ASCII['$']]           = Keyboard.SCANCODE.FOUR   | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['5']]           = Keyboard.SCANCODE.FIVE;
            Keyboard.SIMCODES[Keyboard.ASCII['%']]           = Keyboard.SCANCODE.FIVE   | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['6']]           = Keyboard.SCANCODE.SIX;
            Keyboard.SIMCODES[Keyboard.ASCII['^']]           = Keyboard.SCANCODE.SIX    | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['7']]           = Keyboard.SCANCODE.SEVEN;
            Keyboard.SIMCODES[Keyboard.ASCII['&']]           = Keyboard.SCANCODE.SEVEN  | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['8']]           = Keyboard.SCANCODE.EIGHT;
            Keyboard.SIMCODES[Keyboard.ASCII['*']]           = Keyboard.SCANCODE.EIGHT  | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['9']]           = Keyboard.SCANCODE.NINE;
            Keyboard.SIMCODES[Keyboard.ASCII['(']]           = Keyboard.SCANCODE.NINE   | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['0']]           = Keyboard.SCANCODE.ZERO;
            Keyboard.SIMCODES[Keyboard.ASCII[')']]           = Keyboard.SCANCODE.ZERO   | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['-']]           = Keyboard.SCANCODE.DASH;
            Keyboard.SIMCODES[Keyboard.ASCII['_']]           = Keyboard.SCANCODE.DASH   | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['=']]           = Keyboard.SCANCODE.EQUALS;
            Keyboard.SIMCODES[Keyboard.ASCII['+']]           = Keyboard.SCANCODE.EQUALS | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.SIMCODE.BS]           = Keyboard.SCANCODE.BS;
            Keyboard.SIMCODES[Keyboard.SIMCODE.TAB]          = Keyboard.SCANCODE.TAB;
            Keyboard.SIMCODES[Keyboard.ASCII.q]              = Keyboard.SCANCODE.Q;
            Keyboard.SIMCODES[Keyboard.ASCII.Q]              = Keyboard.SCANCODE.Q      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.w]              = Keyboard.SCANCODE.W;
            Keyboard.SIMCODES[Keyboard.ASCII.W]              = Keyboard.SCANCODE.W      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.e]              = Keyboard.SCANCODE.E;
            Keyboard.SIMCODES[Keyboard.ASCII.E]              = Keyboard.SCANCODE.E      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.r]              = Keyboard.SCANCODE.R;
            Keyboard.SIMCODES[Keyboard.ASCII.R]              = Keyboard.SCANCODE.R      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.t]              = Keyboard.SCANCODE.T;
            Keyboard.SIMCODES[Keyboard.ASCII.T]              = Keyboard.SCANCODE.T      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.y]              = Keyboard.SCANCODE.Y;
            Keyboard.SIMCODES[Keyboard.ASCII.Y]              = Keyboard.SCANCODE.Y      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.u]              = Keyboard.SCANCODE.U;
            Keyboard.SIMCODES[Keyboard.ASCII.U]              = Keyboard.SCANCODE.U      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.i]              = Keyboard.SCANCODE.I;
            Keyboard.SIMCODES[Keyboard.ASCII.I]              = Keyboard.SCANCODE.I      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.o]              = Keyboard.SCANCODE.O;
            Keyboard.SIMCODES[Keyboard.ASCII.O]              = Keyboard.SCANCODE.O      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.p]              = Keyboard.SCANCODE.P;
            Keyboard.SIMCODES[Keyboard.ASCII.P]              = Keyboard.SCANCODE.P      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['[']]           = Keyboard.SCANCODE.LBRACK;
            Keyboard.SIMCODES[Keyboard.ASCII['{']]           = Keyboard.SCANCODE.LBRACK | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII[']']]           = Keyboard.SCANCODE.RBRACK;
            Keyboard.SIMCODES[Keyboard.ASCII['}']]           = Keyboard.SCANCODE.RBRACK | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.KEYCODE.CR]           = Keyboard.SCANCODE.ENTER;
            Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL]         = Keyboard.SCANCODE.CTRL;
            Keyboard.SIMCODES[Keyboard.ASCII.a]              = Keyboard.SCANCODE.A;
            Keyboard.SIMCODES[Keyboard.ASCII.A]              = Keyboard.SCANCODE.A      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.s]              = Keyboard.SCANCODE.S;
            Keyboard.SIMCODES[Keyboard.ASCII.S]              = Keyboard.SCANCODE.S      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.d]              = Keyboard.SCANCODE.D;
            Keyboard.SIMCODES[Keyboard.ASCII.D]              = Keyboard.SCANCODE.D      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.f]              = Keyboard.SCANCODE.F;
            Keyboard.SIMCODES[Keyboard.ASCII.F]              = Keyboard.SCANCODE.F      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.g]              = Keyboard.SCANCODE.G;
            Keyboard.SIMCODES[Keyboard.ASCII.G]              = Keyboard.SCANCODE.G      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.h]              = Keyboard.SCANCODE.H;
            Keyboard.SIMCODES[Keyboard.ASCII.H]              = Keyboard.SCANCODE.H      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.j]              = Keyboard.SCANCODE.J;
            Keyboard.SIMCODES[Keyboard.ASCII.J]              = Keyboard.SCANCODE.J      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.k]              = Keyboard.SCANCODE.K;
            Keyboard.SIMCODES[Keyboard.ASCII.K]              = Keyboard.SCANCODE.K      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.l]              = Keyboard.SCANCODE.L;
            Keyboard.SIMCODES[Keyboard.ASCII.L]              = Keyboard.SCANCODE.L      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII[';']]           = Keyboard.SCANCODE.SEMI;
            Keyboard.SIMCODES[Keyboard.ASCII[':']]           = Keyboard.SCANCODE.SEMI   | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII["'"]]           = Keyboard.SCANCODE.QUOTE;
            Keyboard.SIMCODES[Keyboard.ASCII['"']]           = Keyboard.SCANCODE.QUOTE  | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['`']]           = Keyboard.SCANCODE.BQUOTE;
            Keyboard.SIMCODES[Keyboard.ASCII['~']]           = Keyboard.SCANCODE.BQUOTE | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.SIMCODE.SHIFT]        = Keyboard.SCANCODE.SHIFT;
            Keyboard.SIMCODES[Keyboard.ASCII['\\']]          = Keyboard.SCANCODE.BSLASH;
            Keyboard.SIMCODES[Keyboard.ASCII['|']]           = Keyboard.SCANCODE.BSLASH | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.z]              = Keyboard.SCANCODE.Z;
            Keyboard.SIMCODES[Keyboard.ASCII.Z]              = Keyboard.SCANCODE.Z      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.x]              = Keyboard.SCANCODE.X;
            Keyboard.SIMCODES[Keyboard.ASCII.X]              = Keyboard.SCANCODE.X      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.c]              = Keyboard.SCANCODE.C;
            Keyboard.SIMCODES[Keyboard.ASCII.C]              = Keyboard.SCANCODE.C      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.v]              = Keyboard.SCANCODE.V;
            Keyboard.SIMCODES[Keyboard.ASCII.V]              = Keyboard.SCANCODE.V      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.b]              = Keyboard.SCANCODE.B;
            Keyboard.SIMCODES[Keyboard.ASCII.B]              = Keyboard.SCANCODE.B      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.n]              = Keyboard.SCANCODE.N;
            Keyboard.SIMCODES[Keyboard.ASCII.N]              = Keyboard.SCANCODE.N      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII.m]              = Keyboard.SCANCODE.M;
            Keyboard.SIMCODES[Keyboard.ASCII.M]              = Keyboard.SCANCODE.M      | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII[',']]           = Keyboard.SCANCODE.COMMA;
            Keyboard.SIMCODES[Keyboard.ASCII['<']]           = Keyboard.SCANCODE.COMMA  | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['.']]           = Keyboard.SCANCODE.PERIOD;
            Keyboard.SIMCODES[Keyboard.ASCII['>']]           = Keyboard.SCANCODE.PERIOD | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.ASCII['/']]           = Keyboard.SCANCODE.SLASH;
            Keyboard.SIMCODES[Keyboard.ASCII['?']]           = Keyboard.SCANCODE.SLASH  | (Keyboard.SCANCODE.SHIFT << 8);
            Keyboard.SIMCODES[Keyboard.SIMCODE.RSHIFT]       = Keyboard.SCANCODE.RSHIFT;
            Keyboard.SIMCODES[Keyboard.SIMCODE.PRTSC]        = Keyboard.SCANCODE.PRTSC;
            Keyboard.SIMCODES[Keyboard.SIMCODE.ALT]          = Keyboard.SCANCODE.ALT;
            Keyboard.SIMCODES[Keyboard.ASCII[' ']]           = Keyboard.SCANCODE.SPACE;
            Keyboard.SIMCODES[Keyboard.SIMCODE.CAPS_LOCK]    = Keyboard.SCANCODE.CAPS_LOCK;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F1]           = Keyboard.SCANCODE.F1;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F2]           = Keyboard.SCANCODE.F2;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F3]           = Keyboard.SCANCODE.F3;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F4]           = Keyboard.SCANCODE.F4;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F5]           = Keyboard.SCANCODE.F5;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F6]           = Keyboard.SCANCODE.F6;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F7]           = Keyboard.SCANCODE.F7;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F8]           = Keyboard.SCANCODE.F8;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F9]           = Keyboard.SCANCODE.F9;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F10]          = Keyboard.SCANCODE.F10;
            Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_LOCK]     = Keyboard.SCANCODE.NUM_LOCK;
            Keyboard.SIMCODES[Keyboard.SIMCODE.SCROLL_LOCK]  = Keyboard.SCANCODE.SCROLL_LOCK;
            Keyboard.SIMCODES[Keyboard.SIMCODE.HOME]         = Keyboard.SCANCODE.NUM_HOME;
            Keyboard.SIMCODES[Keyboard.SIMCODE.UP]           = Keyboard.SCANCODE.NUM_UP;
            Keyboard.SIMCODES[Keyboard.SIMCODE.PGUP]         = Keyboard.SCANCODE.NUM_PGUP;
            Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_SUB]      = Keyboard.SCANCODE.NUM_SUB;
            Keyboard.SIMCODES[Keyboard.SIMCODE.LEFT]         = Keyboard.SCANCODE.NUM_LEFT;
            Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_CENTER]   = Keyboard.SCANCODE.NUM_CENTER;
            Keyboard.SIMCODES[Keyboard.SIMCODE.RIGHT]        = Keyboard.SCANCODE.NUM_RIGHT;
            Keyboard.SIMCODES[Keyboard.SIMCODE.NUM_ADD]      = Keyboard.SCANCODE.NUM_ADD;
            Keyboard.SIMCODES[Keyboard.SIMCODE.END]          = Keyboard.SCANCODE.NUM_END;
            Keyboard.SIMCODES[Keyboard.SIMCODE.DOWN]         = Keyboard.SCANCODE.NUM_DOWN;
            Keyboard.SIMCODES[Keyboard.SIMCODE.PGDN]         = Keyboard.SCANCODE.NUM_PGDN;
            Keyboard.SIMCODES[Keyboard.SIMCODE.INS]          = Keyboard.SCANCODE.NUM_INS;
            Keyboard.SIMCODES[Keyboard.SIMCODE.DEL]          = Keyboard.SCANCODE.NUM_DEL;
            /*
             * Entries beyond this point are for keys that existed only on 101-key keyboards (well, except for 'sysreq',
             * which also existed on the 84-key keyboard), which ALSO means that these keys essentially did not exist
             * for a MODEL_5150 or MODEL_5160 machine, because those machines could use only 83-key keyboards.  Remember
             * that IBM machines and IBM keyboards are our reference point here, so while there were undoubtedly 5150/5160
             * clones that could use newer keyboards, as well as 3rd-party keyboards that could work with older machines,
             * support for non-IBM configurations is left for another day.
             *
             * TODO: The only relevance of newer keyboards to older machines is the fact that you're probably using a newer
             * keyboard with your browser, which raises the question of what to do with newer keys that older machines
             * wouldn't understand.  I don't attempt to filter out any of the entries below based on machine model, but that
             * would seem like a wise thing to do.
             *
             * TODO: Add entries for 'num-mul', 'num-div', 'num-enter', the stand-alone arrow keys, etc, AND at the same time,
             * make sure that keys with multi-byte sequences (eg, 0xe0 0x1c) work properly.
             */
            Keyboard.SIMCODES[Keyboard.SIMCODE.F11]          = Keyboard.SCANCODE.F11;
            Keyboard.SIMCODES[Keyboard.SIMCODE.F12]          = Keyboard.SCANCODE.F12;
            Keyboard.SIMCODES[Keyboard.SIMCODE.CMD]          = Keyboard.SCANCODE.WIN;
            Keyboard.SIMCODES[Keyboard.SIMCODE.RCMD]         = Keyboard.SCANCODE.MENU;
            Keyboard.SIMCODES[Keyboard.SIMCODE.FF_CMD]       = Keyboard.SCANCODE.WIN;
            
            Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_C]       = Keyboard.SCANCODE.C           | (Keyboard.SCANCODE.CTRL << 8);
            Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_BREAK]   = Keyboard.SCANCODE.SCROLL_LOCK | (Keyboard.SCANCODE.CTRL << 8);
            Keyboard.SIMCODES[Keyboard.SIMCODE.CTRL_ALT_DEL] = Keyboard.SCANCODE.NUM_DEL     | (Keyboard.SCANCODE.CTRL << 8) | (Keyboard.SCANCODE.ALT << 16);
            
            /**
             * Commands that can be sent to the Keyboard via the 8042; see sendCmd()
             *
             * @enum {number}
             */
            Keyboard.CMD = {
                RESET:      0xFF,
                RESEND:     0xFE,
                DEF_ON:     0xF6,
                DEF_OFF:    0xF5,
                ENABLE:     0xF4,
                SET_RATE:   0xF3,
                ECHO:       0xEE,
                SET_LEDS:   0xED
            };
            
            /**
             * Command responses returned to the Keyboard via the 8042; see sendCmd()
             *
             * @enum {number}
             */
            Keyboard.CMDRES = {
                OVERRUN:    0x00,
                LOAD_TEST:  0x65,   // undocumented "LOAD MANUFACTURING TEST REQUEST" response code
                BAT_OK:     0xAA,   // Basic Assurance Test (BAT) succeeded
                ECHO:       0xEE,
                BREAK_PREF: 0xF0,   // break prefix
                ACK:        0xFA,
                BAT_FAIL:   0xFC,   // Basic Assurance Test (BAT) failed
                DIAG_FAIL:  0xFD,
                RESEND:     0xFE,
                BUFF_FULL:  0xFF    // TODO: Verify this response code (is it just for older 83-key keyboards?)
            };
            
            Keyboard.LIMIT = {
                MAX_SCANCODES: 20   // TODO: Verify this limit for newer keyboards (84-key and up)
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {Keyboard}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "esc")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            Keyboard.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                /*
                 * There's a special binding that the Video component uses ("kbd") to effectively bind its
                 * screen to the entire keyboard, in Video.powerUp(); ie:
                 *
                 *      video.kbd.setBinding("canvas", "kbd", video.canvasScreen);
                 * or:
                 *      video.kbd.setBinding("textarea", "kbd", video.textareaScreen);
                 *
                 * However, it's also possible for the keyboard XML definition to define a control that serves
                 * a similar purpose; eg:
                 *
                 *      <control type="text" binding="kbd" width="2em">Kbd</control>
                 *
                 * The latter is purely experimental, while we work on finding ways to trigger the soft keyboard on
                 * certain pesky devices (like the Kindle Fire).  Note that even if you use the latter, the former will
                 * still be enabled (there's currently no way to configure the Video component to not bind its screen,
                 * but we could certainly add one if the need ever arose).
                 */
                var kbd = this;
                var id = sHTMLType + '-' + sBinding;
            
                if (this.bindings[id] === undefined) {
                    switch (sBinding) {
                    case "kbd":
                        /*
                         * Recording the binding ID prevents multiple controls (or components) from attempting to erroneously
                         * bind a control to the same ID, but in the case of a "dual display" configuration, we actually want
                         * to allow BOTH video components to call setBinding() for "kbd", so that it doesn't matter which
                         * display the user gives focus to.
                         *
                         *      this.bindings[id] = control;
                         */
                        control.onkeydown = function onKeyDown(event) {
                            return kbd.onKeyDown(event, true);
                        };
                        control.onkeypress = function onKeyPressKbd(event) {
                            return kbd.onKeyPress(event);
                        };
                        control.onkeyup = function onKeyUp(event) {
                            return kbd.onKeyDown(event, false);
                        };
                        return true;
            
                    case "caps-lock":
                        this.bindings[id] = control;
                        control.onclick = function onClickCapsLock(event) {
                            if (kbd.cpu) kbd.cpu.setFocus();
                            return kbd.toggleCapsLock();
                        };
                        return true;
            
                    case "num-lock":
                        this.bindings[id] = control;
                        control.onclick = function onClickNumLock(event) {
                            if (kbd.cpu) kbd.cpu.setFocus();
                            return kbd.toggleNumLock();
                        };
                        return true;
            
                    case "scroll-lock":
                        this.bindings[id] = control;
                        control.onclick = function onClickScrollLock(event) {
                            if (kbd.cpu) kbd.cpu.setFocus();
                            return kbd.toggleScrollLock();
                        };
                        return true;
            
                    default:
                        /*
                         * Maintain support for older button codes; eg, map button code "ctrl-c" to CLICKCODE "CTRL_C"
                         */
                        var sCode = sBinding.toUpperCase().replace(/-/g, '_');
                        if (Keyboard.CLICKCODES[sCode] !== undefined && sHTMLType == "button") {
                            this.bindings[id] = control;
                            control.onclick = function(kbd, sKey, simCode) {
                                return function onClickKeyboard(event) {
                                    if (!COMPILED && kbd.messageEnabled()) kbd.printMessage(sKey + " clicked", Messages.KEYS);
                                    if (kbd.cpu) kbd.cpu.setFocus();
                                    kbd.updateShiftState(simCode, true);    // future-proofing if/when any LOCK keys are added to CLICKCODES
                                    kbd.addActiveKey(simCode, true);
                                };
                            }(this, sCode, Keyboard.CLICKCODES[sCode]);
                            return true;
                        } else if (Keyboard.SOFTCODES[sBinding] !== undefined) {
                            this.cSoftCodes++;
                            this.bindings[id] = control;
                            var fnDown = function(kbd, sKey, simCode) {
                                return function onMouseOrTouchDownKeyboard(event) {
                                    kbd.addActiveKey(simCode);
                                };
                            }(this, sBinding, Keyboard.SOFTCODES[sBinding]);
                            var fnUp = function (kbd, sKey, simCode) {
                                return function onMouseOrTouchUpKeyboard(event) {
                                    kbd.removeActiveKey(simCode);
                                };
                            }(this, sBinding, Keyboard.SOFTCODES[sBinding]);
                            if ('ontouchstart' in window) {
                                control.ontouchstart = fnDown;
                                control.ontouchend = fnUp;
                            } else {
                                control.onmousedown = fnDown;
                                control.onmouseup = control.onmouseout = fnUp;
                            }
                            return true;
                        }
                        break;
                    }
                }
                return false;
            };
            
            /**
             * findBinding(simCode, sType, fDown)
             *
             * TODO: This function is woefully inefficient, because the SOFTCODES table is designed for converting
             * soft key presses into SIMCODES, whereas this function is doing the reverse: looking for the soft key,
             * if any, that corresponds to a SIMCODE, simply so we can provide visual feedback of keys activated
             * by other means (eg, real keyboard events, button clicks that generate key sequences like CTRL_ALT_DEL,
             * etc).
             *
             * To minimize this function's cost, we would want to dynamically create a reverse-lookup table after
             * all the setBinding() calls for the soft keys have been established; note that the reverse-lookup table
             * would contain MORE entries than the SOFTCODES table, because there are multiple simCodes that correspond
             * to a given soft key (eg, '1' and '!' both map to the same soft key).
             *
             * @this {Keyboard}
             * @param {number} simCode
             * @param {string} sType is the type of control (eg, "button" or "key")
             * @param {boolean} [fDown] is true if the key is going down, false if up, or undefined if unchanged
             * @return {Object} is the HTML control DOM object (eg, HTMLButtonElement), or undefined if no such control exists
             */
            Keyboard.prototype.findBinding = function(simCode, sType, fDown)
            {
                var control;
                if (this.cSoftCodes) {
                    for (var code in Keyboard.SHIFTED_KEYCODES) {
                        if (simCode == Keyboard.SHIFTED_KEYCODES[code]) {
                            simCode = +code;
                            code = Keyboard.STUPID_KEYCODES[code];
                            if (code) simCode = code;
                            break;
                        }
                    }
                    for (var sBinding in Keyboard.SOFTCODES) {
                        if (Keyboard.SOFTCODES[sBinding] == simCode || Keyboard.SOFTCODES[sBinding] == this.toUpperKey(simCode)) {
                            var id = sType + '-' + sBinding;
                            control = this.bindings[id];
                            if (control && fDown !== undefined) {
                                this.setSoftKeyState(control, fDown);
                            }
                            break;
                        }
                    }
                }
                return control;
            };
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {Keyboard}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            Keyboard.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.chipset = cmp.getComponentByType("ChipSet");
            };
            
            /**
             * notifyEscape(fDisabled, fAllDown)
             *
             * When ESC is used by the browser to disable pointer lock, this gives us the option of mapping a different key to ESC.
             *
             * @this {Keyboard}
             * @param {boolean} fDisabled
             * @param {boolean} [fAllDown] (an experimental option to re-enable processing of all onkeydown/onkeyup events)
             */
            Keyboard.prototype.notifyEscape = function(fDisabled, fAllDown)
            {
                this.fEscapeDisabled = fDisabled;
                if (fAllDown !== undefined) this.fAllDown = fAllDown;
            };
            
            /**
             * setModel(nModel)
             *
             * @this {Keyboard}
             * @param {number} nModel
             */
            Keyboard.prototype.setModel = function(nModel)
            {
            };
            
            /**
             * resetDevice(fNotify)
             *
             * @this {Keyboard}
             * @param {boolean} [fNotify]
             */
            Keyboard.prototype.resetDevice = function(fNotify)
            {
                /*
                 * TODO: There's more to reset, like LED indicators, default type rate, and emptying the scan code buffer.
                 */
                this.printMessage("keyboard reset", Messages.KEYBOARD | Messages.PORT);
                this.abBuffer = [Keyboard.CMDRES.BAT_OK];
                this.fAdvance = true;
                if (fNotify && this.chipset) this.chipset.notifyKbdData(this.abBuffer[0]);
            };
            
            /**
             * setEnabled(fData, fClock)
             *
             * This is the ChipSet's primary interface for toggling keyboard "data" and "clock" lines.
             * For MODEL_5150 and MODEL_5160 machines, this function is called from the ChipSet's PPI_B
             * output handler.  For MODEL_5170 machines, this function is called when selected CMD
             * "data bytes" have been written.
             *
             * @this {Keyboard}
             * @param {boolean} fData is true if the keyboard simulated data line should be enabled
             * @param {boolean} fClock is true if the keyboard's simulated clock line should be enabled
             * @return {boolean} true if keyboard was re-enabled, false if not (or no change)
             */
            Keyboard.prototype.setEnabled = function(fData, fClock)
            {
                var fReset = false;
                if (this.fClock !== fClock) {
                    if (!COMPILED && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                        this.printMessage("keyboard clock line changing to " + fClock, true);
                    }
                    /*
                     * Toggling the clock line low and then high signals a "reset", which we acknowledge once the
                     * data line is high as well.
                     */
                    this.fClock = this.fResetOnEnable = fClock;
                    /*
                     * Allow the next buffered scan code, if any, to advance.
                     */
                    if (fClock) this.fAdvance = true;
                }
                if (this.fData !== fData) {
                    if (!COMPILED && this.messageEnabled(Messages.KEYBOARD | Messages.PORT)) {
                        this.printMessage("keyboard data line changing to " + fData, true);
                    }
                    this.fData = fData;
                    /*
                     * TODO: Review this code; it was added during the early days of MODEL_5150 testing and may not be
                     * *exactly* what's called for here.
                     */
                    if (fData && !this.fResetOnEnable) {
                        this.shiftScanCode(true);
                    }
                }
                if (this.fData && this.fResetOnEnable) {
                    this.resetDevice(true);
                    this.fResetOnEnable = false;
                    fReset = true;
                }
                return fReset;
            };
            
            /**
             * sendCmd(bCmd)
             *
             * This is the ChipSet's primary interface for controlling "Model M" keyboards (ie, those used
             * with MODEL_5170 machines).  Commands are delivered through the ChipSet's 8042 Keyboard Controller.
             *
             * @this {Keyboard}
             * @param {number} bCmd should be one of the Keyboard.CMD.* command codes (Model M keyboards only)
             * @return {number} response should be one of the Keyboard.CMDRES.* response codes, or -1 if unrecognized
             */
            Keyboard.prototype.sendCmd = function(bCmd)
            {
                var b = -1;
                switch(bCmd) {
                case Keyboard.CMD.RESET:
                    b = Keyboard.CMDRES.ACK;
                    this.resetDevice();
                    break;
                default:
                    break;
                }
                return b;
            };
            
            /**
             * checkScanCode()
             *
             * This is the ChipSet's interface for checking data availability.
             *
             * Note that even if we have data, we don't provide it unless fAdvance is set as well.
             * This ensures that we wait until the ROM to disable and re-enable the controller before
             * making more data available.
             *
             * @this {Keyboard}
             * @return {number} next scan code, or 0 if none
             */
            Keyboard.prototype.checkScanCode = function()
            {
                var b = 0;
                if (this.abBuffer.length && this.fAdvance) {
                    b = this.abBuffer[0];
                    if (this.chipset) this.chipset.notifyKbdData(b);
                }
                if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(b) + " available");
                return b;
            };
            
            /**
             * readScanCode()
             *
             * This is the ChipSet's interface for reading scan codes.
             *
             * @this {Keyboard}
             * @return {number} next scan code, or 0 if none
             */
            Keyboard.prototype.readScanCode = function()
            {
                var b = 0;
                if (this.abBuffer.length) {
                    b = this.abBuffer[0];
                }
                if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(b) + " delivered");
                return b;
            };
            
            /**
             * flushScanCode()
             *
             * This is the ChipSet's interface to flush scan codes.
             *
             * @this {Keyboard}
             */
            Keyboard.prototype.flushScanCode = function()
            {
                this.abBuffer = [];
                if (this.messageEnabled()) this.printMessage("scan codes flushed");
            };
            
            /**
             * shiftScanCode(fNotify)
             *
             * This is the ChipSet's interface to advance scan codes.
             *
             * @this {Keyboard}
             * @param {boolean} [fNotify] is true to notify ChipSet if more data is available.
             */
            Keyboard.prototype.shiftScanCode = function(fNotify)
            {
                if (this.abBuffer.length > 0) {
                    /*
                     * The keyboard interrupt service routine toggles the enable bit after reading a scan code, so
                     * presumably this is the proper point at which to shift the last scan code out, and then assert
                     * another interrupt if more scan codes exist.
                     */
                    this.abBuffer.shift();
                    this.fAdvance = fNotify;
                    if (fNotify) {
                        if (!this.abBuffer.length || !this.chipset) {
                            fNotify = false;
                        } else {
                            this.chipset.notifyKbdData(this.abBuffer[0]);
                        }
                    }
                    if (this.messageEnabled()) this.printMessage("scan codes shifted, notify " + (fNotify? "true" : "false"));
                }
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {Keyboard}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            Keyboard.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    /*
                     * TODO: Save/restore support for Keyboard is the barest minimum.  In fact, originally, I wasn't
                     * saving/restoring anything, and that was OK, but if we don't at least re-initialize fClock/fData,
                     * we can get a spurious reset following a restore.  In an ideal world, we might choose to save/restore
                     * abBuffer as well, but realistically, I think it's going to be safer to always start with an
                     * empty buffer--and who's going to notice anyway?
                     *
                     * So, like Debugger, we deviate from the typical save/restore pattern: instead of reset OR restore,
                     * we always reset and then perform a (very limited) restore.
                     */
                    this.reset();
                    if (data && this.restore) {
                        if (!this.restore(data)) return false;
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {Keyboard}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            Keyboard.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save? this.save() : true;
            };
            
            /**
             * reset()
             *
             * @this {Keyboard}
             */
            Keyboard.prototype.reset = function()
            {
                this.setModel(this.nDefaultModel);
            
                this.initState();
            
                /*
                 * The current (assumed) physical (and simulated) states of the various shift/lock keys.
                 *
                 * TODO: Determine how (or whether) we can query the browser's initial shift/lock key states.
                 */
                this.bitsState = this.bitsStateSim = 0;
            
                /*
                 * New scan codes are "pushed" onto abBuffer and then "shifted" off.
                 */
                this.abBuffer = [];
                this.fAdvance = true;
            
                this.prevCharDown = 0;
                this.prevKeyDown = 0;
            
                /*
                 * Make sure the auto-injection buffer is empty (an injection could have been in progress on any reset after the first).
                 */
                this.sInjectBuffer = "";
            };
            
            /**
             * save()
             *
             * This implements save support for the Keyboard component.
             *
             * @this {Keyboard}
             * @return {Object}
             */
            Keyboard.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, this.saveState());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the Keyboard component.
             *
             * @this {Keyboard}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             */
            Keyboard.prototype.restore = function(data)
            {
                return this.initState(data[0]);
            };
            
            /**
             * initState(data)
             *
             * @this {Keyboard}
             * @param {Array} [data]
             * @return {boolean} true if successful, false if failure
             */
            Keyboard.prototype.initState = function(data)
            {
                var i = 0;
                if (data === undefined) data = [];
                this.fClock = this.fAdvance = data[i++];
                this.fData = data[i];
                return true;
            };
            
            /**
             * saveState()
             *
             * @this {Keyboard}
             * @return {Array}
             */
            Keyboard.prototype.saveState = function()
            {
                var i = 0;
                var data = [];
                data[i++] = this.fClock;
                data[i] = this.fData;
                return data;
            };
            
            /**
             * setSoftKeyState(control, f)
             *
             * @this {Keyboard}
             * @param {Object} control is an HTML control DOM object
             * @param {boolean} f is true if the key represented by e should be "on", false if "off"
             */
            Keyboard.prototype.setSoftKeyState = function(control, f)
            {
                control.style.color = (f? "#ffffff" : "#000000");
                control.style.backgroundColor = (f? "#000000" : "#ffffff");
            };
            
            /**
             * addScanCode(bScan)
             *
             * @this {Keyboard}
             * @param {number} bScan
             */
            Keyboard.prototype.addScanCode = function(bScan)
            {
                /*
                 * Prepare for the possibility that our reset() function may not have been called yet.
                 *
                 * TODO: Determine whether we need to reset() the Keyboard sooner (ie, in the constructor),
                 * or if we need to protect other methods from prematurely accessing certain Keyboard structures,
                 * as a result of calls from any of the key event handlers established by setBinding().
                 */
                if (this.abBuffer) {
                    if (this.abBuffer.length < Keyboard.LIMIT.MAX_SCANCODES) {
                        if (this.messageEnabled()) this.printMessage("scan code " + str.toHexByte(bScan) + " buffered");
                        this.abBuffer.push(bScan);
                        if (this.abBuffer.length == 1) {
                            if (this.chipset) this.chipset.notifyKbdData(bScan);
                        }
                        return;
                    }
                    if (this.abBuffer.length == Keyboard.LIMIT.MAX_SCANCODES) {
                        this.abBuffer.push(Keyboard.CMDRES.BUFF_FULL);
                    }
                    this.printMessage("scan code buffer overflow");
                }
            };
            
            /**
             * injectKeys(sKeyCodes, msDelay)
             *
             * @this {Keyboard}
             * @param {string} sKeyCodes
             * @param {number|undefined} [msDelay] is an optional injection delay (default is msInjectDelay)
             */
            Keyboard.prototype.injectKeys = function(sKeyCodes, msDelay)
            {
                this.sInjectBuffer = sKeyCodes;
                if (!COMPILED) this.log("injectKeys(" + this.sInjectBuffer.split("\n").join("\\n") + ")");
                this.injectKeysFromBuffer(msDelay || this.msInjectDelay);
            };
            
            /**
             * injectKeysFromBuffer(msDelay)
             *
             * @this {Keyboard}
             * @param {number} msDelay is the delay between injected keys
             */
            Keyboard.prototype.injectKeysFromBuffer = function(msDelay)
            {
                if (this.sInjectBuffer.length > 0) {
                    var ch = this.sInjectBuffer.charCodeAt(0);
                    /*
                     * I could require all callers to supply CRs instead of LFs, but this is friendlier.
                     */
                    if (ch == 0x0a) ch = 0x0d;
            
                    this.sInjectBuffer = this.sInjectBuffer.substr(1);
                    this.addActiveKey(ch, true);
                }
                if (this.sInjectBuffer.length > 0) {
                    setTimeout(function (kbd) {
                        return function onInjectKeyTimeout() {
                            kbd.injectKeysFromBuffer(msDelay);
                        };
                    }(this), msDelay);
                }
            };
            
            /**
             * setLED(control, f)
             *
             * @this {Keyboard}
             * @param {Object} control is an HTML control DOM object
             * @param {boolean} f is true if the LED represented by control should be "on", false if "off"
             */
            Keyboard.prototype.setLED = function(control, f)
            {
                control.style.backgroundColor = (f? "#00ff00" : "#000000");
            };
            
            /**
             * updateLEDs(bitState)
             *
             * Updates any and all shift-related LEDs with the corresponding state in bitsStateSim.
             *
             * @this {Keyboard}
             * @param {number} [bitState] is the bit in bitsStateSim that may have changed, if known; undefined if not
             */
            Keyboard.prototype.updateLEDs = function(bitState)
            {
                var control;
                for (var sBinding in Keyboard.LEDSTATES) {
                    var id = "led-" + sBinding;
                    var bitLED = Keyboard.LEDSTATES[sBinding];
                    if ((!bitState || bitState == bitLED) && (control = this.bindings[id])) {
                        this.setLED(control, !!(this.bitsStateSim & bitLED));
                    }
                }
            };
            
            /**
             * toggleCapsLock()
             *
             * @this {Keyboard}
             */
            Keyboard.prototype.toggleCapsLock = function()
            {
                this.addActiveKey(Keyboard.SIMCODE.CAPS_LOCK, true);
            };
            
            /**
             * toggleNumLock()
             *
             * @this {Keyboard}
             */
            Keyboard.prototype.toggleNumLock = function()
            {
                this.addActiveKey(Keyboard.SIMCODE.NUM_LOCK, true);
            };
            
            /**
             * toggleScrollLock()
             *
             * @this {Keyboard}
             */
            Keyboard.prototype.toggleScrollLock = function()
            {
                this.addActiveKey(Keyboard.SIMCODE.SCROLL_LOCK, true);
            };
            
            /**
             * updateShiftState(simCode, fSim, fDown)
             *
             * For non-locking shift keys, this function is straightforward: when fDown is true, the corresponding bitState
             * is set, and when fDown is false, it's cleared.  However, for LOCK keys, fDown true means toggle, and fDown false
             * means no change.
             *
             * @this {Keyboard}
             * @param {number} simCode (includes any ONDOWN and/or ONRIGHT modifiers)
             * @param {boolean} [fSim] is true to update simulated state only
             * @param {boolean|null} [fDown] is true for down, false for up, undefined for toggle
             * @return {boolean} true if simCode was a shift key, false if not
             */
            Keyboard.prototype.updateShiftState = function(simCode, fSim, fDown)
            {
                if (Keyboard.SIMCODES[simCode]) {
                    var fRight = (Math.floor(simCode / 1000) & 2);
                    var bitState = Keyboard.KEYSTATES[simCode] || 0;
                    if (bitState) {
                        if (fRight && !(bitState & Keyboard.STATE.ALL_RIGHT)) {
                            bitState >>= 1;
                        }
                        if (bitState & Keyboard.STATE.ALL_LOCKS) {
                            if (fDown === false) return true;
                            fDown = null;
                        }
                        if (fDown == null) {        // ie, null or undefined
                            fDown = !((fSim? this.bitsStateSim : this.bitsState) & bitState);
                        }
                        else if (!fDown) {
                            /*
                             * In current webkit browsers, pressing and then releasing both left and right shift keys together
                             * (or both alt keys, or both cmd/windows keys, or presumably both ctrl keys) results in 4 events, as
                             * you would expect, but 3 of the 4 are "down" events; only the last of the 4 is an "up" event.
                             *
                             * Perhaps this is a browser accessibility feature (ie, deliberately suppressing the "up" event
                             * of one of the shift keys to implement a "sticky shift mode"?), but in any case, to maintain our
                             * internal consistency, if this is an "up" event and the shift state bit is any of ALL_SHIFT, then
                             * we set it to ALL_SHIFT, so that we'll automatically clear ALL shift states.
                             *
                             * TODO: The only downside to this work-around is that the simulation will still think a shift key is
                             * down.  So in effect, we have enabled a "sticky shift mode" inside the simulation, whether or not that
                             * was the browser's intent.  To fix that, we would have to identify the shift key that never went up
                             * and simulate the "up".  That's more work than I think the problem merits.  The user just needs to tap
                             * a single shift key to get out that mode.
                             */
                            if (bitState & Keyboard.STATE.ALL_SHIFT) bitState = Keyboard.STATE.ALL_SHIFT;
                        }
                        if (!fSim) {
                            this.bitsState &= ~bitState;
                            if (fDown) this.bitsState |= bitState;
                        } else {
                            this.bitsStateSim &= ~bitState;
                            if (fDown) this.bitsStateSim |= bitState;
                            this.updateLEDs(bitState);
                        }
                        return true;
                    }
                }
                return false;
            };
            
            /**
             * addActiveKey(simCode, fPress)
             *
             * @this {Keyboard}
             * @param {number} simCode
             * @param {boolean} [fPress]
             */
            Keyboard.prototype.addActiveKey = function(simCode, fPress)
            {
                if (!Keyboard.SIMCODES[simCode]) {
                    if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                        this.printMessage("addActiveKey(" + simCode + "," + (fPress? "press" : "down") + "): unrecognized", true);
                    }
                    return;
                }
            
                /*
                 * Ignore all active keys if the CPU is not running.
                 */
                if (!this.cpu || !this.cpu.isRunning()) return;
            
                /*
                 * If this simCode is in the KEYSTATE table, then stop all repeating.
                 */
                if (Keyboard.KEYSTATES[simCode] && this.aKeysActive.length) {
                    if (this.aKeysActive[0].nRepeat > 0) this.aKeysActive[0].nRepeat = 0;
                }
            
                var key;
                for (var i = 0; i < this.aKeysActive.length; i++) {
                    key = this.aKeysActive[i];
                    if (key.simCode == simCode) {
                        /*
                         * This key is already active, so if this a "down" request (or a "press" for a key we already
                         * processed as a "down"), ignore it.
                         */
                        if (!fPress || key.nRepeat >= 0) {
                            i = -1;
                            break;
                        }
                        if (i > 0) {
                            if (this.aKeysActive[0].nRepeat > 0) this.aKeysActive[0].nRepeat = 0;
                            this.aKeysActive.splice(i, 1);
                        }
                        break;
                    }
                }
            
                if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage("addActiveKey(" + simCode + "," + (fPress? "press" : "down") + "): " + (i < 0? "already active" : (i == this.aKeysActive.length? "adding" : "updating")), true);
                }
            
                if (i < 0) return;
            
                if (i == this.aKeysActive.length) {
                    key = {};
                    key.simCode = simCode;
                    key.bitsState = this.bitsState;
                    this.findBinding(simCode, "key", true);
                    i++;
                }
                if (i > 0) {
                    this.aKeysActive.splice(0, 0, key);
                }
            
                key.fDown = true;
                key.nRepeat = (fPress? -1: (Keyboard.KEYSTATES[simCode]? 0 : 1));
            
                this.updateActiveKey(key);
            };
            
            /**
             * checkActiveKey()
             *
             * @this {Keyboard}
             * @return {number} simCode of active key, 0 if none
             */
            Keyboard.prototype.checkActiveKey = function()
            {
                return this.aKeysActive.length? this.aKeysActive[0].simCode : 0;
            };
            
            /**
             * checkActiveKeyShift()
             *
             * @this {Keyboard}
             * @return {number|null} bitsState for active key, null if none
             *
            Keyboard.prototype.checkActiveKeyShift = function()
            {
                return this.aKeysActive.length? this.aKeysActive[0].bitsState : null;
            };
             */
            
            /**
             * isAlphaKey(code)
             *
             * @this {Keyboard}
             * @param {number} code
             * @returns {boolean} true if alpha key, false if not
             */
            Keyboard.prototype.isAlphaKey = function(code)
            {
                return (code >= Keyboard.ASCII.A && code <= Keyboard.ASCII.Z || code >= Keyboard.ASCII.a && code <= Keyboard.ASCII.z);
            };
            
            /**
             * toUpperKey(code)
             *
             * @this {Keyboard}
             * @param {number} code
             * @returns {number}
             */
            Keyboard.prototype.toUpperKey = function(code)
            {
                if (code >= Keyboard.ASCII.a && code <= Keyboard.ASCII.z) {
                    code -= (Keyboard.ASCII.a - Keyboard.ASCII.A);
                }
                return code;
            };
            
            /**
             * clearActiveKeys()
             *
             * Force all active keys to "self-deactivate".
             *
             * TODO: Consider limiting this to non-shift keys only.
             *
             * @this {Keyboard}
             */
            Keyboard.prototype.clearActiveKeys = function()
            {
                for (var i = 0; i < this.aKeysActive.length; i++) {
                    var key = this.aKeysActive[i];
                    key.fDown = false;
                    if (key.nRepeat > 0) key.nRepeat = 0;
                }
            };
            
            /**
             * removeActiveKey(simCode, fFlush)
             *
             * @param {number} simCode
             * @param {boolean} [fFlush] is true whenever the key must be removed, independent of other factors
             * @return {boolean} true if successfully removed, false if not
             */
            Keyboard.prototype.removeActiveKey = function(simCode, fFlush)
            {
                if (!Keyboard.SIMCODES[simCode]) {
                    if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                        this.printMessage("removeActiveKey(" + simCode + "): unrecognized", true);
                    }
                    return false;
                }
            
                /*
                 * Ignore all active keys if the CPU is not running.
                 */
                if (!fFlush && (!this.cpu || !this.cpu.isRunning())) return false;
            
                var fRemoved = false;
                for (var i = 0; i < this.aKeysActive.length; i++) {
                    var key = this.aKeysActive[i];
                    if (key.simCode == simCode || key.simCode == Keyboard.SHIFTED_KEYCODES[simCode]) {
                        this.aKeysActive.splice(i, 1);
                        if (key.timer) clearTimeout(key.timer);
                        if (key.fDown && !fFlush) this.keySimulate(key.simCode, false);
                        this.findBinding(simCode, "key", false);
                        fRemoved = true;
                        break;
                    }
                }
                if (!COMPILED && !fFlush && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage("removeActiveKey(" + simCode + "): " + (fRemoved? "removed" : "not active"), true);
                }
                if (!this.aKeysActive.length && this.fToggleCapsLock) {
                    if (!COMPILED) this.printMessage("removeActiveKey(): inverting caps-lock now", Messages.KEYS);
                    this.updateShiftState(Keyboard.SIMCODE.CAPS_LOCK);
                    this.fToggleCapsLock = false;
                }
                return fRemoved;
            };
            
            /**
             * updateActiveKey(key, msTimer)
             *
             * @param {Object} key
             * @param {number} [msTimer]
             */
            Keyboard.prototype.updateActiveKey = function(key, msTimer)
            {
                /*
                 * All active keys are automatically removed once the CPU stops running.
                 */
                if (!this.cpu || !this.cpu.isRunning()) {
                    this.removeActiveKey(key.simCode, true);
                    return;
                }
            
                if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage((msTimer? '\n' : "") + "updateActiveKey(" + key.simCode + (msTimer? "," + msTimer + "ms" : "") + "): " + (key.fDown? "down" : "up"), true);
                }
            
                this.keySimulate(key.simCode, key.fDown);
            
                if (!key.nRepeat) return;
            
                var ms;
                if (key.nRepeat < 0) {
                    if (!key.fDown) {
                        this.removeActiveKey(key.simCode);
                        return;
                    }
                    key.fDown = false;
                    ms = this.msAutoRelease;
                }
                else {
                    ms = (key.nRepeat++ == 1? this.msAutoRepeat : this.msNextRepeat);
                }
                key.timer = setTimeout(function(kbd) {
                    return function onUpdateActiveKey() {
                        kbd.updateActiveKey(key, ms);
                    };
                }(this), ms);
            };
            
            /**
             * getSimCode(keyCode)
             *
             * @this {Keyboard}
             * @param {number} keyCode
             * @param {boolean} fShifted
             * @return {number} simCode
             */
            Keyboard.prototype.getSimCode = function(keyCode, fShifted)
            {
                var code;
                var simCode = keyCode;
            
                if (keyCode >= Keyboard.ASCII.A && keyCode <= Keyboard.ASCII.Z) {
                    if (!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT | Keyboard.STATE.CAPS_LOCK)) == fShifted) {
                        simCode = keyCode + (Keyboard.ASCII.a - Keyboard.ASCII.A);
                    }
                }
                else if (keyCode >= Keyboard.ASCII.a && keyCode <= Keyboard.ASCII.z) {
                    if (!!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT | Keyboard.STATE.CAPS_LOCK)) == fShifted) {
                        simCode = keyCode - (Keyboard.ASCII.a - Keyboard.ASCII.A);
                    }
                }
                else if (!!(this.bitsState & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT)) == fShifted) {
                    if (code = Keyboard.SHIFTED_KEYCODES[keyCode]) {
                        simCode = code;
                    }
                }
                else {
                    if (code = Keyboard.STUPID_KEYCODES[keyCode]) {
                        simCode = code;
                    }
                }
                return simCode;
            };
            
            /**
             * onFocusChange(fFocus)
             *
             * @this {Keyboard}
             * @param {boolean} fFocus is true if gaining focus, false if losing it
             */
            Keyboard.prototype.onFocusChange = function(fFocus)
            {
                if (this.fHasFocus != fFocus && !COMPILED && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage("onFocusChange(" + (fFocus? "true" : "false") + ")", true);
                }
                this.fHasFocus = fFocus;
                /*
                 * Since we can't be sure of any shift states after losing focus, we clear them all.
                 */
                if (!fFocus) this.bitsState &= ~Keyboard.STATE.ALL_SHIFT;
            };
            
            /**
             * onKeyDown(event, fDown)
             *
             * @this {Keyboard}
             * @param {Object} event
             * @param {boolean} fDown is true for a keyDown event, false for a keyUp event
             * @return {boolean} true to pass the event along, false to consume it
             */
            Keyboard.prototype.onKeyDown = function(event, fDown)
            {
                var fPass = true;
                var fPress = false;
                var fIgnore = false;
            
                var keyCode = event.keyCode;
            
                /*
                 * Although it would be nice to pay attention ONLY to these "up" and "down" events, and ignore "press"
                 * events, iOS devices force us to process "press" events, because they don't give us shift-key events,
                 * so we have to infer the shift state from the character code in the "press" event.
                 *
                 * So, to seamlessly blend "up" and "down" events with "press" events, we must convert any keyCodes we
                 * receive here to a compatibly shifted simCode.
                 */
                var simCode = this.getSimCode(keyCode, true);
            
                if (this.fEscapeDisabled && simCode == Keyboard.ASCII['`']) {
                    keyCode = simCode = Keyboard.KEYCODE.ESC;
                }
            
                if (Keyboard.SIMCODES[keyCode + Keyboard.KEYCODE.ONDOWN]) {
            
                    simCode += Keyboard.KEYCODE.ONDOWN;
                    if (event.location == Keyboard.LOCATION.RIGHT) {
                        simCode += Keyboard.KEYCODE.ONRIGHT;
                    }
            
                    if (this.updateShiftState(simCode, false, fDown)) {
            
                        if (keyCode == Keyboard.KEYCODE.CAPS_LOCK || keyCode == Keyboard.KEYCODE.NUM_LOCK || keyCode == Keyboard.KEYCODE.SCROLL_LOCK) {
                            /*
                             * FYI, "lock" keys generate a "down" event ONLY when getting locked and an "up" event ONLY
                             * when getting unlocked--which is a little odd, since the key did go UP and DOWN each time.
                             *
                             * We must treat each event like a "down", and also as a "press", so that addActiveKey() will
                             * automatically generate both the "make" and "break".
                             *
                             * Of course, there have to be exceptions, most notably MSIE, which sends both "up" and down"
                             * on every press, so there's no need for trickery.
                             */
                            if (!this.fMSIE) {
                                fDown = fPress = true;
                            }
                        }
                        /*
                         * As a safeguard, whenever the CMD key goes up, clear all active keys, because there appear to be
                         * cases where we don't always get notification of a CMD key's companion key going up (this probably
                         * overlaps with most if not all situations where we also lose focus).
                         */
                        if (!fDown && (keyCode == Keyboard.KEYCODE.CMD || keyCode == Keyboard.KEYCODE.RCMD)) {
                            this.clearActiveKeys();
                        }
                    }
                    else {
                        /*
                         * Here we have all the non-shift keys in the ONDOWN category; eg, BS, TAB, ESC, UP, DOWN, LEFT, RIGHT,
                         * and many more.
                         *
                         * For various reasons (some of which are discussed below), we don't want to pass these on (ie, we want
                         * to suppress their "press" event), which means we must perform all key simulation on the "up" and "down"
                         * events.
                         *
                         * Regarding BS: I never want the browser to act on BS, since it does double-duty as the BACK button,
                         * leaving the current page.
                         *
                         * Regarding TAB: If I don't consume TAB on the "down" event, then that's all I'll see, because the browser
                         * act on it by giving focus to the next control.
                         *
                         * Regarding ESC: This key generates "down" and "up" events (LOTS of "down" events for that matter), but no
                         * "press" event.
                         */
            
                        /*
                         * HACK for simulating CTRL_BREAK using CTRL_DEL (Mac) or CTRL_BS (Windows)
                         */
                        if (keyCode == Keyboard.KEYCODE.BS && (this.bitsState & (Keyboard.STATE.CTRL|Keyboard.STATE.ALT)) == Keyboard.STATE.CTRL) {
                            simCode = Keyboard.SIMCODE.CTRL_BREAK;
                        }
            
                        /*
                         * There are a number of other common key sequences that interfere with our machines; for example,
                         * the up/down arrows have a "default" behavior of scrolling the web page up and down, which is
                         * definitely NOT a behavior we want.  Since we mark those keys as ONDOWN, we'll catch them all here.
                         */
                        fPass = false;
                    }
                }
                else {
                    /*
                     * When I have defined system-wide CTRL-key sequences to perform common editing operations (eg, CTRL_W
                     * and CTRL_Z to scroll pages of text), the browser likes to act on those operations, so let's set fPass
                     * to false to prevent that.
                     *
                     * Also, we don't want to set fIgnore in such cases, because the browser may not give us a press event for
                     * these CTRL-key sequences, so we can't risk ignoring them.
                     */
                    if (Keyboard.SIMCODES[simCode] && (this.bitsState & (Keyboard.STATE.CTRLS | Keyboard.STATE.ALTS))) {
                        fPass = false;
                    }
            
                    /*
                     * Don't simulate any key not explicitly marked ONDOWN, as well as any key sequence with the CMD key held.
                     */
                    if (!this.fAllDown && fPass && fDown || !!(this.bitsState & Keyboard.STATE.CMDS)) fIgnore = true;
                }
            
                if (!fPass) {
                    event.preventDefault();
                }
            
                if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage("\nonKey" + (fDown? "Down" : "Up") + "(" + keyCode + "): " + (fIgnore? "ignore" : (fPass? "true" : "false")), true);
                }
            
                /*
                 * Mobile (eg, iOS) keyboards don't fully support onKeyDown/onKeyUp events; for example, they usually
                 * don't generate ANY events when a shift key is pressed, and even for normal keys, they seem to generate
                 * rapid (ie, fake) "up" and "down" events around "press" events, probably more to satisfy compatibility
                 * issues rather than making a serious effort to indicate when a key ACTUALLY went down or up.
                 */
                if (!fIgnore && (!this.fMobile || !fPass)) {
                    if (fDown) {
                        this.addActiveKey(simCode, fPress);
                    } else {
                        if (!this.removeActiveKey(simCode)) {
                            var code = this.getSimCode(keyCode, false);
                            if (code != simCode) this.removeActiveKey(code);
                        }
                    }
                }
            
                return fPass;
            };
            
            /**
             * onKeyPress(event)
             *
             * @this {Keyboard}
             * @param {Object} event
             * @return {boolean} true to pass the event along, false to consume it
             */
            Keyboard.prototype.onKeyPress = function(event)
            {
                event = event || window.event;
                var keyCode = event.which || event.keyCode;
            
                if (this.fAllDown) {
                    var simCode = this.checkActiveKey();
                    if (simCode && this.isAlphaKey(simCode) && this.isAlphaKey(keyCode) && simCode != keyCode) {
                        if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                            this.printMessage("onKeyPress(" + keyCode + ") out of sync with " + simCode + ", invert caps-lock", true);
                        }
                        this.fToggleCapsLock = true;
                        keyCode = simCode;
                    }
                }
            
                /*
                 * Let's stop any injection currently in progress, too
                 */
                this.sInjectBuffer = "";
            
                var fPass = !Keyboard.SIMCODES[keyCode] || !!(this.bitsState & Keyboard.STATE.CMD);
            
                if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage("\nonKeyPress(" + keyCode + "): " + (fPass? "true" : "false"), true);
                }
            
                if (!fPass) {
                    this.addActiveKey(keyCode, true);
                }
            
                return fPass;
            };
            
            /**
             * keySimulate(simCode, fDown)
             *
             * @this {Keyboard}
             * @param {number} simCode
             * @param {boolean} fDown
             * @return {boolean} true if successfully simulated, false if unrecognized/unsupported key
             */
            Keyboard.prototype.keySimulate = function(simCode, fDown)
            {
                var fSimulated = false;
            
                this.updateShiftState(simCode, true, fDown);
            
                var wCode = Keyboard.SIMCODES[simCode] || Keyboard.SIMCODES[simCode + Keyboard.KEYCODE.ONDOWN];
            
                if (wCode !== undefined) {
            
                    /*
                     * Hack to transform the IBM "BACKSPACE" key (which we normally map to KEYCODE_DELETE) to the IBM "DEL" key
                     * whenever both CTRL and ALT are pressed as well, so that it's easier to simulate that old favorite: CTRL_ALT_DEL
                     */
                    if (wCode == Keyboard.SCANCODE.BS) {
                        if ((this.bitsState & (Keyboard.STATE.CTRL | Keyboard.STATE.ALT)) == (Keyboard.STATE.CTRL | Keyboard.STATE.ALT)) {
                            wCode = Keyboard.SCANCODE.NUM_DEL;
                        }
                    }
            
                    var abScanCodes = [];
                    var bCode = wCode & 0xff;
                    abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
            
                    var fAlpha = (simCode >= Keyboard.ASCII.A && simCode <= Keyboard.ASCII.Z || simCode >= Keyboard.ASCII.a && simCode <= Keyboard.ASCII.z);
            
                    while (wCode >>>= 8) {
                        var bShift = 0;
                        var bScan = wCode & 0xff;
                        /*
                         * TODO: The handling of SIMCODE entries with "extended" codes still needs to be tested, and
                         * moreover, if any of them need to perform any shift-state modifications, those modifications
                         * may need to be encoded differently.
                         */
                        if (bCode == Keyboard.SCANCODE.EXTEND1 || bCode == Keyboard.SCANCODE.EXTEND2) {
                            abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
                            continue;
                        }
                        if (bScan == Keyboard.SCANCODE.SHIFT) {
                            if (!(this.bitsStateSim & (Keyboard.STATE.SHIFT | Keyboard.STATE.RSHIFT))) {
                                if (!(this.bitsStateSim & Keyboard.STATE.CAPS_LOCK) || !fAlpha) {
                                    bShift = bScan;
                                }
                            }
                        } else if (bScan == Keyboard.SCANCODE.CTRL) {
                            if (!(this.bitsStateSim & (Keyboard.STATE.CTRL | Keyboard.STATE.RCTRL))) {
                                bShift = bScan;
                            }
                        } else if (bScan == Keyboard.SCANCODE.ALT) {
                            if (!(this.bitsStateSim & (Keyboard.STATE.ALT | Keyboard.STATE.RALT))) {
                                bShift = bScan;
                            }
                        } else {
                            abScanCodes.push(bCode | (fDown? 0 : Keyboard.SCANCODE.BREAK));
            
                        }
                        if (bShift) {
                            if (fDown)
                                abScanCodes.unshift(bShift);
                            else
                                abScanCodes.push(bShift | Keyboard.SCANCODE.BREAK);
                        }
                    }
            
                    for (var i = 0; i < abScanCodes.length; i++) {
                        this.addScanCode(abScanCodes[i]);
                    }
            
                    fSimulated = true;
                }
            
                if (!COMPILED && this.messageEnabled(Messages.KEYS)) {
                    this.printMessage("keySimulate(" + simCode + "," + (fDown? "down" : "up") + "): " + (fSimulated? "true" : "false"), true);
                }
            
                return fSimulated;
            };
            
            /**
             * Keyboard.init()
             *
             * This function operates on every HTML element of class "keyboard", extracting the
             * JSON-encoded parameters for the Keyboard constructor from the element's "data-value"
             * attribute, invoking the constructor to create a Keyboard component, and then binding
             * any associated HTML controls to the new component.
             */
            Keyboard.init = function()
            {
                var aeKbd = Component.getElementsByClass(window.document, PCJSCLASS, "keyboard");
                for (var iKbd = 0; iKbd < aeKbd.length; iKbd++) {
                    var eKbd = aeKbd[iKbd];
                    var parmsKbd = Component.getComponentParms(eKbd);
                    var kbd = new Keyboard(parmsKbd);
                    Component.bindComponentControls(kbd, eKbd, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every Keyboard module on the page.
             */
            web.onInit(Keyboard.init);
            
            if (typeof module !== 'undefined') module.exports = Keyboard;
            
          • memory.js
            /**
             * @fileoverview Implements the PCjs "physical" Memory component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-04
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var X86         = require("./x86");
            }
            
            /**
             * @class DataView
             * @property {function(number,boolean):number} getUint8
             * @property {function(number,number,boolean)} setUint8
             * @property {function(number,boolean):number} getUint16
             * @property {function(number,number,boolean)} setUint16
             * @property {function(number,boolean):number} getInt32
             * @property {function(number,number,boolean)} setInt32
             */
            
            var littleEndian = (TYPEDARRAYS? (function() {
                var buffer = new ArrayBuffer(2);
                new DataView(buffer).setUint16(0, 256, true);
                return new Uint16Array(buffer)[0] === 256;
            })() : false);
            
            /**
             * Memory(addr, used, size, type, controller)
             *
             * The Bus component allocates Memory objects so that each has a memory buffer with a
             * block-granular starting address and an address range equal to bus.nBlockSize; however,
             * the size of any given Memory object's underlying buffer can be either zero or bus.nBlockSize;
             * memory read/write functions for empty (buffer-less) blocks are mapped to readNone/writeNone.
             *
             * The Bus allocates empty blocks for the entire address space during initialization, so that
             * any reads/writes to undefined addresses will have no effect.  Later, the ROM and RAM
             * components will ask the Bus to allocate memory for specific ranges, and the Bus will allocate
             * as many new blockSize Memory objects as the ranges require.  Partial Memory blocks could
             * also be supported in theory, but in practice, they're not.
             *
             * Because Memory blocks now allow us to have a "sparse" address space, we could choose to
             * take the memory hit of allocating 4K arrays per block, where each element stores only one byte,
             * instead of the more frugal but slightly slower approach of allocating arrays of 32-bit dwords
             * (LONGARRAYS) and shifting/masking bytes/words to/from dwords; in theory, byte accesses would
             * be faster and word accesses somewhat less faster.
             *
             * However, preliminary testing of that feature (FATARRAYS) did not yield significantly faster
             * performance, so it is OFF by default to minimize our memory consumption.  Using TYPEDARRAYS
             * would seem best, but as discussed in defines.js, it's off by default, because it doesn't perform
             * as well as LONGARRAYS; the other advantage of TYPEDARRAYS is that it should theoretically use
             * about 1/2 the memory of LONGARRAYS (32-bit elements vs 64-bit numbers), but I value speed over
             * size at this point.  Also, not all JavaScript implementations support TYPEDARRAYS (IE9 is probably
             * the only real outlier: it lacks typed arrays but otherwise has all the necessary HTML5 support).
             *
             * WARNING: Since Memory blocks are low-level objects that have no UI requirements, they
             * do not inherit from the Component class, so if you want to use any Component class methods,
             * such as Component.assert(), use the corresponding Debugger methods instead (assuming a debugger
             * is available).
             *
             * @constructor
             * @param {number|null} [addr] of lowest used address in block
             * @param {number} [used] portion of block in bytes (0 for none); must be a multiple of 4
             * @param {number} [size] of block's buffer in bytes (0 for none); must be a multiple of 4
             * @param {number} [type] is one of the Memory.TYPE constants (default is Memory.TYPE.NONE)
             * @param {Object} [controller] is an optional memory controller component
             * @param {X86CPU} [cpu] is required for UNPAGED memory blocks, so that the CPU can map it to a PAGED block
             */
            function Memory(addr, used, size, type, controller, cpu)
            {
                var i;
                this.id = (Memory.idBlock += 2);
                this.adw = null;
                this.offset = 0;
                this.addr = addr;
                this.used = used;
                this.size = size || 0;
                this.type = type || Memory.TYPE.NONE;
                this.fReadOnly = (type == Memory.TYPE.ROM);
                this.controller = null;
                this.cpu = cpu;
                this.fDirty = this.fDirtyEver = false;
                this.setPhysBlock();
            
                if (BACKTRACK) {
                    if (!size || controller) {
                        this.fModBackTrack = false;
                        this.readBackTrack = this.readBackTrackNone;
                        this.writeBackTrack = this.writeBackTrackNone;
                        this.modBackTrack = this.modBackTrackNone;
                    } else {
                        this.fModBackTrack = true;
                        this.readBackTrack = this.readBackTrackIndex;
                        this.writeBackTrack = this.writeBackTrackIndex;
                        this.modBackTrack = this.modBackTrackIndex;
                        this.abtIndexes = new Array(size);
                        for (i = 0; i < size; i++) this.abtIndexes[i] = 0;
                    }
                }
            
                /*
                 * For empty memory blocks, all we need to do is ensure all access functions
                 * are mapped to "none" handlers (or "unpaged" handlers if paging is enabled).
                 */
                if (!size) {
                    this.setAccess();
                    return;
                }
            
                /*
                 * When a controller is specified, the controller must provide a buffer,
                 * via getMemoryBuffer(), and memory access functions, via getMemoryAccess().
                 */
                if (controller) {
                    this.controller = controller;
                    var a = controller.getMemoryBuffer(addr);
                    this.adw = a[0];
                    this.offset = a[1];
                    this.setAccess(controller.getMemoryAccess());
                    return;
                }
            
                /*
                 * This is the normal case: allocate a buffer that provides 8 bits of data per address;
                 * no controller is required because our default memory access functions (see afnMemory)
                 * know how to deal with this simple 1-1 mapping of addresses to bytes and words.
                 *
                 * TODO: Consider initializing the memory array to random (or pseudo-random) values in DEBUG
                 * mode; pseudo-random might be best, to help make any bugs reproducible.
                 */
                if (TYPEDARRAYS) {
                    this.buffer = new ArrayBuffer(size);
                    this.dv = new DataView(this.buffer, 0, size);
                    /*
                     * If littleEndian is true, we can use ab[], aw[] and adw[] directly; well, we can use them
                     * whenever the offset is a multiple of 1, 2 or 4, respectively.  Otherwise, we must fallback to
                     * dv.getUint8()/dv.setUint8(), dv.getUint16()/dv.setUint16() and dv.getInt32()/dv.setInt32().
                     */
                    this.ab = new Uint8Array(this.buffer, 0, size);
                    this.aw = new Uint16Array(this.buffer, 0, size >> 1);
                    this.adw = new Int32Array(this.buffer, 0, size >> 2);
                    this.setAccess(littleEndian? Memory.afnLittleEndian : Memory.afnBigEndian);
                } else {
                    if (FATARRAYS) {
                        this.ab = new Array(size);
                    } else {
                        /*
                         * NOTE: This is the default mode of operation (!TYPEDARRAYS && !FATARRAYS), because it
                         * seems to provide the best performance; and although in theory, that performance might
                         * come at twice the overhead of TYPEDARRAYS, it's increasingly likely that the JavaScript
                         * runtime will notice that all we ever store are 32-bit values, and optimize accordingly.
                         */
                        this.adw = new Array(size >> 2);
                        for (i = 0; i < this.adw.length; i++) this.adw[i] = 0;
                    }
                    this.setAccess(Memory.afnMemory);
                }
            }
            
            /*
             * Basic memory types
             *
             * RAM is the most conventional memory type, providing full read/write capability to x86-compatible (ie,
             * 'little endian") storage.  ROM is equally conventional, except that the fReadOnly property is set,
             * disabling writes.  VIDEO is treated exactly like RAM, unless a controller is provided.  Both RAM and
             * VIDEO memory are always considered writable, and even ROM can be written using the Bus setByteDirect()
             * interface (which in turn uses the Memory writeByteDirect() interface), allowing the ROM component to
             * initialize its own memory.  The CTRL type is used to identify memory-mapped devices that do not need
             * any default storage and always provide their own controller.
             *
             * UNPAGED and PAGED blocks are created by the CPU when paging is enabled; the role of an UNPAGED block
             * is simply to perform page translation and replace itself with a PAGED block, which redirects read/write
             * requests to the physical page located during translation.  UNPAGED and PAGED blocks are considered
             * "logical" blocks that don't contain any storage of their own; all other block types represent "physical"
             * memory (or a memory-mapped device).
             *
             * Unallocated regions of the address space contain a special memory block of type NONE that contains
             * no storage.  Mapping every addressible location to a memory block allows all accesses to be routed in
             * exactly the same manner, without resorting to any range or processor checks.
             *
             * Originally, the Debugger always went through the Bus interfaces, and could therefore modify ROMs as well,
             * but with the introduction of protected mode memory segmentation (and later paging), where logical and
             * phsycial addresses were no longer the same, that is no longer true.  For coherency, all Debugger memory
             * accesses now go through the X86Seg and X86CPU memory interfaces, so that the user sees the same segment
             * and page translation that the CPU sees.  However, the Debugger uses special "fSuppress" flags to prevent
             * those X86 interfaces from triggering segment and/or page faults when invalid or not-present segments
             * or pages are accessed.
             *
             * These types are not mutually exclusive.  For example, VIDEO memory could be allocated as RAM, with or
             * without a custom controller (the original Monochrome and CGA video cards used read/write storage that
             * was indistiguishable from RAM), and CTRL memory could be allocated as an empty block of any type, with
             * a custom controller.  A few types are required for certain features (eg, ROM is required if you want
             * read-only memory), but the larger purpose of these types is to help document the caller's intent and to
             * provide the Control Panel with the ability to highlight memory regions accordingly.
             */
            Memory.TYPE = {
                NONE:       0,
                RAM:        1,
                ROM:        2,
                VIDEO:      3,
                CTRL:       4,
                UNPAGED:    5,
                PAGED:      6,
                NAMES:      ["NONE",  "RAM",  "ROM",   "VIDEO", "H/W", "UNPAGED", "PAGED"],
                COLORS:     ["black", "blue", "green", "cyan"]
            };
            
            /*
             * Last used block ID (used for debugging only)
             */
            Memory.idBlock = 0;
            
            /**
             * adjustEndian(dw)
             *
             * @param {number} dw
             * @return {number}
             */
            Memory.adjustEndian = function(dw) {
                if (TYPEDARRAYS && !littleEndian) {
                    dw = (dw << 24) | ((dw << 8) & 0x00ff0000) | ((dw >> 8) & 0x0000ff00) | (dw >>> 24);
                }
                return dw;
            };
            
            Memory.prototype = {
                constructor: Memory,
                parent: null,
                /**
                 * clone(mem, type)
                 *
                 * Converts the current Memory block (this) into a clone of the given Memory block (mem),
                 * and optionally overrides the current block's type with the specified type.
                 *
                 * @this {Memory}
                 * @param {Memory} mem
                 * @param {number} [type]
                 */
                clone: function(mem, type) {
                    /*
                     * Original memory block IDs are even; cloned memory block IDs are odd;
                     * the original ID of the current block is lost, but that's OK, since it was presumably
                     * produced merely to become a clone.
                     */
                    this.id = mem.id | 0x1;
                    this.used = mem.used;
                    this.size = mem.size;
                    if (type) {
                        this.type = type;
                        this.fReadOnly = (type == Memory.TYPE.ROM);
                    }
                    if (TYPEDARRAYS) {
                        this.buffer = mem.buffer;
                        this.dv = mem.dv;
                        this.ab = mem.ab;
                        this.aw = mem.aw;
                        this.adw = mem.adw;
                        this.setAccess(littleEndian? Memory.afnLittleEndian : Memory.afnBigEndian);
                    } else {
                        if (FATARRAYS) {
                            this.ab = mem.ab;
                        } else {
                            this.adw = mem.adw;
                        }
                        this.setAccess(Memory.afnMemory);
                    }
                },
                /**
                 * save()
                 *
                 * This gets the contents of a Memory block as an array of 32-bit values;
                 * used by Bus.saveMemory(), which in turn is called by X86CPU.save().
                 *
                 * Memory blocks with custom memory controllers do NOT save their contents;
                 * that's the responsibility of the controller component.
                 *
                 * @this {Memory}
                 * @return {Array|Int32Array|null}
                 */
                save: function() {
                    var adw, i;
                    if (this.controller) {
                        adw = null;
                    }
                    else if (FATARRAYS) {
                        adw = new Array(this.size >> 2);
                        var off = 0;
                        for (i = 0; i < adw.length; i++) {
                            adw[i] = this.ab[off] | (this.ab[off + 1] << 8) | (this.ab[off + 2] << 16) | (this.ab[off + 3] << 24);
                            off += 4;
                        }
                    }
                    else if (TYPEDARRAYS) {
                        /*
                         * It might be tempting to just return a copy of Int32Array(this.buffer, 0, this.size >> 2),
                         * but we can't be sure of the "endianness" of an Int32Array -- which would be OK if the array
                         * was always saved/restored on the same machine, but there's no guarantee of that, either.
                         * So we use getInt32() and require little-endian values.
                         *
                         * Moreover, an Int32Array isn't treated by JSON.stringify() and JSON.parse() exactly like
                         * a normal array; it's serialized as an Object rather than an Array, so it lacks a "length"
                         * property and causes problems for State.store() and State.parse().
                         */
                        adw = new Array(this.size >> 2);
                        for (i = 0; i < adw.length; i++) {
                            adw[i] = this.dv.getInt32(i << 2, true);
                        }
                    }
                    else {
                        adw = this.adw;
                    }
                    return adw;
                },
                /**
                 * restore(adw)
                 *
                 * This restores the contents of a Memory block from an array of 32-bit values;
                 * used by Bus.restoreMemory(), which is called by X86CPU.restore(), after all other
                 * components have been restored and thus all Memory blocks have been allocated
                 * by their respective components.
                 *
                 * @this {Memory}
                 * @param {Array|null} adw
                 * @return {boolean} true if successful, false if block size mismatch
                 */
                restore: function(adw) {
                    if (this.controller) {
                        return (adw == null);
                    }
                    /*
                     * At this point, it's a consistency error for adw to be null; it's happened once already,
                     * when there was a restore bug in the Video component that added the frame buffer at the video
                     * card's "spec'ed" address instead of the programmed address, so there were no controller-owned
                     * memory blocks installed at the programmed address, and so we arrived here at a block with
                     * no controller AND no data.
                     */
                    Component.assert(adw != null);
                    if (adw && this.size == adw.length << 2) {
                        var i;
                        if (FATARRAYS) {
                            var off = 0;
                            for (i = 0; i < adw.length; i++) {
                                this.ab[off] = adw[i] & 0xff;
                                this.ab[off + 1] = (adw[i] >> 8) & 0xff;
                                this.ab[off + 2] = (adw[i] >> 16) & 0xff;
                                this.ab[off + 3] = (adw[i] >> 24) & 0xff;
                                off += 4;
                            }
                        } else if (TYPEDARRAYS) {
                            for (i = 0; i < adw.length; i++) {
                                this.dv.setInt32(i << 2, adw[i], true);
                            }
                        } else {
                            this.adw = adw;
                        }
                        this.fDirty = true;
                        return true;
                    }
                    return false;
                },
                /**
                 * setAccess(afn)
                 *
                 * If no function table is specified, a default is selected based on the Memory type.
                 *
                 * @this {Memory}
                 * @param {Array.<function()>} [afn] function table
                 */
                setAccess: function(afn) {
                    if (!afn) {
                        if (this.type == Memory.TYPE.UNPAGED) {
                            afn = Memory.afnUnpaged;
                        }
                        else if (this.type == Memory.TYPE.PAGED) {
                            afn = Memory.afnPaged;
                        } else {
                            Component.assert(this.type == Memory.TYPE.NONE);
                            afn = Memory.afnNone;
                        }
                    }
                    this.setReadAccess(afn, true);
                    this.setWriteAccess(afn, true);
                },
                /**
                 * setReadAccess(afn, fDirect)
                 *
                 * @this {Memory}
                 * @param {Array.<function()>} afn
                 * @param {boolean} [fDirect]
                 */
                setReadAccess: function(afn, fDirect) {
                    this.readByte = afn[0] || this.readNone;
                    this.readShort = afn[1] || this.readShortDefault;
                    this.readLong = afn[2] || this.readLongDefault;
                    if (fDirect) {
                        this.readByteDirect = afn[0] || this.readNone;
                        this.readShortDirect = afn[1] || this.readShortDefault;
                        this.readLongDirect = afn[2] || this.readLongDefault;
                    }
                },
                /**
                 * setWriteAccess(afn, fDirect)
                 *
                 * @this {Memory}
                 * @param {Array.<function()>} afn
                 * @param {boolean} [fDirect]
                 */
                setWriteAccess: function(afn, fDirect) {
                    this.writeByte = !this.fReadOnly && afn[3] || this.writeNone;
                    this.writeShort = !this.fReadOnly && afn[4] || this.writeShortDefault;
                    this.writeLong = !this.fReadOnly && afn[5] || this.writeLongDefault;
                    if (fDirect) {
                        this.writeByteDirect = afn[3] || this.writeNone;
                        this.writeShortDirect = afn[4] || this.writeShortDefault;
                        this.writeLongDirect = afn[5] || this.writeLongDefault;
                    }
                },
                /**
                 * resetReadAccess()
                 *
                 * @this {Memory}
                 */
                resetReadAccess: function() {
                    this.readByte = this.readByteDirect;
                    this.readShort = this.readShortDirect;
                    this.readLong = this.readLongDirect;
                },
                /**
                 * resetWriteAccess()
                 *
                 * @this {Memory}
                 */
                resetWriteAccess: function() {
                    this.writeByte = this.fReadOnly? this.writeNone : this.writeByteDirect;
                    this.writeShort = this.fReadOnly? this.writeNone : this.writeShortDirect;
                    this.writeLong = this.fReadOnly? this.writeNone : this.writeLongDirect;
                },
                /**
                 * setDebugger(dbg, addr, size)
                 *
                 * @this {Memory}
                 * @param {Debugger} dbg
                 * @param {number} addr of block
                 * @param {number} size of block
                 */
                setDebugger: function(dbg, addr, size) {
                    if (DEBUGGER) {
                        this.dbg = dbg;
                        this.cReadBreakpoints = this.cWriteBreakpoints = 0;
                        Component.assert(this.dbg);
                        this.dbg.redoBreakpoints(addr, size);
                    }
                },
                /**
                 * getPageBlock(addr, fWrite)
                 *
                 * @this {Memory}
                 * @param {number} addr
                 * @param {boolean} fWrite (true if called for a write, false if for a read)
                 * @return {Memory}
                 */
                getPageBlock: function(addr, fWrite) {
                    var block = this.cpu.mapPageBlock(addr, fWrite);
                    /*
                     * If mapPageBlock() fails -- which can easily happen if the page is not present or has insufficient
                     * privileges -- then a fault will be triggered and block will be null.  We still have to return a block,
                     * but it will be our old "unpaged" self.
                     */
                    return block || this;
                },
                /**
                 * setPhysBlock(blockPhys, blockPDE, offPDE, blockPTE, offPTE)
                 *
                 * @this {Memory}
                 * @param {Memory|null} [blockPhys]
                 * @param {Memory|null} [blockPDE]
                 * @param {number} [offPDE]
                 * @param {Memory|null} [blockPTE]
                 * @param {number} [offPTE]
                 */
                setPhysBlock: function(blockPhys, blockPDE, offPDE, blockPTE, offPTE) {
                    this.blockPhys = blockPhys;
                    this.blockPDE = blockPDE;
                    this.iPDE = offPDE >> 2;    // convert offPDE into iPDE (an adw index)
                    this.blockPTE = blockPTE;
                    this.iPTE = offPTE >> 2;    // convert offPTE into iPTE (an adw index)
                    this.bitPTEDirty = blockPhys? Memory.adjustEndian(X86.PTE.ACCESSED | X86.PTE.DIRTY) : 0;
                    this.bitPTEAccessed = blockPhys? Memory.adjustEndian(X86.PTE.ACCESSED) : 0;
                },
                /**
                 * addBreakpoint(off, fWrite)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {boolean} fWrite
                 */
                addBreakpoint: function(off, fWrite) {
                    if (DEBUGGER && this.dbg) {
                        if (!fWrite) {
                            if (this.cReadBreakpoints++ === 0) {
                                this.setReadAccess(Memory.afnChecked);
                            }
                            if (DEBUG) this.dbg.println("read breakpoint added to memory block " + str.toHex(this.addr));
                        }
                        else {
                            if (this.cWriteBreakpoints++ === 0) {
                                this.setWriteAccess(Memory.afnChecked);
                            }
                            if (DEBUG) this.dbg.println("write breakpoint added to memory block " + str.toHex(this.addr));
                        }
                    }
                },
                /**
                 * removeBreakpoint(off, fWrite)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {boolean} fWrite
                 */
                removeBreakpoint: function(off, fWrite) {
                    if (DEBUGGER && this.dbg) {
                        if (!fWrite) {
                            if (--this.cReadBreakpoints === 0) {
                                this.resetReadAccess();
                                if (DEBUG) this.dbg.println("all read breakpoints removed from memory block " + str.toHex(this.addr));
                            }
                            this.dbg.assert(this.cReadBreakpoints >= 0);
                        }
                        else {
                            if (--this.cWriteBreakpoints === 0) {
                                this.resetWriteAccess();
                                if (DEBUG) this.dbg.println("all write breakpoints removed from memory block " + str.toHex(this.addr));
                            }
                            this.dbg.assert(this.cWriteBreakpoints >= 0);
                        }
                    }
                },
                /**
                 * readNone(off)
                 *
                 * Previously, this always returned 0x00, but the initial memory probe by the Compaq DeskPro 386 ROM BIOS
                 * writes 0x0000 to the first word of every 64Kb block in the nearly 16Mb address space it supports, and
                 * if it reads back 0x0000, it will initially think that LOTS of RAM exists, only to be disappointed later
                 * when it performs a more exhaustive memory test, generating unwanted error messages in the process.
                 *
                 * TODO: Determine if we should have separate readByteNone(), readShortNone() and readLongNone() functions
                 * to return 0xff, 0xffff and 0xffffffff|0, respectively.  This seems sufficient for now, as it seems unlikely
                 * that a system would require nonexistent memory locations to return ALL bits set.
                 *
                 * Also, I'm reluctant to address that potential issue by simply returning -1, because to date, the above
                 * Memory interfaces have always returned values that are properly masked to 8, 16 or 32 bits, respectively.
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readNone: function readNone(off, addr) {
                    if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.MEM) /* && !off */) {
                        this.dbg.message("attempt to read invalid block %" + str.toHex(this.addr), true);
                    }
                    return 0xff;
                },
                /**
                 * writeNone(off, v, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} v (could be either a byte or word value, since we use the same handler for both kinds of accesses)
                 * @param {number} addr
                 */
                writeNone: function writeNone(off, v, addr) {
                    if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.MEM) /* && !off */) {
                        this.dbg.message("attempt to write " + str.toHexWord(v) + " to invalid block %" + str.toHex(this.addr), true);
                    }
                },
                /**
                 * readShortDefault(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortDefault: function readShortDefault(off, addr) {
                    return this.readByte(off, addr) | (this.readByte(off + 1, addr) << 8);
                },
                /**
                 * readLongDefault(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongDefault: function readLongDefault(off, addr) {
                    return this.readByte(off, addr) | (this.readByte(off + 1, addr) << 8) | (this.readByte(off + 2, addr) << 16) | (this.readByte(off + 3, addr) << 24);
                },
                /**
                 * writeShortDefault(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} w
                 * @param {number} addr
                 */
                writeShortDefault: function writeShortDefault(off, w, addr) {
                    Component.assert(!(w & ~0xffff));
                    this.writeByte(off, w & 0xff, addr);
                    this.writeByte(off + 1, w >> 8, addr);
                },
                /**
                 * writeLongDefault(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} w
                 * @param {number} addr
                 */
                writeLongDefault: function writeLongDefault(off, w, addr) {
                    this.writeByte(off, w & 0xff, addr);
                    this.writeByte(off + 1, (w >> 8) & 0xff, addr);
                    this.writeByte(off + 2, (w >> 16) & 0xff, addr);
                    this.writeByte(off + 3, (w >>> 24), addr);
                },
                /**
                 * readByteMemory(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readByteMemory: function readByteMemory(off, addr) {
                    Component.assert(off >= 0 && off < this.size);
                    if (FATARRAYS) {
                        return this.ab[off];
                    }
                    return ((this.adw[off >> 2] >>> ((off & 0x3) << 3)) & 0xff);
                },
                /**
                 * readShortMemory(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortMemory: function readShortMemory(off, addr) {
                    Component.assert(off >= 0 && off < this.size - 1);
                    if (FATARRAYS) {
                        return this.ab[off] | (this.ab[off + 1] << 8);
                    }
                    var w;
                    var idw = off >> 2;
                    var nShift = (off & 0x3) << 3;
                    var dw = (this.adw[idw] >> nShift);
                    if (nShift < 24) {
                        w = dw & 0xffff;
                    } else {
                        w = (dw & 0xff) | ((this.adw[idw + 1] & 0xff) << 8);
                    }
                    return w;
                },
                /**
                 * readLongMemory(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongMemory: function readLongMemory(off, addr) {
                    Component.assert(off >= 0 && off < this.size - 3);
                    if (FATARRAYS) {
                        return this.ab[off] | (this.ab[off + 1] << 8) | (this.ab[off + 2] << 16) | (this.ab[off + 3] << 24);
                    }
                    var idw = off >> 2;
                    var nShift = (off & 0x3) << 3;
                    var l = this.adw[idw];
                    if (nShift) {
                        l >>>= nShift;
                        l |= this.adw[idw + 1] << (32 - nShift);
                    }
                    return l;
                },
                /**
                 * writeByteMemory(off, b, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} b
                 * @param {number} addr
                 */
                writeByteMemory: function writeByteMemory(off, b, addr) {
                    Component.assert(off >= 0 && off < this.size && (b & 0xff) == b);
                    if (FATARRAYS) {
                        this.ab[off] = b;
                    } else {
                        var idw = off >> 2;
                        var nShift = (off & 0x3) << 3;
                        this.adw[idw] = (this.adw[idw] & ~(0xff << nShift)) | (b << nShift);
                    }
                    this.fDirty = true;
                },
                /**
                 * writeShortMemory(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} w
                 * @param {number} addr
                 */
                writeShortMemory: function writeShortMemory(off, w, addr) {
                    Component.assert(off >= 0 && off < this.size - 1 && (w & 0xffff) == w);
                    if (FATARRAYS) {
                        this.ab[off] = (w & 0xff);
                        this.ab[off + 1] = (w >> 8);
                    } else {
                        var idw = off >> 2;
                        var nShift = (off & 0x3) << 3;
                        if (nShift < 24) {
                            this.adw[idw] = (this.adw[idw] & ~(0xffff << nShift)) | (w << nShift);
                        } else {
                            this.adw[idw] = (this.adw[idw] & 0x00ffffff) | (w << 24);
                            idw++;
                            this.adw[idw] = (this.adw[idw] & (0xffffff00|0)) | (w >> 8);
                        }
                    }
                    this.fDirty = true;
                },
                /**
                 * writeLongMemory(off, l, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} l
                 * @param {number} addr
                 */
                writeLongMemory: function writeLongMemory(off, l, addr) {
                    Component.assert(off >= 0 && off < this.size - 3);
                    if (FATARRAYS) {
                        this.ab[off] = (l & 0xff);
                        this.ab[off + 1] = (l >> 8) & 0xff;
                        this.ab[off + 2] = (l >> 16) & 0xff;
                        this.ab[off + 3] = (l >> 24) & 0xff;
                    } else {
                        var idw = off >> 2;
                        var nShift = (off & 0x3) << 3;
                        if (!nShift) {
                            this.adw[idw] = l;
                        } else {
                            var mask = (0xffffffff|0) << nShift;
                            this.adw[idw] = (this.adw[idw] & ~mask) | (l << nShift);
                            idw++;
                            this.adw[idw] = (this.adw[idw] & mask) | (l >>> (32 - nShift));
                        }
                    }
                    this.fDirty = true;
                },
                /**
                 * readByteChecked(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readByteChecked: function readByteChecked(off, addr) {
                    if (DEBUGGER && this.dbg) this.dbg.checkMemoryRead(addr);
                    return this.readByteDirect(off, addr);
                },
                /**
                 * readShortChecked(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortChecked: function readShortChecked(off, addr) {
                    if (DEBUGGER && this.dbg) {
                        this.dbg.checkMemoryRead(addr) ||
                        this.dbg.checkMemoryRead(addr + 1);
                    }
                    return this.readShortDirect(off, addr);
                },
                /**
                 * readLongChecked(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongChecked: function readLongChecked(off, addr) {
                    if (DEBUGGER && this.dbg) {
                        this.dbg.checkMemoryRead(addr) ||
                        this.dbg.checkMemoryRead(addr + 1) ||
                        this.dbg.checkMemoryRead(addr + 2) ||
                        this.dbg.checkMemoryRead(addr + 3);
                    }
                    return this.readLongDirect(off, addr);
                },
                /**
                 * writeByteChecked(off, b, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @param {number} b
                 */
                writeByteChecked: function writeByteChecked(off, b, addr) {
                    if (DEBUGGER && this.dbg) this.dbg.checkMemoryWrite(addr);
                    if (this.fReadOnly) this.writeNone(off, b, addr); else this.writeByteDirect(off, b, addr);
                },
                /**
                 * writeShortChecked(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @param {number} w
                 */
                writeShortChecked: function writeShortChecked(off, w, addr) {
                    if (DEBUGGER && this.dbg) {
                        this.dbg.checkMemoryWrite(addr) ||
                        this.dbg.checkMemoryWrite(addr + 1);
                    }
                    if (this.fReadOnly) this.writeNone(off, w, addr); else this.writeShortDirect(off, w, addr);
                },
                /**
                 * writeLongChecked(off, l, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} l
                 * @param {number} addr
                 */
                writeLongChecked: function writeLongChecked(off, l, addr) {
                    if (DEBUGGER && this.dbg) {
                        this.dbg.checkMemoryWrite(this.addr + off) ||
                        this.dbg.checkMemoryWrite(this.addr + off + 1) ||
                        this.dbg.checkMemoryWrite(this.addr + off + 2) ||
                        this.dbg.checkMemoryWrite(this.addr + off + 3);
                    }
                    if (this.fReadOnly) this.writeNone(off, l, addr); else this.writeLongDirect(off, l, addr);
                },
                /**
                 * readBytePaged(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readBytePaged: function readBytePaged(off, addr) {
                    this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                    this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
                    return this.blockPhys.readByte(off, addr);
                },
                /**
                 * readShortPaged(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortPaged: function readShortPaged(off, addr) {
                    this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                    this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
                    return this.blockPhys.readShort(off, addr);
                },
                /**
                 * readLongPaged(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongPaged: function readLongPaged(off, addr) {
                    this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                    this.blockPTE.adw[this.iPTE] |= this.bitPTEAccessed;
                    return this.blockPhys.readLong(off, addr);
                },
                /**
                 * writeBytePaged(off, b, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} b
                 * @param {number} addr
                 */
                writeBytePaged: function writeBytePaged(off, b, addr) {
                    this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                    this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
                    this.blockPhys.writeByte(off, b, addr);
                },
                /**
                 * writeShortPaged(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} w
                 * @param {number} addr
                 */
                writeShortPaged: function writeShortPaged(off, w, addr) {
                    this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                    this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
                    this.blockPhys.writeShort(off, w, addr);
                },
                /**
                 * writeLongPaged(off, l, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} l
                 * @param {number} addr
                 */
                writeLongPaged: function writeLongPaged(off, l, addr) {
                    this.blockPDE.adw[this.iPDE] |= this.bitPTEAccessed;
                    this.blockPTE.adw[this.iPTE] |= this.bitPTEDirty;
                    this.blockPhys.writeLong(off, l, addr);
                },
                /**
                 * readByteUnpaged(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readByteUnpaged: function readByteUnpaged(off, addr) {
                    return this.getPageBlock(addr, false).readByte(off, addr);
                },
                /**
                 * readShortUnpaged(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortUnpaged: function readShortUnpaged(off, addr) {
                    return this.getPageBlock(addr, false).readShort(off, addr);
                },
                /**
                 * readLongUnpaged(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongUnpaged: function readLongUnpaged(off, addr) {
                    return this.getPageBlock(addr, false).readLong(off, addr);
                },
                /**
                 * writeByteUnpaged(off, b, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} b
                 * @param {number} addr
                 */
                writeByteUnpaged: function writeByteUnpaged(off, b, addr) {
                    this.getPageBlock(addr, true).writeByte(off, b, addr);
                },
                /**
                 * writeShortUnpaged(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} w
                 * @param {number} addr
                 */
                writeShortUnpaged: function writeShortUnpaged(off, w, addr) {
                    this.getPageBlock(addr, true).writeShort(off, w, addr);
                },
                /**
                 * writeLongUnpaged(off, l, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} l
                 * @param {number} addr
                 */
                writeLongUnpaged: function writeLongUnpaged(off, l, addr) {
                    this.getPageBlock(addr, true).writeLong(off, l, addr);
                },
                /**
                 * readByteBigEndian(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readByteBigEndian: function readByteBigEndian(off, addr) {
                    Component.assert(off >= 0 && off < this.size);
                    return this.ab[off];
                },
                /**
                 * readByteLittleEndian(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readByteLittleEndian: function readByteLittleEndian(off, addr) {
                    Component.assert(off >= 0 && off < this.size);
                    return this.ab[off];
                },
                /**
                 * readShortBigEndian(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortBigEndian: function readShortBigEndian(off, addr) {
                    Component.assert(off >= 0 && off < this.size - 1);
                    return this.dv.getUint16(off, true);
                },
                /**
                 * readShortLittleEndian(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readShortLittleEndian: function readShortLittleEndian(off, addr) {
                    Component.assert(off >= 0 && off < this.size - 1);
                    /*
                     * TODO: It remains to be seen if there's any advantage to checking the offset
                     * for an aligned read vs. always reading the bytes separately; it seems a safe bet
                     * for longs, but it's less clear for shorts.
                     */
                    return (off & 0x1)? (this.ab[off] | (this.ab[off+1] << 8)) : this.aw[off >> 1];
                },
                /**
                 * readLongBigEndian(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongBigEndian: function readLongBigEndian(off, addr) {
                    Component.assert(off >= 0 && off < this.size - 3);
                    return this.dv.getInt32(off, true);
                },
                /**
                 * readLongLittleEndian(off, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @return {number}
                 */
                readLongLittleEndian: function readLongLittleEndian(off, addr) {
                    Component.assert(off >= 0 && off < this.size - 3);
                    /*
                     * TODO: It remains to be seen if there's any advantage to checking the offset
                     * for an aligned read vs. always reading the bytes separately; it seems a safe bet
                     * for longs, but it's less clear for shorts.
                     */
                    return (off & 0x3)? (this.ab[off] | (this.ab[off+1] << 8) | (this.ab[off+2] << 16) | (this.ab[off+3] << 24)) : this.adw[off >> 2];
                },
                /**
                 * writeByteBigEndian(off, b, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} b
                 * @param {number} addr
                 */
                writeByteBigEndian: function writeByteBigEndian(off, b, addr) {
                    Component.assert(off >= 0 && off < this.size);
                    this.ab[off] = b;
                    this.fDirty = true;
                },
                /**
                 * writeByteLittleEndian(off, b, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @param {number} b
                 */
                writeByteLittleEndian: function writeByteLittleEndian(off, b, addr) {
                    Component.assert(off >= 0 && off < this.size);
                    this.ab[off] = b;
                    this.fDirty = true;
                },
                /**
                 * writeShortBigEndian(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @param {number} w
                 */
                writeShortBigEndian: function writeShortBigEndian(off, w, addr) {
                    Component.assert(off >= 0 && off < this.size - 1);
                    this.dv.setUint16(off, w, true);
                    this.fDirty = true;
                },
                /**
                 * writeShortLittleEndian(off, w, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} addr
                 * @param {number} w
                 */
                writeShortLittleEndian: function writeShortLittleEndian(off, w, addr) {
                    Component.assert(off >= 0 && off < this.size - 1);
                    /*
                     * TODO: It remains to be seen if there's any advantage to checking the offset
                     * for an aligned write vs. always writing the bytes separately; it seems a safe bet
                     * for longs, but it's less clear for shorts.
                     */
                    if (off & 0x1) {
                        this.ab[off] = w;
                        this.ab[off+1] = w >> 8;
                    } else {
                        this.aw[off >> 1] = w;
                    }
                    this.fDirty = true;
                },
                /**
                 * writeLongBigEndian(off, l, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} l
                 * @param {number} addr
                 */
                writeLongBigEndian: function writeLongBigEndian(off, l, addr) {
                    Component.assert(off >= 0 && off < this.size - 3);
                    this.dv.setInt32(off, l, true);
                    this.fDirty = true;
                },
                /**
                 * writeLongLittleEndian(off, l, addr)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} l
                 * @param {number} addr
                 */
                writeLongLittleEndian: function writeLongLittleEndian(off, l, addr) {
                    Component.assert(off >= 0 && off < this.size - 3);
                    /*
                     * TODO: It remains to be seen if there's any advantage to checking the offset
                     * for an aligned write vs. always writing the bytes separately; it seems a safe bet
                     * for longs, but it's less clear for shorts.
                     */
                    if (off & 0x3) {
                        this.ab[off] = l;
                        this.ab[off+1] = (l >> 8);
                        this.ab[off+2] = (l >> 16);
                        this.ab[off+3] = (l >> 24);
                    } else {
                        this.adw[off >> 2] = l;
                    }
                    this.fDirty = true;
                },
                /**
                 * readBackTrackNone(off)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @return {number}
                 */
                readBackTrackNone: function readBackTrackNone(off) {
                    return 0;
                },
                /**
                 * writeBackTrackNone(off, bti)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} bti
                 */
                writeBackTrackNone: function writeBackTrackNone(off, bti) {
                },
                /**
                 * modBackTrackNone(fMod)
                 *
                 * @this {Memory}
                 * @param {boolean} fMod
                 */
                modBackTrackNone: function modBackTrackNone(fMod) {
                    return false;
                },
                /**
                 * readBackTrackIndex(off)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @return {number}
                 */
                readBackTrackIndex: function readBackTrackIndex(off) {
                    Component.assert(off >= 0 && off < this.size);
                    return this.abtIndexes[off];
                },
                /**
                 * writeBackTrackIndex(off, bti)
                 *
                 * @this {Memory}
                 * @param {number} off
                 * @param {number} bti
                 * @return {number} previous bti (0 if none)
                 */
                writeBackTrackIndex: function writeBackTrackIndex(off, bti) {
                    var btiPrev;
                    Component.assert(off >= 0 && off < this.size);
                    btiPrev = this.abtIndexes[off];
                    this.abtIndexes[off] = bti;
                    return btiPrev;
                },
                /**
                 * modBackTrackIndex(fMod)
                 *
                 * @this {Memory}
                 * @param {boolean} fMod
                 * @return {boolean} previous value
                 */
                modBackTrackIndex: function modBackTrackIndex(fMod) {
                    var fModPrev = this.fModBackTrack;
                    this.fModBackTrack = fMod;
                    return fModPrev;
                }
            };
            
            /*
             * This is the effective definition of afnNone, but we need not fully define it, because setAccess()
             * uses these defaults when any of the 6 handlers (ie, 3 read handlers and 3 write handlers) are undefined.
             *
            Memory.afnNone              = [Memory.prototype.readNone,        Memory.prototype.readShortDefault, Memory.prototype.readLongDefault, Memory.prototype.writeNone,        Memory.prototype.writeShortDefault, Memory.prototype.writeLongDefault];
             */
            
            Memory.afnNone              = [];
            Memory.afnMemory            = [Memory.prototype.readByteMemory,  Memory.prototype.readShortMemory,  Memory.prototype.readLongMemory,  Memory.prototype.writeByteMemory,  Memory.prototype.writeShortMemory,  Memory.prototype.writeLongMemory];
            Memory.afnChecked           = [Memory.prototype.readByteChecked, Memory.prototype.readShortChecked, Memory.prototype.readLongChecked, Memory.prototype.writeByteChecked, Memory.prototype.writeShortChecked, Memory.prototype.writeLongChecked];
            
            if (PAGEBLOCKS) {
                Memory.afnPaged         = [Memory.prototype.readBytePaged,   Memory.prototype.readShortPaged,   Memory.prototype.readLongPaged,   Memory.prototype.writeBytePaged,   Memory.prototype.writeShortPaged,   Memory.prototype.writeLongPaged];
                Memory.afnUnpaged       = [Memory.prototype.readByteUnpaged, Memory.prototype.readShortUnpaged, Memory.prototype.readLongUnpaged, Memory.prototype.writeByteUnpaged, Memory.prototype.writeShortUnpaged, Memory.prototype.writeLongUnpaged];
            }
            
            if (TYPEDARRAYS) {
                Memory.afnBigEndian     = [Memory.prototype.readByteBigEndian,    Memory.prototype.readShortBigEndian,    Memory.prototype.readLongBigEndian,    Memory.prototype.writeByteBigEndian,    Memory.prototype.writeShortBigEndian,    Memory.prototype.writeLongBigEndian];
                Memory.afnLittleEndian  = [Memory.prototype.readByteLittleEndian, Memory.prototype.readShortLittleEndian, Memory.prototype.readLongLittleEndian, Memory.prototype.writeByteLittleEndian, Memory.prototype.writeShortLittleEndian, Memory.prototype.writeLongLittleEndian];
            }
            
            if (typeof module !== 'undefined') module.exports = Memory;
            
          • messages.js
            /**
             * @fileoverview PCjs-specific message definitions.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-Dec-11
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /*
             * Components that previously used Debugger messages definitions by including:
             *
             *     var Debugger = require("./debugger");
             *
             * and using:
             *
             *      Debugger.MESSAGE.FOO
             *
             * must now instead include:
             *
             *      var Messages = require("./messages");
             *
             * and then replace all occurrences of "Debugger.MESSAGE.FOO" with "Messages.FOO".
             */
            
            var Messages = {
                CPU:        0x00000001,
                SEG:        0x00000002,
                DESC:       0x00000004,
                TSS:        0x00000008,
                INT:        0x00000010,
                FAULT:      0x00000020,
                BUS:        0x00000040,
                MEM:        0x00000080,
                PORT:       0x00000100,
                DMA:        0x00000200,
                PIC:        0x00000400,
                TIMER:      0x00000800,
                CMOS:       0x00001000,
                RTC:        0x00002000,
                C8042:      0x00004000,
                CHIPSET:    0x00008000,
                KEYBOARD:   0x00010000,
                KEYS:       0x00020000,
                VIDEO:      0x00040000,
                FDC:        0x00080000,
                HDC:        0x00100000,
                DISK:       0x00200000,
                SERIAL:     0x00400000,
                SPEAKER:    0x00800000,
                STATE:      0x01000000,
                MOUSE:      0x02000000,
                COMPUTER:   0x04000000,
                DOS:        0x08000000,
                DATA:       0x10000000,
                LOG:        0x20000000,
                WARN:       0x40000000,
                HALT:       0x80000000|0
            };
            
            if (typeof module !== 'undefined') module.exports = Messages;
            
          • mouse.js
            /**
             * @fileoverview Implements the PCjs Mouse component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jul-01
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var SerialPort  = require("./serialport");
                var State       = require("./state");
            }
            
            /**
             * Mouse(parmsMouse)
             *
             * The Mouse component has the following component-specific (parmsMouse) properties:
             *
             *      serial: the ID of the corresponding serial component
             *
             * Since the first version of this component supports ONLY emulation of the original Microsoft
             * serial mouse, a valid serial component ID is required.  It's possible that future versions
             * of this component may support other types of simulated hardware (eg, the Microsoft InPort
             * bus mouse adapter), or a virtual driver interface that would eliminate the need for any
             * intermediate hardware simulation (at the expense of writing an intermediate software layer or
             * virtual driver for each supported operating system).  However, those possibilities are extremely
             * unlikely in the near term.
             *
             * If the 'serial' property is specified, then communication will be established with the
             * SerialPort component, requesting access to the corresponding serial component ID.  If the
             * SerialPort component is not installed and/or the specified serial component ID is not present,
             * a configuration error will be reported.
             *
             * TODO: Just out of curiosity, verify that the Microsoft Bus Mouse used ports 0x23D and 0x23F,
             * because I saw Windows v1.01 probing those ports immediately prior to probing COM2 (and then COM1)
             * for a serial mouse.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsMouse
             */
            function Mouse(parmsMouse)
            {
                Component.call(this, "Mouse", parmsMouse, Mouse, Messages.MOUSE);
            
                this.idAdapter = parmsMouse['serial'];
                if (this.idAdapter) {
                    this.sAdapterType = "SerialPort";
                }
                this.setActive(false);
                this.fCaptured = this.fLocked = false;
            
                /*
                 * Initially, no video devices, and therefore no input devices, are attached.  initBus() will update aVideo,
                 * and powerUp() will update aInput.
                 */
                this.aVideo = [];
                this.aInput = [];
                this.setReady();
            }
            
            /*
             * From http://paulbourke.net/dataformats/serialmouse:
             *
             *      The old MicroSoft serial mouse, while no longer in general use, can be employed to provide a low cost input device,
             *      for example, coupling the internal mechanism to other moving objects. The serial protocol for the mouse is:
             *
             *          1200 baud, 7 bit, 1 stop bit, no parity.
             *
             *      The pinout of the connector follows the standard serial interface, as shown below:
             *
             *          Pin     Abbr    Description
             *          1       DCD     Data Carrier Detect
             *          2       RD      Receive Data            [serial data from mouse to host]
             *          3       TD      Transmit Data
             *          4       DTR     Data Terminal Ready     [used to provide positive voltage to mouse, plus reset/detection]
             *          5       SG      Signal Ground
             *          6       DSR     Data Set Ready
             *          7       RTS     Request To Send         [used to provide positive voltage to mouse]
             *          8       CTS     Clear To Send
             *          9       RI      Ring
             *
             *      Every time the mouse changes state (moved or button pressed) a three byte "packet" is sent to the serial interface.
             *      For reasons known only to the engineers, the data is arranged as follows, most notably the two high order bits for the
             *      x and y coordinates share the first byte with the button status.
             *
             *                      D6  D5  D4  D3  D2  D1  D0
             *          1st byte    1   LB  RB  Y7  Y6  X7  X6
             *          2nd byte    0   X5  X4  X3  X2  X1  X0
             *          3rd byte    0   Y5  Y4  Y3  Y2  Y1  Y0
             *
             *      where:
             *
             *          LB is the state of the left button, 1 = pressed, 0 = released.
             *          RB is the state of the right button, 1 = pressed, 0 = released
             *          X0-7 is movement of the mouse in the X direction since the last packet. Positive movement is toward the right.
             *          Y0-7 is movement of the mouse in the Y direction since the last packet. Positive movement is back, toward the user.
             *
             * From http://www.kryslix.com/nsfaq/Q.12.html:
             *
             *      The Microsoft serial mouse is the most popular 2-button mouse. It is supported by all major operating systems.
             *      The maximum tracking rate for a Microsoft mouse is 40 reports/second * 127 counts per report, in other words, 5080 counts
             *      per second. The most common range for mice is is 100 to 400 CPI (counts per inch) but can be up to 1000 CPI. A 100 CPI mouse
             *      can discriminate motion up to 50.8 inches/second while a 400 CPI mouse can only discriminate motion up to 12.7 inches/second.
             *
             *          9-pin  25-pin    Line    Comments
             *          shell  1         GND
             *          3      2         TD      Serial data from host to mouse (only for power)
             *          2      3         RD      Serial data from mouse to host
             *          7      4         RTS     Positive voltage to mouse
             *          8      5         CTS
             *          6      6         DSR
             *          5      7         SGND
             *          4      20        DTR     Positive voltage to mouse and reset/detection
             *
             *      To function correctly, both the RTS and DTR lines must be positive. DTR/DSR and RTS/CTS must NOT be shorted.
             *      RTS may be toggled negative for at least 100ms to reset the mouse. (After a cold boot, the RTS line is usually negative.
             *      This provides an automatic toggle when RTS is brought positive). When DTR is toggled the mouse should send a single byte
             *      (0x4D, ASCII 'M').
             *
             *      Serial data parameters: 1200bps, 7 data bits, 1 stop bit
             *
             *      Data is sent in 3 byte packets for each event (a button is pressed or released, or the mouse moves):
             *
             *                  D7  D6  D5  D4  D3  D2  D1  D0
             *          Byte 1  X   1   LB  RB  Y7  Y6  X7  X6
             *          Byte 2  X   0   X5  X4  X3  X2  X1  X0
             *          Byte 3  X   0   Y5  Y4  Y3  Y2  Y1  Y0
             *
             *      LB is the state of the left button (1 means down).
             *      RB is the state of the right button (1 means down).
             *      X7-X0 movement in X direction since last packet (signed byte).
             *      Y7-Y0 movement in Y direction since last packet (signed byte).
             *      The high order bit of each byte (D7) is ignored. Bit D6 indicates the start of an event, which allows the software to
             *      synchronize with the mouse.
             */
            
            Component.subclass(Mouse);
            
            Mouse.ID_SERIAL = 0x4D;
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {Mouse}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            Mouse.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.cmp = cmp;
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                /*
                 * Attach the Video component to the CPU, so that the CPU can periodically update
                 * the video display via updateVideo(), as cycles permit.
                 */
                for (var video = null; (video = cmp.getComponentByType("Video", video));) {
                    this.aVideo.push(video);
                }
            };
            
            /**
             * isActive()
             *
             * @this {Mouse}
             * @return {boolean} true if active, false if not
             */
            Mouse.prototype.isActive = function()
            {
                return this.fActive && (this.cpu? this.cpu.isRunning() : false);
            };
            
            /**
             * setActive(fActive)
             *
             * @this {Mouse}
             * @param {boolean} fActive is true if active, false if not
             */
            Mouse.prototype.setActive = function(fActive)
            {
                this.fActive = fActive;
                /*
                 * It's currently not possible to automatically lock the pointer outside the context of a user action
                 * (eg, a button or screen click), so this code is for naught.
                 *
                 *      if (this.aVideo.length) this.aVideo[0].notifyPointerActive(fActive);
                 *
                 * We now rely on similar code in clickMouse().
                 */
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {Mouse}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            Mouse.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data || !this.restore) {
                        this.reset();
                    } else {
                        if (!this.restore(data)) return false;
                    }
                    if (this.sAdapterType && !this.componentAdapter) {
                        var componentAdapter = null;
                        while ((componentAdapter = this.cmp.getComponentByType(this.sAdapterType, componentAdapter))) {
                            if (componentAdapter.attachMouse) {
                                this.componentAdapter = componentAdapter.attachMouse(this.idAdapter, this);
                                if (this.componentAdapter) {
                                    /*
                                     * It's possible that the SerialPort we've just attached to might want to bring us "up to speed"
                                     * on the adapter's state, which is why I envisioned a subsequent syncMouse() call.  And you would
                                     * want to do that as a separate call, not as part of attachMouse(), because componentAdapter
                                     * isn't set until attachMouse() returns.
                                     *
                                     * However, syncMouse() seems unnecessary, given that SerialPort initializes its MCR to an "inactive"
                                     * state, and even when restoring a previous state, if we've done our job properly, both SerialPort
                                     * and Mouse should be restored in sync, making any explicit attempt at sync'ing unnecessary (or so I hope).
                                     */
                                    // this.componentAdapter.syncMouse();
                                    break;
                                }
                            }
                        }
                        if (this.componentAdapter) {
                            this.aInput = [];       // ensure the input device array is empty before (re)filling it
                            for (var i = 0; i < this.aVideo.length; i++) {
                                var input = this.aVideo[i].getInput(this);
                                if (input) this.aInput.push(input);
                            }
                        } else {
                            Component.warning(this.id + ": " + this.sAdapterType + " " + this.idAdapter + " unavailable");
                        }
                    }
                    if (this.fActive) {
                        this.captureAll();
                    } else {
                        this.releaseAll();
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {Mouse}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            Mouse.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save? this.save() : true;
            };
            
            /**
             * reset()
             *
             * @this {Mouse}
             */
            Mouse.prototype.reset = function()
            {
                this.initState();
            };
            
            /**
             * save()
             *
             * This implements save support for the Mouse component.
             *
             * @this {Mouse}
             * @return {Object}
             */
            Mouse.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, this.saveState());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the Mouse component.
             *
             * @this {Mouse}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             */
            Mouse.prototype.restore = function(data)
            {
                return this.initState(data[0]);
            };
            
            /**
             * initState(data)
             *
             * @this {Mouse}
             * @param {Array} [data]
             * @return {boolean} true if successful, false if failure
             */
            Mouse.prototype.initState = function(data)
            {
                var i = 0;
                if (data === undefined) data = [false, -1, -1, 0, 0, false, false, 0];
                this.setActive(data[i++]);
                this.xMouse = data[i++];
                this.yMouse = data[i++];
                this.xDelta = data[i++];
                this.yDelta = data[i++];
                this.fButton1 = data[i++];      // FYI, we consider button1 to be the LEFT button
                this.fButton2 = data[i++];      // FYI, we consider button2 to be the RIGHT button
                this.bMCR = data[i];
                return true;
            };
            
            /**
             * saveState()
             *
             * @this {Mouse}
             * @return {Array}
             */
            Mouse.prototype.saveState = function()
            {
                var i = 0;
                var data = [];
                data[i++] = this.fActive;
                data[i++] = this.xMouse;
                data[i++] = this.yMouse;
                data[i++] = this.xDelta;
                data[i++] = this.yDelta;
                data[i++] = this.fButton1;
                data[i++] = this.fButton2;
                data[i] = this.bMCR;
                return data;
            };
            
            /**
             * notifyPointerLocked()
             *
             * @this {Mouse}
             * @param {boolean} fLocked
             */
            Mouse.prototype.notifyPointerLocked = function(fLocked)
            {
                this.fLocked = fLocked;
            };
            
            /**
             * captureAll()
             *
             * @this {Mouse}
             */
            Mouse.prototype.captureAll = function()
            {
                if (!this.fCaptured) {
                    for (var i = 0; i < this.aInput.length; i++) {
                        if (this.captureMouse(this.aInput[i])) this.fCaptured = true;
                    }
                }
            };
            
            /**
             * releaseAll()
             *
             * @this {Mouse}
             */
            Mouse.prototype.releaseAll = function()
            {
                if (this.fCaptured) {
                    for (var i = 0; i < this.aInput.length; i++) {
                        if (this.releaseMouse(this.aInput[i])) this.fCaptured = false;
                    }
                }
            };
            
            /**
             * captureMouse(control)
             *
             * NOTE: addEventListener() wasn't supported in Internet Explorer until IE9, but that's OK, because
             * IE9 is the oldest IE we support anyway (since versions prior to IE9 lack the necessary HTML5 support).
             *
             * @this {Mouse}
             * @param {Object} control from the HTML DOM (eg, the control for the simulated screen)
             * @return {boolean} true if event handlers were actually added, false if not
             */
            Mouse.prototype.captureMouse = function(control)
            {
                if (control) {
                    var mouse = this;
                    control.addEventListener(
                        'mousemove',
                        function onMouseMove(event) {
                            mouse.moveMouse(event);
                        },
                        false               // we'll specify false for the 'useCapture' parameter for now...
                    );
                    control.addEventListener(
                        'mousedown',
                        function onMouseDown(event) {
                            mouse.clickMouse(event.button, true);
                        },
                        false               // we'll specify false for the 'useCapture' parameter for now...
                    );
                    control.addEventListener(
                        'mouseup',
                        function onMouseUp(event) {
                            mouse.clickMouse(event.button, false);
                        },
                        false               // we'll specify false for the 'useCapture' parameter for now...
                    );
                    /*
                     * None of these tricks seemed to work for IE10, so I'm giving up hiding the browser's mouse pointer in IE for now.
                     *
                     *      control['style']['cursor'] = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjbQg61aAAAADUlEQVQYV2P4//8/IwAI/QL/+TZZdwAAAABJRU5ErkJggg=='), url('/versions/images/current/blank.cur'), none";
                     *
                     * Setting the cursor style to "none" may not be a standard, but it works in Safari, Firefox and Chrome, so that's pretty
                     * good for a non-standard!
                     *
                     * TODO: The reference to '/versions/images/current/blank.cur' is also problematic for anyone who might want
                     * to run this app from a different server, so think about that as well.
                     */
                    control['style']['cursor'] = "none";
                    return true;
                }
                return false;
            };
            
            /**
             * releaseMouse(control)
             *
             * TODO: Use removeEventListener() to clean up our handlers; since I'm currently using anonymous functions,
             * and since I'm not seeing any compelling reason to remove the handlers once they've been established, it's
             * less code to leave them in place.
             *
             * @this {Mouse}
             * @param {Object} control from the HTML DOM
             * @return {boolean} true if event handlers were actually released, false if not
             */
            Mouse.prototype.releaseMouse = function(control)
            {
                if (control) {
                    control['style']['cursor'] = "auto";
                }
                return false;
            };
            
            /**
             * moveMouse(event)
             *
             * MouseEvent objects contain, among other things, the following properties:
             *
             *      clientX
             *      clientY
             *
             * I've selected the above properties because they're widely supported, not because I need
             * client-area coordinates.  In fact, layerX and layerY are probably closer to what I really want,
             * but I don't think they're available in all browsers.  screenX and screenY would work as well.
             *
             * This is because all we care about are deltas.  We record clientX and clientY (as xMouse and yMouse)
             * merely to calculate xDelta and yDelta.
             *
             * @this {Mouse}
             * @param {Object} event object from a 'mousemove' event (specifically, a MouseEvent object)
             */
            Mouse.prototype.moveMouse = function(event)
            {
                if (this.isActive()) {
                    if (this.xMouse < 0 || this.yMouse < 0) {
                        this.xMouse = event.clientX;
                        this.yMouse = event.clientY;
                    }
                    if (this.fLocked) {
                        this.xDelta = event['movementX'] || event['mozMovementX'] || event['webkitMovementX'] || 0;
                        this.yDelta = event['movementY'] || event['mozMovementY'] || event['webkitMovementY'] || 0;
                    } else {
                        this.xDelta = event.clientX - this.xMouse;
                        this.yDelta = event.clientY - this.yMouse;
                    }
                    if (this.xDelta || this.yDelta) {
                        /*
                         * As sendPacket() indicates, any x and y coordinates we supply are for diagnostic purposes only.
                         * sendPacket() only cares about the xDelta and yDelta properties, which it then zeroes on completion.
                         */
                        this.sendPacket(null, event.clientX, event.clientY);
                    }
                    this.xMouse = event.clientX;
                    this.yMouse = event.clientY;
                }
            };
            
            /**
             * clickMouse(iButton, fDown)
             *
             * @this {Mouse}
             * @param {number} iButton is 0 for fButton1 (the LEFT button), 2 for fButton2 (the RIGHT button)
             * @param {boolean} fDown
             */
            Mouse.prototype.clickMouse = function(iButton, fDown)
            {
                if (this.isActive()) {
                    if (this.fLocked === false) {
                        /*
                         * If there's no support for automatic pointer locking in the Video component, then notifyPointerActive()
                         * will return false, and we will set fLocked to null, ensuring that we never attempt this again.
                         */
                        if (!this.aVideo.length || !this.aVideo[0].notifyPointerActive(true)) {
                            this.fLocked = null;
                        }
                    }
                    var sDiag = DEBUGGER? ("mouse button" + iButton + ' ' + (fDown? "dn" : "up")) : null;
                    switch (iButton) {
                    case 0:
                        if (this.fButton1 != fDown) {
                            this.fButton1 = fDown;
                            this.sendPacket(sDiag);
                        }
                        break;
                    case 2:
                        if (this.fButton2 != fDown) {
                            this.fButton2 = fDown;
                            this.sendPacket(sDiag);
                        }
                        break;
                    default:
                        break;
                    }
                }
            };
            
            /**
             * sendPacket(sDiag, xDiag, yDiag)
             *
             * If we're called, something changed.
             *
             * Let's review the 3-byte packet format:
             *
             *              D7  D6  D5  D4  D3  D2  D1  D0
             *      Byte 1  X   1   LB  RB  Y7  Y6  X7  X6
             *      Byte 2  X   0   X5  X4  X3  X2  X1  X0
             *      Byte 3  X   0   Y5  Y4  Y3  Y2  Y1  Y0
             *
             * @this {Mouse}
             * @param {string|null} [sDiag] diagnostic message
             * @param {number} [xDiag] original x-coordinate (optional; for diagnostic use only)
             * @param {number} [yDiag] original y-coordinate (optional; for diagnostic use only)
             */
            Mouse.prototype.sendPacket = function(sDiag, xDiag, yDiag)
            {
                var b1 = 0x40 | (this.fButton1? 0x20 : 0) | (this.fButton2? 0x10 : 0) | ((this.yDelta & 0xC0) >> 4) | ((this.xDelta & 0xC0) >> 6);
                var b2 = this.xDelta & 0x3F;
                var b3 = this.yDelta & 0x3F;
                if (this.messageEnabled(Messages.SERIAL)) {
                    this.printMessage((sDiag? (sDiag + ": ") : "") + (yDiag !== undefined? ("mouse (" + xDiag + "," + yDiag + "): ") : "") + "serial packet [" + str.toHexByte(b1) + "," + str.toHexByte(b2) + "," + str.toHexByte(b3) + "]", 0, true);
                }
                this.componentAdapter.sendRBR([b1, b2, b3]);
                this.xDelta = this.yDelta = 0;
            };
            
            /**
             * notifyMCR(bMCR)
             *
             * The SerialPort notifies us whenever SerialPort.MCR.DTR or SerialPort.MCR.RTS changes.
             *
             * During normal serial mouse operation, both RTS and DTR must be "positive".
             *
             * Setting RTS "negative" for 100ms resets the mouse.  Toggling DTR requests an identification byte (ID_SERIAL).
             *
             * NOTES: The above 3rd-party information notwithstanding, I've observed that Windows v1.01 initially writes 0x01
             * to the MCR (DTR on, RTS off), spins in a loop that reads the RBR (probably to avoid a bogus identification byte
             * sitting in the RBR), and then writes 0x0B to the MCR (DTR on, RTS on).  This last step is consistent with making
             * the mouse "active", but it is NOT consistent with "toggling DTR", so I conclude that a reset is ALSO sufficient
             * for sending the identification byte.  Right or wrong, this gets the ball rolling for Windows v1.01.
             *
             * @this {Mouse}
             * @param {number} bMCR
             */
            Mouse.prototype.notifyMCR = function(bMCR)
            {
                var fActive = ((bMCR & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) == (SerialPort.MCR.DTR | SerialPort.MCR.RTS));
                if (fActive) {
                    if (!this.fActive) {
                        var fIdentify = false;
                        if (!(this.bMCR & SerialPort.MCR.RTS)) {
                            this.reset();
                            this.printMessage("serial mouse reset");
                            fIdentify = true;
                        }
                        if (!(this.bMCR & SerialPort.MCR.DTR)) {
                            this.printMessage("serial mouse ID requested");
                            fIdentify = true;
                        }
                        if (fIdentify) {
                            /*
                             * HEADS UP: Everything I'd read about the (original) Microsoft Serial Mouse "reset" protocol says
                             * that the device sends a single byte (0x4D aka 'M').  It's not surprising to think that newer mice
                             * might send additional bytes, but you would think that newer mouse drivers (eg, MOUSE.COM v8.20)
                             * would always be able to deal with mice that sent only one byte.
                             *
                             * You would be wrong.  On an INT 0x33 reset, the v8.20 driver looks for an 'M', then it waits for
                             * another byte (0x42 aka 'B').  If it doesn't receive a 'B', it will accept another 'M'.  But if it
                             * receives something else (or nothing at all), it will spend a long time waiting for it, and then
                             * return an error.
                             *
                             * It's entirely possible that I've done something wrong and inadvertently "tricked" MOUSE.COM into
                             * using the wrong detection logic.  But given the other problems I've seen in MOUSE.COM v8.20, including
                             * its failure to properly terminate-and-stay-resident when its initial INT 0x33 reset returns an error,
                             * I'm not in the mood to give it the benefit of the doubt.
                             *
                             * So, anyway, I solve the terminate-and-stay-resident bug in MOUSE.COM v8.20 by feeding it *two* ID_SERIAL
                             * bytes on a reset.  This doesn't seem to adversely affect serial mouse emulation for Windows 1.01, so
                             * I'm calling this good enough for now.
                             */
                            this.componentAdapter.sendRBR([Mouse.ID_SERIAL, Mouse.ID_SERIAL]);
                            this.printMessage("serial mouse ID sent");
                        }
                        this.captureAll();
                        this.setActive(fActive);
                    }
                } else {
                    if (this.fActive) {
                        /*
                         * Although this would seem nice (ie, for the Windows v1.01 mouse driver to turn RTS off when its mouse
                         * driver shuts down and Windows exits, since it DID turn RTS on), that doesn't appear to actually happen.
                         * At the very least, Windows will have (re)masked the serial port's IRQ, so what does it matter?  Not much,
                         * I just would have preferred that fActive properly reflect whether we should continue dispatching mouse
                         * events, displaying MOUSE messages, etc.
                         *
                         * We could ask the ChipSet component to notify the SerialPort component whenever its IRQ is masked/unmasked,
                         * and then have the SerialPort pass that notification on to us, but I'm assuming that in the real world,
                         * a mouse device that's still powered may still send event data to the serial port, and if there was software
                         * polling the serial port, it might expect to see that data.  Unlikely, but not impossible.
                         */
                        this.printMessage("serial mouse inactive");
                        this.releaseAll();
                        this.setActive(fActive);
                    }
                }
                this.bMCR = bMCR;
            };
            
            /**
             * Mouse.init()
             *
             * This function operates on every HTML element of class "mouse", extracting the
             * JSON-encoded parameters for the Mouse constructor from the element's "data-value"
             * attribute, invoking the constructor to create a Mouse component, and then binding
             * any associated HTML controls to the new component.
             */
            Mouse.init = function()
            {
                var aeMouse = Component.getElementsByClass(window.document, PCJSCLASS, "mouse");
                for (var iMouse = 0; iMouse < aeMouse.length; iMouse++) {
                    var eMouse = aeMouse[iMouse];
                    var parmsMouse = Component.getComponentParms(eMouse);
                    var mouse = new Mouse(parmsMouse);
                    Component.bindComponentControls(mouse, eMouse, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every Mouse module on the page.
             */
            web.onInit(Mouse.init);
            
            if (typeof module !== 'undefined') module.exports = Mouse;
            
          • nodebugger.js
            /**
             * @fileoverview Compile-time definitions for Debugger-less configurations.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-08
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /*
             * WARNING: DEBUGGER needs to accurately reflect whether or not the Debugger component is (or will be) loaded.
             * In the compiled case, we rely on the Closure Compiler to override DEBUGGER as appropriate.  When it's *false*,
             * nearly all of debugger.js will be conditionally removed by the compiler, reducing it to little more than a
             * "type skeleton", which also solves some type-related warnings we would otherwise have if we tried to remove
             * debugger.js from the compilation process altogether.
             *
             * However, when we're in "development mode" and running uncompiled code in debugger-less configurations,
             * I would still like to skip loading debugger.js altogether.  To do that, we must arrange for this additional file,
             * nodebugger.js, to be loaded as early as possible, which explicitly UPDATES the value of DEBUGGER to false.
             */
            var DEBUGGER = false;
            
          • panel.js
            /**
             * @fileoverview Implements the PCjs Panel component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-19
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var usr         = require("../../shared/lib/usrlib");
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Bus         = require("./bus");
                var Memory      = require("./memory");
                var X86         = require("./x86");
            }
            
            /**
             * Panel(parmsPanel)
             *
             * The Panel component has no required (parmsPanel) properties.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsPanel
             */
            function Panel(parmsPanel)
            {
                Component.call(this, "Panel", parmsPanel, Panel);
            
                this.canvas = null;
                this.lockMouse = -1;
                this.fMouseDown = false;
                this.xMouse = this.yMouse = -1;
                if (BACKTRACK) {
                    this.busInfo = null;
                    this.fBackTrack = false;
                }
            }
            
            Component.subclass(Panel);
            
            /*
             * The "Live" canvases that we create internally have the following fixed dimensions, to make drawing
             * simpler.  We then render, via drawImage(), these canvases onto the supplied canvas, which will automatically
             * stretch the live images to fit.
             */
            Panel.LIVECANVAS = {
                CX:         1280,
                CY:         720,
                FONT:       {
                    CY:     18,
                    FACE:   "Monaco, Lucida Console, Courier New"
                }
            };
            
            Panel.LIVEMEM = {
                CX: (Panel.LIVECANVAS.CX * 3) >> 2,
                CY: (Panel.LIVECANVAS.CY)
            };
            
            Panel.LIVEREGS = {
                CX:     (Panel.LIVECANVAS.CX - Panel.LIVEMEM.CX),
                CY:     (Panel.LIVECANVAS.CY),
                COLOR:  "black"
            };
            
            Panel.LIVEDUMP = {
                CX: (Panel.LIVECANVAS.CX - Panel.LIVEMEM.CX),
                CY: (Panel.LIVECANVAS.CY >> 1)
            };
            
            /*
             * findRegions() records block numbers in bits 0-14, a BackTrack "mod" bit in bit 15, and the block type at bit 16.
             */
            Panel.REGION = {
                MASK:           0x7fff,
                BTMOD_SHIFT:    15,
                TYPE_SHIFT:     16
            };
            
            /**
             * Color(r, g, b, a)
             *
             * @constructor
             * @param {number} [r]
             * @param {number} [g]
             * @param {number} [b]
             * @param {number} [a]
             */
            function Color(r, g, b, a)
            {
                this.rgb = [r, g, b, a];
                this.sValue = null;
                if (r === undefined) this.randomize();
            }
            
            /**
             * getRandom(nLimit)
             *
             * @this {Color}
             * @param {number} [nLimit]
             */
            Color.prototype.getRandom = function(nLimit)
            {
                return (Math.random() * (nLimit || 0x100)) | 0;
            };
            
            /**
             * randomize()
             *
             * @this {Color}
             */
            Color.prototype.randomize = function()
            {
                this.rgb[0] = this.getRandom(); this.rgb[1] = this.getRandom(); this.rgb[2] = this.getRandom(); this.rgb[3] = 0xff;
                this.sValue = null;
            };
            
            /**
             * toString()
             *
             * @this {Color}
             * @return {string}
             */
            Color.prototype.toString = function()
            {
                if (!this.sValue) this.sValue = '#' + str.toHex(this.rgb[0], 2) + str.toHex(this.rgb[1], 2) + str.toHex(this.rgb[2], 2);
                return this.sValue;
            };
            
            /**
             * Rectangle(x, y, cx, cy)
             *
             * @constructor
             * @param {number} x
             * @param {number} y
             * @param {number} cx
             * @param {number} cy
             */
            function Rectangle(x, y, cx, cy)
            {
                this.x = x;
                this.y = y;
                this.cx = cx;
                this.cy = cy;
            }
            
            /**
             * contains(x, y)
             *
             * @param {number} x
             * @param {number} y
             * @return {boolean} true if (x,y) lies within the rectangle, false if not
             */
            Rectangle.prototype.contains = function(x, y)
            {
                return (x >= this.x && x < this.x + this.cx && y >= this.y && y < this.y + this.cy);
            };
            
            /**
             * subDivide(units, unitsTotal, fHorizontal)
             *
             * Return a new rectangle that is a subset of the current rectangle, based on the ratio of
             * units to unitsTotal, and then update the dimensions of the current rectangle.  Whether the
             * original rectangle is divided horizontally or vertically is entirely arbitrary; currently,
             * the criteria is horizontal if the ratio is 1/4 or more, vertical otherwise.
             *
             * @this {Rectangle}
             * @param {number} units
             * @param {number} unitsTotal
             * @param {boolean} [fHorizontal]
             * @return {Rectangle}
             */
            Rectangle.prototype.subDivide = function(units, unitsTotal, fHorizontal)
            {
                var rect;
                if (fHorizontal === undefined) {
                    fHorizontal = units >= (unitsTotal >> 2);
                }
                if (fHorizontal) {
                    rect = new Rectangle(this.x, this.y, this.cx, ((this.cy * units) / unitsTotal) | 0);
                    this.y += rect.cy;
                    this.cy -= rect.cy;
                    Component.assert(this.cy >= 0);
                } else {
                    rect = new Rectangle(this.x, this.y, ((this.cx * units) / unitsTotal) | 0, this.cy);
                    this.x += rect.cx;
                    this.cx -= rect.cx;
                    Component.assert(this.cx >= 0);
                }
                return rect;
            };
            
            /**
             * drawWith(context, color)
             *
             * @param {Object} context
             * @param {Color|string} [color]
             */
            Rectangle.prototype.drawWith = function(context, color)
            {
                if (!color) color = new Color();
                context.strokeStyle = "black";
                context.strokeRect(this.x, this.y, this.cx, this.cy);
                context.fillStyle = (typeof color == "string"? color : color.toString());
                context.fillRect(this.x, this.y, this.cx, this.cy);
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * Most panel layouts don't have bindings of their own, so we pass along all binding requests to the
             * Computer, CPU, Keyboard and Debugger components first.  The order shouldn't matter, since any component
             * that doesn't recognize the specified binding should simply ignore it.
             *
             * @this {Panel}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            Panel.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                if (this.cmp && this.cmp.setBinding(sHTMLType, sBinding, control)) return true;
                if (this.cpu && this.cpu.setBinding(sHTMLType, sBinding, control)) return true;
                if (this.kbd && this.kbd.setBinding(sHTMLType, sBinding, control)) return true;
                if (DEBUGGER && this.dbg && this.dbg.setBinding(sHTMLType, sBinding, control)) return true;
            
                if (!this.canvas && sHTMLType == "canvas") {
            
                    var panel = this;
                    var fPanel = false;
            
                    if (BACKTRACK && sBinding == "btpanel") {
                        this.fBackTrack = fPanel = true;
                    }
            
                    if (fPanel) {
                        this.canvas = control;
                        this.context = this.canvas.getContext("2d");
            
                        /*
                         * Employ the same gross onresize() hack for IE9/IE10 that we had to use for the Video canvas
                         */
                        if (web.getUserAgent().indexOf("MSIE") >= 0) {
                            this.canvas.onresize = function(canvas, cx, cy) {
                                return function onResizeVideo() {
                                    canvas.style.height = (((canvas.clientWidth * cy) / cx) | 0) + "px";
                                };
                            }(this.canvas, this.canvas.width, this.canvas.height);
                            this.canvas.onresize();
                        }
            
                        this.xMem = this.yMem = 0;
                        this.cxMem = ((this.canvas.width * Panel.LIVEMEM.CX) / Panel.LIVECANVAS.CX) | 0;
                        this.cyMem = this.canvas.height;
            
                        this.xReg = this.cxMem;
                        this.yReg = 0;
                        this.cxReg = this.canvas.width - this.cxMem;
                        this.cyReg = this.canvas.height;
            
                        this.xDump = this.xReg;
                        this.yDump = ((this.canvas.height * (Panel.LIVEREGS.CY - Panel.LIVEDUMP.CY)) / Panel.LIVECANVAS.CY) | 0;
                        this.cxDump = this.cxReg;
                        this.cyDump = ((this.canvas.height * Panel.LIVEDUMP.CY) / Panel.LIVECANVAS.CY) | 0;
            
                        this.canvasLiveMem = window.document.createElement("canvas");
                        this.canvasLiveMem.width = Panel.LIVEMEM.CX;
                        this.canvasLiveMem.height = Panel.LIVEMEM.CY;
                        this.contextLiveMem = this.canvasLiveMem.getContext("2d");
                        this.imageLiveMem = this.contextLiveMem.createImageData(this.canvasLiveMem.width, this.canvasLiveMem.height);
            
                        this.canvasLiveRegs = window.document.createElement("canvas");
                        this.canvasLiveRegs.width = Panel.LIVEREGS.CX;
                        this.canvasLiveRegs.height = Panel.LIVEREGS.CY;
                        this.contextLiveRegs = this.canvasLiveRegs.getContext("2d");
            
                        this.canvas.addEventListener(
                            'mousemove',
                            function onMouseMove(event) {
                                panel.moveMouse(event);
                            },
                            false               // we'll specify false for the 'useCapture' parameter for now...
                        );
                        this.canvas.addEventListener(
                            'mousedown',
                            function onMouseDown(event) {
                                panel.clickMouse(event, true);
                            },
                            false               // we'll specify false for the 'useCapture' parameter for now...
                        );
                        this.canvas.addEventListener(
                            'mouseup',
                            function onMouseUp(event) {
                                panel.clickMouse(event, false);
                            },
                            false               // we'll specify false for the 'useCapture' parameter for now...
                        );
            
                        this.fRedraw = true;
                        return true;
                    }
                }
                return this.parent.setBinding.call(this, sHTMLType, sBinding, control);
            };
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {Panel}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            Panel.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.cmp = cmp;
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.kbd = cmp.getComponentByType("Keyboard");
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {Panel}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            Panel.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) Panel.init();
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {Panel}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            Panel.prototype.powerDown = function(fSave, fShutdown)
            {
                return true;
            };
            
            /**
             * clickMouse(event, fDown)
             *
             * @this {Panel}
             * @param {Object} event object from a 'mousedown' or 'mouseup' event
             * @param {boolean} fDown
             */
            Panel.prototype.clickMouse = function(event, fDown)
            {
                /*
                 * event.button is 0 for the LEFT button and 2 for the RIGHT button
                 */
                if (!event.button) {
                    this.lockMouse = fDown? 0 : -1;
                    this.fMouseDown = fDown;
                    this.updateMouse(event, fDown);
                }
            };
            
            /**
             * moveMouse(event)
             *
             * @this {Panel}
             * @param {Object} event object from a 'mousemove' event
             */
            Panel.prototype.moveMouse = function(event)
            {
                this.updateMouse(event);
            };
            
            /**
             * updateMouse(event, fDown)
             *
             * MouseEvent objects contain, among other things, the following properties:
             *
             *      clientX
             *      clientY
             *
             * I've selected the above properties because they're widely supported, not because I need
             * client-area coordinates.  In fact, layerX and layerY are probably closer to what I really want,
             * but I don't think they're available in all browsers.  screenX and screenY would work as well.
             *
             * @this {Panel}
             * @param {Object} event object from a mouse event (specifically, a MouseEvent object)
             * @param {boolean} [fDown] is true or false if this was a click event, otherwise it's just a move event
             */
            Panel.prototype.updateMouse = function(event, fDown)
            {
                /*
                 * Due to the responsive nature of our pages, the displayed size of the canvas may be smaller than the
                 * allocated size, and the coordinates we receive from mouse events are based on the currently displayed size.
                 */
                var xScale = Panel.LIVECANVAS.CX / this.canvas.offsetWidth;
                var yScale = Panel.LIVECANVAS.CY / this.canvas.offsetHeight;
            
                var rect = this.canvas.getBoundingClientRect();
                var x = ((event.clientX - rect.left) * xScale) | 0;
                var y = ((event.clientY - rect.top) * yScale) | 0;
            
                if (fDown == null) {
                    if (!this.lockMouse) {
                        this.lockMouse = Math.abs(this.xMouse - x) > Math.abs(this.yMouse - y)? 1 : 2;
                    }
                    if (this.lockMouse == 1) {
                        y = this.yMouse;
                    } else if (this.lockMouse == 2) {
                        x = this.xMouse;
                    }
                }
            
                this.xMouse = x;
                this.yMouse = y;
            
                if (MAXDEBUG) this.log("Panel.moveMouse(" + x + "," + y + ")");
            
                if (x >= 0 && x < Panel.LIVECANVAS.CX && y >= 0 && y < Panel.LIVECANVAS.CY) {
                    /*
                     * Convert the mouse position into the corresponding memory address, assuming it's over the live memory area
                     */
                    var addr = this.findAddress(x, y);
                    if (addr !== X86.ADDR_INVALID) {
                        addr &= ~0xf;
                        if (addr != this.addrDumpLast) {
                            this.dumpMemory(addr, true);
                            this.addrDumpLast = addr;
                        }
                    }
                }
            };
            
            /**
             * findAddress(x, y)
             *
             * @this {Panel}
             * @param {number} x
             * @param {number} y
             * @return {number} address corresponding to (x,y) canvas coordinates, or ADDR_INVALID if none
             */
            Panel.prototype.findAddress = function(x, y)
            {
                if (x < Panel.LIVEMEM.CX && this.busInfo && this.busInfo.aRects) {
                    var i, rect;
                    for (i = 0; i < this.busInfo.aRects.length; i++) {
                        rect = this.busInfo.aRects[i];
                        if (rect.contains(x, y)) {
                            x -= rect.x;
                            y -= rect.y;
                            var region = this.busInfo.aRegions[i];
                            var iBlock = usr.getBitField(Bus.BlockInfo.num, this.busInfo.aBlocks[region.iBlock]);
                            var addr = iBlock * this.bus.nBlockSize;
                            var addrLimit = (iBlock + region.cBlocks) * this.bus.nBlockSize - 1;
            
                            /*
                             * If you want memory to be arranged "vertically" instead of "horizontally", do this:
                             *
                             *      if (x > 0) addr += rect.cy * (x - 1) * this.ratioMemoryToPixels;
                             *      addr += (y * this.ratioMemoryToPixels);
                             */
                            if (y > 0) addr += rect.cx * (y - 1) * this.ratioMemoryToPixels;
                            addr += (x * this.ratioMemoryToPixels);
            
                            addr |= 0;
                            if (addr > addrLimit) addr = addrLimit;
                            if (MAXDEBUG) this.log("Panel.findAddress(" + x + "," + y + ") found type " + Memory.TYPE.NAMES[region.type] + ", address %" + str.toHex(addr));
                            return addr;
                        }
                    }
                }
                return X86.ADDR_INVALID;
            };
            
            /**
             * updateAnimation()
             *
             * If the given Control Panel contains a canvas requiring animation (eg, "btpanel"), then this is where that happens.
             *
             * @this {Panel}
             */
            Panel.prototype.updateAnimation = function()
            {
                if (this.fRedraw) {
            
                    this.initPen(10, Panel.LIVECANVAS.FONT.CY, this.canvasLiveMem, this.contextLiveMem, this.canvas.style.color);
            
                    if (this.fBackTrack) {
                        if (DEBUG) this.log("begin scanMemory()");
                        this.busInfo = this.bus.scanMemory(this.busInfo);
                        /*
                         * Calculate the pixel-to-memory-address ratio
                         */
                        this.ratioMemoryToPixels = (this.busInfo.cBlocks * this.bus.nBlockSize) / (Panel.LIVEMEM.CX * Panel.LIVEMEM.CY);
                        /*
                         * Update the BusInfo object with region information (cRegions and aRegions); return true if region
                         * information has changed since the last call.
                         */
                        if (this.findRegions()) {
                            /*
                             * For each region, I choose a slice of the LiveMem canvas and record the corresponding rectangle
                             * within an aRects array (parallel to the aRegions array) in the BusInfo object.
                             *
                             * I don't need a sophisticated Treemap algorithm, because at this level, the data is not hierarchical.
                             * subDivide() makes a simple horizontal or vertical slicing decision based on the ratio of region blocks
                             * to remaining blocks.
                             */
                            var i, rect;
                            var rectAvail = new Rectangle(0, 0, this.canvasLiveMem.width, this.canvasLiveMem.height);
                            this.busInfo.aRects = [];
                            var cBlocksRemaining = this.busInfo.cBlocks;
            
                            for (i = 0; i < this.busInfo.cRegions; i++) {
                                var cBlocksRegion = this.busInfo.aRegions[i].cBlocks;
                                this.busInfo.aRects.push(rect = rectAvail.subDivide(cBlocksRegion, cBlocksRemaining, !i));
                                if (MAXDEBUG) this.log("region " + i + " rectangle: (" + rect.x + "," + rect.y + " " + rect.cx + "," + rect.cy + ")");
                                cBlocksRemaining -= cBlocksRegion;
                            }
            
                            /*
                             * Assert that not only did all the specified regions account for all the specified blocks, but also that
                             * the series of subDivide() calls exhausted the original rectangle to one of either zero width or zero height.
                             */
                            this.assert(!cBlocksRemaining && (!rectAvail.cx || !rectAvail.cy));
            
                            /*
                             * Now draw all the rectangles produced by the series of subDivide() calls.
                             */
                            for (i = 0; i < this.busInfo.aRects.length; i++) {
                                var region = this.busInfo.aRegions[i];
                                rect = this.busInfo.aRects[i];
                                rect.drawWith(this.contextLiveMem, Memory.TYPE.COLORS[region.type]);
                                this.centerPen(rect);
                                this.centerText(Memory.TYPE.NAMES[region.type] + " (" + (((region.cBlocks * this.bus.nBlockSize) / 1024) | 0) + "Kb)");
                            }
                        }
                        if (DEBUG) this.log("end scanMemory(): total bytes: " + this.busInfo.cbTotal + ", total blocks: " + this.busInfo.cBlocks + ", total regions: " + this.busInfo.cRegions);
                    } else {
                        this.drawText("This space intentionally left blank");
                    }
                    this.context.drawImage(this.canvasLiveMem, 0, 0, this.canvasLiveMem.width, this.canvasLiveMem.height, this.xMem, this.yMem, this.cxMem, this.cyMem);
                    this.fRedraw = false;
                }
            };
            
            /**
             * updateStatus()
             *
             * Update function for Control Panels containing DOM elements with low-frequencyxt display requirements.
             *
             * For the time being, the X86CPU component has its own updateStatus() handler, and displays all CPU registers itself.
             *
             * @this {Panel}
             */
            Panel.prototype.updateStatus = function()
            {
                if (this.canvas) {
                    this.dumpRegisters();
                }
            };
            
            /**
             * findRegions()
             *
             * This takes the BusInfo object produced by scanMemory() and adds the following:
             *
             *      cRegions:   number of contiguous memory regions
             *      aRegions:   array of aBlocks [index, count, type] objects
             *
             * It calls addRegion() for each discrete region (set of contiguous blocks with the same type) that it finds.
             *
             * @this {Panel}
             * @return {boolean} true if current region checksum differed from previous checksum (ie, one or more regions changed)
             */
            Panel.prototype.findRegions = function()
            {
                var checksum = 0;
                this.busInfo.cRegions = 0;
                if (!this.busInfo.aRegions) this.busInfo.aRegions = [];
            
                var typeRegion = -1, iBlockRegion = 0, addrRegion = 0, nBlockPrev = -1;
            
                for (var iBlock = 0; iBlock < this.busInfo.cBlocks; iBlock++) {
                    var blockInfo = this.busInfo.aBlocks[iBlock];
                    var typeBlock = usr.getBitField(Bus.BlockInfo.type, blockInfo);
                    var nBlockCurr = usr.getBitField(Bus.BlockInfo.num, blockInfo);
                    if (typeBlock != typeRegion || nBlockCurr != nBlockPrev + 1) {
                        var cBlocks = iBlock - iBlockRegion;
                        if (cBlocks) {
                            checksum += this.addRegion(addrRegion, iBlockRegion, cBlocks, typeRegion);
                        }
                        typeRegion = typeBlock;
                        iBlockRegion = iBlock;
                        addrRegion = nBlockCurr << this.bus.nBlockShift;
                    }
                    nBlockPrev = nBlockCurr;
                }
            
                checksum += this.addRegion(addrRegion, iBlockRegion, iBlock - iBlockRegion, typeRegion);
            
                var fChanged = (this.busInfo.checksumRegions != checksum);
                this.busInfo.checksumRegions = checksum;
                return fChanged;
            };
            
            /**
             * Region object definition
             *
             *  iBlock:     starting block number
             *  cBlocks:    number of blocks spanned by region
             *  type:       type of all blocks in the region (see Memory.TYPE.*)
             *
             * @typedef {{
             *  iBlock:     number,
             *  cBlocks:    number,
             *  type:       number
             * }}
             */
            var Region;
            
            /**
             * addRegion(addr, iBlock, cBlocks, type)
             *
             * @this {Panel}
             * @param {number} addr
             * @param {number} iBlock
             * @param {number} cBlocks
             * @param {number} type
             * @return {number} bitfield containing the above values (used for checksum)
             */
            Panel.prototype.addRegion = function(addr, iBlock, cBlocks, type)
            {
                if (DEBUG) this.log("region " + this.busInfo.cRegions + " (addr " + str.toHexLong(addr) + ", type " + Memory.TYPE.NAMES[type] + ") contains " + cBlocks + " blocks");
                this.busInfo.aRegions[this.busInfo.cRegions++] = {iBlock: iBlock, cBlocks: cBlocks, type: type};
                return usr.initBitFields(Bus.BlockInfo, iBlock, cBlocks, 0, type);
            };
            
            /**
             * dumpRegisters()
             *
             * Updates the live register portion of the panel.
             *
             * @this {Panel}
             */
            Panel.prototype.dumpRegisters = function()
            {
                if (this.context && this.canvasLiveRegs && this.contextLiveRegs) {
            
                    var x = 0, y = 0, cx = this.canvasLiveRegs.width, cy = this.canvasLiveRegs.height;
            
                    this.contextLiveRegs.fillStyle = Panel.LIVEREGS.COLOR;
                    this.contextLiveRegs.fillRect(x, y, cx, cy);
            
                    this.initPen(x + 10, y + Panel.LIVECANVAS.FONT.CY, this.canvasLiveRegs, this.contextLiveRegs, this.canvas.style.color);
                    this.initCols(3);
                    this.drawText("CPU");
                    this.drawText("Target");
                    this.drawText("Current");
                    this.skipLines();
                    this.drawText(this.cpu.model);
                    this.drawText(this.cpu.getSpeedTarget());
                    this.drawText(this.cpu.getSpeedCurrent());
                    this.skipLines(2);
                    this.initCols(8);
                    this.initNumberFormat(16, this.cpu.model < X86.MODEL_80386? 4 : 8);
                    this.drawText("AX", this.cpu.regEAX, 2);
                    this.drawText("DS", this.cpu.getDS(), 0, 1);
                    this.drawText("DX", this.cpu.regEDX, 2);
                    this.drawText("SI", this.cpu.regESI, 0, 1.5);
                    this.drawText("BX", this.cpu.regEBX, 2);
                    this.drawText("ES", this.cpu.getES(), 0, 1);
                    this.drawText("CX", this.cpu.regECX, 2);
                    this.drawText("DI", this.cpu.regEDI, 0, 1.5);
                    this.drawText("CS", this.cpu.getCS(), 2);
                    this.drawText("SS", this.cpu.getSS(), 0, 1);
                    this.drawText("IP", this.cpu.getIP(), 2);
                    this.drawText("SP", this.cpu.getSP(), 0, 1.5);
                    var regPS;
                    this.drawText("PS", regPS = this.cpu.getPS(), 2);
                    this.drawText("BP", this.cpu.regEBP, 0, 1.5);
                    if (this.cpu.model >= X86.MODEL_80386) {
                        this.drawText("FS", this.cpu.getFS(), 2);
                        this.drawText("CR0", this.cpu.regCR0, 0, 1);
                        this.drawText("GS", this.cpu.getGS(), 2);
                        this.drawText("CR3", this.cpu.regCR3, 0, 1.5);
                    }
                    this.initCols(9);
                    this.drawText("V" + ((regPS & X86.PS.OF)? 1 : 0));
                    this.drawText("D" + ((regPS & X86.PS.DF)? 1 : 0));
                    this.drawText("I" + ((regPS & X86.PS.IF)? 1 : 0));
                    this.drawText("T" + ((regPS & X86.PS.TF)? 1 : 0));
                    this.drawText("S" + ((regPS & X86.PS.SF)? 1 : 0));
                    this.drawText("Z" + ((regPS & X86.PS.ZF)? 1 : 0));
                    this.drawText("A" + ((regPS & X86.PS.AF)? 1 : 0));
                    this.drawText("P" + ((regPS & X86.PS.PF)? 1 : 0));
                    this.drawText("C" + ((regPS & X86.PS.CF)? 1 : 0), 0, 2);
            
                    this.dumpMemory(this.addrDumpLast);
            
                    this.context.drawImage(this.canvasLiveRegs, x, y, cx, cy, this.xReg, this.yReg, this.cxReg, this.cyReg);
                }
            };
            
            /**
             * dumpMemory(addr, fDraw)
             *
             * @this {Panel}
             * @param {number} addr
             * @param {boolean} [fDraw]
             */
            Panel.prototype.dumpMemory = function(addr, fDraw)
            {
                if (this.context && this.canvasLiveRegs && this.contextLiveRegs) {
            
                    var x = 0, y = Panel.LIVEREGS.CY - Panel.LIVEDUMP.CY, cx = this.canvasLiveRegs.width, cy = Panel.LIVEDUMP.CY;
            
                    this.contextLiveRegs.fillStyle = Panel.LIVEREGS.COLOR;
                    this.contextLiveRegs.fillRect(x, y, cx, cy);
            
                    this.initPen(x + 10, y + Panel.LIVECANVAS.FONT.CY, this.canvasLiveRegs, this.contextLiveRegs, this.canvas.style.color);
                    this.initCols(24);
                    if (addr == null) {
                        this.drawText("Mouse over memory to dump");
                    } else {
                        this.drawText(str.toHexLong(addr), null, 0, 1);
                        for (var iLine = 1; iLine <= 16; iLine++) {
                            var sChars = "";
                            for (var iCol = 1; iCol <= 8; iCol++) {
                                var b = this.bus.getByteDirect(addr++);
                                this.drawText(str.toHex(b, 2), null, 1);
                                sChars += (b >= 32 && b < 128? String.fromCharCode(b) : ".");
                            }
                            this.drawText(sChars, null, 0, 1);
                        }
                    }
            
                    if (fDraw) this.context.drawImage(this.canvasLiveRegs, x, y, cx, cy, this.xDump, this.yDump, this.cxDump, this.cyDump);
                }
            };
            
            /**
             * initPen(xLeft, yTop, canvas, context, sColor, cyFont, sFontFace)
             *
             * @this {Panel}
             * @param {number} xLeft
             * @param {number} yTop
             * @param {HTMLCanvasElement} [canvas]
             * @param {Object} [context]
             * @param {string} [sColor]
             * @param {number} [cyFont]
             * @param {string} [sFontFace]
             */
            Panel.prototype.initPen = function(xLeft, yTop, canvas, context, sColor, cyFont, sFontFace)
            {
                this.setPen(this.xLeftMargin = xLeft, yTop);
                this.heightText = this.heightDefault = cyFont || Panel.LIVECANVAS.FONT.CY;
                if (!sFontFace) sFontFace = this.fontDefault || (this.heightDefault + "px " + Panel.LIVECANVAS.FONT.FACE);
                this.fontText = this.fontDefault = sFontFace;
                if (canvas) {
                    this.canvasText = canvas;
                }
                if (context) {
                    this.contextText = context;
                    this.colorText = sColor || "white";
                }
            };
            
            /**
             * setPen(x, y)
             *
             * @this {Panel}
             * @param {number} x
             * @param {number} y
             */
            Panel.prototype.setPen = function(x, y)
            {
                this.xText = x;
                this.yText = y;
            };
            
            /**
             * centerPen(rect)
             *
             * @this {Panel}
             * @param {Rectangle} rect
             */
            Panel.prototype.centerPen = function(rect)
            {
                this.fontText = this.fontDefault;
                this.heightText = this.heightDefault;
                var x = rect.x + (rect.cx >> 1);
                var y = rect.y + (rect.cy >> 1);
                var maxText = rect.cy;
                if (rect.cx < rect.cy) {
                    maxText = rect.cx;
                    this.fVerticalText = true;
                    this.contextText.save();
                    this.contextText.translate(x, y);
                    this.contextText.rotate(-Math.PI/2);
                    x = y = 0;
                }
                if (maxText < this.heightText) {
                    this.heightText = maxText;
                    this.fontText = this.heightText + "px " + Panel.LIVECANVAS.FONT.FACE;
                }
                this.setPen(x, y);
            };
            
            /**
             * initCols(nCols)
             *
             * @this {Panel}
             * @param {number} nCols
             */
            Panel.prototype.initCols = function(nCols)
            {
                this.cxColumn = (this.canvasText.width / nCols) | 0;
            };
            
            /**
             * skipCols(nCols)
             *
             * @this {Panel}
             * @param {number} nCols
             */
            Panel.prototype.skipCols = function(nCols)
            {
                this.xText += this.cxColumn * nCols;
            };
            
            /**
             * skipLines(nLines)
             *
             * @this {Panel}
             * @param {number} [nLines]
             */
            Panel.prototype.skipLines = function(nLines)
            {
                this.xText = this.xLeftMargin;
                this.yText += (this.heightText + 2) * (nLines || 1);
            };
            
            /**
             * initNumberFormat(nBase, nDigits)
             *
             * @this {Panel}
             * @param {number} nBase
             * @param {number} nDigits
             */
            Panel.prototype.initNumberFormat = function(nBase, nDigits)
            {
                this.nDefaultBase = nBase;
                this.nDefaultDigits = nDigits;
            };
            
            /**
             * drawText(sText)
             *
             * @this {Panel}
             * @param {string} sText
             * @param {number|null} [nValue]
             * @param {number} [nColsSkip]
             * @param {number} [nLinesSkip]
             */
            Panel.prototype.drawText = function(sText, nValue, nColsSkip, nLinesSkip)
            {
                this.contextText.font = this.fontText;
                this.contextText.fillStyle = this.colorText;
                this.contextText.fillText(sText, this.xText, this.yText);
                this.xText += this.cxColumn;
                if (nValue != null) {
                    var sValue;
                    if (this.nDefaultBase != 16) {
                        sValue = nValue.toString();
                    } else {
                        sValue = this.nDefaultDigits < 8? "0x" : "";
                        sValue += str.toHex(nValue, this.nDefaultDigits);
                    }
                    this.contextText.fillText(sValue, this.xText, this.yText);
                    this.xText += this.cxColumn;
                }
                if (nColsSkip) this.skipCols(nColsSkip);
                if (nLinesSkip) this.skipLines(nLinesSkip);
            };
            
            /**
             * centerText(sText)
             *
             * To center text within a given Rectangle:
             *
             *      centerPen(rect)
             *      centerText(sText)
             *
             * centerPen() sets xLeft and yTop to the center of the specified rectangle, and centerText() calculates
             * the width of the text, adjusting the horizontal centering by its width and the vertical centering by the
             * default font height.  Then it calls drawText().
             *
             * @this {Panel}
             * @param {string} sText
             */
            Panel.prototype.centerText = function(sText)
            {
                this.contextText.font = this.fontText;
                var tm = this.contextText.measureText(sText);
                this.xText -= tm.width >> 1;
                this.yText += (this.heightText >> 1) - 2;
                this.drawText(sText);
                if (this.fVerticalText) {
                    this.contextText.restore();
                    this.fVerticalText = false;
                }
            };
            
            /**
             * Panel.init()
             *
             * This function operates on every HTML element of class "panel", extracting the
             * JSON-encoded parameters for the Panel constructor from the element's "data-value"
             * attribute, invoking the constructor to create a Panel component, and then binding
             * any associated HTML controls to the new component.
             *
             * NOTE: Unlike most other component init() functions, this one is designed to be
             * called multiple times: once at load time, so that we can binding our print()
             * function to the panel's output control ASAP, and again when the Computer component
             * is verifying that all components are ready and invoking their powerUp() functions.
             *
             * Our powerUp() method gives us a second opportunity to notify any components that
             * that might care (eg, CPU, Keyboard, and Debugger) that we have some controls they
             * might want to use.
             */
            Panel.init = function()
            {
                var fReady = false;
                var aePanels = Component.getElementsByClass(window.document, PCJSCLASS, "panel");
                for (var iPanel=0; iPanel < aePanels.length; iPanel++) {
                    var ePanel = aePanels[iPanel];
                    var parmsPanel = Component.getComponentParms(ePanel);
                    var panel = Component.getComponentByID(parmsPanel['id']);
                    if (!panel) {
                        fReady = true;
                        panel = new Panel(parmsPanel);
                    }
                    Component.bindComponentControls(panel, ePanel, PCJSCLASS);
                    if (fReady) panel.setReady();
                }
            };
            
            /*
             * Initialize every Panel module on the page.
             */
            web.onInit(Panel.init);
            
            if (typeof module !== 'undefined') module.exports = Panel;
            
          • ram.js
            /**
             * @fileoverview Implements the PCjs RAM component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-15
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Memory      = require("./memory");
                var ROM         = require("./rom");
            }
            
            /**
             * RAM(parmsRAM)
             *
             * The RAM component expects the following (parmsRAM) properties:
             *
             *      addr: starting physical address of RAM
             *      size: amount of RAM, in bytes (optional)
             *
             * NOTE: We make a note of the specified size, but no memory is initially allocated
             * for the RAM until the Computer component calls powerUp().
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsRAM
             */
            function RAM(parmsRAM)
            {
                Component.call(this, "RAM", parmsRAM, RAM);
            
                this.addrRAM = parmsRAM['addr'];
                this.sizeRAM = parmsRAM['size'];
                this.fTestRAM = parmsRAM['test'];
                this.fInstalled = (!!this.sizeRAM); // 0 is the default value for 'size' when none is specified
                this.fAllocated = false;
            }
            
            Component.subclass(RAM);
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {RAM}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            RAM.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.chipset = cmp.getComponentByType("ChipSet");
                this.setReady();
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {RAM}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            RAM.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    /*
                     * The Computer powers up the CPU last, at which point the X86 state is restored,
                     * which includes the Bus state, and since we use the Bus to allocate all our memory,
                     * memory contents are already restored for us, so we don't need the usual restore
                     * logic.  We just need to call reset(), to allocate memory for the RAM.
                     *
                    if (!data || !this.restore) {
                        this.reset();
                    } else {
                        if (!this.restore(data)) return false;
                    }
                     */
                    this.reset();
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {RAM}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            RAM.prototype.powerDown = function(fSave, fShutdown)
            {
                /*
                 * The Computer powers down the CPU first, at which point the X86 state is saved,
                 * which includes the Bus state, and since we use the Bus component to allocate all
                 * our memory, memory contents are already saved for us, so we don't need the usual
                 * save logic.
                 *
                return fSave && this.save ? this.save() : true;
                 */
                return true;
            };
            
            /**
             * reset()
             *
             * NOTE: When we were initialized, we were given an amount of INSTALLED memory (see sizeRAM above).
             * The ChipSet component, on the other hand, tells us how much SPECIFIED memory there is -- which,
             * like a real PC, may not match the amount of installed memory (due to either user error or perhaps
             * an attempt to prevent some portion of the installed memory from being used).
             *
             * However, since we're a virtual machine, we can defer allocation of RAM until we're able to query the
             * ChipSet component, and then allocate an amount of memory that matches the SPECIFIED memory, making
             * it easy to reconfigure the machine on the fly and prevent mismatches.
             *
             * But, we do that ONLY for the RAM instance configured with an addrRAM of 0x0000, and ONLY if that RAM
             * object was not given a specific size (see fInstalled).  If there are other RAM objects in the system,
             * they must necessarily specify a non-conflicting, non-zero start address, in which case their sizeRAM
             * value will never be affected by the ChipSet settings.
             *
             * @this {RAM}
             */
            RAM.prototype.reset = function()
            {
                if (!this.addrRAM && !this.fInstalled && this.chipset) {
                    var baseRAM = this.chipset.getSWMemorySize() * 1024;
                    if (this.sizeRAM && baseRAM != this.sizeRAM) {
                        this.bus.removeMemory(this.addrRAM, this.sizeRAM);
                        this.fAllocated = false;
                    }
                    this.sizeRAM = baseRAM;
                }
                if (!this.fAllocated && this.sizeRAM) {
                    if (this.bus.addMemory(this.addrRAM, this.sizeRAM, Memory.TYPE.RAM)) {
                        this.fAllocated = true;
            
                        this.status(Math.floor(this.sizeRAM / 1024) + "Kb allocated");
            
                        /*
                         * NOTE: I'm specifying MAXDEBUG for status() messages because I'm not yet sure I want these
                         * messages buried in the app, since they're seen only when a Control Panel is active.  Another
                         * and perhaps better alternative is to add "comment" attributes to the XML configuration file
                         * for these components, which the Computer component will display as it "powers up" components.
                         */
                        if (MAXDEBUG && this.fInstalled) this.status("specified size overrides SW1");
            
                        /*
                         * Memory with an ID of "ramCPQ" is reserved for built-in memory located just below the 16Mb
                         * boundary on Compaq DeskPro 386 machines.
                         *
                         * Technically, that memory is part of the first 1Mb of memory that also provides up to 640Kb
                         * of conventional memory (ie, memory below 1Mb).
                         *
                         * However, PCjs doesn't support individual memory allocations that (a) are discontiguous
                         * or (b) dynamically change location.  Components must simulate those features by performing
                         * a separate allocation for each starting address, and removing/adding memory allocations
                         * whenever their starting address changes.
                         *
                         * Therefore, a DeskPro 386's first 1Mb of physical memory is allocated by PCjs in two pieces,
                         * and the second piece must have an ID of "ramCPQ", triggering the additional allocation of
                         * Compaq-specific memory-mapped registers.
                         *
                         * See CompaqController for more details.
                         */
                        if (COMPAQ386) {
                            if (this.idComponent == "ramCPQ") {
                                this.controller = new CompaqController(this);
                                this.bus.addMemory(CompaqController.ADDR, 1, Memory.TYPE.CTRL, this.controller);
                            }
                        }
                    }
                }
                if (this.fAllocated) {
                    if (!this.fTestRAM) {
                        /*
                         * HACK: Set the word at 40:72 in the ROM BIOS Data Area (RBDA) to 0x1234 to bypass the ROM BIOS
                         * memory storage tests. See rom.js for all RBDA definitions.
                         */
                        if (MAXDEBUG) this.status("ROM BIOS memory test has been disabled");
                        this.bus.setShortDirect(ROM.BIOS.RESET_FLAG, ROM.BIOS.RESET_FLAG_WARMBOOT);
                    }
                    /*
                     * Don't add the "ramCPQ" memory to the CMOS total, because addCMOSMemory() will add it to the extended
                     * memory total, which will just confuse the Compaq BIOS.
                     */
                    if (!COMPAQ386 || this.idComponent != "ramCPQ") {
                        if (this.chipset) this.chipset.addCMOSMemory(this.addrRAM, this.sizeRAM);
                    }
                } else {
                    Component.error("No RAM allocated");
                }
            };
            
            /**
             * RAM.init()
             *
             * This function operates on every HTML element of class "ram", extracting the
             * JSON-encoded parameters for the RAM constructor from the element's "data-value"
             * attribute, invoking the constructor to create a RAM component, and then binding
             * any associated HTML controls to the new component.
             */
            RAM.init = function()
            {
                var aeRAM = Component.getElementsByClass(window.document, PCJSCLASS, "ram");
                for (var iRAM = 0; iRAM < aeRAM.length; iRAM++) {
                    var eRAM = aeRAM[iRAM];
                    var parmsRAM = Component.getComponentParms(eRAM);
                    var ram = new RAM(parmsRAM);
                    Component.bindComponentControls(ram, eRAM, PCJSCLASS);
                }
            };
            
            /**
             * CompaqController(ram)
             *
             * DeskPro 386 machines came with a minimum of 1Mb of RAM, which could be configured (via jumpers)
             * for 256Kb, 512Kb or 640Kb of conventional memory, starting at address 0x00000000, with the
             * remainder (768Kb, 512Kb, or 384Kb) accessible only at an address just below 0x01000000.  In PCjs,
             * this second chunk of RAM must be separately allocated, with an ID of "ramCPQ".
             *
             * The typical configuration was 640Kb of conventional memory, leaving 384Kb accessible at 0x00FA0000.
             * Presumably, the other configurations (256Kb and 512Kb) would leave 768Kb and 512Kb accessible at
             * 0x00F40000 and 0x00F80000, respectively.
             *
             * The DeskPro 386 also contained two memory-mapped registers at 0x80C00000.  The first is a write-only
             * mapping register that provides the ability to map the 128Kb at 0x00FE0000 to 0x000E0000, replacing
             * any ROMs in the range 0x000E0000-0x000FFFFF, and optionally write-protecting that 128Kb; internally,
             * this register corresponds to wMappings.
             *
             * The second register is a read-only diagnostics register that indicates jumper configuration and
             * parity errors; internally, this register corresponds to wSettings.
             *
             * To emulate the memory-mapped registers at 0x80C00000, the RAM component allocates a block at that
             * address using this custom controller once it sees an allocation for "ramCPQ".
             *
             * Later, when the addressibility of "ramCPQ" memory is altered, we record the blocks in all the
             * memory slots spanning 0x000E0000-0x000FFFFF, and then update those slots with the blocks from
             * 0x00FE0000-0x00FFFFFF.  Note that only the top 128Kb of "ramCPQ" addressibility is affected; the
             * rest of that memory, ranging anywhere from 256Kb to 640Kb, remains addressible at its original
             * location.  Compaq's CEMM and VDISK utilities were generally the only software able to access that
             * remaining memory (what Compaq refers to as "Compaq Built-in Memory").
             *
             * @constructor
             * @param {RAM} ram
             */
            function CompaqController(ram)
            {
                this.ram = ram;
                this.wMappings = CompaqController.MAPPINGS.DEFAULT;
                /*
                 * TODO: wSettings needs to reflect the actual amount of configured memory....
                 */
                this.wSettings = CompaqController.SETTINGS.DEFAULT;
                this.wRAMSetup = CompaqController.RAMSETUP.DEFAULT;
                this.aBlocksDst = null;
            }
            
            CompaqController.ADDR       = 0x80C00000|0;
            CompaqController.MAP_SRC    = 0x00FE0000;
            CompaqController.MAP_DST    = 0x000E0000;
            CompaqController.MAP_SIZE   = 0x00020000;
            
            /*
             * Bit definitions for the 16-bit write-only memory-mapping register (wMappings)
             *
             * NOTE: Although Compaq says the memory at %FE0000 is "relocated", it actually remains addressable
             * at %FE0000; it simply becomes addressable at %0E0000 as well, displacing any ROMs that used to be
             * addressable at %0E0000 through %0FFFFF.
             */
            CompaqController.MAPPINGS = {
                UNMAPPED:   0x0001,             // is this bit is CLEAR, the last 128Kb (at 0x00FE0000) is mapped to 0x000E0000
                READWRITE:  0x0002,             // if this bit is CLEAR, the last 128Kb (at 0x00FE0000) is read-only (ie, write-protected)
                RESERVED:   0xFFFC,             // the remaining 6 bits are reserved and should always be SET
                DEFAULT:    0xFFFF              // our default settings (no mapping, no write-protection)
            };
            
            /*
             * Bit definitions for the 16-bit read-only settings/diagnostics register (wSettings)
             *
             * SW1-7 and SW1-8 are mapped to bits 5 and 4 of wSettings, respectively, as follows:
             *
             *      SW1-7   SW1-8   Bit5    Bit4    Amount (of base memory provided by the Compaq 32-bit memory board)
             *      -----   -----   ----    ----    ------
             *        ON      ON      0       0     640Kb
             *        ON      OFF     0       1     Invalid
             *        OFF     ON      1       0     512Kb
             *        OFF     OFF     1       1     256Kb
             *
             * Other SW1 switches include:
             *
             *      SW1-1:  ON enables fail-safe timer
             *      SW1-2:  ON indicates 80387 coprocessor installed
             *      SW1-3:  ON sets memory from 0xC00000 to 0xFFFFFF (between 12 and 16 megabytes) non-cacheable
             *      SW1-4:  ON selects AUTO system speed (OFF selects HIGH system speed)
             *      SW1-5:  RESERVED (however, the system can read its state; see below)
             *      SW1-6:  Compaq Dual-Mode Monitor or Color Monitor (OFF selects Monochrome monitor other than Compaq)
             *
             * While SW1-7 and SW1-8 are connected to this memory-mapped register, other SW1 DIP switches are accessible
             * through the 8042 Keyboard Controller's KBC.INPORT register, as follows:
             *
             *      SW1-1:  TODO: Determine
             *      SW1-2:  ChipSet.KBC.INPORT.COMPAQ_NO80387 clear if ON, set (0x04) if OFF
             *      SW1-3:  TODO: Determine
             *      SW1-4:  ChipSet.KBC.INPORT.COMPAQ_HISPEED clear if ON, set (0x10) if OFF
             *      SW1-5:  ChipSet.KBC.INPORT.COMPAQ_DIP5OFF clear if ON, set (0x20) if OFF
             *      SW1-6:  ChipSet.KBC.INPORT.COMPAQ_NONDUAL clear if ON, set (0x40) if OFF
             */
            CompaqController.SETTINGS = {
                B0_PARITY:  0x0001,         // parity OK in byte 0
                B1_PARITY:  0x0002,         // parity OK in byte 1
                B2_PARITY:  0x0004,         // parity OK in byte 2
                B3_PARITY:  0x0008,         // parity OK in byte 3
                BASE_640KB: 0x0000,         // SW1-7,8: ON  ON   Bits 5,4: 00
                BASE_ERROR: 0x0010,         // SW1-7,8: ON  OFF  Bits 5,4: 01
                BASE_512KB: 0x0020,         // SW1-7,8: OFF ON   Bits 5,4: 10
                BASE_256KB: 0x0030,         // SW1-7,8: OFF OFF  Bits 5,4: 11
                /*
                 * TODO: The DeskPro 386/25 TechRef says bit 6 (0x40) is always set,
                 * but setting it results in memory configuration errors; review.
                 */
                ADDED_1MB:  0x0040,
                /*
                 * TODO: The DeskPro 386/25 TechRef says bit 7 (0x80) is always clear; review.
                 */
                PIGGYBACK:  0x0080,
                SYS_4MB:    0x0100,         // 4Mb on system board
                SYS_1MB:    0x0200,         // 1Mb on system board
                SYS_NONE:   0x0300,         // no memory on system board
                MODA_4MB:   0x0400,         // 4Mb on module A board
                MODA_1MB:   0x0800,         // 1Mb on module A board
                MODA_NONE:  0x0C00,         // no memory on module A board
                MODB_4MB:   0x1000,         // 4Mb on module B board
                MODB_1MB:   0x2000,         // 1Mb on module B board
                MODB_NONE:  0x3000,         // no memory on module B board
                MODC_4MB:   0x4000,         // 4Mb on module C board
                MODC_1MB:   0x8000,         // 1Mb on module C board
                MODC_NONE:  0xC000,         // no memory on module C board
                /*
                 * NOTE: It doesn't seem to matter to the ROM whether I set any of bits 8-15 or not....
                 */
                DEFAULT:    0x0A0F          // our default settings (ie, parity OK, 640Kb base memory, 1Mb system memory, 1Mb module A memory)
            };
            
            CompaqController.RAMSETUP = {
                SETUP:      0x000F,
                CACHE:      0x0040,
                RESERVED:   0xFFB0,
                DEFAULT:    0x0002          // our default settings (ie, 2Mb, cache disabled)
            };
            
            /**
             * readByte(off, addr)
             *
             * @this {Memory}
             * @param {number} off (relative to 0x80C00000)
             * @param {number} [addr]
             * @return {number}
             */
            CompaqController.readByte = function readCompaqControllerByte(off, addr)
            {
                var b = 0xff;
                if (off < 0x02) {
                    b = (off & 0x1)? (this.controller.wSettings >> 8) : (this.controller.wSettings & 0xff);
                }
                else if (off < 0x4) {
                    b = (off & 0x1)? (this.controller.wRAMSetup >> 8) : (this.controller.wRAMSetup & 0xff);
                }
                if (DEBUG) {
                    this.controller.ram.printMessage("CompaqController.readByte(" + str.toHexWord(off) + ") returned " + str.toHexByte(b), true, true);
                    if (MAXDEBUG && DEBUGGER && off >= 0x2) this.dbg.stopCPU();
                }
                return b;
            };
            
            /**
             * writeByte(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off (relative to 0x80C00000)
             * @param {number} b
             * @param {number} [addr]
             */
            CompaqController.writeByte = function writeCompaqControllerByte(off, b, addr)
            {
                var controller = this.controller;
            
                /*
                 * Check for write to 0x80C00000
                 */
                if (!off) {
                    if (b != (controller.wMappings & 0xff)) {
                        var bus = controller.ram.bus;
                        if (!(b & CompaqController.MAPPINGS.UNMAPPED)) {
                            if (!controller.aBlocksDst) {
                                controller.aBlocksDst = bus.getMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE);
                            }
                            /*
                             * You might think that the next three lines could ALSO be moved to the preceding IF,
                             * but it's possible for the write-protection feature to be enabled/disabled separately
                             * from the mapping feature.  We could avoid executing this code as well by checking the
                             * current read-write state, but this is an infrequent operation, so there's no point.
                             */
                            var aBlocks = bus.getMemoryBlocks(CompaqController.MAP_SRC, CompaqController.MAP_SIZE);
                            var type = (b & CompaqController.MAPPINGS.READWRITE)? Memory.TYPE.RAM : Memory.TYPE.ROM;
                            bus.setMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE, aBlocks, type);
                        }
                        else {
                            if (controller.aBlocksDst) {
                                bus.setMemoryBlocks(CompaqController.MAP_DST, CompaqController.MAP_SIZE, controller.aBlocksDst);
                                controller.aBlocksDst = null;
                            }
                        }
                        controller.wMappings = (controller.wMappings & ~0xff) | b;
                        if (MAXDEBUG && DEBUGGER) this.dbg.stopCPU();
                    }
                }
                /*
                 * Check for write to 0x80C00002
                 */
                else if (off == 0x2) {
                    controller.wRAMSetup = (controller.wRAMSetup & ~0xff) | b;
                    if (MAXDEBUG && DEBUGGER) this.dbg.stopCPU();
                }
                /*
                 * All bits in 0x80C00001 and 0x80C00003 are reserved, so we can simply ignore those writes.
                 */
                if (DEBUG) {
                    this.controller.ram.printMessage("CompaqController.writeByte(" + str.toHexWord(off) + "," + str.toHexByte(b) + ")", true, true);
                }
            };
            
            CompaqController.BUFFER = [null, 0];
            CompaqController.ACCESS = [CompaqController.readByte, null, null, CompaqController.writeByte, null, null];
            
            /**
             * getMemoryBuffer(addr)
             *
             * @this {CompaqController}
             * @param {number} addr
             * @return {Array} containing the buffer (and an offset within that buffer)
             */
            CompaqController.prototype.getMemoryBuffer = function(addr)
            {
                return CompaqController.BUFFER;
            };
            
            /**
             * getMemoryAccess()
             *
             * @this {CompaqController}
             * @return {Array.<function()>}
             */
            CompaqController.prototype.getMemoryAccess = function()
            {
                return CompaqController.ACCESS;
            };
            
            /*
             * Initialize all the RAM modules on the page.
             */
            web.onInit(RAM.init);
            
            if (typeof module !== 'undefined') module.exports = RAM;
            
          • rom.js
            /**
             * @fileoverview Implements the PCjs ROM component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-15
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var DumpAPI     = require("../../shared/lib/dumpapi");
                var Component   = require("../../shared/lib/component");
                var Memory      = require("./memory");
            }
            
            /**
             * ROM(parmsROM)
             *
             * The ROM component expects the following (parmsROM) properties:
             *
             *      addr: physical address of ROM
             *      size: amount of ROM, in bytes
             *      alias: physical alias address (null if none)
             *      file: name of ROM data file
             *      notify: ID of a component to notify once the ROM is in place (optional)
             *
             * NOTE: The ROM data will not be copied into place until the Bus is ready (see initBus()) AND the
             * ROM data file has finished loading (see onLoadROM()).
             *
             * Also, while the size parameter may seem redundant, I consider it useful to confirm that the ROM you received
             * is the ROM you expected.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsROM
             */
            function ROM(parmsROM)
            {
                Component.call(this, "ROM", parmsROM, ROM);
            
                this.abROM = null;
                this.addrROM = parmsROM['addr'];
                this.sizeROM = parmsROM['size'];
            
                /*
                 * The new 'alias' property can now be EITHER a single physical address (like 'addr') OR an array of
                 * physical addresses; eg:
                 *
                 *      [0xf0000,0xffff0000,0xffff8000]
                 *
                 * We could have overloaded 'addr' to accomplish the same thing, but I think it's better to have any
                 * aliased locations listed under a separate property.
                 *
                 * Most ROMs are not aliased, in which case the 'alias' property should have the default value of null.
                 */
                this.addrAlias = parmsROM['alias'];
            
                this.sFilePath = parmsROM['file'];
                this.sFileName = str.getBaseName(this.sFilePath);
            
                /*
                 * The 'notify' property can now (as of v1.18.2) contain an array of parameters that the notified
                 * component (typically Video) may use as it sees fit.  For example, the Video component is generally
                 * interested in knowing the offsets of specific font tables within the ROM, which used to be hard-coded
                 * when all we supported were a few specific IBM video cards, but that's no longer feasible as we move
                 * beyond the original handful of IBM cards.
                 *
                 * It's up to the notified component to decide how to interpret the parameters it receives, if any.
                 */
                this.idNotify = parmsROM['notify'];
                this.aNotifyParms = null;
                if (this.idNotify) {
                    var i = this.idNotify.indexOf('[');
                    if (i > 0) {
                        try {
                            this.aNotifyParms = eval(this.idNotify.substr(i));
                        } catch (e) {}
                        this.idNotify = this.idNotify.substr(0, i);
                    }
                }
                if (this.sFilePath) {
                    var sFileURL = this.sFilePath;
                    if (DEBUG) this.log('load("' + sFileURL + '")');
                    /*
                     * If the selected ROM file has a ".json" extension, then we assume it's pre-converted
                     * JSON-encoded ROM data, so we load it as-is; ditto for ROM files with a ".hex" extension.
                     * Otherwise, we ask our server-side ROM converter to return the file in a JSON-compatible format.
                     */
                    var sFileExt = str.getExtension(this.sFileName);
                    if (sFileExt != DumpAPI.FORMAT.JSON && sFileExt != DumpAPI.FORMAT.HEX) {
                        sFileURL = web.getHost() + DumpAPI.ENDPOINT + '?' + DumpAPI.QUERY.FILE + '=' + this.sFilePath + '&' + DumpAPI.QUERY.FORMAT + '=' + DumpAPI.FORMAT.BYTES + '&' + DumpAPI.QUERY.DECIMAL + '=true';
                    }
                    web.loadResource(sFileURL, true, null, this, ROM.prototype.onLoadROM);
                }
            }
            
            Component.subclass(ROM);
            
            /*
             * ROM BIOS Data Area (RBDA) definitions, in physical address form, using the same ALL-CAPS names
             * found in the original IBM PC ROM BIOS listing.  TODO: Fill in remaining RBDA holes.
             */
            ROM.BIOS = {
                RS232_BASE:     0x400,              // 4 (word) I/O addresses of RS-232 adapters
                PRINTER_BASE:   0x408,              // 4 (word) I/O addresses of printer adapters
                EQUIP_FLAG:     0x410,              // installed hardware (word)
                MFG_TEST:       0x412,              // initialization flag (byte)
                MEMORY_SIZE:    0x413,              // memory size in K-bytes (word)
                RESET_FLAG:     0x472               // set to 0x1234 if keyboard reset underway (word)
            };
            
            // RESET_FLAG is the traditional end of the RBDA, as originally defined at real-mode segment 0x40.
            
            ROM.BIOS.RESET_FLAG_WARMBOOT = 0x1234;  // value stored at ROM.BIOS.RESET_FLAG to indicate a "warm boot", bypassing memory tests
            
            /*
             * NOTE: There's currently no need for this component to have a reset() function, since
             * once the ROM data is loaded, it can't be changed, so there's nothing to reinitialize.
             *
             * OK, well, I take that back, because the Debugger, if installed, has the ability to modify
             * ROM contents, so in that case, having a reset() function that restores the original ROM data
             * might be useful; then again, it might not, depending on what you're trying to debug.
             *
             * If we do add reset(), then we'll want to change copyROM() to hang onto the original
             * ROM data; currently, we release it after copying it into the read-only memory allocated
             * via bus.addMemory().
             */
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {ROM}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            ROM.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.copyROM();
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {ROM}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            ROM.prototype.powerUp = function(data, fRepower)
            {
                if (this.aSymbols) {
                    if (this.dbg) {
                        this.dbg.addSymbols(this.addrROM, this.sizeROM, this.aSymbols);
                    }
                    /*
                     * Our only role in the handling of symbols is to hand them off to the Debugger at our
                     * first opportunity. Now that we've done that, our copy of the symbols, if any, are toast.
                     */
                    delete this.aSymbols;
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * Since we have nothing to do on powerDown(), and no state to return, we could simply omit
             * this function.  But it doesn't hurt anything, and maybe we'll use our state to save something
             * useful down the road, like user-defined symbols (ie, symbols that the Debugger may have
             * created, above and beyond those symbols we automatically loaded, if any, along with the ROM).
             *
             * @this {ROM}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            ROM.prototype.powerDown = function(fSave, fShutdown)
            {
                return true;
            };
            
            /**
             * onLoadROM(sROMFile, sROMData, nErrorCode)
             *
             * @this {ROM}
             * @param {string} sROMFile
             * @param {string} sROMData
             * @param {number} nErrorCode (response from server if anything other than 200)
             */
            ROM.prototype.onLoadROM = function(sROMFile, sROMData, nErrorCode)
            {
                if (nErrorCode) {
                    this.notice("Unable to load system ROM (error " + nErrorCode + ")");
                    return;
                }
                if (sROMData.charAt(0) == "[" || sROMData.charAt(0) == "{") {
                    try {
                        /*
                         * The most likely source of any exception will be here: parsing the JSON-encoded ROM data.
                         */
                        var rom = eval("(" + sROMData + ")");
                        var ab = rom['bytes'];
                        var adw = rom['data'];
            
                        if (ab) {
                            this.abROM = ab;
                        }
                        else if (adw) {
                            /*
                             * Convert all the DWORDs into BYTEs, so that subsequent code only has to deal with abROM.
                             */
                            this.abROM = new Array(adw.length * 4);
                            for (var idw = 0, ib = 0; idw < adw.length; idw++) {
                                this.abROM[ib++] = adw[idw] & 0xff;
                                this.abROM[ib++] = (adw[idw] >> 8) & 0xff;
                                this.abROM[ib++] = (adw[idw] >> 16) & 0xff;
                                this.abROM[ib++] = (adw[idw] >> 24) & 0xff;
                            }
                        }
                        else {
                            this.abROM = rom;
                        }
            
                        this.aSymbols = rom['symbols'];
            
                        if (!this.abROM.length) {
                            Component.error("Empty ROM: " + sROMFile);
                            return;
                        }
                        else if (this.abROM.length == 1) {
                            Component.error(this.abROM[0]);
                            return;
                        }
                    } catch (e) {
                        this.notice("ROM data error: " + e.message);
                        return;
                    }
                }
                else {
                    /*
                     * Parse the ROM data manually; we assume it's in "simplified" hex form (a series of hex byte-values
                     * separated by whitespace).
                     */
                    var sHexData = sROMData.replace(/\n/gm, " ").replace(/ +$/, "");
                    var asHexData = sHexData.split(" ");
                    this.abROM = new Array(asHexData.length);
                    for (var i = 0; i < asHexData.length; i++) {
                        this.abROM[i] = str.parseInt(asHexData[i], 16);
                    }
                }
                this.copyROM();
            };
            
            /**
             * copyROM()
             *
             * This function is called by both initBus() and onLoadROM(), but it cannot copy the the ROM data into place
             * until after initBus() has received the Bus component AND onloadROM() has received the abROM data.  When both
             * those criteria are satisfied, the component becomes "ready".
             *
             * @this {ROM}
             */
            ROM.prototype.copyROM = function()
            {
                if (!this.isReady()) {
                    if (!this.sFilePath) {
                        this.setReady();
                    }
                    else if (this.abROM && this.bus) {
                        if (this.abROM.length != this.sizeROM) {
                            /*
                             * Note that setError() sets the component's fError flag, which in turn prevents setReady() from
                             * marking the component ready.  TODO: Revisit this decision.  On the one hand, it sounds like a
                             * good idea to stop the machine in its tracks whenever a setError() occurs, but there may also be
                             * times when we'd like to forge ahead anyway.
                             */
                            this.setError("ROM size (" + str.toHexLong(this.abROM.length) + ") does not match specified size (" + str.toHexLong(this.sizeROM) + ")");
                        }
                        else if (this.addROM(this.addrROM)) {
            
                            var aliases = [];
                            if (typeof this.addrAlias == "number") {
                                aliases.push(this.addrAlias);
                            } else if (this.addrAlias != null && this.addrAlias.length) {
                                aliases = this.addrAlias;
                            }
                            for (var i = 0; i < aliases.length; i++) {
                                this.cloneROM(aliases[i]);
                            }
                            /*
                             * If there's a component we should notify, notify it now, and give it the internal byte array, so that
                             * it doesn't have to ask the CPU for the data.  Currently, the only component that uses this notification
                             * option is the Video component, and only when the associated ROM contains font data that it needs.
                             */
                            if (this.idNotify) {
                                var component = Component.getComponentByID(this.idNotify, this.id);
                                if (component) {
                                    component.onROMLoad(this.abROM, this.aNotifyParms);
                                } else {
                                    this.notice("Unable to find component: " + this.idNotify);
                                }
                            }
                            /*
                             * We used to hang onto the original ROM data so that we could restore any bytes the CPU overwrote,
                             * using memory write-notification handlers, but with the introduction of read-only memory blocks, that's
                             * no longer necessary.
                             *
                             * TODO: Consider an option to retain the ROM data, and give the user some way of restoring ROMs.
                             * That may be useful for "resumable" machines that save/restore all dirty block of memory, regardless
                             * whether they're ROM or RAM.  However, the only way to modify a machine's ROM is with the Debugger,
                             * and Debugger users should know better.
                             */
                            delete this.abROM;
                        }
                        this.setReady();
                    }
                }
            };
            
            /**
             * addROM(addr)
             *
             * @this {ROM}
             * @param {number} addr
             * @return {boolean}
             */
            ROM.prototype.addROM = function(addr)
            {
                if (this.bus.addMemory(addr, this.sizeROM, Memory.TYPE.ROM)) {
                    if (DEBUG) this.log("addROM(): copying ROM to " + str.toHexLong(addr) + " (" + str.toHexLong(this.abROM.length) + " bytes)");
                    var bto = null;
                    for (var off = 0; off < this.abROM.length; off++) {
                        this.bus.setByteDirect(addr + off, this.abROM[off]);
                        if (BACKTRACK) {
                            bto = this.bus.addBackTrackObject(this, bto, off);
                            this.bus.writeBackTrackObject(addr + off, bto, off);
                        }
                    }
                    return true;
                }
                /*
                 * We don't need to report an error here, because addMemory() already takes care of that.
                 */
                return false;
            };
            
            /**
             * cloneROM(addr)
             *
             * For ROMs with one or more alias addresses, we used to call addROM() for each address.  However,
             * that obviously wasted memory, since each alias was an independent copy, and if you used the
             * Debugger to edit the ROM in one location, the changes would not appear in the other location(s).
             *
             * Now that the Bus component provides low-level getMemoryBlocks() and setMemoryBlocks() methods
             * to manually get and set the blocks of any memory range, it is now possible to create true aliases.
             *
             * @this {ROM}
             * @param {number} addr
             */
            ROM.prototype.cloneROM = function(addr)
            {
                var aBlocks = this.bus.getMemoryBlocks(this.addrROM, this.sizeROM);
                this.bus.setMemoryBlocks(addr, this.sizeROM, aBlocks);
            };
            
            /**
             * ROM.init()
             *
             * This function operates on every HTML element of class "rom", extracting the
             * JSON-encoded parameters for the ROM constructor from the element's "data-value"
             * attribute, invoking the constructor to create a ROM component, and then binding
             * any associated HTML controls to the new component.
             */
            ROM.init = function()
            {
                var aeROM = Component.getElementsByClass(window.document, PCJSCLASS, "rom");
                for (var iROM = 0; iROM < aeROM.length; iROM++) {
                    var eROM = aeROM[iROM];
                    var parmsROM = Component.getComponentParms(eROM);
                    var rom = new ROM(parmsROM);
                    Component.bindComponentControls(rom, eROM, PCJSCLASS);
                }
            };
            
            /*
             * Initialize all the ROM modules on the page.
             */
            web.onInit(ROM.init);
            
            if (typeof module !== 'undefined') module.exports = ROM;
            
          • serialport.js
            /**
             * @fileoverview Implements the PCjs SerialPort component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jul-01
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var ChipSet     = require("./chipset");
                var State       = require("./state");
            }
            
            /**
             * SerialPort(parmsSerial)
             *
             * The SerialPort component has the following component-specific (parmsSerial) properties:
             *
             *      adapter: 1 (for port 0x3F8) or 2 (for port 0x2F8); 0 if not defined
             *
             * WARNING: Since the XSL file defines 'adapter' as a number, not a string, there's no need to
             * use parseInt(), and as an added benefit, we don't need to worry about whether a hex or decimal
             * format was used.
             *
             * This hard-coded approach mimics the original IBM PC Asynchronous Adapter configuration, which
             * contained a pair of "shunt modules" that allowed the user to select a port address of either
             * 0x3F8 ("Primary") or 0x2F8 ("Secondary").
             *
             * DOS typically names the Primary adapter "COM1" and the Secondary adapter "COM2", but I prefer
             * to stick to adapter numbers, since not all operating systems follow those naming conventions.
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsSerial
             */
            function SerialPort(parmsSerial) {
            
                this.iAdapter = parmsSerial['adapter'];
            
                switch (this.iAdapter) {
                case 1:
                    this.portBase = 0x3F8;
                    this.nIRQ = ChipSet.IRQ.COM1;
                    break;
                case 2:
                    this.portBase = 0x2F8;
                    this.nIRQ = ChipSet.IRQ.COM2;
                    break;
                default:
                    Component.warning("Unrecognized serial adapter #" + this.iAdapter);
                    return;
                }
            
                /**
                 * controlIOBuffer is a DOM element, if any, bound to the port (currently for output purposes only; see echoByte())
                 *
                 * @type {Object}
                 */
                this.controlIOBuffer = null;
            
                Component.call(this, "SerialPort", parmsSerial, SerialPort, Messages.SERIAL);
            
                Component.bindExternalControl(this, parmsSerial['binding'], SerialPort.sIOBuffer);
            }
            
            /*
             * class SerialPort
             * property {number} iAdapter
             * property {number} portBase
             * property {number} nIRQ
             * property {Object} controlIOBuffer is a DOM element, if any, bound to the port (for rudimentary output; see echoByte())
             *
             * NOTE: This class declaration started as a way of informing the code inspector of the controlIOBuffer property,
             * which remained undefined until a setBinding() call set it later, but I've since decided that explicitly
             * initializing such properties in the constructor is a better way to go -- even though it's more code -- because
             * JavaScript compilers are supposed to be happier when the underlying object structures aren't constantly changing.
             *
             * Besides, I'm not sure I want to get into documenting every property this way, for this or any/every other class,
             * let alone getting into which ones should be considered private or protected, because PCjs isn't really a library
             * for third-party apps.
             */
            
            Component.subclass(SerialPort);
            
            /*
             * Internal name used for the I/O buffer control, if any, that we bind to the SerialPort.
             *
             * Alternatively, if SerialPort wants to use another component's control (eg, the Panel's
             * "print" control), it can specify the name of that control with the 'binding' property.
             *
             * For that binding to succeed, we also need to know the target component; for now, that's
             * been hard-coded to "Panel", in part because that's one of the few components we can rely
             * upon initializing before we do, but it would be a simple matter to include a component type
             * or ID as part of the 'binding' property as well, if we need more flexibility later.
             */
            SerialPort.sIOBuffer = "buffer";
            
            /*
             * 8250 I/O register offsets (add these to a I/O base address to obtain an I/O port address)
             *
             * NOTE: DLL.REG and DLM.REG form a 16-bit divisor into a clock input frequency of 1.8432Mhz.  The following
             * values should be used for the corresponding baud rates.  Rates above 9600 are discouraged by the IBM Tech Ref,
             * but rates as high as 128000 are listed on the NS8250A data sheet.
             *
             *      Divisor     Rate        Percent Error
             *      0x0900      50
             *      0x0600      75
             *      0x0417      110         0.026%
             *      0x0359      134.5       0.058%
             *      0x0300      150
             *      0x0180      300
             *      0x00C0      600
             *      0x0060      1200
             *      0x0040      1800
             *      0x003A      2000        0.69%
             *      0x0030      2400
             *      0x0020      3600
             *      0x0018      4800
             *      0x0010      7200
             *      0x000C      9600
             *      0x0006      19200
             *      0x0003      38400
             *      0x0002      56000       2.86%
             *      0x0001      128000
             */
            SerialPort.DLL = {REG: 0};              // Divisor Latch LSB (only when SerialPort.LCR.DLAB is set)
            SerialPort.THR = {REG: 0};              // Transmitter Holding Register (write)
            SerialPort.DL_DEFAULT       = 0x180;    // we select an arbitrary default Divisor Latch equivalent to 300 baud
            
            /*
             * The divisor is stored in wDL.  If we take the frequency value 1843200 and divide it by wDL*128, we get the
             * maximum number of bytes per second that the SerialPort interface should generate.  For example, if a baud
             * rate of 1200 is being used, the divisor will be 0x60 (96), so we calculate 1843200/(96*128) = 150, which means
             * there should be a 1000ms/150 or 6.667ms delay between bytes delivered.
             *
             * TODO: Enforce that delay.  However, the delay should be converted from real-world milliseconds to the
             * appropriate number of CPU cycles we can pass to setBurstCycles().  This will also require the CPU to call
             * us at the start of each burst, to see if advanceRBR() has more data to deliver.  For now, I'm throttling
             * SerialPort interrupts by passing a hard-coded delay to setIRR().  The setIRR() delay does not ensure any
             * particular baud rate, it simply gives the underlying Interrupt Service Routine (ISR) some breathing room.
             *
             * The Microsoft Windows 1.01 serial mouse driver ISR issues an EOI before it has safely exited, relying solely
             * on the fact that a 1200 baud serial device would not normally interrupt frequently enough to blow the stack.
             * However, in PCjs, all you have to do is enable Debugger messages on every serial interrupt and mouse event,
             * eg:
             *
             *      m serial on;m pic on;m mouse on
             *
             * to slow the machine down to the point where serial mouse interrupts overwhelm the ISR.  The Debugger messages
             * display the current stack pointer, which you can watch drop to zero and then wrap around, no doubt trampling
             * lots of code and data along the way.
             *
             * This problem can also occur without being forced by the Debugger; eg, whenever the physical machine's mouse is
             * configured for a high interrupt rate.
             */
            
            /*
             * Receiver Buffer Register (RBR.REG, offset 0; eg, 0x3F8 or 0x2F8)
             */
            SerialPort.RBR = {REG: 0};              // (read)
            
            /*
             * Interrupt Enable Register (IER.REG, offset 1; eg, 0x3F9 or 0x2F9)
             */
            SerialPort.IER = {};
            SerialPort.IER.REG          = 1;        // Interrupt Enable Register
            SerialPort.IER.RBR_AVAIL    = 0x01;
            SerialPort.IER.THR_EMPTY    = 0x02;
            SerialPort.IER.LSR_DELTA    = 0x04;
            SerialPort.IER.MSR_DELTA    = 0x08;
            SerialPort.IER.UNUSED       = 0xF0;     // always zero
            
            SerialPort.DLM = {REG: 1};              // Divisor Latch MSB (only when SerialPort.LCR.DLAB is set)
            
            /*
             * Interrupt ID Register (IIR.REG, offset 2; eg, 0x3FA or 0x2FA)
             *
             * All interrupt conditions cleared by reading the corresponding register (or, in the case of IRR_INT_THR, writing a new value to THR.REG)
             */
            SerialPort.IIR = {};
            SerialPort.IIR.REG          = 2;        // Interrupt ID Register (read-only)
            SerialPort.IIR.NO_INT       = 0x01;
            SerialPort.IIR.INT_LSR      = 0x06;     // Line Status (highest priority: Overrun error, Parity error, Framing error, or Break Interrupt)
            SerialPort.IIR.INT_RBR      = 0x04;     // Receiver Data Available
            SerialPort.IIR.INT_THR      = 0x02;     // Transmitter Holding Register Empty
            SerialPort.IIR.INT_MSR      = 0x00;     // Modem Status Register (lowest priority: Clear To Send, Data Set Ready, Ring Indicator, or Data Carrier Detect)
            SerialPort.IIR.INT_BITS     = 0x06;
            SerialPort.IIR.UNUSED       = 0xF8;     // always zero (the ROM BIOS relies on these bits "floating to 1" when no SerialPort is present)
            
            /*
             * Line Control Register (LCR.REG, offset 3; eg, 0x3FB or 0x2FB)
             */
            SerialPort.LCR = {};
            SerialPort.LCR.REG          = 3;        // Line Control Register
            SerialPort.LCR.DATA_5BITS   = 0x00;
            SerialPort.LCR.DATA_6BITS   = 0x01;
            SerialPort.LCR.DATA_7BITS   = 0x02;
            SerialPort.LCR.DATA_8BITS   = 0x03;
            SerialPort.LCR.STOP_BITS    = 0x04;     // clear: 1 stop bit; set: 1.5 stop bits for LCR_DATA_5BITS, 2 stop bits for all other data lengths
            SerialPort.LCR.PARITY_BIT   = 0x08;     // if set, a parity bit is inserted/expected between the last data bit and the first stop bit; no parity bit if clear
            SerialPort.LCR.PARITY_EVEN  = 0x10;     // if set, even parity is selected (ie, the parity bit insures an even number of set bits); if clear, odd parity
            SerialPort.LCR.PARITY_STICK = 0x20;     // if set, parity bit is transmitted inverted; if clear, parity bit is transmitted normally
            SerialPort.LCR.BREAK        = 0x40;     // if set, serial output (SOUT) signal is forced to logical 0 for the duration
            SerialPort.LCR.DLAB         = 0x80;     // Divisor Latch Access Bit; if set, DLL.REG and DLM.REG can be read or written
            
            /*
             * Modem Control Register (MCR.REG, offset 4; eg, 0x3FC or 0x2FC)
             */
            SerialPort.MCR = {};
            SerialPort.MCR.REG          = 4;        // Modem Control Register
            SerialPort.MCR.DTR          = 0x01;     // when set, DTR goes high, indicating ready to establish link (looped back to DSR in loop-back mode)
            SerialPort.MCR.RTS          = 0x02;     // when set, RTS goes high, indicating ready to exchange data (looped back to CTS in loop-back mode)
            SerialPort.MCR.OUT1         = 0x04;     // when set, OUT1 goes high (looped back to RI in loop-back mode)
            SerialPort.MCR.OUT2         = 0x08;     // when set, OUT2 goes high (looped back to RLSD in loop-back mode)
            SerialPort.MCR.LOOPBACK     = 0x10;     // when set, enables loop-back mode
            SerialPort.MCR.UNUSED       = 0xE0;     // always zero
            
            /*
             * Line Status Register (LSR.REG, offset 5; eg, 0x3FD or 0x2FD)
             *
             * NOTE: I've seen different specs for the LSR_TSRE.  I'm following the IBM Tech Ref's lead here, but the data sheet I have calls it TEMT
             * instead of TSRE, and claims that it is set whenever BOTH the THR and TSR are empty, and clear whenever EITHER the THR or TSR contain data.
             */
            SerialPort.LSR = {};
            SerialPort.LSR.REG          = 5;        // Line Status Register
            SerialPort.LSR.DR           = 0x01;     // Data Ready (set when new data in RBR.REG; cleared when RBR.REG read)
            SerialPort.LSR.OE           = 0x02;     // Overrun Error (set when new data arrives in RBR.REG before previous data read; cleared when LSR.REG read)
            SerialPort.LSR.PE           = 0x04;     // Parity Error (set when new data has incorrect parity; cleared when LSR.REG read)
            SerialPort.LSR.FE           = 0x08;     // Framing Error (set when new data has invalid stop bit; cleared when LSR.REG read)
            SerialPort.LSR.BI           = 0x10;     // Break Interrupt (set when new data exceeded normal transmission time; cleared LSR.REG when read)
            SerialPort.LSR.THRE         = 0x20;     // Transmitter Holding Register Empty (set when UART ready to accept new data; cleared when THR.REG written)
            SerialPort.LSR.TSRE         = 0x40;     // Transmitter Shift Register Empty (set when the TSR is empty; cleared when the THR is transferred to the TSR)
            SerialPort.LSR.UNUSED       = 0x80;     // always zero
            
            /*
             * Modem Status Register (MSR.REG, offset 6; eg, 0x3FE or 0x2FE)
             */
            SerialPort.MSR = {};
            SerialPort.MSR.REG          = 6;        // Modem Status Register
            SerialPort.MSR.DCTS         = 0x01;     // when set, CTS (Clear To Send) has changed since last read
            SerialPort.MSR.DDSR         = 0x02;     // when set, DSR (Data Set Ready) has changed since last read
            SerialPort.MSR.TERI         = 0x04;     // when set, TERI (Trailing Edge Ring Indicator) indicates RI has changed from 1 to 0
            SerialPort.MSR.DRLSD        = 0x08;     // when set, RLSD (Received Line Signal Detector) has changed
            SerialPort.MSR.CTS          = 0x10;     // when set, the modem or data set is ready to exchange data (complement of the Clear To Send input signal)
            SerialPort.MSR.DSR          = 0x20;     // when set, the modem or data set is ready to establish link (complement of the Data Set Ready input signal)
            SerialPort.MSR.RI           = 0x40;     // complement of the RI (Ring Indicator) input
            SerialPort.MSR.RLSD         = 0x80;     // complement of the RLSD (Received Line Signal Detect) input
            
            /*
             * Scratch Register (SCR.REG, offset 7; eg, 0x3FF or 0x2FF)
             */
            SerialPort.SCR = {REG: 7};
            
            /**
             * attachMouse(id, mouse)
             *
             * @this {SerialPort}
             * @param {string} id
             * @param {Mouse} mouse component
             * @return {Component} this or null, based on whether or not the specified ID matches
             */
            SerialPort.prototype.attachMouse = function(id, mouse)
            {
                if (id == this.idComponent) {
                    this.mouse = mouse;
                    return this;
                }
                return null;
            };
            
            /**
             * syncMouse()
             *
             * NOTE: This is probably obsolete, but the Mouse component still might discover a need for it.  See Mouse.powerUp().
             *
             * @this {SerialPort}
             *
            SerialPort.prototype.syncMouse = function()
             {
                if (this.mouse) this.mouse.notifyMCR(this.bMCR);
            };
             */
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {SerialPort}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "buffer")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            SerialPort.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                var serial = this;
            
                switch (sBinding) {
                case SerialPort.sIOBuffer:
                    this.bindings[sBinding] = this.controlIOBuffer = control;
                    /*
                     * By establishing an onkeypress handler here, we make it possible for DOS commands like
                     * "CTTY COM1" to more or less work (use "CTTY CON" to restore control to the DOS console).
                     *
                     * WARNING: This isn't really a supported feature yet; very much a work-in-progress.
                     */
                    control.onkeydown = function onKeyDownSerial(event) {
                        /*
                         * This is required in addition to onkeypress, because it's the only way to prevent
                         * BACKSPACE from being interpreted by the browser as a "Back" operation.
                         */
                        event = event || window.event;
                        var keyCode = event.keyCode;
                        if (keyCode === 8) {
                            if (event.preventDefault) event.preventDefault();
                            serial.sendRBR([keyCode]);
                        }
                    };
                    control.onkeypress = function onKeyPressSerial(event) {
                        /*
                         * Browser-independent keyCode extraction (refer to keyPress() and the other key
                         * event handlers in keyboard.js).
                         */
                        event = event || window.event;
                        var keyCode = event.which || event.keyCode;
                        serial.sendRBR([keyCode]);
                    };
                    return true;
            
                default:
                    break;
                }
                return false;
            };
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * @this {SerialPort}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            SerialPort.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
                this.chipset = cmp.getComponentByType("ChipSet");
                bus.addPortInputTable(this, SerialPort.aPortInput, this.portBase);
                bus.addPortOutputTable(this, SerialPort.aPortOutput, this.portBase);
                this.setReady();
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {SerialPort}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            SerialPort.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data || !this.restore) {
                        this.reset();
                    } else {
                        if (!this.restore(data)) return false;
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * @this {SerialPort}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            SerialPort.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save ? this.save() : true;
            };
            
            /**
             * reset()
             *
             * @this {SerialPort}
             */
            SerialPort.prototype.reset = function()
            {
                this.initState();
            };
            
            /**
             * save()
             *
             * This implements save support for the SerialPort component.
             *
             * @this {SerialPort}
             * @return {Object}
             */
            SerialPort.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, this.saveRegisters());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the SerialPort component.
             *
             * @this {SerialPort}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             */
            SerialPort.prototype.restore = function(data)
            {
                return this.initState(data[0]);
            };
            
            /**
             * initState(data)
             *
             * @this {SerialPort}
             * @param {Array} [data]
             * @return {boolean} true if successful, false if failure
             */
            SerialPort.prototype.initState = function(data)
            {
                /*
                 * The NS8250A spec doesn't explicitly say what the RBR and THR are initialized to on a reset,
                 * but I think we can safely assume zeros.  Similarly, we reset the baud rate Divisor Latch (wDL)
                 * to an arbitrary but consistent default (DL_DEFAULT).
                 */
                var i = 0;
                if (data === undefined) {
                    data = [
                        0,                                          // RBR
                        0,                                          // THR
                        SerialPort.DL_DEFAULT,                      // DL
                        0,                                          // IER
                        SerialPort.IIR.NO_INT,                      // IIR
                        0,                                          // LCR
                        0,                                          // MCR
                        SerialPort.LSR.THRE | SerialPort.LSR.TSRE,  // LSR
                        SerialPort.MSR.CTS | SerialPort.MSR.DSR,    // MSR (instead of the normal 0 default, we indicate a state of readiness -- to be revisited)
                        []
                    ];
                }
                this.bRBR = data[i++];
                this.bTHR = data[i++];
                this.wDL =  data[i++];
                this.bIER = data[i++];
                this.bIIR = data[i++];
                this.bLCR = data[i++];
                this.bMCR = data[i++];
                this.bLSR = data[i++];
                this.bMSR = data[i++];
                this.abReceive = data[i];
                return true;
            };
            
            /**
             * saveRegisters()
             *
             * @this {SerialPort}
             * @return {Array}
             */
            SerialPort.prototype.saveRegisters = function()
            {
                var i = 0;
                var data = [];
                data[i++] = this.bRBR;
                data[i++] = this.bTHR;
                data[i++] = this.wDL;
                data[i++] = this.bIER;
                data[i++] = this.bIIR;
                data[i++] = this.bLCR;
                data[i++] = this.bMCR;
                data[i++] = this.bLSR;
                data[i++] = this.bMSR;
                data[i] = this.abReceive;
                return data;
            };
            
            /**
             * sendRBR(ab)
             *
             * @this {SerialPort}
             * @param {Array} ab is an array of bytes to propagate to the bRBR (Receiver Buffer Register)
             */
            SerialPort.prototype.sendRBR = function(ab)
            {
                this.abReceive = this.abReceive.concat(ab);
                this.advanceRBR();
            };
            
            /**
             * advanceRBR()
             *
             * @this {SerialPort}
             */
            SerialPort.prototype.advanceRBR = function()
            {
                if (this.abReceive.length > 0 && !(this.bLSR & SerialPort.LSR.DR)) {
                    this.bRBR = this.abReceive.shift();
                    this.bLSR |= SerialPort.LSR.DR;
                }
                this.updateIRR();
            };
            
            /**
             * inRBR(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3F8 or 0x2F8)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inRBR = function(port, addrFrom)
            {
                var b = ((this.bLCR & SerialPort.LCR.DLAB) ? (this.wDL & 0xff) : this.bRBR);
                this.printMessageIO(port, null, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "RBR", b);
                this.bLSR &= ~SerialPort.LSR.DR;
                this.advanceRBR();
                return b;
            };
            
            /**
             * inIER(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3F9 or 0x2F9)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inIER = function(port, addrFrom)
            {
                var b = ((this.bLCR & SerialPort.LCR.DLAB) ? (this.wDL >> 8) : this.bIER);
                this.printMessageIO(port, null, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER", b);
                return b;
            };
            
            /**
             * inIIR(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FA or 0x2FA)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inIIR = function(port, addrFrom)
            {
                var b = this.bIIR;
                this.printMessageIO(port, null, addrFrom, "IIR", b);
                return b;
            };
            
            /**
             * inLCR(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FB or 0x2FB)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inLCR = function(port, addrFrom)
            {
                var b = this.bLCR;
                this.printMessageIO(port, null, addrFrom, "LCR", b);
                return b;
            };
            
            /**
             * inMCR(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FC or 0x2FC)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inMCR = function(port, addrFrom)
            {
                var b = this.bMCR;
                this.printMessageIO(port, null, addrFrom, "MCR", b);
                return b;
            };
            
            /**
             * inLSR(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FD or 0x2FD)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inLSR = function(port, addrFrom)
            {
                var b = this.bLSR;
                this.printMessageIO(port, null, addrFrom, "LSR", b);
                return b;
            };
            
            /**
             * inMSR(port, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FE or 0x2FE)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number} simulated port value
             */
            SerialPort.prototype.inMSR = function(port, addrFrom)
            {
                var b = this.bMSR;
                this.printMessageIO(port, null, addrFrom, "MSR", b);
                return b;
            };
            
            /**
             * outTHR(port, bOut, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3F8 or 0x2F8)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            SerialPort.prototype.outTHR = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLL" : "THR");
                if (this.bLCR & SerialPort.LCR.DLAB) {
                    this.wDL = (this.wDL & ~0xff) | bOut;
                } else {
                    this.bTHR = bOut;
                    this.bLSR &= ~(SerialPort.LSR.THRE | SerialPort.LSR.TSRE);
                    if (this.echoByte(bOut)) {
                        this.bLSR |= (SerialPort.LSR.THRE | SerialPort.LSR.TSRE);
                        /*
                         * QUESTION: Does this mean we should also flush/zero bTHR?
                         */
                    }
                }
            };
            
            /**
             * outIER(port, bOut, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3F9 or 0x2F9)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            SerialPort.prototype.outIER = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, (this.bLCR & SerialPort.LCR.DLAB) ? "DLM" : "IER");
                if (this.bLCR & SerialPort.LCR.DLAB) {
                    this.wDL = (this.wDL & 0xff) | (bOut << 8);
                } else {
                    this.bIER = bOut;
                }
            };
            
            /**
             * outLCR(port, bOut, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FB or 0x2FB)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            SerialPort.prototype.outLCR = function(port, bOut, addrFrom)
            {
                this.printMessageIO(port, bOut, addrFrom, "LCR");
                this.bLCR = bOut;
            };
            
            /**
             * outMCR(port, bOut, addrFrom)
             *
             * @this {SerialPort}
             * @param {number} port (0x3FC or 0x2FC)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to write the specified port)
             */
            SerialPort.prototype.outMCR = function(port, bOut, addrFrom)
            {
                var bPrev = this.bMCR;
                this.printMessageIO(port, bOut, addrFrom, "MCR");
                this.bMCR = bOut;
                if (this.mouse && (bPrev ^ bOut) & (SerialPort.MCR.DTR | SerialPort.MCR.RTS)) {
                    this.mouse.notifyMCR(this.bMCR);
                }
            };
            
            /**
             * updateIRR()
             *
             * @this {SerialPort}
             */
            SerialPort.prototype.updateIRR = function()
            {
                var bIIR = -1;
                if ((this.bLSR & SerialPort.LSR.DR) && (this.bIER & SerialPort.IER.RBR_AVAIL)) {
                    bIIR = SerialPort.IIR.INT_RBR;
                }
                if (bIIR >= 0) {
                    this.bIIR &= ~(SerialPort.IIR.NO_INT | SerialPort.IIR.INT_BITS);
                    this.bIIR |= bIIR;
                    /*
                     * TODO: Remove this arbitrary 100-instruction delay once we've added support for baud rate throttling
                     * (see TODO above regarding baud rate).
                     */
                    if (this.chipset && this.nIRQ) this.chipset.setIRR(this.nIRQ, 100);
                } else {
                    this.bIIR |= SerialPort.IIR.NO_INT;
                    if (this.chipset && this.nIRQ) this.chipset.clearIRR(this.nIRQ);
                }
            };
            
            /**
             * echoByte(b)
             *
             * @this {SerialPort}
             * @param {number} b
             * @return {boolean} true if echoed, false if not
             */
            SerialPort.prototype.echoByte = function(b)
            {
                if (this.controlIOBuffer) {
                    if (b != 0x0D) {
                        if (b == 0x08) {
                            this.controlIOBuffer.value = this.controlIOBuffer.value.slice(0, -1);
                        } else {
                            this.controlIOBuffer.value += String.fromCharCode(b);
                            this.controlIOBuffer.scrollTop = this.controlIOBuffer.scrollHeight;
                        }
                    }
                    return true;
                }
                return false;
            };
            
            /*
             * Port input notification table
             */
            SerialPort.aPortInput = {
                0x0: SerialPort.prototype.inRBR,    // or DLL if DLAB set
                0x1: SerialPort.prototype.inIER,    // or DLM if DLAB set
                0x2: SerialPort.prototype.inIIR,
                0x3: SerialPort.prototype.inLCR,
                0x4: SerialPort.prototype.inMCR,
                0x5: SerialPort.prototype.inLSR,
                0x6: SerialPort.prototype.inMSR
            };
            
            /*
             * Port output notification table
             */
            SerialPort.aPortOutput = {
                0x0: SerialPort.prototype.outTHR,   // or DLL if DLAB set
                0x1: SerialPort.prototype.outIER,   // or DLM if DLAB set
                0x3: SerialPort.prototype.outLCR,
                0x4: SerialPort.prototype.outMCR
            };
            
            /**
             * SerialPort.init()
             *
             * This function operates on every HTML element of class "serial", extracting the
             * JSON-encoded parameters for the SerialPort constructor from the element's "data-value"
             * attribute, invoking the constructor to create a SerialPort component, and then binding
             * any associated HTML controls to the new component.
             */
            SerialPort.init = function()
            {
                var aeSerial = Component.getElementsByClass(window.document, PCJSCLASS, "serial");
                for (var iSerial = 0; iSerial < aeSerial.length; iSerial++) {
                    var eSerial = aeSerial[iSerial];
                    var parmsSerial = Component.getComponentParms(eSerial);
                    var serial = new SerialPort(parmsSerial);
                    Component.bindComponentControls(serial, eSerial, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every SerialPort module on the page.
             */
            web.onInit(SerialPort.init);
            
            if (typeof module !== 'undefined') module.exports = SerialPort;
            
          • state.js
            /**
             * @fileoverview The State class used by C1Pjs and PCjs.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-May-14
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var web       = require("./../../shared/lib/weblib");
                var Component = require("./../../shared/lib/component");
                var Messages  = require("./messages");
            }
            
            /**
             * State(component, sVersion, sSuffix)
             *
             * State objects are used by components to save/restore their state.
             *
             * During a save operation, components add data to a State object via set(),
             * and then return the resulting data using data().
             *
             * During a restore operation, the Computer component passes the results of each
             * data() call back to the originating component.
             *
             * WARNING: Since State objects are low-level objects that have no UI requirements,
             * they do not inherit from the Component class, so you should only use class methods
             * of Component, such as Component.assert(), or Debugger methods if the Debugger
             * is available.
             *
             * @constructor
             * @param {Component} component
             * @param {string} [sVersion] is used to append a major version number to the key
             * @param {string} [sSuffix] is used to append any additional suffixes to the key
             */
            function State(component, sVersion, sSuffix) {
                this.id = component.id;
                this.key = State.key(component, sVersion, sSuffix);
                this.dbg = component.dbg;
                this.unload(component.parms);
            }
            
            /**
             * State.key(component, sVersion, sSuffix)
             *
             * This encapsulates the key generation code.
             *
             * @param {Component} component
             * @param {string} [sVersion] is used to append a major version number to the key
             * @param {string} [sSuffix] is used to append any additional suffixes to the key
             * @return {string} key
             */
            State.key = function(component, sVersion, sSuffix) {
                var key = component.id;
                if (sVersion) {
                    var i = sVersion.indexOf('.');
                    if (i > 0) key += ".v" + sVersion.substr(0, i);
                }
                if (sSuffix) {
                    key += "." + sSuffix;
                }
                return key;
            };
            
            /**
             * State.compress(aSrc)
             *
             * @param {Array.<number>|null} aSrc
             * @return {Array.<number>|null} is either the original array (aSrc), or a smaller array of "count, value" pairs (aComp)
             */
            State.compress = function(aSrc) {
                if (aSrc) {
                    var iSrc = 0;
                    var iComp = 0;
                    var aComp = [];
                    while (iSrc < aSrc.length) {
                        var n = aSrc[iSrc];
                        Component.assert(n !== undefined);
                        var iCompare = iSrc + 1;
                        while (iCompare < aSrc.length && aSrc[iCompare] === n) iCompare++;
                        aComp[iComp++] = iCompare - iSrc;
                        aComp[iComp++] = n;
                        iSrc = iCompare;
                    }
                    if (aComp.length < aSrc.length) return aComp;
                }
                return aSrc;
            };
            
            /**
             * State.decompress(aComp)
             *
             * @param {Array.<number>} aComp
             * @param {number} nLength is expected length of decompressed data
             * @return {Array.<number>}
             */
            State.decompress = function(aComp, nLength) {
                var iDst = 0;
                var aDst = new Array(nLength);
                var iComp = 0;
                while (iComp < aComp.length - 1) {
                    var c = aComp[iComp++];
                    var n = aComp[iComp++];
                    while (c--) {
                        aDst[iDst++] = n;
                    }
                }
                Component.assert(aDst.length == nLength);
                return aDst;
            };
            
            /**
             * State.compressEvenOdd(aSrc)
             *
             * This is a very simple variation on compress() that compresses all the EVEN elements of aSrc first,
             * followed by all the ODD elements.  This tends to work better on EGA video memory, because when odd/even
             * addressing is enabled (eg, for text modes), the DWORD values tend to alternate, which is the worst case
             * for compress(), but the best case for compressEvenOdd().
             *
             * One wrinkle we support: if the first element is uninitialized, then we assume the entire array is undefined,
             * and return an empty compressed array.  Conversely, decompressEvenOdd() will take an empty compressed array
             * and return an uninitialized array.
             *
             * @param {Array.<number>|null} aSrc
             * @return {Array.<number>|null} is either the original array (aSrc), or a smaller array of "count, value" pairs (aComp)
             */
            State.compressEvenOdd = function(aSrc) {
                if (aSrc) {
                    var iComp = 0, aComp = [];
                    if (aSrc[0] !== undefined) {
                        for (var off = 0; off < 2; off++) {
                            var iSrc = off;
                            while (iSrc < aSrc.length) {
                                var n = aSrc[iSrc];
                                var iCompare = iSrc + 2;
                                while (iCompare < aSrc.length && aSrc[iCompare] === n) iCompare += 2;
                                aComp[iComp++] = (iCompare - iSrc) >> 1;
                                aComp[iComp++] = n;
                                iSrc = iCompare;
                            }
                        }
                    }
                    if (aComp.length < aSrc.length) return aComp;
                }
                return aSrc;
            };
            
            /**
             * State.decompressEvenOdd(aComp, nLength)
             *
             * This is the counterpart to compressEvenOdd().  Note that because there's nothing in the compressed sequence
             * that differentiates a compress() sequence from a compressEvenOdd() sequence, you simply have to be consistent:
             * if you used even/odd compression, then you must use even/odd decompression.
             *
             * @param {Array.<number>} aComp
             * @param {number} nLength is expected length of decompressed data
             * @return {Array.<number>}
             */
            State.decompressEvenOdd = function(aComp, nLength) {
                var iDst = 0;
                var aDst = new Array(nLength);
                var iComp = 0;
                while (iComp < aComp.length - 1) {
                    var c = aComp[iComp++];
                    var n = aComp[iComp++];
                    while (c--) {
                        aDst[iDst] = n;
                        iDst += 2;
                    }
                    /*
                     * The output of a "count,value" pair will never exceed the end of the output array, so as soon as we reach it
                     * the first time, we know it's time to switch to ODD elements, and as soon as we reach it again, we should be
                     * done.
                     */
                    Component.assert(iDst <= nLength || iComp == aComp.length);
                    if (iDst == nLength) iDst = 1;
                }
                Component.assert(aDst.length == nLength);
                return aDst;
            };
            
            State.prototype = {
                constructor: State,
                /**
                 * set(id, data)
                 *
                 * @this {State}
                 * @param {number|string} id
                 * @param {Object|string} data
                 */
                set: function(id, data) {
                    try {
                        this[this.id][id] = data;
                    } catch(e) {
                        Component.log(e.message);
                    }
                },
                /**
                 * get(id)
                 *
                 * @this {State}
                 * @param {number|string} id
                 * @return {Object|string|null}
                 */
                get: function(id) {
                    return this[this.id][id] || null;
                },
                /**
                 * value()
                 *
                 * Use this instead of data() if you haven't called parse() yet.
                 *
                 * @this {State}
                 * @return {string}
                 */
                value: function() {
                    return this[this.id];
                },
                /**
                 * data()
                 *
                 * @this {State}
                 * @return {Object}
                 */
                data: function() {
                    return this[this.id];
                },
                /**
                 * load(s)
                 *
                 * WARNING: Make sure you follow this call with either a call to parse() or unload(),
                 * because any stringified data that we've loaded isn't usable until it's been parsed.
                 *
                 * @this {State}
                 * @param {Object|string|null} [s]
                 * @return {boolean} true if state exists in localStorage, false if not
                 */
                load: function(s) {
                    if (s) {
                        this[this.id] = s;
                        this.fLoaded = true;
                        return true;
                    }
                    if (this.fLoaded) {
                        /*
                         * This is assumed to be a redundant load().
                         */
                        return true;
                    }
                    if (web.hasLocalStorage()) {
                        s = web.getLocalStorageItem(this.key);
                        if (s) {
                            this[this.id] = s;
                            this.fLoaded = true;
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("localStorage(" + this.key + "): " + s.length + " bytes loaded");
                            }
                            return true;
                        }
                    }
                    return false;
                },
                /**
                 * parse()
                 *
                 * This completes the load() operation, by parsing what was loaded, on the assumption there
                 * might be some benefit to deferring parsing until we've given the user a chance to confirm.
                 * Otherwise, load() could have just as easily done this, too.
                 *
                 * @this {State}
                 * @return {boolean} true if successful, false if error
                 */
                parse: function() {
                    var fSuccess = true;
                    try {
                        this[this.id] = JSON.parse(this[this.id]);
                    } catch (e) {
                        Component.error(e.message || e);
                        fSuccess = false;
                    }
                    return fSuccess;
                },
                /**
                 * store()
                 *
                 * @this {State}
                 * @return {boolean} true if successful, false if error
                 */
                store: function() {
                    var fSuccess = true;
                    if (web.hasLocalStorage()) {
                        var s = JSON.stringify(this[this.id]);
                        if (web.setLocalStorageItem(this.key, s)) {
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("localStorage(" + this.key + "): " + s.length + " bytes stored");
                            }
                        } else {
                            /*
                             * WARNING: Because browsers tend to disable all alerts() during an "unload" operation,
                             * it's unlikely anyone will ever see the "quota" errors that occur at this point.  Need to
                             * think of some way to notify the user that there's a problem, and offer a way of cleaning
                             * up old states.
                             */
                            Component.error("Unable to store " + s.length + " bytes in browser local storage");
                            fSuccess = false;
                        }
                    }
                    return fSuccess;
                },
                /**
                 * toString()
                 *
                 * We can't know whether this might be called before parse() or after parse(), so we check.
                 * If before, then this[this.id] will still be in string form; if after, it will be an Object.
                 *
                 * @this {State}
                 * @return {string} JSON-encoded state
                 */
                toString: function() {
                    var value = this[this.id];
                    return (typeof value == "string"? value : JSON.stringify(value));
                },
                /**
                 * unload(parms)
                 *
                 * This discards any data saved via set() or loaded via load(), creating an empty State object.
                 * Note that you have to follow this call with an explicit call to store() if you want to remove
                 * the state from localStorage as well.
                 *
                 * @this {State}
                 * @param {Object} [parms]
                 */
                unload: function(parms) {
                    this[this.id] = {};
                    if (parms) this.set("parms", parms);
                    this.fLoaded = false;
                },
                /**
                 * clear(fAll)
                 *
                 * This unloads the current state, and then clears ALL localStorage for the current machine,
                 * independent of version, to reduce the chance of orphaned states wasting part of our limited allocation.
                 *
                 * @this {State}
                 * @param {boolean} [fAll] true to unconditionally clear ALL localStorage for the current domain
                 */
                clear: function(fAll) {
                    this.unload();
                    var aKeys = web.getLocalStorageKeys();
                    for (var i = 0; i < aKeys.length; i++) {
                        var sKey = aKeys[i];
                        if (sKey && (fAll || sKey.substr(0, this.key.length) == this.key)) {
                            web.removeLocalStorageItem(sKey);
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("localStorage(" + sKey + ") removed");
                            }
                            aKeys.splice(i, 1);
                            i = 0;
                        }
                    }
                },
                /**
                 * messageEnabled(bitsMessage)
                 *
                 * @this {State}
                 * @param {number} [bitsMessage] is one or more Messages category flag(s)
                 * @return {boolean}
                 */
                messageEnabled: function(bitsMessage) {
                    if (DEBUGGER && this.dbg) {
                        if (bitsMessage == null) {
                            bitsMessage = Messages.STATE;
                        } else {
                            bitsMessage |= Messages.STATE;
                        }
                        return this.dbg.messageEnabled(bitsMessage);
                    }
                    return false;
                },
                /**
                 * printMessage(sMessage)
                 *
                 * @this {State}
                 * @param {string} sMessage is any caller-defined message string
                 */
                printMessage: function(sMessage) {
                    if (DEBUGGER && this.dbg) this.dbg.message(sMessage);
                }
            };
            
            if (typeof module !== 'undefined') module.exports = State;
            
          • video.js
            /**
             * @fileoverview Implements the PCjs Video component.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Jun-15
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var DumpAPI     = require("../../shared/lib/dumpapi");
                var Component   = require("../../shared/lib/component");
                var Memory      = require("./memory");
                var Messages    = require("./messages");
                var ChipSet     = require("./chipset");
                var Keyboard    = require("./keyboard");
                var State       = require("./state");
            }
            
            /**
             * Video(parmsVideo, canvas, context, textarea, container)
             *
             * The Video component can be configured with the following (parmsVideo) properties:
             *
             *      model: model (eg, "mda" for Monochrome Display Adapter)
             *      mode: mode number (hardware-specific, 7 is the default)
             *      memory: amount of installed memory (ignored for MDA/CGA)
             *      screenWidth: width of the screen canvas, in pixels
             *      screenHeight: height of the screen canvas, in pixels
             *      scale: true for font scaling, false (default) to center the display on the screen
             *      charCols: number of character columns
             *      charRows: number of character rows
             *      fontROM: path to .rom file (or a JSON representation) that defines the character set
             *      screenColor: background color of the screen canvas (default is black)
             *      autoLock: true to (attempt to) automatically lock the mouse to the canvas (default is false)
             *
             * An EGA may specify the following additional properties:
             *
             *      switches: string representing EGA switches (see "SW1-SW4" documentation below)
             *      memory: the size of the EGA's on-board memory (overrides EGA's Video.cardSpecs)
             *
             * This calls the Bus to allocate a video buffer at the appropriate memory location whenever
             * a reset() or setMode() occurs; setMode() is called whenever a mode change is detected at
             * the port level, and whenever reset() is called.  setMode() also invokes updateScreen(true),
             * which forces reallocation of our internal buffer (aCellCache) that mirrors the video buffer.
             *
             * The CPU periodically calls updateScreen(), at an assumed rate of 60 times/second,
             * to update any blinking elements (the cursor and any characters with the blink attribute),
             * to compare/update the contents of our internal buffer with the video buffer, and to render
             * any differences between the two buffers into the associated screen canvas, via either
             * updateChar() or setPixel().
             *
             * Thanks to the CPU's new block-based memory manager that allows us to sparse-allocate memory
             * (in 4Kb increments on 20-bit buses, 16Kb increments on 24-bit buses), updateScreen()
             * can also ask the CPU for the "dirty" state of all the blocks underlying the video buffer,
             * bypassing the update completely if the buffer is still clean.
             *
             * Unfortunately, that optimization is defeated if our count of active blink elements is non-zero,
             * because we must rescan the entire buffer to locate and redraw them all; I'm assuming for now
             * that, more often than not, blink attributes will not be present, and therefore they're not worth
             * a separate caching mechanism.  If the only blinking element is the cursor, that's no problem,
             * as we redraw only the one cell containing the cursor (assuming the buffer is otherwise clean).
             *
             * @constructor
             * @extends Component
             * @param {Object} parmsVideo
             * @param {Object} [canvas]
             * @param {Object} [context]
             * @param {Object} [textarea]
             * @param {Object} [container]
             */
            function Video(parmsVideo, canvas, context, textarea, container)
            {
                Component.call(this, "Video", parmsVideo, Video, Messages.VIDEO);
            
                /*
                 * This records the model specified (eg, "mda", "cga", "ega", "vga" or "" if none specified);
                 * when a model is specified, it overrides whatever model we infer from the ChipSet's switches
                 * (since those motherboard switches tell us only the type of monitor, not the type of card).
                 */
                this.model = parmsVideo['model'];
                this.nCard = Video.CARD.NAMES[this.model] || Video.CARD.MDA;
            
                this.cbMemory = parmsVideo['memory'] || 0;  // zero means fallback to the cardSpec's default size
                this.sSwitches = parmsVideo['switches'];
            
                /*
                 * powerUp() uses the default mode ONLY if ChipSet doesn't give us a default.
                 */
                this.nModeDefault = parmsVideo['mode'];
                if (this.nModeDefault === undefined || Video.aModeParms[this.nModeDefault] === undefined) {
                    this.nModeDefault = Video.MODE.MDA_80X25;
                }
            
                /*
                 * setDimensions() uses these values ONLY if it doesn't recognize the video mode.
                 */
                this.nColsDefault = parmsVideo['charCols'];
                this.nRowsDefault = parmsVideo['charRows'];
                if (this.nColsDefault === undefined || this.nRowsDefault === undefined) {
                    this.nColsDefault = Video.aModeParms[this.nModeDefault][0];
                    this.nRowsDefault = Video.aModeParms[this.nModeDefault][1];
                }
            
                /*
                 * setDimensions() uses these values unconditionally, as the machine has no idea what the
                 * physical screen size should be.
                 */
                this.cxScreen = parmsVideo['screenWidth'];
                this.cyScreen = parmsVideo['screenHeight'];
            
                /*
                 * We might consider another component parameter to specify the font-doubling setting.
                 * For now, it's based on whether the default SCREEN cell size is sufficiently larger than
                 * the default FONT cell size.
                 */
                this.fScaleFont = parmsVideo['scale'];
                this.fDoubleFont = Math.round(this.cxScreen / this.nColsDefault) >= 12;
            
                this.fTouchScreen = parmsVideo['touchScreen'];
            
                this.canvasScreen = canvas;
                this.contextScreen = context;
                this.textareaScreen = textarea;
                this.inputScreen = textarea || canvas || null;
            
                /*
                 * If a Mouse exists, we'll be notified when it requests our canvas, and we make a note of it
                 * so that if lockPointer() is ever invoked, we can notify the Mouse.
                 */
                this.mouse = null;
                this.fAutoLock = parmsVideo['autoLock'];
            
                /*
                 * Originally, setMode() would map/unmap the video buffer ONLY when the active card changed,
                 * because as long as an MDA or CGA remained active, its video buffer never changed.  However,
                 * since the EGA can change its video buffer on the fly, setMode() must also compare the card's
                 * hard-coded and/or programmed buffer address/size to the "active" address/size; the latter
                 * is recorded here.
                 */
                this.addrBuffer = this.sizeBuffer = 0;
            
                /*
                 * aFonts is an array of font objects indexed by FONT ID.  Font characters are arranged
                 * in 16x16 grids, with one grid per canvas object in the aCanvas array of each font object.
                 *
                 * Each element is a Font object that describes the font size and provides bitmaps for all the font
                 * color permutations.  aFonts.length will be non-zero if ANY fonts are loaded, but do NOT assume
                 * that EVERY font has been loaded; check for the existence of a font by checking for its unique ID
                 * within this sparse array.
                 */
                this.aFonts = [];
            
                /*
                 * Instead of (re)allocating a new color array every time getCardColors() is called, we preallocate
                 * an array now and simply update the entries as needed.
                 */
                this.aRGB = new Array(16);
            
                /*
                 * Since I've not found clear documentation on a reliable way to check whether a particular DOM element
                 * (other than the BODY element) has focus at any given time, I've added onfocus() and onblur() handlers
                 * to the screen to maintain my own focus state.
                 */
                this.fHasFocus = false;
            
                var video = this;
            
                /*
                 * Here's the gross code to handle full-screen support across all supported browsers.  The lack of standards
                 * is exasperating; browsers can't agree on 'full' or 'Full, 'request' or 'Request', 'screen' or 'Screen', and
                 * while some browsers honor other browser prefixes, most browsers don't.
                 */
                this.fGecko = web.isUserAgent("Gecko/");
                var i, sEvent, asPrefixes = ['', 'moz', 'webkit', 'ms'];
            
                this.container = container;
                if (this.container) {
                    this.container.doFullScreen = container['requestFullscreen'] || container['msRequestFullscreen'] || container['mozRequestFullScreen'] || container['webkitRequestFullscreen'];
                    if (this.container.doFullScreen) {
                        for (i = 0; i < asPrefixes.length; i++) {
                            sEvent = asPrefixes[i] + 'fullscreenchange';
                            if ('on' + sEvent in document) {
                                var onFullScreenChange = function() {
                                    var fFullScreen = (document['fullscreenElement'] || document['mozFullScreenElement'] || document['webkitFullscreenElement'] || document['msFullscreenElement']);
                                    video.notifyFullScreen(fFullScreen? true : false);
                                };
                                document.addEventListener(sEvent, onFullScreenChange, false);
                                break;
                            }
                        }
                        for (i = 0; i < asPrefixes.length; i++) {
                            sEvent = asPrefixes[i] + 'fullscreenerror';
                            if ('on' + sEvent in document) {
                                var onFullScreenError = function() {
                                    video.notifyFullScreen(null);
                                };
                                document.addEventListener(sEvent, onFullScreenError, false);
                                break;
                            }
                        }
                    }
                }
            
                /*
                 * More gross code to handle pointer-locking support across all supported browsers.
                 *
                 * TODO: Consider "upgrading" this code to use the same asPrefixes array as above, especially once Microsoft
                 * finally releases a browser that supports pointer-locking (post-Windows 10?)
                 */
                if (this.inputScreen) {
                    this.inputScreen.onfocus = function onFocusScreen() {
                        return video.onFocusChange(true);
                    };
                    this.inputScreen.onblur = function onBlurScreen() {
                        return video.onFocusChange(false);
                    };
                    this.inputScreen.lockPointer = this.inputScreen['requestPointerLock'] || this.inputScreen['mozRequestPointerLock'] || this.inputScreen['webkitRequestPointerLock'];
                    this.inputScreen.unlockPointer = this.inputScreen['exitPointerLock'] || this.inputScreen['mozExitPointerLock'] || this.inputScreen['webkitExitPointerLock'];
                    if (this.inputScreen.lockPointer) {
                        var onPointerLockChange = function() {
                            var fLocked = (
                                document['pointerLockElement'] === video.inputScreen ||
                                document['mozPointerLockElement'] === video.inputScreen ||
                                document['webkitPointerLockElement'] === video.inputScreen);
                            video.notifyPointerLocked(fLocked);
                        };
                        if ('onpointerlockchange' in document) {
                            document.addEventListener('pointerlockchange', onPointerLockChange, false);
                        } else if ('onmozpointerlockchange' in document) {
                            document.addEventListener('mozpointerlockchange', onPointerLockChange, false);
                        } else if ('onwebkitpointerlockchange' in document) {
                            document.addEventListener('webkitpointerlockchange', onPointerLockChange, false);
                        }
                    }
                }
            
                /*
                 * As far as overall image quality of scaled fonts, these options don't seem necessary for Safari (and
                 * don't have any discernible effect anyway). Turning 'webkitImageSmoothingEnabled' off DOES have an effect
                 * on Chrome, but it's not really a positive effect overall, so I'm leaving these off for now.
                 *
                 *  if (this.contextScreen) {
                 *      this.contextScreen['mozImageSmoothingEnabled'] = false;
                 *      this.contextScreen['webkitImageSmoothingEnabled'] = false;
                 *  }
                 */
            
                var sFileURL = parmsVideo['fontROM'];
                if (sFileURL) {
                    var sFileExt = str.getExtension(sFileURL);
                    if (sFileExt != "json") {
                        sFileURL = web.getHost() + DumpAPI.ENDPOINT + '?' + DumpAPI.QUERY.FILE + '=' + sFileURL + '&' + DumpAPI.QUERY.FORMAT + '=' + DumpAPI.FORMAT.BYTES;
                    }
                    web.loadResource(sFileURL, true, null, this, this.onLoadSetFonts);
                }
            }
            
            Component.subclass(Video);
            
            Video.TRAPALL = true;           // monitor all I/O by default (not just deltas)
            
            /*
             * MDA/CGA Support
             *
             * Since there's a lot of similarity between the MDA and CGA (eg, their text-mode video buffer
             * format, and their use of the 6845 CRT controller), since the MDA ROM contains the fonts used
             * by both devices, and since the same ROM BIOS supports both (in fact, the BIOS indiscriminately
             * initializes both, regardless which is actually installed), this same component emulates both
             * devices.
             *
             * When no model is specified, this component supports the ability to dynamically switch between
             * MDA and CGA emulation, by simply toggling the SW1 motherboard "monitor type" switch settings
             * and resetting the machine.  In that model-less configuration, we install I/O port handlers for
             * both MDA and CGA cards, regardless which monitor type is initially selected.
             *
             * To simulate an IBM PC containing both an MDA and CGA (ie, a "dual display" system), the machine
             * configuration simply defines two video components, one with model "mda" and the other with model
             * "cga", resulting in two displays; setting a specific model forces each instance of this component
             * to register only those I/O ports belonging to that model.
             *
             * In a single-display system, dynamically switching cards (ie, between MDA and CGA) creates some
             * visual challenges.  For one, the MDA prefers a native screen size of 720x350, as it supports only
             * one video mode, 80x25, with a 9x14 cell size.  The CGA, on the other hand, has an 8x8 cell size,
             * so when using an MDA-size screen, an 80x25 CGA screen will end up with 40-pixel borders on the
             * left and right, and 75-pixel borders on the top and bottom.  The result is a rather tiny CGA font
             * surrounded by lots of wasted space, so it's best to turn on font scaling (see the "scale" property)
             * and go with a larger screen size of, say, 960x400 (50% larger in width, 100% larger in height).
             *
             * I've also added support for font-doubling in createFont().  We use the 8x8 font for 80-column
             * modes and the "doubled" 16x16 font for 40-column modes OR whenever the screen is large enough
             * to use the 16x16 font, since font rendering without scaling provides the sharpest results.
             * In fact, there's special logic in setDimensions() to ignore fScaleFont in certain cases (eg,
             * 40-column modes, to improve sharpness and avoid stretching the font beyond readability).
             *
             * Graphics modes, on the other hand, are always scaled to the screen size.  Pixels are captured
             * in an off-screen buffer, which is then drawn to match the size of the virtual screen.
             *
             * TODO: Whenever there are borders, they should be filled with the CGA's overscan colors.  However,
             * in the case of graphics modes (and text modes whenever font scaling is enabled), we don't reserve
             * any space for borders, so if borders are important, explicit border support will be required.
             */
            
            /*
             * EGA Support
             *
             * EGA support piggy-backs on the existing MDA/CGA support.  All the existing MDA/CGA port handlers
             * now refer to either cardMono or cardColor (instead of directly to cardMDA or cardCGA), enabling
             * the handlers to be redirected to cardMDA, cardCGA or cardEGA as appropriate.
             *
             * Note that an MDA card supported only a Monochrome Display and a CGA card supported only a Color
             * Display (well, OK, *or* a TV monitor, which we don't currently support), but the EGA is much
             * more flexible: the Enhanced Color Display was the preferred display, but the EGA also supported
             * older displays; a Color Display on EGA wasn't ideal (same low resolutions but with more colors),
             * but the EGA also brought high-resolution graphics to Monochrome displays, which was nice.  Anyway,
             * while all those EGA/monitor combinations will be nice to support, our virtual display support
             * will focus initially on the Enhanced Color Display.
             *
             * TODO: Add support for jumpers P1 and P3 (see EGA TechRef p.85).  P1 selects either 5-color-output
             * for a CGA monitor or 6-color-output for an EGA monitor; we would presumably use this only to
             * control certain assumptions about the virtual display's capabilities (ie, Color Display vs. Enhanced
             * Color Display).  P3 can switch all the I/O ports from 0x3nn to 0x2nn; the default is 0x3nn, and
             * that's the only port range the EGA ROM supports as well.
             */
            
            /*
             * VGA Support
             *
             * More will be said here about PCjs VGA support later.  But first, a word from IBM: "Video Graphics Array [VGA]
             * Programming Considerations":
             *
             *      Certain internal timings must be guaranteed by the user, in order to have the CRTC perform properly.
             *      This is due to the physical design of the chip. These timings can be guaranteed by ensuring that the
             *      rules listed below are followed when programming the CRTC.
             *
             *           1. The Horizontal Total [HORZ_TOTAL] register (R0) must be greater than or equal to a value of
             *              25 decimal.
             *
             *           2. The minimum positive pulse width of the HSYNC output must be four character clock units.
             *
             *           3. Register R5, Horizontal Sync End [HORZ_RETRACE_END], must be programmed such that the HSYNC
             *              output goes to a logic 0 a minimum of one character clock time before the 'horizontal display enable'
             *              signal goes to a logical 1.
             *
             *           4. Register R16, Vsync Start [VERT_RETRACE_START], must be a minimum of one horizontal scan line greater
             *              than register R18 [VERT_DISP_END].  Register R18 defines where the 'vertical display enable' signal ends.
             *
             *     When bit 5 of the Attribute Mode Control register equals 1, a successful line compare (see Line Compare
             *     [LINE_COMPARE] register) in the CRT Controller forces the output of the PEL Panning register to 0's until Vsync
             *     occurs.  When Vsync occurs, the output returns to the programmed value.  This allows the portion of the screen
             *     indicated by the Line Compare register to be operated on by the PEL Panning register.
             *
             *     A write to the Character Map Select register becomes valid on the next whole character line.  No deformed
             *     characters are displayed by changing character generators in the middle of a character scan line.
             *
             *     For 256-color 320 x 200 graphics mode hex 13, the attribute controller is configured so that the 8-bit attribute
             *     stored in video memory for each PEL becomes the 8-bit address (P0 - P7) into the integrated DAC.  The user should
             *     not modify the contents of the internal Palette registers when using this mode.
             *
             *     The following sequence should be followed when accessing any of the Attribute Data registers pointed to by the
             *     Attribute Index register:
             *
             *           1. Disable interrupts
             *           2. Reset read/write flip/flop
             *           3. Write to Index register
             *           4. Read from or write to a data register
             *           5. Enable interrupts
             *
             *      The Color Select register in the Attribute Controller section may be used to rapidly switch between sets of colors
             *      in the video DAC.  When bit 7 of the Attribute Mode Control register equals 0, the 8-bit color value presented to the
             *      video DAC is composed of 6 bits from the internal Palette registers and bits 2 and 3 from the Color Select register.
             *      When bit 7 of the Attribute Mode Control register equals 1, the 8-bit color value presented to the video DAC is
             *      composed of the lower four bits from the internal Palette registers and the four bits in the Color Select register.
             *      By changing the value in the Color Select register, software rapidly switches between sets of colors in the video DAC.
             *      Note that BIOS does not support multiple sets of colors in the video DAC.  The user must load these colors if this
             *      function is to be used.  Also see the Attribute Controller block diagram on page 4-26.  Note that the above discussion
             *      applies to all modes except 256 Color Graphics mode.  In this mode the Color Select register is not used to switch
             *      between sets of colors.
             *
             *      An application that saves the "Video State" must store the 4 bytes of information contained in the system microprocessor
             *      latches in the graphics controller subsection. These latches are loaded with 32 bits from video memory (8 bits per map)
             *      each time the system microprocessor does a read from video memory.  The application needs to:
             *
             *           1. Use write mode 1 to write the values in the latches to a location in video memory that is not part of
             *              the display buffer.  The last location in the address range is a good choice.
             *
             *           2. Save the values of the latches by reading them back from video memory.
             *
             *           Note: If in a chain 4 or odd/even mode, it will be necessary to reconfigure the memory organization as four
             *           sequential maps prior to performing the sequence above.  BIOS provides support for completely saving and
             *           restoring video state.  See the IBM Personal System/2 and Personal Computer BIOS Interface Technical Reference
             *           for more information.
             *
             *      The description of the Horizontal PEL Panning register includes a figure showing the number of PELs shifted left
             *      for each valid value of the PEL Panning register and each valid video mode.  Further panning beyond that shown in
             *      the figure may be accomplished by changing the start address in the CRT Controller registers, Start Address High
             *      and Start Address Low.  The sequence involved in further panning would be as follows:
             *
             *           1. Use the PEL Panning register to shift the maximum number of bits to the left. See Figure 4-103 on page
             *              4-106 for the appropriate values.
             *
             *           2. Increment the start address.
             *
             *           3. If you are not using Modes 0 + , 1 + , 2 + , 3 + ,7, or7 + , set the PEL Panning register to 0.  If you
             *              are using these modes, set the PEL Panning register to 8.  The screen will now be shifted one PEL left
             *              of the position it was in at the end of step 1.  Step 1 through Step 3 may be repeated as desired.
             *
             *      The Line Compare register (CRTC register hex 18) should be programmed with even values in 200 line modes when
             *      used in split screen applications that scroll a second screen on top of a first screen.  This is a requirement
             *      imposed by the scan doubling logic in the CRTC.
             *
             *      If the Cursor Start register (CRTC register hex 0A) is programmed with a value greater than that in the Cursor End
             *      register (CRTC register hex 0B), then no cursor is displayed.  A split cursor is not possible.
             *
             *      In 8-dot character modes, the underline attribute produces a solid line across adjacent characters, as in the IBM
             *      Color/Graphics Monitor Adapter, Monochrome Display Adapter and the Enhanced Graphics Adapter.  In 9-dot modes, the
             *      underline across adjacent characters is dashed, as in the IBM 327X display terminals.  In 9-dot modes, the line
             *      graphics characters (C0 - DF character codes) have solid underlines.
             *
             *      For compatibility with the IBM Enhanced Graphics Adapter (EGA), the internal VGA palette is programmed the same
             *      as the EGA.  The video DAC is programmed by BIOS so that the compatible values in the internal VGA palette produce
             *      a color compatible with what was produced by EGA.  Mode hex 13 (256 colors) is programmed so that the first 16
             *      locations in the DAC produce compatible colors.
             *
             *      Summing: When BIOS is used to load the video DAC palette for a color mode and a monochrome display is connected
             *      to the system unit, the color palette is changed.  The colors are summed to produce shades of gray that allow
             *      color applications to produce a readable screen.
             *
             *      There are 4 bits that should not be modified unless the sequencer is reset by setting bit 1 of the Reset register
             *      to 0.  These bits are:
             *
             *           • Bit 3, or bit 0 of the Clocking Mode register
             *           • Bit 3, or bit 2 of the Miscellaneous Output register
             */
            
            /*
             * Supported Cards
             *
             * Note that we choose IDs that match the default font ID for each card as well, for convenience.
             */
            Video.CARD = {
                MDA: 1,
                CGA: 3,
                EGA: 5,
                VGA: 7,
                NAMES: {
                    "mda": 1,
                    "cga": 3,
                    "ega": 5,
                    "vga": 7
                }
            };
            
            /*
             * Supported Modes
             *
             * Although this component is designed to be a video hardware emulation, not a BIOS simulation, we DO
             * look for changes to the hardware state that correspond to standard BIOS mode settings, so our internal
             * mode setting will normally match the current BIOS mode setting; however, this a debugging convenience,
             * not an attempt to monitor or emulate the BIOS.
             *
             * We do have some BIOS awareness (eg, when loading ROM-based fonts, and some special code to ensure all
             * the BIOS diagnostics pass), but for the most part, we treat the BIOS like any other application code.
             *
             * As we expand support to include more programmable cards like the EGA, it becomes quite easy for the card
             * to enter a "mode" that has no BIOS counterpart (eg, non-standard combinations of video buffer address,
             * memory access modes, fonts, display regions, etc).  Our hardware emulation routines will cope with those
             * situations as best they can (and when they don't, it should be considered a bug if some application is
             * broken as a result), but realistically, our hardware emulation is never likely to be 100% accurate.
             */
            Video.MODE = {
                CGA_40X25_BW:       0,
                CGA_40X25:          1,
                CGA_80X25_BW:       2,
                CGA_80X25:          3,
                CGA_320X200:        4,
                CGA_320X200_BW:     5,
                CGA_640X200:        6,
                MDA_80X25:          7,
                EGA_320X200:        0x0D,   // mapped at A000:0000
                EGA_640X200:        0x0E,   // mapped at A000:0000
                EGA_640X350_MONO:   0x0F,   // mapped at A000:0000, monochrome
                EGA_640X350:        0x10,   // mapped at A000:0000, color
                VGA_640X480_MONO:   0x11,   // mapped at A000:0000, monochrome
                VGA_640X480:        0x12,   // mapped at A000:0000, color
                VGA_320X200:        0x13,   // mapped at A000:0000, color
                UNKNOWN:            0xFF
            };
            
            /*
             * Supported Monitors
             *
             * The MDA monitor displays 350 lines of vertical resolution, 720 lines of horizontal resolution, and refreshes
             * at ~50Hz.  The CGA monitor displays 200 lines vertically, 640 horizontally, and refreshes at ~60Hz.
             *
             * Based on actual MDA timings (see http://diylab.atwebpages.com/pressureDev.htm), the total horizontal
             * period (drawing a line and retracing) is ~54.25uSec (1000000uSec / 18432) and the horizontal retrace interval
             * is about 15% of that, or ~8.14uSec.  Vertical sync occurs once every 370 horizontal periods.  Of those 370,
             * only 354 represent actively drawn lines (and of those, only 350 are visible); the remaining 16 horizontal
             * periods, or 4% of the 370 total, represent the vertical retrace interval.
             *
             * I don't have similar numbers for the CGA or EGA, so for now, I assume similar percentages; ie, 15% of
             * the horizontal period will represent horizontal retrace, and 4% of the vertical pixel maximum (262) will
             * represent vertical retrace.  However, 24% of the CGA's 262 vertical maximum represents non-visible lines,
             * whereas only 5% of the MDA's 370 maximum represents non-visible lines; is there really that much "overscan"
             * on the CGA?
             *
             * For each monitor type, there's a Video.monitorSpecs object that describes the horizontal and vertical
             * timings, along with my assumptions about the percentage of time that drawing is "active" within those periods,
             * and then based on the selected monitor type, I compute the number of CPU cycles that each period lasts,
             * as well as the number of CPU cycles that drawing lasts within each period, so that the horizontal and vertical
             * retrace status flags can be quickly calculated.
             *
             * For reference, here are some important numbers to know (from https://github.com/reenigne/reenigne/blob/master/8088/cga/register_values.txt):
             *
             *              CGA          MDA
             *  Pixel clock 14.318 MHz   16.257 MHz (aka "maximum video bandwidth", as IBM Tech Refs sometimes call it)
             *  Horizontal  15.700 KHz   18.432 KHz (aka "horizontal drive", as IBM Tech Refs sometimes call it)
             *  Vertical    59.923 Hz    49.816 Hz
             *  Usage       53.69%       77.22%
             *  H pix       912 = 114*8  882 = 98*9
             *  V pix       262          370
             *  Dots        238944       326340
             */
            
            /**
             * @class MonitorSpecs
             * @property {number} nHorzPeriodsPerSec
             * @property {number} nHorzPeriodsPerFrame
             * @property {number} percentHorzActive
             * @property {number} percentVertActive
             *
             * From these monitor specs, we calculate the following values for a given Card:
             *
             *      nCyclesPerSecond = cpu.getCyclesPerSecond();      // eg, 4772727
             *      nCyclesHorzPeriod = (nCyclesPerSecond / monitorSpecs.nHorzPeriodsPerSec) | 0;
             *      nCyclesHorzActive = (nCyclesHorzPeriod * monitorSpecs.percentHorzActive / 100) | 0;
             *      nCyclesVertPeriod = nCyclesHorzPeriod * monitorSpecs.nHorzPeriodsPerFrame;
             *      nCyclesVertActive = (nCyclesVertPeriod * monitorSpecs.percentVertActive / 100) | 0;
             */
            
            /**
             * @type {Object}
             */
            Video.monitorSpecs = {};
            
            /**
             * NOTE: Based on trial-and-error, 208 is the magic number of horizontal syncs per vertical sync that
             * yielded the necessary number of "horizontal enables" (200 or 0xC8) in the EGA ROM BIOS at C000:03D0.
             *
             * @type {{MonitorSpecs}}
             */
            Video.monitorSpecs[ChipSet.MONITOR.COLOR] = {
                nHorzPeriodsPerSec: 15700,
                nHorzPeriodsPerFrame: 208,
                percentHorzActive: 85,
                percentVertActive: 96
            };
            
            /**
             * NOTE: Based on trial-and-error, 364 is the magic number of horizontal syncs per vertical sync that
             * yielded the necessary number of "horizontal enables" (350 or 0x15E) in the EGA ROM BIOS at C000:03D0.
             *
             * @type {{MonitorSpecs}}
             */
            Video.monitorSpecs[ChipSet.MONITOR.MONO] = {
                nHorzPeriodsPerSec: 18432,
                nHorzPeriodsPerFrame: 364,
                percentHorzActive: 85,
                percentVertActive: 96
            };
            
            /**
             * @type {{MonitorSpecs}}
             */
            Video.monitorSpecs[ChipSet.MONITOR.EGACOLOR] = {
                nHorzPeriodsPerSec: 21850,
                nHorzPeriodsPerFrame: 364,
                percentHorzActive: 85,
                percentVertActive: 96
            };
            
            /**
             * NOTE: As above, the following values are based purely on trial-and-error, to yield results that fall
             * squarely within the bounds of the IBM VGA ROM timing requirements; see the IBM VGA ROM code at C000:024A.
             *
             * @type {{MonitorSpecs}}
             */
            Video.monitorSpecs[ChipSet.MONITOR.VGACOLOR] = {
                nHorzPeriodsPerSec: 16700,
                nHorzPeriodsPerFrame: 480,
                percentHorzActive: 85,
                percentVertActive: 83
            };
            
            /*
             * EGA Miscellaneous ports and SW1-Sw4
             *
             * The Card.MISC.CLOCK_SELECT bits determine which of the EGA board's 4 configuration switches are
             * returned via Card.STATUS0.SWSENSE (when SWSENSE is zero, the switch is closed):
             *
             *      0xC: return SW1
             *      0x8: return SW2
             *      0x4: return SW3
             *      0x0: return SW4
             *
             * These 4 bits are also copied to the byte at 40:88h by the EGA BIOS, where bit 0 is SW1, bit 1 is SW2,
             * bit 2 is SW3 and bit 3 is SW4.  Our switch settings come from bEGASwitches, which in turn comes from sSwitches,
             * which in turn comes from the "switches" property passed to the Video component, if any.
             *
             * As usual, the switch settings are reversed in both direction and sense from the switch settings; the
             * good news, however, is that we can use the parseSwitches() method in the ChipSet component to parse them.
             *
             * The set of valid EGA switch values, after conversion, is stored in the table below.  For each value,
             * there is an array that defines the corresponding monitor type(s) for the EGA adapter and any secondary
             * adapter.  The third value is a boolean indicating whether the EGA is the primary adapter.
             */
            Video.aEGAMonitorSwitches = {
                0x06: [ChipSet.MONITOR.TV,           ChipSet.MONITOR.MONO,  true],  // "1001"
                0x07: [ChipSet.MONITOR.COLOR,        ChipSet.MONITOR.MONO,  true],  // "0001"
                0x08: [ChipSet.MONITOR.EGAEMULATION, ChipSet.MONITOR.MONO,  true],  // "1110"
                0x09: [ChipSet.MONITOR.EGACOLOR,     ChipSet.MONITOR.MONO,  true],  // "0110" [our default; see bEGASwitches below]
                0x0a: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.TV,    true],  // "1010"
                0x0b: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.COLOR, true],  // "0010"
                0x00: [ChipSet.MONITOR.TV,           ChipSet.MONITOR.MONO,  false], // "1111"
                0x01: [ChipSet.MONITOR.COLOR,        ChipSet.MONITOR.MONO,  false], // "0111"
                0x02: [ChipSet.MONITOR.EGAEMULATION, ChipSet.MONITOR.MONO,  false], // "1011"
                0x03: [ChipSet.MONITOR.EGACOLOR,     ChipSet.MONITOR.MONO,  false], // "0011"
                0x04: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.TV,    false], // "1101"
                0x05: [ChipSet.MONITOR.MONO,         ChipSet.MONITOR.COLOR, false]  // "0101"
            };
            
            /**
             * @class Font
             * @property {number} cxCell
             * @property {number} cyCell
             * @property {Array} aCSSColors
             * @property {Array} aRGBColors
             * @property {Array} aColorMap
             * @property {Array} aCanvas
             */
            
            /*
             * Supported Fonts
             *
             * Once we've finished loading the standard 8K font file, aFonts[] should contain one or more of the
             * fonts listed below.  For the standard MDA/CGA font ROM, the first (MDA) font resides in the first 4Kb,
             * and the second and third (CGA) fonts reside in the two 2K halves of the second 4Kb.
             *
             * It may seem odd that the cell size for FONT_CGAD is *larger* than the cell size for FONT_CGA,
             * since 40-column mode is actually lower resolution, but since we don't shrink the screen canvas when we
             * shrink the mode, the characters must be drawn larger, and they look better if we don't have to scale them.
             *
             * From the IBM EGA Manual (p.5):
             *
             *     "In alphanumeric modes, characters are formed from one of two ROM (Read Only Memory) character
             *      generators on the adapter. One character generator defines 7x9 characters in a 9x14 character box.
             *      For Enhanced Color Display support, the 9x14 character set is modified to provide an 8x14 character set.
             *      The second character generator defines 7x7 characters in an 8x8 character box. These generators contain
             *      dot patterns for 256 different characters. The character sets are identical to those provided by the
             *      IBM Monochrome Display Adapter and the IBM Color/Graphics Monitor Adapter."
             */
            Video.FONT = {
                MDA:    1,          // 9x14 monochrome font
                MDAD:   2,          // 18x28 monochrome font (this is the 9x14 font doubled)
                CGA:    3,          // 8x8 color font
                CGAD:   6,          // 16x16 color font (this is the 8x8 CGA font doubled)
                EGA:    5,          // 8x14 color font
                EGAD:   10,         // 16x28 color font (this is the 8x14 EGA font doubled)
                VGA:    7,          // 8x16 color font
                VGAD:   14          // 16x32 color font (this is the 8x16 VGA font doubled)
            };
            
            /*
             * For each video mode, we need to know the following pieces of information:
             *
             *      0: # of columns (nCols)
             *      1: # of rows (nRows)
             *      2: # cells per word (nCellsPerWord: # of characters or pixels per 16-bit word)
             *      3: # bytes of visible screen padding, if any (used for CGA graphics modes only)
             *      4: font ID (nFont: undefined if graphics mode)
             *
             * By calculating ([0] * [1]) / [2], we obtain the number of 16-bit words that mode actively displays;
             * for example, the amount of visible memory used by mode 0x04 is (320 * 200) / 4, or 16000.
             *
             * The MODES.CGA_40X25 modes specify FONT_CGA instead of FONT_CGAD because we don't automatically
             * load the FONT_CGAD unless the screen is large enough to accommodate it (see the fDoubleFont calculation).
             *
             * To compensate, we have code in setDimensions() that automatically switches to FONT_CGAD if it's loaded AND
             * the cell size warrants the larger font.  We could hard-code FONT_CGAD here, but then we'd always load it,
             * and it might not always be the best fit.
             */
            Video.aModeParms = [];                                                                              // Mode
            Video.aModeParms[Video.MODE.CGA_40X25]          = [ 40,  25,  1,   0, Video.FONT.CGA];              // 0x00
            Video.aModeParms[Video.MODE.CGA_80X25]          = [ 80,  25,  1,   0, Video.FONT.CGA];              // 0x02
            Video.aModeParms[Video.MODE.CGA_320X200]        = [320, 200,  8, 192];                              // 0x04
            Video.aModeParms[Video.MODE.CGA_640X200]        = [640, 200, 16, 192];                              // 0x06
            Video.aModeParms[Video.MODE.MDA_80X25]          = [ 80,  25,  1,   0, Video.FONT.MDA];              // 0x07
            Video.aModeParms[Video.MODE.EGA_320X200]        = [320, 200, 16];                                   // 0x0D
            Video.aModeParms[Video.MODE.EGA_640X200]        = [640, 200, 16];                                   // 0x0E
            Video.aModeParms[Video.MODE.EGA_640X350_MONO]   = [640, 350, 16];                                   // 0x0F
            Video.aModeParms[Video.MODE.EGA_640X350]        = [640, 350, 16];                                   // 0x10
            Video.aModeParms[Video.MODE.VGA_640X480_MONO]   = [640, 480, 16];                                   // 0x11
            Video.aModeParms[Video.MODE.VGA_640X480]        = [640, 480, 16];                                   // 0x12
            Video.aModeParms[Video.MODE.VGA_320X200]        = [320, 200, 2];                                    // 0x13
            
            Video.aModeParms[Video.MODE.CGA_40X25_BW]       = Video.aModeParms[Video.MODE.CGA_40X25];           // 0x01
            Video.aModeParms[Video.MODE.CGA_80X25_BW]       = Video.aModeParms[Video.MODE.CGA_80X25];           // 0x03
            Video.aModeParms[Video.MODE.CGA_320X200_BW]     = Video.aModeParms[Video.MODE.CGA_320X200];         // 0x05
            
            /*
             * MDA attribute byte definitions
             *
             * For MDA, only the following group of ATTR definitions are supported; any FGND/BGND value combinations
             * outside this group will be treated as "normal" (ATTR_FGND_WHITE | ATTR_BGND_BLACK).
             *
             * NOTE: Assuming MDA.MODE.BLINK_ENABLE is set (which the ROM BIOS sets by default), ATTR_BGND_BLINK will
             * cause the *foreground* element of the cell to blink, even though it is part of the *background* attribute bits.
             *
             * Regarding blink rate, characters are supposed to blink every 16 vertical frames, which amounts to .26667 blinks
             * per second, assuming a 60Hz vertical refresh rate.  So roughly every 267ms, we need to take care of any blinking
             * characters.  updateScreen() maintains a global count (cBlinkVisible) of blinking characters, to simplify the
             * decision of when to redraw the screen.
             */
            Video.ATTRS = {};
            Video.ATTRS.FGND_BLACK  = 0x00;
            Video.ATTRS.FGND_ULINE  = 0x01;
            Video.ATTRS.FGND_WHITE  = 0x07;
            Video.ATTRS.FGND_BRIGHT = 0x08;
            Video.ATTRS.BGND_BLACK  = 0x00;
            Video.ATTRS.BGND_WHITE  = 0x70;
            Video.ATTRS.BGND_BLINK  = 0x80;
            Video.ATTRS.BGND_BRIGHT = 0x80;
            Video.ATTRS.DRAW_FGND   = 0x100;        // this is an internal attribute bit, indicating the foreground should be drawn
            Video.ATTRS.DRAW_CURSOR = 0x200;        // this is an internal attribute bit, indicating when the cursor should be drawn
            
            /*
             * Here's a "cheat sheet" for attribute byte combinations that the IBM MDA could have supported.  The original (Aug 1981)
             * IBM Tech Ref is very terse and implies that only those marked with * are actually supported.
             *
             *     *0x00: non-display                       ATTR_FGND_BLACK |                    ATTR_BGND_BLACK
             *     *0x01: underline                         ATTR_FGND_ULINE |                    ATTR_BGND_BLACK
             *     *0x07: normal (white on black)           ATTR_FGND_WHITE |                    ATTR_BGND_BLACK
             *    **0x09: bright underline                  ATTR_FGND_ULINE | ATTR_FGND_BRIGHT | ATTR_BGND_BLACK
             *    **0x0F: bold (bright white on black)      ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLACK
             *     *0x70: reverse (black on white)          ATTR_FGND_BLACK |                  | ATTR_BGND_WHITE
             *      0x81: blinking underline                ATTR_FGND_ULINE |                  | ATTR_BGND_BLINK (or dim background if blink disabled)
             *    **0x87: blinking normal                   ATTR_FGND_WHITE |                  | ATTR_BGND_BLINK (or dim background if blink disabled)
             *      0x89: blinking bright underline         ATTR_FGND_ULINE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or dim background if blink disabled)
             *    **0x8F: blinking bold                     ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or dim background if blink disabled)
             *    **0xF0: blinking reverse                  ATTR_FGND_WHITE | ATTR_FGND_BRIGHT | ATTR_BGND_BLINK (or bright background if blink disabled)
             *
             * Unsupported attributes reportedly display as "normal" (ATTR_FGND_WHITE | ATTR_BGND_BLACK).  However, precisely which
             * attributes are unsupported on the MDA varies depending on the source. Some sources (eg, the IBM Tech Ref) imply that
             * only those marked by * are supported, while others (eg, some--but not all--Peter Norton guides) include those marked
             * by **, and still others include ALL the combinations listed above.
             *
             * Furthermore, according to http://www.seasip.info/VintagePC/mda.html:
             *
             *      Attributes 0x00, 0x08, 0x80 and 0x88 display as black space;
             *      Attribute 0x78 displays as dark green on green; depending on the monitor, there may be a green "halo" where the dark and bright bits meet;
             *      Attribute 0xF0 displays as a blinking version of 0x70 if blink enabled, and black on bright green otherwise;
             *      Attribute 0xF8 displays as a blinking version of 0x78 if blink enabled, and as dark green on bright green otherwise.
             *
             * However, I'm rather skeptical about supporting 0x78 and 0xF8, until I see some evidence that "bright black" actually
             * produced dark green on IBM equipment; it also doesn't sound like a combination many people would have used.  I'll probably
             * treat all of 0x08, 0x80 and 0x88 the same as 0x00, only because it seems logical (they're all "black on black" combinations
             * with only BRIGHT and/or BLINK bits set). Beyond that, I'll likely treat any other combination not listed in the above cheat
             * sheet as "normal".
             *
             * All the discrepancies/disagreements I've found are probably due in part to the proliferation of IBM and non-IBM MDA
             * cards, combined with IBM and non-IBM monochrome monitors, and people assuming that their non-IBM card and/or monitor
             * behaved exactly like the original IBM equipment, which probably wasn't true in all cases.
             *
             * I would like to limit my MDA display support to EXACTLY everything that the IBM MDA supported and nothing more, but
             * since there will be combinations that will logically "fall out" unless I specifically exclude them, it's very likely
             * this implementation will end up being a superset.
             */
            
            /*
             * CGA attribute byte definitions;  these simply extend the set of MDA attributes, with the exception of ATTR_FNGD_ULINE,
             * which the CGA can treat only as ATTR_FGND_BLUE.
             */
            Video.ATTRS.FGND_BLUE       = 0x01;
            Video.ATTRS.FGND_GREEN      = 0x02;
            Video.ATTRS.FGND_CYAN       = 0x03;
            Video.ATTRS.FGND_RED        = 0x04;
            Video.ATTRS.FGND_MAGENTA    = 0x05;
            Video.ATTRS.FGND_BROWN      = 0x06;
            
            Video.ATTRS.BGND_BLUE       = 0x10;
            Video.ATTRS.BGND_GREEN      = 0x20;
            Video.ATTRS.BGND_CYAN       = 0x30;
            Video.ATTRS.BGND_RED        = 0x40;
            Video.ATTRS.BGND_MAGENTA    = 0x50;
            Video.ATTRS.BGND_BROWN      = 0x60;
            
            /* For the MDA, the number of unique "colors" is 5, based on the following supported FGND attribute values:
             *
             *      0x0: black font (attribute value 0x8 is mapped to 0x0)
             *      0x1: green font with underline
             *      0x7: green font without underline (attribute values 0x2-0x6 are mapped to 0x7)
             *      0x9: bright green font with underline
             *      0xf: bright green font without underline (attribute values 0xa-0xe are mapped to 0xf)
             *
             * I'm still not sure about 0x8 (dark green?); for now, I'm mapping it to 0x0, but it may become a 6th supported color.
             *
             * MDA attributes form an index into aMDAColorMap, which produces an index (0-4) into aMDAColors.
             */
            Video.aMDAColors = [
                [0x00, 0x00, 0x00, 0xff],
                [0x7f, 0xc0, 0x7f, 0xff],
                [0x7f, 0xc0, 0x7f, 0xff],
                [0x7f, 0xff, 0x7f, 0xff],
                [0x7f, 0xff, 0x7f, 0xff]
            ];
            Video.aMDAColorMap = [0x0, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x0, 0x3, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4];
            
            Video.aCGAColors = [
                [0x00, 0x00, 0x00, 0xff],   // 0x00: ATTR_FGND_BLACK
                [0x00, 0x00, 0xaa, 0xff],   // 0x01: ATTR_FGND_BLUE
                [0x00, 0xaa, 0x00, 0xff],   // 0x02: ATTR_FGND_GREEN
                [0x00, 0xaa, 0xaa, 0xff],   // 0x03: ATTR_FGND_CYAN
                [0xaa, 0x00, 0x00, 0xff],   // 0x04: ATTR_FGND_RED
                [0xaa, 0x00, 0xaa, 0xff],   // 0x05: ATTR_FGND_MAGENTA
                [0xaa, 0x55, 0x00, 0xff],   // 0x06: ATTR_FGND_BROWN
                [0xaa, 0xaa, 0xaa, 0xff],   // 0x07: ATTR_FGND_WHITE                      (aka light gray)
                [0x55, 0x55, 0x55, 0xff],   // 0x08: ATTR_FGND_BLACK   | ATTR_FGND_BRIGHT (aka gray)
                [0x55, 0x55, 0xff, 0xff],   // 0x09: ATTR_FGND_BLUE    | ATTR_FGND_BRIGHT
                [0x55, 0xff, 0x55, 0xff],   // 0x0A: ATTR_FGND_GREEN   | ATTR_FGND_BRIGHT
                [0x55, 0xff, 0xff, 0xff],   // 0x0B: ATTR_FGND_CYAN    | ATTR_FGND_BRIGHT
                [0xff, 0x55, 0x55, 0xff],   // 0x0C: ATTR_FGND_RED     | ATTR_FGND_BRIGHT
                [0xff, 0x55, 0xff, 0xff],   // 0x0D: ATTR_FGND_MAGENTA | ATTR_FGND_BRIGHT
                [0xff, 0xff, 0x55, 0xff],   // 0x0E: ATTR_FGND_BROWN   | ATTR_FGND_BRIGHT (aka yellow)
                [0xff, 0xff, 0xff, 0xff]    // 0x0F: ATTR_FGND_WHITE   | ATTR_FGND_BRIGHT (aka white)
            ];
            
            Video.aCGAColorSet1 = [Video.ATTRS.FGND_GREEN, Video.ATTRS.FGND_RED,     Video.ATTRS.FGND_BROWN];
            Video.aCGAColorSet2 = [Video.ATTRS.FGND_CYAN,  Video.ATTRS.FGND_MAGENTA, Video.ATTRS.FGND_WHITE];
            
            /*
             * Here is the EGA BIOS default ATC palette register set for color text modes, from which getCardColors()
             * builds a default RGB array, similar to aCGAColors above.
             */
            Video.aEGAPalDef = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x14, 0x07, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F];
            
            Video.aEGAByteToDW = [
                  0x00000000,   0x000000ff,   0x0000ff00,   0x0000ffff,
                  0x00ff0000,   0x00ff00ff,   0x00ffff00,   0x00ffffff,
                  0xff000000|0, 0xff0000ff|0, 0xff00ff00|0, 0xff00ffff|0,
                  0xffff0000|0, 0xffff00ff|0, 0xffffff00|0, 0xffffffff|0
            ];
            
            Video.aEGADWToByte = [];
            Video.aEGADWToByte[0x00000000] = 0x0;
            Video.aEGADWToByte[0x00000080] = 0x1;
            Video.aEGADWToByte[0x00008000] = 0x2;
            Video.aEGADWToByte[0x00008080] = 0x3;
            Video.aEGADWToByte[0x00800000] = 0x4;
            Video.aEGADWToByte[0x00800080] = 0x5;
            Video.aEGADWToByte[0x00808000] = 0x6;
            Video.aEGADWToByte[0x00808080] = 0x7;
            Video.aEGADWToByte[0x80000000|0] = 0x8;
            Video.aEGADWToByte[0x80000080|0] = 0x9;
            Video.aEGADWToByte[0x80008000|0] = 0xa;
            Video.aEGADWToByte[0x80008080|0] = 0xb;
            Video.aEGADWToByte[0x80800000|0] = 0xc;
            Video.aEGADWToByte[0x80800080|0] = 0xd;
            Video.aEGADWToByte[0x80808000|0] = 0xe;
            Video.aEGADWToByte[0x80808080|0] = 0xf;
            
            /**
             * Card(video, iCard, data, cbMemory)
             *
             * Creates an object representing an initial video card state;
             * can also restore a video card from state data created by saveCard().
             *
             * WARNING: Since Card objects are low-level objects that have no UI requirements,
             * they do not inherit from the Component class, so you should only use class methods
             * of Component, such as Component.assert(), or methods of the parent (video) object.
             *
             * @constructor
             * @param {Video} [video]
             * @param {number} [iCard] (see Video.CARD.*)
             * @param {Array|null} [data]
             * @param {number} [cbMemory] is specified if the card must allocate its own memory buffer
             */
            function Card(video, iCard, data, cbMemory)
            {
                /*
                 * If a card was originally not present (eg, EGA), then the state will be empty,
                 * so we need to detect that case and continue indicating that the card is not present.
                 */
                if (iCard !== undefined && (!data || data.length)) {
            
                    this.video = video;
            
                    var specs = Video.cardSpecs[iCard];
                    var nMonitorType = video.nMonitorType || specs[5];
            
                    if (!data || data.length < 6) {
                        data = [false, 0, null, null, 0, new Array(iCard < Video.CARD.EGA? Card.CRTC.TOTAL_REGS : Card.CRTC.EGA.TOTAL_REGS)];
                    }
            
                    /*
                     * If a Debugger is present, we want to stash a bit more info in each Card.
                     */
                    if (DEBUGGER) {
                        this.dbg = video.dbg;
                        this.type = specs[0];
                        this.port = specs[1];
                    }
            
                    this.nCard = iCard;
                    this.addrBuffer = specs[2];     // default (physical) video buffer address
                    this.sizeBuffer = specs[3];     // default video buffer length (this is the total size, not the current visible size; this.cbScreen is calculated on the fly to reflect the latter)
            
                    /*
                     * If no memory size is specified, then setMode() will use addMemory() to automatically add enough
                     * memory blocks to cover the video buffer specified above; otherwise, it instructs addMemory() to call
                     * getMemoryBuffer(), which will return a portion of the buffer (adwMemory) allocated below.  This allows
                     * a card like the EGA to move/resize its video buffer as needed, as well as giving it total control over
                     * the underlying memory.
                     */
                    this.cbMemory = cbMemory || specs[4];
            
                    /*
                     * All of our cardSpec video buffer sizes are based on the default text mode (eg, 4Kb for an MDA, 16Kb for
                     * a CGA), but for a card with 64Kb or more of memory (ie, any EGA card), the default text mode video buffer
                     * size should be dynamically recalculated as the smaller of: cbMemory divided by 4, or 32Kb.
                     */
                    if (this.cbMemory >= 0x10000 && this.addrBuffer >= 0xB0000) {
                        this.sizeBuffer = Math.min(this.cbMemory >> 2, 0x8000);
                    }
            
                    this.fActive    = data[0];
                    this.regMode    = data[1];      // see MDA.MODE* or CGA.MODE_* (use (MDA.MODE.HIRES | MDA.MODE.VIDEO_ENABLE | MDA.MODE.BLINK_ENABLE) if you want to test blinking immediately after the initial power-on reset)
                    this.regColor   = data[2];      // see CGA.COLOR.* (undefined on MDA)
                    this.regStatus  = data[3];      // see MDA.STATUS.* or CGA.STATUS.*
                    this.regCRTIndx = data[4] & 0xff;
                    this.regCRTPrev = (data[4] >> 8) & 0xff;
                    this.regCRTData = data[5];
                    this.nCRTCRegs  = Card.CRTC.TOTAL_REGS;
                    this.asCRTCRegs = DEBUGGER? Card.CRTC.REGS : [];
            
                    if (iCard >= Video.CARD.EGA) {
                        this.nCRTCRegs = Card.CRTC.EGA.TOTAL_REGS;
                        this.asCRTCRegs = DEBUGGER? Card.CRTC.EGA_REGS : [];
                        this.initEGA(data[6], nMonitorType);
                    }
            
                    var monitorSpecs = Video.monitorSpecs[nMonitorType] || Video.monitorSpecs[ChipSet.MONITOR.MONO];
            
                    var nCyclesPerSecond = video.cpu.getCyclesPerSecond();      // eg, 4772727
                    this.nCyclesHorzPeriod = (nCyclesPerSecond / monitorSpecs.nHorzPeriodsPerSec)|0;
                    this.nCyclesHorzActive = (this.nCyclesHorzPeriod * monitorSpecs.percentHorzActive / 100)|0;
                    this.nCyclesVertPeriod = (this.nCyclesHorzPeriod * monitorSpecs.nHorzPeriodsPerFrame)|0;
                    this.nCyclesVertActive = (this.nCyclesVertPeriod * monitorSpecs.percentVertActive / 100)|0;
                    this.nInitCycles = (data[7] || 0);
                }
            }
            
            /*
             * MDA Registers (ports 0x3B4, 0x3B5, 0x3B8, and 0x3BA)
             */
            Card.MDA = {
                CRTC: {
                    INDX: {
                        PORT:           0x3B4,      // NOTE: the low byte of this port address (0xB4) is mirrored at 40:0063 (0x0463)
                        MASK:           0x1F
                    },
                    DATA: {
                        PORT:           0x3B5
                    }
                },
                MODE: {
                    PORT:               0x3B8,      // Mode Select Register, aka CRT Control Port 1 (write-only); the BIOS mirrors this register at 40:0065 (0x0465)
                    HIRES:              0x01,
                    VIDEO_ENABLE:       0x08,
                    BLINK_ENABLE:       0x20
                },
                STATUS: {
                    PORT:               0x3BA,
                    HDRIVE:             0x01,
                    BWVIDEO:            0x08
                },
                /*
                 * TODO: Add support for parallel port(s) someday....
                 */
                PRT_DATA: {
                    PORT:               0x3BC
                },
                PRT_STATUS: {
                    PORT:               0x3BD
                },
                PRT_CTRL: {
                    PORT:               0x3BE
                }
            };
            
            /*
             * CGA Registers (ports 0x3D4, 0x3D5, 0x3D8, 0x3D9, and 0x3DA)
             */
            Card.CGA = {
                CRTC: {
                    INDX: {
                        PORT:           0x3D4,      // NOTE: the low byte of this port address (0xB4) is mirrored at 40:0063 (0x0463)
                        MASK:           0x1F
                    },
                    DATA: {
                        PORT:           0x3D5
                    }
                },
                MODE: {
                    PORT:               0x3D8,      // Mode Select Register (write-only); the BIOS mirrors this register at 40:0065 (0x0465)
                    _80X25:             0x01,
                    GRAPHIC_SEL:        0x02,
                    BW_SEL:             0x04,
                    VIDEO_ENABLE:       0x08,       // same as MDA.MODE.VIDEO_ENABLE
                    HIRES_BW:           0x10,
                    BLINK_ENABLE:       0x20        // same as MDA.MODE.BLINK_ENABLE
                },
                COLOR: {
                    PORT:               0x3D9,      // write-only
                    BORDER:             0x07,
                    BRIGHT:             0x08,
                    BGND_ALT:           0x10,       // alternate, intensified background colors in text mode
                    COLORSET2:          0x20        // selects aCGAColorSet2 colors for 320x200 graphics mode; aCGAColorSet1 otherwise
                },
                STATUS: {
                    PORT:               0x3DA,      // read-only; same for EGA (although the EGA calls this STATUS1, to distinguish it from STATUS0)
                    DISP_RETRACE:       0x01,
                    PEN_TRIGGER:        0x02,
                    PEN_ON:             0x04,
                    VERT_RETRACE:       0x08        // when set, this indicates the CGA is performing a vertical retrace
                },
                /*
                 * TODO: Add support for light pen port(s) someday....
                 */
                CLEAR_PEN: {
                    PORT:               0x3DB
                },
                PRESET_PEN: {
                    PORT:               0x3DC
                }
            };
            
            /*
             * Common CRT hardware registers (ports 0x3B4/0x3B5 or 0x3D4/0x3D5)
             *
             * NOTE: In this implementation, because we have to make at least two of the registers readable (CURSOR_ADDR_HI and CURSOR_ADDR_LO),
             * we end up making ALL the registers readable, otherwise we would have to explicitly block any register marked write-only.  I don't
             * think making the CRT registers fully readable presents any serious compatibility issues, and it actually offers some benefits
             * (eg, improved debugging).
             *
             * However, some things are broken: the (readable) light pen registers on the EGA are overloaded as (writable) vertical retrace
             * registers, so the vertical retrace registers cannot actually be read that way.  I'm sure the VGA solved that problem, but I haven't
             * looked into it yet.
             */
            Card.CRTC = {
                HORZ_TOTAL:             0x00,
                HORZ_DISP:              0x01,
                HORZ_SYNC_POS:          0x02,
                HORZ_SYNC_WIDTH:        0x03,
                VERT_TOTAL:             0x04,
                VERT_TOTAL_ADJ:         0x05,
                VERT_DISP_TOTAL:        0x06,
                VERT_SYNC_POS:          0x07,
                INTERLACE_POS:          0x08,
                MAX_SCAN_LINE:          0x09,
                CURSOR_START: {
                    INDX:               0x0A,
                    MASK:               0x1F,
                    /*
                     * I don't entirely understand these cursor blink control bits.  Here's what the MC6845 datasheet says:
                     *
                     *      Bit 5 is the blink timing control.  When bit 5 is low, the blink frequency is 1/16 of the vertical field rate,
                     *      and when bit 5 is high, the blink frequency is 1/32 of the vertical field rate.  Bit 6 is used to enable a blink.
                     */
                    BLINKON:            0x00,       // (supposedly, 0x04 has the same effect as 0x00)
                    BLINKOFF:           0x20,       // if blinking is disabled, the cursor is effectively hidden
                    BLINKFAST:          0x60        // default is 1/16 of the frame rate; this switches to 1/32 of the frame rate
                },
                CURSOR_END: {
                    INDX:               0x0B,
                    MASK:               0x1F
                },
                START_ADDR_HI:          0x0C,
                START_ADDR_LO:          0x0D,
                CURSOR_ADDR_HI:         0x0E,
                CURSOR_ADDR_LO:         0x0F,
                LIGHT_PEN_HI:           0x10,
                LIGHT_PEN_LO:           0x11,
                TOTAL_REGS:             0x12,       // total CRT registers on MDA/CGA
                EGA: {
                    HORZ_DISP_END:      0x01,
                    HORZ_BLANK_START:   0x02,
                    HORZ_BLANK_END:     0x03,
                    HORZ_RETRACE_START: 0x04,
                    HORZ_RETRACE_END:   0x05,
                    VERT_TOTAL:         0x06,
                    OVERFLOW: {
                        INDX:                   0x07,
                        VERT_TOTAL_BIT8:        0x01,   // bit 8 of register 0x06
                        VERT_DISP_END_BIT8:     0x02,   // bit 8 of register 0x12
                        VERT_RETRACE_START_BIT8:0x04,   // bit 8 of register 0x10
                        VERT_BLANK_START_BIT8:  0x08,   // bit 8 of register 0x15
                        LINE_COMPARE_BIT8:      0x10,   // bit 8 of register 0x18
                        CURSOR_START_BIT8:      0x20,   // bit 8 of register 0x0A (EGA only)
                        VERT_TOTAL_BIT9:        0x20,   // bit 9 of register 0x06 (VGA only)
                        VERT_DISP_END_BIT9:     0x40,   // bit 9 of register 0x12 (VGA only, unused on EGA)
                        VERT_RETRACE_START_BIT9:0x80    // bit 9 of register 0x10 (VGA only, unused on EGA)
                    },
                    PRESET_ROW_SCAN:    0x08,
                    /* EGA/VGA CRTC registers 0x09-0x0F are the same as the MDA/CGA CRTC registers defined above */
                    VERT_RETRACE_START: 0x10,
                    VERT_RETRACE_END:   0x11,
                    VERT_DISP_END:      0x12,
                    /*
                     * The OFFSET register (bits 0-7) specifies the logical line width of the screen.  The starting memory address
                     * for the next character row is larger than the current character row by two or four times this amount.
                     * The OFFSET register is programmed with a word address.  Depending on the method of clocking the CRT Controller,
                     * this word address is [effectively] either a word or double-word address. #IBMVGATechRef
                     */
                    OFFSET:             0x13,
                    UNDERLINE:          0x14,
                    VERT_BLANK_START:   0x15,
                    VERT_BLANK_END:     0x16,
                    MODE_CTRL: {
                        INDX:           0x17,
                        CMS:            0x01,       // Compatibility Mode Support (CGA A13 control)
                        SRSC:           0x02,       // Select Row Scan Counter
                        HRS:            0x04,       // Horizontal Retrace Select
                        CBT:            0x08,       // Count By Two
                        OC:             0x10,       // Output Control
                        AW:             0x20,       // Address Wrap (in Word mode, 1 maps A15 to A0 and 0 maps A13; use the latter when only 64Kb is installed)
                        BM:             0x40,       // Byte Mode (1 selects Byte Mode; 0 selects Word Mode)
                        HR:             0x80        // Hardware Reset
                    },
                    LINE_COMPARE:       0x18,
                    TOTAL_REGS:         0x19        // total CRT registers on EGA/VGA
                },
                ADDR_HI_MASK:           0x3F
            };
            
            if (DEBUGGER) {
                Card.CRTC.REGS      = ["HORZ_TOTAL","HORZ_DISP","HORZ_SYNC_POS","HORZ_SYNC_WIDTH","VERT_TOTAL","VERT_TOTAL_ADJ",
                                       "VERT_DISP","VERT_SYNC_POS","INTERLACE_POS","MAX_SCAN_LINE","CURSOR_START","CURSOR_END",
                                       "START_ADDR_HI","START_ADDR_LO","CURSOR_ADDR_HI","CURSOR_ADDR_LO","LIGHT_PEN_HI","LIGHT_PEN_LO"];
            
                Card.CRTC.EGA_REGS  = ["HORZ_TOTAL","HORZ_DISP_END","HORZ_BLANK_START","HORZ_BLANK_END","HORZ_RETRACE_START","HORZ_RETRACE_END",
                                       "VERT_TOTAL","OVERFLOW","PRESET_ROW_SCAN","MAX_SCAN_LINE","CURSOR_START","CURSOR_END",
                                       "START_ADDR_HI","START_ADDR_LO","CURSOR_ADDR_HI","CURSOR_ADDR_LO","VERT_RETRACE_START","VERT_RETRACE_END",
                                       "VERT_DISP_END","OFFSET","UNDERLINE","VERT_BLANK_START","VERT_BLANK_END","MODE_CTRL","LINE_COMPARE"];
            }
            
            /*
             * EGA/VGA Input Status 1 Register (port 0x3DA)
             *
             * STATUS1 bit 0 has confusing documentation: the EGA Tech Ref says "Logical 0 indicates the CRT raster is in a
             * horizontal or vertical retrace interval", whereas the VGA Tech Ref says "Logical 1 indicates a horizontal or
             * vertical retrace interval," but then clarifies: "This bit is the real-time status of the INVERTED display enable
             * signal".  So, instead of calling bit 0 DISP_ENABLE (or more precisely, DISP_ENABLE_INVERTED), it's simply DISP_RETRACE.
             *
             * STATUS1 diagnostic bits 5 and 4 are set according to the Card.ATC.PLANES.MUX bits:
             *
             *      MUX     Bit 5   Bit 4
             *      ---     ----    ----
             *      00:     Red     Blue
             *      01:     SecBlue Green
             *      10:     SecRed  SecGreen
             *      11:     unused  unused
             */
            Card.STATUS1 = {
                PORT:                   0x3DA,
                DISP_RETRACE:           0x01,       // bit 0: logical OR of horizontal and vertical retrace
                VERT_RETRACE:           0x08,       // bit 3: set during vertical retrace interval
                DIAGNOSTIC:             0x30,       // bits 5,4 are controlled by the Card.ATC.PLANES.MUX bits
                RESERVED:               0xC6
            };
            
            /*
             * EGA/VGA Attribute Controller Registers (port 0x3C0: regATCIndx and regATCData)
             *
             * The current ATC INDX value is stored in cardEGA.regATCIndx (including the Card.ATC.INDX_ENABLE bit), and the
             * ATC DATA values are stored in cardEGA.regATCData.  The state of the ATC INDX/DATA flip-flop is stored in fATCData.
             *
             * Note that the ATC palette registers (0x0-0xf) all use the following 6 bit assignments, with bits 6 and 7 unused:
             *
             *      0: Blue
             *      1: Green
             *      2: Red
             *      3: SecBlue (or mono video)
             *      4: SecGreen (or intensity)
             *      5: SecRed
             */
            Card.ATC = {
                PORT:                   0x3C0,      // ATC Index/Data Port
                INDX_MASK:              0x1F,
                INDX_PAL_ENABLE:        0x20,       // must be clear when loading palette registers
                PALETTE: {
                    INDX:               0x00,       // 16 registers: 0x00 - 0x0F
                    BLUE:               0x01,
                    GREEN:              0x02,
                    RED:                0x04,
                    SECBLUE:            0x08,
                    BRIGHT:             0x10,       // NOTE: The IBM EGA manual (p.56) also calls this the "intensity" bit
                    SECGREEN:           0x10,
                    SECRED:             0x20
                },
                PALETTE_REGS:           0x10,       // 16 total palette registers
                MODE: {
                    INDX:               0x10,       // ATC Mode Control Register
                    GRAPHICS:           0x01,       // bit 0: set for graphics mode, clear for alphanumeric mode
                    MONOEM:             0x02,       // bit 1: set for monochrome emulation mode, clear for color emulation
                    TEXTGRCC:           0x04,       // bit 2: set for line graphics in character codes 0xC0-0xDF, clear otherwise
                    TEXTBLINK:          0x08,       // bit 3: set for text blink attribute, clear for background intensity attribute
                    RESERVED:           0x10,       // bit 4: reserved
                    PANCOMPAT:          0x20,       // bit 5: set for pixel-panning compatibility
                    PELWIDTH:           0x40,       // bit 6: set for 256-color modes, clear for all other modes
                    COLORSEL:           0x80        // bit 7: set for P5,P4 mapped to bits 1,0 of the Color Select register
                },
                OVERSCAN: {
                    INDX:               0x11        // ATC Overscan Color Register
                },
                PLANES: {
                    INDX:               0x12,       // ATC Color Plane Enable Register
                    MASK:               0x0F,
                    MUX:                0x30,
                    RESERVED:           0xC0
                },
                HORZPAN: {
                    INDX:               0x13,       // ATC Horizontal PEL Panning Register
                    SHIFT_LEFT:         0x0F        // bits 0-3 indicate # of pixels to shift left
                },
                COLORSEL: {
                    INDX:               0x14,       // ATC Color Select Register (VGA only)
                    S_COLOR_7:          0x08,       // selects bit 7 of 8-bit color values sent to DAC (except 256-color modes)
                    S_COLOR_6:          0x04,       // selects bit 6 of 8-bit color values sent to DAC (except 256-color modes)
                    S_COLOR_5:          0x02,       // selects bit 5 of 8-bit color values sent to DAC
                    S_COLOR_4:          0x01        // selects bit 4 of 8-bit color values sent to DAC
                },
                TOTAL_REGS:             0x14
            };
            
            if (DEBUGGER) {
                Card.ATC.REGS = ["PAL00","PAL01","PAL02","PAL03","PAL04","PAL05","PAL06","PAL07",
                                 "PAL08","PAL09","PAL0A","PAL0B","PAL0C","PAL0D","PAL0E","PAL0F",
                                 "MODE","OVERSCAN","PLANES","HORZPAN"];
            }
            
            /*
             * EGA/VGA Feature Control Register (port 0x3BA or 0x3DA: regFeat)
             *
             * The EGA BIOS writes 0x1 to Card.FEAT_CTRL.BITS and reads Card.STATUS0.FEAT, then writes 0x2 to
             * Card.FEAT_CTRL.BITS and reads Card.STATUS0.FEAT.  The bits from the first and second reads are shifted
             * into the high nibble of the byte at 40:88h.
             */
            Card.FEAT_CTRL = {
                PORT_MONO:              0x3BA,      // write port address (other than the two bits below, the rest are reserved and/or unused)
                PORT_COLOR:             0x3DA,      // write port address (other than the two bits below, the rest are reserved and/or unused)
                PORT_READ:              0x3CA,      // read port address (VGA only)
                BITS:                   0x03        // feature control bits
            };
            
            /*
             * EGA/VGA Miscellaneous Output Register (port 0x3C2: regMisc)
             */
            Card.MISC = {
                PORT_WRITE:             0x3C2,      // write port address (EGA and VGA)
                PORT_READ:              0x3CC,      // read port addresss (VGA only)
                IO_SELECT:              0x01,       // 0 sets CRT ports to 0x3Bn, 1 sets CRT ports to 0x3Dn
                ENABLE_RAM:             0x02,       // 0 disables video RAM, 1 enables
                CLOCK_SELECT:           0x0C,       // 0x0: 14Mhz I/O clock, 0x4: 16Mhz on-board clock, 0x8: external clock, 0xC: unused
                DISABLE_DRV:            0x10,       // 0 activates internal video drivers, 1 activates feature connector direct drive outputs
                PAGE_ODD_EVEN:          0x20,       // 0 selects the low 64Kb page of video RAM for text modes, 1 selects the high page
                HORZ_POLARITY:          0x40,       // 0 selects positive horizontal retrace
                VERT_POLARITY:          0x80        // 0 selects positive vertical retrace
            };
            
            /*
             * EGA/VGA Input Status 0 Register (port 0x3C2: regStatus0)
             */
            Card.STATUS0 = {
                PORT:                   0x3C2,      // read-only (aka STATUS0, to distinguish it from PORT_CGA_STATUS)
                RESERVED:               0x0F,
                SWSENSE:                0x10,
                SWSENSE_SHIFT:          4,
                FEAT:                   0x60,       // VGA: reserved
                INTERRUPT:              0x80        // 1: video is being displayed; 0: vertical retrace is occurring
            };
            
            /*
             * VGA Subsystem Enable Register (port 0x3C3: regVGAEnable)
             */
            Card.VGA_ENABLE = {
                PORT:                   0x3C3,
                ENABLED:                0x01,       // when set, all VGA I/O and memory decoding is enabled; otherwise disabled (TODO: Implement)
                RESERVED:               0xFE
            };
            
            /*
             * EGA/VGA Sequencer Registers (ports 0x3C4/0x3C5: regSEQIndx and regSEQData)
             */
            Card.SEQ = {
                INDX: {
                    PORT:               0x3C4,      // Sequencer Index Port
                    MASK:               0x07
                },
                DATA: {
                    PORT:               0x3C5       // Sequencer Data Port
                },
                RESET: {
                    INDX:               0x00,       // Sequencer Reset Register
                    ASYNC:              0x01,
                    SYNC:               0x02
                },
                CLOCKING: {
                    INDX:               0x01,       // Sequencer Clocking Mode Register
                    DOTS8:              0x01,       // 1: 8 dots; 0: 9 dots
                    BANDWIDTH:          0x02,       // 0: CRTC has access 4 out of every 5 cycles (for high-res modes); 1: CRTC has access 2 out of 5 (VGA: reserved)
                    SHIFTLOAD:          0x04,
                    DOTCLOCK:           0x08,       // 0: normal dot clock; 1: master clock divided by two (used for 320x200 modes: 0, 1, 4, 5, and D)
                    SHIFT4:             0x10,       // VGA only
                    SCREEN_OFF:         0x20,       // VGA only
                    RESERVED:           0xC0
                },
                MAPMASK: {
                    INDX:               0x02,       // Sequencer Map Mask Register
                    PL0:                0x01,
                    PL1:                0x02,
                    PL2:                0x04,
                    PL3:                0x08,
                    MAPS:               0x0F,
                    RESERVED:           0xF0
                },
                CHARMAP: {
                    INDX:               0x03,       // Sequencer Character Map Select Register
                    SELB:               0x03,       // 0x0: 1st 8Kb of plane 2; 0x1: 2nd 8Kb; 0x2: 3rd 8Kb; 0x3: 4th 8Kb
                    SELA:               0x0C,       // 0x0: 1st 8Kb of plane 2; 0x4: 2nd 8Kb; 0x8: 3rd 8Kb; 0xC: 4th 8Kb
                    SELB_HIGH:          0x10,       // VGA only
                    SELA_HIGH:          0x20        // VGA only
                },
                MEMMODE: {
                    INDX:               0x04,       // Sequencer Memory Mode Register
                    ALPHA:              0x01,       // set for alphanumeric (A/N) mode, clear for graphics (APA or "All Points Addressable") mode (EGA only)
                    EXT:                0x02,       // set if memory expansion installed, clear if not installed
                    SEQUENTIAL:         0x04,       // set for sequential memory access, clear for mapping even addresses to planes 0/2, odd addresses to planes 1/3
                    CHAIN4:             0x08        // VGA only: set to select memory map (plane) based on low 2 bits of address
                },
                TOTAL_REGS:             0x05
            };
            
            if (DEBUGGER) Card.SEQ.REGS = ["RESET","CLOCKING","MAPMASK","CHARMAP","MEMMODE"];
            
            /*
             * VGA Digital-to-Analog Converter (DAC) Registers (regDACMask, regDACState, regDACAddr, and regDACData)
             *
             * To write DAC data, write an address to DAC.ADDR.PORT_WRITE, then write 3 bytes to DAC.DATA.PORT; the low 6 bits
             * of each byte will be concatenated to form an 18-bit DAC value (red is least significant, followed by green, then blue).
             * When the final byte is received, the 18-bit DAC value is updated and regDACAddr is auto-incremented.
             *
             * To read DAC data, the process is similar, but the initial address is written to DAC.ADDR.PORT_READ instead.
             *
             * DAC.STATE.PORT and DAC.ADDR.PORT_WRITE can be read at any time and will not interfere with a read or write operation
             * in progress.  To prevent "snow", reading or writing DAC values should be limited to retrace intervals (see regStatus1),
             * or by using the SCREEN_OFF bit in the SEQ.CLOCKING register.
             */
            Card.DAC = {
                MASK: {
                    PORT:               0x3C6,      // initialized to 0xFF and should not be changed
                    DEFAULT:            0xFF
                },
                STATE: {
                    PORT:               0x3C7,
                    MODE_WRITE:         0x00,       // the DAC is in write mode if bits 0 and 1 are clear
                    MODE_READ:          0x03        // the DAC is in read mode if bits 0 and 1 are set
                },
                ADDR: {
                    PORT_READ:          0x3C7,      // write to initiate a read
                    PORT_WRITE:         0x3C8       // write to initiate a write; read to determine the current ADDR
                },
                DATA: {
                    PORT:               0x3C9
                },
                TOTAL_REGS:             0x100
            };
            
            /*
             * EGA/VGA Graphics Controller Registers (ports 0x3CE/0x3CF: regGRCIndx and regGRCData)
             *
             * The VGA added Write Mode 3, which is described as follows:
             *
             *      "Each map is written with 8 bits of the value contained in the Set/Reset register for that map
             *      (the Enable Set/Reset register has no effect). Rotated system microprocessor data is ANDed with the
             *      Bit Mask register data to form an 8-bit value that performs the same function as the Bit Mask register
             *      does in write modes 0 and 2."
             */
            Card.GRC = {
                POS1_PORT:              0x3CC,      // EGA only, write-only
                POS2_PORT:              0x3CA,      // EGA only, write-only
                INDX: {
                    PORT:               0x3CE,      // GRC Index Port
                    MASK:               0x0F
                },
                DATA: {
                    PORT:               0x3CF       // GRC Data Port
                },
                SRESET: {
                    INDX:               0x00        // GRC Set/Reset Register (write-only; each bit used only if WRITE.MODE0 and corresponding ESR bit set)
                },
                ESRESET: {
                    INDX:               0x01        // GRC Enable Set/Reset Register
                },
                COLORCMP: {
                    INDX:               0x02        // GRC Color Compare Register
                },
                DATAROT: {
                    INDX:               0x03,       // GRC Data Rotate Register
                    COUNT:              0x07,
                    AND:                0x08,
                    OR:                 0x10,
                    XOR:                0x18,
                    FUNC:               0x18,
                    MASK:               0x1F
                },
                READMAP: {
                    INDX:               0x04,       // GRC Read Map Select Register
                    NUM:                0x03
                },
                MODE: {
                    INDX:               0x05,       // GRC Mode Register
                    WRITE: {
                        MODE0:          0x00,       // write mode 0: each plane written with CPU data, rotated as needed, unless SR enabled
                        MODE1:          0x01,       // write mode 1: each plane written with contents of the processor latches (loaded by a read)
                        MODE2:          0x02,       // write mode 2: memory plane N is written with 8 bits matching data bit N
                        MODE3:          0x03,       // write mode 3: VGA only
                        MASK:           0x03
                    },
                    TEST:               0x04,
                    READ: {
                        MODE0:          0x00,       // read mode 0: read map mode
                        MODE1:          0x08,       // read mode 1: color compare mode
                        MASK:           0x08
                    },
                    EVENODD:            0x10,
                    SHIFT:              0x20,
                    COLOR256:           0x40        // VGA only
                },
                MISC: {
                    INDX:               0x06,       // GRC Miscellaneous Register
                    GRAPHICS:           0x01,       // set for graphics mode addressing, clear for text mode addressing
                    CHAIN:              0x02,       // set for odd/even planes selected with odd/even values of the processor AO bit
                    MAPMEM:             0x0C,       //
                    MAPA0128:           0x00,       //
                    MAPA064:            0x04,       //
                    MAPB032:            0x08,       //
                    MAPB832:            0x0C        //
                },
                COLORDC: {
                    INDX:               0x07        // GRC Color "Don't Care" Register
                },
                BITMASK: {
                    INDX:               0x08        // GRC Bit Mask Register
                },
                TOTAL_REGS:             0x09
            };
            
            if (DEBUGGER) Card.GRC.REGS = ["SRESET","ESRESET","COLORCMP","DATAROT","READMAP","MODE","MISC","COLORDC","BITMASK"];
            
            /*
             * EGA Memory Access Functions
             *
             * Here's where we define all the getMemoryAccess() functions that know how to deal with "planar" EGA memory,
             * which consists of 32-bit values for every byte of address space, allowing us to internally store plane 0
             * bytes in bits 0-7, plane 1 bytes in bits 8-15, plane 2 bytes in bits 16-23, and plane 3 bytes in bits 24-31.
             *
             * All our functions have slightly more overhead than the standard Bus memory access functions, because the
             * offset (off) parameter is block-relative, which we must transform into a buffer-relative offset.  Fortunately,
             * all our Memory objects know this and have already recorded their buffer-relative offset in "this.offset".
             *
             * Also, the EGA includes a set of latches, one for each plane, which must be updated on most reads/writes;
             * we rely on the Memory object's "this.controller" property to give us access to the Card's state.
             *
             * And we take a little extra time to conditionally set fDirty on writes, meaning if a write did not actually
             * change the value of the memory, we will not set fDirty.  The default write functions in memory.js don't take
             * that performance hit, but here, it may be worthwhile, because if it results in fewer dirty blocks, display
             * updates may be faster.
             *
             * Note that we don't have to worry about dealing with word accesses that straddle block boundaries, because
             * the Bus component automatically breaks those accesses into separate byte requests.  Similarly, byte and word
             * values for the write functions have already been pre-masked by the Bus component to 8 and 16 bits, respectively.
             *
             * My motto: Be paranoid, but also be careful not to do any more work than you absolutely have to.
             *
             *
             * CGA Emulation on the EGA
             *
             * Modes 4/5 (320x200 low-res graphics) emulate the same buffer format that the CGA uses.  To recap: 1 byte contains
             * 4 pixels (pixel 0 in bits 7-6, pixel 1 in bits 5-4, etc), and thus one row of pixels is 80 (0x50) bytes long.
             * Moreover, all even rows are stored in the first 8K of the video buffer (at 0xB8000), and all odd rows are stored
             * in the second 8K (at 0xBA000).  Of each 8K, only 8000 (0x1F40) bytes are used (80 bytes X 100 rows); the remaining
             * 192 bytes of each 8K are unused.
             *
             * For these modes, the EGA's GRC.MODE is programmed with 0x30: Card.GRC.MODE.EVENODD and Card.GRC.MODE.SHIFT.
             * The latter claims to work by forming each 2-bit pixel with even bits from plane 0 and odd bits from plane 1;
             * however, I'm unclear how that works if even bytes are only written to plane 0 and odd bytes are only written to
             * plane 1, as Card.GRC.MODE.EVENODD implies, because plane 0 would never have any bits for the odd bytes, and
             * plane 1 would never have any bits for the even bytes.  TODO: Figure this out.
             *
             *
             * Even/Odd Memory Access Functions
             *
             * The "EVENODD" functions deal with the EGA's default text-mode addressing, where EVEN addresses are mapped to
             * plane 0 (and 2) and ODD addresses are mapped to plane 1 (and 3).  This occurs when SEQ.MEMMODE.SEQUENTIAL
             * is clear (and GRC.MODE.EVENODD is set), turning address bit 0 (A0) into a "plane select" bit.  Whether A0 is
             * also used as a memory address bit depends on CRTC.MODE_CTRL.BM: if it's set, then we're in "Byte Mode" and A0 is
             * used as-is; if it's clear, then we're in "Word Mode", and either A15 (when CRTC.MODE_CTRL.AW is set) or A13
             * (when CRTC.MODE_CTRL.AW is clear, typically when only 64Kb of EGA memory is installed) is substituted for A0.
             *
             * Note that A13 remains clear until addresses reach 8K, at which point we've spanned 32Kb of EGA memory, so it makes
             * sense to propagate A13 to A0 at that point, so that the next 8K of addresses start using ODD instead of EVEN bytes,
             * and no memory is wasted on a 64Kb EGA card.
             *
             * These functions, however, don't yet deal with all those subtleties: A0 is currently used only as a "plane select"
             * bit and set to zero for addressing purposes, meaning that only the EVEN bytes in EGA memory will ever be used.
             * TODO: Implement the subtleties.
             */
            
            /*
             * Values returned by getAccess(); the high byte describes the read mode, and the low byte describes the write mode.
             *
             * V2 should never appear in any values used by getAccess() or setAccess()/setMemoryAccess(); the sole purpose of V2 is
             * to distinguish newer (V2) access values from older (V1) access values in saved contexts.  It's set when the context
             * is saved, and cleared when the context is restored.  Thus, if V2 is not set on restore, we assume we're dealing with
             * a V1 value, so we run it through the V1 table (below) to produce a V2 value.  Hopefully at some point V1 contexts
             * can be deprecated, and the V2 bit can be eliminated/repurposed.
             */
            Card.ACCESS = {
                READ: {                             // READ values are designed to be OR'ed with WRITE values
                    MODE0:              0x0400,
                    MODE1:              0x0500,
                    EVENODD:            0x1000,
                    CHAIN4:             0x4000,
                    MASK:               0xFF00
                },
                WRITE: {                            // and WRITE values are designed to be OR'ed with READ values
                    MODE0:              0x0000,
                    MODE1:              0x0001,
                    MODE2:              0x0002,
                    MODE3:              0x0003,     // VGA only
                    CHAIN4:             0x0004,
                    EVENODD:            0x0010,
                    ROT:                0x0020,
                    AND:                0x0060,
                    OR:                 0x00A0,
                    XOR:                0x00E0,
                    MASK:               0x00F7      // 0xF7 ensures we strip any lingering V2 bit from the value
                },
                V2:                     0x0008      // this is a signature bit used ONLY to differentiate V2 access values from V1
            };
            
            /*
             * Table of older (V1) access values and their corresponding new values; the new values are similar but a little
             * more rational (for example, using common values for all the logical operations across modes).
             */
            Card.ACCESS.V1 = [];
            Card.ACCESS.V1[0x0002] = Card.ACCESS.READ.MODE0;
            Card.ACCESS.V1[0x0003] = Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD;
            Card.ACCESS.V1[0x0010] = Card.ACCESS.READ.MODE1;
            Card.ACCESS.V1[0x0200] = Card.ACCESS.WRITE.MODE0;
            Card.ACCESS.V1[0x0400] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT;
            Card.ACCESS.V1[0x0600] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND;
            Card.ACCESS.V1[0x0A00] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR;
            Card.ACCESS.V1[0x0E00] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR;
            Card.ACCESS.V1[0x0300] = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD;
            Card.ACCESS.V1[0x1000] = Card.ACCESS.WRITE.MODE1;
            Card.ACCESS.V1[0x2000] = Card.ACCESS.WRITE.MODE2;
            Card.ACCESS.V1[0x6000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND;
            Card.ACCESS.V1[0xA000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR;
            Card.ACCESS.V1[0xE000] = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR;
            
            /**
             * readByteMode0(off, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} [addr]
             * @return {number}
             */
            Card.ACCESS.readByteMode0 = function readByteMode0(off, addr)
            {
                off += this.offset;
                var dw = this.controller.latches = this.adw[off];
                return (dw >> this.controller.nReadMapShift) & 0xff;
            };
            
            /**
             * readByteMode0Chain4(off, addr)
             *
             * See writeByteMode0Chain4 for a description of how writes are distributed across planes.
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} [addr]
             * @return {number}
             */
            Card.ACCESS.readByteMode0Chain4 = function readByteMode0Chain4(off, addr)
            {
                var idw = (off & ~0x3) + this.offset;
                var shift = (off & 0x3) << 3;
                return ((this.controller.latches = this.adw[idw]) >> shift) & 0xff;
            };
            
            /**
             * readByteMode0EvenOdd(off, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} [addr]
             * @return {number}
             */
            Card.ACCESS.readByteMode0EvenOdd = function readByteMode0EvenOdd(off, addr)
            {
                /*
                 * TODO: As discussed in getAccess(), we need to run some tests on real EGA/VGA hardware to determine
                 * exactly what gets latched (ie, from which address) when EVENODD is in effect.  Whatever we learn may
                 * also dictate a special EVENODD function for READ.MODE1 as well.
                 */
                off += this.offset;
                var idw = off & ~0x1;
                var dw = this.controller.latches = this.adw[idw];
                return (!(off & 1)? dw : (dw >> 8)) & 0xff;
            };
            
            /**
             * readByteMode1(off, addr)
             *
             * This mode requires us to step through each of the 8 sets of 4 bits in the specified DWORD of video memory,
             * returning a 1 wherever all 4 match the Color Compare (COLORCMP) Register and a 0 otherwise.  An added wrinkle
             * is that the Color Don't Care (COLORDC) Register can specify that any/all/none of the 4 bits must be ignored.
             *
             * We perform the comparison from most to least significant bit, because that matches how the nColorCompare and
             * nColorDontCare masks are initialized; we could have gone either way, but this is more consistent with the rest
             * of the component (eg, pixels are drawn across the screen from left to right, starting with the most significant
             * bit of each byte).
             *
             * Also note that, while not well-documented, this mode also affects the internal latches, so we make sure those
             * are updated as well.
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} [addr]
             * @return {number}
             */
            Card.ACCESS.readByteMode1 = function readByteMode1(off, addr)
            {
                off += this.offset;
                var dw = this.controller.latches = this.adw[off];
                /*
                 * Minor optimization: we could pre-mask nColorCompare with nColorDontCare, whenever either register
                 * is updated, but that's a drop in the bucket compared to all the other work this function must do.
                 */
                var mask = this.controller.nColorDontCare;
                var color = this.controller.nColorCompare & mask;
                var b = 0, bit = 0x80;
                while (bit) {
                    if ((dw & mask) == color) b |= bit;
                    color >>>= 1;  mask >>>= 1;  bit >>= 1;
                }
                return b;
            };
            
            /**
             * writeByteMode0(off, b, addr)
             *
             * Supporting Set/Reset means that for every plane for which Set/Reset is enabled, we must
             * replace the corresponding byte in dw with a byte of zeros or ones.  This is accomplished with
             * nSetMapMask, nSetMapData, and nSetMapBits.  nSetMapMask is the inverse of the ESRESET bits,
             * because we use it to mask the processor data, nSetMapData records the desired SRESET bits, and
             * nSetMapBits contains the bits to replace those that we masked in the processor data.
             *
             * We could have done this:
             *
             *      dw = (dw & this.controller.nSetMapMask) | (this.controller.nSetMapData & ~this.controller.nSetMapMask)
             *
             * but by maintaining nSetMapBits equal to (nSetMapData & ~nSetMapMask), we are able to make the writes
             * slightly more efficient.
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0 = function writeByteMode0(off, b, addr)
            {
                var idw = off + this.offset;
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode0Chain4(off, b, addr)
             *
             * This is how we distribute a write of 0xff across the address space to the planes, assuming that
             * all planes are enabled by the Sequencer's MAPMASK register (which we assume still controls access):
             *
             *      off     idw     adw[idw]
             *      ------  ------  ----------
             *      0x0000: 0x0000  0x000000ff
             *      0x0001: 0x0000  0x0000ff00
             *      0x0002: 0x0000  0x00ff0000
             *      0x0003: 0x0000  0xff000000
             *      0x0004: 0x0001  0x000000ff
             *      0x0005: 0x0001  0x0000ff00
             *      0x0006: 0x0001  0x00ff0000
             *      0x0007: 0x0001  0xff000000
             *      ...
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0Chain4 = function writeByteMode0Chain4(off, b, addr)
            {
                var idw = (off & ~0x3) + this.offset;
                var shift = (off & 0x3) << 3;
                /*
                 * TODO: Consider adding a separate "unmasked" version of this CHAIN4 write function whenever nSeqMapMask is -1
                 * (or removing nSeqMapMask from the equation altogether, if no one uses CHAIN4 with anything less than all planes enabled).
                 */
                var dw = ((b << shift) & this.controller.nSeqMapMask) | (this.adw[idw] & ~((0xff << shift) & this.controller.nSeqMapMask));
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode0EvenOdd(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0EvenOdd = function writeByteMode0EvenOdd(off, b, addr)
            {
                off += this.offset;
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                //
                // When even/odd addressing is enabled, nSeqMapMask must be cleared for planes 1
                // and 3 if the address is even, and cleared for planes 0 and 2 if the address is odd.
                //
                var idw = off & ~0x1;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                var maskMaps = this.controller.nSeqMapMask & (idw == off? 0x00ff00ff : (0xff00ff00|0));
                dw = (dw & maskMaps) | (this.adw[idw] & ~maskMaps);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode0Rot(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0Rot = function writeByteMode0Rot(off, b, addr)
            {
                var idw = off + this.offset;
                b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode0And(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0And = function writeByteMode0And(off, b, addr)
            {
                var idw = off + this.offset;
                b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                dw &= this.controller.latches;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode0Or(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0Or = function writeByteMode0Or(off, b, addr)
            {
                var idw = off + this.offset;
                b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                dw |= this.controller.latches;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode0Xor(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode0Xor = function writeByteMode0Xor(off, b, addr)
            {
                var idw = off + this.offset;
                b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                dw = (dw & this.controller.nSetMapMask) | this.controller.nSetMapBits;
                dw ^= this.controller.latches;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode1(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (ignored; the EGA latches provide the source data)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode1 = function writeByteMode1(off, b, addr)
            {
                var idw = off + this.offset;
                var dw = (this.adw[idw] & ~this.controller.nSeqMapMask) | (this.controller.latches & this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode1EvenOdd(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (ignored; the EGA latches provide the source data)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode1EvenOdd = function writeByteMode1EvenOdd(off, b, addr)
            {
                /*
                 * TODO: As discussed in getAccess(), we need to run some tests on real EGA/VGA hardware to
                 * determine exactly where latches are written (ie, to which address) when EVENODD is in effect.
                 */
                off += this.offset;
                //
                // When even/odd addressing is enabled, nSeqMapMask must be cleared for planes 1 and 3 if
                // the address is even, and cleared for planes 0 and 2 if the address is odd.
                //
                var idw = off & ~0x1;
                var maskMaps = this.controller.nSeqMapMask & (idw == off? 0x00ff00ff : (0xff00ff00|0));
                var dw = (this.adw[idw] & ~maskMaps) | (this.controller.latches & maskMaps);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode2(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode2 = function writeByteMode2(off, b, addr)
            {
                var idw = off + this.offset;
                var dw = Video.aEGAByteToDW[b & 0xf];
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode2And(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode2And = function writeByteMode2And(off, b, addr)
            {
                var idw = off + this.offset;
                var dw = Video.aEGAByteToDW[b & 0xf];
                dw &= this.controller.latches;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode2Or(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode2Or = function writeByteMode2Or(off, b, addr)
            {
                var idw = off + this.offset;
                var dw = Video.aEGAByteToDW[b & 0xf];
                dw |= this.controller.latches;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode2Xor(off, b, addr)
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode2Xor = function writeByteMode2Xor(off, b, addr)
            {
                var idw = off + this.offset;
                var dw = Video.aEGAByteToDW[b & 0xf];
                dw ^= this.controller.latches;
                dw = (dw & this.controller.nBitMapMask) | (this.controller.latches & ~this.controller.nBitMapMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /**
             * writeByteMode3(off, b, addr)
             *
             * In MODE3, Set/Reset is always enabled, so the ESRESET bits (and therefore nSetMapMask and nSetMapBits)
             * are ignored; we look only at the SRESET bits, which are stored in nSetMapData.
             *
             * Unlike MODE0, we currently have no non-rotate function for MODE3.  If performance dictates, we can add one;
             * ditto for other features like the Sequencer's MAPMASK register (nSeqMapMask).
             *
             * @this {Memory}
             * @param {number} off
             * @param {number} b (which should already be pre-masked to 8 bits; see Bus.prototype.setByteDirect)
             * @param {number} [addr]
             */
            Card.ACCESS.writeByteMode3 = function writeByteMode3(off, b, addr)
            {
                var idw = off + this.offset;
                b = ((b >> this.controller.nDataRotate) | (b << (8 - this.controller.nDataRotate)) & 0xff);
                var dw = b | (b << 8) | (b << 16) | (b << 24);
                var dwMask = (dw & this.controller.nBitMapMask);
                dw = (this.controller.nSetMapData & dwMask) | (this.controller.latches & ~dwMask);
                dw = (dw & this.controller.nSeqMapMask) | (this.adw[idw] & ~this.controller.nSeqMapMask);
                if (this.adw[idw] != dw) {
                    this.adw[idw] = dw;
                    this.fDirty = true;
                }
            };
            
            /*
             * Mappings from getAccess() values to access functions above
             */
            Card.ACCESS.afn = [];
            
            Card.ACCESS.afn[Card.ACCESS.READ.MODE0]  = Card.ACCESS.readByteMode0;
            Card.ACCESS.afn[Card.ACCESS.READ.MODE0  |  Card.ACCESS.READ.CHAIN4]  = Card.ACCESS.readByteMode0Chain4;
            Card.ACCESS.afn[Card.ACCESS.READ.MODE0  |  Card.ACCESS.READ.EVENODD] = Card.ACCESS.readByteMode0EvenOdd;
            Card.ACCESS.afn[Card.ACCESS.READ.MODE1]  = Card.ACCESS.readByteMode1;
            
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0] = Card.ACCESS.writeByteMode0;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.ROT] = Card.ACCESS.writeByteMode0Rot;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.AND] = Card.ACCESS.writeByteMode0And;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.OR]  = Card.ACCESS.writeByteMode0Or;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.XOR] = Card.ACCESS.writeByteMode0Xor;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.CHAIN4]  = Card.ACCESS.writeByteMode0Chain4;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE0 |  Card.ACCESS.WRITE.EVENODD] = Card.ACCESS.writeByteMode0EvenOdd;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE1] = Card.ACCESS.writeByteMode1;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE1 |  Card.ACCESS.WRITE.EVENODD] = Card.ACCESS.writeByteMode1EvenOdd;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2] = Card.ACCESS.writeByteMode2;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 |  Card.ACCESS.WRITE.AND] = Card.ACCESS.writeByteMode2And;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 |  Card.ACCESS.WRITE.OR]  = Card.ACCESS.writeByteMode2Or;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE2 |  Card.ACCESS.WRITE.XOR] = Card.ACCESS.writeByteMode2Xor;
            Card.ACCESS.afn[Card.ACCESS.WRITE.MODE3] = Card.ACCESS.writeByteMode3;
            
            /**
             * initEGA(data)
             *
             * Another one of my frustrations with JSON is that it encodes empty arrays with non-zero lengths as
             * arrays of nulls, which means that any uninitialized register arrays whose elements were all originally
             * undefined come back via the JSON round-trip as *initialized* arrays whose elements are now all null.
             *
             * I'm a bit surprised, because JavaScript purists tell us to always use the '===' operator (eg, use
             * 'aReg[i] === undefined' to determine if an element is initialized), but because of this JSON stupidity,
             * that would require all such tests to become 'aReg[i] === undefined || aReg[i] === null'.  I'm puzzled
             * why the coercion of '==' is considered evil but JSON's coercion of undefined to null is perfectly fine.
             *
             * The simple solution is to change such comparisons to 'aReg[i] == null', because undefined is coerced
             * to null, whereas numeric values are not.
             *
             * [What do I mean by "another" frustration?  Let me talk to you some day about disallowing hex constants,
             * or insisting that property names be quoted, or refusing to allow comments.  I think it's fine for
             * JSON.stringify() to produce output that adheres to rules like that -- although some parameters to control
             * the output would be nice -- but it's completely unnecessary for JSON.parse() to refuse to parse objects
             * that are perfectly valid.]
             *
             * @this {Card}
             * @param {Array|undefined} data
             * @param {number} nMonitorType
             */
            Card.prototype.initEGA = function(data, nMonitorType)
            {
                if (data === undefined) {
                    data = [
                        /* 0*/  false,
                        /* 1*/  0,
                        /* 2*/  new Array(Card.ATC.TOTAL_REGS),
                        /* 3*/  0,
                        /* 4*/  (nMonitorType == ChipSet.MONITOR.MONO? 0: Card.MISC.IO_SELECT),
                        /* 5*/  0,
                        /* 6*/  0,
                        /* 7*/  new Array(Card.SEQ.TOTAL_REGS),
                        /* 8*/  0,
                        /* 9*/  0,
                        /*10*/  0,
                        /*11*/  new Array(Card.GRC.TOTAL_REGS),
                        /*12*/  0,
                        /*13*/  [this.addrBuffer, this.sizeBuffer, this.cbMemory],
                        /*14*/  new Array(this.cbMemory >> 2),      // divide cbMemory by 4 since this is an array of DWORDs (8 bits for each of 4 planes)
                        /*
                         * Card.ACCESS.WRITE.MODE0 by itself is a pretty good default, but if we choose to "randomize" the screen with
                         * text characters prior to starting the machine, defaulting to Card.ACCESS.WRITE.EVENODD is more faithful to how
                         * characters and attributes are typically stored (ie, in planes 0 and 1, respectively).  As soon as the machine
                         * starts up and initializes the hardware itself, these defaults won't matter.
                         */
                        /*15*/  Card.ACCESS.READ.MODE0 | Card.ACCESS.READ.EVENODD | Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.EVENODD | Card.ACCESS.V2,
                        /*16*/  0,
                        /*17*/  0xffffffff|0,
                        /*18*/  0,
                        /*19*/  0xffffffff|0,
                        /*20*/  0,
                        /*21*/  0xffffffff|0,
                        /*22*/  0,
                        /*23*/  0,
                        /*24*/  0,
                        /*25*/  0,
                        /*26*/  Card.VGA_ENABLE.ENABLED,
                        /*27*/  Card.DAC.MASK.DEFAULT,
                        /*28*/  0,
                        /*29*/  0,
                        /*30*/  Card.DAC.STATE.MODE_WRITE,
                        /*31*/  new Array(Card.DAC.TOTAL_REGS)
                    ];
                }
            
                this.fATCData   = data[0];
                this.regATCIndx = data[1];
                this.regATCData = data[2];
                this.asATCRegs  = DEBUGGER? Card.ATC.REGS : [];
                this.regStatus0 = data[3];      // aka STATUS0 (not to be confused with this.regStatus, which the EGA refers to as STATUS1)
                this.regMisc    = data[4];
                this.regFeat    = data[5];      // for feature control bits, see Card.FEAT_CTRL.BITS; for feature status bits, see Card.STATUS0.FEAT
                this.regSEQIndx = data[6];
                this.regSEQData = data[7];
                this.asSEQRegs  = DEBUGGER? Card.SEQ.REGS : [];
                this.regGRCPos1 = data[8];
                this.regGRCPos2 = data[9];
                this.regGRCIndx = data[10];
                this.regGRCData = data[11];
                this.asGRCRegs  = DEBUGGER? Card.GRC.REGS : [];
                this.latches    = data[12];
            
                /*
                 * Since we originally neglected to save/restore the card's active video buffer address and length,
                 * we're now stashing all that information in data[13].  So if we're presented with an old data entry
                 * that contains only the card's memory size, fix it up.
                 *
                 * TODO: This code just creates the required array; the correct video buffer address and length would
                 * still need to be calculated from the current GRC registers; checkMode() knows how to do that, but I'm
                 * not prepared to shoehorn in a call to checkMode() here, and potentially create more issues, for an
                 * old problem that will eventually disappear anyway.
                 */
                var a = data[13];
                if (typeof a == "number") {
                    a = [this.addrBuffer, this.sizeBuffer, a];
                }
                this.addrBuffer = a[0];
                this.sizeBuffer = a[1];
                this.video.assert(this.cbMemory === a[2]);
            
                var cdw = this.cbMemory >> 2;
                this.adwMemory  = data[14];
                if (this.adwMemory && this.adwMemory.length < cdw) {
                    this.adwMemory = State.decompressEvenOdd(this.adwMemory, cdw);
                }
            
                var nAccess = data[15];
                if (nAccess) {
                    if (nAccess & Card.ACCESS.V2) {
                        nAccess &= ~Card.ACCESS.V2;
                    } else {
                        this.video.assert(Card.ACCESS.V1[nAccess & 0xff00] !== undefined && Card.ACCESS.V1[nAccess & 0xff] !== undefined);
                        nAccess = Card.ACCESS.V1[nAccess & 0xff00] | Card.ACCESS.V1[nAccess & 0xff];
                    }
                }
                this.setMemoryAccess(nAccess);
            
                /*
                 * nReadMapShift must perfectly track how the GRC.READMAP register is programmed, so that Card.ACCESS.READ.MODE0
                 * memory read functions read the appropriate plane.  This default is not terribly critical, unless Card.ACCESS.WRITE.MODE0
                 * is chosen as our default AND you want the screen randomizer to work.
                 */
                this.nReadMapShift  = data[16];
            
                /*
                 * Similarly, nSeqMapMask must perfectly track how the SEQ.MAPMASK register is programmed, so that memory write
                 * functions write the appropriate plane(s).  Again, this default is not terribly critical, unless Card.ACCESS.WRITE.MODE0
                 * is chosen as our default AND you want the screen randomizer to work.
                 */
                this.nSeqMapMask    = data[17];
                this.nDataRotate    = data[18];
                this.nBitMapMask    = data[19];
                this.nSetMapData    = data[20];
                this.nSetMapMask    = data[21];
                this.nSetMapBits    = data[22];
                this.nColorCompare  = data[23];
                this.nColorDontCare = data[24];
                this.nStartAddress  = data[25];     // this is the last CRTC start address latched from CRTC.START_ADDR_HI,CRTC.START_ADDR_LO
            
                if (this.nCard == Video.CARD.VGA) {
                    this.regVGAEnable   = data[26];
                    this.regDACMask     = data[27];
                    this.regDACAddr     = data[28];
                    this.regDACShift    = data[29];
                    this.regDACState    = data[30];
                    this.regDACData     = data[31];
                }
            };
            
            /**
             * saveCard()
             *
             * @this {Card}
             * @return {Array}
             */
            Card.prototype.saveCard = function()
            {
                var data = [];
                if (this.nCard !== undefined) {
                    data[0] = this.fActive;
                    data[1] = this.regMode;
                    data[2] = this.regColor;
                    data[3] = this.regStatus;
                    data[4] = this.regCRTIndx | (this.regCRTPrev << 8);
                    data[5] = this.regCRTData;
                    if (this.nCard >= Video.CARD.EGA) {
                        data[6] = this.saveEGA();
                    }
                    data[7] = this.nInitCycles;
                }
                return data;
            };
            
            /**
             * saveEGA()
             *
             * @this {Card}
             * @return {Array}
             */
            Card.prototype.saveEGA = function()
            {
                var data = [];
                data[0]  = this.fATCData;
                data[1]  = this.regATCIndx;
                data[2]  = this.regATCData;
                data[3]  = this.regStatus0;
                data[4]  = this.regMisc;
                data[5]  = this.regFeat;
                data[6]  = this.regSEQIndx;
                data[7]  = this.regSEQData;
                data[8]  = this.regGRCPos1;
                data[9]  = this.regGRCPos2;
                data[10] = this.regGRCIndx;
                data[11] = this.regGRCData;
                data[12] = this.latches;
                data[13] = [this.addrBuffer, this.sizeBuffer, this.cbMemory];
                data[14] = State.compressEvenOdd(this.adwMemory);
                data[15] = this.nAccess | Card.ACCESS.V2;
                data[16] = this.nReadMapShift;
                data[17] = this.nSeqMapMask;
                data[18] = this.nDataRotate;
                data[19] = this.nBitMapMask;
                data[20] = this.nSetMapData;
                data[21] = this.nSetMapMask;
                data[22] = this.nSetMapBits;
                data[23] = this.nColorCompare;
                data[24] = this.nColorDontCare;
                data[25] = this.nStartAddress;
            
                if (this.nCard == Video.CARD.VGA) {
                    data[26] = this.regVGAEnable;
                    data[27] = this.regDACMask;
                    data[28] = this.regDACAddr;
                    data[29] = this.regDACShift;
                    data[30] = this.regDACState;
                    data[31] = this.regDACData;
                }
                return data;
            };
            
            /**
             * dumpRegs()
             *
             * Since we don't pre-allocate the register arrays (eg, ATC, CRTC, GRC, etc) on a Card, we can't
             * rely on their array length, so we instead rely on the number of register names supplied in asRegs.
             *
             * @this {Card}
             * @param {string} sName
             * @param {number} iReg
             * @param {Array} [aRegs]
             * @param {Array} [asRegs]
             */
            Card.prototype.dumpRegs = function(sName, iReg, aRegs, asRegs)
            {
                if (DEBUGGER) {
                    if (!aRegs) {
                        this.dbg.println(sName + ": " + str.toHexByte(iReg));
                        return;
                    }
                    var i, cchMax = 19, s = "";
                    /*
                    var s = "", i, cchMax = 0;
                    for (i = 0; i < asRegs.length; i++) {
                        if (cchMax < asRegs[i].length) cchMax = asRegs[i].length;
                    }
                    cchMax++;
                     */
                    for (i = 0; i < asRegs.length; i++) {
                        if (s) s += '\n';
                        s += sName + "[" + str.toHexByte(i) + "]: " + str.pad(asRegs[i], cchMax) + str.toHexByte(aRegs[i]) + (i === iReg? "*" : "");
                    }
                    this.dbg.println(s);
                }
            };
            
            /**
             * dumpCard()
             *
             * @this {Card}
             */
            Card.prototype.dumpCard = function()
            {
                if (DEBUGGER) {
                    /*
                     * Start with registers that are common to all cards....
                     */
                    this.dumpRegs("CRTC", this.regCRTIndx, this.regCRTData, this.asCRTCRegs);
            
                    if (this.nCard >= Video.CARD.EGA) {
                        this.dumpRegs(" GRC", this.regGRCIndx, this.regGRCData, this.asGRCRegs);
                        this.dumpRegs(" SEQ", this.regSEQIndx, this.regSEQData, this.asSEQRegs);
                        this.dumpRegs(" ATC", this.regATCIndx, this.regATCData, this.asATCRegs);
                        this.dbg.println("   ATCDATA: " + this.fATCData);
                        this.dumpRegs("      FEAT", this.regFeat);
                        this.dumpRegs("      MISC", this.regMisc);
                        this.dumpRegs("   STATUS0", this.regStatus0);
                        /*
                         * There are few more EGA regs we could dump, like GRCPos1, GRCPos2, but does anyone care?
                         */
                    }
            
                    /*
                     * TODO: This simply dumps the last value read from the STATUS1 register, not necessarily
                     * its current state; consider dumping getRetraceBits() instead of (or in addition to) this.
                     */
                    this.dumpRegs("   STATUS1", this.regStatus);
            
                    if (this.nCard == Video.CARD.MDA || this.nCard == Video.CARD.CGA) {
                        this.dumpRegs("   MODEREG", this.regMode);
                    }
            
                    if (this.nCard == Video.CARD.CGA) {
                        this.dumpRegs("     COLOR", this.regColor);
                    }
            
                    if (this.nCard >= Video.CARD.EGA) {
                        this.dbg.println("   LATCHES: 0x" + str.toHex(this.latches));
                        this.dbg.println("    ACCESS: " + str.toHexWord(this.nAccess));
                        this.dbg.println("Use 'dump video [addr]' to dump video memory");
                        /*
                         * There are few more EGA regs we could dump, like GRCPos1, GRCPos2, but does anyone care?
                         */
                    }
                }
            };
            
            /**
             * dumpBuffer()
             *
             * @this {Card}
             * @param {string} sParm
             */
            Card.prototype.dumpBuffer = function(sParm)
            {
                if (DEBUGGER) {
                    if (!this.adwMemory) {
                        this.dbg.println("no buffer");
                        return;
                    }
                    var idw = str.parseInt(sParm);
                    idw = (idw !== undefined? idw - this.addrBuffer : (this.prevDump || 0));
                    if (idw < 0) idw = 0;
                    var cLines = 8, sDump = "";
                    for (var iLine = 0; iLine < cLines; iLine++) {
                        var sData = str.toHex(this.addrBuffer + idw) + ":";
                        for (var i = 0; i < 8 && idw < this.adwMemory.length; i++) {
                            var dw = this.adwMemory[idw++];
                            sData += " " + str.toHex(dw);
                        }
                        if (sDump) sDump += "\n";
                        sDump += sData;
                    }
                    if (sDump) this.dbg.println(sDump);
                    this.prevDump = idw;
                }
            };
            
            /**
             * getMemoryBuffer(addr)
             *
             * If we passed a controller object (ie, this card) to addMemory(), then each allocated Memory block
             * will call this function to obtain a buffer.
             *
             * @this {Card}
             * @param {number} addr
             * @return {Array} containing the buffer (and the offset within that buffer that corresponds to the requested block)
             */
            Card.prototype.getMemoryBuffer = function(addr)
            {
                return [this.adwMemory, addr - this.addrBuffer];
            };
            
            /**
             * getMemoryAccess()
             *
             * Return the last set of memory access functions recorded by setMemoryAccess().
             *
             * @this {Card}
             * @return {Array.<function()>}
             */
            Card.prototype.getMemoryAccess = function()
            {
                return this.afnAccess;
            };
            
            /**
             * setMemoryAccess(nAccess)
             *
             * This transforms the memory access value that getAccess() returns into the best available set of
             * memory access functions, which are then returned via getMemoryAccess() to any memory blocks we allocate
             * or modify.
             *
             * @this {Card}
             * @param {number|undefined} nAccess
             */
            Card.prototype.setMemoryAccess = function(nAccess)
            {
                if (nAccess != null && nAccess != this.nAccess) {
            
                    var nReadAccess = nAccess & Card.ACCESS.READ.MASK;
                    var fnReadByte = Card.ACCESS.afn[nReadAccess];
                    if (!fnReadByte) {
                        if (DEBUG && this.dbg) {
                            this.dbg.message("Card.setMemoryAccess(" + str.toHexWord(nAccess) + "): missing readByte handler");
                            this.dbg.stopCPU();     // let's take a look
                        }
                        if (nReadAccess & Card.ACCESS.READ.EVENODD) {
                            fnReadByte = Card.ACCESS.afn[Card.ACCESS.READ.EVENODD];
                        }
                    }
                    var nWriteAccess = nAccess & Card.ACCESS.WRITE.MASK;
                    var fnWriteByte = Card.ACCESS.afn[nWriteAccess];
                    if (!fnWriteByte) {
                        if (DEBUG && this.dbg) {
                            this.dbg.message("Card.setMemoryAccess(" + str.toHexWord(nAccess) + "): missing writeByte handler");
                            this.dbg.stopCPU();     // let's take a look
                        }
                        if (nWriteAccess & Card.ACCESS.WRITE.EVENODD) {
                            fnWriteByte = Card.ACCESS.afn[Card.ACCESS.WRITE.EVENODD];
                        }
                    }
                    if (!this.afnAccess) this.afnAccess = new Array(6);
                    this.afnAccess[0] = fnReadByte;
                    this.afnAccess[3] = fnWriteByte;
                    this.nAccess = nAccess;
                }
            };
            
            /*
             * Card Specifications
             *
             * We support dynamically switching between MDA and CGA cards by simply flipping switches on
             * the virtual SW1 switch block and resetting the machine.  However, I'm not sure I'll support
             * dynamically switching the EGA card the same way; there's certainly no UI for it at this point.
             *
             * For each supported card, there is a cardSpec array that the Card class uses to initialize the
             * card's defaults:
             *
             *      [0]: card descriptor
             *      [1]: default CRTC port address
             *      [2]: default video buffer address
             *      [3]: default video buffer size
             *      [4]: total on-board memory (if no "memory" parm was specified)
             *      [5]: default monitor type
             *
             * If total on-board memory is zero, then addMemory() will simply add the specified video buffer
             * to the address space; otherwise, we will allocate an internal buffer (adwMemory) and tell addMemory()
             * to map it to the video buffer address.  The latter approach gives us total control over the buffer;
             * refer to getMemoryAccess().
             *
             * TODO: Consider allocating our own buffer for all video cards, not just EGA/VGA.  For MDA/CGA, I'm not
             * sure it would offer any benefits, other than allowing our internal update functions, like updateScreen(),
             * to access the buffer directly, instead of going through the Bus memory interface.
             */
            Video.cardSpecs = [];
            Video.cardSpecs[Video.CARD.MDA] = ["MDA", Card.MDA.CRTC.INDX.PORT, 0xB0000, 0x01000, 0, ChipSet.MONITOR.MONO];
            Video.cardSpecs[Video.CARD.CGA] = ["CGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0, ChipSet.MONITOR.COLOR];
            Video.cardSpecs[Video.CARD.EGA] = ["EGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0x10000, ChipSet.MONITOR.EGACOLOR];
            Video.cardSpecs[Video.CARD.VGA] = ["VGA", Card.CGA.CRTC.INDX.PORT, 0xB8000, 0x04000, 0x40000, ChipSet.MONITOR.VGACOLOR];
            
            /**
             * initBus(cmp, bus, cpu, dbg)
             *
             * This is a notification issued by the Computer component, after all the other components (notably the CPU)
             * have had a chance to initialize.
             *
             * @this {Video}
             * @param {Computer} cmp
             * @param {Bus} bus
             * @param {X86CPU} cpu
             * @param {Debugger} dbg
             */
            Video.prototype.initBus = function(cmp, bus, cpu, dbg)
            {
                this.bus = bus;
                this.cpu = cpu;
                this.dbg = dbg;
            
                /*
                 * The only time we do NOT want to trap MDA ports is when the model has been specifically set to CGA.
                 */
                if (Video.CARD.NAMES[this.model] != Video.CARD.CGA) {
                    bus.addPortInputTable(this, Video.aMDAPortInput);
                    bus.addPortOutputTable(this, Video.aMDAPortOutput);
                }
            
                /*
                 * Similarly, the only time we do NOT want to trap CGA ports is when the model has been specifically set to MDA.
                 */
                if (Video.CARD.NAMES[this.model] != Video.CARD.MDA) {
                    bus.addPortInputTable(this, Video.aCGAPortInput);
                    bus.addPortOutputTable(this, Video.aCGAPortOutput);
                }
            
                /*
                 * Note that in the case of EGA and VGA models, the above code ensures that we will trap both MDA and CGA
                 * port ranges -- which is good, because both the EGA and VGA can be reprogrammed to respond to those ports,
                 * but also potentially bad if you want to simulate a "dual display" system, where one of the displays is
                 * driven by either an MDA or CGA.
                 *
                 * However, you should still be able to make that work by loading the MDA or CGA video component first, because
                 * components should be initialized in the order they appear in the machine configuration file.  Any attempt
                 * by another component to trap the same ports should be ignored.
                 */
                if (this.nCard >= Video.CARD.EGA) {
                    bus.addPortInputTable(this, Video.aEGAPortInput);
                    bus.addPortOutputTable(this, Video.aEGAPortOutput);
                }
            
                if (this.nCard == Video.CARD.VGA) {
                    bus.addPortInputTable(this, Video.aVGAPortInput);
                    bus.addPortOutputTable(this, Video.aVGAPortOutput);
                }
            
                if (DEBUGGER && dbg) {
                    var video = this;
                    dbg.messageDump(Messages.VIDEO, function onDumpVideo(sParm) {
                        video.dumpVideo(sParm);
                    });
                }
            
                /*
                 * If we have an associated keyboard, then ensure that the keyboard will be notified whenever
                 * the canvas gets focus and receives input.
                 */
                this.kbd = cmp.getComponentByType("Keyboard");
                if (this.kbd && this.canvasScreen) {
                    for (var s in this.bindings) {
                        if (s.indexOf("lock") > 0) this.kbd.setBinding("led", s, this.bindings[s]);
                    }
                    this.kbd.setBinding(this.textareaScreen? "textarea" : "canvas", "kbd", this.inputScreen);
                }
            
                this.bEGASwitches = 0x09;   // our default "switches" setting (see aEGAMonitorSwitches)
                this.chipset = cmp.getComponentByType("ChipSet");
                if (this.chipset && this.sSwitches) {
                    if (this.nCard == Video.CARD.EGA) this.bEGASwitches = this.chipset.parseSwitches(this.sSwitches, this.bEGASwitches);
                }
            
                if (this.kbd && this.fTouchScreen) this.captureTouch();
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {Video}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "refresh")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            Video.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                var video = this;
            
                if (!this.bindings[sBinding]) {
            
                    /*
                     * We now save every binding that comes in, so that if there are bindings for "caps-lock' and the like,
                     * we can forward them to the Keyboard.
                     */
                    this.bindings[sBinding] = control;
            
                    switch (sBinding) {
            
                    case "fullScreen":
                        if (this.container && this.container.doFullScreen) {
                            control.onclick = function onClickFullScreen() {
                                if (DEBUG) video.printMessage("fullScreen()");
                                video.doFullScreen();
                            };
                        } else {
                            if (DEBUG) this.log("FullScreen API not available");
                            control.parentNode.removeChild(control);
                        }
                        return true;
            
                    case "lockPointer":
                        this.sLockMessage = control.textContent;
                        if (this.inputScreen && this.inputScreen.lockPointer) {
                            control.onclick = function onClickLockPointer() {
                                if (DEBUG) video.printMessage("lockPointer()");
                                video.lockPointer(true);
                            };
                        } else {
                            if (DEBUG) this.log("Pointer Lock API not available");
                            control.parentNode.removeChild(control);
                        }
                        return true;
            
                    case "refresh":
                        control.onclick = function onClickRefresh() {
                            if (DEBUG) video.printMessage("refreshScreen()");
                            video.updateScreen(true);
                        };
                        return true;
            
                    default:
                        break;
                    }
                }
                return false;
            };
            
            /**
             * setFocus()
             *
             * @this {Video}
             */
            Video.prototype.setFocus = function()
            {
                if (this.inputScreen) this.inputScreen.focus();
            };
            
            /**
             * getInput()
             *
             * This is an interface used by the Mouse component, so that it can invoke capture/release mouse events from the screen element.
             *
             * @this {Video}
             * @param {Mouse} [mouse]
             * @return {Object|undefined}
             */
            Video.prototype.getInput = function(mouse)
            {
                this.mouse = mouse;
                return this.inputScreen;
            };
            
            /**
             * doFullScreen()
             *
             * @this {Video}
             * @return {boolean} true if request successful, false if not (eg, failed OR not supported)
             */
            Video.prototype.doFullScreen = function()
            {
                var fSuccess = false;
                if (this.container) {
                    if (this.container.doFullScreen) {
                        /*
                         * Styling the container with a width of "100%" and a height of "auto" works great when the aspect ratio
                         * of our virtual screen is at least roughly equivalent to the physical screen's aspect ratio, but now that
                         * we support virtual VGA screens with an aspect ratio of 1.33, that's very much out of step with modern
                         * wide-screen monitors, which usually have an aspect ratio of 1.6 or greater.
                         *
                         * And unfortunately, none of the browsers I've tested appear to make any attempt to scale our container to
                         * the physical screen's dimensions, so the bottom of our screen gets clipped.  To prevent that, I reduce
                         * the width from 100% to whatever percentage will accommodate the entire height of the virtual screen.
                         *
                         * NOTE: Mozilla recommends both a width and a height of "100%", but all my tests suggest that using "auto"
                         * for height works equally well, so I'm sticking with it, because "auto" is also consistent with how I've
                         * implemented a responsive canvas when the browser window is being resized.
                         */
                        var sWidth = "100%";
                        var sHeight = "auto";
                        if (screen && screen.width && screen.height) {
                            var aspectPhys = screen.width / screen.height;
                            var aspectVirt = this.cxScreen / this.cyScreen;
                            if (aspectPhys > aspectVirt) {
                                sWidth = Math.round(aspectVirt / aspectPhys * 100) + '%';
                            }
                            // TODO: We may need to someday consider the case of a physical screen with an aspect ratio < 1.0....
                        }
                        if (!this.fGecko) {
                            this.container.style.width = sWidth;
                            this.container.style.height = sHeight;
                        } else {
                            /*
                             * Sadly, the above code doesn't work for Firefox, because as http://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode
                             * explains:
                             *
                             *      'It's worth noting a key difference here between the Gecko and WebKit implementations at this time:
                             *      Gecko automatically adds CSS rules to the element to stretch it to fill the screen: "width: 100%; height: 100%".
                             *
                             * Which would be OK if Gecko did that BEFORE we're called, but apparently it does that AFTER, effectively
                             * overwriting our careful calculations.  So we style the inner element (canvasScreen) instead, which
                             * requires even more work to ensure that the canvas is properly centered.  FYI, this solution is consistent
                             * with Mozilla's recommendation for working around their automatic CSS rules:
                             *
                             *      '[I]f you're trying to emulate WebKit's behavior on Gecko, you need to place the element you want
                             *      to present inside another element, which you'll make fullscreen instead, and use CSS rules to adjust
                             *      the inner element to match the appearance you want.'
                             */
                            this.canvasScreen.style.width = sWidth;
                            this.canvasScreen.style.width = sWidth;
                            this.canvasScreen.style.display = "block";
                            this.canvasScreen.style.margin = "auto";
                        }
                        this.container.style.backgroundColor = "black";
                        this.container.doFullScreen();
                        fSuccess = true;
                    }
                    this.setFocus();
                }
                return fSuccess;
            };
            
            /**
             * notifyFullScreen(fFullScreen)
             *
             * @this {Video}
             * @param {boolean|null} fFullScreen (null if there was a full-screen error)
             */
            Video.prototype.notifyFullScreen = function(fFullScreen)
            {
                if (!fFullScreen && this.container) {
                    if (!this.fGecko) {
                        this.container.style.width = this.container.style.height = "";
                    } else {
                        this.canvasScreen.style.width = this.canvasScreen.style.height = "";
                    }
                }
                this.printMessage("notifyFullScreen(" + fFullScreen + ")", true);
                if (this.kbd) this.kbd.notifyEscape(fFullScreen);
            };
            
            /**
             * lockPointer()
             *
             * @this {Video}
             * @param {boolean} fLock
             * @return {boolean} true if request successful, false if not (eg, failed OR not supported)
             */
            Video.prototype.lockPointer = function(fLock)
            {
                var fSuccess = false;
                if (this.inputScreen) {
                    if (fLock) {
                        if (this.inputScreen.lockPointer) {
                            this.inputScreen.lockPointer();
                            this.mouse.notifyPointerLocked(true);
                            fSuccess = true;
                        }
                    } else {
                        if (this.inputScreen.unlockPointer) {
                            this.inputScreen.unlockPointer();
                            this.mouse.notifyPointerLocked(false);
                            fSuccess = true;
                        }
                    }
                    this.setFocus();
                }
                return fSuccess;
            };
            
            /**
             * notifyPointerActive(fActive)
             *
             * @this {Video}
             * @param {boolean} fActive
             * @return {boolean} true if autolock enabled AND pointer lock supported, false if not
             */
            Video.prototype.notifyPointerActive = function(fActive)
            {
                if (this.fAutoLock) {
                    return this.lockPointer(fActive);
                }
                return false;
            };
            
            /**
             * notifyPointerLocked(fLocked)
             *
             * @this {Video}
             * @param {boolean} fLocked
             */
            Video.prototype.notifyPointerLocked = function(fLocked)
            {
                if (this.mouse) {
                    this.mouse.notifyPointerLocked(fLocked);
                    if (this.kbd) this.kbd.notifyEscape(fLocked);
                }
                var control = this.bindings["lockPointer"];
                if (control) control.textContent = (fLocked? "Press Esc to Unlock Pointer" : this.sLockMessage);
            };
            
            /**
             * captureTouch()
             *
             * @this {Video}
             */
            Video.prototype.captureTouch = function()
            {
                var control = this.inputScreen;
                if (control) {
                    var video = this;
                    if (!this.fCaptured) {
                        control.addEventListener(
                            'touchstart',
                            function onTouchStart(event) { video.onTouchStart(event); },
                            false                   // we'll specify false for the 'useCapture' parameter for now...
                        );
                        control.addEventListener(
                            'touchmove',
                            function onTouchMove(event) { video.onTouchMove(event); },
                            true
                        );
                        control.addEventListener(
                            'touchend',
                            function onTouchEnd(event) { video.onTouchEnd(event); },
                            false                   // we'll specify false for the 'useCapture' parameter for now...
                        );
                        if (DEBUG) {
                            /*
                             */
                            control.addEventListener(
                                'mousedown',
                                function onMouseDown(event) { video.onTouchStart(event); },
                                false               // we'll specify false for the 'useCapture' parameter for now...
                            );
                            /*
                            control.addEventListener(
                                'mousemove',
                                function onMouseMove(event) { video.onTouchMove(event); },
                                true
                            );
                            control.addEventListener(
                                'mouseup',
                                function onMouseUp(event) { video.onTouchEnd(event); },
                                false               // we'll specify false for the 'useCapture' parameter for now...
                            );
                             */
                        }
                        // this.log("touch events captured");
                        this.fCaptured = true;
                    }
                }
            };
            
            /**
             * onFocusChange(fFocus)
             *
             * @this {Video}
             * @param {boolean} fFocus is true if gaining focus, false if losing it
             */
            Video.prototype.onFocusChange = function(fFocus)
            {
                /*
                 * As per http://stackoverflow.com/questions/6740253/disable-scrolling-when-changing-focus-form-elements-ipad-web-app,
                 * I decided to try this work-around to prevent the webpage from scrolling around whenever the canvas is given
                 * focus.  That sort of scrolling-into-view sounds great in principle, but in practice, if you were reading some other
                 * portion of the page, it can be irritating to be scrolled away from that portion when refreshing/returning to the page.
                 *
                 * However, this work-around doesn't seem to work with the latest version of Safari (or else I misunderstood something).
                 *
                 *  if (fFocus) {
                 *      window.scrollTo(0, 0);
                 *      window.document.body.scrollTop = 0;
                 *  }
                 */
                this.fHasFocus = fFocus;
                if (this.kbd) this.kbd.onFocusChange(fFocus);
            };
            
            /*
            Video.prototype.releaseTouch = function()
            {
            };
            */
            
            /**
             * onTouchStart(event)
             *
             * @this {Video}
             * @param {Event} event object from a 'touch' event
             */
            Video.prototype.onTouchStart = function(event)
            {
                if (DEBUG) this.printMessage("onTouchStart()");
                this.processTouchEvent(event, true);
            };
            
            /**
             * onTouchMove(event)
             *
             * @this {Video}
             * @param {Event} event object from a 'touch' event
             */
            Video.prototype.onTouchMove = function(event)
            {
                if (DEBUG) this.printMessage("onTouchMove()");
                this.processTouchEvent(event, false);
            };
            
            /**
             * onTouchEnd(event)
             *
             * @this {Video}
             * @param {Event} event object from a 'touch' event
             */
            Video.prototype.onTouchEnd = function(event)
            {
                if (DEBUG) this.printMessage("onTouchEnd()");
            };
            
            /**
             * processTouchEvent(event, fStart)
             *
             * @this {Video}
             * @param {Event} event object from a 'touch' event
             * @param {boolean} fStart if this is a 'touchstart' event
             */
            Video.prototype.processTouchEvent = function(event, fStart)
            {
                // if (!event) event = window.event;
                /*
                 * My thinking here is that if the canvas does NOT yet have focus, then we should actually SKIP
                 * the usual preventDefault() call, so that everything the user has come to expect (eg, activation of
                 * the soft keyboard) will work as before.
                 *
                 * The process of touching the canvas means it should ultimately receive focus, and as long as it
                 * retains focus, preventDefault() will always be called.
                 */
                if (this.fHasFocus) event.preventDefault();
            
                /*
                 * Touch coordinates (that is, the pageX and pageY properties) are relative to the page, so to make
                 * them relative to the canvas, we must subtract the canvas's left and top positions.  This Apple web page:
                 *
                 *      https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingMouseandTouchControlstoCanvas/AddingMouseandTouchControlstoCanvas.html
                 *
                 * makes it sound simple, but it turns out we have to walk the canvas' entire "parentage" of DOM elements
                 * to get the exact offsets.
                 *
                 * TODO: Determine whether the getBoundingClientRect() code used in panel.js for mouse events can also
                 * be used here to simplify this annoyingly complicated code for touch events.
                 */
                var xTouchOffset = 0;
                var yTouchOffset = 0;
                var eCurrent = this.canvasScreen;
                do {
                    if (!isNaN(eCurrent.offsetLeft)) {
                        xTouchOffset += eCurrent.offsetLeft;
                        yTouchOffset += eCurrent.offsetTop;
                    }
                } while ((eCurrent = eCurrent.offsetParent));
            
                /*
                 * Due to the responsive nature of our pages, the displayed size of the canvas may be smaller than the
                 * allocated size, and the coordinates we receive from touch events are based on the currently displayed size.
                 */
                var xScale =  this.cxScreen / this.canvasScreen.offsetWidth;
                var yScale = this.cyScreen / this.canvasScreen.offsetHeight;
            
                /**
                 * @name Event
                 * @property {Array} targetTouches
                 */
                var xTouch, yTouch;
                if (!event.targetTouches) {
                    xTouch = event.pageX;
                    yTouch = event.pageY;
                } else {
                    xTouch = event.targetTouches[0].pageX;
                    yTouch = event.targetTouches[0].pageY;
                }
                xTouch = ((xTouch - xTouchOffset) * xScale);
                yTouch = ((yTouch - yTouchOffset) * yScale);
                var xThird = (xTouch / (this.cxScreen / 3)) | 0;
                var yThird = (yTouch / (this.cyScreen / 3)) | 0;
            
                /*
                 * At this point, xThird and yThird should both be one of 0, 1 or 2, indicating which horizontal and vertical
                 * third of the virtual screen the touch event occurred.
                 */
                if (/* xThird == 1 && */ yThird != 1) {
                    if (!yThird) {
                        this.kbd.addActiveKey(Keyboard.CLICKCODES.UP, true);
                    } else {
                        this.kbd.addActiveKey(Keyboard.CLICKCODES.DOWN, true);
                    }
                } else if (/* yThird == 1 && */ xThird != 1) {
                    if (!xThird) {
                        this.kbd.addActiveKey(Keyboard.CLICKCODES.LEFT, true);
                    } else {
                        this.kbd.addActiveKey(Keyboard.CLICKCODES.RIGHT, true);
                    }
                }
            };
            
            /**
             * powerUp(data, fRepower)
             *
             * @this {Video}
             * @param {Object|null} data
             * @param {boolean} [fRepower]
             * @return {boolean} true if successful, false if failure
             */
            Video.prototype.powerUp = function(data, fRepower)
            {
                if (!fRepower) {
                    if (!data || !this.restore) {
                        this.reset();
                    } else {
                        if (!this.restore(data)) return false;
                    }
                }
                return true;
            };
            
            /**
             * powerDown(fSave, fShutdown)
             *
             * This is where we might add some method of blanking the display, without the disturbing the video
             * buffer contents, and blocking all further updates to the display.
             *
             * @this {Video}
             * @param {boolean} fSave
             * @param {boolean} [fShutdown]
             * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
             */
            Video.prototype.powerDown = function(fSave, fShutdown)
            {
                return fSave && this.save? this.save() : true;
            };
            
            /**
             * reset()
             *
             * @this {Video}
             */
            Video.prototype.reset = function()
            {
                var fRandomize = true;
                var nMonitorType = ChipSet.MONITOR.NONE;
            
                /*
                 * We'll ask the ChipSet what SW1 indicates for monitor type, but we may override it if a specific
                 * video card model is set.  For EGA, SW1 is supposed to be set to indicate NO monitor, and we rely
                 * on the EGA's own switch settings instead.
                 */
                if (this.chipset) {
                    nMonitorType = this.chipset.getSWVideoMonitor();
                }
            
                /*
                 * As we noted in the constructor, when a model is specified, that takes precedence over any monitor
                 * switch settings.  Conversely, when no model is specified, the nCard setting is considered provisional,
                 * so the monitor switch settings, if any, are allowed to determine the card type.
                 */
                if (!this.model) {
                    this.nCard = (nMonitorType == ChipSet.MONITOR.MONO? Video.CARD.MDA : Video.CARD.CGA);
                }
            
                this.nModeDefault = Video.MODE.CGA_80X25;
            
                switch (this.nCard) {
                case Video.CARD.VGA:
                    nMonitorType = ChipSet.MONITOR.VGACOLOR;
                    break;
                case Video.CARD.EGA:
                    var aMonitors = Video.aEGAMonitorSwitches[this.bEGASwitches];
                    /*
                     * TODO: Figure out how to deal with aMonitors[2], the boolean which indicates
                     * whether the EGA is driving the primary monitor (true) or the secondary monitor (false).
                     */
                    if (aMonitors) nMonitorType = aMonitors[0];
                    if (!nMonitorType) nMonitorType = ChipSet.MONITOR.EGACOLOR;
                    break;
                case Video.CARD.MDA:
                    nMonitorType = ChipSet.MONITOR.MONO;
                    this.nModeDefault = Video.MODE.MDA_80X25;
                    break;
                case Video.CARD.CGA:
                    /* falls through */
                default:
                    nMonitorType = ChipSet.MONITOR.COLOR;
                    break;
                }
            
                if (this.nMonitorType !== nMonitorType) {
                    this.nMonitorType = nMonitorType;
                    fRandomize = true;
                }
            
                this.cardActive = null;
                this.cardMono = this.cardMDA = new Card(this, Video.CARD.MDA);
                this.cardColor = this.cardCGA = new Card(this, Video.CARD.CGA);
            
                if (this.nCard < Video.CARD.EGA) {
                    this.cardEGA = new Card();      // define a dummy (uninitialized) EGA card for now
                }
                else {
                    this.cardEGA = new Card(this, this.nCard, null, this.cbMemory);
                    this.enableEGA();
                }
            
                /*
                 * We need to call buildFonts() *after* the card(s) are initialized but *before* setMode() is called.
                 */
                this.buildFonts();
            
                this.nMode = null;
                this.iCellCursor = -1;  // initially, there is no visible cursor cell
                this.cBlinks = -1;      // initially, blinking is not active
                this.cBlinkVisible = 0; // no visible blinking characters (yet)
            
                this.setMode(this.nModeDefault);
            
                if (this.cardActive.addrBuffer && fRandomize) {
                    /*
                     * On the initial power-on, we initialize the video buffer to random characters, as a way of testing
                     * whether our font(s) were successfully loaded.  It's assumed that our default display mode is a text mode,
                     * and that since this is a reset, the CRTC.START_ADDR registers are zero as well.
                     *
                     * If this is an MDA device, then the buffer should reside at 0xB0000 through 0xB0FFF, for a total length
                     * of 4Kb (0x1000), where every even byte contains a character code, and every odd byte contains an attribute
                     * code.  See the ATTR bit definitions above for applicable color, intensity, and blink values.  On a CGA
                     * device, the buffer resides at 0xB8000 through 0xBBFFF, for a total length of 16Kb.
                     *
                     * Note that the only valid MDA display mode (7) is the 80x25 text mode, which uses 4000 bytes (2000 character
                     * bytes + 2000 attribute bytes), not all 4096 bytes; addrScreenLimit reflects the visible limit, not the
                     * physical limit.  Also, as noted in updateScreen(), this simplistic calculation of the extent of visible
                     * screen memory is valid only for text modes; in general, it's safer to use cardActive.sizeBuffer as the extent.
                     */
                    var addrScreenLimit = this.cardActive.addrBuffer + this.cbScreen;
                    for (var addrScreen = this.cardActive.addrBuffer; addrScreen < addrScreenLimit; addrScreen += 2) {
                        var dataRandom = (Math.random() * 0x10000)|0;
                        var bChar, bAttr;
                        if (this.nMonitorType == ChipSet.MONITOR.EGACOLOR || this.nMonitorType == ChipSet.MONITOR.VGACOLOR) {
                            /*
                             * For the EGA, we choose sequential characters; for random characters, copy the MDA/CGA code below.
                             */
                            bChar = (addrScreen >> 1) & 0xff;
                            bAttr = (dataRandom >> 8) & ~Video.ATTRS.BGND_BLINK;    // TODO: turn blink attributes off unless we can ensure blinking is initially disabled
                            if ((bAttr >> 4) == (bAttr & 0xf)) {
                                bAttr ^= 0x0f;      // if background matches foreground, invert foreground to ensure character visibility
                            }
                        } else {
                            bChar = dataRandom & 0xff;
                            bAttr = ((dataRandom & 0x100)? (Video.ATTRS.FGND_WHITE | Video.ATTRS.BGND_BLACK) : (Video.ATTRS.FGND_BLACK | Video.ATTRS.BGND_WHITE)) | ((Video.ATTRS.FGND_BRIGHT /* | Video.ATTRS.BGND_BLINK */) & (dataRandom >> 8));
                        }
                        this.bus.setShortDirect(addrScreen, bChar | (bAttr << 8));
                    }
                    this.updateScreen(true);
                }
            };
            
            /**
             * enableEGA()
             *
             * Redirect cardMono or cardColor to cardEGA as appropriate.
             *
             * @this {Video}
             */
            Video.prototype.enableEGA = function()
            {
                if (!(this.cardEGA.regMisc & Card.MISC.IO_SELECT)) {
                    this.cardMono = this.cardEGA;
                    this.cardColor = this.cardCGA;  // this is done mainly to siphon away any CGA I/O
                } else {
                    this.cardMono = this.cardMDA;   // similarly, this is done to siphon away any MDA I/O
                    this.cardColor = this.cardEGA;
                }
            };
            
            /**
             * save()
             *
             * This implements save support for the Video component.
             *
             * @this {Video}
             * @return {Object}
             */
            Video.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, this.cardMDA.saveCard());
                state.set(1, this.cardCGA.saveCard());
                state.set(2, [this.nMonitorType, this.nModeDefault, this.nMode]);
                state.set(3, this.cardEGA.saveCard());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the Video component.
             *
             * @this {Video}
             * @param {Object} data
             * @return {boolean} true if successful, false if failure
             */
            Video.prototype.restore = function(data)
            {
                var a = data[2];
                this.nMonitorType = a[0];
                this.nModeDefault = a[1];
                this.nMode = a[2];
            
                this.cardActive = null;
                this.cardMono = this.cardMDA = new Card(this, Video.CARD.MDA, data[0]);
                this.cardColor = this.cardCGA = new Card(this, Video.CARD.CGA, data[1]);
            
                /*
                 * If no EGA was originally initialized, then cardEGA will remain uninitialized.
                 */
                this.cardEGA = new Card(this, this.nCard, data[3], this.cbMemory);
                if (this.cardEGA.fActive) this.enableEGA();
            
                /*
                 * We need to call buildFonts() *after* the card(s) are initialized but *before* setMode() is called.
                 */
                this.buildFonts();
            
                /*
                 * While I could restore the active card here, it's better for setMode() to do it, because
                 * setMode() will also take care of mapping the appropriate video buffer.  So, after restore() has
                 * finished, we call checkMode(), because the current video mode (nMode) is determined by the
                 * active card state.
                 *
                 * Unfortunately, that creates a chicken-and-egg problem, since I just said I didn't want to select
                 * the active card here.
                 *
                 * So, we'll add some "cop-out" code to checkMode(): if there's no active card, then fall-back
                 * to the last known video mode (nMode) and force a call to setMode().
                 *
                 *      this.cardActive = (this.cardMDA.fActive? this.cardMDA : (this.cardCGA.fActive? this.cardCGA : undefined));
                 */
                if (!this.checkMode()) return false;
            
                this.checkCursor();
                return true;
            };
            
            /**
             * onLoadSetFonts(sFontFile, sFontData, nErrorCode)
             *
             * @this {Video}
             * @param {string} sFontFile
             * @param {string} sFontData
             * @param {number} nErrorCode (response from server if anything other than 200)
             */
            Video.prototype.onLoadSetFonts = function(sFontFile, sFontData, nErrorCode)
            {
                if (nErrorCode) {
                    this.notice("Unable to load font ROM image (error " + nErrorCode + ")");
                    return;
                }
                try {
                    /*
                     * The most likely source of any exception will be right here, where we're parsing the JSON-encoded data.
                     */
                    var abFontData = eval("(" + sFontData + ")");
            
                    if (!abFontData.length) {
                        Component.error("Empty font ROM image: " + sFontFile);
                        return;
                    }
                    else if (abFontData.length == 1) {
                        Component.error(abFontData[0]);
                        return;
                    }
                    /*
                     * Translate the character data into separate "fonts", each of which will be a separate canvas object, with all
                     * 256 characters arranged in a 16x16 grid.
                     */
                    if (abFontData.length == 8192) {
                        /*
                         * Here are the first few rows of MDA font data, at the 0K and 2K boundaries:
                         *
                         *      00000000  00 00 00 00 00 00 00 00  00 00 7e 81 a5 81 81 bd  |..........~.....|
                         *      00000010  00 00 7e ff db ff ff c3  00 00 00 36 7f 7f 7f 7f  |..~........6....|
                         *      ...
                         *      00000800  00 00 00 00 00 00 00 00  99 81 7e 00 00 00 00 00  |..........~.....|
                         *      00000810  e7 ff 7e 00 00 00 00 00  3e 1c 08 00 00 00 00 00  |..~.....>.......|
                         *
                         * 8 bytes of data from a row in each of the 2K chunks are combined to form a 8-bit wide character with
                         * a maximum height of 16 bits.  Assembling the bits for character 0x01 (a happy face), we observe the following:
                         *
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x0008
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x0009
                         *      0 1 1 1 1 1 1 0  <== 7e from offset 0x000A
                         *      1 0 0 0 0 0 0 1  <== 81 from offset 0x000B
                         *      1 0 1 0 0 1 0 1  <== a5 from offset 0x000C
                         *      1 0 0 0 0 0 0 1  <== 81 from offset 0x000D
                         *      1 0 0 0 0 0 0 1  <== 81 from offset 0x000E
                         *      1 0 1 1 1 1 0 1  <== bd from offset 0x000F
                         *      1 0 0 1 1 0 0 1  <== 99 from offset 0x0808
                         *      1 0 0 0 0 0 0 1  <== 81 from offset 0x0809
                         *      0 1 1 1 1 1 1 0  <== 7e from offset 0x080A
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080B
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080C
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080D
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080E
                         *      0 0 0 0 0 0 0 0  <== 00 from offset 0x080F
                         *
                         * In the second 2K chunk, we observe that the last two bytes of every font cell definition are zero;
                         * this confirms our understanding that MDA font cell size is 8x14.
                         *
                         * Finally, there's the issue of screen cell size, which is actually 9x14 on the MDA.  We compensate for that
                         * by building a 9x14 font, even though there's only 8x14 bits of data. As http://www.seasip.info/VintagePC/mda.html
                         * explains:
                         *
                         *      "For characters C0h-DFh, the ninth pixel column is a duplicate of the eighth; for others, it's blank."
                         *
                         * This last point is confirmed by "The IBM Personal Computer From The Inside Out", p.295:
                         *
                         *      "Another unique feature of the monochrome adapter is a set of line-drawing and area-fill characters
                         *      that give continuous lines and filled areas. This is unusual for a display with a 9x14 character box
                         *      because the character generator provides a row only eight dots wide. On most displays, a blank 9th
                         *      dot is then inserted between characters. On the monochrome display, there is circuitry that duplicates
                         *      the 8th dot into the 9th dot position for characters whose ASCII codes are 0xB0 [sic] through 0xDF."
                         *
                         * However, the above text is mistaken about the start of the range.  While there ARE line-drawing characters
                         * in the range 0xB0-0xBF, none of them extend all the way to the right edge; IBM carefully segregated them.
                         * And in fact, characters 0xB0-0xB2 contain hash patterns that you would NOT want extended into the 9th column.
                         *
                         * The CGA font is part of the same ROM.  In fact, there are TWO CGA fonts in the ROM: a thin 5x7 "single dot"
                         * font located at offset 0x1000, and a thick 7x7 "double dot" font at offset 0x1800.  The latter is the default
                         * font, unless overridden by a jumper setting on the CGA card, so it is our default CGA font as well (although
                         * someday we may provide a virtual jumper setting that allows you to select the thinner font).
                         *
                         * The first offset we must pass to setFontData() is the offset of the CGA font; we choose the thicker "double dot"
                         * CGA font at 0x1800 (which was the PC's default font as well), instead of the thinner "single dot" font at 0x1000.
                         * The second offset is for the MDA font.
                         */
                        this.setFontData(abFontData, [0x1800, 0x0000]);
                    }
                    else {
                        this.notice("Unrecognized font data length (" + abFontData.length + ")");
                        return;
                    }
            
                } catch (e) {
                    this.notice("Font ROM data error: " + e.message);
                    return;
                }
                /*
                 * If we're still here, then we're ready!
                 *
                 * UPDATE: Per issue #21, I'm issuing setReady() *only* if a valid contextScreen exists *or* a Debugger is attached.
                 *
                 * TODO: Consider a more general-purpose solution for deciding whether or not the user wants to run in a "headless" mode.
                 */
                if (this.contextScreen || this.dbg) this.setReady();
            };
            
            /**
             * onROMLoad(abRom, aParms)
             *
             * Called by the ROM's copyROM() function whenever a ROM component with a 'notify' attribute containing
             * our component ID has been loaded.
             *
             * @this {Video}
             * @param {Array.<number>} abROM
             * @param {Array.<number>} [aParms]
             */
            Video.prototype.onROMLoad = function(abROM, aParms)
            {
                if (this.nCard == Video.CARD.EGA) {
                    /*
                     * TODO: Unlike the MDA/CGA font data, we may want to hang onto this data, so that we can
                     * regenerate the color font(s) whenever the foreground and/or background colors have changed.
                     */
                    if (DEBUG) this.printMessage("onROMLoad(): EGA fonts loaded");
                    /*
                     * For EGA cards, in the absence of any parameters, we assume that we're receiving the original
                     * IBM EGA ROM, which stores its 8x14 font data at 0x2230 as a contiguous stream; the total size
                     * of the 8x14 font is 0xE00 bytes.
                     *
                     * At 0x3030, there is an "ALPHA SUPPLEMENT" table, which contains 15 bytes per row instead of 14,
                     * because each row is preceded by one byte containing the corresponding ASCII code; there are 20
                     * entries in the supplemental table, for a total size of 0x12C bytes.
                     *
                     * Finally, at 0x3160, we have the 8x8 font data (also known as the thicker "double dot" CGA font);
                     * the total size of the 8x8 font is 0x800 bytes.  No other font data is present in the EGA ROM;
                     * the thin 5x7 "single dot" CGA font is notably absent, which is fine, because we never loaded it for
                     * the MDA/CGA either.
                     *
                     * TODO: Determine how the supplemental table is used and whether we need to add some "run-time"
                     * font generation to support it (as opposed to "init-time" generation, which is all we do now).
                     * There's probably a similar need for user-defined fonts; for now, they're simply not supported.
                     */
                    this.setFontData(abROM, aParms || [0x3160, 0x2230], 8);
                }
                else if (this.nCard == Video.CARD.VGA) {
                    if (DEBUG) this.printMessage("onROMLoad(): VGA fonts loaded");
                    /*
                     * For VGA cards, in the absence of any parameters, we assume that we're receiving the original
                     * IBM VGA ROM, which contains an 8x14 font at 0x3F8D (and corresponding supplemental table at 0x4D8D)
                     * and an 8x8 font at 0x378D; however, it also contains an 8x16 font at 0x4EBA (and corresponding
                     * supplemental table at 0x5EBA).  See our reconstructed source code in ibm-vga.nasm.
                     */
                    this.setFontData(abROM, aParms || [0x378d, 0x3f8d], 8);
                }
                this.setReady();
            };
            
            /**
             * getCardColors(nBitsPerPixel)
             *
             * @this {Video}
             * @param {number} [nBitsPerPixel]
             * @returns {Array}
             */
            Video.prototype.getCardColors = function(nBitsPerPixel)
            {
                if (nBitsPerPixel == 1) {
                    /*
                     * Only 2 total colors.
                     */
                    this.aRGB[0] = Video.aCGAColors[Video.ATTRS.FGND_BLACK];
                    this.aRGB[1] = Video.aCGAColors[Video.ATTRS.FGND_WHITE];
                    return this.aRGB;
                }
            
                if (nBitsPerPixel == 2) {
                    /*
                     * Of the 4 colors returned, the first color comes from regColor and the other 3 come from one of
                     * the two hard-coded CGA color sets:
                     *
                     *      Color Set 1             Color Set 2
                     *      -----------             -----------
                     *      Background (0x00)       Background (0x00)
                     *      Green      (0x12)       Cyan       (0x13)
                     *      Red        (0x14)       Magenta    (0x15)
                     *      Brown      (0x16)       White      (0x17)
                     *
                     * The numbers in parentheses are the EGA ATC palette register values that the EGA BIOS uses for each
                     * color set; on an EGA, I synthesize a fake CGA regColor value, until I figure out exactly how the EGA
                     * simulates the CGA color palette.  TODO: Figure it out.
                     */
                    var regColor = this.cardActive.regColor;
                    if (this.cardActive === this.cardEGA) {
                        var bBackground = this.cardEGA.regATCData[0];
                        regColor = bBackground & Card.CGA.COLOR.BORDER;
                        if (bBackground & Card.ATC.PALETTE.BRIGHT) regColor |= Card.CGA.COLOR.BRIGHT;
                        if (this.cardEGA.regATCData[1] != 0x12) regColor |= Card.CGA.COLOR.COLORSET2;
                    }
                    this.aRGB[0] = Video.aCGAColors[regColor & (Card.CGA.COLOR.BORDER | Card.CGA.COLOR.BRIGHT)];
                    var aColorSet = (regColor & Card.CGA.COLOR.COLORSET2)? Video.aCGAColorSet2 : Video.aCGAColorSet1;
                    for (var iColor = 0; iColor < aColorSet.length; iColor++) {
                        this.aRGB[iColor+1] = Video.aCGAColors[aColorSet[iColor]];
                    }
                    return this.aRGB;
                }
            
                if (this.cardColor === this.cardCGA) {
                    /*
                     * There's no need to update this.aRGB if we simply want to return a hard-coded set of 16 colors.
                     */
                    return Video.aCGAColors;
                }
            
                this.assert(this.cardColor === this.cardEGA);
            
                var aRegs = (this.cardEGA.regATCData[15] != null? this.cardEGA.regATCData : Video.aEGAPalDef);
                for (var i = 0; i < this.aRGB.length; i++) {
                    var b = aRegs[i] || 0;
                    var bRed =   (((b & 0x04)? 0xaa : 0) | ((b & 0x20)? 0x55 : 0));
                    var bGreen = (((b & 0x02)? 0xaa : 0) | ((b & 0x10)? 0x55 : 0));
                    var bBlue =  (((b & 0x01)? 0xaa : 0) | ((b & 0x08)? 0x55 : 0));
                    this.aRGB[i] = [bRed, bGreen, bBlue, 0xff];
                }
                return this.aRGB;
            };
            
            /**
             * setFontData(abFontData, aFontOffsets, cxFontChar)
             *
             * To support partial font rebuilds (required for the EGA), we now preserve the original font data (abFontData),
             * font offsets (aFontOffsets), and font character width (8 for the EGA, undefined for the MDA/CGA).
             *
             * TODO: Ultimately, we want to have exactly one dedicated font for the EGA, the data for which we'll read directly
             * from plane 2 of video memory, instead of relying on the original font data in ROM.  Relying on the ROM data was
             * originally just a crutch to help get EGA support bootstrapped.
             *
             * Also, for the MDA/CGA, we should be discarding the font data after the first buildFonts() call, because we
             * should not need to ever rebuild the fonts for those cards (both their font patterns and colors were hard-coded).
             *
             * @this {Video}
             * @param {*} abFontData is the raw font data, from the ROM font file
             * @param {Array.<number>} aFontOffsets contains offsets into abFontData: [0] for CGA, [1] for MDA
             * @param {number} [cxFontChar] is a fixed character width to use for all fonts; undefined to use MDA/CGA defaults
             */
            Video.prototype.setFontData = function(abFontData, aFontOffsets, cxFontChar)
            {
                this.abFontData = abFontData;
                this.aFontOffsets = aFontOffsets;
                this.cxFontChar = cxFontChar;
            };
            
            /**
             * buildFonts()
             *
             * buildFonts() is called whenever the Video component is reset or restored; we used to build the fonts as soon
             * as the ROM containing them was loaded, and then throw away the underlying font data, but with the EGA's ability
             * to change the color of any font, font building must now be deferred until the reset or restore notifications,
             * ensuring we have access to all the colors the card is currently programmed to use.
             *
             * We're also called whenever EGA palette registers are modified, since one or more fonts will likely need
             * to be rebuilt (this is because our fonts contain pre-rendered images of all glyphs for all 16 active colors).
             * Calls to buildFonts() should not be expensive though: the underlying createFont() function rebuilds a font only
             * if its color has actually changed.
             *
             * TODO: We should avoid rebuilding fonts when palette registers change in graphics modes.  More importantly, our
             * font code is still written with the assumption that, like the MDA/CGA, the underlying font data never changes.
             * The EGA, however, stores its fonts in plane 2, which means fonts are dynamic; this needs to be fixed.
             *
             * Supporting dynamic EGA fonts should not be hard though.  We can get rid of abFontData and simply build a
             * temporary snapshot of all the font bytes in plane 2 of the EGA's video buffer (adwMemory), and pass that on to
             * buildFont() instead.  We'll also need to either invalidate the existing font's color (to trigger a rebuild) or
             * pass a new "force rebuild" flag.
             *
             * Once that's done, an added benefit will be that we can build just the font(s) that have been loaded into plane 2,
             * instead of the multitude of fonts that we now build on a just-in-case basis (eg, the MDA font, the 8x8 CGA font
             * for 43-line mode, and so on).
             *
             * @this {Video}
             * @return {boolean} true if any or all fonts were (re)built, false if nothing changed
             */
            Video.prototype.buildFonts = function()
            {
                var fChanges = false;
            
                /*
                 * There's no point building any fonts if we're in a non-windowed (eg, command-line) environment or no font data was loaded.
                 */
                if (window && this.abFontData) {
            
                    var aRGBColors = this.getCardColors();
                    var offSplit = 0x0000;
                    var cxChar = this.cxFontChar? this.cxFontChar : 8;
                    if (this.buildFont(Video.FONT.CGA, this.aFontOffsets[0], offSplit, cxChar, 8, this.abFontData, aRGBColors)) {
                        fChanges = true;
                    }
            
                    offSplit = this.cxFontChar? 0 : 0x0800;
                    cxChar = this.cxFontChar? this.cxFontChar : 9;
                    if (this.buildFont(Video.FONT.MDA, this.aFontOffsets[1], offSplit, cxChar, 14, this.abFontData, Video.aMDAColors, Video.aMDAColorMap)) {
                        fChanges = true;
                    }
            
                    if (this.cxFontChar) {
                        if (this.buildFont(this.nCard, this.aFontOffsets[1], 0, this.cxFontChar, 14, this.abFontData, aRGBColors)) {
                            fChanges = true;
                        }
                    }
                }
                return fChanges;
            };
            
            /**
             * buildFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
             *
             * This is a wrapper for createFont() which also takes care loading double-size fonts when fDoubleFont is set.
             *
             * @this {Video}
             * @param {number} nFont
             * @param {number|null} offData is the offset of the font data, null if none
             * @param {number} offSplit is the offset of any split font data, or zero if not split
             * @param {number} cxChar is the width of the font characters
             * @param {number} cyChar is the height of the font characters
             * @param {*} abFontData is the raw font data, from the ROM font file
             * @param {Array} aRGBColors is an array of color RGB variations, corresponding to supported FGND attribute values
             * @param {Array} [aColorMap] contains color indexes corresponding to attribute values (if not supplied, the mapping is assumed to be 1-1)
             * @return {boolean} true if any or all fonts were (re)built, false if nothing changed
             */
            Video.prototype.buildFont = function(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
            {
                var fChanges = false;
            
                if (offData != null) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("buildFont(" + nFont + "): building " + Video.cardSpecs[nFont][0] + " font");
                    }
                    if (this.createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)) fChanges = true;
                    /*
                     * If font-doubling is enabled, then load a double-size version of the font as well, as it provides
                     * sharper rendering, especially when the screen cell size is a multiple of the above font cell size;
                     * in the case of the CGA, this may also be useful for 40-column modes.
                     */
                    if (this.fDoubleFont) {
                        nFont <<= 1;
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("buildFont(" + nFont + "): building " + Video.cardSpecs[nFont >> 1][0] + " double-size font");
                        }
                        if (this.createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)) fChanges = true;
                    }
                }
                return fChanges;
            };
            
            /**
             * createFont(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
             *
             * All color variations are stored on the same font canvas, arranged vertically as a series of grids, where each
             * grid is a 16x16 character glyph array.
             *
             * Since every character must be drawn first with its background color and then with the foreground shape on top,
             * I used to include a series of empty cells at the top every font canvas containing all supported background colors
             * (ie, before the character grids).  But now createFont() also creates an aCSSColors array that is saved alongside
             * the font canvas, and updateChar() uses that array in conjunction with fillRect() to draw character backgrounds.
             *
             * @this {Video}
             * @param {number} nFont
             * @param {number} offData is the offset of the font data
             * @param {number} offSplit is the offset of any split font data, or zero if not split
             * @param {number} cxChar is the width of the font characters
             * @param {number} cyChar is the height of the font characters
             * @param {*} abFontData is the raw font data, from the ROM font file
             * @param {Array} aRGBColors is an array of color RGB variations, corresponding to supported FGND attribute values
             * @param {Array|undefined} aColorMap contains color indexes corresponding to attribute values (if not supplied, the mapping is assumed to be 1-1)
             * @return {boolean} true if any or all fonts were (re)created, false if nothing changed
             */
            Video.prototype.createFont = function(nFont, offData, offSplit, cxChar, cyChar, abFontData, aRGBColors, aColorMap)
            {
                var fChanges = false;
                var nDouble = (nFont & 0x1)? 0 : 1;
                var font = this.aFonts[nFont];
                if (!font) {
                    font = {
                        cxCell:     cxChar << nDouble,
                        cyCell:     cyChar << nDouble,
                        aCSSColors: new Array(aRGBColors.length),
                        aRGBColors: aRGBColors.slice(),     // using the Array slice() method to simply make a copy
                        aColorMap:  aColorMap,
                        aCanvas:    new Array(aRGBColors.length)
                    };
                }
                for (var iColor = 0; iColor < aRGBColors.length; iColor++) {
                    var rgbColor = aRGBColors[iColor];
                    var rgbColorOrig = font.aCSSColors[iColor]? font.aRGBColors[iColor] : [];
                    if (rgbColor[0] !== rgbColorOrig[0] || rgbColor[1] !== rgbColorOrig[1] || rgbColor[2] !== rgbColorOrig[2]) {
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("creating font color " + iColor + " for font " + nFont);
                        }
                        this.createFontColor(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData);
                        fChanges = true;
                    }
                }
                this.aFonts[nFont] = font;
                return fChanges;
            };
            
            /**
             * createFontColor(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData)
             *
             * @this {Video}
             * @param {Object} font
             * @param {number} iColor
             * @param {Array} rgbColor contains the RGB values for iColor
             * @param {number} nDouble is 1 to double output font dimensions, 0 to match input dimensions
             * @param {number} offData is the offset of the font data
             * @param {number} offSplit is the offset of any split font data, or zero if not split
             * @param {number} cxChar is the width of the font characters
             * @param {number} cyChar is the height of the font characters
             * @param {*} abFontData is the raw font data, from the ROM font file
             */
            Video.prototype.createFontColor = function(font, iColor, rgbColor, nDouble, offData, offSplit, cxChar, cyChar, abFontData)
            {
                /*
                 * Now we're ready to create a 16x16 character grid for the specified color.  Note that all
                 * the character bits are opaque (alpha=0xff) while all the surrounding bits are transparent
                 * (alpha=0x00, as specified in the 4th byte of rgbOff).
                 *
                 * Originally, I created 256 ImageData objects, using context.createImageData(cxChar,cyChar),
                 * then setting its pixels to match those of an individual character, and then drawing characters
                 * with contextFont.putImageData().  But putImageData() is relatively slow....
                 *
                 * Now I create a new canvas, with dimensions that allow me to arrange all 256 characters in an
                 * 16x16 grid -- much like the "chargen.png" bitmap used in the C1Pjs version of the Video component.
                 * Then drawing becomes much the same as before, because it turns out that drawImage() accepts either
                 * an image object OR a canvas object.
                 *
                 * This also yields better performance, since drawImage() is much faster than putImageData().
                 * We still have to use putImageData() to build the font canvas, but that's a one-time operation.
                 */
                var rgbOff = [0x00, 0x00, 0x00, 0x00];
                var canvasFont = window.document.createElement("canvas");
                canvasFont.width = font.cxCell << 4;
                canvasFont.height = (font.cyCell << 4);
                var contextFont = canvasFont.getContext("2d");
            
                /*
                 * See notes above regarding ImageSmoothingEnabled....
                 *
                 contextFont['mozImageSmoothingEnabled'] = false;
                 contextFont['webkitImageSmoothingEnabled'] = false;
                 */
            
                var iChar, x, y;
                var cyLimit = (cyChar < 8 || !offSplit)? cyChar : 8;
                var imageChar = contextFont.createImageData(font.cxCell, font.cyCell);
            
                for (iChar = 0; iChar < 256; iChar++) {
                    for (y = 0; y < cyChar; y++) {
                        /*
                         * fUnderline should be true only in the FONT_MDA case, and only for the odd color variations
                         * (1 and 3, out of variations 0 to 4), and only for the two bottom-most rows of the character cell
                         * (which I still need to confirm)
                         */
                        var fUnderline = (font.aColorMap && (iColor & 0x1) && y >= cyChar - 2);
                        var offChar = (y < cyLimit? offData + iChar * cyLimit + y : offSplit + iChar * cyLimit + y - cyLimit);
                        var b = abFontData[offChar];
                        for (var nRowDoubler = 0; nRowDoubler <= nDouble; nRowDoubler++) {
                            for (x = 0; x < cxChar; x++) {
                                /*
                                 * This "bit" of logic takes care of those characters (0xC0-0xDF) whose 9th bit must mirror the 8th bit;
                                 * in all other cases, any bit past the 8th bit is automatically zero.  It also takes care of embedding a solid
                                 * row of bits whenever fUnderline is true.
                                 */
                                var bit = (fUnderline? 1 : (b & (0x80 >> (x >= 8 && iChar >= 0xC0 && iChar <= 0xDF? 7 : x))));
                                var xDst = (x << nDouble);
                                var yDst = (y << nDouble) + nRowDoubler;
                                var rgb = (bit? rgbColor : rgbOff);
                                this.setPixel(imageChar, xDst, yDst, rgb);
                                if (nDouble) this.setPixel(imageChar, xDst + 1, yDst, rgb);
                            }
                        }
                    }
                    /*
                     * (iChar >> 4) performs the integer equivalent of Math.floor(iChar / 16), and (iChar & 0xf) is the equivalent of (iChar % 16).
                     */
                    contextFont.putImageData(imageChar, x = (iChar & 0xf) * font.cxCell, y = (iChar >> 4) * font.cyCell);
                }
            
                /*
                 * The colors for cell backgrounds and cursor elements must be converted to CSS color strings.
                 */
                font.aCSSColors[iColor] = "#" + str.toHex(rgbColor[0], 2) + str.toHex(rgbColor[1], 2) + str.toHex(rgbColor[2], 2);
                font.aRGBColors[iColor] = rgbColor;
            
                /*
                 * Enable this code if you want to see what the generated font looks like....
                 *
                if (MAXDEBUG) {
                    var iSrcColor = (iColor == 15? 0 : iColor + 1);
                    this.contextScreen.fillStyle = aCSSColors[iSrcColor];
                    this.contextScreen.fillRect(iColor*(font.cxCell<<2), 0, canvasFont.width>>2, font.cyCell<<4);
                    this.contextScreen.drawImage(canvasFont, 0, iColor*(font.cyCell<<4), canvasFont.width>>2, font.cyCell<<4, iColor*(font.cxCell<<2), 0, canvasFont.width>>2, font.cyCell<<4);
                }
                 */
            
                font.aCanvas[iColor] = canvasFont;
            };
            
            /**
             * checkBlink()
             *
             * Called at the end of every updateScreen(), which may have updated cBlinkVisible to a non-zero value.
             *
             * Also called at the end of every checkCursor(); ie, whenever the CRT register(s) affecting the position or shape
             * of the hardware cursor have been modified, and any of iCellCursor, yCursor or cyCursor have been modified as a result.
             *
             * Note that the cursor always blinks when it's ON; it can only be turned OFF, moved off-screen, or its rate set to half
             * the normal blink rate (by default, it blinks at the normal blink rate).  Bits 5-6 of the CRTC.CURSOR_START register can
             * be set as follows:
             *
             *    00: Cursor blinks at normal blink rate
             *    01: Cursor is off
             *    10: (Same as 00)
             *    11: Cursor blinks at half the normal blink rate
             *
             * According to documentation, the normal blink rate is 1/16 of the frame rate (8 frames on, 8 off).
             *
             * TODO: As an aside, I've observed in the "real world" that the MDA cursor cycles about 3 times per second, and by "cycle"
             * I mean one full off-and-on-again cycle.  I'm assuming that's the normal rate (00), not the slower "half rate" (11).
             * Since that's faster than our current cursor blink rate, we should look into an option to boost our rate, without adversely
             * affecting the attribute blink rate (which is currently hard-coded at half the cursor blink rate), and we should look into
             * supporting "half rate" blinking, too.
             *
             * @this {Video}
             * @return {boolean} true if there are things to blink, false if not
             */
            Video.prototype.checkBlink = function()
            {
                if (this.cBlinkVisible > 0 || this.iCellCursor >= 0) {
                    if (this.cBlinks < 0) {
                        this.cBlinks = 0;
                        /*
                         * At this point, we can either fire up our own timer (doBlink), or rely on updateScreen()
                         * being called by the CPU at a regular rate (eg, CPU.VIDEO_UPDATES_PER_SECOND = 60) and advance
                         * cBlinks at the start of updateScreen() accordingly.
                         *
                         * doBlink() wants to increment cBlinks every 266ms.  On the other hand, if updateScreen() is being
                         * called 60 times per second, that's about once every 16ms, so if every 16th updateScreen() increments
                         * cBlinks, cBlinks should advance at the same rate.
                         *
                         * The only downside to relying on the CPU driving our blink count is that whenever the CPU is halted
                         * (eg, by the PCjs debugger) all blinking stops -- all characters with the blink attribute AND the cursor.
                         *
                         * But we can simply say that when we halt, we mean "halt everything" (ie, call it a feature).
                         *
                         *      this.doBlink(true);
                         */
                    }
                    return true;
                }
                this.cBlinks = -1;
                return false;
            };
            
            /**
             * checkCursor()
             *
             * Called whenever a CRT data register is updated, since there are multiple registers that can affect the
             * visibility of the cursor (more than these, actually, but I'm going to limit my initial support to standard
             * ROM BIOS controller settings):
             *
             *      CRTC.MAX_SCAN_LINE
             *      CRTC.CURSOR_START
             *      CRTC.CURSOR_END
             *      CRTC.START_ADDR_HI
             *      CRTC.START_ADDR_LO
             *      CRTC.CURSOR_ADDR_HI
             *      CRTC.CURSOR_ADDR_LO
             *
             * @this {Video}
             * @return {boolean} true if the cursor is visible, false if not
             */
            Video.prototype.checkCursor = function()
            {
                /*
                 * The "hardware cursor" is never visible in graphics modes.
                 */
                if (!this.nFont) return false;
            
                for (var i = Card.CRTC.CURSOR_START.INDX; i <= Card.CRTC.CURSOR_ADDR_LO; i++) {
                    if (this.cardActive.regCRTData[i] == null)
                        return false;
                }
            
                var bCursorFlags = this.cardActive.regCRTData[Card.CRTC.CURSOR_START.INDX];
                var bCursorStart = bCursorFlags & Card.CRTC.CURSOR_START.MASK;
                var bCursorEnd = this.cardActive.regCRTData[Card.CRTC.CURSOR_END.INDX] & Card.CRTC.CURSOR_END.MASK;
                var bCursorMax = this.cardActive.regCRTData[Card.CRTC.MAX_SCAN_LINE] & Card.CRTC.CURSOR_END.MASK;
            
                /*
                 * HACK: The original EGA BIOS has a cursor emulation bug when 43-line mode is enabled, so we attempt to detect
                 * that particular combination of bad values and automatically fix them (we're so thoughtful!)
                 */
                var fEGAHack = false;
                if (this.cardActive === this.cardEGA) {
                    fEGAHack = true;
                    if (bCursorMax == 7 && bCursorStart == 4 && !bCursorEnd) bCursorEnd = 7;
                }
            
                /*
                 * One way of disabling the cursor is to set bit 5 (Card.CRTC.CURSOR_START.BLINKOFF) of the CRTC.CURSOR_START flags;
                 * another way is setting bCursorStart > bCursorEnd (unless it's an EGA, in which case we must actually draw a
                 * "split block" cursor instead).
                 *
                 * TODO: Verify whether the second test (bCursorStart > bCursorMax) should also result in a hidden cursor;
                 * ThinkTank sets both start and end values to 0x0f, which doesn't make sense on a CGA, where the max is 0x07.
                 */
                if ((bCursorFlags & Card.CRTC.CURSOR_START.BLINKOFF) || bCursorStart > bCursorEnd && !fEGAHack || bCursorStart > bCursorMax) {
                    this.removeCursor();
                    return false;
                }
            
                /*
                 * The most compatible way of disabling the cursor is to simply move the cursor to an off-screen position.
                 */
                var iCellCursor = (this.cardActive.regCRTData[Card.CRTC.CURSOR_ADDR_LO] + ((this.cardActive.regCRTData[Card.CRTC.CURSOR_ADDR_HI] & Card.CRTC.ADDR_HI_MASK) << 8));
                if (this.iCellCursor != iCellCursor) {
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("checkCursor(): cursor moved from " + this.iCellCursor + " to " + iCellCursor);
                    }
                    this.removeCursor();
                    this.iCellCursor = iCellCursor;
                }
            
                /*
                 * yCursor and cyCursor are no longer scaled at this point, because the necessary scaling will depend on whether we're
                 * drawing the cursor to the on-screen or off-screen buffer, and updateChar() is in the best position to determine that.
                 *
                 * We also record cyCursorCell, the hardware cell height, since we'll need to know what the yCursor and cyCursor values
                 * are relative to when it's time to scale them.
                 */
                var bCursorSize = bCursorEnd - bCursorStart + 1;
                if (this.yCursor != bCursorStart || this.cyCursor != bCursorSize) {
                    this.yCursor = bCursorStart;
                    this.cyCursor = bCursorSize;
                }
                this.cyCursorCell = bCursorMax + 1;
            
                this.checkBlink();
                return true;
            };
            
            /**
             * removeCursor()
             *
             * @this {Video}
             */
            Video.prototype.removeCursor = function()
            {
                if (this.iCellCursor >= 0) {
                    if (this.aCellCache !== undefined) {
                        var drawCursor = (Video.ATTRS.DRAW_CURSOR << 8);
                        var data = this.aCellCache[this.iCellCursor];
                        if (data & drawCursor) {
                            data &= ~drawCursor;
                            var col = this.iCellCursor % this.nCols;
                            var row = (this.iCellCursor / this.nCols)|0;
                            if (this.nFont && this.aFonts[this.nFont]) {
                                /*
                                 * If we're using an off-screen buffer in text mode, then we need to keep it in sync with "reality".
                                 */
                                if (this.contextScreenBuffer) {
                                    this.updateChar(col, row, data, this.contextScreenBuffer);
                                }
                                /*
                                 * While updating the on-screen canvas directly could open us up to potential subpixel artifacts again,
                                 * I'm hopeful that won't be the case, since removeCursor() is called only during certain well-defined
                                 * events.  The alternative to this simple updateChar() call is unappealing: redrawing the ENTIRE off-screen
                                 * buffer to the on-screen canvas, just as updateScreen() does.
                                 */
                                this.updateChar(col, row, data);
                            }
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("removeCursor(): removed from " + row + "," + col);
                            }
                            this.aCellCache[this.iCellCursor] = data;
                        }
                    }
                    this.iCellCursor = -1;
                }
            };
            
            /**
             * getAccess()
             *
             * @this {Video}
             * @return {number|undefined} current memory access setting, or undefined if unknown
             */
            Video.prototype.getAccess = function()
            {
                var nAccess;
                var card = this.cardActive;
            
                this.fLinear = false;
                var regGRCMode = card.regGRCData[Card.GRC.MODE.INDX];
                if (regGRCMode != null) {
                    var nReadAccess = Card.ACCESS.READ.MODE0;
                    var nWriteAccess = Card.ACCESS.WRITE.MODE0;
                    var nWriteMode = regGRCMode & Card.GRC.MODE.WRITE.MASK;
                    var regDataRotate = card.regGRCData[Card.GRC.DATAROT.INDX] & Card.GRC.DATAROT.MASK;
                    switch (nWriteMode) {
                    case Card.GRC.MODE.WRITE.MODE0:
                        if (regDataRotate) {
                            nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.ROT;
                            switch (regDataRotate & Card.GRC.DATAROT.FUNC) {
                            case Card.GRC.DATAROT.AND:
                                nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.AND;
                                break;
                            case Card.GRC.DATAROT.OR:
                                nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.OR;
                                break;
                            case Card.GRC.DATAROT.XOR:
                                nWriteAccess = Card.ACCESS.WRITE.MODE0 | Card.ACCESS.WRITE.XOR;
                                break;
                            default:
                                break;
                            }
                            card.nDataRotate = regDataRotate & Card.GRC.DATAROT.COUNT;
                        }
                        break;
                    case Card.GRC.MODE.WRITE.MODE1:
                        nWriteAccess = Card.ACCESS.WRITE.MODE1;
                        break;
                    case Card.GRC.MODE.WRITE.MODE2:
                        switch (regDataRotate & Card.GRC.DATAROT.FUNC) {
                        default:
                            nWriteAccess = Card.ACCESS.WRITE.MODE2;
                            break;
                        case Card.GRC.DATAROT.AND:
                            nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.AND;
                            break;
                        case Card.GRC.DATAROT.OR:
                            nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.OR;
                            break;
                        case Card.GRC.DATAROT.XOR:
                            nWriteAccess = Card.ACCESS.WRITE.MODE2 | Card.ACCESS.WRITE.XOR;
                            break;
                        }
                        break;
                    case Card.GRC.MODE.WRITE.MODE3:
                        if (this.nCard == Video.CARD.VGA) {
                            nWriteAccess = Card.ACCESS.WRITE.MODE3;
                        }
                        break;
                    default:
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("getAccess(): invalid GRC mode (" + str.toHexByte(regGRCMode) + ")");
                        }
                        break;
                    }
                    if (regGRCMode & Card.GRC.MODE.READ.MODE1) {
                        nReadAccess = Card.ACCESS.READ.MODE1;
                    }
                    /*
                     * I discovered that when the IBM EGA ROM scrolls the screen in graphics modes 0x0D and 0x0E, it
                     * reprograms this register for WRITE.MODE1 (which is fine) *and* EVENODD (which is, um, very odd).
                     * Moreover, it does NOT make the complementary change to the SEQ.MEMMODE.SEQUENTIAL bit; under
                     * normal circumstances, those two bits are always supposed to programmed oppositely.
                     *
                     * Until I can perform some tests on real hardware, I have to assume that the EGA scroll operation
                     * is supposed to actually WORK in modes 0x0D and 0x0E, so I've decided to tie the trigger for my own
                     * EVENODD functions to SEQ.MEMMODE.SEQUENTIAL being clear, instead of GRC.MODE.EVENODD being set.
                     *
                     * It's also possible that my EVENODD read/write functions are not implemented properly; when EVENODD
                     * is in effect, which addresses get latched by a read, and to which addresses are latches written?
                     * If EVENODD has no effect on the effective address used with the latches, then I should change the
                     * EVENODD read/write functions accordingly.
                     *
                     * However, I've also done some limited testing with an emulated VGA running in text mode, and I've
                     * discovered that toggling the GRC.MODE.EVENODD bit *alone* doesn't seem to affect the delivery of
                     * text mode attributes from plane 1.  So maybe this is the wiser change after all.
                     *
                     * TODO: Perform some tests on actual EGA/VGA hardware, to determine the proper course of action.
                     *
                     *  if (regGRCMode & Card.GRC.MODE.EVENODD) {
                     *      nReadAccess |= Card.ACCESS.READ.EVENODD;
                     *      nWriteAccess |= Card.ACCESS.WRITE.EVENODD;
                     *  }
                     */
                    var regSEQMode = card.regSEQData[Card.SEQ.MEMMODE.INDX];
                    if (regSEQMode != null) {
                        if (!(regSEQMode & Card.SEQ.MEMMODE.SEQUENTIAL)) {
                            nReadAccess |= Card.ACCESS.READ.EVENODD;
                            nWriteAccess |= Card.ACCESS.WRITE.EVENODD;
                        }
                        if (regSEQMode & Card.SEQ.MEMMODE.CHAIN4) {
                            nReadAccess |= Card.ACCESS.READ.CHAIN4;
                            nWriteAccess |= Card.ACCESS.WRITE.CHAIN4;
                            this.fLinear = true;
                        }
                    }
                    nAccess = nReadAccess | nWriteAccess;
                }
                return nAccess;
            };
            
            /**
             * setAccess(nAccess)
             *
             * @this {Video}
             * @param {number|undefined} nAccess (one of the Card.ACCESS.* constants)
             */
            Video.prototype.setAccess = function(nAccess)
            {
                var card = this.cardActive;
                if (card && nAccess != null && nAccess != card.nAccess) {
            
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("setAccess(" + str.toHexWord(nAccess) + ")");
                    }
            
                    card.setMemoryAccess(nAccess);
            
                    /*
                     * Note that setMemoryAccess() can fail, in which case it will an report error, indicating either a
                     * misconfiguration or some sort of internal inconsistency; in any case, there's not much we can do about
                     * it at this point, other than possibly reverting the current access setting.  There's probably not much
                     * point, however, because there's no guarantee that setMemoryAccess() didn't modify one or more blocks
                     * before choking.
                     */
                    this.bus.setMemoryAccess(card.addrBuffer, card.sizeBuffer, card.getMemoryAccess());
                }
            };
            
            /**
             * setDimensions()
             *
             * @this {Video}
             */
            Video.prototype.setDimensions = function()
            {
                this.nFont = 0;
                this.nCols = this.nColsDefault;
                this.nRows = this.nRowsDefault;
                this.nColsLogical = this.nCols;
                this.nCellsPerWord = Video.aModeParms[Video.MODE.MDA_80X25][2];
            
                this.cbPadding = 0;
                var modeParms = Video.aModeParms[this.nMode];
                if (modeParms) {
            
                    this.nCols = modeParms[0];
                    this.nRows = modeParms[1];
                    this.nCellsPerWord = modeParms[2];
                    this.cbPadding = modeParms[3] || 0;
                    this.nFont = modeParms[4];      // this will be undefined for graphics modes
            
                    if (this.nMonitorType == ChipSet.MONITOR.EGACOLOR || this.nMonitorType == ChipSet.MONITOR.VGACOLOR) {
                        /*
                         * When an EGA is connected to a CGA monitor, the old aModeParms table is correct: we must
                         * use the hard-coded 8x8 "CGA_80" font.  But when it's connected to an EGA monitor, we want
                         * to use the 9x14 "EGA" color font instead.
                         *
                         * TODO: Can an EGA with a monochrome monitor be programmed for 43-line mode as well?  If so,
                         * then we'll need to load another MDA font variation, because we only load an 9x14 font for MDA.
                         */
                        if (this.cardActive === this.cardEGA && this.nFont == Video.FONT.CGA) {
                            if (this.cardEGA.regCRTData[Card.CRTC.MAX_SCAN_LINE] == 7) {
                                /*
                                 * Vertical resolution of 350 divided by 8 (ie, scan lines 0-7) yields 43 whole rows.
                                 */
                                this.nRows = 43;
                            }
                            /*
                             * Since we can also be called before any hardware registers have been initialized,
                             * it may be best to not perform the following test (which is why it's commented out).
                             */
                            else /* if (this.cardEGA.regCRTData[Card.CRTC.MAX_SCAN_LINE] == 13) */ {
                                /*
                                 * Vertical resolution of 350 divided by 14 (ie, scan lines 0-13) yields exactly 25 rows.
                                 *
                                 * Note that a card's default font matches its card ID (eg, Video.CARD.EGA == Video.FONT.EGA,
                                 * and Video.CARD.VGA == Video.FONT.VGA)
                                 */
                                this.nFont = this.nCard;
                            }
                        }
                    }
                }
            
                this.nCells = (this.nCols * this.nRows)|0;
                this.nCellCache = (this.nCells / this.nCellsPerWord)|0;
                this.cbScreen = ((this.nCellCache << 1) + this.cbPadding)|0;
                this.cbSplit = (this.cbPadding? ((this.cbScreen + this.cbPadding) >> 1) : 0);
                this.fLinear = false;                                               // set for 8bpp "linear" VGA modes only
                if (this.nMode >= Video.MODE.EGA_320X200) this.nCellCache <<= 1;    // double nCellCache (every cell is a byte)
            
                /*
                 * If no fonts were successfully loaded, there's no point in initializing the remaining drawing parameters.
                 */
                if (!this.aFonts.length) return;
            
                this.cxScreenCell = (this.cxScreen / this.nCols)|0;
                this.cyScreenCell = (this.cyScreen / this.nRows)|0;
            
                /*
                 * Now we make the all-important scaling determination: if the font cell dimensions (cxCell, cyCell)
                 * don't match the physical screen cell dimensions (cxCell, cyCell), then we look at the caller's
                 * fScaleFont setting: if it's false, we draw the characters as-is, with a border if the characters
                 * are smaller than the cells; and if fScaleFont is true, we simply tell drawImage to draw the
                 * characters to fit.
                 *
                 * WARNING: The only problem with fScaleFont is that any stretching or shrinking tends to be accompanied
                 * by subpixel artifacts along the boundaries of the font images.  Definitely annoying, and apparently
                 * there are no standard mechanisms for turning that behavior off. So, for now, I've "neutered" the
                 * fScaleFont test slightly, by adding the "nCols == 80" test that prevents scaling from kicking in for
                 * 40-column modes.
                 *
                 * Also, whether scaling or not, if it makes sense to use a "doubled" font, we'll switch the font as
                 * well.  Note that the doubled font for any existing font also has an ID that is double the existing ID,
                 * making it easy to check for the existence of a font's "double" (shift the ID left by 1).
                 *
                 * TODO: Since we now use an off-screen buffer for ALL modes, both text and graphics, we should
                 * revisit changes that were made to work around subpixel artifacts; those should no longer be an issue.
                 */
                if (this.nFont) {
                    var font = this.aFonts[this.nFont];
                    var fontDoubled = this.aFonts[this.nFont << 1];
            
                    if (this.fScaleFont && this.nCols == 80) {
                        if (fontDoubled) {
                            if (this.cxScreenCell >= (fontDoubled.cxCell * 3) >> 2) { // && this.cyScreenCell > (fontDoubled.cyCell * 3) >> 2) {
                                this.nFont <<= 1;
                                font = fontDoubled;
                                if (DEBUG) this.log("setDimensions(): switching to double-size font, scaled");
                            }
                        }
                    } else {
                        if (fontDoubled) {
                            if (this.cxScreenCell >= fontDoubled.cxCell) { // && this.cyScreenCell == fontDoubled.cyCell) {
                                this.nFont <<= 1;
                                font = fontDoubled;
                                if (DEBUG) this.log("setDimensions(): switching to double-size font, unscaled");
                            }
                        }
                        if (font) {
                            this.cxScreenCell = font.cxCell;
                            this.cyScreenCell = font.cyCell;
                        }
                    }
            
                    /*
                     * In text modes, we have the option of setting all the *ScreenBuffer variables to null instead of
                     * allocating them, because updateChar(), as currently written, is capable of writing characters to
                     * either an off-screen or on-screen context.
                     *
                     *      this.imageScreenBuffer = this.canvasScreenBuffer = this.contextScreenBuffer = null;
                     */
                    this.cxBuffer = this.cyBuffer = 0;
                    if (font) {
                        this.cxBuffer = this.nCols * font.cxCell;
                        this.cyBuffer = this.nRows * font.cyCell;
                    }
                } else {
                    /*
                     * CGA graphics modes have their "cells" (pixels) split evenly across two halves of the video buffer, with
                     * EVEN scan lines in the first half and ODD scan lines in the second half, so unlike text modes, we can't set a
                     * limit of what's visible on-screen to "columns * rows", so the screen limit is set to match the buffer limit.
                     *
                     * In addition, updateScreen() requires an off-screen imageData buffer that matches the size of the entire screen,
                     * so that updateScreen() can set all pixels that have changed and then update the screen with a single drawImage().
                     *
                     * An alternative approach, with a smaller footprint, would be to allocate an off-screen buffer large enough for a
                     * single scan line, and redraw one scan line at a time, but given how EVEN and ODD scan lines are spread across the
                     * entire buffer, it's not clear there would be enough unchanged scan lines on average to make that approach faster.
                     */
                    this.cxScreenCell = this.cyScreenCell = 1;  // in graphics mode, a cell is exactly one pixel
                    this.cxBuffer = this.nCols;
                    this.cyBuffer = this.nRows;
                }
            
                /*
                 * Allocate the off-screen buffers
                 */
                this.imageScreenBuffer = this.contextScreen.createImageData(this.cxBuffer, this.cyBuffer);
                this.canvasScreenBuffer = window.document.createElement("canvas");
                this.canvasScreenBuffer.width = this.cxBuffer;
                this.canvasScreenBuffer.height = this.cyBuffer;
                this.contextScreenBuffer = this.canvasScreenBuffer.getContext("2d");
            
                /*
                 * Since cxCell and cyCell were originally defined in terms of cxScreen/nCols and cyScreen/nRows, you might think
                 * these border calculations would always be zero, but that would mean you overlooked the code above which tries to
                 * avoid stretching 40-column modes into an unpleasantly wide shape.
                 */
                this.xScreenOffset = this.yScreenOffset = 0;
                this.cxScreenOffset = this.cxScreen;
                this.cyScreenOffset = this.cyScreen;
            
                var cxBorder = this.cxScreen - (this.nCols * this.cxScreenCell);
                var cyBorder = this.cyScreen - (this.nRows * this.cyScreenCell);
                if (cxBorder > 0) {
                    this.xScreenOffset = (cxBorder >> 1);
                    this.cxScreenOffset -= cxBorder;
                }
                if (cyBorder > 0) {
                    this.yScreenOffset = (cyBorder >> 1);
                    this.cyScreenOffset -= cyBorder;
                }
                if (cxBorder || cyBorder) {
                    this.contextScreen.fillStyle = this.canvasScreen.style.backgroundColor;
                    this.contextScreen.fillRect(0, 0, this.cxScreen, this.cyScreen);
                }
            };
            
            /**
             * checkMode(fForce)
             *
             * Called whenever the MDA/CGA's mode register (eg, Card.MDA.MODE.PORT, Card.CGA.MODE.PORT) is updated,
             * or whenever the EGA's GRC Misc register is updated, or when we've just finished a restore().
             *
             * @this {Video}
             * @param {boolean} [fForce] is used to force a mode update, if we recognize the current mode
             * @return {boolean} true if successful, false if not
             */
            Video.prototype.checkMode = function(fForce)
            {
                var nAccess;
                var nMode = this.nMode;
                var card = this.cardActive;
            
                if (!card) {
                    /*
                     * We are likely being called after a restore(), which needs us to call setMode() to insure the proper video
                     * buffer is mapped in.  So we unset this.nMode to guarantee that setMode() will be called, and if it wasn't set
                     * to anything before, then we fall-back to the default mode.
                     */
                    this.nMode = null;
                    if (nMode == null) nMode = this.nModeDefault;
                }
                else {
                    if (card.nCard == Video.CARD.MDA) {
                        nMode = Video.MODE.MDA_80X25;
                    }
                    else if (card.nCard >= Video.CARD.EGA) {
                        /*
                         * The sizeBuffer we choose reflects the amount of physical address space that all 4 planes
                         * of EGA memory normally span, NOT the total amount of EGA memory.  So for a 64Kb EGA card,
                         * we would set card.sizeBuffer to 16Kb (0x4000).
                         *
                         * TODO: Need to take into account modes that "chain" planes together (eg, mode 0x0F, and
                         * presumably mode 0x10, on an EGA card with only 64Kb).
                         */
                        nMode = null;
                        var cbBuffer = card.cbMemory >> 2;
                        var cbBufferText = (cbBuffer > 0x8000? 0x8000 : cbBuffer);
            
                        var regGRCMisc = card.regGRCData[Card.GRC.MISC.INDX];
                        if (regGRCMisc != null) {
            
                            switch(regGRCMisc & Card.GRC.MISC.MAPMEM) {
                            case Card.GRC.MISC.MAPA0128:
                                card.addrBuffer = 0xA0000;
                                card.sizeBuffer = cbBuffer;     // 0x20000
                                nMode = Video.MODE.UNKNOWN;     // no BIOS mode uses this mapping, but we don't want to leave nMode null if we've come this far
                                break;
                            case Card.GRC.MISC.MAPA064:
                                card.addrBuffer = 0xA0000;
                                card.sizeBuffer = cbBuffer;     // 0x10000
                                nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.EGA_640X350_MONO : Video.MODE.EGA_640X350);
                                break;
                            case Card.GRC.MISC.MAPB032:
                                card.addrBuffer = 0xB0000;
                                card.sizeBuffer = cbBufferText;
                                nMode = Video.MODE.MDA_80X25;
                                break;
                            case Card.GRC.MISC.MAPB832:
                                card.addrBuffer = 0xB8000;
                                card.sizeBuffer = cbBufferText;
                                nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.CGA_80X25_BW : Video.MODE.CGA_80X25);
                                break;
                            default:
                                break;
                            }
            
                            var fSEQDotClock = (card.regSEQData[Card.SEQ.CLOCKING.INDX] & Card.SEQ.CLOCKING.DOTCLOCK);
                            var nCRTCVertTotal = card.regCRTData[Card.CRTC.EGA.VERT_TOTAL];
                            nCRTCVertTotal |= ((card.regCRTData[Card.CRTC.EGA.OVERFLOW.INDX] & Card.CRTC.EGA.OVERFLOW.VERT_TOTAL_BIT8)? 0x100 : 0);
                            if (card.nCard == Video.CARD.VGA) {
                                nCRTCVertTotal |= ((card.regCRTData[Card.CRTC.EGA.OVERFLOW.INDX] & Card.CRTC.EGA.OVERFLOW.VERT_TOTAL_BIT9)? 0x200 : 0);
                            }
            
                            if (nMode != Video.MODE.UNKNOWN) {
                                if (!(regGRCMisc & Card.GRC.MISC.GRAPHICS)) {
                                    if (fSEQDotClock) nMode -= 2;
                                } else {
                                    if (card.addrBuffer == 0xB8000) {
                                        /*
                                         * Since nMode will have been assigned a default of either 0x02 or 0x03, convert that to either
                                         * 0x05 or 0x04 if we're in a low-res graphics mode, 0x06 otherwise.
                                         */
                                        nMode = fSEQDotClock? (7 - nMode) : Video.MODE.CGA_640X200;
                                    } else {
                                        /*
                                         * card.addrBuffer must be 0xA0000, so we need to discriminate between modes 0x0D through 0x10;
                                         * we've already defaulted to 0x0F or 0x10, so determine if it's 0x0D or 0x0E (ie, a 200-row mode)
                                         * and then which one (ie, 320 wide or 640 wide).
                                         */
                                        if (card.regSEQData[Card.SEQ.MEMMODE.INDX] & Card.SEQ.MEMMODE.CHAIN4) {
                                            nMode = Video.MODE.VGA_320X200;
                                        }
                                        else if (nCRTCVertTotal < 500) {
                                            if (nCRTCVertTotal < 350) {
                                                nMode = (fSEQDotClock? Video.MODE.EGA_320X200 : Video.MODE.EGA_640X200);
                                            }
                                        } else {
                                            nMode = (this.nMonitorType == ChipSet.MONITOR.MONO? Video.MODE.VGA_640X480_MONO : Video.MODE.VGA_640X480);
                                        }
                                        if (DEBUG && this.messageEnabled()) {
                                            this.printMessage("checkMode(): nCRTCVertTotal=" + nCRTCVertTotal + ", mode=" + str.toHexByte(nMode));
                                            this.cpu.stopCPU();
                                        }
                                    }
                                }
                            }
            
                            nAccess = this.getAccess();
                        }
                    }
                    else if (card.regMode & Card.CGA.MODE.VIDEO_ENABLE) {
                        /*
                         * NOTE: For the CGA, we precondition any mode change on CGA.MODE.VIDEO_ENABLE being set, otherwise
                         * we'll get spoofed by the ROM BIOS scroll code, which waits for vertical retrace and then turns CGA.MODE.VIDEO_ENABLE
                         * off, using a hard-coded mode value (0x25) that does NOT necessarily match the the CGA video mode currently in effect.
                         */
                        if (!(card.regMode & Card.CGA.MODE.GRAPHIC_SEL)) {
                            nMode = ((card.regMode & Card.CGA.MODE._80X25)? Video.MODE.CGA_80X25 : Video.MODE.CGA_40X25);
                            if (card.regMode & Card.CGA.MODE.BW_SEL) nMode -= 1;
                        } else {
                            nMode = ((card.regMode & Card.CGA.MODE.HIRES_BW)? Video.MODE.CGA_640X200 : Video.MODE.CGA_320X200_BW);
                            if (!(card.regMode & Card.CGA.MODE.BW_SEL)) nMode -= 1;
                        }
                    }
                }
            
                /*
                 * NOTE: If setMode() remaps the video memory, that will trigger calls to getMemoryAccess() to also update the
                 * memory's access functions.  However, if the memory access setting (nAccess) is about to change as well, those
                 * changes will be moot until the setAccess() call that follows.  Basically, whenever both memory mapping AND access
                 * functions are changing, the memory will be in an inconsistent state until both setMode() and setAccess() are
                 * finished.
                 *
                 * The setMode() call takes precedence; if we called setAccess() first, it might attempt to modify memory access
                 * functions based on the card's addrBuffer setting, and if that doesn't match what's currently mapped, assertions
                 * will be triggered (probably not fatal, but it would defeat the point of the assertions).
                 */
                if (!this.setMode(nMode, fForce)) return false;
            
                this.setAccess(nAccess);
            
                return true;
            };
            
            /**
             * setMode(nMode, fForce)
             *
             * Set fForce to true to update the mode regardless of previous mode, or false to perform a normal update
             * that bypasses updateScreen() but still calls initCellCache().
             *
             * @this {Video}
             * @param {number|null} nMode
             * @param {boolean|undefined} [fForce] is set when checkMode() wants to force a mode update
             * @return {boolean} true if successful, false if failure
             */
            Video.prototype.setMode = function(nMode, fForce)
            {
                if (nMode != null && (nMode != this.nMode || fForce)) {
            
                    if (DEBUG && this.messageEnabled()) {
                        this.printMessage("setMode(" + str.toHexByte(nMode) + (fForce? ",force" : "") + ")");
                    }
            
                    this.cUpdates = 0;      // count updateScreen() calls as a means of driving blink updates
                    this.nMode = nMode;
            
                    /*
                     * On an EGA, it's CRITICAL that a reset() invalidate cardActive, to ensure that the code below
                     * releases the previous video buffer and installs a new one, even if there was no change in the
                     * video buffer address or size, because otherwise the Memory blocks installed at the video buffer
                     * address may still be using blocks of the EGA's previous memory buffer.
                     *
                     * When the EGA is reinitialized, a new memory buffer (adwMemory) is allocated (see initEGA()), and
                     * this is where the mapping of that EGA memory buffer to the video buffer occurs.  Other cards
                     * (MDA or CGA) don't allocate/manage their own memory buffer, but even then, it's still a good idea
                     * to always force this operation (eg, in case a switch setting changed the active video card).
                     */
                    var card = this.cardActive || (nMode == Video.MODE.MDA_80X25? this.cardMono : this.cardColor);
            
                    if (card != this.cardActive || card.addrBuffer != this.addrBuffer || card.sizeBuffer != this.sizeBuffer) {
            
                        this.removeCursor();
            
                        if (this.addrBuffer) {
            
                            if (DEBUG && this.messageEnabled()) {
                                this.printMessage("setMode(" + str.toHexByte(nMode) + "): removing " + str.toHexLong(this.sizeBuffer) + " bytes from " + str.toHexLong(this.addrBuffer));
                            }
            
                            if (!this.bus.removeMemory(this.addrBuffer, this.sizeBuffer)) {
                                /*
                                 * TODO: Force this failure case and see how well the Video component deals with it.
                                 */
                                return false;
                            }
                            if (this.cardActive) this.cardActive.fActive = false;
                        }
            
                        this.cardActive = card;
                        card.fActive = true;
            
                        this.addrBuffer = card.addrBuffer;
                        this.sizeBuffer = card.sizeBuffer;
            
                        if (DEBUG && this.messageEnabled()) {
                            this.printMessage("setMode(" + str.toHexByte(nMode) + "): adding " + str.toHexLong(this.sizeBuffer) + " bytes to " + str.toHexLong(this.addrBuffer));
                        }
            
                        var controller = (card === this.cardEGA? card : null);
            
                        if (!this.bus.addMemory(card.addrBuffer, card.sizeBuffer, Memory.TYPE.VIDEO, controller)) {
                            /*
                             * TODO: Force this failure case and see how well the Video component deals with it.
                             */
                            return false;
                        }
                    }
            
                    this.setDimensions();
            
                    if (fForce !== false) {
                        this.updateScreen(true);
                    } else {
                        this.initCellCache(true);
                    }
                }
                return true;
            };
            
            /**
             * setPixel(imageData, x, y, rgb)
             *
             * Worker function used by createFontColor() and updateScreen() (graphics modes only).
             *
             * @this {Video}
             * @param {Object} imageData
             * @param {number} x
             * @param {number} y
             * @param {Array.<number>} rgb is a 4-element array containing the red, green, blue and alpha values
             */
            Video.prototype.setPixel = function(imageData, x, y, rgb)
            {
                var index = (x + y * imageData.width) * rgb.length;
                imageData.data[index]   = rgb[0];
                imageData.data[index+1] = rgb[1];
                imageData.data[index+2] = rgb[2];
                imageData.data[index+3] = rgb[3];
            };
            
            /**
             * initCellCache(fNew)
             *
             * Invalidates the contents of our internal cell cache.
             *
             * @this {Video}
             * @param {boolean} [fNew] is true to reallocate/resize the cell cache; in any case, it's still reinitialized
             */
            Video.prototype.initCellCache = function(fNew)
            {
                this.cBlinkVisible = -1;                // invalidate the visible blinking character count, to force updateScreen() to recount
                this.fCellCacheValid = false;
                if (fNew) {
                    var nCells = this.nCellCache;
                    if (this.aCellCache === undefined || this.aCellCache.length != nCells) {
                        this.aCellCache = new Array(nCells);
                        /*
                         * TODO: Determine whether, with the introduction of fCellCacheValid, this array initialization is useful.
                         */
                        for (var iCell = 0; iCell < nCells; iCell++) this.aCellCache[iCell] = -1;
                    }
                }
            };
            
            /**
             * doBlink()
             *
             * This function is obsolete, now that the checkBlink() function is called on every updateScreen()
             * and checkCursor() call.  updateScreen() is driven by the CPU timer, so piggy-backing on that to
             * drive blink updates seems preferable to having another active timer in the system.
             *
             * @this {Video}
             * @param {boolean} [fStart]
             *
             Video.prototype.doBlink = function(fStart)
             {
                if (this.cBlinks >= 0) {
                    this.cBlinks++;
                    if (this.cBlinkVisible || this.iCellCursor >= 0) {
                        if (!fStart && !this.cpu.isRunning()) {
                            this.updateScreen();
                        }
                        setTimeout(function(video) { return function onBlinkTimeout() {video.doBlink();}; }(this), 266);
                        return;
                    }
                    this.cBlinks = -1;
                }
            },
             */
            
            /**
             * updateChar(col, row, data, context)
             *
             * Updates a particular character cell (row,col) in the associated window.
             *
             * The data parameter is the attribute byte from the display buffer (fgnd attribute in the low nibble,
             * bgnd attribute in the high nibble), but updateScreen() supplements data with a couple internal attribute bits:
             *
             *      ATTRS.DRAW_FGND:    set for every cell whose fgnd element is currently on (ie, non-blinking, or whenever blink is on)
             *      ATTRS.DRAW_CURSOR:  set only for the cell containing the cursor, if any
             *
             * To make a character blink, we alternately draw its cell with ATTRS.DRAW_FGND set, and then again with
             * ATTRS.DRAW_FGND clear (meaning only the cell background is drawn).
             *
             * To make the cursor blink, we must alternately draw its entire cell with ATTRS.DRAW_CURSOR set, and then
             * draw it again with ATTRS.DRAW_CURSOR clear.
             *
             * @this {Video}
             * @param {number} col
             * @param {number} row
             * @param {number} data (if text mode, character code in low byte, attribute code in high byte)
             * @param {Object} [context]
             */
            Video.prototype.updateChar = function(col, row, data, context)
            {
                /*
                 * The caller MUST promise this.nFont is defined, and that the font in this.aFonts[this.nFont] has been loaded.
                 */
                var bChar = data & 0xff;
                var bAttr = data >> 8;
                var iFgnd = bAttr & 0xf;
                var font = this.aFonts[this.nFont];
                if (font.aColorMap) iFgnd = font.aColorMap[iFgnd];
            
                /*
                 * Just as aColorMap maps the foreground attribute to the appropriate foreground character grid,
                 * it also maps the background attribute to the appropriate background color.
                 */
                var xDst, yDst;
                var iBgnd = (bAttr >> 4) & 0xf;
                if (font.aColorMap) iBgnd = font.aColorMap[iBgnd];
            
                if (context) {
                    xDst = col * font.cxCell;
                    yDst = row * font.cyCell;
                    context.fillStyle = font.aCSSColors[iBgnd];
                    context.fillRect(xDst, yDst, font.cxCell, font.cyCell);
                } else {
                    xDst = col * this.cxScreenCell + this.xScreenOffset;
                    yDst = row * this.cyScreenCell + this.yScreenOffset;
                    this.contextScreen.fillStyle = font.aCSSColors[iBgnd];
                    this.contextScreen.fillRect(xDst, yDst, this.cxScreenCell, this.cyScreenCell);
                }
            
                if (MAXDEBUG && this.messageEnabled(Messages.VIDEO | Messages.LOG)) {
                    this.log("updateCharBgnd(" + col + "," + row + "," + bChar + "): filled " + xDst + "," + yDst);
                }
            
                if (bAttr & Video.ATTRS.DRAW_FGND) {
                    /*
                     * (bChar & 0xf) is the equivalent of (bChar % 16), and (bChar >> 4) is the equivalent of Math.floor(bChar / 16)
                     */
                    var xSrcFgnd = (bChar & 0xf) * font.cxCell;
                    var ySrcFgnd = (bChar >> 4) * font.cyCell;
            
                    if (MAXDEBUG && this.messageEnabled(Messages.VIDEO | Messages.LOG)) {
                        this.log("updateCharFgnd(" + col + "," + row + "," + bChar + "): draw from " + xSrcFgnd + "," + ySrcFgnd + " (" + font.cxCell + "," + font.cyCell + ") to " + xDst + "," + yDst);
                    }
            
                    if (context) {
                        context.drawImage(font.aCanvas[iFgnd], xSrcFgnd, ySrcFgnd, font.cxCell, font.cyCell, xDst, yDst, font.cxCell, font.cyCell);
                    } else {
                        this.contextScreen.drawImage(font.aCanvas[iFgnd], xSrcFgnd, ySrcFgnd, font.cxCell, font.cyCell, xDst, yDst, this.cxScreenCell, this.cyScreenCell);
                    }
                }
            
                if (bAttr & Video.ATTRS.DRAW_CURSOR) {
                    /*
                     * Drawing the cursor with lineTo() seemed logical, but it was complicated by the fact that the
                     * TOP of the line must appear at "yDst + this.yCursor", whereas lineTo() wants to know the CENTER
                     * of the line. So it's simpler to draw the cursor with another fillRect().  Here's the old code:
                     *
                     *      this.contextScreen.strokeStyle = font.aCSSColors[iFgnd];
                     *      this.contextScreen.lineWidth = this.cyCursor;
                     *      this.contextScreen.beginPath();
                     *      this.contextScreen.moveTo(xDst, yDst + this.yCursor);
                     *      this.contextScreen.lineTo(xDst + this.cxScreenCell, yDst + this.yCursor);
                     *      this.contextScreen.stroke();
                     *
                     * Also, note that we're scaling the yCursor and cyCursor values here, instead of in checkCursor(), because
                     * this is where we have all the required information: in the first case (off-screen buffer), the scaling must
                     * be based on the font cell size (cxCell, cyCell), whereas in the second case (on-screen buffer), the scaling
                     * must be based on the screen cell size (cxScreenCell,cyScreenCell).
                     *
                     * yCursor and cyCursor are actual hardware values, both relative to another hardware value: cyCursorCell.
                     */
                    var yCursor = this.yCursor;
                    var cyCursor = this.cyCursor;
                    if (context) {
                        if (this.cyCursorCell && this.cyCursorCell !== font.cyCell) {
                            yCursor = ((yCursor * font.cyCell) / this.cyCursorCell)|0;
                            cyCursor = ((cyCursor * font.cyCell) / this.cyCursorCell)|0;
                        }
                        context.fillStyle = font.aCSSColors[iFgnd];
                        context.fillRect(xDst, yDst + yCursor, font.cxCell, cyCursor);
                    } else {
                        if (this.cyCursorCell && this.cyCursorCell !== this.cyScreenCell) {
                            yCursor = ((yCursor * this.cyScreenCell) / this.cyCursorCell)|0;
                            cyCursor = ((cyCursor * this.cyScreenCell) / this.cyCursorCell)|0;
                        }
                        this.contextScreen.fillStyle = font.aCSSColors[iFgnd];
                        this.contextScreen.fillRect(xDst, yDst + yCursor, this.cxScreenCell, cyCursor);
                    }
                }
            };
            
            /**
             * updateScreen(fForce)
             *
             * Propagates the video buffer to the cell cache and updates the screen with any changes.  Forced updates
             * are generally internal updates triggered by an I/O operation or other state change, while non-forced updates
             * are the periodic updates coming from the CPU.
             *
             * For every cell in the video buffer, compare it to the cell stored in the cell cache, render if it differs,
             * and then update the cell cache to match.  Since initCellCache() sets every cell in the cell cache to an
             * invalid value, we're assured that the next call to updateScreen() will redraw the entire (visible) video buffer.
             *
             * @this {Video}
             * @param {boolean} [fForce] is used by setMode() to reset the cell cache and force a redraw
             */
            Video.prototype.updateScreen = function(fForce)
            {
                /*
                 * The Computer component maintains the fPowered setting on our behalf, so we use it.
                 */
                if (!this.aFlags.fPowered) return;
            
                /*
                 * If the card's video signal is disabled (eg, during a mode change), then skip the update,
                 * unless fForce is set.
                 */
                var fEnabled = false;
                var card = this.cardActive;
            
                if (card) {
                    if (card !== this.cardEGA) {
                        if (card.regMode & Card.CGA.MODE.VIDEO_ENABLE) fEnabled = true;
                    }
                    else {
                        if (card.regATCIndx & Card.ATC.INDX_PAL_ENABLE) fEnabled = true;
                    }
                }
            
                if (!fEnabled && !fForce) return;
            
                if (fForce) {
                    this.initCellCache(true);
                }
                else {
                    /*
                     * This should never happen, but since updateScreen() is also called by CPU.updateVideo(),
                     * better safe than sorry.
                     */
                    if (this.aCellCache === undefined) return;
                }
            
                /*
                 * If cBlinks is "enabled" (ie, >= 0), then advance it once every 16 updateScreen() calls
                 * (assuming an updateScreen() frequency of 60 per second; see CPU.VIDEO_UPDATES_PER_SECOND).
                 *
                 * We assume that the CPU is calling us whenever fForce is undefined.
                 */
                var fBlinkUpdate = false;
                if (!fForce && !(++this.cUpdates & 0xf) && this.cBlinks >= 0) {
                    this.cBlinks++;
                    fBlinkUpdate = true;
                }
            
                var iCell = 0;
                var nCells = this.nCells;
            
                /*
                 * Calculate the VISIBLE start of screen memory (addrScreen), not merely the PHYSICAL start,
                 * as well as the extent of it (cbScreen) and use those values for all addressing operations
                 * to follow.  FYI, in these calculations, offScreen does not refer to "off-screen" memory,
                 * but rather the "offset" of the start of visible screen memory.
                 */
                var addrScreen = card.addrBuffer;
                var addrScreenLimit = addrScreen + card.sizeBuffer;
            
                /*
                 * HACK: nStartAddress is supposed to be "latched" ONLY at the start of every VERT_RETRACE interval;
                 * this is an attempt to honor that behavior, but unfortunately, updateScreen() is currently called at
                 * the CPU's discretion, not necessarily in sync with nCyclesVertPeriod.  As a result, we must rely
                 * on other "triggers" to update our latched CRTC start address (eg, see outATC()).
                 *
                 * TODO: Consider matching the CPU's nCyclesNextVideoUpdate to the card's nCyclesVertPeriod, ensuring
                 * that CPU bursts are in sync with VERT_RETRACE.  Note, however, that that will be complicated by other
                 * factors, such as the horizontal retrace interval, and the timing requirements of other cards in a
                 * multi-display configuration.
                 */
                if (this.getRetraceBits(card) & Card.CGA.STATUS.VERT_RETRACE) {
                    card.nStartAddress = ((card.regCRTData[Card.CRTC.START_ADDR_HI] << 8) + card.regCRTData[Card.CRTC.START_ADDR_LO])|0;
                }
            
                var offScreen = card.nStartAddress;
            
                /*
                 * Any screen (aka "page") offset must be doubled for text modes, due to the attribute bytes.
                 *
                 * TODO: Come up with a more robust method of deciding when any screen offset should be doubled.
                 */
                if (this.nFont) offScreen <<= 1;
            
                addrScreen += offScreen;
                var cbScreen = this.cbScreen;
            
                if (this.nCard >= Video.CARD.EGA && card.regCRTData[Card.CRTC.EGA.OFFSET]) {
                    /*
                     * Pre-EGA, the extent of visible screen memory (cbScreen) was derived from nCols * nRows, but since
                     * then, the logical width of screen memory (nColsLogical) can differ from the visible width (nCols).
                     * We now calculate the logical width, and the compute a new cbScreen in much the same way the original
                     * cbScreen was computed (but without any CGA-related padding considerations).
                     */
                    this.nColsLogical = card.regCRTData[Card.CRTC.EGA.OFFSET] << (this.nFont? 1 : 4);
                    cbScreen = ((((this.nColsLogical * (this.nRows-1) + this.nCols) / this.nCellsPerWord) << 1) + this.cbPadding)|0;
                }
            
                if (addrScreen + cbScreen > addrScreenLimit) {
                    cbScreen = addrScreenLimit - addrScreen;
                    if (cbScreen < 0) cbScreen = 0;
                }
            
                /*
                 * addrScreenLimit was initially the limit of the entire video buffer, but we now adjust it
                 * to the limit of what's visible, since that's all we want to draw.
                 */
                addrScreenLimit = addrScreen + cbScreen;
            
                /*
                 * This next bit of code can be completely disabled if we discover problems with the dirty
                 * memory block tracking feature, or if we need to remove or disable that feature in the future.
                 *
                 * We use cleanMemory() to check the video buffer's dirty state.  If the buffer is clean
                 * AND there are no visible blinking characters (as of the last updateScreen) AND there is
                 * no visible cursor, then we're done; simply return.  Otherwise, if there's only a blinking
                 * cursor, then update JUST that one cell.
                 *
                 * When dealing with blinking characters, note that we need to run through the entire buffer
                 * ONLY if the low bits of the blink count just transitioned to 2 or 0; hence, we could return if
                 * the blink count was ODD.  But we'd still have to worry about the cursor, so it's simpler to blow
                 * that small optimization off.  Further optimizations are certainly possible, such as a hash table
                 * of all blinking character locations, but all those optimizations are saved for a rainy day.
                 */
                if (!fForce && this.bus.cleanMemory(addrScreen, cbScreen)) {
                    if (!fBlinkUpdate) return;
                    if (!this.cBlinkVisible) {
                        if (this.iCellCursor < 0) return;
                        iCell = this.iCellCursor;
                        nCells = iCell + 1;
                    }
                    // else if (this.cBlinks & 0x1) return;
                }
            
                if (this.nFont) {
                    /*
                     * This is the text-mode update case.  We're required to FIRST verify that the current font
                     * has been successfully loaded, because we're not allowed to call updateChar() if there's no font.
                     */
                    if (this.aFonts[this.nFont]) {
                        this.updateScreenText(addrScreen, addrScreenLimit, iCell, nCells);
                        this.checkBlink();
                    }
                }
                else if (this.cbSplit) {
                    this.updateScreenGraphicsCGA(addrScreen, addrScreenLimit);
                }
                else if (!this.fLinear) {
                    this.updateScreenGraphicsEGA(addrScreen, addrScreenLimit);
                }
                else {
                    this.updateScreenGraphicsVGA(addrScreen, addrScreenLimit);
                }
            };
            
            /**
             * updateScreenText(addrScreen, addrScreenLimit, iCell, nCells)
             *
             * @param addrScreen
             * @param addrScreenLimit
             * @param iCell
             * @param nCells
             */
            Video.prototype.updateScreenText = function(addrScreen, addrScreenLimit, iCell, nCells)
            {
                var addr, data, cUpdated = 0;
            
                /*
                 * If MDA.MODE.BLINK_ENABLE is set and a cell's blink bit is set, then if (cBlinks & 0x2) != 0,
                 * we want the foreground element of the cell to be drawn; otherwise we don't.  So every 16-bit
                 * data word we pull from the video buffer will be supplemented with our own special attribute bit
                 * (ATTRS.DRAW_FGND = 0x100) accordingly; and to simplify the drawing code, we will also mask the
                 * blink bit from the cell's attribute bits.
                 *
                 * If MDA.MODE.BLINK_ENABLE is clear, then we always set ATTRS.DRAW_FGND and never mask the blink
                 * bit in a cell's attributes bits, since it's actually an intensity bit in that case.
                 */
                this.cBlinkVisible = 0;
                var dataBlink = 0;
                var dataDraw = (Video.ATTRS.DRAW_FGND << 8);
                var dataMask = 0xfffff;
                if (this.cardActive.regMode & Card.MDA.MODE.BLINK_ENABLE) {
                    dataBlink = (Video.ATTRS.BGND_BLINK << 8);
                    dataMask &= ~dataBlink;
                    if (!(this.cBlinks & 0x2)) dataMask &= ~dataDraw;
                }
            
                addr = addrScreen + (iCell << 1);
                while (addr < addrScreenLimit && iCell < nCells) {
                    data = this.bus.getShortDirect(addr);
                    data |= dataDraw;
                    if (data & dataBlink) {
                        this.cBlinkVisible++;
                        data &= dataMask;
                    }
                    if (iCell == this.iCellCursor) {
                        data |= ((this.cBlinks & 0x1)? (Video.ATTRS.DRAW_CURSOR << 8) : 0);
                    }
                    this.assert(iCell < this.aCellCache.length);
                    if (!this.fCellCacheValid || data !== this.aCellCache[iCell]) {
                        var col = iCell % this.nCols;
                        var row = (iCell / this.nCols)|0;
                        this.updateChar(col, row, data, this.contextScreenBuffer);
                        this.aCellCache[iCell] = data;
                        cUpdated++;
                    }
                    addr += 2;
                    iCell++;
                }
            
                this.fCellCacheValid = true;
            
                if (cUpdated && this.contextScreenBuffer) {
                    this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.cxBuffer, this.cyBuffer, this.xScreenOffset, this.yScreenOffset, this.cxScreenOffset, this.cyScreenOffset);
                }
            };
            
            /**
             * updateScreenGraphicsCGA(addrScreen, addrScreenLimit)
             *
             * @param addrScreen
             * @param addrScreenLimit
             */
            Video.prototype.updateScreenGraphicsCGA = function(addrScreen, addrScreenLimit)
            {
                var addr, data;
            
                /*
                 * This is the CGA graphics-mode update case, where cells are pixels spread across two halves of the buffer.
                 */
                addr = addrScreen;
                this.cBlinkVisible = 0;
                var iCell = 0, nPixelsPerCell = this.nCellsPerWord;
                var wPixelMask = (nPixelsPerCell == 16? 0x10000 : 0x30000);
                var nPixelShift = (nPixelsPerCell == 16? 1 : 2);
                var aPixelColors = this.getCardColors(nPixelShift);
            
                var x = 0, y = 0;
                var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
                while (addr < addrScreenLimit) {
                    data = this.bus.getShortDirect(addr);
                    this.assert(iCell < this.aCellCache.length);
                    if (this.fCellCacheValid && data === this.aCellCache[iCell]) {
                        x += nPixelsPerCell;
                    } else {
                        this.aCellCache[iCell] = data;
                        var wPixels = (data >> 8) | ((data & 0xff) << 8);
                        var wMask = wPixelMask, nShift = 16;
                        if (x < xDirty) xDirty = x;
                        for (var iPixel = 0; iPixel < nPixelsPerCell; iPixel++) {
                            var bPixel = (wPixels & (wMask >>= nPixelShift)) >> (nShift -= nPixelShift);
                            this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
                        }
                        if (x > xMaxDirty) xMaxDirty = x;
                        if (y < yDirty) yDirty = y;
                        if (y >= yMaxDirty) yMaxDirty = y + 1;
                    }
                    addr += 2;
                    iCell++;
                    if (x >= this.nCols) {
                        x = 0;
                        y += 2;
                        if (y > this.nRows)
                            break;
                        if (y == this.nRows) {
                            y = 1;
                            addr = addrScreen + this.cbSplit;
                        }
                    }
                }
            
                this.fCellCacheValid = true;
            
                /*
                 * Instead of blasting the ENTIRE imageScreenBuffer into contextScreenBuffer, and then blasting the ENTIRE
                 * canvasScreenBuffer onto contextScreen, even for the smallest change, let's try to be a bit smarter about
                 * the update (well, to the extent that the canvas APIs permit).
                 */
                if (xDirty < this.nCols) {
                    var cxDirty = xMaxDirty - xDirty;
                    var cyDirty = yMaxDirty - yDirty;
                    // this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0);
                    this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
                    /*
                     * While ideally I would draw only the dirty portion of canvasScreenBuffer, there usually isn't a 1-1 pixel mapping
                     * between canvasScreenBuffer and contextScreen.  In fact, the WHOLE POINT of the canvasScreenBuffer is to leverage
                     * drawImage()'s scaling ability; for example, a CGA graphics mode might be 640x200, whereas the canvas representing
                     * the screen might be 960x400.  In those situations, if we draw interior rectangles, we often end up with subpixel
                     * artifacts along the edges of those rectangles.  So it appears I must continue to redraw the entire canvasScreenBuffer
                     * on every change.
                     *
                    var xScreen = (((xDirty * this.cxScreen) / this.nCols) | 0);
                    var yScreen = (((yDirty * this.cyScreen) / this.nRows) | 0);
                    var cxScreen = (((cxDirty * this.cxScreen) / this.nCols) | 0);
                    var cyScreen = (((cyDirty * this.cyScreen) / this.nRows) | 0);
                    this.contextScreen.drawImage(this.canvasScreenBuffer, xDirty, yDirty, cxDirty, cyDirty, xScreen, yScreen, cxScreen, cyScreen);
                     */
                    this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
                }
            };
            
            /**
             * updateScreenGraphicsEGA(addrScreen, addrScreenLimit)
             *
             * @param addrScreen
             * @param addrScreenLimit
             */
            Video.prototype.updateScreenGraphicsEGA = function(addrScreen, addrScreenLimit)
            {
                var addr, data;
            
                addr = addrScreen;
                this.cBlinkVisible = 0;
            
                var iCell = 0;
                var aPixelColors = this.getCardColors();
                var adwMemory = this.cardActive.adwMemory;
            
                var x = 0, y = 0;
                var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
            
                var iPixelFirst = this.cardActive.regATCData[Card.ATC.HORZPAN.INDX] & Card.ATC.HORZPAN.SHIFT_LEFT;
                /*
                 * TODO: What should happen if the card is programmed such that nColsLogical is LESS THAN nCols?
                 */
                var nRowAdjust = (this.nColsLogical > this.nCols? ((this.nColsLogical - this.nCols - iPixelFirst) >> 3) : 0);
            
                while (addr < addrScreenLimit) {
                    var idw = addr++ - this.addrBuffer;
                    this.assert(idw >= 0 && idw < adwMemory.length);
                    data = adwMemory[idw];
            
                    /*
                     * Figure out how many visible pixels this data represents; usually 8, unless panning is being used.
                     */
                    var iPixel, nPixels = 8;
            
                    if (iPixelFirst) {
                        /*
                         * Notice that we're not using the cell cache when panning is active, because the cached cell data no
                         * longer aligns with the data we're pulling out of the video buffer, and it's not clear that the effort
                         * to realign the data and make a valid cache comparison would save enough work to make it worthwhile.
                         */
                        if (!x) {
                            data <<= iPixelFirst;
                            nPixels -= iPixelFirst;
                            /*
                             * This is as good a place as any to invalidate the cell cache when panning is active; this ensures
                             * we don't rely on stale cache contents once panning stops.
                             */
                            this.fCellCacheValid = false;
                        } else {
                            iPixel = this.nCols - x;
                            if (nPixels > iPixel) nPixels = iPixel;
                        }
                    } else {
                        this.assert(iCell < this.aCellCache.length);
                        if (this.fCellCacheValid && data === this.aCellCache[iCell]) {
                            x += nPixels;
                            nPixels = 0;
                        } else {
                            this.aCellCache[iCell] = data;
                        }
                        iCell++;
                    }
            
                    if (nPixels) {
                        if (x < xDirty) xDirty = x;
                        for (iPixel = 0; iPixel < nPixels; iPixel++) {
                            /*
                             * We must follow the golden JavaScript rule of appending "|0" to all hex constants with bit 31 set.
                             * The innocuous use of the bit-wise OR operator has the side-effect of producing a negative value,
                             * matching how entries in Video.aEGADWToByte are initialized (eg, "Video.aEGADWToByte[0x80000000|0]").
                             */
                            var dwPixel = data & (0x80808080|0);
                            /*
                             * This was the old approach to dealing with negative hex values, by converting them to positive
                             * values that didn't alter the low 32 bits.  But it's not ideal, because it requires using values here
                             * and in the array that are outside the signed 32-bit range, potentially triggering floating-point.
                             *
                             *      if (dwPixel < 0) dwPixel += 0x100000000;
                             */
                            this.assert(Video.aEGADWToByte[dwPixel] !== undefined);
                            /*
                             * Since assertions don't fix problems (only catch them, and only in DEBUG builds), I'm also ensuring
                             * that bPixel will always default to 0 if an undefined value ever slips through again.
                             */
                            var bPixel = Video.aEGADWToByte[dwPixel] || 0;
                            this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
                            data <<= 1;
                        }
                        if (x > xMaxDirty) xMaxDirty = x;
                        if (y < yDirty) yDirty = y;
                        if (y >= yMaxDirty) yMaxDirty = y + 1;
                    }
            
                    this.assert(x <= this.nCols);
            
                    if (x >= this.nCols) {
                        x = 0;
                        if (++y > this.nRows) break;
                        addr += nRowAdjust;
                    }
                }
            
                if (!iPixelFirst) this.fCellCacheValid = true;
            
                /*
                 * For a fascinating discussion of the best way to update the screen canvas at this point, see updateScreenGraphicsCGA().
                 */
                if (xDirty < this.nCols) {
                    var cxDirty = xMaxDirty - xDirty;
                    var cyDirty = yMaxDirty - yDirty;
                    this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
                    this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
                }
            };
            
            /**
             * updateScreenGraphicsVGA(addrScreen, addrScreenLimit)
             *
             * The name is a slight misnomer: updateScreenGraphicsEGA() takes care of all the "planar" video modes, which were
             * first introduced by the EGA and later expanded by the VGA, whereas this function takes care of just the "linear"
             * video modes introduced by the VGA, such as mode 0x13 (320x200x256).  Those modes may also be referred to as CHAIN4
             * modes, since I think all of them require that the CHAIN4 bit in the Sequencer's MEMMODE register be set.
             *
             * @param addrScreen
             * @param addrScreenLimit
             */
            Video.prototype.updateScreenGraphicsVGA = function(addrScreen, addrScreenLimit)
            {
                var addr, data;
            
                addr = addrScreen;
                this.cBlinkVisible = 0;
            
                var iCell = 0;
                var aPixelColors = this.getCardColors();
                var adwMemory = this.cardActive.adwMemory;
            
                var x = 0, y = 0;
                var xDirty = this.nCols, xMaxDirty = 0, yDirty = this.nRows, yMaxDirty = 0;
            
                var iPixelFirst = this.cardActive.regATCData[Card.ATC.HORZPAN.INDX] & Card.ATC.HORZPAN.SHIFT_LEFT;
                /*
                 * TODO: What should happen if the card is programmed such that nColsLogical is LESS THAN nCols?
                 */
                var nRowAdjust = (this.nColsLogical > this.nCols? ((this.nColsLogical - this.nCols - iPixelFirst) >> 3) : 0);
            
                while (addr < addrScreenLimit) {
                    var idw = addr++ - this.addrBuffer;
                    this.assert(idw >= 0 && idw < adwMemory.length);
                    data = adwMemory[idw];
            
                    /*
                     * Figure out how many visible pixels this data represents; usually 4, unless panning is being used.
                     */
                    var iPixel, nPixels = 4;
            
                    if (iPixelFirst) {
                        /*
                         * Notice that we're not using the cell cache when panning is active, because the cached cell data no
                         * longer aligns with the data we're pulling out of the video buffer, and it's not clear that the effort
                         * to realign the data and make a valid cache comparison would save enough work to make it worthwhile.
                         */
                        if (!x) {
                            data <<= iPixelFirst;
                            nPixels -= iPixelFirst;
                            /*
                             * This is as good a place as any to invalidate the cell cache when panning is active; this ensures
                             * we don't rely on stale cache contents once panning stops.
                             */
                            this.fCellCacheValid = false;
                        } else {
                            iPixel = this.nCols - x;
                            if (nPixels > iPixel) nPixels = iPixel;
                        }
                    } else {
                        this.assert(iCell < this.aCellCache.length);
                        if (this.fCellCacheValid && data === this.aCellCache[iCell]) {
                            x += nPixels;
                            nPixels = 0;
                        } else {
                            this.aCellCache[iCell] = data;
                        }
                        iCell++;
                    }
            
                    if (nPixels) {
                        if (x < xDirty) xDirty = x;
                        for (iPixel = 0; iPixel < nPixels; iPixel++) {
                            var bPixel = data & 0xff;
                            this.setPixel(this.imageScreenBuffer, x++, y, aPixelColors[bPixel]);
                            data >>>= 8;
                        }
                        if (x > xMaxDirty) xMaxDirty = x;
                        if (y < yDirty) yDirty = y;
                        if (y >= yMaxDirty) yMaxDirty = y + 1;
                    }
            
                    this.assert(x <= this.nCols);
            
                    if (x >= this.nCols) {
                        x = 0;
                        if (++y > this.nRows) break;
                        addr += nRowAdjust;
                    }
                }
            
                if (!iPixelFirst) this.fCellCacheValid = true;
            
                /*
                 * For a fascinating discussion of the best way to update the screen canvas at this point, see updateScreenGraphicsCGA().
                 */
                if (xDirty < this.nCols) {
                    var cxDirty = xMaxDirty - xDirty;
                    var cyDirty = yMaxDirty - yDirty;
                    this.contextScreenBuffer.putImageData(this.imageScreenBuffer, 0, 0, xDirty, yDirty, cxDirty, cyDirty);
                    this.contextScreen.drawImage(this.canvasScreenBuffer, 0, 0, this.nCols, this.nRows, 0, 0, this.cxScreen, this.cyScreen);
                }
            };
            
            /**
             * getRetraceBits(card)
             *
             * This returns a byte value with two bits set or clear as appropriate: DISP_RETRACE and VERT_RETRACE.
             *
             * @this {Video}
             * @param {Object} card
             * @return {number}
             */
            Video.prototype.getRetraceBits = function(card)
            {
                var b = 0;
            
                /*
                 * NOTE: The CGA bits CGA.STATUS.DISP_RETRACE (0x01) and CGA.STATUS.VERT_RETRACE (0x08) match the EGA definitions,
                 * and they also correspond to the MDA bits MDA.STATUS.HDRIVE (0x01) and MDA.STATUS.BWVIDEO (0x08); I'm not sure why
                 * the MDA uses different designations, but the bits appear to serve the same purpose.
                 *
                 * TODO: Decide whether this more faithful emulation of the retrace bits should be extended to the MDA/CGA, too;
                 * doing so might slow down the BIOS scroll code a bit, though.
                 */
                var nCycles = this.cpu.getCycles();
                var nElapsedCycles = nCycles - card.nInitCycles;
                if (nElapsedCycles < 0) {
                    this.assert(nCycles === 0);
                    card.nInitCycles = nElapsedCycles;
                    nElapsedCycles = -nElapsedCycles|0;
                }
                var nCyclesHorzRemain = nElapsedCycles % card.nCyclesHorzPeriod;
                if (nCyclesHorzRemain > card.nCyclesHorzActive) b |= Card.CGA.STATUS.DISP_RETRACE;
                var nCyclesVertRemain = nElapsedCycles % card.nCyclesVertPeriod;
                if (nCyclesVertRemain > card.nCyclesVertActive) b |= Card.CGA.STATUS.VERT_RETRACE | Card.CGA.STATUS.DISP_RETRACE;
                /*
                 * This is optional: the number of CPU cycles that remain in the current vertical period is all we need to keep
                 * track of (the number of cycles since the card was initialized is fine, too, but that delta can become extremely
                 * large after a while).
                 *
                 *      card.nInitCycles = nCycles - nCyclesVertRemain;
                 *
                 * NOTE: Now that we're calling getRetraceBits() more frequently (ie, for internal checks), resetting nInitCycles
                 * in this fashion preserves the vertical period at the expense of the horizontal period, which in turn can cause
                 * grief in ROM BIOS code that requires strict horizontal retrace times.  TODO: Figure out how to re-enable this code.
                 */
                return b;
            };
            
            /**
             * inMDAIndx(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3B4)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number|undefined}
             */
            Video.prototype.inMDAIndx = function(port, addrFrom)
            {
                return this.inCRTCIndx(this.cardMono, port, addrFrom);
            };
            
            /**
             * outMDAIndx(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3B4)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outMDAIndx = function(port, bOut, addrFrom)
            {
                this.outCRTCIndx(this.cardMono, port, bOut, addrFrom);
            };
            
            /**
             * inMDAData(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3B5)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number|undefined}
             */
            Video.prototype.inMDAData = function(port, addrFrom)
            {
                return this.inCRTCData(this.cardMono, port, addrFrom);
            };
            
            /**
             * outMDAData(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3B5)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outMDAData = function(port, bOut, addrFrom)
            {
                this.outCRTCData(this.cardMono, port, bOut, addrFrom);
            };
            
            /**
             * inMDAMode(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3B8)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inMDAMode = function(port, addrFrom)
            {
                return this.inCardMode(this.cardMono, addrFrom);
            };
            
            /**
             * outMDAMode(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3B8)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outMDAMode = function(port, bOut, addrFrom)
            {
                this.outCardMode(this.cardMono, bOut, addrFrom);
            };
            
            /**
             * inMDAStatus(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3BA)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inMDAStatus = function(port, addrFrom)
            {
                return this.inCardStatus(this.cardMono, addrFrom);
            };
            
            /**
             * outFeat(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3BA or 0x3DA)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             *
             * NOTE: While this port also existed on the MDA and CGA, it existed only as an INPUT port, not an OUTPUT port.
             */
            Video.prototype.outFeat = function(port, bOut, addrFrom)
            {
                this.cardEGA.regFeat = (this.cardEGA.regFeat & ~Card.FEAT_CTRL.BITS) | (bOut & Card.FEAT_CTRL.BITS);
                this.printMessageIO(port, bOut, addrFrom, "FEAT");
            };
            
            /**
             * inATC(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C0)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inATC = function(port, addrFrom)
            {
                var b = this.cardEGA.fATCData? this.cardEGA.regATCData[this.cardEGA.regATCIndx & Card.ATC.INDX_MASK] : this.cardEGA.regATCIndx;
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.ATC.PORT, null, addrFrom, "ATC." + (this.cardEGA.fATCData? this.cardEGA.asATCRegs[this.cardEGA.regATCIndx & Card.ATC.INDX_MASK] : "INDX"), b);
                }
                this.cardEGA.fATCData = !this.cardEGA.fATCData;
                return b;
            };
            
            /**
             * outATC(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C0)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outATC = function(port, bOut, addrFrom)
            {
                var fPalEnabled = (this.cardEGA.regATCIndx & Card.ATC.INDX_PAL_ENABLE);
                if (!this.cardEGA.fATCData) {
                    this.cardEGA.regATCIndx = bOut;
                    this.printMessageIO(port, bOut, addrFrom, "ATC.INDX");
                    this.cardEGA.fATCData = true;
                    if ((bOut & Card.ATC.INDX_PAL_ENABLE) && !fPalEnabled) {
                        if (!this.buildFonts()) {
                            if (DEBUG && (!addrFrom || this.messageEnabled())) {
                                this.printMessage("outATC(" + str.toHexByte(bOut) + "): no font changes required");
                            }
                        } else {
                            if (DEBUG && (!addrFrom || this.messageEnabled())) {
                                this.printMessage("outATC(" + str.toHexByte(bOut) + "): redraw screen for font changes");
                            }
                            this.updateScreen(true);
                        }
                    }
                    /*
                     * HACK: nStartAddress is supposed to be "latched" ONLY at the start of every VERT_RETRACE interval,
                     * but other "triggers" are currently required; see updateScreen() for details.
                     */
                    this.cardEGA.nStartAddress = ((this.cardEGA.regCRTData[Card.CRTC.START_ADDR_HI] << 8) + this.cardEGA.regCRTData[Card.CRTC.START_ADDR_LO])|0;
                } else {
                    var iReg = this.cardEGA.regATCIndx & Card.ATC.INDX_MASK;
                    if (iReg >= Card.ATC.PALETTE_REGS || !fPalEnabled) {
                        if (Video.TRAPALL || this.cardEGA.regATCData[iReg] !== bOut) {
                            if (!addrFrom || this.messageEnabled()) {
                                this.printMessageIO(port, bOut, addrFrom, "ATC." + this.cardEGA.asATCRegs[iReg]);
                            }
                            this.cardEGA.regATCData[iReg] = bOut;
                        }
                    }
                    this.cardEGA.fATCData = false;
                }
            };
            
            /**
             * inStatus0(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C2)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inStatus0 = function(port, addrFrom)
            {
                var bSWBit = 0;
                if (this.nCard == Video.CARD.EGA) {
                    var iBit = 3 - ((this.cardEGA.regMisc & Card.MISC.CLOCK_SELECT) >> 2);    // this is the desired SW # (0-3)
                    bSWBit = (this.bEGASwitches & (1 << iBit)) << (Card.STATUS0.SWSENSE_SHIFT - iBit);
                } else {
                    /*
                     * The IBM VGA ROM expects the SWSENSE bit to change according to how the DAC is programmed.
                     *
                     * At C000:0391, the ROM selects the following array at 0x0454:
                     *
                     *      db  0x12,0x12,0x12,0x10
                     *
                     * and writes the first 3 bytes to DAC register #0, and then compares SWSENSE to the 4th byte (0x10).
                     *
                     * If the 4th byte matches, then the ROM clears the BIOS "monochrome monitor" bit, and does the same
                     * thing again with 5 more arrays, expecting the 4th byte in all 5 arrays to match SWSENSE, and being
                     * very unhappy if they don't:
                     *
                     *      db	0x14,0x14,0x14,0x10
                     *      db	0x2D,0x14,0x14,0x00
                     *      db	0x14,0x2D,0x14,0x00
                     *      db	0x14,0x14,0x2D,0x00
                     *      db	0x2D,0x2D,0x2D,0x00
                     *
                     * So I ensure happiness by setting SWSENSE unless any of the three 6-bit DAC values contain 0x2D.
                     *
                     * This hard-coded behavior assumes a color monitor.  If you really want to simulate a monochrome monitor,
                     * then the 1st array (above) must mismatch, and a different set of arrays must all match:
                     *
                     *      db	0x04,0x12,0x04,0x10
                     *      db	0x1E,0x12,0x04,0x00
                     *      db	0x04,0x2D,0x04,0x00
                     *      db	0x04,0x16,0x15,0x00
                     *      db	0x00,0x00,0x00,0x10
                     *
                     * In other words, for a monochrome monitor, set SWSENSE only when DAC register #0 matches the first and last
                     * sets of values.
                     */
                    var dwDAC = this.cardEGA.regDACData[0];
                    if ((dwDAC & 0x3f) != 0x2d && (dwDAC & (0x3f << 6)) != (0x2d << 6) && (dwDAC & (0x3f << 12)) != (0x2d << 12)) {
                        bSWBit |= Card.STATUS0.SWSENSE;
                    }
                }
                var b = ((this.cardEGA.regStatus0 & ~Card.STATUS0.SWSENSE) | bSWBit);
                /*
                 * TODO: Figure out where Card.STATUS0.FEAT bits should come from....
                 */
                this.cardEGA.regStatus0 = b;
                this.printMessageIO(Card.STATUS0.PORT, null, addrFrom, "STATUS0", b);
                return b;
            };
            
            /**
             * @this {Video}
             * @param {number} port (0x3C2)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outMisc = function(port, bOut, addrFrom)
            {
                this.cardEGA.regMisc = bOut;
                this.enableEGA();
                this.printMessageIO(Card.MISC.PORT_WRITE, bOut, addrFrom, "MISC");
            };
            
            /**
             * inVGAEnable(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C3)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inVGAEnable = function(port, addrFrom)
            {
                var b = this.cardEGA.regVGAEnable;
                this.printMessageIO(Card.VGA_ENABLE.PORT, null, addrFrom, "VGA_ENABLE", b);
                return b;
            };
            
            /**
             * outVGAEnable(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C3)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outVGAEnable = function(port, bOut, addrFrom)
            {
                this.cardEGA.regVGAEnable = bOut;
                this.printMessageIO(Card.VGA_ENABLE.PORT, bOut, addrFrom, "VGA_ENABLE");
            };
            
            /**
             * inSEQIndx(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C4)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inSEQIndx = function(port, addrFrom)
            {
                var b = this.cardEGA.regSEQIndx;
                this.printMessageIO(Card.SEQ.INDX.PORT, null, addrFrom, "SEQ.INDX", b);
                return b;
            };
            
            /**
             * outSEQIndx(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C4)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outSEQIndx = function(port, bOut, addrFrom)
            {
                this.cardEGA.regSEQIndx = bOut;
                this.printMessageIO(Card.SEQ.INDX.PORT, bOut, addrFrom, "SEQ.INDX");
            };
            
            /**
             * inSEQData(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C5)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inSEQData = function(port, addrFrom)
            {
                var b = this.cardEGA.regSEQData[this.cardEGA.regSEQIndx];
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.SEQ.DATA.PORT, null, addrFrom, "SEQ" + this.cardEGA.asSEQRegs[this.cardEGA.regSEQIndx], b);
                }
                return b;
            };
            
            /**
             * outSEQData(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C5)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outSEQData = function(port, bOut, addrFrom)
            {
                if (Video.TRAPALL || this.cardEGA.regSEQData[this.cardEGA.regSEQIndx] !== bOut) {
                    if (!addrFrom || this.messageEnabled()) {
                        this.printMessageIO(Card.SEQ.DATA.PORT, bOut, addrFrom, "SEQ." + this.cardEGA.asSEQRegs[this.cardEGA.regSEQIndx]);
                    }
                    this.cardEGA.regSEQData[this.cardEGA.regSEQIndx] = bOut;
                }
                switch(this.cardEGA.regSEQIndx) {
                case Card.SEQ.MAPMASK.INDX:
                    this.cardEGA.nSeqMapMask = Video.aEGAByteToDW[bOut & Card.SEQ.MAPMASK.MAPS];
                    break;
                case Card.SEQ.MEMMODE.INDX:
                    this.setAccess(this.getAccess());
                    break;
                default:
                    break;
                }
            };
            
            /**
             * inDACMask(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C6)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inDACMask = function(port, addrFrom)
            {
                var b = this.cardEGA.regDACMask;
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.DAC.MASK.PORT, null, addrFrom, "DAC.MASK", b);
                }
                return b;
            };
            
            /**
             * outDACMask(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C6)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outDACMask = function(port, bOut, addrFrom)
            {
                if (Video.TRAPALL || this.cardEGA.regDACMask !== bOut) {
                    if (!addrFrom || this.messageEnabled()) {
                        this.printMessageIO(Card.DAC.MASK.PORT, bOut, addrFrom, "DAC.MASK");
                    }
                    this.cardEGA.regDACMask = bOut;
                }
            };
            
            /**
             * inDACState(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C7)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inDACState = function(port, addrFrom)
            {
                var b = this.cardEGA.regDACState;
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.DAC.STATE.PORT, null, addrFrom, "DAC.STATE", b);
                }
                return b;
            };
            
            /**
             * outDACRead(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C7)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outDACRead = function(port, bOut, addrFrom)
            {
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.DAC.ADDR.PORT_READ, bOut, addrFrom, "DAC.READ");
                }
                this.cardEGA.regDACAddr = bOut;
                this.cardEGA.regDACState = Card.DAC.STATE.MODE_READ;
                this.cardEGA.regDACShift = 0;
            };
            
            /**
             * outDACWrite(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C8)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outDACWrite = function(port, bOut, addrFrom)
            {
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.DAC.ADDR.PORT_WRITE, bOut, addrFrom, "DAC.WRITE");
                }
                this.cardEGA.regDACAddr = bOut;
                this.cardEGA.regDACState = Card.DAC.STATE.MODE_WRITE;
                this.cardEGA.regDACShift = 0;
            };
            
            /**
             * inDACData(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C9)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inDACData = function(port, addrFrom)
            {
                var b = (this.cardEGA.regDACData[this.cardEGA.regDACAddr] >> this.cardEGA.regDACShift) & 0x3f;
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.DAC.DATA.PORT, null, addrFrom, "DAC.DATA[" + str.toHexByte(this.cardEGA.regDACAddr) + "][" + str.toHexByte(this.cardEGA.regDACShift) + "]", b);
                }
                this.cardEGA.regDACShift += 6;
                if (this.cardEGA.regDACShift > 12) {
                    this.cardEGA.regDACShift = 0;
                    this.cardEGA.regDACAddr = (this.cardEGA.regDACAddr + 1) & (Card.DAC.TOTAL_REGS-1);
                }
                return b;
            };
            
            /**
             * outDACData(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3C9)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outDACData = function(port, bOut, addrFrom)
            {
                var dw = this.cardEGA.regDACData[this.cardEGA.regDACAddr];
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.DAC.DATA.PORT, bOut, addrFrom, "DAC.DATA[" + str.toHexByte(this.cardEGA.regDACAddr) + "][" + str.toHexByte(this.cardEGA.regDACShift) + "]");
                }
                this.cardEGA.regDACData[this.cardEGA.regDACAddr] = (dw & ~(0x3f << this.cardEGA.regDACShift)) | ((bOut & 0x3f) << this.cardEGA.regDACShift);
                this.cardEGA.regDACShift += 6;
                if (this.cardEGA.regDACShift > 12) {
                    this.cardEGA.regDACShift = 0;
                    this.cardEGA.regDACAddr = (this.cardEGA.regDACAddr + 1) & (Card.DAC.TOTAL_REGS-1);
                }
            };
            
            /**
             * inVGAFeat(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3CA)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inVGAFeat = function(port, addrFrom)
            {
                var b = this.cardEGA.regFeat;
                this.printMessageIO(Card.FEAT_CTRL.PORT_READ, null, addrFrom, "FEAT", b);
                return b;
            };
            
            /**
             * outGRCPos2(port, bOut, addrFrom)
             *
             * "The EGA was originally implemented by IBM using two Graphics Controller Chips. This register is used to program
             * the Graphics #2 chip. See the Graphics #1 Position Register for details."
             *
             * "A one should be loaded into this location to map host data bus bits 2 and 3 to display planes 2 and 3, respectively."
             *
             * @this {Video}
             * @param {number} port (0x3CA)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outGRCPos2 = function(port, bOut, addrFrom)
            {
                this.cardEGA.regGRCPos2 = bOut;
                this.printMessageIO(Card.GRC.POS2_PORT, bOut, addrFrom, "GRC2");
            };
            
            /**
             * inVGAMisc(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3CC)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inVGAMisc = function(port, addrFrom)
            {
                var b = this.cardEGA.regMisc;
                this.printMessageIO(Card.MISC.PORT_READ, null, addrFrom, "MISC", b);
                return b;
            };
            
            /**
             * outGRCPos1(port, bOut, addrFrom)
             *
             * "The EGA was originally implemented by IBM using two Graphics Controller Chips. It was necessary to program
             * each to respond to a different set of two consecutive bits of the 8-bit host data bus. In the IBM EGA implementation,
             * a 0 must be loaded into this register. In the VGA, there is no analogous register."
             *
             * "A zero should be loaded into this location to map host data bus bits 0 and 1 to display planes 0 and 1 respectively."
             *
             * Note that this register was not readable on the EGA, and when the VGA came along, reads of this port read the Misc reg.
             *
             * @this {Video}
             * @param {number} port (0x3CC)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outGRCPos1 = function(port, bOut, addrFrom)
            {
                this.cardEGA.regGRCPos1 = bOut;
                this.printMessageIO(Card.GRC.POS1_PORT, bOut, addrFrom, "GRC1");
            };
            
            /**
             * inGRCIndx(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3CE)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inGRCIndx = function(port, addrFrom)
            {
                var b = this.cardEGA.regGRCIndx;
                this.printMessageIO(Card.GRC.INDX.PORT, null, addrFrom, "GRC.INDX", b);
                return b;
            };
            
            /**
             * outGRCIndx(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3CE)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outGRCIndx = function(port, bOut, addrFrom)
            {
                this.cardEGA.regGRCIndx = bOut;
                this.printMessageIO(Card.GRC.INDX.PORT, bOut, addrFrom, "GRC.INDX");
            };
            
            /**
             * inGRCData(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3CF)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inGRCData = function(port, addrFrom)
            {
                var b = this.cardEGA.regGRCData[this.cardEGA.regGRCIndx];
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(Card.GRC.DATA.PORT, null, addrFrom, "GRC." + this.cardEGA.asGRCRegs[this.cardEGA.regGRCIndx], b);
                }
                return b;
            };
            
            /**
             * outGRCData(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3CF)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outGRCData = function(port, bOut, addrFrom)
            {
                if (Video.TRAPALL || this.cardEGA.regGRCData[this.cardEGA.regGRCIndx] !== bOut) {
                    if (!addrFrom || this.messageEnabled()) {
                        this.printMessageIO(Card.GRC.DATA.PORT, bOut, addrFrom, "GRC." + this.cardEGA.asGRCRegs[this.cardEGA.regGRCIndx]);
                    }
                    this.cardEGA.regGRCData[this.cardEGA.regGRCIndx] = bOut;
                }
                switch(this.cardEGA.regGRCIndx) {
                case Card.GRC.SRESET.INDX:
                    this.cardEGA.nSetMapData = Video.aEGAByteToDW[bOut & 0xf];
                    this.cardEGA.nSetMapBits = this.cardEGA.nSetMapData & ~this.cardEGA.nSetMapMask;
                    break;
                case Card.GRC.ESRESET.INDX:
                    this.cardEGA.nSetMapMask = ~Video.aEGAByteToDW[bOut & 0xf];
                    this.cardEGA.nSetMapBits = this.cardEGA.nSetMapData & ~this.cardEGA.nSetMapMask;
                    break;
                case Card.GRC.COLORCMP.INDX:
                    this.cardEGA.nColorCompare = Video.aEGAByteToDW[bOut & 0xf] & (0x80808080|0);
                    break;
                case Card.GRC.DATAROT.INDX:
                case Card.GRC.MODE.INDX:
                    this.setAccess(this.getAccess());
                    break;
                case Card.GRC.READMAP.INDX:
                    this.cardEGA.nReadMapShift = (bOut & Card.GRC.READMAP.NUM) << 3;
                    break;
                case Card.GRC.MISC.INDX:
                    this.checkMode(false);
                    break;
                case Card.GRC.COLORDC.INDX:
                    this.cardEGA.nColorDontCare = Video.aEGAByteToDW[bOut & 0xf] & (0x80808080|0);
                    break;
                case Card.GRC.BITMASK.INDX:
                    this.cardEGA.nBitMapMask = bOut | (bOut << 8) | (bOut << 16) | (bOut << 24);
                    break;
                default:
                    break;
                }
            };
            
            /**
             * inCGAIndx(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D4)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number|undefined}
             */
            Video.prototype.inCGAIndx = function(port, addrFrom)
            {
                return this.inCRTCIndx(this.cardColor, port, addrFrom);
            };
            
            /**
             * outCGAIndx(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D4)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCGAIndx = function(port, bOut, addrFrom)
            {
                this.outCRTCIndx(this.cardColor, port, bOut, addrFrom);
            };
            
            /**
             * inCGAData(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D5)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number|undefined}
             */
            Video.prototype.inCGAData = function(port, addrFrom)
            {
                return this.inCRTCData(this.cardColor, port, addrFrom);
            };
            
            /**
             * outCGAData(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D5)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCGAData = function(port, bOut, addrFrom)
            {
                this.outCRTCData(this.cardColor, port, bOut, addrFrom);
            };
            
            /**
             * inCGAMode(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D8)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inCGAMode = function(port, addrFrom)
            {
                return this.inCardMode(this.cardColor, addrFrom);
            };
            
            /**
             * outCGAMode(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D8)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCGAMode = function(port, bOut, addrFrom)
            {
                this.outCardMode(this.cardColor, bOut, addrFrom);
            };
            
            /**
             * inCGAColor(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D9)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inCGAColor = function(port, addrFrom)
            {
                var b = this.cardColor.regColor;
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(port /* this.cardColor.port + 5 */, null, addrFrom, this.cardColor.type + ".COLOR", b);
                }
                return b;
            };
            
            /**
             * outCGAColor(port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3D9)
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCGAColor = function(port, bOut, addrFrom)
            {
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(port /* this.cardColor.port + 5 */, bOut, addrFrom, this.cardColor.type + ".COLOR");
                }
                if (this.cardColor.regColor !== bOut) {
                    this.cardColor.regColor = bOut;
                    /*
                     * When this color register changes, it can automatically change the appearance of any number of cells, so we make
                     * a special call to initCellCache() to invalidate every cell, forcing all cells to be redrawn on the next updateScreen().
                     */
                    this.initCellCache();
                }
            };
            
            /**
             * inCGAStatus(port, addrFrom)
             *
             * @this {Video}
             * @param {number} port (0x3DA)
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inCGAStatus = function(port, addrFrom)
            {
                return this.inCardStatus(this.cardColor, addrFrom);
            };
            
            /**
             * inCRTCIndx(card, port, addrFrom)
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} port
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number|undefined}
             */
            Video.prototype.inCRTCIndx = function(card, port, addrFrom)
            {
                var b;
                /*
                 * The IBM VGA ROM makes some hardware determinations based on how the CRTC controller responds when
                 * the IO_SELECT bit in the Miscellaneous Output Register is cleared; normally, that would mean ports
                 * 0x3B? are decoded and ports 0x3D? are ignored.  We didn't used to bother ignoring them, but the
                 * VGA ROM's logic requires it, so now we also check fActive.  However, we ignore only CTRC reads;
                 * we retain any writes in case that information proves useful later.
                 *
                 * Note that returning an undefined value now signals the Bus component to return whatever default value
                 * it prefers (normally 0xff).
                 */
                if (card.fActive) b = card.regCRTIndx;
                this.printMessageIO(port, null, addrFrom, "CRTC.INDX", b);
                return b;
            };
            
            /**
             * outCRTCIndx(card, port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} port
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCRTCIndx = function(card, port, bOut, addrFrom)
            {
                card.regCRTPrev = card.regCRTIndx;
                card.regCRTIndx = bOut & Card.CGA.CRTC.INDX.MASK;
                this.printMessageIO(port /* card.port */, bOut, addrFrom, "CRTC.INDX");
            };
            
            /**
             * inCRTCData(card, port, addrFrom)
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} port
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number|undefined}
             */
            Video.prototype.inCRTCData = function(card, port, addrFrom)
            {
                var b;
                /*
                 * The IBM VGA ROM makes some hardware determinations based on how the CRTC controller responds when
                 * the IO_SELECT bit in the Miscellaneous Output Register is cleared; normally, that would mean ports
                 * 0x3B? are decoded and ports 0x3D? are ignored.  We didn't used to bother ignoring them, but the
                 * VGA ROM's logic requires it, so now we also check fActive.  However, we ignore only CTRC reads;
                 * we retain any writes in case that information proves useful later.
                 *
                 * Note that returning an undefined value now signals the Bus component to return whatever default value
                 * it prefers (normally 0xff).
                 */
                if (card.fActive && card.regCRTIndx < card.nCRTCRegs) b = card.regCRTData[card.regCRTIndx];
                if (!addrFrom || this.messageEnabled()) {
                    this.printMessageIO(port /* card.port + 1 */, null, addrFrom, "CRTC." + card.asCRTCRegs[card.regCRTIndx], b);
                }
                return b;
            };
            
            /**
             * outCRTCData(card, port, bOut, addrFrom)
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} port
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCRTCData = function(card, port, bOut, addrFrom)
            {
                if (card.regCRTIndx < card.nCRTCRegs) {
                    if (Video.TRAPALL || card.regCRTData[card.regCRTIndx] !== bOut) {
                        if (!addrFrom || this.messageEnabled()) {
                            this.printMessageIO(port /* card.port + 1 */, bOut, addrFrom, "CRTC." + card.asCRTCRegs[card.regCRTIndx]);
                        }
                        card.regCRTData[card.regCRTIndx] = bOut;
                    }
                    if (card.regCRTIndx == Card.CRTC.START_ADDR_HI || card.regCRTIndx == Card.CRTC.START_ADDR_LO) {
                        /*
                         * HACK: nStartAddress is supposed to be "latched" ONLY at the start of every VERT_RETRACE interval,
                         * but the best we can currently do is latch it during retrace, as well as other times (eg, see outATC()).
                         */
                        if (this.getRetraceBits(card) & Card.CGA.STATUS.DISP_RETRACE) {
                            card.nStartAddress = ((card.regCRTData[Card.CRTC.START_ADDR_HI] << 8) + card.regCRTData[Card.CRTC.START_ADDR_LO])|0;
                        }
                    }
                    /*
                     * During mode changes on the EGA, all the CRTC regs are typically programmed in sequence,
                     * and if that's all that's happening with Card.CRTC.MAX_SCAN_LINE, then we don't want to treat
                     * it special; let the mode change be detected normally (eg, when the GRC regs are written later).
                     *
                     * On the other hand, if this was an out-of-sequence write to Card.CRTC.MAX_SCAN_LINE, then
                     * yes, we want to force setMode() to call setDimensions(), which is key to setting the proper
                     * number of screen rows.
                     */
                    if (card.regCRTIndx == Card.CRTC.MAX_SCAN_LINE && card.regCRTPrev != Card.CRTC.MAX_SCAN_LINE-1) {
                        this.checkMode(true);
                    }
                    this.checkCursor();
                } else {
                    if (DEBUG && (!addrFrom || this.messageEnabled())) {
                        this.printMessage("outCRTCData(): ignoring unexpected write to CRTC[" + str.toHexByte(card.regCRTIndx) + "]: " + str.toHexByte(bOut));
                    }
                }
            };
            
            /**
             * inCardMode(card, addrFrom)
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inCardMode = function(card, addrFrom)
            {
                var b = card.regMode;
                this.printMessageIO(card.port + 4, null, addrFrom, "MODE", b);
                return b;
            };
            
            /**
             * outCardMode(card, bOut, addrFrom)
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} bOut
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             */
            Video.prototype.outCardMode = function(card, bOut, addrFrom)
            {
                this.printMessageIO(card.port + 4, bOut, addrFrom, "MODE");
                card.regMode = bOut;
                this.checkMode(false);
            };
            
            /**
             * inCardStatus(card, addrFrom)
             *
             * On an EGA, this register is called "Status Register One" (0x3BA/0x3DA aka STATUS1), to distinguish it from
             * "Status Register Zero" (0x3C2 aka STATUS0).  One of the side-effects of reading STATUS1 is that it resets the
             * ATC address/data flip-flop to "address" mode, which we emulate by setting cardEGA.fATCData to false, indicating
             * that the ATC is not in "data" mode.
             *
             * @this {Video}
             * @param {Object} card
             * @param {number} [addrFrom] (not defined whenever the Debugger tries to read the specified port)
             * @return {number}
             */
            Video.prototype.inCardStatus = function(card, addrFrom)
            {
                var b = this.getRetraceBits(card);
            
                if (card === this.cardEGA) {
                    /*
                     * STATUS1 diagnostic bits 5 and 4 are set according to the Card.ATC.PLANES.MUX bits:
                     *
                     *      MUX     Bit 5   Bit 4
                     *      ---     ----    ----
                     *      00:     Red     Blue
                     *      01:     SecBlue Green
                     *      10:     SecRed  SecGreen
                     *      11:     unused  unused
                     *
                     * Depending on where we are in the horizontal and vertical periods (which can be inferred from the
                     * same elapsed cycle count that we used to simulate the retrace bits above), we could extract 4 bits
                     * from a corresponding region of the video buffer, "and" them with Card.ATC.PLANES.MASK, use
                     * that to index into the palette registers (cardEGA.regATCData), and use the resulting palette register
                     * bits to set these diagnostics bits.  However, that's all rather tedious, and the process of extracting
                     * 4 appropriate bits from the video buffer varies depending on the video mode.
                     *
                     * Why are we even considering this?  Because the EGA BIOS diagnostic code draws a bright reverse-video
                     * line of text blocks across the top of the screen, writes 0x3F to palette register 0x0f, and then
                     * monitors the STATUS1 diagnostic bits, waiting for those palette bits to show up.  It turns out, however,
                     * that we can easily fool the EGA BIOS by simply toggling the diagnostic bits.  So we take the easy way out.
                     *
                     * TODO: Faithful emulation of these bits is certainly doable, so consider doing that at some point.
                     */
                    b |= ((card.regStatus & Card.STATUS1.DIAGNOSTIC) ^ Card.STATUS1.DIAGNOSTIC);
            
                    /*
                     * Last but not least, we must reset the EGA's ATC flip-flop whenever this register is read.
                     */
                    card.fATCData = false;
                }
                else {
                    /*
                     * On the MDA/CGA, to satisfy ROM BIOS testing ("TEST.10"), it's sufficient to do a simple toggle of
                     * bits 0 and 3 on every read.
                     *
                     * Also, according to http://www.seasip.info/VintagePC/mda.html, on an MDA, bits 7-4 are always ON and
                     * bits 2-1 are always OFF, hence the "OR" of 0xf0.
                     *
                     * TODO: Decide whether to preserve the bits from getRetraceBits() on the MDA/CGA; we're continuing
                     * to do a simple toggle, partly on the theory that that may speed up the CGA BIOS scroll code a bit.
                     */
                    b = (card.regStatus ^= (Card.CGA.STATUS.DISP_RETRACE | Card.CGA.STATUS.VERT_RETRACE)) | 0xf0;
                }
            
                card.regStatus = b;
                this.printMessageIO(card.port + 6, null, addrFrom, (card === this.cardEGA? "STATUS1" : "STATUS"), b);
                return b;
            };
            
            /**
             * dumpVideo(sParm)
             *
             * @this {Video}
             * @param {string|undefined} sParm
             */
            Video.prototype.dumpVideo = function(sParm)
            {
                if (DEBUGGER) {
                    if (!this.cardActive) {
                        this.dbg.println("no active video card");
                        return;
                    }
                    if (sParm) {
                        this.cardActive.dumpBuffer(sParm);
                        return;
                    }
                    this.dbg.println("BIOSMODE: " + str.toHexByte(this.nMode));
                    this.cardActive.dumpCard();
                }
            };
            
            /*
             * Port input/output notification tables
             *
             * TODO: At one point, I'd added some "duplicate" entries for the MDA because, according to docs I'd read,
             * MDA ports are decoded at multiple addresses.  However, if this is important, then it should be verified
             * and implemented consistently (eg, for CGA as well).  For now, I'm decoding only the standard port addresses.
             *
             * For example, 0x3B5 is apparently also decoded at 0x3B1, 0x3B3, and 0x3B7, while 0x3B4 is also decoded at
             * 0x3B0, 0x3B2, and 0x3B6.
             */
            Video.aMDAPortInput = {
                0x3B4: Video.prototype.inMDAIndx,           // technically, not actually readable, but I want the Debugger to be able to read this
                0x3B5: Video.prototype.inMDAData,           // technically, the only CRTC Data registers that are readable are R14-R17
                0x3B8: Video.prototype.inMDAMode,           // technically, not actually readable, but I want the Debugger to be able to read this
                0x3BA: Video.prototype.inMDAStatus
            };
            
            Video.aMDAPortOutput = {
                0x3B4: Video.prototype.outMDAIndx,
                0x3B5: Video.prototype.outMDAData,
                0x3B8: Video.prototype.outMDAMode
            };
            
            Video.aCGAPortInput = {
                0x3D4: Video.prototype.inCGAIndx,           // technically, not actually readable, but I want the Debugger to be able to read this
                0x3D5: Video.prototype.inCGAData,           // technically, the only CRTC Data registers that are readable are R14-R17
                0x3D8: Video.prototype.inCGAMode,           // technically, not actually readable, but I want the Debugger to be able to read this
                0x3D9: Video.prototype.inCGAColor,          // technically, not actually readable, but I want the Debugger to be able to read this
                0x3DA: Video.prototype.inCGAStatus
            };
            
            Video.aCGAPortOutput = {
                0x3D4: Video.prototype.outCGAIndx,
                0x3D5: Video.prototype.outCGAData,
                0x3D8: Video.prototype.outCGAMode,
                0x3D9: Video.prototype.outCGAColor
            };
            
            Video.aEGAPortInput = {
                0x3C0: Video.prototype.inATC,               // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                0x3C1: Video.prototype.inATC,               // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                0x3C2: Video.prototype.inStatus0,
                0x3C4: Video.prototype.inSEQIndx,           // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                0x3C5: Video.prototype.inSEQData,           // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                0x3CE: Video.prototype.inGRCIndx,           // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
                0x3CF: Video.prototype.inGRCData            // technically, only readable on a VGA, but I want the Debugger to be able to read this, too
            };
            
            /*
             * WARNING: Unlike the EGA, a standard VGA does not support writes to 0x3C1, but it's easier for me to leave that
             * ability in place, treating the VGA as a superset of the EGA as much as possible; will any code break because word
             * I/O to port 0x3C0 actually works?  Possibly, but highly unlikely.
             */
            Video.aEGAPortOutput = {
                0x3BA: Video.prototype.outFeat,
                0x3C0: Video.prototype.outATC,
                0x3C1: Video.prototype.outATC,              // the EGA BIOS writes to this port (see C000:0416), implying that 0x3C0 and 0x3C1 both decode the same register
                0x3C2: Video.prototype.outMisc,             // FYI, since this overlaps with STATUS0.PORT, there's currently no way for the Debugger to read the Misc register
                0x3C4: Video.prototype.outSEQIndx,
                0x3C5: Video.prototype.outSEQData,
                0x3CA: Video.prototype.outGRCPos2,
                0x3CC: Video.prototype.outGRCPos1,
                0x3CE: Video.prototype.outGRCIndx,
                0x3CF: Video.prototype.outGRCData,
                0x3DA: Video.prototype.outFeat
            };
            
            Video.aVGAPortInput = {
                0x3C3: Video.prototype.inVGAEnable,
                0x3C6: Video.prototype.inDACMask,
                0x3C7: Video.prototype.inDACState,
                0x3C9: Video.prototype.inDACData,
                0x3CA: Video.prototype.inVGAFeat,
                0x3CC: Video.prototype.inVGAMisc
            };
            
            Video.aVGAPortOutput = {
                0x3C3: Video.prototype.outVGAEnable,
                0x3C6: Video.prototype.outDACMask,
                0x3C7: Video.prototype.outDACRead,
                0x3C8: Video.prototype.outDACWrite,
                0x3C9: Video.prototype.outDACData
            };
            
            /**
             * Video.init()
             *
             * This function operates on every HTML element of class "video", extracting the
             * JSON-encoded parameters for the Video constructor from the element's "data-value"
             * attribute, invoking the constructor to create a Video component, and then binding
             * any associated HTML controls to the new component.
             */
            Video.init = function()
            {
                var aeVideo = Component.getElementsByClass(window.document, PCJSCLASS, "video");
                for (var iVideo = 0; iVideo < aeVideo.length; iVideo++) {
                    var eVideo = aeVideo[iVideo];
                    var parmsVideo = Component.getComponentParms(eVideo);
            
                    var eCanvas = window.document.createElement("canvas");
                    if (eCanvas === undefined || !eCanvas.getContext) {
                        eVideo.innerHTML = "<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";
                        return;
                    }
            
                    eCanvas.setAttribute("class", PCJSCLASS + "-canvas");
                    eCanvas.setAttribute("width", parmsVideo['screenWidth']);
                    eCanvas.setAttribute("height", parmsVideo['screenHeight']);
                    eCanvas.style.backgroundColor = parmsVideo['screenColor'];
            
                    /*
                     * The "contenteditable" attribute on a canvas element NOTICEABLY slows down canvas drawing on
                     * Safari as soon as you give the canvas focus (ie, click away from the canvas, and drawing speeds
                     * up; click on the canvas, and drawing slows down).  So the "transparent textarea hack" that we
                     * once employed as only a work-around for Android devices is now our default.
                     *
                     *      eCanvas.setAttribute("contenteditable", "true");
                     *
                     * HACK: A canvas style of "auto" provides for excellent responsive canvas scaling in EVERY browser
                     * except IE9/IE10, so I recalculate the appropriate CSS height every time the parent DIV is resized;
                     * IE11 works without this hack, so we take advantage of the fact that IE11 doesn't report itself as "MSIE".
                     */
                    eCanvas.style.height = "auto";
                    if (web.getUserAgent().indexOf("MSIE") >= 0) {
                        eVideo.onresize = function(eParent, eChild, cx, cy) {
                            return function onResizeVideo() {
                                eChild.style.height = (((eParent.clientWidth * cy) / cx) | 0) + "px";
                            };
                        }(eVideo, eCanvas, parmsVideo['screenWidth'], parmsVideo['screenHeight']);
                        eVideo.onresize();
                    }
                    eVideo.appendChild(eCanvas);
            
                    /*
                     * HACK: Android-based browsers, like the Silk (Amazon) browser and Chrome for Android, don't honor the
                     * "contenteditable" attribute; that is, when the canvas receives focus, they don't activate the on-screen
                     * keyboard.  So my fallback is to create a transparent textarea on top of the canvas.
                     *
                     * The parent DIV must have a style of "position:relative" (alternatively, a class of "pcjs-container"),
                     * so that we can position the textarea using absolute coordinates.  Also, we don't want the textarea to be
                     * visible, but we must use "opacity:0" instead of "visibility:hidden", because the latter seems to prevent
                     * the element from receiving events.  These styling requirements are taken care of in components.css
                     * (see references to the "pcjs-video-object" class).
                     *
                     * UPDATE: Unfortunately, Android keyboards like to compose whole words before transmitting any of the
                     * intervening characters; our textarea's keyDown/keyUp event handlers DO receive intervening key events,
                     * but their keyCode property is ZERO.  Virtually the only usable key event we receive is the Enter key.
                     * Android users will have to use machines that include their own on-screen "soft keyboard", or use an
                     * external keyboard.
                     *
                     * The following attempt to use a password-enabled input field didn't work any better on Android.  You could
                     * clearly see the overlaid semi-transparent input field, but none of the input characters were passed along,
                     * with the exception of the "Go" (Enter) key.
                     *
                     *      var eInput = window.document.createElement("input");
                     *      eInput.setAttribute("type", "password");
                     *      eInput.setAttribute("style", "position:absolute; left:0; top:0; width:100%; height:100%; opacity:0.5");
                     *      eVideo.appendChild(eInput);
                     *
                     * See this Chromium issue for more information: https://code.google.com/p/chromium/issues/detail?id=118639
                     */
                    var eTextArea = window.document.createElement("textarea");
            
                    /*
                     * As noted in keyboard.js, the keyboard on an iOS device pops up with the SHIFT key depressed,
                     * which is not the initial keyboard state that the Keyboard component expects.
                     */
                    if (web.isUserAgent("iOS")) {
                        eTextArea.setAttribute("autocapitalize", "off");
                        eTextArea.setAttribute("autocorrect", "off");
                    }
                    eVideo.appendChild(eTextArea);
            
                    /*
                     * Now we can create the Video object, record it, and wire it up to the associated document elements.
                     */
                    var eContext = eCanvas.getContext("2d");
                    var video = new Video(parmsVideo, eCanvas, eContext, eTextArea /* || eInput */, eVideo);
            
                    /*
                     * Bind any video-specific controls (eg, the Refresh button). There are no essential controls, however;
                     * even the "Refresh" button is just a diagnostic tool, to ensure that the screen contents are up-to-date.
                     */
                    Component.bindComponentControls(video, eVideo, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every Video module on the page.
             */
            web.onInit(Video.init);
            
            if (typeof module !== 'undefined') module.exports = Video;
            
          • x86.js
            /**
             * @fileoverview Defines PCjs x86 constants.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            var X86 = {
                /*
                 * CPU model numbers
                 */
                MODEL_8086:     8086,
                MODEL_8088:     8088,
                MODEL_80186:    80186,
                MODEL_80188:    80188,
                MODEL_80286:    80286,
                MODEL_80386:    80386,
            
                /*
                 * This constant is used to mark points in the code where the physical address being returned
                 * is invalid and should not be used.  TODO: There are still functions that will use an invalid
                 * address, which is why we've tried to choose a value that causes the least harm, but ultimately,
                 * we must add checks to those functions or throw special JavaScript exceptions to bypass them.
                 *
                 * This value is also used to indicate non-existent EA address calculations, which are usually
                 * detected with "regEA === ADDR_INVALID" and "regEAWrite === ADDR_INVALID" tests.  In a 32-bit
                 * CPU, -1 (ie, 0xffffffff) could actually be a valid address, so consider changing ADDR_INVALID
                 * to NaN or null (which is also why all ADDR_INVALID tests should use strict equality operators).
                 *
                 * The main reason I'm NOT using NaN or null now is my concern that, by mixing non-numbers
                 * (specifically, values outside the range of signed 32-bit integers), performance may suffer.
                 */
                ADDR_INVALID:   -1,
            
                /*
                 * Processor Status flag definitions (stored in regPS)
                 */
                PS: {
                    CF:     0x0001,     // bit 0: Carry flag
                    BIT1:   0x0002,     // bit 1: reserved, always set
                    PF:     0x0004,     // bit 2: Parity flag
                    BIT3:   0x0008,     // bit 3: reserved, always clear
                    AF:     0x0010,     // bit 4: Auxiliary Carry flag (aka Arithmetic flag)
                    BIT5:   0x0020,     // bit 5: reserved, always clear
                    ZF:     0x0040,     // bit 6: Zero flag
                    SF:     0x0080,     // bit 7: Sign flag
                    TF:     0x0100,     // bit 8: Trap flag
                    IF:     0x0200,     // bit 9: Interrupt flag
                    DF:     0x0400,     // bit 10: Direction flag
                    OF:     0x0800,     // bit 11: Overflow flag
                    IOPL: {
                     MASK:  0x3000,     // bits 12-13: I/O Privilege Level (always set on 8086/80186, clear on 80286 reset)
                     SHIFT: 12
                    },
                    NT:     0x4000,     // bit 14: Nested Task flag (always set on 8086/80186, clear on 80286 reset)
                    BIT15:  0x8000      // bit 15: reserved (always set on 8086/80186, clear otherwise)
                },
                CR0: {
                    /*
                     * Machine Status Word (MSW) bit definitions
                     */
                    MSW: {
                        PE:     0x0001, // protected-mode enabled
                        MP:     0x0002, // monitor processor extension (ie, coprocessor)
                        EM:     0x0004, // emulate processor extension
                        TS:     0x0008, // task switch indicator
                        ON:     0xfff0, // on the 80286, these bits are always on (TODO: Verify)
                        MASK:   0xffff  // these are the only (MSW) bits that the 80286 can access (within CR0)
                    },
                    ET: 0x00000010,     // coprocessor type (80287 or 80387); always 1 on post-80386 CPUs
                    PG: 0x80000000|0    // 0: paging disabled
                },
                SEL: {
                    RPL:    0x0003,     // requested privilege level (0-3)
                    LDT:    0x0004,     // table indicator (0: GDT, 1: LDT)
                    MASK:   0xfff8      // table index
                },
                DESC: {                 // Descriptor Table Entry
                    LIMIT: {            // LIMIT bits 0-15 (or OFFSET if this is an INTERRUPT or TRAP gate)
                        OFFSET:     0x0
                    },
                    BASE: {             // BASE bits 0-15 (or SELECTOR if this is a TASK, INTERRUPT or TRAP gate)
                        OFFSET:     0x2
                    },
                    ACC: {              // bit definitions for the access word (offset 0x4)
                        OFFSET:     0x4,
                        BASE1623:                       0x00ff,     // (not used if this a TASK, INTERRUPT or TRAP gate; bits 0-5 are parm count for CALL gates)
                        TYPE: {
                            OFFSET: 0x5,
                            MASK:                       0x1f00,
                            SEG:                        0x1000,
                            NONSEG:                     0x0f00,
                            /*
                             * The following bits apply only when SEG is set
                             */
                            CODE:                       0x0800,     // set for CODE, clear for DATA
                            ACCESSED:                   0x0100,     // set if accessed, clear if not accessed
                            READABLE:                   0x0200,     // CODE: set if readable, clear if exec-only
                            WRITABLE:                   0x0200,     // DATA: set if writable, clear if read-only
                            CONFORMING:                 0x0400,     // CODE: set if conforming, clear if not
                            EXPDOWN:                    0x0400,     // DATA: set if expand-down, clear if not
                            /*
                             * The following are all the possible (valid) types (well, except for the variations
                             * of DATA and CODE where the ACCESSED bit (0x0100) may also be set)
                             */
                            TSS:                        0x0100,
                            LDT:                        0x0200,
                            TSS_BUSY:                   0x0300,
                            GATE_CALL:                  0x0400,
                            GATE_TASK:                  0x0500,
                            GATE_INT:                   0x0600,
                            GATE_TRAP:                  0x0700,
                            DATA_READONLY:              0x1000,
                            DATA_WRITABLE:              0x1200,
                            DATA_EXPDOWN_READONLY:      0x1400,
                            DATA_EXPDOWN_WRITABLE:      0x1600,
                            CODE_EXECONLY:              0x1800,
                            CODE_READABLE:              0x1a00,
                            CODE_CONFORMING:            0x1c00,
                            CODE_CONFORMING_READABLE:   0x1e00
                        },
                        DPL: {
                            MASK:                       0x6000,
                            SHIFT:                      13
                        },
                        PRESENT:                        0x8000,
                        INVALID:    0   // use X86.DESC.ACC.INVALID for invalid ACC values
                    },
                    EXT: {              // descriptor extension word (reserved on the 80286; "must be zero")
                        OFFSET:     0x6,
                        LIMIT1619:                      0x000f,
                        AVAIL:                          0x0010,     // NOTE: set in various descriptors in OS/2
                        /*
                         * The BIG bit is known as the D bit for code segments; when set, all addresses and operands
                         * in that code segment are assumed to be 32-bit.
                         *
                         * The BIG bit is known as the B bit for data segments; when set, it indicates: 1) all pushes,
                         * pops, calls and returns use ESP instead of SP, and 2) the upper bound of an expand-down segment
                         * is 0xffffffff instead of 0xffff.
                         */
                        BIG:                            0x0040,     // clear if default operand/address size is 16-bit, set if 32-bit
                        LIMITPAGES:                     0x0080,     // clear if limit granularity is bytes, set if limit granularity is 4Kb pages
                        BASE2431:                       0xff00
                    },
                    INVALID: 0          // use X86.DESC.INVALID for invalid DESC values
                },
                LADDR: {                // linear address
                    PDE: {              // index of page directory entry
                        MASK:   0xffc00000|0,
                        SHIFT:  20      // (addr & DIR.MASK) >>> DIR.SHIFT yields a page directory offset (ie, index * 4)
                    },
                    PTE: {              // index of page table entry
                        MASK:   0x003ff000,
                        SHIFT:  10      // (addr & PAGE.MASK) >>> PAGE.SHIFT yields a page table offset (ie, index * 4)
                    },
                    OFFSET:     0x00000fff
                },
                PTE: {
                    FRAME:      0xfffff000|0,
                    DIRTY:      0x00000040,         // page has been modified
                    ACCESSED:   0x00000020,         // page has been accessed
                    USER:       0x00000004,         // set for user level (CPL 3), clear for supervisor level (CPL 0-2)
                    READWRITE:  0x00000002,         // set for read/write, clear for read-only (affects CPL 3 only)
                    PRESENT:    0x00000001          // set for present page, clear for not-present page
                },
                TSS: {
                    PREV_TSS:   0x00,
                    CPL0_SP:    0x02,   // start of values altered by task switches
                    CPL0_SS:    0x04,
                    CPL1_SP:    0x06,
                    CPL1_SS:    0x08,
                    CPL2_SP:    0x0a,
                    CPL2_SS:    0x0c,
                    TASK_IP:    0x0e,
                    TASK_PS:    0x10,
                    TASK_AX:    0x12,
                    TASK_CX:    0x14,
                    TASK_DX:    0x16,
                    TASK_BX:    0x18,
                    TASK_SP:    0x1a,
                    TASK_BP:    0x1c,
                    TASK_SI:    0x1e,
                    TASK_DI:    0x20,
                    TASK_ES:    0x22,
                    TASK_CS:    0x24,
                    TASK_SS:    0x26,
                    TASK_DS:    0x28,   // end of values altered by task switches
                    TASK_LDT:   0x2a
                },
                /*
                 * Processor Exception Interrupts
                 *
                 * Of the following exceptions, all are designed to be restartable, except for 0x08 and 0x09 (and 0x0D
                 * after an attempt to write to a read-only segment).
                 *
                 * Error codes are pushed onto the stack for 0x08 (always 0) and 0x0A through 0x0D.
                 *
                 * Priority: Instruction exception, TRAP, NMI, Processor Extension Segment Overrun, and finally INTR.
                 *
                 * All exceptions can also occur in real-mode, except where noted.  A GP_FAULT in real-mode can be triggered
                 * by "any memory reference instruction that attempts to reference [a] 16-bit word at offset 0FFFFH".
                 *
                 * Interrupts beyond 0x10 (up through 0x1F) are reserved for future exceptions.
                 *
                 * Implementation Detail: For any opcode we know must generate a UD_FAULT interrupt, we invoke opInvalid(),
                 * NOT opUndefined().  UD_FAULT is for INVALID opcodes, Intel's choice of "UD" notwithstanding.
                 *
                 * We reserve the term "undefined" for opcodes that require more investigation, and we invoke opUndefined()
                 * ONLY until an opcode's behavior has finally been defined, at which point it becomes either valid or invalid.
                 * The term "illegal" seems completely superfluous; we don't need a third way of describing invalid opcodes.
                 *
                 * The term "undocumented" should be limited to operations that are valid but Intel simply never documented.
                 */
                EXCEPTION: {
                    DIV_ERR:    0x00,       // Divide Error Interrupt
                    TRAP:       0x01,       // Single Step (aka Trap) Interrupt
                    NMI:        0x02,       // Non-Maskable Interrupt
                    BREAKPOINT: 0x03,       // Breakpoint Interrupt
                    OVERFLOW:   0x04,       // INTO Overflow Interrupt (FYI, return address does NOT point to offending instruction)
                    BOUND_ERR:  0x05,       // BOUND Error Interrupt
                    UD_FAULT:   0x06,       // Invalid (aka Undefined or Illegal) Opcode (see implementation detail above)
                    NM_FAULT:   0x07,       // No Math Unit Available (see ESC or WAIT)
                    DF_FAULT:   0x08,       // Double Fault (see LIDT)
                    MP_FAULT:   0x09,       // Math Unit Protection Fault (see ESC)
                    TS_FAULT:   0x0A,       // Invalid Task State Segment Fault (protected-mode only)
                    NP_FAULT:   0x0B,       // Not Present Fault (protected-mode only)
                    SS_FAULT:   0x0C,       // Stack Fault (protected-mode only)
                    GP_FAULT:   0x0D,       // General Protection Fault
                    PG_FAULT:   0x0E,       // Page Fault
                    MF_FAULT:   0x10        // Math Fault (see ESC or WAIT)
                },
                ERRCODE: {
                    EXT:        0x0001,
                    IDT:        0x0002,
                    LDT:        0x0004,
                    MASK:       0xfff8      // index of corresponding entry in GDT, LDT or IDT
                },
                RESULT: {
                    /*
                     * Flags were originally computed using 16-bit result registers:
                     *
                     *      CF: resultZeroCarry & resultSize (ie, 0x100 or 0x10000)
                     *      PF: resultParitySign & 0xff
                     *      AF: (resultParitySign ^ resultAuxOverflow) & 0x0010
                     *      ZF: resultZeroCarry & (resultSize - 1)
                     *      SF: resultParitySign & (resultSize >> 1)
                     *      OF: (resultParitySign ^ resultAuxOverflow ^ (resultParitySign >> 1)) & (resultSize >> 1)
                     *
                     * I386 support requires that we now rely on 32-bit result registers:
                     *
                     *      resultDst, resultSrc, resultArith, resultLogic and resultType
                     *
                     * and flags are now computed as follows:
                     *
                     *      CF: ((resultDst ^ ((resultDst ^ resultSrc) & (resultSrc ^ resultArith))) & resultType)
                     *      PF: (resultLogic & 0xff)
                     *      AF: ((resultArith ^ (resultDst ^ resultSrc)) & 0x0010)
                     *      ZF: (resultLogic & ((resultType - 1) | resultType))
                     *      SF: (resultLogic & resultType)
                     *      OF: (((resultDst ^ resultArith) & (resultSrc ^ resultArith)) & resultType)
                     *
                     * where resultType contains both a size, which must be one of BYTE (0x80), WORD (0x8000),
                     * or DWORD (0x80000000), along with bits for each of the arithmetic and/or logical flags that
                     * are currently "cached" in the result registers (eg, X86.RESULT.CF for carry, X86.RESULT.OF
                     * for overflow, etc).
                     *
                     * WARNING: Do not confuse these RESULT flag definitions with the PS flag definitions.  RESULT
                     * flags are used only as "cached" flag indicators, packed into bits 0-5 of resultType; they do
                     * not match the actual flag bit definitions within the Processor Status (PS) register.
                     *
                     * Arithmetic operations should call:
                     *
                     *      setArithResult(dst, src, value, type)
                     * eg:
                     *      setArithResult(dst, src, dst+src, X86.RESULT.BYTE | X86.RESULT.ALL)
                     *
                     * and logical operations should call:
                     *
                     *      setLogicResult(value, type [, carry [, overflow]])
                     *
                     * Since most logical operations clear both CF and OF, most calls to setLogicResult() can omit the
                     * last two optional parameters.
                     *
                     * The type parameter of these methods indicates both the size of the result (BYTE, WORD or DWORD)
                     * and which of the flags should now be considered "cached" by the result registers.  If the previous
                     * resultType specifies any flags not present in the new type parameter, then those flags are
                     * calculated and written to the appropriate regPS bit(s) *before* the result registers are updated.
                     *
                     * Arithmetic operations are assumed to represent an "added" result; if a "subtracted" result is
                     * provided instead (eg, from CMP, DEC, SUB, etc), then setArithResult() must include a 5th parameter
                     * (fSubtract); eg:
                     *
                     *      setArithResult(dst, src, dst-src, X86.RESULT.BYTE | X86.RESULT.ALL, true)
                     *
                     * TODO: Consider separating setArithResult() into two functions: setAddResult() and setSubResult().
                     */
                    BYTE:       0x80,       // result is byte value
                    WORD:       0x8000,     // result is word value
                    DWORD:      0x80000000|0,
                    TYPE:       0x80008080|0,
                    CF:         0x01,       // carry flag is cached
                    PF:         0x02,       // parity flag is cached
                    AF:         0x04,       // aux carry flag is cached
                    ZF:         0x08,       // zero flag is cached
                    SF:         0x10,       // sign flag is cached
                    OF:         0x20,       // overflow flag is cached
                    ALL:        0x3F,       // all result flags are cached
                    LOGIC:      0x1A,       // all logical flags are cached; see setLogicResult()
                    NOTCF:      0x3E        // all result flags EXCEPT carry are cached
                },
                /*
                 * Bit values for opFlags, which are all reset to zero prior to each instruction
                 */
                OPFLAG: {
                    NOREAD:     0x0001,
                    NOWRITE:    0x0002,
                    NOINTR:     0x0004,     // indicates a segreg has been set, or a prefix, or an STI (delay INTR acknowledgement)
                    SEG:        0x0010,     // segment override
                    LOCK:       0x0020,     // lock prefix
                    REPZ:       0x0040,     // repeat while Z (NOTE: this value MUST match PS.ZF; see opCMPSb/opCMPSw/opSCASb/opSCASw)
                    REPNZ:      0x0080,     // repeat while NZ
                    REPEAT:     0x0100,     // indicates that an instruction is being repeated (ie, some iteration AFTER the first)
                    PUSHSP:     0x0200,     // the SP register is potentially being referenced by a PUSH SP opcode, adjustment may be required
                    DATASIZE:   0x1000,     // data size override
                    ADDRSIZE:   0x2000      // address size override
                },
                /*
                 * Bit values for intFlags
                 */
                INTFLAG: {
                    NONE:       0x00,
                    INTR:       0x01,       // h/w interrupt requested
                    TRAP:       0x02,       // trap (INT 0x01) requested
                    HALT:       0x04,       // halt (HLT) requested
                    DMA:        0x08        // async DMA operation in progress
                },
                /*
                 * Common opcodes (and/or any opcodes we need to refer to explicitly)
                 */
                OPCODE: {
                    ES:         0x26,       // opES()
                    CS:         0x2E,       // opCS()
                    SS:         0x36,       // opSS()
                    DS:         0x3E,       // opDS()
                    PUSHSP:     0x54,       // opPUSHSP()
                    PUSHA:      0x60,       // opPUHSA()    (80186 and up)
                    POPA:       0x61,       // opPOPA()     (80186 and up)
                    BOUND:      0x62,       // opBOUND()    (80186 and up)
                    ARPL:       0x63,       // opARPL()     (80286 and up)
                    FS:         0x64,       // opFS()       (80386 and up)
                    GS:         0x65,       // opGS()       (80386 and up)
                    OS:         0x66,       // opOS()       (80386 and up)
                    AS:         0x67,       // opAS()       (80386 and up)
                    PUSHN:      0x68,       // opPUSHn()    (80186 and up)
                    IMULN:      0x69,       // opIMULn()    (80186 and up)
                    PUSH8:      0x6A,       // opPUSH8()    (80186 and up)
                    IMUL8:      0x6B,       // opIMUL8()    (80186 and up)
                    INSB:       0x6C,       // opINSb()     (80186 and up)
                    INSW:       0x6D,       // opINSw()     (80186 and up)
                    OUTSB:      0x6E,       // opOUTSb()    (80186 and up)
                    OUTSW:      0x6F,       // opOUTSw()    (80186 and up)
                    ENTER:      0xC8,       // opENTER()    (80186 and up)
                    LEAVE:      0xC9,       // opLEAVE()    (80186 and up)
                    CALLF:      0x9A,       // opCALLF()
                    MOVSB:      0xA4,       // opMOVSb()
                    MOVSW:      0xA5,       // opMOVSw()
                    CMPSB:      0xA6,       // opCMPSb()
                    CMPSW:      0xA7,       // opCMPSw()
                    STOSB:      0xAA,       // opSTOSb()
                    STOSW:      0xAB,       // opSTOSw()
                    LODSB:      0xAC,       // opLODSb()
                    LODSW:      0xAD,       // opLODSw()
                    SCASB:      0xAE,       // opSCASb()
                    SCASW:      0xAF,       // opSCASw()
                    INT3:       0xCC,       // opINT3()
                    INTn:       0xCD,       // opINTn()
                    INTO:       0xCE,       // opINTO()
                    LOOPNZ:     0xE0,       // opLOOPNZ()
                    LOOPZ:      0xE1,       // opLOOPZ()
                    LOOP:       0xE2,       // opLOOP()
                    CALL:       0xE8,       // opCALL()
                    JMP:        0xE9,       // opJMP()      (2-byte displacement)
                    JMPF:       0xEA,       // opJMPF()
                    JMPS:       0xEB,       // opJMPs()     (1-byte displacement)
                    LOCK:       0xF0,       // opLOCK()
                    REPNZ:      0xF2,       // opREPNZ()
                    REPZ:       0xF3,       // opREPZ()
                    GRP4W:      0xFF,
                    CALLW:      0x10FF,     // GRP4W: fnCALLw()
                    CALLFDW:    0x18FF,     // GRP4W: fnCALLFdw()
                    CALLMASK:   0x38FF,     // mask 2-byte GRP4W opcodes with this before comparing to CALLW or CALLFDW
                    UD2:        0x0B0F      // UD2 (invalid opcode "guaranteed" to generate UD_FAULT on all post-8086 processors)
                }
            };
            
            /*
             * BACKTRACK-related definitions (used only if BACKTRACK is defined)
             */
            X86.BACKTRACK = {
                SP_LO:  0,
                SP_HI:  0
            };
            
            /*
             * These PS flags are always stored directly in regPS for the 8086/8088, hence the
             * "direct" designation; other processors must adjust these bits accordingly.  The final
             * adjusted value is stored in PS_DIRECT.
             */
            X86.PS_DIRECT_8086 = (X86.PS.TF | X86.PS.IF | X86.PS.DF);
            
            /*
             * These are the default "always set" PS bits for the 8086/8088; other processors must
             * adjust these bits accordingly.  The final adjusted value is stored in PS_SET.
             */
            X86.PS_SET_8086 = (X86.PS.BIT1 | X86.PS.IOPL.MASK | X86.PS.NT | X86.PS.BIT15);
            
            /*
             * These PS arithmetic and logical flags may be "cached" across several result registers;
             * whether or not they're currently cached depends on the RESULT bits in resultType.
             */
            X86.PS_CACHED = (X86.PS.CF | X86.PS.PF | X86.PS.AF | X86.PS.ZF | X86.PS.SF | X86.PS.OF);
            
            /*
             * PS_SAHF is a subset of the arithmetic flags, and refers only to those flags that the
             * SAHF and LAHF "8080 legacy" opcodes affect.
             */
            X86.PS_SAHF = (X86.PS.CF | X86.PS.PF | X86.PS.AF | X86.PS.ZF | X86.PS.SF);
            
            /*
             * Before we zero opFlags, we first see if any of the following PREFIX bits were set.  If any were set,
             * they are OR'ed into opPrefixes; otherwise, opPrefixes is zeroed as well.  This gives prefix-conscious
             * instructions like LODS, MOVS, STOS, CMPS, etc, a way of determining which prefixes, if any, immediately
             * preceded them.
             */
            X86.OPFLAG_PREFIXES = (X86.OPFLAG.SEG | X86.OPFLAG.LOCK | X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ | X86.OPFLAG.DATASIZE | X86.OPFLAG.ADDRSIZE);
            
            if (typeof module !== 'undefined') module.exports = X86;
            
          • x86cpu.js
            /**
             * @fileoverview Implements PCjs 8086/8088 CPU logic.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var web         = require("../../shared/lib/weblib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var Bus         = require("./bus");
                var Memory      = require("./memory");
                var State       = require("./state");
                var CPU         = require("./cpu");
                var X86         = require("./x86");
                var X86Seg      = require("./x86seg");
            }
            
            if (!I386) {
                /*
                 * These are the original ModRM decoders, which were simpler and faster because they could treat all
                 * word instructions as 16-bit, assume bits 15-31 of all registers were always zero, and use masking
                 * constants instead of variables.  If I386 is enabled, these decoders are not used, and the compiler
                 * will eliminate them from the compiled code.
                 */
                if (typeof module !== 'undefined') {
                    var X86ModB     = require("./x86modb");
                    var X86ModW     = require("./x86modw");
                }
            } else {
                /*
                 * These are the more general-purpose ModRM decoders, required for I386 suppport.  The current addressing
                 * mode (16-bit or 32-bit) dynamically selects the appropriate byte and word decoders.
                 */
                if (typeof module !== 'undefined') {
                    var X86ModB16   = require("./x86modb16");
                    var X86ModW16   = require("./x86modw16");
                    var X86ModB32   = require("./x86modb32");
                    var X86ModW32   = require("./x86modw32");
                    var X86ModSIB   = require("./x86modsib");
                }
            }
            
            /**
             * X86CPU(parmsCPU)
             *
             * The X86CPU class uses the following (parmsCPU) properties:
             *
             *      model: a number (eg, 8088) that should match one of the X86.MODEL values
             *
             * This extends the CPU class and passes any remaining parmsCPU properties to the CPU class
             * constructor, along with a default speed (cycles per second) based on the specified (or default)
             * CPU model number.
             *
             * The X86CPU class was initially written to simulate a 8086/8088 microprocessor, although over time
             * it has evolved to support later microprocessors (eg, the 80186/80188 and the 80286, including
             * protected-mode support).
             *
             * This is a logical simulation, not a physical simulation, and performance is critical, second only
             * to the accuracy of the simulation when running real-world x86 software.  Consequently, it takes a
             * few liberties with the operation of the simulated hardware, especially with regard to timings,
             * little-used features, etc.  We do make an effort to maintain accurate instruction cycle counts,
             * but there are many other obstacles (eg, prefetch queue, wait states) to achieving perfect timings.
             *
             * For example, our 8237 DMA controller performs all DMA transfers immediately, since internally
             * they are all memory-to-memory, and attempting to interleave DMA cycles with instruction execution
             * cycles would hurt overall performance.  Similarly, 8254 timer counters are updated only on-demand.
             *
             * The 8237 and 8254, along with the 8259 interrupt controller and several other "chips", are combined
             * into a single ChipSet component, to keep the number of components we juggle to a minimum.
             *
             * All that being said, this does not change the overall goal: to produce as accurate a simulation as
             * possible, within the limits of what JavaScript allows and how precisely/predictably it behaves.
             *
             * @constructor
             * @extends CPU
             * @param {Object} parmsCPU
             */
            function X86CPU(parmsCPU)
            {
                this.model = parmsCPU['model'] || X86.MODEL_8088;
            
                var nCyclesDefault = 0;
                switch(this.model) {
                case X86.MODEL_8088:
                default:
                    nCyclesDefault = 4772727;
                    break;
                case X86.MODEL_80286:
                    nCyclesDefault = 6000000;
                    break;
                case X86.MODEL_80386:
                    nCyclesDefault = 16000000;
                    break;
                }
            
                CPU.call(this, parmsCPU, nCyclesDefault);
            
                /*
                 * Initialize processor operation to match the requested model
                 */
                this.initProcessor();
            
                /*
                 * List of software interrupt notification functions: aIntNotify is an array, indexed by
                 * interrupt number, of 2-element sub-arrays that, in turn, contain:
                 *
                 *      [0]: registered component
                 *      [1]: registered function to call for every software interrupt
                 *
                 * The registered function is called with the linear address (LIP) following the software interrupt;
                 * if any function returns false, the software interrupt will be skipped (presumed to be emulated),
                 * and no further notification functions will be called.
                 *
                 * NOTE: Registered functions are called only for "INT N" instructions -- NOT "INT 3" or "INTO" or the
                 * "INT 0x00" generated by a divide-by-zero or any other kind of interrupt (nor any interrupt simulated
                 * with "PUSHF/CALLF").
                 *
                 * aIntReturn is a hash of return address notifications set up by software interrupt notification
                 * functions that want to receive return notifications.  A software interrupt function must call
                 * cpu.addIntReturn(fn).
                 *
                 * WARNING: There's no mechanism in place to insure that software interrupt return notifications don't
                 * get "orphaned" if an interrupt handler bypasses the normal return path (INT 0x24 is one example of an
                 * "evil" software interrupt).
                 */
                this.aIntNotify = [];
                this.aIntReturn = [];
            
                /*
                 * Since aReturnNotify is a "sparse array", this global count gives the CPU a quick way of knowing whether
                 * or not RETF or IRET instructions need to bother calling checkIntReturn().
                 */
                this.cIntReturn = 0;
            
                /*
                 * A variety of stepCPU() state variables that don't strictly need to be initialized before the first
                 * stepCPU() call, but it's good form to do so.
                 */
                this.resetCycles();
                this.aFlags.fComplete = this.aFlags.fDebugCheck = false;
            
                /*
                 * If there are no live registers to display, then updateStatus() can skip a bit....
                 */
                this.cLiveRegs = 0;
            
                /*
                 * We're just declaring aMemBlocks and associated Bus parameters here; they'll be initialized by initMemory()
                 * when the Bus is initialized.
                 */
                this.aBusBlocks = this.aMemBlocks = [];
                this.nBusMask = this.nMemMask = 0;
                this.nBlockShift = this.nBlockSize = this.nBlockLimit = this.nBlockTotal = this.nBlockMask = 0;
            
                if (SAMPLER) {
                    /*
                     * For now, we're just going to sample LIP values (well, LIP + cycle count)
                     */
                    this.nSamples = 50000;
                    this.nSampleFreq = 1000;
                    this.nSampleSkip = 0;
                    this.aSamples = new Array(this.nSamples);
                    for (var i = 0; i < this.nSamples; i++) this.aSamples[i] = -1;
                    this.iSampleNext = 0;
                    this.iSampleFreq = 0;
                    this.iSampleSkip = 0;
                }
            
                /*
                 * This initial resetRegs() call is important to create all the registers (eg, the X86Seg registers),
                 * so that if/when we call restore(), it will have something to fill in.
                 */
                this.resetRegs();
            }
            
            Component.subclass(X86CPU, CPU);
            
            X86CPU.CYCLES_8088 = {
                nWordCyclePenalty:          4,      // NOTE: accurate for the 8088/80188 only (on the 8086/80186, it applies to odd addresses only)
                nEACyclesBase:              5,      // base or index only (BX, BP, SI or DI)
                nEACyclesDisp:              6,      // displacement only
                nEACyclesBaseIndex:         7,      // base + index (BP+DI and BX+SI)
                nEACyclesBaseIndexExtra:    8,      // base + index (BP+SI and BX+DI require an extra cycle)
                nEACyclesBaseDisp:          9,      // base or index + displacement
                nEACyclesBaseIndexDisp:     11,     // base + index + displacement (BP+DI+n and BX+SI+n)
                nEACyclesBaseIndexDispExtra:12,     // base + index + displacement (BP+SI+n and BX+DI+n require an extra cycle)
                nOpCyclesAAA:               4,      // AAA, AAS, DAA, DAS, TEST acc,imm
                nOpCyclesAAD:               60,
                nOpCyclesAAM:               83,
                nOpCyclesArithRR:           3,      // ADC, ADD, AND, OR, SBB, SUB, XOR and CMP reg,reg cycle time
                nOpCyclesArithRM:           9,      // ADC, ADD, AND, OR, SBB, SUB, and XOR reg,mem (and CMP mem,reg) cycle time
                nOpCyclesArithMR:           16,     // ADC, ADD, AND, OR, SBB, SUB, and XOR mem,reg cycle time
                nOpCyclesArithMID:          1,      // ADC, ADD, AND, OR, SBB, SUB, XOR and CMP mem,imm cycle delta
                nOpCyclesCall:              19,
                nOpCyclesCallF:             28,
                nOpCyclesCallWR:            16,
                nOpCyclesCallWM:            21,
                nOpCyclesCallDM:            37,
                nOpCyclesCLI:               2,
                nOpCyclesCompareRM:         9,      // CMP reg,mem cycle time (same as nOpCyclesArithRM on an 8086 but not on a 80286)
                nOpCyclesCWD:               5,
                nOpCyclesBound:             33,     // N/A if 8086/8088, 33-35 if 80186/80188 (TODO: Determine what the range means for an 80186/80188)
                nOpCyclesInP:               10,
                nOpCyclesInDX:              8,
                nOpCyclesIncR:              3,      // INC reg, DEC reg
                nOpCyclesIncM:              15,     // INC mem, DEC mem
                nOpCyclesInt:               51,
                nOpCyclesInt3D:             1,
                nOpCyclesIntOD:             2,
                nOpCyclesIntOFall:          4,
                nOpCyclesIRet:              32,
                nOpCyclesJmp:               15,
                nOpCyclesJmpF:              15,
                nOpCyclesJmpC:              16,
                nOpCyclesJmpCFall:          4,
                nOpCyclesJmpWR:             11,
                nOpCyclesJmpWM:             18,
                nOpCyclesJmpDM:             24,
                nOpCyclesLAHF:              4,      // LAHF, SAHF, MOV reg,imm
                nOpCyclesLEA:               2,
                nOpCyclesLS:                16,     // LDS, LES
                nOpCyclesLoop:              17,     // LOOP, LOOPNZ
                nOpCyclesLoopZ:             18,     // LOOPZ, JCXZ
                nOpCyclesLoopNZ:            19,     // LOOPNZ
                nOpCyclesLoopFall:          5,      // LOOP
                nOpCyclesLoopZFall:         6,      // LOOPZ, JCXZ
                nOpCyclesMovRR:             2,
                nOpCyclesMovRM:             8,
                nOpCyclesMovMR:             9,
                nOpCyclesMovRI:             10,
                nOpCyclesMovMI:             10,
                nOpCyclesMovAM:             10,
                nOpCyclesMovMA:             10,
                nOpCyclesDivBR:             80,     // range of 80-90
                nOpCyclesDivWR:             144,    // range of 144-162
                nOpCyclesDivBM:             86,     // range of 86-96
                nOpCyclesDivWM:             154,    // range of 154-172
                nOpCyclesIDivBR:            101,    // range of 101-112
                nOpCyclesIDivWR:            165,    // range of 165-184
                nOpCyclesIDivBM:            107,    // range of 107-118
                nOpCyclesIDivWM:            171,    // range of 171-190
                nOpCyclesMulBR:             70,     // range of 70-77
                nOpCyclesMulWR:             113,    // range of 113-118
                nOpCyclesMulBM:             76,     // range of 76-83
                nOpCyclesMulWM:             124,    // range of 124-139
                nOpCyclesIMulBR:            80,     // range of 80-98
                nOpCyclesIMulWR:            128,    // range of 128-154
                nOpCyclesIMulBM:            86,     // range of 86-104
                nOpCyclesIMulWM:            134,    // range of 134-160
                nOpCyclesNegR:              3,      // NEG reg, NOT reg
                nOpCyclesNegM:              16,     // NEG mem, NOT mem
                nOpCyclesOutP:              10,
                nOpCyclesOutDX:             8,
                nOpCyclesPopAll:            51,     // N/A if 8086/8088, 51 if 80186, 83 if 80188 (TODO: Verify)
                nOpCyclesPopReg:            8,
                nOpCyclesPopMem:            17,
                nOpCyclesPushAll:           36,     // N/A if 8086/8088, 36 if 80186, 68 if 80188 (TODO: Verify)
                nOpCyclesPushReg:           11,     // NOTE: "The 8086 Book" claims this is 10, but it's an outlier....
                nOpCyclesPushMem:           16,
                nOpCyclesPushSeg:           10,
                nOpCyclesPrefix:            2,
                nOpCyclesCmpS:              18,
                nOpCyclesCmpSr0:            9-2,    // reduced by nOpCyclesPrefix
                nOpCyclesCmpSrn:            17-2,   // reduced by nOpCyclesPrefix
                nOpCyclesLodS:              12,
                nOpCyclesLodSr0:            9-2,    // reduced by nOpCyclesPrefix
                nOpCyclesLodSrn:            13-2,   // reduced by nOpCyclesPrefix
                nOpCyclesMovS:              18,
                nOpCyclesMovSr0:            9-2,    // reduced by nOpCyclesPrefix
                nOpCyclesMovSrn:            17-2,   // reduced by nOpCyclesPrefix
                nOpCyclesScaS:              15,
                nOpCyclesScaSr0:            9-2,    // reduced by nOpCyclesPrefix
                nOpCyclesScaSrn:            15-2,   // reduced by nOpCyclesPrefix
                nOpCyclesStoS:              11,
                nOpCyclesStoSr0:            9-2,    // reduced by nOpCyclesPrefix
                nOpCyclesStoSrn:            10-2,   // reduced by nOpCyclesPrefix
                nOpCyclesRet:               8,
                nOpCyclesRetn:              12,
                nOpCyclesRetF:              18,
                nOpCyclesRetFn:             17,
                nOpCyclesShift1M:           15,     // ROL/ROR/RCL/RCR/SHL/SHR/SAR reg,1
                nOpCyclesShiftCR:           8,      // ROL/ROR/RCL/RCR/SHL/SHR/SAR reg,CL
                nOpCyclesShiftCM:           20,     // ROL/ROR/RCL/RCR/SHL/SHR/SAR mem,CL
                nOpCyclesShiftCS:           2,      // this is the left-shift value used to convert the count to the cycle cost
                nOpCyclesTestRR:            3,
                nOpCyclesTestRM:            9,
                nOpCyclesTestRI:            5,
                nOpCyclesTestMI:            11,
                nOpCyclesXchgRR:            4,
                nOpCyclesXchgRM:            17,
                nOpCyclesXLAT:              11
            };
            
            X86CPU.CYCLES_80286 = {
                nWordCyclePenalty:          0,
                nEACyclesBase:              0,
                nEACyclesDisp:              0,
                nEACyclesBaseIndex:         0,
                nEACyclesBaseIndexExtra:    0,
                nEACyclesBaseDisp:          0,
                nEACyclesBaseIndexDisp:     1,
                nEACyclesBaseIndexDispExtra:1,
                nOpCyclesAAA:               3,
                nOpCyclesAAD:               14,
                nOpCyclesAAM:               16,
                nOpCyclesArithRR:           2,
                nOpCyclesArithRM:           7,
                nOpCyclesArithMR:           7,
                nOpCyclesArithMID:          0,
                nOpCyclesCall:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallF:             13,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallWR:            7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallWM:            11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallDM:            16,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCLI:               3,
                nOpCyclesCompareRM:         6,
                nOpCyclesCWD:               2,
                nOpCyclesBound:             13,
                nOpCyclesInP:               5,
                nOpCyclesInDX:              5,
                nOpCyclesIncR:              2,
                nOpCyclesIncM:              7,
                nOpCyclesInt:               23,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesInt3D:             0,
                nOpCyclesIntOD:             1,
                nOpCyclesIntOFall:          3,
                nOpCyclesIRet:              17,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmp:               7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpF:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpC:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpCFall:          3,
                nOpCyclesJmpWR:             7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpWM:             11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpDM:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLAHF:              2,
                nOpCyclesLEA:               3,
                nOpCyclesLS:                7,
                nOpCyclesLoop:              8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLoopZ:             8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLoopNZ:            8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLoopFall:          4,
                nOpCyclesLoopZFall:         4,
                nOpCyclesMovRR:             2,      // this is actually the same as the 8086...
                nOpCyclesMovRM:             3,
                nOpCyclesMovMR:             5,
                nOpCyclesMovRI:             2,
                nOpCyclesMovMI:             3,
                nOpCyclesMovAM:             5,      // this is actually slower than the MOD/RM form of MOV AX,mem (see nOpCyclesMovRM)
                nOpCyclesMovMA:             3,
                nOpCyclesDivBR:             14,
                nOpCyclesDivWR:             22,
                nOpCyclesDivBM:             17,
                nOpCyclesDivWM:             25,
                nOpCyclesIDivBR:            17,
                nOpCyclesIDivWR:            25,
                nOpCyclesIDivBM:            20,
                nOpCyclesIDivWM:            28,
                nOpCyclesMulBR:             13,
                nOpCyclesMulWR:             21,
                nOpCyclesMulBM:             16,
                nOpCyclesMulWM:             24,
                nOpCyclesIMulBR:            13,
                nOpCyclesIMulWR:            21,
                nOpCyclesIMulBM:            16,
                nOpCyclesIMulWM:            24,
                nOpCyclesNegR:              2,
                nOpCyclesNegM:              7,
                nOpCyclesOutP:              5,
                nOpCyclesOutDX:             5,
                nOpCyclesPopAll:            19,
                nOpCyclesPopReg:            5,
                nOpCyclesPopMem:            5,
                nOpCyclesPushAll:           17,
                nOpCyclesPushReg:           3,
                nOpCyclesPushMem:           5,
                nOpCyclesPushSeg:           3,
                nOpCyclesPrefix:            0,
                nOpCyclesCmpS:              8,
                nOpCyclesCmpSr0:            5,
                nOpCyclesCmpSrn:            9,
                nOpCyclesLodS:              5,
                nOpCyclesLodSr0:            5,
                nOpCyclesLodSrn:            4,
                nOpCyclesMovS:              5,
                nOpCyclesMovSr0:            5,
                nOpCyclesMovSrn:            4,
                nOpCyclesScaS:              7,
                nOpCyclesScaSr0:            5,
                nOpCyclesScaSrn:            8,
                nOpCyclesStoS:              3,
                nOpCyclesStoSr0:            4,
                nOpCyclesStoSrn:            3,
                nOpCyclesRet:               11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesRetn:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesRetF:              15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesRetFn:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesShift1M:           7,
                nOpCyclesShiftCR:           5,
                nOpCyclesShiftCM:           8,
                nOpCyclesShiftCS:           0,
                nOpCyclesTestRR:            2,
                nOpCyclesTestRM:            6,
                nOpCyclesTestRI:            3,
                nOpCyclesTestMI:            6,
                nOpCyclesXchgRR:            3,
                nOpCyclesXchgRM:            5,
                nOpCyclesXLAT:              5
            };
            
            /*
             * TODO: Except for the cycle counts at the end of this table (ie, those marked "unique to the 80386"), all these
             * values were simply copied from the 80286 table and still need to be modified and verified.
             */
            X86CPU.CYCLES_80386 = {
                nWordCyclePenalty:          0,
                nEACyclesBase:              0,
                nEACyclesDisp:              0,
                nEACyclesBaseIndex:         0,
                nEACyclesBaseIndexExtra:    0,
                nEACyclesBaseDisp:          0,
                nEACyclesBaseIndexDisp:     1,
                nEACyclesBaseIndexDispExtra:1,
                nOpCyclesAAA:               3,
                nOpCyclesAAD:               14,
                nOpCyclesAAM:               16,
                nOpCyclesArithRR:           2,
                nOpCyclesArithRM:           7,
                nOpCyclesArithMR:           7,
                nOpCyclesArithMID:          0,
                nOpCyclesCall:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallF:             13,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallWR:            7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallWM:            11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCallDM:            16,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesCLI:               3,
                nOpCyclesCompareRM:         6,
                nOpCyclesCWD:               2,
                nOpCyclesBound:             13,
                nOpCyclesInP:               5,
                nOpCyclesInDX:              5,
                nOpCyclesIncR:              2,
                nOpCyclesIncM:              7,
                nOpCyclesInt:               23,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesInt3D:             0,
                nOpCyclesIntOD:             1,
                nOpCyclesIntOFall:          3,
                nOpCyclesIRet:              17,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmp:               7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpF:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpC:              7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpCFall:          3,
                nOpCyclesJmpWR:             7,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpWM:             11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesJmpDM:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLAHF:              2,
                nOpCyclesLEA:               3,
                nOpCyclesLS:                7,
                nOpCyclesLoop:              8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLoopZ:             8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLoopNZ:            8,      // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesLoopFall:          4,
                nOpCyclesLoopZFall:         4,
                nOpCyclesMovRR:             2,      // this is actually the same as the 8086...
                nOpCyclesMovRM:             3,
                nOpCyclesMovMR:             5,
                nOpCyclesMovRI:             2,
                nOpCyclesMovMI:             3,
                nOpCyclesMovAM:             5,      // this is actually slower than the MOD/RM form of MOV AX,mem (see nOpCyclesMovRM)
                nOpCyclesMovMA:             3,
                nOpCyclesDivBR:             14,
                nOpCyclesDivWR:             22,
                nOpCyclesDivBM:             17,
                nOpCyclesDivWM:             25,
                nOpCyclesIDivBR:            17,
                nOpCyclesIDivWR:            25,
                nOpCyclesIDivBM:            20,
                nOpCyclesIDivWM:            28,
                nOpCyclesMulBR:             13,
                nOpCyclesMulWR:             21,
                nOpCyclesMulBM:             16,
                nOpCyclesMulWM:             24,
                nOpCyclesIMulBR:            13,
                nOpCyclesIMulWR:            21,
                nOpCyclesIMulBM:            16,
                nOpCyclesIMulWM:            24,
                nOpCyclesNegR:              2,
                nOpCyclesNegM:              7,
                nOpCyclesOutP:              5,
                nOpCyclesOutDX:             5,
                nOpCyclesPopAll:            19,
                nOpCyclesPopReg:            5,
                nOpCyclesPopMem:            5,
                nOpCyclesPushAll:           17,
                nOpCyclesPushReg:           3,
                nOpCyclesPushMem:           5,
                nOpCyclesPushSeg:           3,
                nOpCyclesPrefix:            0,
                nOpCyclesCmpS:              8,
                nOpCyclesCmpSr0:            5,
                nOpCyclesCmpSrn:            9,
                nOpCyclesLodS:              5,
                nOpCyclesLodSr0:            5,
                nOpCyclesLodSrn:            4,
                nOpCyclesMovS:              5,
                nOpCyclesMovSr0:            5,
                nOpCyclesMovSrn:            4,
                nOpCyclesScaS:              7,
                nOpCyclesScaSr0:            5,
                nOpCyclesScaSrn:            8,
                nOpCyclesStoS:              3,
                nOpCyclesStoSr0:            4,
                nOpCyclesStoSrn:            3,
                nOpCyclesRet:               11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesRetn:              11,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesRetF:              15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesRetFn:             15,     // on the 80286, this ALSO includes the number of bytes in the target instruction
                nOpCyclesShift1M:           7,
                nOpCyclesShiftCR:           5,
                nOpCyclesShiftCM:           8,
                nOpCyclesShiftCS:           0,
                nOpCyclesTestRR:            2,
                nOpCyclesTestRM:            6,
                nOpCyclesTestRI:            3,
                nOpCyclesTestMI:            6,
                nOpCyclesXchgRR:            3,
                nOpCyclesXchgRM:            5,
                nOpCyclesXLAT:              5,
                /*
                 * Cycle counts unique to the 80386
                 */
                nOpCyclesBitScan:           11,
                nOpCyclesBitSetR:           6,
                nOpCyclesBitSetM:           8,
                nOpCyclesBitSetMExtra:      5,      // extra cycle cost for non-immediate BTC/BTR/BTS opcodes
                nOpCyclesBitTestR:          3,
                nOpCyclesBitTestM:          6,
                nOpCyclesBitTestMExtra:     6,      // extra cycle cost for non-immediate BT opcode
                nOpCyclesIMulR:             9,
                nOpCyclesIMulM:             12,
                nOpCyclesMovXR:             3,
                nOpCyclesMovXM:             6,
                nOpCyclesSetR:              4,
                nOpCyclesSetM:              5,
                nOpCyclesShiftDR:           3,
                nOpCyclesShiftDM:           7
            };
            
            /**
             * Memory Simulation Notes
             *
             * Memory accesses are currently hard-coded to simulate 8088 characteristics.
             * For example, every 16-bit memory access is assumed to require an additional 4 cycles
             * for the upper byte; on an 8086, that would be true only when the memory address was odd.
             *
             * Similarly, the effective prefetch queue size is 4 bytes (same as an 8088), although
             * that can easily be changed to 6 bytes if/when we decide to fully implement 8086 support
             * (see X86CPU.PREFETCH.QUEUE).  It's just not clear whether that support will be a goal.
             */
            X86CPU.PREFETCH = {
                QUEUE:      4,
                ARRAY:      8,              // smallest power-of-two > PREFETCH.QUEUE
                MASK:       0x7             // (X86CPU.PREFETCH.ARRAY - 1)
            };
            
            /**
             * initMemory(aMemBlocks, nBlockShift)
             *
             * Notification from Bus.initMemory(), giving us direct access to the entire memory space
             * (aMemBlocks).
             *
             * We also initialize an instruction byte prefetch queue, aPrefetch, which is an N-element
             * array with slots that look like:
             *
             *      0:  [tag, b]    <-- iPrefetchTail
             *      1:  [tag, b]
             *      2:  [ -1, 0]    <-- iPrefetchHead  (eg, when cbPrefetchQueued == 2)
             *      ...
             *      7:  [ -1, 0]
             *
             * where tag is the linear address of the byte that's been prefetched, and b is the
             * value of the byte.  N is currently 8 (PREFETCH.ARRAY), but it can be any power-of-two
             * that is equal to or greater than (PREFETCH.QUEUE), the effective size of the prefetch
             * queue (6 on an 8086, 4 on an 8088; currently hard-coded to the latter).  All slots
             * are initialized to [-1, 0] when preallocating the prefetch queue, but those initial
             * values are quickly overwritten and never seen again.
             *
             * iPrefetchTail is the index (0-7) of the next prefetched byte to be returned to the CPU,
             * and iPrefetchHead is the index (0-7) of the next slot to be filled.  The prefetch queue
             * is empty IFF the two indexes are equal and IFF cbPrefetchQueued is zero. cbPrefetchQueued
             * is simply the number of bytes between the tail and the head (from 0 to PREFETCH.QUEUE).
             *
             * cbPrefetchValid indicates how many bytes behind iPrefetchHead are still valid, allowing us
             * to "rewind" the tail up to that many bytes.  For example, let's imagine that we prefetched
             * 2 bytes, and then we immediately consumed both bytes, leaving iPrefetchTail == iPrefetchHead
             * again; however, those previous 2 bytes are still valid, and if, for example, we wanted to
             * rewind the IP by 2 (which we might want to do in the case of a repeated string instruction),
             * we could rewind the prefetch queue tail as well.
             *
             * Corresponding to iPrefetchHead is addrPrefetchHead; both are incremented in lock-step.
             * Whenever the prefetch queue is flushed, it's typically because a new, non-incremental
             * regLIP has been set, so flushPrefetch() expects to receive that address.
             *
             * If the prefetch queue does not contain any (or enough) bytes to satisfy a getBytePrefetch()
             * or getShortPrefetch() request, we force the queue to be filled with the necessary number
             * of bytes first.
             *
             * @this {X86CPU}
             * @param {Array} aMemBlocks
             * @param {number} nBlockShift
             */
            X86CPU.prototype.initMemory = function(aMemBlocks, nBlockShift)
            {
                /*
                 * aBusBlocks preserves the Bus block array for the life of the machine, whereas aMemBlocks
                 * will be altered if/when the CPU enables paging.  PAGEBLOCKS must be true when using Memory
                 * blocks to simulate paging, ensuring that physical blocks and pages have the same size (4Kb).
                 */
                this.aBusBlocks = aMemBlocks;
                this.aMemBlocks = aMemBlocks;
                this.nBlockShift = nBlockShift;
                this.nBlockSize = 1 << this.nBlockShift;
                this.nBlockLimit = this.nBlockSize - 1;
                this.nBlockTotal = aMemBlocks.length;
                this.nBlockMask = this.nBlockTotal - 1;
                if (PREFETCH) {
                    this.nBusCycles = 0;
                    this.aPrefetch = new Array(X86CPU.PREFETCH.ARRAY);
                    for (var i = 0; i < X86CPU.PREFETCH.ARRAY; i++) {
                        this.aPrefetch[i] = 0;
                    }
                    this.flushPrefetch(0);
                }
            };
            
            /**
             * setAddressMask(nBusMask)
             *
             * Notification from Bus.initMemory() and Bus.setA20(); the latter calls us whenever the physical
             * A20 line changes (note that on a 20-bit bus machine, address lines A20 and higher are always zero).
             *
             * For 32-bit bus machines (eg, 80386), nBusMask is never changed after the initial call, because A20
             * wrap-around is simulated by changing the physical memory map rather than altering the A20 bit in nBusMask.
             *
             * We maintain nMemMask separate from nBusMask, because when paging is enabled on the 80386, the CPU memory
             * functions are now dealing with linear addresses rather than physical addresses, so it would be incorrect
             * to apply nBusMask to those addresses; nMemMask must remain 0xffffffff (-1) for the duration.  If we change
             * how A20 is simulated on the 80386, then enablePageBlocks() and disablePageBlocks() will need to override
             * nMemMask appropriately.
             *
             * TODO: Ideally, we would eliminate masking altogether of 32-bit addresses, but that would require different
             * sets of memory access functions for different machines (ie, those with 20-bit or 24-bit buses).
             *
             * @this {X86CPU}
             * @param {number} nBusMask
             */
            X86CPU.prototype.setAddressMask = function(nBusMask)
            {
                this.nBusMask = this.nMemMask = nBusMask;
            };
            
            /**
             * enablePageBlocks()
             *
             * Whenever the CPU turns on paging and/or updates CR3, this function is called to update our copy
             * of the Bus block array, to simulate paging.  Whenever the CPU turns paging off, disablePageBlocks()
             * must be called to restore our copy of the Bus block array to its original (physical) mapping.
             *
             * This also requires PAGEBLOCKS be enabled, ensuring that the Bus is configured with a 4Kb block size.
             *
             * The first time this function is called, aMemBlocks and aBusBlocks are identical, so aMemBlocks is
             * reinitialized with special UNPAGED Memory blocks that know how to perform page directory/page table
             * lookup and replace themselves with special PAGED Memory blocks that reference memory from the
             * appropriate block in aBusBlocks.  A parallel array, aBlocksPaged, keeps track (by block number) of
             * which blocks have been PAGED, so that whenever CR3 is updated, those blocks can be quickly UNPAGED.
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.enablePageBlocks = function()
            {
                if (!PAGEBLOCKS) {
                    this.setError("PAGEBLOCK support required");
                    return;
                }
                if (this.aMemBlocks === this.aBusBlocks) {
                    this.aMemBlocks = new Array(this.nBlockTotal);
                    this.blockUnpaged = new Memory(null, 0, 0, Memory.TYPE.UNPAGED, null, this);
                    for (var iBlock = 0; iBlock < this.nBlockTotal; iBlock++) {
                        this.aMemBlocks[iBlock] = this.blockUnpaged;
                    }
                } else {
                    for (var i = 0; i < this.aBlocksPaged.length; i++) {
                        this.aMemBlocks[this.aBlocksPaged[i]] = this.blockUnpaged;
                    }
                }
                this.aBlocksPaged = [];
            };
            
            /**
             * mapPageBlock(addr, fWrite)
             *
             * Locate the corresponding physical PDE, PTE and memory blocks for the given linear address, and then
             * upgrade the block from an UNPAGED Memory block to a new PAGED Memory block; all future accesses to
             * the current page will go directly to that block, instead of coming here through the UNPAGED block
             * handlers.
             *
             * Note that since the incoming address (addr) is a linear address, we never need to mask it with nBusMask,
             * but all the intermediate (PDE, PTE) and final physical addresses we calculate should still be masked.
             *
             * Granted, nBusMask on a 32-bit bus is generally going to be 0xffffffff (-1), so making might seem like
             * a waste of time; however, if we decide to once again rely on nBusMask for emulating A20 wrap-around
             * (instead of changing the physical memory map to alias the 2nd Mb to the 1st Mb), then performing
             * consistent masking will be important.
             *
             * Also, addrPDE, addrPTE and addrPhys do not need any offsets added to them, because we immediately shift
             * the offset portion of those addresses out.  But for now, at least for debugging and documentation purposes,
             * my preference is to perform full address calculations.
             *
             * Besides, this should not be a performance-critical function; it's normally called only once per UNPAGED
             * page.  Obviously, if CR3 is constantly being updated, that will trigger repeated calls to enablePageBlocks(),
             * which will perform our equivalent of a TLB flush (ie, resetting all PAGED blocks back to UNPAGED blocks).
             * That would hurt our performance, but it would hurt performance on a real machine as well, so let's see
             * what real-world scenarios we run into.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @param {boolean} fWrite (true if called for a write, false if for a read)
             * @param {boolean} [fSuppress] (true if any faults, remapping, etc should be suppressed)
             * @return {Memory|null}
             */
            X86CPU.prototype.mapPageBlock = function(addr, fWrite, fSuppress)
            {
                var offPDE = (addr & X86.LADDR.PDE.MASK) >>> X86.LADDR.PDE.SHIFT;
                var addrPDE = this.regCR3 + offPDE;
            
                /*
                 * bus.getLong(addrPDE) would be simpler, but setPhysBlock() needs to know blockPDE and offPDE, too.
                 * TODO: Since we're immediately shifting addrPDE by nBlockShift, then we could also skip adding offPDE.
                 */
                var blockPDE = this.aBusBlocks[(addrPDE & this.nBusMask) >>> this.nBlockShift];
                var pde = blockPDE.readLong(offPDE);
            
                if (!(pde & X86.PTE.PRESENT)) {
                    if (!fSuppress) X86.fnPageFault.call(this, addr, false, fWrite);
                    return null;
                }
            
                if (!(pde & X86.PTE.USER) && this.segCS.cpl == 3) {
                    if (!fSuppress) X86.fnPageFault.call(this, addr, true, fWrite);
                    return null;
                }
            
                var offPTE = (addr & X86.LADDR.PTE.MASK) >>> X86.LADDR.PTE.SHIFT;
                var addrPTE = (pde & X86.PTE.FRAME) + offPTE;
            
                /*
                 * bus.getLong(addrPTE) would be simpler, but setPhysBlock() needs to know blockPTE and offPTE, too.
                 * TODO: Since we're immediately shifting addrPDE by nBlockShift, then we could also skip adding offPTE.
                 */
                var blockPTE = this.aBusBlocks[(addrPTE & this.nBusMask) >>> this.nBlockShift];
                var pte = blockPTE.readLong(offPTE);
            
                if (!(pte & X86.PTE.PRESENT) && !fSuppress) {
                    if (!fSuppress) X86.fnPageFault.call(this, addr, false, fWrite);
                    return null;
                }
            
                if (!(pte & X86.PTE.USER) && this.segCS.cpl == 3) {
                    if (!fSuppress) X86.fnPageFault.call(this, addr, true, fWrite);
                    return null;
                }
            
                var addrPhys = (pte & X86.PTE.FRAME) + (addr & X86.LADDR.OFFSET);
                /*
                 * TODO: Since we're immediately shifting addrPhys by nBlockShift, we could also skip adding the addr's offset.
                 */
                var blockPhys = this.aBusBlocks[(addrPhys & this.nBusMask) >>> this.nBlockShift];
                if (fSuppress) return blockPhys;
            
                /*
                 * So we have the block containing the physical memory corresponding to the given linear address.
                 *
                 * Now we can create a new PAGED Memory block and record the physical block info using setPhysBlock().
                 */
                var addrPage = addr & ~X86.LADDR.OFFSET;
                var blockPage = new Memory(addrPage, 0, 0, Memory.TYPE.PAGED);
                blockPage.setPhysBlock(blockPhys, blockPDE, offPDE, blockPTE, offPTE);
            
                var iBlock = addr >>> this.nBlockShift;
                this.aMemBlocks[iBlock] = blockPage;
                this.aBlocksPaged.push(iBlock);
                return blockPage;
            };
            
            /**
             * disablePageBlocks()
             *
             * Whenever the CPU turns off paging, this function restores the CPU's original aMemBlocks.
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.disablePageBlocks = function()
            {
                if (this.aMemBlocks != this.aBusBlocks) {
                    this.aMemBlocks = this.aBusBlocks;
                    this.blockUnpaged = null;
                    this.aBlocksPaged = null;
                }
            };
            
            /**
             * initProcessor()
             *
             * This isolates 80186/80188/80286/80386 support, so that it can be selectively enabled/tested.
             *
             * Here's a summary of 80186/80188 differences according to "AP-186: Introduction to the 80186
             * Microprocessor, March 1983" (pp.55-56).  "The iAPX 86,88 and iAPX 186,188 User's Manual Programmer's
             * Reference", p.3-38, apparently contains the same information, but I've not seen that document.
             *
             * Undefined [Invalid] Opcodes:
             *
             *      When the opcodes 63H, 64H, 65H, 66H, 67H, F1H, FEH/xx111xxxB and FFH/xx111xxxB are executed,
             *      the 80186 will execute an illegal [invalid] instruction exception, interrupt 0x06.
             *      The 8086 will ignore the opcode.
             *
             * 0FH opcode:
             *
             *      When the opcode 0FH is encountered, the 8086 will execute a POP CS, while the 80186 will
             *      execute an illegal [invalid] instruction exception, interrupt 0x06.
             *
             * Word Write at Offset FFFFH:
             *
             *      When a word write is performed at offset FFFFH in a segment, the 8086 will write one byte
             *      at offset FFFFH, and the other at offset 0, while the 80186 will write one byte at offset
             *      FFFFH, and the other at offset 10000H (one byte beyond the end of the segment). One byte segment
             *      underflow will also occur (on the 80186) if a stack PUSH is executed and the Stack Pointer
             *      contains the value 1.
             *
             * Shift/Rotate by Value Greater Then [sic] 31:
             *
             *      Before the 80186 performs a shift or rotate by a value (either in the CL register, or by an
             *      immediate value) it ANDs the value with 1FH, limiting the number of bits rotated to less than 32.
             *      The 8086 does not do this.
             *
             * LOCK prefix:
             *
             *      The 8086 activates its LOCK signal immediately after executing the LOCK prefix. The 80186 does
             *      not activate the LOCK signal until the processor is ready to begin the data cycles associated
             *      with the LOCKed instruction.
             *
             * Interrupted String Move Instructions:
             *
             *      If an 8086 is interrupted during the execution of a repeated string move instruction, the return
             *      value it will push on the stack will point to the last prefix instruction before the string move
             *      instruction. If the instruction had more than one prefix (e.g., a segment override prefix in
             *      addition to the repeat prefix), it will not be re-executed upon returning from the interrupt.
             *      The 80186 will push the value of the first prefix to the repeated instruction, so long as prefixes
             *      are not repeated, allowing the string instruction to properly resume.
             *
             * Conditions causing divide error with an integer divide:
             *
             *      The 8086 will cause a divide error whenever the absolute value of the quotient is greater then
             *      [sic] 7FFFH (for word operations) or if the absolute value of the quotient is greater than 7FH
             *      (for byte operations). The 80186 has expanded the range of negative numbers allowed as a quotient
             *      by 1 to include 8000H and 80H. These numbers represent the most negative numbers representable
             *      using 2's complement arithmetic (equaling -32768 and -128 in decimal, respectively).
             *
             * ESC Opcode:
             *
             *      The 80186 may be programmed to cause an interrupt type 7 whenever an ESCape instruction (used for
             *      co-processors like the 8087) is executed. The 8086 has no such provision. Before the 80186 performs
             *      this trap, it must be programmed to do so. [The details of this "programming" are not included.]
             *
             * Here's a summary of 80286 differences according to "80286 and 80287 Programmer's Reference Manual",
             * Appendix C, p.C-1 (p.329):
             *
             *   1. Add Six Interrupt Vectors
             *
             *      The 80286 adds six interrupts which arise only if the 8086 program has a hidden bug. These interrupts
             *      occur only for instructions which were undefined on the 8086/8088 or if a segment wraparound is attempted.
             *      It is recommended that you add an interrupt handler to the 8086 software that is to be run on the 80286,
             *      which will treat these interrupts as invalid operations.
             *
             *      This additional software does not significantly effect the existing 8086 software because the interrupts
             *      do not normally occur and should not already have been used since they are in the interrupt group reserved
             *      by Intel. [Note to Intel: IBM caaaaaaan't hear you].
             *
             *   2. Do not Rely on 8086/8088 Instruction Clock Counts
             *
             *      The 80286 takes fewer clocks for most instructions than the 8086/8088. The areas to look into are delays
             *      between I/0 operations, and assumed delays in 8086/8088 operating in parallel with an 8087.
             *
             *   3. Divide Exceptions Point at the DIV Instruction
             *
             *      Any interrupt on the 80286 will always leave the saved CS:IP value pointing at the beginning of the
             *      instruction that failed (including prefixes). On the 8086, the CS:IP value saved for a divide exception
             *      points at the next instruction.
             *
             *   4. Use Interrupt 16 (0x10) for Numeric Exceptions
             *
             *      Any 80287 system must use interrupt vector 16 for the numeric error interrupt. If an 8086/8087 or 8088/8087
             *      system uses another vector for the 8087 interrupt, both vectors should point at the numeric error interrupt
             *      handler.
             *
             *   5. Numeric Exception Handlers Should allow Prefixes
             *
             *      The saved CS:IP value in the NPX environment save area will point at any leading prefixes before an ESC
             *      instruction. On 8086/8088 systems, this value points only at the ESC instruction.
             *
             *   6. Do Not Attempt Undefined 8086/8088 Operations
             *
             *      Instructions like POP CS or MOV CS,op will either cause exception 6 (undefined [invalid] opcode) or perform
             *      a protection setup operation like LIDT on the 80286. Undefined bit encodings for bits 5-3 of the second byte
             *      of POP MEM or PUSH MEM will cause exception 13 on the 80286.
             *
             *   7. Place a Far JMP Instruction at FFFF0H
             *
             *      After reset, CS:IP = F000:FFF0 on the 80286 (versus FFFF:0000 on the 8086/8088). This change was made to allow
             *      sufficient code space to enter protected mode without reloading CS. Placing a far JMP instruction at FFFF0H
             *      will avoid this difference. Note that the BOOTSTRAP option of LOC86 will automatically generate this jump
             *      instruction.
             *
             *   8. Do not Rely on the Value Written by PUSH SP
             *
             *      The 80286 will push a different value on the stack for PUSH SP than the 8086/8088. If the value pushed is
             *      important [and when would it NOT be???], replace PUSH SP instructions with the following three instructions:
             *
             *          PUSH    BP
             *          MOV     BP,SP
             *          XCHG    BP,[BP]
             *
             *      This code functions as the 8086/8088 PUSH SP instruction on the 80286.
             *
             *   9. Do not Shift or Rotate by More than 31 Bits
             *
             *      The 80286 masks all shift/rotate counts to the low 5 bits. This MOD 32 operation limits the count to a maximum
             *      of 31 bits. With this change, the longest shift/rotate instruction is 39 clocks. Without this change, the longest
             *      shift/rotate instruction would be 264 clocks, which delays interrupt response until the instruction completes
             *      execution.
             *
             *  10. Do not Duplicate Prefixes
             *
             *      The 80286 sets an instruction length limit of 10 bytes. The only way to violate this limit is by duplicating
             *      a prefix two or more times before an instruction. Exception 6 occurs if the instruction length limit is violated.
             *      The 8086/8088 has no instruction length limit.
             *
             *  11. Do not Rely on Odd 8086/8088 LOCK Characteristics
             *
             *      The LOCK prefix and its corresponding output signal should only be used to prevent other bus masters from
             *      interrupting a data movement operation. The 80286 will always assert LOCK during an XCHG instruction with memory
             *      (even if the LOCK prefix was not used). LOCK should only be used with the XCHG, MOV, MOVS, INS, and OUTS instructions.
             *
             *      The 80286 LOCK signal will not go active during an instruction prefetch.
             *
             *  12. Do not Single Step External Interrupt Handlers
             *
             *      The priority of the 80286 single step interrupt is different from that of the 8086/8088. This change was made
             *      to prevent an external interrupt from being single-stepped if it occurs while single stepping through a program.
             *      The 80286 single step interrupt has higher priority than any external interrupt.
             *
             *      The 80286 will still single step through an interrupt handler invoked by INT instructions or an instruction
             *      exception.
             *
             *  13. Do not Rely on IDIV Exceptions for Quotients of 80H or 8000H
             *
             *      The 80286 can generate the largest negative number as a quotient for IDIV instructions. The 8086 will instead
             *      cause exception O.
             *
             *  14. Do not Rely on NMI Interrupting NMI Handlers
             *
             *      After an NMI is recognized, the NMI input and processor extension limit error interrupt is masked until the
             *      first IRET instruction is executed.
             *
             *  15. The NPX error signal does not pass through an interrupt controller (an 8087 INT signal does). Any interrupt
             *      controller-oriented instructions for the 8087 may have to be deleted.
             *
             *  16. If any real-mode program relies on address space wrap-around (e.g., FFF0:0400=0000:0300), then external hardware
             *      should be used to force the upper 4 addresses to zero during real mode.
             *
             *  17. Do not use I/O ports 00F8-00FFH. These are reserved for controlling 80287 and future processor extensions.
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.initProcessor = function()
            {
                this.PS_SET = X86.PS_SET_8086;
                this.PS_DIRECT = X86.PS_DIRECT_8086;
            
                this.OPFLAG_NOINTR_8086 = X86.OPFLAG.NOINTR;
                this.nShiftCountMask = 0xff;            // on an 8086/8088, all shift counts are used as-is
            
                this.cycleCounts = (this.model == X86.MODEL_80386? X86CPU.CYCLES_80386 : (this.model == X86.MODEL_80286? X86CPU.CYCLES_80286 : X86CPU.CYCLES_8088));
            
                this.aOps     = X86.aOps;
                this.aOpGrp4b = X86.aOpGrp4b;
                this.aOpGrp4w = X86.aOpGrp4w;
                this.aOpGrp6  = X86.aOpGrp6Real;        // setProtMode() will ensure that aOpGrp6 is switched
            
                if (this.model >= X86.MODEL_80186) {
                    /*
                     * I don't go out of my way to make 80186/80188 cycle times accurate, since I'm not aware of any
                     * IBM PC models that used those processors; beyond the 8086, my next priorities are the 80286 and
                     * 80386, but I might revisit the 80186 someday.
                     *
                     * Instruction handlers that contain "hard-coded" 80286 cycle times include: opINSb, opINSw, opOUTSb,
                     * opOUTSw, opENTER, and opLEAVE.
                     */
                    this.aOps = X86.aOps.slice();       // make copies of aOps and others before modifying them
                    this.aOpGrp4b = X86.aOpGrp4b.slice();
                    this.aOpGrp4w = X86.aOpGrp4w.slice();
                    this.nShiftCountMask = 0x1f;        // on newer processors, all shift counts are MOD 32
                    this.aOps[0x0F]                 = X86.opInvalid;
                    this.aOps[X86.OPCODE.PUSHA]     = X86.opPUSHA;      // 0x60
                    this.aOps[X86.OPCODE.POPA]      = X86.opPOPA;       // 0x61
                    this.aOps[X86.OPCODE.BOUND]     = X86.opBOUND;      // 0x62
                    this.aOps[X86.OPCODE.ARPL]      = X86.opInvalid;    // 0x63
                    this.aOps[X86.OPCODE.FS]        = X86.opInvalid;    // 0x64
                    this.aOps[X86.OPCODE.GS]        = X86.opInvalid;    // 0x65
                    this.aOps[X86.OPCODE.OS]        = X86.opInvalid;    // 0x66
                    this.aOps[X86.OPCODE.AS]        = X86.opInvalid;    // 0x67
                    this.aOps[X86.OPCODE.PUSHN]     = X86.opPUSHn;      // 0x68
                    this.aOps[X86.OPCODE.IMULN]     = X86.opIMULn;      // 0x69
                    this.aOps[X86.OPCODE.PUSH8]     = X86.opPUSH8;      // 0x6A
                    this.aOps[X86.OPCODE.IMUL8]     = X86.opIMUL8;      // 0x6B
                    this.aOps[X86.OPCODE.INSB]      = X86.opINSb;       // 0x6C
                    this.aOps[X86.OPCODE.INSW]      = X86.opINSw;       // 0x6D
                    this.aOps[X86.OPCODE.OUTSB]     = X86.opOUTSb;      // 0x6E
                    this.aOps[X86.OPCODE.OUTSW]     = X86.opOUTSw;      // 0x6F
                    this.aOps[0xC0]                 = X86.opGRP2bn;     // 0xC0
                    this.aOps[0xC1]                 = X86.opGRP2wn;     // 0xC1
                    this.aOps[X86.OPCODE.ENTER]     = X86.opENTER;      // 0xC8
                    this.aOps[X86.OPCODE.LEAVE]     = X86.opLEAVE;      // 0xC9
                    this.aOps[0xF1]                 = X86.opINT1;       // 0xF1
                    this.aOpGrp4b[0x07]             = X86.fnGRPInvalid;
                    this.aOpGrp4w[0x07]             = X86.fnGRPInvalid;
            
                    if (this.model >= X86.MODEL_80286) {
            
                        this.PS_SET = X86.PS.BIT1;      // on the 80286, only BIT1 of Processor Status (flags) is always set
                        this.PS_DIRECT |= X86.PS.IOPL.MASK | X86.PS.NT;
            
                        this.OPFLAG_NOINTR_8086 = 0;    // used with instructions that should *not* set NOINTR on an 80286 (eg, non-SS segment loads)
            
                        this.aOps[0x0F] = X86.op0F;
                        this.aOps0F = X86.aOps0F.slice();
                        for (var i = 0; i < this.aOps0F.length; i++) {
                            if (!this.aOps0F[i]) this.aOps0F[i] = X86.opUndefined;
                        }
                        this.aOps[X86.OPCODE.PUSHSP] = X86.opPUSHSP;    // 0x54
                        this.aOps[X86.OPCODE.ARPL]   = X86.opARPL;      // 0x63
            
                        if (I386 && this.model >= X86.MODEL_80386) {
                            var bOpcode;
                            this.aOps[X86.OPCODE.FS] = X86.opFS;        // 0x64
                            this.aOps[X86.OPCODE.GS] = X86.opGS;        // 0x65
                            this.aOps[X86.OPCODE.OS] = X86.opOS;        // 0x66
                            this.aOps[X86.OPCODE.AS] = X86.opAS;        // 0x67
                            for (bOpcode in X86.aOps0F386) {
                                this.aOps0F[+bOpcode] = X86.aOps0F386[bOpcode];
                            }
                        }
                    }
                }
            };
            
            /**
             * reset()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.reset = function()
            {
                if (this.aFlags.fRunning) this.stopCPU();
                this.resetRegs();
                this.resetCycles();
                this.clearError();      // clear any fatal error/exception that setError() may have flagged
                if (SAMPLER) this.iSampleNext = this.iSampleFreq = this.iSampleSkip = 0;
            };
            
            /**
             * resetRegs()
             *
             * According to "The 8086 Book", p.7-5, a RESET signal initializes the following registers:
             *
             *      PS          =   0x0000 (which has the important side-effect of disabling interrupts and traps)
             *      IP          =   0x0000
             *      CS          =   0xFFFF
             *      DS/ES/SS    =   0x0000
             *
             * It is silent as to whether the remaining registers are initialized to any particular values.
             *
             * According to the "80286 and 80287 Programmer's Reference Manual", these 80286 registers are reset:
             *
             *      PS          =   0x0002
             *      MSW         =   0xFFF0
             *      IP          =   0xFFF0
             *      CS Selector =   0xF000      DS/ES/SS Selector =   0x0000
             *      CS Base     = 0xFF0000      DS/ES/SS Base     = 0x000000        IDT Base  = 0x000000
             *      CS Limit    =   0xFFFF      DS/ES/SS Limit    =   0xFFFF        IDT Limit =   0x03FF
             *
             * And from the "INTEL 80386 PROGRAMMER'S REFERENCE MANUAL 1986", section 10.1:
             *
             *      The contents of EAX depend upon the results of the power-up self test. The self-test may be requested
             *      externally by assertion of BUSY# at the end of RESET. The EAX register holds zero if the 80386 passed
             *      the test. A nonzero value in EAX after self-test indicates that the particular 80386 unit is faulty.
             *      If the self-test is not requested, the contents of EAX after RESET is undefined.
             *
             *      DX holds a component identifier and revision number after RESET as Figure 10-1 illustrates. DH contains
             *      3, which indicates an 80386 component. DL contains a unique identifier of the revision level.
             *
             *      EFLAGS      =   0x00000002
             *      IP          =   0x0000FFF0
             *      CS selector =   0xF000 (base of 0xFFFF0000 and limit of 0xFFFF)
             *      DS selector =   0x0000
             *      ES selector =   0x0000
             *      SS selector =   0x0000
             *      FS selector =   0x0000
             *      GS selector =   0x0000
             *      IDTR        =   base of 0 and limit of 0x3FF
             *
             * All other 80386 registers are undefined after a reset (ie, Intel did not document how or if they are set).
             *
             * We've elected to set DX to 0x0304 on a reset, which is consistent with a 80386-C0, since we have no desire to
             * try to emulate all the bugs in older (eg, B1) steppings -- at least not initially.  We leave stepping-accurate
             * emulation for another day.  It's also known that the B1 (and possibly B0) reported 0x0303 in DX, and that
             * the D0 stepping reported 0x0305; beyond that, it's not known exactly what revision numbers Intel used for all
             * 80386 revisions.
             *
             * We define some additional "registers", such as regLIP. which mirrors the linear address corresponding to
             * CS:IP (the address of the next opcode byte).  In fact, regLIP functions as our internal IP register, so any
             * code that needs the real IP must call getIP().  This, in turn, means that whenever CS or IP must be modified,
             * regLIP must be recalculated, so you must use either setCSIP(), which takes both an offset and a segment,
             * or setIP(), whichever is appropriate; in unusual cases where only segCS is changing (eg, undocumented 8086
             * opcodes), use setCS().
             *
             * Similarly, regLSP mirrors the linear address corresponding to SS:SP, and therefore you must rely on getSP()
             * to read the current SP, and setSP() and setSS() to update SP and SS.
             *
             * The other segment registers, such as segDS and segES, have similar getters and setters, but they do not mirror
             * any segment:offset values in the same way that regLIP mirrors CS:IP, or that regLSP mirrors SS:SP.
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.resetRegs = function()
            {
                this.regEAX = 0;
                this.regEBX = 0;
                this.regECX = 0;
                this.regEDX = 0;
                this.regESP = 0;            // this isn't needed in a 16-bit environment, but is required for I386
                this.regEBP = 0;
                this.regESI = 0;
                this.regEDI = 0;
            
                /*
                 * The following are internal "registers" used to capture intermediate values inside selected helper
                 * functions and use them if they've been modified (or are known to change); for example, the MUL and DIV
                 * instructions perform calculations that must be propagated to specific registers (eg, AX and/or DX), which
                 * the ModRM decoder functions don't know about.  We initialize them here mainly for documentation purposes.
                 */
                this.fMDSet = false;        // regMDHi and/or regMDLo are invalid unless fMDSet is true
                this.regMDLo = this.regMDHi = 0;
                this.regXX = 0;             // internal register for segment register and control register moves
            
                /*
                 * Another internal "register" we occasionally need is an interim copy of bModRM, set inside selected opcode
                 * handlers so that the helper function can have access to the instruction's bModRM without resorting to a
                 * closure (which, in the Chrome V8 engine, for example, may cause constant recompilation).
                 */
                this.bModRM = 0;
            
                /*
                 * NOTE: Even though the 8086 doesn't have CR0 (aka MSW) and IDTR, we initialize them for ALL CPUs, so
                 * that functions like X86.fnINT() can use the same code for both.  The 8086/8088 have no direct way
                 * of accessing or changing them, so this is an implementation detail those processors are unaware of.
                 */
                this.regCR0 = X86.CR0.MSW.ON;
                this.addrIDT = 0; this.addrIDTLimit = 0x03FF;
                this.regPS = this.nIOPL = 0;        // these should be set before the first setPS() call
            
                /*
                 * Define all the result registers that can be used to "cache" arithmetic and logical flags.
                 *
                 * In addition, setPS() will initialize resultType, which keeps track of which flags are cached,
                 * and resultSize, which maintains the size of the last result; initially, no flags are cached.
                 */
                this.resultDst = this.resultSrc = this.resultArith = this.resultLogic = 0;
            
                /*
                 * This is set by fnFault() and reset (to -1) by resetRegs() and opIRET(); its initial purpose is to
                 * "help" fnFault() determine when a nested fault should be converted into either a double-fault (DF_FAULT)
                 * or a triple-fault (ie, a processor reset).
                 */
                this.nFault = -1;
            
                /*
                 * Segment registers used to be defined as separate variables (eg, regCS and regCS0 stored the segment
                 * number and base linear address, respectively), but segment registers are now defined as X86Seg objects.
                 */
                this.segCS     = new X86Seg(this, X86Seg.ID.CODE,  "CS");
                this.segDS     = new X86Seg(this, X86Seg.ID.DATA,  "DS");
                this.segES     = new X86Seg(this, X86Seg.ID.DATA,  "ES");
                this.segSS     = new X86Seg(this, X86Seg.ID.STACK, "SS");
                this.setSP(0);
                this.setSS(0);
            
                if (I386 && this.model >= X86.MODEL_80386) {
                    this.regEDX = 0x0304;           // Intel errata sheets indicate this is what an 80386-C0 reported
                    this.regCR0 = X86.CR0.ET;       // formerly MSW
                    this.regCR1 = 0;                // reserved
                    this.regCR2 = 0;                // page fault linear address (PFLA)
                    this.regCR3 = 0;                // page directory base register (PDBR)
                    this.aRegDR = new Array(8);     // Debug Registers DR0-DR7
                    this.aRegTR = new Array(8);     // Test Registers TR0-TR7
                    this.segFS = new X86Seg(this, X86Seg.ID.DATA,  "FS");
                    this.segGS = new X86Seg(this, X86Seg.ID.DATA,  "GS");
                }
            
                this.segNULL = new X86Seg(this, X86Seg.ID.NULL,  "NULL");
            
                /*
                 * The next few initializations mirror what we must do prior to each instruction (ie, inside the stepCPU() function);
                 * note that opPrefixes, along with segData and segStack, are reset only after we've executed a non-prefix instruction.
                 */
                this.segData = this.segDS;
                this.segStack = this.segSS;
                this.opFlags = this.opPrefixes = 0;
                this.regEA = this.regEAWrite = X86.ADDR_INVALID;
            
                /*
                 * intFlags contains some internal states we use to indicate whether a hardware interrupt (INTFLAG.INTR) or
                 * Trap software interrupt (INTR.TRAP) has been requested, as well as when we're in a "HLT" state (INTFLAG.HALT)
                 * that requires us to wait for a hardware interrupt (INTFLAG.INTR) before continuing execution.
                 *
                 * intFlags must be cleared only by checkINTR(), whereas opFlags must be cleared prior to every CPU operation.
                 */
                this.intFlags = X86.INTFLAG.NONE;
            
                this.setCSIP(0, 0xffff);    // this should be called before the first setPS() call
            
                if (!I386) this.resetSizes();
            
                if (BACKTRACK) {
                    /*
                     * Initialize the backtrack indexes for all registers to zero.  And while, yes, it IS possible
                     * for raw data to flow through segment registers as well, it's not common enough in real-mode
                     * (and too difficult in protected-mode) to merit the overhead.  Ditto for SP, which can't really
                     * be considered a general-purpose register.
                     *
                     * Every time getByte() is called, btMemLo is filled with the matching backtrack info; similarly,
                     * every time getWord() is called, btMemLo and btMemHi are filled with the matching backtrack info
                     * for the low and high bytes, respectively.
                     */
                    this.backTrack = {
                        btiAL:      0,
                        btiAH:      0,
                        btiBL:      0,
                        btiBH:      0,
                        btiCL:      0,
                        btiCH:      0,
                        btiDL:      0,
                        btiDH:      0,
                        btiBPLo:    0,
                        btiBPHi:    0,
                        btiSILo:    0,
                        btiSIHi:    0,
                        btiDILo:    0,
                        btiDIHi:    0,
                        btiMemLo:   0,
                        btiMemHi:   0,
                        btiEALo:    0,
                        btiEAHi:    0,
                        btiIO:      0
                    };
                }
            
                /*
                 * Assorted 80286-specific registers.  The GDTR and IDTR registers are stored as the following pieces:
                 *
                 *      GDTR:   addrGDT (24 bits) and addrGDTLimit (24 bits)
                 *      IDTR:   addrIDT (24 bits) and addrIDTLimit (24 bits)
                 *
                 * while the LDTR and TR are stored as special segment registers: segLDT and segTSS.
                 *
                 * So, yes, our GDTR and IDTR "registers" differ from other segment registers in that we do NOT record
                 * the 16-bit limit specified by the LGDT or LIDT instructions; instead, we immediately calculate the limiting
                 * address, and record that instead.
                 *
                 * In addition to different CS:IP reset values, the CS base address must be set to the top of the 16Mb
                 * address space rather than the top of the first 1Mb (which is why the MODEL_5170 ROM must be addressable
                 * at both 0x0F0000 and 0xFF0000; see the ROM component's "alias" parameter).
                 */
                if (this.model >= X86.MODEL_80286) {
                    /*
                     * TODO: Verify what the 80286 actually sets addrGDT and addrGDTLimit to on reset (or if it leaves them alone).
                     */
                    this.addrGDT = 0; this.addrGDTLimit = 0xffff;                   // GDTR
                    this.segLDT = new X86Seg(this, X86Seg.ID.LDT,   "LDT", true);   // LDTR
                    this.segTSS = new X86Seg(this, X86Seg.ID.TSS,   "TSS", true);   // TR
                    this.segVER = new X86Seg(this, X86Seg.ID.OTHER, "VER", true);   // a scratch segment register for VERR and VERW instructions
                    this.setCSIP(0xfff0, 0xf000);                   // on an 80286 or 80386, the default CS:IP is 0xF000:0xFFF0 instead of 0xFFFF:0x0000
                    this.setCSBase(0xffff0000|0);                   // on an 80286 or 80386, all CS base address bits above bit 15 must be set
                }
            
                /*
                 * This resets the Processor Status flags (regPS), along with all the internal "result registers";
                 * we've taken care to ensure that both segCS.cpl and nIOPL are initialized before this first setPS() call.
                 */
                this.setPS(0);
            
                /*
                 * Now that all the segment registers have been created, it's safe to set the current addressing mode.
                 */
                this.setProtMode();
            };
            
            /**
             * updateAddrSize()
             *
             * Select the appropriate ModRM dispatch tables, based on the current ADDRESS size (addrSize), which
             * is based foremost on segCS.addrSize, but can also be overridden by an ADDRESS size instruction prefix.
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.updateAddrSize = function()
            {
                if (!I386) {
                    this.getAddr = this.getShort;
                    this.aOpModRegByte = X86ModB.aOpModReg;
                    this.aOpModMemByte = X86ModB.aOpModMem;
                    this.aOpModGrpByte = X86ModB.aOpModGrp;
                    this.aOpModRegWord = X86ModW.aOpModReg;
                    this.aOpModMemWord = X86ModW.aOpModMem;
                    this.aOpModGrpWord = X86ModW.aOpModGrp;
                } else {
                    if (this.addrSize == 2) {
                        this.getAddr = this.getShort;
                        this.aOpModRegByte = X86ModB16.aOpModReg;
                        this.aOpModMemByte = X86ModB16.aOpModMem;
                        this.aOpModGrpByte = X86ModB16.aOpModGrp;
                        this.aOpModRegWord = X86ModW16.aOpModReg;
                        this.aOpModMemWord = X86ModW16.aOpModMem;
                        this.aOpModGrpWord = X86ModW16.aOpModGrp;
                    } else {
                        this.getAddr = this.getLong;
                        this.aOpModRegByte = X86ModB32.aOpModReg;
                        this.aOpModMemByte = X86ModB32.aOpModMem;
                        this.aOpModGrpByte = X86ModB32.aOpModGrp;
                        this.aOpModRegWord = X86ModW32.aOpModReg;
                        this.aOpModMemWord = X86ModW32.aOpModMem;
                        this.aOpModGrpWord = X86ModW32.aOpModGrp;
                    }
                }
            };
            
            /**
             * setDataSize(size)
             *
             * This is used by opcodes that require a particular OPERAND size, which we enforce by
             * internally simulating an OPERAND size override, if needed.
             *
             * @this {X86CPU}
             * @param {number} size (2 for 2-byte/16-bit operands, or 4 for 4-byte/32-bit operands)
             */
            X86CPU.prototype.setDataSize = function(size)
            {
                if (this.dataSize != size) {
                    this.opPrefixes |= X86.OPFLAG.DATASIZE;
                    this.dataSize = size;
                    this.dataMask = (size == 2? 0xffff : (0xffffffff|0));
                    this.updateDataSize();
                }
            };
            
            /**
             * updateDataSize()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.updateDataSize = function()
            {
                if (this.dataSize == 2) {
                    this.dataType = X86.RESULT.WORD;
                    this.getWord = this.getShort;
                    this.setWord = this.setShort;
                } else {
                    this.dataType = X86.RESULT.DWORD;
                    this.getWord = this.getLong;
                    this.setWord = this.setLong;
                }
            };
            
            /**
             * resetSizes()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.resetSizes = function()
            {
                /*
                 * The following contain the (default) ADDRESS size (2 for 16 bits, 4 for 32 bits), and the corresponding
                 * masks for isolating the (src) bits of an address and clearing the (dst) bits of an address.  Like the
                 * OPERAND size properties, these are reset to their segCS counterparts at the start of every new instruction.
                 */
                this.addrSize = this.segCS.addrSize;
                this.addrMask = this.segCS.addrMask;
            
                /*
                 * It's also worth noting that instructions that implicitly use the stack also rely on STACK size,
                 * which is based on the BIG bit of the last descriptor loaded into SS; use the following segSS properties:
                 *
                 *      segSS.addrSize      (2 or 4)
                 *      segSS.addrMask      (0xffff or 0xffffffff)
                 *
                 * As there is no STACK size instruction prefix override, there's no need to propagate these segSS properties
                 * to separate X86CPU properties, as we do for the OPERAND size and ADDRESS size properties.
                 */
            
                this.updateAddrSize();
            
                /*
                 * The following contain the (default) OPERAND size (2 for 16 bits, 4 for 32 bits), and the corresponding masks
                 * for isolating the (src) bits of an OPERAND and clearing the (dst) bits of an OPERAND.  These are reset to
                 * their segCS counterparts at the start of every new instruction, but are also set here for documentation purposes.
                 */
                this.dataSize = this.segCS.dataSize;
                this.dataMask = this.segCS.dataMask;
            
                this.updateDataSize();
            
                this.opPrefixes &= ~(X86.OPFLAG.ADDRSIZE | X86.OPFLAG.DATASIZE);
            };
            
            /**
             * getChecksum()
             *
             * @this {X86CPU}
             * @return {number} a 32-bit summation of key elements of the current CPU state (used by the CPU checksum code)
             */
            X86CPU.prototype.getChecksum = function()
            {
                var sum = (this.regEAX + this.regEBX + this.regECX + this.regEDX + this.getSP() + this.regEBP + this.regESI + this.regEDI)|0;
                sum = (sum + this.getIP() + this.getCS() + this.getDS() + this.getSS() + this.getES() + this.getPS())|0;
                return sum;
            };
            
            /**
             * addIntNotify(nInt, component, fn)
             *
             * Add an software interrupt notification handler to the CPU's list of such handlers.
             *
             * @this {X86CPU}
             * @param {number} nInt
             * @param {Component} component
             * @param {function(number)} fn is called with the LIP value following the software interrupt
             */
            X86CPU.prototype.addIntNotify = function(nInt, component, fn)
            {
                if (fn !== undefined) {
                    if (this.aIntNotify[nInt] === undefined) {
                        this.aIntNotify[nInt] = [];
                    }
                    this.aIntNotify[nInt].push([component, fn]);
                    if (MAXDEBUG) this.log("addIntNotify(" + str.toHexWord(nInt) + "," + component.id + ")");
                }
            };
            
            /**
             * checkIntNotify(nInt)
             *
             * NOTE: This is called ONLY for "INT N" instructions -- not "INTO" or breakpoint or single-step interrupts
             * or divide exception interrupts, or hardware interrupts, or any simulation of an interrupt (eg, "PUSHF/CALLF").
             *
             * @this {X86CPU}
             * @param {number} nInt
             * @return {boolean} true if software interrupt may proceed, false if software interrupt should be skipped
             */
            X86CPU.prototype.checkIntNotify = function(nInt)
            {
                var aNotify = this.aIntNotify[nInt];
                if (aNotify !== undefined) {
                    for (var i = 0; i < aNotify.length; i++) {
                        if (!aNotify[i][1].call(aNotify[i][0], this.regLIP)) {
                            return false;
                        }
                    }
                }
                /*
                 * The enabling of INT messages is one of the criteria that's also included in the Debugger's
                 * checksEnabled() function, and therefore in fDebugCheck, so for maximum speed, we check fDebugCheck first.
                 */
                if (DEBUGGER && this.aFlags.fDebugCheck) {
                    if (this.messageEnabled(Messages.INT) && this.dbg.messageInt(nInt, this.regLIP)) {
                        this.addIntReturn(this.regLIP, function(cpu, nCycles) {
                            return function onIntReturn(nLevel) {
                                cpu.dbg.messageIntReturn(nInt, nLevel, cpu.getCycles() - nCycles);
                            };
                        }(this, this.getCycles()));
                    }
                }
                return true;
            };
            
            /**
             * addIntReturn(addr, fn)
             *
             * Add a return notification handler to the CPU's list of such handlers.
             *
             * When fn(n) is called, it's passed a "software interrupt level", which will normally be 0,
             * unless it's a return from a nested software interrupt (eg, return from INT 0x10 Video BIOS
             * call issued inside another INT 0x10 Video BIOS call).
             *
             * Note that the nesting could be due to a completely different software interrupt that
             * another interrupt notification function is intercepting, so use it as an advisory value only.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @param {function(number)} fn is an interrupt-return notification function
             */
            X86CPU.prototype.addIntReturn = function(addr, fn)
            {
                if (fn !== undefined) {
                    if (this.aIntReturn[addr] == null) {
                        this.cIntReturn++;
                    }
                    this.aIntReturn[addr] = fn;
                }
            };
            
            /**
             * checkIntReturn(addr)
             *
             * We check for possible "INT n" software interrupt returns in the cases of "IRET" (fnIRET), "RETF 2"
             * (fnRETF) and "JMPF [DWORD]" (fnJMPFdw).
             *
             * "JMPF [DWORD]" is an unfortunate choice that newer versions of DOS (as of at least 3.20, and probably
             * earlier) employed in their INT 0x13 hooks; I would have preferred not making this call for that opcode.
             *
             * It is expected (though not required) that callers will check cIntReturn and avoid calling this function
             * if the count is zero, for maximum performance.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             */
            X86CPU.prototype.checkIntReturn = function(addr)
            {
                var fn = this.aIntReturn[addr];
                if (fn != null) {
                    fn(--this.cIntReturn);
                    delete this.aIntReturn[addr];
                }
            };
            
            /**
             * setProtMode(fProt)
             *
             * Update any opcode handlers that operate significantly differently in real-mode vs. protected-mode, and
             * notify all the segment registers about the mode change as well -- but only those that are "bi-modal"; internal
             * segment registers like segLDT and segTSS do not need to be notified, because they cannot be accessed in real-mode
             * (ie, LLDT, LTR, SLDT, STR are invalid instructions in real-mode, and are among the opcode handlers that we
             * update here).
             *
             * NOTE: Ideally, this function would do its work ONLY on mode *transitions*, but we assume calls to setProtMode()
             * are sufficiently infrequent that it doesn't really matter.
             *
             * @this {X86CPU}
             * @param {boolean} [fProt] (use the current MSW PE bit if not specified)
             */
            X86CPU.prototype.setProtMode = function(fProt)
            {
                if (fProt === undefined) {
                    fProt = !!(this.regCR0 & X86.CR0.MSW.PE);
                }
                if (!fProt != !(this.regCR0 & X86.CR0.MSW.PE) && this.messageEnabled()) {
                    this.printMessage("CPU switching to " + (fProt? "protected" : "real") + "-mode", this.bitsMessage, true);
                }
                this.aOpGrp6 = (fProt? X86.aOpGrp6Prot : X86.aOpGrp6Real);
                this.segCS.updateMode();
                this.segDS.updateMode();
                this.segSS.updateMode();
                this.segES.updateMode();
                if (I386 && this.model >= X86.MODEL_80386) {
                    this.segFS.updateMode();
                    this.segGS.updateMode();
                    this.resetSizes();
                }
            };
            
            /**
             * saveProtMode()
             *
             * Save CPU state related to protected-mode, for save()
             *
             * @this {X86CPU}
             * @return {Array}
             */
            X86CPU.prototype.saveProtMode = function()
            {
                if (this.addrGDT != null) {
                    var a = [
                        this.regCR0,
                        this.addrGDT,
                        this.addrGDTLimit,
                        this.addrIDT,
                        this.addrIDTLimit,
                        this.segLDT.save(),
                        this.segTSS.save(),
                        this.nIOPL
                    ];
                    if (I386) {
                        a.push(this.regCR1);
                        a.push(this.regCR2);
                        a.push(this.regCR3);
                        a.push(this.aRegDR);
                        a.push(this.aRegTR);
                    }
                    return a;
                }
                return null;
            };
            
            /**
             * restoreProtMode()
             *
             * Restore CPU state related to protected-mode, for restore()
             *
             * @this {X86CPU}
             * @param {Array} a
             */
            X86CPU.prototype.restoreProtMode = function(a)
            {
                if (a && a.length) {
                    this.regCR0 = a[0];
                    this.addrGDT = a[1];
                    this.addrGDTLimit = a[2];
                    this.addrIDT = a[3];
                    this.addrIDTLimit = a[4];
                    this.segLDT.restore(a[5]);
                    this.segTSS.restore(a[6]);
                    this.nIOPL = a[7];
                    if (I386 && this.model >= X86.MODEL_80386) {
                        this.regCR1 = a[8];
                        this.regCR2 = a[9];
                        this.regCR3 = a[10];
                        this.aRegDR = a[11];
                        this.aRegTR = a[12];
                    }
                    this.setProtMode();
                }
            };
            
            /**
             * save()
             *
             * This implements save support for the X86 component.
             *
             * UPDATES: The current speed multiplier from getSpeed() is now saved in group #3, so that your speed is preserved.
             *
             * @this {X86CPU}
             * @return {Object|null}
             */
            X86CPU.prototype.save = function()
            {
                var state = new State(this);
                state.set(0, [this.regEAX, this.regEBX, this.regECX, this.regEDX, this.getSP(), this.regEBP, this.regESI, this.regEDI]);
                var a = [this.getIP(), this.segCS.save(), this.segDS.save(), this.segSS.save(), this.segES.save(), this.saveProtMode(), this.getPS()];
                if (I386 && this.model >= X86.MODEL_80386) {
                    a.push(this.segFS.save());
                    a.push(this.segGS.save());
                }
                state.set(1, a);
                state.set(2, [this.segData.sName, this.segStack.sName, this.opFlags, this.opPrefixes, this.intFlags, this.regEA, this.regEAWrite]);
                state.set(3, [0, this.nTotalCycles, this.getSpeed()]);
                state.set(4, this.bus.saveMemory());
                return state.data();
            };
            
            /**
             * restore(data)
             *
             * This implements restore support for the X86 component.
             *
             * @this {X86CPU}
             * @param {Object} data
             * @return {boolean} true if restore successful, false if not
             */
            X86CPU.prototype.restore = function(data)
            {
                var a = data[0];
                this.regEAX = a[0];
                this.regEBX = a[1];
                this.regECX = a[2];
                this.regEDX = a[3];
                var regESP = a[4];
                this.regEBP = a[5];
                this.regESI = a[6];
                this.regEDI = a[7];
            
                a = data[1];
                this.segCS.restore(a[1]);
                this.segDS.restore(a[2]);
                this.segSS.restore(a[3]);
                this.segES.restore(a[4]);
                this.restoreProtMode(a[5]);
                this.setPS(a[6]);
            
                /*
                 * It's important to call setCSIP(), both to ensure that the CPU's linear IP register (regLIP) is updated
                 * properly AND to ensure the CPU's default ADDRESS and OPERAND sizes are set properly.
                 */
                this.setCSIP(a[0], this.segCS.sel);
            
                /*
                 * It's also important to call setSP(), so that the linear SP register (regLSP) will be updated properly;
                 * we also need to call setSS(), to ensure that the lower and upper stack limits are properly initialized.
                 */
                this.setSP(regESP);
                this.setSS(this.segSS.sel);
            
                if (I386 && this.model >= X86.MODEL_80386) {
                    this.segFS.restore(a[7]);
                    this.segGS.restore(a[8]);
                }
            
                a = data[2];
                this.segData  = a[0] != null && this.getSeg(a[0]) || this.segDS;
                this.segStack = a[1] != null && this.getSeg(a[1]) || this.segSS;
                this.opFlags = a[2];
                this.opPrefixes = a[3];
                this.intFlags = a[4];
                this.regEA = a[5];
                this.regEAWrite = a[6];     // save/restore of last EA calculation(s) isn't strictly necessary, but they may be of some interest to, say, the Debugger
            
                a = data[3];                // a[0] was previously nBurstDivisor (no longer used)
                this.nTotalCycles = a[1];
                this.setSpeed(a[2]);        // if we're restoring an old state that doesn't contain a value from getSpeed(), that's OK; setSpeed() checks for an undefined value
                return this.bus.restoreMemory(data[4]);
            };
            
            /**
             * getSeg(sName)
             *
             * @param {string} sName
             * @return {Array}
             */
            X86CPU.prototype.getSeg = function(sName)
            {
                switch(sName) {
                case "CS":
                    return this.segCS;
                case "DS":
                    return this.segDS;
                case "SS":
                    return this.segSS;
                case "ES":
                    return this.segES;
                case "NULL":
                    return this.segNULL;
                default:
                    /*
                     * HACK: We return a fake segment register object in which only the base linear address is valid,
                     * because that's all the caller provided (ie, we must be restoring from an older state).
                     */
                    this.assert(typeof sName == "number");
                    return [0, sName, 0, 0, ""];
                }
            };
            
            /**
             * getCS()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getCS = function()
            {
                return this.segCS.sel;
            };
            
            /**
             * setCS(sel)
             *
             * NOTE: This is used ONLY by those few undocumented 8086/8088/80186/80188 instructions that "MOV" or "POP" a value
             * into CS, which we assume have the same behavior as any other instruction that moves or pops a segment register
             * (ie, suppresses h/w interrupts for one instruction).  Instructions that "JMP" or "CALL" or "INT" or "IRET" a new
             * value into CS are always accompanied by a new IP value, so they use setCSIP() instead, which does NOT suppress
             * h/w interrupts.
             *
             * @this {X86CPU}
             * @param {number} sel
             */
            X86CPU.prototype.setCS = function(sel)
            {
                var regEIP = this.getIP();
                this.regLIP = (this.segCS.load(sel) + regEIP)|0;
                this.regLIPLimit = (this.segCS.base + this.segCS.limit)|0;
                if (I386) this.resetSizes();
                if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
                if (PREFETCH) this.flushPrefetch(this.regLIP);
            };
            
            /**
             * getDS()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getDS = function()
            {
                return this.segDS.sel;
            };
            
            /**
             * setDS(sel)
             *
             * @this {X86CPU}
             * @param {number} sel
             */
            X86CPU.prototype.setDS = function(sel)
            {
                this.segDS.load(sel);
                if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
            };
            
            /**
             * getSS()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getSS = function()
            {
                return this.segSS.sel;
            };
            
            /**
             * setSS(sel)
             *
             * @this {X86CPU}
             * @param {number} sel
             * @param {boolean} [fInterruptable]
             */
            X86CPU.prototype.setSS = function(sel, fInterruptable)
            {
                var regESP = this.getSP();
                this.regLSP = (this.segSS.load(sel) + regESP)|0;
                if (this.segSS.fExpDown) {
                    this.regLSPLimit = (this.segSS.base + this.segSS.addrMask)|0;
                    this.regLSPLimitLow = (this.segSS.base + this.segSS.limit)|0;
                } else {
                    this.regLSPLimit = (this.segSS.base + this.segSS.limit)|0;
                    this.regLSPLimitLow = this.segSS.base;
                }
                if (!BUGS_8086 && !fInterruptable) this.opFlags |= X86.OPFLAG.NOINTR;
            };
            
            /**
             * getES()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getES = function()
            {
                return this.segES.sel;
            };
            
            /**
             * setES(sel)
             *
             * @this {X86CPU}
             * @param {number} sel
             */
            X86CPU.prototype.setES = function(sel)
            {
                this.segES.load(sel);
                if (!BUGS_8086) this.opFlags |= this.OPFLAG_NOINTR_8086;
            };
            
            /**
             * getFS()
             *
             * NOTE: segFS is defined for I386 only.
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getFS = function()
            {
                return this.segFS.sel;
            };
            
            /**
             * setFS(sel)
             *
             * NOTE: segFS is defined for I386 only.
             *
             * @this {X86CPU}
             * @param {number} sel
             */
            X86CPU.prototype.setFS = function(sel)
            {
                this.segFS.load(sel);
            };
            
            /**
             * getGS()
             *
             * NOTE: segGS is defined for I386 only.
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getGS = function()
            {
                return this.segGS.sel;
            };
            
            /**
             * setGS(sel)
             *
             * NOTE: segGS is defined for I386 only.
             *
             * @this {X86CPU}
             * @param {number} sel
             */
            X86CPU.prototype.setGS = function(sel)
            {
                this.segGS.load(sel);
            };
            
            /**
             * getIP()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getIP = function()
            {
                return (this.regLIP - this.segCS.base)|0;
            };
            
            /**
             * setIP(off)
             *
             * With the addition of flushPrefetch(), this function should only be called
             * for non-incremental IP updates; setIP(this.getIP()+1) is no longer appropriate.
             *
             * In fact, for performance reasons, it's preferable to increment regLIP yourself,
             * but you can also call advanceIP() if speed is not important.
             *
             * @this {X86CPU}
             * @param {number} off
             */
            X86CPU.prototype.setIP = function(off)
            {
                this.regLIP = (this.segCS.base + (off & (I386? this.dataMask : 0xffff)))|0;
                if (PREFETCH) this.flushPrefetch(this.regLIP);
            };
            
            /**
             * setCSIP(off, sel, fCall)
             *
             * This function is a little different from the other segment setters, only because it turns out that CS is
             * never set without an accompanying IP (well, except for a few undocumented instructions, like POP CS, which
             * were available ONLY on the 8086/8088/80186/80188; see setCS() for details).
             *
             * And even though this function is called setCSIP(), please note the order of the parameters is IP,CS,
             * which matches the order that CS:IP values are normally stored in memory, allowing us to make calls like this:
             *
             *      this.setCSIP(this.popWord(), this.popWord());
             *
             * @this {X86CPU}
             * @param {number} off
             * @param {number} sel
             * @param {boolean} [fCall] is true if CALLF in progress, false if RETF/IRET in progress, null/undefined otherwise
             * @return {boolean|null} true if a stack switch occurred; the only opcode that really needs to pay attention is opRETFn()
             */
            X86CPU.prototype.setCSIP = function(off, sel, fCall)
            {
                this.segCS.fCall = fCall;
                /*
                 * We break this operation into the following discrete steps (eg, set IP, load CS, and then update IP) so
                 * that segCS.load(sel) has the ability to modify IP when sel refers to a gate (call, interrupt, trap, etc).
                 *
                 * NOTE: regEIP acts merely as a conduit for the IP, if any, that segCS.load() may load; regLIP is still our
                 * internal instruction pointer.  Callers that need the real IP must call getIP().
                 */
                this.regEIP = off;
                var base = this.segCS.load(sel);
                if (base !== X86.ADDR_INVALID) {
                    this.regLIP = (base + (this.regEIP & (I386? this.dataMask : 0xffff)))|0;
                    this.regLIPLimit = (base + this.segCS.limit)|0;
                    if (I386) this.resetSizes();
                    if (PREFETCH) this.flushPrefetch(this.regLIP);
                    return this.segCS.fStackSwitch;
                }
                return null;
            };
            
            /**
             * setCSBase(addr)
             *
             * Since the CPU must maintain regLIP as the sum of the CS base and the current IP, all calls to setBase()
             * for segCS need to go through here.
             *
             * @param {number} addr
             */
            X86CPU.prototype.setCSBase = function(addr)
            {
                var regIP = this.getIP();
                addr = this.segCS.setBase(addr);
                this.regLIP = (addr + regIP)|0;
                this.regLIPLimit = (addr + this.segCS.limit)|0;
            };
            
            /**
             * advanceIP(inc)
             *
             * @this {X86CPU}
             * @param {number} inc (positive)
             */
            X86CPU.prototype.advanceIP = function(inc)
            {
                this.assert(inc > 0);
                this.regLIP = (this.regLIP + inc)|0;
                /*
                 * Properly comparing regLIP to regLIPLimit would normally require coercing both to unsigned
                 * (ie, floating-point) values.  But instead, we do a subtraction, (regLIPLimit - regLIP), and
                 * if the result is negative, we need only be concerned if the signs of both numbers are the same
                 * (ie, the sign of their XOR'ed union is positive).
                 *
                 * TODO: I'm combining the old 8088 address-wrap check with the new segment-limit check,
                 * even though the correct time to do the latter is immediately BEFORE a fetch, not AFTER; eg,
                 * consider the following code:
                 *
                 *      AX=0100 BX=0015 CX=0080 DX=F859 SP=0A62 BP=0A98 SI=0000 DI=0000
                 *      SS=0038[1759E0,0B5F] DS=02E8[0107A0,017F] ES=0970[009700,6949] A20=ON
                 *      CS=02E0[010080,06FB] LD=0028[000000,0000] GD=[11AEE0,4977] ID=[120082,03FF]
                 *      TR=0010 MS=FFF3 PS=3202 V0 D0 I1 T0 S0 Z0 A0 P0 C0
                 *      02E0:06F9 C20400          RET      0004
                 *
                 * After fetching the 3rd byte of the "RET 0004" instruction at CS:06FB, the CPU wants to automatically
                 * advance IP to 06FC, which of course, exceeds the limit, but that doesn't matter unless we actually
                 * fetch a byte from 06FC, which won't happen.  I'm working around this for now by applying a -1
                 * fudge factor to the fault check below.
                 */
                var off = (this.regLIPLimit - this.regLIP)|0;
                if (off < 0 && (this.regLIPLimit ^ this.regLIP) >= 0) {
                    /*
                     * There's no such thing as a GP fault on the 8086/8088, and I'm assuming that, on newer
                     * processors, when the segment limit is set to the maximum, it's OK for IP to wrap.
                     */
                    if (this.model <= X86.MODEL_8088 || this.segCS.limit == this.segCS.addrMask) {
                        this.setIP(this.regLIP - this.segCS.base);
                    } else if (off < -1) {          // fudge factor
                        X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                    }
                }
            };
            
            /**
             * rewindIP(dec)
             *
             * @this {X86CPU}
             * @param {number} dec (negative)
             */
            X86CPU.prototype.rewindIP = function(dec)
            {
                this.assert(dec < 0);
                this.regLIP = (this.regLIP + dec)|0;
                /*
                 * Since rewindIP() is used only for discrete "intra-instruction" IP adjustments, there should be no need
                 * to perform all the same limit checks as advanceIP().
                 */
                if (PREFETCH) this.advancePrefetch(dec);
            };
            
            /**
             * getSP()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getSP = function()
            {
                if (I386) {
                    // assert(!((this.regLSP - this.segSS.base) & ~this.segSS.addrMask));
                    return (this.regESP & ~this.segSS.addrMask) | (this.regLSP - this.segSS.base);
                }
                return (this.regLSP - this.segSS.base)|0;
            };
            
            /**
             * setSP(off)
             *
             * @this {X86CPU}
             * @param {number} off
             */
            X86CPU.prototype.setSP = function(off)
            {
                if (I386) {
                    this.regESP = off;
                    this.regLSP = (this.segSS.base + (off & this.segSS.addrMask))|0;
                } else {
                    this.regLSP = (this.segSS.base + off)|0;
                }
            };
            
            /**
             * setArithResult(dst, src, value, type, fSubtract)
             *
             * Updates the flags for arithmetic instructions; use setLogicResult() for logical instructions.
             *
             * The type parameter indicates both the size of the result (BYTE, WORD or DWORD) and which of the
             * flags should now be considered "cached" by the new result variables.  If the previous resultType
             * specifies any flags not contained in the new type parameter, then those flags must be immediately
             * calculated and written to the appropriate bit(s) in regPS.
             *
             * The fSubtract parameter is used to indicate a "subtracted" result (eg, CMP, DEC, SUB, SBB); the
             * default assumes an "added" result (eg, ADD, ADC, INC).
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @param {number} value
             * @param {number} type
             * @param {boolean} [fSubtract]
             */
            X86CPU.prototype.setArithResult = function(dst, src, value, type, fSubtract)
            {
                if ((type & X86.RESULT.ALL) != X86.RESULT.ALL && type != this.resultType) {
                    var diff = ((type ^ this.resultType) & this.resultType);
                    if (diff) {
                        if (diff & X86.RESULT.CF) this.getCF();
                        if (diff & X86.RESULT.PF) this.getPF();
                        if (diff & X86.RESULT.AF) this.getAF();
                        if (diff & X86.RESULT.ZF) this.getZF();
                        if (diff & X86.RESULT.SF) this.getSF();
                        if (diff & X86.RESULT.OF) this.getOF();
                    }
                }
                if (!fSubtract) {
                    this.resultDst = dst;
                    this.resultArith = value;
                } else {
                    this.resultDst = value;
                    this.resultArith = dst;
                }
                this.resultSrc = src;
                this.resultLogic = value;
                this.resultType = type;
            };
            
            /**
             * setLogicResult(value, type, carry, overflow)
             *
             * Updates the flags for logical instructions (eg, AND, OR, TEST, XOR); ie, instructions
             * that update PF, ZF, and SF, while clearing CF and OF (although CF and OF can be explicitly
             * set via the carry and overflow parameters as needed).  AF is always considered undefined.
             *
             * TODO: We should observe the behavior of AF on real CPUs, and determine if there is a
             * well-defined behavior, even though none is documented.  Ditto for OF on shift instructions
             * when the shift count > 1.
             *
             * @this {X86CPU}
             * @param {number} value
             * @param {number} type
             * @param {number} [carry]
             * @param {number} [overflow]
             * @return {number} value
             */
            X86CPU.prototype.setLogicResult = function(value, type, carry, overflow)
            {
                this.resultType = type | X86.RESULT.LOGIC;
                this.resultLogic = value;
                if (carry) this.setCF(); else this.clearCF();
                if (overflow) this.setOF(); else this.clearOF();
                return value;
            };
            
            /**
             * setRotateResult(result, carry, size)
             *
             * Used by all rotate instructions (ie, RCL, RCR, ROL, ROR) to update CF and OF.
             *
             * TODO: We should observe the behavior of OF on real CPUs whenever the rotate count > 1,
             * and determine if there is a well-defined behavior, even though none is documented.
             *
             * @this {X86CPU}
             * @param {number} result
             * @param {number} carry
             * @param {number} size
             */
            X86CPU.prototype.setRotateResult = function(result, carry, size)
            {
                if (carry & size) this.setCF(); else this.clearCF();
                if ((result ^ carry) & size) this.setOF(); else this.clearOF();
            };
            
            /**
             * getCarry()
             *
             * @this {X86CPU}
             * @return {number} 0 or 1, depending on whether CF is clear or set
             */
            X86CPU.prototype.getCarry = function()
            {
                return this.getCF()? 1 : 0;
            };
            
            /**
             * getCF()
             *
             * Notes regarding carry following an I386 addition:
             *
             * The following table summarizes bit 31 of dst, src, and result, along with the expected carry:
             *
             *      dst src res carry
             *      --- --- --- -----
             *      0   0   0   0       no
             *      0   0   1   0       no (there must have been a carry out of bit 30, but it was "absorbed")
             *      0   1   0   1       yes (there must have been a carry out of bit 30, but it was NOT "absorbed")
             *      0   1   1   0       no
             *      1   0   0   1       yes (same as the preceding "yes" case)
             *      1   0   1   0       no
             *      1   1   0   1       yes (since the addition of two ones must always produce a carry)
             *      1   1   1   1       yes (since the addition of two ones must always produce a carry)
             *
             * So, we use the following calculation:
             *
             *      (resultDst ^ ((resultDst ^ resultSrc) & (resultSrc ^ resultArith))) & resultType
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.CF
             */
            X86CPU.prototype.getCF = function()
            {
                if (this.resultType & X86.RESULT.CF) {
                    this.regPS &= ~X86.PS.CF;
                    if ((this.resultDst ^ ((this.resultDst ^ this.resultSrc) & (this.resultSrc ^ this.resultArith))) & (this.resultType & X86.RESULT.TYPE)) {
                        this.regPS |= X86.PS.CF;
                    }
                    this.resultType &= ~X86.RESULT.CF;
                }
                return this.regPS & X86.PS.CF;
            };
            
            /**
             * getPF()
             *
             * From http://graphics.stanford.edu/~seander/bithacks.html#ParityParallel:
             *
             *      unsigned int v;  // word value to compute the parity of
             *      v ^= v >> 16;
             *      v ^= v >> 8;
             *      v ^= v >> 4;
             *      v &= 0xf;
             *      return (0x6996 >> v) & 1;
             *
             *      The method above takes around 9 operations, and works for 32-bit words.  It may be optimized to work just on
             *      bytes in 5 operations by removing the two lines immediately following "unsigned int v;".  The method first shifts
             *      and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v.  Next,
             *      the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the
             *      lowest nibble of v.  This number is like a miniature 16-bit parity-table indexed by the low four bits in v.
             *      The result has the parity of v in bit 1, which is masked and returned.
             *
             * The x86 parity flag (PF) is based exclusively on the low 8 bits of resultParitySign, and PF must be SET if that byte
             * has EVEN parity; the above calculation yields ODD parity, so we use the conditional operator to invert the result.
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.PF
             */
            X86CPU.prototype.getPF = function()
            {
                if (this.resultType & X86.RESULT.PF) {
                    this.regPS &= ~X86.PS.PF;
                    if ((0x9669 >> ((this.resultLogic ^ (this.resultLogic >> 4)) & 0xf)) & 1) {
                        this.regPS |= X86.PS.PF;
                    }
                    this.resultType &= ~X86.RESULT.PF;
                }
                return this.regPS & X86.PS.PF;
            };
            
            /**
             * getAF()
             *
             * To determine if there's been a carry out of the low 4 bits of an arithmetic operation,
             * we look at all the possible inputs for bit 4, and calculate AF = PS^(D^S):
             *
             *      D   S   A   D^S AF
             *      -   -   -   --- --
             *      0   0   0   0   0
             *      0   0   1   0   1
             *      0   1   0   1   1
             *      0   1   1   1   0
             *      1   0   0   1   1
             *      1   0   1   1   0
             *      1   1   0   0   0
             *      1   1   1   0   1
             *
             * The final calculation looks like:
             *
             *      (resultArith ^ (resultDst ^ resultSrc)) & 0x0010
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.AF
             */
            X86CPU.prototype.getAF = function()
            {
                if (this.resultType & X86.RESULT.AF) {
                    this.regPS &= ~X86.PS.AF;
                    if ((this.resultArith ^ (this.resultDst ^ this.resultSrc)) & 0x0010) {
                        this.regPS |= X86.PS.AF;
                    }
                    this.resultType &= ~X86.RESULT.AF;
                }
                return this.regPS & X86.PS.AF;
            };
            
            /**
             * getZF()
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.ZF
             */
            X86CPU.prototype.getZF = function()
            {
                if (this.resultType & X86.RESULT.ZF) {
                    this.regPS &= ~X86.PS.ZF;
                    if (!(this.resultLogic & (((this.resultType & X86.RESULT.TYPE) - 1) | (this.resultType & X86.RESULT.TYPE)))) {
                        this.regPS |= X86.PS.ZF;
                    }
                    this.resultType &= ~X86.RESULT.ZF;
                }
                return this.regPS & X86.PS.ZF;
            };
            
            /**
             * getSF()
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.SF
             */
            X86CPU.prototype.getSF = function()
            {
                if (this.resultType & X86.RESULT.SF) {
                    this.regPS &= ~X86.PS.SF;
                    if (this.resultLogic & (this.resultType & X86.RESULT.TYPE)) {
                        this.regPS |= X86.PS.SF;
                    }
                    this.resultType &= ~X86.RESULT.SF;
                }
                return this.regPS & X86.PS.SF;
            };
            
            /**
             * getOF()
             *
             * Overflow was originally calculated as:
             *
             *      (resultParitySign ^ resultAuxOverflow ^ (resultParitySign >> 1)) & (resultSize >> 1)
             *
             * but as you can see, that calculation depends on the carry out of the 8/16/32-bit result in
             * resultParitySign, which we don't have access to for 32-bit results.  So we fall-back to the
             * following:
             *
             *      ((resultDst ^ resultArith) & (resultSrc ^ resultArith)) & resultType
             *
             * which you can verify from the following table of sign bits (where x1 is resultDst ^ resultArith,
             * and x2 is resultSrc ^ resultArith):
             *
             *      D   S   A   x1  x2  OF
             *      -   -   -   --  --  --
             *      0   0   0   0   0   0
             *      0   0   1   1   1   1 (adding two positive values yielded a negative value)
             *      0   1   0   0   1   0
             *      0   1   1   1   0   0
             *      1   0   0   1   0   0
             *      1   0   1   0   1   0
             *      1   1   0   1   1   1 (adding two negative values yielded a positive value)
             *      1   1   1   0   0   0
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.OF
             */
            X86CPU.prototype.getOF = function()
            {
                if (this.resultType & X86.RESULT.OF) {
                    this.regPS &= ~X86.PS.OF;
                    if (((this.resultDst ^ this.resultArith) & (this.resultSrc ^ this.resultArith)) & (this.resultType & X86.RESULT.TYPE)) {
                        this.regPS |= X86.PS.OF;
                    }
                    this.resultType &= ~X86.RESULT.OF;
                }
                return this.regPS & X86.PS.OF;
            };
            
            /**
             * getTF()
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.TF
             */
            X86CPU.prototype.getTF = function()
            {
                return (this.regPS & X86.PS.TF);
            };
            
            /**
             * getIF()
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.IF
             */
            X86CPU.prototype.getIF = function()
            {
                return (this.regPS & X86.PS.IF);
            };
            
            /**
             * getDF()
             *
             * @this {X86CPU}
             * @return {number} 0 or X86.PS.DF
             */
            X86CPU.prototype.getDF = function()
            {
                return (this.regPS & X86.PS.DF);
            };
            
            /**
             * clearCF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearCF = function()
            {
                this.resultType &= ~X86.RESULT.CF;
                this.regPS &= ~X86.PS.CF;
            };
            
            /**
             * clearPF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearPF = function()
            {
                this.resultType &= ~X86.RESULT.PF;
                this.regPS &= ~X86.PS.PF;
            };
            
            /**
             * clearAF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearAF = function()
            {
                this.resultType &= ~X86.RESULT.AF;
                this.regPS &= ~X86.PS.AF;
            };
            
            /**
             * clearZF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearZF = function()
            {
                this.resultType &= ~X86.RESULT.ZF;
                this.regPS &= ~X86.PS.ZF;
            };
            
            /**
             * clearSF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearSF = function()
            {
                this.resultType &= ~X86.RESULT.SF;
                this.regPS &= ~X86.PS.SF;
            };
            
            /**
             * clearIF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearIF = function()
            {
                this.regPS &= ~X86.PS.IF;
            };
            
            /**
             * clearDF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearDF = function()
            {
                this.regPS &= ~X86.PS.DF;
            };
            
            /**
             * clearOF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.clearOF = function()
            {
                this.resultType &= ~X86.RESULT.OF;
                this.regPS &= ~X86.PS.OF;
            };
            
            /**
             * setCF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setCF = function()
            {
                this.resultType &= ~X86.RESULT.CF;
                this.regPS |= X86.PS.CF;
            };
            
            /**
             * setPF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setPF = function()
            {
                this.resultType &= ~X86.RESULT.PF;
                this.regPS |= X86.PS.PF;
            };
            
            /**
             * setAF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setAF = function()
            {
                this.resultType &= ~X86.RESULT.AF;
                this.regPS |= X86.PS.AF;
            };
            
            /**
             * setZF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setZF = function()
            {
                this.resultType &= ~X86.RESULT.ZF;
                this.regPS |= X86.PS.ZF;
            };
            
            /**
             * setSF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setSF = function()
            {
                this.resultType &= ~X86.RESULT.SF;
                this.regPS |= X86.PS.SF;
            };
            
            /**
             * setIF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setIF = function()
            {
                this.regPS |= X86.PS.IF;
            };
            
            /**
             * setDF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setDF = function()
            {
                this.regPS |= X86.PS.DF;
            };
            
            /**
             * setOF()
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.setOF = function()
            {
                this.resultType &= ~X86.RESULT.OF;
                this.regPS |= X86.PS.OF;
            };
            
            /**
             * getPS()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86CPU.prototype.getPS = function()
            {
                return (this.regPS & ~X86.PS_CACHED) | (this.getCF() | this.getPF() | this.getAF() | this.getZF() | this.getSF() | this.getOF());
            };
            
            /**
             * setMSW(w)
             *
             * Factored out of x86op0f.js, since both opLMSW and opLOADALL are capable of setting a new MSW.
             * The caller is responsible for assessing the appropriate cycle cost.
             *
             * @this {X86CPU}
             * @param {number} w
             */
            X86CPU.prototype.setMSW = function(w)
            {
                /*
                 * This instruction is always allowed to set MSW.PE, but it cannot clear MSW.PE once set;
                 * therefore, we always OR the previous value of MSW.PE into the new value before loading.
                 */
                w |= (this.regCR0 & X86.CR0.MSW.PE) | X86.CR0.MSW.ON;
                this.regCR0 = (this.regCR0 & ~X86.CR0.MSW.MASK) | (w & X86.CR0.MSW.MASK);
                /*
                 * Since the 80286 cannot return to real-mode via this instruction, the only transition we
                 * must worry about is to protected-mode.  And there's no harm calling setProtMode() if the
                 * CPU is already in protected-mode; we could certainly optimize out the call in that case,
                 * but the instruction isn't used frequently enough to warrant it.
                 */
                if (this.regCR0 & X86.CR0.MSW.PE) this.setProtMode(true);
            };
            
            /**
             * setPS(regPS)
             *
             * @this {X86CPU}
             * @param {number} regPS
             * @param {number} [cpl]
             */
            X86CPU.prototype.setPS = function(regPS, cpl)
            {
                /*
                 * OS/2 1.0 discriminates between an 80286 and an 80386 based on whether an IRET in real-mode that
                 * pops 0xF000 into the flags is able to set *any* of flag bits 12-15: if it can, then OS/2 declares
                 * the CPU an 80386.  Therefore, in real-mode, we must zero all incoming bits 12-15.
                 *
                 * This has the added benefit of relieving us from zeroing the effective IOPL (this.nIOPL) whenever
                 * we're in real-mode, since we're zeroing the incoming IOPL bits up front now.
                 */
                if (!(this.regCR0 & X86.CR0.MSW.PE)) {
                    regPS &= ~(X86.PS.IOPL.MASK | X86.PS.NT | X86.PS.BIT15);
                }
            
                /*
                 * There are some cases (eg, an IRET returning to a less privileged code segment) where the CPL
                 * we compare against should come from the outgoing code segment, so if the caller provided it, use it.
                 */
                if (cpl === undefined) cpl = this.segCS.cpl;
            
                /*
                 * Since PS.IOPL and PS.IF are part of PS_DIRECT, we need to take care of any 80286-specific behaviors
                 * before setting the PS_DIRECT bits from the incoming regPS bits.
                 *
                 * Specifically, PS.IOPL is unchanged if CPL > 0, and PS.IF is unchanged if CPL > IOPL.
                 */
                if (!cpl) {
                    this.nIOPL = (regPS & X86.PS.IOPL.MASK) >> X86.PS.IOPL.SHIFT;           // IOPL allowed to change
                } else {
                    regPS = (regPS & ~X86.PS.IOPL.MASK) | (this.regPS & X86.PS.IOPL.MASK);  // IOPL not allowed to change
                }
            
                if (cpl > this.nIOPL) {
                    regPS = (regPS & ~X86.PS.IF) | (this.regPS & X86.PS.IF);                // IF not allowed to change
                }
            
                this.resultType = X86.RESULT.BYTE;
                this.regPS = (this.regPS & ~(this.PS_DIRECT|X86.PS_CACHED)) | (regPS & (this.PS_DIRECT|X86.PS_CACHED)) | this.PS_SET;
            
                if (this.regPS & X86.PS.TF) {
                    this.intFlags |= X86.INTFLAG.TRAP;
                    this.opFlags |= X86.OPFLAG.NOINTR;
                }
            };
            
            /**
             * traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
             *
             * @this {X86CPU}
             * @param {string} prop
             * @param {number} dst
             * @param {number} src
             * @param {number|null} flagsIn
             * @param {number|null} flagsOut
             * @param {number} resultLo
             * @param {number} [resultHi]
             */
            X86CPU.prototype.traceLog = function(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi)
            {
                if (DEBUG && this.dbg) {
                    this.dbg.traceLog(prop, dst, src, flagsIn, flagsOut, resultLo, resultHi);
                }
            };
            
            /**
             * setBinding(sHTMLType, sBinding, control)
             *
             * @this {X86CPU}
             * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
             * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "AX")
             * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
             * @return {boolean} true if binding was successful, false if unrecognized binding request
             */
            X86CPU.prototype.setBinding = function(sHTMLType, sBinding, control)
            {
                var fBound = false;
                switch (sBinding) {
                case "EAX":
                case "EBX":
                case "ECX":
                case "EDX":
                case "ESP":
                case "EBP":
                case "ESI":
                case "EDI":
                case "EIP":
                case "AX":
                case "BX":
                case "CX":
                case "DX":
                case "SP":
                case "BP":
                case "SI":
                case "DI":
                case "IP":
                case "PC":      // deprecated as an alias for "IP" (still used by older XML files, like the one at http://tpoindex.github.io/crobots/)
                case "CS":
                case "DS":
                case "SS":
                case "ES":
                case "PS":      // this refers to "Processor Status", aka the 16-bit flags register (although DEBUG.COM refers to this as "PC", surprisingly)
                case "C":
                case "P":
                case "A":
                case "Z":
                case "S":
                case "T":
                case "I":
                case "D":
                case "V":
                    this.bindings[sBinding] = control;
                    this.cLiveRegs++;
                    fBound = true;
                    break;
                default:
                    fBound = this.parent.setBinding.call(this, sHTMLType, sBinding, control);
                    break;
                }
                return fBound;
            };
            
            /**
             * probeAddr(addr)
             *
             * Used by the Debugger to probe addresses without risk of triggering a page fault, and by internal
             * functions, like fnFaultMessage(), that also need to avoid triggering faults, since they're not part
             * of standard CPU operation.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number|null} byte (8-bit) value at that address, or null if invalid
             */
            X86CPU.prototype.probeAddr = function(addr)
            {
                var block = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift];
                if (block.type == Memory.TYPE.UNPAGED) {
                    block = this.mapPageBlock(addr, false, true);
                    if (!block) return null;
                }
                return block.readByteDirect(addr & this.nBlockLimit, addr);
            };
            
            /**
             * getByte(addr)
             *
             * Use bus.getByte() for physical addresses, and cpu.getByte() for linear addresses; the latter takes care
             * of paging, cycle counts, and BACKTRACK states, if any.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.getByte = function getByte(addr)
            {
                if (BACKTRACK) this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
                return this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
            };
            
            /**
             * getShort(addr)
             *
             * Use bus.getShort() for physical addresses, and cpu.getShort() for linear addresses; the latter takes care
             * of paging, cycle counts, and BACKTRACK states, if any.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.getShort = function getShort(addr)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                /*
                 * On the 8088, it takes 4 cycles to read the additional byte REGARDLESS whether the address is odd or even.
                 * TODO: For the 8086, the penalty is actually "(addr & 0x1) << 2" (4 additional cycles only when the address is odd).
                 */
                this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
            
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
                    this.backTrack.btiMemHi = this.bus.readBackTrack(addr + 1);
                }
                if (off < this.nBlockLimit) {
                    return this.aMemBlocks[iBlock].readShort(off, addr);
                }
                return this.aMemBlocks[iBlock].readByte(off, addr) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readByte(0, addr + 1) << 8);
            };
            
            /**
             * getLong(addr)
             *
             * Use bus.getLong() for physical addresses, and cpu.getLong() for linear addresses; the latter takes care
             * of paging, cycle counts, and BACKTRACK states, if any.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} long (32-bit) value at that address
             */
            X86CPU.prototype.getLong = function getLong(addr)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.bus.readBackTrack(addr);
                    this.backTrack.btiMemHi = this.bus.readBackTrack(addr + 1);
                }
                if (off < this.nBlockLimit - 2) {
                    return this.aMemBlocks[iBlock].readLong(off, addr);
                }
                var nShift = (off & 0x3) << 3;
                return (this.aMemBlocks[iBlock].readLong(off & ~0x3, addr) >>> nShift) | (this.aMemBlocks[(iBlock + 1) & this.nBlockMask].readLong(0, addr + 3) << (32 - nShift));
            };
            
            /**
             * setByte(addr, b)
             *
             * Use bus.setByte() for physical addresses, and cpu.setByte() for linear addresses; the latter takes care
             * of paging, cycle counts, and BACKTRACK states, if any.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @param {number} b is the byte (8-bit) value to write (which we truncate to 8 bits; required by opSTOSb)
             */
            X86CPU.prototype.setByte = function setByte(addr, b)
            {
                if (BACKTRACK) this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
                this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].writeByte(addr & this.nBlockLimit, b & 0xff, addr);
            };
            
            /**
             * setShort(addr, w)
             *
             * Use bus.setShort() for physical addresses, and cpu.setShort() for linear addresses; the latter takes care
             * of paging, cycle counts, and BACKTRACK states, if any.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @param {number} w is the word (16-bit) value to write (which we truncate to 16 bits to be safe)
             */
            X86CPU.prototype.setShort = function setShort(addr, w)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                /*
                 * On the 8088, it takes 4 cycles to write the additional byte REGARDLESS whether the address is odd or even.
                 * TODO: For the 8086, the penalty is actually "(addr & 0x1) << 2" (4 additional cycles only when the address is odd).
                 */
                this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
            
                if (BACKTRACK) {
                    this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
                    this.bus.writeBackTrack(addr + 1, this.backTrack.btiMemHi);
                }
                if (off < this.nBlockLimit) {
                    this.aMemBlocks[iBlock].writeShort(off, w & 0xffff, addr);
                    return;
                }
                this.aMemBlocks[iBlock++].writeByte(off, w & 0xff, addr);
                this.aMemBlocks[iBlock & this.nBlockMask].writeByte(0, (w >> 8) & 0xff, addr + 1);
            };
            
            /**
             * setLong(addr, l)
             *
             * Use bus.setLong() for physical addresses, and cpu.setLong() for linear addresses; the latter takes care
             * of paging, cycle counts, and BACKTRACK states, if any.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @param {number} l is the long (32-bit) value to write
             */
            X86CPU.prototype.setLong = function setLong(addr, l)
            {
                var off = addr & this.nBlockLimit;
                var iBlock = (addr & this.nMemMask) >>> this.nBlockShift;
                this.nStepCycles -= this.cycleCounts.nWordCyclePenalty;
            
                if (BACKTRACK) {
                    this.bus.writeBackTrack(addr, this.backTrack.btiMemLo);
                    this.bus.writeBackTrack(addr + 1, this.backTrack.btiMemHi);
                }
                if (off < this.nBlockLimit - 2) {
                    this.aMemBlocks[iBlock].writeLong(off, l, addr);
                    return;
                }
                var lPrev, nShift = (off & 0x3) << 3;
                off &= ~0x3;
                lPrev = this.aMemBlocks[iBlock].readLong(off, addr);
                this.aMemBlocks[iBlock].writeLong(off, (lPrev & ~(-1 << nShift)) | (l << nShift), addr);
                iBlock = (iBlock + 1) & this.nBlockMask;
                addr += 3;
                lPrev = this.aMemBlocks[iBlock].readLong(0, addr);
                this.aMemBlocks[iBlock].writeLong(0, (lPrev & (-1 << nShift)) | (l >>> (32 - nShift)), addr);
            };
            
            /**
             * getEAByte(seg, off)
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.getEAByte = function(seg, off)
            {
                this.segEA = seg;
                this.regEA = seg.checkRead(this.offEA = off, 1);
                if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                var b = this.getByte(this.regEA);
                if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMemLo;
                return b;
            };
            
            /**
             * getEAByteData(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.getEAByteData = function(off)
            {
                return this.getEAByte(this.segData, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * getEAByteStack(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.getEAByteStack = function(off)
            {
                return this.getEAByte(this.segStack, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * getEAWord(seg, off)
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.getEAWord = function(seg, off)
            {
                this.segEA = seg;
                this.regEA = seg.checkRead(this.offEA = off, (I386? this.dataSize : 2));
                if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                var w = this.getWord(this.regEA);
                if (BACKTRACK) {
                    this.backTrack.btiEALo = this.backTrack.btiMemLo;
                    this.backTrack.btiEAHi = this.backTrack.btiMemHi;
                }
                return w;
            };
            
            /**
             * getEAWordData(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.getEAWordData = function(off)
            {
                return this.getEAWord(this.segData, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * getEAWordStack(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.getEAWordStack = function(off)
            {
                return this.getEAWord(this.segStack, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * modEAByte(seg, off)
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.modEAByte = function(seg, off)
            {
                this.segEA = seg;
                this.regEAWrite = this.regEA = seg.checkRead(this.offEA = off, 1);
                if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                var b = this.getByte(this.regEA);
                if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiMemLo;
                return b;
            };
            
            /**
             * modEAByteData(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.modEAByteData = function(off)
            {
                return this.modEAByte(this.segData, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * modEAByteStack(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.modEAByteStack = function(off)
            {
                return this.modEAByte(this.segStack, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * modEAWord(seg, off)
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.modEAWord = function(seg, off)
            {
                this.segEA = seg;
                this.regEAWrite = this.regEA = seg.checkRead(this.offEA = off, (I386? this.dataSize : 2));
                if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                var w = this.getWord(this.regEA);
                if (BACKTRACK) {
                    this.backTrack.btiEALo = this.backTrack.btiMemLo;
                    this.backTrack.btiEAHi = this.backTrack.btiMemHi;
                }
                return w;
            };
            
            /**
             * modEAWordData(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.modEAWordData = function(off)
            {
                return this.modEAWord(this.segData, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * modEAWordStack(off)
             *
             * @this {X86CPU}
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.modEAWordStack = function(off)
            {
                return this.modEAWord(this.segStack, off & (I386? this.addrMask : 0xffff));
            };
            
            /**
             * setEAByte(b)
             *
             * @this {X86CPU}
             * @param {number} b is the byte (8-bit) value to write
             */
            X86CPU.prototype.setEAByte = function(b)
            {
                if (this.opFlags & X86.OPFLAG.NOWRITE) return;
                if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiEALo;
                this.setByte(this.segEA.checkWrite(this.offEA, 1), b);
            };
            
            /**
             * setEAWord(w)
             *
             * @this {X86CPU}
             * @param {number} w is the word (16-bit) value to write
             */
            X86CPU.prototype.setEAWord = function(w)
            {
                if (this.opFlags & X86.OPFLAG.NOWRITE) return;
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiEALo;
                    this.backTrack.btiMemHi = this.backTrack.btiEAHi;
                }
                if (!I386) {
                    this.setShort(this.segEA.checkWrite(this.offEA, 2), w);
                } else {
                    this.setWord(this.segEA.checkWrite(this.offEA, this.dataSize), w);
                }
            };
            
            /**
             * getSOByte(seg, off)
             *
             * This is like getEAByte(), but it does NOT update regEA.
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.getSOByte = function(seg, off)
             {
                return this.getByte(seg.checkRead(off, 1));
            };
            
            /**
             * getSOWord(seg, off)
             *
             * This is like getEAWord(), but it does NOT update regEA.
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @return {number} word (16-bit) value at that address
             */
            X86CPU.prototype.getSOWord = function(seg, off)
            {
                if (!I386) {
                    return this.getShort(seg.checkRead(off, 2));
                } else {
                    return this.getWord(seg.checkRead(off, this.dataSize));
                }
            };
            
            /**
             * setSOByte(seg, off, b)
             *
             * This is like setEAByte(), but it does NOT update regEAWrite.
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @param {number} b is the byte (8-bit) value to write
             */
            X86CPU.prototype.setSOByte = function(seg, off, b)
            {
                this.setByte(seg.checkWrite(off, 1), b);
            };
            
            /**
             * setSOWord(seg, off, w)
             *
             * This is like setEAWord(), but it does NOT update regEAWrite.
             *
             * @this {X86CPU}
             * @param {X86Seg} seg register (eg, segDS)
             * @param {number} off is a segment-relative offset
             * @param {number} w is the word (16-bit) value to write
             */
            X86CPU.prototype.setSOWord = function(seg, off, w)
            {
                if (!I386) {
                    this.setShort(seg.checkWrite(off, 2), w);
                } else {
                    this.setWord(seg.checkWrite(off, this.dataSize), w);
                }
            };
            
            /**
             * getBytePrefetch(addr)
             *
             * Return the next byte from the prefetch queue, prefetching it now if necessary.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} byte (8-bit) value at that address
             */
            X86CPU.prototype.getBytePrefetch = function(addr)
            {
                if (this.opFlags & X86.OPFLAG.NOREAD) return 0;
                var b;
                if (!this.cbPrefetchQueued) {
                    if (MAXDEBUG) {
                        this.printMessage("  getBytePrefetch[" + this.iPrefetchTail + "]: filling");
                        this.assert(addr == this.addrPrefetchHead, "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): invalid head address (" + str.toHex(this.addrPrefetchHead) + ")");
                        this.assert(this.iPrefetchTail == this.iPrefetchHead, "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): head (" + this.iPrefetchHead + ") does not match tail (" + this.iPrefetchTail + ")");
                    }
                    this.fillPrefetch(1);
                    this.nBusCycles += 4;
                    /*
                     * This code effectively inlines this.fillPrefetch(1), but without queueing the byte, so it's an optimization
                     * with side-effects we may not want, and in any case, while it seemed to improve Safari's performance slightly,
                     * it did nothing for the oddball Chrome performance I'm seeing with PREFETCH enabled.
                     *
                     *      b = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
                     *      this.nBusCycles += 4;
                     *      this.cbPrefetchValid = 0;
                     *      this.addrPrefetchHead = (addr + 1) & this.nMemMask;
                     *      return b;
                     */
                }
                b = this.aPrefetch[this.iPrefetchTail] & 0xff;
                if (MAXDEBUG) {
                    this.printMessage("  getBytePrefetch[" + this.iPrefetchTail + "]: " + str.toHex(addr) + ":" + str.toHexByte(b));
                    this.assert(addr == (this.aPrefetch[this.iPrefetchTail] >> 8), "X86CPU.getBytePrefetch(" + str.toHex(addr) + "): invalid tail address (" + str.toHex(this.aPrefetch[this.iPrefetchTail] >> 8) + ")");
                }
                this.iPrefetchTail = (this.iPrefetchTail + 1) & X86CPU.PREFETCH.MASK;
                this.cbPrefetchQueued--;
                return b;
            };
            
            /**
             * getShortPrefetch(addr)
             *
             * Return the next short from the prefetch queue.  There are 3 cases to consider:
             *
             *  1) Both bytes have been prefetched; no bytes need be fetched from memory
             *  2) Only the low byte has been prefetched; the high byte must be fetched from memory
             *  3) Neither byte has been prefetched; both bytes must be fetched from memory
             *
             * However, since we want to mirror getBytePrefetch's behavior of fetching all bytes through
             * the prefetch queue, we're taking the easy way out and simply calling getBytePrefetch() twice.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} short (16-bit) value at that address
             */
            X86CPU.prototype.getShortPrefetch = function(addr)
            {
                return this.getBytePrefetch(addr) | (this.getBytePrefetch(addr + 1) << 8);
            };
            
            /**
             * getLongPrefetch(addr)
             *
             * Return the next long from the prefetch queue.  Similar to getShortPrefetch(), we take the
             * easy way out and call getShortPrefetch() twice.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} long (32-bit) value at that address
             */
            X86CPU.prototype.getLongPrefetch = function(addr)
            {
                return this.getShortPrefetch(addr) | (this.getShortPrefetch(addr + 2) << 16);
            };
            
            /**
             * getWordPrefetch(addr)
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address
             * @return {number} short (16-bit) or long (32-bit value as appropriate
             */
            X86CPU.prototype.getWordPrefetch = function(addr)
            {
                return (I386 && this.dataSize == 4? this.getLongPrefetch(addr) : this.getShortPrefetch(addr));
            };
            
            /**
             * fillPrefetch(n)
             *
             * Fill the prefetch queue with n instruction bytes.
             *
             * @this {X86CPU}
             * @param {number} n is the number of instruction bytes to fetch
             */
            X86CPU.prototype.fillPrefetch = function(n)
            {
                while (n-- > 0 && this.cbPrefetchQueued < X86CPU.PREFETCH.QUEUE) {
                    var addr = this.addrPrefetchHead;
                    var b = this.aMemBlocks[(addr & this.nMemMask) >>> this.nBlockShift].readByte(addr & this.nBlockLimit, addr);
                    this.aPrefetch[this.iPrefetchHead] = b | (addr << 8);
                    if (MAXDEBUG) this.printMessage("     fillPrefetch[" + this.iPrefetchHead + "]: " + str.toHex(addr) + ":" + str.toHexByte(b));
                    this.addrPrefetchHead = (addr + 1) & this.nMemMask;
                    this.iPrefetchHead = (this.iPrefetchHead + 1) & X86CPU.PREFETCH.MASK;
                    this.cbPrefetchQueued++;
                    /*
                     * We could probably allow cbPrefetchValid to grow as large as X86CPU.PREFETCH.ARRAY-1, but I'm not
                     * sure there's any advantage to that; certainly the tiny values we expect to see from advancePrefetch()
                     * wouldn't justify that.
                     */
                    if (this.cbPrefetchValid < X86CPU.PREFETCH.QUEUE) this.cbPrefetchValid++;
                }
            };
            
            /**
             * flushPrefetch(addr)
             *
             * Empty the prefetch queue.
             *
             * @this {X86CPU}
             * @param {number} addr is a linear address of the current program counter (regLIP)
             */
            X86CPU.prototype.flushPrefetch = function(addr)
            {
                this.addrPrefetchHead = addr;
                this.iPrefetchTail = this.iPrefetchHead = this.cbPrefetchQueued = this.cbPrefetchValid = 0;
                if (MAXDEBUG && addr !== undefined) this.printMessage("    flushPrefetch[-]: " + str.toHex(addr));
            };
            
            /**
             * advancePrefetch(inc)
             *
             * Advance the prefetch queue tail.  This is used, for example, in cases where the IP is rewound
             * to the start of a repeated string instruction (ie, a string instruction with a REP and possibly
             * other prefixes).
             *
             * If a negative increment takes us beyond what's still valid in the prefetch queue, or if a positive
             * increment takes us beyond what's been queued so far, then we simply flush the queue.
             *
             * @this {X86CPU}
             * @param {number} inc (may be +/-)
             */
            X86CPU.prototype.advancePrefetch = function(inc)
            {
                if (inc < 0 && this.cbPrefetchQueued - inc <= this.cbPrefetchValid || inc > 0 && inc < this.cbPrefetchQueued) {
                    this.iPrefetchTail = (this.iPrefetchTail + inc) & X86CPU.PREFETCH.MASK;
                    this.cbPrefetchQueued -= inc;
                } else {
                    this.flushPrefetch(this.regLIP);
                    if (MAXDEBUG) this.printMessage("advancePrefetch(" + inc + "): flushed");
                }
            };
            
            /**
             * getIPByte()
             *
             * @this {X86CPU}
             * @return {number} byte at the current IP; IP advanced by 1
             */
            X86CPU.prototype.getIPByte = function()
            {
                var b = (PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP));
                if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                this.advanceIP(1);
                return b;
            };
            
            /**
             * getIPShort()
             *
             * @this {X86CPU}
             * @return {number} short at the current IP; IP advanced by 2
             */
            X86CPU.prototype.getIPShort = function()
            {
                var w = (PREFETCH? this.getShortPrefetch(this.regLIP) : this.getShort(this.regLIP));
                if (BACKTRACK) {
                    this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                    this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                }
                this.advanceIP(2);
                return w;
            };
            
            /**
             * getIPLong()
             *
             * @this {X86CPU}
             * @return {number} long at the current IP; IP advanced by 4
             */
            X86CPU.prototype.getIPLong = function()
            {
                var l = (PREFETCH? this.getLongPrefetch(this.regLIP) : this.getLong(this.regLIP));
                if (BACKTRACK) {
                    this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                    this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                }
                this.advanceIP(4);
                return l;
            };
            
            /**
             * getIPAddr()
             *
             * @this {X86CPU}
             * @return {number} word at the current IP; IP advanced by 2 or 4, depending on address size
             */
            X86CPU.prototype.getIPAddr = function()
            {
                /*
                 * TODO: Add PREFETCH support to this function
                 */
                var w = this.getAddr(this.regLIP);
                if (BACKTRACK) {
                    this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                    this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                }
                this.advanceIP(this.addrSize);
                return w;
            };
            
            /**
             * getIPWord()
             *
             * @this {X86CPU}
             * @return {number} word at the current IP; IP advanced by 2 or 4, depending on operand size
             */
            X86CPU.prototype.getIPWord = function()
            {
                var w = (PREFETCH? this.getWordPrefetch(this.regLIP) : this.getWord(this.regLIP));
                if (BACKTRACK) {
                    this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                    this.bus.updateBackTrackCode(this.regLIP + 1, this.backTrack.btiMemHi);
                }
                this.advanceIP(this.dataSize);
                return w;
            };
            
            /**
             * getIPDisp()
             *
             * @this {X86CPU}
             * @return {number} sign-extended value from the byte at the current IP; IP advanced by 1
             */
            X86CPU.prototype.getIPDisp = function()
            {
                var w = ((PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP)) << 24) >> 24;
                if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                this.advanceIP(1);
                return w;
            };
            
            /**
             * getSIBAddr(mod)
             *
             * @this {X86CPU}
             * @param {number} mod
             * @return {number}
             */
            X86CPU.prototype.getSIBAddr = function(mod)
            {
                var b = PREFETCH? this.getBytePrefetch(this.regLIP) : this.getByte(this.regLIP);
                if (BACKTRACK) this.bus.updateBackTrackCode(this.regLIP, this.backTrack.btiMemLo);
                this.advanceIP(1);
                return X86ModSIB.aOpModSIB[b].call(this, mod);
            };
            
            /**
             * popWord()
             *
             * @this {X86CPU}
             * @return {number} word popped from the current SP; SP increased by 2 or 4
             */
            X86CPU.prototype.popWord = function()
            {
                var w = this.getWord(this.regLSP);
                this.regLSP = (this.regLSP + (I386? this.dataSize : 2))|0;
                /*
                 * Properly comparing regLSP to regLSPLimit would normally require coercing both to unsigned
                 * (ie, floating-point) values.  But instead, we do a subtraction, (regLSPLimit - regLSP), and
                 * if the result is negative, we need only be concerned if the signs of both numbers are the same
                 * (ie, the sign of their XOR'ed union is positive).
                 *
                 * TODO: I'm combining the old 8088 address-wrap check with the new segment-limit check,
                 * even though the correct time to do the latter is immediately BEFORE the fetch, not AFTER;
                 * I'm working around this for now by applying a -1 fudge factor to the fault check below.
                 */
                var off = ((this.regLSPLimit - this.regLSP)|0);
                if (off < 0 && (this.regLSPLimit ^ this.regLSP) >= 0) {
                    /*
                     * There's no such thing as an SS fault on the 8086/8088, and I'm assuming that, on newer
                     * processors, when the stack segment limit is set to the maximum, it's OK for the stack to wrap.
                     */
                    if (this.model <= X86.MODEL_8088 || !this.segSS.fExpDown && this.segSS.limit == this.segSS.addrMask || this.segSS.fExpDown && !this.segSS.limit) {
                        this.setSP((this.regLSP - this.segSS.base) & this.segSS.addrMask);
                    } else if (off < -1) {          // fudge factor
                        X86.fnFault.call(this, X86.EXCEPTION.SS_FAULT, 0);
                    }
                }
                return w;
            };
            
            /**
             * pushWord(w)
             *
             * @this {X86CPU}
             * @param {number} w is the word (16-bit) value to push at current SP; SP decreased by 2 or 4
             */
            X86CPU.prototype.pushWord = function(w)
            {
                this.assert((w & this.dataMask) == w);
                this.regLSP = (this.regLSP - (I386? this.dataSize : 2))|0;
                /*
                 * Properly comparing regLSP to regLSPLimitLow would normally require coercing both to unsigned
                 * (ie, floating-point) values.  But instead, we do a subtraction, (regLSP - regLSPLimitLow), and
                 * if the result is negative, we need only be concerned if the signs of both numbers are the same
                 * (ie, the sign of their XOR'ed union is positive).
                 */
                if (((this.regLSP - this.regLSPLimitLow)|0) < 0 && (this.regLSPLimitLow ^ this.regLSP) >= 0) {
                    /*
                     * There's no such thing as an SS fault on the 8086/8088, and I'm assuming that, on newer
                     * processors, when the stack segment limit is set to the maximum, it's OK for the stack to wrap.
                     */
                    if (this.model <= X86.MODEL_8088 || !this.segSS.fExpDown && this.segSS.limit == this.segSS.addrMask || this.segSS.fExpDown && !this.segSS.limit) {
                        this.setSP((this.regLSP - this.segSS.base) & this.segSS.addrMask);
                    } else {
                        X86.fnFault.call(this, X86.EXCEPTION.SS_FAULT, 0);
                    }
                }
                this.setWord(this.regLSP, w);
            };
            
            /**
             * setDMA(fActive)
             *
             * This is called by the ChipSet component to update DMA status.
             *
             * @this {X86CPU}
             * @param {boolean} fActive is true to set INTFLAG.DMA, false to clear
             *
             X86CPU.prototype.setDMA = function(fActive)
             {
                if (this.chipset) {
                    if (fActive) {
                        this.intFlags |= X86.INTFLAG.DMA;
                    } else {
                        this.intFlags &= ~X86.INTFLAG.DMA;
                    }
                }
            };
             */
            
            /**
             * checkINTR()
             *
             * This must only be called when intFlags (containing the simulated INTFLAG.INTR signal) is known to be set.
             * Note that it's perfectly possible that between the time updateINTR(true) was called and we request the
             * interrupt vector number below, the interrupt could have been cleared or masked, in which case getIRRVector()
             * will return -1 and we'll simply clear INTFLAG.INTR.
             *
             * intFlags has been overloaded with the INTFLAG.TRAP bit as well, since the acknowledgment of h/w interrupts
             * and the Trap flag are similar; they must both honor the NOINTR suppression flag, and stepCPU() shouldn't
             * have to check multiple variables when deciding whether to simulate an interrupt.
             *
             * This function also includes a check for the new async INTFLAG.DMA flag, which is triggered by a ChipSet call
             * to setDMA().  This DMA flag actually has nothing to do with interrupts; it's simply an expedient way to
             * piggy-back on the CPU's execution logic, to help drive async DMA requests.
             *
             * Originally, DMA requests (eg, FDC or HDC I/O operations) were all handled synchronously, since no actual
             * I/O was required to satisfy the request; from the CPU's perspective, this meant DMA operations were virtually
             * instantaneous.  However, with the introduction of remote disk connections, some actual I/O may now be required;
             * in practice, this means that the FIRST byte requested as part of a DMA operation may require a callback to
             * finish, while all remaining bytes will be retrieved during subsequent checkINTR() calls -- unless of course
             * additional remote I/O operations are required to complete the DMA operation.
             *
             * As a result, the CPU will run slightly slower while an async DMA request is in progress, but the slowdown
             * should be negligible.  One downside is that this slowdown will be in effect for the entire duration of the
             * I/O (ie, even while we're waiting for the remote I/O to finish), so the ChipSet component should avoid
             * calling setDMA() whenever possible.
             *
             * TODO: While comparing SYMDEB tracing in both PCjs and VMware, I noticed that after single-stepping ANY
             * segment-load instruction, SYMDEB would get control immediately after that instruction in VMware, whereas
             * I delay acknowledgment of the Trap flag until the *following* instruction, so in PCjs, SYMDEB doesn't get
             * control until the following instruction.  I think PCjs behavior is correct, at least for SS.
             *
             * ERRATA: Early revisions of the 8086/8088 failed to suppress hardware interrupts (and possibly also Trap
             * acknowledgements) after an SS load, but Intel corrected the problem at some point; however, I don't know when
             * that change was made or which IBM PC models may have been affected, if any.  TODO: More research required.
             *
             * WARNING: There is also a priority consideration here.  On the 8086/8088, hardware interrupts have higher
             * priority than Trap interrupts (which is why the code below is written the way it is).  A potentially
             * undesirable side-effect is that a hardware interrupt handler could end up being single-stepped if an
             * external interrupt occurs immediately after the Trap flag is set.  This is why some 8086 debuggers temporarily
             * mask all hardware interrupts during a single-step operation (although that doesn't help with NMIs generated
             * by a coprocessor).  As of the 80286, those priorities were inverted, giving the Trap interrupt higher priority
             * than external interrupts.
             *
             * TODO: Determine the priorities for the 80186.
             *
             * @this {X86CPU}
             * @return {boolean} true if h/w interrupt (or trap) has just been acknowledged, false if not
             */
            X86CPU.prototype.checkINTR = function()
            {
                this.assert(this.intFlags);
                if (!(this.opFlags & X86.OPFLAG.NOINTR)) {
                    /*
                     * As discussed above, the 8086/8088 give hardware interrupts higher priority than the TRAP interrupt,
                     * whereas the 80286 and up give TRAPs higher priority.
                     */
                    var iPriority = (this.model < X86.MODEL_80286? 0 : 1);
                    for (var cPriorities = 0; cPriorities < 2; cPriorities++) {
                        switch(iPriority) {
                        case 0:
                            if ((this.intFlags & X86.INTFLAG.INTR) && (this.regPS & X86.PS.IF)) {
                                var nIDT = this.chipset.getIRRVector();
                                if (nIDT >= -1) {
                                    this.intFlags &= ~X86.INTFLAG.INTR;
                                    if (nIDT >= 0) {
                                        this.intFlags &= ~X86.INTFLAG.HALT;
                                        X86.fnINT.call(this, nIDT, null, 11);
                                        return true;
                                    }
                                }
                            }
                            break;
                        case 1:
                            if ((this.intFlags & X86.INTFLAG.TRAP)) {
                                this.intFlags &= ~X86.INTFLAG.TRAP;
                                X86.fnINT.call(this, X86.EXCEPTION.TRAP, null, 11);
                                return true;
                            }
                            break;
                        }
                        iPriority = 1 - iPriority;
                    }
                }
                if (this.intFlags & X86.INTFLAG.DMA) {
                    if (!this.chipset.checkDMA()) {
                        this.intFlags &= ~X86.INTFLAG.DMA;
                    }
                }
                return false;
            };
            
            /**
             * updateINTR(fRaise)
             *
             * This is called by the ChipSet component whenever a h/w interrupt needs to be simulated.
             * This is how the PIC component simulates raising the INTFLAG.INTR signal.  We will honor the request
             * only if we have a reference back to the ChipSet component.  The CPU will then "respond" by calling
             * checkINTR() and request the corresponding interrupt vector from the ChipSet.
             *
             * @this {X86CPU}
             * @param {boolean} fRaise is true to raise INTFLAG.INTR, false to lower
             */
            X86CPU.prototype.updateINTR = function(fRaise)
            {
                if (this.chipset) {
                    if (fRaise) {
                        this.intFlags |= X86.INTFLAG.INTR;
                    } else {
                        this.intFlags &= ~X86.INTFLAG.INTR;
                    }
                }
            };
            
            /**
             * delayINTR()
             *
             * This is called by the ChipSet component whenever the IMR register is being unmasked, to avoid
             * interrupts being simulated too quickly. This works around a problem in the ROM BIOS "KBD_RESET"
             * (F000:E688) function, which is called with interrupts enabled by the "TST8" (F000:E30D) code.
             *
             * "KBD_RESET" appears to be written with the assumption that CLI is in effect, because it issues an
             * STI immediately after unmasking the keyboard IRQ.  And normally, the STI would delay INTFLAG.INTR
             * long enough to allow AH to be set to 0. But if interrupts are already enabled, an interrupt could
             * theoretically occur before the STI.  And since AH isn't initialized until after the STI, such an
             * interrupt would be missed.
             *
             * I'm assuming this never happens in practice because the PIC isn't that fast.  But for us to
             * guarantee that, we need to provide this function to the ChipSet component.
             *
             * @this {X86CPU}
             */
            X86CPU.prototype.delayINTR = function()
            {
                this.opFlags |= X86.OPFLAG.NOINTR;
            };
            
            /**
             * updateReg(sReg, nValue)
             *
             * This function helps updateStatus() by massaging the register names and values according to
             * CPU type before passing the call to displayValue(); in the "old days", updateStatus() called
             * displayValue() directly (although then it was called displayReg()).
             *
             * @this {X86CPU}
             * @param {string} sReg
             * @param {number} nValue
             */
            X86CPU.prototype.updateReg = function(sReg, nValue)
            {
                var cch = 4;
                if (sReg.length == 1) {
                    cch = 1;
                    nValue = nValue? 1 : 0;
                }
                if (this.model < 80386) {
                    if (sReg.length > 2) {
                        sReg = sReg.substr(1, 2);
                    }
                } else {
                    if (sReg == "PS" || sReg.length > 2) {
                        cch = 8;
                    }
                }
                this.displayValue(sReg, nValue, cch);
            };
            
            /**
             * updateStatus()
             *
             * This provides periodic Control Panel updates (eg, a few times per second; see STATUS_UPDATES_PER_SECOND).
             * this is where we take care of any DOM updates (eg, register values) while the CPU is running.
             *
             * Any high-frequency updates should be performed in updateVideo(), which should avoid DOM updates, since updateVideo()
             * can be called up to 60 times per second (see VIDEO_UPDATES_PER_SECOND).
             *
             * @this {X86CPU}
             * @param {boolean} [fForce] (true will display registers even if the CPU is running and "live" registers are not enabled)
             */
            X86CPU.prototype.updateStatus = function(fForce)
            {
                if (this.cLiveRegs) {
                    if (fForce || !this.aFlags.fRunning || this.aFlags.fDisplayLiveRegs) {
                        this.updateReg("EAX", this.regEAX);
                        this.updateReg("EBX", this.regEBX);
                        this.updateReg("ECX", this.regECX);
                        this.updateReg("EDX", this.regEDX);
                        this.updateReg("ESP", this.getSP());
                        this.updateReg("EBP", this.regEBP);
                        this.updateReg("ESI", this.regESI);
                        this.updateReg("EDI", this.regEDI);
                        this.updateReg("CS", this.getCS());
                        this.updateReg("DS", this.getDS());
                        this.updateReg("SS", this.getSS());
                        this.updateReg("ES", this.getES());
                        this.updateReg("EIP", this.getIP());
                        var regPS = this.getPS();
                        this.updateReg("PS", regPS);
                        this.updateReg("V", (regPS & X86.PS.OF));
                        this.updateReg("D", (regPS & X86.PS.DF));
                        this.updateReg("I", (regPS & X86.PS.IF));
                        this.updateReg("T", (regPS & X86.PS.TF));
                        this.updateReg("S", (regPS & X86.PS.SF));
                        this.updateReg("Z", (regPS & X86.PS.ZF));
                        this.updateReg("A", (regPS & X86.PS.AF));
                        this.updateReg("P", (regPS & X86.PS.PF));
                        this.updateReg("C", (regPS & X86.PS.CF));
                    }
                }
            
                var controlSpeed = this.bindings["speed"];
                if (controlSpeed) controlSpeed.textContent = this.getSpeedCurrent();
            
                this.parent.updateStatus.call(this, fForce);
            };
            
            /**
             * stepCPU(nMinCycles)
             *
             * NOTE: Single-stepping should not be confused with the Trap flag; single-stepping is a Debugger
             * operation that's completely independent of Trap status.  The CPU can go in and out of Trap mode,
             * in and out of h/w interrupt service routines (ISRs), etc, but from the Debugger's perspective,
             * they're all one continuous stream of instructions that can be stepped or run at will.  Moreover,
             * stepping vs. running should never change the behavior of the simulation.
             *
             * Similarly, the Debugger's execution breakpoints have no involvement with the x86 breakpoint instruction
             * (0xCC); the Debugger monitors changes to the regLIP register to implement its own execution breakpoints.
             *
             * As a result, the Debugger's complete independence means you can run other 8086/8088 debuggers
             * (eg, DEBUG) inside the simulation without interference; you can even "debug" them with the Debugger.
             *
             * @this {X86CPU}
             * @param {number} nMinCycles (0 implies a single-step, and therefore breakpoints should be ignored)
             * @return {number} of cycles executed; 0 indicates a pre-execution condition (ie, an execution breakpoint
             * was hit), -1 indicates a post-execution condition (eg, a read or write breakpoint was hit), and a positive
             * number indicates successful completion of that many cycles (which should always be >= nMinCycles).
             */
            X86CPU.prototype.stepCPU = function(nMinCycles)
            {
                /*
                 * The Debugger uses fComplete to determine if the instruction completed (true) or was interrupted
                 * by a breakpoint or some other exceptional condition (false).  NOTE: this does NOT include JavaScript
                 * exceptions, which stepCPU() expects the caller to catch using its own exception handler.
                 *
                 * The CPU relies on the use of stopCPU() rather than fComplete, because the CPU never single-steps
                 * (ie, nMinCycles is always some large number), whereas the Debugger does.  And conversely, when the
                 * Debugger is single-stepping (even when performing multiple single-steps), fRunning is never set,
                 * so stopCPU() would have no effect as far as the Debugger is concerned.
                 */
                this.aFlags.fComplete = true;
            
                /*
                 * fDebugCheck is true if we need to "check" every instruction with the Debugger.
                 */
                var fDebugCheck = this.aFlags.fDebugCheck = (DEBUGGER && this.dbg && this.dbg.checksEnabled());
            
                /*
                 * nDebugState is checked only when fDebugCheck is true, and its sole purpose is to tell the first call
                 * to checkInstruction() that it can skip breakpoint checks, and that will be true ONLY when fStarting is
                 * true OR nMinCycles is zero (the latter means the Debugger is single-stepping).
                 *
                 * Once we snap fStarting, we clear it, because technically, we've moved beyond "starting" and have
                 * officially "started" now.
                 */
                var nDebugState = (!nMinCycles)? -1 : (this.aFlags.fStarting? 0 : 1);
                this.aFlags.fStarting = false;
            
                /*
                 * We move the minimum cycle count to nStepCycles (the number of cycles left to step), so that other
                 * functions have the ability to force that number to zero (eg, stopCPU()), and thus we don't have to check
                 * any other criteria to determine whether we should continue stepping or not.
                 */
                this.nBurstCycles = this.nStepCycles = nMinCycles;
            
                /*
                 * NOTE: Even though runCPU() calls updateAllTimers(), we need an additional call here if we're being
                 * called from the Debugger, so that any single-stepping will update the timers as well.
                 */
                if (this.chipset && !nMinCycles) this.chipset.updateAllTimers();
            
                /*
                 * Let's also suppress h/w interrupts whenever the Debugger is single-stepping an instruction; I'm loathe
                 * to allow Debugger interactions to affect the behavior of the virtual machine in ANY way, but I'm making
                 * this small concession to avoid the occasional and sometimes unexpected Debugger command that ends up
                 * stepping into a hardware interrupt service routine (ISR).
                 *
                 * Note that this is similar to the problem discussed in checkINTR() regarding the priority of external h/w
                 * interrupts vs. Trap interrupts, but they require different solutions, because our Debugger operates
                 * independently of the CPU.
                 *
                 * One exception I make here is when you've asked the Debugger to display PIC messages, the idea being that
                 * if you're watching the PIC that closely, then you want to hardware interrupts to occur regardless.
                 */
                if (!nMinCycles && !this.messageEnabled(Messages.PIC)) this.opFlags |= X86.OPFLAG.NOINTR;
            
                do {
                    var opPrefixes = this.opFlags & X86.OPFLAG_PREFIXES;
                    if (opPrefixes) {
                        this.opPrefixes |= opPrefixes;
                    } else {
                        /*
                         * opLIP is used, among other things, to help string instructions rewind to the first prefix
                         * byte whenever the instruction needs to be repeated.  Repeating string instructions in this
                         * manner (essentially restarting them) is a bit heavy-handed, but ultimately it's more compatible,
                         * because it allows hardware interrupts (as well as Trap processing and Debugger single-stepping)
                         * to occur at any point during the string operation, without any additional effort.
                         *
                         * NOTE: The way we restart string instructions actually fixes an 8086/8088 flaw, because string
                         * instructions with multiple prefixes (eg, a REP and a segment override) would not be restarted
                         * properly following a hardware interrupt.  The recommended workarounds were to either turn off
                         * interrupts or to follow the string instruction with a LOOPNZ back to the first prefix byte.
                         * To emulate the flawed behavior, turn on BUGS_8086.
                         */
                        this.opLIP = this.regLIP;
                        this.segData = this.segDS;
                        this.segStack = this.segSS;
                        this.regEA = this.regEAWrite = X86.ADDR_INVALID;
            
                        if (I386 && (this.opPrefixes & (X86.OPFLAG.ADDRSIZE | X86.OPFLAG.DATASIZE))) {
                            this.resetSizes();
                        }
            
                        this.opPrefixes = this.opFlags & X86.OPFLAG.REPEAT;
            
                        if (this.intFlags) {
                            if (this.checkINTR()) {
                                if (!nMinCycles) {
                                    this.assert(DEBUGGER);  // nMinCycles of zero should be generated ONLY by the Debugger
                                    if (DEBUGGER) {
                                        this.println("interrupt dispatched");
                                        this.opFlags = 0;
                                        break;
                                    }
                                }
                            }
                            if (this.intFlags & X86.INTFLAG.HALT) {
                                /*
                                 * As discussed in opHLT(), the CPU is never REALLY halted by a HLT instruction; instead,
                                 * opHLT() sets X86.INTFLAG.HALT, signalling to us that we're free to end the current burst
                                 * AND that we should not execute any more instructions until checkINTR() indicates a hardware
                                 * interrupt has been requested.
                                 *
                                 * One downside to this approach is that it *might* appear to the careful observer that we
                                 * executed a full complement of instructions during bursts where X86.INTFLAG.HALT was set,
                                 * when in fact we did not.  However, the steady advance of the overall cycle count, and thus
                                 * the steady series calls to stepCPU(), is needed to ensure that timer updates, video updates,
                                 * etc, all continue to occur at the expected rates.
                                 *
                                 * If necessary, we can add another bookkeeping cycle counter (eg, one that keeps tracks of the
                                 * number of cycles during which we did not actually execute any instructions).
                                 */
                                this.nStepCycles = 0;
                                this.opFlags = 0;
                                break;
                            }
                        }
                    }
            
                    if (DEBUGGER && fDebugCheck) {
                        if (this.dbg.checkInstruction(this.regLIP, nDebugState)) {
                            this.stopCPU();
                            break;
                        }
                        nDebugState = 1;
                    }
            
                    if (SAMPLER) {
                        if (++this.iSampleFreq >= this.nSampleFreq) {
                            this.iSampleFreq = 0;
                            if (this.iSampleSkip < this.nSampleSkip) {
                                this.iSampleSkip++;
                            } else {
                                if (this.iSampleNext == this.nSamples) {
                                    this.println("sample buffer full");
                                    this.stopCPU();
                                    break;
                                }
                                var t = this.regLIP + this.getCycles();
                                var n = this.aSamples[this.iSampleNext];
                                if (n !== -1) {
                                    if (n !== t) {
                                        this.println("sample deviation at index " + this.iSampleNext + ": current LIP=" + str.toHex(this.regLIP));
                                        this.stopCPU();
                                        break;
                                    }
                                } else {
                                    this.aSamples[this.iSampleNext] = t;
                                }
                                this.iSampleNext++;
                            }
                        }
                    }
            
                    this.opFlags = 0;
            
                    if (DEBUG || PREFETCH) {
                        this.nBusCycles = 0;
                        this.nSnapCycles = this.nStepCycles;
                    }
            
                    this.aOps[this.getIPByte()].call(this);
            
                    if (PREFETCH) {
                        var nSpareCycles = (this.nSnapCycles - this.nStepCycles) - this.nBusCycles;
                        if (nSpareCycles >= 4) {
                            this.fillPrefetch(nSpareCycles >> 2);   // for every 4 spare cycles, fetch 1 instruction byte
                        }
                    }
            
                    if (DEBUG) {
                        /*
                         * Make sure that every instruction is assessing a cycle cost, and that the cost is a net positive.
                         */
                        if (this.aFlags.fComplete && this.nStepCycles >= this.nSnapCycles && !(this.opFlags & X86.OPFLAG_PREFIXES)) {
                            this.println("cycle miscount: " + (this.nSnapCycles - this.nStepCycles));
                            this.setIP(this.opLIP - this.segCS.base);
                            this.stopCPU();
                            break;
                        }
                    }
            
                } while (this.nStepCycles > 0);
            
                return (this.aFlags.fComplete? this.nBurstCycles - this.nStepCycles : (this.aFlags.fComplete === undefined? 0 : -1));
            };
            
            /**
             * X86CPU.init()
             *
             * This function operates on every HTML element of class "cpu", extracting the
             * JSON-encoded parameters for the X86CPU constructor from the element's "data-value"
             * attribute, invoking the constructor (which in turn invokes the CPU constructor)
             * to create a X86CPU component, and then binding any associated HTML controls to the
             * new component.
             */
            X86CPU.init = function()
            {
                var aeCPUs = Component.getElementsByClass(window.document, PCJSCLASS, "cpu");
                for (var iCPU = 0; iCPU < aeCPUs.length; iCPU++) {
                    var eCPU = aeCPUs[iCPU];
                    var parmsCPU = Component.getComponentParms(eCPU);
                    var cpu = new X86CPU(parmsCPU);
                    Component.bindComponentControls(cpu, eCPU, PCJSCLASS);
                }
            };
            
            /*
             * Initialize every CPU module on the page
             */
            web.onInit(X86CPU.init);
            
            if (typeof module !== 'undefined') module.exports = X86CPU;
            
          • x86func.js
            /**
             * @fileoverview Implements PCjs 8086 opcode helpers.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var Messages    = require("./messages");
                var X86         = require("./x86");
            }
            
            /**
             * fnADCb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnADCb = function ADCb(dst, src)
            {
                var b = (dst + src + this.getCarry())|0;
                this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return b & 0xff;
            };
            
            /**
             * fnADCw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnADCw = function ADCw(dst, src)
            {
                var w = (dst + src + this.getCarry())|0;
                this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return w & this.dataMask;
            };
            
            /**
             * fnADDb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnADDb = function ADDb(dst, src)
            {
                var b = (dst + src)|0;
                this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return b & 0xff;
            };
            
            /**
             * fnADDw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnADDw = function ADDw(dst, src)
            {
                var w = (dst + src)|0;
                this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return w & this.dataMask;
            };
            
            /**
             * fnANDb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnANDb = function ANDb(dst, src)
            {
                var b = dst & src;
                this.setLogicResult(b, X86.RESULT.BYTE);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return b;
            };
            
            /**
             * fnANDw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnANDw = function ANDw(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return this.setLogicResult(dst & src, this.dataType);
            };
            
            /**
             * fnARPL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnARPL = function ARPL(dst, src)
            {
                this.nStepCycles -= (10 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                if ((dst & X86.SEL.RPL) < (src & X86.SEL.RPL)) {
                    dst = (dst & ~X86.SEL.RPL) | (src & X86.SEL.RPL);
                    this.setZF();
                    return dst;
                }
                this.clearZF();
                return dst;
            };
            
            /**
             * fnBOUND(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBOUND = function BOUND(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    /*
                     * Generate UD_FAULT (INT 0x06: Invalid Opcode) if src is not a memory operand.
                     */
                    X86.opInvalid.call(this);
                    return dst;
                }
                /*
                 * Note that BOUND performs signed comparisons, so we must transform all arguments into signed values.
                 */
                var wIndex = dst;
                var wLower = this.getWord(this.regEA);
                var wUpper = this.getWord(this.regEA + this.dataSize);
                if (this.dataSize == 2) {
                    wIndex = (dst << 16) >> 16;
                    wLower = (wLower << 16) >> 16;
                    wUpper = (wUpper << 16) >> 16;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesBound;
                if (wIndex < wLower || wIndex > wUpper) {
                    /*
                     * The INT 0x05 handler must be called with CS:IP pointing to the BOUND instruction.
                     *
                     * TODO: Determine the cycle cost when a BOUND exception is triggered, over and above nCyclesBound.
                     */
                    this.setIP(this.opLIP - this.segCS.base);
                    X86.fnINT.call(this, X86.EXCEPTION.BOUND_ERR, null, 0);
                }
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnBSF(dst, src)
             *
             * Scan src starting at bit 0.  If a set bit is found, the bit index is stored in dst and ZF is cleared;
             * otherwise, ZF is set and dst is unchanged.
             *
             * NOTES: Early versions of the 80386 manuals misstated how ZF was set/cleared.  Also, Intel insists that
             * dst is undefined whenever ZF is set, but in fact, the 80386 leaves dst unchanged when that happens;
             * unfortunately, some early 80486s would always modify dst, so it is unsafe to rely on dst when ZF is set.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBSF = function BSF(dst, src)
            {
                var n = 0;
                if (!src) {
                    this.setZF();
                } else {
                    this.clearZF();
                    var bit = 0x1;
                    while (bit & this.dataMask) {
                        if (src & bit) {
                            dst = n;
                            break;
                        }
                        bit <<= 1;
                        n++;                // TODO: Determine if n should be incremented before the bailout for an accurate cycle count
                    }
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesBitScan + n * 3;
                return dst;
            };
            
            /**
             * fnBSR(dst, src)
             *
             * Scan src starting from the highest bit.  If a set bit is found, the bit index is stored in dst and ZF is
             * cleared; otherwise, ZF is set and dst is unchanged.
             *
             * NOTES: Early versions of the 80386 manuals misstated how ZF was set/cleared.  Also, Intel insists that
             * dst is undefined whenever ZF is set, but in fact, the 80386 leaves dst unchanged when that happens;
             * unfortunately, some early 80486s would always modify dst, so it is unsafe to rely on dst when ZF is set.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBSR = function BSR(dst, src)
            {
                var n = 0;
                if (!src) {
                    this.setZF();
                } else {
                    this.clearZF();
                    var i = (this.dataSize == 2? 15 : 31), bit = 1 << i;
                    while (bit) {
                        if (src & bit) {
                            dst = i;
                            break;
                        }
                        bit >>>= 1;
                        n++; i--;           // TODO: Determine if n should be incremented before the bailout for an accurate cycle count
                    }
            
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesBitScan + n * 3;
                return dst;
            };
            
            /**
             * fnBT(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBT = function BT(dst, src)
            {
                if (dst & (1 << (src & 0x1f))) this.setCF(); else this.clearCF();
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitTestR : this.cycleCounts.nOpCyclesBitTestM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnBTC(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBTC = function BTC(dst, src)
            {
                var bit = 1 << (src & 0x1f);
                if (dst & bit) this.setCF(); else this.clearCF();
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
                return dst ^ bit;
            };
            
            /**
             * fnBTR(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBTR = function BTR(dst, src)
            {
                var bit = 1 << (src & 0x1f);
                if (dst & bit) this.setCF(); else this.clearCF();
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
                return dst & ~bit;
            };
            
            /**
             * fnBTS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnBTS = function BTS(dst, src)
            {
                var bit = 1 << (src & 0x1f);
                if (dst & bit) this.setCF(); else this.clearCF();
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesBitSetR : this.cycleCounts.nOpCyclesBitSetM);
                return dst | bit;
            };
            
            /**
             * fnCALLw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnCALLw = function CALLw(dst, src)
            {
                if (DEBUG) this.printMessage("calling " + str.toHex(dst, this.dataSize << 1), this.bitsMessage, true);
                this.pushWord(this.getIP());
                this.setIP(dst);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesCallWR : this.cycleCounts.nOpCyclesCallWM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnCALLF(off, sel)
             *
             * For protected-mode, this function must attempt to load the new code segment first, because if the new segment
             * requires a change in privilege level, the return address must be pushed on the NEW stack, not the current stack.
             *
             * @this {X86CPU}
             * @param {number} off
             * @param {number} sel
             */
            X86.fnCALLF = function CALLF(off, sel)
            {
                if (DEBUG) this.printMessage("calling " + str.toHex(sel, 4) + ':' + str.toHex(off, this.dataSize << 1), this.bitsMessage, true);
                var oldCS = this.getCS();
                var oldIP = this.getIP();
                if (this.setCSIP(off, sel, true) != null) {
                    this.pushWord(oldCS);
                    this.pushWord(oldIP);
                }
            };
            
            /**
             * fnCALLFdw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnCALLFdw = function CALLFdw(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    return X86.fnGRPUndefined.call(this, dst, src);
                }
                X86.fnCALLF.call(this, dst, this.getShort(this.regEA + this.dataSize));
                this.nStepCycles -= this.cycleCounts.nOpCyclesCallDM;
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnCMPb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number} dst unchanged
             */
            X86.fnCMPb = function CMPb(dst, src)
            {
                var b = (dst - src)|0;
                this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnCMPw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number} dst unchanged
             */
            X86.fnCMPw = function CMPw(dst, src)
            {
                var w = (dst - src)|0;
                this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesCompareRM) : this.cycleCounts.nOpCyclesArithRM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnDECb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnDECb = function DECb(dst, src)
            {
                var b = (dst - 1)|0;
                this.setArithResult(dst, 1, b, X86.RESULT.BYTE | X86.RESULT.NOTCF, true);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                return b & 0xff;
            };
            
            /**
             * fnDECr(w)
             *
             * @this {X86CPU}
             * @param {number} w
             * @return {number}
             */
            X86.fnDECr = function DECr(w)
            {
                var result = ((w & this.dataMask) - 1)|0;
                this.setArithResult(w, 1, result, X86.RESULT.WORD | X86.RESULT.NOTCF, true);
                this.nStepCycles -= 2;                          // the register form of INC takes 2 cycles on all CPUs
                return (w & ~this.dataMask) | (result & this.dataMask);
            };
            
            /**
             * fnDECw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnDECw = function DECw(dst, src)
            {
                var w = (dst - 1)|0;
                this.setArithResult(dst, 1, w, X86.RESULT.WORD | X86.RESULT.NOTCF, true);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                return w & 0xffff;
            };
            
            /**
             * fnSet64(lo, hi)
             *
             * @param {number} lo
             * @param {number} hi
             */
            X86.fnSet64 = function Set64(lo, hi)
            {
                return [lo >>> 0, hi >>> 0];
            };
            
            /**
             * fnAdd64(dst, src)
             *
             * Adds src to dst.
             *
             * @param {Array} dst is a 64-bit value
             * @param {Array} src is a 64-bit value
             */
            X86.fnAdd64 = function Add64(dst, src)
            {
                dst[0] += src[0];
                dst[1] += src[1];
                if (dst[0] > 0xffffffff) {
                    dst[0] >>>= 0;          // truncate dst[0] to 32 bits AND keep it unsigned
                    dst[1]++;
                }
            };
            
            /**
             * fnCmp64(dst, src)
             *
             * Compares dst to src, by computing dst - src.
             *
             * @param {Array} dst is a 64-bit value
             * @param {Array} src is a 64-bit value
             * @return {number} > 0 if dst > src, == 0 if dst == src, < 0 if dst < src
             */
            X86.fnCmp64 = function Cmp64(dst, src)
            {
                var result = dst[1] - src[1];
                if (!result) result = dst[0] - src[0];
                return result;
            };
            
            /**
             * fnSub64(dst, src)
             *
             * Subtracts src from dst.
             *
             * @param {Array} dst is a 64-bit value
             * @param {Array} src is a 64-bit value
             */
            X86.fnSub64 = function Sub64(dst, src)
            {
                dst[0] -= src[0];
                dst[1] -= src[1];
                if (dst[0] < 0) {
                    dst[0] >>>= 0;          // truncate dst[0] to 32 bits AND keep it unsigned
                    dst[1]--;
                }
            };
            
            /**
             * fnShr64(dst)
             *
             * Shifts dst right one bit.
             *
             * @param {Array} dst is a 64-bit value
             */
            X86.fnShr64 = function Shr64(dst)
            {
                dst[0] >>>= 1;
                if (dst[1] & 0x1) {
                    dst[0] = (dst[0] | 0x80000000) >>> 0;
                }
                dst[1] >>>= 1;
            };
            
            /**
             * fnDIV32(dstLo, dstHi, src)
             *
             * This sets regMDLo to dstHi:dstLo / src, and regMDHi to dstHi:dstLo % src; all inputs are treated as unsigned.
             *
             * If fMDset is not set, however, then there was a divide exception (ie, the divisor was either zero or too small).
             *
             * Refer to: http://lxr.linux.no/linux+v2.6.22/lib/div64.c
             *
             * @this {X86CPU}
             * @param {number} dstLo (low 32-bit portion of dividend)
             * @param {number} dstHi (high 32-bit portion of dividend)
             * @param {number} src (32-bit divisor)
             */
            X86.fnDIV32 = function DIV32(dstLo, dstHi, src)
            {
                this.fMDSet = false;
            
                src >>>= 0;
                if (!src || src <= (dstHi >>> 0)) return;
            
                var result = 0, bit = 1;
            
                var div = X86.fnSet64(src, 0);
                var rem = X86.fnSet64(dstLo, dstHi);
            
                while (X86.fnCmp64(rem, div) > 0) {
                    X86.fnAdd64(div, div);
                    bit += bit;
                }
                do {
                    if (X86.fnCmp64(rem, div) >= 0) {
                        X86.fnSub64(rem, div);
                        result += bit;
                    }
                    X86.fnShr64(div);
                    bit >>>= 1;
                } while (bit);
            
                this.assert(result <= 0xffffffff && !rem[1]);
            
                this.regMDLo = result;              // result is the quotient, which callers expect in the low MD register
                this.regMDHi = rem[0];              // rem[0] is the remainder, which callers expect in the high MD register
                this.fMDSet = true;
            };
            
            /**
             * fnIDIV32(dstLo, dstHi, src)
             *
             * This sets regMDLo to dstHi:dstLo / src, and regMDHi to dstHi:dstLo % src; all inputs are treated as signed.
             *
             * If fMDset is not set, however, then there was a divide exception (ie, the divisor was either zero or too small).
             *
             * Refer to: http://lxr.linux.no/linux+v2.6.22/lib/div64.c
             *
             * @this {X86CPU}
             * @param {number} dstLo (low 32-bit portion of dividend)
             * @param {number} dstHi (high 32-bit portion of dividend)
             * @param {number} src (32-bit divisor)
             */
            X86.fnIDIV32 = function IDIV32(dstLo, dstHi, src)
            {
                var fNegLo = false, fNegHi = false;
                if (src < 0) {
                    src = -src|0;
                    fNegLo = !fNegLo;
                }
                if (dstHi < 0) {
                    dstLo = -dstLo|0;
                    dstHi = (~dstHi + (dstLo? 0 : 1))|0;
                    fNegHi = true;
                    fNegLo = !fNegLo;
                }
                X86.fnDIV32.call(this, dstLo, dstHi, src);
                if (this.regMDLo > 0x7fffffff) this.fMDSet = false;
                if (fNegLo) this.regMDLo = -this.regMDLo;
                if (fNegHi) this.regMDHi = -this.regMDHi;
            };
            
            /**
             * fnDIVb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (the divisor)
             * @param {number} src (null; AX is the implied src)
             * @return {number} (we return dst unchanged, since it's actually AX that's modified)
             */
            X86.fnDIVb = function DIVb(dst, src)
            {
                /*
                 * Detect zero divisor
                 */
                if (!dst) {
                    X86.fnDIVOverflow.call(this);
                    return dst;
                }
            
                /*
                 * Detect too-small divisor (quotient overflow)
                 */
                var result = ((src = this.regEAX & 0xffff) / dst);
                if (result > 0xff) {
                    X86.fnDIVOverflow.call(this);
                    return dst;
                }
            
                this.fMDSet = true;
                this.regMDLo = (result & 0xff) | (((src % dst) & 0xff) << 8);
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) this.traceLog('DIVb', src, dst, null, this.getPS(), this.regMDLo);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesDivBR : this.cycleCounts.nOpCyclesDivBM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnDIVw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (the divisor)
             * @param {number} src (null; DX:AX or EDX:EAX is the implied src)
             * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
             */
            X86.fnDIVw = function DIVw(dst, src)
            {
                if (this.dataSize == 2) {
                    /*
                     * Detect zero divisor
                     */
                    if (!dst) {
                        X86.fnDIVOverflow.call(this);
                        return dst;
                    }
                    /*
                     * Detect too-small divisor (quotient overflow)
                     *
                     * WARNING: We CANNOT simply do "src = (this.regEDX << 16) | this.regEAX", because if bit 15 of DX
                     * is set, JavaScript will create a negative 32-bit number.  So we instead use non-bit-wise operators
                     * to force JavaScript to create a floating-point value that won't suffer from 32-bit-math side-effects.
                     */
                    src = (this.regEDX & 0xffff) * 0x10000 + (this.regEAX & 0xffff);
                    var result = (src / dst)|0;
                    if (result >= 0x10000) {
                        X86.fnDIVOverflow.call(this);
                        return dst;
                    }
                    this.fMDSet = true;
                    this.regMDLo = (result & 0xffff);
                    this.regMDHi = (src % dst) & 0xffff;
                }
                else {
                    X86.fnDIV32.call(this, this.regEAX, this.regEDX, dst);
                    if (!this.fMDSet) {
                        X86.fnDIVOverflow.call(this);
                        return dst;
                    }
                    this.regMDLo |= 0;
                    this.regMDHi |= 0;
                }
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) {
                    if (this.dataSize == 2) {
                        this.traceLog('DIVw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                    } else {
                        this.traceLog('DIVd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                    }
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesDivWR : this.cycleCounts.nOpCyclesDivWM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnESC(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number} dst unchanged
             */
            X86.fnESC = function ESC(dst, src)
            {
                return dst;
            };
            
            /**
             * fnIDIVb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (the divisor)
             * @param {number} src (null; AX is the implied src)
             * @return {number} (we return dst unchanged, since it's actually AX that's modified)
             */
            X86.fnIDIVb = function IDIVb(dst, src)
            {
                /*
                 * Detect zero divisor
                 */
                if (!dst) {
                    X86.fnDIVOverflow.call(this);
                    return dst;
                }
            
                /*
                 * Detect too-small divisor (quotient overflow)
                 */
                var div = ((dst << 24) >> 24);
                var result = ((src = (this.regEAX << 16) >> 16) / div)|0;
            
                /*
                 * Note the following difference, from "AP-186: Introduction to the 80186 Microprocessor, March 1983":
                 *
                 *      "The 8086 will cause a divide error whenever the absolute value of the quotient is greater then 7FFFH
                 *      (for word operations) or if the absolute value of the quotient is greater than 7FH (for byte operations).
                 *      The 80186 has expanded the range of negative numbers allowed as a quotient by 1 to include 8000H and 80H.
                 *      These numbers represent the most negative numbers representable using 2's complement arithmetic (equaling
                 *      -32768 and -128 in decimal, respectively)."
                 */
                if (result != ((result << 24) >> 24) || this.model == X86.MODEL_8086 && result == -128) {
                    X86.fnDIVOverflow.call(this);
                    return dst;
                }
            
                this.fMDSet = true;
                this.regMDLo = (result & 0xff) | (((src % div) & 0xff) << 8);
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) this.traceLog('IDIVb', src, dst, null, this.getPS(), this.regMDLo);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIDivBR : this.cycleCounts.nOpCyclesIDivBM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnIDIVw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (the divisor)
             * @param {number} src (null; DX:AX or EDX:EAX is the implied src)
             * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
             */
            X86.fnIDIVw = function IDIVw(dst, src)
            {
                if (this.dataSize == 2) {
                    /*
                     * Detect zero divisor
                     */
                    if (!dst) {
                        X86.fnDIVOverflow.call(this);
                        return dst;
                    }
            
                    /*
                     * Detect too-small divisor (quotient overflow)
                     */
                    var div = ((dst << 16) >> 16);
                    var result = ((src = (this.regEDX << 16) | (this.regEAX & 0xffff)) / div)|0;
            
                    /*
                     * Note the following difference, from "AP-186: Introduction to the 80186 Microprocessor, March 1983":
                     *
                     *      "The 8086 will cause a divide error whenever the absolute value of the quotient is greater then 7FFFH
                     *      (for word operations) or if the absolute value of the quotient is greater than 7FH (for byte operations).
                     *      The 80186 has expanded the range of negative numbers allowed as a quotient by 1 to include 8000H and 80H.
                     *      These numbers represent the most negative numbers representable using 2's complement arithmetic (equaling
                     *      -32768 and -128 in decimal, respectively)."
                     */
                    if (result != ((result << 16) >> 16) || this.model == X86.MODEL_8086 && result == -32768) {
                        X86.fnDIVOverflow.call(this);
                        return dst;
                    }
            
                    this.fMDSet = true;
                    this.regMDLo = (result & 0xffff);
                    this.regMDHi = (src % div) & 0xffff;
                }
                else {
                    X86.fnIDIV32.call(this, this.regEAX, this.regEDX, dst);
                    if (!this.fMDSet) {
                        X86.fnDIVOverflow.call(this);
                        return dst;
                    }
                    this.regMDLo |= 0;
                    this.regMDHi |= 0;
                }
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) {
                    if (this.dataSize == 2) {
                        this.traceLog('IDIVw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                    } else {
                        this.traceLog('IDIVd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                    }
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIDivWR : this.cycleCounts.nOpCyclesIDivWM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnIMUL8(dst, src)
             *
             * 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
             *
             *      "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
             *      unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
             *
             * However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
             *
             * (80186/80188 and up)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnIMUL8 = function IMUL8(dst, src)
            {
                dst = this.getIPByte();
                var result = (((src << 16) >> 16) * ((dst << 24) >> 24))|0;
            
                if (result > 32767 || result < -32768) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
            
                result &= 0xffff;
                if (DEBUG && DEBUGGER) this.traceLog('IMUL8', dst, src, null, this.getPS(), result);
            
                /*
                 * NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
                 * 22-25 and 29-32 instead of 21 and 24, respectively.  However, accurate cycle counts for the 80186/80188 is
                 * not super-critical. TODO: Fix this someday.
                 */
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
                return result;
            };
            
            /**
             * fnIMULb(dst, src)
             *
             * This 16-bit multiplication must indicate when the upper 8 bits are simply a sign-extension of the
             * lower 8 bits (carry clear) and when the upper 8 bits contain significant bits (carry set).  The latter
             * will occur whenever a positive result is > 127 (0x007f) and whenever a negative result is < -128
             * (0xff80).
             *
             * Example 1: 16 * 4 = 64 (0x0040): carry is clear
             * Example 2: 16 * 8 = 128 (0x0080): carry is set (the sign bit no longer fits in the lower 8 bits)
             * Example 3: 16 * -8 (0xf8) = -128 (0xff80): carry is clear (the sign bit *still* fits in the lower 8 bits)
             * Example 4: 16 * -16 (0xf0) = -256 (0xff00): carry is set (the sign bit no longer fits in the lower 8 bits)
             *
             * An earlier version of this function assumed it simply needed to check bit 7 of the result to determine carry,
             * which was completely broken.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null; AL is the implied src)
             * @return {number} (we return dst unchanged, since it's actually AX that's modified)
             */
            X86.fnIMULb = function IMULb(dst, src)
            {
                var result = ((((src = this.regEAX) << 24) >> 24) * ((dst << 24) >> 24))|0;
            
                this.fMDSet = true;
                this.regMDLo = result & 0xffff;
            
                if (result > 127 || result < -128) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) this.traceLog('IMULb', src, dst, null, this.getPS(), this.regMDLo);
            
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulBR : this.cycleCounts.nOpCyclesIMulBM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnIMULn(dst, src)
             *
             * 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
             *
             *      "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
             *      unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
             *
             * However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
             *
             * (80186/80188 and up)
             *
             * @this {X86CPU}
             * @param {number} dst (not used)
             * @param {number} src
             * @return {number}
             */
            X86.fnIMULn = function IMULn(dst, src)
            {
                var fOverflow, result;
                dst = this.getIPWord();
                if (this.dataSize == 2) {
                    result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
                    fOverflow = (result > 32767 || result < -32768);
                } else {
                    result = (src * dst);
                    fOverflow = (result > 2147483647 || result < -2147483648);
                    this.assert(fOverflow == (result != (result|0)));
                }
            
                if (fOverflow) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
            
                result &= this.dataMask;
                if (DEBUG && DEBUGGER) this.traceLog('IMULn', dst, src, null, this.getPS(), result);
            
                /*
                 * NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
                 * 22-25 and 29-32 instead of 21 and 24, respectively.  However, accurate cycle counts for the 80186/80188 is
                 * not super-critical. TODO: Fix this someday.
                 */
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
                return result;
            };
            
            /**
             * fnIMUL32(dst, src)
             *
             * This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as signed.
             *
             * TODO: Some potential optimizations include:
             *
             *  1) Early outs if either parameter is zero, since the result will obviously be zero
             *  2) Using "normal" JavaScript multiplication if both parameters are >= -32768 && <= 32767
             *
             * Refer to: http://stackoverflow.com/questions/13597364/32-bit-signed-multiplication-with-a-64-bit-result-in-javascript
             *
             * @this {X86CPU}
             * @param {number} dst (any 32-bit number, treated as signed)
             * @param {number} src (any 32-bit number, treated as signed)
             */
            X86.fnIMUL32 = function IMUL32(dst, src)
            {
                var fNeg = false;
                if (src < 0) {
                    src = -src|0;
                    fNeg = !fNeg;
                }
                if (dst < 0) {
                    dst = -dst|0;
                    fNeg = !fNeg;
                }
                X86.fnMUL32.call(this, dst, src);
                if (fNeg) {
                    this.regMDLo = (~this.regMDLo + 1)|0;
                    this.regMDHi = (~this.regMDHi + (this.regMDLo? 0 : 1))|0;
                }
            };
            
            /**
             * fnIMULw(dst, src)
             *
             * regMDHi:regMDLo = dst * regEAX
             *
             * This 32-bit multiplication must indicate when the upper 16 bits are simply a sign-extension of the
             * lower 16 bits (carry clear) and when the upper 16 bits contain significant bits (carry set).  The latter
             * will occur whenever a positive result is > 32767 (0x00007fff) and whenever a negative result is < -32768
             * (0xffff8000).
             *
             * Example 1: 256 * 64 = 16384 (0x00004000): carry is clear
             * Example 2: 256 * 128 = 32768 (0x00008000): carry is set (the sign bit no longer fits in the lower 16 bits)
             * Example 3: 256 * -128 (0xff80) = -32768 (0xffff8000): carry is clear (the sign bit *still* fits in the lower 16 bits)
             * Example 4: 256 * -256 (0xff00) = -65536 (0xffff0000): carry is set (the sign bit no longer fits in the lower 16 bits)
             *
             * An earlier version of this function assumed it simply needed to check bit 15 of the result to determine carry,
             * which was completely broken.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null; AX or EAX is the implied src)
             * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
             */
            X86.fnIMULw = function IMULw(dst, src)
            {
                var fOverflow;
                if (this.dataSize == 2) {
                    src = this.regEAX & 0xffff;
                    var result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
                    this.fMDSet = true;
                    this.regMDLo = result & 0xffff;
                    this.regMDHi = (result >> 16) & 0xffff;
                    fOverflow = (result > 32767 || result < -32768);
                } else {
                    X86.fnIMUL32.call(this, dst, this.regEAX);
                    fOverflow = (this.regMDHi != (this.regMDLo >> 31));
                }
            
                if (fOverflow) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) {
                    if (this.dataSize == 2) {
                        this.traceLog('IMULw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                    } else {
                        this.traceLog('IMULd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                    }
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulWR : this.cycleCounts.nOpCyclesIMulWM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnIMULrw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnIMULrw = function IMULrw(dst, src)
            {
                var result = (((dst << 16) >> 16) * ((src << 16) >> 16))|0;
                if (result > 32767 || result < -32768) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
                result &= 0xffff;
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulR : this.cycleCounts.nOpCyclesIMulM);
                return result;
            };
            
            /**
             * fnIMULrd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnIMULrd = function IMULrd(dst, src)
            {
                var result = dst * src;
                if (result > 2147483647 || result < -2147483648) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
                result |= 0;
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIMulR : this.cycleCounts.nOpCyclesIMulM);
                return result;
            };
            
            /**
             * fnINCb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnINCb = function INCb(dst, src)
            {
                var b = (dst + 1)|0;
                this.setArithResult(dst, 1, b, X86.RESULT.BYTE | X86.RESULT.NOTCF);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                return b & 0xff;
            };
            
            /**
             * fnINCr(w)
             *
             * @this {X86CPU}
             * @param {number} w
             * @return {number}
             */
            X86.fnINCr = function INCr(w)
            {
                var result = ((w & this.dataMask) + 1)|0;
                this.setArithResult(w, 1, result, X86.RESULT.WORD | X86.RESULT.NOTCF);
                this.nStepCycles -= 2;                          // the register form of INC takes 2 cycles on all CPUs
                return (w & ~this.dataMask) | (result & this.dataMask);
            };
            
            /**
             * fnINCw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnINCw = function INCw(dst, src)
            {
                var w = (dst + 1)|0;
                this.setArithResult(dst, 1, w, X86.RESULT.WORD | X86.RESULT.NOTCF);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesIncR : this.cycleCounts.nOpCyclesIncM);
                return w & 0xffff;
            };
            
            /**
             * fnINT(nIDT, nError, nCycles)
             *
             * NOTE: We no longer use setCSIP(), because it always loads the new CS using segCS.load(), which
             * only knows how to load GDT and LDT descriptors, whereas interrupts must use setCS.loadIDT(), which
             * deals exclusively with IDT descriptors.
             *
             * This means we must take care to replicate critical features of setCSIP(); ie, setting segCS.fCall
             * BEFORE calling loadIDT(), and updating regLIP and regLIPLimit, resetting default operand and address sizes,
             * and flushing the prefetch queue AFTER calling loadIDT().
             *
             * @this {X86CPU}
             * @param {number} nIDT
             * @param {number|null|undefined} nError
             * @param {number} nCycles (in addition to the default of nOpCyclesInt)
             */
            X86.fnINT = function INT(nIDT, nError, nCycles)
            {
                /*
                 * TODO: We assess the cycle cost up front, because otherwise, if loadIDT() fails, no cost may be assessed.
                 */
                this.nStepCycles -= this.cycleCounts.nOpCyclesInt + nCycles;
                this.segCS.fCall = true;
                var oldPS = this.getPS();
                var oldCS = this.getCS();
                var oldIP = this.getIP();
                var addr = this.segCS.loadIDT(nIDT);
                if (addr !== X86.ADDR_INVALID) {
                    this.pushWord(oldPS);
                    this.pushWord(oldCS);
                    this.pushWord(oldIP);
                    if (nError != null) this.pushWord(nError);
                    this.nFault = -1;
                    this.regLIP = addr;
                    this.regLIPLimit = (this.segCS.base + this.segCS.limit)|0;
                    if (I386) this.resetSizes();
                    if (PREFETCH) this.flushPrefetch(this.regLIP);
                }
            };
            
            /**
             * fnIRET()
             *
             * @this {X86CPU}
             */
            X86.fnIRET = function IRET()
            {
                /*
                 * TODO: We assess a fixed cycle cost up front, because at the moment, switchTSS() doesn't assess anything.
                 */
                this.nStepCycles -= this.cycleCounts.nOpCyclesIRet;
                if (this.regCR0 & X86.CR0.MSW.PE) {
                    if (this.regPS & X86.PS.NT) {
                        var addrNew = this.segTSS.base;
                        var sel = this.getShort(addrNew + X86.TSS.PREV_TSS);
                        this.segCS.switchTSS(sel, false);
                        return;
                    }
                }
                var cpl = this.segCS.cpl;
                var newIP = this.popWord();
                var newCS = this.popWord();
                var newPS = this.popWord();
                if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                if (this.setCSIP(newIP, newCS, false) != null) {
                    this.setPS(newPS, cpl);
                    if (this.cIntReturn) this.checkIntReturn(this.regLIP);
                }
            };
            
            /**
             * fnJMPw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnJMPw = function JMPw(dst, src)
            {
                this.setIP(dst);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesJmpWR : this.cycleCounts.nOpCyclesJmpWM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnJMPFdw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnJMPFdw = function JMPFdw(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    return X86.fnGRPUndefined.call(this, dst, src);
                }
                this.setCSIP(dst, this.getShort(this.regEA + this.dataSize));
                if (this.cIntReturn) this.checkIntReturn(this.regLIP);
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpDM;
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnLAR(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLAR = function LAR(dst, src)
            {
                this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                /*
                 * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                 * descriptor table or the descriptor is not for a segment.
                 *
                 * TODO: This instruction's 80286 documentation does not discuss conforming code segments; determine
                 * if we need a special check for them.
                 */
                this.clearZF();
                if (this.segVER.load(src, true) !== X86.ADDR_INVALID) {
                    if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (src & X86.SEL.RPL)) {
                        this.setZF();
                        dst = this.segVER.acc & ~X86.DESC.ACC.BASE1623;
                        if (this.dataSize > 2) {
                            dst |= ((this.segVER.ext & ~X86.DESC.EXT.BASE2431) << 16);
                        }
                    }
                }
                return dst;
            };
            
            /**
             * fnLCR0(l)
             *
             * This is called by an 80386 control instruction (ie, MOV CR0,reg).
             *
             * TODO: Determine which CR0 bits, if any, cannot be modified by MOV CR0,reg.
             *
             * @this {X86CPU}
             * @param {number} l
             */
            X86.fnLCR0 = function LCR0(l)
            {
                this.regCR0 = l;
                this.setProtMode();
                if (this.regCR0 & X86.CR0.PG) {
                    this.enablePageBlocks();
                } else {
                    this.disablePageBlocks();
                }
            };
            
            /**
             * fnLCR3(l)
             *
             * This is called by an 80386 control instruction (ie, MOV CR3,reg) or an 80386 task switch.
             *
             * @this {X86CPU}
             * @param {number} l
             */
            X86.fnLCR3 = function LCR3(l)
            {
                this.regCR3 = l;
                /*
                 * Normal use of regCR3 involves adding a 0-4K (12-bit) offset to obtain a page directory entry,
                 * so let's ensure that the low 12 bits of regCR3 are always zero.
                 */
                this.assert(!(this.regCR3 & X86.LADDR.OFFSET));
                if (this.regCR0 & X86.CR0.PG) this.enablePageBlocks();
            };
            
            /**
             * fnLDS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLDS = function LDS(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opUndefined.call(this);
                    return dst;
                }
                this.setDS(this.getShort(this.regEA + this.dataSize));
                this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                return src;
            };
            
            /**
             * fnLEA(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLEA = function LEA(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    /*
                     * TODO: After reading http://www.os2museum.com/wp/undocumented-8086-opcodes/, it seems that this
                     * form of LEA (eg, "LEA AX,DX") simply returns the last calculated EA.  Since we always reset regEA
                     * at the start of a new instruction, we would need to preserve the previous EA if we want to mimic
                     * that (undocumented) behavior.
                     *
                     * And for completeness, we would have to extend EA tracking beyond the usual ModRM instructions
                     * (eg, XLAT, instructions that modify the stack pointer, and string instructions).  Anything else?
                     */
                    X86.opUndefined.call(this);
                    return dst;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLEA;
                return this.regEA;
            };
            
            /**
             * fnLES(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLES = function LES(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opUndefined.call(this);
                    return dst;
                }
                this.setES(this.getShort(this.regEA + this.dataSize));
                this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                return src;
            };
            
            /**
             * fnLFS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLFS = function LFS(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opUndefined.call(this);
                    return dst;
                }
                this.setFS(this.getShort(this.regEA + this.dataSize));
                this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                return src;
            };
            
            /**
             * fnLGDT(dst, src)
             *
             * op=0x0F,0x01,reg=0x2 (GRP7:LGDT)
             *
             * The 80286 LGDT instruction assumes a 40-bit operand: a 16-bit limit followed by a 24-bit base address;
             * the ModRM decoder has already supplied the first word of the operand (in dst), which corresponds to
             * the limit, so we must fetch the remaining bits ourselves.
             *
             * The 80386 LGDT instruction assumes a 48-bit operand: a 16-bit limit followed by a 32-bit base address,
             * but it ignores the last 8 bits of the base address if the OPERAND size is 16 bits; we interpret that to
             * mean that the 24-bit base address should be zero-extended to 32 bits.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnLGDT = function LGDT(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opInvalid.call(this);
                } else {
                    /*
                     * Hopefully it won't hurt to always fetch a 32-bit base address (even on an 80286), which we then
                     * mask apppropriately.
                     */
                    this.addrGDT = this.getLong(this.regEA + 2) & (this.dataMask | (this.dataMask << 8));
                    /*
                     * An idiosyncrasy of our ModRM decoders is that, if the OPERAND size is 32 bits, then it will have
                     * fetched a 32-bit dst operand; we mask off those extra bits now.
                     */
                    dst &= 0xffff;
                    this.addrGDTLimit = this.addrGDT + dst;
                    this.opFlags |= X86.OPFLAG.NOWRITE;
                    this.nStepCycles -= 11;
                }
                return dst;
            };
            
            /**
             * fnLGS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLGS = function LGS(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opUndefined.call(this);
                    return dst;
                }
                this.setGS(this.getShort(this.regEA + this.dataSize));
                this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                return src;
            };
            
            /**
             * fnLIDT(dst, src)
             *
             * op=0x0F,0x01,reg=0x3 (GRP7:LIDT)
             *
             * The 80286 LIDT instruction assumes a 40-bit operand: a 16-bit limit followed by a 24-bit base address;
             * the ModRM decoder has already supplied the first word of the operand (in dst), which corresponds to
             * the limit, so we must fetch the remaining bits ourselves.
             *
             * The 80386 LIDT instruction assumes a 48-bit operand: a 16-bit limit followed by a 32-bit base address,
             * but it ignores the last 8 bits of the base address if the OPERAND size is 16 bits; we interpret that to
             * mean that the 24-bit base address should be zero-extended to 32 bits.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnLIDT = function LIDT(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opInvalid.call(this);
                } else {
                    /*
                     * Hopefully it won't hurt to always fetch a 32-bit base address (even on an 80286), which we then
                     * mask apppropriately.
                     */
                    this.addrIDT = this.getLong(this.regEA + 2) & (this.dataMask | (this.dataMask << 8));
                    /*
                     * An idiosyncrasy of our ModRM decoders is that, if the OPERAND size is 32 bits, then it will have
                     * fetched a 32-bit dst operand; we mask off those extra bits now.
                     */
                    dst &= 0xffff;
                    this.addrIDTLimit = this.addrIDT + dst;
                    this.opFlags |= X86.OPFLAG.NOWRITE;
                    this.nStepCycles -= 12;
                }
                return dst;
            };
            
            /**
             * fnLLDT(dst, src)
             *
             * op=0x0F,0x00,reg=0x2 (GRP6:LLDT)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnLLDT = function LLDT(dst, src) {
                this.opFlags |= X86.OPFLAG.NOWRITE;
                this.segLDT.load(dst);
                this.nStepCycles -= (17 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                return dst;
            };
            
            /**
             * fnLMSW(dst, src)
             *
             * op=0x0F,0x01,reg=0x6 (GRP7:LMSW)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnLMSW = function LMSW(dst, src)
            {
                this.setMSW(dst);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 6);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnLSL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (the selector)
             * @return {number}
             */
            X86.fnLSL = function LSL(dst, src)
            {
                /*
                 * TODO: Is this an invalid operation if regEAWrite is set?  dst is required to be a register.
                 */
                this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                /*
                 * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                 * descriptor table or the descriptor is not for a segment.
                 *
                 * TODO: LSL is explicitly documented as ALSO requiring a non-null selector, so we check X86.SEL.MASK;
                 * are there any other instructions that were, um, less explicit but also require a non-null selector?
                 */
                if ((src & X86.SEL.MASK) && this.segVER.load(src, true) !== X86.ADDR_INVALID) {
                    var fConforming = ((this.segVER.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) == X86.DESC.ACC.TYPE.CODE_CONFORMING);
                    if ((fConforming || this.segVER.dpl >= this.segCS.cpl) && this.segVER.dpl >= (src & X86.SEL.RPL)) {
                        this.setZF();
                        return this.segVER.limit;
                    }
                }
                this.clearZF();
                return dst;
            };
            
            /**
             * fnLSS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnLSS = function LSS(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opUndefined.call(this);
                    return dst;
                }
                this.setSS(this.getShort(this.regEA + this.dataSize));
                this.nStepCycles -= this.cycleCounts.nOpCyclesLS;
                return src;
            };
            
            /**
             * fnLTR(dst, src)
             *
             * op=0x0F,0x00,reg=0x3 (GRP6:LTR)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnLTR = function LTR(dst, src)
            {
                this.opFlags |= X86.OPFLAG.NOWRITE;
                if (this.segTSS.load(dst) !== X86.ADDR_INVALID) {
                    this.setShort(this.segTSS.addrDesc + X86.DESC.ACC.OFFSET, this.segTSS.acc |= X86.DESC.ACC.TYPE.LDT);
                    this.segTSS.type = X86.DESC.ACC.TYPE.TSS_BUSY;
                }
                this.nStepCycles -= (17 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                return dst;
            };
            
            /**
             * fnMOV(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (current value, ignored)
             * @param {number} src (new value)
             * @return {number} dst (updated value, from src)
             */
            X86.fnMOV = function MOV(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovRR : this.cycleCounts.nOpCyclesMovRM) : this.cycleCounts.nOpCyclesMovMR);
                return src;
            };
            
            /**
             * fnMOVX(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (current value, ignored)
             * @param {number} src (new value)
             * @return {number} dst (updated value, from src)
             */
            X86.fnMOVX = function MOVX(dst, src)
            {
                return src;
            };
            
            /**
             * fnMOVn(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (current value, ignored)
             * @param {number} src (new value)
             * @return {number} dst (updated value, from src)
             */
            X86.fnMOVn = function MOVn(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovRI : this.cycleCounts.nOpCyclesMovMI);
                return src;
            };
            
            /**
             * fnMOVxx(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (current value, ignored)
             * @param {number} src (new value)
             * @return {number} dst (src is overridden, replaced with regXX, as specified by opMOVwsr() or opMOVrc())
             */
            X86.fnMOVxx = function MOVxx(dst, src)
            {
                if (this.regEAWrite !== X86.ADDR_INVALID) {
                    /*
                     * When a 32-bit OPERAND size is in effect, opMOVwsr() will write 32 bits (zero-extended) if the destination
                     * is a register, but only 16 bits if the destination is memory.  The only other caller, opMOVrc(), is not
                     * affected, because it writes only to register destinations.
                     */
                    this.setDataSize(2);
                }
                return X86.fnMOV.call(this, dst, this.regXX);
            };
            
            /**
             * fnMULb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number} (we return dst unchanged, since it's actually AX that's modified)
             */
            X86.fnMULb = function MULb(dst, src)
            {
                this.fMDSet = true;
                this.regMDLo = ((src = this.regEAX & 0xff) * dst) & 0xffff;
            
                if (this.regMDLo & 0xff00) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) this.traceLog('MULb', src, dst, null, this.getPS(), this.regMDLo);
            
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMulBR : this.cycleCounts.nOpCyclesMulBM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnMUL32(dst, src)
             *
             * This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as unsigned.
             *
             * TODO: Some potential optimizations include:
             *
             *  1) Early outs if either parameter is zero, since the result will obviously be zero
             *  2) Using "normal" JavaScript multiplication if both parameters are < 32767
             *
             * Refer to: http://stackoverflow.com/questions/13597364/32-bit-signed-multiplication-with-a-64-bit-result-in-javascript
             *
             * @this {X86CPU}
             * @param {number} dst (any 32-bit number, treated as unsigned)
             * @param {number} src (any 32-bit number, treated as unsigned)
             */
            X86.fnMUL32 = function MUL32(dst, src)
            {
                var srcLo = src & 0xffff;
                var srcHi = src >>> 16;
                var dstLo = dst & 0xffff;
                var dstHi = dst >>> 16;
            
                var mul00 = srcLo * dstLo;
                var mul16 = ((mul00 >>> 16) + (srcHi * dstLo));
                var mul32 = mul16 >>> 16;
                mul16 = ((mul16 & 0xffff) + (srcLo * dstHi));
                mul32 += ((mul16 >>> 16) + (srcHi * dstHi));
            
                this.fMDSet = true;
                this.regMDLo = (mul16 << 16) | (mul00 & 0xffff);
                this.regMDHi = mul32|0;
            };
            
            /**
             * fnMULw(dst, src)
             *
             * regMDHi:regMDLo = dst * regEAX
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null; AX or EAX is the implied src)
             * @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
             */
            X86.fnMULw = function MULw(dst, src)
            {
                if (this.dataSize == 2) {
                    src = this.regEAX & 0xffff;
                    var result = (src * dst)|0;
                    this.fMDSet = true;
                    this.regMDLo = result & 0xffff;
                    this.regMDHi = (result >> 16) & 0xffff;
                } else {
                    X86.fnMUL32.call(this, dst, this.regEAX);
                }
            
                if (this.regMDHi) {
                    this.setCF(); this.setOF();
                } else {
                    this.clearCF(); this.clearOF();
                }
            
                /*
                 * Multiply/divide instructions specify only a single operand, which the decoders pass to us
                 * via the dst parameter, so we set src to the other implied operand (either AX or DX:AX).
                 * However, src is technically an output, and dst is merely an input (which is why we must return
                 * dst unchanged). So, to make traceLog() more consistent, we reverse the order of dst and src.
                 */
                if (DEBUG && DEBUGGER) {
                    if (this.dataSize == 2) {
                        this.traceLog('MULw', src, dst, null, this.getPS(), this.regMDLo | (this.regMDHi << 16));
                    } else {
                        this.traceLog('MULd', src, dst, null, this.getPS(), this.regMDLo, this.regMDHi);
                    }
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMulWR : this.cycleCounts.nOpCyclesMulWM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnNEGb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnNEGb = function NEGb(dst, src)
            {
                var b = (-dst)|0;
                this.setArithResult(0, dst, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                return b & 0xff;
            };
            
            /**
             * fnNEGw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnNEGw = function NEGw(dst, src)
            {
                var w = (-dst)|0;
                this.setArithResult(0, dst, w, X86.RESULT.WORD | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                return w & 0xffff;
            };
            
            /**
             * fnNOTb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnNOTb = function NOTb(dst, src)
            {
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                return dst ^ 0xff;
            };
            
            /**
             * fnNOTw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnNOTw = function NOTw(dst, src)
            {
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesNegR : this.cycleCounts.nOpCyclesNegM);
                return dst ^ 0xffff;
            };
            
            /**
             * fnORb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnORb = function ORb(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return this.setLogicResult(dst | src, X86.RESULT.BYTE);
            };
            
            /**
             * fnORw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnORw = function ORw(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return this.setLogicResult(dst | src, this.dataType);
            };
            
            /**
             * fnPOPw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (current value, ignored)
             * @param {number} src (new value)
             * @return {number} dst (updated value, from src)
             */
            X86.fnPOPw = function POPw(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesPopReg : this.cycleCounts.nOpCyclesPopMem);
                return src;
            };
            
            /**
             * fnPUSHw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnPUSHw = function PUSHw(dst, src)
            {
                var w = dst;
                if (this.opFlags & X86.OPFLAG.PUSHSP) {
                    /*
                     * This is the one case where must actually modify dst, so that the ModRM function will
                     * not put a stale value back into the SP register.
                     */
                    dst = (dst - 2) & 0xffff;
                    /*
                     * And on the 8086/8088, the value we just calculated also happens to be the value that must
                     * be pushed.
                     */
                    if (this.model < X86.MODEL_80286) w = dst;
                }
                this.pushWord(w);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesPushReg : this.cycleCounts.nOpCyclesPushMem);
                /*
                 * The PUSH is the only write that needs to occur; dst was the source operand and does not need to be rewritten.
                 */
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnRCLb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRCLb = function RCLb(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = this.getCarry();
                    count %= 9;
                    if (!count) {
                        carry <<= 7;
                    } else {
                        result = ((dst << count) | (carry << (count - 1)) | (dst >> (9 - count))) & 0xff;
                        carry = dst << (count - 1);
                    }
                    this.setRotateResult(result, carry, X86.RESULT.BYTE);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RCLb', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRCLw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRCLw = function RCLw(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = this.getCarry();
                    count %= 17;
                    if (!count) {
                        carry <<= 15;
                    } else {
                        result = ((dst << count) | (carry << (count - 1)) | (dst >> (17 - count))) & 0xffff;
                        carry = dst << (count - 1);
                    }
                    this.setRotateResult(result, carry, X86.RESULT.WORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RCLw', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRCLd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRCLd = function RCLd(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;     // this 32-bit-only function could mask with 0x1f directly
                if (count) {
                    var carry = this.getCarry();
                    /*
                     * JavaScript Alert: much like a post-8086 Intel CPU, JavaScript shift counts are mod 32,
                     * so "dst >>> 32" is equivalent to "dst >>> 0", which doesn't shift any bits at all.  To
                     * compensate, we shift one bit less than the maximum, and then shift one bit farther.
                     */
                    result = (dst << count) | (carry << (count - 1)) | ((dst >>> (32 - count)) >>> 1);
                    carry = dst << (count - 1);
                    this.setRotateResult(result, carry, X86.RESULT.DWORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RCLd', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRCRb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRCRb = function RCRb(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = this.getCarry();
                    count %= 9;
                    if (!count) {
                        carry <<= 7;
                    } else {
                        result = ((dst >> count) | (carry << (8 - count)) | (dst << (9 - count))) & 0xff;
                        carry = dst << (8 - count);
                    }
                    this.setRotateResult(result, carry, X86.RESULT.BYTE);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RCRb', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRCRw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRCRw = function RCRw(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = this.getCarry();
                    count %= 17;
                    if (!count) {
                        carry <<= 15;
                    } else {
                        result = ((dst >> count) | (carry << (16 - count)) | (dst << (17 - count))) & 0xffff;
                        carry = dst << (16 - count);
                    }
                    this.setRotateResult(result, carry, X86.RESULT.WORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RCRw', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRCRd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRCRd = function RCRd(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;     // this 32-bit-only function could mask with 0x1f directly
                if (count) {
                    var carry = this.getCarry();
                    /*
                     * JavaScript Alert: much like a post-8086 Intel CPU, JavaScript shift counts are mod 32,
                     * so "dst << 32" is equivalent to "dst << 0", which doesn't shift any bits at all.  To
                     * compensate, we shift one bit less than the maximum, and then shift one bit farther.
                     */
                    result = (dst >>> count) | (carry << (32 - count)) | ((dst << (32 - count)) << 1);
                    carry = dst << (32 - count);
                    this.setRotateResult(result, carry, X86.RESULT.DWORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RCRd', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRETF(n)
             *
             * For protected-mode, this function must be prepared to pop any arguments off the current stack AND
             * whatever stack we may have switched to (setCSIP() returns true only when a stack switch has occurred).
             *
             * @this {X86CPU}
             * @param {number} n
             */
            X86.fnRETF = function RETF(n)
            {
                var newIP = this.popWord();
                var newCS = this.popWord();
                if (DEBUG) this.printMessage(" returning to " + str.toHex(newCS, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                n <<= (this.dataSize >> 2);
                if (n) this.setSP(this.getSP() + n);            // TODO: optimize
                if (this.setCSIP(newIP, newCS, false)) {
                    if (n) this.setSP(this.getSP() + n);        // TODO: optimize
                    /*
                     * As per Intel documentation: "If any of [the DS or ES] registers refer to segments whose DPL is
                     * less than the new CPL (excluding conforming code segments), the segment register is loaded with
                     * the null selector."
                     *
                     * TODO: I'm not clear on whether a conforming code segment must also be marked readable, so I'm playing
                     * it safe and using CODE_CONFORMING instead of CODE_CONFORMING_READABLE.  Also, for the record, I've not
                     * seen this situation occur yet (eg, in OS/2 1.0).
                     */
                    if ((this.segDS.sel & X86.SEL.MASK) && this.segDS.dpl < this.segCS.cpl && (this.segDS.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) != X86.DESC.ACC.TYPE.CODE_CONFORMING) {
                        this.assert(false);         // I'm not asserting this is bad, I just want to see it in action
                        this.segDS.load(0);
                    }
                    if ((this.segES.sel & X86.SEL.MASK) && this.segES.dpl < this.segCS.cpl && (this.segES.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) != X86.DESC.ACC.TYPE.CODE_CONFORMING) {
                        this.assert(false);         // I'm not asserting this is bad, I just want to see it in action
                        this.segES.load(0);
                    }
                }
                if (n == 2 && this.cIntReturn) this.checkIntReturn(this.regLIP);
            };
            
            /**
             * fnROLb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnROLb = function ROLb(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry;
                    count &= 0x7;
                    if (!count) {
                        carry = dst << 7;
                    } else {
                        carry = dst << (count - 1);
                        result = ((dst << count) | (dst >> (8 - count))) & 0xff;
                    }
                    this.setRotateResult(result, carry, X86.RESULT.BYTE);
                }
                if (DEBUG && DEBUGGER) this.traceLog('ROLb', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnROLw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnROLw = function ROLw(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry;
                    count &= 0xf;
                    if (!count) {
                        carry = dst << 15;
                    } else {
                        carry = dst << (count - 1);
                        result = ((dst << count) | (dst >> (16 - count))) & 0xffff;
                    }
                    this.setRotateResult(result, carry, X86.RESULT.WORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('ROLw', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnROLd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnROLd = function ROLd(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = dst << (count - 1);
                    result = (dst << count) | (dst >>> (32 - count));
                    this.setRotateResult(result, carry, X86.RESULT.DWORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('ROLd', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRORb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRORb = function RORb(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry;
                    count &= 0x7;
                    if (!count) {
                        carry = dst;
                    } else {
                        carry = dst << (8 - count);
                        result = ((dst >>> count) | carry) & 0xff;
                    }
                    this.setRotateResult(result, carry, X86.RESULT.BYTE);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RORb', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRORw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRORw = function RORw(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry;
                    count &= 0xf;
                    if (!count) {
                        carry = dst;
                    } else {
                        carry = dst << (16 - count);
                        result = ((dst >>> count) | carry) & 0xffff;
                    }
                    this.setRotateResult(result, carry, X86.RESULT.WORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RORw', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnRORd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL)
             * @return {number}
             */
            X86.fnRORd = function RORd(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = dst << (32 - count);
                    result = (dst >>> count) | carry;
                    this.setRotateResult(result, carry, X86.RESULT.DWORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('RORd', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnSARb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSARb = function SARb(dst, src)
            {
                var count = src & this.nShiftCountMask;
                if (count) {
                    if (count > 9) count = 9;
                    var carry = ((dst << 24) >> 24) >> (count - 1);
                    dst = (carry >> 1) & 0xff;
                    this.setLogicResult(dst, X86.RESULT.BYTE, carry & 0x1);
                }
                return dst;
            };
            
            /**
             * fnSARw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSARw = function SARw(dst, src)
            {
                var count = src & this.nShiftCountMask;
                if (count) {
                    if (count > 17) count = 17;
                    var carry = ((dst << 16) >> 16) >> (count - 1);
                    dst = (carry >> 1) & 0xffff;
                    this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1);
                }
                return dst;
            };
            
            /**
             * fnSARd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSARd = function SARd(dst, src)
            {
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = dst >> (count - 1);
                    dst = (carry >> 1);
                    this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1);
                }
                return dst;
            };
            
            /**
             * fnSBBb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSBBb = function SBBb(dst, src)
            {
                var b = (dst - src - this.getCarry())|0;
                this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return b & 0xff;
            };
            
            /**
             * fnSBBw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSBBw = function SBBw(dst, src)
            {
                var w = (dst - src - this.getCarry())|0;
                this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return w & this.dataMask;
            };
            
            /**
             * fnSETcc()
             *
             * @this {X86CPU}
             * @param {function(number,number)} fnSet
             */
            X86.fnSETcc = function SETcc(fnSet)
            {
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModMemByte[this.getIPByte()].call(this, fnSet);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesSetR : this.cycleCounts.nOpCyclesSetM);
            };
            
            /**
             * fnSETO(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETO = function SETO(dst, src)
            {
                return (this.getOF()? 1 : 0);
            };
            
            /**
             * fnSETNO(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNO = function SETNO(dst, src)
            {
                return (this.getOF()? 0 : 1);
            };
            
            /**
             * fnSETC(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETC = function SETC(dst, src)
            {
                return (this.getCF()? 1 : 0);
            };
            
            /**
             * fnSETNC(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNC = function SETNC(dst, src)
            {
                return (this.getCF()? 0 : 1);
            };
            
            /**
             * fnSETZ(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETZ = function SETZ(dst, src)
            {
                return (this.getZF()? 1 : 0);
            };
            
            /**
             * fnSETNZ(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNZ = function SETNZ(dst, src)
            {
                return (this.getZF()? 0 : 1);
            };
            
            /**
             * fnSETBE(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETBE = function SETBE(dst, src)
            {
                return (this.getCF() || this.getZF()? 1 : 0);
            };
            
            /**
             * fnSETNBE(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNBE = function SETNBE(dst, src)
            {
                return (this.getCF() || this.getZF()? 0 : 1);
            };
            
            /**
             * fnSETS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETS = function SETS(dst, src)
            {
                return (this.getSF()? 1 : 0);
            };
            
            /**
             * fnSETNS(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNS = function SETNS(dst, src)
            {
                return (this.getSF()? 0 : 1);
            };
            
            /**
             * fnSETP(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETP = function SETP(dst, src)
            {
                return (this.getPF()? 1 : 0);
            };
            
            /**
             * fnSETNP(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNP = function SETNP(dst, src)
            {
                return (this.getPF()? 0 : 1);
            };
            
            /**
             * fnSETL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETL = function SETL(dst, src)
            {
                return (!this.getSF() != !this.getOF()? 1 : 0);
            };
            
            /**
             * fnSETNL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNL = function SETNL(dst, src)
            {
                return (!this.getSF() != !this.getOF()? 0 : 1);
            };
            
            /**
             * fnSETLE(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETLE = function SETLE(dst, src)
            {
                return (this.getZF() || !this.getSF() != !this.getOF()? 1 : 0);
            };
            
            /**
             * fnSETNLE(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst (ignored)
             * @param {number} src (ignored)
             * @return {number}
             */
            X86.fnSETNLE = function SETNLE(dst, src)
            {
                return (this.getZF() || !this.getSF() != !this.getOF()? 0 : 1);
            };
            
            /**
             * fnSGDT(dst, src)
             *
             * op=0x0F,0x01,reg=0x0 (GRP7:SGDT)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnSGDT = function SGDT(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opInvalid.call(this);
                } else {
                    /*
                     * We don't need to setShort() the first word of the operand, because the ModRM group decoder that
                     * calls us does that automatically with the value we return (dst).
                     */
                    dst = this.addrGDTLimit - this.addrGDT;
                    this.assert(!(dst & ~0xffff));
                    /*
                     * We previously left the 6th byte of the target operand "undefined".  But it turns out we have to set
                     * it to *something*, because there's processor detection in PC-DOS 7.0 (at least in the SETUP portion)
                     * that looks like this:
                     *
                     *      145E:4B84 9C            PUSHF
                     *      145E:4B85 55            PUSH     BP
                     *      145E:4B86 8BEC          MOV      BP,SP
                     *      145E:4B88 B80000        MOV      AX,0000
                     *      145E:4B8B 50            PUSH     AX
                     *      145E:4B8C 9D            POPF
                     *      145E:4B8D 9C            PUSHF
                     *      145E:4B8E 58            POP      AX
                     *      145E:4B8F 2500F0        AND      AX,F000
                     *      145E:4B92 3D00F0        CMP      AX,F000
                     *      145E:4B95 7511          JNZ      4BA8
                     *      145E:4BA8 C8060000      ENTER    0006,00
                     *      145E:4BAC 0F0146FA      SGDT     [BP-06]
                     *      145E:4BB0 807EFFFF      CMP      [BP-01],FF
                     *      145E:4BB4 C9            LEAVE
                     *      145E:4BB5 BA8603        MOV      DX,0386
                     *      145E:4BB8 7503          JNZ      4BBD
                     *      145E:4BBA BA8602        MOV      DX,0286
                     *      145E:4BBD 89163004      MOV      [0430],DX
                     *      145E:4BC1 5D            POP      BP
                     *      145E:4BC2 9D            POPF
                     *      145E:4BC3 CB            RETF
                     *
                     * This code is expecting SGDT on an 80286 to set the 6th "undefined" byte to 0xFF.
                     *
                     * The 80386 adds an additional wrinkle: the 6th byte must be 0x00 if the OPERAND size is 2, whereas
                     * it must passed through if the OPERAND size is 4.
                     *
                     * In addition, when the OPERAND size is 4, the ModRM group decoder will call setLong(dst) rather than
                     * setShort(dst); we could fix that by forcing the dataSize to 2, but it seems simpler to set the high
                     * bits (16-31) of dst to match the low bits (0-15) of addr, so that the caller will harmlessly rewrite
                     * what we already wrote with the setLong() below.
                     */
                    var addr = this.addrGDT;
                    if (this.model == X86.MODEL_80286) {
                        addr |= (0xff000000|0);
                    }
                    else if (this.model >= X86.MODEL_80386) {
                        if (this.dataSize == 2) {
                            addr &= 0x00ffffff;
                        } else {
                            dst |= (addr << 16);
                        }
                    }
                    this.setLong(this.regEA + 2, addr);
                    this.nStepCycles -= 11;
                }
                return dst;
            };
            
            /**
             * fnSHLb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSHLb = function SHLb(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = 0;
                    if (count > 8) {
                        result = 0;
                    } else {
                        carry = dst << (count - 1);
                        result = (carry << 1) & 0xff;
                    }
                    this.setLogicResult(result, X86.RESULT.BYTE, carry & X86.RESULT.BYTE, (result ^ carry) & X86.RESULT.BYTE);
                }
                if (DEBUG && DEBUGGER) this.traceLog('SHLb', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnSHLw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSHLw = function SHLw(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = 0;
                    if (count > 16) {
                        result = 0;
                    } else {
                        carry = dst << (count - 1);
                        result = (carry << 1) & 0xffff;
                    }
                    this.setLogicResult(result, X86.RESULT.WORD, carry & X86.RESULT.WORD, (result ^ carry) & X86.RESULT.WORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('SHLw', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnSHLd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSHLd = function SHLd(dst, src)
            {
                var result = dst;
                var flagsIn = (DEBUG? this.getPS() : 0);
                var count = src & this.nShiftCountMask;     // this 32-bit-only function could mask with 0x1f directly
                if (count) {
                    var carry = dst << (count - 1);
                    result = (carry << 1);
                    this.setLogicResult(result, X86.RESULT.DWORD, carry & X86.RESULT.DWORD, (result ^ carry) & X86.RESULT.DWORD);
                }
                if (DEBUG && DEBUGGER) this.traceLog('SHLd', dst, src, flagsIn, this.getPS(), result);
                return result;
            };
            
            /**
             * fnSHLDw(dst, src, count)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @param {number} count (0-31)
             * @return {number}
             */
            X86.fnSHLDw = function SHLDw(dst, src, count)
            {
                if (count) {
                    if (count > 16) {
                        dst = src;
                        count -= 16;
                    }
                    var carry = dst << (count - 1);
                    dst = ((carry << 1) | (src >> (16 - count))) & 0xffff;
                    this.setLogicResult(dst, X86.RESULT.WORD, carry & X86.RESULT.WORD);
                }
                return dst;
            };
            
            /**
             * fnSHLDd(dst, src, count)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @param {number} count
             * @return {number}
             */
            X86.fnSHLDd = function SHLDd(dst, src, count)
            {
                if (count) {
                    var carry = dst << (count - 1);
                    dst = (carry << 1) | (src >> (32 - count));
                    this.setLogicResult(dst, X86.RESULT.DWORD, carry & X86.RESULT.DWORD);
                }
                return dst;
            };
            
            /**
             * fnSHLDwi(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHLDwi = function SHLDwi(dst, src)
            {
                return X86.fnSHLDw.call(this, dst, src, this.getIPByte());
            };
            
            /**
             * fnSHLDdi(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHLDdi = function SHLDdi(dst, src)
            {
                return X86.fnSHLDd.call(this, dst, src, this.getIPByte());
            };
            
            /**
             * fnSHLDwCL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHLDwCL = function SHLDwCL(dst, src)
            {
                return X86.fnSHLDw.call(this, dst, src, this.regECX & 0x1f);
            };
            
            /**
             * fnSHLDdCL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHLDdCL = function SHLDdCL(dst, src)
            {
                return X86.fnSHLDd.call(this, dst, src, this.regECX & 0x1f);
            };
            
            /**
             * fnSHRb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSHRb = function SHRb(dst, src)
            {
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = (count > 8? 0 : (dst >>> (count - 1)));
                    dst = (carry >>> 1) & 0xff;
                    this.setLogicResult(dst, X86.RESULT.BYTE, carry & 0x1, dst & X86.RESULT.BYTE);
                }
                return dst;
            };
            
            /**
             * fnSHRw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSHRw = function SHRw(dst, src)
            {
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = (count > 16? 0 : (dst >>> (count - 1)));
                    dst = (carry >>> 1) & 0xffff;
                    this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1, dst & X86.RESULT.WORD);
                }
                return dst;
            };
            
            /**
             * fnSHRd(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (1 or CL, or an immediate byte for 80186/80188 and up)
             * @return {number}
             */
            X86.fnSHRd = function SHRd(dst, src)
            {
                var count = src & this.nShiftCountMask;
                if (count) {
                    var carry = (dst >>> (count - 1));
                    dst = (carry >>> 1);
                    this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1, dst & X86.RESULT.DWORD);
                }
                return dst;
            };
            
            /**
             * fnSHRDw(dst, src, count)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @param {number} count (0-31)
             * @return {number}
             */
            X86.fnSHRDw = function SHRDw(dst, src, count)
            {
                if (count) {
                    if (count > 16) {
                        dst = src;
                        count -= 16;
                    }
                    var carry = dst >> (count - 1);
                    dst = ((carry >> 1) | (src << (16 - count))) & 0xffff;
                    this.setLogicResult(dst, X86.RESULT.WORD, carry & 0x1);
                }
                return dst;
            };
            
            /**
             * fnSHRDd(dst, src, count)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @param {number} count
             * @return {number}
             */
            X86.fnSHRDd = function SHRDd(dst, src, count)
            {
                if (count) {
                    var carry = dst >> (count - 1);
                    dst = (carry >> 1) | (src << (32 - count));
                    this.setLogicResult(dst, X86.RESULT.DWORD, carry & 0x1);
                }
                return dst;
            };
            
            /**
             * fnSHRDwi(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHRDwi = function SHRDwi(dst, src)
            {
                return X86.fnSHRDw.call(this, dst, src, this.getIPByte());
            };
            
            /**
             * fnSHRDdi(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHRDdi = function SHRDdi(dst, src)
            {
                return X86.fnSHRDd.call(this, dst, src, this.getIPByte());
            };
            
            /**
             * fnSHRDwCL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHRDwCL = function SHRDwCL(dst, src)
            {
                return X86.fnSHRDw.call(this, dst, src, this.regECX & 0x1f);
            };
            
            /**
             * fnSHRDdCL(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSHRDdCL = function SHRDdCL(dst, src)
            {
                return X86.fnSHRDd.call(this, dst, src, this.regECX & 0x1f);
            };
            
            /**
             * fnSIDT(dst, src)
             *
             * op=0x0F,0x01,reg=0x1 (GRP7:SIDT)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnSIDT = function SIDT(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    X86.opInvalid.call(this);
                } else {
                    /*
                     * We don't need to setShort() the first word of the operand, because the ModRM group decoder that calls
                     * us does that automatically with the value we return (dst).
                     */
                    dst = this.addrIDTLimit - this.addrIDT;
                    this.assert(!(dst & ~0xffff));
                    /*
                     * As with SGDT, the 6th byte is technically "undefined" on an 80286, but we now set it to 0xFF, for the
                     * same reasons discussed in SGDT (above).
                     */
                    var addr = this.addrIDT;
                    if (this.model == X86.MODEL_80286) {
                        addr |= (0xff000000|0);
                    }
                    else if (this.model >= X86.MODEL_80386) {
                        if (this.dataSize == 2) {
                            addr &= 0x00ffffff;
                        } else {
                            dst |= (addr << 16);
                        }
                    }
                    this.setLong(this.regEA + 2, addr);
                    this.nStepCycles -= 12;
                }
                return dst;
            };
            
            /**
             * fnSLDT(dst, src)
             *
             * op=0x0F,0x00,reg=0x0 (GRP6:SLDT)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnSLDT = function SLDT(dst, src)
            {
                this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                return this.segLDT.sel;
            };
            
            /**
             * fnSMSW(dst, src)
             *
             * op=0x0F,0x01,reg=0x4 (GRP7:SMSW)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnSMSW = function SMSW(dst, src)
            {
                this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                return this.regCR0;
            };
            
            /**
             * fnSTR(dst, src)
             *
             * op=0x0F,0x00,reg=0x1 (GRP6:STR)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnSTR = function STR(dst, src)
            {
                this.nStepCycles -= (2 + (this.regEA === X86.ADDR_INVALID? 0 : 1));
                return this.segTSS.sel;
            };
            
            /**
             * fnSUBb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSUBb = function SUBb(dst, src)
            {
                var b = (dst - src)|0;
                this.setArithResult(dst, src, b, X86.RESULT.BYTE | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return b & 0xff;
            };
            
            /**
             * fnSUBw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnSUBw = function SUBw(dst, src)
            {
                var w = (dst - src)|0;
                this.setArithResult(dst, src, w, this.dataType | X86.RESULT.ALL, true);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return w & this.dataMask;
            };
            
            /**
             * fnTEST8(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null; we have to supply the source ourselves)
             * @return {number}
             */
            X86.fnTEST8 = function TEST8(dst, src)
            {
                src = this.getIPByte();
                this.setLogicResult(dst & src, X86.RESULT.BYTE);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRI : this.cycleCounts.nOpCyclesTestMI);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnTEST16(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null; we have to supply the source ourselves)
             * @return {number}
             */
            X86.fnTEST16 = function TEST16(dst, src)
            {
                src = this.getIPWord();
                this.setLogicResult(dst & src, X86.RESULT.WORD);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRI : this.cycleCounts.nOpCyclesTestMI);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnTESTb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnTESTb = function TESTb(dst, src)
            {
                this.setLogicResult(dst & src, X86.RESULT.BYTE);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRR : this.cycleCounts.nOpCyclesTestRM) : this.cycleCounts.nOpCyclesTestRM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnTESTw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnTESTw = function TESTw(dst, src)
            {
                this.setLogicResult(dst & src, X86.RESULT.WORD);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesTestRR : this.cycleCounts.nOpCyclesTestRM) : this.cycleCounts.nOpCyclesTestRM);
                this.opFlags |= X86.OPFLAG.NOWRITE;
                return dst;
            };
            
            /**
             * fnVERR(dst, src)
             *
             * op=0x0F,0x00,reg=0x4 (GRP6:VERR)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnVERR = function VERR(dst, src)
            {
                this.opFlags |= X86.OPFLAG.NOWRITE;
                /*
                 * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                 * descriptor table or the descriptor is not for a segment.
                 */
                this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                if (this.segVER.load(dst, true) !== X86.ADDR_INVALID) {
                    /*
                     * Verify that this is a readable segment; that is, of these four combinations (code+readable,
                     * code+nonreadable, data+writable, date+nonwritable), make sure we're not the second combination.
                     */
                    if ((this.segVER.acc & (X86.DESC.ACC.TYPE.READABLE | X86.DESC.ACC.TYPE.CODE)) != X86.DESC.ACC.TYPE.CODE) {
                        /*
                         * For VERR, if the code segment is readable and conforming, the descriptor privilege level
                         * (DPL) can be any value.
                         *
                         * Otherwise, DPL must be greater than or equal to (have less or the same privilege as) both the
                         * current privilege level and the selector's RPL.
                         */
                        if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (dst & X86.SEL.RPL) ||
                            (this.segVER.acc & X86.DESC.ACC.TYPE.CODE_CONFORMING) == X86.DESC.ACC.TYPE.CODE_CONFORMING) {
                            this.setZF();
                            return dst;
                        }
                    }
                }
                this.clearZF();
                return dst;
            };
            
            /**
             * fnVERW(dst, src)
             *
             * op=0x0F,0x00,reg=0x5 (GRP6:VERW)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src (null)
             * @return {number}
             */
            X86.fnVERW = function VERW(dst, src)
            {
                this.opFlags |= X86.OPFLAG.NOWRITE;
                /*
                 * Currently, segVER.load() will return an error only if the selector is beyond the bounds of the
                 * descriptor table or the descriptor is not for a segment.
                 */
                this.nStepCycles -= (14 + (this.regEA === X86.ADDR_INVALID? 0 : 2));
                if (this.segVER.load(dst, true) !== X86.ADDR_INVALID) {
                    /*
                     * Verify that this is a writable data segment
                     */
                    if ((this.segVER.acc & (X86.DESC.ACC.TYPE.WRITABLE | X86.DESC.ACC.TYPE.CODE)) == X86.DESC.ACC.TYPE.WRITABLE) {
                        /*
                         * DPL must be greater than or equal to (have less or the same privilege as) both the current
                         * privilege level and the selector's RPL.
                         */
                        if (this.segVER.dpl >= this.segCS.cpl && this.segVER.dpl >= (dst & X86.SEL.RPL)) {
                            this.setZF();
                            return dst;
                        }
                    }
                }
                this.clearZF();
                return dst;
            };
            
            /**
             * fnXCHGrb(dst, src)
             *
             * If an instruction like "XCHG AL,AH" was a traditional "op dst,src" instruction, dst would contain AL,
             * src would contain AH, and we would return src, which the caller would then store in AL, and we'd be done.
             *
             * However, that's only half of what XCHG does, so THIS function must perform the other half; in the previous
             * example, that means storing the original AL (dst) into AH (src).
             *
             * BACKTRACK support is incomplete without also passing bti values as parameters, because the caller will
             * store btiAH in btiAL, but the original btiAL will be lost.  Similarly, if src is a memory operand, the
             * caller will store btiEALo in btiAL, but again, the original btiAL will be lost.
             *
             * BACKTRACK support for memory operands could be fixed by decoding the dst register in order to determine the
             * corresponding bti and then temporarily storing it in btiEALo around the setEAByte() call below.  Register-only
             * XCHGs would require a more extensive hack.  For now, I'm going to live with one-way BACKTRACK support here.
             *
             * TODO: Implement full BACKTRACK support for XCHG instructions.
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnXCHGrb = function XCHGRb(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    /*
                     * Decode which register was src
                     */
                    switch (this.bModRM & 0x7) {
                    case 0x0:       // AL
                        this.regEAX = (this.regEAX & ~0xff) | dst;
                        break;
                    case 0x1:       // CL
                        this.regECX = (this.regECX & ~0xff) | dst;
                        break;
                    case 0x2:       // DL
                        this.regEDX = (this.regEDX & ~0xff) | dst;
                        break;
                    case 0x3:       // BL
                        this.regEBX = (this.regEBX & ~0xff) | dst;
                        break;
                    case 0x4:       // AH
                        this.regEAX = (this.regEAX & 0xff) | (dst << 8);
                        break;
                    case 0x5:       // CH
                        this.regECX = (this.regECX & 0xff) | (dst << 8);
                        break;
                    case 0x6:       // DH
                        this.regEDX = (this.regEDX & 0xff) | (dst << 8);
                        break;
                    case 0x7:       // BH
                        this.regEBX = (this.regEBX & 0xff) | (dst << 8);
                        break;
                    default:
                        break;      // there IS no other case, but JavaScript inspections don't know that
                    }
                    this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRR;
                } else {
                    /*
                     * This is a case where the ModRM decoder that's calling us didn't know it should have called modEAByte()
                     * instead of getEAByte(), so we compensate by updating regEAWrite.  However, setEAByte() has since been
                     * changed to revalidate the write using segEA:offEA, so updating regEAWrite here isn't strictly necessary.
                     */
                    this.regEAWrite = this.regEA;
                    this.setEAByte(dst);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRM;
                }
                return src;
            };
            
            /**
             * fnXCHGrw(dst, src)
             *
             * If an instruction like "XCHG AX,DX" was a traditional "op dst,src" instruction, dst would contain AX,
             * src would contain DX, and we would return src, which the caller would then store in AX, and we'd be done.
             *
             * However, that's only half of what XCHG does, so THIS function must perform the other half; in the previous
             * example, that means storing the original AX (dst) into DX (src).
             *
             * TODO: Implement full BACKTRACK support for XCHG instructions (see fnXCHGrb comments).
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnXCHGrw = function XCHGRw(dst, src)
            {
                if (this.regEA === X86.ADDR_INVALID) {
                    /*
                     * Decode which register was src
                     */
                    switch (this.bModRM & 0x7) {
                    case 0x0:       // AX
                        this.regEAX = dst;
                        break;
                    case 0x1:       // CX
                        this.regECX = dst;
                        break;
                    case 0x2:       // DX
                        this.regEDX = dst;
                        break;
                    case 0x3:       // BX
                        this.regEBX = dst;
                        break;
                    case 0x4:       // SP
                        this.setSP(dst);
                        break;
                    case 0x5:       // BP
                        this.regEBP = dst;
                        break;
                    case 0x6:       // SI
                        this.regESI = dst;
                        break;
                    case 0x7:       // DI
                        this.regEDI = dst;
                        break;
                    default:
                        break;      // there IS no other case, but JavaScript inspections don't know that
                    }
                    this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRR;
                } else {
                    /*
                     * This is a case where the ModRM decoder that's calling us didn't know it should have called modEAWord()
                     * instead of getEAWord(), so we compensate by updating regEAWrite.  However, setEAWord() has since been
                     * changed to revalidate the write using segEA:offEA, so updating regEAWrite here isn't strictly necessary.
                     */
                    this.regEAWrite = this.regEA;
                    this.setEAWord(dst);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesXchgRM;
                }
                return src;
            };
            
            /**
             * fnXORb(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnXORb = function XORb(dst, src)
            {
                var b = dst ^ src;
                this.setLogicResult(b, X86.RESULT.BYTE);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return b;
            };
            
            /**
             * fnXORw(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnXORw = function XORw(dst, src)
            {
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesArithRR : this.cycleCounts.nOpCyclesArithRM) : this.cycleCounts.nOpCyclesArithMR);
                return this.setLogicResult(dst ^ src, this.dataType);
            };
            
            /**
             * fnGRPFault(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnGRPFault = function GRPFault(dst, src)
            {
                X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                return dst;
            };
            
            /**
             * fnGRPInvalid(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnGRPInvalid = function GRPInvalid(dst, src)
            {
                X86.opInvalid.call(this);
                return dst;
            };
            
            /**
             * fnGRPUndefined(dst, src)
             *
             * @this {X86CPU}
             * @param {number} dst
             * @param {number} src
             * @return {number}
             */
            X86.fnGRPUndefined = function GRPUndefined(dst, src)
            {
                X86.opUndefined.call(this);
                return dst;
            };
            
            /**
             * fnDIVOverflow()
             *
             * @this {X86CPU}
             */
            X86.fnDIVOverflow = function DIVOverflow()
            {
                this.setIP(this.opLIP - this.segCS.base);
                /*
                 * TODO: Determine the proper cycle cost.
                 */
                X86.fnINT.call(this, X86.EXCEPTION.DIV_ERR, null, 2);
            };
            
            /**
             * fnSrcCount1()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86.fnSrcCount1 = function SrcCount1()
            {
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 2 : this.cycleCounts.nOpCyclesShift1M);
                return 1;
            };
            
            /**
             * fnSrcCountCL()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86.fnSrcCountCL = function SrcCountCL()
            {
                var count = this.regECX & 0xff;
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftCR : this.cycleCounts.nOpCyclesShiftCM) + (count << this.cycleCounts.nOpCyclesShiftCS);
                return count;
            };
            
            /**
             * fnSrcCountN()
             *
             * @this {X86CPU}
             * @return {number}
             */
            X86.fnSrcCountN = function SrcCountN()
            {
                var count = this.getIPByte();
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftCR : this.cycleCounts.nOpCyclesShiftCM) + (count << this.cycleCounts.nOpCyclesShiftCS);
                return count;
            };
            
            /**
             * fnSrcNone()
             *
             * @this {X86CPU}
             * @return {number|null}
             */
            X86.fnSrcNone = function SrcNone()
            {
                return null;
            };
            
            /**
             * fnFault(nFault, nError, fHalt, nCycles)
             *
             * Helper to dispatch faults.
             *
             * @this {X86CPU}
             * @param {number} nFault
             * @param {number} [nError] (if omitted, no error code will be pushed)
             * @param {boolean} [fHalt] will halt the CPU if true *and* a Debugger is loaded
             * @param {number} [nCycles] cycle count to pass through to fnINT(), if any
             */
            X86.fnFault = function(nFault, nError, fHalt, nCycles)
            {
                if (!this.aFlags.fComplete) {
                    this.printMessage("Fault " + str.toHexByte(nFault) + " blocked by Debugger", Messages.WARN);
                    this.setIP(this.opLIP - this.segCS.base);
                    return;
                }
            
                var fDispatch = false;
                if (this.model >= X86.MODEL_80186) {
                    if (this.nFault < 0) {
                        /*
                         * Single-fault (error code is passed through, and the responsible instruction is restartable)
                         */
                        this.setIP(this.opLIP - this.segCS.base);
                        fDispatch = true;
                    } else if (this.nFault != X86.EXCEPTION.DF_FAULT) {
                        /*
                         * Double-fault (error code is always zero, and the responsible instruction is not restartable)
                         */
                        nError = 0;
                        nFault = X86.EXCEPTION.DF_FAULT;
                        fDispatch = true;
                    } else {
                        /*
                         * Triple-fault (usually referred to in Intel literature as a "shutdown", but at least on the 80286,
                         * it's actually a "reset")
                         */
                        X86.fnFaultMessage.call(this, -1, 0, fHalt);
                        this.resetRegs();
                        return;
                    }
                }
            
                if (X86.fnFaultMessage.call(this, nFault, nError, fHalt)) {
                    fDispatch = false;
                }
            
                if (fDispatch) X86.fnINT.call(this, this.nFault = nFault, nError, nCycles || 0);
            
                /*
                 * Since this fault is likely being issued in the context of an instruction that hasn't finished
                 * executing, and since we currently don't do anything to interrupt that execution (eg, throw a
                 * JavaScript exception), we should shut off all further reads/writes for the current instruction.
                 *
                 * That's easy for any EA-based memory accesses: simply set both the NOREAD and NOWRITE flags.
                 * However, there are also direct, non-EA-based memory accesses to consider.  A perfect example is
                 * opPUSHA(): if a GP fault occurs on any PUSH other than the last, a subsequent PUSH is likely to
                 * cause another fault, which we will misinterpret as a double-fault.
                 *
                 * TODO: Throw a special JavaScript exception that cpu.js must intercept and quietly ignore.
                 */
                this.opFlags |= (X86.OPFLAG.NOREAD | X86.OPFLAG.NOWRITE);
            };
            
            /**
             * fnPageFault(addr, fPresent, fWrite)
             *
             * Helper to dispatch page faults.
             *
             * @this {X86CPU}
             * @param {number} addr
             * @param {boolean} fPresent
             * @param {boolean} fWrite
             */
            X86.fnPageFault = function(addr, fPresent, fWrite)
            {
                this.regCR2 = addr;
                var nError = 0;
                if (fPresent) nError |= X86.PTE.PRESENT;
                if (fWrite) nError |= X86.PTE.READWRITE;
                if (this.segCS.cpl == 3) nError |= X86.PTE.USER;
                X86.fnFault.call(this, X86.EXCEPTION.PG_FAULT, nError);
            };
            
            /**
             * fnFaultMessage()
             *
             * Aside from giving the Debugger an opportunity to report every fault, this also gives us the ability to
             * halt exception processing in tracks: return true to prevent the fault handler from being dispatched.
             *
             * At the moment, the only Debugger control you have over fault interception is setting MESSAGE.FAULT, which
             * will display faults as they occur, and MESSAGE.HALT, which will halt after any Debugger message, including
             * MESSAGE.FAULT.  If you want execution to continue after halting, clear MESSAGE.FAULT and/or MESSAGE.HALT,
             * or single-step over the offending instruction, which will allow the fault to be dispatched.
             *
             * @this {X86CPU}
             * @param {number} nFault
             * @param {number} [nError] (if omitted, no error code will be reported)
             * @param {boolean} [fHalt] true if the CPU should always be halted, false if "it depends"
             * @return {boolean|undefined} true to block the fault (often desirable when fHalt is true), otherwise dispatch it
             */
            X86.fnFaultMessage = function(nFault, nError, fHalt)
            {
                var bitsMessage = Messages.FAULT;
            
                var bOpcode = this.probeAddr(this.regLIP);
            
                /*
                 * OS/2 1.0 uses an INT3 (0xCC) opcode in conjunction with an invalid IDT to trigger a triple-fault
                 * reset and return to real-mode, and these resets happen quite frequently during boot; for example,
                 * OS/2 startup messages are displayed using a series of INT 0x10 BIOS calls for each character, and
                 * each series of BIOS calls requires a round-trip mode switch.
                 *
                 * Since we really only want to halt on "bad" faults, not "good" (ie, intentional) faults, we take
                 * advantage of the fact that all 3 faults comprising the triple-fault point to an INT3 (0xCC) opcode,
                 * and so whenever we see that opcode, we ignore the caller's fHalt flag, and suppress FAULT messages
                 * unless CPU messages are also enabled.
                 *
                 * When a triple fault shows up, nFault is -1; it displays as 0xff only because we use toHexByte().
                 */
                if (bOpcode == X86.OPCODE.INT3 && !this.addrIDTLimit) {
                    fHalt = false;
                    bitsMessage |= Messages.CPU;
                }
            
                /*
                 * Similarly, the PC AT ROM BIOS deliberately generates a couple of GP faults as part of the POST
                 * (Power-On Self Test); we don't want to ignore those, but we don't want to halt on them either.  We
                 * detect those faults by virtue of the LIP being in the range 0x0F0000 to 0x0FFFFF.
                 */
                if (this.regLIP >= 0x0F0000 && this.regLIP <= 0x0FFFFF) {
                    fHalt = false;
                }
            
                /*
                 * However, the foregoing notwithstanding, if MESSAGE.HALT is enabled along with all the other required
                 * MESSAGE bits, then we want to halt regardless.
                 */
                if (this.messageEnabled(bitsMessage | Messages.HALT)) {
                    fHalt = true;
                }
            
                if (this.messageEnabled(bitsMessage) || fHalt) {
                    var sMessage = (fHalt? '\n' : '') + "Fault " + str.toHexByte(nFault) + (nError != null? " (" + str.toHexWord(nError) + ")" : "") + " on opcode " + str.toHexByte(bOpcode) + " at " + this.dbg.hexOffset(this.getIP(), this.getCS()) + " (%" + str.toHex(this.regLIP, 6) + ")";
                    var fRunning = this.aFlags.fRunning;
                    if (this.printMessage(sMessage, bitsMessage)) {
                        if (fHalt) {
                            /*
                             * By setting fHalt to fRunning (which is true while running but false while single-stepping),
                             * this allows a fault to be dispatched when you single-step over a faulting instruction; you can
                             * then continue single-stepping into the fault handler, or start running again.
                             *
                             * Note that we had to capture fRunning before calling printMessage(), because if MESSAGE.HALT
                             * is set, printMessage() will have already halted the CPU.
                             */
                            fHalt = fRunning;
                            this.dbg.stopCPU();
                        }
                    } else {
                        /*
                         * If printMessage() returned false, then messageEnabled() must have returned false as well, which
                         * means that fHalt must be true.  Which means we should shut the machine down.
                         */
                        this.assert(fHalt);
                        this.notice(sMessage);
                        this.stopCPU();
                    }
                }
                return fHalt;
            };
            
          • x86modb.js
            /**
             * @fileoverview Implements PCjs 8086 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModB = {};
            
            X86ModB.aOpModReg = [
                /**
                 * opModRegByte00(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte00(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte01(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte01(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte02(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte02(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte03(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte03(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte04(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte04(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte05(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte05(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte06(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte06(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte07(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte07(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte08(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte08(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte09(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte09(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte0A(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte0A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte0B(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte0B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte0C(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte0C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte0D(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte0D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte0E(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte0E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte0F(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte0F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte10(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte10(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte11(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte11(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte12(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte12(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte13(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte13(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte14(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte14(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte15(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte15(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte16(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte16(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte17(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte17(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte18(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte18(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte19(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte19(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte1A(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte1A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte1B(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte1B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte1C(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte1C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte1D(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte1D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte1E(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte1E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte1F(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte1F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte20(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte20(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte21(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte21(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte22(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte22(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte23(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte23(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte24(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte24(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte25(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte25(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte26(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte26(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte27(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte27(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte28(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte28(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte29(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte29(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte2A(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte2A(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte2B(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte2B(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte2C(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte2C(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte2D(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte2D(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte2E(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte2E(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte2F(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte2F(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte30(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte30(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte31(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte31(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte32(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte32(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte33(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte33(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte34(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte34(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte35(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte35(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte36(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte36(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte37(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte37(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte38(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte38(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte39(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte39(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte3A(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte3A(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegByte3B(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte3B(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegByte3C(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte3C(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte3D(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte3D(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte3E(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte3E(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegByte3F(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte3F(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegByte40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte40(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte41(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte42(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte43(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte44(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte45(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte46(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte47(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte48(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte49(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte4A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte4B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte4C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte4D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte4E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte4F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte50(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte51(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte52(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte53(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte54(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte55(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte56(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte57(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte58(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte59(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte5A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte5B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte5C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte5D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte5E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte5F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte60(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte60(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte61(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte61(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte62(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte62(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte63(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte63(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte64(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte64(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte65(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte65(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte66(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte66(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte67(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte67(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte68(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte68(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte69(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte69(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte6A(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte6B(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte6C(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte6D(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte6E(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte6F(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte70(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte70(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte71(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte71(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte72(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte72(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte73(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte73(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte74(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte74(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte75(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte75(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte76(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte76(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte77(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte77(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte78(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte78(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte79(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte79(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte7A(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte7B(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte7C(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte7D(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte7E(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte7F(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte80(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte81(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte82(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte83(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte84(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte85(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte86(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte87(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte88(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte89(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte8A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte8B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte8C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte8D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte8E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte8F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte90(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte91(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte92(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte93(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte94(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte95(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte96(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte97(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte98(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte99(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte9A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByte9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte9B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByte9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte9C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte9D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte9E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByte9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByte9F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA0(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA1(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA2(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA3(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA4(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA5(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA6(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA7(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA8(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteA9(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteAA(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteAB(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteAC(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteAD(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteAE(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteAF(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB0(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB1(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB2(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB3(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB4(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB5(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB6(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB7(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB8(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteB9(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteBA(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegByteBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteBB(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegByteBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteBC(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteBD(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteBE(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteBF(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegByteC0(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC0(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                },
                /**
                 * opModRegByteC1(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC1(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteC2(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC2(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteC3(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC3(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteC4(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC4(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteC5(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC5(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteC6(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC6(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteC7(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC7(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteC8(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC8(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteC9(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteC9(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                },
                /**
                 * opModRegByteCA(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteCA(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteCB(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteCB(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteCC(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteCC(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteCD(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteCD(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteCE(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteCE(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteCF(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteCF(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteD0(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD0(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteD1(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD1(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteD2(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD2(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                },
                /**
                 * opModRegByteD3(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD3(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteD4(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD4(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteD5(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD5(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteD6(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD6(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteD7(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD7(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteD8(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD8(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteD9(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteD9(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteDA(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteDA(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteDB(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteDB(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                },
                /**
                 * opModRegByteDC(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteDC(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteDD(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteDD(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteDE(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteDE(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteDF(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteDF(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteE0(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE0(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.regEAX & 0xff);
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteE1(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE1(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.regECX & 0xff);
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteE2(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE2(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.regEDX & 0xff);
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteE3(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE3(fn) {
                    var b = fn.call(this, this.regEAX >> 8, this.regEBX & 0xff);
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteE4(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE4(fn) {
                    var b = fn.call(this, this.regEAX >> 8, (this.regEAX >> 8));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                },
                /**
                 * opModRegByteE5(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE5(fn) {
                    var b = fn.call(this, this.regEAX >> 8, (this.regECX >> 8));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteE6(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE6(fn) {
                    var b = fn.call(this, this.regEAX >> 8, (this.regEDX >> 8));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteE7(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE7(fn) {
                    var b = fn.call(this, this.regEAX >> 8, (this.regEBX >> 8));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteE8(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE8(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.regEAX & 0xff);
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteE9(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteE9(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.regECX & 0xff);
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteEA(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteEA(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.regEDX & 0xff);
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteEB(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteEB(fn) {
                    var b = fn.call(this, this.regECX >> 8, this.regEBX & 0xff);
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteEC(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteEC(fn) {
                    var b = fn.call(this, this.regECX >> 8, (this.regEAX >> 8));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteED(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteED(fn) {
                    var b = fn.call(this, this.regECX >> 8, (this.regECX >> 8));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                },
                /**
                 * opModRegByteEE(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteEE(fn) {
                    var b = fn.call(this, this.regECX >> 8, (this.regEDX >> 8));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteEF(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteEF(fn) {
                    var b = fn.call(this, this.regECX >> 8, (this.regEBX >> 8));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteF0(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF0(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.regEAX & 0xff);
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteF1(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF1(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.regECX & 0xff);
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteF2(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF2(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.regEDX & 0xff);
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteF3(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF3(fn) {
                    var b = fn.call(this, this.regEDX >> 8, this.regEBX & 0xff);
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteF4(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF4(fn) {
                    var b = fn.call(this, this.regEDX >> 8, (this.regEAX >> 8));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteF5(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF5(fn) {
                    var b = fn.call(this, this.regEDX >> 8, (this.regECX >> 8));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteF6(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF6(fn) {
                    var b = fn.call(this, this.regEDX >> 8, (this.regEDX >> 8));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                },
                /**
                 * opModRegByteF7(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF7(fn) {
                    var b = fn.call(this, this.regEDX >> 8, (this.regEBX >> 8));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
                },
                /**
                 * opModRegByteF8(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF8(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.regEAX & 0xff);
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
                },
                /**
                 * opModRegByteF9(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteF9(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.regECX & 0xff);
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
                },
                /**
                 * opModRegByteFA(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteFA(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.regEDX & 0xff);
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
                },
                /**
                 * opModRegByteFB(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteFB(fn) {
                    var b = fn.call(this, this.regEBX >> 8, this.regEBX & 0xff);
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
                },
                /**
                 * opModRegByteFC(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteFC(fn) {
                    var b = fn.call(this, this.regEBX >> 8, (this.regEAX >> 8));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
                },
                /**
                 * opModRegByteFD(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteFD(fn) {
                    var b = fn.call(this, this.regEBX >> 8, (this.regECX >> 8));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
                },
                /**
                 * opModRegByteFE(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteFE(fn) {
                    var b = fn.call(this, this.regEBX >> 8, (this.regEDX >> 8));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
                },
                /**
                 * opModRegByteFF(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegByteFF(fn) {
                    var b = fn.call(this, this.regEBX >> 8, (this.regEBX >> 8));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                }
            ];
            
            X86ModB.aOpModMem = [
                /**
                 * opModMemByte00(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte00(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte01(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte01(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte02(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte02(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte03(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte03(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte04(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte04(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte05(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte05(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte06(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte06(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte07(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte07(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte08(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte08(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte09(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte09(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte0A(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte0A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte0B(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte0B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte0C(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte0C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte0D(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte0D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte0E(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte0E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte0F(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte0F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte10(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte10(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte11(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte11(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte12(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte12(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte13(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte13(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte14(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte14(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte15(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte15(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte16(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte16(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte17(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte17(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte18(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte18(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte19(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte19(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte1A(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte1A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte1B(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte1B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte1C(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte1C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte1D(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte1D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte1E(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte1E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte1F(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte1F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte20(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte20(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte21(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte21(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte22(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte22(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte23(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte23(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte24(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte24(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte25(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte25(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte26(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte26(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte27(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte27(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte28(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte28(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte29(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte29(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte2A(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte2A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte2B(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte2B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte2C(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte2C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte2D(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte2D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte2E(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte2E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte2F(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte2F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte30(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte30(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte31(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte31(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte32(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte32(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte33(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte33(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte34(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte34(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte35(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte35(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte36(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte36(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte37(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte37(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte38(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte38(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte39(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte39(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte3A(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte3A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemByte3B(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte3B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemByte3C(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte3C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte3D(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte3D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte3E(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte3E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemByte3F(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte3F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemByte40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte40(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte41(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte42(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte43(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte44(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte45(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte46(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte47(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte48(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte49(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte4A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte4B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte4C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte4D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte4E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte4F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte50(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte51(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte52(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte53(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte54(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte55(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte56(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte57(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte58(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte59(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte5A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte5B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte5C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte5D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte5E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte5F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte60(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte60(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte61(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte61(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte62(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte62(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte63(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte63(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte64(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte64(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte65(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte65(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte66(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte66(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte67(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte67(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte68(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte68(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte69(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte69(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte6A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte6B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte6C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte6D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte6E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte6F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte70(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte70(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte71(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte71(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte72(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte72(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte73(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte73(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte74(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte74(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte75(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte75(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte76(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte76(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte77(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte77(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte78(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte78(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte79(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte79(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte7A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte7B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte7C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte7D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte7E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte7F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte80(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte81(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte82(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte83(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte84(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte85(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte86(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte87(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte88(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte89(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte8A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte8B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte8C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte8D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte8E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte8F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte90(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte91(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte92(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte93(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte94(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte95(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte96(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte97(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte98(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte99(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte9A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByte9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte9B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByte9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte9C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte9D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte9E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByte9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByte9F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA0(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA1(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA2(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA3(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA4(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA5(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA6(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA7(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA8(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteA9(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteAA(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteAB(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteAC(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteAD(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteAE(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteAF(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB0(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB1(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB2(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB3(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB4(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB5(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB6(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB7(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB8(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteB9(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteBA(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemByteBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteBB(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemByteBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteBC(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteBD(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteBE(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemByteBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemByteBF(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX >> 8);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                X86ModB.aOpModReg[0xC0],    X86ModB.aOpModReg[0xC8],    X86ModB.aOpModReg[0xD0],    X86ModB.aOpModReg[0xD8],
                X86ModB.aOpModReg[0xE0],    X86ModB.aOpModReg[0xE8],    X86ModB.aOpModReg[0xF0],    X86ModB.aOpModReg[0xF8],
                X86ModB.aOpModReg[0xC1],    X86ModB.aOpModReg[0xC9],    X86ModB.aOpModReg[0xD1],    X86ModB.aOpModReg[0xD9],
                X86ModB.aOpModReg[0xE1],    X86ModB.aOpModReg[0xE9],    X86ModB.aOpModReg[0xF1],    X86ModB.aOpModReg[0xF9],
                X86ModB.aOpModReg[0xC2],    X86ModB.aOpModReg[0xCA],    X86ModB.aOpModReg[0xD2],    X86ModB.aOpModReg[0xDA],
                X86ModB.aOpModReg[0xE2],    X86ModB.aOpModReg[0xEA],    X86ModB.aOpModReg[0xF2],    X86ModB.aOpModReg[0xFA],
                X86ModB.aOpModReg[0xC3],    X86ModB.aOpModReg[0xCB],    X86ModB.aOpModReg[0xD3],    X86ModB.aOpModReg[0xDB],
                X86ModB.aOpModReg[0xE3],    X86ModB.aOpModReg[0xEB],    X86ModB.aOpModReg[0xF3],    X86ModB.aOpModReg[0xFB],
                X86ModB.aOpModReg[0xC4],    X86ModB.aOpModReg[0xCC],    X86ModB.aOpModReg[0xD4],    X86ModB.aOpModReg[0xDC],
                X86ModB.aOpModReg[0xE4],    X86ModB.aOpModReg[0xEC],    X86ModB.aOpModReg[0xF4],    X86ModB.aOpModReg[0xFC],
                X86ModB.aOpModReg[0xC5],    X86ModB.aOpModReg[0xCD],    X86ModB.aOpModReg[0xD5],    X86ModB.aOpModReg[0xDD],
                X86ModB.aOpModReg[0xE5],    X86ModB.aOpModReg[0xED],    X86ModB.aOpModReg[0xF5],    X86ModB.aOpModReg[0xFD],
                X86ModB.aOpModReg[0xC6],    X86ModB.aOpModReg[0xCE],    X86ModB.aOpModReg[0xD6],    X86ModB.aOpModReg[0xDE],
                X86ModB.aOpModReg[0xE6],    X86ModB.aOpModReg[0xEE],    X86ModB.aOpModReg[0xF6],    X86ModB.aOpModReg[0xFE],
                X86ModB.aOpModReg[0xC7],    X86ModB.aOpModReg[0xCF],    X86ModB.aOpModReg[0xD7],    X86ModB.aOpModReg[0xDF],
                X86ModB.aOpModReg[0xE7],    X86ModB.aOpModReg[0xEF],    X86ModB.aOpModReg[0xF7],    X86ModB.aOpModReg[0xFF]
            ];
            
            X86ModB.aOpModGrp = [
                /**
                 * opModGrpByte00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte00(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte01(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte02(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte03(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte04(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte05(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte06(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte07(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte08(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte09(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte0A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte0B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte0C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte0D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte0E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte0F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte10(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte11(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte12(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte13(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte14(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte15(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte16(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte17(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte18(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte19(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte1A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte1B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte1C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte1D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte1E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte1F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte20(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte21(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte22(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte23(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte24(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte25(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte26(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte27(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte28(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte29(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte2A(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte2B(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte2C(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte2D(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte2E(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte2F(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte30(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte31(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte32(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte33(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte34(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte35(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte36(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte37(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte38(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte39(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte3A(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte3B(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte3C(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte3D(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte3E(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte3F(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte40(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte41(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte42(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte43(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte44(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte45(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte46(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte47(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte48(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte49(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte4A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte4B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte4C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte4D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte4E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte4F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte50(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte51(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte52(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte53(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte54(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte55(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte56(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte57(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte58(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte59(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte5A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte5B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte5C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte5D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte5E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte5F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte60(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte61(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte62(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte63(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte64(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte65(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte66(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte67(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte68(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte69(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte6A(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte6B(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte6C(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte6D(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte6E(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte6F(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte70(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte71(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte72(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte73(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte74(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte75(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte76(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte77(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte78(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte79(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte7A(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte7B(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte7C(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte7D(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte7E(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte7F(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte80(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte81(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte82(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte83(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte84(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte85(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte86(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte87(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte88(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte89(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte8A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte8B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte8C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte8D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte8E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte8F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte90(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte91(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte92(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte93(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte94(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte95(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte96(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte97(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte98(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte99(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte9A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte9B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte9C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte9D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte9E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByte9F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA0(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA1(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA2(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA3(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA4(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA5(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA6(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA7(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA8(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteA9(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteAA(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteAB(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteAC(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteAD(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteAE(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteAF(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB0(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB1(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB2(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB3(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB4(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB5(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB6(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB7(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB8(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteB9(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteBA(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteBB(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteBC(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteBD(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteBE(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteBF(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC0(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC1(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC2(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC3(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC4(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC5(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC6(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC7(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC8(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteC9(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteCA(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteCB(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteCC(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteCD(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteCE(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteCF(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD0(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD1(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD2(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD3(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD4(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD5(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD6(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD7(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD8(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteD9(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteDA(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteDB(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteDC(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteDD(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteDE(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteDF(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE0(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE1(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE2(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE3(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE4(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE5(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE6(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE7(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE8(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteE9(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteEA(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteEB(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteEC(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteED(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteEE(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteEF(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF0(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF1(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF2(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF3(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF4(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF5(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF6(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF7(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF8(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteF9(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteFA(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteFB(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteFC(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEAX >> 8), fnSrc.call(this));
                    this.regEAX = (this.regEAX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteFD(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regECX >> 8), fnSrc.call(this));
                    this.regECX = (this.regECX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteFE(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEDX >> 8), fnSrc.call(this));
                    this.regEDX = (this.regEDX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opModGrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpByteFF(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEBX >> 8), fnSrc.call(this));
                    this.regEBX = (this.regEBX & 0xff) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModB;
            
          • x86modb16.js
            /**
             * @fileoverview Implements PCjs 8086 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModB16 = {};
            
            X86ModB16.aOpModReg = [
                /**
                 * opMod16RegByte00(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte00(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte01(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte01(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte02(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte02(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte03(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte03(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte04(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte04(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte05(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte05(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte06(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte06(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte07(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte07(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte08(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte08(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte09(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte09(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte0A(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte0A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte0B(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte0B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte0C(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte0C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte0D(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte0D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte0E(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte0E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte0F(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte0F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte10(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte10(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte11(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte11(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte12(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte12(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte13(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte13(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte14(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte14(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte15(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte15(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte16(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte16(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte17(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte17(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte18(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte18(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte19(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte19(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte1A(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte1A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte1B(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte1B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte1C(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte1C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte1D(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte1D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte1E(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte1E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte1F(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte1F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte20(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte20(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte21(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte21(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte22(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte22(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte23(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte23(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte24(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte24(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte25(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte25(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte26(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte26(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte27(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte27(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte28(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte28(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte29(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte29(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte2A(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte2A(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte2B(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte2B(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte2C(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte2C(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte2D(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte2D(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte2E(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte2E(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte2F(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte2F(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte30(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte30(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte31(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte31(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte32(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte32(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte33(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte33(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte34(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte34(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte35(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte35(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte36(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte36(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte37(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte37(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte38(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte38(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte39(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte39(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte3A(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte3A(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegByte3B(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte3B(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegByte3C(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte3C(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte3D(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte3D(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte3E(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte3E(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegByte3F(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte3F(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegByte40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte40(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte41(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte42(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte43(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte44(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte45(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte46(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte47(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte48(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte49(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte4A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte4B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte4C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte4D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte4E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte4F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte50(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte51(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte52(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte53(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte54(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte55(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte56(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte57(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte58(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte59(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte5A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte5B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte5C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte5D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte5E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte5F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte60(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte60(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte61(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte61(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte62(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte62(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte63(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte63(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte64(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte64(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte65(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte65(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte66(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte66(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte67(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte67(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte68(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte68(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte69(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte69(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte6A(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte6B(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte6C(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte6D(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte6E(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte6F(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte70(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte70(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte71(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte71(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte72(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte72(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte73(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte73(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte74(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte74(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte75(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte75(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte76(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte76(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte77(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte77(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte78(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte78(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte79(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte79(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte7A(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte7B(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte7C(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte7D(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte7E(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte7F(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte80(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte81(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte82(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte83(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte84(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte85(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte86(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte87(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte88(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte89(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte8A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte8B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte8C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte8D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte8E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte8F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte90(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte91(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte92(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte93(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte94(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte95(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte96(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte97(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte98(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte99(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte9A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByte9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte9B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByte9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte9C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte9D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte9E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByte9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByte9F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA0(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA1(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA2(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA3(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA4(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA5(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA6(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA7(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA8(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteA9(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteAA(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteAB(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteAC(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteAD(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteAE(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteAF(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB0(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB1(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB2(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB3(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB4(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB5(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB6(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB7(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB8(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteB9(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteBA(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegByteBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteBB(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegByteBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteBC(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteBD(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteBE(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteBF(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegByteC0(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC0(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                },
                /**
                 * opMod16RegByteC1(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC1(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteC2(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC2(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteC3(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC3(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteC4(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC4(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteC5(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC5(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteC6(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC6(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteC7(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC7(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteC8(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC8(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteC9(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteC9(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                },
                /**
                 * opMod16RegByteCA(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteCA(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteCB(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteCB(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteCC(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteCC(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteCD(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteCD(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteCE(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteCE(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteCF(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteCF(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteD0(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD0(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteD1(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD1(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteD2(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD2(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                },
                /**
                 * opMod16RegByteD3(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD3(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteD4(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD4(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteD5(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD5(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteD6(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD6(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteD7(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD7(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteD8(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD8(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteD9(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteD9(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteDA(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteDA(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteDB(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteDB(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                },
                /**
                 * opMod16RegByteDC(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteDC(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteDD(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteDD(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteDE(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteDE(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteDF(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteDF(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteE0(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE0(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteE1(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE1(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regECX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteE2(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE2(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteE3(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE3(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteE4(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE4(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                },
                /**
                 * opMod16RegByteE5(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE5(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteE6(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE6(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteE7(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE7(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteE8(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE8(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteE9(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteE9(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regECX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteEA(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteEA(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteEB(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteEB(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteEC(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteEC(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteED(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteED(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                },
                /**
                 * opMod16RegByteEE(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteEE(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteEF(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteEF(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteF0(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF0(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteF1(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF1(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regECX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteF2(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF2(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteF3(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF3(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteF4(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF4(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteF5(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF5(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteF6(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF6(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                },
                /**
                 * opMod16RegByteF7(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF7(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
                },
                /**
                 * opMod16RegByteF8(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF8(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
                },
                /**
                 * opMod16RegByteF9(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteF9(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regECX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
                },
                /**
                 * opMod16RegByteFA(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteFA(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
                },
                /**
                 * opMod16RegByteFB(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteFB(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
                },
                /**
                 * opMod16RegByteFC(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteFC(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
                },
                /**
                 * opMod16RegByteFD(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteFD(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
                },
                /**
                 * opMod16RegByteFE(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteFE(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
                },
                /**
                 * opMod16RegByteFF(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegByteFF(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                }
            ];
            
            X86ModB16.aOpModMem = [
                /**
                 * opMod16MemByte00(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte00(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte01(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte01(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte02(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte02(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte03(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte03(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte04(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte04(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte05(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte05(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte06(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte06(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte07(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte07(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte08(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte08(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte09(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte09(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte0A(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte0A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte0B(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte0B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte0C(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte0C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte0D(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte0D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte0E(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte0E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte0F(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte0F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte10(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte10(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte11(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte11(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte12(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte12(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte13(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte13(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte14(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte14(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte15(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte15(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte16(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte16(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte17(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte17(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte18(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte18(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte19(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte19(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte1A(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte1A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte1B(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte1B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte1C(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte1C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte1D(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte1D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte1E(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte1E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte1F(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte1F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte20(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte20(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte21(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte21(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte22(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte22(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte23(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte23(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte24(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte24(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte25(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte25(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte26(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte26(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte27(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte27(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte28(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte28(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte29(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte29(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte2A(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte2A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte2B(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte2B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte2C(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte2C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte2D(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte2D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte2E(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte2E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte2F(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte2F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte30(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte30(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte31(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte31(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte32(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte32(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte33(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte33(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte34(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte34(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte35(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte35(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte36(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte36(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte37(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte37(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte38(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte38(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte39(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte39(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte3A(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte3A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemByte3B(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte3B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemByte3C(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte3C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte3D(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte3D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte3E(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte3E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemByte3F(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte3F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemByte40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte40(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte41(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte42(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte43(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte44(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte45(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte46(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte47(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte48(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte49(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte4A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte4B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte4C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte4D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte4E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte4F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte50(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte51(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte52(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte53(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte54(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte55(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte56(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte57(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte58(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte59(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte5A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte5B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte5C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte5D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte5E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte5F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte60(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte60(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte61(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte61(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte62(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte62(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte63(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte63(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte64(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte64(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte65(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte65(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte66(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte66(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte67(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte67(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte68(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte68(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte69(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte69(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte6A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte6B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte6C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte6D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte6E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte6F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte70(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte70(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte71(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte71(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte72(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte72(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte73(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte73(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte74(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte74(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte75(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte75(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte76(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte76(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte77(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte77(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte78(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte78(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte79(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte79(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte7A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte7B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte7C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte7D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte7E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte7F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte80(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte81(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte82(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte83(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte84(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte85(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte86(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte87(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte88(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte89(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte8A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte8B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte8C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte8D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte8E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte8F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte90(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte91(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte92(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte93(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte94(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte95(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte96(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte97(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte98(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte99(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte9A(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByte9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte9B(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByte9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte9C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte9D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte9E(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByte9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByte9F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA0(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA1(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA2(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA3(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA4(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA5(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA6(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA7(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA8(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteA9(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteAA(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteAB(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteAC(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteAD(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteAE(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteAF(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB0(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB1(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB2(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB3(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB4(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB5(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB6(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB7(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB8(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteB9(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteBA(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemByteBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteBB(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemByteBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteBC(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteBD(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteBE(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemByteBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemByteBF(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                X86ModB16.aOpModReg[0xC0],  X86ModB16.aOpModReg[0xC8],  X86ModB16.aOpModReg[0xD0],  X86ModB16.aOpModReg[0xD8],
                X86ModB16.aOpModReg[0xE0],  X86ModB16.aOpModReg[0xE8],  X86ModB16.aOpModReg[0xF0],  X86ModB16.aOpModReg[0xF8],
                X86ModB16.aOpModReg[0xC1],  X86ModB16.aOpModReg[0xC9],  X86ModB16.aOpModReg[0xD1],  X86ModB16.aOpModReg[0xD9],
                X86ModB16.aOpModReg[0xE1],  X86ModB16.aOpModReg[0xE9],  X86ModB16.aOpModReg[0xF1],  X86ModB16.aOpModReg[0xF9],
                X86ModB16.aOpModReg[0xC2],  X86ModB16.aOpModReg[0xCA],  X86ModB16.aOpModReg[0xD2],  X86ModB16.aOpModReg[0xDA],
                X86ModB16.aOpModReg[0xE2],  X86ModB16.aOpModReg[0xEA],  X86ModB16.aOpModReg[0xF2],  X86ModB16.aOpModReg[0xFA],
                X86ModB16.aOpModReg[0xC3],  X86ModB16.aOpModReg[0xCB],  X86ModB16.aOpModReg[0xD3],  X86ModB16.aOpModReg[0xDB],
                X86ModB16.aOpModReg[0xE3],  X86ModB16.aOpModReg[0xEB],  X86ModB16.aOpModReg[0xF3],  X86ModB16.aOpModReg[0xFB],
                X86ModB16.aOpModReg[0xC4],  X86ModB16.aOpModReg[0xCC],  X86ModB16.aOpModReg[0xD4],  X86ModB16.aOpModReg[0xDC],
                X86ModB16.aOpModReg[0xE4],  X86ModB16.aOpModReg[0xEC],  X86ModB16.aOpModReg[0xF4],  X86ModB16.aOpModReg[0xFC],
                X86ModB16.aOpModReg[0xC5],  X86ModB16.aOpModReg[0xCD],  X86ModB16.aOpModReg[0xD5],  X86ModB16.aOpModReg[0xDD],
                X86ModB16.aOpModReg[0xE5],  X86ModB16.aOpModReg[0xED],  X86ModB16.aOpModReg[0xF5],  X86ModB16.aOpModReg[0xFD],
                X86ModB16.aOpModReg[0xC6],  X86ModB16.aOpModReg[0xCE],  X86ModB16.aOpModReg[0xD6],  X86ModB16.aOpModReg[0xDE],
                X86ModB16.aOpModReg[0xE6],  X86ModB16.aOpModReg[0xEE],  X86ModB16.aOpModReg[0xF6],  X86ModB16.aOpModReg[0xFE],
                X86ModB16.aOpModReg[0xC7],  X86ModB16.aOpModReg[0xCF],  X86ModB16.aOpModReg[0xD7],  X86ModB16.aOpModReg[0xDF],
                X86ModB16.aOpModReg[0xE7],  X86ModB16.aOpModReg[0xEF],  X86ModB16.aOpModReg[0xF7],  X86ModB16.aOpModReg[0xFF]
            ];
            
            X86ModB16.aOpModGrp = [
                /**
                 * opMod16GrpByte00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte00(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte01(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte02(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte03(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte04(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte05(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte06(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte07(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte08(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte09(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte0A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte0B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte0C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte0D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte0E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte0F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte10(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte11(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte12(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte13(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte14(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte15(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte16(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte17(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte18(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte19(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte1A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte1B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte1C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte1D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte1E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte1F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte20(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte21(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte22(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte23(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte24(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte25(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte26(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte27(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte28(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte29(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte2A(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte2B(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte2C(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte2D(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte2E(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte2F(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte30(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte31(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte32(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte33(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte34(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte35(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte36(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte37(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte38(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte39(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte3A(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte3B(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte3C(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte3D(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte3E(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte3F(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte40(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte41(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte42(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte43(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte44(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte45(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte46(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte47(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte48(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte49(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte4A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte4B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte4C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte4D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte4E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte4F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte50(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte51(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte52(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte53(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte54(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte55(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte56(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte57(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte58(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte59(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte5A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte5B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte5C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte5D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte5E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte5F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte60(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte61(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte62(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte63(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte64(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte65(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte66(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte67(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte68(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte69(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte6A(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte6B(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte6C(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte6D(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte6E(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte6F(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte70(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte71(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte72(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte73(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte74(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte75(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte76(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte77(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte78(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte79(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte7A(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte7B(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte7C(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte7D(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte7E(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte7F(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte80(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte81(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte82(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte83(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte84(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte85(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte86(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte87(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte88(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte89(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte8A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte8B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte8C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte8D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte8E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte8F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte90(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte91(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte92(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte93(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte94(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte95(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte96(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte97(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte98(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte99(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte9A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte9B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte9C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte9D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte9E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByte9F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA0(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA1(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA2(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA3(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA4(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA5(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA6(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA7(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA8(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteA9(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteAA(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteAB(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteAC(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteAD(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteAE(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteAF(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB0(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB1(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB2(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB3(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB4(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB5(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB6(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB7(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB8(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteB9(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteBA(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteBB(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteBC(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteBD(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteBE(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteBF(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC0(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC1(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC2(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC3(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC4(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC5(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC6(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC7(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC8(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteC9(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteCA(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteCB(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteCC(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteCD(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteCE(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteCF(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD0(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD1(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD2(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD3(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD4(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD5(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD6(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD7(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD8(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteD9(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteDA(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteDB(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteDC(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteDD(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteDE(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteDF(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE0(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE1(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE2(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE3(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE4(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE5(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE6(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE7(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE8(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteE9(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteEA(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteEB(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteEC(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteED(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteEE(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteEF(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF0(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF1(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF2(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF3(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF4(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF5(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF6(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF7(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF8(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteF9(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteFA(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteFB(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteFC(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteFD(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteFE(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod16GrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpByteFF(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModB16;
            
          • x86modb32.js
            /**
             * @fileoverview Implements PCjs 80386 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2015-Jan-20
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModB32 = {};
            
            X86ModB32.aOpModReg = [
                /**
                 * opMod32RegByte00(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte00(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte01(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte01(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte02(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte02(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte03(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte03(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte04(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte04(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte05(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte05(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte06(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte06(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte07(fn): mod=00 (src:mem)  reg=000 (dst:AL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte07(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte08(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte08(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte09(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte09(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte0A(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte0A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte0B(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte0B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte0C(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte0C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte0D(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte0D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte0E(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte0E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte0F(fn): mod=00 (src:mem)  reg=001 (dst:CL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte0F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte10(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte10(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte11(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte11(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte12(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte12(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte13(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte13(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte14(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte14(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte15(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte15(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte16(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte16(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte17(fn): mod=00 (src:mem)  reg=010 (dst:DL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte17(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte18(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte18(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte19(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte19(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte1A(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte1A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte1B(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte1B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte1C(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte1C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte1D(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte1D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte1E(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte1E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte1F(fn): mod=00 (src:mem)  reg=011 (dst:BL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte1F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte20(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte20(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte21(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte21(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte22(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte22(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte23(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte23(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte24(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte24(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte25(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte25(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte26(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte26(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte27(fn): mod=00 (src:mem)  reg=100 (dst:AH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte27(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte28(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte28(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte29(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte29(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte2A(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte2A(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte2B(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte2B(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte2C(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte2C(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte2D(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte2D(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte2E(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte2E(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte2F(fn): mod=00 (src:mem)  reg=101 (dst:CH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte2F(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte30(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte30(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte31(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte31(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte32(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte32(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte33(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte33(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte34(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte34(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte35(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte35(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte36(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte36(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte37(fn): mod=00 (src:mem)  reg=110 (dst:DH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte37(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte38(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte38(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte39(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte39(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte3A(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte3A(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte3B(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte3B(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte3C(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte3C(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(0)));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte3D(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte3D(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegByte3E(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte3E(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte3F(fn): mod=00 (src:mem)  reg=111 (dst:BH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte3F(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegByte40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte40(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte41(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte42(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte43(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte44(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte45(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte46(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte47(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte48(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte49(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte4A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte4B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte4C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte4D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte4E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte4F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte50(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte51(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte52(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte53(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte54(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte55(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte56(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte57(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte58(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte59(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte5A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte5B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte5C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte5D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte5E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte5F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte60(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte60(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte61(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte61(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte62(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte62(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte63(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte63(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte64(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte64(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte65(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte65(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte66(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte66(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte67(fn): mod=01 (src:mem+d8)  reg=100 (dst:AH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte67(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte68(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte68(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte69(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte69(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte6A(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte6B(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte6C(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte6D(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte6E(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:CH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte6F(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte70(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte70(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte71(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte71(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte72(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte72(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte73(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte73(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte74(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte74(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte75(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte75(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte76(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte76(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte77(fn): mod=01 (src:mem+d8)  reg=110 (dst:DH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte77(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte78(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte78(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte79(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte79(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte7A(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte7B(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte7C(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte7D(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte7E(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:BH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte7F(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte80(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte81(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte82(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte83(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte84(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte85(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte86(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte87(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte88(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte89(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte8A(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte8B(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte8C(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte8D(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte8E(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte8F(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte90(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte91(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte92(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte93(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte94(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte95(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte96(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte97(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte98(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte99(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte9A(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte9B(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte9C(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte9D(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte9E(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByte9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByte9F(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA0(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA1(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA2(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA3(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA4(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA5(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA6(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:AH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA7(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA8(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteA9(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteAA(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteAB(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteAC(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteAD(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteAE(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:CH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteAF(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB0(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB1(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB2(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB3(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB4(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB5(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB6(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:DH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB7(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB8(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEAX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteB9(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regECX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteBA(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteBB(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteBC(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteBD(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteBE(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:BH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteBF(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.getEAByteData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegByteC0(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC0(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEAX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                },
                /**
                 * opMod32RegByteC1(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC1(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regECX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteC2(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC2(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEDX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteC3(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC3(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, this.regEBX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteC4(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC4(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteC5(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC5(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteC6(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC6(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteC7(fn): mod=11 (src:reg)  reg=000 (dst:AL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC7(fn) {
                    var b = fn.call(this, this.regEAX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteC8(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC8(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEAX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteC9(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteC9(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regECX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                },
                /**
                 * opMod32RegByteCA(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteCA(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEDX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteCB(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteCB(fn) {
                    var b = fn.call(this, this.regECX & 0xff, this.regEBX & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteCC(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteCC(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteCD(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteCD(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteCE(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteCE(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteCF(fn): mod=11 (src:reg)  reg=001 (dst:CL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteCF(fn) {
                    var b = fn.call(this, this.regECX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteD0(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD0(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEAX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteD1(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD1(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regECX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteD2(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD2(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEDX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                },
                /**
                 * opMod32RegByteD3(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD3(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, this.regEBX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteD4(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD4(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteD5(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD5(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteD6(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD6(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteD7(fn): mod=11 (src:reg)  reg=010 (dst:DL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD7(fn) {
                    var b = fn.call(this, this.regEDX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteD8(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD8(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEAX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteD9(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteD9(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regECX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteDA(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteDA(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEDX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteDB(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteDB(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, this.regEBX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                },
                /**
                 * opMod32RegByteDC(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteDC(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteDD(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteDD(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteDE(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteDE(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteDF(fn): mod=11 (src:reg)  reg=011 (dst:BL)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteDF(fn) {
                    var b = fn.call(this, this.regEBX & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteE0(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE0(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteE1(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE1(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regECX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteE2(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE2(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteE3(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE3(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteE4(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE4(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                },
                /**
                 * opMod32RegByteE5(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE5(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteE6(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE6(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteE7(fn): mod=11 (src:reg)  reg=100 (dst:AH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE7(fn) {
                    var b = fn.call(this, (this.regEAX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteE8(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE8(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteE9(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteE9(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regECX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteEA(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteEA(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteEB(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteEB(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteEC(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteEC(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteED(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteED(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                },
                /**
                 * opMod32RegByteEE(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteEE(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteEF(fn): mod=11 (src:reg)  reg=101 (dst:CH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteEF(fn) {
                    var b = fn.call(this, (this.regECX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteF0(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF0(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteF1(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF1(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regECX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteF2(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF2(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteF3(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF3(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteF4(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF4(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteF5(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF5(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteF6(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF6(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                },
                /**
                 * opMod32RegByteF7(fn): mod=11 (src:reg)  reg=110 (dst:DH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF7(fn) {
                    var b = fn.call(this, (this.regEDX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiBH;
                },
                /**
                 * opMod32RegByteF8(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF8(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEAX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAL;
                },
                /**
                 * opMod32RegByteF9(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteF9(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regECX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCL;
                },
                /**
                 * opMod32RegByteFA(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteFA(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEDX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDL;
                },
                /**
                 * opMod32RegByteFB(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteFB(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, this.regEBX & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiBL;
                },
                /**
                 * opMod32RegByteFC(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteFC(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEAX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiAH;
                },
                /**
                 * opMod32RegByteFD(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteFD(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regECX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiCH;
                },
                /**
                 * opMod32RegByteFE(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteFE(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEDX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiDH;
                },
                /**
                 * opMod32RegByteFF(fn): mod=11 (src:reg)  reg=111 (dst:BH)  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegByteFF(fn) {
                    var b = fn.call(this, (this.regEBX >> 8) & 0xff, (this.regEBX >> 8) & 0xff);
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                }
            ];
            
            X86ModB32.aOpModMem = [
                /**
                 * opMod32MemByte00(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte00(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte01(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte01(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte02(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte02(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte03(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte03(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte04(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte04(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte05(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte05(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte06(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte06(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte07(fn): mod=00 (dst:mem)  reg=000 (src:AL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte07(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte08(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte08(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte09(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte09(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte0A(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte0A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte0B(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte0B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte0C(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte0C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte0D(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte0D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte0E(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte0E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte0F(fn): mod=00 (dst:mem)  reg=001 (src:CL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte0F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte10(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte10(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte11(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte11(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte12(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte12(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte13(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte13(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte14(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte14(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte15(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte15(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte16(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte16(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte17(fn): mod=00 (dst:mem)  reg=010 (src:DL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte17(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte18(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte18(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte19(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte19(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte1A(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte1A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte1B(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte1B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte1C(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte1C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte1D(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte1D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte1E(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte1E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte1F(fn): mod=00 (dst:mem)  reg=011 (src:BL)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte1F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte20(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte20(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte21(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte21(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte22(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte22(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte23(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte23(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte24(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte24(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte25(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte25(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte26(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte26(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte27(fn): mod=00 (dst:mem)  reg=100 (src:AH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte27(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte28(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte28(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte29(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte29(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte2A(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte2A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte2B(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte2B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte2C(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte2C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte2D(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte2D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte2E(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte2E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte2F(fn): mod=00 (dst:mem)  reg=101 (src:CH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte2F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte30(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte30(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte31(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte31(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte32(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte32(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte33(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte33(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte34(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte34(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte35(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte35(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte36(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte36(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte37(fn): mod=00 (dst:mem)  reg=110 (src:DH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte37(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte38(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte38(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte39(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte39(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte3A(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte3A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte3B(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte3B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte3C(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte3C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(0)), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte3D(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte3D(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemByte3E(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte3E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte3F(fn): mod=00 (dst:mem)  reg=111 (src:BH)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte3F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemByte40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte40(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte41(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte42(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte43(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte44(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte45(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte46(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte47(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte48(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte49(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte4A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte4B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte4C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte4D(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte4E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte4F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte50(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte51(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte52(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte53(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte54(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte55(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte56(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte57(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte58(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte59(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte5A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte5B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte5C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte5D(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte5E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BL)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte5F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte60(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte60(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte61(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte61(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte62(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte62(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte63(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte63(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte64(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte64(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte65(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte65(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte66(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte66(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte67(fn): mod=01 (dst:mem+d8)  reg=100 (src:AH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte67(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte68(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte68(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte69(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte69(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte6A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte6B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte6C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte6D(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte6E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:CH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte6F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte70(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte70(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte71(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte71(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte72(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte72(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte73(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte73(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte74(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte74(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte75(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte75(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte76(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte76(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte77(fn): mod=01 (dst:mem+d8)  reg=110 (src:DH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte77(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte78(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte78(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte79(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte79(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte7A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte7B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte7C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte7D(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte7E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:BH)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte7F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte80(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte81(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte82(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte83(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte84(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte85(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte86(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte87(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEAX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte88(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte89(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte8A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte8B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte8C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte8D(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte8E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte8F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regECX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte90(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte91(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte92(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte93(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte94(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte95(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte96(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte97(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEDX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte98(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte99(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte9A(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte9B(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte9C(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte9D(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte9E(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByte9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BL)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByte9F(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), this.regEBX & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBL;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA0(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA1(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA2(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA3(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA4(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA5(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA6(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:AH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA7(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEAX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiAH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA8(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteA9(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteAA(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteAB(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteAC(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteAD(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteAE(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:CH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteAF(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regECX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiCH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB0(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB1(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB2(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB3(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB4(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB5(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB6(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:DH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB7(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEDX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiDH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB8(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteB9(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regECX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteBA(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteBB(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteBC(fn) {
                    var b = fn.call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteBD(fn) {
                    var b = fn.call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteBE(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regESI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemByteBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:BH)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemByteBF(fn) {
                    var b = fn.call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), (this.regEBX >> 8) & 0xff);
                    if (BACKTRACK) this.backTrack.btiEALo = this.backTrack.btiBH;
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                X86ModB32.aOpModReg[0xC0],    X86ModB32.aOpModReg[0xC8],    X86ModB32.aOpModReg[0xD0],    X86ModB32.aOpModReg[0xD8],
                X86ModB32.aOpModReg[0xE0],    X86ModB32.aOpModReg[0xE8],    X86ModB32.aOpModReg[0xF0],    X86ModB32.aOpModReg[0xF8],
                X86ModB32.aOpModReg[0xC1],    X86ModB32.aOpModReg[0xC9],    X86ModB32.aOpModReg[0xD1],    X86ModB32.aOpModReg[0xD9],
                X86ModB32.aOpModReg[0xE1],    X86ModB32.aOpModReg[0xE9],    X86ModB32.aOpModReg[0xF1],    X86ModB32.aOpModReg[0xF9],
                X86ModB32.aOpModReg[0xC2],    X86ModB32.aOpModReg[0xCA],    X86ModB32.aOpModReg[0xD2],    X86ModB32.aOpModReg[0xDA],
                X86ModB32.aOpModReg[0xE2],    X86ModB32.aOpModReg[0xEA],    X86ModB32.aOpModReg[0xF2],    X86ModB32.aOpModReg[0xFA],
                X86ModB32.aOpModReg[0xC3],    X86ModB32.aOpModReg[0xCB],    X86ModB32.aOpModReg[0xD3],    X86ModB32.aOpModReg[0xDB],
                X86ModB32.aOpModReg[0xE3],    X86ModB32.aOpModReg[0xEB],    X86ModB32.aOpModReg[0xF3],    X86ModB32.aOpModReg[0xFB],
                X86ModB32.aOpModReg[0xC4],    X86ModB32.aOpModReg[0xCC],    X86ModB32.aOpModReg[0xD4],    X86ModB32.aOpModReg[0xDC],
                X86ModB32.aOpModReg[0xE4],    X86ModB32.aOpModReg[0xEC],    X86ModB32.aOpModReg[0xF4],    X86ModB32.aOpModReg[0xFC],
                X86ModB32.aOpModReg[0xC5],    X86ModB32.aOpModReg[0xCD],    X86ModB32.aOpModReg[0xD5],    X86ModB32.aOpModReg[0xDD],
                X86ModB32.aOpModReg[0xE5],    X86ModB32.aOpModReg[0xED],    X86ModB32.aOpModReg[0xF5],    X86ModB32.aOpModReg[0xFD],
                X86ModB32.aOpModReg[0xC6],    X86ModB32.aOpModReg[0xCE],    X86ModB32.aOpModReg[0xD6],    X86ModB32.aOpModReg[0xDE],
                X86ModB32.aOpModReg[0xE6],    X86ModB32.aOpModReg[0xEE],    X86ModB32.aOpModReg[0xF6],    X86ModB32.aOpModReg[0xFE],
                X86ModB32.aOpModReg[0xC7],    X86ModB32.aOpModReg[0xCF],    X86ModB32.aOpModReg[0xD7],    X86ModB32.aOpModReg[0xDF],
                X86ModB32.aOpModReg[0xE7],    X86ModB32.aOpModReg[0xEF],    X86ModB32.aOpModReg[0xF7],    X86ModB32.aOpModReg[0xFF]
            ];
            
            X86ModB32.aOpModGrp = [
                /**
                 * opMod32GrpByte00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte00(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte01(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte02(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte03(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte04(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte05(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte06(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte07(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte08(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte09(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte0A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte0B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte0C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte0D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte0E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte0F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte10(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte11(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte12(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte13(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte14(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte15(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte16(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte17(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte18(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte19(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte1A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte1B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte1C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte1D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte1E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte1F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte20(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte21(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte22(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte23(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte24(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte25(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte26(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte27(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte28(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte29(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte2A(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte2B(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte2C(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte2D(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte2E(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte2F(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte30(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte31(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte32(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte33(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte34(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte35(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte36(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte37(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte38(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte39(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regECX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte3A(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte3B(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte3C(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte3D(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpByte3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte3E(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte3F(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpByte40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte40(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte41(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte42(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte43(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte44(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte45(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte46(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte47(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte48(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte49(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte4A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte4B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte4C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte4D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte4E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte4F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte50(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte51(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte52(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte53(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte54(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte55(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte56(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte57(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte58(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte59(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte5A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte5B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte5C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte5D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte5E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte5F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte60(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte61(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte62(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte63(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte64(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte65(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte66(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte67(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte68(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte69(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte6A(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte6B(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte6C(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte6D(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte6E(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte6F(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte70(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte71(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte72(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte73(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte74(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte75(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte76(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte77(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte78(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte79(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte7A(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte7B(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte7C(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte7D(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte7E(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte7F(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte80(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte81(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte82(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte83(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte84(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte85(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte86(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte87(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte88(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte89(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte8A(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte8B(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte8C(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte8D(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte8E(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte8F(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte90(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte91(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte92(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte93(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte94(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte95(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte96(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte97(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte98(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte99(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte9A(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte9B(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte9C(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte9D(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte9E(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByte9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByte9F(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA0(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA1(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA2(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA3(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA4(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA5(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA6(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA7(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA8(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteA9(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteAA(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteAB(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteAC(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteAD(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteAE(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteAF(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB0(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB1(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB2(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB3(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB4(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB5(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB6(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB7(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB8(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteB9(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteBA(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteBB(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteBC(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteBD(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteBE(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteBF(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.modEAByteData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAByte(b);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpByteC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC0(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC1(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC2(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC3(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC4(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC5(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC6(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC7(afnGrp, fnSrc) {
                    var b = afnGrp[0].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC8(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteC9(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteCA(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteCB(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteCC(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteCD(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteCE(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteCF(afnGrp, fnSrc) {
                    var b = afnGrp[1].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD0(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD1(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD2(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD3(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD4(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD5(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD6(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD7(afnGrp, fnSrc) {
                    var b = afnGrp[2].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD8(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteD9(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteDA(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteDB(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteDC(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteDD(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteDE(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteDF(afnGrp, fnSrc) {
                    var b = afnGrp[3].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE0(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE1(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE2(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE3(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE4(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE5(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE6(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE7(afnGrp, fnSrc) {
                    var b = afnGrp[4].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE8(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteE9(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteEA(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteEB(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteEC(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteED(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteEE(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteEF(afnGrp, fnSrc) {
                    var b = afnGrp[5].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF0(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF1(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF2(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF3(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF4(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF5(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF6(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF7(afnGrp, fnSrc) {
                    var b = afnGrp[6].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF8(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEAX & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteF9(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regECX & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteFA(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEDX & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BL)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteFB(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, this.regEBX & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff) | b;
                    if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (AH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteFC(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEAX >> 8) & 0xff, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (CH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteFD(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regECX >> 8) & 0xff, fnSrc.call(this));
                    this.regECX = (this.regECX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (DH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteFE(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEDX >> 8) & 0xff, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiEALo;
                },
                /**
                 * opMod32GrpByteFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (BH)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpByteFF(afnGrp, fnSrc) {
                    var b = afnGrp[7].call(this, (this.regEBX >> 8) & 0xff, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~0xff00) | (b << 8);
                    if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiEALo;
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModB32;
            
          • x86modsib.js
            /**
             * @fileoverview Implements PCjs 8086 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2015-Jan-20
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModSIB = {};
            
            /*
             * TODO: Factor out the SIB (scale=1) decoders that are functionally equivalent to one another,
             * just as I've already done for all the ModRM (register-to-register) decoders.  For example:
             *
             *      opModSIB01():   this.regECX + this.regEAX
             *
             * is functionally equivalent to:
             *
             *      opModSIB08():   this.regEAX + this.regECX
             *
             * This isn't super critical, since the SIB decoders are much smaller/simpler than the ModRM decoders,
             * but still, it's wasteful.
             */
            
            X86ModSIB.aOpModSIB = [
                /**
                 * opModSIB00(): scale=00 (1)  index=000 (EAX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB00(mod) {
                    return this.regEAX + this.regEAX;
                },
                /**
                 * opModSIB01(): scale=00 (1)  index=000 (EAX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB01(mod) {
                    return this.regECX + this.regEAX;
                },
                /**
                 * opModSIB02(): scale=00 (1)  index=000 (EAX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB02(mod) {
                    return this.regEDX + this.regEAX;
                },
                /**
                 * opModSIB03(): scale=00 (1)  index=000 (EAX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB03(mod) {
                    return this.regEBX + this.regEAX;
                },
                /**
                 * opModSIB04(): scale=00 (1)  index=000 (EAX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB04(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regEAX;
                },
                /**
                 * opModSIB05(): scale=00 (1)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB05(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEAX;
                },
                /**
                 * opModSIB06(): scale=00 (1)  index=000 (EAX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB06(mod) {
                    return this.regESI + this.regEAX;
                },
                /**
                 * opModSIB07(): scale=00 (1)  index=000 (EAX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB07(mod) {
                    return this.regEDI + this.regEAX;
                },
                /**
                 * opModSIB08(): scale=00 (1)  index=001 (ECX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB08(mod) {
                    return this.regEAX + this.regECX;
                },
                /**
                 * opModSIB09(): scale=00 (1)  index=001 (ECX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB09(mod) {
                    return this.regECX + this.regECX;
                },
                /**
                 * opModSIB0A(): scale=00 (1)  index=001 (ECX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB0A(mod) {
                    return this.regEDX + this.regECX;
                },
                /**
                 * opModSIB0B(): scale=00 (1)  index=001 (ECX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB0B(mod) {
                    return this.regEBX + this.regECX;
                },
                /**
                 * opModSIB0C(): scale=00 (1)  index=001 (ECX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB0C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regECX;
                },
                /**
                 * opModSIB0D(): scale=00 (1)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB0D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regECX;
                },
                /**
                 * opModSIB0E(): scale=00 (1)  index=001 (ECX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB0E(mod) {
                    return this.regESI + this.regECX;
                },
                /**
                 * opModSIB0F(): scale=00 (1)  index=001 (ECX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB0F(mod) {
                    return this.regEDI + this.regECX;
                },
                /**
                 * opModSIB10(): scale=00 (1)  index=010 (EDX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB10(mod) {
                    return this.regEAX + this.regEDX;
                },
                /**
                 * opModSIB11(): scale=00 (1)  index=010 (EDX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB11(mod) {
                    return this.regECX + this.regEDX;
                },
                /**
                 * opModSIB12(): scale=00 (1)  index=010 (EDX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB12(mod) {
                    return this.regEDX + this.regEDX;
                },
                /**
                 * opModSIB13(): scale=00 (1)  index=010 (EDX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB13(mod) {
                    return this.regEBX + this.regEDX;
                },
                /**
                 * opModSIB14(): scale=00 (1)  index=010 (EDX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB14(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regEDX;
                },
                /**
                 * opModSIB15(): scale=00 (1)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB15(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEDX;
                },
                /**
                 * opModSIB16(): scale=00 (1)  index=010 (EDX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB16(mod) {
                    return this.regESI + this.regEDX;
                },
                /**
                 * opModSIB17(): scale=00 (1)  index=010 (EDX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB17(mod) {
                    return this.regEDI + this.regEDX;
                },
                /**
                 * opModSIB18(): scale=00 (1)  index=011 (EBX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB18(mod) {
                    return this.regEAX + this.regEBX;
                },
                /**
                 * opModSIB19(): scale=00 (1)  index=011 (EBX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB19(mod) {
                    return this.regECX + this.regEBX;
                },
                /**
                 * opModSIB1A(): scale=00 (1)  index=011 (EBX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB1A(mod) {
                    return this.regEDX + this.regEBX;
                },
                /**
                 * opModSIB1B(): scale=00 (1)  index=011 (EBX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB1B(mod) {
                    return this.regEBX + this.regEBX;
                },
                /**
                 * opModSIB1C(): scale=00 (1)  index=011 (EBX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB1C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regEBX;
                },
                /**
                 * opModSIB1D(): scale=00 (1)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB1D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEBX;
                },
                /**
                 * opModSIB1E(): scale=00 (1)  index=011 (EBX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB1E(mod) {
                    return this.regESI + this.regEBX;
                },
                /**
                 * opModSIB1F(): scale=00 (1)  index=011 (EBX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB1F(mod) {
                    return this.regEDI + this.regEBX;
                },
                /**
                 * opModSIB20(): scale=00 (1)  index=100 (none)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB20(mod) {
                    return this.regEAX;
                },
                /**
                 * opModSIB21(): scale=00 (1)  index=100 (none)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB21(mod) {
                    return this.regECX;
                },
                /**
                 * opModSIB22(): scale=00 (1)  index=100 (none)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB22(mod) {
                    return this.regEDX;
                },
                /**
                 * opModSIB23(): scale=00 (1)  index=100 (none)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB23(mod) {
                    return this.regEBX;
                },
                /**
                 * opModSIB24(): scale=00 (1)  index=100 (none)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB24(mod) {
                    this.segData = this.segStack;
                    return this.getSP();
                },
                /**
                 * opModSIB25(): scale=00 (1)  index=100 (none)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB25(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                },
                /**
                 * opModSIB26(): scale=00 (1)  index=100 (none)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB26(mod) {
                    return this.regESI;
                },
                /**
                 * opModSIB27(): scale=00 (1)  index=100 (none)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB27(mod) {
                    return this.regEDI;
                },
                /**
                 * opModSIB28(): scale=00 (1)  index=101 (EBP)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB28(mod) {
                    return this.regEAX + this.regEBP;
                },
                /**
                 * opModSIB29(): scale=00 (1)  index=101 (EBP)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB29(mod) {
                    return this.regECX + this.regEBP;
                },
                /**
                 * opModSIB2A(): scale=00 (1)  index=101 (EBP)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB2A(mod) {
                    return this.regEDX + this.regEBP;
                },
                /**
                 * opModSIB2B(): scale=00 (1)  index=101 (EBP)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB2B(mod) {
                    return this.regEBX + this.regEBP;
                },
                /**
                 * opModSIB2C(): scale=00 (1)  index=101 (EBP)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB2C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regEBP;
                },
                /**
                 * opModSIB2D(): scale=00 (1)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB2D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEBP;
                },
                /**
                 * opModSIB2E(): scale=00 (1)  index=101 (EBP)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB2E(mod) {
                    return this.regESI + this.regEBP;
                },
                /**
                 * opModSIB2F(): scale=00 (1)  index=101 (EBP)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB2F(mod) {
                    return this.regEDI + this.regEBP;
                },
                /**
                 * opModSIB30(): scale=00 (1)  index=110 (ESI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB30(mod) {
                    return this.regEAX + this.regESI;
                },
                /**
                 * opModSIB31(): scale=00 (1)  index=110 (ESI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB31(mod) {
                    return this.regECX + this.regESI;
                },
                /**
                 * opModSIB32(): scale=00 (1)  index=110 (ESI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB32(mod) {
                    return this.regEDX + this.regESI;
                },
                /**
                 * opModSIB33(): scale=00 (1)  index=110 (ESI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB33(mod) {
                    return this.regEBX + this.regESI;
                },
                /**
                 * opModSIB34(): scale=00 (1)  index=110 (ESI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB34(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regESI;
                },
                /**
                 * opModSIB35(): scale=00 (1)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB35(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regESI;
                },
                /**
                 * opModSIB36(): scale=00 (1)  index=110 (ESI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB36(mod) {
                    return this.regESI + this.regESI;
                },
                /**
                 * opModSIB37(): scale=00 (1)  index=110 (ESI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB37(mod) {
                    return this.regEDI + this.regESI;
                },
                /**
                 * opModSIB38(): scale=00 (1)  index=111 (EDI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB38(mod) {
                    return this.regEAX + this.regEDI;
                },
                /**
                 * opModSIB39(): scale=00 (1)  index=111 (EDI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB39(mod) {
                    return this.regECX + this.regEDI;
                },
                /**
                 * opModSIB3A(): scale=00 (1)  index=111 (EDI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB3A(mod) {
                    return this.regEDX + this.regEDI;
                },
                /**
                 * opModSIB3B(): scale=00 (1)  index=111 (EDI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB3B(mod) {
                    return this.regEBX + this.regEDI;
                },
                /**
                 * opModSIB3C(): scale=00 (1)  index=111 (EDI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB3C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + this.regEDI;
                },
                /**
                 * opModSIB3D(): scale=00 (1)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB3D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + this.regEDI;
                },
                /**
                 * opModSIB3E(): scale=00 (1)  index=111 (EDI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB3E(mod) {
                    return this.regESI + this.regEDI;
                },
                /**
                 * opModSIB3F(): scale=00 (1)  index=111 (EDI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB3F(mod) {
                    return this.regEDI + this.regEDI;
                },
                /**
                 * opModSIB40(): scale=01 (2)  index=000 (EAX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB40(mod) {
                    return this.regEAX + (this.regEAX << 1);
                },
                /**
                 * opModSIB41(): scale=01 (2)  index=000 (EAX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB41(mod) {
                    return this.regECX + (this.regEAX << 1);
                },
                /**
                 * opModSIB42(): scale=01 (2)  index=000 (EAX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB42(mod) {
                    return this.regEDX + (this.regEAX << 1);
                },
                /**
                 * opModSIB43(): scale=01 (2)  index=000 (EAX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB43(mod) {
                    return this.regEBX + (this.regEAX << 1);
                },
                /**
                 * opModSIB44(): scale=01 (2)  index=000 (EAX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB44(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEAX << 1);
                },
                /**
                 * opModSIB45(): scale=01 (2)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB45(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 1);
                },
                /**
                 * opModSIB46(): scale=01 (2)  index=000 (EAX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB46(mod) {
                    return this.regESI + (this.regEAX << 1);
                },
                /**
                 * opModSIB47(): scale=01 (2)  index=000 (EAX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB47(mod) {
                    return this.regEDI + (this.regEAX << 1);
                },
                /**
                 * opModSIB48(): scale=01 (2)  index=001 (ECX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB48(mod) {
                    return this.regEAX + (this.regECX << 1);
                },
                /**
                 * opModSIB49(): scale=01 (2)  index=001 (ECX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB49(mod) {
                    return this.regECX + (this.regECX << 1);
                },
                /**
                 * opModSIB4A(): scale=01 (2)  index=001 (ECX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB4A(mod) {
                    return this.regEDX + (this.regECX << 1);
                },
                /**
                 * opModSIB4B(): scale=01 (2)  index=001 (ECX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB4B(mod) {
                    return this.regEBX + (this.regECX << 1);
                },
                /**
                 * opModSIB4C(): scale=01 (2)  index=001 (ECX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB4C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regECX << 1);
                },
                /**
                 * opModSIB4D(): scale=01 (2)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB4D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 1);
                },
                /**
                 * opModSIB4E(): scale=01 (2)  index=001 (ECX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB4E(mod) {
                    return this.regESI + (this.regECX << 1);
                },
                /**
                 * opModSIB4F(): scale=01 (2)  index=001 (ECX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB4F(mod) {
                    return this.regEDI + (this.regECX << 1);
                },
                /**
                 * opModSIB50(): scale=01 (2)  index=010 (EDX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB50(mod) {
                    return this.regEAX + (this.regEDX << 1);
                },
                /**
                 * opModSIB51(): scale=01 (2)  index=010 (EDX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB51(mod) {
                    return this.regECX + (this.regEDX << 1);
                },
                /**
                 * opModSIB52(): scale=01 (2)  index=010 (EDX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB52(mod) {
                    return this.regEDX + (this.regEDX << 1);
                },
                /**
                 * opModSIB53(): scale=01 (2)  index=010 (EDX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB53(mod) {
                    return this.regEBX + (this.regEDX << 1);
                },
                /**
                 * opModSIB54(): scale=01 (2)  index=010 (EDX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB54(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEDX << 1);
                },
                /**
                 * opModSIB55(): scale=01 (2)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB55(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 1);
                },
                /**
                 * opModSIB56(): scale=01 (2)  index=010 (EDX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB56(mod) {
                    return this.regESI + (this.regEDX << 1);
                },
                /**
                 * opModSIB57(): scale=01 (2)  index=010 (EDX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB57(mod) {
                    return this.regEDI + (this.regEDX << 1);
                },
                /**
                 * opModSIB58(): scale=01 (2)  index=011 (EBX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB58(mod) {
                    return this.regEAX + (this.regEBX << 1);
                },
                /**
                 * opModSIB59(): scale=01 (2)  index=011 (EBX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB59(mod) {
                    return this.regECX + (this.regEBX << 1);
                },
                /**
                 * opModSIB5A(): scale=01 (2)  index=011 (EBX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB5A(mod) {
                    return this.regEDX + (this.regEBX << 1);
                },
                /**
                 * opModSIB5B(): scale=01 (2)  index=011 (EBX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB5B(mod) {
                    return this.regEBX + (this.regEBX << 1);
                },
                /**
                 * opModSIB5C(): scale=01 (2)  index=011 (EBX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB5C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEBX << 1);
                },
                /**
                 * opModSIB5D(): scale=01 (2)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB5D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 1);
                },
                /**
                 * opModSIB5E(): scale=01 (2)  index=011 (EBX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB5E(mod) {
                    return this.regESI + (this.regEBX << 1);
                },
                /**
                 * opModSIB5F(): scale=01 (2)  index=011 (EBX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB5F(mod) {
                    return this.regEDI + (this.regEBX << 1);
                },
                /**
                 * opModSIB60(): scale=01 (2)  index=100 (none)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB60(mod) {
                    return this.regEAX;
                },
                /**
                 * opModSIB61(): scale=01 (2)  index=100 (none)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB61(mod) {
                    return this.regECX;
                },
                /**
                 * opModSIB62(): scale=01 (2)  index=100 (none)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB62(mod) {
                    return this.regEDX;
                },
                /**
                 * opModSIB63(): scale=01 (2)  index=100 (none)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB63(mod) {
                    return this.regEBX;
                },
                /**
                 * opModSIB64(): scale=01 (2)  index=100 (none)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB64(mod) {
                    this.segData = this.segStack;
                    return this.getSP();
                },
                /**
                 * opModSIB65(): scale=01 (2)  index=100 (none)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB65(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                },
                /**
                 * opModSIB66(): scale=01 (2)  index=100 (none)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB66(mod) {
                    return this.regESI;
                },
                /**
                 * opModSIB67(): scale=01 (2)  index=100 (none)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB67(mod) {
                    return this.regEDI;
                },
                /**
                 * opModSIB68(): scale=01 (2)  index=101 (EBP)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB68(mod) {
                    return this.regEAX + (this.regEBP << 1);
                },
                /**
                 * opModSIB69(): scale=01 (2)  index=101 (EBP)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB69(mod) {
                    return this.regECX + (this.regEBP << 1);
                },
                /**
                 * opModSIB6A(): scale=01 (2)  index=101 (EBP)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB6A(mod) {
                    return this.regEDX + (this.regEBP << 1);
                },
                /**
                 * opModSIB6B(): scale=01 (2)  index=101 (EBP)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB6B(mod) {
                    return this.regEBX + (this.regEBP << 1);
                },
                /**
                 * opModSIB6C(): scale=01 (2)  index=101 (EBP)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB6C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEBP << 1);
                },
                /**
                 * opModSIB6D(): scale=01 (2)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB6D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 1);
                },
                /**
                 * opModSIB6E(): scale=01 (2)  index=101 (EBP)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB6E(mod) {
                    return this.regESI + (this.regEBP << 1);
                },
                /**
                 * opModSIB6F(): scale=01 (2)  index=101 (EBP)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB6F(mod) {
                    return this.regEDI + (this.regEBP << 1);
                },
                /**
                 * opModSIB70(): scale=01 (2)  index=110 (ESI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB70(mod) {
                    return this.regEAX + (this.regESI << 1);
                },
                /**
                 * opModSIB71(): scale=01 (2)  index=110 (ESI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB71(mod) {
                    return this.regECX + (this.regESI << 1);
                },
                /**
                 * opModSIB72(): scale=01 (2)  index=110 (ESI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB72(mod) {
                    return this.regEDX + (this.regESI << 1);
                },
                /**
                 * opModSIB73(): scale=01 (2)  index=110 (ESI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB73(mod) {
                    return this.regEBX + (this.regESI << 1);
                },
                /**
                 * opModSIB74(): scale=01 (2)  index=110 (ESI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB74(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regESI << 1);
                },
                /**
                 * opModSIB75(): scale=01 (2)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB75(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 1);
                },
                /**
                 * opModSIB76(): scale=01 (2)  index=110 (ESI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB76(mod) {
                    return this.regESI + (this.regESI << 1);
                },
                /**
                 * opModSIB77(): scale=01 (2)  index=110 (ESI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB77(mod) {
                    return this.regEDI + (this.regESI << 1);
                },
                /**
                 * opModSIB78(): scale=01 (2)  index=111 (EDI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB78(mod) {
                    return this.regEAX + (this.regEDI << 1);
                },
                /**
                 * opModSIB79(): scale=01 (2)  index=111 (EDI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB79(mod) {
                    return this.regECX + (this.regEDI << 1);
                },
                /**
                 * opModSIB7A(): scale=01 (2)  index=111 (EDI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB7A(mod) {
                    return this.regEDX + (this.regEDI << 1);
                },
                /**
                 * opModSIB7B(): scale=01 (2)  index=111 (EDI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB7B(mod) {
                    return this.regEBX + (this.regEDI << 1);
                },
                /**
                 * opModSIB7C(): scale=01 (2)  index=111 (EDI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB7C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEDI << 1);
                },
                /**
                 * opModSIB7D(): scale=01 (2)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB7D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 1);
                },
                /**
                 * opModSIB7E(): scale=01 (2)  index=111 (EDI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB7E(mod) {
                    return this.regESI + (this.regEDI << 1);
                },
                /**
                 * opModSIB7F(): scale=01 (2)  index=111 (EDI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB7F(mod) {
                    return this.regEDI + (this.regEDI << 1);
                },
                /**
                 * opModSIB80(): scale=10 (4)  index=000 (EAX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB80(mod) {
                    return this.regEAX + (this.regEAX << 2);
                },
                /**
                 * opModSIB81(): scale=10 (4)  index=000 (EAX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB81(mod) {
                    return this.regECX + (this.regEAX << 2);
                },
                /**
                 * opModSIB82(): scale=10 (4)  index=000 (EAX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB82(mod) {
                    return this.regEDX + (this.regEAX << 2);
                },
                /**
                 * opModSIB83(): scale=10 (4)  index=000 (EAX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB83(mod) {
                    return this.regEBX + (this.regEAX << 2);
                },
                /**
                 * opModSIB84(): scale=10 (4)  index=000 (EAX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB84(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEAX << 2);
                },
                /**
                 * opModSIB85(): scale=10 (4)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB85(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 2);
                },
                /**
                 * opModSIB86(): scale=10 (4)  index=000 (EAX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB86(mod) {
                    return this.regESI + (this.regEAX << 2);
                },
                /**
                 * opModSIB87(): scale=10 (4)  index=000 (EAX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB87(mod) {
                    return this.regEDI + (this.regEAX << 2);
                },
                /**
                 * opModSIB88(): scale=10 (4)  index=001 (ECX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB88(mod) {
                    return this.regEAX + (this.regECX << 2);
                },
                /**
                 * opModSIB89(): scale=10 (4)  index=001 (ECX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB89(mod) {
                    return this.regECX + (this.regECX << 2);
                },
                /**
                 * opModSIB8A(): scale=10 (4)  index=001 (ECX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB8A(mod) {
                    return this.regEDX + (this.regECX << 2);
                },
                /**
                 * opModSIB8B(): scale=10 (4)  index=001 (ECX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB8B(mod) {
                    return this.regEBX + (this.regECX << 2);
                },
                /**
                 * opModSIB8C(): scale=10 (4)  index=001 (ECX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB8C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regECX << 2);
                },
                /**
                 * opModSIB8D(): scale=10 (4)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB8D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 2);
                },
                /**
                 * opModSIB8E(): scale=10 (4)  index=001 (ECX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB8E(mod) {
                    return this.regESI + (this.regECX << 2);
                },
                /**
                 * opModSIB8F(): scale=10 (4)  index=001 (ECX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB8F(mod) {
                    return this.regEDI + (this.regECX << 2);
                },
                /**
                 * opModSIB90(): scale=10 (4)  index=010 (EDX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB90(mod) {
                    return this.regEAX + (this.regEDX << 2);
                },
                /**
                 * opModSIB91(): scale=10 (4)  index=010 (EDX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB91(mod) {
                    return this.regECX + (this.regEDX << 2);
                },
                /**
                 * opModSIB92(): scale=10 (4)  index=010 (EDX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB92(mod) {
                    return this.regEDX + (this.regEDX << 2);
                },
                /**
                 * opModSIB93(): scale=10 (4)  index=010 (EDX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB93(mod) {
                    return this.regEBX + (this.regEDX << 2);
                },
                /**
                 * opModSIB94(): scale=10 (4)  index=010 (EDX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB94(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEDX << 2);
                },
                /**
                 * opModSIB95(): scale=10 (4)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB95(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 2);
                },
                /**
                 * opModSIB96(): scale=10 (4)  index=010 (EDX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB96(mod) {
                    return this.regESI + (this.regEDX << 2);
                },
                /**
                 * opModSIB97(): scale=10 (4)  index=010 (EDX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB97(mod) {
                    return this.regEDI + (this.regEDX << 2);
                },
                /**
                 * opModSIB98(): scale=10 (4)  index=011 (EBX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB98(mod) {
                    return this.regEAX + (this.regEBX << 2);
                },
                /**
                 * opModSIB99(): scale=10 (4)  index=011 (EBX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB99(mod) {
                    return this.regECX + (this.regEBX << 2);
                },
                /**
                 * opModSIB9A(): scale=10 (4)  index=011 (EBX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB9A(mod) {
                    return this.regEDX + (this.regEBX << 2);
                },
                /**
                 * opModSIB9B(): scale=10 (4)  index=011 (EBX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB9B(mod) {
                    return this.regEBX + (this.regEBX << 2);
                },
                /**
                 * opModSIB9C(): scale=10 (4)  index=011 (EBX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB9C(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEBX << 2);
                },
                /**
                 * opModSIB9D(): scale=10 (4)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB9D(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 2);
                },
                /**
                 * opModSIB9E(): scale=10 (4)  index=011 (EBX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB9E(mod) {
                    return this.regESI + (this.regEBX << 2);
                },
                /**
                 * opModSIB9F(): scale=10 (4)  index=011 (EBX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIB9F(mod) {
                    return this.regEDI + (this.regEBX << 2);
                },
                /**
                 * opModSIBA0(): scale=10 (4)  index=100 (none)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA0(mod) {
                    return this.regEAX;
                },
                /**
                 * opModSIBA1(): scale=10 (4)  index=100 (none)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA1(mod) {
                    return this.regECX;
                },
                /**
                 * opModSIBA2(): scale=10 (4)  index=100 (none)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA2(mod) {
                    return this.regEDX;
                },
                /**
                 * opModSIBA3(): scale=10 (4)  index=100 (none)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA3(mod) {
                    return this.regEBX;
                },
                /**
                 * opModSIBA4(): scale=10 (4)  index=100 (none)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA4(mod) {
                    this.segData = this.segStack;
                    return this.getSP();
                },
                /**
                 * opModSIBA5(): scale=10 (4)  index=100 (none)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA5(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                },
                /**
                 * opModSIBA6(): scale=10 (4)  index=100 (none)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA6(mod) {
                    return this.regESI;
                },
                /**
                 * opModSIBA7(): scale=10 (4)  index=100 (none)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA7(mod) {
                    return this.regEDI;
                },
                /**
                 * opModSIBA8(): scale=10 (4)  index=101 (EBP)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA8(mod) {
                    return this.regEAX + (this.regEBP << 2);
                },
                /**
                 * opModSIBA9(): scale=10 (4)  index=101 (EBP)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBA9(mod) {
                    return this.regECX + (this.regEBP << 2);
                },
                /**
                 * opModSIBAA(): scale=10 (4)  index=101 (EBP)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBAA(mod) {
                    return this.regEDX + (this.regEBP << 2);
                },
                /**
                 * opModSIBAB(): scale=10 (4)  index=101 (EBP)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBAB(mod) {
                    return this.regEBX + (this.regEBP << 2);
                },
                /**
                 * opModSIBAC(): scale=10 (4)  index=101 (EBP)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBAC(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEBP << 2);
                },
                /**
                 * opModSIBAD(): scale=10 (4)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBAD(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 2);
                },
                /**
                 * opModSIBAE(): scale=10 (4)  index=101 (EBP)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBAE(mod) {
                    return this.regESI + (this.regEBP << 2);
                },
                /**
                 * opModSIBAF(): scale=10 (4)  index=101 (EBP)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBAF(mod) {
                    return this.regEDI + (this.regEBP << 2);
                },
                /**
                 * opModSIBB0(): scale=10 (4)  index=110 (ESI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB0(mod) {
                    return this.regEAX + (this.regESI << 2);
                },
                /**
                 * opModSIBB1(): scale=10 (4)  index=110 (ESI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB1(mod) {
                    return this.regECX + (this.regESI << 2);
                },
                /**
                 * opModSIBB2(): scale=10 (4)  index=110 (ESI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB2(mod) {
                    return this.regEDX + (this.regESI << 2);
                },
                /**
                 * opModSIBB3(): scale=10 (4)  index=110 (ESI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB3(mod) {
                    return this.regEBX + (this.regESI << 2);
                },
                /**
                 * opModSIBB4(): scale=10 (4)  index=110 (ESI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB4(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regESI << 2);
                },
                /**
                 * opModSIBB5(): scale=10 (4)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB5(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 2);
                },
                /**
                 * opModSIBB6(): scale=10 (4)  index=110 (ESI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB6(mod) {
                    return this.regESI + (this.regESI << 2);
                },
                /**
                 * opModSIBB7(): scale=10 (4)  index=110 (ESI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB7(mod) {
                    return this.regEDI + (this.regESI << 2);
                },
                /**
                 * opModSIBB8(): scale=10 (4)  index=111 (EDI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB8(mod) {
                    return this.regEAX + (this.regEDI << 2);
                },
                /**
                 * opModSIBB9(): scale=10 (4)  index=111 (EDI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBB9(mod) {
                    return this.regECX + (this.regEDI << 2);
                },
                /**
                 * opModSIBBA(): scale=10 (4)  index=111 (EDI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBBA(mod) {
                    return this.regEDX + (this.regEDI << 2);
                },
                /**
                 * opModSIBBB(): scale=10 (4)  index=111 (EDI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBBB(mod) {
                    return this.regEBX + (this.regEDI << 2);
                },
                /**
                 * opModSIBBC(): scale=10 (4)  index=111 (EDI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBBC(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEDI << 2);
                },
                /**
                 * opModSIBBD(): scale=10 (4)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBBD(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 2);
                },
                /**
                 * opModSIBBE(): scale=10 (4)  index=111 (EDI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBBE(mod) {
                    return this.regESI + (this.regEDI << 2);
                },
                /**
                 * opModSIBBF(): scale=10 (4)  index=111 (EDI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBBF(mod) {
                    return this.regEDI + (this.regEDI << 2);
                },
                /**
                 * opModSIBC0(): scale=11 (8)  index=000 (EAX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC0(mod) {
                    return this.regEAX + (this.regEAX << 3);
                },
                /**
                 * opModSIBC1(): scale=11 (8)  index=000 (EAX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC1(mod) {
                    return this.regECX + (this.regEAX << 3);
                },
                /**
                 * opModSIBC2(): scale=11 (8)  index=000 (EAX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC2(mod) {
                    return this.regEDX + (this.regEAX << 3);
                },
                /**
                 * opModSIBC3(): scale=11 (8)  index=000 (EAX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC3(mod) {
                    return this.regEBX + (this.regEAX << 3);
                },
                /**
                 * opModSIBC4(): scale=11 (8)  index=000 (EAX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC4(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEAX << 3);
                },
                /**
                 * opModSIBC5(): scale=11 (8)  index=000 (EAX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC5(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEAX << 3);
                },
                /**
                 * opModSIBC6(): scale=11 (8)  index=000 (EAX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC6(mod) {
                    return this.regESI + (this.regEAX << 3);
                },
                /**
                 * opModSIBC7(): scale=11 (8)  index=000 (EAX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC7(mod) {
                    return this.regEDI + (this.regEAX << 3);
                },
                /**
                 * opModSIBC8(): scale=11 (8)  index=001 (ECX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC8(mod) {
                    return this.regEAX + (this.regECX << 3);
                },
                /**
                 * opModSIBC9(): scale=11 (8)  index=001 (ECX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBC9(mod) {
                    return this.regECX + (this.regECX << 3);
                },
                /**
                 * opModSIBCA(): scale=11 (8)  index=001 (ECX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBCA(mod) {
                    return this.regEDX + (this.regECX << 3);
                },
                /**
                 * opModSIBCB(): scale=11 (8)  index=001 (ECX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBCB(mod) {
                    return this.regEBX + (this.regECX << 3);
                },
                /**
                 * opModSIBCC(): scale=11 (8)  index=001 (ECX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBCC(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regECX << 3);
                },
                /**
                 * opModSIBCD(): scale=11 (8)  index=001 (ECX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBCD(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regECX << 3);
                },
                /**
                 * opModSIBCE(): scale=11 (8)  index=001 (ECX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBCE(mod) {
                    return this.regESI + (this.regECX << 3);
                },
                /**
                 * opModSIBCF(): scale=11 (8)  index=001 (ECX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBCF(mod) {
                    return this.regEDI + (this.regECX << 3);
                },
                /**
                 * opModSIBD0(): scale=11 (8)  index=010 (EDX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD0(mod) {
                    return this.regEAX + (this.regEDX << 3);
                },
                /**
                 * opModSIBD1(): scale=11 (8)  index=010 (EDX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD1(mod) {
                    return this.regECX + (this.regEDX << 3);
                },
                /**
                 * opModSIBD2(): scale=11 (8)  index=010 (EDX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD2(mod) {
                    return this.regEDX + (this.regEDX << 3);
                },
                /**
                 * opModSIBD3(): scale=11 (8)  index=010 (EDX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD3(mod) {
                    return this.regEBX + (this.regEDX << 3);
                },
                /**
                 * opModSIBD4(): scale=11 (8)  index=010 (EDX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD4(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEDX << 3);
                },
                /**
                 * opModSIBD5(): scale=11 (8)  index=010 (EDX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD5(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDX << 3);
                },
                /**
                 * opModSIBD6(): scale=11 (8)  index=010 (EDX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD6(mod) {
                    return this.regESI + (this.regEDX << 3);
                },
                /**
                 * opModSIBD7(): scale=11 (8)  index=010 (EDX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD7(mod) {
                    return this.regEDI + (this.regEDX << 3);
                },
                /**
                 * opModSIBD8(): scale=11 (8)  index=011 (EBX)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD8(mod) {
                    return this.regEAX + (this.regEBX << 3);
                },
                /**
                 * opModSIBD9(): scale=11 (8)  index=011 (EBX)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBD9(mod) {
                    return this.regECX + (this.regEBX << 3);
                },
                /**
                 * opModSIBDA(): scale=11 (8)  index=011 (EBX)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBDA(mod) {
                    return this.regEDX + (this.regEBX << 3);
                },
                /**
                 * opModSIBDB(): scale=11 (8)  index=011 (EBX)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBDB(mod) {
                    return this.regEBX + (this.regEBX << 3);
                },
                /**
                 * opModSIBDC(): scale=11 (8)  index=011 (EBX)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBDC(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEBX << 3);
                },
                /**
                 * opModSIBDD(): scale=11 (8)  index=011 (EBX)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBDD(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBX << 3);
                },
                /**
                 * opModSIBDE(): scale=11 (8)  index=011 (EBX)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBDE(mod) {
                    return this.regESI + (this.regEBX << 3);
                },
                /**
                 * opModSIBDF(): scale=11 (8)  index=011 (EBX)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBDF(mod) {
                    return this.regEDI + (this.regEBX << 3);
                },
                /**
                 * opModSIBE0(): scale=11 (8)  index=100 (none)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE0(mod) {
                    return this.regEAX;
                },
                /**
                 * opModSIBE1(): scale=11 (8)  index=100 (none)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE1(mod) {
                    return this.regECX;
                },
                /**
                 * opModSIBE2(): scale=11 (8)  index=100 (none)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE2(mod) {
                    return this.regEDX;
                },
                /**
                 * opModSIBE3(): scale=11 (8)  index=100 (none)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE3(mod) {
                    return this.regEBX;
                },
                /**
                 * opModSIBE4(): scale=11 (8)  index=100 (none)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE4(mod) {
                    this.segData = this.segStack;
                    return this.getSP();
                },
                /**
                 * opModSIBE5(): scale=11 (8)  index=100 (none)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE5(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord());
                },
                /**
                 * opModSIBE6(): scale=11 (8)  index=100 (none)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE6(mod) {
                    return this.regESI;
                },
                /**
                 * opModSIBE7(): scale=11 (8)  index=100 (none)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE7(mod) {
                    return this.regEDI;
                },
                /**
                 * opModSIBE8(): scale=11 (8)  index=101 (EBP)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE8(mod) {
                    return this.regEAX + (this.regEBP << 3);
                },
                /**
                 * opModSIBE9(): scale=11 (8)  index=101 (EBP)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBE9(mod) {
                    return this.regECX + (this.regEBP << 3);
                },
                /**
                 * opModSIBEA(): scale=11 (8)  index=101 (EBP)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBEA(mod) {
                    return this.regEDX + (this.regEBP << 3);
                },
                /**
                 * opModSIBEB(): scale=11 (8)  index=101 (EBP)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBEB(mod) {
                    return this.regEBX + (this.regEBP << 3);
                },
                /**
                 * opModSIBEC(): scale=11 (8)  index=101 (EBP)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBEC(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEBP << 3);
                },
                /**
                 * opModSIBED(): scale=11 (8)  index=101 (EBP)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBED(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEBP << 3);
                },
                /**
                 * opModSIBEE(): scale=11 (8)  index=101 (EBP)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBEE(mod) {
                    return this.regESI + (this.regEBP << 3);
                },
                /**
                 * opModSIBEF(): scale=11 (8)  index=101 (EBP)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBEF(mod) {
                    return this.regEDI + (this.regEBP << 3);
                },
                /**
                 * opModSIBF0(): scale=11 (8)  index=110 (ESI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF0(mod) {
                    return this.regEAX + (this.regESI << 3);
                },
                /**
                 * opModSIBF1(): scale=11 (8)  index=110 (ESI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF1(mod) {
                    return this.regECX + (this.regESI << 3);
                },
                /**
                 * opModSIBF2(): scale=11 (8)  index=110 (ESI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF2(mod) {
                    return this.regEDX + (this.regESI << 3);
                },
                /**
                 * opModSIBF3(): scale=11 (8)  index=110 (ESI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF3(mod) {
                    return this.regEBX + (this.regESI << 3);
                },
                /**
                 * opModSIBF4(): scale=11 (8)  index=110 (ESI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF4(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regESI << 3);
                },
                /**
                 * opModSIBF5(): scale=11 (8)  index=110 (ESI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF5(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regESI << 3);
                },
                /**
                 * opModSIBF6(): scale=11 (8)  index=110 (ESI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF6(mod) {
                    return this.regESI + (this.regESI << 3);
                },
                /**
                 * opModSIBF7(): scale=11 (8)  index=110 (ESI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF7(mod) {
                    return this.regEDI + (this.regESI << 3);
                },
                /**
                 * opModSIBF8(): scale=11 (8)  index=111 (EDI)  base=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF8(mod) {
                    return this.regEAX + (this.regEDI << 3);
                },
                /**
                 * opModSIBF9(): scale=11 (8)  index=111 (EDI)  base=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBF9(mod) {
                    return this.regECX + (this.regEDI << 3);
                },
                /**
                 * opModSIBFA(): scale=11 (8)  index=111 (EDI)  base=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBFA(mod) {
                    return this.regEDX + (this.regEDI << 3);
                },
                /**
                 * opModSIBFB(): scale=11 (8)  index=111 (EDI)  base=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBFB(mod) {
                    return this.regEBX + (this.regEDI << 3);
                },
                /**
                 * opModSIBFC(): scale=11 (8)  index=111 (EDI)  base=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBFC(mod) {
                    this.segData = this.segStack;
                    return this.getSP() + (this.regEDI << 3);
                },
                /**
                 * opModSIBFD(): scale=11 (8)  index=111 (EDI)  base=101 (mod? EBP : disp32)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBFD(mod) {
                    return (mod? ((this.segData = this.segStack), this.regEBP) : this.getIPWord()) + (this.regEDI << 3);
                },
                /**
                 * opModSIBFE(): scale=11 (8)  index=111 (EDI)  base=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBFE(mod) {
                    return this.regESI + (this.regEDI << 3);
                },
                /**
                 * opModSIBFF(): scale=11 (8)  index=111 (EDI)  base=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {number} mod
                 */
                function opModSIBFF(mod) {
                    return this.regEDI + (this.regEDI << 3);
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModSIB;
            
          • x86modw.js
            /**
             * @fileoverview Implements PCjs 8086 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModW = {};
            
            X86ModW.aOpModReg = [
                /**
                 * opModRegWord00(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord00(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord01(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord01(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord02(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord02(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord03(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord03(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord04(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord04(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord05(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord05(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord06(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord06(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord07(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord07(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord08(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord08(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord09(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord09(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord0A(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord0A(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord0B(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord0B(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord0C(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord0C(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord0D(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord0D(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord0E(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord0E(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord0F(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord0F(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord10(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord10(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord11(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord11(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord12(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord12(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord13(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord13(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord14(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord14(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord15(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord15(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord16(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord16(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord17(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord17(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord18(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord18(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord19(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord19(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord1A(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord1A(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord1B(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord1B(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord1C(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord1C(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord1D(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord1D(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord1E(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord1E(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord1F(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord1F(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord20(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord20(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord21(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord21(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord22(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord22(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord23(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord23(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord24(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord24(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord25(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord25(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord26(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord26(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord27(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord27(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX)));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord28(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord28(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord29(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord29(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord2A(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord2A(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord2B(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord2B(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord2C(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord2C(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord2D(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord2D(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord2E(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord2E(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord2F(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord2F(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord30(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord30(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord31(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord31(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord32(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord32(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord33(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord33(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord34(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord34(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord35(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord35(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord36(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord36(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord37(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord37(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord38(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord38(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord39(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord39(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord3A(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord3A(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModRegWord3B(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord3B(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModRegWord3C(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord3C(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord3D(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord3D(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord3E(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord3E(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModRegWord3F(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord3F(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModRegWord40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord40(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord41(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord42(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord43(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord44(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord45(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord46(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord47(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord48(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord49(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord4A(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord4B(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord4C(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord4D(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord4E(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord4F(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord50(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord51(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord52(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord53(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord54(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord55(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord56(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord57(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord58(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord59(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord5A(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord5B(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord5C(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord5D(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord5E(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord5F(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord60(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord60(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord61(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord61(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord62(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord62(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord63(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord63(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord64(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord64(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord65(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord65(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord66(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord66(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord67(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord67(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.getIPDisp())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord68(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord68(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord69(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord69(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord6A(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord6B(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord6C(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord6D(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord6E(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord6F(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord70(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord70(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord71(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord71(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord72(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord72(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord73(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord73(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord74(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord74(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord75(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord75(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord76(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord76(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord77(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord77(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord78(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord78(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord79(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord79(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord7A(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord7B(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord7C(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord7D(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord7E(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord7F(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord80(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord81(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord82(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord83(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord84(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord85(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord86(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord87(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord88(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord89(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord8A(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord8B(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord8C(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord8D(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord8E(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord8F(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord90(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord91(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord92(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord93(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord94(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord95(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord96(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord97(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord98(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord99(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord9A(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWord9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord9B(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWord9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord9C(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord9D(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord9E(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWord9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWord9F(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA0(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA1(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA2(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA3(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA4(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regESI + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA5(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEDI + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA6(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordStack(this.regEBP + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA7(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getEAWordData(this.regEBX + this.getIPAddr())));
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA8(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordA9(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordAA(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordAB(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordAC(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordAD(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordAE(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordAF(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB0(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB1(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB2(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB3(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB4(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB5(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB6(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB7(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB8(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordB9(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordBA(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModRegWordBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordBB(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModRegWordBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordBC(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regESI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordBD(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordBE(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordBF(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModRegWordC0(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC0(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regEAX);
                },
                /**
                 * opModRegWordC1(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC1(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opModRegWordC2(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC2(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opModRegWordC3(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC3(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opModRegWordC4(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC4(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordC5(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC5(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opModRegWordC6(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC6(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opModRegWordC7(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC7(fn) {
                    this.regEAX = fn.call(this, this.regEAX, this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opModRegWordC8(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC8(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opModRegWordC9(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordC9(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regECX);
                },
                /**
                 * opModRegWordCA(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordCA(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opModRegWordCB(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordCB(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opModRegWordCC(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordCC(fn) {
                    this.regECX = fn.call(this, this.regECX, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordCD(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordCD(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opModRegWordCE(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordCE(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opModRegWordCF(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordCF(fn) {
                    this.regECX = fn.call(this, this.regECX, this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opModRegWordD0(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD0(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opModRegWordD1(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD1(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opModRegWordD2(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD2(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regEDX);
                },
                /**
                 * opModRegWordD3(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD3(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opModRegWordD4(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD4(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordD5(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD5(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opModRegWordD6(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD6(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opModRegWordD7(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD7(fn) {
                    this.regEDX = fn.call(this, this.regEDX, this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opModRegWordD8(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD8(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opModRegWordD9(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordD9(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opModRegWordDA(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordDA(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opModRegWordDB(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordDB(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regEBX);
                },
                /**
                 * opModRegWordDC(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordDC(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordDD(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordDD(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opModRegWordDE(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordDE(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opModRegWordDF(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordDF(fn) {
                    this.regEBX = fn.call(this, this.regEBX, this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opModRegWordE0(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE0(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regEAX));
                },
                /**
                 * opModRegWordE1(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE1(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regECX));
                },
                /**
                 * opModRegWordE2(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE2(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regEDX));
                },
                /**
                 * opModRegWordE3(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE3(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regEBX));
                },
                /**
                 * opModRegWordE4(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE4(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.getSP()));
                },
                /**
                 * opModRegWordE5(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE5(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regEBP));
                },
                /**
                 * opModRegWordE6(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE6(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regESI));
                },
                /**
                 * opModRegWordE7(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE7(fn) {
                    this.setSP(fn.call(this, this.getSP(), this.regEDI));
                },
                /**
                 * opModRegWordE8(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE8(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opModRegWordE9(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordE9(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opModRegWordEA(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordEA(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opModRegWordEB(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordEB(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opModRegWordEC(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordEC(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordED(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordED(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regEBP);
                },
                /**
                 * opModRegWordEE(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordEE(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opModRegWordEF(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordEF(fn) {
                    this.regEBP = fn.call(this, this.regEBP, this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opModRegWordF0(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF0(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opModRegWordF1(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF1(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opModRegWordF2(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF2(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opModRegWordF3(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF3(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opModRegWordF4(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF4(fn) {
                    this.regESI = fn.call(this, this.regESI, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordF5(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF5(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opModRegWordF6(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF6(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regESI);
                },
                /**
                 * opModRegWordF7(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF7(fn) {
                    this.regESI = fn.call(this, this.regESI, this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opModRegWordF8(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF8(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opModRegWordF9(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordF9(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opModRegWordFA(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordFA(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opModRegWordFB(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordFB(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opModRegWordFC(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordFC(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opModRegWordFD(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordFD(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opModRegWordFE(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordFE(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opModRegWordFF(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModRegWordFF(fn) {
                    this.regEDI = fn.call(this, this.regEDI, this.regEDI);
                }
            ];
            
            X86ModW.aOpModMem = [
                /**
                 * opModMemWord00(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord00(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord01(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord01(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord02(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord02(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord03(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord03(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord04(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord04(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord05(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord05(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord06(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord06(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord07(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord07(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord08(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord08(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord09(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord09(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord0A(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord0A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord0B(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord0B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord0C(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord0C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord0D(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord0D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord0E(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord0E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord0F(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord0F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord10(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord10(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord11(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord11(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord12(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord12(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord13(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord13(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord14(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord14(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord15(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord15(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord16(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord16(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord17(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord17(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord18(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord18(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord19(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord19(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord1A(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord1A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord1B(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord1B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord1C(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord1C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord1D(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord1D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord1E(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord1E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord1F(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord1F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord20(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord20(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord21(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord21(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord22(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord22(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord23(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord23(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord24(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord24(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord25(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord25(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord26(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord26(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord27(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord27(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord28(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord28(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord29(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord29(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord2A(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord2A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord2B(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord2B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord2C(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord2C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord2D(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord2D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord2E(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord2E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord2F(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord2F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord30(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord30(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord31(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord31(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord32(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord32(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord33(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord33(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord34(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord34(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord35(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord35(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord36(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord36(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord37(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord37(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord38(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord38(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord39(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord39(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord3A(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord3A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModMemWord3B(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord3B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModMemWord3C(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord3C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord3D(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord3D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord3E(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord3E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModMemWord3F(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord3F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModMemWord40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord40(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord41(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord42(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord43(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord44(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord45(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord46(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord47(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord48(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord49(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord4A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord4B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord4C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord4D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord4E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord4F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord50(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord51(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord52(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord53(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord54(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord55(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord56(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord57(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord58(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord59(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord5A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord5B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord5C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord5D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord5E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord5F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord60(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord60(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord61(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord61(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord62(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord62(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord63(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord63(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord64(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord64(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord65(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord65(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord66(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord66(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord67(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord67(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord68(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord68(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord69(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord69(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord6A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord6B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord6C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord6D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord6E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord6F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord70(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord70(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord71(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord71(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord72(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord72(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord73(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord73(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord74(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord74(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord75(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord75(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord76(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord76(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord77(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord77(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord78(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord78(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord79(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord79(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord7A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord7B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord7C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord7D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord7E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord7F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord80(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord81(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord82(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord83(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord84(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord85(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord86(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord87(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord88(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord89(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord8A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord8B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord8C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord8D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord8E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord8F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord90(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord91(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord92(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord93(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord94(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord95(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord96(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord97(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord98(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord99(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord9A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWord9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord9B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWord9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord9C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord9D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord9E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWord9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWord9F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA0(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA1(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA2(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA3(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA4(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA5(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA6(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA7(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP());
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA8(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordA9(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordAA(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordAB(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordAC(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordAD(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordAE(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordAF(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB0(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB1(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB2(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB3(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB4(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB5(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB6(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB7(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB8(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordB9(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordBA(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModMemWordBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordBB(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModMemWordBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordBC(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordBD(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordBE(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModMemWordBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opModMemWordBF(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                X86ModW.aOpModReg[0xC0],    X86ModW.aOpModReg[0xC8],    X86ModW.aOpModReg[0xD0],    X86ModW.aOpModReg[0xD8],
                X86ModW.aOpModReg[0xE0],    X86ModW.aOpModReg[0xE8],    X86ModW.aOpModReg[0xF0],    X86ModW.aOpModReg[0xF8],
                X86ModW.aOpModReg[0xC1],    X86ModW.aOpModReg[0xC9],    X86ModW.aOpModReg[0xD1],    X86ModW.aOpModReg[0xD9],
                X86ModW.aOpModReg[0xE1],    X86ModW.aOpModReg[0xE9],    X86ModW.aOpModReg[0xF1],    X86ModW.aOpModReg[0xF9],
                X86ModW.aOpModReg[0xC2],    X86ModW.aOpModReg[0xCA],    X86ModW.aOpModReg[0xD2],    X86ModW.aOpModReg[0xDA],
                X86ModW.aOpModReg[0xE2],    X86ModW.aOpModReg[0xEA],    X86ModW.aOpModReg[0xF2],    X86ModW.aOpModReg[0xFA],
                X86ModW.aOpModReg[0xC3],    X86ModW.aOpModReg[0xCB],    X86ModW.aOpModReg[0xD3],    X86ModW.aOpModReg[0xDB],
                X86ModW.aOpModReg[0xE3],    X86ModW.aOpModReg[0xEB],    X86ModW.aOpModReg[0xF3],    X86ModW.aOpModReg[0xFB],
                X86ModW.aOpModReg[0xC4],    X86ModW.aOpModReg[0xCC],    X86ModW.aOpModReg[0xD4],    X86ModW.aOpModReg[0xDC],
                X86ModW.aOpModReg[0xE4],    X86ModW.aOpModReg[0xEC],    X86ModW.aOpModReg[0xF4],    X86ModW.aOpModReg[0xFC],
                X86ModW.aOpModReg[0xC5],    X86ModW.aOpModReg[0xCD],    X86ModW.aOpModReg[0xD5],    X86ModW.aOpModReg[0xDD],
                X86ModW.aOpModReg[0xE5],    X86ModW.aOpModReg[0xED],    X86ModW.aOpModReg[0xF5],    X86ModW.aOpModReg[0xFD],
                X86ModW.aOpModReg[0xC6],    X86ModW.aOpModReg[0xCE],    X86ModW.aOpModReg[0xD6],    X86ModW.aOpModReg[0xDE],
                X86ModW.aOpModReg[0xE6],    X86ModW.aOpModReg[0xEE],    X86ModW.aOpModReg[0xF6],    X86ModW.aOpModReg[0xFE],
                X86ModW.aOpModReg[0xC7],    X86ModW.aOpModReg[0xCF],    X86ModW.aOpModReg[0xD7],    X86ModW.aOpModReg[0xDF],
                X86ModW.aOpModReg[0xE7],    X86ModW.aOpModReg[0xEF],    X86ModW.aOpModReg[0xF7],    X86ModW.aOpModReg[0xFF]
            ];
            
            X86ModW.aOpModGrp = [
                /**
                 * opModGrpWord00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord00(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord01(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord02(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord03(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord04(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord05(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord06(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord07(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord08(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord09(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord0A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord0B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord0C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord0D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord0E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord0F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord10(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord11(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord12(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord13(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord14(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord15(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord16(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord17(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord18(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord19(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord1A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord1B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord1C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord1D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord1E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord1F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord20(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord21(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord22(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord23(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord24(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord25(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord26(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord27(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord28(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord29(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord2A(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord2B(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord2C(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord2D(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord2E(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord2F(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord30(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord31(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord32(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord33(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord34(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord35(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord36(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord37(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord38(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord39(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord3A(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opModGrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord3B(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opModGrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord3C(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord3D(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord3E(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opModGrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord3F(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opModGrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord40(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord41(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord42(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord43(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord44(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord45(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord46(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord47(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord48(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord49(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord4A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord4B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord4C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord4D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord4E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord4F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord50(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord51(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord52(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord53(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord54(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord55(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord56(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord57(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord58(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord59(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord5A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord5B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord5C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord5D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord5E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord5F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord60(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord61(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord62(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord63(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord64(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord65(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord66(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord67(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord68(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord69(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord6A(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord6B(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord6C(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord6D(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord6E(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord6F(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord70(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord71(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord72(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord73(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord74(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord75(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord76(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord77(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord78(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord79(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord7A(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord7B(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord7C(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord7D(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord7E(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord7F(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord80(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord81(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord82(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord83(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord84(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord85(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord86(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord87(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord88(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord89(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord8A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord8B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord8C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord8D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord8E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord8F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord90(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord91(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord92(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord93(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord94(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord95(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord96(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord97(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord98(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord99(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord9A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord9B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord9C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord9D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord9E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWord9F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA0(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA1(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA2(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA3(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA4(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA5(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA6(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA7(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA8(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordA9(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordAA(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordAB(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordAC(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordAD(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordAE(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordAF(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB0(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB1(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB2(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB3(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB4(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB5(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB6(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB7(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB8(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordB9(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordBA(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opModGrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordBB(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opModGrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordBC(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordBD(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordBE(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordBF(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opModGrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC0(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[0].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC1(afnGrp, fnSrc) {
                    this.regECX = afnGrp[0].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC2(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[0].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC3(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[0].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC4(afnGrp, fnSrc) {
                    this.setSP(afnGrp[0].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC5(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[0].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC6(afnGrp, fnSrc) {
                    this.regESI = afnGrp[0].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC7(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[0].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC8(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[1].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordC9(afnGrp, fnSrc) {
                    this.regECX = afnGrp[1].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordCA(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[1].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordCB(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[1].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordCC(afnGrp, fnSrc) {
                    this.setSP(afnGrp[1].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordCD(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[1].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordCE(afnGrp, fnSrc) {
                    this.regESI = afnGrp[1].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordCF(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[1].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD0(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[2].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD1(afnGrp, fnSrc) {
                    this.regECX = afnGrp[2].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD2(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[2].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD3(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[2].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD4(afnGrp, fnSrc) {
                    this.setSP(afnGrp[2].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD5(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[2].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD6(afnGrp, fnSrc) {
                    this.regESI = afnGrp[2].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD7(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[2].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD8(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[3].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordD9(afnGrp, fnSrc) {
                    this.regECX = afnGrp[3].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordDA(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[3].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordDB(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[3].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordDC(afnGrp, fnSrc) {
                    this.setSP(afnGrp[3].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordDD(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[3].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordDE(afnGrp, fnSrc) {
                    this.regESI = afnGrp[3].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordDF(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[3].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE0(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[4].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE1(afnGrp, fnSrc) {
                    this.regECX = afnGrp[4].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE2(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[4].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE3(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[4].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE4(afnGrp, fnSrc) {
                    this.setSP(afnGrp[4].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE5(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[4].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE6(afnGrp, fnSrc) {
                    this.regESI = afnGrp[4].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE7(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[4].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE8(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[5].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordE9(afnGrp, fnSrc) {
                    this.regECX = afnGrp[5].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordEA(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[5].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordEB(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[5].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordEC(afnGrp, fnSrc) {
                    this.setSP(afnGrp[5].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordED(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[5].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordEE(afnGrp, fnSrc) {
                    this.regESI = afnGrp[5].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordEF(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[5].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF0(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[6].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF1(afnGrp, fnSrc) {
                    this.regECX = afnGrp[6].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF2(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[6].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF3(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[6].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF4(afnGrp, fnSrc) {
                    this.setSP(afnGrp[6].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF5(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[6].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF6(afnGrp, fnSrc) {
                    this.regESI = afnGrp[6].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF7(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[6].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF8(afnGrp, fnSrc) {
                    this.regEAX = afnGrp[7].call(this, this.regEAX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordF9(afnGrp, fnSrc) {
                    this.regECX = afnGrp[7].call(this, this.regECX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordFA(afnGrp, fnSrc) {
                    this.regEDX = afnGrp[7].call(this, this.regEDX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordFB(afnGrp, fnSrc) {
                    this.regEBX = afnGrp[7].call(this, this.regEBX, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordFC(afnGrp, fnSrc) {
                    this.setSP(afnGrp[7].call(this, this.getSP(), fnSrc.call(this)));
                },
                /**
                 * opModGrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordFD(afnGrp, fnSrc) {
                    this.regEBP = afnGrp[7].call(this, this.regEBP, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordFE(afnGrp, fnSrc) {
                    this.regESI = afnGrp[7].call(this, this.regESI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opModGrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opModGrpWordFF(afnGrp, fnSrc) {
                    this.regEDI = afnGrp[7].call(this, this.regEDI, fnSrc.call(this));
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModW;
            
          • x86modw16.js
            /**
             * @fileoverview Implements PCjs 8086 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModW16 = {};
            
            X86ModW16.aOpModReg = [
                /**
                 * opMod16RegWord00(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord00(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord01(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord01(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord02(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord02(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord03(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord03(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord04(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord04(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord05(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord05(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord06(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord06(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord07(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord07(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord08(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord08(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord09(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord09(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord0A(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord0A(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord0B(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord0B(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord0C(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord0C(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord0D(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord0D(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord0E(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord0E(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord0F(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord0F(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord10(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord10(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord11(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord11(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord12(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord12(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord13(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord13(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord14(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord14(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord15(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord15(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord16(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord16(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord17(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord17(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord18(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord18(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord19(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord19(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord1A(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord1A(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord1B(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord1B(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord1C(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord1C(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord1D(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord1D(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord1E(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord1E(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord1F(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord1F(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord20(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord20(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord21(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord21(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord22(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord22(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord23(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord23(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord24(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord24(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord25(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord25(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord26(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord26(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord27(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord27(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord28(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord28(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord29(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord29(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord2A(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord2A(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord2B(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord2B(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord2C(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord2C(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord2D(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord2D(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord2E(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord2E(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord2F(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord2F(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord30(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord30(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord31(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord31(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord32(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord32(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord33(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord33(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord34(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord34(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord35(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord35(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord36(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord36(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord37(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord37(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord38(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord38(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord39(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord39(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord3A(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord3A(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16RegWord3B(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord3B(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16RegWord3C(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord3C(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord3D(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord3D(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord3E(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord3E(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16RegWord3F(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord3F(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16RegWord40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord40(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord41(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord42(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord43(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord44(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord45(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord46(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord47(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord48(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord49(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord4A(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord4B(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord4C(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord4D(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord4E(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord4F(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord50(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord51(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord52(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord53(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord54(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord55(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord56(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord57(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord58(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord59(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord5A(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord5B(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord5C(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord5D(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord5E(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord5F(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord60(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord60(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord61(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord61(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord62(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord62(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord63(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord63(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord64(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord64(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord65(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord65(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord66(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord66(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord67(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord67(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord68(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord68(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord69(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord69(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord6A(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord6B(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord6C(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord6D(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord6E(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord6F(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord70(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord70(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord71(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord71(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord72(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord72(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord73(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord73(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord74(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord74(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord75(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord75(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord76(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord76(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord77(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord77(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord78(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord78(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord79(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord79(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord7A(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord7B(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord7C(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord7D(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord7E(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord7F(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord80(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord81(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord82(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord83(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord84(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord85(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord86(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord87(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord88(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord89(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord8A(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord8B(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord8C(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord8D(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord8E(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord8F(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord90(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord91(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord92(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord93(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord94(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord95(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord96(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord97(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord98(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord99(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord9A(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWord9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord9B(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWord9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord9C(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord9D(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord9E(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWord9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWord9F(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA0(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA1(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA2(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA3(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA4(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA5(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA6(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA7(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA8(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordA9(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordAA(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordAB(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordAC(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordAD(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordAE(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordAF(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB0(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB1(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB2(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB3(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB4(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB5(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB6(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB7(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB8(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regESI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordB9(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.regEDI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordBA(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regESI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16RegWordBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordBB(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16RegWordBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordBC(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordBD(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordBE(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordBF(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16RegWordC0(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC0(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEAX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                },
                /**
                 * opMod16RegWordC1(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC1(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regECX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod16RegWordC2(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC2(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEDX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod16RegWordC3(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC3(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEBX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod16RegWordC4(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC4(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getSP() & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordC5(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC5(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEBP & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod16RegWordC6(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC6(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regESI & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod16RegWordC7(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC7(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEDI & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod16RegWordC8(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC8(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEAX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod16RegWordC9(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordC9(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regECX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                },
                /**
                 * opMod16RegWordCA(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordCA(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEDX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod16RegWordCB(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordCB(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEBX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod16RegWordCC(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordCC(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getSP() & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordCD(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordCD(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEBP & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod16RegWordCE(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordCE(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regESI & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod16RegWordCF(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordCF(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEDI & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod16RegWordD0(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD0(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEAX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod16RegWordD1(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD1(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regECX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod16RegWordD2(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD2(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEDX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                },
                /**
                 * opMod16RegWordD3(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD3(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEBX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod16RegWordD4(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD4(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getSP() & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordD5(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD5(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEBP & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod16RegWordD6(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD6(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regESI & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod16RegWordD7(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD7(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEDI & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod16RegWordD8(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD8(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEAX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod16RegWordD9(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordD9(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regECX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod16RegWordDA(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordDA(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEDX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod16RegWordDB(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordDB(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEBX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                },
                /**
                 * opMod16RegWordDC(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordDC(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getSP() & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordDD(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordDD(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEBP & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod16RegWordDE(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordDE(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regESI & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod16RegWordDF(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordDF(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEDI & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod16RegWordE0(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE0(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEAX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE1(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE1(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regECX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE2(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE2(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEDX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE3(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE3(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEBX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE4(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE4(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getSP() & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE5(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE5(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEBP & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE6(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE6(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regESI & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE7(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE7(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEDI & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16RegWordE8(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE8(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEAX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod16RegWordE9(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordE9(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regECX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod16RegWordEA(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordEA(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEDX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod16RegWordEB(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordEB(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEBX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod16RegWordEC(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordEC(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getSP() & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordED(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordED(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEBP & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                },
                /**
                 * opMod16RegWordEE(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordEE(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regESI & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod16RegWordEF(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordEF(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEDI & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod16RegWordF0(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF0(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEAX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod16RegWordF1(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF1(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regECX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod16RegWordF2(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF2(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEDX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod16RegWordF3(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF3(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEBX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod16RegWordF4(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF4(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getSP() & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordF5(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF5(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEBP & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod16RegWordF6(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF6(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regESI & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                },
                /**
                 * opMod16RegWordF7(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF7(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEDI & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod16RegWordF8(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF8(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEAX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod16RegWordF9(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordF9(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regECX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod16RegWordFA(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordFA(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEDX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod16RegWordFB(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordFB(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEBX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod16RegWordFC(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordFC(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getSP() & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod16RegWordFD(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordFD(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEBP & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod16RegWordFE(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordFE(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regESI & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod16RegWordFF(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16RegWordFF(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEDI & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                }
            ];
            
            X86ModW16.aOpModMem = [
                /**
                 * opMod16MemWord00(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord00(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord01(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord01(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord02(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord02(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord03(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord03(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord04(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord04(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord05(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord05(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord06(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord06(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord07(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord07(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord08(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord08(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord09(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord09(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord0A(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord0A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord0B(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord0B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord0C(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord0C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord0D(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord0D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord0E(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord0E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord0F(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord0F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord10(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord10(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord11(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord11(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord12(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord12(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord13(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord13(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord14(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord14(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord15(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord15(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord16(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord16(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord17(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord17(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord18(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord18(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord19(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord19(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord1A(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord1A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord1B(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord1B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord1C(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord1C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord1D(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord1D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord1E(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord1E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord1F(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord1F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord20(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord20(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord21(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord21(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord22(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord22(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord23(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord23(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord24(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord24(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord25(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord25(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord26(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord26(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord27(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord27(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord28(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord28(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord29(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord29(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord2A(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord2A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord2B(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord2B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord2C(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord2C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord2D(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord2D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord2E(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord2E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord2F(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord2F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord30(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord30(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord31(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord31(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord32(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord32(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord33(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord33(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord34(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord34(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord35(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord35(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord36(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord36(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord37(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord37(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord38(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord38(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord39(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord39(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord3A(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord3A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16MemWord3B(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord3B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16MemWord3C(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord3C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord3D(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord3D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord3E(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord3E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16MemWord3F(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord3F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16MemWord40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord40(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord41(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord42(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord43(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord44(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord45(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord46(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord47(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord48(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord49(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord4A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord4B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord4C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord4D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord4E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord4F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord50(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord51(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord52(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord53(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord54(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord55(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord56(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord57(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord58(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord59(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord5A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord5B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord5C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord5D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord5E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord5F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord60(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord60(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord61(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord61(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord62(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord62(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord63(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord63(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord64(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord64(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord65(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord65(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord66(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord66(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord67(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord67(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord68(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord68(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord69(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord69(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord6A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord6B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord6C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord6D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord6E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord6F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord70(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord70(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord71(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord71(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord72(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord72(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord73(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord73(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord74(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord74(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord75(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord75(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord76(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord76(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord77(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord77(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord78(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord78(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord79(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord79(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord7A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord7B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord7C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord7D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord7E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord7F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord80(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord81(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord82(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord83(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord84(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord85(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord86(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord87(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord88(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord89(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord8A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord8B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord8C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord8D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord8E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord8F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord90(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord91(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord92(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord93(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord94(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord95(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord96(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord97(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord98(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord99(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord9A(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWord9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord9B(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWord9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord9C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord9D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord9E(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWord9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWord9F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA0(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA1(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA2(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA3(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA4(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA5(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA6(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA7(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA8(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordA9(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordAA(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordAB(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordAC(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordAD(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordAE(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordAF(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB0(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB1(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB2(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB3(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB4(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB5(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB6(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB7(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB8(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordB9(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordBA(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16MemWordBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordBB(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16MemWordBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordBC(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordBD(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordBE(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16MemWordBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod16MemWordBF(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                X86ModW16.aOpModReg[0xC0],  X86ModW16.aOpModReg[0xC8],  X86ModW16.aOpModReg[0xD0],  X86ModW16.aOpModReg[0xD8],
                X86ModW16.aOpModReg[0xE0],  X86ModW16.aOpModReg[0xE8],  X86ModW16.aOpModReg[0xF0],  X86ModW16.aOpModReg[0xF8],
                X86ModW16.aOpModReg[0xC1],  X86ModW16.aOpModReg[0xC9],  X86ModW16.aOpModReg[0xD1],  X86ModW16.aOpModReg[0xD9],
                X86ModW16.aOpModReg[0xE1],  X86ModW16.aOpModReg[0xE9],  X86ModW16.aOpModReg[0xF1],  X86ModW16.aOpModReg[0xF9],
                X86ModW16.aOpModReg[0xC2],  X86ModW16.aOpModReg[0xCA],  X86ModW16.aOpModReg[0xD2],  X86ModW16.aOpModReg[0xDA],
                X86ModW16.aOpModReg[0xE2],  X86ModW16.aOpModReg[0xEA],  X86ModW16.aOpModReg[0xF2],  X86ModW16.aOpModReg[0xFA],
                X86ModW16.aOpModReg[0xC3],  X86ModW16.aOpModReg[0xCB],  X86ModW16.aOpModReg[0xD3],  X86ModW16.aOpModReg[0xDB],
                X86ModW16.aOpModReg[0xE3],  X86ModW16.aOpModReg[0xEB],  X86ModW16.aOpModReg[0xF3],  X86ModW16.aOpModReg[0xFB],
                X86ModW16.aOpModReg[0xC4],  X86ModW16.aOpModReg[0xCC],  X86ModW16.aOpModReg[0xD4],  X86ModW16.aOpModReg[0xDC],
                X86ModW16.aOpModReg[0xE4],  X86ModW16.aOpModReg[0xEC],  X86ModW16.aOpModReg[0xF4],  X86ModW16.aOpModReg[0xFC],
                X86ModW16.aOpModReg[0xC5],  X86ModW16.aOpModReg[0xCD],  X86ModW16.aOpModReg[0xD5],  X86ModW16.aOpModReg[0xDD],
                X86ModW16.aOpModReg[0xE5],  X86ModW16.aOpModReg[0xED],  X86ModW16.aOpModReg[0xF5],  X86ModW16.aOpModReg[0xFD],
                X86ModW16.aOpModReg[0xC6],  X86ModW16.aOpModReg[0xCE],  X86ModW16.aOpModReg[0xD6],  X86ModW16.aOpModReg[0xDE],
                X86ModW16.aOpModReg[0xE6],  X86ModW16.aOpModReg[0xEE],  X86ModW16.aOpModReg[0xF6],  X86ModW16.aOpModReg[0xFE],
                X86ModW16.aOpModReg[0xC7],  X86ModW16.aOpModReg[0xCF],  X86ModW16.aOpModReg[0xD7],  X86ModW16.aOpModReg[0xDF],
                X86ModW16.aOpModReg[0xE7],  X86ModW16.aOpModReg[0xEF],  X86ModW16.aOpModReg[0xF7],  X86ModW16.aOpModReg[0xFF]
            ];
            
            X86ModW16.aOpModGrp = [
                /**
                 * opMod16GrpWord00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord00(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord01(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord02(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord03(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord04(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord05(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord06(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord07(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord08(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord09(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord0A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord0B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord0C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord0D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord0E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord0F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord10(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord11(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord12(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord13(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord14(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord15(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord16(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord17(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord18(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord19(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord1A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord1B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord1C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord1D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord1E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord1F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord20(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord21(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord22(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord23(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord24(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord25(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord26(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord27(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord28(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord29(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord2A(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord2B(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord2C(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord2D(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord2E(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord2F(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord30(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord31(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord32(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord33(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord34(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord35(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord36(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord37(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (BX+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord38(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (BX+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord39(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (BP+SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord3A(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexExtra;
                },
                /**
                 * opMod16GrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (BP+DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord3B(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndex;
                },
                /**
                 * opMod16GrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord3C(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord3D(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord3E(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod16GrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord3F(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod16GrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord40(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord41(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord42(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord43(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord44(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord45(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord46(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord47(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord48(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord49(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord4A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord4B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord4C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord4D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord4E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord4F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord50(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord51(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord52(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord53(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord54(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord55(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord56(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord57(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord58(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord59(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord5A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord5B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord5C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord5D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord5E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord5F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord60(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord61(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord62(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord63(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord64(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord65(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord66(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord67(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord68(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord69(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord6A(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord6B(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord6C(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord6D(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord6E(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord6F(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord70(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord71(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord72(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord73(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord74(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord75(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord76(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord77(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord78(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord79(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord7A(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord7B(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (SI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord7C(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (DI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord7D(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (BP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord7E(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (BX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord7F(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord80(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord81(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord82(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord83(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord84(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord85(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord86(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord87(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord88(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord89(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord8A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord8B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord8C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord8D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord8E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord8F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord90(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord91(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord92(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord93(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord94(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord95(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord96(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord97(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord98(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord99(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord9A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord9B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord9C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord9D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord9E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWord9F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA0(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA1(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA2(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA3(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA4(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA5(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA6(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA7(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA8(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordA9(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordAA(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordAB(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordAC(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordAD(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordAE(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordAF(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB0(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB1(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB2(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB3(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB4(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB5(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB6(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB7(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (BX+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB8(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (BX+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordB9(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (BP+SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordBA(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDispExtra;
                },
                /**
                 * opMod16GrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (BP+DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordBB(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseIndexDisp;
                },
                /**
                 * opMod16GrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (SI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordBC(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (DI+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordBD(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (BP+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordBE(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (BX+d16)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordBF(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod16GrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC0(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC1(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC2(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC3(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC4(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC5(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC6(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC7(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC8(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordC9(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordCA(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordCB(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordCC(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordCD(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordCE(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordCF(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD0(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD1(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD2(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD3(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD4(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD5(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD6(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD7(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD8(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordD9(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordDA(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordDB(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordDC(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordDD(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordDE(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordDF(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE0(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE1(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE2(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE3(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE4(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE5(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE6(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE7(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE8(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordE9(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordEA(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordEB(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordEC(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordED(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordEE(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordEF(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF0(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF1(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF2(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF3(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF4(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF5(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF6(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF7(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (AX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF8(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (CX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordF9(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (DX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordFA(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (BX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordFB(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (SP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordFC(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod16GrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (BP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordFD(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (SI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordFE(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod16GrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (DI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod16GrpWordFF(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModW16;
            
          • x86modw32.js
            /**
             * @fileoverview Implements PCjs 8086 mode-byte decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2015-Jan-20
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            var X86ModW32 = {};
            
            X86ModW32.aOpModReg = [
                /**
                 * opMod32RegWord00(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord00(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord01(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord01(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord02(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord02(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord03(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord03(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord04(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord04(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord05(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord05(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord06(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord06(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord07(fn): mod=00 (src:mem)  reg=000 (dst:AX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord07(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord08(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord08(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord09(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord09(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord0A(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord0A(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord0B(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord0B(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord0C(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord0C(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord0D(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord0D(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord0E(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord0E(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord0F(fn): mod=00 (src:mem)  reg=001 (dst:CX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord0F(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord10(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord10(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord11(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord11(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord12(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord12(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord13(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord13(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord14(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord14(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord15(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord15(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord16(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord16(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord17(fn): mod=00 (src:mem)  reg=010 (dst:DX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord17(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord18(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord18(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord19(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord19(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord1A(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord1A(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord1B(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord1B(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord1C(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord1C(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord1D(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord1D(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord1E(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord1E(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord1F(fn): mod=00 (src:mem)  reg=011 (dst:BX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord1F(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord20(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord20(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord21(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord21(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord22(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord22(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord23(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord23(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord24(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord24(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord25(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord25(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord26(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord26(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord27(fn): mod=00 (src:mem)  reg=100 (dst:SP)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord27(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord28(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord28(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord29(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord29(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord2A(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord2A(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord2B(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord2B(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord2C(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord2C(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord2D(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord2D(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord2E(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord2E(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord2F(fn): mod=00 (src:mem)  reg=101 (dst:BP)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord2F(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord30(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord30(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord31(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord31(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord32(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord32(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord33(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord33(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord34(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord34(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord35(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord35(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord36(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord36(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord37(fn): mod=00 (src:mem)  reg=110 (dst:SI)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord37(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord38(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord38(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord39(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord39(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord3A(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord3A(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord3B(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord3B(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord3C(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord3C(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(0)));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord3D(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord3D(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32RegWord3E(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord3E(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord3F(fn): mod=00 (src:mem)  reg=111 (dst:DI)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord3F(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32RegWord40(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord40(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord41(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord41(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord42(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord42(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord43(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord43(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord44(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord44(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord45(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord45(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord46(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord46(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord47(fn): mod=01 (src:mem+d8)  reg=000 (dst:AX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord47(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord48(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord48(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord49(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord49(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord4A(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord4A(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord4B(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord4B(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord4C(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord4C(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord4D(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord4D(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord4E(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord4E(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord4F(fn): mod=01 (src:mem+d8)  reg=001 (dst:CX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord4F(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord50(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord50(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord51(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord51(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord52(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord52(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord53(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord53(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord54(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord54(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord55(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord55(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord56(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord56(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord57(fn): mod=01 (src:mem+d8)  reg=010 (dst:DX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord57(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord58(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord58(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord59(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord59(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord5A(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord5A(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord5B(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord5B(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord5C(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord5C(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord5D(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord5D(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord5E(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord5E(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord5F(fn): mod=01 (src:mem+d8)  reg=011 (dst:BX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord5F(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord60(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord60(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord61(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord61(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord62(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord62(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord63(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord63(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord64(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord64(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord65(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord65(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord66(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord66(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord67(fn): mod=01 (src:mem+d8)  reg=100 (dst:SP)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord67(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord68(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord68(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord69(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord69(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord6A(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord6A(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord6B(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord6B(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord6C(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord6C(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord6D(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord6D(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord6E(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord6E(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord6F(fn): mod=01 (src:mem+d8)  reg=101 (dst:BP)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord6F(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord70(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord70(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord71(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord71(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord72(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord72(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord73(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord73(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord74(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord74(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord75(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord75(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord76(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord76(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord77(fn): mod=01 (src:mem+d8)  reg=110 (dst:SI)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord77(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord78(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord78(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord79(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord79(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord7A(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord7A(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord7B(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord7B(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord7C(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord7C(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(1) + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord7D(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord7D(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord7E(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord7E(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord7F(fn): mod=01 (src:mem+d8)  reg=111 (dst:DI)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord7F(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPDisp()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord80(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord80(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord81(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord81(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord82(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord82(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord83(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord83(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord84(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord84(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord85(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord85(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord86(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord86(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord87(fn): mod=10 (src:mem+d16)  reg=000 (dst:AX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord87(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord88(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord88(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord89(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord89(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord8A(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord8A(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord8B(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord8B(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord8C(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord8C(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord8D(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord8D(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord8E(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord8E(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord8F(fn): mod=10 (src:mem+d16)  reg=001 (dst:CX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord8F(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord90(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord90(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord91(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord91(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord92(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord92(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord93(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord93(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord94(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord94(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord95(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord95(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord96(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord96(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord97(fn): mod=10 (src:mem+d16)  reg=010 (dst:DX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord97(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord98(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord98(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord99(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord99(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord9A(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord9A(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord9B(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord9B(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord9C(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord9C(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord9D(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord9D(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord9E(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord9E(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWord9F(fn): mod=10 (src:mem+d16)  reg=011 (dst:BX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWord9F(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA0(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA0(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA1(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA1(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA2(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA2(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA3(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA3(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA4(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA4(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA5(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA5(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA6(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA6(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA7(fn): mod=10 (src:mem+d16)  reg=100 (dst:SP)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA7(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA8(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA8(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordA9(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordA9(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordAA(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordAA(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordAB(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordAB(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordAC(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordAC(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordAD(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordAD(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordAE(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordAE(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordAF(fn): mod=10 (src:mem+d16)  reg=101 (dst:BP)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordAF(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB0(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB0(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB1(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB1(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB2(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB2(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB3(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB3(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB4(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB4(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB5(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB5(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB6(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB6(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB7(fn): mod=10 (src:mem+d16)  reg=110 (dst:SI)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB7(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB8(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB8(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEAX + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordB9(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordB9(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regECX + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordBA(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordBA(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDX + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordBB(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordBB(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEBX + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordBC(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordBC(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.getSIBAddr(2) + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordBD(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordBD(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordStack(this.regEBP + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordBE(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordBE(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regESI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordBF(fn): mod=10 (src:mem+d16)  reg=111 (dst:DI)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordBF(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getEAWordData(this.regEDI + this.getIPAddr()));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32RegWordC0(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC0(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEAX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                },
                /**
                 * opMod32RegWordC1(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC1(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regECX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiAH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod32RegWordC2(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC2(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEDX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiAH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod32RegWordC3(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC3(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEBX & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiAH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod32RegWordC4(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC4(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.getSP() & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = X86.BACKTRACK.SP_LO; this.backTrack.btiAH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordC5(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC5(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEBP & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiAH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod32RegWordC6(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC6(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regESI & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiAH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod32RegWordC7(fn): mod=11 (src:reg)  reg=000 (dst:AX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC7(fn) {
                    var w = fn.call(this, this.regEAX & this.dataMask, this.regEDI & this.dataMask);
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiAH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod32RegWordC8(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC8(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEAX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiAL; this.backTrack.btiCH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod32RegWordC9(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordC9(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regECX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                },
                /**
                 * opMod32RegWordCA(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordCA(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEDX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiDL; this.backTrack.btiCH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod32RegWordCB(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordCB(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEBX & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiBL; this.backTrack.btiCH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod32RegWordCC(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordCC(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.getSP() & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = X86.BACKTRACK.SP_LO; this.backTrack.btiCH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordCD(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordCD(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEBP & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiBPLo; this.backTrack.btiCH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod32RegWordCE(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordCE(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regESI & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiSILo; this.backTrack.btiCH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod32RegWordCF(fn): mod=11 (src:reg)  reg=001 (dst:CX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordCF(fn) {
                    var w = fn.call(this, this.regECX & this.dataMask, this.regEDI & this.dataMask);
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiDILo; this.backTrack.btiCH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod32RegWordD0(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD0(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEAX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiAL; this.backTrack.btiDH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod32RegWordD1(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD1(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regECX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiCL; this.backTrack.btiDH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod32RegWordD2(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD2(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEDX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                },
                /**
                 * opMod32RegWordD3(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD3(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEBX & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiBL; this.backTrack.btiDH = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod32RegWordD4(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD4(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.getSP() & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = X86.BACKTRACK.SP_LO; this.backTrack.btiDH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordD5(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD5(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEBP & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiBPLo; this.backTrack.btiDH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod32RegWordD6(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD6(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regESI & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiSILo; this.backTrack.btiDH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod32RegWordD7(fn): mod=11 (src:reg)  reg=010 (dst:DX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD7(fn) {
                    var w = fn.call(this, this.regEDX & this.dataMask, this.regEDI & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiDILo; this.backTrack.btiDH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod32RegWordD8(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD8(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEAX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiAL; this.backTrack.btiBH = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod32RegWordD9(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordD9(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regECX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiCL; this.backTrack.btiBH = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod32RegWordDA(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordDA(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEDX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiDL; this.backTrack.btiBH = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod32RegWordDB(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordDB(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEBX & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                },
                /**
                 * opMod32RegWordDC(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordDC(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.getSP() & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = X86.BACKTRACK.SP_LO; this.backTrack.btiBH = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordDD(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordDD(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEBP & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiBPLo; this.backTrack.btiBH = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod32RegWordDE(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordDE(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regESI & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiSILo; this.backTrack.btiBH = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod32RegWordDF(fn): mod=11 (src:reg)  reg=011 (dst:BX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordDF(fn) {
                    var w = fn.call(this, this.regEBX & this.dataMask, this.regEDI & this.dataMask);
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiDILo; this.backTrack.btiBH = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod32RegWordE0(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE0(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEAX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE1(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE1(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regECX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE2(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE2(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEDX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE3(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE3(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEBX & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE4(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE4(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.getSP() & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE5(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE5(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEBP & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE6(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE6(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regESI & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE7(fn): mod=11 (src:reg)  reg=100 (dst:SP)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE7(fn) {
                    var w = fn.call(this, this.getSP() & this.dataMask, this.regEDI & this.dataMask);
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32RegWordE8(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE8(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEAX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiAL; this.backTrack.btiBPHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod32RegWordE9(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordE9(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regECX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiCL; this.backTrack.btiBPHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod32RegWordEA(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordEA(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEDX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiDL; this.backTrack.btiBPHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod32RegWordEB(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordEB(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEBX & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiBL; this.backTrack.btiBPHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod32RegWordEC(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordEC(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.getSP() & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = X86.BACKTRACK.SP_LO; this.backTrack.btiBPHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordED(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordED(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEBP & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                },
                /**
                 * opMod32RegWordEE(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordEE(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regESI & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiSILo; this.backTrack.btiBPHi = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod32RegWordEF(fn): mod=11 (src:reg)  reg=101 (dst:BP)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordEF(fn) {
                    var w = fn.call(this, this.regEBP & this.dataMask, this.regEDI & this.dataMask);
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiDILo; this.backTrack.btiBPHi = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod32RegWordF0(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF0(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEAX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiAL; this.backTrack.btiSIHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod32RegWordF1(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF1(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regECX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiCL; this.backTrack.btiSIHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod32RegWordF2(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF2(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEDX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiDL; this.backTrack.btiSIHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod32RegWordF3(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF3(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEBX & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiBL; this.backTrack.btiSIHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod32RegWordF4(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF4(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.getSP() & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = X86.BACKTRACK.SP_LO; this.backTrack.btiSIHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordF5(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF5(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEBP & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiBPLo; this.backTrack.btiSIHi = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod32RegWordF6(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF6(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regESI & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                },
                /**
                 * opMod32RegWordF7(fn): mod=11 (src:reg)  reg=110 (dst:SI)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF7(fn) {
                    var w = fn.call(this, this.regESI & this.dataMask, this.regEDI & this.dataMask);
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiDILo; this.backTrack.btiSIHi = this.backTrack.btiDIHi;
                    }
                },
                /**
                 * opMod32RegWordF8(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF8(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEAX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiAL; this.backTrack.btiDIHi = this.backTrack.btiAH;
                    }
                },
                /**
                 * opMod32RegWordF9(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordF9(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regECX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiCL; this.backTrack.btiDIHi = this.backTrack.btiCH;
                    }
                },
                /**
                 * opMod32RegWordFA(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordFA(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEDX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiDL; this.backTrack.btiDIHi = this.backTrack.btiDH;
                    }
                },
                /**
                 * opMod32RegWordFB(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordFB(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEBX & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiBL; this.backTrack.btiDIHi = this.backTrack.btiBH;
                    }
                },
                /**
                 * opMod32RegWordFC(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordFC(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.getSP() & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = X86.BACKTRACK.SP_LO; this.backTrack.btiDIHi = X86.BACKTRACK.SP_HI;
                    }
                },
                /**
                 * opMod32RegWordFD(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordFD(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEBP & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiBPLo; this.backTrack.btiDIHi = this.backTrack.btiBPHi;
                    }
                },
                /**
                 * opMod32RegWordFE(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordFE(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regESI & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiSILo; this.backTrack.btiDIHi = this.backTrack.btiSIHi;
                    }
                },
                /**
                 * opMod32RegWordFF(fn): mod=11 (src:reg)  reg=111 (dst:DI)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32RegWordFF(fn) {
                    var w = fn.call(this, this.regEDI & this.dataMask, this.regEDI & this.dataMask);
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                }
            ];
            
            X86ModW32.aOpModMem = [
                /**
                 * opMod32MemWord00(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord00(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord01(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord01(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord02(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord02(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord03(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord03(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord04(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord04(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord05(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord05(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord06(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord06(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord07(fn): mod=00 (dst:mem)  reg=000 (src:AX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord07(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord08(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord08(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord09(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord09(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord0A(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord0A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord0B(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord0B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord0C(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord0C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord0D(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord0D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord0E(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord0E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord0F(fn): mod=00 (dst:mem)  reg=001 (src:CX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord0F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord10(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord10(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord11(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord11(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord12(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord12(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord13(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord13(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord14(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord14(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord15(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord15(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord16(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord16(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord17(fn): mod=00 (dst:mem)  reg=010 (src:DX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord17(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord18(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord18(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord19(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord19(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord1A(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord1A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord1B(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord1B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord1C(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord1C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord1D(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord1D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord1E(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord1E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord1F(fn): mod=00 (dst:mem)  reg=011 (src:BX)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord1F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord20(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord20(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord21(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord21(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord22(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord22(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord23(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord23(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord24(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord24(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord25(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord25(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord26(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord26(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord27(fn): mod=00 (dst:mem)  reg=100 (src:SP)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord27(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord28(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord28(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord29(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord29(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord2A(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord2A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord2B(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord2B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord2C(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord2C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord2D(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord2D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord2E(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord2E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord2F(fn): mod=00 (dst:mem)  reg=101 (src:BP)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord2F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord30(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord30(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord31(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord31(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord32(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord32(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord33(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord33(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord34(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord34(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord35(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord35(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord36(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord36(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord37(fn): mod=00 (dst:mem)  reg=110 (src:SI)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord37(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord38(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord38(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord39(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord39(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord3A(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord3A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord3B(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord3B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord3C(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord3C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(0)), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord3D(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord3D(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32MemWord3E(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord3E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord3F(fn): mod=00 (dst:mem)  reg=111 (src:DI)  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord3F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32MemWord40(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord40(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord41(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord41(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord42(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord42(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord43(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord43(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord44(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord44(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord45(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord45(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord46(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord46(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord47(fn): mod=01 (dst:mem+d8)  reg=000 (src:AX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord47(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord48(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord48(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord49(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord49(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord4A(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord4A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord4B(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord4B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord4C(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord4C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord4D(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord4D(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord4E(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord4E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord4F(fn): mod=01 (dst:mem+d8)  reg=001 (src:CX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord4F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord50(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord50(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord51(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord51(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord52(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord52(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord53(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord53(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord54(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord54(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord55(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord55(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord56(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord56(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord57(fn): mod=01 (dst:mem+d8)  reg=010 (src:DX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord57(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord58(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord58(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord59(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord59(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord5A(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord5A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord5B(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord5B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord5C(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord5C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord5D(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord5D(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord5E(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord5E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord5F(fn): mod=01 (dst:mem+d8)  reg=011 (src:BX)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord5F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord60(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord60(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord61(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord61(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord62(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord62(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord63(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord63(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord64(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord64(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord65(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord65(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord66(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord66(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord67(fn): mod=01 (dst:mem+d8)  reg=100 (src:SP)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord67(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord68(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord68(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord69(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord69(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord6A(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord6A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord6B(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord6B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord6C(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord6C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord6D(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord6D(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord6E(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord6E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord6F(fn): mod=01 (dst:mem+d8)  reg=101 (src:BP)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord6F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord70(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord70(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord71(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord71(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord72(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord72(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord73(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord73(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord74(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord74(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord75(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord75(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord76(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord76(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord77(fn): mod=01 (dst:mem+d8)  reg=110 (src:SI)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord77(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord78(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord78(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord79(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord79(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord7A(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord7A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord7B(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord7B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord7C(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord7C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord7D(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord7D(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord7E(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord7E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord7F(fn): mod=01 (dst:mem+d8)  reg=111 (src:DI)  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord7F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord80(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord80(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord81(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord81(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord82(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord82(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord83(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord83(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord84(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord84(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord85(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord85(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord86(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord86(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord87(fn): mod=10 (dst:mem+d16)  reg=000 (src:AX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord87(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEAX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiAL; this.backTrack.btiEAHi = this.backTrack.btiAH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord88(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord88(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord89(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord89(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord8A(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord8A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord8B(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord8B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord8C(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord8C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord8D(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord8D(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord8E(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord8E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord8F(fn): mod=10 (dst:mem+d16)  reg=001 (src:CX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord8F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regECX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiCL; this.backTrack.btiEAHi = this.backTrack.btiCH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord90(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord90(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord91(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord91(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord92(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord92(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord93(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord93(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord94(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord94(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord95(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord95(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord96(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord96(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord97(fn): mod=10 (dst:mem+d16)  reg=010 (src:DX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord97(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDL; this.backTrack.btiEAHi = this.backTrack.btiDH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord98(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord98(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord99(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord99(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord9A(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord9A(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord9B(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord9B(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord9C(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord9C(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord9D(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord9D(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord9E(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord9E(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWord9F(fn): mod=10 (dst:mem+d16)  reg=011 (src:BX)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWord9F(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBX & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBL; this.backTrack.btiEAHi = this.backTrack.btiBH;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA0(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA0(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA1(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA1(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA2(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA2(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA3(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA3(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA4(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA4(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA5(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA5(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA6(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA6(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA7(fn): mod=10 (dst:mem+d16)  reg=100 (src:SP)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA7(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.getSP() & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = X86.BACKTRACK.SP_LO; this.backTrack.btiEAHi = X86.BACKTRACK.SP_HI;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA8(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA8(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordA9(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordA9(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordAA(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordAA(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordAB(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordAB(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordAC(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordAC(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordAD(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordAD(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordAE(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordAE(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordAF(fn): mod=10 (dst:mem+d16)  reg=101 (src:BP)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordAF(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEBP & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiBPLo; this.backTrack.btiEAHi = this.backTrack.btiBPHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB0(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB0(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB1(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB1(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB2(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB2(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB3(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB3(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB4(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB4(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB5(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB5(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB6(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB6(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB7(fn): mod=10 (dst:mem+d16)  reg=110 (src:SI)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB7(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regESI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiSILo; this.backTrack.btiEAHi = this.backTrack.btiSIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB8(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB8(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordB9(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordB9(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regECX + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordBA(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordBA(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordBB(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordBB(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordBC(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordBC(fn) {
                    var w = fn.call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordBD(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordBD(fn) {
                    var w = fn.call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordBE(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordBE(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regESI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32MemWordBF(fn): mod=10 (dst:mem+d16)  reg=111 (src:DI)  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {function(number,number)} fn (dst,src)
                 */
                function opMod32MemWordBF(fn) {
                    var w = fn.call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), this.regEDI & this.dataMask);
                    if (BACKTRACK) {
                        this.backTrack.btiEALo = this.backTrack.btiDILo; this.backTrack.btiEAHi = this.backTrack.btiDIHi;
                    }
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                X86ModW32.aOpModReg[0xC0],    X86ModW32.aOpModReg[0xC8],    X86ModW32.aOpModReg[0xD0],    X86ModW32.aOpModReg[0xD8],
                X86ModW32.aOpModReg[0xE0],    X86ModW32.aOpModReg[0xE8],    X86ModW32.aOpModReg[0xF0],    X86ModW32.aOpModReg[0xF8],
                X86ModW32.aOpModReg[0xC1],    X86ModW32.aOpModReg[0xC9],    X86ModW32.aOpModReg[0xD1],    X86ModW32.aOpModReg[0xD9],
                X86ModW32.aOpModReg[0xE1],    X86ModW32.aOpModReg[0xE9],    X86ModW32.aOpModReg[0xF1],    X86ModW32.aOpModReg[0xF9],
                X86ModW32.aOpModReg[0xC2],    X86ModW32.aOpModReg[0xCA],    X86ModW32.aOpModReg[0xD2],    X86ModW32.aOpModReg[0xDA],
                X86ModW32.aOpModReg[0xE2],    X86ModW32.aOpModReg[0xEA],    X86ModW32.aOpModReg[0xF2],    X86ModW32.aOpModReg[0xFA],
                X86ModW32.aOpModReg[0xC3],    X86ModW32.aOpModReg[0xCB],    X86ModW32.aOpModReg[0xD3],    X86ModW32.aOpModReg[0xDB],
                X86ModW32.aOpModReg[0xE3],    X86ModW32.aOpModReg[0xEB],    X86ModW32.aOpModReg[0xF3],    X86ModW32.aOpModReg[0xFB],
                X86ModW32.aOpModReg[0xC4],    X86ModW32.aOpModReg[0xCC],    X86ModW32.aOpModReg[0xD4],    X86ModW32.aOpModReg[0xDC],
                X86ModW32.aOpModReg[0xE4],    X86ModW32.aOpModReg[0xEC],    X86ModW32.aOpModReg[0xF4],    X86ModW32.aOpModReg[0xFC],
                X86ModW32.aOpModReg[0xC5],    X86ModW32.aOpModReg[0xCD],    X86ModW32.aOpModReg[0xD5],    X86ModW32.aOpModReg[0xDD],
                X86ModW32.aOpModReg[0xE5],    X86ModW32.aOpModReg[0xED],    X86ModW32.aOpModReg[0xF5],    X86ModW32.aOpModReg[0xFD],
                X86ModW32.aOpModReg[0xC6],    X86ModW32.aOpModReg[0xCE],    X86ModW32.aOpModReg[0xD6],    X86ModW32.aOpModReg[0xDE],
                X86ModW32.aOpModReg[0xE6],    X86ModW32.aOpModReg[0xEE],    X86ModW32.aOpModReg[0xF6],    X86ModW32.aOpModReg[0xFE],
                X86ModW32.aOpModReg[0xC7],    X86ModW32.aOpModReg[0xCF],    X86ModW32.aOpModReg[0xD7],    X86ModW32.aOpModReg[0xDF],
                X86ModW32.aOpModReg[0xE7],    X86ModW32.aOpModReg[0xEF],    X86ModW32.aOpModReg[0xF7],    X86ModW32.aOpModReg[0xFF]
            ];
            
            X86ModW32.aOpModGrp = [
                /**
                 * opMod32GrpWord00(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord00(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord01(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord01(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord02(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord02(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord03(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord03(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord04(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord04(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord05(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord05(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord06(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord06(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord07(afnGrp, fnSrc): mod=00 (dst:mem)  reg=000 (afnGrp[0])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord07(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord08(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord08(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord09(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord09(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord0A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord0A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord0B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord0B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord0C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord0C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord0D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord0D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord0E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord0E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord0F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=001 (afnGrp[1])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord0F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord10(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord10(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord11(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord11(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord12(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord12(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord13(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord13(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord14(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord14(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord15(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord15(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord16(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord16(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord17(afnGrp, fnSrc): mod=00 (dst:mem)  reg=010 (afnGrp[2])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord17(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord18(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord18(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord19(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord19(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord1A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord1A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord1B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord1B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord1C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord1C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord1D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord1D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord1E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord1E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord1F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=011 (afnGrp[3])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord1F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord20(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord20(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord21(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord21(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord22(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord22(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord23(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord23(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord24(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord24(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord25(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord25(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord26(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord26(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord27(afnGrp, fnSrc): mod=00 (dst:mem)  reg=100 (afnGrp[4])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord27(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord28(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord28(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord29(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord29(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord2A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord2A(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord2B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord2B(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord2C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord2C(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord2D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord2D(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord2E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord2E(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord2F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=101 (afnGrp[5])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord2F(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord30(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord30(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord31(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord31(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord32(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord32(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord33(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord33(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord34(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord34(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord35(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord35(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord36(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord36(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord37(afnGrp, fnSrc): mod=00 (dst:mem)  reg=110 (afnGrp[6])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord37(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord38(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord38(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord39(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord39(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regECX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord3A(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord3A(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord3B(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord3B(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord3C(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=100 (sib)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord3C(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(0)), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord3D(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=101 (d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord3D(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesDisp;
                },
                /**
                 * opMod32GrpWord3E(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord3E(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord3F(afnGrp, fnSrc): mod=00 (dst:mem)  reg=111 (afnGrp[7])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord3F(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBase;
                },
                /**
                 * opMod32GrpWord40(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord40(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord41(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord41(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord42(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord42(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord43(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord43(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord44(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord44(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord45(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord45(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord46(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord46(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord47(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=000 (afnGrp[0])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord47(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord48(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord48(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord49(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord49(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord4A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord4A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord4B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord4B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord4C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord4C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord4D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord4D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord4E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord4E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord4F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=001 (afnGrp[1])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord4F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord50(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord50(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord51(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord51(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord52(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord52(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord53(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord53(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord54(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord54(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord55(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord55(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord56(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord56(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord57(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=010 (afnGrp[2])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord57(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord58(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord58(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord59(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord59(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord5A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord5A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord5B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord5B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord5C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord5C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord5D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord5D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord5E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord5E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord5F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=011 (afnGrp[3])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord5F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord60(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord60(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord61(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord61(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord62(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord62(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord63(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord63(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord64(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord64(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord65(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord65(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord66(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord66(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord67(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=100 (afnGrp[4])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord67(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord68(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord68(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord69(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord69(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord6A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord6A(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord6B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord6B(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord6C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord6C(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord6D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord6D(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord6E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord6E(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord6F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=101 (afnGrp[5])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord6F(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord70(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord70(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord71(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord71(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord72(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord72(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord73(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord73(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord74(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord74(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord75(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord75(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord76(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord76(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord77(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=110 (afnGrp[6])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord77(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord78(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=000 (EAX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord78(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord79(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=001 (ECX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord79(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regECX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord7A(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=010 (EDX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord7A(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord7B(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=011 (EBX+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord7B(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord7C(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=100 (sib+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord7C(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(1) + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord7D(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=101 (EBP+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord7D(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord7E(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=110 (ESI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord7E(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord7F(afnGrp, fnSrc): mod=01 (dst:mem+d8)  reg=111 (afnGrp[7])  r/m=111 (EDI+d8)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord7F(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPDisp()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord80(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord80(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord81(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord81(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord82(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord82(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord83(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord83(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord84(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord84(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord85(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord85(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord86(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord86(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord87(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=000 (afnGrp[0])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord87(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord88(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord88(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord89(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord89(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord8A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord8A(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord8B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord8B(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord8C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord8C(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord8D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord8D(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord8E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord8E(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord8F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=001 (afnGrp[1])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord8F(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord90(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord90(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord91(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord91(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord92(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord92(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord93(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord93(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord94(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord94(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord95(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord95(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord96(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord96(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord97(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=010 (afnGrp[2])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord97(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord98(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord98(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord99(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord99(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord9A(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord9A(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord9B(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord9B(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord9C(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord9C(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord9D(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord9D(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord9E(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord9E(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWord9F(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=011 (afnGrp[3])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWord9F(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA0(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA1(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA2(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA3(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA4(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA5(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA6(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=100 (afnGrp[4])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA7(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA8(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordA9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordA9(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordAA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordAA(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordAB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordAB(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordAC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordAC(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordAD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordAD(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordAE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordAE(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordAF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=101 (afnGrp[5])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordAF(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB0(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB0(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB1(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB1(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB2(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB2(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB3(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB3(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB4(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB4(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB5(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB5(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB6(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB6(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB7(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=110 (afnGrp[6])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB7(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB8(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=000 (EAX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB8(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEAX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordB9(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=001 (ECX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordB9(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regECX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordBA(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=010 (EDX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordBA(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordBB(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=011 (EBX+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordBB(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEBX + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordBC(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=100 (sib+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordBC(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.getSIBAddr(2) + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordBD(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=101 (EBP+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordBD(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordStack(this.regEBP + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordBE(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=110 (ESI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordBE(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regESI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordBF(afnGrp, fnSrc): mod=10 (dst:mem+d16)  reg=111 (afnGrp[7])  r/m=111 (EDI+d32)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordBF(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.modEAWordData(this.regEDI + this.getIPAddr()), fnSrc.call(this));
                    this.setEAWord(w);
                    this.nStepCycles -= this.cycleCounts.nEACyclesBaseDisp;
                },
                /**
                 * opMod32GrpWordC0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC0(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC1(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC2(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC3(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC4(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordC5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC5(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC6(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=000 (afnGrp[0])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC7(afnGrp, fnSrc) {
                    var w = afnGrp[0].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC8(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordC9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordC9(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordCA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordCA(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordCB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordCB(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordCC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordCC(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordCD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordCD(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordCE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordCE(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordCF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=001 (afnGrp[1])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordCF(afnGrp, fnSrc) {
                    var w = afnGrp[1].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD0(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD1(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD2(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD3(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD4(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordD5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD5(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD6(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=010 (afnGrp[2])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD7(afnGrp, fnSrc) {
                    var w = afnGrp[2].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD8(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordD9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordD9(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordDA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordDA(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordDB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordDB(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordDC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordDC(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordDD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordDD(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordDE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordDE(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordDF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=011 (afnGrp[3])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordDF(afnGrp, fnSrc) {
                    var w = afnGrp[3].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE0(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE1(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE2(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE3(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE4(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordE5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE5(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE6(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=100 (afnGrp[4])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE7(afnGrp, fnSrc) {
                    var w = afnGrp[4].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE8(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordE9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordE9(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordEA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordEA(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordEB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordEB(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordEC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordEC(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordED(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordED(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordEE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordEE(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordEF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=101 (afnGrp[5])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordEF(afnGrp, fnSrc) {
                    var w = afnGrp[5].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF0(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF0(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF1(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF1(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF2(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF2(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF3(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF3(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF4(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF4(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordF5(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF5(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF6(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF6(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF7(afnGrp, fnSrc): mod=11 (dst:reg)  reg=110 (afnGrp[6])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF7(afnGrp, fnSrc) {
                    var w = afnGrp[6].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF8(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=000 (EAX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF8(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEAX & this.dataMask, fnSrc.call(this));
                    this.regEAX = (this.regEAX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiEALo; this.backTrack.btiAH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordF9(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=001 (ECX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordF9(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regECX & this.dataMask, fnSrc.call(this));
                    this.regECX = (this.regECX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiCL = this.backTrack.btiEALo; this.backTrack.btiCH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordFA(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=010 (EDX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordFA(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEDX & this.dataMask, fnSrc.call(this));
                    this.regEDX = (this.regEDX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDL = this.backTrack.btiEALo; this.backTrack.btiDH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordFB(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=011 (EBX)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordFB(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEBX & this.dataMask, fnSrc.call(this));
                    this.regEBX = (this.regEBX & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBL = this.backTrack.btiEALo; this.backTrack.btiBH = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordFC(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=100 (ESP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordFC(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.getSP() & this.dataMask, fnSrc.call(this));
                    this.setSP((this.getSP() & ~this.dataMask) | w);
                },
                /**
                 * opMod32GrpWordFD(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=101 (EBP)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordFD(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEBP & this.dataMask, fnSrc.call(this));
                    this.regEBP = (this.regEBP & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiBPLo = this.backTrack.btiEALo; this.backTrack.btiBPHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordFE(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=110 (ESI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordFE(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regESI & this.dataMask, fnSrc.call(this));
                    this.regESI = (this.regESI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiSILo = this.backTrack.btiEALo; this.backTrack.btiSIHi = this.backTrack.btiEAHi;
                    }
                },
                /**
                 * opMod32GrpWordFF(afnGrp, fnSrc): mod=11 (dst:reg)  reg=111 (afnGrp[7])  r/m=111 (EDI)
                 *
                 * @this {X86CPU}
                 * @param {Array.<function(number,number)>} afnGrp
                 * @param {function()} fnSrc
                 */
                function opMod32GrpWordFF(afnGrp, fnSrc) {
                    var w = afnGrp[7].call(this, this.regEDI & this.dataMask, fnSrc.call(this));
                    this.regEDI = (this.regEDI & ~this.dataMask) | w;
                    if (BACKTRACK) {
                        this.backTrack.btiDILo = this.backTrack.btiEALo; this.backTrack.btiDIHi = this.backTrack.btiEAHi;
                    }
                }
            ];
            
            if (typeof module !== 'undefined') module.exports = X86ModW32;
            
          • x86op0f.js
            /**
             * @fileoverview Implements PCjs 0x0F two-byte opcodes
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var X86         = require("./x86");
            }
            
            /**
             * op=0x0F,0x00 (GRP6 mem/reg)
             *
             * @this {X86CPU}
             */
            X86.opGRP6 = function GRP6()
            {
                var bModRM = this.getIPByte();
                if ((bModRM & 0x38) < 0x10) {   // possible reg values: 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
                    this.opFlags |= X86.OPFLAG.NOREAD;
                }
                this.aOpModGrpWord[bModRM].call(this, this.aOpGrp6, X86.fnSrcNone);
            };
            
            /**
             * op=0x0F,0x01 (GRP7 mem/reg)
             *
             * @this {X86CPU}
             */
            X86.opGRP7 = function GRP7()
            {
                var bModRM = this.getIPByte();
                if (!(bModRM & 0x10)) {
                    this.opFlags |= X86.OPFLAG.NOREAD;
                }
                this.aOpModGrpWord[bModRM].call(this, X86.aOpGrp7, X86.fnSrcNone);
            };
            
            /**
             * opLAR()
             *
             * op=0x0F,0x02 (LAR reg,mem/reg)
             *
             * @this {X86CPU}
             */
            X86.opLAR = function LAR()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLAR);
            };
            
            /**
             * opLSL()
             *
             * op=0x0F,0x03 (LSL reg,mem/reg)
             *
             * @this {X86CPU}
             */
            X86.opLSL = function LSL()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSL);
            };
            
            /**
             * opLOADALL()
             *
             * op=0x0F,0x05 (LOADALL)
             *
             * From the "Undocumented iAPX 286 Test Instruction" document at http://www.pcjs.org/pubs/pc/reference/intel/80286/loadall/:
             *
             *  Physical Address (Hex)        Associated CPU Register
             *          800-805                        None
             *          806-807                        MSW
             *          808-815                        None
             *          816-817                        TR
             *          818-819                        Flag word
             *          81A-81B                        IP
             *          81C-81D                        LDT
             *          81E-81F                        DS
             *          820-821                        SS
             *          822-823                        CS
             *          824-825                        ES
             *          826-827                        DI
             *          828-829                        SI
             *          82A-82B                        BP
             *          82C-82D                        SP
             *          82E-82F                        BX
             *          830-831                        DX
             *          832-833                        CX
             *          834-835                        AX
             *          836-83B                        ES descriptor cache
             *          83C-841                        CS descriptor cache
             *          842-847                        SS descriptor cache
             *          848-84D                        DS descriptor cache
             *          84E-853                        GDTR
             *          854-859                        LDT descriptor cache
             *          85A-85F                        IDTR
             *          860-865                        TSS descriptor cache
             *
             * Oddly, the above document gives two contradictory cycle counts for LOADALL: 190 and 195.  I'll go with 195, for
             * no particular reason.
             *
             * @this {X86CPU}
             */
            X86.opLOADALL = function LOADALL()
            {
                if (this.segCS.cpl) {
                    /*
                     * You're not allowed to use LOADALL if the current privilege level is something other than zero.
                     */
                    X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0, true);
                    return;
                }
                this.setMSW(this.getShort(0x806));
                this.regEDI = this.getShort(0x826);
                this.regESI = this.getShort(0x828);
                this.regEBP = this.getShort(0x82A);
                this.regEBX = this.getShort(0x82E);
                this.regEDX = this.getShort(0x830);
                this.regECX = this.getShort(0x832);
                this.regEAX = this.getShort(0x834);
                this.segES.loadDesc6(0x836, this.getShort(0x824));
                this.segCS.loadDesc6(0x83C, this.getShort(0x822));
                this.segSS.loadDesc6(0x842, this.getShort(0x820));
                this.segDS.loadDesc6(0x848, this.getShort(0x81E));
                this.setPS(this.getShort(0x818));
                /*
                 * It's important to call setIP() and setSP() *after* the segCS and segSS loads, so that the CPU's
                 * linear IP and SP registers (regLIP and regLSP) will be updated properly.  Ordinarily that would be
                 * taken care of by simply using the CPU's setCS() and setSS() functions, but those functions call the
                 * default descriptor load() functions, and obviously here we must use loadDesc6() instead.
                 */
                this.setIP(this.getShort(0x81A));
                this.setSP(this.getShort(0x82C));
                /*
                 * The bytes at 0x851 and 0x85D "should be zeroes", as per the "Undocumented iAPX 286 Test Instruction"
                 * document, but the LOADALL issued by RAMDRIVE in PC-DOS 7.0 contains 0xFF in both of those bytes, resulting
                 * in very large addrGDT and addrIDT values.  Obviously, we can't have that, so we load only the low byte
                 * of the second word for both of those registers.
                 */
                this.addrGDT = this.getShort(0x84E) | (this.getByte(0x850) << 16);
                this.addrGDTLimit = this.addrGDT + this.getShort(0x852);
                this.segLDT.loadDesc6(0x854, this.getShort(0x81C));
                this.addrIDT = this.getShort(0x85A) | (this.getByte(0x85C) << 16);
                this.addrIDTLimit = this.addrIDT + this.getShort(0x85E);
                this.segTSS.loadDesc6(0x860, this.getShort(0x816));
                this.nStepCycles -= 195;
                /*
                 * TODO: LOADALL operation still needs to be verified in protected mode....
                 */
                if (DEBUG && DEBUGGER && (this.regCR0 & X86.CR0.MSW.PE)) this.stopCPU();
            };
            
            /**
             * opCLTS()
             *
             * op=0x0F,0x06 (CLTS)
             *
             * @this {X86CPU}
             */
            X86.opCLTS = function CLTS()
            {
                if (this.segCS.cpl) {
                    X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                    return;
                }
                this.regCR0 &= ~X86.CR0.MSW.TS;
                this.nStepCycles -= 2;
            };
            
            /**
             * opMOVrc()
             *
             * op=0x0F,0x20 (MOV reg,creg)
             *
             * NOTE: Since the ModRM decoders deal only with general-purpose registers, we must move
             * the appropriate control register into a special variable (regXX), which our helper function
             * (fnMOVxx) will use to replace the decoder's src operand.
             *
             * From PCMag_Prog_TechRef, p.476: "The 80386 executes the MOV to/from control registers (CRn)
             * regardless of the setting of the MOD field.  The MOD field should be set to 0b11, but an early
             * 80386 documentation error indicated that the MOD field value was a don't care.  Early versions
             * of the 80486 detect a MOD != 0b11 as an illegal opcode.  This was changed in later versions to
             * ignore the value of MOD.  Assemblers that generate MOD != 0b11 for these instructions will fail
             * on some 80486s."
             *
             * @this {X86CPU}
             */
            X86.opMOVrc = function MOVrc()
            {
                /*
                 * We address the MOD field problem (see above) by coercing it to 0b11 (0xc0), regardless.
                 *
                 * TODO: One issue not clearly addressed is if, when an assembler/compiler generated a bogus MOD value,
                 * it also generated the additional displacement bytes, if any, that would typically accompany such a MOD
                 * value.  I assume not.
                 */
                var bModRM = this.getIPByte() | 0xc0;
            
                if (this.segCS.cpl) {
                    /*
                     * You're not allowed to read control registers if the current privilege level is not zero
                     * (TODO: I'm issuing this AFTER fetching the ModRM byte, but I assume it makes no difference).
                     */
                    X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                    return;
                }
            
                var reg = (bModRM & 0x38) >> 3;
                switch(reg) {
                case 0x0:
                    this.regXX = this.regCR0;
                    break;
                case 0x1:
                    this.regXX = this.regCR1;
                    break;
                case 0x2:
                    this.regXX = this.regCR2;
                    break;
                case 0x3:
                    this.regXX = this.regCR3;
                    break;
                default:
                    X86.opUndefined.call(this);
                    return;
                }
                /*
                 * Like other MOV operations, the destination does not need to be read, just written;
                 * however, it's moot, because we've already restricted this opcode to registers only.
                 *
                 *      this.opFlags |= X86.OPFLAG.NOREAD;
                 *
                 * Another issue, however, is that this instruction always assumes a 32-bit OPERAND size,
                 * so we must call setDataSize(4) first.
                 */
                this.setDataSize(4);
                this.aOpModRegWord[bModRM].call(this, X86.fnMOVxx);
            };
            
            /**
             * opMOVcr()
             *
             * op=0x0F,0x22 (MOV creg,reg)
             *
             * NOTE: Since the ModRM decoders deal only with general-purpose registers, we have to make a note
             * of which general-purpose register will be overwritten, so that we can restore it after moving the
             * modified value to the correct control register.
             *
             * From PCMag_Prog_TechRef, p.476: "The 80386 executes the MOV to/from control registers (CRn)
             * regardless of the setting of the MOD field.  The MOD field should be set to 0b11, but an early
             * 80386 documentation error indicated that the MOD field value was a don't care.  Early versions
             * of the 80486 detect a MOD != 0b11 as an illegal opcode.  This was changed in later versions to
             * ignore the value of MOD.  Assemblers that generate MOD != 0b11 for these instructions will fail
             * on some 80486s."
             *
             * @this {X86CPU}
             */
            X86.opMOVcr = function MOVcr()
            {
                var temp;
                /*
                 * We address the MOD field problem (see above) by coercing it to 0b11 (0xc0), regardless.
                 *
                 * TODO: One issue not clearly addressed is if, when an assembler/compiler generated a bogus MOD value,
                 * it also generated the additional displacement bytes, if any, that would typically accompany such a MOD
                 * value.  I assume not.
                 */
                var bModRM = this.getIPByte() | 0xc0;
            
                if (this.segCS.cpl) {
                    /*
                     * You're not allowed to write control registers if the current privilege level is not zero
                     * (TODO: I'm issuing this AFTER fetching the ModRM byte, but I assume it makes no difference).
                     */
                    X86.fnFault.call(this, X86.EXCEPTION.GP_FAULT, 0);
                    return;
                }
            
                var reg = (bModRM & 0x38) >> 3;
                switch(reg) {
                case 0x0:
                    temp = this.regEAX;
                    break;
                case 0x1:
                    temp = this.regECX; // TODO: Is setting CR1 actually allowed on an 80386?
                    break;
                case 0x2:
                    temp = this.regEDX;
                    break;
                case 0x3:
                    temp = this.regEBX;
                    break;
                default:
                    X86.opInvalid.call(this);
                    return;
                }
            
                /*
                 * This instruction always assumes a 32-bit OPERAND size, so we must call setDataSize(4) first.
                 */
                this.setDataSize(4);
                this.aOpModRegWord[bModRM].call(this, X86.fnMOV);
            
                switch(reg) {
                case 0x0:
                    reg = this.regEAX;
                    this.regEAX = temp;
                    X86.fnLCR0.call(this, reg);
                    break;
                case 0x1:
                    this.regCR1 = this.regECX;
                    this.regECX = temp;
                    break;
                case 0x2:
                    this.regCR2 = this.regEDX;
                    this.regEDX = temp;
                    break;
                case 0x3:
                    reg = this.regEBX;
                    this.regEBX = temp;
                    X86.fnLCR3.call(this, reg);
                    break;
                }
            };
            
            /*
             * NOTE: The following 16 new conditional jumps actually rely on the OPERAND override setting
             * for determining whether a signed 16-bit or 32-bit displacement will be fetched, even though
             * the ADDRESS override might seem more intuitive.  Think of them as instructions that are loading
             * a new operand into IP/EIP.
             *
             * Also, in 16-bit code, even though a signed rel16 value would seem to imply a range of -32768
             * to +32767, any location within a 64Kb code segment outside that range can be reached by choosing
             * a displacement in the opposite direction, causing the 16-bit value in EIP to underflow or overflow;
             * any underflow or overflow doesn't matter, because only the low 16 bits of EIP are updated when a
             * 16-bit OPERAND size is in effect.
             *
             * In fact, for 16-bit jumps, it's simpler to always think of rel16 as an UNSIGNED value added to
             * the current EIP, where the result is then truncated to a 16-bit value.  This is why we don't have
             * to sign-extend rel16 before adding it to the current EIP.
             */
            
            /**
             * opJOw()
             *
             * op=0x0F,0x80 (JO rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJOw = function JOw()
            {
                var disp = this.getIPWord();
                if (this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNOw()
             *
             * op=0x0F,0x81 (JNO rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNOw = function JNOw()
            {
                var disp = this.getIPWord();
                if (!this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJCw()
             *
             * op=0x0F,0x82 (JC rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJCw = function JCw()
            {
                var disp = this.getIPWord();
                if (this.getCF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNCw()
             *
             * op=0x0F,0x83 (JNC rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNCw = function JNCw()
            {
                var disp = this.getIPWord();
                if (!this.getCF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJZw()
             *
             * op=0x0F,0x84 (JZ rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJZw = function JZw()
            {
                var disp = this.getIPWord();
                if (this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNZw()
             *
             * op=0x0F,0x85 (JNZ rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNZw = function JNZw()
            {
                var disp = this.getIPWord();
                if (!this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJBEw()
             *
             * op=0x0F,0x86 (JBE rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJBEw = function JBEw()
            {
                var disp = this.getIPWord();
                if (this.getCF() || this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNBEw()
             *
             * op=0x0F,0x87 (JNBE rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNBEw = function JNBEw()
            {
                var disp = this.getIPWord();
                if (!this.getCF() && !this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJSw()
             *
             * op=0x0F,0x88 (JS rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJSw = function JSw()
            {
                var disp = this.getIPWord();
                if (this.getSF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNSw()
             *
             * op=0x0F,0x89 (JNS rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNSw = function JNSw()
            {
                var disp = this.getIPWord();
                if (!this.getSF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJPw()
             *
             * op=0x0F,0x8A (JP rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJPw = function JPw()
            {
                var disp = this.getIPWord();
                if (this.getPF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNPw()
             *
             * op=0x0F,0x8B (JNP rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNPw = function JNPw()
            {
                var disp = this.getIPWord();
                if (!this.getPF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJLw()
             *
             * op=0x0F,0x8C (JL rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJLw = function JLw()
            {
                var disp = this.getIPWord();
                if (!this.getSF() != !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNLw()
             *
             * op=0x0F,0x8D (JNL rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNLw = function JNLw()
            {
                var disp = this.getIPWord();
                if (!this.getSF() == !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJLEw()
             *
             * op=0x0F,0x8E (JLE rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJLEw = function JLEw()
            {
                var disp = this.getIPWord();
                if (this.getZF() || !this.getSF() != !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opJNLEw()
             *
             * op=0x0F,0x8F (JNLE rel16/rel32)
             *
             * @this {X86CPU}
             */
            X86.opJNLEw = function JNLEw()
            {
                var disp = this.getIPWord();
                if (!this.getZF() && !this.getSF() == !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * opSETO()
             *
             * op=0x0F,0x90 (SETO b)
             *
             * @this {X86CPU}
             */
            X86.opSETO = function SETO()
            {
                X86.fnSETcc.call(this, X86.fnSETO);
            };
            
            /**
             * opSETNO()
             *
             * op=0x0F,0x91 (SETNO b)
             *
             * @this {X86CPU}
             */
            X86.opSETNO = function SETNO()
            {
                X86.fnSETcc.call(this, X86.fnSETO);
            };
            
            /**
             * opSETC()
             *
             * op=0x0F,0x92 (SETC b)
             *
             * @this {X86CPU}
             */
            X86.opSETC = function SETC()
            {
                X86.fnSETcc.call(this, X86.fnSETC);
            };
            
            /**
             * opSETNC()
             *
             * op=0x0F,0x93 (SETNC b)
             *
             * @this {X86CPU}
             */
            X86.opSETNC = function SETNC()
            {
                X86.fnSETcc.call(this, X86.fnSETNC);
            };
            
            /**
             * opSETZ()
             *
             * op=0x0F,0x94 (SETZ b)
             *
             * @this {X86CPU}
             */
            X86.opSETZ = function SETZ()
            {
                X86.fnSETcc.call(this, X86.fnSETZ);
            };
            
            /**
             * opSETNZ()
             *
             * op=0x0F,0x95 (SETNZ b)
             *
             * @this {X86CPU}
             */
            X86.opSETNZ = function SETNZ()
            {
                X86.fnSETcc.call(this, X86.fnSETNZ);
            };
            
            /**
             * opSETBE()
             *
             * op=0x0F,0x96 (SETBE b)
             *
             * @this {X86CPU}
             */
            X86.opSETBE = function SETBE()
            {
                X86.fnSETcc.call(this, X86.fnSETBE);
            };
            
            /**
             * opSETNBE()
             *
             * op=0x0F,0x97 (SETNBE b)
             *
             * @this {X86CPU}
             */
            X86.opSETNBE = function SETNBE()
            {
                X86.fnSETcc.call(this, X86.fnSETNBE);
            };
            
            /**
             * opSETS()
             *
             * op=0x0F,0x98 (SETS b)
             *
             * @this {X86CPU}
             */
            X86.opSETS = function SETS()
            {
                X86.fnSETcc.call(this, X86.fnSETS);
            };
            
            /**
             * opSETNS()
             *
             * op=0x0F,0x99 (SETNS b)
             *
             * @this {X86CPU}
             */
            X86.opSETNS = function SETNS()
            {
                X86.fnSETcc.call(this, X86.fnSETNS);
            };
            
            /**
             * opSETP()
             *
             * op=0x0F,0x9A (SETP b)
             *
             * @this {X86CPU}
             */
            X86.opSETP = function SETP()
            {
                X86.fnSETcc.call(this, X86.fnSETP);
            };
            
            /**
             * opSETNP()
             *
             * op=0x0F,0x9B (SETNP b)
             *
             * @this {X86CPU}
             */
            X86.opSETNP = function SETNP()
            {
                X86.fnSETcc.call(this, X86.fnSETNP);
            };
            
            /**
             * opSETL()
             *
             * op=0x0F,0x9C (SETL b)
             *
             * @this {X86CPU}
             */
            X86.opSETL = function SETL()
            {
                X86.fnSETcc.call(this, X86.fnSETL);
            };
            
            /**
             * opSETNL()
             *
             * op=0x0F,0x9D (SETNL b)
             *
             * @this {X86CPU}
             */
            X86.opSETNL = function SETNL()
            {
                X86.fnSETcc.call(this, X86.fnSETNL);
            };
            
            /**
             * opSETLE()
             *
             * op=0x0F,0x9E (SETLE b)
             *
             * @this {X86CPU}
             */
            X86.opSETLE = function SETLE()
            {
                X86.fnSETcc.call(this, X86.fnSETLE);
            };
            
            /**
             * opSETNLE()
             *
             * op=0x0F,0x9F (SETNLE b)
             *
             * @this {X86CPU}
             */
            X86.opSETNLE = function SETNLE()
            {
                X86.fnSETcc.call(this, X86.fnSETNLE);
            };
            
            /**
             * opPUSHFS()
             *
             * op=0x0F,0xA0 (PUSH FS)
             *
             * @this {X86CPU}
             */
            X86.opPUSHFS = function PUSHFS()
            {
                this.pushWord(this.segFS.sel);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
            };
            
            /**
             * opPOPFS()
             *
             * op=0x0F,0xA1 (POP FS)
             *
             * @this {X86CPU}
             */
            X86.opPOPFS = function POPFS()
            {
                this.setFS(this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * opBT()
             *
             * op=0x0F,0xA3 (BT mem/reg,reg)
             *
             * @this {X86CPU}
             */
            X86.opBT = function BT()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBT);
                if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitTestMExtra;
            };
            
            /**
             * opSHLDn()
             *
             * op=0x0F,0xA4 (SHLD mem/reg,reg,imm8)
             *
             * @this {X86CPU}
             */
            X86.opSHLDn = function SHLDn()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHLDwi : X86.fnSHLDdi);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
            };
            
            /**
             * opSHLDcl()
             *
             * op=0x0F,0xA5 (SHLD mem/reg,reg,CL)
             *
             * @this {X86CPU}
             */
            X86.opSHLDcl = function SHLDcl()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHLDwCL : X86.fnSHLDdCL);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
            };
            
            /**
             * opPUSHGS()
             *
             * op=0x0F,0xA8 (PUSH GS)
             *
             * @this {X86CPU}
             */
            X86.opPUSHGS = function PUSHGS()
            {
                this.pushWord(this.segGS.sel);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
            };
            
            /**
             * opPOPGS()
             *
             * op=0x0F,0xA9 (POP GS)
             *
             * @this {X86CPU}
             */
            X86.opPOPGS = function POPGS()
            {
                this.setGS(this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * opBTS()
             *
             * op=0x0F,0xAB (BTC mem/reg,reg)
             *
             * @this {X86CPU}
             */
            X86.opBTS = function BTS()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTS);
                if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
            };
            
            /**
             * opSHRDn()
             *
             * op=0x0F,0xAC (SHRD mem/reg,reg,imm8)
             *
             * @this {X86CPU}
             */
            X86.opSHRDn = function SHRDn()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHRDwi : X86.fnSHRDdi);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
            };
            
            /**
             * opSHRDcl()
             *
             * op=0x0F,0xAD (SHRD mem/reg,reg,CL)
             *
             * @this {X86CPU}
             */
            X86.opSHRDcl = function SHRDcl()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnSHRDwCL : X86.fnSHRDdCL);
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesShiftDR : this.cycleCounts.nOpCyclesShiftDM);
            };
            
            /**
             * opIMUL()
             *
             * op=0x0F,0xAF (IMUL reg,mem/reg) (80386 and up)
             *
             * @this {X86CPU}
             */
            X86.opIMUL = function IMUL()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, this.dataSize == 2? X86.fnIMULrw : X86.fnIMULrd);
            };
            
            /**
             * opLSS()
             *
             * op=0x0F,0xB2 (LSS reg,word)
             *
             * This is like a "MOV reg,rm" operation, but it also loads SS from the next word.
             *
             * @this {X86CPU}
             */
            X86.opLSS = function LSS()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSS);
            };
            
            /**
             * opBTR()
             *
             * op=0x0F,0xB3 (BTC mem/reg,reg) (80386 and up)
             *
             * @this {X86CPU}
             */
            X86.opBTR = function BTR()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTR);
                if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
            };
            
            /**
             * opLFS()
             *
             * op=0x0F,0xB4 (LFS reg,word)
             *
             * This is like a "MOV reg,rm" operation, but it also loads FS from the next word.
             *
             * @this {X86CPU}
             */
            X86.opLFS = function LFS()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLFS);
            };
            
            /**
             * opLGS()
             *
             * op=0x0F,0xB5 (LGS reg,word)
             *
             * This is like a "MOV reg,rm" operation, but it also loads GS from the next word.
             *
             * @this {X86CPU}
             */
            X86.opLGS = function LGS()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLGS);
            };
            
            /**
             * opMOVZXb()
             *
             * op=0x0F,0xB6 (MOVZX reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opMOVZXb = function MOVZXb()
            {
                /*
                 * The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
                 *
                 *      000:    AL      ->      000:    AX
                 *      001:    CL      ->      001:    CX
                 *      010:    DL      ->      010:    DX
                 *      011:    BL      ->      011:    BX
                 *      100:    AH      ->      100:    SP
                 *      101:    CH      ->      101:    BP
                 *      110:    DH      ->      110:    SI
                 *      111:    BH      ->      111:    DI
                 */
                var temp;
                var bModRM = this.getIPByte();
                var reg = (bModRM & 0x38) >> 3;
                switch(reg) {
                case 0x4:
                    temp = this.regEAX;
                    break;
                case 0x5:
                    temp = this.regECX;
                    break;
                case 0x6:
                    temp = this.regEDX;
                    break;
                case 0x7:
                    temp = this.regEBX;
                    break;
                }
                this.aOpModRegByte[bModRM].call(this, X86.fnMOVX);
                switch(reg) {
                case 0x0:
                    this.regEAX = (this.regEAX & ~this.dataMask) | (this.regEAX & 0xff);
                    break;
                case 0x1:
                    this.regECX = (this.regECX & ~this.dataMask) | (this.regECX & 0xff);
                    break;
                case 0x2:
                    this.regEDX = (this.regEDX & ~this.dataMask) | (this.regEDX & 0xff);
                    break;
                case 0x3:
                    this.regEBX = (this.regEBX & ~this.dataMask) | (this.regEBX & 0xff);
                    break;
                case 0x4:
                    this.regESP = (this.regESP & ~this.dataMask) | ((this.regEAX >> 8) & 0xff);
                    this.regEAX = temp;
                    break;
                case 0x5:
                    this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regECX >> 8) & 0xff);
                    this.regECX = temp;
                    break;
                case 0x6:
                    this.regESI = (this.regESI & ~this.dataMask) | ((this.regEDX >> 8) & 0xff);
                    this.regEDX = temp;
                    break;
                case 0x7:
                    this.regEDI = (this.regEDI & ~this.dataMask) | ((this.regEBX >> 8) & 0xff);
                    this.regEBX = temp;
                    break;
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
            };
            
            /**
             * opMOVZXw()
             *
             * op=0x0F,0xB7 (MOVZX reg,word)
             *
             * @this {X86CPU}
             */
            X86.opMOVZXw = function MOVZXw()
            {
                var bModRM = this.getIPByte();
                this.setDataSize(2);
                this.aOpModRegWord[bModRM].call(this, X86.fnMOVX);
                switch((bModRM & 0x38) >> 3) {
                case 0x0:
                    this.regEAX = (this.regEAX & 0xffff);
                    break;
                case 0x1:
                    this.regECX = (this.regECX & 0xffff);
                    break;
                case 0x2:
                    this.regEDX = (this.regEDX & 0xffff);
                    break;
                case 0x3:
                    this.regEBX = (this.regEBX & 0xffff);
                    break;
                case 0x4:
                    this.regESP = (this.regESP & 0xffff);
                    break;
                case 0x5:
                    this.regEBP = (this.regEBP & 0xffff);
                    break;
                case 0x6:
                    this.regESI = (this.regESI & 0xffff);
                    break;
                case 0x7:
                    this.regEDI = (this.regEDI & 0xffff);
                    break;
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
            };
            
            /**
             * op=0x0F,0xBA (GRP8 mem/reg) (80386 and up)
             *
             * @this {X86CPU}
             */
            X86.opGRP8 = function GRP8()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp8, this.getIPByte);
            };
            
            /**
             * opBTC()
             *
             * op=0x0F,0xBB (BTC mem/reg,reg)
             *
             * @this {X86CPU}
             */
            X86.opBTC = function BTC()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTC);
                if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= this.cycleCounts.nOpCyclesBitSetMExtra;
            };
            
            /**
             * opBSF()
             *
             * op=0x0F,0xBC (BSF reg,mem/reg)
             *
             * @this {X86CPU}
             */
            X86.opBSF = function BSF()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSF);
            };
            
            /**
             * opBSR()
             *
             * op=0x0F,0xBD (BSR reg,mem/reg)
             *
             * @this {X86CPU}
             */
            X86.opBSR = function BSR()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSR);
            };
            
            /**
             * opMOVSXb()
             *
             * op=0x0F,0xBE (MOVSX reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opMOVSXb = function MOVSXb()
            {
                /*
                 * The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
                 *
                 *      000:    AL      ->      000:    AX
                 *      001:    CL      ->      001:    CX
                 *      010:    DL      ->      010:    DX
                 *      011:    BL      ->      011:    BX
                 *      100:    AH      ->      100:    SP
                 *      101:    CH      ->      101:    BP
                 *      110:    DH      ->      110:    SI
                 *      111:    BH      ->      111:    DI
                 */
                var temp;
                var bModRM = this.getIPByte();
                var reg = (bModRM & 0x38) >> 3;
                switch(reg) {
                case 0x4:
                    temp = this.regEAX;
                    break;
                case 0x5:
                    temp = this.regECX;
                    break;
                case 0x6:
                    temp = this.regEDX;
                    break;
                case 0x7:
                    temp = this.regEBX;
                    break;
                }
                this.aOpModRegByte[bModRM].call(this, X86.fnMOVX);
                switch(reg) {
                case 0x0:
                    this.regEAX = (this.regEAX & ~this.dataMask) | ((((this.regEAX & 0xff) << 24) >> 24) & this.dataMask);
                    break;
                case 0x1:
                    this.regECX = (this.regECX & ~this.dataMask) | ((((this.regECX & 0xff) << 24) >> 24) & this.dataMask);
                    break;
                case 0x2:
                    this.regEDX = (this.regEDX & ~this.dataMask) | ((((this.regEDX & 0xff) << 24) >> 24) & this.dataMask);
                    break;
                case 0x3:
                    this.regEBX = (this.regEBX & ~this.dataMask) | ((((this.regEBX & 0xff) << 24) >> 24) & this.dataMask);
                    break;
                case 0x4:
                    this.regESP = (this.regESP & ~this.dataMask) | (((this.regEAX << 16) >> 24) & this.dataMask);
                    this.regEAX = temp;
                    break;
                case 0x5:
                    this.regEBP = (this.regEBP & ~this.dataMask) | (((this.regECX << 16) >> 24) & this.dataMask);
                    this.regECX = temp;
                    break;
                case 0x6:
                    this.regESI = (this.regESI & ~this.dataMask) | (((this.regEDX << 16) >> 24) & this.dataMask);
                    this.regEDX = temp;
                    break;
                case 0x7:
                    this.regEDI = (this.regEDI & ~this.dataMask) | (((this.regEBX << 16) >> 24) & this.dataMask);
                    this.regEBX = temp;
                    break;
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
            };
            
            /**
             * opMOVSXw()
             *
             * op=0x0F,0xBF (MOVSX reg,word)
             *
             * @this {X86CPU}
             */
            X86.opMOVSXw = function MOVSXw()
            {
                var bModRM = this.getIPByte();
                this.setDataSize(2);
                this.aOpModRegWord[bModRM].call(this, X86.fnMOVX);
                switch((bModRM & 0x38) >> 3) {
                case 0x0:
                    this.regEAX = ((this.regEAX << 16) >> 16);
                    break;
                case 0x1:
                    this.regECX = ((this.regECX << 16) >> 16);
                    break;
                case 0x2:
                    this.regEDX = ((this.regEDX << 16) >> 16);
                    break;
                case 0x3:
                    this.regEBX = ((this.regEBX << 16) >> 16);
                    break;
                case 0x4:
                    this.regESP = ((this.regESP << 16) >> 16);
                    break;
                case 0x5:
                    this.regEBP = ((this.regEBP << 16) >> 16);
                    break;
                case 0x6:
                    this.regESI = ((this.regESI << 16) >> 16);
                    break;
                case 0x7:
                    this.regEDI = ((this.regEDI << 16) >> 16);
                    break;
                }
                this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? this.cycleCounts.nOpCyclesMovXR : this.cycleCounts.nOpCyclesMovXM);
            };
            
            X86.aOps0F = new Array(256);
            
            X86.aOps0F[0x00] = X86.opGRP6;
            X86.aOps0F[0x01] = X86.opGRP7;
            X86.aOps0F[0x02] = X86.opLAR;
            X86.aOps0F[0x03] = X86.opLSL;
            X86.aOps0F[0x05] = X86.opLOADALL;
            X86.aOps0F[0x06] = X86.opCLTS;
            
            /*
             * On all processors (except the 8086/8088, of course), X86.OPCODE.UD2 (0x0F,0x0B), aka "UD2", is an
             * instruction guaranteed to raise a #UD (Invalid Opcode) exception (INT 0x06) on all post-8086 processors.
             */
            X86.aOps0F[0x0B] = X86.opInvalid;
            
            if (I386) {
                X86.aOps0F386 = [];
                X86.aOps0F386[0x20] = X86.opMOVrc;
                X86.aOps0F386[0x22] = X86.opMOVcr;
                X86.aOps0F386[0x80] = X86.opJOw;
                X86.aOps0F386[0x81] = X86.opJNOw;
                X86.aOps0F386[0x82] = X86.opJCw;
                X86.aOps0F386[0x83] = X86.opJNCw;
                X86.aOps0F386[0x84] = X86.opJZw;
                X86.aOps0F386[0x85] = X86.opJNZw;
                X86.aOps0F386[0x86] = X86.opJBEw;
                X86.aOps0F386[0x87] = X86.opJNBEw;
                X86.aOps0F386[0x88] = X86.opJSw;
                X86.aOps0F386[0x89] = X86.opJNSw;
                X86.aOps0F386[0x8A] = X86.opJPw;
                X86.aOps0F386[0x8B] = X86.opJNPw;
                X86.aOps0F386[0x8C] = X86.opJLw;
                X86.aOps0F386[0x8D] = X86.opJNLw;
                X86.aOps0F386[0x8E] = X86.opJLEw;
                X86.aOps0F386[0x8F] = X86.opJNLEw;
                X86.aOps0F386[0x90] = X86.opSETO;
                X86.aOps0F386[0x91] = X86.opSETNO;
                X86.aOps0F386[0x92] = X86.opSETC;
                X86.aOps0F386[0x93] = X86.opSETNC;
                X86.aOps0F386[0x94] = X86.opSETZ;
                X86.aOps0F386[0x95] = X86.opSETNZ;
                X86.aOps0F386[0x96] = X86.opSETBE;
                X86.aOps0F386[0x97] = X86.opSETNBE;
                X86.aOps0F386[0x98] = X86.opSETS;
                X86.aOps0F386[0x99] = X86.opSETNS;
                X86.aOps0F386[0x9A] = X86.opSETP;
                X86.aOps0F386[0x9B] = X86.opSETNP;
                X86.aOps0F386[0x9C] = X86.opSETL;
                X86.aOps0F386[0x9D] = X86.opSETNL;
                X86.aOps0F386[0x9E] = X86.opSETLE;
                X86.aOps0F386[0x9F] = X86.opSETNLE;
                X86.aOps0F386[0xA0] = X86.opPUSHFS;
                X86.aOps0F386[0xA1] = X86.opPOPFS;
                X86.aOps0F386[0xA3] = X86.opBT;
                X86.aOps0F386[0xA4] = X86.opSHLDn;
                X86.aOps0F386[0xA5] = X86.opSHLDcl;
                X86.aOps0F386[0xA8] = X86.opPUSHGS;
                X86.aOps0F386[0xA9] = X86.opPOPGS;
                X86.aOps0F386[0xAB] = X86.opBTS;
                X86.aOps0F386[0xAC] = X86.opSHRDn;
                X86.aOps0F386[0xAD] = X86.opSHRDcl;
                X86.aOps0F386[0xAF] = X86.opIMUL;
                X86.aOps0F386[0xB2] = X86.opLSS;
                X86.aOps0F386[0xB3] = X86.opBTR;
                X86.aOps0F386[0xB4] = X86.opLFS;
                X86.aOps0F386[0xB5] = X86.opLGS;
                X86.aOps0F386[0xB6] = X86.opMOVZXb;
                X86.aOps0F386[0xB7] = X86.opMOVZXw;
                X86.aOps0F386[0xBA] = X86.opGRP8;
                X86.aOps0F386[0xBB] = X86.opBTC;
                X86.aOps0F386[0xBC] = X86.opBSF;
                X86.aOps0F386[0xBD] = X86.opBSR;
                X86.aOps0F386[0xBE] = X86.opMOVSXb;
                X86.aOps0F386[0xBF] = X86.opMOVSXw;
            }
            
            /*
             * These instruction groups are not as orthogonal as the original 8086/8088 groups (Grp1 through Grp4); some of
             * the instructions in Grp6 and Grp7 only read their dst operand (eg, LLDT), which means the ModRM helper function
             * must insure that setEAWord() is disabled, while others only write their dst operand (eg, SLDT), which means that
             * getEAWord() should be disabled *prior* to calling the ModRM helper function.  This latter case requires that
             * we decode the reg field of the ModRM byte before dispatching.
             */
            X86.aOpGrp6Prot = [
                X86.fnSLDT,             X86.fnSTR,              X86.fnLLDT,             X86.fnLTR,              // 0x0F,0x00(reg=0x0-0x3)
                X86.fnVERR,             X86.fnVERW,             X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0x0F,0x00(reg=0x4-0x7)
            ];
            
            X86.aOpGrp6Real = [
                X86.fnGRPInvalid,       X86.fnGRPInvalid,       X86.fnGRPInvalid,       X86.fnGRPInvalid,       // 0x0F,0x00(reg=0x0-0x3)
                X86.fnGRPInvalid,       X86.fnGRPInvalid,       X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0x0F,0x00(reg=0x4-0x7)
            ];
            
            /*
             * Unlike Grp6, Grp7 and Grp8 do not require separate real-mode and protected-mode dispatch tables, because
             * all Grp7 and Grp8 instructions are valid in both modes.
             */
            X86.aOpGrp7 = [
                X86.fnSGDT,             X86.fnSIDT,             X86.fnLGDT,             X86.fnLIDT,             // 0x0F,0x01(reg=0x0-0x3)
                X86.fnSMSW,             X86.fnGRPUndefined,     X86.fnLMSW,             X86.fnGRPUndefined      // 0x0F,0x01(reg=0x4-0x7)
            ];
            
            X86.aOpGrp8 = [
                X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     // 0x0F,0xBA(reg=0x0-0x3)
                X86.fnBT,               X86.fnBTS,              X86.fnBTR,              X86.fnBTC               // 0x0F,0xBA(reg=0x4-0x7)
            ];
            
          • x86ops.js
            /**
             * @fileoverview Implements PCjs 8086 opcode decoding.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Sep-05
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var Component   = require("../../shared/lib/component");
                var Messages    = require("./messages");
                var X86         = require("./x86");
            }
            
            /**
             * op=0x00 (ADD byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opADDmb = function ADDmb()
            {
                var b = this.getIPByte();
                /*
                 * Opcode bytes 0x00 0x00 are sufficiently uncommon that it's more likely we've started
                 * executing in the weeds, so we'll print a warning if you're in DEBUG mode, and optionally
                 * stop the CPU if a Debugger is available.
                 */
                if (DEBUG && !b) {
                    this.printMessage("suspicious opcode: 0x00 0x00", DEBUGGER || this.bitsMessage);
                    if (DEBUGGER && this.dbg) this.stopCPU();
                }
                this.aOpModMemByte[b].call(this, X86.fnADDb);
            };
            
            /**
             * op=0x01 (ADD word,reg)
             *
             * @this {X86CPU}
             */
            X86.opADDmw = function ADDmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnADDw);
            };
            
            /**
             * op=0x02 (ADD reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opADDrb = function ADDrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnADDb);
            };
            
            /**
             * op=0x03 (ADD reg,word)
             *
             * @this {X86CPU}
             */
            X86.opADDrw = function ADDrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnADDw);
            };
            
            /**
             * op=0x04 (ADD AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opADDALb = function ADDALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnADDb.call(this, this.regEAX & 0xff, this.getIPByte());
                /*
                 * NOTE: Whenever the result is "blended" value (eg, of btiAL and btiMemLo), a new bti should be
                 * allocated to reflect that fact; however, I'm leaving "perfect" BACKTRACK support for another day.
                 */
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x05 (ADD AX,imm16 or ADD EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opADDAX = function ADDAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnADDw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x06 (PUSH ES)
             *
             * @this {X86CPU}
             */
            X86.opPUSHES = function PUSHES()
            {
                this.pushWord(this.segES.sel);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
            };
            
            /**
             * op=0x07 (POP ES)
             *
             * @this {X86CPU}
             */
            X86.opPOPES = function POPES()
            {
                this.setES(this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x08 (OR byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opORmb = function ORmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnORb);
            };
            
            /**
             * op=0x09 (OR word,reg)
             *
             * @this {X86CPU}
             */
            X86.opORmw = function ORmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnORw);
            };
            
            /**
             * op=0x0A (OR reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opORrb = function ORrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnORb);
            };
            
            /**
             * op=0x0B (OR reg,word)
             *
             * @this {X86CPU}
             */
            X86.opORrw = function ORrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnORw);
            };
            
            /**
             * op=0x0C (OR AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opORALb = function ORALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnORb.call(this, this.regEAX & 0xff, this.getIPByte());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x0D (OR AX,imm16 or OR EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opORAX = function ORAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnORw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x0E (PUSH CS)
             *
             * @this {X86CPU}
             */
            X86.opPUSHCS = function PUSHCS()
            {
                this.pushWord(this.segCS.sel);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
            };
            
            /**
             * op=0x0F (POP CS) (undocumented on 8086/8088; replaced with opInvalid on 80186/80188, and op0F on 80286 and up)
             *
             * @this {X86CPU}
             */
            X86.opPOPCS = function POPCS()
            {
                this.setCS(this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x0F (handler for two-byte opcodes; 80286 and up)
             *
             * @this {X86CPU}
             */
            X86.op0F = function OP0F()
            {
                this.aOps0F[this.getIPByte()].call(this);
            };
            
            /**
             * op=0x10 (ADC byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opADCmb = function ADCmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnADCb);
            };
            
            /**
             * op=0x11 (ADC word,reg)
             *
             * @this {X86CPU}
             */
            X86.opADCmw = function ADCmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnADCw);
            };
            
            /**
             * op=0x12 (ADC reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opADCrb = function ADCrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnADCb);
            };
            
            /**
             * op=0x13 (ADC reg,word)
             *
             * @this {X86CPU}
             */
            X86.opADCrw = function ADCrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnADCw);
            };
            
            /**
             * op=0x14 (ADC AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opADCALb = function ADCALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnADCb.call(this, this.regEAX & 0xff, this.getIPByte());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x15 (ADC AX,imm16 or ADC EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opADCAX = function ADCAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnADCw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x16 (PUSH SS)
             *
             * @this {X86CPU}
             */
            X86.opPUSHSS = function PUSHSS()
            {
                this.pushWord(this.segSS.sel);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
            };
            
            /**
             * op=0x17 (POP SS)
             *
             * @this {X86CPU}
             */
            X86.opPOPSS = function POPSS()
            {
                this.setSS(this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x18 (SBB byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opSBBmb = function SBBmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnSBBb);
            };
            
            /**
             * op=0x19 (SBB word,reg)
             *
             * @this {X86CPU}
             */
            X86.opSBBmw = function SBBmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnSBBw);
            };
            
            /**
             * op=0x1A (SBB reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opSBBrb = function SBBrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnSBBb);
            };
            
            /**
             * op=0x1B (SBB reg,word)
             *
             * @this {X86CPU}
             */
            X86.opSBBrw = function SBBrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnSBBw);
            };
            
            /**
             * op=0x1C (SBB AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opSBBALb = function SBBALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnSBBb.call(this, this.regEAX & 0xff, this.getIPByte());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x1D (SBB AX,imm16 or SBB EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opSBBAX = function SBBAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnSBBw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x1E (PUSH DS)
             *
             * @this {X86CPU}
             */
            X86.opPUSHDS = function PUSHDS()
            {
                this.pushWord(this.segDS.sel);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushSeg;
            };
            
            /**
             * op=0x1F (POP DS)
             *
             * @this {X86CPU}
             */
            X86.opPOPDS = function POPDS()
            {
                this.setDS(this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x20 (AND byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opANDmb = function ANDmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnANDb);
            };
            
            /**
             * op=0x21 (AND word,reg)
             *
             * @this {X86CPU}
             */
            X86.opANDmw = function ANDmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnANDw);
            };
            
            /**
             * op=0x22 (AND reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opANDrb = function ANDrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnANDb);
            };
            
            /**
             * op=0x23 (AND reg,word)
             *
             * @this {X86CPU}
             */
            X86.opANDrw = function ANDrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnANDw);
            };
            
            /**
             * op=0x24 (AND AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opANDAL = function ANDAL()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnANDb.call(this, this.regEAX & 0xff, this.getIPByte());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x25 (AND AX,imm16 or AND EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opANDAX = function ANDAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnANDw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x26 (ES:)
             *
             * @this {X86CPU}
             */
            X86.opES = function ES()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                this.segData = this.segStack = this.segES;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0x27 (DAA)
             *
             * @this {X86CPU}
             */
            X86.opDAA = function DAA()
            {
                var AL = this.regEAX & 0xff;
                var AF = this.getAF();
                var CF = this.getCF();
                if ((AL & 0xf) > 9 || AF) {
                    AL += 0x6;
                    AF = X86.PS.AF;
                }
                if (AL > 0x9f || CF) {
                    AL += 0x60;
                    CF = X86.PS.CF;
                }
                var b = (AL & 0xff);
                this.regEAX = (this.regEAX & ~0xff) | b;
                this.setLogicResult(b, X86.RESULT.BYTE);
                if (CF) this.setCF(); else this.clearCF();
                if (AF) this.setAF(); else this.clearAF();
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;          // AAA and DAA have the same cycle times
            };
            
            /**
             * op=0x28 (SUB byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opSUBmb = function SUBmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnSUBb);
            };
            
            /**
             * op=0x29 (SUB word,reg)
             *
             * @this {X86CPU}
             */
            X86.opSUBmw = function SUBmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnSUBw);
            };
            
            /**
             * op=0x2A (SUB reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opSUBrb = function SUBrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnSUBb);
            };
            
            /**
             * op=0x2B (SUB reg,word)
             *
             * @this {X86CPU}
             */
            X86.opSUBrw = function SUBrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnSUBw);
            };
            
            /**
             * op=0x2C (SUB AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opSUBALb = function SUBALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnSUBb.call(this, this.regEAX & 0xff, this.getIPByte());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x2D (SUB AX,imm16 or SUB EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opSUBAX = function SUBAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnSUBw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x2E (CS:)
             *
             * @this {X86CPU}
             */
            X86.opCS = function CS()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                this.segData = this.segStack = this.segCS;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0x2F (DAS)
             *
             * @this {X86CPU}
             */
            X86.opDAS = function DAS()
            {
                var AL = this.regEAX & 0xff;
                var AF = this.getAF();
                var CF = this.getCF();
                if ((AL & 0xf) > 9 || AF) {
                    AL -= 0x6;
                    AF = X86.PS.AF;
                }
                if (AL > 0x9f || CF) {
                    AL -= 0x60;
                    CF = X86.PS.CF;
                }
                var b = (AL & 0xff);
                this.regEAX = (this.regEAX & ~0xff) | b;
                this.setLogicResult(b, X86.RESULT.BYTE);
                if (CF) this.setCF(); else this.clearCF();
                if (AF) this.setAF(); else this.clearAF();
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;          // AAA and DAS have the same cycle times
            };
            
            /**
             * op=0x30 (XOR byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opXORmb = function XORmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnXORb);
            };
            
            /**
             * op=0x31 (XOR word,reg)
             *
             * @this {X86CPU}
             */
            X86.opXORmw = function XORmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnXORw);
            };
            
            /**
             * op=0x32 (XOR reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opXORrb = function XORrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnXORb);
            };
            
            /**
             * op=0x33 (XOR reg,word)
             *
             * @this {X86CPU}
             */
            X86.opXORrw = function XORrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnXORw);
            };
            
            /**
             * op=0x34 (XOR AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opXORALb = function XORALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | X86.fnXORb.call(this, this.regEAX & 0xff, this.getIPByte());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x35 (XOR AX,imm16 or XOR EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opXORAX = function XORAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | X86.fnXORw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x36 (SS:)
             *
             * @this {X86CPU}
             */
            X86.opSS = function SS()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                this.segData = this.segStack = this.segSS;      // QUESTION: Is there a case where segStack would not already be segSS? (eg, multiple segment overrides?)
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0x37 (AAA)
             *
             * @this {X86CPU}
             */
            X86.opAAA = function AAA()
            {
                var CF, AF;
                var AL = this.regEAX & 0xff;
                var AH = (this.regEAX >> 8) & 0xff;
                if ((AL & 0xf) > 9 || this.getAF()) {
                    AL = (AL + 0x6) & 0xf;
                    AH = (AH + 1) & 0xff;
                    CF = AF = 1;
                } else {
                    CF = AF = 0;
                }
                this.regEAX = (this.regEAX & ~0xffff) | ((AH << 8) | AL);
                if (CF) this.setCF(); else this.clearCF();
                if (AF) this.setAF(); else this.clearAF();
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
            };
            
            /**
             * op=0x38 (CMP byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opCMPmb = function CMPmb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnCMPb);
            };
            
            /**
             * op=0x39 (CMP word,reg)
             *
             * @this {X86CPU}
             */
            X86.opCMPmw = function CMPmw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnCMPw);
            };
            
            /**
             * op=0x3A (CMP reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opCMPrb = function CMPrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnCMPb);
            };
            
            /**
             * op=0x3B (CMP reg,word)
             *
             * @this {X86CPU}
             */
            X86.opCMPrw = function CMPrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnCMPw);
            };
            
            /**
             * op=0x3C (CMP AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opCMPALb = function CMPALb()
            {
                X86.fnCMPb.call(this, this.regEAX & 0xff, this.getIPByte());
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x3D (CMP AX,imm16 or CMP EAX,imm32)
             *
             * @this {X86CPU}
             */
            X86.opCMPAX = function CMPAX()
            {
                X86.fnCMPw.call(this, this.regEAX & this.dataMask, this.getIPWord());
                this.nStepCycles--;         // in the absence of any EA calculations, we need deduct only one more cycle
            };
            
            /**
             * op=0x3E (DS:)
             *
             * @this {X86CPU}
             */
            X86.opDS = function DS()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                this.segData = this.segStack = this.segDS;      // QUESTION: Is there a case where segData would not already be segDS? (eg, multiple segment overrides?)
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0x3D (AAS)
             *
             * @this {X86CPU}
             */
            X86.opAAS = function AAS()
            {
                var CF, AF;
                var AL = this.regEAX & 0xff;
                var AH = (this.regEAX >> 8) & 0xff;
                if ((AL & 0xf) > 9 || this.getAF()) {
                    AL = (AL - 0x6) & 0xf;
                    AH = (AH - 1) & 0xff;
                    CF = AF = 1;
                } else {
                    CF = AF = 0;
                }
                this.regEAX = (this.regEAX & ~0xffff) | ((AH << 8) | AL);
                if (CF) this.setCF(); else this.clearCF();
                if (AF) this.setAF(); else this.clearAF();
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;   // AAA and AAS have the same cycle times
            };
            
            /**
             * op=0x40 (INC [E]AX)
             *
             * @this {X86CPU}
             */
            X86.opINCAX = function INCAX()
            {
                this.regEAX = X86.fnINCr.call(this, this.regEAX);
            };
            
            /**
             * op=0x41 (INC [E]CX)
             *
             * @this {X86CPU}
             */
            X86.opINCCX = function INCCX()
            {
                this.regECX = X86.fnINCr.call(this, this.regECX);
            };
            
            /**
             * op=0x42 (INC [E]DX)
             *
             * @this {X86CPU}
             */
            X86.opINCDX = function INCDX()
            {
                this.regEDX = X86.fnINCr.call(this, this.regEDX);
            };
            
            /**
             * op=0x43 (INC [E]BX)
             *
             * @this {X86CPU}
             */
            X86.opINCBX = function INCBX()
            {
                this.regEBX = X86.fnINCr.call(this, this.regEBX);
            };
            
            /**
             * op=0x44 (INC [E]SP)
             *
             * @this {X86CPU}
             */
            X86.opINCSP = function INCSP()
            {
                this.setSP(X86.fnINCr.call(this, this.getSP()));
            };
            
            /**
             * op=0x45 (INC [E]BP)
             *
             * @this {X86CPU}
             */
            X86.opINCBP = function INCBP()
            {
                this.regEBP = X86.fnINCr.call(this, this.regEBP);
            };
            
            /**
             * op=0x46 (INC [E]SI)
             *
             * @this {X86CPU}
             */
            X86.opINCSI = function INCSI()
            {
                this.regESI = X86.fnINCr.call(this, this.regESI);
            };
            
            /**
             * op=0x47 (INC [E]DI)
             *
             * @this {X86CPU}
             */
            X86.opINCDI = function INCDI()
            {
                this.regEDI = X86.fnINCr.call(this, this.regEDI);
            };
            
            /**
             * op=0x48 (DEC [E]AX)
             *
             * @this {X86CPU}
             */
            X86.opDECAX = function DECAX()
            {
                this.regEAX = X86.fnDECr.call(this, this.regEAX);
            };
            
            /**
             * op=0x49 (DEC [E]CX)
             *
             * @this {X86CPU}
             */
            X86.opDECCX = function DECCX()
            {
                this.regECX = X86.fnDECr.call(this, this.regECX);
            };
            
            /**
             * op=0x4A (DEC [E]DX)
             *
             * @this {X86CPU}
             */
            X86.opDECDX = function DECDX()
            {
                this.regEDX = X86.fnDECr.call(this, this.regEDX);
            };
            
            /**
             * op=0x4B (DEC [E]BX)
             *
             * @this {X86CPU}
             */
            X86.opDECBX = function DECBX()
            {
                this.regEBX = X86.fnDECr.call(this, this.regEBX);
            };
            
            /**
             * op=0x4C (DEC [E]SP)
             *
             * @this {X86CPU}
             */
            X86.opDECSP = function DECSP()
            {
                this.setSP(X86.fnDECr.call(this, this.getSP()));
            };
            
            /**
             * op=0x4D (DEC [E]BP)
             *
             * @this {X86CPU}
             */
            X86.opDECBP = function DECBP()
            {
                this.regEBP = X86.fnDECr.call(this, this.regEBP);
            };
            
            /**
             * op=0x4E (DEC [E]SI)
             *
             * @this {X86CPU}
             */
            X86.opDECSI = function DECSI()
            {
                this.regESI = X86.fnDECr.call(this, this.regESI);
            };
            
            /**`
             * op=0x4F (DEC [E]DI)
             *
             * @this {X86CPU}
             */
            X86.opDECDI = function DECDI()
            {
                this.regEDI = X86.fnDECr.call(this, this.regEDI);
            };
            
            /**
             * op=0x50 (PUSH [E]AX)
             *
             * @this {X86CPU}
             */
            X86.opPUSHAX = function PUSHAX()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                }
                this.pushWord(this.regEAX & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x51 (PUSH [E]CX)
             *
             * @this {X86CPU}
             */
            X86.opPUSHCX = function PUSHCX()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiCL; this.backTrack.btiMemHi = this.backTrack.btiCH;
                }
                this.pushWord(this.regECX & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x52 (PUSH [E]DX)
             *
             * @this {X86CPU}
             */
            X86.opPUSHDX = function PUSHDX()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiDL; this.backTrack.btiMemHi = this.backTrack.btiDH;
                }
                this.pushWord(this.regEDX & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x53 (PUSH [E]BX)
             *
             * @this {X86CPU}
             */
            X86.opPUSHBX = function PUSHBX()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiBL; this.backTrack.btiMemHi = this.backTrack.btiBH;
                }
                this.pushWord(this.regEBX & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x54 (PUSH SP)
             *
             * @this {X86CPU}
             */
            X86.opPUSHSP_8086 = function PUSHSP_8086()
            {
                var w = (this.getSP() - 2) & 0xffff;
                this.pushWord(w);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x54 (PUSH [E]SP)
             *
             * @this {X86CPU}
             */
            X86.opPUSHSP = function PUSHSP()
            {
                this.pushWord(this.getSP() & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x55 (PUSH [E]BP)
             *
             * @this {X86CPU}
             */
            X86.opPUSHBP = function PUSHBP()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiBPLo; this.backTrack.btiMemHi = this.backTrack.btiBPHi;
                }
                this.pushWord(this.regEBP & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x56 (PUSH [E]SI)
             *
             * @this {X86CPU}
             */
            X86.opPUSHSI = function PUSHSI()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiSILo; this.backTrack.btiMemHi = this.backTrack.btiSIHi;
                }
                this.pushWord(this.regESI & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x57 (PUSH [E]DI)
             *
             * @this {X86CPU}
             */
            X86.opPUSHDI = function PUSHDI()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiDILo; this.backTrack.btiMemHi = this.backTrack.btiDIHi;
                }
                this.pushWord(this.regEDI & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x58 (POP [E]AX)
             *
             * @this {X86CPU}
             */
            X86.opPOPAX = function POPAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x59 (POP [E]CX)
             *
             * @this {X86CPU}
             */
            X86.opPOPCX = function POPCX()
            {
                this.regECX = (this.regECX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x5A (POP [E]DX)
             *
             * @this {X86CPU}
             */
            X86.opPOPDX = function POPDX()
            {
                this.regEDX = (this.regEDX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x5B (POP [E]BX)
             *
             * @this {X86CPU}
             */
            X86.opPOPBX = function POPBX()
            {
                this.regEBX = (this.regEBX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x5C (POP [E]SP)
             *
             * @this {X86CPU}
             */
            X86.opPOPSP = function POPSP()
            {
                this.setSP((this.getSP() & ~this.dataMask) | this.popWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x5D (POP [E]BP)
             *
             * @this {X86CPU}
             */
            X86.opPOPBP = function POPBP()
            {
                this.regEBP = (this.regEBP & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x5E (POP [E]SI)
             *
             * @this {X86CPU}
             */
            X86.opPOPSI = function POPSI()
            {
                this.regESI = (this.regESI & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x5F (POP [E]DI)
             *
             * @this {X86CPU}
             */
            X86.opPOPDI = function POPDI()
            {
                this.regEDI = (this.regEDI & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x60 (PUSHA) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opPUSHA = function PUSHA()
            {
                /*
                 * TODO: regLSP needs to be pre-bounds-checked against regLSPLimitLow
                 */
                var temp = this.getSP() & this.dataMask;
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                }
                this.pushWord(this.regEAX & this.dataMask);
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiCL; this.backTrack.btiMemHi = this.backTrack.btiCH;
                }
                this.pushWord(this.regECX & this.dataMask);
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiDL; this.backTrack.btiMemHi = this.backTrack.btiDH;
                }
                this.pushWord(this.regEDX & this.dataMask);
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiBL; this.backTrack.btiMemHi = this.backTrack.btiBH;
                }
                this.pushWord(this.regEBX & this.dataMask);
                this.pushWord(temp);
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiBPLo; this.backTrack.btiMemHi = this.backTrack.btiBPHi;
                }
                this.pushWord(this.regEBP & this.dataMask);
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiSILo; this.backTrack.btiMemHi = this.backTrack.btiSIHi;
                }
                this.pushWord(this.regESI & this.dataMask);
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiDILo; this.backTrack.btiMemHi = this.backTrack.btiDIHi;
                }
                this.pushWord(this.regEDI & this.dataMask);
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushAll;
            };
            
            /**
             * op=0x61 (POPA) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opPOPA = function POPA()
            {
                this.regEDI = (this.regEDI & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
                }
                this.regESI = (this.regESI & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
                }
                this.regEBP = (this.regEBP & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
                }
                /*
                 * TODO: regLSP needs to be pre-bounds-checked against regLSPLimit at the start
                 */
                this.setSP(this.getSP() + this.dataSize);
                // this.regLSP += (I386? this.dataSize : 2);
                this.regEBX = (this.regEBX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
                }
                this.regEDX = (this.regEDX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
                }
                this.regECX = (this.regECX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
                }
                this.regEAX = (this.regEAX & ~this.dataMask) | this.popWord();
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopAll;
            };
            
            /**
             * op=0x62 (BOUND reg,word) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opBOUND = function BOUND()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBOUND);
            };
            
            /**
             * op=0x63 (ARPL word,reg) (80286 and up)
             *
             * @this {X86CPU}
             */
            X86.opARPL = function ARPL()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnARPL);
            };
            
            /**
             * op=0x64 (FS:)
             *
             * @this {X86CPU}
             */
            X86.opFS = function FS()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                this.segData = this.segStack = this.segFS;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                this.stopCPU();
            };
            
            /**
             * op=0x65 (GS:)
             *
             * @this {X86CPU}
             */
            X86.opGS = function GS()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with SEG is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.SEG | X86.OPFLAG.NOINTR;
                this.segData = this.segStack = this.segGS;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                this.stopCPU();
            };
            
            /**
             * op=0x66 (OS:) (80386 and up)
             *
             * TODO: Review other effective operand-size criteria, cycle count, etc.
             *
             * @this {X86CPU}
             */
            X86.opOS = function OS()
            {
                if (I386) {
                    this.opFlags |= X86.OPFLAG.DATASIZE;
                    this.dataSize ^= 0x6;               // that which is 2 shall become 4, and vice versa
                    this.dataMask ^= (0xffff0000|0);    // that which is 0x0000ffff shall become 0xffffffff, and vice versa
                    this.updateDataSize();
                    this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                }
            };
            
            /**
             * op=0x67 (AS:) (80386 and up)
             *
             * TODO: Review other effective address-size criteria, cycle count, etc.
             *
             * @this {X86CPU}
             */
            X86.opAS = function AS()
            {
                if (I386) {
                    this.opFlags |= X86.OPFLAG.ADDRSIZE;
                    this.addrSize ^= 0x06;              // that which is 2 shall become 4, and vice versa
                    this.addrMask ^= (0xffff0000|0);    // that which is 0x0000ffff shall become 0xffffffff, and vice versa
                    this.updateAddrSize();
                    this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
                }
            };
            
            /**
             * op=0x68 (PUSH imm) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opPUSHn = function PUSHn()
            {
                this.pushWord(this.getIPWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x69 (IMUL reg,word,imm) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opIMULn = function IMULn()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnIMULn);
            };
            
            /**
             * op=0x6A (PUSH imm8) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opPUSH8 = function PUSH8()
            {
                if (BACKTRACK) this.backTrack.btiMemHi = 0;
                this.pushWord(this.getIPByte());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x6B (IMUL reg,word,imm8) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opIMUL8 = function IMUL8()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnIMUL8);
            };
            
            /**
             * op=0x6C (INSB) (80186/80188 and up)
             *
             * NOTE: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
             *
             * @this {X86CPU}
             */
            X86.opINSb = function INSb()
            {
                var nReps = 1;
                var nDelta = 0;
            
                /*
                 * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                 * an unrepeated INS, and 8 + 8n for a repeated INS.  However, accurate cycle times for the 80186/80188 is
                 * low priority.
                 */
                var nCycles = 5;
            
                /*
                 * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                 */
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                }
            
                if (nReps--) {
                    var b = this.bus.checkPortInputNotify(this.regEDX, this.regLIP - nDelta - 1);
                    if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiIO;
                    this.setSOByte(this.segES, this.regEDI & this.addrMask, b);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0x6D (INSW) (80186/80188 and up)
             *
             * NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
             *
             * @this {X86CPU}
             */
            X86.opINSw = function INSw()
            {
                var nReps = 1;
                var nDelta = 0;
            
                /*
                 * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                 * an unrepeated INS, and 8 + 8n for a repeated INS.  However, accurate cycle times for the 80186/80188 is
                 * low priority.
                 */
                var nCycles = 5;
            
                /*
                 * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                 */
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                }
                if (nReps--) {
                    var addrFrom = this.regLIP - nDelta - 1;
                    var w = 0, shift = 0;
                    for (var n = 0; n < this.dataSize; n++) {
                        w |= this.bus.checkPortInputNotify(this.regEDX, addrFrom) << shift;
                        shift += 8;
                        if (BACKTRACK) {
                            if (!n) {
                                this.backTrack.btiMemLo = this.backTrack.btiIO;
                            } else if (n == 1) {
                                this.backTrack.btiMemHi = this.backTrack.btiIO;
                            }
                        }
                    }
                    this.setSOWord(this.segES, this.regEDI & this.addrMask, w);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0x6E (OUTSB) (80186/80188 and up)
             *
             * NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
             *
             * @this {X86CPU}
             */
            X86.opOUTSb = function OUTSb()
            {
                var nReps = 1;
                var nDelta = 0;
            
                /*
                 * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                 * an unrepeated INS, and 8 + 8n for a repeated INS.  TODO: Fix this someday.
                 */
                var nCycles = 5;
            
                /*
                 * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                 */
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                }
                if (nReps--) {
                    var b = this.getSOByte(this.segDS, this.regESI & this.addrMask);
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiMemLo;
                    this.bus.checkPortOutputNotify(this.regEDX, b, this.regLIP - nDelta - 1);
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0x6F (OUTSW) (80186/80188 and up)
             *
             * NOTE: Segment overrides are ignored for this instruction, so we must use segDS instead of segData.
             *
             * @this {X86CPU}
             */
            X86.opOUTSw = function OUTSw()
            {
                var nReps = 1;
                var nDelta = 0;
            
                /*
                 * NOTE: 5 + 4n is the cycle time for the 80286; the 80186/80188 has different values: 14 cycles for
                 * an unrepeated INS, and 8 + 8n for a repeated INS.  TODO: Fix this someday.
                 */
                var nCycles = 5;
            
                /*
                 * The (normal) REP prefix, if used, is REPNZ (0xf2), but either one works....
                 */
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    if (this.opPrefixes & X86.OPFLAG.REPEAT) nCycles = 4;
                }
                if (nReps--) {
                    var w = this.getSOWord(this.segDS, this.regESI & this.addrMask);
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    var addrFrom = this.regLIP - nDelta - 1, shift = 0;
                    for (var n = 0; n < this.dataSize; n++) {
                        if (BACKTRACK) {
                            if (!n) {
                                this.backTrack.btiIO = this.backTrack.btiMemLo;
                            } else if (n == 1) {
                                this.backTrack.btiIO = this.backTrack.btiMemHi;
                            }
                        }
                        this.bus.checkPortOutputNotify(this.regEDX, (w >> shift) & 0xff, addrFrom);
                        shift += 8;
                    }
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0x70 (JO disp)
             *
             * @this {X86CPU}
             */
            X86.opJO = function JO()
            {
                var disp = this.getIPDisp();
                if (this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x71 (JNO disp)
             *
             * @this {X86CPU}
             */
            X86.opJNO = function JNO()
            {
                var disp = this.getIPDisp();
                if (!this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x72 (JC disp, aka JB disp)
             *
             * @this {X86CPU}
             */
            X86.opJC = function JC()
            {
                var disp = this.getIPDisp();
                if (this.getCF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x73 (JNC disp, aka JAE disp)
             *
             * @this {X86CPU}
             */
            X86.opJNC = function JNC()
            {
                var disp = this.getIPDisp();
                if (!this.getCF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x74 (JZ disp)
             *
             * @this {X86CPU}
             */
            X86.opJZ = function JZ()
            {
                var disp = this.getIPDisp();
                if (this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x75 (JNZ disp)
             *
             * @this {X86CPU}
             */
            X86.opJNZ = function JNZ()
            {
                var disp = this.getIPDisp();
                if (!this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x76 (JBE disp)
             *
             * @this {X86CPU}
             */
            X86.opJBE = function JBE()
            {
                var disp = this.getIPDisp();
                if (this.getCF() || this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x77 (JNBE disp, JA disp)
             *
             * @this {X86CPU}
             */
            X86.opJNBE = function JNBE()
            {
                var disp = this.getIPDisp();
                if (!this.getCF() && !this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x78 (JS disp)
             *
             * @this {X86CPU}
             */
            X86.opJS = function JS()
            {
                var disp = this.getIPDisp();
                if (this.getSF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x79 (JNS disp)
             *
             * @this {X86CPU}
             */
            X86.opJNS = function JNS()
            {
                var disp = this.getIPDisp();
                if (!this.getSF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x7A (JP disp)
             *
             * @this {X86CPU}
             */
            X86.opJP = function JP()
            {
                var disp = this.getIPDisp();
                if (this.getPF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x7B (JNP disp)
             *
             * @this {X86CPU}
             */
            X86.opJNP = function JNP()
            {
                var disp = this.getIPDisp();
                if (!this.getPF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x7C (JL disp)
             *
             * @this {X86CPU}
             */
            X86.opJL = function JL()
            {
                var disp = this.getIPDisp();
                if (!this.getSF() != !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x7D (JNL disp, aka JGE disp)
             *
             * @this {X86CPU}
             */
            X86.opJNL = function JNL()
            {
                var disp = this.getIPDisp();
                if (!this.getSF() == !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x7E (JLE disp)
             *
             * @this {X86CPU}
             */
            X86.opJLE = function JLE()
            {
                var disp = this.getIPDisp();
                if (this.getZF() || !this.getSF() != !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x7F (JNLE disp, aka JG disp)
             *
             * @this {X86CPU}
             */
            X86.opJNLE = function JNLE()
            {
                var disp = this.getIPDisp();
                if (!this.getZF() && !this.getSF() == !this.getOF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesJmpC;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpCFall;
            };
            
            /**
             * op=0x80/0x82 (GRP1 byte,imm8)
             *
             * @this {X86CPU}
             */
            X86.opGRP1b = function GRP1b()
            {
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp1b, this.getIPByte);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
            };
            
            /**
             * op=0x81 (GRP1 word,imm)
             *
             * @this {X86CPU}
             */
            X86.opGRP1w = function GRP1w()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp1w, this.getIPWord);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
            };
            
            /**
             * op=0x83 (GRP1 word,disp)
             *
             * @this {X86CPU}
             */
            X86.opGRP1sw = function GRP1sw()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp1w, this.getIPDisp);
                this.nStepCycles -= (this.regEAWrite === X86.ADDR_INVALID? 1 : this.cycleCounts.nOpCyclesArithMID);
            };
            
            /**
             * op=0x84 (TEST reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opTESTrb = function TESTrb()
            {
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnTESTb);
            };
            
            /**
             * op=0x85 (TEST reg,word)
             *
             * @this {X86CPU}
             */
            X86.opTESTrw = function TESTrw()
            {
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnTESTw);
            };
            
            /**
             * op=0x86 (XCHG reg,byte)
             *
             * NOTE: The XCHG instruction is unique in that both src and dst are both read and written;
             * see fnXCHGrb() for how we deal with this special case.
             *
             * @this {X86CPU}
             */
            X86.opXCHGrb = function XCHGrb()
            {
                /*
                 * If the second operand is a register, then the ModRegByte decoder must use separate "get" and
                 * "set" assignments, otherwise instructions like "XCHG DH,DL" will end up using a stale DL instead of
                 * the updated DL.
                 *
                 * To be clear, a single assignment like this will fail:
                 *
                 *      opModRegByteF2: function(fn)
            {
                 *          this.regEDX = (this.regEDX & 0xff) | (fn.call(this, this.regEDX >> 8, this.regEDX & 0xff) << 8);
                 *      }
                 *
                 * which is why all affected decoders now use separate assignments; eg:
                 *
                 *      opModRegByteF2: function(fn)
            {
                 *          var b = fn.call(this, this.regEDX >> 8, this.regEDX & 0xff);
                 *          this.regEDX = (this.regEDX & 0xff) | (b << 8);
                 *      }
                 */
                this.aOpModRegByte[this.bModRM = this.getIPByte()].call(this, X86.fnXCHGrb);
            };
            
            /**
             * op=0x87 (XCHG reg,word)
             *
             * NOTE: The XCHG instruction is unique in that both src and dst are both read and written;
             * see fnXCHGrw() for how we deal with this special case.
             *
             * @this {X86CPU}
             */
            X86.opXCHGrw = function XCHGrw()
            {
                this.aOpModRegWord[this.bModRM = this.getIPByte()].call(this, X86.fnXCHGrw);
            };
            
            /**
             * op=0x88 (MOV byte,reg)
             *
             * @this {X86CPU}
             */
            X86.opMOVmb = function MOVmb()
            {
                /*
                 * Like other MOV operations, the destination does not need to be read, just written.
                 */
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModMemByte[this.getIPByte()].call(this, X86.fnMOV);
            };
            
            /**
             * op=0x89 (MOV word,reg)
             *
             * @this {X86CPU}
             */
            X86.opMOVmw = function MOVmw()
            {
                /*
                 * Like other MOV operations, the destination does not need to be read, just written.
                 */
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModMemWord[this.getIPByte()].call(this, X86.fnMOV);
            };
            
            /**
             * op=0x8A (MOV reg,byte)
             *
             * @this {X86CPU}
             */
            X86.opMOVrb = function MOVrb()
            {
                this.aOpModRegByte[this.getIPByte()].call(this, X86.fnMOV);
            };
            
            /**
             * op=0x8B (MOV reg,word)
             *
             * @this {X86CPU}
             */
            X86.opMOVrw = function MOVrw()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnMOV);
            };
            
            /**
             * op=0x8C (MOV word,sreg)
             *
             * NOTE: Since the ModRM decoders deal only with general-purpose registers, we must move
             * the appropriate segment register into a special variable (regXX), which our helper function
             * (fnMOVxx) will use to replace the decoder's src operand.
             *
             * @this {X86CPU}
             */
            X86.opMOVwsr = function MOVwsr()
            {
                var bModRM = this.getIPByte();
                var reg = (bModRM & 0x38) >> 3;
                switch (reg) {
                case 0x0:
                    this.regXX = this.segES.sel;
                    break;
                case 0x1:
                    this.regXX = this.segCS.sel;
                    break;
                case 0x2:
                    this.regXX = this.segSS.sel;
                    break;
                case 0x3:
                    this.regXX = this.segDS.sel;
                    break;
                case 0x4:
                    if (I386 && this.model >= X86.MODEL_80386) {
                        this.regXX = this.segFS.sel;
                        break;
                    }
                    X86.opInvalid.call(this);
                    break;
                case 0x5:
                    if (I386 && this.model >= X86.MODEL_80386) {
                        this.regXX = this.segGS.sel;
                        break;
                    }
                    /* falls through */
                default:
                    X86.opInvalid.call(this);
                    break;
                }
                /*
                 * Like other MOV operations, the destination does not need to be read, just written.
                 */
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModMemWord[bModRM].call(this, X86.fnMOVxx);
            };
            
            /**
             * op=0x8D (LEA reg,word)
             *
             * @this {X86CPU}
             */
            X86.opLEA = function LEA()
            {
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.segData = this.segStack = this.segNULL;    // we can't have the EA calculation, if any, "polluted" by segment arithmetic
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLEA);
            };
            
            /**
             * op=0x8E (MOV sreg,word)
             *
             * NOTE: Since the ModRM decoders deal only with general-purpose registers, we have to
             * make a note of which general-purpose register will be overwritten, so that we can restore it
             * after moving the modified value to the correct segment register.
             *
             * @this {X86CPU}
             */
            X86.opMOVsrw = function MOVsrw()
            {
                var temp;
                var bModRM = this.getIPByte();
                var reg = (bModRM & 0x38) >> 3;
                switch(reg) {
                case 0x0:
                    temp = this.regEAX;
                    break;
                case 0x2:
                    temp = this.regEDX;
                    break;
                case 0x3:
                    temp = this.regEBX;
                    break;
                default:
                    if (this.model == X86.MODEL_80286 || this.model == X86.MODEL_80386 && reg != 0x4 && reg != 0x5) {
                        X86.opInvalid.call(this);
                        return;
                    }
                    switch(reg) {
                    case 0x1:           // MOV to CS is undocumented on 8086/8088/80186/80188, and invalid on 80286 and up
                        temp = this.regECX;
                        break;
                    case 0x4:           // this form of MOV to ES is undocumented on 8086/8088/80186/80188, invalid on 80286, and uses FS starting with 80386
                        temp = this.getSP();
                        break;
                    case 0x5:           // this form of MOV to CS is undocumented on 8086/8088/80186/80188, invalid on 80286, and uses GS starting with 80386
                        temp = this.regEBP;
                        break;
                    case 0x6:           // this form of MOV to SS is undocumented on 8086/8088/80186/80188, invalid on 80286 and up
                        temp = this.regESI;
                        break;
                    case 0x7:           // this form of MOV to DS is undocumented on 8086/8088/80186/80188, invalid on 80286 and up
                        temp = this.regEDI;
                        break;
                    default:
                        break;
                    }
                    break;
                }
                this.aOpModRegWord[bModRM].call(this, X86.fnMOV);
                switch (reg) {
                case 0x0:
                    this.setES(this.regEAX);
                    this.regEAX = temp;
                    break;
                case 0x1:
                    this.setCS(this.regECX);
                    this.regECX = temp;
                    break;
                case 0x2:
                    this.setSS(this.regEDX);
                    this.regEDX = temp;
                    break;
                case 0x3:
                    this.setDS(this.regEBX);
                    this.regEBX = temp;
                    break;
                case 0x4:
                    if (I386 && this.model >= X86.MODEL_80386) {
                        this.setFS(this.getSP());
                    } else {
                        this.setES(this.getSP());
                    }
                    this.setSP(temp);
                    break;
                case 0x5:
                    if (I386 && this.model >= X86.MODEL_80386) {
                        this.setGS(this.regEBP);
                    } else {
                        this.setCS(this.regEBP);
                    }
                    this.regEBP = temp;
                    break;
                case 0x6:
                    this.setSS(this.regESI);
                    this.regESI = temp;
                    break;
                case 0x7:
                    this.setDS(this.regEDI);
                    this.regEDI = temp;
                    break;
                }
            };
            
            /**
             * op=0x8F (POP word)
             *
             * @this {X86CPU}
             */
            X86.opPOPmw = function POPmw()
            {
                /*
                 * Like other MOV operations, the destination does not need to be read, just written.
                 */
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrpPOPw, this.popWord);
            };
            
            /**
             * op=0x90 (NOP, aka XCHG AX,AX)
             *
             * @this {X86CPU}
             */
            X86.opNOP = function NOP()
            {
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x91 (XCHG AX,CX)
             *
             * @this {X86CPU}
             */
            X86.opXCHGCX = function XCHGCX()
            {
                var temp = this.regEAX;
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regECX & this.dataMask) : this.regECX);
                this.regECX = (I386? (this.regECX & ~this.dataMask) | (temp & this.dataMask) : temp);
                if (BACKTRACK) {
                    temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiCL; this.backTrack.btiCL = temp;
                    temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiCH; this.backTrack.btiCH = temp;
                }
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x92 (XCHG AX,DX)
             *
             * @this {X86CPU}
             */
            X86.opXCHGDX = function XCHGDX()
            {
                var temp = this.regEAX;
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEDX & this.dataMask) : this.regEDX);
                this.regEDX = (I386? (this.regEDX & ~this.dataMask) | (temp & this.dataMask) : temp);
                if (BACKTRACK) {
                    temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiDL; this.backTrack.btiDL = temp;
                    temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiDH; this.backTrack.btiDH = temp;
                }
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x93 (XCHG AX,BX)
             *
             * @this {X86CPU}
             */
            X86.opXCHGBX = function XCHGBX()
            {
                var temp = this.regEAX;
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEBX & this.dataMask) : this.regEBX);
                this.regEBX = (I386? (this.regEBX & ~this.dataMask) | (temp & this.dataMask) : temp);
                if (BACKTRACK) {
                    temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiBL; this.backTrack.btiBL = temp;
                    temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiBH; this.backTrack.btiBH = temp;
                }
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x94 (XCHG AX,SP)
             *
             * @this {X86CPU}
             */
            X86.opXCHGSP = function XCHGSP()
            {
                var temp = this.regEAX;
                var regESP = this.getSP();
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (regESP & this.dataMask) : regESP);
                this.setSP((I386? (regESP & ~this.dataMask) | (temp & this.dataMask) : temp));
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiAH = 0;
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x95 (XCHG AX,BP)
             *
             * @this {X86CPU}
             */
            X86.opXCHGBP = function XCHGBP()
            {
                var temp = this.regEAX;
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEBP & this.dataMask) : this.regEBP);
                this.regEBP = (I386? (this.regEBP & ~this.dataMask) | (temp & this.dataMask) : temp);
                if (BACKTRACK) {
                    temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiBPLo; this.backTrack.btiBPLo = temp;
                    temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiBPHi; this.backTrack.btiBPHi = temp;
                }
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x96 (XCHG AX,SI)
             *
             * @this {X86CPU}
             */
            X86.opXCHGSI = function XCHGSI()
            {
                var temp = this.regEAX;
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regESI & this.dataMask) : this.regESI);
                this.regESI = (I386? (this.regESI & ~this.dataMask) | (temp & this.dataMask) : temp);
                if (BACKTRACK) {
                    temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiSILo; this.backTrack.btiSILo = temp;
                    temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiSIHi; this.backTrack.btiSIHi = temp;
                }
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x97 (XCHG AX,DI)
             *
             * @this {X86CPU}
             */
            X86.opXCHGDI = function XCHGDI()
            {
                var temp = this.regEAX;
                this.regEAX = (I386? (this.regEAX & ~this.dataMask) | (this.regEDI & this.dataMask) : this.regEDI);
                this.regEDI = (I386? (this.regEDI & ~this.dataMask) | (temp & this.dataMask) : temp);
                if (BACKTRACK) {
                    temp = this.backTrack.btiAL; this.backTrack.btiAL = this.backTrack.btiDILo; this.backTrack.btiDILo = temp;
                    temp = this.backTrack.btiAH; this.backTrack.btiAH = this.backTrack.btiDIHi; this.backTrack.btiDIHi = temp;
                }
                this.nStepCycles -= 3;                          // this form of XCHG takes 3 cycles on all CPUs
            };
            
            /**
             * op=0x98 (CBW/CWDE)
             *
             * NOTE: The 16-bit form (CBW) sign-extends AL into AX, whereas the 32-bit form (CWDE) sign-extends AX into EAX;
             * CWDE is similar to CWD, except that the destination is EAX rather than DX:AX.
             *
             * @this {X86CPU}
             */
            X86.opCBW = function CBW()
            {
                if (this.dataSize == 2) {   // CBW
                    this.regEAX = (this.regEAX & ~0xffff) | (((this.regEAX << 24) >> 24) & 0xffff);
                    if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiAL;
                }
                else {                      // CWDE
                    this.regEAX = ((this.regEAX << 16) >> 16);
                }
                this.nStepCycles -= 2;                          // CBW takes 2 cycles on all CPUs through 80286
            };
            
            /**
             * op=0x99 (CWD/CDQ)
             *
             * NOTE: The 16-bit form (CWD) sign-extends AX, producing a 32-bit result in DX:AX, while the 32-bit form (CDQ)
             * sign-extends EAX, producing a 64-bit result in EDX:EAX.
             *
             * @this {X86CPU}
             */
            X86.opCWD = function CWD()
            {
                if (this.dataSize == 2) {   // CWD
                    this.regEDX = (this.regEDX & ~0xffff) | ((this.regEAX & 0x8000)? 0xffff : 0);
                    if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiDH = this.backTrack.btiAH;
                }
                else {                      // CDQ
                    this.regEDX = (this.regEAX & (0x80000000|0))? -1 : 0;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesCWD;
            };
            
            /**
             * op=0x9A (CALL seg:off)
             *
             * @this {X86CPU}
             */
            X86.opCALLF = function CALLF()
            {
                X86.fnCALLF.call(this, this.getIPWord(), this.getIPShort());
                this.nStepCycles -= this.cycleCounts.nOpCyclesCallF;
            };
            
            /**
             * op=0x9B (WAIT)
             *
             * @this {X86CPU}
             */
            X86.opWAIT = function WAIT()
            {
                this.printMessage("WAIT not implemented");
                this.nStepCycles--;
            };
            
            /**
             * op=0x9C (PUSHF)
             *
             * @this {X86CPU}
             */
            X86.opPUSHF = function PUSHF()
            {
                this.pushWord(this.getPS());
                this.nStepCycles -= this.cycleCounts.nOpCyclesPushReg;
            };
            
            /**
             * op=0x9D (POPF)
             *
             * @this {X86CPU}
             */
            X86.opPOPF = function POPF()
            {
                this.setPS(this.popWord());
                /*
                 * NOTE: I'm assuming that neither POPF nor IRET are required to set NOINTR like STI does.
                 */
                this.nStepCycles -= this.cycleCounts.nOpCyclesPopReg;
            };
            
            /**
             * op=0x9E (SAHF)
             *
             * @this {X86CPU}
             */
            X86.opSAHF = function SAHF()
            {
                /*
                 * NOTE: While it make seem more efficient to do this:
                 *
                 *      this.setPS((this.getPS() & ~X86.PS_SAHF) | ((this.regEAX >> 8) & X86.PS_SAHF));
                 *
                 * getPS() forces any "cached" flags to be resolved first, and setPS() must do extra work above
                 * and beyond setting the arithmetic and logical flags, so on balance, the code below may be more
                 * efficient, and may also avoid unexpected side-effects of updating the entire PS register.
                 */
                var ah = (this.regEAX >> 8) & 0xff;
                if (ah & X86.PS.CF) this.setCF(); else this.clearCF();
                if (ah & X86.PS.PF) this.setPF(); else this.clearPF();
                if (ah & X86.PS.AF) this.setAF(); else this.clearAF();
                if (ah & X86.PS.ZF) this.setZF(); else this.clearZF();
                if (ah & X86.PS.SF) this.setSF(); else this.clearSF();
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
                this.assert((this.getPS() & X86.PS_SAHF) == (ah & X86.PS_SAHF));
            };
            
            /**
             * op=0x9F (LAHF)
             *
             * @this {X86CPU}
             */
            X86.opLAHF = function LAHF()
            {
                this.regEAX = (this.regEAX & ~0xff00) | (this.getPS() & X86.PS_SAHF) << 8;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xA0 (MOV AL,mem)
             *
             * @this {X86CPU}
             */
            X86.opMOVALm = function MOVALm()
            {
                this.regEAX = (this.regEAX & ~0xff) | this.getSOByte(this.segData, this.getIPAddr());
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesMovAM;
            };
            
            /**
             * op=0xA1 (MOV [E]AX,mem)
             *
             * @this {X86CPU}
             */
            X86.opMOVAXm = function MOVAXm()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | this.getSOWord(this.segData, this.getIPAddr());
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesMovAM;
            };
            
            /**
             * op=0xA2 (MOV mem,AL)
             *
             * @this {X86CPU}
             */
            X86.opMOVmAL = function MOVmAL()
            {
                if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiAL;
                /*
                 * setSOByte() truncates the value as appropriate
                 */
                this.setSOByte(this.segData, this.getIPAddr(), this.regEAX);
                this.nStepCycles -= this.cycleCounts.nOpCyclesMovMA;
            };
            
            /**
             * op=0xA3 (MOV mem,AX)
             *
             * @this {X86CPU}
             */
            X86.opMOVmAX = function MOVmAX()
            {
                if (BACKTRACK) {
                    this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                }
                /*
                 * setSOWord() truncates the value as appropriate
                 */
                this.setSOWord(this.segData, this.getIPAddr(), this.regEAX);
                this.nStepCycles -= this.cycleCounts.nOpCyclesMovMA;
            };
            
            /**
             * op=0xA4 (MOVSB)
             *
             * @this {X86CPU}
             */
            X86.opMOVSb = function MOVSb()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesMovS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesMovSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesMovSr0;
                }
                if (nReps--) {
                    var nInc = ((this.regPS & X86.PS.DF)? -1 : 1);
                    this.setSOByte(this.segES, this.regEDI & this.addrMask, this.getSOByte(this.segData, this.regESI));
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xA5 (MOVSW)
             *
             * @this {X86CPU}
             */
            X86.opMOVSw = function MOVSw()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesMovS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesMovSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesMovSr0;
                }
                if (nReps--) {
                    var nInc = ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize);
                    this.setSOWord(this.segES, this.regEDI & this.addrMask, this.getSOWord(this.segData, this.regESI));
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xA6 (CMPSB)
             *
             * @this {X86CPU}
             */
            X86.opCMPSb = function CMPSb()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesCmpS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesCmpSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
                }
                if (nReps--) {
                    var nInc = ((this.regPS & X86.PS.DF)? -1 : 1);
                    var bDst = this.getEAByte(this.segData, this.regESI & this.addrMask);
                    var bSrc = this.modEAByte(this.segES, this.regEDI & this.addrMask);
                    X86.fnCMPb.call(this, bDst, bSrc);
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                    /*
                     * NOTE: As long as we're calling fnCMPb(), all our cycle times must be reduced by nOpCyclesArithRM
                     */
                    this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    /*
                     * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                     * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                     * two values are equal, we must continue.
                     */
                    if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                        if (BUGS_8086) {
                            this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xA7 (CMPSW)
             *
             * @this {X86CPU}
             */
            X86.opCMPSw = function CMPSw()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesCmpS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesCmpSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesCmpSr0;
                }
                if (nReps--) {
                    var nInc = ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize);
                    var wDst = this.getEAWord(this.segData, this.regESI & this.addrMask);
                    var wSrc = this.modEAWord(this.segES, this.regEDI & this.addrMask);
                    X86.fnCMPw.call(this, wDst, wSrc);
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + nInc) & this.addrMask);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + nInc) & this.addrMask);
                    /*
                     * NOTE: As long as we're calling fnCMPw(), all our cycle times must be reduced by nOpCyclesArithRM
                     */
                    this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    /*
                     * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                     * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                     * two values are equal, we must continue.
                     */
                    if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                        if (BUGS_8086) {
                            this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xA8 (TEST AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opTESTALb = function TESTALb()
            {
                this.setLogicResult(this.regEAX & this.getIPByte(), X86.RESULT.BYTE);
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
            };
            
            /**
             * op=0xA9 (TEST [E]AX,imm)
             *
             * @this {X86CPU}
             */
            X86.opTESTAX = function TESTAX()
            {
                this.setLogicResult(this.regEAX & this.getIPWord(), this.dataType);
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAA;
            };
            
            /**
             * op=0xAA (STOSB)
             *
             * NOTES: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
             *
             * @this {X86CPU}
             */
            X86.opSTOSb = function STOSb()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesStoS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesStoSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesStoSr0;
                }
                if (nReps--) {
                    if (BACKTRACK) this.backTrack.btiMemLo = this.backTrack.btiAL;
                    this.setSOByte(this.segES, this.regEDI & this.addrMask, this.regEAX);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xAB (STOSW)
             *
             * NOTES: Segment overrides are ignored for this instruction, so we must use segES instead of segData.
             *
             * @this {X86CPU}
             */
            X86.opSTOSw = function STOSw()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesStoS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesStoSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesStoSr0;
                }
                if (nReps--) {
                    /*
                     * NOTE: Storing a word imposes another 4-cycle penalty on the 8088, so consider that
                     * if you think the cycle times here are too high.
                     */
                    if (BACKTRACK) {
                        this.backTrack.btiMemLo = this.backTrack.btiAL; this.backTrack.btiMemHi = this.backTrack.btiAH;
                    }
                    this.setSOWord(this.segES, this.regEDI & this.addrMask, this.regEAX);
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xAC (LODSB)
             *
             * @this {X86CPU}
             */
            X86.opLODSb = function LODSb()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesLodS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesLodSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesLodSr0;
                }
                if (nReps--) {
                    this.regEAX = (this.regEAX & ~0xff) | this.getSOByte(this.segData, this.regESI & this.addrMask);
                    if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xAD (LODSW)
             *
             * @this {X86CPU}
             */
            X86.opLODSw = function LODSw()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesLodS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesLodSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesLodSr0;
                }
                if (nReps--) {
                    this.regEAX = (this.regEAX & ~this.dataMask) | this.getSOWord(this.segData, this.regESI & this.addrMask);
                    if (BACKTRACK) {
                        this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                    }
                    this.regESI = (this.regESI & ~this.addrMask) | ((this.regESI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                    this.nStepCycles -= nCycles;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    if (nReps) {
                        if (BUGS_8086) {
                            this.rewindIP(((this.opPrefixes & X86.OPFLAG.SEG)? -3 : -2));
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xAE (SCASB)
             *
             * @this {X86CPU}
             */
            X86.opSCASb = function SCASb()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesScaS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesScaSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesScaSr0;
                }
                if (nReps--) {
                    X86.fnCMPb.call(this, this.regEAX & 0xff, this.modEAByte(this.segES, this.regEDI & this.addrMask));
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -1 : 1)) & this.addrMask);
                    /*
                     * NOTE: As long as we're calling fnCMPb(), all our cycle times must be reduced by nOpCyclesArithRM
                     */
                    this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    /*
                     * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                     * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                     * two values are equal, we must continue.
                     */
                    if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xAF (SCASW)
             *
             * @this {X86CPU}
             */
            X86.opSCASw = function SCASw()
            {
                var nReps = 1;
                var nDelta = 0;
                var nCycles = this.cycleCounts.nOpCyclesScaS;
                if (this.opPrefixes & (X86.OPFLAG.REPZ | X86.OPFLAG.REPNZ)) {
                    nReps = this.regECX & this.addrMask;
                    nDelta = 1;
                    nCycles = this.cycleCounts.nOpCyclesScaSrn;
                    if (!(this.opPrefixes & X86.OPFLAG.REPEAT)) this.nStepCycles -= this.cycleCounts.nOpCyclesScaSr0;
                }
                if (nReps--) {
                    X86.fnCMPw.call(this, this.regEAX & this.dataMask, this.modEAWord(this.segES, this.regEDI & this.addrMask));
                    this.regEDI = (this.regEDI & ~this.addrMask) | ((this.regEDI + ((this.regPS & X86.PS.DF)? -this.dataSize : this.dataSize)) & this.addrMask);
                    /*
                     * NOTE: As long as we're calling fnCMPw(), all our cycle times must be reduced by nOpCyclesArithRM
                     */
                    this.nStepCycles -= nCycles - this.cycleCounts.nOpCyclesArithRM;
                    this.regECX = (this.regECX & ~this.addrMask) | ((this.regECX - nDelta) & this.addrMask);
                    /*
                     * Repetition continues while ZF matches bit 0 of the REP prefix.  getZF() returns 0x40 if ZF is
                     * set, and OP_REPZ (which represents the REP prefix whose bit 0 is set) is 0x40 as well, so when those
                     * two values are equal, we must continue.
                     */
                    if (nReps && this.getZF() == (this.opPrefixes & X86.OPFLAG.REPZ)) {
                        if (BUGS_8086) {
                            this.rewindIP(-2);              // this instruction does not support multiple overrides
                            this.assert(this.regLIP == this.opLIP);
                        } else {
                            this.regLIP = this.opLIP;
                        }
                        this.opFlags |= X86.OPFLAG.REPEAT;
                    }
                }
            };
            
            /**
             * op=0xB0 (MOV AL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVALb = function MOVALb()
            {
                this.regEAX = (this.regEAX & ~0xff) | this.getIPByte();
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB1 (MOV CL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVCLb = function MOVCLb()
            {
                this.regECX = (this.regECX & ~0xff) | this.getIPByte();
                if (BACKTRACK) this.backTrack.btiCL = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB2 (MOV DL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVDLb = function MOVDLb()
            {
                this.regEDX = (this.regEDX & ~0xff) | this.getIPByte();
                if (BACKTRACK) this.backTrack.btiDL = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB3 (MOV BL,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVBLb = function MOVBLb()
            {
                this.regEBX = (this.regEBX & ~0xff) | this.getIPByte();
                if (BACKTRACK) this.backTrack.btiBL = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB4 (MOV AH,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVAHb = function MOVAHb()
            {
                this.regEAX = (this.regEAX & 0xff) | (this.getIPByte() << 8);
                if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB5 (MOV CH,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVCHb = function MOVCHb()
            {
                this.regECX = (this.regECX & 0xff) | (this.getIPByte() << 8);
                if (BACKTRACK) this.backTrack.btiCH = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB6 (MOV DH,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVDHb = function MOVDHb()
            {
                this.regEDX = (this.regEDX & 0xff) | (this.getIPByte() << 8);
                if (BACKTRACK) this.backTrack.btiDH = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB7 (MOV BH,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVBHb = function MOVBHb()
            {
                this.regEBX = (this.regEBX & 0xff) | (this.getIPByte() << 8);
                if (BACKTRACK) this.backTrack.btiBH = this.backTrack.btiMemLo;
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB8 (MOV [E]AX,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVAX = function MOVAX()
            {
                this.regEAX = (this.regEAX & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiAL = this.backTrack.btiMemLo; this.backTrack.btiAH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xB9 (MOV [E]CX,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVCX = function MOVCX()
            {
                this.regECX = (this.regECX & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiCL = this.backTrack.btiMemLo; this.backTrack.btiCH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xBA (MOV [E]DX,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVDX = function MOVDX()
            {
                this.regEDX = (this.regEDX & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiDL = this.backTrack.btiMemLo; this.backTrack.btiDH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xBB (MOV [E]BX,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVBX = function MOVBX()
            {
                this.regEBX = (this.regEBX & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiBL = this.backTrack.btiMemLo; this.backTrack.btiBH = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xBC (MOV [E]SP,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVSP = function MOVSP()
            {
                this.setSP((this.getSP() & ~this.dataMask) | this.getIPWord());
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xBD (MOV [E]BP,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVBP = function MOVBP()
            {
                this.regEBP = (this.regEBP & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiBPLo = this.backTrack.btiMemLo; this.backTrack.btiBPHi = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xBE (MOV [E]SI,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVSI = function MOVSI()
            {
                this.regESI = (this.regESI & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiSILo = this.backTrack.btiMemLo; this.backTrack.btiSIHi = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xBF (MOV [E]DI,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVDI = function MOVDI()
            {
                this.regEDI = (this.regEDI & ~this.dataMask) | this.getIPWord();
                if (BACKTRACK) {
                    this.backTrack.btiDILo = this.backTrack.btiMemLo; this.backTrack.btiDIHi = this.backTrack.btiMemHi;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLAHF;
            };
            
            /**
             * op=0xC0 (GRP2 byte,imm8) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opGRP2bn = function GRP2bn()
            {
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCountN);
            };
            
            /**
             * op=0xC1 (GRP2 word,imm) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opGRP2wn = function GRP2wn()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCountN);
            };
            
            /**
             * op=0xC2 (RET n)
             *
             * @this {X86CPU}
             */
            X86.opRETn = function RETn()
            {
                var n = this.getIPShort() << (this.dataSize >> 2);
                var newIP = this.popWord();
                if (DEBUG) this.printMessage(" returning to " + str.toHex(this.segCS.sel, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                this.setIP(newIP);
                if (n) this.setSP(this.getSP() + n);            // TODO: optimize
                this.nStepCycles -= this.cycleCounts.nOpCyclesRetn;
            };
            
            /**
             * op=0xC3 (RET)
             *
             * @this {X86CPU}
             */
            X86.opRET = function RET()
            {
                var newIP = this.popWord();
                if (DEBUG) this.printMessage(" returning to " + str.toHex(this.segCS.sel, 4) + ':' + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                this.setIP(newIP);
                this.nStepCycles -= this.cycleCounts.nOpCyclesRet;
            };
            
            /**
             * op=0xC4 (LES reg,word)
             *
             * This is like a "MOV reg,rm" operation, but it also loads ES from the next word.
             *
             * @this {X86CPU}
             */
            X86.opLES = function LES()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLES);
            };
            
            /**
             * op=0xC5 (LDS reg,word)
             *
             * This is like a "MOV reg,rm" operation, but it also loads DS from the next word.
             *
             * @this {X86CPU}
             */
            X86.opLDS = function LDS()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLDS);
            };
            
            /**
             * op=0xC6 (MOV byte,imm8)
             *
             * @this {X86CPU}
             */
            X86.opMOVb = function MOVb()
            {
                /*
                 * Like other MOV operations, the destination does not need to be read, just written.
                 */
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrpMOVn, this.getIPByte);
            };
            
            /**
             * op=0xC7 (MOV word,imm)
             *
             * @this {X86CPU}
             */
            X86.opMOVw = function MOVw()
            {
                /*
                 * Like other MOV operations, the destination does not need to be read, just written.
                 */
                this.opFlags |= X86.OPFLAG.NOREAD;
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrpMOVn, this.getIPWord);
            };
            
            /**
             * op=0xC8 (ENTER imm16,imm8) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opENTER = function ENTER()
            {
                var wLocal = this.getIPShort();
                var bLevel = this.getIPByte() & 0x1f;
                /*
                 * NOTE: 11 is the minimum cycle time for the 80286; the 80186/80188 has different cycle times: 15, 25 and
                 * 22 + 16 * (bLevel - 1) for bLevel 0, 1 and > 1, respectively.  TODO: Fix this someday.
                 */
                this.nStepCycles -= 11;
                this.pushWord(this.regEBP);
                var wFrame = this.getSP() & this.dataMask;
                if (bLevel > 0) {
                    this.nStepCycles -= (bLevel << 2) + (bLevel > 1? 1 : 0);
                    while (--bLevel) {
                        this.regEBP = (this.regEBP & ~this.dataMask) | ((this.regEBP - this.dataSize) & this.dataMask);
                        this.pushWord(this.getSOWord(this.segSS, this.regEBP & this.dataMask));
                    }
                    this.pushWord(wFrame);
                }
                this.regEBP = (this.regEBP & ~this.dataMask) | wFrame;
                this.setSP((this.getSP() & ~this.segSS.addrMask) | ((this.getSP() - wLocal) & this.segSS.addrMask));
            };
            
            /**
             * op=0xC9 (LEAVE) (80186/80188 and up)
             *
             * @this {X86CPU}
             */
            X86.opLEAVE = function LEAVE()
            {
                this.setSP((this.getSP() & ~this.segSS.addrMask) | (this.regEBP & this.segSS.addrMask));
                this.regEBP = (this.regEBP & ~this.dataMask) | (this.popWord() & this.dataMask);
                /*
                 * NOTE: 5 is the cycle time for the 80286; the 80186/80188 has a cycle time of 8.  TODO: Fix this someday.
                 */
                this.nStepCycles -= 5;
            };
            
            /**
             * op=0xCA (RETF n)
             *
             * @this {X86CPU}
             */
            X86.opRETFn = function RETFn()
            {
                X86.fnRETF.call(this, this.getIPShort());
                this.nStepCycles -= this.cycleCounts.nOpCyclesRetFn;
            };
            
            /**
             * op=0xCB (RETF)
             *
             * @this {X86CPU}
             */
            X86.opRETF = function RETF()
            {
                X86.fnRETF.call(this, 0);
                this.nStepCycles -= this.cycleCounts.nOpCyclesRetF;
            };
            
            /**
             * op=0xCC (INT 3)
             *
             * @this {X86CPU}
             */
            X86.opINT3 = function INT3()
            {
                /*
                 * To give our own Debugger the ability to stop execution on INT3, I thought about treating this as
                 * a fault rather than an interrupt, in order to leverage the existing Debugger logic inside fnFault()
                 * processing, but that has the unwanted side-effect of rewinding EIP to the INT3 prior to issuing
                 * the interrupt, and the corresponding IRET takes us right back to the INT3.
                 *
                 *      X86.fnFault.call(this, X86.EXCEPTION.BREAKPOINT, null, false, this.cycleCounts.nOpCyclesInt3D);
                 *
                 * Then I had the idea of using the fnFaultMessage() function, in much the same way that fnFault()
                 * does for actual faults: if the user turned on the FAULT and HALT message bits, then fnFaultMessage()
                 * would tell us to halt; otherwise, we'd perform the normal fnINT() call.
                 *
                 *      if (X86.fnFaultMessage.call(this, X86.EXCEPTION.BREAKPOINT)) {
                 *          this.setIP(this.opLIP - this.segCS.base);
                 *          return;
                 *      }
                 *
                 * However, that makes it a little tedious to get past the INT3 (you have to use a Debugger command
                 * like "t;g"), and a somewhat confusing fault message is displayed; eg:
                 *
                 *      Fault 0x03 on opcode 0xB4 at 09CE:0155 (%009E35)
                 *
                 * The best solution was to leave this function alone, and change the Debugger's checkBreakpoint()
                 * function to stop execution on INT3 whenever both the INT and HALT message bits are set; a simple "g"
                 * command allows you to continue.
                 */
                X86.fnINT.call(this, X86.EXCEPTION.BREAKPOINT, null, this.cycleCounts.nOpCyclesInt3D);
            };
            
            /**
             * op=0xCD (INT n)
             *
             * @this {X86CPU}
             */
            X86.opINTn = function INTn()
            {
                var nInt = this.getIPByte();
                if (this.checkIntNotify(nInt)) {
                    X86.fnINT.call(this, nInt, null, 0);
                    return;
                }
                this.nStepCycles--;     // we don't need to assess the full cost of nOpCyclesInt, but we need to assess something...
            };
            
            /**
             * op=0xCE (INTO: INT 4 if OF set)
             *
             * @this {X86CPU}
             */
            X86.opINTO = function INTO()
            {
                if (this.getOF()) {
                    X86.fnINT.call(this, X86.EXCEPTION.OVERFLOW, null, this.cycleCounts.nOpCyclesIntOD);
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesIntOFall;
            };
            
            /**
             * op=0xCF (IRET)
             *
             * @this {X86CPU}
             */
            X86.opIRET = function IRET()
            {
                X86.fnIRET.call(this);
            };
            
            /**
             * op=0xD0 (GRP2 byte,1)
             *
             * @this {X86CPU}
             */
            X86.opGRP2b1 = function GRP2b1()
            {
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCount1);
            };
            
            /**
             * op=0xD1 (GRP2 word,1)
             *
             * @this {X86CPU}
             */
            X86.opGRP2w1 = function GRP2w1()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCount1);
            };
            
            /**
             * op=0xD2 (GRP2 byte,CL)
             *
             * @this {X86CPU}
             */
            X86.opGRP2bCL = function GRP2bCL()
            {
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp2b, X86.fnSrcCountCL);
            };
            
            /**
             * op=0xD3 (GRP2 word,CL)
             *
             * @this {X86CPU}
             */
            X86.opGRP2wCL = function GRP2wCL()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, this.dataSize == 2? X86.aOpGrp2w : X86.aOpGrp2d, X86.fnSrcCountCL);
            };
            
            /**
             * op=0xD4 0x0A (AAM)
             *
             * From "The 8086 Book":
             *
             *  1. Divide AL by 0x0A; store the quotient in AH and the remainder in AL
             *  2. Set PF, SF, and ZF based on the AL register (CF, OF, and AF are undefined)
             *
             * @this {X86CPU}
             */
            X86.opAAM = function AAM()
            {
                var bDivisor = this.getIPByte();
                if (!bDivisor) {
                    /*
                     * TODO: Generate a divide-by-zero exception, if appropriate for the current CPU
                     */
                    return;
                }
                var AL = this.regEAX & 0xff;
                this.regEAX = (this.regEAX & ~0xffff) | ((AL / bDivisor) << 8) | (AL % bDivisor);
                /*
                 * setLogicResult() is slightly overkill, because technically, we don't need to clear CF and OF....
                 */
                this.setLogicResult(this.regEAX, X86.RESULT.BYTE);
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAM;
            };
            
            /**
             * op=0xD5 (AAD)
             *
             * From "The 8086 Book":
             *
             *  1. Multiply AH by 0x0A, add AH to AL, and store 0x00 in AH
             *  2. Set PF, SF, and ZF based on the AL register (CF, OF, and AF are undefined)
             *
             * @this {X86CPU}
             */
            X86.opAAD = function AAD()
            {
                var bMultiplier = this.getIPByte();
                this.regEAX = (this.regEAX & ~0xffff) | (((((this.regEAX >> 8) & 0xff) * bMultiplier) + this.regEAX) & 0xff);
                /*
                 * setLogicResult() is slightly overkill, because technically, we don't need to clear CF and OF....
                 */
                this.setLogicResult(this.regEAX, X86.RESULT.BYTE);
                this.nStepCycles -= this.cycleCounts.nOpCyclesAAD;
            };
            
            /**
             * op=0xD6 (SALC aka SETALC) (undocumented until Pentium Pro)
             *
             * Sets AL to 0xFF if CF=1, 0x00 otherwise; no flags are affected (similar to SBB AL,AL, but without side-effects)
             *
             * WARNING: I have no idea how many clocks this instruction originally required, so for now, I'm going with a minimum of 2.
             *
             * @this {X86CPU}
             */
            X86.opSALC = function SALC()
            {
                this.regEAX = (this.regEAX & ~0xff) | (this.getCF()? 0xFF : 0);
                this.nStepCycles -= 2;
            };
            
            /**
             * op=0xD7 (XLAT)
             *
             * @this {X86CPU}
             */
            X86.opXLAT = function XLAT()
            {
                /*
                 * NOTE: I have no idea whether XLAT actually wraps the 16-bit address calculation;
                 * I'm masking it as if it does, but I need to run a test on real hardware to be sure.
                 */
                this.regEAX = (this.regEAX & ~0xff) | this.getEAByte(this.segData, ((this.regEBX + (this.regEAX & 0xff)) & 0xffff));
                this.nStepCycles -= this.cycleCounts.nOpCyclesXLAT;
            };
            
            /**
             * op=0xD8-0xDF (ESC)
             *
             * @this {X86CPU}
             */
            X86.opESC = function ESC()
            {
                this.aOpModRegWord[this.getIPByte()].call(this, X86.fnESC);
                this.nStepCycles -= 8;      // TODO: Fix
            };
            
            /**
             * op=0xE0 (LOOPNZ disp)
             *
             * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
             * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
             * even though it seems counter-intuitive; ditto for the REP prefix.
             *
             * @this {X86CPU}
             */
            X86.opLOOPNZ = function LOOPNZ()
            {
                var disp = this.getIPDisp();
                if ((this.regECX = (this.regECX - 1) & this.addrMask) && !this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesLoopNZ;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLoopFall;
            };
            
            /**
             * op=0xE1 (LOOPZ disp)
             *
             * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
             * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
             * even though it seems counter-intuitive; ditto for the REP prefix.
             *
             * @this {X86CPU}
             */
            X86.opLOOPZ = function LOOPZ()
            {
                var disp = this.getIPDisp();
                if ((this.regECX = (this.regECX - 1) & this.addrMask) && this.getZF()) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZFall;
            };
            
            /**
             * op=0xE2 (LOOP disp)
             *
             * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
             * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
             * even though it seems counter-intuitive; ditto for the REP prefix.
             *
             * @this {X86CPU}
             */
            X86.opLOOP = function LOOP()
            {
                var disp = this.getIPDisp();
                if ((this.regECX = (this.regECX - 1) & this.addrMask)) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesLoop;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLoopFall;
            };
            
            /**
             * op=0xE3 (JCXZ/JECXZ disp)
             *
             * NOTE: All the instructions in this group (LOOPNZ, LOOPZ, LOOP, and JCXZ) actually
             * rely on the ADDRESS override setting for determining whether CX or ECX will be used,
             * even though it seems counter-intuitive; ditto for the REP prefix.
             *
             * @this {X86CPU}
             */
            X86.opJCXZ = function JCXZ()
            {
                var disp = this.getIPDisp();
                if (!(this.regECX & this.addrMask)) {
                    this.setIP(this.getIP() + disp);
                    this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZ;
                    return;
                }
                this.nStepCycles -= this.cycleCounts.nOpCyclesLoopZFall;
            };
            
            /**
             * op=0xE4 (IN AL,port)
             *
             * @this {X86CPU}
             */
            X86.opINb = function INb()
            {
                var port = this.getIPByte();
                this.regEAX = (this.regEAX & ~0xff) | this.bus.checkPortInputNotify(port, this.regLIP - 2);
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                this.nStepCycles -= this.cycleCounts.nOpCyclesInP;
            };
            
            /**
             * op=0xE5 (IN AX,port)
             *
             * @this {X86CPU}
             */
            X86.opINw = function INw()
            {
                var port = this.getIPByte();
                this.regEAX = this.bus.checkPortInputNotify(port, this.regLIP - 2);
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                this.regEAX |= (this.bus.checkPortInputNotify((port + 1) & 0xffff, this.regLIP - 2) << 8);
                if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiIO;
                this.nStepCycles -= this.cycleCounts.nOpCyclesInP;
            };
            
            /**
             * op=0xE6 (OUT port,AL)
             *
             * @this {X86CPU}
             */
            X86.opOUTb = function OUTb()
            {
                var port = this.getIPByte();
                this.bus.checkPortOutputNotify(port, this.regEAX & 0xff, this.regLIP - 2);
                this.nStepCycles -= this.cycleCounts.nOpCyclesOutP;
            };
            
            /**
             * op=0xE7 (OUT port,AX)
             *
             * @this {X86CPU}
             */
            X86.opOUTw = function OUTw()
            {
                var port = this.getIPByte();
                this.bus.checkPortOutputNotify(port, this.regEAX & 0xff, this.regLIP - 2);
                this.bus.checkPortOutputNotify((port + 1) & 0xffff, this.regEAX >> 8, this.regLIP - 2);
                this.nStepCycles -= this.cycleCounts.nOpCyclesOutP;
            };
            
            /**
             * op=0xE8 (CALL disp16)
             *
             * @this {X86CPU}
             */
            X86.opCALL = function CALL()
            {
                var disp = this.getIPWord();
                var oldIP = this.getIP();
                var newIP = oldIP + disp;
                if (DEBUG) this.printMessage("calling " + str.toHex(newIP, this.dataSize << 1), this.bitsMessage, true);
                this.pushWord(oldIP);
                this.setIP(newIP);
                this.nStepCycles -= this.cycleCounts.nOpCyclesCall;
            };
            
            /**
             * op=0xE9 (JMP disp16)
             *
             * @this {X86CPU}
             */
            X86.opJMP = function JMP()
            {
                var disp = this.getIPWord();
                this.setIP(this.getIP() + disp);
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmp;
            };
            
            /**
             * op=0xEA (JMP seg:off)
             *
             * @this {X86CPU}
             */
            X86.opJMPF = function JMPF()
            {
                this.setCSIP(this.getIPWord(), this.getIPShort());
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmpF;
            };
            
            /**
             * op=0xEB (JMP short disp8)
             *
             * @this {X86CPU}
             */
            X86.opJMPs = function JMPs()
            {
                var disp = this.getIPDisp();
                this.setIP(this.getIP() + disp);
                this.nStepCycles -= this.cycleCounts.nOpCyclesJmp;
            };
            
            /**
             * op=0xEC (IN AL,dx)
             *
             * @this {X86CPU}
             */
            X86.opINDXb = function INDXb()
            {
                this.regEAX = (this.regEAX & ~0xff) | this.bus.checkPortInputNotify(this.regEDX, this.regLIP - 1);
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                this.nStepCycles -= this.cycleCounts.nOpCyclesInDX;
            };
            
            /**
             * op=0xED (IN AX,dx)
             *
             * @this {X86CPU}
             */
            X86.opINDXw = function INDXw()
            {
                this.regEAX = this.bus.checkPortInputNotify(this.regEDX, this.regLIP - 1);
                if (BACKTRACK) this.backTrack.btiAL = this.backTrack.btiIO;
                this.regEAX |= (this.bus.checkPortInputNotify((this.regEDX + 1) & 0xffff, this.regLIP - 1) << 8);
                if (BACKTRACK) this.backTrack.btiAH = this.backTrack.btiIO;
                this.nStepCycles -= this.cycleCounts.nOpCyclesInDX;
            };
            
            /**
             * op=0xEE (OUT dx,AL)
             *
             * @this {X86CPU}
             */
            X86.opOUTDXb = function OUTDXb()
            {
                if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAL;
                this.bus.checkPortOutputNotify(this.regEDX, this.regEAX & 0xff, this.regLIP - 1);
                this.nStepCycles -= this.cycleCounts.nOpCyclesOutDX;
            };
            
            /**
             * op=0xEF (OUT dx,AX)
             *
             * @this {X86CPU}
             */
            X86.opOUTDXw = function OUTDXw()
            {
                if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAL;
                this.bus.checkPortOutputNotify(this.regEDX, this.regEAX & 0xff, this.regLIP - 1);
                if (BACKTRACK) this.backTrack.btiIO = this.backTrack.btiAH;
                this.bus.checkPortOutputNotify((this.regEDX + 1) & 0xffff, this.regEAX >> 8, this.regLIP - 1);
                this.nStepCycles -= this.cycleCounts.nOpCyclesOutDX;
            };
            
            /**
             * op=0xF0 (LOCK:)
             *
             * @this {X86CPU}
             */
            X86.opLOCK = function LOCK()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with LOCK is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.LOCK | X86.OPFLAG.NOINTR;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0xF1 (INT1; undocumented; 80186/80188 and up; TODO: Verify)
             *
             * I still treat this as undefined, until I can verify the behavior on real hardware.
             *
             * @this {X86CPU}
             */
            X86.opINT1 = function INT1()
            {
                X86.opUndefined.call(this);
            };
            
            /**
             * op=0xF2 (REPNZ:) (repeat CMPS or SCAS until NZ; repeat MOVS, LODS, or STOS unconditionally)
             *
             * @this {X86CPU}
             */
            X86.opREPNZ = function REPNZ()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with REPNZ is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.REPNZ | X86.OPFLAG.NOINTR;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0xF3 (REPZ:) (repeat CMPS or SCAS until Z; repeat MOVS, LODS, or STOS unconditionally)
             *
             * @this {X86CPU}
             */
            X86.opREPZ = function REPZ()
            {
                /*
                 * NOTE: The fact that we're setting NOINTR along with REPZ is really just for documentation purposes;
                 * the way stepCPU() is written, the presence of any prefix bypasses normal interrupt processing anyway.
                 */
                this.opFlags |= X86.OPFLAG.REPZ | X86.OPFLAG.NOINTR;
                this.nStepCycles -= this.cycleCounts.nOpCyclesPrefix;
            };
            
            /**
             * op=0xF4 (HLT)
             *
             * @this {X86CPU}
             */
            X86.opHLT = function HLT()
            {
                /*
                 * The CPU is never REALLY halted by a HLT instruction; instead, by setting X86.INTFLAG.HALT,
                 * we are signalling to stepCPU() that it's free to end the current burst AND that it should not
                 * execute any more instructions until checkINTR() indicates a hardware interrupt is requested.
                 */
                this.intFlags |= X86.INTFLAG.HALT;
                this.nStepCycles -= 2;
                /*
                 * If a Debugger is present and the HALT message category is enabled, then we REALLY halt the CPU,
                 * on the theory that whoever's using the Debugger would like to see HLTs.
                 */
                if (DEBUGGER && this.dbg && this.messageEnabled(Messages.HALT)) {
                    this.rewindIP(-1);      // this is purely for the Debugger's benefit, to show the HLT
                    this.stopCPU();
                    return;
                }
                /*
                 * We also REALLY halt the machine if interrupts have been disabled, since that means it's dead
                 * in the water (we have no NMI generation mechanism at the moment).
                 */
                if (!this.getIF()) {
                    if (DEBUGGER && this.dbg) this.rewindIP(-1);
                    this.stopCPU();
                }
            };
            
            /**
             * op=0xF5 (CMC)
             *
             * @this {X86CPU}
             */
            X86.opCMC = function CMC()
            {
                if (this.getCF()) this.clearCF(); else this.setCF();
                this.nStepCycles -= 2;                          // CMC takes 2 cycles on all CPUs
            };
            
            /**
             * op=0xF6 (GRP3 byte)
             *
             * The MUL byte instruction is problematic in two cases:
             *
             *      0xF6 0xE0:  MUL AL
             *      0xF6 0xE4:  MUL AH
             *
             * because the OpModGrpByte decoder function will attempt to put the fnMULb() function's
             * return value back into AL or AH, undoing fnMULb's update of AX.  And since fnMULb doesn't
             * know what the target is (only the target's value), it cannot easily work around the problem.
             *
             * A simple, albeit kludgy, solution is for fnMULb to always save its result in a special
             * "register" (eg, regMDLo), which we will then put back into regEAX if it's been updated.
             * This also relieves us from having to decode any part of the ModRM byte, so maybe it's not
             * such a bad work-around after all.
             *
             * Similar issues with IMUL (and DIV and IDIV) are resolved using the same special variable(s).
             *
             * @this {X86CPU}
             */
            X86.opGRP3b = function GRP3b()
            {
                this.fMDSet = false;
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp3b, X86.fnSrcNone);
                if (this.fMDSet) this.regEAX = (this.regEAX & ~this.dataMask) | (this.regMDLo & this.dataMask);
            };
            
            /**
             * op=0xF7 (GRP3 word)
             *
             * The MUL word instruction is problematic in two cases:
             *
             *      0xF7 0xE0:  MUL AX
             *      0xF7 0xE2:  MUL DX
             *
             * because the OpModGrpWord decoder function will attempt to put the fnMULw() function's
             * return value back into AX or DX, undoing fnMULw's update of DX:AX.  And since fnMULw doesn't
             * know what the target is (only the target's value), it cannot easily work around the problem.
             *
             * A simple, albeit kludgey, solution is for fnMULw to always save its result in a special
             * "register" (eg, regMDLo/regMDHi), which we will then put back into regEAX/regEDX if it's been
             * updated.  This also relieves us from having to decode any part of the ModRM byte, so maybe
             * it's not such a bad work-around after all.
             *
             * @this {X86CPU}
             */
            X86.opGRP3w = function GRP3w()
            {
                this.fMDSet = false;
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp3w, X86.fnSrcNone);
                if (this.fMDSet) {
                    this.regEAX = (this.regEAX & ~this.dataMask) | (this.regMDLo & this.dataMask);
                    this.regEDX = (this.regEDX & ~this.dataMask) | (this.regMDHi & this.dataMask);
                }
            };
            
            /**
             * op=0xF8 (CLC)
             *
             * @this {X86CPU}
             */
            X86.opCLC = function CLC()
            {
                this.clearCF();
                this.nStepCycles -= 2;                          // CLC takes 2 cycles on all CPUs
            };
            
            /**
             * op=0xF9 (STC)
             *
             * @this {X86CPU}
             */
            X86.opSTC = function STC()
            {
                this.setCF();
                this.nStepCycles -= 2;                          // STC takes 2 cycles on all CPUs
            };
            
            /**
             * op=0xFA (CLI)
             *
             * @this {X86CPU}
             */
            X86.opCLI = function CLI()
            {
                this.clearIF();
                this.nStepCycles -= this.cycleCounts.nOpCyclesCLI;   // CLI takes LONGER on an 80286
            };
            
            /**
             * op=0xFB (STI)
             *
             * @this {X86CPU}
             */
            X86.opSTI = function STI()
            {
                this.setIF();
                this.opFlags |= X86.OPFLAG.NOINTR;
                this.nStepCycles -= 2;                          // STI takes 2 cycles on all CPUs
            };
            
            /**
             * op=0xFC (CLD)
             *
             * @this {X86CPU}
             */
            X86.opCLD = function CLD()
            {
                this.clearDF();
                this.nStepCycles -= 2;                          // CLD takes 2 cycles on all CPUs
            };
            
            /**
             * op=0xFD (STD)
             *
             * @this {X86CPU}
             */
            X86.opSTD = function STD()
            {
                this.setDF();
                this.nStepCycles -= 2;                          // STD takes 2 cycles on all CPUs
            };
            
            /**
             * op=0xFE (GRP4 byte)
             *
             * @this {X86CPU}
             */
            X86.opGRP4b = function GRP4b()
            {
                this.aOpModGrpByte[this.getIPByte()].call(this, X86.aOpGrp4b, X86.fnSrcNone);
            };
            
            /**
             * op=0xFF (GRP4 word)
             *
             * @this {X86CPU}
             */
            X86.opGRP4w = function GRP4w()
            {
                this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp4w, X86.fnSrcNone);
            };
            
            /**
             * opInvalid()
             *
             * @this {X86CPU}
             */
            X86.opInvalid = function opInvalid()
            {
                X86.fnFault.call(this, X86.EXCEPTION.UD_FAULT);
                this.stopCPU();
            };
            
            /**
             * opUndefined()
             *
             * @this {X86CPU}
             */
            X86.opUndefined = function opUndefined()
            {
                this.setIP(this.opLIP - this.segCS.base);
                this.setError("Undefined opcode " + str.toHexByte(this.bus.getByteDirect(this.regLIP)) + " at " + str.toHexLong(this.regLIP));
                this.stopCPU();
            };
            
            /**
             * opTBD()
             *
             * @this {X86CPU}
             */
            X86.opTBD = function opTBD()
            {
                this.setIP(this.opLIP - this.segCS.base);
                this.printMessage("unimplemented 80386 opcode", true);
                this.stopCPU();
            };
            
            /*
             * This 256-entry array of opcode functions is at the heart of the CPU engine: stepCPU(n).
             *
             * It might be worth trying a switch() statement instead, to see how the performance compares,
             * but I suspect that would vary quite a bit across JavaScript engines; for now, I'm putting my
             * money on array lookup.
             */
            X86.aOps = [
                X86.opADDmb,            X86.opADDmw,            X86.opADDrb,            X86.opADDrw,        // 0x00-0x03
                X86.opADDALb,           X86.opADDAX,            X86.opPUSHES,           X86.opPOPES,        // 0x04-0x07
                X86.opORmb,             X86.opORmw,             X86.opORrb,             X86.opORrw,         // 0x08-0x0B
                X86.opORALb,            X86.opORAX,             X86.opPUSHCS,           X86.opPOPCS,        // 0x0C-0x0F
                X86.opADCmb,            X86.opADCmw,            X86.opADCrb,            X86.opADCrw,        // 0x10-0x13
                X86.opADCALb,           X86.opADCAX,            X86.opPUSHSS,           X86.opPOPSS,        // 0x14-0x17
                X86.opSBBmb,            X86.opSBBmw,            X86.opSBBrb,            X86.opSBBrw,        // 0x18-0x1B
                X86.opSBBALb,           X86.opSBBAX,            X86.opPUSHDS,           X86.opPOPDS,        // 0x1C-0x1F
                X86.opANDmb,            X86.opANDmw,            X86.opANDrb,            X86.opANDrw,        // 0x20-0x23
                X86.opANDAL,            X86.opANDAX,            X86.opES,               X86.opDAA,          // 0x24-0x27
                X86.opSUBmb,            X86.opSUBmw,            X86.opSUBrb,            X86.opSUBrw,        // 0x28-0x2B
                X86.opSUBALb,           X86.opSUBAX,            X86.opCS,               X86.opDAS,          // 0x2C-0x2F
                X86.opXORmb,            X86.opXORmw,            X86.opXORrb,            X86.opXORrw,        // 0x30-0x33
                X86.opXORALb,           X86.opXORAX,            X86.opSS,               X86.opAAA,          // 0x34-0x37
                X86.opCMPmb,            X86.opCMPmw,            X86.opCMPrb,            X86.opCMPrw,        // 0x38-0x3B
                X86.opCMPALb,           X86.opCMPAX,            X86.opDS,               X86.opAAS,          // 0x3C-0x3F
                X86.opINCAX,            X86.opINCCX,            X86.opINCDX,            X86.opINCBX,        // 0x40-0x43
                X86.opINCSP,            X86.opINCBP,            X86.opINCSI,            X86.opINCDI,        // 0x44-0x47
                X86.opDECAX,            X86.opDECCX,            X86.opDECDX,            X86.opDECBX,        // 0x48-0x4B
                X86.opDECSP,            X86.opDECBP,            X86.opDECSI,            X86.opDECDI,        // 0x4C-0x4F
                X86.opPUSHAX,           X86.opPUSHCX,           X86.opPUSHDX,           X86.opPUSHBX,       // 0x50-0x53
                X86.opPUSHSP_8086,      X86.opPUSHBP,           X86.opPUSHSI,           X86.opPUSHDI,       // 0x54-0x57
                X86.opPOPAX,            X86.opPOPCX,            X86.opPOPDX,            X86.opPOPBX,        // 0x58-0x5B
                X86.opPOPSP,            X86.opPOPBP,            X86.opPOPSI,            X86.opPOPDI,        // 0x5C-0x5F
                /*
                 * On an 8086/8088, opcodes 0x60-0x6F are aliases for the conditional jumps 0x70-0x7F.  Sometimes you'll see
                 * references to these opcodes (like 0x60) being a "two-byte NOP" and using them differentiate an 8088 from newer
                 * CPUs, but they're only a "two-byte NOP" if the second byte is zero, resulting in zero displacement.
                 */
                X86.opJO,               X86.opJNO,              X86.opJC,               X86.opJNC,          // 0x60-0x63
                X86.opJZ,               X86.opJNZ,              X86.opJBE,              X86.opJNBE,         // 0x64-0x67
                X86.opJS,               X86.opJNS,              X86.opJP,               X86.opJNP,          // 0x68-0x6B
                X86.opJL,               X86.opJNL,              X86.opJLE,              X86.opJNLE,         // 0x6C-0x6F
                X86.opJO,               X86.opJNO,              X86.opJC,               X86.opJNC,          // 0x70-0x73
                X86.opJZ,               X86.opJNZ,              X86.opJBE,              X86.opJNBE,         // 0x74-0x77
                X86.opJS,               X86.opJNS,              X86.opJP,               X86.opJNP,          // 0x78-0x7B
                X86.opJL,               X86.opJNL,              X86.opJLE,              X86.opJNLE,         // 0x7C-0x7F
                /*
                 * On all processors, opcode groups 0x80 and 0x82 perform identically (0x82 opcodes sign-extend their
                 * immediate data, but since both 0x80 and 0x82 are byte operations, the sign extension has no effect).
                 *
                 * WARNING: Intel's "Pentium Processor User's Manual (Volume 3: Architecture and Programming Manual)" refers
                 * to opcode 0x82 as a "reserved" instruction, but also cryptically refers to it as "MOVB AL,imm".  This is
                 * assumed to be an error in the manual, because as far as I know, 0x82 has always mirrored 0x80.
                 */
                X86.opGRP1b,            X86.opGRP1w,            X86.opGRP1b,            X86.opGRP1sw,       // 0x80-0x83
                X86.opTESTrb,           X86.opTESTrw,           X86.opXCHGrb,           X86.opXCHGrw,       // 0x84-0x87
                X86.opMOVmb,            X86.opMOVmw,            X86.opMOVrb,            X86.opMOVrw,        // 0x88-0x8B
                X86.opMOVwsr,           X86.opLEA,              X86.opMOVsrw,           X86.opPOPmw,        // 0x8C-0x8F
                X86.opNOP,              X86.opXCHGCX,           X86.opXCHGDX,           X86.opXCHGBX,       // 0x90-0x93
                X86.opXCHGSP,           X86.opXCHGBP,           X86.opXCHGSI,           X86.opXCHGDI,       // 0x94-0x97
                X86.opCBW,              X86.opCWD,              X86.opCALLF,            X86.opWAIT,         // 0x98-0x9B
                X86.opPUSHF,            X86.opPOPF,             X86.opSAHF,             X86.opLAHF,         // 0x9C-0x9F
                X86.opMOVALm,           X86.opMOVAXm,           X86.opMOVmAL,           X86.opMOVmAX,       // 0xA0-0xA3
                X86.opMOVSb,            X86.opMOVSw,            X86.opCMPSb,            X86.opCMPSw,        // 0xA4-0xA7
                X86.opTESTALb,          X86.opTESTAX,           X86.opSTOSb,            X86.opSTOSw,        // 0xA8-0xAB
                X86.opLODSb,            X86.opLODSw,            X86.opSCASb,            X86.opSCASw,        // 0xAC-0xAF
                X86.opMOVALb,           X86.opMOVCLb,           X86.opMOVDLb,           X86.opMOVBLb,       // 0xB0-0xB3
                X86.opMOVAHb,           X86.opMOVCHb,           X86.opMOVDHb,           X86.opMOVBHb,       // 0xB4-0xB7
                X86.opMOVAX,            X86.opMOVCX,            X86.opMOVDX,            X86.opMOVBX,        // 0xB8-0xBB
                X86.opMOVSP,            X86.opMOVBP,            X86.opMOVSI,            X86.opMOVDI,        // 0xBC-0xBF
                /*
                 * On an 8086/8088, opcodes 0xC0 -> 0xC2, 0xC1 -> 0xC3, 0xC8 -> 0xCA and 0xC9 -> 0xCB.
                 */
                X86.opRETn,             X86.opRET,              X86.opRETn,             X86.opRET,          // 0xC0-0xC3
                X86.opLES,              X86.opLDS,              X86.opMOVb,             X86.opMOVw,         // 0xC4-0xC7
                X86.opRETFn,            X86.opRETF,             X86.opRETFn,            X86.opRETF,         // 0xC8-0xCB
                X86.opINT3,             X86.opINTn,             X86.opINTO,             X86.opIRET,         // 0xCC-0xCF
                X86.opGRP2b1,           X86.opGRP2w1,           X86.opGRP2bCL,          X86.opGRP2wCL,      // 0xD0-0xD3
                /*
                 * Even as of the Pentium, opcode 0xD6 is still marked as "reserved", but it's always been SALC (aka SETALC).
                 */
                X86.opAAM,              X86.opAAD,              X86.opSALC,             X86.opXLAT,         // 0xD4-0xD7
                X86.opESC,              X86.opESC,              X86.opESC,              X86.opESC,          // 0xD8-0xDB
                X86.opESC,              X86.opESC,              X86.opESC,              X86.opESC,          // 0xDC-0xDF
                X86.opLOOPNZ,           X86.opLOOPZ,            X86.opLOOP,             X86.opJCXZ,         // 0xE0-0xE3
                X86.opINb,              X86.opINw,              X86.opOUTb,             X86.opOUTw,         // 0xE4-0xE7
                X86.opCALL,             X86.opJMP,              X86.opJMPF,             X86.opJMPs,         // 0xE8-0xEB
                X86.opINDXb,            X86.opINDXw,            X86.opOUTDXb,           X86.opOUTDXw,       // 0xEC-0xEF
                /*
                 * On an 8086/8088, opcode 0xF1 is believed to be an alias for 0xF0; in any case, it definitely behaves like
                 * a prefix on those processors, so we treat it as such.  On the 80186 and up, we treat as opINT1().
                 *
                 * As of the Pentium, opcode 0xF1 is still marked "reserved".
                 */
                X86.opLOCK,             X86.opLOCK,             X86.opREPNZ,            X86.opREPZ,         // 0xF0-0xF3
                X86.opHLT,              X86.opCMC,              X86.opGRP3b,            X86.opGRP3w,        // 0xF4-0xF7
                X86.opCLC,              X86.opSTC,              X86.opCLI,              X86.opSTI,          // 0xF8-0xFB
                X86.opCLD,              X86.opSTD,              X86.opGRP4b,            X86.opGRP4w         // 0xFC-0xFF
            ];
            
            /*
             * A word (or two) on instruction groups (eg, Grp1, Grp2), which are groups of instructions that
             * use a mod/reg/rm byte, where the reg field of that byte selects a function rather than a register.
             *
             * I start with the groupings used by Intel's "Pentium Processor User's Manual (Volume 3: Architecture
             * and Programming Manual)", but I deviate slightly, mostly by subdividing their groups with letter suffixes:
             *
             *      Opcodes     Intel       PCjs                                                PC Mag TechRef
             *      -------     -----       ----                                                --------------
             *      0x80-0x83   Grp1        Grp1b and Grp1w                                     Group A
             *      0xC0-0xC1   Grp2        Grp2b and Grp2w (opGRP2bn/wn)                       Group B
             *      0xD0-0xD3   Grp2        Grp2b and Grp2w (opGRP2b1/w1 and opGRP2bCL/wCL)     Group B
             *      0xF6-0xF7   Grp3        Grp3b and Grp3w                                     Group C
             *      0xFE        Grp4        Grp4b                                               Group D
             *      0xFF        Grp5        Grp4w                                               Group E
             *      0x0F,0x00   Grp6        Grp6 (SLDT, STR, LLDT, LTR, VERR, VERW)             Group F
             *      0x0F,0x01   Grp7        Grp7 (SGDT, SIDT, LGDT, LIDT, SMSW, LMSW, INVLPG)   Group G
             *      0x0F,0xBA   Grp8        Grp8 (BT, BTS, BTR, BTC)                            Group H
             *      0x0F,0xC7   Grp9        Grp9 (CMPXCH)                                       (N/A, 80486 and up)
             *
             * My only serious deviation is Grp5, which I refer to as Grp4w, because it contains word forms of
             * the INC and DEC instructions found in Grp4b.  Granted, Grp4w also contains versions of the CALL,
             * JMP and PUSH instructions, which are not in Grp4b, but there's nothing in Grp4b that conflicts with
             * Grp4w, so I think my nomenclature makes more sense.  To compensate, I don't use Grp5, so that the
             * remaining group numbers remain in sync with Intel's.
             *
             * To the above list, I've added a few "single-serving" groups: opcode 0x8F uses GrpPOPw, and opcodes 0xC6/0xC7
             * use GrpMOVn.  In both of these groups, the only valid (documented) instruction is where reg=0x0.
             *
             * TODO: Test what happens on real hardware when the reg field is non-zero for opcodes 0x8F and 0xC6/0xC7.
             */
            X86.aOpGrp1b = [
                X86.fnADDb,             X86.fnORb,              X86.fnADCb,             X86.fnSBBb,             // 0x80/0x82(reg=0x0-0x3)
                X86.fnANDb,             X86.fnSUBb,             X86.fnXORb,             X86.fnCMPb              // 0x80/0x82(reg=0x4-0x7)
            ];
            
            X86.aOpGrp1w = [
                X86.fnADDw,             X86.fnORw,              X86.fnADCw,             X86.fnSBBw,             // 0x81/0x83(reg=0x0-0x3)
                X86.fnANDw,             X86.fnSUBw,             X86.fnXORw,             X86.fnCMPw              // 0x81/0x83(reg=0x4-0x7)
            ];
            
            X86.aOpGrpPOPw = [
                X86.fnPOPw,             X86.fnGRPFault,         X86.fnGRPFault,         X86.fnGRPFault,         // 0x8F(reg=0x0-0x3)
                X86.fnGRPFault,         X86.fnGRPFault,         X86.fnGRPFault,         X86.fnGRPFault          // 0x8F(reg=0x4-0x7)
            ];
            
            X86.aOpGrpMOVn = [
                X86.fnMOVn,             X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     // 0xC6/0xC7(reg=0x0-0x3)
                X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0xC6/0xC7(reg=0x4-0x7)
            ];
            
            X86.aOpGrp2b = [
                X86.fnROLb,             X86.fnRORb,             X86.fnRCLb,             X86.fnRCRb,             // 0xC0/0xD0/0xD2(reg=0x0-0x3)
                X86.fnSHLb,             X86.fnSHRb,             X86.fnGRPUndefined,     X86.fnSARb              // 0xC0/0xD0/0xD2(reg=0x4-0x7)
            ];
            
            X86.aOpGrp2w = [
                X86.fnROLw,             X86.fnRORw,             X86.fnRCLw,             X86.fnRCRw,             // 0xC1/0xD1/0xD3(reg=0x0-0x3)
                X86.fnSHLw,             X86.fnSHRw,             X86.fnGRPUndefined,     X86.fnSARw              // 0xC1/0xD1/0xD3(reg=0x4-0x7)
            ];
            
            X86.aOpGrp2d = [
                X86.fnROLd,             X86.fnRORd,             X86.fnRCLd,             X86.fnRCRd,             // 0xC1/0xD1/0xD3(reg=0x0-0x3)
                X86.fnSHLd,             X86.fnSHRd,             X86.fnGRPUndefined,     X86.fnSARd              // 0xC1/0xD1/0xD3(reg=0x4-0x7)
            ];
            
            X86.aOpGrp3b = [
                X86.fnTEST8,            X86.fnGRPUndefined,     X86.fnNOTb,             X86.fnNEGb,             // 0xF6(reg=0x0-0x3)
                X86.fnMULb,             X86.fnIMULb,            X86.fnDIVb,             X86.fnIDIVb             // 0xF6(reg=0x4-0x7)
            ];
            
            X86.aOpGrp3w = [
                X86.fnTEST16,           X86.fnGRPUndefined,     X86.fnNOTw,             X86.fnNEGw,             // 0xF7(reg=0x0-0x3)
                X86.fnMULw,             X86.fnIMULw,            X86.fnDIVw,             X86.fnIDIVw             // 0xF7(reg=0x4-0x7)
            ];
            
            X86.aOpGrp4b = [
                X86.fnINCb,             X86.fnDECb,             X86.fnGRPUndefined,     X86.fnGRPUndefined,     // 0xFE(reg=0x0-0x3)
                X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined,     X86.fnGRPUndefined      // 0xFE(reg=0x4-0x7)
            ];
            
            X86.aOpGrp4w = [
                X86.fnINCw,             X86.fnDECw,             X86.fnCALLw,            X86.fnCALLFdw,          // 0xFF(reg=0x0-0x3)
                X86.fnJMPw,             X86.fnJMPFdw,           X86.fnPUSHw,            X86.fnGRPFault          // 0xFF(reg=0x4-0x7)
            ];
            
          • x86seg.js
            /**
             * @fileoverview Implements PCjs X86 Segment Registers
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-Sep-10
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            if (typeof module !== 'undefined') {
                var str         = require("../../shared/lib/strlib");
                var Messages    = require("./messages");
                var Memory      = require("./memory");
                var X86         = require("./x86");
            }
            
            /**
             * @class X86Seg
             * @property {number} sel
             * @property {number} limit (in protected-mode, this comes from descriptor word 0x0)
             * @property {number} base (in protected-mode, this comes from descriptor word 0x2)
             * @property {number} acc (in protected-mode, this comes from descriptor word 0x4; bits 0-7 supplement base bits 16-23)
             * @property {number} ext (in protected-mode, this is descriptor word 0x6, 80386 only; supplements limit bits 16-19 and base bits 24-31)
             *
             * TODO: Determine what good, if any, these class annotations are for either an IDE like WebStorm or a tool like
             * the Closure Compiler.  More importantly, what good do they do at runtime?  Is it better to simply ensure that all
             * object properties are explicitly initialized in the constructor, and document them there instead?
             */
            
            /**
             * X86Seg(cpu, sName)
             *
             * @constructor
             * @param {X86CPU} cpu
             * @param {number} id
             * @param {string} [sName] segment register name
             * @param {boolean} [fProt] true if segment register used exclusively in protected-mode (eg, segLDT)
             */
            function X86Seg(cpu, id, sName, fProt)
            {
                this.cpu = cpu;
                this.dbg = cpu.dbg;
                this.id = id;
                this.sName = sName || "";
                this.sel = 0;
                this.limit = 0xffff;
                this.offMax = this.limit + 1;
                this.base = 0;
                this.acc = this.type = 0;
                this.ext = 0;
                this.cpl = this.dpl = 0;
                this.addrDesc = X86.ADDR_INVALID;
                this.dataSize = this.addrSize = 2;
                this.dataMask = this.addrMask = 0xffff;
                /*
                 * The following properties are used for CODE segments only (ie, segCS); if the process of loading
                 * CS also requires a stack switch, then fStackSwitch will be set to true; additionally, if the stack
                 * switch was the result of a CALL (ie, fCall is true) and one or more (up to 32) parameters are on
                 * the old stack, they will be copied to awParms, and then once the stack is switched, the parameters
                 * will be pushed from awParms onto the new stack.
                 *
                 * The typical ways of loading a new segment into CS are JMPF, CALLF (or INT), and RETF (or IRET);
                 * prior to calling segCS.load(), each of those operations must first set segCS.fCall to one of null,
                 * true, or false, respectively.
                 *
                 * It's critical that fCall be properly set prior to calling segCS.load(); fCall === null means NO
                 * privilege level transition may occur, fCall === true allows a stack switch and a privilege transition
                 * to a numerically lower privilege, and fCall === false allows a stack restore and a privilege transition
                 * to a numerically greater privilege.
                 *
                 * As long as setCSIP() or fnINT() are used for all CS changes, fCall is set automatically.
                 *
                 * TODO: Consider making fCall a parameter to load(), instead of a property that must be set prior to
                 * calling load(); the downside is that such a parameter is meaningless for segments other than segCS.
                 */
                this.awParms = (this.id == X86Seg.ID.CODE? new Array(32) : []);
                this.fCall = null;
                this.fStackSwitch = false;
                this.updateMode(true, fProt);
            }
            
            X86Seg.ID = {
                NULL:   0,          // "NULL"
                CODE:   1,          // "CS"
                DATA:   2,          // "DS", "ES", "FS", "GS"
                STACK:  3,          // "SS"
                TSS:    4,          // "TSS"
                LDT:    5,          // "LDT"
                OTHER:  6,          // "VER"
                DEBUG:  7           // "DBG"
            };
            
            /**
             * loadReal(sel, fSuppress)
             *
             * The default segment load() function for real-mode.
             *
             * @this {X86Seg}
             * @param {number} sel
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} base address of selected segment, or ADDR_INVALID if error (TODO: No error conditions yet)
             */
            X86Seg.prototype.loadReal = function loadReal(sel, fSuppress)
            {
                this.sel = sel & 0xffff;
                /*
                 * Loading a new value into a segment register in real-mode alters ONLY the selector and the base;
                 * all other attributes (eg, limit, operand size, address size, etc) are unchanged.  If you run any
                 * code that switches to protected-mode, loads a 32-bit code segment, and then switches back to
                 * real-mode, it is THAT code's responsibility to load a 16-bit segment into CS before returning to
                 * real-mode; otherwise, your machine will probably be toast.
                 */
                return this.base = this.sel << 4;
            };
            
            /**
             * loadProt(sel, fSuppress)
             *
             * This replaces the segment's default load() function whenever the segment is notified via updateMode() by the
             * CPU's setProtMode() that the processor is now in protected-mode.
             *
             * Segments in protected-mode are referenced by selectors, which are indexes into descriptor tables (GDT or LDT)
             * whose descriptors are 4-word (8-byte) entries:
             *
             *      word 0: segment limit (0-15)
             *      word 1: base address low
             *      word 2: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
             *      word 3: used only on 80386 and up (should be set to zero for upward compatibility)
             *
             * See X86.DESC for offset and bit definitions.
             *
             * IDT descriptor entries are handled separately by loadIDT(), which is mapped to loadIDTReal() or loadIDTProt().
             *
             * @this {X86Seg}
             * @param {number} sel
             * @param {boolean} [fSuppress] is true to suppress any errors, cycle assessment, etc
             * @return {number} base address of selected segment, or ADDR_INVALID if error
             */
            X86Seg.prototype.loadProt = function loadProt(sel, fSuppress)
            {
                var addrDT;
                var addrDTLimit;
                var cpu = this.cpu;
            
                /*
                 * Some instructions (eg, CALLF) load a 32-bit value for the selector, while others (eg, LDS) do not;
                 * however, in ALL cases, only the low 16 bits are significant.
                 */
                sel &= 0xffff;
            
                if (!(sel & X86.SEL.LDT)) {
                    addrDT = cpu.addrGDT;
                    addrDTLimit = cpu.addrGDTLimit;
                } else {
                    addrDT = cpu.segLDT.base;
                    addrDTLimit = (addrDT + cpu.segLDT.limit)|0;
                }
                /*
                 * The ROM BIOS POST executes some test code in protected-mode without properly initializing the LDT,
                 * which has no bearing on the ROM's own code, because it never loads any LDT selectors, but if at the same
                 * time our Debugger attempts to validate a selector in one of its breakpoints, that could cause some
                 * grief here.  We avoid that grief by 1) relying on the Debugger setting fSuppress to true, and 2) skipping
                 * segment lookup if the descriptor table being referenced is zero.  Both tests are required, because
                 * there's nothing in the design of the CPU that prevents the GDT or LDT being at linear address zero.
                 */
                if (!fSuppress || addrDT) {
                    var addrDesc = (addrDT + (sel & X86.SEL.MASK))|0;
                    if ((addrDTLimit - addrDesc)|0 >= 7) {
                        /*
                         * TODO: This is the first of many steps toward accurately counting cycles in protected mode;
                         * I simply noted that "POP segreg" takes 5 cycles in real mode and 20 in protected mode, so I'm
                         * starting with a 15-cycle difference.  Obviously the difference will vary with the instruction,
                         * and will be much greater whenever the load fails.
                         */
                        if (!fSuppress) cpu.nStepCycles -= 15;
                        return this.loadDesc8(addrDesc, sel, fSuppress);
                    }
                    if (!fSuppress) {
                        X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel);
                    }
                }
                return X86.ADDR_INVALID;
            };
            
            /**
             * loadIDTReal(nIDT)
             *
             * @this {X86Seg}
             * @param {number} nIDT
             * @return {number} address from selected vector, or ADDR_INVALID if error (TODO: No error conditions yet)
             */
            X86Seg.prototype.loadIDTReal = function loadIDTReal(nIDT)
            {
                var cpu = this.cpu;
                /*
                 * NOTE: The Compaq DeskPro 386 ROM loads the IDTR for the real-mode IDT with a limit of 0xffff instead
                 * of the normal 0x3ff.  A limit higher than 0x3ff is OK, since all real-mode IDT entries are 4 bytes, and
                 * there's no way to issue an interrupt with a vector > 0xff.  Just something to be aware of.
                 */
                cpu.assert(nIDT >= 0 && nIDT < 256 && !cpu.addrIDT && cpu.addrIDTLimit >= 0x3ff);
                /*
                 * Intel documentation for INT/INTO under "REAL ADDRESS MODE EXCEPTIONS" says:
                 *
                 *      "[T]he 80286 will shut down if the SP = 1, 3, or 5 before executing the INT or INTO instruction--due to lack of stack space"
                 *
                 * TODO: Verify that 80286 real-mode actually enforces the above.  See http://localhost:8088/pubs/pc/reference/intel/80286/progref/#page-260
                 */
                var addrIDT = cpu.addrIDT + (nIDT << 2);
                var off = cpu.getShort(addrIDT);
                cpu.regPS &= ~(X86.PS.TF | X86.PS.IF);
                return (this.load(cpu.getShort(addrIDT + 2)) + off)|0;
            };
            
            /**
             * loadIDTProt(nIDT)
             *
             * @this {X86Seg}
             * @param {number} nIDT
             * @return {number} address from selected vector, or ADDR_INVALID if error (TODO: No error conditions yet)
             */
            X86Seg.prototype.loadIDTProt = function loadIDTProt(nIDT)
            {
                var cpu = this.cpu;
                cpu.assert(nIDT >= 0 && nIDT < 256);
            
                nIDT <<= 3;
                var addrDesc = (cpu.addrIDT + nIDT)|0;
                if (((cpu.addrIDTLimit - addrDesc)|0) >= 7) {
                    return this.loadDesc8(addrDesc, nIDT) + cpu.regEIP;
                }
                X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, nIDT | X86.ERRCODE.IDT | X86.ERRCODE.EXT, true);
                return X86.ADDR_INVALID;
            };
            
            /**
             * checkReadReal(off, cb, fSuppress)
             *
             * TODO: Invoke X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT) if off+cb is beyond offMax on 80186 and up;
             * also, determine whether fnFault() call should include an error code, since this is happening in real-mode.
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, or ADDR_INVALID if error (TODO: No error conditions yet)
             */
            X86Seg.prototype.checkReadReal = function checkReadReal(off, cb, fSuppress)
            {
                return (this.base + off)|0;
            };
            
            /**
             * checkWriteReal(off, cb, fSuppress)
             *
             * TODO: Invoke X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT) if off+cb is beyond offMax on 80186 and up;
             * also, determine whether fnFault() call should include an error code, since this is happening in real-mode.
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, or ADDR_INVALID if error (TODO: No error conditions yet)
             */
            X86Seg.prototype.checkWriteReal = function checkWriteReal(off, cb, fSuppress)
            {
                return (this.base + off)|0;
            };
            
            /**
             * checkReadProt(off, cb, fSuppress)
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, or ADDR_INVALID if not
             */
            X86Seg.prototype.checkReadProt = function checkReadProt(off, cb, fSuppress)
            {
                /*
                 * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                 * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                 */
                if ((off >>> 0) + cb <= this.offMax) {
                    return (this.base + off)|0;
                }
                return this.checkReadProtDisallowed(off, cb, fSuppress);
            };
            
            /**
             * checkReadProtDown(off, cb, fSuppress)
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, ADDR_INVALID if not
             */
            X86Seg.prototype.checkReadProtDown = function checkReadProtDown(off, cb, fSuppress)
            {
                /*
                 * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                 * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                 */
                if ((off >>> 0) + cb > this.offMax) {
                    return (this.base + off)|0;
                }
                return this.checkReadProtDisallowed(off, cb, fSuppress);
            };
            
            /**
             * checkReadProtDisallowed(off, cb, fSuppress)
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, ADDR_INVALID if not
             */
            X86Seg.prototype.checkReadProtDisallowed = function checkReadProtDisallowed(off, cb, fSuppress)
            {
                if (!fSuppress) {
                    X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT, 0);
                }
                return X86.ADDR_INVALID;
            };
            
            /**
             * checkWriteProt(off, cb, fSuppress)
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, ADDR_INVALID if not
             */
            X86Seg.prototype.checkWriteProt = function checkWriteProt(off, cb, fSuppress)
            {
                /*
                 * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                 * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                 */
                if ((off >>> 0) + cb <= this.offMax) {
                    return (this.base + off)|0;
                }
                return this.checkWriteProtDisallowed(off, cb, fSuppress);
            };
            
            /**
             * checkWriteProtDown(off, cb, fSuppress)
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, ADDR_INVALID if not
             */
            X86Seg.prototype.checkWriteProtDown = function checkWriteProtDown(off, cb, fSuppress)
            {
                /*
                 * Since off could be a 32-bit value with the sign bit (bit 31) set, we must convert
                 * it to an unsigned value using ">>>"; offMax was already converted at segment load time.
                 */
                if ((off >>> 0) + cb > this.offMax) {
                    return (this.base + off)|0;
                }
                return this.checkWriteProtDisallowed(off, cb, fSuppress);
            };
            
            /**
             * checkWriteProtDisallowed(off, cb, fSuppress)
             *
             * @this {X86Seg}
             * @param {number} off is a segment-relative offset
             * @param {number} cb is number of bytes to check (1, 2 or 4)
             * @param {boolean} [fSuppress] is true to suppress any errors
             * @return {number} corresponding linear address if valid, ADDR_INVALID if not
             */
            X86Seg.prototype.checkWriteProtDisallowed = function checkWriteProtDisallowed(off, cb, fSuppress)
            {
                if (!fSuppress) {
                    X86.fnFault.call(this.cpu, X86.EXCEPTION.GP_FAULT, 0);
                }
                return X86.ADDR_INVALID;
            };
            
            /**
             * loadAcc(sel, fGDT)
             *
             * @this {X86Seg}
             * @param {number} sel (protected-mode only)
             * @param {boolean} [fGDT] is true if sel must be in the GDT
             * @return {number} acc field from descriptor, or X86.DESC.ACC.INVALID if error
             */
            X86Seg.prototype.loadAcc = function(sel, fGDT)
            {
                var addrDT;
                var addrDTLimit;
                var cpu = this.cpu;
            
                if (!(sel & X86.SEL.LDT)) {
                    addrDT = cpu.addrGDT;
                    addrDTLimit = cpu.addrGDTLimit;
                } else if (!fGDT) {
                    addrDT = cpu.segLDT.base;
                    addrDTLimit = (addrDT + cpu.segLDT.limit)|0;
                }
                if (addrDT !== undefined) {
                    var addrDesc = (addrDT + (sel & X86.SEL.MASK))|0;
                    if (((addrDTLimit - addrDesc)|0) >= 7) {
                        return cpu.getShort(addrDesc + X86.DESC.ACC.OFFSET);
                    }
                }
                X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel);
                return X86.DESC.ACC.INVALID;
            };
            
            /**
             * loadDesc6(addrDesc, sel)
             *
             * Used to load a protected-mode selector that refers to a 6-byte "descriptor cache" (aka LOADALL) entry:
             *
             *      word 0: base address low
             *      word 1: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
             *      word 2: segment limit (0-15)
             *
             * @this {X86Seg}
             * @param {number} addrDesc is the descriptor address
             * @param {number} sel is the associated selector
             * @return {number} base address of selected segment
             */
            X86Seg.prototype.loadDesc6 = function(addrDesc, sel)
            {
                var cpu = this.cpu;
                var acc = cpu.getShort(addrDesc + 2);
                var base = cpu.getShort(addrDesc) | ((acc & 0xff) << 16);
                var limit = cpu.getShort(addrDesc + 4);
            
                this.sel = sel;
                this.base = base;
                this.limit = limit;
                this.offMax = (limit >>> 0) + 1;
                this.acc = acc;
                this.type = (acc & X86.DESC.ACC.TYPE.MASK);
                this.ext = 0;
                this.addrDesc = addrDesc;
                this.updateMode(true);
            
                this.messageSeg(sel, base, limit, this.type);
            
                return base;
            };
            
            /**
             * loadDesc8(addrDesc, sel, fSuppress)
             *
             * Used to load a protected-mode selector that refers to an 8-byte "descriptor table" (GDT, LDT, IDT) entry:
             *
             *      word 0: segment limit (0-15)
             *      word 1: base address low
             *      word 2: base address high (0-7), segment type (8-11), descriptor type (12), DPL (13-14), present bit (15)
             *      word 3: used only on 80386 and up (should be set to zero for upward compatibility)
             *
             * See X86.DESC for offset and bit definitions.
             *
             * @this {X86Seg}
             * @param {number} addrDesc is the descriptor address
             * @param {number} sel is the associated selector, or nIDT*8 if IDT descriptor
             * @param {boolean} [fSuppress] is true to suppress any errors, cycle assessment, etc
             * @return {number} base address of selected segment, or ADDR_INVALID if error
             */
            X86Seg.prototype.loadDesc8 = function(addrDesc, sel, fSuppress)
            {
                var cpu = this.cpu;
                var limit = cpu.getShort(addrDesc + X86.DESC.LIMIT.OFFSET);
                var acc = cpu.getShort(addrDesc + X86.DESC.ACC.OFFSET);
                var type = (acc & X86.DESC.ACC.TYPE.MASK);
                var base = cpu.getShort(addrDesc + X86.DESC.BASE.OFFSET) | ((acc & X86.DESC.ACC.BASE1623) << 16);
                var ext = cpu.getShort(addrDesc + X86.DESC.EXT.OFFSET);
                var selMasked = sel & X86.SEL.MASK;
            
                if (I386 && cpu.model >= X86.MODEL_80386) {
                    base |= (ext & X86.DESC.EXT.BASE2431) << 16;
                    limit |= (ext & X86.DESC.EXT.LIMIT1619) << 16;
                    if (ext & X86.DESC.EXT.LIMITPAGES) limit = (limit << 12) | 0xfff;
                }
            
                while (true) {
            
                    var selCode, cplPrev, addrTSS, offSP, offSS, regSPPrev, regSSPrev;
            
                    /*
                     * TODO: Consider moving the following chunks of code into worker functions for each X86Seg.ID;
                     * however, it's not clear that these tests are more costly than making additional function calls.
                     */
                    if (this.id == X86Seg.ID.CODE) {
                        this.fStackSwitch = false;
                        var fCall = this.fCall;
                        var fGate, regPSMask, nFaultError, regSP;
                        var rpl = sel & X86.SEL.RPL;
                        var dpl = (acc & X86.DESC.ACC.DPL.MASK) >> X86.DESC.ACC.DPL.SHIFT;
            
                        if (selMasked && !(acc & X86.DESC.ACC.PRESENT)) {
                            if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.NP_FAULT, sel);
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
            
                        /*
                         * Since we are X86Seg.ID.CODE, we can use this.cpl instead of the more generic cpu.segCS.cpl
                         */
                        if (type >= X86.DESC.ACC.TYPE.CODE_EXECONLY) {
                            rpl = sel & X86.SEL.RPL;
                            if (rpl > this.cpl) {
                                /*
                                 * If fCall is false, then we must have a RETF to a less privileged segment, which is OK.
                                 *
                                 * Otherwise, we must be dealing with a CALLF or JMPF to a less privileged segment, in which
                                 * case either DPL == CPL *or* the new segment is conforming and DPL <= CPL.
                                 */
                                if (fCall !== false && !(dpl == this.cpl || (type & X86.DESC.ACC.TYPE.CONFORMING) && dpl <= this.cpl)) {
                                    base = addrDesc = X86.ADDR_INVALID;
                                    break;
                                }
                                regSP = cpu.popWord();
                                cpu.setSS(cpu.popWord(), true);
                                cpu.setSP(regSP);
                                this.fStackSwitch = true;
                            }
                            fGate = false;
                        }
                        else if (type == X86.DESC.ACC.TYPE.TSS) {
                            if (!this.switchTSS(sel, fCall)) {
                                base = addrDesc = X86.ADDR_INVALID;
                                break;
                            }
                            return this.base;
                        }
                        else if (type == X86.DESC.ACC.TYPE.GATE_CALL) {
                            fGate = true;
                            regPSMask = ~0;
                            nFaultError = sel;
                            if (rpl < this.cpl) rpl = this.cpl;     // set RPL to max(RPL,CPL) for call gates
                        }
                        else if (type == X86.DESC.ACC.TYPE.GATE_INT) {
                            fGate = true;
                            regPSMask = ~(X86.PS.NT | X86.PS.TF | X86.PS.IF);
                            nFaultError = sel | X86.ERRCODE.EXT;
                            cpu.assert(!(acc & 0x1f));
                        }
                        else if (type == X86.DESC.ACC.TYPE.GATE_TRAP) {
                            fGate = true;
                            regPSMask = ~(X86.PS.NT | X86.PS.TF);
                            nFaultError = sel | X86.ERRCODE.EXT;
                            cpu.assert(!(acc & 0x1f));
                        }
                        else if (type == X86.DESC.ACC.TYPE.GATE_TASK) {
                            if (!this.switchTSS(base & 0xffff, fCall)) {
                                base = addrDesc = X86.ADDR_INVALID;
                                break;
                            }
                            return this.base;
                        }
                        if (fGate) {
                            /*
                             * Note that since GATE_INT/GATE_TRAP descriptors should appear in the IDT only, that means sel
                             * will actually be nIDT * 8, which means the rpl will always be zero; additionally, the nWords
                             * portion of acc should always be zero, but that's really dependent on the descriptor being properly
                             * set (which we assert above).
                             */
                            selCode = base & 0xffff;
                            if (rpl <= dpl) {
                                /*
                                 * TODO: Verify the PRESENT bit of the gate descriptor, and issue NP_FAULT as appropriate.
                                 */
                                cplPrev = this.cpl;
                                if (this.load(selCode, true) === X86.ADDR_INVALID) {
                                    cpu.assert(false);
                                    base = addrDesc = X86.ADDR_INVALID;
                                    break;
                                }
                                cpu.regEIP = limit;
                                if (this.cpl < cplPrev) {
                                    if (fCall !== true) {
                                        cpu.assert(false);
                                        base = addrDesc = X86.ADDR_INVALID;
                                        break;
                                    }
                                    regSP = cpu.getSP();
                                    var i = 0, nWords = (acc & 0x1f);
                                    while (nWords--) {
                                        this.awParms[i++] = cpu.getSOWord(cpu.segSS, regSP);
                                        regSP += 2;
                                    }
                                    addrTSS = cpu.segTSS.base;
                                    offSP = (this.cpl << 2) + X86.TSS.CPL0_SP;
                                    offSS = offSP + 2;
                                    regSSPrev = cpu.getSS();
                                    regSPPrev = cpu.getSP();
                                    cpu.setSS(cpu.getShort(addrTSS + offSS), true);
                                    cpu.setSP(cpu.getShort(addrTSS + offSP));
                                    cpu.pushWord(regSSPrev);
                                    cpu.pushWord(regSPPrev);
                                    while (i) cpu.pushWord(this.awParms[--i]);
                                    this.fStackSwitch = true;
                                }
                                cpu.regPS &= regPSMask;
                                return this.base;
                            }
                            cpu.assert(false);
                            if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, nFaultError, true);
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
                        else if (fGate !== false) {
                            cpu.assert(false);
                            if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, true);
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
                    }
                    else if (this.id == X86Seg.ID.DATA) {
                        if (selMasked) {
                            if (!(acc & X86.DESC.ACC.PRESENT)) {
                                if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.NP_FAULT, sel);
                                base = addrDesc = X86.ADDR_INVALID;
                                break;
                            }
                            if (type < X86.DESC.ACC.TYPE.SEG || (type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.READABLE)) == X86.DESC.ACC.TYPE.CODE) {
                                /*
                                 * OS/2 1.0 triggers this "Empty Descriptor" GP_FAULT multiple times during boot; eg:
                                 *
                                 *      Fault 0D (002F) on opcode 0x8E at 3190:3A05 (%112625)
                                 *      stopped (11315208 ops, 41813627 cycles, 498270 ms, 83918 hz)
                                 *      AX=0000 BX=0970 CX=0300 DX=0300 SP=0ABE BP=0ABA SI=0000 DI=001A
                                 *      DS=19C0[177300,2C5F] ES=001F[1743A0,07FF] SS=0038[175CE0,0B5F]
                                 *      CS=3190[10EC20,B89F] IP=3A05 V0 D0 I1 T0 S0 Z1 A0 P1 C0 PS=3246 MS=FFF3
                                 *      LD=0028[174BC0,003F] GD=[11A4E0,490F] ID=[11F61A,03FF]  TR=0010 A20=ON
                                 *      3190:3A05 8E4604        MOV      ES,[BP+04]
                                 *      0038:0ABE  002F  19C0  0000  067C - 07FC  0AD2  0010  C420   /.....|....... .
                                 *      dumpDesc(002F): %174BE8
                                 *      base=000000 limit=0000 dpl=00 type=00 (undefined)
                                 *
                                 * If we allow the GP fault to be dispatched, it recovers, so until I'm able to investigate this
                                 * further, I'm going to assume this is normal behavior.  If the segment (0x002F in the example)
                                 * simply needed to be "faulted" into memory, I would have expected OS/2 to build a descriptor
                                 * with the PRESENT bit clear, and rely on NP_FAULT rather than GP_FAULT, but maybe this was simpler.
                                 *
                                 * Anyway, because of this, if acc is zero, we won't set fHalt on this GP_FAULT.
                                 */
                                if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, !!acc);
                                base = addrDesc = X86.ADDR_INVALID;
                                break;
                            }
                        }
                    }
                    else if (this.id == X86Seg.ID.STACK) {
                        if (!(acc & X86.DESC.ACC.PRESENT)) {
                            if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.SS_FAULT, sel);
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
                        if (!selMasked || type < X86.DESC.ACC.TYPE.SEG || (type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.WRITABLE)) != X86.DESC.ACC.TYPE.WRITABLE) {
                            if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, sel, true);
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
                    }
                    else if (this.id == X86Seg.ID.TSS) {
                        if (!selMasked || type != X86.DESC.ACC.TYPE.TSS && type != X86.DESC.ACC.TYPE.TSS_BUSY) {
                            if (!fSuppress) X86.fnFault.call(cpu, X86.EXCEPTION.TS_FAULT, sel, true);
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
                    }
                    else if (this.id == X86Seg.ID.OTHER) {
                        /*
                         * For LSL, we must support any descriptor marked X86.DESC.ACC.TYPE.SEG, as well as TSS and LDT descriptors.
                         */
                        if (!(type & X86.DESC.ACC.TYPE.SEG) && type > X86.DESC.ACC.TYPE.TSS_BUSY) {
                            base = addrDesc = X86.ADDR_INVALID;
                            break;
                        }
                    }
                    this.sel = sel;
                    this.base = base;
                    this.limit = limit;
                    this.offMax = (limit >>> 0) + 1;
                    this.acc = acc;
                    this.type = type;
                    this.ext = ext;
                    this.addrDesc = addrDesc;
                    this.updateMode(true);
                    break;
                }
                if (!fSuppress) this.messageSeg(sel, base, limit, type, ext);
                return base;
            };
            
            /**
             * switchTSS(selNew, fNest)
             *
             * Implements TSS (Task State Segment) task switching.
             *
             * NOTES: This typically occurs during double-fault processing, because the IDT entry for DF_FAULT normally
             * contains a task gate.  Interestingly, if we force a GP_FAULT to occur at a sufficiently early point in the
             * OS/2 1.0 initialization code, OS/2 does a nice job of displaying the GP fault and then shutting down:
             *
             *      0090:067B FB            STI
             *      0090:067C EBFD          JMP      067B
             *
             * but it may not have yet reprogrammed the master PIC to re-vector hardware interrupts to IDT entries 0x50-0x57,
             * so when the next timer interrupt (IRQ 0) occurs, it vectors through IDT entry 0x08, which is the DF_FAULT
             * vector. A spurious double-fault is generated, and a clean shutdown turns into a messy crash.
             *
             * Of course, that all could have been avoided if IBM had heeded Intel's advice and not used Intel-reserved IDT
             * entries for PC interrupts.
             *
             * TODO: Add 80386 TSS support (including CR3 support).
             *
             * @this {X86Seg}
             * @param {number} selNew
             * @param {boolean|null} [fNest] is true if nesting, false if un-nesting, null if neither
             * @return {boolean} true if successful, false if error
             */
            X86Seg.prototype.switchTSS = function switchTSS(selNew, fNest)
            {
                var cpu = this.cpu;
                cpu.assert(this === cpu.segCS);
            
                var addrOld = cpu.segTSS.base;
                var cplOld = this.cpl;
                var selOld = cpu.segTSS.sel;
            
                if (!fNest) {
                    /*
                     * TODO: Verify that it is (always) correct to require that the BUSY bit be currently set.
                     */
                    if (cpu.segTSS.type != X86.DESC.ACC.TYPE.TSS_BUSY) {
                        X86.fnFault.call(cpu, X86.EXCEPTION.TS_FAULT, selNew, true);
                        return false;
                    }
                    cpu.setShort(cpu.segTSS.addrDesc + X86.DESC.ACC.OFFSET, (cpu.segTSS.acc & ~X86.DESC.ACC.TYPE.TSS_BUSY) | X86.DESC.ACC.TYPE.TSS);
                }
            
                if (cpu.segTSS.load(selNew) === X86.ADDR_INVALID) {
                    return false;
                }
            
                var addrNew = cpu.segTSS.base;
                if (DEBUG && DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.TSS)) {
                    this.dbg.message((fNest? "Task switch" : "Task return") + ": TR " + str.toHexWord(selOld) + " (%" + str.toHex(addrOld, 6) + "), new TR " + str.toHexWord(selNew) + " (%" + str.toHex(addrNew, 6) + ")");
                }
                if (fNest === false) {
                    if (cpu.segTSS.type != X86.DESC.ACC.TYPE.TSS_BUSY) {
                        X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, selNew, true);
                        return false;
                    }
                } else {
                    if (cpu.segTSS.type == X86.DESC.ACC.TYPE.TSS_BUSY) {
                        X86.fnFault.call(cpu, X86.EXCEPTION.GP_FAULT, selNew, true);
                        return false;
                    }
                    cpu.setShort(cpu.segTSS.addrDesc + X86.DESC.ACC.OFFSET, cpu.segTSS.acc |= X86.DESC.ACC.TYPE.TSS_BUSY);
                    cpu.segTSS.type = X86.DESC.ACC.TYPE.TSS_BUSY;
                }
            
                /*
                 * Update the old TSS
                 */
                cpu.setShort(addrOld + X86.TSS.TASK_IP, cpu.getIP());
                cpu.setShort(addrOld + X86.TSS.TASK_PS, cpu.getPS());
                cpu.setShort(addrOld + X86.TSS.TASK_AX, cpu.regEAX);
                cpu.setShort(addrOld + X86.TSS.TASK_CX, cpu.regECX);
                cpu.setShort(addrOld + X86.TSS.TASK_DX, cpu.regEDX);
                cpu.setShort(addrOld + X86.TSS.TASK_BX, cpu.regEBX);
                cpu.setShort(addrOld + X86.TSS.TASK_SP, cpu.getSP());
                cpu.setShort(addrOld + X86.TSS.TASK_BP, cpu.regEBP);
                cpu.setShort(addrOld + X86.TSS.TASK_SI, cpu.regESI);
                cpu.setShort(addrOld + X86.TSS.TASK_DI, cpu.regEDI);
                cpu.setShort(addrOld + X86.TSS.TASK_ES, cpu.segES.sel);
                cpu.setShort(addrOld + X86.TSS.TASK_CS, cpu.segCS.sel);
                cpu.setShort(addrOld + X86.TSS.TASK_SS, cpu.segSS.sel);
                cpu.setShort(addrOld + X86.TSS.TASK_DS, cpu.segDS.sel);
            
                /*
                 * Reload all registers from the new TSS; it's important to reload the LDTR sooner
                 * rather than later, so that as segment registers are reloaded, any LDT selectors will
                 * will be located in the correct table.
                 */
                cpu.segLDT.load(cpu.getShort(addrNew + X86.TSS.TASK_LDT));
                cpu.setPS(cpu.getShort(addrNew + X86.TSS.TASK_PS) | (fNest? X86.PS.NT : 0));
                cpu.assert(!fNest || !!(cpu.regPS & X86.PS.NT));
                cpu.regEAX = cpu.getShort(addrNew + X86.TSS.TASK_AX);
                cpu.regECX = cpu.getShort(addrNew + X86.TSS.TASK_CX);
                cpu.regEDX = cpu.getShort(addrNew + X86.TSS.TASK_DX);
                cpu.regEBX = cpu.getShort(addrNew + X86.TSS.TASK_BX);
                cpu.regEBP = cpu.getShort(addrNew + X86.TSS.TASK_BP);
                cpu.regESI = cpu.getShort(addrNew + X86.TSS.TASK_SI);
                cpu.regEDI = cpu.getShort(addrNew + X86.TSS.TASK_DI);
                cpu.segES.load(cpu.getShort(addrNew + X86.TSS.TASK_ES));
                cpu.segDS.load(cpu.getShort(addrNew + X86.TSS.TASK_DS));
                cpu.setCSIP(cpu.getShort(addrNew + X86.TSS.TASK_IP), cpu.getShort(addrNew + X86.TSS.TASK_CS));
            
                var offSS = X86.TSS.TASK_SS;
                var offSP = X86.TSS.TASK_SP;
                if (this.cpl < cplOld) {
                    offSP = (this.cpl << 2) + X86.TSS.CPL0_SP;
                    offSS = offSP + 2;
                }
                cpu.setSS(cpu.getShort(addrNew + offSS), true);
                cpu.setSP(cpu.getShort(addrNew + offSP));
            
                if (fNest) cpu.setShort(addrNew + X86.TSS.PREV_TSS, selOld);
            
                cpu.regCR0 |= X86.CR0.MSW.TS;
                return true;
            };
            
            /**
             * setBase(addr)
             *
             * This is used in unusual situations where the base must be set independently; normally, the base
             * is set according to the selector provided to load(), but there are a few cases where setBase()
             * is required.
             *
             * For example, in resetRegs(), the real-mode CS selector must be reset to 0xF000 for an 80286 or 80386,
             * but the CS base must be set to 0x00FF0000 or 0xFFFF0000, respectively.  To simplify life for setBase()
             * callers, we allow them to specify 32-bit bases, which we then truncate to 24 bits as needed.
             *
             * WARNING: Since the CPU must maintain regLIP as the sum of the CS base and the current IP, all calls
             * to segCS.setBase() need to go through setCSBase().
             *
             * @this {X86Seg}
             * @param {number} addr
             * @return {number} addr, truncated as needed
             */
            X86Seg.prototype.setBase = function(addr)
            {
                if (this.cpu.model < X86.MODEL_80386) addr &= 0xffffff;
                return this.base = addr;
            };
            
            /**
             * save()
             *
             * Early versions of PCjs saved only segment selectors, since that's all that mattered in real-mode;
             * newer versions need to save/restore all the "defining" properties of the X86Seg object.
             *
             * @this {X86Seg}
             * @return {Array}
             */
            X86Seg.prototype.save = function()
            {
                return [
                    this.sel,
                    this.base,
                    this.limit,
                    this.acc,
                    this.id,
                    this.sName,
                    this.cpl,
                    this.dpl,
                    this.addrDesc,
                    this.addrSize,
                    this.addrMask,
                    this.dataSize,
                    this.dataMask,
                    this.type,
                    this.offMax
                ];
            };
            
            /**
             * restore(a)
             *
             * Early versions of PCjs saved only segment selectors, since that's all that mattered in real-mode;
             * newer versions need to save/restore all the "defining" properties of the X86Seg object.
             *
             * @this {X86Seg}
             * @param {Array|number} a
             */
            X86Seg.prototype.restore = function(a)
            {
                if (typeof a == "number") {
                    this.load(a);
                } else {
                    this.sel      = a[0];
                    this.base     = a[1];
                    this.limit    = a[2];
                    this.acc      = a[3];
                    this.id       = a[4];
                    this.sName    = a[5];
                    this.cpl      = a[6];
                    this.dpl      = a[7];
                    this.addrDesc = a[8];
                    this.addrSize = a[9]  || 2;
                    this.addrMask = a[10] || 0xffff;
                    this.dataSize = a[11] || 2;
                    this.dataMask = a[12] || 0xffff;
                    this.type     = a[13] || (this.acc & X86.DESC.ACC.TYPE.MASK);
                    this.offMax   = a[14] || (this.limit >>> 0) + 1;
                }
            };
            
            /**
             * updateMode(fLoad, fProt)
             *
             * Ensures that the segment register's access (ie, load and check methods) matches the specified (or current)
             * operating mode (real or protected).
             *
             * @this {X86Seg}
             * @param {boolean} [fLoad] true if the segment was just (re)loaded, false if not
             * @param {boolean} [fProt] true for protected-mode access, false for real-mode access, undefined for current mode
             * @return {boolean}
             */
            X86Seg.prototype.updateMode = function(fLoad, fProt)
            {
                if (fProt === undefined) {
                    fProt = !!(this.cpu.regCR0 & X86.CR0.MSW.PE);
                }
            
                /*
                 * The following properties are used for STACK segments only (ie, segSS); we want to make it easier
                 * for setSS() to set stack lower and upper limits, which requires knowing whether or not the segment is
                 * marked as EXPDOWN.
                 */
                this.fExpDown = false;
            
                if (fProt) {
                    this.load = this.loadProt;
                    this.loadIDT = this.loadIDTProt;
                    this.checkRead = this.checkReadProt;
                    this.checkWrite = this.checkWriteProt;
            
                    /*
                     * TODO: For null GDT selectors, should we rely on the descriptor being invalid, or should we assume that
                     * the null descriptor might contain uninitialized (or other) data?  I'm assuming the latter, hence the
                     * following null selector test.  However, if we're not going to consult the descriptor, is there anything
                     * else we should (or should not) be doing for null GDT selectors?
                     */
                    if (!(this.sel & ~X86.SEL.RPL)) {
                        this.checkRead = this.checkReadProtDisallowed;
                        this.checkWrite = this.checkWriteProtDisallowed;
            
                    }
                    else if (this.type & X86.DESC.ACC.TYPE.SEG) {
                        /*
                         * If the READABLE bit of CODE_READABLE is not set, then disallow reads.
                         */
                        if ((this.type & X86.DESC.ACC.TYPE.CODE_READABLE) == X86.DESC.ACC.TYPE.CODE_EXECONLY) {
                            this.checkRead = this.checkReadProtDisallowed;
                        }
                        /*
                         * If the CODE bit is set, or the the WRITABLE bit is not set, then disallow writes.
                         */
                        if ((this.type & X86.DESC.ACC.TYPE.CODE) || !(this.type & X86.DESC.ACC.TYPE.WRITABLE)) {
                            this.checkWrite = this.checkWriteProtDisallowed;
                        }
                        /*
                         * If the CODE bit is not set *and* the EXPDOWN bit is set, then invert the limit check.
                         */
                        if ((this.type & (X86.DESC.ACC.TYPE.CODE | X86.DESC.ACC.TYPE.EXPDOWN)) == X86.DESC.ACC.TYPE.EXPDOWN) {
                            if (this.checkRead == this.checkReadProt) this.checkRead = this.checkReadProtDown;
                            if (this.checkWrite == this.checkWriteProt) this.checkWrite = this.checkWriteProtDown;
                            this.fExpDown = true;
                        }
                    }
                    /*
                     * TODO: For non-SEG descriptors, are there other checks or functions we should establish?
                     */
            
                    /*
                     * Any update to the following properties must occur only on segment loads, not simply when
                     * we're updating segment registers as part of a mode change.
                     */
                    if (fLoad) {
                        /*
                         * We must update the descriptor's ACCESSED bit whenever the segment is "accessed" (ie,
                         * loaded); unlike the ACCESSED and DIRTY bits in PTEs, a descriptor ACCESSED bit is only
                         * updated on loads, not on every memory access.
                         *
                         * We compute address of the descriptor byte containing the ACCESSED bit (offset 0x5);
                         * note that it's perfectly normal for addrDesc to occasionally be invalid (eg, when the CPU
                         * is creating protected-mode-only segment registers like LDT and TSS, or when the CPU has
                         * transitioned from real-mode to protected-mode and new selector(s) have not been loaded yet).
                         *
                         * TODO: Note I do NOT update the ACCESSED bit for null GDT selectors, because I assume the
                         * hardware does not update it either.  In fact, I've seen code that uses the null GDT descriptor
                         * for other purposes, on the assumption that that descriptor is completely unused.
                         */
                        if ((this.sel & ~X86.SEL.RPL) && this.addrDesc !== X86.ADDR_INVALID) {
                            var addrType = this.addrDesc + X86.DESC.ACC.TYPE.OFFSET;
                            this.cpu.setByte(addrType, this.cpu.getByte(addrType) | (X86.DESC.ACC.TYPE.ACCESSED >> 8));
                        }
                        this.cpl = this.sel & X86.SEL.RPL;
                        this.dpl = (this.acc & X86.DESC.ACC.DPL.MASK) >> X86.DESC.ACC.DPL.SHIFT;
                        if (this.cpu.model < X86.MODEL_80386 || !(this.ext & X86.DESC.EXT.BIG)) {
                            this.dataSize = 2;
                            this.dataMask = 0xffff;
                        } else {
                            this.dataSize = 4;
                            this.dataMask = (0xffffffff|0);
                        }
                        this.addrSize = this.dataSize;
                        this.addrMask = this.dataMask;
                    }
                } else {
                    this.load = this.loadReal;
                    this.loadIDT = this.loadIDTReal;
                    this.checkRead = this.checkReadReal;
                    this.checkWrite = this.checkWriteReal;
                    this.cpl = this.dpl = 0;
                    this.addrDesc = X86.ADDR_INVALID;
                }
                return fProt;
            };
            
            /**
             * messageSeg(sel, base, limit, type, ext)
             *
             * @this {X86Seg}
             * @param {number} sel
             * @param {number} base
             * @param {number} limit
             * @param {number} type
             * @param {number} [ext]
             */
            X86Seg.prototype.messageSeg = function(sel, base, limit, type, ext)
            {
                if (DEBUG) {
                    if (DEBUGGER && this.dbg && this.dbg.messageEnabled(Messages.SEG)) {
                        var ch = (this.sName.length < 3? " " : "");
                        var sDPL = " dpl=" + this.dpl;
                        if (this.id == X86Seg.ID.CODE) sDPL += " cpl=" + this.cpl;
                        this.dbg.message("loadSeg(" + this.sName + "):" + ch + "sel=" + str.toHexWord(sel) + " base=" + str.toHex(base) + " limit=" + str.toHexWord(limit) + " type=" + str.toHexWord(type) + sDPL, true);
                    }
                    this.cpu.assert(/* base !== X86.ADDR_INVALID && */ (this.cpu.model >= X86.MODEL_80386 || !ext || ext == X86.DESC.EXT.AVAIL));
                }
            };
            
            if (typeof module !== 'undefined') module.exports = X86Seg;
            
      • shared
        • lib
          • README.md
            Shared Sources
            ===
            
            This folder contains a mix of shared code, with some files used only by Node (server) modules,
            some used only by Browser (client) modules, and others used by both.
            
            At the moment, only a few files are completely agnostic; eg: [strlib.js](strlib.js) and [usrlib.js](usrlib.js).
            One give-away is that neither contain references to any globals (although references to each other
            would be fine).
            
            [netlib.js](netlib.js) is appropriate only for Node modules, because it contains code that relies on Node's
            global *Buffer* object, as indicated by:
            
            	/* global Buffer: false */
            
            And [weblib.js](weblib.js) is appropriate only for client modules, because it contains code that relies on the
            browser's global *window* object, as indicated by:
            
            	/* global window: true */
            
            We declare *window* modifiable (true) so that [defines.js](defines.js) can set *global.window* to *false*
            when running within Node, allowing any other code to test the existence of *window* with a simple:
            
            	if (window) {...}
            	
            instead of:
            
            	if (typeof window !== "undefined") {...}
            
          • component.js
            /**
             * @fileoverview The Component class used by C1Pjs and PCjs.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-May-14
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            /*
             * All the C1Pjs and PCjs components now use JSDoc types, primarily so that Google's Closure Compiler
             * will compile everything with ZERO warnings.  For more information about the JSDoc types supported by
             * the Closure Compiler:
             *
             *      https://developers.google.com/closure/compiler/docs/js-for-compiler#types
             *
             * I also attempted to use JSLint, but it's excessively strict for my taste, so this is the only file
             * I tried massaging for JSLint's sake.  I gave up when it complained about my use of "while (true)";
             * replacing "true" with an assignment expression didn't make it any happier.
             *
             * I wasn't thrilled about replacing all "++" and "--" operators with "+= 1" and "-= 1", nor about using
             * "(s || '')" instead of "(s? s : '')", because while the former may seem simpler, it is NOT more portable.
             * It's not that I'm trying to write "portable JavaScript", but some of this code was ported from C code I'd
             * written about 14 years earlier, and portability is good, so I'm not going to rewrite if there's no need.
             *
             * UPDATE: I've since switched to JSHint, which seems to have more reasonable defaults.
             */
            
            "use strict";
            
            /* global window: true, DEBUG: true */
            
            if (typeof module !== 'undefined') {
                require("./defines");
                var usr = require("./usrlib");
                var web = require("./weblib");
            }
            
            /**
             * Component(type, parms, constructor, bitsMessage)
             *
             * A Component object requires:
             *
             *      type: a user-defined type name (eg, "CPU")
             *
             * and accepts any or all of the following (parms) properties:
             *
             *      id: component ID (default is "")
             *      name: component name (default is ""; if blank, toString() will use the type name only)
             *      comment: component comment string (default is undefined)
             *
             * Subclasses that use Component.subclass() to extend Component will likely have additional (parms) properties.
             *
             * @constructor
             * @param {string} type
             * @param {Object} [parms]
             * @param {Object} [constructor]
             * @param {number} [bitsMessage]
             */
            function Component(type, parms, constructor, bitsMessage)
            {
                this.type = type;
            
                if (!parms) parms = {'id': "", 'name': ""};
            
                this.id = parms['id'];
                this.name = parms['name'];
                this.comment = parms['comment'];
                this.parms = parms;
                if (this.id === undefined) this.id = "";
            
                var i = this.id.indexOf('.');
                if (i > 0) {
                    this.idMachine = this.id.substr(0, i);
                    this.idComponent = this.id.substr(i + 1);
                } else {
                    this.idComponent = this.id;
                }
            
                /*
                 * Recording the constructor is really just a debugging aid, because many of our constructors
                 * have class constants, but they're hard to find when the constructors are buried among all the
                 * other globals.
                 */
                this[type] = constructor;
            
                /*
                 * Gather all the various component flags (booleans) into a single "flags" object, and encourage
                 * subclasses to do the same, to reduce the property clutter we have to wade through while debugging.
                 */
                this.aFlags = {
                    fReady: false,
                    fBusy: false,
                    fBusyCancel: false,
                    fPowered: false,
                    fError: false
                };
            
                this.fnReady = null;
                this.clearError();
                this.bindings = {};
                this.dbg = null;                    // by default, no connection to a Debugger
                this.bitsMessage = bitsMessage || -1;
            
                Component.add(this);
            }
            
            /**
             * Component.parmsURL
             *
             * Initialized to the set of URL parameters, if any, for the current web page.
             *
             * @type {Object|null}
             */
            Component.parmsURL = web.getURLParameters();
            
            /**
             * Component.inherit(p)
             *
             * Returns a newly created object that inherits properties from the prototype object p.
             * It uses the ECMAScript 5 function Object.create() if it is defined, and otherwise falls back to an older technique.
             *
             * See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 6-1)
             *
             * @param {Object} p
             */
            Component.inherit = function(p)
            {
                if (window) {
                    if (!p) throw new TypeError();
                    if (Object.create) {
                        return Object.create(p);
                    }
                    var t = typeof p;
                    if (t !== "object" && t !== "function") throw new TypeError();
                }
                /**
                 * @constructor
                 */
                function F() {}
                F.prototype = p;
                return new F();
            };
            
            /**
             * Component.extend(o, p)
             *
             * Copies the enumerable properties of p to o and returns o.
             * If o and p have a property by the same name, o's property is overwritten.
             *
             * See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 6-2)
             *
             * @param {Object} o
             * @param {Object} p
             */
            Component.extend = function(o, p)
            {
                for (var prop in p) {
                    o[prop] = p[prop];
                }
                return o;
            };
            
            /**
             * Component.subclass(subclass, superclass, methods, statics)
             *
             * See: Flanagan, David (2011-04-18). JavaScript: The Definitive Guide: The Definitive Guide (Kindle Locations 9854-9903). OReilly Media - A. Kindle Edition (Example 9-11)
             *
             * @param {Object} subclass is the constructor for the new subclass
             * @param {Object} [superclass] is the constructor of the superclass (default is Component)
             * @param {Object} [methods] contains all instance methods
             * @param {Object} [statics] contains all class properties and methods
             */
            Component.subclass = function(subclass, superclass, methods, statics)
            {
                if (!superclass) superclass = Component;
                subclass.prototype = Component.inherit(superclass.prototype);
                subclass.prototype.constructor = subclass;
                subclass.prototype.parent = superclass.prototype;
                if (methods) {
                    Component.extend(subclass.prototype, methods);
                }
                if (statics) {
                    Component.extend(subclass, statics);
                }
                return subclass;
            };
            
            /*
             * Every component created on the current page is recorded in this array (see Component.add()).
             *
             * This enables any component to locate another component by ID (see Component.getComponentByID())
             * or by type (see Component.getComponentByType()).
             */
            Component.all = [];
            
            /**
             * Component.add(component)
             *
             * @param {Component} component
             */
            Component.add = function(component)
            {
                /*
                 * This just generates a lot of useless noise, handy in the early days, not so much these days...
                 *
                 *      if (DEBUG) Component.log("Component.add(" + component.type + "," + component.id + ")");
                 */
                Component.all[Component.all.length] = component;
            };
            
            /**
             * Component.log(s, type)
             *
             * For diagnostic output only.
             *
             * @param {string} [s] is the message text
             * @param {string} [type] is the message type
             */
            Component.log = function(s, type)
            {
                if (DEBUG) {
                    if (s) {
                        var msElapsed, sMsg = (type? (type + ": ") : "") + s;
                        if (Component.msStart === undefined) {
                            Component.msStart = usr.getTime();
                        }
                        msElapsed = usr.getTime() - Component.msStart;
                        if (window && window.console) console.log(msElapsed + "ms: " + sMsg.replace(/\n/g, " "));
                    }
                }
            };
            
            /**
             * Component.assert(f, s)
             *
             * Verifies conditions that must be true (for DEBUG builds only).
             *
             * The Closure Compiler should automatically remove all references to Component.assert() in non-DEBUG builds.
             *
             * TODO: Add a task to the build process that "asserts" there are no instances of "assertion failure" in RELEASE builds.
             *
             * @param {boolean} f is the expression we are asserting to be true
             * @param {string} [s] is description of the assertion on failure
             */
            Component.assert = function(f, s)
            {
                if (DEBUG) {
                    if (!f) {
                        if (!s) s = "assertion failure";
                        Component.log(s);
                        throw new Error(s);
                    }
                }
            };
            
            /**
             * Component.println(s, type, id)
             *
             * For non-diagnostic messages, which components may override to control the destination/appearance of their output.
             *
             * Components that inherit from this class should use the instance method, this.println(), rather than Component.println(),
             * because if a Control Panel is loaded, it will override only the instance method, not the class method (overriding the class
             * method would improperly affect any other machines loaded on the same page).
             *
             * @param {string} [s] is the message text
             * @param {string} [type] is the message type
             * @param {string} [id] is the caller's ID, if any
             */
            Component.println = function(s, type, id)
            {
                if (DEBUG) {
                    Component.log((id? (id + ": ") : "") + (s? ("\"" + s + "\"") : ""), type);
                }
            };
            
            /**
             * Component.notice(s, fPrintOnly, id)
             *
             * notice() is like println() but implies a need for user notification, so we alert() as well.
             *
             * @param {string} s is the message text
             * @param {boolean} [fPrintOnly]
             * @param {string} [id] is the caller's ID, if any
             */
            Component.notice = function(s, fPrintOnly, id)
            {
                if (DEBUG) {
                    Component.println(s, "notice", id);
                }
                if (!fPrintOnly) web.alertUser(s);
            };
            
            /**
             * Component.warning(s)
             *
             * @param {string} s describes the warning
             */
            Component.warning = function(s)
            {
                if (DEBUG) {
                    Component.println(s, "warning");
                }
                web.alertUser(s);
            };
            
            /**
             * Component.error(s)
             *
             * @param {string} s describes the error; an alert() is displayed as well
             */
            Component.error = function(s)
            {
                if (DEBUG) {
                    Component.println(s, "error");
                }
                web.alertUser(s);
            };
            
            /**
             * Component.getComponents(idRelated)
             *
             * We could store components as properties of an 'all' object, using the component's ID,
             * and change this linear lookup into a property lookup, but some components may have no ID.
             *
             * @param {string} [idRelated] of related component
             * @return {Array} of components
             */
            Component.getComponents = function(idRelated)
            {
                var i;
                var aComponents = [];
                /*
                 * getComponentByID(id, idRelated)
                 *
                 * If idRelated is provided, we check it for a machine prefix, and use any
                 * existing prefix to constrain matches to IDs with the same prefix, in order to
                 * avoid matching components belonging to other machines.
                 */
                if (idRelated) {
                    if ((i = idRelated.indexOf('.')) > 0)
                        idRelated = idRelated.substr(0, i + 1);
                    else
                        idRelated = "";
                }
                for (i = 0; i < Component.all.length; i++) {
                    var component = Component.all[i];
                    if (!idRelated || !component.id.indexOf(idRelated)) {
                        aComponents.push(component);
                    }
                }
                return aComponents;
            };
            
            /**
             * Component.getComponentByID(id, idRelated)
             *
             * We could store components as properties of an 'all' object, using the component's ID,
             * and change this linear lookup into a property lookup, but some components may have no ID.
             *
             * @param {string} id of the desired component
             * @param {string} [idRelated] of related component
             * @return {Component|null}
             */
            Component.getComponentByID = function(id, idRelated)
            {
                if (id !== undefined) {
                    var i;
                    /*
                     * If idRelated is provided, we check it for a machine prefix, and use any
                     * existing prefix to constrain matches to IDs with the same prefix, in order to
                     * avoid matching components belonging to other machines.
                     */
                    if (idRelated && (i = idRelated.indexOf('.')) > 0) {
                        id = idRelated.substr(0, i + 1) + id;
                    }
                    for (i = 0; i < Component.all.length; i++) {
                        if (Component.all[i].id === id) {
                            return Component.all[i];
                        }
                    }
                    Component.log("Component ID '" + id + "' not found", "warning");
                }
                return null;
            };
            
            /**
             * Component.getComponentByType(sType, idRelated, componentPrev)
             *
             * @param {string} sType of the desired component
             * @param {string} [idRelated] of related component
             * @param {Component|null} [componentPrev] of previously returned component, if any
             * @return {Component|null}
             */
            Component.getComponentByType = function(sType, idRelated, componentPrev)
            {
                if (sType !== undefined) {
                    var i;
                    /*
                     * If idRelated is provided, we check it for a machine prefix, and use any
                     * existing prefix to constrain matches to IDs with the same prefix, in order to
                     * avoid matching components belonging to other machines.
                     */
                    if (idRelated) {
                        if ((i = idRelated.indexOf('.')) > 0) {
                            idRelated = idRelated.substr(0, i + 1);
                        } else {
                            idRelated = "";
                        }
                    }
                    for (i = 0; i < Component.all.length; i++) {
                        if (componentPrev) {
                            if (componentPrev == Component.all[i]) componentPrev = null;
                            continue;
                        }
                        if (sType == Component.all[i].type && (!idRelated || !Component.all[i].id.indexOf(idRelated))) {
                            return Component.all[i];
                        }
                    }
                    Component.log("Component type '" + sType + "' not found", "warning");
                }
                return null;
            };
            
            /**
             * Component.getComponentParms(element)
             *
             * @param {Object} element from the DOM
             */
            Component.getComponentParms = function(element)
            {
                var parms = null,
                    sParms = element.getAttribute("data-value");
                if (sParms) {
                    try {
                        parms = eval("({" + sParms + "})"); // jshint ignore:line
                        /*
                         * We can no longer invoke removeAttribute() because some components (eg, Panel) need
                         * to run their initXXX() code more than once, to avoid initialization-order dependencies.
                         *
                         *      if (!DEBUG) {
                         *          element.removeAttribute("data-value");
                         *      }
                         */
                    } catch(e) {
                        Component.error(e.message + " (" + sParms + ")");
                    }
                }
                return parms;
            };
            
            /**
             * Component.bindExternalControl(component, sControl, sBinding, sType)
             *
             * @param {Component} component
             * @param {string} sControl
             * @param {string} sBinding
             * @param {string} [sType] is the external component type
             */
            Component.bindExternalControl = function(component, sControl, sBinding, sType)
            {
                if (sControl) {
                    if (sType === undefined) sType = "Panel";
                    var target = Component.getComponentByType(sType, component.id);
                    if (target) {
                        var eBinding = target.bindings[sControl];
                        if (eBinding) {
                            component.setBinding(null, sBinding, eBinding);
                        }
                    }
                }
            };
            
            if (window && !window.document.ELEMENT_NODE) window.document.ELEMENT_NODE = 1;
            
            /**
             * Component.bindComponentControls(component, element, sAppClass)
             *
             * @param {Component} component
             * @param {Object} element from the DOM
             * @param {string} sAppClass
             */
            Component.bindComponentControls = function(component, element, sAppClass)
            {
                var aeControls = Component.getElementsByClass(element.parentNode, sAppClass + "-control");
            
                for (var iControl = 0; iControl < aeControls.length; iControl++) {
            
                    var aeChildNodes = aeControls[iControl].childNodes;
            
                    for (var iNode = 0; iNode < aeChildNodes.length; iNode++) {
                        var control = aeChildNodes[iNode];
                        if (control.nodeType !== window.document.ELEMENT_NODE) {
                            continue;
                        }
                        var sClass = control.getAttribute("class");
                        if (!sClass) continue;
                        var aClasses = sClass.split(" ");
                        for (var iClass = 0; iClass < aClasses.length; iClass++) {
                            var parms;
                            sClass = aClasses[iClass];
                            switch (sClass) {
                                case sAppClass + "-binding":
                                    parms = Component.getComponentParms(control);
                                    if (parms && parms['binding']) {
                                        component.setBinding(parms['type'], parms['binding'], control);
                                    } else {
                                        Component.log("Component '" + component.toString() + "' missing binding" + (parms? " for " + parms['type'] : ""), "warning");
                                    }
                                    iClass = aClasses.length;
                                    break;
                                default:
                                    // if (DEBUG) Component.log("Component.bindComponentControls(" + component.toString() + "): unrecognized control class \"" + sClass + "\"", "warning");
                                    break;
                            }
                        }
                    }
                }
            };
            
            /**
             * Component.getElementsByClass(element, sClass, sObjClass)
             *
             * This is a cross-browser helper function, since not all browser's support getElementsByClassName()
             *
             * TODO: This should probably be moved into weblib.js at some point, along with the control binding functions above,
             * to keep all the browser-related code together.
             *
             * @param {Object} element from the DOM
             * @param {string} sClass
             * @param {string} [sObjClass]
             * @return {Array|NodeList}
             */
            Component.getElementsByClass = function(element, sClass, sObjClass)
            {
                if (sObjClass) sClass += '-' + sObjClass + "-object";
                /*
                 * Use the browser's built-in getElementsByClassName() if it appears to be available
                 * (for example, it's not available in IE8, but it should be available in IE9 and up)
                 */
                if (element.getElementsByClassName) {
                    return element.getElementsByClassName(sClass);
                }
                var i, j, ae = [];
                var aeAll = element.getElementsByTagName("*");
                var re = new RegExp('(^| )' + sClass + '( |$)');
                for (i = 0, j = aeAll.length; i < j; i++) {
                    if (re.test(aeAll[i].className)) {
                        ae.push(aeAll[i]);
                    }
                }
                if (!ae.length) {
                    Component.log('No elements of class "' + sClass + '" found');
                }
                return ae;
            };
            
            Component.prototype = {
                constructor: Component,
                parent: null,
                /**
                 * toString()
                 *
                 * @this {Component}
                 * @return {string}
                 */
                toString: function() {
                    return (this.name? this.name : (this.id || this.type));
                },
                /**
                 * getMachineNum()
                 *
                 * @this {Component}
                 * @return {number} unique machine number
                 */
                getMachineNum: function() {
                    var nMachine = 1;
                    if (this.idMachine) {
                        var aDigits = this.idMachine.match(/\d+/);
                        if (aDigits !== null)
                            nMachine = parseInt(aDigits[0], 10);
                    }
                    return nMachine;
                },
                /**
                 * setBinding(sHTMLType, sBinding, control)
                 *
                 * Component's setBinding() method is intended to be overridden by subclasses.
                 *
                 * @this {Component}
                 * @param {string|null} sHTMLType is the type of the HTML control (eg, "button", "list", "text", "submit", "textarea", "canvas")
                 * @param {string} sBinding is the value of the 'binding' parameter stored in the HTML control's "data-value" attribute (eg, "reset")
                 * @param {Object} control is the HTML control DOM object (eg, HTMLButtonElement)
                 * @return {boolean} true if binding was successful, false if unrecognized binding request
                 */
                setBinding: function(sHTMLType, sBinding, control) {
                    switch (sBinding) {
                    case "clear":
                        if (!this.bindings[sBinding]) {
                            this.bindings[sBinding] = control;
                            control.onclick = (function(component) {
                                return function clearPanel() {
                                    if (component.bindings['print']) {
                                        component.bindings['print'].value = "";
                                    }
                                };
                            }(this));
                        }
                        return true;
                    case "print":
                        if (!this.bindings[sBinding]) {
                            this.bindings[sBinding] = control;
                            /*
                             * HACK: Save this particular HTML element so that the Debugger can access it, too
                             */
                            this.controlPrint = control;
                            /*
                             * This was added for Firefox (Safari automatically clears the <textarea> on a page reload,
                             * but Firefox does not).
                             */
                            control.value = "";
                            this.println = (function(control) {
                                return function printPanel(s, type) {
                                    s = (type !== undefined? (type + ": ") : "") + (s || "");
                                    /*
                                     * Prevent the <textarea> from getting too large; otherwise, printing becomes slower and slower.
                                     */
                                    if (COMPILED) {
                                        if (control.value.length > 8192) {
                                            control.value = control.value.substr(control.value.length - 4096);
                                        }
                                    }
                                    control.value += s + "\n";
                                    control.scrollTop = control.scrollHeight;
                                    if (DEBUG && window && window.console) console.log(s);
                                };
                            }(control));
                            /**
                             * Override this.notice() with a replacement function that eliminates the web.alertUser() call
                             *
                             * @this {Component}
                             * @param {string} s
                             * @param {boolean} [fPrintOnly]
                             * @param {string} [id]
                             */
                            this.notice = function noticePanel(s, fPrintOnly, id) {
                                this.println(s, "notice", id);
                            };
                        }
                        return true;
                    default:
                        return false;
                    }
                },
                /**
                 * log(s, type)
                 *
                 * For diagnostic output only.
                 *
                 * WARNING: Even though this function's body is completely wrapped in DEBUG, that won't prevent the Closure Compiler
                 * from including it, so all calls must still be prefixed with "if (DEBUG) ....".  For this reason, the class method,
                 * Component.log(), is preferred, because the compiler IS smart enough to remove those calls.
                 *
                 * @this {Component}
                 * @param {string} [s] is the message text
                 * @param {string} [type] is the message type
                 */
                log: function(s, type) {
                    if (DEBUG) {
                        Component.log(s, type || this.id || this.type);
                    }
                },
                /**
                 * assert(f, s)
                 *
                 * Verifies conditions that must be true (for DEBUG builds only).
                 *
                 * WARNING: Make sure you preface all calls to this.assert() with "if (DEBUG)", because unlike Component.assert(),
                 * the Closure Compiler can't be sure that this instance method hasn't been overridden, so it refuses to treat it as
                 * dead code in non-DEBUG builds.
                 *
                 * TODO: Add a task to the build process that "asserts" there are no instances of "assertion failure" in RELEASE builds.
                 *
                 * @param {boolean} f is the expression we are asserting to be true
                 * @param {string} [s] is description of the assertion on failure
                 */
                assert: function(f, s) {
                    if (DEBUG) {
                        if (!f) {
                            s = "assertion failure in " + (this.id || this.type) + (s? ": " + s : "");
                            if (DEBUGGER && this.dbg) {
                                this.dbg.stopCPU();
                                /*
                                 * Why do we throw an Error only to immediately catch and ignore it?  Simply to give
                                 * any IDE the opportunity to inspect the application's state.  Even when the IDE has
                                 * control, you should still be able to invoke Debugger commands from the IDE's REPL,
                                 * using the '$' global function that the Debugger constructor defines; eg:
                                 *
                                 *      $('r')
                                 *      $('dw 0:0')
                                 *      $('h')
                                 *      ...
                                 *
                                 * If you have no desire to stop on assertions, consider this a no-op.  However, another
                                 * potential benefit of creating an Error object is that, for browsers like Chrome, we get
                                 * a stack trace, too.
                                 */
                                try {
                                    throw new Error(s);
                                } catch(e) {
                                    this.println(e.stack || e.message);
                                }
                                return;
                            }
                            this.log(s);
                            throw new Error(s);
                        }
                    }
                },
                /**
                 * println(s, type)
                 *
                 * For non-diagnostic messages, which components may override to control the destination/appearance of their output.
                 *
                 * Components using this.println() should wait until after their constructor has run to display any messages, because
                 * if a Control Panel has been loaded, its override will not take effect until its own constructor has run.
                 *
                 * @this {Component}
                 * @param {string} [s] is the message text
                 * @param {string} [type] is the message type
                 * @param {string} [id] is the caller's ID, if any
                 */
                println: function(s, type, id) {
                    Component.println(s, type, id || this.id);
                },
                /**
                 * status(s)
                 *
                 * status() is like println() but it also includes information about the component (ie, the component ID),
                 * which is why there is no corresponding Component.status() function.
                 *
                 * @param {string} s is the message text
                 */
                status: function(s) {
                    this.println(this.idComponent + ": " + s);
                },
                /**
                 * notice(s, fPrintOnly)
                 *
                 * notice() is like println() but implies a need for user notification, so we alert() as well; however, if this.println()
                 * is overridden, this.notice will be replaced with a similar override, on the assumption that the override is taking care
                 * of alerting the user.
                 *
                 * @this {Component}
                 * @param {string} s is the message text
                 * @param {boolean} [fPrintOnly]
                 * @param {string} [id] is the caller's ID, if any
                 */
                notice: function(s, fPrintOnly, id) {
                    Component.notice(s, fPrintOnly, id || this.id);
                },
                /**
                 * setError(s)
                 *
                 * Set a fatal error condition
                 *
                 * @this {Component}
                 * @param {string} s describes a fatal error condition
                 */
                setError: function(s) {
                    this.aFlags.fError = true;
                    this.notice(s);         // TODO: Any cases where we should still prefix this string with "Fatal error: "?
                },
                /**
                 * clearError()
                 *
                 * Clear any fatal error condition
                 *
                 * @this {Component}
                 */
                clearError: function() {
                    this.aFlags.fError = false;
                },
                /**
                 * isError()
                 *
                 * Report any fatal error condition
                 *
                 * @this {Component}
                 * @return {boolean} true if a fatal error condition exists, false if not
                 */
                isError: function() {
                    if (this.aFlags.fError) {
                        this.println(this.toString() + " error");
                        return true;
                    }
                    return false;
                },
                /**
                 * isReady(fnReady)
                 *
                 * Return the "ready" state of the component; if the component is not ready, it will queue the optional
                 * notification function, otherwise it will immediately call the notification function, if any, without queuing it.
                 *
                 * NOTE: Since only the Computer component actually cares about the "readiness" of other components, the so-called
                 * "queue" of notification functions supports exactly one function.  This keeps things nice and simple.
                 *
                 * @this {Component}
                 * @param {function()} [fnReady]
                 * @return {boolean} true if the component is in a "ready" state, false if not
                 */
                isReady: function(fnReady) {
                    if (fnReady) {
                        if (this.aFlags.fReady) {
                            fnReady();
                        } else {
                            if (MAXDEBUG) this.log("NOT ready");
                            this.fnReady = fnReady;
                        }
                    }
                    return this.aFlags.fReady;
                },
                /**
                 * setReady(fReady)
                 *
                 * Set the "ready" state of the component to true, and call any queued notification functions.
                 *
                 * @this {Component}
                 * @param {boolean} [fReady] is assumed to indicate "ready" unless EXPLICITLY set to false
                 */
                setReady: function(fReady) {
                    if (!this.aFlags.fError) {
                        this.aFlags.fReady = (fReady !== false);
                        if (this.aFlags.fReady) {
                            if (MAXDEBUG /* || this.name */) this.log("ready");
                            var fnReady = this.fnReady;
                            this.fnReady = null;
                            if (fnReady) fnReady();
                        }
                    }
                },
                /**
                 * isBusy(fCancel)
                 *
                 * Return the "busy" state of the component
                 *
                 * @this {Component}
                 * @param {boolean} [fCancel] is set to true to cancel a "busy" state
                 * @return {boolean} true if "busy", false if not
                 */
                isBusy: function(fCancel) {
                    if (this.aFlags.fBusy) {
                        if (fCancel) {
                            this.aFlags.fBusyCancel = true;
                        } else if (fCancel === undefined) {
                            this.println(this.toString() + " busy");
                        }
                    }
                    return this.aFlags.fBusy;
                },
                /**
                 * setBusy(fBusy)
                 *
                 * Update the current busy state; if an fCancel request is pending, it will be honored now.
                 *
                 * @this {Component}
                 * @param {boolean} fBusy
                 * @return {boolean}
                 */
                setBusy: function(fBusy) {
                    if (this.aFlags.fBusyCancel) {
                        if (this.aFlags.fBusy) {
                            this.aFlags.fBusy = false;
                        }
                        this.aFlags.fBusyCancel = false;
                        return false;
                    }
                    if (this.aFlags.fError) {
                        this.println(this.toString() + " error");
                        return false;
                    }
                    this.aFlags.fBusy = fBusy;
                    return this.aFlags.fBusy;
                },
                /**
                 * powerUp(fSave)
                 *
                 * @this {Component}
                 * @param {Object|null} data
                 * @param {boolean} [fRepower] is true if this is "repower" notification
                 * @return {boolean} true if successful, false if failure
                 */
                powerUp: function(data, fRepower) {
                    this.aFlags.fPowered = true;
                    return true;
                },
                /**
                 * powerDown(fSave, fShutdown)
                 *
                 * @this {Component}
                 * @param {boolean} fSave
                 * @param {boolean} [fShutdown]
                 * @return {Object|boolean} component state if fSave; otherwise, true if successful, false if failure
                 */
                powerDown: function(fSave, fShutdown) {
                    if (fShutdown) this.aFlags.fPowered = false;
                    return true;
                },
                /**
                 * messageEnabled(bitsMessage)
                 *
                 * If bitsMessage is not specified, the component's MESSAGE category is used.
                 *
                 * @this {Component}
                 * @param {number} [bitsMessage] is zero or more MESSAGE_* category flag(s)
                 * @return {boolean} true if all specified message enabled, false if not
                 */
                messageEnabled: function(bitsMessage) {
                    if (DEBUGGER && this.dbg) {
                        if (this === this.dbg) {
                            bitsMessage |= 0;
                        } else {
                            bitsMessage = bitsMessage || this.bitsMessage;
                        }
                        var bitsEnabled = this.dbg.bitsMessage & bitsMessage;
                        return (bitsEnabled === bitsMessage || !!(bitsEnabled & this.dbg.bitsWarning));
                    }
                    return false;
                },
                /**
                 * printMessage(sMessage, bitsMessage, fAddress)
                 *
                 * If bitsMessage is not specified, the component's MESSAGE category is used.
                 * If bitsMessage is true, the message is displayed regardless.
                 *
                 * @this {Component}
                 * @param {string} sMessage is any caller-defined message string
                 * @param {number|boolean} [bitsMessage] is zero or more MESSAGE_* category flag(s)
                 * @param {boolean} [fAddress] is true to display the current address
                 * @return {boolean} true if Debugger available, false if not
                 */
                printMessage: function(sMessage, bitsMessage, fAddress) {
                    if (DEBUGGER && this.dbg) {
                        if (bitsMessage === true || this.messageEnabled(bitsMessage | 0)) {
                            this.dbg.message(sMessage, fAddress);
                        }
                        return true;
                    }
                    return false;
                },
                /**
                 * printMessageIO(port, bOut, addrFrom, name, bIn, bitsMessage)
                 *
                 * If bitsMessage is not specified, the component's MESSAGE category is used.
                 * If bitsMessage is true, the message is displayed as long as MESSAGE.PORT is enabled.
                 *
                 * @this {Component}
                 * @param {number} port
                 * @param {number|null} bOut if an output operation
                 * @param {number|null} [addrFrom]
                 * @param {string|null} [name] of the port, if any
                 * @param {number|null} [bIn] is the input value, if known, on an input operation
                 * @param {number|boolean} [bitsMessage] is zero or more MESSAGE_* category flag(s)
                 */
                printMessageIO: function(port, bOut, addrFrom, name, bIn, bitsMessage) {
                    if (DEBUGGER && this.dbg) {
                        if (bitsMessage === true) {
                            bitsMessage = 0;
                        } else if (bitsMessage == null) {
                            bitsMessage = this.bitsMessage;
                        }
                        this.dbg.messageIO(this, port, bOut, addrFrom, name, bIn, bitsMessage);
                    }
                }
            };
            
            if (typeof module !== 'undefined') module.exports = Component;
            
          • defines.js
            /**
             * @fileoverview Compile-time definitions used by C1Pjs and PCjs.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-08
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /**
             * @define {string}
             */
            var APPNAME = "";               // this @define is overridden by the Closure Compiler with either "PCjs" or "C1Pjs"
            
            /**
             * @define {string}
             */
            var APPVERSION = "1.x.x";       // this @define is overridden by the Closure Compiler with the version in package.json
            
            /**
             * @define {string}
             */
            var SITEHOST = "localhost:8088";// this @define is overridden by the Closure Compiler with "www.pcjs.org"
            
            /**
             * @define {boolean}
             */
            var COMPILED = false;           // this @define is overridden by the Closure Compiler (to true)
            
            /**
             * @define {boolean}
             */
            var DEBUG = true;               // this @define is overridden by the Closure Compiler (to false) to remove DEBUG-only code
            
            /**
             * @define {boolean}
             */
            var MAXDEBUG = false;           // this @define is overridden by the Closure Compiler (to false) to remove MAXDEBUG-only code
            
            if (typeof module !== 'undefined') {
                global.window = false;      // provides an alternative "if (typeof window === 'undefined')" (ie, "if (window) ...")
                global.APPNAME = APPNAME;
                global.APPVERSION = APPVERSION;
                global.SITEHOST = SITEHOST;
                global.COMPILED = COMPILED;
                global.DEBUG = DEBUG;
                global.MAXDEBUG = MAXDEBUG;
                /*
                 * TODO: When we're "required" by Node, should we return anything via module.exports?
                 */
            }
            
          • diskapi.js
            /**
             * @fileoverview Disk APIs, as defined by httpapi.js and consumed by disk.js
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-08
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /*
             * Our "DiskIO API" looks like:
             *
             *      http://www.pcjs.org/api/v1/disk?action=open&volume=*10mb.img&mode=demandrw&chs=c:h:s&machine=xxx&user=yyy
             */
            var DiskAPI = {
                ENDPOINT:       "/api/v1/disk",
                QUERY: {
                    ACTION:     "action",   // value is one of DiskAPI.ACTION.*
                    VOLUME:     "volume",   // value is path of a disk image
                    MODE:       "mode",     // value is one of DiskAPI.MODE.*
                    CHS:        "chs",      // value is cylinders:heads:sectors:bytes
                    ADDR:       "addr",     // value is cylinder:head:sector:count
                    MACHINE:    "machine",  // value is machine token
                    USER:       "user",     // value is user ID
                    DATA:       "data"      // value is data to be written
                },
                ACTION: {
                    OPEN:       "open",
                    READ:       "read",
                    WRITE:      "write",
                    CLOSE:      "close"
                },
                MODE: {
                    LOCAL:      "local",    // this mode implies no API (at best, localStorage backing only)
                    PRELOAD:    "preload",  // this mode implies use of the DumpAPI
                    DEMANDRW:   "demandrw",
                    DEMANDRO:   "demandro"
                },
                FAIL: {
                    BADACTION:  "invalid action",
                    BADUSER:    "invalid user",
                    BADVOL:     "invalid volume",
                    OPENVOL:    "unable to open volume",
                    CREATEVOL:  "unable to create volume",
                    WRITEVOL:   "unable to write volume",
                    REVOKED:    "access revoked"
                }
            };
            
            /*
             * Common (supported) diskette formats
             */
            DiskAPI.DISKETTE_FORMATS = {
                163840:  [40,1,8],          // media type 0xFE: 40 cylinders, 1 head (single-sided),   8 sectors/track, ( 320 total sectors x 512 bytes/sector ==  163840)
                184320:  [40,1,9],          // media type 0xFC: 40 cylinders, 1 head (single-sided),   9 sectors/track, ( 360 total sectors x 512 bytes/sector ==  184320)
                327680:  [40,2,8],          // media type 0xFF: 40 cylinders, 2 heads (double-sided),  8 sectors/track, ( 640 total sectors x 512 bytes/sector ==  327680)
                368640:  [40,2,9],          // media type 0xFD: 40 cylinders, 2 heads (double-sided),  9 sectors/track, ( 720 total sectors x 512 bytes/sector ==  368640)
                737280:  [80,2,9],          // media type 0xF9: 80 cylinders, 2 heads (double-sided),  9 sectors/track, (1440 total sectors x 512 bytes/sector ==  737280)
                1228800: [80,2,15],         // media type 0xF9: 80 cylinders, 2 heads (double-sided), 15 sectors/track, (2400 total sectors x 512 bytes/sector == 1228800)
                1474560: [80,2,18],         // media type 0xF0: 80 cylinders, 2 heads (double-sided), 18 sectors/track, (2880 total sectors x 512 bytes/sector == 1474560)
                2949120: [80,2,36]          // media type 0xF0: 80 cylinders, 2 heads (double-sided), 36 sectors/track, (5760 total sectors x 512 bytes/sector == 2949120)
            };
            
            DiskAPI.MBR = {
                PARTITIONS: {
                    OFFSET:     0x1BE,
                    ENTRY: {
                        STATUS:         0x00,   // 0x80 if active
                        CHS_FIRST:      0x01,   // 3-byte CHS specifier
                        TYPE:           0x04,   // see TYPE.*
                        CHS_LAST:       0x05,   // 3-byte CHS specifier
                        LBA_FIRST:      0x08,
                        LBA_TOTAL:      0x0C,
                        LENGTH:         0x10
                    },
                    STATUS: {
                        ACTIVE:         0x80
                    },
                    TYPE: {
                        EMPTY:          0x00,
                        FAT12_PRIMARY:  0x01,   // DOS 2.0 and up (12-bit FAT)
                        FAT16_PRIMARY:  0x04    // DOS 3.0 and up (16-bit FAT)
                    }
                },
                SIG_OFFSET:     0x1FE,
                SIGNATURE:      0xAA55          // to be clear, the low byte (at offset 0x1FE) is 0x55 and the high byte (at offset 0x1FF) is 0xAA
            };
            
            /*
             * Boot sector offsets (and assorted constants) in DOS-compatible boot sectors (DOS 2.0 and up)
             *
             * WARNING: I've heard apocryphal stories about SIGNATURE being improperly reversed on some systems
             * (ie, 0x55AA instead 0xAA55) -- perhaps by a dyslexic programmer -- so be careful out there.
             */
            DiskAPI.BOOT = {
                JMP_OPCODE:     0x000,      // 1 byte for a JMP opcode, followed by a 1 or 2-byte offset
                OEM_STRING:     0x003,      // 8 bytes
                SIG_OFFSET:     0x1FE,
                SIGNATURE:      0xAA55      // to be clear, the low byte (at offset 0x1FE) is 0x55 and the high byte (at offset 0x1FF) is 0xAA
            };
            
            /*
             * BIOS Parameter Block (BPB) offsets in DOS-compatible boot sectors (DOS 2.0 and up)
             */
            DiskAPI.BPB = {
                SECTOR_BYTES:   0x00B,      // 2 bytes: bytes per sector (eg, 0x200 or 512)
                CLUSTER_SECS:   0x00D,      // 1 byte: sectors per cluster (eg, 1)
                RESERVED_SECS:  0x00E,      // 2 bytes: reserved sectors; ie, # sectors preceding the first FAT--usually just the boot sector (eg, 1)
                TOTAL_FATS:     0x010,      // 1 byte: FAT copies (eg, 2)
                ROOT_DIRENTS:   0x011,      // 2 bytes: root directory entries (eg, 0x40 or 64) 0x40 * 0x20 = 0x800 (1 sector is 0x200 bytes, total of 4 sectors)
                TOTAL_SECS:     0x013,      // 2 bytes: number of sectors (eg, 0x140 or 320); if zero, refer to LARGE_SECS
                MEDIA_TYPE:     0x015,      // 1 byte: media type (see DiskAPI.FAT.MEDIA_*)
                FAT_SECS:       0x016,      // 2 bytes: sectors per FAT (eg, 1)
                TRACK_SECS:     0x018,      // 2 bytes: sectors per track (eg, 8)
                TOTAL_HEADS:    0x01A,      // 2 bytes: number of heads (eg, 1)
                HIDDEN_SECS:    0x01C,      // 4 bytes: number of hidden sectors (always 0 for non-partitioned media)
                LARGE_SECS:     0x020       // 4 bytes: number of sectors if TOTAL_SECS is zero
            };
            
            /*
             * Media descriptor bytes for DOS-compatible FAT-formatted disks (stored in the first byte of the FAT)
             */
            DiskAPI.FAT = {
                MEDIA_160KB:    0xFE,       // 5.25-inch, 1-sided,  8-sector, 40-track
                MEDIA_180KB:    0xFC,       // 5.25-inch, 1-sided,  9-sector, 40-track
                MEDIA_320KB:    0xFF,       // 5.25-inch, 2-sided,  8-sector, 40-track
                MEDIA_360KB:    0xFD,       // 5.25-inch, 2-sided,  9-sector, 40-track
                MEDIA_720KB:    0xF9,       //  3.5-inch, 2-sided,  9-sector, 80-track
                MEDIA_1200KB:   0xF9,       //  3.5-inch, 2-sided, 15-sector, 80-track
                MEDIA_1440KB:   0xF0,       //  3.5-inch, 2-sided, 18-sector, 80-track
                MEDIA_2880KB:   0xF0        //  3.5-inch, 2-sided, 36-sector, 80-track
            };
            
            /*
             * Cluster constants for 12-bit FATs (CLUSNUM_FREE, CLUSNUM_RES and CLUSNUM_MIN are the same for all FATs)
             */
            DiskAPI.FAT12 = {
                MAX_CLUSTERS:   4084,
                CLUSNUM_FREE:   0,          // this should NEVER appear in cluster chain (except at the start of an empty chain)
                CLUSNUM_RES:    1,          // reserved; this should NEVER appear in cluster chain
                CLUSNUM_MIN:    2,          // smallest valid cluster number
                CLUSNUM_MAX:    0xFF6,      // largest valid cluster number
                CLUSNUM_BAD:    0xFF7,      // bad cluster; this should NEVER appear in cluster chain
                CLUSNUM_EOC:    0xFF8       // end of chain (actually, anything from 0xFF8-0xFFF indicates EOC)
            };
            
            /*
             * Cluster constants for 16-bit FATs (CLUSNUM_FREE, CLUSNUM_RES and CLUSNUM_MIN are the same for all FATs)
             */
            DiskAPI.FAT16 = {
                MAX_CLUSTERS:   65524,
                CLUSNUM_FREE:   0,          // this should NEVER appear in cluster chain (except at the start of an empty chain)
                CLUSNUM_RES:    1,          // reserved; this should NEVER appear in cluster chain
                CLUSNUM_MIN:    2,          // smallest valid cluster number
                CLUSNUM_MAX:    0xFFF6,     // largest valid cluster number
                CLUSNUM_BAD:    0xFFF7,     // bad cluster; this should NEVER appear in cluster chain
                CLUSNUM_EOC:    0xFFF8      // end of chain (actually, anything from 0xFFF8-0xFFFF indicates EOC)
            };
            
            /*
             * Directory Entry offsets (and assorted constants) in FAT disk images
             *
             * NOTE: Versions of DOS prior to 2.0 use INVALID exclusively to mark available directory entries; any entry marked
             * UNUSED will actually be considered USED.  In DOS 2.0 and up, UNUSED was added to indicate that all remaining entries
             * are unused, relieving it from having to initialize the rest of the sectors in the directory cluster(s).  And in fact,
             * you WILL encounter garbage in subsequent directory sectors if you attempt to read past an UNUSED entry.
             */
            DiskAPI.DIRENT = {
                NAME:           0x000,      // 8 bytes
                EXT:            0x008,      // 3 bytes
                ATTR:           0x00B,      // 1 byte
                MODTIME:        0x016,      // 2 bytes
                MODDATE:        0x018,      // 2 bytes
                CLUSTER:        0x01A,      // 2 bytes
                SIZE:           0x01C,      // 4 bytes (typically zero for subdirectories)
                LENGTH:         0x20,       // 32 bytes total
                UNUSED:         0x00,       // indicates this and all subsequent directory entries are unused
                INVALID:        0xE5        // indicates this directory entry is unused
            };
            
            /*
             * Possible values for DIRENT.ATTR
             */
            DiskAPI.ATTR = {
                READONLY:       0x01,       // PC-DOS 2.0 and up
                HIDDEN:         0x02,
                SYSTEM:         0x04,
                LABEL:          0x08,       // PC-DOS 2.0 and up
                SUBDIR:         0x10,       // PC-DOS 2.0 and up
                ARCHIVE:        0x20        // PC-DOS 2.0 and up
            };
            
            if (typeof module !== 'undefined') module.exports = DiskAPI;
            
          • dumpapi.js
            /**
             * @fileoverview Disk APIs, as defined by diskdump.js and consumed by disk.js
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-08
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /*
             * Our "DiskDump API", such as it was, used to look like:
             *
             *      http://jsmachines.net/bin/convdisk.php?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img
             *
             * To make it (a bit) more "REST-like", the above request now looks like:
             *
             *      http://www.pcjs.org/api/v1/dump?disk=/disks/pc/dos/ibm/2.00/PCDOS200-DISK1.json&format=img
             *
             * Similarly, our "FileDump API" used to look like:
             *
             *      http://jsmachines.net/bin/convrom.php?rom=/devices/pc/bios/5150/1981-04-24.rom&format=json
             *
             * and that request now looks like:
             *
             *      http://www.pcjs.org/api/v1/dump?file=/devices/pc/bios/5150/1981-04-24.rom&format=json
             *
             * I don't think it makes sense to avoid "query" parameters, because blending the path of a disk image with the
             * the rest of the URL would be (a) confusing, and (b) more work to parse.
             */
            var DumpAPI = {
                ENDPOINT:       "/api/v1/dump",
                QUERY: {
                    DIR:        "dir",      // value is path of a directory (DiskDump only)
                    DISK:       "disk",     // value is path of a disk image (DiskDump only)
                    FILE:       "file",     // value is path of a ROM image file (FileDump only)
                    IMG:        "img",      // alias for DISK
                    PATH:       "path",     // value is path of a one or more files (DiskDump only)
                    FORMAT:     "format",   // value is one of FORMAT values below
                    COMMENTS:   "comments", // value is either "true" or "false"
                    DECIMAL:    "decimal",  // value is either "true" to force all numbers to decimal, "false" or undefined otherwise
                    MBHD:       "mbhd"      // value is hard disk size in Mb (formerly "mbsize") (DiskDump only)
                },
                FORMAT: {
                    JSON:       "json",     // default
                    DATA:       "data",     // same as "json", but built without JSON.stringify() (DiskDump only)
                    HEX:        "hex",      // deprecated
                    BYTES:      "bytes",    // displays data as hex bytes; normally used only when comments are enabled
                    IMG:        "img",      // returns the raw disk data (ie, using a Buffer object) (DiskDump only)
                    ROM:        "rom"       // returns the raw file data (ie, using a Buffer object) (FileDump only)
                }
            };
            
            /*
             * Because we use an overloaded API endpoint (ie, one that's shared with the FileDump module), we must
             * also provide a list of commands which, when combined with the endpoint, define a unique request. 
             */
            DumpAPI.asDiskCommands = [DumpAPI.QUERY.DIR, DumpAPI.QUERY.DISK, DumpAPI.QUERY.PATH];
            DumpAPI.asFileCommands = [DumpAPI.QUERY.FILE];
            
            if (typeof module !== 'undefined') module.exports = DumpAPI;
          • embed.js
            /**
             * @fileoverview C1Pjs and PCjs embedding functionality.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Aug-28
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /* global window: true, XSLTProcessor: false, APPNAME: false, APPVERSION: false, DEBUG: true */
            
            if (typeof module !== 'undefined') {
                var Component;
                var str = require("./strlib");
                var web = require("./weblib");
            }
            
            /*
             * We now support asynchronous XML and XSL file loads; simply set fAsync (below) to true.
             *
             * NOTE: For that support to work, we have to keep track of the number of machines on the page
             * (ie, how many embedMachine() calls were issued), reduce the count as each machine XML file
             * is fully transformed into HTML, and when the count finally returns to zero, notify all the
             * machine component init() handlers.
             *
             * Also, to prevent those init() handlers from running prematurely, we must disable all page
             * notification events at the start of the embedding process (web.enablePageEvents(false)) and
             * re-enable them at the end (web.enablePageEvents(true)).
             */
            var cMachines = 0;
            var fAsync = true;
            
            /**
             * loadXML(sFile, idMachine, sStateFile, fResolve, display, done)
             *
             * This is the preferred way to load all XML and XSL files. It uses loadResource()
             * to load them as strings, which parseXML() can massage before parsing/transforming them.
             *
             * For example, since I've been unable to get the XSLT document() function to work inside any
             * XSL document loaded by JavaScript's XSLT processor, that has prevented me from dynamically
             * loading any XML machine file that uses the "ref" attribute to refer to and incorporate
             * another XML document.
             *
             * To solve that, I've added an fResolve parameter that tells parseXML() to fetch any
             * referenced documents ITSELF and insert them into the XML string prior to parsing, instead
             * of relying on the XSLT template to pull them in.  That fetching is handled by resolveXML(),
             * which iterates over the XML until all "refs" have been resolved (including any nested
             * references).
             *
             * Also, XSL files with a <!DOCTYPE [...]> cause MSIE's Microsoft.XMLDOM.loadXML() function
             * to choke, so I strip that out prior to parsing as well.
             *
             * TODO: Figure out why the XSLT document() function works great when the web browser loads an
             * XML file (and the associated XSL file) itself, but does not work when loading documents via
             * JavaScript XSLT support. Is it broken, is it a security issue, or am I just calling it wrong?
             *
             * @param {string} sXMLFile
             * @param {string|null|undefined} idMachine
             * @param {string|null|undefined} sStateFile
             * @param {boolean} fResolve is true to resolve any "ref" attributes
             * @param {function(string)} display
             * @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
             */
            function loadXML(sXMLFile, idMachine, sStateFile, fResolve, display, done)
            {
                var doneLoadXML = function(sURLName, sXML, nErrorCode) {
                    if (nErrorCode) {
                        if (!sXML) sXML = "unable to load " + sXMLFile + " (" + nErrorCode + ")";
                        done(sXML, null);
                        return;
                    }
                    parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done);
                };
                display("Loading " + sXMLFile + "...");
                web.loadResource(sXMLFile, fAsync, null, null, doneLoadXML);
            }
            
            /**
             * parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
             *
             * Generates an XML document from an XML string. This function also provides a work-around for XSLT's
             * lack of support for the document() function (at least on some browsers), by replacing every reference
             * tag (ie, a tag with a "ref" attribute) with the contents of the referenced file.
             *
             * @param {string} sXML
             * @param {string|null} sXMLFile
             * @param {string|null|undefined} idMachine
             * @param {string|null|undefined} sStateFile
             * @param {boolean} fResolve is true to resolve any "ref" attributes; default is false
             * @param {function(string)} display
             * @param {function(string,Object)} done (string contains the unparsed XML string data, and Object contains a parsed XML object)
             */
            function parseXML(sXML, sXMLFile, idMachine, sStateFile, fResolve, display, done)
            {
                var buildXML = function(sXML, sError) {
                    if (sError) {
                        done(sError, null);
                        return;
                    }
                    if (idMachine) {
                        var sURL = sXMLFile;
                        if (sURL && sURL.indexOf('/') < 0) sURL = window.location.pathname + sURL;
                        sXML = sXML.replace(/(<machine[^>]*\sid=)(['"]).*?\2/, "$1$2" + idMachine + "$2" + (sStateFile? " state=$2" + sStateFile + "$2" : "") + (sURL? " url=$2" + sURL + "$2" : ""));
                    }
                    /*
                     * If the resource we requested is not really an XML file (or the file didn't exist and the server simply returned
                     * a message like "Cannot GET /devices/pc/machine/5150/cga/64kb/donkey/machine.xml"), we'd like to display a more
                     * meaningful message, because the XML DOM parsers will blithely return a document that contains nothing useful; eg:
                     *
                     *      This page contains the following errors:error on line 1 at column 1:
                     *      Document is empty Below is a rendering of the page up to the first error.
                     *
                     * Supposedly, the IE XML DOM parser will throw an exception, but I haven't tested that, and unless all other
                     * browsers do that, that's not helpful.
                     *
                     * The best I can do at this stage (assuming web.loadResource() didn't drop any error information on the floor)
                     * is verify that the requested resource "looks like" valid XML (in other words, it begins with a '<').
                     */
                    var xmlDoc = null;
                    if (sXML.charAt(0) == '<') {
                        try {
                            if (window.ActiveXObject || "ActiveXObject" in window) {        // second test is required for IE11 on Windows 8.1
                                /*
                                 * Another hack for MSIE, which fails to properly load XSL documents containing a <!DOCTYPE [...]> tag.
                                 */
                                if (!fResolve) {
                                    sXML = sXML.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g, "");
                                }
                                xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
                                xmlDoc.async = false;
                                xmlDoc['loadXML'](sXML);
                            } else {
                                xmlDoc = (new window.DOMParser()).parseFromString(sXML, "text/xml");
                            }
                        } catch(e) {
                            xmlDoc = null;
                            sXML = e.message;
                        }
                    } else {
                        sXML = "unrecognized XML: " + (sXML.length > 255? sXML.substr(0, 255) + "..." : sXML);
                    }
                    done(sXML, xmlDoc);
                };
                if (sXML) {
                    if (fResolve) {
                        resolveXML(sXML, display, buildXML);
                        return;
                    }
                    buildXML(sXML, null);
                    return;
                }
                done("no data" + (sXMLFile? " for file: " + sXMLFile : ""), null);
            }
            
            /**
             * resolveXML(sXML, display, done)
             *
             * Replaces every tag with a "ref" attribute with the contents of the corresponding file.
             *
             * TODO: Fix some of the limitations of this code, such as: 1) requiring the "ref" attribute
             * to appear as the tag's first attribute, 2) requiring the "ref" attribute to be double-quoted,
             * and 3) requiring the "ref" tag to be self-closing.
             *
             * @param {string} sXML
             * @param {function(string)} display
             * @param {function(string,(string|null))} done (the first string contains the resolved XML data, the second is for any error message)
             */
            function resolveXML(sXML, display, done)
            {
                var matchRef;
                var reRef = /<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g;
            
                if ((matchRef = reRef.exec(sXML))) {
            
                    var sRefFile = matchRef[2];
            
                    var doneReadXML = function(sURLName, sXMLRef, nErrorCode) {
                        if (nErrorCode || !sXMLRef) {
                            done(sXML, "unable to resolve XML reference: " + matchRef[0] + " (" + nErrorCode + ")");
                            return;
                        }
                        /*
                         * If there are additional attributes in the "referring" XML tag, we want to insert them
                         * into the "referred" XML tag; attributes that don't exist in the referred tag should be
                         * appended, and attributes that DO exist should be overwritten.
                         */
                        var sRefAttrs = matchRef[3];
                        if (sRefAttrs) {
                            var aXMLRefTag = sXMLRef.match(new RegExp("<" + matchRef[1] + "[^>]*>"));
                            if (aXMLRefTag) {
                                var sXMLNewTag = aXMLRefTag[0];
                                /*
                                 * Iterate over all the attributes in the "referring" XML tag (sRefAttrs)
                                 */
                                var matchAttr;
                                var reAttr = /( [a-z]+=)(['"])(.*?)\2/g;
                                while ((matchAttr = reAttr.exec(sRefAttrs))) {
                                    if (sXMLNewTag.indexOf(matchAttr[1]) < 0) {
                                        /*
                                         * This is the append case
                                         */
                                        sXMLNewTag = sXMLNewTag.replace(">", matchAttr[0] + ">");
                                    } else {
                                        /*
                                         * This is the overwrite case
                                         */
                                        sXMLNewTag = sXMLNewTag.replace(new RegExp(matchAttr[1] + "(['\"])(.*?)\\1"), matchAttr[0]);
                                    }
                                }
                                if (aXMLRefTag[0] != sXMLNewTag) {
                                    sXMLRef = sXMLRef.replace(aXMLRefTag[0], sXMLNewTag);
                                }
                            } else {
                                done(sXML, "missing <" + matchRef[1] + "> in " + sRefFile);
                                return;
                            }
                        }
            
                        /*
                         * Apparently when a Windows Azure server delivers one of my XML files, it may modify the first line:
                         *
                         *      <?xml version="1.0" encoding="UTF-8"?>\n
                         *
                         * I didn't determine exactly what it was doing at this point (probably just changing the \n to \r\n),
                         * but in any case, relaxing the following replace() solved it.
                         */
                        sXMLRef = sXMLRef.replace(/<\?xml[^>]*>[\r\n]*/, "");
            
                        sXML = sXML.replace(matchRef[0], sXMLRef);
            
                        resolveXML(sXML, display, done);
                    };
            
                    display("Loading " + sRefFile + "...");
                    web.loadResource(sRefFile, fAsync, null, null, doneReadXML);
                    return;
                }
                done(sXML, null);
            }
            
            /**
             * embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
             *
             * This allows to you embed a machine on a web page, by transforming the machine XML into HTML.
             *
             * @param {string} sName is the app name (eg, "PCjs")
             * @param {string} sVersion is the app version (eg, "1.15.7")
             * @param {string} idElement
             * @param {string} sXMLFile
             * @param {string} sXSLFile
             * @param {string} [sStateFile]
             * @return {boolean} true if successful, false if error
             */
            function embedMachine(sName, sVersion, idElement, sXMLFile, sXSLFile, sStateFile)
            {
                var eMachine, eWarning, fSuccess = true;
            
                cMachines++;
            
                var doneMachine = function() {
                    Component.assert(cMachines > 0);
                    if (!--cMachines) {
                        if (fAsync) web.enablePageEvents(true);
                    }
                };
            
                var displayError = function(sError) {
                    Component.log(sError);
                    displayMessage("Error: " + sError);
                    if (fSuccess) doneMachine();
                    fSuccess = false;
                };
            
                var displayMessage = function(sMessage) {
                    if (eWarning === undefined) {
                        /*
                         * Our MarkOut module (in convertMDMachineLinks()) creates machine containers that look like:
                         *
                         *      <div id="' + sMachineID + '" class="machine-placeholder"><p>Embedded PC</p><p class="machine-warning">...</p></div>
                         *
                         * with the "machine-warning" paragraph pre-populated with a warning message that the user will
                         * see if nothing at all happens.  But hopefully, in the normal case (and especially the error case),
                         * *something* will have happened.
                         *
                         * Note that it is the HTMLOut module (in processMachines()) that ultimately decides which scripts to
                         * include and then generates the embedPC() and/or embedC1P() calls.
                         */
                        var aeWarning = (eMachine && Component.getElementsByClass(eMachine, "machine-warning"));
                        eWarning = (aeWarning && aeWarning[0]) || eMachine;
                    }
                    if (eWarning) eWarning.innerHTML = str.escapeHTML(sMessage);
                };
            
                try {
                    eMachine = window.document.getElementById(idElement);
                    if (eMachine) {
                        var sAppClass = sName.toLowerCase();        // eg, "pcjs" or "c1pjs"
                        if (!sXSLFile) {
                            /*
                             * Now that PCjs is an open-source project, we can make the following test more flexible,
                             * and revert to the internal template if DEBUG *or* internal version (instead of *and*).
                             *
                             * Third-party sites that don't use the PCjs server will ALWAYS want to specify a fully-qualified
                             * path to the XSL file, unless they choose to mirror our folder structure.
                             */
                            if (DEBUG || sVersion == "1.x.x") {
                                sXSLFile = "/modules/" + sAppClass + "/templates/components.xsl";
                            } else {
                                sXSLFile = "/versions/" + sAppClass + "/" + sVersion + "/components.xsl";
                            }
                        }
                        var loadXSL = function(sXML, xml) {
                            if (!xml) {
                                displayError(sXML);
                                return;
                            }
                            var transformXML = function(sXSL, xsl) {
                                if (!xsl) {
                                    displayError(sXSL);
                                    return;
                                }
                                if (xsl) {
                                    /*
                                     * The <machine> template in components.xsl now generates a "machine div" that makes
                                     * the div we required the caller of embedMachine() to provide redundant, so instead
                                     * of appending this fragment to the caller's node, we REPLACE the caller's node.
                                     * This works only because because we ALSO inject the caller's "machine div" ID into
                                     * the fragment's ID during parseXML().
                                     *
                                     *      eMachine.innerHTML = sFragment;
                                     *
                                     * Also, if the transform function fails, make sure you're using the appropriate
                                     * "components.xsl" and not a "machine.xsl", because the latter will not produce valid
                                     * embeddable HTML (and is the most common cause of failure at this final stage).
                                     */
                                    displayMessage("Processing " + sXMLFile + "...");
                                    if (window.ActiveXObject || "ActiveXObject" in window) {        // second test is required for IE11 on Windows 8.1
                                        var sFragment = xml['transformNode'](xsl);
                                        if (sFragment) {
                                            eMachine.outerHTML = sFragment;
                                            doneMachine();
                                        } else {
                                            displayError("transformNodeToObject failed");
                                        }
                                    }
                                    else if (window.document.implementation && window.document.implementation.createDocument) {
                                        var xsltProcessor = new XSLTProcessor();
                                        xsltProcessor['importStylesheet'](xsl);
                                        var eFragment = xsltProcessor['transformToFragment'](xml, window.document);
                                        if (eFragment) {
                                            if (eMachine.parentNode) {
                                                eMachine.parentNode.replaceChild(eFragment, eMachine);
                                                doneMachine();
                                            } else {
                                                displayError("invalid machine element: " + idElement);
                                            }
                                        } else {
                                            displayError("transformToFragment failed");
                                        }
                                    } else {
                                        /*
                                         * Perhaps I should have performed this test at the outset; on the other hand, I'm
                                         * not aware of any browsers don't support one or both of the above XSLT transformation
                                         * methods, so treat this as a bug.
                                         */
                                        displayError("unable to transform XML: unsupported browser");
                                    }
                                } else {
                                    displayError("failed to load XSL file: " + sXSLFile);
                                }
                            };
                            if (xml) {
                                loadXML(sXSLFile, null, null, false, displayMessage, transformXML);
                            } else {
                                displayError("failed to load XML file: " + sXMLFile);
                            }
                        };
                        if (sXMLFile.charAt(0) != '<') {
                            loadXML(sXMLFile, idElement, sStateFile, true, displayMessage, loadXSL);
                        } else {
                            parseXML(sXMLFile, null, idElement, sStateFile, false, displayMessage, loadXSL);
                        }
                    } else {
                        displayError("missing machine element: " + idElement);
                    }
                } catch(e) {
                    displayError(e.message);
                }
                return fSuccess;
            }
            
            /**
             * embedC1P(idElement, sXMLFile, sXSLFile)
             *
             * @param {string} idElement
             * @param {string} sXMLFile
             * @param {string} sXSLFile
             * @return {boolean} true if successful, false if error
             */
            function embedC1P(idElement, sXMLFile, sXSLFile)
            {
                if (fAsync) web.enablePageEvents(false);
                return embedMachine("C1Pjs", APPVERSION, idElement, sXMLFile, sXSLFile);
            }
            
            /**
             * embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
             *
             * @param {string} idElement
             * @param {string} sXMLFile
             * @param {string} sXSLFile
             * @param {string} [sStateFile]
             * @return {boolean} true if successful, false if error
             */
            function embedPC(idElement, sXMLFile, sXSLFile, sStateFile)
            {
                if (fAsync) web.enablePageEvents(false);
                return embedMachine("PCjs", APPVERSION, idElement, sXMLFile, sXSLFile, sStateFile);
            }
            
            /**
             * Prevent the Closure Compiler from renaming functions we want to export, by adding them
             * as (named) properties of a global object.
             */
            if (APPNAME == "PCjs") {
                window['embedPC'] = embedPC;
            }
            
            if (APPNAME == "C1Pjs") {
                window['embedC1P'] = embedC1P;
            }
            
            window['enableEvents'] = web.enablePageEvents;
            window['sendEvent'] = web.sendPageEvent;
            
          • externs.js
            /**
             * @fileoverview Externs used by PCjs and C1Pjs (for the Closure Compiler)
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2012-Dec-04
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            var global;
            
            // var webkitAudioContext;
            
          • netlib.js
            /**
             * @fileoverview Net-related functions
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
             * @version 1.0
             * Created 2014-03-16
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /* global Buffer: false */
            
            var net = {};
            
            if (typeof module !== 'undefined') {
                var sServerRoot;
                var fs = require("fs");
                var http = require("http");
                var path = require("path");
                var url = require("url");
                var str = require("./strlib");
            }
            
            /*
             * The following are (super-secret) commands that can be added to the URL to enable special features.
             *
             * Our super-secret command processor is affectionately call Gort, and while Gort doesn't understand commands
             * like "Klaatu barada nikto", it does understand commands like "debug" and "rebuild"; eg:
             *
             *      http://www.pcjs.org/?gort=debug
             *
             * hasParm() detects the presence of the specified command, and propagateParms() is a URL filter that ensures
             * any commands listed in asPropagate are passed through to all other URLs on the same page; using any of these
             * commands also forces the page to be rebuilt and not cached (since we would never want a cached "index.html" to
             * contain/expose any of these commands).
             */
            net.GORT_COMMAND    = "gort";
            net.GORT_DEBUG      = "debug";          // use this to force uncompiled JavaScript even on a Release server
            net.GORT_NODEBUG    = "nodebug";        // use this to force uncompiled JavaScript but with DEBUG code disabled
            net.GORT_RELEASE    = "release";        // use this to force the use of compiled JavaScript even on a Debug server
            net.GORT_REBUILD    = "rebuild";        // use this to force the "index.html" in the current directory to be rebuilt
            
            net.REVEAL_COMMAND  = "reveal";
            net.REVEAL_PDFS     = "pdfs";
            
            /*
             * This is a list of the URL parameters that propagateParms() will propagate from the requester's URL to
             * other URLs provided by the requester.
             */
            var asPropagate  = [net.GORT_COMMAND, "autostart"];
            
            /**
             * hasParm(sParm, sValue, req)
             *
             * @param {string} sParm
             * @param {string|null} sValue (pass null to check for the presence of ANY sParm)
             * @param {Object} [req] is the web server's (ie, Express) request object, if any
             * @return {boolean} true if the request Object contains the specified parameter/value, false if not
             *
             * TODO: Consider whether sParm === null should check for the presence of ANY parameter in asPropagate.
             */
            net.hasParm = function(sParm, sValue, req)
            {
                return (req && req.query && req.query[sParm] && (!sValue || req.query[sParm] == sValue));
            };
            
            /**
             * propagateParms(sURL, req)
             *
             * Propagates any "special" query parameters (as listed in asPropagate) from the given
             * request object (req) to the given URL (sURL).
             *
             * We do not modify an sURL that already contains a '?' OR that begins with a protocol
             * (eg, http:, mailto:, etc), in order to keep this function simple, since it's only for
             * debugging purposes anyway.  I also considered blowing off any URLs with a '#' for the
             * same reason, since any hash string must follow any query parameters, but stripping
             * and re-appending the hash string is pretty trivial, so we do handle that.
             *
             * TODO: Make propagateParms() more general-purpose (eg, capable of detecting any URL
             * to the same site, and capable of merging any of our "special" query parameters with any
             * existing query parameters.
             *
             * @param {string|null} sURL
             * @param {Object} [req] is the web server's (ie, Express) request object, if any
             * @return {string} massaged sURL
             */
            net.propagateParms = function(sURL, req)
            {
                if (sURL !== null && sURL.indexOf('?') < 0) {
                    var i;
                    var sHash = "";
                    if ((i = sURL.indexOf('#')) >= 0) {
                        sHash = sURL.substr(i);
                        sURL = sURL.substr(0, i);
                    }
                    var match = sURL.match(/^([a-z])+:(.*)/);
                    if (!match && req && req.query) {
                        for (i = 0; i < asPropagate.length; i++) {
                            var sQuery = asPropagate[i];
                            var sValue;
                            if ((sValue = req.query[sQuery])) {
                                var sParm = (sURL.indexOf('?') < 0? '?' : '&');
                                sParm += sQuery + '=';
                                if (sURL.indexOf(sParm) < 0) sURL += sParm + encodeURIComponent(sValue);
                            }
                        }
                    }
                    sURL += sHash;
                }
                return sURL;
            };
            
            /**
             * encodeURL(sURL, req, fDebug)
             *
             * Used to encodes any URLs presented on the current page, using this 3-step (um, 4-step) process:
             *
             *  1) Replace any backslashes with slashes, in case the URL was derived from a file system path
             *  2) Remap links that begin with "static/" to the corresponding URL at "http://static.pcjs.org/"
             *  3) Transform any "htmlspecialchars" into the corresponding entities, using encodeURI()
             *  4) Massage the result with net.propagateParms(), so that any special parameters are passed along
             *
             * @param {string} sURL
             * @param {Object} req is the web server's (ie, Express) request object, if any
             * @param {boolean} [fDebug]
             * @return {string} encoded URL
             */
            net.encodeURL = function(sURL, req, fDebug)
            {
                if (sURL) {
                    sURL = sURL.replace(/\\/g, '/');
                    if (!fDebug) {
                        if (sURL.match(/^[^:?]*static\//)) {
                            if (sURL.charAt(0) != '/') sURL = path.join(req.path, sURL);
                            sURL = "http://static.pcjs.org" + sURL.replace("/static/", "/");
                        }
                    }
                    return net.propagateParms(encodeURI(sURL), req);
                }
                return sURL;
            };
            
            /**
             * isRemote(sPath)
             *
             * @param {string} sPath
             * @return {boolean} true if sPath is a (supported) remote path, false if not
             *
             * TODO: Add support for FTP? HTTPS? Anything else?
             */
            net.isRemote = function(sPath)
            {
                return (sPath.indexOf("http:") === 0);
            };
            
            /**
             * getStat(sURL, done)
             *
             * @param {string} sURL
             * @param {function(Error,Object)} done
             */
            net.getStat = function(sURL, done)
            {
                var options = url.parse(sURL);
                options.method = "HEAD";
                options.path = options.pathname;    // TODO: Determine the necessity of aliasing this
                var req = http.request(options, function(res) {
                    var err = null;
                    var stat = null;
                    // console.log(JSON.stringify(res.headers));
                    if (res.statusCode == 200) {
                        /*
                         * Apparently Node lower-cases response headers (at least incoming headers, despite
                         * lots of amusing whining by certain people in the Node community), which seems like
                         * a good thing, because that means I can do two simple key look-ups.
                         */
                        var sLength = res.headers['content-length'];
                        var sModified = res.headers['last-modified'];
                        stat = {
                            size: sLength? parseInt(sLength, 10) : -1,
                            mtime: sModified? new Date(sModified) : null,
                            remote: true            // an additional property we provide to indicate this is not your normal stats object
                        };
                    } else {
                        err = new Error("unexpected response code: " + res.statusCode);
                    }
                    done(err, stat);
                });
                req.on('error', function(err) {
                    done(err, null);
                });
                req.end();
            };
            
            /**
             * getFile(sURL, sEncoding, done)
             *
             * @param {string} sURL is the source file
             * @param {string|null} sEncoding is the encoding to assume, if any
             * @param {function(Error,number,(string|Buffer))} done receives an Error, an HTTP status code, and a Buffer (if any)
             *
             * TODO: Add support for FTP? HTTPS? Anything else?
             */
            net.getFile = function(sURL, sEncoding, done)
            {
                /*
                 * Buffer objects are a fixed size, so my choices are: 1) call getStat() first, hope it returns
                 * the true size, and then preallocate a buffer; or 2) create a new, larger buffer every time a new
                 * chunk arrives.  The latter seems best.
                 *
                 * However, if an encoding is given, we'll simply concatenate all the data into a String and return
                 * that instead.  Note that the incoming data is always a Buffer, but concatenation with a String
                 * performs an implied "toString()" on the Buffer.
                 *
                 * WARNING: Even when an encoding is provided, we don't make any attempt to verify that the incoming
                 * data matches that encoding.
                 */
                var sFile = "";
                var bufFile = null;
                http.get(sURL, function(res) {
                    res.on('data', function(data) {
                        if (sEncoding) {
                            sFile += data;
                            return;
                        }
                        if (!bufFile) {
                            bufFile = data;
                            return;
                        }
                        /*
                         * We need to grow bufFile.  I used to do this myself, using the "copy" method:
                         *
                         *      buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
                         *
                         * which defaults to 0 for [targetStart] and [sourceStart], but the docs don't clearly
                         * define the default value for [sourceEnd].  They say "buffer.length", but there is no
                         * parameter here named "buffer".  Let's hope that in the case of "bufFile.copy(buf)"
                         * they meant "bufFile.length".
                         *
                         * However, it turns out this is moot, because there's a new kid in town: Buffer.concat().
                         *
                         *      buf = new Buffer(bufFile.length + data.length);
                         *      bufFile.copy(buf);
                         *      data.copy(buf, bufFile.length);
                         *      bufFile = buf;
                         */
                        bufFile = Buffer.concat([bufFile, data], bufFile.length + data.length);
                    }).on('end', function() {
                        /*
                         * TODO: Decide what to do when res.statusCode is actually an error code (eg, 404), because
                         * in such cases, the file content will likely just be an HTML error page.
                         */
                        if (res.statusCode < 400) {
                            done(null, res.statusCode, sEncoding? sFile : bufFile);
                        } else {
                            done(new Error(sEncoding? sFile : bufFile), res.statusCode, null);
                        }
                    }).on('error', function(err) {
                        done(err, res.statusCode, null);
                    });
                });
            };
            
            /**
             * downloadFile(sURL, sFile, done)
             *
             * @param {string} sURL is the source file
             * @param {string} sFile is a fully-qualified target file
             * @param {function(Error,number)} done is a callback that receives an Error and a HTTP status code
             */
            net.downloadFile = function(sURL, sFile, done)
            {
                var file = fs.createWriteStream(sFile);
            
                /*
                 * http.get() accepts a "url" string in lieu of an "options" object; it automatically builds
                 * the latter from the former using url.parse(). This is good, because it relieves me from
                 * building my own "options" object, and also from wondering why http functions expect "options"
                 * to contain a "path" property, whereas url.parse() returns a "pathname" property.
                 *
                 * Either the documentation isn't quite right for url.parse() or http.request() (the big brother
                 * of http.get), or one of those "options" properties is aliased to the other, or...?
                 */
                http.get(sURL, function(res) {
                    res.on('data', function(data) {
                        file.write(data);
                    }).on('end', function() {
                        file.end();
                        /*
                         * TODO: We should try to update the file's modification time to match the 'last-modified'
                         * response header value, if any.
                         *
                         * TODO: Decide what to do when res.statusCode is actually an error code (eg, 404), because
                         * in such cases, the file content will likely just be an HTML error page.
                         */
                        done(null, res.statusCode);
                    }).on('error', function(err) {
                        done(err, res.statusCode);
                    });
                });
            };
            
            /**
             * loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
             *
             * Request the specified resource (sURL), and once the request is complete,
             * optionally call the specified method (fnNotify) of the specified component (componentNotify).
             *
             * TODO: Figure out how we can strongly type the fnNotify parameter, because the Closure Compiler has issues with:
             *
             *      {function(this:Component, string, (string|null), number, (number|string|null|Object|Array|undefined))} [fnNotify]
             *
             * NOTE: This function is a mirror image of the weblib version, for server-side component testing within Node;
             * since it is NOT intended for production use, it may make liberal use of synchronous functions, warning messages, etc.
             *
             * @param {string} sURL
             * @param {boolean} [fAsync] is true for an asynchronous request
             * @param {Object|null} [data] for a POST request (default is a GET request)
             * @param {Component} [componentNotify]
             * @param {function(...)} [fnNotify]
             * @param {number|string|null|Object|Array} [pNotify] optional fnNotify parameter
             * @return {Array} containing errorCode and responseText (empty array if async request)
             */
            net.loadResource = function(sURL, fAsync, data, componentNotify, fnNotify, pNotify) {
                var nErrorCode = -1;
                var sResponse = null;
                if (net.isRemote(sURL)) {
                    console.log('net.loadResource("' + sURL + '"): unimplemented');
                } else {
                    if (!sServerRoot) {
                        sServerRoot = path.join(path.dirname(fs.realpathSync(__filename)), "../../../");
                    }
                    var sBaseName = str.getBaseName(sURL);
                    var sFile = path.join(sServerRoot, sURL);
                    if (fAsync) {
                        fs.readFile(sFile, {encoding: "utf8"}, function(err, s) {
                            /*
                             * TODO: If err is set, is there an error code we should return (instead of -1)?
                             */
                            if (!err) {
                                sResponse = s;
                                nErrorCode = 0;
                            }
                            if (fnNotify) {
                                if (!componentNotify) {
                                    fnNotify(sBaseName, sResponse, nErrorCode, pNotify);
                                } else {
                                    fnNotify.call(componentNotify, sBaseName, sResponse, nErrorCode, pNotify);
                                }
                            }
                        });
                        return [];
                    } else {
                        try {
                            sResponse = fs.readFileSync(sFile, {encoding: "utf8"});
                            nErrorCode = 0;
                        } catch(err) {
                            /*
                             * TODO: If err is set, is there an error code we should return (instead of -1)?
                             */
                            console.log(err.message);
                        }
                        if (fnNotify) {
                            if (!componentNotify) {
                                fnNotify(sBaseName, sResponse, nErrorCode, pNotify);
                            } else {
                                fnNotify.call(componentNotify, sBaseName, sResponse, nErrorCode, pNotify);
                            }
                        }
                    }
                }
                return [nErrorCode, sResponse];
            };
            
            if (typeof module !== 'undefined') module.exports = net;
            
          • nodebug.js
            /**
             * @fileoverview Compile-time definitions for non-DEBUG configurations.
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-Aug-22
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of PCjs, which is part of the JavaScript Machines Project (aka JSMachines)
             * at <http://jsmachines.net/> and <http://pcjs.org/>.
             *
             * PCjs is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * PCjs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with PCjs.  If not,
             * see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some PCjs files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * PCjs program for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /* global DEBUG: true */
            
            /*
             * In the compiled case, we rely on the Closure Compiler to override DEBUG, setting it to false,
             * so that all DEBUG-only code will be removed by the compiler.
             *
             * However, when we're in "development mode" and want to run uncompiled code without any DEBUG-only
             * code, we must arrange for this additional file, nodebug.js, to be loaded as early as possible,
             * which will then set DEBUG to false at runtime.
             */
            DEBUG = false;
            
          • proclib.js
            /**
             * @fileoverview Process-related helper functions
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
             * @version 1.0
             * Created 2014-05-07
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            var proc = {};
            
            /**
             * getArgs()
             *
             * Processes command-line arguments.  Arguments may be introduced by either
             * a double-hyphen (--) or a long dash (—), and argument values, if any, must be
             * separated by an "=" without any intervening whitespace.  Arguments without
             * an explicit value default to true, and any argument appearing more than once
             * is automatically converted to an Array.
             * 
             * Single-hyphen (-) arguments are allowed as well; they are treated as a series
             * of single-character arguments, each set to true, and any of these arguments
             * appearing more than once is discarded.
             *
             * @return {{argc:number, argv:{}}}
             */
            proc.getArgs = function() {
                var argc = 0;
                var argv = {};
                for (var i = 2; i < process.argv.length; i++) {
                    var j, sSep;
                    var sArg = process.argv[i];
                    if (!sArg.indexOf(sSep = "--") || !sArg.indexOf(sSep = "—")) {
                        sArg = sArg.substr(sSep.length);
                        var sValue = true;
                        j = sArg.indexOf("=");
                        if (j > 0) {
                            sValue = sArg.substr(j+1);
                            sArg = sArg.substr(0, j);
                            sValue = (sValue == "true")? true : ((sValue == "false")? false : sValue);
                        }
                        if (argv[sArg] === undefined) {
                            argc++;
                            argv[sArg] = sValue;
                        } else {
                            // console.log("too many '" + sArg + "' arguments");
                            if (typeof argv[sArg] == "string") {
                                argv[sArg] = [argv[sArg]];
                            }
                            argv[sArg].push(sValue);
                        }
                    } else if (!sArg.indexOf("-")) {
                        for (j = 1; j < sArg.length; j++) {
                            var ch = sArg.charAt(j);
                            if (argv[ch] === undefined) {
                                argv[ch] = true;
                                argc++;
                            }
                        } 
                    }
                }
                return {argc: argc, argv: argv};
            };
            
            if (typeof module !== 'undefined') module.exports = proc;
            
          • reportapi.js
            /**
             * @fileoverview Report API, as defined by httpapi.js
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-13
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            var ReportAPI = {
                ENDPOINT:       "/api/v1/report",
                QUERY: {
                    APP:        "app",
                    VER:        "ver",
                    URL:        "url",
                    USER:       "user",
                    TYPE:       "type",
                    DATA:       "data"
                },
                TYPE: {
                    BUG:        "bug"
                },
                RES: {
                    OK:         "Thank you"
                }
            };
            
            if (typeof module !== 'undefined') module.exports = ReportAPI;
          • sockets.js
            /**
             * @fileoverview Experimental code included by HTMLOut() only if "--sockets"
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-Apr-29
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /* global io: false */
            
            // connect to the socket server
            var socket = io.connect();
            
            // if we get an "info" emit from the socket server then console.log the data we receive
            socket.on('info', function (data) {
                console.log(data);
            });
          • strlib.js
            /**
             *  @fileoverview String-related helper functions
             *  @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
             *  @version 1.0
             *  Created 2014-03-09
             *
             *  Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            var str = {};
            
            /**
             * isValidInt(s, base)
             *
             * Since the built-in parseInt() function has the annoying feature of returning a partial value
             * when it encounters an invalid character (eg, parseInt("foo", 16) returns 0xf), use this function
             * to validate the entire string first.
             *
             * @param {string} s is the string representation of some number
             * @param {number} [base] is the radix of the number represented above (only 10 and 16 are supported)
             * @return {boolean} true if valid (or we're not sure because the base isn't recognized), false if invalid
             */
            str.isValidInt = function(s, base)
            {
                if (!base || base == 10) return s.match(/^[0-9]+$/) !== null;
                if (base == 16) return s.match(/^[0-9a-f]+$/i) !== null;
                return true;
            };
            
            /**
             * parseInt(s, base)
             *
             * This is a wrapper around the built-in parseInt() function, which recognizes certain prefixes (eg,
             * '$' or "0x" for hex) and suffixes (eg, 'h' for hex or '.' for decimal), and then calls isValidInt()
             * to ensure we don't get partial values (see isValidInt() for details).
             *
             * @param {string} s is the string representation of some number
             * @param {number} [base] is the default radix to use (default is 16); can be overridden by prefixes/suffixes
             * @return {number|undefined} corresponding value, or undefined if invalid
             */
            str.parseInt = function(s, base)
            {
                var value;
                if (s) {
                    if (!base) base = 16;
                    if (s.charAt(0) == '$') {
                        base = 16;
                        s = s.substr(1);
                    } else if (s.substr(0, 2) == "0x") {
                        base = 16;
                        s = s.substr(2);
                    } else {
                        var chSuffix = s.charAt(s.length-1).toLowerCase();
                        if (chSuffix == 'h') {
                            base = 16;
                            chSuffix = null;
                        }
                        else if (chSuffix == '.') {
                            base = 10;
                            chSuffix = null;
                        }
                        if (chSuffix === null) s = s.substr(0, s.length-1);
                    }
                    var v;
                    if (str.isValidInt(s, base) && !isNaN(v = parseInt(s, base))) {
                        value = v|0;
                    }
                }
                return value;
            };
            
            /**
             * toHex(n, cch)
             *
             * Converts an integer to hex, with the specified number of digits (up to the default of 8).
             *
             * You might be tempted to use the built-in n.toString(16) instead, but it doesn't zero-pad and it
             * doesn't properly convert negative values; for example, if n is -2147483647, then n.toString(16)
             * will return "-7fffffff" instead of "80000001".  Moreover, if n is undefined, n.toString() will throw
             * an exception, whereas toHex() will simply return '?' characters.
             *
             * NOTE: The following work-around (adapted from code found on StackOverflow) would be another solution,
             * taking care of negative values, zero-padding, and upper-casing, but not undefined/NaN values:
             *
             *      s = (n < 0? n + 0x100000000 : n).toString(16);
             *      s = "00000000".substr(0, 8 - s.length) + s;
             *      s = s.substr(0, cch).toUpperCase();
             *
             * @param {number|null|undefined} n is a 32-bit value
             * @param {number} [cch] is the desired number of hex digits (8 is both the default and the maximum)
             * @return {string} the hex representation of n
             */
            str.toHex = function(n, cch)
            {
                var s = "";
                if (cch === undefined) {
                    cch = 8;
                } else {
                    if (cch > 8) cch = 8;
                }
                /*
                 * An initial "falsey" check for null takes care of both null and undefined;
                 * we can't rely entirely on isNaN(), because isNaN(null) returns false, oddly enough.
                 */
                if (n == null || isNaN(n)) {
                    while (cch-- > 0) s = '?' + s;
                } else {
                    while (cch-- > 0) {
                        var d = n & 0xf;
                        d += (d >= 0 && d <= 9? 0x30 : 0x41 - 10);
                        s = String.fromCharCode(d) + s;
                        n >>= 4;
                    }
                }
                return s;
            };
            
            /**
             * toHexByte(b)
             *
             * Alias for "0x" + str.toHex(b, 2)
             *
             * @param {number|null|undefined} b is a byte value
             * @return {string} the hex representation of b
             */
            str.toHexByte = function(b)
            {
                return "0x" + str.toHex(b, 2);
            };
            
            /**
             * toHexWord(w)
             *
             * Alias for "0x" + str.toHex(w, 4)
             *
             * @param {number|null|undefined} w is a word (16-bit) value
             * @return {string} the hex representation of w
             */
            str.toHexWord = function(w)
            {
                return "0x" + str.toHex(w, 4);
            };
            
            /**
             * toHexLong(l)
             *
             * Alias for "0x" + toHex(l)
             *
             * @param {number|null|undefined} l is a dword (32-bit) value
             * @return {string} the hex representation of w
             */
            str.toHexLong = function(l)
            {
                return "0x" + str.toHex(l);
            };
            
            /**
             * getBaseName(sFileName, fStripExt)
             *
             * This is a poor-man's version of Node's path.basename(), which Node-only components should use instead.
             *
             * Note that fStripExt can be used to strip ANY extension, whereas path.basename() will strip the extension only
             * if it matches the second parameter (eg, path.basename("/foo/bar/baz/asdf/quux.html", ".html") returns "quux").
             *
             * @param {string} sFileName
             * @param {boolean} [fStripExt]
             * @return {string}
             */
            str.getBaseName = function(sFileName, fStripExt)
            {
                var sBaseName = sFileName;
            
                var i = sFileName.lastIndexOf('/');
                if (i >= 0) sBaseName = sFileName.substr(i + 1);
            
                /*
                 * This next bit is a kludge to clean up names that are part of a URL that includes unsightly query parameters.
                 */
                i = sBaseName.indexOf('&');
                if (i > 0) sBaseName = sBaseName.substr(0, i);
            
                if (fStripExt) {
                    i = sBaseName.lastIndexOf(".");
                    if (i > 0) {
                        sBaseName = sBaseName.substring(0, i);
                    }
                }
                return sBaseName;
            };
            
            /**
             * getExtension(sFileName)
             *
             * This is a poor-man's version of Node's path.extname(), which Node-only components should use instead.
             *
             * Note that we EXCLUDE the period from the returned extension, whereas path.extname() includes it.
             *
             * @param {string} sFileName
             * @return {string} the filename's extension (in lower-case and EXCLUDING the "."), or an empty string
             */
            str.getExtension = function(sFileName)
            {
                var sExtension = "";
                var i = sFileName.lastIndexOf(".");
                if (i >= 0) {
                    sExtension = sFileName.substr(i + 1).toLowerCase();
                }
                return sExtension;
            };
            
            /**
             * endsWith(s, sSuffix)
             *
             * @param {string} s
             * @param {string} sSuffix
             * @return {boolean} true if s ends with sSuffix, false if not
             */
            str.endsWith = function(s, sSuffix)
            {
                return s.indexOf(sSuffix, s.length - sSuffix.length) !== -1;
            };
            
            str.aHTMLEscapeMap = {
                '&': '&amp;',
                '<': '&lt;',
                '>': '&gt;',
                '"': '&quot;',
                "'": '&#039;'
            };
            
            /**
             * escapeHTML(sHTML)
             *
             * @param {string} sHTML
             * @return {string} with HTML entities "escaped", similar to PHP's htmlspecialchars()
             */
            str.escapeHTML = function(sHTML)
            {
                return sHTML.replace(/[&<>"']/g, function(m) {
                    return str.aHTMLEscapeMap[m];
                });
            };
            
            /**
             * replaceAll(sFind, sReplace, s)
             *
             * @param {string} sFind
             * @param {string} sReplace
             * @param {string} s
             * @return {string}
             */
            str.replaceAll = function(sFind, sReplace, s)
            {
                var a = {};
                a[sFind] = sReplace;
                return str.replaceArray(a, s);
            };
            
            /**
             * replaceArray(a, s)
             *
             * @param {Object} a
             * @param {string} s
             * @return {string}
             */
            str.replaceArray = function(a, s)
            {
                var sMatch = "";
                for (var k in a) {
                    /*
                     * As noted in:
                     *
                     *      http://www.regexguru.com/2008/04/escape-characters-only-when-necessary/
                     *
                     * inside character classes, only backslash, caret, hyphen and the closing bracket need to be
                     * escaped.  And in fact, if you ensure that the closing bracket is first, the caret is not first,
                     * and the hyphen is last, you can avoid escaping those as well.
                     */
                    k = k.replace(/([\\[\]*{}().+?])/g, "\\$1");
                    sMatch += (sMatch? '|' : '') + k;
                }
                return s.replace(new RegExp('(' + sMatch + ')', "g"), function(m) {
                    return a[m];
                });
            };
            
            /**
             * pad(s, cch)
             *
             * Note that the maximum amount of padding currently supported is 40 spaces.
             *
             * @param {string} s is a string
             * @param {number} cch is desired length
             * @returns {string} the original string (s) with spaces padding it to the specified length
             */
            str.pad = function(s, cch)
            {
                return s + "                                        ".substr(0, cch - s.length);
            };
            
            /**
             * trim(s)
             *
             * @param {string} s
             * @returns {string}
             */
            str.trim = function(s)
            {
                if (String.prototype.trim) {
                    return s.trim();
                }
                return s.replace(/^\s+|\s+$/g, "");
            };
            
            if (typeof module !== 'undefined') module.exports = str;
            
          • userapi.js
            /**
             * @fileoverview User API, as defined by httpapi.js
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a>
             * @version 1.0
             * Created 2014-May-13
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            /*
             * Examples of User API requests:
             * 
             *      web.getHost() + UserAPI.ENDPOINT + '?' + UserAPI.QUERY.REQ + '=' + UserAPI.REQ.VERIFY + '&' + UserAPI.QUERY.USER + '=' + sUser;
             */
            
            var UserAPI = {
                ENDPOINT:       "/api/v1/user",
                QUERY: {
                    REQ:        "req",      // specifies a request 
                    USER:       "user",     // specifies a user ID
                    STATE:      "state",    // specifies a state ID 
                    DATA:       "data"      // specifies state data
                },
                REQ: {
                    CREATE:     "create",   // creates a user ID
                    VERIFY:     "verify",   // requests verification of a user ID
                    STORE:      "store",    // stores a machine state on the server
                    LOAD:       "load"      // loads a machine state from the server
                },
                RES: {
                    CODE:       "code",
                    DATA:       "data"
                },
                CODE: {
                    OK:         "ok",
                    FAIL:       "error"
                },
                FAIL: {
                    DUPLICATE:  "user already exists",
                    VERIFY:     "unable to verify user",
                    BADSTATE:   "invalid state parameter",
                    NOSTATE:    "no machine state",
                    BADLOAD:    "unable to load machine state",
                    BADSTORE:   "unable to save machine state"
                }
            };
            
            if (typeof module !== 'undefined') module.exports = UserAPI;
          • usrlib.js
            /**
             *  @fileoverview Assorted helper functions
             *  @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
             *  @version 1.0
             *  Created 2014-03-09
             *
             *  Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            "use strict";
            
            var usr = {};
            
            /**
             * binarySearch(a, v, fnCompare)
             *
             * @param {Array} a is an array
             * @param {number|string|Array|Object} v
             * @param {function((number|string|Array|Object), (number|string|Array|Object))} [fnCompare]
             * @return {number} the index of matching entry if non-negative, otherwise the index of the insertion point
             */
            usr.binarySearch = function(a, v, fnCompare) {
                var left = 0;
                var right = a.length;
                var found = 0;
                if (fnCompare === undefined) {
                    fnCompare = function(a, b) {
                        return a > b? 1 : a < b? -1 : 0;
                    };
                }
                while (left < right) {
                    var middle = (left + right) >> 1;
                    var compareResult;
                    compareResult = fnCompare(v, a[middle]);
                    if (compareResult > 0) {
                        left = middle + 1;
                    } else {
                        right = middle;
                        found = !compareResult;
                    }
                }
                return found? left : ~left;
            };
            
            /**
             * binaryInsert(a, v, fnCompare)
             *
             * If element v already exists in array a, the array is unchanged (we don't allow duplicates); otherwise, the
             * element is inserted into the array at the appropriate index.
             *
             * @param {Array} a is an array
             * @param {number|string|Array|Object} v is the value to insert
             * @param {function((number|string|Array|Object), (number|string|Array|Object))} [fnCompare]
             */
            usr.binaryInsert = function(a, v, fnCompare) {
                var index = usr.binarySearch(a, v, fnCompare);
                if (index < 0) {
                    a.splice(-(index + 1), 0, v);
                }
            };
            
            /**
             * getTime()
             *
             * @return {number} the current time, in milliseconds
             */
            usr.getTime = Date.now || function() { return +new Date(); };
            
            /**
             * getTimestamp()
             *
             * @return {string} timestamp containing the current date and time ("yyyy-mm-dd hh:mm:ss")
             */
            usr.getTimestamp = function() {
                var date = new Date();
                var padNum = function(n) {
                    return (n < 10? "0" : "") + n;
                };
                return date.getFullYear() + "-" + padNum(date.getMonth() + 1) + "-" + padNum(date.getDate()) + " " + padNum(date.getHours()) + ":" + padNum(date.getMinutes()) + ":" + padNum(date.getSeconds());
            };
            
            /**
             * getMonthDays(nMonth, nYear)
             *
             * Note that if we're being called on behalf of the RTC, its year is always truncated to two digits (mod 100),
             * so we have no idea what century the year 0 might refer to.  When using the normal leap-year formula, 0 fails
             * the mod 100 test but passes the mod 400 test, so as far as the RTC is concerned, every century year is a leap
             * year.  Since we're most likely dealing with the year 2000, that's fine, since 2000 was also a leap year.
             *
             * TODO: There IS a separate CMOS byte that's supposed to be set to CMOS_ADDR.CENTURY_DATE; it's always BCD,
             * so theoretically it will contain values like 0x19 or 0x20 (for the 20th and 21st centuries, respectively), and
             * we could add that as another parameter to this function, to improve the accuracy, but that would go beyond what
             * a real RTC actually does.
             *
             * @param {number} nMonth (1-12)
             * @param {number} nYear (normally a 4-digit year, but it may also be mod 100)
             * @return {number} the maximum (1-based) day allowed for the specified month and year
             */
            usr.getMonthDays = function(nMonth, nYear)
            {
                var nDays = usr.aMonthDays[nMonth - 1];
                if (nDays == 28) {
                    if ((nYear % 4) === 0 && ((nYear % 100) || (nYear % 400) === 0)) {
                        nDays++;
                    }
                }
                return nDays;
            };
            
            usr.asDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
            usr.asMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
            usr.aMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
            
            /**
             * formatDate(sFormat, date)
             *
             * @param {string} sFormat (eg, "F j, Y", "Y-m-d H:i:s")
             * @param {Date} [date] (default is the current time)
             * @return {string}
             *
             * Supported identifiers in sFormat include:
             *
             *      a:  lowercase ante meridiem and post meridiem (am or pm)
             *      d:  day of the month, 2 digits with leading zeros (01,...,31)
             *      g:  hour in 12-hour format, without leading zeros (1,...,12)
             *      i:  minutes, with leading zeros (00,...,59)
             *      j:  day of the month, without leading zeros (1,...,31)
             *      l:  day of the week ("Sunday",...,"Saturday")
             *      m:  month, with leading zeros (01,...,12)
             *      s:  seconds, with leading zeros (00,...,59)
             *      F:  month ("January",...,"December")
             *      H:  hour in 24-hour format, with leading zeros (00,...,23)
             *      Y:  year (eg, 2014)
             *
             * For more inspiration, see: http://php.net/manual/en/function.date.php
             */
            usr.formatDate = function(sFormat, date) {
                var sDate = "";
                if (!date) date = new Date();
                var iHour = date.getHours();
                var iDay = date.getDate();
                var iMonth = date.getMonth() + 1;
                for (var i = 0; i < sFormat.length; i++) {
                    var ch;
                    switch((ch = sFormat.charAt(i))) {
                    case 'a':
                        sDate += (iHour < 12? "am" : "pm");
                        break;
                    case 'd':
                        sDate += ('0' + iDay).slice(-2);
                        break;
                    case 'g':
                        sDate += (!iHour? 12 : (iHour > 12? iHour - 12 : iHour));
                        break;
                    case 'i':
                        sDate += ('0' + date.getMinutes()).slice(-2);
                        break;
                    case 'j':
                        sDate += iDay;
                        break;
                    case 'l':
                        sDate += usr.asDays[date.getDay()];
                        break;
                    case 'm':
                        sDate += ('0' + iMonth).slice(-2);
                        break;
                    case 's':
                        sDate += ('0' + date.getSeconds()).slice(-2);
                        break;
                    case 'F':
                        sDate += usr.asMonths[iMonth - 1];
                        break;
                    case 'H':
                        sDate += ('0' + iHour).slice(-2);
                        break;
                    case 'Y':
                        sDate += date.getFullYear();
                        break;
                    default:
                        sDate += ch;
                        break;
                    }
                }
                return sDate;
            };
            
            /**
             * @typedef {{
             *  mask:       number,
             *  shift:      number
             * }}
             */
            var BitField;
            
            /**
             * @typedef {Object.<BitField>}
             */
            var BitFields;
            
            /**
             * defineBitFields(bfs)
             *
             * Prepares a bit field definition for use with getBitField() and setBitField(); eg:
             *
             *      var bfs = usr.defineBitFields({num:20, count:8, btmod:1, type:3});
             *
             * The above defines a set of bit fields containg four fields: num (bits 0-19), count (bits 20-27), btmod (bit 28), and type (bits 29-31).
             *
             *      usr.setBitField(bfs.num, n, 1);
             *
             * The above set bit field "bfs.num" in numeric variable "n" to the value 1.
             *
             * @param {Object} bfs
             * @return {*} (technically, we transform the bfs object into a BitFields object, but the Closure Compiler won't let us specify that)
             */
            usr.defineBitFields = function(bfs)
            {
                var bit = 0;
                for (var f in bfs) {
                    var width = bfs[f];
                    var mask = ((1 << width) - 1) << bit;
                    bfs[f] = {mask: mask, shift: bit};
                    bit += width;
                }
                // Component.assert(bit <= 32);
                return bfs;
            };
            
            /**
             * initBitFields(bfs, ...)
             *
             * @param {BitFields} bfs
             * @param {...number} var_args
             * @return {number} a value containing all supplied bit fields
             */
            usr.initBitFields = function(bfs, var_args)
            {
                var v = 0, i = 1;
                for (var f in bfs) {
                    if (i >= arguments.length) break;
                    v = usr.setBitField(bfs[f], v, arguments[i++]);
                }
                return v;
            };
            
            /**
             * getBitField(bf, v)
             *
             * @param {BitField} bf
             * @param {number} v is a value containing bit fields
             * @return {number} the value of the bit field in v defined by bf
             */
            usr.getBitField = function(bf, v)
            {
                return (v & bf.mask) >> bf.shift;
            };
            
            /**
             * setBitField(bf, v, n)
             *
             * @param {BitField} bf
             * @param {number} v is a value containing bit fields
             * @param {number} n is a value to store in v in the bit field defined by bf
             * @return {number} updated v
             */
            usr.setBitField = function(bf, v, n)
            {
                // Component.assert(!(n & ~(bf.mask >>> bf.shift)));
                return (v & ~bf.mask) | ((n << bf.shift) & bf.mask);
            };
            
            /**
             * indexOf(a, t, i)
             *
             * Use this instead of Array.prototype.indexOf() if you can't be sure the browser supports it.
             *
             * @param {Array} a
             * @param {*} t
             * @param {number} [i]
             * @returns {number}
             */
            usr.indexOf = function(a, t, i)
            {
                if (Array.prototype.indexOf) {
                    return a.indexOf(t, i);
                }
                i = i || 0;
                if (i < 0) i += a.length;
                if (i < 0) i = 0;
                for (var n = a.length; i < n; i++) {
                    if (i in a && a[i] === t) return i;
                }
                return -1;
            };
            
            if (typeof module !== 'undefined') module.exports = usr;
            
          • weblib.js
            /**
             * @fileoverview Browser-related helper functions
             * @author <a href="mailto:Jeff@pcjs.org">Jeff Parsons</a> (@jeffpar)
             * @version 1.0
             * Created 2014-05-08
             *
             * Copyright © 2012-2015 Jeff Parsons <Jeff@pcjs.org>
             *
             * This file is part of the JavaScript Machines Project (aka JSMachines) at <http://jsmachines.net/>
             * and <http://pcjs.org/>.
             *
             * JSMachines is free software: you can redistribute it and/or modify it under the terms of the
             * GNU General Public License as published by the Free Software Foundation, either version 3
             * of the License, or (at your option) any later version.
             *
             * JSMachines is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
             * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
             * GNU General Public License for more details.
             *
             * You should have received a copy of the GNU General Public License along with JSMachines.
             * If not, see <http://www.gnu.org/licenses/gpl.html>.
             *
             * You are required to include the above copyright notice in every source code file of every
             * copy or modified version of this work, and to display that copyright notice on every screen
             * that loads or runs any version of this software (see Computer.sCopyright).
             *
             * Some JSMachines files also attempt to load external resource files, such as character-image files,
             * ROM files, and disk image files. Those external resource files are not considered part of the
             * JSMachines Project for purposes of the GNU General Public License, and the author does not claim
             * any copyright as to their contents.
             */
            
            /*
             * According to http://www.w3schools.com/jsref/jsref_obj_global.asp, these are the *global* properties
             * and functions of JavaScript-in-the-Browser:
             *
             * Property             Description
             * ---
             * Infinity             A numeric value that represents positive/negative infinity
             * NaN                  "Not-a-Number" value
             * undefined            Indicates that a variable has not been assigned a value
             *
             * Function             Description
             * ---
             * decodeURI()          Decodes a URI
             * decodeURIComponent() Decodes a URI component
             * encodeURI()          Encodes a URI
             * encodeURIComponent() Encodes a URI component
             * escape()             Deprecated in version 1.5. Use encodeURI() or encodeURIComponent() instead
             * eval()               Evaluates a string and executes it as if it was script code
             * isFinite()           Determines whether a value is a finite, legal number
             * isNaN()              Determines whether a value is an illegal number
             * Number()             Converts an object's value to a number
             * parseFloat()         Parses a string and returns a floating point number
             * parseInt()           Parses a string and returns an integer
             * String()             Converts an object's value to a string
             * unescape()           Deprecated in version 1.5. Use decodeURI() or decodeURIComponent() instead
             *
             * And according to http://www.w3schools.com/jsref/obj_window.asp, these are the properties and functions
             * of the *window* object.
             *
             * Property             Description
             * ---
             * closed               Returns a Boolean value indicating whether a window has been closed or not
             * defaultStatus        Sets or returns the default text in the statusbar of a window
             * document             Returns the Document object for the window (See Document object)
             * frames               Returns an array of all the frames (including iframes) in the current window
             * history              Returns the History object for the window (See History object)
             * innerHeight          Returns the inner height of a window's content area
             * innerWidth           Returns the inner width of a window's content area
             * length               Returns the number of frames (including iframes) in a window
             * location             Returns the Location object for the window (See Location object)
             * name                 Sets or returns the name of a window
             * navigator            Returns the Navigator object for the window (See Navigator object)
             * opener               Returns a reference to the window that created the window
             * outerHeight          Returns the outer height of a window, including toolbars/scrollbars
             * outerWidth           Returns the outer width of a window, including toolbars/scrollbars
             * pageXOffset          Returns the pixels the current document has been scrolled (horizontally) from the upper left corner of the window
             * pageYOffset          Returns the pixels the current document has been scrolled (vertically) from the upper left corner of the window
             * parent               Returns the parent window of the current window
             * screen               Returns the Screen object for the window (See Screen object)
             * screenLeft           Returns the x coordinate of the window relative to the screen
             * screenTop            Returns the y coordinate of the window relative to the screen
             * screenX              Returns the x coordinate of the window relative to the screen
             * screenY              Returns the y coordinate of the window relative to the screen
             * self                 Returns the current window
             * status               Sets or returns the text in the statusbar of a window
             * top                  Returns the topmost browser window
             *
             * Method               Description
             * ---
             * alert()              Displays an alert box with a message and an OK button
             * atob()               Decodes a base-64 encoded string
             * blur()               Removes focus from the current window
             * btoa()               Encodes a string in base-64
             * clearInterval()      Clears a timer set with setInterval()
             * clearTimeout()       Clears a timer set with setTimeout()
             * close()              Closes the current window
             * confirm()            Displays a dialog box with a message and an OK and a Cancel button
             * createPopup()        Creates a pop-up window
             * focus()              Sets focus to the current window
             * moveBy()             Moves a window relative to its current position
             * moveTo()             Moves a window to the specified position
             * open()               Opens a new browser window
             * print()              Prints the content of the current window
             * prompt()             Displays a dialog box that prompts the visitor for input
             * resizeBy()           Resizes the window by the specified pixels
             * resizeTo()           Resizes the window to the specified width and height
             * scroll()             This method has been replaced by the scrollTo() method.
             * scrollBy()           Scrolls the content by the specified number of pixels
             * scrollTo()           Scrolls the content to the specified coordinates
             * setInterval()        Calls a function or evaluates an expression at specified intervals (in milliseconds)
             * setTimeout()         Calls a function or evaluates an expression after a specified number of milliseconds
             * stop()               Stops the window from loading
             */
            
            "use strict";
            
            /* global window: true, setTimeout: false, clearTimeout: false, SITEHOST: false */
            
            if (typeof module !== 'undefined') {
                var Component;
                require("./defines");
                var str = require("./strlib");
                var ReportAPI = require("./reportapi");
            }
            
            var web = {};
            
            /*
             * We must defer loading the Component module until the function(s) requiring it are
             * called; otherwise, we create an initialization cycle in which Component requires weblib
             * and weblib requires Component.
             *
             * In an ideal world, weblib would not be dependent on Component, but we really want to use
             * its I/O functions.  The simplest solution is to create wrapper functions.
             */
            
            /**
             * log(s, type)
             *
             * For diagnostic output only.  DEBUG must be true (or "--debug" specified via the command-line)
             * for Component.log() to display anything.
             *
             * @param {string} [s] is the message text
             * @param {string} [type] is the message type
             */
            web.log = function(s, type)
            {
                if (typeof module !== 'undefined') {
                    if (!Component) Component = require("./component");
                }
                Component.log(s, type);
            };
            
            /**
             * notice(s, fPrintOnly, id)
             *
             * If Component.notice() calls web.alertUser(), it will fall back to web.log() if all else fails.
             *
             * @param {string} s is the message text
             * @param {boolean} [fPrintOnly]
             * @param {string} [id] is the caller's ID, if any
             */
            web.notice = function(s, fPrintOnly, id)
            {
                if (typeof module !== 'undefined') {
                    if (!Component) Component = require("./component");
                }
                Component.notice(s, fPrintOnly, id);
            };
            
            /**
             * loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
             *
             * Request the specified resource (sURL), and once the request is complete,
             * optionally call the specified method (fnNotify) of the specified component (componentNotify).
             *
             * TODO: Figure out how we can strongly type the fnNotify parameter, because the Closure Compiler has issues with:
             *
             *      {function(this:Component, string, (string|null), number, (number|string|null|Object|Array|undefined))} [fnNotify]
             *
             * @param {string} sURL
             * @param {boolean} [fAsync] is true for an asynchronous request
             * @param {Object} [data] for a POST request (default is a GET request)
             * @param {Component} [componentNotify]
             * @param {function(...)} [fnNotify]
             * @param {number|string|null|Object|Array} [pNotify] optional fnNotify info parameter
             * @return {Array} containing errorCode and responseText (empty array if fAsync is true)
             */
            web.loadResource = function(sURL, fAsync, data, componentNotify, fnNotify, pNotify)
            {
                fAsync = !!fAsync;          // ensure that fAsync is a valid boolean (Internet Explorer xmlHTTP functions insist on it)
                if (typeof module !== 'undefined') {
                    /*
                     * We don't even need to load Component, because we can't use any of the code below
                     * within Node anyway.  Instead, we must hand this request off to our network library.
                     *
                     *      if (!Component) Component = require("./component");
                     */
                    var net = require("./netlib");
                    return net.loadResource(sURL, fAsync, data, componentNotify, fnNotify, pNotify);
                }
                var nErrorCode = 0;
                var sURLData = null;
                var sURLName = str.getBaseName(sURL);
                var xmlHTTP = (window.XMLHttpRequest? new window.XMLHttpRequest() : new window.ActiveXObject("Microsoft.XMLHTTP"));
                if (fAsync) {
                    xmlHTTP.onreadystatechange = function() {
                        if (xmlHTTP.readyState === 4) {
                            /*
                             * The following line was recommended for WebKit, as a work-around to prevent the handler firing multiple
                             * times when debugging.  Unfortunately, that's not the only XMLHttpRequest problem that occurs when
                             * debugging, so I think the WebKit problem is deeper than that.  When we have multiple XMLHttpRequests
                             * pending, any debugging activity means most of them simply get dropped on floor, so what may actually be
                             * happening are mis-notifications rather than redundant notifications.
                             *
                             *      xmlHTTP.onreadystatechange = undefined;
                             */
                            sURLData = xmlHTTP.responseText;
                            /*
                             * The normal "success" case is an HTTP status code of 200, but when testing with files loaded
                             * from the local file system (ie, when using the "file:" protocol), we have to be a bit more "flexible".
                             */
                            if (xmlHTTP.status == 200 || !xmlHTTP.status && sURLData.length && web.getHostProtocol() == "file:") {
                                if (MAXDEBUG) web.log("xmlHTTP.onreadystatechange(" + sURL + "): returned " + sURLData.length + " bytes");
                            }
                            else {
                                nErrorCode = xmlHTTP.status || -1;
                                web.log("xmlHTTP.onreadystatechange(" + sURL + "): error code " + nErrorCode);
                            }
                            if (fnNotify) {
                                if (!componentNotify) {
                                    fnNotify(sURLName, sURLData, nErrorCode, pNotify);
                                } else {
                                    fnNotify.call(componentNotify, sURLName, sURLData, nErrorCode, pNotify);
                                }
                            }
                        }
                    };
                }
                if (data) {
                    var sData = "";
                    for (var p in data) {
                        if (!data.hasOwnProperty(p)) continue;
                        if (sData) sData += "&";
                        sData += p + '=' + encodeURIComponent(data[p]);
                    }
                    sData = sData.replace(/%20/g, '+');
                    if (MAXDEBUG) web.log("web.loadResource(POST " + sURL + "): " + sData.length + " bytes");
                    xmlHTTP.open("POST", sURL, fAsync);
                    xmlHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    xmlHTTP.send(sData);
                } else {
                    if (MAXDEBUG) web.log("web.loadResource(GET " + sURL + ")");
                    xmlHTTP.open("GET", sURL, fAsync);
                    xmlHTTP.send();
                }
                var response = [];
                if (!fAsync) {
                    sURLData = xmlHTTP.responseText;
                    if (xmlHTTP.status == 200) {
                        if (MAXDEBUG) web.log("web.loadResource(" + sURL + "): returned " + sURLData.length + " bytes");
                    } else {
                        nErrorCode = xmlHTTP.status || -1;
                        web.log("web.loadResource(" + sURL + "): error code " + nErrorCode);
                    }
                    if (fnNotify) {
                        if (!componentNotify) {
                            fnNotify(sURLName, sURLData, nErrorCode, pNotify);
                        } else {
                            fnNotify.call(componentNotify, sURLName, sURLData, nErrorCode, pNotify);
                        }
                    }
                    response = [nErrorCode, sURLData];
                }
                return response;
            };
            
            /**
             * sendReport(sApp, sVer, sURL, sUser, sType, sReport, sHostName)
             *
             * Send a report (eg, bug report) to the server.
             *
             * @param {string} sApp (eg, "PCjs")
             * @param {string} sVer (eg, "1.02")
             * @param {string} sURL (eg, "/devices/pc/machine/5150/mda/64kb/machine.xml")
             * @param {string} sUser (ie, the user key, if any)
             * @param {string} sType (eg, "bug"); one of ReportAPI.TYPE.*
             * @param {string} sReport (eg, unparsed state data)
             * @param {string} [sHostName] (default is http://SITEHOST)
             */
            web.sendReport = function(sApp, sVer, sURL, sUser, sType, sReport, sHostName)
            {
                var data = {};
                data[ReportAPI.QUERY.APP] = sApp;
                data[ReportAPI.QUERY.VER] = sVer;
                data[ReportAPI.QUERY.URL] = sURL;
                data[ReportAPI.QUERY.USER] = sUser;
                data[ReportAPI.QUERY.TYPE] = sType;
                data[ReportAPI.QUERY.DATA] = sReport;
                var sReportURL = (sHostName? sHostName : "http://" + SITEHOST) + ReportAPI.ENDPOINT;
                web.loadResource(sReportURL, true, data);
            };
            
            /**
             * getHost()
             *
             * @return {string}
             */
            web.getHost = function()
            {
                return ("http://" + (window? window.location.host : SITEHOST));
            };
            
            /**
             * getHostURL()
             *
             * @return {string|null}
             */
            web.getHostURL = function()
            {
                return (window? window.location.href : null);
            };
            
            /**
             * getHostProtocol()
             *
             * @return {string}
             */
            web.getHostProtocol = function()
            {
                return (window? window.location.protocol : "file:");
            };
            
            /**
             * getUserAgent()
             *
             * @return {string}
             */
            web.getUserAgent = function()
            {
                return (window? window.navigator.userAgent : "");
            };
            
            /**
             * alertUser(sMessage)
             *
             * @param {string} sMessage
             */
            web.alertUser = function(sMessage)
            {
                if (window) window.alert(sMessage); else web.log(sMessage);
            };
            
            /**
             * confirmUser(sPrompt)
             *
             * @param {string} sPrompt
             * @returns {boolean} true if the user clicked OK, false if Cancel/Close
             */
            web.confirmUser = function(sPrompt)
            {
                var fResponse = false;
                if (window) {
                    fResponse = window.confirm(sPrompt);
                }
                return fResponse;
            };
            
            /**
             * promptUser()
             *
             * @param {string} sPrompt
             * @param {string} [sDefault]
             * @returns {string|null}
             */
            web.promptUser = function(sPrompt, sDefault)
            {
                var sResponse = null;
                if (window) {
                    sResponse = window.prompt(sPrompt, sDefault === undefined? "" : sDefault);
                }
                return sResponse;
            };
            
            /**
             * fLocalStorage
             *
             * true if localStorage support exists, is enabled, and works; "falsey" otherwise
             *
             * @type {boolean|null}
             */
            web.fLocalStorage = null;
            
            /**
             * TODO: Is there any way to get the Closure Compiler to stop inlining this string?  This
             * isn't cutting it.
             *
             * @const {string}
             */
            web.sLocalStorageTest = "PCjs.localStorage";
            
            /**
             * hasLocalStorage
             *
             * true if localStorage support exists, is enabled, and works; false otherwise
             *
             * @return {boolean}
             */
            web.hasLocalStorage = function() {
                if (web.fLocalStorage == null) {
                    var f = false;
                    if (window) {
                        try {
                            window.localStorage.setItem(web.sLocalStorageTest, web.sLocalStorageTest);
                            f = (window.localStorage.getItem(web.sLocalStorageTest) == web.sLocalStorageTest);
                            window.localStorage.removeItem(web.sLocalStorageTest);
                        } catch(e) {
                            web.logLocalStorageError(e);
                            f = false;
                        }
                    }
                    web.fLocalStorage = f;
                }
                return web.fLocalStorage;
            };
            
            /**
             * logLocalStorageError(e)
             *
             * @param {Error} e is an exception
             */
            web.logLocalStorageError = function(e)
            {
                web.log(e.message, "localStorage error");
            };
            
            /**
             * getLocalStorageItem(sKey)
             *
             * Returns the requested key value, or null if the key does not exist, or undefined if localStorage is not available
             *
             * @param {string} sKey
             * @return {string|null|undefined} sValue
             */
            web.getLocalStorageItem = function(sKey)
            {
                var sValue;
                if (window) {
                    try {
                        sValue = window.localStorage.getItem(sKey);
                    } catch(e) {
                        web.logLocalStorageError(e);
                    }
                }
                return sValue;
            };
            
            /**
             * setLocalStorageItem(sKey, sValue)
             *
             * @param {string} sKey
             * @param {string} sValue
             * @return {boolean} true if localStorage is available, false if not
             */
            web.setLocalStorageItem = function(sKey, sValue)
            {
                try {
                    window.localStorage.setItem(sKey, sValue);
                    return true;
                } catch(e) {
                    web.logLocalStorageError(e);
                }
                return false;
            };
            
            /**
             * removeLocalStorageItem(sKey)
             *
             * @param {string} sKey
             */
            web.removeLocalStorageItem = function(sKey)
            {
                try {
                    window.localStorage.removeItem(sKey);
                } catch(e) {
                    web.logLocalStorageError(e);
                }
            };
            
            /**
             * getLocalStorageKeys()
             *
             * @return {Array}
             */
            web.getLocalStorageKeys = function()
            {
                var a = [];
                try {
                    for (var i = 0, c = window.localStorage.length; i < c; i++) {
                        a.push(window.localStorage.key(i));
                    }
                } catch(e) {
                    web.logLocalStorageError(e);
                }
                return a;
            };
            
            /**
             * reloadPage()
             */
            web.reloadPage = function()
            {
                if (window) window.location.reload();
            };
            
            /**
             * isUserAgent(s)
             *
             * Check the browser's user-agent string for the given substring; "iOS" and "MSIE" are special values you can
             * use that will match any iOS or MSIE browser, respectively (even IE11, in the case of "MSIE").
             *
             * 2013-11-06: In a questionable move, MSFT changed the user-agent reported by IE11 on Windows 8.1, eliminating
             * the "MSIE" string (which MSDN calls a "version token"; see http://msdn.microsoft.com/library/ms537503.aspx);
             * they say "public websites should rely on feature detection, rather than browser detection, in order to design
             * their sites for browsers that don't support the features used by the website." So, in IE11, we get a user-agent
             * that tries to fool apps into thinking the browser is more like WebKit or Gecko:
             *
             *      Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
             *
             * That's a nice idea, but in the meantime, they hosed the XSL transform code in embed.js, which contained
             * some very critical browser-specific code; turning on IE's "Compatibility Mode" didn't help either, because
             * that's a sledgehammer solution which restores the old user-agent string but also disables other features like
             * HTML5 canvas support. As an interim solution, I'm treating any "MSIE" check as a check for either "MSIE" or
             * "Trident".
             *
             * UPDATE: I've since found ways to make the code in embed.js more browser-agnostic, so for now, there's isn't
             * any code that cares about "MSIE", but I've left the change in place, because I wouldn't be surprised if I'll
             * need more IE-specific code in the future, perhaps for things like copy/paste functionality, or mouse capture.
             *
             * @param {string} s is a substring to search for in the user-agent; as noted above, "iOS" and "MSIE" are special values
             * @return {boolean} is true if the string was found, false if not
             */
            web.isUserAgent = function(s)
            {
                if (window) {
                    var userAgent = web.getUserAgent();
                    /*
                     * Here's one case where we have to be careful with Component, because when isUserAgent() is called by
                     * the init code below, component.js hasn't been loaded yet.  The simple solution for now is to remove the call.
                     *
                     *      web.log("agent: " + userAgent);
                     *
                     * And yes, it would be pointless to use the conditional (?) operator below, if not for the Google Closure
                     * Compiler (v20130823) failing to detect the entire expression as a boolean.
                     */
                    return (s == "iOS" && userAgent.match(/(iPod|iPhone|iPad)/) && userAgent.match(/AppleWebKit/) || s == "MSIE" && userAgent.match(/(MSIE|Trident)/) || (userAgent.indexOf(s) >= 0))? true : false;
                }
                return false;
            };
            
            /**
             * isMobile()
             *
             * Check the browser's user-agent string for the substring "Mobi", as per Mozilla recommendation:
             *
             *      https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent
             *
             * @return {boolean} is true if the browser appears to be a mobile (ie, non-desktop) web browser, false if not
             */
            web.isMobile = function()
            {
                return web.isUserAgent("Mobi");
            };
            
            /**
             * getURLParameters(sParms)
             *
             * @param {string} [sParms] containing the parameter portion of a URL (ie, after the '?')
             * @return {Object} containing properties for each parameter found
             */
            web.getURLParameters = function(sParms)
            {
                var aParms = {};
                if (window) {       // an alternative to "if (typeof module === 'undefined')" if require("defines") has been invoked
                    if (!sParms) {
                        /*
                         * Note that window.location.href returns the entire URL, whereas window.location.search
                         * returns only the parameters, if any (starting with the '?', which we skip over with a substr() call).
                         */
                        sParms = window.location.search.substr(1);
                    }
                    var match;
                    var pl = /\+/g;     // RegExp for replacing addition symbol with a space
                    var search = /([^&=]+)=?([^&]*)/g;
                    var decode = function(s) { return decodeURIComponent(s.replace(pl, " ")); };
            
                    while ((match = search.exec(sParms))) {
                        aParms[decode(match[1])] = decode(match[2]);
                    }
                }
                return aParms;
            };
            
            /**
             * onCountRepeat(n, fn, fnComplete, msDelay)
             *
             * Call fn() n times with an msDelay millisecond delay between calls, then
             * call fnComplete() when the count has been exhausted OR fn() returns false.
             *
             * @param {number} n
             * @param {function()} fn
             * @param {function()} fnComplete
             * @param {number} [msDelay]
             */
            web.onCountRepeat = function(n, fn, fnComplete, msDelay)
            {
                var fnRepeat = function doCountRepeat() {
                    n -= 1;
                    if (n >= 0) {
                        if (!fn()) n = 0;
                    }
                    if (n > 0) {
                        setTimeout(fnRepeat, msDelay || 0);
                        return;
                    }
                    fnComplete();
                };
                fnRepeat();
            };
            
            /**
             * onClickRepeat(e, msDelay, msRepeat, fn)
             *
             * Repeatedly call fn() with an initial msDelay, and an msRepeat delay thereafter,
             * as long as HTML control Object e has an active "down" event and fn() returns true.
             *
             * @param {Object} e
             * @param {number} msDelay
             * @param {number} msRepeat
             * @param {function(boolean)} fn is passed false on the first call, true on all repeated calls
             */
            web.onClickRepeat = function(e, msDelay, msRepeat, fn)
            {
                var ms = 0, timer = null, fIgnoreMouseEvents = false;
            
                var fnRepeat = function doClickRepeat() {
                    if (fn(ms === msRepeat)) {
                        timer = setTimeout(fnRepeat, ms);
                        ms = msRepeat;
                    }
                };
                e.onmousedown = function() {
                    // web.log("onMouseDown()");
                    if (!fIgnoreMouseEvents) {
                        if (!timer) {
                            ms = msDelay;
                            fnRepeat();
                        }
                    }
                };
                e.ontouchstart = function() {
                    // web.log("onTouchStart()");
                    if (!timer) {
                        ms = msDelay;
                        fnRepeat();
                    }
                };
                e.onmouseup = e.onmouseout = function() {
                    // web.log("onMouseUp()/onMouseOut()");
                    if (timer) {
                        clearTimeout(timer);
                        timer = null;
                    }
                };
                e.ontouchend = e.ontouchcancel = function() {
                    // web.log("onTouchEnd()/onTouchCancel()");
                    if (timer) {
                        clearTimeout(timer);
                        timer = null;
                    }
                    /*
                     * Devices that generate ontouch* events ALSO generate onmouse* events,
                     * and generally do so immediately after all the touch events are complete,
                     * so unless we want double the action, we need to ignore mouse events.
                     */
                    fIgnoreMouseEvents = true;
                };
            };
            
            web.aPageEventHandlers = {
                'init': [],         // list of window 'onload' handlers
                'show': [],         // list of window 'onpageshow' handlers
                'exit': []          // list of window 'onunload' handlers (although we prefer to use 'onbeforeunload' if possible)
            };
            
            web.fPageReady = false; // set once the browser's first page initialization has occurred
            web.fPageEventsEnabled = true;
            
            /**
             * onPageEvent(sName, fn)
             *
             * @param {string} sFunc
             * @param {function()} fn
             *
             * Use this instead of setting window['onunload'], window['onunload'], etc.
             * Allows multiple JavaScript modules to define a handler for the same event.
             *
             * Moreover, it's risky to refer to obscure event handlers with "dot" names, because
             * the Closure Compiler may erroneously replace them (eg, window.onpageshow is a good example).
             */
            web.onPageEvent = function(sFunc, fn)
            {
                if (window) {
                    var fnPrev = window[sFunc];
                    if (typeof fnPrev !== 'function') {
                        window[sFunc] = fn;
                    } else {
                        /*
                         * TODO: Determine whether there's any value in receiving/sending the Event object that the
                         * browser provides when it generates the original event.
                         */
                        window[sFunc] = function onWindowEvent() {
                            if (fnPrev) fnPrev();
                            fn();
                        };
                    }
                }
            };
            
            /**
             * onInit(fn)
             *
             * @param {function()} fn
             *
             * Use this instead of setting window.onload.  Allows multiple JavaScript modules to define their own 'onload' event handler.
             */
            web.onInit = function(fn)
            {
                web.aPageEventHandlers['init'].push(fn);
            };
            
            /**
             * onShow(fn)
             *
             * @param {function()} fn
             *
             * Use this instead of setting window.onpageshow.  Allows multiple JavaScript modules to define their own 'onpageshow' event handler.
             */
            web.onShow = function(fn)
            {
                web.aPageEventHandlers['show'].push(fn);
            };
            
            /**
             * onExit(fn)
             *
             * @param {function()} fn
             *
             * Use this instead of setting window.onunload.  Allows multiple JavaScript modules to define their own 'onunload' event handler.
             */
            web.onExit = function(fn)
            {
                web.aPageEventHandlers['exit'].push(fn);
            };
            
            /**
             * doPageEvent(afn)
             *
             * @param {Array.<function()>} afn
             */
            web.doPageEvent = function(afn)
            {
                if (web.fPageEventsEnabled) {
                    try {
                        for (var i = 0; i < afn.length; i++) {
                            afn[i]();
                        }
                    } catch(e) {
                        web.notice("An unexpected exception occurred:\n\n" + e.message + "\n\nPlease send this information to support@pcjs.org. Thanks.");
                    }
                }
            };
            
            /**
             * enablePageEvents(fEnable)
             *
             * @param {boolean} fEnable is true to enable page events, false to disable (they're enabled by default)
             */
            web.enablePageEvents = function(fEnable)
            {
                if (!web.fPageEventsEnabled && fEnable) {
                    web.fPageEventsEnabled = true;
                    if (web.fPageReady) web.sendPageEvent('init');
                    return;
                }
                web.fPageEventsEnabled = fEnable;
            };
            
            /**
             * sendPageEvent(sEvent)
             *
             * This allows us to manually trigger page events.
             *
             * @param {string} sEvent (one of 'init', 'show' or 'exit')
             */
            web.sendPageEvent = function(sEvent)
            {
                if (web.aPageEventHandlers[sEvent]) {
                    web.doPageEvent(web.aPageEventHandlers[sEvent]);
                }
            };
            
            web.onPageEvent('onload', function onPageLoad() { web.fPageReady = true; web.doPageEvent(web.aPageEventHandlers['init']); });
            web.onPageEvent('onpageshow', function onPageShow() { web.doPageEvent(web.aPageEventHandlers['show']); });
            web.onPageEvent(web.isUserAgent("Opera") || web.isUserAgent("iOS")? 'onunload' : 'onbeforeunload', function onPageUnload() { web.doPageEvent(web.aPageEventHandlers['exit']); });
            
            if (typeof module !== 'undefined') module.exports = web;
            
    • versions
      • pcjs
        • 1.18.3
          • common.css
            @CHARSET "UTF-8";
            /**
                @author Jeff Parsons (@jeffpar)
                @website http://www.pcjs.org/
                @created 2013-05-05
                @modified 2014-02-23
                @license http://www.gnu.org/licenses/gpl.html
             */
            body {
                margin: 0;
                background: #202020;
            }
            h1, h2 {
                margin-top: 0;
                color: #cccccc;
            }
            h1, h2, h3, h4 {
                word-wrap: break-word;
            }
            
            h4 a {
                color: #cccccc !important;
            }
            p {
                line-height: 1.5em;
            }
            img {
                max-width: 100%;
            }
            a img {
                vertical-align: bottom;
            }
            pre, code {
                color: #000000;
                background-color: #cccccc;
                font-family: Monaco, Consolas, "Lucida Console", monospace;
                font-size: 12px;
            }
            pre {
                margin: 1em 2em;
                padding: 1em;
                border-radius: 5px;
                overflow: auto;
            }
            code {
                padding: 1px;
            }
            pre a, code a {
                color: #006400 !important;
            }
            .common {
                width: 100%;
                margin: 0 auto;
                color: #cccccc;
            }
            .common a {
            
                color: #7fc07f;
                text-decoration: none;
            }
            .common hr {
                border-color: #808080;
            }
            .common a:hover {
                text-decoration: underline;
            }
            .common, .machine {
                font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif;
                font-size: 15px;
            }
            .machine {
                margin: 15px;
                overflow: hidden;
            }
            .c1pjs {
                overflow: visible;
            }
            .machine-placeholder {
                text-align: center;
                font-weight: bold;
            }
            .common-top {
                background: #202020;
                font-size: small;
            }
            .common-top-left {
                float: left;
                width: 60%;
            }
            .common-top-left ul {
                line-height: 1.5em;
                list-style-type: none;
                margin: 0;
                padding: 1em 1em 1em 9px;
                overflow: hidden;
            }
            .common-top-left ul li {
                display: block;
                float: left;
            }
            .common-top-left ul li a {
                border-right: 1px solid #6f6f6f;
                padding: 2px 6px 2px 6px;
            }
            .common-top-left ul li:last-child a {
                border-right: none;
            }
            .common-top-right {
                float: right;
                width: 40%;
            }
            .common-top-right p {
                float: right;
                margin: 0;
                padding: 1em;
            }
            .common-middle {
                clear: both;
                padding: 1px 1em 1px 1em;
                background: #404040;
            }
            .common-sidebar {
                float: left;
                font-size: small;
                width: 140px;
                padding-bottom: 20px;
                overflow: hidden;
                white-space: nowrap;
                word-wrap: break-word;
            }
            .common-list {
                list-style-type: none;
                margin-top: 0;
                margin-bottom: 0;
                padding-left: 0;
            }
            .common-list li {
            
                padding-bottom: 7px;
            }
            .common-list-data {
                list-style-type: none;
                margin-top: 0;
                margin-bottom: 0;
                padding-left: 0;
            }
            .common-list-data li {
                line-height: 1.5em;
            }
            .common-list-data-items, .common-list-data-subitems {
                font-size: x-small;
                list-style-type: none;
                margin-top: 0;
                margin-bottom: 0;
                padding-left: 2em;
            }
            .common-list-data-items li, .common-list-data-subitems li {
                padding-bottom: 0;
            }
            .common-main {
                margin-left: 150px;
            
            }
            .common-image-gallery {
                margin: 0 auto;
                text-align: center;
            }
            .common-image-gallery:after {
                content: '';
                display: block;
            }
            .common-image-frame {
                display: inline-block;
                margin: 8px;
                text-align: center;
            }
            .common-image-link {
                padding: 5px;
                border: 1px solid black;
                border-radius: 5px;
                background-color: #FAEBD7;
            }
            .common-image-label {
                font-size: x-small;
            }
            .common-bottom {
                clear: both;
                padding-top: 1em;
            }
            .common-bottom:after {
                content: '';
                display: block;
                clear: both;
            }
            .common-reference {
                float: left;
                font-size: x-small;
            }
            .common-reference a {
                text-decoration: none;
            }
            .common-copyright {
                float: right;
                font-size: x-small;
            }
            .common-copyright a {
                text-decoration: none;
            }
            .md-list {
            }
            .md-list li {
                line-height: 1.5em;
                margin-bottom: 1em;
            }
            .md-list li p {
                padding-left: 2em;
            }
            .md-list-compact {
            }
            .md-list-compact li {
                margin-bottom: 0;
            }
            .md-list-none {
                list-style-type: none;
                padding-left: 2em;
            }
            .md-list-none li {
                margin-bottom: 0;
            }
            @media screen and (max-width: 900px) {
            
                .common-sidebar {
                    width: 100%;
                    white-space: normal;
                }
                .common-list {
                    padding-left: 0;
                }
                .common-list-data {
                    padding-left: 0;
                }
                .common-sidebar h4, .common-list li, .common-list-data li, .common-list-data-items li {
                    width: 130px;
                    float: left;
                    overflow: hidden;
                    vertical-align: top;
                    padding-right: 1em;
                    margin-top: 0;
                }
                .common-list-data-subitems {
                    display: none;
                }
                .common-main {
                    clear: both;
                    margin-left: 0;
                    padding-left: 0;
                    padding-right: 0;
                }
                .md-list-none {
                    padding-left: 1em;
                }
            }
            
          • common.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY ne "&#8800;"> <!ENTITY le "&#8804;"> <!ENTITY ge "&#8805;">
            	<!ENTITY times "&#215;"> <!ENTITY sdot "&#8901;"> <!ENTITY divide "&#247;">
            	<!ENTITY copy "&#169;"> <!ENTITY Sigma "&#931;"> <!ENTITY sigma "&#963;"> <!ENTITY sum "&#8721;"> <!ENTITY lbrace "&#123;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:template name="commonStyles">
            		<meta charset="utf-8"/>
            		<link rel="shortcut icon" href="/versions/images/current/favicon.ico" type="image/x-icon"/>
            		<link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.3/common.css"/>
            	</xsl:template>
            
            	<xsl:template name="commonTop">
            		<div class="common-top">
            			<div class="common-top-left">
            				<ul>
            					<li><a href="/">Home</a></li>
            					<li><a href="/apps/pc/">Apps</a></li>
            					<li><a href="/disks/pc/">Disks</a></li>
            					<li><a href="/devices/pc/machine/">Machines</a></li>
            					<li><a href="/docs/">Docs</a></li>
            					<li><a href="/pubs/">Pubs</a></li>
            					<li><a href="/blog/">Blog</a></li>
            					<li><a href="/docs/about/">About</a></li>
            				</ul>
            			</div>
            			<div class="common-top-right">
            				<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/elasticbeanstalk/" target="_blank">AWS</a> | <a href="http://github.com/jeffpar/pcjs" target="_blank">GitHub</a></p>
            			</div>
            		</div>
            	</xsl:template>
            
            	<xsl:template name="commonBottom">
            		<div class="common-bottom">
            			<p class="common-reference"></p>
            			<p class="common-copyright">
            				<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
            				<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
            			</p>
            		</div>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • components.css
            @CHARSET "UTF-8";
            
            
            *:not(input,textarea) {
                -webkit-user-select: none;
            }
            .pcjs-embed {
            }
            .pcjs-embed:after {
                clear:both;
            }
            .pcjs-name, .pcjs-menu {
                clear: both;
                font-weight: bold;
                padding-bottom: 4px;
            }
            .pcjs-menu {
                float: left;
            }
            .pcjs-canvas {
                width: 100%;
                height: auto;
            }
            .pcjs-container {
                color: #000000;
                position: relative;
            }
            .pcjs-label {
                font-size: small;
                line-height: 19px;
                vertical-align: middle;
                float: left;
                font-family: "Lucida Console", monospace;
            }
            .pcjs-control textarea {
                font-family: Monaco, monospace;
                font-size: x-small;
            }
            .pcjs-fieldset {
                border: none;
                margin: 0;
                padding: 0;
            }
            .pcjs-flag {
                font-family: "Lucida Console", monospace;
                font-size: small;
                text-align: center;
                line-height: 19px;
                vertical-align: middle;
            }
            .pcjs-register {
                font-family: "Lucida Console", monospace;
                font-size: small;
                text-align: center;
                line-height: 19px;
                vertical-align: middle;
                border: 1px solid black;
            }
            .pcjs-switches {
                float: left;
            }
            .pcjs-bitBucket {
                float: left;
                width: 19px;
                height: 38px;
            }
            .pcjs-bitCell {
                float: left;
                width: 19px;
                height: 19px;
                margin-right: -1px;
                margin-bottom: -1px;
                border: 1px solid black;
                text-align: center;
                line-height: 19px;
            }
            .pcjs-bitCellLeft {
                border-left: 1px solid black;
            }
            .pcjs-bitLabel {
                font-size: xx-small;
                text-align: center;
            }
            .pcjs-description, .pcjs-status {
                font-size: x-small;
                line-height: 2em;
            }
            .pcjs-key {
                border: 1px solid black;
                font-size: x-small;
                text-align: center;
                position: absolute;
                height: 34px;
                line-height: 34px;
                background-color: #ffffff;
            }
            .pcjs-led {
                float: left;
                width: 8px;
                height: 8px;
                margin: 4px;
                border: 1px solid black;
                text-align: center;
                line-height: 19px;
                background-color: #000000;
            }
            .pcjs-video-object {
                clear: both;
                height: auto;
                position: relative;
                line-height: 0;
            }
            .pcjs-video-object textarea {
                position: absolute;
                left: 0;
                top: 0;
                width: 100%;
                height: 100%;
                opacity: 0;
                border: 0;
                padding: 0;
                line-height: 0;
            }
            .pcjs-reference {
                float: left;
                font-size: x-small;
            }
            .pcjs-reference a {
                text-decoration: none;
            }
            .pcjs-copyright {
                float: right;
                font-size: x-small;
            }
            .pcjs-copyright a {
                text-decoration: none;
            }
            
            @media screen and (max-width: 900px) {
                .pcjs-textarea {
                    width: 100% !important;
                }
                .pcjs-registers {
                    width: 100% !important;
                }
            }
            
          • components.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            	<xsl:param name="rootDir" select="''"/>
            	<xsl:param name="generator" select="'client'"/>
            
            	<xsl:variable name="MACHINECLASS">pc</xsl:variable>
            	<xsl:variable name="APPCLASS">pcjs</xsl:variable>
            	<xsl:variable name="APPVERSION">1.18.3</xsl:variable>
            	<xsl:variable name="SITEHOST">www.pcjs.org</xsl:variable>
            
            	<xsl:template name="componentStyles">
            		<link rel="stylesheet" type="text/css" href="/versions/{$APPCLASS}/{$APPVERSION}/components.css"/>
            	</xsl:template>
            
            	<xsl:template name="componentScripts">
            		<xsl:param name="component"/>
            		<script type="text/javascript" src="/versions/{$APPCLASS}/{$APPVERSION}/{$component}.js"> </script>
            	</xsl:template>
            
            	<xsl:template name="componentIncludes">
            		<xsl:param name="component"/>
            		<xsl:call-template name="componentScripts"><xsl:with-param name="component" select="$component"/></xsl:call-template>
            	</xsl:template>
            
            	<xsl:template name="machine">
            		<xsl:param name="href">/devices/pc/machine/5150/mda/64kb/machine.xml</xsl:param>
            		<xsl:param name="state" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="$href"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/machine">
            			<xsl:with-param name="machineState" select="$state"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="machine[@ref]">
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/machine">
            			<xsl:with-param name="machine" select="@id"/>
            			<xsl:with-param name="machineState">
            				<xsl:choose>
            					<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
            					<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
            				</xsl:choose>
            			</xsl:with-param>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="machine[not(@ref)]">
            		<xsl:param name="machine"><xsl:value-of select="@id"/></xsl:param>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="machineStyle">
            			<xsl:if test="@float">float:<xsl:value-of select="@float"/></xsl:if>
            		</xsl:variable>
            		<div id="{$machine}" class="machine {@class}js" style="{$machineStyle}">
            			<xsl:call-template name="component">
            				<xsl:with-param name="machine" select="$machine"/>
            				<xsl:with-param name="machineState">
            					<xsl:choose>
            						<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
            						<xsl:otherwise><xsl:value-of select="@state"/></xsl:otherwise>
            					</xsl:choose>
            				</xsl:with-param>
            				<xsl:with-param name="component" select="'machine'"/>
            				<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
            				<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
            				<xsl:with-param name="url"><xsl:value-of select="@url"/></xsl:with-param>
            			</xsl:call-template>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="component[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/component">
            			<xsl:with-param name="machine" select="$machine"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="component[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class" select="@class"/>
            			<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template name="component">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:param name="component" select="name(.)"/>
            		<xsl:param name="class" select="''"/>
            		<xsl:param name="parms" select="''"/>
            		<xsl:param name="url" select="''"/>
            		<xsl:variable name="id">
            			<xsl:choose>
            				<xsl:when test="$component = 'machine'"><xsl:value-of select="$machine"/>.machine</xsl:when>
            				<xsl:when test="$machine != '' and @id"><xsl:value-of select="$machine"/>.<xsl:value-of select="@id"/></xsl:when>
            				<xsl:when test="$machine != ''"><xsl:value-of select="$machine"/>.<xsl:value-of select="$component"/></xsl:when>
            				<xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$component"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="componentURL">
            			<xsl:choose>
            				<xsl:when test="$component = 'machine'">url:'<xsl:value-of select="$url"/>'</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="name">
            			<xsl:choose>
            				<xsl:when test="name"><xsl:value-of select="name"/></xsl:when>
            				<xsl:when test="@name"><xsl:value-of select="@name"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="comment">
            			<xsl:choose>
            				<xsl:when test="@comment">,comment:'<xsl:value-of select="@comment"/>'</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="border">
            			<xsl:choose>
            				<xsl:when test="@border = '1'">border:1px solid black;border-radius:15px;</xsl:when>
            				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="left">
            			<xsl:choose>
            				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="top">
            			<xsl:choose>
            				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="width">
            			<xsl:choose>
            				<xsl:when test="@width">
            					<xsl:choose>
            						<xsl:when test="$left != '' or $top != ''">width:<xsl:value-of select="@width"/>;</xsl:when>
            						<xsl:otherwise>width:auto;max-width:<xsl:value-of select="@width"/>;</xsl:otherwise>
            					</xsl:choose>
            				</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="height">
            			<xsl:choose>
            				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="padding">
            			<xsl:choose>
            				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
            				<xsl:otherwise>
            					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
            					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
            					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
            					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
            				</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="pos">
            			<xsl:choose>
            				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
            				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
            				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
            				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
            				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="style">
            			<xsl:if test="$component = 'machine'">overflow:auto;width:100%;</xsl:if>
            			<xsl:if test="@background">background-color:<xsl:value-of select="@background"/>;</xsl:if>
            			<xsl:if test="@style"><xsl:value-of select="@style"/></xsl:if>
            		</xsl:variable>
            		<xsl:variable name="componentClass">
            			<xsl:value-of select="$APPCLASS"/><xsl:text>-</xsl:text><xsl:value-of select="$component"/><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-component</xsl:text>
            		</xsl:variable>
            		<div id="{$id}" class="{$componentClass}" style="{$width}{$height}{$pos}{$left}{$top}{$padding}" data-value="{$componentURL}">
            			<xsl:if test="$component = 'machine'">
            				<xsl:apply-templates select="name" mode="machine"/>
            			</xsl:if>
            			<xsl:if test="$component != 'machine'">
            				<xsl:apply-templates select="name" mode="component"/>
            			</xsl:if>
            			<div class="{$APPCLASS}-container" style="{$border}{$style}">
            				<xsl:if test="$component = 'machine'">
            					<xsl:apply-templates select="menu" mode="machine"/>
            				</xsl:if>
            				<xsl:if test="$component != 'machine'">
            					<xsl:apply-templates select="menu" mode="component"/>
            				</xsl:if>
            				<xsl:if test="$class != '' and $component != 'machine'">
            					<div class="{$APPCLASS}-{$class}-object" data-value="id:'{$id}',name:'{$name}'{$comment}{$parms}"> </div>
            				</xsl:if>
            				<xsl:if test="control">
            					<div class="{$APPCLASS}-controls">
            						<xsl:apply-templates select="control" mode="component"/>
            					</div>
            				</xsl:if>
            				<xsl:apply-templates>
            					<xsl:with-param name="machine" select="$machine"/>
            					<xsl:with-param name="machineState" select="$machineState"/>
            				</xsl:apply-templates>
            			</div>
            			<xsl:if test="$component = 'machine'">
            				<xsl:choose>
            					<xsl:when test="$url != ''"><div class="{$APPCLASS}-reference">[<a href="{$url}">XML</a>]</div></xsl:when>
            					<xsl:otherwise/>
            				</xsl:choose>
            				<div class="{$APPCLASS}-copyright">
            					<a href="http://{$SITEHOST}" target="_blank">PCjs</a> v<xsl:value-of select="$APPVERSION"/> © 2012-2015 by <a href="http://twitter.com/jeffpar" target="_blank">@jeffpar</a>
            				</div>
            				<div style="clear:both"> </div>
            			</xsl:if>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="name" mode="machine">
            		<xsl:variable name="pos">
            			<xsl:choose>
            				<xsl:when test="@pos = 'center'">text-align:center;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<h2 style="{$pos}"><xsl:apply-templates/></h2>
            	</xsl:template>
            
            	<xsl:template match="name" mode="component">
            		<div class="{$APPCLASS}-name"><xsl:apply-templates/></div>
            	</xsl:template>
            
            	<xsl:template match="menu" mode="component">
            		<xsl:apply-templates mode="component"/>
            	</xsl:template>
            
            	<xsl:template match="title" mode="component">
            		<div class="{$APPCLASS}-menu"><xsl:apply-templates/></div>
            	</xsl:template>
            
            	<xsl:template match="control" mode="component">
            		<xsl:variable name="type">
            			<xsl:text>type:'</xsl:text><xsl:value-of select="@type"/><xsl:text>'</xsl:text>
            		</xsl:variable>
            		<xsl:variable name="binding">
            			<xsl:text>binding:'</xsl:text><xsl:value-of select="@binding"/><xsl:text>'</xsl:text>
            		</xsl:variable>
            		<xsl:variable name="border">
            			<xsl:choose>
            				<xsl:when test="@border = '1'">border:1px solid black;</xsl:when>
            				<xsl:when test="@border">border:<xsl:value-of select="@border"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="width">
            			<xsl:choose>
            				<xsl:when test="@width">width:<xsl:value-of select="@width"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="height">
            			<xsl:choose>
            				<xsl:when test="@height">height:<xsl:value-of select="@height"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="left">
            			<xsl:choose>
            				<xsl:when test="@left">left:<xsl:value-of select="@left"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="top">
            			<xsl:choose>
            				<xsl:when test="@top">top:<xsl:value-of select="@top"/>;</xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="padding">
            			<xsl:choose>
            				<xsl:when test="@padding">padding:<xsl:value-of select="@padding"/>;</xsl:when>
            				<xsl:otherwise>
            					<xsl:if test="@padtop">padding-top:<xsl:value-of select="@padtop"/>;</xsl:if>
            					<xsl:if test="@padright">padding-right:<xsl:value-of select="@padright"/>;</xsl:if>
            					<xsl:if test="@padbottom">padding-bottom:<xsl:value-of select="@padbottom"/>;</xsl:if>
            					<xsl:if test="@padleft">padding-left:<xsl:value-of select="@padleft"/>;</xsl:if>
            				</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="pos">
            			<xsl:choose>
            				<xsl:when test="@pos = 'left'">float:left;</xsl:when>
            				<xsl:when test="@pos = 'right'">float:right;</xsl:when>
            				<xsl:when test="@pos = 'center'">margin:0 auto;</xsl:when>
            				<xsl:when test="@pos">position:<xsl:value-of select="@pos"/>;</xsl:when>
            				<xsl:when test="$left != '' or $top != ''">position:relative;</xsl:when>
            				<xsl:otherwise><xsl:if test="$left = ''">float:left;</xsl:if></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="style">
            			<xsl:choose>
            				<xsl:when test="@style"><xsl:value-of select="@style"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="containerClass">
            			<xsl:if test="@type = 'container' and @class"><xsl:text> </xsl:text><xsl:value-of select="@class"/></xsl:if>
            		</xsl:variable>
            		<xsl:variable name="containerStyle">
            			<xsl:value-of select="$pos"/><xsl:value-of select="$left"/><xsl:value-of select="$top"/><xsl:value-of select="$padding"/>
            			<xsl:choose>
            				<xsl:when test="@type = 'container'"><xsl:value-of select="$border"/><xsl:value-of select="$width"/><xsl:value-of select="$height"/><xsl:value-of select="$style"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<div class="{$APPCLASS}-control{$containerClass}" style="{$containerStyle}">
            			<xsl:variable name="fontsize">
            				<xsl:choose>
            					<xsl:when test="@size = 'large' or @size = 'small'">font-size:<xsl:value-of select="@size"/>;</xsl:when>
            					<xsl:otherwise/>
            				</xsl:choose>
            			</xsl:variable>
            			<xsl:variable name="subClass">
            				<xsl:if test="@label"><xsl:text> </xsl:text><xsl:value-of select="$APPCLASS"/><xsl:text>-label</xsl:text></xsl:if>
            			</xsl:variable>
            			<xsl:variable name="labelWidth">
            				<xsl:if test="@labelwidth">width:<xsl:value-of select="@labelwidth"/>;</xsl:if>
            			</xsl:variable>
            			<xsl:variable name="labelStyle">
            				<xsl:choose>
            					<xsl:when test="@labelstyle"><xsl:value-of select="@labelstyle"/></xsl:when>
            					<xsl:otherwise>text-align:right;</xsl:otherwise>
            				</xsl:choose>
            			</xsl:variable>
            			<xsl:if test="@label">
            				<xsl:if test="not(@labelpos) or @labelpos = 'left'">
            					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
            				</xsl:if>
            			</xsl:if>
            			<xsl:choose>
            				<xsl:when test="@type = 'canvas'">
            					<canvas class="{$APPCLASS}-binding {$APPCLASS}-canvas" width="{@width}" height="{@height}" style="-webkit-user-select:none;{$border}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></canvas>
            				</xsl:when>
            				<xsl:when test="@type = 'button'">
            					<button class="{$APPCLASS}-binding" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></button>
            				</xsl:when>
            				<xsl:when test="@type = 'list'">
            					<select class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}">
            						<xsl:apply-templates select="disk|app|manifest" mode="component"/>
            					</select>
            				</xsl:when>
            				<xsl:when test="@type = 'text'">
            					<input class="{$APPCLASS}-binding" type="text" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" value="{.}" autocapitalize="off" autocorrect="off"/>
            				</xsl:when>
            				<xsl:when test="@type = 'submit'">
            					<input class="{$APPCLASS}-binding" type="submit" style="{$border}{$fontsize}{$style}" data-value="{$type},{$binding}" value="{.}"/>
            				</xsl:when>
            				<xsl:when test="@type = 'textarea'">
            					<textarea class="{$APPCLASS}-binding" style="{$border}{$width}{$height}{$style}" data-value="{$type},{$binding}" readonly="readonly"> </textarea>
            				</xsl:when>
            				<xsl:when test="@type = 'heading'">
            					<div><xsl:value-of select="."/></div>
            				</xsl:when>
            				<xsl:when test="@type = 'file'">
            					<form class="{$APPCLASS}-binding" data-value="{$type},{$binding}">
            						<fieldset class="{$APPCLASS}-fieldset">
            							<input type="file"/>
            							<input type="submit" value="Mount" disabled="true"/>
            						</fieldset>
            					</form>
            				</xsl:when>
            				<xsl:when test="@type = 'led'">
            					<div class="{$APPCLASS}-binding {$APPCLASS}-{@type}" data-value="{$type},{$binding}"><xsl:value-of select="."/></div>
            				</xsl:when>
            				<xsl:when test="@type = 'separator'">
            					<hr/>
            				</xsl:when>
            				<xsl:when test="@type = 'container'">
            					<xsl:apply-templates mode="component"/>
            				</xsl:when>
            				<xsl:when test="not(@type)">
            					<div style="clear:both"> </div>
            				</xsl:when>
            				<xsl:otherwise>
            					<div class="{$APPCLASS}-binding{$subClass} {$APPCLASS}-{@type}" style="-webkit-user-select:none;{$border}{$width}{$height}{$fontsize}{$style}" data-value="{$type},{$binding}"><xsl:apply-templates/></div>
            				</xsl:otherwise>
            			</xsl:choose>
            			<xsl:if test="@label">
            				<xsl:if test="@labelpos = 'right'">
            					<div class="{$APPCLASS}-label" style="{$labelWidth}{$labelStyle}"><xsl:value-of select="@label"/></div>
            				</xsl:if>
            				<div style="clear:both"> </div>
            			</xsl:if>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="disk[@ref]" mode="component">
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/disk" mode="component"/>
            	</xsl:template>
            
            	<xsl:template match="disk[not(@ref)]" mode="component">
            		<xsl:variable name="desc">
            			<xsl:if test="@desc">
            				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
            				<xsl:if test="@href">
            					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
            				</xsl:if>
            			</xsl:if>
            		</xsl:variable>
            		<option value="{@path}" data-value="{$desc}"><xsl:if test="name"><xsl:value-of select="name"/></xsl:if><xsl:if test="not(name)"><xsl:value-of select="."/></xsl:if></option>
            	</xsl:template>
            
            	<xsl:template match="app[@ref]" mode="component">
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/app" mode="component"/>
            	</xsl:template>
            
            	<xsl:template match="app[not(@ref)]" mode="component">
            		<xsl:variable name="desc">
            			<xsl:if test="@desc">
            				<xsl:text>desc:'</xsl:text><xsl:value-of select="@desc"/><xsl:text>'</xsl:text>
            				<xsl:if test="@href">
            					<xsl:text>,href:'</xsl:text><xsl:value-of select="@href"/><xsl:text>'</xsl:text>
            				</xsl:if>
            			</xsl:if>
            		</xsl:variable>
            		<xsl:variable name="path">
            			<xsl:if test="@path"><xsl:value-of select="@path"/></xsl:if>
            		</xsl:variable>
            		<xsl:variable name="files">
            			<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$path"/></xsl:if><xsl:value-of select="@name"/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
            		</xsl:variable>
            		<option value="{$files}" data-value="{$desc}"><xsl:value-of select="@name"/></option>
            	</xsl:template>
            
            	<xsl:template match="manifest[@ref]" mode="component">
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/manifest" mode="component">
            			<xsl:with-param name="disk"><xsl:value-of select="@disk"/></xsl:with-param>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="manifest[not(@ref)]" mode="component">
            		<xsl:param name="disk"><xsl:value-of select="@disk"/></xsl:param>
            		<xsl:if test="$disk != ''">
            			<xsl:variable name="prefix">
            				<xsl:if test="title/@prefix"><xsl:value-of select="title/@prefix"/><xsl:text>: </xsl:text></xsl:if>
            			</xsl:variable>
            			<xsl:for-each select="disk">
            				<xsl:if test="$disk = @id or $disk = '*'">
            					<xsl:variable name="name">
            						<xsl:choose>
            							<xsl:when test="name"><xsl:value-of select="$prefix"/><xsl:value-of select="name"/></xsl:when>
            							<xsl:when test="normalize-space(./text()) != ''">
            								<xsl:value-of select="$prefix"/><xsl:value-of select="normalize-space(./text())"/>
            							</xsl:when>
            							<xsl:otherwise>
            								<xsl:value-of select="../title"/><xsl:if test="../version != ''"><xsl:text> </xsl:text><xsl:value-of select="../version"/></xsl:if>
            							</xsl:otherwise>
            						</xsl:choose>
            					</xsl:variable>
            					<xsl:variable name="link">
            						<xsl:if test="link">
            							<xsl:text>desc:'</xsl:text><xsl:value-of select="link"/><xsl:text>'</xsl:text>
            							<xsl:if test="link/@href">
            								<xsl:text>,href:'</xsl:text><xsl:value-of select="link/@href"/><xsl:text>'</xsl:text>
            							</xsl:if>
            						</xsl:if>
            					</xsl:variable>
            					<xsl:if test="@href">
            						<option value="{@href}" data-value="{$link}"><xsl:value-of select="$name"/></option>
            					</xsl:if>
            					<xsl:if test="not(@href)">
            						<xsl:variable name="dir">
            							<xsl:if test="@dir"><xsl:value-of select="@dir"/></xsl:if>
            						</xsl:variable>
            						<xsl:variable name="files">
            							<xsl:for-each select="file"><xsl:if test="position() = 1"><xsl:value-of select="$dir"/></xsl:if><xsl:value-of select="@dir"/><xsl:value-of select="."/><xsl:if test="position() != last()">;</xsl:if></xsl:for-each>
            						</xsl:variable>
            						<option value="{$files}" data-value="{$link}"><xsl:value-of select="$name"/></option>
            					</xsl:if>
            				</xsl:if>
            			</xsl:for-each>
            		</xsl:if>
            	</xsl:template>
            
            	<xsl:template match="name">
            	</xsl:template>
            
            	<xsl:template match="title">
            	</xsl:template>
            
            	<xsl:template match="control">
            	</xsl:template>
            
            	<xsl:template match="cpu[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/cpu"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="cpu[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise>8088</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="cycles">
            			<xsl:choose>
            				<xsl:when test="@cycles"><xsl:value-of select="@cycles"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="multiplier">
            			<xsl:choose>
            				<xsl:when test="@multiplier"><xsl:value-of select="@multiplier"/></xsl:when>
            				<xsl:otherwise>1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="autoStart">
            			<xsl:choose>
            				<xsl:when test="@autostart"><xsl:value-of select="@autostart"/></xsl:when>
            				<xsl:otherwise>null</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="csStart">
            			<xsl:choose>
            				<xsl:when test="@csstart"><xsl:value-of select="@csstart"/></xsl:when>
            				<xsl:otherwise>-1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="csInterval">
            			<xsl:choose>
            				<xsl:when test="@csinterval"><xsl:value-of select="@csinterval"/></xsl:when>
            				<xsl:otherwise>-1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="csStop">
            			<xsl:choose>
            				<xsl:when test="@csstop"><xsl:value-of select="@csstop"/></xsl:when>
            				<xsl:otherwise>-1</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class" select="'cpu'"/>
            			<xsl:with-param name="parms">,model:<xsl:value-of select="$model"/>,cycles:<xsl:value-of select="$cycles"/>,multiplier:<xsl:value-of select="$multiplier"/>,autoStart:<xsl:value-of select="$autoStart"/>,csStart:<xsl:value-of select="$csStart"/>,csInterval:<xsl:value-of select="$csInterval"/>,csStop:<xsl:value-of select="$csStop"/></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="chipset[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/chipset"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="chipset[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise>5150</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="sw1">
            			<xsl:choose>
            				<xsl:when test="@sw1"><xsl:value-of select="@sw1"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="sw2">
            			<xsl:choose>
            				<xsl:when test="@sw2"><xsl:value-of select="@sw2"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="sound">
            			<xsl:choose>
            				<xsl:when test="@sound"><xsl:value-of select="@sound"/></xsl:when>
            				<xsl:otherwise>true</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="scaletimers">
            			<xsl:choose>
            				<xsl:when test="@scaletimers"><xsl:value-of select="@scaletimers"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="floppies">
            			<xsl:choose>
            				<xsl:when test="@floppies"><xsl:value-of select="@floppies"/></xsl:when>
            				<xsl:otherwise>{}</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="monitor">
            			<xsl:choose>
            				<xsl:when test="@monitor"><xsl:value-of select="@monitor"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="rtcdate">
            			<xsl:choose>
            				<xsl:when test="@rtcdate"><xsl:value-of select="@rtcdate"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">chipset</xsl:with-param>
            			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',scaleTimers:<xsl:value-of select="$scaletimers"/>,sw1:'<xsl:value-of select="$sw1"/>',sw2:'<xsl:value-of select="$sw2"/>',sound:<xsl:value-of select="$sound"/>,floppies:<xsl:value-of select="$floppies"/>,monitor:'<xsl:value-of select="$monitor"/>',rtcDate:'<xsl:value-of select="$rtcdate"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="keyboard[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/keyboard"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="keyboard[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">keyboard</xsl:with-param>
            			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="serial[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/serial"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="serial[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="adapter">
            			<xsl:choose>
            				<xsl:when test="@adapter"><xsl:value-of select="@adapter"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="binding">
            			<xsl:choose>
            				<xsl:when test="@binding"><xsl:value-of select="@binding"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">serial</xsl:with-param>
            			<xsl:with-param name="parms">,adapter:<xsl:value-of select="$adapter"/>,binding:'<xsl:value-of select="$binding"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="mouse[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/mouse"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="mouse[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="serial">
            			<xsl:choose>
            				<xsl:when test="@serial"><xsl:value-of select="@serial"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">mouse</xsl:with-param>
            			<xsl:with-param name="parms">,serial:'<xsl:value-of select="$serial"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="fdc[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/fdc">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="mount" select="@automount"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="fdc[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="mount" select="''"/>
            		<xsl:variable name="automount">
            			<xsl:choose>
            				<xsl:when test="$mount != ''"><xsl:value-of select="$mount"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="@automount"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">fdc</xsl:with-param>
            			<xsl:with-param name="parms">,autoMount:'<xsl:value-of select="$automount"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="hdc[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/hdc"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="hdc[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="drives">
            			<xsl:choose>
            				<xsl:when test="@drives"><xsl:value-of select="@drives"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="type">
            			<xsl:choose>
            				<xsl:when test="@type"><xsl:value-of select="@type"/></xsl:when>
            				<xsl:otherwise>xt</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">hdc</xsl:with-param>
            			<xsl:with-param name="parms">,drives:'<xsl:value-of select="$drives"/>',type:'<xsl:value-of select="$type"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="rom[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/rom"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="rom[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="addr">
            			<xsl:choose>
            				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="size">
            			<xsl:choose>
            				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="alias">
            			<xsl:choose>
            				<xsl:when test="@alias"><xsl:value-of select="@alias"/></xsl:when>
            				<xsl:otherwise>null</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="file">
            			<xsl:choose>
            				<xsl:when test="@file"><xsl:value-of select="@file"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="notify">
            			<xsl:choose>
            				<xsl:when test="@notify"><xsl:value-of select="@notify"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">rom</xsl:with-param>
            			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,alias:<xsl:value-of select="$alias"/>,file:'<xsl:value-of select="$file"/>',notify:'<xsl:value-of select="$notify"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="ram[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/ram"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="ram[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="addr">
            			<xsl:choose>
            				<xsl:when test="@addr"><xsl:value-of select="@addr"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="size">
            			<xsl:choose>
            				<xsl:when test="@size"><xsl:value-of select="@size"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="test">
            			<xsl:choose>
            				<xsl:when test="@test"><xsl:value-of select="@test"/></xsl:when>
            				<xsl:otherwise>true</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">ram</xsl:with-param>
            			<xsl:with-param name="parms">,addr:<xsl:value-of select="$addr"/>,size:<xsl:value-of select="$size"/>,test:<xsl:value-of select="$test"/></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="video[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/video"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="video[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="model">
            			<xsl:choose>
            				<xsl:when test="@model"><xsl:value-of select="@model"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="mode">
            			<xsl:choose>
            				<xsl:when test="@mode"><xsl:value-of select="@mode"/></xsl:when>
            				<xsl:otherwise>7</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="screenWidth">
            			<xsl:choose>
            				<xsl:when test="@screenwidth"><xsl:value-of select="@screenwidth"/></xsl:when>
            				<xsl:otherwise>256</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="screenHeight">
            			<xsl:choose>
            				<xsl:when test="@screenheight"><xsl:value-of select="@screenheight"/></xsl:when>
            				<xsl:otherwise>224</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="memory">
            			<xsl:choose>
            				<xsl:when test="@memory"><xsl:value-of select="@memory"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="switches">
            			<xsl:choose>
            				<xsl:when test="@switches"><xsl:value-of select="@switches"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="scale">
            			<xsl:choose>
            				<xsl:when test="@scale"><xsl:value-of select="@scale"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="charCols">
            			<xsl:choose>
            				<xsl:when test="@cols"><xsl:value-of select="@cols"/></xsl:when>
            				<xsl:otherwise>80</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="charRows">
            			<xsl:choose>
            				<xsl:when test="@rows"><xsl:value-of select="@rows"/></xsl:when>
            				<xsl:otherwise>25</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="fontROM">
            			<xsl:choose>
            				<xsl:when test="@charset"><xsl:value-of select="@charset"/></xsl:when>
            				<xsl:when test="@fontrom"><xsl:value-of select="@fontrom"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="screenColor">
            			<xsl:choose>
            				<xsl:when test="@screencolor"><xsl:value-of select="@screencolor"/></xsl:when>
            				<xsl:otherwise>black</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="touchScreen">
            			<xsl:choose>
            				<xsl:when test="@touchscreen"><xsl:value-of select="@touchscreen"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="autoLock">
            			<xsl:choose>
            				<xsl:when test="@autolock"><xsl:value-of select="@autolock"/></xsl:when>
            				<xsl:otherwise>false</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">video</xsl:with-param>
            			<xsl:with-param name="parms">,model:'<xsl:value-of select="$model"/>',mode:<xsl:value-of select="$mode"/>,screenWidth:<xsl:value-of select="$screenWidth"/>,screenHeight:<xsl:value-of select="$screenHeight"/>,memory:<xsl:value-of select="$memory"/>,switches:'<xsl:value-of select="$switches"/>',scale:<xsl:value-of select="$scale"/>,charCols:<xsl:value-of select="$charCols"/>,charRows:<xsl:value-of select="$charRows"/>,fontROM:'<xsl:value-of select="$fontROM"/>',screenColor:'<xsl:value-of select="$screenColor"/>',touchScreen:<xsl:value-of select="$touchScreen"/>,autoLock:<xsl:value-of select="$autoLock"/></xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="debugger[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/debugger"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="debugger[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="commands">
            			<xsl:choose>
            				<xsl:when test="@commands"><xsl:value-of select="@commands"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="messages">
            			<xsl:choose>
            				<xsl:when test="@messages"><xsl:value-of select="@messages"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">debugger</xsl:with-param>
            			<xsl:with-param name="parms">,commands:'<xsl:value-of select="$commands"/>',messages:'<xsl:value-of select="$messages"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="panel[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/panel"><xsl:with-param name="machine" select="$machine"/></xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="panel[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">panel</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            	<xsl:template match="computer[@ref]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="componentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($componentFile)/computer">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="machineState" select="$machineState"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="computer[not(@ref)]">
            		<xsl:param name="machine" select="''"/>
            		<xsl:param name="machineState" select="''"/>
            		<xsl:variable name="busWidth">
            			<xsl:choose>
            				<xsl:when test="@buswidth"><xsl:value-of select="@buswidth"/></xsl:when>
            				<xsl:otherwise>20</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="resume">
            			<xsl:choose>
            				<xsl:when test="@resume and $machineState = ''"><xsl:value-of select="@resume"/></xsl:when>
            				<xsl:otherwise>0</xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:variable name="state">
            			<xsl:choose>
            				<xsl:when test="$machineState != ''"><xsl:value-of select="$machineState"/></xsl:when>
            				<xsl:when test="@state"><xsl:value-of select="@state"/></xsl:when>
            				<xsl:otherwise/>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:call-template name="component">
            			<xsl:with-param name="machine" select="$machine"/>
            			<xsl:with-param name="class">computer</xsl:with-param>
            			<xsl:with-param name="parms">,busWidth:<xsl:value-of select="$busWidth"/>,resume:<xsl:value-of select="$resume"/>,state:'<xsl:value-of select="$state"/>'</xsl:with-param>
            		</xsl:call-template>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • document.css
            @CHARSET "UTF-8";
            
            .page {
                margin: 2% 2%;
                padding: 2% 2%;
                min-width: 30em;
                overflow: auto;
                font-size: large;
                font-family: Helvetica, Arial, sans-serif;
                background: #303030;
                color: #ccc;
            
            }
            .page-header {
            }
            .page-header-title {
            	text-align: center;
            
            }
            .page a {
                color: #7fc07f;
                text-decoration: none;
            }
            a.footlink, a.paralink {
            	text-decoration: none;
            }
            a.footlink:link, a.paralink:link {
            	color: blue;
            }
            a.footlink:visited, a.paralink:visited {
            	color: blue;
            }
            .galleryitem {
            	float: left;
            	width: 200px;
            }
            .item {
            	float: left;
            	width: 2em;
            	text-indent: 1em;
            }
            .list {
            	margin-left: 3em;
            	text-indent: 0;
            	text-align: justify;
            }
            ul {
            	list-style: none;
            }
            div.pnumber {
            	float: left;
            	width: 2em;
            	text-indent: 1em;
            }
            div.pitem {
            	margin-left: 10em;
            }
            p.indent, .justified p {
            	text-indent: 2em;
            	text-align: justify;
            	line-height: 1.5em;
            }
            p.noindent {
            	text-indent: 0;
            	text-align: justify;
            }
            p.center, .center {
            	text-align: center;
            }
            li.para {
            	margin-top: 1em;
            	margin-bottom: 1em;
            }
            .left {
            	text-align: left;
            }
            .right {
            	text-align: right;
            }
            blockquote.tag {
            	font-size: small;
            	font-family: Monaco, Fixed, monospace;
            	margin-top: 0;
            	margin-bottom: 0;
            }
            .blockquote {
            	padding-left: 1em;
            	text-indent: 0;
            	text-align: justify;
            }
            .italics {
            	font-style: italic;
            }
            .medium {
            	font-size: medium;
            }
            .small {
            	font-size: x-small;
            }
            .smallcaps {
            	font-variant: small-caps;
            }
            .strike {
            	text-decoration: line-through;
            }
            .summation, .bracelist {
            	display: inline-block;
            	position: relative;
            	vertical-align: middle;
            	text-align: center;
            	margin-bottom: 0.5ex;
            	text-indent: 0;
            }
            .bracelist-symbol {
            	font-size: 3em;
            	vertical-align: -40%;
            }
            .summation .summation-lower, .summation .summation-upper, .bracelist-item {
            	display: block;
            	font-size: 75%;
            	text-align: center;
            }
            .summation .summation-upper {
            	margin-bottom: 0;
            	margin-left: 0.8ex;
            	font-style: italic;
            }
            .summation .summation-lower{
            	margin-bottom: -0.6ex;
            	font-style: italic;
            }
            .summation .summation-symbol {
            	font-size: 2em;
            }
            p sup {
            	vertical-align: baseline;
            	position: relative;
            	bottom: .5em;
            	font-size: small;
            }
            p sub {
            	vertical-align: baseline;
            	position: relative;
            	bottom: -.5em;
            	font-size: small;
            }
            .footnote {
            	font-size: medium;
            	text-indent: 1em;
            	text-align: justify;
            	margin-top: .5em;
            }
            .image-right {
            	float: right;
            	margin-left: 1em;
            	margin-top: 1em;
            	margin-bottom: 1em;
            }
            .image-caption {
            	font-size: small;
            	text-align: center;
            }
          • document.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY ne "&#8800;"> <!ENTITY le "&#8804;"> <!ENTITY ge "&#8805;">
            	<!ENTITY times "&#215;"> <!ENTITY sdot "&#8901;"> <!ENTITY divide "&#247;">
            	<!ENTITY copy "&#169;"> <!ENTITY Sigma "&#931;"> <!ENTITY sigma "&#963;"> <!ENTITY sum "&#8721;"> <!ENTITY lbrace "&#123;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:template name="documentStyles">
            		<link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.3/document.css"/>
            	</xsl:template>
            
            	<xsl:template match="title">
            		<h1><xsl:apply-templates/></h1>
            	</xsl:template>
            
            	<xsl:template name="p">
            		<xsl:if test="@id">
            			<a name="{@id}"></a>
            		</xsl:if>
            		<xsl:choose>
            			<xsl:when test="not(@class)">
            				<p><xsl:apply-templates/></p>
            			</xsl:when>
            			<xsl:otherwise>
            				<p class="{@class}"><xsl:apply-templates/></p>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="p">
            		<xsl:call-template name="p"/>
            	</xsl:template>
            
            	<xsl:template match="br">
            		<br/>
            	</xsl:template>
            
            	<xsl:template match="p[@number]">
            		<div class="pnumber">
            			<xsl:choose>
            				<xsl:when test="not(@number) or @number = ''">&nbsp;</xsl:when>
            				<xsl:otherwise><xsl:value-of select="@number"/></xsl:otherwise>
            			</xsl:choose>
            		</div>
            		<div class="pitem">
            			<xsl:call-template name="p"/>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="span">
            		<xsl:choose>
            			<xsl:when test="not(@class)">
            				<span><xsl:apply-templates/></span>
            			</xsl:when>
            			<xsl:when test="@class = 'italics'">
            				<em><xsl:apply-templates/></em>
            			</xsl:when>
            			<xsl:otherwise>
            				<span class="{@class}"><xsl:apply-templates/></span>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="h2">
            		<h2><xsl:apply-templates/></h2>
            	</xsl:template>
            
            	<xsl:template match="h3">
            		<h3><xsl:apply-templates/></h3>
            	</xsl:template>
            
            	<xsl:template match="h4">
            		<h4><xsl:apply-templates/></h4>
            	</xsl:template>
            
            	<xsl:template match="h5">
            		<h5><xsl:apply-templates/></h5>
            	</xsl:template>
            
            	<xsl:template match="h6">
            		<h6><xsl:apply-templates/></h6>
            	</xsl:template>
            
            	<xsl:template match="em">
            		<em><xsl:apply-templates/></em>
            	</xsl:template>
            
            	<xsl:template match="strong">
            		<strong><xsl:apply-templates/></strong>
            	</xsl:template>
            
            	<xsl:template match="a">
            		<a href="{@href}" target="{@target}"><xsl:apply-templates/></a>
            	</xsl:template>
            
            	<xsl:template match="ol">
            		<blockquote><ol><xsl:apply-templates/></ol></blockquote>
            	</xsl:template>
            
            	<xsl:template match="ul">
            		<blockquote><ul><xsl:apply-templates/></ul></blockquote>
            	</xsl:template>
            
            	<xsl:template match="li">
            		<li><xsl:apply-templates/></li>
            	</xsl:template>
            
            	<xsl:template match="img">
            		<div><img src="{@src}" alt="image"/></div>
            	</xsl:template>
            
            	<xsl:template match="pre">
            		<pre><xsl:apply-templates/></pre>
            	</xsl:template>
            
            	<xsl:template match="figure">
            		<xsl:choose>
            			<xsl:when test="@pos">
            				<div class="{@pos}"><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
            			</xsl:when>
            			<xsl:otherwise>
            				<div><img src="{@ref}" alt="{.}"/><br/><xsl:value-of select="."/></div>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="sub">
            		<sub><xsl:apply-templates/></sub>
            	</xsl:template>
            
            	<xsl:template match="sup">
            		<sup><xsl:apply-templates/></sup>
            	</xsl:template>
            
            	<xsl:template match="lt">&lt;</xsl:template>
            	<xsl:template match="gt">&gt;</xsl:template>
            	<xsl:template match="ne">&ne;</xsl:template>
            	<xsl:template match="le">&le;</xsl:template>
            	<xsl:template match="ge">&ge;</xsl:template>
            	<xsl:template match="times">&times;</xsl:template>
            	<xsl:template match="dot">&sdot;</xsl:template>
            	<xsl:template match="divide">&divide;</xsl:template>
            	<xsl:template match="sigma">&sigma;</xsl:template>
            
            	<xsl:template match="summation">
            		<span class="summation">
            			<span class="summation-upper"><xsl:value-of select="@upper"/></span>
            			<span class="summation-symbol">&sum;</span>
            			<span class="summation-lower"><xsl:value-of select="@lower"/></span>
            		</span>
            		<xsl:apply-templates/>
            	</xsl:template>
            
            	<xsl:template match="bracelist">
            		<span class="bracelist-symbol">&lbrace;</span>
            		<span class="bracelist">
            			<xsl:for-each select="item">
            				<span class="bracelist-item"><xsl:apply-templates/></span>
            			</xsl:for-each>
            		</span>
            	</xsl:template>
            
            	<xsl:template match="footlink">
            		<xsl:variable name="docID" select="/document/@id"/>
            		<a class="footlink" id="fn{$docID}_ref{@n}" href="#fn{$docID}_{@n}"><sup><xsl:if test="@quoted"><xsl:text>[</xsl:text></xsl:if><xsl:value-of select="@n"/><xsl:if test="@quoted"><xsl:text>]</xsl:text></xsl:if></sup></a>
            	</xsl:template>
            
            	<xsl:template match="footnote">
            		<xsl:variable name="docID" select="/document/@id"/>
            		<div class="footnote"><a id="fn{$docID}_{@n}" href="#fn{$docID}_ref{@n}"><sup><xsl:value-of select="@n"/></sup></a><xsl:text> </xsl:text>
            			<xsl:apply-templates/>
            		</div>
            	</xsl:template>
            
            	<xsl:template name="authors">
            		<xsl:for-each select="author"><xsl:if test="position() != 1"><xsl:text>, </xsl:text></xsl:if><xsl:if test="position() != 1 and position() = last()"><xsl:text>and </xsl:text></xsl:if><xsl:value-of select="."/></xsl:for-each>
            	</xsl:template>
            
            	<xsl:template name="formatDate">
            		<xsl:param name="date"/>
            		<xsl:param name="format">MDY</xsl:param>
            		<xsl:variable name="year">
            			<xsl:value-of select="substring-before($date,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="mon-day">
            			<xsl:value-of select="substring-after($date,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="mon">
            			<xsl:value-of select="substring-before($mon-day,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="full-day">
            			<xsl:value-of select="substring-after($mon-day,'-')"/>
            		</xsl:variable>
            		<xsl:variable name="day">
            			<xsl:choose>
            				<xsl:when test="substring($full-day,1,1) = '0'"><xsl:value-of select="substring($full-day,2)"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$full-day"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<xsl:choose>
            			<xsl:when test="$mon = '01'">January </xsl:when>
            			<xsl:when test="$mon = '02'">February </xsl:when>
            			<xsl:when test="$mon = '03'">March </xsl:when>
            			<xsl:when test="$mon = '04'">April </xsl:when>
            			<xsl:when test="$mon = '05'">May </xsl:when>
            			<xsl:when test="$mon = '06'">June </xsl:when>
            			<xsl:when test="$mon = '07'">July </xsl:when>
            			<xsl:when test="$mon = '08'">August </xsl:when>
            			<xsl:when test="$mon = '09'">September </xsl:when>
            			<xsl:when test="$mon = '10'">October </xsl:when>
            			<xsl:when test="$mon = '11'">November </xsl:when>
            			<xsl:when test="$mon = '12'">December </xsl:when>
            			<xsl:when test="$mon = '00'"/>		</xsl:choose>
            		<xsl:if test="$day != '0' and $format = 'MDY'">
            			<xsl:value-of select="$day"/><xsl:text>, </xsl:text>
            		</xsl:if>
            		<xsl:value-of select="$year"/>
            	</xsl:template>
            
            	<xsl:template match="gallery">
            		<h2><xsl:value-of select="description"/></h2>
            		<div class="gallery">
            			<xsl:apply-templates select="item" mode="gallery"/>
            		</div>
            		<div style="clear:both;"></div>
            	</xsl:template>
            
            	<xsl:template match="item" mode="gallery">
            		<div class="galleryitem">
            			<a href="{@ref}"><img src="/versions/images/current/pdf-192.jpg" alt="{.}"/></a><br/>
            			<div style="font-size:small; text-align:center;"><xsl:value-of select="."/></div>
            		</div>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'timeline']">
            		<xsl:if test="not(description)">
            			<h2>Timeline</h2>
            		</xsl:if>
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item" mode="timeline"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="timeline">
            		<xsl:if test="@ref">
            			<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            			<xsl:apply-templates select="document($documentFile)/document" mode="withDate">
            				<xsl:with-param name="itemRef" select="@ref"/>
            			</xsl:apply-templates>
            		</xsl:if>
            		<xsl:if test="not(@ref)">
            			<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="@date"/></xsl:call-template></h3>
            			<blockquote>
            				<xsl:value-of select="."/>
            			</blockquote>
            		</xsl:if>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'people']">
            		<xsl:if test="not(description)">
            			<h2>People</h2>
            		</xsl:if>
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item" mode="people"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="people">
            		<h3><xsl:value-of select="name"/></h3>
            		<xsl:apply-templates select="list"/>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'documents']">
            		<xsl:if test="description"><h2><xsl:value-of select="description"/></h2></xsl:if>
            		<ul>
            			<xsl:apply-templates select="item" mode="document"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template match="item" mode="document">
            		<xsl:variable name="documentFile"><xsl:value-of select="$rootDir"/><xsl:value-of select="@ref"/></xsl:variable>
            		<xsl:apply-templates select="document($documentFile)/document">
            			<xsl:with-param name="itemRef" select="@ref"/>
            		</xsl:apply-templates>
            	</xsl:template>
            
            	<xsl:template match="document">
            		<xsl:param name="itemRef"/>
            		<li>
            			<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/></xsl:call-template>
            		</li>
            	</xsl:template>
            
            	<xsl:template match="document" mode="withDate">
            		<xsl:param name="itemRef"/>
            		<h3><xsl:call-template name="formatDate"><xsl:with-param name="date" select="date"/><xsl:with-param name="format" select="MY"/></xsl:call-template></h3>
            		<blockquote>
            			<p>
            				<xsl:call-template name="documentSummary"><xsl:with-param name="itemRef" select="$itemRef"/><xsl:with-param name="multiLine" select="'true'"/></xsl:call-template>
            			</p>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template name="documentSummary">
            		<xsl:param name="itemRef"/>
            		<xsl:param name="multiLine">false</xsl:param>
            		<xsl:choose>
            			<xsl:when test="content|include">
            				<a href="{$itemRef}"><xsl:value-of select="title"/></a>
            				<xsl:if test="@ref">
            					<span class="small">
            						<xsl:text> [</xsl:text><a href="{@ref}">Original</a><xsl:text>]</xsl:text>
            					</span>
            				</xsl:if>
            			</xsl:when>
            			<xsl:otherwise>
            				<a href="{$itemRef}"><xsl:value-of select="title"/></a>
            			</xsl:otherwise>
            		</xsl:choose>
            		<xsl:if test="copy">
            			<span class="small">
            				<xsl:text> [</xsl:text><a href="{copy/@ref}"><xsl:value-of select="copy"/></a><xsl:text>]</xsl:text>
            			</span>
            		</xsl:if>
            		<xsl:if test="author"><xsl:if test="$multiLine = 'true'"><br/></xsl:if><span class="medium"><xsl:text> by </xsl:text><xsl:call-template name="authors"/></span></xsl:if>
            		<xsl:if test="source">
            			<span class="small">
            				<br/>
            				<xsl:text>[Source: </xsl:text>
            				<xsl:if test="site">
            					<a href="{site/@url}"><xsl:value-of select="site"/></a>
            				</xsl:if>
            				<xsl:if test="not(site)">
            					<a href="{source/@url}"><xsl:value-of select="source"/></a>
            				</xsl:if>
            				<xsl:text>]</xsl:text>
            			</span>
            		</xsl:if>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'resources']">
            		<xsl:if test="not(description)">
            			<h2>Resources</h2>
            		</xsl:if>
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item" mode="resources"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="resources">
            		<h3><xsl:value-of select="description"/></h3>
            		<xsl:apply-templates select="list"/>
            	</xsl:template>
            
            	<xsl:template match="list[@type = 'links']">
            		<xsl:if test="description">
            			<h4><xsl:value-of select="description"/></h4>
            		</xsl:if>
            		<ul>
            			<xsl:apply-templates select="item" mode="links"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template match="item" mode="links">
            		<li><a href="{@ref}"><xsl:value-of select="."/></a></li>
            	</xsl:template>
            
            	<xsl:template match="list[not(@type)]">
            		<xsl:if test="description">
            			<h2><xsl:value-of select="description"/></h2>
            		</xsl:if>
            		<blockquote>
            			<xsl:apply-templates select="item|tag" mode="outer"/>
            		</blockquote>
            	</xsl:template>
            
            	<xsl:template match="item" mode="outer">
            		<xsl:if test="description">
            			<h3><xsl:value-of select="description"/></h3>
            		</xsl:if>
            		<xsl:apply-templates select="list|item|tag" mode="inner"/>
            	</xsl:template>
            
            	<xsl:template match="list" mode="inner">
            		<xsl:if test="description">
            			<h4><xsl:value-of select="description"/></h4>
            		</xsl:if>
            		<ul>
            			<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template name="innerlist">
            		<xsl:if test="description">
            			<xsl:value-of select="description"/>
            		</xsl:if>
            		<ul>
            			<xsl:apply-templates select="list|item|para|tag" mode="inner"/>
            		</ul>
            	</xsl:template>
            
            	<xsl:template match="item" mode="inner">
            		<xsl:choose>
            			<xsl:when test="@ref">
            				<li><a href="{@ref}"><xsl:apply-templates/></a></li>
            			</xsl:when>
            			<xsl:when test="description">
            				<li><xsl:call-template name="innerlist"/></li>
            			</xsl:when>
            			<xsl:otherwise>
            				<li><xsl:apply-templates/></li>
            			</xsl:otherwise>
            		</xsl:choose>
            	</xsl:template>
            
            	<xsl:template match="para" mode="inner">
            		<li class="para"><xsl:apply-templates/></li>
            	</xsl:template>
            
            	<xsl:template match="tag" mode="outer">
            		<xsl:call-template name="tag"/>
            	</xsl:template>
            
            	<xsl:template match="tag" mode="inner">
            		<xsl:call-template name="tag"/>
            	</xsl:template>
            
            	<xsl:template name="tag">
            		<blockquote class="tag">
            			<xsl:text>&lt;</xsl:text><xsl:if test="@href"><a href="{@href}"><xsl:value-of select="@name"/></a></xsl:if><xsl:if test="not(@href)"><xsl:value-of select="@name"/></xsl:if><xsl:for-each select="attr"><xsl:text> </xsl:text><xsl:value-of select="@name"/><xsl:text>="</xsl:text><xsl:value-of select="@value"/><xsl:text>"</xsl:text></xsl:for-each>
            			<xsl:choose>
            				<xsl:when test="tag"><xsl:text>&gt;</xsl:text><xsl:apply-templates mode="inner"/><xsl:text>&lt;/</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></xsl:when>
            				<xsl:when test="normalize-space(.) != ''"><xsl:text>&gt;</xsl:text><xsl:value-of select="."/><xsl:text>&lt;/</xsl:text><xsl:value-of select="@name"/><xsl:text>&gt;</xsl:text></xsl:when>
            				<xsl:otherwise><xsl:text>/&gt;</xsl:text></xsl:otherwise>
            			</xsl:choose>
            		</blockquote>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • index.html
            <!DOCTYPE html>
            <html style="background-color: #1d1d1d">
            	<head>
            		<title>pcjs.org | /versions/pcjs/1.18.3/</title>
            		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            		<meta charset="utf-8">
            		<meta name="viewport" content="initial-scale=1">
            		<link rel="shortcut icon" type="image/x-icon" href="/versions/images/current/favicon.ico">
            		<link rel="stylesheet" type="text/css" href="/versions/pcjs/1.18.3/common.css">
            		
            	</head>
            	<body>
            		<!-- index.html generated on Fri Jun 26 2015 07:55:50 GMT+0100 (BST) -->
            		<div class="common">
            			<div class="common-top">
            				<div class="common-top-left">
            					<ul>
            						<li><a href="/">Home</a></li>
            						<li><a href="/apps/pc/">Apps</a></li>
            						<li><a href="/disks/pc/">Disks</a></li>
            						<li><a href="/devices/pc/machine/">Machines</a></li>
            						<li><a href="/docs/">Docs</a></li>
            						<li><a href="/pubs/">Pubs</a></li>
            						<li><a href="/blog/">Blog</a></li>
            						<li><a href="/docs/about/">About</a></li>
            					</ul>
            				</div>
            				<div class="common-top-right">
            					<p>Powered by <a href="http://nodejs.org" target="_blank">Node.js</a> and <a href="http://aws.amazon.com/elasticbeanstalk/" target="_blank">AWS</a> | <a href="http://github.com/jeffpar/pcjs" target="_blank">GitHub</a></p>
            				</div>
            			</div>
            			<div class="common-middle">
            				<h4>Directory of C:\<a href="/">PCJS.ORG</a>\VERSIONS\PCJS\1.18.3</h4>
            				<div class="common-sidebar">
            					<ul class="common-list">
            						<li><a href="/versions/pcjs/">\..</a></li>
            						<li><a href="/versions/pcjs/1.18.3/common.css">\COMMON.CSS</a></li>
            						<li><a href="/versions/pcjs/1.18.3/common.xsl">\COMMON.XSL</a></li>
            						<li><a href="/versions/pcjs/1.18.3/components.css">\COMPONENTS.CSS</a></li>
            						<li><a href="/versions/pcjs/1.18.3/components.xsl">\COMPONENTS.XSL</a></li>
            						<li><a href="/versions/pcjs/1.18.3/document.css">\DOCUMENT.CSS</a></li>
            						<li><a href="/versions/pcjs/1.18.3/document.xsl">\DOCUMENT.XSL</a></li>
            						<li><a href="/versions/pcjs/1.18.3/machine.xsl">\MACHINE.XSL</a></li>
            						<li><a href="/versions/pcjs/1.18.3/manifest.xsl">\MANIFEST.XSL</a></li>
            						<li><a href="/versions/pcjs/1.18.3/outline.xsl">\OUTLINE.XSL</a></li>
            						<li><a href="/versions/pcjs/1.18.3/pc-dbg.js">\PC-DBG.JS</a></li>
            						<li><a href="/versions/pcjs/1.18.3/pc.js">\PC.JS</a></li>
            					</ul>
            					
            				</div>
            				<div class="common-main">
            										<p id="random">You are in a maze of little passages, all different.</p>
            
            					<div class="common-bottom">
            						<p class="common-reference"></p>
            						<p class="common-copyright">
            							<span class="common-copyright"><a href="http://www.pcjs.org/">pcjs.org</a> website © 2012-2015 by <a href="http://twitter.com/jeffpar">@jeffpar</a></span><br/>
            							<span class="common-copyright">PCjs and C1Pjs released under <a href="http://gnu.org/licenses/gpl.html">GPL version 3 or later</a></span>
            						</p>
            					</div>
            				</div>
            			</div>
            		</div>
            		<script id="randomize" type="text/javascript">
            			(function() {
            				var p = document.getElementById('random');
            				if (p) {
            					var mags = ['BYTE-1975-11:98', 'MSJ-1986-10:34', 'MSJ-1987-05:90', 'PCTJ-1987-01:216', 'PCTJ-1987-02:222', 'PCTJ-1987-03:214', 'PCTJ-1987-04:218', 'PCTJ-1987-05:238', 'PCTJ-1987-06:236', 'PCTJ-1987-07:230', 'PCTJ-1987-08:250', 'PCTJ-1987-09:252', 'PCTJ-1987-10:231', 'PCTJ-1987-11:261', 'PCTJ-1987-12:242'];
            					var p2 = document.createElement('p');
            					p2.appendChild(document.createTextNode('In addition, you see a piece of paper lying on the floor.'));
            					var div1 = document.createElement('div'); div1.setAttribute('class', 'common-image-gallery');
            					var div2 = document.createElement('div'); div2.setAttribute('class', 'common-image-frame'); div1.appendChild(div2);
            					var div3 = document.createElement('div'); div3.setAttribute('class', 'common-image-link'); div2.appendChild(div3);
            					var mag = mags[Math.floor(Math.random() * mags.length)];
            					var parts = mag.split(':'), issue = parts[0], page = Math.floor(Math.random() * parseInt(parts[1])) + 1;
            					parts = mag.split('-');
            					var name = parts[0].toLowerCase();
            					var a = document.createElement('a'); a.setAttribute('href', '/pubs/pc/magazines/' + name + '/' + issue + '/#page-' + page); div3.appendChild(a);
            					var img = document.createElement('img'); img.setAttribute('src', 'http://static.pcjs.org/pubs/pc/magazines/' + name + '/' + issue + '/thumbs/' + issue + ' ' + page + '.jpeg'); img.setAttribute('width', '200'); a.appendChild(img);
            					p.parentNode.insertBefore(p2, p.nextSibling);
            					p2.parentNode.insertBefore(div1, p2.nextSibling)
            				}
            			})();
            		</script>
            		
            	</body>
            </html>
            
          • machine.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
            	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:output doctype-system="about:legacy-compat"/>
            
            	<xsl:include href="/versions/pcjs/1.18.3/common.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.3/components.xsl"/>
            
            	<xsl:template match="/machine">
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<xsl:call-template name="commonTop"/>
            					<div class="common-middle">
            						<p></p>
            						<div id="{@id}" class="machine {@class}js">
            							<xsl:call-template name="component">
            								<xsl:with-param name="machine" select="@id"/>
            								<xsl:with-param name="component" select="'machine'"/>
            								<xsl:with-param name="class"><xsl:value-of select="@class"/>js</xsl:with-param>
            								<xsl:with-param name="parms"><xsl:if test="@parms">,<xsl:value-of select="@parms"/></xsl:if></xsl:with-param>
            							</xsl:call-template>
            						</div>
            					</div>
            					<xsl:call-template name="commonBottom"/>
            				</div>
            				<xsl:call-template name="componentScripts">
            					<xsl:with-param name="component">
            						<xsl:choose>
            							<xsl:when test="debugger"><xsl:value-of select="@class"/>-dbg</xsl:when>
            							<xsl:otherwise><xsl:value-of select="@class"/></xsl:otherwise>
            						</xsl:choose>
            					</xsl:with-param>
            				</xsl:call-template>
            			</body>
            		</html>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • manifest.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2014-04-10" modified="2014-04-10" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
            	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:output doctype-system="about:legacy-compat"/>
            
            	<xsl:include href="/versions/pcjs/1.18.3/common.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.3/components.xsl"/>
            
            	<xsl:template match="/manifest[@type = 'document']">
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<xsl:call-template name="commonTop"/>
            					<div class="common-middle">
            						<h4>Document Manifest</h4>
            						<div class="common-sidebar">
            							<ul class="common-list-data">
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Title'"/>
            									<xsl:with-param name="node" select="title"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Version'"/>
            									<xsl:with-param name="node" select="version"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Source'"/>
            									<xsl:with-param name="node" select="source"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Documents'"/>
            									<xsl:with-param name="node" select="document"/>
            									<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
            								</xsl:call-template>
            							</ul>
            						</div>
            						<div class="common-main">
            							<p><xsl:value-of select="desc"/></p>
            							<xsl:call-template name="commonBottom"/>
            						</div>
            					</div>
            				</div>
            			</body>
            		</html>
            	</xsl:template>
            
            	<xsl:template match="/manifest[@type = 'software' or not(@type)]">
            		<xsl:variable name="machineClass">
            			<xsl:choose>
            				<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<xsl:call-template name="commonTop"/>
            					<div class="common-middle">
            						<h4>Software Manifest</h4>
            						<div class="common-sidebar">
            							<ul class="common-list-data">
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Title'"/>
            									<xsl:with-param name="node" select="title"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Version'"/>
            									<xsl:with-param name="node" select="version"/>
            									<xsl:with-param name="default">Unknown</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Type'"/>
            									<xsl:with-param name="node" select="type"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Category'"/>
            									<xsl:with-param name="node" select="category"/>
            									<xsl:with-param name="default">None</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Created'"/>
            									<xsl:with-param name="node" select="creationDate"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Creators'"/>
            									<xsl:with-param name="node" select="creator"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label"><xsl:if test="creationDate">Updated</xsl:if><xsl:if test="not(creationDate)">Released</xsl:if></xsl:with-param>
            									<xsl:with-param name="node" select="releaseDate"/>
            									<xsl:with-param name="default">Unknown</xsl:with-param>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Company'"/>
            									<xsl:with-param name="node" select="company"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Authors'"/>
            									<xsl:with-param name="node" select="author"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Contributors'"/>
            									<xsl:with-param name="node" select="contributor"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Publisher'"/>
            									<xsl:with-param name="node" select="publisher"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'License'"/>
            									<xsl:with-param name="node" select="license"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Source'"/>
            									<xsl:with-param name="node" select="source"/>
            									<xsl:with-param name="default" select="''"/>
            								</xsl:call-template>
            								<xsl:call-template name="listItem">
            									<xsl:with-param name="label" select="'Disks'"/>
            									<xsl:with-param name="node" select="disk"/>
            									<xsl:with-param name="default"><xsl:value-of select="title"/> <xsl:if test="version != ''"><xsl:text> </xsl:text><xsl:value-of select="version"/></xsl:if></xsl:with-param>
            								</xsl:call-template>
            							</ul>
            						</div>
            						<div class="common-main">
            							<xsl:for-each select="machine[not(@type) or @type = 'default']">
            								<xsl:call-template name="machine">
            									<xsl:with-param name="href" select="@href"/>
            									<xsl:with-param name="state" select="@state"/>
            								</xsl:call-template>
            							</xsl:for-each>
            							<xsl:if test="not(machine[not(@type) or @type = 'default'])">
            								<p>No default machine specified for '<xsl:value-of select="title"/>' in manifest.xml</p>
            							</xsl:if>
            							<xsl:call-template name="commonBottom"/>
            						</div>
            					</div>
            				</div>
            				<xsl:call-template name="componentScripts">
            					<xsl:with-param name="component">
            						<xsl:choose>
            							<xsl:when test="machine/@debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
            							<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
            						</xsl:choose>
            					</xsl:with-param>
            				</xsl:call-template>
            			</body>
            		</html>
            	</xsl:template>
            
            	<xsl:template name="listItem">
            		<xsl:param name="label"/>
            		<xsl:param name="node"/>
            		<xsl:param name="default">Unknown</xsl:param>
            		<xsl:if test="$node != '' or $default != ''">
            			<li><xsl:value-of select="$label"/>
            				<ul class="common-list-data-items">
            					<xsl:for-each select="$node">
            						<xsl:variable name="desc">
            							<xsl:choose>
            								<xsl:when test="desc"><xsl:value-of select="desc"/></xsl:when>
            								<xsl:when test="org"><xsl:value-of select="org"/></xsl:when>
            								<xsl:otherwise/>
            							</xsl:choose>
            						</xsl:variable>
            						<li title="{$desc}">
            							<xsl:variable name="value">
            								<xsl:choose>
            									<xsl:when test="name">
            										<xsl:value-of select="name"/>
            									</xsl:when>
            									<xsl:when test="normalize-space(./text()) != ''">
            										<xsl:value-of select="normalize-space(./text())"/>
            									</xsl:when>
            									<xsl:otherwise>
            										<xsl:value-of select="$default"/>
            									</xsl:otherwise>
            								</xsl:choose>
            							</xsl:variable>
            							<xsl:variable name="href">
            								<xsl:if test="@href"><xsl:value-of select="@href"/></xsl:if>
            							</xsl:variable>
            							<xsl:choose>
            								<xsl:when test="$href != ''">
            									<a href="{$href}"><xsl:value-of select="$value"/></a>
            								</xsl:when>
            								<xsl:otherwise>
            									<xsl:value-of select="$value"/>
            								</xsl:otherwise>
            							</xsl:choose>
            							<xsl:if test="page">
            								<ul class="common-list-data-subitems">
            									<xsl:for-each select="page">
            										<li>
            											<xsl:if test="@href">
            												<a href="{$href}{@href}"><xsl:value-of select="."/></a>
            											</xsl:if>
            											<xsl:if test="not(@href)">
            												<xsl:value-of select="."/>
            											</xsl:if>
            										</li>
            									</xsl:for-each>
            								</ul>
            							</xsl:if>
            						</li>
            					</xsl:for-each>
            					<xsl:if test="not($node)">
            						<xsl:if test="@href">
            							<a href="{@href}"><xsl:value-of select="$default"/></a>
            						</xsl:if>
            						<xsl:if test="not(@href)">
            							<xsl:value-of select="$default"/>
            						</xsl:if>
            					</xsl:if>
            				</ul>
            			</li>
            		</xsl:if>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • outline.xsl
            <?xml version="1.0" encoding="UTF-8"?>
            <!-- author="Jeff Parsons (@jeffpar)" website="http://www.pcjs.org/" created="2012-05-05" modified="2014-02-23" license="http://www.gnu.org/licenses/gpl.html" -->
            <!DOCTYPE xsl:stylesheet [
            	<!ENTITY nbsp "&#160;"> <!ENTITY sect "&#167;"> <!ENTITY copy "&#169;"> <!ENTITY para "&#182;"> <!ENTITY ndash "&#8211;"> <!ENTITY mdash "&#8212;">
            	<!ENTITY lsquo "&#8216;"> <!ENTITY rsquo "&#8217;"> <!ENTITY ldquo "&#8220;"> <!ENTITY rdquo "&#8221;"> <!ENTITY dagger "&#8224;"> <!ENTITY Dagger "&#8225;">
            ]>
            <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            
            	<xsl:output doctype-system="about:legacy-compat"/>
            
            	<xsl:include href="/versions/pcjs/1.18.3/common.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.3/document.xsl"/>
            	<xsl:include href="/versions/pcjs/1.18.3/components.xsl"/>
            
            	<xsl:template match="/outline">
            		<xsl:variable name="machineClass">
            			<xsl:choose>
            				<xsl:when test="machine/@class"><xsl:value-of select="machine/@class"/></xsl:when>
            				<xsl:otherwise><xsl:value-of select="$MACHINECLASS"/></xsl:otherwise>
            			</xsl:choose>
            		</xsl:variable>
            		<html lang="en">
            			<head>
            				<title><xsl:value-of select="title"/><xsl:text> | </xsl:text><xsl:value-of select="$SITEHOST"/></title>
            				<xsl:call-template name="commonStyles"/>
            				<xsl:call-template name="documentStyles"/>
            				<xsl:call-template name="componentStyles"/>
            			</head>
            			<body>
            				<div class="common">
            					<div class="page justified">
            						<xsl:apply-templates/>
            					</div>
            				</div>
            				<xsl:call-template name="componentScripts">
            					<xsl:with-param name="component">
            						<xsl:choose>
            							<xsl:when test="debugger"><xsl:value-of select="$machineClass"/>-dbg</xsl:when>
            							<xsl:otherwise><xsl:value-of select="$machineClass"/></xsl:otherwise>
            						</xsl:choose>
            					</xsl:with-param>
            				</xsl:call-template>
            			</body>
            		</html>
            	</xsl:template>
            
            </xsl:stylesheet>
            
          • pc-dbg.js
            (function(){var f,aa,ba,ea={163840:[40,1,8],184320:[40,1,9],327680:[40,2,8],368640:[40,2,9],737280:[80,2,9],1228800:[80,2,15],1474560:[80,2,18],2949120:[80,2,36]};
            function fa(a,b){var c;if(a){b||(b=16);if("$"==a.charAt(0))b=16,a=a.substr(1);else if("0x"==a.substr(0,2))b=16,a=a.substr(2);else{var d=a.charAt(a.length-1).toLowerCase();"h"==d?(b=16,d=null):"."==d&&(b=10,d=null);null===d&&(a=a.substr(0,a.length-1))}var e,d=a;(b&&10!=b?16==b?null!==d.match(/^[0-9a-f]+$/i):1:null!==d.match(/^[0-9]+$/))&&!isNaN(e=parseInt(a,b))&&(c=e|0)}return c}
            function h(a,b){var c="";void 0===b?b=8:8<b&&(b=8);if(null==a||isNaN(a))for(;0<b--;)c="?"+c;else for(;0<b--;){var d=a&15,d=d+(0<=d&&9>=d?48:55),c=String.fromCharCode(d)+c;a>>=4}return c}function k(a){return"0x"+h(a,2)}function ga(a){return"0x"+h(a,4)}function ha(a,b){var c=a,d=a.lastIndexOf("/");0<=d&&(c=a.substr(d+1));d=c.indexOf("&");0<d&&(c=c.substr(0,d));b&&(d=c.lastIndexOf("."),0<d&&(c=c.substring(0,d)));return c}
            function ia(a){var b="",c=a.lastIndexOf(".");0<=c&&(b=a.substr(c+1).toLowerCase());return b}var ja={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};function ka(a){return a.replace(/[&<>"']/g,function(a){return ja[a]})}function la(a,b){var c="",d;for(d in a)d=d.replace(/([\\[\]*{}().+?])/g,"\\$1"),c+=(c?"|":"")+d;return b.replace(new RegExp("("+c+")","g"),function(b){return a[b]})}function ma(a,b){return a+"                                        ".substr(0,b-a.length)}
            function na(a){return String.prototype.trim?a.trim():a.replace(/^\s+|\s+$/g,"")}function oa(a,b,c){var d=0,e=a.length,g=0;for(void 0===c&&(c=function(a,b){return a>b?1:a<b?-1:0});d<e;){var l=d+e>>1,p;p=c(b,a[l]);0<p?d=l+1:(e=l,g=!p)}return g?d:~d}function pa(a,b,c){c=oa(a,b,c);0>c&&a.splice(-(c+1),0,b)}var ra=Date.now||function(){return+new Date};
            function sa(){function a(a){return(10>a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}var ua=[31,28,31,30,31,30,31,31,30,31,30,31];function va(a,b){var c=0,d=1,e;for(e in a){if(d>=arguments.length)break;d++;c=void 0}return c}function wa(a,b){return(b&a.Sq)>>a.shift}
            function ya(a,b){var c;if(Array.prototype.indexOf)return a.indexOf(b,c);c=c||0;0>c&&(c+=a.length);0>c&&(c=0);for(var d=a.length;c<d;c++)if(c in a&&a[c]===b)return c;return-1}
            function za(a,b,c,d,e,g){b=!!b;var l=0,p=null,v=ha(a),w=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");b&&(w.onreadystatechange=function(){4===w.readyState&&(p=w.responseText,200==w.status||!w.status&&p.length&&"file:"==(window?window.location.protocol:"file:")||(l=w.status||-1),e&&(d?e.call(d,v,p,l,g):e(v,p,l,g)))});if(c){var F="",K;for(K in c)c.hasOwnProperty(K)&&(F&&(F+="&"),F+=K+"="+encodeURIComponent(c[K]));F=F.replace(/%20/g,"+");w.open("POST",
            a,b);w.setRequestHeader("Content-type","application/x-www-form-urlencoded");w.send(F)}else w.open("GET",a,b),w.send();a=[];b||(p=w.responseText,200!=w.status&&(l=w.status||-1),e&&(d?e.call(d,v,p,l,g):e(v,p,l,g)),a=[l,p]);return a}function Aa(){return"http://"+(window?window.location.host:"www.pcjs.org")}function Ba(a){window&&window.alert(a)}function Ca(a){var b=!1;window&&(b=window.confirm(a));return b}var Da=null;
            function Ea(){if(null==Da){var a=!1;if(window)try{window.localStorage.setItem("PCjs.localStorage","PCjs.localStorage"),a="PCjs.localStorage"==window.localStorage.getItem("PCjs.localStorage"),window.localStorage.removeItem("PCjs.localStorage")}catch(b){a=!1}Da=a}return Da}function Fa(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}return b}function Ga(a,b){try{return window.localStorage.setItem(a,b),!0}catch(c){}return!1}
            function Ia(a){if(window){var b=window?window.navigator.userAgent:"";return"iOS"==a&&b.match(/(iPod|iPhone|iPad)/)&&b.match(/AppleWebKit/)||"MSIE"==a&&b.match(/(MSIE|Trident)/)||0<=b.indexOf(a)?!0:!1}return!1}function Ja(a,b,c){function d(){--a;0<=a&&(b()||(a=0));0<a?setTimeout(d,0):c()}d()}
            function Ka(a,b){function c(){b(100===d)&&(e=setTimeout(c,d),d=100)}var d=0,e=null,g=!1;a.onmousedown=function(){g||e||(d=500,c())};a.ontouchstart=function(){e||(d=500,c())};a.onmouseup=a.onmouseout=function(){e&&(clearTimeout(e),e=null)};a.ontouchend=a.ontouchcancel=function(){e&&(clearTimeout(e),e=null);g=!0}}var La={init:[],show:[],exit:[]},Ma=!1,Na=!0;function Oa(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Pa(a){La.init.push(a)}
            function Qa(a){if(Na)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){Ba("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.")}}function Ra(a){!Na&&a?(Na=!0,Ma&&Ta("init")):Na=a}function Ta(a){La[a]&&Qa(La[a])}Oa("onload",function(){Ma=!0;Qa(La.init)});Oa("onpageshow",function(){Qa(La.show)});Oa(Ia("Opera")||Ia("iOS")?"onunload":"onbeforeunload",function(){Qa(La.exit)});
            function Ua(a,b,c,d){this.type=a;b||(b={id:"",name:""});this.id=b.id;this.name=b.name;this.Gn=b.comment;this.ls=b;void 0===this.id&&(this.id="");b=this.id.indexOf(".");0<b?(this.fo=this.id.substr(0,b),this.Lg=this.id.substr(b+1)):this.Lg=this.id;this[a]=c;this.fa={Dg:!1,$c:!1,il:!1,jc:!1,Ld:!1};this.gj=null;this.fa.Ld=!1;this.va={};this.Y=null;this.Yb=d||-1;Wa[Wa.length]=this}var Xa=void 0,Ya={};
            if(window){Xa||(Xa=window.location.search.substr(1));for(var ab,bb=/\+/g,cb=/([^&=]+)=?([^&]*)/g;ab=cb.exec(Xa);)Ya[decodeURIComponent(ab[1].replace(bb," "))]=decodeURIComponent(ab[2].replace(bb," "))}function db(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
            function eb(a,b){b||(b=Ua);a.prototype=db(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}var Wa=[];function fb(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Wa.length;b++){var d=Wa[b];a&&d.id.indexOf(a)||c.push(d)}return c}function gb(a,b){if(void 0!==a){var c;b&&0<(c=b.indexOf("."))&&(a=b.substr(0,c+1)+a);for(c=0;c<Wa.length;c++)if(Wa[c].id===a)return Wa[c]}return null}
            function hb(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<Wa.length;d++)if(c)c==Wa[d]&&(c=null);else if(!(a!=Wa[d].type||b&&Wa[d].id.indexOf(b)))return Wa[d]}return null}function ib(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("({"+a+"})")}catch(c){Ba(c.message+" ("+a+")")}return b}window&&!window.document.ELEMENT_NODE&&(window.document.ELEMENT_NODE=1);
            function jb(a,b){for(var c=kb(b.parentNode,"pcjs-control"),d=0;d<c.length;d++)for(var e=c[d].childNodes,g=0;g<e.length;g++){var l=e[g];if(l.nodeType===window.document.ELEMENT_NODE){var p=l.getAttribute("class");if(p)for(var v=p.split(" "),w=0;w<v.length;w++)switch(p=v[w],p){case "pcjs-binding":(p=ib(l))&&p.binding&&a.Nb(p.type,p.binding,l),w=v.length}}}}
            function kb(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
            Ua.prototype={constructor:Ua,parent:null,toString:function(){return this.name?this.name:this.id||this.type},Nb:function(a,b,c){switch(b){case "clear":return this.va[b]||(this.va[b]=c,c.onclick=function(a){return function(){a.va.print&&(a.va.print.value="")}}(this)),!0;case "print":return this.va[b]||(this.Ih=this.va[b]=c,c.value="",this.R=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
            this.Da=function(a,b,c){this.R(a,"notice",c)}),!0;default:return!1}},log:function(){},assert:function(){},R:function(){},status:function(a){this.R(this.Lg+": "+a)},Da:function(a,b){b||Ba(a)},lc:function(){return this.fa.jc=!0},kc:function(a,b){b&&(this.fa.jc=!1);return!0},qa:function(a){if(this.Y){a=this===this.Y?a|0:a||this.Yb;var b=this.Y.Yb&a;return b===a||!!(b&this.Y.fp)}return!1},ab:function(a,b,c){return this.Y?((!0===b||this.qa(b|0))&&this.Y.message(a,c),!0):!1}};
            function m(a,b,c,d,e,g,l){a.Y&&(!0===l?l=0:null==l&&(l=a.Yb),lb(a.Y,a,b,c,d,e,g,l))}function mb(a,b){if(a.fa.il)return a.fa.$c&&(a.fa.$c=!1),a.fa.il=!1;if(a.fa.Ld)return a.R(a.toString()+" error"),!1;a.fa.$c=b;return a.fa.$c}function nb(a,b){a.fa.$c&&(b?a.fa.il=!0:void 0===b&&a.R(a.toString()+" busy"));return a.fa.$c}function ob(a,b){if(!a.fa.Ld&&(a.fa.Dg=!1!==b,a.fa.Dg)){var c=a.gj;a.gj=null;c&&c()}}function pb(a,b){b&&(a.fa.Dg?b():a.gj=b);return a.fa.Dg}function qb(a,b){a.fa.Ld=!0;a.Da(b)}
            var rb="undefined"!==typeof ArrayBuffer;function tb(a){Ua.call(this,"Panel",a,tb);this.canvas=null;this.Pe=this.Qe=this.Th=-1}eb(tb);function ub(a,b,c,d){this.$f=[a,b,c,d];this.zk=null;void 0===a&&(this.$f[0]=256*Math.random()|0,this.$f[1]=256*Math.random()|0,this.$f[2]=256*Math.random()|0,this.$f[3]=255,this.zk=null)}ub.prototype.toString=function(){this.zk||(this.zk="#"+h(this.$f[0],2)+h(this.$f[1],2)+h(this.$f[2],2));return this.zk};function vb(a,b,c,d){this.x=a;this.y=b;this.Xc=c;this.nd=d}
            vb.prototype.contains=function(a,b){return a>=this.x&&a<this.x+this.Xc&&b>=this.y&&b<this.y+this.nd};function wb(a,b,c,d){void 0===d&&(d=b>=c>>2);d?(b=new vb(a.x,a.y,a.Xc,a.nd*b/c|0),a.y+=b.nd,a.nd-=b.nd):(b=new vb(a.x,a.y,a.Xc*b/c|0,a.nd),a.x+=b.Xc,a.Xc-=b.Xc);return b}f=tb.prototype;f.Nb=function(a,b,c){return this.Fa&&this.Fa.Nb(a,b,c)||this.O&&this.O.Nb(a,b,c)||this.Ja&&this.Ja.Nb(a,b,c)||this.Y&&this.Y.Nb(a,b,c)?!0:this.parent.Nb.call(this,a,b,c)};
            f.Kc=function(a,b,c,d){this.Fa=a;this.ma=b;this.O=c;this.Y=d;this.Ja=xb(a,"Keyboard")};f.lc=function(a,b){b||yb();return!0};f.kc=function(){return!0};f.bl=function(a,b){a.button||(this.Th=b?0:-1,zb(this,a,b))};f.lo=function(a){zb(this,a)};
            function zb(a,b,c){var d=1280/a.canvas.offsetWidth,e=720/a.canvas.offsetHeight,g=a.canvas.getBoundingClientRect(),d=(b.clientX-g.left)*d|0;b=(b.clientY-g.top)*e|0;null==c&&(a.Th||(a.Th=Math.abs(a.Pe-d)>Math.abs(a.Qe-b)?1:2),1==a.Th?b=a.Qe:2==a.Th&&(d=a.Pe));a.Pe=d;a.Qe=b;if(0<=d&&1280>d&&0<=b&&720>b){a:{c=d;if(960>c&&a.mb&&a.mb.og)for(g=0;g<a.mb.og.length;g++)if(e=a.mb.og[g],e.contains(c,b)){c-=e.x;b-=e.y;var d=a.mb.sh[g],l=wa(Ab.Ao,a.mb.Gk[d.Hp]),g=l*a.ma.nb,d=(l+d.re)*a.ma.nb-1;0<b&&(g+=e.Xc*(b-
            1)*a.Do);g+=c*a.Do;g|=0;g>d&&(g=d);c=g;break a}c=n}c!==n&&(c&=-16,c!=a.pn&&(Bb(a,c,!0),a.pn=c))}}
            f.zd=function(){if(this.canvas&&this.Wi&&this.cf&&this.Kf){var a=this.cf.width,b=this.cf.height;this.Kf.fillStyle="black";this.Kf.fillRect(0,0,a,b);Cb(this,18,this.cf,this.Kf,this.canvas.style.color);Db(this,3);Eb(this,"CPU");Eb(this,"Target");Eb(this,"Current");Hb(this);Eb(this,this.O.ka);Eb(this,Ib(this.O));Eb(this,Kb(this.O));Hb(this,2);Db(this,8);var c=this.O.ka<Lb?4:8;this.ar=16;this.to=c;Eb(this,"AX",this.O.F,2);Eb(this,"DS",this.O.bb.ia,0,1);Eb(this,"DX",this.O.H,2);Eb(this,"SI",this.O.K,0,
            1.5);Eb(this,"BX",this.O.D,2);Eb(this,"ES",this.O.Ma.ia,0,1);Eb(this,"CX",this.O.G,2);Eb(this,"DI",this.O.J,0,1.5);Eb(this,"CS",Mb(this.O),2);Eb(this,"SS",this.O.ua.ia,0,1);Eb(this,"IP",q(this.O),2);Eb(this,"SP",r(this.O),0,1.5);Eb(this,"PS",c=Nb(this.O),2);Eb(this,"BP",this.O.L,0,1.5);this.O.ka>=Lb&&(Eb(this,"FS",this.O.xc.ia,2),Eb(this,"CR0",this.O.hb,0,1),Eb(this,"GS",this.O.yc.ia,2),Eb(this,"CR3",this.O.uf,0,1.5));Db(this,9);Eb(this,"V"+(c&Ob?1:0));Eb(this,"D"+(c&Pb?1:0));Eb(this,"I"+(c&Qb?1:
            0));Eb(this,"T"+(c&Rb?1:0));Eb(this,"S"+(c&Sb?1:0));Eb(this,"Z"+(c&Tb?1:0));Eb(this,"A"+(c&Ub?1:0));Eb(this,"P"+(c&Vb?1:0));Eb(this,"C"+(c&Wb?1:0),0,2);Bb(this,this.pn);this.Wi.drawImage(this.cf,0,0,a,b,this.Iu,this.Lu,this.gu,this.ju)}};function Xb(a,b,c,d){a.mb.sh[a.mb.An++]={Hp:b,re:c,type:d};return va(Ab,b,c,0,d)}
            function Bb(a,b,c){if(a.Wi&&a.cf&&a.Kf){var d=a.cf.width;a.Kf.fillStyle="black";a.Kf.fillRect(0,360,d,360);Cb(a,378,a.cf,a.Kf,a.canvas.style.color);Db(a,24);if(null==b)Eb(a,"Mouse over memory to dump");else{Eb(a,"0x"+h(b),null,0,1);for(var e=1;16>=e;e++){for(var g="",l=1;8>=l;l++){var p=Yb(a.ma,b++);Eb(a,h(p,2),null,1);g+=32<=p&&128>p?String.fromCharCode(p):"."}Eb(a,g,null,0,1)}}c&&a.Wi.drawImage(a.cf,0,360,d,360,a.Gu,a.Ju,a.eu,a.hu)}}
            function Cb(a,b,c,d,e){var g,l=a.et=10;a.Ad=l;a.kg=b;a.Ig=a.bo=18;g||(g=a.Yn||a.bo+"px Monaco, Lucida Console, Courier New");a.hj=a.Yn=g;c&&(a.hp=c);d&&(a.$d=d,a.np=e||"white")}function Db(a,b){a.cl=a.hp.width/b|0}function Hb(a,b){a.Ad=a.et;a.kg+=(a.Ig+2)*(b||1)}function Eb(a,b,c,d,e){a.$d.font=a.hj;a.$d.fillStyle=a.np;a.$d.fillText(b,a.Ad,a.kg);a.Ad+=a.cl;null!=c&&(16!=a.ar?b=c.toString():(b=8>a.to?"0x":"",b+=h(c,a.to)),a.$d.fillText(b,a.Ad,a.kg),a.Ad+=a.cl);d&&(a.Ad+=a.cl*d);e&&Hb(a,e)}
            function yb(){for(var a=!1,b=kb(window.document,"pcjs","panel"),c=0;c<b.length;c++){var d=b[c],e=ib(d),g=gb(e.id);g||(a=!0,g=new tb(e));jb(g,d);a&&ob(g)}}Pa(yb);
            function Zb(a,b,c){Ua.call(this,"Bus",a,Zb);this.O=b;this.Y=c;this.Be=a.buswidth||20;this.Mk=Math.pow(2,this.Be);this.Vh=this.Db=this.Mk-1|0;this.Ca=32==this.Be||20>=this.Be?12:24>=this.Be?14:15;this.nb=1<<this.Ca;this.oo=this.nb>>2;this.Ga=this.nb-1;this.Ae=this.Mk/this.nb|0;this.td=this.Ae-1;this.le=[];this.me=[];this.Qh=this.Rh=!1;this.xl();ob(this)}eb(Zb);var Ab,$b={Ao:20,count:8,cu:1,type:3},ac=0,bc;for(bc in $b){var cc=$b[bc];$b[bc]={Sq:(1<<cc)-1<<ac,shift:ac};ac+=cc}Ab=void 0;f=Zb.prototype;
            f.xl=function(){var a=new t;this.na=Array(this.Ae);for(var b=0;b<this.Ae;b++)this.na[b]=a;this.O.xl(this.na,this.Ca);a=this.O;a.Db=a.Ee=this.Db};f.reset=function(){dc(this,!0)};f.lc=function(a,b){b||this.reset();return!0};
            function ec(a,b,c,d,e){for(var g=b>>>a.Ca;0<c&&g<a.na.length;){var l=a.na[g],p=g*a.nb,v=c>a.nb?a.nb:c;if(l&&l.size){if(l.type==d&&l.Z==e){if(b+c<=l.Ba)return l.gg+=l.Ba-b,l.Ba=b,!0;if(b>=l.Ba+l.gg){v=l.size-(b-p);v>c&&(v=c);l.gg=b-l.Ba+v;c-=v;b=p+a.nb;continue}}return fc(1,b,c)}l=a.na[g++]=new t(b,v,a.nb,d,e);a.Y&&gc(l,a.Y,b,a.nb);c-=v;b=p+a.nb}return 0<c?fc(2,b,c):!0}
            function dc(a,b){if(32==a.Be)b?a.lg&&(hc(a,1048576,1048576,a.lg),a.lg=null):a.lg||(a.lg=ic(a,1048576,1048576),hc(a,1048576,1048576,ic(a,0,1048576)));else if(20<a.Be){var c=a.Db&-1048577|(b?1048576:0);if(c!=a.Db&&(a.Db=c,a.O)){var d=a.O;d.Db=d.Ee=c}}}f.Bk=function(a,b,c){if(!(a&this.Ga||!b||b&this.Ga)){for(var d=a>>>this.Ca;0<b;){var e=this.na[d];if(!e.Z)return fc(5,a,b);e.Sd(c);b-=this.nb;d++}return!0}return fc(3,a,b)};
            function jc(a,b,c){if(!(b&a.Ga||!c||c&a.Ga)){for(var d=b>>>a.Ca;0<c;){b=d*a.nb;var e=a.na[d++]=new t(b);a.Y&&gc(e,a.Y,b,a.nb);c-=a.nb}return!0}return fc(4,b,c)}function ic(a,b,c){var d=[];for(b>>>=a.Ca;0<c&&b<a.na.length;)d.push(a.na[b++]),c-=a.nb;return d}function hc(a,b,c,d,e){for(var g=0,l=b>>>a.Ca;0<c&&l<a.na.length;){var p=d[g++];if(!p)break;if(void 0!==e){var v=new t(b);a.Y&&gc(v,a.Y,b,a.nb);v.clone(p,e);p=v}a.na[l++]=p;c-=a.nb}}
            f.Qa=function(a){return this.na[(a&this.Db)>>>this.Ca].tc(a&this.Ga,a)};function Yb(a,b){return a.na[(b&a.Db)>>>a.Ca].Yg(b&a.Ga,b)}f.ra=function(a){var b=a&this.Ga,c=(a&this.Db)>>>this.Ca;return b!=this.Ga?this.na[c].ji(b,a):this.na[c++].tc(b,a)|this.na[c&this.td].tc(0,a+1)<<8};function kc(a,b){var c=b&a.Ga,d=(b&a.Db)>>>a.Ca;return c!=a.Ga?a.na[d].Nm(c,b):a.na[d++].Yg(c,b)|a.na[d&a.td].Yg(0,b+1)<<8}
            f.fe=function(a){var b=a&this.Ga,c=(a&this.Db)>>>this.Ca;if(b<this.Ga-2)return this.na[c].Ec(b,a);var d=(b&3)<<3;return this.na[c].Ec(b&-4,a)>>>d|this.na[c+1&this.td].Ec(0,a+3)<<32-d};f.dd=function(a,b){this.na[(a&this.Db)>>>this.Ca].Fc(a&this.Ga,b&255,a)};f.Kb=function(a,b){var c=a&this.Ga,d=(a&this.Db)>>>this.Ca;c!=this.Ga?this.na[d].ui(c,b&65535,a):(this.na[d++].Fc(c,b&255,a),this.na[d&this.td].Fc(0,b>>8&255,a+1))};
            function lc(a,b,c){var d=b&a.Ga,e=(b&a.Db)>>>a.Ca;d!=a.Ga?a.na[e].an(d,c&65535,b):(a.na[e++].ti(d,c&255,b),a.na[e&a.td].ti(0,c>>8&255,b+1))}f.Ak=function(a,b){var c=a&this.Ga,d=(a&this.Db)>>>this.Ca;if(c<this.Ga-2)this.na[d].Oe(c,b);else{var e,g=(c&3)<<3,c=c&-4;e=this.na[d].Ec(c,a);this.na[d].Oe(c,e&~(-1<<g)|b<<g,a);d=d+1&this.td;a+=3;e=this.na[d].Ec(0,a);this.na[d].Oe(0,e&-1<<g|b>>>32-g,a)}};
            function mc(a){for(var b=0,c=[],d=0;d<a.Ae;d++){var e=a.na[d];if(e.Ta||e.On){c[b++]=d;var g=b++;a:if(e=e.save()){for(var l=0,p=0,v=[];l<e.length;){for(var w=e[l],F=l+1;F<e.length&&e[F]===w;)F++;v[p++]=F-l;v[p++]=w;l=F}if(v.length<e.length){e=v;break a}}c[g]=e}}c[b]=!a.lg&&a.Vh==a.Db;return c}function nc(a,b){if(void 0===b)return a.Qh=!a.Qh,a.Qh;void 0===a.le[b]&&(a.le[b]=[null,null,!1]);a.le[b][2]=!a.le[b][2];return a.le[b][2]}
            function oc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var g=a,l=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=l;w++)void 0!==g.le[w]?Ba("Input port "+ga(w)+" registered by "+g.le[w][0].id+", ignoring "+p.id):g.le[w]=[p,v,!1,!1]}}function pc(a,b,c){var d=255,e=a.le[b];void 0!==e?(e[1]&&(c=e[1].call(e[0],b,c),void 0!==c&&(d=c)),a.Y&&a.Qh!=e[2]&&qc(a.Y,b,d)):a.Y&&(lb(a.Y,a,b,null,c),a.Qh&&qc(a.Y,b,d));return d}
            function rc(a,b){if(void 0===b)return a.Rh=!a.Rh,a.Rh;void 0===a.me[b]&&(a.me[b]=[null,null,!1]);a.me[b][2]=!a.me[b][2];return a.me[b][2]}function sc(a,b,c,d){void 0===d&&(d=0);for(var e in c){var g=a,l=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=l;w++)void 0!==g.me[w]?Ba("Output port "+ga(w)+" registered by "+g.me[w][0].id+", ignoring "+p.id):g.me[w]=[p,v,!1,!1]}}
            function tc(a,b,c,d){var e=a.me[b];void 0!==e?(e[1]&&e[1].call(e[0],b,c,d),a.Y&&a.Rh!=e[2]&&uc(a.Y,b,c)):a.Y&&(lb(a.Y,a,b,c,d),a.Rh&&uc(a.Y,b,c))}function fc(a,b,c){Ba("Memory block error ("+a+","+h(b)+","+h(c)+")");return!1}var vc;if(rb){var wc=new ArrayBuffer(2);(new DataView(wc)).setUint16(0,256,!0);vc=256===(new Uint16Array(wc))[0]}else vc=!1;var xc=vc;
            function t(a,b,c,d,e,g){this.id=yc+=2;this.ea=null;this.offset=0;this.Ba=a;this.gg=b;this.size=c||0;this.type=d||zc;this.ee=d==Ac;this.Z=null;this.O=g;this.Ta=this.On=!1;Bc(this);if(c)if(e)this.Z=e,a=e.$n(a),this.ea=a[0],this.offset=a[1],this.Sd(e.ul());else if(rb)this.buffer=new ArrayBuffer(c),this.hf=new DataView(this.buffer,0,c),this.Wb=new Uint8Array(this.buffer,0,c),this.Gi=new Uint16Array(this.buffer,0,c>>1),this.ea=new Int32Array(this.buffer,0,c>>2),this.Sd(xc?Cc:Dc);else{this.ea=Array(c>>
            2);for(e=0;e<this.ea.length;e++)this.ea[e]=0;this.Sd(Ec)}else this.Sd()}var zc=0,Ac=2,Fc="NONE RAM ROM VIDEO H/W UNPAGED PAGED".split(" "),Gc=["black","blue","green","cyan"],yc=0;function Hc(a){rb&&!xc&&(a=a<<24|a<<8&16711680|a>>8&65280|a>>>24);return a}
            t.prototype={constructor:t,parent:null,clone:function(a,b){this.id=a.id|1;this.gg=a.gg;this.size=a.size;b&&(this.type=b,this.ee=b==Ac);rb?(this.buffer=a.buffer,this.hf=a.hf,this.Wb=a.Wb,this.Gi=a.Gi,this.ea=a.ea,this.Sd(xc?Cc:Dc)):(this.ea=a.ea,this.Sd(Ec))},save:function(){var a,b;if(this.Z)a=null;else if(rb)for(a=Array(this.size>>2),b=0;b<a.length;b++)a[b]=this.hf.getInt32(b<<2,!0);else a=this.ea;return a},restore:function(a){if(this.Z)return null==a;if(a&&this.size==a.length<<2){var b;if(rb)for(b=
            0;b<a.length;b++)this.hf.setInt32(b<<2,a[b],!0);else this.ea=a;return this.Ta=!0}return!1},Sd:function(a){a||(a=5==this.type?Ic:6==this.type?Jc:Lc);Mc(this,a,!0);Nc(this,a,!0)},Xe:function(a,b){this.Y&&(b?0===this.Cn++&&Nc(this,Oc):0===this.zn++&&Mc(this,Oc))},Go:function(){this.Y&&this.Y.qa(128)&&this.Y.message("attempt to read invalid block %"+h(this.Ba),!0);return 255},Af:function(a,b){this.Y&&this.Y.qa(128)&&this.Y.message("attempt to write "+ga(b)+" to invalid block %"+h(this.Ba),!0)},Ho:function(a,
            b){return this.tc(a,b)|this.tc(a+1,b)<<8},Eo:function(a,b){return this.tc(a,b)|this.tc(a+1,b)<<8|this.tc(a+2,b)<<16|this.tc(a+3,b)<<24},$o:function(a,b){this.Fc(a,b&255);this.Fc(a+1,b>>8)},Yo:function(a,b){this.Fc(a,b&255);this.Fc(a+1,b>>8&255);this.Fc(a+2,b>>16&255);this.Fc(a+3,b>>>24)},rs:function(a){return this.ea[a>>2]>>>((a&3)<<3)&255},Ds:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ea[b]>>a;return 24>a?c&65535:c&255|(this.ea[b+1]&255)<<8},xs:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ea[b];
            a&&(c=c>>>a|this.ea[b+1]<<32-a);return c},Qs:function(a,b){var c=a>>2,d=(a&3)<<3;this.ea[c]=this.ea[c]&~(255<<d)|b<<d;this.Ta=!0},bt:function(a,b){var c=a>>2,d=(a&3)<<3;24>d?this.ea[c]=this.ea[c]&~(65535<<d)|b<<d:(this.ea[c]=this.ea[c]&16777215|b<<24,c++,this.ea[c]=this.ea[c]&-256|b>>8);this.Ta=!0},Ws:function(a,b){var c=a>>2,d=(a&3)<<3;if(d){var e=-1<<d;this.ea[c]=this.ea[c]&~e|b<<d;c++;this.ea[c]=this.ea[c]&e|b>>>32-d}else this.ea[c]=b;this.Ta=!0},ps:function(a,b){this.Y&&Pc(this.Y,b);return this.Yg(a,
            b)},Bs:function(a,b){this.Y&&(Pc(this.Y,b)||Pc(this.Y,b+1));return this.Nm(a,b)},vs:function(a,b){this.Y&&(Pc(this.Y,b)||Pc(this.Y,b+1)||Pc(this.Y,b+2)||Pc(this.Y,b+3));return this.Fo(a,b)},Os:function(a,b,c){this.Y&&Qc(this.Y,c);this.ee?this.Af(a,b,c):this.ti(a,b,c)},$s:function(a,b,c){this.Y&&(Qc(this.Y,c)||Qc(this.Y,c+1));this.ee?this.Af(a,b,c):this.an(a,b,c)},Us:function(a,b,c){this.Y&&(Qc(this.Y,this.Ba+a)||Qc(this.Y,this.Ba+a+1)||Qc(this.Y,this.Ba+a+2)||Qc(this.Y,this.Ba+a+3));this.ee?this.Af(a,
            b,c):this.Zo(a,b,c)},ss:function(a,b){this.kd.ea[this.qd]|=this.qe;this.ld.ea[this.rd]|=this.qe;return this.sg.tc(a,b)},Es:function(a,b){this.kd.ea[this.qd]|=this.qe;this.ld.ea[this.rd]|=this.qe;return this.sg.ji(a,b)},ys:function(a,b){this.kd.ea[this.qd]|=this.qe;this.ld.ea[this.rd]|=this.qe;return this.sg.Ec(a,b)},Rs:function(a,b,c){this.kd.ea[this.qd]|=this.qe;this.ld.ea[this.rd]|=this.Wk;this.sg.Fc(a,b,c)},ct:function(a,b,c){this.kd.ea[this.qd]|=this.qe;this.ld.ea[this.rd]|=this.Wk;this.sg.ui(a,
            b,c)},Xs:function(a,b,c){this.kd.ea[this.qd]|=this.qe;this.ld.ea[this.rd]|=this.Wk;this.sg.Oe(a,b,c)},ts:function(a,b){return(Rc(this.O,b,!1)||this).tc(a,b)},Fs:function(a,b){return(Rc(this.O,b,!1)||this).ji(a,b)},zs:function(a,b){return(Rc(this.O,b,!1)||this).Ec(a,b)},Ss:function(a,b,c){(Rc(this.O,c,!0)||this).Fc(a,b,c)},dt:function(a,b,c){(Rc(this.O,c,!0)||this).ui(a,b,c)},Ys:function(a,b,c){(Rc(this.O,c,!0)||this).Oe(a,b,c)},os:function(a){return this.Wb[a]},qs:function(a){return this.Wb[a]},As:function(a){return this.hf.getUint16(a,
            !0)},Cs:function(a){return a&1?this.Wb[a]|this.Wb[a+1]<<8:this.Gi[a>>1]},us:function(a){return this.hf.getInt32(a,!0)},ws:function(a){return a&3?this.Wb[a]|this.Wb[a+1]<<8|this.Wb[a+2]<<16|this.Wb[a+3]<<24:this.ea[a>>2]},Ns:function(a,b){this.Wb[a]=b;this.Ta=!0},Ps:function(a,b){this.Wb[a]=b;this.Ta=!0},Zs:function(a,b){this.hf.setUint16(a,b,!0);this.Ta=!0},at:function(a,b){a&1?(this.Wb[a]=b,this.Wb[a+1]=b>>8):this.Gi[a>>1]=b;this.Ta=!0},Ts:function(a,b){this.hf.setInt32(a,b,!0);this.Ta=!0},Vs:function(a,
            b){a&3?(this.Wb[a]=b,this.Wb[a+1]=b>>8,this.Wb[a+2]=b>>16,this.Wb[a+3]=b>>24):this.ea[a>>2]=b;this.Ta=!0}};function Sc(a,b){a.Y&&(b?0===--a.Cn&&(a.Fc=a.ee?a.Af:a.ti,a.ui=a.ee?a.Af:a.an,a.Oe=a.ee?a.Af:a.Zo):0===--a.zn&&(a.tc=a.Yg,a.ji=a.Nm,a.Ec=a.Fo))}function Bc(a,b,c,d,e,g){a.sg=b;a.kd=c;a.qd=d>>2;a.ld=e;a.rd=g>>2;a.Wk=b?Hc(Tc|Uc):0;a.qe=b?Hc(Tc):0}function gc(a,b,c,d){a.Y=b;a.zn=a.Cn=0;Vc(a.Y,c,d)}
            function Nc(a,b,c){a.Fc=!a.ee&&b[3]||a.Af;a.ui=!a.ee&&b[4]||a.$o;a.Oe=!a.ee&&b[5]||a.Yo;c&&(a.ti=b[3]||a.Af,a.an=b[4]||a.$o,a.Zo=b[5]||a.Yo)}function Mc(a,b,c){a.tc=b[0]||a.Go;a.ji=b[1]||a.Ho;a.Ec=b[2]||a.Eo;c&&(a.Yg=b[0]||a.Go,a.Nm=b[1]||a.Ho,a.Fo=b[2]||a.Eo)}
            var Lc=[],Ec=[t.prototype.rs,t.prototype.Ds,t.prototype.xs,t.prototype.Qs,t.prototype.bt,t.prototype.Ws],Oc=[t.prototype.ps,t.prototype.Bs,t.prototype.vs,t.prototype.Os,t.prototype.$s,t.prototype.Us],Jc=[t.prototype.ss,t.prototype.Es,t.prototype.ys,t.prototype.Rs,t.prototype.ct,t.prototype.Xs],Ic=[t.prototype.ts,t.prototype.Fs,t.prototype.zs,t.prototype.Ss,t.prototype.dt,t.prototype.Ys];
            if(rb)var Dc=[t.prototype.os,t.prototype.As,t.prototype.us,t.prototype.Ns,t.prototype.Zs,t.prototype.Ts],Cc=[t.prototype.qs,t.prototype.Cs,t.prototype.ws,t.prototype.Ps,t.prototype.at,t.prototype.Vs];
            function Wc(a,b){Ua.call(this,"CPU",a,Wc,1);var c=a.cycles||b,d=a.multiplier||1;this.T={};this.T.ge=c;this.T.Ce=d;this.T.jj=Math.round(this.T.ge/1E4)/100;this.T.Uh=this.T.jj*this.T.Ce;this.fa.qb=!1;this.fa.ql=!1;this.fa.hl=a.autoStart;this.fa.Pn=!1;c=Ya.autostart;void 0!==c&&(this.fa.hl="true"==c?!0:"false"==c?!1:null);this.fa.Ag=!1;this.T.Wh=this.T.Og=0;this.T.Xh=a.csStart;this.T.Ng=a.csInterval;this.T.Pg=a.csStop;this.Cd=[];var e=this;this.jr=function(){e.ag()};ob(this)}eb(Wc);f=Wc.prototype;
            f.Kc=function(a,b,c,d){this.ma=b;this.Y=d;this.Fa=a;for(b=null;b=xb(a,"Video",b);)this.Cd.push(b);this.ja=xb(a,"ChipSet");ob(this)};f.reset=function(){};f.save=function(){return null};f.restore=function(){return!1};f.lc=function(a,b){if(!b){if(a&&this.restore){Xc(this);if(!this.restore(a))return!1;Yc(this)}else this.reset();this.Y?this.Y.Jq():this.R("No debugger detected")}Zc(this);return!0};f.kc=function(a){return a&&this.save?this.save():!0};
            function $c(a){(!0===a.fa.hl||null===a.fa.hl&&!a.Y&&void 0===a.va.run)&&a.ag()}f.Zn=function(){return 0};function Yc(a){void 0===a.T.Xh&&(a.T.Xh=0);void 0===a.T.Ng&&(a.T.Ng=-1);void 0===a.T.Pg&&(a.T.Pg=-1);a.fa.Ag=0<=a.T.Xh&&0<a.T.Ng;a.fa.Ag&&(a.T.Wh=0,a.T.Og=a.T.Xh-a.Xf)}function ad(a,b){if(a.fa.Ag){var c=!1;a.T.Wh=a.T.Wh+a.Zn()|0;a.T.Og-=b;0>=a.T.Og&&(a.T.Og+=a.T.Ng,c=!0);0<=a.T.Pg&&a.T.Pg<=cd(a)&&(a.T.Ng=a.T.Pg=-1,Yc(a),a.zb(),c=!0);c&&a.R(cd(a)+" cycles: checksum="+h(a.T.Wh))}}
            f.zd=function(){this.Fa&&this.Fa.Ge&&this.Fa.Ge.zd()};
            function dd(a){for(var b=0;b<a.Cd.length;b++)ed(a.Cd[b]);if(a.Fa&&a.Fa.Ge&&(a=a.Fa.Ge,a.Cp)){Cb(a,18,a.Dh,a.op,a.canvas.style.color);if(a.nu){var b=a.ma,c=a.mb,d,e;null==d&&(d=0);null==e&&(e=b.Mk-d|0);null==c&&(c={$k:0,re:0,Gk:[]});var g=d>>>b.Ca;d=d+e-1>>>b.Ca;c.$k=0;for(c.re=0;g<=d;)e=b.na[g],c.$k+=e.size,e.size&&(c.Gk.push(va(Ab,g,0,0,e.type)),c.re++),g++;a.mb=c;a.Do=a.mb.re*a.ma.nb/691200;b=0;a.mb.An=0;a.mb.sh||(a.mb.sh=[]);c=-1;d=0;var l=-1;for(e=0;e<a.mb.re;e++){var p=a.mb.Gk[e],g=wa(Ab.type,
            p),p=wa(Ab.Ao,p);if(g!=c||p!=l+1)(l=e-d)&&(b+=Xb(a,d,l,c)),c=g,d=e;l=p}b+=Xb(a,d,e-d,c);c=a.mb.mp!=b;a.mb.mp=b;if(c){c=new vb(0,0,a.Dh.width,a.Dh.height);a.mb.og=[];d=a.mb.re;for(b=0;b<a.mb.An;b++)e=a.mb.sh[b].re,a.mb.og.push(wb(c,e,d,!b)),d-=e;for(b=0;b<a.mb.og.length;b++)c=a.mb.sh[b],d=e=a.mb.og[b],g=a.op,(l=Gc[c.type])||(l=new ub),g.strokeStyle="black",g.strokeRect(d.x,d.y,d.Xc,d.nd),g.fillStyle="string"==typeof l?l:l.toString(),g.fillRect(d.x,d.y,d.Xc,d.nd),d=a,g=e,d.hj=d.Yn,d.Ig=d.bo,e=g.x+(g.Xc>>
            1),l=g.y+(g.nd>>1),p=g.nd,g.Xc<g.nd&&(p=g.Xc,d.Wn=!0,d.$d.save(),d.$d.translate(e,l),d.$d.rotate(-Math.PI/2),e=l=0),p<d.Ig&&(d.Ig=p,d.hj=d.Ig+"px Monaco, Lucida Console, Courier New"),g=l,d.Ad=e,d.kg=g,d=a,c=Fc[c.type]+" ("+(c.re*a.ma.nb/1024|0)+"Kb)",d.$d.font=d.hj,d.Ad-=d.$d.measureText(c).width>>1,d.kg+=(d.Ig>>1)-2,Eb(d,c),d.Wn&&(d.$d.restore(),d.Wn=!1)}}else Eb(a,"This space intentionally left blank");a.Wi.drawImage(a.Dh,0,0,a.Dh.width,a.Dh.height,a.Hu,a.Ku,a.fu,a.iu);a.Cp=!1}}
            f.ed=function(){this.Cd.length&&this.Cd[0].ed()};
            f.Nb=function(a,b,c){var d=this;a=!1;switch(b){case "run":this.va[b]=c;c.onclick=function(){var a;if(a=d.Fa)if(a=d.Fa,a.fa.jc)a=!0;else{var b=null,c,p=fb(a.id);for(c=0;c<p.length&&(b=p[c],b===a||b.fa.Dg);c++);if(c==p.length)for(c=0;c<p.length&&(b=p[c],b===a||b.fa.jc);c++);c==p.length&&(b=a);Ba("The "+b.type+" component ("+b.id+") is not "+(b.fa.Dg?"powered yet":"ready yet"+(b.gj?" (waiting for notification)":""))+".");a=!1}a&&(d.fa.qb?d.zb(!0):d.ag(!0))};a=!0;break;case "reset":this.va[b]=c;c.onclick=
            function(){d.Fa&&fd(d.Fa)};a=!0;break;case "speed":this.va[b]=c;a=!0;break;case "setSpeed":this.va[b]=c,c.onclick=function(){gd(d,d.T.Ce<<1,!0)},c.textContent=Ib(this),a=!0}return a};function hd(a,b){if(a.fa.qb){var c=a.A-b;a.A-=c;a.ud-=c}}function id(a,b,c){a.Xf+=b;c&&(a.ud=a.A=0)}
            function jd(a,b){var c=30;60>c&&(c=60);2>c&&(c=2);var d=1;b&&1<a.T.Ce&&a.T.nf&&(d=a.T.nf/a.T.jj);a.T.mo=Math.round(1E3/30);a.T.Zq=Math.floor(a.T.ge/c*d);a.T.Dl=Math.floor(a.T.ge/30*d);a.T.ro=Math.floor(a.T.ge/60*d);a.T.qo=Math.floor(a.T.ge/2*d);b||(a.T.Qg=a.T.Dl,a.T.Zh=a.T.ro,a.T.Yh=a.T.qo);a.T.El=0}function cd(a,b){var c=a.Xf+a.rf+a.ud-a.A;b&&1<a.T.Ce&&a.T.nf>a.T.jj&&(c=Math.round(c/a.T.Ce));return c}function Xc(a){a.T.nf=0;a.Xf=a.rf=a.ud=a.A=0;Yc(a);gd(a,1)}
            function Kb(a){return a.fa.qb&&a.T.nf?a.T.nf.toFixed(2)+"Mhz":"Stopped"}function Ib(a){return a.T.Uh.toFixed(2)+"Mhz"}function gd(a,b,c){if(void 0!==b){.8>a.T.nf/a.T.Uh&&(b=1);a.T.Ce=b;b=a.T.jj*a.T.Ce;if(a.T.Uh!=b){a.T.Uh=b;b=Ib(a);var d=a.va.setSpeed;d&&(d.textContent=b);a.R("target speed: "+b)}c&&a.ed()}id(a,a.rf);a.rf=0;a.T.Mg=ra();a.T.Uf=0;jd(a)}
            f.ag=function(a){if(mb(this,!0)){if(!this.fa.qb){gd(this);this.Fa&&this.Fa.start(this.T.Mg,cd(this));this.fa.qb=!0;this.fa.ql=!0;this.ja&&kd(this.ja);var b=this.va.run;b&&(b.textContent="Halt");this.zd(!0);a&&this.ed()}this.T.El>=this.T.ge&&jd(this,!0);this.T.$h=0;this.T.kj=ra();this.T.Uf&&(a=this.T.kj-this.T.Uf,a>this.T.mo&&(this.T.Mg+=a,this.T.Mg>this.T.kj&&(this.T.Mg=this.T.kj)));try{do{var c=this.fa.Ag?1:this.T.Zq;if(this.ja){ld(this.ja);var d=this.ja;a=c;var e=d.Pb[0];if(e.Rf){var g=(cd(d.O,
            d.jf)-e.Od)/d.ik|0,l=md(d,0)-g;6==e.mode&&(l-=g);var p=l*d.ik|0;6==e.mode&&(p>>=1);a>p&&(a=p)}var c=a,v=this.ja;a=c;if(v.ga&&v.ga[11]&64){var w=v.Xg-cd(v.O,v.jf);0<w&&a>w&&(a=w)}c=a}this.kh(c);var F=this.ud-this.A;this.rf+=F;this.T.$h+=F;id(this,0,!0);ad(this,F);this.T.Zh-=F;0>=this.T.Zh&&(this.T.Zh+=this.T.ro,dd(this));this.T.Yh-=F;0>=this.T.Yh&&(this.T.Yh+=this.T.qo,this.zd());this.T.Qg-=F;if(0>=this.T.Qg){this.T.Qg+=this.T.Dl;break}}while(this.fa.qb)}catch(K){this.zb();Zc(this);this.Fa&&this.Fa.stop(ra(),
            cd(this));mb(this,!1);qb(this,K.stack||K.message);return}c=setTimeout;d=this.jr;this.T.Uf=ra();e=this.T.mo;this.T.$h&&(e=Math.round(e*this.T.$h/this.T.Dl));e-=this.T.Uf-this.T.kj;if(g=this.T.Uf-this.T.Mg)this.T.nf=Math.round(this.rf/(10*g))/100,864E5<=g&&(this.Xf=0,this.ja&&ld(this.ja,!0),gd(this));if(0>e||this.T.nf<this.T.Uh)e=0;this.T.El+=this.T.$h;this.T.Uf+=e;c(d,e)}else Zc(this),this.Fa&&this.Fa.stop(ra(),cd(this))};f.kh=function(){return 0};
            f.zb=function(a){nb(this,!0);this.ud-=this.A;this.A=0;id(this,this.rf);this.rf=0;if(this.fa.qb){this.fa.qb=!1;this.ja&&kd(this.ja);var b=this.va.run;b&&(b.textContent="Run")}this.fa.we=a};function Zc(a){dd(a);a.zd()}var Lb=80386,n=-1,Wb=1,Vb=4,Ub=16,Tb=64,Sb=128,Rb=256,Qb=512,Pb=1024,Ob=2048,Uc=64,Tc=32,nd=Rb|Qb|Pb,od=Wb|Vb|Ub|Tb|Sb|Ob,pd=Wb|Vb|Ub|Tb|Sb;
            function qd(a,b,c,d){this.O=a;this.Y=a.Y;this.id=b;this.qi=c||"";this.ia=0;this.gb=65535;this.tf=this.gb+1;this.Pa=this.Bc=this.Lh=this.Rb=this.type=this.ya=0;this.Ed=n;this.pa=this.Hd=2;this.C=this.V=65535;this.rn=this.id==rd?Array(32):[];this.jl=null;this.fj=!1;sd(this,!0,d)}var rd=1;f=qd.prototype;f.Rq=function(a){this.ia=a&65535;return this.ya=this.ia<<4};
            f.Qq=function(a,b){var c,d,e=this.O;a&=65535;a&4?(c=e.yd.ya,d=c+e.yd.gb|0):(c=e.Fd,d=e.Cf);if(!b||c){c=c+(a&65528)|0;if(d-c|0)return b||(e.A-=15),td(this,c,a,b);b||ud.call(e,13,a)}return n};f.Pq=function(a){var b=this.O;a=b.Gd+(a<<2);var c=b.ra(a);b.aa&=~(Rb|Qb);return this.load(b.ra(a+2))+c|0};f.Oq=function(a){var b=this.O;a<<=3;var c=b.Gd+a|0;if(7<=(b.Ye-c|0))return td(this,c,a)+b.Qm;ud.call(b,13,a|3,!0);return n};f.jp=function(a){return this.ya+a|0};f.lp=function(a){return this.ya+a|0};
            f.En=function(a,b,c){return(a>>>0)+b<=this.tf?this.ya+a|0:this.Ti(0,0,c)};f.ip=function(a,b,c){return(a>>>0)+b>this.tf?this.ya+a|0:this.Ti(0,0,c)};f.Ti=function(a,b,c){c||ud.call(this.O,13,0);return n};f.Fn=function(a,b,c){return(a>>>0)+b<=this.tf?this.ya+a|0:this.Ui(0,0,c)};f.kp=function(a,b,c){return(a>>>0)+b>this.tf?this.ya+a|0:this.Ui(0,0,c)};f.Ui=function(a,b,c){c||ud.call(this.O,13,0);return n};
            function vd(a,b,c){var d=a.O,e=d.ra(b+2),g=d.ra(b)|(e&255)<<16,d=d.ra(b+4);a.ia=c;a.ya=g;a.gb=d;a.tf=(d>>>0)+1;a.Rb=e;a.type=e&7936;a.Lh=0;a.Ed=b;sd(a,!0)}
            function td(a,b,c,d){var e=a.O,g=e.ra(b+0),l=e.ra(b+4),p=l&7936,v=e.ra(b+2)|(l&255)<<16,w=e.ra(b+6),F=c&65528;e.ka>=Lb&&(v|=(w&65280)<<16,g|=(w&15)<<16,w&128&&(g=g<<12|4095));for(;;){var K,J,I;if(a.id==rd){a.fj=!1;K=a.jl;var T,Z;I=c&3;var S=(l&24576)>>13;if(F&&!(l&32768)){d||ud.call(e,11,c);v=n;break}if(6144<=p){I=c&3;if(I>a.Pa){if(!1!==K&&!(S==a.Pa||p&1024&&S<=a.Pa)){v=n;break}F=e.Ka();wd(e,e.Ka(),!0);u(e,F);a.fj=!0}T=!1}else{if(256==p){if(!xd(a,c,K)){v=n;break}return a.ya}if(1024==p)T=!0,Z=-1,J=
            c,I<a.Pa&&(I=a.Pa);else if(1536==p)T=!0,Z=~(16384|Rb|Qb),J=c|1;else if(1792==p)T=!0,Z=~(16384|Rb),J=c|1;else if(1280==p){if(!xd(a,v&65535,K)){v=n;break}return a.ya}}if(T){b=v&65535;if(I<=S){d=a.Pa;if(a.load(b,!0)===n){v=n;break}e.Qm=g;if(a.Pa<d){if(!0!==K){v=n;break}F=r(e);g=0;for(l&=31;l--;)a.rn[g++]=yd(e,e.ua,F),F+=2;l=e.cb.ya;K=(a.Pa<<2)+2;d=K+2;I=e.ua.ia;J=r(e);wd(e,e.ra(l+d),!0);u(e,e.ra(l+K));zd(e,I);for(zd(e,J);g;)zd(e,a.rn[--g]);a.fj=!0}e.aa&=Z;return a.ya}d||ud.call(e,13,J,!0);v=n;break}else if(!1!==
            T){d||ud.call(e,13,c,!0);v=n;break}}else if(2==a.id){if(F){if(!(l&32768)){d||ud.call(e,11,c);v=n;break}if(4096>p||2048==(p&2560)){d||ud.call(e,13,c,!!l);v=n;break}}}else if(3==a.id){if(!(l&32768)){d||ud.call(e,12,c);v=n;break}if(!F||4096>p||512!=(p&2560)){d||ud.call(e,13,c,!0);v=n;break}}else if(4==a.id){if(!F||256!=p&&768!=p){d||ud.call(e,10,c,!0);v=n;break}}else if(6==a.id&&!(p&4096)&&768<p){v=n;break}a.ia=c;a.ya=v;a.gb=g;a.tf=(g>>>0)+1;a.Rb=l;a.type=p;a.Lh=w;a.Ed=b;sd(a,!0);break}return v}
            function xd(a,b,c){var d=a.O,e=d.cb.ya,g=a.Pa,l=d.cb.ia;if(!c){if(768!=d.cb.type)return ud.call(d,10,b,!0),!1;d.Kb(d.cb.Ed+4,d.cb.Rb&-769|256)}if(d.cb.load(b)===n)return!1;var p=d.cb.ya;if(!1===c){if(768!=d.cb.type)return ud.call(d,13,b,!0),!1}else{if(768==d.cb.type)return ud.call(d,13,b,!0),!1;d.Kb(d.cb.Ed+4,d.cb.Rb|=768);d.cb.type=768}d.Kb(e+14,q(d));d.Kb(e+16,Nb(d));d.Kb(e+18,d.F);d.Kb(e+20,d.G);d.Kb(e+22,d.H);d.Kb(e+24,d.D);d.Kb(e+26,r(d));d.Kb(e+28,d.L);d.Kb(e+30,d.K);d.Kb(e+32,d.J);d.Kb(e+34,
            d.Ma.ia);d.Kb(e+36,d.ta.ia);d.Kb(e+38,d.ua.ia);d.Kb(e+40,d.bb.ia);d.yd.load(d.ra(p+42));Bd(d,d.ra(p+16)|(c?16384:0));d.F=d.ra(p+18);d.G=d.ra(p+20);d.H=d.ra(p+22);d.D=d.ra(p+24);d.L=d.ra(p+28);d.K=d.ra(p+30);d.J=d.ra(p+32);d.Ma.load(d.ra(p+34));d.bb.load(d.ra(p+40));Cd(d,d.ra(p+14),d.ra(p+36));b=38;e=26;a.Pa<g&&(e=(a.Pa<<2)+2,b=e+2);wd(d,d.ra(p+b),!0);u(d,d.ra(p+e));c&&d.Kb(p+0,l);d.hb|=8;return!0}
            f.save=function(){return[this.ia,this.ya,this.gb,this.Rb,this.id,this.qi,this.Pa,this.Bc,this.Ed,this.Hd,this.V,this.pa,this.C,this.type,this.tf]};f.restore=function(a){"number"==typeof a?this.load(a):(this.ia=a[0],this.ya=a[1],this.gb=a[2],this.Rb=a[3],this.id=a[4],this.qi=a[5],this.Pa=a[6],this.Bc=a[7],this.Ed=a[8],this.Hd=a[9]||2,this.V=a[10]||65535,this.pa=a[11]||2,this.C=a[12]||65535,this.type=a[13]||this.Rb&7936,this.tf=a[14]||(this.gb>>>0)+1)};
            function sd(a,b,c){void 0===c&&(c=!!(a.O.hb&1));a.Bg=!1;if(c){a.load=a.Qq;a.io=a.Oq;a.Ac=a.En;a.oc=a.Fn;if(!(a.ia&-4))a.Ac=a.Ti,a.oc=a.Ui;else if(a.type&4096){6144==(a.type&6656)&&(a.Ac=a.Ti);if(a.type&2048||!(a.type&512))a.oc=a.Ui;1024==(a.type&3072)&&(a.Ac==a.En&&(a.Ac=a.ip),a.oc==a.Fn&&(a.oc=a.kp),a.Bg=!0)}b&&(a.ia&-4&&a.Ed!==n&&(b=a.Ed+5,a.O.dd(b,a.O.Qa(b)|1)),a.Pa=a.ia&3,a.Bc=(a.Rb&24576)>>13,a.O.ka<Lb||!(a.Lh&64)?(a.pa=2,a.C=65535):(a.pa=4,a.C=-1),a.Hd=a.pa,a.V=a.C)}else a.load=a.Rq,a.io=a.Pq,
            a.Ac=a.jp,a.oc=a.lp,a.Pa=a.Bc=0,a.Ed=n}
            function Dd(a){this.ka=a.model||8088;var b=0;switch(this.ka){default:b=4772727;break;case 80286:b=6E6;break;case Lb:b=16E6}Wc.call(this,a,b);this.fn=61442;this.wi=nd;this.vi=4;this.Hb=255;this.B=this.ka==Lb?Ed:80286==this.ka?Fd:Gd;this.Oa=Id;this.jn=Jd;this.kn=Kd;this.ln=Ld;if(80186<=this.ka&&(this.Oa=Id.slice(),this.jn=Jd.slice(),this.kn=Kd.slice(),this.Hb=31,this.Oa[15]=Md,this.Oa[96]=Nd,this.Oa[97]=Od,this.Oa[98]=Pd,this.Oa[99]=Md,this.Oa[100]=Md,this.Oa[101]=Md,this.Oa[102]=Md,this.Oa[103]=Md,
            this.Oa[104]=Qd,this.Oa[105]=Rd,this.Oa[106]=Sd,this.Oa[107]=Td,this.Oa[108]=Ud,this.Oa[109]=Vd,this.Oa[110]=Wd,this.Oa[111]=Xd,this.Oa[192]=Yd,this.Oa[193]=Zd,this.Oa[200]=$d,this.Oa[201]=ae,this.Oa[241]=be,this.jn[7]=ce,this.kn[7]=ce,80286<=this.ka)){this.fn=2;this.wi|=28672;this.vi=0;this.Oa[15]=de;this.rh=ee.slice();for(a=0;a<this.rh.length;a++)this.rh[a]||(this.rh[a]=fe);this.Oa[84]=ge;this.Oa[99]=he;if(this.ka>=Lb){var c;this.Oa[100]=ie;this.Oa[101]=je;this.Oa[102]=ke;this.Oa[103]=le;for(c in x)this.rh[+c]=
            x[c]}}this.zi=[];this.Ai=[];this.ud=this.Bh=0;this.fa.we=this.fa.Nn=!1;this.yn=0;this.Se=this.na=[];this.Ca=this.nb=this.Ga=this.Ae=this.td=this.Db=this.Ee=0;me(this)}eb(Dd,Wc);
            var Gd={gi:4,N:5,da:6,ba:7,ca:8,I:9,P:11,Q:12,pf:4,Gl:60,Hl:83,bc:3,Gb:9,rc:16,di:1,Ol:19,Ql:28,Sl:16,Rl:21,Pl:37,Ml:2,yj:9,Nl:5,Ll:33,Aj:10,zj:8,Tg:3,Sg:15,fm:51,gm:1,hm:2,im:4,em:32,Bj:15,km:15,Ha:16,Ia:4,mm:11,lm:18,jm:24,Ob:4,nm:2,Vf:16,om:17,Gj:18,pm:19,Fj:5,Hj:6,um:2,tm:8,rm:9,sm:10,qm:10,Ij:10,Jj:10,Ul:80,Wl:144,Tl:86,Vl:154,Yl:101,$l:165,Xl:107,Zl:171,wm:70,ym:113,vm:76,xm:124,bm:80,dm:128,am:86,cm:134,Vg:3,Ug:16,Qj:10,Pj:8,zm:51,cc:8,Am:17,Bm:36,Cc:11,Cm:16,qf:10,bd:2,vj:18,wj:7,xj:15,Cj:12,
            Dj:7,Ej:11,Kj:18,Lj:7,Mj:15,Rj:15,Sj:7,Tj:13,Zj:11,$j:7,ak:8,Dm:8,Gm:12,Em:18,Fm:17,Hm:15,Vj:8,Uj:20,Wj:2,dk:3,Wg:9,ck:5,bk:11,fk:4,ek:17,Im:11},Fd={gi:0,N:0,da:0,ba:0,ca:0,I:0,P:1,Q:1,pf:3,Gl:14,Hl:16,bc:2,Gb:7,rc:7,di:0,Ol:7,Ql:13,Sl:7,Rl:11,Pl:16,Ml:3,yj:6,Nl:2,Ll:13,Aj:5,zj:5,Tg:2,Sg:7,fm:23,gm:0,hm:1,im:3,em:17,Bj:7,km:11,Ha:7,Ia:3,mm:7,lm:11,jm:15,Ob:2,nm:3,Vf:7,om:8,Gj:8,pm:8,Fj:4,Hj:4,um:2,tm:3,rm:5,sm:2,qm:3,Ij:5,Jj:3,Ul:14,Wl:22,Tl:17,Vl:25,Yl:17,$l:25,Xl:20,Zl:28,wm:13,ym:21,vm:16,xm:24,
            bm:13,dm:21,am:16,cm:24,Vg:2,Ug:7,Qj:5,Pj:5,zm:19,cc:5,Am:5,Bm:17,Cc:3,Cm:5,qf:3,bd:0,vj:8,wj:5,xj:9,Cj:5,Dj:5,Ej:4,Kj:5,Lj:5,Mj:4,Rj:7,Sj:5,Tj:8,Zj:3,$j:4,ak:3,Dm:11,Gm:11,Em:15,Fm:15,Hm:7,Vj:5,Uj:8,Wj:0,dk:2,Wg:6,ck:3,bk:6,fk:3,ek:5,Im:5},Ed={gi:0,N:0,da:0,ba:0,ca:0,I:0,P:1,Q:1,pf:3,Gl:14,Hl:16,bc:2,Gb:7,rc:7,di:0,Ol:7,Ql:13,Sl:7,Rl:11,Pl:16,Ml:3,yj:6,Nl:2,Ll:13,Aj:5,zj:5,Tg:2,Sg:7,fm:23,gm:0,hm:1,im:3,em:17,Bj:7,km:11,Ha:7,Ia:3,mm:7,lm:11,jm:15,Ob:2,nm:3,Vf:7,om:8,Gj:8,pm:8,Fj:4,Hj:4,um:2,tm:3,
            rm:5,sm:2,qm:3,Ij:5,Jj:3,Ul:14,Wl:22,Tl:17,Vl:25,Yl:17,$l:25,Xl:20,Zl:28,wm:13,ym:21,vm:16,xm:24,bm:13,dm:21,am:16,cm:24,Vg:2,Ug:7,Qj:5,Pj:5,zm:19,cc:5,Am:5,Bm:17,Cc:3,Cm:5,qf:3,bd:0,vj:8,wj:5,xj:9,Cj:5,Dj:5,Ej:4,Kj:5,Lj:5,Mj:4,Rj:7,Sj:5,Tj:8,Zj:3,$j:4,ak:3,Dm:11,Gm:11,Em:15,Fm:15,Hm:7,Vj:5,Uj:8,Wj:0,dk:2,Wg:6,ck:3,bk:6,fk:3,ek:5,Im:5,vo:11,Kl:6,Il:8,Jl:5,dr:3,br:6,cr:6,xo:9,wo:12,Oj:3,Nj:6,fr:4,er:5,Yj:3,Xj:7};f=Dd.prototype;
            f.xl=function(a,b){this.na=this.Se=a;this.Ca=b;this.nb=1<<this.Ca;this.Ga=this.nb-1;this.Ae=a.length;this.td=this.Ae-1};function ne(a){if(a.na===a.Se){a.na=Array(a.Ae);a.Xk=new t(null,0,0,5,null,a);for(var b=0;b<a.Ae;b++)a.na[b]=a.Xk}else for(b=0;b<a.xi.length;b++)a.na[a.xi[b]]=a.Xk;a.xi=[]}
            function Rc(a,b,c,d){var e=(b&-4194304)>>>20,g=a.Se[(a.uf+e&a.Db)>>>a.Ca],l=g.Ec(e);if(!(l&1))return d||oe.call(a,b,!1,c),null;if(!(l&4)&&3==a.ta.Pa)return d||oe.call(a,b,!0,c),null;var p=(b&4190208)>>>10,l=a.Se[((l&-4096)+p&a.Db)>>>a.Ca],v=l.Ec(p);if(!(v&1||d))return d||oe.call(a,b,!1,c),null;if(!(v&4)&&3==a.ta.Pa)return d||oe.call(a,b,!0,c),null;c=a.Se[((v&-4096)+(b&4095)&a.Db)>>>a.Ca];if(d)return c;d=new t(b&-4096,0,0,6);Bc(d,c,g,e,l,p);b>>>=a.Ca;a.na[b]=d;a.xi.push(b);return d}
            f.reset=function(){this.fa.qb&&this.zb();me(this);Xc(this);this.fa.Ld=!1};
            function me(a){a.F=0;a.D=0;a.G=0;a.H=0;a.je=0;a.L=0;a.K=0;a.J=0;a.Zb=!1;a.ub=a.mc=0;a.Rd=0;a.Li=0;a.hb=65520;a.Gd=0;a.Ye=1023;a.aa=a.uj=0;a.hh=a.oi=a.gh=a.ih=0;a.rj=-1;a.ta=new qd(a,rd,"CS");a.bb=new qd(a,2,"DS");a.Ma=new qd(a,2,"ES");a.ua=new qd(a,3,"SS");u(a,0);wd(a,0);a.ka>=Lb&&(a.H=772,a.hb=16,a.ki=0,a.Yf=0,a.uf=0,a.nn=Array(8),a.on=Array(8),a.xc=new qd(a,2,"FS"),a.yc=new qd(a,2,"GS"));a.To=new qd(a,0,"NULL");a.ha=a.bb;a.la=a.ua;a.S=a.Aa=0;a.X=a.La=n;a.Bb=0;Cd(a,0,65535);if(80286<=a.ka){a.Fd=
            0;a.Cf=65535;a.yd=new qd(a,5,"LDT",!0);a.cb=new qd(a,4,"TSS",!0);a.Tb=new qd(a,6,"VER",!0);Cd(a,65520,61440);var b,c=q(a);b=a.ta;var d=-65536;b.O.ka<Lb&&(d&=16777215);b=b.ya=d;a.sa=b+c|0;a.ni=b+a.ta.gb|0}Bd(a,0);pe(a)}function qe(a){2==a.Hd?(a.$b=a.ra,a.Rc=y,a.fd=re,a.Ve=se,a.Na=z,a.Lb=te,a.Qc=ue):(a.$b=a.fe,a.Rc=A,a.fd=ve,a.Ve=we,a.Na=B,a.Lb=xe,a.Qc=ye)}function ze(a,b){a.pa!=b&&(a.Aa|=4096,a.pa=b,a.C=2==b?65535:-1,Ae(a))}
            function Ae(a){2==a.pa?(a.dataType=32768,a.qc=a.ra,a.dg=a.Kb):(a.dataType=-2147483648,a.qc=a.fe,a.dg=a.Ak)}function Be(a){a.Hd=a.ta.Hd;a.V=a.ta.V;qe(a);a.pa=a.ta.pa;a.C=a.ta.C;Ae(a);a.Aa&=-12289}f.Zn=function(){var a=this.F+this.D+this.G+this.H+r(this)+this.L+this.K+this.J|0;return a=a+q(this)+Mb(this)+this.bb.ia+this.ua.ia+this.Ma.ia+Nb(this)|0};function Ce(a,b,c,d){void 0!==d&&(void 0===a.zi[b]&&(a.zi[b]=[]),a.zi[b].push([c,d]))}
            function De(a,b){var c=a.zi[b];if(void 0!==c)for(var d=0;d<c.length;d++)if(!c[d][1].call(c[d][0],a.sa))return!1;a.fa.Nn&&a.qa(16)&&Ee(a.Y,b,a.sa)&&Fe(a,a.sa,function(a,c){return function(d){Ge(a.Y,b,d,cd(a)-c)}}(a,cd(a)));return!0}function Fe(a,b,c){void 0!==c&&(null==a.Ai[b]&&a.Bh++,a.Ai[b]=c)}function He(a,b){var c=a.Ai[b];null!=c&&(c(--a.Bh),delete a.Ai[b])}
            function pe(a,b){void 0===b&&(b=!!(a.hb&1));!b!=!(a.hb&1)&&a.qa()&&a.ab("CPU switching to "+(b?"protected":"real")+"-mode",a.Yb,!0);a.ln=b?Ie:Ld;sd(a.ta);sd(a.bb);sd(a.ua);sd(a.Ma);a.ka>=Lb&&(sd(a.xc),sd(a.yc),Be(a))}
            f.save=function(){var a=new Je(this);a.set(0,[this.F,this.D,this.G,this.H,r(this),this.L,this.K,this.J]);var b=q(this),c=this.ta.save(),d=this.bb.save(),e=this.ua.save(),g=this.Ma.save(),l;null!=this.Fd?(l=[this.hb,this.Fd,this.Cf,this.Gd,this.Ye,this.yd.save(),this.cb.save(),this.uj],l.push(this.ki),l.push(this.Yf),l.push(this.uf),l.push(this.nn),l.push(this.on)):l=null;b=[b,c,d,e,g,l,Nb(this)];this.ka>=Lb&&(b.push(this.xc.save()),b.push(this.yc.save()));a.set(1,b);a.set(2,[this.ha.qi,this.la.qi,
            this.S,this.Aa,this.Bb,this.X,this.La]);a.set(3,[0,this.Xf,this.T.Ce]);a.set(4,mc(this.ma));return a.data()};
            f.restore=function(a){var b=a[0];this.F=b[0];this.D=b[1];this.G=b[2];this.H=b[3];var c=b[4];this.L=b[5];this.K=b[6];this.J=b[7];b=a[1];this.ta.restore(b[1]);this.bb.restore(b[2]);this.ua.restore(b[3]);this.Ma.restore(b[4]);var d=b[5];d&&d.length&&(this.hb=d[0],this.Fd=d[1],this.Cf=d[2],this.Gd=d[3],this.Ye=d[4],this.yd.restore(d[5]),this.cb.restore(d[6]),this.uj=d[7],this.ka>=Lb&&(this.ki=d[8],this.Yf=d[9],this.uf=d[10],this.nn=d[11],this.on=d[12]),pe(this));Bd(this,b[6]);Cd(this,b[0],this.ta.ia);
            u(this,c);wd(this,this.ua.ia);this.ka>=Lb&&(this.xc.restore(b[7]),this.yc.restore(b[8]));b=a[2];this.ha=null!=b[0]&&Ke(this,b[0])||this.bb;this.la=null!=b[1]&&Ke(this,b[1])||this.ua;this.S=b[2];this.Aa=b[3];this.Bb=b[4];this.X=b[5];this.La=b[6];b=a[3];this.Xf=b[1];gd(this,b[2]);a:{b=this.ma;a=a[4];for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.oo){for(var g=0,l=Array(b.oo),p=0;p<e.length-1;)for(var v=e[p++],w=e[p++];v--;)l[g++]=w;e=l}g=b.na[d];if(!g||!g.restore(e)){Ba("Unable to restore memory block "+
            d);b=!1;break a}}void 0!==a[c]&&dc(b,a[c]);b=!0}return b};function Ke(a,b){switch(b){case "CS":return a.ta;case "DS":return a.bb;case "SS":return a.ua;case "ES":return a.Ma;case "NULL":return a.To;default:return[0,b,0,0,""]}}function Mb(a){return a.ta.ia}function Le(a,b){var c=q(a);a.sa=a.ta.load(b)+c|0;a.ni=a.ta.ya+a.ta.gb|0;Be(a);a.S|=a.vi}function Me(a,b){a.bb.load(b);a.S|=a.vi}
            function wd(a,b,c){var d=r(a);a.Lc=a.ua.load(b)+d|0;a.ua.Bg?(a.tk=a.ua.ya+a.ua.V|0,a.Rm=a.ua.ya+a.ua.gb|0):(a.tk=a.ua.ya+a.ua.gb|0,a.Rm=a.ua.ya);c||(a.S|=4)}function Ne(a,b){a.Ma.load(b);a.S|=a.vi}function q(a){return a.sa-a.ta.ya|0}function C(a,b){a.sa=a.ta.ya+(b&a.C)|0}function Cd(a,b,c,d){a.ta.jl=d;a.Qm=b;b=a.ta.load(c);return b!==n?(a.sa=b+(a.Qm&a.C)|0,a.ni=b+a.ta.gb|0,Be(a),a.ta.fj):null}
            function Pe(a,b){a.sa=a.sa+b|0;var c=a.ni-a.sa|0;0>c&&0<=(a.ni^a.sa)&&(8088>=a.ka||a.ta.gb==a.ta.V?C(a,a.sa-a.ta.ya):-1>c&&ud.call(a,13,0))}function r(a){return a.je&~a.ua.V|a.Lc-a.ua.ya}function u(a,b){a.je=b;a.Lc=a.ua.ya+(b&a.ua.V)|0}function Qe(a,b,c,d,e,g){if(63!=(e&63)&&e!=a.resultType){var l=(e^a.resultType)&a.resultType;l&&(l&1&&Re(a),l&2&&Se(a),l&4&&Te(a),l&8&&Ue(a),l&16&&Ve(a),l&32&&We(a))}g?(a.hh=d,a.gh=b):(a.hh=b,a.gh=d);a.oi=c;a.ih=d;a.resultType=e}
            function Xe(a,b,c,d,e){a.resultType=c|26;a.ih=b;d?Ye(a):Ze(a);e?$e(a):af(a);return b}function bf(a,b,c,d){c&d?Ye(a):Ze(a);(b^c)&d?$e(a):af(a)}function cf(a){return Re(a)?1:0}function Re(a){a.resultType&1&&(a.aa&=~Wb,(a.hh^(a.hh^a.oi)&(a.oi^a.gh))&a.resultType&-2147450752&&(a.aa|=Wb),a.resultType&=-2);return a.aa&Wb}function Se(a){a.resultType&2&&(a.aa&=~Vb,38505>>((a.ih^a.ih>>4)&15)&1&&(a.aa|=Vb),a.resultType&=-3);return a.aa&Vb}
            function Te(a){a.resultType&4&&(a.aa&=~Ub,(a.gh^a.hh^a.oi)&16&&(a.aa|=Ub),a.resultType&=-5);return a.aa&Ub}function Ue(a){a.resultType&8&&(a.aa&=~Tb,a.ih&((a.resultType&-2147450752)-1|a.resultType&-2147450752)||(a.aa|=Tb),a.resultType&=-9);return a.aa&Tb}function Ve(a){a.resultType&16&&(a.aa&=~Sb,a.ih&a.resultType&-2147450752&&(a.aa|=Sb),a.resultType&=-17);return a.aa&Sb}
            function We(a){a.resultType&32&&(a.aa&=~Ob,(a.hh^a.gh)&(a.oi^a.gh)&a.resultType&-2147450752&&(a.aa|=Ob),a.resultType&=-33);return a.aa&Ob}function Ze(a){a.resultType&=-2;a.aa&=~Wb}function df(a){a.resultType&=-5;a.aa&=~Ub}function ef(a){a.resultType&=-9;a.aa&=~Tb}function af(a){a.resultType&=-33;a.aa&=~Ob}function Ye(a){a.resultType&=-2;a.aa|=Wb}function ff(a){a.resultType&=-5;a.aa|=Ub}function gf(a){a.resultType&=-9;a.aa|=Tb}function $e(a){a.resultType&=-33;a.aa|=Ob}
            function Nb(a){return a.aa&~od|Re(a)|Se(a)|Te(a)|Ue(a)|Ve(a)|We(a)}function hf(a,b){b=b|a.hb&1|65520;a.hb=a.hb&-65536|b&65535;a.hb&1&&pe(a,!0)}function Bd(a,b,c){a.hb&1||(b&=-61441);void 0===c&&(c=a.ta.Pa);c?b=b&-12289|a.aa&12288:a.uj=(b&12288)>>12;c>a.uj&&(b=b&~Qb|a.aa&Qb);a.resultType=128;a.aa=a.aa&~(a.wi|od)|b&(a.wi|od)|a.fn;a.aa&Rb&&(a.Bb|=2,a.S|=4)}
            f.Nb=function(a,b,c){var d=!1;switch(b){case "EAX":case "EBX":case "ECX":case "EDX":case "ESP":case "EBP":case "ESI":case "EDI":case "EIP":case "AX":case "BX":case "CX":case "DX":case "SP":case "BP":case "SI":case "DI":case "IP":case "PC":case "CS":case "DS":case "SS":case "ES":case "PS":case "C":case "P":case "A":case "Z":case "S":case "T":case "I":case "D":case "V":this.va[b]=c;this.yn++;d=!0;break;default:d=this.parent.Nb.call(this,a,b,c)}return d};
            function jf(a,b){var c=a.na[(b&a.Ee)>>>a.Ca];return 5!=c.type||(c=Rc(a,b,!1,!0),c)?c.Yg(b&a.Ga,b):null}f.Qa=function(a){return this.na[(a&this.Ee)>>>this.Ca].tc(a&this.Ga,a)};f.ra=function(a){var b=a&this.Ga,c=(a&this.Ee)>>>this.Ca;this.A-=this.B.gi;return b<this.Ga?this.na[c].ji(b,a):this.na[c].tc(b,a)|this.na[c+1&this.td].tc(0,a+1)<<8};
            f.fe=function(a){var b=a&this.Ga,c=(a&this.Ee)>>>this.Ca;if(b<this.Ga-2)return this.na[c].Ec(b,a);var d=(b&3)<<3;return this.na[c].Ec(b&-4,a)>>>d|this.na[c+1&this.td].Ec(0,a+3)<<32-d};f.dd=function(a,b){this.na[(a&this.Ee)>>>this.Ca].Fc(a&this.Ga,b&255,a)};f.Kb=function(a,b){var c=a&this.Ga,d=(a&this.Ee)>>>this.Ca;this.A-=this.B.gi;c<this.Ga?this.na[d].ui(c,b&65535,a):(this.na[d++].Fc(c,b&255,a),this.na[d&this.td].Fc(0,b>>8&255,a+1))};
            f.Ak=function(a,b){var c=a&this.Ga,d=(a&this.Ee)>>>this.Ca;this.A-=this.B.gi;if(c<this.Ga-2)this.na[d].Oe(c,b,a);else{var e,g=(c&3)<<3,c=c&-4;e=this.na[d].Ec(c,a);this.na[d].Oe(c,e&~(-1<<g)|b<<g,a);d=d+1&this.td;a+=3;e=this.na[d].Ec(0,a);this.na[d].Oe(0,e&-1<<g|b>>>32-g,a)}};function kf(a,b,c){a.si=b;a.X=b.Ac(a.ii=c,1);return a.S&1?0:a.Qa(a.X)}function D(a,b){return kf(a,a.ha,b&a.V)}function E(a,b){return kf(a,a.la,b&a.V)}function lf(a,b,c){a.si=b;a.X=b.Ac(a.ii=c,a.pa);return a.S&1?0:a.qc(a.X)}
            function G(a,b){return lf(a,a.ha,b&a.V)}function H(a,b){return lf(a,a.la,b&a.V)}function mf(a,b,c){a.si=b;a.La=a.X=b.Ac(a.ii=c,1);return a.S&1?0:a.Qa(a.X)}function L(a,b){return mf(a,a.ha,b&a.V)}function M(a,b){return mf(a,a.la,b&a.V)}function nf(a,b,c){a.si=b;a.La=a.X=b.Ac(a.ii=c,a.pa);return a.S&1?0:a.qc(a.X)}function N(a,b){return nf(a,a.ha,b&a.V)}function O(a,b){return nf(a,a.la,b&a.V)}function P(a,b){a.S&2||a.dd(a.si.oc(a.ii,1),b)}function Q(a,b){a.S&2||a.dg(a.si.oc(a.ii,a.pa),b)}
            function yd(a,b,c){return a.qc(b.Ac(c,a.pa))}f.U=function(){var a=this.Qa(this.sa);Pe(this,1);return a};function of(a){var b=a.ra(a.sa);Pe(a,2);return b}function R(a){var b=a.$b(a.sa);Pe(a,a.Hd);return b}f.oa=function(){var a=this.qc(this.sa);Pe(this,this.pa);return a};f.M=function(){var a=this.Qa(this.sa)<<24>>24;Pe(this,1);return a};function U(a,b){var c=a.Qa(a.sa);Pe(a,1);return pf[c].call(a,b)}
            f.Ka=function(){var a=this.qc(this.Lc);this.Lc=this.Lc+this.pa|0;var b=this.tk-this.Lc|0;0>b&&0<=(this.tk^this.Lc)&&(8088>=this.ka||!this.ua.Bg&&this.ua.gb==this.ua.V||this.ua.Bg&&!this.ua.gb?u(this,this.Lc-this.ua.ya&this.ua.V):-1>b&&ud.call(this,12,0));return a};function zd(a,b){a.Lc=a.Lc-a.pa|0;0>(a.Lc-a.Rm|0)&&0<=(a.Rm^a.Lc)&&(8088>=a.ka||!a.ua.Bg&&a.ua.gb==a.ua.V||a.ua.Bg&&!a.ua.gb?u(a,a.Lc-a.ua.ya&a.ua.V):ud.call(a,12,0));a.dg(a.Lc,b)}
            function qf(a,b,c){var d=4;1==b.length&&(d=1,c=c?1:0);if(80386>a.ka)2<b.length&&(b=b.substr(1,2));else if("PS"==b||2<b.length)d=8;a.va[b]&&(void 0===c&&(qb(a,"Value for "+b+" is invalid"),a.zb()),d=!a.fa.qb||a.fa.Pn?h(c,d):"--------".substr(0,d),a.va[b].textContent!=d&&(a.va[b].textContent=d))}
            f.zd=function(a){if(this.yn&&(a||!this.fa.qb||this.fa.Pn)){qf(this,"EAX",this.F);qf(this,"EBX",this.D);qf(this,"ECX",this.G);qf(this,"EDX",this.H);qf(this,"ESP",r(this));qf(this,"EBP",this.L);qf(this,"ESI",this.K);qf(this,"EDI",this.J);qf(this,"CS",Mb(this));qf(this,"DS",this.bb.ia);qf(this,"SS",this.ua.ia);qf(this,"ES",this.Ma.ia);qf(this,"EIP",q(this));var b=Nb(this);qf(this,"PS",b);qf(this,"V",b&Ob);qf(this,"D",b&Pb);qf(this,"I",b&Qb);qf(this,"T",b&Rb);qf(this,"S",b&Sb);qf(this,"Z",b&Tb);qf(this,
            "A",b&Ub);qf(this,"P",b&Vb);qf(this,"C",b&Wb)}if(b=this.va.speed)b.textContent=Kb(this);this.parent.zd.call(this,a)};
            f.kh=function(a){this.fa.we=!0;var b=this.fa.Nn=this.Y&&rf(this.Y),c=a?this.fa.ql?0:1:-1;this.fa.ql=!1;this.ud=this.A=a;this.ja&&!a&&ld(this.ja);a||this.qa(1024)||(this.S|=4);do{var d=this.S&12528;if(d)this.Aa|=d;else if(this.Sb=this.sa,this.ha=this.bb,this.la=this.ua,this.X=this.La=n,this.Aa&12288&&Be(this),this.Aa=this.S&256,this.Bb){a:{if(!(this.S&4))for(var d=80286>this.ka?0:1,e=0;2>e;e++){switch(d){case 0:if(this.Bb&1&&this.aa&Qb){var g=sf(this.ja);if(-1<=g&&(this.Bb&=-2,0<=g)){this.Bb&=-5;tf.call(this,
            g,null,11);d=!0;break a}}break;case 1:if(this.Bb&2){this.Bb&=-3;tf.call(this,1,null,11);d=!0;break a}}d=1-d}if(d=this.Bb&8){d=this.ja;e=!1;for(g=0;g<d.vb;g++)for(var l=d.vb[g],p=0;p<l.Ub.length;p++){var v=l.Ub[p];v.ze||(uf(d,v),v.ze||(e=!0))}d=!e}d&&(this.Bb&=-9);d=!1}if(d&&!a){this.R("interrupt dispatched");this.S=0;break}if(this.Bb&4){this.S=this.A=0;break}}if(b){if(vf(this.Y,this.sa,c)){this.zb();break}c=1}this.S=0;this.Oa[this.U()].call(this)}while(0<this.A);return this.fa.we?this.ud-this.A:void 0===
            this.fa.we?0:-1};Pa(function(){for(var a=kb(window.document,"pcjs","cpu"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new Dd(d);jb(d,c)}});function wf(a,b){var c=a+b+cf(this)|0;Qe(this,a,b,c,191);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&255}function xf(a,b){var c=a+b+cf(this)|0;Qe(this,a,b,c,this.dataType|63);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&this.C}
            function yf(a,b){var c=a+b|0;Qe(this,a,b,c,191);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&255}function zf(a,b){var c=a+b|0;Qe(this,a,b,c,this.dataType|63);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&this.C}function Af(a,b){var c=a&b;Xe(this,c,128);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c}function Bf(a,b){this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return Xe(this,a&b,this.dataType)}
            function Cf(a,b){this.A-=10+(this.X===n?0:1);if((a&3)<(b&3))return a=a&-4|b&3,gf(this),a;ef(this);return a}function Df(a){if(this.X===n)return Md.call(this),a;var b=a,c=this.qc(this.X),d=this.qc(this.X+this.pa);2==this.pa&&(b=a<<16>>16,c=c<<16>>16,d=d<<16>>16);this.A-=this.B.Ll;if(b<c||b>d)C(this,this.Sb-this.ta.ya),tf.call(this,5,null,0);this.S|=2;return a}function Ef(a,b){var c=0;if(b){ef(this);for(var d=1;d&this.C;){if(b&d){a=c;break}d<<=1;c++}}else gf(this);this.A-=this.B.vo+3*c;return a}
            function Ff(a,b){var c=0;if(b){ef(this);for(var d=2==this.pa?15:31,e=1<<d;e;){if(b&e){a=d;break}e>>>=1;c++;d--}}else gf(this);this.A-=this.B.vo+3*c;return a}function Gf(a,b){a&1<<(b&31)?Ye(this):Ze(this);this.A-=this.X===n?this.B.dr:this.B.br;this.S|=2;return a}function Hf(a,b){var c=1<<(b&31);a&c?Ye(this):Ze(this);this.A-=this.X===n?this.B.Kl:this.B.Il;return a^c}function If(a,b){var c=1<<(b&31);a&c?Ye(this):Ze(this);this.A-=this.X===n?this.B.Kl:this.B.Il;return a&~c}
            function Jf(a,b){var c=1<<(b&31);a&c?Ye(this):Ze(this);this.A-=this.X===n?this.B.Kl:this.B.Il;return a|c}function Kf(a,b){var c=Mb(this),d=q(this);null!=Cd(this,a,b,!0)&&(zd(this,c),zd(this,d))}function Lf(a,b){Qe(this,a,b,a-b|0,191,!0);this.A-=this.La===n?this.X===n?this.B.bc:this.B.yj:this.B.Gb;this.S|=2;return a}function Mf(a,b){Qe(this,a,b,a-b|0,this.dataType|63,!0);this.A-=this.La===n?this.X===n?this.B.bc:this.B.yj:this.B.Gb;this.S|=2;return a}
            function Nf(a){var b=(a&this.C)-1|0;Qe(this,a,1,b,32830,!0);this.A-=2;return a&~this.C|b&this.C}function Of(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}
            function Pf(a,b,c){this.Zb=!1;if((c>>>=0)&&!(c<=b>>>0)){var d=0,e=1;c=[c>>>0,0];for(a=[a>>>0,b>>>0];0<Of(a,c);){var g=b=c;b[0]+=g[0];b[1]+=g[1];4294967295<b[0]&&(b[0]>>>=0,b[1]++);e+=e}do 0<=Of(a,c)&&(b=a,g=c,b[0]-=g[0],b[1]-=g[1],0>b[0]&&(b[0]>>>=0,b[1]--),d+=e),b=c,b[0]>>>=1,b[1]&1&&(b[0]=(b[0]|2147483648)>>>0),b[1]>>>=1,e>>>=1;while(e);this.ub=d;this.mc=a[0];this.Zb=!0}}function Qf(a){return a}
            function Rf(a,b){a=this.U();var c=(b<<16>>16)*(a<<24>>24)|0;32767<c||-32768>c?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?21:24;return c&65535}function Sf(a,b){var c,d;a=this.oa();2==this.pa?(d=(b<<16>>16)*(a<<16>>16)|0,c=32767<d||-32768>d):(d=b*a,c=2147483647<d||-2147483648>d);c?(Ye(this),$e(this)):(Ze(this),af(this));d&=this.C;this.A-=this.X===n?21:24;return d}
            function Tf(a,b){var c=(a<<16>>16)*(b<<16>>16)|0;32767<c||-32768>c?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?this.B.xo:this.B.wo;return c&65535}function Uf(a,b){var c=a*b;2147483647<c||-2147483648>c?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?this.B.xo:this.B.wo;return c|0}function Vf(a){var b=(a&this.C)+1|0;Qe(this,a,1,b,32830);this.A-=2;return a&~this.C|b&this.C}
            function tf(a,b,c){this.A-=this.B.fm+c;this.ta.jl=!0;c=Nb(this);var d=Mb(this),e=q(this);a=this.ta.io(a);a!==n&&(zd(this,c),zd(this,d),zd(this,e),null!=b&&zd(this,b),this.rj=-1,this.sa=a,this.ni=this.ta.ya+this.ta.gb|0,Be(this))}function Wf(a,b){this.A-=14+(this.X===n?0:2);ef(this);this.Tb.load(b,!0)!==n&&this.Tb.Bc>=this.ta.Pa&&this.Tb.Bc>=(b&3)&&(gf(this),a=this.Tb.Rb&-256,2<this.pa&&(a|=(this.Tb.Lh&-65281)<<16));return a}
            function Xf(a,b){if(this.X===n)return fe.call(this),a;Me(this,this.ra(this.X+this.pa));this.A-=this.B.Vf;return b}function Yf(a){if(this.X===n)return fe.call(this),a;this.A-=this.B.nm;return this.X}function Zf(a,b){if(this.X===n)return fe.call(this),a;Ne(this,this.ra(this.X+this.pa));this.A-=this.B.Vf;return b}function $f(a,b){if(this.X===n)return fe.call(this),a;var c=this.ra(this.X+this.pa);this.xc.load(c);this.A-=this.B.Vf;return b}
            function ag(a,b){if(this.X===n)return fe.call(this),a;var c=this.ra(this.X+this.pa);this.yc.load(c);this.A-=this.B.Vf;return b}function bg(a,b){this.A-=14+(this.X===n?0:2);if(b&65528&&this.Tb.load(b,!0)!==n&&(7168==(this.Tb.Rb&7168)||this.Tb.Bc>=this.ta.Pa)&&this.Tb.Bc>=(b&3))return gf(this),this.Tb.gb;ef(this);return a}function cg(a,b){if(this.X===n)return fe.call(this),a;wd(this,this.ra(this.X+this.pa));this.A-=this.B.Vf;return b}
            function dg(a,b){this.A-=this.La===n?this.X===n?this.B.um:this.B.tm:this.B.rm;return b}function eg(a,b){return b}function fg(){this.La!==n&&ze(this,2);return dg.call(this,0,this.Rd)}function gg(a,b){var c=b&65535,d=b>>>16,e=a&65535,g=a>>>16,l=c*e,e=(l>>>16)+d*e,p=e>>>16,e=(e&65535)+c*g;this.Zb=!0;this.ub=e<<16|l&65535;this.mc=p+((e>>>16)+d*g)|0}function hg(a,b){this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return Xe(this,a|b,128)}
            function ig(a,b){this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return Xe(this,a|b,this.dataType)}function pg(a){var b=this.Ka(),c=this.Ka();(a<<=this.pa>>2)&&u(this,r(this)+a);Cd(this,b,c,!1)&&(a&&u(this,r(this)+a),this.bb.ia&65528&&this.bb.Bc<this.ta.Pa&&7168!=(this.bb.Rb&7168)&&this.bb.load(0),this.Ma.ia&65528&&this.Ma.Bc<this.ta.Pa&&7168!=(this.Ma.Rb&7168)&&this.Ma.load(0));2==a&&this.Bh&&He(this,this.sa)}
            function qg(a,b){var c=a-b-cf(this)|0;Qe(this,a,b,c,191,!0);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&255}function rg(a,b){var c=a-b-cf(this)|0;Qe(this,a,b,c,this.dataType|63,!0);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&this.C}function sg(a){this.S|=1;this.fd[this.U()].call(this,a);this.A-=this.X===n?this.B.fr:this.B.er}function tg(){return We(this)?1:0}function ug(){return Re(this)?1:0}function vg(){return Re(this)?0:1}
            function wg(){return Ue(this)?1:0}function xg(){return Ue(this)?0:1}function yg(){return Re(this)||Ue(this)?1:0}function zg(){return Re(this)||Ue(this)?0:1}function Ag(){return Ve(this)?1:0}function Bg(){return Ve(this)?0:1}function Cg(){return Se(this)?1:0}function Dg(){return Se(this)?0:1}function Eg(){return!Ve(this)!=!We(this)?1:0}function Fg(){return!Ve(this)!=!We(this)?0:1}function Gg(){return Ue(this)||!Ve(this)!=!We(this)?1:0}function Hg(){return Ue(this)||!Ve(this)!=!We(this)?0:1}
            function Ig(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a<<c-1;a=(d<<1|b>>16-c)&65535;Xe(this,a,32768,d&32768)}return a}function Jg(a,b,c){if(c){var d=a<<c-1;a=d<<1|b>>32-c;Xe(this,a,-2147483648,d&-2147483648)}return a}function Kg(a,b){return Ig.call(this,a,b,this.U())}function Lg(a,b){return Jg.call(this,a,b,this.U())}function Mg(a,b){return Ig.call(this,a,b,this.G&31)}function Ng(a,b){return Jg.call(this,a,b,this.G&31)}
            function Og(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a>>c-1;a=(d>>1|b<<16-c)&65535;Xe(this,a,32768,d&1)}return a}function Pg(a,b,c){if(c){var d=a>>c-1;a=d>>1|b<<32-c;Xe(this,a,-2147483648,d&1)}return a}function Qg(a,b){return Og.call(this,a,b,this.U())}function Rg(a,b){return Pg.call(this,a,b,this.U())}function Sg(a,b){return Og.call(this,a,b,this.G&31)}function Tg(a,b){return Pg.call(this,a,b,this.G&31)}
            function Ug(a,b){var c=a-b|0;Qe(this,a,b,c,191,!0);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&255}function Vg(a,b){var c=a-b|0;Qe(this,a,b,c,this.dataType|63,!0);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c&this.C}function Wg(a,b){Xe(this,a&b,128);this.A-=this.La===n?this.X===n?this.B.dk:this.B.Wg:this.B.Wg;this.S|=2;return a}function Xg(a,b){Xe(this,a&b,32768);this.A-=this.La===n?this.X===n?this.B.dk:this.B.Wg:this.B.Wg;this.S|=2;return a}
            function Yg(a,b){if(this.X===n){switch(this.Li&7){case 0:this.F=this.F&-256|a;break;case 1:this.G=this.G&-256|a;break;case 2:this.H=this.H&-256|a;break;case 3:this.D=this.D&-256|a;break;case 4:this.F=this.F&255|a<<8;break;case 5:this.G=this.G&255|a<<8;break;case 6:this.H=this.H&255|a<<8;break;case 7:this.D=this.D&255|a<<8}this.A-=this.B.fk}else this.La=this.X,P(this,a),this.A-=this.B.ek;return b}
            function Zg(a,b){if(this.X===n){switch(this.Li&7){case 0:this.F=a;break;case 1:this.G=a;break;case 2:this.H=a;break;case 3:this.D=a;break;case 4:u(this,a);break;case 5:this.L=a;break;case 6:this.K=a;break;case 7:this.J=a}this.A-=this.B.fk}else this.La=this.X,Q(this,a),this.A-=this.B.ek;return b}function $g(a,b){var c=a^b;Xe(this,c,128);this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return c}
            function ah(a,b){this.A-=this.La===n?this.X===n?this.B.bc:this.B.Gb:this.B.rc;return Xe(this,a^b,this.dataType)}function bh(a){ud.call(this,13,0);return a}function ce(a){Md.call(this);return a}function ch(a){fe.call(this);return a}function dh(){C(this,this.Sb-this.ta.ya);tf.call(this,0,null,2)}function eh(){this.A-=this.X===n?2:this.B.Hm;return 1}function fh(){var a=this.G&255;this.A-=(this.X===n?this.B.Vj:this.B.Uj)+(a<<this.B.Wj);return a}
            function gh(){var a=this.U();this.A-=(this.X===n?this.B.Vj:this.B.Uj)+(a<<this.B.Wj);return a}function hh(){return null}function ud(a,b,c,d){if(this.fa.we){var e=!1;if(80186<=this.ka)if(0>this.rj)C(this,this.Sb-this.ta.ya),e=!0;else if(8!=this.rj)b=0,a=8,e=!0;else{ih.call(this,-1,0,c);me(this);return}ih.call(this,a,b,c)&&(e=!1);e&&tf.call(this,this.rj=a,b,d||0);this.S|=3}else this.ab("Fault "+k(a)+" blocked by Debugger",1073741824),C(this,this.Sb-this.ta.ya)}
            function oe(a,b,c){this.Yf=a;a=0;b&&(a|=1);c&&(a|=2);3==this.ta.Pa&&(a|=4);ud.call(this,14,a)}function ih(a,b,c){var d=32,e=jf(this,this.sa);204!=e||this.Ye||(c=!1,d|=1);983040<=this.sa&&1048575>=this.sa&&(c=!1);this.qa(d|-2147483648)&&(c=!0);if(this.qa(d)||c)a=(c?"\n":"")+"Fault "+k(a)+(null!=b?" ("+ga(b)+")":"")+" on opcode "+k(e)+" at "+jh(q(this),Mb(this))+" (%"+h(this.sa,6)+")",b=this.fa.qb,this.ab(a,d)?c&&(c=b,this.Y.zb()):(this.Da(a),this.zb());return c}
            function de(){this.rh[this.U()].call(this)}function ge(){zd(this,r(this)&this.C);this.A-=this.B.Cc}function Nd(){var a=r(this)&this.C;zd(this,this.F&this.C);zd(this,this.G&this.C);zd(this,this.H&this.C);zd(this,this.D&this.C);zd(this,a);zd(this,this.L&this.C);zd(this,this.K&this.C);zd(this,this.J&this.C);this.A-=this.B.Bm}
            function Od(){this.J=this.J&~this.C|this.Ka();this.K=this.K&~this.C|this.Ka();this.L=this.L&~this.C|this.Ka();u(this,r(this)+this.pa);this.D=this.D&~this.C|this.Ka();this.H=this.H&~this.C|this.Ka();this.G=this.G&~this.C|this.Ka();this.F=this.F&~this.C|this.Ka();this.A-=this.B.zm}function Pd(){this.Na[this.U()].call(this,Df)}function he(){this.Lb[this.U()].call(this,Cf)}function ie(){this.S|=20;this.ha=this.la=this.xc;this.A-=this.B.bd;this.zb()}
            function je(){this.S|=20;this.ha=this.la=this.yc;this.A-=this.B.bd;this.zb()}function ke(){this.S|=4096;this.pa^=6;this.C^=-65536;Ae(this);this.A-=this.B.bd}function le(){this.S|=8192;this.Hd^=6;this.V^=-65536;qe(this);this.A-=this.B.bd}function Qd(){zd(this,this.oa());this.A-=this.B.Cc}function Rd(){this.Na[this.U()].call(this,Sf)}function Sd(){zd(this,this.U());this.A-=this.B.Cc}function Td(){this.Na[this.U()].call(this,Rf)}
            function Ud(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=pc(this.ma,this.H,this.sa-b-1);this.dd(this.Ma.oc(this.J&this.V,1),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=256)}}
            function Vd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){for(var d=this.sa-b-1,e=0,g=0,l=0;l<this.pa;l++)e|=pc(this.ma,this.H,d)<<g,g+=8;d=e;this.dg(this.Ma.oc(this.J&this.V,this.pa),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=256)}}
            function Wd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=this.Qa(this.bb.Ac(this.K&this.V,1));this.K=this.K&~this.V|this.K+(this.aa&Pb?-1:1)&this.V;this.A-=c;tc(this.ma,this.H,d,this.sa-b-1);this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=256)}}
            function Xd(){var a=1,b=0,c=5;this.Aa&192&&(a=this.G&this.V,b=1,this.Aa&256&&(c=4));if(a--){var d=yd(this,this.bb,this.K&this.V);this.K=this.K&~this.V|this.K+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;for(var c=this.sa-b-1,e=0,g=0;g<this.pa;g++)tc(this.ma,this.H,d>>e&255,c),e+=8;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=256)}}function kh(){var a=this.M();We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}
            function lh(){var a=this.M();We(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}function mh(){var a=this.M();Re(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}function nh(){var a=this.M();Re(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}function oh(){var a=this.M();Ue(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}function ph(){var a=this.M();Ue(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}
            function qh(){var a=this.M();Re(this)||Ue(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}function rh(){var a=this.M();Re(this)||Ue(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}function sh(){var a=this.M();Ve(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}function th(){var a=this.M();Ve(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}function uh(){var a=this.M();Se(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}
            function vh(){var a=this.M();Se(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}function wh(){var a=this.M();!Ve(this)!=!We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}function xh(){var a=this.M();!Ve(this)==!We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}function yh(){var a=this.M();Ue(this)||!Ve(this)!=!We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia}
            function zh(){var a=this.M();Ue(this)||!Ve(this)!=!We(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)}function Ah(){this.Ve[this.U()].call(this,Bh,this.U);this.A-=this.La===n?1:this.B.di}function Yd(){this.Ve[this.U()].call(this,Ch,gh)}function Zd(){this.Qc[this.U()].call(this,2==this.pa?Dh:Eh,gh)}function Fh(){var a=of(this)<<(this.pa>>2),b=this.Ka();C(this,b);a&&u(this,r(this)+a);this.A-=this.B.Gm}function Gh(){var a=this.Ka();C(this,a);this.A-=this.B.Dm}
            function $d(){var a=of(this),b=this.U()&31;this.A-=11;zd(this,this.L);var c=r(this)&this.C;if(0<b){for(this.A-=(b<<2)+(1<b?1:0);--b;)this.L=this.L&~this.C|this.L-this.pa&this.C,zd(this,yd(this,this.ua,this.L&this.C));zd(this,c)}this.L=this.L&~this.C|c;u(this,r(this)&~this.ua.V|r(this)-a&this.ua.V)}function ae(){u(this,r(this)&~this.ua.V|this.L&this.ua.V);this.L=this.L&~this.C|this.Ka()&this.C;this.A-=5}function Hh(){pg.call(this,of(this));this.A-=this.B.Fm}
            function Ih(){pg.call(this,0);this.A-=this.B.Em}function Jh(){this.Na[this.U()].call(this,Qf);this.A-=8}function Kh(){this.S|=36;this.A-=this.B.bd}function be(){fe.call(this)}function Md(){ud.call(this,6);this.zb()}function fe(){C(this,this.Sb-this.ta.ya);qb(this,"Undefined opcode "+k(Yb(this.ma,this.sa))+" at "+("0x"+h(this.sa)));this.zb()}
            var Id=[function(){var a=this.U();this.fd[a].call(this,yf)},function(){this.Lb[this.U()].call(this,zf)},function(){this.Rc[this.U()].call(this,yf)},function(){this.Na[this.U()].call(this,zf)},function(){this.F=this.F&-256|yf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|zf.call(this,this.F&this.C,this.oa());this.A--},function(){zd(this,this.Ma.ia);this.A-=this.B.qf},function(){Ne(this,this.Ka());this.A-=this.B.cc},function(){this.fd[this.U()].call(this,hg)},function(){this.Lb[this.U()].call(this,
            ig)},function(){this.Rc[this.U()].call(this,hg)},function(){this.Na[this.U()].call(this,ig)},function(){this.F=this.F&-256|hg.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|ig.call(this,this.F&this.C,this.oa());this.A--},function(){zd(this,this.ta.ia);this.A-=this.B.qf},function(){Le(this,this.Ka());this.A-=this.B.cc},function(){this.fd[this.U()].call(this,wf)},function(){this.Lb[this.U()].call(this,xf)},function(){this.Rc[this.U()].call(this,wf)},function(){this.Na[this.U()].call(this,
            xf)},function(){this.F=this.F&-256|wf.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|xf.call(this,this.F&this.C,this.oa());this.A--},function(){zd(this,this.ua.ia);this.A-=this.B.qf},function(){wd(this,this.Ka());this.A-=this.B.cc},function(){this.fd[this.U()].call(this,qg)},function(){this.Lb[this.U()].call(this,rg)},function(){this.Rc[this.U()].call(this,qg)},function(){this.Na[this.U()].call(this,rg)},function(){this.F=this.F&-256|qg.call(this,this.F&255,this.U());this.A--},
            function(){this.F=this.F&~this.C|rg.call(this,this.F&this.C,this.oa());this.A--},function(){zd(this,this.bb.ia);this.A-=this.B.qf},function(){Me(this,this.Ka());this.A-=this.B.cc},function(){this.fd[this.U()].call(this,Af)},function(){this.Lb[this.U()].call(this,Bf)},function(){this.Rc[this.U()].call(this,Af)},function(){this.Na[this.U()].call(this,Bf)},function(){this.F=this.F&-256|Af.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|Bf.call(this,this.F&this.C,this.oa());
            this.A--},function(){this.S|=20;this.ha=this.la=this.Ma;this.A-=this.B.bd},function(){var a=this.F&255,b=Te(this),c=Re(this);if(9<(a&15)||b)a+=6,b=Ub;if(159<a||c)a+=96,c=Wb;a&=255;this.F=this.F&-256|a;Xe(this,a,128);c?Ye(this):Ze(this);b?ff(this):df(this);this.A-=this.B.pf},function(){this.fd[this.U()].call(this,Ug)},function(){this.Lb[this.U()].call(this,Vg)},function(){this.Rc[this.U()].call(this,Ug)},function(){this.Na[this.U()].call(this,Vg)},function(){this.F=this.F&-256|Ug.call(this,this.F&
            255,this.U());this.A--},function(){this.F=this.F&~this.C|Vg.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.la=this.ta;this.A-=this.B.bd},function(){var a=this.F&255,b=Te(this),c=Re(this);if(9<(a&15)||b)a-=6,b=Ub;if(159<a||c)a-=96,c=Wb;a&=255;this.F=this.F&-256|a;Xe(this,a,128);c?Ye(this):Ze(this);b?ff(this):df(this);this.A-=this.B.pf},function(){this.fd[this.U()].call(this,$g)},function(){this.Lb[this.U()].call(this,ah)},function(){this.Rc[this.U()].call(this,$g)},
            function(){this.Na[this.U()].call(this,ah)},function(){this.F=this.F&-256|$g.call(this,this.F&255,this.U());this.A--},function(){this.F=this.F&~this.C|ah.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.la=this.ua;this.A-=this.B.bd},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||Te(this)?(c=c+6&15,d=d+1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?Ye(this):Ze(this);b?ff(this):df(this);this.A-=this.B.pf},function(){this.fd[this.U()].call(this,Lf)},function(){this.Lb[this.U()].call(this,
            Mf)},function(){this.Rc[this.U()].call(this,Lf)},function(){this.Na[this.U()].call(this,Mf)},function(){Lf.call(this,this.F&255,this.U());this.A--},function(){Mf.call(this,this.F&this.C,this.oa());this.A--},function(){this.S|=20;this.ha=this.la=this.bb;this.A-=this.B.bd},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||Te(this)?(c=c-6&15,d=d-1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?Ye(this):Ze(this);b?ff(this):df(this);this.A-=this.B.pf},function(){this.F=Vf.call(this,this.F)},function(){this.G=
            Vf.call(this,this.G)},function(){this.H=Vf.call(this,this.H)},function(){this.D=Vf.call(this,this.D)},function(){u(this,Vf.call(this,r(this)))},function(){this.L=Vf.call(this,this.L)},function(){this.K=Vf.call(this,this.K)},function(){this.J=Vf.call(this,this.J)},function(){this.F=Nf.call(this,this.F)},function(){this.G=Nf.call(this,this.G)},function(){this.H=Nf.call(this,this.H)},function(){this.D=Nf.call(this,this.D)},function(){u(this,Nf.call(this,r(this)))},function(){this.L=Nf.call(this,this.L)},
            function(){this.K=Nf.call(this,this.K)},function(){this.J=Nf.call(this,this.J)},function(){zd(this,this.F&this.C);this.A-=this.B.Cc},function(){zd(this,this.G&this.C);this.A-=this.B.Cc},function(){zd(this,this.H&this.C);this.A-=this.B.Cc},function(){zd(this,this.D&this.C);this.A-=this.B.Cc},function(){zd(this,r(this)-2&65535);this.A-=this.B.Cc},function(){zd(this,this.L&this.C);this.A-=this.B.Cc},function(){zd(this,this.K&this.C);this.A-=this.B.Cc},function(){zd(this,this.J&this.C);this.A-=this.B.Cc},
            function(){this.F=this.F&~this.C|this.Ka();this.A-=this.B.cc},function(){this.G=this.G&~this.C|this.Ka();this.A-=this.B.cc},function(){this.H=this.H&~this.C|this.Ka();this.A-=this.B.cc},function(){this.D=this.D&~this.C|this.Ka();this.A-=this.B.cc},function(){u(this,r(this)&~this.C|this.Ka());this.A-=this.B.cc},function(){this.L=this.L&~this.C|this.Ka();this.A-=this.B.cc},function(){this.K=this.K&~this.C|this.Ka();this.A-=this.B.cc},function(){this.J=this.J&~this.C|this.Ka();this.A-=this.B.cc},kh,
            lh,mh,nh,oh,ph,qh,rh,sh,th,uh,vh,wh,xh,yh,zh,kh,lh,mh,nh,oh,ph,qh,rh,sh,th,uh,vh,wh,xh,yh,zh,Ah,function(){this.Qc[this.U()].call(this,Lh,this.oa);this.A-=this.La===n?1:this.B.di},Ah,function(){this.Qc[this.U()].call(this,Lh,this.M);this.A-=this.La===n?1:this.B.di},function(){this.fd[this.U()].call(this,Wg)},function(){this.Lb[this.U()].call(this,Xg)},function(){this.Rc[this.Li=this.U()].call(this,Yg)},function(){this.Na[this.Li=this.U()].call(this,Zg)},function(){this.S|=1;this.fd[this.U()].call(this,
            dg)},function(){this.S|=1;this.Lb[this.U()].call(this,dg)},function(){this.Rc[this.U()].call(this,dg)},function(){this.Na[this.U()].call(this,dg)},function(){var a=this.U();switch((a&56)>>3){case 0:this.Rd=this.Ma.ia;break;case 1:this.Rd=this.ta.ia;break;case 2:this.Rd=this.ua.ia;break;case 3:this.Rd=this.bb.ia;break;case 4:if(this.ka>=Lb){this.Rd=this.xc.ia;break}Md.call(this);break;case 5:if(this.ka>=Lb){this.Rd=this.yc.ia;break}default:Md.call(this)}this.S|=1;this.Lb[a].call(this,fg)},function(){this.S|=
            1;this.ha=this.la=this.To;this.Na[this.U()].call(this,Yf)},function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 2:a=this.H;break;case 3:a=this.D;break;default:if(80286==this.ka||this.ka==Lb&&4!=c&&5!=c){Md.call(this);return}switch(c){case 1:a=this.G;break;case 4:a=r(this);break;case 5:a=this.L;break;case 6:a=this.K;break;case 7:a=this.J}}this.Na[b].call(this,dg);switch(c){case 0:Ne(this,this.F);this.F=a;break;case 1:Le(this,this.G);this.G=a;break;case 2:wd(this,this.H);this.H=
            a;break;case 3:Me(this,this.D);this.D=a;break;case 4:this.ka>=Lb?this.xc.load(r(this)):Ne(this,r(this));u(this,a);break;case 5:this.ka>=Lb?this.yc.load(this.L):Le(this,this.L);this.L=a;break;case 6:wd(this,this.K);this.K=a;break;case 7:Me(this,this.J),this.J=a}},function(){this.S|=1;this.Qc[this.U()].call(this,Mh,this.Ka)},function(){this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.G&this.C;this.G=this.G&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.H&
            this.C;this.H=this.H&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.D&this.C;this.D=this.D&~this.C|a&this.C;this.A-=3},function(){var a=this.F,b=r(this);this.F=this.F&~this.C|b&this.C;u(this,b&~this.C|a&this.C);this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.L&this.C;this.L=this.L&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.K&this.C;this.K=this.K&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|
            this.J&this.C;this.J=this.J&~this.C|a&this.C;this.A-=3},function(){this.F=2==this.pa?this.F&-65536|this.F<<24>>24&65535:this.F<<16>>16;this.A-=2},function(){this.H=2==this.pa?this.H&-65536|(this.F&32768?65535:0):this.F&-2147483648?-1:0;this.A-=this.B.Nl},function(){Kf.call(this,this.oa(),of(this));this.A-=this.B.Ql},function(){this.ab("WAIT not implemented");this.A--},function(){zd(this,Nb(this));this.A-=this.B.Cc},function(){Bd(this,this.Ka());this.A-=this.B.cc},function(){var a=this.F>>8&255;a&
            Wb?Ye(this):Ze(this);a&Vb?(this.resultType&=-3,this.aa|=Vb):(this.resultType&=-3,this.aa&=~Vb);a&Ub?ff(this):df(this);a&Tb?gf(this):ef(this);a&Sb?(this.resultType&=-17,this.aa|=Sb):(this.resultType&=-17,this.aa&=~Sb);this.A-=this.B.Ob},function(){this.F=this.F&-65281|(Nb(this)&pd)<<8;this.A-=this.B.Ob},function(){var a=this.F&-256,b;b=R(this);b=this.Qa(this.ha.Ac(b,1));this.F=a|b;this.A-=this.B.Ij},function(){this.F=this.F&~this.C|yd(this,this.ha,R(this));this.A-=this.B.Ij},function(){var a=R(this),
            b=this.F;this.dd(this.ha.oc(a,1),b);this.A-=this.B.Jj},function(){var a=R(this),b=this.F;this.dg(this.ha.oc(a,this.pa),b);this.A-=this.B.Jj},function(){var a=1,b=0,c=this.B.Kj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Mj,this.Aa&256||(this.A-=this.B.Lj));if(a--){var d=this.aa&Pb?-1:1,e=this.Qa(this.ha.Ac(this.K,1));this.dd(this.Ma.oc(this.J&this.V,1),e);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,
            this.S|=256)}},function(){var a=1,b=0,c=this.B.Kj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Mj,this.Aa&256||(this.A-=this.B.Lj));if(a--){var d=this.aa&Pb?-this.pa:this.pa,e=yd(this,this.ha,this.K);this.dg(this.Ma.oc(this.J&this.V,this.pa),e);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=256)}},function(){var a=1,b=0,c=this.B.vj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.xj,this.Aa&256||(this.A-=
            this.B.wj));if(a--){var d=this.aa&Pb?-1:1,e=kf(this,this.ha,this.K&this.V),g=mf(this,this.Ma,this.J&this.V);Lf.call(this,e,g);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c-this.B.Gb;this.G=this.G&~this.V|this.G-b&this.V;a&&Ue(this)==(this.Aa&64)&&(this.sa=this.Sb,this.S|=256)}},function(){var a=1,b=0,c=this.B.vj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.xj,this.Aa&256||(this.A-=this.B.wj));if(a--){var d=this.aa&Pb?-this.pa:this.pa,e=lf(this,this.ha,this.K&
            this.V),g=nf(this,this.Ma,this.J&this.V);Mf.call(this,e,g);this.K=this.K&~this.V|this.K+d&this.V;this.J=this.J&~this.V|this.J+d&this.V;this.A-=c-this.B.Gb;this.G=this.G&~this.V|this.G-b&this.V;a&&Ue(this)==(this.Aa&64)&&(this.sa=this.Sb,this.S|=256)}},function(){Xe(this,this.F&this.U(),128);this.A-=this.B.pf},function(){Xe(this,this.F&this.oa(),this.dataType);this.A-=this.B.pf},function(){var a=1,b=0,c=this.B.Zj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.ak,this.Aa&256||(this.A-=this.B.$j));if(a--){var d=
            this.F;this.dd(this.Ma.oc(this.J&this.V,1),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=256)}},function(){var a=1,b=0,c=this.B.Zj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.ak,this.Aa&256||(this.A-=this.B.$j));if(a--){var d=this.F;this.dg(this.Ma.oc(this.J&this.V,this.pa),d);this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V;this.A-=c;this.G=this.G&~this.V|this.G-b&this.V;a&&(this.sa=this.Sb,this.S|=
            256)}},function(){var a=1,b=0,c=this.B.Cj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Ej,this.Aa&256||(this.A-=this.B.Dj));a--&&(this.F=this.F&-256|this.Qa(this.ha.Ac(this.K&this.V,1)),this.K=this.K&~this.V|this.K+(this.aa&Pb?-1:1)&this.V,this.A-=c,this.G=this.G&~this.V|this.G-b&this.V,a&&(this.sa=this.Sb,this.S|=256))},function(){var a=1,b=0,c=this.B.Cj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Ej,this.Aa&256||(this.A-=this.B.Dj));a--&&(this.F=this.F&~this.C|yd(this,this.ha,this.K&this.V),this.K=
            this.K&~this.V|this.K+(this.aa&Pb?-this.pa:this.pa)&this.V,this.A-=c,this.G=this.G&~this.V|this.G-b&this.V,a&&(this.sa=this.Sb,this.S|=256))},function(){var a=1,b=0,c=this.B.Rj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Tj,this.Aa&256||(this.A-=this.B.Sj));a--&&(Lf.call(this,this.F&255,mf(this,this.Ma,this.J&this.V)),this.J=this.J&~this.V|this.J+(this.aa&Pb?-1:1)&this.V,this.A-=c-this.B.Gb,this.G=this.G&~this.V|this.G-b&this.V,a&&Ue(this)==(this.Aa&64)&&(this.sa=this.Sb,this.S|=256))},function(){var a=
            1,b=0,c=this.B.Rj;this.Aa&192&&(a=this.G&this.V,b=1,c=this.B.Tj,this.Aa&256||(this.A-=this.B.Sj));a--&&(Mf.call(this,this.F&this.C,nf(this,this.Ma,this.J&this.V)),this.J=this.J&~this.V|this.J+(this.aa&Pb?-this.pa:this.pa)&this.V,this.A-=c-this.B.Gb,this.G=this.G&~this.V|this.G-b&this.V,a&&Ue(this)==(this.Aa&64)&&(this.sa=this.Sb,this.S|=256))},function(){this.F=this.F&-256|this.U();this.A-=this.B.Ob},function(){this.G=this.G&-256|this.U();this.A-=this.B.Ob},function(){this.H=this.H&-256|this.U();
            this.A-=this.B.Ob},function(){this.D=this.D&-256|this.U();this.A-=this.B.Ob},function(){this.F=this.F&255|this.U()<<8;this.A-=this.B.Ob},function(){this.G=this.G&255|this.U()<<8;this.A-=this.B.Ob},function(){this.H=this.H&255|this.U()<<8;this.A-=this.B.Ob},function(){this.D=this.D&255|this.U()<<8;this.A-=this.B.Ob},function(){this.F=this.F&~this.C|this.oa();this.A-=this.B.Ob},function(){this.G=this.G&~this.C|this.oa();this.A-=this.B.Ob},function(){this.H=this.H&~this.C|this.oa();this.A-=this.B.Ob},
            function(){this.D=this.D&~this.C|this.oa();this.A-=this.B.Ob},function(){u(this,r(this)&~this.C|this.oa());this.A-=this.B.Ob},function(){this.L=this.L&~this.C|this.oa();this.A-=this.B.Ob},function(){this.K=this.K&~this.C|this.oa();this.A-=this.B.Ob},function(){this.J=this.J&~this.C|this.oa();this.A-=this.B.Ob},Fh,Gh,Fh,Gh,function(){this.Na[this.U()].call(this,Zf)},function(){this.Na[this.U()].call(this,Xf)},function(){this.S|=1;this.Ve[this.U()].call(this,Nh,this.U)},function(){this.S|=1;this.Qc[this.U()].call(this,
            Nh,this.oa)},Hh,Ih,Hh,Ih,function(){tf.call(this,3,null,this.B.gm)},function(){var a=this.U();De(this,a)?tf.call(this,a,null,0):this.A--},function(){We(this)?tf.call(this,4,null,this.B.hm):this.A-=this.B.im},function(){this.A-=this.B.em;if(this.hb&1&&this.aa&16384){var a=this.ra(this.cb.ya+0);xd(this.ta,a,!1)}else{var a=this.ta.Pa,b=this.Ka(),c=this.Ka(),d=this.Ka();null!=Cd(this,b,c,!1)&&(Bd(this,d,a),this.Bh&&He(this,this.sa))}},function(){this.Ve[this.U()].call(this,Ch,eh)},function(){this.Qc[this.U()].call(this,
            2==this.pa?Dh:Eh,eh)},function(){this.Ve[this.U()].call(this,Ch,fh)},function(){this.Qc[this.U()].call(this,2==this.pa?Dh:Eh,fh)},function(){var a=this.U();if(a){var b=this.F&255;this.F=this.F&-65536|b/a<<8|b%a;Xe(this,this.F,128);this.A-=this.B.Hl}},function(){var a=this.U();this.F=this.F&-65536|(this.F>>8&255)*a+this.F&255;Xe(this,this.F,128);this.A-=this.B.Gl},function(){this.F=this.F&-256|(Re(this)?255:0);this.A-=2},function(){this.F=this.F&-256|kf(this,this.ha,this.D+(this.F&255)&65535);this.A-=
            this.B.Im},Jh,Jh,Jh,Jh,Jh,Jh,Jh,Jh,function(){var a=this.M();(this.G=this.G-1&this.V)&&!Ue(this)?(C(this,q(this)+a),this.A-=this.B.pm):this.A-=this.B.Fj},function(){var a=this.M();(this.G=this.G-1&this.V)&&Ue(this)?(C(this,q(this)+a),this.A-=this.B.Gj):this.A-=this.B.Hj},function(){var a=this.M();(this.G=this.G-1&this.V)?(C(this,q(this)+a),this.A-=this.B.om):this.A-=this.B.Fj},function(){var a=this.M();this.G&this.V?this.A-=this.B.Hj:(C(this,q(this)+a),this.A-=this.B.Gj)},function(){var a=this.U();
            this.F=this.F&-256|pc(this.ma,a,this.sa-2);this.A-=this.B.Aj},function(){var a=this.U();this.F=pc(this.ma,a,this.sa-2);this.F|=pc(this.ma,a+1&65535,this.sa-2)<<8;this.A-=this.B.Aj},function(){var a=this.U();tc(this.ma,a,this.F&255,this.sa-2);this.A-=this.B.Qj},function(){var a=this.U();tc(this.ma,a,this.F&255,this.sa-2);tc(this.ma,a+1&65535,this.F>>8,this.sa-2);this.A-=this.B.Qj},function(){var a=this.oa(),b=q(this),a=b+a;zd(this,b);C(this,a);this.A-=this.B.Ol},function(){var a=this.oa();C(this,q(this)+
            a);this.A-=this.B.Bj},function(){Cd(this,this.oa(),of(this));this.A-=this.B.km},function(){var a=this.M();C(this,q(this)+a);this.A-=this.B.Bj},function(){this.F=this.F&-256|pc(this.ma,this.H,this.sa-1);this.A-=this.B.zj},function(){this.F=pc(this.ma,this.H,this.sa-1);this.F|=pc(this.ma,this.H+1&65535,this.sa-1)<<8;this.A-=this.B.zj},function(){tc(this.ma,this.H,this.F&255,this.sa-1);this.A-=this.B.Pj},function(){tc(this.ma,this.H,this.F&255,this.sa-1);tc(this.ma,this.H+1&65535,this.F>>8,this.sa-1);
            this.A-=this.B.Pj},Kh,Kh,function(){this.S|=132;this.A-=this.B.bd},function(){this.S|=68;this.A-=this.B.bd},function(){this.Bb|=4;this.A-=2;this.Y&&this.qa(-2147483648)?(this.sa=this.sa+-1|0,this.zb()):this.aa&Qb||(this.Y&&(this.sa=this.sa+-1|0),this.zb())},function(){Re(this)?Ze(this):Ye(this);this.A-=2},function(){this.Zb=!1;this.Ve[this.U()].call(this,Oh,hh);this.Zb&&(this.F=this.F&~this.C|this.ub&this.C)},function(){this.Zb=!1;this.Qc[this.U()].call(this,Ph,hh);this.Zb&&(this.F=this.F&~this.C|
            this.ub&this.C,this.H=this.H&~this.C|this.mc&this.C)},function(){Ze(this);this.A-=2},function(){Ye(this);this.A-=2},function(){this.aa&=~Qb;this.A-=this.B.Ml},function(){this.aa|=Qb;this.S|=4;this.A-=2},function(){this.aa&=~Pb;this.A-=2},function(){this.aa|=Pb;this.A-=2},function(){this.Ve[this.U()].call(this,Jd,hh)},function(){this.Qc[this.U()].call(this,Kd,hh)}],Bh=[yf,hg,wf,qg,Af,Ug,$g,Lf],Lh=[zf,ig,xf,rg,Bf,Vg,ah,Mf],Mh=[function(a,b){this.A-=this.La===n?this.B.cc:this.B.Am;return b},bh,bh,bh,
            bh,bh,bh,bh],Nh=[function(a,b){this.A-=this.La===n?this.B.sm:this.B.qm;return b},ch,ch,ch,ch,ch,ch,ch],Ch=[function(a,b){var c=a,d=b&this.Hb;if(d){var e;(d&=7)?(e=a<<d-1,c=(a<<d|a>>8-d)&255):e=a<<7;bf(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e;(d&=7)?(e=a<<8-d,c=(a>>>d|e)&255):e=a;bf(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e=cf(this);(d%=9)?(c=(a<<d|e<<d-1|a>>9-d)&255,e=a<<d-1):e<<=7;bf(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Hb;
            if(d){var e=cf(this);(d%=9)?(c=(a>>d|e<<8-d|a<<9-d)&255,e=a<<8-d):e<<=7;bf(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e=0;8<d?c=0:(e=a<<d-1,c=e<<1&255);Xe(this,c,128,e&128,(c^e)&128)}return c},function(a,b){var c=b&this.Hb;c&&(c=8<c?0:a>>>c-1,a=c>>>1&255,Xe(this,a,128,c&1,a&128));return a},ch,function(a,b){var c=b&this.Hb;c&&(9<c&&(c=9),c=a<<24>>24>>c-1,a=c>>1&255,Xe(this,a,128,c&1));return a}],Dh=[function(a,b){var c=a,d=b&this.Hb;if(d){var e;(d&=15)?(e=a<<d-1,c=(a<<d|a>>
            16-d)&65535):e=a<<15;bf(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e;(d&=15)?(e=a<<16-d,c=(a>>>d|e)&65535):e=a;bf(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e=cf(this);(d%=17)?(c=(a<<d|e<<d-1|a>>17-d)&65535,e=a<<d-1):e<<=15;bf(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e=cf(this);(d%=17)?(c=(a>>d|e<<16-d|a<<17-d)&65535,e=a<<16-d):e<<=15;bf(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e=0;16<d?
            c=0:(e=a<<d-1,c=e<<1&65535);Xe(this,c,32768,e&32768,(c^e)&32768)}return c},function(a,b){var c=b&this.Hb;c&&(c=16<c?0:a>>>c-1,a=c>>>1&65535,Xe(this,a,32768,c&1,a&32768));return a},ch,function(a,b){var c=b&this.Hb;c&&(17<c&&(c=17),c=a<<16>>16>>c-1,a=c>>1&65535,Xe(this,a,32768,c&1));return a}],Eh=[function(a,b){var c=a,d=b&this.Hb;d&&(c=a<<d|a>>>32-d,bf(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.Hb;if(d){var e=a<<32-d,c=a>>>d|e;bf(this,c,e,-2147483648)}return c},function(a,
            b){var c=a,d=b&this.Hb;d&&(c=cf(this),c=a<<d|c<<d-1|a>>>32-d>>>1,bf(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.Hb;d&&(c=cf(this),c=a>>>d|c<<32-d|a<<32-d<<1,bf(this,c,a<<32-d,-2147483648));return c},function(a,b){var c=a,d=b&this.Hb;d&&(d=a<<d-1,c=d<<1,Xe(this,c,-2147483648,d&-2147483648,(c^d)&-2147483648));return c},function(a,b){var c=b&this.Hb;c&&(c=a>>>c-1,a=c>>>1,Xe(this,a,-2147483648,c&1,a&-2147483648));return a},ch,function(a,b){var c=b&this.Hb;c&&(c=a>>c-1,a=c>>1,
            Xe(this,a,-2147483648,c&1));return a}],Oh=[function(a,b){b=this.U();Xe(this,a&b,128);this.A-=this.X===n?this.B.ck:this.B.bk;this.S|=2;return a},ch,function(a){this.A-=this.X===n?this.B.Vg:this.B.Ug;return a^255},function(a){var b=-a|0;Qe(this,0,a,b,191,!0);this.A-=this.X===n?this.B.Vg:this.B.Ug;return b&255},function(a){this.Zb=!0;this.ub=(this.F&255)*a&65535;this.ub&65280?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?this.B.wm:this.B.vm;this.S|=2;return a},function(a){var b=(this.F<<
            24>>24)*(a<<24>>24)|0;this.Zb=!0;this.ub=b&65535;127<b||-128>b?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?this.B.bm:this.B.am;this.S|=2;return a},function(a,b){if(!a)return dh.call(this),a;var c=(b=this.F&65535)/a;if(255<c)return dh.call(this),a;this.Zb=!0;this.ub=c&255|(b%a&255)<<8;this.A-=this.X===n?this.B.Ul:this.B.Tl;this.S|=2;return a},function(a,b){if(!a)return dh.call(this),a;var c=a<<24>>24,d=(b=this.F<<16>>16)/c|0;if(d!=d<<24>>24||8086==this.ka&&-128==d)return dh.call(this),
            a;this.Zb=!0;this.ub=d&255|(b%c&255)<<8;this.A-=this.X===n?this.B.Yl:this.B.Xl;this.S|=2;return a}],Ph=[function(a,b){b=this.oa();Xe(this,a&b,32768);this.A-=this.X===n?this.B.ck:this.B.bk;this.S|=2;return a},ch,function(a){this.A-=this.X===n?this.B.Vg:this.B.Ug;return a^65535},function(a){var b=-a|0;Qe(this,0,a,b,32831,!0);this.A-=this.X===n?this.B.Vg:this.B.Ug;return b&65535},function(a,b){if(2==this.pa){b=this.F&65535;var c=b*a|0;this.Zb=!0;this.ub=c&65535;this.mc=c>>16&65535}else gg.call(this,
            a,this.F);this.mc?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?this.B.ym:this.B.xm;this.S|=2;return a},function(a,b){var c;if(2==this.pa)b=this.F&65535,c=(b<<16>>16)*(a<<16>>16)|0,this.Zb=!0,this.ub=c&65535,this.mc=c>>16&65535,c=32767<c||-32768>c;else{c=a;var d=this.F,e=!1;0>d&&(d=-d|0,e=!e);0>c&&(c=-c|0,e=!e);gg.call(this,c,d);e&&(this.ub=~this.ub+1|0,this.mc=~this.mc+(this.ub?0:1)|0);c=this.mc!=this.ub>>31}c?(Ye(this),$e(this)):(Ze(this),af(this));this.A-=this.X===n?this.B.dm:this.B.cm;
            this.S|=2;return a},function(a,b){if(2==this.pa){if(!a)return dh.call(this),a;b=65536*(this.H&65535)+(this.F&65535);var c=b/a|0;if(65536<=c)return dh.call(this),a;this.Zb=!0;this.ub=c&65535;this.mc=b%a&65535}else{Pf.call(this,this.F,this.H,a);if(!this.Zb)return dh.call(this),a;this.ub|=0;this.mc|=0}this.A-=this.X===n?this.B.Wl:this.B.Vl;this.S|=2;return a},function(a,b){if(2==this.pa){if(!a)return dh.call(this),a;var c=a<<16>>16,d=(b=this.H<<16|this.F&65535)/c|0;if(d!=d<<16>>16||8086==this.ka&&-32768==
            d)return dh.call(this),a;this.Zb=!0;this.ub=d&65535;this.mc=b%c&65535}else{var c=this.F,d=this.H,e=a,g=!1,l=!1;0>e&&(e=-e|0,g=!g);0>d&&(c=-c|0,d=~d+(c?0:1)|0,l=!0,g=!g);Pf.call(this,c,d,e);2147483647<this.ub&&(this.Zb=!1);g&&(this.ub=-this.ub);l&&(this.mc=-this.mc);if(!this.Zb)return dh.call(this),a;this.ub|=0;this.mc|=0}this.A-=this.X===n?this.B.$l:this.B.Zl;this.S|=2;return a}],Jd=[function(a){var b=a+1|0;Qe(this,a,1,b,190);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&255},function(a){var b=
            a-1|0;Qe(this,a,1,b,190,!0);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&255},ch,ch,ch,ch,ch,ch],Kd=[function(a){var b=a+1|0;Qe(this,a,1,b,32830);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&65535},function(a){var b=a-1|0;Qe(this,a,1,b,32830,!0);this.A-=this.X===n?this.B.Tg:this.B.Sg;return b&65535},function(a){zd(this,q(this));C(this,a);this.A-=this.X===n?this.B.Sl:this.B.Rl;this.S|=2;return a},function(a){if(this.X===n)return ch.call(this,a);Kf.call(this,a,this.ra(this.X+this.pa));this.A-=
            this.B.Pl;this.S|=2;return a},function(a){C(this,a);this.A-=this.X===n?this.B.mm:this.B.lm;this.S|=2;return a},function(a){if(this.X===n)return ch.call(this,a);Cd(this,a,this.ra(this.X+this.pa));this.Bh&&He(this,this.sa);this.A-=this.B.jm;this.S|=2;return a},function(a){var b=a;this.S&512&&(a=a-2&65535,80286>this.ka&&(b=a));zd(this,b);this.A-=this.X===n?this.B.Cc:this.B.Cm;this.S|=2;return a},bh],ee=Array(256);ee[0]=function(){var a=this.U();16>(a&56)&&(this.S|=1);this.Qc[a].call(this,this.ln,hh)};
            ee[1]=function(){var a=this.U();a&16||(this.S|=1);this.Qc[a].call(this,Qh,hh)};ee[2]=function(){this.Na[this.U()].call(this,Wf)};ee[3]=function(){this.Na[this.U()].call(this,bg)};
            ee[5]=function(){this.ta.Pa?ud.call(this,13,0,!0):(hf(this,this.ra(2054)),this.J=this.ra(2086),this.K=this.ra(2088),this.L=this.ra(2090),this.D=this.ra(2094),this.H=this.ra(2096),this.G=this.ra(2098),this.F=this.ra(2100),vd(this.Ma,2102,this.ra(2084)),vd(this.ta,2108,this.ra(2082)),vd(this.ua,2114,this.ra(2080)),vd(this.bb,2120,this.ra(2078)),Bd(this,this.ra(2072)),C(this,this.ra(2074)),u(this,this.ra(2092)),this.Fd=this.ra(2126)|this.Qa(2128)<<16,this.Cf=this.Fd+this.ra(2130),vd(this.yd,2132,this.ra(2076)),
            this.Gd=this.ra(2138)|this.Qa(2140)<<16,this.Ye=this.Gd+this.ra(2142),vd(this.cb,2144,this.ra(2070)),this.A-=195)};ee[6]=function(){this.ta.Pa?ud.call(this,13,0):(this.hb&=-9,this.A-=2)};ee[11]=Md;var x=[];x[32]=function(){var a=this.U()|192;if(this.ta.Pa)ud.call(this,13,0);else{switch((a&56)>>3){case 0:this.Rd=this.hb;break;case 1:this.Rd=this.ki;break;case 2:this.Rd=this.Yf;break;case 3:this.Rd=this.uf;break;default:fe.call(this);return}ze(this,4);this.Na[a].call(this,fg)}};
            x[34]=function(){var a,b=this.U()|192;if(this.ta.Pa)ud.call(this,13,0);else{var c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 1:a=this.G;break;case 2:a=this.H;break;case 3:a=this.D;break;default:Md.call(this);return}ze(this,4);this.Na[b].call(this,dg);switch(c){case 0:c=this.F;this.F=a;this.hb=c;pe(this);this.hb&-2147483648?ne(this):this.na!=this.Se&&(this.na=this.Se,this.xi=this.Xk=null);break;case 1:this.ki=this.G;this.G=a;break;case 2:this.Yf=this.H;this.H=a;break;case 3:c=this.D,this.D=a,this.uf=
            c,this.hb&-2147483648&&ne(this)}}};x[128]=function(){var a=this.oa();We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[129]=function(){var a=this.oa();We(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};x[130]=function(){var a=this.oa();Re(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[131]=function(){var a=this.oa();Re(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};
            x[132]=function(){var a=this.oa();Ue(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[133]=function(){var a=this.oa();Ue(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};x[134]=function(){var a=this.oa();Re(this)||Ue(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[135]=function(){var a=this.oa();Re(this)||Ue(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};
            x[136]=function(){var a=this.oa();Ve(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[137]=function(){var a=this.oa();Ve(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};x[138]=function(){var a=this.oa();Se(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[139]=function(){var a=this.oa();Se(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};
            x[140]=function(){var a=this.oa();!Ve(this)!=!We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[141]=function(){var a=this.oa();!Ve(this)==!We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[142]=function(){var a=this.oa();Ue(this)||!Ve(this)!=!We(this)?(C(this,q(this)+a),this.A-=this.B.Ha):this.A-=this.B.Ia};x[143]=function(){var a=this.oa();Ue(this)||!Ve(this)!=!We(this)?this.A-=this.B.Ia:(C(this,q(this)+a),this.A-=this.B.Ha)};x[144]=function(){sg.call(this,tg)};
            x[145]=function(){sg.call(this,tg)};x[146]=function(){sg.call(this,ug)};x[147]=function(){sg.call(this,vg)};x[148]=function(){sg.call(this,wg)};x[149]=function(){sg.call(this,xg)};x[150]=function(){sg.call(this,yg)};x[151]=function(){sg.call(this,zg)};x[152]=function(){sg.call(this,Ag)};x[153]=function(){sg.call(this,Bg)};x[154]=function(){sg.call(this,Cg)};x[155]=function(){sg.call(this,Dg)};x[156]=function(){sg.call(this,Eg)};x[157]=function(){sg.call(this,Fg)};x[158]=function(){sg.call(this,Gg)};
            x[159]=function(){sg.call(this,Hg)};x[160]=function(){zd(this,this.xc.ia);this.A-=this.B.qf};x[161]=function(){var a=this.Ka();this.xc.load(a);this.A-=this.B.cc};x[163]=function(){this.Lb[this.U()].call(this,Gf);this.X!==n&&(this.A-=this.B.cr)};x[164]=function(){this.Lb[this.U()].call(this,2==this.pa?Kg:Lg);this.A-=this.X===n?this.B.Yj:this.B.Xj};x[165]=function(){this.Lb[this.U()].call(this,2==this.pa?Mg:Ng);this.A-=this.X===n?this.B.Yj:this.B.Xj};x[168]=function(){zd(this,this.yc.ia);this.A-=this.B.qf};
            x[169]=function(){var a=this.Ka();this.yc.load(a);this.A-=this.B.cc};x[171]=function(){this.Lb[this.U()].call(this,Jf);this.X!==n&&(this.A-=this.B.Jl)};x[172]=function(){this.Lb[this.U()].call(this,2==this.pa?Qg:Rg);this.A-=this.X===n?this.B.Yj:this.B.Xj};x[173]=function(){this.Lb[this.U()].call(this,2==this.pa?Sg:Tg);this.A-=this.X===n?this.B.Yj:this.B.Xj};x[175]=function(){this.Na[this.U()].call(this,2==this.pa?Tf:Uf)};x[178]=function(){this.Na[this.U()].call(this,cg)};
            x[179]=function(){this.Lb[this.U()].call(this,If);this.X!==n&&(this.A-=this.B.Jl)};x[180]=function(){this.Na[this.U()].call(this,$f)};x[181]=function(){this.Na[this.U()].call(this,ag)};
            x[182]=function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Rc[b].call(this,eg);switch(c){case 0:this.F=this.F&~this.C|this.F&255;break;case 1:this.G=this.G&~this.C|this.G&255;break;case 2:this.H=this.H&~this.C|this.H&255;break;case 3:this.D=this.D&~this.C|this.D&255;break;case 4:this.je=this.je&~this.C|this.F>>8&255;this.F=a;break;case 5:this.L=this.L&~this.C|this.G>>8&255;this.G=a;break;case 6:this.K=this.K&~this.C|
            this.H>>8&255;this.H=a;break;case 7:this.J=this.J&~this.C|this.D>>8&255,this.D=a}this.A-=this.X===n?this.B.Oj:this.B.Nj};x[183]=function(){var a=this.U();ze(this,2);this.Na[a].call(this,eg);switch((a&56)>>3){case 0:this.F&=65535;break;case 1:this.G&=65535;break;case 2:this.H&=65535;break;case 3:this.D&=65535;break;case 4:this.je&=65535;break;case 5:this.L&=65535;break;case 6:this.K&=65535;break;case 7:this.J&=65535}this.A-=this.X===n?this.B.Oj:this.B.Nj};
            x[186]=function(){this.Qc[this.U()].call(this,Rh,this.U)};x[187]=function(){this.Lb[this.U()].call(this,Hf);this.X!==n&&(this.A-=this.B.Jl)};x[188]=function(){this.Na[this.U()].call(this,Ef)};x[189]=function(){this.Na[this.U()].call(this,Ff)};
            x[190]=function(){var a,b=this.U(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Rc[b].call(this,eg);switch(c){case 0:this.F=this.F&~this.C|(this.F&255)<<24>>24&this.C;break;case 1:this.G=this.G&~this.C|(this.G&255)<<24>>24&this.C;break;case 2:this.H=this.H&~this.C|(this.H&255)<<24>>24&this.C;break;case 3:this.D=this.D&~this.C|(this.D&255)<<24>>24&this.C;break;case 4:this.je=this.je&~this.C|this.F<<16>>24&this.C;this.F=a;break;case 5:this.L=
            this.L&~this.C|this.G<<16>>24&this.C;this.G=a;break;case 6:this.K=this.K&~this.C|this.H<<16>>24&this.C;this.H=a;break;case 7:this.J=this.J&~this.C|this.D<<16>>24&this.C,this.D=a}this.A-=this.X===n?this.B.Oj:this.B.Nj};
            x[191]=function(){var a=this.U();ze(this,2);this.Na[a].call(this,eg);switch((a&56)>>3){case 0:this.F=this.F<<16>>16;break;case 1:this.G=this.G<<16>>16;break;case 2:this.H=this.H<<16>>16;break;case 3:this.D=this.D<<16>>16;break;case 4:this.je=this.je<<16>>16;break;case 5:this.L=this.L<<16>>16;break;case 6:this.K=this.K<<16>>16;break;case 7:this.J=this.J<<16>>16}this.A-=this.X===n?this.B.Oj:this.B.Nj};
            var Ie=[function(){this.A-=2+(this.X===n?0:1);return this.yd.ia},function(){this.A-=2+(this.X===n?0:1);return this.cb.ia},function(a){this.S|=2;this.yd.load(a);this.A-=17+(this.X===n?0:2);return a},function(a){this.S|=2;this.cb.load(a)!==n&&(this.Kb(this.cb.Ed+4,this.cb.Rb|=512),this.cb.type=768);this.A-=17+(this.X===n?0:2);return a},function(a){this.S|=2;this.A-=14+(this.X===n?0:2);if(this.Tb.load(a,!0)!==n&&2048!=(this.Tb.Rb&2560)&&(this.Tb.Bc>=this.ta.Pa&&this.Tb.Bc>=(a&3)||7168==(this.Tb.Rb&7168)))return gf(this),
            a;ef(this);return a},function(a){this.S|=2;this.A-=14+(this.X===n?0:2);if(this.Tb.load(a,!0)!==n&&512==(this.Tb.Rb&2560)&&this.Tb.Bc>=this.ta.Pa&&this.Tb.Bc>=(a&3))return gf(this),a;ef(this);return a},ch,ch],Ld=[ce,ce,ce,ce,ce,ce,ch,ch],Qh=[function(a){if(this.X===n)Md.call(this);else{a=this.Cf-this.Fd;var b=this.Fd;80286==this.ka?b|=-16777216:this.ka>=Lb&&(2==this.pa?b&=16777215:a|=b<<16);this.Ak(this.X+2,b);this.A-=11}return a},function(a){if(this.X===n)Md.call(this);else{a=this.Ye-this.Gd;var b=
            this.Gd;80286==this.ka?b|=-16777216:this.ka>=Lb&&(2==this.pa?b&=16777215:a|=b<<16);this.Ak(this.X+2,b);this.A-=12}return a},function(a){this.X===n?Md.call(this):(this.Fd=this.fe(this.X+2)&(this.C|this.C<<8),a&=65535,this.Cf=this.Fd+a,this.S|=2,this.A-=11);return a},function(a){this.X===n?Md.call(this):(this.Gd=this.fe(this.X+2)&(this.C|this.C<<8),a&=65535,this.Ye=this.Gd+a,this.S|=2,this.A-=12);return a},function(){this.A-=2+(this.X===n?0:1);return this.hb},ch,function(a){hf(this,a);this.A-=this.X===
            n?3:6;this.S|=2;return a},ch],Rh=[ch,ch,ch,ch,Gf,Jf,If,Hf],y=[function(a){a=a.call(this,this.F&255,D(this,this.D+this.K));this.F=this.F&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&255,D(this,this.D+this.J));this.F=this.F&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&255,E(this,this.L+this.K));this.F=this.F&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&255,E(this,this.L+this.J));this.F=this.F&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&255,D(this,
            this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,R(this)));this.F=this.F&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&255,D(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.D+this.K));this.G=this.G&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&255,D(this,this.D+this.J));this.G=this.G&-256|
            a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&255,E(this,this.L+this.K));this.G=this.G&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&255,E(this,this.L+this.J));this.G=this.G&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&255,D(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,R(this)));this.G=this.G&-256|a;this.A-=this.B.da},function(a){a=
            a.call(this,this.G&255,D(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.D+this.K));this.H=this.H&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&255,D(this,this.D+this.J));this.H=this.H&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&255,E(this,this.L+this.K));this.H=this.H&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&255,E(this,this.L+this.J));this.H=this.H&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,
            this.H&255,D(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,R(this)));this.H=this.H&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&255,D(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,this.D+this.K));this.D=this.D&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&255,D(this,this.D+this.J));
            this.D=this.D&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&255,E(this,this.L+this.K));this.D=this.D&-256|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&255,E(this,this.L+this.J));this.D=this.D&-256|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&255,D(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,R(this)));this.D=this.D&-256|a;this.A-=
            this.B.da},function(a){a=a.call(this,this.D&255,D(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.J));this.F=this.F&
            -65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.F>>8&255,D(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.F>>8&255,D(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.K));this.G=
            this.G&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.G>>8&255,D(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,
            D(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.G>>8&255,D(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,
            this.H>>8&255,E(this,this.L+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.H>>8&255,D(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.da},function(a){a=
            a.call(this,this.H>>8&255,D(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.ba},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.ca},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.J));this.D=this.D&-65281|a<<8;this.A-=
            this.B.ba},function(a){a=a.call(this,this.D>>8&255,D(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.D>>8&255,D(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,this.D+this.K+this.M()));this.F=this.F&-256|
            a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,D(this,this.D+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,E(this,this.L+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,E(this,this.L+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,D(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.J+this.M()));
            this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.D+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,D(this,this.D+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,E(this,
            this.L+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,E(this,this.L+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,D(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.G&255,D(this,this.D+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.D+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,D(this,this.D+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,E(this,this.L+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,E(this,this.L+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},
            function(a){a=a.call(this,this.H&255,D(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.D+this.K+this.M()));this.D=this.D&-256|a;this.A-=
            this.B.P},function(a){a=a.call(this,this.D&255,D(this,this.D+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,E(this,this.L+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,E(this,this.L+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,D(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.J+this.M()));this.D=
            this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&
            255,E(this,this.L+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,D(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.M()));this.F=this.F&-65281|a<<
            8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,
            this.G>>8&255,E(this,this.L+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,D(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.M()));this.G=this.G&-65281|
            a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=
            a.call(this,this.H>>8&255,D(this,this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.K+this.M()));this.D=
            this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,D(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=
            a.call(this,this.D>>8&255,D(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.D+this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,D(this,this.D+this.J+R(this)));this.F=this.F&
            -256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,E(this,this.L+this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&255,E(this,this.L+this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,D(this,this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.L+R(this)));this.F=
            this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.D+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.D+this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,D(this,this.D+this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,E(this,this.L+this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&255,E(this,this.L+
            this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,D(this,this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.L+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.D+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.D+
            this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,D(this,this.D+this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,E(this,this.L+this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&255,E(this,this.L+this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,D(this,this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.H&255,D(this,this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.L+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.D+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.D+this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,D(this,this.D+this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=
            a.call(this,this.D&255,E(this,this.L+this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&255,E(this,this.L+this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,D(this,this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.L+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,D(this,this.D+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.J+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.J+R(this)));
            this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,D(this,this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.J+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.G>>8&255,D(this,this.D+this.K+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+this.K+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,D(this,this.K+R(this)));this.G=
            this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,
            this.H>>8&255,D(this,this.D+this.J+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.J+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,D(this,this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.J+R(this)));this.H=this.H&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,
            this.D>>8&255,E(this,this.L+this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.Q},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,D(this,this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+R(this)));this.D=this.D&-65281|
            a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=
            a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=
            a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=
            a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=
            a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},
            function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,
            this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>
            8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&
            -65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=
            a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],re=[function(a){a=a.call(this,
            L(this,this.D+this.K),this.F&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.F&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.F&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.F&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,R(this)),this.F&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.G&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.G&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.G&255);P(this,a);this.A-=this.B.ba},
            function(a){a=a.call(this,L(this,this.K),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.G&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.H&255);P(this,a);this.A-=this.B.ca},
            function(a){a=a.call(this,M(this,this.L+this.K),this.H&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.H&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.H&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.H&255);P(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,this.D+this.K),this.D&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.D&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.D&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.D&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D&255);P(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,L(this,R(this)),this.D&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.F>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.F>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.F>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.F>>
            8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.F>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.G>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+
            this.J),this.G>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.G>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.G>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.G>>8&255);P(this,a);this.A-=this.B.da},function(a){a=
            a.call(this,L(this,this.D),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.H>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.H>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),this.H>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.H>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.H>>8&255);P(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.H>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D+this.K),this.D>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.D+this.J),this.D>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.K),
            this.D>>8&255);P(this,a);this.A-=this.B.ca},function(a){a=a.call(this,M(this,this.L+this.J),this.D>>8&255);P(this,a);this.A-=this.B.ba},function(a){a=a.call(this,L(this,this.K),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.D>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.D),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,
            this.D+this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&
            255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.Q},
            function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+
            this.M()),this.H&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.H&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.H&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&255);P(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.Q},function(a){a=
            a.call(this,M(this,this.L+this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.F>>
            8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F>>8&255);P(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.Q},
            function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.D+this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
            this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+this.M()),this.D>>8&255);
            P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.D+this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.F&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+R(this)),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),
            this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.Q},
            function(a){a=a.call(this,M(this,this.L+this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),
            this.H&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.L+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.D&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+
            this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),this.F>>8&255);P(this,a);this.A-=
            this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.L+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+
            this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),this.H>>8&255);P(this,
            a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.L+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.D+this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,M(this,this.L+this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.Q},function(a){a=a.call(this,
            M(this,this.L+this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,L(this,this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},y[192],y[200],y[208],y[216],y[224],y[232],y[240],y[248],y[193],
            y[201],y[209],y[217],y[225],y[233],y[241],y[249],y[194],y[202],y[210],y[218],y[226],y[234],y[242],y[250],y[195],y[203],y[211],y[219],y[227],y[235],y[243],y[251],y[196],y[204],y[212],y[220],y[228],y[236],y[244],y[252],y[197],y[205],y[213],y[221],y[229],y[237],y[245],y[253],y[198],y[206],y[214],y[222],y[230],y[238],y[246],y[254],y[199],y[207],y[215],y[223],y[231],y[239],y[247],y[255]],se=[function(a,b){var c=a[0].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.ba},function(a,
            b){var c=a[0].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,
            L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,M(this,this.L+this.J),
            b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=
            this.B.ba},function(a,b){var c=a[2].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,
            b){var c=a[2].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,
            M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.D+this.K),b.call(this));
            P(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=
            this.B.N},function(a,b){var c=a[4].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,
            b){var c=a[5].call(this,M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,
            this.D+this.K),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,L(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,M(this,this.L+this.K),b.call(this));P(this,c);this.A-=
            this.B.ca},function(a,b){var c=a[7].call(this,M(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=
            a[0].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+this.M()),b.call(this));
            P(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+this.M()),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,
            M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,
            b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},
            function(a,b){var c=a[4].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.J+this.M()),
            b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.K+
            this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=
            a[7].call(this,M(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,
            b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=
            this.B.P},function(a,b){var c=a[0].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=
            this.B.P},function(a,b){var c=a[1].call(this,L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+R(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.K+R(this)),
            b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+R(this)),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,
            L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,
            L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=
            a[4].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},
            function(a,b){var c=a[5].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[6].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,L(this,this.K+R(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.D+this.J+R(this)),b.call(this));
            P(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,M(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+R(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&
            255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,
            this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=
            a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=
            a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=
            a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|
            c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=
            this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));
            this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));
            this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&
            255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,
            this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],z=[function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.K));this.F=this.F&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.J));this.F=this.F&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.K));this.F=this.F&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.J));this.F=this.F&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,
            this.F&this.C,G(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,R(this)));this.F=this.F&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&this.C,G(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.K));this.G=this.G&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&
            this.C,G(this,this.D+this.J));this.G=this.G&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.K));this.G=this.G&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.J));this.G=this.G&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.G&this.C,G(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.G&this.C,G(this,R(this)));this.G=this.G&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.G&this.C,G(this,this.D));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.K));this.H=this.H&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.J));this.H=this.H&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.H&this.C,H(this,this.L+this.K));this.H=this.H&~this.C|a;this.A-=this.B.ca},function(a){a=
            a.call(this,this.H&this.C,H(this,this.L+this.J));this.H=this.H&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.H&this.C,G(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,R(this)));this.H=this.H&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&this.C,G(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.D&this.C,G(this,this.D+this.K));this.D=this.D&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&this.C,G(this,this.D+this.J));this.D=this.D&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.K));this.D=this.D&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.J));this.D=this.D&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.D&this.C,G(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=
            a.call(this,this.D&this.C,G(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,R(this)));this.D=this.D&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&this.C,G(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.K));u(this,r(this)&~this.C|a);this.A-=this.B.ba},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.J));u(this,r(this)&~this.C|a);this.A-=this.B.ca},function(a){a=
            a.call(this,r(this)&this.C,H(this,this.L+this.K));u(this,r(this)&~this.C|a);this.A-=this.B.ca},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.J));u(this,r(this)&~this.C|a);this.A-=this.B.ba},function(a){a=a.call(this,r(this)&this.C,G(this,this.K));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,this.J));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.da},
            function(a){a=a.call(this,r(this)&this.C,G(this,this.D));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.K));this.L=this.L&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.J));this.L=this.L&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.K));this.L=this.L&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.J));this.L=this.L&~this.C|
            a;this.A-=this.B.ba},function(a){a=a.call(this,this.L&this.C,G(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,R(this)));this.L=this.L&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.L&this.C,G(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.K));this.K=this.K&~this.C|a;
            this.A-=this.B.ba},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.J));this.K=this.K&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.K));this.K=this.K&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.J));this.K=this.K&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.K&this.C,G(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.J));this.K=this.K&
            ~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,R(this)));this.K=this.K&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.K&this.C,G(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.K));this.J=this.J&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.J));this.J=this.J&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.K));
            this.J=this.J&~this.C|a;this.A-=this.B.ca},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.J));this.J=this.J&~this.C|a;this.A-=this.B.ba},function(a){a=a.call(this,this.J&this.C,G(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,R(this)));this.J=this.J&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.J&this.C,G(this,this.D));
            this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=
            a.call(this,this.F&this.C,G(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.K+this.M()));this.G=this.G&~this.C|
            a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,G(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&
            this.C,G(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=
            this.B.Q},function(a){a=a.call(this,this.H&this.C,H(this,this.L+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,H(this,this.L+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,G(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.L+
            this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.D+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,G(this,this.D+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.Q},
            function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,G(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.D+this.M()));this.D=
            this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.P},
            function(a){a=a.call(this,r(this)&this.C,G(this,this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.K+
            this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,G(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,G(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.J+this.M()));
            this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,G(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.K&this.C,H(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.K+this.M()));this.J=this.J&
            ~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,G(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,
            G(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.J+R(this)));this.F=this.F&~this.C|a;
            this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,G(this,this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.L+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.D+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.K+
            R(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.K+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,G(this,this.K+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&this.C,G(this,this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.L+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.D+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.J+R(this)));this.H=this.H&
            ~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,H(this,this.L+this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.H&this.C,H(this,this.L+this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,G(this,this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,
            H(this,this.L+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.D+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.D+this.K+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,G(this,this.D+this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.K+R(this)));this.D=this.D&~this.C|a;this.A-=
            this.B.Q},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,G(this,this.K+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.L+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.D+R(this)));
            this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.K+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.J+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.K+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.Q},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.J+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.P},
            function(a){a=a.call(this,r(this)&this.C,G(this,this.K+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.J+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.K+R(this)));
            this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,G(this,this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.L&this.C,G(this,this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.L+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.D+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.J+R(this)));this.K=this.K&
            ~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,G(this,this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,
            H(this,this.L+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.D+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.K+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.Q},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.K+R(this)));this.J=this.J&~this.C|a;this.A-=
            this.B.Q},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,G(this,this.K+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.L+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.D+R(this)));
            this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,r(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=
            this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=
            a.call(this,this.G&this.C,r(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,
            this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,r(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=
            this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,r(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=
            a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,r(this)&this.C,this.F&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.G&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.H&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.D&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,r(this)&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,
            r(this)&this.C,this.L&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.K&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.J&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,
            this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,r(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=
            this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,r(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=
            a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,r(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,
            this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],te=[function(a){a=a.call(this,N(this,this.D+this.K),this.F&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.F&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.K),this.F&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),this.F&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=
            a.call(this,N(this,this.K),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.F&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.G&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.G&this.C);Q(this,a);this.A-=this.B.ca},
            function(a){a=a.call(this,O(this,this.L+this.K),this.G&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),this.G&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.G&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.G&this.C);Q(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.H&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.H&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.K),this.H&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),this.H&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,
            this.J),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.H&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.D&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.D&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.K),this.D&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=
            a.call(this,O(this,this.L+this.J),this.D&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.D&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),r(this)&this.C);Q(this,a);this.A-=this.B.ba},
            function(a){a=a.call(this,N(this,this.D+this.J),r(this)&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.K),r(this)&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),r(this)&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),r(this)&this.C);
            Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.L&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.L&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.K),this.L&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),this.L&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,
            N(this,this.K),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.L&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K),this.K&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.K&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=
            a.call(this,O(this,this.L+this.K),this.K&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),this.K&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.K&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.K&this.C);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,N(this,this.D+this.K),this.J&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.D+this.J),this.J&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.K),this.J&this.C);Q(this,a);this.A-=this.B.ca},function(a){a=a.call(this,O(this,this.L+this.J),this.J&this.C);Q(this,a);this.A-=this.B.ba},function(a){a=a.call(this,N(this,this.K),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.J&this.C);
            Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.J&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.D),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=
            a.call(this,O(this,this.L+this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+
            this.M()),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.G&
            this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.H&this.C);Q(this,
            a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.D+this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            N(this,this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+
            this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),r(this)&this.C);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.L&this.C);Q(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=
            a.call(this,O(this,this.L+this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+
            this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+this.M()),
            this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+R(this)),this.F&this.C);Q(this,a);
            this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.D+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,
            this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+R(this)),this.H&this.C);
            Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,this.D+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=
            a.call(this,N(this,this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+
            R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),r(this)&this.C);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.L&this.C);Q(this,a);this.A-=
            this.B.P},function(a){a=a.call(this,N(this,this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,
            N(this,this.D+this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),
            this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.K+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.D+this.J+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.Q},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.J&this.C);
            Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,N(this,this.K+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},z[192],z[200],z[208],z[216],z[224],z[232],z[240],z[248],z[193],z[201],z[209],z[217],z[225],z[233],z[241],
            z[249],z[194],z[202],z[210],z[218],z[226],z[234],z[242],z[250],z[195],z[203],z[211],z[219],z[227],z[235],z[243],z[251],z[196],z[204],z[212],z[220],z[228],z[236],z[244],z[252],z[197],z[205],z[213],z[221],z[229],z[237],z[245],z[253],z[198],z[206],z[214],z[222],z[230],z[238],z[246],z[254],z[199],z[207],z[215],z[223],z[231],z[239],z[247],z[255]],ue=[function(a,b){var c=a[0].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,N(this,this.D+this.J),
            b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[0].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[0].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,R(this)),b.call(this));Q(this,c);
            this.A-=this.B.da},function(a,b){var c=a[0].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[1].call(this,N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[1].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},
            function(a,b){var c=a[1].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,
            N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[2].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[2].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,R(this)),b.call(this));
            Q(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[3].call(this,N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[3].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);
            this.A-=this.B.ba},function(a,b){var c=a[3].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=
            a[4].call(this,N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[4].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[4].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,
            R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[5].call(this,O(this,this.L+this.J),
            b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[5].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=
            this.B.ba},function(a,b){var c=a[6].call(this,N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[6].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[6].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[6].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,N(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.ca},function(a,b){var c=a[7].call(this,
            O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.ba},function(a,b){var c=a[7].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.D+this.K+this.M()),
            b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=
            a[1].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
            b){var c=a[1].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,
            c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.K+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+
            this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,
            O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=
            a[4].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=
            this.B.P},function(a,b){var c=a[5].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.K+this.M()),b.call(this));Q(this,
            c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+this.M()),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,O(this,
            this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[0].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,
            b){var c=a[0].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,
            b){var c=a[1].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[1].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},
            function(a,b){var c=a[1].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[2].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);
            this.A-=this.B.Q},function(a,b){var c=a[2].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+R(this)),b.call(this));Q(this,
            c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[3].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,N(this,this.K+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.D+this.J+
            R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[4].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,
            this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[5].call(this,
            O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[6].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
            b){var c=a[6].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},
            function(a,b){var c=a[7].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.Q},function(a,b){var c=a[7].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=
            this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,r(this)&
            this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=
            a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|
            c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));
            this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&
            this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=
            a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|
            c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,r(this)&this.C,b.call(this));
            u(this,r(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,
            this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,
            b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=
            this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],A=[function(a){a=a.call(this,this.F&255,D(this,this.F));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,this.G));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,this.H));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&
            255,D(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,U(this,0)));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,R(this)));this.F=this.F&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&255,D(this,this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.F));this.G=this.G&-256|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.G));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.H));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,U(this,0)));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,R(this)));this.G=this.G&-256|a;this.A-=this.B.da},function(a){a=a.call(this,
            this.G&255,D(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,D(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.F));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.G));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.H));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.D));this.H=this.H&
            -256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,U(this,0)));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,R(this)));this.H=this.H&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.H&255,D(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,D(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,this.F));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=
            a.call(this,this.D&255,D(this,this.G));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,this.H));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,U(this,0)));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,R(this)));this.D=this.D&-256|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&255,D(this,this.K));
            this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,D(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.F));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.G));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.H));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.D));this.F=this.F&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,U(this,0)));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.F>>8&255,D(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,D(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,this.F));this.G=this.G&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,this.G));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,this.H));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,U(this,0)));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,R(this)));this.G=this.G&
            -65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.G>>8&255,D(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,D(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.F));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.G));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.H));this.H=this.H&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,U(this,0)));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.H>>8&255,D(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,D(this,this.J));this.H=this.H&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.F));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.G));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.H));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,U(this,0)));this.D=this.D&
            -65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.da},function(a){a=a.call(this,this.D>>8&255,D(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,D(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,D(this,this.F+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.G+this.M()));this.F=
            this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.H+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,U(this,1)+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.K+this.M()));
            this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.F+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.G+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.H+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.D+this.M()));
            this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,U(this,1)+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.F+this.M()));
            this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.G+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.H+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,U(this,1)+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.L+this.M()));
            this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.F+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.G+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.H+this.M()));
            this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,U(this,1)+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.J+this.M()));
            this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.F+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.G+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.H+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.F>>8&255,D(this,U(this,1)+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.F+this.M()));this.G=this.G&-65281|a<<
            8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.G+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.H+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,U(this,1)+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,
            this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.F+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.G+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=
            a.call(this,this.H>>8&255,D(this,this.H+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,U(this,1)+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.K+this.M()));this.H=this.H&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.F+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.G+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.H+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&
            255,D(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,U(this,1)+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=
            this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.F+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.G+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.H+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.D+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,U(this,2)+R(this)));this.F=this.F&-256|a;this.A-=
            this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.L+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,D(this,this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.F+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.G+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&255,D(this,this.H+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.D+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,U(this,2)+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.L+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,D(this,this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&255,D(this,this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.F+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.G+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.H+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.D+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.H&255,D(this,U(this,2)+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.L+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,D(this,this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.F+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,D(this,this.G+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.H+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.D+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,U(this,2)+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.L+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,D(this,this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,D(this,this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.F+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.G+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.H+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.F>>8&255,D(this,this.D+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,U(this,2)+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.L+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,D(this,this.J+R(this)));this.F=
            this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.F+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.G+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.H+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.D+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>
            8&255,D(this,U(this,2)+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.L+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.K+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,D(this,this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.F+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.H>>8&255,D(this,this.G+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.H+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.D+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,U(this,2)+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.L+R(this)));this.H=
            this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,D(this,this.J+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.F+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.G+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>
            8&255,D(this,this.H+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.D+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,U(this,2)+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.L+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,D(this,this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.D>>8&255,D(this,this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,
            this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&
            255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,
            this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,
            this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=
            a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>
            8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);
            this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|
            a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=
            a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],ve=[function(a){a=a.call(this,
            L(this,this.F),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.F&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),
            this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.G&255);
            P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.G&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.H&255);P(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,L(this,this.D),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.H&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.D&255);P(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,L(this,this.G),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.D&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.J),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,R(this)),this.F>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.D),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.G>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.G),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,R(this)),this.H>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,this.J),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.G),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.H),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.D),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,U(this,0)),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,L(this,R(this)),this.D>>8&255);P(this,a);this.A-=this.B.da},function(a){a=a.call(this,L(this,this.K),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.J),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,L(this,this.F+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.D+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),
            this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H&255);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.G+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,L(this,this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,
            1)+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.G>>8&255);P(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            L(this,this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.H>>8&
            255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.H+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,1)+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+this.M()),
            this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.L+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.G&255);P(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+
            R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.D&255);P(this,a);
            this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,
            this.G+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.F>>8&255);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            L(this,U(this,2)+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.H>>8&255);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,L(this,this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.F+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.G+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.H+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.D+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,U(this,2)+R(this)),this.D>>
            8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.L+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,L(this,this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},A[192],A[200],A[208],A[216],A[224],A[232],A[240],A[248],A[193],A[201],A[209],A[217],A[225],A[233],A[241],A[249],A[194],A[202],A[210],A[218],A[226],A[234],A[242],A[250],A[195],A[203],A[211],A[219],
            A[227],A[235],A[243],A[251],A[196],A[204],A[212],A[220],A[228],A[236],A[244],A[252],A[197],A[205],A[213],A[221],A[229],A[237],A[245],A[253],A[198],A[206],A[214],A[222],A[230],A[238],A[246],A[254],A[199],A[207],A[215],A[223],A[231],A[239],A[247],A[255]],we=[function(a,b){var c=a[0].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.H),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,
            b){var c=a[1].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,R(this)),
            b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},
            function(a,b){var c=a[2].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,
            this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=
            this.B.da},function(a,b){var c=a[3].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,
            L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.F),b.call(this));P(this,
            c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=
            a[5].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.D),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,L(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,
            b){var c=a[7].call(this,L(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,U(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,R(this)),b.call(this));P(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,L(this,this.K),
            b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,L(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,U(this,1)+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,U(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,U(this,2)+R(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.G+R(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.K+R(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[4].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[5].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[5].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[6].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[6].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,
            b){var c=a[7].call(this,L(this,U(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,L(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,
            this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=
            a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=
            a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,
            b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&
            -256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=
            this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));
            this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&
            255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=
            a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=
            a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=
            a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],B=[function(a){a=a.call(this,this.F&this.C,G(this,this.F));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.G));this.F=
            this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.H));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,U(this,0)));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,R(this)));this.F=this.F&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.F&this.C,G(this,this.K));this.F=this.F&
            ~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.F));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.G));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.H));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.D));this.G=this.G&~this.C|a;this.A-=
            this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,U(this,0)));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,R(this)));this.G=this.G&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.G&this.C,G(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,G(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,this.F));this.H=this.H&~this.C|a;this.A-=this.B.N},
            function(a){a=a.call(this,this.H&this.C,G(this,this.G));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,this.H));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,U(this,0)));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,R(this)));this.H=this.H&~this.C|a;this.A-=this.B.da},function(a){a=
            a.call(this,this.H&this.C,G(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,G(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,this.F));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,this.G));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,this.H));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.D&this.C,G(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,U(this,0)));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,R(this)));this.D=this.D&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.D&this.C,G(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,G(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,r(this)&
            this.C,G(this,this.F));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,this.G));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,this.H));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,this.D));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,U(this,0)));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&
            this.C,G(this,R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.da},function(a){a=a.call(this,r(this)&this.C,G(this,this.K));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,r(this)&this.C,G(this,this.J));u(this,r(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,this.F));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,this.G));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,
            G(this,this.H));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,U(this,0)));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,R(this)));this.L=this.L&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.L&this.C,G(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,G(this,
            this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.F));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.G));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.H));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,U(this,0)));
            this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,R(this)));this.K=this.K&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.K&this.C,G(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,G(this,this.J));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.F));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.G));this.J=this.J&
            ~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.H));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,U(this,0)));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,R(this)));this.J=this.J&~this.C|a;this.A-=this.B.da},function(a){a=a.call(this,this.J&this.C,G(this,this.K));this.J=this.J&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,G(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,G(this,this.F+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.G+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.H+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.D+this.M()));
            this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,U(this,1)+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&
            this.C,G(this,this.F+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.G+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.H+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,U(this,1)+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&this.C,H(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.F+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.G+this.M()));this.H=this.H&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.H+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,U(this,1)+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,
            this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.F+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.G+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.H+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&this.C,G(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,U(this,1)+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.J+this.M()));this.D=this.D&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.F+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.G+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.H+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,
            G(this,U(this,1)+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.K+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.J+this.M()));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.F+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,G(this,this.G+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.H+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,U(this,1)+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.L+this.M()));this.L=
            this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.F+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.G+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,
            G(this,this.H+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,U(this,1)+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.K&this.C,G(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.F+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.G+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.H+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.D+this.M()));this.J=this.J&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,U(this,1)+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.F+
            R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.G+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.H+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.D+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,U(this,2)+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.F&this.C,H(this,this.L+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,G(this,this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.F+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.G+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&this.C,G(this,this.H+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.D+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,U(this,2)+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.L+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.K+R(this)));this.G=this.G&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,G(this,this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.F+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.G+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.H+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.D+
            R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,U(this,2)+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.L+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,G(this,this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&this.C,G(this,this.F+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.G+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.H+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.D+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,U(this,2)+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.D&this.C,H(this,this.L+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.K+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,G(this,this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.F+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.G+R(this)));u(this,r(this)&
            ~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.H+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.D+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,U(this,2)+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,H(this,this.L+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&
            this.C,G(this,this.K+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,r(this)&this.C,G(this,this.J+R(this)));u(this,r(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.F+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.G+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.H+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,G(this,this.D+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,U(this,2)+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.L+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,G(this,this.J+R(this)));this.L=this.L&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.F+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.G+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.H+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.D+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,U(this,
            2)+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.L+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,G(this,this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.F+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.J&this.C,G(this,this.G+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.H+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.D+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,U(this,2)+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.L+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.J&this.C,G(this,this.K+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,G(this,this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);
            this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,r(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|
            a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,r(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,
            this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,r(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&
            this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,r(this)&this.C);this.D=this.D&
            ~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,r(this)&this.C,this.F&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.G&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.H&this.C);u(this,r(this)&~this.C|a)},function(a){a=
            a.call(this,r(this)&this.C,this.D&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,r(this)&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.L&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.K&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,r(this)&this.C,this.J&this.C);u(this,r(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,
            this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,r(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&
            this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,r(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&
            ~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=
            a.call(this,this.J&this.C,r(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],xe=[function(a){a=a.call(this,N(this,this.F),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.H),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this,0)),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.F&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.F),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this,0)),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.G&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,
            N(this,this.K),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,U(this,0)),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.H&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.H),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this,0)),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.D&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            N(this,this.F),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this,0)),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.da},function(a){a=
            a.call(this,N(this,this.K),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),r(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,N(this,U(this,0)),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.L&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,N(this,this.H),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this,0)),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.K&this.C);Q(this,a);this.A-=this.B.da},function(a){a=a.call(this,N(this,this.K),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,N(this,this.F),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.G),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.H),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.D),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,U(this,0)),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,R(this)),this.J&this.C);Q(this,a);this.A-=this.B.da},function(a){a=
            a.call(this,N(this,this.K),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.J),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,N(this,this.F+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.F&this.C);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,1)+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.G+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,1)+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),
            this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,U(this,1)+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,
            this.G+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,1)+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.D&this.C);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,U(this,1)+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),
            this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,1)+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.L&this.C);Q(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            N(this,U(this,1)+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+this.M()),this.J&this.C);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,1)+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.F&
            this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.H+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.G&
            this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,O(this,this.L+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),this.D&
            this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,N(this,this.F+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),
            r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),r(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,N(this,this.D+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+
            R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.D+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.K&this.C);Q(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.F+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.G+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.H+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,
            this.D+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,U(this,2)+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.K+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,N(this,this.J+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},B[192],B[200],B[208],B[216],B[224],B[232],B[240],B[248],B[193],B[201],B[209],
            B[217],B[225],B[233],B[241],B[249],B[194],B[202],B[210],B[218],B[226],B[234],B[242],B[250],B[195],B[203],B[211],B[219],B[227],B[235],B[243],B[251],B[196],B[204],B[212],B[220],B[228],B[236],B[244],B[252],B[197],B[205],B[213],B[221],B[229],B[237],B[245],B[253],B[198],B[206],B[214],B[222],B[230],B[238],B[246],B[254],B[199],B[207],B[215],B[223],B[231],B[239],B[247],B[255]],ye=[function(a,b){var c=a[0].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,
            N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[0].call(this,N(this,this.K),b.call(this));Q(this,
            c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=
            a[1].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[1].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.G),b.call(this));
            Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[2].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[2].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,U(this,0)),
            b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[3].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},
            function(a,b){var c=a[4].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[4].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,N(this,
            this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=
            this.B.N},function(a,b){var c=a[5].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[5].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,
            N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[6].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,N(this,this.J),b.call(this));Q(this,
            c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,U(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=
            a[7].call(this,N(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.da},function(a,b){var c=a[7].call(this,N(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,N(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,
            this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
            N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
            N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
            N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
            O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            N(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,U(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            N(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
            this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,N(this,
            this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,U(this,
            2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.G+
            R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.K+
            R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.D+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.F+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,N(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.H+R(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,U(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,N(this,this.J+R(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[0].call(this,
            this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
            a[3].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|
            c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));
            this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[5].call(this,
            this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,r(this)&this.C,b.call(this));u(this,r(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],pf=[function(){return this.F+this.F},function(){return this.G+this.F},function(){return this.H+this.F},function(){return this.D+this.F},function(){this.ha=this.la;return r(this)+this.F},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.F},function(){return this.K+this.F},function(){return this.J+this.F},function(){return this.F+this.G},function(){return this.G+
            this.G},function(){return this.H+this.G},function(){return this.D+this.G},function(){this.ha=this.la;return r(this)+this.G},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.G},function(){return this.K+this.G},function(){return this.J+this.G},function(){return this.F+this.H},function(){return this.G+this.H},function(){return this.H+this.H},function(){return this.D+this.H},function(){this.ha=this.la;return r(this)+this.H},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.H},
            function(){return this.K+this.H},function(){return this.J+this.H},function(){return this.F+this.D},function(){return this.G+this.D},function(){return this.H+this.D},function(){return this.D+this.D},function(){this.ha=this.la;return r(this)+this.D},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.D},function(){return this.K+this.D},function(){return this.J+this.D},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=
            this.la;return r(this)},function(a){return a?(this.ha=this.la,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+this.L},function(){return this.G+this.L},function(){return this.H+this.L},function(){return this.D+this.L},function(){this.ha=this.la;return r(this)+this.L},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.L},function(){return this.K+this.L},function(){return this.J+this.L},function(){return this.F+this.K},function(){return this.G+
            this.K},function(){return this.H+this.K},function(){return this.D+this.K},function(){this.ha=this.la;return r(this)+this.K},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.K},function(){return this.K+this.K},function(){return this.J+this.K},function(){return this.F+this.J},function(){return this.G+this.J},function(){return this.H+this.J},function(){return this.D+this.J},function(){this.ha=this.la;return r(this)+this.J},function(a){return(a?(this.ha=this.la,this.L):this.oa())+this.J},
            function(){return this.K+this.J},function(){return this.J+this.J},function(){return this.F+(this.F<<1)},function(){return this.G+(this.F<<1)},function(){return this.H+(this.F<<1)},function(){return this.D+(this.F<<1)},function(){this.ha=this.la;return r(this)+(this.F<<1)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.F<<1)},function(){return this.K+(this.F<<1)},function(){return this.J+(this.F<<1)},function(){return this.F+(this.G<<1)},function(){return this.G+(this.G<<1)},function(){return this.H+
            (this.G<<1)},function(){return this.D+(this.G<<1)},function(){this.ha=this.la;return r(this)+(this.G<<1)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.G<<1)},function(){return this.K+(this.G<<1)},function(){return this.J+(this.G<<1)},function(){return this.F+(this.H<<1)},function(){return this.G+(this.H<<1)},function(){return this.H+(this.H<<1)},function(){return this.D+(this.H<<1)},function(){this.ha=this.la;return r(this)+(this.H<<1)},function(a){return(a?(this.ha=this.la,this.L):
            this.oa())+(this.H<<1)},function(){return this.K+(this.H<<1)},function(){return this.J+(this.H<<1)},function(){return this.F+(this.D<<1)},function(){return this.G+(this.D<<1)},function(){return this.H+(this.D<<1)},function(){return this.D+(this.D<<1)},function(){this.ha=this.la;return r(this)+(this.D<<1)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.D<<1)},function(){return this.K+(this.D<<1)},function(){return this.J+(this.D<<1)},function(){return this.F},function(){return this.G},
            function(){return this.H},function(){return this.D},function(){this.ha=this.la;return r(this)},function(a){return a?(this.ha=this.la,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<1)},function(){return this.G+(this.L<<1)},function(){return this.H+(this.L<<1)},function(){return this.D+(this.L<<1)},function(){this.ha=this.la;return r(this)+(this.L<<1)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.L<<1)},function(){return this.K+
            (this.L<<1)},function(){return this.J+(this.L<<1)},function(){return this.F+(this.K<<1)},function(){return this.G+(this.K<<1)},function(){return this.H+(this.K<<1)},function(){return this.D+(this.K<<1)},function(){this.ha=this.la;return r(this)+(this.K<<1)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.K<<1)},function(){return this.K+(this.K<<1)},function(){return this.J+(this.K<<1)},function(){return this.F+(this.J<<1)},function(){return this.G+(this.J<<1)},function(){return this.H+
            (this.J<<1)},function(){return this.D+(this.J<<1)},function(){this.ha=this.la;return r(this)+(this.J<<1)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.J<<1)},function(){return this.K+(this.J<<1)},function(){return this.J+(this.J<<1)},function(){return this.F+(this.F<<2)},function(){return this.G+(this.F<<2)},function(){return this.H+(this.F<<2)},function(){return this.D+(this.F<<2)},function(){this.ha=this.la;return r(this)+(this.F<<2)},function(a){return(a?(this.ha=this.la,this.L):
            this.oa())+(this.F<<2)},function(){return this.K+(this.F<<2)},function(){return this.J+(this.F<<2)},function(){return this.F+(this.G<<2)},function(){return this.G+(this.G<<2)},function(){return this.H+(this.G<<2)},function(){return this.D+(this.G<<2)},function(){this.ha=this.la;return r(this)+(this.G<<2)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.G<<2)},function(){return this.K+(this.G<<2)},function(){return this.J+(this.G<<2)},function(){return this.F+(this.H<<2)},function(){return this.G+
            (this.H<<2)},function(){return this.H+(this.H<<2)},function(){return this.D+(this.H<<2)},function(){this.ha=this.la;return r(this)+(this.H<<2)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.H<<2)},function(){return this.K+(this.H<<2)},function(){return this.J+(this.H<<2)},function(){return this.F+(this.D<<2)},function(){return this.G+(this.D<<2)},function(){return this.H+(this.D<<2)},function(){return this.D+(this.D<<2)},function(){this.ha=this.la;return r(this)+(this.D<<2)},function(a){return(a?
            (this.ha=this.la,this.L):this.oa())+(this.D<<2)},function(){return this.K+(this.D<<2)},function(){return this.J+(this.D<<2)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=this.la;return r(this)},function(a){return a?(this.ha=this.la,this.L):this.oa()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<2)},function(){return this.G+(this.L<<2)},function(){return this.H+(this.L<<2)},function(){return this.D+
            (this.L<<2)},function(){this.ha=this.la;return r(this)+(this.L<<2)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.L<<2)},function(){return this.K+(this.L<<2)},function(){return this.J+(this.L<<2)},function(){return this.F+(this.K<<2)},function(){return this.G+(this.K<<2)},function(){return this.H+(this.K<<2)},function(){return this.D+(this.K<<2)},function(){this.ha=this.la;return r(this)+(this.K<<2)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.K<<2)},function(){return this.K+
            (this.K<<2)},function(){return this.J+(this.K<<2)},function(){return this.F+(this.J<<2)},function(){return this.G+(this.J<<2)},function(){return this.H+(this.J<<2)},function(){return this.D+(this.J<<2)},function(){this.ha=this.la;return r(this)+(this.J<<2)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.J<<2)},function(){return this.K+(this.J<<2)},function(){return this.J+(this.J<<2)},function(){return this.F+(this.F<<3)},function(){return this.G+(this.F<<3)},function(){return this.H+
            (this.F<<3)},function(){return this.D+(this.F<<3)},function(){this.ha=this.la;return r(this)+(this.F<<3)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.F<<3)},function(){return this.K+(this.F<<3)},function(){return this.J+(this.F<<3)},function(){return this.F+(this.G<<3)},function(){return this.G+(this.G<<3)},function(){return this.H+(this.G<<3)},function(){return this.D+(this.G<<3)},function(){this.ha=this.la;return r(this)+(this.G<<3)},function(a){return(a?(this.ha=this.la,this.L):
            this.oa())+(this.G<<3)},function(){return this.K+(this.G<<3)},function(){return this.J+(this.G<<3)},function(){return this.F+(this.H<<3)},function(){return this.G+(this.H<<3)},function(){return this.H+(this.H<<3)},function(){return this.D+(this.H<<3)},function(){this.ha=this.la;return r(this)+(this.H<<3)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.H<<3)},function(){return this.K+(this.H<<3)},function(){return this.J+(this.H<<3)},function(){return this.F+(this.D<<3)},function(){return this.G+
            (this.D<<3)},function(){return this.H+(this.D<<3)},function(){return this.D+(this.D<<3)},function(){this.ha=this.la;return r(this)+(this.D<<3)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.D<<3)},function(){return this.K+(this.D<<3)},function(){return this.J+(this.D<<3)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.ha=this.la;return r(this)},function(a){return a?(this.ha=this.la,this.L):this.oa()},function(){return this.K},
            function(){return this.J},function(){return this.F+(this.L<<3)},function(){return this.G+(this.L<<3)},function(){return this.H+(this.L<<3)},function(){return this.D+(this.L<<3)},function(){this.ha=this.la;return r(this)+(this.L<<3)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.L<<3)},function(){return this.K+(this.L<<3)},function(){return this.J+(this.L<<3)},function(){return this.F+(this.K<<3)},function(){return this.G+(this.K<<3)},function(){return this.H+(this.K<<3)},function(){return this.D+
            (this.K<<3)},function(){this.ha=this.la;return r(this)+(this.K<<3)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.K<<3)},function(){return this.K+(this.K<<3)},function(){return this.J+(this.K<<3)},function(){return this.F+(this.J<<3)},function(){return this.G+(this.J<<3)},function(){return this.H+(this.J<<3)},function(){return this.D+(this.J<<3)},function(){this.ha=this.la;return r(this)+(this.J<<3)},function(a){return(a?(this.ha=this.la,this.L):this.oa())+(this.J<<3)},function(){return this.K+
            (this.J<<3)},function(){return this.J+(this.J<<3)}];
            function Sh(a){Ua.call(this,"ChipSet",a,Sh,32768);this.ka=(this.ka=a.model)&&Th[this.ka]||Uh;this.nc=0;var b=a.sw1;if(b)this.nc=Vh(b,Wh|Xh.dp);else{this.Te=[360,360];(b=a.floppies)&&b.length&&(this.Te=b);if(b=this.Te.length)this.nc|=Yh.Ek,b--,this.nc|=(b&3)<<Yh.oh;if(b=a.monitor||(this.ka<Zh?"mono":"ega"),void 0!==$h[b])this.nc|=$h[b]<<Xh.oh}this.zf=Vh(a.sw2||"11110000",0);this.Nq=this.ka==Uh?16:64;this.Qi=this.Ch=1;this.ka>=Zh&&(this.Qi=this.Ch=2);this.jf=a.scaleTimers||!1;this.Ls=a.rtcDate;this.Vn=
            !1;a.sound&&(this.al=this.Gh=null,window&&(this.al=window.AudioContext||window.webkitAudioContext),this.al&&(this.Gh=new this.al));this.reset(!0);ob(this)}eb(Sh);var Uh=5150,Zh=5170,Th={5150:Uh,5160:5160,5170:Zh,deskpro386:5180},$h={none:0,tv:1,color:2,mono:3,ega:0,vga:0},Yh={Ek:1,ONE:0,St:64,Qt:128,pt:192,nh:192,oh:6},Wh=12,Xh={Rt:16,ht:32,dp:48,nh:48,oh:4};f=Sh.prototype;
            f.Nb=function(a,b,c){switch(b){case "sw1":return this.va[b]=c,ai(this,b,c,this.nc,{0:this.ka==Uh?"Bootable Floppy Drive":"Loop on POST",1:this.ka==Uh?"Reserved":"Coprocessor",2:"Base Memory Size",4:"Monitor Type",6:"Number of Floppy Drives"}),!0;case "sw2":if(this.ka==Uh)return this.va[b]=c,ai(this,b,c,this.zf,{0:"Expansion Memory Size",4:"Reserved"}),!0;break;case "swdesc":return this.va[b]=c,!0}return!1};
            f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.Ja=xb(a,"Keyboard");this.ik=c.T.ge/1193181;oc(b,this,bi);sc(b,this,ci);this.ka<Zh?(oc(b,this,di),sc(b,this,ei)):(oc(b,this,fi),sc(b,this,gi));if(d){var e=this;hi(d,1024,function(){for(var a=0;a<e.ec.length;a++){for(var b=e.ec[a],c="PIC"+a+":",d=0;d<b.Pc.length;d++)c+=" IC"+(d+1)+"="+k(b.Pc[d]);c+=" IMR="+k(b.Wd)+" IRR="+k(b.Xb)+" ISR="+k(b.Tc)+" DELAY="+b.Rg;e.Y.R(c)}});hi(d,2048,function(){for(var a=0;a<e.Pb.length;a++){ii(e,a);var b=
            e.Pb[a],c="TIMER"+a+":",d=0;if(null!=b.ae)for(var w=0;w<=b.ae;w++)d|=b.fb[w]<<8*w;c+=" mode="+b.mode+" bytes="+b.ae+" count="+ga(d);e.Y.R(c)}});hi(d,4096,function(){for(var a="",b=0;64>b;b++){var c=13>=b?ji(e,b):e.ga[b];a&&(a+="\n");a+="CMOS["+k(b)+"]: "+k(c)}e.Y.R(a)})}Ce(c,26,this,this.Mq)};f.lc=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};f.kc=function(a){return a&&this.save?this.save():!0};
            f.reset=function(a){var b;this.Td=this.nc;this.fg=this.zf;ki(this);this.vb=Array(this.Qi);for(b=0;b<this.Qi;b++)li(this,b);this.ec=Array(this.Ch);mi(this,0,32);1<this.Ch&&mi(this,1,160);this.un=this.Tk=null;this.Pb=Array(5180==this.ka?6:3);for(b=0;b<this.Pb.length;b++)ni(this,b);this.zh=this.Uk=this.Uc=this.Ni=null;this.Mi=0;if(this.ka>=Zh){this.lb=16;this.oe=0;this.Vd=16;this.Hi=0;this.pe=160;512<=oi(this)&&(this.pe|=16);3==pi(this)&&(this.pe|=64);5180==this.ka&&(this.pe|=12);this.Ii=3;this.pg=Array(8);
            this.Df=0;a&&(this.ga=Array(64));qi(this,this.Ls);for(a=21;24>=a;a++)this.ga[a]=0;for(a=14;46>a;a++)void 0===this.ga[a]&&(this.ga[a]=0);this.ga[20]=this.Td&(Xh.nh|2|Yh.Ek|Yh.nh);this.ga[16]=ri(this,0)<<4|ri(this,1);si(this)}};
            function qi(a,b){var c=b?new Date(b):new Date;"[object Date]"!==Object.prototype.toString.call(c)||isNaN(c.getTime())?(c=new Date,a.R("CMOS date invalid ("+b+"), using "+c)):b&&a.R("CMOS date: "+c);a.ga[0]=c.getSeconds();a.ga[1]=0;a.ga[2]=c.getMinutes();a.ga[3]=0;a.ga[4]=c.getHours();a.ga[5]=0;a.ga[6]=c.getDay()+1;a.ga[7]=c.getDate();a.ga[8]=c.getMonth()+1;c=c.getFullYear();a.ga[9]=c%100;c/=100;a.ga[50]=c%10|c/10<<4;a.ga[10]=38;a.ga[11]=2;a.ga[12]=0;a.ga[13]=128;a.ei=a.Xg=0;a.yo=a.gk=null}
            function ji(a,b){var c=a.ga[b];if(10>b){var d=!1;4!=b&&5!=b||a.ga[11]&2||(c=12>c?c?c:12:(c-=12)?c+128:140,d=!0);a.ga[11]&4||(d&&128<c&&(c-=48),c=c%10|c/10<<4)}else 10==b&&(a.ga[b]^=128);return c}function ti(a){var b;void 0===b&&(b=a.gk);a.Xg=cd(a.O,a.jf)+b;a.ga[11]&64&&hd(a.O,b)}function si(a){for(var b=0,c=16;46>c;c++)b+=a.ga[c];a.ga[47]=b&255;a.ga[46]=b>>8}
            f.save=function(){var a=new Je(this);a.set(0,[this.nc,this.zf,this.Td,this.fg]);for(var b=[],c=0;c<this.vb;c++){for(var d=this.vb[c],e=d,g=[],l=0;l<e.Ub.length;l++){var p=e.Ub[l];g[l]=[p.ze,p.Ci,p.pc,p.kb,p.fb,p.mode,p.Oi,p.Gs,p.Is]}b[c]=[d.bf,d.Rk,d.vn,d.wb,g]}a.set(1,[b]);b=[];for(c=0;c<this.ec.length;c++)d=this.ec[c],b[c]=[d.Rg,d.Pc,d.De,d.Wd,d.Xb,d.Tc,d.Ef,d.yh];a.set(2,[b]);b=[];for(c=0;c<this.Pb.length;c++)d=this.Pb[c],b[c]=[d.pc,d.Wc,d.fb,d.Lf,d.xn,d.mode,d.wk,d.ff,d.ae,d.de,d.Ph,d.Rf,d.Od];
            a.set(3,[this.Tk,b,this.un]);a.set(4,[this.Ni,this.Uc,this.Uk,this.zh,this.Mi]);this.ka>=Zh&&(a.set(5,[this.lb,this.oe,this.Vd,this.Hi,this.pe,this.Ii]),a.set(6,[this.pg[7],this.pg,this.Df,this.ga,this.ei,this.Xg]));return a.data()};
            f.restore=function(a){var b,c;b=a[0];this.nc=b[0];this.zf=b[1];this.Td=b[2];this.fg=b[3];b=a[1];for(c=0;c<this.Qi;c++)li(this,c,1==b.length?b[0][c]:b);b=a[2];for(c=0;c<this.Ch;c++)mi(this,c,0===c?32:160,b[0][c]);b=a[3];this.Tk=b[0];this.un=b[2];for(c=0;c<this.Pb.length;c++)ni(this,c,b[1][c]);b=a[4];this.Ni=b[0];this.Uc=b[1];this.Uk=b[2];this.zh=b[3];this.Mi=b[4];if(b=a[5])this.lb=b[0],this.oe=b[1],this.Vd=b[2],this.Hi=b[3],this.pe=b[4],this.Ii=b[5];if(b=a[6])this.pg=b[1],this.pg[7]=b[0],this.Df=b[2],
            this.ga=b[3],this.ei=b[4],this.Xg=b[5],qi(this);return!0};var ui=[0,null,null,0,Array(4)];function li(a,b,c){var d=a.vb[b];d||(d={Ub:Array(4)});c=c&&5==c.length?c:ui;d.bf=c[0];d.Rk=c[1];d.vn=c[2];d.wb=c[3];d.Xq=b<<2;for(var e=0;e<d.Ub.length;e++)vi(d,e,c[4][e]);a.vb[b]=d}var wi=[!0,[0,0],[0,0],[0,0],[0,0]];
            function vi(a,b,c){var d=a.Ub[b];d||(d={Ci:[0,0],pc:[0,0],kb:[0,0],fb:[0,0]});c=c&&8==c.length?c:wi;d.ze=c[0];d.Ci[0]=c[1][0];d.Ci[1]=c[1][1];d.pc[0]=c[2][0];d.pc[1]=c[2][1];d.kb[0]=c[3][0];d.kb[1]=c[3][1];d.fb[0]=c[4][0];d.fb[1]=c[4][1];d.mode=c[5];d.Oi=c[6];d.Z=a;d.eo=b;xi(d,c[8],c[9]);a.Ub[b]=d}function xi(a,b,c,d){"string"==typeof b&&(b=gb(b));b&&(a.Xi=null,a.Gs=b.id,a.Is=c,a.Vi=b,a.tl=b[c],a.jk=d)}var yi=[0,Array(4)];
            function mi(a,b,c,d){var e=a.ec[b];e||(e={Pc:[null,null,null,null]});d=d&&8==d.length?d:yi;e.port=c;e.wu=b<<3;e.Rg=d[0];e.Pc[0]=d[1][0];e.Pc[1]=d[1][1];e.Pc[2]=d[1][2];e.Pc[3]=d[1][3];e.De=d[2];e.Wd=d[3];e.Xb=d[4];e.Tc=d[5];e.Ef=d[6];e.yh=d[7];a.ec[b]=e}var zi=[[0,0],[0,0],[0,0],[0,0]];
            function ni(a,b,c){var d=a.Pb[b];d||(d={pc:[0,0],Wc:[0,0],fb:[0,0],Lf:[0,0]});c=c&&13==c.length?c:zi;d.pc[0]=c[0][0];d.pc[1]=c[0][1];d.Wc[0]=c[1][0];d.Wc[1]=c[1][1];d.fb[0]=c[2][0];d.fb[1]=c[2][1];d.Lf[0]=c[3][0];d.Lf[1]=c[3][1];d.xn=c[4];d.mode=c[5];d.wk=c[6];d.ff=c[7];d.ae=c[8];d.de=c[9];d.Ph=c[10];d.Rf=c[11];d.Od=c[12];a.Pb[b]=d}function oi(a,b){return((((b?a.nc:a.Td)&12)>>2)+1)*a.Nq+32*((b?a.zf:a.fg)&15)}function Ai(a,b){var c=b?a.nc:a.Td;return a.ka!=Uh||c&Yh.Ek?((c&Yh.nh)>>Yh.oh)+1:0}
            function ri(a,b){if(b<Ai(a)){if(!a.Te)return 1;if(b<a.Te.length)switch(a.Te[b]){case 160:case 180:case 320:case 360:return 1;case 720:return 3;case 1200:return 2;case 1440:return 4}}return 0}function pi(a,b){return((b?a.nc:a.Td)&Xh.nh)>>Xh.oh}
            function ai(a,b,c,d,e){for(var g="",l=1;8>=l;l++){var p="pcjs-bitCell";l||(p+=" pcjs-bitCellLeft");g+='<div id="'+(b+"-"+l)+'" class="'+p+'" data-value="0">'+l+"</div>\n"}c.innerHTML=g;b=kb(c,"pcjs-bitCell");c=null;for(l=0;l<b.length;l++)null!=e&&null!=e[l]&&(c=e[l]),c&&b[l].setAttribute("title",c),Bi(b[l],d&1<<l?!1:!0),b[l].onclick=function(a,b){return function(){var c="1"!=b.getAttribute("data-value");Bi(b,c);var d=b.getAttribute("id").split("-"),e=1<<+d[1]-1;switch(d[0]){case "sw1":a.nc=a.nc&~e|
            (c?0:e);break;case "sw2":a.zf=a.zf&~e|(c?0:e)}ki(a)}}(a,b[l])}function Bi(a,b){a.setAttribute("data-value",b?"1":"0");a.style.color=b?"#ffffff":"#000000";a.style.backgroundColor=b?"#000000":"#ffffff"}function ki(a){var b=a.va.swdesc,c={0:"Enhanced Color",1:"TV",2:"Color",3:"Monochrome"};if(null!=b){var d;d=""+(oi(a,!0)+"Kb");d+=", "+c[pi(a,!0)]+" Monitor";d+=", "+Ai(a,!0)+" Floppy Drives";if(null!=a.Td&&a.Td!=a.nc||null!=a.fg&&a.fg!=a.zf)d+=" (Reset required)";b.textContent=d}}
            function Ci(a,b,c,d,e){var g=a.vb[b],l=g.Ub[c],p=l.kb[g.wb];a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".ADDR["+g.wb+"]",p,!0);g.wb^=1;b||0!=c||g.wb||(l.kb[0]++,255<l.kb[0]&&(l.kb[0]=0,l.kb[1]++,255<l.kb[1]&&(l.kb[1]=0)));return p}function Di(a,b,c,d,e,g){var l=a.vb[b];a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".ADDR["+l.wb+"]",null,!0);a=l.Ub[c];a.kb[l.wb]=a.Ci[l.wb]=e;l.wb^=1}
            function Ei(a,b,c,d,e){var g=a.vb[b],l=g.Ub[c],p=l.fb[g.wb];a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".COUNT["+g.wb+"]",p,!0);g.wb^=1;b||0!=c||g.wb||(l.fb[0]--,0>l.fb[0]&&(l.fb[0]=255,l.fb[1]--,0>l.fb[1]&&(l.fb[1]=255)));return p}function Fi(a,b,c,d,e,g){var l=a.vb[b];a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".COUNT["+l.wb+"]",null,!0);a=l.Ub[c];a.fb[l.wb]=a.pc[l.wb]=e;l.wb^=1}function Gi(a,b,c,d){var e=a.vb[b],g=e.bf|1;e.bf&=-16;a.qa(768)&&m(a,c,null,d,"DMA"+b+".STATUS",g,!0);return g}
            function Hi(a,b,c,d,e){var g=a.vb[b];a.qa(768)&&m(a,c,d,e,"DMA"+b+".REQ",null,!0);a=d&3;g.bf=g.bf&~(16<<a)|(d&4)<<a+2;g.vn=d}function Ii(a,b,c,d,e){var g=a.vb[b];a.qa(768)&&m(a,c,d,e,"DMA"+b+".MASK",null,!0);b=d&3;c=g.Ub[b];c.ze=!!(d&4);c.ze||Ji(a,g.Xq+b)}function Ki(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA"+b+".MODE",null,!0);a.vb[b].Ub[d&3].mode=d}function Li(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA"+b+".MASTER_CLEAR",null,!0);a=a.vb[b];for(b=0;b<a.Ub.length;b++)vi(a,b)}
            function Mi(a,b,c,d,e){var g=a.vb[b].Ub[c].Oi;a.qa(768)&&m(a,d,null,e,"DMA"+b+".CHANNEL"+c+".PAGE",g,!0);return g}function Ni(a,b,c,d,e,g){a.qa(768)&&m(a,d,e,g,"DMA"+b+".CHANNEL"+c+".PAGE",null,!0);a.vb[b].Ub[c].Oi=e}function Oi(a,b,c,d){var e=a.pg[b];a.qa(768)&&m(a,c,null,d,"DMA.SPARE"+b+".PAGE",e,!0);return e}function Pi(a,b,c,d,e){a.qa(768)&&m(a,c,d,e,"DMA.SPARE"+b+".PAGE",null,!0);a.pg[b]=d}function Qi(a,b,c,d,e){xi(a.vb[b>>2].Ub[b&3],c,d,e)}
            function Ji(a,b,c){b=a.vb[b>>2].Ub[b&3];b.Vi&&b.tl&&b.jk?(c&&(b.Xi=c),b.ze||uf(a,b,!0)):c&&c(!0)}function uf(a,b,c){c&&(b.count=b.fb[1]<<8|b.fb[0],b.type=b.mode&12,b.Xn=b.Ld=!1);for(var d=!1;0<=b.count&&(c=b.Oi<<16|b.kb[1]<<8|b.kb[0],4==b.type?(d=!0,function(c){b.tl.call(b.Vi,b.jk,-1,function(g,l){0>g&&(b.Xn||(b.Xn=!0),g=255);b.ze||a.ma.dd(c,g);(d=l)&&setTimeout(function(){Ri(b)||uf(a,b)},0)})}(c)):8==b.type?(c=a.ma.Qa(c),0>b.tl.call(b.Vi,b.jk,c)&&(b.Ld=!0)):0!=b.type&&(b.Ld=!0)),!d&&!Ri(b););}
            function Ri(a){if(!a.Ld&&0<=--a.count&&(a.mode&32?(a.kb[0]--,0>a.kb[0]&&(a.kb[0]=255,a.kb[1]--,0>a.kb[1]&&(a.kb[1]=255))):(a.kb[0]++,255<a.kb[0]&&(a.kb[0]=0,a.kb[1]++,255<a.kb[1]&&(a.kb[1]=0))),!a.ze))return!1;var b=a.Z;b.bf=b.bf&~(16<<a.eo)|1<<a.eo;a.mode&16||(a.ze=!0,a.Vi=a.jk=null);a.Xi&&(a.Xi(!a.Ld),a.Xi=null);return!0}function Si(a,b,c){var d=0,e=a.ec[b];if(null!=e.yh)switch(e.yh&3){case 2:d=e.Xb;break;case 3:d=e.Tc}a.qa(34048)&&m(a,e.port,null,c,"PIC"+b,d,!0);return d}
            function Ti(a,b,c,d){var e=a.ec[b];a.qa(34048)&&m(a,e.port,c,d,"PIC"+b,null,!0);if(c&16)e.De=0,e.Pc[e.De++]=c,e.Wd=0,e.Ef=7,e.Xb=e.Tc=0,e.yh=10;else if(c&8)c&100&&a.Da("PIC"+b+"("+k(e.port)+"): unsupported OCW3 command: "+k(c)),e.yh=c;else if(d=c&224,d&32){var g,l=0;if(96==(d&96))l=1<<(c&7);else for(g=e.Ef+1;;){g&=7;var p=1<<g;if(e.Tc&p){l=p;break}if(g++==e.Ef)break}e.Tc&l&&(e.Tc&=~l,Ui(a));d&128&&a.Da("PIC"+b+"("+k(e.port)+"): unsupported OCW2 rotate command: "+k(c))}else 192==d?e.Ef=c&7:a.Da("PIC"+
            b+"("+k(e.port)+"): unsupported OCW2 automatic EOI command: "+k(c))}function Vi(a,b,c){var d=a.ec[b],e=d.Wd;a.qa(34048)&&m(a,d.port+1,null,c,"PIC"+b,e,!0);return e}function Wi(a,b,c,d){var e=a.ec[b];a.qa(34048)&&m(a,e.port+1,c,d,"PIC"+b,null,!0);e.De<e.Pc.length?(e.Pc[e.De++]=c,2==e.De&&e.Pc[0]&2&&e.De++,3!=e.De||e.Pc[0]&1||e.De++):(e.Wd=c,d=a.O,d.S|=4,Ui(a,b||253!=c?0:6))}function Xi(a,b,c){var d=a.ec[b>>3];b=1<<(b&7);d.Xb&b||(d.Xb|=b,d.Rg=c||0,Ui(a))}
            function Yi(a,b){var c=a.ec[b>>3],d=1<<(b&7);c.Xb&d&&(c.Xb&=~d,Ui(a))}function Ui(a,b){var c,d=-1;1<a.Ch&&(c=a.ec[1],d=~(c.Tc|c.Wd)&c.Xb);c=a.ec[0];0<=d&&(c.Xb=d?c.Xb|4:c.Xb&-5);var d=~(c.Tc|c.Wd)&c.Xb,e=a.O;e.ja&&(e.Bb=d?e.Bb|1:e.Bb&-2);d&&b&&(c.Rg=b)}function sf(a,b){void 0===b&&(b=0);var c=-1,d=a.ec[b];if(d.Rg)c=-2,d.Rg--;else for(var e=d.Xb&((d.Tc|d.Wd)^255),g=d.Ef+1;;){var g=g&7,l=1<<g;if(e&l){c=b||2!=g?d.Pc[1]+g:sf(a,1);0<=c&&(d.Tc|=l,d.Xb&=~l);break}if(g++==d.Ef)break}return c}
            function Zi(a,b,c,d){var e;e=a.Pb[b];e.ff==e.ae&&$i(a,b);if(e.Ph)return e.Lf[e.ff++];ii(a,b);e=e.fb[e.ff++];a.qa(2304)&&m(a,c,null,d,"TIMER"+b,e,!0);return e}function aj(a,b,c,d,e){a.qa(2304)&&m(a,c,d,e,"TIMER"+b,null,!0);c=a.Pb[b];c.ff==c.ae&&$i(a,b);c.pc[c.ff++]=d;c.ff==c.ae&&(c.Rf&&0!=c.mode&&8!=c.mode||(c.Ph=!1,c.fb[0]=c.Wc[0]=c.pc[0],c.fb[1]=c.Wc[1]=c.pc[1],c.Od=cd(a.O,a.jf),c.Rf=!0,c.de=0!=c.mode,0==b&&(Yi(a,0),d=bj(a,0)*a.ik|0,6==c.mode&&(d>>=1),hd(a.O,d))),2==b&&kd(a))}f=Sh.prototype;
            f.uq=function(a,b){m(this,a,null,b,"PIT1_CTRL",null,2048);return null};f.Xr=function(a,b,c){this.Tk=b;m(this,a,b,c,"PIT1_CTRL",null,2048);a=(b&192)>>6;if(3!=a){c=b&1;var d=b&14;if(b&=48){var e=this.Pb[a];e.wk=b;e.mode=d;e.xn=c;e.pc=[0,0];e.fb=[0,0];e.Lf=[0,0];e.de=!1;e.Ph=!1;e.Rf=!1;$i(this,a);0==a&&Yi(this,0);2==a&&255==this.ec[0].Wd&&77==this.Uc&&(a=this.Pb[0],a.Wc[0]=a.pc[0],a.Wc[1]=a.pc[1],a.Od=cd(this.O,this.jf))}else ii(this,a),b=this.Pb[a],b.Lf[0]=b.fb[0],b.Lf[1]=b.fb[1],b.Ph=!0,$i(this,a)}};
            function bj(a,b){var c=a.Pb[b],d=c.pc[1]<<8|c.pc[0];d||(d=1==c.ae?256:65536);return d}function md(a,b){var c=a.Pb[b],d=c.Wc[1]<<8|c.Wc[0];d||(d=1==c.ae?256:65536);return d}function $i(a,b){var c=a.Pb[b];c.ff=32==c.wk?1:0;c.ae=48==c.wk?2:1}
            function ii(a,b,c){var d=a.Pb[b];if(d.Rf&&(2!=b||a.Uc&1)){var e=cd(a.O,a.jf),g=(e-d.Od)/a.ik|0;0>g&&(d.Od=e,g=0);var l=bj(a,b),p=md(a,b)-g;0==d.mode?(0>=p&&(p=0),p||(d.de=!0,d.Rf=!1,b||Xi(a,0))):4==d.mode?(d.de=1!=p,0>=p&&(p=l+p,0>=p&&(p=l),d.Wc[0]=p&255,d.Wc[1]=p>>8,d.Od=e,!b&&d.de&&Xi(a,0))):6==d.mode&&(p-=g,0>=p&&(d.de=!d.de,p=l+p,0>=p&&(p=l),d.Wc[0]=p&255,d.Wc[1]=p>>8,d.Od=e,!b&&d.de&&Xi(a,0)));d.fb[0]=p&255;d.fb[1]=p>>8;c&&(a.Od=0)}return d}
            function ld(a,b){for(var c=0;c<a.Pb.length;c++)ii(a,c,b);if(a.ka>=Zh){var c=a.O.T.ge,d=cd(a.O,a.jf);null==a.gk&&(a.ei=cd(a.O,a.jf),a.yo=1024,a.gk=Math.floor(a.O.T.ge/a.yo),ti(a));d>=a.Xg&&(a.ga[12]|=64,a.ga[11]&64&&(a.ga[12]|=128,Xi(a,8)),a.Xg=d+a.gk);a.ga[0]==a.ga[1]&&a.ga[2]==a.ga[3]&&a.ga[4]==a.ga[5]&&(a.ga[12]|=32,a.ga[11]&32&&(a.ga[12]|=128,Xi(a,8)));var e=d-a.ei,g=Math.floor(e/c);if(g&&!(a.ga[11]&128)){for(;g--;)if(60<=++a.ga[0]&&(a.ga[0]=0,60<=++a.ga[2]&&(a.ga[2]=0,24<=++a.ga[4]))){a.ga[4]=
            0;a.ga[6]=a.ga[6]%7+1;var l;l=a.ga[9];var p=ua[a.ga[8]-1];28==p&&0===l%4&&(l%100||0===l%400)&&p++;l=p;++a.ga[7]>l&&(a.ga[7]=1,12<++a.ga[8]&&(a.ga[8]=1,a.ga[9]=(a.ga[9]+1)%100))}a.ga[12]|=16;a.ga[11]&16&&(a.ga[12]|=128,Xi(a,8))}a.ei=d-e%c}}f.vq=function(a,b){var c=this.Ni;if(this.zh&16)if(this.Uc&128)c=this.Td;else if(this.Ja){var c=this.Ja,d=0;c.fc.length&&(d=c.fc[0]);c.qa()&&c.ab("scan code "+k(d)+" delivered");c=d}m(this,a,null,b,"PPI_A",c);return c};
            f.Yr=function(a,b,c){m(this,a,b,c,"PPI_A");this.Ni=b};f.wq=function(a,b){var c=this.Uc;m(this,a,null,b,"PPI_B",c);return c};f.Zr=function(a,b,c){m(this,a,b,c,"PPI_B");cj(this,b);this.Ja&&dj(this.Ja,b&128?!1:!0,b&64?!0:!1)};function cj(a,b){var c=!!(b&2),d=!!(a.Uc&2);a.Uc=b;c!=d&&kd(a,c)}f.xq=function(a,b){var c=0,c=this.ka==Uh?this.Uc&4?c|this.fg&15:c|this.fg>>4&1:this.Uc&8?c|this.Td>>4:c|this.Td&15;this.Uc&1&&ii(this,2).de&&(c=this.Uc&2?c|32:c|16);m(this,a,null,b,"PPI_C",c,32896);return c};
            f.$r=function(a,b,c){m(this,a,b,c,"PPI_C");this.Uk=b};f.yq=function(a,b){var c=this.zh;m(this,a,null,b,"PPI_CTRL",c);return c};f.as=function(a,b,c){m(this,a,b,c,"PPI_CTRL");this.zh=b};f.Lp=function(a,b){var c=this.Hi;m(this,a,null,b,"8042_OUTBUFF",c,16384);this.lb&=-258;this.Ja&&ej(this.Ja);return c};
            f.lr=function(a,b,c){m(this,a,b,c,"8042_INBUF.DATA",null,16384);if(this.lb&8)switch(this.oe){case 96:fj(this,b);break;case 209:gj(this,b);break;default:if(fj(this,this.Vd&-17),this.Ja){a=-1;switch(b){case 255:a=250,hj(this.Ja)}ij(this,a)}}this.oe=b;this.lb&=-9};f.Mp=function(a,b){var c=this.Uc&-209|(cd(this.O)&64?16:0);m(this,a,null,b,"8042_RWREG",c,16384);return c};f.mr=function(a,b,c){m(this,a,b,c,"8042_RWREG",null,16384);cj(this,b)};
            f.Np=function(a,b){m(this,a,null,b,"8042_STATUS",this.lb,16384);var c=this.lb&255;this.lb&256&&(this.lb|=1,this.lb&=-257);return c};
            f.kr=function(a,b,c){m(this,a,b,c,"8042_INBUFF.CMD",null,16384);this.oe=b;this.lb|=8;a=0;240<=this.oe&&(a=this.oe^15,this.oe=240);switch(this.oe){case 32:ij(this,this.Vd);break;case 173:fj(this,this.Vd|16);break;case 174:fj(this,this.Vd&-17);this.Ja&&ej(this.Ja);break;case 170:this.Ja&&(a=this.Ja,a.fc=[],a.qa()&&a.ab("scan codes flushed"));fj(this,this.Vd|16);ij(this,85);gj(this,3);break;case 171:ij(this,0);break;case 192:ij(this,this.pe);break;case 208:ij(this,this.Ii);break;case 224:ij(this,this.Vd&
            16?0:1);break;case 240:a&1&&me(this.O)}};function fj(a,b){a.Vd=b;a.lb=a.lb&-5|b&4;a.Ja&&dj(a.Ja,!!(b&8),!(b&16))}function ij(a,b,c){0<=b&&(a.Hi=b,c?a.lb|=1:(a.lb&=-2,a.lb|=256))}function gj(a,b){a.Ii=b;dc(a.ma,!!(b&2));b&1||me(a.O)}function jj(a,b){a.ka<Zh?Xi(a,1,4):a.Vd&16||a.lb&257||(ij(a,b,!0),kj(a.Ja),Xi(a,1,120))}f.aq=function(a,b){m(this,a,null,b,"CMOS.ADDR",this.Df,4096);return this.Df};f.Ar=function(a,b,c){m(this,a,b,c,"CMOS.ADDR",null,4096);this.Df=b;this.Mi=b&128?0:128};
            f.bq=function(a,b){var c=this.Df&63,d=13>=c?ji(this,c):this.ga[c];this.qa(4352)&&m(this,a,null,b,"CMOS.DATA["+k(c)+"]",d,!0);null!=b&&12==c&&(this.ga[c]&=15,d&128&&Yi(this,8),d&64&&this.ga[11]&64&&ti(this));return d};
            f.Br=function(a,b,c){var d=this.Df&63;this.qa(4352)&&m(this,a,b,c,"CMOS.DATA["+k(d)+"]",null,!0);a=b^this.ga[d];if(13>=d){if(c=b,10>d){var e=!1;this.ga[11]&4||(c=10*(c>>4)+(c&15),e=!0);if(4==d||5==d)e&&23<c&&(c+=48),this.ga[11]&2||(12>=c?c=12==c?0:c:(c-=116,c=24==c?12:c))}}else c=b;this.ga[d]=c;11==d&&a&64&&b&64&&ti(this)};f.Wr=function(a,b,c){m(this,a,b,c,"NMI");this.Mi=b};f.Cr=function(a,b,c){m(this,a,b,c,"COPROC.CLEAR")};f.Dr=function(a,b,c){m(this,a,b,c,"COPROC.RESET")};
            f.Mq=function(a){if(this.qa(8192)&&Ee(this.Y,26,a)){var b=this.O.F>>8;Fe(this.O,a,function(a,d){return function(e){d=cd(a.O)-d;var g,l=a.O.H&255,p=a.O.H>>8,v=a.O.H&255,w=a.O.H>>8;if(2==b||3==b)g=" CH(hour)="+ga(p)+" CL(min)="+k(l)+" DH(sec)="+k(w);else if(4==b||5==b)g=" CX(year)="+ga(a.O.G)+" DH(month)="+k(w)+" DL(day)="+k(v);Ge(a.Y,26,e,d,g)}}(this,cd(this.O)))}return!0};function Vh(a,b){if(void 0===a)return b;for(var c=0,d=1,e=0;e<a.length;e++)"0"==a.charAt(e)&&(c|=d),d<<=1;return c}
            function kd(a,b){if(a.Gh)try{void 0!==b?a.Vn=b:b=a.Vn&&a.O&&a.O.fa.qb;var c=Math.round(1193181/bj(a,2));if(20>c||2E4<c)b=!1;b?a.zc?(a.zc.frequency.value=c,a.qa(8388608)&&a.ab("speaker set to "+c+"hz",!0)):(a.zc=a.Gh.createOscillator(),a.zc&&(a.zc.type="number"==typeof a.zc.type?1:"square",a.zc.connect(a.Gh.destination),a.zc.frequency.value=c,"start"in a.zc?a.zc.start(0):a.zc.noteOn(0),a.qa(8388608)&&a.ab("speaker on at  "+c+"hz",!0))):a.zc&&("stop"in a.zc?a.zc.stop(0):a.zc.noteOff(0),a.zc.disconnect(),
            delete a.zc,a.qa(8388608)&&a.ab("speaker off at "+c+"hz",!0))}catch(d){a.Da("AudioContext exception: "+d.message),a.Gh=null}else b&&a.ab("BEEP",8388608)}
            var bi={0:function(a,b){return Ci(this,0,0,a,b)},1:function(a,b){return Ei(this,0,0,a,b)},2:function(a,b){return Ci(this,0,1,a,b)},3:function(a,b){return Ei(this,0,1,a,b)},4:function(a,b){return Ci(this,0,2,a,b)},5:function(a,b){return Ei(this,0,2,a,b)},6:function(a,b){return Ci(this,0,3,a,b)},7:function(a,b){return Ei(this,0,3,a,b)},8:function(a,b){return Gi(this,0,a,b)},32:function(a,b){return Si(this,0,b)},33:function(a,b){return Vi(this,0,b)},64:function(a,b){return Zi(this,0,a,b)},65:function(a,
            b){return Zi(this,1,a,b)},66:function(a,b){return Zi(this,2,a,b)},67:Sh.prototype.uq,129:function(a,b){return Mi(this,0,2,a,b)},130:function(a,b){return Mi(this,0,3,a,b)},131:function(a,b){return Mi(this,0,1,a,b)},135:function(a,b){return Mi(this,0,0,a,b)}},di={96:Sh.prototype.vq,97:Sh.prototype.wq,98:Sh.prototype.xq,99:Sh.prototype.yq},fi={96:Sh.prototype.Lp,97:Sh.prototype.Mp,100:Sh.prototype.Np,112:Sh.prototype.aq,113:Sh.prototype.bq,128:function(a,b){return Oi(this,7,a,b)},132:function(a,b){return Oi(this,
            0,a,b)},133:function(a,b){return Oi(this,1,a,b)},134:function(a,b){return Oi(this,2,a,b)},136:function(a,b){return Oi(this,3,a,b)},137:function(a,b){return Mi(this,1,2,a,b)},138:function(a,b){return Mi(this,1,3,a,b)},139:function(a,b){return Mi(this,1,1,a,b)},140:function(a,b){return Oi(this,4,a,b)},141:function(a,b){return Oi(this,5,a,b)},142:function(a,b){return Oi(this,6,a,b)},143:function(a,b){return Mi(this,1,0,a,b)},160:function(a,b){return Si(this,1,b)},161:function(a,b){return Vi(this,1,b)},
            192:function(a,b){return Ci(this,1,0,a,b)},194:function(a,b){return Ei(this,1,0,a,b)},196:function(a,b){return Ci(this,1,1,a,b)},198:function(a,b){return Ei(this,1,1,a,b)},200:function(a,b){return Ci(this,1,2,a,b)},202:function(a,b){return Ei(this,1,2,a,b)},204:function(a,b){return Ci(this,1,3,a,b)},206:function(a,b){return Ei(this,1,3,a,b)},208:function(a,b){return Gi(this,1,a,b)}},ci={0:function(a,b,c){Di(this,0,0,a,b,c)},1:function(a,b,c){Fi(this,0,0,a,b,c)},2:function(a,b,c){Di(this,0,1,a,b,c)},
            3:function(a,b,c){Fi(this,0,1,a,b,c)},4:function(a,b,c){Di(this,0,2,a,b,c)},5:function(a,b,c){Fi(this,0,2,a,b,c)},6:function(a,b,c){Di(this,0,3,a,b,c)},7:function(a,b,c){Fi(this,0,3,a,b,c)},8:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA0.CMD",null,!0);this.vb[0].Rk=b},9:function(a,b,c){Hi(this,0,a,b,c)},10:function(a,b,c){Ii(this,0,a,b,c)},11:function(a,b,c){Ki(this,0,a,b,c)},12:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA0.RESET_FF",null,!0);this.vb[0].wb=0},13:function(a,b,c){Li(this,0,a,
            b,c)},32:function(a,b,c){Ti(this,0,b,c)},33:function(a,b,c){Wi(this,0,b,c)},64:function(a,b,c){aj(this,0,a,b,c)},65:function(a,b,c){aj(this,1,a,b,c)},66:function(a,b,c){aj(this,2,a,b,c)},67:Sh.prototype.Xr,129:function(a,b,c){Ni(this,0,2,a,b,c)},130:function(a,b,c){Ni(this,0,3,a,b,c)},131:function(a,b,c){Ni(this,0,1,a,b,c)},135:function(a,b,c){Ni(this,0,0,a,b,c)}},ei={96:Sh.prototype.Yr,97:Sh.prototype.Zr,98:Sh.prototype.$r,99:Sh.prototype.as,160:Sh.prototype.Wr},gi={96:Sh.prototype.lr,97:Sh.prototype.mr,
            100:Sh.prototype.kr,112:Sh.prototype.Ar,113:Sh.prototype.Br,128:function(a,b,c){Pi(this,7,a,b,c)},132:function(a,b,c){Pi(this,0,a,b,c)},133:function(a,b,c){Pi(this,1,a,b,c)},134:function(a,b,c){Pi(this,2,a,b,c)},136:function(a,b,c){Pi(this,3,a,b,c)},137:function(a,b,c){Ni(this,1,2,a,b,c)},138:function(a,b,c){Ni(this,1,3,a,b,c)},139:function(a,b,c){Ni(this,1,1,a,b,c)},140:function(a,b,c){Pi(this,4,a,b,c)},141:function(a,b,c){Pi(this,5,a,b,c)},142:function(a,b,c){Pi(this,6,a,b,c)},143:function(a,b,
            c){Ni(this,1,0,a,b,c)},160:function(a,b,c){Ti(this,1,b,c)},161:function(a,b,c){Wi(this,1,b,c)},192:function(a,b,c){Di(this,1,0,a,b,c)},194:function(a,b,c){Fi(this,1,0,a,b,c)},196:function(a,b,c){Di(this,1,1,a,b,c)},198:function(a,b,c){Fi(this,1,1,a,b,c)},200:function(a,b,c){Di(this,1,2,a,b,c)},202:function(a,b,c){Fi(this,1,2,a,b,c)},204:function(a,b,c){Di(this,1,3,a,b,c)},206:function(a,b,c){Fi(this,1,3,a,b,c)},208:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA1.CMD",null,!0);this.vb[1].Rk=b},210:function(a,
            b,c){Hi(this,1,a,b,c)},212:function(a,b,c){Ii(this,1,a,b,c)},214:function(a,b,c){Ki(this,1,a,b,c)},216:function(a,b,c){this.qa(768)&&m(this,a,b,c,"DMA1.RESET_FF",null,!0);this.vb[1].wb=0},218:function(a,b,c){Li(this,1,a,b,c)},240:Sh.prototype.Cr,241:Sh.prototype.Dr};Pa(function(){for(var a=kb(window.document,"pcjs","chipset"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new Sh(d);jb(d,c);ki(d)}});
            function lj(a){Ua.call(this,"ROM",a,lj);this.Qb=null;this.Lk=a.addr;this.jh=a.size;this.vh=a.alias;this.pi=a.file;this.Hs=ha(this.pi);this.lf=a.notify;this.hn=null;if(this.lf&&(a=this.lf.indexOf("["),0<a)){try{this.hn=eval(this.lf.substr(a))}catch(b){}this.lf=this.lf.substr(0,a)}if(this.pi){a=this.pi;var c=ia(this.Hs);"json"!=c&&"hex"!=c&&(a=Aa()+"/api/v1/dump?file="+this.pi+"&format=bytes&decimal=true");za(a,!0,null,this,lj.prototype.gr)}}eb(lj);
            lj.prototype.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;mj(this)};lj.prototype.lc=function(){this.Kk&&(this.Y&&nj(this.Y,this.Lk,this.jh,this.Kk),delete this.Kk);return!0};lj.prototype.kc=function(){return!0};
            lj.prototype.gr=function(a,b,c){if(c)this.Da("Unable to load system ROM (error "+c+")");else{if("["==b.charAt(0)||"{"==b.charAt(0))try{var d=eval("("+b+")"),e=d.bytes,g=d.data;if(e)this.Qb=e;else if(g)for(this.Qb=Array(4*g.length),c=b=0;b<g.length;b++)this.Qb[c++]=g[b]&255,this.Qb[c++]=g[b]>>8&255,this.Qb[c++]=g[b]>>16&255,this.Qb[c++]=g[b]>>24&255;else this.Qb=d;this.Kk=d.symbols;if(!this.Qb.length){Ba("Empty ROM: "+a);return}if(1==this.Qb.length){Ba(this.Qb[0]);return}}catch(l){this.Da("ROM data error: "+
            l.message);return}else for(a=b.replace(/\n/gm," ").replace(/ +$/,"").split(" "),this.Qb=Array(a.length),d=0;d<a.length;d++)this.Qb[d]=fa(a[d],16);mj(this)}};
            function mj(a){if(!pb(a))if(!a.pi)ob(a);else if(a.Qb&&a.ma){if(a.Qb.length!=a.jh)qb(a,"ROM size (0x"+h(a.Qb.length)+") does not match specified size ("+("0x"+h(a.jh))+")");else{var b;b=a.Lk;if(ec(a.ma,b,a.jh,Ac)){for(var c=0;c<a.Qb.length;c++){var d=a.ma,e=b+c;d.na[(e&d.Db)>>>d.Ca].ti(e&d.Ga,a.Qb[c]&255,e)}b=!0}else b=!1;if(b){b=[];"number"==typeof a.vh?b.push(a.vh):null!=a.vh&&a.vh.length&&(b=a.vh);for(c=0;c<b.length;c++){var d=a,e=b[c],g=ic(d.ma,d.Lk,d.jh);hc(d.ma,e,d.jh,g)}a.lf&&((b=gb(a.lf,a.id))?
            (c=a.Qb,d=a.hn,5==b.$a?oj(b,c,d||[12640,8752],8):7==b.$a&&oj(b,c,d||[14221,16269],8),ob(b)):a.Da("Unable to find component: "+a.lf));delete a.Qb}}ob(a)}}Pa(function(){for(var a=kb(window.document,"pcjs","rom"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new lj(d);jb(d,c)}});function pj(a){Ua.call(this,"RAM",a,pj);this.Di=a.addr;this.Le=a.size;this.Ep=a.test;this.Ap=!!this.Le;this.Yi=!1}eb(pj);pj.prototype.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=xb(a,"ChipSet");ob(this)};
            pj.prototype.lc=function(a,b){b||this.reset();return!0};pj.prototype.kc=function(){return!0};
            pj.prototype.reset=function(){if(!this.Di&&!this.Ap&&this.ja){var a=1024*oi(this.ja);this.Le&&a!=this.Le&&(jc(this.ma,this.Di,this.Le),this.Yi=!1);this.Le=a}!this.Yi&&this.Le&&ec(this.ma,this.Di,this.Le,1)&&(this.Yi=!0,this.status(Math.floor(this.Le/1024)+"Kb allocated"),"ramCPQ"==this.Lg&&(this.Z=new qj(this),ec(this.ma,rj,1,4,this.Z)));if(this.Yi){if(this.Ep||lc(this.ma,1138,4660),"ramCPQ"!=this.Lg&&this.ja&&(a=this.ja,a.ga)){var b=1048576>this.Di?21:23,c=a.ga[b]|a.ga[b+1]<<8,c=c+(this.Le>>10);
            a.ga[b]=c&255;a.ga[b+1]=c>>8;si(a)}}else Ba("No RAM allocated")};function qj(a){this.ns=a;this.Zm=sj;this.Xo=tj;this.Dk=uj;this.ph=null}
            var rj=-2134900736,sj=65535,tj=2575,uj=2,vj=[null,0],wj=[function(a){var b=255;2>a?b=a&1?this.Z.Xo>>8:this.Z.Xo&255:4>a&&(b=a&1?this.Z.Dk>>8:this.Z.Dk&255);return b},null,null,function(a,b){var c=this.Z;if(a)2==a&&(c.Dk=c.Dk&-256|b);else if(b!=(c.Zm&255)){var d=c.ns.ma;if(b&1)c.ph&&(hc(d,917504,131072,c.ph),c.ph=null);else{c.ph||(c.ph=ic(d,917504,131072));var e=ic(d,16646144,131072);hc(d,917504,131072,e,b&2?1:Ac)}c.Zm=c.Zm&-256|b}},null,null];qj.prototype.$n=function(){return vj};
            qj.prototype.ul=function(){return wj};Pa(function(){for(var a=kb(window.document,"pcjs","ram"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new pj(d);jb(d,c)}});function xj(a){Ua.call(this,"Keyboard",a,xj,65536);this.Tn=Ia("Mobi");this.Bp=Ia("MSIE");this.ab("mobile keyboard support: "+(this.Tn?"true":"false"));this.Bn=0;this.bj=!0;this.rl=this.ll=!1;this.Vb=[];this.Uq=500;this.Vq=100;this.Tq=50;this.Mn=!1;ob(this)}eb(xj);
            var V={it:1,jt:3,kt:26," ":32,"!":33,'"':34,"#":35,$:36,"%":37,"&":38,"'":39,"(":40,")":41,"*":42,"+":43,",":44,"-":45,".":46,"/":47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,";":59,"<":60,"=":61,">":62,"?":63,"@":64,ft:65,gt:66,dn:67,bp:68,E:69,nt:70,qt:71,en:72,st:73,tt:74,ut:75,vt:76,wt:77,Fk:78,yt:79,zt:80,Bt:81,gn:82,Ft:83,Pt:84,Tt:85,Ut:86,Vt:87,Xt:88,Yt:89,Zt:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,$t:97,au:98,du:99,ku:100,lu:101,mu:102,ou:103,pu:104,qu:105,ru:106,su:107,
            tu:108,uu:109,vu:110,xu:111,yu:112,zu:113,Au:114,Bu:115,Cu:116,Du:117,Eu:118,Fu:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126},yj={};yj[186]=V[";"];yj[187]=V["="];yj[188]=V[","];yj[189]=V["-"];yj[190]=V["."];yj[191]=V["/"];yj[192]=V["`"];yj[219]=V["["];yj[220]=V["\\"];yj[221]=V["]"];yj[222]=V["'"];yj[173]=V["-"];var zj={};zj[V["1"]]=V["!"];zj[V["2"]]=V["@"];zj[V["3"]]=V["#"];zj[V["4"]]=V.$;zj[V["5"]]=V["%"];zj[V["6"]]=V["^"];zj[V["7"]]=V["&"];zj[V["8"]]=V["*"];zj[V["9"]]=V["("];
            zj[V["0"]]=V[")"];zj[186]=V[":"];zj[187]=V["+"];zj[188]=V["<"];zj[189]=V._;zj[190]=V[">"];zj[191]=V["?"];zj[192]=V["~"];zj[219]=V["{"];zj[220]=V["|"];zj[221]=V["}"];zj[222]=V['"'];zj[173]=V._;zj[61]=V["+"];zj[59]=V[":"];
            var Aj={3016:1,1016:2,1017:8,1018:32,1091:128,1093:64,1224:128,1020:512,1144:1024,1145:2048},Bj={TAB:1009,ESC:1027,F1:1112,F2:1113,F3:1114,F4:1115,F5:1116,F6:1117,F7:1118,F8:1119,F9:1120,F10:1121,LEFT:1037,UP:1038,RIGHT:1039,DOWN:1040,CTRL_C:4003,CTRL_BREAK:4008,CTRL_ALT_DEL:4046},Cj={esc:1027,1:V["1"],2:V["2"],3:V["3"],4:V["4"],5:V["5"],6:V["6"],7:V["7"],8:V["8"],9:V["9"],0:V["0"],"-":V["-"],"=":V["="],bs:1008,tab:1009,q:81,w:87,e:69,r:82,t:84,y:89,u:85,i:73,o:79,p:80,"[":V["["],"]":V["]"],enter:13,
            ctrl:1017,a:65,s:83,d:68,f:70,g:71,h:72,j:74,k:75,l:76,";":V[";"],quote:V["'"],"`":V["`"],shift:1016,"\\":V["\\"],z:90,x:88,c:67,v:86,b:66,n:78,m:77,",":V[","],".":V["."],"/":V["/"],"right-shift":3016,prtsc:1044,alt:1018,space:V[" "],"caps-lock":1020,f1:1112,f2:1113,f3:1114,f4:1115,f5:1116,f6:1117,f7:1118,f8:1119,f9:1120,f10:1121,"num-lock":1144,"scroll-lock":1145,"num-home":1036,"num-up":1038,"num-pgup":1033,"num-sub":1109,"num-left":1037,"num-center":1101,"num-right":1039,"num-add":1107,"num-end":1035,
            "num-down":1040,"num-pgdn":1034,"num-ins":1045,"num-del":1046},Dj={"caps-lock":512,"num-lock":1024,"scroll-lock":2048},W={1027:1};W[V["1"]]=2;W[V["!"]]=10754;W[V["2"]]=3;W[V["@"]]=10755;W[V["3"]]=4;W[V["#"]]=10756;W[V["4"]]=5;W[V.$]=10757;W[V["5"]]=6;W[V["%"]]=10758;W[V["6"]]=7;W[V["^"]]=10759;W[V["7"]]=8;W[V["&"]]=10760;W[V["8"]]=9;W[V["*"]]=10761;W[V["9"]]=10;W[V["("]]=10762;W[V["0"]]=11;W[V[")"]]=10763;W[V["-"]]=12;W[V._]=10764;W[V["="]]=13;W[V["+"]]=10765;W[1008]=14;W[1009]=15;W[113]=16;
            W[81]=10768;W[119]=17;W[87]=10769;W[101]=18;W[69]=10770;W[114]=19;W[82]=10771;W[116]=20;W[84]=10772;W[121]=21;W[89]=10773;W[117]=22;W[85]=10774;W[105]=23;W[73]=10775;W[111]=24;W[79]=10776;W[112]=25;W[80]=10777;W[V["["]]=26;W[V["{"]]=10778;W[V["]"]]=27;W[V["}"]]=10779;W[13]=28;W[1017]=29;W[97]=30;W[65]=10782;W[115]=31;W[83]=10783;W[100]=32;W[68]=10784;W[102]=33;W[70]=10785;W[103]=34;W[71]=10786;W[104]=35;W[72]=10787;W[106]=36;W[74]=10788;W[107]=37;W[75]=10789;W[108]=38;W[76]=10790;W[V[";"]]=39;
            W[V[":"]]=10791;W[V["'"]]=40;W[V['"']]=10792;W[V["`"]]=41;W[V["~"]]=10793;W[1016]=42;W[V["\\"]]=43;W[V["|"]]=10795;W[122]=44;W[90]=10796;W[120]=45;W[88]=10797;W[99]=46;W[67]=10798;W[118]=47;W[86]=10799;W[98]=48;W[66]=10800;W[110]=49;W[78]=10801;W[109]=50;W[77]=10802;W[V[","]]=51;W[V["<"]]=10803;W[V["."]]=52;W[V[">"]]=10804;W[V["/"]]=53;W[V["?"]]=10805;W[3016]=54;W[1044]=55;W[1018]=56;W[V[" "]]=57;W[1020]=58;W[1112]=59;W[1113]=60;W[1114]=61;W[1115]=62;W[1116]=63;W[1117]=64;W[1118]=65;W[1119]=66;
            W[1120]=67;W[1121]=68;W[1144]=69;W[1145]=70;W[1036]=71;W[1038]=72;W[1033]=73;W[1109]=74;W[1037]=75;W[1101]=76;W[1039]=77;W[1107]=78;W[1035]=79;W[1040]=80;W[1034]=81;W[1045]=82;W[1046]=83;W[1122]=87;W[1123]=88;W[1091]=91;W[1093]=93;W[1224]=91;W[4003]=7470;W[4008]=7494;W[4046]=3677523;f=xj.prototype;
            f.Nb=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.va[e])switch(b){case "kbd":return c.onkeydown=function(a){return Ej(d,a,!0)},c.onkeypress=function(a){a=a||window.event;a=a.which||a.keyCode;if(d.Mn){var b=d.Vb.length?d.Vb[0].yf:0;b&&(65<=b&&90>=b||97<=b&&122>=b)&&(65<=a&&90>=a||97<=a&&122>=a)&&b!=a&&(d.rl=!0,a=b)}(b=!W[a]||!!(d.hc&128))||Fj(d,a,!0);return b},c.onkeyup=function(a){return Ej(d,a,!1)},!0;case "caps-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.ed();Fj(d,1020,!0)},
            !0;case "num-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.ed();Fj(d,1144,!0)},!0;case "scroll-lock":return this.va[e]=c,c.onclick=function(){d.O&&d.O.ed();Fj(d,1145,!0)},!0;default:var g=b.toUpperCase().replace(/-/g,"_");if(void 0!==Bj[g]&&"button"==a)return this.va[e]=c,c.onclick=function(a,b,c){return function(){a.O&&a.O.ed();Mj(a,c,!0);Fj(a,c,!0)}}(this,g,Bj[g]),!0;if(void 0!==Cj[b])return this.Bn++,this.va[e]=c,a=function(a,b,c){return function(){Fj(a,c)}}(this,b,Cj[b]),b=function(a,
            b,c){return function(){Nj(a,c)}}(this,b,Cj[b]),"ontouchstart"in window?(c.ontouchstart=a,c.ontouchend=b):(c.onmousedown=a,c.onmouseup=c.onmouseout=b),!0}return!1};function Oj(a,b,c){if(a.Bn){for(var d in zj)if(b==zj[d]){b=+d;(d=yj[d])&&(b=d);break}for(var e in Cj)if((d=Cj[e]==b)||(d=b,97<=d&&122>=d&&(d-=32),d=Cj[e]==d),d){(a=a.va["key-"+e])&&void 0!==c&&(a.style.color=c?"#ffffff":"#000000",a.style.backgroundColor=c?"#000000":"#ffffff");break}}}
            f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=xb(a,"ChipSet")};function hj(a,b){a.ab("keyboard reset",65792);a.fc=[170];a.Mh=!0;b&&a.ja&&jj(a.ja,a.fc[0])}function dj(a,b,c){a.kl!==c&&(a.kl=a.pl=c)&&(a.Mh=!0);a.aj!==b&&(a.aj=b)&&!a.pl&&kj(a,!0);a.aj&&a.pl&&(hj(a,!0),a.pl=!1)}function ej(a){var b=0;a.fc.length&&a.Mh&&(b=a.fc[0],a.ja&&jj(a.ja,b));a.qa()&&a.ab("scan code "+k(b)+" available")}
            function kj(a,b){0<a.fc.length&&(a.fc.shift(),(a.Mh=b)&&(a.fc.length&&a.ja?jj(a.ja,a.fc[0]):b=!1),a.qa()&&a.ab("scan codes shifted, notify "+(b?"true":"false")))}f.lc=function(a,b){return!b&&(this.reset(),a&&this.restore&&!this.restore(a))?!1:!0};f.kc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.mf();this.hc=this.Yd=0;this.fc=[];this.Mh=!0};f.save=function(){var a=new Je(this);a.set(0,this.Ym());return a.data()};f.restore=function(a){return this.mf(a[0])};
            f.mf=function(a){var b=0;void 0===a&&(a=[]);this.kl=this.Mh=a[b++];this.aj=a[b];return!0};f.Ym=function(){var a=0,b=[];b[a++]=this.kl;b[a]=this.aj;return b};
            function Mj(a,b,c,d){if(W[b]){var e=Math.floor(b/1E3)&2;if(b=Aj[b]||0){!e||b&85||(b>>=1);if(b&3584){if(!1===d)return!0;d=null}null==d?d=!((c?a.Yd:a.hc)&b):d||b&255&&(b=255);if(c){a.Yd&=~b;d&&(a.Yd|=b);c=b;var g,l;for(l in Dj)d="led-"+l,e=Dj[l],c&&c!=e||!(g=a.va[d])||(g.style.backgroundColor=a.Yd&e?"#00ff00":"#000000")}else a.hc&=~b,d&&(a.hc|=b);return!0}}return!1}
            function Fj(a,b,c){if(W[b]&&a.O&&a.O.fa.qb){Aj[b]&&a.Vb.length&&0<a.Vb[0].ie&&(a.Vb[0].ie=0);for(var d,e=0;e<a.Vb.length;e++)if(d=a.Vb[e],d.yf==b){if(!c||0<=d.ie){e=-1;break}0<e&&(0<a.Vb[0].ie&&(a.Vb[0].ie=0),a.Vb.splice(e,1));break}0>e||(e==a.Vb.length&&(d={},d.yf=b,d.hc=a.hc,Oj(a,b,!0),e++),0<e&&a.Vb.splice(0,0,d),d.Oh=!0,d.ie=c?-1:Aj[b]?0:1,Pj(a,d))}}
            function Nj(a,b,c){if(!W[b]||!(c||a.O&&a.O.fa.qb))return!1;for(var d=!1,e=0;e<a.Vb.length;e++){var g=a.Vb[e];if(g.yf==b||g.yf==zj[b]){a.Vb.splice(e,1);g.Vo&&clearTimeout(g.Vo);g.Oh&&!c&&Qj(a,g.yf,!1);Oj(a,b,!1);d=!0;break}}!a.Vb.length&&a.rl&&(Mj(a,1020),a.rl=!1);return d}
            function Pj(a,b){if(a.O&&a.O.fa.qb){if(Qj(a,b.yf,b.Oh),b.ie){var c;if(0>b.ie){if(!b.Oh){Nj(a,b.yf);return}b.Oh=!1;c=a.Tq}else c=1==b.ie++?a.Uq:a.Vq;b.Vo=setTimeout(function(a){return function(){Pj(a,b)}}(a),c)}}else Nj(a,b.yf,!0)}function Rj(a,b,c){var d=b;if(65<=b&&90>=b)!(a.hc&515)==c&&(d=b+32);else if(97<=b&&122>=b)!!(a.hc&515)==c&&(d=b-32);else if(!!(a.hc&3)==c){if(a=zj[b])d=a}else if(a=yj[b])d=a;return d}f.kk=function(a){this.bj=a;a||(this.hc&=-256)};
            function Ej(a,b,c){var d=!0,e=!1,g=!1,l=b.keyCode,p=Rj(a,l,!0);a.ll&&p==V["`"]&&(l=p=27);if(W[l+1E3])if(p+=1E3,2==b.location&&(p+=2E3),Mj(a,p,!1,c)){if(20==l||144==l||145==l)a.Bp||(c=e=!0);if(!(c||91!=l&&93!=l))for(var v=0;v<a.Vb.length;v++){var w=a.Vb[v];w.Oh=!1;0<w.ie&&(w.ie=0)}}else 8==l&&8==(a.hc&40)&&(p=4008),d=!1;else if(W[p]&&a.hc&60&&(d=!1),!a.Mn&&d&&c||a.hc&192)g=!0;d||b.preventDefault();g||a.Tn&&d||(c?Fj(a,p,e):Nj(a,p)||(b=Rj(a,l,!1),b!=p&&Nj(a,b)));return d}
            function Qj(a,b,c){Mj(a,b,!0,c);var d=W[b]||W[b+1E3];if(void 0!==d){14==d&&40==(a.hc&40)&&(d=83);var e=[],g=d&255;e.push(g|(c?0:128));for(b=65<=b&&90>=b||97<=b&&122>=b;d>>>=8;){var l=0,p=d&255;224==g||225==g?e.push(g|(c?0:128)):(42==p?a.Yd&3||a.Yd&512&&b||(l=p):29==p?a.Yd&12||(l=p):56==p?a.Yd&48||(l=p):e.push(g|(c?0:128)),l&&(c?e.unshift(l):e.push(l|128)))}for(c=0;c<e.length;c++)d=a,g=e[c],d.fc&&(20>d.fc.length?(d.qa()&&d.ab("scan code "+k(g)+" buffered"),d.fc.push(g),1==d.fc.length&&d.ja&&jj(d.ja,
            g)):(20==d.fc.length&&d.fc.push(255),d.ab("scan code buffer overflow")))}}Pa(function(){for(var a=kb(window.document,"pcjs","keyboard"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new xj(d);jb(d,c)}});
            function Y(a,b,c,d,e){Ua.call(this,"Video",a,Y,262144);this.ka=a.model;this.$a=Sj[this.ka]||Tj;this.Zd=a.memory||0;this.Ro=a.switches;this.Pd=a.mode;if(void 0===this.Pd||void 0===Uj[this.Pd])this.Pd=Vj;this.oj=a.charCols;this.Km=a.charRows;if(void 0===this.oj||void 0===this.Km)this.oj=Uj[this.Pd][0],this.Km=Uj[this.Pd][1];this.be=a.screenWidth;this.ue=a.screenHeight;this.Dp=a.scale;this.zp=12<=Math.round(this.be/this.oj);this.Fp=a.touchScreen;this.Jd=b;this.md=c;this.Za=(this.Ms=d)||b||null;this.of=
            null;this.yp=a.autoLock;this.Ya=this.dc=0;this.Ue=[];this.ne=Array(16);this.bj=!1;var g=this;this.Qn=Ia("Gecko/");b=["","moz","webkit","ms"];if(this.Gc=e)if(this.Gc.xg=e.requestFullscreen||e.msRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,this.Gc.xg){for(e=0;e<b.length;e++)if(c=b[e]+"fullscreenchange","on"+c in document){document.addEventListener(c,function(){Wj(g,document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?
            !0:!1)},!1);break}for(e=0;e<b.length;e++)if(c=b[e]+"fullscreenerror","on"+c in document){document.addEventListener(c,function(){Wj(g,null)},!1);break}}this.Za&&(this.Za.onfocus=function(){return g.kk(!0)},this.Za.onblur=function(){return g.kk(!1)},this.Za.Tf=this.Za.requestPointerLock||this.Za.mozRequestPointerLock||this.Za.webkitRequestPointerLock,this.Za.Wo=this.Za.exitPointerLock||this.Za.mozExitPointerLock||this.Za.webkitExitPointerLock,this.Za.Tf&&(e=function(){g.hi(document.pointerLockElement===
            g.Za||document.mozPointerLockElement===g.Za||document.webkitPointerLockElement===g.Za)},"onpointerlockchange"in document?document.addEventListener("pointerlockchange",e,!1):"onmozpointerlockchange"in document?document.addEventListener("mozpointerlockchange",e,!1):"onwebkitpointerlockchange"in document&&document.addEventListener("webkitpointerlockchange",e,!1)));if(a=a.fontROM)"json"!=ia(a)&&(a=Aa()+"/api/v1/dump?file="+a+"&format=bytes"),za(a,!0,null,this,this.hr)}eb(Y);
            var Tj=1,Sj={mda:1,cga:3,ega:5,vga:7},Vj=7,Xj={2:{tj:15700,sj:208,lk:85,mk:96},3:{tj:18432,sj:364,lk:85,mk:96},4:{tj:21850,sj:364,lk:85,mk:96},7:{tj:16700,sj:480,lk:85,mk:83}},Yj={6:[1,3,!0],7:[2,3,!0],8:[6,3,!0],9:[4,3,!0],10:[3,1,!0],11:[3,2,!0],0:[1,3,!1],1:[2,3,!1],2:[6,3,!1],3:[4,3,!1],4:[3,1,!1],5:[3,2,!1]},Uj=[,[40,25,1,0,3],,[80,25,1,0,3],[320,200,8,192],,[640,200,16,192]];Uj[Vj]=[80,25,1,0,1];Uj[13]=[320,200,16];Uj[14]=[640,200,16];Uj[15]=[640,350,16];Uj[16]=[640,350,16];
            Uj[17]=[640,480,16];Uj[18]=[640,480,16];Uj[19]=[320,200,16];Uj[0]=Uj[1];Uj[2]=Uj[3];Uj[5]=Uj[4];var Zj=Array(5);Zj[0]=[0,0,0,255];Zj[1]=[127,192,127,255];Zj[2]=[127,192,127,255];Zj[3]=[127,255,127,255];Zj[4]=[127,255,127,255];var ak=[0,1,2,2,2,2,2,2,0,3,4,4,4,4,4,4],bk=Array(16);bk[0]=[0,0,0,255];bk[1]=[0,0,170,255];bk[2]=[0,170,0,255];bk[3]=[0,170,170,255];bk[4]=[170,0,0,255];bk[5]=[170,0,170,255];bk[6]=[170,85,0,255];bk[7]=[170,170,170,255];bk[8]=[85,85,85,255];bk[9]=[85,85,255,255];
            bk[10]=[85,255,85,255];bk[11]=[85,255,255,255];bk[12]=[255,85,85,255];bk[13]=[255,85,255,255];bk[14]=[255,255,85,255];bk[15]=[255,255,255,255];var ck=[2,4,6],dk=[3,5,7],ek=[0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63],fk=[0,255,65280,65535,16711680,16711935,16776960,16777215,-16777216,-16776961,-16711936,-16711681,-65536,-65281,-256,-1],gk=[0];gk[128]=1;gk[32768]=2;gk[32896]=3;gk[8388608]=4;gk[8388736]=5;gk[8421376]=6;gk[8421504]=7;gk[-2147483648]=8;gk[-2147483520]=9;gk[-2147450880]=10;
            gk[-2147450752]=11;gk[-2139095040]=12;gk[-2139094912]=13;gk[-2139062272]=14;gk[-2139062144]=15;
            function hk(a,b,c,d){if(void 0!==b&&(!c||c.length)){this.video=a;var e=ik[b],g=a.Qd||e[5];if(!c||6>c.length)c=[!1,0,null,null,0,Array(5>b?jk:kk)];this.Y=a.Y;this.type=e[0];this.port=e[1];this.$a=b;this.Ya=e[2];this.dc=e[3];this.Zd=d||e[4];65536<=this.Zd&&720896<=this.Ya&&(this.dc=Math.min(this.Zd>>2,32768));this.Yc=c[0];this.cd=c[1];this.$g=c[2];this.wa=c[3];this.uc=c[4]&255;this.ok=c[4]>>8&255;this.Ib=c[5];this.zl=jk;this.Fi=lk;if(5<=b){this.zl=kk;this.Fi=mk;b=c[6];void 0===b&&(b=[!1,0,Array(20),
            0,3==g?0:1,0,0,Array(5),0,0,0,Array(9),0,[this.Ya,this.dc,this.Zd],Array(this.Zd>>2),5144,0,-1,0,-1,0,-1,0,0,0,0,1,255,0,0,0,Array(256)]);this.ce=b[0];this.Ie=b[1];this.He=b[2];this.Ok=nk;this.vk=b[3];this.dh=b[4];this.mi=b[5];this.Ke=b[6];this.fh=b[7];this.Qk=ok;this.Jo=b[8];this.Ko=b[9];this.Je=b[10];this.Zf=b[11];this.Pk=pk;this.yb=b[12];d=b[13];"number"==typeof d&&(d=[this.Ya,this.dc,d]);this.Ya=d[0];this.dc=d[1];d=this.Zd>>2;if((this.Ud=b[14])&&this.Ud.length<d){for(var e=this.Ud,l=0,p=Array(d),
            v=0;v<e.length-1;){for(var w=e[v++],F=e[v++];w--;)p[l]=F,l+=2;l==d&&(l=1)}this.Ud=p}(d=b[15])&&(d=d&8?d&-9:qk[d&65280]|qk[d&255]);this.Bk(d);this.Jm=b[16];this.tb=b[17];this.he=b[18];this.Cb=b[19];this.hk=b[20];this.sf=b[21];this.Wf=b[22];this.Al=b[23];this.Bl=b[24];this.fi=b[25];7==this.$a&&(this.Sm=b[26],this.Pm=b[27],this.vd=b[28],this.vc=b[29],this.rk=b[30],this.li=b[31])}g=Xj[g]||Xj[3];this.Cl=a.O.T.ge/g.tj|0;this.Yq=this.Cl*g.lk/100|0;this.so=this.Cl*g.sj|0;this.$q=this.so*g.mk/100|0;this.uo=
            c[7]||0}}
            var jk=18,kk=25,lk="HORZ_TOTAL HORZ_DISP HORZ_SYNC_POS HORZ_SYNC_WIDTH VERT_TOTAL VERT_TOTAL_ADJ VERT_DISP VERT_SYNC_POS INTERLACE_POS MAX_SCAN_LINE CURSOR_START CURSOR_END START_ADDR_HI START_ADDR_LO CURSOR_ADDR_HI CURSOR_ADDR_LO LIGHT_PEN_HI LIGHT_PEN_LO".split(" "),mk="HORZ_TOTAL HORZ_DISP_END HORZ_BLANK_START HORZ_BLANK_END HORZ_RETRACE_START HORZ_RETRACE_END VERT_TOTAL OVERFLOW PRESET_ROW_SCAN MAX_SCAN_LINE CURSOR_START CURSOR_END START_ADDR_HI START_ADDR_LO CURSOR_ADDR_HI CURSOR_ADDR_LO VERT_RETRACE_START VERT_RETRACE_END VERT_DISP_END OFFSET UNDERLINE VERT_BLANK_START VERT_BLANK_END MODE_CTRL LINE_COMPARE".split(" "),nk=
            "PAL00 PAL01 PAL02 PAL03 PAL04 PAL05 PAL06 PAL07 PAL08 PAL09 PAL0A PAL0B PAL0C PAL0D PAL0E PAL0F MODE OVERSCAN PLANES HORZPAN".split(" "),ok=["RESET","CLOCKING","MAPMASK","CHARMAP","MEMMODE"],pk="SRESET ESRESET COLORCMP DATAROT READMAP MODE MISC COLORDC BITMASK".split(" "),qk=[,,1024,5120];qk[16]=1280;qk[512]=0;qk[1024]=32;qk[1536]=96;qk[2560]=160;qk[3584]=224;qk[768]=16;qk[4096]=1;qk[8192]=2;qk[24576]=98;qk[40960]=162;qk[57344]=226;var rk=[];
            rk[1024]=function(a){a+=this.offset;return(this.Z.yb=this.ea[a])>>this.Z.Jm&255};rk[5120]=function(a){a+=this.offset;var b=this.Z.yb=this.ea[a&-2];return(a&1?b>>8:b)&255};rk[1280]=function(a){a+=this.offset;a=this.Z.yb=this.ea[a];for(var b=this.Z.Bl,c=this.Z.Al&b,d=0,e=128;e;)(a&b)==c&&(d|=e),c>>>=1,b>>>=1,e>>=1;return d};rk[0]=function(a,b){var c=a+this.offset,d;d=this.ea[c]&~this.Z.tb|(b|b<<8|b<<16|b<<24)&this.Z.tb;d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};
            rk[32]=function(a,b){var c=a+this.offset;b=b>>this.Z.he|b<<8-this.Z.he&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.sf|this.Z.Wf;d=d&this.Z.tb|this.ea[c]&~this.Z.tb;d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};rk[96]=function(a,b){var c=a+this.offset;b=b>>this.Z.he|b<<8-this.Z.he&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.sf|this.Z.Wf;d&=this.Z.yb;d=d&this.Z.tb|this.ea[c]&~this.Z.tb;d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};
            rk[160]=function(a,b){var c=a+this.offset;b=b>>this.Z.he|b<<8-this.Z.he&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.sf|this.Z.Wf;d|=this.Z.yb;d=d&this.Z.tb|this.ea[c]&~this.Z.tb;d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};rk[224]=function(a,b){var c=a+this.offset;b=b>>this.Z.he|b<<8-this.Z.he&255;var d;d=(b|b<<8|b<<16|b<<24)&this.Z.sf|this.Z.Wf;d^=this.Z.yb;d=d&this.Z.tb|this.ea[c]&~this.Z.tb;d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};
            rk[16]=function(a,b){a+=this.offset;var c,d=a&-2;c=this.Z.tb&(d==a?16711935:-16711936);c=(b|b<<8|b<<16|b<<24)&c|this.ea[d]&~c;c=c&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[d]!=c&&(this.ea[d]=c,this.Ta=!0)};rk[1]=function(a){a+=this.offset;var b=this.ea[a]&~this.Z.tb|this.Z.yb&this.Z.tb;this.ea[a]!=b&&(this.ea[a]=b,this.Ta=!0)};rk[17]=function(a){a+=this.offset;var b=a&-2;a=this.Z.tb&(b==a?16711935:-16711936);a=this.ea[b]&~a|this.Z.yb&a;this.ea[b]!=a&&(this.ea[b]=a,this.Ta=!0)};
            rk[2]=function(a,b){var c=a+this.offset,d=fk[b&15],d=d&this.Z.tb|this.ea[c]&~this.Z.tb,d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};rk[98]=function(a,b){var c=a+this.offset,d=fk[b&15],d=d&this.Z.yb,d=d&this.Z.tb|this.ea[c]&~this.Z.tb,d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};
            rk[162]=function(a,b){var c=a+this.offset,d=fk[b&15],d=d|this.Z.yb,d=d&this.Z.tb|this.ea[c]&~this.Z.tb,d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};rk[226]=function(a,b){var c=a+this.offset,d=fk[b&15],d=d^this.Z.yb,d=d&this.Z.tb|this.ea[c]&~this.Z.tb,d=d&this.Z.Cb|this.Z.yb&~this.Z.Cb;this.ea[c]!=d&&(this.ea[c]=d,this.Ta=!0)};
            function sk(a){var b=[];if(void 0!==a.$a){b[0]=a.Yc;b[1]=a.cd;b[2]=a.$g;b[3]=a.wa;b[4]=a.uc|a.ok<<8;b[5]=a.Ib;if(5<=a.$a){var c=[];c[0]=a.ce;c[1]=a.Ie;c[2]=a.He;c[3]=a.vk;c[4]=a.dh;c[5]=a.mi;c[6]=a.Ke;c[7]=a.fh;c[8]=a.Jo;c[9]=a.Ko;c[10]=a.Je;c[11]=a.Zf;c[12]=a.yb;c[13]=[a.Ya,a.dc,a.Zd];var d;a:if(d=a.Ud){var e=0,g=[];if(void 0!==d[0])for(var l=0;2>l;l++)for(var p=l;p<d.length;){for(var v=d[p],w=p+2;w<d.length&&d[w]===v;)w+=2;g[e++]=w-p>>1;g[e++]=v;p=w}if(g.length<d.length){d=g;break a}}c[14]=d;c[15]=
            a.lj|8;c[16]=a.Jm;c[17]=a.tb;c[18]=a.he;c[19]=a.Cb;c[20]=a.hk;c[21]=a.sf;c[22]=a.Wf;c[23]=a.Al;c[24]=a.Bl;c[25]=a.fi;7==a.$a&&(c[26]=a.Sm,c[27]=a.Pm,c[28]=a.vd,c[29]=a.vc,c[30]=a.rk,c[31]=a.li);b[6]=c}b[7]=a.uo}return b}function tk(a,b,c,d,e){if(d){var g,l="";for(g=0;g<e.length;g++)l&&(l+="\n"),l+=b+"["+k(g)+"]: "+ma(e[g],19)+k(d[g])+(g===c?"*":"");a.Y.R(l)}else a.Y.R(b+": "+k(c))}hk.prototype.$n=function(a){return[this.Ud,a-this.Ya]};hk.prototype.ul=function(){return this.Ei};
            hk.prototype.Bk=function(a){if(null!=a&&a!=this.lj){var b=a&65280,c=rk[b];c||b&4096&&(c=rk[4096]);var b=a&247,d=rk[b];d||b&16&&(d=rk[16]);this.Ei||(this.Ei=Array(6));this.Ei[0]=c;this.Ei[3]=d;this.lj=a}};var ik=[];ik[Tj]=["MDA",948,720896,4096,0,3];ik[3]=["CGA",980,753664,16384,0,2];ik[5]=["EGA",980,753664,16384,65536,4];ik[7]=["VGA",980,753664,16384,262144,7];f=Y.prototype;
            f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;3!=Sj[this.ka]&&(oc(b,this,uk),sc(b,this,vk));Sj[this.ka]!=Tj&&(oc(b,this,wk),sc(b,this,xk));5<=this.$a&&(oc(b,this,yk),sc(b,this,zk));7==this.$a&&(oc(b,this,Ak),sc(b,this,Bk));if(d){var e=this;hi(d,262144,function(a){if(e.Va)if(a){var b=e.Va;if(b.Ud){a=fa(a);a=void 0!==a?a-b.Ya:b.ms||0;0>a&&(a=0);for(var c="",d=0;8>d;d++){for(var g=h(b.Ya+a)+":",K=0;8>K&&a<b.Ud.length;K++)var J=b.Ud[a++],g=g+(" "+h(J));c&&(c+="\n");c+=g}c&&b.Y.R(c);b.ms=a}else b.Y.R("no buffer")}else e.Y.R("BIOSMODE: "+
            k(e.Fe)),b=e.Va,tk(b,"CRTC",b.uc,b.Ib,b.Fi),5<=b.$a&&(tk(b," GRC",b.Je,b.Zf,b.Pk),tk(b," SEQ",b.Ke,b.fh,b.Qk),tk(b," ATC",b.Ie,b.He,b.Ok),b.Y.R("   ATCDATA: "+b.ce),tk(b,"      FEAT",b.mi),tk(b,"      MISC",b.dh),tk(b,"   STATUS0",b.vk)),tk(b,"   STATUS1",b.wa),b.$a!=Tj&&3!=b.$a||tk(b,"   MODEREG",b.cd),3==b.$a&&tk(b,"     COLOR",b.$g),5<=b.$a&&(b.Y.R("   LATCHES: 0x"+h(b.yb)),b.Y.R("    ACCESS: "+ga(b.lj)),b.Y.R("Use 'dump video [addr]' to dump video memory"));else e.Y.R("no active video card")})}if((this.Ja=
            xb(a,"Keyboard"))&&this.Jd){for(var g in this.va)0<g.indexOf("lock")&&this.Ja.Nb("led",g,this.va[g]);this.Ja.Nb(this.Ms?"textarea":"canvas","kbd",this.Za)}this.Ji=9;(this.ja=xb(a,"ChipSet"))&&this.Ro&&5==this.$a&&(this.Ji=Vh(this.Ro,this.Ji));this.Ja&&this.Fp&&Ck(this)};
            f.Nb=function(a,b,c){var d=this;if(!this.va[b])switch(this.va[b]=c,b){case "fullScreen":return this.Gc&&this.Gc.xg?c.onclick=function(){d.xg()}:c.parentNode.removeChild(c),!0;case "lockPointer":return this.Js=c.textContent,this.Za&&this.Za.Tf?c.onclick=function(){d.Tf(!0)}:c.parentNode.removeChild(c),!0;case "refresh":return c.onclick=function(){ed(d,!0)},!0}return!1};f.ed=function(){this.Za&&this.Za.focus()};
            f.xg=function(){var a=!1;if(this.Gc){if(this.Gc.xg){a="100%";if(screen&&screen.width&&screen.height){var b=screen.width/screen.height,c=this.be/this.ue;b>c&&(a=Math.round(c/b*100)+"%")}this.Qn?(this.Jd.style.width=a,this.Jd.style.width=a,this.Jd.style.display="block",this.Jd.style.margin="auto"):(this.Gc.style.width=a,this.Gc.style.height="auto");this.Gc.style.backgroundColor="black";this.Gc.xg();a=!0}this.ed()}return a};
            function Wj(a,b){!b&&a.Gc&&(a.Qn?a.Jd.style.width=a.Jd.style.height="":a.Gc.style.width=a.Gc.style.height="");a.ab("notifyFullScreen("+b+")",!0);a.Ja&&(a.Ja.ll=b)}f.Tf=function(a){var b=!1;this.Za&&(a?this.Za.Tf&&(this.Za.Tf(),this.of.hi(!0),b=!0):this.Za.Wo&&(this.Za.Wo(),this.of.hi(!1),b=!0),this.ed());return b};f.hi=function(a){this.of&&(this.of.hi(a),this.Ja&&(this.Ja.ll=a));var b=this.va.lockPointer;b&&(b.textContent=a?"Press Esc to Unlock Pointer":this.Js)};
            function Ck(a){var b=a.Za;b&&!a.Nh&&(b.addEventListener("touchstart",function(b){Dk(a,b)},!1),b.addEventListener("touchmove",function(b){Dk(a,b)},!0),b.addEventListener("touchend",function(){},!1),a.Nh=!0)}f.kk=function(a){this.bj=a;this.Ja&&this.Ja.kk(a)};
            function Dk(a,b){a.bj&&b.preventDefault();var c=0,d=0,e=a.Jd;do isNaN(e.offsetLeft)||(c+=e.offsetLeft,d+=e.offsetTop);while(e=e.offsetParent);var g=a.be/a.Jd.offsetWidth,e=a.ue/a.Jd.offsetHeight,l,p;b.targetTouches?(l=b.targetTouches[0].pageX,p=b.targetTouches[0].pageY):(l=b.pageX,p=b.pageY);c=(l-c)*g/(a.be/3)|0;d=(p-d)*e/(a.ue/3)|0;1!=d?d?Fj(a.Ja,1040,!0):Fj(a.Ja,1038,!0):1!=c&&(c?Fj(a.Ja,1039,!0):Fj(a.Ja,1037,!0))}
            f.lc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};f.kc=function(a){return a&&this.save?this.save():!0};
            f.reset=function(){var a=!0,b=0;this.ja&&(b=pi(this.ja));this.ka||(this.$a=3==b?Tj:3);this.Pd=3;switch(this.$a){case 7:b=7;break;case 5:var c=Yj[this.Ji];c&&(b=c[0]);b||(b=4);break;case Tj:b=3;this.Pd=Vj;break;default:b=2}this.Qd!==b&&(this.Qd=b,a=!0);this.Va=null;this.Kd=this.Yk=new hk(this,Tj);this.ic=this.Si=new hk(this,3);5>this.$a?this.W=new hk:(this.W=new hk(this,this.$a,null,this.Zd),Ek(this));Fk(this);this.Fe=null;this.Hf=this.pd=-1;this.Gf=0;Gk(this,this.Pd);if(this.Va.Ya&&a){a=this.Va.Ya+
            this.Zk;for(b=this.Va.Ya;b<a;b+=2){var d=65536*Math.random()|0;4==this.Qd||7==this.Qd?(c=b>>1&255,d=d>>8&-129,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?7:112)|8&d>>8);lc(this.ma,b,c|d<<8)}ed(this,!0)}};function Ek(a){a.W.dh&1?(a.Kd=a.Yk,a.ic=a.W):(a.Kd=a.W,a.ic=a.Si)}f.save=function(){var a=new Je(this);a.set(0,sk(this.Yk));a.set(1,sk(this.Si));a.set(2,[this.Qd,this.Pd,this.Fe]);a.set(3,sk(this.W));return a.data()};
            f.restore=function(a){var b=a[2];this.Qd=b[0];this.Pd=b[1];this.Fe=b[2];this.Va=null;this.Kd=this.Yk=new hk(this,Tj,a[0]);this.ic=this.Si=new hk(this,3,a[1]);this.W=new hk(this,this.$a,a[3],this.Zd);this.W.Yc&&Ek(this);Fk(this);if(!Hk(this))return!1;Ik(this);return!0};
            f.hr=function(a,b,c){if(c)this.Da("Unable to load font ROM image (error "+c+")");else{try{var d=eval("("+b+")");if(!d.length){Ba("Empty font ROM image: "+a);return}if(1==d.length){Ba(d[0]);return}if(8192==d.length)oj(this,d,[6144,0]);else{this.Da("Unrecognized font data length ("+d.length+")");return}}catch(e){this.Da("Font ROM data error: "+e.message);return}(this.md||this.Y)&&ob(this)}};
            function Jk(a,b){if(1==b)return a.ne[0]=bk[0],a.ne[1]=bk[7],a.ne;if(2==b){var c=a.Va.$g;if(a.Va===a.W){var d=a.W.He[0],c=d&7;d&16&&(c|=8);18!=a.W.He[1]&&(c|=32)}a.ne[0]=bk[c&15];c=c&32?dk:ck;for(d=0;d<c.length;d++)a.ne[d+1]=bk[c[d]];return a.ne}if(a.ic===a.Si)return bk;c=null!=a.W.He[15]?a.W.He:ek;for(d=0;d<a.ne.length;d++){var e=c[d]||0;a.ne[d]=[(e&4?170:0)|(e&32?85:0),(e&2?170:0)|(e&16?85:0),(e&1?170:0)|(e&8?85:0),255]}return a.ne}function oj(a,b,c,d){a.Bi=b;a.Jk=c;a.Mf=d}
            function Fk(a){var b=!1;if(window&&a.Bi){var c=Jk(a),d,e=a.Mf?a.Mf:8;Kk(a,3,a.Jk[0],0,e,8,a.Bi,c)&&(b=!0);d=a.Mf?0:2048;e=a.Mf?a.Mf:9;Kk(a,1,a.Jk[1],d,e,14,a.Bi,Zj,ak)&&(b=!0);a.Mf&&Kk(a,a.$a,a.Jk[1],0,a.Mf,14,a.Bi,c)&&(b=!0)}return b}function Kk(a,b,c,d,e,g,l,p,v){var w=!1;null!=c&&(Lk(a,b,c,d,e,g,l,p,v)&&(w=!0),a.zp&&Lk(a,b<<1,c,d,e,g,l,p,v)&&(w=!0));return w}
            function Lk(a,b,c,d,e,g,l,p,v){var w=!1,F=b&1?0:1,K=a.Ue[b];K||(K={Hc:e<<F,Ic:g<<F,mg:Array(p.length),mn:p.slice(),qh:v,Hk:Array(p.length)});for(v=0;v<p.length;v++){var J=p[v],I=K.mg[v]?K.mn[v]:[];if(J[0]!==I[0]||J[1]!==I[1]||J[2]!==I[2]){var w=K,I=v,T=F,Z=c,S=d,X=e,xa=g,qa=l,Sa=[0,0,0,0],Fb=window.document.createElement("canvas");Fb.width=w.Hc<<4;Fb.height=w.Ic<<4;for(var Va=Fb.getContext("2d"),ca=void 0,ta=void 0,da=void 0,sb=8>xa||!S?xa:8,Gb=Va.createImageData(w.Hc,w.Ic),ca=0;256>ca;ca++){for(da=
            0;da<xa;da++)for(var Za=w.qh&&I&1&&da>=xa-2,$a=qa[da<sb?Z+ca*sb+da:S+ca*sb+da-sb],Ha=0;Ha<=T;Ha++)for(ta=0;ta<X;ta++){var Ad=ta<<T,bd=(da<<T)+Ha,Kc=Za||$a&128>>(8<=ta&&192<=ca&&223>=ca?7:ta)?J:Sa;Mk(Gb,Ad,bd,Kc);T&&Mk(Gb,Ad+1,bd,Kc)}Va.putImageData(Gb,(ca&15)*w.Hc,(ca>>4)*w.Ic)}w.mg[I]="#"+h(J[0],2)+h(J[1],2)+h(J[2],2);w.mn[I]=J;w.Hk[I]=Fb;w=!0}}a.Ue[b]=K;return w}function Nk(a){0<a.Gf||0<=a.pd?0>a.Hf&&(a.Hf=0):a.Hf=-1}
            function Ik(a){if(a.ac){for(var b=10;15>=b;b++)if(null==a.Va.Ib[b])return;var c=a.Va.Ib[10],b=c&31,d=a.Va.Ib[11]&31,e=a.Va.Ib[9]&31,g=!1;a.Va===a.W&&(g=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!g||b>e)Ok(a);else{c=a.Va.Ib[15]+((a.Va.Ib[14]&63)<<8);a.pd!=c&&(Ok(a),a.pd=c);d=d-b+1;if(a.ap!=b||a.In!=d)a.ap=b,a.In=d;a.gf=e+1;Nk(a)}}}
            function Ok(a){if(0<=a.pd){if(void 0!==a.Nc){var b=a.Nc[a.pd];if(b&131072){var b=b&-131073,c=a.pd%a.sb,d=a.pd/a.sb|0;a.ac&&a.Ue[a.ac]&&(a.wg&&Pk(a,c,d,b,a.wg),Pk(a,c,d,b));a.Nc[a.pd]=b}}a.pd=-1}}
            function Qk(a){var b;a=a.Va;var c=a.Zf[5];if(null!=c){b=1024;var d=0,e=a.Zf[3]&31;switch(c&3){case 0:if(e){d=32;switch(e&24){case 8:d=96;break;case 16:d=160;break;case 24:d=224}a.he=e&7}break;case 1:d=1;break;case 2:switch(e&24){default:d=2;break;case 8:d=98;break;case 16:d=162;break;case 24:d=226}}c&8&&(b=1280);a=a.fh[4];null==a||a&4||(b|=4096,d|=16);b|=d}return b}f.Sd=function(a){var b=this.Va;b&&null!=a&&a!=b.lj&&(b.Bk(a),this.ma.Bk(b.Ya,b.dc,b.ul()))};
            function Hk(a,b){var c,d=a.Fe,e=a.Va;if(e)if(e.$a==Tj)d=Vj;else if(5<=e.$a){var d=null,g=e.Zd>>2,l=32768<g?32768:g,p=e.Zf[6];if(null!=p){switch(p&12){case 0:e.Ya=655360;e.dc=g;d=255;break;case 4:e.Ya=655360;e.dc=g;d=3==a.Qd?15:16;break;case 8:e.Ya=720896;e.dc=l;d=Vj;break;case 12:e.Ya=753664,e.dc=l,d=3==a.Qd?2:3}c=e.fh[1]&8;g=e.Ib[6];g|=e.Ib[7]&1?256:0;7==e.$a&&(g|=e.Ib[7]&32?512:0);255!=d&&(p&1?753664==e.Ya?d=c?7-d:6:500>g?350>g&&(d=c?13:14):d=3==a.Qd?17:18:c&&(d-=2));c=Qk(a)}}else e.cd&8&&(e.cd&
            2?(d=e.cd&16?6:5,e.cd&4||--d):(d=e.cd&1?3:1,e.cd&4&&--d));else a.Fe=null,null==d&&(d=a.Pd);if(!Gk(a,d,b))return!1;a.Sd(c);return!0}
            function Gk(a,b,c){if(null!=b&&(b!=a.Fe||c)){a.gp=0;a.Fe=b;b=a.Va||(b==Vj?a.Kd:a.ic);if(b!=a.Va||b.Ya!=a.Ya||b.dc!=a.dc){Ok(a);if(a.Ya){if(!jc(a.ma,a.Ya,a.dc))return!1;a.Va&&(a.Va.Yc=!1)}a.Va=b;b.Yc=!0;a.Ya=b.Ya;a.dc=b.dc;if(!ec(a.ma,b.Ya,b.dc,3,b===a.W?b:null))return!1}a.ac=0;a.sb=a.oj;a.Dc=a.Km;a.pj=a.sb;a.nj=Uj[Vj][2];a.Eh=0;if(b=Uj[a.Fe])a.sb=b[0],a.Dc=b[1],a.nj=b[2],a.Eh=b[3]||0,a.ac=b[4],4!=a.Qd&&7!=a.Qd||a.Va!==a.W||3!=a.ac||(7==a.W.Ib[9]?a.Dc=43:a.ac=a.$a);a.po=a.sb*a.Dc|0;a.mj=a.po/a.nj|
            0;a.Zk=(a.mj<<1)+a.Eh|0;a.Dn=a.Eh?a.Zk+a.Eh>>1:0;13<=a.Fe&&(a.mj<<=1);if(a.Ue.length){a.te=a.be/a.sb|0;a.ve=a.ue/a.Dc|0;if(a.ac){b=a.Ue[a.ac];var d=a.Ue[a.ac<<1];a.Dp&&80==a.sb?d&&a.te>=3*d.Hc>>2&&(a.ac<<=1,b=d):(d&&a.te>=d.Hc&&(a.ac<<=1,b=d),b&&(a.te=b.Hc,a.ve=b.Ic));a.Jh=a.Kh=0;b&&(a.Jh=a.sb*b.Hc,a.Kh=a.Dc*b.Ic)}else a.te=a.ve=1,a.Jh=a.sb,a.Kh=a.Dc;a.ij=a.md.createImageData(a.Jh,a.Kh);a.tg=window.document.createElement("canvas");a.tg.width=a.Jh;a.tg.height=a.Kh;a.wg=a.tg.getContext("2d");a.bn=a.cn=
            0;a.dl=a.be;a.el=a.ue;b=a.be-a.sb*a.te;d=a.ue-a.Dc*a.ve;0<b&&(a.bn=b>>1,a.dl-=b);0<d&&(a.cn=d>>1,a.el-=d);if(b||d)a.md.fillStyle=a.Jd.style.backgroundColor,a.md.fillRect(0,0,a.be,a.ue)}!1!==c?ed(a,!0):Rk(a,!0)}return!0}function Mk(a,b,c,d){b=(b+c*a.width)*d.length;a.data[b]=d[0];a.data[b+1]=d[1];a.data[b+2]=d[2];a.data[b+3]=d[3]}function Rk(a,b){a.Gf=-1;a.Qf=!1;if(b){var c=a.mj;if(void 0===a.Nc||a.Nc.length!=c){a.Nc=Array(c);for(var d=0;d<c;d++)a.Nc[d]=-1}}}
            function Pk(a,b,c,d,e){var g=d&255,l=d>>8;d=l&15;var p=a.Ue[a.ac];p.qh&&(d=p.qh[d]);var v=l>>4&15;p.qh&&(v=p.qh[v]);e?(b*=p.Hc,c*=p.Ic,e.fillStyle=p.mg[v],e.fillRect(b,c,p.Hc,p.Ic)):(b=b*a.te+a.bn,c=c*a.ve+a.cn,a.md.fillStyle=p.mg[v],a.md.fillRect(b,c,a.te,a.ve));l&256&&(v=(g&15)*p.Hc,g=(g>>4)*p.Ic,e?e.drawImage(p.Hk[d],v,g,p.Hc,p.Ic,b,c,p.Hc,p.Ic):a.md.drawImage(p.Hk[d],v,g,p.Hc,p.Ic,b,c,a.te,a.ve));l&512&&(g=a.ap,l=a.In,e?(a.gf&&a.gf!==p.Ic&&(g=g*p.Ic/a.gf|0,l=l*p.Ic/a.gf|0),e.fillStyle=p.mg[d],
            e.fillRect(b,c+g,p.Hc,l)):(a.gf&&a.gf!==a.ve&&(g=g*a.ve/a.gf|0,l=l*a.ve/a.gf|0),a.md.fillStyle=p.mg[d],a.md.fillRect(b,c+g,a.te,l)))}
            function ed(a,b){if(a.fa.jc){var c=!1,d=a.Va;d&&(d!==a.W?d.cd&8&&(c=!0):d.Ie&32&&(c=!0));if(c||b){if(b)Rk(a,!0);else if(void 0===a.Nc)return;var e=!1;!(b||++a.gp&15)&&0<=a.Hf&&(a.Hf++,e=!0);var g=0,l=a.po,c=d.Ya,p=c+d.dc;Sk(a,d)&8&&(d.fi=(d.Ib[12]<<8)+d.Ib[13]|0);var v=d.fi;a.ac&&(v<<=1);c+=v;v=a.Zk;5<=a.$a&&d.Ib[19]&&(a.pj=d.Ib[19]<<(a.ac?1:4),v=((a.pj*(a.Dc-1)+a.sb)/a.nj<<1)+a.Eh|0);c+v>p&&(v=p-c,0>v&&(v=0));p=c+v;if(d=!b){for(var d=a.ma,w=!0,F=c>>>d.Ca;0<v&&F<d.na.length;)d.na[F].Ta&&(d.na[F].Ta=
            w=!1,d.na[F].On=!0),v-=d.nb,F++;d=w}if(d){if(!e)return;if(!a.Gf){if(0>a.pd)return;g=a.pd;l=g+1}}if(a.ac){if(a.Ue[a.ac]){e=0;d=a.Gf=0;v=1048575;a.Va.cd&32&&(d=32768,v&=~d,a.Hf&2||(v&=-65537));for(c+=g<<1;c<p&&g<l;)w=kc(a.ma,c),w|=65536,w&d&&(a.Gf++,w&=v),g==a.pd&&(w|=a.Hf&1?131072:0),a.Qf&&w===a.Nc[g]||(Pk(a,g%a.sb,g/a.sb|0,w,a.wg),a.Nc[g]=w,e++),c+=2,g++;a.Qf=!0;e&&a.wg&&a.md.drawImage(a.tg,0,0,a.Jh,a.Kh,a.bn,a.cn,a.dl,a.el);Nk(a)}}else if(a.Dn){for(var l=p,K,g=c,p=a.Gf=0,e=a.nj,d=16==e?65536:196608,
            v=16==e?1:2,w=Jk(a,v),J=F=0,I=a.sb,T=0,Z=a.Dc,S=0;g<l;){K=kc(a.ma,g);if(a.Qf&&K===a.Nc[p])F+=e;else{a.Nc[p]=K;K=K>>8|(K&255)<<8;var X=d,xa=16;F<I&&(I=F);for(var qa=0;qa<e;qa++){var Sa=(K&(X>>=v))>>(xa-=v);Mk(a.ij,F++,J,w[Sa])}F>T&&(T=F);J<Z&&(Z=J);J>=S&&(S=J+1)}g+=2;p++;if(F>=a.sb){F=0;J+=2;if(J>a.Dc)break;J==a.Dc&&(J=1,g=c+a.Dn)}}a.Qf=!0;I<a.sb&&(a.wg.putImageData(a.ij,0,0,I,Z,T-I,S-Z),a.md.drawImage(a.tg,0,0,a.sb,a.Dc,0,0,a.be,a.ue))}else{l=p;g=a.Gf=0;p=Jk(a);e=a.Va.Ud;v=d=0;w=a.sb;F=0;J=a.Dc;I=
            0;T=a.Va.He[19]&15;for(Z=a.pj>a.sb?a.pj-a.sb-T>>3:0;c<l;){S=c++-a.Ya;S=e[S];X=8;T?d?(K=a.sb-d,X>K&&(X=K)):(S<<=T,X-=T,a.Qf=!1):(a.Qf&&S===a.Nc[g]?(d+=X,X=0):a.Nc[g]=S,g++);if(X){d<w&&(w=d);for(K=0;K<X;K++)xa=gk[S&-2139062144]||0,Mk(a.ij,d++,v,p[xa]),S<<=1;d>F&&(F=d);v<J&&(J=v);v>=I&&(I=v+1)}if(d>=a.sb){d=0;if(++v>a.Dc)break;c+=Z}}T||(a.Qf=!0);w<a.sb&&(a.wg.putImageData(a.ij,0,0,w,J,F-w,I-J),a.md.drawImage(a.tg,0,0,a.sb,a.Dc,0,0,a.be,a.ue))}}}}
            function Sk(a,b){var c=0,d=cd(a.O)-b.uo;0>d&&(d=0);d%b.Cl>b.Yq&&(c|=1);d%b.so>b.$q&&(c|=9);return c}f.qq=function(a,b){return Tk(this,this.Kd,a,b)};f.Tr=function(a,b,c){var d=this.Kd;d.ok=d.uc;d.uc=b&31;m(this,a,b,c,"CRTC.INDX")};f.pq=function(a,b){return Uk(this,this.Kd,a,b)};f.Sr=function(a,b,c){Vk(this,this.Kd,a,b,c)};f.rq=function(a,b){return Wk(this,this.Kd,b)};f.Ur=function(a,b,c){a=this.Kd;m(this,a.port+4,b,c,"MODE");a.cd=b;Hk(this,!1)};f.sq=function(a,b){return Xk(this,this.Kd,b)};
            f.Co=function(a,b,c){this.W.mi=this.W.mi&-4|b&3;m(this,a,b,c,"FEAT")};f.ho=function(a,b){var c=this.W.ce?this.W.He[this.W.Ie&31]:this.W.Ie;b&&!this.qa()||m(this,960,null,b,"ATC."+(this.W.ce?this.W.Ok[this.W.Ie&31]:"INDX"),c);this.W.ce=!this.W.ce;return c};
            f.Bo=function(a,b,c){var d=this.W.Ie&32;if(this.W.ce){var e=this.W.Ie&31;if(16<=e||!d)c&&!this.qa()||m(this,a,b,c,"ATC."+this.W.Ok[e]),this.W.He[e]=b;this.W.ce=!1}else this.W.Ie=b,m(this,a,b,c,"ATC.INDX"),this.W.ce=!0,b&32&&!d&&Fk(this)&&ed(this,!0),this.W.fi=(this.W.Ib[12]<<8)+this.W.Ib[13]|0};
            f.Cq=function(a,b){var c=0;if(5==this.$a)c=3-((this.W.dh&12)>>2),c=(this.Ji&1<<c)<<4-c;else{var d=this.W.li[0];45!=(d&63)&&2880!=(d&4032)&&184320!=(d&258048)&&(c|=16)}c|=this.W.vk&-17;this.W.vk=c;m(this,962,null,b,"STATUS0",c);return c};f.Vr=function(a,b,c){this.W.dh=b;Ek(this);m(this,962,b,c,"MISC")};f.Dq=function(a,b){var c=this.W.Sm;m(this,963,null,b,"VGA_ENABLE",c);return c};f.fs=function(a,b,c){this.W.Sm=b;m(this,963,b,c,"VGA_ENABLE")};
            f.Bq=function(a,b){var c=this.W.Ke;m(this,964,null,b,"SEQ.INDX",c);return c};f.ds=function(a,b,c){this.W.Ke=b;m(this,964,b,c,"SEQ.INDX")};f.Aq=function(a,b){var c=this.W.fh[this.W.Ke];b&&!this.qa()||m(this,965,null,b,"SEQ"+this.W.Qk[this.W.Ke],c);return c};f.cs=function(a,b,c){c&&!this.qa()||m(this,965,b,c,"SEQ."+this.W.Qk[this.W.Ke]);this.W.fh[this.W.Ke]=b;switch(this.W.Ke){case 2:this.W.tb=fk[b&15];break;case 4:this.Sd(Qk(this))}};
            f.dq=function(a,b){var c=this.W.Pm;b&&!this.qa()||m(this,966,null,b,"DAC.MASK",c);return c};f.Fr=function(a,b,c){c&&!this.qa()||m(this,966,b,c,"DAC.MASK");this.W.Pm=b};f.eq=function(a,b){var c=this.W.rk;b&&!this.qa()||m(this,967,null,b,"DAC.STATE",c);return c};f.Gr=function(a,b,c){c&&!this.qa()||m(this,967,b,c,"DAC.READ");this.W.vd=b;this.W.rk=3;this.W.vc=0};f.Hr=function(a,b,c){c&&!this.qa()||m(this,968,b,c,"DAC.WRITE");this.W.vd=b;this.W.rk=0;this.W.vc=0};
            f.cq=function(a,b){var c=this.W.li[this.W.vd]>>this.W.vc&63;b&&!this.qa()||m(this,969,null,b,"DAC.DATA["+k(this.W.vd)+"]["+k(this.W.vc)+"]",c);this.W.vc+=6;12<this.W.vc&&(this.W.vc=0,this.W.vd=this.W.vd+1&255);return c};f.Er=function(a,b,c){a=this.W.li[this.W.vd];c&&!this.qa()||m(this,969,b,c,"DAC.DATA["+k(this.W.vd)+"]["+k(this.W.vc)+"]");this.W.li[this.W.vd]=a&~(63<<this.W.vc)|(b&63)<<this.W.vc;this.W.vc+=6;12<this.W.vc&&(this.W.vc=0,this.W.vd=this.W.vd+1&255)};
            f.Eq=function(a,b){var c=this.W.mi;m(this,970,null,b,"FEAT",c);return c};f.Or=function(a,b,c){this.W.Ko=b;m(this,970,b,c,"GRC2")};f.Fq=function(a,b){var c=this.W.dh;m(this,972,null,b,"MISC",c);return c};f.Nr=function(a,b,c){this.W.Jo=b;m(this,972,b,c,"GRC1")};f.jq=function(a,b){var c=this.W.Je;m(this,974,null,b,"GRC.INDX",c);return c};f.Mr=function(a,b,c){this.W.Je=b;m(this,974,b,c,"GRC.INDX")};
            f.iq=function(a,b){var c=this.W.Zf[this.W.Je];b&&!this.qa()||m(this,975,null,b,"GRC."+this.W.Pk[this.W.Je],c);return c};
            f.Lr=function(a,b,c){c&&!this.qa()||m(this,975,b,c,"GRC."+this.W.Pk[this.W.Je]);this.W.Zf[this.W.Je]=b;switch(this.W.Je){case 0:this.W.hk=fk[b&15];this.W.Wf=this.W.hk&~this.W.sf;break;case 1:this.W.sf=~fk[b&15];this.W.Wf=this.W.hk&~this.W.sf;break;case 2:this.W.Al=fk[b&15]&-2139062144;break;case 3:case 5:this.Sd(Qk(this));break;case 4:this.W.Jm=(b&3)<<3;break;case 6:Hk(this,!1);break;case 7:this.W.Bl=fk[b&15]&-2139062144;break;case 8:this.W.Cb=b|b<<8|b<<16|b<<24}};
            f.Yp=function(a,b){return Tk(this,this.ic,a,b)};f.yr=function(a,b,c){var d=this.ic;d.ok=d.uc;d.uc=b&31;m(this,a,b,c,"CRTC.INDX")};f.Xp=function(a,b){return Uk(this,this.ic,a,b)};f.xr=function(a,b,c){Vk(this,this.ic,a,b,c)};f.Zp=function(a,b){return Wk(this,this.ic,b)};f.zr=function(a,b,c){a=this.ic;m(this,a.port+4,b,c,"MODE");a.cd=b;Hk(this,!1)};f.Wp=function(a,b){var c=this.ic.$g;b&&!this.qa()||m(this,a,null,b,this.ic.type+".COLOR",c);return c};
            f.wr=function(a,b,c){c&&!this.qa()||m(this,a,b,c,this.ic.type+".COLOR");this.ic.$g!==b&&(this.ic.$g=b,Rk(this))};f.$p=function(a,b){return Xk(this,this.ic,b)};function Tk(a,b,c,d){var e;b.Yc&&(e=b.uc);m(a,c,null,d,"CRTC.INDX",e);return e}function Uk(a,b,c,d){var e;b.Yc&&b.uc<b.zl&&(e=b.Ib[b.uc]);d&&!a.qa()||m(a,c,null,d,"CRTC."+b.Fi[b.uc],e);return e}
            function Vk(a,b,c,d,e){b.uc<b.zl&&(e&&!a.qa()||m(a,c,d,e,"CRTC."+b.Fi[b.uc]),b.Ib[b.uc]=d,(12==b.uc||13==b.uc)&&Sk(a,b)&1&&(b.fi=(b.Ib[12]<<8)+b.Ib[13]|0),9==b.uc&&8!=b.ok&&Hk(a,!0),Ik(a))}function Wk(a,b,c){var d=b.cd;m(a,b.port+4,null,c,"MODE",d);return d}function Xk(a,b,c){var d=Sk(a,b);b===a.W?(d|=b.wa&48^48,b.ce=!1):d=(b.wa^=9)|240;b.wa=d;m(a,b.port+6,null,c,b===a.W?"STATUS1":"STATUS",d);return d}
            var uk={948:Y.prototype.qq,949:Y.prototype.pq,952:Y.prototype.rq,954:Y.prototype.sq},vk={948:Y.prototype.Tr,949:Y.prototype.Sr,952:Y.prototype.Ur},wk={980:Y.prototype.Yp,981:Y.prototype.Xp,984:Y.prototype.Zp,985:Y.prototype.Wp,986:Y.prototype.$p},xk={980:Y.prototype.yr,981:Y.prototype.xr,984:Y.prototype.zr,985:Y.prototype.wr},yk={960:Y.prototype.ho,961:Y.prototype.ho,962:Y.prototype.Cq,964:Y.prototype.Bq,965:Y.prototype.Aq,974:Y.prototype.jq,975:Y.prototype.iq},zk={954:Y.prototype.Co,960:Y.prototype.Bo,
            961:Y.prototype.Bo,962:Y.prototype.Vr,964:Y.prototype.ds,965:Y.prototype.cs,970:Y.prototype.Or,972:Y.prototype.Nr,974:Y.prototype.Mr,975:Y.prototype.Lr,986:Y.prototype.Co},Ak={963:Y.prototype.Dq,966:Y.prototype.dq,967:Y.prototype.eq,969:Y.prototype.cq,970:Y.prototype.Eq,972:Y.prototype.Fq},Bk={963:Y.prototype.fs,966:Y.prototype.Fr,967:Y.prototype.Gr,968:Y.prototype.Hr,969:Y.prototype.Er};
            Pa(function(){for(var a=kb(window.document,"pcjs","video"),b=0;b<a.length;b++){var c=a[b],d=ib(c),e=window.document.createElement("canvas");if(void 0===e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=
            function(a,b,c,d){return function(){b.style.height=(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());c.appendChild(e);var g=window.document.createElement("textarea");Ia("iOS")&&(g.setAttribute("autocapitalize","off"),g.setAttribute("autocorrect","off"));c.appendChild(g);var l=e.getContext("2d"),d=new Y(d,e,l,g,c);jb(d,c)}});
            function Yk(a){this.co=a.adapter;switch(this.co){case 1:this.Mm=1016;this.ci=4;break;case 2:this.Mm=760;this.ci=3;break;default:Ba("Unrecognized serial adapter #"+this.co);return}this.ef=null;Ua.call(this,"SerialPort",a,Yk,4194304);var b=a.binding,c;a=Zk;b&&(void 0===c&&(c="Panel"),(c=hb(c,this.id))&&(b=c.va[b])&&this.Nb(null,a,b))}eb(Yk);var Zk="buffer";f=Yk.prototype;f.qn=function(a,b){return a==this.Lg?(this.of=b,this):null};
            f.Nb=function(a,b,c){var d=this;switch(b){case Zk:return this.va[b]=this.ef=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;8===b&&(a.preventDefault&&a.preventDefault(),$k(d,[b]))},c.onkeypress=function(a){a=a||window.event;$k(d,[a.which||a.keyCode])},!0}return!1};f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.ja=xb(a,"ChipSet");oc(b,this,al,this.Mm);sc(b,this,bl,this.Mm);ob(this)};f.lc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
            f.kc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.mf()};f.save=function(){var a=new Je(this),b=0,c=[];c[b++]=this.Vk;c[b++]=this.wn;c[b++]=this.hg;c[b++]=this.Ki;c[b++]=this.$e;c[b++]=this.Id;c[b++]=this.Xd;c[b++]=this.jd;c[b++]=this.tn;c[b]=this.uh;a.set(0,c);return a.data()};f.restore=function(a){return this.mf(a[0])};
            f.mf=function(a){var b=0;void 0===a&&(a=[0,0,384,0,1,0,0,96,48,[]]);this.Vk=a[b++];this.wn=a[b++];this.hg=a[b++];this.Ki=a[b++];this.$e=a[b++];this.Id=a[b++];this.Xd=a[b++];this.jd=a[b++];this.tn=a[b++];this.uh=a[b];return!0};function $k(a,b){a.uh=a.uh.concat(b);cl(a)}function cl(a){0<a.uh.length&&!(a.jd&1)&&(a.Vk=a.uh.shift(),a.jd|=1);var b=-1;a.jd&1&&a.Ki&1&&(b=4);0<=b?(a.$e&=-8,a.$e|=b,a.ja&&a.ci&&Xi(a.ja,a.ci,100)):(a.$e|=1,a.ja&&a.ci&&Yi(a.ja,a.ci))}
            f.zq=function(a,b){var c=this.Id&128?this.hg&255:this.Vk;m(this,a,null,b,this.Id&128?"DLL":"RBR",c);this.jd&=-2;cl(this);return c};f.kq=function(a,b){var c=this.Id&128?this.hg>>8:this.Ki;m(this,a,null,b,this.Id&128?"DLM":"IER",c);return c};f.lq=function(a,b){var c=this.$e;m(this,a,null,b,"IIR",c);return c};f.mq=function(a,b){var c=this.Id;m(this,a,null,b,"LCR",c);return c};f.oq=function(a,b){var c=this.Xd;m(this,a,null,b,"MCR",c);return c};
            f.nq=function(a,b){var c=this.jd;m(this,a,null,b,"LSR",c);return c};f.tq=function(a,b){var c=this.tn;m(this,a,null,b,"MSR",c);return c};f.es=function(a,b,c){m(this,a,b,c,this.Id&128?"DLL":"THR");this.Id&128?this.hg=this.hg&-256|b:(this.wn=b,this.jd&=-97,this.ef?(13!=b&&(8==b?this.ef.value=this.ef.value.slice(0,-1):(this.ef.value+=String.fromCharCode(b),this.ef.scrollTop=this.ef.scrollHeight)),a=!0):a=!1,a&&(this.jd|=96))};
            f.Pr=function(a,b,c){m(this,a,b,c,this.Id&128?"DLM":"IER");this.Id&128?this.hg=this.hg&255|b<<8:this.Ki=b};f.Qr=function(a,b,c){m(this,a,b,c,"LCR");this.Id=b};
            f.Rr=function(a,b,c){var d=this.Xd;m(this,a,b,c,"MCR");this.Xd=b;this.of&&(d^b)&3&&(a=this.of,b=this.Xd,(c=3==(b&3))?a.Yc||(d=!1,a.Xd&2||(a.reset(),a.ab("serial mouse reset"),d=!0),a.Xd&1||(a.ab("serial mouse ID requested"),d=!0),d&&($k(a.Fh,[77,77]),a.ab("serial mouse ID sent")),dl(a),a.setActive(c)):a.Yc&&(a.ab("serial mouse inactive"),el(a),a.setActive(c)),a.Xd=b)};
            var al={0:Yk.prototype.zq,1:Yk.prototype.kq,2:Yk.prototype.lq,3:Yk.prototype.mq,4:Yk.prototype.oq,5:Yk.prototype.nq,6:Yk.prototype.tq},bl={0:Yk.prototype.es,1:Yk.prototype.Pr,3:Yk.prototype.Qr,4:Yk.prototype.Rr};Pa(function(){for(var a=kb(window.document,"pcjs","serial"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new Yk(d);jb(d,c)}});function fl(a){Ua.call(this,"Mouse",a,fl,33554432);if(this.vl=a.serial)this.Tm="SerialPort";this.setActive(!1);this.Nh=this.cj=!1;this.Cd=[];this.ng=[];ob(this)}eb(fl);
            f=fl.prototype;f.Kc=function(a,b,c,d){this.Fa=a;this.ma=b;this.O=c;this.Y=d;for(b=null;b=xb(a,"Video",b);)this.Cd.push(b)};f.setActive=function(a){this.Yc=a};
            f.lc=function(a,b){if(!b){if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;if(this.Tm&&!this.Fh){for(var c=null;(c=xb(this.Fa,this.Tm,c))&&(!c.qn||!(this.Fh=c.qn(this.vl,this))););if(this.Fh)for(this.ng=[],c=0;c<this.Cd.length;c++){var d;d=this.Cd[c];d.of=this;(d=d.Za)&&this.ng.push(d)}else Ba(this.id+": "+this.Tm+" "+this.vl+" unavailable")}this.Yc?dl(this):el(this)}return!0};f.kc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.mf()};
            f.save=function(){var a=new Je(this);a.set(0,this.Ym());return a.data()};f.restore=function(a){return this.mf(a[0])};f.mf=function(a){var b=0;void 0===a&&(a=[!1,-1,-1,0,0,!1,!1,0]);this.setActive(a[b++]);this.Pe=a[b++];this.Qe=a[b++];this.ig=a[b++];this.jg=a[b++];this.Zi=a[b++];this.$i=a[b++];this.Xd=a[b];return!0};f.Ym=function(){var a=0,b=[];b[a++]=this.Yc;b[a++]=this.Pe;b[a++]=this.Qe;b[a++]=this.ig;b[a++]=this.jg;b[a++]=this.Zi;b[a++]=this.$i;b[a]=this.Xd;return b};f.hi=function(a){this.cj=a};
            function dl(a){if(!a.Nh)for(var b=0;b<a.ng.length;b++)gl(a,a.ng[b])&&(a.Nh=!0)}function el(a){if(a.Nh)for(var b=0;b<a.ng.length;b++){var c=a.ng[b];c&&(c.style.cursor="auto")}}function gl(a,b){return b?(b.addEventListener("mousemove",function(b){a.lo(b)},!1),b.addEventListener("mousedown",function(b){a.bl(b.button,!0)},!1),b.addEventListener("mouseup",function(b){a.bl(b.button,!1)},!1),b.style.cursor="none",!0):!1}
            f.lo=function(a){if(this.Yc&&this.O&&this.O.fa.qb){if(0>this.Pe||0>this.Qe)this.Pe=a.clientX,this.Qe=a.clientY;this.cj?(this.ig=a.movementX||a.mozMovementX||a.webkitMovementX||0,this.jg=a.movementY||a.mozMovementY||a.webkitMovementY||0):(this.ig=a.clientX-this.Pe,this.jg=a.clientY-this.Qe);(this.ig||this.jg)&&hl(this,null,a.clientX,a.clientY);this.Pe=a.clientX;this.Qe=a.clientY}};
            f.bl=function(a,b){if(this.Yc&&this.O&&this.O.fa.qb){var c;!(c=!1!==this.cj)&&(c=this.Cd.length)&&(c=this.Cd[0],c=c.yp?c.Tf(!0):!1);c||(this.cj=null);c="mouse button"+a+" "+(b?"dn":"up");switch(a){case 0:this.Zi!=b&&(this.Zi=b,hl(this,c));break;case 2:this.$i!=b&&(this.$i=b,hl(this,c))}}};
            function hl(a,b,c,d){var e=64|(a.Zi?32:0)|(a.$i?16:0)|(a.jg&192)>>4|(a.ig&192)>>6,g=a.ig&63,l=a.jg&63;a.qa(4194304)&&a.ab((b?b+": ":"")+(void 0!==d?"mouse ("+c+","+d+"): ":"")+"serial packet ["+k(e)+","+k(g)+","+k(l)+"]",0,!0);$k(a.Fh,[e,g,l]);a.ig=a.jg=0}Pa(function(){for(var a=kb(window.document,"pcjs","mouse"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new fl(d);jb(d,c)}});
            function il(a,b,c){Ua.call(this,"Disk",{id:a.fo+".disk"+ ++jl},il,2097152);this.Z=a;this.Fa=a.Fa;this.Y=a.Y;this.Sa=b;this.ke=b.name;this.Eg=b.Eg;this.dj=this.xe=!1;this.create(c,b.Eb,b.Fb,b.Mb,b.xb);this.Bf=[];this.yi=[];this.Me=null;this.no=0;this.sl=!1;ob(this)}var jl=0;eb(il);f=il.prototype;f.Kc=function(a,b,c,d){this.Y=d};f.lc=function(a,b){b||!this.dj||this.xe||(ob(this,!1),this.load(this.ke,this.bg,null,this.vp,this));return!0};f.vp=function(){ob(this,!0)};
            f.kc=function(a,b){if(this.xe){var c,d=0;if(this.sl&&!Ca("Disk writes are still in progress, shut down anyway?"))return!1;for(;c=kl(this,!1);)if(d=c[0]){this.Z.Da('Unable to save "'+this.ke+'" (error '+d+")");break}b&&this.xe&&(c="action=close&volume="+this.bg,c+="&machine="+this.Z.Hg(),c+="&user="+this.Z.kf(),za(Aa()+"/api/v1/disk?"+c,!0),this.xe=!1);!d&&a&&this.Z.Da(this.ke+" saved")}return!0};
            f.create=function(a,b,c,d,e){this.mode=a;this.Eb=b;this.Fb=c;this.Mb=d;this.xb=e;this.jb=[];if("preload"!=this.mode){a=Array(this.Eb);for(b=0;b<a.length;b++){c=Array(this.Fb);for(d=0;d<c.length;d++){e=Array(this.Mb);for(var g=1;g<=e.length;g++)e[g-1]=ll(null,b,d,g,this.xb,"local"==this.mode?0:null);c[d]=e}a[b]=c}this.jb=a}this.yg=null};
            f.load=function(a,b,c,d,e){var g=b;if(!this.Sf)if(this.ke=a,this.bg=b,this.Sf=d,this.pp=e||this.Z,c){var l=this,p=new FileReader;p.onload=function(){var a=p.result,b,c=a?a.byteLength:0,d=ea[c];if(d){l.Eb=d[0];l.Fb=d[1];l.Mb=d[2];l.xb=512;b=l.xb>>2;var e=d=0,a=new DataView(a,0,c);l.jb=Array(l.Eb);for(c=0;c<l.jb.length;c++)for(var g=l.jb[c]=Array(l.Fb),T=0;T<g.length;T++)for(var Z=g[T]=Array(l.Mb),S=0;S<Z.length;S++){for(var X=ll(null,c,T,S+1,l.xb,0),xa=X.data,qa=0;qa<b;qa++,e+=4)var Sa=xa[qa]=a.getInt32(e,
            !0),d=d+Sa&-1;X.Vc=b;Z[S]=X}l.yg=d;b=l}else l.Da("Unrecognized diskette format ("+c+" bytes)");l.Sf&&(l.Sf.call(l.Z,l.Sa,b,l.ke,l.bg),l.Sf=null)};p.readAsArrayBuffer(c)}else 0>b.indexOf("/api/v1/dump")&&(a=ia(b),"json"==a?g=encodeURI(b):"demandrw"==this.mode||"demandro"==this.mode?(g=ml(this,b),this.dj=!0):(c="path",d="&mbhd=10",!b.indexOf("http:")||!b.indexOf("ftp:")||0<="dsk ima img 360 720 12 144".split(" ").indexOf(a)?(c="disk",d="&mbhd=0"):-1!==b.indexOf("/",b.length-1)&&(c="dir"),g=Aa()+"/api/v1/dump?"+
            c+"="+encodeURIComponent(b)+(this.Eg?"":d)+"&format=json")),za(g,!0,null,this,this.tp,b)};
            f.tp=function(a,b,c,d){var e=null;this.Gg=!1;var g=0>c&&this.Fa&&!this.Fa.fa.jc;if(this.dj)c?this.Z.Da('Unable to connect to disk "'+d+'" (error '+c+": "+b+")",g):(this.xe=!0,e=this);else if(c)this.Z.Da('Unable to load disk "'+this.ke+'" (error '+c+")",g);else try{if(0<ha(a,!0).toLowerCase().indexOf("-readonly"))this.Gg=!0;else{var l=b.indexOf("\n");0<l&&1024>l&&0<b.substring(0,l).indexOf("write-protected")&&(this.Gg=!0)}var p;p="<"==b.substr(0,1)?["Missing disk image: "+this.ke]:0>b.indexOf("0x")&&
            '["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");if(p.length)if(1==p.length)Ba(p[0]);else{this.Eb=p.length;this.Fb=p[0].length;this.Mb=p[0][0].length;var v=p[0][0][0];this.xb=v&&v.length||512;for(b=a=0;b<this.Eb;b++)for(c=0;c<this.Fb;c++)for(d=0;d<this.Mb;d++)if(v=p[b][c][d]){var w=v.length;void 0===w&&(w=v.length=512);var w=w>>2,F=v.pattern;void 0===F&&(F=v.pattern=0);var K=v.data;if(void 0===K){var J=v.bytes;if(void 0!==J&&J.length){for(var g=
            w<<2,I=J.length;I<g;I++)J[I]=F;this.fill(v,J,0)}else K=[],F=v.pattern=F|F<<8|F<<16|F<<24,v.data=K;delete v.bytes}ll(v,b,c);for(g=0;g<K.length;g++)a=a+K[g]&-1}this.jb=p;this.yg=a;e=this}else Ba("Empty disk image: "+this.ke)}catch(T){Ba("Disk image error: "+T.message)}this.Sf&&(this.Sf.call(this.pp,this.Sa,e,this.ke,this.bg),this.Sf=null)};function ll(a,b,c,d,e,g){a||(a={sector:d,length:e,data:[],pattern:g});a.Ip=b;a.Kp=c;a.Md=a.Vc=0;a.Ta=!1;return a}
            function ml(a,b){var c;c="action=open&volume="+b+("&mode="+a.mode);c+="&chs="+a.Eb+":"+a.Fb+":"+a.Mb+":"+a.xb;c+="&machine="+a.Z.Hg();c+="&user="+a.Z.kf();return Aa()+"/api/v1/disk?"+c}function nl(a,b,c,d,e,g,l){if(a.xe){var p;p="action=read&volume="+a.bg;p+="&chs="+a.Eb+":"+a.Fb+":"+a.Mb+":"+a.xb;p=p+("&addr="+b+":"+c+":"+d+":"+e)+("&machine="+a.Z.Hg());p+="&user="+a.Z.kf();za(Aa()+"/api/v1/disk?"+p,g,null,a,a.wp,[b,c,d,e,g,l])}else l&&l(-1,!1)}
            f.wp=function(a,b,c,d){var e=!1;a=d[0];var g=d[1],l=d[2],p=d[3];if(!c){b=JSON.parse(b);for(e=0;p--;){var v=this.seek(a,g,l,!0);if(!v)break;this.fill(v,b,e);e+=v.length;l++}e=d[4]}(d=d[5])&&d(c,e)};f.xp=function(a,b,c,d){a=d[0];b=d[1];var e=d[2],g=d[3];d=d[4];this.sl=!1;if(0<=a&&a<this.jb.length&&0<=b&&b<this.jb[a].length)for(--e;0<g--&&0<=e&&e<this.jb[a][b].length;e++){var l=this.jb[a][b][e];c?ol(this,l,!1):l.Ta||(l.Md=l.Vc=0)}d&&pl(this)};
            function ol(a,b,c){b.Ta=!0;var d=a.Bf.indexOf(b);0<=d&&(a.Bf.splice(d,1),a.yi.splice(d,1));a.Bf.push(b);a.yi.push(ra());c&&pl(a)}function pl(a){if(a.Bf.length){var b=a.yi[0]+2E3;a.Me&&a.no<b&&(clearTimeout(a.Me),a.Me=null);if(!a.Me){var c=ra(),b=b-c;0>b&&(b=0);2E3<b&&(b=2E3);a.Me=setTimeout(function(){kl(a,!0)},b);a.no=c+b}}else a.Me&&(clearTimeout(a.Me),a.Me=null)}
            function kl(a,b){b&&(a.Me=null);var c=a.Bf[0];if(c){for(var d=c.Ip,e=c.Kp,c=c.sector,g=0,l=[],p=c-1;p<a.jb[d][e].length;p++){var v=a.jb[d][e][p];if(!v.Ta)break;var w=a.Bf.indexOf(v);a.Bf.splice(w,1);a.yi.splice(w,1);l=l.concat(ql(v));v.Ta=!1;g++}a.xe?(p={},a.sl=!0,p.action="write",p.volume=a.bg,p.chs=a.Eb+":"+a.Fb+":"+a.Mb+":"+a.xb,p.addr=d+":"+e+":"+c+":"+g,p.machine=a.Z.Hg(),p.user=a.Z.kf(),p.data=JSON.stringify(l),d=za(Aa()+"/api/v1/disk",b,p,a,a.xp,[d,e,c,g,b])):d=!1;return b||d}return!1}
            f.info=function(){return this.jb.length?[this.jb.length,this.jb[0].length,this.jb[0][0].length,this.jb[0][0][0].length]:[0,0,0,0]};
            f.seek=function(a,b,c,d,e){var g=null,l=this.Sa,p=this.jb[a];if(p){var v=p[b];if(!v&&l.Sk&&b<l.Fb)for(v=p[b]=Array(l.af),p=0;p<v.length;p++)v[p]=ll(null,a,b,p+1,l.ob,0);if(v){for(p=0;p<v.length;p++)if(v[p]&&v[p].sector==c){g=v[p];if(null===g.pattern)if(d)g.pattern=0;else{for(d=1;++p<v.length;)null===v[p].pattern&&d++;nl(this,a,b,c,d,null!=e,function(a,b){a&&(g=null);e&&e(g,b)});return e?null:g}break}!g&&l.Sk&&9==l.eb&&(g=v[p]=ll(null,a,b,l.eb,l.ob,0))}}e&&e(g,!1);return g};
            f.fill=function(a,b,c){for(var d=a.length>>2,e=Array(d),g=0;g<d;g++)e[g]=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24,c+=4;a.data=e};function ql(a){var b=a.length,c=Array(b),d=0,b=b>>2,e=a.data;a=a.pattern;for(var g=0;g<b;g++){var l=g<e.length?e[g]:a;c[d++]=l&255;c[d++]=l>>8&255;c[d++]=l>>16&255;c[d++]=l>>24&255}return c}function rl(a,b){var c=-1;if(a&&b<a.length)var c=a.data,d=b>>2,c=(d<c.length?c[d]:a.pattern)>>((b&3)<<3)&255;return c}
            f.write=function(a,b,c){if(this.Gg)return!1;if(b<a.length){if(c!=rl(a,b)){var d=a.data,e=a.pattern,g=b>>2;b=(b&3)<<3;for(var l=d.length;l<=g;l++)d[l]=e;a.Vc?g<a.Md?(a.Vc+=a.Md-g,a.Md=g):g>=a.Md+a.Vc&&(a.Vc+=g-(a.Md+a.Vc)+1):(a.Md=g,a.Vc=1);d[g]=d[g]&~(255<<b)|c<<b;this.xe&&ol(this,a,!0)}return!0}return null};
            f.save=function(){var a=0,b=[];b[a++]=[this.bg,this.yg,this.Eb,this.Fb,this.Mb,this.xb];if(!this.xe&&!this.Gg)for(var c=this.jb,d=0;d<c.length;d++)for(var e=0;e<c[d].length;e++)for(var g=0;g<c[d][e].length;g++){var l=c[d][e][g];if(l&&l.Vc){for(var p=[],v=0,w=l.Md,F=l.Md+l.Vc;w<F;)p[v++]=l.data[w++];b[a++]=[d,e,g,l.Md,p]}}return b};
            f.restore=function(a){var b=0,c="unsupported restore format";if(a&&0<a.length){var d=0,e=a[d++];e&&2<=e.length&&(!this.jb.length&&6<=e.length?this.create("local",e[2],e[3],e[4],e[5]):null!=e[1]&&null!=this.yg&&e[1]!=this.yg&&(c="original checksum ("+e[1]+") differs from current checksum ("+this.yg+")",b=-2));for(this.jb.length||(b=-1);d<a.length&&0<=b;){var g=0,l=a[d++],p=l[g++],v=l[g++],w=l[g++];if(p>=this.jb.length||v>=this.jb[p].length||w>=this.jb[p][v].length){c="sector (CHS="+p+":"+v+":"+w+") out of range ("+
            b+" changes applied)";b=-1;break}if(this.Gg){c="unable to modify write-protected disk";b=-1;break}e=l[g++];g=l[g++];l=e+g.length;if(p=this.jb[p][v][w]){for(v=p.data.length;v<e;)p.data[v++]=p.pattern;v=0;p.Md=e;for(p.Vc=g.length;e<l;)p.data[e++]=g[v++];b++}}}0>b&&-2!=b&&this.Z.Da("Unable to restore disk '"+this.ke+": "+c);return b};
            f.toJSON=function(){var a=JSON.stringify(this.jb),a=a.replace(/,"length":512/gm,"").replace(/,"pattern":0/gm,""),a=a.replace(/"(sector|length|data|pattern)":/gm,"$1:"),a=a.replace(/,"[^"]*":([0-9]+|true|false)/gm,"");return a=a.replace(/(sector|length|data|pattern):/gm,'"$1":')};
            function sl(a){Ua.call(this,"FDC",a,sl,524288);this.dmaRead=this.fl;this.dmaWrite=this.gl;this.dmaFormat=this.qp;this.Jf=null;if(a.autoMount&&(this.Jf=a.autoMount,"string"==typeof this.Jf))try{this.Jf=eval("("+a.autoMount+")")}catch(b){Ba("FDC auto-mount error: "+b.message+" ("+a.autoMount+")"),this.Jf=null}this.Oc=[];this.Sn=!Ia("Mobi")&&window&&"FileReader"in window}eb(sl);ba={};aa={};
            var tl={3:{se:3,df:0,name:aa.Kt},4:{se:2,df:1,name:aa.It},5:{se:9,df:7,name:aa.Wt},6:{se:9,df:7,name:aa.Ct},7:{se:2,df:0,name:aa.Et},8:{se:1,df:2,name:aa.Jt},10:{se:2,df:7,name:aa.Dt},13:{se:6,df:7,name:aa.ot},15:{se:3,df:0,name:aa.Ht}};f=sl.prototype;
            f.Nb=function(a,b,c){var d=this;switch(b){case "listDisks":return this.va[b]=c,c.onchange=function(){var a=d.va.descDisk,b=c.options[c.selectedIndex];if(a&&b){var l={};if(b=b.getAttribute("data-value"))try{l=eval("({"+b+"})")}catch(p){Ba("FDC option error: "+p.message)}b=l.desc;void 0===b&&(b="");l=l.href;void 0!==l&&(b='<a href="'+l+'" target="_blank">'+b+"</a>");a.innerHTML=b}},!0;case "descDisk":case "listDrives":return this.va[b]=c,c.onchange=function(){var a=fa(c.value,10);null!=a&&ul(d,a)},
            !0;case "loadDrive":return this.va[b]=c,c.onclick=function(){var a=d.va.listDisks;a&&vl(d,a.options[a.selectedIndex].text,a.value)},!0;case "mountDrive":return this.Sn?(this.va[b]=c,c.addEventListener("change",function(){var a=c.children[0];a.children[1].disabled=!a.children[0].files.length}),c.onsubmit=function(a){if(a=a.currentTarget[1].files[0]){var b=a.name;vl(d,ha(b,!0),b,a)}return!1}):c.parentNode.removeChild(c),!0}return!1};
            f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.ja=xb(a,"ChipSet");this.ye();oc(b,this,wl);sc(b,this,xl);this.Sn&&yl(this,"Local Disk","?");yl(this,"Remote Disk","??");this.xh()||ob(this)};
            f.lc=function(a,b){if(!b){if(!a||!this.restore){if(this.reset(),this.Fa.ol){this.Oc=[];for(var c=0;c<this.Ea.length;c++)zl(this,c,!0);this.xh(!0)}}else if(!this.restore(a))return!1;if(c=this.va.listDrives){for(;c.firstChild;)c.removeChild(c.firstChild);c.textContent="";for(var d=0;d<this.Fl;d++){var e=window.document.createElement("option");e.value=d;e.textContent=String.fromCharCode(65+d)+":";c.appendChild(e)}0<this.Fl&&(c.value="0",ul(this,0))}}return!0};
            f.kc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.ye()};f.save=function(){var a=new Je(this);a.set(0,this.Vm());return a.data()};f.restore=function(a){return this.ye(a[0])};
            f.ye=function(a){var b=0,c,d=!0;void 0===a&&(a=[0,0,128,Array(9),0,0,0,[]]);this.rb=a[b++];b++;this.wa=a[b++];this.wc=a[b++];this.Jb=a[b++];this.pb=a[b++];this.eh=a[b++];var e=a[b++];c=a[b++];null!=c&&(this.Oc=c);void 0===this.Ea&&(this.Fl=4,this.ja&&(this.Fl=Ai(this.ja)),this.Ea=Array(4));for(c=0;c<this.Ea.length;c++){var g=this.Ea[c];if(void 0===g){var g=this.Ea[c]={},l;if(this.ja)a:{l=this.ja;if(c<Ai(l)){if(!l.Te){l=360;break a}if(c<l.Te.length){l=l.Te[c];break a}}l=0}else l=0;switch(l){case 160:case 180:g.Fb=
            1;default:g.Eb=40;g.Mb=9;break;case 720:g.Eb=80;g.Mb=9;break;case 1200:g.Eb=80;g.Mb=15;break;case 1440:g.Eb=80,g.Mb=18}}this.wl(g,c,e[c])||(d=!1)}this.wf=a[b++]||0;this.Io=a[b]||0;return d};f.Vm=function(){var a=0,b=[];b[a++]=this.rb;b[a++]=0;b[a++]=this.wa;b[a++]=this.wc;b[a++]=this.Jb;b[a++]=this.pb;b[a++]=this.eh;b[a++]=this.Xm();for(var c=a++,d=0;d<this.Ea.length;d++){var e=this.Ea[d];e.xa&&Al(this,e.cg,e.xa)}b[c]=this.Oc;b[a++]=this.wf;b[a]=this.Io;return b};
            f.wl=function(a,b,c){var d=0,e=!0;a.rb=b;a.$c=a.Cg=!1;void 0===c&&(c=[192,!0,0,2,0]);"boolean"==typeof c[1]&&(c[1]=["Floppy Drive",a.Eb||40,a.Fb||c[3],a.Mb||9,a.xb||512,c[1],a.qj,a.ai,a.bi]);a.ib=c[d++];var g=c[d++];a.name=g[0];a.Eb=g[1];a.Fb=g[2];a.Mb=g[3];a.xb=g[4];a.Eg=g[5];(a.qj=g[6])?(a.ai=g[7],a.bi=g[8]):(a.qj=a.Eb,a.ai=a.Fb,a.bi=a.Mb);a.Ra=c[d++];a.Ze=c[d++];a.Ab=c[d++];a.Ze=100<=a.Ze?a.Ze-100:a.Ze-a.Ab;a.eb=c[d++];a.af=c[d++];a.ob=c[d++];a.Ua=c[d++];a.Xa=null;a.xa||(a.cg="");var l=c[d++];
            102==l&&(l=!1);"boolean"==typeof l?(g=c[d++],c=c[d],l?(d=this.Ea[b],zl(this,b,!0,!0),d.Cg=!0,b=new il(this,d,"preload"),this.Kn(d,b,g,c,!0)):Bl(this,b,g,c,!0)?a.xa&&c&&Cl(this,g,c,a.xa):ob(this,!1)):void 0!==l&&a.xa&&0>a.xa.restore(l)&&(e=!1);e&&a.xa&&void 0!==a.Ua&&(a.Xa=a.xa.seek(a.Ab,a.Ra,a.eb));return e};f.Xm=function(){for(var a=0,b=[],c=0;c<this.Ea.length;c++)b[a++]=this.Wm(this.Ea[c]);return b};
            f.Wm=function(a){var b=0,c=[];c[b++]=a.ib;c[b++]=[a.name,a.Eb,a.Fb,a.Mb,a.xb,a.Eg,a.qj,a.ai,a.bi];c[b++]=a.Ra;c[b++]=a.Ze+100;c[b++]=a.Ab;c[b++]=a.eb;c[b++]=a.af;c[b++]=a.ob;c[b++]=a.Ua;c[b++]=a.Cg;c[b++]=a.Po;c[b]=a.cg;return c};f.Hn=function(a){var b;a=this.Ea[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};f.So=function(a,b,c){if(a.xa){var d=a.xa.info(),e=d[2],g=d[1]*e;if(b+c<=d[0]*g)return a.Ab=Math.floor(b/g),b%=g,a.Ra=Math.floor(b/e),a.eb=b%e+1,a.ob=c*d[3],a.ib=0,!0}return!1};
            f.xh=function(a){a||(this.Ff=0);if(this.Jf)for(var b in this.Jf){var c=this.Jf[b];if(c.name&&c.path){var d=b.charCodeAt(0)-65;if(0<=d&&d<this.Ea.length){!Bl(this,d,c.name,c.path,!0)&&a&&ob(this,!1);continue}}this.Da("Unrecognized auto-mount specification for drive "+b)}return!!this.Ff};
            function vl(a,b,c,d){var e,g=a.va.listDrives;if(g&&!isNaN(e=fa(g.value,10))&&0<=e&&e<a.Ea.length)if(c)if("?"==c)a.Da('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=ha(c);a.R("Attempting to load "+c+' as "'+b+'"')}for(a.R("loading disk "+c+"...");Bl(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){for(var g=a,l=c,p=
            void 0,p=0;p<g.Oc.length;p++)if(g.Oc[p][1]==l){g.Oc.splice(p,1);break}zl(a,e,!1,!0)}}else zl(a,e);else a.Da("Nothing to load")}function Bl(a,b,c,d,e,g){var l=a.Ea[b];if(d&&l.cg!=d){zl(a,b,e,!0);if(l.$c)return a.Da("Drive "+b+" busy"),!0;l.$c=!0;e&&(l.Pf=!0,a.Ff++,a.qa()&&a.ab("loading diskette '"+c+"'"));l.Cg=!!g;(new il(a,l,"preload")).load(c,d,g,a.Kn);return!1}return!0}
            f.Kn=function(a,b,c,d,e){var g;a.$c=!1;b&&(g=b.info(),b&&g[0]>a.Eb||g[1]>a.Fb)&&(this.Da('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.rb)),b=null);b?(a.xa=b,a.Po=c,a.cg=d,Cl(this,c,d,b),g=b.info(),this.wf|=128,this.Da('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.rb),a.Pf||e),a.qj=g[0],a.ai=g[1],a.bi=g[2]):a.Cg=!1;a.Pf&&(a.Pf=!1,--this.Ff||ob(this));ul(this,a.rb)};
            function yl(a,b,c){if(a=a.va.listDisks){for(var d=0;d<a.options.length;d++)if(a.options[d].value==c)return;d=window.document.createElement("option");d.value=c;d.textContent=b;a.appendChild(d)}}function ul(a,b){if(0<=b&&b<a.Ea.length){var c=a.Ea[b],d=a.va.listDisks,e=a.va.listDrives;if(d&&e&&(e=fa(e.value,10),c=c.Cg?"?":c.cg,!isNaN(e)&&e==b)){for(e=0;e<d.options.length;e++)if(d.options[e].value==c){d.selectedIndex!=e&&(d.selectedIndex=e);break}e==d.options.length&&(d.selectedIndex=0)}}}
            function zl(a,b,c,d){var e=a.Ea[b];e.xa&&(Al(a,e.cg,e.xa),e.Po="",e.cg="",e.xa=null,e.Cg=!1,a.wf|=128,d||a.Da("Drive "+String.fromCharCode(65+b)+" unloaded",c),c||d||ul(a,b))}function Cl(a,b,c,d){var e;for(e=0;e<a.Oc.length;e++)if(a.Oc[e][1]==c){d.restore(a.Oc[e][2]);return}a.Oc[e]=[b,c,[]]}function Al(a,b,c){var d;for(d=0;d<a.Oc.length;d++)if(a.Oc[d][1]==b){a.Oc[d][2]=c.save();break}}f.Kr=function(a,b,c){m(this,a,b,c,"OUTPUT");b&4?this.eh&4||this.eh&8&&this.ja&&Xi(this.ja,6):this.ye();this.eh=b};
            f.hq=function(a,b){m(this,a,null,b,"STATUS",this.wa);return this.wa};f.fq=function(a,b){var c=0;this.Jb<this.pb&&(c=this.wc[this.Jb]);this.eh&8&&this.ja&&Yi(this.ja,6);this.qa()&&m(this,a,null,b,"DATA["+this.Jb+"]",c);++this.Jb>=this.pb&&(this.wa&=-81,this.Jb=this.pb=0);return c};
            f.Jr=function(a,b,c){this.qa()&&m(this,a,b,c,"DATA["+this.pb+"]");this.pb<this.wc.length&&(this.wc[this.pb++]=b);a=this.wc[0]&31;if(void 0!==tl[a]&&this.pb>=tl[a].se){b=!1;this.Jb=0;a=this.Wa();var d,e,g,l,p=a&31;switch(p){case 3:this.Wa(ba.Lt);this.Wa(ba.rt);this.gc();break;case 4:c=this.Wa(ba.mh);this.rb=c&3;d=this.Ea[this.rb];this.gc();this.sc((d.ib&-16777216)>>>24,ba.Ot);break;case 5:case 6:c=this.Wa(ba.mh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];d.Ra=b;c=d.Ab=this.Wa(ba.dn);e=this.Wa(ba.en);
            g=d.eb=this.Wa(ba.gn);l=this.Wa(ba.Fk);d.ob=128<<l;d.af=this.Wa(ba.mt);this.Wa(ba.cp);this.Wa(ba.lt);6==p?(p=d,p.ib=72,p.xa&&(p.Xa=null,p.ib=0,this.ja&&(Qi(this.ja,2,this,"dmaRead",p),Ji(this.ja,2)))):(p=d,p.ib=72,p.xa&&(p.xa.Gg?p.ib=576:(p.Xa=null,p.ib=0,this.ja&&(Qi(this.ja,2,this,"dmaWrite",p),Ji(this.ja,2)))));Dl(this,d,a,b,c,e,g,l);b=!0;break;case 7:c=this.Wa(ba.mh);this.rb=c&3;d=this.Ea[this.rb];d.Ab=d.Ze=0;d.ib=268435488;this.gc();b=!0;break;case 8:d=this.Ea[this.rb];d.Ra=0;this.gc();this.sc(d.rb|
            d.Ra<<2|d.ib&255,ba.ep);this.sc(d.Ab,ba.At);this.rb=this.rb+1&3;break;case 10:c=this.Wa(ba.mh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];c=d.Ab;e=d.Ra=b;g=d.eb=1;l=0;d.ib=0;d.xa&&(d.Xa=d.xa.seek(d.Ab,d.Ra,d.eb))?l=d.Xa.length:d.ib=72;Dl(this,d,a,b,c,e,g,l);b=!0;break;case 13:c=this.Wa(ba.mh);b=c>>2&1;this.rb=c&3;d=this.Ea[this.rb];c=d.Ab;e=d.Ra=b;g=1;l=this.Wa(ba.Fk);d.ob=128<<l;d.af=this.Wa(ba.Gt);this.Wa(ba.cp);d.sn=this.Wa(ba.bp);p=d;p.ib=72;p.xa&&(p.Xa=null,p.ib=0,this.ja&&(p.ug=0,p.hd=Array(4),
            p.Sk=!0,p.Ri=0,Qi(this.ja,2,this,"dmaFormat",p),Ji(this.ja,2),p.Sk=!1));Dl(this,d,a,b,c,e,g,l);b=!0;break;case 15:c=this.Wa(ba.mh),this.rb=c&3,d=this.Ea[this.rb],d.Ra=c>>2&1,c=this.Wa(ba.xt),d.Ab+=c-d.Ze,0>d.Ab&&(d.Ab=0),d.Ab>=d.Eb&&(d.Ab=d.Eb-1),d.Ze=c,d.ib=32,d.Ab||(d.ib|=268435456),this.gc(),b=!0}0<this.pb&&(this.wa|=80);this.eh&8&&(!d||d.ib&8||!b||this.ja&&Xi(this.ja,6))}};f.gq=function(a,b){var c=this.wf;this.wf&=-129;m(this,a,null,b,"INPUT",c);return c};
            f.Ir=function(a,b,c){m(this,a,b,c,"CONTROL");this.Io=b};function Dl(a,b,c,d,e,g,l,p){a.gc();a.sc(b.rb|b.Ra<<2|b.ib&255,ba.ep);a.sc((b.ib&65280)>>>8,ba.Mt);a.sc((b.ib&16711680)>>>16,ba.Nt);var v=0;if(e!=b.Ab||g!=b.Ra)v=l=1;c&128&&(g^=v,d||(v=0));a.sc(e+v,ba.dn);a.sc(g,ba.en);a.sc(l,ba.gn);a.sc(p,ba.Fk)}f.Wa=function(){var a=this.wc[this.Jb];this.Jb++;return a};f.gc=function(){this.Jb=this.pb=0};f.sc=function(a){this.wc[this.pb++]=a};f.fl=function(a,b,c){void 0===b||0>b?this.Zg(a,c):c(-1,!1)};
            f.gl=function(a,b){return void 0!==b&&0<=b?this.lh(a,b):-1};f.qp=function(a,b){return void 0!==b&&0<=b?this.$m(a,b):-1};f.Zg=function(a,b){var c=-1,d=null,e=0;if(!a.ib&&a.xa){do{if(a.Xa&&(e=a.Ua,0<=(c=rl(a.Xa,a.Ua++)))){d=a.Xa;break}a.Xa=a.xa.seek(a.Ab,a.Ra,a.eb);if(!a.Xa){a.ib=1088;break}a.Ua=0;this.wh(a)}while(1)}b(c,!1,d,e)};
            f.lh=function(a,b){if(a.ib||!a.xa)return-1;do{if(a.Xa&&a.xa.write(a.Xa,a.Ua++,b))break;a.Xa=a.xa.seek(a.Ab,a.Ra,a.eb);if(!a.Xa){a.ib=8256;b=-1;break}a.Ua=0;this.wh(a)}while(1);return b};f.wh=function(a){a.eb++;a.eb>=a.bi+1&&(a.eb=1,a.Ra++,a.Ra>=a.ai&&(a.Ra=0,a.Ab++))};f.$m=function(a,b){if(a.ib)return-1;a.hd[a.ug++]=b;if(a.ug==a.hd.length){a.Ab=a.hd[0];a.Ra=a.hd[1];a.eb=a.hd[2];a.ob=128<<a.hd[3];for(var c=a.ug=0;c<a.ob;c++)if(0>this.lh(a,a.sn))return-1;a.Ri++}a.Ri>=a.af&&(b=-1);return b};
            var wl={1012:sl.prototype.hq,1013:sl.prototype.fq,1015:sl.prototype.gq},xl={1010:sl.prototype.Kr,1013:sl.prototype.Jr,1015:sl.prototype.Ir};Pa(function(){for(var a=kb(window.document,"pcjs","fdc"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new sl(d);jb(d,c)}});
            function El(a){Ua.call(this,"HDC",a,El,1048576);this.dmaRead=this.fl;this.dmaWrite=this.gl;this.dmaWriteBuffer=this.rp;this.dmaWriteFormat=this.sp;this.Ik=[];if(a.drives)try{this.Ik=eval("("+a.drives+")")}catch(b){Ba("HDC drive configuration error: "+b.message+" ("+a.drives+")")}this.Sh=(this.Of="at"==a.type)?1:0;this.Jp=this.Of?2:3}eb(El);
            var Fl=[{0:[306,2],1:[375,8],2:[306,6],3:[306,4]},{1:[306,4],2:[615,4],3:[615,6],4:[940,8],5:[940,6],6:[615,4],7:[462,8],8:[733,5],9:[900,15],10:[820,3],11:[855,5],12:[855,7],13:[306,8],14:[733,7]}];f=El.prototype;f.Nb=function(){return!1};f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Y=d;this.Fa=a;this.ja=xb(a,"ChipSet");oc(b,this,this.Of?Gl:Hl);sc(b,this,this.Of?Il:Jl);Ce(c,19,this,this.Kq);Ce(c,64,this,this.Lq);this.reset();this.xh()||ob(this)};
            f.lc=function(a,b){if(!b)if(!a||!this.restore)this.ye(),this.Fa.ol&&this.xh(!0);else if(!this.restore(a))return!1;return!0};f.kc=function(a){return a&&this.save?this.save():!0};f.Hg=function(){return this.Fa?this.Fa.Hg():""};f.kf=function(){return this.Fa?this.Fa.kf():""};f.reset=function(){this.ye(null,!0)};f.save=function(){var a=new Je(this);a.set(0,this.Vm());return a.data()};f.restore=function(a){return this.ye(a[0])};
            f.ye=function(a,b){var c=0,d=!0;if(this.Of)null==a&&(a=[0,0,0,0,0,0,0,0,64,0]),this.vf=a[c++],this.Oo=a[c++],this.xf=a[c++],this.uk=a[c++],this.qk=a[c++],this.pk=a[c++],this.bh=a[c++],this.wa=a[c++],this.Om=a[c++],this.sk=a[c++];else{null==a&&(a=[0,0,Array(14),0,0]);this.ah=a[c++];this.wa=a[c++];this.wc=a[c++];this.Jb=a[c++];this.pb=a[c++];this.No=a[c++];this.Mo=a[c++];this.Lo=a[c++];var e=a[c++];void 0!==e?this.Jg=e:void 0===this.Jg&&(this.Jg=-1)}void 0===this.Ea&&(this.Ea=Array(this.Ik.length));
            c=a[c];void 0===c&&(c=[]);for(e=0;e<this.Ea.length;e++){void 0===this.Ea[e]&&(this.Ea[e]={});var g=this.Ea[e];this.wl(e,g,this.Ik[e],c[e],b)||(d=!1);null!=this.ah&&1>=e&&(this.ah|=(g.type&3)<<(1-e<<1))}return d};
            f.Vm=function(){var a=0,b=[];this.Of?(b[a++]=this.vf,b[a++]=this.Oo,b[a++]=this.xf,b[a++]=this.uk,b[a++]=this.qk,b[a++]=this.pk,b[a++]=this.bh,b[a++]=this.wa,b[a++]=this.Om,b[a++]=this.sk):(b[a++]=this.ah,b[a++]=this.wa,b[a++]=this.wc,b[a++]=this.Jb,b[a++]=this.pb,b[a++]=this.No,b[a++]=this.Mo,b[a++]=this.Lo,b[a++]=this.Jg);b[a]=this.Xm();return b};
            f.wl=function(a,b,c,d,e){var g=0,l=!0;void 0===d&&(d=[0,0,!1,Array(8)]);b.rb=a;b.errorCode=d[g++];b.Uo=d[g++];b.Eg=d[g++];b.qg=d[g++];b.rg=d[g++];b.Ra=d[g++];b.Fb=d[g++];b.Ne=d[g++];b.eb=d[g++];b.af=d[g++];b.ob=d[g++];b.Pi=this.Of?0:1;b.name=c.name;void 0===b.name&&(b.name="Hard Drive");b.path=c.path;b.mode=c.mode||(b.path?"preload":"local");"demandro"!=b.mode&&"demandrw"!=b.mode||this.kf()||(b.mode="local");b.type=c.type;if(void 0===b.type||void 0===Fl[this.Sh][b.type])b.type=this.Jp;c=Fl[this.Sh][b.type];
            b.Mb=c[2]||17;b.xb=c[3]||512;if(e&&this.ja&&(e=this.ja,c=b.type,e.ga)){var p=e.ga[18],p=a?p&240|c:p&15|c<<4;e.ga&&(e.ga[18]=p,si(e))}void 0===b.xa&&(b.xa=null,this.Da("Type "+b.type+' "'+b.name+'" is fixed disk '+a,!0));Kl(this,b);b.Ua=d[g++];b.Xa=null;b.xa&&(a=d[g],void 0!==a&&0>b.xa.restore(a)&&(l=!1),l&&void 0!==b.Ua&&(b.Xa=b.xa.seek(b.Ne,b.Ra,b.eb+b.Pi)));return l};f.Xm=function(){for(var a=0,b=[],c=0;c<this.Ea.length;c++)b[a++]=this.Wm(this.Ea[c]);return b};
            f.Wm=function(a){var b=0,c=[];c[b++]=a.errorCode;c[b++]=a.Uo;c[b++]=a.Eg;c[b++]=a.qg;c[b++]=a.rg;c[b++]=a.Ra;c[b++]=a.Fb;c[b++]=a.Ne;c[b++]=a.eb;c[b++]=a.af;c[b++]=a.ob;c[b++]=a.Ua;c[b]=a.xa?a.xa.save():null;return c};f.Hn=function(a){var b;a=this.Ea[a];if(void 0!==a){b={};for(var c in a)b[c]=a[c]}return b};
            function Kl(a,b,c){if(b){var d=0,e=0;null==c&&((d=b.qg[2])?e=b.qg[0]<<8|b.qg[1]:c=b.type);null==c||d||(d=Fl[a.Sh][c][1],e=Fl[a.Sh][c][0]);d&&((c=Fl[a.Sh][b.type])&&e!=c[0]&&d!=c[1]&&a.Da("Warning: drive parameters ("+e+","+d+") do not match drive type "+b.type+" ("+c[0]+","+c[1]+")"),b.Eb=e,b.Fb=d,null==b.xa&&(b.xa=new il(a,b,b.mode)))}}
            f.So=function(a,b,c){if(a.xa){var d=a.xa.info(),e=d[0];if(e){var g=d[2],l=d[1]*g;if(b+c<=e*l)return a.Ne=Math.floor(b/l),b%=l,a.Ra=Math.floor(b/g),a.eb=b%g,a.ob=c*d[3],a.errorCode=0,!0}}return!1};
            f.xh=function(a){a||(this.Ff=0);for(var b=0;b<this.Ea.length;b++){var c=this.Ea[b];if(c.name&&c.path){if(!(a&&c.xa&&c.xa.dj)){var d;d=c.name;var c=c.path,e=this.Ea[b];e.$c?(this.Da("Drive "+b+" busy"),d=!0):(e.$c=!0,e.Pf=!0,this.Ff++,this.qa()&&this.ab("loading "+d),(e.xa||new il(this,e,e.mode)).load(d,c,null,this.up),d=!1);!d&&a&&ob(this,!1)}}else a&&void 0!==c.type&&(c.xa=null,Kl(this,c,c.type))}return!!this.Ff};
            f.up=function(a,b,c){a.$c=!1;(a.xa=b)&&this.Da('Mounted disk "'+c+'" in drive '+String.fromCharCode(67+a.rb),a.Pf);a.Pf&&(a.Pf=!1,--this.Ff||ob(this))};f.Hq=function(a,b){var c=0;this.Jb<this.pb&&(c=this.wc[this.Jb]);this.ja&&Yi(this.ja,5);this.wa&=-33;m(this,a,null,b,"DATA["+this.Jb+"]",c);++this.Jb>=this.pb&&(this.Jb=this.pb=0,this.wa&=-15);return c};
            f.gs=function(a,b,c){m(this,a,b,c,"DATA["+this.pb+"]");this.pb<this.wc.length&&(this.wc[this.pb++]=b);a=12!=this.wc[0]?6:this.wc.length;6==this.pb&&(this.wa&=-2);this.pb>=a&&(this.wa|=2,this.wa&=-2,Ll(this))};f.Iq=function(a,b){var c=this.wa;m(this,a,null,b,"STATUS",c);this.Jb<this.pb&&(this.wa|=1);return c};f.ks=function(a,b,c){m(this,a,b,c,"RESET");this.No=b;this.ja&&Yi(this.ja,5);this.ye()};f.Gq=function(a,b){m(this,a,null,b,"CONFIG",this.ah);return this.ah};
            f.js=function(a,b,c){m(this,a,b,c,"PULSE");this.Mo=b;this.wa=13};f.hs=function(a,b,c){m(this,a,b,c,"PATTERN");this.Lo=b};f.Lm=function(a,b,c){m(this,a,b,c,"NOISE")};
            f.Qp=function(a,b){var c=-1;if(this.Sa){var d=this,c=this.Zg(this.Sa,function(){});1==this.Sa.Ua?this.qa(1048832)&&m(this,a,null,b,"DATA["+this.Sa.Ua+"]",c):this.Sa.Ua==this.Sa.xb&&(this.Sa.ob-=this.Sa.xb,this.xf=this.xf-1&255,this.Sa.ob>=this.Sa.xb?(d.wa=136,this.Zg(this.Sa,function(a){0<=a?(Ml(d),d.wa=80):(d.wa=1,d.vf=16)},!1)):this.wa=80)}return c};
            f.qr=function(a,b,c){this.Sa&&this.Sa.ob>=this.Sa.xb&&(0>this.lh(this.Sa,b)?(this.wa=1,this.vf=16):1==this.Sa.Ua?this.qa(1048832)&&m(this,a,b,c,"DATA["+this.Sa.Ua+"]"):this.Sa.Ua==this.Sa.xb&&(this.Sa.ob-=this.Sa.xb,this.xf=this.xf-1&255,Ml(this),this.wa=80,this.Sa.ob>=this.Sa.xb&&(this.wa|=8)))};f.Sp=function(a,b){var c=this.vf;m(this,a,null,b,"ERROR",c);return c};f.vr=function(a,b,c){m(this,a,b,c,"WPREC");this.Oo=b};f.Tp=function(a,b){var c=this.xf;m(this,a,null,b,"SECCNT",c);return c};
            f.tr=function(a,b,c){m(this,a,b,c,"SECCNT");this.xf=b};f.Up=function(a,b){var c=this.uk;m(this,a,null,b,"SECNUM",c);return c};f.ur=function(a,b,c){m(this,a,b,c,"SECNUM");this.uk=b};f.Pp=function(a,b){var c=this.qk;m(this,a,null,b,"CYLLO",c);return c};f.pr=function(a,b,c){m(this,a,b,c,"CYLLO");this.qk=b};f.Op=function(a,b){var c=this.pk;m(this,a,null,b,"CYLHI",c);return c};f.or=function(a,b,c){m(this,a,b,c,"CYLHI");this.pk=b};f.Rp=function(a,b){var c=this.bh;m(this,a,null,b,"DRVHD",c);return c};
            f.rr=function(a,b,c){m(this,a,b,c,"DRVHD");this.bh=b;this.wa=this.Ea[this.bh&16?1:0]?this.wa|64:this.wa&-65};f.Vp=function(a,b){var c=this.wa;m(this,a,null,b,"STATUS",c);return c};f.nr=function(a,b,c){m(this,a,b,c,"COMMAND");this.Om=b;this.ja&&Yi(this.ja,14);Nl(this)};f.sr=function(a,b,c){m(this,a,b,c,"FDR");this.sk&4&&!(b&4)&&(this.vf=1);this.sk=b};
            function Nl(a){var b=!1,c=a.Om,d=a.bh&16?1:0,e=a.bh&15,g=a.qk|(a.pk&3)<<8,l=a.uk,p=a.xf||256;a.Sa=null;a.vf=0;a.wa=80;(d=a.Ea[d])?(d.Ne=g,d.Ra=e,d.eb=l,d.ob=p*d.xb,c=144<=c?c:c&240,d.Xa=null,d.Ua=0,d.errorCode=0,a.Sa=d):c=-1;switch(c&240){case 32:a.wa=136;a.Zg(d,function(b){0<=b&&a.ja?(Ml(a),a.wa=80):(a.wa=1,a.vf=16)},!1);break;case 48:a.wa=8;break;case 16:b=!0;break;case 64:b=!0;break;case 144:a.vf=1;b=!0;break;case 145:d.Fb=e+1,d.Mb=p,b=!0}b&&Ml(a)}
            function Ml(a){!a.ja||a.sk&2||Xi(a.ja,14,120)}
            function Ll(a){a.Jb=0;var b=a.Wa(),c=a.Wa(),d=c&32,e=d>>5,g=c&31,l=a.Wa(),p=a.Wa(),v=l<<2&768|p,w=l&63,F=a.Wa(),K=a.Wa(),J=a.Ea[e];J&&(J.Ne=v,J.Ra=g,J.eb=w,J.ob=F*J.xb);switch(b){case 3:a.gc(J?J.errorCode:4);a.sc(c);a.sc(l);a.sc(p);a.sc(0|d);b=-1;break;case 12:for(c=0;0<=(b=a.Wa());)J&&c<J.qg.length&&(J.qg[c++]=b);J&&Kl(a,J);b=0;J||a.Jg!=e||(a.Jg=-1,b=2);a.gc(b|d);b=-1;break;case 224:case 228:a.gc(0|d),b=-1}if(0<=b)switch(void 0===J?b=-1:(J.errorCode=0,J.Uo=0),b){case 0:a.gc(0|d);break;case 1:J.bu=
            K;a.gc(0|d);break;case 5:a.gc(0|d);break;case 8:Ol(a,J,function(b){a.gc(b|d)});break;case 10:Pl(a,J,function(b){a.gc(b|d)});break;case 15:Ql(a,J,function(b){a.gc(b|d)});break;default:a.gc(2|d)}}f.Wa=function(){var a=-1;this.Jb<this.pb&&(a=this.wc[this.Jb++]);return a};f.gc=function(a){this.Jb=this.pb=0;void 0!==a&&this.sc(a);this.ja&&Xi(this.ja,5);this.wa|=32};f.sc=function(a){this.wc[this.pb++]=a};f.fl=function(a,b,c){void 0===b||0>b?this.Zg(a,c):c(-1,!1)};
            f.gl=function(a,b){return void 0!==b&&0<=b?this.lh(a,b):-1};f.rp=function(a,b){var c;void 0!==b&&0<=b?(c=b,a.Ua<a.rg.length?a.rg[a.Ua++]=c:(a.errorCode=20,c=-1)):c=-1;return c};f.sp=function(a,b){return void 0!==b&&0<=b?this.$m(a,b):-1};function Ol(a,b,c){b.errorCode=4;if(b.xa&&(b.Xa=null,a.ja)){b.errorCode=0;Qi(a.ja,3,a,"dmaRead",b);Ji(a.ja,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}
            function Pl(a,b,c){b.errorCode=4;if(b.xa&&(b.Xa=null,a.ja)){b.errorCode=0;Qi(a.ja,3,a,"dmaWrite",b);Ji(a.ja,3,function(a){a||(0==b.errorCode&&(b.errorCode=4),20==b.errorCode&&(b.errorCode=0));c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}function Ql(a,b,c){b.errorCode=4;b.rg&&b.rg.length==b.ob||(b.rg=Array(b.ob));b.Ua=0;a.ja?(b.errorCode=0,Qi(a.ja,3,a,"dmaWriteBuffer",b),Ji(a.ja,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)})):c(b.errorCode?2:0)}
            f.Zg=function(a,b,c){var d=-1,e=null,g=0;if(a.errorCode)return b&&b(d,!1,e,g),d;var l=!1!==c?1:0;if(a.Xa&&(g=a.Ua,d=rl(a.Xa,a.Ua),a.Ua+=l,0<=d))return e=a.Xa,b&&b(d,!1,e,g),d;if(b){var p=this;if(a.xa)return a.xa.seek(a.Ne,a.Ra,a.eb+a.Pi,!1,function(c,w){(a.Xa=c)?(e=c,g=a.Ua=0,p.wh(a),d=rl(a.Xa,a.Ua),a.Ua+=l):a.errorCode=20;b(d,w,e,g)}),d;a.errorCode=20;b(d,!1,e,g)}return d};
            f.lh=function(a,b){if(a.errorCode)return-1;do{if(a.Xa&&a.xa.write(a.Xa,a.Ua++,b))break;a.xa&&a.xa.seek(a.Ne,a.Ra,a.eb+a.Pi,!0,function(b){a.Xa=b});if(!a.Xa){a.errorCode=20;b=-1;break}a.Ua=0;this.wh(a)}while(1);return b};f.wh=function(a){a.eb++;var b=1-a.Pi;a.eb>=a.Mb+b&&(a.eb=b,a.Ra++,a.Ra>=a.Fb&&(a.Ra=0,a.Ne++))};
            f.$m=function(a,b){if(a.errorCode)return-1;a.hd[a.ug++]=b;if(a.ug==a.hd.length){a.Ne=a.hd[0];a.Ra=a.hd[1];a.eb=a.hd[2];a.ob=128<<a.hd[3];for(var c=a.ug=0;c<a.ob;c++)if(0>this.lh(a,a.sn))return-1;a.Ri++}a.Ri>=a.af&&(b=-1);return b};f.Kq=function(){var a=this.O.H&255;!(this.O.F>>8)&&128<a&&(this.Jg=a-128);return!0};f.Lq=function(){var a;(a=this.O.F>>8||!this.ja)||(a=!(this.ja.ec[0].Wd&64));return a?!0:!1};
            var Hl={800:El.prototype.Hq,801:El.prototype.Iq,802:El.prototype.Gq},Gl={496:El.prototype.Qp,497:El.prototype.Sp,498:El.prototype.Tp,499:El.prototype.Up,500:El.prototype.Pp,501:El.prototype.Op,502:El.prototype.Rp,503:El.prototype.Vp},Jl={800:El.prototype.gs,801:El.prototype.ks,802:El.prototype.js,803:El.prototype.hs,807:El.prototype.Lm,811:El.prototype.Lm,815:El.prototype.Lm},Il={496:El.prototype.qr,497:El.prototype.vr,498:El.prototype.tr,499:El.prototype.ur,500:El.prototype.pr,501:El.prototype.or,
            502:El.prototype.rr,503:El.prototype.nr,1014:El.prototype.sr};Pa(function(){for(var a=kb(window.document,"pcjs","hdc"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new El(d);jb(d,c)}});
            function Rl(a){Ua.call(this,"Debugger",a,Rl);this.Ah=this.Nd=-1;this.vg=4;this.ko=65535;this.If=5;this.jo=1048575;this.od=Sl(this);this.Jn=Sl(this);this.sd=-1;this.gd=[];this.zg=!1;this.Nf=Sl(this);this.Sc=[];Tl(this);Ul(this);Vl(this,a.messages);this.Um=a.commands;var b=this;window?void 0===window.$&&(window.$=function(a){return Wl(b,a)}):void 0===global.$&&(global.$=function(a){return Wl(b,a)})}eb(Rl);
            var Xl={16:262144,19:524288,21:32768,22:65536,28:2048,33:134217728,51:33554432},Yl={"?":"help","a [#]":"assemble","b [#]":"breakpoint",c:"clear output","d [#]":"dump memory","e [#]":"edit memory",f:"frequencies","g [#]":"go [to #]","h [#]":"halt/history","i [#]":"input port #",k:"stack trace",l:"load sector(s)",m:"messages","o [#]":"output port #",p:"step over",r:"dump/edit registers","t [#]":"step instruction(s)","u [#]":"unassemble",x:"execution options",reset:"reset computer",ver:"display version"},
            Zl="INVALID AAA AAD AAM AAS ADC ADD AND ARPL AS: BOUND BSF BSR BT BTC BTR BTS CALL CBW CLC CLD CLI CLTS CMC CMP CMPSB CMPSW CS: CWD DAA DAS DEC DIV DS: ENTER ES: ESC FADD FBLD FBSTP FCOM FCOMP FDIV FDIVR FIADD FICOM FICOMP FIDIV FIDIVR FILD FIMUL FIST FISTP FISUB FISUBR FLD FLDCW FLDENV FMUL FNSAVE FNSTCW FNSTENV FNSTSW FRSTOR FS: FST FSTP FSUB FSUBR GS: HLT IDIV IMUL IN INC INS INT INT3 INTO IRET JBE JC JCXZ JG JGE JL JLE JMP JA JNC JNO JNP JNS JNZ JO JP JS JZ LAHF LAR LDS LEA LEAVE LES LFS LGDT LGS LIDT LLDT LMSW LOADALL LOCK LODSB LODSW LOOP LOOPNZ LOOPZ LSL LSS LTR MOV MOVSB MOVSW MOVSX MOVZX MUL NEG NOP NOT OR OS: OUT OUTS POP POPA POPF PUSH PUSHA PUSHF RCL RCR REPNZ REPZ RET RETF ROL ROR SAHF SALC SAR SBB SCASB SCASW SETBE SETC SETG SETGE SETL SETLE SETNBE SETNC SETNO SETNP SETNS SETNZ SETO SETP SETS SETZ SGDT SHL SHLD SHR SHRD SIDT SLDT SMSW SS: STC STD STI STOSB STOSW STR SUB TEST VERR VERW WAIT XCHG XLAT XOR".split(" "),
            $l=[8086,80186,80286,80386],am="AL CL DL BL AH CH DH BH AX CX DX BX SP BP SI DI ES CS SS DS FS GS IP PS EAX ECX EDX EBX ESP EBP ESI EDI CR0 CR1 CR2 CR3".split(" "),bm="BX+SI BX+DI BP+SI BP+DI SI DI BP BX EAX ECX EDX EBX ESP EBP ESI EDI".split(" "),cm={cpu:1,seg:2,desc:4,tss:8,"int":16,fault:32,bus:64,mem:128,port:256,dma:512,pic:1024,timer:2048,cmos:4096,rtc:8192,8042:16384,chipset:32768,keyboard:65536,key:131072,video:262144,fdc:524288,hdc:1048576,disk:2097152,serial:4194304,speaker:8388608,state:16777216,
            mouse:33554432,computer:67108864,dos:134217728,data:268435456,log:536870912,warn:1073741824,halt:-2147483648},dm=[0,0],em=[205,12291],fm=[[6,12417,4257],[6,12420,4260],[6,12449,4225],[6,12452,4228],[6,12385,4097],[6,14436,4100],[136,4211],[133,8307],[129,12417,4257],[129,12420,4260],[129,12449,4225],[129,12452,4228],[129,12385,4097],[129,14436,4100],[136,4467],[133,8563],[5,12417,4257],[5,12420,4260],[5,12449,4225],[5,12452,4228],[5,12385,4097],[5,14436,4100],[136,4723],[133,8819],[150,12417,4257],
            [150,12420,4260],[150,12449,4225],[150,12452,4228],[150,12385,4097],[150,14436,4100],[136,4979],[133,9075],[7,12417,4257],[7,12420,4260],[7,12449,4225],[7,12452,4228],[7,12385,4097],[7,14436,4100],[35,15],[29],[184,12417,4257],[184,12420,4260],[184,12449,4225],[184,12452,4228],[184,12385,4097],[184,14436,4100],[27,15],[30],[191,12417,4257],[191,12420,4260],[191,12449,4225],[191,12452,4228],[191,12385,4097],[191,14436,4100],[177,15],[1],[24,4225,4257],[24,4228,4260],[24,4257,4225],[24,4260,4228],[24,
            4193,4097],[24,6244,4100],[33,15],[4],[74,14436],[74,14692],[74,14948],[74,15204],[74,15460],[74,15716],[74,15972],[74,16228],[31,14436],[31,14692],[31,14948],[31,15204],[31,15460],[31,15716],[31,15972],[31,16228],[136,6244],[136,6500],[136,6756],[136,7012],[136,7268],[136,7524],[136,7780],[136,8036],[133,10340],[133,10596],[133,10852],[133,11108],[133,11364],[133,11620],[133,11876],[133,12132],[137,32768],[134,32768],[10,37028,4232],[8,8323,4259],[64,49167],[69,49167],[130,49167],[9,49167],[136,
            36868],[72,45219,4235],[136,36866],[72,45219,4234],[75,41041,6756],[75,41044,6756],[132,39524,4161],[132,39524,4164],[94,4145],[90,4145],[81,4145],[89,4145],[97,4145],[93,4145],[80,4145],[88,4145],[96,4145],[92,4145],[95,4145],[91,4145],[85,4145],[84,4145],[86,4145],[83,4145],[192,12417,4097],[193,12420,4100],[192,12417,4097],[194,12420,4097],[185,4225,4257],[185,4228,4260],[189,12449,12417],[189,12452,12420],[120,8321,4257],[120,8324,4260],[120,8353,4225],[120,8356,4228],[120,8324,4275],[101,8356,
            148],[120,8371,4228],[133,8324],[127],[189,14436,14692],[189,14436,14948],[189,14436,15204],[189,14436,15460],[189,14436,15716],[189,14436,15972],[189,14436,16228],[18],[28],[17,4103],[188],[138],[135],[147],[98],[120,8289,4129],[120,10340,4132],[120,8225,4193],[120,8228,6244],[121,8273,4161],[122,8276,4164],[25,4177,4161],[26,4180,4164],[185,4193,4097],[185,6244,4100],[181,8273,4193],[182,8276,6244],[112,8289,4161],[113,10340,4164],[151,4193,4177],[152,6244,4180],[120,8289,4097],[120,8545,4097],
            [120,8801,4097],[120,9057,4097],[120,9313,4097],[120,9569,4097],[120,9825,4097],[120,10081,4097],[120,10340,4100],[120,10596,4100],[120,10852,4100],[120,11108,4100],[120,11364,4100],[120,11620,4100],[120,11876,4100],[120,12132,4100],[195,28801,4097],[196,28804,4097],[143,4099],[143],[103,8356,4246],[100,8356,4246],[120,8321,4097],[120,8324,4100],[34,36867,4097],[102,32768],[144,4099],[144],[77],[76,4097],[78],[79],[197,12417,4113],[198,12420,4113],[199,12417,4449],[200,12420,4449],[3,1],[2,1],[148],
            [190],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[36,4228],[115,4145],[116,4145],[114,4145],[82,4145],[73,8289,4097],[73,10340,4097],[131,4097,4193],[131,4097,6244],[17,4148],[87,4148],[87,4103],[87,4145],[73,8289,6756],[73,10340,6756],[131,6756,4193],[131,6756,6244],[111,15],[0],[141,15],[142,15],[70],[23],[201,12417],[202,12420],[19],[178],[21],[180],[20],[179],[203,12417],[204,12420]],gm={0:[206,12419],1:[207,12419],2:[99,41123,4243],3:[117,41123,4243],5:[110,32768],
            6:[22,32768],32:[120,57509,4309],34:[120,57557,4261],128:[94,53300],129:[90,53300],130:[81,53300],131:[89,53300],132:[97,53300],133:[93,53300],134:[80,53300],135:[88,53300],136:[96,53300],137:[92,53300],138:[95,53300],139:[91,53300],140:[85,53300],141:[84,53300],142:[86,53300],143:[83,53300],144:[165,57473],145:[161,57473],146:[154,57473],147:[160,57473],148:[168,57473],149:[164,57473],150:[153,57473],151:[159,57473],152:[167,57473],153:[163,57473],154:[166,57473],155:[162,57473],156:[157,57473],
            157:[156,57473],158:[158,57473],159:[155,57473],160:[136,54387],161:[133,58483],163:[13,53380,4260],164:[171,57476,4260,4097],165:[171,57476,4260,4449],168:[136,54643],169:[133,58739],171:[16,57476,4260],172:[173,57476,4260,4097],173:[173,57476,4260,4449],175:[72,61572,4260],178:[118,8356,4246],179:[15,57476,4260],180:[104,8356,4246],181:[106,8356,4246],182:[124,57508,4225],183:[124,57509,4227],186:[208,61572,4097],187:[14,57476,4260],188:[11,57508,4228],189:[12,57508,4228],190:[123,57508,4225],191:[123,
            57509,4227]},hm=[[[6,12417,4097],[129,12417,4097],[5,12417,4097],[150,12417,4097],[7,12417,4097],[184,12417,4097],[191,12417,4097],[24,4225,4097]],[[6,12420,4100],[129,12420,4100],[5,12420,4100],[150,12420,4100],[7,12420,4100],[184,12420,4100],[191,12420,4100],[24,4228,4100]],[[6,12420,4098],[129,12420,4098],[5,12420,4098],[150,12420,4098],[7,12420,4098],[184,12420,4098],[191,12420,4098],[24,4228,4098]],[[145,45185,4097],[146,45185,4097],[139,45185,4097],[140,45185,4097],[170,45185,4097],[172,45185,
            4097],dm,[149,45185,4097]],[[145,45188,4097],[146,45188,4097],[139,45188,4097],[140,45188,4097],[170,45188,4097],[172,45188,4097],dm,[149,45188,4097]],[[145,12417,4113],[146,12417,4113],[139,12417,4113],[140,12417,4113],[170,12417,4113],[172,12417,4113],dm,[149,12417,4113]],[[145,12420,4113],[146,12420,4113],[139,12420,4113],[140,12420,4113],[170,12420,4113],[172,12420,4113],dm,[149,12420,4113]],[[145,12417,4449],[146,12417,4449],[139,12417,4449],[140,12417,4449],[170,12417,4449],[172,12417,4449],
            dm,[149,12417,4449]],[[145,12420,4449],[146,12420,4449],[139,12420,4449],[140,12420,4449],[170,12420,4449],[172,12420,4449],dm,[149,12420,4449]],[[185,4225,4097],dm,[128,12417],[126,12417],[125,4225],[72,12417],[32,4225],[71,12417]],[[185,4228,4100],dm,[128,12420],[126,12420],[125,4228],[72,12420],[32,4228],[71,12420]],[[74,12417],[31,12417],dm,dm,dm,dm,dm,dm],[[74,12420],[31,12420],[17,4228],[17,4231],[87,4228],[87,4231],[136,4228],dm],[],[[175,41091],[183,41091],[108,36995],[119,36995],[186,36995],
            [187,36995],dm,dm],[[169,41091],[174,41091],[105,36995],[107,36995],[176,41091],dm,[109,36995],dm],[dm,dm,dm,dm,[13,53380,4097],[16,57476,4097],[15,57476,4097],[14,57476,4097]]],im={19:{0:"disk reset",1:"get status",2:"read drive DL (CH:DH:CL,AL) into ES:BX",3:"write drive DL (CH:DH:CL,AL) from ES:BX",4:"verify drive DL (CH:DH:CL,AL)",5:"format drive DL using ES:BX",8:"read drive DL parameters into ES:DI",21:"get drive DL DASD type",22:"get drive DL change line status",23:"set drive DL DASD type",
            24:"set drive DL media type"},21:{128:"open device",129:"close device",130:"program termination",131:"wait CX:DXus for event",132:"joystick support",133:"SYSREQ pressed",134:"wait CX:DXus",135:"move block (CX words)",136:"get extended memory size",137:"processor to virtual mode",144:"device busy loop",145:"interrupt complete flag set"},33:{0:"terminate program",1:"read character (al) from stdin with echo",2:"write character DL to stdout",3:"read character (al) from stdaux",4:"write character DL to stdaux",
            5:"write character DL to stdprn",6:"direct console output (input if DL=FF)",7:"direct console input without echo",8:"read character (al) from stdin without echo",9:"write $-terminated string DS:DX to stdout",10:"buffered input (ds:dx)",11:"get stdin status",12:"flush buffer and read stdin",13:"disk reset",14:"select default drive DL",15:"open file using fcb DS:DX",16:"close file using fcb DS:DX",17:"find first matching file using fcb DS:DX",18:"find next matching file using fcb DS:DX",19:"delete file using fcb DS:DX",
            20:"sequential read from file using fcb DS:DX",21:"sequential write to file using fcb DS:DX",22:"create or truncate file using fcb DS:DX",23:"rename file using fcb DS:DX",25:"get current default drive (al)",26:"set disk transfer area (dta) DS:DX",27:"get allocation information for default drive",28:"get allocation information for specific drive DL",31:"get drive parameter block for default drive",33:"read random record from file using fcb DS:DX",34:"write random record to file using fcb DS:DX",35:"get file size using fcb DS:DX",
            36:"set random record number for fcb DS:DX",37:"set address DS:DX of interrupt vector AL",38:"create new program segment prefix (psp) at segment DX",39:"random block read from file using fcb DS:DX",40:"random block write to file using fcb DS:DX",41:"parse filename DS:SI into fcb ES:DI using AL",42:"get system date (year=cx, mon=dh, day=dl)",43:"set system date (year=CX, mon=DH, day=DL)",44:"get system time (hour=ch, min=cl, sec=dh, 100ths=dl)",45:"set system time (hour=CH, min=CL, sec=DH, 100ths=DL)",
            46:"set verify flag AL",47:"get disk transfer area address (es:bx)",48:"get DOS version (al=major, ah=minor)",49:"terminate and stay resident",50:"get drive parameter block (dpb=ds:bx) for drive DL",51:"extended break check",52:"get address (es:bx) of InDOS flag",53:"get address (es:bx) of interrupt vector AL",54:"get free disk space of drive DL",55:"get(0)/set(1) switch character DL (AL)",56:"get country-specific information",57:"create subdirectory DS:DX",58:"remove subdirectory DS:DX",59:"set current directory DS:DX",
            60:"create or truncate file DS:DX with attributes CX",61:"open existing file DS:DX with mode AL",62:"close file BX",63:"read CX bytes from file BX into buffer DS:DX",64:"write CX bytes to file BX from buffer DS:DX",65:"delete file DS:DX",66:"set position CX:DX of file BX relative to AL",67:"get(0)/set(1) attributes CX of file DS:DX (AL)",68:"get device information (IOCTL)",69:"duplicate file handle BX",70:"force file handle CX to duplicate file handle BX",71:"get current directory (ds:si) for drive DL",
            72:"allocate memory segment with BX paragraphs",73:"free memory segment ES",74:"resize memory segment ES to BX paragraphs",75:"load program DS:DX using parameter block ES:BX",76:"terminate with return code AL",77:"get return code (al)",78:"find first matching file DS:DX with attributes CX",79:"find next matching file",80:"set current psp BX",81:"get current psp (bx)",82:"get system variables (es:bx)",83:"translate bpb DS:SI to dpb (es:bp)",84:"get verify flag (al)",85:"create child psp at segment DX",
            86:"rename file DS:DX to name ES:DI",87:"get(0)/set(1) file date DX and time CX (AL)",88:"get(0)/set(1) memory allocation strategy (AL)",89:"get extended error information",90:"create temporary file DS:DX with attributes CX",91:"create file DS:DX with attributes CX",92:"lock(0)/unlock(1) file BX region CX:DX length SI:DI (AL)"}};f=Rl.prototype;
            f.Kc=function(a,b,c,d){this.ma=b;this.O=c;this.Fa=a;this.Gp=xb(a,"FDC");this.ao=xb(a,"HDC");this.If=b.Be>>2;this.jo=b.Vh;this.th=fm;80186<=this.O.ka&&(this.th=fm.slice(),this.th[15]=dm,80286<=this.O.ka&&(this.th[15]=em,this.O.ka>=Lb&&(this.vg=8,this.ko=-1)));hi(this,64,function(){d.R("id       physaddr   blkaddr   used    size    type");d.R("-------- ---------  --------  ------  ------  ----");for(var a=0;a<d.O.na.length;a++){var b=d.O.Se[a];b.type!==zc&&d.R(h(b.id)+" %"+h(a<<d.O.Ca)+": "+h(b.Ba)+
            "  "+ga(b.gg)+"  "+ga(b.size)+"  "+Fc[b.type])}});hi(this,4,function(a){if(a){var b=jm(d,a);if(void 0===b)d.R("invalid selector: "+a);else if(a=km(d,b),d.R("dumpDesc("+ga(a?a.ia:b)+"): %"+h(a?a.Ed:null,d.If)),a){var c,b=!1;if(a.type&4096)a.type&2048?(c="code"+(a.type&512?",readable":",execonly"),a.type&1024&&(c+=",conforming")):(c="data"+(a.type&512?",writable":",readonly"),a.type&1024&&(c+=",expdown")),a.type&256&&(c+=",accessed");else switch(a.type){case 256:c="tss";break;case 512:c="ldt";break;
            case 768:c="busy tss";break;case 1024:c="call gate";b=!0;break;case 1280:c="task gate";b=!0;break;case 1536:c="int gate";b=!0;break;case 1792:c="trap gate",b=!0}!c||a.Rb&32768||(c+=",not present");d.R((b?"seg="+ga(a.ya&65535)+" off="+ga(a.gb):"base="+h(a.ya,d.If)+" limit="+h(a.gb,a.gb&-65536?8:4))+" type="+k(a.type>>8)+" ("+c+") ext="+ga(a.Lh&-65296)+" dpl="+k(a.Bc))}}else d.R("no selector")});hi(this,8,function(a){a:{if(a){var b=jm(d,a);if(void 0===b){d.R("invalid task selector: "+a);break a}a=km(d,
            b)}else a=d.O.cb;d.R("dumpTSS("+ga(a?a.ia:b)+"): %"+h(a?a.ya:null,d.If));if(a){var b="",c;for(c in lm){var p=lm[c],v=8>c.length?" ":"",w=a.ya+p,w=jf(d.O,w)|jf(d.O,w+1)<<8;b&&(b+="\n");b+=ga(p)+" "+c+": "+v+ga(w)}d.R(b)}}});hi(this,134217728,function(a){if(a)for(d.R("dumpDOS("+a+")"),a=jm(d,a);a;){var b=Sl(d,0,a),c=d.Qa(b,1),p=d.ra(b,2),v=d.ra(b,5);if(77!=c&&90!=c)break;d.R(jh(0,a)+": '"+String.fromCharCode(c)+"' PID="+ga(p)+" LEN="+ga(v)+' "'+mm(d,b)+'"');a+=1+v}else d.R("no MCB")});ob(this)};
            f.Nb=function(a,b,c){var d=this;switch(b){case "debugInput":return this.Hh=this.va[b]=c,c.onkeydown=function(a){var b;if(13==a.keyCode){b=c.value;c.value="";var l=nm(d,b,!0),p;for(p in l)Wl(d,l[p])}else 27==a.keyCode?c.value=b="":(38==a.keyCode?d.sd<d.gd.length-1&&(b=d.gd[++d.sd]):40==a.keyCode&&(0<d.sd?b=d.gd[--d.sd]:(b="",d.sd=-1)),null!=b&&(l=b.length,c.value=b,c.setSelectionRange(l,l)));null!=b&&a.preventDefault&&a.preventDefault()},!0;case "debugEnter":return this.va[b]=c,Ka(c,function(){if(d.Hh){var a=
            d.Hh.value;d.Hh.value="";var a=nm(d,a,!0),b;for(b in a)Wl(d,a[b]);return!0}return!1}),!0;case "step":return this.va[b]=c,Ka(c,function(a){var b=!1;nb(d,!0)||(mb(d,!0),b=d.kh(a?1:0),mb(d,!1));return b}),!0}return!1};f.ed=function(){this.Hh&&this.Hh.focus()};
            function km(a,b){if(b===Mb(a.O))return a.O.ta;if(b===a.O.bb.ia)return a.O.bb;if(b===a.O.Ma.ia)return a.O.Ma;if(b===a.O.ua.ia)return a.O.ua;if(a.O.ka>=Lb){if(b===a.O.xc.ia)return a.O.xc;if(b===a.O.yc.ia)return a.O.yc}if(a.yl)return null;var c=new qd(a.O,7,"DBG");c.load(b,!0);return c}f.$b=function(a,b,c){var d=a.Ba;if(null==d){var d=n,e=km(this,a.ia);e&&(d=b?e.oc(a.za,c||1,!0):e.Ac(a.za,c||1,!0),a.Ba=d)}return d};
            f.Qa=function(a,b){var c=255,d=this.$b(a,!1,1);d!==n&&(c=jf(this.O,d)|0,b&&om(this,a,b));return c};f.qc=function(a,b){return a.ad?this.fe(a,b?4:0):this.ra(a,b?2:0)};f.ra=function(a,b){var c=65535,d=this.$b(a,!1,2);d!==n&&(c=jf(this.O,d)|jf(this.O,d+1)<<8,b&&om(this,a,b));return c};f.fe=function(a,b){var c=-1,d=this.$b(a,!1,4);d!==n&&(c=jf(this.O,d)|jf(this.O,d+1)<<8|jf(this.O,d+2)<<16|jf(this.O,d+3)<<24,b&&om(this,a,b));return c};
            f.dd=function(a,b,c){var d=this.$b(a,!0,1);d!==n&&(this.O.dd(d,b),c&&om(this,a,c),Zc(this.O))};f.Kb=function(a,b,c){var d=this.$b(a,!0,2);d!==n&&(this.O.Kb(d,b),c&&om(this,a,c),Zc(this.O))};function Sl(a,b,c,d,e,g){void 0===e&&(e=a.O&&4==a.O.ta.pa);void 0===g&&(g=a.O&&4==a.O.ta.Hd);return{za:b||0,ia:c,Ba:d,Fg:!1,ad:e||!1,Zc:g||!1}}function pm(a){return[a.za,a.ia,a.Ba,a.Fg,a.ad,a.Zc,a.nl,a.we]}function qm(a){return{za:a[0],ia:a[1],Ba:a[2],Fg:a[3],ad:a[4],Zc:a[5],nl:a[6],we:a[7]}}
            function rm(a,b){if(null!=b.ia){var c=km(a,b.ia);if(!c||b.za>c.gb)b.za=0,b.Ba=null}}function om(a,b,c){c=c||1;null!=b.Ba&&(b.Ba+=c);null!=b.ia&&(b.za+=c,rm(a,b))}function jh(a,b,c){return null!=b?h(b,4)+":"+h(a,a&-65536||c?8:4):h(a)}function sm(a){return null==a.ia?"%"+h(a.Ba):jh(a.za,a.ia,a.Zc)}function mm(a,b){var c,d="";for(c=8;d.length<c;){var e=a.Qa(b,1);if(!e)break;d+=32<=e&&128>e?String.fromCharCode(e):"."}return d}
            var lm={PREV_TSS:0,CPL0_SP:2,CPL0_SS:4,CPL1_SP:6,CPL1_SS:8,CPL2_SP:10,CPL2_SS:12,TASK_IP:14,TASK_PS:16,TASK_AX:18,TASK_CX:20,TASK_DX:22,TASK_BX:24,TASK_SP:26,TASK_BP:28,TASK_SI:30,TASK_DI:32,TASK_ES:34,TASK_CS:36,TASK_SS:38,TASK_DS:40,TASK_LDT:42};
            function tm(a,b){var c="",d=10,e=a.Kg,g=a.We;if(g.length){var l=void 0===b?a.zo:+b;isNaN(l)?l=d:c="more ";l>g.length&&(a.R("note: only "+g.length+" available"),l=g.length);e-=l;0>e&&(null!=g[g.length-1][1]?e+=g.length:(l=e+l,e=0));for(void 0!==b&&a.R(l+" instructions earlier:");d&&e!=a.Kg;){var p=g[e++];if(null==p.ia)break;p=Sl(a,p.za,p.ia,p.Ba);a.R(um(a,p,"history",l--));p.nl&&(e++,l--);e>=g.length&&(e=0);a.zo=l;d--}}10==d&&(a.R("no "+c+"history available"),a.zo=void 0)}
            function Vl(a,b){a.Y=a;a.Yb=a.fp=1073741824;a.xk=null;a.Nk=[];var c=nm(a,b.replace("keys","key").replace("kbd","keyboard"));if(c.length)for(var d in cm)0<=ya(c,d)&&(a.Yb|=cm[d],a.R(d+" messages enabled"))}function hi(a,b,c){for(var d in cm)if(b==cm[d]){a.Nk[d]=c;break}}
            function vm(a,b){var c="??";if(0<=b){var d,e,g=a.O;switch(b){case 0:d=g.F;e=2;break;case 1:d=g.G;e=2;break;case 2:d=g.H;e=2;break;case 3:d=g.D;e=2;break;case 4:d=g.F>>8;e=2;break;case 5:d=g.G>>8;e=2;break;case 6:d=g.H>>8;e=2;break;case 7:d=g.D>>8;e=2;break;case 8:d=g.F;e=4;break;case 9:d=g.G;e=4;break;case 10:d=g.H;e=4;break;case 11:d=g.D;e=4;break;case 12:d=r(g);e=4;break;case 13:d=g.L;e=4;break;case 14:d=g.K;e=4;break;case 15:d=g.J;e=4;break;case 22:d=q(g);e=a.vg;break;case 23:d=Nb(g);e=a.vg;break;
            case 16:d=g.Ma.ia;e=4;break;case 17:d=Mb(g);e=4;break;case 18:d=g.ua.ia;e=4;break;case 19:d=g.bb.ia,e=4}if(!e)if(80286==a.O.ka)32==b&&(d=g.hb,e=4);else if(a.O.ka>=Lb)switch(b){case 24:d=g.F;e=8;break;case 25:d=g.G;e=8;break;case 26:d=g.H;e=8;break;case 27:d=g.D;e=8;break;case 28:d=r(g);e=8;break;case 29:d=g.L;e=8;break;case 30:d=g.K;e=8;break;case 31:d=g.J;e=8;break;case 32:d=g.hb;e=8;break;case 33:d=g.ki;e=8;break;case 34:d=g.Yf;e=8;break;case 35:d=g.uf;e=8;break;case 20:d=g.xc.ia;e=4;break;case 21:d=
            g.yc.ia,e=4}e&&(c=h(d,e))}return c}f=Rl.prototype;f.message=function(a,b){b&&(a+=" @"+jh(q(this.O),Mb(this.O)));if(!this.xk||a!=this.xk)if(this.R(a),this.xk=a,this.O){this.Yb&-2147483648&&this.zb();var c=this.O;c.T.Qg=0;c.ud-=c.A;c.A=0;Zc(c)}};
            function Ee(a,b,c){var d,e=!1,g=Xl[b];g&&(d=a.O.F>>8,e=a.qa(g)?!0:524288==g&&a.qa(g=1048576));if(e){var l=a.O.H&255;if(33==b&&11==d||524288==g&&128<=l||1048576==g&&128>l)e=!1}if(e){if(g=(g=im[b])&&g[d]||""){for(var p=g,g=0;g<am.length;g++)if(l=am[g],0<=p.indexOf(l)){var v=vm(a,g),w={};w[l]=v;p=la(w,p)}g=" "+p}a.message("INT "+k(b)+": AH="+k(d)+" @"+jh(c-2-a.O.ta.ya,Mb(a.O))+g)}return e}
            function Ge(a,b,c,d,e){a.message("INT "+k(b)+": C="+(Re(a.O)?1:0)+(e||"")+" (cycles="+d+(c?",level="+(c+1):"")+")")}function lb(a,b,c,d,e,g,l,p){p|=256;if(null==e||(a.Yb&p)==p)p=null,null!=e&&(p=Mb(a.O),e-=a.O.ta.ya),a.message(b.Lg+"."+(null!=d?"outPort":"inPort")+"("+ga(c)+","+(g?g:"unknown")+(null!=d?","+k(d):"")+")"+(null!=l?": "+k(l):"")+(null!=e?" @"+jh(e,p):""))}
            f.Jq=function(){this.R("Type ? for list of debugger commands");this.zd();if(this.Um){var a=nm(this,this.Um);delete this.Um;for(var b in a)Wl(this,a[b])}};function Ul(a){var b;if(rf(a)){if(!a.We||!a.We.length){a.We=Array(1E4);for(b=0;b<a.We.length;b++)a.We[b]=Sl(a);a.Kg=0}if(!a.Dd||!a.Dd.length)for(a.Dd=Array(256),b=0;b<a.Dd.length;b++)a.Dd[b]=[b,0]}else a.Kg=0,a.We=[],a.Dd=[]}f.ag=function(a){if(!wm(this))return!1;this.O.ag(a);return!0};
            f.kh=function(a,b,c){if(!wm(this))return!1;this.Nd=0;do{a||rf(this)&&vf(this,this.O.sa,0);try{var d=this.O.kh(a);0<d&&(this.Nd+=d,id(this.O,d,!0),ad(this.O,d),this.Ah++)}catch(e){this.Nd=0,qb(this.O,e.stack||e.message)}}while(this.O.S&12528);!1!==c&&Zc(this.O);this.zd(b||!1,!1);return 0<this.Nd};f.zb=function(a){this.O&&this.O.zb(a)};f.zd=function(a,b){void 0===a&&(a=!0);void 0===b&&(b=!0);this.od=Sl(this,q(this.O),Mb(this.O));a&&1!=this.Jc?xm(this,null,b):ym(this)};
            function wm(a){var b;if(b=a.O&&pb(a.O))b=a.O,b.fa.jc?b=!0:(b.R(b.toString()+" not powered"),b=!1);b&&!nb(a.O)?(a=a.O,a.fa.Ld?(a.R(a.toString()+" error"),a=!0):a=!1,a=!a):a=!1;return a}f.lc=function(a,b){return!b&&(this.reset(!0),a&&this.restore&&!this.restore(a))?!1:!0};f.kc=function(a,b){b&&this.R(a?"suspending":"shutting down");return a&&this.save?this.save():!0};
            f.reset=function(a){Ul(this);this.Ah=0;this.xk=null;this.Nd=0;this.od=Sl(this,q(this.O),Mb(this.O));void 0===this.fa.qb||a||this.R("reset");this.fa.qb=!1;zm(this);a||this.zd()};f.save=function(){var a=new Je(this);a.set(0,pm(this.od));a.set(1,pm(this.Nf));a.set(2,[this.gd,this.zg,this.Yb]);return a.data()};f.restore=function(a){var b=0;void 0!==a[2]&&(this.od=qm(a[b++]),this.Nf=qm(a[b++]),this.gd=a[b][0],"string"==typeof this.gd&&(this.gd=[this.gd]),this.zg=a[b][1],this.Yb||(this.Yb=a[b][2]));return!0};
            f.start=function(a,b){this.Jc||this.R("running");this.fa.qb=!0;this.Wq=a;this.Od=b};f.stop=function(a,b){if(this.fa.qb){this.fa.qb=!1;this.Nd=b-this.Od;if(!this.Jc){var c="stopped";if(this.Nd){var d=a-this.Wq,e=0<d?Math.round(1E3*this.Nd/d):0,c=c+" (";rf(this)&&(c+=this.Ah+" ops, ",this.Ah=0);c+=this.Nd+" cycles, "+d+" ms, "+e+" hz)"}this.R(c)}this.zd(!0,2!=this.Jc);this.ed();zm(this,this.O.sa)}};function rf(a){return 1<a.Mc.length||a.qa(16)}
            function vf(a,b,c){if(0<c&&(Am(a,b,a.Mc)||3==a.O.ta.Pa&&!(a.O.aa&Qb)))return!0;0<=c&&a.Dd.length&&(a.Ah++,c=jf(a.O,b),null!=c&&(a.Dd[c][1]++,c=a.We[a.Kg],c.za=q(a.O),c.ia=Mb(a.O),c.Ba=b,++a.Kg==a.We.length&&(a.Kg=0)));return!1}function Pc(a,b){return Am(a,b,a.Re)?(a.zb(!0),!0):!1}function Qc(a,b){return Am(a,b,a.Bd)?(a.zb(!0),!0):!1}function qc(a,b,c){a.R("break on input from port "+ga(b)+": "+k(c));a.zb(!0)}function uc(a,b,c){a.R("break on output to port "+ga(b)+": "+k(c));a.zb(!0)}
            function Tl(a){var b;a.Mc=["exec"];if(void 0!==a.Re)for(b=1;b<a.Re.length;b++){var c=a.ma,d=a.$b(a.Re[b]);Sc(c.na[d>>>c.Ca],!1)}a.Re=["read"];if(void 0!==a.Bd)for(b=1;b<a.Bd.length;b++)c=a.ma,d=a.$b(a.Bd[b]),Sc(c.na[d>>>c.Ca],!0);a.Bd=["write"];a.yl=0}f.Xe=function(a,b,c){if(!Bm(this,a,b)){b.Fg=c;a.push(b);if(a!=this.Mc){var d=this.ma,e=this.$b(b);d.na[e>>>d.Ca].Xe(e&d.Ga,a==this.Bd)}c?b.ia=null:this.R("breakpoint enabled: "+sm(b)+" ("+a[0]+")");Ul(this);return!0}return!1};
            function Bm(a,b,c,d){var e=!1;c=Cm(a,a.$b(c));for(var g=1;g<b.length;g++){var l=b[g];if(c==Cm(a,a.$b(l))){e=!0;if(d){b.splice(g,1);b!=a.Mc&&(d=a.ma,Sc(d.na[c>>>d.Ca],b==a.Bd));l.Fg||a.R("breakpoint cleared: "+sm(l)+" ("+b[0]+")");Ul(a);break}a.R("breakpoint exists: "+sm(l)+" ("+b[0]+")");break}}return e}function Dm(a,b){for(var c=1;c<b.length;c++)a.R("breakpoint enabled: "+sm(b[c])+" ("+b[0]+")");return b.length-1}
            function Vc(a,b,c,d){if(void 0===d)Vc(a,b,c,a.Re),Vc(a,b,c,a.Bd);else for(var e=1;e<d.length;e++){var g=a.$b(d[e]);if(g>=b&&g<b+c){var l=a.ma;l.na[g>>>l.Ca].Xe(g&l.Ga,d==a.Bd)}}}function zm(a,b){if(void 0!==b)Am(a,b,a.Mc,!0),a.Jc=0;else for(var c=1;c<a.Mc.length;c++){var d=a.Mc[c];if(d.Fg){if(!Bm(a,a.Mc,d,!0))break;c=0}}}function Cm(a,b){var c=a.jo&-65536;(b&c)==c&&(b&=1048575);return b}
            function Am(a,b,c,d){var e=!1;if(!a.yl++){b=Cm(a,b);a.qa(-2147483632)&&204==jf(a.O,b)&&(e=!0);for(var g=1;!e&&g<c.length;g++){var l=c[g];null!=l.ia&&(l.Ba=null);b==Cm(a,a.$b(l))&&(l.Fg?Bm(a,c,l,!0):d||a.R("breakpoint hit: "+sm(l)+" ("+c[0]+")"),e=!0)}}a.yl--;return e}
            function um(a,b,c,d){for(var e=Sl(a,b.za,b.ia,b.Ba),g=a.Qa(b,1),l=2;(102==g||103==g)&&l--;)102==g?b.ad=!b.ad:b.Zc=!b.Zc,g=a.Qa(b,1);var l=a.th[g],p=l[0],v=-1;205==p&&(p=a.Qa(b,1),l=gm[p]||dm,g|=p<<8,p=l[0]);p>=Zl.length&&(v=a.Qa(b,1),l=hm[p-Zl.length][v>>3&7]);var p=Zl[l[0]],w=l.length-1,F="";if(164<=g&&167>=g||170<=g&&175>=g)w=0,b.ad&&"W"==p.slice(-1)&&(p=p.slice(0,-1)+"D");for(var g=null,K=!0,J=1;J<=w;J++){var I,T;I="";T=l[J];if(void 0!==T){null==g&&(g=T>>14);var Z=T&15;if(0!=Z)if(15==Z)K=!1;else{var S=
            T&240;if(128<=S)if(0>v&&(v=a.Qa(b,1)),160<=S)I=Em(a,v>>3&7,T,b);else{I=a;var Z=b,X="",S=v>>6,xa=v&7;if(3>S){var qa=void 0;if(!S&&(!Z.Zc&&6==xa||Z.Zc&&5==xa))S=2;else{if(Z.Zc)if(4!=xa)xa+=8;else{var X=S,Sa=I.Qa(Z,1),qa=Sa>>6,Fb=Sa>>3&7,Sa=Sa&7,Va="";if(X||5!=Sa)Va=bm[Sa+8];4!=Fb&&(Va&&(Va+="+"),Va+=bm[Fb+8],qa&&(Va+="*"+(1<<qa)));X=Va}X||(X=bm[xa])}1==S?(qa=I.Qa(Z,1),qa&128?(qa=qa<<24>>24,X+="-"+h(-qa,2)):X+="+"+h(qa,2)):2==S&&(X&&(X+="+"),Z.Zc?(qa=I.fe(Z,4),X+=h(qa)):(qa=I.ra(Z,2),X+=h(qa,4)));X=
            "["+X+"]";7==(T&15)&&(X="FAR "+X)}else X=Em(I,xa,T,Z);I=X}else if(16==S)I="1";else if(0==S){I=a;Z=b;S=" ";switch(T&15){case 1:T&12288&&(S=h(I.Qa(Z,1),2));break;case 2:S=h(I.Qa(Z,1)<<24>>24,4);break;case 4:case 8:if(Z.ad){S=h(I.fe(Z,4));break}case 3:S=h(I.ra(Z,2),4);break;case 7:S=sm(Sl(I,I.qc(Z,!0),I.ra(Z,2),null,Z.ad,Z.Zc));break;default:S="imm("+ga(T)+")"}I=S}else 32==S?(b.Zc?(T=8,I=a.fe(b,4)):(T=4,I=a.ra(b,2)),I="["+h(I,T)+"]"):48==S?(I=1==Z?a.Qa(b,1)<<24>>24:a.qc(b,!0),I=b.za+I&(b.ad?-1:65535),
            I=Fm(a,Sl(a,I,b.ia))[0]||h(I,b.ad?8:4)):96==S?I=Em(a,(T&3840)>>8,T,b):112==S?I=Em(a,(T&3840)>>8,176,b):64==S?I="DS:[SI]":80==S&&(I="ES:[DI]");if(!I||!I.length){F="INVALID";break}0<F.length&&(F+=",");F+=I}}}l=sm(e)+" ";v="";do v+=h(a.Qa(e,1),2);while(e.Ba!=b.Ba);l+=ma(v,16);l+=ma(p,8);F&&(l+=" "+F);a.O.ka<$l[g]&&(c=$l[g]+" CPU only");c&&K&&(l=ma(l,56)+";"+c,l=a.O.fa.Ag?l+("cycles="+cd(a.O).toString()+" cs="+h(a.O.T.Wh)):l+(null!=d?"="+d.toString():""));Gm(a,b,K);return l}
            function Em(a,b,c,d){var e=c&240;if(176==e){if(5<b||4<=b&&a.O.ka<Lb)return"??";b+=16}else if(208==e)b+=32;else if(a=c&15,3<=a&&(8>b&&(b+=8),5==a||4==a&&d.ad))b+=16;return am[b]}function Hm(a,b){var c;switch(b){case "V":c=We(a.O);break;case "D":c=a.O.aa&Pb;break;case "I":c=a.O.aa&Qb;break;case "T":c=a.O.aa&Rb;break;case "S":c=Ve(a.O);break;case "Z":c=Ue(a.O);break;case "A":c=Te(a.O);break;case "P":c=Se(a.O);break;case "C":c=Re(a.O);break;default:c=0}return b+(c?"1":"0")+" "}
            function Im(a,b){8<=b&&15>=b&&4<a.vg&&(b+=16);var c=am[b];32==b&&80286==a.O.ka&&(c="MS");return c+"="+vm(a,b)+" "}function Jm(a,b,c){return b.qi+"="+h(b.ia,4)+(c?"["+h(b.ya,a.If)+","+h(b.gb,b.gb&-65536?8:4)+"]":"")}function Km(a,b,c,d,e){return b+"="+(null!=c?h(c,4):"")+"["+h(d,a.If)+","+h(e-d,4)+"]"}
            function Lm(a,b){var c;void 0===b&&(b=!!(a.O.hb&1));c=Im(a,8)+Im(a,11)+Im(a,9)+Im(a,10)+(4<a.vg?"\n":"")+Im(a,12)+Im(a,13)+Im(a,14)+Im(a,15)+"\n"+Jm(a,a.O.ua,b)+" "+Jm(a,a.O.bb,b)+" "+Jm(a,a.O.Ma,b)+" ";if(b){var d="TR="+h(a.O.cb.ia,4),e=a.ma,e="A20="+(e.lg||e.Vh!=e.Db?"OFF ":"ON ");a.O.ka<Lb&&(d="\n"+d,c+=e,e="");c+="\n"+Jm(a,a.O.ta,b)+" ";a.O.ka>=Lb&&(e+="\n",c+=Jm(a,a.O.xc,b)+" "+Jm(a,a.O.yc,b)+"\n");c+=Km(a,"LD",a.O.yd.ia,a.O.yd.ya,a.O.yd.ya+a.O.yd.gb)+" "+Km(a,"GD",null,a.O.Fd,a.O.Cf)+" "+Km(a,
            "ID",null,a.O.Gd,a.O.Ye)+" ";c=c+(d+" "+e)+Im(a,32);a.O.ka>=Lb&&(c+=Im(a,34)+Im(a,35))}else a.O.ka>=Lb&&(c+=Jm(a,a.O.xc,b)+" "+Jm(a,a.O.yc,b)+" ");return c+=Im(a,23)+Hm(a,"V")+Hm(a,"D")+Hm(a,"I")+Hm(a,"T")+Hm(a,"S")+Hm(a,"Z")+Hm(a,"A")+Hm(a,"P")+Hm(a,"C")}
            function Mm(a,b,c){var d;d=2==c?a.Jn:a.od;c=d.za;var e=d.ia;d=d.Ba;if(void 0!==b){"%"==b.charAt(0)&&(b=b.substr(1),c=0,e=null);var g=b;d=null;if(g.match(/^[a-z_][a-z0-9_]*$/i)){d={};for(var l=g.toUpperCase(),p=0;p<a.Sc.length;p++){var g=a.Sc[p][0],v=a.Sc[p][2][l];if(void 0!==v){l=v.o;void 0!==l&&(p=v.s,void 0===p&&(p=g>>>4),d.za=l,d.ia=p,void 0!==v.p&&(d.Ba=v.p));break}}}if(d&&null!=d.za)return d;d=b.indexOf(":");0>d?null!=e?(c=jm(a,b),d=null):d=jm(a,b):(e=jm(a,b.substring(0,d)),c=jm(a,b.substring(d+
            1)),d=null)}d=Sl(a,c,e,d);rm(a,d);return d}function jm(a,b,c){var d;void 0!==b?(d=ya(am,b.toUpperCase()),0<=d&&(b=vm(a,d)),d=fa(b),void 0===d&&a.R("invalid "+(c?c:"value")+": "+b)):a.R("missing "+(c||"value"));return d}
            function nj(a,b,c,d){function e(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0}var g={},l=[],p;for(p in d){var v=d[p];"number"==typeof v&&(d[p]=v={o:v});var w=v.o,F=v.s,K=v.a;void 0!==w&&(void 0!==F&&(g.za=w,g.ia=F,g.Ba=null,a.$b(g),(g.Ba&-65536)==(a.ma.Vh&-65536)&&(g.Ba&=1048575),v.p=g.Ba),pa(l,[w,p],e));K&&(v.a=K.replace(/''/g,'"'))}a.Sc.push([b,c,d,l])}
            function Fm(a,b,c){for(var d=[],e=a.$b(b),g=0;g<a.Sc.length;g++){var l=a.Sc[g][0],p=a.Sc[g][1];if(e>=l&&e<l+p){b=oa(a.Sc[g][3],[b.za],function(a,b){return a[0]>b[0]?1:a[0]<b[0]?-1:0});0<=b?Nm(a,g,b,d):c&&(b=~b,Nm(a,g,b-1,d),Nm(a,g,b,d));break}}return d}function Nm(a,b,c,d){var e={},g=a.Sc[b][3],l=0,p=null;0<=c&&c<g.length&&(l=g[c][0],p=g[c][1]);p&&(e=a.Sc[b][2][p],p="."==p.charAt(0)?null:e.l||p);d.push(p);d.push(l);d.push(e.a);d.push(e.c)}
            function Om(a,b){if("?"==b)a.R("\nfrequency commands:"),a.R("\tclear\tclear all frequency counts");else{var c,d=0;if(a.Dd)if("clear"==b){for(c=0;c<a.Dd.length;c++)a.Dd[c]=[c,0];a.R("frequency data cleared");d++}else if(void 0!==b)a.R("unknown frequency command: "+b),d++;else{var e=a.Dd.slice();e.sort(function(a,b){return b[1]-a[1]});for(c=0;c<e.length;c++){var g=e[c][0],l=e[c][1];l&&(a.R((Zl[a.th[g][0]]+"  ").substr(0,5)+" ("+k(g)+"): "+l+" times"),d++)}}d||a.R("no frequency data available")}}
            function Pm(a,b){var c=Mm(a,b,1);if(null!=c.za||null!=c.Ba){var d=a.$b(c);a.R((b?b+": ":"")+sm(c)+" (%"+h(d,a.If)+")");d=Fm(a,c,!0);if(d.length){var e,g;d[0]&&(g="",(e=c.za-d[1])&&(g=" + "+ga(e)),a.R(d[0]+" ("+jh(d[1],c.ia)+")"+g));4<d.length&&d[4]&&(g="",(e=d[5]-c.za)&&(g=" - "+ga(e)),a.R(d[4]+" ("+jh(d[5],c.ia)+")"+g))}else a.R("no symbols")}}
            function Qm(a,b){if("l"==b[0]&&void 0===b[1]||"?"==b[1])a.R("\nlist/load commands:"),a.R("\tl [address] [drive #] [sector #] [# sectors]"),a.R("\tln [address] lists symbol(s) nearest to address");else if("ln"==b[0])Pm(a,b[1]);else{var c="json"==b[1],d,e=0,g=0,l=c?{}:Mm(a,b[1],2);d=jm(a,b[2],"drive #");if(void 0!==d){if(!c){e=jm(a,b[3],"sector #");if(void 0===e)return;g=jm(a,b[4],"# of sectors");void 0===g&&(g=1)}var p=a.Gp;2<=d&&a.ao&&(d-=2,p=a.ao);if(p){var v=p.Hn(d);if(v)if(v.xa)if(c)a.R(v.xa.toJSON());
            else if(p.So(v,e,g)){for(var w=0,F=!1,c=sm(l);!F&&0<v.ob--;)(function(a,b){p.tc(v,function(c){0>c?(a.R("out of data at address "+sm(b)),F=!0):(a.dd(b,c,1),w++)})})(a,l);a.R(w+" bytes read at "+c)}else a.R("sector "+e+" request out of range");else a.R("drive "+d+" not loaded");else a.R("invalid drive: "+d)}else a.R("disk controller not present")}}}
            function xm(a,b,c){if(b&&"?"==b[1])a.R("\nregister commands:"),a.R("\tr\t\tdisplay all registers"),a.R("\tr [target=#]\tmodify target register"),a.R("supported targets:"),a.R("\tall registers and flags V,D,I,S,Z,A,P,C");else{var d;if(null!=b&&1<b.length){var e=b[1];if("p"==e)d=80286<=a.O.ka;else{c=null;var g=e.indexOf("=");if(0<g)c=e.substr(g+1),e=e.substr(0,g);else if(2<b.length)c=b[2];else{a.R("missing value for "+b[1]);return}b=!1;g=fa(c,16);if(!isNaN(g)){b=!0;var l=e.toUpperCase();"E"==l.charAt(0)&&
            4>=a.vg&&(l=null);switch(l){case "AL":a.O.F=a.O.F&-256|g&255;break;case "AH":a.O.F=a.O.F&-65281|g<<8&255;break;case "AX":a.O.F=a.O.F&-65536|g&65535;break;case "BL":a.O.D=a.O.D&-256|g&255;break;case "BH":a.O.D=a.O.D&-65281|g<<8&255;break;case "BX":a.O.D=a.O.D&-65536|g&65535;break;case "CL":a.O.G=a.O.G&-256|g&255;break;case "CH":a.O.G=a.O.G&-65281|g<<8&255;break;case "CX":a.O.G=a.O.G&-65536|g&65535;break;case "DL":a.O.H=a.O.H&-256|g&255;break;case "DH":a.O.H=a.O.H&-65281|g<<8&255;break;case "DX":a.O.H=
            a.O.H&-65536|g&65535;break;case "SP":u(a.O,r(a.O)&-65536|g&65535);break;case "BP":a.O.L=a.O.L&-65536|g&65535;break;case "SI":a.O.K=a.O.K&-65536|g&65535;break;case "DI":a.O.J=a.O.J&-65536|g&65535;break;case "DS":Me(a.O,g);break;case "ES":Ne(a.O,g);break;case "SS":wd(a.O,g);break;case "CS":Le(a.O,g);a.od=Sl(a,q(a.O),Mb(a.O));break;case "IP":C(a.O,g);a.od=Sl(a,q(a.O),Mb(a.O));break;case "PC":case "PS":Bd(a.O,g);break;case "C":g?Ye(a.O):Ze(a.O);break;case "P":g?(e=a.O,e.resultType&=-3,e.aa|=Vb):(e=a.O,
            e.resultType&=-3,e.aa&=~Vb);break;case "A":g?ff(a.O):df(a.O);break;case "Z":g?gf(a.O):ef(a.O);break;case "S":g?(e=a.O,e.resultType&=-17,e.aa|=Sb):(e=a.O,e.resultType&=-17,e.aa&=~Sb);break;case "I":g?(e=a.O,e.aa|=Qb):(e=a.O,e.aa&=~Qb);break;case "D":g?(e=a.O,e.aa|=Pb):(e=a.O,e.aa&=~Pb);break;case "V":g?$e(a.O):af(a.O);break;default:var p=!0;if(80286<=a.O.ka)switch(p=!1,l){case "MS":hf(a.O,g);break;case "TR":a.O.cb.load(g,!0)===n&&(b=!1);break;default:if(p=!0,a.O.ka>=Lb)switch(p=!1,l){case "EAX":a.O.F=
            g;break;case "EBX":a.O.D=g;break;case "ECX":a.O.G=g;break;case "EDX":a.O.H=g;break;case "ESP":u(a.O,g);break;case "EBP":a.O.L=g;break;case "ESI":a.O.K=g;break;case "EDI":a.O.J=g;break;case "FS":a.O.xc.load(g);break;case "GS":a.O.yc.load(g);break;case "CR0":a.O.hb=g;break;case "CR2":a.O.Yf=g;break;case "CR3":a.O.uf=g;break;default:p=!0}}if(p){a.R("unknown register: "+e);return}}}if(!b){a.R("invalid value: "+c);return}Zc(a.O);a.R("\nupdated registers:");c=!0}}a.R((c?"":"\n")+Lm(a,d));a.od=Sl(a,q(a.O),
            Mb(a.O));ym(a,sm(a.od))}}function Rm(a,b,c){for(var d=null,e=b.za,g=e,l=1;6>=l;l++){if(2<l){b.za=e;b.Ba=null;var p=um(a,b);if(0<p.indexOf("CALL")||c&&0<p.indexOf("INT")){d=p;break}}if(!--e)break}b.za=g;return d}function Sm(a,b,c){var d="tr"==b;b=null!=c?+c:1;var e=1==b?0:1;Ja(b,function(){return mb(a,!0)&&a.kh(e,d,!1)},function(){Zc(a.O);mb(a,!1)})}function Gm(a,b,c){b.nl=b.ad||b.Zc;c&&(b.ad=4==a.O.ta.pa,b.Zc=4==a.O.ta.Hd);b.we=c}
            function ym(a,b,c,d){b=Mm(a,b,1);if(null!=b.za){void 0===d&&(d=1);var e=Sl(a,a.ko,b.ia,a.ma.Vh),e=256;if(void 0!==c){e=Mm(a,c,1);if(null==e.za||e.za<b.za)return;e=e.za-b.za;if(256<e){a.R("range too large");return}d=-1}var g=b.za!=a.od.za;c=0;for(Gm(a,b,!0);0<e&&d--;){a.Qa(b);var l=b.Ba,p=nb(a,!1)||a.Jc?a.Nd:null,v=null!=p?"cycles":null,w=Fm(a,b);if(w[0]){var F=w[0]+":",g=!1;w[2]&&(F+=" "+w[2]);a.R(F)}g&&a.R();w[3]&&(v=w[3],p=null);g=um(a,b,v,p);b.we||d||d++;a.R(g);a.od=b;e-=b.Ba-l;g=!1;c++}}}
            function nm(a,b,c){if(c)if(b){0>a.sd&&a.gd.length&&(a.sd=0);if(0>a.sd||b!=a.gd[a.sd])a.gd.splice(0,0,b),a.sd=0;a.sd--}else b=a.gd[a.sd+1];a=b?b.split(0<=b.indexOf("|")?"|":";"):[""];for(var d in a)a[d]=na(a[d]);return a}
            function Wl(a,b){var c=!0;try{if(b.length||(a.zg?(a.R("ended assemble @"+sm(a.Nf)),a.od=a.Nf,a.zg=!1):b="?"),b=b.toLowerCase(),pb(a)&&0<b.length){if(a.zg)b="a "+sm(a.Nf)+" "+b;else{var d,e,g;switch(b){case "reset":return a.Fa&&a.Fa.reset(),!0;case "ver":return a.R("PCjs version 1.18.3 ("+a.O.ka+",RELEASE,NOPREFETCH"+(rb?",TYPEDARRAYS":",LONGARRAYS")+",NOBACKTRACK)"),!0;default:for(e=b.charAt(0),g=1;g<b.length;g++){d=b.charAt(g);if(" "==d)break;if("r"==e||"a">d||"z"<d){b=b.substring(0,g)+" "+b.substring(g);
            break}}}}var l=b.split(" ");switch(l[0].charAt(0)){case "a":var p=Mm(a,l[1],1);if(null!=p.za)if(a.Nf=p,void 0===l[2])a.R("begin assemble @"+sm(p)),a.zg=!0,Zc(a.O);else{var v;a.R("not supported yet");v=[];if(v.length){for(var w=0;w<v.length;w++)a.dd(p,v[w],1);a.R(um(a,a.Nf))}}break;case "b":a:{var F=l[1],K=l[0].charAt(1);if(K&&"?"!=K)if("l"==K)w=0,w+=Dm(a,a.Mc),w+=Dm(a,a.Re),(w+=Dm(a,a.Bd))||a.R("no breakpoints");else if(void 0===F)a.R("missing breakpoint address");else{w={};if("*"!=F&&(w=Mm(a,F,1),
            null==w.za))break a;F=null==w.za?F:ga(w.za);"c"==K?null==w.za?(Tl(a),a.R("all breakpoints cleared")):Bm(a,a.Mc,w,!0)||Bm(a,a.Re,w,!0)||Bm(a,a.Bd,w,!0)||a.R("breakpoint missing: "+sm(w)):"i"==K?a.R("breakpoint "+(nc(a.ma,w.za)?"enabled":"cleared")+": port "+F+" (input)"):"o"==K?a.R("breakpoint "+(rc(a.ma,w.za)?"enabled":"cleared")+": port "+F+" (output)"):null!=w.za&&("p"==K?a.Xe(a.Mc,w):"r"==K?a.Xe(a.Re,w):"w"==K?a.Xe(a.Bd,w):a.R("unknown breakpoint command: "+K))}else a.R("\nbreakpoint commands:"),
            a.R("\tbi [p]\ttoggle break on input port [p]"),a.R("\tbo [p]\ttoggle break on output port [p]"),a.R("\tbp [a]\tset exec breakpoint at addr [a]"),a.R("\tbr [a]\tset read breakpoint at addr [a]"),a.R("\tbw [a]\tset write breakpoint at addr [a]"),a.R("\tbc [a]\tclear breakpoint at addr [a]"),a.R("\tbl\tlist all breakpoints")}break;case "c":a.Ih&&(a.Ih.value="");break;case "d":a:{var J=l[0],w=l[1],I=l[2],T;if("?"==w){w="";for(T in cm)a.Nk[T]&&(w&&(w+=","),w+=T);w+=",state,symbols";a.R("\ndump commands:");
            a.R("\tdb [a] [#]    dump # bytes at address a");a.R("\tdw [a] [#]    dump # words at address a");a.R("\tdd [a] [#]    dump # dwords at address a");a.R("\tdh [#]        dump # instructions prior");w.length&&a.R("dump extensions:\n\t"+w)}else if("state"==w)a.R(Tm(a.Fa,!0));else if("symbols"==w)for(w=0;w<a.Sc.length;w++){var Z=a.Sc[w][0],S=a.Sc[w][2],X;for(X in S)if("."!=X.charAt(0)){var xa=S[X],qa=xa.o;if(void 0!==qa){var Sa=xa.s;void 0===Sa&&(Sa=Z>>>4);var Fb=S[X].l;Fb&&(X=Fb);a.R(jh(qa,Sa)+" "+X)}}}else if("dh"==
            J)tm(a,w);else{"ds"==J&&(J="d",I=w,w="desc");for(T in cm)if(w==T){var Va=a.Nk[T];Va?Va(I):a.R("no dump registered for "+w);break a}var ca=Mm(a,w,2);if(null!=ca.za&&(null!=ca.ia||null!=ca.Ba)){var ta="",da=0,sb="dd"==J?4:"dw"==J?2:1,l=16/sb|0;I&&("l"==I.charAt(0)&&(I=I.substr(1)),(da=+I)&&(da=(da+l-1)/l|0));da||(da=8);for(I=0;I<da;I++){for(var Gb=l=0,Za="",$a="",w=sm(ca),J=0;16>J;J++){var Ha=a.Qa(ca,1),l=l|Ha<<(Gb++<<3);Gb==sb&&(Za+=h(l,2*sb),Za+=1==sb?7==J?"-":" ":"  ",l=Gb=0);$a+=32<=Ha&&128>Ha?
            String.fromCharCode(Ha):"."}ta&&(ta+="\n");ta+=w+"  "+Za+" "+$a}ta&&a.R(ta);a.Jn=ca}}}break;case "e":var Ad=l[1];if(void 0===Ad)a.R("missing address");else{var bd=Mm(a,Ad,2);if(null!=bd.za)for(w=2;w<l.length;w++){var Kc=fa(l[w],16);if(void 0===Kc){a.R("unrecognized value: "+k(Kc));break}a.R("setting "+sm(bd)+" to "+k(Kc));a.dd(bd,Kc,1)}}break;case "f":Om(a,l[1]);break;case "g":a:{var Gj=l[1];if(void 0!==Gj){var Hj=Mm(a,Gj,1);if(null==Hj.za)break a;a.Xe(a.Mc,Hj,!0)}a.ag(!0)||a.R('cpu busy, "g" command ignored')}break;
            case "h":var Ij=l[1];a.fa.qb&&void 0===Ij?(a.R("halting"),a.zb()):tm(a,Ij);break;case "i":var jg=l[1];if(jg&&"?"!=jg){var kg=jm(a,jg);if(void 0!==kg){var jn=pc(a.ma,kg);a.R(ga(kg)+": "+k(jn))}}else a.R("\ninput commands:"),a.R("\ti [p]\tread port [p]"),a.R("warning: port accesses can affect hardware state");break;case "k":w=0;Gb=a.O.ta.ia;Za=Sl(a);$a=Sl(a,r(a.O),a.O.ua.ia);for(a.R("stack trace for "+sm($a));10>w;){ca=null;for(Ha=256;$a.za>>>0<a.O.tk>>>0;){Za.za=a.qc($a,!0);if(null==$a.Ba||!Ha--)break;
            Za.ia=Gb;if(ca=Rm(a,Za))break;Za.ia=a.qc($a);if(ca=Rm(a,Za,!0)){Gb=a.qc($a,!0);0<ca.indexOf("INT")&&a.qc($a,!0);break}}if(!ca)break;ca=ma(ca,50)+";stack="+sm($a)+" return="+sm(Za);a.R(ca);w++}w||a.R("no return addresses found");break;case "l":Qm(a,l);break;case "m":a:{w=null;da=l[1];"?"==da&&(da=void 0);if(void 0!==da){ca=0;if("all"==da)ca=1610481663,da=null;else if("on"==da)w=!0,da=null;else if("off"==da)w=!1,da=null;else{"keys"==da&&(da="key");"kbd"==da&&(da="keyboard");for(ta in cm)if(da==ta){ca=
            cm[ta];w=!!(a.Yb&ca);break}if(!ca){a.R("unknown message category: "+da);break a}}ca&&("on"==l[2]?(a.Yb|=ca,w=!0):"off"==l[2]&&(a.Yb&=~ca,w=!1))}ca=0;Ha="";for(ta in cm)if(!da||da==ta)if(sb=!!(a.Yb&cm[ta]),null===w||w==sb)Ha&&(Ha+=","),++ca%10||(Ha+="\n\t"),"key"==ta&&(ta="keys"),Ha+=ta;void 0===da&&a.R("\nmessage commands:\n\tm [category] [on|off]\tturn categories on/off");a.R((null!==w?w?"messages on:  ":"messages off: ":"message categories:\n\t")+(Ha||"none"))}break;case "o":var lg=l[1],kn=l[2];
            if(lg&&"?"!=lg){var mg=jm(a,lg,"port #"),ng=jm(a,kn);void 0!==mg&&void 0!==ng&&(tc(a.ma,mg,ng),a.R(ga(mg)+": "+k(ng)))}else a.R("\noutput commands:"),a.R("\to [p] [b]\twrite byte [b] to port [p]"),a.R("warning: port accesses can affect hardware state");break;case "p":case "pr":var Jj="pr"==l[0]?1:0,w=1+Jj;if(a.Jc)a.R("step in progress");else{var Oe,ca=!1,Jb=Sl(a,q(a.O),Mb(a.O));do switch(Oe=!1,a.Qa(Jb)){case 38:case 46:case 54:case 62:case 100:case 101:case 102:case 103:case 240:om(a,Jb,1);Oe=!0;
            break;case 204:case 206:a.Jc=w;om(a,Jb,1);break;case 205:case 224:case 225:case 226:a.Jc=w;om(a,Jb,2);break;case 232:a.Jc=w;om(a,Jb,3);break;case 154:a.Jc=w;om(a,Jb,5);break;case 255:var Kj=a.qc(Jb)&14591;a.Jc=4351==Kj||6399==Kj?w:0;break;case 243:case 242:om(a,Jb,1);ca=Oe=!0;break;case 108:case 109:case 110:case 111:case 164:case 165:case 166:case 167:case 170:case 171:case 172:case 173:case 174:case 175:ca&&(a.Jc=w,om(a,Jb,1))}while(Oe);a.Jc?(a.Xe(a.Mc,Jb,!0),a.ag()||(a.O.ed(),a.Jc=0)):Sm(a,Jj?
            "tr":"t")}break;case "r":xm(a,l);break;case "t":case "tr":Sm(a,l[0],l[1]);break;case "u":ym(a,l[1],l[2],8);break;case "x":a:if(void 0===l[1]||"?"==l[1])a.R("\nexecution options:"),a.R("\tcs int #\tset checksum cycle interval to #"),a.R("\tcs start #\tset checksum cycle start count to #"),a.R("\tcs stop #\tset checksum cycle stop count to #"),a.R("\tsp #\t\tset speed multiplier to #");else switch(l[1]){case "cs":var Hd;void 0!==l[3]&&(Hd=+l[3]);switch(l[2]){case "int":a.O.T.Ng=Hd;break;case "start":a.O.T.Xh=
            Hd;break;case "stop":a.O.T.Pg=Hd;break;default:a.R("unknown cs option");break a}void 0!==Hd&&Yc(a.O);a.R("checksums "+(a.O.fa.Ag?"enabled":"disabled"));break;case "sp":void 0!==l[2]&&gd(a.O,+l[2]);a.R("target speed: "+Ib(a.O)+" ("+a.O.T.Ce+"x)");break;default:a.R("unknown option: "+l[1])}break;case "?":var w="commands:",og;for(og in Yl)w+="\n"+ma(og,7)+Yl[og];rf(a)||(w+="\nnote: frequency/history disabled if no exec breakpoints");a.R(w);break;default:a.R("unknown command: "+b),c=!1}}}catch(Lj){a.R("debugger error: "+
            (Lj.stack||Lj.message)),c=!1}return c}Pa(function(){for(var a=kb(window.document,"pcjs","debugger"),b=0;b<a.length;b++){var c=a[b],d=ib(c),d=new Rl(d);jb(d,c)}});function Je(a,b,c){this.id=a.id;this.key=Um(a,b,c);this.Y=a.Y;Vm(this,a.ls)}function Um(a,b,c){a=a.id;if(b){var d=b.indexOf(".");0<d&&(a+=".v"+b.substr(0,d))}c&&(a+="."+c);return a}
            Je.prototype={constructor:Je,set:function(a,b){try{this[this.id][a]=b}catch(c){}},get:function(a){return this[this.id][a]||null},value:function(){return this[this.id]},data:function(){return this[this.id]},load:function(a){return a?(this[this.id]=a,this.ml=!0):this.ml?!0:Ea()&&(a=Fa(this.key))?(this[this.id]=a,this.ml=!0):!1},parse:function(){var a=!0;try{this[this.id]=JSON.parse(this[this.id])}catch(b){Ba(b.message||b),a=!1}return a},toString:function(){var a=this[this.id];return"string"==typeof a?
            a:JSON.stringify(a)},clear:function(a){Vm(this);var b=[];try{for(var c=0,d=window.localStorage.length;c<d;c++)b.push(window.localStorage.key(c))}catch(e){}for(c=0;c<b.length;c++)if((d=b[c])&&(a||d.substr(0,this.key.length)==this.key)){try{window.localStorage.removeItem(d)}catch(g){}b.splice(c,1);c=0}},qa:function(a){return this.Y?this.Y.qa(null==a?16777216:a|16777216):!1},ab:function(a){this.Y&&this.Y.message(a)}};function Vm(a,b){a[a.id]={};b&&a.set("parms",b);a.ml=!1}
            function Wm(a){var b=!0;if(Ea()){var c=JSON.stringify(a[a.id]);Ga(a.key,c)||(Ba("Unable to store "+c.length+" bytes in browser local storage"),b=!1)}return b}
            function Xm(a,b,c){Ua.call(this,"Computer",a,Xm,67108864);this.fa.jc=!1;this.Be=a.busWidth||a.buswidth;this.wd=Ym;this.ri=null;this.ej=!1;this.url=b?b.url:null;this.Ks=(Math.random()+.1).toString(36).substr(2,12);this.xd=Zm(this);if(this.O=hb("CPU",this.id)){this.Y=hb("Debugger",this.id);this.ma=new Zb({id:this.fo+".bus",buswidth:this.Be},this.O,this.Y);var d,e=fb(this.id);if((this.Ge=hb("Panel",this.id))&&this.Ge.Ih)for(b=0;b<e.length;b++)d=e[b],d.Da=this.Ge.Da,d.R=this.Ge.R,d.Ih=this.Ge.Ih;for(b=
            0;b<e.length;b++)d=e[b],d.Kc&&d.Kc(this,this.ma,this.O,this.Y);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.yk=d:this.wd=parseInt(d,10));var g;if(a=Ya&&Ya.state||(g=!0,a.state))b=this.Qo=a,g||(this.ej=!0,this.wd=Ym),this.wd&&(this.Ck=new Je(this,"1.18.3"),this.Ck.load()?b=null:delete this.Ck);!b&&this.wd&&(g=null,this.xd&&(g=Aa()+"/api/v1/user?req=load&user="+this.xd+"&state="+Um(this,"1.18.3")),b=g)&&(this.ej=!0);b?za(b,!0,null,this,this.ir):ob(this);c||$m(this,this.nk)}else Ba("Unable to find CPU component")}
            eb(Xm);var Ym=0;f=Xm.prototype;f.Hg=function(){return this.Ks};f.kf=function(){return this.xd?this.xd:""};f.ir=function(a,b,c){c?(this.yk=null,this.ej=!1,this.Da("Unable to load machine state from server (error "+c+(b?": "+na(b):"")+")")):this.ri=b;ob(this)};function $m(a,b,c){for(var d=fb(a.id),e=0;e<=d.length;e++){var g=e<d.length?d[e]:a;if(!pb(g)){pb(g,function(){$m(a,b,c)});return}}b.call(a,c)}
            function an(a,b){var c=new Je(a,"1.18.3","validate");if(c.load()&&c.parse()){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.Da("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}
            f.nk=function(a){void 0===a&&(a=this.wd||(this.ri?1:Ym));var b=!1,c=!1;this.Un=!1;var d=this.Ck||new Je(this,"1.18.3");if(-1==a)b=!0;else if(a>Ym){if(d.load(this.ri)){this.eg=new Je(this,"1.18.3","failsafe");this.eg.load()&&(bn(this,d),a=2,Vm(this.eg));this.eg.set("timestamp",sa());Wm(this.eg);var e=this.wd&&!this.ej;if(1==a||Ca("Click OK to restore the previous PCjs machine state, or CANCEL to reset the machine.")){if(c=d.parse()){var g=d.get("code"),l=d.get("data");g&&("ok"==g?d.load(l):("error"==
            g&&"no machine state"!=l?(this.Da("Error: "+l),"unable to verify user"==l&&(Ga("user",""),this.xd=null)):this.R(g+": "+l),Vm(d),d.load()?(c=d.parse(),e=!0):c=!1))}e&&an(this,c?d:null)}else 2==a&&d.clear()}else an(this);delete this.ri;delete this.Ck}e=fb(this.id);for(g=0;g<e.length;g++)l=e[g],l!==this&&l!=this.O&&(c=cn(this,l,d,b,c));b=[d,a,c];-1!=a?$m(this,this.Ln,b):this.Ln(b)};
            function cn(a,b,c,d,e){if(!b.fa.jc){b.fa.jc=!0;if(b.lc){var g=null;e&&((g=c.get(b.id))||(g=c.get(b.id.replace(/[a-z0-9]\./i,"."))));"string"===typeof g&&(g=null);!b.lc(g,d)&&g&&(Ba("Unable to restore state for "+b.type),a.Qo&&!a.ri?(c.clear(),a.wd=Ym,window&&window.location.reload()):a.Un=!0,b.lc(null),e=!1)}if(!d&&b.Gn)for(a=b.Gn.split("|"),c=0;c<a.length;c++)b.status(a[c])}return e}
            f.Ln=function(a){var b=a[0],c=0>a[1];a=a[2];this.fa.jc=!0;this.Rn||(this.R("PCjs v1.18.3\nCopyright \u00a9 2012-2015 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>"),this.Rn=!0);this.O&&(cn(this,this.O,b,c,a),$c(this.O));this.Un&&(bn(this,b),b.clear());!c&&this.eg&&(this.eg.clear(),delete this.eg)};
            function bn(a,b){if(Ca("There may be a problem with your PCjs machine.\n\nTo help us diagnose it, click OK to send this PCjs machine state to http://www.pcjs.org.")){var c=a.kf(),d=b.toString(),e={app:"PCjs",ver:"1.18.3"};e.url=a.url;e.user=c;e.type="bug";e.data=d;za("http://www.pcjs.org/api/v1/report",!0,e)}}
            function Tm(a,b,c){var d,e="none",g=new Je(a,"1.18.3"),l=new Je(a,"1.18.3","validate"),p=sa();l.set("timestamp",p);g.set("timestamp",p);g.set("version","1.18.3");g.set("url",window?window.location.href:null);g.set("browser",window?window.navigator.userAgent:"");a.O&&a.O.kc&&(c&&a.O.zb(),d=a.O.kc(b,c),"object"===typeof d&&g.set(a.O.id,d),c&&(a.O.fa.jc=!1,!1===d&&(e=null)));for(var p=fb(a.id),v=0;v<p.length;v++){var w=p[v];w.fa.jc&&(w.kc&&(d=w.kc(b,c),"object"===typeof d&&g.set(w.id,d)),c&&(w.fa.jc=
            !1,!1===d&&(e=null)))}e&&(c?(p=d=!1,b?(a.xd&&dn(a,a.xd,g.toString()),Wm(l)&&Wm(g)||(e=null,d=p=!0)):a.wd&&(d=!0,p=3==a.wd),d&&g.clear(p)):e=g.toString());c&&(a.fa.jc=!1);return e}f.reset=function(){this.ma&&this.ma.reset&&(this.ab("Resetting "+this.ma.type),this.ma.reset());for(var a=fb(this.id),b=0;b<a.length;b++){var c=a[b];c!==this&&c!==this.ma&&c.reset&&(this.ab("Resetting "+c.type),c.reset())}};
            f.start=function(a,b){for(var c=fb(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.start&&e.start(a,b)}};f.stop=function(a,b){for(var c=fb(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.stop&&e.stop(a,b)}};
            f.Nb=function(a,b,c){var d=this;switch(b){case "save":return this.va[b]=c,c.onclick=function(){var a=Zm(d,!0);if(a){var b=!(!d.wd||d.yk),c=Tm(d,b);b?dn(d,a,c):d.Da("Resume disabled, machine state not saved")}},!0;case "reset":return this.va[b]=c,c.onclick=function(){fd(d)},!0}return!1};
            function Zm(a,b){var c=a.xd;c||(c=Fa("user"),void 0!==c?!c&&b&&(c=null,window&&(c=window.prompt("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.","")),c&&((c=en(a,c))||a.Da("Your user ID has not been approved."))):b&&a.Da("Browser local storage is not available"));return c}
            function en(a,b){a.xd=null;var c=za(Aa()+"/api/v1/user?req=verify&user="+b),d=c[1];if(!c[0]&&d)try{c=eval("("+d+")"),c.code&&"ok"==c.code&&(Ga("user",c.data),a.xd=c.data)}catch(e){Ba(e.message+" ("+d+")")}return a.xd}
            function dn(a,b,c){if(c){var d={req:"store"};d.user=b;d.state=Um(a,"1.18.3");d.data=c;b=za(Aa()+"/api/v1/user",!1,d);d=b[1];if(b[0]){if(d){var e=d.indexOf("\n");0<e&&(d=d.substr(0,e));d.indexOf("Error: ")||(d=d.substr(7))}d='{"code":'+b[0]+',"data":"'+d+'"}'}b=JSON.parse(d);b&&"ok"==b.code?a.Da("Machine state saved to server"):c&&(c=b&&b.data||"unable to save machine state",c="error"==b.code?"Error: "+c:"Error "+b.code+": "+c,a.Da(c),Ga("user",""),a.xd=null)}}
            function fd(a){if(a.wd&&!a.yk){var b=Ca("Click OK to save changes to this PCjs machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded.");Tm(a,b,!0);!b&&a.Qo?window&&window.location.reload():(b||(a.ol=!0),a.nk(Ym),a.ol=!1)}else a.reset(),a.O&&$c(a.O)}function xb(a,b,c){a=fb(a.id);for(var d=0;d<a.length;d++){var e=a[d];if(c)c==e&&(c=null);else if(e.type==b)return e}return null}
            Pa(function(){for(var a=kb(window.document,"pcjs-machine"),b=0;b<a.length;b++)for(var c=a[b],d=ib(c),c=kb(c,"pcjs","computer"),e=0;e<c.length;e++){var g=c[e],l=ib(g),l=new Xm(l,d,!0);jb(l,g);$m(l,l.nk)}});La.show.push(function(){for(var a=kb(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=ib(a[b]);(c=hb("Computer",c.id))&&c.Rn&&!c.fa.jc&&c.nk(-1)}});
            La.exit.push(function(){for(var a=kb(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=ib(a[b]);(c=hb("Computer",c.id))&&c.fa.jc&&Tm(c,!(!c.wd||c.yk),!0)}});var fn=0;function gn(a,b,c,d,e,g){e("Loading "+a+"...");za(a,!0,null,null,function(l,p,v){v?(p||(p="unable to load "+a+" ("+v+")"),g(p,null)):hn(p,a,b,c,d,e,g)})}
            function hn(a,b,c,d,e,g,l){function p(a,g){if(g)l(g,null);else{if(c){var p=b;p&&0>p.indexOf("/")&&(p=window.location.pathname+p);a=a.replace(/(<machine[^>]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(d?" state=$2"+d+"$2":"")+(p?" url=$2"+p+"$2":""))}p=null;if("<"==a.charAt(0))try{window.ActiveXObject||"ActiveXObject"in window?(e||(a=a.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g,"")),p=new window.ActiveXObject("Microsoft.XMLDOM"),p.async=!1,p.loadXML(a)):p=(new window.DOMParser).parseFromString(a,"text/xml")}catch(K){p=
            null,a=K.message}else a="unrecognized XML: "+(255<a.length?a.substr(0,255)+"...":a);l(a,p)}}a?e?ln(a,g,p):p(a,null):l("no data"+(b?" for file: "+b:""),null)}
            function ln(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=d[2];b("Loading "+e+"...");za(e,!0,null,null,function(g,l,p){if(p||!l)c(a,"unable to resolve XML reference: "+d[0]+" ("+p+")");else{if(g=d[3])if(p=l.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var v=p[0],w,F=/( [a-z]+=)(['"])(.*?)\2/g;w=F.exec(g);)v=0>v.indexOf(w[1])?v.replace(">",w[0]+">"):v.replace(new RegExp(w[1]+"(['\"])(.*?)\\1"),w[0]);p[0]!=v&&(l=l.replace(p[0],v))}else{c(a,"missing <"+d[1]+"> in "+e);return}l=l.replace(/<\?xml[^>]*>[\r\n]*/,
            "");a=a.replace(d[0],l);ln(a,b,c)}})}else c(a,null)}
            function mn(a,b,c,d){function e(a){if(void 0===p){var b=l&&kb(l,"machine-warning");p=b&&b[0]||l}p&&(p.innerHTML=ka(a))}function g(a){e("Error: "+a);v&&(--fn||Ra(!0));v=!1}var l,p,v=!0;fn++;try{if(l=window.document.getElementById(a)){c||(c="/versions/pcjs/1.18.3/components.xsl");var w=function(d,p){if(p){var v=function(d,v){if(v)if(v)if(e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window){var w=p.transformNode(v);w?(l.outerHTML=w,--fn||Ra(!0)):g("transformNodeToObject failed")}else window.document.implementation&&
            window.document.implementation.createDocument?(w=new XSLTProcessor,w.importStylesheet(v),(w=w.transformToFragment(p,window.document))?l.parentNode?(l.parentNode.replaceChild(w,l),--fn||Ra(!0)):g("invalid machine element: "+a):g("transformToFragment failed")):g("unable to transform XML: unsupported browser");else g("failed to load XSL file: "+c);else g(d)};p?gn(c,null,null,!1,e,v):g("failed to load XML file: "+b)}else g(d)};"<"!=b.charAt(0)?gn(b,a,d,!0,e,w):hn(b,null,a,d,!1,e,w)}else g("missing machine element: "+
            a)}catch(F){g(F.message)}return v}window.embedPC=function(a,b,c,d){Ra(!1);return mn(a,b,c,d)};window.enableEvents=Ra;window.sendEvent=Ta;})();
            
          • pc.js
            (function(){var f,aa,g,ba={163840:[40,1,8],184320:[40,1,9],327680:[40,2,8],368640:[40,2,9],737280:[80,2,9],1228800:[80,2,15],1474560:[80,2,18],2949120:[80,2,36]};
            function ca(a,b){var c;if(a){b||(b=16);if("$"==a.charAt(0))b=16,a=a.substr(1);else if("0x"==a.substr(0,2))b=16,a=a.substr(2);else{var d=a.charAt(a.length-1).toLowerCase();"h"==d?(b=16,d=null):"."==d&&(b=10,d=null);null===d&&(a=a.substr(0,a.length-1))}var e,d=a;(b&&10!=b?16==b?null!==d.match(/^[0-9a-f]+$/i):1:null!==d.match(/^[0-9]+$/))&&!isNaN(e=parseInt(a,b))&&(c=e|0)}return c}
            function da(a,b){var c="";void 0===b?b=8:8<b&&(b=8);if(null==a||isNaN(a))for(;0<b--;)c="?"+c;else for(;0<b--;){var d=a&15,d=d+(0<=d&&9>=d?48:55),c=String.fromCharCode(d)+c;a>>=4}return c}function ea(a){return"0x"+da(a,2)}function fa(a,b){var c=a,d=a.lastIndexOf("/");0<=d&&(c=a.substr(d+1));d=c.indexOf("&");0<d&&(c=c.substr(0,d));b&&(d=c.lastIndexOf("."),0<d&&(c=c.substring(0,d)));return c}function ha(a){var b="",c=a.lastIndexOf(".");0<=c&&(b=a.substr(c+1).toLowerCase());return b}
            var ia={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#039;"};function ja(a){return a.replace(/[&<>"']/g,function(a){return ia[a]})}var ka=Date.now||function(){return+new Date};function la(){function a(a){return(10>a?"0":"")+a}var b=new Date;return b.getFullYear()+"-"+a(b.getMonth()+1)+"-"+a(b.getDate())+" "+a(b.getHours())+":"+a(b.getMinutes())+":"+a(b.getSeconds())}var ma=[31,28,31,30,31,30,31,31,30,31,30,31];
            function na(a,b){var c=0,d=1,e;for(e in a){if(d>=arguments.length)break;d++;c=void 0}return c}function oa(a,b){return(b&a.Mp)>>a.shift}
            function pa(a,b,c,d,e,m){b=!!b;var n=0,p=null,v=fa(a),w=window.XMLHttpRequest?new window.XMLHttpRequest:new window.ActiveXObject("Microsoft.XMLHTTP");b&&(w.onreadystatechange=function(){4===w.readyState&&(p=w.responseText,200==w.status||!w.status&&p.length&&"file:"==(window?window.location.protocol:"file:")||(n=w.status||-1),e&&(d?e.call(d,v,p,n,m):e(v,p,n,m)))});if(c){var G="",N;for(N in c)c.hasOwnProperty(N)&&(G&&(G+="&"),G+=N+"="+encodeURIComponent(c[N]));G=G.replace(/%20/g,"+");w.open("POST",
            a,b);w.setRequestHeader("Content-type","application/x-www-form-urlencoded");w.send(G)}else w.open("GET",a,b),w.send();a=[];b||(p=w.responseText,200!=w.status&&(n=w.status||-1),e&&(d?e.call(d,v,p,n,m):e(v,p,n,m)),a=[n,p]);return a}function qa(){return"http://"+(window?window.location.host:"www.pcjs.org")}function ra(a){window&&window.alert(a)}function sa(a){var b=!1;window&&(b=window.confirm(a));return b}var ta=null;
            function ua(){if(null==ta){var a=!1;if(window)try{window.localStorage.setItem("PCjs.localStorage","PCjs.localStorage"),a="PCjs.localStorage"==window.localStorage.getItem("PCjs.localStorage"),window.localStorage.removeItem("PCjs.localStorage")}catch(b){a=!1}ta=a}return ta}function va(a){var b;if(window)try{b=window.localStorage.getItem(a)}catch(c){}return b}function wa(a,b){try{return window.localStorage.setItem(a,b),!0}catch(c){}return!1}
            function ya(a){if(window){var b=window?window.navigator.userAgent:"";return"iOS"==a&&b.match(/(iPod|iPhone|iPad)/)&&b.match(/AppleWebKit/)||"MSIE"==a&&b.match(/(MSIE|Trident)/)||0<=b.indexOf(a)?!0:!1}return!1}var Aa={init:[],show:[],exit:[]},Ba=!1,Ca=!0;function Da(a,b){if(window){var c=window[a];window[a]="function"!==typeof c?b:function(){c&&c();b()}}}function Ea(a){Aa.init.push(a)}
            function Fa(a){if(Ca)try{for(var b=0;b<a.length;b++)a[b]()}catch(c){ra("An unexpected exception occurred:\n\n"+c.message+"\n\nPlease send this information to support@pcjs.org. Thanks.")}}function Ga(a){!Ca&&a?(Ca=!0,Ba&&Ha("init")):Ca=a}function Ha(a){Aa[a]&&Fa(Aa[a])}Da("onload",function(){Ba=!0;Fa(Aa.init)});Da("onpageshow",function(){Fa(Aa.show)});Da(ya("Opera")||ya("iOS")?"onunload":"onbeforeunload",function(){Fa(Aa.exit)});
            function Ia(a,b,c){this.type=a;b||(b={id:"",name:""});this.id=b.id;this.name=b.name;this.Km=b.comment;this.dr=b;void 0===this.id&&(this.id="");b=this.id.indexOf(".");0<b?(this.gn=this.id.substr(0,b),this.Vg=this.id.substr(b+1)):this.Vg=this.id;this[a]=c;this.ha={Sf:!1,Wc:!1,qk:!1,dc:!1,yd:!1};this.ni=null;this.ha.yd=!1;this.qa={};this.Ra=null;Ja[Ja.length]=this}var Ka=void 0,La={};
            if(window){Ka||(Ka=window.location.search.substr(1));for(var Ma,Na=/\+/g,Oa=/([^&=]+)=?([^&]*)/g;Ma=Oa.exec(Ka);)La[decodeURIComponent(Ma[1].replace(Na," "))]=decodeURIComponent(Ma[2].replace(Na," "))}function Pa(a){function b(){}if(window){if(!a)throw new TypeError;if(Object.create)return Object.create(a);var c=typeof a;if("object"!==c&&"function"!==c)throw new TypeError;}b.prototype=a;return new b}
            function Qa(a,b){b||(b=Ia);a.prototype=Pa(b.prototype);a.prototype.constructor=a;a.prototype.parent=b.prototype}var Ja=[];function Ra(a){var b,c=[];a&&(a=0<(b=a.indexOf("."))?a.substr(0,b+1):"");for(b=0;b<Ja.length;b++){var d=Ja[b];a&&d.id.indexOf(a)||c.push(d)}return c}function Sa(a,b){if(void 0!==a){var c;b&&0<(c=b.indexOf("."))&&(a=b.substr(0,c+1)+a);for(c=0;c<Ja.length;c++)if(Ja[c].id===a)return Ja[c]}return null}
            function Ta(a,b){var c;if(void 0!==a){var d;b&&(b=0<(d=b.indexOf("."))?b.substr(0,d+1):"");for(d=0;d<Ja.length;d++)if(c)c==Ja[d]&&(c=null);else if(!(a!=Ja[d].type||b&&Ja[d].id.indexOf(b)))return Ja[d]}return null}function Ua(a){var b=null;if(a=a.getAttribute("data-value"))try{b=eval("({"+a+"})")}catch(c){ra(c.message+" ("+a+")")}return b}window&&!window.document.ELEMENT_NODE&&(window.document.ELEMENT_NODE=1);
            function Wa(a,b){for(var c=Xa(b.parentNode,"pcjs-control"),d=0;d<c.length;d++)for(var e=c[d].childNodes,m=0;m<e.length;m++){var n=e[m];if(n.nodeType===window.document.ELEMENT_NODE){var p=n.getAttribute("class");if(p)for(var v=p.split(" "),w=0;w<v.length;w++)switch(p=v[w],p){case "pcjs-binding":(p=Ua(n))&&p.binding&&a.Lb(p.type,p.binding,n),w=v.length}}}}
            function Xa(a,b,c){c&&(b+="-"+c+"-object");if(a.getElementsByClassName)return a.getElementsByClassName(b);var d;c=[];a=a.getElementsByTagName("*");var e=new RegExp("(^| )"+b+"( |$)");b=0;for(d=a.length;b<d;b++)e.test(a[b].className)&&c.push(a[b]);return c}
            Ia.prototype={constructor:Ia,parent:null,toString:function(){return this.name?this.name:this.id||this.type},Lb:function(a,b,c){switch(b){case "clear":return this.qa[b]||(this.qa[b]=c,c.onclick=function(a){return function(){a.qa.print&&(a.qa.print.value="")}}(this)),!0;case "print":return this.qa[b]||(this.jk=this.qa[b]=c,c.value="",this.pc=function(a){return function(b,c){8192<a.value.length&&(a.value=a.value.substr(a.value.length-4096));a.value+=(void 0!==c?c+": ":"")+(b||"")+"\n";a.scrollTop=a.scrollHeight}}(c),
            this.wa=function(a,b,c){this.pc(a,"notice",c)}),!0;default:return!1}},log:function(){},assert:function(){},pc:function(){},status:function(a){this.pc(this.Vg+": "+a)},wa:function(a,b){b||ra(a)},gc:function(){return this.ha.dc=!0},fc:function(a,b){b&&(this.ha.dc=!1);return!0},oc:function(){return!1}};function Ya(a,b){if(a.ha.qk)return a.ha.Wc&&(a.ha.Wc=!1),a.ha.qk=!1;if(a.ha.yd)return a.pc(a.toString()+" error"),!1;a.ha.Wc=b;return a.ha.Wc}
            function Za(a,b){if(!a.ha.yd&&(a.ha.Sf=!1!==b,a.ha.Sf)){var c=a.ni;a.ni=null;c&&c()}}function $a(a,b){b&&(a.ha.Sf?b():a.ni=b);return a.ha.Sf}function ab(a,b){a.ha.yd=!0;a.wa(b)}var bb="undefined"!==typeof ArrayBuffer;function cb(a){Ia.call(this,"Panel",a,cb);this.canvas=null;this.ee=this.fe=this.Wg=-1}Qa(cb);function db(a,b,c,d){this.tf=[a,b,c,d];this.Jj=null;void 0===a&&(this.tf[0]=256*Math.random()|0,this.tf[1]=256*Math.random()|0,this.tf[2]=256*Math.random()|0,this.tf[3]=255,this.Jj=null)}
            db.prototype.toString=function(){this.Jj||(this.Jj="#"+da(this.tf[0],2)+da(this.tf[1],2)+da(this.tf[2],2));return this.Jj};function eb(a,b,c,d){this.x=a;this.y=b;this.Kc=c;this.Vc=d}eb.prototype.contains=function(a,b){return a>=this.x&&a<this.x+this.Kc&&b>=this.y&&b<this.y+this.Vc};function fb(a,b,c,d){void 0===d&&(d=b>=c>>2);d?(b=new eb(a.x,a.y,a.Kc,a.Vc*b/c|0),a.y+=b.Vc,a.Vc-=b.Vc):(b=new eb(a.x,a.y,a.Kc*b/c|0,a.Vc),a.x+=b.Kc,a.Kc-=b.Kc);return b}f=cb.prototype;
            f.Lb=function(a,b,c){return this.za&&this.za.Lb(a,b,c)||this.U&&this.U.Lb(a,b,c)||this.Da&&this.Da.Lb(a,b,c)?!0:this.parent.Lb.call(this,a,b,c)};f.Lc=function(a,b,c,d){this.za=a;this.la=b;this.U=c;this.Ra=d;this.Da=gb(a,"Keyboard")};f.gc=function(a,b){b||hb();return!0};f.fc=function(){return!0};f.ik=function(a,b){a.button||(this.Wg=b?0:-1,ib(this,a,b))};f.kn=function(a){ib(this,a)};
            function ib(a,b,c){var d=1280/a.canvas.offsetWidth,e=720/a.canvas.offsetHeight,m=a.canvas.getBoundingClientRect(),d=(b.clientX-m.left)*d|0;b=(b.clientY-m.top)*e|0;null==c&&(a.Wg||(a.Wg=Math.abs(a.ee-d)>Math.abs(a.fe-b)?1:2),1==a.Wg?b=a.fe:2==a.Wg&&(d=a.ee));a.ee=d;a.fe=b;if(0<=d&&1280>d&&0<=b&&720>b){a:{c=d;if(960>c&&a.Xa&&a.Xa.Ff)for(m=0;m<a.Xa.Ff.length;m++)if(e=a.Xa.Ff[m],e.contains(c,b)){c-=e.x;b-=e.y;var d=a.Xa.zg[m],n=oa(jb.yn,a.Xa.Rj[d.Do]),m=n*a.la.ob,d=(n+d.Pd)*a.la.ob-1;0<b&&(m+=e.Kc*(b-
            1)*a.Bn);m+=c*a.Bn;m|=0;m>d&&(m=d);c=m;break a}c=h}c!==h&&(c&=-16,c!=a.vm&&(kb(a,c,!0),a.vm=c))}}
            f.de=function(){if(this.canvas&&this.$h&&this.ne&&this.cf){var a=this.ne.width,b=this.ne.height;this.cf.fillStyle="black";this.cf.fillRect(0,0,a,b);lb(this,18,this.ne,this.cf,this.canvas.style.color);mb(this,3);k(this,"CPU");k(this,"Target");k(this,"Current");nb(this);k(this,this.U.ma);k(this,this.U.R.nf.toFixed(2)+"Mhz");k(this,ob(this.U));nb(this,2);mb(this,8);var c=this.U.ma<qb?4:8;this.Vp=16;this.sn=c;k(this,"AX",this.U.F,2);k(this,"DS",this.U.kb.sa,0,1);k(this,"DX",this.U.H,2);k(this,"SI",this.U.K,
            0,1.5);k(this,"BX",this.U.D,2);k(this,"ES",this.U.Qa.sa,0,1);k(this,"CX",this.U.G,2);k(this,"DI",this.U.J,0,1.5);k(this,"CS",this.U.oa.sa,2);k(this,"SS",this.U.ra.sa,0,1);k(this,"IP",l(this.U),2);k(this,"SP",q(this.U),0,1.5);k(this,"PS",c=rb(this.U),2);k(this,"BP",this.U.L,0,1.5);this.U.ma>=qb&&(k(this,"FS",this.U.Hd.sa,2),k(this,"CR0",this.U.zb,0,1),k(this,"GS",this.U.Id.sa,2),k(this,"CR3",this.U.gg,0,1.5));mb(this,9);k(this,"V"+(c&sb?1:0));k(this,"D"+(c&tb?1:0));k(this,"I"+(c&ub?1:0));k(this,"T"+
            (c&vb?1:0));k(this,"S"+(c&wb?1:0));k(this,"Z"+(c&xb?1:0));k(this,"A"+(c&yb?1:0));k(this,"P"+(c&zb?1:0));k(this,"C"+(c&Ab?1:0),0,2);kb(this,this.vm);this.$h.drawImage(this.ne,0,0,a,b,this.Bt,this.Et,this.Zs,this.bt)}};function Bb(a,b,c,d){a.Xa.zg[a.Xa.Fm++]={Do:b,Pd:c,type:d};return na(jb,b,c,0,d)}
            function kb(a,b,c){if(a.$h&&a.ne&&a.cf){var d=a.ne.width;a.cf.fillStyle="black";a.cf.fillRect(0,360,d,360);lb(a,378,a.ne,a.cf,a.canvas.style.color);mb(a,24);if(null==b)k(a,"Mouse over memory to dump");else{k(a,"0x"+da(b),null,0,1);for(var e=1;16>=e;e++){for(var m="",n=1;8>=n;n++){var p=Cb(a.la,b++);k(a,da(p,2),null,1);m+=32<=p&&128>p?String.fromCharCode(p):"."}k(a,m,null,0,1)}}c&&a.$h.drawImage(a.ne,0,360,d,360,a.zt,a.Ct,a.Xs,a.$s)}}
            function lb(a,b,c,d,e){var m,n=a.Ur=10;a.cd=n;a.Cf=b;a.Wf=a.dn=18;m||(m=a.$m||a.dn+"px Monaco, Lucida Console, Courier New");a.oi=a.$m=m;c&&(a.bo=c);d&&(a.wd=d,a.jo=e||"white")}function mb(a,b){a.kk=a.bo.width/b|0}function nb(a,b){a.cd=a.Ur;a.Cf+=(a.Wf+2)*(b||1)}function k(a,b,c,d,e){a.wd.font=a.oi;a.wd.fillStyle=a.jo;a.wd.fillText(b,a.cd,a.Cf);a.cd+=a.kk;null!=c&&(16!=a.Vp?b=c.toString():(b=8>a.sn?"0x":"",b+=da(c,a.sn)),a.wd.fillText(b,a.cd,a.Cf),a.cd+=a.kk);d&&(a.cd+=a.kk*d);e&&nb(a,e)}
            function hb(){for(var a=!1,b=Xa(window.document,"pcjs","panel"),c=0;c<b.length;c++){var d=b[c],e=Ua(d),m=Sa(e.id);m||(a=!0,m=new cb(e));Wa(m,d);a&&Za(m)}}Ea(hb);function Db(a,b,c){Ia.call(this,"Bus",a,Db);this.U=b;this.Ra=c;this.Be=a.buswidth||20;this.Xj=Math.pow(2,this.Be);this.Qp=this.xb=this.Xj-1|0;this.Aa=32==this.Be||20>=this.Be?12:24>=this.Be?14:15;this.ob=1<<this.Aa;this.nn=this.ob>>2;this.Ea=this.ob-1;this.Xd=this.Xj/this.ob|0;this.$c=this.Xd-1;this.Dh=[];this.Eh=[];this.Dk();Za(this)}Qa(Db);
            var jb,Eb={yn:20,count:8,Vs:1,type:3},Fb=0,Gb;for(Gb in Eb){var Hb=Eb[Gb];Eb[Gb]={Mp:(1<<Hb)-1<<Fb,shift:Fb};Fb+=Hb}jb=void 0;f=Db.prototype;f.Dk=function(){var a=new r;this.ka=Array(this.Xd);for(var b=0;b<this.Xd;b++)this.ka[b]=a;this.U.Dk(this.ka,this.Aa);a=this.U;a.xb=a.$d=this.xb};f.reset=function(){Ib(this,!0)};f.gc=function(a,b){b||this.reset();return!0};
            function Jb(a,b,c,d,e){for(var m=b>>>a.Aa;0<c&&m<a.ka.length;){var n=a.ka[m],p=m*a.ob,v=c>a.ob?a.ob:c;if(n&&n.size){if(n.type==d&&n.W==e){if(b+c<=n.Bg)return n.qg+=n.Bg-b,n.Bg=b,!0;if(b>=n.Bg+n.qg){v=n.size-(b-p);v>c&&(v=c);n.qg=b-n.Bg+v;c-=v;b=p+a.ob;continue}}return Kb(1,b,c)}a.ka[m++]=new r(b,v,a.ob,d,e);c-=v;b=p+a.ob}return 0<c?Kb(2,b,c):!0}
            function Ib(a,b){if(32==a.Be)b?a.vg&&(Lb(a,1048576,1048576,a.vg),a.vg=null):a.vg||(a.vg=Mb(a,1048576,1048576),Lb(a,1048576,1048576,Mb(a,0,1048576)));else if(20<a.Be){var c=a.xb&-1048577|(b?1048576:0);if(c!=a.xb&&(a.xb=c,a.U)){var d=a.U;d.xb=d.$d=c}}}f.Lj=function(a,b,c){if(!(a&this.Ea||!b||b&this.Ea)){for(var d=a>>>this.Aa;0<b;){var e=this.ka[d];if(!e.W)return Kb(5,a,b);e.md(c);b-=this.ob;d++}return!0}return Kb(3,a,b)};
            function Nb(a,b,c){if(!(b&a.Ea||!c||c&a.Ea)){for(var d=b>>>a.Aa;0<c;)b=d*a.ob,a.ka[d++]=new r(b),c-=a.ob;return!0}return Kb(4,b,c)}function Mb(a,b,c){var d=[];for(b>>>=a.Aa;0<c&&b<a.ka.length;)d.push(a.ka[b++]),c-=a.ob;return d}function Lb(a,b,c,d,e){for(var m=0,n=b>>>a.Aa;0<c&&n<a.ka.length;){var p=d[m++];if(!p)break;if(void 0!==e){var v=new r(b);v.clone(p,e);p=v}a.ka[n++]=p;c-=a.ob}}f.wc=function(a){return this.ka[(a&this.xb)>>>this.Aa].xc(a&this.Ea,a)};
            function Cb(a,b){return a.ka[(b&a.xb)>>>a.Aa].wj(b&a.Ea,b)}f.na=function(a){var b=a&this.Ea,c=(a&this.xb)>>>this.Aa;return b!=this.Ea?this.ka[c].xj(b,a):this.ka[c++].xc(b,a)|this.ka[c&this.$c].xc(0,a+1)<<8};function Ob(a,b){var c=b&a.Ea,d=(b&a.xb)>>>a.Aa;return c!=a.Ea?a.ka[d].rr(c,b):a.ka[d++].wj(c,b)|a.ka[d&a.$c].wj(0,b+1)<<8}
            f.Tg=function(a){var b=a&this.Ea,c=(a&this.xb)>>>this.Aa;if(b<this.Ea-2)return this.ka[c].yc(b,a);var d=(b&3)<<3;return this.ka[c].yc(b&-4,a)>>>d|this.ka[c+1&this.$c].yc(0,a+3)<<32-d};f.Oe=function(a,b){this.ka[(a&this.xb)>>>this.Aa].Cc(a&this.Ea,b&255,a)};f.Eb=function(a,b){var c=a&this.Ea,d=(a&this.xb)>>>this.Aa;c!=this.Ea?this.ka[d].Oj(c,b&65535,a):(this.ka[d++].Cc(c,b&255,a),this.ka[d&this.$c].Cc(0,b>>8&255,a+1))};
            function Pb(a,b,c){var d=b&a.Ea,e=(b&a.xb)>>>a.Aa;d!=a.Ea?a.ka[e].Pr(d,c&65535,b):(a.ka[e++].fm(d,c&255,b),a.ka[e&a.$c].fm(0,c>>8&255,b+1))}f.Kj=function(a,b){var c=a&this.Ea,d=(a&this.xb)>>>this.Aa;if(c<this.Ea-2)this.ka[d].Se(c,b);else{var e,m=(c&3)<<3,c=c&-4;e=this.ka[d].yc(c,a);this.ka[d].Se(c,e&~(-1<<m)|b<<m,a);d=d+1&this.$c;a+=3;e=this.ka[d].yc(0,a);this.ka[d].Se(0,e&-1<<m|b>>>32-m,a)}};
            function Qb(a){for(var b=0,c=[],d=0;d<a.Xd;d++){var e=a.ka[d];if(e.Ka||e.Pm){c[b++]=d;var m=b++;a:if(e=e.save()){for(var n=0,p=0,v=[];n<e.length;){for(var w=e[n],G=n+1;G<e.length&&e[G]===w;)G++;v[p++]=G-n;v[p++]=w;n=G}if(v.length<e.length){e=v;break a}}c[m]=e}}c[b]=!a.vg&&a.Qp==a.xb;return c}
            function Tb(a,b,c,d){void 0===d&&(d=0);for(var e in c){var m=a,n=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=n;w++)void 0!==m.Dh[w]?ra("Input port 0x"+da(w,4)+" registered by "+m.Dh[w][0].id+", ignoring "+p.id):m.Dh[w]=[p,v,!1,!1]}}function Ub(a,b,c){var d=255;a=a.Dh[b];void 0!==a&&a[1]&&(b=a[1].call(a[0],b,c),void 0!==b&&(d=b));return d}
            function Vb(a,b,c,d){void 0===d&&(d=0);for(var e in c){var m=a,n=+e+d,p=b,v=c[e];if(void 0!==v)for(var w=+e+d;w<=n;w++)void 0!==m.Eh[w]?ra("Output port 0x"+da(w,4)+" registered by "+m.Eh[w][0].id+", ignoring "+p.id):m.Eh[w]=[p,v,!1,!1]}}function Wb(a,b,c,d){a=a.Eh[b];void 0!==a&&a[1]&&a[1].call(a[0],b,c,d)}function Kb(a,b,c){ra("Memory block error ("+a+","+da(b)+","+da(c)+")");return!1}var Xb;
            if(bb){var Yb=new ArrayBuffer(2);(new DataView(Yb)).setUint16(0,256,!0);Xb=256===(new Uint16Array(Yb))[0]}else Xb=!1;var Zb=Xb;
            function r(a,b,c,d,e,m){this.id=$b+=2;this.ba=null;this.offset=0;this.Bg=a;this.qg=b;this.size=c||0;this.type=d||ac;this.ki=d==bc;this.W=null;this.U=m;this.Ka=this.Pm=!1;cc(this);if(c)if(e)this.W=e,a=e.cn(a),this.ba=a[0],this.offset=a[1],this.md(e.Ak());else if(bb)this.buffer=new ArrayBuffer(c),this.se=new DataView(this.buffer,0,c),this.Nb=new Uint8Array(this.buffer,0,c),this.Jh=new Uint16Array(this.buffer,0,c>>1),this.ba=new Int32Array(this.buffer,0,c>>2),this.md(Zb?dc:ec);else{this.ba=Array(c>>
            2);for(e=0;e<this.ba.length;e++)this.ba[e]=0;this.md(fc)}else this.md()}var ac=0,bc=2,gc="NONE RAM ROM VIDEO H/W UNPAGED PAGED".split(" "),hc=["black","blue","green","cyan"],$b=0;function ic(a){bb&&!Zb&&(a=a<<24|a<<8&16711680|a>>8&65280|a>>>24);return a}
            r.prototype={constructor:r,parent:null,clone:function(a,b){this.id=a.id|1;this.qg=a.qg;this.size=a.size;b&&(this.type=b,this.ki=b==bc);bb?(this.buffer=a.buffer,this.se=a.se,this.Nb=a.Nb,this.Jh=a.Jh,this.ba=a.ba,this.md(Zb?dc:ec)):(this.ba=a.ba,this.md(fc))},save:function(){var a,b;if(this.W)a=null;else if(bb)for(a=Array(this.size>>2),b=0;b<a.length;b++)a[b]=this.se.getInt32(b<<2,!0);else a=this.ba;return a},restore:function(a){if(this.W)return null==a;if(a&&this.size==a.length<<2){var b;if(bb)for(b=
            0;b<a.length;b++)this.se.setInt32(b<<2,a[b],!0);else this.ba=a;return this.Ka=!0}return!1},md:function(a){a||(a=5==this.type?jc:6==this.type?kc:lc);var b=a;this.xc=b[0]||this.Cn;this.xj=b[1]||this.Dn;this.yc=b[2]||this.lr;this.wj=b[0]||this.Cn;this.rr=b[1]||this.Dn;this.Cc=!this.ki&&a[3]||this.Un;this.Oj=!this.ki&&a[4]||this.Vn;this.Se=!this.ki&&a[5]||this.Jr;this.fm=a[3]||this.Un;this.Pr=a[4]||this.Vn},Cn:function(){return 255},Un:function(){},Dn:function(a,b){return this.xc(a,b)|this.xc(a+1,b)<<
            8},lr:function(a,b){return this.xc(a,b)|this.xc(a+1,b)<<8|this.xc(a+2,b)<<16|this.xc(a+3,b)<<24},Vn:function(a,b){this.Cc(a,b&255);this.Cc(a+1,b>>8)},Jr:function(a,b){this.Cc(a,b&255);this.Cc(a+1,b>>8&255);this.Cc(a+2,b>>16&255);this.Cc(a+3,b>>>24)},hr:function(a){return this.ba[a>>2]>>>((a&3)<<3)&255},tr:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ba[b]>>a;return 24>a?c&65535:c&255|(this.ba[b+1]&255)<<8},nr:function(a){var b=a>>2;a=(a&3)<<3;var c=this.ba[b];a&&(c=c>>>a|this.ba[b+1]<<32-a);return c},
            Fr:function(a,b){var c=a>>2,d=(a&3)<<3;this.ba[c]=this.ba[c]&~(255<<d)|b<<d;this.Ka=!0},Rr:function(a,b){var c=a>>2,d=(a&3)<<3;24>d?this.ba[c]=this.ba[c]&~(65535<<d)|b<<d:(this.ba[c]=this.ba[c]&16777215|b<<24,c++,this.ba[c]=this.ba[c]&-256|b>>8);this.Ka=!0},Lr:function(a,b){var c=a>>2,d=(a&3)<<3;if(d){var e=-1<<d;this.ba[c]=this.ba[c]&~e|b<<d;c++;this.ba[c]=this.ba[c]&e|b>>>32-d}else this.ba[c]=b;this.Ka=!0},ir:function(a,b){this.Sc.ba[this.Yc]|=this.Od;this.Tc.ba[this.Zc]|=this.Od;return this.Kf.xc(a,
            b)},ur:function(a,b){this.Sc.ba[this.Yc]|=this.Od;this.Tc.ba[this.Zc]|=this.Od;return this.Kf.xj(a,b)},or:function(a,b){this.Sc.ba[this.Yc]|=this.Od;this.Tc.ba[this.Zc]|=this.Od;return this.Kf.yc(a,b)},Gr:function(a,b,c){this.Sc.ba[this.Yc]|=this.Od;this.Tc.ba[this.Zc]|=this.ck;this.Kf.Cc(a,b,c)},Sr:function(a,b,c){this.Sc.ba[this.Yc]|=this.Od;this.Tc.ba[this.Zc]|=this.ck;this.Kf.Oj(a,b,c)},Mr:function(a,b,c){this.Sc.ba[this.Yc]|=this.Od;this.Tc.ba[this.Zc]|=this.ck;this.Kf.Se(a,b,c)},jr:function(a,
            b){return(mc(this.U,b,!1)||this).xc(a,b)},vr:function(a,b){return(mc(this.U,b,!1)||this).xj(a,b)},pr:function(a,b){return(mc(this.U,b,!1)||this).yc(a,b)},Hr:function(a,b,c){(mc(this.U,c,!0)||this).Cc(a,b,c)},Tr:function(a,b,c){(mc(this.U,c,!0)||this).Oj(a,b,c)},Nr:function(a,b,c){(mc(this.U,c,!0)||this).Se(a,b,c)},fr:function(a){return this.Nb[a]},gr:function(a){return this.Nb[a]},qr:function(a){return this.se.getUint16(a,!0)},sr:function(a){return a&1?this.Nb[a]|this.Nb[a+1]<<8:this.Jh[a>>1]},kr:function(a){return this.se.getInt32(a,
            !0)},mr:function(a){return a&3?this.Nb[a]|this.Nb[a+1]<<8|this.Nb[a+2]<<16|this.Nb[a+3]<<24:this.ba[a>>2]},Dr:function(a,b){this.Nb[a]=b;this.Ka=!0},Er:function(a,b){this.Nb[a]=b;this.Ka=!0},Or:function(a,b){this.se.setUint16(a,b,!0);this.Ka=!0},Qr:function(a,b){a&1?(this.Nb[a]=b,this.Nb[a+1]=b>>8):this.Jh[a>>1]=b;this.Ka=!0},Ir:function(a,b){this.se.setInt32(a,b,!0);this.Ka=!0},Kr:function(a,b){a&3?(this.Nb[a]=b,this.Nb[a+1]=b>>8,this.Nb[a+2]=b>>16,this.Nb[a+3]=b>>24):this.ba[a>>2]=b;this.Ka=!0}};
            function cc(a,b,c,d,e,m){a.Kf=b;a.Sc=c;a.Yc=d>>2;a.Tc=e;a.Zc=m>>2;a.ck=b?ic(nc|oc):0;a.Od=b?ic(nc):0}var lc=[],fc=[r.prototype.hr,r.prototype.tr,r.prototype.nr,r.prototype.Fr,r.prototype.Rr,r.prototype.Lr],kc=[r.prototype.ir,r.prototype.ur,r.prototype.or,r.prototype.Gr,r.prototype.Sr,r.prototype.Mr],jc=[r.prototype.jr,r.prototype.vr,r.prototype.pr,r.prototype.Hr,r.prototype.Tr,r.prototype.Nr];
            if(bb)var ec=[r.prototype.fr,r.prototype.qr,r.prototype.kr,r.prototype.Dr,r.prototype.Or,r.prototype.Ir],dc=[r.prototype.gr,r.prototype.sr,r.prototype.mr,r.prototype.Er,r.prototype.Qr,r.prototype.Kr];
            function pc(a,b){Ia.call(this,"CPU",a,pc);var c=a.cycles||b,d=a.multiplier||1;this.R={};this.R.Bd=c;this.R.Ce=d;this.R.qi=Math.round(this.R.Bd/1E4)/100;this.R.nf=this.R.qi*this.R.Ce;this.ha.Qb=!1;this.ha.Xm=!1;this.ha.pk=a.autoStart;this.ha.Qm=!1;c=La.autostart;void 0!==c&&(this.ha.pk="true"==c?!0:"false"==c?!1:null);this.ha.fi=!1;this.R.ui=this.R.Zf=0;this.R.xi=a.csStart;this.R.Xg=a.csInterval;this.R.Yg=a.csStop;this.ed=[];var e=this;this.dq=function(){rc(e)};Za(this)}Qa(pc);f=pc.prototype;
            f.Lc=function(a,b,c,d){this.la=b;this.Ra=d;this.za=a;for(b=null;b=gb(a,"Video",b);)this.ed.push(b);this.fa=gb(a,"ChipSet");Za(this)};f.reset=function(){};f.save=function(){return null};f.restore=function(){return!1};f.gc=function(a,b){if(!b){if(a&&this.restore){sc(this);if(!this.restore(a))return!1;tc(this)}else this.reset();this.pc("No debugger detected")}uc(this);this.de();return!0};f.fc=function(a){return a&&this.save?this.save():!0};
            function vc(a){(!0===a.ha.pk||null===a.ha.pk&&void 0===a.qa.run)&&rc(a)}f.bn=function(){return 0};function tc(a){void 0===a.R.xi&&(a.R.xi=0);void 0===a.R.Xg&&(a.R.Xg=-1);void 0===a.R.Yg&&(a.R.Yg=-1);a.ha.fi=0<=a.R.xi&&0<a.R.Xg;a.ha.fi&&(a.R.ui=0,a.R.Zf=a.R.xi-a.rf)}f.de=function(){this.za&&this.za.ae&&this.za.ae.de()};
            function uc(a){for(var b=0;b<a.ed.length;b++)wc(a.ed[b]);if(a.za&&a.za.ae&&(a=a.za.ae,a.zo)){lb(a,18,a.Ig,a.ko,a.canvas.style.color);if(a.ft){var b=a.la,c=a.Xa,d,e;null==d&&(d=0);null==e&&(e=b.Xj-d|0);null==c&&(c={gk:0,Pd:0,Rj:[]});var m=d>>>b.Aa;d=d+e-1>>>b.Aa;c.gk=0;for(c.Pd=0;m<=d;)e=b.ka[m],c.gk+=e.size,e.size&&(c.Rj.push(na(jb,m,0,0,e.type)),c.Pd++),m++;a.Xa=c;a.Bn=a.Xa.Pd*a.la.ob/691200;b=0;a.Xa.Fm=0;a.Xa.zg||(a.Xa.zg=[]);c=-1;d=0;var n=-1;for(e=0;e<a.Xa.Pd;e++){var p=a.Xa.Rj[e],m=oa(jb.type,
            p),p=oa(jb.yn,p);if(m!=c||p!=n+1)(n=e-d)&&(b+=Bb(a,d,n,c)),c=m,d=e;n=p}b+=Bb(a,d,e-d,c);c=a.Xa.io!=b;a.Xa.io=b;if(c){c=new eb(0,0,a.Ig.width,a.Ig.height);a.Xa.Ff=[];d=a.Xa.Pd;for(b=0;b<a.Xa.Fm;b++)e=a.Xa.zg[b].Pd,a.Xa.Ff.push(fb(c,e,d,!b)),d-=e;for(b=0;b<a.Xa.Ff.length;b++)c=a.Xa.zg[b],d=e=a.Xa.Ff[b],m=a.ko,(n=hc[c.type])||(n=new db),m.strokeStyle="black",m.strokeRect(d.x,d.y,d.Kc,d.Vc),m.fillStyle="string"==typeof n?n:n.toString(),m.fillRect(d.x,d.y,d.Kc,d.Vc),d=a,m=e,d.oi=d.$m,d.Wf=d.dn,e=m.x+(m.Kc>>
            1),n=m.y+(m.Vc>>1),p=m.Vc,m.Kc<m.Vc&&(p=m.Kc,d.Ym=!0,d.wd.save(),d.wd.translate(e,n),d.wd.rotate(-Math.PI/2),e=n=0),p<d.Wf&&(d.Wf=p,d.oi=d.Wf+"px Monaco, Lucida Console, Courier New"),m=n,d.cd=e,d.Cf=m,d=a,c=gc[c.type]+" ("+(c.Pd*a.la.ob/1024|0)+"Kb)",d.wd.font=d.oi,d.cd-=d.wd.measureText(c).width>>1,d.Cf+=(d.Wf>>1)-2,k(d,c),d.Ym&&(d.wd.restore(),d.Ym=!1)}}else k(a,"This space intentionally left blank");a.$h.drawImage(a.Ig,0,0,a.Ig.width,a.Ig.height,a.At,a.Dt,a.Ys,a.at);a.zo=!1}}
            f.Jd=function(){this.ed.length&&this.ed[0].Jd()};
            f.Lb=function(a,b,c){var d=this;a=!1;switch(b){case "run":this.qa[b]=c;c.onclick=function(){var a;if(a=d.za)if(a=d.za,a.ha.dc)a=!0;else{var b=null,c,p=Ra(a.id);for(c=0;c<p.length&&(b=p[c],b===a||b.ha.Sf);c++);if(c==p.length)for(c=0;c<p.length&&(b=p[c],b===a||b.ha.dc);c++);c==p.length&&(b=a);ra("The "+b.type+" component ("+b.id+") is not "+(b.ha.Sf?"powered yet":"ready yet"+(b.ni?" (waiting for notification)":""))+".");a=!1}a&&(d.ha.Qb?xc(d,!0):rc(d,!0))};a=!0;break;case "reset":this.qa[b]=c;c.onclick=
            function(){d.za&&yc(d.za)};a=!0;break;case "speed":this.qa[b]=c;a=!0;break;case "setSpeed":this.qa[b]=c,c.onclick=function(){zc(d,d.R.Ce<<1,!0)},c.textContent=this.R.nf.toFixed(2)+"Mhz",a=!0}return a};function Ac(a,b){if(a.ha.Qb){var c=a.A-b;a.A-=c;a.Ad-=c}}function Bc(a,b,c){a.rf+=b;c&&(a.Ad=a.A=0)}
            function Cc(a,b){var c=30;60>c&&(c=60);2>c&&(c=2);var d=1;b&&1<a.R.Ce&&a.R.ze&&(d=a.R.ze/a.R.qi);a.R.ln=Math.round(1E3/30);a.R.Tp=Math.floor(a.R.Bd/c*d);a.R.Jk=Math.floor(a.R.Bd/30*d);a.R.qn=Math.floor(a.R.Bd/60*d);a.R.pn=Math.floor(a.R.Bd/2*d);b||(a.R.ah=a.R.Jk,a.R.$g=a.R.qn,a.R.Zg=a.R.pn);a.R.Kk=0}function Dc(a,b){var c=a.rf+a.Ge+a.Ad-a.A;b&&1<a.R.Ce&&a.R.ze>a.R.qi&&(c=Math.round(c/a.R.Ce));return c}function sc(a){a.R.ze=0;a.rf=a.Ge=a.Ad=a.A=0;tc(a);zc(a,1)}
            function ob(a){return a.ha.Qb&&a.R.ze?a.R.ze.toFixed(2)+"Mhz":"Stopped"}function zc(a,b,c){if(void 0!==b){.8>a.R.ze/a.R.nf&&(b=1);a.R.Ce=b;b=a.R.qi*a.R.Ce;if(a.R.nf!=b){a.R.nf=b;b=a.R.nf.toFixed(2)+"Mhz";var d=a.qa.setSpeed;d&&(d.textContent=b);a.pc("target speed: "+b)}c&&a.Jd()}Bc(a,a.Ge);a.Ge=0;a.R.Yf=ka();a.R.of=0;Cc(a)}
            function rc(a,b){if(Ya(a,!0)){if(!a.ha.Qb){zc(a);a.za&&a.za.start(a.R.Yf,Dc(a));a.ha.Qb=!0;a.ha.Xm=!0;a.fa&&Ec(a.fa);var c=a.qa.run;c&&(c.textContent="Halt");a.de(!0);b&&a.Jd()}a.R.Kk>=a.R.Bd&&Cc(a,!0);a.R.bh=0;a.R.ri=ka();a.R.of&&(c=a.R.ri-a.R.of,c>a.R.ln&&(a.R.Yf+=c,a.R.Yf>a.R.ri&&(a.R.Yf=a.R.ri)));try{do{var d=a.ha.fi?1:a.R.Tp;if(a.fa){Fc(a.fa);var e=a.fa,c=d,m=e.Vb[0];if(m.kf){var n=(Dc(e.U,e.ue)-m.Yd)/e.qj|0,p=Gc(e,0)-n;6==m.mode&&(p-=n);var v=p*e.qj|0;6==m.mode&&(v>>=1);c>v&&(c=v)}var d=c,w=
            a.fa,c=d;if(w.ea&&w.ea[11]&64){var G=w.eg-Dc(w.U,w.ue);0<G&&c>G&&(c=G)}d=c}a.Qn(d);var N=a.Ad-a.A;a.Ge+=N;a.R.bh+=N;Bc(a,0,!0);var c=a,L=N;if(c.ha.fi){var U=!1;c.R.ui=c.R.ui+c.bn()|0;c.R.Zf-=L;0>=c.R.Zf&&(c.R.Zf+=c.R.Xg,U=!0);0<=c.R.Yg&&c.R.Yg<=Dc(c)&&(c.R.Xg=c.R.Yg=-1,tc(c),xc(c),U=!0);U&&c.pc(Dc(c)+" cycles: checksum="+da(c.R.ui))}a.R.$g-=N;0>=a.R.$g&&(a.R.$g+=a.R.qn,uc(a));a.R.Zg-=N;0>=a.R.Zg&&(a.R.Zg+=a.R.pn,a.de());a.R.ah-=N;if(0>=a.R.ah){a.R.ah+=a.R.Jk;break}}while(a.ha.Qb)}catch(W){xc(a);uc(a);
            a.de();a.za&&a.za.stop(ka(),Dc(a));Ya(a,!1);ab(a,W.stack||W.message);return}d=setTimeout;e=a.dq;a.R.of=ka();m=a.R.ln;a.R.bh&&(m=Math.round(m*a.R.bh/a.R.Jk));m-=a.R.of-a.R.ri;if(n=a.R.of-a.R.Yf)a.R.ze=Math.round(a.Ge/(10*n))/100,864E5<=n&&(a.rf=0,a.fa&&Fc(a.fa,!0),zc(a));if(0>m||a.R.ze<a.R.nf)m=0;a.R.Kk+=a.R.bh;a.R.of+=m;d(e,m)}else uc(a),a.de(),a.za&&a.za.stop(ka(),Dc(a))}f.Qn=function(){return 0};
            function xc(a,b){a.ha.Wc&&(a.ha.qk=!0);a.Ad-=a.A;a.A=0;Bc(a,a.Ge);a.Ge=0;if(a.ha.Qb){a.ha.Qb=!1;a.fa&&Ec(a.fa);var c=a.qa.run;c&&(c.textContent="Run")}a.ha.Qg=b}var qb=80386,h=-1,Ab=1,zb=4,yb=16,xb=64,wb=128,vb=256,ub=512,tb=1024,sb=2048,oc=64,nc=32,Hc=vb|ub|tb,Ic=Ab|zb|yb|xb|wb|sb,Jc=Ab|zb|yb|xb|wb;
            function Kc(a,b,c,d){this.U=a;this.Ra=a.Ra;this.id=b;this.Hj=c||"";this.sa=0;this.Ib=65535;this.Ie=this.Ib+1;this.Ja=this.uc=this.bi=this.Ob=this.type=this.xa=0;this.od=h;this.ja=this.Ld=2;this.C=this.T=65535;this.xm=this.id==Mc?Array(32):[];this.rk=null;this.mi=!1;Nc(this,!0,d)}var Mc=1;f=Kc.prototype;f.Lp=function(a){this.sa=a&65535;return this.xa=this.sa<<4};
            f.Kp=function(a,b){var c,d,e=this.U;a&=65535;a&4?(c=e.Ne.xa,d=c+e.Ne.Ib|0):(c=e.pd,d=e.If);if(!b||c){c=c+(a&65528)|0;if(d-c|0)return b||(e.A-=15),Oc(this,c,a,b);b||Pc.call(e,13,a)}return h};f.Jp=function(a){var b=this.U;a=b.qd+(a<<2);var c=b.na(a);b.ca&=~(vb|ub);return this.load(b.na(a+2))+c|0};f.Ip=function(a){var b=this.U;a<<=3;var c=b.qd+a|0;if(7<=(b.Ve-c|0))return Oc(this,c,a)+b.Vl;Pc.call(b,13,a|3,!0);return h};f.eo=function(a){return this.xa+a|0};f.ho=function(a){return this.xa+a|0};
            f.Im=function(a,b,c){return(a>>>0)+b<=this.Ie?this.xa+a|0:this.Xh(0,0,c)};f.co=function(a,b,c){return(a>>>0)+b>this.Ie?this.xa+a|0:this.Xh(0,0,c)};f.Xh=function(a,b,c){c||Pc.call(this.U,13,0);return h};f.Jm=function(a,b,c){return(a>>>0)+b<=this.Ie?this.xa+a|0:this.Yh(0,0,c)};f.fo=function(a,b,c){return(a>>>0)+b>this.Ie?this.xa+a|0:this.Yh(0,0,c)};f.Yh=function(a,b,c){c||Pc.call(this.U,13,0);return h};
            function Qc(a,b,c){var d=a.U,e=d.na(b+2),m=d.na(b)|(e&255)<<16,d=d.na(b+4);a.sa=c;a.xa=m;a.Ib=d;a.Ie=(d>>>0)+1;a.Ob=e;a.type=e&7936;a.bi=0;a.od=b;Nc(a,!0)}
            function Oc(a,b,c,d){var e=a.U,m=e.na(b+0),n=e.na(b+4),p=n&7936,v=e.na(b+2)|(n&255)<<16,w=e.na(b+6),G=c&65528;e.ma>=qb&&(v|=(w&65280)<<16,m|=(w&15)<<16,w&128&&(m=m<<12|4095));for(;;){var N,L,U;if(a.id==Mc){a.mi=!1;N=a.rk;var W,za;U=c&3;var ga=(n&24576)>>13;if(G&&!(n&32768)){d||Pc.call(e,11,c);v=h;break}if(6144<=p){U=c&3;if(U>a.Ja){if(!1!==N&&!(ga==a.Ja||p&1024&&ga<=a.Ja)){v=h;break}G=e.Fa();Rc(e,e.Fa(),!0);t(e,G);a.mi=!0}W=!1}else{if(256==p){if(!Sc(a,c,N)){v=h;break}return a.xa}if(1024==p)W=!0,za=
            -1,L=c,U<a.Ja&&(U=a.Ja);else if(1536==p)W=!0,za=~(16384|vb|ub),L=c|1;else if(1792==p)W=!0,za=~(16384|vb),L=c|1;else if(1280==p){if(!Sc(a,v&65535,N)){v=h;break}return a.xa}}if(W){b=v&65535;if(U<=ga){d=a.Ja;if(a.load(b,!0)===h){v=h;break}e.Vl=m;if(a.Ja<d){if(!0!==N){v=h;break}G=q(e);m=0;for(n&=31;n--;)a.xm[m++]=Tc(e,e.ra,G),G+=2;n=e.hb.xa;N=(a.Ja<<2)+2;d=N+2;U=e.ra.sa;L=q(e);Rc(e,e.na(n+d),!0);t(e,e.na(n+N));u(e,U);for(u(e,L);m;)u(e,a.xm[--m]);a.mi=!0}e.ca&=za;return a.xa}d||Pc.call(e,13,L,!0);v=h;
            break}else if(!1!==W){d||Pc.call(e,13,c,!0);v=h;break}}else if(2==a.id){if(G){if(!(n&32768)){d||Pc.call(e,11,c);v=h;break}if(4096>p||2048==(p&2560)){d||Pc.call(e,13,c,!!n);v=h;break}}}else if(3==a.id){if(!(n&32768)){d||Pc.call(e,12,c);v=h;break}if(!G||4096>p||512!=(p&2560)){d||Pc.call(e,13,c,!0);v=h;break}}else if(4==a.id){if(!G||256!=p&&768!=p){d||Pc.call(e,10,c,!0);v=h;break}}else if(6==a.id&&!(p&4096)&&768<p){v=h;break}a.sa=c;a.xa=v;a.Ib=m;a.Ie=(m>>>0)+1;a.Ob=n;a.type=p;a.bi=w;a.od=b;Nc(a,!0);
            break}return v}
            function Sc(a,b,c){var d=a.U,e=d.hb.xa,m=a.Ja,n=d.hb.sa;if(!c){if(768!=d.hb.type)return Pc.call(d,10,b,!0),!1;d.Eb(d.hb.od+4,d.hb.Ob&-769|256)}if(d.hb.load(b)===h)return!1;var p=d.hb.xa;if(!1===c){if(768!=d.hb.type)return Pc.call(d,13,b,!0),!1}else{if(768==d.hb.type)return Pc.call(d,13,b,!0),!1;d.Eb(d.hb.od+4,d.hb.Ob|=768);d.hb.type=768}d.Eb(e+14,l(d));d.Eb(e+16,rb(d));d.Eb(e+18,d.F);d.Eb(e+20,d.G);d.Eb(e+22,d.H);d.Eb(e+24,d.D);d.Eb(e+26,q(d));d.Eb(e+28,d.L);d.Eb(e+30,d.K);d.Eb(e+32,d.J);d.Eb(e+34,
            d.Qa.sa);d.Eb(e+36,d.oa.sa);d.Eb(e+38,d.ra.sa);d.Eb(e+40,d.kb.sa);d.Ne.load(d.na(p+42));Uc(d,d.na(p+16)|(c?16384:0));d.F=d.na(p+18);d.G=d.na(p+20);d.H=d.na(p+22);d.D=d.na(p+24);d.L=d.na(p+28);d.K=d.na(p+30);d.J=d.na(p+32);d.Qa.load(d.na(p+34));d.kb.load(d.na(p+40));Vc(d,d.na(p+14),d.na(p+36));b=38;e=26;a.Ja<m&&(e=(a.Ja<<2)+2,b=e+2);Rc(d,d.na(p+b),!0);t(d,d.na(p+e));c&&d.Eb(p+0,n);d.zb|=8;return!0}
            f.save=function(){return[this.sa,this.xa,this.Ib,this.Ob,this.id,this.Hj,this.Ja,this.uc,this.od,this.Ld,this.T,this.ja,this.C,this.type,this.Ie]};f.restore=function(a){"number"==typeof a?this.load(a):(this.sa=a[0],this.xa=a[1],this.Ib=a[2],this.Ob=a[3],this.id=a[4],this.Hj=a[5],this.Ja=a[6],this.uc=a[7],this.od=a[8],this.Ld=a[9]||2,this.T=a[10]||65535,this.ja=a[11]||2,this.C=a[12]||65535,this.type=a[13]||this.Ob&7936,this.Ie=a[14]||(this.Ib>>>0)+1)};
            function Nc(a,b,c){void 0===c&&(c=!!(a.U.zb&1));a.Qf=!1;if(c){a.load=a.Kp;a.jn=a.Ip;a.qc=a.Im;a.lc=a.Jm;if(!(a.sa&-4))a.qc=a.Xh,a.lc=a.Yh;else if(a.type&4096){6144==(a.type&6656)&&(a.qc=a.Xh);if(a.type&2048||!(a.type&512))a.lc=a.Yh;1024==(a.type&3072)&&(a.qc==a.Im&&(a.qc=a.co),a.lc==a.Jm&&(a.lc=a.fo),a.Qf=!0)}b&&(a.sa&-4&&a.od!==h&&(b=a.od+5,a.U.Oe(b,a.U.wc(b)|1)),a.Ja=a.sa&3,a.uc=(a.Ob&24576)>>13,a.U.ma<qb||!(a.bi&64)?(a.ja=2,a.C=65535):(a.ja=4,a.C=-1),a.Ld=a.ja,a.T=a.C)}else a.load=a.Lp,a.jn=a.Jp,
            a.qc=a.eo,a.lc=a.ho,a.Ja=a.uc=0,a.od=h}
            function Wc(a){this.ma=a.model||8088;var b=0;switch(this.ma){default:b=4772727;break;case 80286:b=6E6;break;case qb:b=16E6}pc.call(this,a,b);this.lm=61442;this.zh=Hc;this.yh=4;this.ub=255;this.B=this.ma==qb?Xc:80286==this.ma?Yc:Zc;this.Ia=$c;this.pm=ad;this.qm=bd;this.rm=cd;if(80186<=this.ma&&(this.Ia=$c.slice(),this.pm=ad.slice(),this.qm=bd.slice(),this.ub=31,this.Ia[15]=dd,this.Ia[96]=ed,this.Ia[97]=fd,this.Ia[98]=gd,this.Ia[99]=dd,this.Ia[100]=dd,this.Ia[101]=dd,this.Ia[102]=dd,this.Ia[103]=dd,
            this.Ia[104]=hd,this.Ia[105]=id,this.Ia[106]=jd,this.Ia[107]=kd,this.Ia[108]=ld,this.Ia[109]=md,this.Ia[110]=nd,this.Ia[111]=od,this.Ia[192]=pd,this.Ia[193]=qd,this.Ia[200]=rd,this.Ia[201]=sd,this.Ia[241]=td,this.pm[7]=ud,this.qm[7]=ud,80286<=this.ma)){this.lm=2;this.zh|=28672;this.yh=0;this.Ia[15]=vd;this.yg=wd.slice();for(a=0;a<this.yg.length;a++)this.yg[a]||(this.yg[a]=xd);this.Ia[84]=yd;this.Ia[99]=zd;if(this.ma>=qb){var c;this.Ia[100]=Ad;this.Ia[101]=Bd;this.Ia[102]=Cd;this.Ia[103]=Dd;for(c in x)this.yg[+c]=
            x[c]}}this.Ch=[];this.nm=[];this.Ad=this.Uh=0;this.ha.Qg=this.ha.vo=!1;this.Em=0;this.Te=this.ka=[];this.Aa=this.ob=this.Ea=this.Xd=this.$c=this.xb=this.$d=0;Ed(this)}Qa(Wc,pc);
            var Zc={kh:4,N:5,aa:6,Y:7,Z:8,I:9,O:11,P:12,Ee:4,Mk:60,Nk:83,Sb:3,tb:9,ec:16,hh:1,Uk:19,Wk:28,Yk:16,Xk:21,Vk:37,Sk:2,Gi:9,Tk:5,Rk:33,Ii:10,Hi:8,ag:3,$f:15,ll:51,ml:1,nl:2,ol:4,kl:32,Ji:15,ql:15,Ba:16,Ca:4,sl:11,rl:18,pl:24,Cb:4,tl:2,pf:16,ul:17,Oi:18,vl:19,Ni:5,Pi:6,Al:2,zl:8,xl:9,yl:10,wl:10,Qi:10,Ri:10,$k:80,bl:144,Zk:86,al:154,dl:101,fl:165,cl:107,el:171,Cl:70,El:113,Bl:76,Dl:124,hl:80,jl:128,gl:86,il:134,cg:3,bg:16,Yi:10,Xi:8,Fl:51,Tb:8,Gl:17,Hl:36,mc:11,Il:16,Fe:10,Mc:2,Di:18,Ei:7,Fi:15,Ki:12,
            Li:7,Mi:11,Si:18,Ti:7,Ui:15,Zi:15,$i:7,aj:13,gj:11,hj:7,ij:8,Jl:8,Ml:12,Kl:18,Ll:17,Nl:15,cj:8,bj:20,dj:2,lj:3,dg:9,kj:5,jj:11,nj:4,mj:17,Ol:11},Yc={kh:0,N:0,aa:0,Y:0,Z:0,I:0,O:1,P:1,Ee:3,Mk:14,Nk:16,Sb:2,tb:7,ec:7,hh:0,Uk:7,Wk:13,Yk:7,Xk:11,Vk:16,Sk:3,Gi:6,Tk:2,Rk:13,Ii:5,Hi:5,ag:2,$f:7,ll:23,ml:0,nl:1,ol:3,kl:17,Ji:7,ql:11,Ba:7,Ca:3,sl:7,rl:11,pl:15,Cb:2,tl:3,pf:7,ul:8,Oi:8,vl:8,Ni:4,Pi:4,Al:2,zl:3,xl:5,yl:2,wl:3,Qi:5,Ri:3,$k:14,bl:22,Zk:17,al:25,dl:17,fl:25,cl:20,el:28,Cl:13,El:21,Bl:16,Dl:24,
            hl:13,jl:21,gl:16,il:24,cg:2,bg:7,Yi:5,Xi:5,Fl:19,Tb:5,Gl:5,Hl:17,mc:3,Il:5,Fe:3,Mc:0,Di:8,Ei:5,Fi:9,Ki:5,Li:5,Mi:4,Si:5,Ti:5,Ui:4,Zi:7,$i:5,aj:8,gj:3,hj:4,ij:3,Jl:11,Ml:11,Kl:15,Ll:15,Nl:7,cj:5,bj:8,dj:0,lj:2,dg:6,kj:3,jj:6,nj:3,mj:5,Ol:5},Xc={kh:0,N:0,aa:0,Y:0,Z:0,I:0,O:1,P:1,Ee:3,Mk:14,Nk:16,Sb:2,tb:7,ec:7,hh:0,Uk:7,Wk:13,Yk:7,Xk:11,Vk:16,Sk:3,Gi:6,Tk:2,Rk:13,Ii:5,Hi:5,ag:2,$f:7,ll:23,ml:0,nl:1,ol:3,kl:17,Ji:7,ql:11,Ba:7,Ca:3,sl:7,rl:11,pl:15,Cb:2,tl:3,pf:7,ul:8,Oi:8,vl:8,Ni:4,Pi:4,Al:2,zl:3,xl:5,
            yl:2,wl:3,Qi:5,Ri:3,$k:14,bl:22,Zk:17,al:25,dl:17,fl:25,cl:20,el:28,Cl:13,El:21,Bl:16,Dl:24,hl:13,jl:21,gl:16,il:24,cg:2,bg:7,Yi:5,Xi:5,Fl:19,Tb:5,Gl:5,Hl:17,mc:3,Il:5,Fe:3,Mc:0,Di:8,Ei:5,Fi:9,Ki:5,Li:5,Mi:4,Si:5,Ti:5,Ui:4,Zi:7,$i:5,aj:8,gj:3,hj:4,ij:3,Jl:11,Ml:11,Kl:15,Ll:15,Nl:7,cj:5,bj:8,dj:0,lj:2,dg:6,kj:3,jj:6,nj:3,mj:5,Ol:5,un:11,Qk:6,Ok:8,Pk:5,Yp:3,Wp:6,Xp:6,wn:9,vn:12,Wi:3,Vi:6,$p:4,Zp:5,fj:3,ej:7};f=Wc.prototype;
            f.Dk=function(a,b){this.ka=this.Te=a;this.Aa=b;this.ob=1<<this.Aa;this.Ea=this.ob-1;this.Xd=a.length;this.$c=this.Xd-1};function Fd(a){if(a.ka===a.Te){a.ka=Array(a.Xd);a.dk=new r(null,0,0,5,null,a);for(var b=0;b<a.Xd;b++)a.ka[b]=a.dk}else for(b=0;b<a.Ah.length;b++)a.ka[a.Ah[b]]=a.dk;a.Ah=[]}
            function mc(a,b,c,d){var e=(b&-4194304)>>>20,m=a.Te[(a.gg+e&a.xb)>>>a.Aa],n=m.yc(e);if(!(n&1))return d||Gd.call(a,b,!1,c),null;if(!(n&4)&&3==a.oa.Ja)return d||Gd.call(a,b,!0,c),null;var p=(b&4190208)>>>10,n=a.Te[((n&-4096)+p&a.xb)>>>a.Aa],v=n.yc(p);if(!(v&1||d))return d||Gd.call(a,b,!1,c),null;if(!(v&4)&&3==a.oa.Ja)return d||Gd.call(a,b,!0,c),null;c=a.Te[((v&-4096)+(b&4095)&a.xb)>>>a.Aa];if(d)return c;d=new r(b&-4096,0,0,6);cc(d,c,m,e,n,p);b>>>=a.Aa;a.ka[b]=d;a.Ah.push(b);return d}
            f.reset=function(){this.ha.Qb&&xc(this);Ed(this);sc(this);this.ha.yd=!1};
            function Ed(a){a.F=0;a.D=0;a.G=0;a.H=0;a.Fd=0;a.L=0;a.K=0;a.J=0;a.Pb=!1;a.gb=a.$b=0;a.ld=0;a.Oh=0;a.zb=65520;a.qd=0;a.Ve=1023;a.ca=a.Ci=0;a.ng=a.uh=a.mg=a.og=0;a.zi=-1;a.oa=new Kc(a,Mc,"CS");a.kb=new Kc(a,2,"DS");a.Qa=new Kc(a,2,"ES");a.ra=new Kc(a,3,"SS");t(a,0);Rc(a,0);a.ma>=qb&&(a.H=772,a.zb=16,a.yj=0,a.nh=0,a.gg=0,a.tm=Array(8),a.um=Array(8),a.Hd=new Kc(a,2,"FS"),a.Id=new Kc(a,2,"GS"));a.On=new Kc(a,0,"NULL");a.da=a.kb;a.ga=a.ra;a.Q=a.va=0;a.V=a.Ga=h;a.lb=0;Vc(a,0,65535);if(80286<=a.ma){a.pd=
            0;a.If=65535;a.Ne=new Kc(a,5,"LDT",!0);a.hb=new Kc(a,4,"TSS",!0);a.Kb=new Kc(a,6,"VER",!0);Vc(a,65520,61440);var b,c=l(a);b=a.oa;var d=-65536;b.U.ma<qb&&(d&=16777215);b=b.xa=d;a.pa=b+c|0;a.rh=b+a.oa.Ib|0}Uc(a,0);Jd(a)}function Kd(a){2==a.Ld?(a.an=a.na,a.Gc=y,a.Oc=Ld,a.ie=Md,a.Ha=z,a.vb=Nd,a.Fc=Od):(a.an=a.Tg,a.Gc=A,a.Oc=Pd,a.ie=Qd,a.Ha=B,a.vb=Rd,a.Fc=Sd)}function Td(a,b){a.ja!=b&&(a.va|=4096,a.ja=b,a.C=2==b?65535:-1,Ud(a))}
            function Ud(a){2==a.ja?(a.dataType=32768,a.we=a.na,a.wf=a.Eb):(a.dataType=-2147483648,a.we=a.Tg,a.wf=a.Kj)}function Vd(a){a.Ld=a.oa.Ld;a.T=a.oa.T;Kd(a);a.ja=a.oa.ja;a.C=a.oa.C;Ud(a);a.va&=-12289}f.bn=function(){var a=this.F+this.D+this.G+this.H+q(this)+this.L+this.K+this.J|0;return a=a+l(this)+this.oa.sa+this.kb.sa+this.ra.sa+this.Qa.sa+rb(this)|0};function Wd(a,b,c,d){void 0!==d&&(void 0===a.Ch[b]&&(a.Ch[b]=[]),a.Ch[b].push([c,d]))}
            function Xd(a,b){var c=a.nm[b];null!=c&&(c(--a.Uh),delete a.nm[b])}function Jd(a,b){void 0===b&&(b=!!(a.zb&1));a.rm=b?Yd:cd;Nc(a.oa);Nc(a.kb);Nc(a.ra);Nc(a.Qa);a.ma>=qb&&(Nc(a.Hd),Nc(a.Id),Vd(a))}
            f.save=function(){var a=new Zd(this);a.set(0,[this.F,this.D,this.G,this.H,q(this),this.L,this.K,this.J]);var b=l(this),c=this.oa.save(),d=this.kb.save(),e=this.ra.save(),m=this.Qa.save(),n;null!=this.pd?(n=[this.zb,this.pd,this.If,this.qd,this.Ve,this.Ne.save(),this.hb.save(),this.Ci],n.push(this.yj),n.push(this.nh),n.push(this.gg),n.push(this.tm),n.push(this.um)):n=null;b=[b,c,d,e,m,n,rb(this)];this.ma>=qb&&(b.push(this.Hd.save()),b.push(this.Id.save()));a.set(1,b);a.set(2,[this.da.Hj,this.ga.Hj,
            this.Q,this.va,this.lb,this.V,this.Ga]);a.set(3,[0,this.rf,this.R.Ce]);a.set(4,Qb(this.la));return a.data()};
            f.restore=function(a){var b=a[0];this.F=b[0];this.D=b[1];this.G=b[2];this.H=b[3];var c=b[4];this.L=b[5];this.K=b[6];this.J=b[7];b=a[1];this.oa.restore(b[1]);this.kb.restore(b[2]);this.ra.restore(b[3]);this.Qa.restore(b[4]);var d=b[5];d&&d.length&&(this.zb=d[0],this.pd=d[1],this.If=d[2],this.qd=d[3],this.Ve=d[4],this.Ne.restore(d[5]),this.hb.restore(d[6]),this.Ci=d[7],this.ma>=qb&&(this.yj=d[8],this.nh=d[9],this.gg=d[10],this.tm=d[11],this.um=d[12]),Jd(this));Uc(this,b[6]);Vc(this,b[0],this.oa.sa);
            t(this,c);Rc(this,this.ra.sa);this.ma>=qb&&(this.Hd.restore(b[7]),this.Id.restore(b[8]));b=a[2];this.da=null!=b[0]&&$d(this,b[0])||this.kb;this.ga=null!=b[1]&&$d(this,b[1])||this.ra;this.Q=b[2];this.va=b[3];this.lb=b[4];this.V=b[5];this.Ga=b[6];b=a[3];this.rf=b[1];zc(this,b[2]);a:{b=this.la;a=a[4];for(c=0;c<a.length-1;c+=2){var d=a[c],e=a[c+1];if(e&&e.length<b.nn){for(var m=0,n=Array(b.nn),p=0;p<e.length-1;)for(var v=e[p++],w=e[p++];v--;)n[m++]=w;e=n}m=b.ka[d];if(!m||!m.restore(e)){ra("Unable to restore memory block "+
            d);b=!1;break a}}void 0!==a[c]&&Ib(b,a[c]);b=!0}return b};function $d(a,b){switch(b){case "CS":return a.oa;case "DS":return a.kb;case "SS":return a.ra;case "ES":return a.Qa;case "NULL":return a.On;default:return[0,b,0,0,""]}}function ae(a,b){var c=l(a);a.pa=a.oa.load(b)+c|0;a.rh=a.oa.xa+a.oa.Ib|0;Vd(a);a.Q|=a.yh}function be(a,b){a.kb.load(b);a.Q|=a.yh}
            function Rc(a,b,c){var d=q(a);a.Bc=a.ra.load(b)+d|0;a.ra.Qf?(a.Wl=a.ra.xa+a.ra.T|0,a.Xl=a.ra.xa+a.ra.Ib|0):(a.Wl=a.ra.xa+a.ra.Ib|0,a.Xl=a.ra.xa);c||(a.Q|=4)}function ce(a,b){a.Qa.load(b);a.Q|=a.yh}function l(a){return a.pa-a.oa.xa|0}function C(a,b){a.pa=a.oa.xa+(b&a.C)|0}function Vc(a,b,c,d){a.oa.rk=d;a.Vl=b;b=a.oa.load(c);return b!==h?(a.pa=b+(a.Vl&a.C)|0,a.rh=b+a.oa.Ib|0,Vd(a),a.oa.mi):null}
            function de(a,b){a.pa=a.pa+b|0;var c=a.rh-a.pa|0;0>c&&0<=(a.rh^a.pa)&&(8088>=a.ma||a.oa.Ib==a.oa.T?C(a,a.pa-a.oa.xa):-1>c&&Pc.call(a,13,0))}function q(a){return a.Fd&~a.ra.T|a.Bc-a.ra.xa}function t(a,b){a.Fd=b;a.Bc=a.ra.xa+(b&a.ra.T)|0}function ee(a,b,c,d,e,m){if(63!=(e&63)&&e!=a.resultType){var n=(e^a.resultType)&a.resultType;n&&(n&1&&fe(a),n&2&&ge(a),n&4&&he(a),n&8&&ie(a),n&16&&je(a),n&32&&ke(a))}m?(a.ng=d,a.mg=b):(a.ng=b,a.mg=d);a.uh=c;a.og=d;a.resultType=e}
            function D(a,b,c,d,e){a.resultType=c|26;a.og=b;d?le(a):me(a);e?ne(a):oe(a);return b}function pe(a,b,c,d){c&d?le(a):me(a);(b^c)&d?ne(a):oe(a)}function qe(a){return fe(a)?1:0}function fe(a){a.resultType&1&&(a.ca&=~Ab,(a.ng^(a.ng^a.uh)&(a.uh^a.mg))&a.resultType&-2147450752&&(a.ca|=Ab),a.resultType&=-2);return a.ca&Ab}function ge(a){a.resultType&2&&(a.ca&=~zb,38505>>((a.og^a.og>>4)&15)&1&&(a.ca|=zb),a.resultType&=-3);return a.ca&zb}
            function he(a){a.resultType&4&&(a.ca&=~yb,(a.mg^a.ng^a.uh)&16&&(a.ca|=yb),a.resultType&=-5);return a.ca&yb}function ie(a){a.resultType&8&&(a.ca&=~xb,a.og&((a.resultType&-2147450752)-1|a.resultType&-2147450752)||(a.ca|=xb),a.resultType&=-9);return a.ca&xb}function je(a){a.resultType&16&&(a.ca&=~wb,a.og&a.resultType&-2147450752&&(a.ca|=wb),a.resultType&=-17);return a.ca&wb}
            function ke(a){a.resultType&32&&(a.ca&=~sb,(a.ng^a.mg)&(a.uh^a.mg)&a.resultType&-2147450752&&(a.ca|=sb),a.resultType&=-33);return a.ca&sb}function me(a){a.resultType&=-2;a.ca&=~Ab}function re(a){a.resultType&=-5;a.ca&=~yb}function se(a){a.resultType&=-9;a.ca&=~xb}function oe(a){a.resultType&=-33;a.ca&=~sb}function le(a){a.resultType&=-2;a.ca|=Ab}function te(a){a.resultType&=-5;a.ca|=yb}function ue(a){a.resultType&=-9;a.ca|=xb}function ne(a){a.resultType&=-33;a.ca|=sb}
            function rb(a){return a.ca&~Ic|fe(a)|ge(a)|he(a)|ie(a)|je(a)|ke(a)}function ve(a,b){b=b|a.zb&1|65520;a.zb=a.zb&-65536|b&65535;a.zb&1&&Jd(a,!0)}function Uc(a,b,c){a.zb&1||(b&=-61441);void 0===c&&(c=a.oa.Ja);c?b=b&-12289|a.ca&12288:a.Ci=(b&12288)>>12;c>a.Ci&&(b=b&~ub|a.ca&ub);a.resultType=128;a.ca=a.ca&~(a.zh|Ic)|b&(a.zh|Ic)|a.lm;a.ca&vb&&(a.lb|=2,a.Q|=4)}
            f.Lb=function(a,b,c){var d=!1;switch(b){case "EAX":case "EBX":case "ECX":case "EDX":case "ESP":case "EBP":case "ESI":case "EDI":case "EIP":case "AX":case "BX":case "CX":case "DX":case "SP":case "BP":case "SI":case "DI":case "IP":case "PC":case "CS":case "DS":case "SS":case "ES":case "PS":case "C":case "P":case "A":case "Z":case "S":case "T":case "I":case "D":case "V":this.qa[b]=c;this.Em++;d=!0;break;default:d=this.parent.Lb.call(this,a,b,c)}return d};
            f.wc=function(a){return this.ka[(a&this.$d)>>>this.Aa].xc(a&this.Ea,a)};f.na=function(a){var b=a&this.Ea,c=(a&this.$d)>>>this.Aa;this.A-=this.B.kh;return b<this.Ea?this.ka[c].xj(b,a):this.ka[c].xc(b,a)|this.ka[c+1&this.$c].xc(0,a+1)<<8};f.Tg=function(a){var b=a&this.Ea,c=(a&this.$d)>>>this.Aa;if(b<this.Ea-2)return this.ka[c].yc(b,a);var d=(b&3)<<3;return this.ka[c].yc(b&-4,a)>>>d|this.ka[c+1&this.$c].yc(0,a+3)<<32-d};f.Oe=function(a,b){this.ka[(a&this.$d)>>>this.Aa].Cc(a&this.Ea,b&255,a)};
            f.Eb=function(a,b){var c=a&this.Ea,d=(a&this.$d)>>>this.Aa;this.A-=this.B.kh;c<this.Ea?this.ka[d].Oj(c,b&65535,a):(this.ka[d++].Cc(c,b&255,a),this.ka[d&this.$c].Cc(0,b>>8&255,a+1))};f.Kj=function(a,b){var c=a&this.Ea,d=(a&this.$d)>>>this.Aa;this.A-=this.B.kh;if(c<this.Ea-2)this.ka[d].Se(c,b,a);else{var e,m=(c&3)<<3,c=c&-4;e=this.ka[d].yc(c,a);this.ka[d].Se(c,e&~(-1<<m)|b<<m,a);d=d+1&this.$c;a+=3;e=this.ka[d].yc(0,a);this.ka[d].Se(0,e&-1<<m|b>>>32-m,a)}};
            function we(a,b,c){a.xh=b;a.V=b.qc(a.mh=c,1);return a.Q&1?0:a.wc(a.V)}function E(a,b){return we(a,a.da,b&a.T)}function F(a,b){return we(a,a.ga,b&a.T)}function xe(a,b,c){a.xh=b;a.V=b.qc(a.mh=c,a.ja);return a.Q&1?0:a.we(a.V)}function H(a,b){return xe(a,a.da,b&a.T)}function I(a,b){return xe(a,a.ga,b&a.T)}function ye(a,b,c){a.xh=b;a.Ga=a.V=b.qc(a.mh=c,1);return a.Q&1?0:a.wc(a.V)}function J(a,b){return ye(a,a.da,b&a.T)}function K(a,b){return ye(a,a.ga,b&a.T)}
            function ze(a,b,c){a.xh=b;a.Ga=a.V=b.qc(a.mh=c,a.ja);return a.Q&1?0:a.we(a.V)}function M(a,b){return ze(a,a.da,b&a.T)}function O(a,b){return ze(a,a.ga,b&a.T)}function P(a,b){a.Q&2||a.Oe(a.xh.lc(a.mh,1),b)}function Q(a,b){a.Q&2||a.wf(a.xh.lc(a.mh,a.ja),b)}function Tc(a,b,c){return a.we(b.qc(c,a.ja))}f.S=function(){var a=this.wc(this.pa);de(this,1);return a};function Ae(a){var b=a.na(a.pa);de(a,2);return b}function R(a){var b=a.an(a.pa);de(a,a.Ld);return b}
            f.ia=function(){var a=this.we(this.pa);de(this,this.ja);return a};f.M=function(){var a=this.wc(this.pa)<<24>>24;de(this,1);return a};function S(a,b){var c=a.wc(a.pa);de(a,1);return Be[c].call(a,b)}f.Fa=function(){var a=this.we(this.Bc);this.Bc=this.Bc+this.ja|0;var b=this.Wl-this.Bc|0;0>b&&0<=(this.Wl^this.Bc)&&(8088>=this.ma||!this.ra.Qf&&this.ra.Ib==this.ra.T||this.ra.Qf&&!this.ra.Ib?t(this,this.Bc-this.ra.xa&this.ra.T):-1>b&&Pc.call(this,12,0));return a};
            function u(a,b){a.Bc=a.Bc-a.ja|0;0>(a.Bc-a.Xl|0)&&0<=(a.Xl^a.Bc)&&(8088>=a.ma||!a.ra.Qf&&a.ra.Ib==a.ra.T||a.ra.Qf&&!a.ra.Ib?t(a,a.Bc-a.ra.xa&a.ra.T):Pc.call(a,12,0));a.wf(a.Bc,b)}function Ce(a,b,c){var d=4;1==b.length&&(d=1,c=c?1:0);if(80386>a.ma)2<b.length&&(b=b.substr(1,2));else if("PS"==b||2<b.length)d=8;a.qa[b]&&(void 0===c&&(ab(a,"Value for "+b+" is invalid"),xc(a)),d=!a.ha.Qb||a.ha.Qm?da(c,d):"--------".substr(0,d),a.qa[b].textContent!=d&&(a.qa[b].textContent=d))}
            f.de=function(a){if(this.Em&&(a||!this.ha.Qb||this.ha.Qm)){Ce(this,"EAX",this.F);Ce(this,"EBX",this.D);Ce(this,"ECX",this.G);Ce(this,"EDX",this.H);Ce(this,"ESP",q(this));Ce(this,"EBP",this.L);Ce(this,"ESI",this.K);Ce(this,"EDI",this.J);Ce(this,"CS",this.oa.sa);Ce(this,"DS",this.kb.sa);Ce(this,"SS",this.ra.sa);Ce(this,"ES",this.Qa.sa);Ce(this,"EIP",l(this));var b=rb(this);Ce(this,"PS",b);Ce(this,"V",b&sb);Ce(this,"D",b&tb);Ce(this,"I",b&ub);Ce(this,"T",b&vb);Ce(this,"S",b&wb);Ce(this,"Z",b&xb);Ce(this,
            "A",b&yb);Ce(this,"P",b&zb);Ce(this,"C",b&Ab)}if(b=this.qa.speed)b.textContent=ob(this);this.parent.de.call(this,a)};
            f.Qn=function(a){this.ha.Qg=!0;this.ha.vo=!1;this.ha.Xm=!1;this.Ad=this.A=a;this.fa&&!a&&Fc(this.fa);a||(this.Q|=4);do{if(a=this.Q&12528)this.va|=a;else if(this.Jb=this.pa,this.da=this.kb,this.ga=this.ra,this.V=this.Ga=h,this.va&12288&&Vd(this),this.va=this.Q&256,this.lb){a:{if(!(this.Q&4)){a=80286>this.ma?0:1;for(var b=0;2>b;b++){switch(a){case 0:if(this.lb&1&&this.ca&ub){var c=De(this.fa);if(-1<=c&&(this.lb&=-2,0<=c)){this.lb&=-5;Ee.call(this,c,null,11);break a}}break;case 1:if(this.lb&2){this.lb&=
            -3;Ee.call(this,1,null,11);break a}}a=1-a}}if(a=this.lb&8){a=this.fa;b=!1;for(c=0;c<a.$a;c++)for(var d=a.$a[c],e=0;e<d.Fb.length;e++){var m=d.Fb[e];m.Wd||(Fe(a,m),m.Wd||(b=!0))}a=!b}a&&(this.lb&=-9)}if(this.lb&4){this.Q=this.A=0;break}}this.Q=0;this.Ia[this.S()].call(this)}while(0<this.A);return this.ha.Qg?this.Ad-this.A:void 0===this.ha.Qg?0:-1};Ea(function(){for(var a=Xa(window.document,"pcjs","cpu"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Wc(d);Wa(d,c)}});
            function Ge(a,b){var c=a+b+qe(this)|0;ee(this,a,b,c,191);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&255}function He(a,b){var c=a+b+qe(this)|0;ee(this,a,b,c,this.dataType|63);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&this.C}function Ie(a,b){var c=a+b|0;ee(this,a,b,c,191);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&255}
            function Je(a,b){var c=a+b|0;ee(this,a,b,c,this.dataType|63);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&this.C}function Ke(a,b){var c=a&b;D(this,c,128);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c}function Le(a,b){this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return D(this,a&b,this.dataType)}function Me(a,b){this.A-=10+(this.V===h?0:1);if((a&3)<(b&3))return a=a&-4|b&3,ue(this),a;se(this);return a}
            function Ne(a){if(this.V===h)return dd.call(this),a;var b=a,c=this.we(this.V),d=this.we(this.V+this.ja);2==this.ja&&(b=a<<16>>16,c=c<<16>>16,d=d<<16>>16);this.A-=this.B.Rk;if(b<c||b>d)C(this,this.Jb-this.oa.xa),Ee.call(this,5,null,0);this.Q|=2;return a}function Oe(a,b){var c=0;if(b){se(this);for(var d=1;d&this.C;){if(b&d){a=c;break}d<<=1;c++}}else ue(this);this.A-=this.B.un+3*c;return a}
            function Pe(a,b){var c=0;if(b){se(this);for(var d=2==this.ja?15:31,e=1<<d;e;){if(b&e){a=d;break}e>>>=1;c++;d--}}else ue(this);this.A-=this.B.un+3*c;return a}function Qe(a,b){a&1<<(b&31)?le(this):me(this);this.A-=this.V===h?this.B.Yp:this.B.Wp;this.Q|=2;return a}function Re(a,b){var c=1<<(b&31);a&c?le(this):me(this);this.A-=this.V===h?this.B.Qk:this.B.Ok;return a^c}function Ue(a,b){var c=1<<(b&31);a&c?le(this):me(this);this.A-=this.V===h?this.B.Qk:this.B.Ok;return a&~c}
            function Ve(a,b){var c=1<<(b&31);a&c?le(this):me(this);this.A-=this.V===h?this.B.Qk:this.B.Ok;return a|c}function We(a,b){var c=this.oa.sa,d=l(this);null!=Vc(this,a,b,!0)&&(u(this,c),u(this,d))}function Xe(a,b){ee(this,a,b,a-b|0,191,!0);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.Gi:this.B.tb;this.Q|=2;return a}function Ye(a,b){ee(this,a,b,a-b|0,this.dataType|63,!0);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.Gi:this.B.tb;this.Q|=2;return a}
            function Ze(a){var b=(a&this.C)-1|0;ee(this,a,1,b,32830,!0);this.A-=2;return a&~this.C|b&this.C}function $e(a,b){var c=a[1]-b[1];c||(c=a[0]-b[0]);return c}
            function af(a,b,c){this.Pb=!1;if((c>>>=0)&&!(c<=b>>>0)){var d=0,e=1;c=[c>>>0,0];for(a=[a>>>0,b>>>0];0<$e(a,c);){var m=b=c;b[0]+=m[0];b[1]+=m[1];4294967295<b[0]&&(b[0]>>>=0,b[1]++);e+=e}do 0<=$e(a,c)&&(b=a,m=c,b[0]-=m[0],b[1]-=m[1],0>b[0]&&(b[0]>>>=0,b[1]--),d+=e),b=c,b[0]>>>=1,b[1]&1&&(b[0]=(b[0]|2147483648)>>>0),b[1]>>>=1,e>>>=1;while(e);this.gb=d;this.$b=a[0];this.Pb=!0}}function bf(a){return a}
            function cf(a,b){a=this.S();var c=(b<<16>>16)*(a<<24>>24)|0;32767<c||-32768>c?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?21:24;return c&65535}function df(a,b){var c,d;a=this.ia();2==this.ja?(d=(b<<16>>16)*(a<<16>>16)|0,c=32767<d||-32768>d):(d=b*a,c=2147483647<d||-2147483648>d);c?(le(this),ne(this)):(me(this),oe(this));d&=this.C;this.A-=this.V===h?21:24;return d}
            function ef(a,b){var c=(a<<16>>16)*(b<<16>>16)|0;32767<c||-32768>c?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?this.B.wn:this.B.vn;return c&65535}function ff(a,b){var c=a*b;2147483647<c||-2147483648>c?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?this.B.wn:this.B.vn;return c|0}function gf(a){var b=(a&this.C)+1|0;ee(this,a,1,b,32830);this.A-=2;return a&~this.C|b&this.C}
            function Ee(a,b,c){this.A-=this.B.ll+c;this.oa.rk=!0;c=rb(this);var d=this.oa.sa,e=l(this);a=this.oa.jn(a);a!==h&&(u(this,c),u(this,d),u(this,e),null!=b&&u(this,b),this.zi=-1,this.pa=a,this.rh=this.oa.xa+this.oa.Ib|0,Vd(this))}function hf(a,b){this.A-=14+(this.V===h?0:2);se(this);this.Kb.load(b,!0)!==h&&this.Kb.uc>=this.oa.Ja&&this.Kb.uc>=(b&3)&&(ue(this),a=this.Kb.Ob&-256,2<this.ja&&(a|=(this.Kb.bi&-65281)<<16));return a}
            function jf(a,b){if(this.V===h)return xd.call(this),a;be(this,this.na(this.V+this.ja));this.A-=this.B.pf;return b}function kf(a){if(this.V===h)return xd.call(this),a;this.A-=this.B.tl;return this.V}function lf(a,b){if(this.V===h)return xd.call(this),a;ce(this,this.na(this.V+this.ja));this.A-=this.B.pf;return b}function mf(a,b){if(this.V===h)return xd.call(this),a;var c=this.na(this.V+this.ja);this.Hd.load(c);this.A-=this.B.pf;return b}
            function nf(a,b){if(this.V===h)return xd.call(this),a;var c=this.na(this.V+this.ja);this.Id.load(c);this.A-=this.B.pf;return b}function of(a,b){this.A-=14+(this.V===h?0:2);if(b&65528&&this.Kb.load(b,!0)!==h&&(7168==(this.Kb.Ob&7168)||this.Kb.uc>=this.oa.Ja)&&this.Kb.uc>=(b&3))return ue(this),this.Kb.Ib;se(this);return a}function pf(a,b){if(this.V===h)return xd.call(this),a;Rc(this,this.na(this.V+this.ja));this.A-=this.B.pf;return b}
            function qf(a,b){this.A-=this.Ga===h?this.V===h?this.B.Al:this.B.zl:this.B.xl;return b}function rf(a,b){return b}function sf(){this.Ga!==h&&Td(this,2);return qf.call(this,0,this.ld)}function tf(a,b){var c=b&65535,d=b>>>16,e=a&65535,m=a>>>16,n=c*e,e=(n>>>16)+d*e,p=e>>>16,e=(e&65535)+c*m;this.Pb=!0;this.gb=e<<16|n&65535;this.$b=p+((e>>>16)+d*m)|0}function uf(a,b){this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return D(this,a|b,128)}
            function vf(a,b){this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return D(this,a|b,this.dataType)}function wf(a){var b=this.Fa(),c=this.Fa();(a<<=this.ja>>2)&&t(this,q(this)+a);Vc(this,b,c,!1)&&(a&&t(this,q(this)+a),this.kb.sa&65528&&this.kb.uc<this.oa.Ja&&7168!=(this.kb.Ob&7168)&&this.kb.load(0),this.Qa.sa&65528&&this.Qa.uc<this.oa.Ja&&7168!=(this.Qa.Ob&7168)&&this.Qa.load(0));2==a&&this.Uh&&Xd(this,this.pa)}
            function xf(a,b){var c=a-b-qe(this)|0;ee(this,a,b,c,191,!0);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&255}function yf(a,b){var c=a-b-qe(this)|0;ee(this,a,b,c,this.dataType|63,!0);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&this.C}function zf(a){this.Q|=1;this.Oc[this.S()].call(this,a);this.A-=this.V===h?this.B.$p:this.B.Zp}function Af(){return ke(this)?1:0}function Bf(){return fe(this)?1:0}function Cf(){return fe(this)?0:1}
            function Df(){return ie(this)?1:0}function Ef(){return ie(this)?0:1}function Ff(){return fe(this)||ie(this)?1:0}function Gf(){return fe(this)||ie(this)?0:1}function Hf(){return je(this)?1:0}function If(){return je(this)?0:1}function Jf(){return ge(this)?1:0}function Kf(){return ge(this)?0:1}function Lf(){return!je(this)!=!ke(this)?1:0}function Mf(){return!je(this)!=!ke(this)?0:1}function Nf(){return ie(this)||!je(this)!=!ke(this)?1:0}function Of(){return ie(this)||!je(this)!=!ke(this)?0:1}
            function Pf(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a<<c-1;a=(d<<1|b>>16-c)&65535;D(this,a,32768,d&32768)}return a}function Qf(a,b,c){if(c){var d=a<<c-1;a=d<<1|b>>32-c;D(this,a,-2147483648,d&-2147483648)}return a}function Rf(a,b){return Pf.call(this,a,b,this.S())}function Sf(a,b){return Qf.call(this,a,b,this.S())}function Tf(a,b){return Pf.call(this,a,b,this.G&31)}function Uf(a,b){return Qf.call(this,a,b,this.G&31)}
            function Vf(a,b,c){if(c){16<c&&(a=b,c-=16);var d=a>>c-1;a=(d>>1|b<<16-c)&65535;D(this,a,32768,d&1)}return a}function Wf(a,b,c){if(c){var d=a>>c-1;a=d>>1|b<<32-c;D(this,a,-2147483648,d&1)}return a}function Xf(a,b){return Vf.call(this,a,b,this.S())}function Yf(a,b){return Wf.call(this,a,b,this.S())}function Zf(a,b){return Vf.call(this,a,b,this.G&31)}function $f(a,b){return Wf.call(this,a,b,this.G&31)}
            function ag(a,b){var c=a-b|0;ee(this,a,b,c,191,!0);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&255}function bg(a,b){var c=a-b|0;ee(this,a,b,c,this.dataType|63,!0);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c&this.C}function cg(a,b){D(this,a&b,128);this.A-=this.Ga===h?this.V===h?this.B.lj:this.B.dg:this.B.dg;this.Q|=2;return a}function dg(a,b){D(this,a&b,32768);this.A-=this.Ga===h?this.V===h?this.B.lj:this.B.dg:this.B.dg;this.Q|=2;return a}
            function eg(a,b){if(this.V===h){switch(this.Oh&7){case 0:this.F=this.F&-256|a;break;case 1:this.G=this.G&-256|a;break;case 2:this.H=this.H&-256|a;break;case 3:this.D=this.D&-256|a;break;case 4:this.F=this.F&255|a<<8;break;case 5:this.G=this.G&255|a<<8;break;case 6:this.H=this.H&255|a<<8;break;case 7:this.D=this.D&255|a<<8}this.A-=this.B.nj}else this.Ga=this.V,P(this,a),this.A-=this.B.mj;return b}
            function fg(a,b){if(this.V===h){switch(this.Oh&7){case 0:this.F=a;break;case 1:this.G=a;break;case 2:this.H=a;break;case 3:this.D=a;break;case 4:t(this,a);break;case 5:this.L=a;break;case 6:this.K=a;break;case 7:this.J=a}this.A-=this.B.nj}else this.Ga=this.V,Q(this,a),this.A-=this.B.mj;return b}function gg(a,b){var c=a^b;D(this,c,128);this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return c}
            function hg(a,b){this.A-=this.Ga===h?this.V===h?this.B.Sb:this.B.tb:this.B.ec;return D(this,a^b,this.dataType)}function ig(a){Pc.call(this,13,0);return a}function ud(a){dd.call(this);return a}function T(a){xd.call(this);return a}function jg(){C(this,this.Jb-this.oa.xa);Ee.call(this,0,null,2)}function kg(){this.A-=this.V===h?2:this.B.Nl;return 1}function lg(){var a=this.G&255;this.A-=(this.V===h?this.B.cj:this.B.bj)+(a<<this.B.dj);return a}
            function mg(){var a=this.S();this.A-=(this.V===h?this.B.cj:this.B.bj)+(a<<this.B.dj);return a}function ng(){return null}function Pc(a,b,c,d){if(this.ha.Qg){var e=!1;if(80186<=this.ma)if(0>this.zi)C(this,this.Jb-this.oa.xa),e=!0;else if(8!=this.zi)b=0,a=8,e=!0;else{og.call(this,-1,0,c);Ed(this);return}og.call(this,a,b,c)&&(e=!1);e&&Ee.call(this,this.zi=a,b,d||0);this.Q|=3}else this.oc("Fault "+ea(a)+" blocked by Debugger",1073741824),C(this,this.Jb-this.oa.xa)}
            function Gd(a,b,c){this.nh=a;a=0;b&&(a|=1);c&&(a|=2);3==this.oa.Ja&&(a|=4);Pc.call(this,14,a)}
            function og(a,b,c){var d=32,e;a:{e=this.pa;var m=this.ka[(e&this.$d)>>>this.Aa];if(5==m.type&&(m=mc(this,e,!1,!0),!m)){e=null;break a}e=m.wj(e&this.Ea,e)}204!=e||this.Ve||(c=!1,d|=1);983040<=this.pa&&1048575>=this.pa&&(c=!1);c&&(a=(c?"\n":"")+"Fault "+ea(a)+(null!=b?" (0x"+da(b,4)+")":"")+" on opcode "+ea(e)+" at "+this.Ra.it(l(this),this.oa.sa)+" (%"+da(this.pa,6)+")",b=this.ha.Qb,this.oc(a,d)?c&&(c=b,xc(this.Ra)):(this.wa(a),xc(this)));return c}function vd(){this.yg[this.S()].call(this)}
            function yd(){u(this,q(this)&this.C);this.A-=this.B.mc}function ed(){var a=q(this)&this.C;u(this,this.F&this.C);u(this,this.G&this.C);u(this,this.H&this.C);u(this,this.D&this.C);u(this,a);u(this,this.L&this.C);u(this,this.K&this.C);u(this,this.J&this.C);this.A-=this.B.Hl}
            function fd(){this.J=this.J&~this.C|this.Fa();this.K=this.K&~this.C|this.Fa();this.L=this.L&~this.C|this.Fa();t(this,q(this)+this.ja);this.D=this.D&~this.C|this.Fa();this.H=this.H&~this.C|this.Fa();this.G=this.G&~this.C|this.Fa();this.F=this.F&~this.C|this.Fa();this.A-=this.B.Fl}function gd(){this.Ha[this.S()].call(this,Ne)}function zd(){this.vb[this.S()].call(this,Me)}function Ad(){this.Q|=20;this.da=this.ga=this.Hd;this.A-=this.B.Mc;xc(this)}
            function Bd(){this.Q|=20;this.da=this.ga=this.Id;this.A-=this.B.Mc;xc(this)}function Cd(){this.Q|=4096;this.ja^=6;this.C^=-65536;Ud(this);this.A-=this.B.Mc}function Dd(){this.Q|=8192;this.Ld^=6;this.T^=-65536;Kd(this);this.A-=this.B.Mc}function hd(){u(this,this.ia());this.A-=this.B.mc}function id(){this.Ha[this.S()].call(this,df)}function jd(){u(this,this.S());this.A-=this.B.mc}function kd(){this.Ha[this.S()].call(this,cf)}
            function ld(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=Ub(this.la,this.H,this.pa-b-1);this.Oe(this.Qa.lc(this.J&this.T,1),d);this.J=this.J&~this.T|this.J+(this.ca&tb?-1:1)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}}
            function md(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){for(var d=this.pa-b-1,e=0,m=0,n=0;n<this.ja;n++)e|=Ub(this.la,this.H,d)<<m,m+=8;d=e;this.wf(this.Qa.lc(this.J&this.T,this.ja),d);this.J=this.J&~this.T|this.J+(this.ca&tb?-this.ja:this.ja)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}}
            function nd(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=this.wc(this.kb.qc(this.K&this.T,1));this.K=this.K&~this.T|this.K+(this.ca&tb?-1:1)&this.T;this.A-=c;Wb(this.la,this.H,d,this.pa-b-1);this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}}
            function od(){var a=1,b=0,c=5;this.va&192&&(a=this.G&this.T,b=1,this.va&256&&(c=4));if(a--){var d=Tc(this,this.kb,this.K&this.T);this.K=this.K&~this.T|this.K+(this.ca&tb?-this.ja:this.ja)&this.T;this.A-=c;for(var c=this.pa-b-1,e=0,m=0;m<this.ja;m++)Wb(this.la,this.H,d>>e&255,c),e+=8;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}}function pg(){var a=this.M();ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
            function qg(){var a=this.M();ke(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function rg(){var a=this.M();fe(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function sg(){var a=this.M();fe(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function tg(){var a=this.M();ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function ug(){var a=this.M();ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}
            function vg(){var a=this.M();fe(this)||ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function wg(){var a=this.M();fe(this)||ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function xg(){var a=this.M();je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function yg(){var a=this.M();je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function zg(){var a=this.M();ge(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
            function Ag(){var a=this.M();ge(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function Bg(){var a=this.M();!je(this)!=!ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function Cg(){var a=this.M();!je(this)==!ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}function Dg(){var a=this.M();ie(this)||!je(this)!=!ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca}
            function Eg(){var a=this.M();ie(this)||!je(this)!=!ke(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)}function Fg(){this.ie[this.S()].call(this,Gg,this.S);this.A-=this.Ga===h?1:this.B.hh}function pd(){this.ie[this.S()].call(this,Hg,mg)}function qd(){this.Fc[this.S()].call(this,2==this.ja?Ig:Jg,mg)}function Kg(){var a=Ae(this)<<(this.ja>>2),b=this.Fa();C(this,b);a&&t(this,q(this)+a);this.A-=this.B.Ml}function Lg(){var a=this.Fa();C(this,a);this.A-=this.B.Jl}
            function rd(){var a=Ae(this),b=this.S()&31;this.A-=11;u(this,this.L);var c=q(this)&this.C;if(0<b){for(this.A-=(b<<2)+(1<b?1:0);--b;)this.L=this.L&~this.C|this.L-this.ja&this.C,u(this,Tc(this,this.ra,this.L&this.C));u(this,c)}this.L=this.L&~this.C|c;t(this,q(this)&~this.ra.T|q(this)-a&this.ra.T)}function sd(){t(this,q(this)&~this.ra.T|this.L&this.ra.T);this.L=this.L&~this.C|this.Fa()&this.C;this.A-=5}function Mg(){wf.call(this,Ae(this));this.A-=this.B.Ll}
            function Ng(){wf.call(this,0);this.A-=this.B.Kl}function Og(){this.Ha[this.S()].call(this,bf);this.A-=8}function Pg(){this.Q|=36;this.A-=this.B.Mc}function td(){xd.call(this)}function dd(){Pc.call(this,6);xc(this)}function xd(){C(this,this.Jb-this.oa.xa);ab(this,"Undefined opcode "+ea(Cb(this.la,this.pa))+" at "+("0x"+da(this.pa)));xc(this)}
            var $c=[function(){var a=this.S();this.Oc[a].call(this,Ie)},function(){this.vb[this.S()].call(this,Je)},function(){this.Gc[this.S()].call(this,Ie)},function(){this.Ha[this.S()].call(this,Je)},function(){this.F=this.F&-256|Ie.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Je.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.Qa.sa);this.A-=this.B.Fe},function(){ce(this,this.Fa());this.A-=this.B.Tb},function(){this.Oc[this.S()].call(this,uf)},function(){this.vb[this.S()].call(this,
            vf)},function(){this.Gc[this.S()].call(this,uf)},function(){this.Ha[this.S()].call(this,vf)},function(){this.F=this.F&-256|uf.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|vf.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.oa.sa);this.A-=this.B.Fe},function(){ae(this,this.Fa());this.A-=this.B.Tb},function(){this.Oc[this.S()].call(this,Ge)},function(){this.vb[this.S()].call(this,He)},function(){this.Gc[this.S()].call(this,Ge)},function(){this.Ha[this.S()].call(this,
            He)},function(){this.F=this.F&-256|Ge.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|He.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.ra.sa);this.A-=this.B.Fe},function(){Rc(this,this.Fa());this.A-=this.B.Tb},function(){this.Oc[this.S()].call(this,xf)},function(){this.vb[this.S()].call(this,yf)},function(){this.Gc[this.S()].call(this,xf)},function(){this.Ha[this.S()].call(this,yf)},function(){this.F=this.F&-256|xf.call(this,this.F&255,this.S());this.A--},
            function(){this.F=this.F&~this.C|yf.call(this,this.F&this.C,this.ia());this.A--},function(){u(this,this.kb.sa);this.A-=this.B.Fe},function(){be(this,this.Fa());this.A-=this.B.Tb},function(){this.Oc[this.S()].call(this,Ke)},function(){this.vb[this.S()].call(this,Le)},function(){this.Gc[this.S()].call(this,Ke)},function(){this.Ha[this.S()].call(this,Le)},function(){this.F=this.F&-256|Ke.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|Le.call(this,this.F&this.C,this.ia());this.A--},
            function(){this.Q|=20;this.da=this.ga=this.Qa;this.A-=this.B.Mc},function(){var a=this.F&255,b=he(this),c=fe(this);if(9<(a&15)||b)a+=6,b=yb;if(159<a||c)a+=96,c=Ab;a&=255;this.F=this.F&-256|a;D(this,a,128);c?le(this):me(this);b?te(this):re(this);this.A-=this.B.Ee},function(){this.Oc[this.S()].call(this,ag)},function(){this.vb[this.S()].call(this,bg)},function(){this.Gc[this.S()].call(this,ag)},function(){this.Ha[this.S()].call(this,bg)},function(){this.F=this.F&-256|ag.call(this,this.F&255,this.S());
            this.A--},function(){this.F=this.F&~this.C|bg.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.oa;this.A-=this.B.Mc},function(){var a=this.F&255,b=he(this),c=fe(this);if(9<(a&15)||b)a-=6,b=yb;if(159<a||c)a-=96,c=Ab;a&=255;this.F=this.F&-256|a;D(this,a,128);c?le(this):me(this);b?te(this):re(this);this.A-=this.B.Ee},function(){this.Oc[this.S()].call(this,gg)},function(){this.vb[this.S()].call(this,hg)},function(){this.Gc[this.S()].call(this,gg)},function(){this.Ha[this.S()].call(this,
            hg)},function(){this.F=this.F&-256|gg.call(this,this.F&255,this.S());this.A--},function(){this.F=this.F&~this.C|hg.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.ra;this.A-=this.B.Mc},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||he(this)?(c=c+6&15,d=d+1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?le(this):me(this);b?te(this):re(this);this.A-=this.B.Ee},function(){this.Oc[this.S()].call(this,Xe)},function(){this.vb[this.S()].call(this,Ye)},function(){this.Gc[this.S()].call(this,
            Xe)},function(){this.Ha[this.S()].call(this,Ye)},function(){Xe.call(this,this.F&255,this.S());this.A--},function(){Ye.call(this,this.F&this.C,this.ia());this.A--},function(){this.Q|=20;this.da=this.ga=this.kb;this.A-=this.B.Mc},function(){var a,b,c=this.F&255,d=this.F>>8&255;9<(c&15)||he(this)?(c=c-6&15,d=d-1&255,a=b=1):a=b=0;this.F=this.F&-65536|d<<8|c;a?le(this):me(this);b?te(this):re(this);this.A-=this.B.Ee},function(){this.F=gf.call(this,this.F)},function(){this.G=gf.call(this,this.G)},function(){this.H=
            gf.call(this,this.H)},function(){this.D=gf.call(this,this.D)},function(){t(this,gf.call(this,q(this)))},function(){this.L=gf.call(this,this.L)},function(){this.K=gf.call(this,this.K)},function(){this.J=gf.call(this,this.J)},function(){this.F=Ze.call(this,this.F)},function(){this.G=Ze.call(this,this.G)},function(){this.H=Ze.call(this,this.H)},function(){this.D=Ze.call(this,this.D)},function(){t(this,Ze.call(this,q(this)))},function(){this.L=Ze.call(this,this.L)},function(){this.K=Ze.call(this,this.K)},
            function(){this.J=Ze.call(this,this.J)},function(){u(this,this.F&this.C);this.A-=this.B.mc},function(){u(this,this.G&this.C);this.A-=this.B.mc},function(){u(this,this.H&this.C);this.A-=this.B.mc},function(){u(this,this.D&this.C);this.A-=this.B.mc},function(){u(this,q(this)-2&65535);this.A-=this.B.mc},function(){u(this,this.L&this.C);this.A-=this.B.mc},function(){u(this,this.K&this.C);this.A-=this.B.mc},function(){u(this,this.J&this.C);this.A-=this.B.mc},function(){this.F=this.F&~this.C|this.Fa();
            this.A-=this.B.Tb},function(){this.G=this.G&~this.C|this.Fa();this.A-=this.B.Tb},function(){this.H=this.H&~this.C|this.Fa();this.A-=this.B.Tb},function(){this.D=this.D&~this.C|this.Fa();this.A-=this.B.Tb},function(){t(this,q(this)&~this.C|this.Fa());this.A-=this.B.Tb},function(){this.L=this.L&~this.C|this.Fa();this.A-=this.B.Tb},function(){this.K=this.K&~this.C|this.Fa();this.A-=this.B.Tb},function(){this.J=this.J&~this.C|this.Fa();this.A-=this.B.Tb},pg,qg,rg,sg,tg,ug,vg,wg,xg,yg,zg,Ag,Bg,Cg,Dg,Eg,
            pg,qg,rg,sg,tg,ug,vg,wg,xg,yg,zg,Ag,Bg,Cg,Dg,Eg,Fg,function(){this.Fc[this.S()].call(this,Qg,this.ia);this.A-=this.Ga===h?1:this.B.hh},Fg,function(){this.Fc[this.S()].call(this,Qg,this.M);this.A-=this.Ga===h?1:this.B.hh},function(){this.Oc[this.S()].call(this,cg)},function(){this.vb[this.S()].call(this,dg)},function(){this.Gc[this.Oh=this.S()].call(this,eg)},function(){this.Ha[this.Oh=this.S()].call(this,fg)},function(){this.Q|=1;this.Oc[this.S()].call(this,qf)},function(){this.Q|=1;this.vb[this.S()].call(this,
            qf)},function(){this.Gc[this.S()].call(this,qf)},function(){this.Ha[this.S()].call(this,qf)},function(){var a=this.S();switch((a&56)>>3){case 0:this.ld=this.Qa.sa;break;case 1:this.ld=this.oa.sa;break;case 2:this.ld=this.ra.sa;break;case 3:this.ld=this.kb.sa;break;case 4:if(this.ma>=qb){this.ld=this.Hd.sa;break}dd.call(this);break;case 5:if(this.ma>=qb){this.ld=this.Id.sa;break}default:dd.call(this)}this.Q|=1;this.vb[a].call(this,sf)},function(){this.Q|=1;this.da=this.ga=this.On;this.Ha[this.S()].call(this,
            kf)},function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 2:a=this.H;break;case 3:a=this.D;break;default:if(80286==this.ma||this.ma==qb&&4!=c&&5!=c){dd.call(this);return}switch(c){case 1:a=this.G;break;case 4:a=q(this);break;case 5:a=this.L;break;case 6:a=this.K;break;case 7:a=this.J}}this.Ha[b].call(this,qf);switch(c){case 0:ce(this,this.F);this.F=a;break;case 1:ae(this,this.G);this.G=a;break;case 2:Rc(this,this.H);this.H=a;break;case 3:be(this,this.D);this.D=a;break;case 4:this.ma>=
            qb?this.Hd.load(q(this)):ce(this,q(this));t(this,a);break;case 5:this.ma>=qb?this.Id.load(this.L):ae(this,this.L);this.L=a;break;case 6:Rc(this,this.K);this.K=a;break;case 7:be(this,this.J),this.J=a}},function(){this.Q|=1;this.Fc[this.S()].call(this,Rg,this.Fa)},function(){this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.G&this.C;this.G=this.G&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.H&this.C;this.H=this.H&~this.C|a&this.C;this.A-=3},function(){var a=
            this.F;this.F=this.F&~this.C|this.D&this.C;this.D=this.D&~this.C|a&this.C;this.A-=3},function(){var a=this.F,b=q(this);this.F=this.F&~this.C|b&this.C;t(this,b&~this.C|a&this.C);this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.L&this.C;this.L=this.L&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.K&this.C;this.K=this.K&~this.C|a&this.C;this.A-=3},function(){var a=this.F;this.F=this.F&~this.C|this.J&this.C;this.J=this.J&~this.C|a&this.C;this.A-=3},function(){this.F=
            2==this.ja?this.F&-65536|this.F<<24>>24&65535:this.F<<16>>16;this.A-=2},function(){this.H=2==this.ja?this.H&-65536|(this.F&32768?65535:0):this.F&-2147483648?-1:0;this.A-=this.B.Tk},function(){We.call(this,this.ia(),Ae(this));this.A-=this.B.Wk},function(){this.oc("WAIT not implemented");this.A--},function(){u(this,rb(this));this.A-=this.B.mc},function(){Uc(this,this.Fa());this.A-=this.B.Tb},function(){var a=this.F>>8&255;a&Ab?le(this):me(this);a&zb?(this.resultType&=-3,this.ca|=zb):(this.resultType&=
            -3,this.ca&=~zb);a&yb?te(this):re(this);a&xb?ue(this):se(this);a&wb?(this.resultType&=-17,this.ca|=wb):(this.resultType&=-17,this.ca&=~wb);this.A-=this.B.Cb},function(){this.F=this.F&-65281|(rb(this)&Jc)<<8;this.A-=this.B.Cb},function(){var a=this.F&-256,b;b=R(this);b=this.wc(this.da.qc(b,1));this.F=a|b;this.A-=this.B.Qi},function(){this.F=this.F&~this.C|Tc(this,this.da,R(this));this.A-=this.B.Qi},function(){var a=R(this),b=this.F;this.Oe(this.da.lc(a,1),b);this.A-=this.B.Ri},function(){var a=R(this),
            b=this.F;this.wf(this.da.lc(a,this.ja),b);this.A-=this.B.Ri},function(){var a=1,b=0,c=this.B.Si;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Ui,this.va&256||(this.A-=this.B.Ti));if(a--){var d=this.ca&tb?-1:1,e=this.wc(this.da.qc(this.K,1));this.Oe(this.Qa.lc(this.J&this.T,1),e);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Si;this.va&192&&(a=this.G&this.T,
            b=1,c=this.B.Ui,this.va&256||(this.A-=this.B.Ti));if(a--){var d=this.ca&tb?-this.ja:this.ja,e=Tc(this,this.da,this.K);this.wf(this.Qa.lc(this.J&this.T,this.ja),e);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Di;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Fi,this.va&256||(this.A-=this.B.Ei));if(a--){var d=this.ca&tb?-1:1,e=we(this,this.da,this.K&this.T),m=
            ye(this,this.Qa,this.J&this.T);Xe.call(this,e,m);this.K=this.K&~this.T|this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c-this.B.tb;this.G=this.G&~this.T|this.G-b&this.T;a&&ie(this)==(this.va&64)&&(this.pa=this.Jb,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Di;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Fi,this.va&256||(this.A-=this.B.Ei));if(a--){var d=this.ca&tb?-this.ja:this.ja,e=xe(this,this.da,this.K&this.T),m=ze(this,this.Qa,this.J&this.T);Ye.call(this,e,m);this.K=this.K&~this.T|
            this.K+d&this.T;this.J=this.J&~this.T|this.J+d&this.T;this.A-=c-this.B.tb;this.G=this.G&~this.T|this.G-b&this.T;a&&ie(this)==(this.va&64)&&(this.pa=this.Jb,this.Q|=256)}},function(){D(this,this.F&this.S(),128);this.A-=this.B.Ee},function(){D(this,this.F&this.ia(),this.dataType);this.A-=this.B.Ee},function(){var a=1,b=0,c=this.B.gj;this.va&192&&(a=this.G&this.T,b=1,c=this.B.ij,this.va&256||(this.A-=this.B.hj));if(a--){var d=this.F;this.Oe(this.Qa.lc(this.J&this.T,1),d);this.J=this.J&~this.T|this.J+
            (this.ca&tb?-1:1)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}},function(){var a=1,b=0,c=this.B.gj;this.va&192&&(a=this.G&this.T,b=1,c=this.B.ij,this.va&256||(this.A-=this.B.hj));if(a--){var d=this.F;this.wf(this.Qa.lc(this.J&this.T,this.ja),d);this.J=this.J&~this.T|this.J+(this.ca&tb?-this.ja:this.ja)&this.T;this.A-=c;this.G=this.G&~this.T|this.G-b&this.T;a&&(this.pa=this.Jb,this.Q|=256)}},function(){var a=1,b=0,c=this.B.Ki;this.va&192&&(a=this.G&this.T,
            b=1,c=this.B.Mi,this.va&256||(this.A-=this.B.Li));a--&&(this.F=this.F&-256|this.wc(this.da.qc(this.K&this.T,1)),this.K=this.K&~this.T|this.K+(this.ca&tb?-1:1)&this.T,this.A-=c,this.G=this.G&~this.T|this.G-b&this.T,a&&(this.pa=this.Jb,this.Q|=256))},function(){var a=1,b=0,c=this.B.Ki;this.va&192&&(a=this.G&this.T,b=1,c=this.B.Mi,this.va&256||(this.A-=this.B.Li));a--&&(this.F=this.F&~this.C|Tc(this,this.da,this.K&this.T),this.K=this.K&~this.T|this.K+(this.ca&tb?-this.ja:this.ja)&this.T,this.A-=c,this.G=
            this.G&~this.T|this.G-b&this.T,a&&(this.pa=this.Jb,this.Q|=256))},function(){var a=1,b=0,c=this.B.Zi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.aj,this.va&256||(this.A-=this.B.$i));a--&&(Xe.call(this,this.F&255,ye(this,this.Qa,this.J&this.T)),this.J=this.J&~this.T|this.J+(this.ca&tb?-1:1)&this.T,this.A-=c-this.B.tb,this.G=this.G&~this.T|this.G-b&this.T,a&&ie(this)==(this.va&64)&&(this.pa=this.Jb,this.Q|=256))},function(){var a=1,b=0,c=this.B.Zi;this.va&192&&(a=this.G&this.T,b=1,c=this.B.aj,this.va&
            256||(this.A-=this.B.$i));a--&&(Ye.call(this,this.F&this.C,ze(this,this.Qa,this.J&this.T)),this.J=this.J&~this.T|this.J+(this.ca&tb?-this.ja:this.ja)&this.T,this.A-=c-this.B.tb,this.G=this.G&~this.T|this.G-b&this.T,a&&ie(this)==(this.va&64)&&(this.pa=this.Jb,this.Q|=256))},function(){this.F=this.F&-256|this.S();this.A-=this.B.Cb},function(){this.G=this.G&-256|this.S();this.A-=this.B.Cb},function(){this.H=this.H&-256|this.S();this.A-=this.B.Cb},function(){this.D=this.D&-256|this.S();this.A-=this.B.Cb},
            function(){this.F=this.F&255|this.S()<<8;this.A-=this.B.Cb},function(){this.G=this.G&255|this.S()<<8;this.A-=this.B.Cb},function(){this.H=this.H&255|this.S()<<8;this.A-=this.B.Cb},function(){this.D=this.D&255|this.S()<<8;this.A-=this.B.Cb},function(){this.F=this.F&~this.C|this.ia();this.A-=this.B.Cb},function(){this.G=this.G&~this.C|this.ia();this.A-=this.B.Cb},function(){this.H=this.H&~this.C|this.ia();this.A-=this.B.Cb},function(){this.D=this.D&~this.C|this.ia();this.A-=this.B.Cb},function(){t(this,
            q(this)&~this.C|this.ia());this.A-=this.B.Cb},function(){this.L=this.L&~this.C|this.ia();this.A-=this.B.Cb},function(){this.K=this.K&~this.C|this.ia();this.A-=this.B.Cb},function(){this.J=this.J&~this.C|this.ia();this.A-=this.B.Cb},Kg,Lg,Kg,Lg,function(){this.Ha[this.S()].call(this,lf)},function(){this.Ha[this.S()].call(this,jf)},function(){this.Q|=1;this.ie[this.S()].call(this,Sg,this.S)},function(){this.Q|=1;this.Fc[this.S()].call(this,Sg,this.ia)},Mg,Ng,Mg,Ng,function(){Ee.call(this,3,null,this.B.ml)},
            function(){var a=this.S(),b;a:{b=this.Ch[a];if(void 0!==b)for(var c=0;c<b.length;c++)if(!b[c][1].call(b[c][0],this.pa)){b=!1;break a}b=!0}b?Ee.call(this,a,null,0):this.A--},function(){ke(this)?Ee.call(this,4,null,this.B.nl):this.A-=this.B.ol},function(){this.A-=this.B.kl;if(this.zb&1&&this.ca&16384){var a=this.na(this.hb.xa+0);Sc(this.oa,a,!1)}else{var a=this.oa.Ja,b=this.Fa(),c=this.Fa(),d=this.Fa();null!=Vc(this,b,c,!1)&&(Uc(this,d,a),this.Uh&&Xd(this,this.pa))}},function(){this.ie[this.S()].call(this,
            Hg,kg)},function(){this.Fc[this.S()].call(this,2==this.ja?Ig:Jg,kg)},function(){this.ie[this.S()].call(this,Hg,lg)},function(){this.Fc[this.S()].call(this,2==this.ja?Ig:Jg,lg)},function(){var a=this.S();if(a){var b=this.F&255;this.F=this.F&-65536|b/a<<8|b%a;D(this,this.F,128);this.A-=this.B.Nk}},function(){var a=this.S();this.F=this.F&-65536|(this.F>>8&255)*a+this.F&255;D(this,this.F,128);this.A-=this.B.Mk},function(){this.F=this.F&-256|(fe(this)?255:0);this.A-=2},function(){this.F=this.F&-256|we(this,
            this.da,this.D+(this.F&255)&65535);this.A-=this.B.Ol},Og,Og,Og,Og,Og,Og,Og,Og,function(){var a=this.M();(this.G=this.G-1&this.T)&&!ie(this)?(C(this,l(this)+a),this.A-=this.B.vl):this.A-=this.B.Ni},function(){var a=this.M();(this.G=this.G-1&this.T)&&ie(this)?(C(this,l(this)+a),this.A-=this.B.Oi):this.A-=this.B.Pi},function(){var a=this.M();(this.G=this.G-1&this.T)?(C(this,l(this)+a),this.A-=this.B.ul):this.A-=this.B.Ni},function(){var a=this.M();this.G&this.T?this.A-=this.B.Pi:(C(this,l(this)+a),this.A-=
            this.B.Oi)},function(){var a=this.S();this.F=this.F&-256|Ub(this.la,a,this.pa-2);this.A-=this.B.Ii},function(){var a=this.S();this.F=Ub(this.la,a,this.pa-2);this.F|=Ub(this.la,a+1&65535,this.pa-2)<<8;this.A-=this.B.Ii},function(){var a=this.S();Wb(this.la,a,this.F&255,this.pa-2);this.A-=this.B.Yi},function(){var a=this.S();Wb(this.la,a,this.F&255,this.pa-2);Wb(this.la,a+1&65535,this.F>>8,this.pa-2);this.A-=this.B.Yi},function(){var a=this.ia(),b=l(this),a=b+a;u(this,b);C(this,a);this.A-=this.B.Uk},
            function(){var a=this.ia();C(this,l(this)+a);this.A-=this.B.Ji},function(){Vc(this,this.ia(),Ae(this));this.A-=this.B.ql},function(){var a=this.M();C(this,l(this)+a);this.A-=this.B.Ji},function(){this.F=this.F&-256|Ub(this.la,this.H,this.pa-1);this.A-=this.B.Hi},function(){this.F=Ub(this.la,this.H,this.pa-1);this.F|=Ub(this.la,this.H+1&65535,this.pa-1)<<8;this.A-=this.B.Hi},function(){Wb(this.la,this.H,this.F&255,this.pa-1);this.A-=this.B.Xi},function(){Wb(this.la,this.H,this.F&255,this.pa-1);Wb(this.la,
            this.H+1&65535,this.F>>8,this.pa-1);this.A-=this.B.Xi},Pg,Pg,function(){this.Q|=132;this.A-=this.B.Mc},function(){this.Q|=68;this.A-=this.B.Mc},function(){this.lb|=4;this.A-=2;this.ca&ub||xc(this)},function(){fe(this)?me(this):le(this);this.A-=2},function(){this.Pb=!1;this.ie[this.S()].call(this,Tg,ng);this.Pb&&(this.F=this.F&~this.C|this.gb&this.C)},function(){this.Pb=!1;this.Fc[this.S()].call(this,Ug,ng);this.Pb&&(this.F=this.F&~this.C|this.gb&this.C,this.H=this.H&~this.C|this.$b&this.C)},function(){me(this);
            this.A-=2},function(){le(this);this.A-=2},function(){this.ca&=~ub;this.A-=this.B.Sk},function(){this.ca|=ub;this.Q|=4;this.A-=2},function(){this.ca&=~tb;this.A-=2},function(){this.ca|=tb;this.A-=2},function(){this.ie[this.S()].call(this,ad,ng)},function(){this.Fc[this.S()].call(this,bd,ng)}],Gg=[Ie,uf,Ge,xf,Ke,ag,gg,Xe],Qg=[Je,vf,He,yf,Le,bg,hg,Ye],Rg=[function(a,b){this.A-=this.Ga===h?this.B.Tb:this.B.Gl;return b},ig,ig,ig,ig,ig,ig,ig],Sg=[function(a,b){this.A-=this.Ga===h?this.B.yl:this.B.wl;return b},
            T,T,T,T,T,T,T],Hg=[function(a,b){var c=a,d=b&this.ub;if(d){var e;(d&=7)?(e=a<<d-1,c=(a<<d|a>>8-d)&255):e=a<<7;pe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e;(d&=7)?(e=a<<8-d,c=(a>>>d|e)&255):e=a;pe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e=qe(this);(d%=9)?(c=(a<<d|e<<d-1|a>>9-d)&255,e=a<<d-1):e<<=7;pe(this,c,e,128)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e=qe(this);(d%=9)?(c=(a>>d|e<<8-d|a<<9-d)&255,e=a<<8-d):e<<=7;pe(this,c,e,128)}return c},
            function(a,b){var c=a,d=b&this.ub;if(d){var e=0;8<d?c=0:(e=a<<d-1,c=e<<1&255);D(this,c,128,e&128,(c^e)&128)}return c},function(a,b){var c=b&this.ub;c&&(c=8<c?0:a>>>c-1,a=c>>>1&255,D(this,a,128,c&1,a&128));return a},T,function(a,b){var c=b&this.ub;c&&(9<c&&(c=9),c=a<<24>>24>>c-1,a=c>>1&255,D(this,a,128,c&1));return a}],Ig=[function(a,b){var c=a,d=b&this.ub;if(d){var e;(d&=15)?(e=a<<d-1,c=(a<<d|a>>16-d)&65535):e=a<<15;pe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e;(d&=15)?
            (e=a<<16-d,c=(a>>>d|e)&65535):e=a;pe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e=qe(this);(d%=17)?(c=(a<<d|e<<d-1|a>>17-d)&65535,e=a<<d-1):e<<=15;pe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e=qe(this);(d%=17)?(c=(a>>d|e<<16-d|a<<17-d)&65535,e=a<<16-d):e<<=15;pe(this,c,e,32768)}return c},function(a,b){var c=a,d=b&this.ub;if(d){var e=0;16<d?c=0:(e=a<<d-1,c=e<<1&65535);D(this,c,32768,e&32768,(c^e)&32768)}return c},function(a,b){var c=b&this.ub;
            c&&(c=16<c?0:a>>>c-1,a=c>>>1&65535,D(this,a,32768,c&1,a&32768));return a},T,function(a,b){var c=b&this.ub;c&&(17<c&&(c=17),c=a<<16>>16>>c-1,a=c>>1&65535,D(this,a,32768,c&1));return a}],Jg=[function(a,b){var c=a,d=b&this.ub;d&&(c=a<<d|a>>>32-d,pe(this,c,a<<d-1,-2147483648));return c},function(a,b){var c=a,d=b&this.ub;if(d){var e=a<<32-d,c=a>>>d|e;pe(this,c,e,-2147483648)}return c},function(a,b){var c=a,d=b&this.ub;d&&(c=qe(this),c=a<<d|c<<d-1|a>>>32-d>>>1,pe(this,c,a<<d-1,-2147483648));return c},function(a,
            b){var c=a,d=b&this.ub;d&&(c=qe(this),c=a>>>d|c<<32-d|a<<32-d<<1,pe(this,c,a<<32-d,-2147483648));return c},function(a,b){var c=a,d=b&this.ub;d&&(d=a<<d-1,c=d<<1,D(this,c,-2147483648,d&-2147483648,(c^d)&-2147483648));return c},function(a,b){var c=b&this.ub;c&&(c=a>>>c-1,a=c>>>1,D(this,a,-2147483648,c&1,a&-2147483648));return a},T,function(a,b){var c=b&this.ub;c&&(c=a>>c-1,a=c>>1,D(this,a,-2147483648,c&1));return a}],Tg=[function(a,b){b=this.S();D(this,a&b,128);this.A-=this.V===h?this.B.kj:this.B.jj;
            this.Q|=2;return a},T,function(a){this.A-=this.V===h?this.B.cg:this.B.bg;return a^255},function(a){var b=-a|0;ee(this,0,a,b,191,!0);this.A-=this.V===h?this.B.cg:this.B.bg;return b&255},function(a){this.Pb=!0;this.gb=(this.F&255)*a&65535;this.gb&65280?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?this.B.Cl:this.B.Bl;this.Q|=2;return a},function(a){var b=(this.F<<24>>24)*(a<<24>>24)|0;this.Pb=!0;this.gb=b&65535;127<b||-128>b?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?this.B.hl:
            this.B.gl;this.Q|=2;return a},function(a,b){if(!a)return jg.call(this),a;var c=(b=this.F&65535)/a;if(255<c)return jg.call(this),a;this.Pb=!0;this.gb=c&255|(b%a&255)<<8;this.A-=this.V===h?this.B.$k:this.B.Zk;this.Q|=2;return a},function(a,b){if(!a)return jg.call(this),a;var c=a<<24>>24,d=(b=this.F<<16>>16)/c|0;if(d!=d<<24>>24||8086==this.ma&&-128==d)return jg.call(this),a;this.Pb=!0;this.gb=d&255|(b%c&255)<<8;this.A-=this.V===h?this.B.dl:this.B.cl;this.Q|=2;return a}],Ug=[function(a,b){b=this.ia();
            D(this,a&b,32768);this.A-=this.V===h?this.B.kj:this.B.jj;this.Q|=2;return a},T,function(a){this.A-=this.V===h?this.B.cg:this.B.bg;return a^65535},function(a){var b=-a|0;ee(this,0,a,b,32831,!0);this.A-=this.V===h?this.B.cg:this.B.bg;return b&65535},function(a,b){if(2==this.ja){b=this.F&65535;var c=b*a|0;this.Pb=!0;this.gb=c&65535;this.$b=c>>16&65535}else tf.call(this,a,this.F);this.$b?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?this.B.El:this.B.Dl;this.Q|=2;return a},function(a,b){var c;
            if(2==this.ja)b=this.F&65535,c=(b<<16>>16)*(a<<16>>16)|0,this.Pb=!0,this.gb=c&65535,this.$b=c>>16&65535,c=32767<c||-32768>c;else{c=a;var d=this.F,e=!1;0>d&&(d=-d|0,e=!e);0>c&&(c=-c|0,e=!e);tf.call(this,c,d);e&&(this.gb=~this.gb+1|0,this.$b=~this.$b+(this.gb?0:1)|0);c=this.$b!=this.gb>>31}c?(le(this),ne(this)):(me(this),oe(this));this.A-=this.V===h?this.B.jl:this.B.il;this.Q|=2;return a},function(a,b){if(2==this.ja){if(!a)return jg.call(this),a;b=65536*(this.H&65535)+(this.F&65535);var c=b/a|0;if(65536<=
            c)return jg.call(this),a;this.Pb=!0;this.gb=c&65535;this.$b=b%a&65535}else{af.call(this,this.F,this.H,a);if(!this.Pb)return jg.call(this),a;this.gb|=0;this.$b|=0}this.A-=this.V===h?this.B.bl:this.B.al;this.Q|=2;return a},function(a,b){if(2==this.ja){if(!a)return jg.call(this),a;var c=a<<16>>16,d=(b=this.H<<16|this.F&65535)/c|0;if(d!=d<<16>>16||8086==this.ma&&-32768==d)return jg.call(this),a;this.Pb=!0;this.gb=d&65535;this.$b=b%c&65535}else{var c=this.F,d=this.H,e=a,m=!1,n=!1;0>e&&(e=-e|0,m=!m);0>
            d&&(c=-c|0,d=~d+(c?0:1)|0,n=!0,m=!m);af.call(this,c,d,e);2147483647<this.gb&&(this.Pb=!1);m&&(this.gb=-this.gb);n&&(this.$b=-this.$b);if(!this.Pb)return jg.call(this),a;this.gb|=0;this.$b|=0}this.A-=this.V===h?this.B.fl:this.B.el;this.Q|=2;return a}],ad=[function(a){var b=a+1|0;ee(this,a,1,b,190);this.A-=this.V===h?this.B.ag:this.B.$f;return b&255},function(a){var b=a-1|0;ee(this,a,1,b,190,!0);this.A-=this.V===h?this.B.ag:this.B.$f;return b&255},T,T,T,T,T,T],bd=[function(a){var b=a+1|0;ee(this,a,
            1,b,32830);this.A-=this.V===h?this.B.ag:this.B.$f;return b&65535},function(a){var b=a-1|0;ee(this,a,1,b,32830,!0);this.A-=this.V===h?this.B.ag:this.B.$f;return b&65535},function(a){u(this,l(this));C(this,a);this.A-=this.V===h?this.B.Yk:this.B.Xk;this.Q|=2;return a},function(a){if(this.V===h)return T.call(this,a);We.call(this,a,this.na(this.V+this.ja));this.A-=this.B.Vk;this.Q|=2;return a},function(a){C(this,a);this.A-=this.V===h?this.B.sl:this.B.rl;this.Q|=2;return a},function(a){if(this.V===h)return T.call(this,
            a);Vc(this,a,this.na(this.V+this.ja));this.Uh&&Xd(this,this.pa);this.A-=this.B.pl;this.Q|=2;return a},function(a){var b=a;this.Q&512&&(a=a-2&65535,80286>this.ma&&(b=a));u(this,b);this.A-=this.V===h?this.B.mc:this.B.Il;this.Q|=2;return a},ig],wd=Array(256);wd[0]=function(){var a=this.S();16>(a&56)&&(this.Q|=1);this.Fc[a].call(this,this.rm,ng)};wd[1]=function(){var a=this.S();a&16||(this.Q|=1);this.Fc[a].call(this,Vg,ng)};wd[2]=function(){this.Ha[this.S()].call(this,hf)};
            wd[3]=function(){this.Ha[this.S()].call(this,of)};
            wd[5]=function(){this.oa.Ja?Pc.call(this,13,0,!0):(ve(this,this.na(2054)),this.J=this.na(2086),this.K=this.na(2088),this.L=this.na(2090),this.D=this.na(2094),this.H=this.na(2096),this.G=this.na(2098),this.F=this.na(2100),Qc(this.Qa,2102,this.na(2084)),Qc(this.oa,2108,this.na(2082)),Qc(this.ra,2114,this.na(2080)),Qc(this.kb,2120,this.na(2078)),Uc(this,this.na(2072)),C(this,this.na(2074)),t(this,this.na(2092)),this.pd=this.na(2126)|this.wc(2128)<<16,this.If=this.pd+this.na(2130),Qc(this.Ne,2132,this.na(2076)),
            this.qd=this.na(2138)|this.wc(2140)<<16,this.Ve=this.qd+this.na(2142),Qc(this.hb,2144,this.na(2070)),this.A-=195)};wd[6]=function(){this.oa.Ja?Pc.call(this,13,0):(this.zb&=-9,this.A-=2)};wd[11]=dd;var x=[];x[32]=function(){var a=this.S()|192;if(this.oa.Ja)Pc.call(this,13,0);else{switch((a&56)>>3){case 0:this.ld=this.zb;break;case 1:this.ld=this.yj;break;case 2:this.ld=this.nh;break;case 3:this.ld=this.gg;break;default:xd.call(this);return}Td(this,4);this.Ha[a].call(this,sf)}};
            x[34]=function(){var a,b=this.S()|192;if(this.oa.Ja)Pc.call(this,13,0);else{var c=(b&56)>>3;switch(c){case 0:a=this.F;break;case 1:a=this.G;break;case 2:a=this.H;break;case 3:a=this.D;break;default:dd.call(this);return}Td(this,4);this.Ha[b].call(this,qf);switch(c){case 0:c=this.F;this.F=a;this.zb=c;Jd(this);this.zb&-2147483648?Fd(this):this.ka!=this.Te&&(this.ka=this.Te,this.Ah=this.dk=null);break;case 1:this.yj=this.G;this.G=a;break;case 2:this.nh=this.H;this.H=a;break;case 3:c=this.D,this.D=a,this.gg=
            c,this.zb&-2147483648&&Fd(this)}}};x[128]=function(){var a=this.ia();ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[129]=function(){var a=this.ia();ke(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[130]=function(){var a=this.ia();fe(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[131]=function(){var a=this.ia();fe(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
            x[132]=function(){var a=this.ia();ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[133]=function(){var a=this.ia();ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[134]=function(){var a=this.ia();fe(this)||ie(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[135]=function(){var a=this.ia();fe(this)||ie(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
            x[136]=function(){var a=this.ia();je(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[137]=function(){var a=this.ia();je(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[138]=function(){var a=this.ia();ge(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[139]=function(){var a=this.ia();ge(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};
            x[140]=function(){var a=this.ia();!je(this)!=!ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[141]=function(){var a=this.ia();!je(this)==!ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[142]=function(){var a=this.ia();ie(this)||!je(this)!=!ke(this)?(C(this,l(this)+a),this.A-=this.B.Ba):this.A-=this.B.Ca};x[143]=function(){var a=this.ia();ie(this)||!je(this)!=!ke(this)?this.A-=this.B.Ca:(C(this,l(this)+a),this.A-=this.B.Ba)};x[144]=function(){zf.call(this,Af)};
            x[145]=function(){zf.call(this,Af)};x[146]=function(){zf.call(this,Bf)};x[147]=function(){zf.call(this,Cf)};x[148]=function(){zf.call(this,Df)};x[149]=function(){zf.call(this,Ef)};x[150]=function(){zf.call(this,Ff)};x[151]=function(){zf.call(this,Gf)};x[152]=function(){zf.call(this,Hf)};x[153]=function(){zf.call(this,If)};x[154]=function(){zf.call(this,Jf)};x[155]=function(){zf.call(this,Kf)};x[156]=function(){zf.call(this,Lf)};x[157]=function(){zf.call(this,Mf)};x[158]=function(){zf.call(this,Nf)};
            x[159]=function(){zf.call(this,Of)};x[160]=function(){u(this,this.Hd.sa);this.A-=this.B.Fe};x[161]=function(){var a=this.Fa();this.Hd.load(a);this.A-=this.B.Tb};x[163]=function(){this.vb[this.S()].call(this,Qe);this.V!==h&&(this.A-=this.B.Xp)};x[164]=function(){this.vb[this.S()].call(this,2==this.ja?Rf:Sf);this.A-=this.V===h?this.B.fj:this.B.ej};x[165]=function(){this.vb[this.S()].call(this,2==this.ja?Tf:Uf);this.A-=this.V===h?this.B.fj:this.B.ej};x[168]=function(){u(this,this.Id.sa);this.A-=this.B.Fe};
            x[169]=function(){var a=this.Fa();this.Id.load(a);this.A-=this.B.Tb};x[171]=function(){this.vb[this.S()].call(this,Ve);this.V!==h&&(this.A-=this.B.Pk)};x[172]=function(){this.vb[this.S()].call(this,2==this.ja?Xf:Yf);this.A-=this.V===h?this.B.fj:this.B.ej};x[173]=function(){this.vb[this.S()].call(this,2==this.ja?Zf:$f);this.A-=this.V===h?this.B.fj:this.B.ej};x[175]=function(){this.Ha[this.S()].call(this,2==this.ja?ef:ff)};x[178]=function(){this.Ha[this.S()].call(this,pf)};
            x[179]=function(){this.vb[this.S()].call(this,Ue);this.V!==h&&(this.A-=this.B.Pk)};x[180]=function(){this.Ha[this.S()].call(this,mf)};x[181]=function(){this.Ha[this.S()].call(this,nf)};
            x[182]=function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Gc[b].call(this,rf);switch(c){case 0:this.F=this.F&~this.C|this.F&255;break;case 1:this.G=this.G&~this.C|this.G&255;break;case 2:this.H=this.H&~this.C|this.H&255;break;case 3:this.D=this.D&~this.C|this.D&255;break;case 4:this.Fd=this.Fd&~this.C|this.F>>8&255;this.F=a;break;case 5:this.L=this.L&~this.C|this.G>>8&255;this.G=a;break;case 6:this.K=this.K&~this.C|
            this.H>>8&255;this.H=a;break;case 7:this.J=this.J&~this.C|this.D>>8&255,this.D=a}this.A-=this.V===h?this.B.Wi:this.B.Vi};x[183]=function(){var a=this.S();Td(this,2);this.Ha[a].call(this,rf);switch((a&56)>>3){case 0:this.F&=65535;break;case 1:this.G&=65535;break;case 2:this.H&=65535;break;case 3:this.D&=65535;break;case 4:this.Fd&=65535;break;case 5:this.L&=65535;break;case 6:this.K&=65535;break;case 7:this.J&=65535}this.A-=this.V===h?this.B.Wi:this.B.Vi};
            x[186]=function(){this.Fc[this.S()].call(this,Wg,this.S)};x[187]=function(){this.vb[this.S()].call(this,Re);this.V!==h&&(this.A-=this.B.Pk)};x[188]=function(){this.Ha[this.S()].call(this,Oe)};x[189]=function(){this.Ha[this.S()].call(this,Pe)};
            x[190]=function(){var a,b=this.S(),c=(b&56)>>3;switch(c){case 4:a=this.F;break;case 5:a=this.G;break;case 6:a=this.H;break;case 7:a=this.D}this.Gc[b].call(this,rf);switch(c){case 0:this.F=this.F&~this.C|(this.F&255)<<24>>24&this.C;break;case 1:this.G=this.G&~this.C|(this.G&255)<<24>>24&this.C;break;case 2:this.H=this.H&~this.C|(this.H&255)<<24>>24&this.C;break;case 3:this.D=this.D&~this.C|(this.D&255)<<24>>24&this.C;break;case 4:this.Fd=this.Fd&~this.C|this.F<<16>>24&this.C;this.F=a;break;case 5:this.L=
            this.L&~this.C|this.G<<16>>24&this.C;this.G=a;break;case 6:this.K=this.K&~this.C|this.H<<16>>24&this.C;this.H=a;break;case 7:this.J=this.J&~this.C|this.D<<16>>24&this.C,this.D=a}this.A-=this.V===h?this.B.Wi:this.B.Vi};
            x[191]=function(){var a=this.S();Td(this,2);this.Ha[a].call(this,rf);switch((a&56)>>3){case 0:this.F=this.F<<16>>16;break;case 1:this.G=this.G<<16>>16;break;case 2:this.H=this.H<<16>>16;break;case 3:this.D=this.D<<16>>16;break;case 4:this.Fd=this.Fd<<16>>16;break;case 5:this.L=this.L<<16>>16;break;case 6:this.K=this.K<<16>>16;break;case 7:this.J=this.J<<16>>16}this.A-=this.V===h?this.B.Wi:this.B.Vi};
            var Yd=[function(){this.A-=2+(this.V===h?0:1);return this.Ne.sa},function(){this.A-=2+(this.V===h?0:1);return this.hb.sa},function(a){this.Q|=2;this.Ne.load(a);this.A-=17+(this.V===h?0:2);return a},function(a){this.Q|=2;this.hb.load(a)!==h&&(this.Eb(this.hb.od+4,this.hb.Ob|=512),this.hb.type=768);this.A-=17+(this.V===h?0:2);return a},function(a){this.Q|=2;this.A-=14+(this.V===h?0:2);if(this.Kb.load(a,!0)!==h&&2048!=(this.Kb.Ob&2560)&&(this.Kb.uc>=this.oa.Ja&&this.Kb.uc>=(a&3)||7168==(this.Kb.Ob&7168)))return ue(this),
            a;se(this);return a},function(a){this.Q|=2;this.A-=14+(this.V===h?0:2);if(this.Kb.load(a,!0)!==h&&512==(this.Kb.Ob&2560)&&this.Kb.uc>=this.oa.Ja&&this.Kb.uc>=(a&3))return ue(this),a;se(this);return a},T,T],cd=[ud,ud,ud,ud,ud,ud,T,T],Vg=[function(a){if(this.V===h)dd.call(this);else{a=this.If-this.pd;var b=this.pd;80286==this.ma?b|=-16777216:this.ma>=qb&&(2==this.ja?b&=16777215:a|=b<<16);this.Kj(this.V+2,b);this.A-=11}return a},function(a){if(this.V===h)dd.call(this);else{a=this.Ve-this.qd;var b=this.qd;
            80286==this.ma?b|=-16777216:this.ma>=qb&&(2==this.ja?b&=16777215:a|=b<<16);this.Kj(this.V+2,b);this.A-=12}return a},function(a){this.V===h?dd.call(this):(this.pd=this.Tg(this.V+2)&(this.C|this.C<<8),a&=65535,this.If=this.pd+a,this.Q|=2,this.A-=11);return a},function(a){this.V===h?dd.call(this):(this.qd=this.Tg(this.V+2)&(this.C|this.C<<8),a&=65535,this.Ve=this.qd+a,this.Q|=2,this.A-=12);return a},function(){this.A-=2+(this.V===h?0:1);return this.zb},T,function(a){ve(this,a);this.A-=this.V===h?3:6;
            this.Q|=2;return a},T],Wg=[T,T,T,T,Qe,Ve,Ue,Re],y=[function(a){a=a.call(this,this.F&255,E(this,this.D+this.K));this.F=this.F&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&255,E(this,this.D+this.J));this.F=this.F&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&255,F(this,this.L+this.K));this.F=this.F&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J));this.F=this.F&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&255,E(this,this.K));this.F=
            this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,R(this)));this.F=this.F&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&255,E(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K));this.G=this.G&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J));this.G=this.G&-256|a;this.A-=this.B.Z},
            function(a){a=a.call(this,this.G&255,F(this,this.L+this.K));this.G=this.G&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J));this.G=this.G&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&255,E(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,R(this)));this.G=this.G&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,
            this.G&255,E(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K));this.H=this.H&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&255,E(this,this.D+this.J));this.H=this.H&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K));this.H=this.H&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J));this.H=this.H&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&255,E(this,
            this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,R(this)));this.H=this.H&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&255,E(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K));this.D=this.D&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&255,E(this,this.D+this.J));this.D=this.D&-256|
            a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K));this.D=this.D&-256|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J));this.D=this.D&-256|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&255,E(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,R(this)));this.D=this.D&-256|a;this.A-=this.B.aa},function(a){a=
            a.call(this,this.D&255,E(this,this.D));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.Y},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.F>>8&255,E(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.Y},
            function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.G>>8&255,E(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.J));this.G=this.G&-65281|a<<
            8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.G>>8&255,E(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K));this.H=
            this.H&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.H>>8&255,E(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.H>>8&255,E(this,this.D));
            this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.Z},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.Y},function(a){a=a.call(this,this.D>>
            8&255,E(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.D>>8&255,E(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.D+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,
            this.F&255,E(this,this.D+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.F&255,F(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K+this.M()));this.G=this.G&-256|a;this.A-=
            this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.M()));this.G=this.G&-256|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.D+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.K+
            this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,
            this.D+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&255,F(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K+this.M()));this.F=this.F&-65281|
            a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&
            255,E(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J+this.M()));this.G=this.G&
            -65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&
            255,E(this,this.D+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+this.M()));this.H=this.H&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>
            8&255,E(this,this.D+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+this.M()));this.D=this.D&
            -65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.D+this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,
            this.L+this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&255,F(this,this.L+this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&255,E(this,this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&
            255,E(this,this.D+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&255,E(this,this.D+this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&255,F(this,this.L+this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.O},function(a){a=
            a.call(this,this.G&255,E(this,this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=
            a.call(this,this.H&255,E(this,this.D+this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&255,F(this,this.L+this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&255,E(this,this.K+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.H&255,F(this,this.L+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.D+this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.K+R(this)));this.D=this.D&-256|
            a;this.A-=this.B.P},function(a){a=a.call(this,this.D&255,F(this,this.L+this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&255,E(this,this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.L+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+R(this)));this.D=this.D&
            -256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.J+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.J+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,
            this.F>>8&255,E(this,this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.K+R(this)));this.G=this.G&-65281|a<<
            8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.K+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>
            8&255,E(this,this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.J+R(this)));this.H=this.H&-65281|a<<8;
            this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.J+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,
            F(this,this.L+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.K+R(this)));this.D=this.D&-65281|a<<
            8;this.A-=this.B.P},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.O},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,
            this.D+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=
            a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=
            a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=
            a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=
            a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|
            a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=
            a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&
            255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=
            this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},
            function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],Ld=[function(a){a=a.call(this,J(this,this.D+this.K),this.F&255);P(this,a);this.A-=this.B.Y},function(a){a=
            a.call(this,J(this,this.D+this.J),this.F&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.F&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.F&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.F&255);P(this,a);this.A-=this.B.aa},function(a){a=
            a.call(this,J(this,this.D),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.G&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.G&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.G&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.G&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,J(this,this.J),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.G&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.H&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.H&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.H&255);P(this,a);this.A-=this.B.Z},function(a){a=
            a.call(this,K(this,this.L+this.J),this.H&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.H&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.D&255);P(this,a);this.A-=this.B.Y},function(a){a=
            a.call(this,J(this,this.D+this.J),this.D&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.D&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.D&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.D&255);P(this,a);this.A-=this.B.aa},function(a){a=
            a.call(this,J(this,this.D),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.F>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.F>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.F>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.F>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.F>>8&255);P(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,J(this,this.J),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.F>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.G>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.G>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.G>>
            8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.G>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.G>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+
            this.K),this.H>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.H>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.H>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.H>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,J(this,R(this)),this.H>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K),this.D>>8&255);P(this,a);this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.D+this.J),this.D>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.K),this.D>>8&255);P(this,a);this.A-=this.B.Z},function(a){a=a.call(this,K(this,this.L+this.J),this.D>>8&255);P(this,a);
            this.A-=this.B.Y},function(a){a=a.call(this,J(this,this.K),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.D>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.D),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),
            this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.F&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.D+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,
            J(this,this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.H&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.H&255);P(this,
            a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.H&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.H&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.D+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),
            this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.P},
            function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.D+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+
            this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.H>>8&255);
            P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.D+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.O},function(a){a=
            a.call(this,J(this,this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+
            R(this)),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.F&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.F&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.D+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,
            this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.H&255);P(this,a);this.A-=
            this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
            this.D+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.D&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.D&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),this.D&255);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.P},function(a){a=
            a.call(this,K(this,this.L+this.K+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),
            this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),this.G>>8&255);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.P},
            function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
            this.D+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.D+this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.P},function(a){a=a.call(this,K(this,this.L+this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.O},function(a){a=a.call(this,J(this,this.K+R(this)),
            this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},y[192],y[200],y[208],y[216],y[224],y[232],y[240],y[248],y[193],y[201],y[209],y[217],y[225],y[233],y[241],y[249],y[194],y[202],y[210],y[218],y[226],y[234],y[242],y[250],y[195],y[203],
            y[211],y[219],y[227],y[235],y[243],y[251],y[196],y[204],y[212],y[220],y[228],y[236],y[244],y[252],y[197],y[205],y[213],y[221],y[229],y[237],y[245],y[253],y[198],y[206],y[214],y[222],y[230],y[238],y[246],y[254],y[199],y[207],y[215],y[223],y[231],y[239],y[247],y[255]],Md=[function(a,b){var c=a[0].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,
            K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,J(this,this.D),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=
            this.B.N},function(a,b){var c=a[1].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=
            a[2].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,J(this,this.D),
            b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,J(this,this.K),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},
            function(a,b){var c=a[4].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,
            J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,J(this,this.K),
            b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=
            this.B.Z},function(a,b){var c=a[6].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[6].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=
            a[6].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.D+this.K),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,J(this,this.D+this.J),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,K(this,this.L+this.K),b.call(this));P(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,K(this,this.L+this.J),b.call(this));P(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,
            J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.D+this.J+this.M()),
            b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,
            this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=
            a[1].call(this,K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,
            b){var c=a[2].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.K+this.M()),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.D+this.J+this.M()),b.call(this));
            P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+this.M()),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,
            K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,
            b){var c=a[5].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},
            function(a,b){var c=a[6].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.D+this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.J+this.M()),
            b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.K+
            R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,
            K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,
            b){var c=a[2].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,
            b){var c=a[3].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[3].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);
            this.A-=this.B.P},function(a,b){var c=a[4].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+R(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,J(this,this.K+R(this)),
            b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.D+this.J+
            R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,
            this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.D+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,K(this,this.L+this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,
            K(this,this.L+this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,
            this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,
            this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=
            a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<
            8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|
            c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&
            -256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));
            this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&
            255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>
            8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,
            this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8}],z=[function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K));this.F=this.F&~this.C|a;this.A-=
            this.B.Y},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.J));this.F=this.F&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K));this.F=this.F&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J));this.F=this.F&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.F&this.C,H(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.J));this.F=this.F&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,R(this)));this.F=this.F&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&this.C,H(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K));this.G=this.G&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J));this.G=this.G&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.K));this.G=this.G&
            ~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J));this.G=this.G&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.G&this.C,H(this,this.K));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,R(this)));this.G=this.G&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&this.C,H(this,this.D));this.G=this.G&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K));this.H=this.H&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J));this.H=this.H&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K));this.H=this.H&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.J));this.H=this.H&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.H&this.C,H(this,this.K));this.H=
            this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,R(this)));this.H=this.H&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&this.C,H(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K));this.D=this.D&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J));this.D=
            this.D&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K));this.D=this.D&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J));this.D=this.D&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.D&this.C,H(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,R(this)));this.D=
            this.D&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&this.C,H(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K));t(this,q(this)&~this.C|a);this.A-=this.B.Y},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.J));t(this,q(this)&~this.C|a);this.A-=this.B.Z},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K));t(this,q(this)&~this.C|a);this.A-=this.B.Z},function(a){a=a.call(this,q(this)&this.C,I(this,
            this.L+this.J));t(this,q(this)&~this.C|a);this.A-=this.B.Y},function(a){a=a.call(this,q(this)&this.C,H(this,this.K));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.J));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.aa},function(a){a=a.call(this,q(this)&this.C,H(this,this.D));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,
            H(this,this.D+this.K));this.L=this.L&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J));this.L=this.L&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.K));this.L=this.L&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J));this.L=this.L&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.L&this.C,H(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.L&this.C,H(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,R(this)));this.L=this.L&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.L&this.C,H(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K));this.K=this.K&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J));this.K=this.K&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,
            this.K&this.C,I(this,this.L+this.K));this.K=this.K&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.J));this.K=this.K&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.K&this.C,H(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.J));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,R(this)));this.K=this.K&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,
            this.K&this.C,H(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.K));this.J=this.J&~this.C|a;this.A-=this.B.Y},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J));this.J=this.J&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K));this.J=this.J&~this.C|a;this.A-=this.B.Z},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J));this.J=this.J&~this.C|a;this.A-=this.B.Y},function(a){a=
            a.call(this,this.J&this.C,H(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,R(this)));this.J=this.J&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.J&this.C,H(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=
            a.call(this,this.F&this.C,H(this,this.D+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+this.M()));this.F=
            this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,
            this.G&this.C,I(this,this.L+this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.M()));this.G=this.G&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&
            this.C,I(this,this.L+this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,
            this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=
            a.call(this,q(this)&this.C,H(this,this.D+this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+
            this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},
            function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.M()));
            this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=
            a.call(this,this.K&this.C,I(this,this.L+this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.M()));this.K=this.K&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,
            this.J&this.C,H(this,this.K+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.K+R(this)));this.F=this.F&~this.C|a;this.A-=
            this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.F&this.C,H(this,this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
            this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.K+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.D+this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=
            a.call(this,this.G&this.C,I(this,this.L+this.K+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.G&this.C,H(this,this.K+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+R(this)));this.G=this.G&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.H&
            this.C,I(this,this.L+this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.H&this.C,H(this,this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.K+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.K+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.D&this.C,H(this,this.K+
            R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.K+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,
            q(this)&this.C,H(this,this.D+this.J+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.K+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.P},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.J+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.O},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+R(this)));t(this,
            q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,
            this.L&this.C,I(this,this.L+this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.L&this.C,H(this,this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+R(this)));this.L=this.L&~this.C|a;this.A-=
            this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,this.L+this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.K&this.C,I(this,
            this.L+this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.K&this.C,H(this,this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.J&this.C,H(this,this.D+this.K+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.K+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.P},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.O},function(a){a=a.call(this,this.J&this.C,H(this,this.K+R(this)));
            this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.G&this.C);this.F=
            this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,q(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&this.C);this.F=this.F&~this.C|a},function(a){a=
            a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,q(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,
            this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,q(this)&this.C);this.H=
            this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.H&this.C);this.D=this.D&~this.C|a},function(a){a=
            a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,q(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,q(this)&this.C,this.F&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&
            this.C,this.G&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.H&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.D&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,q(this)&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.L&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.K&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,
            this.J&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,q(this)&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.L&this.C);this.L=
            this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.D&this.C);this.K=this.K&~this.C|a},function(a){a=
            a.call(this,this.K&this.C,q(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,
            this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,q(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],Nd=[function(a){a=a.call(this,M(this,this.D+this.K),this.F&
            this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.F&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),this.F&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.F&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.K),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            M(this,R(this)),this.F&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),this.G&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.G&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),this.G&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.G&this.C);Q(this,a);this.A-=this.B.Y},
            function(a){a=a.call(this,M(this,this.K),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.G&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),this.H&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.H&this.C);Q(this,a);
            this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),this.H&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.H&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.K),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.H&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.H&
            this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),this.D&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.D&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),this.D&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.D&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.K),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            M(this,this.J),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.D&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),q(this)&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),q(this)&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),q(this)&this.C);Q(this,a);this.A-=this.B.Z},
            function(a){a=a.call(this,O(this,this.L+this.J),q(this)&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.K),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),this.L&this.C);Q(this,
            a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.L&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),this.L&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.L&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.K),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),
            this.L&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),this.K&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.K&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.K),this.K&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.K&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=
            a.call(this,M(this,this.K),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.K&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K),this.J&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.D+this.J),this.J&this.C);Q(this,a);this.A-=this.B.Z},
            function(a){a=a.call(this,O(this,this.L+this.K),this.J&this.C);Q(this,a);this.A-=this.B.Z},function(a){a=a.call(this,O(this,this.L+this.J),this.J&this.C);Q(this,a);this.A-=this.B.Y},function(a){a=a.call(this,M(this,this.K),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.J&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.D),this.J&this.C);Q(this,a);
            this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),this.F&this.C);Q(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=
            a.call(this,O(this,this.L+this.K+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+
            this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),
            this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),this.D&this.C);Q(this,
            a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.D+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,
            M(this,this.K+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),
            this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.L&this.C);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.K&this.C);Q(this,a);this.A-=
            this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,
            M(this,this.D+this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),
            this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.F&this.C);
            Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.O},function(a){a=
            a.call(this,M(this,this.D+this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+
            R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.H&
            this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.O},
            function(a){a=a.call(this,M(this,this.D+this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            O(this,this.L+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+
            R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.L&this.C);Q(this,
            a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,O(this,this.L+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,
            O(this,this.L+this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.K+R(this)),this.J&
            this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.D+this.J+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.K+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.P},function(a){a=a.call(this,O(this,this.L+this.J+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.O},function(a){a=a.call(this,M(this,this.K+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.J&this.C);Q(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},z[192],z[200],z[208],z[216],z[224],z[232],z[240],z[248],z[193],z[201],z[209],z[217],z[225],z[233],z[241],z[249],z[194],z[202],z[210],z[218],z[226],z[234],z[242],z[250],z[195],z[203],z[211],z[219],z[227],z[235],z[243],z[251],z[196],z[204],z[212],z[220],z[228],z[236],z[244],z[252],z[197],z[205],z[213],z[221],
            z[229],z[237],z[245],z[253],z[198],z[206],z[214],z[222],z[230],z[238],z[246],z[254],z[199],z[207],z[215],z[223],z[231],z[239],z[247],z[255]],Od=[function(a,b){var c=a[0].call(this,M(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[0].call(this,O(this,this.L+this.J),b.call(this));
            Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[0].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,
            b){var c=a[1].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[1].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[1].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,
            M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[2].call(this,O(this,this.L+this.J),
            b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[2].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,this.D+this.K),b.call(this));Q(this,c);this.A-=
            this.B.Y},function(a,b){var c=a[3].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[3].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[3].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[3].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[4].call(this,
            O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[4].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.D+this.K),b.call(this));
            Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[5].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[5].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},
            function(a,b){var c=a[5].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,this.D+this.K),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[6].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=
            a[6].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[6].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,this.D+this.K),
            b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,M(this,this.D+this.J),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,O(this,this.L+this.K),b.call(this));Q(this,c);this.A-=this.B.Z},function(a,b){var c=a[7].call(this,O(this,this.L+this.J),b.call(this));Q(this,c);this.A-=this.B.Y},function(a,b){var c=a[7].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,this.J),b.call(this));Q(this,
            c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,O(this,this.L+this.K+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.D+this.M()),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,M(this,
            this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,
            M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,
            b){var c=a[2].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=
            this.B.P},function(a,b){var c=a[3].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.D+this.M()),b.call(this));Q(this,
            c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,M(this,this.K+
            this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,M(this,
            this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=
            a[5].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},
            function(a,b){var c=a[6].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=
            this.B.I},function(a,b){var c=a[7].call(this,M(this,this.D+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,M(this,this.D+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,O(this,this.L+this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,O(this,this.L+this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,M(this,this.K+this.M()),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,M(this,this.D+
            this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[0].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[0].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[1].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=
            a[1].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[1].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=
            a[2].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[2].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[2].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},
            function(a,b){var c=a[2].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=
            this.B.P},function(a,b){var c=a[3].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[3].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[3].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+R(this)),b.call(this));Q(this,
            c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[4].call(this,O(this,this.L+this.J+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[4].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.D+this.K+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[5].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[5].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,
            this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,
            O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[6].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[6].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.D+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,b){var c=a[7].call(this,M(this,this.D+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,O(this,this.L+this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.P},function(a,b){var c=a[7].call(this,O(this,this.L+this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.O},function(a,
            b){var c=a[7].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,
            this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,
            b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,q(this)&this.C,b.call(this));t(this,q(this)&
            ~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,
            b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[2].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=
            a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|
            c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));
            this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[4].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,
            this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,
            b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,q(this)&this.C,b.call(this));t(this,q(this)&
            ~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,
            b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[7].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],A=[function(a){a=a.call(this,
            this.F&255,E(this,this.F));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.G));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.H));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.D));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,S(this,0)));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,R(this)));this.F=this.F&
            -256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&255,E(this,this.K));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.J));this.F=this.F&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.F));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.G));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.H));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.G&255,E(this,this.D));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,S(this,0)));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,R(this)));this.G=this.G&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&255,E(this,this.K));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&255,E(this,this.J));this.G=this.G&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.F));this.H=this.H&
            -256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.G));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.H));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.D));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,S(this,0)));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,R(this)));this.H=this.H&-256|a;this.A-=this.B.aa},function(a){a=
            a.call(this,this.H&255,E(this,this.K));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&255,E(this,this.J));this.H=this.H&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.F));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.G));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.H));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.D));this.D=
            this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,S(this,0)));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,R(this)));this.D=this.D&-256|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&255,E(this,this.K));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&255,E(this,this.J));this.D=this.D&-256|a;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.F));this.F=this.F&-65281|a<<8;this.A-=this.B.N},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.G));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.H));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.D));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,S(this,0)));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.aa},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.K));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F>>8&255,E(this,this.J));this.F=this.F&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.F));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.G));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.H));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.G>>8&255,E(this,this.D));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,S(this,0)));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.G>>8&255,E(this,this.K));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.G>>8&255,E(this,this.J));this.G=this.G&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.H>>8&255,E(this,this.F));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.G));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.H));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.D));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,S(this,0)));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.H>>8&255,E(this,R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.H>>8&255,E(this,this.K));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.H>>8&255,E(this,this.J));this.H=this.H&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.F));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.G));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.D>>8&255,E(this,this.H));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,this.D));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,S(this,0)));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.D>>8&255,E(this,R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.aa},function(a){a=a.call(this,this.D>>8&255,E(this,this.K));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=
            a.call(this,this.D>>8&255,E(this,this.J));this.D=this.D&-65281|a<<8;this.A-=this.B.N},function(a){a=a.call(this,this.F&255,E(this,this.F+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.G+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.H+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.F&255,E(this,S(this,1)+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.K+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.J+this.M()));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.F+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&255,E(this,this.G+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.H+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,S(this,1)+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&255,E(this,this.K+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+this.M()));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.F+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.G+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.H+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.H&255,E(this,this.D+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,S(this,1)+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.K+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+this.M()));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,E(this,this.F+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.G+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.H+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,S(this,1)+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.D&255,F(this,this.L+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.K+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+this.M()));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.F+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.G+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.F>>8&255,E(this,this.H+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,S(this,1)+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,F(this,this.L+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+this.M()));
            this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+this.M()));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.F+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.G+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.H+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.G>>8&255,E(this,this.D+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,S(this,1)+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+this.M()));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+this.M()));this.G=this.G&-65281|a<<
            8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.F+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.G+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.H+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.D+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,
            S(this,1)+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+this.M()));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.F+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},
            function(a){a=a.call(this,this.D>>8&255,E(this,this.G+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.H+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,S(this,1)+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+this.M()));
            this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+this.M()));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.F+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.G+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,
            this.H+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.D+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,S(this,2)+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,F(this,this.L+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,this.K+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,E(this,
            this.J+R(this)));this.F=this.F&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.F+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.G+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.H+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.D+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,S(this,
            2)+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,F(this,this.L+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.K+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&255,E(this,this.J+R(this)));this.G=this.G&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.F+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.G+
            R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.H+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.D+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,S(this,2)+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,F(this,this.L+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.K+
            R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&255,E(this,this.J+R(this)));this.H=this.H&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.F+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.G+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.H+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.D+R(this)));
            this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,S(this,2)+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,F(this,this.L+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.K+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&255,E(this,this.J+R(this)));this.D=this.D&-256|a;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.F+R(this)));
            this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.G+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.H+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.D+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,S(this,2)+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.F>>8&255,F(this,this.L+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.K+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F>>8&255,E(this,this.J+R(this)));this.F=this.F&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.F+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.G+R(this)));this.G=this.G&-65281|a<<8;this.A-=
            this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.H+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.D+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,S(this,2)+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,F(this,this.L+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.K+R(this)));
            this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.G>>8&255,E(this,this.J+R(this)));this.G=this.G&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.F+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.G+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.H+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,
            this.H>>8&255,E(this,this.D+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,S(this,2)+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,F(this,this.L+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.K+R(this)));this.H=this.H&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.H>>8&255,E(this,this.J+R(this)));this.H=this.H&-65281|a<<8;this.A-=
            this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.F+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.G+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.H+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.D+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,S(this,2)+R(this)));
            this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,F(this,this.L+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.K+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.D>>8&255,E(this,this.J+R(this)));this.D=this.D&-65281|a<<8;this.A-=this.B.I},function(a){a=a.call(this,this.F&255,this.F&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G&255);this.F=this.F&
            -256|a},function(a){a=a.call(this,this.F&255,this.H&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.F>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.G>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.H>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.F&255,this.D>>8&255);this.F=this.F&-256|a},function(a){a=a.call(this,this.G&255,this.F&255);this.G=
            this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.F>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.G>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.H>>8&255);this.G=this.G&-256|a},function(a){a=a.call(this,this.G&255,this.D>>8&255);
            this.G=this.G&-256|a},function(a){a=a.call(this,this.H&255,this.F&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.F>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.G>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.H>>8&
            255);this.H=this.H&-256|a},function(a){a=a.call(this,this.H&255,this.D>>8&255);this.H=this.H&-256|a},function(a){a=a.call(this,this.D&255,this.F&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.F>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.G>>
            8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.H>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.D&255,this.D>>8&255);this.D=this.D&-256|a},function(a){a=a.call(this,this.F>>8&255,this.F&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D&255);this.F=this.F&-65281|a<<8},function(a){a=
            a.call(this,this.F>>8&255,this.F>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.G>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.H>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.F>>8&255,this.D>>8&255);this.F=this.F&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>
            8&255,this.H&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.F>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.G>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.H>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.G>>8&255,this.D>>8&255);this.G=this.G&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F&255);
            this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.D&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.F>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.G>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.H>>8&255,this.H>>8&255);this.H=this.H&-65281|
            a<<8},function(a){a=a.call(this,this.H>>8&255,this.D>>8&255);this.H=this.H&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.G&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.F>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,
            this.D>>8&255,this.G>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.H>>8&255);this.D=this.D&-65281|a<<8},function(a){a=a.call(this,this.D>>8&255,this.D>>8&255);this.D=this.D&-65281|a<<8}],Pd=[function(a){a=a.call(this,J(this,this.F),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,
            this.D),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this,0)),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.F&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.G&
            255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this,0)),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.G&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.G&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G&255);P(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this,0)),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.H&255);P(this,a);this.A-=
            this.B.aa},function(a){a=a.call(this,J(this,this.K),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=
            a.call(this,J(this,S(this,0)),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.D&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.H),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this,0)),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.F>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.F>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.F),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this,0)),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.G>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,
            J(this,this.K),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.G>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.H),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,S(this,0)),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.H>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.H>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.F),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.G),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.H),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.D),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,S(this,0)),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,R(this)),this.D>>8&255);P(this,a);this.A-=this.B.aa},function(a){a=a.call(this,J(this,this.K),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,J(this,this.J),this.D>>8&255);P(this,a);this.A-=this.B.N},function(a){a=a.call(this,
            J(this,this.F+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F&255);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),
            this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.G+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.H&255);
            P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,S(this,1)+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.F>>8&255);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.J+this.M()),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),
            this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,J(this,this.H+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,
            this.J+this.M()),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,1)+this.M()),this.D>>8&255);P(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+this.M()),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.H+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.F&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.F&255);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),
            this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.G&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            J(this,this.D+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.H&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.D&255);P(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),
            this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.D&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,S(this,2)+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.F>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.G>>
            8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.J+R(this)),this.G>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.H+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.H>>
            8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.H>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.F+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.G+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,J(this,this.H+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.D+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,S(this,2)+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,K(this,this.L+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.K+R(this)),this.D>>8&255);P(this,a);this.A-=this.B.I},function(a){a=a.call(this,J(this,this.J+R(this)),this.D>>
            8&255);P(this,a);this.A-=this.B.I},A[192],A[200],A[208],A[216],A[224],A[232],A[240],A[248],A[193],A[201],A[209],A[217],A[225],A[233],A[241],A[249],A[194],A[202],A[210],A[218],A[226],A[234],A[242],A[250],A[195],A[203],A[211],A[219],A[227],A[235],A[243],A[251],A[196],A[204],A[212],A[220],A[228],A[236],A[244],A[252],A[197],A[205],A[213],A[221],A[229],A[237],A[245],A[253],A[198],A[206],A[214],A[222],A[230],A[238],A[246],A[254],A[199],A[207],A[215],A[223],A[231],A[239],A[247],A[255]],Qd=[function(a,b){var c=
            a[0].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,R(this)),b.call(this));
            P(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=
            a[1].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.F),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,
            b){var c=a[2].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.D),b.call(this));
            P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,
            b){var c=a[4].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,J(this,this.K),
            b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},
            function(a,b){var c=a[5].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,
            this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=
            this.B.N},function(a,b){var c=a[6].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.F),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.G),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.H),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.D),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,
            J(this,S(this,0)),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,R(this)),b.call(this));P(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,J(this,this.K),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,J(this,this.J),b.call(this));P(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,J(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.G+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.K+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.F+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.H+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,S(this,1)+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.G+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.K+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.F+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.F+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.G+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.H+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,S(this,1)+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+this.M()),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.K+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.J+this.M()),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.H+R(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,J(this,this.J+R(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,S(this,2)+R(this)),b.call(this));
            P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.G+R(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.K+R(this)),b.call(this));P(this,
            c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);
            this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[5].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[6].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=
            this.B.I},function(a,b){var c=a[6].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.F+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.G+R(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[7].call(this,J(this,this.H+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.D+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,S(this,2)+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,K(this,this.L+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,J(this,this.K+R(this)),b.call(this));P(this,c);this.A-=this.B.I},
            function(a,b){var c=a[7].call(this,J(this,this.J+R(this)),b.call(this));P(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[0].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[0].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[0].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[0].call(this,this.F>>8&255,b.call(this));this.F=this.F&
            -65281|c<<8},function(a,b){var c=a[0].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[0].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[0].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[1].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[1].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[1].call(this,this.H&255,b.call(this));
            this.H=this.H&-256|c},function(a,b){var c=a[1].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[1].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[1].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[1].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[1].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[2].call(this,this.F&
            255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[2].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[2].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[2].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[2].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[2].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[2].call(this,
            this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[2].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[3].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[3].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[3].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[3].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[3].call(this,
            this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[3].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[3].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[3].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[4].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[4].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=
            a[4].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[4].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[4].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[4].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[4].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[4].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<
            8},function(a,b){var c=a[5].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[5].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[5].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[5].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[5].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[5].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|
            c<<8},function(a,b){var c=a[5].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[5].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[6].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[6].call(this,this.G&255,b.call(this));this.G=this.G&-256|c},function(a,b){var c=a[6].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[6].call(this,this.D&255,b.call(this));this.D=this.D&
            -256|c},function(a,b){var c=a[6].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[6].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[6].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[6].call(this,this.D>>8&255,b.call(this));this.D=this.D&-65281|c<<8},function(a,b){var c=a[7].call(this,this.F&255,b.call(this));this.F=this.F&-256|c},function(a,b){var c=a[7].call(this,this.G&255,b.call(this));
            this.G=this.G&-256|c},function(a,b){var c=a[7].call(this,this.H&255,b.call(this));this.H=this.H&-256|c},function(a,b){var c=a[7].call(this,this.D&255,b.call(this));this.D=this.D&-256|c},function(a,b){var c=a[7].call(this,this.F>>8&255,b.call(this));this.F=this.F&-65281|c<<8},function(a,b){var c=a[7].call(this,this.G>>8&255,b.call(this));this.G=this.G&-65281|c<<8},function(a,b){var c=a[7].call(this,this.H>>8&255,b.call(this));this.H=this.H&-65281|c<<8},function(a,b){var c=a[7].call(this,this.D>>8&
            255,b.call(this));this.D=this.D&-65281|c<<8}],B=[function(a){a=a.call(this,this.F&this.C,H(this,this.F));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.G));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.H));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.D));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,S(this,0)));this.F=
            this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,R(this)));this.F=this.F&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.F&this.C,H(this,this.K));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.J));this.F=this.F&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.F));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.G));this.G=this.G&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.H));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.D));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,S(this,0)));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,R(this)));this.G=this.G&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.G&this.C,H(this,this.K));this.G=this.G&~this.C|a;this.A-=
            this.B.N},function(a){a=a.call(this,this.G&this.C,H(this,this.J));this.G=this.G&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.F));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.G));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.H));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.D));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=
            a.call(this,this.H&this.C,H(this,S(this,0)));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,R(this)));this.H=this.H&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.H&this.C,H(this,this.K));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.H&this.C,H(this,this.J));this.H=this.H&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.F));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,
            this.D&this.C,H(this,this.G));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.H));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.D));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,S(this,0)));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,R(this)));this.D=this.D&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.D&
            this.C,H(this,this.K));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.D&this.C,H(this,this.J));this.D=this.D&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.F));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.G));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.H));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,
            H(this,this.D));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,S(this,0)));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.aa},function(a){a=a.call(this,q(this)&this.C,H(this,this.K));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,q(this)&this.C,H(this,this.J));t(this,q(this)&~this.C|a);this.A-=this.B.N},function(a){a=a.call(this,this.L&
            this.C,H(this,this.F));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.G));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.H));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.D));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,S(this,0)));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,
            R(this)));this.L=this.L&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.L&this.C,H(this,this.K));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.L&this.C,H(this,this.J));this.L=this.L&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.F));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.G));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.H));
            this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.D));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,S(this,0)));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,R(this)));this.K=this.K&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.K&this.C,H(this,this.K));this.K=this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.K&this.C,H(this,this.J));this.K=
            this.K&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.F));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.G));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.H));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.D));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,S(this,0)));this.J=this.J&~this.C|
            a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,R(this)));this.J=this.J&~this.C|a;this.A-=this.B.aa},function(a){a=a.call(this,this.J&this.C,H(this,this.K));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.J&this.C,H(this,this.J));this.J=this.J&~this.C|a;this.A-=this.B.N},function(a){a=a.call(this,this.F&this.C,H(this,this.F+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.G+this.M()));this.F=this.F&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.H+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.D+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,S(this,1)+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
            this.K+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+this.M()));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.F+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.G+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.H+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=
            a.call(this,this.G&this.C,H(this,this.D+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,S(this,1)+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,I(this,this.L+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.K+this.M()));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+this.M()));this.G=this.G&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.F+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.G+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.H+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,S(this,
            1)+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.K+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+this.M()));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.F+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&this.C,H(this,this.G+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.H+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.D+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,S(this,1)+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+this.M()));this.D=this.D&~this.C|a;this.A-=
            this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.K+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+this.M()));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.F+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.G+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.H+this.M()));
            t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,S(this,1)+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=
            a.call(this,q(this)&this.C,H(this,this.J+this.M()));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.F+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.G+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.H+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+this.M()));this.L=this.L&~this.C|
            a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,S(this,1)+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.K+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+this.M()));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.F+
            this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.G+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.H+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,S(this,1)+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.K&this.C,I(this,this.L+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.K+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.J+this.M()));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.F+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.G+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.J&this.C,H(this,this.H+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,S(this,1)+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.K+this.M()));this.J=
            this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+this.M()));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.F+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.G+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.H+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,
            this.D+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,S(this,2)+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,I(this,this.L+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.K+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,H(this,this.J+R(this)));this.F=this.F&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.G&this.C,H(this,this.F+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.G+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.H+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.D+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,S(this,2)+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.G&this.C,I(this,this.L+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.K+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.G&this.C,H(this,this.J+R(this)));this.G=this.G&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.F+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.G+R(this)));this.H=this.H&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.H+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.D+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,S(this,2)+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,I(this,this.L+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,
            this.K+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.H&this.C,H(this,this.J+R(this)));this.H=this.H&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.F+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.G+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.H+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.D&this.C,H(this,this.D+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,S(this,2)+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,I(this,this.L+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.K+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.D&this.C,H(this,this.J+R(this)));this.D=this.D&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,q(this)&this.C,H(this,this.F+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.G+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.H+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.D+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,S(this,2)+R(this)));
            t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,I(this,this.L+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.K+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,q(this)&this.C,H(this,this.J+R(this)));t(this,q(this)&~this.C|a);this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.F+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.L&this.C,H(this,this.G+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.H+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.D+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,S(this,2)+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,I(this,this.L+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},
            function(a){a=a.call(this,this.L&this.C,H(this,this.K+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.L&this.C,H(this,this.J+R(this)));this.L=this.L&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.F+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.G+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.H+R(this)));this.K=this.K&
            ~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.D+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,S(this,2)+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,I(this,this.L+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,this.K+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.K&this.C,H(this,
            this.J+R(this)));this.K=this.K&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.F+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.G+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.H+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.D+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,
            this.J&this.C,H(this,S(this,2)+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,I(this,this.L+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.K+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.J&this.C,H(this,this.J+R(this)));this.J=this.J&~this.C|a;this.A-=this.B.I},function(a){a=a.call(this,this.F&this.C,this.F&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,
            this.F&this.C,this.G&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.H&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.D&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,q(this)&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.L&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.K&this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.F&this.C,this.J&
            this.C);this.F=this.F&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.F&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.G&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.H&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.D&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,q(this)&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.L&this.C);this.G=this.G&
            ~this.C|a},function(a){a=a.call(this,this.G&this.C,this.K&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.G&this.C,this.J&this.C);this.G=this.G&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.F&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.G&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.H&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.D&this.C);this.H=this.H&~this.C|a},function(a){a=
            a.call(this,this.H&this.C,q(this)&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.L&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.K&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.H&this.C,this.J&this.C);this.H=this.H&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.F&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.G&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,
            this.H&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.D&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,q(this)&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.L&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.K&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,this.D&this.C,this.J&this.C);this.D=this.D&~this.C|a},function(a){a=a.call(this,q(this)&this.C,this.F&this.C);t(this,
            q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.G&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.H&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.D&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,q(this)&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.L&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.K&this.C);t(this,q(this)&
            ~this.C|a)},function(a){a=a.call(this,q(this)&this.C,this.J&this.C);t(this,q(this)&~this.C|a)},function(a){a=a.call(this,this.L&this.C,this.F&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.G&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.H&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.D&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,q(this)&this.C);this.L=this.L&~this.C|a},function(a){a=
            a.call(this,this.L&this.C,this.L&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.K&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.L&this.C,this.J&this.C);this.L=this.L&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.F&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.G&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.H&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,
            this.D&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,q(this)&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.L&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.K&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.K&this.C,this.J&this.C);this.K=this.K&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.F&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.G&this.C);this.J=
            this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.H&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.D&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,q(this)&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.L&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.K&this.C);this.J=this.J&~this.C|a},function(a){a=a.call(this,this.J&this.C,this.J&this.C);this.J=this.J&~this.C|a}],Rd=
            [function(a){a=a.call(this,M(this,this.F),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.H),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,S(this,0)),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.F&this.C);Q(this,a);this.A-=this.B.aa},
            function(a){a=a.call(this,M(this,this.K),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.F&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.H),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.G&this.C);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,M(this,S(this,0)),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.G&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.K),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.G&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.H&this.C);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,M(this,this.H),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,S(this,0)),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.H&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.K),this.H&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.H&this.C);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,M(this,this.F),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.H),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,S(this,0)),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.D&this.C);Q(this,a);this.A-=this.B.aa},
            function(a){a=a.call(this,M(this,this.K),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.D&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.H),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),q(this)&this.C);Q(this,a);this.A-=this.B.N},
            function(a){a=a.call(this,M(this,S(this,0)),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.K),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),q(this)&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.L&this.C);Q(this,a);this.A-=
            this.B.N},function(a){a=a.call(this,M(this,this.H),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,S(this,0)),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.L&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.K),this.L&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.L&this.C);Q(this,a);
            this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.H),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,S(this,0)),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.K&this.C);Q(this,
            a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.K),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.K&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.G),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.H),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.D),this.J&this.C);Q(this,
            a);this.A-=this.B.N},function(a){a=a.call(this,M(this,S(this,0)),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,R(this)),this.J&this.C);Q(this,a);this.A-=this.B.aa},function(a){a=a.call(this,M(this,this.K),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.J),this.J&this.C);Q(this,a);this.A-=this.B.N},function(a){a=a.call(this,M(this,this.F+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),
            this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.F&this.C);Q(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            M(this,S(this,1)+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),this.H&this.C);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.J+this.M()),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),
            this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.H+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,
            this.J+this.M()),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),this.L&this.C);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.H+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),
            this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,1)+this.M()),this.J&this.C);Q(this,a);this.A-=
            this.B.I},function(a){a=a.call(this,O(this,this.L+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+this.M()),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,
            this.H+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+R(this)),this.F&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.F&this.C);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            O(this,this.L+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.G&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),this.H&this.C);Q(this,
            a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.H&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,
            M(this,this.F+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.D&this.C);
            Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.D&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=
            a.call(this,M(this,this.D+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),q(this)&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),
            this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.K+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.L&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.G+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),
            this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.K&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.F+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},
            function(a){a=a.call(this,M(this,this.G+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.H+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.D+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,S(this,2)+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,O(this,this.L+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.K+
            R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},function(a){a=a.call(this,M(this,this.J+R(this)),this.J&this.C);Q(this,a);this.A-=this.B.I},B[192],B[200],B[208],B[216],B[224],B[232],B[240],B[248],B[193],B[201],B[209],B[217],B[225],B[233],B[241],B[249],B[194],B[202],B[210],B[218],B[226],B[234],B[242],B[250],B[195],B[203],B[211],B[219],B[227],B[235],B[243],B[251],B[196],B[204],B[212],B[220],B[228],B[236],B[244],B[252],B[197],B[205],B[213],B[221],B[229],B[237],B[245],B[253],B[198],B[206],B[214],
            B[222],B[230],B[238],B[246],B[254],B[199],B[207],B[215],B[223],B[231],B[239],B[247],B[255]],Sd=[function(a,b){var c=a[0].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,
            S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[0].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=
            this.B.N},function(a,b){var c=a[1].call(this,M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[1].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[1].call(this,
            M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,S(this,0)),b.call(this));Q(this,c);
            this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[2].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[2].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,
            M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[3].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[3].call(this,M(this,this.J),b.call(this));Q(this,
            c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=
            a[4].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[4].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[4].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.H),b.call(this));
            Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[5].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[5].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,
            b){var c=a[6].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,R(this)),
            b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[6].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[6].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,this.F),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,this.G),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,this.H),b.call(this));Q(this,c);this.A-=this.B.N},
            function(a,b){var c=a[7].call(this,M(this,this.D),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,S(this,0)),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,R(this)),b.call(this));Q(this,c);this.A-=this.B.aa},function(a,b){var c=a[7].call(this,M(this,this.K),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[7].call(this,M(this,this.J),b.call(this));Q(this,c);this.A-=this.B.N},function(a,b){var c=a[0].call(this,M(this,
            this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,
            M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,
            M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,
            M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,
            M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,
            O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,
            M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.F+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.G+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.H+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.D+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,
            M(this,S(this,1)+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.K+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.J+this.M()),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,
            M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,
            this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[1].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,
            this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,O(this,
            this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[2].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.H+
            R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[3].call(this,M(this,this.J+
            R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,S(this,2)+
            R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[4].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.G+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.K+R(this)),
            b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[5].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.F+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.D+R(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,O(this,this.L+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[6].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.F+R(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.G+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.H+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.D+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,S(this,2)+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,O(this,this.L+R(this)),b.call(this));
            Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.K+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[7].call(this,M(this,this.J+R(this)),b.call(this));Q(this,c);this.A-=this.B.I},function(a,b){var c=a[0].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[0].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[0].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[0].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[0].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[0].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[0].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[0].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[1].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[1].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[1].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[1].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[1].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[1].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[1].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[1].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[2].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[2].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[2].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[2].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
            a[2].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[2].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[2].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[2].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[3].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[3].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|
            c},function(a,b){var c=a[3].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[3].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[3].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[3].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[3].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[3].call(this,this.J&this.C,b.call(this));
            this.J=this.J&~this.C|c},function(a,b){var c=a[4].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[4].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[4].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[4].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[4].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[4].call(this,
            this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[4].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[4].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[5].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[5].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[5].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,
            b){var c=a[5].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[5].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[5].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[5].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[5].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[6].call(this,this.F&this.C,b.call(this));this.F=
            this.F&~this.C|c},function(a,b){var c=a[6].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[6].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[6].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=a[6].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[6].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[6].call(this,this.K&
            this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[6].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c},function(a,b){var c=a[7].call(this,this.F&this.C,b.call(this));this.F=this.F&~this.C|c},function(a,b){var c=a[7].call(this,this.G&this.C,b.call(this));this.G=this.G&~this.C|c},function(a,b){var c=a[7].call(this,this.H&this.C,b.call(this));this.H=this.H&~this.C|c},function(a,b){var c=a[7].call(this,this.D&this.C,b.call(this));this.D=this.D&~this.C|c},function(a,b){var c=
            a[7].call(this,q(this)&this.C,b.call(this));t(this,q(this)&~this.C|c)},function(a,b){var c=a[7].call(this,this.L&this.C,b.call(this));this.L=this.L&~this.C|c},function(a,b){var c=a[7].call(this,this.K&this.C,b.call(this));this.K=this.K&~this.C|c},function(a,b){var c=a[7].call(this,this.J&this.C,b.call(this));this.J=this.J&~this.C|c}],Be=[function(){return this.F+this.F},function(){return this.G+this.F},function(){return this.H+this.F},function(){return this.D+this.F},function(){this.da=this.ga;return q(this)+
            this.F},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.F},function(){return this.K+this.F},function(){return this.J+this.F},function(){return this.F+this.G},function(){return this.G+this.G},function(){return this.H+this.G},function(){return this.D+this.G},function(){this.da=this.ga;return q(this)+this.G},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.G},function(){return this.K+this.G},function(){return this.J+this.G},function(){return this.F+this.H},function(){return this.G+
            this.H},function(){return this.H+this.H},function(){return this.D+this.H},function(){this.da=this.ga;return q(this)+this.H},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.H},function(){return this.K+this.H},function(){return this.J+this.H},function(){return this.F+this.D},function(){return this.G+this.D},function(){return this.H+this.D},function(){return this.D+this.D},function(){this.da=this.ga;return q(this)+this.D},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.D},
            function(){return this.K+this.D},function(){return this.J+this.D},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+this.L},function(){return this.G+this.L},function(){return this.H+this.L},function(){return this.D+this.L},function(){this.da=this.ga;return q(this)+this.L},
            function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.L},function(){return this.K+this.L},function(){return this.J+this.L},function(){return this.F+this.K},function(){return this.G+this.K},function(){return this.H+this.K},function(){return this.D+this.K},function(){this.da=this.ga;return q(this)+this.K},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.K},function(){return this.K+this.K},function(){return this.J+this.K},function(){return this.F+this.J},function(){return this.G+
            this.J},function(){return this.H+this.J},function(){return this.D+this.J},function(){this.da=this.ga;return q(this)+this.J},function(a){return(a?(this.da=this.ga,this.L):this.ia())+this.J},function(){return this.K+this.J},function(){return this.J+this.J},function(){return this.F+(this.F<<1)},function(){return this.G+(this.F<<1)},function(){return this.H+(this.F<<1)},function(){return this.D+(this.F<<1)},function(){this.da=this.ga;return q(this)+(this.F<<1)},function(a){return(a?(this.da=this.ga,this.L):
            this.ia())+(this.F<<1)},function(){return this.K+(this.F<<1)},function(){return this.J+(this.F<<1)},function(){return this.F+(this.G<<1)},function(){return this.G+(this.G<<1)},function(){return this.H+(this.G<<1)},function(){return this.D+(this.G<<1)},function(){this.da=this.ga;return q(this)+(this.G<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.G<<1)},function(){return this.K+(this.G<<1)},function(){return this.J+(this.G<<1)},function(){return this.F+(this.H<<1)},function(){return this.G+
            (this.H<<1)},function(){return this.H+(this.H<<1)},function(){return this.D+(this.H<<1)},function(){this.da=this.ga;return q(this)+(this.H<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.H<<1)},function(){return this.K+(this.H<<1)},function(){return this.J+(this.H<<1)},function(){return this.F+(this.D<<1)},function(){return this.G+(this.D<<1)},function(){return this.H+(this.D<<1)},function(){return this.D+(this.D<<1)},function(){this.da=this.ga;return q(this)+(this.D<<1)},function(a){return(a?
            (this.da=this.ga,this.L):this.ia())+(this.D<<1)},function(){return this.K+(this.D<<1)},function(){return this.J+(this.D<<1)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<1)},function(){return this.G+(this.L<<1)},function(){return this.H+(this.L<<1)},function(){return this.D+
            (this.L<<1)},function(){this.da=this.ga;return q(this)+(this.L<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<1)},function(){return this.K+(this.L<<1)},function(){return this.J+(this.L<<1)},function(){return this.F+(this.K<<1)},function(){return this.G+(this.K<<1)},function(){return this.H+(this.K<<1)},function(){return this.D+(this.K<<1)},function(){this.da=this.ga;return q(this)+(this.K<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<1)},function(){return this.K+
            (this.K<<1)},function(){return this.J+(this.K<<1)},function(){return this.F+(this.J<<1)},function(){return this.G+(this.J<<1)},function(){return this.H+(this.J<<1)},function(){return this.D+(this.J<<1)},function(){this.da=this.ga;return q(this)+(this.J<<1)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<1)},function(){return this.K+(this.J<<1)},function(){return this.J+(this.J<<1)},function(){return this.F+(this.F<<2)},function(){return this.G+(this.F<<2)},function(){return this.H+
            (this.F<<2)},function(){return this.D+(this.F<<2)},function(){this.da=this.ga;return q(this)+(this.F<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.F<<2)},function(){return this.K+(this.F<<2)},function(){return this.J+(this.F<<2)},function(){return this.F+(this.G<<2)},function(){return this.G+(this.G<<2)},function(){return this.H+(this.G<<2)},function(){return this.D+(this.G<<2)},function(){this.da=this.ga;return q(this)+(this.G<<2)},function(a){return(a?(this.da=this.ga,this.L):
            this.ia())+(this.G<<2)},function(){return this.K+(this.G<<2)},function(){return this.J+(this.G<<2)},function(){return this.F+(this.H<<2)},function(){return this.G+(this.H<<2)},function(){return this.H+(this.H<<2)},function(){return this.D+(this.H<<2)},function(){this.da=this.ga;return q(this)+(this.H<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.H<<2)},function(){return this.K+(this.H<<2)},function(){return this.J+(this.H<<2)},function(){return this.F+(this.D<<2)},function(){return this.G+
            (this.D<<2)},function(){return this.H+(this.D<<2)},function(){return this.D+(this.D<<2)},function(){this.da=this.ga;return q(this)+(this.D<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.D<<2)},function(){return this.K+(this.D<<2)},function(){return this.J+(this.D<<2)},function(){return this.F},function(){return this.G},function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},
            function(){return this.J},function(){return this.F+(this.L<<2)},function(){return this.G+(this.L<<2)},function(){return this.H+(this.L<<2)},function(){return this.D+(this.L<<2)},function(){this.da=this.ga;return q(this)+(this.L<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<2)},function(){return this.K+(this.L<<2)},function(){return this.J+(this.L<<2)},function(){return this.F+(this.K<<2)},function(){return this.G+(this.K<<2)},function(){return this.H+(this.K<<2)},function(){return this.D+
            (this.K<<2)},function(){this.da=this.ga;return q(this)+(this.K<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<2)},function(){return this.K+(this.K<<2)},function(){return this.J+(this.K<<2)},function(){return this.F+(this.J<<2)},function(){return this.G+(this.J<<2)},function(){return this.H+(this.J<<2)},function(){return this.D+(this.J<<2)},function(){this.da=this.ga;return q(this)+(this.J<<2)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<2)},function(){return this.K+
            (this.J<<2)},function(){return this.J+(this.J<<2)},function(){return this.F+(this.F<<3)},function(){return this.G+(this.F<<3)},function(){return this.H+(this.F<<3)},function(){return this.D+(this.F<<3)},function(){this.da=this.ga;return q(this)+(this.F<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.F<<3)},function(){return this.K+(this.F<<3)},function(){return this.J+(this.F<<3)},function(){return this.F+(this.G<<3)},function(){return this.G+(this.G<<3)},function(){return this.H+
            (this.G<<3)},function(){return this.D+(this.G<<3)},function(){this.da=this.ga;return q(this)+(this.G<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.G<<3)},function(){return this.K+(this.G<<3)},function(){return this.J+(this.G<<3)},function(){return this.F+(this.H<<3)},function(){return this.G+(this.H<<3)},function(){return this.H+(this.H<<3)},function(){return this.D+(this.H<<3)},function(){this.da=this.ga;return q(this)+(this.H<<3)},function(a){return(a?(this.da=this.ga,this.L):
            this.ia())+(this.H<<3)},function(){return this.K+(this.H<<3)},function(){return this.J+(this.H<<3)},function(){return this.F+(this.D<<3)},function(){return this.G+(this.D<<3)},function(){return this.H+(this.D<<3)},function(){return this.D+(this.D<<3)},function(){this.da=this.ga;return q(this)+(this.D<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.D<<3)},function(){return this.K+(this.D<<3)},function(){return this.J+(this.D<<3)},function(){return this.F},function(){return this.G},
            function(){return this.H},function(){return this.D},function(){this.da=this.ga;return q(this)},function(a){return a?(this.da=this.ga,this.L):this.ia()},function(){return this.K},function(){return this.J},function(){return this.F+(this.L<<3)},function(){return this.G+(this.L<<3)},function(){return this.H+(this.L<<3)},function(){return this.D+(this.L<<3)},function(){this.da=this.ga;return q(this)+(this.L<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.L<<3)},function(){return this.K+
            (this.L<<3)},function(){return this.J+(this.L<<3)},function(){return this.F+(this.K<<3)},function(){return this.G+(this.K<<3)},function(){return this.H+(this.K<<3)},function(){return this.D+(this.K<<3)},function(){this.da=this.ga;return q(this)+(this.K<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.K<<3)},function(){return this.K+(this.K<<3)},function(){return this.J+(this.K<<3)},function(){return this.F+(this.J<<3)},function(){return this.G+(this.J<<3)},function(){return this.H+
            (this.J<<3)},function(){return this.D+(this.J<<3)},function(){this.da=this.ga;return q(this)+(this.J<<3)},function(a){return(a?(this.da=this.ga,this.L):this.ia())+(this.J<<3)},function(){return this.K+(this.J<<3)},function(){return this.J+(this.J<<3)}];
            function Xg(a){Ia.call(this,"ChipSet",a,Xg);this.ma=(this.ma=a.model)&&Yg[this.ma]||Zg;this.ac=0;var b=a.sw1;if(b)this.ac=$g(b,ah|bh.Zn);else{this.ge=[360,360];(b=a.floppies)&&b.length&&(this.ge=b);if(b=this.ge.length)this.ac|=ch.Pj,b--,this.ac|=(b&3)<<ch.ug;if(b=a.monitor||(this.ma<dh?"mono":"ega"),void 0!==eh[b])this.ac|=eh[b]<<bh.ug}this.Qe=$g(a.sw2||"11110000",0);this.Hp=this.ma==Zg?16:64;this.Th=this.Hg=1;this.ma>=dh&&(this.Th=this.Hg=2);this.ue=a.scaleTimers||!1;this.Br=a.rtcDate;this.Wm=!1;
            a.sound&&(this.hk=this.Lg=null,window&&(this.hk=window.AudioContext||window.webkitAudioContext),this.hk&&(this.Lg=new this.hk));this.reset(!0);Za(this)}Qa(Xg);var Zg=5150,dh=5170,Yg={5150:Zg,5160:5160,5170:dh,deskpro386:5180},eh={none:0,tv:1,color:2,mono:3,ega:0,vga:0},ch={Pj:1,ONE:0,Js:64,Hs:128,fs:192,tg:192,ug:6},ah=12,bh={Is:16,Xr:32,Zn:48,tg:48,ug:4};f=Xg.prototype;
            f.Lb=function(a,b,c){switch(b){case "sw1":return this.qa[b]=c,fh(this,b,c,this.ac,{0:this.ma==Zg?"Bootable Floppy Drive":"Loop on POST",1:this.ma==Zg?"Reserved":"Coprocessor",2:"Base Memory Size",4:"Monitor Type",6:"Number of Floppy Drives"}),!0;case "sw2":if(this.ma==Zg)return this.qa[b]=c,fh(this,b,c,this.Qe,{0:"Expansion Memory Size",4:"Reserved"}),!0;break;case "swdesc":return this.qa[b]=c,!0}return!1};
            f.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;this.za=a;this.Da=gb(a,"Keyboard");this.qj=c.R.Bd/1193181;Tb(b,this,gh);Vb(b,this,hh);this.ma<dh?(Tb(b,this,ih),Vb(b,this,jh)):(Tb(b,this,kh),Vb(b,this,lh))};f.gc=function(a,b){if(!b)if(!a)this.reset();else if(!this.restore(a))return!1;return!0};f.fc=function(a){return a&&this.save?this.save():!0};
            f.reset=function(a){var b;this.nd=this.ac;this.yf=this.Qe;mh(this);this.$a=Array(this.Th);for(b=0;b<this.Th;b++)nh(this,b);this.bc=Array(this.Hg);oh(this,0,32);1<this.Hg&&oh(this,1,160);this.Am=this.$j=null;this.Vb=Array(5180==this.ma?6:3);for(b=0;b<this.Vb.length;b++)ph(this,b);this.Gg=this.ak=this.Hc=this.Qh=null;this.Ph=0;if(this.ma>=dh){this.ab=16;this.Md=0;this.rd=16;this.Kh=0;this.Nd=160;512<=qh(this)&&(this.Nd|=16);3==rh(this)&&(this.Nd|=64);5180==this.ma&&(this.Nd|=12);this.Lh=3;this.Bb=Array(8);
            this.Jf=0;a&&(this.ea=Array(64));sh(this,this.Br);for(a=21;24>=a;a++)this.ea[a]=0;for(a=14;46>a;a++)void 0===this.ea[a]&&(this.ea[a]=0);this.ea[20]=this.nd&(bh.tg|2|ch.Pj|ch.tg);this.ea[16]=th(this,0)<<4|th(this,1);uh(this)}};
            function sh(a,b){var c=b?new Date(b):new Date;"[object Date]"!==Object.prototype.toString.call(c)||isNaN(c.getTime())?(c=new Date,a.pc("CMOS date invalid ("+b+"), using "+c)):b&&a.pc("CMOS date: "+c);a.ea[0]=c.getSeconds();a.ea[1]=0;a.ea[2]=c.getMinutes();a.ea[3]=0;a.ea[4]=c.getHours();a.ea[5]=0;a.ea[6]=c.getDay()+1;a.ea[7]=c.getDate();a.ea[8]=c.getMonth()+1;c=c.getFullYear();a.ea[9]=c%100;c/=100;a.ea[50]=c%10|c/10<<4;a.ea[10]=38;a.ea[11]=2;a.ea[12]=0;a.ea[13]=128;a.ih=a.eg=0;a.xn=a.oj=null}
            function vh(a){var b;void 0===b&&(b=a.oj);a.eg=Dc(a.U,a.ue)+b;a.ea[11]&64&&Ac(a.U,b)}function uh(a){for(var b=0,c=16;46>c;c++)b+=a.ea[c];a.ea[47]=b&255;a.ea[46]=b>>8}
            f.save=function(){var a=new Zd(this);a.set(0,[this.ac,this.Qe,this.nd,this.yf]);for(var b=[],c=0;c<this.$a;c++){for(var d=this.$a[c],e=d,m=[],n=0;n<e.Fb.length;n++){var p=e.Fb[n];m[n]=[p.Wd,p.Gh,p.cc,p.Wa,p.Ya,p.mode,p.Rh,p.wr,p.yr]}b[c]=[d.me,d.Yj,d.Bm,d.Hb,m]}a.set(1,[b]);b=[];for(c=0;c<this.bc.length;c++)d=this.bc[c],b[c]=[d.dh,d.dd,d.Zd,d.sd,d.Xb,d.Qc,d.Xe,d.Fg];a.set(2,[b]);b=[];for(c=0;c<this.Vb.length;c++)d=this.Vb[c],b[c]=[d.cc,d.Jc,d.Ya,d.ef,d.Dm,d.mode,d.Gj,d.qe,d.df,d.zd,d.Sg,d.kf,d.Yd];
            a.set(3,[this.$j,b,this.Am]);a.set(4,[this.Qh,this.Hc,this.ak,this.Gg,this.Ph]);this.ma>=dh&&(a.set(5,[this.ab,this.Md,this.rd,this.Kh,this.Nd,this.Lh]),a.set(6,[this.Bb[7],this.Bb,this.Jf,this.ea,this.ih,this.eg]));return a.data()};
            f.restore=function(a){var b,c;b=a[0];this.ac=b[0];this.Qe=b[1];this.nd=b[2];this.yf=b[3];b=a[1];for(c=0;c<this.Th;c++)nh(this,c,1==b.length?b[0][c]:b);b=a[2];for(c=0;c<this.Hg;c++)oh(this,c,0===c?32:160,b[0][c]);b=a[3];this.$j=b[0];this.Am=b[2];for(c=0;c<this.Vb.length;c++)ph(this,c,b[1][c]);b=a[4];this.Qh=b[0];this.Hc=b[1];this.ak=b[2];this.Gg=b[3];this.Ph=b[4];if(b=a[5])this.ab=b[0],this.Md=b[1],this.rd=b[2],this.Kh=b[3],this.Nd=b[4],this.Lh=b[5];if(b=a[6])this.Bb=b[1],this.Bb[7]=b[0],this.Jf=b[2],
            this.ea=b[3],this.ih=b[4],this.eg=b[5],sh(this);return!0};var wh=[0,null,null,0,Array(4)];function nh(a,b,c){var d=a.$a[b];d||(d={Fb:Array(4)});c=c&&5==c.length?c:wh;d.me=c[0];d.Yj=c[1];d.Bm=c[2];d.Hb=c[3];d.Rp=b<<2;for(var e=0;e<d.Fb.length;e++)xh(d,e,c[4][e]);a.$a[b]=d}var Ch=[!0,[0,0],[0,0],[0,0],[0,0]];
            function xh(a,b,c){var d=a.Fb[b];d||(d={Gh:[0,0],cc:[0,0],Wa:[0,0],Ya:[0,0]});c=c&&8==c.length?c:Ch;d.Wd=c[0];d.Gh[0]=c[1][0];d.Gh[1]=c[1][1];d.cc[0]=c[2][0];d.cc[1]=c[2][1];d.Wa[0]=c[3][0];d.Wa[1]=c[3][1];d.Ya[0]=c[4][0];d.Ya[1]=c[4][1];d.mode=c[5];d.Rh=c[6];d.W=a;d.fn=b;Dh(d,c[8],c[9]);a.Fb[b]=d}function Dh(a,b,c,d){"string"==typeof b&&(b=Sa(b));b&&(a.ai=null,a.wr=b.id,a.yr=c,a.Zh=b,a.zk=b[c],a.rj=d)}var Eh=[0,Array(4)];
            function oh(a,b,c,d){var e=a.bc[b];e||(e={dd:[null,null,null,null]});d=d&&8==d.length?d:Eh;e.port=c;e.pt=b<<3;e.dh=d[0];e.dd[0]=d[1][0];e.dd[1]=d[1][1];e.dd[2]=d[1][2];e.dd[3]=d[1][3];e.Zd=d[2];e.sd=d[3];e.Xb=d[4];e.Qc=d[5];e.Xe=d[6];e.Fg=d[7];a.bc[b]=e}var Fh=[[0,0],[0,0],[0,0],[0,0]];
            function ph(a,b,c){var d=a.Vb[b];d||(d={cc:[0,0],Jc:[0,0],Ya:[0,0],ef:[0,0]});c=c&&13==c.length?c:Fh;d.cc[0]=c[0][0];d.cc[1]=c[0][1];d.Jc[0]=c[1][0];d.Jc[1]=c[1][1];d.Ya[0]=c[2][0];d.Ya[1]=c[2][1];d.ef[0]=c[3][0];d.ef[1]=c[3][1];d.Dm=c[4];d.mode=c[5];d.Gj=c[6];d.qe=c[7];d.df=c[8];d.zd=c[9];d.Sg=c[10];d.kf=c[11];d.Yd=c[12];a.Vb[b]=d}function qh(a,b){return((((b?a.ac:a.nd)&12)>>2)+1)*a.Hp+32*((b?a.Qe:a.yf)&15)}function Gh(a,b){var c=b?a.ac:a.nd;return a.ma!=Zg||c&ch.Pj?((c&ch.tg)>>ch.ug)+1:0}
            function th(a,b){if(b<Gh(a)){if(!a.ge)return 1;if(b<a.ge.length)switch(a.ge[b]){case 160:case 180:case 320:case 360:return 1;case 720:return 3;case 1200:return 2;case 1440:return 4}}return 0}function rh(a,b){return((b?a.ac:a.nd)&bh.tg)>>bh.ug}
            function fh(a,b,c,d,e){for(var m="",n=1;8>=n;n++){var p="pcjs-bitCell";n||(p+=" pcjs-bitCellLeft");m+='<div id="'+(b+"-"+n)+'" class="'+p+'" data-value="0">'+n+"</div>\n"}c.innerHTML=m;b=Xa(c,"pcjs-bitCell");c=null;for(n=0;n<b.length;n++)null!=e&&null!=e[n]&&(c=e[n]),c&&b[n].setAttribute("title",c),Hh(b[n],d&1<<n?!1:!0),b[n].onclick=function(a,b){return function(){var c="1"!=b.getAttribute("data-value");Hh(b,c);var d=b.getAttribute("id").split("-"),e=1<<+d[1]-1;switch(d[0]){case "sw1":a.ac=a.ac&~e|
            (c?0:e);break;case "sw2":a.Qe=a.Qe&~e|(c?0:e)}mh(a)}}(a,b[n])}function Hh(a,b){a.setAttribute("data-value",b?"1":"0");a.style.color=b?"#ffffff":"#000000";a.style.backgroundColor=b?"#000000":"#ffffff"}function mh(a){var b=a.qa.swdesc,c={0:"Enhanced Color",1:"TV",2:"Color",3:"Monochrome"};if(null!=b){var d;d=""+(qh(a,!0)+"Kb");d+=", "+c[rh(a,!0)]+" Monitor";d+=", "+Gh(a,!0)+" Floppy Drives";if(null!=a.nd&&a.nd!=a.ac||null!=a.yf&&a.yf!=a.Qe)d+=" (Reset required)";b.textContent=d}}
            function Ih(a,b,c){a=a.$a[b];var d=a.Fb[c],e=d.Wa[a.Hb];a.Hb^=1;b||0!=c||a.Hb||(d.Wa[0]++,255<d.Wa[0]&&(d.Wa[0]=0,d.Wa[1]++,255<d.Wa[1]&&(d.Wa[1]=0)));return e}function Jh(a,b,c,d){a=a.$a[b];c=a.Fb[c];c.Wa[a.Hb]=c.Gh[a.Hb]=d;a.Hb^=1}function Kh(a,b,c){a=a.$a[b];var d=a.Fb[c],e=d.Ya[a.Hb];a.Hb^=1;b||0!=c||a.Hb||(d.Ya[0]--,0>d.Ya[0]&&(d.Ya[0]=255,d.Ya[1]--,0>d.Ya[1]&&(d.Ya[1]=255)));return e}function Lh(a,b,c,d){a=a.$a[b];c=a.Fb[c];c.Ya[a.Hb]=c.cc[a.Hb]=d;a.Hb^=1}
            function Mh(a,b){var c=a.$a[b],d=c.me|1;c.me&=-16;return d}function Nh(a,b,c){a=a.$a[b];b=c&3;a.me=a.me&~(16<<b)|(c&4)<<b+2;a.Bm=c}function Oh(a,b,c){b=a.$a[b];var d=c&3,e=b.Fb[d];e.Wd=!!(c&4);e.Wd||Ph(a,b.Rp+d)}function Qh(a,b){for(var c=a.$a[b],d=0;d<c.Fb.length;d++)xh(c,d)}function Rh(a,b,c){return a.$a[b].Fb[c].Rh}function Sh(a,b,c,d){a.$a[b].Fb[c].Rh=d}function Th(a,b,c,d,e){Dh(a.$a[b>>2].Fb[b&3],c,d,e)}
            function Ph(a,b,c){b=a.$a[b>>2].Fb[b&3];b.Zh&&b.zk&&b.rj?(c&&(b.ai=c),b.Wd||Fe(a,b,!0)):c&&c(!0)}function Fe(a,b,c){c&&(b.count=b.Ya[1]<<8|b.Ya[0],b.type=b.mode&12,b.Zm=b.yd=!1);for(var d=!1;0<=b.count&&(c=b.Rh<<16|b.Wa[1]<<8|b.Wa[0],4==b.type?(d=!0,function(c){b.zk.call(b.Zh,b.rj,-1,function(m,n){0>m&&(b.Zm||(b.Zm=!0),m=255);b.Wd||a.la.Oe(c,m);(d=n)&&setTimeout(function(){Uh(b)||Fe(a,b)},0)})}(c)):8==b.type?(c=a.la.wc(c),0>b.zk.call(b.Zh,b.rj,c)&&(b.yd=!0)):0!=b.type&&(b.yd=!0)),!d&&!Uh(b););}
            function Uh(a){if(!a.yd&&0<=--a.count&&(a.mode&32?(a.Wa[0]--,0>a.Wa[0]&&(a.Wa[0]=255,a.Wa[1]--,0>a.Wa[1]&&(a.Wa[1]=255))):(a.Wa[0]++,255<a.Wa[0]&&(a.Wa[0]=0,a.Wa[1]++,255<a.Wa[1]&&(a.Wa[1]=0))),!a.Wd))return!1;var b=a.W;b.me=b.me&~(16<<a.fn)|1<<a.fn;a.mode&16||(a.Wd=!0,a.Zh=a.rj=null);a.ai&&(a.ai(!a.yd),a.ai=null);return!0}function Vh(a,b){var c=0,d=a.bc[b];if(null!=d.Fg)switch(d.Fg&3){case 2:c=d.Xb;break;case 3:c=d.Qc}return c}
            function Wh(a,b,c){var d=a.bc[b];if(c&16)d.Zd=0,d.dd[d.Zd++]=c,d.sd=0,d.Xe=7,d.Xb=d.Qc=0,d.Fg=10;else if(c&8)c&100&&a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW3 command: "+ea(c)),d.Fg=c;else{var e=c&224;if(e&32){var m,n=0;if(96==(e&96))n=1<<(c&7);else for(m=d.Xe+1;;){m&=7;var p=1<<m;if(d.Qc&p){n=p;break}if(m++==d.Xe)break}d.Qc&n&&(d.Qc&=~n,Xh(a));e&128&&a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW2 rotate command: "+ea(c))}else 192==e?d.Xe=c&7:a.wa("PIC"+b+"("+ea(d.port)+"): unsupported OCW2 automatic EOI command: "+
            ea(c))}}function Yh(a,b,c){var d=a.bc[b];d.Zd<d.dd.length?(d.dd[d.Zd++]=c,2==d.Zd&&d.dd[0]&2&&d.Zd++,3!=d.Zd||d.dd[0]&1||d.Zd++):(d.sd=c,d=a.U,d.Q|=4,Xh(a,b||253!=c?0:6))}function Zh(a,b,c){var d=a.bc[b>>3];b=1<<(b&7);d.Xb&b||(d.Xb|=b,d.dh=c||0,Xh(a))}function $h(a,b){var c=a.bc[b>>3],d=1<<(b&7);c.Xb&d&&(c.Xb&=~d,Xh(a))}
            function Xh(a,b){var c,d=-1;1<a.Hg&&(c=a.bc[1],d=~(c.Qc|c.sd)&c.Xb);c=a.bc[0];0<=d&&(c.Xb=d?c.Xb|4:c.Xb&-5);var d=~(c.Qc|c.sd)&c.Xb,e=a.U;e.fa&&(e.lb=d?e.lb|1:e.lb&-2);d&&b&&(c.dh=b)}function De(a,b){void 0===b&&(b=0);var c=-1,d=a.bc[b];if(d.dh)c=-2,d.dh--;else for(var e=d.Xb&((d.Qc|d.sd)^255),m=d.Xe+1;;){var m=m&7,n=1<<m;if(e&n){c=b||2!=m?d.dd[1]+m:De(a,1);0<=c&&(d.Qc|=n,d.Xb&=~n);break}if(m++==d.Xe)break}return c}
            function ai(a,b){var c=a.Vb[b];c.qe==c.df&&bi(a,b);if(c.Sg)return c.ef[c.qe++];ci(a,b);return c.Ya[c.qe++]}function di(a,b,c){var d=a.Vb[b];d.qe==d.df&&bi(a,b);d.cc[d.qe++]=c;d.qe==d.df&&(d.kf&&0!=d.mode&&8!=d.mode||(d.Sg=!1,d.Ya[0]=d.Jc[0]=d.cc[0],d.Ya[1]=d.Jc[1]=d.cc[1],d.Yd=Dc(a.U,a.ue),d.kf=!0,d.zd=0!=d.mode,0==b&&($h(a,0),c=ei(a,0)*a.qj|0,6==d.mode&&(c>>=1),Ac(a.U,c))),2==b&&Ec(a))}f=Xg.prototype;f.qp=function(){return null};
            f.Rq=function(a,b){this.$j=b;var c=(b&192)>>6;if(3!=c){var d=b&1,e=b&14,m=b&48;if(m){var n=this.Vb[c];n.Gj=m;n.mode=e;n.Dm=d;n.cc=[0,0];n.Ya=[0,0];n.ef=[0,0];n.zd=!1;n.Sg=!1;n.kf=!1;bi(this,c);0==c&&$h(this,0);2==c&&255==this.bc[0].sd&&77==this.Hc&&(c=this.Vb[0],c.Jc[0]=c.cc[0],c.Jc[1]=c.cc[1],c.Yd=Dc(this.U,this.ue))}else ci(this,c),d=this.Vb[c],d.ef[0]=d.Ya[0],d.ef[1]=d.Ya[1],d.Sg=!0,bi(this,c)}};function ei(a,b){var c=a.Vb[b],d=c.cc[1]<<8|c.cc[0];d||(d=1==c.df?256:65536);return d}
            function Gc(a,b){var c=a.Vb[b],d=c.Jc[1]<<8|c.Jc[0];d||(d=1==c.df?256:65536);return d}function bi(a,b){var c=a.Vb[b];c.qe=32==c.Gj?1:0;c.df=48==c.Gj?2:1}
            function ci(a,b,c){var d=a.Vb[b];if(d.kf&&(2!=b||a.Hc&1)){var e=Dc(a.U,a.ue),m=(e-d.Yd)/a.qj|0;0>m&&(d.Yd=e,m=0);var n=ei(a,b),p=Gc(a,b)-m;0==d.mode?(0>=p&&(p=0),p||(d.zd=!0,d.kf=!1,b||Zh(a,0))):4==d.mode?(d.zd=1!=p,0>=p&&(p=n+p,0>=p&&(p=n),d.Jc[0]=p&255,d.Jc[1]=p>>8,d.Yd=e,!b&&d.zd&&Zh(a,0))):6==d.mode&&(p-=m,0>=p&&(d.zd=!d.zd,p=n+p,0>=p&&(p=n),d.Jc[0]=p&255,d.Jc[1]=p>>8,d.Yd=e,!b&&d.zd&&Zh(a,0)));d.Ya[0]=p&255;d.Ya[1]=p>>8;c&&(a.Yd=0)}return d}
            function Fc(a,b){for(var c=0;c<a.Vb.length;c++)ci(a,c,b);if(a.ma>=dh){var c=a.U.R.Bd,d=Dc(a.U,a.ue);null==a.oj&&(a.ih=Dc(a.U,a.ue),a.xn=1024,a.oj=Math.floor(a.U.R.Bd/a.xn),vh(a));d>=a.eg&&(a.ea[12]|=64,a.ea[11]&64&&(a.ea[12]|=128,Zh(a,8)),a.eg=d+a.oj);a.ea[0]==a.ea[1]&&a.ea[2]==a.ea[3]&&a.ea[4]==a.ea[5]&&(a.ea[12]|=32,a.ea[11]&32&&(a.ea[12]|=128,Zh(a,8)));var e=d-a.ih,m=Math.floor(e/c);if(m&&!(a.ea[11]&128)){for(;m--;)if(60<=++a.ea[0]&&(a.ea[0]=0,60<=++a.ea[2]&&(a.ea[2]=0,24<=++a.ea[4]))){a.ea[4]=
            0;a.ea[6]=a.ea[6]%7+1;var n;n=a.ea[9];var p=ma[a.ea[8]-1];28==p&&0===n%4&&(n%100||0===n%400)&&p++;n=p;++a.ea[7]>n&&(a.ea[7]=1,12<++a.ea[8]&&(a.ea[8]=1,a.ea[9]=(a.ea[9]+1)%100))}a.ea[12]|=16;a.ea[11]&16&&(a.ea[12]|=128,Zh(a,8))}a.ih=d-e%c}}f.rp=function(){var a=this.Qh;if(this.Gg&16)if(this.Hc&128)a=this.nd;else if(this.Da){var a=this.Da,b=0;a.Wb.length&&(b=a.Wb[0]);a=b}return a};f.Sq=function(a,b){this.Qh=b};f.sp=function(){return this.Hc};
            f.Tq=function(a,b){fi(this,b);this.Da&&gi(this.Da,b&128?!1:!0,b&64?!0:!1)};function fi(a,b){var c=!!(b&2),d=!!(a.Hc&2);a.Hc=b;c!=d&&Ec(a,c)}f.tp=function(){var a=0,a=this.ma==Zg?this.Hc&4?a|this.yf&15:a|this.yf>>4&1:this.Hc&8?a|this.nd>>4:a|this.nd&15;this.Hc&1&&ci(this,2).zd&&(a=this.Hc&2?a|32:a|16);return a};f.Uq=function(a,b){this.ak=b};f.up=function(){return this.Gg};f.Vq=function(a,b){this.Gg=b};f.Ho=function(){var a=this.Kh;this.ab&=-258;this.Da&&hi(this.Da);return a};
            f.fq=function(a,b){if(this.ab&8)switch(this.Md){case 96:ii(this,b);break;case 209:ji(this,b);break;default:if(ii(this,this.rd&-17),this.Da){var c=-1;switch(b){case 255:c=250,ki(this.Da)}li(this,c)}}this.Md=b;this.ab&=-9};f.Io=function(){return this.Hc&-209|(Dc(this.U)&64?16:0)};f.gq=function(a,b){fi(this,b)};f.Jo=function(){var a=this.ab&255;this.ab&256&&(this.ab|=1,this.ab&=-257);return a};
            f.eq=function(a,b){this.Md=b;this.ab|=8;var c=0;240<=this.Md&&(c=this.Md^15,this.Md=240);switch(this.Md){case 32:li(this,this.rd);break;case 173:ii(this,this.rd|16);break;case 174:ii(this,this.rd&-17);this.Da&&hi(this.Da);break;case 170:this.Da&&(this.Da.Wb=[]);ii(this,this.rd|16);li(this,85);ji(this,3);break;case 171:li(this,0);break;case 192:li(this,this.Nd);break;case 208:li(this,this.Lh);break;case 224:li(this,this.rd&16?0:1);break;case 240:c&1&&Ed(this.U)}};
            function ii(a,b){a.rd=b;a.ab=a.ab&-5|b&4;a.Da&&gi(a.Da,!!(b&8),!(b&16))}function li(a,b,c){0<=b&&(a.Kh=b,c?a.ab|=1:(a.ab&=-2,a.ab|=256))}function ji(a,b){a.Lh=b;Ib(a.la,!!(b&2));b&1||Ed(a.U)}function mi(a,b){a.ma<dh?Zh(a,1,4):a.rd&16||a.ab&257||(li(a,b,!0),ni(a.Da),Zh(a,1,120))}f.Xo=function(){return this.Jf};f.uq=function(a,b){this.Jf=b;this.Ph=b&128?0:128};
            f.Yo=function(a,b){var c=this.Jf&63,d;if(13>=c)if(d=this.ea[c],10>c){var e=!1;4!=c&&5!=c||this.ea[11]&2||(d=12>d?d?d:12:(d-=12)?d+128:140,e=!0);this.ea[11]&4||(e&&128<d&&(d-=48),d=d%10|d/10<<4)}else 10==c&&(this.ea[c]^=128);else d=this.ea[c];null!=b&&12==c&&(this.ea[c]&=15,d&128&&$h(this,8),d&64&&this.ea[11]&64&&vh(this));return d};
            f.vq=function(a,b){var c=this.Jf&63,d=b^this.ea[c],e;if(13>=c){if(e=b,10>c){var m=!1;this.ea[11]&4||(e=10*(e>>4)+(e&15),m=!0);if(4==c||5==c)m&&23<e&&(e+=48),this.ea[11]&2||(12>=e?e=12==e?0:e:(e-=116,e=24==e?12:e))}}else e=b;this.ea[c]=e;11==c&&d&64&&b&64&&vh(this)};f.Qq=function(a,b){this.Ph=b};f.wq=function(){};f.xq=function(){};function $g(a,b){if(void 0===a)return b;for(var c=0,d=1,e=0;e<a.length;e++)"0"==a.charAt(e)&&(c|=d),d<<=1;return c}
            function Ec(a,b){if(a.Lg)try{void 0!==b?a.Wm=b:b=a.Wm&&a.U&&a.U.ha.Qb;var c=Math.round(1193181/ei(a,2));if(20>c||2E4<c)b=!1;b?a.jc?a.jc.frequency.value=c:(a.jc=a.Lg.createOscillator(),a.jc&&(a.jc.type="number"==typeof a.jc.type?1:"square",a.jc.connect(a.Lg.destination),a.jc.frequency.value=c,"start"in a.jc?a.jc.start(0):a.jc.noteOn(0))):a.jc&&("stop"in a.jc?a.jc.stop(0):a.jc.noteOff(0),a.jc.disconnect(),delete a.jc)}catch(d){a.wa("AudioContext exception: "+d.message),a.Lg=null}else b&&a.oc("BEEP",
            8388608)}
            var gh={0:function(){return Ih(this,0,0)},1:function(){return Kh(this,0,0)},2:function(){return Ih(this,0,1)},3:function(){return Kh(this,0,1)},4:function(){return Ih(this,0,2)},5:function(){return Kh(this,0,2)},6:function(){return Ih(this,0,3)},7:function(){return Kh(this,0,3)},8:function(){return Mh(this,0)},32:function(){return Vh(this,0)},33:function(){return this.bc[0].sd},64:function(){return ai(this,0)},65:function(){return ai(this,1)},66:function(){return ai(this,2)},67:Xg.prototype.qp,129:function(){return Rh(this,
            0,2)},130:function(){return Rh(this,0,3)},131:function(){return Rh(this,0,1)},135:function(){return Rh(this,0,0)}},ih={96:Xg.prototype.rp,97:Xg.prototype.sp,98:Xg.prototype.tp,99:Xg.prototype.up},kh={96:Xg.prototype.Ho,97:Xg.prototype.Io,100:Xg.prototype.Jo,112:Xg.prototype.Xo,113:Xg.prototype.Yo,128:function(){return this.Bb[7]},132:function(){return this.Bb[0]},133:function(){return this.Bb[1]},134:function(){return this.Bb[2]},136:function(){return this.Bb[3]},137:function(){return Rh(this,1,2)},
            138:function(){return Rh(this,1,3)},139:function(){return Rh(this,1,1)},140:function(){return this.Bb[4]},141:function(){return this.Bb[5]},142:function(){return this.Bb[6]},143:function(){return Rh(this,1,0)},160:function(){return Vh(this,1)},161:function(){return this.bc[1].sd},192:function(){return Ih(this,1,0)},194:function(){return Kh(this,1,0)},196:function(){return Ih(this,1,1)},198:function(){return Kh(this,1,1)},200:function(){return Ih(this,1,2)},202:function(){return Kh(this,1,2)},204:function(){return Ih(this,
            1,3)},206:function(){return Kh(this,1,3)},208:function(){return Mh(this,1)}},hh={0:function(a,b){Jh(this,0,0,b)},1:function(a,b){Lh(this,0,0,b)},2:function(a,b){Jh(this,0,1,b)},3:function(a,b){Lh(this,0,1,b)},4:function(a,b){Jh(this,0,2,b)},5:function(a,b){Lh(this,0,2,b)},6:function(a,b){Jh(this,0,3,b)},7:function(a,b){Lh(this,0,3,b)},8:function(a,b){this.$a[0].Yj=b},9:function(a,b){Nh(this,0,b)},10:function(a,b){Oh(this,0,b)},11:function(a,b){this.$a[0].Fb[b&3].mode=b},12:function(){this.$a[0].Hb=
            0},13:function(){Qh(this,0)},32:function(a,b){Wh(this,0,b)},33:function(a,b){Yh(this,0,b)},64:function(a,b){di(this,0,b)},65:function(a,b){di(this,1,b)},66:function(a,b){di(this,2,b)},67:Xg.prototype.Rq,129:function(a,b){Sh(this,0,2,b)},130:function(a,b){Sh(this,0,3,b)},131:function(a,b){Sh(this,0,1,b)},135:function(a,b){Sh(this,0,0,b)}},jh={96:Xg.prototype.Sq,97:Xg.prototype.Tq,98:Xg.prototype.Uq,99:Xg.prototype.Vq,160:Xg.prototype.Qq},lh={96:Xg.prototype.fq,97:Xg.prototype.gq,100:Xg.prototype.eq,
            112:Xg.prototype.uq,113:Xg.prototype.vq,128:function(a,b){this.Bb[7]=b},132:function(a,b){this.Bb[0]=b},133:function(a,b){this.Bb[1]=b},134:function(a,b){this.Bb[2]=b},136:function(a,b){this.Bb[3]=b},137:function(a,b){Sh(this,1,2,b)},138:function(a,b){Sh(this,1,3,b)},139:function(a,b){Sh(this,1,1,b)},140:function(a,b){this.Bb[4]=b},141:function(a,b){this.Bb[5]=b},142:function(a,b){this.Bb[6]=b},143:function(a,b){Sh(this,1,0,b)},160:function(a,b){Wh(this,1,b)},161:function(a,b){Yh(this,1,b)},192:function(a,
            b){Jh(this,1,0,b)},194:function(a,b){Lh(this,1,0,b)},196:function(a,b){Jh(this,1,1,b)},198:function(a,b){Lh(this,1,1,b)},200:function(a,b){Jh(this,1,2,b)},202:function(a,b){Lh(this,1,2,b)},204:function(a,b){Jh(this,1,3,b)},206:function(a,b){Lh(this,1,3,b)},208:function(a,b){this.$a[1].Yj=b},210:function(a,b){Nh(this,1,b)},212:function(a,b){Oh(this,1,b)},214:function(a,b){this.$a[1].Fb[b&3].mode=b},216:function(){this.$a[1].Hb=0},218:function(){Qh(this,1)},240:Xg.prototype.wq,241:Xg.prototype.xq};
            Ea(function(){for(var a=Xa(window.document,"pcjs","chipset"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Xg(d);Wa(d,c);mh(d)}});
            function oi(a){Ia.call(this,"ROM",a,oi);this.Gb=null;this.Wj=a.addr;this.pg=a.size;this.Cg=a.alias;this.vh=a.file;this.xr=fa(this.vh);this.xe=a.notify;this.om=null;if(this.xe&&(a=this.xe.indexOf("["),0<a)){try{this.om=eval(this.xe.substr(a))}catch(b){}this.xe=this.xe.substr(0,a)}if(this.vh){a=this.vh;var c=ha(this.xr);"json"!=c&&"hex"!=c&&(a=qa()+"/api/v1/dump?file="+this.vh+"&format=bytes&decimal=true");pa(a,!0,null,this,oi.prototype.aq)}}Qa(oi);
            oi.prototype.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;pi(this)};oi.prototype.gc=function(){this.Vj&&(this.Ra&&this.Ra.Ss(this.Wj,this.pg,this.Vj),delete this.Vj);return!0};oi.prototype.fc=function(){return!0};
            oi.prototype.aq=function(a,b,c){if(c)this.wa("Unable to load system ROM (error "+c+")");else{if("["==b.charAt(0)||"{"==b.charAt(0))try{var d=eval("("+b+")"),e=d.bytes,m=d.data;if(e)this.Gb=e;else if(m)for(this.Gb=Array(4*m.length),c=b=0;b<m.length;b++)this.Gb[c++]=m[b]&255,this.Gb[c++]=m[b]>>8&255,this.Gb[c++]=m[b]>>16&255,this.Gb[c++]=m[b]>>24&255;else this.Gb=d;this.Vj=d.symbols;if(!this.Gb.length){ra("Empty ROM: "+a);return}if(1==this.Gb.length){ra(this.Gb[0]);return}}catch(n){this.wa("ROM data error: "+
            n.message);return}else for(a=b.replace(/\n/gm," ").replace(/ +$/,"").split(" "),this.Gb=Array(a.length),d=0;d<a.length;d++)this.Gb[d]=ca(a[d],16);pi(this)}};
            function pi(a){if(!$a(a))if(!a.vh)Za(a);else if(a.Gb&&a.la){if(a.Gb.length!=a.pg)ab(a,"ROM size (0x"+da(a.Gb.length)+") does not match specified size ("+("0x"+da(a.pg))+")");else{var b;b=a.Wj;if(Jb(a.la,b,a.pg,bc)){for(var c=0;c<a.Gb.length;c++){var d=a.la,e=b+c;d.ka[(e&d.xb)>>>d.Aa].fm(e&d.Ea,a.Gb[c]&255,e)}b=!0}else b=!1;if(b){b=[];"number"==typeof a.Cg?b.push(a.Cg):null!=a.Cg&&a.Cg.length&&(b=a.Cg);for(c=0;c<b.length;c++){var d=a,e=b[c],m=Mb(d.la,d.Wj,d.pg);Lb(d.la,e,d.pg,m)}a.xe&&((b=Sa(a.xe,
            a.id))?(c=a.Gb,d=a.om,5==b.qb?qi(b,c,d||[12640,8752],8):7==b.qb&&qi(b,c,d||[14221,16269],8),Za(b)):a.wa("Unable to find component: "+a.xe));delete a.Gb}}Za(a)}}Ea(function(){for(var a=Xa(window.document,"pcjs","rom"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new oi(d);Wa(d,c)}});function ri(a){Ia.call(this,"RAM",a,ri);this.Hh=a.addr;this.be=a.size;this.Bo=a.test;this.xo=!!this.be;this.ci=!1}Qa(ri);ri.prototype.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;this.fa=gb(a,"ChipSet");Za(this)};
            ri.prototype.gc=function(a,b){b||this.reset();return!0};ri.prototype.fc=function(){return!0};
            ri.prototype.reset=function(){if(!this.Hh&&!this.xo&&this.fa){var a=1024*qh(this.fa);this.be&&a!=this.be&&(Nb(this.la,this.Hh,this.be),this.ci=!1);this.be=a}!this.ci&&this.be&&Jb(this.la,this.Hh,this.be,1)&&(this.ci=!0,this.status(Math.floor(this.be/1024)+"Kb allocated"),"ramCPQ"==this.Vg&&(this.W=new si(this),Jb(this.la,ti,1,4,this.W)));if(this.ci){if(this.Bo||Pb(this.la,1138,4660),"ramCPQ"!=this.Vg&&this.fa&&(a=this.fa,a.ea)){var b=1048576>this.Hh?21:23,c=a.ea[b]|a.ea[b+1]<<8,c=c+(this.be>>10);
            a.ea[b]=c&255;a.ea[b+1]=c>>8;uh(a)}}else ra("No RAM allocated")};function si(a){this.er=a;this.em=ui;this.Tn=vi;this.Nj=wi;this.wg=null}
            var ti=-2134900736,ui=65535,vi=2575,wi=2,xi=[null,0],yi=[function(a){var b=255;2>a?b=a&1?this.W.Tn>>8:this.W.Tn&255:4>a&&(b=a&1?this.W.Nj>>8:this.W.Nj&255);return b},null,null,function(a,b){var c=this.W;if(a)2==a&&(c.Nj=c.Nj&-256|b);else if(b!=(c.em&255)){var d=c.er.la;if(b&1)c.wg&&(Lb(d,917504,131072,c.wg),c.wg=null);else{c.wg||(c.wg=Mb(d,917504,131072));var e=Mb(d,16646144,131072);Lb(d,917504,131072,e,b&2?1:bc)}c.em=c.em&-256|b}},null,null];si.prototype.cn=function(){return xi};
            si.prototype.Ak=function(){return yi};Ea(function(){for(var a=Xa(window.document,"pcjs","ram"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new ri(d);Wa(d,c)}});function zi(a){Ia.call(this,"Keyboard",a,zi);this.Um=ya("Mobi");this.yo=ya("MSIE");this.oc("mobile keyboard support: "+(this.Um?"true":"false"));this.Gm=0;this.hi=!0;this.xk=this.tk=!1;this.Mb=[];this.Op=500;this.Pp=100;this.Np=50;this.Om=!1;Za(this)}Qa(zi);
            var V={Yr:1,Zr:3,$r:26," ":32,"!":33,'"':34,"#":35,$:36,"%":37,"&":38,"'":39,"(":40,")":41,"*":42,"+":43,",":44,"-":45,".":46,"/":47,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,":":58,";":59,"<":60,"=":61,">":62,"?":63,"@":64,Vr:65,Wr:66,jm:67,Xn:68,E:69,ds:70,gs:71,km:72,js:73,ks:74,ls:75,ms:76,ns:77,Qj:78,ps:79,qs:80,ss:81,mm:82,ws:83,Gs:84,Ks:85,Ls:86,Ms:87,Os:88,Ps:89,Qs:90,"[":91,"\\":92,"]":93,"^":94,_:95,"`":96,Rs:97,Ts:98,Ws:99,ct:100,dt:101,et:102,gt:103,ht:104,jt:105,kt:106,lt:107,
            mt:108,nt:109,ot:110,qt:111,rt:112,st:113,tt:114,ut:115,vt:116,wt:117,xt:118,yt:119,x:120,y:121,z:122,"{":123,"|":124,"}":125,"~":126},Ai={};Ai[186]=V[";"];Ai[187]=V["="];Ai[188]=V[","];Ai[189]=V["-"];Ai[190]=V["."];Ai[191]=V["/"];Ai[192]=V["`"];Ai[219]=V["["];Ai[220]=V["\\"];Ai[221]=V["]"];Ai[222]=V["'"];Ai[173]=V["-"];var Bi={};Bi[V["1"]]=V["!"];Bi[V["2"]]=V["@"];Bi[V["3"]]=V["#"];Bi[V["4"]]=V.$;Bi[V["5"]]=V["%"];Bi[V["6"]]=V["^"];Bi[V["7"]]=V["&"];Bi[V["8"]]=V["*"];Bi[V["9"]]=V["("];
            Bi[V["0"]]=V[")"];Bi[186]=V[":"];Bi[187]=V["+"];Bi[188]=V["<"];Bi[189]=V._;Bi[190]=V[">"];Bi[191]=V["?"];Bi[192]=V["~"];Bi[219]=V["{"];Bi[220]=V["|"];Bi[221]=V["}"];Bi[222]=V['"'];Bi[173]=V._;Bi[61]=V["+"];Bi[59]=V[":"];
            var Ci={3016:1,1016:2,1017:8,1018:32,1091:128,1093:64,1224:128,1020:512,1144:1024,1145:2048},Di={TAB:1009,ESC:1027,F1:1112,F2:1113,F3:1114,F4:1115,F5:1116,F6:1117,F7:1118,F8:1119,F9:1120,F10:1121,LEFT:1037,UP:1038,RIGHT:1039,DOWN:1040,CTRL_C:4003,CTRL_BREAK:4008,CTRL_ALT_DEL:4046},Ei={esc:1027,1:V["1"],2:V["2"],3:V["3"],4:V["4"],5:V["5"],6:V["6"],7:V["7"],8:V["8"],9:V["9"],0:V["0"],"-":V["-"],"=":V["="],bs:1008,tab:1009,q:81,w:87,e:69,r:82,t:84,y:89,u:85,i:73,o:79,p:80,"[":V["["],"]":V["]"],enter:13,
            ctrl:1017,a:65,s:83,d:68,f:70,g:71,h:72,j:74,k:75,l:76,";":V[";"],quote:V["'"],"`":V["`"],shift:1016,"\\":V["\\"],z:90,x:88,c:67,v:86,b:66,n:78,m:77,",":V[","],".":V["."],"/":V["/"],"right-shift":3016,prtsc:1044,alt:1018,space:V[" "],"caps-lock":1020,f1:1112,f2:1113,f3:1114,f4:1115,f5:1116,f6:1117,f7:1118,f8:1119,f9:1120,f10:1121,"num-lock":1144,"scroll-lock":1145,"num-home":1036,"num-up":1038,"num-pgup":1033,"num-sub":1109,"num-left":1037,"num-center":1101,"num-right":1039,"num-add":1107,"num-end":1035,
            "num-down":1040,"num-pgdn":1034,"num-ins":1045,"num-del":1046},Fi={"caps-lock":512,"num-lock":1024,"scroll-lock":2048},X={1027:1};X[V["1"]]=2;X[V["!"]]=10754;X[V["2"]]=3;X[V["@"]]=10755;X[V["3"]]=4;X[V["#"]]=10756;X[V["4"]]=5;X[V.$]=10757;X[V["5"]]=6;X[V["%"]]=10758;X[V["6"]]=7;X[V["^"]]=10759;X[V["7"]]=8;X[V["&"]]=10760;X[V["8"]]=9;X[V["*"]]=10761;X[V["9"]]=10;X[V["("]]=10762;X[V["0"]]=11;X[V[")"]]=10763;X[V["-"]]=12;X[V._]=10764;X[V["="]]=13;X[V["+"]]=10765;X[1008]=14;X[1009]=15;X[113]=16;
            X[81]=10768;X[119]=17;X[87]=10769;X[101]=18;X[69]=10770;X[114]=19;X[82]=10771;X[116]=20;X[84]=10772;X[121]=21;X[89]=10773;X[117]=22;X[85]=10774;X[105]=23;X[73]=10775;X[111]=24;X[79]=10776;X[112]=25;X[80]=10777;X[V["["]]=26;X[V["{"]]=10778;X[V["]"]]=27;X[V["}"]]=10779;X[13]=28;X[1017]=29;X[97]=30;X[65]=10782;X[115]=31;X[83]=10783;X[100]=32;X[68]=10784;X[102]=33;X[70]=10785;X[103]=34;X[71]=10786;X[104]=35;X[72]=10787;X[106]=36;X[74]=10788;X[107]=37;X[75]=10789;X[108]=38;X[76]=10790;X[V[";"]]=39;
            X[V[":"]]=10791;X[V["'"]]=40;X[V['"']]=10792;X[V["`"]]=41;X[V["~"]]=10793;X[1016]=42;X[V["\\"]]=43;X[V["|"]]=10795;X[122]=44;X[90]=10796;X[120]=45;X[88]=10797;X[99]=46;X[67]=10798;X[118]=47;X[86]=10799;X[98]=48;X[66]=10800;X[110]=49;X[78]=10801;X[109]=50;X[77]=10802;X[V[","]]=51;X[V["<"]]=10803;X[V["."]]=52;X[V[">"]]=10804;X[V["/"]]=53;X[V["?"]]=10805;X[3016]=54;X[1044]=55;X[1018]=56;X[V[" "]]=57;X[1020]=58;X[1112]=59;X[1113]=60;X[1114]=61;X[1115]=62;X[1116]=63;X[1117]=64;X[1118]=65;X[1119]=66;
            X[1120]=67;X[1121]=68;X[1144]=69;X[1145]=70;X[1036]=71;X[1038]=72;X[1033]=73;X[1109]=74;X[1037]=75;X[1101]=76;X[1039]=77;X[1107]=78;X[1035]=79;X[1040]=80;X[1034]=81;X[1045]=82;X[1046]=83;X[1122]=87;X[1123]=88;X[1091]=91;X[1093]=93;X[1224]=91;X[4003]=7470;X[4008]=7494;X[4046]=3677523;f=zi.prototype;
            f.Lb=function(a,b,c){var d=this,e=a+"-"+b;if(void 0===this.qa[e])switch(b){case "kbd":return c.onkeydown=function(a){return Gi(d,a,!0)},c.onkeypress=function(a){a=a||window.event;a=a.which||a.keyCode;if(d.Om){var b=d.Mb.length?d.Mb[0].Pe:0;b&&(65<=b&&90>=b||97<=b&&122>=b)&&(65<=a&&90>=a||97<=a&&122>=a)&&b!=a&&(d.xk=!0,a=b)}(b=!X[a]||!!(d.Zb&128))||Hi(d,a,!0);return b},c.onkeyup=function(a){return Gi(d,a,!1)},!0;case "caps-lock":return this.qa[e]=c,c.onclick=function(){d.U&&d.U.Jd();Hi(d,1020,!0)},
            !0;case "num-lock":return this.qa[e]=c,c.onclick=function(){d.U&&d.U.Jd();Hi(d,1144,!0)},!0;case "scroll-lock":return this.qa[e]=c,c.onclick=function(){d.U&&d.U.Jd();Hi(d,1145,!0)},!0;default:var m=b.toUpperCase().replace(/-/g,"_");if(void 0!==Di[m]&&"button"==a)return this.qa[e]=c,c.onclick=function(a,b,c){return function(){a.U&&a.U.Jd();Ii(a,c,!0);Hi(a,c,!0)}}(this,m,Di[m]),!0;if(void 0!==Ei[b])return this.Gm++,this.qa[e]=c,a=function(a,b,c){return function(){Hi(a,c)}}(this,b,Ei[b]),b=function(a,
            b,c){return function(){Ji(a,c)}}(this,b,Ei[b]),"ontouchstart"in window?(c.ontouchstart=a,c.ontouchend=b):(c.onmousedown=a,c.onmouseup=c.onmouseout=b),!0}return!1};function Ki(a,b,c){if(a.Gm){for(var d in Bi)if(b==Bi[d]){b=+d;(d=Ai[d])&&(b=d);break}for(var e in Ei)if((d=Ei[e]==b)||(d=b,97<=d&&122>=d&&(d-=32),d=Ei[e]==d),d){(a=a.qa["key-"+e])&&void 0!==c&&(a.style.color=c?"#ffffff":"#000000",a.style.backgroundColor=c?"#000000":"#ffffff");break}}}
            f.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;this.fa=gb(a,"ChipSet")};function ki(a,b){a.oc("keyboard reset",65792);a.Wb=[170];a.Og=!0;b&&a.fa&&mi(a.fa,a.Wb[0])}function gi(a,b,c){a.sk!==c&&(a.sk=a.wk=c)&&(a.Og=!0);a.gi!==b&&(a.gi=b)&&!a.wk&&ni(a,!0);a.gi&&a.wk&&(ki(a,!0),a.wk=!1)}function hi(a){var b=0;a.Wb.length&&a.Og&&(b=a.Wb[0],a.fa&&mi(a.fa,b))}function ni(a,b){0<a.Wb.length&&(a.Wb.shift(),(a.Og=b)&&a.Wb.length&&a.fa&&mi(a.fa,a.Wb[0]))}
            f.gc=function(a,b){return!b&&(this.reset(),a&&this.restore&&!this.restore(a))?!1:!0};f.fc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.ye();this.Zb=this.ud=0;this.Wb=[];this.Og=!0};f.save=function(){var a=new Zd(this);a.set(0,this.dm());return a.data()};f.restore=function(a){return this.ye(a[0])};f.ye=function(a){var b=0;void 0===a&&(a=[]);this.sk=this.Og=a[b++];this.gi=a[b];return!0};f.dm=function(){var a=0,b=[];b[a++]=this.sk;b[a]=this.gi;return b};
            function Ii(a,b,c,d){if(X[b]){var e=Math.floor(b/1E3)&2;if(b=Ci[b]||0){!e||b&85||(b>>=1);if(b&3584){if(!1===d)return!0;d=null}null==d?d=!((c?a.ud:a.Zb)&b):d||b&255&&(b=255);if(c){a.ud&=~b;d&&(a.ud|=b);c=b;var m,n;for(n in Fi)d="led-"+n,e=Fi[n],c&&c!=e||!(m=a.qa[d])||(m.style.backgroundColor=a.ud&e?"#00ff00":"#000000")}else a.Zb&=~b,d&&(a.Zb|=b);return!0}}return!1}
            function Hi(a,b,c){if(X[b]&&a.U&&a.U.ha.Qb){Ci[b]&&a.Mb.length&&0<a.Mb[0].Dd&&(a.Mb[0].Dd=0);for(var d,e=0;e<a.Mb.length;e++)if(d=a.Mb[e],d.Pe==b){if(!c||0<=d.Dd){e=-1;break}0<e&&(0<a.Mb[0].Dd&&(a.Mb[0].Dd=0),a.Mb.splice(e,1));break}0>e||(e==a.Mb.length&&(d={},d.Pe=b,d.Zb=a.Zb,Ki(a,b,!0),e++),0<e&&a.Mb.splice(0,0,d),d.Rg=!0,d.Dd=c?-1:Ci[b]?0:1,Li(a,d))}}
            function Ji(a,b,c){if(!X[b]||!(c||a.U&&a.U.ha.Qb))return!1;for(var d=!1,e=0;e<a.Mb.length;e++){var m=a.Mb[e];if(m.Pe==b||m.Pe==Bi[b]){a.Mb.splice(e,1);m.Rn&&clearTimeout(m.Rn);m.Rg&&!c&&Mi(a,m.Pe,!1);Ki(a,b,!1);d=!0;break}}!a.Mb.length&&a.xk&&(Ii(a,1020),a.xk=!1);return d}
            function Li(a,b){if(a.U&&a.U.ha.Qb){if(Mi(a,b.Pe,b.Rg),b.Dd){var c;if(0>b.Dd){if(!b.Rg){Ji(a,b.Pe);return}b.Rg=!1;c=a.Np}else c=1==b.Dd++?a.Op:a.Pp;b.Rn=setTimeout(function(a){return function(){Li(a,b)}}(a),c)}}else Ji(a,b.Pe,!0)}function Ni(a,b,c){var d=b;if(65<=b&&90>=b)!(a.Zb&515)==c&&(d=b+32);else if(97<=b&&122>=b)!!(a.Zb&515)==c&&(d=b-32);else if(!!(a.Zb&3)==c){if(a=Bi[b])d=a}else if(a=Ai[b])d=a;return d}f.sj=function(a){this.hi=a;a||(this.Zb&=-256)};
            function Gi(a,b,c){var d=!0,e=!1,m=!1,n=b.keyCode,p=Ni(a,n,!0);a.tk&&p==V["`"]&&(n=p=27);if(X[n+1E3])if(p+=1E3,2==b.location&&(p+=2E3),Ii(a,p,!1,c)){if(20==n||144==n||145==n)a.yo||(c=e=!0);if(!(c||91!=n&&93!=n))for(var v=0;v<a.Mb.length;v++){var w=a.Mb[v];w.Rg=!1;0<w.Dd&&(w.Dd=0)}}else 8==n&&8==(a.Zb&40)&&(p=4008),d=!1;else if(X[p]&&a.Zb&60&&(d=!1),!a.Om&&d&&c||a.Zb&192)m=!0;d||b.preventDefault();m||a.Um&&d||(c?Hi(a,p,e):Ji(a,p)||(b=Ni(a,n,!1),b!=p&&Ji(a,b)));return d}
            function Mi(a,b,c){Ii(a,b,!0,c);var d=X[b]||X[b+1E3];if(void 0!==d){14==d&&40==(a.Zb&40)&&(d=83);var e=[],m=d&255;e.push(m|(c?0:128));for(b=65<=b&&90>=b||97<=b&&122>=b;d>>>=8;){var n=0,p=d&255;224==m||225==m?e.push(m|(c?0:128)):(42==p?a.ud&3||a.ud&512&&b||(n=p):29==p?a.ud&12||(n=p):56==p?a.ud&48||(n=p):e.push(m|(c?0:128)),n&&(c?e.unshift(n):e.push(n|128)))}for(c=0;c<e.length;c++)d=a,m=e[c],d.Wb&&(20>d.Wb.length?(d.Wb.push(m),1==d.Wb.length&&d.fa&&mi(d.fa,m)):(20==d.Wb.length&&d.Wb.push(255),d.oc("scan code buffer overflow")))}}
            Ea(function(){for(var a=Xa(window.document,"pcjs","keyboard"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new zi(d);Wa(d,c)}});
            function Y(a,b,c,d,e){Ia.call(this,"Video",a,Y);this.ma=a.model;this.qb=Oi[this.ma]||Pi;this.vd=a.memory||0;this.Nn=a.switches;this.jd=a.mode;if(void 0===this.jd||void 0===Qi[this.jd])this.jd=Ri;this.vi=a.charCols;this.Ql=a.charRows;if(void 0===this.vi||void 0===this.Ql)this.vi=Qi[this.jd][0],this.Ql=Qi[this.jd][1];this.xd=a.screenWidth;this.Sd=a.screenHeight;this.Ao=a.scale;this.wo=12<=Math.round(this.xd/this.vi);this.Co=a.touchScreen;this.fd=b;this.Uc=c;this.Sa=(this.Cr=d)||b||null;this.Ae=null;
            this.uo=a.autoLock;this.Va=this.Ub=0;this.he=[];this.Kd=Array(16);this.hi=!1;var m=this;this.Rm=ya("Gecko/");b=["","moz","webkit","ms"];if(this.rc=e)if(this.rc.Of=e.requestFullscreen||e.msRequestFullscreen||e.mozRequestFullScreen||e.webkitRequestFullscreen,this.rc.Of){for(e=0;e<b.length;e++)if(c=b[e]+"fullscreenchange","on"+c in document){document.addEventListener(c,function(){Si(m,document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?
            !0:!1)},!1);break}for(e=0;e<b.length;e++)if(c=b[e]+"fullscreenerror","on"+c in document){document.addEventListener(c,function(){Si(m,null)},!1);break}}this.Sa&&(this.Sa.onfocus=function(){return m.sj(!0)},this.Sa.onblur=function(){return m.sj(!1)},this.Sa.mf=this.Sa.requestPointerLock||this.Sa.mozRequestPointerLock||this.Sa.webkitRequestPointerLock,this.Sa.Sn=this.Sa.exitPointerLock||this.Sa.mozExitPointerLock||this.Sa.webkitExitPointerLock,this.Sa.mf&&(e=function(){m.lh(document.pointerLockElement===
            m.Sa||document.mozPointerLockElement===m.Sa||document.webkitPointerLockElement===m.Sa)},"onpointerlockchange"in document?document.addEventListener("pointerlockchange",e,!1):"onmozpointerlockchange"in document?document.addEventListener("mozpointerlockchange",e,!1):"onwebkitpointerlockchange"in document&&document.addEventListener("webkitpointerlockchange",e,!1)));if(a=a.fontROM)"json"!=ha(a)&&(a=qa()+"/api/v1/dump?file="+a+"&format=bytes"),pa(a,!0,null,this,this.bq)}Qa(Y);
            var Pi=1,Oi={mda:1,cga:3,ega:5,vga:7},Ri=7,Ti={2:{Bi:15700,Ai:208,tj:85,uj:96},3:{Bi:18432,Ai:364,tj:85,uj:96},4:{Bi:21850,Ai:364,tj:85,uj:96},7:{Bi:16700,Ai:480,tj:85,uj:83}},Ui={6:[1,3,!0],7:[2,3,!0],8:[6,3,!0],9:[4,3,!0],10:[3,1,!0],11:[3,2,!0],0:[1,3,!1],1:[2,3,!1],2:[6,3,!1],3:[4,3,!1],4:[3,1,!1],5:[3,2,!1]},Qi=[,[40,25,1,0,3],,[80,25,1,0,3],[320,200,8,192],,[640,200,16,192]];Qi[Ri]=[80,25,1,0,1];Qi[13]=[320,200,16];Qi[14]=[640,200,16];Qi[15]=[640,350,16];Qi[16]=[640,350,16];
            Qi[17]=[640,480,16];Qi[18]=[640,480,16];Qi[19]=[320,200,16];Qi[0]=Qi[1];Qi[2]=Qi[3];Qi[5]=Qi[4];var Vi=Array(5);Vi[0]=[0,0,0,255];Vi[1]=[127,192,127,255];Vi[2]=[127,192,127,255];Vi[3]=[127,255,127,255];Vi[4]=[127,255,127,255];var Wi=[0,1,2,2,2,2,2,2,0,3,4,4,4,4,4,4],Xi=Array(16);Xi[0]=[0,0,0,255];Xi[1]=[0,0,170,255];Xi[2]=[0,170,0,255];Xi[3]=[0,170,170,255];Xi[4]=[170,0,0,255];Xi[5]=[170,0,170,255];Xi[6]=[170,85,0,255];Xi[7]=[170,170,170,255];Xi[8]=[85,85,85,255];Xi[9]=[85,85,255,255];
            Xi[10]=[85,255,85,255];Xi[11]=[85,255,255,255];Xi[12]=[255,85,85,255];Xi[13]=[255,85,255,255];Xi[14]=[255,255,85,255];Xi[15]=[255,255,255,255];var Yi=[2,4,6],Zi=[3,5,7],$i=[0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63],aj=[0,255,65280,65535,16711680,16711935,16776960,16777215,-16777216,-16776961,-16711936,-16711681,-65536,-65281,-256,-1],bj=[0];bj[128]=1;bj[32768]=2;bj[32896]=3;bj[8388608]=4;bj[8388736]=5;bj[8421376]=6;bj[8421504]=7;bj[-2147483648]=8;bj[-2147483520]=9;bj[-2147450880]=10;
            bj[-2147450752]=11;bj[-2139095040]=12;bj[-2139094912]=13;bj[-2139062272]=14;bj[-2139062144]=15;
            function cj(a,b,c,d){if(void 0!==b&&(!c||c.length)){this.video=a;var e=dj[b],m=a.kd||e[5];if(!c||6>c.length)c=[!1,0,null,null,0,Array(5>b?ej:fj)];this.qb=b;this.Va=e[2];this.Ub=e[3];this.vd=d||e[4];65536<=this.vd&&720896<=this.Va&&(this.Ub=Math.min(this.vd>>2,32768));this.vc=c[0];this.Nc=c[1];this.oh=c[2];this.ta=c[3];this.zc=c[4]&255;this.zj=c[4]>>8&255;this.Ab=c[5];this.Fk=ej;if(5<=b){this.Fk=fj;b=c[6];void 0===b&&(b=[!1,0,Array(20),0,3==m?0:1,0,0,Array(5),0,0,0,Array(9),0,[this.Va,this.Ub,this.vd],
            Array(this.vd>>2),5144,0,-1,0,-1,0,-1,0,0,0,0,1,255,0,0,0,Array(256)]);this.te=b[0];this.sf=b[1];this.Je=b[2];this.Yl=b[3];this.sh=b[4];this.Ej=b[5];this.lg=b[6];this.th=b[7];this.Fn=b[8];this.Gn=b[9];this.jg=b[10];this.ig=b[11];this.mb=b[12];d=b[13];"number"==typeof d&&(d=[this.Va,this.Ub,d]);this.Va=d[0];this.Ub=d[1];d=this.vd>>2;if((this.We=b[14])&&this.We.length<d){for(var e=this.We,n=0,p=Array(d),v=0;v<e.length-1;){for(var w=e[v++],G=e[v++];w--;)p[n]=G,n+=2;n==d&&(n=1)}this.We=p}(d=b[15])&&(d=
            d&8?d&-9:gj[d&65280]|gj[d&255]);this.Lj(d);this.Pl=b[16];this.fb=b[17];this.Cd=b[18];this.nb=b[19];this.pj=b[20];this.He=b[21];this.qf=b[22];this.Gk=b[23];this.Hk=b[24];this.jh=b[25];7==this.qb&&(this.Zl=b[26],this.Ul=b[27],this.Ed=b[28],this.Ac=b[29],this.Cj=b[30],this.qh=b[31])}m=Ti[m]||Ti[3];this.Ik=a.U.R.Bd/m.Bi|0;this.Sp=this.Ik*m.tj/100|0;this.rn=this.Ik*m.Ai|0;this.Up=this.rn*m.uj/100|0;this.tn=c[7]||0}}var ej=18,fj=25,gj=[,,1024,5120];gj[16]=1280;gj[512]=0;gj[1024]=32;gj[1536]=96;
            gj[2560]=160;gj[3584]=224;gj[768]=16;gj[4096]=1;gj[8192]=2;gj[24576]=98;gj[40960]=162;gj[57344]=226;var hj=[];hj[1024]=function(a){a+=this.offset;return(this.W.mb=this.ba[a])>>this.W.Pl&255};hj[5120]=function(a){a+=this.offset;var b=this.W.mb=this.ba[a&-2];return(a&1?b>>8:b)&255};hj[1280]=function(a){a+=this.offset;a=this.W.mb=this.ba[a];for(var b=this.W.Hk,c=this.W.Gk&b,d=0,e=128;e;)(a&b)==c&&(d|=e),c>>>=1,b>>>=1,e>>=1;return d};
            hj[0]=function(a,b){var c=a+this.offset,d;d=this.ba[c]&~this.W.fb|(b|b<<8|b<<16|b<<24)&this.W.fb;d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};hj[32]=function(a,b){var c=a+this.offset;b=b>>this.W.Cd|b<<8-this.W.Cd&255;var d;d=(b|b<<8|b<<16|b<<24)&this.W.He|this.W.qf;d=d&this.W.fb|this.ba[c]&~this.W.fb;d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};
            hj[96]=function(a,b){var c=a+this.offset;b=b>>this.W.Cd|b<<8-this.W.Cd&255;var d;d=(b|b<<8|b<<16|b<<24)&this.W.He|this.W.qf;d&=this.W.mb;d=d&this.W.fb|this.ba[c]&~this.W.fb;d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};hj[160]=function(a,b){var c=a+this.offset;b=b>>this.W.Cd|b<<8-this.W.Cd&255;var d;d=(b|b<<8|b<<16|b<<24)&this.W.He|this.W.qf;d|=this.W.mb;d=d&this.W.fb|this.ba[c]&~this.W.fb;d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};
            hj[224]=function(a,b){var c=a+this.offset;b=b>>this.W.Cd|b<<8-this.W.Cd&255;var d;d=(b|b<<8|b<<16|b<<24)&this.W.He|this.W.qf;d^=this.W.mb;d=d&this.W.fb|this.ba[c]&~this.W.fb;d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};hj[16]=function(a,b){a+=this.offset;var c,d=a&-2;c=this.W.fb&(d==a?16711935:-16711936);c=(b|b<<8|b<<16|b<<24)&c|this.ba[d]&~c;c=c&this.W.nb|this.W.mb&~this.W.nb;this.ba[d]!=c&&(this.ba[d]=c,this.Ka=!0)};
            hj[1]=function(a){a+=this.offset;var b=this.ba[a]&~this.W.fb|this.W.mb&this.W.fb;this.ba[a]!=b&&(this.ba[a]=b,this.Ka=!0)};hj[17]=function(a){a+=this.offset;var b=a&-2;a=this.W.fb&(b==a?16711935:-16711936);a=this.ba[b]&~a|this.W.mb&a;this.ba[b]!=a&&(this.ba[b]=a,this.Ka=!0)};hj[2]=function(a,b){var c=a+this.offset,d=aj[b&15],d=d&this.W.fb|this.ba[c]&~this.W.fb,d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};
            hj[98]=function(a,b){var c=a+this.offset,d=aj[b&15],d=d&this.W.mb,d=d&this.W.fb|this.ba[c]&~this.W.fb,d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};hj[162]=function(a,b){var c=a+this.offset,d=aj[b&15],d=d|this.W.mb,d=d&this.W.fb|this.ba[c]&~this.W.fb,d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};
            hj[226]=function(a,b){var c=a+this.offset,d=aj[b&15],d=d^this.W.mb,d=d&this.W.fb|this.ba[c]&~this.W.fb,d=d&this.W.nb|this.W.mb&~this.W.nb;this.ba[c]!=d&&(this.ba[c]=d,this.Ka=!0)};
            function ij(a){var b=[];if(void 0!==a.qb){b[0]=a.vc;b[1]=a.Nc;b[2]=a.oh;b[3]=a.ta;b[4]=a.zc|a.zj<<8;b[5]=a.Ab;if(5<=a.qb){var c=[];c[0]=a.te;c[1]=a.sf;c[2]=a.Je;c[3]=a.Yl;c[4]=a.sh;c[5]=a.Ej;c[6]=a.lg;c[7]=a.th;c[8]=a.Fn;c[9]=a.Gn;c[10]=a.jg;c[11]=a.ig;c[12]=a.mb;c[13]=[a.Va,a.Ub,a.vd];var d;a:if(d=a.We){var e=0,m=[];if(void 0!==d[0])for(var n=0;2>n;n++)for(var p=n;p<d.length;){for(var v=d[p],w=p+2;w<d.length&&d[w]===v;)w+=2;m[e++]=w-p>>1;m[e++]=v;p=w}if(m.length<d.length){d=m;break a}}c[14]=d;c[15]=
            a.Ek|8;c[16]=a.Pl;c[17]=a.fb;c[18]=a.Cd;c[19]=a.nb;c[20]=a.pj;c[21]=a.He;c[22]=a.qf;c[23]=a.Gk;c[24]=a.Hk;c[25]=a.jh;7==a.qb&&(c[26]=a.Zl,c[27]=a.Ul,c[28]=a.Ed,c[29]=a.Ac,c[30]=a.Cj,c[31]=a.qh);b[6]=c}b[7]=a.tn}return b}cj.prototype.cn=function(a){return[this.We,a-this.Va]};cj.prototype.Ak=function(){return this.Ih};
            cj.prototype.Lj=function(a){if(null!=a&&a!=this.Ek){var b=a&65280,c=hj[b];c||b&4096&&(c=hj[4096]);var b=a&247,d=hj[b];d||b&16&&(d=hj[16]);this.Ih||(this.Ih=Array(6));this.Ih[0]=c;this.Ih[3]=d;this.Ek=a}};var dj=[];dj[Pi]=["MDA",948,720896,4096,0,3];dj[3]=["CGA",980,753664,16384,0,2];dj[5]=["EGA",980,753664,16384,65536,4];dj[7]=["VGA",980,753664,16384,262144,7];f=Y.prototype;
            f.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;3!=Oi[this.ma]&&(Tb(b,this,jj),Vb(b,this,kj));Oi[this.ma]!=Pi&&(Tb(b,this,lj),Vb(b,this,mj));5<=this.qb&&(Tb(b,this,nj),Vb(b,this,oj));7==this.qb&&(Tb(b,this,pj),Vb(b,this,qj));if((this.Da=gb(a,"Keyboard"))&&this.fd){for(var e in this.qa)0<e.indexOf("lock")&&this.Da.Lb("led",e,this.qa[e]);this.Da.Lb(this.Cr?"textarea":"canvas","kbd",this.Sa)}this.Mh=9;(this.fa=gb(a,"ChipSet"))&&this.Nn&&5==this.qb&&(this.Mh=$g(this.Nn,this.Mh));this.Da&&this.Co&&
            rj(this)};f.Lb=function(a,b,c){var d=this;if(!this.qa[b])switch(this.qa[b]=c,b){case "fullScreen":return this.rc&&this.rc.Of?c.onclick=function(){d.Of()}:c.parentNode.removeChild(c),!0;case "lockPointer":return this.zr=c.textContent,this.Sa&&this.Sa.mf?c.onclick=function(){d.mf(!0)}:c.parentNode.removeChild(c),!0;case "refresh":return c.onclick=function(){wc(d,!0)},!0}return!1};f.Jd=function(){this.Sa&&this.Sa.focus()};
            f.Of=function(){var a=!1;if(this.rc){if(this.rc.Of){a="100%";if(screen&&screen.width&&screen.height){var b=screen.width/screen.height,c=this.xd/this.Sd;b>c&&(a=Math.round(c/b*100)+"%")}this.Rm?(this.fd.style.width=a,this.fd.style.width=a,this.fd.style.display="block",this.fd.style.margin="auto"):(this.rc.style.width=a,this.rc.style.height="auto");this.rc.style.backgroundColor="black";this.rc.Of();a=!0}this.Jd()}return a};
            function Si(a,b){!b&&a.rc&&(a.Rm?a.fd.style.width=a.fd.style.height="":a.rc.style.width=a.rc.style.height="");a.oc("notifyFullScreen("+b+")",!0);a.Da&&(a.Da.tk=b)}f.mf=function(a){var b=!1;this.Sa&&(a?this.Sa.mf&&(this.Sa.mf(),this.Ae.lh(!0),b=!0):this.Sa.Sn&&(this.Sa.Sn(),this.Ae.lh(!1),b=!0),this.Jd());return b};f.lh=function(a){this.Ae&&(this.Ae.lh(a),this.Da&&(this.Da.tk=a));var b=this.qa.lockPointer;b&&(b.textContent=a?"Press Esc to Unlock Pointer":this.zr)};
            function rj(a){var b=a.Sa;b&&!a.Pg&&(b.addEventListener("touchstart",function(b){sj(a,b)},!1),b.addEventListener("touchmove",function(b){sj(a,b)},!0),b.addEventListener("touchend",function(){},!1),a.Pg=!0)}f.sj=function(a){this.hi=a;this.Da&&this.Da.sj(a)};
            function sj(a,b){a.hi&&b.preventDefault();var c=0,d=0,e=a.fd;do isNaN(e.offsetLeft)||(c+=e.offsetLeft,d+=e.offsetTop);while(e=e.offsetParent);var m=a.xd/a.fd.offsetWidth,e=a.Sd/a.fd.offsetHeight,n,p;b.targetTouches?(n=b.targetTouches[0].pageX,p=b.targetTouches[0].pageY):(n=b.pageX,p=b.pageY);c=(n-c)*m/(a.xd/3)|0;d=(p-d)*e/(a.Sd/3)|0;1!=d?d?Hi(a.Da,1040,!0):Hi(a.Da,1038,!0):1!=c&&(c?Hi(a.Da,1039,!0):Hi(a.Da,1037,!0))}
            f.gc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};f.fc=function(a){return a&&this.save?this.save():!0};
            f.reset=function(){var a=!0,b=0;this.fa&&(b=rh(this.fa));this.ma||(this.qb=3==b?Pi:3);this.jd=3;switch(this.qb){case 7:b=7;break;case 5:var c=Ui[this.Mh];c&&(b=c[0]);b||(b=4);break;case Pi:b=3;this.jd=Ri;break;default:b=2}this.kd!==b&&(this.kd=b,a=!0);this.Ta=null;this.gd=this.ek=new cj(this,Pi);this.kc=this.Wh=new cj(this,3);5>this.qb?this.X=new cj:(this.X=new cj(this,this.qb,null,this.vd),tj(this));uj(this);this.De=null;this.af=this.Xc=-1;this.$e=0;vj(this,this.jd);if(this.Ta.Va&&a){a=this.Ta.Va+
            this.fk;for(b=this.Ta.Va;b<a;b+=2){var d=65536*Math.random()|0;4==this.kd||7==this.kd?(c=b>>1&255,d=d>>8&-129,d>>4==(d&15)&&(d^=15)):(c=d&255,d=(d&256?7:112)|8&d>>8);Pb(this.la,b,c|d<<8)}wc(this,!0)}};function tj(a){a.X.sh&1?(a.gd=a.ek,a.kc=a.X):(a.gd=a.X,a.kc=a.Wh)}f.save=function(){var a=new Zd(this);a.set(0,ij(this.ek));a.set(1,ij(this.Wh));a.set(2,[this.kd,this.jd,this.De]);a.set(3,ij(this.X));return a.data()};
            f.restore=function(a){var b=a[2];this.kd=b[0];this.jd=b[1];this.De=b[2];this.Ta=null;this.gd=this.ek=new cj(this,Pi,a[0]);this.kc=this.Wh=new cj(this,3,a[1]);this.X=new cj(this,this.qb,a[3],this.vd);this.X.vc&&tj(this);uj(this);if(!wj(this))return!1;xj(this);return!0};
            f.bq=function(a,b,c){if(c)this.wa("Unable to load font ROM image (error "+c+")");else{try{var d=eval("("+b+")");if(!d.length){ra("Empty font ROM image: "+a);return}if(1==d.length){ra(d[0]);return}if(8192==d.length)qi(this,d,[6144,0]);else{this.wa("Unrecognized font data length ("+d.length+")");return}}catch(e){this.wa("Font ROM data error: "+e.message);return}(this.Uc||this.Ra)&&Za(this)}};
            function yj(a,b){if(1==b)return a.Kd[0]=Xi[0],a.Kd[1]=Xi[7],a.Kd;if(2==b){var c=a.Ta.oh;if(a.Ta===a.X){var d=a.X.Je[0],c=d&7;d&16&&(c|=8);18!=a.X.Je[1]&&(c|=32)}a.Kd[0]=Xi[c&15];c=c&32?Zi:Yi;for(d=0;d<c.length;d++)a.Kd[d+1]=Xi[c[d]];return a.Kd}if(a.kc===a.Wh)return Xi;c=null!=a.X.Je[15]?a.X.Je:$i;for(d=0;d<a.Kd.length;d++){var e=c[d]||0;a.Kd[d]=[(e&4?170:0)|(e&32?85:0),(e&2?170:0)|(e&16?85:0),(e&1?170:0)|(e&8?85:0),255]}return a.Kd}function qi(a,b,c,d){a.Fh=b;a.Uj=c;a.ff=d}
            function uj(a){var b=!1;if(window&&a.Fh){var c=yj(a),d,e=a.ff?a.ff:8;zj(a,3,a.Uj[0],0,e,8,a.Fh,c)&&(b=!0);d=a.ff?0:2048;e=a.ff?a.ff:9;zj(a,1,a.Uj[1],d,e,14,a.Fh,Vi,Wi)&&(b=!0);a.ff&&zj(a,a.qb,a.Uj[1],0,a.ff,14,a.Fh,c)&&(b=!0)}return b}function zj(a,b,c,d,e,m,n,p,v){var w=!1;null!=c&&(Aj(a,b,c,d,e,m,n,p,v)&&(w=!0),a.wo&&Aj(a,b<<1,c,d,e,m,n,p,v)&&(w=!0));return w}
            function Aj(a,b,c,d,e,m,n,p,v){var w=!1,G=b&1?0:1,N=a.he[b];N||(N={sc:e<<G,tc:m<<G,Df:Array(p.length),sm:p.slice(),xg:v,Sj:Array(p.length)});for(v=0;v<p.length;v++){var L=p[v],U=N.Df[v]?N.sm[v]:[];if(L[0]!==U[0]||L[1]!==U[1]||L[2]!==U[2]){var w=N,U=v,W=G,za=c,ga=d,xa=e,Va=m,Rb=n,Lc=[0,0,0,0],Hd=window.document.createElement("canvas");Hd.width=w.sc<<4;Hd.height=w.tc<<4;for(var yh=Hd.getContext("2d"),pb=void 0,qc=void 0,Sb=void 0,Id=8>Va||!ga?Va:8,Se=yh.createImageData(w.sc,w.tc),pb=0;256>pb;pb++){for(Sb=
            0;Sb<Va;Sb++)for(var Ck=w.xg&&U&1&&Sb>=Va-2,Dk=Rb[Sb<Id?za+pb*Id+Sb:ga+pb*Id+Sb-Id],Te=0;Te<=W;Te++)for(qc=0;qc<xa;qc++){var zh=qc<<W,Ah=(Sb<<W)+Te,Bh=Ck||Dk&128>>(8<=qc&&192<=pb&&223>=pb?7:qc)?L:Lc;Bj(Se,zh,Ah,Bh);W&&Bj(Se,zh+1,Ah,Bh)}yh.putImageData(Se,(pb&15)*w.sc,(pb>>4)*w.tc)}w.Df[U]="#"+da(L[0],2)+da(L[1],2)+da(L[2],2);w.sm[U]=L;w.Sj[U]=Hd;w=!0}}a.he[b]=N;return w}function Cj(a){0<a.$e||0<=a.Xc?0>a.af&&(a.af=0):a.af=-1}
            function xj(a){if(a.Rb){for(var b=10;15>=b;b++)if(null==a.Ta.Ab[b])return;var c=a.Ta.Ab[10],b=c&31,d=a.Ta.Ab[11]&31,e=a.Ta.Ab[9]&31,m=!1;a.Ta===a.X&&(m=!0,7!=e||4!=b||d||(d=7));if(c&32||b>d&&!m||b>e)Dj(a);else{c=a.Ta.Ab[15]+((a.Ta.Ab[14]&63)<<8);a.Xc!=c&&(Dj(a),a.Xc=c);d=d-b+1;if(a.Wn!=b||a.Lm!=d)a.Wn=b,a.Lm=d;a.re=e+1;Cj(a)}}}
            function Dj(a){if(0<=a.Xc){if(void 0!==a.Dc){var b=a.Dc[a.Xc];if(b&131072){var b=b&-131073,c=a.Xc%a.eb,d=a.Xc/a.eb|0;a.Rb&&a.he[a.Rb]&&(a.Nf&&Ej(a,c,d,b,a.Nf),Ej(a,c,d,b));a.Dc[a.Xc]=b}}a.Xc=-1}}
            function Fj(a){var b;a=a.Ta;var c=a.ig[5];if(null!=c){b=1024;var d=0,e=a.ig[3]&31;switch(c&3){case 0:if(e){d=32;switch(e&24){case 8:d=96;break;case 16:d=160;break;case 24:d=224}a.Cd=e&7}break;case 1:d=1;break;case 2:switch(e&24){default:d=2;break;case 8:d=98;break;case 16:d=162;break;case 24:d=226}}c&8&&(b=1280);a=a.th[4];null==a||a&4||(b|=4096,d|=16);b|=d}return b}f.md=function(a){var b=this.Ta;b&&null!=a&&a!=b.Ek&&(b.Lj(a),this.la.Lj(b.Va,b.Ub,b.Ak()))};
            function wj(a,b){var c,d=a.De,e=a.Ta;if(e)if(e.qb==Pi)d=Ri;else if(5<=e.qb){var d=null,m=e.vd>>2,n=32768<m?32768:m,p=e.ig[6];if(null!=p){switch(p&12){case 0:e.Va=655360;e.Ub=m;d=255;break;case 4:e.Va=655360;e.Ub=m;d=3==a.kd?15:16;break;case 8:e.Va=720896;e.Ub=n;d=Ri;break;case 12:e.Va=753664,e.Ub=n,d=3==a.kd?2:3}c=e.th[1]&8;m=e.Ab[6];m|=e.Ab[7]&1?256:0;7==e.qb&&(m|=e.Ab[7]&32?512:0);255!=d&&(p&1?753664==e.Va?d=c?7-d:6:500>m?350>m&&(d=c?13:14):d=3==a.kd?17:18:c&&(d-=2));c=Fj(a)}}else e.Nc&8&&(e.Nc&
            2?(d=e.Nc&16?6:5,e.Nc&4||--d):(d=e.Nc&1?3:1,e.Nc&4&&--d));else a.De=null,null==d&&(d=a.jd);if(!vj(a,d,b))return!1;a.md(c);return!0}
            function vj(a,b,c){if(null!=b&&(b!=a.De||c)){a.ao=0;a.De=b;b=a.Ta||(b==Ri?a.gd:a.kc);if(b!=a.Ta||b.Va!=a.Va||b.Ub!=a.Ub){Dj(a);if(a.Va){if(!Nb(a.la,a.Va,a.Ub))return!1;a.Ta&&(a.Ta.vc=!1)}a.Ta=b;b.vc=!0;a.Va=b.Va;a.Ub=b.Ub;if(!Jb(a.la,b.Va,b.Ub,3,b===a.X?b:null))return!1}a.Rb=0;a.eb=a.vi;a.nc=a.Ql;a.wi=a.eb;a.ti=Qi[Ri][2];a.Jg=0;if(b=Qi[a.De])a.eb=b[0],a.nc=b[1],a.ti=b[2],a.Jg=b[3]||0,a.Rb=b[4],4!=a.kd&&7!=a.kd||a.Ta!==a.X||3!=a.Rb||(7==a.X.Ab[9]?a.nc=43:a.Rb=a.qb);a.on=a.eb*a.nc|0;a.si=a.on/a.ti|
            0;a.fk=(a.si<<1)+a.Jg|0;a.Hm=a.Jg?a.fk+a.Jg>>1:0;13<=a.De&&(a.si<<=1);if(a.he.length){a.Rd=a.xd/a.eb|0;a.Td=a.Sd/a.nc|0;if(a.Rb){b=a.he[a.Rb];var d=a.he[a.Rb<<1];a.Ao&&80==a.eb?d&&a.Rd>=3*d.sc>>2&&(a.Rb<<=1,b=d):(d&&a.Rd>=d.sc&&(a.Rb<<=1,b=d),b&&(a.Rd=b.sc,a.Td=b.tc));a.Mg=a.Ng=0;b&&(a.Mg=a.eb*b.sc,a.Ng=a.nc*b.tc)}else a.Rd=a.Td=1,a.Mg=a.eb,a.Ng=a.nc;a.pi=a.Uc.createImageData(a.Mg,a.Ng);a.Lf=window.document.createElement("canvas");a.Lf.width=a.Mg;a.Lf.height=a.Ng;a.Nf=a.Lf.getContext("2d");a.hm=a.im=
            0;a.lk=a.xd;a.mk=a.Sd;b=a.xd-a.eb*a.Rd;d=a.Sd-a.nc*a.Td;0<b&&(a.hm=b>>1,a.lk-=b);0<d&&(a.im=d>>1,a.mk-=d);if(b||d)a.Uc.fillStyle=a.fd.style.backgroundColor,a.Uc.fillRect(0,0,a.xd,a.Sd)}!1!==c?wc(a,!0):Gj(a,!0)}return!0}function Bj(a,b,c,d){b=(b+c*a.width)*d.length;a.data[b]=d[0];a.data[b+1]=d[1];a.data[b+2]=d[2];a.data[b+3]=d[3]}function Gj(a,b){a.$e=-1;a.jf=!1;if(b){var c=a.si;if(void 0===a.Dc||a.Dc.length!=c){a.Dc=Array(c);for(var d=0;d<c;d++)a.Dc[d]=-1}}}
            function Ej(a,b,c,d,e){var m=d&255,n=d>>8;d=n&15;var p=a.he[a.Rb];p.xg&&(d=p.xg[d]);var v=n>>4&15;p.xg&&(v=p.xg[v]);e?(b*=p.sc,c*=p.tc,e.fillStyle=p.Df[v],e.fillRect(b,c,p.sc,p.tc)):(b=b*a.Rd+a.hm,c=c*a.Td+a.im,a.Uc.fillStyle=p.Df[v],a.Uc.fillRect(b,c,a.Rd,a.Td));n&256&&(v=(m&15)*p.sc,m=(m>>4)*p.tc,e?e.drawImage(p.Sj[d],v,m,p.sc,p.tc,b,c,p.sc,p.tc):a.Uc.drawImage(p.Sj[d],v,m,p.sc,p.tc,b,c,a.Rd,a.Td));n&512&&(m=a.Wn,n=a.Lm,e?(a.re&&a.re!==p.tc&&(m=m*p.tc/a.re|0,n=n*p.tc/a.re|0),e.fillStyle=p.Df[d],
            e.fillRect(b,c+m,p.sc,n)):(a.re&&a.re!==a.Td&&(m=m*a.Td/a.re|0,n=n*a.Td/a.re|0),a.Uc.fillStyle=p.Df[d],a.Uc.fillRect(b,c+m,a.Rd,n)))}
            function wc(a,b){if(a.ha.dc){var c=!1,d=a.Ta;d&&(d!==a.X?d.Nc&8&&(c=!0):d.sf&32&&(c=!0));if(c||b){if(b)Gj(a,!0);else if(void 0===a.Dc)return;var e=!1;!(b||++a.ao&15)&&0<=a.af&&(a.af++,e=!0);var m=0,n=a.on,c=d.Va,p=c+d.Ub;Hj(a,d)&8&&(d.jh=(d.Ab[12]<<8)+d.Ab[13]|0);var v=d.jh;a.Rb&&(v<<=1);c+=v;v=a.fk;5<=a.qb&&d.Ab[19]&&(a.wi=d.Ab[19]<<(a.Rb?1:4),v=((a.wi*(a.nc-1)+a.eb)/a.ti<<1)+a.Jg|0);c+v>p&&(v=p-c,0>v&&(v=0));p=c+v;if(d=!b){for(var d=a.la,w=!0,G=c>>>d.Aa;0<v&&G<d.ka.length;)d.ka[G].Ka&&(d.ka[G].Ka=
            w=!1,d.ka[G].Pm=!0),v-=d.ob,G++;d=w}if(d){if(!e)return;if(!a.$e){if(0>a.Xc)return;m=a.Xc;n=m+1}}if(a.Rb){if(a.he[a.Rb]){e=0;d=a.$e=0;v=1048575;a.Ta.Nc&32&&(d=32768,v&=~d,a.af&2||(v&=-65537));for(c+=m<<1;c<p&&m<n;)w=Ob(a.la,c),w|=65536,w&d&&(a.$e++,w&=v),m==a.Xc&&(w|=a.af&1?131072:0),a.jf&&w===a.Dc[m]||(Ej(a,m%a.eb,m/a.eb|0,w,a.Nf),a.Dc[m]=w,e++),c+=2,m++;a.jf=!0;e&&a.Nf&&a.Uc.drawImage(a.Lf,0,0,a.Mg,a.Ng,a.hm,a.im,a.lk,a.mk);Cj(a)}}else if(a.Hm){for(var n=p,N,m=c,p=a.$e=0,e=a.ti,d=16==e?65536:196608,
            v=16==e?1:2,w=yj(a,v),L=G=0,U=a.eb,W=0,za=a.nc,ga=0;m<n;){N=Ob(a.la,m);if(a.jf&&N===a.Dc[p])G+=e;else{a.Dc[p]=N;N=N>>8|(N&255)<<8;var xa=d,Va=16;G<U&&(U=G);for(var Rb=0;Rb<e;Rb++){var Lc=(N&(xa>>=v))>>(Va-=v);Bj(a.pi,G++,L,w[Lc])}G>W&&(W=G);L<za&&(za=L);L>=ga&&(ga=L+1)}m+=2;p++;if(G>=a.eb){G=0;L+=2;if(L>a.nc)break;L==a.nc&&(L=1,m=c+a.Hm)}}a.jf=!0;U<a.eb&&(a.Nf.putImageData(a.pi,0,0,U,za,W-U,ga-za),a.Uc.drawImage(a.Lf,0,0,a.eb,a.nc,0,0,a.xd,a.Sd))}else{n=p;m=a.$e=0;p=yj(a);e=a.Ta.We;v=d=0;w=a.eb;G=
            0;L=a.nc;U=0;W=a.Ta.Je[19]&15;for(za=a.wi>a.eb?a.wi-a.eb-W>>3:0;c<n;){ga=c++-a.Va;ga=e[ga];xa=8;W?d?(N=a.eb-d,xa>N&&(xa=N)):(ga<<=W,xa-=W,a.jf=!1):(a.jf&&ga===a.Dc[m]?(d+=xa,xa=0):a.Dc[m]=ga,m++);if(xa){d<w&&(w=d);for(N=0;N<xa;N++)Va=bj[ga&-2139062144]||0,Bj(a.pi,d++,v,p[Va]),ga<<=1;d>G&&(G=d);v<L&&(L=v);v>=U&&(U=v+1)}if(d>=a.eb){d=0;if(++v>a.nc)break;c+=za}}W||(a.jf=!0);w<a.eb&&(a.Nf.putImageData(a.pi,0,0,w,L,G-w,U-L),a.Uc.drawImage(a.Lf,0,0,a.eb,a.nc,0,0,a.xd,a.Sd))}}}}
            function Hj(a,b){var c=0,d=Dc(a.U)-b.tn;0>d&&(d=0);d%b.Ik>b.Sp&&(c|=1);d%b.rn>b.Up&&(c|=9);return c}f.mp=function(){var a=this.gd,b;a.vc&&(b=a.zc);return b};f.Nq=function(a,b){var c=this.gd;c.zj=c.zc;c.zc=b&31};f.lp=function(){return Ij(this.gd)};f.Mq=function(a,b){Jj(this,this.gd,b)};f.np=function(){return this.gd.Nc};f.Oq=function(a,b){this.gd.Nc=b;wj(this,!1)};f.op=function(){return Kj(this,this.gd)};f.An=function(a,b){this.X.Ej=this.X.Ej&-4|b&3};
            f.hn=function(){var a=this.X.te?this.X.Je[this.X.sf&31]:this.X.sf;this.X.te=!this.X.te;return a};f.zn=function(a,b){var c=this.X.sf&32;if(this.X.te){var d=this.X.sf&31;if(16<=d||!c)this.X.Je[d]=b;this.X.te=!1}else this.X.sf=b,this.X.te=!0,b&32&&!c&&uj(this)&&wc(this,!0),this.X.jh=(this.X.Ab[12]<<8)+this.X.Ab[13]|0};
            f.yp=function(){var a=0;if(5==this.qb)a=3-((this.X.sh&12)>>2),a=(this.Mh&1<<a)<<4-a;else{var b=this.X.qh[0];45!=(b&63)&&2880!=(b&4032)&&184320!=(b&258048)&&(a|=16)}a|=this.X.Yl&-17;return this.X.Yl=a};f.Pq=function(a,b){this.X.sh=b;tj(this)};f.zp=function(){return this.X.Zl};f.Zq=function(a,b){this.X.Zl=b};f.xp=function(){return this.X.lg};f.Xq=function(a,b){this.X.lg=b};f.wp=function(){return this.X.th[this.X.lg]};
            f.Wq=function(a,b){this.X.th[this.X.lg]=b;switch(this.X.lg){case 2:this.X.fb=aj[b&15];break;case 4:this.md(Fj(this))}};f.$o=function(){return this.X.Ul};f.zq=function(a,b){this.X.Ul=b};f.ap=function(){return this.X.Cj};f.Aq=function(a,b){this.X.Ed=b;this.X.Cj=3;this.X.Ac=0};f.Bq=function(a,b){this.X.Ed=b;this.X.Cj=0;this.X.Ac=0};f.Zo=function(){var a=this.X.qh[this.X.Ed]>>this.X.Ac&63;this.X.Ac+=6;12<this.X.Ac&&(this.X.Ac=0,this.X.Ed=this.X.Ed+1&255);return a};
            f.yq=function(a,b){this.X.qh[this.X.Ed]=this.X.qh[this.X.Ed]&~(63<<this.X.Ac)|(b&63)<<this.X.Ac;this.X.Ac+=6;12<this.X.Ac&&(this.X.Ac=0,this.X.Ed=this.X.Ed+1&255)};f.Ap=function(){return this.X.Ej};f.Iq=function(a,b){this.X.Gn=b};f.Bp=function(){return this.X.sh};f.Hq=function(a,b){this.X.Fn=b};f.fp=function(){return this.X.jg};f.Gq=function(a,b){this.X.jg=b};f.ep=function(){return this.X.ig[this.X.jg]};
            f.Fq=function(a,b){this.X.ig[this.X.jg]=b;switch(this.X.jg){case 0:this.X.pj=aj[b&15];this.X.qf=this.X.pj&~this.X.He;break;case 1:this.X.He=~aj[b&15];this.X.qf=this.X.pj&~this.X.He;break;case 2:this.X.Gk=aj[b&15]&-2139062144;break;case 3:case 5:this.md(Fj(this));break;case 4:this.X.Pl=(b&3)<<3;break;case 6:wj(this,!1);break;case 7:this.X.Hk=aj[b&15]&-2139062144;break;case 8:this.X.nb=b|b<<8|b<<16|b<<24}};f.Uo=function(){var a=this.kc,b;a.vc&&(b=a.zc);return b};
            f.sq=function(a,b){var c=this.kc;c.zj=c.zc;c.zc=b&31};f.To=function(){return Ij(this.kc)};f.rq=function(a,b){Jj(this,this.kc,b)};f.Vo=function(){return this.kc.Nc};f.tq=function(a,b){this.kc.Nc=b;wj(this,!1)};f.So=function(){return this.kc.oh};f.qq=function(a,b){this.kc.oh!==b&&(this.kc.oh=b,Gj(this))};f.Wo=function(){return Kj(this,this.kc)};function Ij(a){var b;a.vc&&a.zc<a.Fk&&(b=a.Ab[a.zc]);return b}
            function Jj(a,b,c){b.zc<b.Fk&&(b.Ab[b.zc]=c,(12==b.zc||13==b.zc)&&Hj(a,b)&1&&(b.jh=(b.Ab[12]<<8)+b.Ab[13]|0),9==b.zc&&8!=b.zj&&wj(a,!0),xj(a))}function Kj(a,b){var c=Hj(a,b);b===a.X?(c|=b.ta&48^48,b.te=!1):c=(b.ta^=9)|240;return b.ta=c}
            var jj={948:Y.prototype.mp,949:Y.prototype.lp,952:Y.prototype.np,954:Y.prototype.op},kj={948:Y.prototype.Nq,949:Y.prototype.Mq,952:Y.prototype.Oq},lj={980:Y.prototype.Uo,981:Y.prototype.To,984:Y.prototype.Vo,985:Y.prototype.So,986:Y.prototype.Wo},mj={980:Y.prototype.sq,981:Y.prototype.rq,984:Y.prototype.tq,985:Y.prototype.qq},nj={960:Y.prototype.hn,961:Y.prototype.hn,962:Y.prototype.yp,964:Y.prototype.xp,965:Y.prototype.wp,974:Y.prototype.fp,975:Y.prototype.ep},oj={954:Y.prototype.An,960:Y.prototype.zn,
            961:Y.prototype.zn,962:Y.prototype.Pq,964:Y.prototype.Xq,965:Y.prototype.Wq,970:Y.prototype.Iq,972:Y.prototype.Hq,974:Y.prototype.Gq,975:Y.prototype.Fq,986:Y.prototype.An},pj={963:Y.prototype.zp,966:Y.prototype.$o,967:Y.prototype.ap,969:Y.prototype.Zo,970:Y.prototype.Ap,972:Y.prototype.Bp},qj={963:Y.prototype.Zq,966:Y.prototype.zq,967:Y.prototype.Aq,968:Y.prototype.Bq,969:Y.prototype.yq};
            Ea(function(){for(var a=Xa(window.document,"pcjs","video"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),e=window.document.createElement("canvas");if(void 0===e||!e.getContext){c.innerHTML="<br/>Missing &lt;canvas&gt; support. Please try a newer web browser.";break}e.setAttribute("class","pcjs-canvas");e.setAttribute("width",d.screenWidth);e.setAttribute("height",d.screenHeight);e.style.backgroundColor=d.screenColor;e.style.height="auto";0<=(window?window.navigator.userAgent:"").indexOf("MSIE")&&(c.onresize=
            function(a,b,c,d){return function(){b.style.height=(a.clientWidth*d/c|0)+"px"}}(c,e,d.screenWidth,d.screenHeight),c.onresize());c.appendChild(e);var m=window.document.createElement("textarea");ya("iOS")&&(m.setAttribute("autocapitalize","off"),m.setAttribute("autocorrect","off"));c.appendChild(m);var n=e.getContext("2d"),d=new Y(d,e,n,m,c);Wa(d,c)}});
            function Lj(a){this.en=a.adapter;switch(this.en){case 1:this.Sl=1016;this.gh=4;break;case 2:this.Sl=760;this.gh=3;break;default:ra("Unrecognized serial adapter #"+this.en);return}this.pe=null;Ia.call(this,"SerialPort",a,Lj);var b=a.binding,c;a=Mj;b&&(void 0===c&&(c="Panel"),(c=Ta(c,this.id))&&(b=c.qa[b])&&this.Lb(null,a,b))}Qa(Lj);var Mj="buffer";f=Lj.prototype;f.wm=function(a,b){return a==this.Vg?(this.Ae=b,this):null};
            f.Lb=function(a,b,c){var d=this;switch(b){case Mj:return this.qa[b]=this.pe=c,c.onkeydown=function(a){a=a||window.event;var b=a.keyCode;8===b&&(a.preventDefault&&a.preventDefault(),Nj(d,[b]))},c.onkeypress=function(a){a=a||window.event;Nj(d,[a.which||a.keyCode])},!0}return!1};f.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;this.fa=gb(a,"ChipSet");Tb(b,this,Oj,this.Sl);Vb(b,this,Pj,this.Sl);Za(this)};f.gc=function(a,b){if(!b)if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;return!0};
            f.fc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.ye()};f.save=function(){var a=new Zd(this),b=0,c=[];c[b++]=this.bk;c[b++]=this.Cm;c[b++]=this.zf;c[b++]=this.Nh;c[b++]=this.ke;c[b++]=this.Ye;c[b++]=this.td;c[b++]=this.Rc;c[b++]=this.zm;c[b]=this.Ag;a.set(0,c);return a.data()};f.restore=function(a){return this.ye(a[0])};
            f.ye=function(a){var b=0;void 0===a&&(a=[0,0,384,0,1,0,0,96,48,[]]);this.bk=a[b++];this.Cm=a[b++];this.zf=a[b++];this.Nh=a[b++];this.ke=a[b++];this.Ye=a[b++];this.td=a[b++];this.Rc=a[b++];this.zm=a[b++];this.Ag=a[b];return!0};function Nj(a,b){a.Ag=a.Ag.concat(b);Qj(a)}function Qj(a){0<a.Ag.length&&!(a.Rc&1)&&(a.bk=a.Ag.shift(),a.Rc|=1);var b=-1;a.Rc&1&&a.Nh&1&&(b=4);0<=b?(a.ke&=-8,a.ke|=b,a.fa&&a.gh&&Zh(a.fa,a.gh,100)):(a.ke|=1,a.fa&&a.gh&&$h(a.fa,a.gh))}
            f.vp=function(){var a=this.Ye&128?this.zf&255:this.bk;this.Rc&=-2;Qj(this);return a};f.gp=function(){return this.Ye&128?this.zf>>8:this.Nh};f.hp=function(){return this.ke};f.ip=function(){return this.Ye};f.kp=function(){return this.td};f.jp=function(){return this.Rc};f.pp=function(){return this.zm};
            f.Yq=function(a,b){if(this.Ye&128)this.zf=this.zf&-256|b;else{this.Cm=b;this.Rc&=-97;var c;this.pe?(13!=b&&(8==b?this.pe.value=this.pe.value.slice(0,-1):(this.pe.value+=String.fromCharCode(b),this.pe.scrollTop=this.pe.scrollHeight)),c=!0):c=!1;c&&(this.Rc|=96)}};f.Jq=function(a,b){this.Ye&128?this.zf=this.zf&255|b<<8:this.Nh=b};f.Kq=function(a,b){this.Ye=b};
            f.Lq=function(a,b){var c=this.td;this.td=b;if(this.Ae&&(c^b)&3){var c=this.Ae,d=this.td,e=3==(d&3);if(e){if(!c.vc){var m=!1;c.td&2||(c.reset(),c.oc("serial mouse reset"),m=!0);c.td&1||(c.oc("serial mouse ID requested"),m=!0);m&&(Nj(c.Kg,[77,77]),c.oc("serial mouse ID sent"));Rj(c);c.setActive(e)}}else c.vc&&(c.oc("serial mouse inactive"),Sj(c),c.setActive(e));c.td=d}};
            var Oj={0:Lj.prototype.vp,1:Lj.prototype.gp,2:Lj.prototype.hp,3:Lj.prototype.ip,4:Lj.prototype.kp,5:Lj.prototype.jp,6:Lj.prototype.pp},Pj={0:Lj.prototype.Yq,1:Lj.prototype.Jq,3:Lj.prototype.Kq,4:Lj.prototype.Lq};Ea(function(){for(var a=Xa(window.document,"pcjs","serial"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Lj(d);Wa(d,c)}});function Tj(a){Ia.call(this,"Mouse",a,Tj);if(this.Bk=a.serial)this.$l="SerialPort";this.setActive(!1);this.Pg=this.ii=!1;this.ed=[];this.Ef=[];Za(this)}Qa(Tj);f=Tj.prototype;
            f.Lc=function(a,b,c,d){this.za=a;this.la=b;this.U=c;this.Ra=d;for(b=null;b=gb(a,"Video",b);)this.ed.push(b)};f.setActive=function(a){this.vc=a};
            f.gc=function(a,b){if(!b){if(!a||!this.restore)this.reset();else if(!this.restore(a))return!1;if(this.$l&&!this.Kg){for(var c=null;(c=gb(this.za,this.$l,c))&&(!c.wm||!(this.Kg=c.wm(this.Bk,this))););if(this.Kg)for(this.Ef=[],c=0;c<this.ed.length;c++){var d;d=this.ed[c];d.Ae=this;(d=d.Sa)&&this.Ef.push(d)}else ra(this.id+": "+this.$l+" "+this.Bk+" unavailable")}this.vc?Rj(this):Sj(this)}return!0};f.fc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.ye()};
            f.save=function(){var a=new Zd(this);a.set(0,this.dm());return a.data()};f.restore=function(a){return this.ye(a[0])};f.ye=function(a){var b=0;void 0===a&&(a=[!1,-1,-1,0,0,!1,!1,0]);this.setActive(a[b++]);this.ee=a[b++];this.fe=a[b++];this.Af=a[b++];this.Bf=a[b++];this.di=a[b++];this.ei=a[b++];this.td=a[b];return!0};f.dm=function(){var a=0,b=[];b[a++]=this.vc;b[a++]=this.ee;b[a++]=this.fe;b[a++]=this.Af;b[a++]=this.Bf;b[a++]=this.di;b[a++]=this.ei;b[a]=this.td;return b};f.lh=function(a){this.ii=a};
            function Rj(a){if(!a.Pg)for(var b=0;b<a.Ef.length;b++)Uj(a,a.Ef[b])&&(a.Pg=!0)}function Sj(a){if(a.Pg)for(var b=0;b<a.Ef.length;b++){var c=a.Ef[b];c&&(c.style.cursor="auto")}}function Uj(a,b){return b?(b.addEventListener("mousemove",function(b){a.kn(b)},!1),b.addEventListener("mousedown",function(b){a.ik(b.button,!0)},!1),b.addEventListener("mouseup",function(b){a.ik(b.button,!1)},!1),b.style.cursor="none",!0):!1}
            f.kn=function(a){if(this.vc&&this.U&&this.U.ha.Qb){if(0>this.ee||0>this.fe)this.ee=a.clientX,this.fe=a.clientY;this.ii?(this.Af=a.movementX||a.mozMovementX||a.webkitMovementX||0,this.Bf=a.movementY||a.mozMovementY||a.webkitMovementY||0):(this.Af=a.clientX-this.ee,this.Bf=a.clientY-this.fe);(this.Af||this.Bf)&&Vj(this);this.ee=a.clientX;this.fe=a.clientY}};
            f.ik=function(a,b){if(this.vc&&this.U&&this.U.ha.Qb){var c;!(c=!1!==this.ii)&&(c=this.ed.length)&&(c=this.ed[0],c=c.uo?c.mf(!0):!1);c||(this.ii=null);switch(a){case 0:this.di!=b&&(this.di=b,Vj(this));break;case 2:this.ei!=b&&(this.ei=b,Vj(this))}}};function Vj(a){Nj(a.Kg,[64|(a.di?32:0)|(a.ei?16:0)|(a.Bf&192)>>4|(a.Af&192)>>6,a.Af&63,a.Bf&63]);a.Af=a.Bf=0}Ea(function(){for(var a=Xa(window.document,"pcjs","mouse"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Tj(d);Wa(d,c)}});
            function Wj(a,b,c){Ia.call(this,"Disk",{id:a.gn+".disk"+ ++Xj},Wj);this.W=a;this.za=a.za;this.Ra=a.Ra;this.Oa=b;this.Gd=b.name;this.Tf=b.Tf;this.ji=this.Ud=!1;this.create(c,b.rb,b.sb,b.yb,b.ib);this.Ue=[];this.Bh=[];this.ce=null;this.mn=0;this.yk=!1;Za(this)}var Xj=0;Qa(Wj);f=Wj.prototype;f.Lc=function(a,b,c,d){this.Ra=d};f.gc=function(a,b){b||!this.ji||this.Ud||(Za(this,!1),this.load(this.Gd,this.uf,null,this.ro,this));return!0};f.ro=function(){Za(this,!0)};
            f.fc=function(a,b){if(this.Ud){var c,d=0;if(this.yk&&!sa("Disk writes are still in progress, shut down anyway?"))return!1;for(;c=Yj(this,!1);)if(d=c[0]){this.W.wa('Unable to save "'+this.Gd+'" (error '+d+")");break}b&&this.Ud&&(c="action=close&volume="+this.uf,c+="&machine="+this.W.Vf(),c+="&user="+this.W.ve(),pa(qa()+"/api/v1/disk?"+c,!0),this.Ud=!1);!d&&a&&this.W.wa(this.Gd+" saved")}return!0};
            f.create=function(a,b,c,d,e){this.mode=a;this.rb=b;this.sb=c;this.yb=d;this.ib=e;this.Ua=[];if("preload"!=this.mode){a=Array(this.rb);for(b=0;b<a.length;b++){c=Array(this.sb);for(d=0;d<c.length;d++){e=Array(this.yb);for(var m=1;m<=e.length;m++)e[m-1]=Zj(null,b,d,m,this.ib,"local"==this.mode?0:null);c[d]=e}a[b]=c}this.Ua=a}this.Pf=null};
            f.load=function(a,b,c,d,e){var m=b;if(!this.lf)if(this.Gd=a,this.uf=b,this.lf=d,this.lo=e||this.W,c){var n=this,p=new FileReader;p.onload=function(){var a=p.result,b,c=a?a.byteLength:0,d=ba[c];if(d){n.rb=d[0];n.sb=d[1];n.yb=d[2];n.ib=512;b=n.ib>>2;var e=d=0,a=new DataView(a,0,c);n.Ua=Array(n.rb);for(c=0;c<n.Ua.length;c++)for(var m=n.Ua[c]=Array(n.sb),W=0;W<m.length;W++)for(var za=m[W]=Array(n.yb),ga=0;ga<za.length;ga++){for(var xa=Zj(null,c,W,ga+1,n.ib,0),Va=xa.data,Rb=0;Rb<b;Rb++,e+=4)var Lc=Va[Rb]=
            a.getInt32(e,!0),d=d+Lc&-1;xa.Ic=b;za[ga]=xa}n.Pf=d;b=n}else n.wa("Unrecognized diskette format ("+c+" bytes)");n.lf&&(n.lf.call(n.W,n.Oa,b,n.Gd,n.uf),n.lf=null)};p.readAsArrayBuffer(c)}else 0>b.indexOf("/api/v1/dump")&&(a=ha(b),"json"==a?m=encodeURI(b):"demandrw"==this.mode||"demandro"==this.mode?(m=ak(this,b),this.ji=!0):(c="path",d="&mbhd=10",!b.indexOf("http:")||!b.indexOf("ftp:")||0<="dsk ima img 360 720 12 144".split(" ").indexOf(a)?(c="disk",d="&mbhd=0"):-1!==b.indexOf("/",b.length-1)&&(c=
            "dir"),m=qa()+"/api/v1/dump?"+c+"="+encodeURIComponent(b)+(this.Tf?"":d)+"&format=json")),pa(m,!0,null,this,this.po,b)};
            f.po=function(a,b,c,d){var e=null;this.Uf=!1;var m=0>c&&this.za&&!this.za.ha.dc;if(this.ji)c?this.W.wa('Unable to connect to disk "'+d+'" (error '+c+": "+b+")",m):(this.Ud=!0,e=this);else if(c)this.W.wa('Unable to load disk "'+this.Gd+'" (error '+c+")",m);else try{if(0<fa(a,!0).toLowerCase().indexOf("-readonly"))this.Uf=!0;else{var n=b.indexOf("\n");0<n&&1024>n&&0<b.substring(0,n).indexOf("write-protected")&&(this.Uf=!0)}var p;p="<"==b.substr(0,1)?["Missing disk image: "+this.Gd]:0>b.indexOf("0x")&&
            '["'!=b.substr(0,2)?JSON.parse(b.replace(/([a-z]+):/gm,'"$1":').replace(/\/\/[^\n]*/gm,"")):eval("("+b+")");if(p.length)if(1==p.length)ra(p[0]);else{this.rb=p.length;this.sb=p[0].length;this.yb=p[0][0].length;var v=p[0][0][0];this.ib=v&&v.length||512;for(b=a=0;b<this.rb;b++)for(c=0;c<this.sb;c++)for(d=0;d<this.yb;d++)if(v=p[b][c][d]){var w=v.length;void 0===w&&(w=v.length=512);var w=w>>2,G=v.pattern;void 0===G&&(G=v.pattern=0);var N=v.data;if(void 0===N){var L=v.bytes;if(void 0!==L&&L.length){for(var m=
            w<<2,U=L.length;U<m;U++)L[U]=G;this.fill(v,L,0)}else N=[],G=v.pattern=G|G<<8|G<<16|G<<24,v.data=N;delete v.bytes}Zj(v,b,c);for(m=0;m<N.length;m++)a=a+N[m]&-1}this.Ua=p;this.Pf=a;e=this}else ra("Empty disk image: "+this.Gd)}catch(W){ra("Disk image error: "+W.message)}this.lf&&(this.lf.call(this.lo,this.Oa,e,this.Gd,this.uf),this.lf=null)};function Zj(a,b,c,d,e,m){a||(a={sector:d,length:e,data:[],pattern:m});a.Eo=b;a.Go=c;a.hd=a.Ic=0;a.Ka=!1;return a}
            function ak(a,b){var c;c="action=open&volume="+b+("&mode="+a.mode);c+="&chs="+a.rb+":"+a.sb+":"+a.yb+":"+a.ib;c+="&machine="+a.W.Vf();c+="&user="+a.W.ve();return qa()+"/api/v1/disk?"+c}function bk(a,b,c,d,e,m,n){if(a.Ud){var p;p="action=read&volume="+a.uf;p+="&chs="+a.rb+":"+a.sb+":"+a.yb+":"+a.ib;p=p+("&addr="+b+":"+c+":"+d+":"+e)+("&machine="+a.W.Vf());p+="&user="+a.W.ve();pa(qa()+"/api/v1/disk?"+p,m,null,a,a.so,[b,c,d,e,m,n])}else n&&n(-1,!1)}
            f.so=function(a,b,c,d){var e=!1;a=d[0];var m=d[1],n=d[2],p=d[3];if(!c){b=JSON.parse(b);for(e=0;p--;){var v=this.seek(a,m,n,!0);if(!v)break;this.fill(v,b,e);e+=v.length;n++}e=d[4]}(d=d[5])&&d(c,e)};f.to=function(a,b,c,d){a=d[0];b=d[1];var e=d[2],m=d[3];d=d[4];this.yk=!1;if(0<=a&&a<this.Ua.length&&0<=b&&b<this.Ua[a].length)for(--e;0<m--&&0<=e&&e<this.Ua[a][b].length;e++){var n=this.Ua[a][b][e];c?ck(this,n,!1):n.Ka||(n.hd=n.Ic=0)}d&&dk(this)};
            function ck(a,b,c){b.Ka=!0;var d=a.Ue.indexOf(b);0<=d&&(a.Ue.splice(d,1),a.Bh.splice(d,1));a.Ue.push(b);a.Bh.push(ka());c&&dk(a)}function dk(a){if(a.Ue.length){var b=a.Bh[0]+2E3;a.ce&&a.mn<b&&(clearTimeout(a.ce),a.ce=null);if(!a.ce){var c=ka(),b=b-c;0>b&&(b=0);2E3<b&&(b=2E3);a.ce=setTimeout(function(){Yj(a,!0)},b);a.mn=c+b}}else a.ce&&(clearTimeout(a.ce),a.ce=null)}
            function Yj(a,b){b&&(a.ce=null);var c=a.Ue[0];if(c){for(var d=c.Eo,e=c.Go,c=c.sector,m=0,n=[],p=c-1;p<a.Ua[d][e].length;p++){var v=a.Ua[d][e][p];if(!v.Ka)break;var w=a.Ue.indexOf(v);a.Ue.splice(w,1);a.Bh.splice(w,1);n=n.concat(ek(v));v.Ka=!1;m++}a.Ud?(p={},a.yk=!0,p.action="write",p.volume=a.uf,p.chs=a.rb+":"+a.sb+":"+a.yb+":"+a.ib,p.addr=d+":"+e+":"+c+":"+m,p.machine=a.W.Vf(),p.user=a.W.ve(),p.data=JSON.stringify(n),d=pa(qa()+"/api/v1/disk",b,p,a,a.to,[d,e,c,m,b])):d=!1;return b||d}return!1}
            f.info=function(){return this.Ua.length?[this.Ua.length,this.Ua[0].length,this.Ua[0][0].length,this.Ua[0][0][0].length]:[0,0,0,0]};
            f.seek=function(a,b,c,d,e){var m=null,n=this.Oa,p=this.Ua[a];if(p){var v=p[b];if(!v&&n.Zj&&b<n.sb)for(v=p[b]=Array(n.le),p=0;p<v.length;p++)v[p]=Zj(null,a,b,p+1,n.pb,0);if(v){for(p=0;p<v.length;p++)if(v[p]&&v[p].sector==c){m=v[p];if(null===m.pattern)if(d)m.pattern=0;else{for(d=1;++p<v.length;)null===v[p].pattern&&d++;bk(this,a,b,c,d,null!=e,function(a,b){a&&(m=null);e&&e(m,b)});return e?null:m}break}!m&&n.Zj&&9==n.bb&&(m=v[p]=Zj(null,a,b,n.bb,n.pb,0))}}e&&e(m,!1);return m};
            f.fill=function(a,b,c){for(var d=a.length>>2,e=Array(d),m=0;m<d;m++)e[m]=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24,c+=4;a.data=e};function ek(a){var b=a.length,c=Array(b),d=0,b=b>>2,e=a.data;a=a.pattern;for(var m=0;m<b;m++){var n=m<e.length?e[m]:a;c[d++]=n&255;c[d++]=n>>8&255;c[d++]=n>>16&255;c[d++]=n>>24&255}return c}function fk(a,b){var c=-1;if(a&&b<a.length)var c=a.data,d=b>>2,c=(d<c.length?c[d]:a.pattern)>>((b&3)<<3)&255;return c}
            f.write=function(a,b,c){if(this.Uf)return!1;if(b<a.length){if(c!=fk(a,b)){var d=a.data,e=a.pattern,m=b>>2;b=(b&3)<<3;for(var n=d.length;n<=m;n++)d[n]=e;a.Ic?m<a.hd?(a.Ic+=a.hd-m,a.hd=m):m>=a.hd+a.Ic&&(a.Ic+=m-(a.hd+a.Ic)+1):(a.hd=m,a.Ic=1);d[m]=d[m]&~(255<<b)|c<<b;this.Ud&&ck(this,a,!0)}return!0}return null};
            f.save=function(){var a=0,b=[];b[a++]=[this.uf,this.Pf,this.rb,this.sb,this.yb,this.ib];if(!this.Ud&&!this.Uf)for(var c=this.Ua,d=0;d<c.length;d++)for(var e=0;e<c[d].length;e++)for(var m=0;m<c[d][e].length;m++){var n=c[d][e][m];if(n&&n.Ic){for(var p=[],v=0,w=n.hd,G=n.hd+n.Ic;w<G;)p[v++]=n.data[w++];b[a++]=[d,e,m,n.hd,p]}}return b};
            f.restore=function(a){var b=0,c="unsupported restore format";if(a&&0<a.length){var d=0,e=a[d++];e&&2<=e.length&&(!this.Ua.length&&6<=e.length?this.create("local",e[2],e[3],e[4],e[5]):null!=e[1]&&null!=this.Pf&&e[1]!=this.Pf&&(c="original checksum ("+e[1]+") differs from current checksum ("+this.Pf+")",b=-2));for(this.Ua.length||(b=-1);d<a.length&&0<=b;){var m=0,n=a[d++],p=n[m++],v=n[m++],w=n[m++];if(p>=this.Ua.length||v>=this.Ua[p].length||w>=this.Ua[p][v].length){c="sector (CHS="+p+":"+v+":"+w+") out of range ("+
            b+" changes applied)";b=-1;break}if(this.Uf){c="unable to modify write-protected disk";b=-1;break}e=n[m++];m=n[m++];n=e+m.length;if(p=this.Ua[p][v][w]){for(v=p.data.length;v<e;)p.data[v++]=p.pattern;v=0;p.hd=e;for(p.Ic=m.length;e<n;)p.data[e++]=m[v++];b++}}}0>b&&-2!=b&&this.W.wa("Unable to restore disk '"+this.Gd+": "+c);return b};
            f.toJSON=function(){var a=JSON.stringify(this.Ua),a=a.replace(/,"length":512/gm,"").replace(/,"pattern":0/gm,""),a=a.replace(/"(sector|length|data|pattern)":/gm,"$1:"),a=a.replace(/,"[^"]*":([0-9]+|true|false)/gm,"");return a=a.replace(/(sector|length|data|pattern):/gm,'"$1":')};
            function gk(a){Ia.call(this,"FDC",a,gk);this.dmaRead=this.nk;this.dmaWrite=this.ok;this.dmaFormat=this.mo;this.bf=null;if(a.autoMount&&(this.bf=a.autoMount,"string"==typeof this.bf))try{this.bf=eval("("+a.autoMount+")")}catch(b){ra("FDC auto-mount error: "+b.message+" ("+a.autoMount+")"),this.bf=null}this.Ec=[];this.Tm=!ya("Mobi")&&window&&"FileReader"in window}Qa(gk);g={};aa={};
            var hk={3:{Qd:3,oe:0,name:aa.Bs},4:{Qd:2,oe:1,name:aa.zs},5:{Qd:9,oe:7,name:aa.Ns},6:{Qd:9,oe:7,name:aa.ts},7:{Qd:2,oe:0,name:aa.vs},8:{Qd:1,oe:2,name:aa.As},10:{Qd:2,oe:7,name:aa.us},13:{Qd:6,oe:7,name:aa.es},15:{Qd:3,oe:0,name:aa.ys}};f=gk.prototype;
            f.Lb=function(a,b,c){var d=this;switch(b){case "listDisks":return this.qa[b]=c,c.onchange=function(){var a=d.qa.descDisk,b=c.options[c.selectedIndex];if(a&&b){var n={};if(b=b.getAttribute("data-value"))try{n=eval("({"+b+"})")}catch(p){ra("FDC option error: "+p.message)}b=n.desc;void 0===b&&(b="");n=n.href;void 0!==n&&(b='<a href="'+n+'" target="_blank">'+b+"</a>");a.innerHTML=b}},!0;case "descDisk":case "listDrives":return this.qa[b]=c,c.onchange=function(){var a=ca(c.value,10);null!=a&&ik(d,a)},
            !0;case "loadDrive":return this.qa[b]=c,c.onclick=function(){var a=d.qa.listDisks;a&&jk(d,a.options[a.selectedIndex].text,a.value)},!0;case "mountDrive":return this.Tm?(this.qa[b]=c,c.addEventListener("change",function(){var a=c.children[0];a.children[1].disabled=!a.children[0].files.length}),c.onsubmit=function(a){if(a=a.currentTarget[1].files[0]){var b=a.name;jk(d,fa(b,!0),b,a)}return!1}):c.parentNode.removeChild(c),!0}return!1};
            f.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;this.za=a;this.fa=gb(a,"ChipSet");this.Vd();Tb(b,this,kk);Vb(b,this,lk);this.Tm&&mk(this,"Local Disk","?");mk(this,"Remote Disk","??");this.Eg()||Za(this)};
            f.gc=function(a,b){if(!b){if(!a||!this.restore){if(this.reset(),this.za.vk){this.Ec=[];for(var c=0;c<this.ya.length;c++)nk(this,c,!0);this.Eg(!0)}}else if(!this.restore(a))return!1;if(c=this.qa.listDrives){for(;c.firstChild;)c.removeChild(c.firstChild);c.textContent="";for(var d=0;d<this.Lk;d++){var e=window.document.createElement("option");e.value=d;e.textContent=String.fromCharCode(65+d)+":";c.appendChild(e)}0<this.Lk&&(c.value="0",ik(this,0))}}return!0};
            f.fc=function(a){return a&&this.save?this.save():!0};f.reset=function(){this.Vd()};f.save=function(){var a=new Zd(this);a.set(0,this.am());return a.data()};f.restore=function(a){return this.Vd(a[0])};
            f.Vd=function(a){var b=0,c,d=!0;void 0===a&&(a=[0,0,128,Array(9),0,0,0,[]]);this.cb=a[b++];b++;this.ta=a[b++];this.ic=a[b++];this.Db=a[b++];this.jb=a[b++];this.kg=a[b++];var e=a[b++];c=a[b++];null!=c&&(this.Ec=c);void 0===this.ya&&(this.Lk=4,this.fa&&(this.Lk=Gh(this.fa)),this.ya=Array(4));for(c=0;c<this.ya.length;c++){var m=this.ya[c];if(void 0===m){var m=this.ya[c]={},n;if(this.fa)a:{n=this.fa;if(c<Gh(n)){if(!n.ge){n=360;break a}if(c<n.ge.length){n=n.ge[c];break a}}n=0}else n=0;switch(n){case 160:case 180:m.sb=
            1;default:m.rb=40;m.yb=9;break;case 720:m.rb=80;m.yb=9;break;case 1200:m.rb=80;m.yb=15;break;case 1440:m.rb=80,m.yb=18}}this.Ck(m,c,e[c])||(d=!1)}this.Le=a[b++]||0;this.En=a[b]||0;return d};f.am=function(){var a=0,b=[];b[a++]=this.cb;b[a++]=0;b[a++]=this.ta;b[a++]=this.ic;b[a++]=this.Db;b[a++]=this.jb;b[a++]=this.kg;b[a++]=this.cm();for(var c=a++,d=0;d<this.ya.length;d++){var e=this.ya[d];e.ua&&ok(this,e.vf,e.ua)}b[c]=this.Ec;b[a++]=this.Le;b[a]=this.En;return b};
            f.Ck=function(a,b,c){var d=0,e=!0;a.cb=b;a.Wc=a.Rf=!1;void 0===c&&(c=[192,!0,0,2,0]);"boolean"==typeof c[1]&&(c[1]=["Floppy Drive",a.rb||40,a.sb||c[3],a.yb||9,a.ib||512,c[1],a.yi,a.eh,a.fh]);a.Za=c[d++];var m=c[d++];a.name=m[0];a.rb=m[1];a.sb=m[2];a.yb=m[3];a.ib=m[4];a.Tf=m[5];(a.yi=m[6])?(a.eh=m[7],a.fh=m[8]):(a.yi=a.rb,a.eh=a.sb,a.fh=a.yb);a.Na=c[d++];a.je=c[d++];a.wb=c[d++];a.je=100<=a.je?a.je-100:a.je-a.wb;a.bb=c[d++];a.le=c[d++];a.pb=c[d++];a.Pa=c[d++];a.Ma=null;a.ua||(a.vf="");var n=c[d++];
            102==n&&(n=!1);"boolean"==typeof n?(m=c[d++],c=c[d],n?(d=this.ya[b],nk(this,b,!0,!0),d.Rf=!0,b=new Wj(this,d,"preload"),this.Mm(d,b,m,c,!0)):pk(this,b,m,c,!0)?a.ua&&c&&qk(this,m,c,a.ua):Za(this,!1)):void 0!==n&&a.ua&&0>a.ua.restore(n)&&(e=!1);e&&a.ua&&void 0!==a.Pa&&(a.Ma=a.ua.seek(a.wb,a.Na,a.bb));return e};f.cm=function(){for(var a=0,b=[],c=0;c<this.ya.length;c++)b[a++]=this.bm(this.ya[c]);return b};
            f.bm=function(a){var b=0,c=[];c[b++]=a.Za;c[b++]=[a.name,a.rb,a.sb,a.yb,a.ib,a.Tf,a.yi,a.eh,a.fh];c[b++]=a.Na;c[b++]=a.je+100;c[b++]=a.wb;c[b++]=a.bb;c[b++]=a.le;c[b++]=a.pb;c[b++]=a.Pa;c[b++]=a.Rf;c[b++]=a.Ln;c[b]=a.vf;return c};f.Eg=function(a){a||(this.Ze=0);if(this.bf)for(var b in this.bf){var c=this.bf[b];if(c.name&&c.path){var d=b.charCodeAt(0)-65;if(0<=d&&d<this.ya.length){!pk(this,d,c.name,c.path,!0)&&a&&Za(this,!1);continue}}this.wa("Unrecognized auto-mount specification for drive "+b)}return!!this.Ze};
            function jk(a,b,c,d){var e,m=a.qa.listDrives;if(m&&!isNaN(e=ca(m.value,10))&&0<=e&&e<a.ya.length)if(c)if("?"==c)a.wa('Use "Choose File" and "Mount" to select and load a local disk.');else{if("??"==c){c=window.prompt("Enter the URL of a remote disk image.","")||"";if(!c)return;b=fa(c);a.pc("Attempting to load "+c+' as "'+b+'"')}for(a.pc("loading disk "+c+"...");pk(a,e,b,c,!1,d)&&window.confirm("Click OK to reload the original disk.\n(WARNING: All disk changes will be discarded)");){for(var m=a,n=c,
            p=void 0,p=0;p<m.Ec.length;p++)if(m.Ec[p][1]==n){m.Ec.splice(p,1);break}nk(a,e,!1,!0)}}else nk(a,e);else a.wa("Nothing to load")}function pk(a,b,c,d,e,m){var n=a.ya[b];if(d&&n.vf!=d){nk(a,b,e,!0);if(n.Wc)return a.wa("Drive "+b+" busy"),!0;n.Wc=!0;e&&(n.hf=!0,a.Ze++);n.Rf=!!m;(new Wj(a,n,"preload")).load(c,d,m,a.Mm);return!1}return!0}
            f.Mm=function(a,b,c,d,e){var m;a.Wc=!1;b&&(m=b.info(),b&&m[0]>a.rb||m[1]>a.sb)&&(this.wa('Diskette "'+c+'" too large for drive '+String.fromCharCode(65+a.cb)),b=null);b?(a.ua=b,a.Ln=c,a.vf=d,qk(this,c,d,b),m=b.info(),this.Le|=128,this.wa('Mounted diskette "'+c+'" in drive '+String.fromCharCode(65+a.cb),a.hf||e),a.yi=m[0],a.eh=m[1],a.fh=m[2]):a.Rf=!1;a.hf&&(a.hf=!1,--this.Ze||Za(this));ik(this,a.cb)};
            function mk(a,b,c){if(a=a.qa.listDisks){for(var d=0;d<a.options.length;d++)if(a.options[d].value==c)return;d=window.document.createElement("option");d.value=c;d.textContent=b;a.appendChild(d)}}function ik(a,b){if(0<=b&&b<a.ya.length){var c=a.ya[b],d=a.qa.listDisks,e=a.qa.listDrives;if(d&&e&&(e=ca(e.value,10),c=c.Rf?"?":c.vf,!isNaN(e)&&e==b)){for(e=0;e<d.options.length;e++)if(d.options[e].value==c){d.selectedIndex!=e&&(d.selectedIndex=e);break}e==d.options.length&&(d.selectedIndex=0)}}}
            function nk(a,b,c,d){var e=a.ya[b];e.ua&&(ok(a,e.vf,e.ua),e.Ln="",e.vf="",e.ua=null,e.Rf=!1,a.Le|=128,d||a.wa("Drive "+String.fromCharCode(65+b)+" unloaded",c),c||d||ik(a,b))}function qk(a,b,c,d){var e;for(e=0;e<a.Ec.length;e++)if(a.Ec[e][1]==c){d.restore(a.Ec[e][2]);return}a.Ec[e]=[b,c,[]]}function ok(a,b,c){var d;for(d=0;d<a.Ec.length;d++)if(a.Ec[d][1]==b){a.Ec[d][2]=c.save();break}}f.Eq=function(a,b){b&4?this.kg&4||this.kg&8&&this.fa&&Zh(this.fa,6):this.Vd();this.kg=b};f.dp=function(){return this.ta};
            f.bp=function(){var a=0;this.Db<this.jb&&(a=this.ic[this.Db]);this.kg&8&&this.fa&&$h(this.fa,6);++this.Db>=this.jb&&(this.ta&=-81,this.Db=this.jb=0);return a};
            f.Dq=function(a,b){this.jb<this.ic.length&&(this.ic[this.jb++]=b);var c=this.ic[0]&31;if(void 0!==hk[c]&&this.jb>=hk[c].Qd){var d=!1;this.Db=0;var c=this.La(),e,m,n,p,v,w=c&31;switch(w){case 3:this.La(g.Cs);this.La(g.hs);this.Yb();break;case 4:m=this.La(g.sg);this.cb=m&3;e=this.ya[this.cb];this.Yb();this.hc((e.Za&-16777216)>>>24,g.Fs);break;case 5:case 6:m=this.La(g.sg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];e.Na=d;m=e.wb=this.La(g.jm);n=this.La(g.km);p=e.bb=this.La(g.mm);v=this.La(g.Qj);e.pb=128<<
            v;e.le=this.La(g.cs);this.La(g.Yn);this.La(g.as);6==w?(w=e,w.Za=72,w.ua&&(w.Ma=null,w.Za=0,this.fa&&(Th(this.fa,2,this,"dmaRead",w),Ph(this.fa,2)))):(w=e,w.Za=72,w.ua&&(w.ua.Uf?w.Za=576:(w.Ma=null,w.Za=0,this.fa&&(Th(this.fa,2,this,"dmaWrite",w),Ph(this.fa,2)))));rk(this,e,c,d,m,n,p,v);d=!0;break;case 7:m=this.La(g.sg);this.cb=m&3;e=this.ya[this.cb];e.wb=e.je=0;e.Za=268435488;this.Yb();d=!0;break;case 8:e=this.ya[this.cb];e.Na=0;this.Yb();this.hc(e.cb|e.Na<<2|e.Za&255,g.$n);this.hc(e.wb,g.rs);this.cb=
            this.cb+1&3;break;case 10:m=this.La(g.sg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];m=e.wb;n=e.Na=d;p=e.bb=1;v=0;e.Za=0;e.ua&&(e.Ma=e.ua.seek(e.wb,e.Na,e.bb))?v=e.Ma.length:e.Za=72;rk(this,e,c,d,m,n,p,v);d=!0;break;case 13:m=this.La(g.sg);d=m>>2&1;this.cb=m&3;e=this.ya[this.cb];m=e.wb;n=e.Na=d;p=1;v=this.La(g.Qj);e.pb=128<<v;e.le=this.La(g.xs);this.La(g.Yn);e.ym=this.La(g.Xn);w=e;w.Za=72;w.ua&&(w.Ma=null,w.Za=0,this.fa&&(w.Mf=0,w.Pc=Array(4),w.Zj=!0,w.Vh=0,Th(this.fa,2,this,"dmaFormat",w),Ph(this.fa,
            2),w.Zj=!1));rk(this,e,c,d,m,n,p,v);d=!0;break;case 15:m=this.La(g.sg),this.cb=m&3,e=this.ya[this.cb],e.Na=m>>2&1,m=this.La(g.os),e.wb+=m-e.je,0>e.wb&&(e.wb=0),e.wb>=e.rb&&(e.wb=e.rb-1),e.je=m,e.Za=32,e.wb||(e.Za|=268435456),this.Yb(),d=!0}0<this.jb&&(this.ta|=80);this.kg&8&&(!e||e.Za&8||!d||this.fa&&Zh(this.fa,6))}};f.cp=function(){var a=this.Le;this.Le&=-129;return a};f.Cq=function(a,b){this.En=b};
            function rk(a,b,c,d,e,m,n,p){a.Yb();a.hc(b.cb|b.Na<<2|b.Za&255,g.$n);a.hc((b.Za&65280)>>>8,g.Ds);a.hc((b.Za&16711680)>>>16,g.Es);var v=0;if(e!=b.wb||m!=b.Na)v=n=1;c&128&&(m^=v,d||(v=0));a.hc(e+v,g.jm);a.hc(m,g.km);a.hc(n,g.mm);a.hc(p,g.Qj)}f.La=function(){var a=this.ic[this.Db];this.Db++;return a};f.Yb=function(){this.Db=this.jb=0};f.hc=function(a){this.ic[this.jb++]=a};f.nk=function(a,b,c){void 0===b||0>b?this.fg(a,c):c(-1,!1)};f.ok=function(a,b){return void 0!==b&&0<=b?this.rg(a,b):-1};
            f.mo=function(a,b){return void 0!==b&&0<=b?this.gm(a,b):-1};f.fg=function(a,b){var c=-1,d=null,e=0;if(!a.Za&&a.ua){do{if(a.Ma&&(e=a.Pa,0<=(c=fk(a.Ma,a.Pa++)))){d=a.Ma;break}a.Ma=a.ua.seek(a.wb,a.Na,a.bb);if(!a.Ma){a.Za=1088;break}a.Pa=0;this.Dg(a)}while(1)}b(c,!1,d,e)};f.rg=function(a,b){if(a.Za||!a.ua)return-1;do{if(a.Ma&&a.ua.write(a.Ma,a.Pa++,b))break;a.Ma=a.ua.seek(a.wb,a.Na,a.bb);if(!a.Ma){a.Za=8256;b=-1;break}a.Pa=0;this.Dg(a)}while(1);return b};
            f.Dg=function(a){a.bb++;a.bb>=a.fh+1&&(a.bb=1,a.Na++,a.Na>=a.eh&&(a.Na=0,a.wb++))};f.gm=function(a,b){if(a.Za)return-1;a.Pc[a.Mf++]=b;if(a.Mf==a.Pc.length){a.wb=a.Pc[0];a.Na=a.Pc[1];a.bb=a.Pc[2];a.pb=128<<a.Pc[3];for(var c=a.Mf=0;c<a.pb;c++)if(0>this.rg(a,a.ym))return-1;a.Vh++}a.Vh>=a.le&&(b=-1);return b};var kk={1012:gk.prototype.dp,1013:gk.prototype.bp,1015:gk.prototype.cp},lk={1010:gk.prototype.Eq,1013:gk.prototype.Dq,1015:gk.prototype.Cq};
            Ea(function(){for(var a=Xa(window.document,"pcjs","fdc"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new gk(d);Wa(d,c)}});function Z(a){Ia.call(this,"HDC",a,Z);this.dmaRead=this.nk;this.dmaWrite=this.ok;this.dmaWriteBuffer=this.no;this.dmaWriteFormat=this.oo;this.Tj=[];if(a.drives)try{this.Tj=eval("("+a.drives+")")}catch(b){ra("HDC drive configuration error: "+b.message+" ("+a.drives+")")}this.Ug=(this.gf="at"==a.type)?1:0;this.Fo=this.gf?2:3}Qa(Z);
            var sk=[{0:[306,2],1:[375,8],2:[306,6],3:[306,4]},{1:[306,4],2:[615,4],3:[615,6],4:[940,8],5:[940,6],6:[615,4],7:[462,8],8:[733,5],9:[900,15],10:[820,3],11:[855,5],12:[855,7],13:[306,8],14:[733,7]}];f=Z.prototype;f.Lb=function(){return!1};f.Lc=function(a,b,c,d){this.la=b;this.U=c;this.Ra=d;this.za=a;this.fa=gb(a,"ChipSet");Tb(b,this,this.gf?tk:uk);Vb(b,this,this.gf?vk:wk);Wd(c,19,this,this.Fp);Wd(c,64,this,this.Gp);this.reset();this.Eg()||Za(this)};
            f.gc=function(a,b){if(!b)if(!a||!this.restore)this.Vd(),this.za.vk&&this.Eg(!0);else if(!this.restore(a))return!1;return!0};f.fc=function(a){return a&&this.save?this.save():!0};f.Vf=function(){return this.za?this.za.Vf():""};f.ve=function(){return this.za?this.za.ve():""};f.reset=function(){this.Vd(null,!0)};f.save=function(){var a=new Zd(this);a.set(0,this.am());return a.data()};f.restore=function(a){return this.Vd(a[0])};
            f.Vd=function(a,b){var c=0,d=!0;if(this.gf)null==a&&(a=[0,0,0,0,0,0,0,0,64,0]),this.Ke=a[c++],this.Kn=a[c++],this.Me=a[c++],this.Fj=a[c++],this.Bj=a[c++],this.Aj=a[c++],this.hg=a[c++],this.ta=a[c++],this.Tl=a[c++],this.Dj=a[c++];else{null==a&&(a=[0,0,Array(14),0,0]);this.ph=a[c++];this.ta=a[c++];this.ic=a[c++];this.Db=a[c++];this.jb=a[c++];this.Jn=a[c++];this.In=a[c++];this.Hn=a[c++];var e=a[c++];void 0!==e?this.Xf=e:void 0===this.Xf&&(this.Xf=-1)}void 0===this.ya&&(this.ya=Array(this.Tj.length));
            c=a[c];void 0===c&&(c=[]);for(e=0;e<this.ya.length;e++){void 0===this.ya[e]&&(this.ya[e]={});var m=this.ya[e];this.Ck(e,m,this.Tj[e],c[e],b)||(d=!1);null!=this.ph&&1>=e&&(this.ph|=(m.type&3)<<(1-e<<1))}return d};
            f.am=function(){var a=0,b=[];this.gf?(b[a++]=this.Ke,b[a++]=this.Kn,b[a++]=this.Me,b[a++]=this.Fj,b[a++]=this.Bj,b[a++]=this.Aj,b[a++]=this.hg,b[a++]=this.ta,b[a++]=this.Tl,b[a++]=this.Dj):(b[a++]=this.ph,b[a++]=this.ta,b[a++]=this.ic,b[a++]=this.Db,b[a++]=this.jb,b[a++]=this.Jn,b[a++]=this.In,b[a++]=this.Hn,b[a++]=this.Xf);b[a]=this.cm();return b};
            f.Ck=function(a,b,c,d,e){var m=0,n=!0;void 0===d&&(d=[0,0,!1,Array(8)]);b.cb=a;b.errorCode=d[m++];b.Pn=d[m++];b.Tf=d[m++];b.Gf=d[m++];b.Hf=d[m++];b.Na=d[m++];b.sb=d[m++];b.Re=d[m++];b.bb=d[m++];b.le=d[m++];b.pb=d[m++];b.Sh=this.gf?0:1;b.name=c.name;void 0===b.name&&(b.name="Hard Drive");b.path=c.path;b.mode=c.mode||(b.path?"preload":"local");"demandro"!=b.mode&&"demandrw"!=b.mode||this.ve()||(b.mode="local");b.type=c.type;if(void 0===b.type||void 0===sk[this.Ug][b.type])b.type=this.Fo;c=sk[this.Ug][b.type];
            b.yb=c[2]||17;b.ib=c[3]||512;if(e&&this.fa&&(e=this.fa,c=b.type,e.ea)){var p=e.ea[18],p=a?p&240|c:p&15|c<<4;e.ea&&(e.ea[18]=p,uh(e))}void 0===b.ua&&(b.ua=null,this.wa("Type "+b.type+' "'+b.name+'" is fixed disk '+a,!0));xk(this,b);b.Pa=d[m++];b.Ma=null;b.ua&&(a=d[m],void 0!==a&&0>b.ua.restore(a)&&(n=!1),n&&void 0!==b.Pa&&(b.Ma=b.ua.seek(b.Re,b.Na,b.bb+b.Sh)));return n};f.cm=function(){for(var a=0,b=[],c=0;c<this.ya.length;c++)b[a++]=this.bm(this.ya[c]);return b};
            f.bm=function(a){var b=0,c=[];c[b++]=a.errorCode;c[b++]=a.Pn;c[b++]=a.Tf;c[b++]=a.Gf;c[b++]=a.Hf;c[b++]=a.Na;c[b++]=a.sb;c[b++]=a.Re;c[b++]=a.bb;c[b++]=a.le;c[b++]=a.pb;c[b++]=a.Pa;c[b]=a.ua?a.ua.save():null;return c};
            function xk(a,b,c){if(b){var d=0,e=0;null==c&&((d=b.Gf[2])?e=b.Gf[0]<<8|b.Gf[1]:c=b.type);null==c||d||(d=sk[a.Ug][c][1],e=sk[a.Ug][c][0]);d&&((c=sk[a.Ug][b.type])&&e!=c[0]&&d!=c[1]&&a.wa("Warning: drive parameters ("+e+","+d+") do not match drive type "+b.type+" ("+c[0]+","+c[1]+")"),b.rb=e,b.sb=d,null==b.ua&&(b.ua=new Wj(a,b,b.mode)))}}
            f.Eg=function(a){a||(this.Ze=0);for(var b=0;b<this.ya.length;b++){var c=this.ya[b];if(c.name&&c.path){if(!(a&&c.ua&&c.ua.ji)){var d;d=c.name;var c=c.path,e=this.ya[b];e.Wc?(this.wa("Drive "+b+" busy"),d=!0):(e.Wc=!0,e.hf=!0,this.Ze++,(e.ua||new Wj(this,e,e.mode)).load(d,c,null,this.qo),d=!1);!d&&a&&Za(this,!1)}}else a&&void 0!==c.type&&(c.ua=null,xk(this,c,c.type))}return!!this.Ze};
            f.qo=function(a,b,c){a.Wc=!1;(a.ua=b)&&this.wa('Mounted disk "'+c+'" in drive '+String.fromCharCode(67+a.cb),a.hf);a.hf&&(a.hf=!1,--this.Ze||Za(this))};f.Dp=function(){var a=0;this.Db<this.jb&&(a=this.ic[this.Db]);this.fa&&$h(this.fa,5);this.ta&=-33;++this.Db>=this.jb&&(this.Db=this.jb=0,this.ta&=-15);return a};f.$q=function(a,b){this.jb<this.ic.length&&(this.ic[this.jb++]=b);var c=12!=this.ic[0]?6:this.ic.length;6==this.jb&&(this.ta&=-2);this.jb>=c&&(this.ta|=2,this.ta&=-2,yk(this))};
            f.Ep=function(){var a=this.ta;this.Db<this.jb&&(this.ta|=1);return a};f.cr=function(a,b){this.Jn=b;this.fa&&$h(this.fa,5);this.Vd()};f.Cp=function(){return this.ph};f.br=function(a,b){this.In=b;this.ta=13};f.ar=function(a,b){this.Hn=b};f.Rl=function(){};
            f.Mo=function(){var a=-1;if(this.Oa){var b=this,a=this.fg(this.Oa,function(){});1!=this.Oa.Pa&&this.Oa.Pa==this.Oa.ib&&(this.Oa.pb-=this.Oa.ib,this.Me=this.Me-1&255,this.Oa.pb>=this.Oa.ib?(b.ta=136,this.fg(this.Oa,function(a){0<=a?(zk(b),b.ta=80):(b.ta=1,b.Ke=16)},!1)):this.ta=80)}return a};
            f.kq=function(a,b){this.Oa&&this.Oa.pb>=this.Oa.ib&&(0>this.rg(this.Oa,b)?(this.ta=1,this.Ke=16):1!=this.Oa.Pa&&this.Oa.Pa==this.Oa.ib&&(this.Oa.pb-=this.Oa.ib,this.Me=this.Me-1&255,zk(this),this.ta=80,this.Oa.pb>=this.Oa.ib&&(this.ta|=8)))};f.Oo=function(){return this.Ke};f.pq=function(a,b){this.Kn=b};f.Po=function(){return this.Me};f.nq=function(a,b){this.Me=b};f.Qo=function(){return this.Fj};f.oq=function(a,b){this.Fj=b};f.Lo=function(){return this.Bj};f.jq=function(a,b){this.Bj=b};f.Ko=function(){return this.Aj};
            f.iq=function(a,b){this.Aj=b};f.No=function(){return this.hg};f.lq=function(a,b){this.hg=b;this.ta=this.ya[this.hg&16?1:0]?this.ta|64:this.ta&-65};f.Ro=function(){return this.ta};f.hq=function(a,b){this.Tl=b;this.fa&&$h(this.fa,14);Ak(this)};f.mq=function(a,b){this.Dj&4&&!(b&4)&&(this.Ke=1);this.Dj=b};
            function Ak(a){var b=!1,c=a.Tl,d=a.hg&16?1:0,e=a.hg&15,m=a.Bj|(a.Aj&3)<<8,n=a.Fj,p=a.Me||256;a.Oa=null;a.Ke=0;a.ta=80;(d=a.ya[d])?(d.Re=m,d.Na=e,d.bb=n,d.pb=p*d.ib,c=144<=c?c:c&240,d.Ma=null,d.Pa=0,d.errorCode=0,a.Oa=d):c=-1;switch(c&240){case 32:a.ta=136;a.fg(d,function(b){0<=b&&a.fa?(zk(a),a.ta=80):(a.ta=1,a.Ke=16)},!1);break;case 48:a.ta=8;break;case 16:b=!0;break;case 64:b=!0;break;case 144:a.Ke=1;b=!0;break;case 145:d.sb=e+1,d.yb=p,b=!0}b&&zk(a)}
            function zk(a){!a.fa||a.Dj&2||Zh(a.fa,14,120)}
            function yk(a){a.Db=0;var b=a.La(),c=a.La(),d=c&32,e=d>>5,m=c&31,n=a.La(),p=a.La(),v=n<<2&768|p,w=n&63,G=a.La(),N=a.La(),L=a.ya[e];L&&(L.Re=v,L.Na=m,L.bb=w,L.pb=G*L.ib);switch(b){case 3:a.Yb(L?L.errorCode:4);a.hc(c);a.hc(n);a.hc(p);a.hc(0|d);b=-1;break;case 12:for(c=0;0<=(b=a.La());)L&&c<L.Gf.length&&(L.Gf[c++]=b);L&&xk(a,L);b=0;L||a.Xf!=e||(a.Xf=-1,b=2);a.Yb(b|d);b=-1;break;case 224:case 228:a.Yb(0|d),b=-1}if(0<=b)switch(void 0===L?b=-1:(L.errorCode=0,L.Pn=0),b){case 0:a.Yb(0|d);break;case 1:L.Us=
            N;a.Yb(0|d);break;case 5:a.Yb(0|d);break;case 8:Bk(a,L,function(b){a.Yb(b|d)});break;case 10:Ek(a,L,function(b){a.Yb(b|d)});break;case 15:Fk(a,L,function(b){a.Yb(b|d)});break;default:a.Yb(2|d)}}f.La=function(){var a=-1;this.Db<this.jb&&(a=this.ic[this.Db++]);return a};f.Yb=function(a){this.Db=this.jb=0;void 0!==a&&this.hc(a);this.fa&&Zh(this.fa,5);this.ta|=32};f.hc=function(a){this.ic[this.jb++]=a};f.nk=function(a,b,c){void 0===b||0>b?this.fg(a,c):c(-1,!1)};
            f.ok=function(a,b){return void 0!==b&&0<=b?this.rg(a,b):-1};f.no=function(a,b){var c;void 0!==b&&0<=b?(c=b,a.Pa<a.Hf.length?a.Hf[a.Pa++]=c:(a.errorCode=20,c=-1)):c=-1;return c};f.oo=function(a,b){return void 0!==b&&0<=b?this.gm(a,b):-1};function Bk(a,b,c){b.errorCode=4;if(b.ua&&(b.Ma=null,a.fa)){b.errorCode=0;Th(a.fa,3,a,"dmaRead",b);Ph(a.fa,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}
            function Ek(a,b,c){b.errorCode=4;if(b.ua&&(b.Ma=null,a.fa)){b.errorCode=0;Th(a.fa,3,a,"dmaWrite",b);Ph(a.fa,3,function(a){a||(0==b.errorCode&&(b.errorCode=4),20==b.errorCode&&(b.errorCode=0));c(b.errorCode?2:0)});return}c(b.errorCode?2:0)}function Fk(a,b,c){b.errorCode=4;b.Hf&&b.Hf.length==b.pb||(b.Hf=Array(b.pb));b.Pa=0;a.fa?(b.errorCode=0,Th(a.fa,3,a,"dmaWriteBuffer",b),Ph(a.fa,3,function(a){a||0!=b.errorCode||(b.errorCode=4);c(b.errorCode?2:0)})):c(b.errorCode?2:0)}
            f.fg=function(a,b,c){var d=-1,e=null,m=0;if(a.errorCode)return b&&b(d,!1,e,m),d;var n=!1!==c?1:0;if(a.Ma&&(m=a.Pa,d=fk(a.Ma,a.Pa),a.Pa+=n,0<=d))return e=a.Ma,b&&b(d,!1,e,m),d;if(b){var p=this;if(a.ua)return a.ua.seek(a.Re,a.Na,a.bb+a.Sh,!1,function(c,w){(a.Ma=c)?(e=c,m=a.Pa=0,p.Dg(a),d=fk(a.Ma,a.Pa),a.Pa+=n):a.errorCode=20;b(d,w,e,m)}),d;a.errorCode=20;b(d,!1,e,m)}return d};
            f.rg=function(a,b){if(a.errorCode)return-1;do{if(a.Ma&&a.ua.write(a.Ma,a.Pa++,b))break;a.ua&&a.ua.seek(a.Re,a.Na,a.bb+a.Sh,!0,function(b){a.Ma=b});if(!a.Ma){a.errorCode=20;b=-1;break}a.Pa=0;this.Dg(a)}while(1);return b};f.Dg=function(a){a.bb++;var b=1-a.Sh;a.bb>=a.yb+b&&(a.bb=b,a.Na++,a.Na>=a.sb&&(a.Na=0,a.Re++))};
            f.gm=function(a,b){if(a.errorCode)return-1;a.Pc[a.Mf++]=b;if(a.Mf==a.Pc.length){a.Re=a.Pc[0];a.Na=a.Pc[1];a.bb=a.Pc[2];a.pb=128<<a.Pc[3];for(var c=a.Mf=0;c<a.pb;c++)if(0>this.rg(a,a.ym))return-1;a.Vh++}a.Vh>=a.le&&(b=-1);return b};f.Fp=function(){var a=this.U.H&255;!(this.U.F>>8)&&128<a&&(this.Xf=a-128);return!0};f.Gp=function(){var a;(a=this.U.F>>8||!this.fa)||(a=!(this.fa.bc[0].sd&64));return a?!0:!1};
            var uk={800:Z.prototype.Dp,801:Z.prototype.Ep,802:Z.prototype.Cp},tk={496:Z.prototype.Mo,497:Z.prototype.Oo,498:Z.prototype.Po,499:Z.prototype.Qo,500:Z.prototype.Lo,501:Z.prototype.Ko,502:Z.prototype.No,503:Z.prototype.Ro},wk={800:Z.prototype.$q,801:Z.prototype.cr,802:Z.prototype.br,803:Z.prototype.ar,807:Z.prototype.Rl,811:Z.prototype.Rl,815:Z.prototype.Rl},vk={496:Z.prototype.kq,497:Z.prototype.pq,498:Z.prototype.nq,499:Z.prototype.oq,500:Z.prototype.jq,501:Z.prototype.iq,502:Z.prototype.lq,503:Z.prototype.hq,
            1014:Z.prototype.mq};Ea(function(){for(var a=Xa(window.document,"pcjs","hdc"),b=0;b<a.length;b++){var c=a[b],d=Ua(c),d=new Z(d);Wa(d,c)}});function Zd(a,b,c){this.id=a.id;this.key=Gk(a,b,c);this.Ra=a.Ra;Hk(this,a.dr)}function Gk(a,b,c){a=a.id;if(b){var d=b.indexOf(".");0<d&&(a+=".v"+b.substr(0,d))}c&&(a+="."+c);return a}
            Zd.prototype={constructor:Zd,set:function(a,b){try{this[this.id][a]=b}catch(c){}},get:function(a){return this[this.id][a]||null},value:function(){return this[this.id]},data:function(){return this[this.id]},load:function(a){return a?(this[this.id]=a,this.uk=!0):this.uk?!0:ua()&&(a=va(this.key))?(this[this.id]=a,this.uk=!0):!1},parse:function(){var a=!0;try{this[this.id]=JSON.parse(this[this.id])}catch(b){ra(b.message||b),a=!1}return a},toString:function(){var a=this[this.id];return"string"==typeof a?
            a:JSON.stringify(a)},clear:function(a){Hk(this);var b=[];try{for(var c=0,d=window.localStorage.length;c<d;c++)b.push(window.localStorage.key(c))}catch(e){}for(c=0;c<b.length;c++)if((d=b[c])&&(a||d.substr(0,this.key.length)==this.key)){try{window.localStorage.removeItem(d)}catch(m){}b.splice(c,1);c=0}},oc:function(){}};function Hk(a,b){a[a.id]={};b&&a.set("parms",b);a.uk=!1}
            function Ik(a){var b=!0;if(ua()){var c=JSON.stringify(a[a.id]);wa(a.key,c)||(ra("Unable to store "+c.length+" bytes in browser local storage"),b=!1)}return b}
            function Jk(a,b,c){Ia.call(this,"Computer",a,Jk);this.ha.dc=!1;this.Be=a.busWidth||a.buswidth;this.ad=Kk;this.wh=null;this.li=!1;this.url=b?b.url:null;this.Ar=(Math.random()+.1).toString(36).substr(2,12);this.bd=Lk(this);if(this.U=Ta("CPU",this.id)){this.Ra=Ta("Debugger",this.id);this.la=new Db({id:this.gn+".bus",buswidth:this.Be},this.U,this.Ra);var d,e=Ra(this.id);if((this.ae=Ta("Panel",this.id))&&this.ae.jk)for(b=0;b<e.length;b++)d=e[b],d.wa=this.ae.wa,d.pc=this.ae.pc,d.jk=this.ae.jk;for(b=0;b<
            e.length;b++)d=e[b],d.Lc&&d.Lc(this,this.la,this.U,this.Ra);b=null;d=a.resume;void 0!==d&&(1<d.length?b=this.Ij=d:this.ad=parseInt(d,10));var m;if(a=La&&La.state||(m=!0,a.state))b=this.Mn=a,m||(this.li=!0,this.ad=Kk),this.ad&&(this.Mj=new Zd(this,"1.18.3"),this.Mj.load()?b=null:delete this.Mj);!b&&this.ad&&(m=null,this.bd&&(m=qa()+"/api/v1/user?req=load&user="+this.bd+"&state="+Gk(this,"1.18.3")),b=m)&&(this.li=!0);b?pa(b,!0,null,this,this.cq):Za(this);c||Mk(this,this.vj)}else ra("Unable to find CPU component")}
            Qa(Jk);var Kk=0;f=Jk.prototype;f.Vf=function(){return this.Ar};f.ve=function(){return this.bd?this.bd:""};f.cq=function(a,b,c){c?(this.Ij=null,this.li=!1,this.wa("Unable to load machine state from server (error "+c+(b?": "+(String.prototype.trim?b.trim():b.replace(/^\s+|\s+$/g,"")):"")+")")):this.wh=b;Za(this)};function Mk(a,b,c){for(var d=Ra(a.id),e=0;e<=d.length;e++){var m=e<d.length?d[e]:a;if(!$a(m)){$a(m,function(){Mk(a,b,c)});return}}b.call(a,c)}
            function Nk(a,b){var c=new Zd(a,"1.18.3","validate");if(c.load()&&c.parse()){var d=c.get("timestamp"),e=b?b.get("timestamp"):"unknown";d!=e&&(a.wa("Machine state may be out-of-date\n("+d+" vs. "+e+")\nCheck your browser's local storage limits"),b||c.clear())}}
            f.vj=function(a){void 0===a&&(a=this.ad||(this.wh?1:Kk));var b=!1,c=!1;this.Vm=!1;var d=this.Mj||new Zd(this,"1.18.3");if(-1==a)b=!0;else if(a>Kk){if(d.load(this.wh)){this.xf=new Zd(this,"1.18.3","failsafe");this.xf.load()&&(Ok(this,d),a=2,Hk(this.xf));this.xf.set("timestamp",la());Ik(this.xf);var e=this.ad&&!this.li;if(1==a||sa("Click OK to restore the previous PCjs machine state, or CANCEL to reset the machine.")){if(c=d.parse()){var m=d.get("code"),n=d.get("data");m&&("ok"==m?d.load(n):("error"==
            m&&"no machine state"!=n?(this.wa("Error: "+n),"unable to verify user"==n&&(wa("user",""),this.bd=null)):this.pc(m+": "+n),Hk(d),d.load()?(c=d.parse(),e=!0):c=!1))}e&&Nk(this,c?d:null)}else 2==a&&d.clear()}else Nk(this);delete this.wh;delete this.Mj}e=Ra(this.id);for(m=0;m<e.length;m++)n=e[m],n!==this&&n!=this.U&&(c=Pk(this,n,d,b,c));b=[d,a,c];-1!=a?Mk(this,this.Nm,b):this.Nm(b)};
            function Pk(a,b,c,d,e){if(!b.ha.dc){b.ha.dc=!0;if(b.gc){var m=null;e&&((m=c.get(b.id))||(m=c.get(b.id.replace(/[a-z0-9]\./i,"."))));"string"===typeof m&&(m=null);!b.gc(m,d)&&m&&(ra("Unable to restore state for "+b.type),a.Mn&&!a.wh?(c.clear(),a.ad=Kk,window&&window.location.reload()):a.Vm=!0,b.gc(null),e=!1)}if(!d&&b.Km)for(a=b.Km.split("|"),c=0;c<a.length;c++)b.status(a[c])}return e}
            f.Nm=function(a){var b=a[0],c=0>a[1];a=a[2];this.ha.dc=!0;this.Sm||(this.pc("PCjs v1.18.3\nCopyright \u00a9 2012-2015 Jeff Parsons <Jeff@pcjs.org>\nLicense: GPL version 3 or later <http://gnu.org/licenses/gpl.html>"),this.Sm=!0);this.U&&(Pk(this,this.U,b,c,a),vc(this.U));this.Vm&&(Ok(this,b),b.clear());!c&&this.xf&&(this.xf.clear(),delete this.xf)};
            function Ok(a,b){if(sa("There may be a problem with your PCjs machine.\n\nTo help us diagnose it, click OK to send this PCjs machine state to http://www.pcjs.org.")){var c=a.ve(),d=b.toString(),e={app:"PCjs",ver:"1.18.3"};e.url=a.url;e.user=c;e.type="bug";e.data=d;pa("http://www.pcjs.org/api/v1/report",!0,e)}}
            function Qk(a,b,c){var d,e="none",m=new Zd(a,"1.18.3"),n=new Zd(a,"1.18.3","validate"),p=la();n.set("timestamp",p);m.set("timestamp",p);m.set("version","1.18.3");m.set("url",window?window.location.href:null);m.set("browser",window?window.navigator.userAgent:"");a.U&&a.U.fc&&(c&&xc(a.U),d=a.U.fc(b,c),"object"===typeof d&&m.set(a.U.id,d),c&&(a.U.ha.dc=!1,!1===d&&(e=null)));for(var p=Ra(a.id),v=0;v<p.length;v++){var w=p[v];w.ha.dc&&(w.fc&&(d=w.fc(b,c),"object"===typeof d&&m.set(w.id,d)),c&&(w.ha.dc=
            !1,!1===d&&(e=null)))}e&&(c?(p=d=!1,b?(a.bd&&Rk(a,a.bd,m.toString()),Ik(n)&&Ik(m)||(e=null,d=p=!0)):a.ad&&(d=!0,p=3==a.ad),d&&m.clear(p)):e=m.toString());c&&(a.ha.dc=!1);return e}f.reset=function(){this.la&&this.la.reset&&(this.oc("Resetting "+this.la.type),this.la.reset());for(var a=Ra(this.id),b=0;b<a.length;b++){var c=a[b];c!==this&&c!==this.la&&c.reset&&(this.oc("Resetting "+c.type),c.reset())}};
            f.start=function(a,b){for(var c=Ra(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.start&&e.start(a,b)}};f.stop=function(a,b){for(var c=Ra(this.id),d=0;d<c.length;d++){var e=c[d];"CPU"!=e.type&&e!==this&&e.stop&&e.stop(a,b)}};
            f.Lb=function(a,b,c){var d=this;switch(b){case "save":return this.qa[b]=c,c.onclick=function(){var a=Lk(d,!0);if(a){var b=!(!d.ad||d.Ij),c=Qk(d,b);b?Rk(d,a,c):d.wa("Resume disabled, machine state not saved")}},!0;case "reset":return this.qa[b]=c,c.onclick=function(){yc(d)},!0}return!1};
            function Lk(a,b){var c=a.bd;c||(c=va("user"),void 0!==c?!c&&b&&(c=null,window&&(c=window.prompt("To save machine states on the pcjs.org server, you need a user ID (email support@pcjs.org).\n\nOnce you have an ID, enter it below.","")),c&&((c=Sk(a,c))||a.wa("Your user ID has not been approved."))):b&&a.wa("Browser local storage is not available"));return c}
            function Sk(a,b){a.bd=null;var c=pa(qa()+"/api/v1/user?req=verify&user="+b),d=c[1];if(!c[0]&&d)try{c=eval("("+d+")"),c.code&&"ok"==c.code&&(wa("user",c.data),a.bd=c.data)}catch(e){ra(e.message+" ("+d+")")}return a.bd}
            function Rk(a,b,c){if(c){var d={req:"store"};d.user=b;d.state=Gk(a,"1.18.3");d.data=c;b=pa(qa()+"/api/v1/user",!1,d);d=b[1];if(b[0]){if(d){var e=d.indexOf("\n");0<e&&(d=d.substr(0,e));d.indexOf("Error: ")||(d=d.substr(7))}d='{"code":'+b[0]+',"data":"'+d+'"}'}b=JSON.parse(d);b&&"ok"==b.code?a.wa("Machine state saved to server"):c&&(c=b&&b.data||"unable to save machine state",c="error"==b.code?"Error: "+c:"Error "+b.code+": "+c,a.wa(c),wa("user",""),a.bd=null)}}
            function yc(a){if(a.ad&&!a.Ij){var b=sa("Click OK to save changes to this PCjs machine.\n\nWARNING: If you CANCEL, all disk changes will be discarded.");Qk(a,b,!0);!b&&a.Mn?window&&window.location.reload():(b||(a.vk=!0),a.vj(Kk),a.vk=!1)}else a.reset(),a.U&&vc(a.U)}function gb(a,b,c){a=Ra(a.id);for(var d=0;d<a.length;d++){var e=a[d];if(c)c==e&&(c=null);else if(e.type==b)return e}return null}
            Ea(function(){for(var a=Xa(window.document,"pcjs-machine"),b=0;b<a.length;b++)for(var c=a[b],d=Ua(c),c=Xa(c,"pcjs","computer"),e=0;e<c.length;e++){var m=c[e],n=Ua(m),n=new Jk(n,d,!0);Wa(n,m);Mk(n,n.vj)}});Aa.show.push(function(){for(var a=Xa(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=Ua(a[b]);(c=Ta("Computer",c.id))&&c.Sm&&!c.ha.dc&&c.vj(-1)}});
            Aa.exit.push(function(){for(var a=Xa(window.document,"pcjs","computer"),b=0;b<a.length;b++){var c=Ua(a[b]);(c=Ta("Computer",c.id))&&c.ha.dc&&Qk(c,!(!c.ad||c.Ij),!0)}});var Tk=0;function Uk(a,b,c,d,e,m){e("Loading "+a+"...");pa(a,!0,null,null,function(n,p,v){v?(p||(p="unable to load "+a+" ("+v+")"),m(p,null)):Vk(p,a,b,c,d,e,m)})}
            function Vk(a,b,c,d,e,m,n){function p(a,m){if(m)n(m,null);else{if(c){var p=b;p&&0>p.indexOf("/")&&(p=window.location.pathname+p);a=a.replace(/(<machine[^>]*\sid=)(['"]).*?\2/,"$1$2"+c+"$2"+(d?" state=$2"+d+"$2":"")+(p?" url=$2"+p+"$2":""))}p=null;if("<"==a.charAt(0))try{window.ActiveXObject||"ActiveXObject"in window?(e||(a=a.replace(/<!DOCTYPE(.|[\r\n])*]>\s*/g,"")),p=new window.ActiveXObject("Microsoft.XMLDOM"),p.async=!1,p.loadXML(a)):p=(new window.DOMParser).parseFromString(a,"text/xml")}catch(N){p=
            null,a=N.message}else a="unrecognized XML: "+(255<a.length?a.substr(0,255)+"...":a);n(a,p)}}a?e?Wk(a,m,p):p(a,null):n("no data"+(b?" for file: "+b:""),null)}
            function Wk(a,b,c){var d;if(d=/<([a-z]+)\s+ref="(.*?)"(.*?)\/>/g.exec(a)){var e=d[2];b("Loading "+e+"...");pa(e,!0,null,null,function(m,n,p){if(p||!n)c(a,"unable to resolve XML reference: "+d[0]+" ("+p+")");else{if(m=d[3])if(p=n.match(new RegExp("<"+d[1]+"[^>]*>"))){for(var v=p[0],w,G=/( [a-z]+=)(['"])(.*?)\2/g;w=G.exec(m);)v=0>v.indexOf(w[1])?v.replace(">",w[0]+">"):v.replace(new RegExp(w[1]+"(['\"])(.*?)\\1"),w[0]);p[0]!=v&&(n=n.replace(p[0],v))}else{c(a,"missing <"+d[1]+"> in "+e);return}n=n.replace(/<\?xml[^>]*>[\r\n]*/,
            "");a=a.replace(d[0],n);Wk(a,b,c)}})}else c(a,null)}
            function Xk(a,b,c,d){function e(a){if(void 0===p){var b=n&&Xa(n,"machine-warning");p=b&&b[0]||n}p&&(p.innerHTML=ja(a))}function m(a){e("Error: "+a);v&&(--Tk||Ga(!0));v=!1}var n,p,v=!0;Tk++;try{if(n=window.document.getElementById(a)){c||(c="/versions/pcjs/1.18.3/components.xsl");var w=function(d,p){if(p){var v=function(d,v){if(v)if(v)if(e("Processing "+b+"..."),window.ActiveXObject||"ActiveXObject"in window){var w=p.transformNode(v);w?(n.outerHTML=w,--Tk||Ga(!0)):m("transformNodeToObject failed")}else window.document.implementation&&
            window.document.implementation.createDocument?(w=new XSLTProcessor,w.importStylesheet(v),(w=w.transformToFragment(p,window.document))?n.parentNode?(n.parentNode.replaceChild(w,n),--Tk||Ga(!0)):m("invalid machine element: "+a):m("transformToFragment failed")):m("unable to transform XML: unsupported browser");else m("failed to load XSL file: "+c);else m(d)};p?Uk(c,null,null,!1,e,v):m("failed to load XML file: "+b)}else m(d)};"<"!=b.charAt(0)?Uk(b,a,d,!0,e,w):Vk(b,null,a,d,!1,e,w)}else m("missing machine element: "+
            a)}catch(G){m(G.message)}return v}window.embedPC=function(a,b,c,d){Ga(!1);return Xk(a,b,c,d)};window.enableEvents=Ga;window.sendEvent=Ha;})();
            
    • index.html
      <!doctyle html>
      <title>Embedded PC (using pcjs.org by Jeff Parsons @jeffpar)</title>
      
      
      <script data-legit=mi>
        // ONERROR
        <%=embedFile('boot/onerror.js')%>
      //# sourceURL=boot/onerror.js
      </script>
      
      
      <script data-legit=mi>
        // EARLYBOOT
        earlyBoot(window);
      
        	<%=typescriptBuild('boot/*')%>
      
        	<%=typescriptBuild('/boot/base.d.ts', 'pcjs-embed/boot/bootUI.ts')%>
      //# sourceURL=/boot/base.js
      </script>
      
      <script data-legit=mi>
      
        // LOADER
      <%=typescriptBuild('load/*', 'persistence/*', 'boot/base.d.ts', 'typings/*')%>
      //# sourceURL=/load/shellLoader.ts.js
      </script>
      
      <!-- total 12Mb, saved <%=(function() {
      
      // TOTAL SUMMARY
      var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
      
      var saveDate = new Date();
      var dtText =
        saveDate.getDate() + ' ' +
        monthsPrettyCase[saveDate.getMonth()] + ' ' +
        saveDate.getFullYear() + ' ' +
        num2(saveDate.getHours()) + ':' +
        num2(saveDate.getMinutes()) + ':' +
        num2(saveDate.getSeconds()) + '.' +
        (+saveDate).toString().slice(-3);
      
      var saveDateLocalStr = saveDate.toString();
      var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
      if (gmtMatch)
      	dtText += ' ' + gmtMatch[1];
      
      return dtText;
      
      function num2(n) { return n <= 9 ? '0' + n : '' + n; }
      
      })()
      %> -->
      
      <!-- /shell/!onerror.js
      <%=embedFile('/boot/onerror.js')%>
      -->
      
      <!-- /shell/pcjs-embed.js
      <%=typescriptBuild('pcjs-embed/embed/*', 'persistence/API.d.ts', 'typings/*')%>
      -->
      
      <!-- /shell/components.css
      <%=embedFile('/pcjs-embed/versions/pcjs/1.18.3/components.css')%>
      -->
      
      <%=(function() {
         // EMBEDDED DEMO FILES
      	var drive = portabled.build.processTemplate.mainDrive;
      	var includeFiles = [
         'components.xsl',
          'turbo.xml', 'ibm-ega.json', 'ibm-xebec-1982.json', 'ibm-ega.json', 'ibm-basic-1.10.json', '1982-11-08.json', 'MSDOS320-DISK1.json', 'fd1.json', 'fd2.json', '10mb-ega.json'
         ];
      
      	var fileDump = [];
        for (var i = 0; i < includeFiles.length; i++) {
      
      		var embedFN = '/pcjs-embed/demos/'+includeFiles[i];
          var content = drive.read(embedFN);
      
          var decoratedContent = content.
      			replace(/\-\-(\**)\>/g, '--*$1>').
      			replace(/\<(\**)\!/g, '<*$1!');
          console.log('Embedding '+embedFN+'...');
      
      	  fileDump.push('<'+'!'+'-- '+embedFN);
          fileDump.push(decoratedContent);
          fileDump.push('--'+'!'+'>');
        }
      	return fileDump.join('\n');
      
      })()%>
      
      <!-- /shell/pc.js
      
      function pcjs(compCallback) {
      var window = this.window, document = this.document, XMLHttpRequest = this.XMLHttpRequest, localStorage = this.localStorage;
      
      <%=(function() {
         // PCJS uncompiled
      
      	var drive = portabled.build.processTemplate.mainDrive;
      
         var fileList = [
      		"/modules/shared/lib/defines.js",
      		"/modules/shared/lib/diskapi.js",
      		"/modules/shared/lib/dumpapi.js",
      		"/modules/shared/lib/reportapi.js",
      		"/modules/shared/lib/userapi.js",
      		"/modules/shared/lib/strlib.js",
      		"/modules/shared/lib/usrlib.js",
      		"/modules/shared/lib/weblib.js",
      		"/modules/shared/lib/component.js",
      		"/modules/pcjs/lib/defines.js",
      		"/modules/pcjs/lib/nodebugger.js",
      		"/modules/pcjs/lib/interrupts.js",
      		"/modules/pcjs/lib/messages.js",
      		"/modules/pcjs/lib/panel.js",
      		"/modules/pcjs/lib/bus.js",
      		"/modules/pcjs/lib/memory.js",
      		"/modules/pcjs/lib/cpu.js",
      		"/modules/pcjs/lib/x86.js",
      		"/modules/pcjs/lib/x86seg.js",
      		"/modules/pcjs/lib/x86cpu.js",
      		"/modules/pcjs/lib/x86func.js",
      		"/modules/pcjs/lib/x86ops.js",
      		"/modules/pcjs/lib/x86op0f.js",
      		"/modules/pcjs/lib/x86modb.js",
      		"/modules/pcjs/lib/x86modw.js",
      		"/modules/pcjs/lib/x86modb16.js",
      		"/modules/pcjs/lib/x86modw16.js",
      		"/modules/pcjs/lib/x86modb32.js",
      		"/modules/pcjs/lib/x86modw32.js",
      		"/modules/pcjs/lib/x86modsib.js",
      		"/modules/pcjs/lib/chipset.js",
      		"/modules/pcjs/lib/rom.js",
      		"/modules/pcjs/lib/ram.js",
      		"/modules/pcjs/lib/keyboard.js",
      		"/modules/pcjs/lib/video.js",
      		"/modules/pcjs/lib/serialport.js",
      		"/modules/pcjs/lib/mouse.js",
      		"/modules/pcjs/lib/disk.js",
      		"/modules/pcjs/lib/fdc.js",
      		"/modules/pcjs/lib/hdc.js",
      		"/modules/pcjs/lib/state.js",
      		"/modules/pcjs/lib/computer.js",
      		"/modules/shared/lib/embed.js"
         ];
      
         var output = [];
      
         for (var i = 0; i < fileList.length; i++) {
      
      		output.push('');
      		output.push('// '+fileList[i]);
      
          var content = drive.read('/pcjs-embed'+fileList[i]);
      		content = content.replace(/var APPNAME \= \"\"/g, 'var APPNAME = "PCjs"');
      
          var fnName = fileList[i].slice(1).replace('/', '_');
      
          var decoratedContent = content.
      			replace(/\-\-(\**)\>/g, '--*$1>').
      			replace(/\<(\**)\!/g, '<*$1!');
          output.push(decoratedContent);
      
      	 }
      
         return output.join('\n');
      
      })()%>
      
      
      var reported_computer_wait = false;
      function waitOverride(a,b,c,d) {
      	if (!reported_computer_wait) {
      		reported_computer_wait = true;
      		var _comp = this;
      		setTimeout(function() {
      			compCallback(_comp);
      		}, 100);
      	}
      	return this._wait(a,b,c,d);
      }
      
      Computer.prototype._wait = Computer.prototype.wait;
      Computer.prototype.wait = waitOverride;
      }
      -->
      
      <!-- /shell/z-pcjs-override.css
      .pcjs-container {
      	overflow: hidden;
      }
      .pcjs-menu {
      	display: none;
      }
      .pcjs-video .pcjs-control {
      	display: none;
      }
      -->
  • persistence
    • attached
      • indexedDB.ts
        module persistence {
        
          function getIndexedDB() {
            try {
              return typeof indexedDB === 'undefined' || typeof indexedDB.open !== 'function' ? null : indexedDB;
            }
            catch (error) {
              return null;
            }
          }
        
          export module attached.indexedDB {
        
            export var name = 'indexedDB';
        
            export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
              try {
                detectCore(uniqueKey, callback);
              }
              catch (error) {
                callback(null);
              }
            }
        
            function detectCore(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
        
              var indexedDBInstance = getIndexedDB();
              if (!indexedDBInstance) {
                callback(null);
                return;
              }
        
              var dbName = uniqueKey || 'portabled';
        
              var openRequest = indexedDBInstance.open(dbName, 1);
              openRequest.onerror = (errorEvent) => callback(null);
        
              openRequest.onupgradeneeded = createDBAndTables;
        
              openRequest.onsuccess = (event) => {
                var db: IDBDatabase = openRequest.result;
        
                try {
                  var transaction = db.transaction(['files', 'metadata']);
                  // files mentioned here, but not really used to detect
                  // broken multi-store transaction implementation in Safari
        
                  transaction.onerror = (errorEvent) => callback(null);
        
                  var metadataStore = transaction.objectStore('metadata');
                  var filesStore = transaction.objectStore('files');
                  var editedUTCRequest = metadataStore.get('editedUTC');
                }
                catch (getStoreError) {
                  callback(null);
                  return;
                }
        
                if (!editedUTCRequest) {
                  callback(null);
                  return;
                }
        
                editedUTCRequest.onerror = (errorEvent) => {
                  var detached = new IndexedDBDetached(db, null);
                  callback(detached);
                };
        
                editedUTCRequest.onsuccess = (event) => {
                  var result: MetadataData = editedUTCRequest.result;
                  var detached = new IndexedDBDetached(db, result && typeof result.value === 'number' ? result.value : null);
                  callback(detached);
                };
              }
        
        
              function createDBAndTables() {
                var db: IDBDatabase = openRequest.result;
                var filesStore = db.createObjectStore('files', { keyPath: 'path' });
                var metadataStore = db.createObjectStore('metadata', { keyPath: 'property' })
              }
            }
        
        
        
            class IndexedDBDetached implements Drive.Detached {
        
              constructor(
                private _db: IDBDatabase,
                public timestamp: number) {
              }
        
              applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
                var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
                var metadataStore = transaction.objectStore('metadata');
                var filesStore = transaction.objectStore('files');
        
                var countRequest = filesStore.count();
                countRequest.onerror = (errorEvent) => {
                  console.error('Could not count files store.');
                  callback(null);
                };
        
                countRequest.onsuccess = (event) => {
        
                  var storeCount: number = countRequest.result;
        
                  var cursorRequest = filesStore.openCursor();
                  cursorRequest.onerror = (errorEvent) => callback(null);
        
                  // to cleanup any files which content is the same on the main drive
                  var deleteList: string[] = [];
                  var anyLeft = false;
        
                  var processedCount = 0;
        
                  cursorRequest.onsuccess = (event) => {
                    var cursor: IDBCursor = cursorRequest.result;
        
                    if (!cursor) {
        
                      // cleaning up files whose content is duplicating the main drive
                      if (anyLeft) {
                        for (var i = 0; i < deleteList.length; i++) {
                          filesStore['delete'](deleteList[i]);
                        }
                      }
                      else {
                        filesStore.clear();
                        metadataStore.clear();
                      }
        
                      callback(new IndexedDBShadow(this._db, this.timestamp));
                      return;
                    }
        
                    if (callback.progress)
                      callback.progress(processedCount, storeCount);
                    processedCount++;
        
                    var result: FileData = (<any>cursor).value;
                    if (result && result.path) {
        
                      var existingContent = mainDrive.read(result.path);
                      if (existingContent === result.content) {
                        deleteList.push(result.path);
                      }
                      else {
                        mainDrive.timestamp = this.timestamp;
                        mainDrive.write(result.path, result.content);
                        anyLeft = true;
                      }
                    }
        
                    cursor['continue']();
                  }; // cursorRequest.onsuccess
        
                }; // countRequest.onsuccess
        
              }
        
              purge(callback: Drive.Detached.CallbackWithShadow): void {
                var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
        
                var filesStore = transaction.objectStore('files');
                filesStore.clear();
        
                var metadataStore = transaction.objectStore('metadata');
                metadataStore.clear();
        
                callback(new IndexedDBShadow(this._db, -1));
              }
        
            }
        
            class IndexedDBShadow implements Drive.Shadow {
        
              constructor(private _db: IDBDatabase, public timestamp: number) {
              }
        
              write(file: string, content: string) {
                var transaction = this._db.transaction(['files', 'metadata'], 'readwrite');
                var filesStore = transaction.objectStore('files');
                var metadataStore = transaction.objectStore('metadata');
        
                // no file deletion here: we need to keep account of deletions too!
                var fileData: FileData = {
                  path: file,
                  content: content,
                  state: null
                };
        
                var putFile = filesStore.put(fileData);
        
                var md: MetadataData = {
                  property: 'editedUTC',
                  value: Date.now()
                };
        
                metadataStore.put(md);
        
              }
            }
        
            interface FileData {
              path: string;
              content: string;
              state: string;
            }
        
            interface MetadataData {
              property: string;
              value: any;
            }
        
        
          }
        
        }
      • localStorage.ts
        module persistence {
        
          function getLocalStorage() {
            return typeof localStorage === 'undefined' || typeof localStorage.length !== 'number' ? null : localStorage;
          }
        
          // is it OK&
          export module attached.localStorage {
        
            export var name = 'localStorage';
        
            export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
              var localStorageInstance = getLocalStorage();
              if (!localStorageInstance) {
                callback(null);
                return;
              }
        
              var access = new LocalStorageAccess(localStorageInstance, uniqueKey);
              var dt = new LocalStorageDetached(access);
              callback(dt);
            }
        
            class LocalStorageAccess {
              private _cache: { [key: string]: string; } = {};
        
              constructor(private _localStorage: Storage, private _prefix: string) {
              }
        
              get (key: string): string {
                var k = this._expandKey(key);
                var r = this._localStorage.getItem(k);
                return r;
              }
            
            	set(key: string, value: string): void {
                var k = this._expandKey(key);
                return this._localStorage.setItem(k, value);
              }
        
              remove(key: string): void {
                var k = this._expandKey(key);
                return this._localStorage.removeItem(k);
              }
        
              keys(): string[] {
                var result: string[] = [];
                var len = this._localStorage.length;
                for (var i = 0; i < len; i++) {
                  var str = this._localStorage.key(i);
                  if (str.length > this._prefix.length && str.slice(0, this._prefix.length) === this._prefix)
                    result.push(str.slice(this._prefix.length));
                }
                return result;
              }
        
              private _expandKey(key: string): string {
                var k: string;
        
                if (!key) {
                  k = this._prefix;
                }
                else {
                  k = this._cache[key];
                  if (!k)
                    this._cache[key] = k = this._prefix + key;
                }
                
                return k;
              }
          	}
        
        
            class LocalStorageDetached implements Drive.Detached {
        
              timestamp: number = 0;
        
              constructor(private _access: LocalStorageAccess) {
                var timestampStr = this._access.get('*timestamp');
                if (timestampStr && timestampStr.charAt(0)>='0' && timestampStr.charAt(0)<='9') {
                  try {
                    this.timestamp = parseInt(timestampStr);
                  }
                  catch (parseError) {
                  }
                }
              }
        
              applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
                var keys = this._access.keys();
                for (var i = 0; i < keys.length; i++) {
                  var k = keys[i];
                  if (k.charAt(0)==='/') {
                    var value = this._access.get(k);
                    mainDrive.write(k, value);
                  }
                }
                
                var shadow = new LocalStorageShadow(this._access, mainDrive.timestamp);
                callback(shadow);
              }
        
              purge(callback: Drive.Detached.CallbackWithShadow): void {
                var keys = this._access.keys();
                for (var i = 0; i < keys.length; i++) {
                  var k = keys[i];
                  if (k.charAt(0)==='/') {
                    var value = this._access.remove(k);
                  }
                }
        
                var shadow = new LocalStorageShadow(this._access, this.timestamp);
                callback(shadow);
              }
        
            }
            
            class LocalStorageShadow implements Drive.Shadow {
        
              constructor(private _access: LocalStorageAccess, public timestamp: number) {
              }
        
              write(file: string, content: string) {
                this._access.set(file, content);
                this._access.set('*timestamp', <any>this.timestamp);
              }
        
            }
        
          }
          
        } 
      • webSQL.ts
        module persistence {
        
          function getOpenDatabase() {
            return typeof openDatabase !== 'function' ? null : openDatabase;
          }
        
          export module attached.webSQL {
        
            export var name = 'webSQL';
        
            export function detect(uniqueKey: string, callback: (detached: Drive.Detached) => void): void {
        
              var openDatabaseInstance = getOpenDatabase();
              if (!openDatabaseInstance) {
                callback(null);
                return;
              }
        
              var dbName = uniqueKey || 'portabled';
        
              var db = openDatabase(
                dbName, // name
                1, // version
                'Portabled virtual filesystem data', // displayName
                1024 * 1024); // size
              // upgradeCallback?
        
        
              db.readTransaction(
                transaction => {
                  transaction.executeSql(
                    'SELECT value from "*metadata" WHERE name=\'editedUTC\'',
                    [],
                    (transaction, result) => {
                      var editedValue: number = null;
                      if (result.rows && result.rows.length === 1) {
                        var editedValueStr = result.rows.item(0).value;
                        if (typeof editedValueStr === 'string') {
                          try {
                            editedValue = parseInt(editedValueStr);
                          }
                          catch (error) {
                            // unexpected value for the timestamp, continue as if no value found
                          }
                        }
                        else if (typeof editedValueStr === 'number') {
                          editedValue = editedValueStr;
                        }
                      }
        
                      callback(new WebSQLDetached(db, editedValue || 0, true));
                    },
                    (transaction, sqlError) => {
                      // no data
                      callback(new WebSQLDetached(db, 0, false));
                    });
                },
                sqlError=> {
                  // failed to load
                  callback(null);
                });
        
            }
        
            class WebSQLDetached implements Drive.Detached {
        
              constructor(
                private _db: Database,
                public timestamp: number,
                private _metadataTableIsValid: boolean) {
              }
        
              applyTo(mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
                this._db.readTransaction(
                  transaction => listAllTables(
                    transaction,
                    tables => {
        
                      var ftab = getFilenamesFromTables(tables);
        
                      this._applyToWithFiles(transaction, ftab, mainDrive, callback);
                    },
                    sqlError => {
                      reportSQLError('Failed to list tables for the webSQL database.', sqlError);
                      callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                    }),
                  sqlError => {
                    reportSQLError('Failed to open read transaction for the webSQL database.', sqlError);
                    callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                  });
              }
        
              purge(callback: Drive.Detached.CallbackWithShadow): void {
                this._db.transaction(
                  transaction => listAllTables(
                    transaction,
                    tables => {
                      this._purgeWithTables(transaction, tables, callback);
                    },
                    sqlError => {
                      reportSQLError('Failed to list tables for the webSQL database.', sqlError);
                      callback(new WebSQLShadow(this._db, 0, false));
                    }),
                  sqlError => {
                    reportSQLError('Failed to open read-write transaction for the webSQL database.', sqlError);
                    callback(new WebSQLShadow(this._db, 0, false));
                  });
              }
        
              private _applyToWithFiles(transaction: SQLTransaction, ftab: { file: string; table: string; }[], mainDrive: Drive, callback: Drive.Detached.CallbackWithShadow): void {
        
                if (!ftab.length) {
                  callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                  return;
                }
        
                var reportedFileCount = 0;
        
                var completeOne = () => {
                  reportedFileCount++;
                  if (reportedFileCount === ftab.length) {
                    callback(new WebSQLShadow(this._db, this.timestamp, this._metadataTableIsValid));
                  }
                };
        
                var applyFile = (file: string, table: string) => {
                  transaction.executeSql(
                    'SELECT * FROM "' + table + '"',
                    [],
                    (transaction, result) => {
                      if (result.rows.length) {
                        var row = result.rows.item(0);
                        if (row.value === null)
                          mainDrive.write(file, null);
                        else if (typeof row.value === 'string')
                          mainDrive.write(file, fromSqlText(row.value));
                      }
                      completeOne();
                    },
                    sqlError => {
                      completeOne();
                    });
                };
        
                for (var i = 0; i < ftab.length; i++) {
                  applyFile(ftab[i].file, ftab[i].table);
                }
        
              }
        
              private _purgeWithTables(transaction: SQLTransaction, tables: string[], callback: Drive.Detached.CallbackWithShadow) {
                if (!tables.length) {
                  callback(new WebSQLShadow(this._db, 0, false));
                  return;
                }
        
                var droppedCount = 0;
        
                var completeOne = () => {
                  droppedCount++;
                  if (droppedCount === tables.length) {
                    callback(new WebSQLShadow(this._db, 0, false));
                  }
                };
        
                for (var i = 0; i < tables.length; i++) {
                  transaction.executeSql(
                    'DROP TABLE "' + tables[i] + '"',
                    [],
                    (transaction, result) => {
                      completeOne();
                    },
                    (transaction, sqlError) => {
                      reportSQLError('Failed to drop table for the webSQL database.', sqlError);
                      completeOne();
                    });
                }
              }
        
            }
        
            class WebSQLShadow implements Drive.Shadow {
        
              private _cachedUpdateStatementsByFile: { [name: string]: string; } = {};
              private _closures = {
                updateMetadata: (transaction: SQLTransaction) => this._updateMetadata(transaction)
              };
        
              constructor(private _db: Database, public timestamp: number, private _metadataTableIsValid: boolean) {
              }
        
              write(file: string, content: string) {
        
                if (content || typeof content === 'string') {
                  this._updateCore(file, content);
                }
                else {
                  this._dropFileTable(file);
                }
              }
        
              private _updateCore(file: string, content: string) {
                var updateSQL = this._cachedUpdateStatementsByFile[file];
                if (!updateSQL) {
                  var tableName = mangleDatabaseObjectName(file);
                  updateSQL = this._createUpdateStatement(file, tableName);
                }
                this._db.transaction(
                  transaction => {
                    transaction.executeSql(
                      updateSQL,
                      ['content', content],
                      this._closures.updateMetadata,
                      (transaction, sqlError) => this._createTableAndUpdate(transaction, file, tableName, updateSQL, content));
                  },
                  sqlError => {
                    reportSQLError('Transaction failure updating file "' + file + '".', sqlError);
                  });
              }
        
              private _createTableAndUpdate(transaction: SQLTransaction, file: string, tableName: string, updateSQL: string, content: string) {
                if (!tableName)
                  tableName = mangleDatabaseObjectName(file);
        
                transaction.executeSql(
                  'CREATE TABLE "' + tableName + '" (name PRIMARY KEY, value)',
                  [],
                  (transaction, result) => {
                    transaction.executeSql(
                      updateSQL,
                      ['content', content],
                      this._closures.updateMetadata,
                      (transaction, sqlError) => {
                        reportSQLError('Failed to update table "' + tableName + '" for file "' + file + '" after creation.', sqlError);
                      });
                  },
                  (transaction, sqlError) => {
                    reportSQLError('Failed to create a table "' + tableName + '" for file "' + file + '".', sqlError);
                  });
              }
        
              private _dropFileTable(file: string) {
                var tableName = mangleDatabaseObjectName(file);
                this._db.transaction(
                  transaction => {
                    transaction.executeSql(
                      'DROP TABLE "' + tableName + '"',
                      [],
                      this._closures.updateMetadata,
                      (transaction, sqlError) => {
                        reportSQLError('Failed to drop table "' + tableName + '" for file "' + file + '".', sqlError);
                      });
                  },
                  sqlError => {
                    reportSQLError('Transaction failure dropping table "' + tableName + '" for file "' + file + '".', sqlError);
                  });
              }
        
              private _updateMetadata(transaction: SQLTransaction) {
                var updateMetadataSQL = 'INSERT OR REPLACE INTO "*metadata" VALUES (?,?)';
                transaction.executeSql(
                  updateMetadataSQL,
                  ['editedUTC', this.timestamp],
                  (transaction, result) => { }, // TODO: generate closure statically
                  (transaction, error) => {
                    transaction.executeSql(
                      'CREATE TABLE "*metadata" (name PRIMARY KEY, value)',
                      [],
                      (transaction, result) => {
                        transaction.executeSql(updateMetadataSQL, [], () => { }, () => { });
                      },
                      (transaction, sqlError) => {
                        reportSQLError('Failed to update metadata table after creation.', sqlError);
                      });
                  });
        
              }
        
              private _createUpdateStatement(file: string, tableName: string): string {
                return this._cachedUpdateStatementsByFile[file] =
                  'INSERT OR REPLACE INTO "' + tableName + '" VALUES (?,?)';
              }
            }
        
        
            function mangleDatabaseObjectName(name: string): string {
              // no need to polyfill btoa, if webSQL exists
              if (name.toLowerCase() === name)
                return name;
              else
                return '=' + btoa(name);
            }
        
            function unmangleDatabaseObjectName(name: string): string {
              if (!name || name.charAt(0) === '*') return null;
        
              if (name.charAt(0) !== '=') return name;
        
              try {
                return atob(name.slice(1));
              }
              catch (error) {
                return name;
              }
            }
        
            export function listAllTables(
              transaction: SQLTransaction,
              callback: (tables: string[]) => void,
              errorCallback: (sqlError: SQLError) => void) {
              transaction.executeSql(
                'SELECT tbl_name  from sqlite_master WHERE type=\'table\'',
                [],
                (transaction, result) => {
                  var tables: string[] = [];
                  for (var i = 0; i < result.rows.length; i++) {
                    var row = result.rows.item(i);
                    var table = row.tbl_name;
                    if (!table || (table[0] !== '*' && table.charAt(0) !== '=' && table.charAt(0) !== '/')) continue;
                    tables.push(row.tbl_name);
                  }
                  callback(tables);
                },
                (transaction, sqlError) => errorCallback(sqlError));
            }
        
            function getFilenamesFromTables(tables: string[]) {
              var filenames: { table: string; file: string; }[] = [];
              for (var i = 0; i < tables.length; i++) {
                var file = unmangleDatabaseObjectName(tables[i]);
                if (file)
                  filenames.push({ table: tables[i], file: file });
              }
              return filenames;
            }
        
            function toSqlText(text: string) {
              if (text.indexOf('\u00FF') < 0 && text.indexOf('\u0000') < 0) return text;
        
              return text.replace(/\u00FF/g, '\u00FFf').replace(/\u0000/g, '\u00FF0');
            }
        
            function fromSqlText(sqlText: string) {
              if (sqlText.indexOf('\u00FF') < 0 && sqlText.indexOf('\u0000') < 0) return sqlText;
        
              return sqlText.replace(/\u00FFf/g, '\u00FF').replace(/\u00FF0/g, '\u0000');
            }
        
            function reportSQLError(message: string, sqlError: SQLError);
            function reportSQLError(sqlError: SQLError);
            function reportSQLError(message, sqlError?) {
              if (typeof console !== 'undefined' && typeof console.error === 'function') {
                if (sqlError)
                  console.error(message, sqlError);
                else
                  console.error(sqlError);
              }
            }
        
        
          }
        
        }
    • dom
      • CommentHeader.ts
        module persistence.dom {
        
          export class CommentHeader {
        
            header: string;
            contentOffset: number;
            contentLength: number;
        
            constructor(public node: Comment) {
              var headerLine: string;
              var content: string;
              if (typeof node.substringData === 'function'
                && typeof node.length === 'number') {
                var chunkSize = 128;
        
                if (node.length >= chunkSize) {
                  // TODO: cut chunks off the start and look for newlines
                  var headerChunks: string[] = [];
                  while (headerChunks.length * chunkSize < node.length) {
                    var nextChunk = node.substringData(headerChunks.length * chunkSize, chunkSize);
                    var posEOL = nextChunk.search(/\r|\n/);
                    if (posEOL < 0) {
                      headerChunks.push(nextChunk);
                      continue;
                    }
        
                    this.header = headerChunks.join('') + nextChunk.slice(0, posEOL);
                    this.contentOffset = this.header.length + 1; // if header is separated by a single CR or LF
        
                    if (posEOL === nextChunk.length - 1) { // we may have LF part of CRLF in the next chunk!
                      if (nextChunk.charAt(nextChunk.length - 1) === '\r'
                        && node.substringData((headerChunks.length + 1) * chunkSize, 1) === '\n')
                        this.contentOffset++;
                    }
                    else if (nextChunk.slice(posEOL, posEOL + 2) === '\r\n') {
                      this.contentOffset++;
                    }
        
                    this.contentLength = node.length - this.contentOffset;
                    return;
                  }
        
                  this.header = headerChunks.join('');
                  this.contentOffset = this.header.length;
                  this.contentLength = node.length - content.length;
                  return;
                }
              }
        
              var wholeCommentText = node.nodeValue;
              var posEOL = wholeCommentText.search(/\r|\n/);
              if (posEOL < 0) {
                this.header = wholeCommentText;
                this.contentOffset = wholeCommentText.length;
                this.contentLength = wholeCommentText.length - this.contentOffset;
                return;
              }
        
              this.contentOffset = wholeCommentText.slice(posEOL, posEOL + 2) === '\r\n' ?
                posEOL + 2 : // ends with CRLF
                posEOL + 1; // ends with singular CR or LF
        
              this.header = wholeCommentText.slice(0, posEOL),
              this.contentLength = wholeCommentText.length - this.contentOffset
            }
        
          }
        
        }
      • DOMDrive.ts
        module persistence.dom {
        
          export class DOMDrive implements Drive {
        
            private _byPath: { [path: string]: DOMFile; } = {};
        
            public timestamp: number;
        
            constructor(
              private _totals: DOMTotals,
              files: DOMFile[],
              private _document: DOMDrive.DocumentSubset) {
        
              this.timestamp = this._totals ? this._totals.timestamp : 0;
        
              for (var i = 0; i < files.length; i++) {
                this._byPath[files[i].path] = files[i];
              }
            }
        
            files(): string[] {
        
              if (typeof Object.keys === 'string') {
                var result = Object.keys(this._byPath);
              }
              else {
                var result: string[] = [];
                for (var k in this._byPath) if (this._byPath.hasOwnProperty(k)) {
                  result.push(k);
                }
              }
        
              result.sort();
        
              return result;
            }
        
            read(file: string): string {
              var file = normalizePath(file);
              var f = this._byPath[file];
              if (!f)
                return null;
              else
                return f.read();
            }
        
            write(file: string, content: string) {
        
              var totalDelta = 0;
        
              var file = normalizePath(file);
              var f = this._byPath[file];
        
              if (content === null) {
                // removal
                if (f) {
                  totalDelta -= f.contentLength;
                  f.node.parentElement.removeChild(f.node);
                  delete this._byPath[file];
                }
              }
              else {
                // addition
                if (f) {
                  var lengthBefore = f.contentLength;
                  f.write(content);
                  totalDelta += f.contentLength - lengthBefore;
                }
                else {
                  var comment = document.createComment('');
                  var f = new DOMFile(comment, file, null, 0, 0);
                  f.write(content);
                  this._document.body.appendChild(f.node);
                  this._byPath[file] = f;
                  totalDelta += f.contentLength;
                }
              }
        
              this._totals.timestamp = this.timestamp;
              this._totals.updateNode();
            }
        
          }
        
          export module DOMDrive {
        
            export interface DocumentSubset {
              body: HTMLBodyElementSubset;
        
              createComment(data: string): Comment;
            }
        
            export interface HTMLBodyElementSubset {
              appendChild(node: Node);
              insertBefore(newChild: Node, refNode?: Node);
              firstChild: Node;
            }
          }
        }
      • DOMFile.ts
        module persistence.dom {
        
          export class DOMFile {
        
            private _encodedPath: string = null;
        
            constructor(
              public node: Comment,
              public path: string,
              private _encoding: (text: string) => any,
              private _contentOffset: number,
              public contentLength: number) {
            }
        
            static tryParse(cmheader: CommentHeader): DOMFile {
        
              //    /file/path/continue
              //    "/file/path/continue"
              //    /file/path/continue   [encoding]
        
              var parseFmt = /^\s*((\/|\"\/)(\s|\S)*[^\]])\s*(\[((\s|\S)*)\])?\s*$/;
              var parsed = parseFmt.exec(cmheader.header);
              if (!parsed) return null; // does not match the format
        
              var filePath = parsed[1];
              var encodingName = parsed[5];
        
              if (filePath.charAt(0) === '"') {
                if (filePath.charAt(filePath.length - 1) !== '"') return null; // unpaired leading quote
                try {
                  if (typeof JSON !== 'undefined' && typeof JSON.parse === 'function')
                    filePath = JSON.parse(filePath);
                  else
                    filePath = eval(filePath); // security doesn't seem to be compromised, input is coming from the same file
                }
                catch (parseError) {
                  return null; // quoted path but wrong format (JSON expected)
                }
              }
              else { // filePath NOT started with quote
                if (encodingName) {
                  // regex above won't strip trailing whitespace from filePath if encoding is specified
                  // (because whitespace matches 'non-bracket' class too)
                  filePath = filePath.slice(0, filePath.search(/\S(\s*)$/) + 1);
                }
              }
        
              var encoding = encodings[encodingName || 'LF'];
              // invalid encoding considered a bogus comment, skipped
              if (encoding)
                return new DOMFile(cmheader.node, filePath, encoding, cmheader.contentOffset, cmheader.contentLength);
        
              return null;
            }
        
        
            read() {
        
              // proper HTML5 has substringData to read only a chunk
              // (that saves on string memory allocations
              // comparing to fetching the whole text including the file name)
              var contentText = typeof this.node.substringData === 'function' ?
                this.node.substringData(this._contentOffset, 1000000000) :
                this.node.nodeValue.slice(this._contentOffset);
        
              // XML end-comment is escaped when stored in DOM,
              // unescape it back
              var restoredText = contentText.
              	replace(/\-\-\*(\**)\>/g, '--$1>').
                replace(/\<\*(\**)\!/g, '<$1!');
        
              // decode
              var decodedText = this._encoding(restoredText);
        
              // update just in case it's been off
              this.contentLength = decodedText.length;
        
              return decodedText;
            }
        
            write(content: any) {
        
              var encoded = bestEncode(content);
              var protectedText = encoded.content.
              	replace(/\-\-(\**)\>/g, '--*$1>').
              	replace(/\<(\**)\!/g, '<*$1!');
        
              if (!this._encodedPath) {
                // most cases path is path,
                // but if anything is weird, it's going to be quoted
                // (actually encoded with JSON format)
                var encp = bestEncode(this.path, true /*escapePath*/);
                this._encodedPath = encp.content;
              }
        
              var leadText = ' ' + this._encodedPath + (encoded.encoding === 'LF' ? '' : ' [' + encoded.encoding + ']') + '\n';
              this.node.nodeValue = leadText + encoded.content;
        
              this._encoding = encodings[encoded.encoding || 'LF'];
              this._contentOffset = leadText.length;
        
              this.contentLength = content.length;
            }
        
          }
        
        }
      • DOMTotals.ts
        module persistence.dom {
        
          var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
          var monthsUpperCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').toUpperCase().split('|');
        
          export class DOMTotals {
        
            constructor(
            	public timestamp: number,
            	public totalSize: number,
              private _node: Comment) {
            }
        
            static tryParse(cmheader: CommentHeader): DOMTotals {
        
              // TODO: preserve unknowns when parsing
        
              var parts = cmheader.header.split(',');
              var anythingParsed = false;
              var totalSize = 0;
              var timestamp = 0;
        
              for (var i = 0; i < parts.length; i++) {
        
                // total 234Kb
                // total 23
                // total 6Mb
        
                var totalFmt = /^\s*total\s+(\d*)\s*([KkMm])?b?\s*$/;
                var totalMatch = totalFmt.exec(parts[i]);
                if (totalMatch) {
                  try {
                    var total = parseInt(totalMatch[1]);
                    if ((totalMatch[2] + '').toUpperCase() === 'K')
                      total *= 1024;
                    else if ((totalMatch[2] + '').toUpperCase() === 'M')
                      total *= 1024 * 1024;
                    totalSize = total;
                    anythingParsed = true;
                  }
                  catch (totalParseError) { }
                  continue;
                }
        
                var savedFmt = /^\s*saved\s+(\d+)\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d+)\s+(\d+)\:(\d+)(\:(\d+(\.(\d+))?))\s*(GMT\s*[\-\+]?\d+\:?\d*)?\s*$/i;
                var savedMatch = savedFmt.exec(parts[i]);
                if (savedMatch) {
                  // 25 Apr 2015 22:52:01.231
                  try {
                    var savedDay = parseInt(savedMatch[1]);
                    var savedMonth = monthsUpperCase.indexOf(savedMatch[2].toUpperCase());
                    var savedYear = parseInt(savedMatch[3]);
                    if (savedYear < 100)
                      savedYear += 2000; // no 19xx notation anymore :-(
                    var savedHour = parseInt(savedMatch[4]);
                    var savedMinute = parseInt(savedMatch[5]);
                    var savedSecond = savedMatch[7] ? parseFloat(savedMatch[7]) : 0;
        
                    timestamp = new Date(savedYear, savedMonth, savedDay, savedHour, savedMinute, savedSecond | 0).valueOf();
                    timestamp += (savedSecond - (savedSecond | 0))*1000; // milliseconds
        
                    var savedGMTStr = savedMatch[10];
                    if (savedGMTStr) {
                      var gmtColonPos = savedGMTStr.indexOf(':');
                      if (gmtColonPos>0) {
                        var gmtH = parseInt(savedGMTStr.slice(0, gmtColonPos));
                        timestamp += gmtH * 60 /*min*/ * 60 /*sec*/ * 1000 /*msec*/;
                        var gmtM = parseInt(savedGMTStr.slice(gmtColonPos + 1));
                        timestamp += gmtM * 60 /*sec*/ * 1000 /*msec*/;
                      }
                    }
        
                    anythingParsed = true;
                  }
                  catch (savedParseError) { }
                }
        
              }
        
              if (anythingParsed)
                return new DOMTotals(timestamp, totalSize, cmheader.node);
              else
                return null;
            }
        
          	updateNode() {
              // TODO: update the node content
        
              // total 4Kb, saved 25 Apr 2015 22:52:01.231
              var newTotals =
                'total ' + (
                  this.totalSize < 1024 * 9 ? this.totalSize + '' :
                    this.totalSize < 1024 * 1024 * 9 ? ((this.totalSize / 1024) | 0) + 'Kb' :
                      ((this.totalSize / (1024 * 1024)) | 0) + 'Mb') + ', ' +
                'saved ';
        
              var saveDate = new Date(this.timestamp);
              newTotals +=
                saveDate.getDate() + ' ' +
                monthsPrettyCase[saveDate.getMonth()] + ' ' +
              	saveDate.getFullYear() + ' ' +
              	num2(saveDate.getHours()) + ':' +
                num2(saveDate.getMinutes()) + ':' +
                num2(saveDate.getSeconds()) + '.' +
                this.timestamp.toString().slice(-3);
        
              var saveDateLocalStr = saveDate.toString();
              var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
              if (gmtMatch)
                newTotals += ' ' + gmtMatch[1];
        
              this._node.nodeValue = newTotals;
        
              function num2(n: number) {
                return n <= 9 ? '0' + n : '' + n;
              }
        
            }
        
          }
        
        
        }
      • parseDOMStorage.ts
        module persistence.dom {
        
          export function parseDOMStorage(document: parseDOMStorage.DocumentSubset): parseDOMStorage.ContinueParsing {
        
            var loadedFiles: DOMFile[] = [];
            var loadedTotals: DOMTotals;
            var lastNode: Node;
            var loadedSize = 0;
        
            return continueParsing();
        
            function continueParsing(): parseDOMStorage.ContinueParsing {
        
              continueParsingDOM(false);
        
              return {
                continueParsing,
                finishParsing,
                loadedSize,
                totalSize: loadedTotals ? loadedTotals.totalSize : 0,
                loadedFileCount: loadedFiles.length
              };
        
            }
        
            function finishParsing(): DOMDrive {
        
              continueParsingDOM(true);
        
              if (loadedTotals) {
                loadedTotals.totalSize = loadedSize;
                loadedTotals.updateNode();
              }
        
              var drive = new DOMDrive(loadedTotals, loadedFiles, document);
        
              return drive;
            }
        
            function continueParsingDOM(finish: boolean) {
              if (document.body) {
                if (!lastNode)
                  lastNode = document.body.firstChild;
        
                while (true) {
                  if (!lastNode) return;
                  else if (!finish && lastNode == document.body.lastChild) return;
        
        
                  if (lastNode.nodeType === 8) {
                    processNode(<Comment>lastNode);
                  }
        
                  lastNode = lastNode.nextSibling;
                }
              }
            }
        
            function processNode(node: Comment): boolean {
              var cmheader = new CommentHeader(node);
        
              var file = DOMFile.tryParse(cmheader);
              if (file) {
                loadedFiles.push(file);
                loadedSize += file.contentLength;
                return true;
              }
        
              var totals = DOMTotals.tryParse(cmheader);
              if (totals)
                loadedTotals = totals;
            }
          }
        
          export module parseDOMStorage {
        
            export interface ContinueParsing {
        
              continueParsing(): ContinueParsing;
        
              finishParsing(): DOMDrive;
        
              loadedFileCount: number;
              loadedSize: number;
              totalSize: number;
        
            }
        
            export interface DocumentSubset extends DOMDrive.DocumentSubset {
              body: HTMLBodyElementSubset;
            }
        
            export interface HTMLBodyElementSubset extends DOMDrive.HTMLBodyElementSubset {
              lastChild: Node;
            }
        
          }
        
        }
    • encodings
      • CR.ts
        module persistence.encodings {
        
          export function CR(text: string): string {
            return text.
              replace(/\r\n|\n/g, '\r');
          }
        
        }
      • CRLF.ts
        module persistence.encodings {
        
          export function CRLF(text: string): string {
            return text.
              replace(/\r|\n/g, '\r\n');
          }
        
        }
      • LF.ts
        module persistence.encodings {
        
          export function LF(text: string): string {
            return text.
              replace(/\r\n|\r/g, '\n');
          }
        
        }
      • base64.ts
        module persistence.encodings {
        
          export function base64(text: string): any {
            // TODO: convert from base64 to text
            // TODO: invent a prefix to signify binary data
            throw new Error('Base64 encoding is not implemented yet.');
          }
        
        }
      • eval.ts
        module persistence.encodings {
        
          export function eval(text: string): any {
            return (0, window['eval'])(text);
          }
        
        }
      • json.ts
        module persistence.encodings {
        
          export function json(text: string): any {
            var result = typeof JSON ==='undefined' ? eval(text) : JSON.parse(text);
        
            if (result && typeof result !== 'string' && result.type) {
              var ctor: any = window[result.type];
              result = new ctor(result);
            }
        
            return result;
          }
        
        }
    • API.d.ts
      declare module persistence {
      
        export interface Drive {
      
          timestamp: number;
      
          files(): string[];
      
          read(file: string): string;
      
          write(file: string, content: string);
      
        }
      
        export module Drive {
      
          export interface Shadow {
      
            timestamp: number;
      
            write(file: string, content: string): void;
      
          }
      
          export interface Optional {
      
            name: string;
      
            detect(uniqueKey: string, callback: (detached: Detached) => void): void;
      
          }
      
          export interface Detached {
      
            timestamp: number;
            totalSize?: number;
      
            applyTo(mainDrive: Drive, callback: Detached.CallbackWithShadow): void;
      
            purge(callback: Detached.CallbackWithShadow): void;
      
          }
      
          export module Detached {
            export interface CallbackWithShadow {
      
              (loaded: Shadow): void;
              progress?: (current: number, total: number) => void;
            }
          }
      
        }
      }
    • bestEncode.ts
      module persistence {
      
        export function bestEncode(content: any, escapePath?: boolean): { content: string; encoding: string; } {
      
          if (content.length>1024*16) {
            // TODO: consider packing tightly and using eval encoding to unpack
          }
      
          if (typeof content!=='string')
            return { content: encodeArrayOrSimilarAsJSON(content), encoding: 'json' };
      
          var needsEscaping: boolean;
          if (escapePath) {
            // zero-char, newlines, leading/trailing spaces, quote and apostrophe
            needsEscaping = /\u0000|\r|\n|^\s|\s$|\"|\'/.test(content);
          }
          else {
            needsEscaping = /\u0000|\r/.test(content);
          }
      
          if (needsEscaping) {
            // ZERO character is officially unsafe in HTML,
            // CR is contentious in IE (which converts any CR or LF into CRLF)
      
            return { content: encodeUnusualStringAsJSON(content), encoding: 'json' };
          }
          else {
            return { content: content, encoding: 'LF' };
          }
        }
      
        function encodeUnusualStringAsJSON(content: string): string {
          if (typeof JSON !== 'undefined' && typeof JSON.stringify === 'function') {
            var simpleJSON = JSON.stringify(content);
            var sanitizedJSON = simpleJSON.
              replace(/\u0000/g, '\\u0000').
              replace(/\r/g, '\\r').
              replace(/\n/g, '\\n');
            return sanitizedJSON;
          }
          else {
            var result = content.replace(
              /\"\u0000|\u0001|\u0002|\u0003|\u0004|\u0005|\u0006|\u0007|\u0008|\u0009|\u00010|\u00011|\u00012|\u00013|\u00014|\u00015|\u0016|\u0017|\u0018|\u0019|\u0020|\u0021|\u0022|\u0023|\u0024|\u0025|\u0026|\u0027|\u0028|\u0029|\u0030|\u0031/g,
              (chr) =>
                chr === '\t' ? '\\t' :
                  chr === '\r' ? '\\r' :
                    chr === '\n' ? '\\n' :
                      chr === '\"' ? '\\"' :
                        chr < '\u0010' ? '\\u000' + chr.charCodeAt(0).toString(16) :
                          '\\u00' + chr.charCodeAt(0).toString(16));
            return result;
          }
        }
      
        function encodeArrayOrSimilarAsJSON(content: any): string {
            var type = content instanceof Array ? null : content.constructor.name || content.type;
            if (typeof JSON !== 'undefined' && typeof JSON.stringify === 'function') {
              if (type) {
                var wrapped = { type, content };
                var wrappedJSON = JSON.stringify(wrapped);
                return wrappedJSON;
              }
              else {
                var contentJSON = JSON.stringify(content);
                return contentJSON;
              }
            }
            else {
              var jsonArr: string[] = [];
              if (type) {
                jsonArr.push('{"type": "');
                jsonArr.push(content.type || content.prototype.constructor.name);
                jsonArr.push('", "content": [');
              }
              else {
                jsonArr.push('[');
              }
      
              for (var i = 0; i < content.length; i++) {
                if (i) jsonArr.push(',');
                jsonArr.push(content[i]);
              }
      
              if (type)
                jsonArr.push(']}');
              else
                jsonArr.push(']');
      
              return jsonArr.join('');
            }
        }
      }
    • bootMount.ts
      module persistence {
      
        // TODO: pass in progress callback
        export function bootMount(uniqueKey: string, document: Document): bootMount.ContinueLoading {
      
          var continueParse: persistence.dom.parseDOMStorage.ContinueParsing;
      
          var ondomdriveloaded;
          var domDriveLoaded: Drive;
          var storedFinishCallback;
      
          mountDrive(
            callback => {
              if (domDriveLoaded)
                callback(domDriveLoaded);
              else
                ondomdriveloaded = callback;
            },
            uniqueKey,
            [attached.indexedDB, attached.webSQL, attached.localStorage],
            mountedDrive => {
      
              storedFinishCallback(mountedDrive);
      
            });
      
          return continueLoading();
      
          function continueLoading(): bootMount.ContinueLoading {
      
            continueDOMLoading();
      
            // TODO: record progress
      
            return {
              continueLoading,
              finishLoading,
      
              loadedFileCount: continueParse.loadedFileCount,
              loadedSize: continueParse.loadedSize,
              totalSize: continueParse.totalSize
      
            };
          }
      
          function finishLoading(finishCallback: (monutedDrive: Drive) => void) {
      
            storedFinishCallback = finishCallback;
      
            continueDOMLoading();
      
            domDriveLoaded = continueParse.finishParsing();
      
            if (ondomdriveloaded) {
              ondomdriveloaded(domDriveLoaded);
            }
      
          }
      
      
          function continueDOMLoading() {
            continueParse = continueParse ? continueParse.continueParsing() : dom.parseDOMStorage(document);
          }
      
        }
      
        module bootMount {
      
          export interface ContinueLoading {
      
            continueLoading(): ContinueLoading;
      
            finishLoading(finishCallback: (mountedDrive: Drive) => void);
      
            loadedFileCount: number;
            loadedSize: number;
            totalSize: number;
      
          }
      
        }
      }
    • mountDrive.ts
      module persistence {
      
        export function mountDrive(
          loadDOMDrive: (callback: (dom: Drive) => void)=> void,
          uniqueKey: string,
          optionalModules: Drive.Optional[],
          callback: mountDrive.Callback): void {
      
          var driveIndex = 0;
      
          loadNextOptional();
      
          function loadNextOptional() {
      
            while (driveIndex < optionalModules.length &&
              (!optionalModules[driveIndex] || typeof optionalModules[driveIndex].detect !== 'function')) {
              driveIndex++;
            }
      
            if (driveIndex >= optionalModules.length) {
              loadDOMDrive(dom => callback(new MountedDrive(dom, null)));
              return;
            }
      
            var op = optionalModules[driveIndex];
            op.detect(
              uniqueKey,
              detached => {
                if (!detached) {
                  driveIndex++;
                  loadNextOptional();
                  return;
                }
      
                loadDOMDrive(dom => {
                  if (detached.timestamp > dom.timestamp) {
                    var callbackWithShadow: Drive.Detached.CallbackWithShadow = loadedDrive => {
                      dom.timestamp = detached.timestamp;
                      callback(new MountedDrive(dom, loadedDrive));
                    };
                    if (callback.progress)
                      callbackWithShadow.progress = callback.progress;
                    loadDOMDrive(dom => detached.applyTo(dom, callbackWithShadow));
                  }
                  else {
                    var callbackWithShadow: Drive.Detached.CallbackWithShadow = loadedDrive => {
                      callback(new MountedDrive(dom, loadedDrive));
                    };
                    if (callback.progress)
                      callbackWithShadow.progress = callback.progress;
                    detached.purge(callbackWithShadow);
                  }
                });
      
              });
          }
      
        }
      
        export module mountDrive {
      
          export interface Callback {
      
            (drive: Drive): void;
      
            progress?: (current: number, total: number) => void;
      
          }
      
        }
      
        class MountedDrive implements Drive {
      
          updateTime = true;
          timestamp: number = 0;
      
          constructor (private _dom: Drive, private _shadow: Drive.Shadow) {
            this.timestamp = this._dom.timestamp;
          }
      
          files(): string[] {
            return this._dom.files();
          }
      
          read(file: string): string {
            return this._dom.read(file);
          }
      
          write(file: string, content: string) {
            if (this.updateTime) {
              this.timestamp = +new Date();
            }
      
            this._dom.timestamp = this.timestamp;
            this._dom.write(file, content);
            if (this._shadow) {
              this._shadow.timestamp = this.timestamp;
              this._shadow.write(file, content);
            }
          }
        }
      
      }
    • normalizePath.ts
      module persistence {
      
        export function normalizePath(path: string) : string {
      
          if (!path) return '/'; // empty paths converted to root
      
          if (path.charAt(0) !== '/') // ensuring leading slash
            path = '/' + path;
      
          path = path.replace(/\/\/*/g, '/'); // replacing duplicate slashes with single
      
          return path;
        }
      
      }
  • shell
    • build
      • processTemplate.ts
        module shell.build {
        
          export function processTemplate(
            template: string, scopes: any[],
            log: (logText: string) => void,
            callback: (error: Error, result?: string) => void): void {
            // <%= expr %>
            // <% statement %>
            // <%-- comment --%>
        
            log('Generating build script...');
            setTimeout(() => {
              var fnText = generateBuildScript(template, scopes);
        
              log('Preprocessing build script...');
              setTimeout(() => {
                try {
                  var fn = Function('scopes', fnText);
        
                  log('Executing build script...');
        
                  var output: any[] = fn(scopes);
                  var outputIndex = 0;
                }
                catch (error) {
                  log('Build failure ' + error);
                  callback(error);
                  return;
                }
        
                processNextOutputChunk();
        
                function processNextOutputChunk() {
                  var startTime = +new Date();
        
                  // all heavy chunks will bail out and queue the next one on setTimeout,
                  // simple literal insertions keep going for a slice of time
                  while (true) {
                    if (outputIndex >= output.length) {
                      var result = output.join('');
                      callback(null, result);
                      return;
                    }
        
                    var outputChunk = output[outputIndex];
                    if (typeof outputChunk === 'function') {
                      log('Processing ' + outputChunk + '...');
                      setTimeout(() => {
                        try {
                          var chunkResult = outputChunk();
                          var chunkResultText = String(chunkResult);
                          output[outputIndex] = chunkResultText;
                        }
                        catch (error) {
                          callback(error);
                          return;
                        }
        
                        log('...OK [' + chunkResultText.length + ']');
                        outputIndex++;
                        processNextOutputChunk();
                        //setTimeout(processNextOutputChunk, 1);
                      }, 1);
                      break;
                    }
                    else {
                      var literal = String(outputChunk);
                      output[outputIndex] = literal;
                      var literalLines = (literal.length > 100 ? literal.slice(0, 50) + '\n...\n' + literal.slice(literal.length - 5) : literal).split('\n');
                      while (literalLines.length && !literalLines[0]) literalLines.shift();
                      while (literalLines.length && !literalLines[literalLines.length - 1]) literalLines.pop();
                      log(literalLines.length <= 2 ? literalLines.join('\n') : literalLines[0] + '\n...\n' + literalLines[literalLines.length - 1]);
                      outputIndex++;
        
                      if (+new Date() - startTime > 300) {
                        setTimeout(processNextOutputChunk, 1);
                        break;
                      }
                      // keep going if haven't been processing for long yet
        
                    }
                  }
                }
        
              }, 1);
        
            }, 1);
        
          }
        
          function generateBuildScript(template: string, scopes: any[]): string {
            var generated: string[] = [];
            for (var i = 0; i < scopes.length; i++) {
              generated.push('with(scopes[' + i + ']) {');
            }
        
            generated.push('var output =[];');
        
            var index = 0;
            while (index < template.length) {
        
              var nextOpenASP = template.indexOf('<%', index);
              if (nextOpenASP < 0) {
                generateWrite(generated, template.slice(index));
                break;
              }
        
              var ch = template.charAt(nextOpenASP + 2);
              if (ch === '=') {
                var closeASP = template.indexOf('%>', nextOpenASP);
                if (closeASP < 0) {
                  generateWrite(generated, template.slice(index));
                  break;
                }
        
                generateWrite(generated, template.slice(index, nextOpenASP));
                generateRedirect(generated, template.slice(nextOpenASP + 3, closeASP));
                index = closeASP + 2;
              }
              else if (ch === '-') {
                var closeCommentMatch = template.charAt(nextOpenASP + 3) === '-' ? '--%>' : '-%>';
                var closeComment = template.indexOf(closeCommentMatch, nextOpenASP);
                if (closeComment < 0) {
                  generateWrite(generated, template.slice(index));
                  break;
                }
        
                generateWrite(generated, template.slice(index, nextOpenASP));
                index = closeComment + closeCommentMatch.length;
              }
              else {
                var closeASP = template.indexOf('%>', nextOpenASP);
                if (closeASP < 0) {
                  generateWrite(generated, template.slice(index));
                  break;
                }
        
                generateWrite(generated, template.slice(index, nextOpenASP));
                generateStatement(generated, template.slice(nextOpenASP + 2, closeASP));
                index = closeASP + 2;
              }
        
            }
        
            for (var i = 0; i < scopes.length; i++) {
              generated.push('}');
            }
        
            generated.push('return output;');
        
            var fnText = generated.join('\n');
            return fnText;
        
          }
        
        
          function generateWrite(generated: string[], chunk: string) {
            if (chunk)
              generated.push('output.push(\'' + stringLiteral(chunk) + '\');');
          }
        
          function generateRedirect(generated: string[], redirect: string) {
            generated.push('output.push(' + redirect + ');');
          }
        
          function generateStatement(generated: string[], statement: string) {
            generated.push(statement);
          }
        
          function stringLiteral(text: string) {
            return text.
              replace(/\\/g, '\\\\').
              replace(/\n/g, '\\n').
              replace(/\r/g, '\\r').
              replace(/\t/g, '\\t').
              replace(/\'/g, '\\\'').
              replace(/\"/g, '\\"');
          }
        
        }
    • editor
      • Editor.ts
        module shell.editor {
        
          export class Editor {
        
            private _textarea: HTMLTextAreaElement;
            private _title: HTMLDivElement;
        
            constructor(private _host: HTMLElement, private _file: string, text?: string) {
              this._textarea = <any>elem('textarea', {
                background: 'navy',
                color: 'silver',
                top: '0', left: '0',
                width: '100%', height: '100%', position: 'absolute',
                borderTop: 'solid 1em black'
              }, this._host);
              this._title = <any>elem('div', {
                position: 'absolute',
                top: '0', left: '0',
                width: '100%', height: '1em',
                background: 'silver', color: 'navy',
                text: this._file
              }, this._host);
              if (typeof text === 'string')
                this._textarea.value = text;
            }
        
          focus() {
            this._textarea.focus();
          }
        
            setText(text: string) {
              this._textarea.value = text;
            }
        
            getText(): string {
              return this._textarea.value;
            }
        
            close() {
              this._host.removeChild(this._textarea);
              this._host.removeChild(this._title);
            }
          }
        
        }
    • handlers
      • js
        • base.ts
          module shell.handlers.js {
          
            export var preferredFiles = '*.js;*.json';
          
            //export var entryStyle = {};
          
            export function exec(file: string, callback: Function) {
              // TODO: load in node
            }
          
            export function edit(file: string, editorHost: HTMLElement, callback: Function) {
              // TODO: augment CodeMirror mode when CodeMirror is supported
              return text.edit(file, editorHost, callback);
            }
          
          }
      • text
        • base.ts
          module shell.handlers.text {
          
            export var preferredFiles = '*.txt;*.text';
          
            //export var entryStyle = {};
          
            export function exec(file: string, callback: Function) {
            }
          
            export function edit(file: string, editorHost: HTMLElement, callback: Function) {
            }
          
          }
      • API.d.ts
        declare module shell.handlers {
        
          export interface Handler {
            preferredFiles?: string;
            handlesFiles?: string;
            entryStyle?: {};
            exec?(file: string, callback: Function): void;
            edit?(file: string, editorHost: HTMLElement, callback: Function): void;
          }
        
        }
      • defaults.ts
        module shell.handlers {
          export var defaults = text;
        }
    • panels
      • Panel.ts
        module shell.panels {
        
          var panelClass = 'panels-panel-page';
        
          export class Panel {
        
            private _cursorPath: string;
            private _cursorEntryIndex = -1;
            private _entries: Panel.PageEntry[] = null;
            private _redrawRequested = 0;
        
            private _metrics: Panel.Metrics = null;
        
            private _scrollContent: HTMLElementWithFlags;
        
            private _pages: Panel.PageData[] = [];
        
        		private _entriesInColumn = 0;
            private _pageHeight = 0;
            private _pageInterval = 0;
            private _columnsOnPage = 0;
            private _columnWidth = 0;
        
            private _scrollTop = 0;
            private _scrollTopHeight = 0;
            private _isActive = false;
            private _nextRedrawScrollToCurrent = false;
        
            constructor(
              private _host: HTMLElement,
              private _path: string,
              private _directoryService: (path: string) => Panel.DirectoryEntry[]) {
        
              this._scrollContent = <HTMLElementWithFlags>elem('div', this._host);
              this._scrollContent.isScrollContent = true;
        
              on(this._host, 'scroll', () => this._onscroll());
        
              this._queueRedraw();
            }
        
            set(paths: {currentPath?: string; cursorPath?: string}) {
              if (paths.currentPath)
                this._path = paths.currentPath;
              if (paths.cursorPath) {
                this._cursorPath = paths.cursorPath;
                this._nextRedrawScrollToCurrent = true;
              }
              this._queueRedraw();
            }
        
          	onclick(e: MouseEvent) {
              if (!this._entries) return;
        
              var clickElem = <HTMLElementWithFlags>(e.srcElement || e.target || e.currentTarget);
              var entryDIV: HTMLElementWithFlags;
              var columnDIV: HTMLElementWithFlags;
              var pageDIV: HTMLElementWithFlags;
              var leadPaddingDIV: HTMLElementWithFlags;
        
              while (clickElem) {
        
                if (clickElem.isScrollContent) {
                  if (clickElem !== this._scrollContent) return false;
                  break;
                }
        
                if (clickElem.isPageDIV)
                  pageDIV = clickElem;
        
                if (clickElem.isColumnDIV)
                  columnDIV = clickElem;
        
                if (clickElem.isEntryDIV)
                  entryDIV = clickElem;
        
                clickElem = <any>clickElem.parentElement;
              }
        
              if (entryDIV) {
                for (var i = 0; i < this._entries.length; i++) {
                  if (this._entries[i].entryDIV === entryDIV) {
                    if (this._cursorPath ===this._entries[i].path && (this._entries[i].flags & Panel.EntryFlags.Directory)) {
                      this._cursorPath = this._path;
                      this._path = this._entries[i].path; // double click (or second click) opens directory
                    }
                    else {
                      this._cursorPath = this._entries[i].path;
                    }
                    this._nextRedrawScrollToCurrent = true;
                    this._queueRedraw();
                    break;
                  }
                }
                this._redrawNow();
              }
        
              return true;
            }
        
            currentPath() {
              return this._path;
            }
        
            cursorPath() {
              return this._cursorPath;
            }
        
            arrange(metrics: Panel.Metrics) {
              this._metrics = metrics;
              this._redrawNow();
            }
        
          	isActive() {
              return this._isActive;
            }
        
            activate() {
              this._isActive = true;
              this._scrollContent.className = 'panels-panel-active';
            }
        
            deactivate() {
              this._isActive = false;
              this._scrollContent.className = 'panels-panel-inactive';
            }
        
            cursorGo(direction: number) {
              if (!this._entries || !this._entries.length) return;
        
              var moveStep = 0;
        
              switch (direction) {
        
                case -1: // up
                  moveStep = -1;
                  break;
        
                case +1: // down
                  moveStep = +1;
                  break;
        
                case -10: // left
                  var entryIndex = this._calcEntryIndex(this._cursorEntryIndex);
                  if (this._columnsOnPage === 1) {
                    moveStep = -entryIndex || -1;
                  }
                  else {
                    var columnIndex = this._calcColumnIndex(this._cursorEntryIndex);
                    if (columnIndex > 0) {
                      moveStep = -this._entriesInColumn;
                    }
                    else {
                      moveStep = this._entriesInColumn * (this._columnsOnPage - 1) - 1;
        
                      // overflow cases
                      if (this._cursorEntryIndex === 0) {
                        moveStep = this._entriesInColumn * (this._columnsOnPage - 1);
                      }
                      else if (this._cursorEntryIndex + moveStep >= this._entries.length) { // there is no rightmost column
        
                        var endEntryIndex = this._calcEntryIndex(this._entries.length - 1);
                        var endColumnIndex = this._calcColumnIndex(this._entries.length - 1);
        
                        // if the last entry is higher vertically, stop at the previous column
                        var targetColumnIndex = endEntryIndex >= entryIndex ? endColumnIndex : endColumnIndex - 1;
        
                        if (targetColumnIndex <= columnIndex) {
                          moveStep = -entryIndex; // if nowhere to go right, go all the way up
                        }
                        else {
                          // there are columns on the right, so go there (and one up after)
                          moveStep = (targetColumnIndex - columnIndex) * this._entriesInColumn - 1;
                        }
                      }
                    }
                  }
                  break;
        
                case +10: // right
                  var columnIndex = this._calcColumnIndex(this._cursorEntryIndex);
                  if (columnIndex < this._columnsOnPage - 1) {
                    moveStep = +this._entriesInColumn;
                  }
                  else {
                    moveStep = -this._entriesInColumn * 2 + 1;
                  }
                  break;
        
                case -100: // page up
                  moveStep = -this._entriesInColumn * this._columnsOnPage;
                  break;
        
                case +100: // page down
                  moveStep = +this._entriesInColumn * this._columnsOnPage;
                  break;
              }
        
              if (moveStep) {
                var newCursorEntryIndex = Math.max(0, Math.min(this._entries.length-1, this._cursorEntryIndex + moveStep));
                var e = this._entries[newCursorEntryIndex];
                if (e) {
                  this._cursorPath = this._entries[newCursorEntryIndex].path;
                  this._nextRedrawScrollToCurrent = true;
                  this._queueRedraw();
                }
              }
            }
        
            navigateCursor() {
              if (this._cursorEntryIndex >= 0) {
                var entry = this._entries[this._cursorEntryIndex];
                if (entry) {
                  if (entry.flags & Panel.EntryFlags.Directory) {
                    this._cursorPath = this._path;
                    this._path = entry.path;
                    this._nextRedrawScrollToCurrent = true;
                    this._queueRedraw();
                    return true;
                  }
                }
              }
            }
        
            private _queueRedraw() {
              if (this._redrawRequested) return;
              this._redrawRequested = setTimeout(() => this._redrawNow(), 100);
            }
        
            private _redrawNow() {
        
              var prevOffset = this._calcEntryTopOffset(Math.max(0, this._cursorEntryIndex));
        
              var entries = this._directoryService(this._path);
              this._entries = [];
        
              entries.sort((e1, e2) => {
                var flagCompare = (e1.flags & Panel.EntryFlags.Directory) ?
                  ((e2.flags & Panel.EntryFlags.Directory) ? 0 : -1) :
                  ((e2.flags & Panel.EntryFlags.Directory) ? +1 : 0);
                if (flagCompare) return flagCompare;
        
                var nameCompare = e1.name > e2.name ? 1 : e1.name < e2.name ? -1 : 0;
                return nameCompare;
              });
        
              if (this._path !== '/') {
                var parentPath = this._path.slice(0, this._path.lastIndexOf('/')) || '/';
                entries.unshift({
                  name: '..',
                  path: parentPath,
                  flags: Panel.EntryFlags.Directory
                });
              }
        
              if (!entries || !entries.length) {
                this._scrollContent.innerHTML = '';
                this._pages = [];
                return;
              }
        
              this._cursorEntryIndex = -1;
              for (var i = 0; i < entries.length; i++) {
                if (entries[i].path === this._cursorPath) {
                  this._cursorEntryIndex = i;
                  break;
                }
              }
        
              if (this._cursorEntryIndex < 0) {
                this._cursorEntryIndex = 0;
                this._cursorPath = entries.length > 0 ? entries[0].path : null;
              }
        
              this._entriesInColumn = Math.max(3, ((this._metrics.hostHeight / this._metrics.windowMetrics.emHeight) | 0) - 2);
              this._pageHeight = this._entriesInColumn * this._metrics.windowMetrics.emHeight;
              this._pageInterval = this._metrics.hostHeight - this._pageHeight - this._metrics.windowMetrics.emHeight;
        
              var desiredColumnWidth = 17 * this._metrics.windowMetrics.emWidth;
              this._columnsOnPage = Math.max(1, Math.round(this._metrics.hostWidth / desiredColumnWidth) | 0);
              this._columnWidth = ((this._metrics.hostWidth / this._columnsOnPage) | 0) - 1;
        
              if (!this._pages)
                this._pages = [];
        
              for (var i = 0; i < entries.length; i++) {
                var pageIndex = this._calcPageIndex(i);
                var page = this._pages[pageIndex];
        
                if (page) {
                  if (page.height !== this._pageHeight) {
                    page.height = this._pageHeight;
                    page.pageDIV.style.height = this._pageHeight + 'px';
                  }
                  if (page.leadInterval !== this._pageInterval) {
                    page.leadInterval = this._pageInterval;
                    if (page.leadPaddingDIV)
                      page.leadPaddingDIV.style.height = this._pageInterval + 'px';
                  }
                }
                else {
                  if (pageIndex) {
                    var leadPaddingDIV = <HTMLElementWithFlags>elem('div', {
                      className: 'panels-page-separator',
                      height: this._pageInterval + 'px'
                    }, this._scrollContent);
                    leadPaddingDIV.isLeadPaddingDIV = true;
                  }
        
                  page = {
                    leadPaddingDIV,
                    leadInterval: this._pageInterval,
                    height: this._pageHeight,
                    pageDIV: <HTMLElementWithFlags>elem('div', {
                      className: panelClass,
                      height: this._pageHeight + 'px'
                    }, this._scrollContent),
                    columns: []
                  };
        
                  page.pageDIV.isPageDIV = true;
                  this._pages.push(page);
                }
        
                var columnIndex = this._calcColumnIndex(i);
                var column = page.columns[columnIndex];
                if (column) {
                  if (columnIndex === this._columnsOnPage - 1 && page.columns.length > this._columnsOnPage) {
                    this._removeExcessColumns(page, this._columnsOnPage);
                  }
                  if (column.height !== this._pageHeight) {
                    column.height = this._pageHeight;
                    column.columnDIV.style.height = this._pageHeight + 'px';
                  }
                  if (column.width !== this._columnWidth) {
                    column.width = this._columnWidth;
                    column.columnDIV.style.width = this._columnWidth + 'px';
                  }
                }
                else {
                  column = {
                    height: this._pageHeight,
                    width: this._columnWidth,
                    columnDIV: <HTMLElementWithFlags>elem('div', {
                      className: 'panels-panel-column',
                      height: this._pageHeight + 'px',
                      width: this._columnWidth + 'px'
                    }, page.pageDIV),
                    entries: []
                  };
                  column.columnDIV.isColumnDIV = true;
                  page.columns.push(column);
                }
        
                var dentry = entries[i];
        
                var entryIndex = this._calcEntryIndex(i);
                var entry = column.entries[entryIndex];
                if (!entry) {
        
                  var dirfileClassName = dentry.flags & Panel.EntryFlags.Directory ? ' panels-entry-dir' : ' panels-entry-file';
        
                  var entryClassName =
                    'panels-entry' +
                    dirfileClassName +
                    (this._cursorEntryIndex === i ? ' panels-entry-current' + dirfileClassName + '-current' : '');
        
                  entry = {
                    name: dentry.name,
                    path: dentry.path,
                    flags: dentry.flags,
                    selectionFlags: this._cursorEntryIndex === i ? Panel.SelectionFlags.Current : 0,
                    entryDIV: <HTMLElementWithFlags>elem('div', {
                      className: entryClassName,
                      text: dentry.name,
                      height: this._metrics.windowMetrics.emHeight + 'px'
                    }, column.columnDIV)
                  };
        
                  entry.entryDIV.isEntryDIV = true;
        
                  column.entries.push(entry);
                }
                else {
                  var expectedSelectionFlags = this._cursorEntryIndex === i ? Panel.SelectionFlags.Current : 0;
        
                  if (entry.name !== dentry.name) {
                    entry.name = dentry.name;
                    setText(entry.entryDIV, dentry.name);
                  }
                  if (entry.path !== dentry.path) {
                    entry.path = dentry.path;
                  }
                  if (entry.flags !== dentry.flags || entry.selectionFlags !== expectedSelectionFlags) {
                    var dirfileClassName = dentry.flags & Panel.EntryFlags.Directory ? ' panels-entry-dir' : ' panels-entry-file';
        
                    var entryClassName =
                      'panels-entry' +
                      dirfileClassName +
                      (this._cursorEntryIndex === i ? ' panels-entry-current' + dirfileClassName + '-current' : '');
        
                    entry.entryDIV.className = entryClassName;
        
                    entry.flags = dentry.flags;
                    entry.selectionFlags = expectedSelectionFlags;
                  }
        
        
                  if (entryIndex === this._entriesInColumn - 1 && column.entries.length > this._entriesInColumn) {
                    this._removeExcessEntries(column, this._entriesInColumn);
                  }
        
                }
        
                this._entries.push(entry);
        
              }
        
              this._removeExcessPages(pageIndex + 1);
        
              var p = this._pages[pageIndex];
              this._removeExcessColumns(p, columnIndex + 1);
        
              var c = p.columns[columnIndex];
              this._removeExcessEntries(c, entryIndex + 1);
        
        
        
              var newOffset = this._calcEntryTopOffset(Math.max(0, this._cursorEntryIndex));
              if (this._nextRedrawScrollToCurrent) {
                this._nextRedrawScrollToCurrent = false;
                var maxScroll = newOffset - this._metrics.windowMetrics.emHeight*2;
                var minScroll = newOffset - this._metrics.hostHeight + this._metrics.windowMetrics.emHeight*3;
        
                var newScrollTop =
                    this._scrollTop < minScroll ? minScroll :
                		this._scrollTop > maxScroll ? maxScroll :
                		-1;
        
                if (newScrollTop >=0) {
                  //console.log('redraw: scroll to current [' + newScrollTop + ']');
                  this._host.scrollTop = newScrollTop
                }
              }
              else {
                var prevDistanceFromCenter = prevOffset - (this._scrollTop + this._scrollTopHeight / 2);
        
                var newScrollTop = newOffset - prevDistanceFromCenter - this._metrics.hostHeight / 2;
                //console.log({
                //  prevDistanceFromCenter, prevOffset, this_scrollTop: this._scrollTop, this_scrollTopHeight: this._scrollTopHeight,
                //  newOffset, this_metrics_hostHeight: this._metrics.hostHeight, newScrollTop
                //});
                //console.log('redraw: scroll to approximate prev. [' + newScrollTop + ']');
                this._host.scrollTop = newScrollTop;
              }
        
        
              this._redrawRequested = 0;
        
              // end of _redrawNow()
            }
        
        
        
          	private _removeExcessPages(expectedCount: number) {
              for (var i = this._pages.length - 1; i >= expectedCount; i--) {
                var p = this._pages[i];
                p.pageDIV.parentElement.removeChild(p.pageDIV);
                if (p.leadPaddingDIV)
                  p.leadPaddingDIV.parentElement.removeChild(p.leadPaddingDIV);
              }
        
              if (this._pages.length > expectedCount)
                this._pages = this._pages.slice(0, expectedCount);
            }
        
        
            private _removeExcessColumns(p: { columns: Panel.ColumnData[]; }, expectedCount: number) {
              for (var i = p.columns.length - 1; i >= expectedCount; i--) {
                var c = p.columns[i];
                c.columnDIV.parentElement.removeChild(c.columnDIV);
              }
        
              if (p.columns.length > expectedCount)
                p.columns = p.columns.slice(0, expectedCount);
            }
        
        
            private _removeExcessEntries(c: { entries: Panel.PageEntry[]; }, expectedCount: number) {
              for (var i = c.entries.length - 1; i >= expectedCount; i--) {
                var e = c.entries[i];
                e.entryDIV.parentElement.removeChild(e.entryDIV);
              }
        
              if (c.entries.length > expectedCount)
                c.entries = c.entries.slice(0, expectedCount);
            }
        
        
          	private _onscroll() {
              if (this._redrawRequested) return;
              this._scrollTop = this._host.scrollTop;
              this._scrollTopHeight = this._metrics.hostHeight;
              //console.log('onscroll ' + this._scrollTop);
            }
        
        
            private _calcPageIndex(indexOfEntry: number): number {
              return (indexOfEntry / (this._columnsOnPage * this._entriesInColumn)) | 0;
            }
        
          	private _calcColumnIndex(indexOfEntry: number) {
              return ((indexOfEntry / this._entriesInColumn) | 0) % this._columnsOnPage;
            }
        
          	private _calcEntryIndex(indexOfEntry: number) {
              return indexOfEntry % this._entriesInColumn;
            }
        
          	private _calcEntryTopOffset(indexOfEntry: number) {
              if (!this._metrics || !this._metrics.windowMetrics) return 0;
        
              var pageIndex = this._calcPageIndex(indexOfEntry);
              var entryIndex = this._calcEntryIndex(indexOfEntry);
              var offset =
                pageIndex * this._entriesInColumn * this._metrics.windowMetrics.emHeight + // whole pages
                Math.max(0, pageIndex - 1) * this._pageInterval + // inter-page spaces
                entryIndex * this._metrics.windowMetrics.emHeight; // distance from the top of the page
        
              return offset;
            }
          }
        
        	interface HTMLElementWithFlags extends HTMLElement {
            isScrollContent: boolean;
            isLeadPaddingDIV?: boolean;
            isPageDIV: boolean;
            isColumnDIV: boolean;
            isEntryDIV: boolean;
          }
        
          export module Panel {
        
            export interface Metrics {
              windowMetrics: CommanderShell.Metrics;
              hostWidth: number;
              hostHeight: number;
            }
        
            export interface DirectoryEntry {
              name: string;
              path: string;
              flags: EntryFlags;
            }
        
            export enum EntryFlags {
              Directory = 1
            }
        
            export interface PageData {
              leadPaddingDIV: HTMLElementWithFlags;
              pageDIV: HTMLElementWithFlags;
              columns: ColumnData[];
              height: number;
              leadInterval: number;
            }
        
            export interface ColumnData {
              columnDIV: HTMLElementWithFlags;
              entries: PageEntry[];
              height: number;
              width: number;
            }
        
            export interface PageEntry extends DirectoryEntry {
              entryDIV: HTMLElementWithFlags;
              selectionFlags: SelectionFlags;
            }
        
            export enum SelectionFlags {
              None = 0,
              Current = 1,
              Selected = 2
            }
        
          }
        
        }
      • TwoPanels.ts
        module shell.panels {
        
          var panelHMargin = 10;
          var panelVMargin = 5;
        
          export class TwoPanels {
        
            private _scrollHost: HTMLDivElement;
            private _scrollContent: HTMLDivElement;
        
            private _leftPanelHost: HTMLDivElement;
            private _rightPanelHost: HTMLDivElement;
        
            private _leftPanel: Panel;
            private _rightPanel: Panel;
        
            constructor(
              private _host: HTMLElement,
              leftPath: string,
              rightPath: string,
              private _drive: persistence.Drive) {
        
              this._scrollHost = <any>elem('div', { className: 'panels-scroll-host' }, this._host);
              this._scrollContent = <any>elem('div', { className: 'panels-scroll-content' }, this._scrollHost);
        
              this._leftPanelHost = <any>elem('div', { className: 'panels-panel panels-left-panel' }, this._scrollContent);
              this._rightPanelHost = <any>elem('div', { className: 'panels-panel panels-right-panel' }, this._scrollContent);
        
              var directoryService = driveDirectoryService(this._drive);
        
              this._leftPanel = new Panel(
                this._leftPanelHost,
                leftPath,
                directoryService);
        
              this._rightPanel = new Panel(
                this._rightPanelHost,
                rightPath,
                directoryService);
        
              this._leftPanel.activate();
              /*
              TODO: ensure focus stays with the text input at the bottom
              elem.on(this._leftPanel, 'mousedown', e=> {
                if (e.preventDefault)
                  e.preventDefault();
                return false;
              }); */
        
              on(this._leftPanelHost, 'click', (e: MouseEvent) => this._onclick(e));
              on(this._rightPanelHost, 'click', (e: MouseEvent) => this._onclick(e));
        
            }
        
            measure() {
            }
        
            arrange(metrics: CommanderShell.Metrics) {
        
              var contentWidth = 0;
        
              if (metrics.hostWidth < metrics.emWidth * 80 && metrics.hostWidth < metrics.hostHeight * 1) { 
                // flippable layout
                contentWidth = Math.max(metrics.hostWidth / 2, metrics.hostWidth * 2 - metrics.emWidth * 4);
              }
              else {
                // full layout
                contentWidth = metrics.hostWidth;
              }
        
              var bottomGap = Math.min(metrics.hostHeight / 3, metrics.emHeight * 5.5);
        
              this._scrollHost.style.width = metrics.hostWidth + 'px';
              var panelsHeight = metrics.hostHeight - bottomGap;
              this._scrollHost.style.height = panelsHeight + 'px';
        
              this._scrollContent.style.width = contentWidth + 'px';
              this._scrollContent.style.height = panelsHeight + 'px';
        
              var panelWidth = (contentWidth / 2 - 0.5) | 0;
        
              this._leftPanelHost.style.height = panelsHeight + 'px';
              this._leftPanelHost.style.width = panelWidth + 'px';
        
              this._rightPanelHost.style.height = panelsHeight + 'px';
              this._rightPanelHost.style.width = panelWidth + 'px';
        
              if (this._leftPanelHost.style.display !== 'none') {
                this._leftPanel.arrange({
                  windowMetrics: metrics,
                  hostWidth: panelWidth - panelHMargin * 2,
                  hostHeight: panelsHeight - panelVMargin * 2
                });
              }
        
              if (this._rightPanelHost.style.display !== 'none') {
                this._rightPanel.arrange({
                  windowMetrics: metrics,
                  hostWidth: panelWidth - panelHMargin * 2,
                  hostHeight: panelsHeight - panelVMargin * 2
                });
              }
            }
        
            isVisible() {
              return this._scrollHost.style.display !== 'none';
            }
        
            toggleVisibility() {
              this._scrollHost.style.display = this.isVisible() ? 'none' : 'block';
            }
        
            isLeftActive() {
              return this._leftPanel.isActive();
            }
        
            toggleActivePanel() {
              if (!this.isVisible()) return;
        
              var isLeftActive = this._leftPanel.isActive();
              this._getPanel(isLeftActive).deactivate();
              this._getPanel(!isLeftActive).activate();
            }
        
            temporarilyHidePanels(): () => void {
        
              var start = +new Date();
              var stayTime = 200;
              var fadeTime = 500;
              var opacity = 0.1;
              var applyOpacity = () => {
                this._scrollHost.style.opacity = <any>opacity;
                this._scrollHost.style.filter = 'alpha(opacity=' + (opacity * 100) + ')';
              };
              applyOpacity();
        
              var animateBack = () => {
                animateBack = () => { };
        
                var startFade = () => {
                  var fadeStart = +new Date();
                  var ani = setInterval(() => {
                    var passed = (Date.now ? Date.now() : +new Date()) - fadeStart;
                    if (passed > fadeTime) {
                      clearInterval(ani);
                      this._scrollHost.style.opacity = null;
                      this._scrollHost.style.filter = null;
                      return;
                    }
        
                    opacity = passed / fadeTime;
                    applyOpacity();
                  }, 1);
                };
        
                var sinceStart = +new Date() - start;
                if (sinceStart >= stayTime) {
                  startFade();
                }
                else {
                  setTimeout(startFade, fadeTime - sinceStart);
                }
              };
        
              return animateBack;
            }
        
            keydown(e: KeyboardEvent): boolean {
              switch (e.keyCode) {
                case 38:
                  return this._selectionGo(-1);
                case 40:
                  return this._selectionGo(+1);
                case 33:
                  return this._selectionGo(-100);
                case 34:
                  return this._selectionGo(+100);
                case 37:
                  return this._selectionGo(-10);
                case 39:
                  return this._selectionGo(+10);
                case 9:
                  this.toggleActivePanel();
                  return true;
                case 86: // U
                  if (e.ctrlKey || e.metaKey)
                    return this.togglePanelPaths();
                  break;
        
                case 112: // F1
                  if (e.ctrlKey || e.metaKey) {
                    return this.togglePartHidden(true);
                  }
                  break;
        
                case 113: // F2
                  if (e.ctrlKey || e.metaKey) {
                    return this.togglePartHidden(false);
                  }
                  break;
        
                case 13: // Enter
                  var activePa = this._getPanel(this.isLeftActive());
                  return activePa.navigateCursor();
        
                default:
                  if (e.ctrlKey) {
                    //console.log('ctrl ' + e.keyCode);
                  }
                  break;
              }
        
              return false;
            }
        
            togglePartHidden(leftPanel: boolean) {
              var togglePanelHost = this._getPanelHost(leftPanel);
              var oppositePanelHost = this._getPanelHost(!leftPanel);
        
              if (!this.isVisible()) {
                togglePanelHost.style.display = 'block';
                oppositePanelHost.style.display = 'none';
                if (this.isLeftActive() !== leftPanel)
                  this.toggleActivePanel();
                this.toggleVisibility();
              }
              else {
                if (togglePanelHost.style.display !== 'none') {
                  if (oppositePanelHost.style.display === 'none') {
                    togglePanelHost.style.display = 'block';
                    this.toggleVisibility();
                  }
                  else {
                    togglePanelHost.style.display = 'none';
                    if (this.isLeftActive() === leftPanel)
                      this.toggleActivePanel();
                  }
                }
                else {
                  togglePanelHost.style.display = 'block';
                }
              }
              return true;
            }
        
            togglePanelPaths() {
              console.log('Ctrl+U toggle is not implemented.');
              return false;
            }
        
            cursorPath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(this.isLeftActive());
              return pan.cursorPath();
            }
        
            currentPath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(this.isLeftActive());
              return pan.currentPath();
            }
        
            cursorOppositePath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(!this.isLeftActive());
              return pan.cursorPath();
            }
        
            currentOppositePath() {
              if (!this.isVisible()) return null;
              var pan = this._getPanel(!this.isLeftActive());
              return pan.currentPath();
            }
        
            private _selectionGo(direction: number) {
              var panel = this._getPanel(this.isLeftActive()).cursorGo(direction);
              return true;
            }
        
            private _getPanel(left: boolean) {
              return left ? this._leftPanel : this._rightPanel;
            }
        
            private _getPanelHost(left: boolean) {
              return left ? this._leftPanelHost : this._rightPanelHost;
            }
        
            private _onclick(e: MouseEvent) {
              var isLeft = this._leftPanel.onclick(e);
              if (!isLeft && !this._rightPanel.onclick(e))
                return;
        
              if (isLeft === this.isLeftActive()) return;
        
              this.toggleActivePanel();
            }
        
          }
        
        }
      • driveDirectoryService.ts
        module shell.panels {
        
          export function driveDirectoryService(drive: persistence.Drive) {
        
            return path => {
              var pathPrefix = path === '/' ? path : path + '/';
              var result: Panel.DirectoryEntry[] = [];
              var resByName: { [name: string]: Panel.DirectoryEntry; } = {};
              var files = drive.files();
              for (var i = 0; i < files.length; i++) {
                var fi = files[i];
                if (fi.length < pathPrefix.length + 1) continue;
        
                if (fi.slice(0, pathPrefix.length) !== pathPrefix) continue;
        
                var name: string;
                var entryPath = fi;
                var isDirectory = false;
                var nextSlashPos = fi.indexOf('/', pathPrefix.length);
                if (nextSlashPos < 0) {
                  name = fi.slice(pathPrefix.length);
                }
                else {
                  name = fi.slice(pathPrefix.length, nextSlashPos);
                  entryPath = fi.slice(0, nextSlashPos);
                  isDirectory = true;
                }
        
                if (resByName.hasOwnProperty(name)) continue;
                var entry = { path: entryPath, name, flags: isDirectory ? Panel.EntryFlags.Directory : 0 };
                result.push(entry);
                resByName[name] = entry;
              }
              return result;
            };
        
          }
        
        }
      • panels.css
        .panels-scroll-host {
          position: absolute;
          left: 0; top: 0; width: 0; height: 0;
          overflow: auto;
          overflow-y: hidden;
          background: black;
          background: transparent;
        }
        
        .panels-scroll-content {
          width: 0; height: 0;   overflow: hidden;
        }
        
        .panels-panel {
          width: 0; height: 0;
          overflow: auto;
          overflow-x: hidden;
          background: rgba(4, 12, 64, 0.95) !important;
          background: navy;
          color: darkcyan;
          padding-top: 10px;
          padding-bottom: 10px;
          cursor: default;
        }
        
        .panels-panel * {
          cursor: default;
        }
        
        .panels-left-panel {
          float: left;
        }
        
        .panels-right-panel {
          float: right;
        }
        
        .panels-panel-page {
          clear: both;
        }
        
        .panels-page-separator {
          clear: both;
        }
        
        .panels-panel-column {
          float: left;
        }
        
        .panels-entry {
          padding-left: 10px;
          padding-right: 10px;
        }
        
        .panels-entry-dir {
          color: white;
        }
        
        .panels-panel-active .panels-entry-current {
          background: darkcyan;
        }
        
        .panels-panel-active .panels-entry-file-current {
          color: navy;
        }
        
        ::-webkit-scrollbar {
            width: 0.5em;
            height: 0.5em
        }
    • terminal
      • Terminal.ts
        module shell.terminal {
        
          export class Terminal {
        
            private _history: HTMLDivElement;
            private _historyContent: HTMLDivElement;
            private _prompt: HTMLDivElement;
            private _input: HTMLTextAreaElement;
        
            private _promptWidth = 0;
            private _historyContentHeight = 0;
            private _hostMetrics: CommanderShell.Metrics = null;
        
            constructor(private _host: HTMLElement, private _repl: noapi.HostedProcess) {
              this._history = <any>elem('div', { className: 'terminal-history' }, this._host);
              this._historyContent = <any>elem('pre', {
                className: 'terminal-history-content',
                text: 'Hello world from mini-shell\n\nVersion 0.7s\n'+shell.buildMessage+'\nOleg Mihailik\n\nPlease be careful.'
              }, this._history);
        
              this._prompt = <any>elem('div', { className: 'terminal-prompt', text: '>' }, this._host);
        
              this._input = <any>elem('textarea', { className: 'terminal-input', autofocus: true }, this._host);
        
              setTimeout(() => this._input.focus(), 1);
        
            }
        
          	writeDirect(text: string) {
              elem('div', { text, opacity: 0.4 }, this._historyContent);
        
              if (this._hostMetrics) {
                this.measure();
                this.arrange(this._hostMetrics);
              }
            }
        
            log(args: any[]) {
              log(args, this._historyContent);
        
              if (this._hostMetrics) {
                this.measure();
                this.arrange(this._hostMetrics);
              }
            }
        
            hasInput() {
              return !!this._getInput();
            }
        
          	private _getInput() {
              return (this._input.value || '').replace(/[\r\n]/g, '');
            }
        
        
            focus() {
              this._input.focus();
            }
        
          	temporarilyHidePrompt(replacementText: string): () => void {
              // TODO: hide prompt, display replacement text instead
              return () => { };
            }
        
            measure() {
              this._promptWidth = this._prompt.offsetWidth;
              this._historyContentHeight = this._historyContent.offsetHeight;
            }
        
            arrange(metrics: CommanderShell.Metrics) {
        
              this._hostMetrics = metrics;
        
              this._history.style.width = metrics.hostWidth + 'px';
        
              this._history.style.bottom = (metrics.emHeight * 2.2) + 'px';
              if (metrics.hostHeight - metrics.emHeight * 2.2 > this._historyContentHeight) {
                this._history.style.height = this._historyContentHeight + 'px';
              }
              else {
                this._history.style.height = (metrics.hostHeight - metrics.emHeight * 2.2) + 'px';
                this._history.scrollTop = this._historyContentHeight - (metrics.hostHeight - metrics.emHeight * 2);
              }
              this._input.style.left = this._promptWidth + 'px';
              this._input.style.width = (metrics.hostWidth - this._promptWidth) + 'px';
            }
        
          	clearInput() {
              setTimeout(() => {
                var cleanInput = this._getInput();
                if (this._input.value !== cleanInput) {
                  this._input.value = cleanInput;
                }
              }, 10);
            }
        
            keydown(e: KeyboardEvent, cursorPath: string) {
              if (e.keyCode === 38) {
                // TODO history
              }
              else if (e.keyCode === 13) {
                var code = this._getInput();
        
                if (code) {
                  if (code.slice(-2) === '\r\n')
                    code = code.slice(0, code.length - 2);
                  this._input.value = '';
                  elem('div', {
                    text: code,
                    color: 'gray'
                  }, this._historyContent);
        
                  this._evalAndLogResults(code);
                  return true;
                }
                else {
                  return false;
                }
              }
            }
        
            private _evalAndLogResults(code: string) {
        
              var result;
              try {
                result = this._repl.eval(code);
              }
              catch (error) {
                elem('div', {
                  text: error && error.stack ? error.stack : error,
                  color: 'red'
                }, this._historyContent);
                if (this._hostMetrics) {
                  this.measure();
                  this.arrange(this._hostMetrics);
                }
                return;
              }
        
              this.log([result]);
            }
        
        
          }
        
        }
      • log.ts
        module shell.terminal {
        
          export function log(args: any[], historyContent: HTMLElement) {
            var output = elem('div', historyContent);
            for (var i = 0; i < args.length; i++) {
              if (i > 0)
                elem('span', { text: ' ' }, output);
              if (args[i] === null) {
                elem('span', { text: 'null', color: 'green' }, output);
              }
              else {
                logAppendObj(args[i], <any>output, 0);
              }
            }
          }
        }
      • logAppendObj.ts
        module shell.terminal {
        
          export function logAppendObj(obj: any, output: HTMLDivElement, level: number) {
            switch (typeof obj) {
              case 'number':
              case 'boolean':
                elem('span', { text: obj, color: 'green' }, output);
                break;
        
              case 'undefined':
                elem('span', { text: 'undefined', color: 'green', opacity: 0.5 }, output);
                break;
        
              case 'function':
                var funContainer = elem('span', output);
                var funFunction = elem('span', { text: 'function ', color: 'silver', opacity: 0.5 }, funContainer);
                var funName = elem('span', { text: obj.name, color: 'cornflowerblue', fontWeight: 'bold' }, funContainer);
                funContainer.title = obj;
                break;
        
              case 'string':
                var strContainer = elem('span', output);
                elem('span', { text: '"', color: 'tomato' }, strContainer);
                elem('span', { text: obj, color: 'tomato', opacity: 0.5 }, strContainer);
                elem('span', { text: '"', color: 'tomato' }, strContainer);
                break;
        
              default:
                if (obj === null) {
                  elem('span', { text: 'null', color: 'green', opacity: 0.5 }, output);
                  break;
                }
        
                if (typeof obj.getFullYear === 'function' && typeof obj.getTime === 'function' && typeof obj.constructor.parse === 'function') {
                  elem('span', { text: 'Date(', color: 'green', opacity: 0.5 }, output);
                  elem('span', { text: obj, color: 'green' }, output);
                  elem('span', { text: ')', color: 'green', opacity: 0.5 }, output);
                  break;
                }
        
                if (obj.constructor && obj.constructor.name !== 'Object' && obj.constructor.name !== 'Array') {
                  elem('span', { text: obj.constructor.name, color: 'cornflowerblue' }, output);
                  if (obj.constructor.prototype && obj.constructor.prototype.constructor
                    && obj.constructor.prototype.constructor.name
                    && obj.constructor.prototype.constructor.name !== 'Object' && obj.constructor.prototype.constructor.name !== 'Array'
                    && obj.constructor.prototype.constructor.name !== obj.constructor.name)
                    elem('span', { text: ':' + obj.constructor.prototype.constructor.name, color: 'cornflowerblue', opacity: 0.5 }, output);
                  elem('span', output);
                }
        
                if (typeof obj.length === 'number' && obj.length >= 0) {
                  elem('span', { text: '[', color: 'white' }, output);
                  if (level > 1) {
                    elem('span', { text: '...', color: 'silver' }, output);
                    // TODO: handle click
                  }
                  else {
                    for (var i = 0; i < obj.length; i++) {
                      if (i > 0) elem('span', { text: ', ', color: 'gray' }, output);
                      if (typeof obj[i] !== 'undefined')
                        logAppendObj(obj[i], output, level + 1);
                    }
                  }
                  elem('span', { text: ']', color: 'white' }, output);
                }
                else if (obj.createElement + '' === document.createElement + '' && obj.getElementById + '' === document.getElementById + '' && 'title' in obj) {
                  elem('span', { text: '#document ' + obj.title, color: 'green' }, output);
                }
                else if (obj.setInterval + '' === window.setInterval + '' && obj.setTimeout + '' === window.setTimeout + '' && 'location' in obj) {
                  elem('span', { text: '#window ' + obj.location, color: 'green' }, output);
                }
                else if (typeof obj.tagName === 'string' && obj.getElementsByTagName + '' === document.body.getElementsByTagName + '') {
                  elem('span', { text: '<' + obj.tagName + '>', color: 'green' }, output);
                }
                else if (obj + '' !== '[Object]') {
                  elem('span', { text: '{', color: 'cornflowerblue' }, output);
                  if (level > 1) {
                    elem('span', { text: '...', color: 'cornflowerblue', opacity: 0.5 }, output);
                    // TODO: handle click
                  }
                  else {
                    var first = true;
                    var hadMessage = false;
                    for (var k in obj) {
                      if (obj.hasOwnProperty && !obj.hasOwnProperty(k)) continue;
                      if (first) {
                        first = false;
                      }
                      else {
                        elem('span', { text: ', ', color: 'cornflowerblue', opacity: 0.3 }, output);
                        first = false;
                      }
                      elem('span', { text: k, color: 'cornflowerblue', fontWeight: 'bold' }, output);
                      elem('span', { text: ': ', color: 'cornflowerblue', opacity: 0.5 }, output);
                      logAppendObj(obj[k], output, level + 1);
                      if (k === 'message') hadMessage = true;
                    }
                    if (typeof obj.message === 'string' && ! hadMessage) {
                      elem('span', { text: 'message', color: 'tomato', fontWeight: 'bold' }, output);
                      elem('span', { text: ': ', color: 'tomato', opacity: 0.5 }, output);
                      elem('span', { text: obj.message, color: 'tomato' }, output);
                    }
                  }
                  elem('span', { text: '}', color: 'cornflowerblue' }, output);
                }
                else {
                  elem('span', { text: obj, color: 'cornflowerblue' }, output);
                }
                break;
            }
          }
        
        }
      • terminal.css
        .terminal-history {
          position: absolute;
          left: 0; bottom: 1.6em;
          width: 100%; height: 0;
          overflow-y: auto;
          overflow-x: hidden;
        }
        
        .terminal-history-content {
          margin: 0; padding: 0;
        }
        
        .terminal-prompt {
          position: absolute;
          left: 0; bottom: 1.5em;
          height: 1em;
        }
        
        .terminal-input {
          position: absolute;
          left: 0; bottom: 1.5em;
          width: 0; height: 1em;
          font: inherit;
          border: none;
          background: transparent;
          color: silver;
          outline: none;
          resize: none;
          overflow: hidden;
        }
    • API.d.ts
      declare module shell {
      
        export var drive: persistence.Drive;
      
      }
    • CommanderShell.ts
      module shell {
      
        export class CommanderShell {
      
          private _metricElem: HTMLDivElement;
          private _twoPanels: panels.TwoPanels;
          private _terminal: terminal.Terminal;
      
          private _metrics: CommanderShell.Metrics = {
            hostWidth: 0,
            hostHeight: 0,
            emWidth: 0,
            emHeight: 0
          };
      
          private _onsizechangedTimeout: number = 0;
          private _repl: noapi.HostedProcess;
          private _replAlive: Function;
      
          private _editor: editor.Editor = null;
      
          private _fnKeys: HTMLElement[] = [];
      
          constructor(private _host: HTMLElement, private _drive: persistence.Drive, complete: () => string) {
      
            this._repl = new noapi.HostedProcess({
              window: window,
              drive: this._drive,
              scriptPath: '/node_modules/repl.js',
              console: { log: (...args: any[]) => this._terminal.log(args) }
            });
            this._enhanceNoprocess(this._repl);
            this._replAlive = this._repl.keepAlive();
      
            elem(this._host, {
              background: 'black',
              color: 'silver'
            });
      
            this._metricElem = <any>elem('div', {
              position: 'absolute',
              opacity: 0,
              left: '-200px', top: '-200px',
              wdith: 'auto', height: 'auto'
            }, document.body);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
            elem('div', { text: 'MMMMMMMM' }, this._metricElem);
      
            this._terminal = new terminal.Terminal(this._host, this._repl);
            this._twoPanels = new panels.TwoPanels(this._host, '/', '/src', this._drive);
      
            var fnKeyActions = [null, 'Help', '<None>', 'View', 'Edit', 'Copy', 'Move', 'MkDir', 'Delete', 'Options', 'Save'];
            for (var i = 1; i <= 10; i++) {
              var fnKeyText = elem('div', {
                position: 'absolute', bottom: '0',
                whiteSpace: 'nowrap',
                cursor: 'pointer'
              }, this._host);
              var keyName = (i === 1 ? 'F1' : '' + i);
              elem('span', { background: 'black', color: 'gray', text: keyName + ' ' }, fnKeyText);
              elem('span', { background: 'gray', color: 'black', text: fnKeyActions[i] }, fnKeyText);
              this._fnKeys.push(fnKeyText);
            }
      
            on(this._fnKeys[4 - 1], 'click', () => {
              var cursorPath = this._twoPanels.cursorPath();
              this._openEditor(cursorPath);
            });
            on(this._fnKeys[5 - 1], 'click', () => {
              this._copyCommand();
              return true;
            });
            on(this._fnKeys[6 - 1], 'click', () => {
              this._moveCommand();
              return true;
            });
            on(this._fnKeys[7 - 1], 'click', () => {
              this._mkdirCommand();
              return true;
            });
            on(this._fnKeys[8 - 1], 'click', () => {
              this._removeCommand();
              return true;
            });
      
            on(this._fnKeys[10 - 1], 'click', () => {
              this._exportAllHTML();
            });
      
            var resizeMod = require('resize');
            resizeMod.on(winMetrics => {
              this._metrics.hostWidth = winMetrics.windowWidth;
              this._metrics.hostHeight = winMetrics.windowHeight;
              this.measure();
              this.arrange();
            });
      
            this._metrics.hostWidth = document.body.offsetWidth;
            this._metrics.hostHeight = document.body.offsetHeight;
      
            this.measure();
            this.arrange();
      
            on(this._host, 'keydown', e => this._keydown(<any>e));
      
            var _glob = (function() { return this; })();
            var applyConsole = (glob) => {
              if (glob.console) {
                var _oldLog: Function = glob.console.log;
                var term = this._terminal;
                console.log = function() {
                  var args = [];
                  for (var i = 0; i < arguments.length; i++) {
                    args.push(arguments[i]);
                  }
                  term.log(args);
                  if (typeof _oldLog === 'function')
                    _oldLog.apply(glob.console, args);
                };
              }
              else {
                var term = this._terminal;
                glob.console = {
                  log: function() {
                    var args = [];
                    for (var i = 0; i < arguments.length; i++) {
                      args.push(arguments[i]);
                    }
                    term.log(args);
                  }
                };
              }
            };
      
            applyConsole(_glob);
            applyConsole(window);
      
            setTimeout(() => {
              this._terminal.writeDirect(complete());
            }, 1);
          }
      
          measure() {
            this._metrics.emWidth = this._metricElem.offsetWidth/8;
            this._metrics.emHeight = this._metricElem.offsetHeight/8;
            this._twoPanels.measure();
            this._terminal.measure();
            //this._editor.measure();
          }
      
          arrange() {
            this._host.style.width = this._metrics.hostWidth + 'px';
            this._host.style.height = this._metrics.hostHeight + 'px';
            this._twoPanels.arrange(this._metrics);
            this._terminal.arrange(this._metrics);
            //this._editor.arrange();
      
            var keySize = ((this._metrics.hostWidth / 10) | 0);
            for (var i = 0; i < this._fnKeys.length; i++) {
              this._fnKeys[i].style.left = (i * keySize) + 'px';
              this._fnKeys[i].style.width = keySize + 'px';
            }
          }
      
          private _keydown(e: KeyboardEvent) {
            var res = this._keydownCore(e);
            if (res) {
              if (e.preventDefault)
                e.preventDefault();
            }
            return res;
          }
      
          private _keydownCore(e: KeyboardEvent) {
            if (this._editor) {
              if (e.keyCode === 27) {
                this._closeEditor();
                return true;
              }
              return;
            }
      
            if (e.keyCode === 27 && !e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey) {
              this._twoPanels.toggleVisibility();
              return true;
            }
      
            if (e.keyCode === 13)
              this._terminal.clearInput();
      
            if ((e.keyCode === 13 && this._twoPanels.isVisible() && !this._terminal.hasInput())
              || (e.keyCode !== 13)) {
              if (this._twoPanels.keydown(e)) return true;
            }
      
            var cursorPath = this._twoPanels.cursorPath();
      
            this._terminal.focus();
            if (this._terminal.keydown(e, cursorPath)) return true;
      
            if (e.keyCode === 13)
              return this._execute(cursorPath, null);
      
            //if (e.keyCode < 32 || e.keyCode > 126) {
            //	this._terminal.log('CommanderShell::keydown ' + e.yCode);
            //}
      
            if (e.keyCode === 115) { // F4
              var editorPath = cursorPath;
              if (e.shiftKey) {
                editorPath = prompt('Edit file:', editorPath);
                if (!editorPath) return;
              }
              this._openEditor(editorPath);
              return true;
            }
      
            if (e.keyCode === 116) { // F5
              this._copyCommand();
              return true;
            }
      
            if (e.keyCode === 117) { // F6
              this._moveCommand();
              return true;
            }
      
            if (e.keyCode === 118) { // F7
              this._mkdirCommand();
              return true;
            }
      
            if (e.keyCode === 119) { // F8
              this._removeCommand();
              return true;
            }
      
            if (e.keyCode === 121) { // F10
              this._exportAllHTML();
              return true;
            }
      
            if (e.ctrlKey || e.altKey || e.metaKey) {
              this._terminal.log(['CommanderShell::keydown ', e.keyCode]);
            }
          }
      
          private _getFilesFor(path: string): string[] {
            var fileResult: string[] = [];
            var allFiles = this._drive.files();
            for (var i = 0; i < allFiles.length; i++) {
              var f = allFiles[i];
              if (f.slice(0, path.length) !== path) continue;
              if (f === path || f.slice(path.length, path.length + 1) === '/')
                fileResult.push(f);
            }
            return fileResult;
          }
      
          private _copyCommand() {
            var cursorPath = this._twoPanels.cursorPath();
            var currentOppositePath = this._twoPanels.currentOppositePath();
            if (!cursorPath || !currentOppositePath || cursorPath === '/') return;
      
            var filesToCopy: string[] = this._getFilesFor(cursorPath);
      
            var targetDir = prompt('Copy ' + filesToCopy.length + ' files from\n   "' + cursorPath + '"\n  to', currentOppositePath);
            if (!targetDir) return;
      
            var normTargetDir = targetDir;
      
            if (filesToCopy.length === 1 && filesToCopy[0] === cursorPath && normTargetDir.slice(-1) !== '/') {
              var content = this._drive.read(filesToCopy[0]);
              this._drive.write(normTargetDir, content);
            }
            else {
              if (normTargetDir.slice(-1) != '/') normTargetDir += '/';
              var baseDir = cursorPath.slice(0, cursorPath.lastIndexOf('/') + 1);
      
              for (var i = 0; i < filesToCopy.length; i++) {
                var content = this._drive.read(filesToCopy[i]);
                var newPath =
                  normTargetDir +
                  filesToCopy[i].slice(baseDir.length);
                this._drive.write(newPath, content);
              }
            }
            this.measure();
            this.arrange();
          }
      
          private _moveCommand() {
            var cursorPath = this._twoPanels.cursorPath();
            var currentOppositePath = this._twoPanels.currentOppositePath();
            if (!cursorPath || !currentOppositePath || cursorPath === '/') return;
      
            var filesToCopy: string[] = this._getFilesFor(cursorPath);
      
            var targetDir = prompt('Move/rename ' + filesToCopy.length + ' files from\n   "' + cursorPath + '"\n  to', currentOppositePath);
            if (!targetDir) return;
      
            var normTargetDir = targetDir;
      
            if (filesToCopy.length === 1 && filesToCopy[0] === cursorPath && normTargetDir.slice(-1) !== '/') {
              var content = this._drive.read(filesToCopy[0]);
              this._drive.write(normTargetDir, content);
              this._drive.write(filesToCopy[0], null);
            }
            else {
              if (normTargetDir.slice(-1) !== '/') normTargetDir += '/';
              var baseDir = cursorPath.slice(0, cursorPath.lastIndexOf('/') + 1);
      
              for (var i = 0; i < filesToCopy.length; i++) {
                var content = this._drive.read(filesToCopy[i]);
                var newPath =
                  normTargetDir +
                  filesToCopy[i].slice(baseDir.length);
                this._drive.write(newPath, content);
                this._drive.write(filesToCopy[i], null);
              }
            }
            this.measure();
            this.arrange();
      
          }
      
          private _mkdirCommand() {
            var dir = prompt('Make directory: ');
            if (!dir || dir === '/') return;
      
            var dirPath = dir;
            if (dir.slice(0, 1) !== '/') {
              dirPath = this._twoPanels.currentPath() + '/' + dirPath;
              if (dirPath.slice(0, 2) === '//') dirPath = dirPath.slice(1);
            }
      
            if (dirPath.slice(-1) === '/')
              dirPath = dirPath.slice(0, dirPath.length - 1);
      
            var matchFiles = this._getFilesFor(dirPath);
            if (matchFiles.length) return;
      
            this._drive.write(dirPath + '/', '');
            this.measure();
            this.arrange();
          }
      
          private _removeCommand() {
            var cursorPath = this._twoPanels.cursorPath();
            if (!cursorPath || cursorPath === '/') return;
      
            var filesToRemove: string[] = this._getFilesFor(cursorPath);
      
            if (!confirm('Remove ' + filesToRemove.length + ' files from\n   "' + cursorPath + '"?')) return;
      
            for (var i = 0; i < filesToRemove.length; i++) {
              this._drive.write(filesToRemove[i], null);
            }
            this.measure();
            this.arrange();
          }
      
          private _closeEditor() {
            var newText = this._editor.getText();
            var cursorPath = this._twoPanels.cursorPath();
            var oldText = this._drive.read(cursorPath);
            if (newText !== oldText) {
              if (confirm('File was changed: ' + cursorPath + ', save before exit?'))
                this._drive.write(cursorPath, newText);
            }
            this._editor.close();
            this._editor = null;
            this.measure();
            this.arrange();
          }
      
          private _openEditor(cursorPath: string) {
            if (cursorPath) {
              var text = this._drive.read(cursorPath);
              if (typeof text === 'string') {
                this._terminal.log(['@edit ', cursorPath]);
                this._editor = new editor.Editor(this._host, cursorPath, text);
                setTimeout(() => {
                  if (this._editor) this._editor.focus();
                }, 1);
              }
              else {
                this._terminal.log(['text at ', cursorPath, ' is ', text]);
              }
            }
            else {
              this._terminal.log(['cursorPath = ', cursorPath]);
            }
          }
      
          private _exportAllHTML() {
            var window = require('nowindow');
            var document = window.document;
      
            this._terminal.log(['@save']);
            var filename = saveFileName();
            exportBlob(filename, ['<!doctype html>\n', document.documentElement.outerHTML]);
      
            function exportBlob(filename: string, textChunks: string[]) {
              try {
                var blob: Blob = new (<any>Blob)(textChunks, { type: 'application/octet-stream' });
              }
              catch (blobError) {
                exportDocumentWrite(filename, textChunks.join(''));
                return;
              }
      
              exportBlobHTML5(filename, blob);
            }
      
            function exportBlobHTML5(filename, blob: Blob) {
              var url = URL.createObjectURL(blob);
              var a = document.createElement('a');
              a.href = url;
              a.setAttribute('download', filename);
              try {
                // safer save method, supposed to work with FireFox
                var evt = document.createEvent("MouseEvents");
                (<any>evt).initMouseEvent("click", true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
                a.dispatchEvent(evt);
              }
              catch (e) {
                a.click();
              }
            }
      
            function exportDocumentWrite(filename: string, content: string) {
              var win = document.createElement('iframe');
              win.style.width = '100px';
              win.style.height = '100px';
              win.style.display = 'none';
              document.body.appendChild(win);
      
              setTimeout(() => {
                var doc = win.contentDocument || (<any>win).document;
                doc.open();
                doc.write(content);
                doc.close();
      
                doc.execCommand('SaveAs', null, filename);
              }, 200);
      
            }
      
            function saveFileName() {
      
              if (window.location.protocol.toLowerCase() === 'blob:')
                return 'mi-save.html';
      
              var urlParts = window.location.pathname.split('/');
              var currentFileName = decodeURI(urlParts[urlParts.length - 1]);
              var lastDot = currentFileName.indexOf('.');
              if (lastDot > 0) {
                currentFileName = currentFileName.slice(0, lastDot) + '.html';
              }
              else {
                currentFileName += '.html';
              }
              return currentFileName;
            }
          }
      
          private _enhanceNoprocess(nopro: noapi.HostedProcess) {
            nopro.coreModules['nodrive'] = this._drive;
            nopro.coreModules['nowindow'] = window;
          }
      
          private _execute(cursorPath: string, callback: Function) {
      
            if (/\.js$/.test(cursorPath)) {
              var text = this._drive.read(cursorPath);
              if (typeof text !== 'undefined' && text !== null) {
                this._terminal.log(['@node ' + cursorPath]);
                var ani = this._twoPanels.temporarilyHidePanels();
      
                setTimeout(() => {
                  try {
                    var proc = new noapi.HostedProcess({
                      window: window,
                      drive: this._drive,
                      scriptPath: cursorPath,
                      console: { log: (...args: any[]) => this._terminal.log(args) }
                    });
                    this._enhanceNoprocess(proc);
                    var result = proc.eval(text);
                    if (typeof proc.exitCode == 'number')
                      result = proc.exitCode;
                    else
                      result = proc.mainModule.exports;
                  }
                  catch (error) {
                    result = error;
                  }
                  ani();
                  this._terminal.log([result]);
                },
                  1);
      
                return true;
              }
            }
            else if (/\.ts$/.test(cursorPath)) {
              var text = this._drive.read('/src/typescript/tsc.js');
              if (typeof text !== 'undefined' && text !== null) {
                this._terminal.log(['@tsc ' + cursorPath]);
                var ani = this._twoPanels.temporarilyHidePanels();
                setTimeout(() => {
                  try {
                    var proc = new noapi.HostedProcess({
                      window: window,
                      drive: this._drive,
                      scriptPath: '/src/typescript/tsc.js',
                      argv: ['node', '/src/typescript/tsc.js', cursorPath],
                      console: { log: (...args: any[]) => this._terminal.log(args) }
                    });
                    this._enhanceNoprocess(proc);
                    setTimeout(() => {
                      if (!finishedOK) {
                        var compileTime = +new Date() - start;
                        this._terminal.log(['Compilation seems to have failed after ' + compileTime / 1000 + ' sec.']);
                        ani();
                      }
                    }, 100);
                    var start = +new Date();
                    this._terminal.log(['... started at ' + (new Date())]);
                    var result = proc.eval(text);
                    this._terminal.log(['...finished at ' + (new Date())]);
                    if (typeof proc.exitCode == 'number')
                      result = proc.exitCode;
                    else
                      result = proc.mainModule.exports;
                    this._terminal.log([result]);
                  }
                  catch (error) {
                    this._terminal.log([error]);
                  }
                  var finishedOK = true;
                  ani();
                }, 1);
                return true;
              }
            }
            else if (/.html$/.test(cursorPath)) {
              this._terminal.log(['@build ' + cursorPath]);
              var ani = this._twoPanels.temporarilyHidePanels();
              setTimeout(() => {
      
                var htmlTemplate = this._drive.read(cursorPath);
      
                var blankWindow = window.open('', '_blank' + (+new Date()));
      
                var pollUntil = (+new Date()) + 1000;
      
                while (+new Date() < pollUntil) {
                  try {
                    var blankWindowDoc = blankWindow.document;
                  }
                  catch (error) { }
                }
      
                if (!blankWindowDoc) {
                  alert('Cannot open a window to host the built document');
                  ani();
                  return;
                }
      
                blankWindow.document.open();
                blankWindow.document.write([
                  '<html><title>Building ' + cursorPath + '...</title>',
                  '<style>',
                  'html, body { background: black; color: greenyellow; }',
                  'h2 { font-weight: 100; width: 40%; position: fixed; font-size: 200%; }',
                  'pre { width: 50%; padding-left: 50%; opacity: 1; transition: opacity 1s; }',
                  '</style>',
                  '<h2>Building ' + cursorPath + '</h2>',
                  '<' + 's' + 'cript>',
                  'var textContentProp = "textContent" in document.createElement("pre") ? "textContent" : "innerText";',
                  'var lastLogElem;',
                  'function log(text) {',
                  '  var logElem = document.createElement("pre");',
                  '  logElem[textContentProp]=text;',
                  '  document.body.appendChild(logElem);',
                  '  logElem.scrollIntoView();',
                  '  if (lastLogElem) {',
                  '    lastLogElem.style.opacity = 0.5;',
                  '  }',
                  '  lastLogElem = logElem;',
                  '}',
                  '<' + '/' + 's' + 'cript>'].join('\n'));
                blankWindow.document.close();
      
                var buildScope = {
                  embedFile: (file: string) => this._drive.read(file)
                };
      
                try {
                  build.processTemplate(
                    htmlTemplate,
                    [buildScope],
                    txt => {
                      this._terminal.log([txt]);
                      (<any>blankWindow).log(txt);
                    },
                    (error, result) => {
                      if (error) {
                        this._terminal.log([error]);
                        ani();
                        return;
                      }
      
                      try {
                        var blob = new Blob([result], { type: 'text/html' });
                        var url = URL.createObjectURL(blob);
                        blankWindow.location.replace(url);
                      }
                      catch (blobError) {
                        blankWindow.document.open();
                        blankWindow.document.write(result);
                        blankWindow.document.close();
                      }
      
                      ani();
      
                    });
                }
                catch (errorProcessTemplate) {
                  ani();
                  this._terminal.log([errorProcessTemplate]);
                }
              }, 1);
            }
            else {
              var ani = this._twoPanels.temporarilyHidePanels();
              this._terminal.log(['@type ' + cursorPath]);
              this._terminal.log([this._drive.read(cursorPath)]);
              ani();
            }
          }
      
        }
      
        export module CommanderShell {
      
          export interface Metrics {
            hostWidth: number;
            hostHeight: number;
            emWidth: number;
            emHeight: number;
          }
      
        }
      
      }
    • keys.ts
      module shell.keys {
      
      }
    • layout.ts
      module shell.layout {
      
        // initialize with roughly-arbitrary values
        export var windowWidth = 600;
        export var windowHeight = 400;
        export var emWidth = 18;
        export var emHeight = 28;
      
        export function update() {
          // TODO: queu on timer
        }
      
        export module update {
      
          export function now() {
            // TODO: stop timer, update layout
          }
      
          export function next(callback: Function) {
            // TODO: add to run-once list of callbacks
          }
      
          export function on(callback: Function) {
            // TODO: add to every-time list of callbacks
          }
      
          export function off(callback: Function) {
            // TODO: remove from every-time list of callbacks
          }
        }
      }
    • start.ts
      declare var require;
      
      module shell {
      
        export var buildTime: number;
        export var buildMessage: string;
      
        export function start(complete: () => string) {
          var drive = require('nodrive');
          var parentWin = require('nowindow');
          parentWin.document.body.background = 'black';
          if (parentWin.document.parentElement)
          	parentWin.document.parentElement.body.background = 'black';
      
          document.body.style.overflow = 'hidden';
          document.body.parentElement.style.overflow = 'hidden';
      
          var commander = new CommanderShell(document.body, drive, complete);
      
      }
      
      }
  • svge-embed
    • build
      • buildEmbedFiles.ts
        module svge.build {
        
          export function buildEmbedFiles(drive: persistence.Drive) {
        
            var svgeBase = '/svge-embed/editor/';
        
            var htmlinput = drive.read(svgeBase + 'svg-editor.html');
        
            var pars = new DOMParser();
            var docu = pars.parseFromString(htmlinput, 'text/html');
        
            // embed linked CSS
            var linkElems = docu.getElementsByTagName('link');
            for (var i = 0; i < linkElems.length; i++) {
              processLinkElem(linkElems[i]);
            }
        
            // embed src scripts
            var scriptElems = docu.getElementsByTagName('script');
            for (var i = 0; i < scriptElems.length; i++) {
              processScriptElem(scriptElems[i]);
            }
        
            var resultHTML = docu.body.parentElement.outerHTML;
        
            var decoratedHTML = resultHTML.
              replace(/\-\-(\**)\>/g, '--*$1>').
              replace(/\<(\**)\!/g, '<*$1!');
        
            var wrappedHTML = '<' + '!' + '-- /shell/index.html\n' + decoratedHTML + '\n --' + '>';
        
            return wrappedHTML;
        
            function processLinkElem(lin: HTMLLinkElement) {
              var href = lin.href || lin.getAttribute('href');
              if (!lin.rel || lin.rel.toLowerCase() !== 'stylesheet' || !href) {
                console.log('skip lin ', lin);
                return;
              }
        
              var path = svgeBase + href;
              var txt = drive.read(path);
              var sty = docu.createElement('style');
              if ('text' in sty) (<any>sty).text = txt;
              else if ('textContent' in sty) sty.textContent = txt;
              else sty.innerHTML = txt;
              lin.parentElement.insertBefore(sty, lin);
              lin.parentElement.removeChild(lin);
        
              console.log('override lin ', lin, ' with ', sty);
            }
        
            function processScriptElem(srcScr: HTMLScriptElement) {
              var src = srcScr.src || srcScr.getAttribute('src');
              if (!src) {
                console.log('skip srcScr ', srcScr);
                return;
              }
        
              var path = svgeBase + src;
              var txt = drive.read(path);
              txt += '//'
              var scri = docu.createElement('script');
              if ('text' in scri) (<any>scri).text = txt;
              else if ('textContent' in scri) scri.textContent = txt;
              else scri.innerHTML = txt;
              srcScr.parentElement.insertBefore(scri, srcScr);
              srcScr.parentElement.removeChild(srcScr);
              console.log('override srcScr ', srcScr, ' with ', scri);
            }
          }
        }
    • editor
      • canvg
        • canvg.js
          /*
           * canvg.js - Javascript SVG parser and renderer on Canvas
           * MIT Licensed 
           * Gabe Lerner (gabelerner@gmail.com)
           * http://code.google.com/p/canvg/
           *
           * Requires: rgbcolor.js - http://www.phpied.com/rgb-color-parser-in-javascript/
           */
          (function(){
          	// canvg(target, s)
          	// empty parameters: replace all 'svg' elements on page with 'canvas' elements
          	// target: canvas element or the id of a canvas element
          	// s: svg string, url to svg file, or xml document
          	// opts: optional hash of options
          	//		 ignoreMouse: true => ignore mouse events
          	//		 ignoreAnimation: true => ignore animations
          	//		 ignoreDimensions: true => does not try to resize canvas
          	//		 ignoreClear: true => does not clear canvas
          	//		 offsetX: int => draws at a x offset
          	//		 offsetY: int => draws at a y offset
          	//		 scaleWidth: int => scales horizontally to width
          	//		 scaleHeight: int => scales vertically to height
          	//		 renderCallback: function => will call the function after the first render is completed
          	//		 forceRedraw: function => will call the function on every frame, if it returns true, will redraw
          	this.canvg = function (target, s, opts) {
          		// no parameters
          		if (target == null && s == null && opts == null) {
          			var svgTags = document.querySelectorAll('svg');
          			for (var i=0; i<svgTags.length; i++) {
          				var svgTag = svgTags[i];
          				var c = document.createElement('canvas');
          				c.width = svgTag.clientWidth;
          				c.height = svgTag.clientHeight;
          				svgTag.parentNode.insertBefore(c, svgTag);
          				svgTag.parentNode.removeChild(svgTag);
          				var div = document.createElement('div');
          				div.appendChild(svgTag);
          				canvg(c, div.innerHTML);
          			}
          			return;
          		}
          	
          		if (typeof target == 'string') {
          			target = document.getElementById(target);
          		}
          		
          		// store class on canvas
          		if (target.svg != null) target.svg.stop();
          		var svg = build(opts || {});
          		// on i.e. 8 for flash canvas, we can't assign the property so check for it
          		if (!(target.childNodes.length == 1 && target.childNodes[0].nodeName == 'OBJECT')) target.svg = svg;
          		
          		var ctx = target.getContext('2d');
          		if (typeof(s.documentElement) != 'undefined') {
          			// load from xml doc
          			svg.loadXmlDoc(ctx, s);
          		}
          		else if (s.substr(0,1) == '<') {
          			// load from xml string
          			svg.loadXml(ctx, s);
          		}
          		else {
          			// load from url
          			svg.load(ctx, s);
          		}
          	}
          
          	function build(opts) {
          		var svg = { opts: opts };
          		
          		svg.FRAMERATE = 30;
          		svg.MAX_VIRTUAL_PIXELS = 30000;
          		
          		svg.log = function(msg) {};
          		if (svg.opts['log'] == true && typeof(console) != 'undefined') {
          			svg.log = function(msg) { console.log(msg); };
          		};
          		
          		// globals
          		svg.init = function(ctx) {
          			var uniqueId = 0;
          			svg.UniqueId = function () { uniqueId++; return 'canvg' + uniqueId;	};
          			svg.Definitions = {};
          			svg.Styles = {};
          			svg.Animations = [];
          			svg.Images = [];
          			svg.ctx = ctx;
          			svg.ViewPort = new (function () {
          				this.viewPorts = [];
          				this.Clear = function() { this.viewPorts = []; }
          				this.SetCurrent = function(width, height) { this.viewPorts.push({ width: width, height: height }); }
          				this.RemoveCurrent = function() { this.viewPorts.pop(); }
          				this.Current = function() { return this.viewPorts[this.viewPorts.length - 1]; }
          				this.width = function() { return this.Current().width; }
          				this.height = function() { return this.Current().height; }
          				this.ComputeSize = function(d) {
          					if (d != null && typeof(d) == 'number') return d;
          					if (d == 'x') return this.width();
          					if (d == 'y') return this.height();
          					return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2);			
          				}
          			});
          		}
          		svg.init();
          		
          		// images loaded
          		svg.ImagesLoaded = function() { 
          			for (var i=0; i<svg.Images.length; i++) {
          				if (!svg.Images[i].loaded) return false;
          			}
          			return true;
          		}
          
          		// trim
          		svg.trim = function(s) { return s.replace(/^\s+|\s+$/g, ''); }
          		
          		// compress spaces
          		svg.compressSpaces = function(s) { return s.replace(/[\s\r\t\n]+/gm,' '); }
          		
          		// ajax
          		svg.ajax = function(url) {
          			var AJAX;
          			if(window.XMLHttpRequest){AJAX=new XMLHttpRequest();}
          			else{AJAX=new ActiveXObject('Microsoft.XMLHTTP');}
          			if(AJAX){
          			   AJAX.open('GET',url,false);
          			   AJAX.send(null);
          			   return AJAX.responseText;
          			}
          			return null;
          		} 
          		
          		// parse xml
          		svg.parseXml = function(xml) {
          			if (window.DOMParser)
          			{
          				var parser = new DOMParser();
          				return parser.parseFromString(xml, 'text/xml');
          			}
          			else 
          			{
          				xml = xml.replace(/<!DOCTYPE svg[^>]*>/, '');
          				var xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
          				xmlDoc.async = 'false';
          				xmlDoc.loadXML(xml); 
          				return xmlDoc;
          			}		
          		}
          		
          		svg.Property = function(name, value) {
          			this.name = name;
          			this.value = value;
          		}	
          			svg.Property.prototype.getValue = function() {
          				return this.value;
          			}
          		
          			svg.Property.prototype.hasValue = function() {
          				return (this.value != null && this.value !== '');
          			}
          							
          			// return the numerical value of the property
          			svg.Property.prototype.numValue = function() {
          				if (!this.hasValue()) return 0;
          				
          				var n = parseFloat(this.value);
          				if ((this.value + '').match(/%$/)) {
          					n = n / 100.0;
          				}
          				return n;
          			}
          			
          			svg.Property.prototype.valueOrDefault = function(def) {
          				if (this.hasValue()) return this.value;
          				return def;
          			}
          			
          			svg.Property.prototype.numValueOrDefault = function(def) {
          				if (this.hasValue()) return this.numValue();
          				return def;
          			}
          			
          			// color extensions
          				// augment the current color value with the opacity
          				svg.Property.prototype.addOpacity = function(opacityProp) {
          					var newValue = this.value;
          					if (opacityProp.value != null && opacityProp.value != '' && typeof(this.value)=='string') { // can only add opacity to colors, not patterns
          						var color = new RGBColor(this.value);
          						if (color.ok) {
          							newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')';
          						}
          					}
          					return new svg.Property(this.name, newValue);
          				}
          			
          			// definition extensions
          				// get the definition from the definitions table
          				svg.Property.prototype.getDefinition = function() {
          					var name = this.value.match(/#([^\)'"]+)/);
          					if (name) { name = name[1]; }
          					if (!name) { name = this.value; }
          					return svg.Definitions[name];
          				}
          				
          				svg.Property.prototype.isUrlDefinition = function() {
          					return this.value.indexOf('url(') == 0
          				}
          				
          				svg.Property.prototype.getFillStyleDefinition = function(e, opacityProp) {
          					var def = this.getDefinition();
          					
          					// gradient
          					if (def != null && def.createGradient) {
          						return def.createGradient(svg.ctx, e, opacityProp);
          					}
          					
          					// pattern
          					if (def != null && def.createPattern) {
          						if (def.getHrefAttribute().hasValue()) {
          							var pt = def.attribute('patternTransform');
          							def = def.getHrefAttribute().getDefinition();
          							if (pt.hasValue()) { def.attribute('patternTransform', true).value = pt.value; }
          						}
          						return def.createPattern(svg.ctx, e);
          					}
          					
          					return null;
          				}
          			
          			// length extensions
          				svg.Property.prototype.getDPI = function(viewPort) {
          					return 96.0; // TODO: compute?
          				}
          				
          				svg.Property.prototype.getEM = function(viewPort) {
          					var em = 12;
          					
          					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
          					if (fontSize.hasValue()) em = fontSize.toPixels(viewPort);
          					
          					return em;
          				}
          				
          				svg.Property.prototype.getUnits = function() {
          					var s = this.value+'';
          					return s.replace(/[0-9\.\-]/g,'');
          				}
          			
          				// get the length as pixels
          				svg.Property.prototype.toPixels = function(viewPort, processPercent) {
          					if (!this.hasValue()) return 0;
          					var s = this.value+'';
          					if (s.match(/em$/)) return this.numValue() * this.getEM(viewPort);
          					if (s.match(/ex$/)) return this.numValue() * this.getEM(viewPort) / 2.0;
          					if (s.match(/px$/)) return this.numValue();
          					if (s.match(/pt$/)) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0);
          					if (s.match(/pc$/)) return this.numValue() * 15;
          					if (s.match(/cm$/)) return this.numValue() * this.getDPI(viewPort) / 2.54;
          					if (s.match(/mm$/)) return this.numValue() * this.getDPI(viewPort) / 25.4;
          					if (s.match(/in$/)) return this.numValue() * this.getDPI(viewPort);
          					if (s.match(/%$/)) return this.numValue() * svg.ViewPort.ComputeSize(viewPort);
          					var n = this.numValue();
          					if (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort);
          					return n;
          				}
          
          			// time extensions
          				// get the time as milliseconds
          				svg.Property.prototype.toMilliseconds = function() {
          					if (!this.hasValue()) return 0;
          					var s = this.value+'';
          					if (s.match(/s$/)) return this.numValue() * 1000;
          					if (s.match(/ms$/)) return this.numValue();
          					return this.numValue();
          				}
          			
          			// angle extensions
          				// get the angle as radians
          				svg.Property.prototype.toRadians = function() {
          					if (!this.hasValue()) return 0;
          					var s = this.value+'';
          					if (s.match(/deg$/)) return this.numValue() * (Math.PI / 180.0);
          					if (s.match(/grad$/)) return this.numValue() * (Math.PI / 200.0);
          					if (s.match(/rad$/)) return this.numValue();
          					return this.numValue() * (Math.PI / 180.0);
          				}
          		
          			// text extensions
          				// get the text baseline
          				var textBaselineMapping = {
          					'baseline': 'alphabetic',
          					'before-edge': 'top',
          					'text-before-edge': 'top',
          					'middle': 'middle',
          					'central': 'middle',
          					'after-edge': 'bottom',
          					'text-after-edge': 'bottom',
          					'ideographic': 'ideographic',
          					'alphabetic': 'alphabetic',
          					'hanging': 'hanging',
          					'mathematical': 'alphabetic'
          				};
          				svg.Property.prototype.toTextBaseline = function () {
          					if (!this.hasValue()) return null;
          					return textBaselineMapping[this.value];
          				}
          				
          		// fonts
          		svg.Font = new (function() {
          			this.Styles = 'normal|italic|oblique|inherit';
          			this.Variants = 'normal|small-caps|inherit';
          			this.Weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';
          			
          			this.CreateFont = function(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {
          				var f = inherit != null ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font);
          				return { 
          					fontFamily: fontFamily || f.fontFamily, 
          					fontSize: fontSize || f.fontSize, 
          					fontStyle: fontStyle || f.fontStyle, 
          					fontWeight: fontWeight || f.fontWeight, 
          					fontVariant: fontVariant || f.fontVariant,
          					toString: function () { return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' ') } 
          				} 
          			}
          			
          			var that = this;
          			this.Parse = function(s) {
          				var f = {};
          				var d = svg.trim(svg.compressSpaces(s || '')).split(' ');
          				var set = { fontSize: false, fontStyle: false, fontWeight: false, fontVariant: false }
          				var ff = '';
          				for (var i=0; i<d.length; i++) {
          					if (!set.fontStyle && that.Styles.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontStyle = d[i]; set.fontStyle = true; }
          					else if (!set.fontVariant && that.Variants.indexOf(d[i]) != -1) { if (d[i] != 'inherit') f.fontVariant = d[i]; set.fontStyle = set.fontVariant = true;	}
          					else if (!set.fontWeight && that.Weights.indexOf(d[i]) != -1) {	if (d[i] != 'inherit') f.fontWeight = d[i]; set.fontStyle = set.fontVariant = set.fontWeight = true; }
          					else if (!set.fontSize) { if (d[i] != 'inherit') f.fontSize = d[i].split('/')[0]; set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; }
          					else { if (d[i] != 'inherit') ff += d[i]; }
          				} if (ff != '') f.fontFamily = ff;
          				return f;
          			}
          		});
          		
          		// points and paths
          		svg.ToNumberArray = function(s) {
          			var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' ');
          			for (var i=0; i<a.length; i++) {
          				a[i] = parseFloat(a[i]);
          			}
          			return a;
          		}		
          		svg.Point = function(x, y) {
          			this.x = x;
          			this.y = y;
          		}	
          			svg.Point.prototype.angleTo = function(p) {
          				return Math.atan2(p.y - this.y, p.x - this.x);
          			}
          			
          			svg.Point.prototype.applyTransform = function(v) {
          				var xp = this.x * v[0] + this.y * v[2] + v[4];
          				var yp = this.x * v[1] + this.y * v[3] + v[5];
          				this.x = xp;
          				this.y = yp;
          			}
          
          		svg.CreatePoint = function(s) {
          			var a = svg.ToNumberArray(s);
          			return new svg.Point(a[0], a[1]);
          		}
          		svg.CreatePath = function(s) {
          			var a = svg.ToNumberArray(s);
          			var path = [];
          			for (var i=0; i<a.length; i+=2) {
          				path.push(new svg.Point(a[i], a[i+1]));
          			}
          			return path;
          		}
          		
          		// bounding box
          		svg.BoundingBox = function(x1, y1, x2, y2) { // pass in initial points if you want
          			this.x1 = Number.NaN;
          			this.y1 = Number.NaN;
          			this.x2 = Number.NaN;
          			this.y2 = Number.NaN;
          			
          			this.x = function() { return this.x1; }
          			this.y = function() { return this.y1; }
          			this.width = function() { return this.x2 - this.x1; }
          			this.height = function() { return this.y2 - this.y1; }
          			
          			this.addPoint = function(x, y) {	
          				if (x != null) {
          					if (isNaN(this.x1) || isNaN(this.x2)) {
          						this.x1 = x;
          						this.x2 = x;
          					}
          					if (x < this.x1) this.x1 = x;
          					if (x > this.x2) this.x2 = x;
          				}
          			
          				if (y != null) {
          					if (isNaN(this.y1) || isNaN(this.y2)) {
          						this.y1 = y;
          						this.y2 = y;
          					}
          					if (y < this.y1) this.y1 = y;
          					if (y > this.y2) this.y2 = y;
          				}
          			}			
          			this.addX = function(x) { this.addPoint(x, null); }
          			this.addY = function(y) { this.addPoint(null, y); }
          			
          			this.addBoundingBox = function(bb) {
          				this.addPoint(bb.x1, bb.y1);
          				this.addPoint(bb.x2, bb.y2);
          			}
          			
          			this.addQuadraticCurve = function(p0x, p0y, p1x, p1y, p2x, p2y) {
          				var cp1x = p0x + 2/3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)
          				var cp1y = p0y + 2/3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)
          				var cp2x = cp1x + 1/3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)
          				var cp2y = cp1y + 1/3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)
          				this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y,	cp2y, p2x, p2y);
          			}
          			
          			this.addBezierCurve = function(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {
          				// from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
          				var p0 = [p0x, p0y], p1 = [p1x, p1y], p2 = [p2x, p2y], p3 = [p3x, p3y];
          				this.addPoint(p0[0], p0[1]);
          				this.addPoint(p3[0], p3[1]);
          				
          				for (i=0; i<=1; i++) {
          					var f = function(t) { 
          						return Math.pow(1-t, 3) * p0[i]
          						+ 3 * Math.pow(1-t, 2) * t * p1[i]
          						+ 3 * (1-t) * Math.pow(t, 2) * p2[i]
          						+ Math.pow(t, 3) * p3[i];
          					}
          					
          					var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];
          					var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];
          					var c = 3 * p1[i] - 3 * p0[i];
          					
          					if (a == 0) {
          						if (b == 0) continue;
          						var t = -c / b;
          						if (0 < t && t < 1) {
          							if (i == 0) this.addX(f(t));
          							if (i == 1) this.addY(f(t));
          						}
          						continue;
          					}
          					
          					var b2ac = Math.pow(b, 2) - 4 * c * a;
          					if (b2ac < 0) continue;
          					var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);
          					if (0 < t1 && t1 < 1) {
          						if (i == 0) this.addX(f(t1));
          						if (i == 1) this.addY(f(t1));
          					}
          					var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);
          					if (0 < t2 && t2 < 1) {
          						if (i == 0) this.addX(f(t2));
          						if (i == 1) this.addY(f(t2));
          					}
          				}
          			}
          			
          			this.isPointInBox = function(x, y) {
          				return (this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2);
          			}
          			
          			this.addPoint(x1, y1);
          			this.addPoint(x2, y2);
          		}
          		
          		// transforms
          		svg.Transform = function(v) {	
          			var that = this;
          			this.Type = {}
          		
          			// translate
          			this.Type.translate = function(s) {
          				this.p = svg.CreatePoint(s);			
          				this.apply = function(ctx) {
          					ctx.translate(this.p.x || 0.0, this.p.y || 0.0);
          				}
          				this.unapply = function(ctx) {
          					ctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0);
          				}
          				this.applyToPoint = function(p) {
          					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
          				}
          			}
          			
          			// rotate
          			this.Type.rotate = function(s) {
          				var a = svg.ToNumberArray(s);
          				this.angle = new svg.Property('angle', a[0]);
          				this.cx = a[1] || 0;
          				this.cy = a[2] || 0;
          				this.apply = function(ctx) {
          					ctx.translate(this.cx, this.cy);
          					ctx.rotate(this.angle.toRadians());
          					ctx.translate(-this.cx, -this.cy);
          				}
          				this.unapply = function(ctx) {
          					ctx.translate(this.cx, this.cy);
          					ctx.rotate(-1.0 * this.angle.toRadians());
          					ctx.translate(-this.cx, -this.cy);
          				}
          				this.applyToPoint = function(p) {
          					var a = this.angle.toRadians();
          					p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]);
          					p.applyTransform([Math.cos(a), Math.sin(a), -Math.sin(a), Math.cos(a), 0, 0]);
          					p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]);
          				}			
          			}
          			
          			this.Type.scale = function(s) {
          				this.p = svg.CreatePoint(s);
          				this.apply = function(ctx) {
          					ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0);
          				}
          				this.unapply = function(ctx) {
          					ctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0);
          				}
          				this.applyToPoint = function(p) {
          					p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]);
          				}				
          			}
          			
          			this.Type.matrix = function(s) {
          				this.m = svg.ToNumberArray(s);
          				this.apply = function(ctx) {
          					ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]);
          				}
          				this.applyToPoint = function(p) {
          					p.applyTransform(this.m);
          				}					
          			}
          			
          			this.Type.SkewBase = function(s) {
          				this.base = that.Type.matrix;
          				this.base(s);
          				this.angle = new svg.Property('angle', s);
          			}
          			this.Type.SkewBase.prototype = new this.Type.matrix;
          			
          			this.Type.skewX = function(s) {
          				this.base = that.Type.SkewBase;
          				this.base(s);
          				this.m = [1, 0, Math.tan(this.angle.toRadians()), 1, 0, 0];
          			}
          			this.Type.skewX.prototype = new this.Type.SkewBase;
          			
          			this.Type.skewY = function(s) {
          				this.base = that.Type.SkewBase;
          				this.base(s);
          				this.m = [1, Math.tan(this.angle.toRadians()), 0, 1, 0, 0];
          			}
          			this.Type.skewY.prototype = new this.Type.SkewBase;
          		
          			this.transforms = [];
          			
          			this.apply = function(ctx) {
          				for (var i=0; i<this.transforms.length; i++) {
          					this.transforms[i].apply(ctx);
          				}
          			}
          			
          			this.unapply = function(ctx) {
          				for (var i=this.transforms.length-1; i>=0; i--) {
          					this.transforms[i].unapply(ctx);
          				}
          			}
          			
          			this.applyToPoint = function(p) {
          				for (var i=0; i<this.transforms.length; i++) {
          					this.transforms[i].applyToPoint(p);
          				}
          			}
          			
          			var data = svg.trim(svg.compressSpaces(v)).replace(/\)([a-zA-Z])/g, ') $1').replace(/\)(\s?,\s?)/g,') ').split(/\s(?=[a-z])/);
          			for (var i=0; i<data.length; i++) {
          				var type = svg.trim(data[i].split('(')[0]);
          				var s = data[i].split('(')[1].replace(')','');
          				var transform = new this.Type[type](s);
          				transform.type = type;
          				this.transforms.push(transform);
          			}
          		}
          		
          		// aspect ratio
          		svg.AspectRatio = function(ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) {
          			// aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute
          			aspectRatio = svg.compressSpaces(aspectRatio);
          			aspectRatio = aspectRatio.replace(/^defer\s/,''); // ignore defer
          			var align = aspectRatio.split(' ')[0] || 'xMidYMid';
          			var meetOrSlice = aspectRatio.split(' ')[1] || 'meet';					
          	
          			// calculate scale
          			var scaleX = width / desiredWidth;
          			var scaleY = height / desiredHeight;
          			var scaleMin = Math.min(scaleX, scaleY);
          			var scaleMax = Math.max(scaleX, scaleY);
          			if (meetOrSlice == 'meet') { desiredWidth *= scaleMin; desiredHeight *= scaleMin; }
          			if (meetOrSlice == 'slice') { desiredWidth *= scaleMax; desiredHeight *= scaleMax; }	
          			
          			refX = new svg.Property('refX', refX);
          			refY = new svg.Property('refY', refY);
          			if (refX.hasValue() && refY.hasValue()) {				
          				ctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y'));
          			} 
          			else {					
          				// align
          				if (align.match(/^xMid/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); 
          				if (align.match(/YMid$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height / 2.0 - desiredHeight / 2.0); 
          				if (align.match(/^xMax/) && ((meetOrSlice == 'meet' && scaleMin == scaleY) || (meetOrSlice == 'slice' && scaleMax == scaleY))) ctx.translate(width - desiredWidth, 0); 
          				if (align.match(/YMax$/) && ((meetOrSlice == 'meet' && scaleMin == scaleX) || (meetOrSlice == 'slice' && scaleMax == scaleX))) ctx.translate(0, height - desiredHeight); 
          			}
          			
          			// scale
          			if (align == 'none') ctx.scale(scaleX, scaleY);
          			else if (meetOrSlice == 'meet') ctx.scale(scaleMin, scaleMin); 
          			else if (meetOrSlice == 'slice') ctx.scale(scaleMax, scaleMax); 	
          			
          			// translate
          			ctx.translate(minX == null ? 0 : -minX, minY == null ? 0 : -minY);			
          		}
          		
          		// elements
          		svg.Element = {}
          		
          		svg.EmptyProperty = new svg.Property('EMPTY', '');
          		
          		svg.Element.ElementBase = function(node) {	
          			this.attributes = {};
          			this.styles = {};
          			this.children = [];
          			
          			// get or create attribute
          			this.attribute = function(name, createIfNotExists) {
          				var a = this.attributes[name];
          				if (a != null) return a;
          							
          				if (createIfNotExists == true) { a = new svg.Property(name, ''); this.attributes[name] = a; }
          				return a || svg.EmptyProperty;
          			}
          			
          			this.getHrefAttribute = function() {
          				for (var a in this.attributes) { 
          					if (a.match(/:href$/)) { 
          						return this.attributes[a]; 
          					} 
          				}
          				return svg.EmptyProperty;
          			}
          			
          			// get or create style, crawls up node tree
          			this.style = function(name, createIfNotExists, skipAncestors) {
          				var s = this.styles[name];
          				if (s != null) return s;
          				
          				var a = this.attribute(name);
          				if (a != null && a.hasValue()) {
          					this.styles[name] = a; // move up to me to cache
          					return a;
          				}
          				
          				if (skipAncestors != true) {
          					var p = this.parent;
          					if (p != null) {
          						var ps = p.style(name);
          						if (ps != null && ps.hasValue()) {
          							return ps;
          						}
          					}
          				}
          					
          				if (createIfNotExists == true) { s = new svg.Property(name, ''); this.styles[name] = s; }
          				return s || svg.EmptyProperty;
          			}
          			
          			// base render
          			this.render = function(ctx) {
          				// don't render display=none
          				if (this.style('display').value == 'none') return;
          				
          				// don't render visibility=hidden
          				if (this.style('visibility').value == 'hidden') return;
          			
          				ctx.save();
          				if (this.attribute('mask').hasValue()) { // mask
          					var mask = this.attribute('mask').getDefinition();
          					if (mask != null) mask.apply(ctx, this);
          				}
          				else if (this.style('filter').hasValue()) { // filter
          					var filter = this.style('filter').getDefinition();
          					if (filter != null) filter.apply(ctx, this);
          				}
          				else {	
          					this.setContext(ctx);
          					this.renderChildren(ctx);	
          					this.clearContext(ctx);							
          				}
          				ctx.restore();
          			}
          			
          			// base set context
          			this.setContext = function(ctx) {
          				// OVERRIDE ME!
          			}
          			
          			// base clear context
          			this.clearContext = function(ctx) {
          				// OVERRIDE ME!
          			}			
          			
          			// base render children
          			this.renderChildren = function(ctx) {
          				for (var i=0; i<this.children.length; i++) {
          					this.children[i].render(ctx);
          				}
          			}
          			
          			this.addChild = function(childNode, create) {
          				var child = childNode;
          				if (create) child = svg.CreateElement(childNode);
          				child.parent = this;
          				if (child.type != 'title') { this.children.push(child);	}
          			}
          				
          			if (node != null && node.nodeType == 1) { //ELEMENT_NODE
          				// add children
          				for (var i=0; i<node.childNodes.length; i++) {
          					var childNode = node.childNodes[i];
          					if (childNode.nodeType == 1) this.addChild(childNode, true); //ELEMENT_NODE
          					if (this.captureTextNodes && (childNode.nodeType == 3 || childNode.nodeType == 4)) {
          						var text = childNode.nodeValue || childNode.text || '';
          						if (svg.trim(svg.compressSpaces(text)) != '') {
          							this.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE
          						}
          					}
          				}
          				
          				// add attributes
          				for (var i=0; i<node.attributes.length; i++) {
          					var attribute = node.attributes[i];
          					this.attributes[attribute.nodeName] = new svg.Property(attribute.nodeName, attribute.nodeValue);
          				}
          										
          				// add tag styles
          				var styles = svg.Styles[node.nodeName];
          				if (styles != null) {
          					for (var name in styles) {
          						this.styles[name] = styles[name];
          					}
          				}					
          				
          				// add class styles
          				if (this.attribute('class').hasValue()) {
          					var classes = svg.compressSpaces(this.attribute('class').value).split(' ');
          					for (var j=0; j<classes.length; j++) {
          						styles = svg.Styles['.'+classes[j]];
          						if (styles != null) {
          							for (var name in styles) {
          								this.styles[name] = styles[name];
          							}
          						}
          						styles = svg.Styles[node.nodeName+'.'+classes[j]];
          						if (styles != null) {
          							for (var name in styles) {
          								this.styles[name] = styles[name];
          							}
          						}
          					}
          				}
          				
          				// add id styles
          				if (this.attribute('id').hasValue()) {
          					var styles = svg.Styles['#' + this.attribute('id').value];
          					if (styles != null) {
          						for (var name in styles) {
          							this.styles[name] = styles[name];
          						}
          					}
          				}
          				
          				// add inline styles
          				if (this.attribute('style').hasValue()) {
          					var styles = this.attribute('style').value.split(';');
          					for (var i=0; i<styles.length; i++) {
          						if (svg.trim(styles[i]) != '') {
          							var style = styles[i].split(':');
          							var name = svg.trim(style[0]);
          							var value = svg.trim(style[1]);
          							this.styles[name] = new svg.Property(name, value);
          						}
          					}
          				}	
          
          				// add id
          				if (this.attribute('id').hasValue()) {
          					if (svg.Definitions[this.attribute('id').value] == null) {
          						svg.Definitions[this.attribute('id').value] = this;
          					}
          				}
          			}
          		}
          		
          		svg.Element.RenderedElementBase = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.setContext = function(ctx) {
          				// fill
          				if (this.style('fill').isUrlDefinition()) {
          					var fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity'));
          					if (fs != null) ctx.fillStyle = fs;
          				}
          				else if (this.style('fill').hasValue()) {
          					var fillStyle = this.style('fill');
          					if (fillStyle.value == 'currentColor') fillStyle.value = this.style('color').value;
          					ctx.fillStyle = (fillStyle.value == 'none' ? 'rgba(0,0,0,0)' : fillStyle.value);
          				}
          				if (this.style('fill-opacity').hasValue()) {
          					var fillStyle = new svg.Property('fill', ctx.fillStyle);
          					fillStyle = fillStyle.addOpacity(this.style('fill-opacity'));
          					ctx.fillStyle = fillStyle.value;
          				}
          									
          				// stroke
          				if (this.style('stroke').isUrlDefinition()) {
          					var fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity'));
          					if (fs != null) ctx.strokeStyle = fs;
          				}
          				else if (this.style('stroke').hasValue()) {
          					var strokeStyle = this.style('stroke');
          					if (strokeStyle.value == 'currentColor') strokeStyle.value = this.style('color').value;
          					ctx.strokeStyle = (strokeStyle.value == 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value);
          				}
          				if (this.style('stroke-opacity').hasValue()) {
          					var strokeStyle = new svg.Property('stroke', ctx.strokeStyle);
          					strokeStyle = strokeStyle.addOpacity(this.style('stroke-opacity'));
          					ctx.strokeStyle = strokeStyle.value;
          				}
          				if (this.style('stroke-width').hasValue()) {
          					var newLineWidth = this.style('stroke-width').toPixels();
          					ctx.lineWidth = newLineWidth == 0 ? 0.001 : newLineWidth; // browsers don't respect 0
          			    }
          				if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value;
          				if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value;
          				if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value;
          				if (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value != 'none') {
          					var gaps = svg.ToNumberArray(this.style('stroke-dasharray').value);
          					if (typeof(ctx.setLineDash) != 'undefined') { ctx.setLineDash(gaps); }
          					else if (typeof(ctx.webkitLineDash) != 'undefined') { ctx.webkitLineDash = gaps; }
          					else if (typeof(ctx.mozDash) != 'undefined' && !(gaps.length==1 && gaps[0]==0)) { ctx.mozDash = gaps; }
          					
          					var offset = this.style('stroke-dashoffset').numValueOrDefault(1);
          					if (typeof(ctx.lineDashOffset) != 'undefined') { ctx.lineDashOffset = offset; }
          					else if (typeof(ctx.webkitLineDashOffset) != 'undefined') { ctx.webkitLineDashOffset = offset; }
          					else if (typeof(ctx.mozDashOffset) != 'undefined') { ctx.mozDashOffset = offset; }
          				}
          
          				// font
          				if (typeof(ctx.font) != 'undefined') {
          					ctx.font = svg.Font.CreateFont( 
          						this.style('font-style').value, 
          						this.style('font-variant').value, 
          						this.style('font-weight').value, 
          						this.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '', 
          						this.style('font-family').value).toString();
          				}
          				
          				// transform
          				if (this.attribute('transform').hasValue()) { 
          					var transform = new svg.Transform(this.attribute('transform').value);
          					transform.apply(ctx);
          				}
          				
          				// clip
          				if (this.style('clip-path', false, true).hasValue()) {
          					var clip = this.style('clip-path', false, true).getDefinition();
          					if (clip != null) clip.apply(ctx);
          				}
          				
          				// opacity
          				if (this.style('opacity').hasValue()) {
          					ctx.globalAlpha = this.style('opacity').numValue();
          				}
          			}		
          		}
          		svg.Element.RenderedElementBase.prototype = new svg.Element.ElementBase;
          		
          		svg.Element.PathElementBase = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			this.path = function(ctx) {
          				if (ctx != null) ctx.beginPath();
          				return new svg.BoundingBox();
          			}
          			
          			this.renderChildren = function(ctx) {
          				this.path(ctx);
          				svg.Mouse.checkPath(this, ctx);
          				if (ctx.fillStyle != '') {
          					if (this.style('fill-rule').valueOrDefault('inherit') != 'inherit') { ctx.fill(this.style('fill-rule').value); }
          					else { ctx.fill(); }
          				}
          				if (ctx.strokeStyle != '') ctx.stroke();
          				
          				var markers = this.getMarkers();
          				if (markers != null) {
          					if (this.style('marker-start').isUrlDefinition()) {
          						var marker = this.style('marker-start').getDefinition();
          						marker.render(ctx, markers[0][0], markers[0][1]);
          					}
          					if (this.style('marker-mid').isUrlDefinition()) {
          						var marker = this.style('marker-mid').getDefinition();
          						for (var i=1;i<markers.length-1;i++) {
          							marker.render(ctx, markers[i][0], markers[i][1]);
          						}
          					}
          					if (this.style('marker-end').isUrlDefinition()) {
          						var marker = this.style('marker-end').getDefinition();
          						marker.render(ctx, markers[markers.length-1][0], markers[markers.length-1][1]);
          					}
          				}					
          			}
          			
          			this.getBoundingBox = function() {
          				return this.path();
          			}
          			
          			this.getMarkers = function() {
          				return null;
          			}
          		}
          		svg.Element.PathElementBase.prototype = new svg.Element.RenderedElementBase;
          		
          		// svg element
          		svg.Element.svg = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			this.baseClearContext = this.clearContext;
          			this.clearContext = function(ctx) {
          				this.baseClearContext(ctx);
          				svg.ViewPort.RemoveCurrent();
          			}
          			
          			this.baseSetContext = this.setContext;
          			this.setContext = function(ctx) {
          				// initial values and defaults
          				ctx.strokeStyle = 'rgba(0,0,0,0)';
          				ctx.lineCap = 'butt';
          				ctx.lineJoin = 'miter';
          				ctx.miterLimit = 4;	
          				if (typeof(ctx.font) != 'undefined' && typeof(window.getComputedStyle) != 'undefined') {
          					ctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font');
          				}
          			
          				this.baseSetContext(ctx);
          				
          				// create new view port
          				if (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0;
          				if (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0;
          				ctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y'));
          				
          				var width = svg.ViewPort.width();
          				var height = svg.ViewPort.height();
          				
          				if (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%';
          				if (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%';
          				if (typeof(this.root) == 'undefined') {
          					width = this.attribute('width').toPixels('x');
          					height = this.attribute('height').toPixels('y');
          					
          					var x = 0;
          					var y = 0;
          					if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) {
          						x = -this.attribute('refX').toPixels('x');
          						y = -this.attribute('refY').toPixels('y');
          					}
          					
          					if (this.attribute('overflow').valueOrDefault('hidden') != 'visible') {
          						ctx.beginPath();
          						ctx.moveTo(x, y);
          						ctx.lineTo(width, y);
          						ctx.lineTo(width, height);
          						ctx.lineTo(x, height);
          						ctx.closePath();
          						ctx.clip();
          					}
          				}
          				svg.ViewPort.SetCurrent(width, height);	
          						
          				// viewbox
          				if (this.attribute('viewBox').hasValue()) {				
          					var viewBox = svg.ToNumberArray(this.attribute('viewBox').value);
          					var minX = viewBox[0];
          					var minY = viewBox[1];
          					width = viewBox[2];
          					height = viewBox[3];
          					
          					svg.AspectRatio(ctx,
          									this.attribute('preserveAspectRatio').value, 
          									svg.ViewPort.width(), 
          									width,
          									svg.ViewPort.height(),
          									height,
          									minX,
          									minY,
          									this.attribute('refX').value,
          									this.attribute('refY').value);
          					
          					svg.ViewPort.RemoveCurrent();
          					svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]);
          				}				
          			}
          		}
          		svg.Element.svg.prototype = new svg.Element.RenderedElementBase;
          
          		// rect element
          		svg.Element.rect = function(node) {
          			this.base = svg.Element.PathElementBase;
          			this.base(node);
          			
          			this.path = function(ctx) {
          				var x = this.attribute('x').toPixels('x');
          				var y = this.attribute('y').toPixels('y');
          				var width = this.attribute('width').toPixels('x');
          				var height = this.attribute('height').toPixels('y');
          				var rx = this.attribute('rx').toPixels('x');
          				var ry = this.attribute('ry').toPixels('y');
          				if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx;
          				if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry;
          				rx = Math.min(rx, width / 2.0);
          				ry = Math.min(ry, height / 2.0);
          				if (ctx != null) {
          					ctx.beginPath();
          					ctx.moveTo(x + rx, y);
          					ctx.lineTo(x + width - rx, y);
          					ctx.quadraticCurveTo(x + width, y, x + width, y + ry)
          					ctx.lineTo(x + width, y + height - ry);
          					ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height)
          					ctx.lineTo(x + rx, y + height);
          					ctx.quadraticCurveTo(x, y + height, x, y + height - ry)
          					ctx.lineTo(x, y + ry);
          					ctx.quadraticCurveTo(x, y, x + rx, y)
          					ctx.closePath();
          				}
          				
          				return new svg.BoundingBox(x, y, x + width, y + height);
          			}
          		}
          		svg.Element.rect.prototype = new svg.Element.PathElementBase;
          		
          		// circle element
          		svg.Element.circle = function(node) {
          			this.base = svg.Element.PathElementBase;
          			this.base(node);
          			
          			this.path = function(ctx) {
          				var cx = this.attribute('cx').toPixels('x');
          				var cy = this.attribute('cy').toPixels('y');
          				var r = this.attribute('r').toPixels();
          			
          				if (ctx != null) {
          					ctx.beginPath();
          					ctx.arc(cx, cy, r, 0, Math.PI * 2, true); 
          					ctx.closePath();
          				}
          				
          				return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r);
          			}
          		}
          		svg.Element.circle.prototype = new svg.Element.PathElementBase;	
          
          		// ellipse element
          		svg.Element.ellipse = function(node) {
          			this.base = svg.Element.PathElementBase;
          			this.base(node);
          			
          			this.path = function(ctx) {
          				var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);
          				var rx = this.attribute('rx').toPixels('x');
          				var ry = this.attribute('ry').toPixels('y');
          				var cx = this.attribute('cx').toPixels('x');
          				var cy = this.attribute('cy').toPixels('y');
          				
          				if (ctx != null) {
          					ctx.beginPath();
          					ctx.moveTo(cx, cy - ry);
          					ctx.bezierCurveTo(cx + (KAPPA * rx), cy - ry,  cx + rx, cy - (KAPPA * ry), cx + rx, cy);
          					ctx.bezierCurveTo(cx + rx, cy + (KAPPA * ry), cx + (KAPPA * rx), cy + ry, cx, cy + ry);
          					ctx.bezierCurveTo(cx - (KAPPA * rx), cy + ry, cx - rx, cy + (KAPPA * ry), cx - rx, cy);
          					ctx.bezierCurveTo(cx - rx, cy - (KAPPA * ry), cx - (KAPPA * rx), cy - ry, cx, cy - ry);
          					ctx.closePath();
          				}
          				
          				return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);
          			}
          		}
          		svg.Element.ellipse.prototype = new svg.Element.PathElementBase;			
          		
          		// line element
          		svg.Element.line = function(node) {
          			this.base = svg.Element.PathElementBase;
          			this.base(node);
          			
          			this.getPoints = function() {
          				return [
          					new svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')),
          					new svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))];
          			}
          								
          			this.path = function(ctx) {
          				var points = this.getPoints();
          				
          				if (ctx != null) {
          					ctx.beginPath();
          					ctx.moveTo(points[0].x, points[0].y);
          					ctx.lineTo(points[1].x, points[1].y);
          				}
          				
          				return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y);
          			}
          			
          			this.getMarkers = function() {
          				var points = this.getPoints();	
          				var a = points[0].angleTo(points[1]);
          				return [[points[0], a], [points[1], a]];
          			}
          		}
          		svg.Element.line.prototype = new svg.Element.PathElementBase;		
          				
          		// polyline element
          		svg.Element.polyline = function(node) {
          			this.base = svg.Element.PathElementBase;
          			this.base(node);
          			
          			this.points = svg.CreatePath(this.attribute('points').value);
          			this.path = function(ctx) {
          				var bb = new svg.BoundingBox(this.points[0].x, this.points[0].y);
          				if (ctx != null) {
          					ctx.beginPath();
          					ctx.moveTo(this.points[0].x, this.points[0].y);
          				}
          				for (var i=1; i<this.points.length; i++) {
          					bb.addPoint(this.points[i].x, this.points[i].y);
          					if (ctx != null) ctx.lineTo(this.points[i].x, this.points[i].y);
          				}
          				return bb;
          			}
          			
          			this.getMarkers = function() {
          				var markers = [];
          				for (var i=0; i<this.points.length - 1; i++) {
          					markers.push([this.points[i], this.points[i].angleTo(this.points[i+1])]);
          				}
          				markers.push([this.points[this.points.length-1], markers[markers.length-1][1]]);
          				return markers;
          			}			
          		}
          		svg.Element.polyline.prototype = new svg.Element.PathElementBase;				
          				
          		// polygon element
          		svg.Element.polygon = function(node) {
          			this.base = svg.Element.polyline;
          			this.base(node);
          			
          			this.basePath = this.path;
          			this.path = function(ctx) {
          				var bb = this.basePath(ctx);
          				if (ctx != null) {
          					ctx.lineTo(this.points[0].x, this.points[0].y);
          					ctx.closePath();
          				}
          				return bb;
          			}
          		}
          		svg.Element.polygon.prototype = new svg.Element.polyline;
          
          		// path element
          		svg.Element.path = function(node) {
          			this.base = svg.Element.PathElementBase;
          			this.base(node);
          					
          			var d = this.attribute('d').value;
          			// TODO: convert to real lexer based on http://www.w3.org/TR/SVG11/paths.html#PathDataBNF
          			d = d.replace(/,/gm,' '); // get rid of all commas
          			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
          			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from commands
          			d = d.replace(/([MmZzLlHhVvCcSsQqTtAa])([^\s])/gm,'$1 $2'); // separate commands from points
          			d = d.replace(/([^\s])([MmZzLlHhVvCcSsQqTtAa])/gm,'$1 $2'); // separate commands from points
          			d = d.replace(/([0-9])([+\-])/gm,'$1 $2'); // separate digits when no comma
          			d = d.replace(/(\.[0-9]*)(\.)/gm,'$1 $2'); // separate digits when no comma
          			d = d.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,'$1 $3 $4 '); // shorthand elliptical arc path syntax
          			d = svg.compressSpaces(d); // compress multiple spaces
          			d = svg.trim(d);
          			this.PathParser = new (function(d) {
          				this.tokens = d.split(' ');
          				
          				this.reset = function() {
          					this.i = -1;
          					this.command = '';
          					this.previousCommand = '';
          					this.start = new svg.Point(0, 0);
          					this.control = new svg.Point(0, 0);
          					this.current = new svg.Point(0, 0);
          					this.points = [];
          					this.angles = [];
          				}
          								
          				this.isEnd = function() {
          					return this.i >= this.tokens.length - 1;
          				}
          				
          				this.isCommandOrEnd = function() {
          					if (this.isEnd()) return true;
          					return this.tokens[this.i + 1].match(/^[A-Za-z]$/) != null;
          				}
          				
          				this.isRelativeCommand = function() {
          					switch(this.command)
          					{
          						case 'm':
          						case 'l':
          						case 'h':
          						case 'v':
          						case 'c':
          						case 's':
          						case 'q':
          						case 't':
          						case 'a':
          						case 'z':
          							return true;
          							break;
          					}
          					return false;
          				}
          							
          				this.getToken = function() {
          					this.i++;
          					return this.tokens[this.i];
          				}
          				
          				this.getScalar = function() {
          					return parseFloat(this.getToken());
          				}
          				
          				this.nextCommand = function() {
          					this.previousCommand = this.command;
          					this.command = this.getToken();
          				}				
          				
          				this.getPoint = function() {
          					var p = new svg.Point(this.getScalar(), this.getScalar());
          					return this.makeAbsolute(p);
          				}
          				
          				this.getAsControlPoint = function() {
          					var p = this.getPoint();
          					this.control = p;
          					return p;
          				}
          				
          				this.getAsCurrentPoint = function() {
          					var p = this.getPoint();
          					this.current = p;
          					return p;	
          				}
          				
          				this.getReflectedControlPoint = function() {
          					if (this.previousCommand.toLowerCase() != 'c' && 
          					    this.previousCommand.toLowerCase() != 's' &&
          						this.previousCommand.toLowerCase() != 'q' && 
          						this.previousCommand.toLowerCase() != 't' ){
          						return this.current;
          					}
          					
          					// reflect point
          					var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y);					
          					return p;
          				}
          				
          				this.makeAbsolute = function(p) {
          					if (this.isRelativeCommand()) {
          						p.x += this.current.x;
          						p.y += this.current.y;
          					}
          					return p;
          				}
          				
          				this.addMarker = function(p, from, priorTo) {
          					// if the last angle isn't filled in because we didn't have this point yet ...
          					if (priorTo != null && this.angles.length > 0 && this.angles[this.angles.length-1] == null) {
          						this.angles[this.angles.length-1] = this.points[this.points.length-1].angleTo(priorTo);
          					}
          					this.addMarkerAngle(p, from == null ? null : from.angleTo(p));
          				}
          				
          				this.addMarkerAngle = function(p, a) {
          					this.points.push(p);
          					this.angles.push(a);
          				}				
          				
          				this.getMarkerPoints = function() { return this.points; }
          				this.getMarkerAngles = function() {
          					for (var i=0; i<this.angles.length; i++) {
          						if (this.angles[i] == null) {
          							for (var j=i+1; j<this.angles.length; j++) {
          								if (this.angles[j] != null) {
          									this.angles[i] = this.angles[j];
          									break;
          								}
          							}
          						}
          					}
          					return this.angles;
          				}
          			})(d);
          
          			this.path = function(ctx) {
          				var pp = this.PathParser;
          				pp.reset();
          
          				var bb = new svg.BoundingBox();
          				if (ctx != null) ctx.beginPath();
          				while (!pp.isEnd()) {
          					pp.nextCommand();
          					switch (pp.command) {
          					case 'M':
          					case 'm':
          						var p = pp.getAsCurrentPoint();
          						pp.addMarker(p);
          						bb.addPoint(p.x, p.y);
          						if (ctx != null) ctx.moveTo(p.x, p.y);
          						pp.start = pp.current;
          						while (!pp.isCommandOrEnd()) {
          							var p = pp.getAsCurrentPoint();
          							pp.addMarker(p, pp.start);
          							bb.addPoint(p.x, p.y);
          							if (ctx != null) ctx.lineTo(p.x, p.y);
          						}
          						break;
          					case 'L':
          					case 'l':
          						while (!pp.isCommandOrEnd()) {
          							var c = pp.current;
          							var p = pp.getAsCurrentPoint();
          							pp.addMarker(p, c);
          							bb.addPoint(p.x, p.y);
          							if (ctx != null) ctx.lineTo(p.x, p.y);
          						}
          						break;
          					case 'H':
          					case 'h':
          						while (!pp.isCommandOrEnd()) {
          							var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y);
          							pp.addMarker(newP, pp.current);
          							pp.current = newP;
          							bb.addPoint(pp.current.x, pp.current.y);
          							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
          						}
          						break;
          					case 'V':
          					case 'v':
          						while (!pp.isCommandOrEnd()) {
          							var newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar());
          							pp.addMarker(newP, pp.current);
          							pp.current = newP;
          							bb.addPoint(pp.current.x, pp.current.y);
          							if (ctx != null) ctx.lineTo(pp.current.x, pp.current.y);
          						}
          						break;
          					case 'C':
          					case 'c':
          						while (!pp.isCommandOrEnd()) {
          							var curr = pp.current;
          							var p1 = pp.getPoint();
          							var cntrl = pp.getAsControlPoint();
          							var cp = pp.getAsCurrentPoint();
          							pp.addMarker(cp, cntrl, p1);
          							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
          							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
          						}
          						break;
          					case 'S':
          					case 's':
          						while (!pp.isCommandOrEnd()) {
          							var curr = pp.current;
          							var p1 = pp.getReflectedControlPoint();
          							var cntrl = pp.getAsControlPoint();
          							var cp = pp.getAsCurrentPoint();
          							pp.addMarker(cp, cntrl, p1);
          							bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
          							if (ctx != null) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y);
          						}
          						break;
          					case 'Q':
          					case 'q':
          						while (!pp.isCommandOrEnd()) {
          							var curr = pp.current;
          							var cntrl = pp.getAsControlPoint();
          							var cp = pp.getAsCurrentPoint();
          							pp.addMarker(cp, cntrl, cntrl);
          							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
          							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
          						}
          						break;
          					case 'T':
          					case 't':
          						while (!pp.isCommandOrEnd()) {
          							var curr = pp.current;
          							var cntrl = pp.getReflectedControlPoint();
          							pp.control = cntrl;
          							var cp = pp.getAsCurrentPoint();
          							pp.addMarker(cp, cntrl, cntrl);
          							bb.addQuadraticCurve(curr.x, curr.y, cntrl.x, cntrl.y, cp.x, cp.y);
          							if (ctx != null) ctx.quadraticCurveTo(cntrl.x, cntrl.y, cp.x, cp.y);
          						}
          						break;
          					case 'A':
          					case 'a':
          						while (!pp.isCommandOrEnd()) {
          						    var curr = pp.current;
          							var rx = pp.getScalar();
          							var ry = pp.getScalar();
          							var xAxisRotation = pp.getScalar() * (Math.PI / 180.0);
          							var largeArcFlag = pp.getScalar();
          							var sweepFlag = pp.getScalar();
          							var cp = pp.getAsCurrentPoint();
          
          							// Conversion from endpoint to center parameterization
          							// http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes
          							// x1', y1'
          							var currp = new svg.Point(
          								Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0,
          								-Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0
          							);
          							// adjust radii
          							var l = Math.pow(currp.x,2)/Math.pow(rx,2)+Math.pow(currp.y,2)/Math.pow(ry,2);
          							if (l > 1) {
          								rx *= Math.sqrt(l);
          								ry *= Math.sqrt(l);
          							}
          							// cx', cy'
          							var s = (largeArcFlag == sweepFlag ? -1 : 1) * Math.sqrt(
          								((Math.pow(rx,2)*Math.pow(ry,2))-(Math.pow(rx,2)*Math.pow(currp.y,2))-(Math.pow(ry,2)*Math.pow(currp.x,2))) /
          								(Math.pow(rx,2)*Math.pow(currp.y,2)+Math.pow(ry,2)*Math.pow(currp.x,2))
          							);
          							if (isNaN(s)) s = 0;
          							var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx);
          							// cx, cy
          							var centp = new svg.Point(
          								(curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y,
          								(curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y
          							);
          							// vector magnitude
          							var m = function(v) { return Math.sqrt(Math.pow(v[0],2) + Math.pow(v[1],2)); }
          							// ratio between two vectors
          							var r = function(u, v) { return (u[0]*v[0]+u[1]*v[1]) / (m(u)*m(v)) }
          							// angle between two vectors
          							var a = function(u, v) { return (u[0]*v[1] < u[1]*v[0] ? -1 : 1) * Math.acos(r(u,v)); }
          							// initial angle
          							var a1 = a([1,0], [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry]);
          							// angle delta
          							var u = [(currp.x-cpp.x)/rx,(currp.y-cpp.y)/ry];
          							var v = [(-currp.x-cpp.x)/rx,(-currp.y-cpp.y)/ry];
          							var ad = a(u, v);
          							if (r(u,v) <= -1) ad = Math.PI;
          							if (r(u,v) >= 1) ad = 0;
          
          							// for markers
          							var dir = 1 - sweepFlag ? 1.0 : -1.0;
          							var ah = a1 + dir * (ad / 2.0);
          							var halfWay = new svg.Point(
          								centp.x + rx * Math.cos(ah),
          								centp.y + ry * Math.sin(ah)
          							);
          							pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);
          							pp.addMarkerAngle(cp, ah - dir * Math.PI);
          
          							bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better
          							if (ctx != null) {
          								var r = rx > ry ? rx : ry;
          								var sx = rx > ry ? 1 : rx / ry;
          								var sy = rx > ry ? ry / rx : 1;
          
          								ctx.translate(centp.x, centp.y);
          								ctx.rotate(xAxisRotation);
          								ctx.scale(sx, sy);
          								ctx.arc(0, 0, r, a1, a1 + ad, 1 - sweepFlag);
          								ctx.scale(1/sx, 1/sy);
          								ctx.rotate(-xAxisRotation);
          								ctx.translate(-centp.x, -centp.y);
          							}
          						}
          						break;
          					case 'Z':
          					case 'z':
          						if (ctx != null) ctx.closePath();
          						pp.current = pp.start;
          					}
          				}
          
          				return bb;
          			}
          
          			this.getMarkers = function() {
          				var points = this.PathParser.getMarkerPoints();
          				var angles = this.PathParser.getMarkerAngles();
          				
          				var markers = [];
          				for (var i=0; i<points.length; i++) {
          					markers.push([points[i], angles[i]]);
          				}
          				return markers;
          			}
          		}
          		svg.Element.path.prototype = new svg.Element.PathElementBase;
          		
          		// pattern element
          		svg.Element.pattern = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.createPattern = function(ctx, element) {
          				var width = this.attribute('width').toPixels('x', true);
          				var height = this.attribute('height').toPixels('y', true);
          			
          				// render me using a temporary svg element
          				var tempSvg = new svg.Element.svg();
          				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
          				tempSvg.attributes['width'] = new svg.Property('width', width + 'px');
          				tempSvg.attributes['height'] = new svg.Property('height', height + 'px');
          				tempSvg.attributes['transform'] = new svg.Property('transform', this.attribute('patternTransform').value);
          				tempSvg.children = this.children;
          				
          				var c = document.createElement('canvas');
          				c.width = width;
          				c.height = height;
          				var cctx = c.getContext('2d');
          				if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) {
          					cctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true));
          				}
          				// render 3x3 grid so when we transform there's no white space on edges
          				for (var x=-1; x<=1; x++) {
          					for (var y=-1; y<=1; y++) {
          						cctx.save();
          						cctx.translate(x * c.width, y * c.height);
          						tempSvg.render(cctx);
          						cctx.restore();
          					}
          				}
          				var pattern = ctx.createPattern(c, 'repeat');
          				return pattern;
          			}
          		}
          		svg.Element.pattern.prototype = new svg.Element.ElementBase;
          		
          		// marker element
          		svg.Element.marker = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.baseRender = this.render;
          			this.render = function(ctx, point, angle) {
          				ctx.translate(point.x, point.y);
          				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(angle);
          				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth);
          				ctx.save();
          							
          				// render me using a temporary svg element
          				var tempSvg = new svg.Element.svg();
          				tempSvg.attributes['viewBox'] = new svg.Property('viewBox', this.attribute('viewBox').value);
          				tempSvg.attributes['refX'] = new svg.Property('refX', this.attribute('refX').value);
          				tempSvg.attributes['refY'] = new svg.Property('refY', this.attribute('refY').value);
          				tempSvg.attributes['width'] = new svg.Property('width', this.attribute('markerWidth').value);
          				tempSvg.attributes['height'] = new svg.Property('height', this.attribute('markerHeight').value);
          				tempSvg.attributes['fill'] = new svg.Property('fill', this.attribute('fill').valueOrDefault('black'));
          				tempSvg.attributes['stroke'] = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none'));
          				tempSvg.children = this.children;
          				tempSvg.render(ctx);
          				
          				ctx.restore();
          				if (this.attribute('markerUnits').valueOrDefault('strokeWidth') == 'strokeWidth') ctx.scale(1/ctx.lineWidth, 1/ctx.lineWidth);
          				if (this.attribute('orient').valueOrDefault('auto') == 'auto') ctx.rotate(-angle);
          				ctx.translate(-point.x, -point.y);
          			}
          		}
          		svg.Element.marker.prototype = new svg.Element.ElementBase;
          		
          		// definitions element
          		svg.Element.defs = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);	
          			
          			this.render = function(ctx) {
          				// NOOP
          			}
          		}
          		svg.Element.defs.prototype = new svg.Element.ElementBase;
          		
          		// base for gradients
          		svg.Element.GradientBase = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.gradientUnits = this.attribute('gradientUnits').valueOrDefault('objectBoundingBox');
          			
          			this.stops = [];			
          			for (var i=0; i<this.children.length; i++) {
          				var child = this.children[i];
          				if (child.type == 'stop') this.stops.push(child);
          			}	
          			
          			this.getGradient = function() {
          				// OVERRIDE ME!
          			}			
          
          			this.createGradient = function(ctx, element, parentOpacityProp) {
          				var stopsContainer = this;
          				if (this.getHrefAttribute().hasValue()) {
          					stopsContainer = this.getHrefAttribute().getDefinition();
          				}
          				
          				var addParentOpacity = function (color) {
          					if (parentOpacityProp.hasValue()) {
          						var p = new svg.Property('color', color);
          						return p.addOpacity(parentOpacityProp).value;
          					}
          					return color;
          				};
          			
          				var g = this.getGradient(ctx, element);
          				if (g == null) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color);
          				for (var i=0; i<stopsContainer.stops.length; i++) {
          					g.addColorStop(stopsContainer.stops[i].offset, addParentOpacity(stopsContainer.stops[i].color));
          				}
          				
          				if (this.attribute('gradientTransform').hasValue()) {
          					// render as transformed pattern on temporary canvas
          					var rootView = svg.ViewPort.viewPorts[0];
          					
          					var rect = new svg.Element.rect();
          					rect.attributes['x'] = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS/3.0);
          					rect.attributes['y'] = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS/3.0);
          					rect.attributes['width'] = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS);
          					rect.attributes['height'] = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS);
          					
          					var group = new svg.Element.g();
          					group.attributes['transform'] = new svg.Property('transform', this.attribute('gradientTransform').value);
          					group.children = [ rect ];
          					
          					var tempSvg = new svg.Element.svg();
          					tempSvg.attributes['x'] = new svg.Property('x', 0);
          					tempSvg.attributes['y'] = new svg.Property('y', 0);
          					tempSvg.attributes['width'] = new svg.Property('width', rootView.width);
          					tempSvg.attributes['height'] = new svg.Property('height', rootView.height);
          					tempSvg.children = [ group ];
          					
          					var c = document.createElement('canvas');
          					c.width = rootView.width;
          					c.height = rootView.height;
          					var tempCtx = c.getContext('2d');
          					tempCtx.fillStyle = g;
          					tempSvg.render(tempCtx);		
          					return tempCtx.createPattern(c, 'no-repeat');
          				}
          				
          				return g;				
          			}
          		}
          		svg.Element.GradientBase.prototype = new svg.Element.ElementBase;
          		
          		// linear gradient element
          		svg.Element.linearGradient = function(node) {
          			this.base = svg.Element.GradientBase;
          			this.base(node);
          			
          			this.getGradient = function(ctx, element) {
          				var bb = this.gradientUnits == 'objectBoundingBox' ? element.getBoundingBox() : null;
          				
          				if (!this.attribute('x1').hasValue()
          				 && !this.attribute('y1').hasValue()
          				 && !this.attribute('x2').hasValue()
          				 && !this.attribute('y2').hasValue()) {
          					this.attribute('x1', true).value = 0;
          					this.attribute('y1', true).value = 0;
          					this.attribute('x2', true).value = 1;
          					this.attribute('y2', true).value = 0;
          				 }
          				
          				var x1 = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.x() + bb.width() * this.attribute('x1').numValue() 
          					: this.attribute('x1').toPixels('x'));
          				var y1 = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.y() + bb.height() * this.attribute('y1').numValue()
          					: this.attribute('y1').toPixels('y'));
          				var x2 = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.x() + bb.width() * this.attribute('x2').numValue()
          					: this.attribute('x2').toPixels('x'));
          				var y2 = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.y() + bb.height() * this.attribute('y2').numValue()
          					: this.attribute('y2').toPixels('y'));
          
          				if (x1 == x2 && y1 == y2) return null;
          				return ctx.createLinearGradient(x1, y1, x2, y2);
          			}
          		}
          		svg.Element.linearGradient.prototype = new svg.Element.GradientBase;
          		
          		// radial gradient element
          		svg.Element.radialGradient = function(node) {
          			this.base = svg.Element.GradientBase;
          			this.base(node);
          			
          			this.getGradient = function(ctx, element) {
          				var bb = element.getBoundingBox();
          				
          				if (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%';
          				if (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%';
          				if (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%';
          				
          				var cx = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.x() + bb.width() * this.attribute('cx').numValue() 
          					: this.attribute('cx').toPixels('x'));
          				var cy = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.y() + bb.height() * this.attribute('cy').numValue() 
          					: this.attribute('cy').toPixels('y'));
          				
          				var fx = cx;
          				var fy = cy;
          				if (this.attribute('fx').hasValue()) {
          					fx = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.x() + bb.width() * this.attribute('fx').numValue() 
          					: this.attribute('fx').toPixels('x'));
          				}
          				if (this.attribute('fy').hasValue()) {
          					fy = (this.gradientUnits == 'objectBoundingBox' 
          					? bb.y() + bb.height() * this.attribute('fy').numValue() 
          					: this.attribute('fy').toPixels('y'));
          				}
          				
          				var r = (this.gradientUnits == 'objectBoundingBox' 
          					? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue()
          					: this.attribute('r').toPixels());
          				
          				return ctx.createRadialGradient(fx, fy, 0, cx, cy, r);
          			}
          		}
          		svg.Element.radialGradient.prototype = new svg.Element.GradientBase;
          		
          		// gradient stop element
          		svg.Element.stop = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.offset = this.attribute('offset').numValue();
          			if (this.offset < 0) this.offset = 0;
          			if (this.offset > 1) this.offset = 1;
          			
          			var stopColor = this.style('stop-color');
          			if (this.style('stop-opacity').hasValue()) stopColor = stopColor.addOpacity(this.style('stop-opacity'));
          			this.color = stopColor.value;
          		}
          		svg.Element.stop.prototype = new svg.Element.ElementBase;
          		
          		// animation base element
          		svg.Element.AnimateBase = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			svg.Animations.push(this);
          			
          			this.duration = 0.0;
          			this.begin = this.attribute('begin').toMilliseconds();
          			this.maxDuration = this.begin + this.attribute('dur').toMilliseconds();
          			
          			this.getProperty = function() {
          				var attributeType = this.attribute('attributeType').value;
          				var attributeName = this.attribute('attributeName').value;
          				
          				if (attributeType == 'CSS') {
          					return this.parent.style(attributeName, true);
          				}
          				return this.parent.attribute(attributeName, true);			
          			};
          			
          			this.initialValue = null;
          			this.initialUnits = '';
          			this.removed = false;		
          
          			this.calcValue = function() {
          				// OVERRIDE ME!
          				return '';
          			}
          					
          			this.update = function(delta) {	
          				// set initial value
          				if (this.initialValue == null) {
          					this.initialValue = this.getProperty().value;
          					this.initialUnits = this.getProperty().getUnits();
          				}
          			
          				// if we're past the end time
          				if (this.duration > this.maxDuration) {
          					// loop for indefinitely repeating animations
          					if (this.attribute('repeatCount').value == 'indefinite'
          					 || this.attribute('repeatDur').value == 'indefinite') {
          						this.duration = 0.0
          					}
          					else if (this.attribute('fill').valueOrDefault('remove') == 'freeze' && !this.frozen) {
          						this.frozen = true;
          						this.parent.animationFrozen = true;
          						this.parent.animationFrozenValue = this.getProperty().value;
          					}
          					else if (this.attribute('fill').valueOrDefault('remove') == 'remove' && !this.removed) {
          						this.removed = true;
          						this.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue;
          						return true;
          					}
          					return false;
          				}			
          				this.duration = this.duration + delta;
          			
          				// if we're past the begin time
          				var updated = false;
          				if (this.begin < this.duration) {
          					var newValue = this.calcValue(); // tween
          					
          					if (this.attribute('type').hasValue()) {
          						// for transform, etc.
          						var type = this.attribute('type').value;
          						newValue = type + '(' + newValue + ')';
          					}
          					
          					this.getProperty().value = newValue;
          					updated = true;
          				}
          				
          				return updated;
          			}
          			
          			this.from = this.attribute('from');
          			this.to = this.attribute('to');
          			this.values = this.attribute('values');
          			if (this.values.hasValue()) this.values.value = this.values.value.split(';');
          			
          			// fraction of duration we've covered
          			this.progress = function() {
          				var ret = { progress: (this.duration - this.begin) / (this.maxDuration - this.begin) };
          				if (this.values.hasValue()) {
          					var p = ret.progress * (this.values.value.length - 1);
          					var lb = Math.floor(p), ub = Math.ceil(p);
          					ret.from = new svg.Property('from', parseFloat(this.values.value[lb]));
          					ret.to = new svg.Property('to', parseFloat(this.values.value[ub]));
          					ret.progress = (p - lb) / (ub - lb);
          				}
          				else {
          					ret.from = this.from;
          					ret.to = this.to;
          				}
          				return ret;
          			}			
          		}
          		svg.Element.AnimateBase.prototype = new svg.Element.ElementBase;
          		
          		// animate element
          		svg.Element.animate = function(node) {
          			this.base = svg.Element.AnimateBase;
          			this.base(node);
          			
          			this.calcValue = function() {
          				var p = this.progress();
          				
          				// tween value linearly
          				var newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress; 
          				return newValue + this.initialUnits;
          			};
          		}
          		svg.Element.animate.prototype = new svg.Element.AnimateBase;
          			
          		// animate color element
          		svg.Element.animateColor = function(node) {
          			this.base = svg.Element.AnimateBase;
          			this.base(node);
          
          			this.calcValue = function() {
          				var p = this.progress();
          				var from = new RGBColor(p.from.value);
          				var to = new RGBColor(p.to.value);
          				
          				if (from.ok && to.ok) {
          					// tween color linearly
          					var r = from.r + (to.r - from.r) * p.progress;
          					var g = from.g + (to.g - from.g) * p.progress;
          					var b = from.b + (to.b - from.b) * p.progress;
          					return 'rgb('+parseInt(r,10)+','+parseInt(g,10)+','+parseInt(b,10)+')';
          				}
          				return this.attribute('from').value;
          			};
          		}
          		svg.Element.animateColor.prototype = new svg.Element.AnimateBase;
          		
          		// animate transform element
          		svg.Element.animateTransform = function(node) {
          			this.base = svg.Element.AnimateBase;
          			this.base(node);
          			
          			this.calcValue = function() {
          				var p = this.progress();
          				
          				// tween value linearly
          				var from = svg.ToNumberArray(p.from.value);
          				var to = svg.ToNumberArray(p.to.value);
          				var newValue = '';
          				for (var i=0; i<from.length; i++) {
          					newValue += from[i] + (to[i] - from[i]) * p.progress + ' ';
          				}
          				return newValue;
          			};
          		}
          		svg.Element.animateTransform.prototype = new svg.Element.animate;
          		
          		// font element
          		svg.Element.font = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          
          			this.horizAdvX = this.attribute('horiz-adv-x').numValue();			
          			
          			this.isRTL = false;
          			this.isArabic = false;
          			this.fontFace = null;
          			this.missingGlyph = null;
          			this.glyphs = [];			
          			for (var i=0; i<this.children.length; i++) {
          				var child = this.children[i];
          				if (child.type == 'font-face') {
          					this.fontFace = child;
          					if (child.style('font-family').hasValue()) {
          						svg.Definitions[child.style('font-family').value] = this;
          					}
          				}
          				else if (child.type == 'missing-glyph') this.missingGlyph = child;
          				else if (child.type == 'glyph') {
          					if (child.arabicForm != '') {
          						this.isRTL = true;
          						this.isArabic = true;
          						if (typeof(this.glyphs[child.unicode]) == 'undefined') this.glyphs[child.unicode] = [];
          						this.glyphs[child.unicode][child.arabicForm] = child;
          					}
          					else {
          						this.glyphs[child.unicode] = child;
          					}
          				}
          			}	
          		}
          		svg.Element.font.prototype = new svg.Element.ElementBase;
          		
          		// font-face element
          		svg.Element.fontface = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);	
          			
          			this.ascent = this.attribute('ascent').value;
          			this.descent = this.attribute('descent').value;
          			this.unitsPerEm = this.attribute('units-per-em').numValue();				
          		}
          		svg.Element.fontface.prototype = new svg.Element.ElementBase;
          		
          		// missing-glyph element
          		svg.Element.missingglyph = function(node) {
          			this.base = svg.Element.path;
          			this.base(node);	
          			
          			this.horizAdvX = 0;
          		}
          		svg.Element.missingglyph.prototype = new svg.Element.path;
          		
          		// glyph element
          		svg.Element.glyph = function(node) {
          			this.base = svg.Element.path;
          			this.base(node);	
          			
          			this.horizAdvX = this.attribute('horiz-adv-x').numValue();
          			this.unicode = this.attribute('unicode').value;
          			this.arabicForm = this.attribute('arabic-form').value;
          		}
          		svg.Element.glyph.prototype = new svg.Element.path;
          		
          		// text element
          		svg.Element.text = function(node) {
          			this.captureTextNodes = true;
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			this.baseSetContext = this.setContext;
          			this.setContext = function(ctx) {
          				this.baseSetContext(ctx);
          				
          				var textBaseline = this.style('dominant-baseline').toTextBaseline();
          				if (textBaseline == null) textBaseline = this.style('alignment-baseline').toTextBaseline();
          				if (textBaseline != null) ctx.textBaseline = textBaseline;
          			}
          			
          			this.getBoundingBox = function () {
          				var x = this.attribute('x').toPixels('x');
          				var y = this.attribute('y').toPixels('y');
          				var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
          				return new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y);
          			}
          			
          			this.renderChildren = function(ctx) {
          				this.x = this.attribute('x').toPixels('x');
          				this.y = this.attribute('y').toPixels('y');
          				this.x += this.getAnchorDelta(ctx, this, 0);
          				for (var i=0; i<this.children.length; i++) {
          					this.renderChild(ctx, this, i);
          				}
          			}
          			
          			this.getAnchorDelta = function (ctx, parent, startI) {
          				var textAnchor = this.style('text-anchor').valueOrDefault('start');
          				if (textAnchor != 'start') {
          					var width = 0;
          					for (var i=startI; i<parent.children.length; i++) {
          						var child = parent.children[i];
          						if (i > startI && child.attribute('x').hasValue()) break; // new group
          						width += child.measureTextRecursive(ctx);
          					}
          					return -1 * (textAnchor == 'end' ? width : width / 2.0);
          				}
          				return 0;
          			}
          			
          			this.renderChild = function(ctx, parent, i) {
          				var child = parent.children[i];
          				if (child.attribute('x').hasValue()) {
          					child.x = child.attribute('x').toPixels('x') + this.getAnchorDelta(ctx, parent, i);
          					if (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x');
          				}
          				else {
          					if (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x');
          					if (child.attribute('dx').hasValue()) this.x += child.attribute('dx').toPixels('x');
          					child.x = this.x;
          				}
          				this.x = child.x + child.measureText(ctx);
          				
          				if (child.attribute('y').hasValue()) {
          					child.y = child.attribute('y').toPixels('y');
          					if (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y');
          				}
          				else {
          					if (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y');
          					if (child.attribute('dy').hasValue()) this.y += child.attribute('dy').toPixels('y');
          					child.y = this.y;
          				}
          				this.y = child.y;
          				
          				child.render(ctx);
          				
          				for (var i=0; i<child.children.length; i++) {
          					this.renderChild(ctx, child, i);
          				}
          			}
          		}
          		svg.Element.text.prototype = new svg.Element.RenderedElementBase;
          		
          		// text base
          		svg.Element.TextElementBase = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			this.getGlyph = function(font, text, i) {
          				var c = text[i];
          				var glyph = null;
          				if (font.isArabic) {
          					var arabicForm = 'isolated';
          					if ((i==0 || text[i-1]==' ') && i<text.length-2 && text[i+1]!=' ') arabicForm = 'terminal'; 
          					if (i>0 && text[i-1]!=' ' && i<text.length-2 && text[i+1]!=' ') arabicForm = 'medial';
          					if (i>0 && text[i-1]!=' ' && (i == text.length-1 || text[i+1]==' ')) arabicForm = 'initial';
          					if (typeof(font.glyphs[c]) != 'undefined') {
          						glyph = font.glyphs[c][arabicForm];
          						if (glyph == null && font.glyphs[c].type == 'glyph') glyph = font.glyphs[c];
          					}
          				}
          				else {
          					glyph = font.glyphs[c];
          				}
          				if (glyph == null) glyph = font.missingGlyph;
          				return glyph;
          			}
          			
          			this.renderChildren = function(ctx) {
          				var customFont = this.parent.style('font-family').getDefinition();
          				if (customFont != null) {
          					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
          					var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle);
          					var text = this.getText();
          					if (customFont.isRTL) text = text.split("").reverse().join("");
          					
          					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
          					for (var i=0; i<text.length; i++) {
          						var glyph = this.getGlyph(customFont, text, i);
          						var scale = fontSize / customFont.fontFace.unitsPerEm;
          						ctx.translate(this.x, this.y);
          						ctx.scale(scale, -scale);
          						var lw = ctx.lineWidth;
          						ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize;
          						if (fontStyle == 'italic') ctx.transform(1, 0, .4, 1, 0, 0);
          						glyph.render(ctx);
          						if (fontStyle == 'italic') ctx.transform(1, 0, -.4, 1, 0, 0);
          						ctx.lineWidth = lw;
          						ctx.scale(1/scale, -1/scale);
          						ctx.translate(-this.x, -this.y);	
          						
          						this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm;
          						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
          							this.x += dx[i];
          						}
          					}
          					return;
          				}
          			
          				if (ctx.fillStyle != '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y);
          				if (ctx.strokeStyle != '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y);
          			}
          			
          			this.getText = function() {
          				// OVERRIDE ME
          			}
          			
          			this.measureTextRecursive = function(ctx) {
          				var width = this.measureText(ctx);
          				for (var i=0; i<this.children.length; i++) {
          					width += this.children[i].measureTextRecursive(ctx);
          				}
          				return width;
          			}
          			
          			this.measureText = function(ctx) {
          				var customFont = this.parent.style('font-family').getDefinition();
          				if (customFont != null) {
          					var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize);
          					var measure = 0;
          					var text = this.getText();
          					if (customFont.isRTL) text = text.split("").reverse().join("");
          					var dx = svg.ToNumberArray(this.parent.attribute('dx').value);
          					for (var i=0; i<text.length; i++) {
          						var glyph = this.getGlyph(customFont, text, i);
          						measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;
          						if (typeof(dx[i]) != 'undefined' && !isNaN(dx[i])) {
          							measure += dx[i];
          						}
          					}
          					return measure;
          				}
          			
          				var textToMeasure = svg.compressSpaces(this.getText());
          				if (!ctx.measureText) return textToMeasure.length * 10;
          				
          				ctx.save();
          				this.setContext(ctx);
          				var width = ctx.measureText(textToMeasure).width;
          				ctx.restore();
          				return width;
          			}
          		}
          		svg.Element.TextElementBase.prototype = new svg.Element.RenderedElementBase;
          		
          		// tspan 
          		svg.Element.tspan = function(node) {
          			this.captureTextNodes = true;
          			this.base = svg.Element.TextElementBase;
          			this.base(node);
          			
          			this.text = node.nodeValue || node.text || '';
          			this.getText = function() {
          				return this.text;
          			}
          		}
          		svg.Element.tspan.prototype = new svg.Element.TextElementBase;
          		
          		// tref
          		svg.Element.tref = function(node) {
          			this.base = svg.Element.TextElementBase;
          			this.base(node);
          			
          			this.getText = function() {
          				var element = this.getHrefAttribute().getDefinition();
          				if (element != null) return element.children[0].getText();
          			}
          		}
          		svg.Element.tref.prototype = new svg.Element.TextElementBase;		
          		
          		// a element
          		svg.Element.a = function(node) {
          			this.base = svg.Element.TextElementBase;
          			this.base(node);
          			
          			this.hasText = true;
          			for (var i=0; i<node.childNodes.length; i++) {
          				if (node.childNodes[i].nodeType != 3) this.hasText = false;
          			}
          			
          			// this might contain text
          			this.text = this.hasText ? node.childNodes[0].nodeValue : '';
          			this.getText = function() {
          				return this.text;
          			}		
          
          			this.baseRenderChildren = this.renderChildren;
          			this.renderChildren = function(ctx) {
          				if (this.hasText) {
          					// render as text element
          					this.baseRenderChildren(ctx);
          					var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize);
          					svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y));					
          				}
          				else {
          					// render as temporary group
          					var g = new svg.Element.g();
          					g.children = this.children;
          					g.parent = this;
          					g.render(ctx);
          				}
          			}
          			
          			this.onclick = function() {
          				window.open(this.getHrefAttribute().value);
          			}
          			
          			this.onmousemove = function() {
          				svg.ctx.canvas.style.cursor = 'pointer';
          			}
          		}
          		svg.Element.a.prototype = new svg.Element.TextElementBase;		
          		
          		// image element
          		svg.Element.image = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			var href = this.getHrefAttribute().value;
          			if (href === '') {
          				return;
          			}
          			var isSvg = href.match(/\.svg$/)
          			
          			svg.Images.push(this);
          			this.loaded = false;
          			if (!isSvg) {
          				this.img = document.createElement('img');
          				if (svg.opts['useCORS'] == true) { this.img.crossOrigin = 'Anonymous'; }
          				var self = this;
          				this.img.onload = function() { self.loaded = true; }
          				this.img.onerror = function() { svg.log('ERROR: image "' + href + '" not found'); self.loaded = true; }
          				this.img.src = href;
          			}
          			else {
          				this.img = svg.ajax(href);
          				this.loaded = true;
          			}
          			
          			this.renderChildren = function(ctx) {
          				var x = this.attribute('x').toPixels('x');
          				var y = this.attribute('y').toPixels('y');
          				
          				var width = this.attribute('width').toPixels('x');
          				var height = this.attribute('height').toPixels('y');			
          				if (width == 0 || height == 0) return;
          			
          				ctx.save();
          				if (isSvg) {
          					ctx.drawSvg(this.img, x, y, width, height);
          				}
          				else {
          					ctx.translate(x, y);
          					svg.AspectRatio(ctx,
          									this.attribute('preserveAspectRatio').value,
          									width,
          									this.img.width,
          									height,
          									this.img.height,
          									0,
          									0);	
          					ctx.drawImage(this.img, 0, 0);		
          				}
          				ctx.restore();
          			}
          			
          			this.getBoundingBox = function() {
          				var x = this.attribute('x').toPixels('x');
          				var y = this.attribute('y').toPixels('y');
          				var width = this.attribute('width').toPixels('x');
          				var height = this.attribute('height').toPixels('y');
          				return new svg.BoundingBox(x, y, x + width, y + height);
          			}
          		}
          		svg.Element.image.prototype = new svg.Element.RenderedElementBase;
          		
          		// group element
          		svg.Element.g = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			this.getBoundingBox = function() {
          				var bb = new svg.BoundingBox();
          				for (var i=0; i<this.children.length; i++) {
          					bb.addBoundingBox(this.children[i].getBoundingBox());
          				}
          				return bb;
          			};
          		}
          		svg.Element.g.prototype = new svg.Element.RenderedElementBase;
          
          		// symbol element
          		svg.Element.symbol = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          
          			this.render = function(ctx) {
          				// NO RENDER
          			};
          		}
          		svg.Element.symbol.prototype = new svg.Element.RenderedElementBase;		
          			
          		// style element
          		svg.Element.style = function(node) { 
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			// text, or spaces then CDATA
          			var css = ''
          			for (var i=0; i<node.childNodes.length; i++) {
          			  css += node.childNodes[i].nodeValue;
          			}
          			css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm, ''); // remove comments
          			css = svg.compressSpaces(css); // replace whitespace
          			var cssDefs = css.split('}');
          			for (var i=0; i<cssDefs.length; i++) {
          				if (svg.trim(cssDefs[i]) != '') {
          					var cssDef = cssDefs[i].split('{');
          					var cssClasses = cssDef[0].split(',');
          					var cssProps = cssDef[1].split(';');
          					for (var j=0; j<cssClasses.length; j++) {
          						var cssClass = svg.trim(cssClasses[j]);
          						if (cssClass != '') {
          							var props = {};
          							for (var k=0; k<cssProps.length; k++) {
          								var prop = cssProps[k].indexOf(':');
          								var name = cssProps[k].substr(0, prop);
          								var value = cssProps[k].substr(prop + 1, cssProps[k].length - prop);
          								if (name != null && value != null) {
          									props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value));
          								}
          							}
          							svg.Styles[cssClass] = props;
          							if (cssClass == '@font-face') {
          								var fontFamily = props['font-family'].value.replace(/"/g,'');
          								var srcs = props['src'].value.split(',');
          								for (var s=0; s<srcs.length; s++) {
          									if (srcs[s].indexOf('format("svg")') > 0) {
          										var urlStart = srcs[s].indexOf('url');
          										var urlEnd = srcs[s].indexOf(')', urlStart);
          										var url = srcs[s].substr(urlStart + 5, urlEnd - urlStart - 6);
          										var doc = svg.parseXml(svg.ajax(url));
          										var fonts = doc.getElementsByTagName('font');
          										for (var f=0; f<fonts.length; f++) {
          											var font = svg.CreateElement(fonts[f]);
          											svg.Definitions[fontFamily] = font;
          										}
          									}
          								}
          							}
          						}
          					}
          				}
          			}
          		}
          		svg.Element.style.prototype = new svg.Element.ElementBase;
          		
          		// use element 
          		svg.Element.use = function(node) {
          			this.base = svg.Element.RenderedElementBase;
          			this.base(node);
          			
          			this.baseSetContext = this.setContext;
          			this.setContext = function(ctx) {
          				this.baseSetContext(ctx);
          				if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0);
          				if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y'));
          			}
          			
          			var element = this.getHrefAttribute().getDefinition();
          			
          			this.path = function(ctx) {
          				if (element != null) element.path(ctx);
          			}
          			
          			this.getBoundingBox = function() {
          				if (element != null) return element.getBoundingBox();
          			}
          			
          			this.renderChildren = function(ctx) {
          				if (element != null) {
          					var tempSvg = element;
          					if (element.type == 'symbol') {
          						// render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)
          						tempSvg = new svg.Element.svg();
          						tempSvg.type = 'svg';
          						tempSvg.attributes['viewBox'] = new svg.Property('viewBox', element.attribute('viewBox').value);
          						tempSvg.attributes['preserveAspectRatio'] = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value);
          						tempSvg.attributes['overflow'] = new svg.Property('overflow', element.attribute('overflow').value);
          						tempSvg.children = element.children;
          					}
          					if (tempSvg.type == 'svg') {
          						// if symbol or svg, inherit width/height from me
          						if (this.attribute('width').hasValue()) tempSvg.attributes['width'] = new svg.Property('width', this.attribute('width').value);
          						if (this.attribute('height').hasValue()) tempSvg.attributes['height'] = new svg.Property('height', this.attribute('height').value);
          					}
          					var oldParent = tempSvg.parent;
          					tempSvg.parent = null;
          					tempSvg.render(ctx);
          					tempSvg.parent = oldParent;
          				}
          			}
          		}
          		svg.Element.use.prototype = new svg.Element.RenderedElementBase;
          		
          		// mask element
          		svg.Element.mask = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          						
          			this.apply = function(ctx, element) {
          				// render as temp svg	
          				var x = this.attribute('x').toPixels('x');
          				var y = this.attribute('y').toPixels('y');
          				var width = this.attribute('width').toPixels('x');
          				var height = this.attribute('height').toPixels('y');
          				
          				if (width == 0 && height == 0) {
          					var bb = new svg.BoundingBox();
          					for (var i=0; i<this.children.length; i++) {
          						bb.addBoundingBox(this.children[i].getBoundingBox());
          					}
          					var x = Math.floor(bb.x1);
          					var y = Math.floor(bb.y1);
          					var width = Math.floor(bb.width());
          					var	height = Math.floor(bb.height());
          				}
          				
          				// temporarily remove mask to avoid recursion
          				var mask = element.attribute('mask').value;
          				element.attribute('mask').value = '';
          				
          					var cMask = document.createElement('canvas');
          					cMask.width = x + width;
          					cMask.height = y + height;
          					var maskCtx = cMask.getContext('2d');
          					this.renderChildren(maskCtx);
          				
          					var c = document.createElement('canvas');
          					c.width = x + width;
          					c.height = y + height;
          					var tempCtx = c.getContext('2d');
          					element.render(tempCtx);
          					tempCtx.globalCompositeOperation = 'destination-in';
          					tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat');
          					tempCtx.fillRect(0, 0, x + width, y + height);
          					
          					ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat');
          					ctx.fillRect(0, 0, x + width, y + height);
          					
          				// reassign mask
          				element.attribute('mask').value = mask;	
          			}
          			
          			this.render = function(ctx) {
          				// NO RENDER
          			}
          		}
          		svg.Element.mask.prototype = new svg.Element.ElementBase;
          		
          		// clip element
          		svg.Element.clipPath = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.apply = function(ctx) {
          				for (var i=0; i<this.children.length; i++) {
          					var child = this.children[i];
          					if (typeof(child.path) != 'undefined') {
          						var transform = null;
          						if (child.attribute('transform').hasValue()) { 
          							transform = new svg.Transform(child.attribute('transform').value);
          							transform.apply(ctx);
          						}
          						child.path(ctx);
          						ctx.clip();
          						if (transform) { transform.unapply(ctx); }
          					}
          				}
          			}
          			
          			this.render = function(ctx) {
          				// NO RENDER
          			}
          		}
          		svg.Element.clipPath.prototype = new svg.Element.ElementBase;
          
          		// filters
          		svg.Element.filter = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          						
          			this.apply = function(ctx, element) {
          				// render as temp svg	
          				var bb = element.getBoundingBox();
          				var x = Math.floor(bb.x1);
          				var y = Math.floor(bb.y1);
          				var width = Math.floor(bb.width());
          				var	height = Math.floor(bb.height());
          
          				// temporarily remove filter to avoid recursion
          				var filter = element.style('filter').value;
          				element.style('filter').value = '';
          				
          				var px = 0, py = 0;
          				for (var i=0; i<this.children.length; i++) {
          					var efd = this.children[i].extraFilterDistance || 0;
          					px = Math.max(px, efd);
          					py = Math.max(py, efd);
          				}
          				
          				var c = document.createElement('canvas');
          				c.width = width + 2*px;
          				c.height = height + 2*py;
          				var tempCtx = c.getContext('2d');
          				tempCtx.translate(-x + px, -y + py);
          				element.render(tempCtx);
          			
          				// apply filters
          				for (var i=0; i<this.children.length; i++) {
          					this.children[i].apply(tempCtx, 0, 0, width + 2*px, height + 2*py);
          				}
          				
          				// render on me
          				ctx.drawImage(c, 0, 0, width + 2*px, height + 2*py, x - px, y - py, width + 2*px, height + 2*py);
          				
          				// reassign filter
          				element.style('filter', true).value = filter;	
          			}
          			
          			this.render = function(ctx) {
          				// NO RENDER
          			}		
          		}
          		svg.Element.filter.prototype = new svg.Element.ElementBase;
          		
          		svg.Element.feMorphology = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.apply = function(ctx, x, y, width, height) {
          				// TODO: implement
          			}
          		}
          		svg.Element.feMorphology.prototype = new svg.Element.ElementBase;
          		
          		svg.Element.feComposite = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			this.apply = function(ctx, x, y, width, height) {
          				// TODO: implement
          			}
          		}
          		svg.Element.feComposite.prototype = new svg.Element.ElementBase;
          		
          		svg.Element.feColorMatrix = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          			
          			var matrix = svg.ToNumberArray(this.attribute('values').value);
          			switch (this.attribute('type').valueOrDefault('matrix')) { // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement
          				case 'saturate':
          					var s = matrix[0];
          					matrix = [0.213+0.787*s,0.715-0.715*s,0.072-0.072*s,0,0,
          							  0.213-0.213*s,0.715+0.285*s,0.072-0.072*s,0,0,
          							  0.213-0.213*s,0.715-0.715*s,0.072+0.928*s,0,0,
          							  0,0,0,1,0,
          							  0,0,0,0,1];
          					break;
          				case 'hueRotate':
          					var a = matrix[0] * Math.PI / 180.0;
          					var c = function (m1,m2,m3) { return m1 + Math.cos(a)*m2 + Math.sin(a)*m3; };
          					matrix = [c(0.213,0.787,-0.213),c(0.715,-0.715,-0.715),c(0.072,-0.072,0.928),0,0,
          							  c(0.213,-0.213,0.143),c(0.715,0.285,0.140),c(0.072,-0.072,-0.283),0,0,
          							  c(0.213,-0.213,-0.787),c(0.715,-0.715,0.715),c(0.072,0.928,0.072),0,0,
          							  0,0,0,1,0,
          							  0,0,0,0,1];
          					break;
          				case 'luminanceToAlpha':
          					matrix = [0,0,0,0,0,
          							  0,0,0,0,0,
          							  0,0,0,0,0,
          							  0.2125,0.7154,0.0721,0,0,
          							  0,0,0,0,1];
          					break;
          			}
          			
          			function imGet(img, x, y, width, height, rgba) {
          				return img[y*width*4 + x*4 + rgba];
          			}
          			
          			function imSet(img, x, y, width, height, rgba, val) {
          				img[y*width*4 + x*4 + rgba] = val;
          			}
          			
          			function m(i, v) {
          				var mi = matrix[i];
          				return mi * (mi < 0 ? v - 255 : v);
          			}
          						
          			this.apply = function(ctx, x, y, width, height) {
          				// assuming x==0 && y==0 for now
          				var srcData = ctx.getImageData(0, 0, width, height);
          				for (var y = 0; y < height; y++) {
          					for (var x = 0; x < width; x++) {
          						var r = imGet(srcData.data, x, y, width, height, 0);
          						var g = imGet(srcData.data, x, y, width, height, 1);
          						var b = imGet(srcData.data, x, y, width, height, 2);
          						var a = imGet(srcData.data, x, y, width, height, 3);
          						imSet(srcData.data, x, y, width, height, 0, m(0,r)+m(1,g)+m(2,b)+m(3,a)+m(4,1));
          						imSet(srcData.data, x, y, width, height, 1, m(5,r)+m(6,g)+m(7,b)+m(8,a)+m(9,1));
          						imSet(srcData.data, x, y, width, height, 2, m(10,r)+m(11,g)+m(12,b)+m(13,a)+m(14,1));
          						imSet(srcData.data, x, y, width, height, 3, m(15,r)+m(16,g)+m(17,b)+m(18,a)+m(19,1));
          					}
          				}
          				ctx.clearRect(0, 0, width, height);
          				ctx.putImageData(srcData, 0, 0);
          			}
          		}
          		svg.Element.feColorMatrix.prototype = new svg.Element.ElementBase;
          		
          		svg.Element.feGaussianBlur = function(node) {
          			this.base = svg.Element.ElementBase;
          			this.base(node);
          
          			this.blurRadius = Math.floor(this.attribute('stdDeviation').numValue());
          			this.extraFilterDistance = this.blurRadius;
          			
          			this.apply = function(ctx, x, y, width, height) {
          				if (typeof(stackBlurCanvasRGBA) == 'undefined') {
          					svg.log('ERROR: StackBlur.js must be included for blur to work');
          					return;
          				}
          				
          				// StackBlur requires canvas be on document
          				ctx.canvas.id = svg.UniqueId();
          				ctx.canvas.style.display = 'none';
          				document.body.appendChild(ctx.canvas);
          				stackBlurCanvasRGBA(ctx.canvas.id, x, y, width, height, this.blurRadius);
          				document.body.removeChild(ctx.canvas);
          			}
          		}
          		svg.Element.feGaussianBlur.prototype = new svg.Element.ElementBase;
          		
          		// title element, do nothing
          		svg.Element.title = function(node) {
          		}
          		svg.Element.title.prototype = new svg.Element.ElementBase;
          
          		// desc element, do nothing
          		svg.Element.desc = function(node) {
          		}
          		svg.Element.desc.prototype = new svg.Element.ElementBase;		
          		
          		svg.Element.MISSING = function(node) {
          			svg.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.');
          		}
          		svg.Element.MISSING.prototype = new svg.Element.ElementBase;
          		
          		// element factory
          		svg.CreateElement = function(node) {	
          			var className = node.nodeName.replace(/^[^:]+:/,''); // remove namespace
          			className = className.replace(/\-/g,''); // remove dashes
          			var e = null;
          			if (typeof(svg.Element[className]) != 'undefined') {
          				e = new svg.Element[className](node);
          			}
          			else {
          				e = new svg.Element.MISSING(node);
          			}
          
          			e.type = node.nodeName;
          			return e;
          		}
          				
          		// load from url
          		svg.load = function(ctx, url) {
          			svg.loadXml(ctx, svg.ajax(url));
          		}
          		
          		// load from xml
          		svg.loadXml = function(ctx, xml) {
          			svg.loadXmlDoc(ctx, svg.parseXml(xml));
          		}
          		
          		svg.loadXmlDoc = function(ctx, dom) {
          			svg.init(ctx);
          			
          			var mapXY = function(p) {
          				var e = ctx.canvas;
          				while (e) {
          					p.x -= e.offsetLeft;
          					p.y -= e.offsetTop;
          					e = e.offsetParent;
          				}
          				if (window.scrollX) p.x += window.scrollX;
          				if (window.scrollY) p.y += window.scrollY;
          				return p;
          			}
          			
          			// bind mouse
          			if (svg.opts['ignoreMouse'] != true) {
          				ctx.canvas.onclick = function(e) {
          					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
          					svg.Mouse.onclick(p.x, p.y);
          				};
          				ctx.canvas.onmousemove = function(e) {
          					var p = mapXY(new svg.Point(e != null ? e.clientX : event.clientX, e != null ? e.clientY : event.clientY));
          					svg.Mouse.onmousemove(p.x, p.y);
          				};
          			}
          		
          			var e = svg.CreateElement(dom.documentElement);
          			e.root = true;
          					
          			// render loop
          			var isFirstRender = true;
          			var draw = function() {
          				svg.ViewPort.Clear();
          				if (ctx.canvas.parentNode) svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight);
          			
          				if (svg.opts['ignoreDimensions'] != true) {
          					// set canvas size
          					if (e.style('width').hasValue()) {
          						ctx.canvas.width = e.style('width').toPixels('x');
          						ctx.canvas.style.width = ctx.canvas.width + 'px';
          					}
          					if (e.style('height').hasValue()) {
          						ctx.canvas.height = e.style('height').toPixels('y');
          						ctx.canvas.style.height = ctx.canvas.height + 'px';
          					}
          				}
          				var cWidth = ctx.canvas.clientWidth || ctx.canvas.width;
          				var cHeight = ctx.canvas.clientHeight || ctx.canvas.height;
          				if (svg.opts['ignoreDimensions'] == true && e.style('width').hasValue() && e.style('height').hasValue()) {
          					cWidth = e.style('width').toPixels('x');
          					cHeight = e.style('height').toPixels('y');
          				}
          				svg.ViewPort.SetCurrent(cWidth, cHeight);		
          				
          				if (svg.opts['offsetX'] != null) e.attribute('x', true).value = svg.opts['offsetX'];
          				if (svg.opts['offsetY'] != null) e.attribute('y', true).value = svg.opts['offsetY'];
          				if (svg.opts['scaleWidth'] != null || svg.opts['scaleHeight'] != null) {
          					var xRatio = null, yRatio = null, viewBox = svg.ToNumberArray(e.attribute('viewBox').value);
          					
          					if (svg.opts['scaleWidth'] != null) {
          						if (e.attribute('width').hasValue()) xRatio = e.attribute('width').toPixels('x') / svg.opts['scaleWidth'];
          						else if (!isNaN(viewBox[2])) xRatio = viewBox[2] / svg.opts['scaleWidth'];
          					}
          					
          					if (svg.opts['scaleHeight'] != null) {
          						if (e.attribute('height').hasValue()) yRatio = e.attribute('height').toPixels('y') / svg.opts['scaleHeight'];
          						else if (!isNaN(viewBox[3])) yRatio = viewBox[3] / svg.opts['scaleHeight'];
          					}
          
          					if (xRatio == null) { xRatio = yRatio; }
          					if (yRatio == null) { yRatio = xRatio; }
          					
          					e.attribute('width', true).value = svg.opts['scaleWidth'];
          					e.attribute('height', true).value = svg.opts['scaleHeight'];			
          					e.attribute('viewBox', true).value = '0 0 ' + (cWidth * xRatio) + ' ' + (cHeight * yRatio);
          					e.attribute('preserveAspectRatio', true).value = 'none';
          				}
          			
          				// clear and render
          				if (svg.opts['ignoreClear'] != true) {
          					ctx.clearRect(0, 0, cWidth, cHeight);
          				}
          				e.render(ctx);
          				if (isFirstRender) {
          					isFirstRender = false;
          					if (typeof(svg.opts['renderCallback']) == 'function') svg.opts['renderCallback'](dom);
          				}			
          			}
          			
          			var waitingForImages = true;
          			if (svg.ImagesLoaded()) {
          				waitingForImages = false;
          				draw();
          			}
          			svg.intervalID = setInterval(function() { 
          				var needUpdate = false;
          				
          				if (waitingForImages && svg.ImagesLoaded()) {
          					waitingForImages = false;
          					needUpdate = true;
          				}
          			
          				// need update from mouse events?
          				if (svg.opts['ignoreMouse'] != true) {
          					needUpdate = needUpdate | svg.Mouse.hasEvents();
          				}
          			
          				// need update from animations?
          				if (svg.opts['ignoreAnimation'] != true) {
          					for (var i=0; i<svg.Animations.length; i++) {
          						needUpdate = needUpdate | svg.Animations[i].update(1000 / svg.FRAMERATE);
          					}
          				}
          				
          				// need update from redraw?
          				if (typeof(svg.opts['forceRedraw']) == 'function') {
          					if (svg.opts['forceRedraw']() == true) needUpdate = true;
          				}
          				
          				// render if needed
          				if (needUpdate) {
          					draw();				
          					svg.Mouse.runEvents(); // run and clear our events
          				}
          			}, 1000 / svg.FRAMERATE);
          		}
          		
          		svg.stop = function() {
          			if (svg.intervalID) {
          				clearInterval(svg.intervalID);
          			}
          		}
          		
          		svg.Mouse = new (function() {
          			this.events = [];
          			this.hasEvents = function() { return this.events.length != 0; }
          		
          			this.onclick = function(x, y) {
          				this.events.push({ type: 'onclick', x: x, y: y, 
          					run: function(e) { if (e.onclick) e.onclick(); }
          				});
          			}
          			
          			this.onmousemove = function(x, y) {
          				this.events.push({ type: 'onmousemove', x: x, y: y,
          					run: function(e) { if (e.onmousemove) e.onmousemove(); }
          				});
          			}			
          			
          			this.eventElements = [];
          			
          			this.checkPath = function(element, ctx) {
          				for (var i=0; i<this.events.length; i++) {
          					var e = this.events[i];
          					if (ctx.isPointInPath && ctx.isPointInPath(e.x, e.y)) this.eventElements[i] = element;
          				}
          			}
          			
          			this.checkBoundingBox = function(element, bb) {
          				for (var i=0; i<this.events.length; i++) {
          					var e = this.events[i];
          					if (bb.isPointInBox(e.x, e.y)) this.eventElements[i] = element;
          				}			
          			}
          			
          			this.runEvents = function() {
          				svg.ctx.canvas.style.cursor = '';
          				
          				for (var i=0; i<this.events.length; i++) {
          					var e = this.events[i];
          					var element = this.eventElements[i];
          					while (element) {
          						e.run(element);
          						element = element.parent;
          					}
          				}		
          			
          				// done running, clear
          				this.events = []; 
          				this.eventElements = [];
          			}
          		});
          		
          		return svg;
          	}
          })();
          
          if (typeof(CanvasRenderingContext2D) != 'undefined') {
          	CanvasRenderingContext2D.prototype.drawSvg = function(s, dx, dy, dw, dh) {
          		canvg(this.canvas, s, { 
          			ignoreMouse: true, 
          			ignoreAnimation: true, 
          			ignoreDimensions: true, 
          			ignoreClear: true, 
          			offsetX: dx, 
          			offsetY: dy, 
          			scaleWidth: dw, 
          			scaleHeight: dh
          		});
          	}
          }
        • rgbcolor.js
          /*jslint vars: true*/
          /**
           * A class to parse color values
           * @author Stoyan Stefanov <sstoo@gmail.com>
           * @link   http://www.phpied.com/rgb-color-parser-in-javascript/
           * @license Use it if you like it
           */
          function RGBColor(color_string) { 'use strict';
              this.ok = false;
          
              // strip any leading #
              if (color_string.charAt(0) === '#') { // remove # if any
                  color_string = color_string.substr(1,6);
              }
          
              color_string = color_string.replace(/ /g,'');
              color_string = color_string.toLowerCase();
          
              // before getting into regexps, try simple matches
              // and overwrite the input
              var simple_colors = {
                  aliceblue: 'f0f8ff',
                  antiquewhite: 'faebd7',
                  aqua: '00ffff',
                  aquamarine: '7fffd4',
                  azure: 'f0ffff',
                  beige: 'f5f5dc',
                  bisque: 'ffe4c4',
                  black: '000000',
                  blanchedalmond: 'ffebcd',
                  blue: '0000ff',
                  blueviolet: '8a2be2',
                  brown: 'a52a2a',
                  burlywood: 'deb887',
                  cadetblue: '5f9ea0',
                  chartreuse: '7fff00',
                  chocolate: 'd2691e',
                  coral: 'ff7f50',
                  cornflowerblue: '6495ed',
                  cornsilk: 'fff8dc',
                  crimson: 'dc143c',
                  cyan: '00ffff',
                  darkblue: '00008b',
                  darkcyan: '008b8b',
                  darkgoldenrod: 'b8860b',
                  darkgray: 'a9a9a9',
                  darkgreen: '006400',
                  darkkhaki: 'bdb76b',
                  darkmagenta: '8b008b',
                  darkolivegreen: '556b2f',
                  darkorange: 'ff8c00',
                  darkorchid: '9932cc',
                  darkred: '8b0000',
                  darksalmon: 'e9967a',
                  darkseagreen: '8fbc8f',
                  darkslateblue: '483d8b',
                  darkslategray: '2f4f4f',
                  darkturquoise: '00ced1',
                  darkviolet: '9400d3',
                  deeppink: 'ff1493',
                  deepskyblue: '00bfff',
                  dimgray: '696969',
                  dodgerblue: '1e90ff',
                  feldspar: 'd19275',
                  firebrick: 'b22222',
                  floralwhite: 'fffaf0',
                  forestgreen: '228b22',
                  fuchsia: 'ff00ff',
                  gainsboro: 'dcdcdc',
                  ghostwhite: 'f8f8ff',
                  gold: 'ffd700',
                  goldenrod: 'daa520',
                  gray: '808080',
                  green: '008000',
                  greenyellow: 'adff2f',
                  honeydew: 'f0fff0',
                  hotpink: 'ff69b4',
                  indianred : 'cd5c5c',
                  indigo : '4b0082',
                  ivory: 'fffff0',
                  khaki: 'f0e68c',
                  lavender: 'e6e6fa',
                  lavenderblush: 'fff0f5',
                  lawngreen: '7cfc00',
                  lemonchiffon: 'fffacd',
                  lightblue: 'add8e6',
                  lightcoral: 'f08080',
                  lightcyan: 'e0ffff',
                  lightgoldenrodyellow: 'fafad2',
                  lightgrey: 'd3d3d3',
                  lightgreen: '90ee90',
                  lightpink: 'ffb6c1',
                  lightsalmon: 'ffa07a',
                  lightseagreen: '20b2aa',
                  lightskyblue: '87cefa',
                  lightslateblue: '8470ff',
                  lightslategray: '778899',
                  lightsteelblue: 'b0c4de',
                  lightyellow: 'ffffe0',
                  lime: '00ff00',
                  limegreen: '32cd32',
                  linen: 'faf0e6',
                  magenta: 'ff00ff',
                  maroon: '800000',
                  mediumaquamarine: '66cdaa',
                  mediumblue: '0000cd',
                  mediumorchid: 'ba55d3',
                  mediumpurple: '9370d8',
                  mediumseagreen: '3cb371',
                  mediumslateblue: '7b68ee',
                  mediumspringgreen: '00fa9a',
                  mediumturquoise: '48d1cc',
                  mediumvioletred: 'c71585',
                  midnightblue: '191970',
                  mintcream: 'f5fffa',
                  mistyrose: 'ffe4e1',
                  moccasin: 'ffe4b5',
                  navajowhite: 'ffdead',
                  navy: '000080',
                  oldlace: 'fdf5e6',
                  olive: '808000',
                  olivedrab: '6b8e23',
                  orange: 'ffa500',
                  orangered: 'ff4500',
                  orchid: 'da70d6',
                  palegoldenrod: 'eee8aa',
                  palegreen: '98fb98',
                  paleturquoise: 'afeeee',
                  palevioletred: 'd87093',
                  papayawhip: 'ffefd5',
                  peachpuff: 'ffdab9',
                  peru: 'cd853f',
                  pink: 'ffc0cb',
                  plum: 'dda0dd',
                  powderblue: 'b0e0e6',
                  purple: '800080',
                  red: 'ff0000',
                  rosybrown: 'bc8f8f',
                  royalblue: '4169e1',
                  saddlebrown: '8b4513',
                  salmon: 'fa8072',
                  sandybrown: 'f4a460',
                  seagreen: '2e8b57',
                  seashell: 'fff5ee',
                  sienna: 'a0522d',
                  silver: 'c0c0c0',
                  skyblue: '87ceeb',
                  slateblue: '6a5acd',
                  slategray: '708090',
                  snow: 'fffafa',
                  springgreen: '00ff7f',
                  steelblue: '4682b4',
                  tan: 'd2b48c',
                  teal: '008080',
                  thistle: 'd8bfd8',
                  tomato: 'ff6347',
                  turquoise: '40e0d0',
                  violet: 'ee82ee',
                  violetred: 'd02090',
                  wheat: 'f5deb3',
                  white: 'ffffff',
                  whitesmoke: 'f5f5f5',
                  yellow: 'ffff00',
                  yellowgreen: '9acd32'
              };
              var key;
              for (key in simple_colors) {
                  if (simple_colors.hasOwnProperty(key)) {
                      if (color_string == key) {
                          color_string = simple_colors[key];
                      }
                  }
              }
              // emd of simple type-in colors
          
              // array of color definition objects
              var color_defs = [
                  {
                      re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
                      example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],
                      process: function (bits){
                          return [
                              parseInt(bits[1], 10),
                              parseInt(bits[2], 10),
                              parseInt(bits[3], 10)
                          ];
                      }
                  },
                  {
                      re: /^(\w{2})(\w{2})(\w{2})$/,
                      example: ['#00ff00', '336699'],
                      process: function (bits){
                          return [
                              parseInt(bits[1], 16),
                              parseInt(bits[2], 16),
                              parseInt(bits[3], 16)
                          ];
                      }
                  },
                  {
                      re: /^(\w{1})(\w{1})(\w{1})$/,
                      example: ['#fb0', 'f0f'],
                      process: function (bits){
                          return [
                              parseInt(bits[1] + bits[1], 16),
                              parseInt(bits[2] + bits[2], 16),
                              parseInt(bits[3] + bits[3], 16)
                          ];
                      }
                  }
              ];
          
              var i;
              // search through the definitions to find a match
              for (i = 0; i < color_defs.length; i++) {
                  var re = color_defs[i].re;
                  var processor = color_defs[i].process;
                  var bits = re.exec(color_string);
                  if (bits) {
                      var channels = processor(bits);
                      this.r = channels[0];
                      this.g = channels[1];
                      this.b = channels[2];
                      this.ok = true;
                  }
          
              }
          
              // validate/cleanup values
              this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);
              this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);
              this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);
          
              // some getters
              this.toRGB = function () {
                  return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';
              };
              this.toHex = function () {
                  var r = this.r.toString(16);
                  var g = this.g.toString(16);
                  var b = this.b.toString(16);
                  if (r.length === 1) {r = '0' + r;}
                  if (g.length === 1) {g = '0' + g;}
                  if (b.length === 1) {b = '0' + b;}
                  return '#' + r + g + b;
              };
          
              // help
              this.getHelpXML = function () {
                  var i, j;
                  var examples = [];
                  // add regexps
                  for (i = 0; i < color_defs.length; i++) {
                      var example = color_defs[i].example;
                      for (j = 0; j < example.length; j++) {
                          examples[examples.length] = example[j];
                      }
                  }
                  // add type-in colors
                  var sc;
                  for (sc in simple_colors) {
                      if (simple_colors.hasOwnProperty(sc)) {
                          examples[examples.length] = sc;
                      }
                  }
          
                  var xml = document.createElement('ul');
                  xml.setAttribute('id', 'rgbcolor-examples');
                  for (i = 0; i < examples.length; i++) {
                      try {
                          var list_item = document.createElement('li');
                          var list_color = new RGBColor(examples[i]);
                          var example_div = document.createElement('div');
                          example_div.style.cssText =
                                  'margin: 3px; '
                                  + 'border: 1px solid black; '
                                  + 'background:' + list_color.toHex() + '; '
                                  + 'color:' + list_color.toHex()
                          ;
                          example_div.appendChild(document.createTextNode('test'));
                          var list_item_value = document.createTextNode(
                              ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()
                          );
                          list_item.appendChild(example_div);
                          list_item.appendChild(list_item_value);
                          xml.appendChild(list_item);
          
                      } catch(e){}
                  }
                  return xml;
          
              };
          
          }
          
      • contextmenu
        • jquery.contextMenu.js
          // jQuery Context Menu Plugin
          //
          // Version 1.01
          //
          // Cory S.N. LaViska
          // A Beautiful Site (http://abeautifulsite.net/)
          // Modified by Alexis Deveria
          //
          // More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
          //
          // Terms of Use
          //
          // This plugin is dual-licensed under the GNU General Public License
          //   and the MIT License and is copyright A Beautiful Site, LLC.
          //
          if(jQuery)( function() {
          	var win = $(window);
          	var doc = $(document);
          
          	$.extend($.fn, {
          		
          		contextMenu: function(o, callback) {
          			// Defaults
          			if( o.menu == undefined ) return false;
          			if( o.inSpeed == undefined ) o.inSpeed = 150;
          			if( o.outSpeed == undefined ) o.outSpeed = 75;
          			// 0 needs to be -1 for expected results (no fade)
          			if( o.inSpeed == 0 ) o.inSpeed = -1;
          			if( o.outSpeed == 0 ) o.outSpeed = -1;
          			// Loop each context menu
          			$(this).each( function() {
          				var el = $(this);
          				var offset = $(el).offset();
          			
          				var menu = $('#' + o.menu);
          
          				// Add contextMenu class
          				menu.addClass('contextMenu');
          				// Simulate a true right click
          				$(this).bind( "mousedown", function(e) {
          					var evt = e;
          					$(this).mouseup( function(e) {
          						var srcElement = $(this);
          						srcElement.unbind('mouseup');
          						if( evt.button === 2 || o.allowLeft || (evt.ctrlKey && svgedit.browser.isMac()) ) {
          							e.stopPropagation();
          							// Hide context menus that may be showing
          							$(".contextMenu").hide();
          							// Get this context menu
          						
          							if( el.hasClass('disabled') ) return false;
          							
          							// Detect mouse position
          							var d = {}, x = e.pageX, y = e.pageY;
          							
          							var x_off = win.width() - menu.width(), 
          								y_off = win.height() - menu.height();
          
          							if(x > x_off - 15) x = x_off-15;
          							if(y > y_off - 30) y = y_off-30; // 30 is needed to prevent scrollbars in FF
          							
          							// Show the menu
          							doc.unbind('click');
          							menu.css({ top: y, left: x }).fadeIn(o.inSpeed);
          							// Hover events
          							menu.find('A').mouseover( function() {
          								menu.find('LI.hover').removeClass('hover');
          								$(this).parent().addClass('hover');
          							}).mouseout( function() {
          								menu.find('LI.hover').removeClass('hover');
          							});
          							
          							// Keyboard
          							doc.keypress( function(e) {
          								switch( e.keyCode ) {
          									case 38: // up
          										if( !menu.find('LI.hover').length ) {
          											menu.find('LI:last').addClass('hover');
          										} else {
          											menu.find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');
          											if( !menu.find('LI.hover').length ) menu.find('LI:last').addClass('hover');
          										}
          									break;
          									case 40: // down
          										if( menu.find('LI.hover').length == 0 ) {
          											menu.find('LI:first').addClass('hover');
          										} else {
          											menu.find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');
          											if( !menu.find('LI.hover').length ) menu.find('LI:first').addClass('hover');
          										}
          									break;
          									case 13: // enter
          										menu.find('LI.hover A').trigger('click');
          									break;
          									case 27: // esc
          										doc.trigger('click');
          									break
          								}
          							});
          							
          							// When items are selected
          							menu.find('A').unbind('mouseup');
          							menu.find('LI:not(.disabled) A').mouseup( function() {
          								doc.unbind('click').unbind('keypress');
          								$(".contextMenu").hide();
          								// Callback
          								if( callback ) callback( $(this).attr('href').substr(1), $(srcElement), {x: x - offset.left, y: y - offset.top, docX: x, docY: y} );
          								return false;
          							});
          							
          							// Hide bindings
          							setTimeout( function() { // Delay for Mozilla
          								doc.click( function() {
          									doc.unbind('click').unbind('keypress');
          									menu.fadeOut(o.outSpeed);
          									return false;
          								});
          							}, 0);
          						}
          					});
          				});
          				
          				// Disable text selection
          				if( $.browser.mozilla ) {
          					$('#' + o.menu).each( function() { $(this).css({ 'MozUserSelect' : 'none' }); });
          				} else if( $.browser.msie ) {
          					$('#' + o.menu).each( function() { $(this).bind('selectstart.disableTextSelect', function() { return false; }); });
          				} else {
          					$('#' + o.menu).each(function() { $(this).bind('mousedown.disableTextSelect', function() { return false; }); });
          				}
          				// Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
          				$(el).add($('UL.contextMenu')).bind('contextmenu', function() { return false; });
          				
          			});
          			return $(this);
          		},
          		
          		// Disable context menu items on the fly
          		disableContextMenuItems: function(o) {
          			if( o == undefined ) {
          				// Disable all
          				$(this).find('LI').addClass('disabled');
          				return( $(this) );
          			}
          			$(this).each( function() {
          				if( o != undefined ) {
          					var d = o.split(',');
          					for( var i = 0; i < d.length; i++ ) {
          						$(this).find('A[href="' + d[i] + '"]').parent().addClass('disabled');
          						
          					}
          				}
          			});
          			return( $(this) );
          		},
          		
          		// Enable context menu items on the fly
          		enableContextMenuItems: function(o) {
          			if( o == undefined ) {
          				// Enable all
          				$(this).find('LI.disabled').removeClass('disabled');
          				return( $(this) );
          			}
          			$(this).each( function() {
          				if( o != undefined ) {
          					var d = o.split(',');
          					for( var i = 0; i < d.length; i++ ) {
          						$(this).find('A[href="' + d[i] + '"]').parent().removeClass('disabled');
          						
          					}
          				}
          			});
          			return( $(this) );
          		},
          		
          		// Disable context menu(s)
          		disableContextMenu: function() {
          			$(this).each( function() {
          				$(this).addClass('disabled');
          			});
          			return( $(this) );
          		},
          		
          		// Enable context menu(s)
          		enableContextMenu: function() {
          			$(this).each( function() {
          				$(this).removeClass('disabled');
          			});
          			return( $(this) );
          		},
          		
          		// Destroy context menu(s)
          		destroyContextMenu: function() {
          			// Destroy specified context menus
          			$(this).each( function() {
          				// Disable action
          				$(this).unbind('mousedown').unbind('mouseup');
          			});
          			return( $(this) );
          		}
          		
          	});
          })(jQuery);
      • extensions
        • imagelib
          • index.html
            <!DOCTYPE html>
            <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
            <meta charset="utf-8" />
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
            </head>
            <body>
            
            <h1>Select an image:</h1>
            <a href="smiley.svg">smiley.svg</a>
            <br>
            <a href="../../images/logo.png">logo.png</a>
            
            <script>
            /*globals $*/
            /*jslint vars: true*/
            $('a').click(function() {'use strict';
            	var meta_str;
            	var href = this.href;
            	var target = window.parent;
            	// Convert Non-SVG images to data URL first 
            	// (this could also have been done server-side by the library)
            	if (this.href.indexOf('.svg') === -1) {
            
            		meta_str = JSON.stringify({
            			name: $(this).text(),
            			id: href
            		});
            		target.postMessage(meta_str, '*');
            
            		var img = new Image();
            		img.onload = function() {
            			var canvas = document.createElement('canvas');
            			canvas.width = this.width;
            			canvas.height = this.height;
            			// load the raster image into the canvas
            			canvas.getContext('2d').drawImage(this, 0, 0);
            			// retrieve the data: URL
            			var dataurl;
            			try {
            				dataurl = canvas.toDataURL();
            			} catch(err) {
            				// This fails in Firefox with file:// URLs :(
            				alert("Data URL conversion failed: " + err);
            				dataurl = "";
            			}
            			target.postMessage('|' + href + '|' + dataurl, '*');
            		};
            		img.src = href;
            	} else {
            		// Send metadata (also indicates file is about to be sent)
            		meta_str = JSON.stringify({
            			name: $(this).text(),
            			id: href
            		});
            		target.postMessage(meta_str, '*');
            		// Do ajax request for image's href value
            		$.get(href, function(data) {
            			data = '|' + href + '|' + data;
            			// This is where the magic happens!
            			target.postMessage(data, '*');
            			
            		}, 'html'); // 'html' is necessary to keep returned data as a string
            	}
            	return false;
            });
            
            </script>
            </body>
            </html>
            
          • smiley.svg
            <svg width="137" height="137" xmlns="http://www.w3.org/2000/svg">
             <title>Cool smiley</title>
              <path fill="url(#svg_4)" stroke="#000000" stroke-width="3" d="m32.18682,97.71674q36.3159,24.94076 72.54585,0m-64.67542,-49.25576c0,-3.8554 3.12526,-6.98079 6.98068,-6.98079c3.85449,0 6.97872,3.12539 6.97872,6.98079c0,3.85346 -3.12423,6.97867 -6.97872,6.97867c-3.85542,0 -6.98068,-3.12521 -6.98068,-6.97867m42.93047,0c0,-3.8554 3.12529,-6.98079 6.97963,-6.98079c3.8544,0 6.97971,3.12539 6.97971,6.98079c0,3.85346 -3.12531,6.97867 -6.97971,6.97867c-3.85434,0 -6.97963,-3.12521 -6.97963,-6.97867m-81.48596,20.036l0,0c0,-37.00197 29.99679,-66.99892 67.00095,-66.99892c37.00303,0 66.99998,29.99695 66.99998,66.99892c0,37.00409 -29.99695,67.00101 -66.99998,67.00101c-37.00416,0 -67.00095,-29.99692 -67.00095,-67.00101zm0,0l0,0c0,-37.00197 29.99679,-66.99892 67.00095,-66.99892c37.00303,0 66.99998,29.99695 66.99998,66.99892c0,37.00409 -29.99695,67.00101 -66.99998,67.00101c-37.00416,0 -67.00095,-29.99692 -67.00095,-67.00101z" id="svg_1"/>
              <path id="svg_5" d="m23.84005,41.03445l17.57052,0l5.42937,-19.67914l5.42941,19.67914l17.5706,0l-14.21488,12.16242l5.42982,19.67939l-14.21495,-12.16281l-14.21489,12.16281l5.42991,-19.67939l-14.21491,-12.16242l0,0z" stroke-width="3" fill="#000000"/>
              <path id="svg_6" d="m65.84005,41.03445l17.57052,0l5.42937,-19.67914l5.42941,19.67914l17.5706,0l-14.21487,12.16242l5.42982,19.67939l-14.21496,-12.1628l-14.2149,12.1628l5.42992,-19.67939l-14.21491,-12.16242l0,0z" stroke-width="3" fill="#000000"/>
             <defs>
              <linearGradient y2="0.25391" x2="0.46484" y1="0.94922" x1="0.44531" id="svg_4">
               <stop stop-color="#ff0000" offset="0"/>
               <stop stop-color="#ffff00" offset="1"/>
              </linearGradient>
             </defs>
            </svg>
        • shapelib
          • animal.json
            {"data": {
            	"bat": "m143.40468,206.20782c-0.49527,-8.51843 -1.60919,-23.17813 -13.91826,-16.10698c-5.69614,2.11977 -22.79842,7.51244 -14.5293,-3.62979c-4.53243,-11.10219 -22.97476,5.42294 -24.24419,-2.29205c9.91943,-10.64906 -4.7813,-22.35199 -15.17139,-14.80321c-6.39341,1.76166 -19.4276,12.91188 -21.9789,9.37552c5.93793,-7.52516 19.31312,-22.93167 3.18112,-27.55084c-17.5302,-3.97589 -32.93319,8.09392 -48.1771,14.68205c-4.57452,3.57106 -10.39707,2.94862 -4.70683,-2.99597c19.7419,-30.64111 50.72646,-53.70857 85.10566,-65.43076c8.33369,-2.70812 21.16511,-8.70424 21.41656,4.97536c5.15313,12.59007 8.81947,28.33097 22.08977,34.80917c15.28362,8.49702 4.32793,-24.52711 20.16156,-12.05241c6.66379,4.32207 20.92268,-3.91697 22.87737,0.71265c-3.88257,5.55579 -5.70456,15.41883 4.55382,10.3489c17.81406,-7.0078 30.89859,-22.70471 39.67026,-39.22318c9.16278,-1.3768 18.27335,5.56162 26.62798,9.24753c27.74529,15.70954 44.86571,45.39448 52.13728,75.65768c-7.5513,-4.24557 -14.87186,-12.828 -24.02185,-16.20273c-9.75534,-4.87419 -20.75789,-5.73363 -31.48114,-5.39867c-5.02554,5.98985 -7.99353,13.42558 -3.62529,20.86708c3.80284,14.25407 -12.13176,-4.90576 -17.88498,-6.20744c-10.74191,-7.67955 -21.03323,3.92213 -18.67635,14.82222c-2.42909,2.10051 -9.92085,-3.5218 -14.32263,-2.86926c-9.05026,-2.72606 -15.42468,1.20085 -9.97261,10.61331c-7.98315,-0.97417 -19.64474,-13.28291 -26.70493,-1.69363c-3.0779,2.89514 -4.66377,8.66307 -8.40561,10.34547z",
            	"bull": "m247.95622,28.12305c-12.19972,2.23394 -21.61887,16.95667 -20.74588,29.01591c1.44209,13.7284 17.93463,5.12075 22.80087,1.23941c-2.90906,11.49207 -26.14024,13.85409 -24.83565,-0.12387c-17.69467,13.05878 -30.95056,33.52913 -52.86781,40.14553c-19.77757,4.59067 -40.50726,3.0742 -60.45068,0.39017c-12.12445,-1.13604 -23.69794,-7.26224 -35.91985,-5.97962c-13.09134,3.59118 -23.59412,13.16467 -36.65408,16.93906c-13.77014,6.03062 -8.51065,22.6805 -9.70401,34.47604c0.36829,17.55977 -2.85913,36.16287 -15.09811,49.55722c-7.11563,10.54993 -7.76443,24.43282 -13.48046,35.44298c18.99679,-0.19772 7.54522,-25.59486 17.99728,-35.91756c14.58305,-6.75189 14.16003,-25.2986 16.19452,-38.95529c1.4834,-5.51941 0.74519,-25.08188 6.61763,-22.44334c7.21924,16.22275 11.33028,34.35388 9.69645,52.12326c-9.5553,8.96404 -24.74576,15.34862 -22.54872,31.87126c0.72458,14.96526 -8.38036,25.74033 -15.4907,37.48604c4.56749,6.89259 1.00608,20.69472 14.11573,16.65324c8.77115,1.68887 13.10825,-2.37698 4.45589,-8.42346c-13.07829,-12.56499 5.13552,-29.16821 12.20585,-40.168c7.30689,-12.28131 22.16195,-12.86801 33.02653,-20.13979c15.00671,-8.95824 25.97935,-22.79263 35.92999,-36.78595c8.71432,9.26259 -13.75776,17.74474 -17.07076,27.20334c-7.22755,7.75058 -20.15694,21.85651 -2.99889,26.65347c13.26358,4.53796 25.75887,13.79143 25.35975,28.30255c0.22051,9.84615 24.38135,18.76527 19.43611,2.77341c-8.3609,-14.92882 -28.34064,-20.79163 -33.65835,-37.70844c-3.6715,-12.98383 11.61318,-19.27325 18.93525,-8.74269c12.96419,-1.41862 26.57983,-10.04028 40.80356,-11.3647c14.66299,-5.4577 18.06927,14.52957 29.8145,19.76668c9.79047,9.67969 18.77974,21.93582 17.54285,36.4783c1.1926,12.30893 9.52699,25.16873 23.92239,23.90201c16.80026,-2.80963 -5.10118,-20.70317 -12.79568,-24.81631c-11.14896,-13.29695 -9.30676,-32.20113 -16.24597,-47.51259c-5.00217,-4.52083 0.22685,-26.45532 0.40694,-10.76334c-0.90044,17.98242 24.73294,7.66248 22.97939,-6.09152c4.36166,-10.95654 -11.58513,-4.19417 -9.47617,-15.24252c-1.73091,-13.74937 -0.74355,-30.75096 -12.6731,-40.17292c-6.8737,-6.7591 -4.7831,-7.41829 2.70201,-2.07212c14.59439,7.55807 11.75914,24.79303 12.78276,38.37691c4.22589,17.80225 21.30753,-5.24332 20.80711,-14.89757c2.92691,-20.96336 12.92174,-42.46973 32.42046,-52.68139c-5.2402,-2.56694 -30.94765,6.73531 -28.79092,-4.9679c10.59921,9.00244 25.18661,-0.80075 37.71524,1.85265c16.62164,0.68233 20.74963,-22.79317 2.53195,-23.94116c-11.78333,-6.98062 -21.92947,-19.31897 -37.15829,-18.35906c-22.07759,7.39931 -8.43927,-13.11165 -2.53694,-22.37832zm21.60802,9.50184c-1.66193,5.79599 -12.61478,17.62506 0.56973,12.83867c1.89221,-3.91013 1.1131,-8.97168 -0.56973,-12.83867zm-3.4996,26.34877c5.90985,9.81916 -11.80539,1.02993 0,0zm24.39551,10.15293c-2.05029,4.18517 5.51468,4.9676 -0.32553,4.96455c-3.08926,4.10121 -4.4324,-5.29953 0.32553,-4.96455z",
            	"camel": "m105.23692,274.01276c10.42601,-6.85904 -13.23158,-12.66162 -16.74452,-19.13904c-10.34003,-12.71768 -13.56136,-29.62202 -16.44211,-45.3219c4.95107,-8.43617 2.94567,-17.1517 4.73958,-25.91959c8.77055,-13.01825 13.62244,-28.29056 22.43666,-41.26205c9.81532,2.07159 20.42883,10.03517 30.26162,13.06094c8.8764,15.9576 -7.35719,29.2457 -5.44854,44.69498c3.72314,14.40366 -6.25101,26.40735 -8.25558,39.83173c0.06986,12.69931 11.61848,25.55493 24.23922,16.82416c-0.64038,-9.26088 -18.64324,-12.13185 -10.58395,-25.1562c2.65187,-13.46596 11.34413,-24.24693 17.91676,-35.55937c-3.71349,-13.26427 1.2287,-30.0778 9.59569,-40.02118c8.49532,8.2068 14.36288,22.63718 15.66277,34.12883c0.16464,13.17332 17.70532,21.98904 17.37173,37.50392c1.31061,13.71669 7.73416,26.77841 16.64259,34.21387c4.65822,9.68192 33.56361,4.63116 18.16859,-6.87111c-12.71291,-11.47281 -27.33986,-23.63953 -29.27029,-41.92267c-5.27388,-10.85303 6.84843,-26.2316 -8.03899,-30.76501c0.92262,-14.70679 -2.97293,-31.40077 5.40811,-44.51862c12.07202,-10.31686 29.7518,-11.08165 41.29709,-22.49498c14.0099,-9.28757 21.96306,-24.50421 26.44456,-40.2729c6.78918,-7.60537 17.33322,-24.04447 29.06323,-15.49826c11.50851,7.1165 3.01477,-10.78561 9.62354,-14.73589c-5.45358,-19.67866 -27.58679,-10.231 -41.40082,-15.14074c-12.54193,-8.39989 -25.52765,-3.55679 -34.67496,6.0378c-6.85069,3.08698 -3.14447,11.16754 3.57637,8.12783c-4.82072,16.0155 -11.46542,33.6401 -26.07742,43.1243c-16.7653,7.33572 -26.11705,-14.39821 -36.07204,-23.83146c-10.86565,-10.63506 -17.60231,-26.15123 -31.2878,-33.45204c-19.0355,-4.82 -33.49794,11.89507 -47.87449,21.30644c-14.26775,7.14342 -31.39994,10.67369 -41.13367,24.60683c-16.15372,19.41527 -5.91326,48.70807 -22.89915,67.80049c-6.99636,10.58755 -22.39972,18.21231 -20.28306,32.7636c7.50211,15.58318 0.92728,34.18239 5.02367,50.94881c3.02735,12.11708 7.50982,27.68176 22.18437,29.48123c11.54434,7.31882 17.83198,-8.01192 5.60827,-12.45197c-14.75563,-6.55614 -16.77197,-25.01053 -17.95741,-39.18628c-3.25454,-14.0275 7.86033,-23.30806 12.45064,-34.31837c-3.87635,-10.75487 9.79252,-25.37375 18.46243,-23.19664c-6.47958,9.9541 -15.94005,22.87103 -0.60315,31.06966c-0.20134,0.50305 2.25023,-9.18846 6.19941,-12.10042c-0.58951,-7.59273 -8.29086,-14.05685 -0.12206,-21.73929c14.33151,-9.55606 11.17263,18.16365 8.19696,26.02383c-0.15744,12.07039 -16.33567,21.65707 -8.0749,33.75336c9.04985,14.91904 13.29631,32.04613 16.76897,48.94904c4.98299,14.02148 17.57185,24.27618 33.31381,20.65268l2.58825,-0.02829z",
            	"cat": "m111.55353,268.57376c-12.38409,-9.66019 -26.54234,-3.66064 -40.17431,-4.38614c-11.9392,-10.23105 -26.45395,2.16507 -37.70551,-7.68756c-14.55057,-12.97847 10.67308,-21.10451 5.29292,-36.51207c-0.60409,-22.18257 -10.10326,-42.27484 -20.08909,-60.91698c-7.07184,-14.82233 -4.56518,-31.85568 -6.84103,-47.71686c-8.17014,-11.38815 -16.33076,-25.48726 -6.60928,-39.55753c10.981,-11.86565 5.81937,-27.47561 1.50418,-41.19728c11.10318,3.26597 23.84772,18.14071 38.4552,15.16287c9.93419,-6.39761 15.9648,-0.073 17.62218,11.6365c5.20781,15.03792 8.24681,35.60265 24.68163,40.4529c17.26196,4.92876 36.58965,6.02341 50.24171,20.484c24.96439,23.38795 36.53986,60.25828 35.56061,95.79604c2.26117,16.61917 23.11539,7.79897 33.43477,10.24997c17.3054,-0.76804 33.91818,4.66769 50.66774,8.39909c14.94962,3.97684 27.61282,-8.59756 41.65988,-10.10515c2.37341,14.53128 -16.06888,20.58582 -26.14133,25.0639c-11.95706,5.08662 -24.89989,5.20694 -37.1826,1.47655c-26.55344,-6.62021 -54.69701,-4.88251 -79.92953,6.75992c-13.61838,5.01505 -26.84254,14.51093 -41.6569,13.32327l-2.79124,-0.72549l0,0.00003z",
            	"chick": "m76.6114,300.49948c-0.94218,-11.68399 1.80264,-23.81186 -2.78349,-35.22473c-7.45612,-25.10127 -23.93798,-47.16536 -31.36633,-72.21014c-3.21228,-16.80365 -8.65163,-34.79272 -2.2363,-51.43718c9.2771,-20.44891 24.58445,-39.1077 45.00853,-51.46853c11.45798,-6.87112 33.39433,1.8131 33.44485,-16.51133c3.62297,-20.89642 15.43811,-40.3082 30.48538,-56.28489c17.86485,-17.49571 47.98021,-20.77926 71.28149,-10.72216c13.19823,4.36545 26.92773,11.92505 29.85556,25.342c-2.0408,13.23198 13.36339,22.40786 12.41484,34.53756c-13.98409,-0.03379 -27.4267,2.25514 -39.10866,9.99602c-8.20006,3.8867 -26.4511,6.08187 -12.88864,15.86904c12.71146,21.22634 12.39029,48.02362 0.02443,69.35255c-8.24092,16.61523 -18.78058,33.14909 -36.37866,43.00504c-13.36313,9.14961 -27.77914,16.93257 -42.68192,23.79149c-11.62872,11.1774 5.32764,27.26614 9.71201,38.8335c3.36447,3.54044 4.524,10.84882 11.15869,9.08932c15.28535,0.25418 32.76015,-1.9313 44.98404,7.81229c-8.94319,8.25949 -25.89421,-1.41025 -38.02573,4.80051c-8.78024,5.75812 -19.06332,7.43823 -31.36371,7.58014c-13.23612,4.30203 -27.23189,-3.61423 -39.08569,1.66962c-4.11388,0.41238 -8.38321,3.40195 -12.45068,2.1799zm58.28394,-16.2124c-4.84233,-9.87674 -20.53861,1.56897 -6.10292,2.32874c2.30783,-0.47092 12.8125,3.03821 6.10292,-2.32874zm-17.85122,-4.32443c14.82944,-9.3367 7.74453,-25.48042 -1.79045,-35.63309c-3.24258,-2.97528 -4.73457,-8.94336 -9.13439,-9.94019c-6.73362,0 -13.46722,0 -20.20084,0c-4.65086,8.49229 -2.48404,17.86589 0.89217,26.43201c3.51066,10.88467 6.16319,28.60654 23.56189,23.00385c2.6806,-0.4599 4.89924,-2.07458 6.67162,-3.86258z",
            	"cormorant": "m143.5415,0.99936c-4.24326,11.41716 -19.29625,4.15632 -24.74561,12.50427c0.52748,6.07653 -8.29025,7.80436 -13.00653,8.43892c-8.50133,3.84879 -22.80692,-4.79845 -26.45377,4.01417c10.96676,1.70561 23.50823,0.97173 33.37776,7.63992c6.81084,8.30698 18.80501,9.32233 23.86815,19.00227c5.01492,11.90637 0.21405,24.79235 -6.1066,35.16777c-5.40714,11.63457 -14.24293,22.0266 -17.15868,34.6068c0.20795,13.02319 4.72718,25.69211 3.20084,38.80902c0.9605,10.14279 6.64024,19.14648 10.04536,28.64983c5.00912,10.57565 9.93535,21.70013 17.62276,30.53665c7.02892,8.87558 29.89705,11.67009 23.64502,24.91443c-4.01926,11.10844 -7.40147,24.48637 -19.39478,29.5565c-9.50977,5.9848 -21.3932,8.93677 -29.06369,17.37073c3.84956,0.36453 28.16327,-14.36331 23.8996,1.69739c-9.52658,11.2518 16.95053,-0.69223 23.42963,-2.18207c4.74442,-0.99915 4.29691,14.62488 8.52766,3.80228c5.95903,-10.08762 6.23502,-21.34366 11.26126,-30.51312c2.4781,-10.25645 3.82962,7.94009 9.64467,10.12222c7.07556,9.50238 7.79694,-14.07236 11.23129,-19.70615c2.62747,-8.54028 4.63826,-23.31885 8.02322,-27.91885c0.19868,-2.83281 6.58795,3.93147 5.0274,-3.78851c0.90347,-23.48584 -1.83659,-48.86755 -15.67365,-68.59196c-9.60602,-8.62669 -13.22336,-21.57266 -21.36568,-31.47811c-10.01912,-4.8186 -8.05391,-19.66993 -20.19205,-21.12443c-2.75856,-10.2361 2.62035,-22.86311 4.63016,-33.73514c2.78795,-10.12834 8.4742,-20.66132 3.52232,-31.15684c-3.76698,-10.86702 -11.83783,-21.03737 -23.57631,-23.51091c-5.21049,-2.63619 -9.89668,-4.17218 -2.89241,-7.84742c4.71588,-7.73713 -7.28709,7.39913 -1.58588,-2.982l0.25854,-2.29765l-0.00003,0zm-57.08003,24.11987c12.78673,0.33177 -8.83535,0.35227 0,0zm92.46721,218.72338c11.05893,4.6954 0.80228,21.55537 -5.46918,26.98338c-13.1071,-3.20859 2.39713,-19.21964 5.46918,-26.98338l0,0zm-10.64413,31.82323c-5.88483,2.41168 -15.44353,4.13849 -3.83093,0.46683l1.97208,-0.34274l1.85886,-0.12408z",
            	"cow": "m28.0749,243.56958c-11.25466,-1.13762 -0.26117,-18.72878 -4.5063,-26.87576c-0.04291,-11.99254 -4.49496,-23.80263 -3.04635,-35.73141c8.85702,-21.03091 1.47632,-43.99974 -0.46577,-65.6628c-0.878,-4.78294 -0.85219,-17.06834 -3.03475,-6.14601c-6.04425,18.41563 -0.13999,41.17824 -5.30961,59.82921c-8.64015,10.38419 -15.16653,-6.09071 -6.91858,-12.40807c9.63606,-15.16887 7.3071,-35.6004 7.63113,-54.51396c-0.41477,-11.95865 4.38277,-26.97649 18.58104,-27.31744c12.14677,-0.91866 23.64877,4.86966 35.90276,4.15359c35.73927,0.55689 71.83095,0.86755 107.11801,-5.64501c17.61354,-4.0591 35.14902,3.10693 52.79015,0.20057c9.91351,1.07068 15.15811,-3.56471 10.78886,-12.26689c7.38425,-5.09429 13.06598,9.66071 16.34573,-3.48148c11.89191,-8.19559 13.54935,15.99933 26.71921,9.16614c15.88589,2.05862 -6.90274,16.26875 6.39813,23.38159c8.04169,6.20473 20.35629,21.57409 4.35831,26.00379c-13.75446,-0.96602 -27.54028,-0.06377 -41.30312,0.60226c-6.36993,10.6367 -19.62016,18.61491 -18.16837,32.55296c-1.1003,16.62756 -12.74783,33.02081 -28.69196,38.18489c-6.81386,-1.34894 -9.78644,0.85432 -8.9351,7.83342c-3.52046,9.11967 -4.14098,18.73875 -3.72333,28.43974c-1.04204,5.34808 1.17265,9.50755 4.32187,13.62691c-3.70361,6.41692 -24.92326,2.61598 -16.88379,-9.5238c2.05592,-15.92261 -0.36317,-31.91132 -2.16568,-47.74242c-8.4565,-6.01532 -18.70856,-3.81294 -27.26753,1.0208c-18.88187,6.9252 -40.73763,13.48228 -60.10471,4.59438c-10.79734,-3.01547 -27.0833,-5.25847 -35.10848,3.84904c-3.611,13.73518 -2.64567,28.48619 -5.7238,42.42607c-0.05178,7.28806 6.88112,13.54532 -4.86428,11.51134c-4.90851,0.11278 -9.83028,0.26732 -14.73372,-0.06165zm10.02217,-15.5108c1.93175,-6.52728 -2.78621,-23.11049 -3.1906,-7.64299c-1.60691,4.90746 0.4367,28.47777 2.83738,12.83046c0.15187,-1.72662 0.25968,-3.45683 0.35322,-5.18747z",
            	"crow_2": "m299.86716,62.24508c-8.36279,-13.35279 -25.79254,-10.94299 -38.7652,-13.97612c-10.77151,-4.46517 -27.26852,-8.74568 -34.93257,4.02601c-10.22766,11.92024 -19.30536,24.77381 -27.38379,38.20519c-16.9417,18.56395 -37.51366,33.44937 -58.19264,47.49408c-17.41919,8.55826 -36.48907,15.23247 -50.59015,29.17691c-26.77713,17.17799 -59.39612,20.30975 -89.00278,30.37996c5.24787,1.82477 28.48156,-4.80739 12.86404,2.45506c-11.61908,3.82678 4.57293,7.38318 9.74338,4.83008c-4.08242,4.36552 -5.2054,4.72249 -0.18473,4.65681c-9.12115,5.09712 20.25491,-1.58305 4.07883,5.5506c-7.04263,2.05971 -24.35976,21.06046 -8.48079,12.5005c14.76321,-6.14401 30.50038,-9.23448 45.85791,-13.45705c-11.48634,11.80891 -27.85513,19.19374 -35.74965,34.16698c0.17943,3.86479 12.21982,-7.85281 17.31087,-9.77229c28.95095,-17.49719 59.28473,-33.71347 91.89844,-43.16046c4.45381,1.07288 5.32478,12.99994 14.00563,6.90237c0.76199,7.59987 19.82927,-11.92125 14.84979,3.30377c8.25793,-13.03635 -0.01482,14.1528 7.62892,18.26904c3.90089,5.15268 19.92041,12.26512 6.86195,14.03082c-5.77165,8.63597 8.09146,-3.46425 11.11865,4.62627c11.3129,4.10901 3.07231,8.32173 -5.11652,5.83363c-6.27592,-0.83809 -7.57079,7.40965 -1.22719,2.29182c7.57507,5.19347 19.60568,3.32813 29.26515,5.56088c9.65308,0.80066 21.35422,-9.88435 25.01279,-7.29437c-8.89755,-6.38512 -21.77765,1.41119 -31.54323,-3.51736c-2.05963,-6.62599 22.89082,2.37143 22.94131,-8.82851c11.68727,-1.08766 -9.82895,-2.59717 -14.00406,0.04509c-14.38026,0.76889 -21.75813,-12.59969 -31.88164,-20.19017c0.30659,-15.75429 11.86186,-29.28856 23.95569,-38.18524c15.77855,-9.50124 31.96706,-21.73888 36.43575,-40.70174c4.63271,-16.88809 7.21239,-34.29048 9.31848,-51.60873c2.84918,-11.17406 11.03882,-21.49306 23.60089,-20.65947c6.77469,-0.94415 13.57404,-1.72816 20.30646,-2.95438z",
            	"crow": "m65.63132,15.69366c7.23991,-11.19251 23.71874,-13.17996 36.20271,-14.69413c13.92134,1.25098 24.65079,12.10254 32.81262,22.59631c9.49452,8.5772 21.08662,15.85565 25.83853,28.41352c12.01437,5.95259 26.19815,9.13653 33.55229,21.87244c11.11548,14.36729 17.52112,31.75739 23.31628,48.60368c0.92021,12.5585 6.47,24.01521 8.36046,36.46043c3.24197,12.33818 5.82637,24.53572 9.31963,36.76498c3.88237,12.71416 9.39792,24.81319 13.2628,37.54517c7.05891,11.17328 13.48564,22.96204 17.86821,35.4054c-10.48648,-0.88873 0.96857,15.8573 2.93524,22.45895c2.86746,13.58783 -12.84537,5.80856 -15.59308,-0.46634c-9.70456,9.1796 -29.57259,11.24072 -38.3669,-0.80743c-9.26392,-12.20752 -14.38051,-27.69696 -27.16855,-36.53391c-5.02811,-4.18506 -9.90665,-22.45958 -11.7061,-6.32031c6.38489,16.05743 -18.74254,6.90547 -27.66772,9.78912c-15.99664,-3.21661 6.07263,-12.35889 12.86923,-11.27576c6.38602,-6.35408 17.01372,-16.99594 1.7589,-20.33147c-10.44731,-4.15326 -23.84068,-14.68553 -29.71439,0.99188c-7.37552,3.90117 -20.59412,22.40862 -5.95329,23.77255c5.91614,12.10878 -17.0737,3.35048 -23.49316,6.21452c-6.05255,1.90814 -21.13758,-1.4375 -7.08788,-4.49867c12.08796,-1.9845 17.85132,-16.8317 25.44044,-25.82515c-0.25166,-11.53856 -9.48829,-20.69617 -16.41167,-29.40816c-7.36517,-12.27962 -17.64172,-22.79747 -22.75925,-36.23717c-3.35689,-13.95544 -9.74807,-26.85826 -12.98938,-40.84583c-3.65936,-14.01762 -7.85575,-29.82359 0.01893,-43.25633c3.58914,-11.78534 5.08364,-22.78083 -2.44828,-32.4814c-10.40722,-8.4583 -25.19866,-5.06594 -37.19873,-10.67507c-1.4463,-9.05923 17.76661,-12.5158 26.11695,-14.53937c3.17027,-0.11009 5.59681,-2.76167 8.88516,-2.69248z",
            	"dog": "m100.16203,296.98279c-8.8212,-9.63385 1.38332,-24.43997 -0.42293,-36.27057c0.75693,-11.26283 0.70357,-22.55605 0.97627,-33.83612c-5.62751,-3.03004 -11.14646,-9.8163 -17.39571,-9.15442c-9.39647,12.28885 -8.36188,28.63301 -15.80033,41.86707c-4.14935,12.68604 -14.20047,25.1369 -28.95629,23.20023c-15.78228,0.24448 -5.31179,-12.67972 3.94138,-14.51392c15.5036,-7.47278 14.489,-27.14363 17.24157,-41.59114c1.02824,-10.18478 3.24236,-20.5625 3.54647,-30.63432c-6.4542,-14.31418 -15.78849,-28.37114 -13.67442,-44.85196c-0.91037,-17.78856 4.2768,-37.23788 -5.08019,-53.53189c-5.56927,-15.61405 3.8713,-31.59072 2.9399,-47.52759c0.9721,-14.78285 -5.20505,-30.54867 1.20562,-44.61136c13.7762,-15.53139 12.97964,13.29988 18.95111,20.54415c5.64886,15.40877 24.7487,10.76537 35.50636,4.24826c7.2022,-4.10769 16.87807,-28.32801 24.44378,-14.32351c3.37997,14.22579 -6.14093,25.38077 -12.22646,36.88495c-6.86581,22.01683 5.86861,44.08519 20.93388,59.44197c24.83763,26.97977 44.07555,59.68134 54.0882,95.03609c1.31316,14.68071 3.98535,28.23558 12.82726,40.18617c10.20438,10.1714 26.16472,9.68739 39.32852,13.25957c9.22101,2.52521 30.75206,5.14639 26.47435,17.3808c-14.74448,2.4689 -30.09541,0.23105 -44.90068,-1.32291c-17.28331,-2.73001 -35.00906,-7.2897 -49.09666,-18.1597c-14.62904,-9.61427 -18.7715,20.00995 -34.01671,10.65375c-2.19362,-7.70334 10.66454,-19.74266 -6.53938,-19.26297c-6.33104,0.30879 -15.00338,1.82024 -19.76239,4.89166c1.07452,12.16098 2.04812,24.36316 4.2893,36.36713c-1.78267,6.00809 -14.15643,12.93057 -18.82182,5.63058z",
            	"duck": "m185.95239,299.43112c-13.71118,-7.29123 11.45862,-7.3541 17.23322,-7.85522c14.99724,-0.2811 17.02971,-18.28448 15.48773,-29.74414c-2.1938,-4.69699 -0.04752,-14.89349 -7.7746,-13.37029c-15.43901,-0.71622 -30.7112,-4.55923 -44.14467,-12.22302c-0.82443,12.88171 -7.29927,24.66777 -11.6053,36.85115c-5.66316,6.16721 14.39644,28.18469 0.43378,18.34869c-9.04433,-8.40845 0.06526,8.74658 -11.16418,3.91656c-15.23827,-0.31436 -31.02578,2.40784 -45.91216,-1.24551c-5.00268,-2.09833 -20.66561,0.51883 -9.25531,-6.49301c6.4804,-1.18185 12.15667,4.48007 17.05421,-2.03778c11.5948,4.79346 30.04866,4.82639 34.25867,-10.28015c7.00595,-11.43338 11.29851,-24.25136 11.56012,-37.68254c-8.2043,-6.31854 -14.70296,-14.48831 -18.43434,-24.21049c-8.62861,-14.22275 -24.3753,-22.02206 -37.28508,-31.87471c-17.12926,-11.15475 -36.8522,-23.99915 -40.20823,-46.00098c-4.08031,-16.32172 0.02216,-34.19492 11.59384,-46.57394c7.80417,-11.16946 22.31328,-21.55052 18.99293,-36.88489c-8.43674,-15.00933 -26.68094,1.9423 -34.96601,9.23433c-9.98,7.06196 -20.71845,24.17017 -34.34288,16.49594c-1.7172,-11.61691 13.7034,-18.90693 17.498,-29.74388c7.8585,-12.19844 12.51045,-26.37627 18.95516,-38.92993c11.65712,-10.85135 30.93148,-10.91782 42.45155,0.28526c14.7008,11.44654 23.86826,29.5425 22.42876,48.35335c1.4173,12.98959 -4.14301,29.91504 8.25453,38.93287c17.92052,9.9613 39.04935,12.35098 57.26444,21.89838c22.77972,10.51788 39.86913,29.49796 59.04057,45.11781c11.7964,10.71736 23.92368,21.11819 35.13879,32.44618c-7.49713,-2.24278 -14.43054,-6.05879 -21.60767,-9.15805c9.28815,12.08043 13.46152,26.94177 15.66077,41.78857c3.61584,15.73579 13.73315,31.11919 8.65729,47.77711c-4.42633,13.85214 -18.52838,-8.55096 -25.42393,-12.47198c-7.88147,-7.42908 -15.67812,-16.62666 -27.10399,-17.90884c-2.06194,13.35767 -4.18094,27.25305 -1.83514,40.63339c1.37479,11.84998 25.0215,4.73886 21.59566,13.51175c-19.80942,-2.16162 -39.69846,-0.3399 -59.55595,-0.59872l-2.94055,-0.30328l0,0z",
            	"eagle": "m42.43982,248.02586c11.79883,-9.19574 37.51548,5.68584 36.59332,-18.29665c11.6873,-8.23552 20.68873,-26.28419 1.79099,-32.32607c-10.7688,-5.1657 -15.8233,11.42451 -19.57125,12.4706c-7.77777,-10.83765 -3.38924,-28.5033 -0.32791,-39.95343c9.78217,-6.08578 25.82187,-13.03094 14.50231,-26.59097c-2.34529,-14.80103 -3.78094,-32.06657 -17.7612,-41.01302c-10.43393,-6.26692 -25.16679,-12.24148 -20.04643,-26.95332c-6.73619,-10.16047 -14.53631,-24.05076 -10.06464,-36.59579c10.19879,-1.80737 9.00111,23.96806 10.94535,18.5213c-3.83083,-8.28799 9.1568,-27.37077 8.41371,-9.7762c-0.78397,6.31187 -0.27625,19.10084 3.19139,6.43372c9.40052,-13.9652 0.18064,24.20846 9.40782,9.05938c6.50935,-2.10711 4.52592,9.32912 10.80828,3.67456c6.87772,5.25431 11.91442,6.4291 11.89108,15.161c9.16496,3.3132 16.00232,8.79374 14.18665,17.50479c17.88632,-4.31568 2.59483,17.992 15.32488,24.21275c6.86198,10.87837 9.94656,21.77702 9.45206,34.69591c14.12406,-3.90332 23.43909,-19.96727 38.02612,-24.96548c16.37712,-7.58971 22.24484,-26.45808 25.80173,-42.75597c1.58806,-7.86366 11.55658,-7.47865 8.4944,1.35465c11.47125,-12.36288 6.68346,-30.36211 9.92291,-45.39627c1.03862,-8.40902 -2.33224,-26.94658 4.74805,-28.67765c10.56419,9.48252 -2.34641,30.44621 7.95137,36.7387c7.25935,-13.5451 4.68625,-29.74639 5.07938,-44.52987c-0.17744,-8.53332 8.28981,-14.18234 7.88048,-2.00179c3.55096,10.5139 -0.40492,32.21981 1.64958,36.04613c8.07187,-12.48013 6.34647,-29.28694 14.90497,-41.01045c11.77513,4.41697 -3.33727,24.23894 -2.9549,34.73938c1.57841,8.06398 13.11919,-23.61583 13.7003,-6.1498c-5.31714,4.6162 -4.42737,17.32646 1.51364,7.08835c2.29477,-8.40776 17.99155,-5.58858 7.86148,2.08536c-7.52231,6.5335 13.19769,6.07413 4.12683,13.25697c6.05191,9.99521 -10.41388,15.90605 -0.99213,23.11055c-0.5419,2.90166 7.51996,8.55031 3.95645,15.5176c3.55255,6.41606 -12.64786,10.58171 -2.07687,14.97137c0.61145,14.96265 -18.29834,25.28072 -14.15472,39.25008c-1.22144,16.83496 -13.92377,30.96262 -27.51764,39.86047c-12.55846,2.38141 -22.29991,7.42523 -33.09448,14.38452c-7.10794,0.12218 -9.63133,0.08891 -13.34837,5.21904c-5.85042,-4.53848 -15.49744,-11.39697 -13.84404,2.34781c2.50378,17.06932 24.15945,18.76619 35.67772,27.84688c12.28496,4.33621 28.35258,18.74889 15.04837,30.03174c-1.28722,16.03848 -22.62962,6.43207 -28.17253,11.98065c-7.95277,1.1889 -7.12421,6.80249 -14.18958,0.10867c-6.88124,9.22229 -22.27397,-0.76007 -29.61287,-4.75983c-11.90405,5.67993 -17.34648,-22.86903 -19.53539,-2.88507c-4.83576,13.58316 -24.476,-1.01483 -24.37943,16.35269c-8.98567,-1.84631 -9.40855,12.19781 -19.04626,10.78702c6.06173,-2.81454 10.18479,-18.90897 -0.69688,-11.14999c-8.89938,-6.76031 -3.76038,16.63571 -11.0985,4.45398c-1.61417,-15.81525 16.34735,-16.12735 26.46889,-18.96848c3.63502,-9.19174 8.23714,-21.27525 7.27283,-30.1396c-9.56728,3.84567 -17.9573,12.08994 -29.11918,12.79019c0.69484,8.35417 -5.77779,21.85307 -15.72966,14.08031c14.30752,5.57813 7.98567,-25.05467 -0.66062,-9.91721c-3.38933,9.9873 -2.96938,-14.429 -12.7722,-7.32185c-5.13792,3.73692 -1.64958,12.39018 -6.75386,2.35237c-0.99273,-2.02373 -1.14814,-4.89752 0.9282,-6.35475z",
            	"elk": "m55.44169,70.04322c-9.46609,7.85901 -22.89024,10.68682 -35.01687,12.13352c-10.34381,-1.03976 -26.56821,7.31529 -15.97385,18.70621c7.56154,15.8879 23.87035,2.81345 34.83344,1.97973c6.74288,1.81747 9.04052,25.43575 14.68986,9.83006c3.84105,-12.93275 21.02425,-8.87709 30.14005,-4.40716c14.1686,4.39434 8.46609,22.12076 16.61138,31.95892c12.24081,12.85411 -1.67636,29.24428 -12.4499,37.76401c-12.75361,7.58044 -18.55984,19.76834 -16.78767,34.30325c0.04941,14.73842 -3.99104,30.75432 3.85034,44.19391c11.85099,1.57538 1.64103,-19.88701 4.92331,-27.40918c1.21214,-13.46214 -1.9274,-30.30058 10.90484,-39.28947c11.4828,-10.01157 23.57063,-19.55112 36.47411,-27.62581c12.21095,-0.62399 10.39299,17.77295 13.97888,26.40175c2.87054,13.20355 4.12752,27.58423 3.69688,40.50841c3.125,10.64038 5.51489,24.0757 -1.41217,31.57294c12.91045,1.34732 24.73607,-12.8914 14.16034,-24.30435c-4.26125,-15.94153 -5.71083,-32.54619 -8.8824,-48.75049c-1.29825,-11.53598 -3.35872,-25.34232 4.83759,-34.86038c12.05826,-0.41389 24.32834,12.14566 37.60088,4.59509c11.65439,-7.49344 33.21696,-6.53802 31.62036,11.82347c-3.2142,14.87534 1.55244,29.61519 2.2346,43.81203c-3.42354,18.43187 -22.15714,27.36267 -29.50255,43.57849c6.98146,9.64319 17.6196,-4.17101 24.65466,-8.5957c-1.74142,-12.99426 11.64835,-19.92599 15.71536,-30.922c6.9856,-14.97188 -3.20459,-32.25409 -2.75711,-46.36688c-5.96602,-12.06912 6.08081,-14.98056 11.07512,-3.9678c8.02901,10.14059 21.03195,16.80963 23.7973,30.43394c7.39731,10.39175 10.8736,22.49284 15.64307,34.03711c4.08353,6.21262 10.6907,18.02594 12.81412,3.55118c3.85464,-8.67506 1.42859,-14.46745 -6.31488,-15.1647c-13.17899,-14.6283 -10.83514,-37.51031 -25.72766,-51.16437c-10.90161,-6.89407 -22.06673,-14.37312 -25.85289,-27.85638c-6.71298,-10.98305 -8.98033,-24.34339 -5.63237,-36.85001c4.36508,-2.10748 7.17406,6.33847 3.86676,-3.07584c-7.08252,-11.81364 -21.74017,-16.42101 -34.30881,-20.12214c-13.86351,-4.31435 -28.287,-5.60372 -42.65346,-3.49644c-12.2518,3.14196 -25.56529,6.21495 -37.68355,0.56779c-10.80199,-6.45414 -23.34553,-5.2407 -34.37726,-0.35921c-8.31817,4.58586 -24.95089,-0.17232 -13.39404,-9.69791c-4.65558,-4.05794 -21.26908,7.53993 -8.94252,-2.36752c5.90361,-6.02524 8.73024,-18.58166 6.56192,-25.10496c-2.33636,8.03588 -5.7029,7.70039 -5.40219,-0.79288c-2.03959,15.14413 -12.13537,5.38195 -10.55587,1.00194c0.66773,6.1233 -2.56635,12.84344 -5.72467,3.23117c-0.3636,6.21597 2.87773,15.15818 -3.77972,17.71219c10.15314,9.32419 -13.24982,2.42432 -13.20099,-4.96754c-6.18471,-9.39983 -7.12771,-4.31873 -4.60736,3.21883c-4.59348,-3.34352 -10.47613,-9.66862 -5.36225,0.14767c5.84781,13.3303 21.7189,7.94385 31.61781,10.45553z",
            	"fish": "m127.20683,242.3436c1.50244,-15.94504 5.02446,-32.41927 12.88557,-46.10178c7.51215,-8.98547 19.63693,-8.71681 29.76314,-11.79086c-14.18819,-3.80443 -27.43222,-10.54059 -40.42705,-17.66788c-21.27006,-9.23157 -42.92073,4.06975 -62.09324,13.40138c-14.23518,6.80144 -28.31641,14.82532 -43.64474,18.1933c-10.05519,-6.98578 -1.65744,-26.80461 5.41335,-35.17271c8.9525,-11.55655 22.2043,-17.52696 31.90982,-28.07993c4.26963,-14.90575 -15.40321,-18.57297 -24.24153,-24.42971c-13.70577,-6.20512 -25.35116,-16.36843 -35.77064,-27.71589c24.19748,-1.40994 45.60231,13.61476 67.43612,22.73716c11.80957,4.27464 22.94788,10.28683 33.98999,16.23396c5.06265,-0.02556 22.24189,3.73252 20.52978,-2.03984c-12.8773,-0.57095 -11.58655,-17.22836 -2.92075,-23.83247c12.73701,-10.02242 28.26479,-15.93932 38.86842,-29.21478c4.65193,-3.7341 7.09996,-12.86792 11.03157,-15.74994c16.95282,13.24852 26.87143,34.14735 36.22475,53.96581c15.23062,3.44089 30.61246,6.23184 46.13637,7.07419c15.15991,6.93107 28.10406,19.01068 39.97369,31.27808c8.99451,6.78525 11.39157,25.24843 -0.83481,28.95241c-30.16479,16.24658 -63.84666,21.21309 -97.06413,22.77441c-4.67992,-0.32996 -8.75485,0.18372 -8.78621,6.33609c-2.92581,8.76227 -4.12184,18.94467 -9.62984,26.07907c-6.07878,-1.55455 -0.31998,-19.45975 -6.56294,-10.95245c-12.27982,13.32922 -27.04962,23.32567 -42.18671,32.26515c0,-2.18091 -0.00002,-4.36198 0.00002,-6.54276z",
            	"hare": "m95.22337,299.53546c-10.68459,-4.81824 3.25798,-14.45154 8.53654,-18.71286c3.55556,-3.28177 -20.37717,0.46036 -10.27298,-10.93198c11.08577,-9.30692 6.89815,-25.05217 -4.18282,-32.37115c-15.24973,-10.2968 -34.81611,-19.10942 -40.44992,-38.33635c-5.69662,-11.9756 7.81301,-24.58835 -0.87631,-35.40263c-6.99412,-14.0412 1.177,-28.68323 6.25594,-41.69022c2.33568,-17.99253 -11.97227,-32.2212 -19.84076,-47.00306c-9.74298,-14.12588 -15.35928,-30.58578 -16.16633,-47.73895c-2.11884,-7.3217 0.22601,-18.6921 8.68694,-8.82097c17.71845,14.18765 37.17033,27.65002 49.57116,47.06949c2.34735,7.01447 11.74658,27.34441 12.27144,8.93449c0.24582,-25.30315 7.97399,-52.90002 27.77682,-69.85634c13.46954,-12.2734 20.73361,9.21683 21.36209,20.13735c3.50587,21.487 -2.30553,42.79486 -8.78146,63.09225c-2.37738,9.43285 -8.56868,35.2823 9.08899,25.75117c40.67693,-15.70451 89.96005,0.78945 116.45525,34.52606c12.17961,16.33485 17.5135,37.32133 17.39308,57.47189c-6.27155,11.83836 17.03061,-0.22177 8.58704,13.43613c-4.97064,15.1297 -19.01465,23.33925 -28.85207,34.75906c-10.01038,9.15085 -2.58298,28.71576 -19.13725,31.59863c-24.15469,7.44629 -49.5191,10.70804 -74.66498,12.6066c-14.07156,2.88287 -20.90056,-13.20758 -7.41347,-19.89679c6.46608,-9.96799 24.96535,-10.66653 30.46185,-12.24564c-13.13484,1.28516 -29.33337,-4.0759 -40.40141,4.05872c-6.70294,10.88138 -12.07141,25.20364 -26.12755,28.30951c-6.3168,1.75439 -12.8116,3.16129 -19.27982,1.25558z",
            	"he_hen": "m176.04681,296.29803c-8.82596,-3.77927 -18.43298,1.74493 -27.86224,-3.75964c7.62581,-0.4744 19.08463,-0.03574 17.06104,-11.34488c3.33665,-13.20654 -3.43475,-27.06163 2.20258,-38.55534c-8.82878,-8.42361 -18.09561,-18.39673 -22.80272,-30.16238c-0.9447,4.74663 -1.81537,8.52257 -3.158,0.33916c-0.76965,-4.00471 -0.30261,9.89931 -3.24527,0.14346c-3.10373,-8.67493 -11.4597,-31.29446 -14.05236,-10.31462c-1.0768,10.8262 -4.45592,3.14465 -6.0004,-3.72562c-1.56924,-13.22943 -7.23737,-25.48523 -8.72193,-38.68883c5.80227,-8.36407 -0.82715,-9.5029 -3.91098,-1.15848c-3.39584,13.23767 -6.30494,26.33923 -2.7624,39.9769c-4.70789,3.85124 -13.79493,-17.92216 -9.61541,-26.27414c3.62592,-9.45018 2.81974,-19.09607 3.42313,-25.48878c3.31529,-7.21146 -3.22571,-15.04807 0.25123,-22.73853c-8.88477,9.68631 -16.83011,16.38615 -14.33428,31.58234c-1.10283,3.79079 3.703,25.58844 0.64231,17.56184c-5.77861,-15.66916 -5.78305,-33.02271 -1.43442,-49.01125c0.00535,-12.20366 -9.89253,21.0744 -9.16187,4.76299c-0.93676,-12.30159 4.13303,-25.82869 8.93452,-35.55499c-5.46675,-6.50523 -23.17289,-1.89566 -14.79648,-15.70558c8.24343,-7.01884 7.35999,-16.67057 -3.85936,-8.18394c-17.3246,12.72424 -31.69814,29.07174 -47.58007,43.52234c15.25898,-19.61487 32.46107,-38.59572 53.7519,-51.75492c20.64337,-12.99951 50.5769,-14.34346 68.38963,4.28573c4.53072,7.97979 15.06177,13.26968 17.57275,20.45337c-1.84586,10.76744 5.10652,16.10654 5.85289,25.57021c4.38731,7.30244 -3.95828,20.43125 8.52597,16.64671c14.20137,-0.01996 33.63664,-3.16645 34.74754,-20.87874c5.66772,-25.50935 8.27689,-54.0092 26.4256,-74.31131c10.08655,-5.89642 3.82147,-4.32716 -3.54926,-5.29837c-6.51613,-7.58361 6.57724,-19.75743 13.02319,-21.14511c-1.112,-17.9227 10.53479,10.74471 13.86426,-2.41437c4.99586,0.09501 7.43144,12.08141 10.46855,2.29789c9.05719,7.66376 18.6297,19.25661 6.66562,29.92943c13.61102,6.52517 -13.86911,2.29947 -2.14532,12.29652c9.6759,9.35194 2.83621,26.62759 -5.10654,34.15639c-0.3085,5.66077 9.31277,13.88494 11.24728,20.75249c9.99454,19.34809 11.9986,42.36646 8.16797,63.56847c-5.39346,19.98318 -25.46588,28.67906 -39.65833,41.37386c-12.12337,9.93893 -7.85776,27.37115 -13.59781,40.42342c0.57072,7.5369 4.77751,16.1196 10.7547,20.66925c8.66214,4.84064 18.81006,7.96561 25.81393,15.05286c-6.39667,3.34055 -19.43893,-10.21753 -19.56508,0.39017c-9.50252,-12.34393 -23.7677,-4.06104 -34.21234,-13.55405c8.69193,1.65643 19.99033,0.8027 10.47188,-9.61145c-3.75841,-8.80696 -15.07852,-11.84618 -15.37883,-22.49022c-10.66643,6.69647 -17.92447,15.81358 -25.66988,24.90395c-12.85808,-0.80322 -13.41248,25.11618 0.47165,24.73163c5.7019,1.45825 27.10161,9.40335 10.25006,7.35107c-5.02289,-0.89746 -10.47203,-4.04099 -10.31842,1.85727c-2.30338,-0.41431 -4.35982,-1.56003 -6.48019,-2.47418z",
            	"hen": "m131.70792,299.20142c-2.65045,-8.04401 -50.59061,2.01245 -25.50379,-8.40613c9.71836,-2.24731 29.67359,0.57056 9.8335,-5.50568c22.5928,7.62228 32.60569,-19.08859 34.06422,-37.09636c-21.02885,-6.55212 -24.67069,-31.02429 -46.83106,-37.61485c-16.88445,-13.23645 -41.63732,-12.83168 -52.35418,-33.24014c-10.17476,-18.17259 -4.4284,-40.29292 -2.74405,-59.92338c4.00956,-20.72375 12.14967,-41.69897 10.53991,-62.75727c-16.41068,9.44812 -22.4106,-11.67328 -22.78485,-18.27062c-12.07958,3.08904 -19.7317,3.22594 -6.59584,-7.5194c5.87008,-8.14037 8.78346,-25.92081 18.16113,-23.25189c2.47408,-10.763 9.04029,4.89351 16.30021,-4.61621c4.44867,3.35889 13.85731,7.10325 3.42817,13.02555c18.83147,9.50194 34.07959,23.95835 41.92437,42.43233c7.86127,18.77559 23.52317,39.06593 48.8149,33.98585c22.90038,3.93186 49.73083,-9.80992 48.68822,-32.86776c0.44391,-16.33654 16.52325,-54.48924 38.19395,-35.09801c16.24046,6.22802 34.92778,21.65468 31.09642,39.16159c-2.21887,18.0508 -0.50452,36.25767 1.60162,54.45551c-13.60181,10.0825 -11.15982,27.59631 -20.65894,40.7838c7.8804,18.56862 0.29095,38.62871 -12.60841,53.70848c-12.90314,13.89935 -31.76248,26.24356 -52.66508,24.4381c-7.98578,13.29396 9.42929,24.99069 15.57339,25.73553c-16.01053,-5.1321 -13.75549,4.70874 -8.47672,15.2244c4.94576,19.6875 -10.58037,-17.53909 -20.60904,0.27255c-7.77597,7.68976 -38.86531,10.29276 -13.69539,1.07587c21.48048,-7.96875 -24.12099,-12.95142 -13.99879,5.00586c3.34996,7.49203 22.77361,10.79092 2.32814,7.93628c-9.02753,-4.74515 -13.85625,12.10397 -21.02202,8.92599zm43.09088,-34.62769c7.8596,-9.56569 10.12141,-37.24054 -6.87671,-17.06372c-13.43553,10.88889 -18.29311,29.6301 6.87671,17.06372z",
            	"mouse": "m0.99942,221.57315c18.97592,-5.2153 38.89368,-5.72223 58.37582,-7.77921c22.496,-2.19991 45.89505,-1.95135 67.14781,-10.93486c14.09158,-5.66957 18.06422,-22.34355 18.92189,-36.61246c3.853,-24.50212 17.5325,-49.94102 40.26784,-59.44455c8.81084,-4.72752 21.73279,1.24299 28.77051,-3.16475c-8.53821,-11.67851 9.86266,-25.18666 17.60304,-12.64201c9.90706,2.44754 20.13632,-4.12984 22.40773,-13.63184c8.92409,7.01573 17.55354,16.51189 28.21455,21.93088c10.14639,3.852 24.18005,17.58312 11.18048,27.34964c-8.74753,9.55273 -22.39651,8.48746 -31.55023,16.51577c-9.2032,7.60971 -8.39032,20.69223 -4.77994,31.13091c0.58701,11.39519 9.68161,13.02966 17.70996,16.03508c1.32019,7.11591 -9.48019,9.15216 -14.76065,10.85889c-11.37581,1.93378 -22.26419,-2.9012 -30.79645,-10.59497c-7.75803,-9.73157 -17.02081,0.98111 -14.42018,10.56955c-13.10742,11.20265 10.79541,5.32968 13.63931,12.79547c-11.33516,4.36475 -24.3324,2.06448 -36.29933,1.86723c-15.70055,0.23059 -28.91441,-10.20818 -44.0015,-12.87645c-9.31265,3.4888 -17.24791,11.49408 -27.66536,12.5939c-30.59707,5.30119 -61.77245,4.85931 -92.6703,6.59238c-8.95057,-0.1062 -18.97236,1.51553 -27.29502,-0.55859z"
            	}
            }
          • arrow.json
            {"data": {
            	"10": "m0.99679,148.19614c0.277,-34.75176 -0.17724,-69.54997 2.27791,-104.24061c60.32762,11.41171 119.94372,30.08407 179.25477,46.87597c3.18407,-17.04019 1.68541,-31.17523 4.4519,-46.93008c38.1039,33.15254 75.86421,66.77718 112.07695,102.003c-34.74261,39.95821 -74.59364,74.65916 -113.71667,110.1933c-1.26689,-16.54773 -2.53401,-33.09534 -3.80092,-49.64307c-57.66159,16.00916 -118.64064,32.56108 -176.67504,47.19652c-3.94662,-33.77068 -3.83062,-70.54794 -3.8689,-105.45503z",
            	"11": "m136.44681,226.75766l47.24773,-47.40907l-91.35118,0l-91.35098,0l0,-29.34846l0,-29.34849l90.303,0c49.66658,0 90.30293,-1.48752 90.30293,-3.30561c0,-1.81805 -19.77211,-23.15214 -43.93797,-47.40906l-43.93811,-44.1035l40.61224,0l40.61209,0l62.02386,62.14279l62.02383,62.14276l-62.14281,62.02386l-62.14279,62.02386l-42.75481,0l-42.75491,0l47.24786,-47.40909z",
            	"12": "m116.00724,294.49442c-8.01179,-8.01181 -6.96065,-12.86337 12.51841,-57.77466c9.83598,-22.67787 17.88353,-41.89153 17.88353,-42.69699c0,-0.8054 -27.16052,-1.46442 -60.3569,-1.46442l-60.3569,0l0,-42.47337l0,-42.47337l60.83526,0c46.90741,0 60.31158,-1.27951 58.54825,-5.58862c-1.25784,-3.07373 -9.83818,-23.47047 -19.06743,-45.32602c-17.39725,-41.19823 -17.39179,-52.24659 0.02688,-55.67119c8.66862,-1.70424 143.62872,129.24032 148.26757,143.85621c-44.95403,52.18671 -98.68933,106.81281 -148.18829,154.97751c-2.60997,0 -7.15958,-2.41428 -10.11037,-5.36508z",
            	"13": "m167.5984,129.81894c13.45454,0 26.90909,0 40.36363,0c0,13.45454 0,26.90909 0,40.36363c-13.45454,0 -26.90909,0 -40.36363,0c0,-13.45454 0,-26.90909 0,-40.36363zm-58.30304,0c14.9494,0 29.89909,0 44.8485,0c0,13.45454 0,26.90909 0,40.36363c-14.9494,0 -29.89909,0 -44.8485,0c0,-13.45454 0,-26.90909 0,-40.36363zm-53.81818,0c14.9494,0 29.89908,0 44.84848,0c0,13.45454 0,26.90909 0,40.36363c-14.9494,0 -29.89909,0 -44.84848,0c0,-13.45454 0,-26.90909 0,-40.36363zm-53.81818,0c14.9494,0 29.89908,0 44.84849,0c0,13.45454 0,26.90909 0,40.36363c-14.94941,0 -29.89908,0 -44.84849,0c0,-13.45454 0,-26.90909 0,-40.36363zm165.9394,83.23706c14.2021,-0.91132 28.40395,0.64389 42.60606,-0.26743c0.91125,-14.20201 0.48917,-28.40405 1.40042,-42.60606c13.29086,0 27.91505,0 41.20563,0c0,-13.45454 0,-26.9091 0,-40.36363c-13.45454,0 -26.90909,0 -40.36363,0c0,-14.94952 0,-29.899 0,-44.84848c-14.9494,0 -29.89908,0 -44.84848,0c0,-13.45454 0,-26.90909 0,-40.36363c14.9494,0 29.89908,0 44.84848,0c0,13.45454 0,26.90909 0,40.36363c13.29059,0 27.91478,-0.66666 41.20563,-0.66666c0.91125,14.20197 0.48918,29.0707 1.40044,43.27271c14.20209,0.91129 28.60425,-0.07731 42.80637,0.83398c0,13.29074 -0.20032,28.48132 -0.20032,41.77208c-14.9494,0 -29.89908,0 -44.84848,0c0,14.94951 0,29.89897 0,44.84848c-13.45454,0 -26.90909,0 -40.36363,0c0,13.45454 0,26.90909 0,40.36363c-14.9494,0 -29.89908,0 -44.84848,0c0,-13.29074 0,-29.0479 0,-42.33865z",
            	"14": "m158.38327,149.9911l-83.00266,-148.9972l149.24145,148.9972l-149.24145,148.99712l83.00266,-148.99712z",
            	"15": "m175.41861,150.04552l-148.89816,-149.05299l98.06119,0l148.89816,149.05299l-148.89816,149.05287l-98.06119,0l148.89816,-149.05287z",
            	"16": "m227.52928,183.22569c6.14276,-5.95375 12.01762,-12.81764 17.19296,-18.97911l-155.07133,-2.82724l-21.27044,24.3479l-67.38522,-2.09119c8.44345,-11.0853 17.69294,-24.10754 24.55062,-33.88853l-24.39403,-32.88164l71.89852,0l14.62907,20.54468l158.32403,0l-19.63887,-20.4987c6.06082,-6.45992 15.03049,-15.08081 19.89622,-19.60087l53.24701,52.24467l-53.36812,53.05513l-18.61044,-19.42511z",
            	"bent_up": "m1.00136,224.73827l204.13,0l0,-149.15997l-31.28999,0l62.57999,-74.57997l62.58002,74.57997l-31.29001,0l0,223.73997l-266.71,0z",
            	"callout": "m0.99757,0.99642l193.63145,0l0,111.75l53.81497,0l0,-37.25l50.55357,74.49999l-50.55357,74.50003l0,-37.25002l-53.81497,0l0,111.75l-193.63145,0z",
            	"chevron": "m0.99844,0.99688l223.49919,0l74.49986,149.00068l-74.49986,149.00134l-223.49919,0l74.49984,-149.00134l-74.49984,-149.00068z",
            	"corners": "m78.29672,150l-55.17469,-55.1747l0,27.58735l-22.12203,0l0,-121.41265l121.41265,0l0,22.12203l-27.58736,0l55.17471,55.17471l55.17471,-55.17471l-27.58736,0l0,-22.12203l121.41264,0l0,121.41265l-22.12204,0l0,-27.58735l-55.1747,55.1747l55.1747,55.17471l0,-27.58736l22.12204,0l0,121.41264l-121.41264,0l0,-22.12204l27.58736,0l-55.17471,-55.17468l-55.17471,55.17468l27.58736,0l0,22.12204l-121.41265,0l0,-121.41264l22.12203,0l0,27.58736l55.17469,-55.17471z",
            	"diamond": "m228.23334,205.75699c-12.96465,-22.71989 -62.74901,-33.9996 -160.88079,-36.45064l-66.35706,-1.65739l0,-19.88501l0,-19.88482l50.08599,0c59.04541,0 101.26503,-4.08251 135.71376,-13.12332c20.32901,-5.33509 27.0845,-8.73719 36.27359,-18.26725l11.29199,-11.71121l32.38853,32.49907l32.38852,32.49925l-32.75113,32.72415l-32.75122,32.72433l-5.40219,-9.46716z",
            	"dotted": "m164.76302,54.29618c-12.89404,-14.08136 13.13254,-37.91006 24.83243,-21.67826c9.98653,14.06865 -12.21164,31.95572 -24.83243,21.67826zm34.52623,32.04741c-10.53665,-15.50334 18.2944,-32.06738 27.41472,-16.58083c10.82574,16.19412 -18.42853,34.68893 -27.41472,16.58083zm39.30569,38.77469c-13.16362,-8.91086 -0.08168,-29.46533 13.54875,-27.63215c18.93346,2.88981 13.87328,34.44158 -4.59297,32.89478c-3.58466,-0.41574 -6.77832,-2.45136 -8.95578,-5.26263zm32.87781,34.23642c-11.00845,-13.99648 14.37656,-32.37918 25.04797,-19.05171c11.60712,14.82527 -14.29718,34.39392 -25.04797,19.05171zm-63.84386,0.7675c-12.23796,-11.58463 5.72536,-30.30273 19.24007,-25.41679c19.63696,6.28566 5.03751,36.50668 -12.48737,29.64096c-2.41074,-1.14194 -4.56958,-2.71278 -6.7527,-4.22417zm-52.05359,0c-14.38365,-13.43323 11.89731,-35.50046 24.20743,-21.44815c12.48965,14.64734 -10.94827,35.43011 -24.20743,21.44815zm-51.41751,-0.7675c-11.01524,-13.99239 14.38364,-32.38554 25.04439,-19.04626c11.57417,14.84886 -14.25791,34.38168 -25.04439,19.04626zm-48.97159,0.7675c-14.38364,-13.43323 11.89733,-35.50046 24.20746,-21.44815c12.48962,14.64734 -10.94829,35.43011 -24.20746,21.44815zm-51.41319,-0.75569c-12.62148,-16.51503 21.51373,-34.53826 27.20482,-13.82039c4.20761,13.86485 -18.57945,25.93829 -27.20482,13.82039zm232.73729,36.71002c-12.26451,-12.7252 9.54947,-34.95583 22.63777,-23.37347c16.16324,11.53831 -5.25334,38.27226 -20.09267,25.93422c-0.83693,-0.86462 -1.69453,-1.70929 -2.5451,-2.56075zm-37.22105,31.5554c-10.33875,-14.74719 16.53384,-30.93315 26.24101,-17.10368c12.66234,14.69044 -12.76988,34.70573 -24.48114,20.0298l-1.75987,-2.92612zm-33.2933,39.2449c-11.17,-10.21844 4.17313,-26.31229 16.33257,-23.575c18.50797,4.77472 6.84483,34.45702 -10.13109,28.82402c-2.6304,-0.90369 -4.76476,-2.91159 -6.20148,-5.24902z",
            	"hand_2": "m166.23018,238.662c7.92778,-2.90976 14.43034,-5.61938 2.1153,-5.69868c-10.87593,1.46172 -39.01099,-9.28242 -16.4619,-14.56342c14.10701,-5.508 46.21144,7.21423 46.38257,-14.54736c-2.55197,-13.63786 -43.96396,-2.98952 -30.34076,-21.27969c15.00345,-6.1348 44.75407,8.31958 49.78708,-10.66391c-4.61371,-18.40675 -33.47118,-6.65964 -47.97568,-11.74664c-14.06097,2.90031 -17.76392,-15.58949 -1.98296,-12.79868c36.48125,-1.96817 73.21696,0.92035 109.57253,-3.09619c5.87265,-3.2529 10.21371,-23.26295 2.80267,-24.61046c-52.95885,-1.09735 -106.01129,-0.08873 -158.88631,-3.36192c-18.99625,-0.19729 -4.48207,-20.48157 9.55508,-15.71787c13.37119,-4.37856 18.67023,-15.85947 28.4838,-27.19597c5.01488,-24.77942 -19.08717,-15.58241 -28.93028,-8.33138c-10.99126,7.20572 -29.89664,22.16276 -39.92577,30.01463c-8.79154,6.3571 -29.0466,13.41131 -41.36795,21.93291c-10.53185,3.7428 -22.05687,1.87943 -32.40108,2.55152c0,33.57336 0,67.14623 0,100.71958c29.2655,12.743 60.06093,23.93646 92.50566,22.65599c19.00592,-0.07739 38.55775,0.63341 57.06799,-4.26245zm-120.57521,10.76822c-14.93961,-5.74022 -29.85212,-11.55359 -44.65637,-17.63553c0.70846,-41.92598 1.41691,-83.85243 2.12533,-125.77841c11.81984,-0.44887 29.35853,5.41407 37.78343,-3.21891c22.65079,-7.26991 37.35686,-23.34933 57.21348,-35.41785c13.97373,-10.98014 25.13529,-14.72766 39.56827,-23.05481c10.96249,-5.06954 16.89815,-2.48073 29.24257,-0.27045c5.38396,8.81045 12.06773,13.36412 8.59946,30.1482c-7.23705,3.64039 -16.6288,28.10783 -2.4068,28.30228c39.59416,3.79424 79.82585,-1.53866 119.10855,5.09266c9.78171,13.24281 11.64719,42.99407 -6.25568,51.39202c-17.13269,4.95341 -35.19667,2.49629 -52.7989,3.09193c-0.00107,12.52824 2.07022,28.51608 -11.83537,34.80946c-10.26779,13.39197 -10.98985,33.06551 -27.53502,42.86476c-13.91499,14.25851 -33.72333,18.66306 -53.04445,18.19296c-31.68189,0.4295 -65.02994,3.46667 -95.10849,-8.51738l0,-0.00095z",
            	"hand": "m136.98543,214.15889c-14.70618,-5.74251 -4.62521,-24.05643 -14.3905,-33.27538c-12.96347,-7.75244 -2.12349,-24.16507 -12.57821,-33.28812c-7.48801,-6.64952 -5.24203,-16.62421 -3.67915,-25.18983c-29.75101,-0.23549 -59.53337,0.62366 -89.25697,-0.78464c-15.11522,1.28053 -20.03182,-18.26941 -12.80666,-28.85114c7.00419,-11.24166 21.87759,-8.31262 33.12609,-9.4029c64.97946,-0.76864 129.97618,-0.61134 194.95673,0.02921c17.26189,0.80067 37.01695,-1.19489 50.6566,11.68779c16.24808,15.16693 16.0166,39.34441 16.04852,59.94771c-0.42267,19.21857 -2.90109,42.02173 -20.4863,53.46951c-16.36914,10.95175 -36.93741,7.66907 -55.55533,8.62302c-27.94264,-0.30014 -56.07063,1.04456 -83.86891,-2.2673l-2.16592,-0.69792l0,0zm69.33224,-10.55814c9.631,-11.23128 -3.5211,-20.50227 -14.65393,-17.55965c-16.14473,-0.10535 -32.65453,-1.7021 -48.52592,1.75482c-13.67432,5.19589 -4.85582,21.54512 7.46478,18.25877c18.04872,1.02443 36.47603,1.82143 54.28616,-1.68709l1.42891,-0.76686zm65.93199,-2.17656c15.66348,-8.69865 15.78064,-28.60548 16.25079,-44.24881c-0.34195,-16.50655 1.70639,-34.58434 -7.04581,-49.36581c-7.23798,-10.84158 -20.71933,-14.52557 -33.13705,-14.12024c-23.36646,0.0377 -47.0793,-1.82723 -70.16504,2.52512c-15.66467,3.36275 -22.23152,20.93031 -23.45795,35.19015c-0.48341,13.80043 -1.82124,28.00842 1.22505,41.56039c7.24641,5.02983 15.89499,-9.13847 19.17191,-15.4227c4.31766,-11.67575 -0.61995,-26.25061 8.10953,-36.19362c8.72269,-9.46424 24.96402,-8.53419 32.52521,1.88722c8.3812,9.23244 -0.48325,21.69592 1.82307,32.51563c4.15211,9.93069 -0.70021,19.45959 -0.85791,28.5067c4.13835,6.87068 2.87872,15.02933 1.61143,22.50597c16.21062,-0.57724 32.86133,1.70529 48.65034,-2.71872c1.84845,-0.69202 3.61401,-1.59238 5.29642,-2.62128zm-126.53741,-35.9437c2.18771,-13.69858 -18.65493,-12.59653 -20.49308,-1.57007c-4.38604,12.23279 17.61123,15.56906 20.78048,7.03215c0.03699,-1.82657 -0.14053,-3.64476 -0.2874,-5.46208zm62.45076,0.42249c1.41585,-11.79691 -20.5592,-11.91444 -24.75133,-3.63126c-2.34377,5.03215 -10.03961,15.25429 1.13329,12.59268c7.54675,-1.70357 25.12254,3.75204 23.61804,-8.96143zm-62.44263,-31.11197c-0.75351,-2.94205 3.03209,-10.28735 -1.13232,-9.92064c-9.20967,1.01493 -19.08115,-0.45296 -27.70964,3.18962c-7.77171,10.63712 5.24397,21.0274 15.9218,17.53934c7.79146,0.11475 13.91219,-1.24452 12.92017,-10.80832zm61.0041,7.53122c8.85812,-9.53879 -4.95708,-21.9593 -14.94496,-15.6684c-10.39732,5.40628 -7.29182,25.10663 6.58635,19.17703c2.96956,-0.54494 6.1384,-1.30057 8.35861,-3.50864zm-53.18405,-38.39041c2.00339,-3.50816 4.00681,-7.01634 6.01019,-10.52453c-44.99024,0.24061 -90.00227,-0.61648 -134.97418,0.73022c-12.21447,-3.32573 -22.07768,15.22181 -6.82234,18.35822c24.02138,3.10667 48.39057,1.52395 72.56345,1.97845c19.07089,-0.00607 38.14179,-0.01187 57.21268,-0.01793c2.0034,-3.50815 4.00681,-7.01634 6.01019,-10.52452z",
            	"in_circle_1": "m5.82933,197.43428c40.71335,-0.01967 134.41318,-0.35846 180.09581,-0.39397c0,16.34004 0,32.68033 0,49.02061c32.58316,-32.50494 65.16631,-65.00987 97.74948,-97.51482c-31.92815,-31.66348 -63.85603,-63.3272 -95.78392,-94.99068c-0.78604,15.0691 -1.57207,30.13822 -2.35809,45.20756c-59.53047,-0.36446 -119.11517,1.07731 -178.59646,-1.67522c0.61495,-72.0702 150.25177,-122.40517 212.67849,-79.3467c34.44215,24.58492 61.89983,56.78898 72.41017,96.54306c3.07645,22.14599 2.45142,44.78936 0.58615,67.02389c-6.63419,36.33044 -31.19992,67.07545 -59.56813,89.58617c-20.38606,15.81168 -45.18452,26.98569 -71.36909,26.70041c-75.26421,9.28406 -124.16029,-34.86111 -155.84441,-100.16032z",
            	"inner": "m197.26169,150.29735l-74.64867,-74.64867l0,37.32433l-80.12502,0l0,-111.97301l215.02399,0l0,298.5947l-215.02399,0l0,-111.97301l80.12502,0l0,37.32433l74.64867,-74.64867z",
            	"left_right": "m0.99835,150.00092l86.49609,-86.49651l0,43.24814l125.35546,0l0,-43.24814l86.49605,86.49651l-86.49605,86.49605l0,-43.24803l-125.35546,0l0,43.24803l-86.49609,-86.49605z",
            	"left_up": "m0.99865,224.5l74.50004,-74.5l0,37.25l111.74991,0l0,-111.75l-37.25,0l74.5,-74.5l74.5,74.5l-37.25,0l0,186.25l-186.24989,0l0,37.25l-74.50005,-74.5z",
            	"pentagon": "m0.99791,0.9981l162.54547,0l135.45454,149.40899l-135.45454,149.40898l-162.54547,0z",
            	"recycle_3": "m28.22058,93.28644c0.00678,-2.58051 2.31667,-18.40222 5.13495,-35.15953c8.78786,-52.25238 8.91713,-52.48297 20.07468,-35.82898l6.60126,9.85321l19.30534,-9.74535c25.53492,-12.88995 56.00401,-17.65838 84.01221,-13.14781c11.88918,1.91477 24.50447,5.02692 28.034,6.91587c7.00751,3.7502 6.55832,6.97083 -4.61034,33.05528c-6.12129,14.29643 -6.70886,14.70388 -17.2827,11.98577c-17.99704,-4.62608 -47.30141,-3.16897 -61.44969,3.05553l-13.26538,5.83627l9.31132,9.7189c5.12125,5.34554 8.02238,10.51565 6.44702,11.48924c-1.57542,0.97362 -20.7427,2.87124 -42.59392,4.21677c-32.78424,2.01891 -39.72768,1.62653 -39.71874,-2.24516zm168.81314,144.07051l-14.20186,-18.81009l12.93088,-12.50398c13.30882,-12.86928 22.90733,-30.93761 27.13603,-51.08145l2.41319,-11.49524l-13.91847,2.22554c-7.65517,1.22421 -13.96558,1.06514 -14.02313,-0.35333c-0.26878,-6.62247 36.12752,-71.90508 39.66528,-71.14616c5.56261,1.19325 61.9985,50.07314 61.9985,53.6975c0,1.61765 -5.93121,3.88967 -13.18036,5.04884l-13.18039,2.10753l-1.30084,22.476c-1.66846,28.82635 -16.85831,62.09589 -38.00682,83.24434c-8.4704,8.47049 -16.91487,15.4008 -18.76544,15.4008c-1.85062,0 -9.75555,-8.46469 -17.56657,-18.81029zm-128.20031,52.72328c0,-2.07986 2.23119,-8.0961 4.95819,-13.36954c4.94765,-9.56766 4.91901,-9.61411 -13.52617,-21.86105c-28.85884,-19.16116 -50.30965,-53.17105 -57.05687,-90.46291l-2.21202,-12.22588l15.77176,-2.16168c32.51166,-4.45622 32.80855,-4.32152 39.31982,17.83711c4.39381,14.95265 9.79779,23.91347 21.44681,35.56244c8.5651,8.56514 16.76965,14.83324 18.23236,13.92926c1.46265,-0.90396 3.57973,-6.24536 4.70464,-11.86984c1.1249,-5.62448 3.47056,-10.22638 5.21256,-10.22638c3.99942,0 41.66188,59.38374 42.2598,66.63249c0.39931,4.84137 -19.96001,13.22382 -73.01952,30.06421c-3.38333,1.07379 -6.09135,0.25229 -6.09135,-1.84824z",
            	"turn_17": "m187.66985,234.28424l2.06375,-22.20483l-24.28615,-3.86421c-61.48712,-9.78288 -121.75832,-51.26649 -155.31676,-106.90179c-6.02069,-9.98148 -10.05047,-19.59818 -8.95503,-21.37048c2.51272,-4.06578 63.74106,-36.43469 68.91894,-36.43469c2.11224,0 7.18627,5.95309 11.27556,13.22911c17.44035,31.03078 62.57552,63.39609 94.35383,67.65826l12.88387,1.7281l-2.21523,-19.19039c-2.29968,-19.92216 -1.65292,-24.10554 3.72659,-24.10554c3.43987,0 106.12749,76.50481 109.06303,81.25475c2.22696,3.60321 -11.89679,16.9705 -62.46501,59.11911c-21.96555,18.30804 -42.4514,33.28745 -45.52422,33.28745c-4.91821,0 -5.33987,-2.65765 -3.52318,-22.20483z",
            	"turn_reverse": "m298.99997,168.62498c0,-51.43148 -133.41916,-93.12499 -297.99997,-93.12499l0,-74.49999l0,0c164.58081,0 297.99997,41.69347 297.99997,93.12499l0,74.49999c0,42.46484 -91.92749,79.55168 -223.49998,90.16789l0,37.25l-74.49999,-71.54289l74.49999,-77.45709l0,37.25l0,0c88.72033,-7.15858 161.96952,-26.67409 198.62153,-52.91789",
            	"u_turn": "m1.00059,299.00055l0,-167.62497l0,0c0,-72.00411 58.37087,-130.37499 130.375,-130.37499l0,0l0,0c34.57759,0 67.73898,13.7359 92.18906,38.18595c24.45006,24.45005 38.18593,57.61144 38.18593,92.18904l0,18.625l37.24997,0l-74.49995,74.50002l-74.50002,-74.50002l37.25,0l0,-18.625c0,-30.8589 -25.0161,-55.87498 -55.87498,-55.87498l0,0l0,0c-30.85892,0 -55.875,25.01608 -55.875,55.87498l0,167.62497z",
            	"up": "m1.49805,149.64304l148.50121,-148.00241l148.50121,148.00241l-74.25061,0l0,148.71457l-148.5012,0l0,-148.71457z"
            	}
            }
          • dialog_balloon.json
            {"data": {
            	"1": "m0.99786,35.96579l0,0c0,-19.31077 15.28761,-34.96524 34.14583,-34.96524l15.52084,0l0,0l74.50001,0l139.68748,0c9.05606,0 17.74118,3.68382 24.14478,10.24108c6.40356,6.55726 10.00107,15.45081 10.00107,24.72416l0,87.41311l0,0l0,52.44785l0,0c0,19.31078 -15.2876,34.96524 -34.14584,34.96524l-139.68748,0l-97.32507,88.90848l22.82506,-88.90848l-15.52084,0c-18.85822,0 -34.14583,-15.65446 -34.14583,-34.96524l0,0l0,-52.44785l0,0z",
            	"4": "m1,1l49.66667,0l0,0l74.5,0l173.83334,0l0,115.8889l0,0l0,49.66666l0,33.11111l-173.83334,0l-123.68433,97.37498l49.18433,-97.37498l-49.66667,0l0,-33.11111l0,-49.66666l0,0z",
            	"5": "m3.88165,296.34811l58.64952,-105.30074l0,0c-62.13446,-31.76456 -79.86445,-91.6022 -40.96117,-138.24044c38.90255,-46.63797 121.70818,-64.81269 191.29914,-41.98796c69.59094,22.8246 103.19446,79.17835 77.63046,130.19172c-25.56265,51.01335 -101.92546,79.99094 -176.41714,66.94487l-110.20081,88.39255z",
            	"6": "m4.33333,266.6662c0,-1.854 2.23757,-3.35571 5,-3.35571c2.76243,0 5,1.50171 5,3.35571c0,1.85394 -2.23757,3.35565 -5,3.35565c-2.76243,0 -5,-1.50171 -5,-3.35565zm10.25,-24.11072c0,-4.6351 5.59392,-8.38943 12.50001,-8.38943c6.90608,0 12.5,3.75433 12.5,8.38943c0,4.63489 -5.59392,8.38928 -12.5,8.38928c-6.90609,0 -12.50001,-3.75433 -12.50001,-8.38928zm23.75001,-36.55524c0,-12.81482 19.46685,-23.19473 43.50002,-23.19473c24.0331,0 43.49996,10.37991 43.49996,23.19473c0,12.81473 -19.46686,23.19455 -43.49996,23.19455c-24.03317,0 -43.50002,-10.37982 -43.50002,-23.19455zm-37.33334,-104.99994c0,-55.2486 66.67956,-100 149,-100c82.32047,0 149,44.7514 149,100c0,55.24866 -66.67953,100 -149,100c-82.32044,0 -149,-44.75134 -149,-100z",
            	"scream": "m299.67374,132.67729l-35.72574,1.97192l-9.55817,48.04506l-31.60561,-11.61551l-45.83566,36.86661l-17.45096,-21.51509l-146.98414,92.00807l81.6677,-102.60858l-67.83573,-13.33963l21.22697,-19.84731l-46.57336,-36.42733l33.47025,-8.80944l-10.52427,-47.94958l35.08694,5.02536l28.86619,-44.2482l25.5638,17.26465l59.09183,-26.49832l7.92432,24.02253l70.55626,-0.33542l-12.23108,23.15343l59.61954,25.93398l-28.50317,14.93327l29.75409,43.96953z",
            	"thought": "m12,1c-6.094,0 -11,4.906 -11,11l0,147c0,6.09399 4.906,11 11,11l49.15625,0c-2.03143,2.32526 -3.15625,4.84886 -3.15625,7.5c0,11.32597 20.36188,20.5 45.5,20.5c25.13812,0 45.5,-9.17403 45.5,-20.5c0,-2.65114 -1.12482,-5.17474 -3.15625,-7.5l142.15625,0c6.09399,0 11,-4.90601 11,-11l0,-147c0,-6.094 -4.90601,-11 -11,-11l-276,0zm54,199c-13.81215,0 -25,5.37016 -25,12c0,6.62984 11.18785,12 25,12c13.81216,0 25,-5.37016 25,-12c0,-6.62984 -11.18784,-12 -25,-12zm-25,30c-7.73481,0 -14,4.02762 -14,9c0,4.97238 6.26519,9 14,9c7.73481,0 14,-4.02762 14,-9c0,-4.97238 -6.26519,-9 -14,-9zm-24,22c-4.97238,0 -9,2.23756 -9,5c0,2.76242 4.02762,5 9,5c4.97238,0 9,-2.23758 9,-5c0,-2.76244 -4.02762,-5 -9,-5z"
            	}
            }
          • electronics.json
            {"data": {
            	"capacitor": "m292.103577,149.999374l-117.073944,-0.445328m-167.175035,0.445328l116.628588,0m0.44532,-72.035179l11.364601,0l0,144.640358l-11.364601,0l0,-144.640358zm38.244209,-0.569977l11.364594,0l0,144.640297l-11.364594,0l0,-144.640297zm-162.171733,68.98156l6.905184,0l0,6.905212l-6.905184,0l0,-6.905212zm291.101741,0.325241l6.905182,0l0,6.905212l-6.905182,0l0,-6.905212z",
            	"diode": "m180.228439,90.39769l21.70816,0l0,117.211075l-21.70816,0l0,-117.211075zm23.345947,59.602753l88.556381,0m-284.3409,-1.995804l85.541058,0l0,-65.011185l87.251961,66.722031l-87.250778,67.291931l0,-68.720001m-92.331572,-3.917542l6.811423,0l0,6.811447l-6.811423,0l0,-6.811447zm291.20439,2.03891l6.811401,0l0,6.811462l-6.811401,0l0,-6.811462z",
            	"gate_and": "m7.454795,178.082489l67.605378,0m-67.605378,-54.850876l67.605393,0.000015m-0.155602,-30.065033l0,113.750015c194.70015,10.208389 199.234482,-124.687454 0,-113.750015zm217.618942,56.662766l-70.312149,0m-221.397258,-29.817062l6.68369,0l0,6.683685l-6.68369,0l0,-6.683685zm-0.314375,54.532364l6.68369,0l0,6.683685l-6.68369,0l0,-6.683685zm291.95109,-27.976547l6.683685,0l0,6.683685l-6.683685,0l0,-6.683685z",
            	"gate_inverter": "m292.351624,149.998962l-70.506393,0m-0.189026,0a19.883057,19.883057 0 1 1-39.766113,0a19.883057,19.883057 0 1 139.766113,0zm-213.972072,2.405243l69.321826,0l0,-61.05407l101.250404,58.4571l-101.19664,58.840652l0,-56.176727m-76.061115,-3.699677l6.780182,0l0,6.779526l-6.780182,0l0,-6.779526zm291.428455,-2.135864l6.780518,0l0,6.780548l-6.780518,0l0,-6.780548z",
            	"gate_nand": "m8.042537,173.038879l60.699101,-0.672531m-60.699101,-49.879471l61.371335,0m-0.785973,-24.868042l0,104.835098c179.441437,9.408417 183.619827,-114.915443 0,-104.835098zm223.921448,50.643158l-64.591507,0m0.637238,0a11.937837,11.937837 0 1 1-23.87648,0a11.937837,11.937837 0 1 123.87648,0zm-227.445681,-29.373505l6.739111,0l0,6.739143l-6.739111,0l0,-6.739143zm-0.150617,50.613495l6.73911,0l0,6.739151l-6.73911,0l0,-6.739151zm291.47287,-24.654327l6.739105,0l0,6.739151l-6.739105,0l0,-6.739151z",
            	"gate_nor": "m292.610077,150.214462l-69.483139,-0.215668m0.147217,0.215668a12.942393,12.942393 0 1 1-25.884689,0a12.942393,12.942393 0 1 125.884689,0zm-215.590108,29.264374l63.620397,0m-63.620397,-54.805801l65.561368,-0.431335m-20.75433,-33.139984c129.343479,0 143.580387,58.405624 143.580387,58.405624l-0.347778,0c-18.514755,69.097885 -143.580379,58.057999 -143.580379,58.057999c59.7962,-58.405655 0.347775,-116.463623 0.347775,-116.463623zm-51.490408,30.117874l6.644974,0l0,6.645012l-6.644974,0l0,-6.645012zm0.003831,54.852463l6.644983,0l0,6.64502l-6.644983,0l0,-6.64502zm291.530706,-29.571609l6.644989,0l0,6.64502l-6.644989,0l0,-6.64502z",
            	"gate_or": "m7.681484,183.57515l71.7616,0m-71.7616,-60.67144l73.093784,-0.000015m-23.092442,-37.784157c143.186604,0 158.947315,64.65654 158.947315,64.65654l75.817307,0l-76.202316,0c-20.49614,76.493118 -158.94717,64.271667 -158.94717,64.271667c66.195942,-64.656525 0.385136,-128.928207 0.385136,-128.928207zm-56.684011,33.939781l6.677925,0l0,6.677956l-6.677925,0l0,-6.677956zm291.510831,27.410866l6.677948,0l0,6.677948l-6.677948,0l0,-6.677948zm-291.404498,33.607208l6.677927,0l0,6.677917l-6.677927,0l0,-6.677917z",
            	"gate_xor": "m80.450493,91.498093c129.22271,0 143.446312,58.351089 143.446312,58.351089l68.423569,0l-68.770889,0c-18.497391,69.033295 -143.446304,58.003708 -143.446304,58.003708c59.740372,-58.351089 0.347511,-116.354797 0.347511,-116.354797zm-22.576313,4.515259c43.415966,54.530457 0,108.018921 0,108.018921m-50.015199,-26.867355l63.560987,0m-63.560987,-54.7547l63.560987,0m-70.418914,-3.722206l6.82584,0l0,6.825867l-6.82584,0l0,-6.825867zm0.057968,54.832268l6.825839,0l0,6.825867l-6.825839,0l0,-6.825867zm291.170364,-27.096024l6.825836,0l0,6.825867l-6.825836,0l0,-6.825867z",
            	"inductor": "m7.783882,182.663147l59.679306,0c0,0 -30.829735,-67.744125 15.054253,-68.81945c42.462807,-0.995041 37.635605,69.357201 24.194321,69.357201c-13.441284,0 -12.903625,-68.81955 22.043701,-68.81955c34.947357,0 40.323868,68.819366 20.968399,68.819366c-19.355423,0 -11.828323,-68.819366 22.58139,-68.819366c34.409683,0 41.399155,68.81955 19.893112,68.81955c-21.506073,0 -9.67775,-68.81955 24.19429,-68.81955c33.87207,0 29.570831,68.819366 18.280151,68.819366c-11.290665,0 57.528732,-0.537659 57.528732,-0.537659m-291.202282,-3.571106l6.772959,0l0,6.772995l-6.772959,0l0,-6.772995zm291.221844,0.301132l6.772949,0l0,6.772995l-6.772949,0l0,-6.772995z",
            	"junction_1": "m0.99971,146.64024l6.71786,0l0,6.7179l-6.71786,0l0,-6.7179zm7.44043,3.36145l283.11684,0m0.72388,-3.35979l6.71786,0l0,6.7179l-6.71786,0l0,-6.7179zm-145.6413,152.35712l0,-6.71786l6.7179,0l0,6.71786l-6.7179,0zm3.36145,-7.44043l0,-283.11688m-3.35944,-0.72348l0,-6.71786l6.71793,0l0,6.71786l-6.71793,0z",
            	"junction_2": "m0.99971,146.64024l6.71786,0l0,6.7179l-6.71786,0l0,-6.7179zm7.44043,3.36145l121.77922,0c0,-29.3896 38.77921,-31.3896 38.77921,0l122.55841,0m0.72391,-3.35979l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm-145.6413,152.35712l0,-6.71786l6.7179,0l0,6.71786l-6.7179,0zm3.36145,-7.44043l0,-283.11688m-3.35945,-0.72348l0,-6.71786l6.71794,0l0,6.71786l-6.71794,0z",
            	"junction_3": "m143.58945,150.00009c0,-3.49425 2.83032,-6.32455 6.32455,-6.32455c3.49423,0 6.32455,2.83031 6.32455,6.32455c0,3.49423 -2.83032,6.32455 -6.32455,6.32455c-3.49423,0 -6.32455,-2.83032 -6.32455,-6.32455zm-142.59006,-3.35985l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm7.44043,3.36145l283.11682,0m0.72394,-3.35979l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm-145.6413,152.35712l0,-6.71786l6.7179,0l0,6.71786l-6.7179,0zm3.36145,-7.44043l0,-283.11688m-3.35947,-0.72348l0,-6.71786l6.71796,0l0,6.71786l-6.71796,0z",
            	"junction_tee": "m149.914,143.67554zm-148.91461,2.96471l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm7.44043,3.36145l283.11682,0m0.72394,-3.35979l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm-141.61324,2.91669l-0.66661,-141.11688m-3.35947,-0.72348l0,-6.71786l6.71796,0l0,6.71786l-6.71796,0z",
            	"resistor": "m7.868202,151.620193l82.343018,0l11.393402,-32.392784l18.643684,62.356071l20.71521,-63.165901l18.12587,62.356071l19.679459,-61.546242l19.679443,61.951149l10.875488,-30.368195l82.860886,0m-291.18655,-2.813812l6.844604,0l0,6.844635l-6.844604,0l0,-6.844635zm291.194058,-0.465622l6.844604,0l0,6.844635l-6.844604,0l0,-6.844635z",
            	"source_AC_h": "m7.841724,149.837311l67.250737,0m149.928139,0.389923l67.250793,0m-67.653702,-0.227753a74.615135,74.615135 0 1 1-149.230286,0a74.615135,74.615135 0 1 1149.230286,0zm-126.528297,-1.996506c49.250984,-78.535637 61.230949,87.853104 103.826454,2.662094m-200.917796,-4.522659l6.717863,0l0,6.717896l-6.717863,0l0,-6.717896zm291.36706,0.642181l6.717865,0l0,6.717896l-6.717865,0l0,-6.717896z",
            	"source_DC": "m221.862747,94.98175l0,31.813873m-21.510544,-15.906944l43.020996,0m48.613678,39.407722l-121.593582,0m-162.447085,0l115.809275,0m1.040596,-37.757935l7.284134,0l0,75.963058l-7.284134,0l0,-75.963058zm37.461227,-41.623596l7.284134,0l0,158.169647l-7.284134,0l0,-158.169647zm-161.255614,75.613235l6.954941,0l0,6.954971l-6.954941,0l0,-6.954971zm291.012953,0.175003l6.954956,0l0,6.954971l-6.954956,0l0,-6.954971z",
            	"speaker": "m21.35352,187l77,0m-83.70878,3.11937l0,-6.71786l6.71793,0l0,6.71786l-6.71793,0zm6.70878,-76.11937l77,0m-83.70878,3.11937l0,-6.71786l6.71793,0l0,6.71786l-6.71793,0zm155.70878,-32.61937l115,-83l0,296.5l-115,-82.5l0,-131zm-70.99999,0l70.99999,0l0,131l-70.99999,0l0,-131z"
            	}
            }
          • flowchart.json
            {"data": {
            	"manual_input": "m1,103.64394l298,-30.9037l0,154.51852l-298,0z",
            	"callout_left_right": "m1,150.0006l58.10869,-58.1087l0,29.05434l46.81141,0l0,-87.16304l87.1598,0l0,87.16304l46.8114,0l0,-29.05434l58.1087,58.1087l-58.1087,58.10869l0,-29.05435l-46.8114,0l0,87.16306l-87.1598,0l0,-87.16306l-46.81141,0l0,29.05435l-58.10869,-58.10869z",
            	"card": "m1,60.5l59.5,-59.5l238.5,0l0,298l-298,0l0,-238.5z",
            	"collate": "m0,1l299,0l-149.5,149l149.5,149l-299.00031,0l149.50031,-149l-149.5,-149z",
            	"connector_offpage": "m0.99775,0.99775l297.99984,0l0,238.39982l-149.00002,59.60002l-148.99999,-59.60002l0.00017,-238.39982z",
            	"data_stored": "m50.83397,0.99813l249.16667,0c-27.52219,0 -49.83333,66.78392 -49.83333,149.16604c0,82.38213 22.31114,149.16603 49.83333,149.16603l-249.16667,0l0,0c-27.52219,0 -49.83333,-66.78391 -49.83333,-149.16603c0,-82.38212 22.31114,-149.16604 49.83333,-149.16604z",
            	"data": "m1.00038,249.33351l59.60001,-198.66668l238.40001,0l-59.60001,198.66668z",
            	"decision": "m0.99837,149.99953l148.79352,-102.86476l148.79387,102.86476l-148.79387,102.86476l-148.79352,-102.86476z",
            	"delay": "m1,1l149,0l0,0c82.29044,0 149,66.70957 149,149c0,82.29044 -66.70956,149 -149,149l-149,0z",
            	"display": "m1,149.99924l49.66672,-97.42307l198.66612,0c27.43034,0 49.66716,43.61774 49.66716,97.42307c0,53.80476 -22.23682,97.42308 -49.66716,97.42308l-198.66612,0l-49.66672,-97.42308z",
            	"document_multiple": "m1.00054,45.02563l253.99998,0l0,206.43799c-126.99997,0 -126.99997,78.65668 -253.99998,33.96539zm21.49946,-240.92902l0,-19.5l255,0l0,207l-22.5,1m-210.5,-207l0,-25l255,0l0,207l-21.5,0",
            	"document": "m1.00064,1.00098l298,0l0,242.19891c-149,0 -149,92.28223 -298,39.84915z",
            	"filter1": "m75.5,150l74.5,-149l74.5,149l-74.5,149l-74.5,-149zm0,0l149,0",
            	"or_junction": "m0.99865,149.9991l0,0c0,-82.29043 66.70957,-149 149.00001,-149l0,0c39.51724,0 77.41597,15.69817 105.3589,43.64109c27.94292,27.94292 43.64107,65.84166 43.64107,105.35891l0,0c0,82.29041 -66.70956,148.99998 -148.99997,148.99998l0,0c-82.29044,0 -149.00001,-66.70958 -149.00001,-148.99998zm149.00001,-149l0,297.99998m-149.00001,-148.99998l297.99998,0",
            	"preparation": "m1.00063,150.00006l59.58485,-82.24058l178.75446,0l59.58505,82.24058l-59.58505,82.24086l-178.75446,0l-59.58485,-82.24086z",
            	"process": "m1,51.87891l298,0l0,196.24391l-298,0zm37.25,-196.24391l0,196.24391m223.5,-196.24391l0,196.24391",
            	"punched_tape": "m1.00047,30.80047l0,0c0,16.45808 33.35479,29.8 74.50001,29.8c41.1452,0 74.49998,-13.34192 74.49998,-29.8l0,0c0,-16.45809 33.3548,-29.8 74.50002,-29.8c41.14522,0 74.49998,13.34192 74.49998,29.8l0,238.4c0,-16.45808 -33.35477,-29.80002 -74.49998,-29.80002c-41.14522,0 -74.50002,13.34193 -74.50002,29.80002c0,16.45807 -33.35478,29.79999 -74.49998,29.79999c-41.14522,0 -74.50001,-13.34192 -74.50001,-29.79999z",
            	"sequential_data_storage": "m150,299l0,0c-82.29043,0 -149,-66.70955 -149,-149l0,0c0,-82.29043 66.70957,-149 149,-149l0,0c39.51726,0 77.41599,15.69817 105.3589,43.64108c27.94292,27.94293 43.6411,65.84165 43.6411,105.35892l0,0c0,39.51726 -15.69818,77.41599 -43.6411,105.3589l43.6411,0l0,43.6411z",
            	"sort": "m-0.0038,150.00102l299.00334,0m-299.00334,-0.00002l149.50209,-150.00059l149.50131,150.00059l-149.50131,150.00018l-149.50209,-150.00018z",
            	"storage_internal": "m1,1l297.99997,0l0,297.99997l-297.99997,0zm37.25,-297.99997l0,297.99997m-37.25,-260.74997l297.99997,0",
            	"terminal": "m48.94167,99.12235l202.11729,0l0,0c26.47794,0 47.9425,22.7794 47.9425,50.8792c0,28.09979 -21.46457,50.87918 -47.9425,50.87918l-202.11729,0l0,0c-26.47791,0 -47.9425,-22.77939 -47.9425,-50.87918c0,-28.09981 21.46459,-50.8792 47.9425,-50.8792z",
            	"wave": "m1,37.20809c99.33355,-125.42461 198.66708,125.4246 298.00061,0l0,225.76426c-99.33353,125.42462 -198.66706,-125.42459 -298.00061,0z"
            	}
            }
          • game.json
            {"data": {
            	"cards_clubs": "m107.57338,275.50809c15.10838,-15.77673 27.93053,-34.56763 33.34637,-55.90254c-16.19595,12.31328 -31.05006,32.11845 -53.64258,31.36813c-17.05595,0.97891 -37.37346,0.99548 -49.37947,-13.26945c-26.83,-21.5751 -34.03729,-64.69673 -12.00568,-92.15404c15.07669,-19.82526 41.4039,-28.23172 65.56467,-25.25816c15.22319,-6.45935 -2.97749,-22.81502 -4.80785,-33.02267c-11.33012,-37.02704 15.36169,-81.44029 54.60988,-85.70572c28.15103,-4.0415 55.67099,14.18231 69.44571,37.83293c7.4856,16.54877 3.58533,35.33045 1.83887,52.49866c-5.88113,8.62766 -20.94342,29.50022 0.55099,27.85616c21.2518,-0.33633 43.69397,5.90277 57.70761,22.8026c20.49747,22.76067 22.37766,60.37286 1.7551,83.63007c-10.90869,14.16582 -27.2782,25.50356 -45.80551,24.87234c-18.13391,1.83067 -37.77023,-2.10338 -50.62924,-15.92061c-5.48438,-3.84309 -18.92297,-18.36311 -18.91833,-15.17883c13.43222,27.98354 28.62112,57.04413 55.49167,74.38477c9.60062,7.71954 -14.62323,2.41226 -20.4874,3.98563c-35.53012,0.0314 -71.06009,0.06342 -106.59021,0.09497c7.31842,-7.63818 14.6373,-15.27603 21.9554,-22.91422z",
            	"cards_diamonds": "m34.92883,153.9321c25.56111,-56.62673 71.64644,-104.95768 110.85236,-152.92286c45.60773,30.78102 85.01025,98.49872 119.29071,145.66264c-30.57587,54.55344 -74.58923,104.23671 -114.23947,153.1615c-42.74368,-44.7616 -79.29648,-95.90262 -115.90359,-145.90128z",
            	"cards_hearts": "m106.76112,245.09012c-77.74644,-57.80281 -105.54389,-94.36783 -105.76917,-139.13003c-0.20544,-40.80623 34.10907,-80.19025 69.67002,-79.96313c17.75755,0.11364 55.84863,15.13257 69.33681,27.33919c6.79614,6.1504 10.01512,5.54391 25.146,-4.73779c41.17987,-27.98239 81.39243,-28.56973 107.43585,-1.56907c41.62292,43.15273 34.04501,94.68497 -21.78392,148.13782c-29.68187,28.41864 -94.50056,78.8349 -101.35565,78.8349c-2.08591,0 -21.29187,-13.01038 -42.67994,-28.9119z",
            	"cards_spades": "m92.84135,287.13989c18.3756,-17.73279 31.81261,-40.18849 43.07161,-62.94162c6.87787,-9.075 0.36623,-17.01425 -9.00183,-9.3188c-24.07579,16.07495 -56.84848,21.58751 -82.91551,6.92194c-29.46779,-15.23779 -42.75618,-51.47162 -36.07021,-83.04361c4.23415,-31.99545 27.52112,-57.07481 52.80524,-75.08997c29.04437,-20.7771 60.40868,-38.61331 86.95355,-62.67224c11.08365,0.22219 19.42508,17.61496 31.35349,22.21747c31.67316,23.59131 69.20874,40.95643 94.15042,72.50237c12.60098,17.9752 19.78281,40.10946 20.58459,61.98948c-3.83926,29.67093 -21.5314,60.96272 -52.04169,69.41241c-26.37521,7.98038 -53.51129,-2.14038 -76.49545,-15.01619c-2.80743,-0.60251 -13.10471,-8.7151 -9.02362,-2.41039c13.74066,28.19803 28.79581,56.19804 50.59952,79.09325c1.28156,2.89285 11.33243,9.75613 5.98334,9.64709c-44.76935,0 -89.53856,0 -134.30794,0c4.78471,-3.7637 9.5696,-7.5275 14.35449,-11.2912z",
            	"chess_bishop": "m61.92021,296.91153c0.43627,-9.82327 20.22808,-4.98053 9.33225,-14.55078c3.63447,-11.80536 14.91982,-19.66748 21.741,-29.79436c5.22913,-8.62125 17.00826,-19.01086 11.31252,-29.67047c-10.46021,-5.58662 -7.49181,-18.00824 5.30239,-15.28014c8.2272,-7.58801 8.79371,-20.26302 11.57766,-30.59467c2.52694,-12.36574 4.07327,-24.95554 3.66998,-37.5896c-14.99698,0.03661 -30.27584,-0.68196 -44.73978,-4.74928c2.8019,-11.20453 20.86148,-8.79659 28.26084,-15.67982c-6.87532,-6.18329 13.89957,-5.56496 8.46355,-15.34472c-0.37302,-11.20033 -9.19685,-14.44135 -16.26585,-22.60765c-9.44371,-12.76132 5.36173,-25.51221 13.58463,-34.13964c9.16566,-9.37672 19.64847,-19.36716 22.45389,-32.62941c-3.77451,-3.10155 -12.3967,-7.54239 -3.59866,-11.78228c12.01596,-2.03703 24.83499,-2.28521 36.61118,1.05654c7.81644,7.61585 -11.93045,8.03119 -3.43417,17.63365c10.07373,12.07176 -3.50795,18.30174 -11.52704,25.27969c-4.66763,5.89621 -18.59915,13.67189 -16.20224,19.78346c13.63968,-0.47554 21.5871,-13.67976 31.31615,-21.49704c10.67101,-13.68708 20.99446,8.43092 27.81822,15.94714c8.40642,11.39094 2.60674,26.70086 -10.05556,31.59287c-6.28001,6.46729 -10.44972,24.88914 4.57674,22.14657c8.72636,3.17196 -8.52979,3.51371 1.37608,6.446c6.58298,2.52787 32.25821,8.30554 18.1142,16.0547c-12.00471,2.71368 -24.40523,2.6017 -36.6002,1.50584c-0.75204,18.52477 1.89484,36.97644 7.35446,54.6958c1.35513,5.04123 2.71027,10.08244 4.06541,15.12361c6.52129,-0.129 19.98573,-1.55484 13.76321,9.18311c-13.08994,7.21928 -5.0789,22.41203 2.17738,31.05447c8.99446,11.37192 22.40833,22.01788 22.98288,37.58719c3.59734,2.14404 15.56946,8.03415 12.10645,12.64545c-57.30759,-0.2937 -114.6481,0.84897 -171.9265,-1.25046l-1.98901,-0.18246l-1.62205,-0.39337l0,0z",
            	"chess_king": "m75.6993,294.60599c-8.08068,-9.43317 12.65705,-9.68567 9.39906,-20.14252c5.95673,-13.85672 21.44485,-22.24414 23.72572,-37.99019c-6.28166,-4.37628 -9.89445,-14.96013 2.0899,-13.70361c8.78859,-6.61539 7.6902,-20.15297 10.33321,-30.0876c2.47588,-16.03471 3.03656,-32.26408 4.10001,-48.43053c-10.16894,-0.78108 -20.58942,-0.23701 -30.49778,-2.84268c0.28501,-10.75136 20.44619,-6.62604 21.3638,-16.77121c14.65907,-0.2649 0.81196,-22.15992 -5.15776,-27.38371c-7.64118,-8.81222 -12.7306,-22.72323 -6.92168,-33.60618c8.30865,-5.52043 27.09519,-2.1601 26.24604,-16.66769c-5.65058,-3.22095 -12.82484,-1.17552 -19.15805,-1.74514c0.38948,-6.7649 0.77895,-13.52979 1.16843,-20.29469c8.37558,-0.64424 16.75118,-1.28853 25.12676,-1.93283c-4.25133,-4.41846 -10.61392,-7.6702 -12.20608,-13.92034c5.41558,-8.90246 18.46751,-8.1166 27.81776,-8.03243c9.09207,-0.62713 25.66919,5.43749 13.27614,15.20592c-1.00447,2.39887 -10.78024,8.36352 -4.73895,7.71326c7.73515,0 15.47028,0 23.20541,0c-0.02223,6.6133 -0.20001,13.29232 1.35312,19.76423c-5.90448,4.39723 -25.05112,-3.75612 -19.59946,9.81149c6.13853,5.67249 15.53992,5.52279 23.32581,8.02098c4.54138,0.45371 8.15405,1.63713 6.5175,6.94557c0.85359,9.85596 -1.63307,19.77049 -8.40776,27.25217c-4.79567,7.80693 -15.56667,17.58031 -12.3781,26.61691c6.03265,-0.98199 10.87871,2.97905 6.06032,7.43356c4.94479,3.66121 22.35728,2.82278 18.59119,11.98875c-8.82205,2.92029 -18.29916,1.70366 -27.45192,2.00166c2.43703,25.01987 5.80666,50.04211 11.43709,74.54305c3.28979,5.43672 16.35808,9.61523 5.63309,16.70296c-4.00256,13.19919 8.78183,23.08223 16.81097,31.55379c8.82797,6.61176 4.54482,19.91519 17.0338,22.03693c9.83562,9.52774 -13.5036,9.27408 -19.49568,9.29486c-39.66827,0.42773 -79.37933,1.02615 -119.03208,-0.25211c-3.24605,-0.40967 -7.25645,-0.31595 -9.56982,-3.08264z",
            	"chess_knight": "m100.17753,299.2356c-10.0382,0.34137 -24.72987,-4.84531 -14.46609,-16.41525c11.17445,-4.40472 -1.98608,-19.00409 9.21265,-25.88123c8.98889,-12.79953 21.20518,-24.48807 24.89179,-40.11865c-0.57252,-10.60066 -13.22608,-16.87427 -7.18922,-28.60765c-5.92265,-18.77635 -4.55389,-40.38806 6.25748,-57.26643c9.18032,-15.67659 20.32635,-32.28713 19.15084,-51.25797c-11.5139,4.80804 -23.70148,9.0206 -36.37307,6.83708c-11.91311,-1.1064 -22.59742,8.54017 -34.74928,3.29494c-12.31807,-2.55921 -19.64501,-19.02957 -10.4606,-28.65753c10.03679,-8.57325 24.78339,-8.84916 34.35549,-18.41713c12.62932,-10.46186 24.31081,-24.61204 41.71716,-26.46155c7.69322,-1.76131 10.99294,-9.49197 15.25148,-15.2854c3.53894,9.18849 9.69408,17.31353 18.95801,21.387c18.83824,10.9118 23.5276,33.98066 30.47462,52.94444c5.13654,14.85179 9.41592,30.35814 18.01733,43.6171c0.09145,6.36343 -9.56343,9.05308 -3.04225,16.51302c3.39153,20.2325 3.53752,40.95071 3.23686,61.41966c-5.72005,10.01691 -10.93028,21.19722 -3.29993,32.69295c5.09689,14.05096 17.7905,23.26645 24.03563,36.52565c3.53024,6.8656 -6.88226,16.83319 6.09091,15.10654c11.84755,6.2681 2.28101,21.56821 -9.50232,17.11713c-44.15834,1.12289 -88.41394,2.24417 -132.5675,0.9133z",
            	"chess_pawn": "m76.17518,297.98557c-10.50418,1.59836 -25.59558,-8.37918 -12.29734,-17.44669c11.25366,-5.8967 0.45475,-21.25174 12.35514,-28.71019c12.10069,-16.52 24.98341,-33.40712 31.01369,-53.22789c-0.84142,-9.49573 -19.64921,-25.21422 -0.595,-28.29408c15.7114,1.82648 9.96503,-21.69583 15.39529,-31.88779c3.26528,-15.46995 5.63882,-31.19783 5.05293,-47.04268c-10.94164,-0.30554 -22.10724,0.96841 -32.83411,-1.63306c-6.84238,-8.98132 15.45903,-13.45317 19.13895,-21.55999c7.72121,-11.65172 -11.3031,-24.52544 -3.15941,-38.29919c5.20168,-20.85055 29.26575,-34.36854 49.62741,-26.73076c21.08499,5.46792 36.67119,30.37529 26.64961,51.09357c-0.80009,3.99703 -7.062,9.17959 -4.97066,12.36269c9.12987,6.33601 19.70087,11.85771 25.48528,21.64108c-8.18987,5.93826 -21.89375,1.4159 -32.1122,4.23674c-9.29645,8.24593 -0.11353,25.10609 0.36266,36.41936c2.90009,12.9261 5.46037,25.96617 8.78381,38.77452c6.98657,2.72525 21.33679,5.88095 13.4649,17.20207c-11.22217,9.11032 -5.7289,23.62137 0.60231,33.84465c7.87996,15.78793 21.40668,27.84862 29.69345,43.27188c3.07736,7.12057 -7.92374,19.7316 5.78708,16.78259c14.86404,3.15744 5.96938,23.76761 -7.3875,18.8981c-49.21407,1.73288 -98.52922,2.43631 -147.74446,0.51953l-2.31185,-0.21448l0,0z",
            	"chess_queen": "m59.54884,298.46313c-11.18457,2.51251 -19.80814,-14.30008 -5.94004,-16.129c12.20336,0.23074 -3.0349,-11.94995 7.98012,-16.05304c12.67021,-12.36537 25.23749,-25.26018 33.3575,-41.17609c-4.09126,-5.42482 -10.84344,-10.60782 -9.96117,-18.03085c7.964,-2.71161 19.82806,-0.87375 20.29981,-13.44502c7.24239,-22.68985 9.1741,-46.67986 10.76167,-70.3136c-7.99255,-6.33596 -24.45116,-0.33371 -35.62089,-3.56097c-16.94488,-4.5746 6.31873,-13.33291 13.78075,-12.6113c6.70493,0.01006 16.63324,-4.12222 5.41084,-7.2804c9.46686,-0.43687 23.08297,-12.44518 7.51486,-16.77373c11.54188,-8.28655 2.64816,-26.31929 -2.17102,-36.68976c-7.265,-12.52285 -19.21146,-21.59242 -32.71435,-26.42871c-2.18616,-12.77 18.63421,-8.99565 27.07909,-9.65835c12.78728,0.48775 25.82639,-0.15282 36.96732,-7.11507c15.05278,-6.96464 27.8495,4.65901 41.61934,7.11611c13.92807,0.89699 28.41634,-2.50577 41.97807,1.44028c4.20209,2.98911 11.18788,7.71034 2.77457,9.97613c-16.06789,8.94404 -31.07338,22.15693 -35.10127,40.92605c-6.0766,10.44077 4.6955,19.50048 -5.15381,26.98807c-0.10249,8.80961 22.85634,10.04067 10.00395,14.37878c8.80815,4.77542 27.69864,1.76332 29.62625,12.3696c-7.99612,6.2903 -19.2092,3.80788 -28.79007,4.39512c-3.2489,1.10706 -11.41316,-2.70125 -10.17032,2.89742c-0.6366,25.08775 5.87923,49.75521 12.1806,73.83221c0.00804,11.79608 29.09497,5.10777 12.92737,18.49597c-11.94247,10.28146 5.56685,24.68452 11.63272,33.82986c8.25099,10.03221 22.89711,15.11021 21.67468,29.8362c8.40468,0.60507 18.40166,13.69095 6.78131,16.95151c-62.8902,1.31946 -125.82766,2.22778 -188.72791,1.83258z",
            	"chess_rock": "m70.40736,299.11804c-15.60727,2.87628 -15.90823,-19.81082 -1.8931,-20.53482c-4.2011,-9.73361 -0.98556,-21.67557 5.22356,-30.68398c8.90442,-15.05035 22.29623,-30.00999 19.52936,-48.8515c-0.95786,-9.8022 -13.10349,-27.37677 5.72565,-24.85997c5.09087,-9.77498 2.13017,-24.16621 5.9483,-35.39389c3.33424,-21.28385 10.75552,-43.9948 2.86147,-65.09612c-4.97705,-11.23243 -17.62387,-18.62589 -16.26645,-32.35733c-1.42947,-13.39034 -0.95647,-26.88279 0.60455,-40.23392c6.07738,0.50975 12.84039,-1.27954 18.38155,1.475c-0.04153,12.96106 12.26991,10.08973 10.7935,-0.92486c3.23881,-1.28251 8.60017,-0.18413 12.6562,-0.55014c18.03256,0 36.06522,0 54.09778,0c-2.06311,7.51434 3.5195,17.19948 10.5887,8.35272c-1.93379,-11.75267 14.25911,-7.86334 10.37854,2.24694c0.22855,13.39515 1.87041,27.25403 -1.89201,40.29753c-6.12787,5.2086 -6.22449,15.45995 -13.90137,21.60233c-6.16908,11.51656 -3.45045,25.43306 -2.7644,37.9428c2.61279,18.51363 6.92676,36.79671 8.00221,55.52328c-0.76923,10.18126 20.18948,7.18474 11.15244,19.71645c-9.87662,8.41151 -4.0954,22.61668 -0.18413,32.66171c7.71916,17.36203 23.99019,32.95758 21.5343,53.32025c-1.94743,8.89606 14.16618,5.88821 9.97758,17.34372c-0.12151,14.11871 -21.10172,5.04239 -30.39526,8.00793c-46.7146,0.56656 -93.44374,1.44144 -140.159,0.99585z"
            	}
            }
          • math.json
            {"data": {
            	"divide": "m150,0.99785l0,0c25.17819,0 45.58916,20.41097 45.58916,45.58916c0,25.17821 -20.41096,45.58916 -45.58916,45.58916c-25.17822,0 -45.58916,-20.41093 -45.58916,-45.58916c0,-25.1782 20.41093,-45.58916 45.58916,-45.58916zm0,296.25203c-25.17822,0 -45.58916,-20.41095 -45.58916,-45.58917c0,-25.17819 20.41093,-45.58916 45.58916,-45.58916c25.17819,0 45.58916,20.41096 45.58916,45.58916c0,25.17822 -20.41096,45.58917 -45.58916,45.58917zm-134.06754,-193.71518l268.13507,0l0,91.17833l-268.13507,0z",
            	"equal": "m0.99915,31.03476l297.3767,0l0,95.17349l-297.3767,0zm0,47.58677l297.3767,0l0,95.17349l-297.3767,0z",
            	"minus": "m0.99887,102.39503l297.49445,0l0,95.2112l-297.49445,0z",
            	"not_equal": "m40.81188,62.2131l103.7978,0l22.27972,-61.2131l65.67503,23.90375l-13.5795,37.30935l40.20317,0l0,69.88993l-65.64099,0l-12.71893,34.94495l78.35992,0l0,69.88991l-103.79779,0l-22.27972,61.21309l-65.67503,-23.90378l13.57949,-37.30933l-40.20319,0l0,-69.88991l65.64102,0l12.71894,-34.94498l-78.35995,0z",
            	"times": "m1.00089,73.36786l72.36697,-72.36697l76.87431,76.87368l76.87431,-76.87368l72.36765,72.36697l-76.87433,76.87431l76.87433,76.87431l-72.36765,72.36765l-76.87431,-76.87433l-76.87431,76.87433l-72.36697,-72.36765l76.87368,-76.87431l-76.87368,-76.87431z",
            	"plus": "m1.00211,102.40185l101.39974,0l0,-101.39975l95.45412,0l0,101.39975l101.3997,0l0,95.45412l-101.3997,0l0,101.3997l-95.45412,0l0,-101.3997l-101.39974,0z"
            	}
            }
          • misc.json
            {"data": {
            	"3_ways": "m1,159.61292l52.87097,-52.87097l0,26.43549l69.69355,0l0,-79.30646l-26.43549,0l52.87096,-52.87097l52.87097,52.87097l-26.43549,0l0,79.30646l69.69356,0l0,-26.43549l52.87096,52.87097l-52.87096,52.87097l0,-26.43549l-192.25807,0l0,26.43549l-52.87097,-52.87097z",
            	"3D_plane_1": "m1,187.25l74.49999,-74.5l223.49998,0l-74.5,74.5l-223.49997,0z",
            	"3D_plane_2": "m112.75,75.50002l74.5,-74.50002l0,223.50002l-74.5,74.49998l0,-223.49998z",
            	"babe": "m299.04794,205.18787c-3.77606,12.02469 -14.23288,15.70245 -23.42029,7.51477c-4.99579,-3.63025 -15.93668,-4.01721 -8.27643,4.11765c4.3663,3.89154 12.96597,18.43826 2.6701,7.63031c-6.72076,-9.88528 -21.45963,-10.97299 -26.80637,-21.01428c-0.7126,-12.09052 -19.01982,-9.85156 -28.21417,-13.29294c-7.97734,0.2787 -20.34282,-8.29872 -23.22426,-8.2877c7.17442,8.54059 6.05238,22.25063 13.10196,29.89879c9.38933,2.61444 12.97119,14.02899 0.81691,15.99643c-14.79422,5.33719 -12.22833,-12.63193 -20.04561,-20.07751c-5.76567,-2.6597 -0.17117,23.97388 -5.6981,17.70459c0.14073,-11.08301 -5.26385,-21.19345 -7.43376,-31.72055c3.66939,-3.90994 3.24513,-15.0824 -1.24792,-6.28702c-9.32401,15.52066 -21.53839,29.02148 -33.42717,42.58749c-12.32529,3.3429 -25.61986,1.75922 -38.28926,0.99091c-13.33909,0.21539 -16.41985,-23.40515 -24.5597,-24.14911c-1.69956,6.7645 0.04348,10.7413 3.54543,14.16528c-5.43895,6.35352 -17.0083,4.24969 -24.32439,1.67859c-12.99512,4.18167 4.10523,-7.37332 9.39456,-5.37735c0.12955,-9.23239 1.69711,-21.43146 -1.15234,-30.31955c-4.26376,-4.21536 -13.54346,-25.27448 -12.61225,-10.56541c-2.43563,17.92097 -10.72475,34.53096 -12.64814,52.59737c-1.6411,10.13943 -15.83897,5.33594 -23.08624,5.82672c-7.30112,2.27881 -6.50991,0.30469 -13.11051,0.69199c7.01961,-9.43863 23.73587,-3.27213 28.50491,-13.30713c2.12957,-14.98691 1.05568,-30.67914 6.12082,-45.11276c-2.11474,-14.92252 -6.78208,-29.69904 -6.85915,-44.79436c2.37534,-9.86703 8.15515,-18.85688 7.95601,-29.33565c4.35726,-11.70351 7.18935,-24.90283 15.98966,-34.19202c9.32926,-10.04192 23.95938,-2.34001 28.82026,8.23518c5.23969,11.5593 -2.89557,23.16132 -3.7411,34.79802c10.97217,2.97472 2.07053,18.22128 16.21945,16.77118c11.11885,1.02463 7.90206,16.12445 0.58741,20.71976c-0.2656,7.05571 8.13246,16.23514 6.20955,25.48418c5.50479,6.05925 12.30074,9.05171 12.7784,-1.61943c3.7646,-14.17346 5.15414,-29.11295 11.81579,-42.45001c2.65157,-10.67883 13.6115,-24.48097 25.27724,-15.69678c10.81068,5.92413 13.54153,23.94177 22.32231,28.34891c10.75034,-9.00977 20.01573,4.53285 28.83136,9.38853c13.27853,7.35518 24.98924,17.12993 37.79256,25.23851c13.37863,6.81644 27.61211,12.28633 40.07347,20.72394c8.47791,4.65475 17.41223,-4.71762 19.34897,6.49048zm-149.77098,-49.39249c-1.45267,7.65393 4.38054,3.60388 0,0z",
            	"bevel": "m24.5,277l-24,23m276,-22l23,22m-23,-274l23,-24m-275,23l-23,-22m23,21.5l252,0l0,252l-252,0l0,-252zm-23.5,-23.5l299,0l0,299l-299,0l0,-299z",
            	"bone": "m273.3559,119.27242c-11.58661,5.90293 -23.89537,9.95385 -36.67676,12.27164c-53.42084,0.2984 -105.13121,0.41397 -158.74251,2.97562c-14.28426,-2.65407 -30.58815,0.18161 -42.82426,-9.13783c-9.06827,-7.25944 -28.17529,-2.4415 -25.05096,11.36483c6.17649,14.08824 -14.61965,21.70474 -7.59176,36.00003c6.11589,14.67987 24.54805,9.02721 35.59484,4.1729c20.29636,-4.79665 40.55842,-9.8537 60.92737,-14.38416c42.52868,-4.82219 82.54949,-1.83121 124.59118,1.02063c11.68694,2.54654 23.55803,4.03351 35.45654,5.38187c10.1839,0.16006 18.34979,7.46698 27.92017,8.65919c12.6539,-1.22533 16.41983,-19.19981 7.59747,-27.17406c-13.18918,-8.72406 6.75436,-24.14882 -8.14166,-31.38885c-4.25287,-2.31086 -8.733,-0.75754 -13.05966,0.23817z",
            	"chord": "m277.04315,255.07486c-47.63342,47.63342 -121.3194,57.33392 -179.65791,23.65366c-58.33851,-33.6824 -86.78111,-102.34741 -69.34571,-167.41564c17.43547,-65.06779 76.39998,-110.31287 143.76268,-110.31287l105.24094,254.07486z",
            	"circle_band": "m1,224.5l0,0c0,-82.29044 66.70957,-149 149,-149c82.29042,0 149,66.70956 149,149l-74.5,0c0,-41.14522 -33.3548,-74.5 -74.5,-74.5c-41.1452,0 -74.5,33.35478 -74.5,74.5z",
            	"circle_pie": "m299,150l0,0c0,82.29044 -66.70956,149 -149,149c-82.29044,0 -149,-66.70956 -149,-149c0,-82.29043 66.70956,-149 149,-149l0,149z",
            	"cube": "m30.42785,1.56129l-29.42785,29.42785l0,268.21907l264.28937,0.68124l33.35693,-30.10974l0,-268.21843l-268.21845,0zm236.46521,28.94674l0,269.42122m0,-269.42122l33.35693,-29.50804m-33.35693,30.791l-265.57233,-1.28296",
            	"dagger": "m1.57422,47.21264c-2.775,14.24454 5.08469,27.79975 11.2199,40.10517c13.07098,21.70464 28.2358,42.59465 47.26681,59.46329c12.98537,10.6889 24.68548,22.99878 39.38902,31.4678c19.22253,12.95224 39.86254,23.55869 61.26455,32.3793c15.9138,6.93546 32.60274,11.85577 49.65401,15.08282c4.95967,1.28564 18.82625,4.91663 10.19991,-3.60251c-7.15544,-3.02133 -14.76756,-5.22583 -21.96236,-8.37695c-34.92769,-14.34082 -72.04247,-26.94104 -100.21951,-53.10463c-4.66899,-6.20064 8.95855,3.3492 11.3067,5.96803c23.50703,16.73581 50.36192,27.95749 76.84653,39.04178c13.47301,4.46384 28.20039,13.97903 42.51408,7.22675c12.36502,-4.72467 -2.95702,-5.44891 -8.42033,-7.24844c-24.28337,-6.90491 -48.85286,-13.54227 -71.13893,-25.76019c-12.72568,-4.65573 -23.42126,-13.22678 -34.85331,-20.29132c-12.35065,-8.53128 -23.65424,-18.49934 -35.67798,-27.49634c-7.86864,-5.96642 -15.68669,-11.98865 -22.20108,-19.46664c-11.01625,-11.02383 -21.70009,-22.36108 -31.68482,-34.33246c-6.52307,-7.36439 -13.86146,-14.10685 -18.44664,-22.93894l-5.05655,-8.11652zm256.45175,139.13108c-1.50562,-0.04745 -3.06,0.28214 -4.36211,1.15021c-9.72246,4.86124 -7.63908,13.88922 -13.19478,20.83386c-4.16678,5.55569 -9.028,8.33356 -15.97261,10.41693c1.38892,2.77783 4.16675,6.94461 4.16675,10.41693c0,7.63907 -9.02798,14.58368 -15.97261,13.88922c-2.77786,-0.69446 -9.028,-4.16678 -11.11139,0c-0.69446,1.38895 -0.69446,2.77786 0,3.47232c0,2.77786 3.47231,4.16678 6.25015,5.55569c7.63908,2.08337 15.97263,-0.69446 22.22279,-4.86124c4.86122,-2.77783 8.33353,-7.63907 9.72246,-13.19479l1.38892,-9.02798c0.69446,-2.77783 3.47232,-3.47232 6.94463,-8.33353c4.16676,-5.55569 8.33354,-15.2782 13.88924,-19.44495c2.08337,-1.38892 4.16675,-2.0834 6.94461,-2.77786c-1.38892,-2.08337 -2.77786,-3.47229 -4.16678,-5.55566c-1.38892,-0.69449 -2.77783,-2.0834 -4.16675,-2.0834c-0.78128,-0.26041 -1.6792,-0.42728 -2.58252,-0.45575zm29.4061,26.21594c-2.61084,-0.02899 -5.33868,0.54254 -8.07312,1.32382l5.55569,3.47232c-1.38895,2.77783 -4.86121,8.33353 -4.16678,11.80585c0.69449,6.94461 10.41693,6.94461 14.58371,2.77783c4.86124,-5.55569 4.86124,-13.88922 -2.08337,-18.056c-1.82297,-0.91147 -3.78549,-1.30127 -5.81613,-1.32382zm-13.39011,3.40723c-0.54364,0.00192 -1.07498,0.00705 -1.60593,0.0217c-3.8486,0.21091 -7.69568,0.50116 -11.54541,0.67276c-2.41867,0.03116 -4.88754,-0.00473 -7.22676,0.69446c-3.17285,2.02515 -5.29396,5.38272 -6.53229,8.87607c-0.16666,0.50345 -0.30807,1.02072 -0.41234,1.54083c3.86218,1.74924 8.17189,1.5618 12.30499,1.41064c2.50439,-0.06696 5.00949,0.24561 7.50888,0.36893c1.7876,0.07916 3.57104,0.32327 5.36038,0.26044c2.19412,-0.07278 4.22598,-1.3168 5.38205,-3.16849c0.99927,-1.58255 1.9447,-3.21933 2.56085,-4.99146c0.49768,-1.59048 0.5896,-3.80087 -1.06339,-4.75272c-1.43857,-0.79446 -3.10013,-0.93906 -4.73105,-0.93317zm2.53915,15.9726c-0.69449,0.69446 -1.38892,0.69446 -2.0834,1.38892c-0.69446,3.47232 8.33356,11.80588 9.72247,4.16678c-3.47232,-1.38892 -5.55573,-2.77786 -7.63907,-5.55569z",
            	"diamonds": "m79.28394,70.5173l69.51914,-69.51918l69.53062,69.51918l-69.53062,69.5193l-69.51914,-69.5193zm-78.28265,78.73502l69.53064,-69.51916l69.51917,69.51916l-69.51917,69.53081l-69.53064,-69.53081zm158.04381,1.41991l69.53076,-69.50788l69.50775,69.50788l-69.50775,69.53059l-69.53076,-69.53059zm-78.26005,78.74646l69.50779,-69.51927l69.53087,69.51927l-69.53087,69.5197l-69.50779,-69.5197z",
            	"dog": "m244.35188,22.54387l-69.54898,69.54889c-119.32899,0.00291 -120.2569,-0.00142 -121.18423,0c-10.16035,0.01348 -20.31404,-0.04446 -30.47281,0.1654c-17.41192,-3.13311 -29.41997,20.08429 -17.10143,32.59326c9.91919,10.04415 24.91881,5.84701 37.58711,6.70858c0.082,39.19679 0.15858,78.39276 0.24066,117.58955c-1.93424,11.60912 7.01076,23.37389 18.92138,24.38115c10.04872,1.3252 21.64701,-4.10141 24.54638,-14.3645c2.0378,-20.77086 0.69009,-41.75818 1.06802,-62.62978c15.7105,0 58.3028,0.55273 93.34407,0.94731c0.05244,10.48698 0.11156,36.08763 0.16484,43.1525c-0.20064,9.60797 -0.94731,36.79358 17.44778,36.82019c18.39429,0.02664 19.96759,-19.29745 19.74867,-23.16328c-0.13904,-5.1078 0.14149,-42.99934 0.54108,-56.44814c2.24173,0.01166 4.87888,0.02997 6.54291,0.02997c-0.00998,-0.00999 -0.01997,-0.01997 -0.02995,-0.02997c0.10487,0.06078 0.2106,0.11987 0.31549,0.18065c0.19894,-16.80684 -0.38959,-50.0226 -0.04497,-66.82692c15.38005,-0.19313 30.76425,-0.09573 46.14514,-0.13486c13.52618,3.45377 34.10559,-4.10139 23.59946,-20.81667c-16.37396,-18.52205 -34.58011,-35.37009 -51.83061,-53.07936l0,-34.62398z",
            	"frame_half": "m1,1l297,0l-98.99899,98.99902l-99.00199,0l0,99.00198l-98.99902,98.99901z",
            	"hand_stop": "m136.25574,297.49808c-29.33714,-5.08954 -54.45634,-27.86633 -62.06976,-56.71431c-3.62096,-14.72525 -1.50079,-30.17319 -2.21442,-45.21799c-0.13461,-38.62221 -0.20337,-77.24464 -0.30453,-115.86696c3.44471,-11.98872 17.98409,-18.29414 29.04424,-12.36688c0.96214,-3.14931 0.25692,-8.79729 0.59418,-12.8885c-1.96137,-11.24498 6.05913,-22.68389 17.70836,-23.44487c6.68523,-0.04347 14.68906,5.03699 11.64235,-6.21321c-2.06573,-11.58701 7.02885,-24.78486 19.46753,-23.71677c11.8866,-1.10308 20.91313,10.99307 19.47894,22.20545c0.55293,6.69356 15.04739,-4.38583 20.11427,3.0555c6.46245,3.83537 10.88301,11.15349 9.66263,18.71955c0.37462,20.72639 -0.50464,41.58417 0.94255,62.21075c10.62856,-5.38028 25.7729,1.23052 27.94981,13.06696c-0.24077,36.77421 0.61372,73.57438 -0.64664,110.32743c-4.27835,37.80429 -40.23309,69.77301 -78.61711,67.50256c-4.25351,0.01132 -8.54422,0.05313 -12.75241,-0.65872zm26.24695,-10.04156c32.22029,-5.44516 57.56776,-36.59567 55.75252,-69.35173c0.24638,-31.65953 1.24834,-63.36566 0.07516,-95.00381c-0.74966,-11.56753 -19.92574,-8.76712 -18.68594,1.90652c-0.00584,23.46449 -0.01172,46.92897 -0.01762,70.39346c-5.97046,6.15695 -16.65688,2.44864 -23.81619,7.45261c-15.91585,6.94403 -26.02902,23.94809 -26.37592,41.0688c-8.5842,13.31046 -12.47054,-8.35147 -7.54663,-15.48785c5.69263,-21.52615 25.72418,-37.58736 47.72688,-39.6965c-0.18001,-49.52237 0.46608,-99.06258 -0.57811,-148.57061c-6.22968,-14.02401 -23.68619,-1.72364 -19.04016,10.55674c-0.45773,37.44105 -0.04761,74.89084 -0.68825,112.32923c-4.16106,6.65674 -12.04573,0.3437 -9.47389,-5.79948c-0.17776,-46.90031 -0.35556,-93.80062 -0.53333,-140.70093c-3.33864,-8.28292 -18.12991,-6.98883 -18.3627,2.10197c-0.18286,48.40011 -0.36572,96.80021 -0.5486,145.20032c-3.89212,5.48285 -11.88664,0.71593 -9.73376,-5.26897c-0.14377,-36.45805 0.40013,-72.93186 -0.55034,-109.37686c-0.24316,-10.84745 -18.40633,-10.5788 -18.64873,-0.51889c-0.36327,37.37112 0.09734,74.76224 -0.99649,112.11712c1.02982,9.51479 -12.37218,4.97615 -9.28424,-2.22137c-0.16375,-25.39479 0.44627,-50.81747 -0.58949,-76.18918c-6.1088,-15.65501 -24.37704,-2.73073 -19.28278,10.2811c0.06127,45.03139 -0.41048,90.08521 0.72834,135.10263c2.79378,34.58762 36.09247,63.06729 70.73276,60.79437c3.26721,-0.13614 6.52469,-0.50925 9.73752,-1.11868z",
            	"L_shape": "m1,1l149,0l0,149l149,0l0,149l-298,0l0,-298z",
            	"lightning_bolt": "m117.48906,0.99793l60.3351,83.60071l-24.88768,9.85823l75.99797,71.63888l-24.88768,11.96198l93.95412,119.94316l-159.33742,-91.91997l30.38835,-12.76016l-99.00077,-58.87717l35.47526,-18.19279l-104.52837,-61.76487l116.49113,-53.48799z",
            	"logo_apple": "m209.28954,1.00088c-43.04727,7.92585 -57.33284,43.96882 -57.8894,64.561c23.68694,1.71168 38.47275,-11.65597 44.5219,-19.4791c9.85237,-11.09263 12.25443,-26.71591 13.36751,-45.0819zm5.28372,71.19604c-31.11621,-0.01418 -48.48506,12.70539 -57.04939,12.84402c-9.82712,-0.76584 -38.46593,-12.28108 -55.16231,-12.46661c-58.47802,1.74345 -75.23289,65.28636 -74.50751,92.61087c4.76329,104.60263 68.59296,131.60016 79.02421,134.12564c8.36713,1.64984 36.57712,-12.89731 57.32939,-12.23529c22.65837,2.3606 38.49214,11.76068 47.58983,11.10309c11.51012,-0.79871 49.05655,-31.14218 60.37299,-77.89201c-22.81836,-19.29358 -36.89403,-36.77824 -38.15468,-53.37267c-0.584,-7.50279 10.70016,-49.91425 28.69514,-61.83392c2.59723,-14.65567 -24.13031,-33.25182 -45.08191,-32.83442c-1.03252,-0.02777 -2.05203,-0.0482 -3.05577,-0.04871z",
            	"man": "m125.90131,25.2503c0,-13.33112 10.79823,-24.12934 24.12934,-24.12934c13.33113,0 24.12932,10.79822 24.12932,24.12934c0,13.33112 -10.79819,24.12934 -24.12932,24.12934c-13.33113,0 -24.12934,-10.79822 -24.12934,-24.12934zm81.12696,68.30144v-12.18601c0,-12.82147 -10.38806,-23.21696 -23.21696,-23.21696h-67.63607c-12.82147,0 -23.21695,10.39549 -23.21695,23.21696v12.18601c-0.02242,0.2766 -0.03739,0.56071 -0.03739,0.84853v70.18918c0,5.4538 4.41839,9.87215 9.87218,9.87215c5.44633,0 9.87589,-4.41837 9.87589,-9.87215v-69.14999h6.62006v79.02961h0.04859v111.66646c0,7.25925 5.89491,13.15787 13.16164,13.15787c7.27048,0 13.16164,-5.89114 13.16164,-13.15787v-111.66646h8.68347v111.66646c0,7.25925 5.89856,13.15787 13.16162,13.15787c7.27045,0 13.16161,-5.89114 13.16161,-13.15787v-111.66646h0.04112v-79.02961h6.62007v69.14623c0,5.45381 4.42955,9.8759 9.8759,9.8759c5.45386,0 9.87218,-4.42209 9.87218,-9.8759v-70.18916c-0.00371,-0.29156 -0.02617,-0.56819 -0.0486,-0.8448z",
            	"maximize_2": "m1,149.99998l67.05,-67.05l0,33.52501l48.425,0l0,-48.425l-33.52501,0l67.05,-67.05l67.04999,67.05l-33.52499,0l0,48.425l48.42502,0l0,-33.52501l67.04997,67.05l-67.04997,67.04999l0,-33.52499l-48.42502,0l0,48.42502l33.52499,0l-67.04999,67.04997l-67.05,-67.04997l33.52501,0l0,-48.42502l-48.425,0l0,33.52499l-67.05,-67.04999z",
            	"moon": "m227,299.94119l0,0c-85.05185,0 -154,-66.92029 -154,-149.4706c0,-82.55034 68.94815,-149.4706 154,-149.4706l0,0c-48.47263,35.28521 -77,90.6619 -77,149.4706c0,58.80869 28.52737,114.18535 77,149.4706z",
            	"mythic_unicorn_2": "m182.0204,297.85391c-5.77818,-7.90314 -14.7635,-8.80438 -16.9241,-20.05347c-1.69348,-6.11859 -17.65829,-14.32483 -8.20955,-3.3428c7.2961,6.61768 15.96432,31.02682 -1.98563,23.31473c-13.65228,-5.01041 -14.2377,-20.48209 -17.89716,-32.06519c-11.90031,-8.25644 3.07674,-25.71408 -9.73651,-36.29276c-10.87482,-11.04288 -3.30119,-31.72456 -18.8404,-39.55457c-7.79965,-3.16566 -11.1757,18.69177 -12.48895,2.70163c-4.27309,-16.17242 -19.36451,7.86156 -29.42789,5.31358c-8.12057,-0.70595 13.58361,-6.35143 3.22626,-7.87068c-6.08933,3.33348 -11.72343,9.09727 -12.68681,-0.44351c-7.3251,-4.35046 -22.68599,-11.29797 -22.28696,-18.20909c6.3611,-1.99829 27.83545,3.78387 24.11403,-4.25029c-6.38573,-2.42343 -7.54573,-9.04803 0.27553,-4.60205c15.41352,0.48352 33.48255,-5.66917 46.30758,6.09853c6.68958,4.11612 13.26701,18.87857 16.84827,4.53223c11.5443,-13.92389 34.83883,-15.10329 41.95536,-33.13124c1.72211,-8.72215 -5.28903,-13.69839 -11.24521,-15.46512c-1.15878,-2.86641 -3.13139,-15.03612 -8.05675,-8.8949c0.22449,-5.37502 4.84473,-18.22859 -5.38927,-12.53831c-1.03801,-11.44846 8.74879,-22.87025 -4.19783,-31.20716c12.13029,2.25027 9.73825,-11.57887 7.09616,-13.77212c7.19073,-1.02106 15.62939,-7.49186 11.66467,-15.50808c7.80894,14.17675 8.07971,-17.19902 14.50877,-3.67512c11.83272,1.93988 -3.67599,-10.57163 7.20721,-7.77902c6.21443,0.21264 4.83423,-6.80917 10.41692,-1.50957c7.3886,-4.03149 -5.66409,-16.21531 6.26559,-7.74985c4.01033,3.484 16.77809,12.60911 14.48726,0.56772c11.33586,12.0923 20.25659,-11.23169 29.67625,-16.06186c3.73633,-4.47003 11.8613,-9.20071 4.36795,-0.66791c-4.97461,10.87669 -21.85179,22.64296 -17.31131,33.45053c-4.10985,3.74163 8.29224,8.44421 -1.58034,7.02768c-5.8488,6.31351 7.84134,18.1257 8.93388,28.06219c-3.13588,6.80826 -15.07657,14.53744 -19.90688,14.29315c1.76543,-8.76564 -2.06178,-20.19066 -13.24036,-15.23595c6.26202,11.45789 14.72818,22.40379 20.03253,34.86404c5.18462,12.24902 13.59059,26.39416 24.64981,10.62966c7.04883,-10.04763 27.18559,-9.90218 21.65419,6.41521c-2.82767,16.0232 4.74286,37.1706 -9.80374,48.20794c-8.77531,16.90973 -18.50392,-6.2874 -11.60965,-15.06308c-1.75673,-2.50781 -3.11575,-4.27809 2.02489,-7.7061c-1.06146,-2.57137 14.7939,-12.24554 6.80286,-18.18176c-9.0885,10.30594 -22.38708,22.23511 -18.69125,37.55475c2.99957,10.26601 -21.73944,27.86615 -19.76117,10.82875c0.44312,-6.62131 9.89648,-19.45415 7.72044,-21.10741c-6.90181,12.95006 -16.71997,25.39136 -31.55621,29.23625c-12.34084,0.73132 -18.80547,10.66779 -12.94504,21.69241c1.11998,15.62238 -7.12646,29.76141 -9.02499,44.972c3.52914,16.13283 25.01552,19.39287 27.93198,35.84959c5.01138,11.05234 -7.52405,9.41898 -13.36446,6.32639zm-30.55545,-48.12944c-1.80891,-7.29253 -5.53151,18.95699 -0.94273,5.02481l0.68695,-2.46143l0.25578,-2.56339z",
            	"page": "m249.3298,298.99744l9.9335,-39.73413l39.73413,-9.93355l-49.66763,49.66768l-248.33237,0l0,-298.00001l298.00001,0l0,248.33234",
            	"people_business_woman_1": "m152.09991,291.25156c-2.47678,-44.58551 4.65103,-89.4209 -0.87244,-133.89311c-8.95648,25.8877 -13.19429,53.17113 -13.68393,80.52692c-0.41364,17.0155 -0.16316,34.03816 -0.23213,51.05714c-6.59424,1.84573 -15.25726,1.21277 -19.31381,7.46753c-5.79991,2.60486 -12.31924,1.35736 -18.48087,1.65521c6.01304,-4.82208 13.37695,-9.59021 13.6609,-18.23849c6.31746,-52.60599 2.67181,-105.66583 3.06088,-158.49306c0.43537,-21.1868 -1.16552,-42.66898 2.64828,-63.61227c2.03822,-10.62624 19.15558,-5.1272 18.60609,-18.67488c3.03041,-11.80116 0.67964,-26.03735 9.52867,-35.60117c10.5938,-7.7376 21.95103,4.42952 20.767,15.48053c1.06621,11.41806 -1.19225,25.92375 9.12468,33.77226c11.50188,2.75379 13.11151,17.72176 18.13281,26.80961c4.23164,10.69022 9.72182,23.87735 0.08774,33.44124c-5.93716,8.68594 -16.90076,16.78377 -12.99744,28.7057c-0.60452,31.03065 -6.76558,61.62357 -9.34036,92.51013c-2.09418,17.62329 -2.81628,35.5533 -6.9491,52.84404c-0.55614,5.69342 -5.84515,19.49838 -12.14343,10.53711c-0.87442,-1.99588 -1.26941,-4.15509 -1.60355,-6.29443zm-31.23076,-126.74179c-4.61314,-4.02649 0.43039,13.47859 0.48324,1.7234l-0.48324,-1.7234l0,0zm6.80929,-33.43718c-1.88333,-6.96362 -7.13425,10.3817 -5.38842,14.89726c-0.28574,6.8293 0.74596,4.17953 2.10389,-0.81731c1.48602,-4.58557 2.79638,-9.27054 3.28453,-14.07996zm61.63647,-23.18116c5.52028,-11.36497 -2.7056,-23.94508 -11.13263,-31.31998c-8.36171,1.6476 -4.1756,17.26677 -4.09579,24.50607c-0.37729,9.19583 11.31773,21.60236 15.22842,6.8139zm-59.09369,-11.57291c-3.00658,-5.39182 -0.968,23.24248 0.49254,8.1709c0.11818,-2.72906 0.0034,-5.48079 -0.49254,-8.1709z",
            	"plant_tree_1": "m122.82124,295.43991c-9.60714,-8.11343 -1.74962,-22.4458 -1.18428,-32.9653c4.14859,-11.24323 3.96359,-85.81235 -10.94936,-86.09872c-15.83897,-4.80884 -33.8653,1.83771 -48.3958,-7.59918c-9.84084,-5.82912 -12.90007,-17.71764 -12.64209,-28.40579c0.19444,-11.07701 -10.96857,-15.73981 -14.56149,-25.02111c-4.85892,-11.57952 -0.66407,-24.81283 7.67092,-33.63805c7.87535,-8.99152 0.96225,-20.76784 4.99341,-30.60822c5.74977,-13.3805 22.92119,-7.46461 32.14548,-16.67288c9.90182,-6.99356 18.35265,-19.09785 32.07681,-17.29906c13.25371,0.83774 28.05221,3.21463 39.26759,-5.80136c10.45538,-8.74133 25.08881,-13.41753 38.21471,-8.04486c12.4521,3.84588 26.61226,11.87612 26.66945,26.64145c-3.79947,15.14795 10.55962,14.96229 20.88582,17.05112c12.22475,5.50745 24.82689,14.06517 29.88231,26.94686c1.34924,14.72554 -15.32854,26.93484 -7.76337,41.96729c2.96521,14.64848 -9.76962,22.78136 -18.92447,30.72028c-3.76666,14.33221 -18.04883,25.98621 -33.39958,22.57785c-12.36432,-2.02824 -19.98886,11.49191 -32.59709,10.30693c-8.35739,8.60075 -2.66228,82.40933 -1.11533,92.59302c6.29385,12.59021 -2.48013,26.51376 -16.65036,26.0885c-11.10333,1.33105 -23.19679,1.95465 -33.62328,-2.73877z",
            	"rectangle_2_rounded": "m50.66998,1l198.6639,0l0,0c13.17268,0 25.80577,5.2328 35.12022,14.54726c9.31445,9.31446 14.54727,21.94758 14.54727,35.12021l0,248.33141c0,0.00134 -0.00116,0.00247 -0.0025,0.00247l-297.99637,-0.00247l0,0c-0.00136,0 -0.0025,-0.0011 -0.0025,-0.0025l0.0025,-248.3289l0,0c0,-27.43059 22.23686,-49.66747 49.66748,-49.66747z",
            	"rectangle_3_rounded": "m50.66972,1l248.33028,0c0.0007,0 0.00134,0.00024 0.00177,0.00072c0.00049,0.00048 0.00076,0.00108 0.00076,0.0018l-0.00253,248.32779c0,27.43044 -22.23679,49.66722 -49.66722,49.66722l-248.3303,0l0,0c-0.00138,0 -0.00248,-0.00113 -0.00248,-0.0025l0.00248,-248.32779l0,0c0,-27.43045 22.23678,-49.66723 49.66724,-49.66723z",
            	"ribbon_up": "m0.99887,298.99884l37.37486,-124.16641l-37.37486,-124.16684l74.74943,0l0,-37.25092l0,0c0,-6.85776 4.18383,-12.41691 9.34372,-12.41691l130.81201,0c5.16063,0 9.34372,5.55916 9.34372,12.41691l0,37.25092l0,0l74.74974,0l-37.37488,124.16684l37.37488,124.16641l-102.7809,0c-5.15987,0 -9.3437,-5.55884 -9.3437,-12.41577c0,-6.85834 4.18384,-12.41724 9.3437,-12.41724l18.68744,0c5.16063,0 9.34372,-5.5603 9.34372,-12.41721c0,-6.85834 -4.18309,-12.41722 -9.34372,-12.41722l-130.81201,0c-5.15989,0 -9.34372,5.55888 -9.34372,12.41722c0,6.85693 4.18383,12.41721 9.34372,12.41721l18.68743,0c5.1606,0 9.34372,5.5589 9.34372,12.41724c0,6.85693 -4.18312,12.41577 -9.34372,12.41577zm121.79819,-30.86179l-0.71873,-217.77046m-149.49945,214.90504l0.71875,-213.47234m110.6871,199.14535l0.71873,41.54834m-74.03098,-1.43271l-0.71874,-40.11563",
            	"sflowchart_filter2": "m1,75.5l298,0l-149,74.5l149,74.5l-298,0l149,-74.5l-149,-74.5z",
            	"sign_no": "m0.99794,149.99951l0,0c0,-82.29002 66.70967,-148.99969 148.99992,-148.99969l0,0c39.51779,0 77.41692,15.69819 105.35898,43.64116c27.94318,27.94297 43.64124,65.84185 43.64124,105.35853l0,0c0,82.29103 -66.7092,149.00024 -149.00021,149.00024l0,0c-82.29025,0 -148.99992,-66.70921 -148.99992,-149.00024zm240.6012,66.65504l0,0c32.80489,-45.08388 27.92851,-107.33437 -11.49672,-146.75905c-39.42525,-39.42501 -101.67574,-44.30139 -146.75847,-11.49616l158.25519,158.25521zm-183.20167,-133.30872c-32.80512,45.08364 -27.92886,107.33413 11.49615,146.75825c39.4249,39.42525 101.67541,44.30159 146.75814,11.49672l-158.2543,-158.25497z",
            	"skull": "m74.9404,81.44109c-2.88919,16.35929 -10.26919,31.99403 -10.76614,48.86361c0.66122,9.76746 -5.89156,15.01402 -14.86213,14.8293c-9.64813,10.00099 1.19087,25.80647 12.10749,29.84357c11.14103,7.47832 24.96226,-0.87791 35.99846,5.83044c14.65424,11.4554 20.77205,31.76607 15.71635,49.57211c-5.02672,14.69893 20.70476,9.35306 11.02628,-2.39693c-7.47506,-11.48471 14.09103,-7.68764 8.56998,3.21603c-1.04326,8.75262 6.45616,11.58562 3.11867,20.06531c8.69472,4.98558 -0.72885,7.77708 -6.02475,8.71843c-12.40178,6.18225 2.24324,-11.07452 -7.58144,-16.17874c-8.99694,1.95532 -2.90059,17.02136 -5.98875,15.28125c-6.3575,-4.97824 -6.35281,-23.59047 -17.02285,-11.44621c-3.54128,-14.96387 2.92009,-30.54814 -2.05737,-45.42514c2.03897,-11.11034 -15.50281,-14.9426 -13.28409,-2.05647c0.88449,19.66696 -5.0876,39.29475 -1.66005,58.86481c4.72071,12.07065 17.92378,17.50833 26.2104,26.82291c6.80557,7.18207 15.6284,14.86087 26.22089,12.5997c12.0141,-0.52078 24.05035,-1.63034 36.01024,0.2771c15.04311,0.47446 26.52666,-11.41623 39.36443,-17.5242c15.0918,-11.98355 12.71564,-33.38867 11.21118,-50.43889c-1.84476,-10.52664 2.20334,-21.05807 1.44894,-31.48618c-10.88037,-13.31276 -19.80722,10.08708 -16.70779,20.14043c-0.00076,12.64635 2.42783,28.93701 -9.63577,37.17496c-9.95572,-0.25104 -19.43069,3.36517 -29.4632,1.4744c-8.14081,4.83435 -21.32692,4.71021 -24.01404,-6.79811c-1.07281,-10.22015 3.55807,-20.93494 -2.73401,-30.47318c5.52835,4.7614 15.17361,-4.11226 9.79822,6.56248c-6.55643,8.68922 5.55173,22.07874 10.10989,9.25331c1.51227,-8.60512 -6.54141,-20.02596 6.69714,-18.18237c2.6998,3.03528 -9.21959,24.26701 7.07346,18.90152c11.61606,-2.54445 -2.06659,-20.76607 13.66382,-20.82939c7.61295,-8.9626 5.56317,-25.76184 17.20825,-32.56114c12.98419,-8.78706 33.2569,-2.44315 42.52423,-17.32399c7.89911,-7.61507 4.18182,-28.72154 -9.44128,-21.72794c-17.02448,1.65962 -3.51318,-23.0582 -3.98819,-32.32024c4.01126,-8.06691 -4.87137,-25.04774 -1.81268,-26.84933c5.77948,8.84253 7.84946,19.18484 6.60651,29.51878c-0.10681,8.76352 -3.8233,32.51385 8.36014,17.87288c4.12442,-10.20347 2.92487,-21.76073 5.86331,-32.37626c5.66748,-22.91865 -4.48026,-45.85004 -15.79309,-65.262c-9.63495,-10.45038 -21.86679,-18.78104 -33.35342,-26.98327c-19.32092,-7.26658 -40.65421,-8.56836 -61.06006,-6.74718c-18.04979,3.12863 -37.13738,6.42709 -51.51633,18.73374c-14.01352,8.25707 -27.43441,19.22373 -32.97453,35.08961c-4.82798,12.78156 -13.28239,25.798 -9.43994,39.99647c3.67479,11.83601 1.72576,24.12813 2.32075,36.22574c6.26442,13.82637 12.1788,-7.07504 11.59255,-13.98853c0.3468,-13.11021 7.26362,-24.71465 12.36033,-36.35318zm115.06042,28.12622c12.88235,0.92311 29.19336,8.09689 29.54492,23.0528c1.95883,15.00865 -10.16846,29.55684 -25.7099,28.08501c-14.11661,-1.15955 -23.14499,-13.35332 -22.20761,-27.06258c-4.7262,-9.82969 2.6286,-20.35741 12.49942,-22.61709c1.91415,-0.64365 3.88168,-1.12543 5.87317,-1.45815zm-86.93419,1.27835c14.94448,-2.65778 31.94749,6.61306 31.99739,23.15527c1.40359,15.99194 -15.57494,19.12508 -27.15695,23.1313c-8.01422,5.17467 -16.3391,0.35667 -22.99829,-4.85698c-8.63997,-9.0434 -6.10048,-27.26721 3.02245,-35.52229c4.42388,-3.27404 9.90028,-4.56108 15.1354,-5.9073zm51.1378,42.18812c7.2348,9.94383 15.92023,25.10751 6.56407,36.39339c-8.30571,6.66107 -9.35284,-9.47466 -18.07048,-1.8754c-8.17816,-7.1624 -0.63536,-21.73717 5.10291,-29.01329c1.8913,-2.09525 4.05559,-3.93987 6.4035,-5.5047z",
            	"star_32": "m1,150l37.78866,-10.95375l-34.9264,-18.11479l39.19976,-3.37057l-30.72019,-24.58047l39.1037,4.34019l-25.33452,-30.10049l37.5051,11.88636l-18.97492,-34.46539l34.46528,18.97503l-11.88614,-37.50511l30.10025,25.33441l-4.34019,-39.10359l24.58048,30.72008l3.37057,-39.19964l18.11479,34.92639l10.95375,-37.78866l10.95375,37.78866l18.11479,-34.92639l3.37057,39.19964l24.58047,-30.72008l-4.34018,39.10359l30.10023,-25.33441l-11.88614,37.50511l34.4653,-18.97503l-18.97491,34.46539l37.50508,-11.88636l-25.33452,30.10049l39.10347,-4.34019l-30.71994,24.58047l39.1994,3.37057l-34.92581,18.11479l37.78842,10.95375l-37.78842,10.95375l34.92581,18.11479l-39.1994,3.37057l30.71994,24.58047l-39.10347,-4.34018l25.33452,30.10025l-37.50508,-11.88615l18.97491,34.4653l-34.4653,-18.97493l11.88614,37.5051l-30.10023,-25.33452l4.34018,39.10347l-24.58047,-30.71994l-3.37057,39.1994l-18.11479,-34.92581l-10.95375,37.78842l-10.95375,-37.78842l-18.11479,34.92581l-3.37057,-39.1994l-24.58048,30.71994l4.34019,-39.10347l-30.10025,25.33452l11.88614,-37.5051l-34.46528,18.97493l18.97492,-34.4653l-37.5051,11.88615l25.33452,-30.10025l-39.1037,4.34018l30.72019,-24.58047l-39.19976,-3.37057l34.9264,-18.11479l-37.78866,-10.95375z",
            	"sun": "m298.99939,149.99919l-60.12755,21.3835l0,-42.76601l60.12755,21.38251zm-43.65198,-105.36193l-27.38881,57.64266l-30.23897,-30.23995l57.62778,-27.40271zm-105.34804,-43.63768l21.38251,60.12764l-42.76602,0l21.38351,-60.12764zm-105.36263,43.63768l57.64236,27.40271l-30.23955,30.23995l-27.40281,-57.64266zm-43.63767,105.36193l60.12774,-21.38251l0,42.76601l-60.12774,-21.3835zm43.63767,105.34903l27.40281,-57.62877l30.23955,30.23996l-57.64236,27.38881zm105.36263,43.65096l-21.38351,-60.12753l42.76602,0l-21.38251,60.12753zm105.34804,-43.65096l-57.62778,-27.38881l30.23897,-30.23996l27.38881,57.62877zm-179.84834,-105.34903l0,0c0,-41.14515 33.35516,-74.5 74.50031,-74.5c41.14514,0 74.5,33.35485 74.5,74.5c0,41.14514 -33.35486,74.49998 -74.5,74.49998c-41.14514,0 -74.50031,-33.35484 -74.50031,-74.49998z",
            	"woman": "m150.04984,49.03255c13.33249,0 24.15346,-10.81348 24.15346,-24.15346c0,-13.34748 -10.82097,-24.16844 -24.15346,-24.16844c-13.34375,0 -24.16843,10.82096 -24.16843,24.16844c0,13.33998 10.82095,24.15346 24.16843,24.15346zm67.74049,104.1672l-21.67561,-80.39177c-0.20212,-0.72988 -0.48662,-1.42607 -0.83093,-2.06987c-2.46291,-7.53088 -9.53339,-12.9844 -17.88399,-12.9844h-54.86088c-8.70618,0 -16.01627,5.9214 -18.16845,13.95758c-0.14598,0.35184 -0.26575,0.7224 -0.37429,1.10417l-21.2901,80.38803c-1.41861,5.2701 1.71053,10.6862 6.98811,12.1048c5.27014,1.4111 10.68626,-1.71803 12.10487,-6.98813l16.71989,-63.14786h6.96569l-30.34438,114.25453h28.5927v78.87959c0,6.06738 4.91077,10.9819 10.98564,10.9819c6.05989,0 10.9819,-4.9108 10.9819,-10.9819v-78.87959h8.73613v78.87959c0,6.06738 4.91826,10.9819 10.99315,10.9819c6.05988,0 10.9819,-4.9108 10.9819,-10.9819v-78.87959h28.57767l-30.45665,-114.25453h7.14911l17.02679,63.14786c1.41859,5.2701 6.83472,8.39923 12.10481,6.98813c5.2589,-1.41859 8.38803,-6.83842 6.97693,-12.10854z"
            	}
            }
          • music.json
            {"data": {
            	"clef_alto": "m51.25065,150.28749c0,-49.53207 0,-99.06413 0,-148.5962c11.59261,0 23.18523,0 34.77784,0c0,99.06413 0,198.12827 0,297.1924c-11.59261,0 -23.18522,0 -34.77784,0c0,-49.53209 0,-99.06413 0,-148.59621zm51.37634,0c0,-49.53207 0,-99.06413 0,-148.5962c8.48285,-2.46703 12.93837,1.84261 11.08508,10.0007c0.12527,45.40251 0.25053,90.80502 0.37581,136.20751c21.44767,-15.32626 29.57346,-41.86327 36.21976,-66.10667c3.81448,15.78812 9.88112,35.01518 27.29865,40.16045c16.60112,4.98381 31.30354,-10.63891 31.13045,-26.64445c2.89955,-20.45341 3.30077,-41.70258 -1.14742,-61.93042c-4.16455,-12.79745 -16.64639,-23.36595 -30.52771,-22.52039c-11.42384,-5.25948 -24.23628,10.96936 -9.59547,16.90924c12.31264,13.08186 -1.99968,35.47687 -19.11742,30.23324c-16.59583,-3.55596 -21.00951,-25.43777 -11.40723,-37.80838c13.77419,-17.97563 39.16574,-20.24264 60.03438,-17.62625c27.15413,3.08944 47.80745,27.56302 50.7352,54.02297c3.73869,23.61245 -2.35521,50.29027 -22.12251,65.37829c-16.57411,13.95533 -40.93645,15.69794 -60.41183,7.1722c-4.73631,7.1261 -9.47264,14.25217 -14.20895,21.37825c4.65338,6.95274 9.30673,13.90549 13.96008,20.8582c23.58311,-10.57065 54.40877,-5.07518 69.99907,16.43117c21.95821,28.96715 17.67499,75.52599 -10.84692,98.64314c-17.91376,14.62869 -43.09233,14.67899 -64.38158,8.83109c-16.11131,-4.2995 -31.82996,-19.966 -26.84735,-37.82117c2.51375,-15.55998 23.9128,-21.41389 34.33803,-9.83356c14.19543,12.82462 -6.37968,25.74036 -5.32516,38.10141c15.79561,11.97195 41.38054,0.70062 45.05746,-18.39487c5.84576,-20.96526 4.47285,-43.25116 1.61388,-64.56879c-1.53316,-14.33195 -14.00139,-28.78069 -29.45882,-24.78352c-16.25957,3.69221 -24.37509,20.62003 -27.1602,35.64745c-3.41434,11.00523 -4.50349,-10.5222 -7.16806,-14.04636c-5.53896,-17.66304 -15.20212,-35.01096 -30.07851,-46.1468c-1.53252,4.76282 -0.13866,10.70403 -0.62897,15.96893c-0.11874,43.15994 -0.2375,86.31984 -0.35623,129.47978c-8.48793,2.46848 -12.93407,-1.8443 -11.0575,-10.00076c0,-46.19846 0,-92.39696 0,-138.59544z",
            	"clef_bass": "m21.53929,297.24106c0.11552,-13.50244 21.89277,-17.95071 30.83244,-27.31851c34.50853,-23.15955 68.13189,-49.8976 89.28437,-86.39645c22.47179,-37.29227 34.65842,-82.97259 25.51732,-126.22972c-4.84746,-26.84145 -30.93637,-48.32386 -58.5412,-44.96438c-18.18078,2.48732 -39.18159,6.6724 -49.70108,23.45858c-11.41858,8.57642 -5.13639,28.67733 10.08619,21.04295c19.47556,-7.4344 43.93666,7.72539 43.16644,29.21231c0.02258,20.3737 -20.60109,34.74615 -39.82058,32.83379c-21.40677,-0.21405 -42.59771,-17.48695 -42.15028,-39.87929c-1.48358,-36.0903 29.74187,-65.56665 63.16554,-73.13066c29.88613,-9.31284 64.6309,-5.56545 89.8325,13.80772c18.75227,12.81883 33.51952,32.25211 36.60045,55.18989c6.65193,29.82199 -1.94455,60.59844 -16.85703,86.54317c-19.16537,34.9521 -48.44911,63.56561 -82.44233,84.09172c-31.5721,20.13449 -64.41224,38.31845 -98.38529,54.07944c-0.19582,-0.78018 -0.39163,-1.56039 -0.58745,-2.34058zm226.81013,-147.1503c-16.25441,-7.36092 -12.66826,-37.2715 6.2514,-37.94421c14.1568,-3.30239 27.38025,11.49424 23.01007,25.17739c-2.75677,12.80446 -18.12839,18.35408 -29.26147,12.76682zm0,-81.82211c-16.25441,-7.36089 -12.66826,-37.2715 6.2514,-37.9442c14.1568,-3.30238 27.38025,11.49425 23.01007,25.17739c-2.82837,12.84788 -18.04926,18.33069 -29.26147,12.76681z",
            	"clef_treble": "m142.57787,298.08936c-19.93291,-3.16858 -30.69543,-32.78793 -10.77837,-43.63799c20.76305,-10.6983 33.11169,27.38725 10.4319,31.10985c-12.41878,4.65247 16.12379,12.44363 21.44362,4.62054c16.62259,-8.04572 14.05481,-28.98639 10.0555,-43.73428c-1.38792,-11.29834 -3.1236,-23.3942 -17.37872,-16.97299c-34.39165,2.76706 -61.61951,-32.12309 -58.88461,-64.7627c0.92851,-30.78641 26.14601,-51.87253 44.81895,-73.25146c-6.13037,-27.96899 -7.98138,-60.28084 9.78998,-84.65368c16.36949,-19.81244 24.67825,16.44271 27.44722,28.74505c6.15059,28.7567 -6.11317,58.97542 -26.51985,79.24646c1.94853,9.61536 3.86572,19.23715 5.85146,28.84491c21.56471,-4.16351 42.14922,14.0585 43.32542,35.40215c3.33209,19.27364 -9.02991,37.47516 -25.91515,45.75842c-0.27765,16.55051 8.86742,33.71834 5.58147,50.80913c-3.15567,17.67035 -22.97263,26.33539 -39.26881,22.47659zm22.51283,-75.40413c6.10963,-11.46864 -4.97238,-31.72308 -5.58083,-46.4445c0.2393,-25.67101 -26.99069,4.97273 -18.89308,17.57916c2.40038,7.45953 23.23523,21.13914 4.09677,12.70238c-19.98106,-11.95877 -19.06588,-42.72807 -0.80893,-55.71979c15.31693,-3.39279 5.96193,-23.83228 3.07584,-30.54592c-18.81245,17.14481 -40.13555,38.73356 -36.89114,66.48257c2.4439,26.00902 30.79729,41.78694 55.00137,35.94611zm12.65782,-4.96449c17.94263,-11.51868 17.35378,-41.74863 -2.27676,-51.12454c-20.94589,-11.06784 -6.59929,17.92804 -6.2155,28.9649c2.90686,4.22505 1.26024,28.84393 8.49226,22.15964zm-22.11331,-138.56764c11.03699,-13.35171 23.65346,-32.62746 15.90224,-50.28019c-16.69221,-11.01859 -25.9682,18.77171 -26.37872,31.81623c-0.15186,8.45836 -1.39836,37.61288 10.47649,18.46396l0,0z",
            	"note_16th": "m88.44206,298.30295c-13.87988,-2.82538 -24.35809,-16.50861 -20.88289,-30.73529c4.91499,-19.9595 23.53616,-33.76636 42.17206,-40.32825c12.41348,-4.12247 26.50006,-3.4993 38.15588,2.63036c1.0408,-76.23686 0.44647,-152.49294 0.60452,-228.73842c4.20728,-0.00103 9.6062,-1.35928 8.46304,4.73352c0.58707,13.69153 7.31578,26.22541 17.65646,35.05743c23.06891,21.49232 49.01909,44.8303 54.31831,77.58647c1.50432,13.81924 -0.10796,27.74641 -3.17799,41.24139c9.09166,16.96843 8.54382,37.52667 4.8522,55.93042c-2.39383,9.71803 -6.29839,19.07953 -11.26178,27.74855c-11.71941,5.45538 1.38908,-8.91675 1.22467,-14.09427c6.33897,-15.55397 7.06616,-32.87975 4.18297,-49.26376c-6.28082,-23.96758 -30.02579,-35.67821 -49.12051,-48.20921c-6.90894,-2.70374 -21.67717,-19.0106 -18.74876,-3.03152c-0.64005,43.31421 -0.53076,86.63467 -0.73126,129.95221c-8.01517,20.08276 -26.40254,35.40967 -47.75954,39.25299c-6.54287,1.13068 -13.39496,1.54416 -19.94739,0.2674zm133.16364,-163.77284c0.19041,-24.65028 -18.17068,-44.59457 -36.16211,-59.2127c-9.00275,-6.78731 -18.53905,-13.97798 -28.66229,-18.37087c0.62265,14.17498 7.10901,27.98635 14.87303,39.75766c14.63148,19.60416 36.7207,32.71725 48.97745,54.30224c1.46973,-5.35919 1.02641,-10.98389 0.97392,-16.47633z",
            	"note_2_16th": "m49.3958,299.54056c-16.81947,-3.04166 -22.61933,-24.29047 -12.59162,-37.02081c13.30804,-19.68834 41.77522,-32.96074 64.07959,-20.53789c0.44453,-69.33055 0.18797,-138.66488 0.25596,-207.99711c55.61466,-11.21983 111.34956,-21.8626 166.98527,-32.98482c-0.12048,77.7042 -0.24097,155.40843 -0.36145,233.1126c-8.71588,23.50243 -36.87907,39.79991 -61.40202,32.51219c-14.59976,-4.3703 -18.09988,-23.21532 -9.97012,-34.76195c11.13289,-17.22395 31.85399,-29.0497 52.68539,-25.82347c5.94469,-0.60136 14.69865,9.02304 12.18605,-1.86462c0,-54.46642 0,-108.93282 0,-163.39921c-51.0519,10.27703 -102.20471,20.06591 -153.28023,30.23172c-0.17435,63.38239 0.43399,126.77441 -0.45506,190.14903c-1.62524,19.24988 -20.10281,32.38318 -37.35132,37.51443c-6.81397,1.14908 -13.90893,1.86209 -20.78043,0.8699zm133.17406,-258.40903c26.23065,-5.16204 52.47366,-10.26209 78.69298,-15.48133c3.33676,-13.29303 -11.59628,-4.66015 -18.89926,-4.33564c-44.78732,8.84114 -89.60051,17.55139 -134.38097,26.42687c-3.33676,13.29303 11.59627,4.66015 18.89925,4.33564c18.56081,-3.65804 37.12405,-7.30357 55.688,-10.94555z",
            	"note_2_32nd": "m49.39585,299.53995c-16.81947,-3.04169 -22.61932,-24.29047 -12.59161,-37.02081c13.30804,-19.68835 41.77521,-32.96077 64.07959,-20.53792c0.44453,-69.33055 0.18797,-138.66488 0.25596,-207.9971c55.61465,-11.21984 111.34956,-21.86261 166.98528,-32.98483c-0.12048,77.70421 -0.24097,155.40842 -0.36145,233.11262c-8.71591,23.50241 -36.8791,39.7999 -61.40204,32.51218c-14.59978,-4.3703 -18.09987,-23.21533 -9.97015,-34.76193c11.13292,-17.22395 31.854,-29.0497 52.68541,-25.82347c5.9447,-0.60136 14.69868,9.02304 12.18605,-1.86462c0,-46.71117 0,-93.42232 0,-140.13348c-51.05188,10.27702 -102.20473,20.0659 -153.28023,30.23172c-0.22871,56.35212 0.56696,112.72466 -0.58765,169.06043c-3.51923,18.91183 -22.11423,32.00891 -40.05743,35.8262c-5.92716,0.70624 -12.00983,1.31848 -17.94172,0.38101zm133.17405,-235.14331c26.23065,-5.16204 52.47366,-10.26208 78.69298,-15.48132c3.33676,-13.29303 -11.59628,-4.66015 -18.89923,-4.33564c-44.78734,8.84113 -89.60054,17.55138 -134.381,26.42687c-3.33677,13.29303 11.59627,4.66015 18.89925,4.33564c18.56078,-3.65805 37.12405,-7.30357 55.688,-10.94555zm0,-23.26575c26.23065,-5.16204 52.47366,-10.26209 78.69298,-15.48133c3.33676,-13.29302 -11.59628,-4.66015 -18.89923,-4.33563c-44.78734,8.84113 -89.60054,17.55139 -134.381,26.42687c-3.33677,13.29303 11.59627,4.66016 18.89925,4.33564c18.56078,-3.65804 37.12405,-7.30358 55.688,-10.94555z",
            	"note_2_64th": "m49.39639,299.53995c-16.81947,-3.04169 -22.61932,-24.29047 -12.59161,-37.02081c13.30804,-19.68835 41.77522,-32.9608 64.07959,-20.53792c0.44453,-69.33055 0.18797,-138.66488 0.25596,-207.99711c55.61465,-11.21983 111.34957,-21.86261 166.98528,-32.98482c-0.12048,77.70421 -0.24097,155.40842 -0.36145,233.11262c-8.71591,23.50241 -36.8791,39.7999 -61.40205,32.51218c-14.59976,-4.3703 -18.09987,-23.21533 -9.97012,-34.76193c11.1329,-17.22395 31.85399,-29.0497 52.68539,-25.8235c5.94467,-0.60133 14.69868,9.02307 12.18605,-1.86459c0,-38.95592 0,-77.91182 0,-116.86773c-51.0519,10.27703 -102.20474,20.06591 -153.28024,30.23172c-0.23563,48.66071 0.58183,97.34513 -0.58977,145.98728c-3.69252,18.80173 -22.14742,31.83179 -40.05531,35.63361c-5.92716,0.70627 -12.00984,1.31848 -17.94173,0.38101zm133.17406,-211.87756c26.23067,-5.16204 52.47368,-10.26209 78.69298,-15.48133c3.33676,-13.29303 -11.59627,-4.66015 -18.89925,-4.33564c-44.78732,8.84113 -89.60051,17.55138 -134.38099,26.42688c-3.33676,13.29302 11.59627,4.66015 18.89925,4.33562c18.56079,-3.65804 37.12405,-7.30356 55.688,-10.94553zm0,-23.26575c26.23067,-5.16204 52.47368,-10.26208 78.69298,-15.48132c3.33676,-13.29303 -11.59627,-4.66015 -18.89925,-4.33564c-44.78732,8.84113 -89.60051,17.55138 -134.38099,26.42687c-3.33676,13.29303 11.59627,4.66015 18.89925,4.33564c18.56079,-3.65805 37.12405,-7.30357 55.688,-10.94555zm0,-23.26575c26.23067,-5.16204 52.47368,-10.26209 78.69298,-15.48133c3.33676,-13.29302 -11.59627,-4.66015 -18.89925,-4.33563c-44.78732,8.84113 -89.60051,17.55139 -134.38099,26.42687c-3.33676,13.29303 11.59627,4.66016 18.89925,4.33564c18.56079,-3.65804 37.12405,-7.30357 55.688,-10.94554z",
            	"note_2_8th": "m49.39571,299.54196c-16.81947,-3.04169 -22.61933,-24.29047 -12.59162,-37.02081c13.30804,-19.68834 41.77522,-32.96077 64.07959,-20.53792c0.44447,-69.55862 0.18803,-139.12106 0.25597,-208.68139c55.61337,-11.00192 111.35248,-21.38966 166.98529,-32.30051c-0.12051,77.70421 -0.24097,155.40842 -0.36145,233.11263c-8.71594,23.50241 -36.8791,39.7999 -61.40207,32.51218c-14.59976,-4.3703 -18.09987,-23.21533 -9.97012,-34.76193c11.1329,-17.22395 31.854,-29.0497 52.68538,-25.82347c5.9447,-0.60136 14.69872,9.02304 12.18608,-1.86462c-0.20636,-61.46065 0.51324,-122.93768 -0.53098,-184.38539c-9.07608,-3.36956 -25.21706,4.38308 -36.83795,5.01031c-38.86079,7.56314 -77.80466,14.7255 -116.5762,22.73074c1.16985,68.10055 0.62434,136.24279 0.45018,204.35774c2.05843,15.54877 -6.51154,30.19547 -19.54225,38.30072c-11.24453,8.17932 -25.1371,11.12784 -38.82984,9.35175z",
            	"note_3_16th": "m15.05685,274.22351c-14.31707,-1.91919 -18.42601,-20.36026 -8.93697,-29.99135c10.38879,-13.67648 30.27091,-22.30884 46.50806,-13.88651c0.66153,-52.11798 0.28726,-104.24728 0.38611,-156.37085c81.97754,-16.40272 164.06679,-32.26359 246.07988,-48.4937c-0.2363,57.62228 0.57657,115.26416 -0.57095,172.87157c-1.96915,14.86053 -17.13602,24.73001 -30.79037,27.8163c-11.96523,3.66803 -28.81345,-4.27913 -25.97942,-18.60889c3.50381,-15.4984 19.49126,-26.6657 34.85991,-28.02376c8.59586,-2.14986 20.61923,9.25734 16.69226,-5.91415c0.09525,-39.33675 -0.07153,-78.67297 -0.13177,-118.00977c-38.18202,7.50178 -76.35632,15.04294 -114.54555,22.50813c-0.23268,48.18274 0.55394,96.38557 -0.57504,144.55286c-2.30531,15.49788 -18.60167,25.74417 -33.19453,27.71848c-14.44766,3.90948 -29.61349,-11.1328 -21.45115,-25.13463c9.01589,-16.79831 32.00478,-28.23689 49.88007,-18.48071c0.13591,-41.88866 0.57454,-83.7979 -0.20747,-125.67833c-9.66763,-2.10095 -24.53024,4.47319 -35.97192,5.4189c-26.23273,5.15636 -52.45877,10.34411 -78.68841,15.51694c-0.35831,49.24326 0.12716,98.5107 -1.08934,147.73389c-6.17624,16.23714 -25.20985,26.82423 -42.27338,24.45558l0,0zm101.53641,-195.02805c18.87659,-3.72421 37.75267,-7.44825 56.62927,-11.17233c3.17946,-13.298 -14.34059,-1.80056 -21.35852,-2.54169c-31.16307,6.26984 -62.32049,12.56754 -93.49695,18.76997c-1.80596,13.61728 18.79422,-0.36912 26.46645,1.18459c10.58865,-2.07109 21.17471,-4.15247 31.75974,-6.24054zm119.43625,-23.77348c18.94301,-3.80857 37.98227,-7.27608 56.8645,-11.31118c2.82892,-13.23786 -18.20215,0.42724 -25.56601,-1.09475c-29.37257,5.74051 -58.85892,11.05022 -88.16765,17.02801c-3.13623,14.00632 18.26294,0.04643 25.92744,1.45249c10.31323,-2.02774 20.62746,-4.05219 30.94171,-6.07457z",
            	"note_3_32th": "m15.05685,274.22333c-14.31707,-1.91882 -18.42601,-20.36018 -8.93697,-29.99106c10.3888,-13.67676 30.27089,-22.30908 46.50806,-13.88647c0.66166,-52.11824 0.28732,-104.24765 0.38611,-156.37099c81.97754,-16.40273 164.06694,-32.2636 246.07988,-48.4937c-0.2363,57.6225 0.57663,115.26395 -0.57123,172.87143c-1.96881,14.86089 -17.13586,24.73018 -30.79025,27.81644c-11.96498,3.66806 -28.81322,-4.27921 -25.97935,-18.60878c3.50368,-15.49834 19.49123,-26.6657 34.86018,-28.02408c8.67697,-2.20874 20.51364,9.40097 16.68222,-5.83759c-0.09845,-33.39989 0.78769,-66.86396 -0.50803,-100.22556c-37.99194,7.33447 -75.93604,14.91556 -113.90202,22.38341c-0.40428,43.27432 0.22905,86.58281 -1.10269,129.83c-6.66052,18.05263 -29.74564,30.16772 -47.98743,22.50237c-14.38366,-7.43967 -7.95995,-27.06667 2.9687,-34.4792c10.34322,-10.82147 29.63336,-12.35156 40.562,-8.05225c0.25528,-36.18434 0.11931,-72.37016 0.15388,-108.55522c-38.40674,7.73776 -76.89246,15.09384 -115.31775,22.74432c-0.2578,42.95952 0.63174,85.96188 -0.70086,128.88727c-5.20541,16.91916 -25.24538,27.88303 -42.40446,25.48965zm99.21976,-176.85336c19.73389,-3.88507 39.47778,-7.71994 59.20331,-11.64712c1.63908,-13.07382 -17.1093,-0.27914 -24.42491,-1.54683c-30.21908,5.91451 -60.4242,11.89998 -90.63543,17.85444c-2.77443,12.63378 14.55762,1.2752 21.41661,2.10594c11.47932,-2.25961 22.95964,-4.51424 34.44042,-6.76643zm2.31665,-18.17461c18.87643,-3.72409 37.75285,-7.44817 56.62927,-11.17224c3.17953,-13.298 -14.34081,-1.80056 -21.35843,-2.5417c-31.16306,6.26989 -62.32067,12.56752 -93.49722,18.77c-1.80564,13.61723 18.7942,-0.36929 26.46687,1.1845c10.58833,-2.07081 21.17455,-4.15248 31.7595,-6.24056zm119.82236,-6.10279c19.00511,-3.73167 38.01025,-7.46333 57.01538,-11.195c2.25488,-12.51775 -14.43167,-1.31337 -21.22391,-2.14778c-31.1899,6.14801 -62.39635,12.21269 -93.57906,18.3969c-0.48149,12.89743 19.70058,-0.51178 28.22481,0.73691c9.85522,-1.92534 19.70935,-3.85638 29.56277,-5.79102zm-0.38611,-17.67059c18.94318,-3.80859 37.98227,-7.27608 56.86438,-11.31118c2.82913,-13.23785 -18.20197,0.42724 -25.56577,-1.09474c-29.37247,5.74053 -58.85913,11.0502 -88.1676,17.028c-3.13618,14.00631 18.26254,0.04646 25.92732,1.45247c10.31334,-2.02773 20.6273,-4.05214 30.94167,-6.07454z",
            	"note_3_64th": "m15.05833,274.22296c-14.317,-1.9187 -18.42625,-20.3604 -8.93719,-29.99104c10.38896,-13.67708 30.27131,-22.30949 46.50857,-13.88661c0.66169,-52.1188 0.28732,-104.24842 0.38611,-156.37186c81.97786,-16.40303 164.06815,-32.26401 246.08122,-48.49419c-0.23633,57.62288 0.57712,115.26462 -0.57092,172.87238c-1.96869,14.86116 -17.13614,24.73065 -30.79056,27.81697c-11.96483,3.66806 -28.81317,-4.27963 -25.97963,-18.60901c3.50381,-15.49847 19.49141,-26.66583 34.8607,-28.02443c7.61099,-2.92159 20.18073,9.65431 16.68201,-4.30438c0.21829,-27.96678 0.10867,-55.9346 0.13544,-83.90191c-38.27235,7.48128 -76.53494,15.0156 -114.80267,22.52314c-0.22958,36.48441 0.55602,72.99504 -0.58997,109.45938c-3.18001,15.89902 -20.29759,26.40845 -35.74976,27.23267c-14.89929,2.89737 -27.08599,-14.42255 -17.93506,-27.04372c9.64191,-15.67046 31.65898,-26.22467 48.93309,-16.72427c0.33206,-30.58104 0.14311,-61.16617 0.19254,-91.74873c-38.39642,7.82673 -76.92161,15.04803 -115.31823,22.87476c-0.25736,36.94054 0.62957,73.92738 -0.70087,110.83084c-5.2055,16.9194 -25.24553,27.88339 -42.40482,25.49002l0,0zm101.38524,-159.31403c18.83891,-3.75145 37.70946,-7.35722 56.50069,-11.3393c2.95145,-13.53962 -17.91554,0.08701 -25.35307,-1.30814c-29.80621,5.87558 -59.6283,11.67136 -89.42722,17.5835c-2.26596,13.04952 15.28052,1.23864 22.46973,2.11949c11.93564,-2.35683 23.87244,-4.70798 35.80987,-7.05554zm-2.1648,-17.54025c19.73418,-3.88531 39.47784,-7.72015 59.20348,-11.64717c1.63916,-13.07402 -17.10936,-0.27902 -24.42487,-1.54701c-30.21927,5.9147 -60.42458,11.89994 -90.63596,17.8548c-2.77449,12.63354 14.55767,1.27519 21.41672,2.10558c11.47937,-2.25951 22.95979,-4.51389 34.44062,-6.7662zm123.16869,-6.50159c18.66148,-3.66445 37.32301,-7.3289 55.98506,-10.99284c1.75296,-13.03485 -16.50751,-0.89732 -23.95999,-1.87753c-30.19955,5.92758 -60.38982,11.90097 -90.58421,17.8548c-3.55789,11.04535 8.5943,3.94657 14.87352,3.58826c14.56204,-2.85567 29.12408,-5.71393 43.68562,-8.57269zm-120.85203,-11.67342c18.8765,-3.72417 37.75323,-7.44803 56.62942,-11.17215c3.18001,-13.29807 -14.34068,-1.80056 -21.35812,-2.54169c-31.16348,6.26993 -62.3213,12.56734 -93.49802,18.77035c-1.80566,13.61685 18.79432,-0.36964 26.46704,1.18407c10.58839,-2.07059 21.17467,-4.1525 31.75968,-6.24059zm119.82291,-6.10266c19.0054,-3.73169 38.01082,-7.46337 57.01573,-11.19506c2.25491,-12.51782 -14.4313,-1.3134 -21.22379,-2.14781c-31.19003,6.14807 -62.39655,12.21279 -93.5799,18.39685c-0.48135,12.89765 19.70091,-0.51173 28.22522,0.73721c9.8551,-1.92541 19.70967,-3.85648 29.56273,-5.7912zm-0.38611,-17.67071c18.94363,-3.8086 37.9825,-7.27608 56.86485,-11.31125c2.82944,-13.23789 -18.20175,0.42725 -25.56567,-1.09475c-29.37276,5.7406 -58.85979,11.05029 -88.16818,17.02811c-3.13626,14.0062 18.26253,0.04649 25.9276,1.4525c10.31329,-2.02775 20.62709,-4.05215 30.94141,-6.07461z",
            	"note_3_8th": "m15.02169,274.2272c-14.31707,-1.91879 -18.42601,-20.36015 -8.93697,-29.99103c10.3888,-13.67676 30.27088,-22.3091 46.50806,-13.88649c0.66166,-52.11824 0.28732,-104.24764 0.38611,-156.37097c81.97754,-16.40273 164.06694,-32.2636 246.07985,-48.4937c-0.2363,57.6225 0.57663,115.26395 -0.5712,172.87141c-1.96884,14.86089 -17.13589,24.73018 -30.79025,27.81644c-11.965,3.66806 -28.81323,-4.27919 -25.97937,-18.60878c3.50368,-15.49834 19.49124,-26.66568 34.8602,-28.02408c8.2316,-2.53128 20.41348,9.51646 16.65692,-5.23953c-0.07721,-45.31436 0.85016,-90.69309 -0.45593,-135.96806c-37.90379,6.83744 -76.18053,14.4211 -114.18623,21.74638c-0.22679,54.0925 0.53969,108.20272 -0.57019,162.28107c-1.77496,14.91302 -17.02997,24.75598 -30.69292,27.71687c-13.90182,4.60379 -31.50981,-7.66069 -24.80507,-22.93971c8.1866,-17.99985 32.25569,-30.36769 50.72748,-20.3566c0.32813,-48.569 0.14423,-97.14091 0.19258,-145.71125c-38.34256,7.86306 -76.73341,15.50194 -115.11303,23.18613c-0.70871,54.82025 0.60002,109.69145 -0.90556,164.48224c-5.27564,16.97054 -25.17379,27.85027 -42.40448,25.48964z",
            	"note_32nd": "m96.7115,298.78342c-12.19044,-1.97687 -21.5796,-13.65018 -18.87752,-26.14322c3.19898,-16.4884 18.16196,-28.11014 32.8273,-34.56326c11.8622,-4.83313 26.35187,-5.63437 37.63535,1.13913c0.44954,-79.35593 0.19681,-158.71518 0.26346,-238.07262c3.98198,-0.1698 8.54333,-0.99947 7.45644,4.60387c0.32353,13.2127 8.16176,24.35488 17.90031,32.62089c20.68701,19.0793 43.62003,41.1507 45.44289,71.03391c1.94933,11.70761 -4.32771,23.23071 -1.67,34.59584c2.53688,11.20206 1.78056,22.8308 0.17831,34.09036c7.53368,20.20854 5.71452,43.47615 -2.49284,63.20886c0.75815,6.16689 -13.8391,16.22797 -7.44476,5.95023c8.63434,-18.74539 13.17647,-41.8004 3.81317,-61.08943c-11.33986,-18.69514 -31.97612,-28.28085 -48.89772,-41.04474c-11.778,-11.86667 -5.42902,11.18993 -7.18364,18.06325c-0.26184,33.71661 -0.28255,67.43445 -0.41075,101.15173c-5.27325,12.84436 -14.94577,23.71875 -27.82796,29.29456c-9.44402,4.40988 -20.29373,7.32529 -30.71203,5.16064zm114.86545,-145.34879c-7.29857,-26.18551 -30.51866,-43.93251 -53.18727,-56.72259c-6.20538,-0.86809 1.83978,14.15399 3.5831,18.80585c8.11926,15.92772 24.10783,25.32948 35.63724,38.48439c5.02966,4.16844 10.75517,12.77017 14.6803,15.07132c0.57034,-5.18866 0.22502,-10.51091 -0.71336,-15.63898zm0.91826,-35.72012c-0.11551,-22.00919 -16.64085,-39.55235 -32.65781,-52.65142c-7.46819,-4.94457 -16.49954,-13.27054 -24.16978,-14.26883c1.45969,12.25124 6.9503,24.24821 17.03656,31.76259c14.34996,13.93145 29.52126,27.82796 39.47783,45.32379c1.14618,-3.04146 0.13112,-6.92123 0.3132,-10.16613z",
            	"note_4th": "m126.58881,297.40149c-11.87886,-2.65546 -23.26585,-13.54025 -21.01448,-26.56512c0.1731,-16.24911 13.85612,-27.71617 25.94878,-36.50977c15.62231,-10.78831 37.15717,-14.20154 54.34061,-5.04248c1.02979,-75.90828 0.44815,-151.83525 0.60191,-227.75206c3.00182,0.70564 9.53603,-2.12083 8.02534,3.09698c-0.14726,78.93155 0.33716,157.8673 -0.38513,236.79541c-0.07584,10.70851 -0.22026,22.31233 -7.75522,30.804c-13.91748,17.52454 -37.15509,29.1525 -59.76181,25.17303z",
            	"note_64th": "m104.92412,299.31976c-12.00094,-1.27536 -20.94641,-13.79388 -17.06551,-25.49271c6.43043,-17.60776 24.98182,-29.7767 43.42287,-30.74879c7.6006,-2.50558 20.88075,10.01114 17.93382,-3.27145c0.48503,-79.47305 0.24155,-158.94821 0.30153,-238.42232c5.75809,-1.70799 6.23006,2.55972 6.32732,7.33913c1.78415,17.85563 19.14293,26.89136 29.82072,39.25721c15.39714,15.12255 27.5349,36.04512 24.51741,58.34038c-3.08612,10.64033 -0.83701,20.84729 0.30066,31.5748c0.06851,11.58006 -4.18433,22.62605 -0.40593,34.00638c1.68036,11.01886 -3.23894,22.12428 2.03442,32.51251c2.40002,18.25101 0.69795,38.47595 -10.52008,53.59502c-7.11406,1.93207 2.97337,-8.35378 2.33067,-11.88858c6.3118,-18.25085 7.27405,-41.79056 -8.5262,-55.64728c-12.36734,-10.82431 -26.50575,-19.43405 -39.98901,-28.77931c-0.71652,35.81755 -0.4848,71.65158 -0.68907,107.47679c-5.08496,13.03387 -16.00215,23.09641 -29.22493,27.57315c-6.53331,2.3526 -13.63996,3.72845 -20.5687,2.57507zm98.72386,-126.48091c-6.34319,-22.74789 -26.51086,-38.16362 -46.20412,-49.27464c-5.25957,0.57732 2.32552,14.64314 4.87614,19.57021c8.86444,13.06609 22.37558,21.98311 32.7415,33.78232c3.44377,1.45969 10.43367,15.90742 9.37975,5.93784c0.13239,-3.35165 -0.09975,-6.73082 -0.79327,-10.01572zm0.7843,-31.02991c0.01227,-19.15482 -14.53879,-34.37045 -28.41721,-45.78492c-6.00691,-3.41928 -16.78343,-14.40513 -20.81033,-10.93629c1.48004,11.20951 7.52783,21.1048 16.47551,27.9065c11.85971,11.75211 24.67769,23.13779 32.59132,38.04211c0.77432,-2.77734 0.04828,-6.25352 0.16071,-9.2274zm0.01279,-39.15976c-0.40309,-21.71703 -17.74644,-38.41104 -34.56728,-49.83583c-4.69977,-2.50358 -18.46306,-14.73891 -13.78862,-1.7836c3.12802,17.13914 19.8609,25.3779 30.46255,37.43516c7.16287,5.47251 13.39691,18.87303 18.00247,22.03555c0.14136,-2.61625 -0.03749,-5.23595 -0.10913,-7.85128z",
            	"note_8th": "m92.11929,299.44888c-12.88673,-2.17523 -24.85642,-14.0065 -22.42534,-27.8176c1.23042,-15.16177 13.28207,-27.36446 25.40788,-35.40434c16.13786,-10.9864 38.20284,-15.06764 55.98708,-5.59207c1.04205,-76.42476 0.44817,-152.86866 0.60602,-229.30206c11.21484,-2.71548 7.58873,11.96767 10.1358,18.75797c2.43044,19.96716 15.82285,35.63469 29.15343,49.62502c16.53877,17.58521 34.10059,36.23084 39.47629,60.59399c5.87012,28.26657 -3.51422,57.18356 -15.69261,82.51581c-0.88187,8.11874 -15.77403,19.86469 -8.67888,5.1937c11.94699,-25.09727 21.81674,-54.00095 13.66216,-81.79225c-7.76553,-27.73048 -31.97011,-50.88958 -60.78398,-55.04219c-0.18622,58.55498 0.45346,117.12103 -0.68288,175.66663c-2.83272,17.24548 -17.81155,30.04147 -32.83268,37.34811c-10.35778,4.50974 -22.04797,7.23831 -33.33228,5.2493z",
            	"note_half": "m126.15042,298.46863c-16.82465,-2.00256 -23.94094,-21.72537 -20.50175,-36.48892c5.91676,-23.32147 29.06407,-39.43811 52.28738,-42.05833c8.81128,-0.72736 18.52644,-0.60411 25.78337,4.94891c5.95566,-2.36537 1.76544,-11.69408 2.85246,-17.2854c0,-68.81003 0,-137.6201 0,-206.43012c14.97716,-2.18183 5.30603,19.02521 7.94768,27.71113c-0.09924,75.95386 0.62134,151.91534 -0.76007,227.86198c-7.30341,28.38443 -39.39244,46.36703 -67.60907,41.74075zm2.8452,-12.40747c22.98492,-7.3089 44.37535,-22.56259 55.31068,-44.49013c0.95541,-13.55527 -16.00528,-10.73553 -23.6718,-6.15868c-13.5024,6.76553 -26.21068,15.65268 -36.74068,26.51123c-6.99238,6.4256 -15.89267,26.17618 0.78696,25.05563l2.30408,-0.3252l2.01074,-0.59286l0,0z",
            	"note_whole": "m130.51953,195.65829c-18.47874,-2.9818 -38.13104,-9.41365 -49.81914,-24.96915c-4.87284,-6.5025 -6.85786,-14.78229 -6.23731,-22.81049c-0.81288,-10.41815 5.23877,-19.78279 13.11027,-26.04227c15.71593,-12.69998 36.4436,-17.12403 56.18739,-18.21444c21.01479,-0.84168 42.85126,2.6237 61.20964,13.32044c11.19275,6.86285 21.10484,18.66567 20.54733,32.45548c0.612,8.09668 -0.91914,16.68852 -6.59294,22.84065c-11.24144,13.63681 -28.92738,19.59387 -45.72455,22.87505c-14.06622,2.54445 -28.55254,2.69426 -42.68069,0.54472zm34.33258,-7.95905c9.06644,-1.9348 15.01314,-11.03741 14.88672,-20.03276c1.54852,-18.89767 -4.73529,-39.56404 -20.09192,-51.52234c-8.61502,-6.06224 -20.8895,-6.65757 -30.00668,-1.42353c-6.79661,4.10276 -9.33514,12.23845 -9.31819,19.7824c-0.73656,16.04378 3.97748,32.8201 14.66045,45.0217c7.49542,7.87076 19.3475,12.08484 29.86963,8.17453z"
            	}
            }
          • object.json
            {"data": {
            	"ball": "m1.36762,144.54343c-0.61252,-24.33647 11.43968,-48.24649 31.71385,-61.85355c33.0555,-25.12355 76.68359,-36.57172 117.69406,-29.65477c20.30775,-3.13354 29.29549,17.94864 22.15137,34.18353c-11.04268,10.79923 -30.25032,0.52836 -44.5518,6.11385c-46.3661,5.97041 -92.1348,26.12911 -123.47163,61.54787c-0.19116,-3.78908 -5.04203,-6.31387 -3.53584,-10.33693zm0.56006,21.59657c2.46893,-17.16783 19.59014,-26.10648 31.49495,-36.53964c40.07716,-28.36518 90.31613,-39.61352 138.89854,-37.70576c1.20387,19.56051 -8.00084,38.23036 -19.07559,53.7263c-15.20721,8.47826 -34.11861,-1.17561 -50.23914,6.54221c-28.27367,6.8441 -59.74523,15.46761 -77.84163,40.11734c-6.57559,19.79451 -20.47401,-0.35286 -21.54921,-12.00313c-1.52846,-4.62877 -1.3158,-9.384 -1.6879,-14.13731zm7.76269,-58.70418c2.42006,-21.53997 16.61662,-39.35048 29.64042,-55.76294c14.68114,-17.49181 34.66698,-30.31521 57.12629,-35.01287c17.80165,-4.64955 36.14864,-6.58389 54.39959,-8.53692c13.84103,10.63111 22.64574,29.11792 20.32661,46.60463c-10.75017,2.72292 -29.7578,-6.48294 -44.25362,-4.23798c-41.11142,0.38721 -83.13954,16.86419 -110.9226,47.60359c-2.31326,2.96635 -4.3931,6.11006 -6.31669,9.34248zm-2.20363,84.97105c15.37329,12.3277 15.8773,33.69405 25.32488,49.77684c-11.32475,-14.57886 -21.29314,-31.61081 -25.32488,-49.77684zm12.17333,11.7446c4.82258,-13.28815 19.94093,-31.96367 32.55468,-30.57486c5.04242,12.98813 7.22698,27.06129 15.42273,38.77007c22.00548,40.39473 62.27551,75.33984 110.15025,76.43997c7.82913,1.58691 28.58411,-3.6853 27.74063,-1.50394c-20.00963,9.82742 -43.17618,11.98239 -65.22374,11.19174c-40.94611,-2.71915 -81.7309,-22.38535 -106.34646,-55.65858c-6.96676,-11.95032 -10.92698,-25.33659 -14.29809,-38.66251zm33.70255,-33.88084c11.04849,-5.13829 31.74819,-20.7682 40.05036,-8.17067c20.26116,39.90601 54.51507,73.83781 96.68548,89.7942c21.8947,7.30453 46.52556,7.18939 67.87685,-1.92662c-8.90472,13.82597 -23.64018,22.69292 -37.52655,30.83714c-35.49046,15.14874 -78.39111,6.93469 -108.29421,-16.68286c-28.94243,-22.9118 -51.66176,-55.70389 -58.71476,-92.285l-0.04169,-0.84726l-0.03548,-0.71893l0,0l0,0zm14.80587,-143.69432c26.85995,-18.47492 60.14433,-27.13922 92.60995,-24.83766c-16.61871,10.60714 -37.47179,6.57748 -55.695,12.32051c-12.71339,2.76803 -25.33243,6.4903 -36.91495,12.51714zm23.19239,130.17215c17.68391,-8.37067 37.80864,-8.2348 56.92004,-7.08942c11.52194,17.94525 19.73788,38.80402 37.6284,51.74121c20.84937,18.617 51.18832,23.87227 77.45898,15.12419c9.02167,-6.09496 19.03778,-2.20023 14.1109,9.88971c-5.93085,20.07378 -26.98962,28.88977 -46.28781,29.86346c-39.48146,3.94382 -75.60028,-18.48682 -102.27098,-45.57831c-15.55914,-15.57706 -28.70033,-33.74123 -37.55954,-53.95085zm59.9713,-149.25921c14.39017,-11.41684 33.98842,-1.08634 48.71259,4.37706c14.6449,12.52997 16.60739,33.37817 20.47758,51.17717c6.47049,41.78263 3.85324,86.6684 -15.69031,124.8082c-4.67027,13.36929 -18.09242,20.61154 -26.69522,6.15724c-9.99724,-11.02568 -17.64142,-23.85532 -24.85538,-36.77173c-4.26648,-12.35977 9.69913,-21.07201 12.62395,-32.37317c5.6987,-11.2672 7.1479,-23.94022 7.7876,-36.27168c2.68518,-18.44756 0.04341,-37.58501 -4.80806,-55.44724c-3.40224,-9.88385 -8.92734,-19.45691 -17.55275,-25.65586zm41.36089,197.33399c28.32747,-32.0033 32.81847,-77.44762 30.6862,-118.36129c-1.29825,-24.12249 -4.96657,-49.05092 -17.68674,-70.0582c13.14473,0.40704 27.28206,12.75397 37.58124,21.8466c29.18982,37.11403 37.77368,91.40852 15.58273,134.05255c-8.72922,17.24329 -20.55305,32.80717 -34.43375,46.22929c-11.62009,-0.9548 -23.39864,-5.3515 -31.72969,-13.70895zm32.30334,13.89389c30.50691,-29.40305 52.59978,-71.66214 46.00664,-114.99303c-2.62479,-20.29454 -10.03497,-39.89902 -21.13239,-57.06778c20.32477,12.66527 31.62595,35.09759 41.79111,55.93748c14.61285,36.42265 6.66864,80.8159 -19.44537,109.92648c-13.41086,7.60643 -32.33356,8.77071 -47.21999,6.19685zm50.22404,-6.80072c10.46527,-18.28113 22.34006,-36.81323 23.43076,-58.50224c1.62656,-7.25171 -0.89633,14.22787 -1.77191,18.74721c-2.78329,15.96013 -6.41766,32.99399 -16.3092,46.01608c-2.27573,-1.26239 -1.2605,-7.4102 -5.34964,-6.26105z",
            	"bolt": "m178.14388,74.00616l-108.49727,68.79685l107.15599,23.63498l-99.04335,73.85934l-39.98779,-12.47227l28.36194,71.19228l112.7131,-31.06076l-47.58928,-12.98325l129.22581,-106.08589l-118.12698,-19.22734l114.07071,-71.6874l-65.0681,-10.76349l70.86891,-45.56109l-26.03423,-0.65478l-109.97452,62.50492l51.92505,10.50792z",
            	"bulb": "m148.28435,1.01645c-19.71313,-0.08707 -41.0383,4.93402 -53.87904,21.08005c-10.00002,11.90277 -20.52196,24.53872 -22.82235,40.47736c-5.18059,28.1529 -4.92928,57.93743 3.64143,85.4047c4.96631,13.63997 16.45209,23.50325 23.37698,36.11604c9.14968,13.20706 13.47519,29.26166 12.26267,45.27029c24.17088,0 48.34173,0 72.5126,0c0.07924,-23.9402 14.94635,-43.62665 28.19687,-62.22926c9.25131,-10.94521 15.23657,-24.20433 17.34691,-38.38177c4.07767,-25.40971 5.00331,-52.60092 -4.43568,-76.9665c-8.96201,-18.6421 -19.94247,-39.09958 -40.93047,-46.16479c-11.25407,-4.11034 -23.39734,-4.80265 -35.26991,-4.60611zm-36.97603,226.70836c24.34058,0 48.68115,0 73.0217,0c-4.36798,8.93942 -9.9079,18.74007 -6.84158,28.88942c-4.05983,8.82452 1.13719,17.61151 -5.54364,25.68655c-2.46005,11.06699 -16.46573,11.92905 -25.84717,12.23193c-10.13806,1.12546 -21.40701,-1.68927 -25.2739,-12.25085c-8.04343,-5.6481 1.65114,-12.52795 -4.58124,-18.87732c7.18661,-7.80208 -5.34555,-11.88156 -0.88777,-20.35059c-1.22452,-5.78517 -5.73284,-8.48584 -4.0464,-15.32915zm-0.15865,0.0249c24.34056,0 48.68114,0 73.02171,0c-1.83408,8.68544 -9.76653,16.89687 -6.75067,25.63821c1.71628,7.25716 -5.42461,13.19765 -1.14021,20.86113c-3.26378,9.1944 -9.79655,19.57855 -20.90657,19.54898c-10.7323,0.01825 -25.30243,3.58121 -31.95258,-7.11847c-2.51509,-6.44772 -10.6368,-10.31369 -4.40095,-17.31061c-7.73209,-5.79929 5.18552,-14.38748 -4.75156,-18.20934c4.72482,-9.15317 -5.09683,-14.41997 -3.11917,-23.40991l0,0zm-0.30553,-0.19208c24.34058,0 48.68115,0 73.02173,0c-1.83408,8.68544 -9.76651,16.89688 -6.75064,25.63823c1.71623,7.25714 -5.42465,13.19763 -1.14023,20.86111c-4.2211,6.69464 -8.74136,17.62585 -17.58711,18.4115c-9.70837,0.11472 -19.41676,0.2294 -29.12514,0.34415c-6.65182,-7.13144 -16.14077,-15.45563 -10.92694,-24.96432c-7.35572,-5.15384 5.77059,-13.49446 -4.37249,-16.88078c4.72483,-9.15317 -5.09684,-14.41994 -3.11918,-23.40988l0,0zm19.95543,64.05962c10.3149,0 20.62982,0 30.94472,0c-3.3429,2.41727 -5.36609,8.04688 -10.20465,6.82349c-4.97464,-0.38892 -10.5618,0.58282 -15.16096,-0.64023c-1.8597,-2.0611 -3.71941,-4.12219 -5.5791,-6.18326zm11.23076,-64.53401c-3.56728,-52.49875 -7.20926,-74.75493 -20.64074,-106.52489c-13.43148,-31.76996 -2.88758,-21.17014 27.12348,-24.60654c30.01106,-3.43639 13.46907,9.90684 13.48128,34.43486c0.01221,24.52803 1.7489,36.82391 3.69955,58.10826c-1.9278,20.61055 1.80084,20.75101 -2.79076,37.25708",
            	"car_smart": "m28.92024,238.37814c-20.54175,-8.15092 -27.36674,-32.3504 -27.6178,-52.52942c-2.7836,-14.94118 14.71887,-25.93048 8.95686,-41.2937c-2.18657,-22.71175 4.68564,-45.20703 14.9548,-65.22043c0.32475,-12.85873 10.87969,-17.84956 22.37955,-17.11762c37.15603,-4.71741 74.98359,-4.84966 112.15372,-0.39277c22.18198,4.11681 39.85953,19.32546 58.61859,30.81274c11.63586,8.63808 25.21985,14.32888 36.92355,22.63131c12.64026,10.62529 24.51556,22.47708 33.27448,36.57193c3.15143,14.09033 7.38165,28.09947 9.54742,42.2829c4.39661,13.27223 -4.6037,21.62047 -11.41214,30.84103c-10.34,12.57306 -29.90723,17.53416 -44.71561,10.78313c-10.28528,-3.75465 -14.07077,-19.70746 -25.7968,-18.60466c-44.20906,-0.65964 -88.41812,-1.31926 -132.62719,-1.97884c-10.24168,13.44736 -24.40165,28.14365 -42.91705,26.05086c-4.02312,-0.33679 -7.97831,-1.33774 -11.7224,-2.83646z",
            	"car": "m26.77284,183.48201c-8.08779,-6.80998 -23.25337,0.56996 -25.08215,-11.86069c-3.52016,-11.04616 7.23365,-19.6761 14.38957,-26.36473c12.51913,-6.23676 26.95447,-6.99092 40.49323,-9.84883c16.2238,-2.35439 33.11552,-4.36668 47.10119,-13.71207c15.9294,-9.9651 33.67083,-18.25834 52.86141,-18.11141c26.44141,-0.91634 53.7986,-0.02856 78.2453,11.26058c15.36688,6.93465 31.87709,10.4591 48.27711,13.85143c13.95395,1.83385 10.70889,16.88237 15.35007,26.15973c3.54291,10.65329 -4.11594,21.25732 -15.32654,21.59605c-11.85318,2.69405 -25.72552,2.95921 -34.00009,13.30453c-8.47623,9.38277 -23.69647,9.05888 -32.32811,0.09547c-3.56866,-2.21568 -5.9512,-7.58008 -10.70335,-6.65411c-44.31184,0.24008 -88.64653,-0.63266 -132.93902,0.78894c-11.57394,-0.92139 -16.38131,13.44077 -28.69251,12.44249c-6.30352,0.19554 -12.27285,-9.98318 -17.64611,-12.94739z",
            	"coud": "m193.50864,67.27344c-28.56444,0 -53.08249,14.81322 -65.08365,36.1982c-4.7932,-2.67596 -10.08009,-4.29625 -15.72245,-4.29625c-17.06268,0 -31.26126,13.72618 -35.64974,32.35901c-7.49058,-2.96072 -16.20005,-4.7533 -25.50328,-4.7533c-27.90971,0 -50.54951,15.27039 -50.54951,34.09579c0,16.99312 18.56764,30.96303 42.68829,33.54732c-1.08106,1.83421 -1.91961,3.65059 -1.91961,5.57599c0,18.02431 49.38134,32.72462 110.23999,32.72462c60.85864,0 110.24005,-14.70032 110.23999,-32.72462c0,-1.21274 -0.75272,-2.29501 -1.18832,-3.47357c2.66562,0.6629 5.30496,1.37115 8.22687,1.37115c16.28061,0.00005 29.5253,-11.06223 29.5253,-24.6806c0,-13.61838 -13.24469,-24.68059 -29.5253,-24.68059c-1.99515,0 -3.69165,0.68915 -5.57599,1.00551c1.64767,-5.44531 2.74228,-11.00153 2.74228,-16.91078c0,-36.04859 -32.63087,-65.35786 -72.94485,-65.35786z",
            	"drop": "m115.15536,295.759c-42.01334,-15.78687 -72.12711,-65.94934 -65.28346,-108.74701c4.3154,-26.98718 95.35947,-190.81818 103.3105,-185.90417c2.59511,1.60386 25.68835,39.79974 51.31831,84.87975c41.0565,72.21342 46.5999,85.67899 46.5999,113.19665c0,55.77716 -44.6394,101.46498 -98.23825,100.54555c-15.6409,-0.26834 -32.60906,-2.05518 -37.707,-3.97076zm42.09262,-28.05386c1.39066,-7.22116 -1.85785,-10.74289 -9.90955,-10.74289c-18.35065,0 -43.80598,-23.24161 -49.49309,-45.18889c-6.0666,-23.41179 -22.15186,-26.19615 -24.52774,-4.24574c-4.57746,42.29059 76.21872,100.22086 83.93037,60.17752z",
            	"electric_guitar": "m168.96899,1.09303c-2.62799,0.19977 -5.017,2.04496 -6.96899,4.55579c0.009,13.46278 -11.116,25.03858 -14.875,34.35928c2.30499,1.8475 1.13,2.9332 -1.03101,4.4286c-0.17,2.5165 0.468,4.9685 2.468,7.3554c-2.591,41.8755 -6.024,92.17889 -8.718,134.4599c6.14801,0.138 12.354,1.117 18.81201,0.687c-0.007,-32.55499 2.539,-84.562 3.282,-116.00749c-0.101,-10.2094 -0.504,-24.029 13.12399,-28.8618c-6.94499,-14.7833 5.922,-35.70095 -5.562,-40.97666c-0.146,-0.00122 -0.293,-0.00885 -0.438,0c-0.03099,0.00187 -0.062,-0.00236 -0.093,0l0,-0.00001zm11.692,171.76396c-4.715,6.66701 -11.79199,10.17 -14.146,13.60501c-5.37599,8.46799 -14.379,-3.16701 -26.89,2.99599c0.065,-1.02399 0.153,-2.172 0.21899,-3.20599c-0.07199,-0.002 -0.14699,0.00101 -0.21899,0c-6.659,1.013 -12.157,-7.713 -12.594,-15.44901c5.55199,-11.89 -14.242,-18.006 -19.5,-5.82899c-3.943,13.605 -0.41,27.51199 4.78201,40.672c5.933,16.162 -8.871,30.179 -13.2192,45.17601c-4.1375,9.502 -4.2709,20.46999 2.68719,29.192c9.486,13.58398 29.413,18.62799 47.563,18.758c3.23401,0.224 6.44801,0.414 9.68701,0.58499c57.61699,3.284 34.35399,-35.13699 25.282,-68.41299c-5.82201,-21.66299 1.48199,-36.38 6.269,-42.614c2.659,-7.35001 6.02899,-23 -9.92101,-15.472l0,-0.00101zm-34.567,-128.4203c2.43501,-11.918 -8.10399,0.709 0,0z",
            	"guitar": "m158.45264,1.00012c-0.96039,0.00612 -1.8884,0.06411 -2.73161,0.18457c-4.49716,0.64245 -8.99768,2.5655 -8.99768,2.5655c0,0 0.00569,8.99612 -0.63676,15.42064c-0.64244,6.42453 -3.21147,17.34015 -3.21147,17.34015l3.15611,6.32144l0.05536,-1.172l10.62189,1.86414l0.94128,0.05537c0,0 1.28059,-1.28413 2.56551,-3.21148c1.2849,-1.92736 3.85747,-3.21148 3.85747,-3.21148c0,0 0.63675,-9.63641 0.63675,-16.70339c0,-7.06698 2.57472,-18.63212 2.57472,-18.63212c0,0 -4.66991,-0.84783 -8.83156,-0.82133zm-1.74417,42.52442l-10.62189,-0.58139l-0.05536,-0.11074l-5.5278,113.65688c0.19376,0.03734 0.44296,0.08304 0.44296,0.08304c0.14801,2.18161 0.8121,3.84209 1.8549,5.14021l11.84926,5.41707c0.3562,0.09476 0.71249,0.18806 1.07048,0.28609l1.28276,-123.83578l-0.29532,-0.05537zm-0.98744,123.89115l0,0.20302l-1.07048,-0.48911c-4.80661,-1.27875 -9.3821,-2.34575 -11.84926,-5.41707l-2.5009,-1.14432l0.20303,-4.07893c-2.16553,-0.41753 -15.40038,-2.83867 -20.1179,-0.47989c-5.13962,2.56979 -8.99552,6.42279 -10.28043,14.77466c-1.2849,8.3519 2.57119,23.77351 1.92873,34.05275c-0.64246,10.27924 -7.71416,19.91469 -10.92641,28.26657c-3.21227,8.35188 -6.4202,17.99007 -2.5655,32.12404c3.85472,14.13391 17.99164,23.77151 25.70107,26.9838c7.70942,3.21225 23.7631,5.14023 23.7631,5.14023c0,0 15.42752,2.58041 25.06432,1.93796c20.23672,-3.64624 28.72404,-15.65756 29.98303,-30.66595c1.259,-15.00839 -4.71521,-33.01251 -13.40884,-48.65207c-9.50552,-17.10013 8.59656,-39.76326 -0.76596,-52.52802c-9.74182,-13.28188 -16.9409,8.64334 -23.78156,3.87593c-2.77655,-1.93504 -6.09895,-3.00655 -9.37605,-3.90359z",
            	"helicopter": "m145.07504,214.22588c7.36339,2.46503 20.68225,-9.04681 7.26401,-9.72079c-9.08205,-5.71648 20.13416,-1.63675 8.22827,-13.70961c-12.73747,-2.77332 -22.69479,-12.46857 -27.12979,-24.871c-5.18111,-13.36012 -22.04633,-9.68964 -33.09622,-13.54991c-22.05075,-3.93678 -44.07657,-8.59007 -66.50366,-9.73877c-7.45861,8.40495 -10.97594,26.46114 -24.24853,25.75703c-13.26779,-6.6758 0.56035,-23.43509 -3.41489,-33.00934c-7.79329,-2.62592 -6.3066,-7.72096 1.2938,-8.36586c11.59587,-8.00312 1.94812,-23.47349 -0.57486,-34.01581c-6.13778,-10.01295 7.00565,-18.8414 12.01386,-7.02641c6.38165,12.3224 10.0863,25.85204 15.15507,38.7706c1.5816,8.28716 13.30507,3.58878 19.44516,6.06101c25.89155,2.78554 51.80775,5.58556 77.83869,6.66318c13.03992,-5.6261 26.8783,-10.34038 41.29993,-8.34114c10.08574,3.05644 15.78185,-0.7104 15.3338,-11.13895c5.72609,-15.02095 -14.03151,-8.3312 -22.93935,-10.54208c-35.53757,-1.72837 -71.18015,-2.25171 -106.70476,-0.12757c-7.88696,-1.96813 10.41693,-1.78943 13.19444,-2.24187c37.48436,-1.98021 75.04819,-1.00611 112.54227,-2.69012c10.81163,-3.98792 21.54251,3.11311 32.56555,1.91049c27.80304,1.13907 55.63103,1.5356 83.45552,1.62198c-7.86588,5.84674 -22.53885,0.05771 -32.94354,1.5061c-20.90826,-0.64194 -41.94905,-1.24406 -62.73434,1.6021c-8.09567,7.82163 -3.84563,24.5245 6.28453,28.41502c10.32359,5.55025 20.91692,10.41565 30.31529,17.0117c5.93991,11.31316 22.72864,20.80537 17.77679,35.05132c-5.67494,11.7886 -26.25294,4.37625 -31.4632,7.69153c3.85466,6.8309 17.16597,7.52176 19.55997,10.01913c-13.12518,3.78056 -0.61014,11.85339 6.85498,9.29091c9.21201,2.18106 -9.36668,3.71298 -12.4339,2.99583c-14.92371,0.12004 -29.83833,-0.52202 -44.7583,-0.72722c14.41679,-0.6433 28.87468,-0.63033 43.24721,-2.05975c-3.35245,-13.78374 -21.0649,-7.04161 -31.27078,-9.43388c-4.97525,-2.55072 -21.3748,0.68501 -13.06122,5.71829c4.63876,-2.08994 15.97667,-0.09111 5.65021,2.25237c-18.67735,0.60303 -37.42494,0.87289 -56.04201,-1.0285zm45.45972,-5.72816c-5.69293,-8.23618 -25.36656,-6.65369 -28.94688,0.84814c6.97417,5.6115 21.3663,3.65866 28.78714,0.2599l0.15974,-1.10805l0,0zm41.15115,-4.79669c-8.39107,-5.92067 -23.748,-6.57408 -31.28664,-1.76099c9.46599,4.52687 21.07687,2.68456 31.28664,1.76099zm-41.46053,-2.71213c8.91602,-7.60876 -15.73071,-6.19264 -21.17932,-5.80487c-13.47525,6.12955 5.46666,7.82239 11.1256,6.8177c3.37151,-0.02223 6.75697,-0.27522 10.05373,-1.01283z",
            	"katana": "m127.28507,65.14041c-7.0962,-0.54353 -19.86895,7.61395 -17.02093,-6.32892c4.93732,-8.55679 18.30521,-4.48845 16.78561,5.48313l0.17354,0.62374l0.06178,0.22205l0,0zm17.16403,-18.49577c-6.77293,11.60114 -22.03173,12.43076 -33.48896,16.75148c-5.30647,3.04373 -26.81981,5.02184 -18.62814,-4.27034c11.69819,-7.75446 26.08649,-9.62626 39.25734,-13.85468c4.24069,-0.99664 9.15976,-1.38791 12.85976,1.37354zm-35.03055,12.26915c-5.16663,-17.73298 -10.33324,-35.46593 -15.49986,-53.19891c6.32053,-8.5978 20.25586,-4.8693 18.32531,6.59137c4.01678,13.78642 8.03355,27.57289 12.05032,41.35935m-5.56697,9.33072c22.56753,79.08354 48.81091,157.2375 81.6054,232.70842m-75.6467,-234.76585c22.79797,74.42342 46.12929,148.92492 77.59851,220.23124c0.43317,5.52475 14.80417,22.08911 1.77542,17.81497c-4.05151,-1.9415 -10.97104,-0.62137 -11.72156,-6.31741c-30.74268,-74.29929 -57.39734,-150.28568 -79.92033,-227.47363",
            	"leaf_1": "m35.63904,285.5213c9.77121,-31.99348 23.14531,-59.08864 35.83149,-72.59245c13.5912,-14.46718 7.56125,-20.74258 -6.45918,-6.72212c-5.89857,5.89853 -7.58387,1.61555 -7.58387,-19.2735c0,-49.83961 25.83589,-80.67891 87.99842,-105.04016c52.59872,-20.61333 91.37741,-43.79435 107.45589,-64.23479l13.10197,-16.65652l0,28.9807c0,35.83507 -11.11781,89.97318 -23.42422,114.0641c-13.0549,25.55626 -57.80217,72.72934 -79.76038,84.08435c-19.67261,10.17316 -61.687,13.16808 -84.14172,5.99792c-11.19011,-3.57314 -14.7415,-0.84308 -20.53963,15.78944c-3.8556,11.06018 -7.0102,26.79501 -7.0102,34.96616c0,9.27652 -3.72057,14.8566 -9.90572,14.8566c-7.3461,0 -8.78352,-3.67429 -5.56284,-14.21973z",
            	"menorah": "m86.17095,270.72717c9.02267,-23.09398 33.59461,-36.70894 57.45916,-38.45409c0,-4.91623 0,-9.83244 0,-14.74866c-38.305,-2.75075 -76.20534,-18.86525 -101.66333,-48.29793c-23.2569,-24.97108 -35.58256,-58.55817 -37.27682,-92.42073c-13.45491,-9.58464 12.56556,-16.55834 15.7355,-5.95607c-7.24909,8.79617 -0.22592,22.59306 0.80432,33.36646c11.47956,50.91395 56.38975,91.60496 107.78628,98.82449c13.14264,5.82442 16.6395,-2.00252 14.39308,-13.99509c2.81267,-9.48175 -7.44086,-6.60333 -13.57417,-8.37358c-40.52152,-7.1041 -75.7263,-38.65041 -86.11595,-78.75394c-2.97659,-11.47399 -3.94458,-24.11363 -7.5694,-33.51495c7.70256,-6.02401 26.19639,-1.60448 15.97076,9.15671c1.09565,45.56244 38.91488,85.76277 83.65269,91.48959c9.24995,4.52249 8.18915,-3.21457 7.85701,-9.40932c4.90146,-15.06035 -9.71606,-12.79654 -19.53952,-16.50067c-27.62657,-9.39215 -47.87568,-36.35101 -49.79039,-65.51331c-13.2153,-11.51691 15.74928,-17.53994 15.95383,-5.55531c-7.59098,8.84892 0.96818,23.21689 5.54156,32.6564c10.3335,16.84724 28.24842,28.22102 47.83452,30.47823c0,-7.52246 0,-15.04491 0,-22.56738c-18.20905,-2.81535 -32.7534,-18.72141 -34.8131,-36.97318c-12.40635,-10.10166 14.58986,-14.97282 16.53119,-5.29626c-6.736,5.28018 -1.66743,13.75206 2.28733,19.47478c2.82583,3.38407 16.81124,15.16281 15.99458,6.28913c0,-10.03232 0,-20.06463 0,-30.09695c-8.52963,-5.41637 3.21713,-9.02356 -1.91258,-15.41792c2.95047,-6.63559 4.28693,-23.79965 6.49635,-24.00391c7.40089,10.5439 4.63795,25.17949 11.62167,34.34932c-3.85376,4.14688 -4.52328,8.74758 -3.86568,14.89357c0,8.05796 0,16.11592 0,24.17388c11.03737,-3.24367 21.02812,-12.42406 21.72646,-24.48188c-12.61211,-14.80839 30.69243,-11.52931 12.71999,1.59949c-1.87195,17.85434 -17.0993,32.57059 -34.44644,35.57887c0,7.49281 0,14.98562 0,22.47842c29.68999,-2.98224 55.87296,-29.1582 56.39926,-59.47436c-12.36238,-13.6567 27.91393,-12.75137 14.12813,-0.52898c-3.16423,14.80594 -6.23018,30.54218 -16.29872,42.63571c-12.70108,17.1765 -33.04718,27.37456 -53.98901,29.78134c0.16994,9.14496 -4.65584,28.46082 11.13493,20.75519c39.31322,-6.69104 72.74197,-39.63307 78.74797,-79.43351c5.73982,-8.84732 -8.70837,-25.00382 8.28397,-22.77648c10.50046,-2.44997 11.98193,6.34405 5.8692,11.72792c-2.04736,35.89314 -21.91298,70.45303 -53.09749,88.60141c-15.52945,9.13074 -33.16388,14.88533 -51.17824,15.85547c0.17836,7.53169 -0.4761,15.16116 0.61618,22.6142c35.31798,-2.81911 70.08339,-18.10321 93.11932,-45.67516c20.51892,-23.04272 31.08511,-53.43816 32.84753,-84.00375c-10.43478,-10.04525 11.39471,-11.61442 16.59445,-7.04305c-5.883,11.66189 -5.21661,27.04671 -9.11984,40.52295c-12.68921,53.08224 -58.41412,95.84925 -111.85593,105.51876c-7.32545,1.56883 -14.77785,2.36348 -22.20172,3.29227c-0.71042,9.09981 -0.50818,18.35449 11.59822,16.61531c20.59241,4.32626 40.36211,18.55411 46.94081,39.19469c-43.09088,0 -86.18179,0 -129.2727,0c0.31159,-0.88608 0.62314,-1.77219 0.93477,-2.65823zm-82.88959,-208.5947c-0.54892,-8.1144 4.33617,-25.42208 5.66115,-27.43132c2.27143,7.42761 12.58555,23.78434 4.72879,28.60384c-3.29131,-0.38358 -8.04816,1.57556 -10.38994,-1.17252zm34.52483,0.55147c-1.7146,-10.01769 5.4567,-19.41309 4.51432,-29.75311c3.2196,8.43034 16.36395,29.47998 1.96646,30.42084c-2.16732,-0.0773 -4.38702,0.03559 -6.48078,-0.66772zm35.62526,-0.17229c-1.52428,-9.82734 5.20364,-19.12723 4.61758,-29.264c3.98769,8.50923 17.39558,32.7104 -0.82941,30.07944l-1.91212,-0.12625l-1.87605,-0.68919l0,0zm34.60818,0.26421c-1.9521,-10.01891 5.40411,-19.48301 4.43661,-29.84504c3.27068,8.4848 16.29427,29.36411 1.98981,30.63179c-2.15335,-0.08198 -4.37302,0.0215 -6.42642,-0.78675zm69.2087,-0.38279c-1.5544,-10.07727 5.31645,-19.6095 4.34973,-30.05398c2.70531,5.08463 6.32187,13.73424 7.91895,20.50951c4.77353,11.03205 -3.95122,12.51878 -12.26868,9.54446zm35.71176,0.44493c-2.89404,-9.75608 5.30412,-19.55815 4.07715,-29.90718c3.42241,8.32418 12.40758,23.15913 6.53528,30.337c-3.53609,0.01955 -7.13571,0.41735 -10.61243,-0.42982zm34.8703,-0.20629c-2.23303,-8.13288 4.34842,-24.82986 5.07388,-28.23849c3.49849,8.39077 16.5291,33.58521 -2.7937,28.93562l-2.28018,-0.69713l0,0zm35.10023,-0.15336c-1.90784,-8.93159 5.20419,-21.786 4.83258,-28.71239c3.47043,8.02287 16.97986,32.30244 -0.94669,29.60343l-1.89111,-0.14957l-1.99478,-0.74147l0,0z",
            	"sun": "m238.69324,135.65587c0,46.60593 -40.30034,84.38748 -90.01332,84.38748c-49.71299,0 -90.01332,-37.78156 -90.01332,-84.38748c0,-46.6059 40.30033,-84.38747 90.01332,-84.38747c49.71298,0 90.01332,37.78154 90.01332,84.38747zm-7.30318,120.56636c-4.20586,5.25757 -51.12886,-47.27794 -57.30507,-44.69331c-6.17622,2.58458 -15.51068,86.52086 -22.0425,87.47173c-6.53188,0.9509 -17.76118,-85.09837 -24.12714,-87.15329c-6.36602,-2.05495 -43.23042,49.74286 -48.75608,45.85272c-5.52563,-3.89009 13.12091,-67.11951 10.04803,-73.73549c-3.07288,-6.61595 -73.34953,-9.72229 -74.79697,-17.10284c-1.44742,-7.38055 63.69369,-26.7453 64.2322,-34.0554c0.53854,-7.31011 -43.73452,-48.6129 -41.1993,-55.02096c2.53526,-6.40806 61.81988,21.03078 65.82475,15.40928c4.00487,-5.62149 -7.80805,-76.34053 -1.73039,-78.4587c6.07763,-2.11818 42.59449,47.54089 49.0827,47.30339c6.48817,-0.23753 26.02002,-62.46352 32.64861,-61.00949c6.62865,1.45401 3.32251,66.01247 8.45366,70.32287c5.13113,4.31043 55.87381,-16.15842 59.63792,-10.29998c3.76414,5.85843 -29.09575,62.86814 -27.11681,69.62658c1.97902,6.75845 62.18188,13.20758 61.3595,20.19514c-0.82245,6.98758 -75.2742,9.96732 -78.37666,16.73535c-3.10245,6.76802 28.36942,83.35484 24.16354,88.6124z",
            	"chair": "m118.11539,289.55515c-7.47328,-14.4328 15.76004,-21.83389 9.75156,-35.26642c-9.58212,-8.59285 -23.93785,-6.58557 -35.88018,-5.92961c-12.89955,-1.58955 -16.67669,11.62587 -24.11323,17.11729c-14.66394,-4.57965 -9.41961,-23.5907 3.95336,-25.69879c17.48831,-7.56879 36.79559,-3.21786 54.96046,-6.57193c13.14571,-7.65541 -3.09947,-24.09541 -13.42245,-25.84244c-17.08451,-6.9008 -38.18468,-7.0844 -51.24073,-21.62146c-5.1916,-11.32457 -3.84497,-32.04767 10.15321,-36.01445c6.34414,-10.73523 5.01785,-24.55999 3.35027,-36.47948c1.42348,-12.67513 -26.70474,-5.25126 -14.90233,-18.24577c10.64336,-8.15804 24.36629,-13.15867 37.81105,-12.959c10.96933,0.36309 11.71716,12.99065 -0.37628,9.89848c-12.30081,6.18077 -7.72121,23.86169 -7.25122,35.16668c5.93514,11.39347 22.04794,5.36764 32.49831,7.07384c14.8665,0.39955 21.73593,0.44463 35.83476,5.23605c14.25958,-1.05464 8.64325,-20.61657 0.17079,-21.97119c-13.03212,-2.87206 -25.91483,-10.25501 -33.20317,-21.62909c-4.07215,-13.26593 1.69855,-27.24597 4.77583,-40.18096c9.18196,-28.0861 34.13237,-54.57027 65.33606,-54.63913c19.15414,0.28833 38.85675,14.48402 42.13089,33.82922c2.48616,20.34066 -5.57245,41.0622 -0.32005,61.11538c12.75343,7.04288 -8.70227,17.78406 -9.16336,27.50478c-5.43883,14.13736 6.97403,30.55498 -3.65417,43.29654c-6.64983,9.38159 -22.16026,14.5639 -22.43275,27.04953c-3.81845,11.24202 -21.47061,10.39703 -30.28923,17.71931c-9.74564,2.86838 -15.08257,19.17726 -0.15649,15.9317c14.55153,-0.35892 29.03516,-5.81784 43.55118,-3.3181c10.39314,7.10063 -0.45073,21.22018 -10.9113,14.54475c-5.46445,0.08383 -25.63857,2.80356 -18.76688,8.69054c17.18895,4.015 35.8273,9.2104 46.95854,24.0352c10.43184,13.90863 -12.73763,17.22995 -17.34935,5.0022c-19.29245,-15.75378 -48.30531,-24.24933 -70.97163,-10.48508c-13.71143,5.73386 -10.53542,20.53958 -11.98199,31.56015c-5.57972,6.09451 -13.26627,-2.5275 -14.84946,-7.91876zm100.26077,-153.99353c-4.62421,-8.64436 -27.69229,-17.16811 -30.82967,-4.71919c1.76141,12.68575 19.62196,15.68971 29.15408,10.51048c1.73547,-1.32053 2.45361,-3.74493 1.67558,-5.79129z"
            	}
            }
          • raphael.txt
            All Raphaël icons were retrieved from here:
            http://raphaeljs.com/icons/
            
            And fall under the MIT license:
            
            Copyright © 2008 Dmitry Baranovskiy
            
            Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
            
            The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
            
            The software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.
          • raphael_1.json
            {"size": 32,
            "fill": true,
            "data": {
                "raph_?": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.328,24.371h-2.707v-2.596h2.707V24.371zM17.328,19.003v0.858h-2.707v-1.057c0-3.19,3.63-3.696,3.63-5.963c0-1.034-0.924-1.826-2.134-1.826c-1.254,0-2.354,0.924-2.354,0.924l-1.541-1.915c0,0,1.519-1.584,4.137-1.584c2.487,0,4.796,1.54,4.796,4.136C21.156,16.208,17.328,16.627,17.328,19.003z",
                "raph_i": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M14.757,8h2.42v2.574h-2.42V8z M18.762,23.622H16.1c-1.034,0-1.475-0.44-1.475-1.496v-6.865c0-0.33-0.176-0.484-0.484-0.484h-0.88V12.4h2.662c1.035,0,1.474,0.462,1.474,1.496v6.887c0,0.309,0.176,0.484,0.484,0.484h0.88V23.622z",
                "raph_$": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.255,23.88v2.047h-1.958v-2.024c-3.213-0.44-4.621-3.08-4.621-3.08l2.002-1.673c0,0,1.276,2.223,3.586,2.223c1.276,0,2.244-0.683,2.244-1.849c0-2.729-7.349-2.398-7.349-7.459c0-2.2,1.738-3.785,4.137-4.159V5.859h1.958v2.046c1.672,0.22,3.652,1.1,3.652,2.993v1.452h-2.596v-0.704c0-0.726-0.925-1.21-1.959-1.21c-1.32,0-2.288,0.66-2.288,1.584c0,2.794,7.349,2.112,7.349,7.415C21.413,21.614,19.785,23.506,17.255,23.88z",
                "raph_temp": "M19.361,17.744V3.438c0-1.85-1.504-3.348-3.352-3.348c-1.852,0-3.35,1.498-3.35,3.348v14.193c-2.106,1.154-3.536,3.391-3.536,5.961c0,3.752,3.042,6.793,6.793,6.793c3.753,0,6.793-3.041,6.793-6.793C22.71,21.099,21.363,18.924,19.361,17.744zM15.917,29.27c-3.129,0-5.676-2.548-5.676-5.68c0-2.072,1.132-3.98,2.954-4.979l0.581-0.316V3.437c0-1.231,1.003-2.231,2.236-2.231c1.231,0,2.232,1,2.232,2.231v14.942l0.548,0.324c1.756,1.036,2.806,2.861,2.806,4.887C21.596,26.722,19.048,29.27,15.917,29.27zM18.225,19.666l-1.099-0.647V9.26h-2.233v9.695l-1.161,0.635c-1.464,0.805-2.375,2.334-2.375,4c0,2.514,2.047,4.561,4.56,4.561c2.515,0,4.56-2.047,4.56-4.561C20.479,21.988,19.616,20.485,18.225,19.666z",
                "raph_thunder": "M25.371,7.306c-0.092-3.924-3.301-7.077-7.248-7.079c-2.638,0.001-4.942,1.412-6.208,3.517c-0.595-0.327-1.28-0.517-2.01-0.517C7.626,3.229,5.772,5.033,5.689,7.293c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h5.271l-2.166,3.398l1.977-0.411L10,30.875l9.138-10.102L17,21l2.167-2.023h4.269c3.312,0,6-2.688,6-6C29.434,10.34,27.732,8.11,25.371,7.306zM23.436,16.979H7.561c-2.209-0.006-3.997-1.792-4.001-4.001c-0.002-1.982,1.45-3.618,3.35-3.931c0.265-0.043,0.502-0.191,0.657-0.414C7.722,8.41,7.779,8.136,7.73,7.87C7.702,7.722,7.685,7.582,7.685,7.446C7.689,6.221,8.68,5.23,9.905,5.228c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.309c0.342-0.066,0.626-0.307,0.748-0.63c0.749-1.992,2.662-3.412,4.911-3.41c2.899,0.004,5.244,2.35,5.251,5.249c0,0.161-0.009,0.326-0.027,0.497c-0.049,0.517,0.305,0.984,0.815,1.079c1.86,0.344,3.274,1.966,3.271,3.923C27.43,15.186,25.645,16.973,23.436,16.979z",
                "raph_snow": "M25.372,6.912c-0.093-3.925-3.302-7.078-7.248-7.08c-2.638,0.002-4.942,1.412-6.208,3.518c-0.595-0.327-1.28-0.518-2.01-0.518C7.627,2.834,5.773,4.639,5.69,6.898c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.875c3.312,0,6-2.688,6-6C29.434,9.944,27.732,7.715,25.372,6.912zM23.436,16.584H7.562c-2.209-0.006-3.997-1.793-4.001-4c-0.002-1.983,1.45-3.619,3.35-3.933c0.265-0.043,0.502-0.19,0.657-0.414C7.723,8.015,7.78,7.74,7.731,7.475C7.703,7.326,7.686,7.187,7.686,7.051c0.004-1.225,0.995-2.217,2.22-2.219c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.31c0.342-0.066,0.626-0.308,0.748-0.631c0.749-1.992,2.662-3.412,4.911-3.41c2.898,0.004,5.244,2.351,5.251,5.25c0,0.16-0.009,0.325-0.026,0.496c-0.05,0.518,0.305,0.984,0.814,1.079c1.859,0.345,3.273,1.966,3.271,3.923C27.43,14.791,25.645,16.578,23.436,16.584zM16.667,24.09l1.119-1.119c0.389-0.391,0.389-1.025,0-1.416c-0.392-0.391-1.025-0.391-1.415,0l-1.119,1.119l-1.119-1.119c-0.391-0.391-1.025-0.391-1.415,0c-0.391,0.391-0.391,1.025,0,1.416l1.118,1.117l-1.12,1.121c-0.389,0.393-0.389,1.021,0,1.414c0.195,0.188,0.451,0.293,0.707,0.293c0.256,0,0.512-0.104,0.708-0.293l1.12-1.119l1.12,1.119c0.195,0.188,0.451,0.293,0.708,0.293c0.256,0,0.512-0.104,0.707-0.293c0.391-0.396,0.391-1.021,0-1.414L16.667,24.09zM25.119,21.817c-0.393-0.392-1.025-0.392-1.415,0l-1.12,1.121l-1.12-1.121c-0.391-0.392-1.022-0.392-1.414,0c-0.39,0.392-0.39,1.022,0,1.416l1.119,1.119l-1.119,1.119c-0.39,0.391-0.39,1.022,0,1.413c0.195,0.195,0.451,0.294,0.707,0.294c0.257,0,0.513-0.099,0.707-0.294l1.12-1.118l1.12,1.118c0.194,0.195,0.45,0.294,0.707,0.294c0.256,0,0.513-0.099,0.708-0.294c0.389-0.391,0.389-1.022,0-1.413l-1.12-1.119l1.12-1.119C25.507,22.842,25.507,22.209,25.119,21.817zM9.334,23.953l1.119-1.119c0.389-0.394,0.389-1.021,0-1.414c-0.391-0.394-1.025-0.394-1.415,0l-1.119,1.119l-1.12-1.121c-0.391-0.39-1.023-0.39-1.415,0c-0.391,0.396-0.391,1.024,0,1.418l1.119,1.117l-1.12,1.118c-0.391,0.394-0.391,1.025,0,1.414c0.196,0.195,0.452,0.293,0.708,0.293c0.256,0,0.511-0.098,0.707-0.293l1.12-1.119l1.121,1.121c0.195,0.195,0.451,0.293,0.707,0.293s0.513-0.098,0.708-0.293c0.389-0.391,0.389-1.022,0-1.416L9.334,23.953z",
                "raph_hail": "M25.372,6.912c-0.093-3.925-3.302-7.078-7.248-7.08c-2.638,0.002-4.942,1.412-6.208,3.518c-0.595-0.327-1.28-0.518-2.01-0.518C7.627,2.834,5.773,4.639,5.69,6.898c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.875c3.312,0,6-2.688,6-6C29.434,9.944,27.732,7.715,25.372,6.912zM23.436,16.584H7.562c-2.209-0.006-3.997-1.793-4.001-4c-0.002-1.983,1.45-3.619,3.35-3.933c0.265-0.043,0.502-0.19,0.657-0.414C7.723,8.015,7.78,7.74,7.731,7.475C7.703,7.326,7.686,7.187,7.686,7.051c0.004-1.225,0.995-2.217,2.22-2.219c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.31c0.342-0.066,0.626-0.308,0.748-0.631c0.749-1.992,2.662-3.412,4.911-3.41c2.898,0.004,5.244,2.351,5.251,5.25c0,0.16-0.009,0.325-0.026,0.496c-0.05,0.518,0.305,0.984,0.814,1.079c1.859,0.345,3.273,1.966,3.271,3.923C27.43,14.791,25.645,16.578,23.436,16.584zM11.503,23.709c-0.784-0.002-1.418-0.636-1.418-1.416c0-0.785,0.634-1.416,1.418-1.418c0.78,0.002,1.413,0.633,1.416,1.418C12.917,23.073,12.284,23.707,11.503,23.709zM19.002,23.709c-0.783-0.002-1.418-0.636-1.418-1.416c0-0.785,0.635-1.416,1.418-1.418c0.779,0.002,1.414,0.633,1.414,1.418C20.417,23.073,19.784,23.707,19.002,23.709zM7.503,28.771c-0.783-0.002-1.417-0.637-1.417-1.418s0.634-1.414,1.417-1.416c0.78,0.002,1.415,0.635,1.415,1.416C8.917,28.135,8.284,28.77,7.503,28.771zM15.001,28.771c-0.782-0.002-1.417-0.637-1.417-1.418s0.634-1.414,1.417-1.416c0.78,0.002,1.413,0.635,1.415,1.416C16.415,28.135,15.784,28.77,15.001,28.771zM22.5,28.771c-0.782-0.002-1.416-0.634-1.416-1.416c0-0.785,0.634-1.418,1.416-1.42c0.781,0.002,1.414,0.635,1.418,1.42C23.915,28.138,23.282,28.77,22.5,28.771z",
                "raph_rain": "M25.371,7.306c-0.092-3.924-3.301-7.077-7.248-7.079c-2.638,0.001-4.942,1.412-6.208,3.517c-0.595-0.327-1.28-0.517-2.01-0.517C7.626,3.229,5.772,5.033,5.689,7.293c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.874c3.312,0,6-2.688,6-6C29.434,10.34,27.732,8.11,25.371,7.306zM23.436,16.979H7.561c-2.209-0.006-3.997-1.792-4.001-4.001c-0.002-1.982,1.45-3.618,3.35-3.931c0.265-0.043,0.502-0.191,0.657-0.414C7.722,8.41,7.779,8.136,7.73,7.87C7.702,7.722,7.685,7.582,7.685,7.446C7.689,6.221,8.68,5.23,9.905,5.228c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.309c0.342-0.066,0.626-0.307,0.748-0.63c0.749-1.992,2.662-3.412,4.911-3.41c2.899,0.004,5.244,2.35,5.251,5.249c0,0.161-0.009,0.326-0.027,0.497c-0.049,0.517,0.305,0.984,0.815,1.079c1.86,0.344,3.274,1.966,3.271,3.923C27.43,15.186,25.645,16.973,23.436,16.979zM9.029,26.682c0-1.115,0.021-5.425,0.021-5.432c0.002-0.409-0.247-0.779-0.628-0.932c-0.38-0.152-0.815-0.059-1.099,0.24c-0.006,0.008-1.037,1.098-2.081,2.342c-0.523,0.627-1.048,1.287-1.463,1.896c-0.399,0.648-0.753,1.066-0.811,1.885C2.971,28.355,4.324,29.711,6,29.714C7.672,29.71,9.029,28.354,9.029,26.682zM4.971,26.727c0.091-0.349,1.081-1.719,1.993-2.764c0.025-0.029,0.051-0.061,0.076-0.089c-0.005,1.124-0.01,2.294-0.01,2.808c0,0.567-0.461,1.028-1.029,1.03C5.447,27.71,4.997,27.273,4.971,26.727zM16.425,26.682c0-1.115,0.021-5.424,0.021-5.43c0.002-0.41-0.247-0.779-0.628-0.934c-0.381-0.152-0.814-0.058-1.1,0.242c-0.006,0.008-1.035,1.094-2.08,2.342c-0.522,0.623-1.047,1.285-1.463,1.894c-0.399,0.649-0.753,1.068-0.809,1.888c0,1.672,1.354,3.028,3.029,3.028C15.068,29.711,16.425,28.354,16.425,26.682zM12.365,26.729c0.092-0.349,1.081-1.72,1.993-2.765c0.025-0.03,0.05-0.06,0.075-0.089c-0.005,1.123-0.011,2.294-0.011,2.807c-0.002,0.568-0.461,1.027-1.028,1.029C12.84,27.709,12.392,27.273,12.365,26.729zM23.271,20.317c-0.38-0.153-0.816-0.06-1.099,0.24c-0.009,0.008-1.037,1.097-2.08,2.342c-0.523,0.625-1.049,1.285-1.462,1.896c-0.402,0.649-0.754,1.067-0.812,1.886c0,1.672,1.354,3.029,3.03,3.029c1.673,0,3.027-1.357,3.027-3.029c0-1.115,0.022-5.425,0.022-5.431C23.9,20.84,23.651,20.47,23.271,20.317zM21.879,26.681c-0.004,0.568-0.463,1.027-1.031,1.029c-0.553-0.002-1.002-0.438-1.028-0.982c0.092-0.349,1.081-1.72,1.993-2.765c0.025-0.028,0.05-0.059,0.074-0.088C21.883,24.998,21.879,26.167,21.879,26.681z",
                "raph_sun": "M15.502,7.504c-4.35,0-7.873,3.523-7.873,7.873c0,4.347,3.523,7.872,7.873,7.872c4.346,0,7.871-3.525,7.871-7.872C23.374,11.027,19.85,7.504,15.502,7.504zM15.502,21.25c-3.244-0.008-5.866-2.63-5.874-5.872c0.007-3.243,2.63-5.866,5.874-5.874c3.242,0.008,5.864,2.631,5.871,5.874C21.366,18.62,18.744,21.242,15.502,21.25zM15.502,6.977c0.553,0,1-0.448,1-1.001V1.125c-0.002-0.553-0.448-1-1-1c-0.553,0-1.001,0.449-1,1.002v4.85C14.502,6.528,14.949,6.977,15.502,6.977zM18.715,7.615c0.125,0.053,0.255,0.076,0.382,0.077c0.394,0,0.765-0.233,0.925-0.618l1.856-4.483c0.21-0.511-0.031-1.095-0.541-1.306c-0.511-0.211-1.096,0.031-1.308,0.541L18.174,6.31C17.963,6.82,18.205,7.405,18.715,7.615zM21.44,9.436c0.195,0.194,0.451,0.293,0.707,0.293s0.512-0.098,0.707-0.293l3.43-3.433c0.391-0.39,0.39-1.023,0-1.415c-0.392-0.39-1.025-0.39-1.415,0.002L21.44,8.021C21.049,8.412,21.049,9.045,21.44,9.436zM23.263,12.16c0.158,0.385,0.531,0.617,0.923,0.617c0.127,0,0.257-0.025,0.383-0.078l4.48-1.857c0.511-0.211,0.753-0.797,0.541-1.307s-0.796-0.752-1.307-0.54l-4.481,1.857C23.292,11.064,23.051,11.65,23.263,12.16zM29.752,14.371l-4.851,0.001c-0.552,0-1,0.448-0.998,1.001c0,0.553,0.447,0.999,0.998,0.999l4.852-0.002c0.553,0,0.999-0.449,0.999-1C30.752,14.817,30.304,14.369,29.752,14.371zM29.054,19.899l-4.482-1.854c-0.512-0.212-1.097,0.03-1.307,0.541c-0.211,0.511,0.031,1.096,0.541,1.308l4.482,1.854c0.126,0.051,0.256,0.075,0.383,0.075c0.393,0,0.765-0.232,0.925-0.617C29.806,20.695,29.563,20.109,29.054,19.899zM22.86,21.312c-0.391-0.391-1.023-0.391-1.414,0.001c-0.391,0.39-0.39,1.022,0,1.413l3.434,3.429c0.195,0.195,0.45,0.293,0.706,0.293s0.513-0.098,0.708-0.293c0.391-0.392,0.389-1.025,0-1.415L22.86,21.312zM20.029,23.675c-0.211-0.511-0.796-0.752-1.307-0.541c-0.51,0.212-0.752,0.797-0.54,1.308l1.86,4.48c0.159,0.385,0.531,0.617,0.925,0.617c0.128,0,0.258-0.024,0.383-0.076c0.511-0.211,0.752-0.797,0.54-1.309L20.029,23.675zM15.512,23.778c-0.553,0-1,0.448-1,1l0.004,4.851c0,0.553,0.449,0.999,1,0.999c0.553,0,1-0.448,0.998-1l-0.003-4.852C16.511,24.226,16.062,23.777,15.512,23.778zM12.296,23.142c-0.51-0.21-1.094,0.031-1.306,0.543l-1.852,4.483c-0.21,0.511,0.033,1.096,0.543,1.307c0.125,0.052,0.254,0.076,0.382,0.076c0.392,0,0.765-0.234,0.924-0.619l1.853-4.485C13.051,23.937,12.807,23.353,12.296,23.142zM9.57,21.325c-0.392-0.391-1.025-0.389-1.415,0.002L4.729,24.76c-0.391,0.392-0.389,1.023,0.002,1.415c0.195,0.194,0.45,0.292,0.706,0.292c0.257,0,0.513-0.098,0.708-0.293l3.427-3.434C9.961,22.349,9.961,21.716,9.57,21.325zM7.746,18.604c-0.213-0.509-0.797-0.751-1.307-0.54L1.96,19.925c-0.511,0.212-0.752,0.798-0.54,1.308c0.16,0.385,0.531,0.616,0.924,0.616c0.127,0,0.258-0.024,0.383-0.076l4.479-1.861C7.715,19.698,7.957,19.113,7.746,18.604zM7.1,15.392c0-0.553-0.447-0.999-1-0.999l-4.851,0.006c-0.553,0-1.001,0.448-0.999,1.001c0.001,0.551,0.449,1,1,0.998l4.852-0.006C6.654,16.392,7.102,15.942,7.1,15.392zM1.944,10.869l4.485,1.85c0.125,0.053,0.254,0.076,0.381,0.076c0.393,0,0.766-0.232,0.925-0.618c0.212-0.511-0.032-1.097-0.544-1.306L2.708,9.021c-0.511-0.21-1.095,0.032-1.306,0.542C1.19,10.074,1.435,10.657,1.944,10.869zM8.137,9.451c0.195,0.193,0.449,0.291,0.705,0.291s0.513-0.098,0.709-0.295c0.391-0.389,0.389-1.023-0.004-1.414L6.113,4.609C5.723,4.219,5.088,4.221,4.699,4.612c-0.391,0.39-0.389,1.024,0.002,1.414L8.137,9.451zM10.964,7.084c0.16,0.384,0.532,0.615,0.923,0.615c0.128,0,0.258-0.025,0.384-0.077c0.51-0.212,0.753-0.798,0.54-1.307l-1.864-4.479c-0.212-0.51-0.798-0.751-1.308-0.539C9.129,1.51,8.888,2.096,9.1,2.605L10.964,7.084z",
                "raph_undo": "M12.981,9.073V6.817l-12.106,6.99l12.106,6.99v-2.422c3.285-0.002,9.052,0.28,9.052,2.269c0,2.78-6.023,4.263-6.023,4.263v2.132c0,0,13.53,0.463,13.53-9.823C29.54,9.134,17.952,8.831,12.981,9.073z",
                "raph_merge": "M26.92,10.928l-3.574-2.064v2.297h-6.414c-1.123,0.084-3.062-1.19-5.218-2.881C9.543,6.676,7.062,4.709,3.74,4.656H1.505v3.662H3.74c1.627-0.047,3.633,1.232,5.769,2.883c0.796,0.577,1.599,1.213,2.45,1.788c-0.851,0.575-1.653,1.212-2.45,1.789c-2.136,1.646-4.142,2.929-5.767,2.882H1.505v3.668h2.236c3.315-0.047,5.797-2.02,7.975-3.621c2.156-1.691,4.094-2.966,5.218-2.883h6.412v2.297l3.574-2.062l3.576-2.064L26.92,10.928z",
                "raph_split": "M23.346,23.979l3.576-2.062l3.574-2.062l-3.576-2.064l-3.574-2.062v2.293c-0.876,0-1.894,0-2.235,0c-1.626,0.046-3.633-1.233-5.768-2.883c-0.796-0.578-1.599-1.214-2.45-1.789c0.851-0.575,1.653-1.211,2.45-1.789c2.135-1.647,4.142-2.929,5.766-2.882l2.237-0.001v2.296l3.574-2.063l3.576-2.064L26.92,4.78l-3.574-2.064v2.295H21.11c-3.321,0.047-5.803,2.019-7.975,3.622c-2.156,1.691-4.094,2.965-5.218,2.882H1.505v3.664h6.414c1.123-0.083,3.062,1.191,5.218,2.882c2.171,1.604,4.652,3.575,7.974,3.622h2.235V23.979L23.346,23.979z",
                "raph_fork": "M26.268,22.562l3.514-2.03l-3.514-2.028l-3.515-2.028v2.256c-0.922-0.002-2.45-0.002-2.883-0.002c-1.28-0.03-2.12-0.431-2.994-1.148c-1.303-1.07-2.415-2.997-3.756-4.853c-0.682-0.923-1.442-1.839-2.454-2.575C9.664,9.415,8.355,8.902,6.9,8.912H0.593v3.604H6.9c0.877,0.016,1.432,0.302,2.189,1.012c1.12,1.055,2.212,3.072,3.718,4.983c1.476,1.893,3.747,3.804,7.041,3.823h2.905v2.256L26.268,22.562zM11.401,8.912c0.04,0.028,0.082,0.053,0.121,0.082c1.202,0.874,2.07,1.947,2.757,2.88c0.158,0.218,0.298,0.428,0.448,0.642h8.026v2.257l3.515-2.028l3.514-2.029l-3.514-2.029l-3.515-2.03v2.255H11.401z",
                "raph_shuffle": "M9.089,13.133c0.346,0.326,0.69,0.75,1.043,1.228c0.051-0.073,0.099-0.144,0.15-0.219c0.511-0.75,1.09-1.599,1.739-2.421c0.103-0.133,0.211-0.245,0.316-0.371c-0.487-0.572-1.024-1.12-1.672-1.592C9.663,9.02,8.354,8.506,6.899,8.517H0.593v3.604H6.9C7.777,12.138,8.333,12.422,9.089,13.133zM22.753,16.082v2.256c-0.922-0.002-2.45-0.002-2.883-0.002c-1.28-0.03-2.12-0.438-2.994-1.148c-0.378-0.311-0.74-0.7-1.097-1.133c-0.268,0.376-0.538,0.764-0.813,1.168c-0.334,0.488-0.678,0.99-1.037,1.484c-0.089,0.121-0.189,0.246-0.283,0.369c1.455,1.528,3.473,2.846,6.202,2.862h2.905v2.256l3.515-2.026l3.521-2.03l-3.521-2.028L22.753,16.082zM16.876,13.27c0.874-0.712,1.714-1.118,2.994-1.148c0.433,0,1.961,0,2.883-0.002v2.256l3.515-2.026l3.521-2.028l-3.521-2.029l-3.515-2.027V8.52h-2.905c-3.293,0.02-5.563,1.93-7.041,3.822c-1.506,1.912-2.598,3.929-3.718,4.982C8.332,18.033,7.777,18.32,6.9,18.336H0.593v3.604H6.9c1.455,0.011,2.764-0.502,3.766-1.242c1.012-0.735,1.772-1.651,2.454-2.573C14.461,16.267,15.574,14.34,16.876,13.27z",
                "raph_refresh": "M15.999,4.308c1.229,0.001,2.403,0.214,3.515,0.57L18.634,6.4h6.247l-1.562-2.706L21.758,0.99l-0.822,1.425c-1.54-0.563-3.2-0.878-4.936-0.878c-7.991,0-14.468,6.477-14.468,14.468c0,3.317,1.128,6.364,3.005,8.805l2.2-1.689c-1.518-1.973-2.431-4.435-2.436-7.115C4.312,9.545,9.539,4.318,15.999,4.308zM27.463,7.203l-2.2,1.69c1.518,1.972,2.431,4.433,2.435,7.114c-0.011,6.46-5.238,11.687-11.698,11.698c-1.145-0.002-2.24-0.188-3.284-0.499l0.828-1.432H7.297l1.561,2.704l1.562,2.707l0.871-1.511c1.477,0.514,3.058,0.801,4.709,0.802c7.992-0.002,14.468-6.479,14.47-14.47C30.468,12.689,29.339,9.643,27.463,7.203z",
                "raph_smile2": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM16,29.534C8.539,29.534,2.466,23.462,2.466,16C2.466,8.539,8.539,2.466,16,2.466c7.462,0,13.535,6.072,13.535,13.533C29.534,23.462,23.462,29.534,16,29.534zM11.104,14c0.932,0,1.688-1.483,1.688-3.312s-0.755-3.312-1.688-3.312s-1.688,1.483-1.688,3.312S10.172,14,11.104,14zM20.729,14c0.934,0,1.688-1.483,1.688-3.312s-0.756-3.312-1.688-3.312c-0.932,0-1.688,1.483-1.688,3.312S19.798,14,20.729,14zM8.143,21.189C10.458,24.243,13.148,26,16.021,26c2.969,0,5.745-1.868,8.11-5.109c-2.515,1.754-5.292,2.734-8.215,2.734C13.164,23.625,10.54,22.756,8.143,21.189z",
                "raph_smile": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM20.729,7.375c0.934,0,1.688,1.483,1.688,3.312S21.661,14,20.729,14c-0.932,0-1.688-1.483-1.688-3.312S19.798,7.375,20.729,7.375zM11.104,7.375c0.932,0,1.688,1.483,1.688,3.312S12.037,14,11.104,14s-1.688-1.483-1.688-3.312S10.172,7.375,11.104,7.375zM16.021,26c-2.873,0-5.563-1.757-7.879-4.811c2.397,1.564,5.021,2.436,7.774,2.436c2.923,0,5.701-0.98,8.215-2.734C21.766,24.132,18.99,26,16.021,26z",
                "raph_alarm": "M15.499,5.125c-0.553,0-0.999,0.448-0.999,1v9.221L8.454,17.99c-0.506,0.222-0.736,0.812-0.514,1.318c0.164,0.375,0.53,0.599,0.915,0.599c0.134,0,0.271-0.027,0.401-0.085l6.626-2.898c0.005-0.002,0.009-0.004,0.013-0.006l0.004-0.002c0.015-0.006,0.023-0.02,0.037-0.025c0.104-0.052,0.201-0.113,0.279-0.195c0.034-0.034,0.053-0.078,0.079-0.117c0.048-0.064,0.101-0.127,0.13-0.204c0.024-0.06,0.026-0.125,0.038-0.189c0.013-0.064,0.038-0.121,0.038-0.186V6.124C16.5,5.573,16.052,5.125,15.499,5.125zM31.125,6.832c0-3.832-3.105-6.938-6.938-6.938c-1.938,0-3.686,0.796-4.94,2.077C18.05,1.652,16.798,1.466,15.5,1.466c-1.334,0-2.62,0.195-3.847,0.531c-1.259-1.295-3.016-2.103-4.965-2.103C2.856-0.106-0.25,3-0.25,6.832c0,1.845,0.726,3.517,1.901,4.76c-0.443,1.39-0.685,2.87-0.685,4.408c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534c0-1.575-0.259-3.087-0.722-4.508C30.436,10.261,31.125,8.629,31.125,6.832zM15.5,27.533C9.139,27.533,3.966,22.359,3.966,16c0-6.36,5.173-11.534,11.534-11.534c6.361,0,11.533,5.173,11.533,11.534C27.033,22.361,21.859,27.533,15.5,27.533z",
                "raph_clock": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM16,27.533C9.639,27.533,4.466,22.359,4.466,16C4.466,9.64,9.639,4.466,16,4.466c6.361,0,11.533,5.173,11.533,11.534C27.533,22.361,22.359,27.533,16,27.533zM15.999,5.125c-0.553,0-0.999,0.448-0.999,1v9.221L8.954,17.99c-0.506,0.222-0.736,0.812-0.514,1.318c0.164,0.375,0.53,0.599,0.915,0.599c0.134,0,0.271-0.027,0.401-0.085l6.626-2.898c0.005-0.002,0.009-0.004,0.013-0.006l0.004-0.002c0.015-0.006,0.023-0.02,0.037-0.025c0.104-0.052,0.201-0.113,0.279-0.195c0.034-0.034,0.053-0.078,0.079-0.117c0.048-0.064,0.101-0.127,0.13-0.204c0.024-0.06,0.026-0.125,0.038-0.189C16.975,16.121,17,16.064,17,15.999V6.124C17,5.573,16.552,5.125,15.999,5.125z",
                "raph_globeAlt2": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM8.251,7.48c0.122,0.055,0.255,0.104,0.28,0.137C8.57,7.668,8.621,7.823,8.557,7.861C8.492,7.9,8.39,7.887,8.376,7.771c-0.013-0.115-0.026-0.128-0.18-0.18c-0.022-0.007-0.035-0.01-0.051-0.015C8.18,7.544,8.216,7.512,8.251,7.48zM7.733,7.974c0.031,0.087,0.113,0.125,0,0.17C7.673,8.168,7.611,8.172,7.559,8.165C7.617,8.102,7.672,8.035,7.733,7.974zM16,27.533C9.639,27.533,4.466,22.36,4.466,16c0-0.085,0.011-0.168,0.013-0.254c0.004-0.003,0.008-0.006,0.012-0.009c0.129-0.102,0.283-0.359,0.334-0.45c0.052-0.089,0.181-0.154,0.116-0.256c-0.059-0.096-0.292-0.23-0.407-0.261c0.01-0.099,0.032-0.195,0.045-0.294c0.063,0.077,0.137,0.17,0.208,0.194c0.115,0.038,0.501,0.052,0.566,0.052c0.063,0,0.334,0.014,0.386-0.064c0.051-0.077,0.09-0.077,0.154-0.077c0.064,0,0.18,0.231,0.271,0.257c0.089,0.026,0.257,0.013,0.244,0.181c-0.012,0.166,0.077,0.309,0.167,0.321c0.09,0.013,0.296-0.194,0.296-0.194s0,0.322-0.012,0.438C6.846,15.698,7,16.124,7,16.124s0.193,0.397,0.244,0.488c0.052,0.09,0.27,0.36,0.27,0.476c0,0.117,0.026,0.297,0.104,0.297s0.155-0.206,0.244-0.335c0.091-0.128,0.117-0.31,0.155-0.438c0.039-0.129,0.039-0.36,0.039-0.45c0-0.091,0.076-0.168,0.257-0.245c0.181-0.077,0.309-0.296,0.463-0.412c0.155-0.116,0.142-0.309,0.452-0.309c0.308,0,0.282,0,0.36-0.078c0.077-0.077,0.154-0.128,0.192,0.013c0.039,0.142,0.257,0.347,0.296,0.399c0.039,0.052,0.116,0.193,0.104,0.348c-0.013,0.153,0.012,0.334,0.077,0.334c0.064,0,0.193-0.219,0.193-0.219s0.283-0.192,0.27,0.014c-0.014,0.205,0.025,0.425,0.025,0.552c0,0.13,0.232,0.438,0.232,0.362c0-0.079,0.103-0.296,0.103-0.413c0-0.114,0.064-0.063,0.231,0.051c0.167,0.116,0.283,0.349,0.283,0.349s0.168,0.154,0.193,0.219c0.026,0.064,0.206-0.025,0.244-0.104c0.039-0.076,0.065-0.115,0.167-0.141c0.104-0.026,0.231-0.026,0.271-0.168c0.039-0.142,0.154-0.308,0-0.502c-0.154-0.193-0.232-0.321-0.347-0.412c-0.117-0.09-0.206-0.322-0.206-0.322s0.244-0.218,0.321-0.296c0.079-0.077,0.193-0.025,0.207,0.064c0.013,0.091-0.115,0.168-0.141,0.361c-0.026,0.192,0.154,0.257,0.206,0.192c0.051-0.065,0.18-0.219,0.18-0.257c0-0.039-0.089-0.026-0.102-0.167c-0.013-0.142,0.166-0.245,0.23-0.207c0.066,0.039,0.477-0.051,0.67-0.154s0.308-0.322,0.425-0.412c0.116-0.089,0.515-0.386,0.489-0.527c-0.026-0.142,0.012-0.334-0.09-0.515c-0.103-0.18-0.232-0.295-0.283-0.373c-0.051-0.077,0.219-0.09,0.347-0.206c0.129-0.116,0-0.219-0.064-0.206c-0.064,0.013-0.232,0.052-0.296,0.039c-0.064-0.013-0.103-0.077-0.206-0.155c-0.102-0.077,0.026-0.192,0.091-0.179c0.064,0.013,0.23-0.129,0.308-0.193c0.077-0.064,0.193-0.115,0.154-0.051c-0.038,0.064-0.128,0.296-0.026,0.309c0.104,0.013,0.348-0.193,0.388-0.18c0.038,0.013,0.102,0.18,0.064,0.257c-0.039,0.077-0.039,0.206,0.013,0.193c0.051-0.013,0.154-0.129,0.18-0.09c0.027,0.039,0.154,0.116,0.09,0.257c-0.063,0.142-0.193,0.193-0.039,0.284c0.154,0.089,0.206,0.012,0.322-0.052c0.115-0.064,0.193-0.347,0.128-0.438c-0.064-0.09-0.218-0.27-0.218-0.334c0-0.064,0.257-0.064,0.257-0.167s0.09-0.18,0.18-0.219c0.091-0.039,0.206-0.206,0.244-0.154c0.039,0.052,0.271,0.116,0.334,0.039c0.064-0.077,0.4-0.36,0.605-0.515c0.206-0.154,0.283-0.334,0.336-0.515c0.051-0.18,0.128-0.296,0.102-0.437v0c0.077,0.18,0.09,0.309,0.077,0.45c-0.013,0.142,0,0.438,0.026,0.476c0.025,0.039,0.129,0.128,0.192,0.103c0.064-0.025-0.025-0.283-0.025-0.334c0-0.052,0.09-0.129,0.142-0.142c0.052-0.013,0-0.231-0.065-0.322c-0.063-0.09-0.154-0.142-0.102-0.154c0.051-0.013,0.115-0.116,0.077-0.142c-0.039-0.025-0.014-0.116-0.103-0.09c-0.065,0.019-0.241-0.015-0.235,0.095c-0.037-0.11-0.116-0.183-0.216-0.172c-0.116,0.013-0.181,0.077-0.296,0.077s-0.025-0.18-0.077-0.18c-0.051,0-0.168,0.167-0.231,0.077c-0.064-0.09,0.18-0.206,0.373-0.27c0.192-0.064,0.514-0.438,0.644-0.451c0.128-0.013,0.45,0.026,0.733,0.013c0.283-0.013,0.373-0.129,0.463-0.064s0.283,0.142,0.399,0.129c0.116-0.014,0.064,0,0.244-0.129c0.18-0.129,0.348-0.193,0.438-0.296c0.09-0.103,0.335-0.18,0.348-0.077c0.014,0.103-0.026,0.206,0.077,0.206s0.258-0.103,0.386-0.154c0.129-0.051,0.231-0.116,0.231-0.116s-0.527,0.36-0.655,0.438c-0.129,0.077-0.438,0.129-0.567,0.283c-0.128,0.155-0.205,0.206-0.192,0.374c0.014,0.167,0.231,0.386,0.128,0.54c-0.103,0.154-0.141,0.373-0.141,0.373s0.154-0.219,0.373-0.36s0.348-0.334,0.425-0.412s0.309-0.091,0.309-0.181s0.064-0.206,0.104-0.309c0.038-0.103-0.077-0.078,0-0.206c0.076-0.129,0.064-0.232,0.45-0.232s0.257,0.026,0.566,0.013c0.309-0.013,0.424-0.167,0.72-0.245c0.296-0.077,0.527-0.128,0.618-0.089c0.09,0.038,0.232,0.012,0.141-0.078c-0.089-0.09-0.295-0.219-0.193-0.245c0.104-0.026,0.207-0.039,0.246-0.142c0.039-0.103-0.142-0.283-0.039-0.386c0.104-0.103-0.077-0.231-0.207-0.257c-0.128-0.025-0.63,0.026-0.731-0.025c-0.104-0.052-0.271-0.116-0.322-0.078c-0.052,0.039-0.168,0.245-0.168,0.245s-0.09,0.025-0.168-0.09c-0.076-0.116-0.5-0.103-0.629-0.103s-0.271,0.025-0.413,0.039c-0.141,0.013-0.219,0.052-0.322-0.039c-0.102-0.09-0.243-0.129-0.296-0.167c-0.051-0.039-0.334-0.039-0.553-0.012c-0.218,0.025-0.438,0.025-0.438,0.025s-0.104-0.039-0.257-0.129c-0.154-0.09-0.309-0.154-0.361-0.154c-0.051,0-0.449,0.064-0.539,0c-0.091-0.064-0.181-0.103-0.245-0.103s-0.115-0.103-0.038-0.103s0.437-0.103,0.437-0.103s-0.103-0.142-0.231-0.142c-0.128,0-0.359-0.064-0.424-0.064s-0.014,0.064-0.142,0.039c-0.13-0.026-0.258-0.078-0.335-0.026c-0.076,0.051-0.258,0.128-0.064,0.18c0.193,0.052,0.373,0,0.425,0.078c0.052,0.077,0,0.115,0,0.167s-0.103,0.193-0.167,0.219c-0.064,0.025-0.143-0.039-0.27,0.025c-0.129,0.064-0.451,0.013-0.49,0.052c-0.038,0.039-0.115-0.103-0.18-0.077c-0.064,0.025-0.232,0.193-0.322,0.18c-0.089-0.013-0.206-0.103-0.206-0.206s-0.038-0.232-0.077-0.258c-0.038-0.025-0.322-0.039-0.425-0.025c-0.103,0.013-0.424,0.038-0.477,0.09c-0.052,0.052-0.193,0.09-0.283,0.09s-0.167-0.09-0.36-0.116c-0.192-0.026-0.617-0.039-0.669-0.026s-0.218-0.025-0.155-0.077c0.065-0.051,0.257-0.219,0.143-0.295c-0.117-0.078-0.375-0.078-0.489-0.09c-0.117-0.013-0.232-0.039-0.413-0.013c-0.181,0.026-0.219,0.116-0.296,0.039c-0.077-0.077,0.193,0.039-0.077-0.077c-0.27-0.116-0.399-0.103-0.477-0.064c-0.077,0.039,0.013,0.025-0.192,0.103c-0.206,0.078-0.322,0.116-0.374,0.129c-0.051,0.012-0.372-0.065-0.411-0.091c-0.038-0.025-0.181,0.013-0.309,0.064S9.895,7.025,9.767,7C9.638,6.973,9.432,6.973,9.303,7.025C9.174,7.076,9.084,7.076,8.956,7.166c-0.13,0.09-0.373,0.142-0.373,0.142S8.522,7.305,8.448,7.301C10.474,5.541,13.111,4.466,16,4.466c6.361,0,11.534,5.173,11.534,11.534S22.36,27.533,16,27.533zM14.888,19.92c0,0,0.207-0.026,0.207-0.117c0-0.089-0.207-0.205-0.282-0.102c-0.078,0.102-0.219,0.205-0.207,0.296C14.625,20.138,14.888,19.92,14.888,19.92zM14.875,17.023c-0.181,0.233-0.167,0.182-0.296,0.128c-0.128-0.05-0.334,0.116-0.296,0.182c0.039,0.064,0.322-0.014,0.386,0.102c0.065,0.116,0.065,0.129,0.193,0.104c0.128-0.026,0.257-0.205,0.219-0.295C15.043,17.151,14.875,17.023,14.875,17.023zM14.837,18.245c-0.051,0-0.412,0.064-0.451,0.079c-0.039,0.013-0.27-0.025-0.27-0.025c-0.09,0.089-0.026,0.179,0.116,0.166s0.438-0.052,0.502-0.052C14.799,18.413,14.888,18.245,14.837,18.245zM14.284,14.668c-0.19,0.03-0.308,0.438-0.155,0.425C14.284,15.081,14.451,14.643,14.284,14.668zM14.734,16.959c-0.052-0.064-0.181-0.271-0.323-0.219c-0.042,0.017-0.153,0.245-0.012,0.245C14.541,16.985,14.786,17.023,14.734,16.959zM14.85,16.805c0.232-0.013,0.167-0.245-0.013-0.257C14.786,16.544,14.618,16.818,14.85,16.805zM17.591,18.928c-0.193-0.039-0.244-0.102-0.45-0.205c-0.207-0.103-0.67-0.103-0.682-0.039c-0.014,0.064,0,0-0.155-0.05c-0.153-0.054-0.271,0-0.309-0.091c-0.038-0.091-0.128-0.117-0.244-0.002c-0.097,0.097-0.142,0.104,0.078,0.143c0.218,0.039,0.283,0.039,0.192,0.141c-0.09,0.104-0.154,0.233-0.077,0.244c0.077,0.015,0.309-0.05,0.334,0c0.026,0.054-0.051,0.064,0.207,0.105c0.258,0.037,0.309,0.128,0.359,0.178c0.051,0.052,0.206,0.22,0.104,0.22c-0.104,0-0.219,0.128-0.142,0.143c0.077,0.013,0.309-0.039,0.321,0c0.014,0.037,0.143,0.283,0.271,0.271c0.129-0.013,0.206-0.244,0.27-0.31c0.065-0.064,0.322-0.104,0.349,0.012c0.026,0.116,0.104,0.233,0.257,0.311c0.154,0.076,0.335,0.154,0.348,0.089c0.013-0.064-0.077-0.309-0.181-0.346c-0.103-0.041-0.282-0.259-0.282-0.348c0-0.091-0.155-0.117-0.232-0.182C17.849,19.147,17.784,18.967,17.591,18.928zM8.042,17.023c-0.084,0.037-0.155,0.476,0,0.527c0.154,0.052,0.244-0.205,0.193-0.271C8.183,17.218,8.158,16.973,8.042,17.023zM15.429,18.117c-0.118-0.05-0.335,0.424-0.181,0.463C15.403,18.62,15.518,18.156,15.429,18.117zM15.687,13.703c0.077,0,0.18-0.051,0.18-0.193c0-0.142,0.18,0,0.27-0.013s0.141-0.103,0.18-0.206c0.005-0.013,0.008-0.021,0.009-0.027c-0.003,0.024-0.001,0.093,0.095,0.117c0.154,0.038,0.205-0.064,0.205-0.103s0.283-0.103,0.336-0.142c0.051-0.038,0.258-0.103,0.27-0.154c0.013-0.051,0-0.348,0.064-0.373c0.064-0.026,0.154-0.026,0.052-0.206c-0.104-0.181-0.104-0.348-0.232-0.271c-0.095,0.057-0.038,0.284-0.115,0.438s-0.142,0.296-0.193,0.296s-0.321,0.103-0.399,0.18c-0.076,0.077-0.45-0.064-0.501,0c-0.052,0.064-0.154,0.141-0.219,0.193c-0.065,0.051-0.245,0.013-0.207,0.167C15.518,13.562,15.609,13.703,15.687,13.703zM17.449,12.056c0.18-0.013,0.348-0.064,0.348-0.064s0.271,0.013,0.232-0.116c-0.04-0.128-0.322-0.141-0.375-0.128c-0.051,0.013-0.142-0.142-0.244-0.116c-0.096,0.023-0.128,0.155-0.128,0.193c0,0.039-0.36,0.115-0.245,0.219C17.153,12.146,17.27,12.069,17.449,12.056zM13.91,19.058c0.104,0.064,0.296-0.219,0.349-0.13c0.051,0.091-0.013,0.13,0.076,0.246c0.091,0.114,0.258,0.102,0.258,0.102s-0.013-0.309-0.155-0.387c-0.142-0.077-0.232-0.166-0.064-0.141c0.167,0.026,0.257-0.039,0.219-0.114c-0.039-0.078-0.283-0.039-0.361-0.026s-0.193-0.052-0.193-0.052c-0.077,0.024-0.063,0.089-0.09,0.219C13.923,18.902,13.807,18.992,13.91,19.058zM20.924,21.618c-0.231-0.052-0.077,0.039,0,0.154c0.077,0.116,0.232,0.176,0.258,0.05C21.193,21.759,21.155,21.67,20.924,21.618zM21.915,24.744c-0.077,0.064,0,0.091-0.219,0.22c-0.22,0.13-0.49,0.271-0.541,0.386c-0.052,0.116,0.051,0.181,0.258,0.192c0.206,0.013,0.154,0.053,0.296-0.103s0.271-0.244,0.438-0.373c0.168-0.128,0.168-0.322,0.168-0.322s-0.181-0.178-0.193-0.141C22.1,24.665,21.992,24.681,21.915,24.744zM18.504,21.618c0.014-0.116-0.219-0.116-0.334-0.207c-0.116-0.089-0.128-0.359-0.193-0.515c-0.064-0.153-0.192-0.257-0.322-0.397c-0.128-0.143-0.192-0.465-0.23-0.438c-0.039,0.025-0.154,0.399-0.064,0.515c0.09,0.116-0.039,0.348-0.103,0.503c-0.065,0.153-0.22-0.026-0.349-0.104c-0.129-0.078-0.308-0.128-0.398-0.219c-0.09-0.091,0.155-0.335,0.091-0.426c-0.065-0.09-0.412-0.013-0.45-0.013c-0.039,0-0.116-0.128-0.194-0.128c-0.077,0-0.064,0.258-0.064,0.258s-0.078-0.091-0.193-0.207c-0.117-0.115,0.012,0.077-0.103,0.193c-0.117,0.117-0.079,0.078-0.129,0.206c-0.051,0.129-0.167,0.077-0.283-0.052c-0.116-0.128-0.179-0.037-0.258,0c-0.077,0.039-0.141,0.259-0.18,0.309c-0.039,0.052-0.309,0.117-0.374,0.182c-0.064,0.062-0.09,0.27-0.09,0.322c0,0.05-0.271,0.023-0.361,0.089c-0.09,0.064-0.23,0.025-0.321,0.025c-0.09,0-0.399,0.244-0.502,0.308c-0.103,0.066-0.103,0.298-0.051,0.362c0.051,0.063,0.154,0.219,0.09,0.244c-0.064,0.026-0.104,0.206,0.051,0.359c0.154,0.155,0.103,0.194,0.115,0.271c0.014,0.077,0.078,0.104,0.181,0.232c0.102,0.128-0.181,0.231-0.219,0.31c-0.039,0.076,0.091,0.192,0.167,0.257c0.077,0.063,0.271,0.026,0.386-0.013c0.117-0.039,0.245-0.143,0.321-0.155c0.079-0.013,0.438-0.026,0.438-0.026s0.129-0.192,0.219-0.296c0.089-0.102,0.372-0.013,0.372-0.013s0.117-0.076,0.426-0.141c0.309-0.065,0.179,0.064,0.296,0.104c0.115,0.037,0.27,0.062,0.359,0.128c0.09,0.064,0,0.218-0.012,0.283c-0.014,0.064,0.219,0.038,0.23-0.026c0.014-0.064,0.077-0.128,0.207-0.205c0.128-0.078,0.025,0.114,0.076,0.231c0.052,0.116,0.129-0.157,0.129-0.026c0,0.039,0.039,0.078,0.051,0.116c0.014,0.039,0.181,0.052,0.181,0.18c0,0.13,0,0.207,0.039,0.231c0.038,0.026,0.244,0,0.335,0.155c0.089,0.154,0.154,0.013,0.205-0.052c0.052-0.064,0.231,0.026,0.283,0.078c0.052,0.05,0.193-0.104,0.387-0.155c0.192-0.051,0.167-0.039,0.219-0.115c0.051-0.078,0.09-0.283,0.205-0.438c0.115-0.153,0.271-0.424,0.271-0.631c0-0.206-0.014-0.682-0.155-0.899C18.761,21.953,18.492,21.733,18.504,21.618zM18.029,24.77c-0.065-0.013-0.207-0.062-0.207-0.062c-0.142,0.141,0.142,0.141,0.104,0.283c-0.039,0.141,0.193,0.089,0.257,0.064c0.063-0.027,0.22-0.323,0.193-0.399C18.351,24.577,18.093,24.783,18.029,24.77zM22.803,24.178c-0.052,0-0.077,0.064-0.192,0c-0.117-0.063-0.091-0.037-0.168-0.167c-0.077-0.127-0.091-0.296-0.219-0.23c-0.051,0.025,0,0.168,0.051,0.218c0.053,0.052,0.077,0.231,0.064,0.283c-0.012,0.052-0.231,0.116-0.129,0.18c0.104,0.064,0.297,0,0.271,0.078c-0.025,0.077-0.129,0.179-0.013,0.205c0.115,0.025,0.154-0.089,0.207-0.178c0.051-0.093,0.089-0.169,0.179-0.221C22.944,24.294,22.854,24.178,22.803,24.178zM22.815,21.18c0.168,0.064,0.464-0.231,0.347-0.27C23.047,20.871,22.815,21.18,22.815,21.18zM13.923,19.906c-0.029,0.115,0.193,0.167,0.206,0.039C14.141,19.816,13.949,19.803,13.923,19.906zM14.27,16.47c-0.064,0.065-0.257,0.193-0.283,0.31c-0.025,0.115,0.309-0.182,0.399-0.296c0.091-0.117,0.27-0.052,0.308-0.117c0.04-0.063,0.04-0.063,0.04-0.063s-0.142-0.025-0.257-0.063c-0.117-0.039-0.258,0.102-0.193-0.104c0.064-0.206,0.257-0.167,0.219-0.322c-0.039-0.154-0.168-0.193-0.207-0.193c-0.09,0,0.013,0.141-0.116,0.231c-0.128,0.09-0.271,0.128-0.193,0.283C14.064,16.29,14.334,16.405,14.27,16.47zM13.254,19.751c0.013-0.076-0.142-0.192-0.206-0.192c-0.065,0-0.386-0.077-0.386-0.077c-0.058,0.023-0.135,0.045-0.158,0.077c-0.007-0.011-0.022-0.024-0.049-0.039c-0.142-0.075-0.309,0-0.361-0.102c-0.05-0.104-0.127-0.104-0.179-0.039c-0.094,0.117,0.025,0.206,0.063,0.231c0.038,0.024,0.181,0.052,0.309,0.039c0.08-0.008,0.181-0.027,0.21-0.059c0.004,0.014,0.016,0.027,0.035,0.044c0.103,0.092,0.167,0.13,0.321,0.116C13.009,19.74,13.241,19.829,13.254,19.751zM12.881,18.992c0.065,0,0.193,0,0.283,0.026c0.09,0.025,0.386,0.05,0.373-0.064c-0.013-0.115-0.038-0.297,0.089-0.411c0.13-0.117,0.257-0.18,0.193-0.348c-0.063-0.167-0.193-0.271-0.103-0.349c0.09-0.076,0.192-0.102,0.192-0.166c0-0.065-0.217,0.18-0.244-0.246c-0.005-0.091-0.206,0.025-0.219,0.116c-0.012,0.091,0.142,0.167-0.103,0.167c-0.245,0-0.257,0.194-0.309,0.232c-0.052,0.039-0.103,0.051-0.207,0.076c-0.102,0.026-0.127,0.13-0.153,0.194c-0.025,0.063-0.206-0.116-0.257-0.064c-0.051,0.052-0.013,0.296,0.077,0.501C12.585,18.863,12.816,18.992,12.881,18.992zM11.979,18.928c0.065-0.077,0.038-0.192-0.063-0.18c-0.103,0.013-0.193-0.168-0.36-0.283c-0.168-0.114-0.296-0.194-0.451-0.36c-0.154-0.167-0.347-0.271-0.45-0.359c-0.104-0.091-0.257-0.13-0.322-0.116c-0.159,0.032,0.231,0.309,0.271,0.346c0.039,0.041,0.387,0.335,0.387,0.478s0.231,0.476,0.296,0.527c0.064,0.052,0.385,0.244,0.437,0.348c0.052,0.103,0.167,0.13,0.167-0.013C11.89,19.174,11.916,19.006,11.979,18.928zM11.002,17.474c0.064,0.232,0.193,0.464,0.244,0.555c0.052,0.089,0.271,0.217,0.348,0.281c0.077,0.064,0.192-0.024,0.143-0.102c-0.052-0.078-0.155-0.192-0.167-0.283c-0.013-0.091-0.078-0.233-0.181-0.387c-0.102-0.153-0.192-0.192-0.257-0.295c-0.064-0.104-0.296-0.297-0.296-0.297c-0.102,0.013-0.102,0.205-0.051,0.271C10.834,17.28,10.938,17.243,11.002,17.474z",
                "raph_globeAlt": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM27.436,17.39c0.001,0.002,0.004,0.002,0.005,0.004c-0.022,0.187-0.054,0.37-0.085,0.554c-0.015-0.012-0.034-0.025-0.047-0.036c-0.103-0.09-0.254-0.128-0.318-0.115c-0.157,0.032,0.229,0.305,0.267,0.342c0.009,0.009,0.031,0.03,0.062,0.058c-1.029,5.312-5.709,9.338-11.319,9.338c-4.123,0-7.736-2.18-9.776-5.441c0.123-0.016,0.24-0.016,0.28-0.076c0.051-0.077,0.102-0.241,0.178-0.331c0.077-0.089,0.165-0.229,0.127-0.292c-0.039-0.064,0.101-0.344,0.088-0.419c-0.013-0.076-0.127-0.256,0.064-0.407s0.394-0.382,0.407-0.444c0.012-0.063,0.166-0.331,0.152-0.458c-0.012-0.127-0.152-0.28-0.24-0.318c-0.09-0.037-0.28-0.05-0.356-0.151c-0.077-0.103-0.292-0.203-0.368-0.178c-0.076,0.025-0.204,0.05-0.305-0.015c-0.102-0.062-0.267-0.139-0.33-0.189c-0.065-0.05-0.229-0.088-0.305-0.088c-0.077,0-0.065-0.052-0.178,0.101c-0.114,0.153,0,0.204-0.204,0.177c-0.204-0.023,0.025-0.036,0.141-0.189c0.113-0.152-0.013-0.242-0.141-0.203c-0.126,0.038-0.038,0.115-0.241,0.153c-0.203,0.036-0.203-0.09-0.076-0.115s0.355-0.139,0.355-0.19c0-0.051-0.025-0.191-0.127-0.191s-0.077-0.126-0.229-0.291c-0.092-0.101-0.196-0.164-0.299-0.204c-0.09-0.579-0.15-1.167-0.15-1.771c0-2.844,1.039-5.446,2.751-7.458c0.024-0.02,0.048-0.034,0.069-0.036c0.084-0.009,0.31-0.025,0.51-0.059c0.202-0.034,0.418-0.161,0.489-0.153c0.069,0.008,0.241,0.008,0.186-0.042C8.417,8.2,8.339,8.082,8.223,8.082S8.215,7.896,8.246,7.896c0.03,0,0.186,0.025,0.178,0.11C8.417,8.091,8.471,8.2,8.625,8.167c0.156-0.034,0.132-0.162,0.102-0.195C8.695,7.938,8.672,7.853,8.642,7.794c-0.031-0.06-0.023-0.136,0.14-0.153C8.944,7.625,9.168,7.708,9.16,7.573s0-0.28,0.046-0.356C9.253,7.142,9.354,7.09,9.299,7.065C9.246,7.04,9.176,7.099,9.121,6.972c-0.054-0.127,0.047-0.22,0.108-0.271c0.02-0.015,0.067-0.06,0.124-0.112C11.234,5.257,13.524,4.466,16,4.466c3.213,0,6.122,1.323,8.214,3.45c-0.008,0.022-0.01,0.052-0.031,0.056c-0.077,0.013-0.166,0.063-0.179-0.051c-0.013-0.114-0.013-0.331-0.102-0.203c-0.089,0.127-0.127,0.127-0.127,0.191c0,0.063,0.076,0.127,0.051,0.241C23.8,8.264,23.8,8.341,23.84,8.341c0.036,0,0.126-0.115,0.239-0.141c0.116-0.025,0.319-0.088,0.332,0.026c0.013,0.115,0.139,0.152,0.013,0.203c-0.128,0.051-0.267,0.026-0.293-0.051c-0.025-0.077-0.114-0.077-0.203-0.013c-0.088,0.063-0.279,0.292-0.279,0.292s-0.306,0.139-0.343,0.114c-0.04-0.025,0.101-0.165,0.203-0.228c0.102-0.064,0.178-0.204,0.14-0.242c-0.038-0.038-0.088-0.279-0.063-0.343c0.025-0.063,0.139-0.152,0.013-0.216c-0.127-0.063-0.217-0.14-0.318-0.178s-0.216,0.152-0.305,0.204c-0.089,0.051-0.076,0.114-0.191,0.127c-0.114,0.013-0.189,0.165,0,0.254c0.191,0.089,0.255,0.152,0.204,0.204c-0.051,0.051-0.267-0.025-0.267-0.025s-0.165-0.076-0.268-0.076c-0.101,0-0.229-0.063-0.33-0.076c-0.102-0.013-0.306-0.013-0.355,0.038c-0.051,0.051-0.179,0.203-0.28,0.152c-0.101-0.051-0.101-0.102-0.241-0.051c-0.14,0.051-0.279-0.038-0.355,0.038c-0.077,0.076-0.013,0.076-0.255,0c-0.241-0.076-0.189,0.051-0.419,0.089s-0.368-0.038-0.432,0.038c-0.064,0.077-0.153,0.217-0.19,0.127c-0.038-0.088,0.126-0.241,0.062-0.292c-0.062-0.051-0.33-0.025-0.367,0.013c-0.039,0.038-0.014,0.178,0.011,0.229c0.026,0.05,0.064,0.254-0.011,0.216c-0.077-0.038-0.064-0.166-0.141-0.152c-0.076,0.013-0.165,0.051-0.203,0.077c-0.038,0.025-0.191,0.025-0.229,0.076c-0.037,0.051,0.014,0.191-0.051,0.203c-0.063,0.013-0.114,0.064-0.254-0.025c-0.14-0.089-0.14-0.038-0.178-0.012c-0.038,0.025-0.216,0.127-0.229,0.012c-0.013-0.114,0.025-0.152-0.089-0.229c-0.115-0.076-0.026-0.076,0.127-0.025c0.152,0.05,0.343,0.075,0.622-0.013c0.28-0.089,0.395-0.127,0.28-0.178c-0.115-0.05-0.229-0.101-0.406-0.127c-0.179-0.025-0.42-0.025-0.7-0.127c-0.279-0.102-0.343-0.14-0.457-0.165c-0.115-0.026-0.813-0.14-1.132-0.089c-0.317,0.051-1.193,0.28-1.245,0.318s-0.128,0.19-0.292,0.318c-0.165,0.127-0.47,0.419-0.712,0.47c-0.241,0.051-0.521,0.254-0.521,0.305c0,0.051,0.101,0.242,0.076,0.28c-0.025,0.038,0.05,0.229,0.191,0.28c0.139,0.05,0.381,0.038,0.393-0.039c0.014-0.076,0.204-0.241,0.217-0.127c0.013,0.115,0.14,0.292,0.114,0.368c-0.025,0.077,0,0.153,0.09,0.14c0.088-0.012,0.559-0.114,0.559-0.114s0.153-0.064,0.127-0.166c-0.026-0.101,0.166-0.241,0.203-0.279c0.038-0.038,0.178-0.191,0.014-0.241c-0.167-0.051-0.293-0.064-0.115-0.216s0.292,0,0.521-0.229c0.229-0.229-0.051-0.292,0.191-0.305c0.241-0.013,0.496-0.025,0.444,0.051c-0.05,0.076-0.342,0.242-0.508,0.318c-0.166,0.077-0.14,0.216-0.076,0.292c0.063,0.076,0.09,0.254,0.204,0.229c0.113-0.025,0.254-0.114,0.38-0.101c0.128,0.012,0.383-0.013,0.42-0.013c0.039,0,0.216,0.178,0.114,0.203c-0.101,0.025-0.229,0.013-0.445,0.025c-0.215,0.013-0.456,0.013-0.456,0.051c0,0.039,0.292,0.127,0.19,0.191c-0.102,0.063-0.203-0.013-0.331-0.026c-0.127-0.012-0.203,0.166-0.241,0.267c-0.039,0.102,0.063,0.28-0.127,0.216c-0.191-0.063-0.331-0.063-0.381-0.038c-0.051,0.025-0.203,0.076-0.331,0.114c-0.126,0.038-0.076-0.063-0.242-0.063c-0.164,0-0.164,0-0.164,0l-0.103,0.013c0,0-0.101-0.063-0.114-0.165c-0.013-0.102,0.05-0.216-0.013-0.241c-0.064-0.026-0.292,0.012-0.33,0.088c-0.038,0.076-0.077,0.216-0.026,0.28c0.052,0.063,0.204,0.19,0.064,0.152c-0.14-0.038-0.317-0.051-0.419,0.026c-0.101,0.076-0.279,0.241-0.279,0.241s-0.318,0.025-0.318,0.102c0,0.077,0,0.178-0.114,0.191c-0.115,0.013-0.268,0.05-0.42,0.076c-0.153,0.025-0.139,0.088-0.317,0.102s-0.204,0.089-0.038,0.114c0.165,0.025,0.418,0.127,0.431,0.241c0.014,0.114-0.013,0.242-0.076,0.356c-0.043,0.079-0.305,0.026-0.458,0.026c-0.152,0-0.456-0.051-0.584,0c-0.127,0.051-0.102,0.305-0.064,0.419c0.039,0.114-0.012,0.178-0.063,0.216c-0.051,0.038-0.065,0.152,0,0.204c0.063,0.051,0.114,0.165,0.166,0.178c0.051,0.013,0.215-0.038,0.279,0.025c0.064,0.064,0.127,0.216,0.165,0.178c0.039-0.038,0.089-0.203,0.153-0.166c0.064,0.039,0.216-0.012,0.331-0.025s0.177-0.14,0.292-0.204c0.114-0.063,0.05-0.063,0.013-0.14c-0.038-0.076,0.114-0.165,0.204-0.254c0.088-0.089,0.253-0.013,0.292-0.115c0.038-0.102,0.051-0.279,0.151-0.267c0.103,0.013,0.243,0.076,0.331,0.076c0.089,0,0.279-0.14,0.332-0.165c0.05-0.025,0.241-0.013,0.267,0.102c0.025,0.114,0.241,0.254,0.292,0.279c0.051,0.025,0.381,0.127,0.433,0.165c0.05,0.038,0.126,0.153,0.152,0.254c0.025,0.102,0.114,0.102,0.128,0.013c0.012-0.089-0.065-0.254,0.025-0.242c0.088,0.013,0.191-0.026,0.191-0.026s-0.243-0.165-0.331-0.203c-0.088-0.038-0.255-0.114-0.331-0.241c-0.076-0.127-0.267-0.153-0.254-0.279c0.013-0.127,0.191-0.051,0.292,0.051c0.102,0.102,0.356,0.241,0.445,0.33c0.088,0.089,0.229,0.127,0.267,0.242c0.039,0.114,0.152,0.241,0.19,0.292c0.038,0.051,0.165,0.331,0.204,0.394c0.038,0.063,0.165-0.012,0.229-0.063c0.063-0.051,0.179-0.076,0.191-0.178c0.013-0.102-0.153-0.178-0.203-0.216c-0.051-0.038,0.127-0.076,0.191-0.127c0.063-0.05,0.177-0.14,0.228-0.063c0.051,0.077,0.026,0.381,0.051,0.432c0.025,0.051,0.279,0.127,0.331,0.191c0.05,0.063,0.267,0.089,0.304,0.051c0.039-0.038,0.242,0.026,0.294,0.038c0.049,0.013,0.202-0.025,0.304-0.05c0.103-0.025,0.204-0.102,0.191,0.063c-0.013,0.165-0.051,0.419-0.179,0.546c-0.127,0.127-0.076,0.191-0.202,0.191c-0.06,0-0.113,0-0.156,0.021c-0.041-0.065-0.098-0.117-0.175-0.097c-0.152,0.038-0.344,0.038-0.47,0.19c-0.128,0.153-0.178,0.165-0.204,0.114c-0.025-0.051,0.369-0.267,0.317-0.331c-0.05-0.063-0.355-0.038-0.521-0.038c-0.166,0-0.305-0.102-0.433-0.127c-0.126-0.025-0.292,0.127-0.418,0.254c-0.128,0.127-0.216,0.038-0.331,0.038c-0.115,0-0.331-0.165-0.331-0.165s-0.216-0.089-0.305-0.089c-0.088,0-0.267-0.165-0.318-0.165c-0.05,0-0.19-0.115-0.088-0.166c0.101-0.05,0.202,0.051,0.101-0.229c-0.101-0.279-0.33-0.216-0.419-0.178c-0.088,0.039-0.724,0.025-0.775,0.025c-0.051,0-0.419,0.127-0.533,0.178c-0.116,0.051-0.318,0.115-0.369,0.14c-0.051,0.025-0.318-0.051-0.433,0.013c-0.151,0.084-0.291,0.216-0.33,0.216c-0.038,0-0.153,0.089-0.229,0.28c-0.077,0.19,0.013,0.355-0.128,0.419c-0.139,0.063-0.394,0.204-0.495,0.305c-0.102,0.101-0.229,0.458-0.355,0.623c-0.127,0.165,0,0.317,0.025,0.419c0.025,0.101,0.114,0.292-0.025,0.471c-0.14,0.178-0.127,0.266-0.191,0.279c-0.063,0.013,0.063,0.063,0.088,0.19c0.025,0.128-0.114,0.255,0.128,0.369c0.241,0.113,0.355,0.217,0.418,0.367c0.064,0.153,0.382,0.407,0.382,0.407s0.229,0.205,0.344,0.293c0.114,0.089,0.152,0.038,0.177-0.05c0.025-0.09,0.178-0.104,0.355-0.104c0.178,0,0.305,0.04,0.483,0.014c0.178-0.025,0.356-0.141,0.42-0.166c0.063-0.025,0.279-0.164,0.443-0.063c0.166,0.103,0.141,0.241,0.23,0.332c0.088,0.088,0.24,0.037,0.355-0.051c0.114-0.09,0.064-0.052,0.203,0.025c0.14,0.075,0.204,0.151,0.077,0.267c-0.128,0.113-0.051,0.293-0.128,0.47c-0.076,0.178-0.063,0.203,0.077,0.278c0.14,0.076,0.394,0.548,0.47,0.638c0.077,0.088-0.025,0.342,0.064,0.495c0.089,0.151,0.178,0.254,0.077,0.331c-0.103,0.075-0.28,0.216-0.292,0.47s0.051,0.431,0.102,0.521s0.177,0.331,0.241,0.419c0.064,0.089,0.14,0.305,0.152,0.445c0.013,0.14-0.024,0.306,0.039,0.381c0.064,0.076,0.102,0.191,0.216,0.292c0.115,0.103,0.152,0.318,0.152,0.318s0.039,0.089,0.051,0.229c0.012,0.14,0.025,0.228,0.152,0.292c0.126,0.063,0.215,0.076,0.28,0.013c0.063-0.063,0.381-0.077,0.546-0.063c0.165,0.013,0.355-0.075,0.521-0.19s0.407-0.419,0.496-0.508c0.089-0.09,0.292-0.255,0.268-0.356c-0.025-0.101-0.077-0.203,0.024-0.254c0.102-0.052,0.344-0.152,0.356-0.229c0.013-0.077-0.09-0.395-0.115-0.457c-0.024-0.064,0.064-0.18,0.165-0.306c0.103-0.128,0.421-0.216,0.471-0.267c0.051-0.053,0.191-0.267,0.217-0.433c0.024-0.167-0.051-0.369,0-0.457c0.05-0.09,0.013-0.165-0.103-0.268c-0.114-0.102-0.089-0.407-0.127-0.457c-0.037-0.051-0.013-0.319,0.063-0.345c0.076-0.023,0.242-0.279,0.344-0.393c0.102-0.114,0.394-0.47,0.534-0.496c0.139-0.025,0.355-0.229,0.368-0.343c0.013-0.115,0.38-0.547,0.394-0.635c0.013-0.09,0.166-0.42,0.102-0.497c-0.062-0.076-0.559,0.115-0.622,0.141c-0.064,0.025-0.241,0.127-0.446,0.113c-0.202-0.013-0.114-0.177-0.127-0.254c-0.012-0.076-0.228-0.368-0.279-0.381c-0.051-0.012-0.203-0.166-0.267-0.317c-0.063-0.153-0.152-0.343-0.254-0.458c-0.102-0.114-0.165-0.38-0.268-0.559c-0.101-0.178-0.189-0.407-0.279-0.572c-0.021-0.041-0.045-0.079-0.067-0.117c0.118-0.029,0.289-0.082,0.31-0.009c0.024,0.088,0.165,0.279,0.19,0.419s0.165,0.089,0.178,0.216c0.014,0.128,0.14,0.433,0.19,0.47c0.052,0.038,0.28,0.242,0.318,0.318c0.038,0.076,0.089,0.178,0.127,0.369c0.038,0.19,0.076,0.444,0.179,0.482c0.102,0.038,0.444-0.064,0.508-0.102s0.482-0.242,0.635-0.255c0.153-0.012,0.179-0.115,0.368-0.152c0.191-0.038,0.331-0.177,0.458-0.28c0.127-0.101,0.28-0.355,0.33-0.444c0.052-0.088,0.179-0.152,0.115-0.253c-0.063-0.103-0.331-0.254-0.433-0.268c-0.102-0.012-0.089-0.178-0.152-0.178s-0.051,0.088-0.178,0.153c-0.127,0.063-0.255,0.19-0.344,0.165s0.026-0.089-0.113-0.203s-0.192-0.14-0.192-0.228c0-0.089-0.278-0.255-0.304-0.382c-0.026-0.127,0.19-0.305,0.254-0.19c0.063,0.114,0.115,0.292,0.279,0.368c0.165,0.076,0.318,0.204,0.395,0.229c0.076,0.025,0.267-0.14,0.33-0.114c0.063,0.024,0.191,0.253,0.306,0.292c0.113,0.038,0.495,0.051,0.559,0.051s0.33,0.013,0.381-0.063c0.051-0.076,0.089-0.076,0.153-0.076c0.062,0,0.177,0.229,0.267,0.254c0.089,0.025,0.254,0.013,0.241,0.179c-0.012,0.164,0.076,0.305,0.165,0.317c0.09,0.012,0.293-0.191,0.293-0.191s0,0.318-0.012,0.433c-0.014,0.113,0.139,0.534,0.139,0.534s0.19,0.393,0.241,0.482s0.267,0.355,0.267,0.47c0,0.115,0.025,0.293,0.103,0.293c0.076,0,0.152-0.203,0.24-0.331c0.091-0.126,0.116-0.305,0.153-0.432c0.038-0.127,0.038-0.356,0.038-0.444c0-0.09,0.075-0.166,0.255-0.242c0.178-0.076,0.304-0.292,0.456-0.407c0.153-0.115,0.141-0.305,0.446-0.305c0.305,0,0.278,0,0.355-0.077c0.076-0.076,0.151-0.127,0.19,0.013c0.038,0.14,0.254,0.343,0.292,0.394c0.038,0.052,0.114,0.191,0.103,0.344c-0.013,0.152,0.012,0.33,0.075,0.33s0.191-0.216,0.191-0.216s0.279-0.189,0.267,0.013c-0.014,0.203,0.025,0.419,0.025,0.545c0,0.053,0.042,0.135,0.088,0.21c-0.005,0.059-0.004,0.119-0.009,0.178C27.388,17.153,27.387,17.327,27.436,17.39zM20.382,12.064c0.076,0.05,0.102,0.127,0.152,0.203c0.052,0.076,0.14,0.05,0.203,0.114c0.063,0.064-0.178,0.14-0.075,0.216c0.101,0.077,0.151,0.381,0.165,0.458c0.013,0.076-0.279,0.114-0.369,0.102c-0.089-0.013-0.354-0.102-0.445-0.127c-0.089-0.026-0.139-0.343-0.025-0.331c0.116,0.013,0.141-0.025,0.267-0.139c0.128-0.115-0.189-0.166-0.278-0.191c-0.089-0.025-0.268-0.305-0.331-0.394c-0.062-0.089-0.014-0.228,0.141-0.331c0.076-0.051,0.279,0.063,0.381,0c0.101-0.063,0.203-0.14,0.241-0.165c0.039-0.025,0.293,0.038,0.33,0.114c0.039,0.076,0.191,0.191,0.141,0.229c-0.052,0.038-0.281,0.076-0.356,0c-0.075-0.077-0.255,0.012-0.268,0.152C20.242,12.115,20.307,12.013,20.382,12.064zM16.875,12.28c-0.077-0.025,0.025-0.178,0.102-0.229c0.075-0.051,0.164-0.178,0.241-0.305c0.076-0.127,0.178-0.14,0.241-0.127c0.063,0.013,0.203,0.241,0.241,0.318c0.038,0.076,0.165-0.026,0.217-0.051c0.05-0.025,0.127-0.102,0.14-0.165s0.127-0.102,0.254-0.102s0.013,0.102-0.076,0.127c-0.09,0.025-0.038,0.077,0.113,0.127c0.153,0.051,0.293,0.191,0.459,0.279c0.165,0.089,0.19,0.267,0.088,0.292c-0.101,0.025-0.406,0.051-0.521,0.038c-0.114-0.013-0.254-0.127-0.419-0.153c-0.165-0.025-0.369-0.013-0.433,0.077s-0.292,0.05-0.395,0.05c-0.102,0-0.228,0.127-0.253,0.077C16.875,12.534,16.951,12.306,16.875,12.28zM17.307,9.458c0.063-0.178,0.419,0.038,0.355,0.127C17.599,9.675,17.264,9.579,17.307,9.458zM17.802,18.584c0.063,0.102-0.14,0.431-0.254,0.407c-0.113-0.027-0.076-0.318-0.038-0.382C17.548,18.545,17.769,18.529,17.802,18.584zM13.189,12.674c0.025-0.051-0.039-0.153-0.127-0.013C13.032,12.71,13.164,12.725,13.189,12.674zM20.813,8.035c0.141,0.076,0.339,0.107,0.433,0.013c0.076-0.076,0.013-0.204-0.05-0.216c-0.064-0.013-0.104-0.115,0.062-0.203c0.165-0.089,0.343-0.204,0.534-0.229c0.19-0.025,0.622-0.038,0.774,0c0.152,0.039,0.382-0.166,0.445-0.254s-0.203-0.152-0.279-0.051c-0.077,0.102-0.444,0.076-0.521,0.051c-0.076-0.025-0.686,0.102-0.812,0.102c-0.128,0-0.179,0.152-0.356,0.229c-0.179,0.076-0.42,0.191-0.509,0.229c-0.088,0.038-0.177,0.19-0.101,0.216C20.509,7.947,20.674,7.959,20.813,8.035zM14.142,12.674c0.064-0.089-0.051-0.217-0.114-0.217c-0.12,0-0.178,0.191-0.103,0.254C14.002,12.776,14.078,12.763,14.142,12.674zM14.714,13.017c0.064,0.025,0.114,0.102,0.165,0.114c0.052,0.013,0.217,0,0.167-0.127s-0.167-0.127-0.204-0.127c-0.038,0-0.203-0.038-0.267,0C14.528,12.905,14.65,12.992,14.714,13.017zM11.308,10.958c0.101,0.013,0.217-0.063,0.305-0.101c0.088-0.038,0.216-0.114,0.216-0.229c0-0.114-0.025-0.216-0.077-0.267c-0.051-0.051-0.14-0.064-0.216-0.051c-0.115,0.02-0.127,0.14-0.203,0.14c-0.076,0-0.165,0.025-0.14,0.114s0.077,0.152,0,0.19C11.117,10.793,11.205,10.946,11.308,10.958zM11.931,10.412c0.127,0.051,0.394,0.102,0.292,0.153c-0.102,0.051-0.28,0.19-0.305,0.267s0.216,0.153,0.216,0.153s-0.077,0.089-0.013,0.114c0.063,0.025,0.102-0.089,0.203-0.089c0.101,0,0.304,0.063,0.406,0.063c0.103,0,0.267-0.14,0.254-0.229c-0.013-0.089-0.14-0.229-0.254-0.28c-0.113-0.051-0.241-0.28-0.317-0.331c-0.076-0.051,0.076-0.178-0.013-0.267c-0.09-0.089-0.153-0.076-0.255-0.14c-0.102-0.063-0.191,0.013-0.254,0.089c-0.063,0.076-0.14-0.013-0.217,0.012c-0.102,0.035-0.063,0.166-0.012,0.229C11.714,10.221,11.804,10.361,11.931,10.412zM24.729,17.198c-0.083,0.037-0.153,0.47,0,0.521c0.152,0.052,0.241-0.202,0.191-0.267C24.868,17.39,24.843,17.147,24.729,17.198zM20.114,20.464c-0.159-0.045-0.177,0.166-0.304,0.306c-0.128,0.141-0.267,0.254-0.317,0.241c-0.052-0.013-0.331,0.089-0.242,0.279c0.089,0.191,0.076,0.382-0.013,0.472c-0.089,0.088,0.076,0.342,0.052,0.482c-0.026,0.139,0.037,0.229,0.215,0.229s0.242-0.064,0.318-0.229c0.076-0.166,0.088-0.331,0.164-0.47c0.077-0.141,0.141-0.434,0.179-0.51c0.038-0.075,0.114-0.316,0.102-0.457C20.254,20.669,20.204,20.489,20.114,20.464zM10.391,8.802c-0.069-0.06-0.229-0.102-0.306-0.11c-0.076-0.008-0.152,0.06-0.321,0.06c-0.168,0-0.279,0.067-0.347,0C9.349,8.684,9.068,8.65,9.042,8.692C9.008,8.749,8.941,8.751,9.008,8.87c0.069,0.118,0.12,0.186,0.179,0.178s0.262-0.017,0.288,0.051C9.5,9.167,9.569,9.226,9.712,9.184c0.145-0.042,0.263-0.068,0.296-0.119c0.033-0.051,0.263-0.059,0.263-0.059S10.458,8.861,10.391,8.802z",
                "raph_globe": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM19.158,23.269c-0.079,0.064-0.183,0.13-0.105,0.207c0.078,0.078-0.09,0.131-0.09,0.17s0.104,0.246,0.052,0.336c-0.052,0.092-0.091,0.223-0.13,0.301c-0.039,0.077-0.131,0.155-0.104,0.272c0.025,0.116-0.104,0.077-0.104,0.194c0,0.116,0.116,0.065,0.09,0.208c-0.025,0.144-0.09,0.183-0.09,0.285c0,0.104,0.064,0.247,0.064,0.286s-0.064,0.17-0.155,0.272c-0.092,0.104-0.155,0.17-0.144,0.233c0.014,0.065,0.104,0.144,0.091,0.184c-0.013,0.037-0.129,0.168-0.116,0.259c0.014,0.09,0.129,0.053,0.155,0.116c0.026,0.065-0.155,0.118-0.078,0.183c0.078,0.064,0.183,0.051,0.156,0.208c-0.019,0.112,0.064,0.163,0.126,0.198c-0.891,0.221-1.818,0.352-2.777,0.352C9.639,27.533,4.466,22.36,4.466,16c0-2.073,0.557-4.015,1.518-5.697c0.079-0.042,0.137-0.069,0.171-0.062c0.065,0.013,0.079,0.104,0.183,0.13c0.104,0.026,0.195-0.078,0.26-0.117c0.064-0.039,0.116-0.195,0.051-0.182c-0.065,0.013-0.234,0-0.234,0s0.183-0.104,0.183-0.169s0.025-0.169,0.129-0.208C6.83,9.655,6.83,9.681,6.765,9.837C6.7,9.993,6.896,9.928,6.973,9.863s0.13-0.013,0.272-0.104c0.143-0.091,0.143-0.143,0.221-0.143c0.078,0,0.221,0.143,0.299,0.091c0.077-0.052,0.299,0.065,0.429,0.065c0.129,0,0.545,0.169,0.624,0.169c0.078,0,0.312,0.09,0.325,0.259c0.013,0.169,0.09,0.156,0.168,0.156s0.26,0.065,0.26,0.13c0,0.065-0.052,0.325,0.078,0.39c0.129,0.064,0.247,0.169,0.299,0.143c0.052-0.026,0-0.233-0.064-0.26c-0.065-0.026-0.027-0.117-0.052-0.169c-0.026-0.051,0.078-0.051,0.117,0.039c0.039,0.091,0.143,0.26,0.208,0.26c0.064,0,0.208,0.156,0.168,0.247c-0.039,0.091,0.039,0.221,0.156,0.221c0.116,0,0.26,0.182,0.312,0.195c0.052,0.013,0.117,0.078,0.117,0.117c0,0.04,0.065,0.26,0.065,0.351c0,0.09-0.04,0.454-0.053,0.597s0.104,0.39,0.234,0.52c0.129,0.13,0.246,0.377,0.324,0.429c0.079,0.052,0.13,0.195,0.247,0.182c0.117-0.013,0.195,0.078,0.299,0.26c0.104,0.182,0.208,0.48,0.286,0.506c0.078,0.026,0.208,0.117,0.142,0.182c-0.064,0.064-0.168,0.208-0.051,0.208c0.117,0,0.156-0.065,0.247,0.053c0.09,0.116,0.208,0.181,0.194,0.26c-0.013,0.077,0.104,0.103,0.156,0.116c0.052,0.013,0.169,0.247,0.286,0.143c0.117-0.104-0.155-0.259-0.234-0.326c-0.078-0.064,0-0.207-0.182-0.35c-0.182-0.143-0.156-0.247-0.286-0.351c-0.13-0.104-0.233-0.195-0.104-0.286c0.13-0.091,0.143,0.091,0.195,0.208c0.052,0.116,0.324,0.351,0.441,0.454c0.117,0.104,0.326,0.468,0.39,0.468s0.247,0.208,0.247,0.208s0.103,0.168,0.064,0.22c-0.039,0.052,0.053,0.247,0.144,0.299c0.09,0.052,0.455,0.22,0.507,0.247c0.052,0.027,0.155,0.221,0.299,0.221c0.142,0,0.247,0.014,0.286,0.053c0.039,0.038,0.155,0.194,0.234,0.104c0.078-0.092,0.09-0.131,0.208-0.131c0.117,0,0.168,0.091,0.233,0.156c0.065,0.065,0.247,0.235,0.338,0.222c0.091-0.013,0.208,0.104,0.273,0.064s0.169,0.025,0.22,0.052c0.054,0.026,0.234,0.118,0.222,0.272c-0.013,0.157,0.103,0.195,0.182,0.234c0.078,0.039,0.182,0.13,0.248,0.195c0.064,0.063,0.206,0.077,0.246,0.116c0.039,0.039,0.065,0.117,0.182,0.052c0.116-0.064,0.092-0.181,0.092-0.181s0.129-0.026,0.194,0.026c0.064,0.05,0.104,0.22,0.144,0.246c0.038,0.026,0.115,0.221,0.063,0.362c-0.051,0.145-0.038,0.286-0.091,0.286c-0.052,0-0.116,0.17-0.195,0.209c-0.076,0.039-0.285,0.221-0.272,0.286c0.013,0.063,0.131,0.258,0.104,0.35c-0.025,0.091-0.194,0.195-0.154,0.338c0.038,0.144,0.312,0.183,0.323,0.312c0.014,0.131,0.209,0.417,0.235,0.546c0.025,0.13,0.246,0.272,0.246,0.453c0,0.184,0.312,0.3,0.377,0.312c0.063,0.013,0.182,0.131,0.272,0.17s0.169,0.116,0.233,0.221s0.053,0.261,0.053,0.299c0,0.039-0.039,0.44-0.078,0.674C19.145,23.021,19.235,23.203,19.158,23.269zM10.766,11.188c0.039,0.013,0.117,0.091,0.156,0.091c0.04,0,0.234,0.156,0.286,0.208c0.053,0.052,0.053,0.195-0.013,0.208s-0.104-0.143-0.117-0.208c-0.013-0.065-0.143-0.065-0.208-0.104C10.805,11.344,10.66,11.152,10.766,11.188zM27.51,16.41c-0.144,0.182-0.13,0.272-0.195,0.286c-0.064,0.013,0.065,0.065,0.09,0.194c0.022,0.112-0.065,0.224,0.063,0.327c-0.486,4.619-3.71,8.434-8.016,9.787c-0.007-0.011-0.019-0.025-0.021-0.034c-0.027-0.078-0.027-0.233,0.064-0.285c0.091-0.053,0.312-0.233,0.363-0.272c0.052-0.04,0.13-0.221,0.091-0.247c-0.038-0.026-0.232,0-0.26-0.039c-0.026-0.039-0.026-0.092,0.104-0.182c0.13-0.091,0.195-0.222,0.247-0.26c0.052-0.039,0.155-0.117,0.195-0.209c0.038-0.09-0.041-0.039-0.118-0.039s-0.117-0.142-0.117-0.207s0.195,0.026,0.339,0.052c0.143,0.024,0.077-0.065,0.064-0.142c-0.013-0.078,0.026-0.209,0.105-0.17c0.076,0.039,0.479-0.013,0.531-0.026c0.052-0.013,0.194-0.246,0.246-0.312c0.053-0.065,0.064-0.129,0-0.168c-0.065-0.04-0.143-0.184-0.168-0.221c-0.026-0.041-0.039-0.274-0.013-0.34c0.025-0.063,0,0.377,0.181,0.43c0.183,0.052,0.286,0.078,0.455-0.078c0.169-0.155,0.298-0.26,0.312-0.363c0.013-0.104,0.052-0.209,0.117-0.246c0.065-0.039,0.104,0.103,0.182-0.065c0.078-0.17,0.156-0.157,0.234-0.299c0.077-0.144-0.13-0.325,0.024-0.43c0.157-0.103,0.43-0.233,0.43-0.233s0.078-0.039,0.234-0.078c0.155-0.038,0.324-0.014,0.376-0.09c0.052-0.079,0.104-0.247,0.182-0.338c0.079-0.092,0.169-0.234,0.13-0.299c-0.039-0.065,0.104-0.352,0.091-0.429c-0.013-0.078-0.13-0.261,0.065-0.416s0.402-0.391,0.416-0.454c0.012-0.065,0.169-0.338,0.154-0.469c-0.012-0.129-0.154-0.285-0.245-0.325c-0.092-0.037-0.286-0.05-0.364-0.154s-0.299-0.208-0.377-0.182c-0.077,0.026-0.208,0.051-0.312-0.015c-0.104-0.063-0.272-0.143-0.337-0.194c-0.066-0.051-0.234-0.09-0.312-0.09s-0.065-0.053-0.182,0.103c-0.117,0.157,0,0.209-0.208,0.182c-0.209-0.024,0.025-0.038,0.144-0.194c0.115-0.155-0.014-0.247-0.144-0.207c-0.13,0.039-0.039,0.117-0.247,0.156c-0.207,0.038-0.207-0.092-0.077-0.117c0.13-0.026,0.363-0.143,0.363-0.194c0-0.053-0.026-0.196-0.13-0.196s-0.078-0.129-0.233-0.297c-0.156-0.17-0.351-0.274-0.508-0.249c-0.154,0.026-0.272,0.065-0.35-0.076c-0.078-0.144-0.169-0.17-0.222-0.247c-0.051-0.078-0.182,0-0.221-0.039s-0.039-0.039-0.039-0.039s-0.169,0.039-0.077-0.078c0.09-0.117,0.129-0.338,0.09-0.325c-0.038,0.013-0.104,0.196-0.168,0.183c-0.064-0.013-0.014-0.04-0.144-0.117c-0.13-0.078-0.337-0.013-0.337,0.052c0,0.065-0.065,0.117-0.065,0.117s-0.039-0.038-0.078-0.117c-0.039-0.078-0.221-0.091-0.312-0.013c-0.09,0.078-0.142-0.196-0.207-0.196s-0.194,0.065-0.26,0.184c-0.064,0.116-0.038,0.285-0.092,0.272c-0.05-0.013-0.063-0.233-0.05-0.312c0.012-0.079,0.155-0.208,0.05-0.234c-0.103-0.026-0.259,0.13-0.323,0.143c-0.065,0.013-0.195,0.104-0.273,0.209c-0.077,0.103-0.116,0.168-0.195,0.207c-0.077,0.039-0.193,0-0.167-0.039c0.025-0.039-0.222-0.181-0.261-0.13c-0.04,0.052-0.155,0.091-0.272,0.144c-0.117,0.052-0.222-0.065-0.247-0.117s-0.079-0.064-0.091-0.234c-0.013-0.168,0.027-0.351,0.065-0.454c0.038-0.104-0.195-0.312-0.286-0.3c-0.091,0.015-0.182,0.105-0.272,0.091c-0.092-0.012-0.052-0.038-0.195-0.038c-0.143,0-0.026-0.025,0-0.143c0.025-0.116-0.052-0.273,0.092-0.377c0.142-0.104,0.091-0.351,0-0.363c-0.092-0.014-0.261,0.039-0.377,0.026c-0.116-0.014-0.208,0.091-0.169,0.207c0.039,0.117-0.065,0.195-0.104,0.183c-0.039-0.013-0.09-0.078-0.234,0.026c-0.142,0.103-0.194,0.064-0.337-0.052c-0.143-0.118-0.299-0.234-0.325-0.416c-0.026-0.182-0.04-0.364,0.013-0.468c0.051-0.104,0.051-0.285-0.026-0.312c-0.078-0.025,0.09-0.155,0.181-0.181c0.092-0.026,0.234-0.143,0.26-0.195c0.026-0.052,0.156-0.04,0.298-0.04c0.143,0,0.169,0,0.312,0.078c0.143,0.078,0.169-0.039,0.169-0.078c0-0.039,0.052-0.117,0.208-0.104c0.156,0.013,0.376-0.052,0.416-0.013s0.116,0.195,0.194,0.143c0.079-0.051,0.104-0.143,0.131,0.014c0.025,0.155,0.09,0.39,0.208,0.429c0.116,0.039,0.052,0.194,0.168,0.207c0.115,0.013,0.17-0.246,0.131-0.337c-0.04-0.09-0.118-0.363-0.183-0.428c-0.064-0.065-0.064-0.234,0.064-0.286c0.13-0.052,0.442-0.312,0.532-0.389c0.092-0.079,0.338-0.144,0.261-0.248c-0.078-0.104-0.104-0.168-0.104-0.247s0.078-0.052,0.117,0s0.194-0.078,0.155-0.143c-0.038-0.064-0.026-0.155,0.065-0.143c0.091,0.013,0.116-0.065,0.078-0.117c-0.039-0.052,0.091-0.117,0.182-0.091c0.092,0.026,0.325-0.013,0.364-0.065c0.038-0.052-0.078-0.104-0.078-0.208c0-0.104,0.155-0.195,0.247-0.208c0.091-0.013,0.207,0,0.221-0.039c0.012-0.039,0.143-0.143,0.155-0.052c0.014,0.091,0,0.247,0.104,0.247c0.104,0,0.232-0.117,0.272-0.129c0.038-0.013,0.286-0.065,0.338-0.078c0.052-0.013,0.363-0.039,0.325-0.13c-0.039-0.09-0.078-0.181-0.118-0.22c-0.039-0.039-0.077,0.013-0.13,0.078c-0.051,0.065-0.143,0.065-0.168,0.013c-0.026-0.051,0.012-0.207-0.078-0.156c-0.092,0.052-0.104,0.104-0.157,0.078c-0.052-0.026-0.103-0.117-0.103-0.117s0.129-0.064,0.038-0.182c-0.09-0.117-0.221-0.091-0.35-0.025c-0.13,0.064-0.118,0.051-0.273,0.09s-0.234,0.078-0.234,0.078s0.209-0.129,0.299-0.208c0.091-0.078,0.209-0.117,0.286-0.195c0.078-0.078,0.285,0.039,0.285,0.039s0.105-0.104,0.105-0.039s-0.027,0.234,0.051,0.234c0.079,0,0.299-0.104,0.21-0.131c-0.093-0.026,0.129,0,0.219-0.065c0.092-0.065,0.194-0.065,0.247-0.09c0.052-0.026,0.092-0.143,0.182-0.143c0.092,0,0.13,0.117,0,0.195s-0.143,0.273-0.208,0.325c-0.064,0.052-0.026,0.117,0.078,0.104c0.104-0.013,0.194,0.013,0.286-0.013s0.143,0.026,0.168,0.065c0.026,0.039,0.104-0.039,0.104-0.039s0.169-0.039,0.221,0.026c0.053,0.064,0.092-0.039,0.053-0.104c-0.039-0.064-0.092-0.129-0.13-0.208c-0.039-0.078-0.091-0.104-0.194-0.078c-0.104,0.026-0.13-0.026-0.195-0.064c-0.065-0.04-0.118,0.052-0.065-0.04c0.053-0.09,0.078-0.117,0.117-0.195c0.039-0.078,0.209-0.221,0.039-0.259c-0.169-0.04-0.222-0.065-0.247-0.143c-0.026-0.078-0.221-0.221-0.272-0.221c-0.053,0-0.233,0-0.247-0.065c-0.013-0.065-0.143-0.208-0.208-0.273c-0.064-0.065-0.312-0.351-0.351-0.377c-0.039-0.026-0.091-0.013-0.208,0.143c-0.116,0.157-0.22,0.183-0.312,0.144c-0.091-0.039-0.104-0.026-0.193-0.13c-0.093-0.104,0.09-0.117,0.051-0.182c-0.04-0.064-0.247-0.091-0.377-0.104c-0.13-0.013-0.221-0.156-0.416-0.169c-0.194-0.013-0.428,0.026-0.493,0.026c-0.064,0-0.064,0.091-0.09,0.234c-0.027,0.143,0.09,0.182-0.027,0.208c-0.116,0.026-0.169,0.039-0.052,0.091c0.117,0.052,0.273,0.26,0.273,0.26s0,0.117-0.092,0.182c-0.09,0.065-0.182,0.13-0.233,0.053c-0.053-0.079-0.195-0.065-0.155,0.013c0.038,0.078,0.116,0.117,0.116,0.195c0,0.077,0.117,0.272,0.039,0.337c-0.078,0.065-0.168,0.014-0.233,0.026s-0.131-0.104-0.078-0.13c0.051-0.026-0.014-0.221-0.014-0.221s-0.155,0.221-0.143,0.104c0.014-0.117-0.064-0.13-0.064-0.221c0-0.091-0.079-0.13-0.194-0.104c-0.118,0.026-0.26-0.04-0.482-0.079c-0.22-0.039-0.311-0.064-0.493-0.156c-0.182-0.091-0.247-0.026-0.338-0.013c-0.091,0.013-0.052-0.182-0.169-0.207c-0.116-0.027-0.181,0.025-0.207-0.144c-0.026-0.168,0.039-0.208,0.324-0.39c0.286-0.182,0.247-0.26,0.468-0.286c0.22-0.026,0.325,0.026,0.325-0.039s0.052-0.325,0.052-0.195S16.95,9.109,16.832,9.2c-0.116,0.091-0.052,0.104,0.04,0.104c0.091,0,0.259-0.091,0.259-0.091s0.208-0.091,0.26-0.013c0.053,0.078,0.053,0.156,0.144,0.156s0.285-0.104,0.116-0.195c-0.168-0.091-0.272-0.078-0.376-0.182s-0.078-0.065-0.195-0.039c-0.116,0.026-0.116-0.039-0.156-0.039s-0.104,0.026-0.13-0.026c-0.025-0.052,0.014-0.065,0.145-0.065c0.129,0,0.285,0.039,0.285,0.039s0.155-0.052,0.194-0.065c0.039-0.013,0.247-0.039,0.208-0.155c-0.04-0.117-0.169-0.117-0.208-0.156s0.078-0.09,0.143-0.117c0.065-0.026,0.247,0,0.247,0s0.117,0.013,0.117-0.039S17.897,8.2,17.976,8.239s0,0.156,0.117,0.13c0.116-0.026,0.143,0,0.207,0.039c0.065,0.039-0.013,0.195-0.077,0.221c-0.065,0.025-0.169,0.077-0.026,0.09c0.144,0.014,0.246,0.014,0.246,0.014s0.092-0.091,0.131-0.169c0.038-0.078,0.104-0.026,0.155,0c0.052,0.025,0.247,0.065,0.065,0.117c-0.183,0.052-0.221,0.117-0.26,0.182c-0.038,0.065-0.053,0.104-0.221,0.065c-0.17-0.039-0.26-0.026-0.299,0.039c-0.039,0.064-0.013,0.273,0.053,0.247c0.063-0.026,0.129-0.026,0.207-0.052c0.078-0.026,0.39,0.026,0.467,0.013c0.078-0.013,0.209,0.13,0.248,0.104c0.039-0.026,0.117,0.052,0.194,0.104c0.078,0.052,0.052-0.117,0.194-0.013c0.144,0.104,0.065,0.104,0.144,0.104c0.076,0,0.246,0.013,0.246,0.013s0.014-0.129,0.144-0.104c0.13,0.026,0.245,0.169,0.232,0.064c-0.012-0.103,0.013-0.181-0.09-0.259c-0.104-0.078-0.272-0.13-0.299-0.169c-0.026-0.039-0.052-0.091-0.013-0.117c0.039-0.025,0.221,0.013,0.324,0.079c0.104,0.065,0.195,0.13,0.273,0.078c0.077-0.052,0.17-0.078,0.208-0.117c0.038-0.04,0.13-0.156,0.13-0.156s-0.391-0.051-0.441-0.117c-0.053-0.065-0.235-0.156-0.287-0.156s-0.194,0.091-0.246-0.039s-0.052-0.286-0.105-0.299c-0.05-0.013-0.597-0.091-0.674-0.13c-0.078-0.039-0.39-0.13-0.507-0.195s-0.286-0.156-0.389-0.156c-0.104,0-0.533,0.052-0.611,0.039c-0.078-0.013-0.312,0.026-0.403,0.039c-0.091,0.013,0.117,0.182-0.077,0.221c-0.195,0.039-0.169,0.065-0.13-0.13c0.038-0.195-0.131-0.247-0.299-0.169c-0.169,0.078-0.442,0.13-0.377,0.221c0.065,0.091-0.012,0.157,0.117,0.247c0.13,0.091,0.183,0.117,0.35,0.104c0.17-0.013,0.339,0.025,0.339,0.025s0,0.157-0.064,0.182c-0.065,0.026-0.169,0.026-0.196,0.104c-0.025,0.078-0.155,0.117-0.155,0.078s0.065-0.169-0.026-0.234c-0.09-0.065-0.117-0.078-0.221-0.013c-0.104,0.065-0.116,0.091-0.169-0.013C16.053,8.291,15.897,8.2,15.897,8.2s-0.104-0.129-0.182-0.194c-0.077-0.065-0.22-0.052-0.234,0.013c-0.013,0.064,0.026,0.129,0.078,0.247c0.052,0.117,0.104,0.337,0.013,0.351c-0.091,0.013-0.104,0.026-0.195,0.052c-0.091,0.026-0.13-0.039-0.13-0.143s-0.04-0.195-0.013-0.234c0.026-0.039-0.104,0.027-0.234,0c-0.13-0.025-0.233,0.052-0.104,0.092c0.13,0.039,0.157,0.194,0.039,0.233c-0.117,0.039-0.559,0-0.702,0s-0.35,0.039-0.39-0.039c-0.039-0.078,0.118-0.129,0.208-0.129c0.091,0,0.363,0.012,0.467-0.13c0.104-0.143-0.13-0.169-0.233-0.169c-0.104,0-0.183-0.039-0.299-0.155c-0.118-0.117,0.078-0.195,0.052-0.247c-0.026-0.052-0.156-0.014-0.272-0.014c-0.117,0-0.299-0.09-0.299,0.014c0,0.104,0.143,0.402,0.052,0.337c-0.091-0.064-0.078-0.156-0.143-0.234c-0.065-0.078-0.168-0.065-0.299-0.052c-0.129,0.013-0.35,0.052-0.415,0.039c-0.064-0.013-0.013-0.013-0.156-0.078c-0.142-0.065-0.208-0.052-0.312-0.117C12.091,7.576,12.182,7.551,12,7.538c-0.181-0.013-0.168,0.09-0.35,0.065c-0.182-0.026-0.234,0.013-0.416,0c-0.182-0.013-0.272-0.026-0.299,0.065c-0.025,0.091-0.078,0.247-0.156,0.247c-0.077,0-0.169,0.091,0.078,0.104c0.247,0.013,0.105,0.129,0.325,0.117c0.221-0.013,0.416-0.013,0.468-0.117c0.052-0.104,0.091-0.104,0.117-0.065c0.025,0.039,0.22,0.272,0.22,0.272s0.131,0.104,0.183,0.13c0.051,0.026-0.052,0.143-0.156,0.078c-0.104-0.065-0.299-0.051-0.377-0.116c-0.078-0.065-0.429-0.065-0.52-0.052c-0.09,0.013-0.247-0.039-0.299-0.039c-0.051,0-0.221,0.13-0.221,0.13S10.532,8.252,10.494,8.2c-0.039-0.052-0.104,0.052-0.156,0.065c-0.052,0.013-0.208-0.104-0.364-0.052C9.818,8.265,9.87,8.317,9.649,8.304s-0.272-0.052-0.35-0.039C9.22,8.278,9.22,8.278,9.22,8.278S9.233,8.33,9.143,8.382C9.052,8.434,8.986,8.499,8.921,8.421C8.857,8.343,8.818,8.343,8.779,8.33c-0.04-0.013-0.118-0.078-0.286-0.04C8.324,8.33,8.064,8.239,8.013,8.239c-0.04,0-0.313-0.015-0.491-0.033c2.109-2.292,5.124-3.74,8.478-3.74c2.128,0,4.117,0.589,5.83,1.598c-0.117,0.072-0.319,0.06-0.388,0.023c-0.078-0.043-0.158-0.078-0.475-0.061c-0.317,0.018-0.665,0.122-0.595,0.226c0.072,0.104-0.142,0.165-0.197,0.113c-0.055-0.052-0.309,0.06-0.293,0.165c0.016,0.104-0.039,0.225-0.175,0.199c-0.134-0.027-0.229,0.06-0.237,0.146c-0.007,0.087-0.309,0.147-0.332,0.147c-0.024,0-0.412-0.008-0.27,0.095c0.097,0.069,0.15,0.027,0.27,0.052c0.119,0.026,0.214,0.217,0.277,0.243c0.062,0.026,0.15,0,0.189-0.052c0.04-0.052,0.095-0.234,0.095-0.234s0,0.173,0.097,0.208c0.095,0.035,0.331-0.026,0.395-0.017c0.064,0.008,0.437,0.061,0.538,0.112c0.104,0.052,0.356,0.087,0.428,0.199c0.071,0.113,0.08,0.503,0.119,0.546c0.04,0.043,0.174-0.139,0.205-0.182c0.031-0.044,0.198-0.018,0.254,0.042c0.056,0.061,0.182,0.208,0.175,0.269C21.9,8.365,21.877,8.459,21.83,8.425c-0.048-0.034-0.127-0.025-0.096-0.095c0.032-0.069,0.048-0.217-0.015-0.217c-0.064,0-0.119,0-0.119,0s-0.12-0.035-0.199,0.095s-0.015,0.26,0.04,0.26s0.184,0,0.184,0.034c0,0.035-0.136,0.139-0.128,0.2c0.009,0.061,0.11,0.268,0.144,0.312c0.031,0.043,0.197,0.086,0.244,0.096c0.049,0.008-0.111,0.017-0.07,0.077c0.04,0.061,0.102,0.208,0.189,0.243c0.087,0.035,0.333,0.19,0.363,0.26c0.032,0.069,0.222-0.052,0.262-0.061c0.04-0.008,0.032,0.182,0.143,0.191c0.11,0.008,0.15-0.018,0.245-0.096s0.072-0.182,0.079-0.26c0.009-0.078,0-0.138,0.104-0.113c0.104,0.026,0.158-0.018,0.15-0.104c-0.008-0.087-0.095-0.191,0.07-0.217c0.167-0.026,0.254-0.138,0.357-0.138c0.103,0,0.389,0.043,0.419,0c0.032-0.043,0.167-0.243,0.254-0.251c0.067-0.007,0.224-0.021,0.385-0.042c1.582,1.885,2.561,4.284,2.673,6.905c-0.118,0.159-0.012,0.305,0.021,0.408c0.001,0.03,0.005,0.058,0.005,0.088c0,0.136-0.016,0.269-0.021,0.404C27.512,16.406,27.512,16.408,27.51,16.41zM17.794,12.084c-0.064,0.013-0.169-0.052-0.169-0.143s-0.091,0.169-0.04,0.247c0.053,0.078-0.104,0.169-0.155,0.169s-0.091-0.116-0.078-0.233c0.014-0.117-0.077-0.221-0.221-0.208c-0.143,0.014-0.208,0.13-0.259,0.169c-0.053,0.039-0.053,0.259-0.04,0.312s0.013,0.235-0.116,0.221c-0.118-0.013-0.092-0.233-0.079-0.312c0.014-0.078-0.039-0.273,0.014-0.376c0.053-0.104,0.207-0.143,0.312-0.156s0.324,0.065,0.363,0.052c0.04-0.014,0.222-0.014,0.312,0C17.729,11.837,17.858,12.071,17.794,12.084zM18.027,12.123c0.04,0.026,0.311-0.039,0.364,0.026c0.051,0.065-0.054,0.078-0.183,0.13c-0.129,0.052-0.169,0.039-0.221,0.104s-0.221,0.09-0.299,0.168c-0.078,0.079-0.217,0.125-0.246,0.065c-0.04-0.078,0.013-0.039,0.025-0.078c0.013-0.039,0.245-0.129,0.245-0.129S17.988,12.097,18.027,12.123zM16.988,11.668c-0.038,0.013-0.182-0.026-0.3-0.026c-0.116,0-0.091-0.078-0.143-0.064c-0.051,0.013-0.168,0.039-0.247,0.078c-0.078,0.039-0.208,0.03-0.208-0.04c0-0.104,0.052-0.078,0.221-0.143c0.169-0.065,0.352-0.247,0.429-0.169c0.078,0.078,0.221,0.169,0.312,0.182C17.144,11.5,17.026,11.655,16.988,11.668zM15.659,7.637c-0.079,0.026-0.347,0.139-0.321,0.199c0.01,0.023,0.078,0.069,0.19,0.052c0.113-0.018,0.276-0.035,0.355-0.043c0.078-0.009,0.095-0.139,0.009-0.147C15.805,7.689,15.736,7.611,15.659,7.637zM14.698,7.741c-0.061,0.026-0.243-0.043-0.338,0.018c-0.061,0.038-0.026,0.164,0.07,0.172c0.095,0.009,0.259-0.06,0.276-0.008c0.018,0.052,0.078,0.286,0.234,0.208c0.156-0.078,0.147-0.147,0.19-0.156c0.043-0.009-0.008-0.199-0.078-0.243C14.983,7.689,14.758,7.715,14.698,7.741zM14.385,7.005c0.017,0.044-0.008,0.078,0.113,0.095c0.121,0.018,0.173,0.035,0.243,0.035c0.069,0,0.042-0.113-0.018-0.19c-0.061-0.078-0.043-0.069-0.199-0.113c-0.156-0.043-0.312-0.043-0.416-0.035c-0.104,0.009-0.217-0.017-0.243,0.104c-0.013,0.062,0.07,0.112,0.174,0.112S14.368,6.962,14.385,7.005zM14.611,7.481c0.043,0.095,0.043,0.051,0.165,0.061C14.896,7.551,14.991,7.421,15,7.378c0.009-0.044-0.061-0.13-0.225-0.113c-0.165,0.017-0.667-0.026-0.736,0.034c-0.066,0.058,0,0.233-0.026,0.251c-0.026,0.017,0.009,0.095,0.077,0.078c0.069-0.017,0.104-0.182,0.157-0.182C14.299,7.447,14.568,7.386,14.611,7.481zM12.982,7.126c0.052,0.043,0.183,0.008,0.173-0.035c-0.008-0.043,0.053-0.217-0.051-0.225C13,6.858,12.854,6.962,12.697,7.014c-0.101,0.033-0.078,0.13-0.009,0.13S12.931,7.083,12.982,7.126zM13.72,7.282c-0.087,0.043-0.114,0.069-0.191,0.052c-0.078-0.017-0.078-0.156-0.217-0.13c-0.138,0.026-0.164,0.104-0.207,0.139s-0.139,0.061-0.173,0.043c-0.034-0.017-0.234-0.129-0.234-0.129s-0.416-0.018-0.433-0.07c-0.017-0.052-0.086-0.138-0.277-0.121s-0.52,0.13-0.572,0.13c-0.052,0,0.062,0.104-0.009,0.104c-0.069,0-0.155-0.008-0.181,0.069c-0.018,0.053,0.078,0.052,0.189,0.052c0.112,0,0.295,0,0.347-0.026c0.052-0.026,0.312-0.087,0.303-0.009c-0.009,0.079,0.104,0.199,0.164,0.182c0.061-0.017,0.183-0.13,0.243-0.086c0.061,0.043,0.07,0.146,0.13,0.173c0.061,0.025,0.226,0.025,0.304,0c0.077-0.027,0.294-0.027,0.389-0.009c0.095,0.018,0.373,0.069,0.399,0.018c0.026-0.053,0.104-0.061,0.112-0.113s0.051-0.216,0.051-0.216S13.806,7.239,13.72,7.282zM18.105,16.239c-0.119,0.021-0.091,0.252,0.052,0.21C18.3,16.407,18.223,16.217,18.105,16.239zM19.235,15.929c-0.104-0.026-0.221,0-0.299,0.013c-0.078,0.013-0.299,0.208-0.299,0.208s0.143,0.026,0.233,0.026c0.092,0,0.144,0.051,0.221,0.09c0.078,0.04,0.221-0.052,0.272-0.052c0.053,0,0.118,0.156,0.131-0.013C19.508,16.032,19.339,15.955,19.235,15.929zM15.616,7.507c-0.043-0.104-0.259-0.139-0.304-0.035C15.274,7.563,15.659,7.611,15.616,7.507zM18.093,15.292c0.143-0.026,0.064-0.144-0.053-0.13C17.922,15.175,17.949,15.318,18.093,15.292zM19.82,16.095c-0.119,0.022-0.092,0.253,0.051,0.211C20.015,16.264,19.937,16.074,19.82,16.095zM18.247,15.708c-0.09,0.013-0.285-0.09-0.389-0.182c-0.104-0.091-0.299-0.091-0.377-0.091c-0.077,0-0.39,0.091-0.39,0.091c-0.013,0.13,0.117,0.091,0.273,0.091s0.429-0.026,0.479,0.039c0.053,0.064,0.286,0.168,0.352,0.221c0.064,0.052,0.272,0.065,0.285,0.013S18.338,15.695,18.247,15.708zM16.698,7.412c-0.13-0.009-0.295-0.009-0.399,0c-0.104,0.008-0.182-0.069-0.26-0.113c-0.077-0.043-0.251-0.182-0.354-0.199c-0.104-0.017-0.086-0.017-0.303-0.069c-0.11-0.027-0.294-0.061-0.294-0.086c0-0.026-0.052,0.121,0.043,0.165c0.095,0.043,0.251,0.121,0.363,0.164c0.114,0.043,0.329,0.052,0.399,0.139c0.069,0.086,0.303,0.156,0.303,0.156l0.277,0.026c0,0,0.191-0.043,0.39-0.026c0.199,0.017,0.493,0.043,0.659,0.035c0.163-0.008,0.189-0.061,0.208-0.095c0.016-0.035-0.304-0.104-0.383-0.095C17.271,7.42,16.827,7.42,16.698,7.412zM17.182,9.404c-0.034,0.039,0.157,0.095,0.191,0.043C17.407,9.396,17.271,9.309,17.182,9.404zM17.764,9.585c0.086-0.035,0.043-0.139-0.079-0.104C17.547,9.521,17.676,9.62,17.764,9.585z",
                "raph_warning": "M29.225,23.567l-3.778-6.542c-1.139-1.972-3.002-5.2-4.141-7.172l-3.778-6.542c-1.14-1.973-3.003-1.973-4.142,0L9.609,9.853c-1.139,1.972-3.003,5.201-4.142,7.172L1.69,23.567c-1.139,1.974-0.207,3.587,2.071,3.587h23.391C29.432,27.154,30.363,25.541,29.225,23.567zM16.536,24.58h-2.241v-2.151h2.241V24.58zM16.428,20.844h-2.023l-0.201-9.204h2.407L16.428,20.844z",
                "raph_arrowleftalt": "M16,30.534c8.027,0,14.534-6.507,14.534-14.534c0-8.027-6.507-14.534-14.534-14.534C7.973,1.466,1.466,7.973,1.466,16C1.466,24.027,7.973,30.534,16,30.534zM18.335,6.276l3.536,3.538l-6.187,6.187l6.187,6.187l-3.536,3.537l-9.723-9.724L18.335,6.276z",
                "raph_arrowalt": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM13.665,25.725l-3.536-3.539l6.187-6.187l-6.187-6.187l3.536-3.536l9.724,9.723L13.665,25.725z",
                "raph_code": "M8.982,7.107L0.322,15.77l8.661,8.662l3.15-3.15L6.621,15.77l5.511-5.511L8.982,7.107zM21.657,7.107l-3.148,3.151l5.511,5.511l-5.511,5.511l3.148,3.15l8.662-8.662L21.657,7.107z",
                "raph_arrowleft": "M21.871,9.814 15.684,16.001 21.871,22.188 18.335,25.725 8.612,16.001 18.335,6.276",
                "raph_arrow": "M10.129,22.186 16.316,15.999 10.129,9.812 13.665,6.276 23.389,15.999 13.665,25.725",
                "raph_pensil": "M25.31,2.872l-3.384-2.127c-0.854-0.536-1.979-0.278-2.517,0.576l-1.334,2.123l6.474,4.066l1.335-2.122C26.42,4.533,26.164,3.407,25.31,2.872zM6.555,21.786l6.474,4.066L23.581,9.054l-6.477-4.067L6.555,21.786zM5.566,26.952l-0.143,3.819l3.379-1.787l3.14-1.658l-6.246-3.925L5.566,26.952z",
                "raph_pen": "M13.587,12.074c-0.049-0.074-0.11-0.147-0.188-0.202c-0.333-0.243-0.803-0.169-1.047,0.166c-0.244,0.336-0.167,0.805,0.167,1.048c0.303,0.22,0.708,0.167,0.966-0.091l-7.086,9.768l-2.203,7.997l6.917-4.577L26.865,4.468l-4.716-3.42l-1.52,2.096c-0.087-0.349-0.281-0.676-0.596-0.907c-0.73-0.529-1.751-0.369-2.28,0.363C14.721,6.782,16.402,7.896,13.587,12.074zM10.118,25.148L6.56,27.503l1.133-4.117L10.118,25.148zM14.309,11.861c2.183-3.225,1.975-4.099,3.843-6.962c0.309,0.212,0.664,0.287,1.012,0.269L14.309,11.861z",
                "raph_minus": "M25.979,12.896,19.312,12.896,5.979,12.896,5.979,19.562,25.979,19.562",
                "raph_tshirt": "M20.1,4.039c-0.681,1.677-2.32,2.862-4.24,2.862c-1.921,0-3.56-1.185-4.24-2.862L1.238,8.442l2.921,6.884l3.208-1.361V28h17.099V14.015l3.093,1.312l2.922-6.884L20.1,4.039z",
                "raph_raphael": "M27.777,18.941c0.584-0.881,0.896-1.914,0.896-2.998c0-1.457-0.567-2.826-1.598-3.854l-6.91-6.911l-0.003,0.002c-0.985-0.988-2.35-1.6-3.851-1.6c-1.502,0-2.864,0.612-3.85,1.6H12.46l-6.911,6.911c-1.031,1.029-1.598,2.398-1.598,3.854c0,1.457,0.567,2.826,1.598,3.854l6.231,6.229c0.25,0.281,0.512,0.544,0.789,0.785c1.016,0.961,2.338,1.49,3.743,1.49c1.456,0,2.825-0.565,3.854-1.598l6.723-6.725c0.021-0.019,0.034-0.032,0.051-0.051l0.14-0.138c0.26-0.26,0.487-0.54,0.688-0.838c0.004-0.008,0.01-0.015,0.014-0.021L27.777,18.941zM26.658,15.946c0,0.678-0.197,1.326-0.561,1.879c-0.222,0.298-0.447,0.559-0.684,0.784L25.4,18.625c-1.105,1.052-2.354,1.35-3.414,1.35c-0.584,0-1.109-0.09-1.523-0.195c-2.422-0.608-5.056-2.692-6.261-5.732c0.649,0.274,1.362,0.426,2.11,0.426c2.811,0,5.129-2.141,5.415-4.877l3.924,3.925C26.301,14.167,26.658,15.029,26.658,15.946zM16.312,5.6c1.89,0,3.426,1.538,3.426,3.427c0,1.89-1.536,3.427-3.426,3.427c-1.889,0-3.426-1.537-3.426-3.427C12.886,7.138,14.423,5.6,16.312,5.6zM6.974,18.375c-0.649-0.648-1.007-1.512-1.007-2.429c0-0.917,0.357-1.78,1.007-2.428l2.655-2.656c-0.693,2.359-0.991,4.842-0.831,7.221c0.057,0.854,0.175,1.677,0.345,2.46L6.974,18.375zM11.514,11.592c0.583,4.562,4.195,9.066,8.455,10.143c0.693,0.179,1.375,0.265,2.033,0.265c0.01,0,0.02,0,0.027,0l-3.289,3.289c-0.648,0.646-1.512,1.006-2.428,1.006c-0.638,0-1.248-0.177-1.779-0.5l0.001-0.002c-0.209-0.142-0.408-0.295-0.603-0.461c-0.015-0.019-0.031-0.026-0.046-0.043l-0.665-0.664c-1.367-1.567-2.227-3.903-2.412-6.671C10.669,15.856,10.921,13.673,11.514,11.592",
                "raph_graphael": "M28.832,16.104c0-1.477-0.574-2.863-1.617-3.905l-7.002-7.001L20.211,5.2c-1.027-1.03-2.445-1.62-3.9-1.62c-1.455,0-2.871,0.59-3.9,1.621l-0.002-0.002l-7,7c-1.033,1.031-1.619,2.445-1.619,3.905c0,1.458,0.586,2.872,1.619,3.903l6.312,6.312c0.253,0.284,0.519,0.55,0.8,0.794c1.049,0.994,2.463,1.54,3.908,1.51c1.417-0.028,2.783-0.612,3.785-1.615l6.811-6.811c0.018-0.017,0.035-0.034,0.053-0.052l0.137-0.138c0.27-0.268,0.49-0.564,0.713-0.868l-0.002-0.002C28.516,18.244,28.832,17.198,28.832,16.104zM23.08,21.252l-0.051,0.006l-0.955,0.974c0.01,0-3.305,3.332-3.305,3.332c-1.121,1.119-2.906,1.337-4.261,0.511l0.002-0.002c-0.213-0.141-0.414-0.299-0.61-0.467c-0.016-0.015-0.032-0.027-0.047-0.042l-3.024-3.024h-0.001l-3.976-3.976c-1.34-1.339-1.342-3.581,0-4.921l2.689-2.689l0.052-0.005l0.956-0.973c-0.01,0,3.303-3.332,3.303-3.332c1.121-1.12,2.908-1.337,4.261-0.511v0.002c0.211,0.14,0.414,0.299,0.609,0.467c0.016,0.015,0.031,0.028,0.047,0.042l3.025,3.024l0,0l3.975,3.976c0.389,0.388,0.66,0.852,0.824,1.348l-2.617,0.008c-0.537-3.754-3.764-6.64-7.666-6.64c-4.277,0-7.744,3.467-7.745,7.746c0.001,4.277,3.468,7.743,7.745,7.744c3.919-0.001,7.156-2.911,7.671-6.688l2.635-0.009c-0.16,0.52-0.441,1.007-0.846,1.412L23.08,21.252zM16.311,17.184c0.002,0,0.002,0,0.004,0l5.476-0.018c-0.5,2.573-2.76,4.516-5.48,4.52c-3.084-0.005-5.578-2.5-5.584-5.582c0.006-3.084,2.5-5.579,5.584-5.584c2.707,0.005,4.96,1.929,5.472,4.485l-5.476,0.018c-0.596,0.002-1.078,0.488-1.076,1.084C15.233,16.702,15.715,17.184,16.311,17.184z",
                "raph_page": "M23.024,5.673c-1.744-1.694-3.625-3.051-5.168-3.236c-0.084-0.012-0.171-0.019-0.263-0.021H7.438c-0.162,0-0.322,0.063-0.436,0.18C6.889,2.71,6.822,2.87,6.822,3.033v25.75c0,0.162,0.063,0.317,0.18,0.435c0.117,0.116,0.271,0.179,0.436,0.179h18.364c0.162,0,0.317-0.062,0.434-0.179c0.117-0.117,0.182-0.272,0.182-0.435V11.648C26.382,9.659,24.824,7.49,23.024,5.673zM25.184,28.164H8.052V3.646h9.542v0.002c0.416-0.025,0.775,0.386,1.05,1.326c0.25,0.895,0.313,2.062,0.312,2.871c0.002,0.593-0.027,0.991-0.027,0.991l-0.049,0.652l0.656,0.007c0.003,0,1.516,0.018,3,0.355c1.426,0.308,2.541,0.922,2.645,1.617c0.004,0.062,0.005,0.124,0.004,0.182V28.164z",
                "raph_page2": "M23.024,5.673c-1.744-1.694-3.625-3.051-5.168-3.236c-0.084-0.012-0.171-0.019-0.263-0.021H7.438c-0.162,0-0.322,0.063-0.436,0.18C6.889,2.71,6.822,2.87,6.822,3.033v25.75c0,0.162,0.063,0.317,0.18,0.435c0.117,0.116,0.271,0.179,0.436,0.179h18.364c0.162,0,0.317-0.062,0.434-0.179c0.117-0.117,0.182-0.272,0.182-0.435V11.648C26.382,9.659,24.824,7.49,23.024,5.673zM22.157,6.545c0.805,0.786,1.529,1.676,2.069,2.534c-0.468-0.185-0.959-0.322-1.42-0.431c-1.015-0.228-2.008-0.32-2.625-0.357c0.003-0.133,0.004-0.283,0.004-0.446c0-0.869-0.055-2.108-0.356-3.2c-0.003-0.01-0.005-0.02-0.009-0.03C20.584,5.119,21.416,5.788,22.157,6.545zM25.184,28.164H8.052V3.646h9.542v0.002c0.416-0.025,0.775,0.386,1.05,1.326c0.25,0.895,0.313,2.062,0.312,2.871c0.002,0.593-0.027,0.991-0.027,0.991l-0.049,0.652l0.656,0.007c0.003,0,1.516,0.018,3,0.355c1.426,0.308,2.541,0.922,2.645,1.617c0.004,0.062,0.005,0.124,0.004,0.182V28.164z",
                "raph_plugin": "M26.33,15.836l-3.893-1.545l3.136-7.9c0.28-0.705-0.064-1.505-0.771-1.785c-0.707-0.28-1.506,0.065-1.785,0.771l-3.136,7.9l-4.88-1.937l3.135-7.9c0.281-0.706-0.064-1.506-0.77-1.786c-0.706-0.279-1.506,0.065-1.785,0.771l-3.136,7.9L8.554,8.781l-1.614,4.066l2.15,0.854l-2.537,6.391c-0.61,1.54,0.143,3.283,1.683,3.895l1.626,0.646L8.985,26.84c-0.407,1.025,0.095,2.188,1.122,2.596l0.93,0.369c1.026,0.408,2.188-0.095,2.596-1.121l0.877-2.207l1.858,0.737c1.54,0.611,3.284-0.142,3.896-1.682l2.535-6.391l1.918,0.761L26.33,15.836z",
                "raph_svg": "M31.274,15.989c0-2.473-2.005-4.478-4.478-4.478l0,0c0.81-0.811,1.312-1.93,1.312-3.167c0-2.474-2.005-4.479-4.479-4.479c-1.236,0-2.356,0.501-3.167,1.312c0-2.473-2.005-4.478-4.478-4.478c-2.474,0-4.479,2.005-4.479,4.478c-0.811-0.81-1.93-1.312-3.167-1.312c-2.474,0-4.479,2.005-4.479,4.479c0,1.236,0.501,2.356,1.312,3.166c-2.474,0-4.479,2.005-4.479,4.479c0,2.474,2.005,4.479,4.479,4.479c-0.811,0.81-1.312,1.93-1.312,3.167c0,2.473,2.005,4.478,4.479,4.478c1.236,0,2.356-0.501,3.167-1.312c0,2.473,2.005,4.479,4.479,4.479c2.473,0,4.478-2.006,4.478-4.479l0,0c0.811,0.811,1.931,1.312,3.167,1.312c2.474,0,4.478-2.005,4.478-4.478c0-1.237-0.501-2.357-1.312-3.168c0.001,0,0.001,0,0.001,0C29.27,20.467,31.274,18.463,31.274,15.989zM23.583,21.211c0.016,0,0.031-0.001,0.047-0.001c1.339,0,2.424,1.085,2.424,2.425c0,1.338-1.085,2.424-2.424,2.424s-2.424-1.086-2.424-2.424c0-0.017,0.001-0.031,0.001-0.047l-3.541-3.542v5.009c0.457,0.44,0.743,1.06,0.743,1.746c0,1.339-1.086,2.424-2.424,2.424c-1.339,0-2.425-1.085-2.425-2.424c0-0.687,0.286-1.306,0.743-1.746v-5.009l-3.541,3.542c0,0.016,0.001,0.031,0.001,0.047c0,1.338-1.085,2.424-2.424,2.424s-2.424-1.086-2.424-2.424c0-1.34,1.085-2.425,2.424-2.425c0.015,0,0.031,0.001,0.046,0.001l3.542-3.541H6.919c-0.44,0.458-1.06,0.743-1.746,0.743c-1.339,0-2.424-1.085-2.424-2.424s1.085-2.424,2.424-2.424c0.686,0,1.305,0.285,1.746,0.744h5.008l-3.542-3.542c-0.015,0-0.031,0.001-0.046,0.001c-1.339,0-2.424-1.085-2.424-2.424S7.001,5.92,8.34,5.92s2.424,1.085,2.424,2.424c0,0.015-0.001,0.031-0.001,0.046l3.541,3.542V6.924c-0.457-0.441-0.743-1.06-0.743-1.746c0-1.339,1.086-2.425,2.425-2.425c1.338,0,2.424,1.085,2.424,2.425c0,0.686-0.286,1.305-0.743,1.746v5.008l3.541-3.542c0-0.015-0.001-0.031-0.001-0.046c0-1.339,1.085-2.424,2.424-2.424s2.424,1.085,2.424,2.424c0,1.339-1.085,2.424-2.424,2.424c-0.016,0-0.031-0.001-0.047-0.001l-3.541,3.542h5.008c0.441-0.458,1.061-0.744,1.747-0.744c1.338,0,2.423,1.085,2.423,2.424s-1.085,2.424-2.423,2.424c-0.687,0-1.306-0.285-1.747-0.743h-5.008L23.583,21.211z",
                "raph_bookmark": "M17.396,1.841L6.076,25.986l7.341-4.566l1.186,8.564l11.32-24.146L17.396,1.841zM19.131,9.234c-0.562-0.264-0.805-0.933-0.541-1.495c0.265-0.562,0.934-0.805,1.496-0.541s0.805,0.934,0.541,1.496S19.694,9.498,19.131,9.234z",
                "raph_hammer": "M7.831,29.354c0.685,0.353,1.62,1.178,2.344,0.876c0.475-0.195,0.753-1.301,1.048-1.883c2.221-4.376,4.635-9.353,6.392-13.611c0-0.19,0.101-0.337-0.049-0.595c0.983-1.6,1.65-3.358,2.724-5.138c0.34-0.566,0.686-1.351,1.163-1.577l0.881-0.368c1.12-0.288,1.938-0.278,2.719,0.473c0.396,0.383,0.578,1.015,0.961,1.395c0.259,0.26,1.246,0.899,1.613,0.8c0.285-0.077,0.52-0.364,0.72-0.728l0.696-1.286c0.195-0.366,0.306-0.718,0.215-0.999c-0.117-0.362-1.192-0.84-1.552-0.915c-0.528-0.113-1.154,0.081-1.692-0.041c-1.057-0.243-1.513-0.922-1.883-2.02c-2.608-1.533-6.119-2.53-10.207-1.244c-1.109,0.349-2.172,0.614-2.901,1.323c-0.146,0.412,0.143,0.494,0.446,0.489c-0.237,0.216-0.62,0.341-0.399,0.848c2.495-1.146,7.34-1.542,7.669,0.804c0.072,0.522-0.395,1.241-0.682,1.835c-0.905,1.874-2.011,3.394-2.813,5.091c-0.298,0.017-0.366,0.18-0.525,0.287c-2.604,3.8-5.451,8.541-7.9,12.794c-0.326,0.566-1.098,1.402-1.002,1.906C5.961,28.641,7.146,29,7.831,29.354z",
                "raph_users": "M21.053,20.8c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68h-0.34c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888C28.469,23.686,22.185,21.252,21.053,20.8zM8.583,20.628c-0.099-0.18-0.148-0.31-0.148-0.31s-0.432,0.239-0.432-0.432s0.432,0.432,0.864-2.159c0,0,1.199-0.336,0.959-3.119H9.538c0,0,0.143-0.591,0.237-1.334c-0.004-0.308,0.006-0.636,0.037-0.996l0.038-0.426c-0.021-0.492-0.107-0.939-0.312-1.226C8.818,9.619,8.53,8.947,6.947,8.467c-1.583-0.48-1.008-0.385-2.159-0.336C3.636,8.179,2.676,8.802,2.676,9.139c0,0-0.72,0.048-1.008,0.336c-0.271,0.271-0.705,1.462-0.757,1.885v0.281c0.047,0.653,0.258,2.449,0.469,2.872l-0.286,0.096c-0.239,2.783,0.959,3.119,0.959,3.119c0.432,2.591,0.864,1.488,0.864,2.159s-0.432,0.432-0.432,0.432s-0.383,1.057-1.343,1.439c-0.061,0.024-0.139,0.056-0.232,0.092v5.234h0.575c-0.029-1.278,0.077-2.927,0.746-3.594C2.587,23.135,3.754,22.551,8.583,20.628zM30.913,11.572c-0.04-0.378-0.127-0.715-0.292-0.946c-0.719-1.008-1.008-1.679-2.59-2.159c-1.584-0.48-1.008-0.385-2.16-0.336C24.72,8.179,23.76,8.802,23.76,9.139c0,0-0.719,0.048-1.008,0.336c-0.271,0.272-0.709,1.472-0.758,1.891h0.033l0.08,0.913c0.02,0.231,0.022,0.436,0.027,0.645c0.09,0.666,0.21,1.35,0.33,1.589l-0.286,0.096c-0.239,2.783,0.96,3.119,0.96,3.119c0.432,2.591,0.863,1.488,0.863,2.159s-0.432,0.432-0.432,0.432s-0.053,0.142-0.163,0.338c4.77,1.9,5.927,2.48,6.279,2.834c0.67,0.667,0.775,2.315,0.746,3.594h0.48v-5.306c-0.016-0.006-0.038-0.015-0.052-0.021c-0.959-0.383-1.343-1.439-1.343-1.439s-0.433,0.239-0.433-0.432s0.433,0.432,0.864-2.159c0,0,0.804-0.229,0.963-1.841v-1.227c-0.001-0.018-0.001-0.033-0.003-0.051h-0.289c0,0,0.215-0.89,0.292-1.861V11.572z",
                "raph_user": "M20.771,12.364c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888c-0.512-0.511-6.796-2.944-7.928-3.396c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68H20.771z",
                "raph_mail": "M28.516,7.167H3.482l12.517,7.108L28.516,7.167zM16.74,17.303C16.51,17.434,16.255,17.5,16,17.5s-0.51-0.066-0.741-0.197L2.5,10.06v14.773h27V10.06L16.74,17.303z",
                "raph_picture": "M2.5,4.833v22.334h27V4.833H2.5zM25.25,25.25H6.75V6.75h18.5V25.25zM11.25,14c1.426,0,2.583-1.157,2.583-2.583c0-1.427-1.157-2.583-2.583-2.583c-1.427,0-2.583,1.157-2.583,2.583C8.667,12.843,9.823,14,11.25,14zM24.251,16.25l-4.917-4.917l-6.917,6.917L10.5,16.333l-2.752,2.752v5.165h16.503V16.25z",
                "raph_bubble": "M16,5.333c-7.732,0-14,4.701-14,10.5c0,1.982,0.741,3.833,2.016,5.414L2,25.667l5.613-1.441c2.339,1.317,5.237,2.107,8.387,2.107c7.732,0,14-4.701,14-10.5C30,10.034,23.732,5.333,16,5.333z",
                "raph_codetalk": "M16,4.938c-7.732,0-14,4.701-14,10.5c0,1.981,0.741,3.833,2.016,5.414L2,25.272l5.613-1.44c2.339,1.316,5.237,2.106,8.387,2.106c7.732,0,14-4.701,14-10.5S23.732,4.938,16,4.938zM13.704,19.47l-2.338,2.336l-6.43-6.431l6.429-6.432l2.339,2.341l-4.091,4.091L13.704,19.47zM20.775,21.803l-2.337-2.339l4.092-4.09l-4.092-4.092l2.337-2.339l6.43,6.426L20.775,21.803z",
                "raph_talkq": "M16,4.938c-7.732,0-14,4.701-14,10.5c0,1.981,0.741,3.833,2.016,5.414L2,25.272l5.613-1.44c2.339,1.316,5.237,2.106,8.387,2.106c7.732,0,14-4.701,14-10.5S23.732,4.938,16,4.938zM16.868,21.375h-1.969v-1.889h1.969V21.375zM16.772,18.094h-1.777l-0.176-8.083h2.113L16.772,18.094z",
                "raph_talke": "M16,4.938c-7.732,0-14,4.701-14,10.5c0,1.981,0.741,3.833,2.016,5.414L2,25.272l5.613-1.44c2.339,1.316,5.237,2.106,8.387,2.106c7.732,0,14-4.701,14-10.5S23.732,4.938,16,4.938zM16.982,21.375h-1.969v-1.889h1.969V21.375zM16.982,17.469v0.625h-1.969v-0.769c0-2.321,2.641-2.689,2.641-4.337c0-0.752-0.672-1.329-1.553-1.329c-0.912,0-1.713,0.672-1.713,0.672l-1.12-1.393c0,0,1.104-1.153,3.009-1.153c1.81,0,3.49,1.121,3.49,3.009C19.768,15.437,16.982,15.741,16.982,17.469z",
                "raph_home": "M27.812,16l-3.062-3.062V5.625h-2.625v4.688L16,4.188L4.188,16L7,15.933v11.942h17.875V16H27.812zM16,26.167h-5.833v-7H16V26.167zM21.667,23.167h-3.833v-4.042h3.833V23.167z",
                "raph_linkedin": "M27.25,3.125h-22c-1.104,0-2,0.896-2,2v22c0,1.104,0.896,2,2,2h22c1.104,0,2-0.896,2-2v-22C29.25,4.021,28.354,3.125,27.25,3.125zM11.219,26.781h-4v-14h4V26.781zM9.219,11.281c-1.383,0-2.5-1.119-2.5-2.5s1.117-2.5,2.5-2.5s2.5,1.119,2.5,2.5S10.602,11.281,9.219,11.281zM25.219,26.781h-4v-8.5c0-0.4-0.403-1.055-0.687-1.213c-0.375-0.211-1.261-0.229-1.665-0.034l-1.648,0.793v8.954h-4v-14h4v0.614c1.583-0.723,3.78-0.652,5.27,0.184c1.582,0.886,2.73,2.864,2.73,4.702V26.781z",
                "raph_github": "M28.436,15.099c-1.201-0.202-2.451-0.335-3.466-0.371l-0.179-0.006c0.041-0.09,0.072-0.151,0.082-0.16c0.022-0.018,0.04-0.094,0.042-0.168c0-0.041,0.018-0.174,0.046-0.35c0.275,0.01,0.64,0.018,1.038,0.021c1.537,0.012,3.145,0.136,4.248,0.331c0.657,0.116,0.874,0.112,0.389-0.006c-0.491-0.119-1.947-0.294-3.107-0.37c-0.779-0.053-1.896-0.073-2.554-0.062c0.019-0.114,0.041-0.241,0.064-0.371c0.093-0.503,0.124-1.009,0.126-2.016c0.002-1.562-0.082-1.992-0.591-3.025c-0.207-0.422-0.441-0.78-0.724-1.104c0.247-0.729,0.241-1.858-0.015-2.848c-0.211-0.812-0.285-0.864-1.021-0.708C22.19,4.019,21.69,4.2,21.049,4.523c-0.303,0.153-0.721,0.391-1.024,0.578c-0.79-0.278-1.607-0.462-2.479-0.561c-0.884-0.1-3.051-0.044-3.82,0.098c-0.752,0.139-1.429,0.309-2.042,0.511c-0.306-0.189-0.75-0.444-1.067-0.604C9.973,4.221,9.473,4.041,8.847,3.908c-0.734-0.157-0.81-0.104-1.02,0.708c-0.26,1.003-0.262,2.151-0.005,2.878C7.852,7.577,7.87,7.636,7.877,7.682c-1.042,1.312-1.382,2.78-1.156,4.829c0.059,0.534,0.15,1.024,0.277,1.473c-0.665-0.004-1.611,0.02-2.294,0.064c-1.162,0.077-2.618,0.25-3.109,0.369c-0.484,0.118-0.269,0.122,0.389,0.007c1.103-0.194,2.712-0.32,4.248-0.331c0.29-0.001,0.561-0.007,0.794-0.013c0.07,0.237,0.15,0.463,0.241,0.678L7.26,14.759c-1.015,0.035-2.264,0.168-3.465,0.37c-0.901,0.151-2.231,0.453-2.386,0.54c-0.163,0.091-0.03,0.071,0.668-0.106c1.273-0.322,2.928-0.569,4.978-0.741l0.229-0.02c0.44,1.022,1.118,1.802,2.076,2.41c0.586,0.373,1.525,0.756,1.998,0.816c0.13,0.016,0.508,0.094,0.84,0.172c0.333,0.078,0.984,0.195,1.446,0.262h0.011c-0.009,0.006-0.017,0.01-0.025,0.016c-0.56,0.291-0.924,0.744-1.169,1.457c-0.11,0.033-0.247,0.078-0.395,0.129c-0.529,0.18-0.735,0.217-1.271,0.221c-0.556,0.004-0.688-0.02-1.02-0.176c-0.483-0.225-0.933-0.639-1.233-1.133c-0.501-0.826-1.367-1.41-2.089-1.41c-0.617,0-0.734,0.25-0.288,0.615c0.672,0.549,1.174,1.109,1.38,1.537c0.116,0.24,0.294,0.611,0.397,0.824c0.109,0.227,0.342,0.535,0.564,0.748c0.522,0.498,1.026,0.736,1.778,0.848c0.504,0.074,0.628,0.074,1.223-0.002c0.287-0.035,0.529-0.076,0.746-0.127c0,0.244,0,0.525,0,0.855c0,1.766-0.021,2.334-0.091,2.5c-0.132,0.316-0.428,0.641-0.716,0.787c-0.287,0.146-0.376,0.307-0.255,0.455c0.067,0.08,0.196,0.094,0.629,0.066c0.822-0.051,1.403-0.355,1.699-0.891c0.095-0.172,0.117-0.518,0.147-2.318c0.032-1.953,0.046-2.141,0.173-2.42c0.077-0.166,0.188-0.346,0.25-0.395c0.104-0.086,0.111,0.084,0.111,2.42c-0.001,2.578-0.027,2.889-0.285,3.385c-0.058,0.113-0.168,0.26-0.245,0.33c-0.135,0.123-0.192,0.438-0.098,0.533c0.155,0.154,0.932-0.088,1.356-0.422c0.722-0.572,0.808-1.045,0.814-4.461l0.003-2.004l0.219,0.021l0.219,0.02l0.036,2.621c0.041,2.951,0.047,2.994,0.549,3.564c0.285,0.322,0.572,0.5,1.039,0.639c0.625,0.188,0.813-0.102,0.393-0.605c-0.457-0.547-0.479-0.756-0.454-3.994c0.017-2.076,0.017-2.076,0.151-1.955c0.282,0.256,0.336,0.676,0.336,2.623c0,2.418,0.069,2.648,0.923,3.07c0.399,0.195,0.511,0.219,1.022,0.221c0.544,0.002,0.577-0.006,0.597-0.148c0.017-0.115-0.05-0.193-0.304-0.348c-0.333-0.205-0.564-0.467-0.709-0.797c-0.055-0.127-0.092-0.959-0.117-2.672c-0.036-2.393-0.044-2.502-0.193-2.877c-0.201-0.504-0.508-0.902-0.897-1.166c-0.101-0.066-0.202-0.121-0.333-0.162c0.161-0.016,0.317-0.033,0.468-0.055c1.572-0.209,2.403-0.383,3.07-0.641c1.411-0.543,2.365-1.445,2.882-2.724c0.046-0.114,0.092-0.222,0.131-0.309l0.398,0.033c2.051,0.173,3.706,0.42,4.979,0.743c0.698,0.177,0.831,0.198,0.668,0.105C30.666,15.551,29.336,15.25,28.436,15.099zM22.422,15.068c-0.233,0.512-0.883,1.17-1.408,1.428c-0.518,0.256-1.33,0.451-2.25,0.544c-0.629,0.064-4.137,0.083-4.716,0.026c-1.917-0.188-2.991-0.557-3.783-1.296c-0.75-0.702-1.1-1.655-1.039-2.828c0.039-0.734,0.216-1.195,0.679-1.755c0.421-0.51,0.864-0.825,1.386-0.985c0.437-0.134,1.778-0.146,3.581-0.03c0.797,0.051,1.456,0.051,2.252,0c1.886-0.119,3.145-0.106,3.61,0.038c0.731,0.226,1.397,0.834,1.797,1.644c0.18,0.362,0.215,0.516,0.241,1.075C22.808,13.699,22.675,14.517,22.422,15.068zM12.912,11.762c-1.073-0.188-1.686,1.649-0.863,2.587c0.391,0.445,0.738,0.518,1.172,0.248c0.402-0.251,0.62-0.72,0.62-1.328C13.841,12.458,13.472,11.862,12.912,11.762zM19.425,11.872c-1.073-0.188-1.687,1.647-0.864,2.586c0.392,0.445,0.738,0.519,1.173,0.247c0.401-0.25,0.62-0.72,0.62-1.328C20.354,12.569,19.985,11.971,19.425,11.872zM16.539,15.484c-0.023,0.074-0.135,0.184-0.248,0.243c-0.286,0.147-0.492,0.096-0.794-0.179c-0.187-0.169-0.272-0.258-0.329-0.081c-0.053,0.164,0.28,0.493,0.537,0.594c0.236,0.094,0.405,0.097,0.661-0.01c0.254-0.106,0.476-0.391,0.476-0.576C16.842,15.303,16.595,15.311,16.539,15.484zM16.222,14.909c0.163-0.144,0.2-0.44,0.044-0.597s-0.473-0.133-0.597,0.043c-0.144,0.206-0.067,0.363,0.036,0.53C15.865,15.009,16.08,15.034,16.222,14.909z",
                "raph_flickr": "M21.77,8.895c-2.379,0-4.479,1.174-5.77,2.969c-1.289-1.795-3.39-2.969-5.77-2.969c-3.924,0-7.105,3.181-7.105,7.105c0,3.924,3.181,7.105,7.105,7.105c2.379,0,4.48-1.175,5.77-2.97c1.29,1.795,3.391,2.97,5.77,2.97c3.925,0,7.105-3.182,7.105-7.105C28.875,12.075,25.694,8.895,21.77,8.895zM21.769,21.822c-3.211,0-5.821-2.61-5.821-5.821c0-3.213,2.61-5.824,5.821-5.824c3.213,0,5.824,2.611,5.824,5.824C27.593,19.212,24.981,21.822,21.769,21.822z",
                "raph_lock": "M22.335,12.833V9.999h-0.001C22.333,6.501,19.498,3.666,16,3.666S9.666,6.502,9.666,10h0v2.833H7.375V25h17.25V12.833H22.335zM11.667,10C11.667,10,11.667,10,11.667,10c0-2.39,1.944-4.334,4.333-4.334c2.391,0,4.335,1.944,4.335,4.333c0,0,0,0,0,0v2.834h-8.668V10z",
                "raph_clip": "M23.898,6.135c-1.571-1.125-3.758-0.764-4.884,0.808l-8.832,12.331c-0.804,1.122-0.546,2.684,0.577,3.488c1.123,0.803,2.684,0.545,3.488-0.578l6.236-8.706l-0.813-0.583l-6.235,8.707h0c-0.483,0.672-1.42,0.828-2.092,0.347c-0.673-0.481-0.827-1.419-0.345-2.093h0l8.831-12.33l0.001-0.001l-0.002-0.001c0.803-1.119,2.369-1.378,3.489-0.576c1.12,0.803,1.379,2.369,0.577,3.489v-0.001l-9.68,13.516l0.001,0.001c-1.124,1.569-3.316,1.931-4.885,0.808c-1.569-1.125-1.93-3.315-0.807-4.885l7.035-9.822l-0.813-0.582l-7.035,9.822c-1.447,2.02-0.982,4.83,1.039,6.277c2.021,1.448,4.831,0.982,6.278-1.037l9.68-13.516C25.83,9.447,25.47,7.261,23.898,6.135z",
                "raph_star": "M15.999,22.77l-8.884,6.454l3.396-10.44l-8.882-6.454l10.979,0.002l2.918-8.977l0.476-1.458l3.39,10.433h10.982l-8.886,6.454l3.397,10.443L15.999,22.77L15.999,22.77z",
                "raph_star2": "M30.373,12.329H19.391l-3.39-10.433l-0.476,1.458l-2.918,8.977L1.628,12.329l8.882,6.454l-3.396,10.44l8.884-6.454l8.886,6.457l-3.397-10.443L30.373,12.329z M17.175,21.151L16,20.298l-1.175,0.854l-3.902,2.834l1.49-4.584l0.45-1.382l-1.177-0.855l-3.9-2.834h6.275l0.45-1.381L16,8.366l1.489,4.581l0.449,1.381h6.281l-3.906,2.836l-1.178,0.854l0.449,1.384l1.493,4.584L17.175,21.151z",
                "raph_plus": "M25.979,12.896 19.312,12.896 19.312,6.229 12.647,6.229 12.647,12.896 5.979,12.896 5.979,19.562 12.647,19.562 12.647,26.229 19.312,26.229 19.312,19.562 25.979,19.562",
                "raph_chat": "M15.985,5.972c-7.563,0-13.695,4.077-13.695,9.106c0,2.877,2.013,5.44,5.147,7.108c-0.446,1.479-1.336,3.117-3.056,4.566c0,0,4.015-0.266,6.851-3.143c0.163,0.04,0.332,0.07,0.497,0.107c-0.155-0.462-0.246-0.943-0.246-1.443c0-3.393,3.776-6.05,8.599-6.05c3.464,0,6.379,1.376,7.751,3.406c1.168-1.34,1.847-2.892,1.847-4.552C29.68,10.049,23.548,5.972,15.985,5.972zM27.68,22.274c0-2.79-3.401-5.053-7.599-5.053c-4.196,0-7.599,2.263-7.599,5.053c0,2.791,3.403,5.053,7.599,5.053c0.929,0,1.814-0.116,2.637-0.319c1.573,1.597,3.801,1.744,3.801,1.744c-0.954-0.804-1.447-1.713-1.695-2.534C26.562,25.293,27.68,23.871,27.68,22.274z",
                "raph_quote": "M14.505,5.873c-3.937,2.52-5.904,5.556-5.904,9.108c0,1.104,0.192,1.656,0.576,1.656l0.396-0.107c0.312-0.12,0.563-0.18,0.756-0.18c1.128,0,2.07,0.411,2.826,1.229c0.756,0.82,1.134,1.832,1.134,3.037c0,1.157-0.408,2.14-1.224,2.947c-0.816,0.807-1.801,1.211-2.952,1.211c-1.608,0-2.935-0.661-3.979-1.984c-1.044-1.321-1.565-2.98-1.565-4.977c0-2.259,0.443-4.327,1.332-6.203c0.888-1.875,2.243-3.57,4.067-5.085c1.824-1.514,2.988-2.272,3.492-2.272c0.336,0,0.612,0.162,0.828,0.486c0.216,0.324,0.324,0.606,0.324,0.846L14.505,5.873zM27.465,5.873c-3.937,2.52-5.904,5.556-5.904,9.108c0,1.104,0.192,1.656,0.576,1.656l0.396-0.107c0.312-0.12,0.563-0.18,0.756-0.18c1.104,0,2.04,0.411,2.808,1.229c0.769,0.82,1.152,1.832,1.152,3.037c0,1.157-0.408,2.14-1.224,2.947c-0.816,0.807-1.801,1.211-2.952,1.211c-1.608,0-2.935-0.661-3.979-1.984c-1.044-1.321-1.565-2.98-1.565-4.977c0-2.284,0.449-4.369,1.35-6.256c0.9-1.887,2.256-3.577,4.068-5.067c1.812-1.49,2.97-2.236,3.474-2.236c0.336,0,0.612,0.162,0.828,0.486c0.216,0.324,0.324,0.606,0.324,0.846L27.465,5.873z",
                "raph_slideshare": "M28.952,12.795c-0.956,1.062-5.073,2.409-5.604,2.409h-4.513c-0.749,0-1.877,0.147-2.408,0.484c0.061,0.054,0.122,0.108,0.181,0.163c0.408,0.379,1.362,0.913,2.206,0.913c0.397,0,0.723-0.115,1-0.354c1.178-1.007,1.79-1.125,2.145-1.125c0.421,0,0.783,0.193,0.996,0.531c0.4,0.626,0.106,1.445-0.194,2.087c-0.718,1.524-3.058,3.171-5.595,3.171c-0.002,0-0.002,0-0.004,0c-0.354,0-0.701-0.033-1.033-0.099v3.251c0,0.742,1.033,2.533,4.167,2.533s3.955-3.701,3.955-4.338v-4.512c2.23-1.169,4.512-1.805,5.604-3.895C30.882,12.05,29.907,11.733,28.952,12.795zM21.942,17.521c0.796-1.699-0.053-1.699-1.54-0.425s-3.665,0.105-4.408-0.585c-0.743-0.689-1.486-1.22-2.814-1.167c-1.328,0.053-4.46-0.161-6.267-0.585c-1.805-0.425-4.895-3-5.15-2.335c-0.266,0.69,0.211,1.168,1.168,2.335c0.955,1.169,5.075,2.778,5.075,2.778s0,3.453,0,4.886c0,1.435,2.973,3.61,4.512,3.61s2.708-1.062,2.708-1.806v-4.512C17.775,21.045,21.146,19.221,21.942,17.521zM20.342,13.73c1.744,0,3.159-1.414,3.159-3.158c0-1.745-1.415-3.159-3.159-3.159s-3.158,1.414-3.158,3.159C17.184,12.316,18.598,13.73,20.342,13.73zM12.019,13.73c1.744,0,3.158-1.414,3.158-3.158c0-1.745-1.414-3.159-3.158-3.159c-1.745,0-3.159,1.414-3.159,3.159C8.86,12.316,10.273,13.73,12.019,13.73z"
            	}
            }
          • raphael_2.json
            {"size": 32,
            "fill": true,
            "data": {
                "raph_twitter": "M23.295,22.567h-7.213c-2.125,0-4.103-2.215-4.103-4.736v-1.829h11.232c1.817,0,3.291-1.469,3.291-3.281c0-1.813-1.474-3.282-3.291-3.282H11.979V6.198c0-1.835-1.375-3.323-3.192-3.323c-1.816,0-3.29,1.488-3.29,3.323v11.633c0,6.23,4.685,11.274,10.476,11.274h7.211c1.818,0,3.318-1.463,3.318-3.298S25.112,22.567,23.295,22.567z",
                "raph_gear2": "M17.047,27.945c-0.34,0.032-0.688,0.054-1.046,0.054l0,0c-0.32,0-0.631-0.017-0.934-0.043l0,0l-2.626,3.375l-0.646-0.183c-0.758-0.213-1.494-0.48-2.202-0.8l0,0L8.979,30.07l0.158-4.24c-0.558-0.39-1.079-0.825-1.561-1.302l0,0L3.424,25.42l-0.379-0.557c-0.445-0.654-0.824-1.339-1.16-2.032l0,0l-0.292-0.605l2.819-3.12c-0.176-0.661-0.293-1.343-0.353-2.038l0,0l-3.736-1.975l0.068-0.669c0.08-0.801,0.235-1.567,0.42-2.303l0,0l0.165-0.653l4.167-0.577c0.297-0.627,0.647-1.221,1.041-1.78l0,0l-1.59-3.914l0.48-0.47c0.564-0.55,1.168-1.048,1.798-1.503l0,0l0.546-0.394l3.597,2.259c0.606-0.279,1.24-0.509,1.897-0.685l0,0l1.304-4.046l0.672-0.051c0.362-0.027,0.751-0.058,1.174-0.058l0,0c0.422,0,0.81,0.031,1.172,0.058l0,0l0.672,0.051l1.318,4.088c0.632,0.176,1.244,0.401,1.831,0.674l0,0l3.647-2.291l0.548,0.394c0.63,0.455,1.235,0.954,1.798,1.501l0,0l0.482,0.47l-1.639,4.031c0.357,0.519,0.679,1.068,0.954,1.646l0,0l4.297,0.595l0.167,0.653c0.188,0.735,0.342,1.501,0.42,2.303l0,0l0.068,0.669l-3.866,2.044c-0.058,0.634-0.161,1.258-0.315,1.866l0,0l2.913,3.218l-0.293,0.608c-0.335,0.695-0.712,1.382-1.159,2.034l0,0l-0.379,0.555l-4.255-0.912c-0.451,0.451-0.939,0.866-1.461,1.241l0,0l0.162,4.323l-0.615,0.278c-0.709,0.319-1.444,0.587-2.202,0.8l0,0l-0.648,0.183L17.047,27.945L17.047,27.945zM20.424,29.028c0.227-0.076,0.45-0.157,0.671-0.244l0,0l-0.152-4.083l0.479-0.307c0.717-0.466,1.37-1.024,1.95-1.658l0,0l0.386-0.423l4.026,0.862c0.121-0.202,0.238-0.409,0.351-0.62l0,0l-2.754-3.045l0.171-0.544c0.243-0.783,0.381-1.623,0.422-2.5l0,0l0.025-0.571l3.658-1.933c-0.038-0.234-0.082-0.467-0.132-0.7l0,0l-4.07-0.563l-0.219-0.527c-0.327-0.787-0.76-1.524-1.277-2.204l0,0l-0.342-0.453l1.548-3.808c-0.179-0.157-0.363-0.31-0.552-0.458l0,0l-3.455,2.169L20.649,7.15c-0.754-0.397-1.569-0.698-2.429-0.894l0,0l-0.556-0.127l-1.248-3.87c-0.121-0.006-0.239-0.009-0.354-0.009l0,0c-0.117,0-0.235,0.003-0.357,0.009l0,0l-1.239,3.845l-0.564,0.12c-0.875,0.188-1.709,0.494-2.486,0.896l0,0l-0.508,0.264L7.509,5.249c-0.188,0.148-0.372,0.301-0.55,0.458l0,0l1.507,3.708L8.112,9.869c-0.552,0.709-1.011,1.485-1.355,2.319l0,0l-0.218,0.529l-3.939,0.545c-0.05,0.233-0.094,0.466-0.131,0.7l0,0l3.531,1.867l0.022,0.575c0.037,0.929,0.192,1.82,0.459,2.653l0,0l0.175,0.548l-2.667,2.95c0.112,0.212,0.229,0.419,0.351,0.621l0,0l3.916-0.843l0.39,0.423c0.601,0.657,1.287,1.229,2.043,1.703l0,0l0.488,0.305l-0.149,4.02c0.221,0.087,0.445,0.168,0.672,0.244l0,0l2.479-3.188l0.566,0.07c0.427,0.054,0.843,0.089,1.257,0.089l0,0c0.445,0,0.894-0.039,1.353-0.104l0,0l0.571-0.08L20.424,29.028L20.424,29.028zM21.554,20.75l0.546,0.839l-3.463,2.253l-1.229-1.891l0,0c-0.447,0.109-0.917,0.173-1.406,0.173l0,0c-3.384,0-6.126-2.743-6.126-6.123l0,0c0-3.384,2.742-6.126,6.126-6.126l0,0c3.38,0,6.123,2.742,6.123,6.126l0,0c0,1.389-0.467,2.676-1.25,3.704l0,0L21.554,20.75M19.224,21.073l0.108-0.069l-0.987-1.519l0.572-0.572c0.748-0.75,1.207-1.773,1.207-2.912l0,0c-0.004-2.278-1.848-4.122-4.123-4.126l0,0c-2.28,0.004-4.122,1.846-4.126,4.126l0,0c0.004,2.275,1.848,4.119,4.126,4.123l0,0c0.509,0,0.999-0.104,1.473-0.286l0,0l0.756-0.29L19.224,21.073L19.224,21.073z",
                "raph_gear": "M26.974,16.514l3.765-1.991c-0.074-0.738-0.217-1.454-0.396-2.157l-4.182-0.579c-0.362-0.872-0.84-1.681-1.402-2.423l1.594-3.921c-0.524-0.511-1.09-0.977-1.686-1.406l-3.551,2.229c-0.833-0.438-1.73-0.77-2.672-0.984l-1.283-3.976c-0.364-0.027-0.728-0.056-1.099-0.056s-0.734,0.028-1.099,0.056l-1.271,3.941c-0.967,0.207-1.884,0.543-2.738,0.986L7.458,4.037C6.863,4.466,6.297,4.932,5.773,5.443l1.55,3.812c-0.604,0.775-1.11,1.629-1.49,2.55l-4.05,0.56c-0.178,0.703-0.322,1.418-0.395,2.157l3.635,1.923c0.041,1.013,0.209,1.994,0.506,2.918l-2.742,3.032c0.319,0.661,0.674,1.303,1.085,1.905l4.037-0.867c0.662,0.72,1.416,1.351,2.248,1.873l-0.153,4.131c0.663,0.299,1.352,0.549,2.062,0.749l2.554-3.283C15.073,26.961,15.532,27,16,27c0.507,0,1.003-0.046,1.491-0.113l2.567,3.301c0.711-0.2,1.399-0.45,2.062-0.749l-0.156-4.205c0.793-0.513,1.512-1.127,2.146-1.821l4.142,0.889c0.411-0.602,0.766-1.243,1.085-1.905l-2.831-3.131C26.778,18.391,26.93,17.467,26.974,16.514zM20.717,21.297l-1.785,1.162l-1.098-1.687c-0.571,0.22-1.186,0.353-1.834,0.353c-2.831,0-5.125-2.295-5.125-5.125c0-2.831,2.294-5.125,5.125-5.125c2.83,0,5.125,2.294,5.125,5.125c0,1.414-0.573,2.693-1.499,3.621L20.717,21.297z",
                "raph_wrench": "M26.834,14.693c1.816-2.088,2.181-4.938,1.193-7.334l-3.646,4.252l-3.594-0.699L19.596,7.45l3.637-4.242c-2.502-0.63-5.258,0.13-7.066,2.21c-1.907,2.193-2.219,5.229-1.039,7.693L5.624,24.04c-1.011,1.162-0.888,2.924,0.274,3.935c1.162,1.01,2.924,0.888,3.935-0.274l9.493-10.918C21.939,17.625,24.918,16.896,26.834,14.693z",
                "raph_magic": "M23.043,4.649l-0.404-2.312l-1.59,1.727l-2.323-0.33l1.151,2.045l-1.032,2.108l2.302-0.463l1.686,1.633l0.271-2.332l2.074-1.099L23.043,4.649zM26.217,18.198l-0.182-1.25l-0.882,0.905l-1.245-0.214l0.588,1.118l-0.588,1.118l1.245-0.214l0.882,0.905l0.182-1.25l1.133-0.56L26.217,18.198zM4.92,7.672L5.868,7.3l0.844,0.569L6.65,6.853l0.802-0.627L6.467,5.97L6.118,5.013L5.571,5.872L4.553,5.908l0.647,0.786L4.92,7.672zM10.439,10.505l1.021-1.096l1.481,0.219l-0.727-1.31l0.667-1.341l-1.47,0.287l-1.069-1.048L10.16,7.703L8.832,8.396l1.358,0.632L10.439,10.505zM17.234,12.721c-0.588-0.368-1.172-0.618-1.692-0.729c-0.492-0.089-1.039-0.149-1.425,0.374L2.562,30.788h6.68l9.669-15.416c0.303-0.576,0.012-1.041-0.283-1.447C18.303,13.508,17.822,13.09,17.234,12.721zM13.613,21.936c-0.254-0.396-0.74-0.857-1.373-1.254c-0.632-0.396-1.258-0.634-1.726-0.69l4.421-7.052c0.064-0.013,0.262-0.021,0.543,0.066c0.346,0.092,0.785,0.285,1.225,0.562c0.504,0.313,0.908,0.677,1.133,0.97c0.113,0.145,0.178,0.271,0.195,0.335c0.002,0.006,0.004,0.011,0.004,0.015L13.613,21.936z",
                "raph_download": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM16,28.792c-1.549,0-2.806-1.256-2.806-2.806s1.256-2.806,2.806-2.806c1.55,0,2.806,1.256,2.806,2.806S17.55,28.792,16,28.792zM16,21.087l-7.858-6.562h3.469V5.747h8.779v8.778h3.468L16,21.087z",
                "raph_firefox": "M28.4,22.469c0.479-0.964,0.851-1.991,1.095-3.066c0.953-3.661,0.666-6.854,0.666-6.854l-0.327,2.104c0,0-0.469-3.896-1.044-5.353c-0.881-2.231-1.273-2.214-1.274-2.21c0.542,1.379,0.494,2.169,0.483,2.288c-0.01-0.016-0.019-0.032-0.027-0.047c-0.131-0.324-0.797-1.819-2.225-2.878c-2.502-2.481-5.943-4.014-9.745-4.015c-4.056,0-7.705,1.745-10.238,4.525C5.444,6.5,5.183,5.938,5.159,5.317c0,0-0.002,0.002-0.006,0.005c0-0.011-0.003-0.021-0.003-0.031c0,0-1.61,1.247-1.436,4.612c-0.299,0.574-0.56,1.172-0.777,1.791c-0.375,0.817-0.75,2.004-1.059,3.746c0,0,0.133-0.422,0.399-0.988c-0.064,0.482-0.103,0.971-0.116,1.467c-0.09,0.845-0.118,1.865-0.039,3.088c0,0,0.032-0.406,0.136-1.021c0.834,6.854,6.667,12.165,13.743,12.165l0,0c1.86,0,3.636-0.37,5.256-1.036C24.938,27.771,27.116,25.196,28.4,22.469zM16.002,3.356c2.446,0,4.73,0.68,6.68,1.86c-2.274-0.528-3.433-0.261-3.423-0.248c0.013,0.015,3.384,0.589,3.981,1.411c0,0-1.431,0-2.856,0.41c-0.065,0.019,5.242,0.663,6.327,5.966c0,0-0.582-1.213-1.301-1.42c0.473,1.439,0.351,4.17-0.1,5.528c-0.058,0.174-0.118-0.755-1.004-1.155c0.284,2.037-0.018,5.268-1.432,6.158c-0.109,0.07,0.887-3.189,0.201-1.93c-4.093,6.276-8.959,2.539-10.934,1.208c1.585,0.388,3.267,0.108,4.242-0.559c0.982-0.672,1.564-1.162,2.087-1.047c0.522,0.117,0.87-0.407,0.464-0.872c-0.405-0.466-1.392-1.105-2.725-0.757c-0.94,0.247-2.107,1.287-3.886,0.233c-1.518-0.899-1.507-1.63-1.507-2.095c0-0.366,0.257-0.88,0.734-1.028c0.58,0.062,1.044,0.214,1.537,0.466c0.005-0.135,0.006-0.315-0.001-0.519c0.039-0.077,0.015-0.311-0.047-0.596c-0.036-0.287-0.097-0.582-0.19-0.851c0.01-0.002,0.017-0.007,0.021-0.021c0.076-0.344,2.147-1.544,2.299-1.659c0.153-0.114,0.55-0.378,0.506-1.183c-0.015-0.265-0.058-0.294-2.232-0.286c-0.917,0.003-1.425-0.894-1.589-1.245c0.222-1.231,0.863-2.11,1.919-2.704c0.02-0.011,0.015-0.021-0.008-0.027c0.219-0.127-2.524-0.006-3.76,1.604C9.674,8.045,9.219,7.95,8.71,7.95c-0.638,0-1.139,0.07-1.603,0.187c-0.05,0.013-0.122,0.011-0.208-0.001C6.769,8.04,6.575,7.88,6.365,7.672c0.161-0.18,0.324-0.356,0.495-0.526C9.201,4.804,12.43,3.357,16.002,3.356z",
                "raph_ie": "M27.998,2.266c-2.12-1.91-6.925,0.382-9.575,1.93c-0.76-0.12-1.557-0.185-2.388-0.185c-3.349,0-6.052,0.985-8.106,2.843c-2.336,2.139-3.631,4.94-3.631,8.177c0,0.028,0.001,0.056,0.001,0.084c3.287-5.15,8.342-7.79,9.682-8.487c0.212-0.099,0.338,0.155,0.141,0.253c-0.015,0.042-0.015,0,0,0c-2.254,1.35-6.434,5.259-9.146,10.886l-0.003-0.007c-1.717,3.547-3.167,8.529-0.267,10.358c2.197,1.382,6.13-0.248,9.295-2.318c0.764,0.108,1.567,0.165,2.415,0.165c5.84,0,9.937-3.223,11.399-7.924l-8.022-0.014c-0.337,1.661-1.464,2.548-3.223,2.548c-2.21,0-3.729-1.211-3.828-4.012l15.228-0.014c0.028-0.578-0.042-0.985-0.042-1.436c0-5.251-3.143-9.355-8.255-10.663c2.081-1.294,5.974-3.209,7.848-1.681c1.407,1.14,0.633,3.533,0.295,4.518c-0.056,0.254,0.24,0.296,0.296,0.057C28.814,5.573,29.026,3.194,27.998,2.266zM13.272,25.676c-2.469,1.475-5.873,2.539-7.539,1.289c-1.243-0.935-0.696-3.468,0.398-5.938c0.664,0.992,1.495,1.886,2.473,2.63C9.926,24.651,11.479,25.324,13.272,25.676zM12.714,13.046c0.042-2.435,1.787-3.49,3.617-3.49c1.928,0,3.49,1.112,3.49,3.49H12.714z",
                "raph_opera": "M15.954,2.046c-7.489,0-12.872,5.432-12.872,13.581c0,7.25,5.234,13.835,12.873,13.835c7.712,0,12.974-6.583,12.974-13.835C28.929,7.413,23.375,2.046,15.954,2.046zM15.952,26.548L15.952,26.548c-2.289,0-3.49-1.611-4.121-3.796c-0.284-1.037-0.458-2.185-0.563-3.341c-0.114-1.374-0.129-2.773-0.129-4.028c0-0.993,0.018-1.979,0.074-2.926c0.124-1.728,0.386-3.431,0.89-4.833c0.694-1.718,1.871-2.822,3.849-2.822c2.5,0,3.763,1.782,4.385,4.322c0.429,1.894,0.56,4.124,0.56,6.274c0,2.299-0.103,5.153-0.763,7.442C19.473,24.979,18.242,26.548,15.952,26.548z",
                "raph_chrome": "M16.277,8.655c-2.879,0-5.227,2.181-5.227,4.854s2.348,4.854,5.227,4.854c2.879,0,5.227-2.181,5.227-4.854S19.156,8.655,16.277,8.655zM29.535,13.486c-0.369-1.819-1.068-3.052-1.727-3.995c0.05,0.129,0.09,0.259,0.138,0.388c-2.34-6.355-11.704-9.8-18.937-5.43c-0.056,0.27-0.073,0.538-0.073,0.804c0-0.051-0.006-0.098-0.004-0.15c-1.743-0.134-3.854,2.061-5.731,6.083c-0.953,2.277-1.298,4.77-0.414,7.693c0.516,1.706,1.328,3.456,2.499,4.814c3.471,4.027,8.788,5.67,11.884,4.835c0.004,0.001,0.009,0.003,0.014,0.004c5.969-0.125,10.494-4.228,12.125-9.569C29.896,17.035,29.934,15.457,29.535,13.486zM6.043,23.04c-0.96-1.112-1.755-2.651-2.299-4.452c-0.733-2.42-0.612-4.65,0.379-7.015C5.129,9.42,6.111,8.005,6.956,7.154c0.15,0.742,0.521,1.628,1.113,2.649c0.218,0.379,0.459,0.701,0.692,1.012c0.179,0.237,0.356,0.474,0.513,0.729c0.124,0.202,0.239,0.445,0.354,0.737c-0.239,2.754,0.892,5.138,3.148,6.679l-2.546,2.25l-0.202,0.171c-0.208,0.171-0.447,0.373-0.651,0.589c-1.36,1.444-0.25,2.831,0.286,3.498l0.068,0.087c0.237,0.297,0.513,0.62,0.815,0.938C8.963,25.725,7.375,24.585,6.043,23.04zM28.354,18.67c-1.6,5.232-5.937,8.7-11.07,8.859c-2.485-0.583-4.362-1.78-5.586-3.557c0.004-0.004,0.01-0.008,0.015-0.013l4.944-3.836c2.226-0.124,3.854-0.888,4.847-2.278c1.222-1.412,1.792-3.025,1.693-4.861c1.817,0.377,3.389,0.903,4.855,1.883l0.116,0.078l0.134,0.043c0.156,0.049,0.311,0.076,0.459,0.081C28.87,16.309,28.74,17.402,28.354,18.67zM28.609,14.037c-1.951-1.306-4.062-1.867-6.594-2.285c0.531,2.358-0.084,4.072-1.326,5.512c-0.882,1.235-2.382,1.822-4.394,1.875l-5.22,4.052c-0.497,0.409-0.591,0.819-0.282,1.229c0.849,1.277,1.929,2.202,3.122,2.878c-0.013,0-0.026,0.002-0.039,0.003c-0.001-0.001-0.004-0.002-0.006-0.004c-0.02,0.003-0.041,0.004-0.062,0.005c-0.08,0.001-0.16-0.001-0.239-0.01c-0.156-0.021-0.314-0.064-0.459-0.118c-0.898-0.333-1.89-1.352-2.597-2.239c-0.581-0.73-1.206-1.433-0.411-2.275c0.258-0.273,0.582-0.514,0.789-0.698l2.521-2.229c0.172-0.137,0.35-0.277,0.535-0.423c0.053-0.042,0.107-0.084,0.162-0.127c0.564-0.442,0.483-0.32-0.108-0.642c-2.419-1.32-3.677-3.614-3.354-6.389c-0.149-0.41-0.317-0.792-0.518-1.124c-0.363-0.6-0.834-1.102-1.194-1.723c-0.9-1.556-1.847-3.902,0.013-3.682c-0.005-0.053-0.002-0.11-0.005-0.164c0.094,2.001,1.526,3.823,1.742,4.888c0.078,0.382,0.294,0.705,0.612,0.28c2.538-3.395,6.069-3.053,8.328-1.312c0.443,0.34,0.684,0.755,1.084,1.11c0.154,0.138,0.328,0.259,0.535,0.351c0.743,0.332,1.807,0.312,2.607,0.434c1.371,0.208,2.707,0.464,3.971,0.812c0.25,0.03,0.424-0.004,0.521-0.101c0.211-0.208-0.002-0.887-0.121-1.263c0.277,0.805,0.536,1.609,0.773,2.415C29.176,13.701,29.133,14.208,28.609,14.037z",
                "raph_safari": "M16.154,5.135c-0.504,0-1,0.031-1.488,0.089l-0.036-0.18c-0.021-0.104-0.06-0.198-0.112-0.283c0.381-0.308,0.625-0.778,0.625-1.306c0-0.927-0.751-1.678-1.678-1.678s-1.678,0.751-1.678,1.678c0,0.745,0.485,1.376,1.157,1.595c-0.021,0.105-0.021,0.216,0,0.328l0.033,0.167C7.645,6.95,3.712,11.804,3.712,17.578c0,6.871,5.571,12.441,12.442,12.441c6.871,0,12.441-5.57,12.441-12.441C28.596,10.706,23.025,5.135,16.154,5.135zM16.369,8.1c4.455,0,8.183,3.116,9.123,7.287l-0.576,0.234c-0.148-0.681-0.755-1.191-1.48-1.191c-0.837,0-1.516,0.679-1.516,1.516c0,0.075,0.008,0.148,0.018,0.221l-2.771-0.028c-0.054-0.115-0.114-0.226-0.182-0.333l3.399-5.11l0.055-0.083l-4.766,4.059c-0.352-0.157-0.74-0.248-1.148-0.256l0.086-0.018l-1.177-2.585c0.64-0.177,1.111-0.763,1.111-1.459c0-0.837-0.678-1.515-1.516-1.515c-0.075,0-0.147,0.007-0.219,0.018l0.058-0.634C15.357,8.141,15.858,8.1,16.369,8.1zM12.146,3.455c0-0.727,0.591-1.318,1.318-1.318c0.727,0,1.318,0.591,1.318,1.318c0,0.425-0.203,0.802-0.516,1.043c-0.183-0.123-0.413-0.176-0.647-0.13c-0.226,0.045-0.413,0.174-0.535,0.349C12.542,4.553,12.146,4.049,12.146,3.455zM7.017,17.452c0-4.443,3.098-8.163,7.252-9.116l0.297,0.573c-0.61,0.196-1.051,0.768-1.051,1.442c0,0.837,0.678,1.516,1.515,1.516c0.068,0,0.135-0.006,0.2-0.015l-0.058,2.845l0.052-0.011c-0.442,0.204-0.824,0.513-1.116,0.895l0.093-0.147l-1.574-0.603l1.172,1.239l0.026-0.042c-0.19,0.371-0.306,0.788-0.324,1.229l-0.003-0.016l-2.623,1.209c-0.199-0.604-0.767-1.041-1.438-1.041c-0.837,0-1.516,0.678-1.516,1.516c0,0.064,0.005,0.128,0.013,0.191l-0.783-0.076C7.063,18.524,7.017,17.994,7.017,17.452zM16.369,26.805c-4.429,0-8.138-3.078-9.106-7.211l0.691-0.353c0.146,0.686,0.753,1.2,1.482,1.2c0.837,0,1.515-0.679,1.515-1.516c0-0.105-0.011-0.207-0.031-0.307l2.858,0.03c0.045,0.095,0.096,0.187,0.15,0.276l-3.45,5.277l0.227-0.195l4.529-3.92c0.336,0.153,0.705,0.248,1.094,0.266l-0.019,0.004l1.226,2.627c-0.655,0.166-1.142,0.76-1.142,1.468c0,0.837,0.678,1.515,1.516,1.515c0.076,0,0.151-0.007,0.225-0.018l0.004,0.688C17.566,26.746,16.975,26.805,16.369,26.805zM18.662,26.521l-0.389-0.6c0.661-0.164,1.152-0.759,1.152-1.47c0-0.837-0.68-1.516-1.516-1.516c-0.066,0-0.13,0.005-0.193,0.014v-2.86l-0.025,0.004c0.409-0.185,0.77-0.459,1.055-0.798l1.516,0.659l-1.104-1.304c0.158-0.335,0.256-0.704,0.278-1.095l2.552-1.164c0.19,0.618,0.766,1.068,1.447,1.068c0.838,0,1.516-0.679,1.516-1.516c0-0.069-0.006-0.137-0.016-0.204l0.65,0.12c0.089,0.517,0.136,1.049,0.136,1.591C25.722,21.826,22.719,25.499,18.662,26.521z",
                "raph_view": "M16,8.286C8.454,8.286,2.5,16,2.5,16s5.954,7.715,13.5,7.715c5.771,0,13.5-7.715,13.5-7.715S21.771,8.286,16,8.286zM16,20.807c-2.649,0-4.807-2.157-4.807-4.807s2.158-4.807,4.807-4.807s4.807,2.158,4.807,4.807S18.649,20.807,16,20.807zM16,13.194c-1.549,0-2.806,1.256-2.806,2.806c0,1.55,1.256,2.806,2.806,2.806c1.55,0,2.806-1.256,2.806-2.806C18.806,14.451,17.55,13.194,16,13.194z",
                "raph_noview": "M11.478,17.568c-0.172-0.494-0.285-1.017-0.285-1.568c0-2.65,2.158-4.807,4.807-4.807c0.552,0,1.074,0.113,1.568,0.285l2.283-2.283C18.541,8.647,17.227,8.286,16,8.286C8.454,8.286,2.5,16,2.5,16s2.167,2.791,5.53,5.017L11.478,17.568zM23.518,11.185l-3.056,3.056c0.217,0.546,0.345,1.138,0.345,1.76c0,2.648-2.158,4.807-4.807,4.807c-0.622,0-1.213-0.128-1.76-0.345l-2.469,2.47c1.327,0.479,2.745,0.783,4.229,0.783c5.771,0,13.5-7.715,13.5-7.715S26.859,13.374,23.518,11.185zM25.542,4.917L4.855,25.604L6.27,27.02L26.956,6.332L25.542,4.917z",
                "raph_cloud": "M24.345,13.904c0.019-0.195,0.03-0.392,0.03-0.591c0-3.452-2.798-6.25-6.25-6.25c-2.679,0-4.958,1.689-5.847,4.059c-0.589-0.646-1.429-1.059-2.372-1.059c-1.778,0-3.219,1.441-3.219,3.219c0,0.21,0.023,0.415,0.062,0.613c-2.372,0.391-4.187,2.436-4.187,4.918c0,2.762,2.239,5,5,5h15.875c2.762,0,5-2.238,5-5C28.438,16.362,26.672,14.332,24.345,13.904z",
                "raph_cloud2": "M7.562,24.812c-3.313,0-6-2.687-6-6l0,0c0.002-2.659,1.734-4.899,4.127-5.684l0,0c0.083-2.26,1.937-4.064,4.216-4.066l0,0c0.73,0,1.415,0.19,2.01,0.517l0,0c1.266-2.105,3.57-3.516,6.208-3.517l0,0c3.947,0.002,7.157,3.155,7.248,7.079l0,0c2.362,0.804,4.062,3.034,4.064,5.671l0,0c0,3.313-2.687,6-6,6l0,0H7.562L7.562,24.812zM24.163,14.887c-0.511-0.095-0.864-0.562-0.815-1.079l0,0c0.017-0.171,0.027-0.336,0.027-0.497l0,0c-0.007-2.899-2.352-5.245-5.251-5.249l0,0c-2.249-0.002-4.162,1.418-4.911,3.41l0,0c-0.122,0.323-0.406,0.564-0.748,0.63l0,0c-0.34,0.066-0.694-0.052-0.927-0.309l0,0c-0.416-0.453-0.986-0.731-1.633-0.731l0,0c-1.225,0.002-2.216,0.993-2.22,2.218l0,0c0,0.136,0.017,0.276,0.045,0.424l0,0c0.049,0.266-0.008,0.54-0.163,0.762l0,0c-0.155,0.223-0.392,0.371-0.657,0.414l0,0c-1.9,0.313-3.352,1.949-3.35,3.931l0,0c0.004,2.209,1.792,3.995,4.001,4.001l0,0h15.874c2.209-0.006,3.994-1.792,3.999-4.001l0,0C27.438,16.854,26.024,15.231,24.163,14.887L24.163,14.887",
                "raph_cloudDown": "M24.345,13.904c0.019-0.195,0.03-0.392,0.03-0.591c0-3.452-2.798-6.25-6.25-6.25c-2.679,0-4.958,1.689-5.847,4.059c-0.589-0.646-1.429-1.059-2.372-1.059c-1.778,0-3.219,1.441-3.219,3.219c0,0.21,0.023,0.415,0.062,0.613c-2.372,0.391-4.187,2.436-4.187,4.918c0,2.762,2.239,5,5,5h3.404l-0.707-0.707c-0.377-0.377-0.585-0.879-0.585-1.413c0-0.533,0.208-1.035,0.585-1.412l0.556-0.557c0.4-0.399,0.937-0.628,1.471-0.628c0.027,0,0.054,0,0.08,0.002v-0.472c0-1.104,0.898-2.002,2-2.002h3.266c1.103,0,2,0.898,2,2.002v0.472c0.027-0.002,0.054-0.002,0.081-0.002c0.533,0,1.07,0.229,1.47,0.63l0.557,0.552c0.78,0.781,0.78,2.05,0,2.828l-0.706,0.707h2.403c2.762,0,5-2.238,5-5C28.438,16.362,26.672,14.332,24.345,13.904z M21.033,20.986l-0.556-0.555c-0.39-0.389-0.964-0.45-1.276-0.137c-0.312,0.312-0.568,0.118-0.568-0.432v-1.238c0-0.55-0.451-1-1-1h-3.265c-0.55,0-1,0.45-1,1v1.238c0,0.55-0.256,0.744-0.569,0.432c-0.312-0.313-0.887-0.252-1.276,0.137l-0.556,0.555c-0.39,0.389-0.39,1.024-0.001,1.413l4.328,4.331c0.194,0.194,0.451,0.291,0.707,0.291s0.512-0.097,0.707-0.291l4.327-4.331C21.424,22.011,21.423,21.375,21.033,20.986z",
                "raph_cloudUp": "M24.345,13.904c0.019-0.195,0.03-0.392,0.03-0.591c0-3.452-2.798-6.25-6.25-6.25c-2.679,0-4.958,1.689-5.847,4.059c-0.589-0.646-1.429-1.059-2.372-1.059c-1.778,0-3.219,1.441-3.219,3.219c0,0.21,0.023,0.415,0.062,0.613c-2.372,0.391-4.187,2.436-4.187,4.918c0,2.762,2.239,5,5,5h2.312c-0.126-0.266-0.2-0.556-0.2-0.859c0-0.535,0.208-1.04,0.587-1.415l4.325-4.329c0.375-0.377,0.877-0.585,1.413-0.585c0.54,0,1.042,0.21,1.417,0.587l4.323,4.329c0.377,0.373,0.585,0.878,0.585,1.413c0,0.304-0.073,0.594-0.2,0.859h1.312c2.762,0,5-2.238,5-5C28.438,16.362,26.672,14.332,24.345,13.904z M16.706,17.916c-0.193-0.195-0.45-0.291-0.706-0.291s-0.512,0.096-0.707,0.291l-4.327,4.33c-0.39,0.389-0.389,1.025,0.001,1.414l0.556,0.555c0.39,0.389,0.964,0.449,1.276,0.137s0.568-0.119,0.568,0.432v1.238c0,0.549,0.451,1,1,1h3.265c0.551,0,1-0.451,1-1v-1.238c0-0.551,0.256-0.744,0.569-0.432c0.312,0.312,0.887,0.252,1.276-0.137l0.556-0.555c0.39-0.389,0.39-1.025,0.001-1.414L16.706,17.916z",
                "raph_location": "M16,3.5c-4.142,0-7.5,3.358-7.5,7.5c0,4.143,7.5,18.121,7.5,18.121S23.5,15.143,23.5,11C23.5,6.858,20.143,3.5,16,3.5z M16,14.584c-1.979,0-3.584-1.604-3.584-3.584S14.021,7.416,16,7.416S19.584,9.021,19.584,11S17.979,14.584,16,14.584z",
                "raph_volume0": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z",
                "raph_volume1": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z M18.806,11.219c-0.393-0.389-1.024-0.389-1.415,0.002c-0.39,0.391-0.39,1.024,0.002,1.416v-0.002c0.863,0.864,1.395,2.049,1.395,3.366c0,1.316-0.531,2.497-1.393,3.361c-0.394,0.389-0.394,1.022-0.002,1.415c0.195,0.195,0.451,0.293,0.707,0.293c0.257,0,0.513-0.098,0.708-0.293c1.222-1.22,1.98-2.915,1.979-4.776C20.788,14.136,20.027,12.439,18.806,11.219z",
                "raph_volume2": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z M18.806,11.219c-0.393-0.389-1.024-0.389-1.415,0.002c-0.39,0.391-0.39,1.024,0.002,1.416v-0.002c0.863,0.864,1.395,2.049,1.395,3.366c0,1.316-0.531,2.497-1.393,3.361c-0.394,0.389-0.394,1.022-0.002,1.415c0.195,0.195,0.451,0.293,0.707,0.293c0.257,0,0.513-0.098,0.708-0.293c1.222-1.22,1.98-2.915,1.979-4.776C20.788,14.136,20.027,12.439,18.806,11.219z M21.101,8.925c-0.393-0.391-1.024-0.391-1.413,0c-0.392,0.391-0.392,1.025,0,1.414c1.45,1.451,2.344,3.447,2.344,5.661c0,2.212-0.894,4.207-2.342,5.659c-0.392,0.39-0.392,1.023,0,1.414c0.195,0.195,0.451,0.293,0.708,0.293c0.256,0,0.512-0.098,0.707-0.293c1.808-1.809,2.929-4.315,2.927-7.073C24.033,13.24,22.912,10.732,21.101,8.925z",
                "raph_volume3": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z M18.806,11.219c-0.393-0.389-1.024-0.389-1.415,0.002c-0.39,0.391-0.39,1.024,0.002,1.416v-0.002c0.863,0.864,1.395,2.049,1.395,3.366c0,1.316-0.531,2.497-1.393,3.361c-0.394,0.389-0.394,1.022-0.002,1.415c0.195,0.195,0.451,0.293,0.707,0.293c0.257,0,0.513-0.098,0.708-0.293c1.222-1.22,1.98-2.915,1.979-4.776C20.788,14.136,20.027,12.439,18.806,11.219z M21.101,8.925c-0.393-0.391-1.024-0.391-1.413,0c-0.392,0.391-0.392,1.025,0,1.414c1.45,1.451,2.344,3.447,2.344,5.661c0,2.212-0.894,4.207-2.342,5.659c-0.392,0.39-0.392,1.023,0,1.414c0.195,0.195,0.451,0.293,0.708,0.293c0.256,0,0.512-0.098,0.707-0.293c1.808-1.809,2.929-4.315,2.927-7.073C24.033,13.24,22.912,10.732,21.101,8.925z M23.28,6.746c-0.393-0.391-1.025-0.389-1.414,0.002c-0.391,0.389-0.391,1.023,0.002,1.413h-0.002c2.009,2.009,3.248,4.773,3.248,7.839c0,3.063-1.239,5.828-3.246,7.838c-0.391,0.39-0.391,1.023,0.002,1.415c0.194,0.194,0.45,0.291,0.706,0.291s0.513-0.098,0.708-0.293c2.363-2.366,3.831-5.643,3.829-9.251C27.115,12.389,25.647,9.111,23.28,6.746z",
                "raph_key": "M18.386,16.009l0.009-0.006l-0.58-0.912c1.654-2.226,1.876-5.319,0.3-7.8c-2.043-3.213-6.303-4.161-9.516-2.118c-3.212,2.042-4.163,6.302-2.12,9.517c1.528,2.402,4.3,3.537,6.944,3.102l0.424,0.669l0.206,0.045l0.779-0.447l-0.305,1.377l2.483,0.552l-0.296,1.325l1.903,0.424l-0.68,3.06l1.406,0.313l-0.424,1.906l4.135,0.918l0.758-3.392L18.386,16.009z M10.996,8.944c-0.685,0.436-1.593,0.233-2.029-0.452C8.532,7.807,8.733,6.898,9.418,6.463s1.594-0.233,2.028,0.452C11.883,7.6,11.68,8.509,10.996,8.944z",
                "raph_ruler": "M6.63,21.796l-5.122,5.121h25.743V1.175L6.63,21.796zM18.702,10.48c0.186-0.183,0.48-0.183,0.664,0l1.16,1.159c0.184,0.183,0.186,0.48,0.002,0.663c-0.092,0.091-0.213,0.137-0.332,0.137c-0.121,0-0.24-0.046-0.33-0.137l-1.164-1.159C18.519,10.96,18.519,10.664,18.702,10.48zM17.101,12.084c0.184-0.183,0.48-0.183,0.662,0l2.156,2.154c0.184,0.183,0.184,0.48,0.002,0.661c-0.092,0.092-0.213,0.139-0.334,0.139s-0.24-0.046-0.33-0.137l-2.156-2.154C16.917,12.564,16.917,12.267,17.101,12.084zM15.497,13.685c0.184-0.183,0.48-0.183,0.664,0l1.16,1.161c0.184,0.183,0.182,0.48-0.002,0.663c-0.092,0.092-0.211,0.138-0.33,0.138c-0.121,0-0.24-0.046-0.332-0.138l-1.16-1.16C15.314,14.166,15.314,13.868,15.497,13.685zM13.896,15.288c0.184-0.183,0.48-0.181,0.664,0.002l1.158,1.159c0.183,0.184,0.183,0.48,0,0.663c-0.092,0.092-0.212,0.138-0.332,0.138c-0.119,0-0.24-0.046-0.332-0.138l-1.158-1.161C13.713,15.767,13.713,15.471,13.896,15.288zM12.293,16.892c0.183-0.184,0.479-0.184,0.663,0l2.154,2.153c0.184,0.184,0.184,0.481,0,0.665c-0.092,0.092-0.211,0.138-0.33,0.138c-0.121,0-0.242-0.046-0.334-0.138l-2.153-2.155C12.11,17.371,12.11,17.075,12.293,16.892zM10.302,24.515c-0.091,0.093-0.212,0.139-0.332,0.139c-0.119,0-0.238-0.045-0.33-0.137l-2.154-2.153c-0.184-0.183-0.184-0.479,0-0.663s0.479-0.184,0.662,0l2.154,2.153C10.485,24.036,10.485,24.332,10.302,24.515zM10.912,21.918c-0.093,0.093-0.214,0.139-0.333,0.139c-0.12,0-0.24-0.045-0.33-0.137l-1.162-1.161c-0.184-0.183-0.184-0.479,0-0.66c0.184-0.185,0.48-0.187,0.664-0.003l1.161,1.162C11.095,21.438,11.095,21.735,10.912,21.918zM12.513,20.316c-0.092,0.092-0.211,0.138-0.332,0.138c-0.119,0-0.239-0.046-0.331-0.138l-1.159-1.16c-0.184-0.184-0.184-0.48,0-0.664s0.48-0.182,0.663,0.002l1.159,1.161C12.696,19.838,12.696,20.135,12.513,20.316zM22.25,21.917h-8.67l8.67-8.67V21.917zM22.13,10.7c-0.09,0.092-0.211,0.138-0.33,0.138c-0.121,0-0.242-0.046-0.334-0.138l-1.16-1.159c-0.184-0.183-0.184-0.479,0-0.663c0.182-0.183,0.479-0.183,0.662,0l1.16,1.159C22.312,10.221,22.313,10.517,22.13,10.7zM24.726,10.092c-0.092,0.092-0.213,0.137-0.332,0.137s-0.24-0.045-0.33-0.137l-2.154-2.154c-0.184-0.183-0.184-0.481,0-0.664s0.482-0.181,0.664,0.002l2.154,2.154C24.911,9.613,24.909,9.91,24.726,10.092z",
                "raph_power": "M21.816,3.999c-0.993-0.481-2.189-0.068-2.673,0.927c-0.482,0.995-0.066,2.191,0.927,2.673c3.115,1.516,5.265,4.705,5.263,8.401c-0.01,5.154-4.18,9.324-9.333,9.333c-5.154-0.01-9.324-4.18-9.334-9.333c-0.002-3.698,2.149-6.89,5.267-8.403c0.995-0.482,1.408-1.678,0.927-2.673c-0.482-0.993-1.676-1.409-2.671-0.927C5.737,6.152,2.667,10.72,2.665,16C2.667,23.364,8.634,29.332,16,29.334c7.365-0.002,13.333-5.97,13.334-13.334C29.332,10.722,26.266,6.157,21.816,3.999z M16,13.833c1.104,0,1.999-0.894,1.999-2V2.499C17.999,1.394,17.104,0.5,16,0.5c-1.106,0-2,0.895-2,1.999v9.333C14,12.938,14.894,13.833,16,13.833z",
                "raph_unlock": "M20.375,12.833h-2.209V10c0,0,0,0,0-0.001c0-2.389,1.945-4.333,4.334-4.333c2.391,0,4.335,1.944,4.335,4.333c0,0,0,0,0,0v2.834h2V9.999h-0.001c-0.001-3.498-2.836-6.333-6.334-6.333S16.166,6.502,16.166,10v2.833H3.125V25h17.25V12.833z",
                "raph_flag": "M26.04,9.508c0.138-0.533,0.15-1.407,0.028-1.943l-0.404-1.771c-0.122-0.536-0.665-1.052-1.207-1.146l-3.723-0.643c-0.542-0.094-1.429-0.091-1.97,0.007l-4.033,0.726c-0.542,0.098-1.429,0.108-1.973,0.023L8.812,4.146C8.817,4.165,8.826,4.182,8.83,4.201l2.701,12.831l1.236,0.214c0.542,0.094,1.428,0.09,1.97-0.007l4.032-0.727c0.541-0.097,1.429-0.107,1.973-0.022l4.329,0.675c0.544,0.085,0.906-0.288,0.807-0.829l-0.485-2.625c-0.1-0.541-0.069-1.419,0.068-1.952L26.04,9.508zM6.667,3.636C6.126,3.75,5.78,4.279,5.894,4.819l5.763,27.378H13.7L7.852,4.409C7.736,3.867,7.207,3.521,6.667,3.636z",
                "raph_tag": "M14.263,2.826H7.904L2.702,8.028v6.359L18.405,30.09l11.561-11.562L14.263,2.826zM6.495,8.859c-0.619-0.619-0.619-1.622,0-2.24C7.114,6,8.117,6,8.736,6.619c0.62,0.62,0.619,1.621,0,2.241C8.117,9.479,7.114,9.479,6.495,8.859z",
                "raph_search": "M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z",
                "raph_zoomout": "M22.646,19.307c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127l3.535-3.537L22.646,19.307zM13.688,20.369c-3.582-0.008-6.478-2.904-6.484-6.484c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486C20.165,17.465,17.267,20.361,13.688,20.369zM8.854,11.884v4.001l9.665-0.001v-3.999L8.854,11.884z",
                "raph_zoomin": "M22.646,19.307c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127l3.535-3.537L22.646,19.307zM13.688,20.369c-3.582-0.008-6.478-2.904-6.484-6.484c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486C20.165,17.465,17.267,20.361,13.688,20.369zM15.687,9.051h-4v2.833H8.854v4.001h2.833v2.833h4v-2.834h2.832v-3.999h-2.833V9.051z",
                "raph_cross": "M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248",
                "raph_check": "M2.379,14.729 5.208,11.899 12.958,19.648 25.877,6.733 28.707,9.561 12.958,25.308",
                "raph_settings": "M16.015,12.03c-2.156,0-3.903,1.747-3.903,3.903c0,2.155,1.747,3.903,3.903,3.903c0.494,0,0.962-0.102,1.397-0.27l0.836,1.285l1.359-0.885l-0.831-1.276c0.705-0.706,1.142-1.681,1.142-2.757C19.918,13.777,18.171,12.03,16.015,12.03zM16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM26.174,20.809c-0.241,0.504-0.513,0.99-0.826,1.45L22.19,21.58c-0.481,0.526-1.029,0.994-1.634,1.385l0.119,3.202c-0.507,0.23-1.028,0.421-1.569,0.57l-1.955-2.514c-0.372,0.051-0.75,0.086-1.136,0.086c-0.356,0-0.706-0.029-1.051-0.074l-1.945,2.5c-0.541-0.151-1.065-0.342-1.57-0.569l0.117-3.146c-0.634-0.398-1.208-0.88-1.712-1.427L6.78,22.251c-0.313-0.456-0.583-0.944-0.826-1.448l2.088-2.309c-0.226-0.703-0.354-1.451-0.385-2.223l-2.768-1.464c0.055-0.563,0.165-1.107,0.301-1.643l3.084-0.427c0.29-0.702,0.675-1.352,1.135-1.942L8.227,7.894c0.399-0.389,0.83-0.744,1.283-1.07l2.663,1.672c0.65-0.337,1.349-0.593,2.085-0.75l0.968-3.001c0.278-0.021,0.555-0.042,0.837-0.042c0.282,0,0.56,0.022,0.837,0.042l0.976,3.028c0.72,0.163,1.401,0.416,2.036,0.75l2.704-1.697c0.455,0.326,0.887,0.681,1.285,1.07l-1.216,2.986c0.428,0.564,0.793,1.181,1.068,1.845l3.185,0.441c0.135,0.535,0.247,1.081,0.302,1.643l-2.867,1.516c-0.034,0.726-0.15,1.43-0.355,2.1L26.174,20.809z",
                "raph_settingsalt": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM24.386,14.968c-1.451,1.669-3.706,2.221-5.685,1.586l-7.188,8.266c-0.766,0.88-2.099,0.97-2.979,0.205s-0.973-2.099-0.208-2.979l7.198-8.275c-0.893-1.865-0.657-4.164,0.787-5.824c1.367-1.575,3.453-2.151,5.348-1.674l-2.754,3.212l0.901,2.621l2.722,0.529l2.761-3.22C26.037,11.229,25.762,13.387,24.386,14.968z",
                "raph_feed": "M4.135,16.762c3.078,0,5.972,1.205,8.146,3.391c2.179,2.187,3.377,5.101,3.377,8.202h4.745c0-9.008-7.299-16.335-16.269-16.335V16.762zM4.141,8.354c10.973,0,19.898,8.975,19.898,20.006h4.743c0-13.646-11.054-24.749-24.642-24.749V8.354zM10.701,25.045c0,1.815-1.471,3.287-3.285,3.287s-3.285-1.472-3.285-3.287c0-1.813,1.471-3.285,3.285-3.285S10.701,23.231,10.701,25.045z",
                "raph_bug": "M28.589,10.903l-5.828,1.612c-0.534-1.419-1.338-2.649-2.311-3.628l3.082-5.44c0.271-0.48,0.104-1.092-0.38-1.365c-0.479-0.271-1.09-0.102-1.36,0.377l-2.924,5.162c-0.604-0.383-1.24-0.689-1.9-0.896c-0.416-1.437-1.652-2.411-3.058-2.562c-0.001-0.004-0.002-0.008-0.003-0.012c-0.061-0.242-0.093-0.46-0.098-0.65c-0.005-0.189,0.012-0.351,0.046-0.479c0.037-0.13,0.079-0.235,0.125-0.317c0.146-0.26,0.34-0.43,0.577-0.509c0.023,0.281,0.142,0.482,0.352,0.601c0.155,0.088,0.336,0.115,0.546,0.086c0.211-0.031,0.376-0.152,0.496-0.363c0.105-0.186,0.127-0.389,0.064-0.607c-0.064-0.219-0.203-0.388-0.414-0.507c-0.154-0.087-0.314-0.131-0.482-0.129c-0.167,0.001-0.327,0.034-0.481,0.097c-0.153,0.063-0.296,0.16-0.429,0.289c-0.132,0.129-0.241,0.271-0.33,0.426c-0.132,0.234-0.216,0.496-0.25,0.783c-0.033,0.286-0.037,0.565-0.009,0.84c0.017,0.16,0.061,0.301,0.094,0.449c-0.375-0.021-0.758,0.002-1.14,0.108c-0.482,0.133-0.913,0.36-1.28,0.653c-0.052-0.172-0.098-0.344-0.18-0.518c-0.116-0.249-0.263-0.486-0.438-0.716c-0.178-0.229-0.384-0.41-0.618-0.543C9.904,3.059,9.737,2.994,9.557,2.951c-0.18-0.043-0.352-0.052-0.516-0.027s-0.318,0.08-0.463,0.164C8.432,3.172,8.318,3.293,8.23,3.445C8.111,3.656,8.08,3.873,8.136,4.092c0.058,0.221,0.181,0.384,0.367,0.49c0.21,0.119,0.415,0.138,0.611,0.056C9.31,4.556,9.451,4.439,9.539,4.283c0.119-0.21,0.118-0.443-0.007-0.695c0.244-0.055,0.497-0.008,0.757,0.141c0.081,0.045,0.171,0.115,0.27,0.208c0.097,0.092,0.193,0.222,0.286,0.388c0.094,0.166,0.179,0.368,0.251,0.608c0.013,0.044,0.023,0.098,0.035,0.146c-0.911,0.828-1.357,2.088-1.098,3.357c-0.582,0.584-1.072,1.27-1.457,2.035l-5.16-2.926c-0.48-0.271-1.092-0.102-1.364,0.377C1.781,8.404,1.95,9.016,2.43,9.289l5.441,3.082c-0.331,1.34-0.387,2.807-0.117,4.297l-5.828,1.613c-0.534,0.147-0.846,0.699-0.698,1.231c0.147,0.53,0.697,0.843,1.231,0.694l5.879-1.627c0.503,1.057,1.363,2.28,2.371,3.443l-3.194,5.639c-0.272,0.481-0.104,1.092,0.378,1.363c0.239,0.137,0.512,0.162,0.758,0.094c0.248-0.068,0.469-0.229,0.604-0.471l2.895-5.109c2.7,2.594,5.684,4.123,5.778,1.053c1.598,2.56,3.451-0.338,4.502-3.976l5.203,2.947c0.24,0.138,0.514,0.162,0.762,0.094c0.246-0.067,0.467-0.229,0.603-0.471c0.272-0.479,0.104-1.091-0.377-1.362l-5.701-3.229c0.291-1.505,0.422-2.983,0.319-4.138l5.886-1.627c0.53-0.147,0.847-0.697,0.696-1.229C29.673,11.068,29.121,10.756,28.589,10.903z",
                "raph_link": "M15.667,4.601c-1.684,1.685-2.34,3.985-2.025,6.173l3.122-3.122c0.004-0.005,0.014-0.008,0.016-0.012c0.21-0.403,0.464-0.789,0.802-1.126c1.774-1.776,4.651-1.775,6.428,0c1.775,1.773,1.777,4.652,0.002,6.429c-0.34,0.34-0.727,0.593-1.131,0.804c-0.004,0.002-0.006,0.006-0.01,0.01l-3.123,3.123c2.188,0.316,4.492-0.34,6.176-2.023c2.832-2.832,2.83-7.423,0-10.255C23.09,1.77,18.499,1.77,15.667,4.601zM14.557,22.067c-0.209,0.405-0.462,0.791-0.801,1.131c-1.775,1.774-4.656,1.774-6.431,0c-1.775-1.774-1.775-4.653,0-6.43c0.339-0.338,0.725-0.591,1.128-0.8c0.004-0.006,0.005-0.012,0.011-0.016l3.121-3.123c-2.187-0.316-4.489,0.342-6.172,2.024c-2.831,2.831-2.83,7.423,0,10.255c2.833,2.831,7.424,2.831,10.257,0c1.684-1.684,2.342-3.986,2.023-6.175l-3.125,3.123C14.565,22.063,14.561,22.065,14.557,22.067zM9.441,18.885l2.197,2.197c0.537,0.537,1.417,0.537,1.953,0l8.302-8.302c0.539-0.536,0.539-1.417,0.002-1.952l-2.199-2.197c-0.536-0.539-1.416-0.539-1.952-0.002l-8.302,8.303C8.904,17.469,8.904,18.349,9.441,18.885z",
                "raph_calendar": "M11.758,15.318c0.312-0.3,0.408-0.492,0.408-0.492h0.024c0,0-0.012,0.264-0.012,0.528v5.469h-1.871v1.031h4.87v-1.031H13.33v-7.436h-1.055l-2.027,1.967l0.719,0.744L11.758,15.318zM16.163,21.207c0,0.205,0.024,0.42,0.06,0.647h5.457v-1.031h-4.197c0.023-1.931,4.065-2.362,4.065-5.146c0-1.463-1.114-2.436-2.674-2.436c-1.907,0-2.675,1.607-2.675,1.607l0.875,0.587c0,0,0.6-1.08,1.716-1.08c0.887,0,1.522,0.563,1.522,1.403C20.312,17.754,16.163,18.186,16.163,21.207zM12,3.604h-2v3.335h2V3.604zM23,4.77v3.17h-4V4.77h-6v3.168H9.002V4.77H6.583v21.669h18.833V4.77H23zM24.417,25.438H7.584V10.522h16.833V25.438zM22,3.604h-2v3.335h2V3.604z",
                "raph_picker": "M22.221,10.853c-0.111-0.414-0.261-0.412,0.221-1.539l1.66-3.519c0.021-0.051,0.2-0.412,0.192-0.946c0.015-0.529-0.313-1.289-1.119-1.642c-1.172-0.555-1.17-0.557-2.344-1.107c-0.784-0.396-1.581-0.171-1.979,0.179c-0.42,0.333-0.584,0.7-0.609,0.75L16.58,6.545c-0.564,1.084-0.655,0.97-1.048,1.147c-0.469,0.129-1.244,0.558-1.785,1.815c-1.108,2.346-1.108,2.346-1.108,2.346l-0.276,0.586l1.17,0.553l-3.599,7.623c-0.38,0.828-0.166,1.436-0.166,2.032c0.01,0.627-0.077,1.509-0.876,3.21l-0.276,0.586l3.517,1.661l0.276-0.585c0.808-1.699,1.431-2.326,1.922-2.717c0.46-0.381,1.066-0.6,1.465-1.42l3.599-7.618l1.172,0.554l0.279-0.589c0,0,0,0,1.105-2.345C22.578,12.166,22.419,11.301,22.221,10.853zM14.623,22.83c-0.156,0.353-0.413,0.439-1.091,0.955c-0.577,0.448-1.264,1.172-2.009,2.6l-1.191-0.562c0.628-1.48,0.75-2.474,0.73-3.203c-0.031-0.851-0.128-1.104,0.045-1.449l3.599-7.621l3.517,1.662L14.623,22.83z",
                "raph_no": "M16,2.939C9.006,2.942,3.338,8.61,3.335,15.605C3.335,22.6,9.005,28.268,16,28.27c6.994-0.002,12.662-5.67,12.664-12.664C28.663,8.61,22.995,2.939,16,2.939zM25.663,15.605c-0.003,1.943-0.583,3.748-1.569,5.264L10.736,7.513c1.515-0.988,3.32-1.569,5.265-1.573C21.337,5.951,25.654,10.269,25.663,15.605zM6.335,15.605c0.004-1.943,0.584-3.75,1.573-5.266l13.355,13.357c-1.516,0.986-3.32,1.566-5.264,1.569C10.664,25.26,6.346,20.941,6.335,15.605z",
                "raph_commandline": "M2.021,9.748L2.021,9.748V9.746V9.748zM2.022,9.746l5.771,5.773l-5.772,5.771l2.122,2.123l7.894-7.895L4.143,7.623L2.022,9.746zM12.248,23.269h14.419V20.27H12.248V23.269zM16.583,17.019h10.084V14.02H16.583V17.019zM12.248,7.769v3.001h14.419V7.769H12.248z",
                "raph_photo": "M24.25,10.25H20.5v-1.5h-9.375v1.5h-3.75c-1.104,0-2,0.896-2,2v10.375c0,1.104,0.896,2,2,2H24.25c1.104,0,2-0.896,2-2V12.25C26.25,11.146,25.354,10.25,24.25,10.25zM15.812,23.499c-3.342,0-6.06-2.719-6.06-6.061c0-3.342,2.718-6.062,6.06-6.062s6.062,2.72,6.062,6.062C21.874,20.78,19.153,23.499,15.812,23.499zM15.812,13.375c-2.244,0-4.062,1.819-4.062,4.062c0,2.244,1.819,4.062,4.062,4.062c2.244,0,4.062-1.818,4.062-4.062C19.875,15.194,18.057,13.375,15.812,13.375z",
                "raph_printer": "M24.569,12.125h-2.12c-0.207-1.34-1.247-2.759-2.444-3.967c-1.277-1.24-2.654-2.234-3.784-2.37c-0.062-0.008-0.124-0.014-0.198-0.015H8.594c-0.119,0-0.235,0.047-0.319,0.132c-0.083,0.083-0.132,0.2-0.132,0.32v5.9H6.069c-1.104,0-2,0.896-2,2V23h4.074v2.079c0,0.118,0.046,0.23,0.132,0.318c0.086,0.085,0.199,0.131,0.319,0.131h13.445c0.118,0,0.232-0.046,0.318-0.131s0.138-0.199,0.138-0.318V23h4.074v-8.875C26.569,13.021,25.674,12.125,24.569,12.125zM21.589,24.626H9.043V21.5h12.546V24.626zM21.589,13.921c0-0.03,0-0.063-0.003-0.096c-0.015-0.068-0.062-0.135-0.124-0.2H9.043v-6.95h6.987v0.001c0.305-0.019,0.567,0.282,0.769,0.971c0.183,0.655,0.229,1.509,0.229,2.102c0.001,0.433-0.019,0.725-0.019,0.725l-0.037,0.478l0.48,0.005c0.002,0,1.109,0.014,2.196,0.26c1.044,0.226,1.86,0.675,1.938,1.184c0.003,0.045,0.003,0.091,0.003,0.133V13.921z",
                "export": "M24.086,20.904c-1.805,3.113-5.163,5.212-9.023,5.219c-5.766-0.01-10.427-4.672-10.438-10.435C4.636,9.922,9.297,5.261,15.063,5.25c3.859,0.007,7.216,2.105,9.022,5.218l3.962,2.284l0.143,0.082C26.879,6.784,21.504,2.25,15.063,2.248C7.64,2.25,1.625,8.265,1.624,15.688c0.002,7.42,6.017,13.435,13.439,13.437c6.442-0.002,11.819-4.538,13.127-10.589l-0.141,0.081L24.086,20.904zM28.4,15.688l-7.15-4.129v2.297H10.275v3.661H21.25v2.297L28.4,15.688z",
                "import": "M15.067,2.25c-5.979,0-11.035,3.91-12.778,9.309h3.213c1.602-3.705,5.271-6.301,9.565-6.309c5.764,0.01,10.428,4.674,10.437,10.437c-0.009,5.764-4.673,10.428-10.437,10.438c-4.294-0.007-7.964-2.605-9.566-6.311H2.289c1.744,5.399,6.799,9.31,12.779,9.312c7.419-0.002,13.437-6.016,13.438-13.438C28.504,8.265,22.486,2.252,15.067,2.25zM10.918,19.813l7.15-4.126l-7.15-4.129v2.297H-0.057v3.661h10.975V19.813z",
                "raph_run": "M17.41,20.395l-0.778-2.723c0.228-0.2,0.442-0.414,0.644-0.643l2.721,0.778c0.287-0.418,0.534-0.862,0.755-1.323l-2.025-1.96c0.097-0.288,0.181-0.581,0.241-0.883l2.729-0.684c0.02-0.252,0.039-0.505,0.039-0.763s-0.02-0.51-0.039-0.762l-2.729-0.684c-0.061-0.302-0.145-0.595-0.241-0.883l2.026-1.96c-0.222-0.46-0.469-0.905-0.756-1.323l-2.721,0.777c-0.201-0.228-0.416-0.442-0.644-0.643l0.778-2.722c-0.418-0.286-0.863-0.534-1.324-0.755l-1.96,2.026c-0.287-0.097-0.581-0.18-0.883-0.241l-0.683-2.73c-0.253-0.019-0.505-0.039-0.763-0.039s-0.51,0.02-0.762,0.039l-0.684,2.73c-0.302,0.061-0.595,0.144-0.883,0.241l-1.96-2.026C7.048,3.463,6.604,3.71,6.186,3.997l0.778,2.722C6.736,6.919,6.521,7.134,6.321,7.361L3.599,6.583C3.312,7.001,3.065,7.446,2.844,7.907l2.026,1.96c-0.096,0.288-0.18,0.581-0.241,0.883l-2.73,0.684c-0.019,0.252-0.039,0.505-0.039,0.762s0.02,0.51,0.039,0.763l2.73,0.684c0.061,0.302,0.145,0.595,0.241,0.883l-2.026,1.96c0.221,0.46,0.468,0.905,0.755,1.323l2.722-0.778c0.2,0.229,0.415,0.442,0.643,0.643l-0.778,2.723c0.418,0.286,0.863,0.533,1.323,0.755l1.96-2.026c0.288,0.097,0.581,0.181,0.883,0.241l0.684,2.729c0.252,0.02,0.505,0.039,0.763,0.039s0.51-0.02,0.763-0.039l0.683-2.729c0.302-0.061,0.596-0.145,0.883-0.241l1.96,2.026C16.547,20.928,16.992,20.681,17.41,20.395zM11.798,15.594c-1.877,0-3.399-1.522-3.399-3.399s1.522-3.398,3.399-3.398s3.398,1.521,3.398,3.398S13.675,15.594,11.798,15.594zM27.29,22.699c0.019-0.547-0.06-1.104-0.23-1.654l1.244-1.773c-0.188-0.35-0.4-0.682-0.641-0.984l-2.122,0.445c-0.428-0.364-0.915-0.648-1.436-0.851l-0.611-2.079c-0.386-0.068-0.777-0.105-1.173-0.106l-0.974,1.936c-0.279,0.054-0.558,0.128-0.832,0.233c-0.257,0.098-0.497,0.22-0.727,0.353L17.782,17.4c-0.297,0.262-0.568,0.545-0.813,0.852l0.907,1.968c-0.259,0.495-0.437,1.028-0.519,1.585l-1.891,1.06c0.019,0.388,0.076,0.776,0.164,1.165l2.104,0.519c0.231,0.524,0.541,0.993,0.916,1.393l-0.352,2.138c0.32,0.23,0.66,0.428,1.013,0.6l1.715-1.32c0.536,0.141,1.097,0.195,1.662,0.15l1.452,1.607c0.2-0.057,0.399-0.118,0.596-0.193c0.175-0.066,0.34-0.144,0.505-0.223l0.037-2.165c0.455-0.339,0.843-0.747,1.152-1.206l2.161-0.134c0.152-0.359,0.279-0.732,0.368-1.115L27.29,22.699zM23.127,24.706c-1.201,0.458-2.545-0.144-3.004-1.345s0.143-2.546,1.344-3.005c1.201-0.458,2.547,0.144,3.006,1.345C24.931,22.902,24.328,24.247,23.127,24.706z",
                "raph_magnet": "M20.812,19.5h5.002v-6.867c-0.028-1.706-0.61-3.807-2.172-5.841c-1.539-2.014-4.315-3.72-7.939-3.687C12.076,3.073,9.3,4.779,7.762,6.792C6.2,8.826,5.617,10.928,5.588,12.634V19.5h5v-6.866c-0.027-0.377,0.303-1.789,1.099-2.748c0.819-0.979,1.848-1.747,4.014-1.778c2.165,0.032,3.195,0.799,4.013,1.778c0.798,0.959,1.126,2.372,1.099,2.748V19.5L20.812,19.5zM25.814,25.579c0,0,0-2.354,0-5.079h-5.002c0,2.727,0,5.08,0,5.08l5.004-0.001H25.814zM5.588,25.58h5c0,0,0-2.354,0-5.08h-5C5.588,23.227,5.588,25.58,5.588,25.58z",
                "raph_nomagnet": "M10.59,17.857v-5.225c-0.027-0.376,0.303-1.789,1.099-2.748c0.819-0.979,1.849-1.748,4.014-1.778c1.704,0.026,2.699,0.508,3.447,1.189l3.539-3.539c-1.616-1.526-4.01-2.679-6.986-2.652C12.077,3.073,9.3,4.779,7.762,6.793C6.2,8.826,5.617,10.928,5.59,12.634V19.5h3.357L10.59,17.857zM5.59,20.5v2.357L7.947,20.5H5.59zM20.812,13.29v6.21h5.002v-6.866c-0.021-1.064-0.252-2.283-0.803-3.542L20.812,13.29zM25.339,4.522L4.652,25.209l1.415,1.416L26.753,5.937L25.339,4.522zM20.812,25.58h5.002c0,0,0-2.354,0-5.08h-5.002C20.812,23.227,20.812,25.58,20.812,25.58zM10.59,25.58c0,0,0-0.827,0-2.064L8.525,25.58H10.59z",
                "raph_flip": "M15.5,21.082h1.001v-2.001H15.5V21.082zM15.5,25.082h1.001v-2H15.5V25.082zM15.5,29.082h1.001v-2H15.5V29.082zM15.5,32.127h1.001v-1.045H15.5V32.127zM15.5,17.083h1.001v-2H15.5V17.083zM15.5,1.083h1.001v-2H15.5V1.083zM15.5,5.083h1.001v-2H15.5V5.083zM15.5,9.083h1.001v-2H15.5V9.083zM15.5,13.083h1.001v-2H15.5V13.083zM18.832,1.203v25.962h14.093L18.832,1.203zM19.832,5.136l11.41,21.03h-11.41V5.136zM13.113,27.165V1.203L-0.979,27.165H13.113z",
                "raph_flipv": "M21.45,16.078v-1.001h-2.001v1.001H21.45zM25.45,16.078v-1.001h-2v1.001H25.45zM29.45,16.078v-1.001h-2v1.001H29.45zM32.495,16.078v-1.001H31.45v1.001H32.495zM17.451,16.078v-1.001h-2v1.001H17.451zM1.451,16.078v-1.001h-2v1.001H1.451zM5.451,16.078v-1.001h-2v1.001H5.451zM9.452,16.078v-1.001h-2v1.001H9.452zM13.452,16.078v-1.001h-2v1.001H13.452zM1.571,12.745h25.962V-1.348L1.571,12.745zM5.504,11.745l21.03-11.41v11.41H5.504zM27.533,18.464H1.571l25.962,14.093V18.464z",
                "raph_connect": "M25.06,13.719c-0.944-5.172-5.461-9.094-10.903-9.094v4c3.917,0.006,7.085,3.176,7.094,7.094c-0.009,3.917-3.177,7.085-7.094,7.093v4.002c5.442-0.004,9.959-3.926,10.903-9.096h4.69v-3.999H25.06zM20.375,15.719c0-3.435-2.784-6.219-6.219-6.219c-2.733,0-5.05,1.766-5.884,4.218H1.438v4.001h6.834c0.833,2.452,3.15,4.219,5.884,4.219C17.591,21.938,20.375,19.153,20.375,15.719z",
                "raph_disconnect": "M9.219,9.5c-2.733,0-5.05,1.766-5.884,4.218H1.438v4.001h1.897c0.833,2.452,3.15,4.219,5.884,4.219c3.435,0,6.219-2.784,6.219-6.219S12.653,9.5,9.219,9.5zM27.685,13.719c-0.944-5.172-5.461-9.094-10.903-9.094v4c3.917,0.006,7.085,3.176,7.094,7.094c-0.009,3.917-3.177,7.085-7.094,7.093v4.002c5.442-0.004,9.959-3.926,10.903-9.096h2.065v-3.999H27.685z",
                "raph_folder": "M29.124,12.75c-0.004-2.208-1.792-3.997-3.999-4V8.749H12.868c-0.505-1.622-2.011-2.808-3.805-2.811H6.188c-2.208,0.002-3.997,1.792-4.001,4v14.188c0.004,2.206,1.793,3.995,4.001,3.999h18.938c2.205-0.004,3.995-1.793,3.999-3.999V12.75zM6.188,7.937h2.875c1.046-0.004,1.917,0.834,1.983,1.876l0.058,0.937h14.022c1.093,0.002,1.997,0.906,1.999,2v0.495c-0.591-0.345-1.268-0.557-2-0.558H6.187c-0.732,0.001-1.41,0.214-2,0.559V9.937C4.19,8.843,5.094,7.939,6.188,7.937zM25.125,26.125H6.188c-1.093-0.002-1.997-0.908-2.001-2v-7.438h0.001c0.002-1.095,0.906-1.999,2-2.001h18.938c1.093,0.002,1.991,0.901,2,1.991v7.447C27.122,25.219,26.218,26.123,25.125,26.125z",
                "raph_man": "M21.021,16.349c-0.611-1.104-1.359-1.998-2.109-2.623c-0.875,0.641-1.941,1.031-3.103,1.031c-1.164,0-2.231-0.391-3.105-1.031c-0.75,0.625-1.498,1.519-2.111,2.623c-1.422,2.563-1.578,5.192-0.35,5.874c0.55,0.307,1.127,0.078,1.723-0.496c-0.105,0.582-0.166,1.213-0.166,1.873c0,2.932,1.139,5.307,2.543,5.307c0.846,0,1.265-0.865,1.466-2.189c0.201,1.324,0.62,2.189,1.463,2.189c1.406,0,2.545-2.375,2.545-5.307c0-0.66-0.061-1.291-0.168-1.873c0.598,0.574,1.174,0.803,1.725,0.496C22.602,21.541,22.443,18.912,21.021,16.349zM15.808,13.757c2.362,0,4.278-1.916,4.278-4.279s-1.916-4.279-4.278-4.279c-2.363,0-4.28,1.916-4.28,4.279S13.445,13.757,15.808,13.757z",
                "raph_woman": "M21.022,16.349c-0.611-1.104-1.359-1.998-2.109-2.623c-0.875,0.641-1.941,1.031-3.104,1.031c-1.164,0-2.231-0.391-3.105-1.031c-0.75,0.625-1.498,1.519-2.111,2.623c-1.422,2.563-1.579,5.192-0.351,5.874c0.55,0.307,1.127,0.078,1.723-0.496c-0.105,0.582-0.167,1.213-0.167,1.873c0,2.932,1.139,5.307,2.543,5.307c0.846,0,1.265-0.865,1.466-2.189c0.201,1.324,0.62,2.189,1.464,2.189c1.406,0,2.545-2.375,2.545-5.307c0-0.66-0.061-1.291-0.168-1.873c0.598,0.574,1.174,0.803,1.725,0.496C22.603,21.541,22.444,18.912,21.022,16.349zM15.808,13.757c2.363,0,4.279-1.916,4.279-4.279s-1.916-4.279-4.279-4.279c-2.363,0-4.28,1.916-4.28,4.279S13.445,13.757,15.808,13.757zM18.731,4.974c1.235,0.455,0.492-0.725,0.492-1.531s0.762-1.792-0.492-1.391c-1.316,0.422-2.383,0.654-2.383,1.461S17.415,4.489,18.731,4.974zM15.816,4.4c0.782,0,0.345-0.396,0.345-0.884c0-0.488,0.438-0.883-0.345-0.883s-0.374,0.396-0.374,0.883C15.442,4.005,15.034,4.4,15.816,4.4zM12.884,4.974c1.316-0.484,2.383-0.654,2.383-1.461S14.2,2.474,12.884,2.052c-1.254-0.402-0.492,0.584-0.492,1.391S11.648,5.428,12.884,4.974z",
                "raph_notebook": "M24.875,1.375H8c-1.033,0-1.874,0.787-1.979,1.792h1.604c1.102,0,2,0.898,2,2c0,1.102-0.898,2-2,2H6v0.999h1.625c1.104,0,2.002,0.898,2.002,2.002c0,1.104-0.898,2.001-2.002,2.001H6v0.997h1.625c1.102,0,2,0.898,2,2c0,1.104-0.898,2.004-2,2.004H6v0.994h1.625c1.102,0,2,0.898,2,2.002s-0.898,2.002-2,2.002H6v0.997h1.624c1.104,0,2.002,0.897,2.002,2.001c0,1.104-0.898,2.002-2.002,2.002H6.004C6.027,28.252,6.91,29.125,8,29.125h16.875c1.104,0,2-0.896,2-2V3.375C26.875,2.271,25.979,1.375,24.875,1.375zM25.25,8.375c0,0.552-0.447,1-1,1H14c-0.553,0-1-0.448-1-1V4c0-0.552,0.447-1,1-1h10.25c0.553,0,1,0.448,1,1V8.375zM8.625,25.166c0-0.554-0.449-1.001-1-1.001h-3.25c-0.552,0-1,0.447-1,1.001c0,0.552,0.449,1,1,1h3.25C8.176,26.166,8.625,25.718,8.625,25.166zM4.375,6.166h3.251c0.551,0,0.999-0.448,0.999-0.999c0-0.555-0.448-1-0.999-1H4.375c-0.553,0-1,0.445-1,1C3.374,5.718,3.822,6.166,4.375,6.166zM4.375,11.167h3.25c0.553,0,1-0.448,1-1s-0.448-1-1-1h-3.25c-0.553,0-1,0.448-1,1S3.822,11.167,4.375,11.167zM4.375,16.167h3.25c0.551,0,1-0.448,1-1.001s-0.448-0.999-1-0.999h-3.25c-0.553,0-1.001,0.446-1.001,0.999S3.822,16.167,4.375,16.167zM3.375,20.165c0,0.553,0.446,1.002,1,1.002h3.25c0.551,0,1-0.449,1-1.002c0-0.552-0.448-1-1-1h-3.25C3.821,19.165,3.375,19.613,3.375,20.165z",
                "raph_diagram": "M6.812,17.202l7.396-3.665v-2.164h-0.834c-0.414,0-0.808-0.084-1.167-0.237v1.159l-7.396,3.667v2.912h2V17.202zM26.561,18.875v-2.913l-7.396-3.666v-1.158c-0.358,0.152-0.753,0.236-1.166,0.236h-0.832l-0.001,2.164l7.396,3.666v1.672H26.561zM16.688,18.875v-7.501h-2v7.501H16.688zM27.875,19.875H23.25c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C29.875,20.771,28.979,19.875,27.875,19.875zM8.125,19.875H3.5c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C10.125,20.771,9.229,19.875,8.125,19.875zM13.375,10.375H18c1.104,0,2-0.896,2-2V3.75c0-1.104-0.896-2-2-2h-4.625c-1.104,0-2,0.896-2,2v4.625C11.375,9.479,12.271,10.375,13.375,10.375zM18,19.875h-4.625c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2H18c1.104,0,2-0.896,2-2v-4.625C20,20.771,19.104,19.875,18,19.875z",
                "raph_barchart": "M21.25,8.375V28h6.5V8.375H21.25zM12.25,28h6.5V4.125h-6.5V28zM3.25,28h6.5V12.625h-6.5V28z"
            	}
            }
          • symbol.json
            {"data": {
            	"airplane": "m150.70285,1c-3.11894,0 -5.89383,1.28033 -8.23512,3.60274c-2.33931,2.3205 -4.27426,5.64559 -5.8844,9.79826c-3.21983,8.30419 -5.20047,19.96969 -6.28387,33.94021c-1.08127,13.94364 -1.26349,30.17972 -0.81427,47.56012c-38.52657,15.80524 -116.66563,48.43882 -122.94262,55.72521c-8.35709,9.701 -5.65693,20.81889 -2.28924,28.1994l128.45827,-26.14551c2.71532,34.07207 6.57611,67.81866 9.94048,94.2617c-12.56244,3.67662 -36.01244,10.93625 -40.85281,15.43805c-6.66802,6.2016 -6.66797,26.22952 -6.66797,26.22952l52.57557,-4.27612c1.23827,8.63303 2.01266,13.67035 2.01266,13.67035l0.07683,0.45456l0.41484,0l0.96791,0l0.41483,0l0.07683,-0.45456c0,0 0.77292,-5.03741 2.01265,-13.67035l52.59094,4.27612c0,0 0.00006,-20.02792 -6.66798,-26.22952c-4.84218,-4.50354 -28.3093,-11.77963 -40.86818,-15.45499c3.35742,-26.36189 7.2114,-59.97935 9.92513,-93.94165l126.95265,25.84239c3.36765,-7.38051 6.08325,-18.4984 -2.27386,-28.1994c-6.19934,-7.19621 -82.45026,-39.10397 -121.45232,-55.11919c0.466,-17.60567 0.29471,-34.06301 -0.79893,-48.16614l0,-0.03367c-1.08395,-13.95511 -3.0667,-25.60925 -6.28384,-33.90654c-1.60968,-4.15152 -3.52888,-7.47695 -5.86903,-9.79826c-2.34131,-2.32241 -5.11617,-3.60274 -8.23509,-3.60274z",
            	"arrows_recycle": "m184.80963,97.86072l-33.85641,-5.99613l12.47342,-6.51318c6.86035,-3.58231 13.08063,-7.05022 13.8228,-7.70647c1.84358,-1.63009 -21.11545,-37.10833 -23.99486,-37.07896c-1.26575,0.01435 -10.08571,13.75221 -19.59988,30.53185c-9.58302,16.90081 -19.12026,29.77207 -21.38301,28.85762c-26.78106,-10.82179 -48.63238,-21.77106 -48.63238,-24.36867c0,-1.7743 8.40277,-17.60187 18.67293,-35.17241l18.67294,-31.94638l50.91241,0l50.91241,0l13.28955,21.01844l13.28966,21.01844l13.86403,-7.11266c9.61084,-4.93073 13.27039,-5.63875 11.92874,-2.30832c-11.81259,29.32658 -29.43884,63.52189 -32.57199,63.19018c-2.16919,-0.22948 -19.17931,-3.11553 -37.80035,-6.41334zm-157.90158,130.83841c-12.88431,-22.18782 -24.43164,-42.96199 -25.66062,-46.16496c-1.26128,-3.28671 2.41348,-15.03122 8.43637,-26.96236l10.67094,-21.13916l-10.90837,-6.44379c-14.51679,-8.57526 -9.12079,-11.21638 29.38814,-14.38432l30.43462,-2.50365l11.93788,31.54266c6.56593,17.34845 12.77805,33.78311 13.80486,36.52168c1.07085,2.85602 -4.05412,0.95576 -12.01902,-4.45653l-13.88588,-9.43578l-9.69341,18.71187c-5.33128,10.2917 -9.769,19.85884 -9.86144,21.26031c-0.09266,1.40147 16.26999,3.00525 36.36115,3.56384l36.52929,1.01558l2.3839,26.7207c1.3112,14.69647 2.11298,26.91713 1.78191,27.15706c-0.33105,0.23969 -17.62818,1.53915 -38.43802,2.88736l-37.83614,2.4512l-23.42616,-40.34174zm144.19484,39.20346c-22.11887,-33.38463 -22.50333,-30.90141 10.37228,-66.98763l21.10391,-23.16492l-2.24142,16.92821l-2.24152,16.92822l23.64932,0c13.0071,0 23.64944,-1.04019 23.64944,-2.31137c0,-1.27139 -7.21684,-15.55066 -16.03735,-31.73212c-8.82051,-16.18146 -16.00386,-30.77765 -15.96307,-32.436c0.09158,-3.71849 46.32753,-34.42394 48.52559,-32.22591c0.87094,0.87095 9.45139,16.38289 19.06769,34.47134l17.48441,32.8876l-23.52576,37.94727c-12.93936,20.87074 -25.37122,39.98283 -27.62622,42.47105c-2.25526,2.48822 -14.86537,5.52936 -28.02258,6.75787c-25.11388,2.34528 -24.43022,1.7804 -28.11249,23.22583c-0.64439,3.75308 -8.1586,-4.76279 -20.08223,-22.75946z",
            	"beverage": "m55.65598,297.84982c-28.13961,-15.0867 0.71402,-44.87836 24.17752,-35.2438c17.46051,-0.03983 34.92112,-0.01355 52.38168,-0.02121c0,-34.34088 0,-68.68181 0,-103.02271c-43.73869,-52.76227 -87.47738,-105.52454 -131.21606,-158.28681c98.99732,-0.36748 197.99556,-0.36708 296.99286,0c-42.95236,53.02298 -85.90472,106.04595 -128.85707,159.06893c0,34.08022 0,68.1604 0,102.24059c25.78079,0.22986 51.60571,-0.625 77.34869,0.87012c20.26866,5.44482 12.15504,38.73355 -7.54306,35.2244c-61.09291,-0.21259 -122.20532,0.38715 -183.28456,-0.8295zm127.03334,-186.51904c19.68919,-7.503 16.9212,-39.96898 -4.19951,-43.27924c-31.86026,-8.77637 -38.74004,46.49459 -5.25272,45.19753c3.23363,0.02124 6.51921,-0.43665 9.45222,-1.91829z",
            	"bicycle": "m69.04492,242.61508c10.78542,-0.13551 -10.27161,-0.62888 -14.0067,-0.90082c-31.20993,-0.75682 -57.11145,-31.7867 -53.74048,-62.58058c0.6826,-30.81444 30.36186,-57.88344 61.25282,-54.78261c8.04092,-3.41573 19.45538,7.85678 24.44781,2.47261c12.82323,-22.6207 25.24759,-45.47771 38.58752,-67.7975c11.3629,-1.62186 24.90015,-2.8755 35.9539,0.19863c5.11031,8.04987 -4.18097,10.24141 -9.97878,8.99869c-6.4711,0 -12.9422,0 -19.41331,0c-4.68463,8.54676 -9.49177,17.02541 -14.27853,25.51514c27.18877,0 54.37757,0 81.56634,0c0.60545,-2.89218 7.47321,-9.12369 1.38461,-8.44633c-11.06171,-1.39418 -4.14218,-14.17861 4.04941,-10.54169c11.49847,0.42252 23.4034,-1.13349 34.55679,1.17167c5.95799,11.9574 -11.26917,9.39215 -18.65384,9.51889c-5.46606,-1.78406 -6.59882,3.68022 -8.76302,7.4192c-8.77467,8.98817 -3.32066,18.46121 2.57677,27.22322c2.16318,3.98602 3.70422,9.51816 8.96812,5.7937c10.73436,-2.35877 22.43681,-2.44432 33.11809,0.31375c22.31958,6.63104 40.2153,27.32498 41.71356,50.76672c1.35196,14.39882 -1.7262,29.2406 -10.68872,40.85638c-10.3952,14.88928 -27.26529,23.04211 -45.01289,24.69595m-13.91446,0.14534c-16.17995,-4.15208 -31.09747,-13.81174 -39.74602,-28.39511c-5.65977,-7.28935 -6.39555,-18.57542 -9.40382,-25.8875c-7.93416,-0.10381 -15.86833,-0.20763 -23.80251,-0.31143c-16.06972,-25.85139 -30.2338,-52.8877 -45.73496,-79.09947c-3.0216,8.9735 -20.19933,21.18202 -10.71458,29.44228c23.80356,19.97299 26.97348,58.9857 6.61392,82.50262c-9.33031,10.45926 -22.27345,17.66695 -35.57853,21.74126m1.02195,-14.22214c25.6753,-5.59119 42.08234,-35.19554 33.20155,-59.88542c-2.74454,-8.04132 -10.29613,-20.88658 -16.96593,-21.01822c-7.10979,12.27542 -13.50588,24.99036 -21.29804,36.85445c-17.11086,3.00977 -1.43426,-17.82442 2.18629,-24.90399c3.88173,-8.63774 17.97784,-22.6107 0.22043,-22.40381c-12.4663,-1.24055 -25.71457,-0.04088 -35.79932,8.23351c-21.64245,14.32193 -25.73868,47.07928 -9.34899,66.82591c11.09536,14.38573 30.25585,20.50179 47.804,16.29758zm179.64028,-0.00356c21.91476,-5.14897 37.68491,-27.67265 34.8483,-50.02701c-1.50024,-24.84305 -26.27582,-44.93475 -50.90707,-41.59564c-18.45729,-1.74684 -0.78658,15.19781 1.85167,23.43547c2.5099,8.7469 16.33638,19.49011 8.6171,28.02017c-17.31352,0.72531 -35.05154,-0.50934 -52.31752,1.23642c3.1011,22.89496 24.76817,41.83401 48.14848,40.08203c3.28111,-0.02676 6.57803,-0.30434 9.75905,-1.15144zm-70.7294,-51.16617c2.08536,-17.91364 12.23944,-34.20847 27.04826,-44.4043c0.87492,-4.39421 -8.09195,-24.63332 -11.37527,-10.5231c-10.13445,18.42084 -20.32248,36.81699 -30.14639,55.40483c4.70622,0.11383 9.98186,0.93559 14.4734,-0.47743zm52.9005,-0.88846c-5.84201,-10.98254 -11.81374,-21.89917 -17.91992,-32.73703c-12.24919,6.45949 -20.3076,20.12949 -22.21249,33.77383c13.37456,-0.2851 26.97348,0.69884 40.16722,-0.71251l-0.03476,-0.3243l0,0zm-57.29515,-39.61388c5.7617,-10.63408 11.63275,-21.21213 17.21649,-31.94065c-24.2798,-0.5443 -48.61469,-0.66353 -72.88629,0.11504c12.46696,21.42642 23.73018,43.6828 37.36159,64.35614c6.59126,-10.13849 12.18927,-21.81091 18.30821,-32.53052z",
            	"bulb": "m145.62592,297.06863c-17.67376,-4.68848 -27.91267,-23.96384 -26.70493,-41.44981c-0.45245,-22.83995 1.65483,-46.8734 -9.26703,-67.87447c-6.22532,-15.68024 -16.83022,-29.52451 -21.2558,-45.86502c-5.50718,-25.3512 1.29536,-54.08422 21.79177,-71.10346c23.11512,-19.80671 60.02821,-22.38829 85.47337,-5.55379c17.94666,12.36192 30.89558,32.75098 30.41452,55.00024c2.10583,16.62513 -4.45561,32.2625 -12.17442,46.55451c-5.53021,11.50751 -11.98869,22.76817 -17.00821,34.40399c-1.32327,23.85774 -0.56435,47.93431 -4.15358,71.58684c-5.97899,18.328 -28.51152,30.78922 -47.11569,24.30096zm46.67903,-42.65804c-10.48888,-5.65382 -25.56134,-1.97798 -37.75313,-3.19516c-9.95908,1.99197 -27.6553,-4.08569 -32.94975,5.03105c12.10807,4.73648 26.33759,1.18594 39.22778,1.96957c10.31409,-0.9906 22.18068,0.93939 31.4751,-3.80547zm-0.78554,-10.63885c1.54361,-14.36404 -21.1709,-7.03433 -30.39838,-9.17262c-12.21318,2.47205 -31.64935,-5.2915 -39.33047,5.74487c4.5516,11.09071 24.85052,3.29074 35.50985,5.75148c11.3671,-0.4028 23.15991,0.40741 34.21899,-2.32373zm0.14142,-25.16705c2.9986,-27.98152 20.10725,-51.27968 30.01392,-76.87566c8.14517,-30.64574 -7.9861,-65.65708 -37.19159,-78.52086c-29.06958,-14.40719 -67.79967,-3.52343 -84.22785,24.70715c-15.82867,23.31919 -12.80788,55.00346 2.66266,77.68118c11.03862,19.81914 19.84574,42.09169 18.41109,65.15663c22.91359,0 45.82719,0 68.7408,0c0.53035,-4.04942 1.06052,-8.09911 1.59097,-12.14844zm-50.72687,-39.64223c-9.07846,-15.78525 -18.39817,-31.69214 -24.71996,-48.79948c5.68369,-7.35728 7.33711,-15.55251 9.10273,-24.19695c15.95243,-3.13345 -2.03056,18.17914 13.0308,18.65942c13.36925,5.81685 7.50436,-28.2252 18.61179,-15.95465c-7.9733,13.46684 15.66168,26.8638 16.5291,7.59886c-1.14578,-14.54594 14.28561,-11.82063 8.26923,1.37553c0.49657,6.78834 11.54893,8.73447 11.73816,14.19425c-7.9566,17.25854 -14.87259,35.07664 -24.29411,51.59875c-2.12068,-6.39691 8.34081,-22.42969 11.68367,-31.84341c6.45049,-8.13736 11.99347,-30.06687 -4.82256,-27.07765c-9.75478,15.21495 -22.87704,-9.5907 -32.42833,4.99055c-8.10805,2.41856 -20.86024,-14.04196 -23.2123,1.78514c6.10664,18.79854 18.8132,34.81967 25.46149,53.42416c-2.25594,-1.33008 -3.54053,-3.66359 -4.94971,-5.75453zm-12.74261,-68.89435c-4.41462,-2.15457 1.86072,11.45412 -0.00009,0l0.00009,0zm26.38611,1.60738c-5.73064,-9.69846 -2.6572,11.76727 0,0zm25.57564,0c-5.73064,-9.69846 -2.65724,11.76727 0,0zm-119.06653,-71.66327c-10.12879,-10.27977 -21.32492,-19.92564 -30.13364,-31.25677c22.0061,18.21614 42.14793,38.73141 61.97966,59.29806c5.2662,7.2365 -9.18723,-6.75771 -11.87724,-9.10345c-6.7307,-6.23349 -13.37324,-12.56173 -19.96879,-18.93784zm156.40887,29.39093c17.12013,-21.33164 33.0936,-43.69485 51.55162,-63.89019c-3.09076,8.6951 -13.04016,19.09942 -19.29597,28.05458c-10.44716,12.99739 -20.21251,26.73974 -32.1591,38.39317c-1.49106,1.57605 -3.71758,-2.15694 -0.09639,-2.55756l-0.00015,0zm-37.0826,-20.23703c5.91515,-16.91904 14.49518,-33.02397 24.06741,-48.16613c-0.22247,8.40011 -10.37453,24.32112 -15.25424,34.73693c-2.76042,4.19142 -5.08876,10.87586 -8.81317,13.4292zm-75.7492,-21.69804c-4.12045,-6.01025 -16.5241,-20.00493 -14.20815,-21.91343c11.95872,13.25933 24.12167,26.94502 32.71223,42.62532c-7.31573,-5.61084 -12.5797,-13.71475 -18.50409,-20.71189zm47.35616,-4.73013c-0.83392,-5.64444 1.75482,-32.58975 3.19298,-14.29333c0.00511,11.46356 1.20168,24.36872 -1.98915,34.80271c-1.36639,-6.70823 -1.03488,-13.69191 -1.20383,-20.50938z",
            	"careful": "m1,1c2.24496,29.70385 10.76853,56.9168 23.28125,80.81181l23.28125,-36.31875l-6.72569,-2.48334l-9.3125,-3.31111l4.86319,-8.48472l17.07292,-30.21389l-52.46042,0zm71.49931,0l-16.86597,29.8l7.24306,2.58681l9.82986,3.51805l-5.5875,8.69167l-33.525,52.46041c24.12122,36.61169 59.3948,61.88649 99.85071,67.36043l0,107.09373l-66.22223,0l0,26.48889l165.55556,0l0,-26.48889l-66.22223,0l0,-107.09373c70.57336,-9.43671 125.94405,-78.40826 132.44444,-164.41737l-226.50069,0z",
            	"cart_2": "m0.99397,46.01759l0,36.55115l57.8652,0l28.28396,104.41602l159.23965,0l52.21094,-125.30758l-237.55595,0l0,-15.65959zm53.21769,184.47131c0,12.97459 -10.51804,23.49266 -23.49261,23.49266c-12.97436,0 -23.49244,-10.51807 -23.49244,-23.49266c0,-12.97456 10.51808,-23.49228 23.49244,-23.49228c12.97457,0 23.49261,10.51772 23.49261,23.49228zm148.8,0c0,12.97459 -10.51817,23.49266 -23.4928,23.49266c-12.97446,0 -23.49258,-10.51807 -23.49258,-23.49266c0,-12.97456 10.51813,-23.49228 23.49258,-23.49228c12.97462,0 23.4928,10.51772 23.4928,23.49228z",
            	"coat_hanger": "m24.72351,255.83636c-16.41191,-2.33228 -27.73119,-20.33411 -22.38228,-36.1741c3.30628,-15.35616 20.22842,-19.55692 31.44893,-27.66121c35.64961,-21.14748 71.50229,-41.94997 107.26245,-62.9095c1.87845,-10.22399 -5.70195,-16.59309 -13.7997,-21.39916c-16.20296,-12.86633 -15.31998,-38.50921 -1.59858,-52.83282c16.08138,-18.88601 49.91904,-12.94907 59.95362,9.38958c9.73412,9.92804 -0.18503,34.24562 -13.8385,22.54042c-1.42418,-13.2976 -12.78993,-28.89017 -27.7881,-20.44456c-15.64833,8.98737 -6.40202,29.9363 8.0513,34.15588c9.75604,6.53233 8.45554,18.64742 8.97318,28.8608c42.85536,25.5808 86.25137,50.28574 128.51941,76.82744c16.8277,13.06401 9.90717,44.50819 -11.28448,48.76941c-16.06598,2.31227 -32.54915,0.68361 -48.77617,1.31593c-68.2437,0.05267 -136.50528,0.51715 -204.74109,-0.43811zm248.30083,-21.61086c12.28671,-12.24121 -10.69217,-18.82494 -18.26138,-24.82121c-34.85875,-20.46407 -69.60597,-41.14412 -104.87569,-60.89026c-41.32713,23.46544 -82.56062,47.16515 -123.11867,71.93832c-8.58788,3.43668 -2.61073,17.17589 5.37386,15.06004c78.53457,-0.16875 157.07672,0.41405 235.60527,-0.42499c1.73874,-0.22235 3.69772,0.07922 5.27661,-0.86191z",
            	"document": "m58.5474,213.36578c-0.05885,-70.73299 -0.11767,-141.466 -0.17652,-212.19898c53.12881,0.81297 106.48294,-1.9259 159.43185,2.08758c25.82027,9.16723 22.09921,66.23434 21.6799,108.85904c-1.13266,32.14426 15.08594,95.86641 -27.03937,105.4444c-21.00172,0.00113 -21.08437,8.97424 -18.9407,25.20605c2.4877,24.31731 -4.73431,78.79115 -39.2352,44.26363l-95.71997,-73.66171zm162.59977,-23.1226c0.08537,-63.57991 -0.62674,-117.82272 -4.15146,-159.71279c-31.317,-14.24883 -73.63496,-7.31453 -109.06839,-7.53106c-13.9288,6.77649 33.0414,29.27771 43.00333,38.00857c37.81908,18.77271 49.10266,52.9127 42.57201,91.49594c0,15.00871 0,30.01746 0,45.02617c6.97418,-0.00844 21.40269,-3.46487 27.64452,-7.28687z",
            	"gift": "m160.05605,46.22016c5.12212,-9.27578 14.49356,-21.35899 -1.60765,-24.27403c-4.48517,-2.30248 -8.9718,-6.3767 -13.45119,-1.83809c-9.96648,3.93713 -18.60622,9.44305 -8.12337,19.74747c4.64861,6.65461 8.87668,21.1743 14.1424,22.77341c3.14276,-5.39672 6.08684,-10.9068 9.03981,-16.40877zm-22.01753,25.61161c-9.14935,-16.32981 -16.51206,-33.84869 -27.71044,-48.91321c-13.62003,-14.54198 -40.45641,-8.05964 -46.55505,10.6975c-8.10131,18.54466 9.37865,40.68638 29.16686,38.36525c15.01618,0.2515 30.1178,0.92769 45.09863,-0.14954zm76.02873,0.55127c19.45964,-2.60851 30.65027,-27.10658 19.57069,-43.3727c-9.81836,-17.35883 -38.06532,-17.96398 -47.9265,-0.32358c-8.53876,14.26143 -15.94994,29.16402 -23.78549,43.81643c17.32285,0.99046 34.80862,0.75943 52.1413,-0.12016zm32.22711,20.88692c6.6339,-5.83724 32.32317,-12.71885 12.86739,-18.26252c-4.81963,-1.36767 -10.43866,-7.64191 -14.77026,-5.92492c-9.40594,11.6946 -23.86844,18.55521 -38.9686,17.83661c-2.95601,0.97167 -18.03316,-1.47781 -13.95946,1.30438c10.65262,6.07415 21.03697,12.6707 32.05554,18.0621c7.71764,-4.11029 15.20781,-8.63805 22.77539,-13.01566zm-151.5623,3.30481c5.67309,-3.30481 11.34617,-6.60963 17.01924,-9.91444c-17.34076,-0.86164 -37.18572,1.63783 -50.29088,-12.30952c-3.69488,-4.13725 -7.23799,-8.87396 -12.35892,-3.66532c-6.13381,4.22582 -25.00066,8.5563 -10.4742,13.71487c12.64928,7.47227 25.20959,15.12685 38.17151,22.0463c6.1765,-2.89648 11.99872,-6.5165 17.93326,-9.87188zm83.14041,36.87479c7.35168,-5.90694 25.15858,-11.53461 25.75348,-17.87329c-16.62141,-9.56481 -32.75868,-20.2142 -50.14796,-28.29874c-5.98431,-2.2704 -10.83618,1.22306 -15.65312,4.25735c-14.24385,8.47255 -28.83041,16.41927 -42.61077,25.63122c18.02219,11.14435 36.26101,21.95917 54.67725,32.43958c9.39328,-5.26857 18.66512,-10.75249 27.98112,-16.15611zm73.75499,18.43738c7.62694,-4.81227 15.25389,-9.62453 22.88087,-14.43683c-0.06244,-16.11785 0.19498,-32.24243 -0.24597,-48.35465c-15.39334,8.58929 -30.56776,17.60745 -45.48607,26.99785c-1.63162,16.62392 -0.80414,33.52276 -0.44952,50.23046c7.87193,-4.6378 15.55261,-9.59819 23.30069,-14.43683zm-178.87355,-10.1545c0.77462,-13.73913 2.44441,-29.40098 -14.12444,-33.4709c-10.46331,-4.88007 -24.96637,-17.38377 -33.02728,-17.25835c-0.25115,15.4809 -0.11823,30.96465 -0.14541,46.44691c15.45605,9.64543 30.63783,19.75522 46.42746,28.8476c1.53102,-7.98021 0.53017,-16.43968 0.86967,-24.56526zm110.68056,53.19621c9.14198,-5.77156 18.28395,-11.54312 27.42593,-17.31468c-0.04233,-16.63979 0.64572,-33.30351 -0.10625,-49.92543c-10.04709,2.88116 -21.5385,11.78691 -32.12366,17.31859c-7.92599,4.64276 -15.85202,9.28555 -23.77802,13.92833c0.1563,17.76723 -0.42728,35.56691 0.57802,53.30783c9.47523,-5.53633 18.69861,-11.49898 28.00397,-17.31464zm-38.32249,-9.33929c0,-8.88464 0,-17.76929 0,-26.6539c-18.35233,-10.72505 -36.64592,-21.55176 -55.0698,-32.1535c-1.01884,16.98993 -0.43661,34.04375 -0.59025,51.06303c18.34824,11.48767 36.50635,23.28906 55.08669,34.3983c0.72301,-8.85316 0.45901,-17.77696 0.57336,-26.65393zm106.97165,35.71599c7.47931,-4.98045 14.95862,-9.96091 22.43796,-14.94136c-0.31207,-15.79037 0.77045,-31.79442 -0.80399,-47.41055c-15.55414,8.87424 -30.56544,18.97736 -45.84236,28.4509c0.367,16.33781 -0.75356,32.86267 0.93411,49.06088c7.89078,-4.84329 15.54118,-10.07089 23.27428,-15.15987zm-179.49486,-8.85234c-0.06088,-8.2791 -0.12183,-16.55821 -0.18272,-24.8373c-15.452,-9.6673 -30.70933,-19.65799 -46.39347,-28.94519c-0.98154,15.8615 -0.42208,31.78482 -0.5697,47.67464c15.58812,10.31845 31.00088,20.91034 46.79801,30.90671c0.60526,-8.24165 0.30488,-16.53903 0.34788,-24.79886zm111.24078,54.40674c9.07924,-6.02985 18.15848,-12.05969 27.23772,-18.08952c-0.02109,-16.81348 0.32051,-33.6342 -0.13127,-50.44193c-18.48172,11.39566 -36.8398,23.00107 -55.0625,34.8063c-2.05943,16.23506 -0.72412,32.97392 -0.72713,49.38643c5.65578,3.44495 20.11658,-11.82266 28.68318,-15.66129zm-38.71758,-7.19754c-1.09789,-11.59346 4.72185,-27.9119 -10.01297,-32.40633c-14.85952,-9.4117 -29.65931,-18.92612 -44.71436,-28.02278c-2.19433,15.91664 0.10065,32.49809 -1.58499,48.60945c18.05386,13.0511 36.5795,25.52769 55.44263,37.37666c1.51289,-8.30347 0.57193,-17.09903 0.86969,-25.55701zm-63.13967,-3.06479c-21.97403,-14.66875 -43.94805,-29.33749 -65.92206,-44.00621c0.02491,-45.26978 -0.60055,-90.55044 0.20291,-135.81172c11.00354,-6.78941 22.71307,-12.35508 34.0373,-18.58421c-7.3143,-20.93821 3.23879,-46.38257 24.44761,-54.21996c17.77897,-7.29492 39.21008,-0.71179 50.54502,14.64528c8.23304,-4.22243 16.4661,-8.44486 24.69915,-12.66729c8.27725,4.26063 16.55455,8.52126 24.83179,12.78188c11.86055,-14.06895 32.18082,-22.09776 49.79013,-14.21312c21.13718,7.42951 32.65843,32.817 25.07826,53.72234c11.40756,6.44052 23.81024,11.47337 34.26968,19.33245c0.46368,45.00166 0.00415,90.00995 -0.0379,135.01437c-43.72298,28.93527 -86.73743,58.97507 -131.17026,86.81018c-12.92032,-0.00348 -24.07242,-14.03217 -36.06157,-19.72c-11.59096,-7.66315 -23.15266,-15.37048 -34.71011,-23.08398z",
            	"globe": "m33.11721,223.16701l233.44794,0.08913l-7.57544,11.19618l-218.20762,-0.26738l-7.66489,-11.01793zm1.60428,-148.93458l230.3285,-0.26738l6.68439,11.48557l-243.78651,0.08913l6.77362,-11.30732zm-22.73061,74.62911l275.61135,-0.26738l-0.35626,11.48558l-275.07684,-0.17825l-0.17825,-11.03995zm275.8395,1.06528c0,76.03723 -61.86858,137.89429 -137.92784,137.89429c-76.0264,0 -137.88345,-61.86824 -137.88345,-137.89429c0,-76.02642 61.86823,-137.88347 137.88345,-137.88347c76.05927,-0.01117 137.92784,61.85705 137.92784,137.88347zm-137.91701,-148.93459c-82.09525,0 -148.90104,66.8058 -148.90104,148.92339c0,82.12878 66.8058,148.93457 148.90104,148.93457c82.13995,0 148.93459,-66.80579 148.93459,-148.93457c0,-82.11759 -66.79463,-148.92339 -148.93459,-148.92339zm41.78581,148.93459c0,81.25211 -22.01353,137.89429 -41.78581,137.89429c-19.74991,0 -41.76309,-56.64218 -41.76309,-137.89429c0,-81.27448 22.00233,-137.88347 41.76309,-137.88347c19.76112,-0.01117 41.78581,56.60899 41.78581,137.88347zm-41.78581,-148.93459c-34.29579,0 -52.80304,76.73613 -52.80304,148.92339c0,72.2093 18.50725,148.93457 52.80304,148.93457c34.29614,0 52.83693,-76.73643 52.83693,-148.93457c-0.01118,-72.18726 -18.54079,-148.92339 -52.83693,-148.92339zm97.86217,148.93459c0,76.03723 -43.91597,137.89429 -97.86217,137.89429c-53.93499,0 -97.82862,-61.86824 -97.82862,-137.89429c0,-76.02642 43.89363,-137.88347 97.82862,-137.88347c53.9462,-0.01117 97.86217,61.85705 97.86217,137.88347zm-97.86217,-148.93459c-60.01537,0 -108.86856,66.8058 -108.86856,148.92339c0,82.12878 48.85319,148.93457 108.86856,148.93457c60.03773,0 108.88008,-66.80579 108.88008,-148.93457c0,-82.11759 -48.84235,-148.92339 -108.88008,-148.92339z",
            	"handle_care": "m163.84105,276.49316c0,-16.9874 0,-26.73244 0,-43.71985c0,-23.90417 32.58113,-58.75496 53.7084,-83.18626c5.78004,-5.69962 16.17278,-7.90976 21.66074,-2.49817c4.87456,4.80672 4.50662,16.61058 0.6333,22.48335c-7.09361,10.6588 -14.18712,21.31755 -21.28073,31.97632c-3.55533,6.07231 5.16899,10.98973 10.38702,4.49673c27.24385,-36.8876 34.70512,-44.36621 34.70512,-59.20624c0,-30.31093 0,-29.89459 0,-60.20548c0,-8.67812 6.34686,-16.98743 14.45584,-16.98743c7.71677,0 14.4277,7.99146 14.4277,15.52406c0,48.96381 0,67.40421 0,116.36799c0,15.08096 -47.62817,60.69775 -47.62817,81.9498c0,4.99628 0,9.99255 0,14.98889c-27.02963,0 -54.05942,0 -81.08914,0c0.00577,-7.32791 0.01431,-14.65582 0.02008,-21.9837zm-28.64365,0c0,-16.98746 0,-26.73244 0,-43.71985c0,-23.90422 -32.58104,-58.75496 -53.70833,-83.18626c-5.78003,-5.69962 -16.17277,-7.90976 -21.66072,-2.49817c-4.87465,4.80672 -4.50671,16.61058 -0.6334,22.48335c7.09362,10.6588 14.18714,21.31755 21.28075,31.97632c3.55531,6.07231 -5.16901,10.98973 -10.38705,4.49673c-27.24375,-36.8876 -34.70512,-44.36621 -34.70512,-59.20624c0,-30.31093 0,-29.89459 0,-60.20548c0,-8.67812 -6.34683,-16.98743 -14.45581,-16.98743c-7.71679,0 -14.42771,7.99146 -14.42771,15.52406c0,48.96381 0,67.40417 0,116.36799c0,15.08092 47.62818,60.69775 47.62818,81.9498c0,4.99628 0,9.99255 0,14.98889c27.02971,0 54.05941,0 81.08913,0c-0.00577,-7.32791 -0.01433,-14.65582 -0.02,-21.9837zm-42.88594,-214.71311l48.62654,36.4699l0,57.20769l-48.62654,-36.46989l0,-57.20769zm114.41537,0l-48.62654,36.4699l0,57.20769l48.62654,-36.46989l0,-57.20769zm-114.41537,-17.87738l57.20769,-42.90577l57.20769,42.90575l-57.20769,42.90577l-57.20769,-42.90574z",
            	"headphones": "m262.24301,276.32291c0,3.88873 -3.15054,7.03928 -7.03929,7.03928h-45.07771c-3.88873,0 -7.03928,-3.15054 -7.03928,-7.03928v-95.76917c0,-3.88843 3.15054,-7.03928 7.03928,-7.03928h45.07771c3.88875,0 7.03929,3.15085 7.03929,7.03928v95.76917zm-166.89014,0c0,3.88873 -3.15116,7.03928 -7.03929,7.03928h-45.07832c-3.88813,0 -7.03928,-3.15054 -7.03928,-7.03928v-95.76917c0,-3.88843 3.15115,-7.03928 7.03928,-7.03928h45.07832c3.88813,0 7.03929,3.15085 7.03929,7.03928v95.76917zm54.45998,-259.68797c-81.57039,0 -147.78664,65.61743 -148.80356,146.9389h25.82451c0.83739,-67.21309 55.56696,-121.44394 122.97905,-121.44394c67.41208,0 122.14168,54.23085 122.96928,121.44394h25.82391c-1.00656,-81.32147 -67.24229,-146.9389 -148.7932,-146.9389zm-148.59421,221.43015h25.35591v-74.64095h-25.35591v74.64095zm271.35417,-74.651v74.64127h26.29248v-74.64127h-26.29248z",
            	"hippie": "m126.57668,297.48117c-48.56062,-7.34268 -92.01251,-39.97321 -112.69057,-84.50511c-24.94552,-52.66977 -15.84542,-119.75688 23.8283,-162.85019c38.79855,-45.4432 106.09586,-61.79809 161.96931,-41.65034c58.35461,19.93039 100.52045,79.22475 99.29117,141.02438c1.2113,60.65196 -39.29578,118.84778 -96.0322,139.80408c-24.24886,9.49326 -50.68127,11.39462 -76.36598,8.17719zm8.7399,-92.17508c-0.08942,-7.31126 -0.17882,-14.62254 -0.26825,-21.93381c-20.52584,20.53458 -41.05166,41.06917 -61.57751,61.60378c17.64819,14.10371 39.22342,22.83827 61.57751,25.75548c0.29533,-21.80725 0.53749,-43.61626 0.26825,-65.42545zm48.5128,61.24323c14.52351,-4.28751 28.46933,-11.11562 40.24649,-20.66127c-9.32077,-13.4882 -22.68102,-24.26074 -33.95442,-36.33005c-8.88936,-8.88591 -17.77875,-17.77179 -26.66811,-26.6577c0,29.29706 0,58.59412 0,87.89117c6.88846,-0.91629 13.69307,-2.3291 20.37604,-4.24216zm-48.28273,-180.43147c0,-19.30317 0,-38.60634 0,-57.90951c-51.85052,5.59066 -97.82003,47.52976 -105.87597,99.4242c-5.92087,34.10992 2.2166,70.93011 24.35439,97.89821c27.17386,-27.16779 54.34772,-54.33559 81.52158,-81.50337c0,-19.30317 0,-38.60635 0,-57.90952zm116.00552,130.27736c29.94273,-44.68748 25.57903,-109.31516 -11.64191,-148.59046c-19.65836,-21.7875 -47.20416,-36.42821 -76.45694,-39.59642c0,38.6003 0,77.20061 0,115.80091c26.61343,26.23764 52.37032,53.38443 79.88922,78.67319c3.85712,4.56624 5.79269,-4.75352 8.20963,-6.28722z",
            	"house": "m21.15257,177.09065c0,-27.41002 0,-54.82008 0,-82.2301c-6.68203,1.86892 -13.14774,5.87402 -20.15257,5.63974c7.71781,-7.14793 21.82513,-9.41176 32.30949,-14.09891c45.79581,-16.133 91.60535,-32.4141 138.27387,-45.86145c13.50775,-0.66366 26.30505,7.15431 39.33269,10.42321c29.47861,10.57565 59.53784,19.97857 88.07501,32.90813c-6.51614,8.73929 -28.58875,5.06429 -25.73117,21.53019c-2.00067,45.62614 -0.83817,91.32375 -1.14786,136.98345c-18.99269,5.63184 -37.89932,11.84375 -56.94553,17.1149c-64.67134,-0.05981 -129.3426,-0.11945 -194.01394,-0.17902c0,-27.40996 0,-54.82036 0,-82.23004l0,-0.00011zm26.14161,31.25392c0,-16.12061 0,-32.24124 0,-48.36197c16.55636,0 33.11272,0 49.66908,0c0,32.24136 0,64.4827 0,96.724c38.34103,0 76.68204,0 115.02308,0c0,-54.026 0,-108.05197 0,-162.07799c-62.73987,0 -125.47972,0 -188.2196,0c0,54.02602 0,108.05199 0,162.07799c7.84248,0 15.68497,0 23.52745,0c0,-16.12067 0,-32.2413 0,-48.36203zm99.33812,-27.44867c0,-6.97108 0,-13.94214 0,-20.9133c13.07082,0 26.14162,0 39.21243,0c0,13.94221 0,27.88445 0,41.82658c-13.07082,0 -26.14162,0 -39.21243,0c0,-6.97108 0,-13.94214 0,-20.91328zm33.9841,1.30707c0,-5.66399 0,-11.32797 0,-16.99203c-9.58527,0 -19.17052,0 -28.75577,0c0,11.32805 0,22.65611 0,33.98409c9.58525,0 19.1705,0 28.75577,0c0,-5.66399 0,-11.32797 0,-16.99205zm-86.2673,28.75577c0,-15.24922 0,-30.4985 0,-45.7478c-14.8136,0 -29.62717,0 -44.44075,0c0.28782,29.49963 -0.86703,59.06848 1.39272,88.50464c7.32339,4.61035 18.6494,2.34561 27.75799,2.99103c5.09669,0 10.19335,0 15.29005,0c0,-15.24927 0,-30.49857 0,-45.74786zm150.9678,34.15282c7.18895,-2.37781 14.3779,-4.75565 21.56683,-7.13347c-0.32449,-45.85204 0.98636,-91.75861 -1.60782,-137.55795c-6.33264,-8.04385 -23.37172,10.13716 -33.97191,1.44468c-8.98801,-5.39767 -16.23575,-5.6667 -13.48424,6.8141c-0.6041,45.64783 -1.40456,91.35368 0.49997,136.97478c-2.32346,17.3029 19.61401,-1.57974 26.99716,-0.54214zm17.56241,-152.88132c5.81549,-2.74289 29.11139,-6.01917 13.28293,-11.03122c-31.02148,-13.18587 -62.53795,-25.50377 -94.87346,-35.06522c-13.26736,-1.87402 -25.71394,5.23786 -38.28336,8.42139c-7.2287,0.92986 -14.03493,6.61982 -2.78639,8.23806c33.43919,12.5762 66.81393,25.55496 101.06847,35.75281c7.2216,-1.29286 14.41238,-4.37938 21.59181,-6.31581zm-104.48328,-16.97943c-12.19943,-4.63456 -24.39883,-9.26913 -36.59824,-13.9037c-25.6514,8.95505 -51.55341,17.25012 -76.89988,27.03273c49.99152,1.67495 100.06706,0.58957 150.09639,0.77469c-12.19943,-4.6346 -24.39885,-9.26915 -36.59827,-13.90372z",
            	"keep_up": "m79,1l-21.3,35.5l-21.3,35.5l19.88,0l0,184.60001l45.44,0l0,-184.60001l19.88,0l-21.3,-35.5l-21.3,-35.5zm142.00002,0l-21.30002,35.5l-21.29999,35.5l19.88,0l0,184.60001l45.43999,0l0,-184.60001l19.88,0l-21.3,-35.5l-21.29999,-35.5zm-213.00002,269.80002l0,28.39999l284,0l0,-28.39999l-284,0z",
            	"new_born": "m137.15491,103.06109c-14.77614,-3.80736 -27.4188,-14.09921 -33.90258,-27.59863c-3.9915,-8.31045 -4.89106,-12.46352 -4.90182,-22.63058c-0.01103,-10.43683 0.90331,-14.55167 5.14873,-23.17045c6.5289,-13.25453 17.58841,-22.50933 32.02396,-26.7982c7.85696,-2.33434 19.44511,-2.4919 27.41292,-0.37272c10.68681,2.84234 20.56245,9.23503 27.27812,17.65763c11.44406,14.35284 14.51639,32.93808 8.33334,50.41059c-2.37558,6.7131 -5.38321,11.61306 -10.48294,17.07855c-7.51927,8.05854 -15.46124,12.82613 -25.72244,15.44125c-6.92987,1.76612 -18.2959,1.75824 -25.18729,-0.01743zm46.99359,76.71874c0,-11.66681 -0.15546,-21.21237 -0.34546,-21.21237c-0.55267,0 -23.15134,19.0079 -23.15134,19.47273c0,0.59862 22.40039,22.95203 23.00027,22.95203c0.2731,0 0.49652,-9.54558 0.49652,-21.21239zm-8.12837,89.58151c3.13896,-3.60342 5.94908,-9.57928 7.16283,-15.23215c0.75183,-3.5016 0.8862,-7.28795 0.60019,-16.91275l-0.36856,-12.40109l-33.73602,-33.39706c-29.396,-29.10065 -33.79212,-33.21501 -34.172,-31.98175c-0.2398,0.77843 -0.30579,13.66176 -0.14668,28.62961l0.28934,27.21429l28.53863,28.41072c15.69623,15.6259 28.73599,28.41826 28.97726,28.42744c0.24127,0.00919 1.52603,-1.23157 2.85503,-2.75726zm-21.12221,12.22665c0.5526,-0.21207 -6.52711,-7.73318 -19.03375,-20.22046c-15.75389,-15.72952 -20.00713,-19.64691 -20.36126,-18.75351c-0.82094,2.07094 -0.552,9.37703 0.49458,13.43619c3.03795,11.78281 12.81967,21.70416 24.49419,24.84378c3.43257,0.92316 12.65175,1.36725 14.40625,0.694zm-14.69553,16.96454c-19.19916,-3.63824 -34.22623,-17.37338 -40.35254,-36.88327l-1.52992,-4.87216l0,-51.56241c0,-48.09848 0.08022,-51.82547 1.1941,-55.47855c5.75462,-18.87271 18.67331,-31.86444 36.79293,-37.00092c7.28899,-2.06625 19.90268,-2.05429 27.24492,0.02586c17.6541,5.00159 31.24332,18.57871 36.39166,36.35935l1.50121,5.18457l0,50.90973l0,50.90971l-1.50121,5.18457c-2.97653,10.27997 -9.29736,19.97147 -17.27997,26.49481c-4.88281,3.99017 -14.22415,8.68716 -20.0538,10.08334c-6.28586,1.50537 -16.34073,1.79504 -22.40738,0.64539z",
            	"officer_2": "m144.87212,278.09424c0,-7.03476 0,-14.06952 0,-21.10431c34.12148,-0.13669 68.24295,-0.27335 102.36444,-0.41003c0,-6.63841 0,-13.27682 0,-19.91524c-26.94872,-0.26555 -53.89742,-0.53107 -80.84613,-0.79662c30.82893,-41.42374 61.65785,-82.8475 92.48683,-124.27124c13.28885,-1.73074 25.24835,9.13577 26.16702,22.30508c1.37796,55.08076 0.61356,110.19873 0.82785,165.29666c-46.99997,0 -94,0 -141.00003,0c0.00002,-7.03473 0,-14.06952 0.00002,-21.10431zm-0.19199,-87.83214c-0.06876,-13.74153 -0.13754,-27.48306 -0.20631,-41.22459c-14.64618,18.8075 -27.62093,39.06267 -43.91019,56.48129c-14.42976,9.56055 -27.65941,-6.01018 -38.58159,-13.69254c-15.26907,-12.11603 -30.9411,-23.83286 -45.24117,-37.08727c-8.74276,-13.13181 5.83314,-31.80238 20.70509,-26.84245c13.32168,6.5739 23.96796,17.78835 36.01906,26.44797c7.16664,7.87663 15.75377,12.89487 20.74445,-0.10861c10.61151,-12.96709 19.11472,-28.05023 32.18712,-38.75249c13.16731,-7.35264 29.1156,-2.93422 43.48628,-4.27982c21.93321,0.06611 43.87927,-0.19524 65.80286,0.42785c-29.83961,40.18141 -59.99303,80.13989 -90.45013,119.85524c-0.51442,-13.73006 -0.41658,-27.48491 -0.55545,-41.22459zm49.58183,-93.47518c-17.8813,-2.9394 -31.59131,-19.77306 -31.46613,-37.7664c-6.28482,-0.26553 -12.56969,-0.53107 -18.85452,-0.79661c5.37549,-6.77119 10.75095,-13.54238 16.12643,-20.31357c26.79919,0 53.59842,0 80.39761,0c-0.07553,16.83184 2.11966,36.40314 -12.31944,48.47567c-8.59595,8.79105 -21.9399,12.10719 -33.88396,10.40091zm-44.65282,-80.96436c-3.48923,-6.17941 -15.89734,-17.4112 -0.91945,-14.28427c30.58981,-0.43799 61.18378,-0.21775 91.77567,-0.27203c0,9.29378 0,18.58757 0,27.88137c-27.24594,0 -54.49188,0 -81.73782,0c-3.03946,-4.44169 -6.07892,-8.88338 -9.11839,-13.32506z",
            	"officer": "m127.65893,298.12302c-11.91827,-4.4541 -8.85096,-18.47458 -9.45842,-28.44775c-0.14007,-38.77051 -0.03694,-77.54163 -0.06789,-116.31239c21.30015,-0.31718 42.6003,-0.76093 63.90377,-0.70047c-0.02318,44.52536 0.58119,89.061 -0.14537,133.57832c-0.57059,11.93384 -13.89935,13.46393 -23.22325,12.30963c-10.33765,0.00372 -20.67488,-0.15573 -31.00884,-0.42734zm-30.7055,-116.03563c-6.74483,-0.72377 -12.32703,-17.61749 -4.40458,-17.57693c6.23801,-0.08125 12.47601,-0.16251 18.71403,-0.24377c1.007,8.20691 -1.59957,19.89343 -12.37878,18.21895l-1.93067,-0.39824l0,0zm99.85623,-0.00661c-6.98207,-0.87273 -10.75342,-15.40816 -5.67188,-17.55357c6.66685,-0.08684 13.33371,-0.17369 20.00055,-0.26053c1.00876,8.20958 -1.60458,19.90276 -12.38809,18.21675l-1.94055,-0.40263c0,0 -0.00003,0 -0.00003,0zm-107.61794,-56.49044c0.54922,-13.57674 -1.08583,-27.43726 1.69075,-40.79832c4.06557,-10.40357 13.92722,-19.77089 25.33163,-20.63995c23.60493,0.19927 47.27207,-1.00478 70.82676,0.54259c14.04367,3.09693 25.24931,16.9698 23.91605,31.57756c0.32544,21.70094 0.15948,43.40639 0.24002,65.10946c-7.41772,0.09508 -14.83545,0.19016 -22.25314,0.28525c0,-19.53377 0,-39.06755 0,-58.60133c-4.34856,-5.08821 -8.05232,1.74921 -6.5546,6.09985c-0.01697,13.17788 -0.03394,26.35577 -0.05093,39.53365c-21.48996,0 -42.97992,0 -64.46988,0c-0.17615,-15.26811 -0.35229,-30.53623 -0.52844,-45.80434c-4.21338,-4.81828 -7.17517,1.78474 -5.83627,5.79053c-0.07101,17.56546 -0.14203,35.13091 -0.21304,52.69639c-7.42339,0.09512 -14.84679,0.19028 -22.27019,0.28539c0.0571,-12.02556 0.11414,-24.05119 0.17128,-36.07671zm56.41985,-70.72921c-11.43472,-2.06434 -20.27027,-12.69278 -20.54277,-24.26873c16.53569,0 33.07137,0 49.60706,0c0.58516,15.06838 -14.48488,27.02206 -29.06429,24.26873zm-25.62941,-33.78068c2.8164,-2.81977 5.23412,-6.59949 9.76779,-5.28442c14.97531,0 29.95061,0 44.9259,0c-0.48174,3.25565 0.91423,8.389 -0.64331,10.56883c-19.77167,0 -39.54332,0 -59.31499,0c1.75487,-1.76147 3.50974,-3.52295 5.26459,-5.28442zm18.8918,-9.34585c-4.62387,-0.06122 -9.24773,-0.12243 -13.8716,-0.18365c0.48279,-3.24875 -0.91532,-8.37839 0.64332,-10.55128c16.34338,0 32.6868,0 49.0302,0c-0.48172,3.25588 0.91423,8.38858 -0.64331,10.56913c-11.722,-0.07703 -23.43608,0.45157 -35.1586,0.1658zm24.67688,286.6952c-6.54985,-2.25 -11.37944,-9.11417 -10.08943,-16.07803c-0.23178,-33.13365 0.30627,-66.28789 -0.62375,-99.40492c-7.52885,-8.41364 -5.32481,11.97667 -5.61325,16.63527c-0.40672,29.85049 0.65932,59.77377 -0.79054,89.57779c-1.03221,6.81601 -14.93086,10.39682 -2.36958,9.16388c6.49333,0.08212 12.9946,0.3678 19.48656,0.10602z",
            	"recycle_2": "m70.51852,115.61727c18.49814,35.46731 22.10944,46.23824 15.99329,47.70097c-11.94749,2.85741 -9.54662,19.19937 7.17589,48.84396c20.97182,37.17758 62.04919,60.008 100.6335,55.93118c14.9762,-1.5824 31.90746,-4.84808 37.62502,-7.25717c5.71753,-2.40912 2.20903,2.0788 -7.79668,9.97308c-50.05432,39.49167 -111.87362,36.74075 -161.19199,-7.17288c-19.66416,-17.50925 -46.71899,-68.66641 -46.71899,-88.33963c0,-5.57329 -4.46041,-10.97359 -9.91201,-12.0006c-8.91546,-1.67957 -7.71816,-6.10193 11.90882,-43.98632c12.00147,-23.16548 23.29887,-43.78072 25.10535,-45.81163c1.80651,-2.03091 14.03651,16.92264 27.17781,42.11903zm159.00744,68.37661c-18.49815,-35.4673 -22.10944,-46.23827 -15.99332,-47.70097c11.94749,-2.85736 9.54663,-19.19936 -7.17586,-48.84396c-20.97183,-37.17759 -62.04924,-60.00801 -100.63353,-55.9312c-14.9762,1.58238 -31.90743,4.84812 -37.62498,7.25722c-5.71756,2.40907 -2.20905,-2.07883 7.79666,-9.9731c50.05433,-39.49169 111.87363,-36.74079 161.192,7.1729c19.66417,17.50919 46.71898,68.66639 46.71898,88.33957c0,5.57333 4.46045,10.97359 9.91199,12.0006c8.9155,1.6796 7.71817,6.10193 -11.90878,43.98634c-12.00146,23.16545 -23.29889,43.7807 -25.10535,45.81163c-1.80652,2.03091 -14.03651,-16.92262 -27.17781,-42.11902z",
            	"shield_1": "m235.43118,0.99993c-25.8405,20.89055 -61.5569,21.09333 -87.59367,0.62283c-25.04173,19.6952 -59.05148,20.25899 -84.60652,1.69064l-45.9514,49.35802c28.26655,30.91131 28.10226,80.57548 -0.48303,111.27486c-3.79379,10.48137 -5.78214,9.97594 -6.19602,20.53111c-0.97335,25.41245 4.72666,49.11902 22.58091,66.97356c15.9491,15.9491 37.5927,22.71344 58.38308,20.29993c34.71738,1.92664 51.36115,18.07672 58.34494,27.73621c9.4303,-10.32108 24.09528,-26.91339 68.66653,-28.98181c26.60716,-4.12497 36.22241,-10.78885 48.70973,-23.10918c16.80759,-16.80759 22.6846,-38.091 22.18927,-61.73892c-0.20569,-9.81746 -1.32416,-13.23065 -6.84674,-25.76584c-28.71786,-30.84172 -28.73875,-80.82797 -0.07623,-111.70699l-47.12085,-47.18442z",
            	"smoking": "m1.00013,234.70761c0,-6.75858 0,-13.51718 0,-20.27576c85.15819,0 170.31638,0 255.47457,0c0,13.51718 0,27.03435 0,40.55151c-85.15819,0 -170.31638,0 -255.47457,0c0,-6.75858 0,-13.51717 0,-20.27576zm262.90899,-0.33792c0,-6.87125 0,-13.74248 0,-20.61369c4.50577,0 9.01147,0 13.51718,0c0,13.74245 0,27.48491 0,41.22737c-4.50571,0 -9.01141,0 -13.51718,0c0,-6.87125 0,-13.74246 0,-20.61368zm21.62747,0c0,-6.87125 0,-13.74248 0,-20.61369c4.50574,0 9.01147,0 13.51718,0c0,13.74245 0,27.48491 0,41.22737c-4.50571,0 -9.01144,0 -13.51718,0c0,-6.87125 0,-13.74246 0,-20.61368zm-21.62747,-38.40129c2.33044,-12.44823 -4.64667,-27.35672 -18.89619,-26.91631c-16.51076,-0.91339 -33.27669,-0.16469 -49.68698,-1.22891c-15.92004,-5.44565 -24.6412,-22.87308 -22.39098,-39.09009c-2.60393,-4.6821 -13.75305,-3.34301 -18.33653,-8.47466c-22.34129,-12.77989 -25.34413,-47.04951 -6.6355,-64.35941c6.55362,-6.74706 19.10332,-12.28213 27.40872,-10.56472c0,4.27357 0,8.54715 0,12.82071c-17.16693,0.19163 -30.20795,18.71787 -25.17886,34.95034c3.93155,16.28817 21.44681,21.17548 36.06943,21.4035c9.34369,7.54165 -5.73552,20.54516 2.38481,30.40595c5.4973,13.38734 21.79352,9.01994 33.15524,10.07909c16.32292,0.98282 36.22006,-2.88133 48.06549,11.43753c10.15674,11.08647 7.03754,26.81902 7.55853,40.56599c-4.50571,0 -9.01141,0 -13.51718,0c0,-3.67633 0,-7.35268 0,-11.02902zm21.44409,-5.02264c1.06424,-17.34164 -3.94,-36.41237 -18.82684,-46.85637c-14.2328,-10.82034 -32.68178,-7.49533 -49.35545,-8.05716c-10.44089,-9.26265 6.69904,-19.729 4.85689,-30.88184c1.16321,-14.61189 -8.86084,-28.86267 -23.32887,-32.0012c-8.26547,0.48857 -11.4507,-1.71243 -9.8101,-9.54141c-2.56769,-10.66179 12.99852,-3.08173 18.15088,-2.147c18.80948,6.74871 31.28568,27.05275 28.30017,46.93802c-0.48553,7.00495 -7.28169,16.99163 4.77028,14.2243c23.42943,-1.23563 45.83046,13.98601 54.11491,35.81352c6.09546,15.43478 4.5502,32.30844 4.8287,48.56076c-4.44968,0 -8.89935,0 -13.34903,0c-0.11716,-5.35051 -0.23438,-10.70122 -0.35153,-16.05162z",
            	"stairs": "m2.18934,245.58681c17.86729,-0.11601 35.73457,-0.23204 53.60186,-0.34804c0.11764,-18.34987 0.23526,-36.69974 0.35289,-55.04959c17.78193,0 35.56387,0 53.34581,0c0,-18.46245 0,-36.9249 0,-55.38734c18.2373,0 36.47458,0 54.71188,0c0,-18.01214 0,-36.02428 0,-54.03642c18.01213,0 36.02426,0 54.03641,0c0,-18.01213 0,-36.02428 0,-54.03642c26.79306,0 53.58612,0 80.37918,0c0,9.00607 0,18.01214 0,27.01821c-17.78702,0 -35.57397,0 -53.36099,0c0,18.23729 0,36.47458 0,54.71188c-18.01212,0 -36.02425,0 -54.03641,0c0,18.2373 0,36.47459 0,54.71188c-18.01215,0 -36.02426,0 -54.03641,0c0,18.23729 0,36.47459 0,54.71185c-18.2373,0 -36.47459,0 -54.71187,0c0,18.46246 0,36.9249 0,55.38733c-27.01822,0 -54.03642,0 -81.05463,0c1.20448,-8.94977 -2.05336,-19.04163 0.77228,-27.68333z",
            	"umbrella": "m138.31999,1l0,29.565c-75.13835,4.16908 -134.31995,48.17229 -134.31999,101.835c0,-9.67107 16.35202,-17.51999 36.5,-17.51999c20.14798,0 36.5,7.84892 36.5,17.51999c0,-9.67107 16.35202,-17.51999 36.5,-17.51999c9.59525,0 18.30284,1.83565 24.81999,4.745l0,144.17499c0,6.44742 -5.23262,11.68002 -11.67999,11.68002c-6.44734,0 -11.68,-5.2326 -11.68,-11.68002l0,-5.84l-23.36,0l0,5.84c0,19.34207 15.6979,35.04001 35.04,35.04001c19.34206,0 35.04001,-15.69794 35.04001,-35.04001l0,-144.17499c6.51714,-2.90935 15.22475,-4.745 24.81999,-4.745c20.14798,0 36.5,7.84892 36.5,17.51999c0,-9.67107 16.35202,-17.51999 36.5,-17.51999c20.14798,0 36.5,7.84892 36.5,17.51999c0,-53.66274 -59.18159,-97.66592 -134.31999,-101.835l0,-29.565l-23.36002,0z",
            	"yin_yang": "m152.3828,1.00127c40.96666,0 74.20116,33.2665 74.20116,74.23316c0,40.96668 -33.2345,74.20117 -74.20116,74.20117c-40.96668,0 -74.20118,33.26653 -74.20118,74.23318c0,40.96667 33.2345,74.20117 74.20118,74.20117c81.93332,0 148.43431,-66.50104 148.43431,-148.43436c0,-81.93333 -66.50099,-148.43433 -148.43431,-148.43433zm0,51.0353c-12.80867,0 -23.19788,10.38917 -23.19788,23.19786c0,12.80871 10.38918,23.19786 23.19788,23.19786c12.80869,0 23.19785,-10.38917 23.19785,-23.19786c0,-12.80869 -10.38916,-23.19786 -23.19785,-23.19786zm0,148.43436c12.80206,0 23.19785,10.39577 23.19785,23.19786c0,12.80206 -10.39578,23.19788 -23.19785,23.19788c-12.80208,0 -23.19788,-10.39581 -23.19788,-23.19788c0,-12.80206 10.3958,-23.19786 23.19788,-23.19786zm145.10503,-50.94075c0,81.87245 -66.37071,148.24319 -148.24321,148.24319c-81.87246,0 -148.24321,-66.37074 -148.24321,-148.24319c0,-81.87248 66.37075,-148.24324 148.24321,-148.24324c81.8725,0 148.24321,66.37076 148.24321,148.24324z"
            	}
            }
        • closepath_icons.svg
          <svg xmlns="http://www.w3.org/2000/svg">
          <g id="tool_closepath">
          <svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <g>
            <title>Layer 1</title>
            <path stroke="#000" stroke-width="15" fill="#ffc8c8" d="m121.5,40l-84,106l27,115l166,2l29,-111"/>
            <line x1="240" y1="136" x2="169.5" y2="74" stroke="#A00" stroke-width="25" fill="none"/>
            <path stroke="none" fill ="#A00" d="m158,65l31,74l-3,-50l51,-3z"/>
            <g stroke-width="15" stroke="#00f" fill="#0ff">
            <circle r="30" cy="41" cx="123"/>
            <circle r="30" cy="146" cx="40"/>
            <circle r="30" cy="260" cx="69"/>
            <circle r="30" cy="260" cx="228"/>
            <circle r="30" cy="148" cx="260"/>
            </g>
           </g>
          </svg>
          </g>
          <g id="tool_openpath">
          <svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <g>
            <title>Layer 1</title>
            <path stroke="#000" stroke-width="15" fill="#ffc8c8" d="m123.5,38l-84,106l27,115l166,2l29,-111"/>
            <line x1="276.5" y1="153" x2="108.5" y2="24" stroke="#000" stroke-width="10" fill="none"/>
            <g stroke-width="15" stroke="#00f" fill="#0ff">
             <circle r="30" cy="41" cx="123"/>
             <circle r="30" cy="146" cx="40"/>
             <circle r="30" cy="260" cx="69"/>
             <circle r="30" cy="260" cx="228"/>
             <circle r="30" cy="148" cx="260"/>
            </g>
            <g  stroke="#A00" stroke-width="15" fill="none">
             <line x1="168" y1="24" x2="210" y2="150"/>
             <line x1="210" y1="24" x2="168" y2="150"/>
            </g>
           </g>
          </svg>
          </g>
          
          <g id="svg_eof"/>
          </svg>
        • ext-arrows.js
          /*globals svgEditor, svgCanvas, $*/
          /*jslint vars: true, eqeq: true*/
          /*
           * ext-arrows.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Alexis Deveria
           *
           */
          
          svgEditor.addExtension('Arrows', function(S) {
          	var svgcontent = S.svgcontent,
          		addElem = S.addSvgElementFromJson,
          		nonce = S.nonce,
          		randomize_ids = S.randomize_ids,
          		selElems, pathdata,
          		lang_list = {
          			'en':[
          				{'id': 'arrow_none', 'textContent': 'No arrow' }
          			],
          			'fr':[
          				{'id': 'arrow_none', 'textContent': 'Sans flèche' }
          			]
          		},
          		arrowprefix,
          		prefix = 'se_arrow_';
          
          	function setArrowNonce(window, n) {
          		randomize_ids = true;
          		arrowprefix = prefix + n + '_';
          		pathdata.fw.id = arrowprefix + 'fw';
          		pathdata.bk.id = arrowprefix + 'bk';
          	}
          
          	function unsetArrowNonce(window) {
          		randomize_ids = false;
          		arrowprefix = prefix;
          		pathdata.fw.id = arrowprefix + 'fw';
          		pathdata.bk.id = arrowprefix + 'bk';
          	}
          
          
          	svgCanvas.bind('setnonce', setArrowNonce);
          	svgCanvas.bind('unsetnonce', unsetArrowNonce);
          
          	if (randomize_ids) {
          		arrowprefix = prefix + nonce + '_';
          	} else {
          		arrowprefix = prefix;
          	}
          
          	pathdata = {
          		fw: {d: 'm0,0l10,5l-10,5l5,-5l-5,-5z', refx: 8,  id: arrowprefix + 'fw'},
          		bk: {d: 'm10,0l-10,5l10,5l-5,-5l5,-5z', refx: 2, id: arrowprefix + 'bk'}
          	};
          
          	function getLinked(elem, attr) {
          		var str = elem.getAttribute(attr);
          		if(!str) {return null;}
          		var m = str.match(/\(\#(.*)\)/);
          		if(!m || m.length !== 2) {
          			return null;
          		}
          		return S.getElem(m[1]);
          	}
          
          	function showPanel(on) {
          		$('#arrow_panel').toggle(on);
          		if(on) {
          			var el = selElems[0];
          			var end = el.getAttribute('marker-end');
          			var start = el.getAttribute('marker-start');
          			var mid = el.getAttribute('marker-mid');
          			var val;
          
          			if (end && start) {
          				val = 'both';
          			} else if (end) {
          				val = 'end';
          			} else if (start) {
          				val = 'start';
          			} else if (mid) {
          				val = 'mid';
          				if (mid.indexOf('bk') !== -1) {
          					val = 'mid_bk';
          				}
          			}
          
          			if (!start && !mid && !end) {
          				val = 'none';
          			}
          
          			$('#arrow_list').val(val);
          		}
          	}
          
          	function resetMarker() {
          		var el = selElems[0];
          		el.removeAttribute('marker-start');
          		el.removeAttribute('marker-mid');
          		el.removeAttribute('marker-end');
          	}
          
          	function addMarker(dir, type, id) {
          		// TODO: Make marker (or use?) per arrow type, since refX can be different
          		id = id || arrowprefix + dir;
          
          		var marker = S.getElem(id);
          		var data = pathdata[dir];
          
          		if (type == 'mid') {
          			data.refx = 5;
          		}
          
          		if (!marker) {
          			marker = addElem({
          				'element': 'marker',
          				'attr': {
          					'viewBox': '0 0 10 10',
          					'id': id,
          					'refY': 5,
          					'markerUnits': 'strokeWidth',
          					'markerWidth': 5,
          					'markerHeight': 5,
          					'orient': 'auto',
          					'style': 'pointer-events:none' // Currently needed for Opera
          				}
          			});
          			var arrow = addElem({
          				'element': 'path',
          				'attr': {
          					'd': data.d,
          					'fill': '#000000'
          				}
          			});
          			marker.appendChild(arrow);
          			S.findDefs().appendChild(marker);
          		}
          
          		marker.setAttribute('refX', data.refx);
          
          		return marker;
          	}
          
          	function setArrow() {
          		var type = this.value;
          		resetMarker();
          
          		if (type == 'none') {
          			return;
          		}
          
          		// Set marker on element
          		var dir = 'fw';
          		if (type == 'mid_bk') {
          			type = 'mid';
          			dir = 'bk';
          		} else if (type == 'both') {
          			addMarker('bk', type);
          			svgCanvas.changeSelectedAttribute('marker-start', 'url(#' + pathdata.bk.id + ')');
          			type = 'end';
          			dir = 'fw';
          		} else if (type == 'start') {
          			dir = 'bk';
          		}
          
          		addMarker(dir, type);
          		svgCanvas.changeSelectedAttribute('marker-' + type, 'url(#' + pathdata[dir].id + ')');
          		S.call('changed', selElems);
          	}
          
          	function colorChanged(elem) {
          		var color = elem.getAttribute('stroke');
          		var mtypes = ['start', 'mid', 'end'];
          		var defs = S.findDefs();
          
          		$.each(mtypes, function(i, type) {
          			var marker = getLinked(elem, 'marker-'+type);
          			if(!marker) {return;}
          
          			var cur_color = $(marker).children().attr('fill');
          			var cur_d = $(marker).children().attr('d');
          			var new_marker = null;
          			if(cur_color === color) {return;}
          
          			var all_markers = $(defs).find('marker');
          			// Different color, check if already made
          			all_markers.each(function() {
          				var attrs = $(this).children().attr(['fill', 'd']);
          				if(attrs.fill === color && attrs.d === cur_d) {
          					// Found another marker with this color and this path
          					new_marker = this;
          				}
          			});
          
          			if(!new_marker) {
          				// Create a new marker with this color
          				var last_id = marker.id;
          				var dir = last_id.indexOf('_fw') !== -1?'fw':'bk';
          
          				new_marker = addMarker(dir, type, arrowprefix + dir + all_markers.length);
          
          				$(new_marker).children().attr('fill', color);
          			}
          
          			$(elem).attr('marker-'+type, 'url(#' + new_marker.id + ')');
          
          			// Check if last marker can be removed
          			var remove = true;
          			$(S.svgcontent).find('line, polyline, path, polygon').each(function() {
          				var elem = this;
          				$.each(mtypes, function(j, mtype) {
          					if($(elem).attr('marker-' + mtype) === 'url(#' + marker.id + ')') {
          						remove = false;
          						return remove;
          					}
          				});
          				if(!remove) {return false;}
          			});
          
          			// Not found, so can safely remove
          			if(remove) {
          				$(marker).remove();
          			}
          		});
          	}
          
          	return {
          		name: 'Arrows',
          		context_tools: [{
          			type: 'select',
          			panel: 'arrow_panel',
          			title: 'Select arrow type',
          			id: 'arrow_list',
          			options: {
          				none: 'No arrow',
          				end: '----&gt;',
          				start: '&lt;----',
          				both: '&lt;---&gt;',
          				mid: '--&gt;--',
          				mid_bk: '--&lt;--'
          			},
          			defval: 'none',
          			events: {
          				change: setArrow
          			}
          		}],
          		callback: function() {
          			$('#arrow_panel').hide();
          			// Set ID so it can be translated in locale file
          			$('#arrow_list option')[0].id = 'connector_no_arrow';
          		},
          		addLangData: function(lang) {
          			return {
          				data: lang_list[lang]
          			};
          		},
          		selectedChanged: function(opts) {
          			// Use this to update the current selected elements
          			selElems = opts.elems;
          
          			var i = selElems.length;
          			var marker_elems = ['line', 'path', 'polyline', 'polygon'];
          			while(i--) {
          				var elem = selElems[i];
          				if(elem && $.inArray(elem.tagName, marker_elems) !== -1) {
          					if(opts.selectedElement && !opts.multiselected) {
          						showPanel(true);
          					} else {
          						showPanel(false);
          					}
          				} else {
          					showPanel(false);
          				}
          			}
          		},
          		elementChanged: function(opts) {
          			var elem = opts.elems[0];
          			if(elem && (
          				elem.getAttribute('marker-start') ||
          				elem.getAttribute('marker-mid') ||
          				elem.getAttribute('marker-end')
          			)) {
          //								var start = elem.getAttribute('marker-start');
          //								var mid = elem.getAttribute('marker-mid');
          //								var end = elem.getAttribute('marker-end');
          				// Has marker, so see if it should match color
          				colorChanged(elem);
          			}
          		}
          	};
          });
          
        • ext-closepath.js
          /*globals svgEditor, $*/
          /*jslint vars: true, eqeq: true*/
          /*
           * ext-closepath.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Jeff Schiller
           *
           */
          
          // This extension adds a simple button to the contextual panel for paths
          // The button toggles whether the path is open or closed
          svgEditor.addExtension('ClosePath', function() {'use strict';
          	var selElems,
          		updateButton = function(path) {
          			var seglist = path.pathSegList,
          				closed = seglist.getItem(seglist.numberOfItems - 1).pathSegType == 1,
          				showbutton = closed ? '#tool_openpath' : '#tool_closepath',
          				hidebutton = closed ? '#tool_closepath' : '#tool_openpath';
          				$(hidebutton).hide();
          				$(showbutton).show();
          		},
          		showPanel = function(on) {
          			$('#closepath_panel').toggle(on);
          			if (on) {
          				var path = selElems[0];
          				if (path) {updateButton(path);}
          			}
          		},
          		toggleClosed = function() {
          			var path = selElems[0];
          			if (path) {
          				var seglist = path.pathSegList,
          					last = seglist.numberOfItems - 1;
          				// is closed
          				if (seglist.getItem(last).pathSegType == 1) {
          					seglist.removeItem(last);
          				} else {
          					seglist.appendItem(path.createSVGPathSegClosePath());
          				}
          				updateButton(path);
          			}
          		};
          
          	return {
          		name: 'ClosePath',
          		svgicons: svgEditor.curConfig.extPath + 'closepath_icons.svg',
          		buttons: [{
          			id: 'tool_openpath',
          			type: 'context',
          			panel: 'closepath_panel',
          			title: 'Open path',
          			events: {
          				click: function() {
          					toggleClosed();
          				}
          			}
          		},
          		{
          			id: 'tool_closepath',
          			type: 'context',
          			panel: 'closepath_panel',
          			title: 'Close path',
          			events: {
          				click: function() {
          					toggleClosed();
          				}
          			}
          		}],
          		callback: function() {
          			$('#closepath_panel').hide();
          		},
          		selectedChanged: function(opts) {
          			selElems = opts.elems;
          			var i = selElems.length;
          			while (i--) {
          				var elem = selElems[i];
          				if (elem && elem.tagName == 'path') {
          					if (opts.selectedElement && !opts.multiselected) {
          						showPanel(true);
          					} else {
          						showPanel(false);
          					}
          				} else {
          					showPanel(false);
          				}
          			}
          		}
          	};
          });
          
        • ext-connector.js
          /*globals svgEditor, svgCanvas, $*/
          /*jslint vars: true, continue: true, eqeq: true, todo: true*/
          /*
           * ext-connector.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Alexis Deveria
           *
           */
           
          svgEditor.addExtension("Connector", function(S) {
          	var svgcontent = S.svgcontent,
          		svgroot = S.svgroot,
          		getNextId = S.getNextId,
          		getElem = S.getElem,
          		addElem = S.addSvgElementFromJson,
          		selManager = S.selectorManager,
          		curConfig = svgEditor.curConfig,
          		started = false,
          		start_x,
          		start_y,
          		cur_line,
          		start_elem,
          		end_elem,
          		connections = [],
          		conn_sel = ".se_connector",
          		se_ns,
          //		connect_str = "-SE_CONNECT-",
          		selElems = [],
          		elData = $.data;
          		
          	var lang_list = {
          		"en":[
          			{"id": "mode_connect", "title": "Connect two objects" }
          		],
          		"fr":[
          			{"id": "mode_connect", "title": "Connecter deux objets"}
          		]
          	};
          
          	function getBBintersect(x, y, bb, offset) {
          		if(offset) {
          			offset -= 0;
          			bb = $.extend({}, bb);
          			bb.width += offset;
          			bb.height += offset;
          			bb.x -= offset/2;
          			bb.y -= offset/2;
          		}
          	
          		var mid_x = bb.x + bb.width/2;
          		var mid_y = bb.y + bb.height/2;
          		var len_x = x - mid_x;
          		var len_y = y - mid_y;
          		
          		var slope = Math.abs(len_y/len_x);
          		
          		var ratio;
          		
          		if(slope < bb.height/bb.width) {
          			ratio = (bb.width/2) / Math.abs(len_x);
          		} else {
          			ratio = (bb.height/2) / Math.abs(len_y);
          		}
          		
          		
          		return {
          			x: mid_x + len_x * ratio,
          			y: mid_y + len_y * ratio
          		};
          	}
          
          	function getOffset(side, line) {
          		var give_offset = !!line.getAttribute('marker-' + side);
          //		var give_offset = $(line).data(side+'_off');
          
          		// TODO: Make this number (5) be based on marker width/height
          		var size = line.getAttribute('stroke-width') * 5;
          		return give_offset ? size : 0;
          	}
          	
          	function showPanel(on) {
          		var conn_rules = $('#connector_rules');
          		if(!conn_rules.length) {
          			conn_rules = $('<style id="connector_rules"></style>').appendTo('head');
          		} 
          		conn_rules.text(!on?"":"#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }");
          		$('#connector_panel').toggle(on);
          	}
          	
          	function setPoint(elem, pos, x, y, setMid) {
          		var i, pts = elem.points;
          		var pt = svgroot.createSVGPoint();
          		pt.x = x;
          		pt.y = y;
          		if (pos === 'end') {pos = pts.numberOfItems - 1;}
          		// TODO: Test for this on init, then use alt only if needed
          		try {
          			pts.replaceItem(pt, pos);
          		} catch(err) {
          			// Should only occur in FF which formats points attr as "n,n n,n", so just split
          			var pt_arr = elem.getAttribute("points").split(" ");
          			for (i = 0; i < pt_arr.length; i++) {
          				if (i === pos) {
          					pt_arr[i] = x + ',' + y;
          				}
          			}
          			elem.setAttribute("points",pt_arr.join(" ")); 
          		}
          		
          		if(setMid) {
          			// Add center point
          			var pt_start = pts.getItem(0);
          			var pt_end = pts.getItem(pts.numberOfItems-1);
          			setPoint(elem, 1, (pt_end.x + pt_start.x)/2, (pt_end.y + pt_start.y)/2);
          		}
          	}
          	
          	function updateLine(diff_x, diff_y) {
          		// Update line with element
          		var i = connections.length;
          		while(i--) {
          			var conn = connections[i];
          			var line = conn.connector;
          			var elem = conn.elem;
          			
          			var pre = conn.is_start?'start':'end';
          //						var sw = line.getAttribute('stroke-width') * 5;
          			
          			// Update bbox for this element
          			var bb = elData(line, pre+'_bb');
          			bb.x = conn.start_x + diff_x;
          			bb.y = conn.start_y + diff_y;
          			elData(line, pre+'_bb', bb);
          			
          			var alt_pre = conn.is_start?'end':'start';
          			
          			// Get center pt of connected element
          			var bb2 = elData(line, alt_pre+'_bb');
          			var src_x = bb2.x + bb2.width/2;
          			var src_y = bb2.y + bb2.height/2;
          			
          			// Set point of element being moved
          			var pt = getBBintersect(src_x, src_y, bb, getOffset(pre, line)); // $(line).data(pre+'_off')?sw:0
          			setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true);
          			
          			// Set point of connected element
          			var pt2 = getBBintersect(pt.x, pt.y, elData(line, alt_pre + '_bb'), getOffset(alt_pre, line));
          			setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true);
          
          		}
          	}
          	
          	function findConnectors(elems) {
          		var i;
          		if (!elems) {elems = selElems;}
          		var connectors = $(svgcontent).find(conn_sel);
          		connections = [];
          
          		// Loop through connectors to see if one is connected to the element
          		connectors.each(function() {
          			var add_this;
          			function add () {
          				if ($.inArray(this, elems) !== -1) {
          					// Pretend this element is selected
          					add_this = true;
          				}
          			}
          			var start = elData(this, "c_start");
          			var end = elData(this, "c_end");
          			
          			var parts = [getElem(start), getElem(end)];
          			for (i = 0; i < 2; i++) {
          				var c_elem = parts[i];
          				add_this = false;
          				// The connected element might be part of a selected group
          				$(c_elem).parents().each(add);
          				
          				if(!c_elem || !c_elem.parentNode) {
          					$(this).remove();
          					continue;
          				}
          				if($.inArray(c_elem, elems) !== -1 || add_this) {
          					var bb = svgCanvas.getStrokedBBox([c_elem]);
          					connections.push({
          						elem: c_elem,
          						connector: this,
          						is_start: (i === 0),
          						start_x: bb.x,
          						start_y: bb.y
          					});	
          				}
          			}
          		});
          	}
          	
          	function updateConnectors(elems) {
          		// Updates connector lines based on selected elements
          		// Is not used on mousemove, as it runs getStrokedBBox every time,
          		// which isn't necessary there.
          		var i, j;
          		findConnectors(elems);
          		if (connections.length) {
          			// Update line with element
          			i = connections.length;
          			while (i--) {
          				var conn = connections[i];
          				var line = conn.connector;
          				var elem = conn.elem;
          
          				var sw = line.getAttribute('stroke-width') * 5;
          				var pre = conn.is_start?'start':'end';
          				
          				// Update bbox for this element
          				var bb = svgCanvas.getStrokedBBox([elem]);
          				bb.x = conn.start_x;
          				bb.y = conn.start_y;
          				elData(line, pre+'_bb', bb);
          				var add_offset = elData(line, pre+'_off');
          			
          				var alt_pre = conn.is_start?'end':'start';
          				
          				// Get center pt of connected element
          				var bb2 = elData(line, alt_pre+'_bb');
          				var src_x = bb2.x + bb2.width/2;
          				var src_y = bb2.y + bb2.height/2;
          				
          				// Set point of element being moved
          				var pt = getBBintersect(src_x, src_y, bb, getOffset(pre, line));
          				setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true);
          				
          				// Set point of connected element
          				var pt2 = getBBintersect(pt.x, pt.y, elData(line, alt_pre + '_bb'), getOffset(alt_pre, line));
          				setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true);
          				
          				// Update points attribute manually for webkit
          				if (navigator.userAgent.indexOf('AppleWebKit') !== -1) {
          					var pts = line.points;
          					var len = pts.numberOfItems;
          					var pt_arr = [];
          					for (j = 0; j < len; j++) {
          						pt = pts.getItem(j);
          						pt_arr[j] = pt.x + ',' + pt.y;
          					}
          					line.setAttribute('points', pt_arr.join(' ')); 
          				}
          			}
          		}
          	}
          	
          	// Do once
          	(function() {
          		var gse = svgCanvas.groupSelectedElements;
          		
          		svgCanvas.groupSelectedElements = function() {
          			svgCanvas.removeFromSelection($(conn_sel).toArray());
          			return gse.apply(this, arguments);
          		};
          		
          		var mse = svgCanvas.moveSelectedElements;
          		
          		svgCanvas.moveSelectedElements = function() {
          			svgCanvas.removeFromSelection($(conn_sel).toArray());
          			var cmd = mse.apply(this, arguments);
          			updateConnectors();
          			return cmd;
          		};
          		
          		se_ns = svgCanvas.getEditorNS();
          	}());
          	
          	// Do on reset
          	function init() {
          		// Make sure all connectors have data set
          		$(svgcontent).find('*').each(function() { 
          			var conn = this.getAttributeNS(se_ns, "connector");
          			if(conn) {
          				this.setAttribute('class', conn_sel.substr(1));
          				var conn_data = conn.split(' ');
          				var sbb = svgCanvas.getStrokedBBox([getElem(conn_data[0])]);
          				var ebb = svgCanvas.getStrokedBBox([getElem(conn_data[1])]);
          				$(this).data('c_start',conn_data[0])
          					.data('c_end',conn_data[1])
          					.data('start_bb', sbb)
          					.data('end_bb', ebb);
          				svgCanvas.getEditorNS(true);
          			}
          		});
          //		updateConnectors();
          	}
          
          //		$(svgroot).parent().mousemove(function(e) {
          // //			if(started 
          // //				|| svgCanvas.getMode() != "connector"
          // //				|| e.target.parentNode.parentNode != svgcontent) return;
          //
          //			console.log('y')
          // //			if(e.target.parentNode.parentNode === svgcontent) {
          // //					
          // //			}
          //		});
          
          	return {
          		name: "Connector",
          		svgicons: svgEditor.curConfig.imgPath + "conn.svg",
          		buttons: [{
          			id: "mode_connect",
          			type: "mode",
          			icon: svgEditor.curConfig.imgPath + "cut.png",
          			title: "Connect two objects",
          			includeWith: {
          				button: '#tool_line',
          				isDefault: false,
          				position: 1
          			},
          			events: {
          				'click': function() {
          					svgCanvas.setMode("connector");
          				}
          			}
          		}],
          		addLangData: function(lang) {
          			return {
          				data: lang_list[lang]
          			};
          		},
          		mouseDown: function(opts) {
          			var e = opts.event;
          			start_x = opts.start_x;
          			start_y = opts.start_y;
          			var mode = svgCanvas.getMode();
          			
          			if (mode == "connector") {
          				
          				if (started) {return;}
          
          				var mouse_target = e.target;
          				
          				var parents = $(mouse_target).parents();
          				
          				if($.inArray(svgcontent, parents) !== -1) {
          					// Connectable element
          					
          					// If child of foreignObject, use parent
          					var fo = $(mouse_target).closest("foreignObject");
          					start_elem = fo.length ? fo[0] : mouse_target;
          					
          					// Get center of source element
          					var bb = svgCanvas.getStrokedBBox([start_elem]);
          					var x = bb.x + bb.width/2;
          					var y = bb.y + bb.height/2;
          					
          					started = true;
          					cur_line = addElem({
          						"element": "polyline",
          						"attr": {
          							"id": getNextId(),
          							"points": (x+','+y+' '+x+','+y+' '+start_x+','+start_y),
          							"stroke": '#' + curConfig.initStroke.color,
          							"stroke-width": (!start_elem.stroke_width || start_elem.stroke_width == 0) ? curConfig.initStroke.width : start_elem.stroke_width,
          							"fill": "none",
          							"opacity": curConfig.initStroke.opacity,
          							"style": "pointer-events:none"
          						}
          					});
          					elData(cur_line, 'start_bb', bb);
          				}
          				return {
          					started: true
          				};
          			}
          			if (mode == "select") {
          				findConnectors();
          			}
          		},
          		mouseMove: function(opts) {
          			var zoom = svgCanvas.getZoom();
          			var e = opts.event;
          			var x = opts.mouse_x/zoom;
          			var y = opts.mouse_y/zoom;
          			
          			var	diff_x = x - start_x,
          				diff_y = y - start_y;
          								
          			var mode = svgCanvas.getMode();
          			
          			if (mode == "connector" && started) {
          				
          				var sw = cur_line.getAttribute('stroke-width') * 3;
          				// Set start point (adjusts based on bb)
          				var pt = getBBintersect(x, y, elData(cur_line, 'start_bb'), getOffset('start', cur_line));
          				start_x = pt.x;
          				start_y = pt.y;
          				
          				setPoint(cur_line, 0, pt.x, pt.y, true);
          				
          				// Set end point
          				setPoint(cur_line, 'end', x, y, true);
          			} else if (mode == "select") {
          				var slen = selElems.length;
          				
          				while(slen--) {
          					var elem = selElems[slen];
          					// Look for selected connector elements
          					if(elem && elData(elem, 'c_start')) {
          						// Remove the "translate" transform given to move
          						svgCanvas.removeFromSelection([elem]);
          						svgCanvas.getTransformList(elem).clear();
          
          					}
          				}
          				if(connections.length) {
          					updateLine(diff_x, diff_y);
          
          					
          				}
          			} 
          		},
          		mouseUp: function(opts) {
          			var zoom = svgCanvas.getZoom();
          			var e = opts.event,
          				x = opts.mouse_x/zoom,
          				y = opts.mouse_y/zoom,
          				mouse_target = e.target;
          			
          			if(svgCanvas.getMode() == "connector") {
          				var fo = $(mouse_target).closest("foreignObject");
          				if (fo.length) {mouse_target = fo[0];}
          				
          				var parents = $(mouse_target).parents();
          
          				if (mouse_target == start_elem) {
          					// Start line through click
          					started = true;
          					return {
          						keep: true,
          						element: null,
          						started: started
          					};
          				}
          				if ($.inArray(svgcontent, parents) === -1) {
          					// Not a valid target element, so remove line
          					$(cur_line).remove();
          					started = false;
          					return {
          						keep: false,
          						element: null,
          						started: started
          					};
          				}
          				// Valid end element
          				end_elem = mouse_target;
          					
          				var start_id = start_elem.id, end_id = end_elem.id;
          				var conn_str = start_id + " " + end_id;
          				var alt_str = end_id + " " + start_id;
          				// Don't create connector if one already exists
          				var dupe = $(svgcontent).find(conn_sel).filter(function() {
          					var conn = this.getAttributeNS(se_ns, "connector");
          					if (conn == conn_str || conn == alt_str) {return true;}
          				});
          				if(dupe.length) {
          					$(cur_line).remove();
          					return {
          						keep: false,
          						element: null,
          						started: false
          					};
          				}
          				
          				var bb = svgCanvas.getStrokedBBox([end_elem]);
          				
          				var pt = getBBintersect(start_x, start_y, bb, getOffset('start', cur_line));
          				setPoint(cur_line, 'end', pt.x, pt.y, true);
          				$(cur_line)
          					.data("c_start", start_id)
          					.data("c_end", end_id)
          					.data("end_bb", bb);
          				se_ns = svgCanvas.getEditorNS(true);
          				cur_line.setAttributeNS(se_ns, "se:connector", conn_str);
          				cur_line.setAttribute('class', conn_sel.substr(1));
          				cur_line.setAttribute('opacity', 1);
          				svgCanvas.addToSelection([cur_line]);
          				svgCanvas.moveToBottomSelectedElement();
          				selManager.requestSelector(cur_line).showGrips(false);
          				started = false;
          				return {
          					keep: true,
          					element: cur_line,
          					started: started
          				};
          			}
          		},
          		selectedChanged: function(opts) {
          			// TODO: Find better way to skip operations if no connectors are in use
          			if(!$(svgcontent).find(conn_sel).length) {return;}
          			
          			if(svgCanvas.getMode() == 'connector') {
          				svgCanvas.setMode('select');
          			}
          			
          			// Use this to update the current selected elements
          			selElems = opts.elems;
          			
          			var i = selElems.length;
          			
          			while(i--) {
          				var elem = selElems[i];
          				if(elem && elData(elem, 'c_start')) {
          					selManager.requestSelector(elem).showGrips(false);
          					if(opts.selectedElement && !opts.multiselected) {
          						// TODO: Set up context tools and hide most regular line tools
          						showPanel(true);
          					} else {
          						showPanel(false);
          					}
          				} else {
          					showPanel(false);
          				}
          			}
          			updateConnectors();
          		},
          		elementChanged: function(opts) {
          			var elem = opts.elems[0];
          			if (elem && elem.tagName === 'svg' && elem.id === 'svgcontent') {
          				// Update svgcontent (can change on import)
          				svgcontent = elem;
          				init();
          			}
          			
          			// Has marker, so change offset
          			var start;
          			if (elem && (
          				elem.getAttribute("marker-start") ||
          				elem.getAttribute("marker-mid") ||
          				elem.getAttribute("marker-end")
          			)) {
          				start = elem.getAttribute("marker-start");
          				var mid = elem.getAttribute("marker-mid");
          				var end = elem.getAttribute("marker-end");
          				cur_line = elem;
          				$(elem)
          					.data("start_off", !!start)
          					.data("end_off", !!end);
          				
          				if (elem.tagName === 'line' && mid) {
          					// Convert to polyline to accept mid-arrow
          					
          					var x1 = Number(elem.getAttribute('x1'));
          					var x2 = Number(elem.getAttribute('x2'));
          					var y1 = Number(elem.getAttribute('y1'));
          					var y2 = Number(elem.getAttribute('y2'));
          					var id = elem.id;
          					
          					var mid_pt = (' '+((x1+x2)/2)+','+((y1+y2)/2) + ' ');
          					var pline = addElem({
          						"element": "polyline",
          						"attr": {
          							"points": (x1+','+y1+ mid_pt +x2+','+y2),
          							"stroke": elem.getAttribute('stroke'),
          							"stroke-width": elem.getAttribute('stroke-width'),
          							"marker-mid": mid,
          							"fill": "none",
          							"opacity": elem.getAttribute('opacity') || 1
          						}
          					});
          					$(elem).after(pline).remove();
          					svgCanvas.clearSelection();
          					pline.id = id;
          					svgCanvas.addToSelection([pline]);
          					elem = pline;
          				}
          			}
          			// Update line if it's a connector
          			if (elem.getAttribute('class') == conn_sel.substr(1)) {
          				start = getElem(elData(elem, 'c_start'));
          				updateConnectors([start]);
          			} else {
          				updateConnectors();
          			}
          		},
          		toolButtonStateUpdate: function(opts) {
          			if (opts.nostroke) {
          				if ($('#mode_connect').hasClass('tool_button_current')) {
          					svgEditor.clickSelect();
          				}
          			}
          			$('#mode_connect')
          				.toggleClass('disabled',opts.nostroke);
          		}
          	};
          });
          
        • ext-eyedropper.js
          /*globals svgEditor, svgedit, $*/
          /*jslint vars: true, eqeq: true*/
          /*
           * ext-eyedropper.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Jeff Schiller
           *
           */
          
          // Dependencies:
          // 1) jQuery
          // 2) history.js
          // 3) svg_editor.js
          // 4) svgcanvas.js
          
          svgEditor.addExtension("eyedropper", function(S) {'use strict';
          	var // NS = svgedit.NS,
          		// svgcontent = S.svgcontent,
          		// svgdoc = S.svgroot.parentNode.ownerDocument,
          		svgCanvas = svgEditor.canvas,
          		ChangeElementCommand = svgedit.history.ChangeElementCommand,
          		addToHistory = function(cmd) { svgCanvas.undoMgr.addCommandToHistory(cmd); },
          		currentStyle = {
          			fillPaint: "red", fillOpacity: 1.0,
          			strokePaint: "black", strokeOpacity: 1.0, 
          			strokeWidth: 5, strokeDashArray: null,
          			opacity: 1.0,
          			strokeLinecap: 'butt',
          			strokeLinejoin: 'miter'
          		};
          
          	function getStyle(opts) {
          		// if we are in eyedropper mode, we don't want to disable the eye-dropper tool
          		var mode = svgCanvas.getMode();
          		if (mode == "eyedropper") {return;}
          
          		var elem = null;
          		var tool = $('#tool_eyedropper');
          		// enable-eye-dropper if one element is selected
          		if (!opts.multiselected && opts.elems[0] &&
          			$.inArray(opts.elems[0].nodeName, ['svg', 'g', 'use']) === -1
          		) {
          			elem = opts.elems[0];
          			tool.removeClass('disabled');
          			// grab the current style
          			currentStyle.fillPaint = elem.getAttribute("fill") || "black";
          			currentStyle.fillOpacity = elem.getAttribute("fill-opacity") || 1.0;
          			currentStyle.strokePaint = elem.getAttribute("stroke");
          			currentStyle.strokeOpacity = elem.getAttribute("stroke-opacity") || 1.0;
          			currentStyle.strokeWidth = elem.getAttribute("stroke-width");
          			currentStyle.strokeDashArray = elem.getAttribute("stroke-dasharray");
          			currentStyle.strokeLinecap = elem.getAttribute("stroke-linecap");
          			currentStyle.strokeLinejoin = elem.getAttribute("stroke-linejoin");
          			currentStyle.opacity = elem.getAttribute("opacity") || 1.0;
          		}
          		// disable eye-dropper tool
          		else {
          			tool.addClass('disabled');
          		}
          
          	}
          	
          	return {
          		name: "eyedropper",
          		svgicons: svgEditor.curConfig.extPath + "eyedropper-icon.xml",
          		buttons: [{
          			id: "tool_eyedropper",
          			type: "mode",
          			title: "Eye Dropper Tool",
          			key: "I",
          			events: {
          				"click": function() {
          					svgCanvas.setMode("eyedropper");
          				}
          			}
          		}],
          		
          		// if we have selected an element, grab its paint and enable the eye dropper button
          		selectedChanged: getStyle,
          		elementChanged: getStyle,
          		
          		mouseDown: function(opts) {
          			var mode = svgCanvas.getMode();
          			if (mode == "eyedropper") {
          				var e = opts.event;
          				var target = e.target;
          				if ($.inArray(target.nodeName, ['svg', 'g', 'use']) === -1) {
          					var changes = {};
          
          					var change = function(elem, attrname, newvalue) {
          						changes[attrname] = elem.getAttribute(attrname);
          						elem.setAttribute(attrname, newvalue);
          					};
          					
          					if (currentStyle.fillPaint) {change(target, "fill", currentStyle.fillPaint);}
          					if (currentStyle.fillOpacity) {change(target, "fill-opacity", currentStyle.fillOpacity);}
          					if (currentStyle.strokePaint) {change(target, "stroke", currentStyle.strokePaint);}
          					if (currentStyle.strokeOpacity) {change(target, "stroke-opacity", currentStyle.strokeOpacity);}
          					if (currentStyle.strokeWidth) {change(target, "stroke-width", currentStyle.strokeWidth);}
          					if (currentStyle.strokeDashArray) {change(target, "stroke-dasharray", currentStyle.strokeDashArray);}
          					if (currentStyle.opacity) {change(target, "opacity", currentStyle.opacity);}
          					if (currentStyle.strokeLinecap) {change(target, "stroke-linecap", currentStyle.strokeLinecap);}
          					if (currentStyle.strokeLinejoin) {change(target, "stroke-linejoin", currentStyle.strokeLinejoin);}
          					
          					addToHistory(new ChangeElementCommand(target, changes));
          				}
          			}
          		}
          	};
          });
          
        • ext-foreignobject.js
          /*globals svgEditor, svgedit, svgCanvas, $*/
          /*jslint vars: true, eqeq: true, todo: true*/
          /*
           * ext-foreignobject.js
           *
           * Licensed under the Apache License, Version 2
           *
           * Copyright(c) 2010 Jacques Distler 
           * Copyright(c) 2010 Alexis Deveria 
           *
           */
          
          svgEditor.addExtension("foreignObject", function(S) {
          	var NS = svgedit.NS,
          		Utils = svgedit.utilities,
          		svgcontent = S.svgcontent,
          		addElem = S.addSvgElementFromJson,
          		selElems,
          		editingforeign = false,
          		svgdoc = S.svgroot.parentNode.ownerDocument,
          		started,
          		newFO;
          
          	var properlySourceSizeTextArea = function () {
          		// TODO: remove magic numbers here and get values from CSS
          		var height = $('#svg_source_container').height() - 80;
          		$('#svg_source_textarea').css('height', height);
          	};
          
          	function showPanel(on) {
          		var fc_rules = $('#fc_rules');
          		if(!fc_rules.length) {
          			fc_rules = $('<style id="fc_rules"></style>').appendTo('head');
          		}
          		fc_rules.text(!on?"":" #tool_topath { display: none !important; }");
          		$('#foreignObject_panel').toggle(on);
          	}
          
          	function toggleSourceButtons(on) {
          		$('#tool_source_save, #tool_source_cancel').toggle(!on);
          		$('#foreign_save, #foreign_cancel').toggle(on);
          	}
          
          	// Function: setForeignString(xmlString, elt)
          	// This function sets the content of element elt to the input XML.
          	//
          	// Parameters:
          	// xmlString - The XML text.
          	// elt - the parent element to append to
          	//
          	// Returns:
          	// This function returns false if the set was unsuccessful, true otherwise.
          	function setForeignString(xmlString) {
          		var elt = selElems[0];
          		try {
          			// convert string into XML document
          			var newDoc = Utils.text2xml('<svg xmlns="' + NS.SVG + '" xmlns:xlink="' + NS.XLINK + '">' + xmlString + '</svg>');
          			// run it through our sanitizer to remove anything we do not support
          			S.sanitizeSvg(newDoc.documentElement);
          			elt.parentNode.replaceChild(svgdoc.importNode(newDoc.documentElement.firstChild, true), elt);
          			S.call("changed", [elt]);
          			svgCanvas.clearSelection();
          		} catch(e) {
          			console.log(e);
          			return false;
          		}
          
          		return true;
          	}
          
          	function showForeignEditor() {
          		var elt = selElems[0];
          		if (!elt || editingforeign) {return;}
          		editingforeign = true;
          		toggleSourceButtons(true);
          		elt.removeAttribute('fill');
          
          		var str = S.svgToString(elt, 0);
          		$('#svg_source_textarea').val(str);
          		$('#svg_source_editor').fadeIn();
          		properlySourceSizeTextArea();
          		$('#svg_source_textarea').focus();
          	}
          
          	function setAttr(attr, val) {
          		svgCanvas.changeSelectedAttribute(attr, val);
          		S.call("changed", selElems);
          	}
          
          	return {
          		name: "foreignObject",
          		svgicons: svgEditor.curConfig.extPath + "foreignobject-icons.xml",
          		buttons: [{
          			id: "tool_foreign",
          			type: "mode",
          			title: "Foreign Object Tool",
          			events: {
          				'click': function() {
          					svgCanvas.setMode('foreign');
          				}
          			}
          		},{
          			id: "edit_foreign",
          			type: "context",
          			panel: "foreignObject_panel",
          			title: "Edit ForeignObject Content",
          			events: {
          				'click': function() {
          					showForeignEditor();
          				}
          			}
          		}],
          
          		context_tools: [{
          			type: "input",
          			panel: "foreignObject_panel",
          			title: "Change foreignObject's width",
          			id: "foreign_width",
          			label: "w",
          			size: 3,
          			events: {
          				change: function() {
          					setAttr('width', this.value);
          				}
          			}
          		},{
          			type: "input",
          			panel: "foreignObject_panel",
          			title: "Change foreignObject's height",
          			id: "foreign_height",
          			label: "h",
          			events: {
          				change: function() {
          					setAttr('height', this.value);
          				}
          			}
          		}, {
          			type: "input",
          			panel: "foreignObject_panel",
          			title: "Change foreignObject's font size",
          			id: "foreign_font_size",
          			label: "font-size",
          			size: 2,
          			defval: 16,
          			events: {
          				change: function() {
          					setAttr('font-size', this.value);
          				}
          			}
          		}
          
          		],
          		callback: function() {
          			$('#foreignObject_panel').hide();
          
          			var endChanges = function() {
          				$('#svg_source_editor').hide();
          				editingforeign = false;
          				$('#svg_source_textarea').blur();
          				toggleSourceButtons(false);
          			};
          
          			// TODO: Needs to be done after orig icon loads
          			setTimeout(function() {
          				// Create source save/cancel buttons
          				var save = $('#tool_source_save').clone()
          					.hide().attr('id', 'foreign_save').unbind()
          					.appendTo("#tool_source_back").click(function() {
          
          						if (!editingforeign) {return;}
          
          						if (!setForeignString($('#svg_source_textarea').val())) {
          							$.confirm("Errors found. Revert to original?", function(ok) {
          								if(!ok) {return false;}
          								endChanges();
          							});
          						} else {
          							endChanges();
          						}
          						// setSelectMode();	
          					});
          
          				var cancel = $('#tool_source_cancel').clone()
          					.hide().attr('id', 'foreign_cancel').unbind()
          					.appendTo("#tool_source_back").click(function() {
          						endChanges();
          					});
          			}, 3000);
          		},
          		mouseDown: function(opts) {
          			var e = opts.event;
          
          			if(svgCanvas.getMode() == "foreign") {
          
          				started = true;
          				newFO = S.addSvgElementFromJson({
          					"element": "foreignObject",
          					"attr": {
          						"x": opts.start_x,
          						"y": opts.start_y,
          						"id": S.getNextId(),
          						"font-size": 16, //cur_text.font_size,
          						"width": "48",
          						"height": "20",
          						"style": "pointer-events:inherit"
          					}
          				});
          				var m = svgdoc.createElementNS(NS.MATH, 'math');
          				m.setAttributeNS(NS.XMLNS, 'xmlns', NS.MATH);
          				m.setAttribute('display', 'inline');
          				var mi = svgdoc.createElementNS(NS.MATH, 'mi');
          				mi.setAttribute('mathvariant', 'normal');
          				mi.textContent = "\u03A6";
          				var mo = svgdoc.createElementNS(NS.MATH, 'mo');
          				mo.textContent = "\u222A";
          				var mi2 = svgdoc.createElementNS(NS.MATH, 'mi');
          				mi2.textContent = "\u2133";
          				m.appendChild(mi);
          				m.appendChild(mo);
          				m.appendChild(mi2);
          				newFO.appendChild(m);
          				return {
          					started: true
          				};
          			}
          		},
          		mouseUp: function(opts) {
          			var e = opts.event;
          			if(svgCanvas.getMode() == "foreign" && started) {
          				var attrs = $(newFO).attr(["width", "height"]);
          				var keep = (attrs.width != 0 || attrs.height != 0);
          				svgCanvas.addToSelection([newFO], true);
          
          				return {
          					keep: keep,
          					element: newFO
          				};
          
          			}
          
          		},
          		selectedChanged: function(opts) {
          			// Use this to update the current selected elements
          			selElems = opts.elems;
          
          			var i = selElems.length;
          
          			while(i--) {
          				var elem = selElems[i];
          				if(elem && elem.tagName === 'foreignObject') {
          					if(opts.selectedElement && !opts.multiselected) {
          						$('#foreign_font_size').val(elem.getAttribute("font-size"));
          						$('#foreign_width').val(elem.getAttribute("width"));
          						$('#foreign_height').val(elem.getAttribute("height"));
          						showPanel(true);
          					} else {
          						showPanel(false);
          					}
          				} else {
          					showPanel(false);
          				}
          			}
          		},
          		elementChanged: function(opts) {
          			var elem = opts.elems[0];
          		}
          	};
          });
          
        • ext-grid.js
          /*globals svgEditor, svgedit, svgCanvas, $*/
          /*jslint vars: true*/
          /*
           * ext-grid.js
           *
           * Licensed under the Apache License, Version 2
           *
           * Copyright(c) 2010 Redou Mine
           * Copyright(c) 2010 Alexis Deveria
           *
           */
          
          // Dependencies:
          // 1) units.js
          // 2) everything else
          
          svgEditor.addExtension('view_grid', function() { 'use strict';
          
          	var NS = svgedit.NS,
          		svgdoc = document.getElementById('svgcanvas').ownerDocument,
          		showGrid = svgEditor.curConfig.showGrid || false,
          		assignAttributes = svgCanvas.assignAttributes,
          		hcanvas = document.createElement('canvas'),
          		canvBG = $('#canvasBackground'),
          		units = svgedit.units.getTypeMap(),
          		intervals = [0.01, 0.1, 1, 10, 100, 1000];
          
          	$(hcanvas).hide().appendTo('body');
          
          	var canvasGrid = svgdoc.createElementNS(NS.SVG, 'svg');
          	assignAttributes(canvasGrid, {
          		'id': 'canvasGrid',
          		'width': '100%',
          		'height': '100%',
          		'x': 0,
          		'y': 0,
          		'overflow': 'visible',
          		'display': 'none'
          	});
          	canvBG.append(canvasGrid);
          
          	// grid-pattern
          	var gridPattern = svgdoc.createElementNS(NS.SVG, 'pattern');
          	assignAttributes(gridPattern, {
          		'id': 'gridpattern',
          		'patternUnits': 'userSpaceOnUse',
          		'x': 0, //-(value.strokeWidth / 2), // position for strokewidth
          		'y': 0, //-(value.strokeWidth / 2), // position for strokewidth
          		'width': 100,
          		'height': 100
          	});
          
          	var gridimg = svgdoc.createElementNS(NS.SVG, 'image');
          	assignAttributes(gridimg, {
          		'x': 0,
          		'y': 0,
          		'width': 100,
          		'height': 100
          	});
          	gridPattern.appendChild(gridimg);
          	$('#svgroot defs').append(gridPattern);
          
          	// grid-box
          	var gridBox = svgdoc.createElementNS(NS.SVG, 'rect');
          	assignAttributes(gridBox, {
          		'width': '100%',
          		'height': '100%',
          		'x': 0,
          		'y': 0,
          		'stroke-width': 0,
          		'stroke': 'none',
          		'fill': 'url(#gridpattern)',
          		'style': 'pointer-events: none; display:visible;'
          	});
          	$('#canvasGrid').append(gridBox);
          
          	function updateGrid(zoom) {
          		var i;
          		// TODO: Try this with <line> elements, then compare performance difference
          		var unit = units[svgEditor.curConfig.baseUnit]; // 1 = 1px
          		var u_multi = unit * zoom;
          		// Calculate the main number interval
          		var raw_m = 100 / u_multi;
          		var multi = 1;
          		for (i = 0; i < intervals.length; i++) {
          			var num = intervals[i];
          			multi = num;
          			if (raw_m <= num) {
          				break;
          			}
          		}
          		var big_int = multi * u_multi;
          
          		// Set the canvas size to the width of the container
          		hcanvas.width = big_int;
          		hcanvas.height = big_int;
          		var ctx = hcanvas.getContext('2d');
          		var cur_d = 0.5;
          		var part = big_int / 10;
          
          		ctx.globalAlpha = 0.2;
          		ctx.strokeStyle = svgEditor.curConfig.gridColor;
          		for (i = 1; i < 10; i++) {
          			var sub_d = Math.round(part * i) + 0.5;
          			// var line_num = (i % 2)?12:10;
          			var line_num = 0;
          			ctx.moveTo(sub_d, big_int);
          			ctx.lineTo(sub_d, line_num);
          			ctx.moveTo(big_int, sub_d);
          			ctx.lineTo(line_num ,sub_d);
          		}
          		ctx.stroke();
          		ctx.beginPath();
          		ctx.globalAlpha = 0.5;
          		ctx.moveTo(cur_d, big_int);
          		ctx.lineTo(cur_d, 0);
          
          		ctx.moveTo(big_int, cur_d);
          		ctx.lineTo(0, cur_d);
          		ctx.stroke();
          
          		var datauri = hcanvas.toDataURL('image/png');
          		gridimg.setAttribute('width', big_int);
          		gridimg.setAttribute('height', big_int);
          		gridimg.parentNode.setAttribute('width', big_int);
          		gridimg.parentNode.setAttribute('height', big_int);
          		svgCanvas.setHref(gridimg, datauri);
          	}
          
          	function gridUpdate () {
          		if (showGrid) {
          			updateGrid(svgCanvas.getZoom());
          		}
          		$('#canvasGrid').toggle(showGrid);
          		$('#view_grid').toggleClass('push_button_pressed tool_button');
          	}
          	return {
          		name: 'view_grid',
          		svgicons: svgEditor.curConfig.extPath + 'grid-icon.xml',
          
          		zoomChanged: function(zoom) {
          			if (showGrid) {updateGrid(zoom);}
          		},
          		callback: function () {
          			if (showGrid) {
          				gridUpdate();
          			}
          		},
          		buttons: [{
          			id: 'view_grid',
          			type: 'context',
          			panel: 'editor_panel',
          			title: 'Show/Hide Grid',
          			events: {
          				click: function() {
          					svgEditor.curConfig.showGrid = showGrid = !showGrid;
          					gridUpdate();
          				}
          			}
          		}]
          	};
          });
          
        • ext-helloworld.js
          /*globals svgEditor, svgCanvas, $*/
          /*jslint vars: true, eqeq: true*/
          /*
           * ext-helloworld.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Alexis Deveria
           *
           */
           
          /* 
          	This is a very basic SVG-Edit extension. It adds a "Hello World" button in
          	the left panel. Clicking on the button, and then the canvas will show the
          	user the point on the canvas that was clicked on.
          */
           
          svgEditor.addExtension("Hello World", function() {'use strict';
          
          		return {
          			name: "Hello World",
          			// For more notes on how to make an icon file, see the source of
          			// the helloworld-icon.xml
          			svgicons: svgEditor.curConfig.extPath + "helloworld-icon.xml",
          			
          			// Multiple buttons can be added in this array
          			buttons: [{
          				// Must match the icon ID in helloworld-icon.xml
          				id: "hello_world", 
          				
          				// This indicates that the button will be added to the "mode"
          				// button panel on the left side
          				type: "mode", 
          				
          				// Tooltip text
          				title: "Say 'Hello World'", 
          				
          				// Events
          				events: {
          					'click': function() {
          						// The action taken when the button is clicked on.
          						// For "mode" buttons, any other button will 
          						// automatically be de-pressed.
          						svgCanvas.setMode("hello_world");
          					}
          				}
          			}],
          			// This is triggered when the main mouse button is pressed down 
          			// on the editor canvas (not the tool panels)
          			mouseDown: function() {
          				// Check the mode on mousedown
          				if(svgCanvas.getMode() == "hello_world") {
          				
          					// The returned object must include "started" with 
          					// a value of true in order for mouseUp to be triggered
          					return {started: true};
          				}
          			},
          			
          			// This is triggered from anywhere, but "started" must have been set
          			// to true (see above). Note that "opts" is an object with event info
          			mouseUp: function(opts) {
          				// Check the mode on mouseup
          				if(svgCanvas.getMode() == "hello_world") {
          					var zoom = svgCanvas.getZoom();
          					
          					// Get the actual coordinate by dividing by the zoom value
          					var x = opts.mouse_x / zoom;
          					var y = opts.mouse_y / zoom;
          					
          					var text = "Hello World!\n\nYou clicked here: " 
          						+ x + ", " + y;
          						
          					// Show the text using the custom alert function
          					$.alert(text);
          				}
          			}
          		};
          });
          
          
        • ext-imagelib.js
          /*globals $, svgEditor, svgedit, svgCanvas, DOMParser*/
          /*jslint vars: true, eqeq: true, es5: true, todo: true */
          /*
           * ext-imagelib.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Alexis Deveria
           *
           */
          
          svgEditor.addExtension("imagelib", function() {'use strict';
          
          	var uiStrings = svgEditor.uiStrings;
          
          	$.extend(uiStrings, {
          		imagelib: {
          			select_lib: 'Select an image library',
          			show_list: 'Show library list',
          			import_single: 'Import single',
          			import_multi: 'Import multiple',
          			open: 'Open as new document'
          		}
          	});
          
          	var img_libs = [{
          			name: 'Demo library (local)',
          			url: svgEditor.curConfig.extPath + 'imagelib/index.html',
          			description: 'Demonstration library for SVG-edit on this server'
          		},
          		{
          			name: 'IAN Symbol Libraries',
          			url: 'http://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php',
          			description: 'Free library of illustrations'
          		},
          		{
          			name: 'Openclipart',
          			url: 'http://openclipart.org/svgedit',
          			description: 'Share and Use Images. Over 50,000 Public Domain SVG Images and Growing.'
          		}
          	];
          
          	function closeBrowser() {
          		$('#imgbrowse_holder').hide();
          	}
          
          	function importImage(url) {
          		var newImage = svgCanvas.addSvgElementFromJson({
          			"element": "image",
          			"attr": {
          				"x": 0,
          				"y": 0,
          				"width": 0,
          				"height": 0,
          				"id": svgCanvas.getNextId(),
          				"style": "pointer-events:inherit"
          			}
          		});
          		svgCanvas.clearSelection();
          		svgCanvas.addToSelection([newImage]);
          		svgCanvas.setImageURL(url);
          	}
          
          	var mode = 's';
          	var multi_arr = [];
          	var tranfer_stopped = false;
          	var pending = {};
          	var preview, submit;
          
          	window.addEventListener("message", function(evt) {
          		// Receive postMessage data
          		var response = evt.data;
          		
          		if (!response || typeof response !== "string") { // Todo: Should namespace postMessage API for this extension and filter out here
          			// Do nothing
          			return;
          		}
          		try { // This block can be removed if embedAPI moves away from a string to an object (if IE9 support not needed)
          			var res = JSON.parse(response);
          			if (res.namespace) { // Part of embedAPI communications
          				return;
          			}
          		}
          		catch (e) {}
          		
          		var char1 = response.charAt(0);
          		var id;
          		var svg_str;
          		var img_str;
          		
          		if (char1 != "{" && tranfer_stopped) {
          			tranfer_stopped = false;
          			return;
          		}
          		
          		if (char1 == '|') {
          			var secondpos = response.indexOf('|', 1);
          			id = response.substr(1, secondpos-1);
          			response = response.substr(secondpos+1);
          			char1 = response.charAt(0);
          		}
          		
          		
          		// Hide possible transfer dialog box
          		$('#dialog_box').hide();
          		var entry, cur_meta;
          		switch (char1) {
          			case '{':
          				// Metadata
          				tranfer_stopped = false;
          				cur_meta = JSON.parse(response);
          				
          				pending[cur_meta.id] = cur_meta;
          				
          				var name = (cur_meta.name || 'file');
          				
          				var message = uiStrings.notification.retrieving.replace('%s', name);
          				
          				if (mode != 'm') {
          					$.process_cancel(message, function() {
          						tranfer_stopped = true;
          						// Should a message be sent back to the frame?
          						
          						$('#dialog_box').hide();
          					});
          				} else {
          					entry = $('<div>' + message + '</div>').data('id', cur_meta.id);
          					preview.append(entry);
          					cur_meta.entry = entry;
          				}
          				
          				return;
          			case '<':
          				svg_str = true;
          				break;
          			case 'd':
          				if (response.indexOf('data:image/svg+xml') === 0) {
          					var pre = 'data:image/svg+xml;base64,';
          					var src = response.substring(pre.length);
          					response = svgedit.utilities.decode64(src);
          					svg_str = true;
          					break;
          				} else if (response.indexOf('data:image/') === 0) {
          					img_str = true;
          					break;
          				}
          				// Else fall through
          			default:
          				// TODO: See if there's a way to base64 encode the binary data stream
          //				var str = 'data:;base64,' + svgedit.utilities.encode64(response, true);
          			
          				// Assume it's raw image data
          //				importImage(str);
          			
          				// Don't give warning as postMessage may have been used by something else
          				if (mode !== 'm') {
          					closeBrowser();
          				} else {
          					pending[id].entry.remove();
          				}
          //				$.alert('Unexpected data was returned: ' + response, function() {
          //					if (mode !== 'm') {
          //						closeBrowser();
          //					} else {
          //						pending[id].entry.remove();
          //					}
          //				});
          				return;
          		}
          		
          		switch (mode) {
          			case 's':
          				// Import one
          				if (svg_str) {
          					svgCanvas.importSvgString(response);
          				} else if (img_str) {
          					importImage(response);
          				}
          				closeBrowser();
          				break;
          			case 'm':
          				// Import multiple
          				multi_arr.push([(svg_str ? 'svg' : 'img'), response]);
          				var title;
          				cur_meta = pending[id];
          				if (svg_str) {
          					if (cur_meta && cur_meta.name) {
          						title = cur_meta.name;
          					} else {
          						// Try to find a title
          						var xml = new DOMParser().parseFromString(response, 'text/xml').documentElement;
          						title = $(xml).children('title').first().text() || '(SVG #' + response.length + ')';
          					}
          					if (cur_meta) {
          						preview.children().each(function() {
          							if ($(this).data('id') == id) {
          								if (cur_meta.preview_url) {
          									$(this).html('<img src="' + cur_meta.preview_url + '">' + title);
          								} else {
          									$(this).text(title);
          								}
          								submit.removeAttr('disabled');
          							}
          						});
          					} else {
          						preview.append('<div>'+title+'</div>');
          						submit.removeAttr('disabled');
          					}
          				} else {
          					if (cur_meta && cur_meta.preview_url) {
          						title = cur_meta.name || '';
          					}
          					if (cur_meta && cur_meta.preview_url) {
          						entry = '<img src="' + cur_meta.preview_url + '">' + title;
          					} else {
          						entry = '<img src="' + response + '">';
          					}
          				
          					if (cur_meta) {
          						preview.children().each(function() {
          							if ($(this).data('id') == id) {
          								$(this).html(entry);
          								submit.removeAttr('disabled');
          							}
          						});
          					} else {
          						preview.append($('<div>').append(entry));
          						submit.removeAttr('disabled');
          					}
          
          				}
          				break;
          			case 'o':
          				// Open
          				if (!svg_str) {break;}
          				svgEditor.openPrep(function(ok) {
          					if (!ok) {return;}
          					svgCanvas.clear();
          					svgCanvas.setSvgString(response);
          					// updateCanvas();
          				});
          				closeBrowser();
          				break;
          		}
          	}, true);
          
          	function toggleMulti(show) {
          	
          		$('#lib_framewrap, #imglib_opts').css({right: (show ? 200 : 10)});
          		if (!preview) {
          			preview = $('<div id=imglib_preview>').css({
          				position: 'absolute',
          				top: 45,
          				right: 10,
          				width: 180,
          				bottom: 45,
          				background: '#fff',
          				overflow: 'auto'
          			}).insertAfter('#lib_framewrap');
          			
          			submit = $('<button disabled>Import selected</button>')
          				.appendTo('#imgbrowse')
          				.on("click touchend", function() {
          				$.each(multi_arr, function(i) {
          					var type = this[0];
          					var data = this[1];
          					if (type == 'svg') {
          						svgCanvas.importSvgString(data);
          					} else {
          						importImage(data);
          					}
          					svgCanvas.moveSelectedElements(i*20, i*20, false);
          				});
          				preview.empty();
          				multi_arr = [];
          				$('#imgbrowse_holder').hide();
          			}).css({
          				position: 'absolute',
          				bottom: 10,
          				right: -10
          			});
          
          		}
          		
          		preview.toggle(show);
          		submit.toggle(show);
          	}
          
          	function showBrowser() {
          
          		var browser = $('#imgbrowse');
          		if (!browser.length) {
          			$('<div id=imgbrowse_holder><div id=imgbrowse class=toolbar_button>\
          			</div></div>').insertAfter('#svg_docprops');
          			browser = $('#imgbrowse');
          
          			var all_libs = uiStrings.imagelib.select_lib;
          
          			var lib_opts = $('<ul id=imglib_opts>').appendTo(browser);
          			var frame = $('<iframe/>').prependTo(browser).hide().wrap('<div id=lib_framewrap>');
          			
          			var header = $('<h1>').prependTo(browser).text(all_libs).css({
          				position: 'absolute',
          				top: 0,
          				left: 0,
          				width: '100%'
          			});
          			
          			var cancel = $('<button>' + uiStrings.common.cancel + '</button>')
          				.appendTo(browser)
          				.on("click touchend", function() {
          				$('#imgbrowse_holder').hide();
          			}).css({
          				position: 'absolute',
          				top: 5,
          				right: -10
          			});
          			
          			var leftBlock = $('<span>').css({position:'absolute',top:5,left:10}).appendTo(browser);
          			
          			var back = $('<button hidden>' + uiStrings.imagelib.show_list + '</button>')
          				.appendTo(leftBlock)
          				.on("click touchend", function() {
          				frame.attr('src', 'about:blank').hide();
          				lib_opts.show();
          				header.text(all_libs);
          				back.hide();
          			}).css({
          				'margin-right': 5
          			}).hide();
          			
          			var type = $('<select><option value=s>' + 
          			uiStrings.imagelib.import_single + '</option><option value=m>' +
          			uiStrings.imagelib.import_multi + '</option><option value=o>' +
          			uiStrings.imagelib.open + '</option></select>').appendTo(leftBlock).change(function() {
          				mode = $(this).val();
          				switch (mode) {
          					case 's':
          					case 'o':
          						toggleMulti(false);
          						break;
          					
          					case 'm':
          						// Import multiple
          						toggleMulti(true);
          						break;
          				}
          			}).css({
          				'margin-top': 10
          			});
          			
          			cancel.prepend($.getSvgIcon('cancel', true));
          			back.prepend($.getSvgIcon('tool_imagelib', true));
          			
          			$.each(img_libs, function(i, opts) {
          				$('<li>')
          					.appendTo(lib_opts)
          					.text(opts.name)
          					.on("click touchend", function() {
          					frame.attr('src', opts.url).show();
          					header.text(opts.name);
          					lib_opts.hide();
          					back.show();
          				}).append('<span>' + opts.description + '</span>');
          			});
          			
          		} else {
          			$('#imgbrowse_holder').show();
          		}
          	}
          	
          	return {
          		svgicons: svgEditor.curConfig.extPath + "ext-imagelib.xml",
          		buttons: [{
          			id: "tool_imagelib",
          			type: "app_menu", // _flyout
          			position: 4,
          			title: "Image library",
          			events: {
          				"mouseup": showBrowser
          			}
          		}],
          		callback: function() {
          		
          			$('<style>').text('\
          				#imgbrowse_holder {\
          					position: absolute;\
          					top: 0;\
          					left: 0;\
          					width: 100%;\
          					height: 100%;\
          					background-color: rgba(0, 0, 0, .5);\
          					z-index: 5;\
          				}\
          				\
          				#imgbrowse {\
          					position: absolute;\
          					top: 25px;\
          					left: 25px;\
          					right: 25px;\
          					bottom: 25px;\
          					min-width: 300px;\
          					min-height: 200px;\
          					background: #B0B0B0;\
          					border: 1px outset #777;\
          				}\
          				#imgbrowse h1 {\
          					font-size: 20px;\
          					margin: .4em;\
          					text-align: center;\
          				}\
          				#lib_framewrap,\
          				#imgbrowse > ul {\
          					position: absolute;\
          					top: 45px;\
          					left: 10px;\
          					right: 10px;\
          					bottom: 10px;\
          					background: white;\
          					margin: 0;\
          					padding: 0;\
          				}\
          				#imgbrowse > ul {\
          					overflow: auto;\
          				}\
          				#imgbrowse > div {\
          					border: 1px solid #666;\
          				}\
          				#imglib_preview > div {\
          					padding: 5px;\
          					font-size: 12px;\
          				}\
          				#imglib_preview img {\
          					display: block;\
          					margin: 0 auto;\
          					max-height: 100px;\
          				}\
          				#imgbrowse li {\
          					list-style: none;\
          					padding: .5em;\
          					background: #E8E8E8;\
          					border-bottom: 1px solid #B0B0B0;\
          					line-height: 1.2em;\
          					font-style: sans-serif;\
          					}\
          				#imgbrowse li > span {\
          					color: #666;\
          					font-size: 15px;\
          					display: block;\
          					}\
          				#imgbrowse li:hover {\
          					background: #FFC;\
          					cursor: pointer;\
          					}\
          				#imgbrowse iframe {\
          					width: 100%;\
          					height: 100%;\
          					border: 0;\
          				}\
          			').appendTo('head');
          		}
          	};
          });
          
          
        • ext-imagelib.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="tool_imagelib">
          <svg width="201" height="211" xmlns="http://www.w3.org/2000/svg">
           <g>
            <path fill="#efe8b8" stroke="#d6c47c" stroke-linecap="round" d="m2.75,49.51761l56.56,-46.26761c12.73,8.25 25.71001,7 46.44,0.75l-56.03999,47.23944l-22.72002,25.01056l-24.23999,-26.73239z" id="svg_2" stroke-width="7"/>
            <path fill="#a03333" stroke="#3f3f3f" d="m3.75,203.25002c14.33301,7 30.66699,7 46,0l0,-152.00002c-14.66699,8 -32.33301,8 -47,0l1,152.00002zm45.75,-152.25002l56.25,-46.75l0,151l-56,48.00002m-47.25,-154.25002l57.25,-46.5" id="svg_1" stroke-width="7" stroke-linecap="round"/>
            <path fill="#efe8b8" stroke="#d6c47c" stroke-linecap="round" d="m49.75,49.51801l56.56,-46.26801c12.72998,8.25 25.71002,7 46.44,0.75l-56.03998,47.239l-22.72003,25.011l-24.23999,-26.73199z" stroke-width="7" id="svg_5"/>
            <path fill="#2f8e2f" stroke="#3f3f3f" d="m50.75,202.25c14.33301,7 30.66699,7.04253 46,0.04253l0,-151.04253c-14.66699,8 -32.33301,8 -47,0l1,151zm45.75,-151.25l56.25,-46.75l0,144.01219l-56,51.98782m-47.25,-151.25002l57.25,-46.5" stroke-width="7" stroke-linecap="round" id="svg_6"/>
            <path fill="#efe8b8" stroke="#d6c47c" stroke-linecap="round" d="m95.75,49.51801l56.56,-46.26801c12.72998,8.25 25.71002,7 46.44,0.75l-56.03998,47.239l-22.72003,25.011l-24.23999,-26.73199z" stroke-width="7" id="svg_10"/>
            <path fill="#336393" stroke="#3f3f3f" d="m96.75,200.29445c14.33301,7 30.66699,7 46,0l0,-149.04445c-14.66699,8 -32.33301,8 -47,0l1,149.04445zm45.75,-149.29445l56.25,-46.75l0,148.04445l-56,48m-47.25,-151.29445l57.25,-46.5" stroke-width="7" stroke-linecap="round" id="svg_11"/>
           </g>
          </svg>
          	</g>
          </svg>
        • ext-markers.js
          /*globals svgEditor, svgCanvas, $*/
          /*jslint vars: true, eqeq: true, todo: true */
          /*
           * ext-markers.js
           *
           * Licensed under the Apache License, Version 2
           *
           * Copyright(c) 2010 Will Schleter 
           *   based on ext-arrows.js by Copyright(c) 2010 Alexis Deveria
           *
           * This extension provides for the addition of markers to the either end
           * or the middle of a line, polyline, path, polygon. 
           * 
           * Markers may be either a graphic or arbitary text
           * 
           * to simplify the coding and make the implementation as robust as possible,
           * markers are not shared - every object has its own set of markers.
           * this relationship is maintained by a naming convention between the
           * ids of the markers and the ids of the object
           * 
           * The following restrictions exist for simplicty of use and programming
           *    objects and their markers to have the same color
           *    marker size is fixed
           *    text marker font, size, and attributes are fixed
           *    an application specific attribute - se_type - is added to each marker element
           *        to store the type of marker
           *
           * TODO:
           *    remove some of the restrictions above
           *    add option for keeping text aligned to horizontal
           *    add support for dimension extension lines
           *
           */
          
          svgEditor.addExtension("Markers", function(S) {
          	var // svgcontent = S.svgcontent,
          		addElem = S.addSvgElementFromJson,
          		selElems;
          
          	var mtypes = ['start','mid','end'];
          
          	var marker_prefix = 'se_marker_';
          	var id_prefix = 'mkr_';
          		
          	// note - to add additional marker types add them below with a unique id
          	// and add the associated icon(s) to marker-icons.svg
          	// the geometry is normallized to a 100x100 box with the origin at lower left
          	// Safari did not like negative values for low left of viewBox
          	// remember that the coordinate system has +y downward
          	var marker_types = {
          		nomarker: {},  
          		leftarrow:  
          			{element:'path', attr:{d:'M0,50 L100,90 L70,50 L100,10 Z'}},
          		rightarrow:
          			{element:'path', attr:{d:'M100,50 L0,90 L30,50 L0,10 Z'}},
          		textmarker:
          			{element:'text', attr: {x:0, y:0,'stroke-width':0,'stroke':'none','font-size':75,'font-family':'serif','text-anchor':'left',
          				'xml:space': 'preserve'}},
          		forwardslash:
          			{element:'path', attr:{d:'M30,100 L70,0'}},
          		reverseslash:
          			{element:'path', attr:{d:'M30,0 L70,100'}},
          		verticalslash:
          			{element:'path', attr:{d:'M50,0 L50,100'}},
          		box:
          			{element:'path', attr:{d:'M20,20 L20,80 L80,80 L80,20 Z'}},
          		star:
          			{element:'path', attr:{d:'M10,30 L90,30 L20,90 L50,10 L80,90 Z'}},
          		xmark:
          			{element:'path', attr:{d:'M20,80 L80,20 M80,80 L20,20'}},
          		triangle:
          			{element:'path', attr:{d:'M10,80 L50,20 L80,80 Z'}},
          		mcircle:
          			{element:'circle', attr:{r:30, cx:50, cy:50}}			
          	};
          	
          	
          	var lang_list = {
          		"en":[
          			{id: "start_marker_list", title: "Select start marker type" },
          			{id: "mid_marker_list", title: "Select mid marker type" },
          			{id: "end_marker_list", title: "Select end marker type" },
          			{id: "nomarker", title: "No Marker" },
          			{id: "leftarrow", title: "Left Arrow" },
          			{id: "rightarrow", title: "Right Arrow" },
          			{id: "textmarker", title: "Text Marker" },
          			{id: "forwardslash", title: "Forward Slash" },
          			{id: "reverseslash", title: "Reverse Slash" },
          			{id: "verticalslash", title: "Vertical Slash" },
          			{id: "box", title: "Box" },
          			{id: "star", title: "Star" },
          			{id: "xmark", title: "X" },
          			{id: "triangle", title: "Triangle" },
          			{id: "mcircle", title: "Circle" },
          			{id: "leftarrow_o", title: "Open Left Arrow" },
          			{id: "rightarrow_o", title: "Open Right Arrow" },
          			{id: "box_o", title: "Open Box" },
          			{id: "star_o", title: "Open Star" },
          			{id: "triangle_o", title: "Open Triangle" },
          			{id: "mcircle_o", title: "Open Circle" }
          		]
          	};
          
          
          	// duplicate shapes to support unfilled (open) marker types with an _o suffix
          	$.each(['leftarrow','rightarrow','box','star','mcircle','triangle'],function(i,v) {
          		marker_types[v+'_o'] = marker_types[v];
          	});
          	
          	// elem = a graphic element will have an attribute like marker-start
          	// attr - marker-start, marker-mid, or marker-end
          	// returns the marker element that is linked to the graphic element
          	function getLinked(elem, attr) {
          		var str = elem.getAttribute(attr);
          		if(!str) {return null;}
          		var m = str.match(/\(\#(.*)\)/);
          		if(!m || m.length !== 2) {
          			return null;
          		}
          		return S.getElem(m[1]);
          	}
          
          	function setIcon(pos,id) {
          		if (id.substr(0,1) !== '\\') {id = '\\textmarker';}
          		var ci = '#'+id_prefix+pos+'_'+id.substr(1);
          		svgEditor.setIcon('#cur_' + pos +'_marker_list', $(ci).children());
          		$(ci).addClass('current').siblings().removeClass('current');
          	}
          
          	// toggles context tool panel off/on
          	//sets the controls with the selected element's settings
          	function showPanel(on) {
          		$('#marker_panel').toggle(on);
          
          		if(on) {
          			var el = selElems[0];
          			var val;
          			var ci;
          
          			$.each(mtypes, function(i, pos) {
          				var m = getLinked(el, "marker-" + pos);
          				var txtbox = $('#' + pos + '_marker');
          				if (!m) {
          					val = '\\nomarker';
          					ci = val;
          					txtbox.hide(); // hide text box
          				} else {
          					if (!m.attributes.se_type) {return;} // not created by this extension
          					val = '\\' + m.attributes.se_type.textContent;
          					ci = val;
          					if (val === '\\textmarker') {
          						val = m.lastChild.textContent;
          						//txtbox.show(); // show text box
          					} else {
          						txtbox.hide(); // hide text box
          					}
          				}
          				txtbox.val(val);				
          				setIcon(pos,ci);
          			});
          		}
          	}	
          
          	function addMarker(id, val) {
          		var txt_box_bg = '#ffffff';
          		var txt_box_border = 'none';
          		var txt_box_stroke_width = 0;
          		
          		var marker = S.getElem(id);
          
          		if (marker) {return;}
          
          		if (val == '' || val == '\\nomarker') {return;}
          
          		var el = selElems[0];		 
          		var color = el.getAttribute('stroke');
          		//NOTE: Safari didn't like a negative value in viewBox
          		//so we use a standardized 0 0 100 100
          		//with 50 50 being mapped to the marker position
          		var refX = 50;
          		var refY = 50;
          		var viewBox = "0 0 100 100";
          		var markerWidth = 5;
          		var markerHeight = 5;
          		var strokeWidth = 10;
          		var se_type;
          		if (val.substr(0,1) === '\\') {se_type = val.substr(1);}
          		else {se_type = 'textmarker';}
          
          		if (!marker_types[se_type]) {return;} // an unknown type!
          		
          		// create a generic marker
          		marker = addElem({
          			"element": "marker",
          			"attr": {
          			"id": id,
          			"markerUnits": "strokeWidth",
          			"orient": "auto",
          			"style": "pointer-events:none",
          			"se_type": se_type
          		}
          		});
          
          		if (se_type != 'textmarker') {
          			var mel = addElem(marker_types[se_type]);
          			var fillcolor = color;
          			if (se_type.substr(-2) === '_o') {fillcolor = 'none';}
          			mel.setAttribute('fill', fillcolor);
          			mel.setAttribute('stroke', color);
          			mel.setAttribute('stroke-width', strokeWidth);
          			marker.appendChild(mel);
          		} else {
          			var text = addElem(marker_types[se_type]);
          			// have to add text to get bounding box
          			text.textContent = val;
          			var tb = text.getBBox();
          			//alert( tb.x + " " + tb.y + " " + tb.width + " " + tb.height);
          			var pad = 1;
          			var bb = tb;
          			bb.x = 0;
          			bb.y = 0;
          			bb.width += pad*2;
          			bb.height += pad*2;
          			// shift text according to its size
          			text.setAttribute('x', pad);
          			text.setAttribute('y', bb.height - pad - tb.height/4); // kludge?
          			text.setAttribute('fill',color);
          			refX = bb.width/2 + pad;
          			refY = bb.height/2 + pad;
          			viewBox = bb.x + " " + bb.y + " " + bb.width + " " + bb.height;
          			markerWidth = bb.width/10;
          			markerHeight = bb.height/10;
          
          			var box = addElem({
          				"element": "rect",
          				"attr": {
          					"x": bb.x,
          					"y": bb.y,
          					"width": bb.width,
          					"height": bb.height,
          					"fill": txt_box_bg,
          					"stroke": txt_box_border,
          					"stroke-width": txt_box_stroke_width
          				}
          			});
          			marker.setAttribute("orient",0);
          			marker.appendChild(box);
          			marker.appendChild(text);
          		} 
          
          		marker.setAttribute("viewBox",viewBox);
          		marker.setAttribute("markerWidth", markerWidth);
          		marker.setAttribute("markerHeight", markerHeight);
          		marker.setAttribute("refX", refX);
          		marker.setAttribute("refY", refY);
          		S.findDefs().appendChild(marker);
          
          		return marker;
          	}
          
          	function convertline(elem) {
          		// this routine came from the connectors extension
          		// it is needed because midpoint markers don't work with line elements
          		if (!(elem.tagName === 'line')) {return elem;}
          
          		// Convert to polyline to accept mid-arrow
          
          		var x1 = Number(elem.getAttribute('x1'));
          		var x2 = Number(elem.getAttribute('x2'));
          		var y1 = Number(elem.getAttribute('y1'));
          		var y2 = Number(elem.getAttribute('y2'));
          		var id = elem.id;
          
          		var mid_pt = (' '+((x1+x2)/2)+','+((y1+y2)/2) + ' ');
          		var pline = addElem({
          			"element": "polyline",
          			"attr": {
          				"points": (x1+','+y1+ mid_pt +x2+','+y2),
          				"stroke": elem.getAttribute('stroke'),
          				"stroke-width": elem.getAttribute('stroke-width'),
          				"fill": "none",
          				"opacity": elem.getAttribute('opacity') || 1
          			}
          		});
          		$.each(mtypes, function(i, pos) { // get any existing marker definitions
          			var nam = 'marker-'+pos;
          			var m = elem.getAttribute(nam);
          			if (m) {pline.setAttribute(nam,elem.getAttribute(nam));}
          		});
          		
          		var batchCmd = new S.BatchCommand();
          		batchCmd.addSubCommand(new S.RemoveElementCommand(elem, elem.parentNode));
          		batchCmd.addSubCommand(new S.InsertElementCommand(pline));
          		
          		$(elem).after(pline).remove();
          		svgCanvas.clearSelection();
          		pline.id = id;
          		svgCanvas.addToSelection([pline]);
          		S.addCommandToHistory(batchCmd);
          		return pline;
          	}
          
          	function setMarker() {
          		var poslist={'start_marker':'start','mid_marker':'mid','end_marker':'end'};
          		var pos = poslist[this.id];
          		var marker_name = 'marker-'+pos;
          		var val = this.value;
          		var el = selElems[0];
          		var marker = getLinked(el, marker_name);
          		if (marker) {$(marker).remove();}
          		el.removeAttribute(marker_name);
          		if (val == '') {val = '\\nomarker';}
          		if (val == '\\nomarker') {
          			setIcon(pos,val);
          			S.call("changed", selElems);
          			return;
          		}
          		// Set marker on element
          		var id = marker_prefix + pos + '_' + el.id;
          		addMarker(id, val);
          		svgCanvas.changeSelectedAttribute(marker_name, "url(#" + id + ")");
          		if (el.tagName === 'line' && pos == 'mid') {el = convertline(el);}
          		S.call("changed", selElems);
          		setIcon(pos,val);
          	}
          
          	// called when the main system modifies an object
          	// this routine changes the associated markers to be the same color
          	function colorChanged(elem) {
          		var color = elem.getAttribute('stroke');
          
          		$.each(mtypes, function(i, pos) {
          			var marker = getLinked(elem, 'marker-'+pos);
          			if (!marker) {return;}
          			if (!marker.attributes.se_type) {return;} // not created by this extension
          			var ch = marker.lastElementChild;
          			if (!ch) {return;}
          			var curfill = ch.getAttribute('fill');
          			var curstroke = ch.getAttribute('stroke');
          			if (curfill && curfill != 'none') {ch.setAttribute('fill', color);}
          			if (curstroke && curstroke != 'none') {ch.setAttribute('stroke', color);}
          		});
          	}
          
          	// called when the main system creates or modifies an object
          	// primary purpose is create new markers for cloned objects
          	function updateReferences(el) {
          		$.each(mtypes, function (i, pos) {
          			var id = marker_prefix + pos + '_' + el.id;
          			var marker_name = 'marker-'+pos;
          			var marker = getLinked(el, marker_name);
          			if (!marker || !marker.attributes.se_type) {return;} // not created by this extension
          			var url = el.getAttribute(marker_name);
          			if (url) {
          				var len = el.id.length;
          				var linkid = url.substr(-len-1, len);
          				if (el.id != linkid) {
          					var val = $('#'+pos + '_marker').attr('value');
          					addMarker(id, val);
          					svgCanvas.changeSelectedAttribute(marker_name, "url(#" + id + ")");
          					if (el.tagName === 'line' && pos == 'mid') {el = convertline(el);}
          					S.call("changed", selElems);
          				}
          			}
          		});
          	}
          
          	// simulate a change event a text box that stores the current element's marker type
          	function triggerTextEntry(pos, val) {
          		$('#'+pos+'_marker').val(val);
          		$('#'+pos+'_marker').change();
          		// var txtbox = $('#'+pos+'_marker');
          		// if (val.substr(0,1)=='\\') {txtbox.hide();}
          		// else {txtbox.show();}
          	}
          
          	function showTextPrompt(pos) {
          		var def = $('#'+pos+'_marker').val();
          		if (def.substr(0,1) === '\\') {def = '';}
          		$.prompt('Enter text for ' + pos + ' marker', def , function(txt) {
          			if (txt) {triggerTextEntry(pos, txt);}
          		});
          	}
          
          	/*
          	function setMarkerSet(obj) {
          		var parts = this.id.split('_');
          		var set = parts[2];
          		switch (set) {
          		case 'off':
          			triggerTextEntry('start','\\nomarker');
          			triggerTextEntry('mid','\\nomarker');
          			triggerTextEntry('end','\\nomarker');
          			break;
          		case 'dimension':
          			triggerTextEntry('start','\\leftarrow');
          			triggerTextEntry('end','\\rightarrow');
          			showTextPrompt('mid');
          			break;
          		case 'label':
          			triggerTextEntry('mid','\\nomarker');
          			triggerTextEntry('end','\\rightarrow');
          			showTextPrompt('start');
          			break;
          		}
          	}
          	*/
          	// callback function for a toolbar button click
          	function setArrowFromButton(obj) {
          		
          		var parts = this.id.split('_');
          		var pos = parts[1];
          		var val = parts[2];
          		if (parts[3]) { val += '_' + parts[3];}
          		
          		if (val != 'textmarker') {
          			triggerTextEntry(pos, '\\'+val);
          		} else {
          			showTextPrompt(pos);
          		}
          	}
          	
          	function getTitle(lang, id) {
          		var i, list = lang_list[lang];
          		for (i in list) {
          			if (list.hasOwnProperty(i) && list[i].id == id) {
          				return list[i].title;
          			}
          		}
          		return id;
          	}
          	
          	
          	// build the toolbar button array from the marker definitions
          	// TODO: need to incorporate language specific titles
          	function buildButtonList() {
          		var buttons=[];
          		// var i = 0;
          /*
          		buttons.push({
          			id:id_prefix + 'markers_off',
          			title:'Turn off all markers',
          			type:'context',
          			events: { 'click': setMarkerSet },
          			panel: 'marker_panel'
          		});
          		buttons.push({
          			id:id_prefix + 'markers_dimension',
          			title:'Dimension',
          			type:'context',
          			events: { 'click': setMarkerSet },
          			panel: 'marker_panel'
          		});
          		buttons.push({
          			id:id_prefix + 'markers_label',
          			title:'Label',
          			type:'context',
          			events: { 'click': setMarkerSet },
          			panel: 'marker_panel'
          		});
          */
          		$.each(mtypes, function (k, pos) {
          			var listname = pos + "_marker_list";
          			var def = true;
          			$.each(marker_types, function (id, v) {
          				var title = getTitle('en', id);
          				buttons.push({
          					id: id_prefix + pos + '_' + id,
          					svgicon: id,
          					title: title,
          					type: 'context',
          					events: {'click': setArrowFromButton},
          					panel: 'marker_panel',
          					list: listname,
          					isDefault: def
          				});
          				def = false;
          			});
          		});
          		return buttons;
          	}
          
          	return {
          		name: "Markers",
          		svgicons: svgEditor.curConfig.extPath + "markers-icons.xml",
          		buttons: buildButtonList(),
          		context_tools: [
          		   {
          			type: "input",
          			panel: "marker_panel",
          			title: "Start marker",
          			id: "start_marker",
          			label: "s",
          			size: 3,
          			events: { change: setMarker }
          		},{
          			type: "button-select",
          			panel: "marker_panel",
          			title: getTitle('en', 'start_marker_list'),
          			id: "start_marker_list",
          			colnum: 3,
          			events: { change: setArrowFromButton }
          		},{
          			type: "input",
          			panel: "marker_panel",
          			title: "Middle marker",
          			id: "mid_marker",
          			label: "m",
          			defval: "",
          			size: 3,
          			events: { change: setMarker }
          		},{
          			type: "button-select",
          			panel: "marker_panel",
          			title: getTitle('en', 'mid_marker_list'),
          			id: "mid_marker_list",
          			colnum: 3,
          			events: { change: setArrowFromButton }
          		},{
          			type: "input",
          			panel: "marker_panel",
          			title: "End marker",
          			id: "end_marker",
          			label: "e",
          			size: 3,
          			events: { change: setMarker }
          		},{
          			type: "button-select",
          			panel: "marker_panel",
          			title: getTitle('en', 'end_marker_list'),
          			id: "end_marker_list",
          			colnum: 3,
          			events: { change: setArrowFromButton }
          		} ],
          		callback: function() {
          			$('#marker_panel').addClass('toolset').hide();
          			
          		},
          		addLangData: function(lang) {
          			return { data: lang_list[lang] };
          		},
          
          	selectedChanged: function(opts) {
          		// Use this to update the current selected elements
          		//console.log('selectChanged',opts);
          		selElems = opts.elems;
          
          		var i = selElems.length;
          		var marker_elems = ['line','path','polyline','polygon'];
          
          		while(i--) {
          			var elem = selElems[i];
          			if(elem && $.inArray(elem.tagName, marker_elems) !== -1) {
          				if (opts.selectedElement && !opts.multiselected) {
          					showPanel(true);
          				} else {
          					showPanel(false);
          				}
          			} else {
          				showPanel(false);
          			}
          		}
          	},
          
          	elementChanged: function(opts) {		
          		//console.log('elementChanged',opts);
          		var elem = opts.elems[0];
          		if (elem && (
          				elem.getAttribute("marker-start") ||
          				elem.getAttribute("marker-mid") ||
          				elem.getAttribute("marker-end")
          		)) {
          			colorChanged(elem);
          			updateReferences(elem);
          		}
          		// changing_flag = false; // Not apparently in use
          	}
          	};
          });
          
        • ext-mathjax.js
          /*globals MathJax, svgEditor, svgCanvas, $*/
          /*jslint es5: true, todo: true, vars: true*/
          /*
           * ext-mathjax.js
           *
           * Licensed under the Apache License
           *
           * Copyright(c) 2013 Jo Segaert
           *
           */
          
          svgEditor.addExtension("mathjax", function() {'use strict';
            // Configuration of the MathJax extention.
          
            // This will be added to the head tag before MathJax is loaded.
            var /*mathjaxConfiguration = '<script type="text/x-mathjax-config">\
                  MathJax.Hub.Config({\
                    extensions: ["tex2jax.js"],\
          			    jax: ["input/TeX","output/SVG"],\
                    showProcessingMessages: true,\
                    showMathMenu: false,\
                    showMathMenuMSIE: false,\
                    errorSettings: {\
                      message: ["[Math Processing Error]"],\
                      style: {color: "#CC0000", "font-style":"italic"}\
                    },\
                    elements: [],\
                      tex2jax: {\
                      ignoreClass: "tex2jax_ignore2", processClass: "tex2jax_process2",\
                    },\
                    TeX: {\
                      extensions: ["AMSmath.js","AMSsymbols.js","noErrors.js","noUndefined.js"]\
                    },\
                    "SVG": {\
                    }\
                });\
                </script>',*/
              // mathjaxSrc = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
              mathjaxSrcSecure = 'https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG.js',
              math,
              locationX,
              locationY,
              mathjaxLoaded = false,
              uiStrings = svgEditor.uiStrings;
          
            // TODO: Implement language support. Move these uiStrings to the locale files and the code to the langReady callback.
            $.extend(uiStrings, {
              mathjax: {
                embed_svg: 'Save as mathematics',
                embed_mathml: 'Save as figure',
                svg_save_warning: 'The math will be transformed into a figure is manipulatable like everything else. You will not be able to manipulate the TeX-code anymore. ',
                mathml_save_warning: 'Advised. The math will be saved as a figure.',
                title: 'Mathematics code editor'
              }
            });
          
          
            function saveMath() {
              var code = $('#mathjax_code_textarea').val();
              // displaystyle to force MathJax NOT to use the inline style. Because it is
              // less fancy!
              MathJax.Hub.queue.Push(['Text', math, '\\displaystyle{' + code + '}']);
          
              /*
               * The MathJax library doesn't want to bloat your webpage so it creates 
               * every symbol (glymph) you need only once. These are saved in a <svg> on  
               * the top of your html document, just under the body tag. Each glymph has
               * its unique id and is saved as a <path> in the <defs> tag of the <svg>
               * 
               * Then when the symbols are needed in the rest of your html document they
               * are refferd to by a <use> tag.
               * Because of bug 1076 we can't just grab the defs tag on the top and add it 
               * to your formula's <svg> and copy the lot. So we have to replace each 
               * <use> tag by it's <path>.
               */
              MathJax.Hub.queue.Push(
                function() {
                  var mathjaxMath = $('.MathJax_SVG');
                  var svg = $(mathjaxMath.html());
                  svg.find('use').each(function() {
                    var x, y, id, transform;
          
                    // TODO: find a less pragmatic and more elegant solution to this.
                    if ($(this).attr('href')) {
                      id = $(this).attr('href').slice(1); // Works in Chrome.
                    } else {
                      id = $(this).attr('xlink:href').slice(1); // Works in Firefox.
                    }
          
                    var glymph = $('#' + id).clone().removeAttr('id');
                    x = $(this).attr('x');
                    y = $(this).attr('y');
                    transform = $(this).attr('transform');
                    if (transform && ( x || y )) {
                      glymph.attr('transform', transform + ' translate(' + x + ',' + y + ')');
                    }
                    else if (transform) {
                      glymph.attr('transform', transform);
                    }
                    else if (x || y) {
                      glymph.attr('transform', 'translate(' + x + ',' + y + ')');
                    }
                    $(this).replaceWith(glymph);
                  });
                  // Remove the style tag because it interferes with SVG-Edit.
                  svg.removeAttr('style');
                  svg.attr('xmlns', 'http://www.w3.org/2000/svg');
                  svgCanvas.importSvgString($('<div>').append(svg.clone()).html(), true);
                  svgCanvas.ungroupSelectedElement();
                  // TODO: To undo the adding of the Formula you now have to undo twice.
                  // This should only be once!
                  svgCanvas.moveSelectedElements(locationX, locationY, true);
                }
              );
            }
          
            return {
              name: "MathJax",
              svgicons: svgEditor.curConfig.extPath + "mathjax-icons.xml",
              buttons: [{
                  id: "tool_mathjax",
                  type: "mode",
                  title: "Add Mathematics",
                  events: {
                    click: function() {
                      // Only load Mathjax when needed, we don't want to strain Svg-Edit any more. 
                      // From this point on it is very probable that it will be needed, so load it.
                      if (mathjaxLoaded === false) {
          
                        $('<div id="mathjax">\
                          <!-- Here is where MathJax creates the math -->\
                            <div id="mathjax_creator" class="tex2jax_process" style="display:none">\
                              $${}$$\
                            </div>\
                            <div id="mathjax_overlay"></div>\
                            <div id="mathjax_container">\
                              <div id="tool_mathjax_back" class="toolbar_button">\
                                <button id="tool_mathjax_save">OK</button>\
                                <button id="tool_mathjax_cancel">Cancel</button>\
                              </div>\
                              <fieldset>\
                                <legend id="mathjax_legend">Mathematics Editor</legend>\
                                <label>\
                                  <span id="mathjax_explication">Please type your mathematics in \
                                  <a href="http://en.wikipedia.org/wiki/Help:Displaying_a_formula" target="_blank">TeX</a> code.</span></label>\
                                <textarea id="mathjax_code_textarea" spellcheck="false"></textarea>\
                              </fieldset>\
                            </div>\
                          </div>'
                          ).insertAfter('#svg_prefs').hide();
          
                        // Make the MathEditor draggable.
                        $('#mathjax_container').draggable({cancel: 'button,fieldset', containment: 'window'});
          
                        // Add functionality and picture to cancel button.
                        $('#tool_mathjax_cancel').prepend($.getSvgIcon('cancel', true))
                          .on("click touched", function() {
                          $('#mathjax').hide();
                        });
          
                        // Add functionality and picture to the save button.
                        $('#tool_mathjax_save').prepend($.getSvgIcon('ok', true))
                          .on("click touched", function() {
                          saveMath();
                          $('#mathjax').hide();
                        });
          
                        // MathJax preprocessing has to ignore most of the page.
                        $('body').addClass('tex2jax_ignore');
          
                        // Now get (and run) the MathJax Library.
                        $.getScript(mathjaxSrcSecure)
                          .done(function(script, textStatus) {
          
                          // When MathJax is loaded get the div where the math will be rendered.
                          MathJax.Hub.queue.Push(function() {
                            math = MathJax.Hub.getAllJax('#mathjax_creator')[0];
                            console.log(math);
                            mathjaxLoaded = true;
                            console.log('MathJax Loaded');
                          });
          
                        })
                          // If it fails.
                          .fail(function() {
                          console.log("Failed loadeing MathJax.");
                          $.alert("Failed loading MathJax. You will not be able to change the mathematics.");
                        });
                      }
                      // Set the mode.
                      svgCanvas.setMode("mathjax");
                    }
                  }
                }],
              
              mouseDown: function() {
                if (svgCanvas.getMode() === "mathjax") {
                  return {started: true};
                }
              },
              mouseUp: function(opts) {
                if (svgCanvas.getMode() === "mathjax") {
                  // Get the coordinates from your mouse.
                  var zoom = svgCanvas.getZoom();
                  // Get the actual coordinate by dividing by the zoom value
                  locationX = opts.mouse_x / zoom;
                  locationY = opts.mouse_y / zoom;
          
                  $('#mathjax').show();
                  return {started: false}; // Otherwise the last selected object dissapears.
                }
              },
              callback: function() {
                $('<style>').text('\
          				#mathjax fieldset{\
          					padding: 5px;\
          					margin: 5px;\
          					border: 1px solid #DDD;\
          				}\
          				#mathjax label{\
          					display: block;\
          					margin: .5em;\
          				}\
          				#mathjax legend {\
          					max-width:195px;\
          				}\
          				#mathjax_overlay {\
          					position: absolute;\
          					top: 0;\
          					left: 0;\
          					right: 0;\
          					bottom: 0;\
          					background-color: black;\
          					opacity: 0.6;\
          					z-index: 20000;\
          				}\
          				\
          				#mathjax_container {\
          					position: absolute;\
          					top: 50px;\
          					padding: 10px;\
          					background-color: #B0B0B0;\
          					border: 1px outset #777;\
          					opacity: 1.0;\
          					font-family: Verdana, Helvetica, sans-serif;\
          					font-size: .8em;\
          					z-index: 20001;\
          				}\
          				\
          				#tool_mathjax_back {\
          					margin-left: 1em;\
          					overflow: auto;\
          				}\
          				\
          				#mathjax_legend{\
          					font-weight: bold;\
          					font-size:1.1em;\
          				}\
          				\
          				#mathjax_code_textarea {\\n\
                    margin: 5px .7em;\
          					overflow: hidden;\
                    width: 416px;\
          					display: block;\
          					height: 100px;\
          				}\
          			').appendTo('head');
          
                // Add the MathJax configuration.
                //$(mathjaxConfiguration).appendTo('head');
              }
            };
          });
          
        • ext-overview_window.js
          /*globals svgEditor, svgedit, $ */
          /*jslint es5: true, vars: true*/
          /*
           * ext-overview_window.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2013 James Sacksteder
           *
           */
          
          var overviewWindowGlobals = {};
          svgEditor.addExtension("overview_window", function() {	'use strict';
          	//define and insert the base html element
          	var propsWindowHtml= "\
          		<div id=\"overview_window_content_pane\" style=\" width:100%; word-wrap:break-word;  display:inline-block; margin-top:20px;\">\
          			<div id=\"overview_window_content\" style=\"position:relative; left:12px; top:0px;\">\
          				<div style=\"background-color:#A0A0A0; display:inline-block; overflow:visible;\">\
          					<svg id=\"overviewMiniView\" width=\"150\" height=\"100\" x=\"0\" y=\"0\" viewBox=\"0 0 4800 3600\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\
          						<use x=\"0\" y=\"0\" xlink:href=\"#svgroot\"> </use>\
          					 </svg>\
          					 <div id=\"overview_window_view_box\" style=\"min-width:50px; min-height:50px; position:absolute; top:30px; left:30px; z-index:5; background-color:rgba(255,0,102,0.3);\">\
          					 </div>\
          				 </div>\
          			</div>\
          		</div>";
          	$("#sidepanels").append(propsWindowHtml);
          
          	//define dynamic animation of the view box.
          	var updateViewBox = function(){
          		var portHeight=parseFloat($("#workarea").css("height"));
          		var portWidth=parseFloat($("#workarea").css("width"));
          		var portX=$("#workarea").scrollLeft();
          		var portY=$("#workarea").scrollTop();
          		var windowWidth=parseFloat($("#svgcanvas").css("width"));
          		var windowHeight=parseFloat($("#svgcanvas").css("height"));
          		var overviewWidth=$("#overviewMiniView").attr("width");
          		var overviewHeight=$("#overviewMiniView").attr("height");
          		
          		var viewBoxX=portX/windowWidth*overviewWidth;
          		var viewBoxY=portY/windowHeight*overviewHeight;
          		var viewBoxWidth=portWidth/windowWidth*overviewWidth;
          		var viewBoxHeight=portHeight/windowHeight*overviewHeight;
          		
          		$("#overview_window_view_box").css("min-width",viewBoxWidth+"px");
          		$("#overview_window_view_box").css("min-height",viewBoxHeight+"px");
          		$("#overview_window_view_box").css("top",viewBoxY+"px");
          		$("#overview_window_view_box").css("left",viewBoxX+"px");
          	};
          	$("#workarea").scroll(function(){
          		if(!(overviewWindowGlobals.viewBoxDragging)){
          			updateViewBox();
          		}
          	});
          	$("#workarea").resize(updateViewBox);
          	updateViewBox();
          	
          	//comphensate for changes in zoom and canvas size
          	var updateViewDimensions= function(){
          		var viewWidth=$("#svgroot").attr("width");
          		var viewHeight=$("#svgroot").attr("height");
          		var viewX=640;
          		var viewY=480;
          		
          		if(svgedit.browser.isIE())
          		{
          			//This has only been tested with Firefox 10 and IE 9 (without chrome frame).
          			//I am not sure if if is Firefox or IE that is being non compliant here.
          			//Either way the one that is noncompliant may become more compliant later.
          			//TAG:HACK  
          			//TAG:VERSION_DEPENDENT
          			//TAG:BROWSER_SNIFFING
          			viewX=0;
          			viewY=0;
          		}
          		
          		var svgWidth_old=$("#overviewMiniView").attr("width");
          		var svgHeight_new=viewHeight/viewWidth*svgWidth_old;
          		$("#overviewMiniView").attr("viewBox",viewX+" "+viewY+" "+viewWidth+" "+viewHeight);
          		$("#overviewMiniView").attr("height",svgHeight_new);
          		updateViewBox();
          	};
          	updateViewDimensions();
          	
          	//set up the overview window as a controller for the view port.
          	overviewWindowGlobals.viewBoxDragging=false;
          	var updateViewPortFromViewBox = function(){
          	
          		var windowWidth =parseFloat($("#svgcanvas").css("width" ));
          		var windowHeight=parseFloat($("#svgcanvas").css("height"));
          		var overviewWidth =$("#overviewMiniView").attr("width" );
          		var overviewHeight=$("#overviewMiniView").attr("height");
          		var viewBoxX=parseFloat($("#overview_window_view_box").css("left"));
          		var viewBoxY=parseFloat($("#overview_window_view_box").css("top" ));
          		
          		var portX=viewBoxX/overviewWidth *windowWidth;
          		var portY=viewBoxY/overviewHeight*windowHeight;
          
          		$("#workarea").scrollLeft(portX);
          		$("#workarea").scrollTop(portY);
          	};
          	$( "#overview_window_view_box" ).draggable({  containment: "parent"
          		,drag: updateViewPortFromViewBox
          		,start:function(){overviewWindowGlobals.viewBoxDragging=true; }
          		,stop :function(){overviewWindowGlobals.viewBoxDragging=false;}
          	});  
          	$("#overviewMiniView").click(function(evt){
          		//Firefox doesn't support evt.offsetX and evt.offsetY
          		var mouseX=(evt.offsetX || evt.originalEvent.layerX);
          		var mouseY=(evt.offsetY || evt.originalEvent.layerY);
          		var overviewWidth =$("#overviewMiniView").attr("width" );
          		var overviewHeight=$("#overviewMiniView").attr("height");
          		var viewBoxWidth =parseFloat($("#overview_window_view_box").css("min-width" ));
          		var viewBoxHeight=parseFloat($("#overview_window_view_box").css("min-height"));
           
          		var viewBoxX=mouseX - 0.5 * viewBoxWidth;
          		var viewBoxY=mouseY- 0.5 * viewBoxHeight;
          		//deal with constraints
          		if(viewBoxX<0){
          			viewBoxX=0;
          		}
          		if(viewBoxY<0){
          			viewBoxY=0;
          		}
          		if(viewBoxX+viewBoxWidth>overviewWidth){
          			viewBoxX=overviewWidth-viewBoxWidth;
          		}
          		if(viewBoxY+viewBoxHeight>overviewHeight){
          			viewBoxY=overviewHeight-viewBoxHeight;
          		}
          		
          		$("#overview_window_view_box").css("top",viewBoxY+"px");
          		$("#overview_window_view_box").css("left",viewBoxX+"px");
          		updateViewPortFromViewBox();
          	});
          	
          	return {
          		name: "overview window",
          		canvasUpdated: updateViewDimensions,
          		workareaResized: updateViewBox
          	};
          });
          
        • ext-panning.js
          /*globals svgEditor, svgCanvas*/
          /*jslint eqeq: true*/
          /*
           * ext-panning.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2013 Luis Aguirre
           *
           */
           
          /* 
          	This is a very basic SVG-Edit extension to let tablet/mobile devices panning without problem
          */
          
          svgEditor.addExtension('ext-panning', function() {'use strict';
          	return {
          		name: 'Extension Panning',
          		svgicons: svgEditor.curConfig.extPath + 'ext-panning.xml',
          		buttons: [{
          			id: 'ext-panning',
          			type: 'mode',
          			title: 'Panning',
          			events: {
          				click: function() {
          					svgCanvas.setMode('ext-panning');
          				}
          			}
          		}],
          		mouseDown: function() {
          			if (svgCanvas.getMode() == 'ext-panning') {
          				svgEditor.setPanning(true);
          				return {started: true};
          			}
          		},
          		mouseUp: function() {
          			if (svgCanvas.getMode() == 'ext-panning') {
          				svgEditor.setPanning(false);
          				return {
          					keep: false,
          					element: null
          				};
          			}
          		}
          	};
          });
          
        • ext-panning.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="ext-panning">
          	  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
                            <path fill="#7f0000" stroke="#000000" stroke-width="10" d="m1.00037,150.34581l55.30305,-55.30267l0,27.65093l22.17356,0l0,-44.21833l44.21825,0l0,-22.17357l-27.65095,0l55.30267,-55.30292l55.3035,55.30292l-27.65175,0l0,22.17357l44.21835,0l0,44.21833l22.17357,0l0,-27.65093l55.30345,55.30267l-55.30345,55.3035l0,-27.65175l-22.17357,0l0,44.21834l-44.21835,0l0,22.17355l27.65175,0l-55.3035,55.30348l-55.30267,-55.30348l27.65095,0l0,-22.17355l-44.21825,0l0,-44.21834l-22.17356,0l0,27.65175l-55.30305,-55.3035z"></path>
            	</svg>
          	</g>
          </svg>
          
        • ext-php_savefile.js
          /*globals $, svgCanvas, svgEditor*/
          /*jslint regexp:true*/
          // TODO: Might add support for "exportImage" custom
          //   handler as in "ext-server_opensave.js" (and in savefile.php)
          
          svgEditor.addExtension("php_savefile", {
          	callback: function() {
          		'use strict';
          		function getFileNameFromTitle () {
          			var title = svgCanvas.getDocumentTitle();
          			return $.trim(title);
          		}
          		var save_svg_action = svgEditor.curConfig.extPath + 'savefile.php';
          		svgEditor.setCustomHandlers({
          			save: function(win, data) {
          				var svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data,
          					filename = getFileNameFromTitle();
          
          				$.post(save_svg_action, {output_svg: svg, filename: filename});
          			}
          		});
          	}
          });
          
        • ext-polygon.js
          /*globals svgEditor, svgCanvas, svgedit, $*/
          /*jslint vars: true, eqeq: true, todo: true */
          /*
           * ext-polygon.js
           *
           *
           * Copyright(c) 2010 CloudCanvas, Inc.
           * All rights reserved
           *
           */
          svgEditor.addExtension("polygon", function(S) {'use strict';
          
              var // NS = svgedit.NS,
          		// svgcontent = S.svgcontent,
          		// addElem = S.addSvgElementFromJson,
          		selElems,
          		editingitex = false,
          		// svgdoc = S.svgroot.parentNode.ownerDocument,
          		// newFOG, newFOGParent, newDef, newImageName, newMaskID, modeChangeG,
          		// edg = 0,
          		// undoCommand = "Not image";
          		started, newFO;
              
              // var ccZoom;
              // var wEl, hEl;
              // var wOffset, hOffset;
              // var ccRBG;
          	var ccRgbEl;
              // var ccOpacity;
              // var brushW, brushH;
          	var shape;
              
              // var ccDebug = document.getElementById('debugpanel');
              
              /* var properlySourceSizeTextArea = function(){
               // TODO: remove magic numbers here and get values from CSS
               var height = $('#svg_source_container').height() - 80;
               $('#svg_source_textarea').css('height', height);
               }; */
              function showPanel(on){
                  var fc_rules = $('#fc_rules');
                  if (!fc_rules.length) {
                      fc_rules = $('<style id="fc_rules"></style>').appendTo('head');
                  }
                  fc_rules.text(!on ? "" : " #tool_topath { display: none !important; }");
                  $('#polygon_panel').toggle(on);
              }
              
          	/*
              function toggleSourceButtons(on){
                  $('#tool_source_save, #tool_source_cancel').toggle(!on);
                  $('#polygon_save, #polygon_cancel').toggle(on);
              }
          	*/
              
              function setAttr(attr, val){
                  svgCanvas.changeSelectedAttribute(attr, val);
                  S.call("changed", selElems);
              }
              
              function cot(n){
                  return 1 / Math.tan(n);
              }
              
              function sec(n){
                  return 1 / Math.cos(n);
              }
          
          	/**
          	* Obtained from http://code.google.com/p/passenger-top/source/browse/instiki/public/svg-edit/editor/extensions/ext-itex.js?r=3
          	* This function sets the content of of the currently-selected foreignObject element,
          	*   based on the itex contained in string.
          	* @param {string} tex The itex text.
          	* @returns This function returns false if the set was unsuccessful, true otherwise.
          	*/
          	/*
          	function setItexString(tex) {
          		var mathns = 'http://www.w3.org/1998/Math/MathML',
          			xmlnsns = 'http://www.w3.org/2000/xmlns/',
          			ajaxEndpoint = '../../itex';
          		var elt = selElems[0];
          		try {
          			var math = svgdoc.createElementNS(mathns, 'math');
          			math.setAttributeNS(xmlnsns, 'xmlns', mathns);
          			math.setAttribute('display', 'inline');
          			var semantics = document.createElementNS(mathns, 'semantics');
          			var annotation = document.createElementNS(mathns, 'annotation');
          			annotation.setAttribute('encoding', 'application/x-tex');
          			annotation.textContent = tex;
          			var mrow = document.createElementNS(mathns, 'mrow');
          			semantics.appendChild(mrow);
          			semantics.appendChild(annotation);
          			math.appendChild(semantics);
          			// make an AJAX request to the server, to get the MathML
          			$.post(ajaxEndpoint, {'tex': tex, 'display': 'inline'}, function(data){
          				var children = data.documentElement.childNodes;
          				while (children.length > 0) {
          				     mrow.appendChild(svgdoc.adoptNode(children[0], true));
          				}
          				S.sanitizeSvg(math);
          				S.call("changed", [elt]);
          			});
          			elt.replaceChild(math, elt.firstChild);
          			S.call("changed", [elt]);
          			svgCanvas.clearSelection();
          		} catch(e) {
          			console.log(e);
          			return false;
          		}
          
          		return true;
          	}
          	*/
              return {
                  name: "polygon",
                  svgicons: svgEditor.curConfig.extPath + "polygon-icons.svg",
                  buttons: [{
                      id: "tool_polygon",
                      type: "mode",
                      title: "Polygon Tool",
                      position: 11,
                      events: {
                          'click': function(){
                              svgCanvas.setMode('polygon');
          					showPanel(true);
                          }
                      }
                  }],
                  
                  context_tools: [{
                      type: "input",
                      panel: "polygon_panel",
                      title: "Number of Sides",
                      id: "polySides",
                      label: "sides",
                      size: 3,
                      defval: 5,
                      events: {
                          change: function(){
                              setAttr('sides', this.value);
                          }
                      }
                  }],
                  
                  callback: function(){
                  
                      $('#polygon_panel').hide();
                      
                      var endChanges = function(){
                      };
                      
                      // TODO: Needs to be done after orig icon loads
                      setTimeout(function(){
                          // Create source save/cancel buttons
                          var save = $('#tool_source_save').clone().hide().attr('id', 'polygon_save').unbind().appendTo("#tool_source_back").click(function(){
                          
                              if (!editingitex) {
          						return;
          					}
          					// Todo: Uncomment the setItexString() function above and handle ajaxEndpoint?
                              if (!setItexString($('#svg_source_textarea').val())) {
                                  $.confirm("Errors found. Revert to original?", function(ok){
                                      if (!ok) {
          								return false;
          							}
                                      endChanges();
                                  });
                              }
                              else {
                                  endChanges();
                              }
                              // setSelectMode();	
                          });
                          
                          var cancel = $('#tool_source_cancel').clone().hide().attr('id', 'polygon_cancel').unbind().appendTo("#tool_source_back").click(function(){
                              endChanges();
                          });
                          
                      }, 3000);
                  },
                  mouseDown: function(opts){
                      // var e = opts.event;
                      var rgb = svgCanvas.getColor("fill");
                      ccRgbEl = rgb.substring(1, rgb.length);
                      var sRgb = svgCanvas.getColor("stroke");
                      // ccSRgbEl = sRgb.substring(1, rgb.length);
                      var sWidth = svgCanvas.getStrokeWidth();
                      
                      if (svgCanvas.getMode() == "polygon") {
                          started = true;
                          
                          newFO = S.addSvgElementFromJson({
                              "element": "polygon",
                              "attr": {
                                  "cx": opts.start_x,
                                  "cy": opts.start_y,
                                  "id": S.getNextId(),
                                  "shape": "regularPoly",
                                  "sides": document.getElementById("polySides").value,
                                  "orient": "x",
                                  "edge": 0,
                                  "fill": rgb,
                                  "strokecolor": sRgb,
                                  "strokeWidth": sWidth
                              }
                          });
                          
                          return {
                              started: true
                          };
                      }
                  },
                  mouseMove: function(opts){
                      if (!started) {
                          return;
          			}
                      if (svgCanvas.getMode() == "polygon") {
                          // var e = opts.event;
                          var x = opts.mouse_x;
                          var y = opts.mouse_y;
                          var c = $(newFO).attr(["cx", "cy", "sides", "orient", "fill", "strokecolor", "strokeWidth"]);
                          var cx = c.cx, cy = c.cy, fill = c.fill, strokecolor = c.strokecolor, strokewidth = c.strokeWidth, sides = c.sides,
          					// orient = c.orient,
          					edg = (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy))) / 1.5;
                          newFO.setAttributeNS(null, "edge", edg);
                          
                          var inradius = (edg / 2) * cot(Math.PI / sides);
                          var circumradius = inradius * sec(Math.PI / sides);
                          var points = '';
          				var s;
                          for (s = 0; sides >= s; s++) {
                              var angle = 2.0 * Math.PI * s / sides;
                              x = (circumradius * Math.cos(angle)) + cx;
                              y = (circumradius * Math.sin(angle)) + cy;
                              
                              points += x + ',' + y + ' ';
                          }
                          
                          //var poly = newFO.createElementNS(NS.SVG, 'polygon');
                          newFO.setAttributeNS(null, 'points', points);
                          newFO.setAttributeNS(null, 'fill', fill);
                          newFO.setAttributeNS(null, 'stroke', strokecolor);
                          newFO.setAttributeNS(null, 'stroke-width', strokewidth);
          				// newFO.setAttributeNS(null, 'transform', "rotate(-90)");
                          shape = newFO.getAttributeNS(null, 'shape');
                          //newFO.appendChild(poly);
                          //DrawPoly(cx, cy, sides, edg, orient);
                          return {
                              started: true
                          };
                      }
                      
                  },
                  
                  mouseUp: function(opts){
                      if (svgCanvas.getMode() == "polygon") {
                          var attrs = $(newFO).attr("edge");
                          var keep = (attrs.edge != 0);
                         // svgCanvas.addToSelection([newFO], true);
                          return {
                              keep: keep,
                              element: newFO
                          };
                      }
                      
                  },
                  selectedChanged: function(opts){
                      // Use this to update the current selected elements
                      selElems = opts.elems;
                      
                      var i = selElems.length;
                      
                      while (i--) {
                          var elem = selElems[i];
                          if (elem && elem.getAttributeNS(null, 'shape') === 'regularPoly') {
                              if (opts.selectedElement && !opts.multiselected) {
                                  $('#polySides').val(elem.getAttribute("sides"));
                                  
                                  showPanel(true);
                              }
                              else {
                                  showPanel(false);
                              }
                          }
                          else {
                              showPanel(false);
                          }
                      }
                  },
                  elementChanged: function(opts){
                      // var elem = opts.elems[0];
                  }
              };
          });
          
        • ext-server_moinsave.js
          /*globals svgEditor, svgedit, svgCanvas, canvg, $, top*/
          /*jslint vars: true*/
          /*
           * ext-server_moinsave.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Alexis Deveria
           *              2011 MoinMoin:ReimarBauer
           *                   adopted for moinmoins item storage. it sends in one post png and svg data
           *                   (I agree to dual license my work to additional GPLv2 or later)
           *
           */
          
          svgEditor.addExtension("server_opensave", {
          	callback: function() {'use strict';
          		var Utils = svgedit.utilities;
          		var save_svg_action = '/+modify';
          		
          		// Create upload target (hidden iframe)
          		var target = $('<iframe name="output_frame" src="#"/>').hide().appendTo('body');
          	
          		svgEditor.setCustomHandlers({
          			save: function(win, data) {
          				var svg = "<?xml version=\"1.0\"?>\n" + data;
          				var qstr = $.param.querystring();
          				var name = qstr.substr(9).split('/+get/')[1];
          				var svg_data = Utils.encode64(svg);
          				if(!$('#export_canvas').length) {
          					$('<canvas>', {id: 'export_canvas'}).hide().appendTo('body');
          				}
          				var c = $('#export_canvas')[0];
          				c.width = svgCanvas.contentW;
          				c.height = svgCanvas.contentH;
          				Utils.buildCanvgCallback(function () {
          					canvg(c, svg, {renderCallback: function() {
          						var datauri = c.toDataURL('image/png');
          						// var uiStrings = svgEditor.uiStrings;
          						var png_data = Utils.encode64(datauri); // Brett: This encoding seems unnecessary
          						var form = $('<form>').attr({
          						method: 'post',
          						action: save_svg_action + '/' + name,
          						target: 'output_frame'
          					}).append('<input type="hidden" name="png_data" value="' + png_data + '">')
          						.append('<input type="hidden" name="filepath" value="' + svg_data + '">')
          						.append('<input type="hidden" name="filename" value="' + 'drawing.svg">')
          						.append('<input type="hidden" name="contenttype" value="application/x-svgdraw">')
          						.appendTo('body')
          						.submit().remove();
          					}});
          				})();
          				alert("Saved! Return to Item View!");
          				top.window.location = '/'+name;
          			}
          		});
          	
          	}
          });
          
          
        • ext-server_opensave.js
          /*globals svgEditor, svgedit, svgCanvas, canvg, $*/
          /*jslint eqeq: true, browser:true*/
          /*
           * ext-server_opensave.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Alexis Deveria
           *
           */
          
          svgEditor.addExtension("server_opensave", {
          	callback: function() {
          		'use strict';
          		function getFileNameFromTitle () {
          			var title = svgCanvas.getDocumentTitle();
          			// We convert (to underscore) only those disallowed Win7 file name characters
          			return $.trim(title).replace(/[\/\\:*?"<>|]/g, '_');
          		}
          		function xhtmlEscape(str) {
          			return str.replace(/&(?!amp;)/g, '&amp;').replace(/"/g, '&quot;').replace(/</g, '&lt;'); // < is actually disallowed above anyways
          		}
          		function clientDownloadSupport (filename, suffix, uri) {
          			var a,
          				support = $('<a>')[0].download === '';
          			if (support) {
          				a = $('<a>hidden</a>').attr({download: (filename || 'image') + suffix, href: uri}).css('display', 'none').appendTo('body');
          				a[0].click();
          				return true;
          			}
          		}
          		var open_svg_action, import_svg_action, import_img_action,
          			open_svg_form, import_svg_form, import_img_form,
          			save_svg_action = svgEditor.curConfig.extPath + 'filesave.php',
          			save_img_action = svgEditor.curConfig.extPath + 'filesave.php',
          			// Create upload target (hidden iframe)
          			cancelled = false,
          			Utils = svgedit.utilities;
          	
          		$('<iframe name="output_frame" src="#"/>').hide().appendTo('body');
          		svgEditor.setCustomHandlers({
          			save: function(win, data) {
          				var svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data, // Firefox doesn't seem to know it is UTF-8 (no matter whether we use or skip the clientDownload code) despite the Content-Disposition header containing UTF-8, but adding the encoding works
          					filename = getFileNameFromTitle();
          
          				if (clientDownloadSupport(filename, '.svg', 'data:image/svg+xml;charset=UTF-8;base64,' + Utils.encode64(svg))) {
          					return;
          				}
          
          				$('<form>').attr({
          					method: 'post',
          					action: save_svg_action,
          					target: 'output_frame'
          				}).append('<input type="hidden" name="output_svg" value="' + xhtmlEscape(svg) + '">')
          					.append('<input type="hidden" name="filename" value="' + xhtmlEscape(filename) + '">')
          					.appendTo('body')
          					.submit().remove();
          			},
          			exportPDF: function (win, data) {
          				var filename = getFileNameFromTitle(),
          					datauri = data.dataurlstring;
          				if (clientDownloadSupport(filename, '.pdf', datauri)) {
          					return;
          				}
          				$('<form>').attr({
          					method: 'post',
          					action: save_img_action,
          					target: 'output_frame'
          				}).append('<input type="hidden" name="output_img" value="' + datauri + '">')
          					.append('<input type="hidden" name="mime" value="application/pdf">')
          					.append('<input type="hidden" name="filename" value="' + xhtmlEscape(filename) + '">')
          					.appendTo('body')
          					.submit().remove();
          			},
          			// Todo: Integrate this extension with a new built-in exportWindowType, "download"
          			exportImage: function(win, data) {
          				var c,
          					issues = data.issues,
          					mimeType = data.mimeType,
          					quality = data.quality;
          				
          				if(!$('#export_canvas').length) {
          					$('<canvas>', {id: 'export_canvas'}).hide().appendTo('body');
          				}
          				c = $('#export_canvas')[0];
          				
          				c.width = svgCanvas.contentW;
          				c.height = svgCanvas.contentH;
          				Utils.buildCanvgCallback(function () {
          					canvg(c, data.svg, {renderCallback: function() {
          						var pre, filename, suffix,
          							datauri = quality ? c.toDataURL(mimeType, quality) : c.toDataURL(mimeType),
          							// uiStrings = svgEditor.uiStrings,
          							note = '';
          						
          						// Check if there are issues
          						if (issues.length) {
          							pre = "\n \u2022 ";
          							note += ("\n\n" + pre + issues.join(pre));
          						} 
          						
          						if(note.length) {
          							alert(note);
          						}
          						
          						filename = getFileNameFromTitle();
          						suffix = '.' + data.type.toLowerCase();
          						
          						if (clientDownloadSupport(filename, suffix, datauri)) {
          							return;
          						}
          
          						$('<form>').attr({
          							method: 'post',
          							action: save_img_action,
          							target: 'output_frame'
          						}).append('<input type="hidden" name="output_img" value="' + datauri + '">')
          							.append('<input type="hidden" name="mime" value="' + mimeType + '">')
          							.append('<input type="hidden" name="filename" value="' + xhtmlEscape(filename) + '">')
          							.appendTo('body')
          							.submit().remove();
          					}});
          				})();
          			}
          		});
          
          		// Do nothing if client support is found
          		if (window.FileReader) {return;}
          		
          		// Change these to appropriate script file
          		open_svg_action = svgEditor.curConfig.extPath + 'fileopen.php?type=load_svg';
          		import_svg_action = svgEditor.curConfig.extPath + 'fileopen.php?type=import_svg';
          		import_img_action = svgEditor.curConfig.extPath + 'fileopen.php?type=import_img';
          		
          		// Set up function for PHP uploader to use
          		svgEditor.processFile = function(str64, type) {
          			var xmlstr;
          			if (cancelled) {
          				cancelled = false;
          				return;
          			}
          		
          			$('#dialog_box').hide();
          
          			if (type !== 'import_img') {
          				xmlstr = Utils.decode64(str64);
          			}
          			
          			switch (type) {
          				case 'load_svg':
          					svgCanvas.clear();
          					svgCanvas.setSvgString(xmlstr);
          					svgEditor.updateCanvas();
          					break;
          				case 'import_svg':
          					svgCanvas.importSvgString(xmlstr);
          					svgEditor.updateCanvas();					
          					break;
          				case 'import_img':
          					svgCanvas.setGoodImage(str64);
          					break;
          			}
          		};
          	
          		// Create upload form
          		open_svg_form = $('<form>');
          		open_svg_form.attr({
          			enctype: 'multipart/form-data',
          			method: 'post',
          			action: open_svg_action,
          			target: 'output_frame'
          		});
          		
          		// Create import form
          		import_svg_form = open_svg_form.clone().attr('action', import_svg_action);
          
          		// Create image form
          		import_img_form = open_svg_form.clone().attr('action', import_img_action);
          		
          		// It appears necessary to rebuild this input every time a file is 
          		// selected so the same file can be picked and the change event can fire.
          		function rebuildInput(form) {
          			form.empty();
          			var inp = $('<input type="file" name="svg_file">').appendTo(form);
          			
          			
          			function submit() {
          				// This submits the form, which returns the file data using svgEditor.processFile()
          				form.submit();
          				
          				rebuildInput(form);
          				$.process_cancel("Uploading...", function() {
          					cancelled = true;
          					$('#dialog_box').hide();
          				});
          			}
          			
          			if(form[0] == open_svg_form[0]) {
          				inp.change(function() {
          					// This takes care of the "are you sure" dialog box
          					svgEditor.openPrep(function(ok) {
          						if(!ok) {
          							rebuildInput(form);
          							return;
          						}
          						submit();
          					});
          				});
          			} else {
          				inp.change(function() {
          					// This submits the form, which returns the file data using svgEditor.processFile()
          					submit();
          				});
          			}
          		}
          		
          		// Create the input elements
          		rebuildInput(open_svg_form);
          		rebuildInput(import_svg_form);
          		rebuildInput(import_img_form);
          
          		// Add forms to buttons
          		$("#tool_open").show().prepend(open_svg_form);
          		$("#tool_import").show().prepend(import_svg_form);
          		$("#tool_image").prepend(import_img_form);
          	}
          });
          
          
        • ext-shapes.js
          /*globals svgEditor, $, DOMParser*/
          /*jslint es5: true, vars: true, eqeq: true*/
          /*
           * ext-shapes.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Christian Tzurcanu
           * Copyright(c) 2010 Alexis Deveria
           *
           */
          
          svgEditor.addExtension('shapes', function() {'use strict';
          	var current_d, cur_shape_id;
          	var canv = svgEditor.canvas;
          	var cur_shape;
          	var start_x, start_y;
          	var svgroot = canv.getRootElem();
          	var lastBBox = {};
          
          	// This populates the category list
          	var categories = {
          		basic: 'Basic',
          		object: 'Objects',
          		symbol: 'Symbols',
          		arrow: 'Arrows',
          		flowchart: 'Flowchart',
          		animal: 'Animals',
          		game: 'Cards & Chess',
          		dialog_balloon: 'Dialog balloons',
          		electronics: 'Electronics',
          		math: 'Mathematical',
          		music: 'Music',
          		misc: 'Miscellaneous',
          		raphael_1: 'raphaeljs.com set 1',
          		raphael_2: 'raphaeljs.com set 2'
          	};
          
          	var library = {
          		basic: {
          			data: {
          				'heart': 'm150,73c61,-175 300,0 0,225c-300,-225 -61,-400 0,-225z',
          				'frame': 'm0,0l300,0l0,300l-300,0zm35,-265l0,230l230,0l0,-230z',
          				'donut': 'm1,150l0,0c0,-82.29042 66.70958,-149 149,-149l0,0c39.51724,0 77.41599,15.69816 105.35889,43.64108c27.94293,27.94293 43.64111,65.84165 43.64111,105.35892l0,0c0,82.29041 -66.70958,149 -149,149l0,0c-82.29041,0 -149,-66.70959 -149,-149zm74.5,0l0,0c0,41.1452 33.35481,74.5 74.5,74.5c41.14522,0 74.5,-33.3548 74.5,-74.5c0,-41.1452 -33.3548,-74.5 -74.5,-74.5l0,0c-41.14519,0 -74.5,33.35481 -74.5,74.5z',
          				'triangle': 'm1,280.375l149,-260.75l149,260.75z',
          				'right_triangle': 'm1,299l0,-298l298,298z',
          				'diamond': 'm1,150l149,-149l149,149l-149,149l-149,-149z',
          				'pentagon': 'm1.00035,116.97758l148.99963,-108.4053l148.99998,108.4053l-56.91267,175.4042l-184.1741,0l-56.91284,-175.4042z',
          				'hexagon': 'm1,149.99944l63.85715,-127.71428l170.28572,0l63.85713,127.71428l-63.85713,127.71428l-170.28572,0l-63.85715,-127.71428z',
          				'septagon1': 'm0.99917,191.06511l29.51249,-127.7108l119.48833,-56.83673l119.48836,56.83673l29.51303,127.7108l-82.69087,102.41679l-132.62103,0l-82.69031,-102.41679z',
          				'heptagon': 'm1,88.28171l87.28172,-87.28171l123.43653,0l87.28172,87.28171l0,123.43654l-87.28172,87.28172l-123.43653,0l-87.28172,-87.28172l0,-123.43654z',
          				'decagon': 'm1,150.00093l28.45646,-88.40318l74.49956,-54.63682l92.08794,0l74.50002,54.63682l28.45599,88.40318l-28.45599,88.40318l-74.50002,54.63681l-92.08794,0l-74.49956,-54.63681l-28.45646,-88.40318z',
          				'dodecagon': 'm1,110.07421l39.92579,-69.14842l69.14842,-39.92579l79.85159,0l69.14842,39.92579l39.92578,69.14842l0,79.85159l-39.92578,69.14842l-69.14842,39.92578l-79.85159,0l-69.14842,-39.92578l-39.92579,-69.14842l0,-79.85159z',
          				'star_points_5': 'm1,116.58409l113.82668,0l35.17332,-108.13487l35.17334,108.13487l113.82666,0l-92.08755,66.83026l35.17514,108.13487l-92.08759,-66.83208l-92.08757,66.83208l35.17515,-108.13487l-92.08758,-66.83026z',
          				'trapezoid': 'm1,299l55.875,-298l186.25001,0l55.87498,298z',
          				'arrow_up': 'm1.49805,149.64304l148.50121,-148.00241l148.50121,148.00241l-74.25061,0l0,148.71457l-148.5012,0l0,-148.71457z',
          				'vertical_scrool': 'm37.375,261.625l0,-242.9375l0,0c0,-10.32083 8.36669,-18.6875 18.6875,-18.6875l224.25,0c10.32083,0 18.6875,8.36667 18.6875,18.6875c0,10.32081 -8.36667,18.6875 -18.6875,18.6875l-18.6875,0l0,242.9375c0,10.32083 -8.36668,18.6875 -18.6875,18.6875l-224.25,0l0,0c-10.32083,0 -18.6875,-8.36667 -18.6875,-18.6875c0,-10.32083 8.36667,-18.6875 18.6875,-18.6875zm37.375,-261.625l0,0c10.32081,0 18.6875,8.36667 18.6875,18.6875c0,10.32081 -8.36669,18.6875 -18.6875,18.6875c-5.1604,0 -9.34375,-4.18335 -9.34375,-9.34375c0,-5.16041 4.18335,-9.34375 9.34375,-9.34375l18.6875,0m186.875,18.6875l-205.5625,0m-37.375,224.25l0,0c5.1604,0 9.34375,4.18335 9.34375,9.34375c0,5.1604 -4.18335,9.34375 -9.34375,9.34375l18.6875,0m-18.6875,18.6875l0,0c10.32081,0 18.6875,-8.36667 18.6875,-18.6875l0,-18.6875',
          				'smiley': 'm68.49886,214.78838q81.06408,55.67332 161.93891,0m-144.36983,-109.9558c0,-8.60432 6.97517,-15.57949 15.57948,-15.57949c8.60431,0 15.57948,6.97517 15.57948,15.57949c0,8.60431 -6.97517,15.57947 -15.57948,15.57947c-8.60431,0 -15.57948,-6.97516 -15.57948,-15.57947m95.83109,0c0,-8.60432 6.97517,-15.57949 15.57948,-15.57949c8.60431,0 15.57947,6.97517 15.57947,15.57949c0,8.60431 -6.97516,15.57947 -15.57947,15.57947c-8.60429,0 -15.57948,-6.97516 -15.57948,-15.57947m-181.89903,44.73038l0,0c0,-82.60133 66.96162,-149.56296 149.56296,-149.56296c82.60135,0 149.56296,66.96162 149.56296,149.56296c0,82.60135 -66.96161,149.56296 -149.56296,149.56296c-82.60133,0 -149.56296,-66.96161 -149.56296,-149.56296zm0,0l0,0c0,-82.60133 66.96162,-149.56296 149.56296,-149.56296c82.60135,0 149.56296,66.96162 149.56296,149.56296c0,82.60135 -66.96161,149.56296 -149.56296,149.56296c-82.60133,0 -149.56296,-66.96161 -149.56296,-149.56296z',
          				'left_braket': 'm174.24565,298.5c-13.39009,0 -24.24489,-1.80908 -24.24489,-4.04065l0,-140.4187c0,-2.23158 -10.85481,-4.04065 -24.2449,-4.04065l0,0c13.39009,0 24.2449,-1.80907 24.2449,-4.04065l0,-140.4187l0,0c0,-2.23159 10.8548,-4.04066 24.24489,-4.04066',
          				'uml_actor': 'm40.5,100l219,0m-108.99991,94.00006l107,105m-107.00009,-106.00006l-100,106m99.5,-231l0,125m33.24219,-158.75781c0,18.35916 -14.88303,33.24219 -33.24219,33.24219c-18.35916,0 -33.2422,-14.88303 -33.2422,-33.24219c0.00002,-18.35915 14.88304,-33.24219 33.2422,-33.24219c18.35916,0 33.24219,14.88304 33.24219,33.24219z',
          				'dialog_balloon_1': 'm0.99786,35.96579l0,0c0,-19.31077 15.28761,-34.96524 34.14583,-34.96524l15.52084,0l0,0l74.50001,0l139.68748,0c9.05606,0 17.74118,3.68382 24.14478,10.24108c6.40356,6.55726 10.00107,15.45081 10.00107,24.72416l0,87.41311l0,0l0,52.44785l0,0c0,19.31078 -15.2876,34.96524 -34.14584,34.96524l-139.68748,0l-97.32507,88.90848l22.82506,-88.90848l-15.52084,0c-18.85822,0 -34.14583,-15.65446 -34.14583,-34.96524l0,0l0,-52.44785l0,0z',
          				'cloud': 'm182.05086,34.31005c-0.64743,0.02048 -1.27309,0.07504 -1.92319,0.13979c-10.40161,1.03605 -19.58215,7.63722 -24.24597,17.4734l-2.47269,7.44367c0.53346,-2.57959 1.35258,-5.08134 2.47269,-7.44367c-8.31731,-8.61741 -19.99149,-12.59487 -31.52664,-10.72866c-11.53516,1.8662 -21.55294,9.3505 -27.02773,20.19925c-15.45544,-9.51897 -34.72095,-8.94245 -49.62526,1.50272c-14.90431,10.44516 -22.84828,28.93916 -20.43393,47.59753l1.57977,7.58346c-0.71388,-2.48442 -1.24701,-5.01186 -1.57977,-7.58346l-0.2404,0.69894c-12.95573,1.4119 -23.58103,11.46413 -26.34088,24.91708c-2.75985,13.45294 2.9789,27.25658 14.21789,34.21291l17.54914,4.26352c-6.1277,0.50439 -12.24542,-0.9808 -17.54914,-4.26352c-8.66903,9.71078 -10.6639,24.08736 -4.94535,35.96027c5.71854,11.87289 17.93128,18.70935 30.53069,17.15887l7.65843,-2.02692c-2.46413,1.0314 -5.02329,1.70264 -7.65843,2.02692c7.15259,13.16728 19.01251,22.77237 32.93468,26.5945c13.92217,3.82214 28.70987,1.56322 41.03957,-6.25546c10.05858,15.86252 27.91113,24.19412 45.81322,21.38742c17.90208,-2.8067 32.66954,-16.26563 37.91438,-34.52742l1.82016,-10.20447c-0.27254,3.46677 -0.86394,6.87508 -1.82016,10.20447c12.31329,8.07489 27.80199,8.52994 40.52443,1.18819c12.72244,-7.34175 20.6609,-21.34155 20.77736,-36.58929l-4.56108,-22.7823l-17.96776,-15.41455c13.89359,8.70317 22.6528,21.96329 22.52884,38.19685c16.5202,0.17313 30.55292,-13.98268 36.84976,-30.22897c6.29684,-16.24631 3.91486,-34.76801 -6.2504,-48.68089c4.21637,-10.35873 3.96622,-22.14172 -0.68683,-32.29084c-4.65308,-10.14912 -13.23602,-17.69244 -23.55914,-20.65356c-2.31018,-13.45141 -11.83276,-24.27162 -24.41768,-27.81765c-12.58492,-3.54603 -25.98557,0.82654 -34.41142,11.25287l-5.11707,8.63186c1.30753,-3.12148 3.01521,-6.03101 5.11707,-8.63186c-5.93959,-8.19432 -15.2556,-12.8181 -24.96718,-12.51096z',
          				'cylinder': 'm299.0007,83.77844c0,18.28676 -66.70958,33.11111 -149.00002,33.11111m149.00002,-33.11111l0,0c0,18.28676 -66.70958,33.11111 -149.00002,33.11111c-82.29041,0 -148.99997,-14.82432 -148.99997,-33.11111m0,0l0,0c0,-18.28674 66.70956,-33.1111 148.99997,-33.1111c82.29044,0 149.00002,14.82436 149.00002,33.1111l0,132.44449c0,18.28674 -66.70958,33.11105 -149.00002,33.11105c-82.29041,0 -148.99997,-14.82431 -148.99997,-33.11105z',
          				'arrow_u_turn': 'm1.00059,299.00055l0,-167.62497l0,0c0,-72.00411 58.37087,-130.37499 130.375,-130.37499l0,0l0,0c34.57759,0 67.73898,13.7359 92.18906,38.18595c24.45006,24.45005 38.18593,57.61144 38.18593,92.18904l0,18.625l37.24997,0l-74.49995,74.50002l-74.50002,-74.50002l37.25,0l0,-18.625c0,-30.8589 -25.0161,-55.87498 -55.87498,-55.87498l0,0l0,0c-30.85892,0 -55.875,25.01608 -55.875,55.87498l0,167.62497z',
          				'arrow_left_up': 'm0.99865,224.5l74.50004,-74.5l0,37.25l111.74991,0l0,-111.75l-37.25,0l74.5,-74.5l74.5,74.5l-37.25,0l0,186.25l-186.24989,0l0,37.25l-74.50005,-74.5z',
          				'maximize': 'm1.00037,150.34581l55.30305,-55.30267l0,27.65093l22.17356,0l0,-44.21833l44.21825,0l0,-22.17357l-27.65095,0l55.30267,-55.30292l55.3035,55.30292l-27.65175,0l0,22.17357l44.21835,0l0,44.21833l22.17357,0l0,-27.65093l55.30345,55.30267l-55.30345,55.3035l0,-27.65175l-22.17357,0l0,44.21834l-44.21835,0l0,22.17355l27.65175,0l-55.3035,55.30348l-55.30267,-55.30348l27.65095,0l0,-22.17355l-44.21825,0l0,-44.21834l-22.17356,0l0,27.65175l-55.30305,-55.3035z',
          				'cross': 'm0.99844,99.71339l98.71494,0l0,-98.71495l101.26279,0l0,98.71495l98.71495,0l0,101.2628l-98.71495,0l0,98.71494l-101.26279,0l0,-98.71494l-98.71494,0z',
          				'plaque': 'm-0.00197,49.94376l0,0c27.5829,0 49.94327,-22.36036 49.94327,-49.94327l199.76709,0l0,0c0,27.5829 22.36037,49.94327 49.94325,49.94327l0,199.7671l0,0c-27.58289,0 -49.94325,22.36034 -49.94325,49.94325l-199.76709,0c0,-27.58292 -22.36037,-49.94325 -49.94327,-49.94325z',
          				'page': 'm249.3298,298.99744l9.9335,-39.73413l39.73413,-9.93355l-49.66763,49.66768l-248.33237,0l0,-298.00001l298.00001,0l0,248.33234'
          
          			},
          			buttons: []
          		}
          	};
          
          	var cur_lib = library.basic;
          	var mode_id = 'shapelib';
          	var startClientPos = {};
          
          	function loadIcons() {
          		$('#shape_buttons').empty().append(cur_lib.buttons);
          	}
          
          	function makeButtons(cat, shapes) {
          		var size = cur_lib.size || 300;
          		var fill = cur_lib.fill || false;
          		var off = size * 0.05;
          		var vb = [-off, -off, size + off*2, size + off*2].join(' ');
          		var stroke = fill ? 0: (size/30);
          		var shape_icon = new DOMParser().parseFromString(
          			'<svg xmlns="http://www.w3.org/2000/svg"><svg viewBox="' + vb + '"><path fill="'+(fill?'#333':'none')+'" stroke="#000" stroke-width="' + stroke + '" /></svg></svg>',
          			'text/xml');
          
          		var width = 24;
          		var height = 24;
          		shape_icon.documentElement.setAttribute('width', width);
          		shape_icon.documentElement.setAttribute('height', height);
          		var svg_elem = $(document.importNode(shape_icon.documentElement,true));
          
          		var data = shapes.data;
          
          		cur_lib.buttons = [];
          		var id;
          		for (id in data) {
          			var path_d = data[id];
          			var icon = svg_elem.clone();
          			icon.find('path').attr('d', path_d);
          
          			var icon_btn = icon.wrap('<div class="tool_button">').parent().attr({
          				id: mode_id + '_' + id,
          				title: id
          			});
          			// Store for later use
          			cur_lib.buttons.push(icon_btn[0]);
          		}
          	}
          
          	function loadLibrary(cat_id) {
          
          		var lib = library[cat_id];
          
          		if (!lib) {
          			$('#shape_buttons').html('Loading...');
          			$.getJSON(svgEditor.curConfig.extPath + 'shapelib/' + cat_id + '.json', function(result) {
          				cur_lib = library[cat_id] = {
          					data: result.data,
          					size: result.size,
          					fill: result.fill
          				};
          				makeButtons(cat_id, result);
          				loadIcons();
          			});
          			return;
          		}
          		cur_lib = lib;
          		if (!lib.buttons.length) {makeButtons(cat_id, lib);}
          		loadIcons();
          	}
          
          	return {
          		svgicons: svgEditor.curConfig.extPath + 'ext-shapes.xml',
          		buttons: [{
          			id: 'tool_shapelib',
          			type: 'mode_flyout', // _flyout
          			position: 6,
          			title: 'Shape library',
          			events: {
          				click: function() {
          					canv.setMode(mode_id);
          				}
          			}
          		}],
          		callback: function() {
          			$('<style>').text('\
          			#shape_buttons {\
          				overflow: auto;\
          				width: 180px;\
          				max-height: 300px;\
          				display: table-cell;\
          				vertical-align: middle;\
          			}\
          			\
          			#shape_cats {\
          				min-width: 110px;\
          				display: table-cell;\
          				vertical-align: middle;\
          				height: 300px;\
          			}\
          			#shape_cats > div {\
          				line-height: 1em;\
          				padding: .5em;\
          				border:1px solid #B0B0B0;\
          				background: #E8E8E8;\
          				margin-bottom: -1px;\
          			}\
          			#shape_cats div:hover {\
          				background: #FFFFCC;\
          			}\
          			#shape_cats div.current {\
          				font-weight: bold;\
          			}').appendTo('head');
          
          			var btn_div = $('<div id="shape_buttons">');
          			$('#tools_shapelib > *').wrapAll(btn_div);
          
          			var shower = $('#tools_shapelib_show');
          
          			loadLibrary('basic');
          
          			// Do mouseup on parent element rather than each button
          			$('#shape_buttons').mouseup(function(evt) {
          				var btn = $(evt.target).closest('div.tool_button');
          
          				if (!btn.length) {return;}
          
          				var copy = btn.children().clone();
          				shower.children(':not(.flyout_arrow_horiz)').remove();
          				shower
          					.append(copy)
          					.attr('data-curopt', '#' + btn[0].id) // This sets the current mode
          					.mouseup();
          				canv.setMode(mode_id);
          
          				cur_shape_id = btn[0].id.substr((mode_id+'_').length);
          				current_d = cur_lib.data[cur_shape_id];
          
          				$('.tools_flyout').fadeOut();
          			});
          
          			var shape_cats = $('<div id="shape_cats">');
          			var cat_str = '';
          
          			$.each(categories, function(id, label) {
          				cat_str += '<div data-cat=' + id + '>' + label + '</div>';
          			});
          
          			shape_cats.html(cat_str).children().bind('mouseup', function() {
          				var catlink = $(this);
          				catlink.siblings().removeClass('current');
          				catlink.addClass('current');
          
          				loadLibrary(catlink.attr('data-cat'));
          				// Get stuff
          				return false;
          			});
          
          			shape_cats.children().eq(0).addClass('current');
          
          			$('#tools_shapelib').append(shape_cats);
          
          			shower.mouseup(function() {
          				canv.setMode(current_d ? mode_id : 'select');
          			});
          			$('#tool_shapelib').remove();
          
          			var h = $('#tools_shapelib').height();
          			$('#tools_shapelib').css({
          				'margin-top': -(h/2 - 15),
          				'margin-left': 3
          			});
          		},
          		mouseDown: function(opts) {
          			var mode = canv.getMode();
          			if (mode !== mode_id) {return;}
          
          			start_x = opts.start_x;
          			var x = start_x;
          			start_y = opts.start_y;
          			var y = start_y;
          			var cur_style = canv.getStyle();
          		 
          			startClientPos.x = opts.event.clientX;
          			startClientPos.y = opts.event.clientY;
          
          			cur_shape = canv.addSvgElementFromJson({
          				'element': 'path',
          				'curStyles': true,
          				'attr': {
          					'd': current_d,
          					'id': canv.getNextId(),
          					'opacity': cur_style.opacity / 2,
          					'style': 'pointer-events:none'
          				}
          			});
          
          			// Make sure shape uses absolute values
          			if (/[a-z]/.test(current_d)) {
          				current_d = cur_lib.data[cur_shape_id] = canv.pathActions.convertPath(cur_shape);
          				cur_shape.setAttribute('d', current_d);
          				canv.pathActions.fixEnd(cur_shape);
          			}
          			cur_shape.setAttribute('transform', 'translate(' + x + ',' + y + ') scale(0.005) translate(' + -x + ',' + -y + ')');
          
          			canv.recalculateDimensions(cur_shape);
          
          			var tlist = canv.getTransformList(cur_shape);
          
          			lastBBox = cur_shape.getBBox();
          
          			return {
          				started: true
          			};
          		},
          		mouseMove: function(opts) {
          			var mode = canv.getMode();
          			if (mode !== mode_id) {return;}
          
          			var zoom = canv.getZoom();
          			var evt = opts.event;
          
          			var x = opts.mouse_x/zoom;
          			var y = opts.mouse_y/zoom;
          
          			var tlist = canv.getTransformList(cur_shape),
          				box = cur_shape.getBBox(),
          				left = box.x, top = box.y, width = box.width,
          				height = box.height;
          			var dx = (x-start_x), dy = (y-start_y);
          
          			var newbox = {
          				'x': Math.min(start_x,x),
          				'y': Math.min(start_y,y),
          				'width': Math.abs(x-start_x),
          				'height': Math.abs(y-start_y)
          			};
          
          			var tx = 0, ty = 0,
          				sy = height ? (height+dy)/height : 1,
          				sx = width ? (width+dx)/width : 1;
          
          			sx = (newbox.width / lastBBox.width) || 1;
          			sy = (newbox.height / lastBBox.height) || 1;
          
          			// Not perfect, but mostly works...
          			if (x < start_x) {
          				tx = lastBBox.width;
          			}
          			if (y < start_y) {ty = lastBBox.height;}
          
          			// update the transform list with translate,scale,translate
          			var translateOrigin = svgroot.createSVGTransform(),
          				scale = svgroot.createSVGTransform(),
          				translateBack = svgroot.createSVGTransform();
          
          			translateOrigin.setTranslate(-(left+tx), -(top+ty));
          			if (!evt.shiftKey) {
          				var max = Math.min(Math.abs(sx), Math.abs(sy));
          
          				sx = max * (sx < 0 ? -1 : 1);
          				sy = max * (sy < 0 ? -1 : 1);
          			}
          			scale.setScale(sx,sy);
          
          			translateBack.setTranslate(left+tx, top+ty);
          			tlist.appendItem(translateBack);
          			tlist.appendItem(scale);
          			tlist.appendItem(translateOrigin);
          
          			canv.recalculateDimensions(cur_shape);
          
          			lastBBox = cur_shape.getBBox();
          		},
          		mouseUp: function(opts) {
          			var mode = canv.getMode();
          			if (mode !== mode_id) {return;}
          
          			var keepObject = (opts.event.clientX != startClientPos.x && opts.event.clientY != startClientPos.y);
          
          			return {
          				keep: keepObject,
          				element: cur_shape,
          				started: false
          			};
          		}
          	};
          });
          
          
        • ext-shapes.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="tool_shapelib">
          	  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
          		  <path fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m70,194.72501l0,0c0,-10.30901 35.8172,-18.666 80,-18.666c44.18298,0 80,8.35699 80,18.666l0,74.66699c0,10.30899 -35.81702,18.66699 -80,18.66699c-44.1828,0 -80,-8.358 -80,-18.66699l0,-74.66699z"/>
          		  <path fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m70,114.608l0,0c0,-10.309 35.8172,-18.6668 80,-18.6668c44.18298,0 80,8.3578 80,18.6668l0,74.66699c0,10.30901 -35.81702,18.666 -80,18.666c-44.1828,0 -80,-8.35699 -80,-18.666l0,-74.66699z"/>
          		  <path fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m70,33.6667l0,0c0,-10.3094 35.8172,-18.6667 80,-18.6667c44.18298,0 80,8.3573 80,18.6667l0,74.6663c0,10.31 -35.81702,18.667 -80,18.667c-44.1828,0 -80,-8.357 -80,-18.667l0,-74.6663z"/>
          		  <path id="svg_1" fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m230,32.33334c0,10.30931 -35.81726,18.66666 -80,18.66666c-44.1828,0 -80,-8.35735 -80,-18.66666"/>
            	</svg>
          	</g>
          </svg>
        • ext-star.js
          /*globals svgEditor, svgedit, svgCanvas, $*/
          /*jslint vars: true, eqeq: true*/
          /*
           * ext-star.js
           *
           *
           * Copyright(c) 2010 CloudCanvas, Inc.
           * All rights reserved
           *
           */
          
          svgEditor.addExtension('star', function(S){'use strict';
          
          	var // NS = svgedit.NS,
          		// svgcontent = S.svgcontent,
          		selElems,
          		// editingitex = false,
          		// svgdoc = S.svgroot.parentNode.ownerDocument,
          		started,
          		newFO,
          		// edg = 0,
          		// newFOG, newFOGParent, newDef, newImageName, newMaskID,
          		// undoCommand = 'Not image',
          		// modeChangeG, ccZoom, wEl, hEl, wOffset, hOffset, ccRgbEl, brushW, brushH,
          		shape;
          
          	function showPanel(on){
          		var fc_rules = $('#fc_rules');
          		if (!fc_rules.length) {
          			fc_rules = $('<style id="fc_rules"></style>').appendTo('head');
          		}
          		fc_rules.text(!on ? '' : ' #tool_topath { display: none !important; }');
          		$('#star_panel').toggle(on);
          	}
          
          	/*
          	function toggleSourceButtons(on){
          		$('#star_save, #star_cancel').toggle(on);
          	}
          	*/
          
          	function setAttr(attr, val){
          		svgCanvas.changeSelectedAttribute(attr, val);
          		S.call('changed', selElems);
          	}
          
          	/*
          	function cot(n){
          		return 1 / Math.tan(n);
          	}
          
          	function sec(n){
          		return 1 / Math.cos(n);
          	}
          	*/
          
          	return {
          		name: 'star',
          		svgicons: svgEditor.curConfig.extPath + 'star-icons.svg',
          		buttons: [{
          			id: 'tool_star',
          			type: 'mode',
          			title: 'Star Tool',
          			position: 12,
          			events: {
          				click: function(){
          					showPanel(true);
          					svgCanvas.setMode('star');
          				}
          			}
          		}],
          
          		context_tools: [{
          			type: 'input',
          			panel: 'star_panel',
          			title: 'Number of Sides',
          			id: 'starNumPoints',
          			label: 'points',
          			size: 3,
          			defval: 5,
          			events: {
          				change: function(){
          					setAttr('point', this.value);
          				}
          			}
          		}, {
          			type: 'input',
          			panel: 'star_panel',
          			title: 'Pointiness',
          			id: 'starRadiusMulitplier',
          			label: 'Pointiness',
          			size: 3,
          			defval: 2.5
          		}, {
          			type: 'input',
          			panel: 'star_panel',
          			title: 'Twists the star',
          			id: 'radialShift',
          			label: 'Radial Shift',
          			size: 3,
          			defval: 0,
          			events: {
          				change: function(){
          					setAttr('radialshift', this.value);
          				}
          			}
          		}],
          		callback: function(){
          			$('#star_panel').hide();
          			// var endChanges = function(){};
          		},
          		mouseDown: function(opts){
          			var rgb = svgCanvas.getColor('fill');
          			// var ccRgbEl = rgb.substring(1, rgb.length);
          			var sRgb = svgCanvas.getColor('stroke');
          			// var ccSRgbEl = sRgb.substring(1, rgb.length);
          			var sWidth = svgCanvas.getStrokeWidth();
          
          			if (svgCanvas.getMode() == 'star') {
          				started = true;
          
          				newFO = S.addSvgElementFromJson({
          					'element': 'polygon',
          					'attr': {
          						'cx': opts.start_x,
          						'cy': opts.start_y,
          						'id': S.getNextId(),
          						'shape': 'star',
          						'point': document.getElementById('starNumPoints').value,
          						'r': 0,
          						'radialshift': document.getElementById('radialShift').value,
          						'r2': 0,
          						'orient': 'point',
          						'fill': rgb,
          						'strokecolor': sRgb,
          						'strokeWidth': sWidth
          					}
          				});
          				return {
          					started: true
          				};
          			}
          		},
          		mouseMove: function(opts){
          			if (!started) {
          				return;
          			}
          			if (svgCanvas.getMode() == 'star') {
          				var x = opts.mouse_x;
          				var y = opts.mouse_y;
          				var c = $(newFO).attr(['cx', 'cy', 'point', 'orient', 'fill', 'strokecolor', 'strokeWidth', 'radialshift']);
          
          				var cx = c.cx, cy = c.cy, fill = c.fill, strokecolor = c.strokecolor, strokewidth = c.strokeWidth, radialShift = c.radialshift, point = c.point, orient = c.orient, circumradius = (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy))) / 1.5, inradius = circumradius / document.getElementById('starRadiusMulitplier').value;
          				newFO.setAttributeNS(null, 'r', circumradius);
          				newFO.setAttributeNS(null, 'r2', inradius);
          
          				var polyPoints = '';
          				var s;
          				for (s = 0; point >= s; s++) {
          					var angle = 2.0 * Math.PI * (s / point);
          					if ('point' == orient) {
          						angle -= (Math.PI / 2);
          					} else if ('edge' == orient) {
          						angle = (angle + (Math.PI / point)) - (Math.PI / 2);
          					}
          
          					x = (circumradius * Math.cos(angle)) + cx;
          					y = (circumradius * Math.sin(angle)) + cy;
          
          					polyPoints += x + ',' + y + ' ';
          
          					if (null != inradius) {
          						angle = (2.0 * Math.PI * (s / point)) + (Math.PI / point);
          						if ('point' == orient) {
          							angle -= (Math.PI / 2);
          						} else if ('edge' == orient) {
          							angle = (angle + (Math.PI / point)) - (Math.PI / 2);
          						}
          						angle += radialShift;
          
          						x = (inradius * Math.cos(angle)) + cx;
          						y = (inradius * Math.sin(angle)) + cy;
          
          						polyPoints += x + ',' + y + ' ';
          					}
          				}
          				newFO.setAttributeNS(null, 'points', polyPoints);
          				newFO.setAttributeNS(null, 'fill', fill);
          				newFO.setAttributeNS(null, 'stroke', strokecolor);
          				newFO.setAttributeNS(null, 'stroke-width', strokewidth);
          				shape = newFO.getAttributeNS(null, 'shape');
          
          				return {
          					started: true
          				};
          			}
          
          		},
          		mouseUp: function(){
          			if (svgCanvas.getMode() == 'star') {
          				var attrs = $(newFO).attr(['r']);
          				// svgCanvas.addToSelection([newFO], true);
          				return {
          					keep: (attrs.r != 0),
          					element: newFO
          				};
          			}
          		},
          		selectedChanged: function(opts){
          			// Use this to update the current selected elements
          			selElems = opts.elems;
          
          			var i = selElems.length;
          
          			while (i--) {
          				var elem = selElems[i];
          				if (elem && elem.getAttributeNS(null, 'shape') === 'star') {
          					if (opts.selectedElement && !opts.multiselected) {
          						// $('#starRadiusMulitplier').val(elem.getAttribute('r2'));
          						$('#starNumPoints').val(elem.getAttribute('point'));
          						$('#radialShift').val(elem.getAttribute('radialshift'));
          						showPanel(true);
          					}
          					else {
          						showPanel(false);
          					}
          				} else {
          					showPanel(false);
          				}
          			}
          		},
          		elementChanged: function(opts){
          			// var elem = opts.elems[0];
          		}
          	};
          });
          
        • ext-storage.js
          /*globals svgEditor, svgCanvas, $, widget*/
          /*jslint vars: true, eqeq: true, regexp: true, continue: true*/
          /*
           * ext-storage.js
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Brett Zamir
           *
           */
          /**
          * This extension allows automatic saving of the SVG canvas contents upon
          *  page unload (which can later be automatically retrieved upon future
          *  editor loads).
          *
          *  The functionality was originally part of the SVG Editor, but moved to a
          *  separate extension to make the setting behavior optional, and adapted
          *  to inform the user of its setting of local data.
          */
          
          /*
          TODOS
          1. Revisit on whether to use $.pref over directly setting curConfig in all
          	extensions for a more public API (not only for extPath and imagePath,
          	but other currently used config in the extensions)
          2. We might provide control of storage settings through the UI besides the
              initial (or URL-forced) dialog.
          */
          svgEditor.addExtension('storage', function() {
          	// We could empty any already-set data for users when they decline storage,
          	//  but it would be a risk for users who wanted to store but accidentally
          	// said "no"; instead, we'll let those who already set it, delete it themselves;
          	// to change, set the "emptyStorageOnDecline" config setting to true
          	// in config.js.
          	var emptyStorageOnDecline = svgEditor.curConfig.emptyStorageOnDecline,
          		// When the code in svg-editor.js prevents local storage on load per
          		//  user request, we also prevent storing on unload here so as to
          		//  avoid third-party sites making XSRF requests or providing links
          		// which would cause the user's local storage not to load and then
          		// upon page unload (such as the user closing the window), the storage
          		//  would thereby be set with an empty value, erasing any of the
          		// user's prior work. To change this behavior so that no use of storage
          		// or adding of new storage takes place regardless of settings, set
          		// the "noStorageOnLoad" config setting to true in config.js.
          		noStorageOnLoad = svgEditor.curConfig.noStorageOnLoad,
          		forceStorage = svgEditor.curConfig.forceStorage,
          		storage = svgEditor.storage;
          
          	function replaceStoragePrompt (val) {
          		val = val ? 'storagePrompt=' + val : '';
          		var loc = top.location; // Allow this to work with the embedded editor as well
          		if (loc.href.indexOf('storagePrompt=') > -1) {
          			loc.href = loc.href.replace(/([&?])storagePrompt=[^&]*(&?)/, function (n0, n1, amp) {
          				return (val ? n1 : '') + val + (!val && amp ? n1 : (amp || ''));
          			});
          		}
          		else {
          			loc.href += (loc.href.indexOf('?') > -1 ? '&' : '?') + val;
          		}
          	}
          	function setSVGContentStorage (val) {
          		if (storage) {
          			var name = 'svgedit-' + svgEditor.curConfig.canvasName;
          			if (!val) {
          				storage.removeItem(name);
          			}
          			else {
          				storage.setItem(name, val);
          			}
          		}
          	}
          	
          	function expireCookie (cookie) {
          		document.cookie = encodeURIComponent(cookie) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
          	}
          	
          	function removeStoragePrefCookie () {
          		expireCookie('store');
          	}
          	
          	function emptyStorage() {
          		setSVGContentStorage('');
          		var name;
          		for (name in svgEditor.curPrefs) {
          			if (svgEditor.curPrefs.hasOwnProperty(name)) {
          				name = 'svg-edit-' + name;
          				if (storage) {
          					storage.removeItem(name);
          				}
          				expireCookie(name);
          			}
          		}
          	}
          	
          //	emptyStorage();
          
          	/**
          	* Listen for unloading: If and only if opted in by the user, set the content
          	*   document and preferences into storage:
          	* 1. Prevent save warnings (since we're automatically saving unsaved
          	*       content into storage)
          	* 2. Use localStorage to set SVG contents (potentially too large to allow in cookies)
          	* 3. Use localStorage (where available) or cookies to set preferences.
          	*/
          	function setupBeforeUnloadListener () {
          		window.addEventListener('beforeunload', function(e) {
          			// Don't save anything unless the user opted in to storage
          			if (!document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/)) {
          				return;
          			}
          			var key;
          			if (document.cookie.match(/(?:^|;\s*)store=prefsAndContent/)) {
          				setSVGContentStorage(svgCanvas.getSvgString());			
          			}
          
          			svgEditor.setConfig({no_save_warning: true}); // No need for explicit saving at all once storage is on
          			// svgEditor.showSaveWarning = false;
          
          			var curPrefs = svgEditor.curPrefs;
          
          			for (key in curPrefs) {
          				if (curPrefs.hasOwnProperty(key)) { // It's our own config, so we don't need to iterate up the prototype chain
          					var val = curPrefs[key],
          						store = (val != undefined);
          					key = 'svg-edit-' + key;
          					if (!store) {
          						continue;
          					}
          					if (storage) {
          						storage.setItem(key, val);
          					}
          					else if (window.widget) {
          						widget.setPreferenceForKey(val, key);
          					}
          					else {
          						val = encodeURIComponent(val);
          						document.cookie = encodeURIComponent(key) + '=' + val + '; expires=Fri, 31 Dec 9999 23:59:59 GMT';
          					}
          				}
          			}
          		}, false);
          	}
          
          	/*
          	// We could add locales here instead (and also thereby avoid the need
          	// to keep our content within "langReady"), but this would be less
          	// convenient for translators.
          	$.extend(uiStrings, {confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}});
          	*/
          	var loaded = false;
          	return {
          		name: 'storage',
          		langReady: function (data) {
          			var // lang = data.lang,
          				uiStrings = data.uiStrings, // No need to store as dialog should only run once
          				storagePrompt = $.deparam.querystring(true).storagePrompt;
          
          			// No need to run this one-time dialog again just because the user
          			//   changes the language
          			if (loaded) {
          				return;
          			}
          			loaded = true;
          
          			// Note that the following can load even if "noStorageOnLoad" is
          			//   set to false; to avoid any chance of storage, avoid this
          			//   extension! (and to avoid using any prior storage, set the
          			//   config option "noStorageOnLoad" to true).
          			if (!forceStorage && (
          				// If the URL has been explicitly set to always prompt the
          				//  user (e.g., so one can be pointed to a URL where one
          				// can alter one's settings, say to prevent future storage)...
          				storagePrompt === true ||
          				(
          					// ...or...if the URL at least doesn't explicitly prevent a
          					//  storage prompt (as we use for users who
          					// don't want to set cookies at all but who don't want
          					// continual prompts about it)...
          					storagePrompt !== false &&
          					// ...and this user hasn't previously indicated a desire for storage
          					!document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/)
          				)
          				// ...then show the storage prompt.
          			)) {
          
          				var options = [];
          				if (storage) {
          					options.unshift(
          						{value: 'prefsAndContent', text: uiStrings.confirmSetStorage.storagePrefsAndContent},
          						{value: 'prefsOnly', text: uiStrings.confirmSetStorage.storagePrefsOnly},
          						{value: 'noPrefsOrContent', text: uiStrings.confirmSetStorage.storageNoPrefsOrContent}
          					);
          				}
          				else {
          					options.unshift(
          						{value: 'prefsOnly', text: uiStrings.confirmSetStorage.storagePrefs},
          						{value: 'noPrefsOrContent', text: uiStrings.confirmSetStorage.storageNoPrefs}
          					);
          				}
          
          				// Hack to temporarily provide a wide and high enough dialog
          				var oldContainerWidth = $('#dialog_container')[0].style.width,
          					oldContainerMarginLeft = $('#dialog_container')[0].style.marginLeft,
          					oldContentHeight = $('#dialog_content')[0].style.height,
          					oldContainerHeight = $('#dialog_container')[0].style.height;
          				$('#dialog_content')[0].style.height = '120px';
          				$('#dialog_container')[0].style.height = '170px';
          				$('#dialog_container')[0].style.width = '800px';
          				$('#dialog_container')[0].style.marginLeft = '-400px';
          
          				// Open select-with-checkbox dialog
          				$.select(
          					uiStrings.confirmSetStorage.message,
          					options,
          					function (pref, checked) {
          						if (pref && pref !== 'noPrefsOrContent') {
          							// Regardless of whether the user opted
          							// to remember the choice (and move to a URL which won't
          							// ask them again), we have to assume the user
          							// doesn't even want to remember their not wanting
          							// storage, so we don't set the cookie or continue on with
          							//  setting storage on beforeunload
          							document.cookie = 'store=' + encodeURIComponent(pref) + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; // 'prefsAndContent' | 'prefsOnly'
          							// If the URL was configured to always insist on a prompt, if
          							//    the user does indicate a wish to store their info, we
          							//    don't want ask them again upon page refresh so move
          							//    them instead to a URL which does not always prompt
          							if (storagePrompt === true && checked) {
          								replaceStoragePrompt();
          								return;
          							}
          						}
          						else { // The user does not wish storage (or cancelled, which we treat equivalently)
          							removeStoragePrefCookie();
          							if (pref && // If the user explicitly expresses wish for no storage
          								emptyStorageOnDecline
          							) {
          								emptyStorage();
          							}
          							if (pref && checked) {
          								// Open a URL which won't set storage and won't prompt user about storage
          								replaceStoragePrompt('false');
          								return;
          							}
          						}
          
          						// Reset width/height of dialog (e.g., for use by Export)
          						$('#dialog_container')[0].style.width = oldContainerWidth;
          						$('#dialog_container')[0].style.marginLeft = oldContainerMarginLeft;				
          						$('#dialog_content')[0].style.height = oldContentHeight;
          						$('#dialog_container')[0].style.height = oldContainerHeight;
          						
          						// It should be enough to (conditionally) add to storage on
          						//   beforeunload, but if we wished to update immediately,
          						//   we might wish to try setting:
          						//       svgEditor.setConfig({noStorageOnLoad: true});
          						//   and then call:
          						//       svgEditor.loadContentAndPrefs();
          						
          						// We don't check for noStorageOnLoad here because
          						//   the prompt gives the user the option to store data
          						setupBeforeUnloadListener();
          						
          						svgEditor.storagePromptClosed = true;
          					},
          					null,
          					null,
          					{
          						label: uiStrings.confirmSetStorage.rememberLabel,
          						checked: false,
          						tooltip: uiStrings.confirmSetStorage.rememberTooltip
          					}
          				);
          			}
          			else if (!noStorageOnLoad || forceStorage) {
          				setupBeforeUnloadListener();
          			}
          		}
          	};
          });
          
        • ext-webappfind.js
          /*globals svgEditor*/
          /*
          Depends on Firefox add-on and executables from https://github.com/brettz9/webappfind
          
          Todos:
          1. See WebAppFind Readme for SVG-related todos
          */
          (function () {'use strict';
          
          var pathID,
              saveMessage = 'webapp-save',
              readMessage = 'webapp-read',
              excludedMessages = [readMessage, saveMessage];
          
          window.addEventListener('message', function(e) {
              if (e.origin !== window.location.origin || // PRIVACY AND SECURITY! (for viewing and saving, respectively)
                  (!Array.isArray(e.data) || excludedMessages.indexOf(e.data[0]) > -1) // Validate format and avoid our post below
              ) {
                  return;
              }
              var svgString,
                  messageType = e.data[0];
              switch (messageType) {
                  case 'webapp-view':
                      // Populate the contents
                      pathID = e.data[1];
                      
                      svgString = e.data[2];
                      svgEditor.loadFromString(svgString);
                      
                      /*if ($('#tool_save_file')) {
                          $('#tool_save_file').disabled = false;
                      }*/
                      break;
                  case 'webapp-save-end':
                      alert('save complete for pathID ' + e.data[1] + '!');
                      break;
                  default:
                      throw 'Unexpected mode';
              }
          }, false);
          
          window.postMessage([readMessage], window.location.origin !== 'null' ? window.location.origin : '*'); // Avoid "null" string error for file: protocol (even though file protocol not currently supported by add-on)
          
          svgEditor.addExtension('WebAppFind', function() {
          
              return {
                  name: 'WebAppFind',
                  svgicons: svgEditor.curConfig.extPath + 'webappfind-icon.svg',
                  buttons: [{
                      id: 'webappfind_save', // 
                      type: 'app_menu',
                      title: 'Save Image back to Disk',
                      position: 4, // Before 0-based index position 4 (after the regular "Save Image (S)")
                      events: {
                          click: function () {
                              if (!pathID) { // Not ready yet as haven't received first payload
                                  return;
                              }
                              window.postMessage([saveMessage, pathID, svgEditor.canvas.getSvgString()], window.location.origin);
                          }
                      }
                  }]
              };
          });
          
          }());
          
        • ext-xdomain-messaging.js
          /**
          * Should not be needed for same domain control (just call via child frame),
          *  but an API common for cross-domain and same domain use can be found
          *  in embedapi.js with a demo at embedapi.html
          */
          /*globals svgEditor, svgCanvas*/
          svgEditor.addExtension('xdomain-messaging', function() {'use strict';
          	try {
          		window.addEventListener('message', function(e) {
          			// We accept and post strings for the sake of IE9 support
          			if (typeof e.data !== 'string' || e.data.charAt() === '|') {
          				return;
          			}
          			var cbid, name, args, message, allowedOrigins, data = JSON.parse(e.data);
          			if (!data || typeof data !== 'object' || data.namespace !== 'svgCanvas') {
          				return;
          			}
          			// The default is not to allow any origins, including even the same domain or if run on a file:// URL
          			//  See config-sample.js for an example of how to configure
          			allowedOrigins = svgEditor.curConfig.allowedOrigins;
          			if (allowedOrigins.indexOf('*') === -1 && allowedOrigins.indexOf(e.origin) === -1) {
          				return;
          			}
          			cbid = data.id;
          			name = data.name;
          			args = data.args;
          			message = {
          				namespace: 'svg-edit',
          				id: cbid
          			};
          			try {
          				message.result = svgCanvas[name].apply(svgCanvas, args);
          			} catch (err) {
          				message.error = err.message;
          			}
          			e.source.postMessage(JSON.stringify(message), '*');
          		}, false);
          	}
          	catch (err) {
          		console.log('Error with xdomain message listener: ' + err);
          	}
          });
          
        • eyedropper-icon.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          
          <g id="tool_eyedropper">
          <svg viewBox="0 0 320 320" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <radialGradient id="eyedropper_svg_6" cx="0.5" cy="0.5" r="0.5">
             <stop offset="0" stop-color="#ffffff" stop-opacity="1"/>
             <stop offset="1" stop-color="#e5e5e5" stop-opacity="0.38"/>
            </radialGradient>
            <linearGradient id="eyedropper_svg_15" x1="0" y1="0" x2="0.58594" y2="0.55078">
             <stop offset="0" stop-color="#ffffff" stop-opacity="0.57"/>
             <stop offset="1" stop-color="#000056" stop-opacity="1"/>
            </linearGradient>
            <linearGradient id="eyedropper_svg_19" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#ffffff" stop-opacity="1"/>
             <stop offset="1" stop-color="#ffffff" stop-opacity="0"/>
            </linearGradient>
           </defs>
           <g display="inline">
            <title>Layer 1</title>
            <path d="m193.899994,73l-119.899979,118l-15,39.5l10.25,4.5l43.750015,-20l108.999969,-112l-28.100006,-30z" id="svg_3" fill="none" stroke="#000000" stroke-width="5"/>
            <path d="m58.649994,232c-2.75,28.200012 -26.399994,28.950012 -21.899994,59c4.5,30.049988 55,28 55.5,-1.25c0.5,-29.25 -20.25,-28.75 -22.25,-54.75l-11.350006,-3z" id="svg_4" fill="#aa56ff" stroke="#000000" stroke-width="7"/>
            <path d="m45.474976,269.275024l13.775024,0.474976l-0.75,16.75l-14.25,-1.25l1.224976,-15.974976z" id="svg_5" fill="url(#eyedropper_svg_6)" stroke-width="5" fill-opacity="0.73"/>
            <path d="m217.899994,46c21.5,-101.549999 141.600006,20.449997 28.100006,33l-5,44l-63,-66l39.899994,-11z" id="svg_2" fill="#000000" stroke-width="5"/>
            <path d="m206.825012,61.075008c3.712494,-2.46249 7.637482,-3.53751 14.424988,-5.575008c10.125,-16.5 32.875,-41.5 40.5,-35c7.625,6.5 -21.25,35.625 -37.5,39.25c-5.5,10.125 -8,13.875 -17.25,16.5c-2.837494,-8.162514 -4.262482,-12.337486 -0.174988,-15.174992z" id="svg_7" fill="url(#eyedropper_svg_15)" stroke-width="5"/>
            <path d="m133.049988,134.75l46.950012,9.25l-66,70l-42.5,20.5l-11.5,-5l14,-37.5l59.049988,-57.25z" id="svg_11" fill="#aa56ff" stroke="#000000" stroke-width="7"/>
            <path d="m71.425034,212.350006l9.050888,-20.022537l51.516724,-49.327469l8.507355,0.97197l-69.074966,68.378036z" id="svg_16" fill="url(#eyedropper_svg_19)" stroke-width="5"/>
           </g>
          </svg>
          </g>
          	
          	<g id="svg_eof"/>
          </svg>
        • foreignobject-icons.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="tool_foreign">
          		<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 84 84">
          		  <g fill="#444" opacity="0.2" transform="translate(6,6)">
          		  <path d="M42.8,74.3c0,4.3,0,5.9,11.8,5.9l4.1,0l0,3.8c-4.5-0.4-16.1-0.4-21.2-0.3c-5.1,0-16.6,0-21,0.4l0-3.8l4.1,0
          			c11.8,0,11.8-1.7,11.8-5.9l0-6.9C13.9,65.6,0,54.6,0,42c0-12.2,13.3-23.5,32.4-25.4l0-6.9c0-4.3,0-5.9-11.8-5.9l-4.1,0l0-3.8
          			c4.5,0.4,16.1,0.4,21.2,0.3c5.1,0,16.6,0,21-0.4l0,3.8l-4.1,0c-11.8,0-11.8,1.7-11.8,5.9l0,6.9C61.6,18.1,75.8,29.2,75.8,42
          			c0,12.4-13.8,23.9-33.1,25.4L42.8,74.3z M32.4,19.4c-18.7,2.5-19.9,16.2-19.9,22.6c0,7.6,2.3,20.2,20,22.5L32.4,19.4z M42.7,64.7
          			c18.8-2.2,20.7-15.4,20.6-22.8c0-9.3-3.5-20.6-20.7-22.6L42.7,64.7z"/>
          		  </g>
          		  <g fill="#444" opacity="0.3" transform="translate(4,4)">
          		  <path d="M42.8,74.3c0,4.3,0,5.9,11.8,5.9l4.1,0l0,3.8c-4.5-0.4-16.1-0.4-21.2-0.3c-5.1,0-16.6,0-21,0.4l0-3.8l4.1,0
          			c11.8,0,11.8-1.7,11.8-5.9l0-6.9C13.9,65.6,0,54.6,0,42c0-12.2,13.3-23.5,32.4-25.4l0-6.9c0-4.3,0-5.9-11.8-5.9l-4.1,0l0-3.8
          			c4.5,0.4,16.1,0.4,21.2,0.3c5.1,0,16.6,0,21-0.4l0,3.8l-4.1,0c-11.8,0-11.8,1.7-11.8,5.9l0,6.9C61.6,18.1,75.8,29.2,75.8,42
          			c0,12.4-13.8,23.9-33.1,25.4L42.8,74.3z M32.4,19.4c-18.7,2.5-19.9,16.2-19.9,22.6c0,7.6,2.3,20.2,20,22.5L32.4,19.4z M42.7,64.7
          			c18.8-2.2,20.7-15.4,20.6-22.8c0-9.3-3.5-20.6-20.7-22.6L42.7,64.7z"/>
          		  </g>
          		  <g fill="#444" opacity="0.5" transform="translate(2,2)">
          		  <path d="M42.8,74.3c0,4.3,0,5.9,11.8,5.9l4.1,0l0,3.8c-4.5-0.4-16.1-0.4-21.2-0.3c-5.1,0-16.6,0-21,0.4l0-3.8l4.1,0
          			c11.8,0,11.8-1.7,11.8-5.9l0-6.9C13.9,65.6,0,54.6,0,42c0-12.2,13.3-23.5,32.4-25.4l0-6.9c0-4.3,0-5.9-11.8-5.9l-4.1,0l0-3.8
          			c4.5,0.4,16.1,0.4,21.2,0.3c5.1,0,16.6,0,21-0.4l0,3.8l-4.1,0c-11.8,0-11.8,1.7-11.8,5.9l0,6.9C61.6,18.1,75.8,29.2,75.8,42
          			c0,12.4-13.8,23.9-33.1,25.4L42.8,74.3z M32.4,19.4c-18.7,2.5-19.9,16.2-19.9,22.6c0,7.6,2.3,20.2,20,22.5L32.4,19.4z M42.7,64.7
          			c18.8-2.2,20.7-15.4,20.6-22.8c0-9.3-3.5-20.6-20.7-22.6L42.7,64.7z"/>
          		  </g>
          		  <g fill="#0000CC">
          		  <path id="xyz321" d="M42.8,74.3c0,4.3,0,5.9,11.8,5.9l4.1,0l0,3.8c-4.5-0.4-16.1-0.4-21.2-0.3c-5.1,0-16.6,0-21,0.4l0-3.8l4.1,0
          			c11.8,0,11.8-1.7,11.8-5.9l0-6.9C13.9,65.6,0,54.6,0,42c0-12.2,13.3-23.5,32.4-25.4l0-6.9c0-4.3,0-5.9-11.8-5.9l-4.1,0l0-3.8
          			c4.5,0.4,16.1,0.4,21.2,0.3c5.1,0,16.6,0,21-0.4l0,3.8l-4.1,0c-11.8,0-11.8,1.7-11.8,5.9l0,6.9C61.6,18.1,75.8,29.2,75.8,42
          			c0,12.4-13.8,23.9-33.1,25.4L42.8,74.3z M32.4,19.4c-18.7,2.5-19.9,16.2-19.9,22.6c0,7.6,2.3,20.2,20,22.5L32.4,19.4z M42.7,64.7
          			c18.8-2.2,20.7-15.4,20.6-22.8c0-9.3-3.5-20.6-20.7-22.6L42.7,64.7z"/>
          		  </g>
          		</svg>
          	</g>
          	
          	<g id="edit_foreign">
          		<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="34 38 170 170" overflow="hidden">
          		<g fill="#000088">
          			<path d="M30.1,63.9v-4.3l30.2-14.9V50L36.5,61.7l23.8,11.7v5.3L30.1,63.9z"/>
          			<path d="M106.1,79.7v-1.1c4.2-0.5,4.8-1.1,4.8-5.2V58.2c0-6-1.3-7.9-5.4-7.9c-3.3,0-5.7,1.3-7.8,4.4v18.1
          				c0,4.5,1.1,5.7,5.2,5.8v1.1H86.8v-1.1c4.1-0.3,4.9-1.1,4.9-5.1V57.9c0-5-1.6-7.6-4.8-7.6c-2.5,0-5.6,1.2-7.4,2.9
          				c-0.5,0.5-1.1,1.4-1.1,1.4v20.3c0,2.8,1.1,3.6,4.9,3.7v1.1h-16v-1.1c4-0.1,5-1.2,5-5V55.4c0-3.5-0.6-4.6-2.5-4.6
          				c-0.8,0-1.4,0.1-2.3,0.3v-1.2c4-1.1,6.4-1.9,10.1-3.2l0.5,0.1v5.4c6-4.5,8-5.5,11.2-5.5c3.9,0,6.3,1.9,7.6,6c3.9-4.2,7.6-6,11.7-6
          				c5.5,0,8.4,4.3,8.4,12.8v14.8c0,2.8,0.9,4.1,3.1,4.2l1.9,0.1v1.1H106.1z"/>
          			<path d="M147.3,80.5c-3,0-4.2-1.4-4.6-5.3c-4.4,3.7-7.3,5.3-10.5,5.3c-4.5,0-7.6-3.2-7.6-7.7c0-2.4,1-4.8,2.6-6.3
          				c3.1-2.7,4.3-3.3,15.4-7.8v-4.4c0-3.9-1.9-6-5.5-6c-2.9,0-5.2,1.6-5.2,3.5c0,0.5,0.1,1.1,0.2,1.7c0.1,0.5,0.1,0.9,0.1,1.2
          				c0,1.6-1.5,3-3.2,3s-3.1-1.4-3.1-3.1c0-1.8,1.2-3.9,3-5.4c2-1.7,5.5-2.7,9.1-2.7c4.4,0,7.5,1.4,9,4.2c1,1.7,1.4,3.7,1.4,7.3v14
          				c0,3.2,0.5,4.2,2.2,4.2c1.1,0,1.9-0.4,3.2-1.4v1.9C151.3,79.6,149.8,80.5,147.3,80.5z M142.6,60.5c-8.7,3.2-11.7,5.8-11.7,10v0.3
          				c0,3.1,2,5.5,4.5,5.5c1.5,0,3.5-0.6,5.3-1.6c1.5-0.9,1.9-1.6,1.9-3.8V60.5z"/>
          			<path d="M165.3,80.5c-4.2,0-6.3-3.1-6.3-9.1V49.7h-3.8c-0.2-0.1-0.3-0.3-0.3-0.5c0-0.4,0.4-0.9,1.2-1.4
          				c1.9-1.1,4.3-3.7,7-7.7c0.5-0.6,1-1.3,1.4-2c0.4,0,0.5,0.2,0.5,0.9v8.4h7.3v2.3h-7.3v20.6c0,4.6,1.1,6.5,3.7,6.5
          				c1.6,0,2.7-0.6,4.3-2.5l0.9,0.8C171.8,78.7,169,80.5,165.3,80.5z"/>
          			<path d="M193.8,79.7v-1.1c4.1-0.4,4.9-1.3,4.9-6.2V58.1c0-5-1.8-7.6-5.4-7.6c-2.8,0-5,1.2-8,4.5v17.4
          				c0,5,0.7,5.8,4.9,6.3v1.1h-15.6v-1.1c4.2-0.6,4.6-1.2,4.6-6.3V38.5c0-3.1-0.6-3.7-3.7-3.7c-0.4,0-0.6,0-0.9,0.1v-1.2l1.9-0.6
          				c4-1.2,5.8-1.7,8.3-2.6l0.4,0.2v21.9c3.3-4.3,6.3-6,10.6-6c5.9,0,8.9,3.9,8.9,11.5v14.3c0,5,0.4,5.5,4.3,6.3v1.1h-15.2V79.7z"/>
          			<path d="M59.1,116.1v-4.3l30.2-14.9v5.3l-23.8,11.7l23.8,11.7v5.3L59.1,116.1z"/>
          			<path d="M135.1,131.9v-1.1c4.2-0.5,4.8-1.1,4.8-5.2v-15.1c0-6-1.3-7.9-5.4-7.9c-3.3,0-5.7,1.3-7.8,4.4v18.1
          				c0,4.5,1.1,5.7,5.2,5.8v1.1h-16.1v-1.1c4.1-0.3,4.9-1.1,4.9-5.1v-15.7c0-5-1.6-7.6-4.8-7.6c-2.5,0-5.6,1.2-7.4,2.9
          				c-0.5,0.5-1.1,1.4-1.1,1.4v20.3c0,2.8,1.1,3.6,4.9,3.7v1.1h-16v-1.1c4-0.1,5-1.2,5-5v-18.2c0-3.5-0.6-4.6-2.5-4.6
          				c-0.8,0-1.4,0.1-2.3,0.3v-1.2c4-1.1,6.4-1.9,10.1-3.2l0.5,0.1v5.4c6-4.5,8-5.5,11.2-5.5c3.9,0,6.3,1.9,7.6,6c3.9-4.2,7.6-6,11.7-6
          				c5.5,0,8.4,4.3,8.4,12.8v14.8c0,2.8,0.9,4.1,3.1,4.2l1.9,0.1v1.1H135.1z"/>
          			<path d="M152.1,131.9v-1.1c5-0.3,5.7-1.1,5.7-6.3v-16.6c0-3.2-0.6-4.3-2.4-4.3c-0.6,0-1.6,0.1-2.4,0.2l-0.6,0.1v-1.1
          				l11.2-4L164,99v25.6c0,5.2,0.6,5.9,5.3,6.3v1.1L152.1,131.9L152.1,131.9z M160.8,93.1c-2,0-3.7-1.6-3.7-3.7c0-2,1.7-3.7,3.7-3.7
          				c2.1,0,3.7,1.7,3.7,3.7C164.6,91.6,163,93.1,160.8,93.1z"/>
          			<path d="M175.8,131v-5.3l23.7-11.8l-23.7-11.7v-5.3l30.1,14.9v4.3L175.8,131z"/>
          			<path d="M31.1,169.5v-4.3l30.2-14.9v5.3l-23.8,11.7L61.3,179v5.3L31.1,169.5z"/>
          			<path d="M71.3,186.4h-4.9l16.5-49.7h4.8L71.3,186.4z"/>
          			<path d="M127.1,185.3v-1.1c4.2-0.5,4.8-1.1,4.8-5.2v-15.2c0-6-1.3-7.9-5.4-7.9c-3.3,0-5.7,1.3-7.8,4.4v18.1
          				c0,4.5,1.1,5.7,5.2,5.8v1.1h-16.1v-1.1c4.1-0.3,4.9-1.1,4.9-5.1v-15.6c0-5-1.6-7.6-4.8-7.6c-2.5,0-5.6,1.2-7.4,2.9
          				c-0.5,0.5-1.1,1.4-1.1,1.4v20.3c0,2.8,1.1,3.6,4.9,3.7v1.1h-16v-1.1c4-0.1,5-1.2,5-5V161c0-3.5-0.6-4.6-2.5-4.6
          				c-0.8,0-1.4,0.1-2.3,0.3v-1.2c4-1.1,6.4-1.9,10.1-3.2l0.5,0.1v5.4c6-4.5,8-5.5,11.2-5.5c3.9,0,6.3,1.9,7.6,6c3.9-4.2,7.6-6,11.7-6
          				c5.5,0,8.4,4.3,8.4,12.8v14.8c0,2.8,0.9,4.1,3.1,4.2l1.9,0.1v1.1H127.1L127.1,185.3z"/>
          			<path d="M168.3,186.1c-3,0-4.2-1.4-4.6-5.3c-4.4,3.7-7.3,5.3-10.5,5.3c-4.5,0-7.6-3.2-7.6-7.7c0-2.4,1-4.8,2.6-6.3
          				c3.1-2.7,4.3-3.3,15.4-7.8v-4.4c0-3.9-1.9-6-5.5-6c-2.9,0-5.2,1.6-5.2,3.5c0,0.5,0.1,1.1,0.2,1.7c0.1,0.5,0.1,0.9,0.1,1.2
          				c0,1.6-1.5,3-3.2,3s-3.1-1.4-3.1-3.1c0-1.8,1.2-3.9,3-5.4c2-1.7,5.5-2.7,9.1-2.7c4.4,0,7.5,1.4,9,4.2c1,1.7,1.4,3.7,1.4,7.3v14
          				c0,3.2,0.5,4.2,2.2,4.2c1.1,0,1.9-0.4,3.2-1.4v1.9C172.3,185.2,170.8,186.1,168.3,186.1z M163.8,166.1c-8.7,3.2-11.7,5.8-11.7,10
          				v0.3c0,3.1,2,5.5,4.5,5.5c1.5,0,3.5-0.6,5.3-1.6c1.5-0.9,1.9-1.6,1.9-3.8V166.1z"/>
          			<path d="M186.3,186.1c-4.2,0-6.3-3.1-6.3-9.1v-21.7h-3.8c-0.2-0.1-0.3-0.3-0.3-0.5c0-0.4,0.4-0.9,1.2-1.4
          				c1.9-1.1,4.3-3.7,7-7.7c0.5-0.6,1-1.3,1.4-2c0.4,0,0.5,0.2,0.5,0.9v8.4h7.3v2.3h-7.3v20.6c0,4.6,1.1,6.5,3.7,6.5
          				c1.6,0,2.7-0.6,4.3-2.5l0.9,0.8C192.8,184.3,190,186.1,186.3,186.1z"/>
          			<path d="M209.1,185.3h-13.4v-1.1c4.2-0.6,4.6-1.2,4.6-6.3V144c0-3.1-0.6-3.7-3.7-3.7c-0.4,0-0.6,0-0.9,0.1v-1.2
          				l1.9-0.6c4-1.2,5.8-1.7,8.3-2.6l0.4,0.2v21.9c0.9-1.2,1.9-2.2,2.8-3.1"/>
          			<path d="M209.1,157.9c-0.8,0.7-1.7,1.5-2.7,2.6v17.4c0,4,0.4,5.3,2.7,5.9"/>
          		  </g>
          		  <g>
          			<polyline opacity="0.2" fill="#231F20" points="209.1,76.4 118.7,186.5 139.1,186.4 209.1,121 209.1,76.4 "/>
          			<polyline opacity="0.4" fill="#231F20" points="209.1,76.2 118.5,186.5 129.7,186.4 200.2,120.3 209.1,100.8 209.1,76.4 "/>
          			<path fill="#FFD761" d="M121.6,88.7l0.8,87.5l62.3-56.7c0,0-15.3-25.8-24.8-30C151.1,85.6,121.6,88.7,121.6,88.7z"/>
          			<path fill="#FEA01E" d="M209.1,19.5h-54l-33.5,69.2c0,0,29.7-3.4,38.3,0.8c8.9,4.4,25,30.8,25,30.8l24.2-50V19.5z"/>
          			<path d="M120.4,153.7l-0.6,25l23.8-16.9c0,0-8-7-11.2-8.1C129.4,152.8,120.4,153.7,120.4,153.7z"/>
          			<polyline fill="none" stroke="#231F20" stroke-width="5" points="153.9,19.5 121.6,88.7 120.7,181.2 186.6,120.3 209.1,70.3 "/>
          		  </g>
          		</svg>
          	</g>
          	
          	<g id="svg_eof"/>
          </svg>
        • grid-icon.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          <!-- 
          	Sample icons file. This file looks like an SVG file with groups as its
          	children. Each group element has an ID that must match the ID of the button given
          	in the extension. The SVG inside the group makes up the actual icon, and
          	needs use a viewBox instead of width/height for it to scale	properly.
          	
          	Multiple icons can be included, each within their own group.
          -->
          	<g id="view_grid">
          	  <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
          		<g>
          		  <rect fill="#ffffff" stroke="#848484" x="2" y="2" width="20" height="20"/>
          		  <line fill="none" stroke="#848484" x1="11.84375" y1="-1.53125" x2="11.84375" y2="18.46875" transform="rotate(90, 11.8429, 8.46955)"/>
          		  <line fill="none" stroke="#848484" x1="11.90625" y1="5.21875" x2="11.90625" y2="25.21875" transform="rotate(90, 11.9054, 15.2196)"/>
          		  <line fill="none" stroke="#848484" x1="8.5" y1="2.03125" x2="8.5" y2="22.03125"/>
          		  <line fill="none" stroke="#848484" x1="15.5" y1="2.03125" x2="15.5" y2="22.03125"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="3.25" y="3.28125" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="10" y="3.28125" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="16.75" y="3.28125" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="3.28125" y="9.75" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="10.03125" y="9.75" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="16.78125" y="9.75" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="3.3125" y="16.59375" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="10.0625" y="16.59375" width="4" height="4"/>
          		  <rect fill="#d8d8d8" stroke="#000000" stroke-width="0" x="16.8125" y="16.59375" width="4" height="4"/>
          		</g>
          	  </svg>
          	</g>
          </svg>
          
        • helloworld-icon.xml
          <svg xmlns="http://www.w3.org/2000/svg">
          <!-- 
          	Sample icons file. This file looks like an SVG file with groups as its
          	children. Each group element has an ID that must match the ID of the button given
          	in the extension. The SVG inside the group makes up the actual icon, and
          	needs use a viewBox instead of width/height for it to scale	properly.
          	
          	Multiple icons can be included, each within their own group.
          -->
          	<g id="hello_world">
          		<svg width="102" height="102" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          		 <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
          		 <g>
          		  <title>Layer 1</title>
          		  <rect ry="30" rx="30" x="2.5" y="2.5" width="97" height="97" id="svg_3" fill="#008000" stroke="#000000" stroke-width="5"/>
          		  <text x="52.668" y="42.5" id="svg_1" fill="#ffffff" stroke="#000000" stroke-width="0" font-size="24" font-family="Monospace" text-anchor="middle" xml:space="preserve">Hello</text>
          		  <text x="52.668" y="71.5" fill="#ffffff" stroke="#000000" stroke-width="0" font-size="24" font-family="Monospace" text-anchor="middle" xml:space="preserve" id="svg_2">World!</text>
          		 </g>
          		</svg>
          	</g>
          </svg>
        • markers-icons.xml
          <svg xmlns="http://www.w3.org/2000/svg">
              <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
              <g id="nomarker">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="m-50,0l100,0"/>
                  </svg>
              </g>
              <g id="leftarrow">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="m-50,0l100,40l-30,-40l30,-40z"/>
                  </svg>
              </g>
              <g id="rightarrow">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="m50,0l-100,40l30,-40l-30,-40z"/>
                  </svg>
              </g>
              <g id="leftarrow_o">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m-50,0l100,40l-30,-40l30,-40z"/>
                  </svg>
              </g>
              <g id="rightarrow_o">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m50,0l-100,40l30,-40l-30,-40z"/>
                  </svg>
              </g>
              <g id="forwardslash">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m-20,50l40,-100"/>
                  </svg>
              </g>
              <g id="reverseslash">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m-20,-50l40,100"/>
                  </svg>
              </g>
              <g id="verticalslash">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m0,-50l0,100"/>
                  </svg>
              </g>
              <g id="mcircle">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <circle stroke-width="10" stroke="#ff7f00" fill="#ff7f00" cy="0" cx="0" r="30"/>
                  </svg>
              </g>
              <g id="mcircle_o">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <circle stroke-width="10" stroke="#ff7f00" fill="none" cy="0" cx="0" r="30"/>
                  </svg>
              </g>
              <g id="xmark">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="m-30,30l60,-60m0,60l-60,-60"/>
                  </svg>
              </g>
              <g id="box">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="m-30,-30l0,60l60,0l0,-60z"/>
                  </svg>
              </g>
              <g id="star">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="m-40,-20l80,0l-70,60l30,-80l30,80z"/>
                  </svg>
              </g>
              <g id="box_o">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m-30,-30l0,60l60,0l0,-60z"/>
                  </svg>
              </g>
              <g id="star_o">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="m-40,-20l80,0l-70,60l30,-80l30,80z"/>
                  </svg>
              </g>
               <g id="triangle_o">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="none" d="M-30,30 L0,-30 L30,30 Z"/>
                  </svg>
              </g>
               <g id="triangle">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
                      <path stroke-width="10" stroke="#ff7f00" fill="#ff7f00" d="M-30,30 L0,-30 L30,30 Z"/>
                  </svg>
              </g>
             <g id="textmarker">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
          			<text xml:space="preserve" text-anchor="middle" font-family="serif" font-size="120"  y="40" x="0" stroke-width="0" stroke="#ff7f00" fill="#ff7f00">T</text>	
                  </svg>
              </g>
          	<g id="mkr_markers_off">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
          		   <line y2="0" x2="50" y1="0" x1="-50" stroke-width="5" stroke="#ff7f00" fill="none"/>
                 </svg>
              </g>
          	<g id="mkr_markers_dimension">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
           		   <line y2="0" x2="40" y1="0" x1="20" stroke-width="5" stroke="#ff7f00" fill="none"/>
          		   <line y2="0" x2="-40" y1="0" x1="-20" stroke-width="5" stroke="#ff7f00" fill="none"/>
          		   <text text-anchor="middle" font-family="serif" font-size="80"  y="20" x="0" stroke-width="0" stroke="#ff7f00" fill="#ff7f00">T</text>
                     <path stroke-width="5" stroke="#ff7f00" fill="#ff7f00" d="M-50,0 L-30,-15 L-30,15 Z"/>
                     <path stroke-width="5" stroke="#ff7f00" fill="#ff7f00" d="M50,0 L30,-15 L30,15 Z"/>
           		</svg>
              </g>
             	<g id="mkr_markers_label">
                  <svg viewBox="-60 -60 120 120" xmlns="http://www.w3.org/2000/svg">
            		   <line y2="0" x2="40" y1="0" x1="-20" stroke-width="5" stroke="#ff7f00" fill="none"/>
          		   <text text-anchor="middle" font-family="serif" font-size="80"  y="20" x="-40" stroke-width="0" stroke="#ff7f00" fill="#ff7f00">T</text>
                     <path stroke-width="5" stroke="#ff7f00" fill="#ff7f00" d="M50,0 L30,-15 L30,15 Z"/>
                  </svg>
              </g>
          	<g id="svg_eof"/>
          </svg>
          
        • mathjax-icons.xml
          <svg xmlns="http://www.w3.org/2000/svg">
            <g id="tool_mathjax">
              <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 43 43">
                <g id="svg_20" stroke="black" fill="black" transform="matrix(0.0510725, 0, 0, -0.0510725, 0, 37.4108)">
                  <path id="svg_21" stroke-width="10" d="m20.45372,122.639297q0,57 19,104t49,78.000015t67,52t70,31t63.000015,9l3,0q45,0 78,-22t33,-65q0,-90.000015 -111,-118.000015q-49.000015,-13 -134.000015,-14q-37,0 -38,-2q0,-2 -6,-35t-7,-58q0,-46.999996 21,-73.999996t63,-28t93.000015,19t92,65.999996q9,10 12,10q4,0 13,-9t10,-13.999996t-9,-16t-30,-27t-46,-31t-63,-25t-76.000015,-10q-79,0 -122,53t-44,125.999996zm334.000015,185.000015q-6,52 -68,52q-33.000015,0 -61.000015,-14t-45,-34t-29,-41t-16,-36.000015t-5,-19q0,-1 20,-1q113.000015,0 158.000015,24t46,69.000015z"/>
                  <path id="svg_22" stroke-width="10" d="m489.156433,571.236389q4.949707,29.698486 38.183716,68.589355t82.024414,39.597961q24.748657,0 45.254761,-12.727905t30.40564,-31.819824q29.698486,44.547729 71.417847,44.547729q26.162842,0 45.254761,-15.556335t19.79895,-41.719299q0,-20.506104 -9.899414,-33.234009t-19.091919,-15.556396t-16.263428,-2.82843q-13.435059,0 -21.920288,7.778198t-8.485352,20.506104q0,32.526917 35.355347,44.547729q-7.778198,9.192383 -28.284302,9.192383q-9.192383,0 -13.434937,-1.414246q-26.870117,-11.31366 -39.598022,-46.669006q-42.426392,-156.270599 -42.426392,-182.433502q0,-19.799011 11.313721,-28.284302t24.748657,-8.485291q26.162964,0 51.618896,23.334534t34.648193,57.275635q2.121338,7.071106 4.242676,7.778198t11.313721,1.414185l2.828369,0q10.606567,0 10.606567,-5.65686q0,-0.707092 -1.414185,-7.778137q-11.313721,-40.305115 -43.840576,-71.417786t-75.6604,-31.112732q-49.497559,0 -74.953369,44.547729q-28.991333,-43.840576 -66.468018,-43.840576l-4.242676,0q-34.648193,0 -49.497437,18.384766t-15.556396,38.890869q0,22.62738 13.435059,36.769531t31.819824,14.142151q30.405518,0 30.405518,-29.698486q0,-14.142151 -8.485229,-24.748718t-16.263428,-14.142151t-9.192383,-3.535522l-2.121338,-0.707153q0,-0.707092 4.242676,-2.828369t11.313599,-4.949768t13.435059,-2.121338q25.455811,0 43.840698,31.819824q6.363892,11.313721 16.263428,48.083252t19.79895,76.367523t11.313721,46.669006q3.535522,19.091919 3.535522,27.577209q0,19.79895 -10.606567,28.284241t-24.041626,8.485291q-28.284302,0 -53.033081,-22.627441t-34.648193,-57.982727q-1.414185,-6.363953 -3.535522,-7.071106t-11.313721,-1.414185l-9.899536,0q-4.242554,4.242615 -4.242554,7.778198z"/>
                </g>
          	  </svg>
            </g>
            <g id="svg_eof"/>
          </svg>
          
        • polygon-icons.svg
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="tool_polygon">
               <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-1 -2 25 24">
               	<defs>
          		<linearGradient y2="1" x2="1" y1="0.10156" x1="0.36328" id="svg_i22">
          			<stop stop-opacity="1" stop-color="#ffffff" offset="0"/>
          			<stop stop-opacity="1" stop-color="#666666" offset="1"/>
          		</linearGradient>
          		</defs>
          		<polygon points="6.09251,19.6032 0.577744,10.0516 6.09251,0.5 17.1217,0.5 22.6365,10.0516 17.1217,19.6032" stroke="#000000" fill="url(#svg_i22)"/>	 </svg>
          	</g>
          	
          	<g id="svg_eof"/>
          </svg>
        • star-icons.svg
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="tool_star">
               <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-1 -1 26 26">
               	<defs>
          		<linearGradient y2="1" x2="1" y1="0.10156" x1="0.36328" id="svg_i22">
          			<stop stop-opacity="1" stop-color="#ffffff" offset="0"/>
          			<stop stop-opacity="1" stop-color="#666666" offset="1"/>
          		</linearGradient>
          		</defs>
          		<polygon points="12.4062,1.55891 15.0578,9.39339 23.3283,9.49422 16.6965,14.4371 19.1564,22.3338 12.4062,17.5543 5.65596,22.3338 8.11588,14.4371 1.48406,9.49422 9.75455,9.39339" stroke="#000000" fill="url(#svg_i22)"/>	 </svg>
          	</g>
          	
          	<g id="svg_eof"/>
          </svg>
        • webappfind-icon.svg
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
          <!--
          Copied from /editor/images/svg_edit_icons.svg#save but with id renamed, first stop-color changed to red, and SVG namespaces moved to root
          -->
          <g id="webappfind_save">
          	<svg viewBox="0 0 24 24">
          	 <defs>
          	  <linearGradient y2="0" x2="1" y1="0" x1="0" id="svg_41">
          	   <stop stop-opacity="1" stop-color="red" offset="0"/>
          	   <stop stop-opacity="1" stop-color="#d6d6d6" offset="1"/>
          	  </linearGradient>
          	  <linearGradient y2="0.875" x2="0.21484" y1="0.00391" x1="0.04297" id="svg_46">
          	   <stop stop-opacity="1" stop-color="#81bbf4" offset="0"/>
          	   <stop stop-opacity="1" stop-color="#376eb7" offset="1"/>
          	  </linearGradient>
          	 </defs>
          	   <path stroke="#202020" fill="#e0e0e0" id="svg_21" d="m1.51669,22.3458l21.13245,-0.10111l0,-6.06673l-2.62892,-9.80789l-16.27907,0.10111l-2.32558,9.20121l0.10111,6.67341z"/>
          	   <rect stroke="#efefef" fill="url(#svg_41)" id="svg_32" height="4.75108" width="19.21031" y="16.58227" x="2.42667"/>
          	   <path stroke="#ffffff" fill="#c0c0c0" id="svg_42" d="m4.55005,11.12235l0.70779,-2.83114l13.04348,0l0.70779,3.13448c-0.70779,2.52781 -4.04479,3.84227 -7.17897,3.84227c-2.72977,0 -6.37007,-1.41557 -7.28008,-4.1456z"/>
          	  <path stroke="#285582" fill="url(#svg_46)" id="svg_45" d="m7.14286,9.74903l5.21236,5.79151l5.50193,-5.88803l-2.50965,-0.09653l0,-2.79923c0,-2.3166 -2.3166,-5.59846 -6.56371,-5.59846c-4.05405,0 -6.27413,3.37838 -6.56371,6.75676c0.48263,-1.5444 2.7027,-4.53668 4.44015,-4.44015c2.12355,-0.09653 2.79923,1.64093 2.79923,3.37838l0.09653,2.79923l-2.41313,0.09653z"/>
          	</svg>
          </g>
          </svg>
      • images
        • align-bottom.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22"
             height="22"
             id="svg5741"
             sodipodi:version="0.32"
             inkscape:version="0.44+devel"
             version="1.0"
             sodipodi:docbase="/home/andreas/project/inkscape/22x22/actions"
             sodipodi:docname="align-bottom-vertical.svg"
             inkscape:output_extension="org.inkscape.output.svg.inkscape"
             inkscape:export-filename="/home/andreas/project/inkscape/22x22/actions/align-bottom-vertical.png"
             inkscape:export-xdpi="90"
             inkscape:export-ydpi="90"
             sodipodi:modified="true">
            <defs
               id="defs5743">
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient6938"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient6936"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient6934"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient6932"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2968"
                 inkscape:collect="always">
                <stop
                   id="stop2970"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2972"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient6930"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2974"
                 inkscape:collect="always">
                <stop
                   id="stop2976"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2978"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient6928"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2986"
                 inkscape:collect="always">
                <stop
                   id="stop2988"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2990"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient6926"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2980"
                 inkscape:collect="always">
                <stop
                   id="stop2982"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2984"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient6924"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="22.197802"
               inkscape:cx="8"
               inkscape:cy="9.8019802"
               inkscape:current-layer="g6828"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               width="22px"
               height="22px"
               inkscape:window-width="1078"
               inkscape:window-height="786"
               inkscape:window-x="243"
               inkscape:window-y="71" />
            <metadata
               id="metadata5746">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <g
                 style="display:inline"
                 id="g6828"
                 transform="translate(30.00011,90.000366)"
                 inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                 inkscape:export-xdpi="90"
                 inkscape:export-ydpi="90">
                <g
                   style="display:inline"
                   id="g6838"
                   transform="translate(-30.00009,-1.0002798)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     style="fill:#d3d7cf;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
                     id="rect3052"
                     width="12"
                     height="7"
                     x="69.500122"
                     y="12.5"
                     transform="matrix(0,-1,1,0,0,0)"
                     inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                     inkscape:export-xdpi="90"
                     inkscape:export-ydpi="90" />
                  <rect
                     style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
                     id="rect3054"
                     width="10"
                     height="5.0000305"
                     x="70.500122"
                     y="13.5"
                     transform="matrix(0,-1,1,0,0,0)"
                     rx="0"
                     ry="0"
                     inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                     inkscape:export-xdpi="90"
                     inkscape:export-ydpi="90" />
                  <g
                     id="g3056"
                     transform="translate(-127,-559)"
                     inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                     inkscape:export-xdpi="90"
                     inkscape:export-ydpi="90">
                    <rect
                       transform="matrix(0,-1,1,0,0,0)"
                       y="129.49626"
                       x="-489.49979"
                       height="7.0035982"
                       width="17.999748"
                       id="rect3058"
                       style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00024867;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
                    <rect
                       transform="matrix(0,-1,1,0,0,0)"
                       y="130.50006"
                       x="-488.50009"
                       height="4.9998937"
                       width="15.999757"
                       id="rect3060"
                       style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00024891;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                       rx="0"
                       ry="0" />
                  </g>
                  <g
                     id="g3294"
                     transform="translate(-187,-560)"
                     inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                     inkscape:export-xdpi="90"
                     inkscape:export-ydpi="90">
                    <rect
                       y="489.5"
                       x="196.49989"
                       height="1.9999999"
                       width="3.0000916"
                       id="rect3296"
                       style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                    <path
                       style="fill:url(#linearGradient6932);fill-opacity:1;stroke:url(#linearGradient6934);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                       d="M 197.49998,491.5 L 186.49989,491.5 L 186.49989,489.5 L 197.49998,489.5"
                       id="path3298"
                       sodipodi:nodetypes="cccc" />
                    <path
                       style="fill:url(#linearGradient6936);fill-opacity:1;stroke:url(#linearGradient6938);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                       d="M 198.49989,489.5 L 209.49998,489.5 L 209.49998,491.5 L 198.49989,491.5"
                       id="path3300"
                       sodipodi:nodetypes="cccc" />
                  </g>
                </g>
              </g>
            </g>
          </svg>
          
        • align-center.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22"
             height="22"
             id="svg10958"
             sodipodi:version="0.32"
             inkscape:version="0.44+devel"
             version="1.0"
             sodipodi:docbase="/home/andreas/project/inkscape/22x22/actions"
             sodipodi:docname="align-horisontal-center.svg"
             inkscape:output_extension="org.inkscape.output.svg.inkscape"
             inkscape:export-filename="/home/andreas/project/inkscape/22x22/actions/align-horisontal-center.png"
             inkscape:export-xdpi="90"
             inkscape:export-ydpi="90"
             sodipodi:modified="true">
            <defs
               id="defs10960">
              <linearGradient
                 id="linearGradient2968"
                 inkscape:collect="always">
                <stop
                   id="stop2970"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2972"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient4708"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="translate(-395.9999,-981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2974"
                 inkscape:collect="always">
                <stop
                   id="stop2976"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2978"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient4706"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="translate(-395.9999,-981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2986"
                 inkscape:collect="always">
                <stop
                   id="stop2988"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2990"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient4704"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2980"
                 inkscape:collect="always">
                <stop
                   id="stop2982"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2984"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient4702"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="11.197802"
               inkscape:cx="16"
               inkscape:cy="11.460711"
               inkscape:current-layer="layer1"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               width="22px"
               height="22px"
               inkscape:window-width="797"
               inkscape:window-height="628"
               inkscape:window-x="0"
               inkscape:window-y="47" />
            <metadata
               id="metadata10963">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <g
                 style="display:inline"
                 id="g4044"
                 transform="matrix(0,-1,1,0,-59.999911,-168.00002)"
                 inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                 inkscape:export-xdpi="90"
                 inkscape:export-ydpi="90">
                <rect
                   style="fill:#d3d7cf;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                   id="rect3851"
                   width="12"
                   height="7"
                   x="-76.499878"
                   y="-177.5"
                   transform="matrix(0,-1,1,0,0,0)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90" />
                <g
                   transform="translate(-317,-410)"
                   id="g3853"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90"
                   style="display:inline">
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="129.49626"
                     x="-489.49979"
                     height="7.0035982"
                     width="17.999748"
                     id="rect3855"
                     style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00024867;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="130.50006"
                     x="-488.50009"
                     height="4.9998937"
                     width="15.999757"
                     id="rect3857"
                     style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00024891;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                     rx="0"
                     ry="0" />
                </g>
                <rect
                   style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                   id="rect3859"
                   width="10"
                   height="5.0000305"
                   x="-75.499878"
                   y="-176.5"
                   transform="matrix(0,-1,1,0,0,0)"
                   rx="0"
                   ry="0"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90" />
                <g
                   id="g3861"
                   transform="translate(-377,-420)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90"
                   style="display:inline">
                  <rect
                     y="489.5"
                     x="186.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3863"
                     style="fill:url(#linearGradient4702);fill-opacity:1;stroke:url(#linearGradient4704);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     y="489.5"
                     x="191.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3865"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     y="489.5"
                     x="196.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3867"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     y="489.5"
                     x="201.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3869"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     transform="scale(-1,-1)"
                     y="-491.5"
                     x="-209.49998"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3871"
                     style="fill:url(#linearGradient4706);fill-opacity:1;stroke:url(#linearGradient4708);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                </g>
              </g>
            </g>
          </svg>
          
        • align-left.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22"
             height="22"
             id="svg11272"
             sodipodi:version="0.32"
             inkscape:version="0.44+devel"
             version="1.0"
             sodipodi:docbase="/home/andreas/project/inkscape/22x22/actions"
             sodipodi:docname="align-horisontal-left.svg"
             inkscape:output_extension="org.inkscape.output.svg.inkscape"
             inkscape:export-filename="/home/andreas/project/inkscape/22x22/actions/align-horisontal-left.png"
             inkscape:export-xdpi="90"
             inkscape:export-ydpi="90"
             sodipodi:modified="true">
            <defs
               id="defs11274">
              <linearGradient
                 id="linearGradient2968"
                 inkscape:collect="always">
                <stop
                   id="stop2970"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2972"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient4716"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2974"
                 inkscape:collect="always">
                <stop
                   id="stop2976"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2978"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient4714"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2986"
                 inkscape:collect="always">
                <stop
                   id="stop2988"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2990"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient4712"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2980"
                 inkscape:collect="always">
                <stop
                   id="stop2982"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2984"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient4710"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="11.197802"
               inkscape:cx="16"
               inkscape:cy="14.269093"
               inkscape:current-layer="layer1"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               width="22px"
               height="22px"
               inkscape:window-width="797"
               inkscape:window-height="628"
               inkscape:window-x="0"
               inkscape:window-y="47" />
            <metadata
               id="metadata11277">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <g
                 style="display:inline"
                 id="g4065"
                 transform="matrix(0,-1,1,0,8.9287758e-5,51.99998)"
                 inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                 inkscape:export-xdpi="90"
                 inkscape:export-ydpi="90">
                <g
                   id="g3883"
                   transform="translate(-127,-473)"
                   style="fill:#d3d7cf;stroke:#888a85;display:inline"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     transform="matrix(0,1,1,0,0,0)"
                     y="169.5"
                     x="475.50012"
                     height="7"
                     width="12"
                     id="rect3885"
                     style="fill:#d3d7cf;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     ry="0"
                     rx="0"
                     transform="matrix(0,1,1,0,0,0)"
                     y="170.5"
                     x="476.50012"
                     height="5.0000305"
                     width="10"
                     id="rect3887"
                     style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                </g>
                <g
                   id="g3889"
                   transform="translate(-97,-469)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90"
                   style="display:inline">
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="129.49626"
                     x="-489.49979"
                     height="7.0035982"
                     width="17.999748"
                     id="rect3891"
                     style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00024867;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="130.50006"
                     x="-488.50009"
                     height="4.9998937"
                     width="15.999757"
                     id="rect3893"
                     style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00024891;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                     rx="0"
                     ry="0" />
                </g>
                <g
                   id="g3903"
                   transform="translate(-157,-488)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90"
                   style="display:inline">
                  <rect
                     y="489.5"
                     x="196.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3905"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <path
                     style="fill:url(#linearGradient4710);fill-opacity:1;stroke:url(#linearGradient4712);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                     d="M 197.49998,491.5 L 186.49989,491.5 L 186.49989,489.5 L 197.49998,489.5"
                     id="path3907"
                     sodipodi:nodetypes="cccc" />
                  <path
                     style="fill:url(#linearGradient4714);fill-opacity:1;stroke:url(#linearGradient4716);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                     d="M 198.49989,489.5 L 209.49998,489.5 L 209.49998,491.5 L 198.49989,491.5"
                     id="path3909"
                     sodipodi:nodetypes="cccc" />
                </g>
              </g>
            </g>
          </svg>
          
        • align-middle.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22"
             height="22"
             id="svg10625"
             sodipodi:version="0.32"
             inkscape:version="0.44+devel"
             version="1.0"
             sodipodi:docbase="/home/andreas/project/inkscape/22x22/actions"
             sodipodi:docname="align-vertical-center.svg"
             inkscape:output_extension="org.inkscape.output.svg.inkscape"
             inkscape:export-filename="/home/andreas/project/inkscape/22x22/actions/align-vertical-center.png"
             inkscape:export-xdpi="90"
             inkscape:export-ydpi="90"
             sodipodi:modified="true">
            <defs
               id="defs10627">
              <linearGradient
                 id="linearGradient2968"
                 inkscape:collect="always">
                <stop
                   id="stop2970"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2972"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient6962"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="translate(-395.9999,-981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2974"
                 inkscape:collect="always">
                <stop
                   id="stop2976"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2978"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient6960"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="translate(-395.9999,-981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2986"
                 inkscape:collect="always">
                <stop
                   id="stop2988"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2990"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient6958"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2980"
                 inkscape:collect="always">
                <stop
                   id="stop2982"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2984"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient6956"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="11.197802"
               inkscape:cx="16"
               inkscape:cy="16"
               inkscape:current-layer="layer1"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               width="22px"
               height="22px"
               inkscape:window-width="797"
               inkscape:window-height="628"
               inkscape:window-x="0"
               inkscape:window-y="47" />
            <metadata
               id="metadata10630">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <g
                 style="display:inline"
                 id="g6849"
                 transform="translate(-29.999893,91.000089)"
                 inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                 inkscape:export-xdpi="90"
                 inkscape:export-ydpi="90">
                <rect
                   style="fill:#d3d7cf;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
                   id="rect1933"
                   width="12"
                   height="7"
                   x="73.500122"
                   y="42.5"
                   transform="matrix(0,-1,1,0,0,0)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90" />
                <g
                   transform="translate(-97,-560)"
                   id="g2063"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="129.49626"
                     x="-489.49979"
                     height="7.0035982"
                     width="17.999748"
                     id="rect1935"
                     style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00024867;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="130.50006"
                     x="-488.50009"
                     height="4.9998937"
                     width="15.999757"
                     id="rect1937"
                     style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00024891;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                     rx="0"
                     ry="0" />
                </g>
                <rect
                   style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
                   id="rect1939"
                   width="10"
                   height="5.0000305"
                   x="74.500122"
                   y="43.5"
                   transform="matrix(0,-1,1,0,0,0)"
                   rx="0"
                   ry="0"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90" />
                <g
                   id="g2992"
                   transform="translate(-157,-570)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     y="489.5"
                     x="186.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect2994"
                     style="fill:url(#linearGradient6956);fill-opacity:1;stroke:url(#linearGradient6958);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     y="489.5"
                     x="191.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect2996"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     y="489.5"
                     x="196.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect2998"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     y="489.5"
                     x="201.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3000"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     transform="scale(-1,-1)"
                     y="-491.5"
                     x="-209.49998"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3002"
                     style="fill:url(#linearGradient6960);fill-opacity:1;stroke:url(#linearGradient6962);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                </g>
              </g>
            </g>
          </svg>
          
        • align-right.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22"
             height="22"
             id="svg11187"
             sodipodi:version="0.32"
             inkscape:version="0.44+devel"
             version="1.0"
             sodipodi:docbase="/home/andreas/project/inkscape/22x22/actions"
             sodipodi:docname="align-horisontal-right.svg"
             inkscape:output_extension="org.inkscape.output.svg.inkscape"
             sodipodi:modified="TRUE"
             inkscape:export-filename="/home/andreas/project/inkscape/22x22/actions/align-horisontal-right.png"
             inkscape:export-xdpi="90"
             inkscape:export-ydpi="90">
            <defs
               id="defs11189">
              <linearGradient
                 id="linearGradient2968"
                 inkscape:collect="always">
                <stop
                   id="stop2970"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2972"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient4732"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2974"
                 inkscape:collect="always">
                <stop
                   id="stop2976"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2978"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient4730"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2986"
                 inkscape:collect="always">
                <stop
                   id="stop2988"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2990"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient4728"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2980"
                 inkscape:collect="always">
                <stop
                   id="stop2982"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2984"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient4726"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="11.197802"
               inkscape:cx="16"
               inkscape:cy="16"
               inkscape:current-layer="layer1"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               width="22px"
               height="22px"
               inkscape:window-width="797"
               inkscape:window-height="628"
               inkscape:window-x="0"
               inkscape:window-y="47" />
            <metadata
               id="metadata11192">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <g
                 style="display:inline"
                 id="g4025"
                 transform="matrix(0,-1,1,0,-60.999914,-198.00011)"
                 inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                 inkscape:export-xdpi="90"
                 inkscape:export-ydpi="90">
                <rect
                   style="fill:#d3d7cf;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                   id="rect3873"
                   width="12"
                   height="7"
                   x="-80.499878"
                   y="-207.5"
                   transform="matrix(0,-1,1,0,0,0)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90" />
                <rect
                   style="fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                   id="rect3875"
                   width="10"
                   height="5.0000305"
                   x="-79.499878"
                   y="-206.5"
                   transform="matrix(0,-1,1,0,0,0)"
                   rx="0"
                   ry="0"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90" />
                <g
                   id="g3877"
                   transform="translate(-347,-409)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90"
                   style="display:inline">
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="129.49626"
                     x="-489.49979"
                     height="7.0035982"
                     width="17.999748"
                     id="rect3879"
                     style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00024867;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="130.50006"
                     x="-488.50009"
                     height="4.9998937"
                     width="15.999757"
                     id="rect3881"
                     style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00024891;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                     rx="0"
                     ry="0" />
                </g>
                <g
                   id="g3919"
                   transform="translate(-407,-410)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90"
                   style="display:inline">
                  <rect
                     y="489.5"
                     x="196.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3921"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <path
                     style="fill:url(#linearGradient4726);fill-opacity:1;stroke:url(#linearGradient4728);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                     d="M 197.49998,491.5 L 186.49989,491.5 L 186.49989,489.5 L 197.49998,489.5"
                     id="path3923"
                     sodipodi:nodetypes="cccc" />
                  <path
                     style="fill:url(#linearGradient4730);fill-opacity:1;stroke:url(#linearGradient4732);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                     d="M 198.49989,489.5 L 209.49998,489.5 L 209.49998,491.5 L 198.49989,491.5"
                     id="path3925"
                     sodipodi:nodetypes="cccc" />
                </g>
              </g>
            </g>
          </svg>
          
        • align-top.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22"
             height="22"
             id="svg10699"
             sodipodi:version="0.32"
             inkscape:version="0.44+devel"
             version="1.0"
             sodipodi:docbase="/home/andreas/project/inkscape/22x22/actions"
             sodipodi:docname="align-vertical-bottom.svg"
             inkscape:output_extension="org.inkscape.output.svg.inkscape"
             inkscape:export-filename="/home/andreas/project/inkscape/22x22/actions/align-vertical-bottom.png"
             inkscape:export-xdpi="90"
             inkscape:export-ydpi="90"
             sodipodi:modified="true">
            <defs
               id="defs10701">
              <linearGradient
                 id="linearGradient2968"
                 inkscape:collect="always">
                <stop
                   id="stop2970"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2972"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2968"
                 id="linearGradient6954"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2974"
                 inkscape:collect="always">
                <stop
                   id="stop2976"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2978"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2974"
                 id="linearGradient6952"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(-1,0,0,-1,395.9999,981)"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
              <linearGradient
                 id="linearGradient2986"
                 inkscape:collect="always">
                <stop
                   id="stop2988"
                   offset="0"
                   style="stop-color:#ce5c00;stop-opacity:1" />
                <stop
                   id="stop2990"
                   offset="1"
                   style="stop-color:#ce5c00;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2986"
                 id="linearGradient6950"
                 gradientUnits="userSpaceOnUse"
                 x1="187.60938"
                 y1="489.35938"
                 x2="186.93732"
                 y2="489.35938" />
              <linearGradient
                 id="linearGradient2980"
                 inkscape:collect="always">
                <stop
                   id="stop2982"
                   offset="0"
                   style="stop-color:#fcaf3e;stop-opacity:1" />
                <stop
                   id="stop2984"
                   offset="1"
                   style="stop-color:#fcaf3e;stop-opacity:0" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2980"
                 id="linearGradient6948"
                 gradientUnits="userSpaceOnUse"
                 x1="187.81554"
                 y1="489.54688"
                 x2="187.1716"
                 y2="489.54688" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="11.197802"
               inkscape:cx="16"
               inkscape:cy="16"
               inkscape:current-layer="layer1"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               width="22px"
               height="22px"
               inkscape:window-width="797"
               inkscape:window-height="628"
               inkscape:window-x="0"
               inkscape:window-y="47" />
            <metadata
               id="metadata10704">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <g
                 style="display:inline"
                 id="g6862"
                 transform="translate(-59.99998,90)"
                 inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                 inkscape:export-xdpi="90"
                 inkscape:export-ydpi="90">
                <g
                   id="g3084"
                   transform="translate(-97,-563)"
                   style="fill:#d3d7cf;stroke:#888a85"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     transform="matrix(0,1,1,0,0,0)"
                     y="169.5"
                     x="475.50012"
                     height="7"
                     width="12"
                     id="rect3086"
                     style="fill:#d3d7cf;fill-opacity:1;stroke:#888a85;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <rect
                     ry="0"
                     rx="0"
                     transform="matrix(0,1,1,0,0,0)"
                     y="170.5"
                     x="476.50012"
                     height="5.0000305"
                     width="10"
                     id="rect3088"
                     style="opacity:1;fill:#d3d7cf;fill-opacity:1;stroke:#ffffff;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:3;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                </g>
                <g
                   id="g3090"
                   transform="translate(-67,-559)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="129.49626"
                     x="-489.49979"
                     height="7.0035982"
                     width="17.999748"
                     id="rect3092"
                     style="color:#000000;fill:#d3d7cf;fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00024867;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline" />
                  <rect
                     transform="matrix(0,-1,1,0,0,0)"
                     y="130.50006"
                     x="-488.50009"
                     height="4.9998937"
                     width="15.999757"
                     id="rect3094"
                     style="color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00024891;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:2;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:inline"
                     rx="0"
                     ry="0" />
                </g>
                <g
                   id="g3262"
                   transform="translate(-127,-578)"
                   inkscape:export-filename="/home/lapo/Desktop/align-distribute.tar.gz_FILES/align-stuff.png"
                   inkscape:export-xdpi="90"
                   inkscape:export-ydpi="90">
                  <rect
                     y="489.5"
                     x="196.49989"
                     height="1.9999999"
                     width="3.0000916"
                     id="rect3264"
                     style="fill:#fcaf3e;fill-opacity:1;stroke:#ce5c00;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
                  <path
                     style="fill:url(#linearGradient6948);fill-opacity:1;stroke:url(#linearGradient6950);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                     d="M 197.49998,491.5 L 186.49989,491.5 L 186.49989,489.5 L 197.49998,489.5"
                     id="path3266"
                     sodipodi:nodetypes="cccc" />
                  <path
                     style="fill:url(#linearGradient6952);fill-opacity:1;stroke:url(#linearGradient6954);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-dashoffset:0;stroke-opacity:1"
                     d="M 198.49989,489.5 L 209.49998,489.5 L 209.49998,491.5 L 198.49989,491.5"
                     id="path3268"
                     sodipodi:nodetypes="cccc" />
                </g>
              </g>
            </g>
          </svg>
          
        • conn.svg
          <svg xmlns="http://www.w3.org/2000/svg">
          	<g id="mode_connect">
          		<svg viewBox="0 0 24 24" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
          		 <defs>
          
          		  <line stroke-width="5" fill="none" stroke="#000000" id="svg_2" y2="121" x2="136" y1="7" x1="136">
          		   <stop stop-opacity="1" stop-color="#4687a0"/>
          		   <stop stop-opacity="1" stop-color="#ffffff"/>
          		  </line>
          		  <linearGradient y2="0.18359" x2="0.29688" y1="0.92188" x1="0.62109" id="svg_3">
          		   <stop stop-opacity="1" stop-color="#417dad" offset="0"/>
          		   <stop stop-opacity="1" stop-color="#ffffff" offset="1"/>
          		  </linearGradient>
          		 </defs>
          		 <g>
          		  <title>Layer 1</title>
          		  <line x1="5.64676" y1="5.60056" x2="18.50037" y2="18.62557" id="svg_5" stroke="#000000" fill="none"/>
          		  <rect opacity="0.75" stroke-width="0.5" x="0.5" y="0.5" width="9.625" height="5.125" id="svg_1" fill="url(#svg_3)" stroke="#000000"/>
          		  <rect opacity="0.75" id="svg_4" stroke-width="0.5" x="13.75" y="18.25" width="9.625" height="5.125" fill="url(#svg_3)" stroke="#000000"/>
          		  <g id="svg_9">
          		   <path d="m14.57119,9.12143l-0.98244,5.18852l2.70861,-4.36084" id="svg_6" fill="#a0a0a0" stroke="#000000"/>
          		   <path d="m14.27564,6.76258c-0.25872,0.72562 -0.40735,1.65632 -0.33812,2.15432l2.90784,1.2509c0.30961,-0.21212 1.08198,-1.1814 1.08198,-1.73736" id="svg_7" fill="url(#svg_3)" stroke="#000000"/>
          		   <path d="m16.28893,0.37519l-2.46413,5.9304l4.76481,2.39435l2.13178,-4.96735" id="svg_8" fill="url(#svg_3)" stroke="#000000"/>
          		  </g>
          		 </g>
          		</svg>
          	</g>
          	<g id="svg_eof"/>
          </svg>
        • logo.svg
          <svg viewBox="0 0 478 472" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
           <defs>
            <linearGradient id="svg_5" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#ffffe0" stop-opacity="1"/>
             <stop offset="1" stop-color="#edc39c" stop-opacity="1"/>
            </linearGradient>
            <linearGradient id="svg_10" x1="0.57031" y1="0.78125" x2="0.28906" y2="0.41406">
             <stop offset="0" stop-color="#ff7f00" stop-opacity="1"/>
             <stop offset="1" stop-color="#ffff00"/>
            </linearGradient>
            <linearGradient id="svg_18" x1="0.37891" y1="0.35938" x2="1" y2="1">
             <stop offset="0" stop-color="#e0e0e0" stop-opacity="1"/>
             <stop offset="1" stop-color="#666666" stop-opacity="1"/>
            </linearGradient>
           </defs>
           <g>
            <title>Layer 1</title>
            <path d="m68.82031,270.04688l-22,-33l17,-35l34,2l25,15l7,-35l28,-16l25,12l100,102l21,23l-15,35l-36,9l20,49l-31,24l-49,-17l-1,31l-33,21l-31,-19l-13,-35l-30,21l-30,-9l-5,-35l16,-31l-32,-6l-15,-19l3,-36l47,-18z" id="svg_19" fill="#ffffff"/>
            <path fill="#1a171a" fill-rule="nonzero" id="path2902" d="m158.96452,155.03685c-25.02071,0 -45.37077,20.35121 -45.37077,45.3775c0,0.72217 0.01794,1.4399 0.0471,2.15645c-0.49339,-0.53604 -0.99355,-1.06085 -1.50603,-1.58452c-8.56077,-8.55519 -19.95982,-13.28413 -32.07432,-13.28413c-12.12122,0 -23.52027,4.72334 -32.08778,13.29646c-17.69347,17.69464 -17.69347,46.4619 0,64.17445c0.51809,0.51697 1.0485,1.0126 1.59015,1.50601c-0.72891,-0.03586 -1.45782,-0.04822 -2.19234,-0.04822c-25.02071,0 -45.37189,20.35117 -45.37189,45.37747c0,25.01398 20.35119,45.36517 45.37189,45.36517c0.72891,0 1.45221,-0.01236 2.1744,-0.04828c-0.5293,0.48221 -1.05412,0.98801 -1.56547,1.49368c-17.70021,17.68906 -17.70021,46.48654 -0.00628,64.18677c8.57872,8.56747 19.96655,13.2785 32.08778,13.2785c12.1145,0 23.5012,-4.71103 32.07433,-13.2785c0.51247,-0.51694 1.01823,-1.04849 1.50603,-1.57895c-0.02915,0.71213 -0.04709,1.44669 -0.04709,2.15759c0,25.01511 20.35007,45.37747 45.37077,45.37747c25.01398,0 45.37079,-20.3624 45.37079,-45.37747c0,-0.7222 -0.01689,-1.44553 -0.05266,-2.18112c0.48105,0.52933 0.97562,1.04849 1.48697,1.56662c8.57982,8.57977 19.97775,13.2908 32.1057,13.2908c12.11003,0 23.51358,-4.71103 32.0687,-13.2785c17.68906,-17.70013 17.68906,-46.48538 0,-64.17441c-0.50577,-0.4946 -1.01141,-1.00034 -1.54306,-1.48248c0.69983,0.03592 1.42316,0.04828 2.16992,0.04828c25.01514,0 45.35284,-20.35123 45.35284,-45.36517c0,-25.02631 -20.33774,-45.37747 -45.35284,-45.37747c-0.74683,0 -1.47009,0.01236 -2.19345,0.04822c0.53152,-0.49341 1.06082,-0.98904 1.59128,-1.50601c8.55521,-8.55521 13.2785,-19.94186 13.2785,-32.07545c0,-12.12793 -4.72336,-23.52028 -13.30319,-32.0934c-8.55515,-8.56076 -19.95866,-13.2841 -32.0687,-13.2841c-12.12122,0 -23.52025,4.72334 -32.08777,13.2841c-0.51137,0.5181 -1.01822,1.04851 -1.5049,1.57895c0.03586,-0.72331 0.05266,-1.43991 0.05266,-2.16881c0,-25.02629 -20.35681,-45.3775 -45.37079,-45.3775m0,20.71901c13.61607,0 24.65851,11.03122 24.65851,24.65849c0,6.62749 -2.651,12.62137 -6.9101,17.04979l0,51.67419l36.53975,-36.53523c0.12001,-6.14418 2.48277,-12.24686 7.18146,-16.94667c4.81305,-4.81305 11.12094,-7.22409 17.44116,-7.22409c6.30228,0 12.61577,2.41104 17.43552,7.22409c9.62166,9.63287 9.62166,25.24948 0,34.87669c-4.69977,4.68634 -10.80803,7.04915 -16.95334,7.18147l-36.5341,36.53305l51.66742,0c4.42841,-4.25351 10.42905,-6.90451 17.08008,-6.90451c13.59137,0 24.62933,11.03799 24.62933,24.66525c0,13.61606 -11.03796,24.66519 -24.62933,24.66519c-6.65106,0 -12.65167,-2.66333 -17.08008,-6.91681l-51.64836,0l36.50273,36.50946c6.16995,0.14465 12.26587,2.50522 16.96568,7.20618c9.6216,9.61487 9.6216,25.23151 0,34.85757c-4.80856,4.81979 -11.13327,7.22974 -17.43556,7.22974c-6.32019,0 -12.63371,-2.40991 -17.44786,-7.22974c-4.68074,-4.68744 -7.04802,-10.79572 -7.17473,-16.94098l-36.53975,-36.53415l0,51.66742c4.25908,4.44635 6.9101,10.43466 6.9101,17.0621c0,13.62729 -11.04243,24.66415 -24.65851,24.66415c-13.62166,0 -24.65848,-11.0369 -24.65848,-24.66415c0,-6.62744 2.64539,-12.61575 6.90335,-17.0621l0,-51.66742l-36.53864,36.54648c-0.12672,6.14413 -2.48838,12.26477 -7.18147,16.94098c-4.81416,4.81873 -11.12206,7.22974 -17.42882,7.22974c-6.31461,0 -12.6225,-2.41101 -17.43555,-7.22974c-9.63284,-9.62833 -9.63284,-25.24277 0,-34.8699c4.68073,-4.67627 10.79012,-7.05026 16.94101,-7.18262l36.533,-36.53302l-51.66632,0c-4.44075,4.25348 -10.42902,6.91681 -17.06211,6.91681c-13.61606,0 -24.65288,-11.04913 -24.65288,-24.66519c0,-13.62726 11.03682,-24.66525 24.65288,-24.66525c6.63309,0 12.62136,2.651 17.06211,6.90451l51.68537,0l-36.55208,-36.54538c-6.14527,-0.12 -12.25354,-2.49403 -16.94775,-7.19377c-9.62611,-9.61493 -9.62611,-25.23715 0,-34.86441c4.81419,-4.81305 11.12769,-7.22406 17.44228,-7.22406c6.30676,0 12.61465,2.41101 17.42883,7.22406c4.69978,4.69307 7.06034,10.80246 7.18144,16.94777l36.5386,36.53299l0,-51.66074c-4.25795,-4.42841 -6.90334,-10.42229 -6.90334,-17.04979c0,-13.62726 11.03682,-24.65848 24.65848,-24.65848"/>
            <path d="m188.82031,210.04688l16,-47l155,-148l107,100l-158,156.99999l-44,12l-76,-74z" id="svg_6" fill="url(#svg_10)" stroke="#ffffff" stroke-width="0"/>
            <path d="m335.57031,40.29688c-11.5,39.75 55.5,115.25 109.25,98.75l21,-20.99999l-103,-101l-27.25,23.25z" id="svg_11" fill="url(#svg_18)" stroke="#ffffff" stroke-width="0"/>
            <rect x="272.80404" y="20.76382" width="42.35197" height="232.66835" id="svg_13" fill="#ffffff" stroke="#ffffff" stroke-width="0" transform="rotate(45.9094, 293.98, 137.1)" opacity="0.4"/>
            <rect x="282.80404" y="22.76382" width="14" height="232.66835" fill="#ffffff" stroke="#ffffff" stroke-width="0" transform="rotate(45.9094, 289.805, 139.1)" opacity="0.4" id="svg_14"/>
            <ellipse cx="415.13312" cy="64.38066" id="svg_12" fill="#ea7598" stroke="#ffffff" stroke-width="0" rx="67.79251" ry="34.82026" transform="rotate(39.4735, 415.133, 64.379)"/>
            <path d="m212.07031,166.04688c-8.5,47 36.25,103.75 99.25,96.75l-152.5,53.25l53.25,-150z" id="svg_4" fill="url(#svg_5)" stroke="#ffffff" stroke-width="0"/>
            <path d="m181.32031,242.54688c0.5,20.5 26.75,45 46.75,48.5l-66.25,20l19.5,-68.5z" id="svg_3" fill="#27382f" stroke="#ffffff" stroke-width="0"/>
           </g>
           <g>
            <title>Layer 2</title>
            <path d="m152.82031,317.04688l51,-152l157,-153c40,-12.00001 118,48 105,105l-157,152.99999l-156,47z" id="svg_1" fill="none" stroke="#800000" stroke-width="17"/>
           </g>
          </svg>
          
        • polygon.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             sodipodi:docname="draw-polygon.svg"
             sodipodi:docbase="/home/andreas/projekt/tango/22"
             inkscape:version="0.42"
             id="svg8728"
             height="22.000000px"
             width="22.000000px"
             inkscape:export-filename="/home/andreas/projekt/tango/22/draw-polygon.png"
             inkscape:export-xdpi="90.000000"
             inkscape:export-ydpi="90.000000">
            <defs
               id="defs3">
              <linearGradient
                 inkscape:collect="always"
                 id="linearGradient3941">
                <stop
                   style="stop-color:#000000;stop-opacity:1;"
                   offset="0"
                   id="stop3943" />
                <stop
                   style="stop-color:#000000;stop-opacity:0;"
                   offset="1"
                   id="stop3945" />
              </linearGradient>
              <linearGradient
                 id="linearGradient6581">
                <stop
                   style="stop-color:#eeeeec;stop-opacity:1;"
                   offset="0"
                   id="stop6583" />
                <stop
                   style="stop-color:#e0e0de;stop-opacity:1.0000000;"
                   offset="1.0000000"
                   id="stop6585" />
              </linearGradient>
              <linearGradient
                 id="linearGradient14920">
                <stop
                   id="stop14922"
                   offset="0"
                   style="stop-color:#5a7aa4;stop-opacity:1;" />
                <stop
                   id="stop14924"
                   offset="1.0000000"
                   style="stop-color:#1f2b3a;stop-opacity:1.0000000;" />
              </linearGradient>
              <linearGradient
                 id="linearGradient13390">
                <stop
                   id="stop13392"
                   offset="0.0000000"
                   style="stop-color:#81a2cd;stop-opacity:1.0000000;" />
                <stop
                   id="stop13394"
                   offset="1.0000000"
                   style="stop-color:#2a415f;stop-opacity:1.0000000;" />
              </linearGradient>
              <linearGradient
                 id="linearGradient10325">
                <stop
                   id="stop10327"
                   offset="0"
                   style="stop-color:#5a7aa4;stop-opacity:1;" />
                <stop
                   id="stop10329"
                   offset="1.0000000"
                   style="stop-color:#455e7e;stop-opacity:1.0000000;" />
              </linearGradient>
              <linearGradient
                 gradientUnits="userSpaceOnUse"
                 y2="39.486301"
                 x2="37.746555"
                 y1="23.992306"
                 x1="23.598076"
                 gradientTransform="matrix(0.363308,0,0,0.363571,1.976073,1.180651)"
                 id="linearGradient13217"
                 xlink:href="#linearGradient6581"
                 inkscape:collect="always" />
              <radialGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient3941"
                 id="radialGradient3947"
                 cx="2.25"
                 cy="16"
                 fx="2.25"
                 fy="16"
                 r="16.875"
                 gradientTransform="matrix(1.000000,0.000000,0.000000,0.333333,-5.774893e-15,10.66667)"
                 gradientUnits="userSpaceOnUse" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient6581"
                 id="linearGradient2398"
                 x1="10.769515"
                 y1="8.7196503"
                 x2="15.923767"
                 y2="15.039417"
                 gradientUnits="userSpaceOnUse" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient6581"
                 id="linearGradient2403"
                 gradientUnits="userSpaceOnUse"
                 x1="10.769515"
                 y1="8.7196503"
                 x2="15.923767"
                 y2="15.039417"
                 gradientTransform="matrix(0.874941,0.000000,0.000000,0.868551,1.339139,1.349650)" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient6581"
                 id="linearGradient2405"
                 gradientUnits="userSpaceOnUse"
                 x1="10.769515"
                 y1="8.7196503"
                 x2="15.923767"
                 y2="15.039417"
                 gradientTransform="matrix(1.001575,0.000000,0.000000,1.000000,-3.040037e-3,0.000000)" />
            </defs>
            <sodipodi:namedview
               inkscape:window-y="25"
               inkscape:window-x="0"
               inkscape:window-height="949"
               inkscape:window-width="1280"
               inkscape:document-units="px"
               inkscape:grid-bbox="true"
               showgrid="false"
               inkscape:current-layer="layer1"
               inkscape:cy="10.249014"
               inkscape:cx="16.435231"
               inkscape:zoom="15.999999"
               inkscape:pageshadow="2"
               inkscape:pageopacity="0.0"
               borderopacity="0.08235294"
               bordercolor="#666666"
               pagecolor="#ffffff"
               id="base"
               showguides="true"
               inkscape:guide-bbox="true"
               inkscape:showpageshadow="false"
               stroke="#888a85" />
            <metadata
               id="metadata4">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                  <dc:title>Draw Rectangle</dc:title>
                  <dc:date>2005-10-10</dc:date>
                  <dc:creator>
                    <cc:Agent>
                      <dc:title>Andreas Nilsson</dc:title>
                    </cc:Agent>
                  </dc:creator>
                  <dc:subject>
                    <rdf:Bag>
                      <rdf:li>draw</rdf:li>
                      <rdf:li>rectangle</rdf:li>
                      <rdf:li>square</rdf:li>
                    </rdf:Bag>
                  </dc:subject>
                  <cc:license
                     rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
                </cc:Work>
                <cc:License
                   rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
                  <cc:permits
                     rdf:resource="http://web.resource.org/cc/Reproduction" />
                  <cc:permits
                     rdf:resource="http://web.resource.org/cc/Distribution" />
                  <cc:requires
                     rdf:resource="http://web.resource.org/cc/Notice" />
                  <cc:requires
                     rdf:resource="http://web.resource.org/cc/Attribution" />
                  <cc:permits
                     rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
                  <cc:requires
                     rdf:resource="http://web.resource.org/cc/ShareAlike" />
                </cc:License>
              </rdf:RDF>
            </metadata>
            <g
               inkscape:groupmode="layer"
               inkscape:label="Layer 1"
               id="layer1">
              <path
                 sodipodi:type="arc"
                 style="opacity:0.60000000;color:#000000;fill:url(#radialGradient3947);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:block;overflow:visible"
                 id="path2193"
                 sodipodi:cx="2.2500000"
                 sodipodi:cy="16.000000"
                 sodipodi:rx="16.875000"
                 sodipodi:ry="5.6250000"
                 d="M 19.125000 16.000000 A 16.875000 5.6250000 0 1 1  -14.625000,16.000000 A 16.875000 5.6250000 0 1 1  19.125000 16.000000 z"
                 transform="matrix(0.503704,0.000000,0.000000,0.349014,9.366667,12.45257)" />
              <path
                 style="fill:url(#linearGradient2405);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#888a85;stroke-width:1.0000002px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
                 d="M 10.376363,3.6237647 L 18.439333,9.5822222 L 15.644242,18.503298 L 5.3933717,18.503298 L 2.5694122,9.5814367 L 10.376363,3.6237647 z "
                 id="path1661"
                 sodipodi:nodetypes="cccccc" />
              <path
                 style="fill:url(#linearGradient2403);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#fdfdfb;stroke-width:0.99999976px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
                 d="M 10.383801,4.6223366 L 17.428917,9.8682235 L 14.894231,17.502140 L 6.1335005,17.494329 L 3.6135882,9.9131875 L 10.383801,4.6223366 z "
                 id="path2401"
                 sodipodi:nodetypes="cccccc" />
            </g>
          </svg>
          
        • svg_edit_icons.svg
          <svg xmlns="http://www.w3.org/2000/svg">
          <!-- All images created with SVG-edit - http://svg-edit.googlecode.com/ -->
          
          <g id="logo">
          <svg viewBox="0 0 478 472" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
           <defs>
            <linearGradient id="svg_5" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#ffffe0" stop-opacity="1"/>
             <stop offset="1" stop-color="#edc39c" stop-opacity="1"/>
            </linearGradient>
            <linearGradient id="svg_10" x1="0.57031" y1="0.78125" x2="0.28906" y2="0.41406">
             <stop offset="0" stop-color="#ff7f00" stop-opacity="1"/>
             <stop offset="1" stop-color="#ffff00"/>
            </linearGradient>
            <linearGradient id="svg_18" x1="0.37891" y1="0.35938" x2="1" y2="1">
             <stop offset="0" stop-color="#e0e0e0" stop-opacity="1"/>
             <stop offset="1" stop-color="#666666" stop-opacity="1"/>
            </linearGradient>
           </defs>
           <g>
            <path d="m68.82031,270.04688l-22,-33l17,-35l34,2l25,15l7,-35l28,-16l25,12l100,102l21,23l-15,35l-36,9l20,49l-31,24l-49,-17l-1,31l-33,21l-31,-19l-13,-35l-30,21l-30,-9l-5,-35l16,-31l-32,-6l-15,-19l3,-36l47,-18z" id="svg_19" fill="#ffffff"/>
            <path fill="#1a171a" fill-rule="nonzero" id="path2902" d="m158.96452,155.03685c-25.02071,0 -45.37077,20.35121 -45.37077,45.3775c0,0.72217 0.01794,1.4399 0.0471,2.15645c-0.49339,-0.53604 -0.99355,-1.06085 -1.50603,-1.58452c-8.56077,-8.55519 -19.95982,-13.28413 -32.07432,-13.28413c-12.12122,0 -23.52027,4.72334 -32.08778,13.29646c-17.69347,17.69464 -17.69347,46.4619 0,64.17445c0.51809,0.51697 1.0485,1.0126 1.59015,1.50601c-0.72891,-0.03586 -1.45782,-0.04822 -2.19234,-0.04822c-25.02071,0 -45.37189,20.35117 -45.37189,45.37747c0,25.01398 20.35119,45.36517 45.37189,45.36517c0.72891,0 1.45221,-0.01236 2.1744,-0.04828c-0.5293,0.48221 -1.05412,0.98801 -1.56547,1.49368c-17.70021,17.68906 -17.70021,46.48654 -0.00628,64.18677c8.57872,8.56747 19.96655,13.2785 32.08778,13.2785c12.1145,0 23.5012,-4.71103 32.07433,-13.2785c0.51247,-0.51694 1.01823,-1.04849 1.50603,-1.57895c-0.02915,0.71213 -0.04709,1.44669 -0.04709,2.15759c0,25.01511 20.35007,45.37747 45.37077,45.37747c25.01398,0 45.37079,-20.3624 45.37079,-45.37747c0,-0.7222 -0.01689,-1.44553 -0.05266,-2.18112c0.48105,0.52933 0.97562,1.04849 1.48697,1.56662c8.57982,8.57977 19.97775,13.2908 32.1057,13.2908c12.11003,0 23.51358,-4.71103 32.0687,-13.2785c17.68906,-17.70013 17.68906,-46.48538 0,-64.17441c-0.50577,-0.4946 -1.01141,-1.00034 -1.54306,-1.48248c0.69983,0.03592 1.42316,0.04828 2.16992,0.04828c25.01514,0 45.35284,-20.35123 45.35284,-45.36517c0,-25.02631 -20.33774,-45.37747 -45.35284,-45.37747c-0.74683,0 -1.47009,0.01236 -2.19345,0.04822c0.53152,-0.49341 1.06082,-0.98904 1.59128,-1.50601c8.55521,-8.55521 13.2785,-19.94186 13.2785,-32.07545c0,-12.12793 -4.72336,-23.52028 -13.30319,-32.0934c-8.55515,-8.56076 -19.95866,-13.2841 -32.0687,-13.2841c-12.12122,0 -23.52025,4.72334 -32.08777,13.2841c-0.51137,0.5181 -1.01822,1.04851 -1.5049,1.57895c0.03586,-0.72331 0.05266,-1.43991 0.05266,-2.16881c0,-25.02629 -20.35681,-45.3775 -45.37079,-45.3775m0,20.71901c13.61607,0 24.65851,11.03122 24.65851,24.65849c0,6.62749 -2.651,12.62137 -6.9101,17.04979l0,51.67419l36.53975,-36.53523c0.12001,-6.14418 2.48277,-12.24686 7.18146,-16.94667c4.81305,-4.81305 11.12094,-7.22409 17.44116,-7.22409c6.30228,0 12.61577,2.41104 17.43552,7.22409c9.62166,9.63287 9.62166,25.24948 0,34.87669c-4.69977,4.68634 -10.80803,7.04915 -16.95334,7.18147l-36.5341,36.53305l51.66742,0c4.42841,-4.25351 10.42905,-6.90451 17.08008,-6.90451c13.59137,0 24.62933,11.03799 24.62933,24.66525c0,13.61606 -11.03796,24.66519 -24.62933,24.66519c-6.65106,0 -12.65167,-2.66333 -17.08008,-6.91681l-51.64836,0l36.50273,36.50946c6.16995,0.14465 12.26587,2.50522 16.96568,7.20618c9.6216,9.61487 9.6216,25.23151 0,34.85757c-4.80856,4.81979 -11.13327,7.22974 -17.43556,7.22974c-6.32019,0 -12.63371,-2.40991 -17.44786,-7.22974c-4.68074,-4.68744 -7.04802,-10.79572 -7.17473,-16.94098l-36.53975,-36.53415l0,51.66742c4.25908,4.44635 6.9101,10.43466 6.9101,17.0621c0,13.62729 -11.04243,24.66415 -24.65851,24.66415c-13.62166,0 -24.65848,-11.0369 -24.65848,-24.66415c0,-6.62744 2.64539,-12.61575 6.90335,-17.0621l0,-51.66742l-36.53864,36.54648c-0.12672,6.14413 -2.48838,12.26477 -7.18147,16.94098c-4.81416,4.81873 -11.12206,7.22974 -17.42882,7.22974c-6.31461,0 -12.6225,-2.41101 -17.43555,-7.22974c-9.63284,-9.62833 -9.63284,-25.24277 0,-34.8699c4.68073,-4.67627 10.79012,-7.05026 16.94101,-7.18262l36.533,-36.53302l-51.66632,0c-4.44075,4.25348 -10.42902,6.91681 -17.06211,6.91681c-13.61606,0 -24.65288,-11.04913 -24.65288,-24.66519c0,-13.62726 11.03682,-24.66525 24.65288,-24.66525c6.63309,0 12.62136,2.651 17.06211,6.90451l51.68537,0l-36.55208,-36.54538c-6.14527,-0.12 -12.25354,-2.49403 -16.94775,-7.19377c-9.62611,-9.61493 -9.62611,-25.23715 0,-34.86441c4.81419,-4.81305 11.12769,-7.22406 17.44228,-7.22406c6.30676,0 12.61465,2.41101 17.42883,7.22406c4.69978,4.69307 7.06034,10.80246 7.18144,16.94777l36.5386,36.53299l0,-51.66074c-4.25795,-4.42841 -6.90334,-10.42229 -6.90334,-17.04979c0,-13.62726 11.03682,-24.65848 24.65848,-24.65848"/>
            <path d="m188.82031,210.04688l16,-47l155,-148l107,100l-158,156.99999l-44,12l-76,-74z" id="svg_6" fill="url(#svg_10)" stroke="none"/>
            <path d="m335.57031,40.29688c-11.5,39.75 55.5,115.25 109.25,98.75l21,-20.99999l-103,-101l-27.25,23.25z" id="svg_11" fill="url(#svg_18)" stroke="none"/>
            <rect x="272.80404" y="20.76382" width="42.35197" height="232.66835" id="svg_13" fill="#ffffff" stroke="none" transform="rotate(45.9094, 293.98, 137.1)" opacity="0.4"/>
            <rect x="282.80404" y="22.76382" width="14" height="232.66835" fill="#ffffff" stroke="none" transform="rotate(45.9094, 289.805, 139.1)" opacity="0.4" id="svg_14"/>
            <ellipse cx="415.13312" cy="64.38066" id="svg_12" fill="#ea7598" stroke="none" rx="67.79251" ry="34.82026" transform="rotate(39.4735, 415.133, 64.379)"/>
            <path d="m212.07031,166.04688c-8.5,47 36.25,103.75 99.25,96.75l-152.5,53.25l53.25,-150z" id="svg_4" fill="url(#svg_5)" stroke="none"/>
            <path d="m181.32031,242.54688c0.5,20.5 26.75,45 46.75,48.5l-66.25,20l19.5,-68.5z" id="svg_3" fill="#27382f" stroke="none"/>
           </g>
           <g>
            <path d="m152.82031,317.04688l51,-152l157,-153c40,-12.00001 118,48 105,105l-157,152.99999l-156,47z" id="svg_1" fill="none" stroke="#800000" stroke-width="17"/>
           </g>
          </svg>
          </g>
          
          
          <g id="select">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
          	  <path stroke="#ffffff" fill="#000000" id="svg_13" d="m7.38168,2.46948l0.07502,17.03258l3.30083,-2.62617l2.62566,5.62751l4.20105,-2.62617l-3.30082,-4.80214l4.57614,-0.37517l-11.47787,-12.23044z"/>
          	</svg>
          </g>
          
          <g id="select_node">
          	<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	  <circle stroke="#0000ff" fill="#00ffff" id="svg_44" r="3.87891" cy="5.3" cx="8.7" stroke-width="1.5"/>
          	  <path d="m9.18161,5.6695l0.07763,15.16198l3.41588,-2.33775l2.71718,5.00947l4.34748,-2.33775l-3.41587,-4.27474l4.73565,-0.33397l-11.87794,-10.88723z" id="svg_13" fill="#000000" stroke="#ffffff"/>
          	</svg>
          </g>
          
          <g id="square">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
           <defs>
            <linearGradient id="svg_2" x1="0.36328" y1="0.10156" x2="1" y2="1">
             <stop offset="0" stop-color="#ffffff" stop-opacity="1"/>
             <stop offset="1" stop-color="#3b7e9b" stop-opacity="1"/>
            </linearGradient>
           </defs>
            <rect x="1.5" y="1.5" width="20" height="20" id="svg_1" fill="url(#svg_2)" stroke="#000000"/>
           </svg>
          </g>
          
          <g id="rect">
          <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient y2="1" x2="1" y1="0.10156" x1="0.36328" id="svg_2">
             <stop stop-opacity="1" stop-color="#ffffff" offset="0"/>
             <stop stop-opacity="1" stop-color="#3b7e9b" offset="1"/>
            </linearGradient>
           </defs>
            <rect transform="matrix(1, 0, 0, 1, 0, 0)" stroke="#000000" fill="url(#svg_2)" id="svg_1" height="12" width="20" y="5.5" x="1.5"/>
           </svg>
          </g>
          
          <g id="fh_rect">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
           <defs>
            <linearGradient y2="1" x2="1" y1="0.10156" x1="0.36328" id="svg_2">
          
             <stop stop-opacity="1" stop-color="#ffffff" offset="0"/>
             <stop stop-opacity="1" stop-color="#3b7e9b" offset="1"/>
            </linearGradient>
            <linearGradient y2="0.3945" x2="0.6132" y1="0.1093" x1="0.3046" id="svg_9">
             <stop stop-opacity="1" stop-color="#f9d225" offset="0"/>
             <stop stop-opacity="1" stop-color="#bf5f00" offset="1"/>
            </linearGradient>
           </defs>
            <rect stroke="#000000" stroke-width="2" fill="url(#svg_2)" id="svg_1" height="50" width="50" y="0.75" x="1.25"/>
            <path stroke-width="2" stroke="#000000" fill="url(#svg_9)" id="svg_2" d="m31.5,0l-8.75,20.25l0.75,24l16.5,-16.5l6,-12.5"/>
            <path stroke-width="2" stroke="#000000" fill="#fce0a9" id="svg_10" d="m39.5,28.5c-2,-9.25 -10.25,-11.75 -17,-7.4375l0.4843,24.4414z"/>
            <path id="svg_11" stroke-width="2" stroke="#000000" fill="#000000" d="m26.9318,41.1745c-0.4491,-2.3511 -2.3021,-2.9866 -3.8181,-1.8905l0.1087,6.2126z"/>
          </svg>
          </g>
          
          
          <g id="circle">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54">
           <defs>
            <linearGradient y2="1.0" x2="1.0" y1="0.1875" x1="0.171875" id="svg_4">
             <stop stop-opacity="1" stop-color="#ffffff" offset="0.0"/>
             <stop stop-opacity="1" stop-color="#ff6666" offset="1.0"/>
            </linearGradient>
           </defs>
           <g>
            <circle stroke-opacity="1" fill-opacity="1" stroke-width="2" stroke="#000000" fill="url(#svg_4)" id="svg_1" r="23" cy="27" cx="27"/>
           </g>
          </svg>
          </g>
          
          <g id="ellipse">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 54">
           <defs>
            <linearGradient y2="1.0" x2="1.0" y1="0.1875" x1="0.171875" id="svg_4">
             <stop stop-opacity="1" stop-color="#ffffff" offset="0.0"/>
             <stop stop-opacity="1" stop-color="#ff6666" offset="1.0"/>
            </linearGradient>
           </defs>
           <g>
            <ellipse stroke-opacity="1" fill-opacity="1" stroke-width="2" stroke="#000000" fill="url(#svg_4)" id="svg_1" rx="23" ry="15" cy="27" cx="27"/>
           </g>
          </svg>
          </g>
          
          <g id="fh_ellipse">
          <svg viewBox="0 0 52 52" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient id="svg_9" x1="0.3046" y1="0.1093" x2="0.6132" y2="0.3945">
             <stop offset="0" stop-color="#f9d225" stop-opacity="1"/>
             <stop offset="1" stop-color="#bf5f00" stop-opacity="1"/>
            </linearGradient>
            <linearGradient id="svg_4" x1="0.17188" y1="0.1875" x2="1" y2="1">
             <stop offset="0" stop-color="#ffffff" stop-opacity="1"/>
             <stop offset="1" stop-color="#ff6666" stop-opacity="1"/>
            </linearGradient>
           </defs>
            <ellipse stroke-width="2" stroke="#000000" fill="url(#svg_4)" id="svg_1" rx="23" ry="12" cy="37" cx="27"/>
            <path d="m31.5,0l-8.75,20.25l0.75,24l16.5,-16.5l6,-12.5" id="svg_2" fill="url(#svg_9)" stroke="#000000" stroke-width="2"/>
            <path d="m39.5,28.5c-2,-9.25 -10.25,-11.75 -17,-7.4375l0.4843,24.4414z" id="svg_10" fill="#fce0a9" stroke="#000000" stroke-width="2"/>
            <path d="m26.9318,41.1745c-0.4491,-2.3511 -2.3021,-2.9866 -3.8181,-1.8905l0.1087,6.2126z" fill="#000000" stroke="#000000" stroke-width="2" id="svg_11"/>
           </svg>
          </g>
          
          <g id="pencil">
          <svg viewBox="0 0 48 52" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
            <defs>
             <linearGradient id="svg_9" x1="0.3046" y1="0.1093" x2="0.6132" y2="0.3945">
              <stop offset="0.0" stop-color="#f9d225" stop-opacity="1"/>
              <stop offset="1.0" stop-color="#bf5f00" stop-opacity="1"/>
             </linearGradient>
            </defs>
            <path d="M31.5,0 l-8.75,20.25 l0.75,24 l16.5,-16.5 l6,-12.5" id="svg_2" fill="url(#svg_9)" stroke="#000000" stroke-width="2" fill-opacity="1" stroke-opacity="1"/>
            <path d="M39.5,28.5 c-2,-9.25 -10.25,-11.75 -17,-7.4375 l0.4843,24.4414z" id="svg_10" fill="#fce0a9" stroke="#000000" stroke-width="2" fill-opacity="1" stroke-opacity="1"/>
            <path d="M26.9318,41.1745 c-0.4491,-2.3511 -2.3021,-2.9866 -3.8181,-1.8905 l0.1087,6.2126z" fill="#000000" stroke="#000000" stroke-width="2" fill-opacity="1" stroke-opacity="1" id="svg_11"/>
            <path d="M2.3132,4.6197 c12.4998,-1.6891 10.4729,7.0945 0,21.6215 c22.9729,-4.0539 12.1620,5.4053 12.1620,13.1756 c-0.3377,4.0539 8.7836,21.9594 26.0135,-1.3513" id="svg_12" fill="none" stroke="#000000" stroke-width="2" fill-opacity="1" stroke-opacity="1"/>
          </svg>
          </g>
          
          <g id="pen">
          	<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	 <defs>
          	  <linearGradient id="svg_16" x1="0.46484" y1="0.15625" x2="0.9375" y2="0.39453">
          	   <stop offset="0" stop-color="#f2feff" stop-opacity="1"/>
          	   <stop offset="1" stop-color="#14609b" stop-opacity="1"/>
          	  </linearGradient>
          	  <linearGradient id="svg_19" x1="0.18359" y1="0.26172" x2="0.77734" y2="0.56641">
          	   <stop offset="0" stop-color="#ffffff" stop-opacity="1"/>
          	   <stop offset="1" stop-color="#fce564" stop-opacity="1"/>
          	  </linearGradient>
          	 </defs>
          	  <line x1="0.99844" y1="1.49067" x2="12.97691" y2="21.14149" id="svg_5" stroke="#000000" fill="none"/>
          	  <path d="m14.05272,13.68732l-1.46451,7.52632l4.03769,-6.32571" id="svg_6" fill="#a0a0a0" stroke="#000000"/>
          	  <path d="m13.61215,10.26563c-0.38567,1.05257 -0.60723,2.40261 -0.50403,3.125l4.33468,1.81452c0.46153,-0.30769 1.6129,-1.71371 1.6129,-2.52016" id="svg_7" fill="url(#svg_19)" stroke="#000000"/>
          	  <path d="m16.61335,1.00028l-3.67325,8.60247l7.10285,3.47318l3.17783,-7.20549" id="svg_8" fill="url(#svg_16)" stroke="#000000"/>
          	</svg>
          </g>
          
          <g id="text">
          	<svg viewBox="0 0 158 128" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	  <text x="58" y="120" id="svg_1" fill="#000000" stroke="none" font-size="120pt" font-family="sans-serif" text-anchor="middle" fill-opacity="1" stroke-opacity="1" font-weight="bold">A</text>
          	  <line x1="136" y1="7" x2="136" y2="121" id="svg_2" stroke="#000000" fill="none" fill-opacity="1" stroke-opacity="1" stroke-width="5"/>
          	  <line x1="120" y1="4" x2="152" y2="4" id="svg_3" stroke="#000000" stroke-width="5" fill="none" fill-opacity="1" stroke-opacity="1"/>
          	 <line x1="120" y1="124" x2="152" y2="124" stroke="#000000" stroke-width="5" fill="none" fill-opacity="1" stroke-opacity="1" id="svg_4"/>
          	</svg>
          </g>
          
          
          <g id="path">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124 124" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient y2="1" x2="1" y1="0.28125" x1="0.33594" id="svg_4">
             <stop stop-opacity="1" stop-color="#ffffff" offset="0"/>
             <stop stop-opacity="1" stop-color="#33a533" offset="1"/>
            </linearGradient>
           </defs>
            <path stroke-dasharray="null" stroke-width="4" stroke="#000000" fill="url(#svg_4)" id="svg_1" d="m6,103l55,-87c85,33.64 -26,37.12 55,87l-110,0z"/>
           </svg>
          </g>
          
          <g id="add_subpath">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124 124" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient id="svg_4" x1="0.33594" y1="0.28125" x2="1" y2="1">
             <stop offset="0" stop-color="#ffffff" stop-opacity="1"/>
             <stop offset="1" stop-color="#33a533" stop-opacity="1"/>
            </linearGradient>
           </defs>
           <g>
            <path d="m6,103l55,-87c85,33.64 -26,37.12 55,87l-110,0z" id="svg_1" fill="url(#svg_4)" stroke="#000000" stroke-width="4" stroke-dasharray="null"/>
            <g id="svg_7">
             <circle stroke-dasharray="null" stroke-width="5" stroke="#000000" fill="#ffffff" id="svg_6" r="22.63281" cy="88.5" cx="45.5"/>
             <line stroke-dasharray="null" stroke-width="7" stroke="#000000" id="svg_2" y2="104.03768" x2="45.5" y1="72.96232" x1="45.5"/>
             <line stroke-dasharray="null" stroke-width="7" stroke="#000000" id="svg_3" y2="88.5" x2="61.03768" y1="88.5" x1="29.96232"/>
            </g>
           </g>
           </svg>
          </g>
          
          <g id="close_path">
          <svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <g>
            <path stroke="#000" stroke-width="15" fill="#ffc8c8" d="m121.5,40l-84,106l27,115l166,2l29,-111"/>
            <line x1="240" y1="136" x2="169.5" y2="74" stroke="#A00" stroke-width="25" fill="none"/>
            <path stroke="none" fill ="#A00" d="m158,65l31,74l-3,-50l51,-3z"/>
            <g stroke-width="15" stroke="#00f" fill="#0ff">
            <circle r="30" cy="41" cx="123"/>
            <circle r="30" cy="146" cx="40"/>
            <circle r="30" cy="260" cx="69"/>
            <circle r="30" cy="260" cx="228"/>
            <circle r="30" cy="148" cx="260"/>
            </g>
           </g>
          </svg>
          </g>
          
          <g id="open_path">
          <svg viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <g>
            <path stroke="#000" stroke-width="15" fill="#ffc8c8" d="m123.5,38l-84,106l27,115l166,2l29,-111"/>
            <line x1="276.5" y1="153" x2="108.5" y2="24" stroke="#000" stroke-width="10" fill="none"/>
            <g stroke-width="15" stroke="#00f" fill="#0ff">
             <circle r="30" cy="41" cx="123"/>
             <circle r="30" cy="146" cx="40"/>
             <circle r="30" cy="260" cx="69"/>
             <circle r="30" cy="260" cx="228"/>
             <circle r="30" cy="148" cx="260"/>
            </g>
            <g  stroke="#A00" stroke-width="15" fill="none">
             <line x1="168" y1="24" x2="210" y2="150"/>
             <line x1="210" y1="24" x2="168" y2="150"/>
            </g>
           </g>
          </svg>
          </g>
          
          
          <g id="image">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
           <defs>
            <linearGradient y2="1" x2="1" y1="0" x1="1" id="svg_25">
             <stop stop-opacity="1" stop-color="#10284c" offset="0"/>
             <stop stop-opacity="1" stop-color="#5374ad" offset="1"/>
            </linearGradient>
            <linearGradient y2="0.75781" x2="0.99609" y1="0" x1="1" id="svg_23">
             <stop stop-opacity="1" stop-color="#162e84" offset="0"/>
             <stop stop-opacity="1" stop-color="#97c4ef" offset="1"/>
            </linearGradient>
           </defs>
            <rect x="1" y="3.83333" width="22" height="17" id="svg_18" fill="#202020" stroke="none"/>
            <rect stroke-width="1.2" stroke="#ffffff" fill="#232947" id="svg_15" height="14" width="19" y="5.33333" x="2.5"/>
            <rect fill="url(#svg_23)" id="svg_20" height="7.02244" width="15.96424" y="6.7266" x="4"/>
            <rect fill="url(#svg_25)" id="svg_24" height="4.02393" width="15.96303" y="13.77454" x="4"/>
            <circle fill="#ffffad" id="svg_26" r="1.83333" cy="9.82002" cx="7.13254"/>
            <path d="m14.5696,13.77458l0.70243,-4.85313l-3.12899,4.85313l2.42656,0z" id="svg_14" fill="#404040" stroke="none"/>
            <path d="m15.27203,8.98531c2.74584,0.06386 2.42657,4.21456 -0.63857,4.85313c0.70243,-1.27714 1.66028,-3.63985 0.63857,-4.85313z" id="svg_17" fill="#404040" stroke="none"/>
          </svg>
          </g>
          
          <g id="zoom">
          	<svg viewBox="0 0 150 150" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	 <defs>
          	  <linearGradient id="svg_30" x1="0" y1="0" x2="1" y2="0">
          	   <stop offset="0" stop-color="#d3d3d3" stop-opacity="1"/>
          	   <stop offset="1" stop-color="#424242" stop-opacity="1"/>
          	  </linearGradient>
          	 </defs>
          	  <path d="m107.14774,101.03477l-0.64774,43.96523c5.00857,4.72089 14.00811,5.27188 19,0l-0.31667,-44.16l-9.61514,-19.84l-8.42046,20.03477z" id="svg_29" fill="url(#svg_30)" stroke="#202020" stroke-width="2" transform="rotate(-45, 116, 114)"/>
          	  <circle cx="58" cy="58" r="51" id="svg_22" fill="#c0c0c0" stroke="#202020" stroke-width="5"/>
          	  <circle cx="58" cy="58" r="43" id="svg_27" fill="#aaccff" stroke="none"/>
          	  <path d="m15.68604,61.46511c38.13954,17.67442 48.13954,15.34883 85.11628,-0.46511c1.39536,18.60465 -19.30231,41.86047 -42.7907,40.93023c-21.6279,-0.93023 -42.7907,-21.86046 -42.32558,-40.46511z" id="svg_28" fill="#8cbaff" stroke="none"/>
          	</svg>
          </g>
          
          <g id="arrow_right">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 50">
          	  <path stroke="#000000" fill="#000000" d="m0,0l0,50l25,-25l-25,-25z"/>
          	</svg>
          </g>
          
          <g id="arrow_right_big">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 50">
          	  <path stroke="#000000" fill="#000000" d="m0,0l0,50l25,-25l-25,-25z"/>
          	</svg>
          </g>
          
          <g id="arrow_down">
          	<svg viewBox="0 0 50 40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	  <path transform="rotate(90, 26, 13)" d="m14,-12l0,50l25,-25l-25,-25z" fill="#000000" stroke="#000000"/>
          	</svg>
          </g>
          
          <g id="fill">
          <svg width="32" height="33" xmlns="http://www.w3.org/2000/svg">
            <g id="svg_5">
             <path id="svg_4" d="m17.49167,10.97621c6.9875,-0.325 12.1875,2.70833 12.13333,7.36667l-0.325,10.075c-0.75833,4.0625 -2.275,3.0875 -3.03333,0.10833l0.21667,-9.64166c-0.43333,-0.975 -1.08333,-1.625 -1.95,-1.51667" stroke-linejoin="round" stroke="#606060" fill="#c0c0c0"/>
             <path id="svg_1" d="m2.00055,17.1309l10.72445,-10.72445l12.67445,12.13279l-3.52056,0.05389l-9.15389,9.26223l-10.72445,-10.72445z" stroke-linejoin="round" stroke="#000000" fill="#c0c0c0"/>
             <path id="svg_3" d="m14.35,13.57621c-0.1625,-3.95417 0.86667,-11.7 -1.84167,-11.59167c-2.70833,0.10833 -2.6,2.05833 -2.16667,6.93333" stroke-linejoin="round" stroke="#000000" fill="none"/>
             <circle id="svg_2" r="1.60938" cy="15.20121" cx="14.45833" stroke-linejoin="round" stroke="#000000" fill="none"/>
            </g>
          </svg>
          </g>
          
          <g id="stroke">
          <svg width="50" height="50" xmlns="http://www.w3.org/2000/svg">
            <rect fill="none" stroke="#707070" stroke-width="10" x="8.625" y="8.625" width="32.75" height="32.75" id="svg_1"/>
          </svg>
          </g>
          
          <g id="opacity">
          <svg width="50" height="50" xmlns="http://www.w3.org/2000/svg">
           <defs>
            <linearGradient y2="0.1" x2="0.9" y1="0.9" x1="0.1" id="svg_7">
             <stop stop-color="#000000" offset="0"/>
             <stop stop-opacity="0" stop-color="#000000" offset="1"/>
            </linearGradient>
           </defs>
            <rect id="svg_4" height="50" width="50" y="0" x="0" fill="#ffffff"/>
            <rect id="svg_1" height="25" width="25" y="0" x="0" fill="#a0a0a0"/>
            <rect id="svg_2" height="25" width="25" y="25" x="25" fill="#a0a0a0"/>
            <rect id="svg_3" height="50" width="50" y="0" x="0" stroke-width="2" stroke="url(#svg_7)" fill="url(#svg_7)"/>
           </svg>
          </g>
          
          <g id="new_image">
          <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
            <rect x="2.42792" y="1.6692" width="18" height="21" id="svg_55" fill="#eaeaea" stroke="#606060"/>
            <circle stroke="none" fill="url(#svg_9)" id="svg_65" r="6.300781" cy="7.529969" cx="17.761984"/>
           <defs>
            <radialGradient id="svg_9" cx="0.5" cy="0.5" r="0.5">
             <stop offset="0.1" stop-color="#ffe500" stop-opacity="1"/>
             <stop offset="1" stop-color="#ffff00" stop-opacity="0"/>
            </radialGradient>
           </defs>
          </svg>
          </g>
          
          <g id="save">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
          	 <defs>
          	  <linearGradient y2="0" x2="1" y1="0" x1="0" id="svg_41">
          	   <stop stop-opacity="1" stop-color="#727272" offset="0"/>
          	   <stop stop-opacity="1" stop-color="#d6d6d6" offset="1"/>
          	  </linearGradient>
          	  <linearGradient y2="0.875" x2="0.21484" y1="0.00391" x1="0.04297" id="svg_46">
          	   <stop stop-opacity="1" stop-color="#81bbf4" offset="0"/>
          	   <stop stop-opacity="1" stop-color="#376eb7" offset="1"/>
          	  </linearGradient>
          	 </defs>
          	   <path stroke="#202020" fill="#e0e0e0" id="svg_21" d="m1.51669,22.3458l21.13245,-0.10111l0,-6.06673l-2.62892,-9.80789l-16.27907,0.10111l-2.32558,9.20121l0.10111,6.67341z"/>
          	   <rect stroke="#efefef" fill="url(#svg_41)" id="svg_32" height="4.75108" width="19.21031" y="16.58227" x="2.42667"/>
          	   <path stroke="#ffffff" fill="#c0c0c0" id="svg_42" d="m4.55005,11.12235l0.70779,-2.83114l13.04348,0l0.70779,3.13448c-0.70779,2.52781 -4.04479,3.84227 -7.17897,3.84227c-2.72977,0 -6.37007,-1.41557 -7.28008,-4.1456z"/>
          	  <path stroke="#285582" fill="url(#svg_46)" id="svg_45" d="m7.14286,9.74903l5.21236,5.79151l5.50193,-5.88803l-2.50965,-0.09653l0,-2.79923c0,-2.3166 -2.3166,-5.59846 -6.56371,-5.59846c-4.05405,0 -6.27413,3.37838 -6.56371,6.75676c0.48263,-1.5444 2.7027,-4.53668 4.44015,-4.44015c2.12355,-0.09653 2.79923,1.64093 2.79923,3.37838l0.09653,2.79923l-2.41313,0.09653z"/>
          	</svg>
          </g>
          
          <g id="export">
          	<svg width="24" height="24" xmlns="http://www.w3.org/2000/svg">
          	 <defs>
          	  <linearGradient id="svg_5" x1="0.77734" y1="0.51172" x2="0.09375" y2="0.53516">
          	   <stop offset="0" stop-color="#81bbf4"/>
          	   <stop offset="1" stop-color="#376eb7"/>
          	  </linearGradient>
          	 </defs>
          	 <g>
          	  <rect x="7.22599" y="1.3603" width="15.76465" height="21.51735" id="svg_55" fill="#eaeaea" stroke="#606060"/>
          	  <circle fill="#31abed" stroke-width="0.5" cx="17.4206" cy="11.1278" r="4.69727" id="svg_3"/>
          	  <path fill="#ffcc00" stroke-width="0.5" d="m9.67673,20.24302l7.38701,-6.80778l2.91746,6.71323" id="svg_4"/>
          	  <rect fill="#ff5555" stroke-width="0.5" x="9.5385" y="2.94914" width="5.74652" height="5.74652" id="svg_2"/>
          	  <path d="m6.13727,17.94236l5.77328,-4.91041l-5.86949,-5.1832l-0.09622,2.36426l-4.64805,-0.06751l-0.04665,5.54694l4.79093,-0.02342l0.09623,2.27334z" id="svg_45" fill="url(#svg_5)" stroke="#285582"/>
          	 </g>
          	</svg>
          </g>
          
          <g id="open">
          <svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient y2="0.91406" x2="0.65234" y1="0.14063" x1="0.42578" id="svg_76">
             <stop stop-opacity="1" stop-color="#81bbf4" offset="0"/>
             <stop stop-opacity="1" stop-color="#376eb7" offset="1"/>
            </linearGradient>
           </defs>
            <rect x="1.65" y="3.75" width="9.8" height="16.72712" id="svg_98" fill="#c0c0c0" stroke="#606060"/>
            <rect stroke="none" fill="#a0a0a0" id="svg_88" height="14.17459" width="6.39585" y="4.9758" x="2.89542"/>
            <path d="m18.62576,4.54365l0,6.91443l-9.9395,0l-0.08643,-10.11236l6.828,0l3.19792,3.19793z" id="svg_99" fill="#e0e0e0" stroke="#404040"/>
            <path d="m2.95,20.53644l1.65,-12.03644l16.2,0l-1.5,12l-16.35,0.03643z" id="svg_97" fill="url(#svg_76)" stroke="#285582"/>
            <line fill="none" stroke="#606060" id="svg_89" y2="4.28436" x2="13.95851" y1="4.28436" x1="10.32844"/>
            <line fill="none" stroke="#606060" id="svg_91" y2="6.53155" x2="14.82282" y1="6.53155" x1="10.32844"/>
            <path stroke="none" fill="#ffffff" id="svg_100" d="m15.25895,1.95069l-0.00401,2.85225l2.89558,0.00004l-2.89157,-2.85229z"/>
          </svg>
          </g>
          
          <g id="import">
          <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient y2="0.875" x2="0.21484" y1="0.00391" x1="0.04297" id="svg_46_import">
             <stop stop-opacity="1" stop-color="#81f4bb" offset="0"/>
             <stop stop-opacity="1" stop-color="#37b76e" offset="1"/>
            </linearGradient>
           </defs>
           <rect x="2.42792" y="1.6692" width="18" height="21" id="svg_55" fill="#eaeaea" stroke="#606060"/>
          	  <path stroke="#285582" fill="url(#svg_46_import)" id="svg_45" d="m7.14286,12.74903l5.21236,5.79151l5.50193,-5.88803l-2.50965,-0.09653l0,-2.79923c0,-2.3166 -2.3166,-5.59846 -6.56371,-5.59846c-4.05405,0 -6.27413,3.37838 -6.56371,6.75676c0.48263,-1.5444 2.7027,-4.53668 4.44015,-4.44015c2.12355,-0.09653 2.79923,1.64093 2.79923,3.37838l0.09653,2.79923l-2.41313,0.09653z"/>
          </svg>
          </g>
          
          <g id="docprops">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
          	 <defs>
          	  <linearGradient y2="1" x2="1" y1="0.5" x1="1" id="svg_53">
          	   <stop stop-opacity="1" stop-color="#606060" offset="0"/>
          	   <stop stop-opacity="0" stop-color="#5e5e5e" offset="1"/>
          	  </linearGradient>
          	 </defs>
          	  <rect stroke="#606060" fill="#eaeaea" id="svg_55" height="21" width="18" y="1.6692" x="2.42792"/>
          	  <line fill="none" stroke="#a0a0a0" id="svg_56" y2="4.37757" x2="14.89023" y1="4.37757" x1="6.696"/>
          	  <line fill="none" stroke="#a0a0a0" id="svg_57" y2="7.10804" x2="12.92026" y1="7.10804" x1="6.6948"/>
          	  <line fill="none" stroke="#a0a0a0" id="svg_58" y2="9.84241" x2="15.64716" y1="9.84241" x1="6.6942"/>
          	  <line fill="none" stroke="#a0a0a0" id="svg_59" y2="12.36585" x2="13.21805" y1="12.36585" x1="6.69691"/>
          	  <line fill="none" stroke="#a0a0a0" id="svg_60" y2="15.06507" x2="14.43591" y1="15.06507" x1="6.69691"/>
          	  <line fill="none" stroke="#a0a0a0" id="svg_61" y2="17.84241" x2="13.36979" y1="17.84241" x1="6.69691"/>
          	  <g id="svg_54">
          	   <path transform="rotate(-45, 12.5448, 11.7085)" stroke="none" fill="#606060" id="svg_31" d="m11.24329,8.73944l0,2.79974l2.53499,0.07777l0,-2.95528c1.78134,0.07777 2.26093,1.39987 2.12391,2.95528c-0.06851,1.63318 -1.30175,3.49967 -3.49418,3.26636c-2.19242,-0.31108 -2.87755,-1.39987 -3.15161,-2.72197c-0.27406,-1.39987 0.41108,-3.34413 1.98689,-3.4219z"/>
          	   <rect opacity="0.95" transform="rotate(-45, 16.2485, 15.1732)" stroke="none" fill="url(#svg_53)" id="svg_50" height="4.85445" width="2.57974" y="12.746" x="15.04047"/>
          	  </g>
          	</svg>
          </g>
          
          <g id="source">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 55 52">
            <text xml:space="preserve" text-anchor="middle" font-family="monospace" font-size="24" stroke="none" fill="#019191" id="svg_40" y="15" x="28.23" font-weight="bold">s</text>
            <text xml:space="preserve" text-anchor="middle" font-family="monospace" font-size="24" stroke="none" fill="#019191" id="svg_47" y="30" x="28.23" font-weight="bold">v</text>
            <text xml:space="preserve" text-anchor="middle" font-family="monospace" font-size="24" stroke="none" fill="#019191" id="svg_48" y="44" x="28.23" font-weight="bold">g</text>
            <line stroke-width="3" fill="none" stroke="#aa0000" id="svg_51" y2="43" x2="16" y1="25" x1="5"/>
            <line id="svg_62" stroke-width="3" fill="none" stroke="#aa0000" y2="8" x2="16" y1="26" x1="5"/>
            <line id="svg_63" stroke-width="3" fill="none" stroke="#aa0000" y2="43" x2="39" y1="25" x1="50"/>
            <line id="svg_64" stroke-width="3" fill="none" stroke="#aa0000" y2="8" x2="39" y1="26" x1="51"/>
           </svg>
          </g>
           
          <g id="wireframe">
           <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
            <circle stroke="#000000" fill="none" id="svg_49" r="8" cy="9.5" cx="9.5"/>
            <rect stroke="#000000" fill="none" id="svg_52" height="14" width="14" y="8.5" x="8.5"/>
           </svg>
          </g>
          
          <g id="undo">
          <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient id="svg_66" x1="0.04297" y1="0.00391" x2="0.21484" y2="0.875">
             <stop offset="0" stop-color="#f7f963" stop-opacity="1"/>
             <stop offset="1" stop-color="#d3c310" stop-opacity="1"/>
            </linearGradient>
           </defs>
            <path transform="rotate(-90, 10.3017, 11.5526)" d="m6.70188,10.72562l6.55493,-7.13388l6.65817,7.24912l-3.79441,0.03193l0,2.72259c-0.04257,2.74017 -2.76516,5.83068 -7.81235,6.02135c-5.18575,0 -7.1226,-3.75464 -7.49302,-7.41944c0.61736,1.6754 3.14913,3.78397 5.3716,3.67918c2.71635,0.1048 4.41501,-0.61714 4.41501,-2.50184l0,-2.64901l-3.89995,0z" id="svg_45" fill="url(#svg_66)" stroke="#b7a800"/>
           </svg>
          </g>
          
          <g id="redo">
          <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient y2="1" x2="1" y1="0" x1="1" id="svg_71">
             <stop stop-opacity="1" stop-color="#98fc46" offset="0"/>
             <stop stop-opacity="1" stop-color="#56aa25" offset="1"/>
            </linearGradient>
           </defs>
            <path transform="rotate(-90, 12.7299, 11.5526)" d="m9.11294,12.43144l6.54089,6.84566l6.6439,-6.95624l-3.78628,-0.03064l0,-2.61259c-0.04248,-2.62946 -2.75924,-5.5951 -7.79561,-5.77807c-5.17464,0 -7.10734,3.60294 -7.47697,7.11967c0.61604,-1.60771 3.14238,-3.63109 5.36009,-3.53053c2.71053,-0.10056 4.40555,0.59221 4.40555,2.40076l0,2.54198l-3.89159,0z" id="svg_45" fill="url(#svg_71)" stroke="#44aa00"/>
           </svg>
          </g>
          
          <g id="clone">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18">
           <defs>
            <linearGradient y2="1" x2="1" y1="0" x1="0" id="svg_36">
             <stop stop-opacity="1" stop-color="#f9f3de" offset="0"/>
             <stop stop-opacity="1" stop-color="#ccbd8f" offset="1"/>
            </linearGradient>
            <linearGradient y2="0.80078" x2="0.42578" y1="0" x1="0" id="svg_69">
             <stop stop-opacity="1" stop-color="#f9f3de" offset="0"/>
             <stop stop-opacity="1" stop-color="#af995b" offset="1"/>
            </linearGradient>
           </defs>
            <path stroke="#8f5902" fill="url(#svg_69)" id="svg_34" d="m2.11676,16.32061l-0.13787,-5.05515l1.93015,-2.02206l10.11029,0l2.02206,2.29779l0,4.77941l-13.92463,0z"/>
            <rect x="7.85379" y="6.30027" width="2.2932" height="4.3407" id="svg_38" fill="url(#svg_36)" stroke="#8f5902" rx="1" ry="1"/>
            <circle stroke="#8f5902" fill="url(#svg_36)" id="svg_35" r="2.96392" cy="4.48149" cx="9.11757"/>
            <line x1="2.44838" y1="12.03512" x2="15.5524" y2="12.03512" id="svg_39" stroke="#f9f3de" fill="none"/>
            <path d="m6.72427,12.55859l4.74203,0l-2.30831,2.07258l-2.43372,-2.07258z" id="svg_43" fill="#000000" stroke="none"/>
          </svg>
          </g>
          
          <g id="delete">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
            <rect ry="3" rx="3" stroke="#800000" fill="#aa0000" id="svg_37" height="20.29514" width="21.17486" y="1.70304" x="1.42011"/>
            <rect ry="3" rx="3" stroke="#ff5555" fill="#aa0000" id="svg_67" height="18.63022" width="19.61118" y="2.53597" x="2.20258"/>
            <line stroke-width="2" fill="none" stroke="#ffffff" id="svg_68" y2="16.85127" x2="17.00646" y1="6.85127" x1="7.00646"/>
            <line stroke-width="2" id="svg_70" fill="none" stroke="#ffffff" y2="16.85127" x2="7.00646" y1="6.85127" x1="17.00646"/>
           </svg>
          </g>
          
          <g id="go_up">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18">
          	 <defs>
          	  <linearGradient y2="0" x2="0.7" y1="0" x1="0" id="svg_74">
          	   <stop stop-opacity="1" stop-color="#afe853" offset="0"/>
          	   <stop stop-opacity="1" stop-color="#52a310" offset="1"/>
          	  </linearGradient>
          	 </defs>
          	  <path stroke="#008000" fill="url(#svg_74)" id="svg_33" d="m5.38492,16.77043l7.07692,0l0,-5.23077l4.15385,0l-7.69231,-10.15385l-7.69231,10.15385l4.15385,0l0,5.23077z"/>
          	</svg>
          </g>
          
          <g id="go_down">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18">
           <defs>
            <linearGradient y2="0" x2="0.7" y1="0" x1="0" id="svg_75">
             <stop stop-opacity="1" stop-color="#afe853" offset="0"/>
             <stop stop-opacity="1" stop-color="#52a310" offset="1"/>
            </linearGradient>
           </defs>
            <path stroke="#008000" fill="url(#svg_75)" id="svg_33" d="m5.3015,1.69202l6.93483,0l0,5.07323l4.07045,0l-7.53786,9.84803l-7.53786,-9.84803l4.07045,0l0,-5.07323z"/>
           </svg>
          </g>
          
          <g id="context_menu">
          	<svg width="120" height="120" xmlns="http://www.w3.org/2000/svg">
          	  <path stroke-width="0" id="svg_11" d="m4.5,46.5l52,0l-26,38l-26,-38z" stroke="#000" fill="#000"/>
          	  <g id="svg_16">
          	   <line stroke-width="10" id="svg_12" y2="27.5" x2="117.5" y1="27.5" x1="59.5" stroke="#000" fill="#000"/>
          	   <line id="svg_13" stroke-width="10" y2="51.5" x2="117.5" y1="51.5" x1="59.5" stroke="#000" fill="#000"/>
          	   <line id="svg_14" stroke-width="10" y2="73.5" x2="117.5" y1="73.5" x1="59.5" stroke="#000" fill="#000"/>
          	   <line id="svg_15" stroke-width="10" y2="97.5" x2="117.5" y1="97.5" x1="59.5" stroke="#000" fill="#000"/>
          	  </g>
          	</svg>
          </g>
          
          <g id="move_bottom">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 23 23">
           <defs>
            <linearGradient y2="0" x2="1" y1="0" x1="0" id="svg_80">
             <stop stop-opacity="1" stop-color="#bc7f05" offset="0"/>
             <stop stop-opacity="1" stop-color="#fcfc9f" offset="1"/>
            </linearGradient>
           </defs>
            <line stroke-width="2" fill="none" stroke="#000000" id="svg_72" y2="2.5" x2="22" y1="2.5" x1="10.5"/>
            <line id="svg_73" stroke-width="2" fill="none" stroke="#000000" y2="6.5" x2="21.99844" y1="6.5" x1="10.49844"/>
            <line id="svg_74" stroke-width="2" fill="none" stroke="#000000" y2="10.5" x2="21.99922" y1="10.5" x1="10.49922"/>
            <line id="svg_75" stroke-width="2" fill="none" stroke="#000000" y2="14.5" x2="21.99922" y1="14.5" x1="10.49922"/>
            <rect stroke="#000000" fill="url(#svg_80)" id="svg_77" height="2.2" width="20" y="17.65" x="1.65"/>
            <path stroke="none" fill="#000000" id="svg_81" d="m4.25,1.55l2.35,0l0,11.05l2,0l-3.175,3.45l-3.175,-3.45l2,0l0,-11.05z"/>
           </svg>
          </g>
          
          <g id="move_top">
          <svg viewBox="0 0 23 23" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient id="svg_86" x1="0" y1="0" x2="1" y2="0">
             <stop offset="0" stop-color="#9fdcf4" stop-opacity="1"/>
             <stop offset="1" stop-color="#617e96" stop-opacity="1"/>
            </linearGradient>
           </defs>
            <line x1="1.3" y1="8.19922" x2="12.8" y2="8.19922" id="svg_72" stroke="#000000" fill="none" stroke-width="2"/>
            <line x1="1.29844" y1="12.19922" x2="12.79844" y2="12.19922" stroke="#000000" fill="none" stroke-width="2" id="svg_73"/>
            <line x1="1.29922" y1="16.19922" x2="12.79922" y2="16.19922" stroke="#000000" fill="none" stroke-width="2" id="svg_74"/>
            <line x1="1.29922" y1="20.19922" x2="12.79922" y2="20.19922" stroke="#000000" fill="none" stroke-width="2" id="svg_75"/>
            <rect x="1.55" y="1.85" width="20" height="3.2" id="svg_77" fill="url(#svg_86)" stroke="#000000"/>
            <path d="m16.83475,21.14603l2.33207,0l0,-11.04578l1.98474,0l-3.15077,-3.44869l-3.15077,3.44869l1.98474,0l0,11.04578z" id="svg_81" fill="#000000" stroke="none"/>
           </svg>
          </g>
          
          <g id="to_path">
          <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient y2="0.46875" x2="0.42969" y1="0.10156" x1="0.10547" id="svg_105">
             <stop stop-color="#ff0000" offset="0"/>
             <stop stop-opacity="0" stop-color="#ff0000" offset="1"/>
            </linearGradient>
           </defs>
           <g>
            <circle cx="21" cy="21.3125" r="18.44531" id="svg_120" fill="url(#svg_105)" stroke="#000000"/>
            <path fill="none" stroke="#000000" d="m2.875,21.3125c-0.375,-9.25 7.75,-18.875 17.75,-18" id="svg_115"/>
            <line x1="25.375" y1="3.0625" x2="8.5" y2="3.0625" id="svg_116" stroke="#808080" fill="none"/>
            <line x1="2.625" y1="24.75" x2="2.625" y2="9.8125" id="svg_117" stroke="#808080" fill="none"/>
            <circle cx="8.5" cy="2.9375" r="1.95313" fill="#00ffff" stroke="#0000ff" stroke-width="0.5" id="svg_118"/>
            <circle cx="2.625" cy="9.8125" r="1.95313" fill="#00ffff" stroke="#0000ff" stroke-width="0.5" id="svg_119"/>
            <circle cx="20.875" cy="3.1875" r="2.5" id="svg_112" fill="#00ffff" stroke="#0000ff"/>
            <circle cx="2.875" cy="21.0625" r="2.5" fill="#00ffff" stroke="#0000ff" id="svg_114"/>
           </g>
          </svg>
          </g>
          
          <g id="link_controls">
          <svg viewBox="0 0 24 24" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
            <path stroke-width="2" id="svg_102" d="m9.875,23c-2,-4.25 -1.6875,-7.375 1.6875,-10.5c3.375,-3.125 7.5625,-2.75 11.0625,2" stroke="#8dd35f" fill="none"/>
            <line fill="none" stroke="#606060" id="svg_109" y2="4" x2="19" y1="19" x1="4"/>
            <circle stroke="#0000ff" fill="#00ffff" id="svg_111" r="2.17578" cy="11.5" cx="11.5"/>
            <circle stroke-width="0.5" id="svg_121" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="4" cx="19"/>
            <circle id="svg_123" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="19" cx="4"/>
          </svg>
          </g>
          
          <g id="reorient">
          <svg viewBox="0 0 24 24" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
           <defs>
            <linearGradient y2="1" x2="1" y1="1" x1="0" id="svg_113">
             <stop stop-opacity="0" stop-color="#0000ff" offset="0"/>
             <stop stop-opacity="1" stop-color="#507ece" offset="1"/>
            </linearGradient>
           </defs>
            <rect stroke-dasharray="2,2" stroke="#0000ff" fill="none" id="svg_108" height="19.125" width="18.625" y="2.625" x="2.875"/>
            <rect transform="rotate(45, 12.2344, 12.1719)" stroke="#000000" fill="url(#svg_113)" id="svg_107" height="6.125" width="16" y="9.10848" x="4.23267"/>
          </svg>
          </g>
          
          <g id="group_elements">
          <svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient id="svg_90" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#ccddff" stop-opacity="1"/>
             <stop offset="1" stop-color="#789fed" stop-opacity="1"/>
            </linearGradient>
            <linearGradient id="svg_92" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#70a1e5" stop-opacity="1"/>
             <stop offset="1" stop-color="#4b6baf" stop-opacity="1"/>
            </linearGradient>
           </defs>
            <rect x="13.5" y="0.5" width="2" height="2" fill="#a0a0a0" stroke="#555555" id="svg_79"/>
            <rect x="13.5" y="13.5" width="2" height="2" fill="#a0a0a0" stroke="#555555" id="svg_82"/>
            <rect x="0.5" y="13.5" width="2" height="2" fill="#a0a0a0" stroke="#555555" id="svg_83"/>
            <rect x="2.5" y="2.5" width="8" height="7" fill="#a0a0a0" stroke="#555555" id="svg_85"/>
            <rect x="2.5" y="2.5" width="8" height="7" fill="url(#svg_90)" stroke="url(#svg_92)" id="svg_87"/>
            <rect x="5.5" y="6.5" width="8" height="7" id="svg_84" fill="#7399d6" stroke="url(#svg_92)"/>
            <rect x="0.5" y="0.5" width="2" height="2" id="svg_78" fill="#a0a0a0" stroke="#555555"/>
           </svg>
          </g>
          
          <g id="ungroup">
          <svg viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
           <defs>
            <linearGradient id="svg_90" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#ccddff" stop-opacity="1"/>
             <stop offset="1" stop-color="#789fed" stop-opacity="1"/>
            </linearGradient>
            <linearGradient id="svg_92" x1="0" y1="0" x2="1" y2="1">
             <stop offset="0" stop-color="#70a1e5" stop-opacity="1"/>
             <stop offset="1" stop-color="#4b6baf" stop-opacity="1"/>
            </linearGradient>
           </defs>
            <rect x="2.5" y="2.5" width="8" height="7" fill="url(#svg_90)" stroke="url(#svg_92)" id="svg_87"/>
            <rect x="5.5" y="6.5" width="8" height="7" id="svg_84" fill="#7399d6" stroke="url(#svg_92)"/>
            <rect x="9.5" y="1.5" width="2" height="2" fill="#a0a0a0" stroke="#555555" id="svg_79"/>
            <rect x="1.5" y="8.5" width="2" height="2" fill="#a0a0a0" stroke="#555555" id="svg_83"/>
            <rect x="1.5" y="1.5" width="2" height="2" id="svg_78" fill="#a0a0a0" stroke="#555555"/>
            <rect id="svg_93" x="12.5" y="5.5" width="2" height="2" fill="#a0a0a0" stroke="#555555"/>
            <rect id="svg_94" x="12.5" y="12.5" width="2" height="2" fill="#a0a0a0" stroke="#555555"/>
            <rect id="svg_95" x="4.5" y="12.5" width="2" height="2" fill="#a0a0a0" stroke="#555555"/>
            <rect id="svg_96" x="4.5" y="5.5" width="2" height="2" fill="#a0a0a0" stroke="#555555"/>
          </svg>
          </g>
          
          <g id="unlink_use">
          <svg width="222" height="222" xmlns="http://www.w3.org/2000/svg">
            <path id="svg_1" d="m93.75,118.44922c-4.5,13.58447 -14.66553,11.5 -28.25,11.5l-34,0c-13.58447,0 -24.5,-7.16553 -24.5,-21.5c0,-14.33447 10.91553,-20.5 24.5,-20.5l34,0c13.58447,0 19.75,-2.33447 26.5,10.75" stroke-width="13" stroke="#3f3f3f" fill="none"/>
            <g id="svg_11">
             <line id="svg_4" y2="65.94563" x2="83.07683" y1="28.27895" x1="45.41017" stroke-linecap="round" stroke-width="8" stroke="#007fff" fill="none"/>
             <line id="svg_5" y2="15.01293" x2="109.41467" y1="65.94638" x1="109.41467" stroke-linecap="round" stroke-width="8" stroke="#007fff" fill="none"/>
             <line id="svg_6" y2="29.31928" x2="177.58937" y1="65.94638" x1="140.96227" stroke-linecap="round" stroke-width="8" stroke="#007fff" fill="none"/>
            </g>
            <g id="svg_12" transform="rotate(-180, 108, 172.111)">
             <line y2="190.94563" x2="79.57683" y1="153.27895" x1="41.91017" stroke-linecap="round" stroke-width="8" stroke="#007fff" fill="none" id="svg_13"/>
             <line y2="140.01293" x2="105.91467" y1="190.94638" x1="105.91467" stroke-linecap="round" stroke-width="8" stroke="#007fff" fill="none" id="svg_14"/>
             <line y2="154.31928" x2="174.08937" y1="190.94638" x1="137.46227" stroke-linecap="round" stroke-width="8" stroke="#007fff" fill="none" id="svg_15"/>
            </g>
            <path transform="rotate(-180, 172.125, 108.926)" id="svg_2" d="m215.5,118.44901c-4.5,13.58499 -14.6655,11.5 -28.25,11.5l-34,0c-13.5845,0 -24.5,-7.16501 -24.5,-21.5c0,-14.3343 10.9155,-20.4998 24.5,-20.4998l34,0c13.5845,0 19.75,-2.3345 26.5,10.75" stroke-width="13" stroke="#3f3f3f" fill="none"/>
          </svg>
          </g>
          
          <g id="width">
          	<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
          	  <path id="svg_6" d="m19,42.5l-7.5,7.5l7.5,7.5l0,-15zm0,7.5l62,0l0,-7.5l7.5,7.5l-7.5,7.5l0,-7.5" stroke-width="8" stroke="#000000" fill="#000000"/>
          	</svg>
          </g>
          
          <g id="height">
          	<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
          	  <path transform="rotate(90, 50, 50)" fill="#000000" stroke="#000000" stroke-width="8" d="m19,42.5l-7.5,7.5l7.5,7.5l0,-15zm0,7.5l62,0l0,-7.5l7.5,7.5l-7.5,7.5l0,-7.5" id="svg_6"/>
          	</svg>
          </g>
          
          <g id="c_radius">
          <svg width="20" height="20" xmlns="http://www.w3.org/2000/svg">
            <rect stroke="#404040" fill="none" stroke-width="0.5" x="2.37501" y="2.4375" width="43.9375" height="43.9375" id="svg_1" rx="13" ry="13"/>
            <path fill="none" stroke="#000000" d="m2.43674,15.88952l13.73722,0l0.08978,-13.46483m0.08978,14.08493" id="svg_3"/>
            <line fill="none" stroke="#000000" x1="16.35107" y1="15.88934" x2="5.20504" y2="5.20504" id="svg_4" stroke-dasharray="2,2"/>
          </svg>
          </g>
          
          <g id="angle">
          <svg width="50" height="50" xmlns="http://www.w3.org/2000/svg">
            <path stroke-width="2" stroke-dasharray="1,3" id="svg_6" d="m32.78778,41.03469c-0.40379,-8.68145 -4.50873,-16.79003 -12.11365,-20.5932" stroke="#000000" fill="none"/>
            <path id="svg_7" d="m29.20348,7.67055l-24.20348,34.47921l41.16472,0" stroke-width="3" stroke="#404040" fill="none"/>
          </svg>
          </g>
          
          <g id="blur">
          <svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <filter id="svg_4_blur" x="-50%" y="-50%" width="200%" height="200%">
             <feGaussianBlur stdDeviation="25"/>
            </filter>
           </defs>
            <circle fill="#000000" stroke="#000000" stroke-width="5" stroke-dasharray="null" cx="150" cy="150" r="91.80151" id="svg_4" filter="url(#svg_4_blur)"/>
          </svg>
          </g>
          
          <g id="fontsize">
          <svg width="50" height="50" xmlns="http://www.w3.org/2000/svg">
            <text fill="#606060" stroke="none" x="14.451" y="41.4587" id="svg_2" font-size="26" font-family="serif" text-anchor="middle">T</text>
            <text fill="#000000" stroke="none" x="28.853" y="41.8685" font-size="52" font-family="serif" text-anchor="middle" xml:space="preserve" id="svg_3">T</text>
          </svg>
          </g>
          
          <g id="align">
          	<svg width="22" height="22" xmlns="http://www.w3.org/2000/svg">
          	  <rect stroke="#606060" fill="#c0c0c0" id="svg_4" height="7" width="12" y="7.5" x="4.5"/>
          	  <rect stroke="#c15909" fill="#ef9a23" id="svg_2" height="40" width="2" y="-10" x="9.5"/>
          	  <rect stroke="#ffffff" fill="none" id="svg_5" height="5" width="10" y="8.5" x="5.5"/>
          	</svg>
          </g>
          
          <g id="align_left">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
          	  <rect stroke="#606060" fill="#ffffff" id="svg_4" height="7" width="12" y="2.5" x="2.5"/>
          	  <rect stroke="none" fill="#c0c0c0" id="svg_5" height="4" width="11" y="4" x="2"/>
          	  <rect id="svg_6" stroke="#606060" fill="#ffffff" height="7" width="18" y="12.5" x="2.5"/>
          	  <rect id="svg_7" stroke="none" fill="#c0c0c0" height="4" width="17" y="14" x="2"/>
          	  <rect stroke="#c15909" fill="#ef9a23" id="svg_2" height="40" width="2" y="-10" x="1.5"/>
          	</svg>
          </g>
          
          <g id="align_center">
          	<svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	  <rect x="1.5" y="12.5" width="18" height="7" fill="#c0c0c0" stroke="#606060" id="svg_6"/>
          	  <rect x="4.5" y="2.5" width="12" height="7" id="svg_4" fill="#c0c0c0" stroke="#606060"/>
          	  <rect x="9.5" y="-10" width="2" height="40" id="svg_2" fill="#ef9a23" stroke="#c15909"/>
          	  <rect x="2.5" y="13.5" width="16" height="5" fill="none" stroke="#ffffff" id="svg_7"/>
          	  <rect x="5.5" y="3.5" width="10" height="5" id="svg_5" fill="none" stroke="#ffffff"/>
          	</svg>
          </g>
          
          <g id="align_right">
          	<svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	  <rect x="7.5" y="2.5" width="12" height="7" id="svg_4" fill="#ffffff" stroke="#606060"/>
          	  <rect x="9" y="4" width="11" height="4" id="svg_5" fill="#c0c0c0" stroke="none"/>
          	  <rect x="1.5" y="12.5" width="18" height="7" fill="#ffffff" stroke="#606060" id="svg_6"/>
          	  <rect x="3" y="14" width="17" height="4" fill="#c0c0c0" stroke="none" id="svg_7"/>
          	  <rect x="18.5" y="-10" width="2" height="40" id="svg_2" fill="#ef9a23" stroke="#c15909"/>
          	</svg>
          </g>
          
          <g id="align_top">
          	<svg viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          	  <g transform="rotate(90, 11, 11)" id="svg_1">
          	   <rect x="2.5" y="3.5" width="12" height="7" id="svg_4" fill="#ffffff" stroke="#606060"/>
          	   <rect x="2" y="5" width="11" height="4" id="svg_5" fill="#c0c0c0" stroke="none"/>
          	   <rect x="2.5" y="13.5" width="18" height="7" fill="#ffffff" stroke="#606060" id="svg_6"/>
          	   <rect x="2" y="15" width="17" height="4" fill="#c0c0c0" stroke="none" id="svg_7"/>
          	   <rect x="1.5" y="-9" width="2" height="40" id="svg_2" fill="#ef9a23" stroke="#c15909"/>
          	  </g>
          	</svg>
          </g>
          
          <g id="align_middle">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
            <g transform="rotate(90, 12, 11.5)" id="svg_1">
             <rect id="svg_6" stroke="#606060" fill="#c0c0c0" height="7" width="18" y="14" x="3"/>
             <rect stroke="#606060" fill="#c0c0c0" id="svg_4" height="7" width="12" y="4" x="6"/>
             <rect stroke="#c15909" fill="#ef9a23" id="svg_2" height="40" width="2" y="-8.5" x="11"/>
             <rect id="svg_7" stroke="#ffffff" fill="none" height="5" width="16" y="15" x="4"/>
             <rect stroke="#ffffff" fill="none" id="svg_5" height="5" width="10" y="5" x="7"/>
             </g>
          </svg>
          </g>
          
          <g id="align_bottom">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
            <g transform="rotate(90, 11, 11)" id="svg_1">
             <rect stroke="#606060" fill="#ffffff" id="svg_4" height="7" width="12" y="2.5" x="7.5"/>
             <rect stroke="none" fill="#c0c0c0" id="svg_5" height="4" width="11" y="4" x="9"/>
             <rect id="svg_6" stroke="#606060" fill="#ffffff" height="7" width="18" y="12.5" x="1.5"/>
             <rect id="svg_7" stroke="none" fill="#c0c0c0" height="4" width="17" y="14" x="3"/>
             <rect stroke="#c15909" fill="#ef9a23" id="svg_2" height="40" width="2" y="-10" x="18.5"/>
             </g>
          </svg>
          </g>
          
          <g id="linecap_butt">
          <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:se="http://svg-edit.googlecode.com" xmlns:xlink="http://www.w3.org/1999/xlink">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <linearGradient id="svg_8" x1="0.8" y1="1" x2="0.2" y2="1">
             <stop offset="0" stop-color="#000000" stop-opacity="1"/>
             <stop offset="1" stop-color="#000000" stop-opacity="0"/>
            </linearGradient>
           </defs>
           <g>
            <rect fill="url(#svg_8)" stroke="#a0a0a0" stroke-width="2" x="-15.20196" y="43.5974" width="94.8373" height="50.3728" id="svg_3" transform="rotate(-45, 32.2148, 68.7832)"/>
            <path id="svg_1" d="m6.63133,95.07755l59.17514,-59.17514" stroke-width="3" stroke="#00ffff" fill="none"/>
            <path id="svg_2" d="m51.62893,36.10742l13.05662,-13.05662l13.05661,13.05662l-13.05661,13.05662l-13.05662,-13.05662z" stroke="none" fill="#00ffff"/>
           </g>
          </svg>
          </g>
          
          <g id="linecap_square">
          <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:se="http://svg-edit.googlecode.com" xmlns:xlink="http://www.w3.org/1999/xlink">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <linearGradient id="svg_8" x1="0.8" y1="1" x2="0.2" y2="1">
             <stop offset="0" stop-color="#000000" stop-opacity="1"/>
             <stop offset="1" stop-color="#000000" stop-opacity="0"/>
            </linearGradient>
           </defs>
           <g>
            <rect fill="url(#svg_8)" stroke="none" x="-18.51568" y="35.5974" width="117.46469" height="50.3728" id="svg_3" transform="rotate(-45, 40.2168, 60.7832)"/>
            <path id="svg_1" d="m6.63133,95.07755l59.17514,-59.17514" stroke-width="3" stroke="#00ffff" fill="none"/>
            <path id="svg_2" d="m51.62893,36.10742l13.05662,-13.05662l13.05661,13.05662l-13.05661,13.05662l-13.05662,-13.05662z" stroke="none" fill="#00ffff"/>
           </g>
          </svg>
          </g>
          
          <g id="linecap_round">
          <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se="http://svg-edit.googlecode.com">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <linearGradient y2="1" x2="0.2" y1="1" x1="0.8" id="svg_8">
             <stop stop-opacity="1" stop-color="#000000" offset="0"/>
             <stop stop-opacity="0" stop-color="#000000" offset="1"/>
            </linearGradient>
           </defs>
           <g>
            <path transform="rotate(-45, 41.5117, 59.4648)" id="svg_3" d="m-19.0679,34.2946l94.8359,0c36.499,-1.4142 33.67101,48.9569 0,50.3711l-94.8359,0l0,-50.3711z" stroke-width="2" stroke="#a0a0a0" fill="url(#svg_8)"/>
            <path id="svg_1" d="m6.63133,95.07755l59.17515,-59.17515" stroke-width="3" stroke="#00ffff" fill="none"/>
            <path id="svg_2" d="m51.62893,36.10742l13.05662,-13.05662l13.05661,13.05662l-13.05661,13.05662l-13.05662,-13.05662z" stroke="none" fill="#00ffff"/>
           </g>
          </svg>
          </g>
          
          <g id="linejoin_miter">
          <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se="http://svg-edit.googlecode.com">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <linearGradient y2="1" x2="0.2" y1="1" x1="0.8" id="svg_8">
             <stop stop-opacity="1" stop-color="#000000" offset="0"/>
             <stop stop-opacity="0" stop-color="#000000" offset="1"/>
            </linearGradient>
           </defs>
           <g>
            <path fill="none" stroke="url(#svg_8)" stroke-width="49" d="m-15,-35l75,85l-75,75" id="svg_6"/>
            <path transform="rotate(90, 57.8925, 50.2519)" fill="#00ffff" stroke="none" d="m44.83592,50.25187l13.05661,-13.05663l13.05661,13.05663l-13.05661,13.05662l-13.05661,-13.05662z" id="svg_2"/>
            <path id="svg_4" d="m-15,-35l75,85l-75,75" stroke-width="3" stroke="#00ffff" fill="none"/>
           </g>
          </svg>
          </g>
          
          <g id="linejoin_bevel">
          <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se="http://svg-edit.googlecode.com">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <linearGradient y2="1" x2="0.2" y1="1" x1="0.8" id="svg_8">
             <stop stop-opacity="1" stop-color="#000000" offset="0"/>
             <stop stop-opacity="0" stop-color="#000000" offset="1"/>
            </linearGradient>
           </defs>
           <g>
            <path stroke-linejoin="bevel" fill="none" stroke="url(#svg_8)" stroke-width="49" d="m-15,-35l75,85l-75,75" id="svg_6"/>
            <path transform="rotate(90, 57.8925, 50.2519)" fill="#00ffff" stroke="none" d="m44.83592,50.25187l13.05661,-13.05663l13.05661,13.05663l-13.05661,13.05662l-13.05661,-13.05662z" id="svg_2"/>
            <path id="svg_4" d="m-15,-35l75,85l-75,75" stroke-width="3" stroke="#00ffff" fill="none"/>
           </g>
          </svg>
          </g>
          
          <g id="linejoin_round">
          <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:se="http://svg-edit.googlecode.com">
           <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
           <defs>
            <linearGradient y2="1" x2="0.2" y1="1" x1="0.8" id="svg_8">
             <stop stop-opacity="1" stop-color="#000000" offset="0"/>
             <stop stop-opacity="0" stop-color="#000000" offset="1"/>
            </linearGradient>
           </defs>
           <g>
            <path stroke-linejoin="round" fill="none" stroke="url(#svg_8)" stroke-width="49" d="m-15,-35l75,85l-75,75" id="svg_6"/>
            <path transform="rotate(90, 57.8925, 50.2519)" fill="#00ffff" stroke="none" d="m44.83592,50.25187l13.05661,-13.05663l13.05661,13.05663l-13.05661,13.05662l-13.05661,-13.05662z" id="svg_2"/>
            <path id="svg_4" d="m-15,-35l75,85l-75,75" stroke-width="3" stroke="#00ffff" fill="none"/>
           </g>
          </svg>
          </g>
          
          <g id="eye">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 17 17">
           <defs>
            <linearGradient y2="0.79688" x2="0.5625" y1="0.19141" x1="0.42969" id="svg_91">
             <stop stop-opacity="1" stop-color="#d3a16b" offset="0"/>
             <stop stop-opacity="1" stop-color="#a37c53" offset="1"/>
            </linearGradient>
           </defs>
            <path stroke="none" fill="url(#svg_91)" id="svg_9" d="m0.12852,8.18338c3.59931,-7.71208 13.19749,-7.36932 16.75236,0.08569c-3.02165,7.5407 -13.59741,7.66924 -16.75236,-0.08569z"/>
            <path id="svg_76" stroke="none" fill="#ffffff" d="m0.33033,8.2557c3.5173,-4.97159 12.89675,-4.75063 16.37062,0.05524c-2.95279,4.86111 -13.28756,4.94397 -16.37062,-0.05524z"/>
            <circle stroke="none" fill="#4f92c1" id="svg_88" r="3.08008" cy="7.71116" cx="8.45861"/>
            <circle stroke="none" fill="#000000" id="svg_89" r="1.27539" cy="7.6539" cx="8.43159"/>
           </svg>
          </g>
          
          <g id="no_color">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
          	  <line fill="none" stroke="#d40000" id="svg_90" y2="24" x2="24" y1="0" x1="0"/>
          	  <line id="svg_92" fill="none" stroke="#d40000" y2="24" x2="0" y1="0" x1="24"/>
          	</svg>
          </g>
          
          <g id="ok">
          	<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
          	 <defs>
          	  <linearGradient y2="0.65625" x2="0.94141" y1="0.43359" x1="0.42969" id="svg_106">
          	   <stop stop-opacity="1" stop-color="#38ff45" offset="0"/>
          	   <stop stop-opacity="1" stop-color="#127c0c" offset="1"/>
          	  </linearGradient>
          	 </defs>
          	  <path transform="rotate(45, 12, 10)" stroke="#005500" fill="url(#svg_106)" id="svg_101" d="m7.9,15.9l4.9,-0.05l0,-13.75l3.8,0l0,17.6l-8.7,0l0,-3.8z"/>
          	</svg>
          </g>
          
          <g id="cancel">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
           <defs>
            <linearGradient y2="0.65625" x2="0.94141" y1="0.43359" x1="0.42969" id="svg_9">
             <stop stop-opacity="1" stop-color="#ff3838" offset="0"/>
             <stop stop-opacity="1" stop-color="#7a0c0c" offset="1"/>
            </linearGradient>
           </defs>
            <path stroke="#550000" fill="url(#svg_9)" id="svg_101" d="m2.10526,10.52632l7.36842,0l0,-7.36842l3.68421,0l0,7.36842l7.36842,0l0,3.68421l-7.36842,0l0,7.36842l-3.68421,0l0,-7.36842l-7.36842,0l0,-3.68421z" transform="rotate(45, 11.3, 12.3)"/>
           </svg>
          </g>
          
          <g id="warning">
          <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
           <defs>
            <linearGradient y2="0.98047" x2="0.57813" y1="0.44922" x1="0.56641" id="svg_110">
             <stop stop-opacity="1" stop-color="#ffff00" offset="0"/>
             <stop stop-opacity="1" stop-color="#9e9e00" offset="1"/>
            </linearGradient>
           </defs>
            <path d="m1.42857,21.55559l10.71429,-19.36489l10.71429,19.20352l-21.42857,0.16137z" id="svg_44" fill="url(#svg_110)" stroke="#916d1f" stroke-width="2"/>
            <path stroke="none" fill="#000000" id="svg_103" d="m11.98371,14.68571c-0.57143,-3.82857 -1.82857,-6.4 0.11429,-6.4c2.11429,0 0.74286,2.57143 0.11429,6.4l-0.22857,0z"/>
            <circle stroke="none" fill="#000000" id="svg_104" r="1.17578" cy="17.37143" cx="12.14308"/>
           </svg>
          </g>
          
          <g id="node_delete">
          <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg">
            <path stroke-width="2" id="svg_102" d="m4.1953,19.42128c15.49391,-15.53349 -0.21065,0.1581 15.61084,-15.57944" stroke="#8dd35f" fill="none"/>
            <circle stroke-width="0.5" id="svg_121" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="4" cx="19.75"/>
            <circle id="svg_123" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="19.40299" cx="4.0653"/>
            <circle id="svg_7" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="11.625" cx="11.9375"/>
            <g transform="rotate(-45.291072845458984 9.81157112121582,9.244086265563965) " id="svg_6">
             <line stroke-linecap="round" id="svg_4" y2="9.45264" x2="15.14996" y1="9.3943" x1="4.47318" stroke-dasharray="null" stroke-width="2" stroke="#ff0000" fill="none"/>
             <line stroke-linecap="round" id="svg_5" y2="14.46579" x2="9.66571" y1="4.02238" x1="9.7824" stroke-dasharray="null" stroke-width="2" stroke="#ff0000" fill="none"/>
            </g>
          </svg>
          </g>
          
          <g id="node_clone">
          <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg">
            <path stroke-width="2" id="svg_102" d="m4.1953,19.42128c15.49391,-15.53349 -0.21065,0.1581 15.61084,-15.57944" stroke="#8dd35f" fill="none"/>
            <circle stroke-width="0.5" id="svg_121" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="4" cx="19.75"/>
            <circle id="svg_123" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="19.40299" cx="4.0653"/>
            <circle id="svg_7" stroke-width="0.5" stroke="#0000ff" fill="#00ffff" r="2.26172" cy="11.625" cx="11.9375"/>
            <line stroke-linecap="round" id="svg_5" y2="14.46579" x2="9.66571" y1="4.02238" x1="9.7824" stroke-dasharray="null" stroke-width="2" stroke="#0000ff" fill="#0000ff"/>
            <line stroke-linecap="round" id="svg_4" y2="9.45264" x2="15.14996" y1="9.3943" x1="4.47318" stroke-dasharray="null" stroke-width="2" stroke="#0000ff" fill="#0000ff"/>
          </svg>
          </g>
          
          <g id="globe_link">
          <svg width="66" height="66" xmlns="http://www.w3.org/2000/svg">
           <defs>
            <radialGradient id="svg_8" spreadMethod="pad" cx="0.5" cy="0.32513">
             <stop stop-color="#7791ef" stop-opacity="0.99219" offset="0"/>
             <stop stop-color="#3c3cfc" offset="1"/>
            </radialGradient>
            <linearGradient id="svg_10" x1="0" y1="0" x2="1" y2="0">
             <stop offset="0" stop-color="#333333" stop-opacity="0.99609"/>
             <stop offset="1" stop-opacity="0.99609" stop-color="#666666"/>
            </linearGradient>
           </defs>
           <g>
            <g opacity="0.8" id="svg_5">
             <circle id="svg_1" r="27.90625" cy="33" cx="33" stroke-width="0" stroke="#AAAAAA" fill="url(#svg_8)"/>
             <g id="svg_7">
              <path d="m38.2478,36.06121c-0.43732,0 -0.87463,0 -1.31195,0c-0.43731,0 -0.87463,0 -2.6239,0c-0.87463,0 -1.74926,0 -2.18658,0c-0.43732,0 -2.19828,0.33684 -2.6239,0.43732c-0.95172,0.22467 -1.27098,0.48253 -1.74927,0.87463c-1.21939,0.99965 -1.44004,1.00272 -1.74926,1.31195c-0.30923,0.30923 -0.21265,0.79756 -0.43732,1.74926c-0.10048,0.42562 0.16736,0.90792 0,1.31195c-0.23668,0.57138 -0.43732,0.87463 -0.43732,1.74926c0,0.43732 0.12809,0.56541 0.43732,0.87463c0.30923,0.30923 0.12809,0.56541 0.43732,0.87463c0.30923,0.30923 1.32364,0.77415 1.74926,0.87463c0.95171,0.22467 0.69349,0.69349 1.31195,1.31195c0.30923,0.30923 0.90791,-0.16736 1.31195,0c0.57138,0.23668 0.56541,0.56541 0.87463,0.87463c0.30923,0.30923 0.56541,0.12809 0.87463,0.43732c0.61846,0.61846 -0.10048,1.32365 0,1.74926c0.22467,0.95171 0.43732,1.31195 0.43732,2.6239c0,0.87463 0,2.18658 0,3.06121c0,0.43732 0,1.31195 0,2.6239c0,0.43732 0.12809,1.00272 0.43732,1.31195c0.30922,0.30923 1.31195,0 1.74926,0c0.87463,0 1.31195,0 1.74927,0c0.43731,0 0.6065,-0.40129 1.74926,-0.87464c0.40403,-0.16736 0.74057,-0.20064 1.31195,-0.43732c0.40403,-0.16736 0.63795,-0.74057 0.87463,-1.31195c0.16736,-0.40403 0.15712,-2.20917 0.43732,-3.93585c0.22151,-1.36505 0.43732,-2.18658 0.43732,-2.6239c0,-0.43732 -0.12928,-0.88101 0,-2.18658c0.21973,-2.21904 0.43732,-3.49853 0.43732,-3.93585c0,-0.43732 0,-0.87463 0,-1.74927c0,-1.31195 0.16736,-1.78254 0,-2.18658c-0.23668,-0.57138 -1.00272,-0.56541 -1.31195,-0.87463c-0.30923,-0.30922 -0.43732,-0.43731 -1.74926,-1.74926l0,-0.87463l-0.43732,0l0,-0.43732" id="svg_2" stroke="#007f00" fill="#44b544" stroke-width="0"/>
              <path d="m5.66773,37.0452c1.12973,-0.3645 0.87463,-0.2187 1.74927,-0.656c0.87463,-0.4373 1.34081,-0.8211 2.18658,-1.3119c1.36372,-0.7915 1.44002,-1.4401 1.74922,-1.7493c0.3093,-0.3092 0.1281,-0.5654 0.4374,-0.8746c0.6184,-0.6185 0.8746,-0.4374 1.7492,-1.312c0.8747,-0.8746 1.0027,-1.0027 1.312,-1.3119c0.6184,-0.6185 0.1281,-1.0028 0.4373,-1.312c0.3092,-0.3092 0,-0.8746 0,-1.3119c0,-0.4374 0,-1.312 0,-1.7493c0,-0.4373 0.2009,-1.7727 0,-2.6239c-0.2247,-0.9517 -0.1281,-1.4401 -0.4373,-1.7493c-0.3093,-0.3092 -0.7073,-1.3452 -0.8746,-1.7492c-0.2367,-0.5714 -0.8747,-0.8747 -0.8747,-1.312c0,-0.4373 -0.4373,-0.4373 -0.4373,-0.8746l0,-0.4374l-1.2026,-0.8746c-3.7901,5.8674 -6.81486,11.6253 -5.79446,21.2099l-0.00001,0z" id="svg_3" stroke="#007f00" fill="#44b544" stroke-width="0"/>
              <path d="m52.2419,13.1021c-0.4373,0.4373 -1.3495,0.8398 -2.1866,1.0933c-3.0182,0.9138 -3.2212,2.2857 -3.4985,2.6239c-1.4137,1.7245 -2.4979,1.3039 -4.8105,1.7493c-0.4294,0.0827 -0.4373,0.4373 -0.8746,0.4373c-0.4373,0 -0.8746,0 -1.312,0c-0.4373,0 -1.3119,0 -1.7492,0c-0.4373,0 -1.3453,-0.27 -1.7493,-0.4373c-0.5714,-0.2367 -0.5654,-0.5654 -0.8746,-0.8747c-0.3092,-0.3092 -0.5654,-0.1281 -0.8746,-0.4373c-0.3093,-0.3092 -0.8747,0 -1.312,0c-0.4373,0 -0.9079,-0.1673 -1.3119,0c-0.5714,0.2367 -0.3033,1.0753 -0.8747,1.312c-0.404,0.1673 -0.1281,0.5654 -0.4373,0.8746c-0.3092,0.3092 -0.4373,0.4373 -0.4373,0.8746c0,0.4373 0,0.8747 0,1.312c0,0.4373 0.0333,0.7073 0.4373,0.8746c0.5714,0.2367 0.638,0.7406 0.8746,1.312c0.1674,0.404 0.4374,0.4373 0.4374,0.8746c0,0.4373 0,0.8746 0,1.3119c0,0.4374 -0.4374,0.4374 -0.8747,0.8747c-1.3119,1.3119 -1.9499,1.1779 -2.1865,1.7492c-0.1674,0.4041 -1.0753,0.3033 -1.312,0.8747c-0.1674,0.404 0,0.8746 0.4373,0.8746c0.4373,0 0.8746,0.4373 1.312,0.4373c0.4373,0 0.8746,-0.4373 1.3119,-0.4373c0.4373,0 0.5654,-0.1281 0.8746,-0.4373c0.6185,-0.6185 1.312,0 1.7493,0c0.4373,0 0.397,-0.6543 2.1866,-0.8747c0.434,-0.0534 2.8801,-0.2561 3.4985,-0.8746c0.3093,-0.3092 0.8343,-0.6543 2.6239,-0.8746c0.4341,-0.0535 0.8747,0 1.312,0c0.4373,0 0.8746,0.4373 0.8746,0.8746c0,0.4373 0.4373,0.4373 0.4373,0.8746c0,0.4374 0.5654,2.3147 0.8746,2.6239c0.3093,0.3093 0.1281,1.0028 0.4374,1.312c0.3092,0.3092 2.1095,2.8366 3.0612,3.0612c0.4256,0.1005 0.8215,0.2158 2.1866,0.4373c0.4316,0.0701 1.3119,0 1.7492,0c0.4373,0 0.8864,0.1005 1.312,0c0.9517,-0.2246 1.44,-0.5654 1.7492,-0.8746c0.3093,-0.3092 0.8747,-0.4373 1.312,-0.4373c0.4373,0 0.5654,-0.5654 0.8746,-0.8746c0.3092,-0.3093 0.8746,0 1.312,0l1.0933,-0.656c1.1661,-7.7259 -2.4782,-14.1399 -7.6531,-20.5539l0,0z" id="svg_4" stroke="#007f00" fill="#44b544" stroke-width="0"/>
              <path id="svg_6" d="m10.0409,48.3061c2.1137,-0.2187 4.6647,-0.2187 6.3411,1.9679c1.1662,1.5306 1.239,3.7172 0.2186,4.5918c-2.4052,-0.8746 -5.0291,-2.6239 -6.5597,-6.5597l0,0z" stroke="#007f00" fill="#44b544" stroke-width="0"/>
             </g>
            </g>
            <rect transform="rotate(45, 16.9336, 16.9375)" ry="9" rx="9" id="svg_9" height="19.32339" width="29.34293" y="7.27574" x="2.26257" stroke-width="5" stroke="url(#svg_10)" fill="none" stroke-linecap="round"/>
            <rect id="svg_11" transform="rotate(45, 49.0664, 49.0625)" ry="9" rx="9" height="19.32339" width="29.34293" y="39.40074" x="34.39538" stroke-width="5" stroke="url(#svg_10)" fill="none" stroke-linecap="round"/>
            <line id="svg_12" y2="45.75" x2="45.75" y1="20.25" x1="20.25" stroke-linecap="round" stroke-width="5" stroke="url(#svg_10)" fill="none"/>
           </g>
          </svg>
          </g>
          
          <g id="svg_eof"/>
          
          </svg>
          
        • text.svg
          <?xml version="1.0" encoding="UTF-8" standalone="no"?>
          <!-- Created with Inkscape (http://www.inkscape.org/) -->
          <svg
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:cc="http://web.resource.org/cc/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:svg="http://www.w3.org/2000/svg"
             xmlns="http://www.w3.org/2000/svg"
             xmlns:xlink="http://www.w3.org/1999/xlink"
             xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
             xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
             width="22.000000px"
             height="22.000000px"
             id="svg1306"
             sodipodi:version="0.32"
             inkscape:version="0.42.2"
             sodipodi:docbase="/home/andreas/projekt/bild/tango/22"
             sodipodi:docname="draw-text2.svg">
            <defs
               id="defs1308">
              <linearGradient
                 id="linearGradient3682">
                <stop
                   style="stop-color:#1f1f1f;stop-opacity:1.0000000;"
                   offset="0.0000000"
                   id="stop3684" />
                <stop
                   style="stop-color:#5c5c5c;stop-opacity:1.0000000;"
                   offset="1.0000000"
                   id="stop3686" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 id="linearGradient3558">
                <stop
                   style="stop-color:#000000;stop-opacity:1;"
                   offset="0"
                   id="stop3560" />
                <stop
                   style="stop-color:#000000;stop-opacity:0;"
                   offset="1"
                   id="stop3562" />
              </linearGradient>
              <radialGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient3558"
                 id="radialGradient3564"
                 cx="22.571428"
                 cy="30.857143"
                 fx="22.571428"
                 fy="30.857143"
                 r="15.571428"
                 gradientTransform="matrix(1.000000,0.000000,0.000000,0.651376,4.300378e-15,10.75754)"
                 gradientUnits="userSpaceOnUse" />
              <linearGradient
                 id="linearGradient2834">
                <stop
                   style="stop-color:#ffffff;stop-opacity:1;"
                   offset="0"
                   id="stop2836" />
                <stop
                   style="stop-color:#b3b3b3;stop-opacity:0.0000000;"
                   offset="1.0000000"
                   id="stop2838" />
              </linearGradient>
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient2834"
                 id="linearGradient2840"
                 x1="19.944447"
                 y1="16.527262"
                 x2="24.133829"
                 y2="19.642126"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(0.498259,0.000000,0.000000,0.466519,-0.799974,-0.839637)" />
              <linearGradient
                 inkscape:collect="always"
                 xlink:href="#linearGradient3682"
                 id="linearGradient3688"
                 x1="23.305620"
                 y1="24.843527"
                 x2="14.388516"
                 y2="9.5902243"
                 gradientUnits="userSpaceOnUse"
                 gradientTransform="matrix(0.498259,0.000000,0.000000,0.488600,-0.799974,-1.273557)" />
            </defs>
            <sodipodi:namedview
               id="base"
               pagecolor="#ffffff"
               bordercolor="#666666"
               borderopacity="1.0"
               inkscape:pageopacity="0.0"
               inkscape:pageshadow="2"
               inkscape:zoom="14.000000"
               inkscape:cx="17.541947"
               inkscape:cy="12.572768"
               inkscape:current-layer="layer1"
               showgrid="false"
               inkscape:grid-bbox="true"
               inkscape:document-units="px"
               showguides="true"
               inkscape:guide-bbox="true"
               inkscape:window-width="1280"
               inkscape:window-height="885"
               inkscape:window-x="0"
               inkscape:window-y="25" />
            <metadata
               id="metadata1311">
              <rdf:RDF>
                <cc:Work
                   rdf:about="">
                  <dc:format>image/svg+xml</dc:format>
                  <dc:type
                     rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
                  <dc:title></dc:title>
                </cc:Work>
              </rdf:RDF>
            </metadata>
            <g
               id="layer1"
               inkscape:label="Layer 1"
               inkscape:groupmode="layer">
              <path
                 sodipodi:type="arc"
                 style="opacity:0.47368422;color:#000000;fill:url(#radialGradient3564);fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
                 id="path3556"
                 sodipodi:cx="22.571428"
                 sodipodi:cy="30.857143"
                 sodipodi:rx="15.571428"
                 sodipodi:ry="10.142858"
                 d="M 38.142857 30.857143 A 15.571428 10.142858 0 1 1  7.0000000,30.857143 A 15.571428 10.142858 0 1 1  38.142857 30.857143 z"
                 transform="matrix(0.706422,0.000000,0.000000,0.208015,-4.944952,13.47138)" />
              <path
                 style="font-size:54.869392px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;fill:url(#linearGradient3688);fill-opacity:1.0000000;stroke:#000000;stroke-width:1.0000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
                 d="M 15.189363,15.520771 L 7.1531447,15.520771 L 5.8598048,19.513834 L 0.51627279,19.513834 L 8.1009381,0.48837876 L 14.228221,0.48837876 L 21.560524,19.464779 L 16.444188,19.464779 L 15.189363,15.520771 M 8.3990779,12.473977 L 13.858901,12.473977 L 11.171254,5.1526958 L 8.3990779,12.473977"
                 id="text1314"
                 sodipodi:nodetypes="ccccccccccccc" />
              <path
                 style="font-size:54.869392px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125.00000%;writing-mode:lr-tb;text-anchor:start;opacity:0.37912086;fill:none;fill-opacity:1.0000000;stroke:url(#linearGradient2840);stroke-width:1.0000008;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans"
                 d="M 15.684541,15.159554 L 6.6710758,15.159554 L 5.4166733,18.527305 L 2.0035414,18.527305 L 8.7384662,1.4621947 L 13.512484,1.4621947 L 20.022564,18.410463 L 16.899702,18.410463 L 15.684541,15.159554 z "
                 id="path2047"
                 sodipodi:nodetypes="ccccccccc" />
              <image
                 id="image2089"
                 height="459.00000"
                 width="400.00000"
                 sodipodi:absref="/home/andreas/palette2.png"
                 xlink:href="/home/andreas/palette2.png"
                 x="-354.93631"
                 y="-214.53793" />
              <path
                 style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#999999;stroke-width:1.0000007;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-opacity:1.0000000;opacity:0.51098901"
                 d="M 8.1686844,13.551882 L 14.147791,13.551882"
                 id="path5142"
                 sodipodi:nodetypes="cc" />
            </g>
          </svg>
          
      • jgraduate
        • css
          • jPicker.css
            .jPicker .Icon{display:inline-block;height:24px;position:relative;text-align:left;width:25px}.jPicker .Icon span.Color,.jPicker .Icon span.Alpha{background-position:2px 2px;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.jPicker .Icon span.Image{background-repeat:no-repeat;cursor:pointer;display:block;height:100%;left:0;position:absolute;top:0;width:100%}.jPicker.Container{z-index:10}table.jPicker{background-color:#efefef;border:1px outset #666;font-family:Arial,Helvetica,Sans-Serif;font-size:12px!important;margin:0;padding:5px;width:545px;z-index:20}.jPicker .Move{background-color:#ddd;border-color:#fff #666 #666 #fff;border-style:solid;border-width:1px;cursor:move;height:12px;padding:0}.jPicker .Title{font-size:11px!important;font-weight:bold;margin:-2px 0 0 0;padding:0;text-align:center;width:100%}.jPicker div.Map{border-bottom:2px solid #fff;border-left:2px solid #9a9a9a;border-right:2px solid #fff;border-top:2px solid #9a9a9a;cursor:crosshair;height:260px;margin:0 5px 0 5px;overflow:hidden;padding:0;position:relative;width:260px}.jPicker div[class="Map"]{height:256px;width:256px}.jPicker div.Bar{border-bottom:2px solid #fff;border-left:2px solid #9a9a9a;border-right:2px solid #fff;border-top:2px solid #9a9a9a;cursor:n-resize;height:260px;margin:12px 10px 0 5px;overflow:hidden;padding:0;position:relative;width:24px}.jPicker div[class="Bar"]{height:256px;width:20px}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Map .Map3,.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4,.jPicker .Bar .Map5,.jPicker .Bar .Map6{background-color:transparent;background-image:none;display:block;left:0;position:absolute;top:0}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Map .Map3{height:2596px;width:256px}.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4{height:3896px;width:20px}.jPicker .Bar .Map5,.jPicker .Bar .Map6{height:256px;width:20px}.jPicker .Map .Map1,.jPicker .Map .Map2,.jPicker .Bar .Map6{background-repeat:no-repeat}.jPicker .Map .Map3,.jPicker .Bar .Map5{background-repeat:repeat}.jPicker .Bar .Map1,.jPicker .Bar .Map2,.jPicker .Bar .Map3,.jPicker .Bar .Map4{background-repeat:repeat-x}.jPicker .Map .Arrow{display:block;position:absolute}.jPicker .Bar .Arrow{display:block;left:0;position:absolute}.jPicker .Preview{font-size:9px;text-align:center}.jPicker .Preview div{border:2px inset #eee;height:62px;margin:0 auto;padding:0;width:62px}.jPicker .Preview div span{border:1px solid #000;display:block;height:30px;margin:0 auto;padding:0;width:60px}.jPicker .Preview .Active{border-bottom-width:0}.jPicker .Preview .Current{border-top-width:0;cursor:pointer}.jPicker .Button{text-align:center;width:115px}.jPicker .Button input{width:100px}.jPicker .Button .Ok{margin:12px 0 5px 0}.jPicker td.Radio{margin:0;padding:0;width:31px}.jPicker td.Radio input{margin:0 5px 0 0;padding:0}.jPicker td.Text{font-size:12px!important;height:22px;margin:0;padding:0;text-align:left;width:70px}.jPicker tr.Hex td.Text{width:100px}.jPicker td.Text input{background-color:#fff;border:1px inset #aaa;height:19px;margin:0 0 0 5px;text-align:left;width:30px}.jPicker td[class="Text"] input{height:15px}.jPicker tr.Hex td.Text input.Hex{width:50px}.jPicker tr.Hex td.Text input.AHex{width:20px}.jPicker .Grid{text-align:center;width:114px}.jPicker .Grid span.QuickColor{border:1px inset #aaa;cursor:pointer;display:inline-block;height:15px;line-height:15px;margin:0;padding:0;width:19px}.jPicker .Grid span[class="QuickColor"]{width:17px}
          • jgraduate.css
            /* 
             * jGraduate Default CSS
             * 
             * Copyright (c) 2010 Jeff Schiller
             * http://blog.codedread.com/
             *
             * Copyright (c) 2010 Alexis Deveria
             * http://a.deveria.com/
             *
             * Licensed under the MIT License
             */
            
            h2.jGraduate_Title {
              font-family: Arial, Helvetica, Sans-Serif;
              font-size: 11px !important;
              font-weight: bold;
              margin: -13px 0px 0px 0px;
              padding: 0px;
              text-align: center;
            }
            
            .jGraduate_Picker {
            	font-family: Arial, Helvetica, Sans-Serif;
            	font-size: 12px;
            	border-style: solid;
            	border-color: lightgrey black black lightgrey;
            	border-width: 1px;
            	background-color: #EFEFEF;
            	position: absolute;
            	padding: 10px;
            }
            
            .jGraduate_tabs li {
            	background-color: #ccc;
            	display: inline;
            	border: solid 1px grey;
            	padding: 3px;
            	margin: 2px;
            	cursor: pointer;
            }
            
            li.jGraduate_tab_current {
            	background-color: #EFEFEF;
            	display: inline;
            	padding: 3px;
            	margin: 2px;
            	border: solid 1px black;
            	cursor: pointer;
            }
            
            .jGraduate_colPick {
            	display: none;
            }
            
            .jGraduate_gradPick {	
            	display: none;
            	border: outset 1px #666;
            	padding: 10px 7px 5px 5px;
            	overflow: auto;
            }
            
            .jGraduate_gradPick {	
            	display: none;
            	border: outset 1px #666;
            	padding: 10px 7px 5px 5px;
            	overflow: auto;
            /*	position: relative;*/
            }
            
            .jGraduate_tabs {
            	position: relative;
            	background-color: #EFEFEF;
            	padding: 0px;
            	margin: 0px;
            	margin-bottom: 5px;
            }
            
            div.jGraduate_Swatch {
            	float: left;
            	margin: 8px;
            }
            div.jGraduate_GradContainer {
            	border: 2px inset #EEE;
            	background-image: url(../images/map-opacity.png); 
            	background-position: 0px 0px;
            	height: 256px;
            	width: 256px;
            	position: relative;
            }
            
            div.jGraduate_GradContainer div.grad_coord {
            	background: #000;
            	border: 1px solid #fff;
            	border-radius: 5px;
            	-moz-border-radius: 5px;
            	width: 10px;
            	height: 10px;
            	position: absolute;
            	margin: -5px -5px;
            	top: 0;
            	left: 0;
            	text-align: center;
            	font-size: xx-small;
            	line-height: 10px;
            	color: #fff;
            	text-decoration: none;
            	cursor: pointer;
            	-moz-user-select: none;
            	-webkit-user-select: none;
            }
            
            .jGraduate_AlphaArrows {
            	position: absolute;
            	margin-top: -10px;
            	margin-left: 250.5px;
            }
            
            div.jGraduate_Opacity {
            	border: 2px inset #eee;
            	margin-top: 14px;
            	background-color: black;
            	background-image: url(../images/Maps.png);
            	background-position: 0px -2816px;
            	height: 20px;
            	cursor: ew-resize;
            }
            
            div.jGraduate_StopSlider {
            /*	border: 2px inset #eee;*/
            	margin: 0 0 0 -10px;
            	width: 276px;
            	overflow: visible;
            	background: #efefef;
            	height: 45px;
            	cursor: pointer;
            }
            
            div.jGraduate_StopSection {
            	width: 120px;
            	text-align: center;
            }
            
            
            
            
            input.jGraduate_Ok, input.jGraduate_Cancel {
            	display: block;
            	width: 100px;
            	margin-left: -4px;
            	margin-right: -4px;
            }
            input.jGraduate_Ok {
            	margin: 9px -4px 5px -4px;
            }
            
            .colorBox {
            	float: left;
            	height: 16px;
            	width: 16px;
            	border: 1px solid #808080;
            	cursor: pointer;
            	margin: 4px 4px 4px 30px;
            }
            
            .colorBox + label {
            	float: left;
            	margin-top: 7px;
            }
            
            label.jGraduate_Form_Heading {
            	position: relative;
            	top: 10px;
            	background-color: #EFEFEF;
            	padding: 2px;
            	font-weight: bold;
            	font-size: 13px;
            }
            
            div.jGraduate_Form_Section {
            	border-style: solid;
            	border-width: 1px;
            	border-color: grey;
            	-moz-border-radius: 5px;
            	-webkit-border-radius: 5px;
            	padding: 15px 5px 5px 5px;
            	margin: 5px 2px;
            	width: 110px;
            	text-align: center;
            	overflow: auto;
            }
            
            div.jGraduate_Form_Section label {
            	padding: 0 2px;
            }
            
            div.jGraduate_StopSection input[type=text],
            div.jGraduate_Slider input[type=text] {
            	width: 33px;
            }
            
            div.jGraduate_LightBox {
            	position: fixed;
            	top: 0px;
            	left: 0px;
            	right: 0px;
            	bottom: 0px;
            	background-color: #000;
            	opacity: 0.5;
            	display: none;
            }
            
            div.jGraduate_stopPicker {
            	position: absolute;
            	display: none;
            	background: #E8E8E8;
            }
            
            
            .jGraduate_gradPick {
            	width: 535px;
            }
            
            .jGraduate_gradPick div.jGraduate_OpacField {
            
            	position: absolute;
            	left: 0;
            	bottom: 5px;
            /*
            	width: 270px;
            
            	left: 284px;
            	width: 266px;
            	height: 200px;
            	top: 167px;
            	margin: -3px 3px 0px 4px;
            */
            }
            
            .jGraduate_gradPick .jGraduate_Form {
            	float: left;
            	width: 270px;
            	position: absolute;
            	left: 284px;
            	width: 266px;
            	height: 200px;
            	top: 167px;
            	margin: -3px 3px 0px 10px;
            }
            
            .jGraduate_gradPick .jGraduate_Points {
            	position: static;
            	width: 150px;
            	margin-left: 0;
            }
            
            .jGraduate_SpreadMethod {
            	position: absolute;
            	right: 8px;
            	top: 100px;
            }
            
            .jGraduate_Colorblocks {
            	display: table;
            	border-spacing: 0 5px;
            }
            
            .jGraduate_colorblock {
            	display: table-row;
            }
            
            .jGraduate_Colorblocks .jGraduate_colorblock > * {
            	display: table-cell;
            	vertical-align: middle;
            	margin: 0;
            	float: none;
            }
            
            .jGraduate_gradPick div.jGraduate_StopSection {
            	float: left;
            	width: 133px;
            	margin-top: -8px;
            }
            
            
            .jGraduate_gradPick .jGraduate_Form_Section {
            	padding-top: 9px;
            }
            
            
            .jGraduate_Slider {
            	text-align: center;
            	float: left;
            	width: 100%;
            }
            
            .jGraduate_Slider .jGraduate_Form_Section {
            	border: none;
            	width: 250px;
            	padding: 0 2px;
            	overflow: visible;
            }
            
            .jGraduate_Slider label {
            	display: inline-block;
            	float: left;
            	line-height: 50px;
            	padding: 0;
            }
            
            .jGraduate_Slider label.prelabel {
            	width: 40px;
            	text-align: left;
            }
            
            .jGraduate_SliderBar {
            	width: 140px;
            	float: left;
            	margin-right: 5px;
            	border:1px solid #BBB;
            	height:20px;
            	margin-top:14px;
            	margin-left:5px;
            	position: relative;
            }
            
            div.jGraduate_Slider input {
            	margin-top: 5px;
            }
            
            div.jGraduate_Slider img {
            	top: 0;
            	left: 0;
            	position: absolute;
            	margin-top: -10px;
            	cursor:ew-resize;
            }
            
            
            .jGraduate_gradPick .jGraduate_OkCancel {
            	position: absolute;
            	top: 39px;
            	right: 10px;
            	width: 113px;
            
            }
            
            .jGraduate_OpacField {
            	position: absolute;
            	right: -10px;
            	bottom: 0;
            }
        • LICENSE
                                           Apache License
                                     Version 2.0, January 2004
                                  http://www.apache.org/licenses/
          
             TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
          
             1. Definitions.
          
                "License" shall mean the terms and conditions for use, reproduction,
                and distribution as defined by Sections 1 through 9 of this document.
          
                "Licensor" shall mean the copyright owner or entity authorized by
                the copyright owner that is granting the License.
          
                "Legal Entity" shall mean the union of the acting entity and all
                other entities that control, are controlled by, or are under common
                control with that entity. For the purposes of this definition,
                "control" means (i) the power, direct or indirect, to cause the
                direction or management of such entity, whether by contract or
                otherwise, or (ii) ownership of fifty percent (50%) or more of the
                outstanding shares, or (iii) beneficial ownership of such entity.
          
                "You" (or "Your") shall mean an individual or Legal Entity
                exercising permissions granted by this License.
          
                "Source" form shall mean the preferred form for making modifications,
                including but not limited to software source code, documentation
                source, and configuration files.
          
                "Object" form shall mean any form resulting from mechanical
                transformation or translation of a Source form, including but
                not limited to compiled object code, generated documentation,
                and conversions to other media types.
          
                "Work" shall mean the work of authorship, whether in Source or
                Object form, made available under the License, as indicated by a
                copyright notice that is included in or attached to the work
                (an example is provided in the Appendix below).
          
                "Derivative Works" shall mean any work, whether in Source or Object
                form, that is based on (or derived from) the Work and for which the
                editorial revisions, annotations, elaborations, or other modifications
                represent, as a whole, an original work of authorship. For the purposes
                of this License, Derivative Works shall not include works that remain
                separable from, or merely link (or bind by name) to the interfaces of,
                the Work and Derivative Works thereof.
          
                "Contribution" shall mean any work of authorship, including
                the original version of the Work and any modifications or additions
                to that Work or Derivative Works thereof, that is intentionally
                submitted to Licensor for inclusion in the Work by the copyright owner
                or by an individual or Legal Entity authorized to submit on behalf of
                the copyright owner. For the purposes of this definition, "submitted"
                means any form of electronic, verbal, or written communication sent
                to the Licensor or its representatives, including but not limited to
                communication on electronic mailing lists, source code control systems,
                and issue tracking systems that are managed by, or on behalf of, the
                Licensor for the purpose of discussing and improving the Work, but
                excluding communication that is conspicuously marked or otherwise
                designated in writing by the copyright owner as "Not a Contribution."
          
                "Contributor" shall mean Licensor and any individual or Legal Entity
                on behalf of whom a Contribution has been received by Licensor and
                subsequently incorporated within the Work.
          
             2. Grant of Copyright License. Subject to the terms and conditions of
                this License, each Contributor hereby grants to You a perpetual,
                worldwide, non-exclusive, no-charge, royalty-free, irrevocable
                copyright license to reproduce, prepare Derivative Works of,
                publicly display, publicly perform, sublicense, and distribute the
                Work and such Derivative Works in Source or Object form.
          
             3. Grant of Patent License. Subject to the terms and conditions of
                this License, each Contributor hereby grants to You a perpetual,
                worldwide, non-exclusive, no-charge, royalty-free, irrevocable
                (except as stated in this section) patent license to make, have made,
                use, offer to sell, sell, import, and otherwise transfer the Work,
                where such license applies only to those patent claims licensable
                by such Contributor that are necessarily infringed by their
                Contribution(s) alone or by combination of their Contribution(s)
                with the Work to which such Contribution(s) was submitted. If You
                institute patent litigation against any entity (including a
                cross-claim or counterclaim in a lawsuit) alleging that the Work
                or a Contribution incorporated within the Work constitutes direct
                or contributory patent infringement, then any patent licenses
                granted to You under this License for that Work shall terminate
                as of the date such litigation is filed.
          
             4. Redistribution. You may reproduce and distribute copies of the
                Work or Derivative Works thereof in any medium, with or without
                modifications, and in Source or Object form, provided that You
                meet the following conditions:
          
                (a) You must give any other recipients of the Work or
                    Derivative Works a copy of this License; and
          
                (b) You must cause any modified files to carry prominent notices
                    stating that You changed the files; and
          
                (c) You must retain, in the Source form of any Derivative Works
                    that You distribute, all copyright, patent, trademark, and
                    attribution notices from the Source form of the Work,
                    excluding those notices that do not pertain to any part of
                    the Derivative Works; and
          
                (d) If the Work includes a "NOTICE" text file as part of its
                    distribution, then any Derivative Works that You distribute must
                    include a readable copy of the attribution notices contained
                    within such NOTICE file, excluding those notices that do not
                    pertain to any part of the Derivative Works, in at least one
                    of the following places: within a NOTICE text file distributed
                    as part of the Derivative Works; within the Source form or
                    documentation, if provided along with the Derivative Works; or,
                    within a display generated by the Derivative Works, if and
                    wherever such third-party notices normally appear. The contents
                    of the NOTICE file are for informational purposes only and
                    do not modify the License. You may add Your own attribution
                    notices within Derivative Works that You distribute, alongside
                    or as an addendum to the NOTICE text from the Work, provided
                    that such additional attribution notices cannot be construed
                    as modifying the License.
          
                You may add Your own copyright statement to Your modifications and
                may provide additional or different license terms and conditions
                for use, reproduction, or distribution of Your modifications, or
                for any such Derivative Works as a whole, provided Your use,
                reproduction, and distribution of the Work otherwise complies with
                the conditions stated in this License.
          
             5. Submission of Contributions. Unless You explicitly state otherwise,
                any Contribution intentionally submitted for inclusion in the Work
                by You to the Licensor shall be under the terms and conditions of
                this License, without any additional terms or conditions.
                Notwithstanding the above, nothing herein shall supersede or modify
                the terms of any separate license agreement you may have executed
                with Licensor regarding such Contributions.
          
             6. Trademarks. This License does not grant permission to use the trade
                names, trademarks, service marks, or product names of the Licensor,
                except as required for reasonable and customary use in describing the
                origin of the Work and reproducing the content of the NOTICE file.
          
             7. Disclaimer of Warranty. Unless required by applicable law or
                agreed to in writing, Licensor provides the Work (and each
                Contributor provides its Contributions) on an "AS IS" BASIS,
                WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
                implied, including, without limitation, any warranties or conditions
                of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
                PARTICULAR PURPOSE. You are solely responsible for determining the
                appropriateness of using or redistributing the Work and assume any
                risks associated with Your exercise of permissions under this License.
          
             8. Limitation of Liability. In no event and under no legal theory,
                whether in tort (including negligence), contract, or otherwise,
                unless required by applicable law (such as deliberate and grossly
                negligent acts) or agreed to in writing, shall any Contributor be
                liable to You for damages, including any direct, indirect, special,
                incidental, or consequential damages of any character arising as a
                result of this License or out of the use or inability to use the
                Work (including but not limited to damages for loss of goodwill,
                work stoppage, computer failure or malfunction, or any and all
                other commercial damages or losses), even if such Contributor
                has been advised of the possibility of such damages.
          
             9. Accepting Warranty or Additional Liability. While redistributing
                the Work or Derivative Works thereof, You may choose to offer,
                and charge a fee for, acceptance of support, warranty, indemnity,
                or other liability obligations and/or rights consistent with this
                License. However, in accepting such obligations, You may act only
                on Your own behalf and on Your sole responsibility, not on behalf
                of any other Contributor, and only if You agree to indemnify,
                defend, and hold each Contributor harmless for any liability
                incurred by, or claims asserted against, such Contributor by reason
                of your accepting any such warranty or additional liability.
          
             END OF TERMS AND CONDITIONS
          
             APPENDIX: How to apply the Apache License to your work.
          
                To apply the Apache License to your work, attach the following
                boilerplate notice, with the fields enclosed by brackets "[]"
                replaced with your own identifying information. (Don't include
                the brackets!)  The text should be enclosed in the appropriate
                comment syntax for the file format. We also recommend that a
                file or class name and description of purpose be included on the
                same "printed page" as the copyright notice for easier
                identification within third-party archives.
          
             Copyright [yyyy] [name of copyright owner]
          
             Licensed under the Apache License, Version 2.0 (the "License");
             you may not use this file except in compliance with the License.
             You may obtain a copy of the License at
          
                 http://www.apache.org/licenses/LICENSE-2.0
          
             Unless required by applicable law or agreed to in writing, software
             distributed under the License is distributed on an "AS IS" BASIS,
             WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
             See the License for the specific language governing permissions and
             limitations under the License.
          
        • jpicker.js
          /*
           * jPicker 1.1.6
           *
           * jQuery Plugin for Photoshop style color picker
           *
           * Copyright (c) 2010 Christopher T. Tillman
           * Digital Magic Productions, Inc. (http://www.digitalmagicpro.com/)
           * MIT style license, FREE to use, alter, copy, sell, and especially ENHANCE
           *
           * Painstakingly ported from John Dyers' excellent work on his own color picker based on the Prototype framework.
           *
           * John Dyers' website: (http://johndyer.name)
           * Color Picker page:   (http://johndyer.name/post/2007/09/PhotoShop-like-JavaScript-Color-Picker.aspx)
           *
           */
          (function($, version)
          {
            Math.precision = function(value, precision)
              {
                if (precision === undefined) precision = 0;
                return Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);
              };
            var Slider = // encapsulate slider functionality for the ColorMap and ColorBar - could be useful to use a jQuery UI draggable for this with certain extensions
                function(bar, options)
                {
                  var $this = this, // private properties, methods, and events - keep these variables and classes invisible to outside code
                    arrow = bar.find('img:first'), // the arrow image to drag
                    minX = 0,
                    maxX = 100,
                    rangeX = 100,
                    minY = 0,
                    maxY = 100,
                    rangeY = 100,
                    x = 0,
                    y = 0,
                    offset,
                    timeout,
                    changeEvents = new Array(),
                    fireChangeEvents =
                      function(context)
                      {
                        for (var i = 0; i < changeEvents.length; i++) changeEvents[i].call($this, $this, context);
                      },
                    mouseDown = // bind the mousedown to the bar not the arrow for quick snapping to the clicked location
                      function(e)
                      {
                        var off = bar.offset();
                        offset = { l: off.left | 0, t: off.top | 0 };
                        clearTimeout(timeout);
                        timeout = setTimeout( // using setTimeout for visual updates - once the style is updated the browser will re-render internally allowing the next Javascript to run
                          function()
                          {
                            setValuesFromMousePosition.call($this, e);
                          }, 0);
                        // Bind mousemove and mouseup event to the document so it responds when dragged of of the bar - we will unbind these when on mouseup to save processing
                        $(document).bind('mousemove', mouseMove).bind('mouseup', mouseUp);
                        e.preventDefault(); // don't try to select anything or drag the image to the desktop
                      },
                    mouseMove = // set the values as the mouse moves
                      function(e)
                      {
                        clearTimeout(timeout);
                        timeout = setTimeout(
                          function()
                          {
                            setValuesFromMousePosition.call($this, e);
                          }, 0);
                        e.stopPropagation();
                        e.preventDefault();
                        return false;
                      },
                    mouseUp = // unbind the document events - they aren't needed when not dragging
                      function(e)
                      {
                        $(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove);
                        e.stopPropagation();
                        e.preventDefault();
                        return false;
                      },
                    setValuesFromMousePosition = // calculate mouse position and set value within the current range
                      function(e)
                      {
                        var locX = e.pageX - offset.l,
                            locY = e.pageY - offset.t,
                            barW = bar.w, // local copies for YUI compressor
                            barH = bar.h;
                        // keep the arrow within the bounds of the bar
                        if (locX < 0) locX = 0;
                        else if (locX > barW) locX = barW;
                        if (locY < 0) locY = 0;
                        else if (locY > barH) locY = barH;
                        val.call($this, 'xy', { x: ((locX / barW) * rangeX) + minX, y: ((locY / barH) * rangeY) + minY });
                      },
                    draw =
                      function()
                      {
                        var arrowOffsetX = 0,
                          arrowOffsetY = 0,
                          barW = bar.w,
                          barH = bar.h,
                          arrowW = arrow.w,
                          arrowH = arrow.h;
                        setTimeout(
                          function()
                          {
                            if (rangeX > 0) // range is greater than zero
                            {
                              // constrain to bounds
                              if (x == maxX) arrowOffsetX = barW;
                              else arrowOffsetX = ((x / rangeX) * barW) | 0;
                            }
                            if (rangeY > 0) // range is greater than zero
                            {
                              // constrain to bounds
                              if (y == maxY) arrowOffsetY = barH;
                              else arrowOffsetY = ((y / rangeY) * barH) | 0;
                            }
                            // if arrow width is greater than bar width, center arrow and prevent horizontal dragging
                            if (arrowW >= barW) arrowOffsetX = (barW >> 1) - (arrowW >> 1); // number >> 1 - superfast bitwise divide by two and truncate (move bits over one bit discarding lowest)
                            else arrowOffsetX -= arrowW >> 1;
                            // if arrow height is greater than bar height, center arrow and prevent vertical dragging
                            if (arrowH >= barH) arrowOffsetY = (barH >> 1) - (arrowH >> 1);
                            else arrowOffsetY -= arrowH >> 1;
                            // set the arrow position based on these offsets
                            arrow.css({ left: arrowOffsetX + 'px', top: arrowOffsetY + 'px' });
                          }, 0);
                      },
                    val =
                      function(name, value, context)
                      {
                        var set = value !== undefined;
                        if (!set)
                        {
                          if (name === undefined || name == null) name = 'xy';
                          switch (name.toLowerCase())
                          {
                            case 'x': return x;
                            case 'y': return y;
                            case 'xy':
                            default: return { x: x, y: y };
                          }
                        }
                        if (context != null && context == $this) return;
                        var changed = false,
                            newX,
                            newY;
                        if (name == null) name = 'xy';
                        switch (name.toLowerCase())
                        {
                          case 'x':
                            newX = value && (value.x && value.x | 0 || value | 0) || 0;
                            break;
                          case 'y':
                            newY = value && (value.y && value.y | 0 || value | 0) || 0;
                            break;
                          case 'xy':
                          default:
                            newX = value && value.x && value.x | 0 || 0;
                            newY = value && value.y && value.y | 0 || 0;
                            break;
                        }
                        if (newX != null)
                        {
                          if (newX < minX) newX = minX;
                          else if (newX > maxX) newX = maxX;
                          if (x != newX)
                          {
                            x = newX;
                            changed = true;
                          }
                        }
                        if (newY != null)
                        {
                          if (newY < minY) newY = minY;
                          else if (newY > maxY) newY = maxY;
                          if (y != newY)
                          {
                            y = newY;
                            changed = true;
                          }
                        }
                        changed && fireChangeEvents.call($this, context || $this);
                      },
                    range =
                      function (name, value)
                      {
                        var set = value !== undefined;
                        if (!set)
                        {
                          if (name === undefined || name == null) name = 'all';
                          switch (name.toLowerCase())
                          {
                            case 'minx': return minX;
                            case 'maxx': return maxX;
                            case 'rangex': return { minX: minX, maxX: maxX, rangeX: rangeX };
                            case 'miny': return minY;
                            case 'maxy': return maxY;
                            case 'rangey': return { minY: minY, maxY: maxY, rangeY: rangeY };
                            case 'all':
                            default: return { minX: minX, maxX: maxX, rangeX: rangeX, minY: minY, maxY: maxY, rangeY: rangeY };
                          }
                        }
                        var changed = false,
                            newMinX,
                            newMaxX,
                            newMinY,
                            newMaxY;
                        if (name == null) name = 'all';
                        switch (name.toLowerCase())
                        {
                          case 'minx':
                            newMinX = value && (value.minX && value.minX | 0 || value | 0) || 0;
                            break;
                          case 'maxx':
                            newMaxX = value && (value.maxX && value.maxX | 0 || value | 0) || 0;
                            break;
                          case 'rangex':
                            newMinX = value && value.minX && value.minX | 0 || 0;
                            newMaxX = value && value.maxX && value.maxX | 0 || 0;
                            break;
                          case 'miny':
                            newMinY = value && (value.minY && value.minY | 0 || value | 0) || 0;
                            break;
                          case 'maxy':
                            newMaxY = value && (value.maxY && value.maxY | 0 || value | 0) || 0;
                            break;
                          case 'rangey':
                            newMinY = value && value.minY && value.minY | 0 || 0;
                            newMaxY = value && value.maxY && value.maxY | 0 || 0;
                            break;
                          case 'all':
                          default:
                            newMinX = value && value.minX && value.minX | 0 || 0;
                            newMaxX = value && value.maxX && value.maxX | 0 || 0;
                            newMinY = value && value.minY && value.minY | 0 || 0;
                            newMaxY = value && value.maxY && value.maxY | 0 || 0;
                            break;
                        }
                        if (newMinX != null && minX != newMinX)
                        {
                          minX = newMinX;
                          rangeX = maxX - minX;
                        }
                        if (newMaxX != null && maxX != newMaxX)
                        {
                          maxX = newMaxX;
                          rangeX = maxX - minX;
                        }
                        if (newMinY != null && minY != newMinY)
                        {
                          minY = newMinY;
                          rangeY = maxY - minY;
                        }
                        if (newMaxY != null && maxY != newMaxY)
                        {
                          maxY = newMaxY;
                          rangeY = maxY - minY;
                        }
                      },
                    bind =
                      function (callback)
                      {
                        if ($.isFunction(callback)) changeEvents.push(callback);
                      },
                    unbind =
                      function (callback)
                      {
                        if (!$.isFunction(callback)) return;
                        var i;
                        while ((i = $.inArray(callback, changeEvents)) != -1) changeEvents.splice(i, 1);
                      },
                    destroy =
                      function()
                      {
                        // unbind all possible events and null objects
                        $(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove);
                        bar.unbind('mousedown', mouseDown);
                        bar = null;
                        arrow = null;
                        changeEvents = null;
                      };
                  $.extend(true, $this, // public properties, methods, and event bindings - these we need to access from other controls
                    {
                      val: val,
                      range: range,
                      bind: bind,
                      unbind: unbind,
                      destroy: destroy
                    });
                  // initialize this control
                  arrow.src = options.arrow && options.arrow.image;
                  arrow.w = options.arrow && options.arrow.width || arrow.width();
                  arrow.h = options.arrow && options.arrow.height || arrow.height();
                  bar.w = options.map && options.map.width || bar.width();
                  bar.h = options.map && options.map.height || bar.height();
                  // bind mousedown event
                  bar.bind('mousedown', mouseDown);
                  bind.call($this, draw);
                },
              ColorValuePicker = // controls for all the input elements for the typing in color values
                function(picker, color, bindedHex, alphaPrecision)
                {
                  var $this = this, // private properties and methods
                    inputs = picker.find('td.Text input'),
                    red = inputs.eq(3),
                    green = inputs.eq(4),
                    blue = inputs.eq(5),
                    alpha = inputs.length > 7 ? inputs.eq(6) : null,
                    hue = inputs.eq(0),
                    saturation = inputs.eq(1),
                    value = inputs.eq(2),
                    hex = inputs.eq(inputs.length > 7 ? 7 : 6),
                    ahex = inputs.length > 7 ? inputs.eq(8) : null,
                    keyDown = // input box key down - use arrows to alter color
                      function(e)
                      {
                        if (e.target.value == '' && e.target != hex.get(0) && (bindedHex != null && e.target != bindedHex.get(0) || bindedHex == null)) return;
                        if (!validateKey(e)) return e;
                        switch (e.target)
                        {
                          case red.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                red.val(setValueInRange.call($this, (red.val() << 0) + 1, 0, 255));
                                color.val('r', red.val(), e.target);
                                return false;
                              case 40:
                                red.val(setValueInRange.call($this, (red.val() << 0) - 1, 0, 255));
                                color.val('r', red.val(), e.target);
                                return false;
                            }
                            break;
                          case green.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                green.val(setValueInRange.call($this, (green.val() << 0) + 1, 0, 255));
                                color.val('g', green.val(), e.target);
                                return false;
                              case 40:
                                green.val(setValueInRange.call($this, (green.val() << 0) - 1, 0, 255));
                                color.val('g', green.val(), e.target);
                                return false;
                            }
                            break;
                          case blue.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                blue.val(setValueInRange.call($this, (blue.val() << 0) + 1, 0, 255));
                                color.val('b', blue.val(), e.target);
                                return false;
                              case 40:
                                blue.val(setValueInRange.call($this, (blue.val() << 0) - 1, 0, 255));
                                color.val('b', blue.val(), e.target);
                                return false;
                            }
                            break;
                          case alpha && alpha.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                alpha.val(setValueInRange.call($this, parseFloat(alpha.val()) + 1, 0, 100));
                                color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target);
                                return false;
                              case 40:
                                alpha.val(setValueInRange.call($this, parseFloat(alpha.val()) - 1, 0, 100));
                                color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target);
                                return false;
                            }
                            break;
                          case hue.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                hue.val(setValueInRange.call($this, (hue.val() << 0) + 1, 0, 360));
                                color.val('h', hue.val(), e.target);
                                return false;
                              case 40:
                                hue.val(setValueInRange.call($this, (hue.val() << 0) - 1, 0, 360));
                                color.val('h', hue.val(), e.target);
                                return false;
                            }
                            break;
                          case saturation.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                saturation.val(setValueInRange.call($this, (saturation.val() << 0) + 1, 0, 100));
                                color.val('s', saturation.val(), e.target);
                                return false;
                              case 40:
                                saturation.val(setValueInRange.call($this, (saturation.val() << 0) - 1, 0, 100));
                                color.val('s', saturation.val(), e.target);
                                return false;
                            }
                            break;
                          case value.get(0):
                            switch (e.keyCode)
                            {
                              case 38:
                                value.val(setValueInRange.call($this, (value.val() << 0) + 1, 0, 100));
                                color.val('v', value.val(), e.target);
                                return false;
                              case 40:
                                value.val(setValueInRange.call($this, (value.val() << 0) - 1, 0, 100));
                                color.val('v', value.val(), e.target);
                                return false;
                            }
                            break;
                        }
                      },
                    keyUp = // input box key up - validate value and set color
                      function(e)
                      {
                        if (e.target.value == '' && e.target != hex.get(0) && (bindedHex != null && e.target != bindedHex.get(0) || bindedHex == null)) return;
                        if (!validateKey(e)) return e;
                        switch (e.target)
                        {
                          case red.get(0):
                            red.val(setValueInRange.call($this, red.val(), 0, 255));
                            color.val('r', red.val(), e.target);
                            break;
                          case green.get(0):
                            green.val(setValueInRange.call($this, green.val(), 0, 255));
                            color.val('g', green.val(), e.target);
                            break;
                          case blue.get(0):
                            blue.val(setValueInRange.call($this, blue.val(), 0, 255));
                            color.val('b', blue.val(), e.target);
                            break;
                          case alpha && alpha.get(0):
                            alpha.val(setValueInRange.call($this, alpha.val(), 0, 100));
                            color.val('a', Math.precision((alpha.val() * 255) / 100, alphaPrecision), e.target);
                            break;
                          case hue.get(0):
                            hue.val(setValueInRange.call($this, hue.val(), 0, 360));
                            color.val('h', hue.val(), e.target);
                            break;
                          case saturation.get(0):
                            saturation.val(setValueInRange.call($this, saturation.val(), 0, 100));
                            color.val('s', saturation.val(), e.target);
                            break;
                          case value.get(0):
                            value.val(setValueInRange.call($this, value.val(), 0, 100));
                            color.val('v', value.val(), e.target);
                            break;
                          case hex.get(0):
                            hex.val(hex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 6));
                            bindedHex && bindedHex.val(hex.val());
                            color.val('hex', hex.val() != '' ? hex.val() : null, e.target);
                            break;
                          case bindedHex && bindedHex.get(0):
                            bindedHex.val(bindedHex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 6));
                            hex.val(bindedHex.val());
                            color.val('hex', bindedHex.val() != '' ? bindedHex.val() : null, e.target);
                            break;
                          case ahex && ahex.get(0):
                            ahex.val(ahex.val().replace(/[^a-fA-F0-9]/g, '').toLowerCase().substring(0, 2));
                            color.val('a', ahex.val() != null ? parseInt(ahex.val(), 16) : null, e.target);
                            break;
                        }
                      },
                    blur = // input box blur - reset to original if value empty
                      function(e)
                      {
                        if (color.val() != null)
                        {
                          switch (e.target)
                          {
                            case red.get(0): red.val(color.val('r')); break;
                            case green.get(0): green.val(color.val('g')); break;
                            case blue.get(0): blue.val(color.val('b')); break;
                            case alpha && alpha.get(0): alpha.val(Math.precision((color.val('a') * 100) / 255, alphaPrecision)); break;
                            case hue.get(0): hue.val(color.val('h')); break;
                            case saturation.get(0): saturation.val(color.val('s')); break;
                            case value.get(0): value.val(color.val('v')); break;
                            case hex.get(0):
                            case bindedHex && bindedHex.get(0):
                              hex.val(color.val('hex'));
                              bindedHex && bindedHex.val(color.val('hex'));
                              break;
                            case ahex && ahex.get(0): ahex.val(color.val('ahex').substring(6)); break;
                          }
                        }
                      },
                    validateKey = // validate key
                      function(e)
                      {
                        switch(e.keyCode)
                        {
                          case 9:
                          case 16:
                          case 29:
                          case 37:
                          case 39:
                            return false;
                          case 'c'.charCodeAt():
                          case 'v'.charCodeAt():
                            if (e.ctrlKey) return false;
                        }
                        return true;
                      },
                    setValueInRange = // constrain value within range
                      function(value, min, max)
                      {
                        if (value == '' || isNaN(value)) return min;
                        if (value > max) return max;
                        if (value < min) return min;
                        return value;
                      },
                    colorChanged =
                      function(ui, context)
                      {
                        var all = ui.val('all');
                        if (context != red.get(0)) red.val(all != null ? all.r : '');
                        if (context != green.get(0)) green.val(all != null ? all.g : '');
                        if (context != blue.get(0)) blue.val(all != null ? all.b : '');
                        if (alpha && context != alpha.get(0)) alpha.val(all != null ? Math.precision((all.a * 100) / 255, alphaPrecision) : '');
                        if (context != hue.get(0)) hue.val(all != null ? all.h : '');
                        if (context != saturation.get(0)) saturation.val(all != null ? all.s : '');
                        if (context != value.get(0)) value.val(all != null ? all.v : '');
                        if (context != hex.get(0) && (bindedHex && context != bindedHex.get(0) || !bindedHex)) hex.val(all != null ? all.hex : '');
                        if (bindedHex && context != bindedHex.get(0) && context != hex.get(0)) bindedHex.val(all != null ? all.hex : '');
                        if (ahex && context != ahex.get(0)) ahex.val(all != null ? all.ahex.substring(6) : '');
                      },
                    destroy =
                      function()
                      {
                        // unbind all events and null objects
                        red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).unbind('keyup', keyUp).unbind('blur', blur);
                        red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).unbind('keydown', keyDown);
                        color.unbind(colorChanged);
                        red = null;
                        green = null;
                        blue = null;
                        alpha = null;
                        hue = null;
                        saturation = null;
                        value = null;
                        hex = null;
                        ahex = null;
                      };
                  $.extend(true, $this, // public properties and methods
                    {
                      destroy: destroy
                    });
                  red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).add(hex).add(bindedHex).add(ahex).bind('keyup', keyUp).bind('blur', blur);
                  red.add(green).add(blue).add(alpha).add(hue).add(saturation).add(value).bind('keydown', keyDown);
                  color.bind(colorChanged);
                };
            $.jPicker =
              {
                List: [], // array holding references to each active instance of the control
                Color: // color object - we will be able to assign by any color space type or retrieve any color space info
                       // we want this public so we can optionally assign new color objects to initial values using inputs other than a string hex value (also supported)
                  function(init)
                  {
                    var $this = this,
                      r,
                      g,
                      b,
                      a,
                      h,
                      s,
                      v,
                      changeEvents = new Array(),
                      fireChangeEvents = 
                        function(context)
                        {
                          for (var i = 0; i < changeEvents.length; i++) changeEvents[i].call($this, $this, context);
                        },
                      val =
                        function(name, value, context)
                        {
                          // Kind of ugly
                          var set = Boolean(value);
                          if (set && value.ahex === "") value.ahex = "00000000";
                          if (!set)
                          {
                            if (name === undefined || name == null || name == '') name = 'all';
                            if (r == null) return null;
                            switch (name.toLowerCase())
                            {
                              case 'ahex': return ColorMethods.rgbaToHex({ r: r, g: g, b: b, a: a });
                              case 'hex': return val('ahex').substring(0, 6);
                              case 'all': return { r: r, g: g, b: b, a: a, h: h, s: s, v: v, hex: val.call($this, 'hex'), ahex: val.call($this, 'ahex') };
                              default:
                                var ret={};
                                for (var i = 0; i < name.length; i++)
                                {
                                  switch (name.charAt(i))
                                  {
                                    case 'r':
                                      if (name.length == 1) ret = r;
                                      else ret.r = r;
                                      break;
                                    case 'g':
                                      if (name.length == 1) ret = g;
                                      else ret.g = g;
                                      break;
                                    case 'b':
                                      if (name.length == 1) ret = b;
                                      else ret.b = b;
                                      break;
                                    case 'a':
                                      if (name.length == 1) ret = a;
                                      else ret.a = a;
                                      break;
                                    case 'h':
                                      if (name.length == 1) ret = h;
                                      else ret.h = h;
                                      break;
                                    case 's':
                                      if (name.length == 1) ret = s;
                                      else ret.s = s;
                                      break;
                                    case 'v':
                                      if (name.length == 1) ret = v;
                                      else ret.v = v;
                                      break;
                                  }
                                }
                                return ret == {} ? val.call($this, 'all') : ret;
                                break;
                            }
                          }
                          if (context != null && context == $this) return;
                          var changed = false;
                          if (name == null) name = '';
                          if (value == null)
                          {
                            if (r != null)
                            {
                              r = null;
                              changed = true;
                            }
                            if (g != null)
                            {
                              g = null;
                              changed = true;
                            }
                            if (b != null)
                            {
                              b = null;
                              changed = true;
                            }
                            if (a != null)
                            {
                              a = null;
                              changed = true;
                            }
                            if (h != null)
                            {
                              h = null;
                              changed = true;
                            }
                            if (s != null)
                            {
                              s = null;
                              changed = true;
                            }
                            if (v != null)
                            {
                              v = null;
                              changed = true;
                            }
                            changed && fireChangeEvents.call($this, context || $this);
                            return;
                          }
                          switch (name.toLowerCase())
                          {
                            case 'ahex':
                            case 'hex':
                              var ret = ColorMethods.hexToRgba(value && (value.ahex || value.hex) || value || 'none');
          
                              val.call($this, 'rgba', { r: ret.r, g: ret.g, b: ret.b, a: name == 'ahex' ? ret.a : a != null ? a : 255 }, context);
                              break;
                            default:
                              if (value && (value.ahex != null || value.hex != null))
                              {
                                val.call($this, 'ahex', value.ahex || value.hex || '00000000', context);
                                return;
                              }
                              var newV = {}, rgb = false, hsv = false;
                              if (value.r !== undefined && !name.indexOf('r') == -1) name += 'r';
                              if (value.g !== undefined && !name.indexOf('g') == -1) name += 'g';
                              if (value.b !== undefined && !name.indexOf('b') == -1) name += 'b';
                              if (value.a !== undefined && !name.indexOf('a') == -1) name += 'a';
                              if (value.h !== undefined && !name.indexOf('h') == -1) name += 'h';
                              if (value.s !== undefined && !name.indexOf('s') == -1) name += 's';
                              if (value.v !== undefined && !name.indexOf('v') == -1) name += 'v';
                              for (var i = 0; i < name.length; i++)
                              {
                                switch (name.charAt(i))
                                {
                                  case 'r':
                                    if (hsv) continue;
                                    rgb = true;
                                    newV.r = value && value.r && value.r | 0 || value && value | 0 || 0;
                                    if (newV.r < 0) newV.r = 0;
                                    else if (newV.r > 255) newV.r = 255;
                                    if (r != newV.r)
                                    {
                                      r = newV.r;
                                      changed = true;
                                    }
                                    break;
                                  case 'g':
                                    if (hsv) continue;
                                    rgb = true;
                                    newV.g = value && value.g && value.g | 0 || value && value | 0 || 0;
                                    if (newV.g < 0) newV.g = 0;
                                    else if (newV.g > 255) newV.g = 255;
                                    if (g != newV.g)
                                    {
                                      g = newV.g;
                                      changed = true;
                                    }
                                    break;
                                  case 'b':
                                    if (hsv) continue;
                                    rgb = true;
                                    newV.b = value && value.b && value.b | 0 || value && value | 0 || 0;
                                    if (newV.b < 0) newV.b = 0;
                                    else if (newV.b > 255) newV.b = 255;
                                    if (b != newV.b)
                                    {
                                      b = newV.b;
                                      changed = true;
                                    }
                                    break;
                                  case 'a':
                                    newV.a = value && value.a != null ? value.a | 0 : value != null ? value | 0 : 255;
                                    if (newV.a < 0) newV.a = 0;
                                    else if (newV.a > 255) newV.a = 255;
                                    if (a != newV.a)
                                    {
                                      a = newV.a;
                                      changed = true;
                                    }
                                    break;
                                  case 'h':
                                    if (rgb) continue;
                                    hsv = true;
                                    newV.h = value && value.h && value.h | 0 || value && value | 0 || 0;
                                    if (newV.h < 0) newV.h = 0;
                                    else if (newV.h > 360) newV.h = 360;
                                    if (h != newV.h)
                                    {
                                      h = newV.h;
                                      changed = true;
                                    }
                                    break;
                                  case 's':
                                    if (rgb) continue;
                                    hsv = true;
                                    newV.s = value && value.s != null ? value.s | 0 : value != null ? value | 0 : 100;
                                    if (newV.s < 0) newV.s = 0;
                                    else if (newV.s > 100) newV.s = 100;
                                    if (s != newV.s)
                                    {
                                      s = newV.s;
                                      changed = true;
                                    }
                                    break;
                                  case 'v':
                                    if (rgb) continue;
                                    hsv = true;
                                    newV.v = value && value.v != null ? value.v | 0 : value != null ? value | 0 : 100;
                                    if (newV.v < 0) newV.v = 0;
                                    else if (newV.v > 100) newV.v = 100;
                                    if (v != newV.v)
                                    {
                                      v = newV.v;
                                      changed = true;
                                    }
                                    break;
                                }
                              }
                              if (changed)
                              {
                                if (rgb)
                                {
                                  r = r || 0;
                                  g = g || 0;
                                  b = b || 0;
                                  var ret = ColorMethods.rgbToHsv({ r: r, g: g, b: b });
                                  h = ret.h;
                                  s = ret.s;
                                  v = ret.v;
                                }
                                else if (hsv)
                                {
                                  h = h || 0;
                                  s = s != null ? s : 100;
                                  v = v != null ? v : 100;
                                  var ret = ColorMethods.hsvToRgb({ h: h, s: s, v: v });
                                  r = ret.r;
                                  g = ret.g;
                                  b = ret.b;
                                }
                                a = a != null ? a : 255;
                                fireChangeEvents.call($this, context || $this);
                              }
                              break;
                          }
                        },
                      bind =
                        function(callback)
                        {
                          if ($.isFunction(callback)) changeEvents.push(callback);
                        },
                      unbind =
                        function(callback)
                        {
                          if (!$.isFunction(callback)) return;
                          var i;
                          while ((i = $.inArray(callback, changeEvents)) != -1) changeEvents.splice(i, 1);
                        },
                      destroy =
                        function()
                        {
                          changeEvents = null;
                        }
                    $.extend(true, $this, // public properties and methods
                      {
                        val: val,
                        bind: bind,
                        unbind: unbind,
                        destroy: destroy
                      });
                    if (init)
                    {
                      if (init.ahex != null) val('ahex', init);
                      else if (init.hex != null) val((init.a != null ? 'a' : '') + 'hex', init.a != null ? { ahex: init.hex + ColorMethods.intToHex(init.a) } : init);
                      else if (init.r != null && init.g != null && init.b != null) val('rgb' + (init.a != null ? 'a' : ''), init);
                      else if (init.h != null && init.s != null && init.v != null) val('hsv' + (init.a != null ? 'a' : ''), init);
                    }
                  },
                ColorMethods: // color conversion methods  - make public to give use to external scripts
                  {
                    hexToRgba:
                      function(hex)
                      {
                        if (hex === '' || hex === 'none') return { r: null, g: null, b: null, a: null };
                        hex = this.validateHex(hex);
                        var r = '00', g = '00', b = '00', a = '255';
                        if (hex.length == 6) hex += 'ff';
                        if (hex.length > 6)
                        {
                          r = hex.substring(0, 2);
                          g = hex.substring(2, 4);
                          b = hex.substring(4, 6);
                          a = hex.substring(6, hex.length);
                        }
                        else
                        {
                          if (hex.length > 4)
                          {
                            r = hex.substring(4, hex.length);
                            hex = hex.substring(0, 4);
                          }
                          if (hex.length > 2)
                          {
                            g = hex.substring(2, hex.length);
                            hex = hex.substring(0, 2);
                          }
                          if (hex.length > 0) b = hex.substring(0, hex.length);
                        }
                        return { r: this.hexToInt(r), g: this.hexToInt(g), b: this.hexToInt(b), a: this.hexToInt(a) };
                      },
                    validateHex:
                      function(hex)
                      {
                        //if (typeof hex === "object") return "";
                        hex = hex.toLowerCase().replace(/[^a-f0-9]/g, '');
                        if (hex.length > 8) hex = hex.substring(0, 8);
                        return hex;
                      },
                    rgbaToHex:
                      function(rgba)
                      {
                        return this.intToHex(rgba.r) + this.intToHex(rgba.g) + this.intToHex(rgba.b) + this.intToHex(rgba.a);
                      },
                    intToHex:
                      function(dec)
                      {
                        var result = (dec | 0).toString(16);
                        if (result.length == 1) result = ('0' + result);
                        return result.toLowerCase();
                      },
                    hexToInt:
                      function(hex)
                      {
                        return parseInt(hex, 16);
                      },
                    rgbToHsv:
                      function(rgb)
                      {
                        var r = rgb.r / 255, g = rgb.g / 255, b = rgb.b / 255, hsv = { h: 0, s: 0, v: 0 }, min = 0, max = 0, delta;
                        if (r >= g && r >= b)
                        {
                          max = r;
                          min = g > b ? b : g;
                        }
                        else if (g >= b && g >= r)
                        {
                          max = g;
                          min = r > b ? b : r;
                        }
                        else
                        {
                          max = b;
                          min = g > r ? r : g;
                        }
                        hsv.v = max;
                        hsv.s = max ? (max - min) / max : 0;
                        if (!hsv.s) hsv.h = 0;
                        else
                        {
                          delta = max - min;
                          if (r == max) hsv.h = (g - b) / delta;
                          else if (g == max) hsv.h = 2 + (b - r) / delta;
                          else hsv.h = 4 + (r - g) / delta;
                          hsv.h = parseInt(hsv.h * 60);
                          if (hsv.h < 0) hsv.h += 360;
                        }
                        hsv.s = (hsv.s * 100) | 0;
                        hsv.v = (hsv.v * 100) | 0;
                        return hsv;
                      },
                    hsvToRgb:
                      function(hsv)
                      {
                        var rgb = { r: 0, g: 0, b: 0, a: 100 }, h = hsv.h, s = hsv.s, v = hsv.v;
                        if (s == 0)
                        {
                          if (v == 0) rgb.r = rgb.g = rgb.b = 0;
                          else rgb.r = rgb.g = rgb.b = (v * 255 / 100) | 0;
                        }
                        else
                        {
                          if (h == 360) h = 0;
                          h /= 60;
                          s = s / 100;
                          v = v / 100;
                          var i = h | 0,
                              f = h - i,
                              p = v * (1 - s),
                              q = v * (1 - (s * f)),
                              t = v * (1 - (s * (1 - f)));
                          switch (i)
                          {
                            case 0:
                              rgb.r = v;
                              rgb.g = t;
                              rgb.b = p;
                              break;
                            case 1:
                              rgb.r = q;
                              rgb.g = v;
                              rgb.b = p;
                              break;
                            case 2:
                              rgb.r = p;
                              rgb.g = v;
                              rgb.b = t;
                              break;
                            case 3:
                              rgb.r = p;
                              rgb.g = q;
                              rgb.b = v;
                              break;
                            case 4:
                              rgb.r = t;
                              rgb.g = p;
                              rgb.b = v;
                              break;
                            case 5:
                              rgb.r = v;
                              rgb.g = p;
                              rgb.b = q;
                              break;
                          }
                          rgb.r = (rgb.r * 255) | 0;
                          rgb.g = (rgb.g * 255) | 0;
                          rgb.b = (rgb.b * 255) | 0;
                        }
                        return rgb;
                      }
                  }
              };
            var Color = $.jPicker.Color, List = $.jPicker.List, ColorMethods = $.jPicker.ColorMethods; // local copies for YUI compressor
            $.fn.jPicker =
              function(options)
              {
                var $arguments = arguments;
                return this.each(
                  function()
                  {
                    var $this = this, settings = $.extend(true, {}, $.fn.jPicker.defaults, options); // local copies for YUI compressor
                    if ($($this).get(0).nodeName.toLowerCase() == 'input') // Add color picker icon if binding to an input element and bind the events to the input
                    {
                      $.extend(true, settings,
                        {
                          window:
                          {
                            bindToInput: true,
                            expandable: true,
                            input: $($this)
                          }
                        });
                      if($($this).val()=='')
                      {
                        settings.color.active = new Color({ hex: null });
                        settings.color.current = new Color({ hex: null });
                      }
                      else if (ColorMethods.validateHex($($this).val()))
                      {
                        settings.color.active = new Color({ hex: $($this).val(), a: settings.color.active.val('a') });
                        settings.color.current = new Color({ hex: $($this).val(), a: settings.color.active.val('a') });
                      }
                    }
                    if (settings.window.expandable)
                      $($this).after('<span class="jPicker"><span class="Icon"><span class="Color">&nbsp;</span><span class="Alpha">&nbsp;</span><span class="Image" title="Click To Open Color Picker">&nbsp;</span><span class="Container">&nbsp;</span></span></span>');
                    else settings.window.liveUpdate = false; // Basic control binding for inline use - You will need to override the liveCallback or commitCallback function to retrieve results
                    var isLessThanIE7 = parseFloat(navigator.appVersion.split('MSIE')[1]) < 7 && document.body.filters, // needed to run the AlphaImageLoader function for IE6
                      container = null,
                      colorMapDiv = null,
                      colorBarDiv = null,
                      colorMapL1 = null, // different layers of colorMap and colorBar
                      colorMapL2 = null,
                      colorMapL3 = null,
                      colorBarL1 = null,
                      colorBarL2 = null,
                      colorBarL3 = null,
                      colorBarL4 = null,
                      colorBarL5 = null,
                      colorBarL6 = null,
                      colorMap = null, // color maps
                      colorBar = null,
                      colorPicker = null,
                      elementStartX = null, // Used to record the starting css positions for dragging the control
                      elementStartY = null,
                      pageStartX = null, // Used to record the mousedown coordinates for dragging the control
                      pageStartY = null,
                      activePreview = null, // color boxes above the radio buttons
                      currentPreview = null,
                      okButton = null,
                      cancelButton = null,
                      grid = null, // preset colors grid
                      iconColor = null, // iconColor for popup icon
                      iconAlpha = null, // iconAlpha for popup icon
                      iconImage = null, // iconImage popup icon
                      moveBar = null, // drag bar
                      setColorMode = // set color mode and update visuals for the new color mode
                        function(colorMode)
                        {
                          var active = color.active, // local copies for YUI compressor
                            clientPath = images.clientPath,
                            hex = active.val('hex'),
                            rgbMap,
                            rgbBar;
                          settings.color.mode = colorMode;
                          switch (colorMode)
                          {
                            case 'h':
                              setTimeout(
                                function()
                                {
                                  setBG.call($this, colorMapDiv, 'transparent');
                                  setImgLoc.call($this, colorMapL1, 0);
                                  setAlpha.call($this, colorMapL1, 100);
                                  setImgLoc.call($this, colorMapL2, 260);
                                  setAlpha.call($this, colorMapL2, 100);
                                  setBG.call($this, colorBarDiv, 'transparent');
                                  setImgLoc.call($this, colorBarL1, 0);
                                  setAlpha.call($this, colorBarL1, 100);
                                  setImgLoc.call($this, colorBarL2, 260);
                                  setAlpha.call($this, colorBarL2, 100);
                                  setImgLoc.call($this, colorBarL3, 260);
                                  setAlpha.call($this, colorBarL3, 100);
                                  setImgLoc.call($this, colorBarL4, 260);
                                  setAlpha.call($this, colorBarL4, 100);
                                  setImgLoc.call($this, colorBarL6, 260);
                                  setAlpha.call($this, colorBarL6, 100);
                                }, 0);
                              colorMap.range('all', { minX: 0, maxX: 100, minY: 0, maxY: 100 });
                              colorBar.range('rangeY', { minY: 0, maxY: 360 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('s'), y: 100 - active.val('v') }, colorMap);
                              colorBar.val('y', 360 - active.val('h'), colorBar);
                              break;
                            case 's':
                              setTimeout(
                                function()
                                {
                                  setBG.call($this, colorMapDiv, 'transparent');
                                  setImgLoc.call($this, colorMapL1, -260);
                                  setImgLoc.call($this, colorMapL2, -520);
                                  setImgLoc.call($this, colorBarL1, -260);
                                  setImgLoc.call($this, colorBarL2, -520);
                                  setImgLoc.call($this, colorBarL6, 260);
                                  setAlpha.call($this, colorBarL6, 100);
                                }, 0);
                              colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 });
                              colorBar.range('rangeY', { minY: 0, maxY: 100 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('v') }, colorMap);
                              colorBar.val('y', 100 - active.val('s'), colorBar);
                              break;
                            case 'v':
                              setTimeout(
                                function()
                                {
                                  setBG.call($this, colorMapDiv, '000000');
                                  setImgLoc.call($this, colorMapL1, -780);
                                  setImgLoc.call($this, colorMapL2, 260);
                                  setBG.call($this, colorBarDiv, hex);
                                  setImgLoc.call($this, colorBarL1, -520);
                                  setImgLoc.call($this, colorBarL2, 260);
                                  setAlpha.call($this, colorBarL2, 100);
                                  setImgLoc.call($this, colorBarL6, 260);
                                  setAlpha.call($this, colorBarL6, 100);
                                }, 0);
                              colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 });
                              colorBar.range('rangeY', { minY: 0, maxY: 100 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('s') }, colorMap);
                              colorBar.val('y', 100 - active.val('v'), colorBar);
                              break;
                            case 'r':
                              rgbMap = -1040;
                              rgbBar = -780;
                              colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 });
                              colorBar.range('rangeY', { minY: 0, maxY: 255 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('b'), y: 255 - active.val('g') }, colorMap);
                              colorBar.val('y', 255 - active.val('r'), colorBar);
                              break;
                            case 'g':
                              rgbMap = -1560;
                              rgbBar = -1820;
                              colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 });
                              colorBar.range('rangeY', { minY: 0, maxY: 255 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('b'), y: 255 - active.val('r') }, colorMap);
                              colorBar.val('y', 255 - active.val('g'), colorBar);
                              break;
                            case 'b':
                              rgbMap = -2080;
                              rgbBar = -2860;
                              colorMap.range('all', { minX: 0, maxX: 255, minY: 0, maxY: 255 });
                              colorBar.range('rangeY', { minY: 0, maxY: 255 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('r'), y: 255 - active.val('g') }, colorMap);
                              colorBar.val('y', 255 - active.val('b'), colorBar);
                              break;
                            case 'a':
                              setTimeout(
                                function()
                                {
                                  setBG.call($this, colorMapDiv, 'transparent');
                                  setImgLoc.call($this, colorMapL1, -260);
                                  setImgLoc.call($this, colorMapL2, -520);
                                  setImgLoc.call($this, colorBarL1, 260);
                                  setImgLoc.call($this, colorBarL2, 260);
                                  setAlpha.call($this, colorBarL2, 100);
                                  setImgLoc.call($this, colorBarL6, 0);
                                  setAlpha.call($this, colorBarL6, 100);
                                }, 0);
                              colorMap.range('all', { minX: 0, maxX: 360, minY: 0, maxY: 100 });
                              colorBar.range('rangeY', { minY: 0, maxY: 255 });
                              if (active.val('ahex') == null) break;
                              colorMap.val('xy', { x: active.val('h'), y: 100 - active.val('v') }, colorMap);
                              colorBar.val('y', 255 - active.val('a'), colorBar);
                              break;
                            default:
                              throw ('Invalid Mode');
                              break;
                          }
                          switch (colorMode)
                          {
                            case 'h':
                              break;
                            case 's':
                            case 'v':
                            case 'a':
                              setTimeout(
                                function()
                                {
                                  setAlpha.call($this, colorMapL1, 100);
                                  setAlpha.call($this, colorBarL1, 100);
                                  setImgLoc.call($this, colorBarL3, 260);
                                  setAlpha.call($this, colorBarL3, 100);
                                  setImgLoc.call($this, colorBarL4, 260);
                                  setAlpha.call($this, colorBarL4, 100);
                                }, 0);
                              break;
                            case 'r':
                            case 'g':
                            case 'b':
                              setTimeout(
                                function()
                                {
                                  setBG.call($this, colorMapDiv, 'transparent');
                                  setBG.call($this, colorBarDiv, 'transparent');
                                  setAlpha.call($this, colorBarL1, 100);
                                  setAlpha.call($this, colorMapL1, 100);
                                  setImgLoc.call($this, colorMapL1, rgbMap);
                                  setImgLoc.call($this, colorMapL2, rgbMap - 260);
                                  setImgLoc.call($this, colorBarL1, rgbBar - 780);
                                  setImgLoc.call($this, colorBarL2, rgbBar - 520);
                                  setImgLoc.call($this, colorBarL3, rgbBar);
                                  setImgLoc.call($this, colorBarL4, rgbBar - 260);
                                  setImgLoc.call($this, colorBarL6, 260);
                                  setAlpha.call($this, colorBarL6, 100);
                                }, 0);
                              break;
                          }
                          if (active.val('ahex') == null) return;
                          activeColorChanged.call($this, active);
                        },
                      activeColorChanged = // Update color when user changes text values
                        function(ui, context)
                        {
                          if (context == null || (context != colorBar && context != colorMap)) positionMapAndBarArrows.call($this, ui, context);
                          setTimeout(
                            function()
                            {
                              updatePreview.call($this, ui);
                              updateMapVisuals.call($this, ui);
                              updateBarVisuals.call($this, ui);
                            }, 0);
                        },
                      mapValueChanged = // user has dragged the ColorMap pointer
                        function(ui, context)
                        {
                          var active = color.active;
                          if (context != colorMap && active.val() == null) return;
                          var xy = ui.val('all');
                          switch (settings.color.mode)
                          {
                            case 'h':
                              active.val('sv', { s: xy.x, v: 100 - xy.y }, context);
                              break;
                            case 's':
                            case 'a':
                              active.val('hv', { h: xy.x, v: 100 - xy.y }, context);
                              break;
                            case 'v':
                              active.val('hs', { h: xy.x, s: 100 - xy.y }, context);
                              break;
                            case 'r':
                              active.val('gb', { g: 255 - xy.y, b: xy.x }, context);
                              break;
                            case 'g':
                              active.val('rb', { r: 255 - xy.y, b: xy.x }, context);
                              break;
                            case 'b':
                              active.val('rg', { r: xy.x, g: 255 - xy.y }, context);
                              break;
                          }
                        },
                      colorBarValueChanged = // user has dragged the ColorBar slider
                        function(ui, context)
                        {
                          var active = color.active;
                          if (context != colorBar && active.val() == null) return;
                          switch (settings.color.mode)
                          {
                            case 'h':
                              active.val('h', { h: 360 - ui.val('y') }, context);
                              break;
                            case 's':
                              active.val('s', { s: 100 - ui.val('y') }, context);
                              break;
                            case 'v':
                              active.val('v', { v: 100 - ui.val('y') }, context);
                              break;
                            case 'r':
                              active.val('r', { r: 255 - ui.val('y') }, context);
                              break;
                            case 'g':
                              active.val('g', { g: 255 - ui.val('y') }, context);
                              break;
                            case 'b':
                              active.val('b', { b: 255 - ui.val('y') }, context);
                              break;
                            case 'a':
                              active.val('a', 255 - ui.val('y'), context);
                              break;
                          }
                        },
                      positionMapAndBarArrows = // position map and bar arrows to match current color
                        function(ui, context)
                        {
                          if (context != colorMap)
                          {
                            switch (settings.color.mode)
                            {
                              case 'h':
                                var sv = ui.val('sv');
                                colorMap.val('xy', { x: sv != null ? sv.s : 100, y: 100 - (sv != null ? sv.v : 100) }, context);
                                break;
                              case 's':
                              case 'a':
                                var hv = ui.val('hv');
                                colorMap.val('xy', { x: hv && hv.h || 0, y: 100 - (hv != null ? hv.v : 100) }, context);
                                break;
                              case 'v':
                                var hs = ui.val('hs');
                                colorMap.val('xy', { x: hs && hs.h || 0, y: 100 - (hs != null ? hs.s : 100) }, context);
                                break;
                              case 'r':
                                var bg = ui.val('bg');
                                colorMap.val('xy', { x: bg && bg.b || 0, y: 255 - (bg && bg.g || 0) }, context);
                                break;
                              case 'g':
                                var br = ui.val('br');
                                colorMap.val('xy', { x: br && br.b || 0, y: 255 - (br && br.r || 0) }, context);
                                break;
                              case 'b':
                                var rg = ui.val('rg');
                                colorMap.val('xy', { x: rg && rg.r || 0, y: 255 - (rg && rg.g || 0) }, context);
                                break;
                            }
                          }
                          if (context != colorBar)
                          {
                            switch (settings.color.mode)
                            {
                              case 'h':
                                colorBar.val('y', 360 - (ui.val('h') || 0), context);
                                break;
                              case 's':
                                var s = ui.val('s');
                                colorBar.val('y', 100 - (s != null ? s : 100), context);
                                break;
                              case 'v':
                                var v = ui.val('v');
                                colorBar.val('y', 100 - (v != null ? v : 100), context);
                                break;
                              case 'r':
                                colorBar.val('y', 255 - (ui.val('r') || 0), context);
                                break;
                              case 'g':
                                colorBar.val('y', 255 - (ui.val('g') || 0), context);
                                break;
                              case 'b':
                                colorBar.val('y', 255 - (ui.val('b') || 0), context);
                                break;
                              case 'a':
                                var a = ui.val('a');
                                colorBar.val('y', 255 - (a != null ? a : 255), context);
                                break;
                            }
                          }
                        },
                      updatePreview =
                        function(ui)
                        {
                          try
                          {
                            var all = ui.val('all');
                            activePreview.css({ backgroundColor: all && '#' + all.hex || 'transparent' });
                            setAlpha.call($this, activePreview, all && Math.precision((all.a * 100) / 255, 4) || 0);
                          }
                          catch (e) { }
                        },
                      updateMapVisuals =
                        function(ui)
                        {
                          switch (settings.color.mode)
                          {
                            case 'h':
                              setBG.call($this, colorMapDiv, new Color({ h: ui.val('h') || 0, s: 100, v: 100 }).val('hex'));
                              break;
                            case 's':
                            case 'a':
                              var s = ui.val('s');
                              setAlpha.call($this, colorMapL2, 100 - (s != null ? s : 100));
                              break;
                            case 'v':
                              var v = ui.val('v');
                              setAlpha.call($this, colorMapL1, v != null ? v : 100);
                              break;
                            case 'r':
                              setAlpha.call($this, colorMapL2, Math.precision((ui.val('r') || 0) / 255 * 100, 4));
                              break;
                            case 'g':
                              setAlpha.call($this, colorMapL2, Math.precision((ui.val('g') || 0) / 255 * 100, 4));
                              break;
                            case 'b':
                              setAlpha.call($this, colorMapL2, Math.precision((ui.val('b') || 0) / 255 * 100));
                              break;
                          }
                          var a = ui.val('a');
                          setAlpha.call($this, colorMapL3, Math.precision(((255 - (a || 0)) * 100) / 255, 4));
                        },
                      updateBarVisuals =
                        function(ui)
                        {
                          switch (settings.color.mode)
                          {
                            case 'h':
                              var a = ui.val('a');
                              setAlpha.call($this, colorBarL5, Math.precision(((255 - (a || 0)) * 100) / 255, 4));
                              break;
                            case 's':
                              var hva = ui.val('hva'),
                                  saturatedColor = new Color({ h: hva && hva.h || 0, s: 100, v: hva != null ? hva.v : 100 });
                              setBG.call($this, colorBarDiv, saturatedColor.val('hex'));
                              setAlpha.call($this, colorBarL2, 100 - (hva != null ? hva.v : 100));
                              setAlpha.call($this, colorBarL5, Math.precision(((255 - (hva && hva.a || 0)) * 100) / 255, 4));
                              break;
                            case 'v':
                              var hsa = ui.val('hsa'),
                                  valueColor = new Color({ h: hsa && hsa.h || 0, s: hsa != null ? hsa.s : 100, v: 100 });
                              setBG.call($this, colorBarDiv, valueColor.val('hex'));
                              setAlpha.call($this, colorBarL5, Math.precision(((255 - (hsa && hsa.a || 0)) * 100) / 255, 4));
                              break;
                            case 'r':
                            case 'g':
                            case 'b':
                              var hValue = 0, vValue = 0, rgba = ui.val('rgba');
                              if (settings.color.mode == 'r')
                              {
                                hValue = rgba && rgba.b || 0;
                                vValue = rgba && rgba.g || 0;
                              }
                              else if (settings.color.mode == 'g')
                              {
                                hValue = rgba && rgba.b || 0;
                                vValue = rgba && rgba.r || 0;
                              }
                              else if (settings.color.mode == 'b')
                              {
                                hValue = rgba && rgba.r || 0;
                                vValue = rgba && rgba.g || 0;
                              }
                              var middle = vValue > hValue ? hValue : vValue;
                              setAlpha.call($this, colorBarL2, hValue > vValue ? Math.precision(((hValue - vValue) / (255 - vValue)) * 100, 4) : 0);
                              setAlpha.call($this, colorBarL3, vValue > hValue ? Math.precision(((vValue - hValue) / (255 - hValue)) * 100, 4) : 0);
                              setAlpha.call($this, colorBarL4, Math.precision((middle / 255) * 100, 4));
                              setAlpha.call($this, colorBarL5, Math.precision(((255 - (rgba && rgba.a || 0)) * 100) / 255, 4));
                              break;
                            case 'a':
                              var a = ui.val('a');
                              setBG.call($this, colorBarDiv, ui.val('hex') || '000000');
                              setAlpha.call($this, colorBarL5, a != null ? 0 : 100);
                              setAlpha.call($this, colorBarL6, a != null ? 100 : 0);
                              break;
                          }
                        },
                      setBG =
                        function(el, c)
                        {
                          el.css({ backgroundColor: c && c.length == 6 && '#' + c || 'transparent' });
                        },
                      setImg =
                        function(img, src)
                        {
                          if (isLessThanIE7 && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1))
                          {
                            img.attr('pngSrc', src);
                            img.css({ backgroundImage: 'none', filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')' });
                          }
                          else img.css({ backgroundImage: 'url(\'' + src + '\')' });
                        },
                      setImgLoc =
                        function(img, y)
                        {
                          img.css({ top: y + 'px' });
                        },
                      setAlpha =
                        function(obj, alpha)
                        {
                          obj.css({ visibility: alpha > 0 ? 'visible' : 'hidden' });
                          if (alpha > 0 && alpha < 100)
                          {
                            if (isLessThanIE7)
                            {
                              var src = obj.attr('pngSrc');
                              if (src != null && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1))
                                obj.css({ filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\') progid:DXImageTransform.Microsoft.Alpha(opacity=' + alpha + ')' });
                              else obj.css({ opacity: Math.precision(alpha / 100, 4) });
                            }
                            else obj.css({ opacity: Math.precision(alpha / 100, 4) });
                          }
                          else if (alpha == 0 || alpha == 100)
                          {
                            if (isLessThanIE7)
                            {
                              var src = obj.attr('pngSrc');
                              if (src != null && (src.indexOf('AlphaBar.png') != -1 || src.indexOf('Bars.png') != -1 || src.indexOf('Maps.png') != -1))
                                obj.css({ filter: 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + src + '\', sizingMethod=\'scale\')' });
                              else obj.css({ opacity: '' });
                            }
                            else obj.css({ opacity: '' });
                          }
                        },
                      revertColor = // revert color to original color when opened
                        function()
                        {
                          color.active.val('ahex', color.current.val('ahex'));
                        },
                      commitColor = // commit the color changes
                        function()
                        {
                          color.current.val('ahex', color.active.val('ahex'));
                        },
                      radioClicked =
                        function(e)
                        {
                          $(this).parents('tbody:first').find('input:radio[value!="'+e.target.value+'"]').removeAttr('checked');
                          setColorMode.call($this, e.target.value);
                        },
                      currentClicked =
                        function()
                        {
                          revertColor.call($this);
                        },
                      cancelClicked =
                        function()
                        {
                          revertColor.call($this);
                          settings.window.expandable && hide.call($this);
                          $.isFunction(cancelCallback) && cancelCallback.call($this, color.active, cancelButton);
                        },
                      okClicked =
                        function()
                        {
                          commitColor.call($this);
                          settings.window.expandable && hide.call($this);
                          $.isFunction(commitCallback) && commitCallback.call($this, color.active, okButton);
                        },
                      iconImageClicked =
                        function()
                        {
                          show.call($this);
                        },
                      currentColorChanged =
                        function(ui, context)
                        {
                          var hex = ui.val('hex');
                          currentPreview.css({ backgroundColor: hex && '#' + hex || 'transparent' });
                          setAlpha.call($this, currentPreview, Math.precision(((ui.val('a') || 0) * 100) / 255, 4));
                        },
                      expandableColorChanged =
                        function(ui, context)
                        {
                          var hex = ui.val('hex');
                          var va = ui.val('va');
                          iconColor.css({ backgroundColor: hex && '#' + hex || 'transparent' });
                          setAlpha.call($this, iconAlpha, Math.precision(((255 - (va && va.a || 0)) * 100) / 255, 4));
                          if (settings.window.bindToInput&&settings.window.updateInputColor)
                            settings.window.input.css(
                              {
                                backgroundColor: hex && '#' + hex || 'transparent',
                                color: va == null || va.v > 75 ? '#000000' : '#ffffff'
                              });
                        },
                      moveBarMouseDown =
                        function(e)
                        {
                          var element = settings.window.element, // local copies for YUI compressor
                            page = settings.window.page;
                          elementStartX = parseInt(container.css('left'));
                          elementStartY = parseInt(container.css('top'));
                          pageStartX = e.pageX;
                          pageStartY = e.pageY;
                          // bind events to document to move window - we will unbind these on mouseup
                          $(document).bind('mousemove', documentMouseMove).bind('mouseup', documentMouseUp);
                          e.preventDefault(); // prevent attempted dragging of the column
                        },
                      documentMouseMove =
                        function(e)
                        {
                          container.css({ left: elementStartX - (pageStartX - e.pageX) + 'px', top: elementStartY - (pageStartY - e.pageY) + 'px' });
                          if (settings.window.expandable && !$.support.boxModel) container.prev().css({ left: container.css("left"), top: container.css("top") });
                          e.stopPropagation();
                          e.preventDefault();
                          return false;
                        },
                      documentMouseUp =
                        function(e)
                        {
                          $(document).unbind('mousemove', documentMouseMove).unbind('mouseup', documentMouseUp);
                          e.stopPropagation();
                          e.preventDefault();
                          return false;
                        },
                      quickPickClicked =
                        function(e)
                        {
                          e.preventDefault();
                          e.stopPropagation();
                          color.active.val('ahex', $(this).attr('title') || null, e.target);
                          return false;
                        },
                      commitCallback = $.isFunction($arguments[1]) && $arguments[1] || null,
                      liveCallback = $.isFunction($arguments[2]) && $arguments[2] || null,
                      cancelCallback = $.isFunction($arguments[3]) && $arguments[3] || null,
                      show =
                        function()
                        {
                          color.current.val('ahex', color.active.val('ahex'));
                          var attachIFrame = function()
                            {
                              if (!settings.window.expandable || $.support.boxModel) return;
                              var table = container.find('table:first');
                              container.before('<iframe/>');
                              container.prev().css({ width: table.width(), height: container.height(), opacity: 0, position: 'absolute', left: container.css("left"), top: container.css("top") });
                            };
                          if (settings.window.expandable)
                          {
                            $(document.body).children('div.jPicker.Container').css({zIndex:10});
                            container.css({zIndex:20});
                          }
                          switch (settings.window.effects.type)
                          {
                            case 'fade':
                              container.fadeIn(settings.window.effects.speed.show, attachIFrame);
                              break;
                            case 'slide':
                              container.slideDown(settings.window.effects.speed.show, attachIFrame);
                              break;
                            case 'show':
                            default:
                              container.show(settings.window.effects.speed.show, attachIFrame);
                              break;
                          }
                        },
                      hide =
                        function()
                        {
                          var removeIFrame = function()
                            {
                              if (settings.window.expandable) container.css({ zIndex: 10 });
                              if (!settings.window.expandable || $.support.boxModel) return;
                              container.prev().remove();
                            };
                          switch (settings.window.effects.type)
                          {
                            case 'fade':
                              container.fadeOut(settings.window.effects.speed.hide, removeIFrame);
                              break;
                            case 'slide':
                              container.slideUp(settings.window.effects.speed.hide, removeIFrame);
                              break;
                            case 'show':
                            default:
                              container.hide(settings.window.effects.speed.hide, removeIFrame);
                              break;
                          }
                        },
                      initialize =
                        function()
                        {
                          var win = settings.window,
                              popup = win.expandable ? $($this).next().find('.Container:first') : null;
                          container = win.expandable ? $('<div/>') : $($this);
                          container.addClass('jPicker Container');
                          if (win.expandable) container.hide();
                          container.get(0).onselectstart = function(event){ if (event.target.nodeName.toLowerCase() !== 'input') return false; };
                          // inject html source code - we are using a single table for this control - I know tables are considered bad, but it takes care of equal height columns and
                          // this control really is tabular data, so I believe it is the right move
                          var all = color.active.val('all');
                          if (win.alphaPrecision < 0) win.alphaPrecision = 0;
                          else if (win.alphaPrecision > 2) win.alphaPrecision = 2;
                          var controlHtml='<table class="jPicker" cellpadding="0" cellspacing="0"><tbody>' + (win.expandable ? '<tr><td class="Move" colspan="5">&nbsp;</td></tr>' : '') + '<tr><td rowspan="9"><h2 class="Title">' + (win.title || localization.text.title) + '</h2><div class="Map"><span class="Map1">&nbsp;</span><span class="Map2">&nbsp;</span><span class="Map3">&nbsp;</span><img src="' + images.clientPath + images.colorMap.arrow.file + '" class="Arrow"/></div></td><td rowspan="9"><div class="Bar"><span class="Map1">&nbsp;</span><span class="Map2">&nbsp;</span><span class="Map3">&nbsp;</span><span class="Map4">&nbsp;</span><span class="Map5">&nbsp;</span><span class="Map6">&nbsp;</span><img src="' + images.clientPath + images.colorBar.arrow.file + '" class="Arrow"/></div></td><td colspan="2" class="Preview">' + localization.text.newColor + '<div><span class="Active" title="' + localization.tooltips.colors.newColor + '">&nbsp;</span><span class="Current" title="' + localization.tooltips.colors.currentColor + '">&nbsp;</span></div>' + localization.text.currentColor + '</td><td rowspan="9" class="Button"><input type="button" class="Ok" value="' + localization.text.ok + '" title="' + localization.tooltips.buttons.ok + '"/><input type="button" class="Cancel" value="' + localization.text.cancel + '" title="' + localization.tooltips.buttons.cancel + '"/><hr/><div class="Grid">&nbsp;</div></td></tr><tr class="Hue"><td class="Radio"><label title="' + localization.tooltips.hue.radio + '"><input type="radio" value="h"' + (settings.color.mode == 'h' ? ' checked="checked"' : '') + '/>H:</label></td><td class="Text"><input type="text" maxlength="3" value="' + (all != null ? all.h : '') + '" title="' + localization.tooltips.hue.textbox + '"/>&nbsp;&deg;</td></tr><tr class="Saturation"><td class="Radio"><label title="' + localization.tooltips.saturation.radio + '"><input type="radio" value="s"' + (settings.color.mode == 's' ? ' checked="checked"' : '') + '/>S:</label></td><td class="Text"><input type="text" maxlength="3" value="' + (all != null ? all.s : '') + '" title="' + localization.tooltips.saturation.textbox + '"/>&nbsp;%</td></tr><tr class="Value"><td class="Radio"><label title="' + localization.tooltips.value.radio + '"><input type="radio" value="v"' + (settings.color.mode == 'v' ? ' checked="checked"' : '') + '/>V:</label><br/><br/></td><td class="Text"><input type="text" maxlength="3" value="' + (all != null ? all.v : '') + '" title="' + localization.tooltips.value.textbox + '"/>&nbsp;%<br/><br/></td></tr><tr class="Red"><td class="Radio"><label title="' + localization.tooltips.red.radio + '"><input type="radio" value="r"' + (settings.color.mode == 'r' ? ' checked="checked"' : '') + '/>R:</label></td><td class="Text"><input type="text" maxlength="3" value="' + (all != null ? all.r : '') + '" title="' + localization.tooltips.red.textbox + '"/></td></tr><tr class="Green"><td class="Radio"><label title="' + localization.tooltips.green.radio + '"><input type="radio" value="g"' + (settings.color.mode == 'g' ? ' checked="checked"' : '') + '/>G:</label></td><td class="Text"><input type="text" maxlength="3" value="' + (all != null ? all.g : '') + '" title="' + localization.tooltips.green.textbox + '"/></td></tr><tr class="Blue"><td class="Radio"><label title="' + localization.tooltips.blue.radio + '"><input type="radio" value="b"' + (settings.color.mode == 'b' ? ' checked="checked"' : '') + '/>B:</label></td><td class="Text"><input type="text" maxlength="3" value="' + (all != null ? all.b : '') + '" title="' + localization.tooltips.blue.textbox + '"/></td></tr><tr class="Alpha"><td class="Radio">' + (win.alphaSupport ? '<label title="' + localization.tooltips.alpha.radio + '"><input type="radio" value="a"' + (settings.color.mode == 'a' ? ' checked="checked"' : '') + '/>A:</label>' : '&nbsp;') + '</td><td class="Text">' + (win.alphaSupport ? '<input type="text" maxlength="' + (3 + win.alphaPrecision) + '" value="' + (all != null ? Math.precision((all.a * 100) / 255, win.alphaPrecision) : '') + '" title="' + localization.tooltips.alpha.textbox + '"/>&nbsp;%' : '&nbsp;') + '</td></tr><tr class="Hex"><td colspan="2" class="Text"><label title="' + localization.tooltips.hex.textbox + '">#:<input type="text" maxlength="6" class="Hex" value="' + (all != null ? all.hex : '') + '"/></label>' + (win.alphaSupport ? '<input type="text" maxlength="2" class="AHex" value="' + (all != null ? all.ahex.substring(6) : '') + '" title="' + localization.tooltips.hex.alpha + '"/></td>' : '&nbsp;') + '</tr></tbody></table>';
                          if (win.expandable)
                          {
                            container.html(controlHtml);
                            if($(document.body).children('div.jPicker.Container').length==0)$(document.body).prepend(container);
                            else $(document.body).children('div.jPicker.Container:last').after(container);
                            container.mousedown(
                              function()
                              {
                                $(document.body).children('div.jPicker.Container').css({zIndex:10});
                                container.css({zIndex:20});
                              });
                            container.css( // positions must be set and display set to absolute before source code injection or IE will size the container to fit the window
                              {
                                left:
                                  win.position.x == 'left' ? (popup.offset().left - 530 - (win.position.y == 'center' ? 25 : 0)) + 'px' :
                                  win.position.x == 'center' ? (popup.offset().left - 260) + 'px' :
                                  win.position.x == 'right' ? (popup.offset().left - 10 + (win.position.y == 'center' ? 25 : 0)) + 'px' :
                                  win.position.x == 'screenCenter' ? (($(document).width() >> 1) - 260) + 'px' : (popup.offset().left + parseInt(win.position.x)) + 'px',
                                position: 'absolute',
                                top: win.position.y == 'top' ? (popup.offset().top - 312) + 'px' :
                                     win.position.y == 'center' ? (popup.offset().top - 156) + 'px' :
                                     win.position.y == 'bottom' ? (popup.offset().top + 25) + 'px' : (popup.offset().top + parseInt(win.position.y)) + 'px'
                              });
                          }
                          else
                          {
                            container = $($this);
                            container.html(controlHtml);
                          }
                          // initialize the objects to the source code just injected
                          var tbody = container.find('tbody:first');
                          colorMapDiv = tbody.find('div.Map:first');
                          colorBarDiv = tbody.find('div.Bar:first');
                          var MapMaps = colorMapDiv.find('span'),
                              BarMaps = colorBarDiv.find('span');
                          colorMapL1 = MapMaps.filter('.Map1:first');
                          colorMapL2 = MapMaps.filter('.Map2:first');
                          colorMapL3 = MapMaps.filter('.Map3:first');
                          colorBarL1 = BarMaps.filter('.Map1:first');
                          colorBarL2 = BarMaps.filter('.Map2:first');
                          colorBarL3 = BarMaps.filter('.Map3:first');
                          colorBarL4 = BarMaps.filter('.Map4:first');
                          colorBarL5 = BarMaps.filter('.Map5:first');
                          colorBarL6 = BarMaps.filter('.Map6:first');
                          // create color pickers and maps
                          colorMap = new Slider(colorMapDiv,
                            {
                              map:
                              {
                                width: images.colorMap.width,
                                height: images.colorMap.height
                              },
                              arrow:
                              {
                                image: images.clientPath + images.colorMap.arrow.file,
                                width: images.colorMap.arrow.width,
                                height: images.colorMap.arrow.height
                              }
                            });
                          colorMap.bind(mapValueChanged);
                          colorBar = new Slider(colorBarDiv,
                            {
                              map:
                              {
                                width: images.colorBar.width,
                                height: images.colorBar.height
                              },
                              arrow:
                              {
                                image: images.clientPath + images.colorBar.arrow.file,
                                width: images.colorBar.arrow.width,
                                height: images.colorBar.arrow.height
                              }
                            });
                          colorBar.bind(colorBarValueChanged);
                          colorPicker = new ColorValuePicker(tbody, color.active, win.expandable && win.bindToInput ? win.input : null, win.alphaPrecision);
                          var hex = all != null ? all.hex : null,
                              preview = tbody.find('.Preview'),
                              button = tbody.find('.Button');
                          activePreview = preview.find('.Active:first').css({ backgroundColor: hex && '#' + hex || 'transparent' });
                          currentPreview = preview.find('.Current:first').css({ backgroundColor: hex && '#' + hex || 'transparent' }).bind('click', currentClicked);
                          setAlpha.call($this, currentPreview, Math.precision(color.current.val('a') * 100) / 255, 4);
                          okButton = button.find('.Ok:first').bind('click', okClicked);
                          cancelButton = button.find('.Cancel:first').bind('click', cancelClicked);
                          grid = button.find('.Grid:first');
                          setTimeout(
                            function()
                            {
                              setImg.call($this, colorMapL1, images.clientPath + 'Maps.png');
                              setImg.call($this, colorMapL2, images.clientPath + 'Maps.png');
                              setImg.call($this, colorMapL3, images.clientPath + 'map-opacity.png');
                              setImg.call($this, colorBarL1, images.clientPath + 'Bars.png');
                              setImg.call($this, colorBarL2, images.clientPath + 'Bars.png');
                              setImg.call($this, colorBarL3, images.clientPath + 'Bars.png');
                              setImg.call($this, colorBarL4, images.clientPath + 'Bars.png');
                              setImg.call($this, colorBarL5, images.clientPath + 'bar-opacity.png');
                              setImg.call($this, colorBarL6, images.clientPath + 'AlphaBar.png');
                              setImg.call($this, preview.find('div:first'), images.clientPath + 'preview-opacity.png');
                            }, 0);
                          tbody.find('td.Radio input').bind('click', radioClicked);
                          // initialize quick list
                          if (color.quickList && color.quickList.length > 0)
                          {
                            var html = '';
                            for (i = 0; i < color.quickList.length; i++)
                            {
                              /* if default colors are hex strings, change them to color objects */
                              if ((typeof (color.quickList[i])).toString().toLowerCase() == 'string') color.quickList[i] = new Color({ hex: color.quickList[i] });
                              var alpha = color.quickList[i].val('a');
                              var ahex = color.quickList[i].val('ahex');
                              if (!win.alphaSupport && ahex) ahex = ahex.substring(0, 6) + 'ff';
                              var quickHex = color.quickList[i].val('hex');
                              if(!ahex) ahex = "00000000";
                              html+='<span class="QuickColor"' + (ahex && ' title="#' + ahex + '"' || 'none') + ' style="background-color:' + (quickHex && '#' + quickHex || '') + ';' + (quickHex ? '' : 'background-image:url(' + images.clientPath + 'NoColor.png)') + (win.alphaSupport && alpha && alpha < 255 ? ';opacity:' + Math.precision(alpha / 255, 4) + ';filter:Alpha(opacity=' + Math.precision(alpha / 2.55, 4) + ')' : '') + '">&nbsp;</span>';
                            }
                            setImg.call($this, grid, images.clientPath + 'bar-opacity.png');
                            grid.html(html);
                            grid.find('.QuickColor').click(quickPickClicked);
                          }
                          setColorMode.call($this, settings.color.mode);
                          color.active.bind(activeColorChanged);
                          $.isFunction(liveCallback) && color.active.bind(liveCallback);
                          color.current.bind(currentColorChanged);
                          // bind to input
                          if (win.expandable)
                          {
                            $this.icon = popup.parents('.Icon:first');
                            iconColor = $this.icon.find('.Color:first').css({ backgroundColor: hex && '#' + hex || 'transparent' });
                            iconAlpha = $this.icon.find('.Alpha:first');
                            setImg.call($this, iconAlpha, images.clientPath + 'bar-opacity.png');
                            setAlpha.call($this, iconAlpha, Math.precision(((255 - (all != null ? all.a : 0)) * 100) / 255, 4));
                            iconImage = $this.icon.find('.Image:first').css(
                              {
                                backgroundImage: 'url(\'' + images.clientPath + images.picker.file + '\')'
                              }).bind('click', iconImageClicked);
                            if (win.bindToInput&&win.updateInputColor)
                              win.input.css(
                                {
                                  backgroundColor: hex && '#' + hex || 'transparent',
                                  color: all == null || all.v > 75 ? '#000000' : '#ffffff'
                                });
                            moveBar = tbody.find('.Move:first').bind('mousedown', moveBarMouseDown);
                            color.active.bind(expandableColorChanged);
                          }
                          else show.call($this);
                        },
                      destroy =
                        function()
                        {
                          container.find('td.Radio input').unbind('click', radioClicked);
                          currentPreview.unbind('click', currentClicked);
                          cancelButton.unbind('click', cancelClicked);
                          okButton.unbind('click', okClicked);
                          if (settings.window.expandable)
                          {
                            iconImage.unbind('click', iconImageClicked);
                            moveBar.unbind('mousedown', moveBarMouseDown);
                            $this.icon = null;
                          }
                          container.find('.QuickColor').unbind('click', quickPickClicked);
                          colorMapDiv = null;
                          colorBarDiv = null;
                          colorMapL1 = null;
                          colorMapL2 = null;
                          colorMapL3 = null;
                          colorBarL1 = null;
                          colorBarL2 = null;
                          colorBarL3 = null;
                          colorBarL4 = null;
                          colorBarL5 = null;
                          colorBarL6 = null;
                          colorMap.destroy();
                          colorMap = null;
                          colorBar.destroy();
                          colorBar = null;
                          colorPicker.destroy();
                          colorPicker = null;
                          activePreview = null;
                          currentPreview = null;
                          okButton = null;
                          cancelButton = null;
                          grid = null;
                          commitCallback = null;
                          cancelCallback = null;
                          liveCallback = null;
                          container.html('');
                          for (i = 0; i < List.length; i++) if (List[i] == $this) List.splice(i, 1);
                        },
                      images = settings.images, // local copies for YUI compressor
                      localization = settings.localization,
                      color =
                        {
                          active: (typeof(settings.color.active)).toString().toLowerCase() == 'string' ? new Color({ ahex: !settings.window.alphaSupport && settings.color.active ? settings.color.active.substring(0, 6) + 'ff' : settings.color.active }) : new Color({ ahex: !settings.window.alphaSupport && settings.color.active.val('ahex') ? settings.color.active.val('ahex').substring(0, 6) + 'ff' : settings.color.active.val('ahex') }),
                          current: (typeof(settings.color.active)).toString().toLowerCase() == 'string' ? new Color({ ahex: !settings.window.alphaSupport && settings.color.active ? settings.color.active.substring(0, 6) + 'ff' : settings.color.active }) : new Color({ ahex: !settings.window.alphaSupport && settings.color.active.val('ahex') ? settings.color.active.val('ahex').substring(0, 6) + 'ff' : settings.color.active.val('ahex') }),
                          quickList: settings.color.quickList
                        };
                    $.extend(true, $this, // public properties, methods, and callbacks
                      {
                        commitCallback: commitCallback, // commitCallback function can be overridden to return the selected color to a method you specify when the user clicks "OK"
                        liveCallback: liveCallback, // liveCallback function can be overridden to return the selected color to a method you specify in live mode (continuous update)
                        cancelCallback: cancelCallback, // cancelCallback function can be overridden to a method you specify when the user clicks "Cancel"
                        color: color,
                        show: show,
                        hide: hide,
                        destroy: destroy // destroys this control entirely, removing all events and objects, and removing itself from the List
                      });
                    List.push($this);
                    setTimeout(
                      function()
                      {
                        initialize.call($this);
                      }, 0);
                  });
              };
            $.fn.jPicker.defaults = /* jPicker defaults - you can change anything in this section (such as the clientPath to your images) without fear of breaking the program */
                {
                window:
                  {
                    title: null, /* any title for the jPicker window itself - displays "Drag Markers To Pick A Color" if left null */
                    effects:
                    {
                      type: 'slide', /* effect used to show/hide an expandable picker. Acceptable values "slide", "show", "fade" */
                      speed:
                      {
                        show: 'slow', /* duration of "show" effect. Acceptable values are "fast", "slow", or time in ms */
                        hide: 'fast' /* duration of "hide" effect. Acceptable values are "fast", "slow", or time in ms */
                      }
                    },
                    position:
                    {
                      x: 'screenCenter', /* acceptable values "left", "center", "right", "screenCenter", or relative px value */
                      y: 'top' /* acceptable values "top", "bottom", "center", or relative px value */
                    },
                    expandable: false, /* default to large static picker - set to true to make an expandable picker (small icon with popup) - set automatically when binded to input element */
                    liveUpdate: true, /* set false if you want the user to have to click "OK" before the binded input box updates values (always "true" for expandable picker) */
                    alphaSupport: false, /* set to true to enable alpha picking */
                    alphaPrecision: 0, /* set decimal precision for alpha percentage display - hex codes do not map directly to percentage integers - range 0-2 */
                    updateInputColor: true /* set to false to prevent binded input colors from changing */
                  },
                color:
                  {
                    mode: 'h', /* acceptabled values "h" (hue), "s" (saturation), "v" (value), "r" (red), "g" (green), "b" (blue), "a" (alpha) */
                    active: new Color({ ahex: '#ffcc00ff' }), /* acceptable values are any declared $.jPicker.Color object or string HEX value (e.g. #ffc000) WITH OR WITHOUT the "#" prefix */
                    quickList: /* the quick pick color list */
                      [
                        new Color({ h: 360, s: 33, v: 100 }), /* acceptable values are any declared $.jPicker.Color object or string HEX value (e.g. #ffc000) WITH OR WITHOUT the "#" prefix */
                        new Color({ h: 360, s: 66, v: 100 }),
                        new Color({ h: 360, s: 100, v: 100 }),
                        new Color({ h: 360, s: 100, v: 75 }),
                        new Color({ h: 360, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 100 }),
                        new Color({ h: 30, s: 33, v: 100 }),
                        new Color({ h: 30, s: 66, v: 100 }),
                        new Color({ h: 30, s: 100, v: 100 }),
                        new Color({ h: 30, s: 100, v: 75 }),
                        new Color({ h: 30, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 90 }),
                        new Color({ h: 60, s: 33, v: 100 }),
                        new Color({ h: 60, s: 66, v: 100 }),
                        new Color({ h: 60, s: 100, v: 100 }),
                        new Color({ h: 60, s: 100, v: 75 }),
                        new Color({ h: 60, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 80 }),
                        new Color({ h: 90, s: 33, v: 100 }),
                        new Color({ h: 90, s: 66, v: 100 }),
                        new Color({ h: 90, s: 100, v: 100 }),
                        new Color({ h: 90, s: 100, v: 75 }),
                        new Color({ h: 90, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 70 }),
                        new Color({ h: 120, s: 33, v: 100 }),
                        new Color({ h: 120, s: 66, v: 100 }),
                        new Color({ h: 120, s: 100, v: 100 }),
                        new Color({ h: 120, s: 100, v: 75 }),
                        new Color({ h: 120, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 60 }),
                        new Color({ h: 150, s: 33, v: 100 }),
                        new Color({ h: 150, s: 66, v: 100 }),
                        new Color({ h: 150, s: 100, v: 100 }),
                        new Color({ h: 150, s: 100, v: 75 }),
                        new Color({ h: 150, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 50 }),
                        new Color({ h: 180, s: 33, v: 100 }),
                        new Color({ h: 180, s: 66, v: 100 }),
                        new Color({ h: 180, s: 100, v: 100 }),
                        new Color({ h: 180, s: 100, v: 75 }),
                        new Color({ h: 180, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 40 }),
                        new Color({ h: 210, s: 33, v: 100 }),
                        new Color({ h: 210, s: 66, v: 100 }),
                        new Color({ h: 210, s: 100, v: 100 }),
                        new Color({ h: 210, s: 100, v: 75 }),
                        new Color({ h: 210, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 30 }),
                        new Color({ h: 240, s: 33, v: 100 }),
                        new Color({ h: 240, s: 66, v: 100 }),
                        new Color({ h: 240, s: 100, v: 100 }),
                        new Color({ h: 240, s: 100, v: 75 }),
                        new Color({ h: 240, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 20 }),
                        new Color({ h: 270, s: 33, v: 100 }),
                        new Color({ h: 270, s: 66, v: 100 }),
                        new Color({ h: 270, s: 100, v: 100 }),
                        new Color({ h: 270, s: 100, v: 75 }),
                        new Color({ h: 270, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 10 }),
                        new Color({ h: 300, s: 33, v: 100 }),
                        new Color({ h: 300, s: 66, v: 100 }),
                        new Color({ h: 300, s: 100, v: 100 }),
                        new Color({ h: 300, s: 100, v: 75 }),
                        new Color({ h: 300, s: 100, v: 50 }),
                        new Color({ h: 180, s: 0, v: 0 }),
                        new Color({ h: 330, s: 33, v: 100 }),
                        new Color({ h: 330, s: 66, v: 100 }),
                        new Color({ h: 330, s: 100, v: 100 }),
                        new Color({ h: 330, s: 100, v: 75 }),
                        new Color({ h: 330, s: 100, v: 50 }),
                        new Color()
                      ]
                  },
                images:
                  {
                    clientPath: '/jPicker/images/', /* Path to image files */
                    colorMap:
                    {
                      width: 256,
                      height: 256,
                      arrow:
                      {
                        file: 'mappoint.gif', /* ColorMap arrow icon */
                        width: 15,
                        height: 15
                      }
                    },
                    colorBar:
                    {
                      width: 20,
                      height: 256,
                      arrow:
                      {
                        file: 'rangearrows.gif', /* ColorBar arrow icon */
                        width: 20,
                        height: 7
                      }
                    },
                    picker:
                    {
                      file: 'picker.gif', /* Color Picker icon */
                      width: 25,
                      height: 24
                    }
                  },
                localization: /* alter these to change the text presented by the picker (e.g. different language) */
                  {
                    text:
                    {
                      title: 'Drag Markers To Pick A Color',
                      newColor: 'new',
                      currentColor: 'current',
                      ok: 'OK',
                      cancel: 'Cancel'
                    },
                    tooltips:
                    {
                      colors:
                      {
                        newColor: 'New Color - Press &ldquo;OK&rdquo; To Commit',
                        currentColor: 'Click To Revert To Original Color'
                      },
                      buttons:
                      {
                        ok: 'Commit To This Color Selection',
                        cancel: 'Cancel And Revert To Original Color'
                      },
                      hue:
                      {
                        radio: 'Set To &ldquo;Hue&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Hue&rdquo; Value (0-360&deg;)'
                      },
                      saturation:
                      {
                        radio: 'Set To &ldquo;Saturation&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Saturation&rdquo; Value (0-100%)'
                      },
                      value:
                      {
                        radio: 'Set To &ldquo;Value&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Value&rdquo; Value (0-100%)'
                      },
                      red:
                      {
                        radio: 'Set To &ldquo;Red&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Red&rdquo; Value (0-255)'
                      },
                      green:
                      {
                        radio: 'Set To &ldquo;Green&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Green&rdquo; Value (0-255)'
                      },
                      blue:
                      {
                        radio: 'Set To &ldquo;Blue&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Blue&rdquo; Value (0-255)'
                      },
                      alpha:
                      {
                        radio: 'Set To &ldquo;Alpha&rdquo; Color Mode',
                        textbox: 'Enter A &ldquo;Alpha&rdquo; Value (0-100)'
                      },
                      hex:
                      {
                        textbox: 'Enter A &ldquo;Hex&rdquo; Color Value (#000000-#ffffff)',
                        alpha: 'Enter A &ldquo;Alpha&rdquo; Value (#00-#ff)'
                      }
                    }
                  }
              };
          })(jQuery, '1.1.6');
        • jpicker.min.js
          (function(e,a){Math.precision=function(j,h){if(h===undefined){h=0}return Math.round(j*Math.pow(10,h))/Math.pow(10,h)};var d=function(z,k){var o=this,j=z.find("img:first"),F=0,E=100,w=100,D=0,C=100,v=100,s=0,p=0,n,q,u=new Array(),l=function(y){for(var x=0;x<u.length;x++){u[x].call(o,o,y)}},H=function(x){var y=z.offset();n={l:y.left|0,t:y.top|0};clearTimeout(q);q=setTimeout(function(){A.call(o,x)},0);e(document).bind("mousemove",h).bind("mouseup",B);x.preventDefault()},h=function(x){clearTimeout(q);q=setTimeout(function(){A.call(o,x)},0);x.stopPropagation();x.preventDefault();return false},B=function(x){e(document).unbind("mouseup",B).unbind("mousemove",h);x.stopPropagation();x.preventDefault();return false},A=function(M){var K=M.pageX-n.l,x=M.pageY-n.t,L=z.w,y=z.h;if(K<0){K=0}else{if(K>L){K=L}}if(x<0){x=0}else{if(x>y){x=y}}J.call(o,"xy",{x:((K/L)*w)+F,y:((x/y)*v)+D})},r=function(){var L=0,x=0,N=z.w,K=z.h,M=j.w,y=j.h;setTimeout(function(){if(w>0){if(s==E){L=N}else{L=((s/w)*N)|0}}if(v>0){if(p==C){x=K}else{x=((p/v)*K)|0}}if(M>=N){L=(N>>1)-(M>>1)}else{L-=M>>1}if(y>=K){x=(K>>1)-(y>>1)}else{x-=y>>1}j.css({left:L+"px",top:x+"px"})},0)},J=function(x,K,y){var O=K!==undefined;if(!O){if(x===undefined||x==null){x="xy"}switch(x.toLowerCase()){case"x":return s;case"y":return p;case"xy":default:return{x:s,y:p}}}if(y!=null&&y==o){return}var N=false,M,L;if(x==null){x="xy"}switch(x.toLowerCase()){case"x":M=K&&(K.x&&K.x|0||K|0)||0;break;case"y":L=K&&(K.y&&K.y|0||K|0)||0;break;case"xy":default:M=K&&K.x&&K.x|0||0;L=K&&K.y&&K.y|0||0;break}if(M!=null){if(M<F){M=F}else{if(M>E){M=E}}if(s!=M){s=M;N=true}}if(L!=null){if(L<D){L=D}else{if(L>C){L=C}}if(p!=L){p=L;N=true}}N&&l.call(o,y||o)},t=function(x,L){var P=L!==undefined;if(!P){if(x===undefined||x==null){x="all"}switch(x.toLowerCase()){case"minx":return F;case"maxx":return E;case"rangex":return{minX:F,maxX:E,rangeX:w};case"miny":return D;case"maxy":return C;case"rangey":return{minY:D,maxY:C,rangeY:v};case"all":default:return{minX:F,maxX:E,rangeX:w,minY:D,maxY:C,rangeY:v}}}var O=false,N,K,M,y;if(x==null){x="all"}switch(x.toLowerCase()){case"minx":N=L&&(L.minX&&L.minX|0||L|0)||0;break;case"maxx":K=L&&(L.maxX&&L.maxX|0||L|0)||0;break;case"rangex":N=L&&L.minX&&L.minX|0||0;K=L&&L.maxX&&L.maxX|0||0;break;case"miny":M=L&&(L.minY&&L.minY|0||L|0)||0;break;case"maxy":y=L&&(L.maxY&&L.maxY|0||L|0)||0;break;case"rangey":M=L&&L.minY&&L.minY|0||0;y=L&&L.maxY&&L.maxY|0||0;break;case"all":default:N=L&&L.minX&&L.minX|0||0;K=L&&L.maxX&&L.maxX|0||0;M=L&&L.minY&&L.minY|0||0;y=L&&L.maxY&&L.maxY|0||0;break}if(N!=null&&F!=N){F=N;w=E-F}if(K!=null&&E!=K){E=K;w=E-F}if(M!=null&&D!=M){D=M;v=C-D}if(y!=null&&C!=y){C=y;v=C-D}},I=function(x){if(e.isFunction(x)){u.push(x)}},m=function(y){if(!e.isFunction(y)){return}var x;while((x=e.inArray(y,u))!=-1){u.splice(x,1)}},G=function(){e(document).unbind("mouseup",B).unbind("mousemove",h);z.unbind("mousedown",H);z=null;j=null;u=null};e.extend(true,o,{val:J,range:t,bind:I,unbind:m,destroy:G});j.src=k.arrow&&k.arrow.image;j.w=k.arrow&&k.arrow.width||j.width();j.h=k.arrow&&k.arrow.height||j.height();z.w=k.map&&k.map.width||z.width();z.h=k.map&&k.map.height||z.height();z.bind("mousedown",H);I.call(o,r)},b=function(u,z,k,y){var q=this,l=u.find("td.Text input"),r=l.eq(3),v=l.eq(4),h=l.eq(5),o=l.length>7?l.eq(6):null,n=l.eq(0),p=l.eq(1),x=l.eq(2),s=l.eq(l.length>7?7:6),B=l.length>7?l.eq(8):null,w=function(D){if(D.target.value==""&&D.target!=s.get(0)&&(k!=null&&D.target!=k.get(0)||k==null)){return}if(!t(D)){return D}switch(D.target){case r.get(0):r.val(j.call(q,r.val(),0,255));z.val("r",r.val(),D.target);break;case v.get(0):v.val(j.call(q,v.val(),0,255));z.val("g",v.val(),D.target);break;case h.get(0):h.val(j.call(q,h.val(),0,255));z.val("b",h.val(),D.target);break;case o&&o.get(0):o.val(j.call(q,o.val(),0,100));z.val("a",Math.precision((o.val()*255)/100,y),D.target);break;case n.get(0):n.val(j.call(q,n.val(),0,360));z.val("h",n.val(),D.target);break;case p.get(0):p.val(j.call(q,p.val(),0,100));z.val("s",p.val(),D.target);break;case x.get(0):x.val(j.call(q,x.val(),0,100));z.val("v",x.val(),D.target);break;case s.get(0):s.val(s.val().replace(/[^a-fA-F0-9]/g,"").toLowerCase().substring(0,6));k&&k.val(s.val());z.val("hex",s.val()!=""?s.val():null,D.target);break;case k&&k.get(0):k.val(k.val().replace(/[^a-fA-F0-9]/g,"").toLowerCase().substring(0,6));s.val(k.val());z.val("hex",k.val()!=""?k.val():null,D.target);break;case B&&B.get(0):B.val(B.val().replace(/[^a-fA-F0-9]/g,"").toLowerCase().substring(0,2));z.val("a",B.val()!=null?parseInt(B.val(),16):null,D.target);break}},A=function(D){if(z.val()!=null){switch(D.target){case r.get(0):r.val(z.val("r"));break;case v.get(0):v.val(z.val("g"));break;case h.get(0):h.val(z.val("b"));break;case o&&o.get(0):o.val(Math.precision((z.val("a")*100)/255,y));break;case n.get(0):n.val(z.val("h"));break;case p.get(0):p.val(z.val("s"));break;case x.get(0):x.val(z.val("v"));break;case s.get(0):case k&&k.get(0):s.val(z.val("hex"));k&&k.val(z.val("hex"));break;case B&&B.get(0):B.val(z.val("ahex").substring(6));break}}},t=function(D){switch(D.keyCode){case 9:case 16:case 29:case 37:case 38:case 40:return false;case"c".charCodeAt():case"v".charCodeAt():if(D.ctrlKey){return false}}return true},j=function(F,E,D){if(F==""||isNaN(F)){return E}if(F>D){return D}if(F<E){return E}return F},m=function(F,D){var E=F.val("all");if(D!=r.get(0)){r.val(E!=null?E.r:"")}if(D!=v.get(0)){v.val(E!=null?E.g:"")}if(D!=h.get(0)){h.val(E!=null?E.b:"")}if(o&&D!=o.get(0)){o.val(E!=null?Math.precision((E.a*100)/255,y):"")}if(D!=n.get(0)){n.val(E!=null?E.h:"")}if(D!=p.get(0)){p.val(E!=null?E.s:"")}if(D!=x.get(0)){x.val(E!=null?E.v:"")}if(D!=s.get(0)&&(k&&D!=k.get(0)||!k)){s.val(E!=null?E.hex:"")}if(k&&D!=k.get(0)&&D!=s.get(0)){k.val(E!=null?E.hex:"")}if(B&&D!=B.get(0)){B.val(E!=null?E.ahex.substring(6):"")}},C=function(){r.add(v).add(h).add(o).add(n).add(p).add(x).add(s).add(k).add(B).unbind("keyup",w).unbind("blur",A);z.unbind(m);r=null;v=null;h=null;o=null;n=null;p=null;x=null;s=null;B=null};e.extend(true,q,{destroy:C});r.add(v).add(h).add(o).add(n).add(p).add(x).add(s).add(k).add(B).bind("keyup",w).bind("blur",A);z.bind(m)};e.jPicker={List:[],Color:function(z){var q=this,j,o,t,u,n,A,x,k=new Array(),m=function(r){for(var h=0;h<k.length;h++){k[h].call(q,q,r)}},l=function(h,G,r){var F=G!==undefined;if(!F){if(h===undefined||h==null||h==""){h="all"}if(j==null){return null}switch(h.toLowerCase()){case"ahex":return g.rgbaToHex({r:j,g:o,b:t,a:u});case"hex":return l("ahex").substring(0,6);case"all":return{r:j,g:o,b:t,a:u,h:n,s:A,v:x,hex:l.call(q,"hex"),ahex:l.call(q,"ahex")};default:var D={};for(var B=0;B<h.length;B++){switch(h.charAt(B)){case"r":if(h.length==1){D=j}else{D.r=j}break;case"g":if(h.length==1){D=o}else{D.g=o}break;case"b":if(h.length==1){D=t}else{D.b=t}break;case"a":if(h.length==1){D=u}else{D.a=u}break;case"h":if(h.length==1){D=n}else{D.h=n}break;case"s":if(h.length==1){D=A}else{D.s=A}break;case"v":if(h.length==1){D=x}else{D.v=x}break}}return D=={}?l.call(q,"all"):D;break}}if(r!=null&&r==q){return}var v=false;if(h==null){h=""}if(G==null){if(j!=null){j=null;v=true}if(o!=null){o=null;v=true}if(t!=null){t=null;v=true}if(u!=null){u=null;v=true}if(n!=null){n=null;v=true}if(A!=null){A=null;v=true}if(x!=null){x=null;v=true}v&&m.call(q,r||q);return}switch(h.toLowerCase()){case"ahex":case"hex":var D=g.hexToRgba(G&&(G.ahex||G.hex)||G||"00000000");l.call(q,"rgba",{r:D.r,g:D.g,b:D.b,a:h=="ahex"?D.a:u!=null?u:255},r);break;default:if(G&&(G.ahex!=null||G.hex!=null)){l.call(q,"ahex",G.ahex||G.hex||"00000000",r);return}var s={},E=false,C=false;if(G.r!==undefined&&!h.indexOf("r")==-1){h+="r"}if(G.g!==undefined&&!h.indexOf("g")==-1){h+="g"}if(G.b!==undefined&&!h.indexOf("b")==-1){h+="b"}if(G.a!==undefined&&!h.indexOf("a")==-1){h+="a"}if(G.h!==undefined&&!h.indexOf("h")==-1){h+="h"}if(G.s!==undefined&&!h.indexOf("s")==-1){h+="s"}if(G.v!==undefined&&!h.indexOf("v")==-1){h+="v"}for(var B=0;B<h.length;B++){switch(h.charAt(B)){case"r":if(C){continue}E=true;s.r=G&&G.r&&G.r|0||G&&G|0||0;if(s.r<0){s.r=0}else{if(s.r>255){s.r=255}}if(j!=s.r){j=s.r;v=true}break;case"g":if(C){continue}E=true;s.g=G&&G.g&&G.g|0||G&&G|0||0;if(s.g<0){s.g=0}else{if(s.g>255){s.g=255}}if(o!=s.g){o=s.g;v=true}break;case"b":if(C){continue}E=true;s.b=G&&G.b&&G.b|0||G&&G|0||0;if(s.b<0){s.b=0}else{if(s.b>255){s.b=255}}if(t!=s.b){t=s.b;v=true}break;case"a":s.a=G&&G.a!=null?G.a|0:G!=null?G|0:255;if(s.a<0){s.a=0}else{if(s.a>255){s.a=255}}if(u!=s.a){u=s.a;v=true}break;case"h":if(E){continue}C=true;s.h=G&&G.h&&G.h|0||G&&G|0||0;if(s.h<0){s.h=0}else{if(s.h>360){s.h=360}}if(n!=s.h){n=s.h;v=true}break;case"s":if(E){continue}C=true;s.s=G&&G.s!=null?G.s|0:G!=null?G|0:100;if(s.s<0){s.s=0}else{if(s.s>100){s.s=100}}if(A!=s.s){A=s.s;v=true}break;case"v":if(E){continue}C=true;s.v=G&&G.v!=null?G.v|0:G!=null?G|0:100;if(s.v<0){s.v=0}else{if(s.v>100){s.v=100}}if(x!=s.v){x=s.v;v=true}break}}if(v){if(E){j=j||0;o=o||0;t=t||0;var D=g.rgbToHsv({r:j,g:o,b:t});n=D.h;A=D.s;x=D.v}else{if(C){n=n||0;A=A!=null?A:100;x=x!=null?x:100;var D=g.hsvToRgb({h:n,s:A,v:x});j=D.r;o=D.g;t=D.b}}u=u!=null?u:255;m.call(q,r||q)}break}},p=function(h){if(e.isFunction(h)){k.push(h)}},y=function(r){if(!e.isFunction(r)){return}var h;while((h=e.inArray(r,k))!=-1){k.splice(h,1)}},w=function(){k=null};e.extend(true,q,{val:l,bind:p,unbind:y,destroy:w});if(z){if(z.ahex!=null){l("ahex",z)}else{if(z.hex!=null){l((z.a!=null?"a":"")+"hex",z.a!=null?{ahex:z.hex+g.intToHex(z.a)}:z)}else{if(z.r!=null&&z.g!=null&&z.b!=null){l("rgb"+(z.a!=null?"a":""),z)}else{if(z.h!=null&&z.s!=null&&z.v!=null){l("hsv"+(z.a!=null?"a":""),z)}}}}}},ColorMethods:{hexToRgba:function(m){m=this.validateHex(m);if(m==""){return{r:null,g:null,b:null,a:null}}var l="00",k="00",h="00",j="255";if(m.length==6){m+="ff"}if(m.length>6){l=m.substring(0,2);k=m.substring(2,4);h=m.substring(4,6);j=m.substring(6,m.length)}else{if(m.length>4){l=m.substring(4,m.length);m=m.substring(0,4)}if(m.length>2){k=m.substring(2,m.length);m=m.substring(0,2)}if(m.length>0){h=m.substring(0,m.length)}}return{r:this.hexToInt(l),g:this.hexToInt(k),b:this.hexToInt(h),a:this.hexToInt(j)}},validateHex:function(h){h=h.toLowerCase().replace(/[^a-f0-9]/g,"");if(h.length>8){h=h.substring(0,8)}return h},rgbaToHex:function(h){return this.intToHex(h.r)+this.intToHex(h.g)+this.intToHex(h.b)+this.intToHex(h.a)},intToHex:function(j){var h=(j|0).toString(16);if(h.length==1){h=("0"+h)}return h.toLowerCase()},hexToInt:function(h){return parseInt(h,16)},rgbToHsv:function(l){var o=l.r/255,n=l.g/255,j=l.b/255,k={h:0,s:0,v:0},m=0,h=0,p;if(o>=n&&o>=j){h=o;m=n>j?j:n}else{if(n>=j&&n>=o){h=n;m=o>j?j:o}else{h=j;m=n>o?o:n}}k.v=h;k.s=h?(h-m)/h:0;if(!k.s){k.h=0}else{p=h-m;if(o==h){k.h=(n-j)/p}else{if(n==h){k.h=2+(j-o)/p}else{k.h=4+(o-n)/p}}k.h=parseInt(k.h*60);if(k.h<0){k.h+=360}}k.s=(k.s*100)|0;k.v=(k.v*100)|0;return k},hsvToRgb:function(n){var r={r:0,g:0,b:0,a:100},m=n.h,x=n.s,u=n.v;if(x==0){if(u==0){r.r=r.g=r.b=0}else{r.r=r.g=r.b=(u*255/100)|0}}else{if(m==360){m=0}m/=60;x=x/100;u=u/100;var l=m|0,o=m-l,k=u*(1-x),j=u*(1-(x*o)),w=u*(1-(x*(1-o)));switch(l){case 0:r.r=u;r.g=w;r.b=k;break;case 1:r.r=j;r.g=u;r.b=k;break;case 2:r.r=k;r.g=u;r.b=w;break;case 3:r.r=k;r.g=j;r.b=u;break;case 4:r.r=w;r.g=k;r.b=u;break;case 5:r.r=u;r.g=k;r.b=j;break}r.r=(r.r*255)|0;r.g=(r.g*255)|0;r.b=(r.b*255)|0}return r}}};var f=e.jPicker.Color,c=e.jPicker.List,g=e.jPicker.ColorMethods;e.fn.jPicker=function(j){var h=arguments;return this.each(function(){var w=this,av=e.extend(true,{},e.fn.jPicker.defaults,j);if(e(w).get(0).nodeName.toLowerCase()=="input"){e.extend(true,av,{window:{bindToInput:true,expandable:true,input:e(w)}});if(e(w).val()==""){av.color.active=new f({hex:null});av.color.current=new f({hex:null})}else{if(g.validateHex(e(w).val())){av.color.active=new f({hex:e(w).val(),a:av.color.active.val("a")});av.color.current=new f({hex:e(w).val(),a:av.color.active.val("a")})}}}if(av.window.expandable){e(w).after('<span class="jPicker"><span class="Icon"><span class="Color">&nbsp;</span><span class="Alpha">&nbsp;</span><span class="Image" title="Click To Open Color Picker">&nbsp;</span><span class="Container">&nbsp;</span></span></span>')}else{av.window.liveUpdate=false}var Q=parseFloat(navigator.appVersion.split("MSIE")[1])<7&&document.body.filters,R=null,l=null,s=null,au=null,at=null,ar=null,P=null,O=null,N=null,M=null,L=null,K=null,D=null,U=null,aw=null,J=null,I=null,am=null,ai=null,E=null,an=null,ah=null,X=null,ab=null,aq=null,r=null,C=null,u=null,ag=function(aB){var aD=G.active,aE=n.clientPath,aA=aD.val("hex"),aC,az;av.color.mode=aB;switch(aB){case"h":setTimeout(function(){y.call(w,l,"transparent");x.call(w,au,0);Y.call(w,au,100);x.call(w,at,260);Y.call(w,at,100);y.call(w,s,"transparent");x.call(w,P,0);Y.call(w,P,100);x.call(w,O,260);Y.call(w,O,100);x.call(w,N,260);Y.call(w,N,100);x.call(w,M,260);Y.call(w,M,100);x.call(w,K,260);Y.call(w,K,100)},0);D.range("all",{minX:0,maxX:100,minY:0,maxY:100});U.range("rangeY",{minY:0,maxY:360});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("s"),y:100-aD.val("v")},D);U.val("y",360-aD.val("h"),U);break;case"s":setTimeout(function(){y.call(w,l,"transparent");x.call(w,au,-260);x.call(w,at,-520);x.call(w,P,-260);x.call(w,O,-520);x.call(w,K,260);Y.call(w,K,100)},0);D.range("all",{minX:0,maxX:360,minY:0,maxY:100});U.range("rangeY",{minY:0,maxY:100});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("h"),y:100-aD.val("v")},D);U.val("y",100-aD.val("s"),U);break;case"v":setTimeout(function(){y.call(w,l,"000000");x.call(w,au,-780);x.call(w,at,260);y.call(w,s,aA);x.call(w,P,-520);x.call(w,O,260);Y.call(w,O,100);x.call(w,K,260);Y.call(w,K,100)},0);D.range("all",{minX:0,maxX:360,minY:0,maxY:100});U.range("rangeY",{minY:0,maxY:100});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("h"),y:100-aD.val("s")},D);U.val("y",100-aD.val("v"),U);break;case"r":aC=-1040;az=-780;D.range("all",{minX:0,maxX:255,minY:0,maxY:255});U.range("rangeY",{minY:0,maxY:255});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("b"),y:255-aD.val("g")},D);U.val("y",255-aD.val("r"),U);break;case"g":aC=-1560;az=-1820;D.range("all",{minX:0,maxX:255,minY:0,maxY:255});U.range("rangeY",{minY:0,maxY:255});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("b"),y:255-aD.val("r")},D);U.val("y",255-aD.val("g"),U);break;case"b":aC=-2080;az=-2860;D.range("all",{minX:0,maxX:255,minY:0,maxY:255});U.range("rangeY",{minY:0,maxY:255});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("r"),y:255-aD.val("g")},D);U.val("y",255-aD.val("b"),U);break;case"a":setTimeout(function(){y.call(w,l,"transparent");x.call(w,au,-260);x.call(w,at,-520);x.call(w,P,260);x.call(w,O,260);Y.call(w,O,100);x.call(w,K,0);Y.call(w,K,100)},0);D.range("all",{minX:0,maxX:360,minY:0,maxY:100});U.range("rangeY",{minY:0,maxY:255});if(aD.val("ahex")==null){break}D.val("xy",{x:aD.val("h"),y:100-aD.val("v")},D);U.val("y",255-aD.val("a"),U);break;default:throw ("Invalid Mode");break}switch(aB){case"h":break;case"s":case"v":case"a":setTimeout(function(){Y.call(w,au,100);Y.call(w,P,100);x.call(w,N,260);Y.call(w,N,100);x.call(w,M,260);Y.call(w,M,100)},0);break;case"r":case"g":case"b":setTimeout(function(){y.call(w,l,"transparent");y.call(w,s,"transparent");Y.call(w,P,100);Y.call(w,au,100);x.call(w,au,aC);x.call(w,at,aC-260);x.call(w,P,az-780);x.call(w,O,az-520);x.call(w,N,az);x.call(w,M,az-260);x.call(w,K,260);Y.call(w,K,100)},0);break}if(aD.val("ahex")==null){return}aj.call(w,aD)},aj=function(aA,az){if(az==null||(az!=U&&az!=D)){v.call(w,aA,az)}setTimeout(function(){ay.call(w,aA);al.call(w,aA);W.call(w,aA)},0)},z=function(aA,az){var aC=G.active;if(az!=D&&aC.val()==null){return}var aB=aA.val("all");switch(av.color.mode){case"h":aC.val("sv",{s:aB.x,v:100-aB.y},az);break;case"s":case"a":aC.val("hv",{h:aB.x,v:100-aB.y},az);break;case"v":aC.val("hs",{h:aB.x,s:100-aB.y},az);break;case"r":aC.val("gb",{g:255-aB.y,b:aB.x},az);break;case"g":aC.val("rb",{r:255-aB.y,b:aB.x},az);break;case"b":aC.val("rg",{r:aB.x,g:255-aB.y},az);break}},ac=function(aA,az){var aB=G.active;if(az!=U&&aB.val()==null){return}switch(av.color.mode){case"h":aB.val("h",{h:360-aA.val("y")},az);break;case"s":aB.val("s",{s:100-aA.val("y")},az);break;case"v":aB.val("v",{v:100-aA.val("y")},az);break;case"r":aB.val("r",{r:255-aA.val("y")},az);break;case"g":aB.val("g",{g:255-aA.val("y")},az);break;case"b":aB.val("b",{b:255-aA.val("y")},az);break;case"a":aB.val("a",255-aA.val("y"),az);break}},v=function(aC,az){if(az!=D){switch(av.color.mode){case"h":var aH=aC.val("sv");D.val("xy",{x:aH!=null?aH.s:100,y:100-(aH!=null?aH.v:100)},az);break;case"s":case"a":var aB=aC.val("hv");D.val("xy",{x:aB&&aB.h||0,y:100-(aB!=null?aB.v:100)},az);break;case"v":var aE=aC.val("hs");D.val("xy",{x:aE&&aE.h||0,y:100-(aE!=null?aE.s:100)},az);break;case"r":var aA=aC.val("bg");D.val("xy",{x:aA&&aA.b||0,y:255-(aA&&aA.g||0)},az);break;case"g":var aI=aC.val("br");D.val("xy",{x:aI&&aI.b||0,y:255-(aI&&aI.r||0)},az);break;case"b":var aG=aC.val("rg");D.val("xy",{x:aG&&aG.r||0,y:255-(aG&&aG.g||0)},az);break}}if(az!=U){switch(av.color.mode){case"h":U.val("y",360-(aC.val("h")||0),az);break;case"s":var aJ=aC.val("s");U.val("y",100-(aJ!=null?aJ:100),az);break;case"v":var aF=aC.val("v");U.val("y",100-(aF!=null?aF:100),az);break;case"r":U.val("y",255-(aC.val("r")||0),az);break;case"g":U.val("y",255-(aC.val("g")||0),az);break;case"b":U.val("y",255-(aC.val("b")||0),az);break;case"a":var aD=aC.val("a");U.val("y",255-(aD!=null?aD:255),az);break}}},ay=function(aA){try{var az=aA.val("all");E.css({backgroundColor:az&&"#"+az.hex||"transparent"});Y.call(w,E,az&&Math.precision((az.a*100)/255,4)||0)}catch(aB){}},al=function(aC){switch(av.color.mode){case"h":y.call(w,l,new f({h:aC.val("h")||0,s:100,v:100}).val("hex"));break;case"s":case"a":var aB=aC.val("s");Y.call(w,at,100-(aB!=null?aB:100));break;case"v":var aA=aC.val("v");Y.call(w,au,aA!=null?aA:100);break;case"r":Y.call(w,at,Math.precision((aC.val("r")||0)/255*100,4));break;case"g":Y.call(w,at,Math.precision((aC.val("g")||0)/255*100,4));break;case"b":Y.call(w,at,Math.precision((aC.val("b")||0)/255*100));break}var az=aC.val("a");Y.call(w,ar,Math.precision(((255-(az||0))*100)/255,4))},W=function(aF){switch(av.color.mode){case"h":var aH=aF.val("a");Y.call(w,L,Math.precision(((255-(aH||0))*100)/255,4));break;case"s":var aA=aF.val("hva"),aB=new f({h:aA&&aA.h||0,s:100,v:aA!=null?aA.v:100});y.call(w,s,aB.val("hex"));Y.call(w,O,100-(aA!=null?aA.v:100));Y.call(w,L,Math.precision(((255-(aA&&aA.a||0))*100)/255,4));break;case"v":var aC=aF.val("hsa"),aE=new f({h:aC&&aC.h||0,s:aC!=null?aC.s:100,v:100});y.call(w,s,aE.val("hex"));Y.call(w,L,Math.precision(((255-(aC&&aC.a||0))*100)/255,4));break;case"r":case"g":case"b":var aD=0,aG=0,az=aF.val("rgba");if(av.color.mode=="r"){aD=az&&az.b||0;aG=az&&az.g||0}else{if(av.color.mode=="g"){aD=az&&az.b||0;aG=az&&az.r||0}else{if(av.color.mode=="b"){aD=az&&az.r||0;aG=az&&az.g||0}}}var aI=aG>aD?aD:aG;Y.call(w,O,aD>aG?Math.precision(((aD-aG)/(255-aG))*100,4):0);Y.call(w,N,aG>aD?Math.precision(((aG-aD)/(255-aD))*100,4):0);Y.call(w,M,Math.precision((aI/255)*100,4));Y.call(w,L,Math.precision(((255-(az&&az.a||0))*100)/255,4));break;case"a":var aH=aF.val("a");y.call(w,s,aF.val("hex")||"000000");Y.call(w,L,aH!=null?0:100);Y.call(w,K,aH!=null?100:0);break}},y=function(az,aA){az.css({backgroundColor:aA&&aA.length==6&&"#"+aA||"transparent"})},t=function(az,aA){if(Q&&(aA.indexOf("AlphaBar.png")!=-1||aA.indexOf("Bars.png")!=-1||aA.indexOf("Maps.png")!=-1)){az.attr("pngSrc",aA);az.css({backgroundImage:"none",filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+aA+"', sizingMethod='scale')"})}else{az.css({backgroundImage:"url("+aA+")"})}},x=function(az,aA){az.css({top:aA+"px"})},Y=function(aA,az){aA.css({visibility:az>0?"visible":"hidden"});if(az>0&&az<100){if(Q){var aB=aA.attr("pngSrc");if(aB!=null&&(aB.indexOf("AlphaBar.png")!=-1||aB.indexOf("Bars.png")!=-1||aB.indexOf("Maps.png")!=-1)){aA.css({filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+aB+"', sizingMethod='scale') progid:DXImageTransform.Microsoft.Alpha(opacity="+az+")"})}else{aA.css({opacity:Math.precision(az/100,4)})}}else{aA.css({opacity:Math.precision(az/100,4)})}}else{if(az==0||az==100){if(Q){var aB=aA.attr("pngSrc");if(aB!=null&&(aB.indexOf("AlphaBar.png")!=-1||aB.indexOf("Bars.png")!=-1||aB.indexOf("Maps.png")!=-1)){aA.css({filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+aB+"', sizingMethod='scale')"})}else{aA.css({opacity:""})}}else{aA.css({opacity:""})}}}},B=function(){G.active.val("ahex",G.current.val("ahex"))},T=function(){G.current.val("ahex",G.active.val("ahex"))},A=function(az){e(this).parents("tbody:first").find('input:radio[value!="'+az.target.value+'"]').removeAttr("checked");ag.call(w,az.target.value)},Z=function(){B.call(w)},q=function(){B.call(w);av.window.expandable&&ao.call(w);e.isFunction(ax)&&ax.call(w,G.active,X)},m=function(){T.call(w);av.window.expandable&&ao.call(w);e.isFunction(ae)&&ae.call(w,G.active,ah)},af=function(){V.call(w)},ap=function(aB,az){var aA=aB.val("hex");an.css({backgroundColor:aA&&"#"+aA||"transparent"});Y.call(w,an,Math.precision(((aB.val("a")||0)*100)/255,4))},H=function(aC,az){var aB=aC.val("hex");var aA=aC.val("va");aq.css({backgroundColor:aB&&"#"+aB||"transparent"});Y.call(w,r,Math.precision(((255-(aA&&aA.a||0))*100)/255,4));if(av.window.bindToInput&&av.window.updateInputColor){av.window.input.css({backgroundColor:aB&&"#"+aB||"transparent",color:aA==null||aA.v>75?"#000000":"#ffffff"})}},S=function(aB){var az=av.window.element,aA=av.window.page;J=parseInt(R.css("left"));I=parseInt(R.css("top"));am=aB.pageX;ai=aB.pageY;e(document).bind("mousemove",k).bind("mouseup",p);aB.preventDefault()},k=function(az){R.css({left:J-(am-az.pageX)+"px",top:I-(ai-az.pageY)+"px"});if(av.window.expandable&&!e.support.boxModel){R.prev().css({left:R.css("left"),top:R.css("top")})}az.stopPropagation();az.preventDefault();return false},p=function(az){e(document).unbind("mousemove",k).unbind("mouseup",p);az.stopPropagation();az.preventDefault();return false},F=function(az){az.preventDefault();az.stopPropagation();G.active.val("ahex",e(this).attr("title")||null,az.target);return false},ae=e.isFunction(h[1])&&h[1]||null,ad=e.isFunction(h[2])&&h[2]||null,ax=e.isFunction(h[3])&&h[3]||null,V=function(){G.current.val("ahex",G.active.val("ahex"));var az=function(){if(!av.window.expandable||e.support.boxModel){return}var aA=R.find("table:first");R.before("<iframe/>");R.prev().css({width:aA.width(),height:R.height(),opacity:0,position:"absolute",left:R.css("left"),top:R.css("top")})};if(av.window.expandable){e(document.body).children("div.jPicker.Container").css({zIndex:10});R.css({zIndex:20})}switch(av.window.effects.type){case"fade":R.fadeIn(av.window.effects.speed.show,az);break;case"slide":R.slideDown(av.window.effects.speed.show,az);break;case"show":default:R.show(av.window.effects.speed.show,az);break}},ao=function(){var az=function(){if(av.window.expandable){R.css({zIndex:10})}if(!av.window.expandable||e.support.boxModel){return}R.prev().remove()};switch(av.window.effects.type){case"fade":R.fadeOut(av.window.effects.speed.hide,az);break;case"slide":R.slideUp(av.window.effects.speed.hide,az);break;case"show":default:R.hide(av.window.effects.speed.hide,az);break}},o=function(){var aG=av.window,az=aG.expandable?e(w).next().find(".Container:first"):null;R=aG.expandable?e("<div/>"):e(w);R.addClass("jPicker Container");if(aG.expandable){R.hide()}R.get(0).onselectstart=function(){return false};var aJ=G.active.val("all");if(aG.alphaPrecision<0){aG.alphaPrecision=0}else{if(aG.alphaPrecision>2){aG.alphaPrecision=2}}var aK='<table class="jPicker" cellpadding="0" cellspacing="0"><tbody>'+(aG.expandable?'<tr><td class="Move" colspan="5">&nbsp;</td></tr>':"")+'<tr><td rowspan="9"><h2 class="Title">'+(aG.title||aa.text.title)+'</h2><div class="Map"><span class="Map1">&nbsp;</span><span class="Map2">&nbsp;</span><span class="Map3">&nbsp;</span><img src="'+n.clientPath+n.colorMap.arrow.file+'" class="Arrow"/></div></td><td rowspan="9"><div class="Bar"><span class="Map1">&nbsp;</span><span class="Map2">&nbsp;</span><span class="Map3">&nbsp;</span><span class="Map4">&nbsp;</span><span class="Map5">&nbsp;</span><span class="Map6">&nbsp;</span><img src="'+n.clientPath+n.colorBar.arrow.file+'" class="Arrow"/></div></td><td colspan="2" class="Preview">'+aa.text.newColor+'<div><span class="Active" title="'+aa.tooltips.colors.newColor+'">&nbsp;</span><span class="Current" title="'+aa.tooltips.colors.currentColor+'">&nbsp;</span></div>'+aa.text.currentColor+'</td><td rowspan="9" class="Button"><input type="button" class="Ok" value="'+aa.text.ok+'" title="'+aa.tooltips.buttons.ok+'"/><input type="button" class="Cancel" value="'+aa.text.cancel+'" title="'+aa.tooltips.buttons.cancel+'"/><hr/><div class="Grid">&nbsp;</div></td></tr><tr class="Hue"><td class="Radio"><label title="'+aa.tooltips.hue.radio+'"><input type="radio" value="h"'+(av.color.mode=="h"?' checked="checked"':"")+'/>H:</label></td><td class="Text"><input type="text" maxlength="3" value="'+(aJ!=null?aJ.h:"")+'" title="'+aa.tooltips.hue.textbox+'"/>&nbsp;&deg;</td></tr><tr class="Saturation"><td class="Radio"><label title="'+aa.tooltips.saturation.radio+'"><input type="radio" value="s"'+(av.color.mode=="s"?' checked="checked"':"")+'/>S:</label></td><td class="Text"><input type="text" maxlength="3" value="'+(aJ!=null?aJ.s:"")+'" title="'+aa.tooltips.saturation.textbox+'"/>&nbsp;%</td></tr><tr class="Value"><td class="Radio"><label title="'+aa.tooltips.value.radio+'"><input type="radio" value="v"'+(av.color.mode=="v"?' checked="checked"':"")+'/>V:</label><br/><br/></td><td class="Text"><input type="text" maxlength="3" value="'+(aJ!=null?aJ.v:"")+'" title="'+aa.tooltips.value.textbox+'"/>&nbsp;%<br/><br/></td></tr><tr class="Red"><td class="Radio"><label title="'+aa.tooltips.red.radio+'"><input type="radio" value="r"'+(av.color.mode=="r"?' checked="checked"':"")+'/>R:</label></td><td class="Text"><input type="text" maxlength="3" value="'+(aJ!=null?aJ.r:"")+'" title="'+aa.tooltips.red.textbox+'"/></td></tr><tr class="Green"><td class="Radio"><label title="'+aa.tooltips.green.radio+'"><input type="radio" value="g"'+(av.color.mode=="g"?' checked="checked"':"")+'/>G:</label></td><td class="Text"><input type="text" maxlength="3" value="'+(aJ!=null?aJ.g:"")+'" title="'+aa.tooltips.green.textbox+'"/></td></tr><tr class="Blue"><td class="Radio"><label title="'+aa.tooltips.blue.radio+'"><input type="radio" value="b"'+(av.color.mode=="b"?' checked="checked"':"")+'/>B:</label></td><td class="Text"><input type="text" maxlength="3" value="'+(aJ!=null?aJ.b:"")+'" title="'+aa.tooltips.blue.textbox+'"/></td></tr><tr class="Alpha"><td class="Radio">'+(aG.alphaSupport?'<label title="'+aa.tooltips.alpha.radio+'"><input type="radio" value="a"'+(av.color.mode=="a"?' checked="checked"':"")+"/>A:</label>":"&nbsp;")+'</td><td class="Text">'+(aG.alphaSupport?'<input type="text" maxlength="'+(3+aG.alphaPrecision)+'" value="'+(aJ!=null?Math.precision((aJ.a*100)/255,aG.alphaPrecision):"")+'" title="'+aa.tooltips.alpha.textbox+'"/>&nbsp;%':"&nbsp;")+'</td></tr><tr class="Hex"><td colspan="2" class="Text"><label title="'+aa.tooltips.hex.textbox+'">#:<input type="text" maxlength="6" class="Hex" value="'+(aJ!=null?aJ.hex:"")+'"/></label>'+(aG.alphaSupport?'<input type="text" maxlength="2" class="AHex" value="'+(aJ!=null?aJ.ahex.substring(6):"")+'" title="'+aa.tooltips.hex.alpha+'"/></td>':"&nbsp;")+"</tr></tbody></table>";if(aG.expandable){R.html(aK);if(e(document.body).children("div.jPicker.Container").length==0){e(document.body).prepend(R)}else{e(document.body).children("div.jPicker.Container:last").after(R)}R.mousedown(function(){e(document.body).children("div.jPicker.Container").css({zIndex:10});R.css({zIndex:20})});R.css({left:aG.position.x=="left"?(az.offset().left-530-(aG.position.y=="center"?25:0))+"px":aG.position.x=="center"?(az.offset().left-260)+"px":aG.position.x=="right"?(az.offset().left-10+(aG.position.y=="center"?25:0))+"px":aG.position.x=="screenCenter"?((e(document).width()>>1)-260)+"px":(az.offset().left+parseInt(aG.position.x))+"px",position:"absolute",top:aG.position.y=="top"?(az.offset().top-312)+"px":aG.position.y=="center"?(az.offset().top-156)+"px":aG.position.y=="bottom"?(az.offset().top+25)+"px":(az.offset().top+parseInt(aG.position.y))+"px"})}else{R=e(w);R.html(aK)}var aD=R.find("tbody:first");l=aD.find("div.Map:first");s=aD.find("div.Bar:first");var aL=l.find("span"),aI=s.find("span");au=aL.filter(".Map1:first");at=aL.filter(".Map2:first");ar=aL.filter(".Map3:first");P=aI.filter(".Map1:first");O=aI.filter(".Map2:first");N=aI.filter(".Map3:first");M=aI.filter(".Map4:first");L=aI.filter(".Map5:first");K=aI.filter(".Map6:first");D=new d(l,{map:{width:n.colorMap.width,height:n.colorMap.height},arrow:{image:n.clientPath+n.colorMap.arrow.file,width:n.colorMap.arrow.width,height:n.colorMap.arrow.height}});D.bind(z);U=new d(s,{map:{width:n.colorBar.width,height:n.colorBar.height},arrow:{image:n.clientPath+n.colorBar.arrow.file,width:n.colorBar.arrow.width,height:n.colorBar.arrow.height}});U.bind(ac);aw=new b(aD,G.active,aG.expandable&&aG.bindToInput?aG.input:null,aG.alphaPrecision);var aB=aJ!=null?aJ.hex:null,aH=aD.find(".Preview"),aF=aD.find(".Button");E=aH.find(".Active:first").css({backgroundColor:aB&&"#"+aB||"transparent"});an=aH.find(".Current:first").css({backgroundColor:aB&&"#"+aB||"transparent"}).bind("click",Z);Y.call(w,an,Math.precision(G.current.val("a")*100)/255,4);ah=aF.find(".Ok:first").bind("click",m);X=aF.find(".Cancel:first").bind("click",q);ab=aF.find(".Grid:first");setTimeout(function(){t.call(w,au,n.clientPath+"Maps.png");t.call(w,at,n.clientPath+"Maps.png");t.call(w,ar,n.clientPath+"map-opacity.png");t.call(w,P,n.clientPath+"Bars.png");t.call(w,O,n.clientPath+"Bars.png");t.call(w,N,n.clientPath+"Bars.png");t.call(w,M,n.clientPath+"Bars.png");t.call(w,L,n.clientPath+"bar-opacity.png");t.call(w,K,n.clientPath+"AlphaBar.png");t.call(w,aH.find("div:first"),n.clientPath+"preview-opacity.png")},0);aD.find("td.Radio input").bind("click",A);if(G.quickList&&G.quickList.length>0){var aE="";for(i=0;i<G.quickList.length;i++){if((typeof(G.quickList[i])).toString().toLowerCase()=="string"){G.quickList[i]=new f({hex:G.quickList[i]})}var aC=G.quickList[i].val("a");var aM=G.quickList[i].val("ahex");if(!aG.alphaSupport&&aM){aM=aM.substring(0,6)+"ff"}var aA=G.quickList[i].val("hex");aE+='<span class="QuickColor"'+(aM&&' title="#'+aM+'"'||"")+' style="background-color:'+(aA&&"#"+aA||"")+";"+(aA?"":"background-image:url("+n.clientPath+"NoColor.png)")+(aG.alphaSupport&&aC&&aC<255?";opacity:"+Math.precision(aC/255,4)+";filter:Alpha(opacity="+Math.precision(aC/2.55,4)+")":"")+'">&nbsp;</span>'}t.call(w,ab,n.clientPath+"bar-opacity.png");ab.html(aE);ab.find(".QuickColor").click(F)}ag.call(w,av.color.mode);G.active.bind(aj);e.isFunction(ad)&&G.active.bind(ad);G.current.bind(ap);if(aG.expandable){w.icon=az.parents(".Icon:first");aq=w.icon.find(".Color:first").css({backgroundColor:aB&&"#"+aB||"transparent"});r=w.icon.find(".Alpha:first");t.call(w,r,n.clientPath+"bar-opacity.png");Y.call(w,r,Math.precision(((255-(aJ!=null?aJ.a:0))*100)/255,4));C=w.icon.find(".Image:first").css({backgroundImage:"url("+n.clientPath+n.picker.file+")"}).bind("click",af);if(aG.bindToInput&&aG.updateInputColor){aG.input.css({backgroundColor:aB&&"#"+aB||"transparent",color:aJ==null||aJ.v>75?"#000000":"#ffffff"})}u=aD.find(".Move:first").bind("mousedown",S);G.active.bind(H)}else{V.call(w)}},ak=function(){R.find("td.Radio input").unbind("click",A);an.unbind("click",Z);X.unbind("click",q);ah.unbind("click",m);if(av.window.expandable){C.unbind("click",af);u.unbind("mousedown",S);w.icon=null}R.find(".QuickColor").unbind("click",F);l=null;s=null;au=null;at=null;ar=null;P=null;O=null;N=null;M=null;L=null;K=null;D.destroy();D=null;U.destroy();U=null;aw.destroy();aw=null;E=null;an=null;ah=null;X=null;ab=null;ae=null;ax=null;ad=null;R.html("");for(i=0;i<c.length;i++){if(c[i]==w){c.splice(i,1)}}},n=av.images,aa=av.localization,G={active:(typeof(av.color.active)).toString().toLowerCase()=="string"?new f({ahex:!av.window.alphaSupport&&av.color.active?av.color.active.substring(0,6)+"ff":av.color.active}):new f({ahex:!av.window.alphaSupport&&av.color.active.val("ahex")?av.color.active.val("ahex").substring(0,6)+"ff":av.color.active.val("ahex")}),current:(typeof(av.color.active)).toString().toLowerCase()=="string"?new f({ahex:!av.window.alphaSupport&&av.color.active?av.color.active.substring(0,6)+"ff":av.color.active}):new f({ahex:!av.window.alphaSupport&&av.color.active.val("ahex")?av.color.active.val("ahex").substring(0,6)+"ff":av.color.active.val("ahex")}),quickList:av.color.quickList};e.extend(true,w,{commitCallback:ae,liveCallback:ad,cancelCallback:ax,color:G,show:V,hide:ao,destroy:ak});c.push(w);setTimeout(function(){o.call(w)},0)})};e.fn.jPicker.defaults={window:{title:null,effects:{type:"slide",speed:{show:"slow",hide:"fast"}},position:{x:"screenCenter",y:"top"},expandable:false,liveUpdate:true,alphaSupport:false,alphaPrecision:0,updateInputColor:true},color:{mode:"h",active:new f({ahex:"#ffcc00ff"}),quickList:[new f({h:360,s:33,v:100}),new f({h:360,s:66,v:100}),new f({h:360,s:100,v:100}),new f({h:360,s:100,v:75}),new f({h:360,s:100,v:50}),new f({h:180,s:0,v:100}),new f({h:30,s:33,v:100}),new f({h:30,s:66,v:100}),new f({h:30,s:100,v:100}),new f({h:30,s:100,v:75}),new f({h:30,s:100,v:50}),new f({h:180,s:0,v:90}),new f({h:60,s:33,v:100}),new f({h:60,s:66,v:100}),new f({h:60,s:100,v:100}),new f({h:60,s:100,v:75}),new f({h:60,s:100,v:50}),new f({h:180,s:0,v:80}),new f({h:90,s:33,v:100}),new f({h:90,s:66,v:100}),new f({h:90,s:100,v:100}),new f({h:90,s:100,v:75}),new f({h:90,s:100,v:50}),new f({h:180,s:0,v:70}),new f({h:120,s:33,v:100}),new f({h:120,s:66,v:100}),new f({h:120,s:100,v:100}),new f({h:120,s:100,v:75}),new f({h:120,s:100,v:50}),new f({h:180,s:0,v:60}),new f({h:150,s:33,v:100}),new f({h:150,s:66,v:100}),new f({h:150,s:100,v:100}),new f({h:150,s:100,v:75}),new f({h:150,s:100,v:50}),new f({h:180,s:0,v:50}),new f({h:180,s:33,v:100}),new f({h:180,s:66,v:100}),new f({h:180,s:100,v:100}),new f({h:180,s:100,v:75}),new f({h:180,s:100,v:50}),new f({h:180,s:0,v:40}),new f({h:210,s:33,v:100}),new f({h:210,s:66,v:100}),new f({h:210,s:100,v:100}),new f({h:210,s:100,v:75}),new f({h:210,s:100,v:50}),new f({h:180,s:0,v:30}),new f({h:240,s:33,v:100}),new f({h:240,s:66,v:100}),new f({h:240,s:100,v:100}),new f({h:240,s:100,v:75}),new f({h:240,s:100,v:50}),new f({h:180,s:0,v:20}),new f({h:270,s:33,v:100}),new f({h:270,s:66,v:100}),new f({h:270,s:100,v:100}),new f({h:270,s:100,v:75}),new f({h:270,s:100,v:50}),new f({h:180,s:0,v:10}),new f({h:300,s:33,v:100}),new f({h:300,s:66,v:100}),new f({h:300,s:100,v:100}),new f({h:300,s:100,v:75}),new f({h:300,s:100,v:50}),new f({h:180,s:0,v:0}),new f({h:330,s:33,v:100}),new f({h:330,s:66,v:100}),new f({h:330,s:100,v:100}),new f({h:330,s:100,v:75}),new f({h:330,s:100,v:50}),new f()]},images:{clientPath:"/jPicker/images/",colorMap:{width:256,height:256,arrow:{file:"mappoint.gif",width:15,height:15}},colorBar:{width:20,height:256,arrow:{file:"rangearrows.gif",width:20,height:7}},picker:{file:"picker.gif",width:25,height:24}},localization:{text:{title:"Drag Markers To Pick A Color",newColor:"new",currentColor:"current",ok:"OK",cancel:"Cancel"},tooltips:{colors:{newColor:"New Color - Press &ldquo;OK&rdquo; To Commit",currentColor:"Click To Revert To Original Color"},buttons:{ok:"Commit To This Color Selection",cancel:"Cancel And Revert To Original Color"},hue:{radio:"Set To &ldquo;Hue&rdquo; Color Mode",textbox:"Enter A &ldquo;Hue&rdquo; Value (0-360&deg;)"},saturation:{radio:"Set To &ldquo;Saturation&rdquo; Color Mode",textbox:"Enter A &ldquo;Saturation&rdquo; Value (0-100%)"},value:{radio:"Set To &ldquo;Value&rdquo; Color Mode",textbox:"Enter A &ldquo;Value&rdquo; Value (0-100%)"},red:{radio:"Set To &ldquo;Red&rdquo; Color Mode",textbox:"Enter A &ldquo;Red&rdquo; Value (0-255)"},green:{radio:"Set To &ldquo;Green&rdquo; Color Mode",textbox:"Enter A &ldquo;Green&rdquo; Value (0-255)"},blue:{radio:"Set To &ldquo;Blue&rdquo; Color Mode",textbox:"Enter A &ldquo;Blue&rdquo; Value (0-255)"},alpha:{radio:"Set To &ldquo;Alpha&rdquo; Color Mode",textbox:"Enter A &ldquo;Alpha&rdquo; Value (0-100)"},hex:{textbox:"Enter A &ldquo;Hex&rdquo; Color Value (#000000-#ffffff)",alpha:"Enter A &ldquo;Alpha&rdquo; Value (#00-#ff)"}}}}})(jQuery,"1.1.5");
        • jquery.jgraduate.js
          /*
           * jGraduate 0.4
           *
           * jQuery Plugin for a gradient picker
           *
           * Copyright (c) 2010 Jeff Schiller
           * http://blog.codedread.com/
           * Copyright (c) 2010 Alexis Deveria
           * http://a.deveria.com/
           *
           * Apache 2 License
          
          jGraduate( options, okCallback, cancelCallback )
          
          where options is an object literal:
          	{
          		window: { title: "Pick the start color and opacity for the gradient" },
          		images: { clientPath: "images/" },
          		paint: a Paint object,
          		newstop: String of value "same", "inverse", "black" or "white" 
          				 OR object with one or both values {color: #Hex color, opac: number 0-1}
          	}
           
          - the Paint object is:
          	Paint {
          		type: String, // one of "none", "solidColor", "linearGradient", "radialGradient"
          		alpha: Number representing opacity (0-100),
          		solidColor: String representing #RRGGBB hex of color,
          		linearGradient: object of interface SVGLinearGradientElement,
          		radialGradient: object of interface SVGRadialGradientElement,
          	}
          
          $.jGraduate.Paint() -> constructs a 'none' color
          $.jGraduate.Paint({copy: o}) -> creates a copy of the paint o
          $.jGraduate.Paint({hex: "#rrggbb"}) -> creates a solid color paint with hex = "#rrggbb"
          $.jGraduate.Paint({linearGradient: o, a: 50}) -> creates a linear gradient paint with opacity=0.5
          $.jGraduate.Paint({radialGradient: o, a: 7}) -> creates a radial gradient paint with opacity=0.07
          $.jGraduate.Paint({hex: "#rrggbb", linearGradient: o}) -> throws an exception?
          
          - picker accepts the following object as input:
          	{
          		okCallback: function to call when Ok is pressed
          		cancelCallback: function to call when Cancel is pressed
          		paint: object describing the paint to display initially, if not set, then default to opaque white
          	}
          
          - okCallback receives a Paint object
          
           *
           */
           
          (function() {
           
          var ns = { svg: 'http://www.w3.org/2000/svg', xlink: 'http://www.w3.org/1999/xlink' };
          if(!window.console) {
            window.console = new function() {
              this.log = function(str) {};
              this.dir = function(str) {};
            };
          }
          
          $.jGraduate = { 
          	Paint:
          		function(opt) {
          			var options = opt || {};
          			this.alpha = isNaN(options.alpha) ? 100 : options.alpha;
          			// copy paint object
              		if (options.copy) {
              			this.type = options.copy.type;
              			this.alpha = options.copy.alpha;
          				this.solidColor = null;
          				this.linearGradient = null;
          				this.radialGradient = null;
          
              			switch(this.type) {
              				case "none":
              					break;
              				case "solidColor":
              					this.solidColor = options.copy.solidColor;
              					break;
              				case "linearGradient":
              					this.linearGradient = options.copy.linearGradient.cloneNode(true);
              					break;
              				case "radialGradient":
              					this.radialGradient = options.copy.radialGradient.cloneNode(true);
              					break;
              			}
              		}
              		// create linear gradient paint
              		else if (options.linearGradient) {
              			this.type = "linearGradient";
              			this.solidColor = null;
              			this.radialGradient = null;
              			this.linearGradient = options.linearGradient.cloneNode(true);
              		}
              		// create linear gradient paint
              		else if (options.radialGradient) {
              			this.type = "radialGradient";
              			this.solidColor = null;
              			this.linearGradient = null;
              			this.radialGradient = options.radialGradient.cloneNode(true);
              		}
              		// create solid color paint
              		else if (options.solidColor) {
              			this.type = "solidColor";
              			this.solidColor = options.solidColor;
              		}
              		// create empty paint
          	    	else {
          	    		this.type = "none";
              			this.solidColor = null;
              			this.linearGradient = null;
              			this.radialGradient = null;
          	    	}
          		}
          };
          
          jQuery.fn.jGraduateDefaults = {
          	paint: new $.jGraduate.Paint(),
          	window: {
          		pickerTitle: "Drag markers to pick a paint"
          	},
          	images: {
          		clientPath: "images/"
          	},
          	newstop: 'inverse' // same, inverse, black, white
          };
          
          var isGecko = navigator.userAgent.indexOf('Gecko/') >= 0;
          
          function setAttrs(elem, attrs) {
          	if(isGecko) {
          		for (var aname in attrs) elem.setAttribute(aname, attrs[aname]);
          	} else {
          		for (var aname in attrs) {
          			var val = attrs[aname], prop = elem[aname];
          			if(prop && prop.constructor === 'SVGLength') {
          				prop.baseVal.value = val;
          			} else {
          				elem.setAttribute(aname, val);
          			}
          		}
          	}
          }
          
          function mkElem(name, attrs, newparent) {
          	var elem = document.createElementNS(ns.svg, name);
          	setAttrs(elem, attrs);
          	if(newparent) newparent.appendChild(elem);
          	return elem;
          }
          
          jQuery.fn.jGraduate =
          	function(options) {
          	 	var $arguments = arguments;
          		return this.each( function() {
          			var $this = $(this), $settings = $.extend(true, {}, jQuery.fn.jGraduateDefaults, options),
          				id = $this.attr('id'),
          				idref = '#'+$this.attr('id')+' ';
          			
                      if (!idref)
                      {
                        alert('Container element must have an id attribute to maintain unique id strings for sub-elements.');
                        return;
                      }
                      
                      var okClicked = function() {
          	            switch ( $this.paint.type ) {
          	            	case "radialGradient":
          	            		$this.paint.linearGradient = null;
          	            		break;
          	            	case "linearGradient":
          	            		$this.paint.radialGradient = null;
          	            		break;
          	            	case "solidColor":
          	            		$this.paint.radialGradient = $this.paint.linearGradient = null;
          	            		break;
          	            }
                      	$.isFunction($this.okCallback) && $this.okCallback($this.paint);
                      	$this.hide();
                      },
                      cancelClicked = function() {
                      	$.isFunction($this.cancelCallback) && $this.cancelCallback();
                      	$this.hide();
                      };
          
                      $.extend(true, $this, // public properties, methods, and callbacks
                        {
                        	// make a copy of the incoming paint
                          paint: new $.jGraduate.Paint({copy: $settings.paint}),
                          okCallback: $.isFunction($arguments[1]) && $arguments[1] || null,
                          cancelCallback: $.isFunction($arguments[2]) && $arguments[2] || null
                        });
          
          			var pos = $this.position(),
          				color = null;
          			var $win = $(window);
          
          			if ($this.paint.type == "none") {
          				$this.paint = $.jGraduate.Paint({solidColor: 'ffffff'});
          			}
          			
                      $this.addClass('jGraduate_Picker');
                      $this.html('<ul class="jGraduate_tabs">' +
                      				'<li class="jGraduate_tab_color jGraduate_tab_current" data-type="col">Solid Color</li>' +
                      				'<li class="jGraduate_tab_lingrad" data-type="lg">Linear Gradient</li>' +
                      				'<li class="jGraduate_tab_radgrad" data-type="rg">Radial Gradient</li>' +
                      			'</ul>' +
                      			'<div class="jGraduate_colPick"></div>' +
                      			'<div class="jGraduate_gradPick"></div>' +
          						'<div class="jGraduate_LightBox"></div>' +
          						'<div id="' + id + '_jGraduate_stopPicker" class="jGraduate_stopPicker"></div>'
                      			
                      			
                      			);
          			var colPicker = $(idref + '> .jGraduate_colPick');
          			var gradPicker = $(idref + '> .jGraduate_gradPick');
          			
                      gradPicker.html(
                      	'<div id="' + id + '_jGraduate_Swatch" class="jGraduate_Swatch">' +
                      		'<h2 class="jGraduate_Title">' + $settings.window.pickerTitle + '</h2>' +
                      		'<div id="' + id + '_jGraduate_GradContainer" class="jGraduate_GradContainer"></div>' +
                      		'<div id="' + id + '_jGraduate_StopSlider" class="jGraduate_StopSlider"></div>' +
                      	'</div>' + 
                      	'<div class="jGraduate_Form jGraduate_Points jGraduate_lg_field">' +
                      		'<div class="jGraduate_StopSection">' +
          	            		'<label class="jGraduate_Form_Heading">Begin Point</label>' +
              	        		'<div class="jGraduate_Form_Section">' +
                  	    			'<label>x:</label>' +
                      				'<input type="text" id="' + id + '_jGraduate_x1" size="3" title="Enter starting x value between 0.0 and 1.0"/>' +
                      				'<label>y:</label>' +
                      				'<input type="text" id="' + id + '_jGraduate_y1" size="3" title="Enter starting y value between 0.0 and 1.0"/>' +
                  	   			'</div>' +
                  	   		'</div>' +
                  	   		'<div class="jGraduate_StopSection">' +
          	            		'<label class="jGraduate_Form_Heading">End Point</label>' +
              	        		'<div class="jGraduate_Form_Section">' +
          	    	        		'<label>x:</label>' +
          		    	        	'<input type="text" id="' + id + '_jGraduate_x2" size="3" title="Enter ending x value between 0.0 and 1.0"/>' +
              		    	    	'<label>y:</label>' +
                  		    		'<input type="text" id="' + id + '_jGraduate_y2" size="3" title="Enter ending y value between 0.0 and 1.0"/>' +
              	    	    	'</div>' +
              	    	    '</div>' +
              	       	'</div>' +
                      	'<div class="jGraduate_Form jGraduate_Points jGraduate_rg_field">' +
          					'<div class="jGraduate_StopSection">' +
          						'<label class="jGraduate_Form_Heading">Center Point</label>' +
          						'<div class="jGraduate_Form_Section">' +
          							'<label>x:</label>' +
          							'<input type="text" id="' + id + '_jGraduate_cx" size="3" title="Enter x value between 0.0 and 1.0"/>' +
          							'<label>y:</label>' +
          							'<input type="text" id="' + id + '_jGraduate_cy" size="3" title="Enter y value between 0.0 and 1.0"/>' +
          						'</div>' +
          					'</div>' +
          					'<div class="jGraduate_StopSection">' +
          						'<label class="jGraduate_Form_Heading">Focal Point</label>' +
          						'<div class="jGraduate_Form_Section">' +
          							'<label>Match center: <input type="checkbox" checked="checked" id="' + id + '_jGraduate_match_ctr"/></label><br/>' +
          							'<label>x:</label>' +
          							'<input type="text" id="' + id + '_jGraduate_fx" size="3" title="Enter x value between 0.0 and 1.0"/>' +
          							'<label>y:</label>' +
          							'<input type="text" id="' + id + '_jGraduate_fy" size="3" title="Enter y value between 0.0 and 1.0"/>' +
          						'</div>' +
          					'</div>' +
              	       	'</div>' +
          				'<div class="jGraduate_StopSection jGraduate_SpreadMethod">' +
          					'<label class="jGraduate_Form_Heading">Spread method</label>' +
          					'<div class="jGraduate_Form_Section">' +
          						'<select class="jGraduate_spreadMethod">' +
          							'<option value=pad selected>Pad</option>' +
          							'<option value=reflect>Reflect</option>' +
          							'<option value=repeat>Repeat</option>' +
          						'</select>' + 
          					'</div>' +
          				'</div>' +
                      	'<div class="jGraduate_Form">' +
                  	   		'<div class="jGraduate_Slider jGraduate_RadiusField jGraduate_rg_field">' +
          						'<label class="prelabel">Radius:</label>' +
          						'<div id="' + id + '_jGraduate_Radius" class="jGraduate_SliderBar jGraduate_Radius" title="Click to set radius">' +
          							'<img id="' + id + '_jGraduate_RadiusArrows" class="jGraduate_RadiusArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' +
          						'</div>' +
          						'<label><input type="text" id="' + id + '_jGraduate_RadiusInput" size="3" value="100"/>%</label>' + 
              	    	    '</div>' +
                  	   		'<div class="jGraduate_Slider jGraduate_EllipField jGraduate_rg_field">' +
          						'<label class="prelabel">Ellip:</label>' +
          						'<div id="' + id + '_jGraduate_Ellip" class="jGraduate_SliderBar jGraduate_Ellip" title="Click to set Ellip">' +
          							'<img id="' + id + '_jGraduate_EllipArrows" class="jGraduate_EllipArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' +
          						'</div>' +
          						'<label><input type="text" id="' + id + '_jGraduate_EllipInput" size="3" value="0"/>%</label>' + 
              	    	    '</div>' +
                  	   		'<div class="jGraduate_Slider jGraduate_AngleField jGraduate_rg_field">' +
          						'<label class="prelabel">Angle:</label>' +
          						'<div id="' + id + '_jGraduate_Angle" class="jGraduate_SliderBar jGraduate_Angle" title="Click to set Angle">' +
          							'<img id="' + id + '_jGraduate_AngleArrows" class="jGraduate_AngleArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' +
          						'</div>' +
          						'<label><input type="text" id="' + id + '_jGraduate_AngleInput" size="3" value="0"/>deg</label>' + 
              	    	    '</div>' +
                  	   		'<div class="jGraduate_Slider jGraduate_OpacField">' +
          						'<label class="prelabel">Opac:</label>' +
          						'<div id="' + id + '_jGraduate_Opac" class="jGraduate_SliderBar jGraduate_Opac" title="Click to set Opac">' +
          							'<img id="' + id + '_jGraduate_OpacArrows" class="jGraduate_OpacArrows" src="' + $settings.images.clientPath + 'rangearrows2.gif">' +
          						'</div>' +
          						'<label><input type="text" id="' + id + '_jGraduate_OpacInput" size="3" value="100"/>%</label>' + 
              	    	    '</div>' +
              	       	'</div>' +
                  	    '<div class="jGraduate_OkCancel">' +
                      		'<input type="button" id="' + id + '_jGraduate_Ok" class="jGraduate_Ok" value="OK"/>' +
                      		'<input type="button" id="' + id + '_jGraduate_Cancel" class="jGraduate_Cancel" value="Cancel"/>' +
                      	'</div>');
                      	
          			// --------------
                      // Set up all the SVG elements (the gradient, stops and rectangle)
                      var MAX = 256, MARGINX = 0, MARGINY = 0, STOP_RADIUS = 15/2,
                      	SIZEX = MAX - 2*MARGINX, SIZEY = MAX - 2*MARGINY;
                      	
                      var curType, curGradient, previewRect;	
                      
          			var attr_input = {};
                      
                      var SLIDERW = 145;
                      $('.jGraduate_SliderBar').width(SLIDERW);
          			
          			var container = $('#' + id+'_jGraduate_GradContainer')[0];
          			
          			var svg = mkElem('svg', {
          				id: id + '_jgraduate_svg',
          				width: MAX,
          				height: MAX,
          				xmlns: ns.svg
          			}, container);
          			
          			// if we are sent a gradient, import it 
          			
          			curType = curType || $this.paint.type;
          			
          			var grad = curGradient = $this.paint[curType];
          			
          			var gradalpha = $this.paint.alpha;
          			
          			var isSolid = curType === 'solidColor';
          			
          			// Make any missing gradients
          			switch ( curType ) {
          				case "solidColor":
          					// fall through
          				case "linearGradient":
          					if(!isSolid) {
          						curGradient.id = id+'_lg_jgraduate_grad';
          						grad = curGradient = svg.appendChild(curGradient);//.cloneNode(true));
          					}
          					mkElem('radialGradient', {
          						id: id + '_rg_jgraduate_grad'
          					}, svg);
          					if(curType === "linearGradient") break;
          				case "radialGradient":
          					if(!isSolid) {
          						curGradient.id = id+'_rg_jgraduate_grad';
          						grad = curGradient = svg.appendChild(curGradient);//.cloneNode(true));
          					}
          					mkElem('linearGradient', {
          						id: id + '_lg_jgraduate_grad'
          					}, svg);
          			}
          			
          			if(isSolid) {
          				grad = curGradient = $('#' + id + '_lg_jgraduate_grad')[0];
          				var color = $this.paint[curType];
          				mkStop(0, '#' + color, 1);
          				
          				var type = typeof $settings.newstop;
          				
          				if(type === 'string') {
          					switch ( $settings.newstop ) {
          						case 'same':
          							mkStop(1, '#' + color, 1);				
          							break;
          
          						case 'inverse':
          							// Invert current color for second stop
          							var inverted = '';
          							
          							for(var i = 0; i < 6; i += 2) {
          								var ch = color.substr(i, 2);
          								var inv = (255 - parseInt(color.substr(i, 2), 16)).toString(16);
          								if(inv.length < 2) inv = 0 + inv;
          								inverted += inv;
          							}
          							mkStop(1, '#' + inverted, 1);
          							break;
          						
          						case 'white':
          							mkStop(1, '#ffffff', 1);
          							break;
          	
          						case 'black':
          							mkStop(1, '#000000', 1);
          							break;
          					}
          				} else if(type === 'object'){
          					var opac = ('opac' in $settings.newstop) ? $settings.newstop.opac : 1;
          					mkStop(1, ($settings.newstop.color || '#' + color), opac);
          				}
          			}
          
          			
          			var x1 = parseFloat(grad.getAttribute('x1')||0.0),
          				y1 = parseFloat(grad.getAttribute('y1')||0.0),
          				x2 = parseFloat(grad.getAttribute('x2')||1.0),
          				y2 = parseFloat(grad.getAttribute('y2')||0.0);
          				
          			var cx = parseFloat(grad.getAttribute('cx')||0.5),
          				cy = parseFloat(grad.getAttribute('cy')||0.5),
          				fx = parseFloat(grad.getAttribute('fx')|| cx),
          				fy = parseFloat(grad.getAttribute('fy')|| cy);
          
          			
          			var previewRect = mkElem('rect', {
          				id: id + '_jgraduate_rect',
          				x: MARGINX,
          				y: MARGINY,
          				width: SIZEX,
          				height: SIZEY,
          				fill: 'url(#'+id+'_jgraduate_grad)',
          				'fill-opacity': gradalpha/100
          			}, svg);
          			
          			// stop visuals created here
          			var beginCoord = $('<div/>').attr({
          				'class': 'grad_coord jGraduate_lg_field',
          				title: 'Begin Stop'
          			}).text(1).css({
          				top: y1 * MAX,
          				left: x1 * MAX
          			}).data('coord', 'start').appendTo(container);
          			
          			var endCoord = beginCoord.clone().text(2).css({
          				top: y2 * MAX,
          				left: x2 * MAX
          			}).attr('title', 'End stop').data('coord', 'end').appendTo(container);
          		
          			var centerCoord = $('<div/>').attr({
          				'class': 'grad_coord jGraduate_rg_field',
          				title: 'Center stop'
          			}).text('C').css({
          				top: cy * MAX,
          				left: cx * MAX
          			}).data('coord', 'center').appendTo(container);
          			
          			var focusCoord = centerCoord.clone().text('F').css({
          				top: fy * MAX,
          				left: fx * MAX,
          				display: 'none'
          			}).attr('title', 'Focus point').data('coord', 'focus').appendTo(container);
          			
          			focusCoord[0].id = id + '_jGraduate_focusCoord';
          			
          			var coords = $(idref + ' .grad_coord');
          			
          // 			$(container).hover(function() {
          // 				coords.animate({
          // 					opacity: 1
          // 				}, 500);
          // 			}, function() {
          // 				coords.animate({
          // 					opacity: .2
          // 				}, 500);				
          // 			});
          			
          			$.each(['x1', 'y1', 'x2', 'y2', 'cx', 'cy', 'fx', 'fy'], function(i, attr) {
          				var attrval = curGradient.getAttribute(attr);
          				
          				var isRadial = isNaN(attr[1]);
          				
          				if(!attrval) {
          					// Set defaults
          					if(isRadial) {
          						// For radial points
          						attrval = "0.5";
          					} else {
          						// Only x2 is 1
          						attrval = attr === 'x2' ? "1.0" : "0.0";
          					}
          				}
          
          				attr_input[attr] = $('#'+id+'_jGraduate_' + attr)
          					.val(attrval)
          					.change(function() {
          						// TODO: Support values < 0 and > 1 (zoomable preview?)
          						if (isNaN(parseFloat(this.value)) || this.value < 0) {
          							this.value = 0.0; 
          						} else if(this.value > 1) {
          							this.value = 1.0;
          						}
          						
          						if(!(attr[0] === 'f' && !showFocus)) {
          							if(isRadial && curType === 'radialGradient' || !isRadial && curType === 'linearGradient') {
          								curGradient.setAttribute(attr, this.value);
          							}
          						}
          						
          						if(isRadial) {
          							var $elem = attr[0] === "c" ? centerCoord : focusCoord;
          						} else {
          							var $elem = attr[1] === "1" ? beginCoord : endCoord;						
          						}
          						
          						var cssName = attr.indexOf('x') >= 0 ? 'left' : 'top';
          						
          						$elem.css(cssName, this.value * MAX);
          				}).change();
          			});
          
          
          			
          			function mkStop(n, color, opac, sel, stop_elem) {
          				var stop = stop_elem || mkElem('stop',{'stop-color':color,'stop-opacity':opac,offset:n}, curGradient);
          				if(stop_elem) {
          					color = stop_elem.getAttribute('stop-color');
          					opac = stop_elem.getAttribute('stop-opacity');
          					n = stop_elem.getAttribute('offset');
          				} else {
          					curGradient.appendChild(stop);
          				}
          				if(opac === null) opac = 1;
          				
          				var picker_d = 'M-6.2,0.9c3.6-4,6.7-4.3,6.7-12.4c-0.2,7.9,3.1,8.8,6.5,12.4c3.5,3.8,2.9,9.6,0,12.3c-3.1,2.8-10.4,2.7-13.2,0C-9.6,9.9-9.4,4.4-6.2,0.9z';
          				
          				var pathbg = mkElem('path',{
          					d: picker_d,
          					fill: 'url(#jGraduate_trans)',
          					transform: 'translate(' + (10 + n * MAX) + ', 26)'
          				}, stopGroup);
          				
          				var path = mkElem('path',{
          					d: picker_d,
          					fill: color,
          					'fill-opacity': opac,
          					transform: 'translate(' + (10 + n * MAX) + ', 26)',
          					stroke: '#000',
          					'stroke-width': 1.5
          				}, stopGroup);
          
          				$(path).mousedown(function(e) {
          					selectStop(this);
          					drag = cur_stop;
          					$win.mousemove(dragColor).mouseup(remDrags);
          					stop_offset = stopMakerDiv.offset();
          					e.preventDefault();
          					return false;
          				}).data('stop', stop).data('bg', pathbg).dblclick(function() {
          					$('div.jGraduate_LightBox').show();			
          					var colorhandle = this;
          					var stopOpacity = +stop.getAttribute('stop-opacity') || 1;
          					var stopColor = stop.getAttribute('stop-color') || 1;
          					var thisAlpha = (parseFloat(stopOpacity)*255).toString(16);
          					while (thisAlpha.length < 2) { thisAlpha = "0" + thisAlpha; }
          					color = stopColor.substr(1) + thisAlpha;
          					$('#'+id+'_jGraduate_stopPicker').css({'left': 100, 'bottom': 15}).jPicker({
          							window: { title: "Pick the start color and opacity for the gradient" },
          							images: { clientPath: $settings.images.clientPath },
          							color: { active: color, alphaSupport: true }
          						}, function(color, arg2){
          							stopColor = color.val('hex') ? ('#'+color.val('hex')) : "none";
          							stopOpacity = color.val('a') !== null ? color.val('a')/256 : 1;
          							colorhandle.setAttribute('fill', stopColor);
          							colorhandle.setAttribute('fill-opacity', stopOpacity);
          							stop.setAttribute('stop-color', stopColor);
          							stop.setAttribute('stop-opacity', stopOpacity);
          							$('div.jGraduate_LightBox').hide();
          							$('#'+id+'_jGraduate_stopPicker').hide();
          						}, null, function() {
          							$('div.jGraduate_LightBox').hide();
          							$('#'+id+'_jGraduate_stopPicker').hide();
          						});
          				});
          				
          				$(curGradient).find('stop').each(function() {
          					var cur_s = $(this);
          					if(+this.getAttribute('offset') > n) {
          						if(!color) {
          							var newcolor = this.getAttribute('stop-color');
          							var newopac = this.getAttribute('stop-opacity');
          							stop.setAttribute('stop-color', newcolor);
          							path.setAttribute('fill', newcolor);
          							stop.setAttribute('stop-opacity', newopac === null ? 1 : newopac);
          							path.setAttribute('fill-opacity', newopac === null ? 1 : newopac);
          						}
          						cur_s.before(stop);
          						return false;
          					}
          				});
          				if(sel) selectStop(path);
          				return stop;
          			}
          			
          			function remStop() {
          				delStop.setAttribute('display', 'none');
          				var path = $(cur_stop);
          				var stop = path.data('stop');
          				var bg = path.data('bg');
          				$([cur_stop, stop, bg]).remove();
          			}
          			
          				
          			var stops, stopGroup;
          			
          			var stopMakerDiv = $('#' + id + '_jGraduate_StopSlider');
          
          			var cur_stop, stopGroup, stopMakerSVG, drag;
          			
          			var delStop = mkElem('path',{
          				d:'m9.75,-6l-19.5,19.5m0,-19.5l19.5,19.5',
          				fill:'none',
          				stroke:'#D00',
          				'stroke-width':5,
          				display:'none'
          			}, stopMakerSVG);
          
          			
          			function selectStop(item) {
          				if(cur_stop) cur_stop.setAttribute('stroke', '#000');
          				item.setAttribute('stroke', 'blue');
          				cur_stop = item;
          				cur_stop.parentNode.appendChild(cur_stop);
          			// 	stops = $('stop');
          			// 	opac_select.val(cur_stop.attr('fill-opacity') || 1);
          			// 	root.append(delStop);
          			}
          			
          			var stop_offset;
          			
          			function remDrags() {
          				$win.unbind('mousemove', dragColor);
          				if(delStop.getAttribute('display') !== 'none') {
          					remStop();
          				}
          				drag = null;
          			}
          			
          			var scale_x = 1, scale_y = 1, angle = 0;
          			var c_x = cx;
          			var c_y = cy;
          			
          			function xform() {
          				var rot = angle?'rotate(' + angle + ',' + c_x + ',' + c_y + ') ':'';
          				if(scale_x === 1 && scale_y === 1) {
          					curGradient.removeAttribute('gradientTransform');
          // 					$('#ang').addClass('dis');
          				} else {
          					var x = -c_x * (scale_x-1);
          					var y = -c_y * (scale_y-1);
          					curGradient.setAttribute('gradientTransform', rot + 'translate(' + x + ',' + y + ') scale(' + scale_x + ',' + scale_y + ')');
          // 					$('#ang').removeClass('dis');
          				}
          			}
          			
          			function dragColor(evt) {
          
          				var x = evt.pageX - stop_offset.left;
          				var y = evt.pageY - stop_offset.top;
          				x = x < 10 ? 10 : x > MAX + 10 ? MAX + 10: x;
          
          				var xf_str = 'translate(' + x + ', 26)';
          					if(y < -60 || y > 130) {
          						delStop.setAttribute('display', 'block');
          						delStop.setAttribute('transform', xf_str);
          					} else {
          						delStop.setAttribute('display', 'none');
          					}
          				
          				drag.setAttribute('transform', xf_str);
          				$.data(drag, 'bg').setAttribute('transform', xf_str);
          				var stop = $.data(drag, 'stop');
          				var s_x = (x - 10) / MAX;
          				
          				stop.setAttribute('offset', s_x);
          				var last = 0;
          				
          				$(curGradient).find('stop').each(function(i) {
          					var cur = this.getAttribute('offset');
          					var t = $(this);
          					if(cur < last) {
          						t.prev().before(t);
          						stops = $(curGradient).find('stop');
          					}
          					last = cur;
          				});
          				
          			}
          			
          			stopMakerSVG = mkElem('svg', {
          				width: '100%',
          				height: 45
          			}, stopMakerDiv[0]);
          			
          			var trans_pattern = mkElem('pattern', {
          				width: 16,
          				height: 16,
          				patternUnits: 'userSpaceOnUse',
          				id: 'jGraduate_trans'
          			}, stopMakerSVG);
          			
          			var trans_img = mkElem('image', {
          				width: 16,
          				height: 16
          			}, trans_pattern);
          			
          			var bg_image = $settings.images.clientPath + 'map-opacity.png';
          
          			trans_img.setAttributeNS(ns.xlink, 'xlink:href', bg_image);
          			
          			$(stopMakerSVG).click(function(evt) {
          				stop_offset = stopMakerDiv.offset();
          				var target = evt.target;
          				if(target.tagName === 'path') return;
          				var x = evt.pageX - stop_offset.left - 8;
          				x = x < 10 ? 10 : x > MAX + 10 ? MAX + 10: x;
          				mkStop(x / MAX, 0, 0, true);
          				evt.stopPropagation();
          			});
          			
          			$(stopMakerSVG).mouseover(function() {
          				stopMakerSVG.appendChild(delStop);
          			});
          			
          			stopGroup = mkElem('g', {}, stopMakerSVG);
          			
          			mkElem('line', {
          				x1: 10,
          				y1: 15,
          				x2: MAX + 10,
          				y2: 15,
          				'stroke-width': 2,
          				stroke: '#000'
          			}, stopMakerSVG);
          			
          			
          			var spreadMethodOpt = gradPicker.find('.jGraduate_spreadMethod').change(function() {
          				curGradient.setAttribute('spreadMethod', $(this).val());
          			});
          			
          		
          			// handle dragging the stop around the swatch
          			var draggingCoord = null;
          			
          			var onCoordDrag = function(evt) {
          				var x = evt.pageX - offset.left;
          				var y = evt.pageY - offset.top;
          
          				// clamp stop to the swatch
          				x = x < 0 ? 0 : x > MAX ? MAX : x;
          				y = y < 0 ? 0 : y > MAX ? MAX : y;
          				
          				draggingCoord.css('left', x).css('top', y);
          
          				// calculate stop offset            		
          				var fracx = x / SIZEX;
          				var fracy = y / SIZEY;
          				
          				var type = draggingCoord.data('coord');
          				var grad = curGradient;
          				
          				switch ( type ) {
          					case 'start':
          						attr_input.x1.val(fracx);
          						attr_input.y1.val(fracy);
          						grad.setAttribute('x1', fracx);
          						grad.setAttribute('y1', fracy);
          						break;
          					case 'end':
          						attr_input.x2.val(fracx);
          						attr_input.y2.val(fracy);
          						grad.setAttribute('x2', fracx);
          						grad.setAttribute('y2', fracy);
          						break;
          					case 'center':
          						attr_input.cx.val(fracx);
          						attr_input.cy.val(fracy);
          						grad.setAttribute('cx', fracx);
          						grad.setAttribute('cy', fracy);
          						c_x = fracx;
          						c_y = fracy;
          						xform();
          						break;
          					case 'focus':
          						attr_input.fx.val(fracx);
          						attr_input.fy.val(fracy);
          						grad.setAttribute('fx', fracx);
          						grad.setAttribute('fy', fracy);
          						xform();
          				}
          				
          				evt.preventDefault();
          			}
          			
          			var onCoordUp = function() {
          				draggingCoord = null;
          				$win.unbind('mousemove', onCoordDrag).unbind('mouseup', onCoordUp);
          			}
          			
          			// Linear gradient
          // 			(function() {
          
          			
          			stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop');
          
          			// if there are not at least two stops, then 
          			if (numstops < 2) {
          				while (numstops < 2) {
          					curGradient.appendChild( document.createElementNS(ns.svg, 'stop') );
          					++numstops;
          				}
          				stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop');
          			}
          			
          			var numstops = stops.length;				
          			for(var i = 0; i < numstops; i++) {
          				mkStop(0, 0, 0, 0, stops[i]);
          			}
          			
          			spreadMethodOpt.val(curGradient.getAttribute('spreadMethod') || 'pad');
          
          			var offset;
          			
          			// No match, so show focus point
          			var showFocus = false; 
          			
          			previewRect.setAttribute('fill-opacity', gradalpha/100);
          
          			
          			$('#' + id + ' div.grad_coord').mousedown(function(evt) {
          				evt.preventDefault();
          				draggingCoord = $(this);
          				var s_pos = draggingCoord.offset();
          				offset = draggingCoord.parent().offset();
          				$win.mousemove(onCoordDrag).mouseup(onCoordUp);
          			});
          			
          			// bind GUI elements
          			$('#'+id+'_jGraduate_Ok').bind('click', function() {
          				$this.paint.type = curType;
          				$this.paint[curType] = curGradient.cloneNode(true);;
          				$this.paint.solidColor = null;
          				okClicked();
          			});
          			$('#'+id+'_jGraduate_Cancel').bind('click', function(paint) {
          				cancelClicked();
          			});
          
          			if(curType === 'radialGradient') {
          				if(showFocus) {
          					focusCoord.show();				
          				} else {
          					focusCoord.hide();
          					attr_input.fx.val("");
          					attr_input.fy.val("");
          				}
          			}
          
          			$("#" + id + "_jGraduate_match_ctr")[0].checked = !showFocus;
          			
          			var lastfx, lastfy;
          			
          			$("#" + id + "_jGraduate_match_ctr").change(function() {
          				showFocus = !this.checked;
          				focusCoord.toggle(showFocus);
          				attr_input.fx.val('');
          				attr_input.fy.val('');
          				var grad = curGradient;
          				if(!showFocus) {
          					lastfx = grad.getAttribute('fx');
          					lastfy = grad.getAttribute('fy');
          					grad.removeAttribute('fx');
          					grad.removeAttribute('fy');
          				} else {
          					var fx = lastfx || .5;
          					var fy = lastfy || .5;
          					grad.setAttribute('fx', fx);
          					grad.setAttribute('fy', fy);
          					attr_input.fx.val(fx);
          					attr_input.fy.val(fy);
          				}
          			});
          			
          			var stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop');
          			var numstops = stops.length;
          			// if there are not at least two stops, then 
          			if (numstops < 2) {
          				while (numstops < 2) {
          					curGradient.appendChild( document.createElementNS(ns.svg, 'stop') );
          					++numstops;
          				}
          				stops = curGradient.getElementsByTagNameNS(ns.svg, 'stop');
          			}
          			
          			var slider;
          			
          			var setSlider = function(e) {
          				var offset = slider.offset;
          				var div = slider.parent;
          				var x = (e.pageX - offset.left - parseInt(div.css('border-left-width')));
          				if (x > SLIDERW) x = SLIDERW;
          				if (x <= 0) x = 0;
          				var posx = x - 5;
          				x /= SLIDERW;
          				
          				switch ( slider.type ) {
          					case 'radius':
          						x = Math.pow(x * 2, 2.5);
          						if(x > .98 && x < 1.02) x = 1;
          						if (x <= .01) x = .01;
          						curGradient.setAttribute('r', x);
          						break;
          					case 'opacity':
          						$this.paint.alpha = parseInt(x*100);
          						previewRect.setAttribute('fill-opacity', x);
          						break;
          					case 'ellip':
          						scale_x = 1, scale_y = 1;
          						if(x < .5) {
          							x /= .5; // 0.001
          							scale_x = x <= 0 ? .01 : x;
          						} else if(x > .5) {
          							x /= .5; // 2
          							x = 2 - x;
          							scale_y = x <= 0 ? .01 : x;
          						} 
          						xform();
          						x -= 1;
          						if(scale_y === x + 1) {
          							x = Math.abs(x);
          						}
          						break;
          					case 'angle':
          						x = x - .5;
          						angle = x *= 180;
          						xform();
          						x /= 100;
          						break;
          				}
          				slider.elem.css({'margin-left':posx});
          				x = Math.round(x*100);
          				slider.input.val(x);
          			};
          			
          			var ellip_val = 0, angle_val = 0;
          			
          			if(curType === 'radialGradient') {
          				var tlist = curGradient.gradientTransform.baseVal;
          				if(tlist.numberOfItems === 2) {
          					var t = tlist.getItem(0);
          					var s = tlist.getItem(1);
          					if(t.type === 2 && s.type === 3) {
          						var m = s.matrix;
          						if(m.a !== 1) {
          							ellip_val = Math.round(-(1 - m.a) * 100);	
          						} else if(m.d !== 1) {
          							ellip_val = Math.round((1 - m.d) * 100);
          						} 
          					}
          				} else if(tlist.numberOfItems === 3) {
          					// Assume [R][T][S]
          					var r = tlist.getItem(0);
          					var t = tlist.getItem(1);
          					var s = tlist.getItem(2);
          					
          					if(r.type === 4 
          						&& t.type === 2 
          						&& s.type === 3) {
          
          						angle_val = Math.round(r.angle);
          						var m = s.matrix;
          						if(m.a !== 1) {
          							ellip_val = Math.round(-(1 - m.a) * 100);	
          						} else if(m.d !== 1) {
          							ellip_val = Math.round((1 - m.d) * 100);
          						} 
          						
          					}
          				}
          			}
          			
          			var sliders = {
          				radius: {
          					handle: '#' + id + '_jGraduate_RadiusArrows',
          					input: '#' + id + '_jGraduate_RadiusInput',
          					val: (curGradient.getAttribute('r') || .5) * 100
          				},
          				opacity: {
          					handle: '#' + id + '_jGraduate_OpacArrows',
          					input: '#' + id + '_jGraduate_OpacInput',
          					val: $this.paint.alpha || 100
          				},
          				ellip: {
          					handle: '#' + id + '_jGraduate_EllipArrows',
          					input: '#' + id + '_jGraduate_EllipInput',
          					val: ellip_val
          				},
          				angle: {
          					handle: '#' + id + '_jGraduate_AngleArrows',
          					input: '#' + id + '_jGraduate_AngleInput',
          					val: angle_val
          				}
          			}
          			
          			$.each(sliders, function(type, data) {
          				var handle = $(data.handle);
          				handle.mousedown(function(evt) {
          					var parent = handle.parent();
          					slider = {
          						type: type,
          						elem: handle,
          						input: $(data.input),
          						parent: parent,
          						offset: parent.offset()
          					};
          					$win.mousemove(dragSlider).mouseup(stopSlider);
          					evt.preventDefault();
          				});
          				
          				$(data.input).val(data.val).change(function() {
          					var val = +this.value;
          					var xpos = 0;
          					var isRad = curType === 'radialGradient';
          					switch ( type ) {
          						case 'radius':
          							if(isRad) curGradient.setAttribute('r', val / 100);
          							xpos = (Math.pow(val / 100, 1 / 2.5) / 2) * SLIDERW;
          							break;
          						
          						case 'opacity':
          							$this.paint.alpha = val;
          							previewRect.setAttribute('fill-opacity', val / 100);
          							xpos = val * (SLIDERW / 100);
          							break;
          							
          						case 'ellip':
          							scale_x = scale_y = 1;
          							if(val === 0) {
          								xpos = SLIDERW * .5;
          								break;
          							}
          							if(val > 99.5) val = 99.5;
          							if(val > 0) {
          								scale_y = 1 - (val / 100);
          							} else {
          								scale_x = - (val / 100) - 1;
          							}
          
          							xpos = SLIDERW * ((val + 100) / 2) / 100;
          							if(isRad) xform();
          							break;
          						
          						case 'angle':
          							angle = val;
          							xpos = angle / 180;
          							xpos += .5;
          							xpos *= SLIDERW;
          							if(isRad) xform();
          					}
          					if(xpos > SLIDERW) {
          						xpos = SLIDERW;
          					} else if(xpos < 0) {
          						xpos = 0;
          					}
          					handle.css({'margin-left': xpos - 5});
          				}).change();
          			});
          			
          			var dragSlider = function(evt) {
          				setSlider(evt);
          				evt.preventDefault();
          			};
          			
          			var stopSlider = function(evt) {
          				$win.unbind('mousemove', dragSlider).unbind('mouseup', stopSlider);
          				slider = null;
          			};
          			
          			
          			// --------------
          			var thisAlpha = ($this.paint.alpha*255/100).toString(16);
          			while (thisAlpha.length < 2) { thisAlpha = "0" + thisAlpha; }
          			thisAlpha = thisAlpha.split(".")[0];
          			color = $this.paint.solidColor == "none" ? "" : $this.paint.solidColor + thisAlpha;
          			
          			if(!isSolid) {
          				color = stops[0].getAttribute('stop-color');
          			}
          			
          			// This should be done somewhere else, probably
          			$.extend($.fn.jPicker.defaults.window, {
          				alphaSupport: true, effects: {type: 'show',speed: 0}
          			});
          			
          			colPicker.jPicker(
          				{
          					window: { title: $settings.window.pickerTitle },
          					images: { clientPath: $settings.images.clientPath },
          					color: { active: color, alphaSupport: true }
          				},
          				function(color) {
          					$this.paint.type = "solidColor";
          					$this.paint.alpha = color.val('ahex') ? Math.round((color.val('a') / 255) * 100) : 100;
          					$this.paint.solidColor = color.val('hex') ? color.val('hex') : "none";
          					$this.paint.radialGradient = null;
          					okClicked(); 
          				},
          				null,
          				function(){ cancelClicked(); }
          				);
          
          			
          			var tabs = $(idref + ' .jGraduate_tabs li');
          			tabs.click(function() {
          				tabs.removeClass('jGraduate_tab_current');
          				$(this).addClass('jGraduate_tab_current');
          				$(idref + " > div").hide();
          				var type = $(this).attr('data-type');
          				var container = $(idref + ' .jGraduate_gradPick').show();
          				if(type === 'rg' || type === 'lg') {
          					// Show/hide appropriate fields
          					$('.jGraduate_' + type + '_field').show();
          					$('.jGraduate_' + (type === 'lg' ? 'rg' : 'lg') + '_field').hide();
          					
          					$('#' + id + '_jgraduate_rect')[0].setAttribute('fill', 'url(#' + id + '_' + type + '_jgraduate_grad)');
          					
          					// Copy stops
          					
          					curType = type === 'lg' ? 'linearGradient' : 'radialGradient';
          					
          					$('#' + id + '_jGraduate_OpacInput').val($this.paint.alpha).change();
          					
          					var newGrad = $('#' + id + '_' + type + '_jgraduate_grad')[0];
          					
          					if(curGradient !== newGrad) {
          						var cur_stops = $(curGradient).find('stop');	
          						$(newGrad).empty().append(cur_stops);
          						curGradient = newGrad;
          						var sm = spreadMethodOpt.val();
          						curGradient.setAttribute('spreadMethod', sm);
          					}
          					showFocus = type === 'rg' && curGradient.getAttribute('fx') != null && !(cx == fx && cy == fy);
          					$('#' + id + '_jGraduate_focusCoord').toggle(showFocus);
          					if(showFocus) {
          						$('#' + id + '_jGraduate_match_ctr')[0].checked = false;
          					}
          				} else {
          					$(idref + ' .jGraduate_gradPick').hide();
          					$(idref + ' .jGraduate_colPick').show();
          				}
          			});
          			$(idref + " > div").hide();
          			tabs.removeClass('jGraduate_tab_current');
          			var tab;
          			switch ( $this.paint.type ) {
          				case 'linearGradient':
          					tab = $(idref + ' .jGraduate_tab_lingrad');
          					break;
          				case 'radialGradient':
          					tab = $(idref + ' .jGraduate_tab_radgrad');
          					break;
          				default:
          					tab = $(idref + ' .jGraduate_tab_color');
          					break;
          			}
          			$this.show();
          			
          			// jPicker will try to show after a 0ms timeout, so need to fire this after that
          			setTimeout(function() {
          				tab.addClass('jGraduate_tab_current').click();	
          			}, 10);
          		});
          	};
          })();
        • jquery.jgraduate.min.js
          (function(){function r(i,z,t){i=document.createElementNS(A.svg,i);if(Ba)for(var B in z)i.setAttribute(B,z[B]);else for(B in z){var W=z[B],w=i[B];if(w&&w.constructor==="SVGLength")w.baseVal.value=W;else i.setAttribute(B,W)}t&&t.appendChild(i);return i}var A={svg:"http://www.w3.org/2000/svg",xlink:"http://www.w3.org/1999/xlink"};if(!window.console)window.console=new function(){this.log=function(){};this.dir=function(){}};$.jGraduate={Paint:function(i){i=i||{};this.alpha=isNaN(i.alpha)?100:i.alpha;if(i.copy){this.type=
          i.copy.type;this.alpha=i.copy.alpha;this.radialGradient=this.linearGradient=this.solidColor=null;switch(this.type){case "solidColor":this.solidColor=i.copy.solidColor;break;case "linearGradient":this.linearGradient=i.copy.linearGradient.cloneNode(true);break;case "radialGradient":this.radialGradient=i.copy.radialGradient.cloneNode(true)}}else if(i.linearGradient){this.type="linearGradient";this.radialGradient=this.solidColor=null;this.linearGradient=i.linearGradient.cloneNode(true)}else if(i.radialGradient){this.type=
          "radialGradient";this.linearGradient=this.solidColor=null;this.radialGradient=i.radialGradient.cloneNode(true)}else if(i.solidColor){this.type="solidColor";this.solidColor=i.solidColor}else{this.type="none";this.radialGradient=this.linearGradient=this.solidColor=null}}};jQuery.fn.jGraduateDefaults={paint:new $.jGraduate.Paint,window:{pickerTitle:"Drag markers to pick a paint"},images:{clientPath:"images/"},newstop:"inverse"};var Ba=navigator.userAgent.indexOf("Gecko/")>=0;jQuery.fn.jGraduate=function(i){var z=
          arguments;return this.each(function(){function t(c,a,d,h,f){var l=f||r("stop",{"stop-color":a,"stop-opacity":d,offset:c},g);if(f){a=f.getAttribute("stop-color");d=f.getAttribute("stop-opacity");c=f.getAttribute("offset")}else g.appendChild(l);if(d===null)d=1;f=r("path",{d:"M-6.2,0.9c3.6-4,6.7-4.3,6.7-12.4c-0.2,7.9,3.1,8.8,6.5,12.4c3.5,3.8,2.9,9.6,0,12.3c-3.1,2.8-10.4,2.7-13.2,0C-9.6,9.9-9.4,4.4-6.2,0.9z",fill:"url(#jGraduate_trans)",transform:"translate("+(10+c*j)+", 26)"},fa);var X=r("path",{d:"M-6.2,0.9c3.6-4,6.7-4.3,6.7-12.4c-0.2,7.9,3.1,8.8,6.5,12.4c3.5,3.8,2.9,9.6,0,12.3c-3.1,2.8-10.4,2.7-13.2,0C-9.6,9.9-9.4,4.4-6.2,0.9z",
          fill:a,"fill-opacity":d,transform:"translate("+(10+c*j)+", 26)",stroke:"#000","stroke-width":1.5},fa);$(X).mousedown(function(M){B(this);R=F;N.mousemove(la).mouseup(W);S=ga.offset();M.preventDefault();return false}).data("stop",l).data("bg",f).dblclick(function(){$("div.jGraduate_LightBox").show();for(var M=this,I=+l.getAttribute("stop-opacity")||1,C=l.getAttribute("stop-color")||1,Y=(parseFloat(I)*255).toString(16);Y.length<2;)Y="0"+Y;a=C.substr(1)+Y;$("#"+b+"_jGraduate_stopPicker").css({left:100,
          bottom:15}).jPicker({window:{title:"Pick the start color and opacity for the gradient"},images:{clientPath:o.images.clientPath},color:{active:a,alphaSupport:true}},function(Z){C=Z.val("hex")?"#"+Z.val("hex"):"none";I=Z.val("a")!==null?Z.val("a")/256:1;M.setAttribute("fill",C);M.setAttribute("fill-opacity",I);l.setAttribute("stop-color",C);l.setAttribute("stop-opacity",I);$("div.jGraduate_LightBox").hide();$("#"+b+"_jGraduate_stopPicker").hide()},null,function(){$("div.jGraduate_LightBox").hide();
          $("#"+b+"_jGraduate_stopPicker").hide()})});$(g).find("stop").each(function(){var M=$(this);if(+this.getAttribute("offset")>c){if(!a){var I=this.getAttribute("stop-color"),C=this.getAttribute("stop-opacity");l.setAttribute("stop-color",I);X.setAttribute("fill",I);l.setAttribute("stop-opacity",C===null?1:C);X.setAttribute("fill-opacity",C===null?1:C)}M.before(l);return false}});h&&B(X);return l}function B(c){F&&F.setAttribute("stroke","#000");c.setAttribute("stroke","blue");F=c;F.parentNode.appendChild(F)}
          function W(){N.unbind("mousemove",la);if(O.getAttribute("display")!=="none"){O.setAttribute("display","none");var c=$(F),a=c.data("stop");c=c.data("bg");$([F,a,c]).remove()}R=null}function w(){var c=T?"rotate("+T+","+ha+","+ia+") ":"";J===1&&G===1?g.removeAttribute("gradientTransform"):g.setAttribute("gradientTransform",c+"translate("+-ha*(J-1)+","+-ia*(G-1)+") scale("+J+","+G+")")}function la(c){var a=c.pageX-S.left;c=c.pageY-S.top;a=a<10?10:a>j+10?j+10:a;var d="translate("+a+", 26)";if(c<-60||c>
          130){O.setAttribute("display","block");O.setAttribute("transform",d)}else O.setAttribute("display","none");R.setAttribute("transform",d);$.data(R,"bg").setAttribute("transform",d);$.data(R,"stop").setAttribute("offset",(a-10)/j);var h=0;$(g).find("stop").each(function(){var f=this.getAttribute("offset"),l=$(this);if(f<h){l.prev().before(l);D=$(g).find("stop")}h=f})}var e=$(this),o=$.extend(true,{},jQuery.fn.jGraduateDefaults,i),b=e.attr("id"),s="#"+e.attr("id")+" ";if(s){var ma=function(){switch(e.paint.type){case "radialGradient":e.paint.linearGradient=
          null;break;case "linearGradient":e.paint.radialGradient=null;break;case "solidColor":e.paint.radialGradient=e.paint.linearGradient=null}$.isFunction(e.okCallback)&&e.okCallback(e.paint);e.hide()},na=function(){$.isFunction(e.cancelCallback)&&e.cancelCallback();e.hide()};$.extend(true,e,{paint:new $.jGraduate.Paint({copy:o.paint}),okCallback:$.isFunction(z[1])&&z[1]||null,cancelCallback:$.isFunction(z[2])&&z[2]||null});e.position();var u=null,N=$(window);if(e.paint.type=="none")e.paint=$.jGraduate.Paint({solidColor:"ffffff"});
          e.addClass("jGraduate_Picker");e.html('<ul class="jGraduate_tabs"><li class="jGraduate_tab_color jGraduate_tab_current" data-type="col">Solid Color</li><li class="jGraduate_tab_lingrad" data-type="lg">Linear Gradient</li><li class="jGraduate_tab_radgrad" data-type="rg">Radial Gradient</li></ul><div class="jGraduate_colPick"></div><div class="jGraduate_gradPick"></div><div class="jGraduate_LightBox"></div><div id="'+b+'_jGraduate_stopPicker" class="jGraduate_stopPicker"></div>');var Ca=$(s+"> .jGraduate_colPick"),
          n=$(s+"> .jGraduate_gradPick");n.html('<div id="'+b+'_jGraduate_Swatch" class="jGraduate_Swatch"><h2 class="jGraduate_Title">'+o.window.pickerTitle+'</h2><div id="'+b+'_jGraduate_GradContainer" class="jGraduate_GradContainer"></div><div id="'+b+'_jGraduate_StopSlider" class="jGraduate_StopSlider"></div></div><div class="jGraduate_Form jGraduate_Points jGraduate_lg_field"><div class="jGraduate_StopSection"><label class="jGraduate_Form_Heading">Begin Point</label><div class="jGraduate_Form_Section"><label>x:</label><input type="text" id="'+
          b+'_jGraduate_x1" size="3" title="Enter starting x value between 0.0 and 1.0"/><label> y:</label><input type="text" id="'+b+'_jGraduate_y1" size="3" title="Enter starting y value between 0.0 and 1.0"/></div></div><div class="jGraduate_StopSection"><label class="jGraduate_Form_Heading">End Point</label><div class="jGraduate_Form_Section"><label>x:</label><input type="text" id="'+b+'_jGraduate_x2" size="3" title="Enter ending x value between 0.0 and 1.0"/><label> y:</label><input type="text" id="'+
          b+'_jGraduate_y2" size="3" title="Enter ending y value between 0.0 and 1.0"/></div></div></div><div class="jGraduate_Form jGraduate_Points jGraduate_rg_field"><div class="jGraduate_StopSection"><label class="jGraduate_Form_Heading">Center Point</label><div class="jGraduate_Form_Section"><label>x:</label><input type="text" id="'+b+'_jGraduate_cx" size="3" title="Enter x value between 0.0 and 1.0"/><label> y:</label><input type="text" id="'+b+'_jGraduate_cy" size="3" title="Enter y value between 0.0 and 1.0"/></div></div><div class="jGraduate_StopSection"><label class="jGraduate_Form_Heading">Focal Point</label><div class="jGraduate_Form_Section"><label>Match center: <input type="checkbox" checked="checked" id="'+
          b+'_jGraduate_match_ctr"/></label><br/><label>x:</label><input type="text" id="'+b+'_jGraduate_fx" size="3" title="Enter x value between 0.0 and 1.0"/><label> y:</label><input type="text" id="'+b+'_jGraduate_fy" size="3" title="Enter y value between 0.0 and 1.0"/></div></div></div><div class="jGraduate_StopSection jGraduate_SpreadMethod"><label class="jGraduate_Form_Heading">Spread method</label><div class="jGraduate_Form_Section"><select class="jGraduate_spreadMethod"><option value=pad selected>Pad</option><option value=reflect>Reflect</option><option value=repeat>Repeat</option></select></div></div><div class="jGraduate_Form"><div class="jGraduate_Slider jGraduate_RadiusField jGraduate_rg_field"><label class="prelabel">Radius:</label><div id="'+
          b+'_jGraduate_Radius" class="jGraduate_SliderBar jGraduate_Radius" title="Click to set radius"><img id="'+b+'_jGraduate_RadiusArrows" class="jGraduate_RadiusArrows" src="'+o.images.clientPath+'rangearrows2.gif"></div><label><input type="text" id="'+b+'_jGraduate_RadiusInput" size="3" value="100"/>%</label></div><div class="jGraduate_Slider jGraduate_EllipField jGraduate_rg_field"><label class="prelabel">Ellip:</label><div id="'+b+'_jGraduate_Ellip" class="jGraduate_SliderBar jGraduate_Ellip" title="Click to set Ellip"><img id="'+
          b+'_jGraduate_EllipArrows" class="jGraduate_EllipArrows" src="'+o.images.clientPath+'rangearrows2.gif"></div><label><input type="text" id="'+b+'_jGraduate_EllipInput" size="3" value="0"/>%</label></div><div class="jGraduate_Slider jGraduate_AngleField jGraduate_rg_field"><label class="prelabel">Angle:</label><div id="'+b+'_jGraduate_Angle" class="jGraduate_SliderBar jGraduate_Angle" title="Click to set Angle"><img id="'+b+'_jGraduate_AngleArrows" class="jGraduate_AngleArrows" src="'+o.images.clientPath+
          'rangearrows2.gif"></div><label><input type="text" id="'+b+'_jGraduate_AngleInput" size="3" value="0"/>deg</label></div><div class="jGraduate_Slider jGraduate_OpacField"><label class="prelabel">Opac:</label><div id="'+b+'_jGraduate_Opac" class="jGraduate_SliderBar jGraduate_Opac" title="Click to set Opac"><img id="'+b+'_jGraduate_OpacArrows" class="jGraduate_OpacArrows" src="'+o.images.clientPath+'rangearrows2.gif"></div><label><input type="text" id="'+b+'_jGraduate_OpacInput" size="3" value="100"/>%</label></div></div><div class="jGraduate_OkCancel"><input type="button" id="'+
          b+'_jGraduate_Ok" class="jGraduate_Ok" value="OK"/><input type="button" id="'+b+'_jGraduate_Cancel" class="jGraduate_Cancel" value="Cancel"/></div>');var j=256,oa=j-0,pa=j-0,p,g,aa,q={};$(".jGraduate_SliderBar").width(145);var x=$("#"+b+"_jGraduate_GradContainer")[0],m=r("svg",{id:b+"_jgraduate_svg",width:j,height:j,xmlns:A.svg},x);p=p||e.paint.type;var v=g=e.paint[p],U=e.paint.alpha,ba=p==="solidColor";switch(p){case "solidColor":case "linearGradient":if(!ba){g.id=b+"_lg_jgraduate_grad";v=g=m.appendChild(g)}r("radialGradient",
          {id:b+"_rg_jgraduate_grad"},m);if(p==="linearGradient")break;case "radialGradient":if(!ba){g.id=b+"_rg_jgraduate_grad";v=g=m.appendChild(g)}r("linearGradient",{id:b+"_lg_jgraduate_grad"},m)}if(ba){v=g=$("#"+b+"_lg_jgraduate_grad")[0];u=e.paint[p];t(0,"#"+u,1);var K=typeof o.newstop;if(K==="string")switch(o.newstop){case "same":t(1,"#"+u,1);break;case "inverse":K="";for(var y=0;y<6;y+=2){u.substr(y,2);var P=(255-parseInt(u.substr(y,2),16)).toString(16);if(P.length<2)P=0+P;K+=P}t(1,"#"+K,1);break;case "white":t(1,
          "#ffffff",1);break;case "black":t(1,"#000000",1)}else if(K==="object")t(1,o.newstop.color||"#"+u,"opac"in o.newstop?o.newstop.opac:1)}u=parseFloat(v.getAttribute("x1")||0);K=parseFloat(v.getAttribute("y1")||0);y=parseFloat(v.getAttribute("x2")||1);P=parseFloat(v.getAttribute("y2")||0);var ca=parseFloat(v.getAttribute("cx")||0.5),da=parseFloat(v.getAttribute("cy")||0.5),qa=parseFloat(v.getAttribute("fx")||ca),ra=parseFloat(v.getAttribute("fy")||da);aa=r("rect",{id:b+"_jgraduate_rect",x:0,y:0,width:oa,
          height:pa,fill:"url(#"+b+"_jgraduate_grad)","fill-opacity":U/100},m);var sa=$("<div/>").attr({"class":"grad_coord jGraduate_lg_field",title:"Begin Stop"}).text(1).css({top:K*j,left:u*j}).data("coord","start").appendTo(x),Da=sa.clone().text(2).css({top:P*j,left:y*j}).attr("title","End stop").data("coord","end").appendTo(x),ta=$("<div/>").attr({"class":"grad_coord jGraduate_rg_field",title:"Center stop"}).text("C").css({top:da*j,left:ca*j}).data("coord","center").appendTo(x),V=ta.clone().text("F").css({top:ra*
          j,left:qa*j,display:"none"}).attr("title","Focus point").data("coord","focus").appendTo(x);V[0].id=b+"_jGraduate_focusCoord";$(s+" .grad_coord");$.each(["x1","y1","x2","y2","cx","cy","fx","fy"],function(c,a){var d=g.getAttribute(a),h=isNaN(a[1]);d||(d=h?"0.5":a==="x2"?"1.0":"0.0");q[a]=$("#"+b+"_jGraduate_"+a).val(d).change(function(){if(isNaN(parseFloat(this.value))||this.value<0)this.value=0;else if(this.value>1)this.value=1;if(!(a[0]==="f"&&!E))if(h&&p==="radialGradient"||!h&&p==="linearGradient")g.setAttribute(a,
          this.value);var f=h?a[0]==="c"?ta:V:a[1]==="1"?sa:Da,l=a.indexOf("x")>=0?"left":"top";f.css(l,this.value*j)}).change()});var D,fa,ga=$("#"+b+"_jGraduate_StopSlider"),F,H,R,O=r("path",{d:"m9.75,-6l-19.5,19.5m0,-19.5l19.5,19.5",fill:"none",stroke:"#D00","stroke-width":5,display:"none"},H),S,J=1,G=1,T=0,ha=ca,ia=da;H=r("svg",{width:"100%",height:45},ga[0]);x=r("pattern",{width:16,height:16,patternUnits:"userSpaceOnUse",id:"jGraduate_trans"},H);r("image",{width:16,height:16},x).setAttributeNS(A.xlink,
          "xlink:href",o.images.clientPath+"map-opacity.png");$(H).click(function(c){S=ga.offset();if(c.target.tagName!=="path"){var a=c.pageX-S.left-8;a=a<10?10:a>j+10?j+10:a;t(a/j,0,0,true);c.stopPropagation()}});$(H).mouseover(function(){H.appendChild(O)});fa=r("g",{},H);r("line",{x1:10,y1:15,x2:j+10,y2:15,"stroke-width":2,stroke:"#000"},H);var ua=n.find(".jGraduate_spreadMethod").change(function(){g.setAttribute("spreadMethod",$(this).val())}),Q=null,va=function(c){var a=c.pageX-ja.left,d=c.pageY-ja.top;
          a=a<0?0:a>j?j:a;d=d<0?0:d>j?j:d;Q.css("left",a).css("top",d);a=a/oa;d=d/pa;var h=Q.data("coord"),f=g;switch(h){case "start":q.x1.val(a);q.y1.val(d);f.setAttribute("x1",a);f.setAttribute("y1",d);break;case "end":q.x2.val(a);q.y2.val(d);f.setAttribute("x2",a);f.setAttribute("y2",d);break;case "center":q.cx.val(a);q.cy.val(d);f.setAttribute("cx",a);f.setAttribute("cy",d);ha=a;ia=d;w();break;case "focus":q.fx.val(a);q.fy.val(d);f.setAttribute("fx",a);f.setAttribute("fy",d);w()}c.preventDefault()},wa=
          function(){Q=null;N.unbind("mousemove",va).unbind("mouseup",wa)};D=g.getElementsByTagNameNS(A.svg,"stop");if(k<2){for(;k<2;){g.appendChild(document.createElementNS(A.svg,"stop"));++k}D=g.getElementsByTagNameNS(A.svg,"stop")}var k=D.length;for(y=0;y<k;y++)t(0,0,0,0,D[y]);ua.val(g.getAttribute("spreadMethod")||"pad");var ja,E=false;aa.setAttribute("fill-opacity",U/100);$("#"+b+" div.grad_coord").mousedown(function(c){c.preventDefault();Q=$(this);Q.offset();ja=Q.parent().offset();N.mousemove(va).mouseup(wa)});
          $("#"+b+"_jGraduate_Ok").bind("click",function(){e.paint.type=p;e.paint[p]=g.cloneNode(true);e.paint.solidColor=null;ma()});$("#"+b+"_jGraduate_Cancel").bind("click",function(){na()});if(p==="radialGradient")if(E)V.show();else{V.hide();q.fx.val("");q.fy.val("")}$("#"+b+"_jGraduate_match_ctr")[0].checked=!E;var xa,ya;$("#"+b+"_jGraduate_match_ctr").change(function(){E=!this.checked;V.toggle(E);q.fx.val("");q.fy.val("");var c=g;if(E){var a=xa||0.5,d=ya||0.5;c.setAttribute("fx",a);c.setAttribute("fy",
          d);q.fx.val(a);q.fy.val(d)}else{xa=c.getAttribute("fx");ya=c.getAttribute("fy");c.removeAttribute("fx");c.removeAttribute("fy")}});D=g.getElementsByTagNameNS(A.svg,"stop");k=D.length;if(k<2){for(;k<2;){g.appendChild(document.createElementNS(A.svg,"stop"));++k}D=g.getElementsByTagNameNS(A.svg,"stop")}var L;U=n=0;if(p==="radialGradient"){m=g.gradientTransform.baseVal;if(m.numberOfItems===2){k=m.getItem(0);m=m.getItem(1);if(k.type===2&&m.type===3){k=m.matrix;if(k.a!==1)n=Math.round(-(1-k.a)*100);else if(k.d!==
          1)n=Math.round((1-k.d)*100)}}else if(m.numberOfItems===3){x=m.getItem(0);k=m.getItem(1);m=m.getItem(2);if(x.type===4&&k.type===2&&m.type===3){U=Math.round(x.angle);k=m.matrix;if(k.a!==1)n=Math.round(-(1-k.a)*100);else if(k.d!==1)n=Math.round((1-k.d)*100)}}}n={radius:{handle:"#"+b+"_jGraduate_RadiusArrows",input:"#"+b+"_jGraduate_RadiusInput",val:(g.getAttribute("r")||0.5)*100},opacity:{handle:"#"+b+"_jGraduate_OpacArrows",input:"#"+b+"_jGraduate_OpacInput",val:e.paint.alpha||100},ellip:{handle:"#"+
          b+"_jGraduate_EllipArrows",input:"#"+b+"_jGraduate_EllipInput",val:n},angle:{handle:"#"+b+"_jGraduate_AngleArrows",input:"#"+b+"_jGraduate_AngleInput",val:U}};$.each(n,function(c,a){var d=$(a.handle);d.mousedown(function(h){var f=d.parent();L={type:c,elem:d,input:$(a.input),parent:f,offset:f.offset()};N.mousemove(za).mouseup(Aa);h.preventDefault()});$(a.input).val(a.val).change(function(){var h=+this.value,f=0,l=p==="radialGradient";switch(c){case "radius":l&&g.setAttribute("r",h/100);f=Math.pow(h/
          100,0.4)/2*145;break;case "opacity":e.paint.alpha=h;aa.setAttribute("fill-opacity",h/100);f=h*1.45;break;case "ellip":J=G=1;if(h===0){f=72.5;break}if(h>99.5)h=99.5;if(h>0)G=1-h/100;else J=-(h/100)-1;f=145*((h+100)/2)/100;l&&w();break;case "angle":T=h;f=T/180;f+=0.5;f*=145;l&&w()}if(f>145)f=145;else if(f<0)f=0;d.css({"margin-left":f-5})}).change()});var za=function(c){var a=c.pageX-L.offset.left-parseInt(L.parent.css("border-left-width"));if(a>145)a=145;if(a<=0)a=0;var d=a-5;a/=145;switch(L.type){case "radius":a=
          Math.pow(a*2,2.5);if(a>0.98&&a<1.02)a=1;if(a<=0.01)a=0.01;g.setAttribute("r",a);break;case "opacity":e.paint.alpha=parseInt(a*100);aa.setAttribute("fill-opacity",a);break;case "ellip":G=J=1;if(a<0.5){a/=0.5;J=a<=0?0.01:a}else if(a>0.5){a/=0.5;a=2-a;G=a<=0?0.01:a}w();a-=1;if(G===a+1)a=Math.abs(a);break;case "angle":a-=0.5;T=a*=180;w();a/=100}L.elem.css({"margin-left":d});a=Math.round(a*100);L.input.val(a);c.preventDefault()},Aa=function(){N.unbind("mousemove",za).unbind("mouseup",Aa);L=null};for(n=
          (e.paint.alpha*255/100).toString(16);n.length<2;)n="0"+n;n=n.split(".")[0];u=e.paint.solidColor=="none"?"":e.paint.solidColor+n;ba||(u=D[0].getAttribute("stop-color"));$.extend($.fn.jPicker.defaults.window,{alphaSupport:true,effects:{type:"show",speed:0}});Ca.jPicker({window:{title:o.window.pickerTitle},images:{clientPath:o.images.clientPath},color:{active:u,alphaSupport:true}},function(c){e.paint.type="solidColor";e.paint.alpha=c.val("ahex")?Math.round(c.val("a")/255*100):100;e.paint.solidColor=
          c.val("hex")?c.val("hex"):"none";e.paint.radialGradient=null;ma()},null,function(){na()});var ka=$(s+" .jGraduate_tabs li");ka.click(function(){ka.removeClass("jGraduate_tab_current");$(this).addClass("jGraduate_tab_current");$(s+" > div").hide();var c=$(this).attr("data-type");$(s+" .jGraduate_gradPick").show();if(c==="rg"||c==="lg"){$(".jGraduate_"+c+"_field").show();$(".jGraduate_"+(c==="lg"?"rg":"lg")+"_field").hide();$("#"+b+"_jgraduate_rect")[0].setAttribute("fill","url(#"+b+"_"+c+"_jgraduate_grad)");
          p=c==="lg"?"linearGradient":"radialGradient";$("#"+b+"_jGraduate_OpacInput").val(e.paint.alpha).change();var a=$("#"+b+"_"+c+"_jgraduate_grad")[0];if(g!==a){var d=$(g).find("stop");$(a).empty().append(d);g=a;a=ua.val();g.setAttribute("spreadMethod",a)}E=c==="rg"&&g.getAttribute("fx")!=null&&!(ca==qa&&da==ra);$("#"+b+"_jGraduate_focusCoord").toggle(E);if(E)$("#"+b+"_jGraduate_match_ctr")[0].checked=false}else{$(s+" .jGraduate_gradPick").hide();$(s+" .jGraduate_colPick").show()}});$(s+" > div").hide();
          ka.removeClass("jGraduate_tab_current");var ea;switch(e.paint.type){case "linearGradient":ea=$(s+" .jGraduate_tab_lingrad");break;case "radialGradient":ea=$(s+" .jGraduate_tab_radgrad");break;default:ea=$(s+" .jGraduate_tab_color")}e.show();setTimeout(function(){ea.addClass("jGraduate_tab_current").click()},10)}else alert("Container element must have an id attribute to maintain unique id strings for sub-elements.")})}})();
      • jquery-ui
        • jquery-ui-1.8.17.custom.min.js
          /*!
           * jQuery UI 1.8.17
           *
           * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT or GPL Version 2 licenses.
           * http://jquery.org/license
           *
           * http://docs.jquery.com/UI
           */(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.17",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);/*!
           * jQuery UI Widget 1.8.17
           *
           * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT or GPL Version 2 licenses.
           * http://jquery.org/license
           *
           * http://docs.jquery.com/UI/Widget
           */(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);/*!
           * jQuery UI Mouse 1.8.17
           *
           * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT or GPL Version 2 licenses.
           * http://jquery.org/license
           *
           * http://docs.jquery.com/UI/Mouse
           *
           * Depends:
           *	jquery.ui.widget.js
           */(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);/*
           * jQuery UI Draggable 1.8.17
           *
           * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT or GPL Version 2 licenses.
           * http://jquery.org/license
           *
           * http://docs.jquery.com/UI/Draggables
           *
           * Depends:
           *	jquery.ui.core.js
           *	jquery.ui.mouse.js
           *	jquery.ui.widget.js
           */(function(a,b){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},destroy:function(){if(!!this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy();return this}},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle"))return!1;this.handle=this._getHandle(b);if(!this.handle)return!1;c.iframeFix&&a(c.iframeFix===!0?"iframe":c.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(a(this).offset()).appendTo("body")});return!0},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b),this._cacheHelperProportions(),a.ui.ddmanager&&(a.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(b),this.originalPageX=b.pageX,this.originalPageY=b.pageY,c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt),c.containment&&this._setContainment();if(this._trigger("start",b)===!1){this._clear();return!1}this._cacheHelperProportions(),a.ui.ddmanager&&!c.dropBehaviour&&a.ui.ddmanager.prepareOffsets(this,b),this.helper.addClass("ui-draggable-dragging"),this._mouseDrag(b,!0),a.ui.ddmanager&&a.ui.ddmanager.dragStart(this,b);return!0},_mouseDrag:function(b,c){this.position=this._generatePosition(b),this.positionAbs=this._convertPositionTo("absolute");if(!c){var d=this._uiHash();if(this._trigger("drag",b,d)===!1){this._mouseUp({});return!1}this.position=d.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";a.ui.ddmanager&&a.ui.ddmanager.drag(this,b);return!1},_mouseStop:function(b){var c=!1;a.ui.ddmanager&&!this.options.dropBehaviour&&(c=a.ui.ddmanager.drop(this,b)),this.dropped&&(c=this.dropped,this.dropped=!1);if((!this.element[0]||!this.element[0].parentNode)&&this.options.helper=="original")return!1;if(this.options.revert=="invalid"&&!c||this.options.revert=="valid"&&c||this.options.revert===!0||a.isFunction(this.options.revert)&&this.options.revert.call(this.element,c)){var d=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){d._trigger("stop",b)!==!1&&d._clear()})}else this._trigger("stop",b)!==!1&&this._clear();return!1},_mouseUp:function(b){this.options.iframeFix===!0&&a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),a.ui.ddmanager&&a.ui.ddmanager.dragStop(this,b);return a.ui.mouse.prototype._mouseUp.call(this,b)},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?!0:!1;a(this.options.handle,this.element).find("*").andSelf().each(function(){this==b.target&&(c=!0)});return c},_createHelper:function(b){var c=this.options,d=a.isFunction(c.helper)?a(c.helper.apply(this.element[0],[b])):c.helper=="clone"?this.element.clone().removeAttr("id"):this.element;d.parents("body").length||d.appendTo(c.appendTo=="parent"?this.element[0].parentNode:c.appendTo),d[0]!=this.element[0]&&!/(fixed|absolute)/.test(d.css("position"))&&d.css("position","absolute");return d},_adjustOffsetFromHelper:function(b){typeof b=="string"&&(b=b.split(" ")),a.isArray(b)&&(b={left:+b[0],top:+b[1]||0}),"left"in b&&(this.offset.click.left=b.left+this.margins.left),"right"in b&&(this.offset.click.left=this.helperProportions.width-b.right+this.margins.left),"top"in b&&(this.offset.click.top=b.top+this.margins.top),"bottom"in b&&(this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])&&(b.left+=this.scrollParent.scrollLeft(),b.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)b={top:0,left:0};return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var b=this.options;b.containment=="parent"&&(b.containment=this.helper[0].parentNode);if(b.containment=="document"||b.containment=="window")this.containment=[b.containment=="document"?0:a(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,b.containment=="document"?0:a(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(b.containment=="document"?0:a(window).scrollLeft())+a(b.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(b.containment=="document"?0:a(window).scrollTop())+(a(b.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(b.containment)&&b.containment.constructor!=Array){var c=a(b.containment),d=c[0];if(!d)return;var e=c.offset(),f=a(d).css("overflow")!="hidden";this.containment=[(parseInt(a(d).css("borderLeftWidth"),10)||0)+(parseInt(a(d).css("paddingLeft"),10)||0),(parseInt(a(d).css("borderTopWidth"),10)||0)+(parseInt(a(d).css("paddingTop"),10)||0),(f?Math.max(d.scrollWidth,d.offsetWidth):d.offsetWidth)-(parseInt(a(d).css("borderLeftWidth"),10)||0)-(parseInt(a(d).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(f?Math.max(d.scrollHeight,d.offsetHeight):d.offsetHeight)-(parseInt(a(d).css("borderTopWidth"),10)||0)-(parseInt(a(d).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=c}else b.containment.constructor==Array&&(this.containment=b.containment)},_convertPositionTo:function(b,c){c||(c=this.position);var d=b=="absolute"?1:-1,e=this.options,f=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=/(html|body)/i.test(f[0].tagName);return{top:c.top+this.offset.relative.top*d+this.offset.parent.top*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():g?0:f.scrollTop())*d),left:c.left+this.offset.relative.left*d+this.offset.parent.left*d-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:f.scrollLeft())*d)}},_generatePosition:function(b){var c=this.options,d=this.cssPosition=="absolute"&&(this.scrollParent[0]==document||!a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,e=/(html|body)/i.test(d[0].tagName),f=b.pageX,g=b.pageY;if(this.originalPosition){var h;if(this.containment){if(this.relative_container){var i=this.relative_container.offset();h=[this.containment[0]+i.left,this.containment[1]+i.top,this.containment[2]+i.left,this.containment[3]+i.top]}else h=this.containment;b.pageX-this.offset.click.left<h[0]&&(f=h[0]+this.offset.click.left),b.pageY-this.offset.click.top<h[1]&&(g=h[1]+this.offset.click.top),b.pageX-this.offset.click.left>h[2]&&(f=h[2]+this.offset.click.left),b.pageY-this.offset.click.top>h[3]&&(g=h[3]+this.offset.click.top)}if(c.grid){var j=c.grid[1]?this.originalPageY+Math.round((g-this.originalPageY)/c.grid[1])*c.grid[1]:this.originalPageY;g=h?j-this.offset.click.top<h[1]||j-this.offset.click.top>h[3]?j-this.offset.click.top<h[1]?j+c.grid[1]:j-c.grid[1]:j:j;var k=c.grid[0]?this.originalPageX+Math.round((f-this.originalPageX)/c.grid[0])*c.grid[0]:this.originalPageX;f=h?k-this.offset.click.left<h[0]||k-this.offset.click.left>h[2]?k-this.offset.click.left<h[0]?k+c.grid[0]:k-c.grid[0]:k:k}}return{top:g-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollTop():e?0:d.scrollTop()),left:f-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():e?0:d.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(b,c,d){d=d||this._uiHash(),a.ui.plugin.call(this,b,[c,d]),b=="drag"&&(this.positionAbs=this._convertPositionTo("absolute"));return a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(a){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),a.extend(a.ui.draggable,{version:"1.8.17"}),a.ui.plugin.add("draggable","connectToSortable",{start:function(b,c){var d=a(this).data("draggable"),e=d.options,f=a.extend({},c,{item:d.element});d.sortables=[],a(e.connectToSortable).each(function(){var c=a.data(this,"sortable");c&&!c.options.disabled&&(d.sortables.push({instance:c,shouldRevert:c.options.revert}),c.refreshPositions(),c._trigger("activate",b,f))})},stop:function(b,c){var d=a(this).data("draggable"),e=a.extend({},c,{item:d.element});a.each(d.sortables,function(){this.instance.isOver?(this.instance.isOver=0,d.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(b),this.instance.options.helper=this.instance.options._helper,d.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",b,e))})},drag:function(b,c){var d=a(this).data("draggable"),e=this,f=function(b){var c=this.offset.click.top,d=this.offset.click.left,e=this.positionAbs.top,f=this.positionAbs.left,g=b.height,h=b.width,i=b.top,j=b.left;return a.ui.isOver(e+c,f+d,i,j,g,h)};a.each(d.sortables,function(f){this.instance.positionAbs=d.positionAbs,this.instance.helperProportions=d.helperProportions,this.instance.offset.click=d.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=a(e).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return c.helper[0]},b.target=this.instance.currentItem[0],this.instance._mouseCapture(b,!0),this.instance._mouseStart(b,!0,!0),this.instance.offset.click.top=d.offset.click.top,this.instance.offset.click.left=d.offset.click.left,this.instance.offset.parent.left-=d.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=d.offset.parent.top-this.instance.offset.parent.top,d._trigger("toSortable",b),d.dropped=this.instance.element,d.currentItem=d.element,this.instance.fromOutside=d),this.instance.currentItem&&this.instance._mouseDrag(b)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",b,this.instance._uiHash(this.instance)),this.instance._mouseStop(b,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),d._trigger("fromSortable",b),d.dropped=!1)})}}),a.ui.plugin.add("draggable","cursor",{start:function(b,c){var d=a("body"),e=a(this).data("draggable").options;d.css("cursor")&&(e._cursor=d.css("cursor")),d.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;d._cursor&&a("body").css("cursor",d._cursor)}}),a.ui.plugin.add("draggable","opacity",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("opacity")&&(e._opacity=d.css("opacity")),d.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;d._opacity&&a(c.helper).css("opacity",d._opacity)}}),a.ui.plugin.add("draggable","scroll",{start:function(b,c){var d=a(this).data("draggable");d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"&&(d.overflowOffset=d.scrollParent.offset())},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=!1;if(d.scrollParent[0]!=document&&d.scrollParent[0].tagName!="HTML"){if(!e.axis||e.axis!="x")d.overflowOffset.top+d.scrollParent[0].offsetHeight-b.pageY<e.scrollSensitivity?d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop+e.scrollSpeed:b.pageY-d.overflowOffset.top<e.scrollSensitivity&&(d.scrollParent[0].scrollTop=f=d.scrollParent[0].scrollTop-e.scrollSpeed);if(!e.axis||e.axis!="y")d.overflowOffset.left+d.scrollParent[0].offsetWidth-b.pageX<e.scrollSensitivity?d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft+e.scrollSpeed:b.pageX-d.overflowOffset.left<e.scrollSensitivity&&(d.scrollParent[0].scrollLeft=f=d.scrollParent[0].scrollLeft-e.scrollSpeed)}else{if(!e.axis||e.axis!="x")b.pageY-a(document).scrollTop()<e.scrollSensitivity?f=a(document).scrollTop(a(document).scrollTop()-e.scrollSpeed):a(window).height()-(b.pageY-a(document).scrollTop())<e.scrollSensitivity&&(f=a(document).scrollTop(a(document).scrollTop()+e.scrollSpeed));if(!e.axis||e.axis!="y")b.pageX-a(document).scrollLeft()<e.scrollSensitivity?f=a(document).scrollLeft(a(document).scrollLeft()-e.scrollSpeed):a(window).width()-(b.pageX-a(document).scrollLeft())<e.scrollSensitivity&&(f=a(document).scrollLeft(a(document).scrollLeft()+e.scrollSpeed))}f!==!1&&a.ui.ddmanager&&!e.dropBehaviour&&a.ui.ddmanager.prepareOffsets(d,b)}}),a.ui.plugin.add("draggable","snap",{start:function(b,c){var d=a(this).data("draggable"),e=d.options;d.snapElements=[],a(e.snap.constructor!=String?e.snap.items||":data(draggable)":e.snap).each(function(){var b=a(this),c=b.offset();this!=d.element[0]&&d.snapElements.push({item:this,width:b.outerWidth(),height:b.outerHeight(),top:c.top,left:c.left})})},drag:function(b,c){var d=a(this).data("draggable"),e=d.options,f=e.snapTolerance,g=c.offset.left,h=g+d.helperProportions.width,i=c.offset.top,j=i+d.helperProportions.height;for(var k=d.snapElements.length-1;k>=0;k--){var l=d.snapElements[k].left,m=l+d.snapElements[k].width,n=d.snapElements[k].top,o=n+d.snapElements[k].height;if(!(l-f<g&&g<m+f&&n-f<i&&i<o+f||l-f<g&&g<m+f&&n-f<j&&j<o+f||l-f<h&&h<m+f&&n-f<i&&i<o+f||l-f<h&&h<m+f&&n-f<j&&j<o+f)){d.snapElements[k].snapping&&d.options.snap.release&&d.options.snap.release.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=!1;continue}if(e.snapMode!="inner"){var p=Math.abs(n-j)<=f,q=Math.abs(o-i)<=f,r=Math.abs(l-h)<=f,s=Math.abs(m-g)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n-d.helperProportions.height,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l-d.helperProportions.width}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m}).left-d.margins.left)}var t=p||q||r||s;if(e.snapMode!="outer"){var p=Math.abs(n-i)<=f,q=Math.abs(o-j)<=f,r=Math.abs(l-g)<=f,s=Math.abs(m-h)<=f;p&&(c.position.top=d._convertPositionTo("relative",{top:n,left:0}).top-d.margins.top),q&&(c.position.top=d._convertPositionTo("relative",{top:o-d.helperProportions.height,left:0}).top-d.margins.top),r&&(c.position.left=d._convertPositionTo("relative",{top:0,left:l}).left-d.margins.left),s&&(c.position.left=d._convertPositionTo("relative",{top:0,left:m-d.helperProportions.width}).left-d.margins.left)}!d.snapElements[k].snapping&&(p||q||r||s||t)&&d.options.snap.snap&&d.options.snap.snap.call(d.element,b,a.extend(d._uiHash(),{snapItem:d.snapElements[k].item})),d.snapElements[k].snapping=p||q||r||s||t}}}),a.ui.plugin.add("draggable","stack",{start:function(b,c){var d=a(this).data("draggable").options,e=a.makeArray(a(d.stack)).sort(function(b,c){return(parseInt(a(b).css("zIndex"),10)||0)-(parseInt(a(c).css("zIndex"),10)||0)});if(!!e.length){var f=parseInt(e[0].style.zIndex)||0;a(e).each(function(a){this.style.zIndex=f+a}),this[0].style.zIndex=f+e.length}}}),a.ui.plugin.add("draggable","zIndex",{start:function(b,c){var d=a(c.helper),e=a(this).data("draggable").options;d.css("zIndex")&&(e._zIndex=d.css("zIndex")),d.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;d._zIndex&&a(c.helper).css("zIndex",d._zIndex)}})})(jQuery);/*
           * jQuery UI Slider 1.8.17
           *
           * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT or GPL Version 2 licenses.
           * http://jquery.org/license
           *
           * http://docs.jquery.com/UI/Slider
           *
           * Depends:
           *	jquery.ui.core.js
           *	jquery.ui.mouse.js
           *	jquery.ui.widget.js
           */(function(a,b){var c=5;a.widget("ui.slider",a.ui.mouse,{widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var b=this,d=this.options,e=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),f="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",g=d.values&&d.values.length||1,h=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(d.disabled?" ui-slider-disabled ui-disabled":"")),this.range=a([]),d.range&&(d.range===!0&&(d.values||(d.values=[this._valueMin(),this._valueMin()]),d.values.length&&d.values.length!==2&&(d.values=[d.values[0],d.values[0]])),this.range=a("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(d.range==="min"||d.range==="max"?" ui-slider-range-"+d.range:"")));for(var i=e.length;i<g;i+=1)h.push(f);this.handles=e.add(a(h.join("")).appendTo(b.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(a){a.preventDefault()}).hover(function(){d.disabled||a(this).addClass("ui-state-hover")},function(){a(this).removeClass("ui-state-hover")}).focus(function(){d.disabled?a(this).blur():(a(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),a(this).addClass("ui-state-focus"))}).blur(function(){a(this).removeClass("ui-state-focus")}),this.handles.each(function(b){a(this).data("index.ui-slider-handle",b)}),this.handles.keydown(function(d){var e=!0,f=a(this).data("index.ui-slider-handle"),g,h,i,j;if(!b.options.disabled){switch(d.keyCode){case a.ui.keyCode.HOME:case a.ui.keyCode.END:case a.ui.keyCode.PAGE_UP:case a.ui.keyCode.PAGE_DOWN:case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:e=!1;if(!b._keySliding){b._keySliding=!0,a(this).addClass("ui-state-active"),g=b._start(d,f);if(g===!1)return}}j=b.options.step,b.options.values&&b.options.values.length?h=i=b.values(f):h=i=b.value();switch(d.keyCode){case a.ui.keyCode.HOME:i=b._valueMin();break;case a.ui.keyCode.END:i=b._valueMax();break;case a.ui.keyCode.PAGE_UP:i=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.PAGE_DOWN:i=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/c);break;case a.ui.keyCode.UP:case a.ui.keyCode.RIGHT:if(h===b._valueMax())return;i=b._trimAlignValue(h+j);break;case a.ui.keyCode.DOWN:case a.ui.keyCode.LEFT:if(h===b._valueMin())return;i=b._trimAlignValue(h-j)}b._slide(d,f,i);return e}}).keyup(function(c){var d=a(this).data("index.ui-slider-handle");b._keySliding&&(b._keySliding=!1,b._stop(c,d),b._change(c,d),a(this).removeClass("ui-state-active"))}),this._refreshValue(),this._animateOff=!1},destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"),this._mouseDestroy();return this},_mouseCapture:function(b){var c=this.options,d,e,f,g,h,i,j,k,l;if(c.disabled)return!1;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),d={x:b.pageX,y:b.pageY},e=this._normValueFromMouse(d),f=this._valueMax()-this._valueMin()+1,h=this,this.handles.each(function(b){var c=Math.abs(e-h.values(b));f>c&&(f=c,g=a(this),i=b)}),c.range===!0&&this.values(1)===c.min&&(i+=1,g=a(this.handles[i])),j=this._start(b,i);if(j===!1)return!1;this._mouseSliding=!0,h._handleIndex=i,g.addClass("ui-state-active").focus(),k=g.offset(),l=!a(b.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:b.pageX-k.left-g.width()/2,top:b.pageY-k.top-g.height()/2-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(b,i,e),this._animateOff=!0;return!0},_mouseStart:function(a){return!0},_mouseDrag:function(a){var b={x:a.pageX,y:a.pageY},c=this._normValueFromMouse(b);this._slide(a,this._handleIndex,c);return!1},_mouseStop:function(a){this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(a,this._handleIndex),this._change(a,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1;return!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b,c,d,e,f;this.orientation==="horizontal"?(b=this.elementSize.width,c=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(b=this.elementSize.height,c=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),d=c/b,d>1&&(d=1),d<0&&(d=0),this.orientation==="vertical"&&(d=1-d),e=this._valueMax()-this._valueMin(),f=this._valueMin()+d*e;return this._trimAlignValue(f)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values());return this._trigger("start",a,c)},_slide:function(a,b,c){var d,e,f;this.options.values&&this.options.values.length?(d=this.values(b?0:1),this.options.values.length===2&&this.options.range===!0&&(b===0&&c>d||b===1&&c<d)&&(c=d),c!==this.values(b)&&(e=this.values(),e[b]=c,f=this._trigger("slide",a,{handle:this.handles[b],value:c,values:e}),d=this.values(b?0:1),f!==!1&&this.values(b,c,!0))):c!==this.value()&&(f=this._trigger("slide",a,{handle:this.handles[b],value:c}),f!==!1&&this.value(c))},_stop:function(a,b){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("stop",a,c)},_change:function(a,b){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[b],value:this.value()};this.options.values&&this.options.values.length&&(c.value=this.values(b),c.values=this.values()),this._trigger("change",a,c)}},value:function(a){if(arguments.length)this.options.value=this._trimAlignValue(a),this._refreshValue(),this._change(null,0);else return this._value()},values:function(b,c){var d,e,f;if(arguments.length>1)this.options.values[b]=this._trimAlignValue(c),this._refreshValue(),this._change(null,b);else{if(!arguments.length)return this._values();if(!a.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(b):this.value();d=this.options.values,e=arguments[0];for(f=0;f<d.length;f+=1)d[f]=this._trimAlignValue(e[f]),this._change(null,f);this._refreshValue()}},_setOption:function(b,c){var d,e=0;a.isArray(this.options.values)&&(e=this.options.values.length),a.Widget.prototype._setOption.apply(this,arguments);switch(b){case"disabled":c?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.propAttr("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.propAttr("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(d=0;d<e;d+=1)this._change(null,d);this._animateOff=!1}},_value:function(){var a=this.options.value;a=this._trimAlignValue(a);return a},_values:function(a){var b,c,d;if(arguments.length){b=this.options.values[a],b=this._trimAlignValue(b);return b}c=this.options.values.slice();for(d=0;d<c.length;d+=1)c[d]=this._trimAlignValue(c[d]);return c},_trimAlignValue:function(a){if(a<=this._valueMin())return this._valueMin();if(a>=this._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=(a-this._valueMin())%b,d=a-c;Math.abs(c)*2>=b&&(d+=c>0?b:-b);return parseFloat(d.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var b=this.options.range,c=this.options,d=this,e=this._animateOff?!1:c.animate,f,g={},h,i,j,k;this.options.values&&this.options.values.length?this.handles.each(function(b,i){f=(d.values(b)-d._valueMin())/(d._valueMax()-d._valueMin())*100,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",a(this).stop(1,1)[e?"animate":"css"](g,c.animate),d.options.range===!0&&(d.orientation==="horizontal"?(b===0&&d.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({width:f-h+"%"},{queue:!1,duration:c.animate})):(b===0&&d.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},c.animate),b===1&&d.range[e?"animate":"css"]({height:f-h+"%"},{queue:!1,duration:c.animate}))),h=f}):(i=this.value(),j=this._valueMin(),k=this._valueMax(),f=k!==j?(i-j)/(k-j)*100:0,g[d.orientation==="horizontal"?"left":"bottom"]=f+"%",this.handle.stop(1,1)[e?"animate":"css"](g,c.animate),b==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"},c.animate),b==="max"&&this.orientation==="horizontal"&&this.range[e?"animate":"css"]({width:100-f+"%"},{queue:!1,duration:c.animate}),b==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},c.animate),b==="max"&&this.orientation==="vertical"&&this.range[e?"animate":"css"]({height:100-f+"%"},{queue:!1,duration:c.animate}))}}),a.extend(a.ui.slider,{version:"1.8.17"})})(jQuery);
        • jquery-ui-1.8.custom.min.js
          /*!
           * jQuery UI 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI
           *//*
           * jQuery UI 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI
           */
          jQuery.ui||(function(a){a.ui={version:"1.8",plugin:{add:function(c,d,f){var e=a.ui[c].prototype;for(var b in f){e.plugins[b]=e.plugins[b]||[];e.plugins[b].push([d,f[b]])}},call:function(b,d,c){var f=b.plugins[d];if(!f||!b.element[0].parentNode){return}for(var e=0;e<f.length;e++){if(b.options[f[e][0]]){f[e][1].apply(b.element,c)}}}},contains:function(d,c){return document.compareDocumentPosition?d.compareDocumentPosition(c)&16:d!==c&&d.contains(c)},hasScroll:function(e,c){if(a(e).css("overflow")=="hidden"){return false}var b=(c&&c=="left")?"scrollLeft":"scrollTop",d=false;if(e[b]>0){return true}e[b]=1;d=(e[b]>0);e[b]=0;return d},isOverAxis:function(c,b,d){return(c>b)&&(c<(b+d))},isOver:function(g,c,f,e,b,d){return a.ui.isOverAxis(g,f,b)&&a.ui.isOverAxis(c,e,d)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};a.fn.extend({_focus:a.fn.focus,focus:function(b,c){return typeof b==="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus();(c&&c.call(d))},b)}):this._focus.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var b;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){b=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{b=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!b.length?a(document):b},zIndex:function(e){if(e!==undefined){return this.css("zIndex",e)}if(this.length){var c=a(this[0]),b,d;while(c.length&&c[0]!==document){b=c.css("position");if(b=="absolute"||b=="relative"||b=="fixed"){d=parseInt(c.css("zIndex"));if(!isNaN(d)&&d!=0){return d}}c=c.parent()}}return 0}});a.extend(a.expr[":"],{data:function(d,c,b){return !!a.data(d,b[3])},focusable:function(c){var d=c.nodeName.toLowerCase(),b=a.attr(c,"tabindex");return(/input|select|textarea|button|object/.test(d)?!c.disabled:"a"==d||"area"==d?c.href||!isNaN(b):!isNaN(b))&&!a(c)["area"==d?"parents":"closest"](":hidden").length},tabbable:function(c){var b=a.attr(c,"tabindex");return(isNaN(b)||b>=0)&&a(c).is(":focusable")}})})(jQuery);;/*!
           * jQuery UI Widget 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI/Widget
           *//*
           * jQuery UI Widget 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI/Widget
           */
          (function(b){var a=b.fn.remove;b.fn.remove=function(c,d){return this.each(function(){if(!d){if(!c||b.filter(c,[this]).length){b("*",this).add(this).each(function(){b(this).triggerHandler("remove")})}}return a.call(b(this),c,d)})};b.widget=function(d,f,c){var e=d.split(".")[0],h;d=d.split(".")[1];h=e+"-"+d;if(!c){c=f;f=b.Widget}b.expr[":"][h]=function(i){return !!b.data(i,d)};b[e]=b[e]||{};b[e][d]=function(i,j){if(arguments.length){this._createWidget(i,j)}};var g=new f();g.options=b.extend({},g.options);b[e][d].prototype=b.extend(true,g,{namespace:e,widgetName:d,widgetEventPrefix:b[e][d].prototype.widgetEventPrefix||d,widgetBaseClass:h},c);b.widget.bridge(d,b[e][d])};b.widget.bridge=function(d,c){b.fn[d]=function(g){var e=typeof g==="string",f=Array.prototype.slice.call(arguments,1),h=this;g=!e&&f.length?b.extend.apply(null,[true,g].concat(f)):g;if(e&&g.substring(0,1)==="_"){return h}if(e){this.each(function(){var i=b.data(this,d),j=i&&b.isFunction(i[g])?i[g].apply(i,f):i;if(j!==i&&j!==undefined){h=j;return false}})}else{this.each(function(){var i=b.data(this,d);if(i){if(g){i.option(g)}i._init()}else{b.data(this,d,new c(g,this))}})}return h}};b.Widget=function(c,d){if(arguments.length){this._createWidget(c,d)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(d,e){this.element=b(e).data(this.widgetName,this);this.options=b.extend(true,{},this.options,b.metadata&&b.metadata.get(e)[this.widgetName],d);var c=this;this.element.bind("remove."+this.widgetName,function(){c.destroy()});this._create();this._init()},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled")},widget:function(){return this.element},option:function(e,f){var d=e,c=this;if(arguments.length===0){return b.extend({},c.options)}if(typeof e==="string"){if(f===undefined){return this.options[e]}d={};d[e]=f}b.each(d,function(g,h){c._setOption(g,h)});return c},_setOption:function(c,d){this.options[c]=d;if(c==="disabled"){this.widget()[d?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",d)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(d,e,f){var h=this.options[d];e=b.Event(e);e.type=(d===this.widgetEventPrefix?d:this.widgetEventPrefix+d).toLowerCase();f=f||{};if(e.originalEvent){for(var c=b.event.props.length,g;c;){g=b.event.props[--c];e[g]=e.originalEvent[g]}}this.element.trigger(e,f);return !(b.isFunction(h)&&h.call(this.element[0],e,f)===false||e.isDefaultPrevented())}}})(jQuery);;/*!
           * jQuery UI Mouse 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI/Mouse
           *
           * Depends:
           *	jquery.ui.widget.js
           *//*
           * jQuery UI Mouse 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI/Mouse
           *
           * Depends:
           *	jquery.ui.widget.js
           */
          (function(a){a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(c){return b._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(b._preventClickEvent){b._preventClickEvent=false;c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(d){d.originalEvent=d.originalEvent||{};if(d.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(d));this._mouseDownEvent=d;var c=this,e=(d.which==1),b=(typeof this.options.cancel=="string"?a(d.target).parents().add(d.target).filter(this.options.cancel).length:false);if(!e||b||!this._mouseCapture(d)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(d)!==false);if(!this._mouseStarted){d.preventDefault();return true}}this._mouseMoveDelegate=function(f){return c._mouseMove(f)};this._mouseUpDelegate=function(f){return c._mouseUp(f)};a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(a.browser.safari||d.preventDefault());d.originalEvent.mouseHandled=true;return true},_mouseMove:function(b){if(a.browser.msie&&!b.button){return this._mouseUp(b)}if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,b)!==false);(this._mouseStarted?this._mouseDrag(b):this._mouseUp(b))}return !this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(b.target==this._mouseDownEvent.target);this._mouseStop(b)}return false},_mouseDistanceMet:function(b){return(Math.max(Math.abs(this._mouseDownEvent.pageX-b.pageX),Math.abs(this._mouseDownEvent.pageY-b.pageY))>=this.options.distance)},_mouseDelayMet:function(b){return this.mouseDelayMet},_mouseStart:function(b){},_mouseDrag:function(b){},_mouseStop:function(b){},_mouseCapture:function(b){return true}})})(jQuery);;/*
           * jQuery UI Draggable 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI/Draggables
           *
           * Depends:
           *	jquery.ui.core.js
           *	jquery.ui.mouse.js
           *	jquery.ui.widget.js
           */(function(a){a.widget("ui.draggable",a.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;(c.cursorAt&&this._adjustOffsetFromHelper(c.cursorAt));if(c.containment){this._setContainment()}if(this._trigger("start",b)===false){this._clear();return false}this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();if(this._trigger("drag",b,c)===false){this._mouseUp({});return false}this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode){return false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){if(b._trigger("stop",c)!==false){b._clear()}})}else{if(this._trigger("stop",c)!==false){this._clear()}}return false},cancel:function(){if(this.helper.is(".ui-draggable-dragging")){this._mouseUp({})}else{this._clear()}return this},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(typeof b=="string"){b=b.split(" ")}if(a.isArray(b)){b={left:+b[0],top:+b[1]||0}}if("left" in b){this.offset.click.left=b.left+this.margins.left}if("right" in b){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if("top" in b){this.offset.click.top=b.top+this.margins.top}if("bottom" in b){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&a.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.Widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}});a.extend(a.ui.draggable,{version:"1.8"});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(c,d){var f=a(this).data("draggable").options;var e=a.makeArray(a(f.stack)).sort(function(h,g){return(parseInt(a(h).css("zIndex"),10)||0)-(parseInt(a(g).css("zIndex"),10)||0)});if(!e.length){return}var b=parseInt(e[0].style.zIndex)||0;a(e).each(function(g){this.style.zIndex=b+g});this[0].style.zIndex=b+e.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;/*
           * jQuery UI Slider 1.8
           *
           * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
           * Dual licensed under the MIT (MIT-LICENSE.txt)
           * and GPL (GPL-LICENSE.txt) licenses.
           *
           * http://docs.jquery.com/UI/Slider
           *
           * Depends:
           *	jquery.ui.core.js
           *	jquery.ui.mouse.js
           *	jquery.ui.widget.js
           */(function(b){var a=5;b.widget("ui.slider",b.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var c=this,d=this.options;this._keySliding=false;this._mouseSliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");if(d.disabled){this.element.addClass("ui-slider-disabled ui-disabled")}this.range=b([]);if(d.range){if(d.range===true){this.range=b("<div></div>");if(!d.values){d.values=[this._valueMin(),this._valueMin()]}if(d.values.length&&d.values.length!=2){d.values=[d.values[0],d.values[0]]}}else{this.range=b("<div></div>")}this.range.appendTo(this.element).addClass("ui-slider-range");if(d.range=="min"||d.range=="max"){this.range.addClass("ui-slider-range-"+d.range)}this.range.addClass("ui-widget-header")}if(b(".ui-slider-handle",this.element).length==0){b('<a href="#"></a>').appendTo(this.element).addClass("ui-slider-handle")}if(d.values&&d.values.length){while(b(".ui-slider-handle",this.element).length<d.values.length){b('<a href="#"></a>').appendTo(this.element).addClass("ui-slider-handle")}}this.handles=b(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(e){e.preventDefault()}).hover(function(){if(!d.disabled){b(this).addClass("ui-state-hover")}},function(){b(this).removeClass("ui-state-hover")}).focus(function(){if(!d.disabled){b(".ui-slider .ui-state-focus").removeClass("ui-state-focus");b(this).addClass("ui-state-focus")}else{b(this).blur()}}).blur(function(){b(this).removeClass("ui-state-focus")});this.handles.each(function(e){b(this).data("index.ui-slider-handle",e)});this.handles.keydown(function(j){var g=true;var f=b(this).data("index.ui-slider-handle");if(c.options.disabled){return}switch(j.keyCode){case b.ui.keyCode.HOME:case b.ui.keyCode.END:case b.ui.keyCode.PAGE_UP:case b.ui.keyCode.PAGE_DOWN:case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:g=false;if(!c._keySliding){c._keySliding=true;b(this).addClass("ui-state-active");c._start(j,f)}break}var h,e,i=c._step();if(c.options.values&&c.options.values.length){h=e=c.values(f)}else{h=e=c.value()}switch(j.keyCode){case b.ui.keyCode.HOME:e=c._valueMin();break;case b.ui.keyCode.END:e=c._valueMax();break;case b.ui.keyCode.PAGE_UP:e=h+((c._valueMax()-c._valueMin())/a);break;case b.ui.keyCode.PAGE_DOWN:e=h-((c._valueMax()-c._valueMin())/a);break;case b.ui.keyCode.UP:case b.ui.keyCode.RIGHT:if(h==c._valueMax()){return}e=h+i;break;case b.ui.keyCode.DOWN:case b.ui.keyCode.LEFT:if(h==c._valueMin()){return}e=h-i;break}c._slide(j,f,e);return g}).keyup(function(f){var e=b(this).data("index.ui-slider-handle");if(c._keySliding){c._keySliding=false;c._stop(f,e);c._change(f,e);b(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");this._mouseDestroy();return this},_mouseCapture:function(e){var f=this.options;if(f.disabled){return false}this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();var i={x:e.pageX,y:e.pageY};var k=this._normValueFromMouse(i);var d=this._valueMax()-this._valueMin()+1,g;var l=this,j;this.handles.each(function(m){var n=Math.abs(k-l.values(m));if(d>n){d=n;g=b(this);j=m}});if(f.range==true&&this.values(1)==f.min){g=b(this.handles[++j])}this._start(e,j);this._mouseSliding=true;l._handleIndex=j;g.addClass("ui-state-active").focus();var h=g.offset();var c=!b(e.target).parents().andSelf().is(".ui-slider-handle");this._clickOffset=c?{left:0,top:0}:{left:e.pageX-h.left-(g.width()/2),top:e.pageY-h.top-(g.height()/2)-(parseInt(g.css("borderTopWidth"),10)||0)-(parseInt(g.css("borderBottomWidth"),10)||0)+(parseInt(g.css("marginTop"),10)||0)};k=this._normValueFromMouse(i);this._slide(e,j,k);this._animateOff=true;return true},_mouseStart:function(c){return true},_mouseDrag:function(e){var c={x:e.pageX,y:e.pageY};var d=this._normValueFromMouse(c);this._slide(e,this._handleIndex,d);return false},_mouseStop:function(c){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(c,this._handleIndex);this._change(c,this._handleIndex);this._handleIndex=null;this._clickOffset=null;this._animateOff=false;return false},_detectOrientation:function(){this.orientation=this.options.orientation=="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(e){var d,i;if("horizontal"==this.orientation){d=this.elementSize.width;i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{d=this.elementSize.height;i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}var g=(i/d);if(g>1){g=1}if(g<0){g=0}if("vertical"==this.orientation){g=1-g}var f=this._valueMax()-this._valueMin(),j=g*f,c=j%this.options.step,h=this._valueMin()+j-c;if(c>(this.options.step/2)){h+=this.options.step}return parseFloat(h.toFixed(5))},_start:function(e,d){var c={handle:this.handles[d],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(d);c.values=this.values()}this._trigger("start",e,c)},_slide:function(g,f,e){var h=this.handles[f];if(this.options.values&&this.options.values.length){var c=this.values(f?0:1);if((this.options.values.length==2&&this.options.range===true)&&((f==0&&e>c)||(f==1&&e<c))){e=c}if(e!=this.values(f)){var d=this.values();d[f]=e;var i=this._trigger("slide",g,{handle:this.handles[f],value:e,values:d});var c=this.values(f?0:1);if(i!==false){this.values(f,e,true)}}}else{if(e!=this.value()){var i=this._trigger("slide",g,{handle:this.handles[f],value:e});if(i!==false){this.value(e)}}}},_stop:function(e,d){var c={handle:this.handles[d],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(d);c.values=this.values()}this._trigger("stop",e,c)},_change:function(e,d){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[d],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(d);c.values=this.values()}this._trigger("change",e,c)}},value:function(c){if(arguments.length){this.options.value=this._trimValue(c);this._refreshValue();this._change(null,0)}return this._value()},values:function(e,h){if(arguments.length>1){this.options.values[e]=this._trimValue(h);this._refreshValue();this._change(null,e)}if(arguments.length){if(b.isArray(arguments[0])){var g=this.options.values,d=arguments[0];for(var f=0,c=g.length;f<c;f++){g[f]=this._trimValue(d[f]);this._change(null,f)}this._refreshValue()}else{if(this.options.values&&this.options.values.length){return this._values(e)}else{return this.value()}}}else{return this._values()}},_setOption:function(d,e){var c,f=0;if(jQuery.isArray(this.options.values)){f=this.options.values.length}b.Widget.prototype._setOption.apply(this,arguments);switch(d){case"disabled":if(e){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}case"orientation":this._detectOrientation();this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case"value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case"values":this._animateOff=true;this._refreshValue();for(c=0;c<f;c++){this._change(null,c)}this._animateOff=false;break}},_step:function(){var c=this.options.step;return c},_value:function(){var c=this.options.value;c=this._trimValue(c);return c},_values:function(d){if(arguments.length){var g=this.options.values[d];g=this._trimValue(g);return g}else{var f=this.options.values.slice();for(var e=0,c=f.length;e<c;e++){f[e]=this._trimValue(f[e])}return f}},_trimValue:function(c){if(c<this._valueMin()){c=this._valueMin()}if(c>this._valueMax()){c=this._valueMax()}return c},_valueMin:function(){var c=this.options.min;return c},_valueMax:function(){var c=this.options.max;return c},_refreshValue:function(){var g=this.options.range,e=this.options,m=this;var d=(!this._animateOff)?e.animate:false;if(this.options.values&&this.options.values.length){var j,i;this.handles.each(function(q,o){var p=(m.values(q)-m._valueMin())/(m._valueMax()-m._valueMin())*100;var n={};n[m.orientation=="horizontal"?"left":"bottom"]=p+"%";b(this).stop(1,1)[d?"animate":"css"](n,e.animate);if(m.options.range===true){if(m.orientation=="horizontal"){(q==0)&&m.range.stop(1,1)[d?"animate":"css"]({left:p+"%"},e.animate);(q==1)&&m.range[d?"animate":"css"]({width:(p-lastValPercent)+"%"},{queue:false,duration:e.animate})}else{(q==0)&&m.range.stop(1,1)[d?"animate":"css"]({bottom:(p)+"%"},e.animate);(q==1)&&m.range[d?"animate":"css"]({height:(p-lastValPercent)+"%"},{queue:false,duration:e.animate})}}lastValPercent=p})}else{var k=this.value(),h=this._valueMin(),l=this._valueMax(),f=l!=h?(k-h)/(l-h)*100:0;var c={};c[m.orientation=="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[d?"animate":"css"](c,e.animate);(g=="min")&&(this.orientation=="horizontal")&&this.range.stop(1,1)[d?"animate":"css"]({width:f+"%"},e.animate);(g=="max")&&(this.orientation=="horizontal")&&this.range[d?"animate":"css"]({width:(100-f)+"%"},{queue:false,duration:e.animate});(g=="min")&&(this.orientation=="vertical")&&this.range.stop(1,1)[d?"animate":"css"]({height:f+"%"},e.animate);(g=="max")&&(this.orientation=="vertical")&&this.range[d?"animate":"css"]({height:(100-f)+"%"},{queue:false,duration:e.animate})}}});b.extend(b.ui.slider,{version:"1.8"})})(jQuery);;
      • jquerybbq
        • jquery.bbq.min.js
          /*
           * jQuery BBQ: Back Button & Query Library - v1.2.1 - 2/17/2010
           * http://benalman.com/projects/jquery-bbq-plugin/
           * 
           * Copyright (c) 2010 "Cowboy" Ben Alman
           * Dual licensed under the MIT and GPL licenses.
           * http://benalman.com/about/license/
           */
          (function($,p){var i,m=Array.prototype.slice,r=decodeURIComponent,a=$.param,c,l,v,b=$.bbq=$.bbq||{},q,u,j,e=$.event.special,d="hashchange",A="querystring",D="fragment",y="elemUrlAttr",g="location",k="href",t="src",x=/^.*\?|#.*$/g,w=/^.*\#/,h,C={};function E(F){return typeof F==="string"}function B(G){var F=m.call(arguments,1);return function(){return G.apply(this,F.concat(m.call(arguments)))}}function n(F){return F.replace(/^[^#]*#?(.*)$/,"$1")}function o(F){return F.replace(/(?:^[^?#]*\?([^#]*).*$)?.*/,"$1")}function f(H,M,F,I,G){var O,L,K,N,J;if(I!==i){K=F.match(H?/^([^#]*)\#?(.*)$/:/^([^#?]*)\??([^#]*)(#?.*)/);J=K[3]||"";if(G===2&&E(I)){L=I.replace(H?w:x,"")}else{N=l(K[2]);I=E(I)?l[H?D:A](I):I;L=G===2?I:G===1?$.extend({},I,N):$.extend({},N,I);L=a(L);if(H){L=L.replace(h,r)}}O=K[1]+(H?"#":L||!K[1]?"?":"")+L+J}else{O=M(F!==i?F:p[g][k])}return O}a[A]=B(f,0,o);a[D]=c=B(f,1,n);c.noEscape=function(G){G=G||"";var F=$.map(G.split(""),encodeURIComponent);h=new RegExp(F.join("|"),"g")};c.noEscape(",/");$.deparam=l=function(I,F){var H={},G={"true":!0,"false":!1,"null":null};$.each(I.replace(/\+/g," ").split("&"),function(L,Q){var K=Q.split("="),P=r(K[0]),J,O=H,M=0,R=P.split("]["),N=R.length-1;if(/\[/.test(R[0])&&/\]$/.test(R[N])){R[N]=R[N].replace(/\]$/,"");R=R.shift().split("[").concat(R);N=R.length-1}else{N=0}if(K.length===2){J=r(K[1]);if(F){J=J&&!isNaN(J)?+J:J==="undefined"?i:G[J]!==i?G[J]:J}if(N){for(;M<=N;M++){P=R[M]===""?O.length:R[M];O=O[P]=M<N?O[P]||(R[M+1]&&isNaN(R[M+1])?{}:[]):J}}else{if($.isArray(H[P])){H[P].push(J)}else{if(H[P]!==i){H[P]=[H[P],J]}else{H[P]=J}}}}else{if(P){H[P]=F?i:""}}});return H};function z(H,F,G){if(F===i||typeof F==="boolean"){G=F;F=a[H?D:A]()}else{F=E(F)?F.replace(H?w:x,""):F}return l(F,G)}l[A]=B(z,0);l[D]=v=B(z,1);$[y]||($[y]=function(F){return $.extend(C,F)})({a:k,base:k,iframe:t,img:t,input:t,form:"action",link:k,script:t});j=$[y];function s(I,G,H,F){if(!E(H)&&typeof H!=="object"){F=H;H=G;G=i}return this.each(function(){var L=$(this),J=G||j()[(this.nodeName||"").toLowerCase()]||"",K=J&&L.attr(J)||"";L.attr(J,a[I](K,H,F))})}$.fn[A]=B(s,A);$.fn[D]=B(s,D);b.pushState=q=function(I,F){if(E(I)&&/^#/.test(I)&&F===i){F=2}var H=I!==i,G=c(p[g][k],H?I:{},H?F:2);p[g][k]=G+(/#/.test(G)?"":"#")};b.getState=u=function(F,G){return F===i||typeof F==="boolean"?v(F):v(G)[F]};b.removeState=function(F){var G={};if(F!==i){G=u();$.each($.isArray(F)?F:arguments,function(I,H){delete G[H]})}q(G,2)};e[d]=$.extend(e[d],{add:function(F){var H;function G(J){var I=J[D]=c();J.getState=function(K,L){return K===i||typeof K==="boolean"?l(I,K):l(I,L)[K]};H.apply(this,arguments)}if($.isFunction(F)){H=F;return G}else{H=F.handler;F.handler=G}}})})(jQuery,this);
          /*
           * jQuery hashchange event - v1.2 - 2/11/2010
           * http://benalman.com/projects/jquery-hashchange-plugin/
           * 
           * Copyright (c) 2010 "Cowboy" Ben Alman
           * Dual licensed under the MIT and GPL licenses.
           * http://benalman.com/about/license/
           */
          (function($,i,b){var j,k=$.event.special,c="location",d="hashchange",l="href",f=$.browser,g=document.documentMode,h=f.msie&&(g===b||g<8),e="on"+d in i&&!h;function a(m){m=m||i[c][l];return m.replace(/^[^#]*#?(.*)$/,"$1")}$[d+"Delay"]=100;k[d]=$.extend(k[d],{setup:function(){if(e){return false}$(j.start)},teardown:function(){if(e){return false}$(j.stop)}});j=(function(){var m={},r,n,o,q;function p(){o=q=function(s){return s};if(h){n=$('<iframe src="javascript:0"/>').hide().insertAfter("body")[0].contentWindow;q=function(){return a(n.document[c][l])};o=function(u,s){if(u!==s){var t=n.document;t.open().close();t[c].hash="#"+u}};o(a())}}m.start=function(){if(r){return}var t=a();o||p();(function s(){var v=a(),u=q(t);if(v!==t){o(t=v,u);$(i).trigger(d)}else{if(u!==t){i[c][l]=i[c][l].replace(/#.*/,"")+"#"+u}}r=setTimeout(s,$[d+"Delay"])})()};m.stop=function(){if(!n){r&&clearTimeout(r);r=0}};return m})()})(jQuery,this);
      • js-hotkeys
        • jquery.hotkeys.min.js
          /*
           * jQuery Hotkeys Plugin
           * Copyright 2010, John Resig
           * Dual licensed under the MIT or GPL Version 2 licenses.
           *
           * http://github.com/jeresig/jquery.hotkeys
           *
           * Based upon the plugin by Tzury Bar Yochay:
           * http://github.com/tzuryby/hotkeys
           *
           * Original idea by:
           * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
          */
          
          (function(b){b.hotkeys={version:"0.8",specialKeys:{8:"backspace",9:"tab",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",191:"/",224:"meta",219:"[",221:"]"},shiftNums:{"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"}};function a(d){if(typeof d.data!=="string"){return}var c=d.handler,e=d.data.toLowerCase().split(" ");d.handler=function(n){if(this!==n.target&&(/textarea|select/i.test(n.target.nodeName)||n.target.type==="text")){return}var h=n.type!=="keypress"&&b.hotkeys.specialKeys[n.which],o=String.fromCharCode(n.which).toLowerCase(),k,m="",g={};if(n.altKey&&h!=="alt"){m+="alt+"}if(n.ctrlKey&&h!=="ctrl"){m+="ctrl+"}if(n.metaKey&&!n.ctrlKey&&h!=="meta"){m+="meta+"}if(n.shiftKey&&h!=="shift"){m+="shift+"}if(h){g[m+h]=true}else{g[m+o]=true;g[m+b.hotkeys.shiftNums[o]]=true;if(m==="shift+"){g[b.hotkeys.shiftNums[o]]=true}}for(var j=0,f=e.length;j<f;j++){if(g[e[j]]){return c.apply(this,arguments)}}}}b.each(["keydown","keyup","keypress"],function(){b.event.special[this]={add:a}})})(jQuery);
      • jspdf
        • jspdf.min.js
          /** 
           * jsPDF - PDF Document creation from JavaScript
           * Version 1.0.150-git Built on 2014-05-30T00:40
           *                           CommitID dcbc9fcb9b
           *
           * Copyright (c) 2010-2014 James Hall, https://github.com/MrRio/jsPDF
           *               2010 Aaron Spike, https://github.com/acspike
           *               2012 Willow Systems Corporation, willow-systems.com
           *               2012 Pablo Hess, https://github.com/pablohess
           *               2012 Florian Jenett, https://github.com/fjenett
           *               2013 Warren Weckesser, https://github.com/warrenweckesser
           *               2013 Youssef Beddad, https://github.com/lifof
           *               2013 Lee Driscoll, https://github.com/lsdriscoll
           *               2013 Stefan Slonevskiy, https://github.com/stefslon
           *               2013 Jeremy Morel, https://github.com/jmorel
           *               2013 Christoph Hartmann, https://github.com/chris-rock
           *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
           *               2014 James Makes, https://github.com/dollaruw
           *               2014 Diego Casorran, https://github.com/diegocr
           *
           * Permission is hereby granted, free of charge, to any person obtaining
           * a copy of this software and associated documentation files (the
           * "Software"), to deal in the Software without restriction, including
           * without limitation the rights to use, copy, modify, merge, publish,
           * distribute, sublicense, and/or sell copies of the Software, and to
           * permit persons to whom the Software is furnished to do so, subject to
           * the following conditions:
           *
           * The above copyright notice and this permission notice shall be
           * included in all copies or substantial portions of the Software.
           *
           * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
           * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
           * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
           * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
           * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
           * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
           * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
           *
           * Contributor(s):
           *    siefkenj, ahwolf, rickygu, Midnith, saintclair, eaparango,
           *    kim3er, mfo, alnorth,
           */
          /**
           * jsPDF addHTML PlugIn
           * Copyright (c) 2014 Diego Casorran
           * Licensed under the MIT License.
           * http://opensource.org/licenses/mit-license
           */
          /** 
           * jsPDF addImage plugin
           * Copyright (c) 2012 Jason Siefken, https://github.com/siefkenj/
           *               2013 Chris Dowling, https://github.com/gingerchris
           *               2013 Trinh Ho, https://github.com/ineedfat
           *               2013 Edwin Alejandro Perez, https://github.com/eaparango
           *               2013 Norah Smith, https://github.com/burnburnrocket
           *               2014 Diego Casorran, https://github.com/diegocr
           *               2014 James Robb, https://github.com/jamesbrobb
           */
          /**
           * jsPDF Cell plugin
           * Copyright (c) 2013 Youssef Beddad, youssef.beddad@gmail.com
           *               2013 Eduardo Menezes de Morais, eduardo.morais@usp.br
           *               2013 Lee Driscoll, https://github.com/lsdriscoll
           *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
           *               2014 James Hall, james@parall.ax
           *               2014 Diego Casorran, https://github.com/diegocr
           */
          /** 
           * jsPDF fromHTML plugin. BETA stage. API subject to change. Needs browser
           * Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
           *               2014 Juan Pablo Gaviria, https://github.com/juanpgaviria
           *               2014 Diego Casorran, https://github.com/diegocr
           *               2014 Daniel Husar, https://github.com/danielhusar
           *               2014 Wolfgang Gassler, https://github.com/woolfg
           */
          /** 
           * jsPDF JavaScript plugin
           * Copyright (c) 2013 Youssef Beddad, youssef.beddad@gmail.com
           */
          /** 
           * jsPDF PNG PlugIn
           * Copyright (c) 2014 James Robb, https://github.com/jamesbrobb
           */
          /** 
          jsPDF Silly SVG plugin
          Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
          */
          /** 
           * jsPDF split_text_to_size plugin - MIT license.
           * Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
           *               2014 Diego Casorran, https://github.com/diegocr
           */
          /**  
          jsPDF standard_fonts_metrics plugin
          Copyright (c) 2012 Willow Systems Corporation, willow-systems.com
          MIT license.
          */
          /** 
           * jsPDF total_pages plugin
           * Copyright (c) 2013 Eduardo Menezes de Morais, eduardo.morais@usp.br
           */
          /* Blob.js
           * A Blob implementation.
           * 2014-05-27
           * By Eli Grey, http://eligrey.com
           * By Devin Samarin, https://github.com/eboyjr
           * License: X11/MIT
           *   See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
           */
          /* FileSaver.js
           *  A saveAs() FileSaver implementation.
           *  2014-05-27
           *  By Eli Grey, http://eligrey.com
           *  License: X11/MIT
           *    See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
           */
          /*
           * Copyright (c) 2012 chick307 <chick307@gmail.com>
           * Licensed under the MIT License.
           * http://opensource.org/licenses/mit-license
           */
          /*
           Deflate.js - https://github.com/gildas-lormeau/zip.js
           Copyright (c) 2013 Gildas Lormeau. All rights reserved.
           Redistribution and use in source and binary forms, with or without
           modification, are permitted provided that the following conditions are met:
           1. Redistributions of source code must retain the above copyright notice,
           this list of conditions and the following disclaimer.
           2. Redistributions in binary form must reproduce the above copyright 
           notice, this list of conditions and the following disclaimer in 
           the documentation and/or other materials provided with the distribution.
           3. The names of the authors may not be used to endorse or promote products
           derived from this software without specific prior written permission.
           THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
           INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
           FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
           INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
           INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
           LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
           OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
           LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
           NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
           EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
           */
          /*
          # PNG.js
          # Copyright (c) 2011 Devon Govett
          # MIT LICENSE
          # 
          */
          /*
           * Extracted from pdf.js
           * https://github.com/andreasgal/pdf.js
           * Copyright (c) 2011 Mozilla Foundation
           * Contributors: Andreas Gal <gal@mozilla.com>
           *               Chris G Jones <cjones@mozilla.com>
           *               Shaon Barman <shaon.barman@gmail.com>
           *               Vivien Nicolas <21@vingtetun.org>
           *               Justin D'Arcangelo <justindarc@gmail.com>
           *               Yury Delendik
           */
          /**
           * JavaScript Polyfill functions for jsPDF
           * Collected from public resources by
           * https://github.com/diegocr
           */
          !function(t,e){e["true"]=t;var r=function(t){"use strict";function e(e){var r={};this.subscribe=function(t,e,n){if("function"!=typeof e)return!1;r.hasOwnProperty(t)||(r[t]={});var s=Math.random().toString(35);return r[t][s]=[e,!!n],s},this.unsubscribe=function(t){for(var e in r)if(r[e][t])return delete r[e][t],!0;return!1},this.publish=function(n){if(r.hasOwnProperty(n)){var s=Array.prototype.slice.call(arguments,1),o=[];for(var i in r[n]){var a=r[n][i];try{a[0].apply(e,s)}catch(u){t.console&&console.error("jsPDF PubSub Error",u.message,u)}a[1]&&o.push(i)}o.length&&o.forEach(this.unsubscribe)}}}function r(a,u,c,l){var f={};"object"==typeof a&&(f=a,a=f.orientation,u=f.unit||u,c=f.format||c,l=f.compress||f.compressPdf||l),u=u||"mm",c=c||"a4",a=(""+(a||"P")).toLowerCase();var d,h,p,m,w,y=(""+c).toLowerCase(),g=!!l&&"function"==typeof Uint8Array,v=f.textColor||"0 g",b=f.drawColor||"0 G",q=f.fontSize||16,x=f.lineHeight||1.15,k=f.lineWidth||.200025,_=2,A=!1,C=[],S={},E={},z=0,I=[],T=[],B=0,O=0,P=0,R={title:"",subject:"",author:"",keywords:"",creator:""},D={},U=new e(D),F=function(t){return t.toFixed(2)},L=function(t){return t.toFixed(3)},j=function(t){return("0"+parseInt(t)).slice(-2)},N=function(t){A?I[z].push(t):(P+=t.length+1,T.push(t))},M=function(){return _++,C[_]=P,N(_+" 0 obj"),_},H=function(t){N("stream"),N(t),N("endstream")},G=function(){var e,n,o,i,a,u,c,l=m*h,f=w*h;for(c=t.adler32cs||r.adler32cs,g&&"undefined"==typeof c&&(g=!1),e=1;z>=e;e++){if(M(),N("<</Type /Page"),N("/Parent 1 0 R"),N("/Resources 2 0 R"),N("/Contents "+(_+1)+" 0 R>>"),N("endobj"),n=I[e].join("\n"),M(),g){for(o=[],i=n.length;i--;)o[i]=n.charCodeAt(i);u=c.from(n),a=new s(6),a.append(new Uint8Array(o)),n=a.flush(),o=new Uint8Array(n.length+6),o.set(new Uint8Array([120,156])),o.set(n,2),o.set(new Uint8Array([255&u,u>>8&255,u>>16&255,u>>24&255]),n.length+2),n=String.fromCharCode.apply(null,o),N("<</Length "+n.length+" /Filter [/FlateDecode]>>")}else N("<</Length "+n.length+">>");H(n),N("endobj")}C[1]=P,N("1 0 obj"),N("<</Type /Pages");var d="/Kids [";for(i=0;z>i;i++)d+=3+2*i+" 0 R ";N(d+"]"),N("/Count "+z),N("/MediaBox [0 0 "+F(l)+" "+F(f)+"]"),N(">>"),N("endobj")},J=function(t){t.objectNumber=M(),N("<</BaseFont/"+t.PostScriptName+"/Type/Font"),"string"==typeof t.encoding&&N("/Encoding/"+t.encoding),N("/Subtype/Type1>>"),N("endobj")},V=function(){for(var t in S)S.hasOwnProperty(t)&&J(S[t])},W=function(){U.publish("putXobjectDict")},X=function(){N("/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]"),N("/Font <<");for(var t in S)S.hasOwnProperty(t)&&N("/"+t+" "+S[t].objectNumber+" 0 R");N(">>"),N("/XObject <<"),W(),N(">>")},Y=function(){V(),U.publish("putResources"),C[2]=P,N("2 0 obj"),N("<<"),X(),N(">>"),N("endobj"),U.publish("postPutResources")},K=function(t,e,r){E.hasOwnProperty(e)||(E[e]={}),E[e][r]=t},Q=function(t,e,r,n){var s="F"+(Object.keys(S).length+1).toString(10),o=S[s]={id:s,PostScriptName:t,fontName:e,fontStyle:r,encoding:n,metadata:{}};return K(s,e,r),U.publish("addFont",o),s},$=function(){for(var t="helvetica",e="times",r="courier",n="normal",s="bold",o="italic",i="bolditalic",a="StandardEncoding",u=[["Helvetica",t,n],["Helvetica-Bold",t,s],["Helvetica-Oblique",t,o],["Helvetica-BoldOblique",t,i],["Courier",r,n],["Courier-Bold",r,s],["Courier-Oblique",r,o],["Courier-BoldOblique",r,i],["Times-Roman",e,n],["Times-Bold",e,s],["Times-Italic",e,o],["Times-BoldItalic",e,i]],c=0,l=u.length;l>c;c++){var f=Q(u[c][0],u[c][1],u[c][2],a),d=u[c][0].split("-");K(f,d[0],d[1]||"")}U.publish("addFonts",{fonts:S,dictionary:E})},Z=function(e){return e.foo=function(){try{return e.apply(this,arguments)}catch(r){var n=r.stack||"";~n.indexOf(" at ")&&(n=n.split(" at ")[1]);var s="Error in function "+n.split("\n")[0].split("<")[0]+": "+r.message;if(!t.console)throw new Error(s);console.log(s,r),t.alert&&alert(s),console.trace()}},e.foo.bar=e,e.foo},te=function(t,e){var r,n,s,o,i,a,u,c,l;if(e=e||{},s=e.sourceEncoding||"Unicode",i=e.outputEncoding,(e.autoencode||i)&&S[d].metadata&&S[d].metadata[s]&&S[d].metadata[s].encoding&&(o=S[d].metadata[s].encoding,!i&&S[d].encoding&&(i=S[d].encoding),!i&&o.codePages&&(i=o.codePages[0]),"string"==typeof i&&(i=o[i]),i)){for(u=!1,a=[],r=0,n=t.length;n>r;r++)c=i[t.charCodeAt(r)],c?a.push(String.fromCharCode(c)):a.push(t[r]),a[r].charCodeAt(0)>>8&&(u=!0);t=a.join("")}for(r=t.length;void 0===u&&0!==r;)t.charCodeAt(r-1)>>8&&(u=!0),r--;if(!u)return t;for(a=e.noBOM?[]:[254,255],r=0,n=t.length;n>r;r++){if(c=t.charCodeAt(r),l=c>>8,l>>8)throw new Error("Character at position "+r+" of string '"+t+"' exceeds 16bits. Cannot be encoded into UCS-2 BE");a.push(l),a.push(c-(l<<8))}return String.fromCharCode.apply(void 0,a)},ee=function(t,e){return te(t,e).replace(/\\/g,"\\\\").replace(/\(/g,"\\(").replace(/\)/g,"\\)")},re=function(){N("/Producer (jsPDF "+r.version+")");for(var t in R)R.hasOwnProperty(t)&&R[t]&&N("/"+t.substr(0,1).toUpperCase()+t.substr(1)+" ("+ee(R[t])+")");var e=new Date;N(["/CreationDate (D:",e.getFullYear(),j(e.getMonth()+1),j(e.getDate()),j(e.getHours()),j(e.getMinutes()),j(e.getSeconds()),")"].join(""))},ne=function(){N("/Type /Catalog"),N("/Pages 1 0 R"),N("/OpenAction [3 0 R /FitH null]"),N("/PageLayout /OneColumn"),U.publish("putCatalog")},se=function(){N("/Size "+(_+1)),N("/Root "+_+" 0 R"),N("/Info "+(_-1)+" 0 R")},oe=function(){z++,A=!0,I[z]=[]},ie=function(){oe(),N(F(k*h)+" w"),N(b),0!==B&&N(B+" J"),0!==O&&N(O+" j"),U.publish("addPage",{pageNumber:z})},ae=function(t,e){var r;t=void 0!==t?t:S[d].fontName,e=void 0!==e?e:S[d].fontStyle;try{r=E[t][e]}catch(n){}if(!r)throw new Error("Unable to look up font label for font '"+t+"', '"+e+"'. Refer to getFontList() for available fonts.");return r},ue=function(){A=!1,_=2,T=[],C=[],N("%PDF-"+o),G(),Y(),M(),N("<<"),re(),N(">>"),N("endobj"),M(),N("<<"),ne(),N(">>"),N("endobj");var t,e=P,r="0000000000";for(N("xref"),N("0 "+(_+1)),N(r+" 65535 f "),t=1;_>=t;t++)N((r+C[t]).slice(-10)+" 00000 n ");return N("trailer"),N("<<"),se(),N(">>"),N("startxref"),N(e),N("%%EOF"),A=!0,T.join("\n")},ce=function(t){var e="S";return"F"===t?e="f":"FD"===t||"DF"===t?e="B":("f"===t||"f*"===t||"B"===t||"B*"===t)&&(e=t),e},le=function(){for(var t=ue(),e=t.length,r=new ArrayBuffer(e),n=new Uint8Array(r);e--;)n[e]=t.charCodeAt(e);return r},fe=function(){return new Blob([le()],{type:"application/pdf"})},de=Z(function(e,r){switch(e){case void 0:return ue();case"save":if(navigator.getUserMedia&&(void 0===t.URL||void 0===t.URL.createObjectURL))return D.output("dataurlnewwindow");n(fe(),r),"function"==typeof n.unload&&t.setTimeout&&setTimeout(n.unload,70);break;case"arraybuffer":return le();case"blob":return fe();case"datauristring":case"dataurlstring":return"data:application/pdf;base64,"+btoa(ue());case"datauri":case"dataurl":t.document.location.href="data:application/pdf;base64,"+btoa(ue());break;case"dataurlnewwindow":t.open("data:application/pdf;base64,"+btoa(ue()));break;default:throw new Error('Output type "'+e+'" is not supported.')}});switch(u){case"pt":h=1;break;case"mm":h=72/25.4;break;case"cm":h=72/2.54;break;case"in":h=72;break;case"px":h=96/72;break;case"pc":h=12;break;case"em":h=12;break;case"ex":h=6;break;default:throw"Invalid unit: "+u}if(i.hasOwnProperty(y))w=i[y][1]/h,m=i[y][0]/h;else try{w=c[1],m=c[0]}catch(he){throw new Error("Invalid format: "+c)}if("p"===a||"portrait"===a)a="p",m>w&&(p=m,m=w,w=p);else{if("l"!==a&&"landscape"!==a)throw"Invalid orientation: "+a;a="l",w>m&&(p=m,m=w,w=p)}D.internal={pdfEscape:ee,getStyle:ce,getFont:function(){return S[ae.apply(D,arguments)]},getFontSize:function(){return q},getLineHeight:function(){return q*x},write:function(t){N(1===arguments.length?t:Array.prototype.join.call(arguments," "))},getCoordinateString:function(t){return F(t*h)},getVerticalCoordinateString:function(t){return F((w-t)*h)},collections:{},newObject:M,putStream:H,events:U,scaleFactor:h,pageSize:{width:m,height:w},output:function(t,e){return de(t,e)},getNumberOfPages:function(){return I.length-1},pages:I},D.addPage=function(){return ie(),this},D.text=function(t,e,r,n,s){function o(t){return t=t.split("	").join(Array(f.TabLen||9).join(" ")),ee(t,n)}"number"==typeof t&&(p=r,r=e,e=t,t=p),"string"==typeof t&&t.match(/[\n\r]/)&&(t=t.split(/\r\n|\r|\n/g)),"number"==typeof n&&(s=n,n=null);var i="",a="Td";if(s){s*=Math.PI/180;var u=Math.cos(s),c=Math.sin(s);i=[F(u),F(c),F(-1*c),F(u),""].join(" "),a="Tm"}if(n=n||{},"noBOM"in n||(n.noBOM=!0),"autoencode"in n||(n.autoencode=!0),"string"==typeof t)t=o(t);else{if(!(t instanceof Array))throw new Error('Type of text must be string or Array. "'+t+'" is not recognized.');for(var l=t.concat(),m=[],y=l.length;y--;)m.push(o(l.shift()));t=m.join(") Tj\nT* (")}return N("BT\n/"+d+" "+q+" Tf\n"+q*x+" TL\n"+v+"\n"+i+F(e*h)+" "+F((w-r)*h)+" "+a+"\n("+t+") Tj\nET"),this},D.line=function(t,e,r,n){return this.lines([[r-t,n-e]],t,e)},D.lines=function(t,e,r,n,s,o){var i,a,u,c,l,f,d,m,y,g,v;for("number"==typeof t&&(p=r,r=e,e=t,t=p),n=n||[1,1],N(L(e*h)+" "+L((w-r)*h)+" m "),i=n[0],a=n[1],c=t.length,g=e,v=r,u=0;c>u;u++)l=t[u],2===l.length?(g=l[0]*i+g,v=l[1]*a+v,N(L(g*h)+" "+L((w-v)*h)+" l")):(f=l[0]*i+g,d=l[1]*a+v,m=l[2]*i+g,y=l[3]*a+v,g=l[4]*i+g,v=l[5]*a+v,N(L(f*h)+" "+L((w-d)*h)+" "+L(m*h)+" "+L((w-y)*h)+" "+L(g*h)+" "+L((w-v)*h)+" c"));return o&&N(" h"),null!==s&&N(ce(s)),this},D.rect=function(t,e,r,n,s){ce(s);return N([F(t*h),F((w-e)*h),F(r*h),F(-n*h),"re"].join(" ")),null!==s&&N(ce(s)),this},D.triangle=function(t,e,r,n,s,o,i){return this.lines([[r-t,n-e],[s-r,o-n],[t-s,e-o]],t,e,[1,1],i,!0),this},D.roundedRect=function(t,e,r,n,s,o,i){var a=4/3*(Math.SQRT2-1);return this.lines([[r-2*s,0],[s*a,0,s,o-o*a,s,o],[0,n-2*o],[0,o*a,-(s*a),o,-s,o],[-r+2*s,0],[-(s*a),0,-s,-(o*a),-s,-o],[0,-n+2*o],[0,-(o*a),s*a,-o,s,-o]],t+s,e,[1,1],i),this},D.ellipse=function(t,e,r,n,s){var o=4/3*(Math.SQRT2-1)*r,i=4/3*(Math.SQRT2-1)*n;return N([F((t+r)*h),F((w-e)*h),"m",F((t+r)*h),F((w-(e-i))*h),F((t+o)*h),F((w-(e-n))*h),F(t*h),F((w-(e-n))*h),"c"].join(" ")),N([F((t-o)*h),F((w-(e-n))*h),F((t-r)*h),F((w-(e-i))*h),F((t-r)*h),F((w-e)*h),"c"].join(" ")),N([F((t-r)*h),F((w-(e+i))*h),F((t-o)*h),F((w-(e+n))*h),F(t*h),F((w-(e+n))*h),"c"].join(" ")),N([F((t+o)*h),F((w-(e+n))*h),F((t+r)*h),F((w-(e+i))*h),F((t+r)*h),F((w-e)*h),"c"].join(" ")),null!==s&&N(ce(s)),this},D.circle=function(t,e,r,n){return this.ellipse(t,e,r,r,n)},D.setProperties=function(t){for(var e in R)R.hasOwnProperty(e)&&t[e]&&(R[e]=t[e]);return this},D.setFontSize=function(t){return q=t,this},D.setFont=function(t,e){return d=ae(t,e),this},D.setFontStyle=D.setFontType=function(t){return d=ae(void 0,t),this},D.getFontList=function(){var t,e,r,n={};for(t in E)if(E.hasOwnProperty(t)){n[t]=r=[];for(e in E[t])E[t].hasOwnProperty(e)&&r.push(e)}return n},D.setLineWidth=function(t){return N((t*h).toFixed(2)+" w"),this},D.setDrawColor=function(t,e,r,n){var s;return s=void 0===e||void 0===n&&t===e===r?"string"==typeof t?t+" G":F(t/255)+" G":void 0===n?"string"==typeof t?[t,e,r,"RG"].join(" "):[F(t/255),F(e/255),F(r/255),"RG"].join(" "):"string"==typeof t?[t,e,r,n,"K"].join(" "):[F(t),F(e),F(r),F(n),"K"].join(" "),N(s),this},D.setFillColor=function(t,e,r,n){var s;return s=void 0===e||void 0===n&&t===e===r?"string"==typeof t?t+" g":F(t/255)+" g":void 0===n?"string"==typeof t?[t,e,r,"rg"].join(" "):[F(t/255),F(e/255),F(r/255),"rg"].join(" "):"string"==typeof t?[t,e,r,n,"k"].join(" "):[F(t),F(e),F(r),F(n),"k"].join(" "),N(s),this},D.setTextColor=function(t,e,r){if("string"==typeof t&&/^#[0-9A-Fa-f]{6}$/.test(t)){var n=parseInt(t.substr(1),16);t=n>>16&255,e=n>>8&255,r=255&n}return v=0===t&&0===e&&0===r||"undefined"==typeof e?L(t/255)+" g":[L(t/255),L(e/255),L(r/255),"rg"].join(" "),this},D.CapJoinStyles={0:0,butt:0,but:0,miter:0,1:1,round:1,rounded:1,circle:1,2:2,projecting:2,project:2,square:2,bevel:2},D.setLineCap=function(t){var e=this.CapJoinStyles[t];if(void 0===e)throw new Error("Line cap style of '"+t+"' is not recognized. See or extend .CapJoinStyles property for valid styles");return B=e,N(e+" J"),this},D.setLineJoin=function(t){var e=this.CapJoinStyles[t];if(void 0===e)throw new Error("Line join style of '"+t+"' is not recognized. See or extend .CapJoinStyles property for valid styles");return O=e,N(e+" j"),this},D.output=de,D.save=function(t){D.output("save",t)};for(var pe in r.API)r.API.hasOwnProperty(pe)&&("events"===pe&&r.API.events.length?!function(t,e){var r,n,s;for(s=e.length-1;-1!==s;s--)r=e[s][0],n=e[s][1],t.subscribe.apply(t,[r].concat("function"==typeof n?[n]:n))}(U,r.API.events):D[pe]=r.API[pe]);return $(),d="F1",ie(),U.publish("initialized"),D}var o="1.3",i={a0:[2383.94,3370.39],a1:[1683.78,2383.94],a2:[1190.55,1683.78],a3:[841.89,1190.55],a4:[595.28,841.89],a5:[419.53,595.28],a6:[297.64,419.53],a7:[209.76,297.64],a8:[147.4,209.76],a9:[104.88,147.4],a10:[73.7,104.88],b0:[2834.65,4008.19],b1:[2004.09,2834.65],b2:[1417.32,2004.09],b3:[1000.63,1417.32],b4:[708.66,1000.63],b5:[498.9,708.66],b6:[354.33,498.9],b7:[249.45,354.33],b8:[175.75,249.45],b9:[124.72,175.75],b10:[87.87,124.72],c0:[2599.37,3676.54],c1:[1836.85,2599.37],c2:[1298.27,1836.85],c3:[918.43,1298.27],c4:[649.13,918.43],c5:[459.21,649.13],c6:[323.15,459.21],c7:[229.61,323.15],c8:[161.57,229.61],c9:[113.39,161.57],c10:[79.37,113.39],dl:[311.81,623.62],letter:[612,792],"government-letter":[576,756],legal:[612,1008],"junior-legal":[576,360],ledger:[1224,792],tabloid:[792,1224],"credit-card":[153,243]};return r.API={events:[]},r.version="1.0.150-git 2014-05-30T00:40:diegocr","function"==typeof define&&define.amd?define(function(){return r}):t.jsPDF=r,r}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this);!function(t){"use strict";t.addHTML=function(t,e,r,n,s){if("undefined"==typeof html2canvas&&"undefined"==typeof rasterizeHTML)throw new Error("You need either https://github.com/niklasvh/html2canvas or https://github.com/cburgmer/rasterizeHTML.js");"number"!=typeof e&&(n=e,s=r),"function"==typeof n&&(s=n,n=null);var o=this.internal,i=o.scaleFactor,a=o.pageSize.width,u=o.pageSize.height;if(n=n||{},n.onrendered=function(t){e=parseInt(e)||0,r=parseInt(r)||0;var o=n.dim||{},c=o.h||0,l=o.w||Math.min(a,t.width/i)-e,f="JPEG";if(n.format&&(f=n.format),t.height>u&&n.pagesplit){var d=function(){for(var n=0;;){var o=document.createElement("canvas");o.width=Math.min(a*i,t.width),o.height=Math.min(u*i,t.height-n);var c=o.getContext("2d");c.drawImage(t,0,n,t.width,o.height,0,0,o.width,o.height);var d=[o,e,n?0:r,o.width/i,o.height/i,f,null,"SLOW"];if(this.addImage.apply(this,d),n+=o.height,n>=t.height)break;this.addPage()}s(l,n,null,d)}.bind(this);if("CANVAS"===t.nodeName){var h=new Image;h.onload=d,h.src=t.toDataURL("image/png"),t=h}else d()}else{var p=Math.random().toString(35),m=[t,e,r,l,c,f,p,"SLOW"];this.addImage.apply(this,m),s(l,c,p,m)}}.bind(this),"undefined"!=typeof html2canvas&&!n.rstz)return html2canvas(t,n);if("undefined"!=typeof rasterizeHTML){var c="drawDocument";return"string"==typeof t&&(c=/^http/.test(t)?"drawURL":"drawHTML"),n.width=n.width||a*i,rasterizeHTML[c](t,void 0,n).then(function(t){n.onrendered(t.image)},function(t){s(null,t)})}return null}}(r.API),function(t){"use strict";var e="addImage_",r=["jpeg","jpg","png"],n=function(t){var e=this.internal.newObject(),r=this.internal.write,s=this.internal.putStream;if(t.n=e,r("<</Type /XObject"),r("/Subtype /Image"),r("/Width "+t.w),r("/Height "+t.h),t.cs===this.color_spaces.INDEXED?r("/ColorSpace [/Indexed /DeviceRGB "+(t.pal.length/3-1)+" "+("smask"in t?e+2:e+1)+" 0 R]"):(r("/ColorSpace /"+t.cs),t.cs===this.color_spaces.DEVICE_CMYK&&r("/Decode [1 0 1 0 1 0 1 0]")),r("/BitsPerComponent "+t.bpc),"f"in t&&r("/Filter /"+t.f),"dp"in t&&r("/DecodeParms <<"+t.dp+">>"),"trns"in t&&t.trns.constructor==Array){for(var o="",i=0,a=t.trns.length;a>i;i++)o+=t.trns[i]+" "+t.trns[i]+" ";r("/Mask ["+o+"]")}if("smask"in t&&r("/SMask "+(e+1)+" 0 R"),r("/Length "+t.data.length+">>"),s(t.data),r("endobj"),"smask"in t){var u="/Predictor 15 /Colors 1 /BitsPerComponent "+t.bpc+" /Columns "+t.w,c={w:t.w,h:t.h,cs:"DeviceGray",bpc:t.bpc,dp:u,data:t.smask};"f"in t&&(c.f=t.f),n.call(this,c)}t.cs===this.color_spaces.INDEXED&&(this.internal.newObject(),r("<< /Length "+t.pal.length+">>"),s(this.arrayBufferToBinaryString(new Uint8Array(t.pal))),r("endobj"))},s=function(){var t=this.internal.collections[e+"images"];for(var r in t)n.call(this,t[r])},o=function(){var t,r=this.internal.collections[e+"images"],n=this.internal.write;for(var s in r)t=r[s],n("/I"+t.i,t.n,"0","R")},i=function(e){return e&&"string"==typeof e&&(e=e.toUpperCase()),e in t.image_compression?e:t.image_compression.NONE},a=function(){var t=this.internal.collections[e+"images"];return t||(this.internal.collections[e+"images"]=t={},this.internal.events.subscribe("putResources",s),this.internal.events.subscribe("putXobjectDict",o)),t},u=function(t){var e=0;return t&&(e=Object.keys?Object.keys(t).length:function(t){var e=0;for(var r in t)t.hasOwnProperty(r)&&e++;return e}(t)),e},c=function(t){return"undefined"==typeof t||null===t},l=function(){return void 0},f=function(t){return-1===r.indexOf(t)},d=function(e){return"function"!=typeof t["process"+e.toUpperCase()]},h=function(t){return"object"==typeof t&&1===t.nodeType},p=function(t,e){if("IMG"===t.nodeName&&t.hasAttribute("src")&&0===(""+t.getAttribute("src")).indexOf("data:image/"))return t.getAttribute("src");if("CANVAS"===t.nodeName)var r=t;else{var r=document.createElement("canvas");r.width=t.clientWidth||t.width,r.height=t.clientHeight||t.height;var n=r.getContext("2d");if(!n)throw"addImage requires canvas to be supported by browser.";n.drawImage(t,0,0,r.width,r.height)}return r.toDataURL("png"==e?"image/png":"image/jpeg")},m=function(t,e){var r;if(e)for(var n in e)if(t===e[n].alias){r=e[n];break}return r},w=function(t,e,r){return t||e||(t=-96,e=-96),0>t&&(t=-1*r.w*72/t/this.internal.scaleFactor),0>e&&(e=-1*r.h*72/e/this.internal.scaleFactor),0===t&&(t=e*r.w/r.h),0===e&&(e=t*r.h/r.w),[t,e]},y=function(t,e,r,n,s,o,i){var a=w.call(this,r,n,s),u=this.internal.getCoordinateString,c=this.internal.getVerticalCoordinateString;r=a[0],n=a[1],i[o]=s,this.internal.write("q",u(r),"0 0",u(n),u(t),c(e+n),"cm /I"+s.i,"Do Q")};t.color_spaces={DEVICE_RGB:"DeviceRGB",DEVICE_GRAY:"DeviceGray",DEVICE_CMYK:"DeviceCMYK",CAL_GREY:"CalGray",CAL_RGB:"CalRGB",LAB:"Lab",ICC_BASED:"ICCBased",INDEXED:"Indexed",PATTERN:"Pattern",SEPERATION:"Seperation",DEVICE_N:"DeviceN"},t.decode={DCT_DECODE:"DCTDecode",FLATE_DECODE:"FlateDecode",LZW_DECODE:"LZWDecode",JPX_DECODE:"JPXDecode",JBIG2_DECODE:"JBIG2Decode",ASCII85_DECODE:"ASCII85Decode",ASCII_HEX_DECODE:"ASCIIHexDecode",RUN_LENGTH_DECODE:"RunLengthDecode",CCITT_FAX_DECODE:"CCITTFaxDecode"},t.image_compression={NONE:"NONE",FAST:"FAST",MEDIUM:"MEDIUM",SLOW:"SLOW"},t.isString=function(t){return"string"==typeof t},t.extractInfoFromBase64DataURI=function(t){return/^data:([\w]+?\/([\w]+?));base64,(.+?)$/g.exec(t)},t.supportsArrayBuffer=function(){return"undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array},t.isArrayBuffer=function(t){return this.supportsArrayBuffer()?t instanceof ArrayBuffer:!1},t.isArrayBufferView=function(t){return this.supportsArrayBuffer()?"undefined"==typeof Uint32Array?!1:t instanceof Int8Array||t instanceof Uint8Array||"undefined"!=typeof Uint8ClampedArray&&t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array||t instanceof Float64Array:!1},t.binaryStringToUint8Array=function(t){for(var e=t.length,r=new Uint8Array(e),n=0;e>n;n++)r[n]=t.charCodeAt(n);return r},t.arrayBufferToBinaryString=function(t){this.isArrayBuffer(t)&&(t=new Uint8Array(t));for(var e="",r=t.byteLength,n=0;r>n;n++)e+=String.fromCharCode(t[n]);return e},t.arrayBufferToBase64=function(t){for(var e,r,n,s,o,i="",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",u=new Uint8Array(t),c=u.byteLength,l=c%3,f=c-l,d=0;f>d;d+=3)o=u[d]<<16|u[d+1]<<8|u[d+2],e=(16515072&o)>>18,r=(258048&o)>>12,n=(4032&o)>>6,s=63&o,i+=a[e]+a[r]+a[n]+a[s];return 1==l?(o=u[f],e=(252&o)>>2,r=(3&o)<<4,i+=a[e]+a[r]+"=="):2==l&&(o=u[f]<<8|u[f+1],e=(64512&o)>>10,r=(1008&o)>>4,n=(15&o)<<2,i+=a[e]+a[r]+a[n]+"="),i},t.createImageInfo=function(t,e,r,n,s,o,i,a,u,c,l,f){var d={alias:a,w:e,h:r,cs:n,bpc:s,i:i,data:t};return o&&(d.f=o),u&&(d.dp=u),c&&(d.trns=c),l&&(d.pal=l),f&&(d.smask=f),d},t.addImage=function(t,e,n,s,o,w,g,v){if("number"==typeof e){var b=w;w=o,o=s,s=n,n=e,e=b}var q,x,k=a.call(this);if(v=i(v),e=(e||"JPEG").toLowerCase(),c(g)&&(g=l(t)),h(t)&&(t=p(t,e)),this.isString(t)){var _=this.extractInfoFromBase64DataURI(t);_?(e=_[2],t=atob(_[3]),this.supportsArrayBuffer()&&(x=t,t=this.binaryStringToUint8Array(t))):255!==t.charCodeAt(0)&&(q=m(t,k))}if(f(e))throw new Error("addImage currently only supports formats "+r+", not '"+e+"'");if(d(e))throw new Error("please ensure that the plugin for '"+e+"' support is added");var A=u(k),C=q;if(C||(C=this["process"+e.toUpperCase()](t,A,g,v,x)),!C)throw new Error("An unkwown error occurred whilst processing the image");return y.call(this,n,s,o,w,C,A,k),this};var g=function(t){var e,r;if(255===!t.charCodeAt(0)||216===!t.charCodeAt(1)||255===!t.charCodeAt(2)||224===!t.charCodeAt(3)||!t.charCodeAt(6)==="J".charCodeAt(0)||!t.charCodeAt(7)==="F".charCodeAt(0)||!t.charCodeAt(8)==="I".charCodeAt(0)||!t.charCodeAt(9)==="F".charCodeAt(0)||0===!t.charCodeAt(10))throw new Error("getJpegSize requires a binary string jpeg file");for(var n=256*t.charCodeAt(4)+t.charCodeAt(5),s=4,o=t.length;o>s;){if(s+=n,255!==t.charCodeAt(s))throw new Error("getJpegSize could not find the size of the image");if(192===t.charCodeAt(s+1)||193===t.charCodeAt(s+1)||194===t.charCodeAt(s+1)||195===t.charCodeAt(s+1)||196===t.charCodeAt(s+1)||197===t.charCodeAt(s+1)||198===t.charCodeAt(s+1)||199===t.charCodeAt(s+1))return r=256*t.charCodeAt(s+5)+t.charCodeAt(s+6),e=256*t.charCodeAt(s+7)+t.charCodeAt(s+8),[e,r];s+=2,n=256*t.charCodeAt(s)+t.charCodeAt(s+1)}},v=function(t){var e=t[0]<<8|t[1];if(65496!==e)throw new Error("Supplied data is not a JPEG");for(var r,n,s,o=t.length,i=(t[4]<<8)+t[5],a=4;o>a;){if(a+=i,r=b(t,a),i=(r[2]<<8)+r[3],(192===r[1]||194===r[1])&&255===r[0]&&i>7)return r=b(t,a+5),n=(r[2]<<8)+r[3],s=(r[0]<<8)+r[1],{width:n,height:s};a+=2}throw new Error("getJpegSizeFromBytes could not find the size of the image")},b=function(t,e){return t.subarray(e,e+4)};t.processJPEG=function(t,e,r,n,s){var o,i=this.color_spaces.DEVICE_RGB,a=this.decode.DCT_DECODE,u=8;return this.isString(t)?(o=g(t),this.createImageInfo(t,o[0],o[1],i,u,a,e,r)):(this.isArrayBuffer(t)&&(t=new Uint8Array(t)),this.isArrayBufferView(t)?(o=v(t),t=s||this.arrayBufferToBinaryString(t),this.createImageInfo(t,o.width,o.height,i,u,a,e,r)):null)},t.processJPG=function(){return this.processJPEG.apply(this,arguments)}}(r.API),function(t){"use strict";t.autoPrint=function(){var t;return this.internal.events.subscribe("postPutResources",function(){t=this.internal.newObject(),this.internal.write("<< /S/Named /Type/Action /N/Print >>","endobj")}),this.internal.events.subscribe("putCatalog",function(){this.internal.write("/OpenAction "+t+" 0 R")}),this}}(r.API),function(t){"use strict";var e,r,n,s,o=3,i=13,a={x:void 0,y:void 0,w:void 0,h:void 0,ln:void 0},u=1,c=function(t,e,r,n,s){a={x:t,y:e,w:r,h:n,ln:s}},l=function(){return a},f={left:0,top:0,bottom:0};t.setHeaderFunction=function(t){s=t},t.getTextDimensions=function(t){e=this.internal.getFont().fontName,r=this.table_font_size||this.internal.getFontSize(),n=this.internal.getFont().fontStyle;var s,o,i=19.049976/25.4;return o=document.createElement("font"),o.id="jsPDFCell",o.style.fontStyle=n,o.style.fontName=e,o.style.fontSize=r+"pt",o.innerText=t,document.body.appendChild(o),s={w:(o.offsetWidth+1)*i,h:(o.offsetHeight+1)*i},document.body.removeChild(o),s},t.cellAddPage=function(){var t=this.margins||f;this.addPage(),c(t.left,t.top,void 0,void 0),u+=1},t.cellInitialize=function(){a={x:void 0,y:void 0,w:void 0,h:void 0,ln:void 0},u=1},t.cell=function(t,e,r,n,s,a,u){var d=l();if(void 0!==d.ln)if(d.ln===a)t=d.x+d.w,e=d.y;else{var h=this.margins||f;d.y+d.h+n+i>=this.internal.pageSize.height-h.bottom&&(this.cellAddPage(),this.printHeaders&&this.tableHeaderRow&&this.printHeaderRow(a,!0)),e=l().y+l().h}if(void 0!==s[0])if(this.printingHeaderRow?this.rect(t,e,r,n,"FD"):this.rect(t,e,r,n),"right"===u){if(s instanceof Array)for(var p=0;p<s.length;p++){var m=s[p],w=this.getStringUnitWidth(m)*this.internal.getFontSize();this.text(m,t+r-w-o,e+this.internal.getLineHeight()*(p+1))}}else this.text(s,t+o,e+this.internal.getLineHeight());return c(t,e,r,n,a),this},t.arrayMax=function(t,e){var r,n,s,o=t[0];for(r=0,n=t.length;n>r;r+=1)s=t[r],e?-1===e(o,s)&&(o=s):s>o&&(o=s);return o},t.table=function(e,r,n,s,o){if(!n)throw"No data for PDF table";var i,c,l,d,h,p,m,w,y,g,v=[],b=[],q={},x={},k=[],_=[],A=!1,C=!0,S=12,E=f;if(E.width=this.internal.pageSize.width,o&&(o.autoSize===!0&&(A=!0),o.printHeaders===!1&&(C=!1),o.fontSize&&(S=o.fontSize),o.margins&&(E=o.margins)),this.lnMod=0,a={x:void 0,y:void 0,w:void 0,h:void 0,ln:void 0},u=1,this.printHeaders=C,this.margins=E,this.setFontSize(S),this.table_font_size=S,void 0===s||null===s)v=Object.keys(n[0]);else if(s[0]&&"string"!=typeof s[0]){var z=19.049976/25.4;for(c=0,l=s.length;l>c;c+=1)i=s[c],v.push(i.name),b.push(i.prompt),x[i.name]=i.width*z}else v=s;if(A)for(g=function(t){return t[i]},c=0,l=v.length;l>c;c+=1){for(i=v[c],q[i]=n.map(g),k.push(this.getTextDimensions(b[c]||i).w),p=q[i],m=0,d=p.length;d>m;m+=1)h=p[m],k.push(this.getTextDimensions(h).w);x[i]=t.arrayMax(k)}if(C){var I=this.calculateLineHeight(v,x,b.length?b:v);for(c=0,l=v.length;l>c;c+=1)i=v[c],_.push([e,r,x[i],I,String(b.length?b[c]:i)]);this.setTableHeaderRow(_),this.printHeaderRow(1,!1)}for(c=0,l=n.length;l>c;c+=1){var I;for(w=n[c],I=this.calculateLineHeight(v,x,w),m=0,y=v.length;y>m;m+=1)i=v[m],this.cell(e,r,x[i],I,w[i],c+2,i.align)}return this.lastCellPos=a,this.table_x=e,this.table_y=r,this},t.calculateLineHeight=function(t,e,r){for(var n,s=0,i=0;i<t.length;i++){n=t[i],r[n]=this.splitTextToSize(String(r[n]),e[n]-o);var a=this.internal.getLineHeight()*r[n].length+o;a>s&&(s=a)}return s},t.setTableHeaderRow=function(t){this.tableHeaderRow=t},t.printHeaderRow=function(t,e){if(!this.tableHeaderRow)throw"Property tableHeaderRow does not exist.";var r,n,o,i;if(this.printingHeaderRow=!0,void 0!==s){var a=s(this,u);c(a[0],a[1],a[2],a[3],-1)}this.setFontStyle("bold");var l=[];for(o=0,i=this.tableHeaderRow.length;i>o;o+=1)this.setFillColor(200,200,200),r=this.tableHeaderRow[o],e&&(r[1]=this.margins&&this.margins.top||0,l.push(r)),n=[].concat(r),this.cell.apply(this,n.concat(t));l.length>0&&this.setTableHeaderRow(l),this.setFontStyle("normal"),this.printingHeaderRow=!1}}(r.API),function(t){var e,r,n,s,o,i,a,u,c,l,f,d,h,p,m,w,y;e=function(){function t(){}return function(e){return t.prototype=e,new t}}(),a=function(t){var e,r,n,s,o,i,a;for(r=0,n=t.length,e=void 0,s=!1,i=!1;!s&&r!==n;)e=t[r]=t[r].trimLeft(),e&&(s=!0),r++;for(r=n-1;n&&!i&&-1!==r;)e=t[r]=t[r].trimRight(),e&&(i=!0),r--;for(o=/\s+$/g,a=!0,r=0;r!==n;)e=t[r].replace(/\s+/g," "),a&&(e=e.trimLeft()),e&&(a=o.test(e)),t[r]=e,r++;return t},u=function(t,e,r,n){return this.pdf=t,this.x=e,this.y=r,this.settings=n,this.init(),this},c=function(t){var e,r,s;for(e=void 0,s=t.split(","),r=s.shift();!e&&r;)e=n[r.trim().toLowerCase()],r=s.shift();return e},l=function(t){t="auto"===t?"0px":t,t.indexOf("em")>-1&&!isNaN(Number(t.replace("em","")))&&(t=18.719*Number(t.replace("em",""))+"px"),t.indexOf("pt")>-1&&!isNaN(Number(t.replace("pt","")))&&(t=1.333*Number(t.replace("pt",""))+"px");var e,r,n;return r=void 0,e=16,(n=f[t])?n:(n={"xx-small":9,"x-small":11,small:13,medium:16,large:19,"x-large":23,"xx-large":28,auto:0}[{css_line_height_string:t}],n!==r?f[t]=n/e:(n=parseFloat(t))?f[t]=n/e:(n=t.match(/([\d\.]+)(px)/),f[t]=3===n.length?parseFloat(n[1])/e:1))},i=function(t){var e,r,n;return n=function(t){var e;return e=function(t){return document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(t,null):t.currentStyle?t.currentStyle:t.style}(t),function(t){return t=t.replace(/-\D/g,function(t){return t.charAt(1).toUpperCase()}),e[t]}}(t),e={},r=void 0,e["font-family"]=c(n("font-family"))||"times",e["font-style"]=s[n("font-style")]||"normal",e["text-align"]=TextAlignMap[n("text-align")]||"left",r=o[n("font-weight")]||"normal","bold"===r&&(e["font-style"]="normal"===e["font-style"]?r:r+e["font-style"]),e["font-size"]=l(n("font-size"))||1,e["line-height"]=l(n("line-height"))||1,e.display="inline"===n("display")?"inline":"block","block"===e.display&&(e["margin-top"]=l(n("margin-top"))||0,e["margin-bottom"]=l(n("margin-bottom"))||0,e["padding-top"]=l(n("padding-top"))||0,e["padding-bottom"]=l(n("padding-bottom"))||0,e["margin-left"]=l(n("margin-left"))||0,e["margin-right"]=l(n("margin-right"))||0,e["padding-left"]=l(n("padding-left"))||0,e["padding-right"]=l(n("padding-right"))||0),e},d=function(t,e,r){var n,s,o,i,a;if(o=!1,s=void 0,i=void 0,a=void 0,n=r["#"+t.id])if("function"==typeof n)o=n(t,e);else for(s=0,i=n.length;!o&&s!==i;)o=n[s](t,e),s++;if(n=r[t.nodeName],!o&&n)if("function"==typeof n)o=n(t,e);else for(s=0,i=n.length;!o&&s!==i;)o=n[s](t,e),s++;return o},y=function(t,e){var r,n,s,o,i,a,u,c,l,f;for(r=[],n=[],s=0,f=t.rows[0].cells.length,c=t.clientWidth;f>s;)l=t.rows[0].cells[s],n[s]={name:l.textContent.toLowerCase().replace(/\s+/g,""),prompt:l.textContent.replace(/\r?\n/g,""),width:l.clientWidth/c*e.pdf.internal.pageSize.width},s++;for(s=1;s<t.rows.length;){for(a=t.rows[s],i={},o=0;o<a.cells.length;)i[n[o].name]=a.cells[o].textContent.replace(/\r?\n/g,""),o++;r.push(i),s++}return u={rows:r,headers:n}};var g={SCRIPT:1,STYLE:1,NOSCRIPT:1,OBJECT:1,EMBED:1,SELECT:1},v=1;r=function(t,e,n){var s,o,a,u,c,l,f,p,m;for(o=t.childNodes,s=void 0,a=i(t),c="block"===a.display,c&&(e.setBlockBoundary(),e.setBlockStyle(a)),f=19.049976/25.4,u=0,l=o.length;l>u;){if(s=o[u],"object"==typeof s){if(1===s.nodeType&&"HEADER"===s.nodeName){var w=s,b=e.pdf.margins_doc.top;e.pdf.internal.events.subscribe("addPage",function(){e.y=b,r(w,e,n),e.pdf.margins_doc.top=e.y+10,e.y+=10},!1)}if(8===s.nodeType&&"#comment"===s.nodeName)~s.textContent.indexOf("ADD_PAGE")&&(e.pdf.addPage(),e.y=e.pdf.margins_doc.top);else if(1!==s.nodeType||g[s.nodeName])if(3===s.nodeType){var q=s.nodeValue;if(s.nodeValue&&"LI"===s.parentNode.nodeName)if("OL"===s.parentNode.parentNode.nodeName)q=v++ +". "+q;else{var x=16*a["font-size"],k=2;x>20&&(k=3),m=function(t,e){this.pdf.circle(t,e,k,"FD")}}e.addText(q,a)}else"string"==typeof s&&e.addText(s,a);else if("IMG"===s.nodeName&&h[s.getAttribute("src")])e.pdf.internal.pageSize.height-e.pdf.margins_doc.bottom<e.y+s.height&&e.y>e.pdf.margins_doc.top&&(e.pdf.addPage(),e.y=e.pdf.margins_doc.top),e.pdf.addImage(h[s.getAttribute("src")],e.x,e.y,s.width,s.height),e.y+=s.height;else if("TABLE"===s.nodeName)p=y(s,e),e.y+=10,e.pdf.table(e.x,e.y,p.rows,p.headers,{autoSize:!1,printHeaders:!0,margins:e.pdf.margins_doc}),e.y=e.pdf.lastCellPos.y+e.pdf.lastCellPos.h+20;else if("OL"===s.nodeName||"UL"===s.nodeName)v=1,d(s,e,n)||r(s,e,n),e.y+=10;else if("LI"===s.nodeName){var _=e.x;e.x+="UL"===s.parentNode.nodeName?22:10,e.y+=3,d(s,e,n)||r(s,e,n),e.x=_}else d(s,e,n)||r(s,e,n)}u++}return c?e.setBlockBoundary(m):void 0},h={},p=function(t,e,r,n){function s(){e.pdf.internal.events.publish("imagesLoaded"),n()}function o(t,e,r){if(t){var n=new Image;++u,n.crossOrigin="",n.onerror=n.onload=function(){n.complete&&(0===n.src.indexOf("data:image/")&&(n.width=e||n.width||0,n.height=r||n.height||0),n.width+n.height&&(h[t]=h[t]||n)),--u||s()},n.src=t}}for(var i=t.getElementsByTagName("img"),a=i.length,u=0;a--;)o(i[a].getAttribute("src"),i[a].width,i[a].height);return u||s()},m=function(t,e,n,s){var o=t.getElementsByTagName("footer");if(o.length>0){o=o[0];var i=e.pdf.internal.write,a=e.y;e.pdf.internal.write=function(){},r(o,e,n);var u=Math.ceil(e.y-a)+5;e.y=a,e.pdf.internal.write=i,e.pdf.margins_doc.bottom+=u;
          for(var c=function(t){var s=void 0!==t?t.pageNumber:1,i=e.y;e.y=e.pdf.internal.pageSize.height-e.pdf.margins_doc.bottom,e.pdf.margins_doc.bottom-=u;for(var a=o.getElementsByTagName("span"),c=0;c<a.length;++c)(" "+a[c].className+" ").replace(/[\n\t]/g," ").indexOf(" pageCounter ")>-1&&(a[c].innerHTML=s),(" "+a[c].className+" ").replace(/[\n\t]/g," ").indexOf(" totalPages ")>-1&&(a[c].innerHTML="###jsPDFVarTotalPages###");r(o,e,n),e.pdf.margins_doc.bottom+=u,e.y=i},l=o.getElementsByTagName("span"),f=0;f<l.length;++f)(" "+l[f].className+" ").replace(/[\n\t]/g," ").indexOf(" totalPages ")>-1&&e.pdf.internal.events.subscribe("htmlRenderingFinished",e.pdf.putTotalPages.bind(e.pdf,"###jsPDFVarTotalPages###"),!0);e.pdf.internal.events.subscribe("addPage",c,!1),c(),g.FOOTER=1}s()},w=function(t,e,n,s,o,i){if(!e)return!1;"string"==typeof e||e.parentNode||(e=""+e.innerHTML),"string"==typeof e&&(e=function(t){var e,r,n,s;return n="jsPDFhtmlText"+Date.now().toString()+(1e3*Math.random()).toFixed(0),s="position: absolute !important;clip: rect(1px 1px 1px 1px); /* IE6, IE7 */clip: rect(1px, 1px, 1px, 1px);padding:0 !important;border:0 !important;height: 1px !important;width: 1px !important; top:auto;left:-100px;overflow: hidden;",r=document.createElement("div"),r.style.cssText=s,r.innerHTML='<iframe style="height:1px;width:1px" name="'+n+'" />',document.body.appendChild(r),e=window.frames[n],e.document.body.innerHTML=t,e.document.body}(e.replace(/<\/?script[^>]*?>/gi,"")));var a=new u(t,n,s,o);return i=i||function(){},p.call(this,e,a,o.elementHandlers,function(){m.call(this,e,a,o.elementHandlers,function(){r(e,a,o.elementHandlers),a.pdf.internal.events.publish("htmlRenderingFinished"),i(a.dispose())})}),a.dispose()},u.prototype.init=function(){return this.paragraph={text:[],style:[]},this.pdf.internal.write("q")},u.prototype.dispose=function(){return this.pdf.internal.write("Q"),{x:this.x,y:this.y}},u.prototype.splitFragmentsIntoLines=function(t,r){var n,s,o,i,a,u,c,l,f,d,h,p,m,w,y;for(s=12,h=this.pdf.internal.scaleFactor,a={},o=void 0,d=void 0,i=void 0,u=void 0,y=void 0,f=void 0,l=void 0,c=void 0,p=[],m=[p],n=0,w=this.settings.width;t.length;)if(u=t.shift(),y=r.shift(),u)if(o=y["font-family"],d=y["font-style"],i=a[o+d],i||(i=this.pdf.internal.getFont(o,d).metadata.Unicode,a[o+d]=i),f={widths:i.widths,kerning:i.kerning,fontSize:y["font-size"]*s,textIndent:n},l=this.pdf.getStringUnitWidth(u,f)*f.fontSize/h,n+l>w){for(c=this.pdf.splitTextToSize(u,w,f),p.push([c.shift(),y]);c.length;)p=[[c.shift(),y]],m.push(p);n=this.pdf.getStringUnitWidth(p[0][0],f)*f.fontSize/h}else p.push([u,y]),n+=l;if(void 0!==y["text-align"]&&("center"===y["text-align"]||"right"===y["text-align"]||"justify"===y["text-align"]))for(var g=0;g<m.length;++g){var v=this.pdf.getStringUnitWidth(m[g][0][0],f)*f.fontSize/h;g>0&&(m[g][0][1]=e(m[g][0][1]));var b=w-v;if("right"===y["text-align"])m[g][0][1]["margin-left"]=b;else if("center"===y["text-align"])m[g][0][1]["margin-left"]=b/2;else if("justify"===y["text-align"]){var q=m[g][0][0].split(" ").length-1;m[g][0][1]["word-spacing"]=b/q,g===m.length-1&&(m[g][0][1]["word-spacing"]=0)}}return m},u.prototype.RenderTextFragment=function(t,e){var r,n;this.pdf.internal.pageSize.height-this.pdf.margins_doc.bottom<this.y+this.pdf.internal.getFontSize()&&(this.pdf.internal.write("ET","Q"),this.pdf.addPage(),this.y=this.pdf.margins_doc.top,this.pdf.internal.write("q","BT",this.pdf.internal.getCoordinateString(this.x),this.pdf.internal.getVerticalCoordinateString(this.y),"Td")),r=12,n=this.pdf.internal.getFont(e["font-family"],e["font-style"]),void 0!==e["word-spacing"]&&e["word-spacing"]>0&&this.pdf.internal.write(e["word-spacing"].toFixed(2),"Tw"),this.pdf.internal.write("/"+n.id,(r*e["font-size"]).toFixed(2),"Tf","("+this.pdf.internal.pdfEscape(t)+") Tj"),void 0!==e["word-spacing"]&&this.pdf.internal.write(0,"Tw")},u.prototype.renderParagraph=function(t){var e,r,n,s,o,i,u,c,l,f,d,h,p,m,w;if(s=a(this.paragraph.text),m=this.paragraph.style,e=this.paragraph.blockstyle,p=this.paragraph.blockstyle||{},this.paragraph={text:[],style:[],blockstyle:{},priorblockstyle:e},s.join("").trim()){c=this.splitFragmentsIntoLines(s,m),u=void 0,l=void 0,r=12,n=r/this.pdf.internal.scaleFactor,h=(Math.max((e["margin-top"]||0)-(p["margin-bottom"]||0),0)+(e["padding-top"]||0))*n,d=((e["margin-bottom"]||0)+(e["padding-bottom"]||0))*n,f=this.pdf.internal.write,o=void 0,i=void 0,this.y+=h,f("q","BT",this.pdf.internal.getCoordinateString(this.x),this.pdf.internal.getVerticalCoordinateString(this.y),"Td");for(var y=0;c.length;){for(u=c.shift(),l=0,o=0,i=u.length;o!==i;)u[o][0].trim()&&(l=Math.max(l,u[o][1]["line-height"],u[o][1]["font-size"]),w=7*u[o][1]["font-size"]),o++;var g=0;for(void 0!==u[0][1]["margin-left"]&&u[0][1]["margin-left"]>0&&(wantedIndent=this.pdf.internal.getCoordinateString(u[0][1]["margin-left"]),g=wantedIndent-y,y=wantedIndent),f(g,(-1*r*l).toFixed(2),"Td"),o=0,i=u.length;o!==i;)u[o][0]&&this.RenderTextFragment(u[o][0],u[o][1]),o++;this.y+=l*n}return t&&"function"==typeof t&&t.call(this,this.x-9,this.y-w/2),f("ET","Q"),this.y+=d}},u.prototype.setBlockBoundary=function(t){return this.renderParagraph(t)},u.prototype.setBlockStyle=function(t){return this.paragraph.blockstyle=t},u.prototype.addText=function(t,e){return this.paragraph.text.push(t),this.paragraph.style.push(e)},n={helvetica:"helvetica","sans-serif":"helvetica","times new roman":"times",serif:"times",times:"times",monospace:"courier",courier:"courier"},o={100:"normal",200:"normal",300:"normal",400:"normal",500:"bold",600:"bold",700:"bold",800:"bold",900:"bold",normal:"normal",bold:"bold",bolder:"bold",lighter:"normal"},s={normal:"normal",italic:"italic",oblique:"italic"},TextAlignMap={left:"left",right:"right",center:"center",justify:"justify"},f={normal:1},t.fromHTML=function(t,e,r,n,s,o){"use strict";return this.margins_doc=o||{top:0,bottom:0},n||(n={}),n.elementHandlers||(n.elementHandlers={}),w(this,t,e||4,r||4,n,s)}}(r.API),function(t){"use strict";var e,r,n;t.addJS=function(t){return n=t,this.internal.events.subscribe("postPutResources",function(){e=this.internal.newObject(),this.internal.write("<< /Names [(EmbeddedJS) "+(e+1)+" 0 R] >>","endobj"),r=this.internal.newObject(),this.internal.write("<< /S /JavaScript /JS (",n,") >>","endobj")}),this.internal.events.subscribe("putCatalog",function(){void 0!==e&&void 0!==r&&this.internal.write("/Names <</JavaScript "+e+" 0 R>>")}),this}}(r.API),function(t){"use strict";var e=function(){return"function"!=typeof PNG||"function"!=typeof i},r=function(e){return e!==t.image_compression.NONE&&n()},n=function(){var t="function"==typeof s;if(!t)throw new Error("requires deflate.js for compression");return t},o=function(e,r,n,o){var i=5,l=d;switch(o){case t.image_compression.FAST:i=3,l=f;break;case t.image_compression.MEDIUM:i=6,l=h;break;case t.image_compression.SLOW:i=9,l=p}e=c(e,r,n,l);var m=new Uint8Array(a(i)),w=u(e),y=new s(i),g=y.append(e),v=y.flush(),b=m.length+g.length+v.length,q=new Uint8Array(b+4);return q.set(m),q.set(g,m.length),q.set(v,m.length+g.length),q[b++]=w>>>24&255,q[b++]=w>>>16&255,q[b++]=w>>>8&255,q[b++]=255&w,t.arrayBufferToBinaryString(q)},a=function(t,e){var r=8,n=Math.LOG2E*Math.log(32768)-8,s=n<<4|r,o=s<<8,i=Math.min(3,(e-1&255)>>1);return o|=i<<6,o|=0,o+=31-o%31,[s,255&o&255]},u=function(t,e){for(var r,n=1,s=65535&n,o=n>>>16&65535,i=t.length,a=0;i>0;){r=i>e?e:i,i-=r;do s+=t[a++],o+=s;while(--r);s%=65521,o%=65521}return(o<<16|s)>>>0},c=function(t,e,r,n){for(var s,o,i,a=t.length/e,u=new Uint8Array(t.length+a),c=w(),l=0;a>l;l++){if(i=l*e,s=t.subarray(i,i+e),n)u.set(n(s,r,o),i+l);else{for(var f=0,d=c.length,h=[];d>f;f++)h[f]=c[f](s,r,o);var p=y(h.concat());u.set(h[p],i+l)}o=s}return u},l=function(t){var e=Array.apply([],t);return e.unshift(0),e},f=function(t,e){var r,n=[],s=0,o=t.length;for(n[0]=1;o>s;s++)r=t[s-e]||0,n[s+1]=t[s]-r+256&255;return n},d=function(t,e,r){var n,s=[],o=0,i=t.length;for(s[0]=2;i>o;o++)n=r&&r[o]||0,s[o+1]=t[o]-n+256&255;return s},h=function(t,e,r){var n,s,o=[],i=0,a=t.length;for(o[0]=3;a>i;i++)n=t[i-e]||0,s=r&&r[i]||0,o[i+1]=t[i]+256-(n+s>>>1)&255;return o},p=function(t,e,r){var n,s,o,i,a=[],u=0,c=t.length;for(a[0]=4;c>u;u++)n=t[u-e]||0,s=r&&r[u]||0,o=r&&r[u-e]||0,i=m(n,s,o),a[u+1]=t[u]-i+256&255;return a},m=function(t,e,r){var n=t+e-r,s=Math.abs(n-t),o=Math.abs(n-e),i=Math.abs(n-r);return o>=s&&i>=s?t:i>=o?e:r},w=function(){return[l,f,d,h,p]},y=function(t){for(var e,r,n,s=0,o=t.length;o>s;)e=g(t[s].slice(1)),(r>e||!r)&&(r=e,n=s),s++;return n},g=function(t){for(var e=0,r=t.length,n=0;r>e;)n+=Math.abs(t[e++]);return n};t.processPNG=function(t,n,s,i){var a,u,c,l,f,d,h=this.color_spaces.DEVICE_RGB,p=this.decode.FLATE_DECODE,m=8;if(this.isArrayBuffer(t)&&(t=new Uint8Array(t)),this.isArrayBufferView(t)){if(e())throw new Error("PNG support requires png.js and zlib.js");if(a=new PNG(t),t=a.imgData,m=a.bits,h=a.colorSpace,l=a.colors,-1!==[4,6].indexOf(a.colorType)){if(8===a.bits)for(var w,y,g=window["Uint"+a.pixelBitlength+"Array"],v=new g(a.decodePixels().buffer),b=v.length,q=new Uint8Array(b*a.colors),x=new Uint8Array(b),k=a.pixelBitlength-a.bits,_=0,A=0;b>_;_++){for(w=v[_],y=0;k>y;)q[A++]=w>>>y&255,y+=a.bits;x[_]=w>>>y&255}if(16===a.bits){for(var w,v=new Uint32Array(a.decodePixels().buffer),b=v.length,q=new Uint8Array(b*(32/a.pixelBitlength)*a.colors),x=new Uint8Array(b*(32/a.pixelBitlength)),C=a.colors>1,_=0,A=0,S=0;b>_;)w=v[_++],q[A++]=w>>>0&255,C&&(q[A++]=w>>>16&255,w=v[_++],q[A++]=w>>>0&255),x[S++]=w>>>16&255;m=8}r(i)?(t=o(q,a.width*a.colors,a.colors,i),d=o(x,a.width,1,i)):(t=q,d=x,p=null)}if(3===a.colorType&&(h=this.color_spaces.INDEXED,f=a.palette,a.transparency.indexed)){for(var E=a.transparency.indexed,z=0,_=0,b=E.length;b>_;++_)z+=E[_];if(z/=255,z===b-1&&-1!==E.indexOf(0))c=[E.indexOf(0)];else if(z!==b){for(var v=a.decodePixels(),x=new Uint8Array(v.length),_=0,b=v.length;b>_;_++)x[_]=E[v[_]];d=o(x,a.width,1)}}return u=p===this.decode.FLATE_DECODE?"/Predictor 15 /Colors "+l+" /BitsPerComponent "+m+" /Columns "+a.width:"/Colors "+l+" /BitsPerComponent "+m+" /Columns "+a.width,(this.isArrayBuffer(t)||this.isArrayBufferView(t))&&(t=this.arrayBufferToBinaryString(t)),(d&&this.isArrayBuffer(d)||this.isArrayBufferView(d))&&(d=this.arrayBufferToBinaryString(d)),this.createImageInfo(t,a.width,a.height,h,m,p,n,s,u,c,f,d)}throw new Error("Unsupported PNG image data, try using JPEG instead.")}}(r.API),function(t){"use strict";t.addSVG=function(t,e,r,n,s){function o(t,e){var r=e.createElement("style");r.type="text/css",r.styleSheet?r.styleSheet.cssText=t:r.appendChild(e.createTextNode(t)),e.getElementsByTagName("head")[0].appendChild(r)}function i(t){var e="childframe",r=t.createElement("iframe");return o(".jsPDF_sillysvg_iframe {display:none;position:absolute;}",t),r.name=e,r.setAttribute("width",0),r.setAttribute("height",0),r.setAttribute("frameborder","0"),r.setAttribute("scrolling","no"),r.setAttribute("seamless","seamless"),r.setAttribute("class","jsPDF_sillysvg_iframe"),t.body.appendChild(r),r}function a(t,e){var r=(e.contentWindow||e.contentDocument).document;return r.write(t),r.close(),r.getElementsByTagName("svg")[0]}function u(t){for(var e=parseFloat(t[1]),r=parseFloat(t[2]),n=[],s=3,o=t.length;o>s;)"c"===t[s]?(n.push([parseFloat(t[s+1]),parseFloat(t[s+2]),parseFloat(t[s+3]),parseFloat(t[s+4]),parseFloat(t[s+5]),parseFloat(t[s+6])]),s+=7):"l"===t[s]?(n.push([parseFloat(t[s+1]),parseFloat(t[s+2])]),s+=3):s+=1;return[e,r,n]}var c;if(e===c||e===c)throw new Error("addSVG needs values for 'x' and 'y'");var l=i(document),f=a(t,l),d=[1,1],h=parseFloat(f.getAttribute("width")),p=parseFloat(f.getAttribute("height"));h&&p&&(n&&s?d=[n/h,s/p]:n?d=[n/h,n/h]:s&&(d=[s/p,s/p]));var m,w,y,g,v=f.childNodes;for(m=0,w=v.length;w>m;m++)y=v[m],y.tagName&&"PATH"===y.tagName.toUpperCase()&&(g=u(y.getAttribute("d").split(" ")),g[0]=g[0]*d[0]+e,g[1]=g[1]*d[1]+r,this.lines.call(this,g[2],g[0],g[1],d));return this}}(r.API),function(t){"use strict";var e=t.getCharWidthsArray=function(t,e){e||(e={});var r,n,s,o=e.widths?e.widths:this.internal.getFont().metadata.Unicode.widths,i=o.fof?o.fof:1,a=e.kerning?e.kerning:this.internal.getFont().metadata.Unicode.kerning,u=a.fof?a.fof:1,c=0,l=o[0]||i,f=[];for(r=0,n=t.length;n>r;r++)s=t.charCodeAt(r),f.push((o[s]||l)/i+(a[s]&&a[s][c]||0)/u),c=s;return f},r=function(t){for(var e=t.length,r=0;e;)e--,r+=t[e];return r},n=t.getStringUnitWidth=function(t,n){return r(e.call(this,t,n))},s=function(t,e,r,n){for(var s=[],o=0,i=t.length,a=0;o!==i&&a+e[o]<r;)a+=e[o],o++;s.push(t.slice(0,o));var u=o;for(a=0;o!==i;)a+e[o]>n&&(s.push(t.slice(u,o)),a=0,u=o),a+=e[o],o++;return u!==o&&s.push(t.slice(u,o)),s},o=function(t,o,i){i||(i={});var a,u,c,l,f,d,h=[],p=[h],m=i.textIndent||0,w=0,y=0,g=t.split(" "),v=e(" ",i)[0];if(d=-1===i.lineIndent?g[0].length+2:i.lineIndent||0){var b=Array(d).join(" "),q=[];g.map(function(t){t=t.split(/\s*\n/),t.length>1?q=q.concat(t.map(function(t,e){return(e&&t.length?"\n":"")+t})):q.push(t[0])}),g=q,d=n(b,i)}for(c=0,l=g.length;l>c;c++){var x=0;if(a=g[c],d&&"\n"==a[0]&&(a=a.substr(1),x=1),u=e(a,i),y=r(u),m+w+y>o||x){if(y>o){for(f=s(a,u,o-(m+w),o),h.push(f.shift()),h=[f.pop()];f.length;)p.push([f.shift()]);y=r(u.slice(a.length-h[0].length))}else h=[a];p.push(h),m=y+d,w=v}else h.push(a),m+=w+y,w=v}if(d)var k=function(t,e){return(e?b:"")+t.join(" ")};else var k=function(t){return t.join(" ")};return p.map(k)};t.splitTextToSize=function(t,e,r){r||(r={});var n,s=r.fontSize||this.internal.getFontSize(),i=function(t){var e={0:1},r={};if(t.widths&&t.kerning)return{widths:t.widths,kerning:t.kerning};var n=this.internal.getFont(t.fontName,t.fontStyle),s="Unicode";return n.metadata[s]?{widths:n.metadata[s].widths||e,kerning:n.metadata[s].kerning||r}:{widths:e,kerning:r}}.call(this,r);n=Array.isArray(t)?t:t.split(/\r?\n/);var a=1*this.internal.scaleFactor*e/s;i.textIndent=r.textIndent?1*r.textIndent*this.internal.scaleFactor/s:0,i.lineIndent=r.lineIndent;var u,c,l=[];for(u=0,c=n.length;c>u;u++)l=l.concat(o(n[u],a,i));return l}}(r.API),function(t){"use strict";var e=function(t){for(var e="0123456789abcdef",r="klmnopqrstuvwxyz",n={},s=0;s<r.length;s++)n[r[s]]=e[s];var o,i,a,u,c,l={},f=1,d=l,h=[],p="",m="",w=t.length-1;for(s=1;s!=w;)c=t[s],s+=1,"'"==c?i?(u=i.join(""),i=o):i=[]:i?i.push(c):"{"==c?(h.push([d,u]),d={},u=o):"}"==c?(a=h.pop(),a[0][a[1]]=d,u=o,d=a[0]):"-"==c?f=-1:u===o?n.hasOwnProperty(c)?(p+=n[c],u=parseInt(p,16)*f,f=1,p=""):p+=c:n.hasOwnProperty(c)?(m+=n[c],d[u]=parseInt(m,16)*f,f=1,u=o,m=""):m+=c;return l},r={codePages:["WinAnsiEncoding"],WinAnsiEncoding:e("{19m8n201n9q201o9r201s9l201t9m201u8m201w9n201x9o201y8o202k8q202l8r202m9p202q8p20aw8k203k8t203t8v203u9v2cq8s212m9t15m8w15n9w2dw9s16k8u16l9u17s9z17x8y17y9y}")},n={Unicode:{Courier:r,"Courier-Bold":r,"Courier-BoldOblique":r,"Courier-Oblique":r,Helvetica:r,"Helvetica-Bold":r,"Helvetica-BoldOblique":r,"Helvetica-Oblique":r,"Times-Roman":r,"Times-Bold":r,"Times-BoldItalic":r,"Times-Italic":r}},s={Unicode:{"Courier-Oblique":e("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Times-BoldItalic":e("{'widths'{k3o2q4ycx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2r202m2n2n3m2o3m2p5n202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5n4l4m4m4m4n4m4o4s4p4m4q4m4r4s4s4y4t2r4u3m4v4m4w3x4x5t4y4s4z4s5k3x5l4s5m4m5n3r5o3x5p4s5q4m5r5t5s4m5t3x5u3x5v2l5w1w5x2l5y3t5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q2l6r3m6s3r6t1w6u1w6v3m6w1w6x4y6y3r6z3m7k3m7l3m7m2r7n2r7o1w7p3r7q2w7r4m7s3m7t2w7u2r7v2n7w1q7x2n7y3t202l3mcl4mal2ram3man3mao3map3mar3mas2lat4uau1uav3maw3way4uaz2lbk2sbl3t'fof'6obo2lbp3tbq3mbr1tbs2lbu1ybv3mbz3mck4m202k3mcm4mcn4mco4mcp4mcq5ycr4mcs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz2w203k6o212m6o2dw2l2cq2l3t3m3u2l17s3x19m3m}'kerning'{cl{4qu5kt5qt5rs17ss5ts}201s{201ss}201t{cks4lscmscnscoscpscls2wu2yu201ts}201x{2wu2yu}2k{201ts}2w{4qx5kx5ou5qx5rs17su5tu}2x{17su5tu5ou}2y{4qx5kx5ou5qx5rs17ss5ts}'fof'-6ofn{17sw5tw5ou5qw5rs}7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qs}3v{17su5tu5os5qs}7p{17su5tu}ck{4qu5kt5qt5rs17ss5ts}4l{4qu5kt5qt5rs17ss5ts}cm{4qu5kt5qt5rs17ss5ts}cn{4qu5kt5qt5rs17ss5ts}co{4qu5kt5qt5rs17ss5ts}cp{4qu5kt5qt5rs17ss5ts}6l{4qu5ou5qw5rt17su5tu}5q{ckuclucmucnucoucpu4lu}5r{ckuclucmucnucoucpu4lu}7q{cksclscmscnscoscps4ls}6p{4qu5ou5qw5rt17sw5tw}ek{4qu5ou5qw5rt17su5tu}el{4qu5ou5qw5rt17su5tu}em{4qu5ou5qw5rt17su5tu}en{4qu5ou5qw5rt17su5tu}eo{4qu5ou5qw5rt17su5tu}ep{4qu5ou5qw5rt17su5tu}es{17ss5ts5qs4qu}et{4qu5ou5qw5rt17sw5tw}eu{4qu5ou5qw5rt17ss5ts}ev{17ss5ts5qs4qu}6z{17sw5tw5ou5qw5rs}fm{17sw5tw5ou5qw5rs}7n{201ts}fo{17sw5tw5ou5qw5rs}fp{17sw5tw5ou5qw5rs}fq{17sw5tw5ou5qw5rs}7r{cksclscmscnscoscps4ls}fs{17sw5tw5ou5qw5rs}ft{17su5tu}fu{17su5tu}fv{17su5tu}fw{17su5tu}fz{cksclscmscnscoscps4ls}}}"),"Helvetica-Bold":e("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),Courier:e("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Courier-BoldOblique":e("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Times-Bold":e("{'widths'{k3q2q5ncx2r201n3m201o6o201s2l201t2l201u2l201w3m201x3m201y3m2k1t2l2l202m2n2n3m2o3m2p6o202q6o2r1w2s2l2t2l2u3m2v3t2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w3t3x3t3y3t3z3m4k5x4l4s4m4m4n4s4o4s4p4m4q3x4r4y4s4y4t2r4u3m4v4y4w4m4x5y4y4s4z4y5k3x5l4y5m4s5n3r5o4m5p4s5q4s5r6o5s4s5t4s5u4m5v2l5w1w5x2l5y3u5z3m6k2l6l3m6m3r6n2w6o3r6p2w6q2l6r3m6s3r6t1w6u2l6v3r6w1w6x5n6y3r6z3m7k3r7l3r7m2w7n2r7o2l7p3r7q3m7r4s7s3m7t3m7u2w7v2r7w1q7x2r7y3o202l3mcl4sal2lam3man3mao3map3mar3mas2lat4uau1yav3maw3tay4uaz2lbk2sbl3t'fof'6obo2lbp3rbr1tbs2lbu2lbv3mbz3mck4s202k3mcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw2r2m3rcy2rcz2rdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3rek3mel3mem3men3meo3mep3meq4ser2wes2wet2weu2wev2wew1wex1wey1wez1wfl3rfm3mfn3mfo3mfp3mfq3mfr3tfs3mft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3m3u2l17s4s19m3m}'kerning'{cl{4qt5ks5ot5qy5rw17sv5tv}201t{cks4lscmscnscoscpscls4wv}2k{201ts}2w{4qu5ku7mu5os5qx5ru17su5tu}2x{17su5tu5ou5qs}2y{4qv5kv7mu5ot5qz5ru17su5tu}'fof'-6o7t{cksclscmscnscoscps4ls}3u{17su5tu5os5qu}3v{17su5tu5os5qu}fu{17su5tu5ou5qu}7p{17su5tu5ou5qu}ck{4qt5ks5ot5qy5rw17sv5tv}4l{4qt5ks5ot5qy5rw17sv5tv}cm{4qt5ks5ot5qy5rw17sv5tv}cn{4qt5ks5ot5qy5rw17sv5tv}co{4qt5ks5ot5qy5rw17sv5tv}cp{4qt5ks5ot5qy5rw17sv5tv}6l{17st5tt5ou5qu}17s{ckuclucmucnucoucpu4lu4wu}5o{ckuclucmucnucoucpu4lu4wu}5q{ckzclzcmzcnzcozcpz4lz4wu}5r{ckxclxcmxcnxcoxcpx4lx4wu}5t{ckuclucmucnucoucpu4lu4wu}7q{ckuclucmucnucoucpu4lu}6p{17sw5tw5ou5qu}ek{17st5tt5qu}el{17st5tt5ou5qu}em{17st5tt5qu}en{17st5tt5qu}eo{17st5tt5qu}ep{17st5tt5ou5qu}es{17ss5ts5qu}et{17sw5tw5ou5qu}eu{17sw5tw5ou5qu}ev{17ss5ts5qu}6z{17sw5tw5ou5qu5rs}fm{17sw5tw5ou5qu5rs}fn{17sw5tw5ou5qu5rs}fo{17sw5tw5ou5qu5rs}fp{17sw5tw5ou5qu5rs}fq{17sw5tw5ou5qu5rs}7r{cktcltcmtcntcotcpt4lt5os}fs{17sw5tw5ou5qu5rs}ft{17su5tu5ou5qu}7m{5os}fv{17su5tu5ou5qu}fw{17su5tu5ou5qu}fz{cksclscmscnscoscps4ls}}}"),Helvetica:e("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}"),"Helvetica-BoldOblique":e("{'widths'{k3s2q4scx1w201n3r201o6o201s1w201t1w201u1w201w3m201x3m201y3m2k1w2l2l202m2n2n3r2o3r2p5t202q6o2r1s2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v2l3w3u3x3u3y3u3z3x4k6l4l4s4m4s4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3r4v4s4w3x4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v2l5w1w5x2l5y3u5z3r6k2l6l3r6m3x6n3r6o3x6p3r6q2l6r3x6s3x6t1w6u1w6v3r6w1w6x5t6y3x6z3x7k3x7l3x7m2r7n3r7o2l7p3x7q3r7r4y7s3r7t3r7u3m7v2r7w1w7x2r7y3u202l3rcl4sal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3xbq3rbr1wbs2lbu2obv3rbz3xck4s202k3rcm4scn4sco4scp4scq6ocr4scs4mct4mcu4mcv4mcw1w2m2zcy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3res3ret3reu3rev3rew1wex1wey1wez1wfl3xfm3xfn3xfo3xfp3xfq3xfr3ufs3xft3xfu3xfv3xfw3xfz3r203k6o212m6o2dw2l2cq2l3t3r3u2l17s4m19m3r}'kerning'{cl{4qs5ku5ot5qs17sv5tv}201t{2ww4wy2yw}201w{2ks}201x{2ww4wy2yw}2k{201ts201xs}2w{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}2x{5ow5qs}2y{7qs4qu5kw5os5qw5rs17su5tu7tsfzs}'fof'-6o7p{17su5tu5ot}ck{4qs5ku5ot5qs17sv5tv}4l{4qs5ku5ot5qs17sv5tv}cm{4qs5ku5ot5qs17sv5tv}cn{4qs5ku5ot5qs17sv5tv}co{4qs5ku5ot5qs17sv5tv}cp{4qs5ku5ot5qs17sv5tv}6l{17st5tt5os}17s{2kwclvcmvcnvcovcpv4lv4wwckv}5o{2kucltcmtcntcotcpt4lt4wtckt}5q{2ksclscmscnscoscps4ls4wvcks}5r{2ks4ws}5t{2kwclvcmvcnvcovcpv4lv4wwckv}eo{17st5tt5os}fu{17su5tu5ot}6p{17ss5ts}ek{17st5tt5os}el{17st5tt5os}em{17st5tt5os}en{17st5tt5os}6o{201ts}ep{17st5tt5os}es{17ss5ts}et{17ss5ts}eu{17ss5ts}ev{17ss5ts}6z{17su5tu5os5qt}fm{17su5tu5os5qt}fn{17su5tu5os5qt}fo{17su5tu5os5qt}fp{17su5tu5os5qt}fq{17su5tu5os5qt}fs{17su5tu5os5qt}ft{17su5tu5ot}7m{5os}fv{17su5tu5ot}fw{17su5tu5ot}}}"),"Courier-Bold":e("{'widths'{k3w'fof'6o}'kerning'{'fof'-6o}}"),"Times-Italic":e("{'widths'{k3n2q4ycx2l201n3m201o5t201s2l201t2l201u2l201w3r201x3r201y3r2k1t2l2l202m2n2n3m2o3m2p5n202q5t2r1p2s2l2t2l2u3m2v4n2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v2l3w4n3x4n3y4n3z3m4k5w4l3x4m3x4n4m4o4s4p3x4q3x4r4s4s4s4t2l4u2w4v4m4w3r4x5n4y4m4z4s5k3x5l4s5m3x5n3m5o3r5p4s5q3x5r5n5s3x5t3r5u3r5v2r5w1w5x2r5y2u5z3m6k2l6l3m6m3m6n2w6o3m6p2w6q1w6r3m6s3m6t1w6u1w6v2w6w1w6x4s6y3m6z3m7k3m7l3m7m2r7n2r7o1w7p3m7q2w7r4m7s2w7t2w7u2r7v2s7w1v7x2s7y3q202l3mcl3xal2ram3man3mao3map3mar3mas2lat4wau1vav3maw4nay4waz2lbk2sbl4n'fof'6obo2lbp3mbq3obr1tbs2lbu1zbv3mbz3mck3x202k3mcm3xcn3xco3xcp3xcq5tcr4mcs3xct3xcu3xcv3xcw2l2m2ucy2lcz2ldl4mdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek3mel3mem3men3meo3mep3meq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr4nfs3mft3mfu3mfv3mfw3mfz2w203k6o212m6m2dw2l2cq2l3t3m3u2l17s3r19m3m}'kerning'{cl{5kt4qw}201s{201sw}201t{201tw2wy2yy6q-t}201x{2wy2yy}2k{201tw}2w{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}2x{17ss5ts5os}2y{7qs4qy7rs5ky7mw5os5qx5ru17su5tu}'fof'-6o6t{17ss5ts5qs}7t{5os}3v{5qs}7p{17su5tu5qs}ck{5kt4qw}4l{5kt4qw}cm{5kt4qw}cn{5kt4qw}co{5kt4qw}cp{5kt4qw}6l{4qs5ks5ou5qw5ru17su5tu}17s{2ks}5q{ckvclvcmvcnvcovcpv4lv}5r{ckuclucmucnucoucpu4lu}5t{2ks}6p{4qs5ks5ou5qw5ru17su5tu}ek{4qs5ks5ou5qw5ru17su5tu}el{4qs5ks5ou5qw5ru17su5tu}em{4qs5ks5ou5qw5ru17su5tu}en{4qs5ks5ou5qw5ru17su5tu}eo{4qs5ks5ou5qw5ru17su5tu}ep{4qs5ks5ou5qw5ru17su5tu}es{5ks5qs4qs}et{4qs5ks5ou5qw5ru17su5tu}eu{4qs5ks5qw5ru17su5tu}ev{5ks5qs4qs}ex{17ss5ts5qs}6z{4qv5ks5ou5qw5ru17su5tu}fm{4qv5ks5ou5qw5ru17su5tu}fn{4qv5ks5ou5qw5ru17su5tu}fo{4qv5ks5ou5qw5ru17su5tu}fp{4qv5ks5ou5qw5ru17su5tu}fq{4qv5ks5ou5qw5ru17su5tu}7r{5os}fs{4qv5ks5ou5qw5ru17su5tu}ft{17su5tu5qs}fu{17su5tu5qs}fv{17su5tu5qs}fw{17su5tu5qs}}}"),"Times-Roman":e("{'widths'{k3n2q4ycx2l201n3m201o6o201s2l201t2l201u2l201w2w201x2w201y2w2k1t2l2l202m2n2n3m2o3m2p5n202q6o2r1m2s2l2t2l2u3m2v3s2w1t2x2l2y1t2z1w3k3m3l3m3m3m3n3m3o3m3p3m3q3m3r3m3s3m203t2l203u2l3v1w3w3s3x3s3y3s3z2w4k5w4l4s4m4m4n4m4o4s4p3x4q3r4r4s4s4s4t2l4u2r4v4s4w3x4x5t4y4s4z4s5k3r5l4s5m4m5n3r5o3x5p4s5q4s5r5y5s4s5t4s5u3x5v2l5w1w5x2l5y2z5z3m6k2l6l2w6m3m6n2w6o3m6p2w6q2l6r3m6s3m6t1w6u1w6v3m6w1w6x4y6y3m6z3m7k3m7l3m7m2l7n2r7o1w7p3m7q3m7r4s7s3m7t3m7u2w7v3k7w1o7x3k7y3q202l3mcl4sal2lam3man3mao3map3mar3mas2lat4wau1vav3maw3say4waz2lbk2sbl3s'fof'6obo2lbp3mbq2xbr1tbs2lbu1zbv3mbz2wck4s202k3mcm4scn4sco4scp4scq5tcr4mcs3xct3xcu3xcv3xcw2l2m2tcy2lcz2ldl4sdm4sdn4sdo4sdp4sdq4sds4sdt4sdu4sdv4sdw4sdz3mek2wel2wem2wen2weo2wep2weq4mer2wes2wet2weu2wev2wew1wex1wey1wez1wfl3mfm3mfn3mfo3mfp3mfq3mfr3sfs3mft3mfu3mfv3mfw3mfz3m203k6o212m6m2dw2l2cq2l3t3m3u1w17s4s19m3m}'kerning'{cl{4qs5ku17sw5ou5qy5rw201ss5tw201ws}201s{201ss}201t{ckw4lwcmwcnwcowcpwclw4wu201ts}2k{201ts}2w{4qs5kw5os5qx5ru17sx5tx}2x{17sw5tw5ou5qu}2y{4qs5kw5os5qx5ru17sx5tx}'fof'-6o7t{ckuclucmucnucoucpu4lu5os5rs}3u{17su5tu5qs}3v{17su5tu5qs}7p{17sw5tw5qs}ck{4qs5ku17sw5ou5qy5rw201ss5tw201ws}4l{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cm{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cn{4qs5ku17sw5ou5qy5rw201ss5tw201ws}co{4qs5ku17sw5ou5qy5rw201ss5tw201ws}cp{4qs5ku17sw5ou5qy5rw201ss5tw201ws}6l{17su5tu5os5qw5rs}17s{2ktclvcmvcnvcovcpv4lv4wuckv}5o{ckwclwcmwcnwcowcpw4lw4wu}5q{ckyclycmycnycoycpy4ly4wu5ms}5r{cktcltcmtcntcotcpt4lt4ws}5t{2ktclvcmvcnvcovcpv4lv4wuckv}7q{cksclscmscnscoscps4ls}6p{17su5tu5qw5rs}ek{5qs5rs}el{17su5tu5os5qw5rs}em{17su5tu5os5qs5rs}en{17su5qs5rs}eo{5qs5rs}ep{17su5tu5os5qw5rs}es{5qs}et{17su5tu5qw5rs}eu{17su5tu5qs5rs}ev{5qs}6z{17sv5tv5os5qx5rs}fm{5os5qt5rs}fn{17sv5tv5os5qx5rs}fo{17sv5tv5os5qx5rs}fp{5os5qt5rs}fq{5os5qt5rs}7r{ckuclucmucnucoucpu4lu5os}fs{17sv5tv5os5qx5rs}ft{17ss5ts5qs}fu{17sw5tw5qs}fv{17sw5tw5qs}fw{17ss5ts5qs}fz{ckuclucmucnucoucpu4lu5os5rs}}}"),"Helvetica-Oblique":e("{'widths'{k3p2q4mcx1w201n3r201o6o201s1q201t1q201u1q201w2l201x2l201y2l2k1w2l1w202m2n2n3r2o3r2p5t202q6o2r1n2s2l2t2l2u2r2v3u2w1w2x2l2y1w2z1w3k3r3l3r3m3r3n3r3o3r3p3r3q3r3r3r3s3r203t2l203u2l3v1w3w3u3x3u3y3u3z3r4k6p4l4m4m4m4n4s4o4s4p4m4q3x4r4y4s4s4t1w4u3m4v4m4w3r4x5n4y4s4z4y5k4m5l4y5m4s5n4m5o3x5p4s5q4m5r5y5s4m5t4m5u3x5v1w5w1w5x1w5y2z5z3r6k2l6l3r6m3r6n3m6o3r6p3r6q1w6r3r6s3r6t1q6u1q6v3m6w1q6x5n6y3r6z3r7k3r7l3r7m2l7n3m7o1w7p3r7q3m7r4s7s3m7t3m7u3m7v2l7w1u7x2l7y3u202l3rcl4mal2lam3ran3rao3rap3rar3ras2lat4tau2pav3raw3uay4taz2lbk2sbl3u'fof'6obo2lbp3rbr1wbs2lbu2obv3rbz3xck4m202k3rcm4mcn4mco4mcp4mcq6ocr4scs4mct4mcu4mcv4mcw1w2m2ncy1wcz1wdl4sdm4ydn4ydo4ydp4ydq4yds4ydt4sdu4sdv4sdw4sdz3xek3rel3rem3ren3reo3rep3req5ter3mes3ret3reu3rev3rew1wex1wey1wez1wfl3rfm3rfn3rfo3rfp3rfq3rfr3ufs3xft3rfu3rfv3rfw3rfz3m203k6o212m6o2dw2l2cq2l3t3r3u1w17s4m19m3r}'kerning'{5q{4wv}cl{4qs5kw5ow5qs17sv5tv}201t{2wu4w1k2yu}201x{2wu4wy2yu}17s{2ktclucmucnu4otcpu4lu4wycoucku}2w{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}2x{17sy5ty5oy5qs}2y{7qs4qz5k1m17sy5ow5qx5rsfsu5ty7tufzu}'fof'-6o7p{17sv5tv5ow}ck{4qs5kw5ow5qs17sv5tv}4l{4qs5kw5ow5qs17sv5tv}cm{4qs5kw5ow5qs17sv5tv}cn{4qs5kw5ow5qs17sv5tv}co{4qs5kw5ow5qs17sv5tv}cp{4qs5kw5ow5qs17sv5tv}6l{17sy5ty5ow}do{17st5tt}4z{17st5tt}7s{fst}dm{17st5tt}dn{17st5tt}5o{ckwclwcmwcnwcowcpw4lw4wv}dp{17st5tt}dq{17st5tt}7t{5ow}ds{17st5tt}5t{2ktclucmucnu4otcpu4lu4wycoucku}fu{17sv5tv5ow}6p{17sy5ty5ow5qs}ek{17sy5ty5ow}el{17sy5ty5ow}em{17sy5ty5ow}en{5ty}eo{17sy5ty5ow}ep{17sy5ty5ow}es{17sy5ty5qs}et{17sy5ty5ow5qs}eu{17sy5ty5ow5qs}ev{17sy5ty5ow5qs}6z{17sy5ty5ow5qs}fm{17sy5ty5ow5qs}fn{17sy5ty5ow5qs}fo{17sy5ty5ow5qs}fp{17sy5ty5qs}fq{17sy5ty5ow5qs}7r{5ow}fs{17sy5ty5ow5qs}ft{17sv5tv5ow}7m{5ow}fv{17sv5tv5ow}fw{17sv5tv5ow}}}")}};t.events.push(["addFonts",function(t){var e,r,o,i,a,u="Unicode";for(r in t.fonts)t.fonts.hasOwnProperty(r)&&(e=t.fonts[r],o=s[u][e.PostScriptName],o&&(i=e.metadata[u]?e.metadata[u]:e.metadata[u]={},i.widths=o.widths,i.kerning=o.kerning),a=n[u][e.PostScriptName],a&&(i=e.metadata[u]?e.metadata[u]:e.metadata[u]={},i.encoding=a,a.codePages&&a.codePages.length&&(e.encoding=a.codePages[0])))}])}(r.API),function(t){"use strict";t.putTotalPages=function(t){for(var e=new RegExp(t,"g"),r=1;r<=this.internal.getNumberOfPages();r++)for(var n=0;n<this.internal.pages[r].length;n++)this.internal.pages[r][n]=this.internal.pages[r][n].replace(e,this.internal.getNumberOfPages());return this}}(r.API),function(t){"use strict";if(t.URL=t.URL||t.webkitURL,t.Blob&&t.URL)try{return new Blob,void 0}catch(e){}var r=t.BlobBuilder||t.WebKitBlobBuilder||t.MozBlobBuilder||function(t){var e=function(t){return Object.prototype.toString.call(t).match(/^\[object\s(.*)\]$/)[1]},r=function(){this.data=[]},n=function(t,e,r){this.data=t,this.size=t.length,this.type=e,this.encoding=r},s=r.prototype,o=n.prototype,i=t.FileReaderSync,a=function(t){this.code=this[this.name=t]},u="NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR".split(" "),c=u.length,l=t.URL||t.webkitURL||t,f=l.createObjectURL,d=l.revokeObjectURL,h=l,p=t.btoa,m=t.atob,w=t.ArrayBuffer,y=t.Uint8Array;for(n.fake=o.fake=!0;c--;)a.prototype[u[c]]=c+1;return l.createObjectURL||(h=t.URL={}),h.createObjectURL=function(t){var e,r=t.type;return null===r&&(r="application/octet-stream"),t instanceof n?(e="data:"+r,"base64"===t.encoding?e+";base64,"+t.data:"URI"===t.encoding?e+","+decodeURIComponent(t.data):p?e+";base64,"+p(t.data):e+","+encodeURIComponent(t.data)):f?f.call(l,t):void 0},h.revokeObjectURL=function(t){"data:"!==t.substring(0,5)&&d&&d.call(l,t)},s.append=function(t){var r=this.data;if(y&&(t instanceof w||t instanceof y)){for(var s="",o=new y(t),u=0,c=o.length;c>u;u++)s+=String.fromCharCode(o[u]);r.push(s)}else if("Blob"===e(t)||"File"===e(t)){if(!i)throw new a("NOT_READABLE_ERR");var l=new i;r.push(l.readAsBinaryString(t))}else t instanceof n?"base64"===t.encoding&&m?r.push(m(t.data)):"URI"===t.encoding?r.push(decodeURIComponent(t.data)):"raw"===t.encoding&&r.push(t.data):("string"!=typeof t&&(t+=""),r.push(unescape(encodeURIComponent(t))))},s.getBlob=function(t){return arguments.length||(t=null),new n(this.data.join(""),t,"raw")},s.toString=function(){return"[object BlobBuilder]"},o.slice=function(t,e,r){var s=arguments.length;return 3>s&&(r=null),new n(this.data.slice(t,s>1?e:this.data.length),r,this.encoding)
          },o.toString=function(){return"[object Blob]"},o.close=function(){this.size=this.data.length=0},r}(t);t.Blob=function(t,e){var n=e?e.type||"":"",s=new r;if(t)for(var o=0,i=t.length;i>o;o++)s.append(t[o]);return s.getBlob(n)}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content||this);var n=n||"undefined"!=typeof navigator&&navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator)||function(t){"use strict";if("undefined"==typeof navigator||!/MSIE [1-9]\./.test(navigator.userAgent)){var e=t.document,r=function(){return t.URL||t.webkitURL||t},n=e.createElementNS("http://www.w3.org/1999/xhtml","a"),s=!t.externalHost&&"download"in n,o=function(r){var n=e.createEvent("MouseEvents");n.initMouseEvent("click",!0,!1,t,0,0,0,0,0,!1,!1,!1,!1,0,null),r.dispatchEvent(n)},i=t.webkitRequestFileSystem,a=t.requestFileSystem||i||t.mozRequestFileSystem,u=function(e){(t.setImmediate||t.setTimeout)(function(){throw e},0)},c="application/octet-stream",l=0,f=[],d=function(){for(var t=f.length;t--;){var e=f[t];"string"==typeof e?r().revokeObjectURL(e):e.remove()}f.length=0},h=function(t,e,r){e=[].concat(e);for(var n=e.length;n--;){var s=t["on"+e[n]];if("function"==typeof s)try{s.call(t,r||t)}catch(o){u(o)}}},p=function(e,u){var d,p,m,w=this,y=e.type,g=!1,v=function(){var t=r().createObjectURL(e);return f.push(t),t},b=function(){h(w,"writestart progress write writeend".split(" "))},q=function(){(g||!d)&&(d=v(e)),p?p.location.href=d:window.open(d,"_blank"),w.readyState=w.DONE,b()},x=function(t){return function(){return w.readyState!==w.DONE?t.apply(this,arguments):void 0}},k={create:!0,exclusive:!1};return w.readyState=w.INIT,u||(u="download"),s?(d=v(e),n.href=d,n.download=u,o(n),w.readyState=w.DONE,b(),void 0):(t.chrome&&y&&y!==c&&(m=e.slice||e.webkitSlice,e=m.call(e,0,e.size,c),g=!0),i&&"download"!==u&&(u+=".download"),(y===c||i)&&(p=t),a?(l+=e.size,a(t.TEMPORARY,l,x(function(t){t.root.getDirectory("saved",k,x(function(t){var r=function(){t.getFile(u,k,x(function(t){t.createWriter(x(function(r){r.onwriteend=function(e){p.location.href=t.toURL(),f.push(t),w.readyState=w.DONE,h(w,"writeend",e)},r.onerror=function(){var t=r.error;t.code!==t.ABORT_ERR&&q()},"writestart progress write abort".split(" ").forEach(function(t){r["on"+t]=w["on"+t]}),r.write(e),w.abort=function(){r.abort(),w.readyState=w.DONE},w.readyState=w.WRITING}),q)}),q)};t.getFile(u,{create:!1},x(function(t){t.remove(),r()}),x(function(t){t.code===t.NOT_FOUND_ERR?r():q()}))}),q)}),q),void 0):(q(),void 0))},m=p.prototype,w=function(t,e){return new p(t,e)};return m.abort=function(){var t=this;t.readyState=t.DONE,h(t,"abort")},m.readyState=m.INIT=0,m.WRITING=1,m.DONE=2,m.error=m.onwritestart=m.onprogress=m.onwrite=m.onabort=m.onerror=m.onwriteend=null,t.addEventListener("unload",d,!1),w.unload=function(){d(),t.removeEventListener("unload",d,!1)},w}}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this.content);"undefined"!=typeof module&&null!==module?module.exports=n:"undefined"!=typeof define&&null!==define&&null!=define.amd&&define([],function(){return n}),void function(t,e){"object"==typeof module?module.exports=e():t.adler32cs=e()}(r,function(){var t="function"==typeof ArrayBuffer&&"function"==typeof Uint8Array,e=null,r=function(){if(!t)return function(){return!1};try{var r=require("buffer");"function"==typeof r.Buffer&&(e=r.Buffer)}catch(n){}return function(t){return t instanceof ArrayBuffer||null!==e&&t instanceof e}}(),n=function(){return null!==e?function(t){return new e(t,"utf8").toString("binary")}:function(t){return unescape(encodeURIComponent(t))}}(),s=65521,o=function(t,e){for(var r=65535&t,n=t>>>16,o=0,i=e.length;i>o;o++)r=(r+(255&e.charCodeAt(o)))%s,n=(n+r)%s;return(n<<16|r)>>>0},i=function(t,e){for(var r=65535&t,n=t>>>16,o=0,i=e.length;i>o;o++)r=(r+e[o])%s,n=(n+r)%s;return(n<<16|r)>>>0},a={},u=a.Adler32=function(){var e=function(t){if(!(this instanceof e))throw new TypeError("Constructor cannot called be as a function.");if(!isFinite(t=null==t?1:+t))throw new Error("First arguments needs to be a finite number.");this.checksum=t>>>0},s=e.prototype={};return s.constructor=e,e.from=function(t){return t.prototype=s,t}(function(t){if(!(this instanceof e))throw new TypeError("Constructor cannot called be as a function.");if(null==t)throw new Error("First argument needs to be a string.");this.checksum=o(1,t.toString())}),e.fromUtf8=function(t){return t.prototype=s,t}(function(t){if(!(this instanceof e))throw new TypeError("Constructor cannot called be as a function.");if(null==t)throw new Error("First argument needs to be a string.");var r=n(t.toString());this.checksum=o(1,r)}),t&&(e.fromBuffer=function(t){return t.prototype=s,t}(function(t){if(!(this instanceof e))throw new TypeError("Constructor cannot called be as a function.");if(!r(t))throw new Error("First argument needs to be ArrayBuffer.");var n=new Uint8Array(t);return this.checksum=i(1,n)})),s.update=function(t){if(null==t)throw new Error("First argument needs to be a string.");return t=t.toString(),this.checksum=o(this.checksum,t)},s.updateUtf8=function(t){if(null==t)throw new Error("First argument needs to be a string.");var e=n(t.toString());return this.checksum=o(this.checksum,e)},t&&(s.updateBuffer=function(t){if(!r(t))throw new Error("First argument needs to be ArrayBuffer.");var e=new Uint8Array(t);return this.checksum=i(this.checksum,e)}),s.clone=function(){return new u(this.checksum)},e}();return a.from=function(t){if(null==t)throw new Error("First argument needs to be a string.");return o(1,t.toString())},a.fromUtf8=function(t){if(null==t)throw new Error("First argument needs to be a string.");var e=n(t.toString());return o(1,e)},t&&(a.fromBuffer=function(t){if(!r(t))throw new Error("First argument need to be ArrayBuffer.");var e=new Uint8Array(t);return i(1,e)}),a});var s=function(){function t(){function t(t){var e,r,s,o,a,u,c=n.dyn_tree,l=n.stat_desc.static_tree,f=n.stat_desc.extra_bits,h=n.stat_desc.extra_base,p=n.stat_desc.max_length,m=0;for(o=0;i>=o;o++)t.bl_count[o]=0;for(c[2*t.heap[t.heap_max]+1]=0,e=t.heap_max+1;d>e;e++)r=t.heap[e],o=c[2*c[2*r+1]+1]+1,o>p&&(o=p,m++),c[2*r+1]=o,r>n.max_code||(t.bl_count[o]++,a=0,r>=h&&(a=f[r-h]),u=c[2*r],t.opt_len+=u*(o+a),l&&(t.static_len+=u*(l[2*r+1]+a)));if(0!==m){do{for(o=p-1;0===t.bl_count[o];)o--;t.bl_count[o]--,t.bl_count[o+1]+=2,t.bl_count[p]--,m-=2}while(m>0);for(o=p;0!==o;o--)for(r=t.bl_count[o];0!==r;)s=t.heap[--e],s>n.max_code||(c[2*s+1]!=o&&(t.opt_len+=(o-c[2*s+1])*c[2*s],c[2*s+1]=o),r--)}}function e(t,e){var r=0;do r|=1&t,t>>>=1,r<<=1;while(--e>0);return r>>>1}function r(t,r,n){var s,o,a,u=[],c=0;for(s=1;i>=s;s++)u[s]=c=c+n[s-1]<<1;for(o=0;r>=o;o++)a=t[2*o+1],0!==a&&(t[2*o]=e(u[a]++,a))}var n=this;n.build_tree=function(e){var s,o,i,a=n.dyn_tree,u=n.stat_desc.static_tree,c=n.stat_desc.elems,l=-1;for(e.heap_len=0,e.heap_max=d,s=0;c>s;s++)0!==a[2*s]?(e.heap[++e.heap_len]=l=s,e.depth[s]=0):a[2*s+1]=0;for(;e.heap_len<2;)i=e.heap[++e.heap_len]=2>l?++l:0,a[2*i]=1,e.depth[i]=0,e.opt_len--,u&&(e.static_len-=u[2*i+1]);for(n.max_code=l,s=Math.floor(e.heap_len/2);s>=1;s--)e.pqdownheap(a,s);i=c;do s=e.heap[1],e.heap[1]=e.heap[e.heap_len--],e.pqdownheap(a,1),o=e.heap[1],e.heap[--e.heap_max]=s,e.heap[--e.heap_max]=o,a[2*i]=a[2*s]+a[2*o],e.depth[i]=Math.max(e.depth[s],e.depth[o])+1,a[2*s+1]=a[2*o+1]=i,e.heap[1]=i++,e.pqdownheap(a,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],t(e),r(a,n.max_code,e.bl_count)}}function e(t,e,r,n,s){var o=this;o.static_tree=t,o.extra_bits=e,o.extra_base=r,o.elems=n,o.max_length=s}function r(t,e,r,n,s){var o=this;o.good_length=t,o.max_lazy=e,o.nice_length=r,o.max_chain=n,o.func=s}function n(t,e,r,n){var s=t[2*e],o=t[2*r];return o>s||s==o&&n[e]<=n[r]}function s(){function r(){var t;for(Ie=2*Ce,Be[Pe-1]=0,t=0;Pe-1>t;t++)Be[t]=0;We=L[Xe].max_lazy,Ke=L[Xe].good_length,Qe=L[Xe].nice_length,Ve=L[Xe].max_chain,Me=0,Fe=0,Ge=0,Le=Je=Z-1,Ne=0,Oe=0}function s(){var t;for(t=0;f>t;t++)$e[2*t]=0;for(t=0;a>t;t++)Ze[2*t]=0;for(t=0;u>t;t++)tr[2*t]=0;$e[2*h]=1,er.opt_len=er.static_len=0,ar=cr=0}function o(){rr.dyn_tree=$e,rr.stat_desc=e.static_l_desc,nr.dyn_tree=Ze,nr.stat_desc=e.static_d_desc,sr.dyn_tree=tr,sr.stat_desc=e.static_bl_desc,fr=0,dr=0,lr=8,s()}function i(t,e){var r,n,s=-1,o=t[1],i=0,a=7,u=4;for(0===o&&(a=138,u=3),t[2*(e+1)+1]=65535,r=0;e>=r;r++)n=o,o=t[2*(r+1)+1],++i<a&&n==o||(u>i?tr[2*n]+=i:0!==n?(n!=s&&tr[2*n]++,tr[2*m]++):10>=i?tr[2*w]++:tr[2*y]++,i=0,s=n,0===o?(a=138,u=3):n==o?(a=6,u=3):(a=7,u=4))}function c(){var e;for(i($e,rr.max_code),i(Ze,nr.max_code),sr.build_tree(er),e=u-1;e>=3&&0===tr[2*t.bl_order[e]+1];e--);return er.opt_len+=3*(e+1)+5+5+4,e}function d(t){er.pending_buf[er.pending++]=t}function p(t){d(255&t),d(t>>>8&255)}function O(t){d(t>>8&255),d(255&t&255)}function re(t,e){var r,n=e;dr>g-n?(r=t,fr|=r<<dr&65535,p(fr),fr=r>>>g-dr,dr+=n-g):(fr|=t<<dr&65535,dr+=n)}function ne(t,e){var r=2*t;re(65535&e[r],65535&e[r+1])}function se(t,e){var r,n,s=-1,o=t[1],i=0,a=7,u=4;for(0===o&&(a=138,u=3),r=0;e>=r;r++)if(n=o,o=t[2*(r+1)+1],!(++i<a&&n==o)){if(u>i){do ne(n,tr);while(0!==--i)}else 0!==n?(n!=s&&(ne(n,tr),i--),ne(m,tr),re(i-3,2)):10>=i?(ne(w,tr),re(i-3,3)):(ne(y,tr),re(i-11,7));i=0,s=n,0===o?(a=138,u=3):n==o?(a=6,u=3):(a=7,u=4)}}function oe(e,r,n){var s;for(re(e-257,5),re(r-1,5),re(n-4,4),s=0;n>s;s++)re(tr[2*t.bl_order[s]+1],3);se($e,e-1),se(Ze,r-1)}function ie(){16==dr?(p(fr),fr=0,dr=0):dr>=8&&(d(255&fr),fr>>>=8,dr-=8)}function ae(){re(Q<<1,3),ne(h,e.static_ltree),ie(),9>1+lr+10-dr&&(re(Q<<1,3),ne(h,e.static_ltree),ie()),lr=7}function ue(e,r){var n,s,o;if(er.pending_buf[ur+2*ar]=e>>>8&255,er.pending_buf[ur+2*ar+1]=255&e,er.pending_buf[or+ar]=255&r,ar++,0===e?$e[2*r]++:(cr++,e--,$e[2*(t._length_code[r]+l+1)]++,Ze[2*t.d_code(e)]++),0===(8191&ar)&&Xe>2){for(n=8*ar,s=Me-Fe,o=0;a>o;o++)n+=Ze[2*o]*(5+t.extra_dbits[o]);if(n>>>=3,cr<Math.floor(ar/2)&&n<Math.floor(s/2))return!0}return ar==ir-1}function ce(e,r){var n,s,o,i,a=0;if(0!==ar)do n=er.pending_buf[ur+2*a]<<8&65280|255&er.pending_buf[ur+2*a+1],s=255&er.pending_buf[or+a],a++,0===n?ne(s,e):(o=t._length_code[s],ne(o+l+1,e),i=t.extra_lbits[o],0!==i&&(s-=t.base_length[o],re(s,i)),n--,o=t.d_code(n),ne(o,r),i=t.extra_dbits[o],0!==i&&(n-=t.base_dist[o],re(n,i)));while(ar>a);ne(h,e),lr=e[2*h+1]}function le(){dr>8?p(fr):dr>0&&d(255&fr),fr=0,dr=0}function fe(t,e,r){le(),lr=8,r&&(p(e),p(~e)),er.pending_buf.set(ze.subarray(t,t+e),er.pending),er.pending+=e}function de(t,e,r){re((K<<1)+(r?1:0),3),fe(t,e,!0)}function he(t,r,n){var o,i,a=0;Xe>0?(rr.build_tree(er),nr.build_tree(er),a=c(),o=er.opt_len+3+7>>>3,i=er.static_len+3+7>>>3,o>=i&&(o=i)):o=i=r+5,o>=r+4&&-1!=t?de(t,r,n):i==o?(re((Q<<1)+(n?1:0),3),ce(e.static_ltree,e.static_dtree)):(re(($<<1)+(n?1:0),3),oe(rr.max_code+1,nr.max_code+1,a+1),ce($e,Ze)),s(),n&&le()}function pe(t){he(Fe>=0?Fe:-1,Me-Fe,t),Fe=Me,qe.flush_pending()}function me(){var t,e,r,n;do{if(n=Ie-Ge-Me,0===n&&0===Me&&0===Ge)n=Ce;else if(-1==n)n--;else if(Me>=Ce+Ce-ee){ze.set(ze.subarray(Ce,Ce+Ce),0),He-=Ce,Me-=Ce,Fe-=Ce,t=Pe,r=t;do e=65535&Be[--r],Be[r]=e>=Ce?e-Ce:0;while(0!==--t);t=Ce,r=t;do e=65535&Te[--r],Te[r]=e>=Ce?e-Ce:0;while(0!==--t);n+=Ce}if(0===qe.avail_in)return;t=qe.read_buf(ze,Me+Ge,n),Ge+=t,Ge>=Z&&(Oe=255&ze[Me],Oe=(Oe<<Ue^255&ze[Me+1])&De)}while(ee>Ge&&0!==qe.avail_in)}function we(t){var e,r=65535;for(r>ke-5&&(r=ke-5);;){if(1>=Ge){if(me(),0===Ge&&t==k)return N;if(0===Ge)break}if(Me+=Ge,Ge=0,e=Fe+r,(0===Me||Me>=e)&&(Ge=Me-e,Me=e,pe(!1),0===qe.avail_out))return N;if(Me-Fe>=Ce-ee&&(pe(!1),0===qe.avail_out))return N}return pe(t==C),0===qe.avail_out?t==C?H:N:t==C?G:M}function ye(t){var e,r,n=Ve,s=Me,o=Je,i=Me>Ce-ee?Me-(Ce-ee):0,a=Qe,u=Ee,c=Me+te,l=ze[s+o-1],f=ze[s+o];Je>=Ke&&(n>>=2),a>Ge&&(a=Ge);do if(e=t,ze[e+o]==f&&ze[e+o-1]==l&&ze[e]==ze[s]&&ze[++e]==ze[s+1]){s+=2,e++;do;while(ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&ze[++s]==ze[++e]&&c>s);if(r=te-(c-s),s=c-te,r>o){if(He=t,o=r,r>=a)break;l=ze[s+o-1],f=ze[s+o]}}while((t=65535&Te[t&u])>i&&0!==--n);return Ge>=o?o:Ge}function ge(t){for(var e,r=0;;){if(ee>Ge){if(me(),ee>Ge&&t==k)return N;if(0===Ge)break}if(Ge>=Z&&(Oe=(Oe<<Ue^255&ze[Me+(Z-1)])&De,r=65535&Be[Oe],Te[Me&Ee]=Be[Oe],Be[Oe]=Me),0!==r&&Ce-ee>=(Me-r&65535)&&Ye!=q&&(Le=ye(r)),Le>=Z)if(e=ue(Me-He,Le-Z),Ge-=Le,We>=Le&&Ge>=Z){Le--;do Me++,Oe=(Oe<<Ue^255&ze[Me+(Z-1)])&De,r=65535&Be[Oe],Te[Me&Ee]=Be[Oe],Be[Oe]=Me;while(0!==--Le);Me++}else Me+=Le,Le=0,Oe=255&ze[Me],Oe=(Oe<<Ue^255&ze[Me+1])&De;else e=ue(0,255&ze[Me]),Ge--,Me++;if(e&&(pe(!1),0===qe.avail_out))return N}return pe(t==C),0===qe.avail_out?t==C?H:N:t==C?G:M}function ve(t){for(var e,r,n=0;;){if(ee>Ge){if(me(),ee>Ge&&t==k)return N;if(0===Ge)break}if(Ge>=Z&&(Oe=(Oe<<Ue^255&ze[Me+(Z-1)])&De,n=65535&Be[Oe],Te[Me&Ee]=Be[Oe],Be[Oe]=Me),Je=Le,je=He,Le=Z-1,0!==n&&We>Je&&Ce-ee>=(Me-n&65535)&&(Ye!=q&&(Le=ye(n)),5>=Le&&(Ye==b||Le==Z&&Me-He>4096)&&(Le=Z-1)),Je>=Z&&Je>=Le){r=Me+Ge-Z,e=ue(Me-1-je,Je-Z),Ge-=Je-1,Je-=2;do++Me<=r&&(Oe=(Oe<<Ue^255&ze[Me+(Z-1)])&De,n=65535&Be[Oe],Te[Me&Ee]=Be[Oe],Be[Oe]=Me);while(0!==--Je);if(Ne=0,Le=Z-1,Me++,e&&(pe(!1),0===qe.avail_out))return N}else if(0!==Ne){if(e=ue(0,255&ze[Me-1]),e&&pe(!1),Me++,Ge--,0===qe.avail_out)return N}else Ne=1,Me++,Ge--}return 0!==Ne&&(e=ue(0,255&ze[Me-1]),Ne=0),pe(t==C),0===qe.avail_out?t==C?H:N:t==C?G:M}function be(t){return t.total_in=t.total_out=0,t.msg=null,er.pending=0,er.pending_out=0,xe=W,Ae=k,o(),r(),S}var qe,xe,ke,_e,Ae,Ce,Se,Ee,ze,Ie,Te,Be,Oe,Pe,Re,De,Ue,Fe,Le,je,Ne,Me,He,Ge,Je,Ve,We,Xe,Ye,Ke,Qe,$e,Ze,tr,er=this,rr=new t,nr=new t,sr=new t;er.depth=[];var or,ir,ar,ur,cr,lr,fr,dr;er.bl_count=[],er.heap=[],$e=[],Ze=[],tr=[],er.pqdownheap=function(t,e){for(var r=er.heap,s=r[e],o=e<<1;o<=er.heap_len&&(o<er.heap_len&&n(t,r[o+1],r[o],er.depth)&&o++,!n(t,s,r[o],er.depth));)r[e]=r[o],e=o,o<<=1;r[e]=s},er.deflateInit=function(t,e,r,n,s,o){return n||(n=Y),s||(s=R),o||(o=x),t.msg=null,e==v&&(e=6),1>s||s>P||n!=Y||9>r||r>15||0>e||e>9||0>o||o>q?I:(t.dstate=er,Se=r,Ce=1<<Se,Ee=Ce-1,Re=s+7,Pe=1<<Re,De=Pe-1,Ue=Math.floor((Re+Z-1)/Z),ze=new Uint8Array(2*Ce),Te=[],Be=[],ir=1<<s+6,er.pending_buf=new Uint8Array(4*ir),ke=4*ir,ur=Math.floor(ir/2),or=3*ir,Xe=e,Ye=o,_e=255&n,be(t))},er.deflateEnd=function(){return xe!=V&&xe!=W&&xe!=X?I:(er.pending_buf=null,Be=null,Te=null,ze=null,er.dstate=null,xe==W?T:S)},er.deflateParams=function(t,e,r){var n=S;return e==v&&(e=6),0>e||e>9||0>r||r>q?I:(L[Xe].func!=L[e].func&&0!==t.total_in&&(n=t.deflate(_)),Xe!=e&&(Xe=e,We=L[Xe].max_lazy,Ke=L[Xe].good_length,Qe=L[Xe].nice_length,Ve=L[Xe].max_chain),Ye=r,n)},er.deflateSetDictionary=function(t,e,r){var n,s=r,o=0;if(!e||xe!=V)return I;if(Z>s)return S;for(s>Ce-ee&&(s=Ce-ee,o=r-s),ze.set(e.subarray(o,o+s),0),Me=s,Fe=s,Oe=255&ze[0],Oe=(Oe<<Ue^255&ze[1])&De,n=0;s-Z>=n;n++)Oe=(Oe<<Ue^255&ze[n+(Z-1)])&De,Te[n&Ee]=Be[Oe],Be[Oe]=n;return S},er.deflate=function(t,e){var r,n,s,o,i;if(e>C||0>e)return I;if(!t.next_out||!t.next_in&&0!==t.avail_in||xe==X&&e!=C)return t.msg=j[z-I],I;if(0===t.avail_out)return t.msg=j[z-B],B;if(qe=t,o=Ae,Ae=e,xe==V&&(n=Y+(Se-8<<4)<<8,s=(Xe-1&255)>>1,s>3&&(s=3),n|=s<<6,0!==Me&&(n|=J),n+=31-n%31,xe=W,O(n)),0!==er.pending){if(qe.flush_pending(),0===qe.avail_out)return Ae=-1,S}else if(0===qe.avail_in&&o>=e&&e!=C)return qe.msg=j[z-B],B;if(xe==X&&0!==qe.avail_in)return t.msg=j[z-B],B;if(0!==qe.avail_in||0!==Ge||e!=k&&xe!=X){switch(i=-1,L[Xe].func){case D:i=we(e);break;case U:i=ge(e);break;case F:i=ve(e)}if((i==H||i==G)&&(xe=X),i==N||i==H)return 0===qe.avail_out&&(Ae=-1),S;if(i==M){if(e==_)ae();else if(de(0,0,!1),e==A)for(r=0;Pe>r;r++)Be[r]=0;if(qe.flush_pending(),0===qe.avail_out)return Ae=-1,S}}return e!=C?S:E}}function o(){var t=this;t.next_in_index=0,t.next_out_index=0,t.avail_in=0,t.total_in=0,t.avail_out=0,t.total_out=0}var i=15,a=30,u=19,c=29,l=256,f=l+1+c,d=2*f+1,h=256,p=7,m=16,w=17,y=18,g=16,v=-1,b=1,q=2,x=0,k=0,_=1,A=3,C=4,S=0,E=1,z=2,I=-2,T=-3,B=-5,O=[0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,16,17,18,18,19,19,20,20,20,20,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29];t._length_code=[0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28],t.base_length=[0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224,0],t.base_dist=[0,1,2,3,4,6,8,12,16,24,32,48,64,96,128,192,256,384,512,768,1024,1536,2048,3072,4096,6144,8192,12288,16384,24576],t.d_code=function(t){return 256>t?O[t]:O[256+(t>>>7)]},t.extra_lbits=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t.extra_dbits=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],t.extra_blbits=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],t.bl_order=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e.static_ltree=[12,8,140,8,76,8,204,8,44,8,172,8,108,8,236,8,28,8,156,8,92,8,220,8,60,8,188,8,124,8,252,8,2,8,130,8,66,8,194,8,34,8,162,8,98,8,226,8,18,8,146,8,82,8,210,8,50,8,178,8,114,8,242,8,10,8,138,8,74,8,202,8,42,8,170,8,106,8,234,8,26,8,154,8,90,8,218,8,58,8,186,8,122,8,250,8,6,8,134,8,70,8,198,8,38,8,166,8,102,8,230,8,22,8,150,8,86,8,214,8,54,8,182,8,118,8,246,8,14,8,142,8,78,8,206,8,46,8,174,8,110,8,238,8,30,8,158,8,94,8,222,8,62,8,190,8,126,8,254,8,1,8,129,8,65,8,193,8,33,8,161,8,97,8,225,8,17,8,145,8,81,8,209,8,49,8,177,8,113,8,241,8,9,8,137,8,73,8,201,8,41,8,169,8,105,8,233,8,25,8,153,8,89,8,217,8,57,8,185,8,121,8,249,8,5,8,133,8,69,8,197,8,37,8,165,8,101,8,229,8,21,8,149,8,85,8,213,8,53,8,181,8,117,8,245,8,13,8,141,8,77,8,205,8,45,8,173,8,109,8,237,8,29,8,157,8,93,8,221,8,61,8,189,8,125,8,253,8,19,9,275,9,147,9,403,9,83,9,339,9,211,9,467,9,51,9,307,9,179,9,435,9,115,9,371,9,243,9,499,9,11,9,267,9,139,9,395,9,75,9,331,9,203,9,459,9,43,9,299,9,171,9,427,9,107,9,363,9,235,9,491,9,27,9,283,9,155,9,411,9,91,9,347,9,219,9,475,9,59,9,315,9,187,9,443,9,123,9,379,9,251,9,507,9,7,9,263,9,135,9,391,9,71,9,327,9,199,9,455,9,39,9,295,9,167,9,423,9,103,9,359,9,231,9,487,9,23,9,279,9,151,9,407,9,87,9,343,9,215,9,471,9,55,9,311,9,183,9,439,9,119,9,375,9,247,9,503,9,15,9,271,9,143,9,399,9,79,9,335,9,207,9,463,9,47,9,303,9,175,9,431,9,111,9,367,9,239,9,495,9,31,9,287,9,159,9,415,9,95,9,351,9,223,9,479,9,63,9,319,9,191,9,447,9,127,9,383,9,255,9,511,9,0,7,64,7,32,7,96,7,16,7,80,7,48,7,112,7,8,7,72,7,40,7,104,7,24,7,88,7,56,7,120,7,4,7,68,7,36,7,100,7,20,7,84,7,52,7,116,7,3,8,131,8,67,8,195,8,35,8,163,8,99,8,227,8],e.static_dtree=[0,5,16,5,8,5,24,5,4,5,20,5,12,5,28,5,2,5,18,5,10,5,26,5,6,5,22,5,14,5,30,5,1,5,17,5,9,5,25,5,5,5,21,5,13,5,29,5,3,5,19,5,11,5,27,5,7,5,23,5],e.static_l_desc=new e(e.static_ltree,t.extra_lbits,l+1,f,i),e.static_d_desc=new e(e.static_dtree,t.extra_dbits,0,a,i),e.static_bl_desc=new e(null,t.extra_blbits,0,u,p);var P=9,R=8,D=0,U=1,F=2,L=[new r(0,0,0,0,D),new r(4,4,8,4,U),new r(4,5,16,8,U),new r(4,6,32,32,U),new r(4,4,16,16,F),new r(8,16,32,32,F),new r(8,16,128,128,F),new r(8,32,128,256,F),new r(32,128,258,1024,F),new r(32,258,258,4096,F)],j=["need dictionary","stream end","","","stream error","data error","","buffer error","",""],N=0,M=1,H=2,G=3,J=32,V=42,W=113,X=666,Y=8,K=0,Q=1,$=2,Z=3,te=258,ee=te+Z+1;return o.prototype={deflateInit:function(t,e){var r=this;return r.dstate=new s,e||(e=i),r.dstate.deflateInit(r,t,e)},deflate:function(t){var e=this;return e.dstate?e.dstate.deflate(e,t):I},deflateEnd:function(){var t=this;if(!t.dstate)return I;var e=t.dstate.deflateEnd();return t.dstate=null,e},deflateParams:function(t,e){var r=this;return r.dstate?r.dstate.deflateParams(r,t,e):I},deflateSetDictionary:function(t,e){var r=this;return r.dstate?r.dstate.deflateSetDictionary(r,t,e):I},read_buf:function(t,e,r){var n=this,s=n.avail_in;return s>r&&(s=r),0===s?0:(n.avail_in-=s,t.set(n.next_in.subarray(n.next_in_index,n.next_in_index+s),e),n.next_in_index+=s,n.total_in+=s,s)},flush_pending:function(){var t=this,e=t.dstate.pending;e>t.avail_out&&(e=t.avail_out),0!==e&&(t.next_out.set(t.dstate.pending_buf.subarray(t.dstate.pending_out,t.dstate.pending_out+e),t.next_out_index),t.next_out_index+=e,t.dstate.pending_out+=e,t.total_out+=e,t.avail_out-=e,t.dstate.pending-=e,0===t.dstate.pending&&(t.dstate.pending_out=0))}},function(t){var e=this,r=new o,n=512,s=k,i=new Uint8Array(n);"undefined"==typeof t&&(t=v),r.deflateInit(t),r.next_out=i,e.append=function(t,e){var o,a,u=[],c=0,l=0,f=0;if(t.length){r.next_in_index=0,r.next_in=t,r.avail_in=t.length;do{if(r.next_out_index=0,r.avail_out=n,o=r.deflate(s),o!=S)throw"deflating: "+r.msg;r.next_out_index&&(r.next_out_index==n?u.push(new Uint8Array(i)):u.push(new Uint8Array(i.subarray(0,r.next_out_index)))),f+=r.next_out_index,e&&r.next_in_index>0&&r.next_in_index!=c&&(e(r.next_in_index),c=r.next_in_index)}while(r.avail_in>0||0===r.avail_out);return a=new Uint8Array(f),u.forEach(function(t){a.set(t,l),l+=t.length}),a}},e.flush=function(){var t,e,s=[],o=0,a=0;do{if(r.next_out_index=0,r.avail_out=n,t=r.deflate(C),t!=E&&t!=S)throw"deflating: "+r.msg;n-r.avail_out>0&&s.push(new Uint8Array(i.subarray(0,r.next_out_index))),a+=r.next_out_index}while(r.avail_in>0||0===r.avail_out);return r.deflateEnd(),e=new Uint8Array(a),s.forEach(function(t){e.set(t,o),o+=t.length}),e}}}(this);!function(t){var e;e=function(){function e(t){var e,r,n,s,o,i,a,u,c,l,f,d,h,p,m;for(this.data=t,this.pos=8,this.palette=[],this.imgData=[],this.transparency={},this.animation=null,this.text={},i=null;;){switch(e=this.readUInt32(),l=function(){var t,e;for(e=[],a=t=0;4>t;a=++t)e.push(String.fromCharCode(this.data[this.pos++]));return e}.call(this).join("")){case"IHDR":this.width=this.readUInt32(),this.height=this.readUInt32(),this.bits=this.data[this.pos++],this.colorType=this.data[this.pos++],this.compressionMethod=this.data[this.pos++],this.filterMethod=this.data[this.pos++],this.interlaceMethod=this.data[this.pos++];break;case"acTL":this.animation={numFrames:this.readUInt32(),numPlays:this.readUInt32()||1/0,frames:[]};break;case"PLTE":this.palette=this.read(e);break;case"fcTL":i&&this.animation.frames.push(i),this.pos+=4,i={width:this.readUInt32(),height:this.readUInt32(),xOffset:this.readUInt32(),yOffset:this.readUInt32()},o=this.readUInt16(),s=this.readUInt16()||100,i.delay=1e3*o/s,i.disposeOp=this.data[this.pos++],i.blendOp=this.data[this.pos++],i.data=[];break;case"IDAT":case"fdAT":for("fdAT"===l&&(this.pos+=4,e-=4),t=(null!=i?i.data:void 0)||this.imgData,a=h=0;e>=0?e>h:h>e;a=e>=0?++h:--h)t.push(this.data[this.pos++]);break;case"tRNS":switch(this.transparency={},this.colorType){case 3:if(n=this.palette.length/3,this.transparency.indexed=this.read(e),this.transparency.indexed.length>n)throw new Error("More transparent colors than palette size");if(f=n-this.transparency.indexed.length,f>0)for(a=p=0;f>=0?f>p:p>f;a=f>=0?++p:--p)this.transparency.indexed.push(255);break;case 0:this.transparency.grayscale=this.read(e)[0];break;case 2:this.transparency.rgb=this.read(e)}break;case"tEXt":d=this.read(e),u=d.indexOf(0),c=String.fromCharCode.apply(String,d.slice(0,u)),this.text[c]=String.fromCharCode.apply(String,d.slice(u+1));break;case"IEND":return i&&this.animation.frames.push(i),this.colors=function(){switch(this.colorType){case 0:case 3:case 4:return 1;case 2:case 6:return 3}}.call(this),this.hasAlphaChannel=4===(m=this.colorType)||6===m,r=this.colors+(this.hasAlphaChannel?1:0),this.pixelBitlength=this.bits*r,this.colorSpace=function(){switch(this.colors){case 1:return"DeviceGray";case 3:return"DeviceRGB"}}.call(this),this.imgData=new Uint8Array(this.imgData),void 0;default:this.pos+=e}if(this.pos+=4,this.pos>this.data.length)throw new Error("Incomplete or corrupt PNG file")}}var r,n,s,o,a,u,c,l;e.load=function(t,r,n){var s;return"function"==typeof r&&(n=r),s=new XMLHttpRequest,s.open("GET",t,!0),s.responseType="arraybuffer",s.onload=function(){var t,o;return t=new Uint8Array(s.response||s.mozResponseArrayBuffer),o=new e(t),"function"==typeof(null!=r?r.getContext:void 0)&&o.render(r),"function"==typeof n?n(o):void 0},s.send(null)},o=0,s=1,a=2,n=0,r=1,e.prototype.read=function(t){var e,r,n;for(n=[],e=r=0;t>=0?t>r:r>t;e=t>=0?++r:--r)n.push(this.data[this.pos++]);return n},e.prototype.readUInt32=function(){var t,e,r,n;return t=this.data[this.pos++]<<24,e=this.data[this.pos++]<<16,r=this.data[this.pos++]<<8,n=this.data[this.pos++],t|e|r|n},e.prototype.readUInt16=function(){var t,e;return t=this.data[this.pos++]<<8,e=this.data[this.pos++],t|e},e.prototype.decodePixels=function(t){var e,r,n,s,o,a,u,c,l,f,d,h,p,m,w,y,g,v,b,q,x,k,_;if(null==t&&(t=this.imgData),0===t.length)return new Uint8Array(0);for(t=new i(t),t=t.getBytes(),h=this.pixelBitlength/8,y=h*this.width,p=new Uint8Array(y*this.height),a=t.length,w=0,m=0,r=0;a>m;){switch(t[m++]){case 0:for(s=b=0;y>b;s=b+=1)p[r++]=t[m++];break;case 1:for(s=q=0;y>q;s=q+=1)e=t[m++],o=h>s?0:p[r-h],p[r++]=(e+o)%256;break;case 2:for(s=x=0;y>x;s=x+=1)e=t[m++],n=(s-s%h)/h,g=w&&p[(w-1)*y+n*h+s%h],p[r++]=(g+e)%256;break;case 3:for(s=k=0;y>k;s=k+=1)e=t[m++],n=(s-s%h)/h,o=h>s?0:p[r-h],g=w&&p[(w-1)*y+n*h+s%h],p[r++]=(e+Math.floor((o+g)/2))%256;break;case 4:for(s=_=0;y>_;s=_+=1)e=t[m++],n=(s-s%h)/h,o=h>s?0:p[r-h],0===w?g=v=0:(g=p[(w-1)*y+n*h+s%h],v=n&&p[(w-1)*y+(n-1)*h+s%h]),u=o+g-v,c=Math.abs(u-o),f=Math.abs(u-g),d=Math.abs(u-v),l=f>=c&&d>=c?o:d>=f?g:v,p[r++]=(e+l)%256;break;default:throw new Error("Invalid filter algorithm: "+t[m-1])}w++}return p},e.prototype.decodePalette=function(){var t,e,r,n,s,o,i,a,u,c;for(n=this.palette,i=this.transparency.indexed||[],o=new Uint8Array((i.length||0)+n.length),s=0,r=n.length,t=0,e=a=0,u=n.length;u>a;e=a+=3)o[s++]=n[e],o[s++]=n[e+1],o[s++]=n[e+2],o[s++]=null!=(c=i[t++])?c:255;return o},e.prototype.copyToImageData=function(t,e){var r,n,s,o,i,a,u,c,l,f,d;if(n=this.colors,l=null,r=this.hasAlphaChannel,this.palette.length&&(l=null!=(d=this._decodedPalette)?d:this._decodedPalette=this.decodePalette(),n=4,r=!0),s=t.data||t,c=s.length,i=l||e,o=a=0,1===n)for(;c>o;)u=l?4*e[o/4]:a,f=i[u++],s[o++]=f,s[o++]=f,s[o++]=f,s[o++]=r?i[u++]:255,a=u;else for(;c>o;)u=l?4*e[o/4]:a,s[o++]=i[u++],s[o++]=i[u++],s[o++]=i[u++],s[o++]=r?i[u++]:255,a=u},e.prototype.decode=function(){var t;return t=new Uint8Array(this.width*this.height*4),this.copyToImageData(t,this.decodePixels()),t};try{c=t.document.createElement("canvas"),l=c.getContext("2d")}catch(f){return-1}return u=function(t){var e;return l.width=t.width,l.height=t.height,l.clearRect(0,0,t.width,t.height),l.putImageData(t,0,0),e=new Image,e.src=c.toDataURL(),e},e.prototype.decodeFrames=function(t){var e,r,n,s,o,i,a,c;if(this.animation){for(a=this.animation.frames,c=[],r=o=0,i=a.length;i>o;r=++o)e=a[r],n=t.createImageData(e.width,e.height),s=this.decodePixels(new Uint8Array(e.data)),this.copyToImageData(n,s),e.imageData=n,c.push(e.image=u(n));return c}},e.prototype.renderFrame=function(t,e){var r,o,i;return o=this.animation.frames,r=o[e],i=o[e-1],0===e&&t.clearRect(0,0,this.width,this.height),(null!=i?i.disposeOp:void 0)===s?t.clearRect(i.xOffset,i.yOffset,i.width,i.height):(null!=i?i.disposeOp:void 0)===a&&t.putImageData(i.imageData,i.xOffset,i.yOffset),r.blendOp===n&&t.clearRect(r.xOffset,r.yOffset,r.width,r.height),t.drawImage(r.image,r.xOffset,r.yOffset)},e.prototype.animate=function(t){var e,r,n,s,o,i,a=this;return r=0,i=this.animation,s=i.numFrames,n=i.frames,o=i.numPlays,(e=function(){var i,u;return i=r++%s,u=n[i],a.renderFrame(t,i),s>1&&o>r/s?a.animation._timeout=setTimeout(e,u.delay):void 0})()},e.prototype.stopAnimation=function(){var t;return clearTimeout(null!=(t=this.animation)?t._timeout:void 0)},e.prototype.render=function(t){var e,r;return t._png&&t._png.stopAnimation(),t._png=this,t.width=this.width,t.height=this.height,e=t.getContext("2d"),this.animation?(this.decodeFrames(e),this.animate(e)):(r=e.createImageData(this.width,this.height),this.copyToImageData(r,this.decodePixels()),e.putImageData(r,0,0))},e}(),t.PNG=e}("undefined"!=typeof window&&window||this);var o=function(){function t(){this.pos=0,this.bufferLength=0,this.eof=!1,this.buffer=null}return t.prototype={ensureBuffer:function(t){var e=this.buffer,r=e?e.byteLength:0;if(r>t)return e;for(var n=512;t>n;)n<<=1;for(var s=new Uint8Array(n),o=0;r>o;++o)s[o]=e[o];return this.buffer=s},getByte:function(){for(var t=this.pos;this.bufferLength<=t;){if(this.eof)return null;this.readBlock()}return this.buffer[this.pos++]},getBytes:function(t){var e=this.pos;if(t){this.ensureBuffer(e+t);for(var r=e+t;!this.eof&&this.bufferLength<r;)this.readBlock();var n=this.bufferLength;r>n&&(r=n)}else{for(;!this.eof;)this.readBlock();var r=this.bufferLength}return this.pos=r,this.buffer.subarray(e,r)},lookChar:function(){for(var t=this.pos;this.bufferLength<=t;){if(this.eof)return null;this.readBlock()}return String.fromCharCode(this.buffer[this.pos])},getChar:function(){for(var t=this.pos;this.bufferLength<=t;){if(this.eof)return null;this.readBlock()}return String.fromCharCode(this.buffer[this.pos++])},makeSubStream:function(t,e,r){for(var n=t+e;this.bufferLength<=n&&!this.eof;)this.readBlock();return new Stream(this.buffer,t,e,r)},skip:function(t){t||(t=1),this.pos+=t},reset:function(){this.pos=0}},t}(),i=function(){function t(t){throw new Error(t)}function e(e){var r=0,n=e[r++],s=e[r++];(-1==n||-1==s)&&t("Invalid header in flate stream"),8!=(15&n)&&t("Unknown compression method in flate stream"),((n<<8)+s)%31!=0&&t("Bad FCHECK in flate stream"),32&s&&t("FDICT bit set in flate stream"),this.bytes=e,this.bytesPos=r,this.codeSize=0,this.codeBuf=0,o.call(this)}if("undefined"==typeof Uint32Array)return void 0;var r=new Uint32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),n=new Uint32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]),s=new Uint32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,658433,724993,727041,794625,798721,868353,876545]),i=[new Uint32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59e4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9],a=[new Uint32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];
          return e.prototype=Object.create(o.prototype),e.prototype.getBits=function(e){for(var r,n=this.codeSize,s=this.codeBuf,o=this.bytes,i=this.bytesPos;e>n;)"undefined"==typeof(r=o[i++])&&t("Bad encoding in flate stream"),s|=r<<n,n+=8;return r=s&(1<<e)-1,this.codeBuf=s>>e,this.codeSize=n-=e,this.bytesPos=i,r},e.prototype.getCode=function(e){for(var r=e[0],n=e[1],s=this.codeSize,o=this.codeBuf,i=this.bytes,a=this.bytesPos;n>s;){var u;"undefined"==typeof(u=i[a++])&&t("Bad encoding in flate stream"),o|=u<<s,s+=8}var c=r[o&(1<<n)-1],l=c>>16,f=65535&c;return(0==s||l>s||0==l)&&t("Bad encoding in flate stream"),this.codeBuf=o>>l,this.codeSize=s-l,this.bytesPos=a,f},e.prototype.generateHuffmanTable=function(t){for(var e=t.length,r=0,n=0;e>n;++n)t[n]>r&&(r=t[n]);for(var s=1<<r,o=new Uint32Array(s),i=1,a=0,u=2;r>=i;++i,a<<=1,u<<=1)for(var c=0;e>c;++c)if(t[c]==i){for(var l=0,f=a,n=0;i>n;++n)l=l<<1|1&f,f>>=1;for(var n=l;s>n;n+=u)o[n]=i<<16|c;++a}return[o,r]},e.prototype.readBlock=function(){function e(t,e,r,n,s){for(var o=t.getBits(r)+n;o-->0;)e[k++]=s}var o=this.getBits(3);if(1&o&&(this.eof=!0),o>>=1,0==o){var u,c=this.bytes,l=this.bytesPos;"undefined"==typeof(u=c[l++])&&t("Bad block header in flate stream");var f=u;"undefined"==typeof(u=c[l++])&&t("Bad block header in flate stream"),f|=u<<8,"undefined"==typeof(u=c[l++])&&t("Bad block header in flate stream");var d=u;"undefined"==typeof(u=c[l++])&&t("Bad block header in flate stream"),d|=u<<8,d!=(65535&~f)&&t("Bad uncompressed block length in flate stream"),this.codeBuf=0,this.codeSize=0;var h=this.bufferLength,p=this.ensureBuffer(h+f),m=h+f;this.bufferLength=m;for(var w=h;m>w;++w){if("undefined"==typeof(u=c[l++])){this.eof=!0;break}p[w]=u}return this.bytesPos=l,void 0}var y,g;if(1==o)y=i,g=a;else if(2==o){for(var v=this.getBits(5)+257,b=this.getBits(5)+1,q=this.getBits(4)+4,x=Array(r.length),k=0;q>k;)x[r[k++]]=this.getBits(3);for(var _=this.generateHuffmanTable(x),A=0,k=0,C=v+b,S=new Array(C);C>k;){var E=this.getCode(_);16==E?e(this,S,2,3,A):17==E?e(this,S,3,3,A=0):18==E?e(this,S,7,11,A=0):S[k++]=A=E}y=this.generateHuffmanTable(S.slice(0,v)),g=this.generateHuffmanTable(S.slice(v,C))}else t("Unknown block type in flate stream");for(var p=this.buffer,z=p?p.length:0,I=this.bufferLength;;){var T=this.getCode(y);if(256>T)I+1>=z&&(p=this.ensureBuffer(I+1),z=p.length),p[I++]=T;else{if(256==T)return this.bufferLength=I,void 0;T-=257,T=n[T];var B=T>>16;B>0&&(B=this.getBits(B));var A=(65535&T)+B;T=this.getCode(g),T=s[T],B=T>>16,B>0&&(B=this.getBits(B));var O=(65535&T)+B;I+A>=z&&(p=this.ensureBuffer(I+A),z=p.length);for(var P=0;A>P;++P,++I)p[I]=p[I-O]}}},e}();!function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";"undefined"==typeof t.btoa&&(t.btoa=function(t){var r,n,s,o,i,a,u,c,l=0,f=0,d="",h=[];if(!t)return t;do r=t.charCodeAt(l++),n=t.charCodeAt(l++),s=t.charCodeAt(l++),c=r<<16|n<<8|s,o=c>>18&63,i=c>>12&63,a=c>>6&63,u=63&c,h[f++]=e.charAt(o)+e.charAt(i)+e.charAt(a)+e.charAt(u);while(l<t.length);d=h.join("");var p=t.length%3;return(p?d.slice(0,p-3):d)+"===".slice(p||3)}),"undefined"==typeof t.atob&&(t.atob=function(t){var r,n,s,o,i,a,u,c,l=0,f=0,d="",h=[];if(!t)return t;t+="";do o=e.indexOf(t.charAt(l++)),i=e.indexOf(t.charAt(l++)),a=e.indexOf(t.charAt(l++)),u=e.indexOf(t.charAt(l++)),c=o<<18|i<<12|a<<6|u,r=c>>16&255,n=c>>8&255,s=255&c,h[f++]=64==a?String.fromCharCode(r):64==u?String.fromCharCode(r,n):String.fromCharCode(r,n,s);while(l<t.length);return d=h.join("")}),Array.prototype.map||(Array.prototype.map=function(t){if(void 0===this||null===this||"function"!=typeof t)throw new TypeError;for(var e=Object(this),r=e.length>>>0,n=new Array(r),s=arguments.length>1?arguments[1]:void 0,o=0;r>o;o++)o in e&&(n[o]=t.call(s,e[o],o,e));return n}),Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Array.prototype.forEach||(Array.prototype.forEach=function(t,e){"use strict";if(void 0===this||null===this||"function"!=typeof t)throw new TypeError;for(var r=Object(this),n=r.length>>>0,s=0;n>s;s++)s in r&&t.call(e,r[s],s,r)}),Object.keys||(Object.keys=function(){"use strict";var t=Object.prototype.hasOwnProperty,e=!{toString:null}.propertyIsEnumerable("toString"),r=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],n=r.length;return function(s){if("object"!=typeof s&&("function"!=typeof s||null===s))throw new TypeError;var o,i,a=[];for(o in s)t.call(s,o)&&a.push(o);if(e)for(i=0;n>i;i++)t.call(s,r[i])&&a.push(r[i]);return a}}()),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}),String.prototype.trimLeft||(String.prototype.trimLeft=function(){return this.replace(/^\s+/g,"")}),String.prototype.trimRight||(String.prototype.trimRight=function(){return this.replace(/\s+$/g,"")})}("undefined"!=typeof self&&self||"undefined"!=typeof window&&window||this)}({},function(){return this}());
        • jspdf.plugin.svgToPdf.js
          /*globals RGBColor, DOMParser, jsPDF*/
          /*jslint eqeq:true, vars:true*/
          /*
           * svgToPdf.js
           * 
           * Copyright 2012-2014 Florian Hülsmann <fh@cbix.de>
           * Copyright 2014 Ben Gribaudo <www.bengribaudo.com>
           * 
           * This script is free software: you can redistribute it and/or modify
           * it under the terms of the GNU Lesser General Public License as published by
           * the Free Software Foundation, either version 3 of the License, or
           * (at your option) any later version.
           * 
           * This script is distributed in the hope that it will be useful,
           * but WITHOUT ANY WARRANTY; without even the implied warranty of
           * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
           * GNU Lesser General Public License for more details.
           * 
           * You should have received a copy of the GNU Lesser General Public License
           * along with this file.  If not, see <http://www.gnu.org/licenses/>.
           * 
           */
          
          (function(jsPDFAPI, undef) {
          'use strict';
          
          var pdfSvgAttr = {
              // allowed attributes. all others are removed from the preview.
              g: ['stroke', 'fill', 'stroke-width'],
              line: ['x1', 'y1', 'x2', 'y2', 'stroke', 'stroke-width'],
              rect: ['x', 'y', 'width', 'height', 'stroke', 'fill', 'stroke-width'],
              ellipse: ['cx', 'cy', 'rx', 'ry', 'stroke', 'fill', 'stroke-width'],
              circle: ['cx', 'cy', 'r', 'stroke', 'fill', 'stroke-width'],
              text: ['x', 'y', 'font-size', 'font-family', 'text-anchor', 'font-weight', 'font-style', 'fill']
          };
          
          var attributeIsNotEmpty = function (node, attr) {
              var attVal = attr ? node.getAttribute(attr) : node;
              return attVal !== '' && attVal !== null;
          };
          
          var nodeIs = function (node, possible) {
              return possible.indexOf(node.tagName.toLowerCase()) > -1;
          };
          
          var removeAttributes = function(node, attributes) {
              var toRemove = [];
              [].forEach.call(node.attributes, function(a) {
                  if (attributeIsNotEmpty(a) && attributes.indexOf(a.name.toLowerCase()) == -1) {
                      toRemove.push(a.name);
                  }
              });
          
              toRemove.forEach(function(a) {
                  node.removeAttribute(a.name);
              });
          };
          
          var svgElementToPdf = function(element, pdf, options) {
              // pdf is a jsPDF object
              //console.log("options =", options);
              var remove = (options.removeInvalid == undef ? false : options.removeInvalid);
              var k = (options.scale == undef ? 1.0 : options.scale);
              var colorMode = null;
              [].forEach.call(element.children, function(node) {
                  //console.log("passing: ", node);
                  var hasFillColor = false;
                  var hasStrokeColor = false;
                  var fillRGB;
                  if(nodeIs(node, ['g', 'line', 'rect', 'ellipse', 'circle', 'text'])) {
                      var fillColor = node.getAttribute('fill');
                      if(attributeIsNotEmpty(fillColor)) {
                          fillRGB = new RGBColor(fillColor);
                          if(fillRGB.ok) {
                              hasFillColor = true;
                              colorMode = 'F';
                          } else {
                              colorMode = null;
                          }
                      }
                  }
                  if(nodeIs(node, ['g', 'line', 'rect', 'ellipse', 'circle'])) {
                      if(hasFillColor) {
                          pdf.setFillColor(fillRGB.r, fillRGB.g, fillRGB.b);
                      }
                      if(attributeIsNotEmpty(node, 'stroke-width')) {
                          pdf.setLineWidth(k * parseInt(node.getAttribute('stroke-width'), 10));
                      }
                      var strokeColor = node.getAttribute('stroke');
                      if(attributeIsNotEmpty(strokeColor)) {
                          var strokeRGB = new RGBColor(strokeColor);
                          if(strokeRGB.ok) {
                              hasStrokeColor = true;
                              pdf.setDrawColor(strokeRGB.r, strokeRGB.g, strokeRGB.b);
                              if(colorMode == 'F') {
                                  colorMode = 'FD';
                              } else {
                                  colorMode = null;
                              }
                          } else {
                              colorMode = null;
                          }
                      }
                  }
                  switch(node.tagName.toLowerCase()) {
                      case 'svg':
                      case 'a':
                      case 'g':
                          svgElementToPdf(node, pdf, options);
                          removeAttributes(node, pdfSvgAttr.g);
                          break;
                      case 'line':
                          pdf.line(
                              k*parseInt(node.getAttribute('x1'), 10),
                              k*parseInt(node.getAttribute('y1'), 10),
                              k*parseInt(node.getAttribute('x2'), 10),
                              k*parseInt(node.getAttribute('y2'), 10)
                          );
                          removeAttributes(node, pdfSvgAttr.line);
                          break;
                      case 'rect':
                          pdf.rect(
                              k*parseInt(node.getAttribute('x'), 10),
                              k*parseInt(node.getAttribute('y'), 10),
                              k*parseInt(node.getAttribute('width'), 10),
                              k*parseInt(node.getAttribute('height'), 10),
                              colorMode
                          );
                          removeAttributes(node, pdfSvgAttr.rect);
                          break;
                      case 'ellipse':
                          pdf.ellipse(
                              k*parseInt(node.getAttribute('cx'), 10),
                              k*parseInt(node.getAttribute('cy'), 10),
                              k*parseInt(node.getAttribute('rx'), 10),
                              k*parseInt(node.getAttribute('ry'), 10),
                              colorMode
                          );
                          removeAttributes(node, pdfSvgAttr.ellipse);
                          break;
                      case 'circle':
                          pdf.circle(
                              k*parseInt(node.getAttribute('cx'), 10),
                              k*parseInt(node.getAttribute('cy'), 10),
                              k*parseInt(node.getAttribute('r'), 10),
                              colorMode
                          );
                          removeAttributes(node, pdfSvgAttr.circle);
                          break;
                      case 'text':
                          if(node.hasAttribute('font-family')) {
                              switch((node.getAttribute('font-family') || '').toLowerCase()) {
                                  case 'serif': pdf.setFont('times'); break;
                                  case 'monospace': pdf.setFont('courier'); break;
                                  default:
                                      node.setAttribute('font-family', 'sans-serif');
                                      pdf.setFont('helvetica');
                              }
                          }
                          if(hasFillColor) {
                              pdf.setTextColor(fillRGB.r, fillRGB.g, fillRGB.b);
                          }
                          var fontType = "";
                          if(node.hasAttribute('font-weight')) {
                              if(node.getAttribute('font-weight') == "bold") {
                                  fontType = "bold";
                              } else {
                                  node.removeAttribute('font-weight');
                              }
                          }
                          if(node.hasAttribute('font-style')) {
                              if(node.getAttribute('font-style') == "italic") {
                                  fontType += "italic";
                              } else {
                                  node.removeAttribute('font-style');
                              }
                          }
                          pdf.setFontType(fontType);
                          var pdfFontSize = 16;
                          if(node.hasAttribute('font-size')) {
                              pdfFontSize = parseInt(node.getAttribute('font-size'), 10);
                          }
                          var box = node.getBBox();
                          //FIXME: use more accurate positioning!!
                          var x, y, xOffset = 0;
                          if(node.hasAttribute('text-anchor')) {
                              switch(node.getAttribute('text-anchor')) {
                                  case 'end': xOffset = box.width; break;
                                  case 'middle': xOffset = box.width / 2; break;
                                  case 'start': break;
                                  case 'default': node.setAttribute('text-anchor', 'start'); break;
                              }
                              x = parseInt(node.getAttribute('x'), 10) - xOffset;
                              y = parseInt(node.getAttribute('y'), 10);
                          }
                          //console.log("fontSize:", pdfFontSize, "text:", node.textContent);
                          pdf.setFontSize(pdfFontSize).text(
                              k * x,
                              k * y,
                              node.textContent
                          );
                          removeAttributes(node, pdfSvgAttr.text);
                          break;
                      //TODO: image
                      default:
                          if (remove) {
                              console.log("can't translate to pdf:", node);
                              node.parentNode.removeChild(node);
                          }
                  }
              });
              return pdf;
          };
          
              jsPDFAPI.addSVG = function(element, x, y, options) {
          
                  options = (options === undef ? {} : options);
                  options.x_offset = x;
                  options.y_offset = y;
          
                  if (typeof element === 'string') {
                      element = new DOMParser().parseFromString(element, 'text/xml').documentElement;
                  }
                  svgElementToPdf(element, this, options);
                  return this;
              };
          }(jsPDF.API));
          
        • underscore-min.js
          //     Underscore.js 1.6.0
          //     http://underscorejs.org
          //     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
          //     Underscore may be freely distributed under the MIT license.
          (function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:j.now(),a=null,i=n.apply(e,u),e=u=null};return function(){var l=j.now();o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this);
          //# sourceMappingURL=underscore-min.map
      • locale
        • README.txt
          This directory holds JSON files that translate the UI strings in SVG-edit.
          Initial translations were done by Narendra Sisodiya putting the English
          strings through the Google Translation API. Humans will need to take these
          automated translations and ensure they make sense.
          
          See AUTHORS for the translations credits.
          
          Languages Already Translated By Humans:
            * lang.cs.js
            * lang.de.js
            * lang.en.js
            * lang.es.js
            * lang.fr.js
            * lang.ja.js
            * lang.nl.js
            * lang.pl.js
            * lang.ro.js
            * lang.sk.js
          
        • lang.af.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "af",
          	dir : "ltr",
          	common: {
          		"ok": "Spaar",
          		"cancel": "Annuleer",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klik om te verander vul kleur, verskuiwing klik om &#39;n beroerte kleur verander",
          		"zoom_level": "Change zoom vlak",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Verandering vul kleur",
          		"stroke_color": "Verandering beroerte kleur",
          		"stroke_style": "Verandering beroerte dash styl",
          		"stroke_width": "Verandering beroerte breedte",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Verandering rotasie-hoek",
          		"blur": "Change gaussian blur value",
          		"opacity": "Verander geselekteerde item opaciteit",
          		"circle_cx": "Verandering sirkel se cx koördineer",
          		"circle_cy": "Verandering sirkel se cy koördineer",
          		"circle_r": "Verandering sirkel se radius",
          		"ellipse_cx": "Verandering ellips se cx koördineer",
          		"ellipse_cy": "Verander ellips se cy koördineer",
          		"ellipse_rx": "Verandering ellips se x radius",
          		"ellipse_ry": "Verander ellips se j radius",
          		"line_x1": "Verandering lyn se vertrek x koördinaat",
          		"line_x2": "Verandering lyn se eindig x koördinaat",
          		"line_y1": "Verandering lyn se vertrek y koördinaat",
          		"line_y2": "Verandering lyn se eindig y koördinaat",
          		"rect_height": "Verandering reghoek hoogte",
          		"rect_width": "Verandering reghoek breedte",
          		"corner_radius": "Verandering Rechthoek Corner Radius",
          		"image_width": "Verander prent breedte",
          		"image_height": "Verandering prent hoogte",
          		"image_url": "URL verander",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Verander teks inhoud",
          		"font_family": "Lettertipe verander Familie",
          		"font_size": "Verandering Lettertipe Grootte",
          		"bold": "Vetgedrukte teks",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Verander agtergrondkleur / opaciteit",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Pas na inhoud",
          		"fit_to_all": "Passing tot al inhoud",
          		"fit_to_canvas": "Passing tot doek",
          		"fit_to_layer_content": "Passing tot laag inhoud",
          		"fit_to_sel": "Passing tot seleksie",
          		"align_relative_to": "Align in verhouding tot ...",
          		"relativeTo": "relatief tot:",
          		"bladsy": "bladsy",
          		"largest_object": "grootste voorwerp",
          		"selected_objects": "verkose voorwerpe",
          		"smallest_object": "kleinste voorwerp",
          		"new_doc": "Nuwe Beeld",
          		"open_doc": "Open Beeld",
          		"export_img": "Export",
          		"save_doc": "Slaan Beeld",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Rig Middel",
          		"align_left": "Links Regterkant",
          		"align_middle": "Align Midde",
          		"align_right": "Lijn regs uit",
          		"align_top": "Align Top",
          		"mode_select": "Select Gereedschap",
          		"mode_fhpath": "Potlood tool",
          		"mode_line": "Lyn Gereedskap",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-hand Rectangle",
          		"mode_ellipse": "Ellips",
          		"mode_circle": "Sirkel",
          		"mode_fhellipse": "Gratis-Hand Ellips",
          		"mode_path": "Poli Gereedskap",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Gereedskap",
          		"mode_image": "Image Gereedskap",
          		"mode_zoom": "Klik op die Gereedskap",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Boontoe",
          		"redo": "Oordoen",
          		"tool_source": "Wysig Bron",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Groep Elemente",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elemente",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Skuif na Bottom",
          		"move_top": "Skuif na bo",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Spaar",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Verwyder Laag",
          		"move_down": "Beweeg afbreek Down",
          		"new": "Nuwe Layer",
          		"rename": "Rename Layer",
          		"move_up": "Beweeg afbreek Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Doek Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Kies gedefinieerde:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ar.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ar",
          	dir : "ltr",
          	common: {
          		"ok": "حفظ",
          		"cancel": "إلغاء",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "انقر لتغيير لون التعبئة ، تحولا مزدوجا فوق لتغيير لون السكتة الدماغية",
          		"zoom_level": "تغيير مستوى التكبير",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "تغير لون التعبئة",
          		"stroke_color": "تغير لون السكتة الدماغية",
          		"stroke_style": "تغيير نمط السكتة الدماغية اندفاعة",
          		"stroke_width": "تغيير عرض السكتة الدماغية",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "تغيير زاوية الدوران",
          		"blur": "Change gaussian blur value",
          		"opacity": "تغيير مختارة غموض البند",
          		"circle_cx": "دائرة التغيير لتنسيق cx",
          		"circle_cy": "Change circle's cy coordinate",
          		"circle_r": "التغيير في دائرة نصف قطرها",
          		"ellipse_cx": "تغيير شكل البيضاوي cx تنسيق",
          		"ellipse_cy": "تغيير شكل البيضاوي قبرصي تنسيق",
          		"ellipse_rx": "تغيير شكل البيضاوي خ نصف قطرها",
          		"ellipse_ry": "تغيير القطع الناقص في دائرة نصف قطرها ذ",
          		"line_x1": "تغيير الخط لبدء تنسيق خ",
          		"line_x2": "تغيير الخط لانهاء خ تنسيق",
          		"line_y1": "تغيير الخط لبدء تنسيق ذ",
          		"line_y2": "تغيير الخط لإنهاء تنسيق ذ",
          		"rect_height": "تغيير المستطيل الارتفاع",
          		"rect_width": "تغيير عرض المستطيل",
          		"corner_radius": "تغيير مستطيل ركن الشعاع",
          		"image_width": "تغيير صورة العرض",
          		"image_height": "تغيير ارتفاع الصورة",
          		"image_url": "تغيير العنوان",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "تغيير محتويات النص",
          		"font_family": "تغيير الخط الأسرة",
          		"font_size": "تغيير حجم الخط",
          		"bold": "نص جريء",
          		"italic": "مائل نص"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "تغير لون الخلفية / غموض",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "لائقا للمحتوى",
          		"fit_to_all": "يصلح لجميع المحتويات",
          		"fit_to_canvas": "يصلح لوحة زيتية على قماش",
          		"fit_to_layer_content": "يصلح لطبقة المحتوى",
          		"fit_to_sel": "يصلح لاختيار",
          		"align_relative_to": "محاذاة النسبي ل ...",
          		"relativeTo": "بالنسبة إلى:",
          		"الصفحة": "الصفحة",
          		"largest_object": "أكبر كائن",
          		"selected_objects": "انتخب الأجسام",
          		"smallest_object": "أصغر كائن",
          		"new_doc": "صورة جديدة",
          		"open_doc": "فتح الصورة",
          		"export_img": "Export",
          		"save_doc": "حفظ صورة",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "محاذاة القاع",
          		"align_center": "مركز محاذاة",
          		"align_left": "محاذاة إلى اليسار",
          		"align_middle": "محاذاة الأوسط",
          		"align_right": "محاذاة إلى اليمين",
          		"align_top": "محاذاة الأعلى",
          		"mode_select": "اختر أداة",
          		"mode_fhpath": "أداة قلم رصاص",
          		"mode_line": "خط أداة",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "القطع الناقص",
          		"mode_circle": "دائرة",
          		"mode_fhellipse": "اليد الحرة البيضوي",
          		"mode_path": "بولي أداة",
          		"mode_shapelib": "Shape library",
          		"mode_text": "النص أداة",
          		"mode_image": "الصورة أداة",
          		"mode_zoom": "أداة تكبير",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "التراجع",
          		"redo": "إعادته",
          		"tool_source": "عدل المصدر",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "مجموعة عناصر",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "فك تجميع عناصر",
          		"docprops": "خصائص المستند",
          		"imagelib": "Image Library",
          		"move_bottom": "الانتقال إلى أسفل",
          		"move_top": "الانتقال إلى أعلى",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "حفظ",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "حذف طبقة",
          		"move_down": "تحرك لأسفل طبقة",
          		"new": "طبقة جديدة",
          		"rename": "تسمية الطبقة",
          		"move_up": "تحرك لأعلى طبقة",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "حدد سلفا:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.az.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "az",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click to change fill color, shift-click to change stroke color",
          		"zoom_level": "Change zoom level",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change fill color",
          		"stroke_color": "Change stroke color",
          		"stroke_style": "Change stroke dash style",
          		"stroke_width": "Change stroke width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Change rotation angle",
          		"blur": "Change gaussian blur value",
          		"opacity": "Change selected item opacity",
          		"circle_cx": "Change circle's cx coordinate",
          		"circle_cy": "Change circle's cy coordinate",
          		"circle_r": "Change circle's radius",
          		"ellipse_cx": "Change ellipse's cx coordinate",
          		"ellipse_cy": "Change ellipse's cy coordinate",
          		"ellipse_rx": "Change ellipse's x radius",
          		"ellipse_ry": "Change ellipse's y radius",
          		"line_x1": "Change line's starting x coordinate",
          		"line_x2": "Change line's ending x coordinate",
          		"line_y1": "Change line's starting y coordinate",
          		"line_y2": "Change line's ending y coordinate",
          		"rect_height": "Change rectangle height",
          		"rect_width": "Change rectangle width",
          		"corner_radius": "Change Rectangle Corner Radius",
          		"image_width": "Change image width",
          		"image_height": "Change image height",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Change text contents",
          		"font_family": "Change Font Family",
          		"font_size": "Change Font Size",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color/opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit to all content",
          		"fit_to_canvas": "Fit to canvas",
          		"fit_to_layer_content": "Fit to layer content",
          		"fit_to_sel": "Fit to selection",
          		"align_relative_to": "Align relative to ...",
          		"relativeTo": "relative to:",
          		"page": "page",
          		"largest_object": "largest object",
          		"selected_objects": "selected objects",
          		"smallest_object": "smallest object",
          		"new_doc": "New Image",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Align Center",
          		"align_left": "Align Left",
          		"align_middle": "Align Middle",
          		"align_right": "Align Right",
          		"align_top": "Align Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Apply Changes",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefined:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.be.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "be",
          	dir : "ltr",
          	common: {
          		"ok": "Захаваць",
          		"cancel": "Адмена",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Націсніце для змены колеру залівання, Shift-Click змяніць обводка",
          		"zoom_level": "Змяненне маштабу",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Змяненне колеру залівання",
          		"stroke_color": "Змяненне колеру інсульт",
          		"stroke_style": "Змяненне стылю інсульт працяжнік",
          		"stroke_width": "Змены шырыня штрых",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Змены вугла павароту",
          		"blur": "Change gaussian blur value",
          		"opacity": "Старонка абранага пункта непразрыстасці",
          		"circle_cx": "CX змене круга каардынаты",
          		"circle_cy": "Змены гуртка CY каардынаты",
          		"circle_r": "Старонка круга&#39;s радыус",
          		"ellipse_cx": "Змены эліпса CX каардынаты",
          		"ellipse_cy": "Змены эліпса CY каардынаты",
          		"ellipse_rx": "Х змяненні эліпса радыюсам",
          		"ellipse_ry": "Змены у эліпса радыюсам",
          		"line_x1": "Змены лінія пачынае каардынаты х",
          		"line_x2": "Змяненне за перыяд, скончыўся лінія каардынаты х",
          		"line_y1": "Змены лінія пачынае Y каардынаты",
          		"line_y2": "Змяненне за перыяд, скончыўся лінія Y каардынаты",
          		"rect_height": "Змены прастакутнік вышынёй",
          		"rect_width": "Змяненне шырыні прамавугольніка",
          		"corner_radius": "Змены прастакутнік Corner Radius",
          		"image_width": "Змены шырыня выявы",
          		"image_height": "Змена вышыні выявы",
          		"image_url": "Змяніць URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Змяненне зместу тэксту",
          		"font_family": "Змены Сямейства шрыфтоў",
          		"font_size": "Змяніць памер шрыфта",
          		"bold": "Тоўсты тэкст",
          		"italic": "Нахілены тэкст"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Змяненне колеру фону / непразрыстасць",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Па памеры ўтрымання",
          		"fit_to_all": "Па памеру ўсе змесціва",
          		"fit_to_canvas": "Памер палатна",
          		"fit_to_layer_content": "По размеру слой ўтрымання",
          		"fit_to_sel": "Выбар памеру",
          		"align_relative_to": "Выраўнаваць па дачыненні да ...",
          		"relativeTo": "па параўнанні з:",
          		"старонка": "старонка",
          		"largest_object": "найбуйнейшы аб&#39;ект",
          		"selected_objects": "выбранымі аб&#39;ектамі",
          		"smallest_object": "маленькі аб&#39;ект",
          		"new_doc": "Новае выява",
          		"open_doc": "Адкрыць выява",
          		"export_img": "Export",
          		"save_doc": "Захаваць малюнак",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Лінаваць па ніжнім краю",
          		"align_center": "Лінаваць па цэнтру",
          		"align_left": "Па левым краю",
          		"align_middle": "Выраўнаваць Блізкага",
          		"align_right": "Па правым краю",
          		"align_top": "Лінаваць па верхнім краю",
          		"mode_select": "Выберыце інструмент",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Свабоднай рукі Прастакутнік",
          		"mode_ellipse": "Эліпс",
          		"mode_circle": "Круг",
          		"mode_fhellipse": "Свабоднай рукі Эліпс",
          		"mode_path": "Poly Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Тэкст Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Адмяніць",
          		"redo": "Паўтор",
          		"tool_source": "Змяніць зыходны",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Група элементаў",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Элементы Разгруппировать",
          		"docprops": "Уласцівасці дакумента",
          		"imagelib": "Image Library",
          		"move_bottom": "Перамясціць уніз",
          		"move_top": "Перамясціць угару",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Захаваць",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Выдаліць слой",
          		"move_down": "Перамясціць слой на",
          		"new": "Новы слой",
          		"rename": "Перайменаваць Слой",
          		"move_up": "Перамяшчэнне слоя да",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Выберыце прадвызначэньні:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.bg.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "bg",
          	dir : "ltr",
          	common: {
          		"ok": "Спасявам",
          		"cancel": "Отказ",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Кликнете, за да промени попълнете цвят, на смени, кликнете да променят цвета си удар",
          		"zoom_level": "Промяна на ниво на мащабиране",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Промяна попълнете цвят",
          		"stroke_color": "Промяна на инсулт цвят",
          		"stroke_style": "Промяна на стила удар тире",
          		"stroke_width": "Промяна на ширината инсулт",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Промяна ъгъл на завъртане",
          		"blur": "Change gaussian blur value",
          		"opacity": "Промяна на избрания елемент непрозрачност",
          		"circle_cx": "CX Промяна кръг на координатната",
          		"circle_cy": "Промяна кръг&#39;s CY координира",
          		"circle_r": "Промяна кръг радиус",
          		"ellipse_cx": "Промяна на елипса&#39;s CX координира",
          		"ellipse_cy": "Промяна на елипса&#39;s CY координира",
          		"ellipse_rx": "Промяна на елипса&#39;s X радиус",
          		"ellipse_ry": "Промяна на елипса&#39;s Y радиус",
          		"line_x1": "Промяна на линия, започваща х координира",
          		"line_x2": "Промяна на линията приключва х координира",
          		"line_y1": "Промяна линия, започваща Y координира",
          		"line_y2": "Промяна на линията приключва Y координира",
          		"rect_height": "Промяна на правоъгълник височина",
          		"rect_width": "Промяна на правоъгълник ширина",
          		"corner_radius": "Промяна на правоъгълник Corner Radius",
          		"image_width": "Промяна на изображението ширина",
          		"image_height": "Промяна на изображението височина",
          		"image_url": "Промяна на URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Промяна на текст съдържание",
          		"font_family": "Промяна на шрифта Семейство",
          		"font_size": "Промени размера на буквите",
          		"bold": "Получер текст",
          		"italic": "Курсив текст"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Промяна на цвета на фона / непрозрачност",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit към съдържание",
          		"fit_to_all": "Побери цялото съдържание",
          		"fit_to_canvas": "Fit на платно",
          		"fit_to_layer_content": "Fit да слой съдържание",
          		"fit_to_sel": "Fit за подбор",
          		"align_relative_to": "Привеждане в сравнение с ...",
          		"relativeTo": "в сравнение с:",
          		"страница": "страница",
          		"largest_object": "най-големият обект",
          		"selected_objects": "избраните обекти",
          		"smallest_object": "най-малката обект",
          		"new_doc": "Ню Имидж",
          		"open_doc": "Отворете изображението",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Привеждане Отдолу",
          		"align_center": "Подравняване в средата",
          		"align_left": "Подравняване вляво",
          		"align_middle": "Привеждане в Близкия",
          		"align_right": "Подравняване надясно",
          		"align_top": "Привеждане Топ",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Свободен Употребявани правоъгълник",
          		"mode_ellipse": "Елипса",
          		"mode_circle": "Кръгът",
          		"mode_fhellipse": "Свободен Употребявани Елипса",
          		"mode_path": "Поли Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Текст Оръдие",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Отмени",
          		"redo": "Възстановяване",
          		"tool_source": "Редактиране Източник",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Група Елементи",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Разгрупирай Елементи",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Премести надолу",
          		"move_top": "Премести в началото",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Спасявам",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Изтриване на слой",
          		"move_down": "Move слой надолу",
          		"new": "Нов слой",
          		"rename": "Преименуване Layer",
          		"move_up": "Move Up Layer",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Изберете предварително:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ca.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ca",
          	dir : "ltr",
          	common: {
          		"ok": "Salvar",
          		"cancel": "Cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Feu clic per canviar el color de farciment, shift-clic per canviar el color del traç",
          		"zoom_level": "Canviar el nivell de zoom",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Canviar el color de farciment",
          		"stroke_color": "Canviar el color del traç",
          		"stroke_style": "Canviar estil de traç guió",
          		"stroke_width": "Canviar l&#39;amplada del traç",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Canviar l&#39;angle de rotació",
          		"blur": "Change gaussian blur value",
          		"opacity": "Canviar la opacitat tema seleccionat",
          		"circle_cx": "CX cercle Canvi de coordenades",
          		"circle_cy": "Cercle Canvi CY coordinar",
          		"circle_r": "Ràdio de cercle Canvi",
          		"ellipse_cx": "Canviar lipse CX coordinar",
          		"ellipse_cy": "Lipse Canvi CY coordinar",
          		"ellipse_rx": "Ràdio x lipse Canvi",
          		"ellipse_ry": "Ràdio i lipse Canvi",
          		"line_x1": "Canviar la línia de partida de la coordenada x",
          		"line_x2": "Canviar la línia d&#39;hores de coordenada x",
          		"line_y1": "Canviar la línia de partida i de coordinar",
          		"line_y2": "Canviar la línia d&#39;hores de coordenada",
          		"rect_height": "Rectangle d&#39;alçada Canvi",
          		"rect_width": "Ample rectangle Canvi",
          		"corner_radius": "Canviar Rectangle Corner Radius",
          		"image_width": "Amplada de la imatge Canvi",
          		"image_height": "Canviar l&#39;altura de la imatge",
          		"image_url": "Canviar URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Contingut del text",
          		"font_family": "Canviar la font Família",
          		"font_size": "Change Font Size",
          		"bold": "Text en negreta",
          		"italic": "Text en cursiva"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Color de fons / opacitat",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Ajustar al contingut",
          		"fit_to_all": "Ajustar a tot el contingut",
          		"fit_to_canvas": "Ajustar a la lona",
          		"fit_to_layer_content": "Ajustar al contingut de la capa d&#39;",
          		"fit_to_sel": "Ajustar a la selecció",
          		"align_relative_to": "Alinear pel que fa a ...",
          		"relativeTo": "en relació amb:",
          		"Pàgina": "Pàgina",
          		"largest_object": "objecte més gran",
          		"selected_objects": "objectes escollits",
          		"smallest_object": "objecte més petit",
          		"new_doc": "Nova imatge",
          		"open_doc": "Obrir imatge",
          		"export_img": "Export",
          		"save_doc": "Guardar imatge",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Alinear baix",
          		"align_center": "Alinear al centre",
          		"align_left": "Alinear a l&#39;esquerra",
          		"align_middle": "Alinear Medi",
          		"align_right": "Alinear a la dreta",
          		"align_top": "Alinear a dalt",
          		"mode_select": "Eina de selecció",
          		"mode_fhpath": "Eina Llapis",
          		"mode_line": "L&#39;eina",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Lipse",
          		"mode_circle": "Cercle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Eina de text",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Desfés",
          		"redo": "Refer",
          		"tool_source": "Font Edita",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Elements de Grup de",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Desagrupar elements",
          		"docprops": "Propietats del document",
          		"imagelib": "Image Library",
          		"move_bottom": "Mou al final",
          		"move_top": "Mou al principi",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Salvar",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Eliminar capa",
          		"move_down": "Mou la capa de Down",
          		"new": "Nova capa",
          		"rename": "Canvieu el nom de la capa",
          		"move_up": "Mou la capa Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Seleccioneu predefinides:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.cs.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "cs",
          	dir : "ltr",
          	common: {
          		"ok": "Uložit",
          		"cancel": "Storno",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "šipka dolů", 
          		"key_up": "šipka nahoru", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Běží na"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Zobrazit/schovat více možností",
          		"palette_info": "Kliknutím změníte barvu výplně, kliknutím současně s klávesou shift změníte barvu čáry",
          		"zoom_level": "Změna přiblížení",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Změnit ID elementu",
          		"fill_color": "Změnit barvu výplně",
          		"stroke_color": "Změnit barvu čáry",
          		"stroke_style": "Změnit styl čáry",
          		"stroke_width": "Změnit šířku čáry",
          		"pos_x": "Změnit souřadnici X",
          		"pos_y": "Změnit souřadnici Y",
          		"linecap_butt": "Konec úsečky: přesný",
          		"linecap_round": "Konec úsečky: zaoblený",
          		"linecap_square": "Konec úsečky: s čtvercovým přesahem",
          		"linejoin_bevel": "Styl napojení úseček: zkosené",
          		"linejoin_miter": "Styl napojení úseček: ostré",
          		"linejoin_round": "Styl napojení úseček: oblé",
          		"angle": "Změnit úhel natočení",
          		"blur": "Změnit rozostření",
          		"opacity": "Změnit průhlednost objektů",
          		"circle_cx": "Změnit souřadnici X středu kružnice",
          		"circle_cy": "Změnit souřadnici Y středu kružnice",
          		"circle_r": "Změnit poloměr kružnice",
          		"ellipse_cx": "Změnit souřadnici X středu elipsy",
          		"ellipse_cy": "Změnit souřadnici Y středu elipsy",
          		"ellipse_rx": "Změnit poloměr X elipsy",
          		"ellipse_ry": "Změnit poloměr Y elipsy",
          		"line_x1": "Změnit počáteční souřadnici X úsečky",
          		"line_x2": "Změnit koncovou souřadnici X úsečky",
          		"line_y1": "Změnit počáteční souřadnici Y úsečky",
          		"line_y2": "Změnit koncovou souřadnici X úsečky",
          		"rect_height": "Změnit výšku obdélníku",
          		"rect_width": "Změnit šířku obdélníku",
          		"corner_radius": "Změnit zaoblení obdélníku",
          		"image_width": "Změnit šířku dokumentu",
          		"image_height": "Změnit výšku dokumentu",
          		"image_url": "Změnit adresu URL",
          		"node_x": "Změnit souřadnici X uzlu",
          		"node_y": "Změnit souřadnici Y uzlu",
          		"seg_type": "Změnit typ segmentu",
          		"straight_segments": "úsečka",
          		"curve_segments": "křivka",
          		"text_contents": "Změnit text",
          		"font_family": "Změnit font",
          		"font_size": "Změnit velikost písma",
          		"bold": "Tučně",
          		"italic": "Kurzíva"
          	},
          	tools: { 
          		"main_menu": "Hlavní menu",
          		"bkgnd_color_opac": "Změnit barvu a průhlednost pozadí",
          		"connector_no_arrow": "Bez šipky",
          		"fitToContent": "přizpůsobit obsahu",
          		"fit_to_all": "Přizpůsobit veškerému obsahu",
          		"fit_to_canvas": "Přizpůsobit stránce",
          		"fit_to_layer_content": "Přizpůsobit obsahu vrstvy",
          		"fit_to_sel": "Přizpůsobit výběru",
          		"align_relative_to": "Zarovnat relativně",
          		"relativeTo": "relatativně k:",
          		"stránce": "stránce",
          		"largest_object": "největšímu objektu",
          		"selected_objects": "zvoleným objektům",
          		"smallest_object": "nejmenšímu objektu",
          		"new_doc": "Nový dokument",
          		"open_doc": "Otevřít dokument",
          		"export_img": "Export",
          		"save_doc": "Uložit dokument",
          		"import_doc": "Importovat SVG",
          		"align_to_page": "Zarovnat element na stránku",
          		"align_bottom": "Zarovnat dolů",
          		"align_center": "Zarovnat nastřed",
          		"align_left": "Zarovnat doleva",
          		"align_middle": "Zarovnat nastřed",
          		"align_right": "Zarovnat doprava",
          		"align_top": "Zarovnat nahoru",
          		"mode_select": "Výběr a transformace objektů",
          		"mode_fhpath": "Kresba od ruky",
          		"mode_line": "Úsečka",
          		"mode_connect": "Spojit dva objekty",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Obdélník volnou rukou",
          		"mode_ellipse": "Elipsa",
          		"mode_circle": "Kružnice",
          		"mode_fhellipse": "Elipsa volnou rukou",
          		"mode_path": "Křivka",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text",
          		"mode_image": "Obrázek",
          		"mode_zoom": "Přiblížení",
          		"mode_eyedropper": "Kapátko",
          		"no_embed": "POZOR: Obrázek nelze uložit s dokumentem. Bude zobrazován z adresáře, kde se nyní nachází.",
          		"undo": "Zpět",
          		"redo": "Znovu",
          		"tool_source": "Upravovat SVG kód",
          		"wireframe_mode": "Zobrazit jen kostru",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Seskupit objekty",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Objekt na křivku",
          		"reorient_path": "Změna orientace křivky",
          		"ungroup": "Zrušit seskupení",
          		"docprops": "Vlastnosti dokumentu",
          		"imagelib": "Image Library",
          		"move_bottom": "Vrstvu úplně dospodu",
          		"move_top": "Vrstvu úplně nahoru",
          		"node_clone": "Vložit nový uzel",
          		"node_delete": "Ostranit uzel",
          		"node_link": "Provázat ovládací body uzlu",
          		"add_subpath": "Přidat další součást křivky",
          		"openclose_path": "Otevřít/zavřít součást křivky",
          		"source_save": "Uložit",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Vrstva",
          		"layers": "Layers",
          		"del": "Odstranit vrstvu",
          		"move_down": "Přesunout vrstvu níž",
          		"new": "Přidat vrstvu",
          		"rename": "Přejmenovat vrstvu",
          		"move_up": "Přesunout vrstvu výš",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Přesunout objekty do:",
          		"move_selected": "Přesunout objekty do jiné vrstvy"
          	},
          	config: {
          		"image_props": "Vlastnosti dokumentu",
          		"doc_title": "Název",
          		"doc_dims": "Vlastní velikost",
          		"included_images": "Vložené obrázky",
          		"image_opt_embed": "Vkládat do dokumentu",
          		"image_opt_ref": "Jen odkazem",
          		"editor_prefs": "Nastavení editoru",
          		"icon_size": "Velikost ikon",
          		"language": "Jazyk",
          		"background": "Obrázek v pozadí editoru",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Pozor: obrázek v pozadí nebude uložen jako součást dokumentu.",
          		"icon_large": "velké",
          		"icon_medium": "střední",
          		"icon_small": "malé",
          		"icon_xlarge": "největší",
          		"select_predefined": "vybrat předdefinovaný:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Nevhodná hodnota",
          		"noContentToFitTo":"Vyberte oblast pro přizpůsobení",
          		"dupeLayerName":"Taková vrstva už bohužel existuje",
          		"enterUniqueLayerName":"Zadejte prosím jedinečné jméno pro vrstvu",
          		"enterNewLayerName":"Zadejte prosím jméno pro novou vrstvu",
          		"layerHasThatName":"Vrstva už se tak jmenuje",
          		"QmoveElemsToLayer":"Opravdu chcete přesunout vybrané objekty do vrstvy '%s'?",
          		"QwantToClear":"Opravdu chcete smazat současný dokument?\nHistorie změn bude také smazána.",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Chyba v parsování zdrojového kódu SVG.\nChcete se vrátit k původnímu?",
          		"QignoreSourceChanges":"Opravdu chcete stornovat změny provedené v SVG kódu?",
          		"featNotSupported":"Tato vlastnost ještě není k dispozici",
          		"enterNewImgURL":"Vložte adresu URL, na které se nachází vkládaný obrázek",
          		"defsFailOnSave": "POZOR: Kvůli nedokonalosti Vašeho prohlížeče se mohou některé části dokumentu špatně vykreslovat (mohou chybět barevné přechody nebo některé objekty). Po uložení dokumentu by se ale vše mělo zobrazovat správně.",
          		"loadingImage":"Nahrávám obrázek ...",
          		"saveFromBrowser": "Použijte nabídku \"Uložit stránku jako ...\" ve Vašem prohlížeči pro uložení dokumentu do souboru %s.",
          		"noteTheseIssues": "Mohou se vyskytnout následující problémy: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.cy.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "cy",
          	dir : "ltr",
          	common: {
          		"ok": "Cadw",
          		"cancel": "Canslo",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Cliciwch yma i lenwi newid lliw, sifft-cliciwch i newid lliw strôc",
          		"zoom_level": "Newid lefel chwyddo",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Newid lliw llenwi",
          		"stroke_color": "Newid lliw strôc",
          		"stroke_style": "Newid arddull strôc diferyn",
          		"stroke_width": "Lled strôc Newid",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Ongl cylchdro Newid",
          		"blur": "Change gaussian blur value",
          		"opacity": "Newid dewis Didreiddiad eitem",
          		"circle_cx": "CX Newid cylch yn cydlynu",
          		"circle_cy": "Newid cylch&#39;s cy gydgysylltu",
          		"circle_r": "Newid radiws cylch yn",
          		"ellipse_cx": "Newid Ellipse yn CX gydgysylltu",
          		"ellipse_cy": "Newid Ellipse yn cydlynu cy",
          		"ellipse_rx": "Radiws Newid Ellipse&#39;s x",
          		"ellipse_ry": "Radiws Newid Ellipse yn y",
          		"line_x1": "Newid llinell yn cychwyn x gydgysylltu",
          		"line_x2": "Newid llinell yn diweddu x gydgysylltu",
          		"line_y1": "Newid llinell ar y cychwyn yn cydlynu",
          		"line_y2": "Newid llinell yn dod i ben y gydgysylltu",
          		"rect_height": "Uchder petryal Newid",
          		"rect_width": "Lled petryal Newid",
          		"corner_radius": "Newid Hirsgwâr Corner Radiws",
          		"image_width": "Lled delwedd Newid",
          		"image_height": "Uchder delwedd Newid",
          		"image_url": "Newid URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Cynnwys testun Newid",
          		"font_family": "Newid Font Teulu",
          		"font_size": "Newid Maint Ffont",
          		"bold": "Testun Bras",
          		"italic": "Italig Testun"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Newid lliw cefndir / Didreiddiad",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Ffit i Cynnwys",
          		"fit_to_all": "Yn addas i bawb content",
          		"fit_to_canvas": "Ffit i ofyn",
          		"fit_to_layer_content": "Ffit cynnwys haen i",
          		"fit_to_sel": "Yn addas at ddewis",
          		"align_relative_to": "Alinio perthynas i ...",
          		"relativeTo": "cymharol i:",
          		"tudalen": "tudalen",
          		"largest_object": "gwrthrych mwyaf",
          		"selected_objects": "gwrthrychau etholedig",
          		"smallest_object": "lleiaf gwrthrych",
          		"new_doc": "Newydd Delwedd",
          		"open_doc": "Delwedd Agored",
          		"export_img": "Export",
          		"save_doc": "Cadw Delwedd",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Alinio Gwaelod",
          		"align_center": "Alinio Center",
          		"align_left": "Alinio Chwith",
          		"align_middle": "Alinio Canol",
          		"align_right": "Alinio Hawl",
          		"align_top": "Alinio Top",
          		"mode_select": "Dewiswch Offer",
          		"mode_fhpath": "Teclyn pensil",
          		"mode_line": "Llinell Offer",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Hand rhad ac am ddim Hirsgwâr",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Cylch",
          		"mode_fhellipse": "Rhad ac am ddim Hand Ellipse",
          		"mode_path": "Offer poly",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Testun Offer",
          		"mode_image": "Offer Delwedd",
          		"mode_zoom": "Offer Chwyddo",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Dadwneud",
          		"redo": "Ail-wneud",
          		"tool_source": "Golygu Ffynhonnell",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Elfennau Grŵp",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Elfennau Ungroup",
          		"docprops": "Document Eiddo",
          		"imagelib": "Image Library",
          		"move_bottom": "Symud i&#39;r Gwaelod",
          		"move_top": "Symud i&#39;r Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Cadw",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Dileu Haen",
          		"move_down": "Symud Haen i Lawr",
          		"new": "Haen Newydd",
          		"rename": "Ail-enwi Haen",
          		"move_up": "Symud Haen Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Rhagosodol Dewis:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.da.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "da",
          	dir : "ltr",
          	common: {
          		"ok": "Gemme",
          		"cancel": "Annuller",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klik for at ændre fyldfarve, shift-klik for at ændre stregfarve",
          		"zoom_level": "Skift zoomniveau",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Skift fyldfarve",
          		"stroke_color": "Skift stregfarve",
          		"stroke_style": "Skift slagtilfælde Dash stil",
          		"stroke_width": "Skift slagtilfælde bredde",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Skift rotationsvinkel",
          		"blur": "Change gaussian blur value",
          		"opacity": "Skift valgte element opacitet",
          		"circle_cx": "Skift cirklens cx koordinere",
          		"circle_cy": "Skift cirklens cy koordinere",
          		"circle_r": "Skift cirklens radius",
          		"ellipse_cx": "Skift ellipse&#39;s cx koordinere",
          		"ellipse_cy": "Skift ellipse&#39;s cy koordinere",
          		"ellipse_rx": "Skift ellipse&#39;s x radius",
          		"ellipse_ry": "Skift ellipse&#39;s y radius",
          		"line_x1": "Skift linie&#39;s start x-koordinat",
          		"line_x2": "Skift Line&#39;s slutter x-koordinat",
          		"line_y1": "Skift linjens start y-koordinat",
          		"line_y2": "Skift Line&#39;s slutter y-koordinat",
          		"rect_height": "Skift rektangel højde",
          		"rect_width": "Skift rektanglets bredde",
          		"corner_radius": "Skift Rektangel Corner Radius",
          		"image_width": "Skift billede bredde",
          		"image_height": "Skift billede højde",
          		"image_url": "Skift webadresse",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Skift tekst indhold",
          		"font_family": "Skift Font Family",
          		"font_size": "Skift skriftstørrelse",
          		"bold": "Fed tekst",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Skift baggrundsfarve / uigennemsigtighed",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Tilpas til indhold",
          		"fit_to_all": "Passer til alt indhold",
          		"fit_to_canvas": "Tilpas til lærred",
          		"fit_to_layer_content": "Tilpas til lag indhold",
          		"fit_to_sel": "Tilpas til udvælgelse",
          		"align_relative_to": "Juster i forhold til ...",
          		"relativeTo": "i forhold til:",
          		"side": "side",
          		"largest_object": "største objekt",
          		"selected_objects": "valgte objekter",
          		"smallest_object": "mindste objekt",
          		"new_doc": "Nyt billede",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Gem billede",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Juster Bottom",
          		"align_center": "Centrer",
          		"align_left": "Venstrejusteret",
          		"align_middle": "Juster Mellemøsten",
          		"align_right": "Højrejusteret",
          		"align_top": "Juster Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rektangel",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Cirkel",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Tekstværktøj",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Fortryd",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Gruppe Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Opdel Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Flyt til bund",
          		"move_top": "Flyt til toppen",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Gemme",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Slet Layer",
          		"move_down": "Flyt lag ned",
          		"new": "New Layer",
          		"rename": "Omdøb Layer",
          		"move_up": "Flyt Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Vælg foruddefinerede:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.de.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "de",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Abbrechen",
          		"key_backspace": "Rücktaste", 
          		"key_del": "Löschen", 
          		"key_down": "nach unten", 
          		"key_up": "nach oben", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Breite",
          		"height": "Höhe"
          	},
          	misc: {
          		"powered_by": "angetrieben durch"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Zeige/Verberge weitere Linien Werkzeuge",
          		"palette_info": "Klick zum Ändern der Füllfarbe, Shift-Klick zum Ändern der Linienfarbe",
          		"zoom_level": "vergrößern",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Füllfarbe ändern",
          		"stroke_color": "Linienfarbe ändern",
          		"stroke_style": "Linienstil ändern",
          		"stroke_width": "Linienbreite ändern",
          		"pos_x": "Ändere die X Koordinate",
          		"pos_y": "Ändere die Y Koordinate",
          		"linecap_butt": "Form der Linienendung: Stumpf",
          		"linecap_round": "Form der Linienendung: Rund",
          		"linecap_square": "Form der Linienendung: Rechteckig",
          		"linejoin_bevel": "Zusammentreffen von zwei Linien: abgeschrägte Kante",
          		"linejoin_miter": "Zusammentreffen von zwei Linien: Gehrung",
          		"linejoin_round": "Zusammentreffen von zwei Linien: Rund",
          		"angle": "Drehwinkel ändern",
          		"blur": "Ändere Gaußschen Weichzeichner Wert",
          		"opacity": "Opazität des ausgewählten Objekts ändern",
          		"circle_cx": "Kreiszentrum (cx) ändern",
          		"circle_cy": "Kreiszentrum (cy) ändern",
          		"circle_r": "Kreisradius (r) ändern",
          		"ellipse_cx": "Ellipsenzentrum (cx) ändern",
          		"ellipse_cy": "Ellipsenzentrum (cy) ändern",
          		"ellipse_rx": "Ellipsenradius (x) ändern",
          		"ellipse_ry": "Ellipsenradius (y) ändern",
          		"line_x1": "X-Koordinate des Linienanfangs ändern",
          		"line_x2": "X-Koordinate des Linienendes ändern",
          		"line_y1": "Y-Koordinate des Linienanfangs ändern",
          		"line_y2": "Y-Koordinate des Linienendes ändern",
          		"rect_height": "Höhe des Rechtecks ändern",
          		"rect_width": "Breite des Rechtecks ändern",
          		"corner_radius": "Eckenradius des Rechtecks ändern",
          		"image_width": "Bildbreite ändern",
          		"image_height": "Bildhöhe ändern",
          		"image_url": "URL ändern",
          		"node_x": "Ändere die X Koordinate des Knoten",
          		"node_y": "Ändere die Y Koordinate des Knoten",
          		"seg_type": "Ändere den Typ des Segments",
          		"straight_segments": "Gerade",
          		"curve_segments": "Kurve",
          		"text_contents": "Textinhalt erstellen und bearbeiten",
          		"font_family": "Schriftart wählen",
          		"font_size": "Schriftgröße einstellen",
          		"bold": "Fetter Text",
          		"italic": "Kursiver Text"
          	},
          	tools: { 
          		"main_menu": "Hauptmenü",
          		"bkgnd_color_opac": "Hintergrundfarbe ändern / Opazität",
          		"connector_no_arrow": "Kein Pfeil",
          		"fitToContent": "An den Inhalt anpassen",
          		"fit_to_all": "An gesamten Inhalt anpassen",
          		"fit_to_canvas": "An die Zeichenfläche anpassen",
          		"fit_to_layer_content": "An Inhalt der Ebene anpassen",
          		"fit_to_sel": "An die Auswahl anpassen",
          		"align_relative_to": "Relativ zu einem anderem Objekt ausrichten ...",
          		"relativeTo": "im Vergleich zu:",
          		"Seite": "Seite",
          		"largest_object": "größtes Objekt",
          		"selected_objects": "gewählte Objekte",
          		"smallest_object": "kleinstes Objekt",
          		"new_doc": "Neues Bild",
          		"open_doc": "Bild öffnen",
          		"export_img": "Export",
          		"save_doc": "Bild speichern",
          		"import_doc": "Importiere SVG",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Unten ausrichten",
          		"align_center": "Zentriert ausrichten",
          		"align_left": "Linksbündig ausrichten",
          		"align_middle": "In der Mitte ausrichten",
          		"align_right": "Rechtsbündig ausrichten",
          		"align_top": "Oben ausrichten",
          		"mode_select": "Objekte auswählen und verändern",
          		"mode_fhpath": "Freihandlinien zeichnen",
          		"mode_line": "Linien zeichnen",
          		"mode_connect": "Verbinde zwei Objekte",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Freihand Rechteck",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Kreis",
          		"mode_fhellipse": "Freihand Ellipse",
          		"mode_path": "Pfad zeichnen",
          		"mode_shapelib": "Form-Bibliothek",
          		"mode_text": "Text erstellen und bearbeiten",
          		"mode_image": "Bild einfügen",
          		"mode_zoom": "Zoomfaktor vergrößern oder verringern",
          		"mode_eyedropper": "Ableger",
          		"no_embed": "Hinweis: Dieses Bild kann nicht eingebettet werden. Eine Anzeige hängt von diesem Pfad ab.",
          		"undo": "Rückgängig",
          		"redo": "Wiederherstellen",
          		"tool_source": "Quellecode bearbeiten",
          		"wireframe_mode": "Drahtmodell Modus",
          		"toggle_grid": "Zeige/Verstecke Gitternetz",
          		"clone": "Klone Element(e)",
          		"del": "Lösche Element(e)",
          		"group_elements": "Gruppieren Element(e)",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Gewähltes Objekt in einen Pfad konvertieren",
          		"reorient_path": "Neuausrichtung des Pfades",
          		"ungroup": "Gruppierung aufheben",
          		"docprops": "Dokument-Eigenschaften",
          		"imagelib": "Bilder-Bibliothek",
          		"move_bottom": "Die gewählten Objekte nach ganz unten schieben",
          		"move_top": "Die gewählten Objekte nach ganz oben anheben",
          		"node_clone": "Klone den Knoten",
          		"node_delete": "Lösche den Knoten",
          		"node_link": "Gekoppelte oder separate Kontroll Punkte für die Bearbeitung des Pfades",
          		"add_subpath": "Teilpfad hinzufügen",
          		"openclose_path": "Öffne/Verbinde Unterpfad",
          		"source_save": "Änderungen akzeptieren",
          		"cut": "Ausschneiden",
          		"copy": "Kopieren",
          		"paste": "Einfügen",
          		"paste_in_place": "An Originalposition einfügen",
          		"Löschen": "Löschen",
          		"group": "Gruppieren",
          		"move_front": "Nach ganz oben anheben",
          		"move_up": "Anheben",
          		"move_down": "Absenken",
          		"move_back": "Nach ganz unten absenken"
          	},
          	layers: {
          		"layer": "Ebene",
          		"layers": "Ebenen",
          		"del": "Ebene löschen",
          		"move_down": "Ebene nach unten verschieben",
          		"new": "Neue Ebene",
          		"rename": "Ebene umbenennen",
          		"move_up": "Ebene nach oben verschieben",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Verschiebe ausgewählte Objekte:",
          		"move_selected": "Verschiebe ausgewählte Objekte auf eine andere Ebene"
          	},
          	config: {
          		"image_props": "Bildeigenschaften",
          		"doc_title": "Titel",
          		"doc_dims": "Dimension der Zeichenfläche",
          		"included_images": "Eingefügte Bilder",
          		"image_opt_embed": "Daten einbetten (lokale Dateien)",
          		"image_opt_ref": "Benutze die Datei Referenz",
          		"editor_prefs": "Editor Einstellungen",
          		"icon_size": "Symbol Abmessungen",
          		"language": "Sprache",
          		"background": "Editor Hintergrund",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Anmerkung: Der Hintergrund wird mit der Speicherung des Bildes nicht gespeichert.",
          		"icon_large": "Groß",
          		"icon_medium": "Mittel",
          		"icon_small": "Klein",
          		"icon_xlarge": "Sehr Groß",
          		"select_predefined": "Auswahl einer vordefinierten:",
          		"units_and_rulers": "Einheiten und Lineale",
          		"show_rulers": "Zeige Lineale",
          		"base_unit": "Basiseinheit:",
          		"grid": "Gitternetz",
          		"snapping_onoff": "Einrasten an/aus",
          		"snapping_stepsize": "Einrastungs Abstand:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Standard",
          		"object": "Objekte",
          		"symbol": "Symbole",
          		"arrow": "Pfeile",
          		"flowchart": "Flussdiagramme",
          		"animal": "Tiere",
          		"game": "Spielkarten und Schach",
          		"dialog_balloon": "Sprechblasen",
          		"electronics": "Elektronik",
          		"math": "Mathematik",
          		"music": "Musik",
          		"misc": "Sonstige",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Fehlerhafter Wert",
          		"noContentToFitTo":"Kein Inhalt anzupassen",
          		"dupeLayerName":"Eine Ebene hat bereits diesen Namen!",
          		"enterUniqueLayerName":"Verwenden Sie einen eindeutigen Namen für die Ebene",
          		"enterNewLayerName":"Geben Sie bitte einen neuen Namen für die Ebene ein",
          		"layerHasThatName":"Eine Ebene hat bereits diesen Namen",
          		"QmoveElemsToLayer":"Verschiebe ausgewählte Objekte in die Ebene '%s'?",
          		"QwantToClear":"Möchten Sie die Zeichnung löschen?\nDadurch wird auch die Rückgängig Funktion zurückgesetzt!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Die Syntaxanalyse Ihrer SVG Quelle enthält Fehler.\nOriginal SVG wiederherstellen?",
          		"QignoreSourceChanges":"Soll die Änderung am SVG Quelltext ignoriert werden?",
          		"featNotSupported":"Diese Eigenschaft wird nicht unterstützt",
          		"enterNewImgURL":"Geben Sie die URL für das neue Bild an",
          		"defsFailOnSave": "Hinweis: Aufgrund eines Fehlers in Ihrem Browser, kann dieses Bild falsch angezeigt werden (fehlende Gradienten oder Elemente). Es wird jedoch richtig angezeigt sobald es tatsächlich gespeichert wird.",
          		"loadingImage":"Bild wird geladen, bitte warten ...",
          		"saveFromBrowser": "Wählen Sie \"Speichern unter ...\" in Ihrem Browser, um das Bild als Datei %s zu speichern.",
          		"noteTheseIssues": "Beachten Sie außerdem die folgenden Probleme: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.el.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "el",
          	dir : "ltr",
          	common: {
          		"ok": "Αποθηκεύω",
          		"cancel": "Άκυρο",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Κάντε κλικ για να συμπληρώσετε την αλλαγή χρώματος, στροφή κλικ για να αλλάξετε το χρώμα εγκεφαλικό",
          		"zoom_level": "Αλλαγή επίπεδο μεγέθυνσης",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Αλλαγή συμπληρώστε χρώμα",
          		"stroke_color": "Αλλαγή χρώματος εγκεφαλικό",
          		"stroke_style": "Αλλαγή στυλ παύλα εγκεφαλικό",
          		"stroke_width": "Αλλαγή πλάτος γραμμής",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Αλλαγή γωνία περιστροφής",
          		"blur": "Change gaussian blur value",
          		"opacity": "Αλλαγή αδιαφάνεια επιλεγμένο σημείο",
          		"circle_cx": "Cx Αλλαγή κύκλου συντονίζουν",
          		"circle_cy": "Αλλαγή κύκλου cy συντονίζουν",
          		"circle_r": "Αλλαγή ακτίνα κύκλου",
          		"ellipse_cx": "Αλλαγή ellipse του CX συντονίζουν",
          		"ellipse_cy": "Αλλαγή ellipse του cy συντονίζουν",
          		"ellipse_rx": "X ακτίνα Αλλαγή ellipse του",
          		"ellipse_ry": "Y ακτίνα Αλλαγή ellipse του",
          		"line_x1": "Αλλαγή γραμμής εκκίνησης x συντονίζουν",
          		"line_x2": "Αλλαγή γραμμής λήγει x συντονίζουν",
          		"line_y1": "Αλλαγή γραμμής εκκίνησης y συντονίζουν",
          		"line_y2": "Αλλαγή γραμμής λήγει y συντονίζουν",
          		"rect_height": "Αλλαγή ύψος ορθογωνίου",
          		"rect_width": "Αλλαγή πλάτους ορθογώνιο",
          		"corner_radius": "Αλλαγή ορθογώνιο Corner Radius",
          		"image_width": "Αλλαγή πλάτος εικόνας",
          		"image_height": "Αλλαγή ύψος εικόνας",
          		"image_url": "Αλλαγή URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Αλλαγή περιεχόμενο κειμένου",
          		"font_family": "Αλλαγή γραμματοσειράς Οικογένεια",
          		"font_size": "Αλλαγή μεγέθους γραμματοσειράς",
          		"bold": "Bold Text",
          		"italic": "Πλάγιους"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Αλλαγή χρώματος φόντου / αδιαφάνεια",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Ταιριάζει σε όλο το περιεχόμενο",
          		"fit_to_canvas": "Προσαρμογή στο μουσαμά",
          		"fit_to_layer_content": "Προσαρμογή στο περιεχόμενο στρώμα",
          		"fit_to_sel": "Fit to επιλογή",
          		"align_relative_to": "Στοίχιση σε σχέση με ...",
          		"relativeTo": "σε σχέση με:",
          		"σελίδα": "σελίδα",
          		"largest_object": "μεγαλύτερο αντικείμενο",
          		"selected_objects": "εκλέγεται αντικείμενα",
          		"smallest_object": "μικρότερο αντικείμενο",
          		"new_doc": "Νέα εικόνα",
          		"open_doc": "Άνοιγμα εικόνας",
          		"export_img": "Export",
          		"save_doc": "Αποθήκευση εικόνας",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Στοίχισηκάτω",
          		"align_center": "Στοίχισηστοκέντρο",
          		"align_left": "Στοίχισηαριστερά",
          		"align_middle": "Ευθυγράμμιση Μέση",
          		"align_right": "Στοίχισηδεξιά",
          		"align_top": "Στοίχισηπάνω",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Εργαλείομολυβιού",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Δωρεάν-Hand ορθογώνιο",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Κύκλος",
          		"mode_fhellipse": "Δωρεάν-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Κείμενο Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Αναίρεση",
          		"redo": "Redo",
          		"tool_source": "Επεξεργασία Πηγή",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Ομάδα Στοιχεία",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Κατάργηση ομαδοποίησης Στοιχεία",
          		"docprops": "Ιδιότητες εγγράφου",
          		"imagelib": "Image Library",
          		"move_bottom": "Μετακίνηση προς τα κάτω",
          		"move_top": "Μετακίνηση στην αρχή",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Αποθηκεύω",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Διαγραφήστρώματος",
          		"move_down": "Μετακίνηση Layer Down",
          		"new": "Νέο Layer",
          		"rename": "Μετονομασία Layer",
          		"move_up": "Μετακίνηση Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Επιλογή προκαθορισμένων:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.en.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "en",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click to change fill color, shift-click to change stroke color",
          		"zoom_level": "Change zoom level",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change fill color",
          		"stroke_color": "Change stroke color",
          		"stroke_style": "Change stroke dash style",
          		"stroke_width": "Change stroke width by 1, shift-click to change by 0.1",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Change rotation angle",
          		"blur": "Change gaussian blur value",
          		"opacity": "Change selected item opacity",
          		"circle_cx": "Change circle's cx coordinate",
          		"circle_cy": "Change circle's cy coordinate",
          		"circle_r": "Change circle's radius",
          		"ellipse_cx": "Change ellipse's cx coordinate",
          		"ellipse_cy": "Change ellipse's cy coordinate",
          		"ellipse_rx": "Change ellipse's x radius",
          		"ellipse_ry": "Change ellipse's y radius",
          		"line_x1": "Change line's starting x coordinate",
          		"line_x2": "Change line's ending x coordinate",
          		"line_y1": "Change line's starting y coordinate",
          		"line_y2": "Change line's ending y coordinate",
          		"rect_height": "Change rectangle height",
          		"rect_width": "Change rectangle width",
          		"corner_radius": "Change Rectangle Corner Radius",
          		"image_width": "Change image width",
          		"image_height": "Change image height",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Change text contents",
          		"font_family": "Change Font Family",
          		"font_size": "Change Font Size",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color/opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit to all content",
          		"fit_to_canvas": "Fit to canvas",
          		"fit_to_layer_content": "Fit to layer content",
          		"fit_to_sel": "Fit to selection",
          		"align_relative_to": "Align relative to ...",
          		"relativeTo": "relative to:",
          		"page": "page",
          		"largest_object": "largest object",
          		"selected_objects": "selected objects",
          		"smallest_object": "smallest object",
          		"new_doc": "New Image",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Align Center",
          		"align_left": "Align Left",
          		"align_middle": "Align Middle",
          		"align_right": "Align Right",
          		"align_top": "Align Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Apply Changes",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Move Layer Up",
          		"move_down": "Move Layer Down",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefined:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer \"%s\"?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.es.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "es",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Cancelar",
          		"key_backspace": "retroceso", 
          		"key_del": "suprimir", 
          		"key_down": "abajo", 
          		"key_up": "arriba", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Mostrar/ocultar herramientas de trazo adicionales",
          		"palette_info": "Haga clic para cambiar el color de relleno. Pulse Mayús y haga clic para cambiar el color del contorno.",
          		"zoom_level": "Cambiar el nivel de zoom",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Cambiar el color de relleno",
          		"stroke_color": "Cambiar el color del contorno",
          		"stroke_style": "Cambiar el estilo del trazo del contorno",
          		"stroke_width": "Cambiar el grosor del contorno",
          		"pos_x": "Cambiar la posición horizontal X",
          		"pos_y": "Cambiar la posición vertical Y",
          		"linecap_butt": "Final de la línea: en el nodo",
          		"linecap_round": "Final de la línea: redondeada",
          		"linecap_square": "Final de la línea: cuadrada",
          		"linejoin_bevel": "Unión: biselada",
          		"linejoin_miter": "Unión: recta",
          		"linejoin_round": "Unión: redondeada",
          		"angle": "Cambiar ángulo de rotación",
          		"blur": "Ajustar desenfoque gausiano",
          		"opacity": "Cambiar la opacidad del objeto seleccionado",
          		"circle_cx": "Cambiar la posición horizonral CX del círculo",
          		"circle_cy": "Cambiar la posición vertical CY del círculo",
          		"circle_r": "Cambiar el radio del círculo",
          		"ellipse_cx": "Cambiar la posición horizontal CX de la elipse",
          		"ellipse_cy": "Cambiar la posición vertical CY de la elipse",
          		"ellipse_rx": "Cambiar el radio horizontal X de la elipse",
          		"ellipse_ry": "Cambiar el radio vertical Y de la elipse",
          		"line_x1": "Cambiar la posición horizontal X del comienzo de la línea",
          		"line_x2": "Cambiar la posición horizontal X del final de la línea",
          		"line_y1": "Cambiar la posición vertical Y del comienzo de la línea",
          		"line_y2": "Cambiar la posición vertical Y del final de la línea",
          		"rect_height": "Cambiar la altura del rectángulo",
          		"rect_width": "Cambiar el ancho rectángulo",
          		"corner_radius": "Cambiar el radio de las esquinas del rectángulo",
          		"image_width": "Cambiar el ancho de la imagen",
          		"image_height": "Cambiar la altura de la imagen",
          		"image_url": "Modificar URL",
          		"node_x": "Cambiar la posición horizontal X del nodo",
          		"node_y": "Cambiar la posición vertical Y del nodo",
          		"seg_type": "Cambiar el tipo de segmento",
          		"straight_segments": "Recta",
          		"curve_segments": "Curva",
          		"text_contents": "Modificar el texto",
          		"font_family": "Tipo de fuente",
          		"font_size": "Tamaño de la fuente",
          		"bold": "Texto en negrita",
          		"italic": "Texto en cursiva"
          	},
          	tools: { 
          		"main_menu": "Menú principal",
          		"bkgnd_color_opac": "Cambiar color de fondo / opacidad",
          		"connector_no_arrow": "Sin flecha",
          		"fitToContent": "Ajustar al contenido",
          		"fit_to_all": "Ajustar a todo el contenido",
          		"fit_to_canvas": "Ajustar al lienzo",
          		"fit_to_layer_content": "Ajustar al contenido de la capa",
          		"fit_to_sel": "Ajustar a la selección",
          		"align_relative_to": "Alinear con respecto a ...",
          		"relativeTo": "en relación con:",
          		"Página": "Página",
          		"largest_object": "El objeto más grande",
          		"selected_objects": "Objetos seleccionados",
          		"smallest_object": "El objeto más pequeño",
          		"new_doc": "Nueva imagen",
          		"open_doc": "Abrir imagen",
          		"export_img": "Export",
          		"save_doc": "Guardar imagen",
          		"import_doc": "Importar un archivo SVG",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Alinear parte inferior",
          		"align_center": "Centrar verticalmente",
          		"align_left": "Alinear lado izquierdo",
          		"align_middle": "Centrar horizontalmente",
          		"align_right": "Alinear lado derecho",
          		"align_top": "Alinear parte superior",
          		"mode_select": "Herramienta de selección",
          		"mode_fhpath": "Herramienta de lápiz",
          		"mode_line": "Trazado de líneas",
          		"mode_connect": "Conectar dos objetos",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Rectángulo a mano alzada",
          		"mode_ellipse": "Elipse",
          		"mode_circle": "Círculo",
          		"mode_fhellipse": "Elipse a mano alzada",
          		"mode_path": "Herramienta de trazado",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Insertar texto",
          		"mode_image": "Insertar imagen",
          		"mode_zoom": "Zoom",
          		"mode_eyedropper": "Herramienta de pipeta",
          		"no_embed": "NOTA: La imagen no puede ser integrada. El contenido mostrado dependerá de la imagen ubicada en esta ruta. ",
          		"undo": "Deshacer",
          		"redo": "Rehacer",
          		"tool_source": "Editar código fuente",
          		"wireframe_mode": "Modo marco de alambre",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Agrupar objetos",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convertir a trazado",
          		"reorient_path": "Reorientar el trazado",
          		"ungroup": "Desagrupar objetos",
          		"docprops": "Propiedades del documento",
          		"imagelib": "Image Library",
          		"move_bottom": "Mover abajo",
          		"move_top": "Mover arriba",
          		"node_clone": "Clonar nodo",
          		"node_delete": "Suprimir nodo",
          		"node_link": "Enlazar puntos de control",
          		"add_subpath": "Añadir subtrazado",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Aplicar cambios",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"suprimir": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Capa",
          		"layers": "Layers",
          		"del": "Suprimir capa",
          		"move_down": "Mover la capa hacia abajo",
          		"new": "Nueva capa",
          		"rename": "Renombrar capa",
          		"move_up": "Mover la capa hacia arriba",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Desplazar objetos a:",
          		"move_selected": "Mover los objetos seleccionados a otra capa"
          	},
          	config: {
          		"image_props": "Propiedades de la Imagen",
          		"doc_title": "Título",
          		"doc_dims": "Tamaño del lienzo",
          		"included_images": "Imágenes integradas",
          		"image_opt_embed": "Integrar imágenes en forma de datos (archivos locales)",
          		"image_opt_ref": "Usar la referencia del archivo",
          		"editor_prefs": "Preferencias del Editor",
          		"icon_size": "Tamaño de los iconos",
          		"language": "Idioma",
          		"background": "Fondo del editor",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Nota: El fondo no se guardará junto con la imagen.",
          		"icon_large": "Grande",
          		"icon_medium": "Mediano",
          		"icon_small": "Pequeño",
          		"icon_xlarge": "Muy grande",
          		"select_predefined": "Seleccionar predefinido:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Valor no válido",
          		"noContentToFitTo":"No existe un contenido al que ajustarse.",
          		"dupeLayerName":"¡Ya existe una capa con este nombre!",
          		"enterUniqueLayerName":"Introduzca otro nombre distinto para la capa.",
          		"enterNewLayerName":"Introduzca el nuevo nombre de la capa.",
          		"layerHasThatName":"El nombre introducido es el nombre actual de la capa.",
          		"QmoveElemsToLayer":"¿Desplazar los elementos seleccionados a la capa '%s'?",
          		"QwantToClear":"¿Desea borrar el dibujo?\n¡El historial de acciones también se borrará!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Existen errores sintácticos en su código fuente SVG.\n¿Desea volver al código fuente SVG original?",
          		"QignoreSourceChanges":"¿Desea ignorar los cambios realizados sobre el código fuente SVG?",
          		"featNotSupported":"Función no compatible.",
          		"enterNewImgURL":"Introduzca la nueva URL de la imagen.",
          		"defsFailOnSave": "NOTA: Debido a un fallo de su navegador, es posible que la imagen aparezca de forma incorrecta (ciertas gradaciones o elementos podría perderse). La imagen aparecerá en su forma correcta una vez guardada.",
          		"loadingImage":"Cargando imagen. Espere, por favor.",
          		"saveFromBrowser": "Seleccionar \"Guardar como...\" en su navegador para guardar la imagen en forma de archivo %s.",
          		"noteTheseIssues": "Existen además los problemas siguientes:",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.et.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "et",
          	dir : "ltr",
          	common: {
          		"ok": "Salvestama",
          		"cancel": "Tühista",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click muuta täitke värvi, Shift-nuppu, et muuta insult värvi",
          		"zoom_level": "Muuda suumi taset",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Muuda täitke värvi",
          		"stroke_color": "Muuda insult värvi",
          		"stroke_style": "Muuda insult kriips stiil",
          		"stroke_width": "Muuda insult laius",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Muuda Pöördenurk",
          		"blur": "Change gaussian blur value",
          		"opacity": "Muuda valitud elemendi läbipaistmatus",
          		"circle_cx": "Muuda ringi&#39;s cx kooskõlastada",
          		"circle_cy": "Muuda ringi&#39;s cy kooskõlastada",
          		"circle_r": "Muuda ring on raadiusega",
          		"ellipse_cx": "Muuda ellips&#39;s cx kooskõlastada",
          		"ellipse_cy": "Muuda ellips&#39;s cy kooskõlastada",
          		"ellipse_rx": "Muuda ellips&#39;s x raadius",
          		"ellipse_ry": "Muuda ellips&#39;s y raadius",
          		"line_x1": "Muuda rööbastee algab x-koordinaadi",
          		"line_x2": "Muuda Line lõpeb x-koordinaadi",
          		"line_y1": "Muuda rööbastee algab y-koordinaadi",
          		"line_y2": "Muuda Line lõppenud y-koordinaadi",
          		"rect_height": "Muuda ristküliku kõrgus",
          		"rect_width": "Muuda ristküliku laius",
          		"corner_radius": "Muuda ristkülik Nurgakabe Raadius",
          		"image_width": "Muuda pilt laius",
          		"image_height": "Muuda pilt kõrgus",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Muuda teksti sisu",
          		"font_family": "Muutke Kirjasinperhe",
          		"font_size": "Change font size",
          		"bold": "Rasvane kiri",
          		"italic": "Kursiiv"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Muuda tausta värvi / läbipaistmatus",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Sobita kogu sisu",
          		"fit_to_canvas": "Sobita lõuend",
          		"fit_to_layer_content": "Sobita kiht sisu",
          		"fit_to_sel": "Fit valiku",
          		"align_relative_to": "Viia võrreldes ...",
          		"relativeTo": "võrreldes:",
          		"lehekülg": "lehekülg",
          		"largest_object": "suurim objekt",
          		"selected_objects": "valitud objektide",
          		"smallest_object": "väikseim objekt",
          		"new_doc": "Uus pilt",
          		"open_doc": "Pildi avamine",
          		"export_img": "Export",
          		"save_doc": "Salvesta pilt",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Viia Bottom",
          		"align_center": "Keskele joondamine",
          		"align_left": "Vasakjoondus",
          		"align_middle": "Viia Lähis -",
          		"align_right": "Paremjoondus",
          		"align_top": "Viia Üles",
          		"mode_select": "Vali Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Online-Hand Ristkülik",
          		"mode_ellipse": "Ellips",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Online-Hand Ellips",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Tekst Tool",
          		"mode_image": "Pilt Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Muuda Allikas",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Rühma elemendid",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Lõhu Elements",
          		"docprops": "Dokumendi omadused",
          		"imagelib": "Image Library",
          		"move_bottom": "Liiguta alla",
          		"move_top": "Liiguta üles",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Salvestama",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Kustuta Kiht",
          		"move_down": "Liiguta kiht alla",
          		"new": "Uus kiht",
          		"rename": "Nimeta kiht",
          		"move_up": "Liiguta kiht üles",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Valige eelmääratletud:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.fa.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "fa",
          	dir : "ltr",
          	common: {
          		"ok": "‫تأیید‬",
          		"cancel": "‫لغو‬",
          		"key_backspace": "‫پس بر ‬", 
          		"key_del": "‫حذف ‬", 
          		"key_down": "‫پایین ‬", 
          		"key_up": "‫بالا ‬", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "‫برای تغییر رنگ، کلیک کنید. برای تغییر رنگ لبه، کلید تبدیل (shift) را فشرده و کلیک کنید‬",
          		"zoom_level": "‫تغییر بزرگ نمایی‬",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "‫تغییر رنگ‬",
          		"stroke_color": "‫تغییر رنگ لبه‬",
          		"stroke_style": "‫تغییر نقطه چین لبه‬",
          		"stroke_width": "‫تغییر عرض لبه‬",
          		"pos_x": "‫تغییر مختصات X‬",
          		"pos_y": "‫تغییر مختصات Y‬",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "‫تغییر زاویه چرخش‬",
          		"blur": "Change gaussian blur value",
          		"opacity": "‫تغییر تاری عنصر انتخاب شده‬",
          		"circle_cx": "‫تغییر مختصات cx دایره‬",
          		"circle_cy": "‫تغییر مختصات cy دایره‬",
          		"circle_r": "‫تغییر شعاع دایره‬",
          		"ellipse_cx": "‫تغییر مختصات cx بیضی‬",
          		"ellipse_cy": "‫تغییر مختصات cy بیضی‬",
          		"ellipse_rx": "‫تغییر شعاع rx بیضی‬",
          		"ellipse_ry": "‫تغییر شعاع ry بیضی‬",
          		"line_x1": "‫تغییر مختصات x آغاز خط‬",
          		"line_x2": "‫تغییر مختصات x پایان خط‬",
          		"line_y1": "‫تغییر مختصات y آغاز خط‬",
          		"line_y2": "‫تغییر مختصات y پایان خط‬",
          		"rect_height": "‫تغییر ارتفاع مستطیل‬",
          		"rect_width": "‫تغییر عرض مستطیل‬",
          		"corner_radius": "‫شعاع گوشه:‬",
          		"image_width": "‫تغییر عرض تصویر‬",
          		"image_height": "‫تغییر ارتفاع تصویر‬",
          		"image_url": "‫تغییر نشانی وب (url)‬",
          		"node_x": "‫تغییر مختصات x نقطه‬",
          		"node_y": "‫تغییر مختصات y نقطه‬",
          		"seg_type": "‫تغییر نوع قطعه (segment)‬",
          		"straight_segments": "‫مستقیم‬",
          		"curve_segments": "‫منحنی‬",
          		"text_contents": "‫تغییر محتویات متن‬",
          		"font_family": "‫تغییر خانواده قلم‬",
          		"font_size": "‫تغییر اندازه قلم‬",
          		"bold": "‫متن توپر ‬",
          		"italic": "‫متن کج ‬"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "‫تغییر رنگ پس زمینه / تاری‬",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "‫هم اندازه شدن با محتوا‬",
          		"fit_to_all": "‫هم اندازه شدن با همه محتویات‬",
          		"fit_to_canvas": "‫هم اندازه شدن با صفحه مجازی (بوم)‬",
          		"fit_to_layer_content": "‫هم اندازه شدن با محتوای لایه‬",
          		"fit_to_sel": "‫هم اندازه شدن با اشیاء انتخاب شده‬",
          		"align_relative_to": "‫تراز نسبت به ...‬",
          		"relativeTo": "‫نسبت به:‬",
          		"‫صفحه‬": "‫صفحه‬",
          		"largest_object": "‫بزرگترین شئ‬",
          		"selected_objects": "‫اشیاء انتخاب شده‬",
          		"smallest_object": "‫کوچکترین شئ‬",
          		"new_doc": "‫تصویر جدید ‬",
          		"open_doc": "‫باز کردن تصویر ‬",
          		"export_img": "Export",
          		"save_doc": "‫ذخیره تصویر ‬",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "‫تراز پایین‬",
          		"align_center": "‫وسط چین‬",
          		"align_left": "‫چپ چین‬",
          		"align_middle": "‫تراز میانه‬",
          		"align_right": "‫راست چین‬",
          		"align_top": "‫تراز بالا‬",
          		"mode_select": "‫ابزار انتخاب ‬",
          		"mode_fhpath": "‫ابزار مداد ‬",
          		"mode_line": "‫ابزار خط ‬",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "‫مستطیل با قابلیت تغییر پویا‬",
          		"mode_ellipse": "‫بیضی‬",
          		"mode_circle": "‫دایره‬",
          		"mode_fhellipse": "‫بیضی با قابلیت تغییر پویا‬",
          		"mode_path": "‫ابزار مسیر ‬",
          		"mode_shapelib": "Shape library",
          		"mode_text": "‫ابزار متن ‬",
          		"mode_image": "‫ابزار تصویر ‬",
          		"mode_zoom": "‫ابزار بزرگ نمایی ‬",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "‫واگرد ‬",
          		"redo": "‫ازنو ‬",
          		"tool_source": "‫ویرایش منبع ‬",
          		"wireframe_mode": "‫حالت نمایش لبه ها ‬",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "‫قرار دادن عناصر در گروه ‬",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "‫تبدیل به مسیر‬",
          		"reorient_path": "‫جهت دهی مجدد مسیر‬",
          		"ungroup": "‫خارج کردن عناصر از گروه ‬",
          		"docprops": "‫مشخصات سند ‬",
          		"imagelib": "Image Library",
          		"move_bottom": "‫انتقال به پایین ترین ‬",
          		"move_top": "‫انتقال به بالاترین ‬",
          		"node_clone": "‫ایجاد کپی از نقطه‬",
          		"node_delete": "‫حذف نقطه‬",
          		"node_link": "‫پیوند دادن نقاط کنترل‬",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "‫اعمال تغییرات‬",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"‫حذف ‬": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"‫لایه‬",
          		"layers": "Layers",
          		"del": "‫حذف لایه‬",
          		"move_down": "‫انتقال لایه به پایین‬",
          		"new": "‫لایه جدید‬",
          		"rename": "‫تغییر نام لایه‬",
          		"move_up": "‫انتقال لایه به بالا‬",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "‫انتقال عناصر به:‬",
          		"move_selected": "‫انتقال عناصر انتخاب شده به یک لایه متفاوت‬"
          	},
          	config: {
          		"image_props": "‫مشخصات تصویر‬",
          		"doc_title": "‫عنوان‬",
          		"doc_dims": "‫ابعاد صفحه مجازی (بوم)‬",
          		"included_images": "‫تصاویر گنجانده شده‬",
          		"image_opt_embed": "‫داده های جای داده شده (پرونده های محلی)‬",
          		"image_opt_ref": "‫استفاده از ارجاع به پرونده‬",
          		"editor_prefs": "‫تنظیمات ویراستار‬",
          		"icon_size": "‫اندازه شمایل‬",
          		"language": "‫زبان‬",
          		"background": "‫پس زمینه ویراستار‬",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "‫توجه: پس زمینه همراه تصویر ذخیره نخواهد شد.‬",
          		"icon_large": "‫بزرگ‬",
          		"icon_medium": "‫متوسط‬",
          		"icon_small": "‫کوچک‬",
          		"icon_xlarge": "‫خیلی بزرگ‬",
          		"select_predefined": "‫از پیش تعریف شده را انتخاب کنید:‬",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"‫مقدار داده شده نامعتبر است‬",
          		"noContentToFitTo":"‫محتوایی برای هم اندازه شدن وجود ندارد‬",
          		"dupeLayerName":"‫لایه ای با آن نام وجود دارد!‬",
          		"enterUniqueLayerName":"‫لطفا یک نام لایه یکتا انتخاب کنید‬",
          		"enterNewLayerName":"‫لطفا نام لایه جدید را وارد کنید‬",
          		"layerHasThatName":"‫لایه از قبل آن نام را دارد‬",
          		"QmoveElemsToLayer":"‫عناصر انتخاب شده به لایه '%s' منتقل شوند؟‬",
          		"QwantToClear":"‫آیا مطمئن هستید که می خواهید نقاشی را پاک کنید؟\nاین عمل باعث حذف تاریخچه واگرد شما خواهد شد!‬",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"‫در منبع SVG شما خطاهای تجزیه (parse) وجود داشت.\nبه منبع SVG اصلی بازگردانده شود؟‬",
          		"QignoreSourceChanges":"‫تغییرات اعمال شده در منبع SVG نادیده گرفته شوند؟‬",
          		"featNotSupported":"‫این ویژگی پشتیبانی نشده است‬",
          		"enterNewImgURL":"‫نشانی وب (url) تصویر جدید را وارد کنید‬",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.fi.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "fi",
          	dir : "ltr",
          	common: {
          		"ok": "Tallentaa",
          		"cancel": "Peruuta",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klikkaa muuttaa täyttöväri, Shift-click vaihtaa aivohalvauksen väriä",
          		"zoom_level": "Muuta suurennustaso",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Muuta täyttöväri",
          		"stroke_color": "Muuta aivohalvaus väri",
          		"stroke_style": "Muuta aivohalvaus Dash tyyli",
          		"stroke_width": "Muuta aivohalvaus leveys",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Muuta kiertokulma",
          		"blur": "Change gaussian blur value",
          		"opacity": "Muuta valitun kohteen läpinäkyvyys",
          		"circle_cx": "Muuta Circlen CX koordinoida",
          		"circle_cy": "Muuta Circlen CY koordinoida",
          		"circle_r": "Muuta ympyrän säde",
          		"ellipse_cx": "Muuta ellipsi&#39;s CX koordinoida",
          		"ellipse_cy": "Muuta ellipsi&#39;s CY koordinoida",
          		"ellipse_rx": "Muuta ellipsi&#39;s x säde",
          		"ellipse_ry": "Muuta ellipsi n y säde",
          		"line_x1": "Muuta Linen alkaa x-koordinaatti",
          		"line_x2": "Muuta Linen päättyy x koordinoida",
          		"line_y1": "Muuta Linen alkaa y-koordinaatti",
          		"line_y2": "Muuta Linen päättyy y koordinoida",
          		"rect_height": "Muuta suorakaiteen korkeus",
          		"rect_width": "Muuta suorakaiteen leveys",
          		"corner_radius": "Muuta suorakaide Corner Säde",
          		"image_width": "Muuta kuvan leveys",
          		"image_height": "Muuta kuvan korkeus",
          		"image_url": "Muuta URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Muuta tekstin sisältö",
          		"font_family": "Muuta Font Family",
          		"font_size": "Muuta fontin kokoa",
          		"bold": "Lihavoitu teksti",
          		"italic": "Kursivoitu"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Vaihda taustaväri / sameuden",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Sovita Content",
          		"fit_to_all": "Sovita kaikki content",
          		"fit_to_canvas": "Sovita kangas",
          		"fit_to_layer_content": "Sovita kerros sisältöön",
          		"fit_to_sel": "Sovita valinta",
          		"align_relative_to": "Kohdista suhteessa ...",
          		"relativeTo": "suhteessa:",
          		"sivulta": "sivulta",
          		"largest_object": "Suurin kohde",
          		"selected_objects": "valittujen objektien",
          		"smallest_object": "pienin kohde",
          		"new_doc": "Uusi kuva",
          		"open_doc": "Avaa kuva",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Keskitä",
          		"align_left": "Tasaa vasemmalle",
          		"align_middle": "Kohdista Lähi",
          		"align_right": "Tasaa oikealle",
          		"align_top": "Kohdista Top",
          		"mode_select": "Valitse työkalu",
          		"mode_fhpath": "Kynätyökalu",
          		"mode_line": "Viivatyökalulla",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand suorakaide",
          		"mode_ellipse": "Soikion",
          		"mode_circle": "Ympyrään",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Työkalua",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Suurennustyökalu",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Kumoa",
          		"redo": "Tulppaamalla ilmakanavan",
          		"tool_source": "Muokkaa lähdekoodipaketti",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Tuoteryhmään Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Asiakirjan ominaisuudet",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Tallentaa",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Poista Layer",
          		"move_down": "Siirrä Layer alas",
          		"new": "New Layer",
          		"rename": "Nimeä Layer",
          		"move_up": "Siirrä Layer",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Valitse ennalta:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.fr.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "fr",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Annuler",
          		"key_backspace": "Suppr.", 
          		"key_del": "Retour Arr.", 
          		"key_down": "Bas", 
          		"key_up": "Haut", 
          		"more_opts": "Plus d'options",
          		"url": "URL",
          		"width": "Largeur",
          		"height": "Hauteur"
          	},
          	misc: {
          		"powered_by": "Propulsé par"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Montrer/Cacher plus d'outils de Contour",
          		"palette_info": "Cliquer pour changer la couleur de remplissage, Maj-Clic pour changer la couleur de contour",
          		"zoom_level": "Changer le niveau de zoom",
          		"panel_drag": "Tirer vers la gauche/droite pour redimentionner le panneau"
          	},
          	properties: {
          		"id": "Identifier l'élément",
          		"fill_color": "Changer la couleur de remplissage",
          		"stroke_color": "Changer la couleur du contour",
          		"stroke_style": "Changer le style du contour",
          		"stroke_width": "Changer la largeur du contour de 1, Shift-Click pour changer la largeur de 0.1",
          		"pos_x": "Changer la position horizontale X",
          		"pos_y": "Changer la position verticale Y",
          		"linecap_butt": "Terminaison : Sur le nœud",
          		"linecap_round": "Terminaison : Arrondie",
          		"linecap_square": "Terminaison : Carrée",
          		"linejoin_bevel": "Raccord : Biseauté",
          		"linejoin_miter": "Raccord : Droit",
          		"linejoin_round": "Raccord : Arrondi",
          		"angle": "Changer l'angle de rotation",
          		"blur": "Changer la valeur du flou gaussien",
          		"opacity": "Changer l'opacité de l'élément sélectionné",
          		"circle_cx": "Changer la position horizontale cx du cercle",
          		"circle_cy": "Changer la position verticale cy du cercle",
          		"circle_r": "Changer le rayon du cercle",
          		"ellipse_cx": "Changer la position horizontale cx de l'ellipse",
          		"ellipse_cy": "Changer la position verticale cy de l'ellipse",
          		"ellipse_rx": "Changer le rayon horizontal x de l'ellipse",
          		"ellipse_ry": "Changer le rayon vertical y de l'ellipse",
          		"line_x1": "Changer la position horizontale x de début de la ligne",
          		"line_x2": "Changer la position horizontale x de fin de la ligne",
          		"line_y1": "Changer la position verticale y de début de la ligne",
          		"line_y2": "Changer la position verticale y de fin de la ligne",
          		"rect_height": "Changer la hauteur du rectangle",
          		"rect_width": "Changer la largeur du rectangle",
          		"corner_radius": "Changer le rayon des coins du rectangle",
          		"image_width": "Changer la largeur de l'image",
          		"image_height": "Changer la hauteur de l'image",
          		"image_url": "Modifier l'URL",
          		"node_x": "Changer la positon horizontale x du nœud",
          		"node_y": "Changer la position verticale y du nœud",
          		"seg_type": "Changer le type du Segment",
          		"straight_segments": "Droit",
          		"curve_segments": "Courbe",
          		"text_contents": "Changer le contenu du texte",
          		"font_family": "Changer la famille de police",
          		"font_size": "Changer la taille de la police",
          		"bold": "Texte en gras",
          		"italic": "Texte en italique"
          	},
          	tools: { 
          		"main_menu": "Menu principal",
          		"bkgnd_color_opac": "Changer la couleur d'arrière-plan / l'opacité",
          		"connector_no_arrow": "Sans flèches",
          		"fitToContent": "Ajuster au contenu",
          		"fit_to_all": "Ajuster au contenu de tous les calques",
          		"fit_to_canvas": "Ajuster au canevas",
          		"fit_to_layer_content": "Ajuster au contenu du calque",
          		"fit_to_sel": "Ajuster à la sélection",
          		"align_relative_to": "Aligner par rapport à ...",
          		"relativeTo": "Relativement à:",
          		"Page": "Page",
          		"largest_object": "Objet plus gros ",
          		"selected_objects": "Objets sélectionnés",
          		"smallest_object": "Objet plus petit",
          		"new_doc": "Nouvelle image",
          		"open_doc": "Ouvrir une image",
          		"export_img": "Export",
          		"save_doc": "Enregistrer l'image",
          		"import_doc": "Importer un objet SVG",
          		"align_to_page": "Aligner l'élément relativement à la Page",
          		"align_bottom": "Aligner le bas des objets",
          		"align_center": "Centrer verticalement",
          		"align_left": "Aligner les côtés gauches",
          		"align_middle": "Centrer horizontalement",
          		"align_right": "Aligner les côtés droits",
          		"align_top": "Aligner le haut des objets",
          		"mode_select": "Outil de sélection",
          		"mode_fhpath": "Crayon à main levée",
          		"mode_line": "Tracer des lignes",
          		"mode_connect": "Connecter deux objets",
          		"mode_rect": "Outil rectangle",
          		"mode_square": "Outils carré",
          		"mode_fhrect": "Rectangle main levée",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Cercle",
          		"mode_fhellipse": "Ellipse main levée",
          		"mode_path": "Dessiner un tracé",
          		"mode_shapelib": "Bibliothèque d'images",
          		"mode_text": "Outil Texte",
          		"mode_image": "Outil Image",
          		"mode_zoom": "Zoom",
          		"mode_eyedropper": "Outil Pipette",
          		"no_embed": "NOTE: Cette image ne peut être incorporée en tant que données. Le contenu affiché sera celui de l'image située à cette adresse",
          		"undo": "Annuler l'action",
          		"redo": "Refaire l'action",
          		"tool_source": "Modifier la source",
          		"wireframe_mode": "Mode Fil de Fer",
          		"toggle_grid": "Montrer/cacher la grille",
          		"clone": "Cloner élement(s)",
          		"del": "Supprimer élement(s)",
          		"group_elements": "Grouper les éléments",
          		"make_link": "Créer hyperlien",
          		"set_link_url": "Définir le lien URL (laisser vide pour supprimer)",
          		"to_path": "Convertir en tracé",
          		"reorient_path": "Réorienter le tracé",
          		"ungroup": "Dégrouper les éléments",
          		"docprops": "Propriétés du document",
          		"imagelib": "Bibliothèque d'images",
          		"move_bottom": "Déplacer vers le bas",
          		"move_top": "Déplacer vers le haut",
          		"node_clone": "Cloner le nœud",
          		"node_delete": "Supprimer le nœud",
          		"node_link": "Rendre les points de contrôle solidaires",
          		"add_subpath": "Ajouter un tracé secondaire",
          		"openclose_path": "Ouvrir/Fermer sous-chemin",
          		"source_save": "Appliquer Modifications",
          		"cut": "Couper",
          		"copy": "Copier",
          		"paste": "Coller",
          		"paste_in_place": "Coller sur place",
          		"Retour Arr.": "Supprimer",
          		"group": "Group",
          		"move_front": "Placer au premier plan",
          		"move_up": "Avancer d'un plan",
          		"move_down": "Placer en arrière plan",
          		"move_back": "Reculer d'un plan"
          	},
          	layers: {
          		"layer":"Calque",
          		"layers": "Calques",
          		"del": "Supprimer le calque",
          		"move_down": "Descendre le calque",
          		"new": "Nouveau calque",
          		"rename": "Renommer le calque",
          		"move_up": "Monter le calque",
          		"dupe": "Dupliquer calque",
          		"merge_down": "Fusionner vers le bas",
          		"merge_all": "Tout fusionner",
          		"move_elems_to": "Déplacer éléments vers:",
          		"move_selected": "Déplacer les éléments sélectionnés vers un autre calque"
          	},
          	config: {
          		"image_props": "Propriétés de l'Image",
          		"doc_title": "Titre",
          		"doc_dims": "Dimensions du canevas",
          		"included_images": "Images incorporées",
          		"image_opt_embed": "Incorporer les images en tant que données (fichiers locaux)",
          		"image_opt_ref": "Utiliser la référence des images ",
          		"editor_prefs": "Préférences de l'Éditeur",
          		"icon_size": "Taille des icônes",
          		"language": "Langue",
          		"background": "Toile de fond de l'Éditeur",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: La toile de fond n'est pas sauvegardée avec l'image.",
          		"icon_large": "Grande",
          		"icon_medium": "Moyenne",
          		"icon_small": "Petite",
          		"icon_xlarge": "Super-Grande",
          		"select_predefined": "Sélectionner prédéfinis:",
          		"units_and_rulers": "Unités & Règles",
          		"show_rulers": "Afficher les règles",
          		"base_unit": "Unité de mesure:",
          		"grid": "Grille",
          		"snapping_onoff": "Épingler oui/non",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Couleur de la grille"
          	},
          	shape_cats: {
          		"basic": "Basique",
          		"object": "Objets",
          		"symbol": "Symboles",
          		"arrow": "Flèches",
          		"flowchart": "Diagramme de flux",
          		"animal": "Animaux",
          		"game": "Cartes & Echecs",
          		"dialog_balloon": "Bulles de dialogue",
          		"electronics": "Electronique",
          		"math": "Mathématiques",
          		"music": "Musique",
          		"misc": "Divers",
          		"raphael_1": "raphaeljs.com ensemble 1",
          		"raphael_2": "raphaeljs.com ensemble 2"
          	},
          	imagelib: {
          		"select_lib": "Choisir une image dans la bibliothèque",
          		"show_list": "Liste de la bibliotèque d'images",
          		"import_single": "Importation simple",
          		"import_multi": "Importation multiple",
          		"open": "Ouvrir en tant que nouveau document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Valeur fournie invalide",
          		"noContentToFitTo":"Il n'y a pas de contenu auquel ajuster",
          		"dupeLayerName":"Il existe déjà un calque de ce nom !",
          		"enterUniqueLayerName":"Veuillez entrer un nom (unique) pour le calque",
          		"enterNewLayerName":"Veuillez entrer le nouveau nom du calque",
          		"layerHasThatName":"Le calque porte déjà ce nom",
          		"QmoveElemsToLayer":"Déplacer les éléments sélectionnés vers le calque '%s' ?",
          		"QwantToClear":"Voulez-vous effacer le dessin ?\nL'historique de vos actions sera également effacé !",
          		"QwantToOpen":"Voulez-vous ouvrir un nouveau document?\nVous perderez l'historique de vos modifications!",
          		"QerrorsRevertToSource":"Il y a des erreurs d'analyse syntaxique dans votre code-source SVG.\nRevenir au code-source SVG avant modifications ?",
          		"QignoreSourceChanges":"Ignorer les modifications faites à la source SVG ?",
          		"featNotSupported":"Fonction non supportée",
          		"enterNewImgURL":"Entrer la nouvelle URL de l'image",
          		"defsFailOnSave": "NOTE : À cause d'un bug de votre navigateur, cette image peut être affichée de façon incorrecte (dégradés ou éléments manquants). Cependant, une fois enregistrée, elle sera correcte.",
          		"loadingImage":"Chargement de l'image, veuillez patienter...",
          		"saveFromBrowser": "Selectionner \"Enregistrer sous...\" dans votre navigateur pour sauvegarder l'image en tant que fichier %s.",
          		"noteTheseIssues": "Notez également les problèmes suivants : ",
          		"unsavedChanges": "Il y a des changements non sauvegardés.",
          		"enterNewLinkURL": "Entrez la nouvel hyperlien URL",
          		"errorLoadingSVG": "Erreur: Impossible de charger le document SVG",
          		"URLloadFail": "Impossible de charger l'URL",
          		"retrieving": "Récupère \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.fy.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "fy",
          	dir : "ltr",
          	common: {
          		"ok": "Ok",
          		"cancel": "Ôfbrekke",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "omleech", 
          		"key_up": "omheech", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klik om de folkleur te feroarjen, shift-klik om de linekleur te feroarjen.",
          		"zoom_level": "Yn-/útzoome",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Folkleur oanpasse",
          		"stroke_color": "Linekleur oanpasse",
          		"stroke_style": "Linestijl oanpasse",
          		"stroke_width": "Linebreedte oanpasse",
          		"pos_x": "X-koördinaat oanpasse",
          		"pos_y": "Y-koördinaat oanpasse",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Draaie",
          		"blur": "Change gaussian blur value",
          		"opacity": "Trochsichtigens oanpasse",
          		"circle_cx": "Feroarje it X-koördinaat fan it middelpunt fan'e sirkel.",
          		"circle_cy": "Feroarje it Y-koördinaat fan it middelpunt fan'e sirkel.",
          		"circle_r": "Feroarje sirkelradius",
          		"ellipse_cx": "Feroarje it X-koördinaat fan it middelpunt fan'e ellips.",
          		"ellipse_cy": "Feroarje it Y-koördinaat fan it middelpunt fan'e ellips.",
          		"ellipse_rx": "Feroarje ellips X radius",
          		"ellipse_ry": "Feroarje ellips Y radius",
          		"line_x1": "Feroarje start X koördinaat fan'e line",
          		"line_x2": "Feroarje ein X koördinaat fan'e line",
          		"line_y1": "Feroarje start Y koördinaat fan'e line",
          		"line_y2": "Feroarje ein Y koördinaat fan'e line",
          		"rect_height": "Hichte rjochthoeke oanpasse",
          		"rect_width": "Breedte rjochthoeke oanpasse",
          		"corner_radius": "Hoekeradius oanpasse",
          		"image_width": "Breedte ôfbielding oanpasse",
          		"image_height": "Hichte ôfbielding oanpasse",
          		"image_url": "URL oanpasse",
          		"node_x": "X-koördinaat knooppunt oanpasse",
          		"node_y": "Y-koördinaat knooppunt oanpasse",
          		"seg_type": "Segmenttype oanpasse",
          		"straight_segments": "Rjocht",
          		"curve_segments": "Bûcht",
          		"text_contents": "Tekst oanpasse",
          		"font_family": "Lettertype oanpasse",
          		"font_size": "Lettergrutte oanpasse",
          		"bold": "Fet",
          		"italic": "Skean"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Eftergrûnkleur/trochsichtigens oanpasse",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Passe op ynhâld",
          		"fit_to_all": "Op alle ynhâld passe",
          		"fit_to_canvas": "Op kanvas passe",
          		"fit_to_layer_content": "Op laachynhâld passe",
          		"fit_to_sel": "Op seleksje passe",
          		"align_relative_to": "Útlijne relatyf oan...",
          		"relativeTo": "Relatief tsjinoer:",
          		"Side": "Side",
          		"largest_object": "Grutste ûnderdiel",
          		"selected_objects": "Selektearre ûnderdielen",
          		"smallest_object": "Lytste ûnderdiel",
          		"new_doc": "Nije ôfbielding",
          		"open_doc": "Ôfbielding iepenje",
          		"export_img": "Export",
          		"save_doc": "Ôfbielding bewarje",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Ûnder útlijne",
          		"align_center": "Midden útlijne",
          		"align_left": "Lofts útlijne",
          		"align_middle": "Midden útlijne",
          		"align_right": "Rjochts útlijne",
          		"align_top": "Boppe útlijne",
          		"mode_select": "Selektearje",
          		"mode_fhpath": "Potlead",
          		"mode_line": "Line",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Frije rjochthoeke",
          		"mode_ellipse": "Ellips",
          		"mode_circle": "Sirkel",
          		"mode_fhellipse": "Frije ellips",
          		"mode_path": "Paad",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Tekst",
          		"mode_image": "Ôfbielding",
          		"mode_zoom": "Zoom",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Ungedien meitjse",
          		"redo": "Op 'e nij",
          		"tool_source": "Boarne oanpasse",
          		"wireframe_mode": "Triemodel",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Ûnderdielen groepearje",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Omsette nei paad",
          		"reorient_path": "Paad opnij orientearje",
          		"ungroup": "Groepering opheffe",
          		"docprops": "Dokuminteigenskippen",
          		"imagelib": "Image Library",
          		"move_bottom": "Nei eftergrûn",
          		"move_top": "Nei foargrûn",
          		"node_clone": "Knooppunt duplisearje",
          		"node_delete": "Knooppunt fuortsmite",
          		"node_link": "Knooppunten keppelje",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Feroarings tapasse",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Laach",
          		"layers": "Layers",
          		"del": "Laach fuortsmite",
          		"move_down": "Laach omleech bringe",
          		"new": "Nije laach",
          		"rename": "Laach omneame",
          		"move_up": "Laach omheech bringe",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Ûnderdielen ferplaate nei:",
          		"move_selected": "Selektearre ûnderdielen ferplaatse nei in oare laach"
          	},
          	config: {
          		"image_props": "Ôfbieldingseigenskippen",
          		"doc_title": "Titel",
          		"doc_dims": "Kanvasgrutte",
          		"included_images": "Ynslúten ôfbieldingen",
          		"image_opt_embed": "Ynformaasje tafoege (lokale triemen)",
          		"image_opt_ref": "Triemreferensje brûke",
          		"editor_prefs": "Eigenskippen bewurker",
          		"icon_size": "Ikoangrutte",
          		"language": "Taal",
          		"background": "Eftergrûn bewurker",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Let op: de eftergrûn wurd net mei de ôfbielding bewarre.",
          		"icon_large": "Grut",
          		"icon_medium": "Middel",
          		"icon_small": "Lyts",
          		"icon_xlarge": "Ekstra grut",
          		"select_predefined": "Selektearje:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Ferkearde waarde jûn",
          		"noContentToFitTo":"Gjin ynhâld om te passen",
          		"dupeLayerName":"Der is al in laach mei dy namme!",
          		"enterUniqueLayerName":"Type in unyke laachnamme",
          		"enterNewLayerName":"Type in nije laachnamme",
          		"layerHasThatName":"Laach hat dy namme al",
          		"QmoveElemsToLayer":"Selektearre ûnderdielen ferplaatse nei '%s'?",
          		"QwantToClear":"Ôfbielding leechmeitsje? Dit sil ek de skiednis fuortsmite!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Der wiene flaters yn de SVG-boarne.\nWeromgean nei foarige SVG-boarne?",
          		"QignoreSourceChanges":"Feroarings yn SVG-boarne negeare?",
          		"featNotSupported":"Funksje wurdt net ûndersteund",
          		"enterNewImgURL":"Jou de nije URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ga.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ga",
          	dir : "ltr",
          	common: {
          		"ok": "Sábháil",
          		"cancel": "Cealaigh",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Cliceáil chun athrú a líonadh dath, aistriú-cliceáil chun dath a athrú stróc",
          		"zoom_level": "Athraigh súmáil leibhéal",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Athraigh an dath a líonadh",
          		"stroke_color": "Dath stróc Athrú",
          		"stroke_style": "Athraigh an stíl Fleasc stróc",
          		"stroke_width": "Leithead stróc Athrú",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Uillinn rothlaithe Athrú",
          		"blur": "Change gaussian blur value",
          		"opacity": "Athraigh roghnaithe teimhneacht mír",
          		"circle_cx": "Athraigh an ciorcal a chomhordú CX",
          		"circle_cy": "Athraigh an ciorcal a chomhordú ga",
          		"circle_r": "Athraigh an ciorcal&#39;s ga",
          		"ellipse_cx": "Athraigh Éilips&#39;s CX a chomhordú",
          		"ellipse_cy": "Athraigh an Éilips a chomhordú ga",
          		"ellipse_rx": "Éilips Athraigh an gha x",
          		"ellipse_ry": "Éilips Athraigh an gha y",
          		"line_x1": "Athraigh an líne tosaigh a chomhordú x",
          		"line_x2": "Athraigh an líne deireadh x chomhordú",
          		"line_y1": "Athraigh an líne tosaigh a chomhordú y",
          		"line_y2": "Athrú ar líne deireadh y chomhordú",
          		"rect_height": "Airde dronuilleog Athrú",
          		"rect_width": "Leithead dronuilleog Athrú",
          		"corner_radius": "Athraigh Dronuilleog Cúinne na Ga",
          		"image_width": "Leithead íomhá Athrú",
          		"image_height": "Airde íomhá Athrú",
          		"image_url": "Athraigh an URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Inneachar Athraigh téacs",
          		"font_family": "Athraigh an Cló Teaghlaigh",
          		"font_size": "Athraigh Clómhéid",
          		"bold": "Trom Téacs",
          		"italic": "Iodálach Téacs"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Dath cúlra Athraigh / teimhneacht",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Laghdaigh do gach ábhar",
          		"fit_to_canvas": "Laghdaigh ar chanbhás",
          		"fit_to_layer_content": "Laghdaigh shraith ábhar a",
          		"fit_to_sel": "Laghdaigh a roghnú",
          		"align_relative_to": "Ailínigh i gcomparáid leis ...",
          		"relativeTo": "i gcomparáid leis:",
          		"leathanach": "leathanach",
          		"largest_object": "réad is mó",
          		"selected_objects": "réada tofa",
          		"smallest_object": "lú réad",
          		"new_doc": "Íomhá Nua",
          		"open_doc": "Íomhá Oscailte",
          		"export_img": "Export",
          		"save_doc": "Sábháil Íomhá",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Cineál Bun",
          		"align_center": "Ailínigh sa Lár",
          		"align_left": "Ailínigh ar Chlé",
          		"align_middle": "Cineál Middle",
          		"align_right": "Ailínigh ar Dheis",
          		"align_top": "Cineál Barr",
          		"mode_select": "Roghnaigh Uirlis",
          		"mode_fhpath": "Phionsail Uirlis",
          		"mode_line": "Uirlis Líne",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Saor Hand Dronuilleog",
          		"mode_ellipse": "Éilips",
          		"mode_circle": "Ciorcal",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Téacs Uirlis",
          		"mode_image": "Íomhá Uirlis",
          		"mode_zoom": "Zúmáil Uirlis",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Cealaigh",
          		"redo": "Athdhéan",
          		"tool_source": "Cuir Foinse",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Eilimintí Grúpa",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Eilimintí Díghrúpáil",
          		"docprops": "Doiciméad Airíonna",
          		"imagelib": "Image Library",
          		"move_bottom": "Téigh go Bun",
          		"move_top": "Téigh go Barr",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Sábháil",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Scrios Sraith",
          		"move_down": "Bog Sraith Síos",
          		"new": "Sraith Nua",
          		"rename": "Athainmnigh Sraith",
          		"move_up": "Bog Sraith Suas",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Roghnaigh réamhshainithe:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.gl.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "gl",
          	dir : "ltr",
          	common: {
          		"ok": "Gardar",
          		"cancel": "Cancelar",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Preme aquí para cambiar a cor de recheo, Shift-clic para cambiar a cor do curso",
          		"zoom_level": "Cambiar o nivel de zoom",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Cambia-la cor de recheo",
          		"stroke_color": "Cambiar a cor do curso",
          		"stroke_style": "Modifica o estilo do trazo do curso",
          		"stroke_width": "Cambiar o ancho do curso",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Cambiar o ángulo de xiro",
          		"blur": "Change gaussian blur value",
          		"opacity": "Cambia a opacidade elemento seleccionado",
          		"circle_cx": "Cx Cambiar círculo de coordenadas",
          		"circle_cy": "Círculo Cambio cy coordinar",
          		"circle_r": "Cambiar círculo de raio",
          		"ellipse_cx": "Cambiar elipse cx coordinar",
          		"ellipse_cy": "Elipse Cambio cy coordinar",
          		"ellipse_rx": "Raios X Change elipse",
          		"ellipse_ry": "Radio y Change elipse",
          		"line_x1": "Cambie a liña de partida coordenada x",
          		"line_x2": "Cambie a liña acaba coordenada x",
          		"line_y1": "Cambio na liña do recurso coordinada y",
          		"line_y2": "Salto de liña acaba coordinada y",
          		"rect_height": "Cambiar altura do rectángulo",
          		"rect_width": "Cambiar a largo rectángulo",
          		"corner_radius": "Cambiar Corner Rectangle Radius",
          		"image_width": "Cambiar o ancho da imaxe",
          		"image_height": "Cambiar altura da imaxe",
          		"image_url": "Cambiar URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Cambiar o contido de texto",
          		"font_family": "Cambiar fonte Familia",
          		"font_size": "Mudar tamaño de letra",
          		"bold": "Bold Text",
          		"italic": "Texto en cursiva"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Mudar a cor de fondo / Opacidade",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Axustar ó contido",
          		"fit_to_all": "Axustar a todo o contido",
          		"fit_to_canvas": "Axustar a pantalla",
          		"fit_to_layer_content": "Axustar o contido da capa de",
          		"fit_to_sel": "Axustar a selección",
          		"align_relative_to": "Aliñar en relación a ...",
          		"relativeTo": "en relación ao:",
          		"Portada": "Portada",
          		"largest_object": "maior obxecto",
          		"selected_objects": "obxectos elixidos",
          		"smallest_object": "menor obxecto",
          		"new_doc": "Nova Imaxe",
          		"open_doc": "Abrir Imaxe",
          		"export_img": "Export",
          		"save_doc": "Gardar Imaxe",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align bottom",
          		"align_center": "Centrar",
          		"align_left": "Aliñar á Esquerda",
          		"align_middle": "Aliñar Medio",
          		"align_right": "Aliñar á Dereita",
          		"align_top": "Align Top",
          		"mode_select": "Seleccionar a ferramenta",
          		"mode_fhpath": "Ferramenta Lapis",
          		"mode_line": "Ferramenta Liña",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Elipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Ferramenta de Texto",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Desfacer",
          		"redo": "Volver",
          		"tool_source": "Fonte Editar",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Elementos do grupo",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Elementos Desagrupadas",
          		"docprops": "Propriedades do Documento",
          		"imagelib": "Image Library",
          		"move_bottom": "Move a Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Gardar",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move capa inferior",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Seleccione por defecto:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.he.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "he",
          	dir : "ltr",
          	common: {
          		"ok": "לשמור",
          		"cancel": "ביטול",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "לחץ כדי לשנות צבע מילוי, לחץ על Shift-לשנות צבע שבץ",
          		"zoom_level": "שינוי גודל תצוגה",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "שינוי צבע מילוי",
          		"stroke_color": "שינוי צבע שבץ",
          		"stroke_style": "דש שבץ שינוי סגנון",
          		"stroke_width": "שינוי רוחב שבץ",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "שינוי זווית הסיבוב",
          		"blur": "Change gaussian blur value",
          		"opacity": "שינוי הפריט הנבחר אטימות",
          		"circle_cx": "CX מעגל של שנה לתאם",
          		"circle_cy": "מעגל שנה של cy לתאם",
          		"circle_r": "מעגל שנה של רדיוס",
          		"ellipse_cx": "שינוי של אליפסה CX לתאם",
          		"ellipse_cy": "אליפסה שינוי של cy לתאם",
          		"ellipse_rx": "אליפסה שינוי של רדיוס x",
          		"ellipse_ry": "אליפסה שינוי של Y רדיוס",
          		"line_x1": "שינוי קו ההתחלה של x לתאם",
          		"line_x2": "שינוי קו הסיום של x לתאם",
          		"line_y1": "שינוי קו ההתחלה של Y לתאם",
          		"line_y2": "שינוי קו הסיום של Y לתאם",
          		"rect_height": "שינוי גובה המלבן",
          		"rect_width": "שינוי רוחב המלבן",
          		"corner_radius": "לשנות מלבן פינת רדיוס",
          		"image_width": "שינוי רוחב התמונה",
          		"image_height": "שינוי גובה התמונה",
          		"image_url": "שינוי כתובת",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "שינוי תוכן טקסט",
          		"font_family": "שינוי גופן משפחה",
          		"font_size": "שנה גודל גופן",
          		"bold": "טקסט מודגש",
          		"italic": "טקסט נטוי"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "שנה את צבע הרקע / אטימות",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "התאם תוכן",
          		"fit_to_all": "התאם התכנים",
          		"fit_to_canvas": "התאם בד",
          		"fit_to_layer_content": "מתאים לתוכן שכבת",
          		"fit_to_sel": "התאם הבחירה",
          		"align_relative_to": "יישור ביחס ...",
          		"relativeTo": "יחסית:",
          		"דף": "דף",
          		"largest_object": "האובייקט הגדול",
          		"selected_objects": "elected objects",
          		"smallest_object": "הקטן אובייקט",
          		"new_doc": "תמונה חדשה",
          		"open_doc": "פתח תמונה",
          		"export_img": "Export",
          		"save_doc": "שמור תמונה",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "יישור תחתון",
          		"align_center": "ישור לאמצע",
          		"align_left": "יישור לשמאל",
          		"align_middle": "יישור התיכון",
          		"align_right": "יישור לימין",
          		"align_top": "יישור למעלה",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "כלי העיפרון",
          		"mode_line": "כלי הקו",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand מלבן",
          		"mode_ellipse": "אליפסה",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand אליפסה",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "כלי טקסט",
          		"mode_image": "כלי תמונה",
          		"mode_zoom": "זום כלי",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "בטל",
          		"redo": "בצע שוב",
          		"tool_source": "מקור ערוך",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "אלמנטים הקבוצה",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "אלמנטים פרק קבוצה",
          		"docprops": "מאפייני מסמך",
          		"imagelib": "Image Library",
          		"move_bottom": "הזז למטה",
          		"move_top": "עבור לראש הדף",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "לשמור",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "מחיקת שכבה",
          		"move_down": "הזז למטה שכבה",
          		"new": "שכבהחדשה",
          		"rename": "שינוי שם שכבה",
          		"move_up": "העבר שכבה Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "בחר מוגדרים מראש:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.hi.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "hi",
          	dir : "ltr",
          	common: {
          		"ok": "बचाना",
          		"cancel": "रद्द करें",
          		"key_backspace": "बैकस्पेस", 
          		"key_del": "हटायें", 
          		"key_down": "नीचे", 
          		"key_up": "ऊपर", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "रंग बदलने पर क्लिक करें, बदलाव भरने के क्लिक करने के लिए स्ट्रोक का रंग बदलने के लिए",
          		"zoom_level": "बदलें स्तर ज़ूम",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "बदलें का रंग भरना",
          		"stroke_color": "बदलें स्ट्रोक रंग",
          		"stroke_style": "बदलें स्ट्रोक डेश शैली",
          		"stroke_width": "बदलें स्ट्रोक चौड़ाई",
          		"pos_x": "X समकक्ष बदलें ",
          		"pos_y": "Y समकक्ष बदलें",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "बदलें रोटेशन कोण",
          		"blur": "Change gaussian blur value",
          		"opacity": "पारदर्शिता बदलें",
          		"circle_cx": "बदल रहा है चक्र cx समन्वय",
          		"circle_cy": "परिवर्तन चक्र cy समन्वय है",
          		"circle_r": "बदल रहा है चक्र त्रिज्या",
          		"ellipse_cx": "बदलें दीर्घवृत्त है cx समन्वय",
          		"ellipse_cy": "बदलें दीर्घवृत्त cy समन्वय है",
          		"ellipse_rx": "बदल रहा है दीर्घवृत्त x त्रिज्या",
          		"ellipse_ry": "बदल रहा है दीर्घवृत्त y त्रिज्या",
          		"line_x1": "बदल रहा है लाइन x समन्वय शुरू",
          		"line_x2": "बदल रहा है लाइन x समन्वय समाप्त",
          		"line_y1": "बदलें रेखा y शुरू हो रहा है समन्वय",
          		"line_y2": "बदलें रेखा y अंत है समन्वय",
          		"rect_height": "बदलें आयत ऊंचाई",
          		"rect_width": "बदलें आयत चौड़ाई",
          		"corner_radius": "बदलें आयत कॉर्नर त्रिज्या",
          		"image_width": "बदलें छवि चौड़ाई",
          		"image_height": "बदलें छवि ऊँचाई",
          		"image_url": "बदलें यूआरएल",
          		"node_x": "नोड का x समकक्ष बदलें",
          		"node_y": "नोड का y समकक्ष बदलें",
          		"seg_type": "वर्ग प्रकार बदलें",
          		"straight_segments": "सीधे वर्ग",
          		"curve_segments": "घुमाव",
          		"text_contents": "बदलें पाठ सामग्री",
          		"font_family": "बदलें फ़ॉन्ट परिवार",
          		"font_size": "फ़ॉन्ट का आकार बदलें",
          		"bold": "मोटा पाठ",
          		"italic": "इटैलिक पाठ"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "पृष्ठभूमि का रंग बदल / अस्पष्टता",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "सामग्री के लिए फिट",
          		"fit_to_all": "सभी सामग्री के लिए फिट",
          		"fit_to_canvas": "फिट कैनवास को",
          		"fit_to_layer_content": "फिट परत सामग्री के लिए",
          		"fit_to_sel": "चयन के लिए फिट",
          		"align_relative_to": "संरेखित करें रिश्तेदार को ...",
          		"relativeTo": "रिश्तेदार को:",
          		"पृष्ठ": "पृष्ठ",
          		"largest_object": "सबसे बड़ी वस्तु",
          		"selected_objects": "निर्वाचित वस्तुओं",
          		"smallest_object": "छोटी से छोटी वस्तु",
          		"new_doc": "नई छवि",
          		"open_doc": "छवि खोलें",
          		"export_img": "Export",
          		"save_doc": "सहेजें छवि",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "तलमेंपंक्तिबद्धकरें",
          		"align_center": "मध्य में समंजित करें",
          		"align_left": " पंक्तिबद्ध करें",
          		"align_middle": "मध्य संरेखित करें",
          		"align_right": "दायाँपंक्तिबद्धकरें",
          		"align_top": "शीर्षमेंपंक्तिबद्धकरें",
          		"mode_select": "उपकरण चुनें",
          		"mode_fhpath": "पेंसिल उपकरण",
          		"mode_line": "लाइन उपकरण",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "नि: शुल्क हाथ आयत",
          		"mode_ellipse": "दीर्घवृत्त",
          		"mode_circle": "वृत्त",
          		"mode_fhellipse": "नि: शुल्क हाथ दीर्घवृत्त",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "पाठ उपकरण",
          		"mode_image": "छवि उपकरण",
          		"mode_zoom": "ज़ूम उपकरण",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "पूर्ववत करें",
          		"redo": "फिर से करें",
          		"tool_source": "स्रोत में बदलाव करें",
          		"wireframe_mode": "रूपरेखा मोड",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "समूह तत्वों",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "पथ में बदलें",
          		"reorient_path": "पथ को नई दिशा दें",
          		"ungroup": "अंश को समूह से अलग करें",
          		"docprops": "दस्तावेज़ गुण",
          		"imagelib": "Image Library",
          		"move_bottom": "नीचे ले जाएँ",
          		"move_top": "ऊपर ले जाएँ",
          		"node_clone": "नोड क्लोन",
          		"node_delete": "नोड हटायें",
          		"node_link": "कड़ी नियंत्रण बिंदु",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "बचाना",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"हटायें": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"परत",
          		"layers": "Layers",
          		"del": "परत हटाएँ",
          		"move_down": "परत नीचे ले जाएँ",
          		"new": "नई परत",
          		"rename": "परत का नाम बदलें",
          		"move_up": "परत ऊपर ले जाएँ",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "अंश को ले जाएँ:",
          		"move_selected": "चयनित अंश को दूसरी परत पर  ले जाएँ"
          	},
          	config: {
          		"image_props": "छवि के गुण",
          		"doc_title": "शीर्षक",
          		"doc_dims": "कैनवास आयाम",
          		"included_images": "शामिल छवियाँ",
          		"image_opt_embed": "एम्बेड डेटा (स्थानीय फ़ाइलें)",
          		"image_opt_ref": "फाइल के संदर्भ का प्रयोग",
          		"editor_prefs": "संपादक वरीयताएँ",
          		"icon_size": "चिह्न का आकार",
          		"language": "भाषा",
          		"background": "संपादक पृष्ठभूमि",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "नोट: पृष्ठभूमि छवि के साथ नहीं बचायी जाएगी",
          		"icon_large": "बड़ा",
          		"icon_medium": "मध्यम",
          		"icon_small": "छोटा",
          		"icon_xlarge": "बहुत बड़ा",
          		"select_predefined": "चुनें पूर्वनिर्धारित:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"अमान्य मूल्य",
          		"noContentToFitTo":"कोई सामग्री फिट करने के लिए उपलब्ध नहीं",
          		"dupeLayerName":"इस नाम कि परत पहले से मौजूद है !",
          		"enterUniqueLayerName":"कृपया परत का एक अद्वितीय नाम डालें",
          		"enterNewLayerName":"कृपया परत का एक नया नाम डालें",
          		"layerHasThatName":"परत का पहले से ही यही नाम है",
          		"QmoveElemsToLayer":"चयनित अंश को परत '%s' पर ले जाएँ ?",
          		"QwantToClear":"क्या आप छवि साफ़ करना चाहते हैं?\nयह आपके उन्डू  इतिहास को भी मिटा देगा!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"आपके एस.वी.जी. स्रोत में त्रुटियों थी.\nक्या आप मूल एस.वी.जी स्रोत पर वापिस जाना चाहते हैं?",
          		"QignoreSourceChanges":"एसवीजी स्रोत से लाये बदलावों को ध्यान न दें?",
          		"featNotSupported":"सुविधा असमर्थित है",
          		"enterNewImgURL":"नई छवि URL दर्ज करें",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.hr.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "hr",
          	dir : "ltr",
          	common: {
          		"ok": "Spremiti",
          		"cancel": "Odustani",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Kliknite promijeniti boju ispune, shift-click to promijeniti boju moždanog udara",
          		"zoom_level": "Promjena razine zumiranja",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Promjena boje ispune",
          		"stroke_color": "Promjena boje moždani udar",
          		"stroke_style": "Promijeni stroke crtica stil",
          		"stroke_width": "Promjena širine moždani udar",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Promijeni rotation angle",
          		"blur": "Change gaussian blur value",
          		"opacity": "Promjena odabrane stavke neprozirnost",
          		"circle_cx": "Promjena krug&#39;s CX koordinirati",
          		"circle_cy": "Cy Promijeni krug je koordinirati",
          		"circle_r": "Promjena krug je radijusa",
          		"ellipse_cx": "Promjena elipsa&#39;s CX koordinirati",
          		"ellipse_cy": "Cy Promijeni elipsa je koordinirati",
          		"ellipse_rx": "Promijeniti elipsa&#39;s x polumjer",
          		"ellipse_ry": "Promjena elipsa&#39;s y polumjer",
          		"line_x1": "Promijeni linija je početak x koordinatu",
          		"line_x2": "Promjena linije završetak x koordinatu",
          		"line_y1": "Promijeni linija je početak y koordinatu",
          		"line_y2": "Promjena linije završetak y koordinatu",
          		"rect_height": "Promijeni pravokutnik visine",
          		"rect_width": "Promijeni pravokutnik širine",
          		"corner_radius": "Promijeni Pravokutnik Corner Radius",
          		"image_width": "Promijeni sliku širine",
          		"image_height": "Promijeni sliku visina",
          		"image_url": "Promijeni URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Promjena sadržaja teksta",
          		"font_family": "Promjena fontova",
          		"font_size": "Change font size",
          		"bold": "Podebljani tekst",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Promijeni boju pozadine / neprozirnost",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Prilagodi na sve sadržaje",
          		"fit_to_canvas": "Prilagodi na platnu",
          		"fit_to_layer_content": "Prilagodi sloj sadržaj",
          		"fit_to_sel": "Prilagodi odabir",
          		"align_relative_to": "Poravnaj u odnosu na ...",
          		"relativeTo": "u odnosu na:",
          		"stranica": "stranica",
          		"largest_object": "najveći objekt",
          		"selected_objects": "izabrani objekti",
          		"smallest_object": "najmanji objekt",
          		"new_doc": "Nove slike",
          		"open_doc": "Otvori sliku",
          		"export_img": "Export",
          		"save_doc": "Spremanje slike",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Poravnaj dolje",
          		"align_center": "Centriraj",
          		"align_left": "Poravnaj lijevo",
          		"align_middle": "Poravnaj Srednji",
          		"align_right": "Poravnaj desno",
          		"align_top": "Poravnaj Top",
          		"mode_select": "Odaberite alat",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Pravokutnik",
          		"mode_ellipse": "Elipsa",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Tekst Alat",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Alat za zumiranje",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Poništi",
          		"redo": "Redo",
          		"tool_source": "Uredi Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Grupa Elementi",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Razgrupiranje Elementi",
          		"docprops": "Svojstva dokumenta",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Pomakni na vrh",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Spremiti",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Brisanje sloja",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Preimenuj Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefinirane:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.hu.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "hu",
          	dir : "ltr",
          	common: {
          		"ok": "Ment",
          		"cancel": "Szakítani",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Kattints ide a változások töltse szín, shift-click változtatni stroke color",
          		"zoom_level": "Change nagyítási",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change töltse color",
          		"stroke_color": "Change stroke color",
          		"stroke_style": "Change stroke kötőjel style",
          		"stroke_width": "Change stroke width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Váltás forgás szög",
          		"blur": "Change gaussian blur value",
          		"opacity": "A kijelölt elem opacity",
          		"circle_cx": "Change kör CX koordináta",
          		"circle_cy": "Change kör cy koordináta",
          		"circle_r": "Change kör sugara",
          		"ellipse_cx": "Change ellipszis&#39;s CX koordináta",
          		"ellipse_cy": "Change ellipszis&#39;s cy koordináta",
          		"ellipse_rx": "Change ellipszis&#39;s x sugarú",
          		"ellipse_ry": "Change ellipszis&#39;s y sugara",
          		"line_x1": "A sor kezd x koordináta",
          		"line_x2": "A sor vége az x koordináta",
          		"line_y1": "A sor kezd y koordináta",
          		"line_y2": "A sor vége az y koordináta",
          		"rect_height": "Change téglalap magassága",
          		"rect_width": "Change téglalap szélessége",
          		"corner_radius": "Change téglalap sarok sugara",
          		"image_width": "Change kép szélessége",
          		"image_height": "Kép módosítása height",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "A szöveg tartalma",
          		"font_family": "Change Betűcsalád",
          		"font_size": "Change font size",
          		"bold": "Félkövér szöveg",
          		"italic": "Dőlt szöveg"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color / homályosság",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Illeszkednek az összes tartalom",
          		"fit_to_canvas": "Igazítás a vászonra",
          		"fit_to_layer_content": "Igazítás a réteg tartalma",
          		"fit_to_sel": "Igazítás a kiválasztási",
          		"align_relative_to": "Képest Igazítás ...",
          		"relativeTo": "relatív hogy:",
          		"Page": "Page",
          		"largest_object": "legnagyobb objektum",
          		"selected_objects": "választott tárgyak",
          		"smallest_object": "legkisebb objektum",
          		"new_doc": "Új kép",
          		"open_doc": "Kép megnyitása",
          		"export_img": "Export",
          		"save_doc": "Kép mentése más",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Alulra igazítás",
          		"align_center": "Középre igazítás",
          		"align_left": "Balra igazítás",
          		"align_middle": "Közép-align",
          		"align_right": "Jobbra igazítás",
          		"align_top": "Align Top",
          		"mode_select": "Válassza ki az eszközt",
          		"mode_fhpath": "Ceruza eszköz",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand téglalap",
          		"mode_ellipse": "Ellipszisszelet",
          		"mode_circle": "Körbe",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Szöveg eszköz",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Visszavon",
          		"redo": "Megismétléséhez",
          		"tool_source": "Szerkesztés Forrás",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Csoport elemei",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Szétbont elemei",
          		"docprops": "Dokumentum tulajdonságai",
          		"imagelib": "Image Library",
          		"move_bottom": "Mozgatás lefelé",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Ment",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Réteg törlése",
          		"move_down": "Mozgatása lefelé",
          		"new": "Új réteg",
          		"rename": "Réteg átnevezése",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Válassza ki előre definiált:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.hy.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "hy",
          	dir : "ltr",
          	common: {
          		"ok": "Save",
          		"cancel": "Cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click to change fill color, shift-click to change stroke color",
          		"zoom_level": "Change zoom level",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change fill color",
          		"stroke_color": "Change stroke color",
          		"stroke_style": "Change stroke dash style",
          		"stroke_width": "Change stroke width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Change rotation angle",
          		"blur": "Change gaussian blur value",
          		"opacity": "Change selected item opacity",
          		"circle_cx": "Change circle's cx coordinate",
          		"circle_cy": "Change circle's cy coordinate",
          		"circle_r": "Change circle's radius",
          		"ellipse_cx": "Change ellipse's cx coordinate",
          		"ellipse_cy": "Change ellipse's cy coordinate",
          		"ellipse_rx": "Change ellipse's x radius",
          		"ellipse_ry": "Change ellipse's y radius",
          		"line_x1": "Change line's starting x coordinate",
          		"line_x2": "Change line's ending x coordinate",
          		"line_y1": "Change line's starting y coordinate",
          		"line_y2": "Change line's ending y coordinate",
          		"rect_height": "Change rectangle height",
          		"rect_width": "Change rectangle width",
          		"corner_radius": "Change Rectangle Corner Radius",
          		"image_width": "Change image width",
          		"image_height": "Change image height",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Change text contents",
          		"font_family": "Change Font Family",
          		"font_size": "Change Font Size",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color/opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit to all content",
          		"fit_to_canvas": "Fit to canvas",
          		"fit_to_layer_content": "Fit to layer content",
          		"fit_to_sel": "Fit to selection",
          		"align_relative_to": "Align relative to ...",
          		"relativeTo": "relative to:",
          		"page": "page",
          		"largest_object": "largest object",
          		"selected_objects": "elected objects",
          		"smallest_object": "smallest object",
          		"new_doc": "New Image",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Align Center",
          		"align_left": "Align Left",
          		"align_middle": "Align Middle",
          		"align_right": "Align Right",
          		"align_top": "Align Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Save",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefined:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.id.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "id",
          	dir : "ltr",
          	common: {
          		"ok": "Simpan",
          		"cancel": "Batal",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klik untuk mengubah warna mengisi, shift-klik untuk mengubah warna stroke",
          		"zoom_level": "Mengubah tingkat pembesaran",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Ubah warna mengisi",
          		"stroke_color": "Ubah warna stroke",
          		"stroke_style": "Ubah gaya dash stroke",
          		"stroke_width": "Ubah stroke width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Ubah sudut rotasi",
          		"blur": "Change gaussian blur value",
          		"opacity": "Mengubah item yang dipilih keburaman",
          		"circle_cx": "Mengubah koordinat lingkaran cx",
          		"circle_cy": "Mengubah koordinat cy lingkaran",
          		"circle_r": "Ubah jari-jari lingkaran",
          		"ellipse_cx": "Ubah elips&#39;s cx koordinat",
          		"ellipse_cy": "Ubah elips&#39;s cy koordinat",
          		"ellipse_rx": "Ubah elips&#39;s x jari-jari",
          		"ellipse_ry": "Ubah elips&#39;s y jari-jari",
          		"line_x1": "Ubah baris mulai x koordinat",
          		"line_x2": "Ubah baris&#39;s Berakhir x koordinat",
          		"line_y1": "Ubah baris mulai y koordinat",
          		"line_y2": "Ubah baris di tiap akhir y koordinat",
          		"rect_height": "Perubahan tinggi persegi panjang",
          		"rect_width": "Ubah persegi panjang lebar",
          		"corner_radius": "Ubah Corner Rectangle Radius",
          		"image_width": "Ubah Lebar gambar",
          		"image_height": "Tinggi gambar Perubahan",
          		"image_url": "Ubah URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Ubah isi teks",
          		"font_family": "Ubah Font Keluarga",
          		"font_size": "Ubah Ukuran Font",
          		"bold": "Bold Teks",
          		"italic": "Italic Teks"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Mengubah warna latar belakang / keburaman",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Cocok untuk semua konten",
          		"fit_to_canvas": "Muat kanvas",
          		"fit_to_layer_content": "Muat konten lapisan",
          		"fit_to_sel": "Fit seleksi",
          		"align_relative_to": "Rata relatif ...",
          		"relativeTo": "relatif:",
          		"Halaman": "Halaman",
          		"largest_object": "objek terbesar",
          		"selected_objects": "objek terpilih",
          		"smallest_object": "objek terkecil",
          		"new_doc": "Gambar Baru",
          		"open_doc": "Membuka Image",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Rata Bottom",
          		"align_center": "Rata Tengah",
          		"align_left": "Rata Kiri",
          		"align_middle": "Rata Tengah",
          		"align_right": "Rata Kanan",
          		"align_top": "Rata Top",
          		"mode_select": "Pilih Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Persegi Panjang",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Lingkaran",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Teks Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Kelompok Elemen",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elemen",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Pindah ke Bawah",
          		"move_top": "Pindahkan ke Atas",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Simpan",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Hapus Layer",
          		"move_down": "Pindahkan Layer Bawah",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Pindahkan Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Pilih standar:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.is.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "is",
          	dir : "ltr",
          	common: {
          		"ok": "Vista",
          		"cancel": "Hætta",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Smelltu hér til að breyta fylla lit, Shift-smelltu til að breyta högg lit",
          		"zoom_level": "Breyta Stækkunarstig",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Breyta fylla color",
          		"stroke_color": "Breyta heilablķđfall color",
          		"stroke_style": "Breyta heilablķđfall þjóta stíl",
          		"stroke_width": "Breyta heilablķđfall width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Breyting snúningur horn",
          		"blur": "Change gaussian blur value",
          		"opacity": "Breyta valin atriði opacity",
          		"circle_cx": "Cx Breyta hring er að samræma",
          		"circle_cy": "Breyta hring&#39;s cy samræma",
          		"circle_r": "Radíus Breyta hringsins er",
          		"ellipse_cx": "Breyta sporbaug&#39;s cx samræma",
          		"ellipse_cy": "Breyta sporbaug&#39;s cy samræma",
          		"ellipse_rx": "X radíus Breyta sporbaug&#39;s",
          		"ellipse_ry": "Y radíus Breyta sporbaug&#39;s",
          		"line_x1": "Breyta lína í byrjun x samræma",
          		"line_x2": "Breyta lína&#39;s Ending x samræma",
          		"line_y1": "Breyta lína í byrjun y samræma",
          		"line_y2": "Breyta lína er endir y samræma",
          		"rect_height": "Breyta rétthyrningur hæð",
          		"rect_width": "Skipta rétthyrningur width",
          		"corner_radius": "Breyta rétthyrningur Corner Radíus",
          		"image_width": "Breyta mynd width",
          		"image_height": "Breyta mynd hæð",
          		"image_url": "Breyta URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Breyta texta innihald",
          		"font_family": "Change Leturfjölskylda",
          		"font_size": "Breyta leturstærð",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Breyta bakgrunnslit / opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Laga til efni",
          		"fit_to_canvas": "Fit á striga",
          		"fit_to_layer_content": "Laga til lag efni",
          		"fit_to_sel": "Fit til val",
          		"align_relative_to": "Jafna miðað við ...",
          		"relativeTo": "hlutfallslegt til:",
          		"síðu": "síðu",
          		"largest_object": "stærsti hlutinn",
          		"selected_objects": "kjörinn hlutir",
          		"smallest_object": "lítill hluti",
          		"new_doc": "New Image",
          		"open_doc": "Opna mynd",
          		"export_img": "Export",
          		"save_doc": "Spara Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Jafna Bottom",
          		"align_center": "Jafna Center",
          		"align_left": "Vinstri jöfnun",
          		"align_middle": "Jafna Mið",
          		"align_right": "Hægri jöfnun",
          		"align_top": "Jöfnun Top",
          		"mode_select": "Veldu Tól",
          		"mode_fhpath": "Blýantur Tól",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand rétthyrningur",
          		"mode_ellipse": "Sporbaugur",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Sporbaugur",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Mynd Tól",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Hætta",
          		"redo": "Endurtaka",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Færa Bottom",
          		"move_top": "Fara efst á síðu",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Vista",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Eyða Lag",
          		"move_down": "Færa Layer Down",
          		"new": "Lag",
          		"rename": "Endurnefna Lag",
          		"move_up": "Færa Lag Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Veldu predefined:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.it.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "it",
          	dir : "ltr",
          	common: {
          		"ok": "Salva",
          		"cancel": "Annulla",
          		"key_backspace": "backspace", 
          		"key_del": "Canc", 
          		"key_down": "giù", 
          		"key_up": "su", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Mostra/nascondi strumenti per il tratto",
          		"palette_info": "Fare clic per cambiare il colore di riempimento, shift-click per cambiare colore del tratto",
          		"zoom_level": "Cambia il livello di zoom",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identifica l'elemento",
          		"fill_color": "Cambia il colore di riempimento",
          		"stroke_color": "Cambia il colore del tratto",
          		"stroke_style": "Cambia lo stile del tratto",
          		"stroke_width": "Cambia la larghezza del tratto",
          		"pos_x": "Modifica la coordinata x",
          		"pos_y": "Modifica la coordinata y",
          		"linecap_butt": "Inizio linea: Punto",
          		"linecap_round": "Inizio linea: Tondo",
          		"linecap_square": "Inizio linea: Quadrato",
          		"linejoin_bevel": "Giunzione: smussata",
          		"linejoin_miter": "Giunzione: spezzata",
          		"linejoin_round": "Giunzione: arrotondata",
          		"angle": "Cambia l'angolo di rotazione",
          		"blur": "Cambia l'intensità della sfocatura",
          		"opacity": "Cambia l'opacità dell'oggetto selezionato",
          		"circle_cx": "Cambia la coordinata Cx del cerchio",
          		"circle_cy": "Cambia la coordinata Cy del cerchio",
          		"circle_r": "Cambia il raggio del cerchio",
          		"ellipse_cx": "Cambia la coordinata Cx dell'ellisse",
          		"ellipse_cy": "Cambia la coordinata Cy dell'ellisse",
          		"ellipse_rx": "Cambia l'asse x dell'ellisse",
          		"ellipse_ry": "Cambia l'asse y dell'ellisse",
          		"line_x1": "Modifica la coordinata iniziale x della linea",
          		"line_x2": "Modifica la coordinata finale x della linea",
          		"line_y1": "Modifica la coordinata iniziale y della linea",
          		"line_y2": "Modifica la coordinata finale y della linea",
          		"rect_height": "Cambia l'altezza rettangolo",
          		"rect_width": "Cambia la larghezza rettangolo",
          		"corner_radius": "Cambia il raggio dell'angolo",
          		"image_width": "Cambia la larghezza dell'immagine",
          		"image_height": "Cambia l'altezza dell'immagine",
          		"image_url": "Cambia URL",
          		"node_x": "Modifica la coordinata x del nodo",
          		"node_y": "Modifica la coordinata y del nodo",
          		"seg_type": "Cambia il tipo di segmento",
          		"straight_segments": "Linea retta",
          		"curve_segments": "Curva",
          		"text_contents": "Cambia il contenuto del testo",
          		"font_family": "Cambia il tipo di Font",
          		"font_size": "Modifica dimensione carattere",
          		"bold": "Grassetto",
          		"italic": "Corsivo"
          	},
          	tools: { 
          		"main_menu": "Menù principale",
          		"bkgnd_color_opac": "Cambia colore/opacità dello sfondo",
          		"connector_no_arrow": "No freccia",
          		"fitToContent": "Adatta al contenuto",
          		"fit_to_all": "Adatta a tutti i contenuti",
          		"fit_to_canvas": "Adatta all'area di disegno",
          		"fit_to_layer_content": "Adatta al contenuto del livello",
          		"fit_to_sel": "Adatta alla selezione",
          		"align_relative_to": "Allineati a ...",
          		"relativeTo": "Rispetto a:",
          		"Pagina": "Pagina",
          		"largest_object": "Oggetto più grande",
          		"selected_objects": "Oggetti selezionati",
          		"smallest_object": "Oggetto più piccolo",
          		"new_doc": "Nuova immagine",
          		"open_doc": "Apri immagine",
          		"export_img": "Export",
          		"save_doc": "Salva",
          		"import_doc": "Importa SVG",
          		"align_to_page": "Allinea elementi alla pagina",
          		"align_bottom": "Allinea in basso",
          		"align_center": "Allinea al centro",
          		"align_left": "Allinea a sinistra",
          		"align_middle": "Allinea al centro",
          		"align_right": "Allinea a destra",
          		"align_top": "Allinea in alto",
          		"mode_select": "Seleziona",
          		"mode_fhpath": "Matita",
          		"mode_line": "Linea",
          		"mode_connect": "Collega due oggetti",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Rettangolo a mano libera",
          		"mode_ellipse": "Ellisse",
          		"mode_circle": "Cerchio",
          		"mode_fhellipse": "Ellisse a mano libera",
          		"mode_path": "Spezzata",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Testo",
          		"mode_image": "Immagine",
          		"mode_zoom": "Zoom",
          		"mode_eyedropper": "Seleziona colore",
          		"no_embed": "NOTA: L'immagine non può essere incorporata: dipenderà dal percorso assoluto per essere vista",
          		"undo": "Annulla",
          		"redo": "Rifai",
          		"tool_source": "Modifica sorgente",
          		"wireframe_mode": "Contorno",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Raggruppa elementi",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Converti in tracciato",
          		"reorient_path": "Riallinea",
          		"ungroup": "Separa gli elementi",
          		"docprops": "Proprietà del documento",
          		"imagelib": "Image Library",
          		"move_bottom": "Sposta in fondo",
          		"move_top": "Sposta in cima",
          		"node_clone": "Clona nodo",
          		"node_delete": "Elimina nodo",
          		"node_link": "Collegamento tra punti di controllo",
          		"add_subpath": "Aggiungi sotto-percorso",
          		"openclose_path": "Apri/chiudi spezzata",
          		"source_save": "Salva",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"Canc": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Livello",
          		"layers": "Layers",
          		"del": "Elimina il livello",
          		"move_down": "Sposta indietro il livello",
          		"new": "Nuovo livello",
          		"rename": "Rinomina il livello",
          		"move_up": "Sposta avanti il livello",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Sposta verso:",
          		"move_selected": "Sposta gli elementi in un diverso livello"
          	},
          	config: {
          		"image_props": "Proprietà Immagine",
          		"doc_title": "Titolo",
          		"doc_dims": "Dimensioni dell'area di disegno",
          		"included_images": "Immagini incluse",
          		"image_opt_embed": "Incorpora dati (file locali)",
          		"image_opt_ref": "Usa l'identificativo di riferimento",
          		"editor_prefs": "Preferenze",
          		"icon_size": "Dimensione Icona",
          		"language": "Lingua",
          		"background": "Sfondo dell'editor",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Nota: Lo sfondo non verrà salvato con l'immagine.",
          		"icon_large": "Grande",
          		"icon_medium": "Medio",
          		"icon_small": "Piccolo",
          		"icon_xlarge": "Molto grande",
          		"select_predefined": "Selezioni predefinite:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Valore assegnato non valido",
          		"noContentToFitTo":"Non c'è contenuto cui adeguarsi",
          		"dupeLayerName":"C'è già un livello con questo nome!",
          		"enterUniqueLayerName":"Assegna un diverso nome a ciascun livello, grazie!",
          		"enterNewLayerName":"Assegna un nome al livello",
          		"layerHasThatName":"Un livello ha già questo nome",
          		"QmoveElemsToLayer":"Sposta gli elementi selezionali al livello '%s'?",
          		"QwantToClear":"Vuoi cancellare il disegno?\nVerrà eliminato anche lo storico delle modifiche!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Ci sono errori nel codice sorgente SVG.\nRitorno al codice originale?",
          		"QignoreSourceChanges":"Ignoro i cambiamenti nel sorgente SVG?",
          		"featNotSupported":"Caratteristica non supportata",
          		"enterNewImgURL":"Scrivi un nuovo URL per l'immagine",
          		"defsFailOnSave": "NOTA: A causa dlle caratteristiche del tuo browser, l'immagine potrà apparire errata (senza elementi o gradazioni) finché non sarà salvata.",
          		"loadingImage":"Sto caricando l'immagine. attendere prego...",
          		"saveFromBrowser": "Seleziona \"Salva con nome...\" nel browser per salvare l'immagine con nome %s .",
          		"noteTheseIssues": "Nota le seguenti particolarità: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ja.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ja",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "キャンセル",
          		"key_backspace": "backspace", 
          		"key_del": "削除", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "クリックで塗りの色を選択、Shift+クリックで線の色を選択",
          		"zoom_level": "ズーム倍率の変更",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "塗りの色を変更",
          		"stroke_color": "線の色を変更",
          		"stroke_style": "線種の変更",
          		"stroke_width": "線幅の変更",
          		"pos_x": "X座標を変更",
          		"pos_y": "Y座標を変更",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "回転角の変更",
          		"blur": "Change gaussian blur value",
          		"opacity": "不透明度",
          		"circle_cx": "円の中心を変更(X座標)",
          		"circle_cy": "円の中心を変更(Y座標)",
          		"circle_r": "変更円の半径",
          		"ellipse_cx": "楕円の中心を変更(X座標)",
          		"ellipse_cy": "楕円の中心を変更(Y座標)",
          		"ellipse_rx": "楕円の半径を変更(X座標)",
          		"ellipse_ry": "楕円の半径を変更(Y座標)",
          		"line_x1": "開始X座標",
          		"line_x2": "終了X座標",
          		"line_y1": "開始Y座標",
          		"line_y2": "終了Y座標",
          		"rect_height": "長方形の高さを変更",
          		"rect_width": "長方形の幅を変更",
          		"corner_radius": "長方形の角の半径を変更",
          		"image_width": "画像の幅を変更",
          		"image_height": "画像の高さを変更",
          		"image_url": "URLを変更",
          		"node_x": "ノードのX座標を変更",
          		"node_y": "ノードのY座標を変更",
          		"seg_type": "線分の種類を変更",
          		"straight_segments": "直線",
          		"curve_segments": "カーブ",
          		"text_contents": "テキストの内容の変更",
          		"font_family": "フォントファミリーの変更",
          		"font_size": "文字サイズの変更",
          		"bold": "太字",
          		"italic": "イタリック体"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "背景色/不透明度の変更",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "コンテンツに合わせる",
          		"fit_to_all": "すべてのコンテンツに合わせる",
          		"fit_to_canvas": "キャンバスに合わせる",
          		"fit_to_layer_content": "レイヤー上のコンテンツに合わせる",
          		"fit_to_sel": "選択対象に合わせる",
          		"align_relative_to": "揃える",
          		"relativeTo": "相対:",
          		"ページ": "ページ",
          		"largest_object": "最大のオブジェクト",
          		"selected_objects": "選択オブジェクト",
          		"smallest_object": "最小のオブジェクト",
          		"new_doc": "新規イメージ",
          		"open_doc": "イメージを開く",
          		"export_img": "Export",
          		"save_doc": "画像を保存",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "下揃え",
          		"align_center": "中央揃え",
          		"align_left": "左揃え",
          		"align_middle": "中央揃え",
          		"align_right": "右揃え",
          		"align_top": "上揃え",
          		"mode_select": "選択ツール",
          		"mode_fhpath": "鉛筆ツール",
          		"mode_line": "直線ツール",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "フリーハンド長方形",
          		"mode_ellipse": "楕円",
          		"mode_circle": "円",
          		"mode_fhellipse": "フリーハンド楕円",
          		"mode_path": "パスツール",
          		"mode_shapelib": "Shape library",
          		"mode_text": "テキストツール",
          		"mode_image": "イメージツール",
          		"mode_zoom": "ズームツール",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "元に戻す",
          		"redo": "やり直し",
          		"tool_source": "ソースの編集",
          		"wireframe_mode": "ワイヤーフレームで表示 [F]",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "グループ化",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "パスに変換",
          		"reorient_path": "現在の角度を0度とする",
          		"ungroup": "グループ化を解除",
          		"docprops": "文書のプロパティ",
          		"imagelib": "Image Library",
          		"move_bottom": "奥に移動",
          		"move_top": "手前に移動",
          		"node_clone": "ノードを複製",
          		"node_delete": "ノードを削除",
          		"node_link": "制御点の接続",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "適用",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"レイヤ",
          		"layers": "Layers",
          		"del": "レイヤの削除",
          		"move_down": "レイヤを下へ移動",
          		"new": "新規レイヤ",
          		"rename": "レイヤの名前を変更",
          		"move_up": "レイヤを上へ移動",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "移動先レイヤ:",
          		"move_selected": "選択対象を別のレイヤに移動"
          	},
          	config: {
          		"image_props": "イメージの設定",
          		"doc_title": "タイトル",
          		"doc_dims": "キャンバスの大きさ",
          		"included_images": "挿入された画像の扱い",
          		"image_opt_embed": "SVGファイルに埋め込む",
          		"image_opt_ref": "画像を参照する",
          		"editor_prefs": "エディタの設定",
          		"icon_size": "アイコンの大きさ",
          		"language": "言語",
          		"background": "エディタの背景色",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "※背景色はファイルに保存されません。",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "デフォルト",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"無効な値が指定されています。",
          		"noContentToFitTo":"合わせる対象のコンテンツがありません。",
          		"dupeLayerName":"同名のレイヤーが既に存在します。",
          		"enterUniqueLayerName":"新規レイヤの一意な名前を入力してください。",
          		"enterNewLayerName":"レイヤの新しい名前を入力してください。",
          		"layerHasThatName":"既に同名が付いています。",
          		"QmoveElemsToLayer":"選択した要素をレイヤー '%s' に移動しますか?",
          		"QwantToClear":"キャンバスをクリアしますか?\nアンドゥ履歴も消去されます。",
          		"QwantToOpen":"新しいファイルを開きますか?\nアンドゥ履歴も消去されます。",
          		"QerrorsRevertToSource":"ソースにエラーがあります。\n元のソースに戻しますか?",
          		"QignoreSourceChanges":"ソースの変更を無視しますか?",
          		"featNotSupported":"機能はサポートされていません。",
          		"enterNewImgURL":"画像のURLを入力してください。",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ko.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ko",
          	dir : "ltr",
          	common: {
          		"ok": "저장",
          		"cancel": "취소",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "색상을 클릭, 근무 시간 채우기 스트로크 색상을 변경하려면 변경하려면",
          		"zoom_level": "변경 수준으로 확대",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "채우기 색상 변경",
          		"stroke_color": "뇌졸중으로 색상 변경",
          		"stroke_style": "뇌졸중 변경 대시 스타일",
          		"stroke_width": "뇌졸중 너비 변경",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "회전 각도를 변경",
          		"blur": "Change gaussian blur value",
          		"opacity": "변경 항목을 선택 불투명도",
          		"circle_cx": "변경 동그라미 CX는 좌표",
          		"circle_cy": "동그라미 싸이 변경 조정할 수있어",
          		"circle_r": "변경 원의 반지름",
          		"ellipse_cx": "CX는 타원의 좌표 변경",
          		"ellipse_cy": "싸이 타원 변경 조정할 수있어",
          		"ellipse_rx": "변경 타원의 x 반지름",
          		"ellipse_ry": "변경 타원의 y를 반경",
          		"line_x1": "변경 라인의 X 좌표 시작",
          		"line_x2": "변경 라인의 X 좌표 결말",
          		"line_y1": "라인 변경 y를 시작 좌표",
          		"line_y2": "라인 변경 y를 결말의 좌표",
          		"rect_height": "사각형의 높이를 변경",
          		"rect_width": "사각형의 너비 변경",
          		"corner_radius": "변경 직사각형 코너 반경",
          		"image_width": "이미지 변경 폭",
          		"image_height": "이미지 높이 변경",
          		"image_url": "URL 변경",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "텍스트 변경 내용",
          		"font_family": "글꼴 변경 패밀리",
          		"font_size": "글꼴 크기 변경",
          		"bold": "굵은 텍스트",
          		"italic": "기울임꼴 텍스트"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "배경 색상 변경 / 투명도",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "맞춤 콘텐츠",
          		"fit_to_all": "맞춤 모든 콘텐츠에",
          		"fit_to_canvas": "맞춤 캔버스",
          		"fit_to_layer_content": "레이어에 맞게 콘텐츠",
          		"fit_to_sel": "맞춤 선택",
          		"align_relative_to": "정렬 상대적으로 ...",
          		"relativeTo": "상대:",
          		"페이지": "페이지",
          		"largest_object": "큰 개체",
          		"selected_objects": "당선 개체",
          		"smallest_object": "작은 개체",
          		"new_doc": "새 이미지",
          		"open_doc": "오픈 이미지",
          		"export_img": "Export",
          		"save_doc": "이미지 저장",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "히프 정렬",
          		"align_center": "정렬 센터",
          		"align_left": "왼쪽 정렬",
          		"align_middle": "중간 정렬",
          		"align_right": "오른쪽 맞춤",
          		"align_top": "정렬 탑",
          		"mode_select": "선택 도구",
          		"mode_fhpath": "연필 도구",
          		"mode_line": "선 도구",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "자유 핸드 직사각형",
          		"mode_ellipse": "타원",
          		"mode_circle": "동그라미",
          		"mode_fhellipse": "자유 핸드 타원",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "텍스트 도구",
          		"mode_image": "이미지 도구",
          		"mode_zoom": "줌 도구",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "취소",
          		"redo": "재실행",
          		"tool_source": "수정 소스",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "그룹 요소",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "그룹 해제 요소",
          		"docprops": "문서 속성",
          		"imagelib": "Image Library",
          		"move_bottom": "아래로 이동",
          		"move_top": "상단으로 이동",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "저장",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "레이어 삭제",
          		"move_down": "레이어 아래로 이동",
          		"new": "새 레이어",
          		"rename": "레이어 이름 바꾸기",
          		"move_up": "레이어 위로 이동",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "미리 정의된 선택:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.lt.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "lt",
          	dir : "ltr",
          	common: {
          		"ok": "Saugoti",
          		"cancel": "Atšaukti",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Spustelėkite norėdami keisti užpildo spalvą, perėjimo spustelėkite pakeisti insultas spalva",
          		"zoom_level": "Keisti mastelį",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Keisti užpildyti spalvos",
          		"stroke_color": "Keisti insultas spalva",
          		"stroke_style": "Keisti insultas brūkšnys stilius",
          		"stroke_width": "Keisti insultas plotis",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Keisti sukimosi kampas",
          		"blur": "Change gaussian blur value",
          		"opacity": "Pakeisti pasirinkto elemento neskaidrumo",
          		"circle_cx": "Keisti ratas&#39;s CX koordinuoti",
          		"circle_cy": "Keisti ratas&#39;s CY koordinuoti",
          		"circle_r": "Keisti savo apskritimo spindulys",
          		"ellipse_cx": "Keisti elipse&#39;s CX koordinuoti",
          		"ellipse_cy": "Keisti elipse&#39;s CY koordinuoti",
          		"ellipse_rx": "Keisti elipsė &quot;X spindulys",
          		"ellipse_ry": "Keisti elipse Y spindulys",
          		"line_x1": "Keisti linijos nuo koordinačių x",
          		"line_x2": "Keisti linijos baigėsi x koordinuoti",
          		"line_y1": "Keisti linijos pradžios y koordinačių",
          		"line_y2": "Keisti linijos baigėsi y koordinačių",
          		"rect_height": "Keisti stačiakampio aukščio",
          		"rect_width": "Pakeisti stačiakampio plotis",
          		"corner_radius": "Keisti stačiakampis skyrelį Spindulys",
          		"image_width": "Keisti paveikslėlio plotis",
          		"image_height": "Keisti vaizdo aukštis",
          		"image_url": "Pakeisti URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Keisti teksto turinys",
          		"font_family": "Pakeistišriftą Šeima",
          		"font_size": "Change font size",
          		"bold": "Pusjuodis",
          		"italic": "Kursyvas"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Pakeisti fono spalvą / drumstumas",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Talpinti turinys",
          		"fit_to_all": "Talpinti All content",
          		"fit_to_canvas": "Talpinti drobė",
          		"fit_to_layer_content": "Talpinti sluoksnis turinio",
          		"fit_to_sel": "Talpinti atrankos",
          		"align_relative_to": "Derinti palyginti ...",
          		"relativeTo": "palyginti:",
          		"puslapis": "puslapis",
          		"largest_object": "didžiausias objektas",
          		"selected_objects": "išrinktas objektai",
          		"smallest_object": "mažiausias objektą",
          		"new_doc": "New Image",
          		"open_doc": "Atidaryti atvaizdą",
          		"export_img": "Export",
          		"save_doc": "Išsaugoti nuotrauką",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Lygiuoti apačioje",
          		"align_center": "Lygiuoti",
          		"align_left": "Lygiuoti kairėje",
          		"align_middle": "Suderinti Vidurio",
          		"align_right": "Lygiuoti dešinėje",
          		"align_top": "Lygiuoti viršų",
          		"mode_select": "Įrankis",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free Hand stačiakampis",
          		"mode_ellipse": "Elipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free Hand Elipsė",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Tekstas Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Įrankį",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Atšaukti",
          		"redo": "Atstatyti",
          		"tool_source": "Taisyti Šaltinis",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Elementų grupės",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Išgrupuoti elementai",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Perkelti į apačią",
          		"move_top": "Perkelti į viršų",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Saugoti",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Ištrinti Layer",
          		"move_down": "Perkelti sluoksnį Žemyn",
          		"new": "New Layer",
          		"rename": "Pervadinti sluoksnį",
          		"move_up": "Perkelti sluoksnį Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Pasirinkite iš anksto:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.lv.js
          /*globals svgEditor */
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "lv",
          	dir : "ltr",
          	common: {
          		"ok": "Glābt",
          		"cancel": "Atcelt",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Noklikšķiniet, lai mainītu aizpildījuma krāsu, shift-click to mainīt stroke krāsa",
          		"zoom_level": "Pārmaiņu mērogu",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change aizpildījuma krāsu",
          		"stroke_color": "Change stroke krāsa",
          		"stroke_style": "Maina stroke domuzīme stils",
          		"stroke_width": "Change stroke platums",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Mainīt griešanās leņķis",
          		"blur": "Change gaussian blur value",
          		"opacity": "Mainīt izvēlēto objektu necaurredzamība",
          		"circle_cx": "Maina aplis&#39;s CX koordinēt",
          		"circle_cy": "Pārmaiņu loks ir cy koordinēt",
          		"circle_r": "Pārmaiņu loks ir rādiuss",
          		"ellipse_cx": "Mainīt elipses&#39;s CX koordinēt",
          		"ellipse_cy": "Mainīt elipses&#39;s cy koordinēt",
          		"ellipse_rx": "Mainīt elipses&#39;s x rādiuss",
          		"ellipse_ry": "Mainīt elipses&#39;s y rādiuss",
          		"line_x1": "Mainīt līnijas sākas x koordinēt",
          		"line_x2": "Mainīt līnijas beigu x koordinēt",
          		"line_y1": "Mainīt līnijas sākas y koordinātu",
          		"line_y2": "Mainīt līnijas beigu y koordinātu",
          		"rect_height": "Change Taisnstūra augstums",
          		"rect_width": "Change taisnstūra platums",
          		"corner_radius": "Maina Taisnstūris Corner Rādiuss",
          		"image_width": "Mainīt attēla platumu",
          		"image_height": "Mainīt attēla augstums",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Mainītu teksta saturs",
          		"font_family": "Mainīt fonta Family",
          		"font_size": "Mainīt fonta izmēru",
          		"bold": "Bold Text",
          		"italic": "Kursīvs"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color / necaurredzamība",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit uz visu saturu",
          		"fit_to_canvas": "Ievietot audekls",
          		"fit_to_layer_content": "Ievietot slānis saturs",
          		"fit_to_sel": "Fit atlases",
          		"align_relative_to": "Līdzināt, salīdzinot ar ...",
          		"relativeTo": "salīdzinājumā ar:",
          		"lapa": "lapa",
          		"largest_object": "lielākais objekts",
          		"selected_objects": "ievēlēts objekti",
          		"smallest_object": "mazākais objekts",
          		"new_doc": "New Image",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Līdzināt Bottom",
          		"align_center": "Līdzināt uz centru",
          		"align_left": "Līdzināt pa kreisi",
          		"align_middle": "Līdzināt Middle",
          		"align_right": "Līdzināt pa labi",
          		"align_top": "Līdzināt Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Taisnstūris",
          		"mode_ellipse": "Elipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Atpogāt",
          		"redo": "Redo",
          		"tool_source": "Rediģēt Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Grupa Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Atgrupēt Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Pārvietot uz leju",
          		"move_top": "Pārvietot uz augšu",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Glābt",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Dzēst Layer",
          		"move_down": "Pārvietot slāni uz leju",
          		"new": "New Layer",
          		"rename": "Pārdēvēt Layer",
          		"move_up": "Pārvietot slāni uz augšu",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Izvēlieties iepriekš:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?
          This will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?
          This will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.
          Revert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.mk.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "mk",
          	dir : "ltr",
          	common: {
          		"ok": "Зачувува",
          		"cancel": "Откажи",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Кликни за да внесете промени бојата, промена клик да се промени бојата удар",
          		"zoom_level": "Промена зум ниво",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Измени пополнете боја",
          		"stroke_color": "Промена боја на мозочен удар",
          		"stroke_style": "Промена удар цртичка стил",
          		"stroke_width": "Промена удар Ширина",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Change ротација агол",
          		"blur": "Change gaussian blur value",
          		"opacity": "Промена избрани ставка непроѕирноста",
          		"circle_cx": "Промена круг на cx координира",
          		"circle_cy": "Промена круг&#39;s cy координираат",
          		"circle_r": "Промена на круг со радиус",
          		"ellipse_cx": "Промена елипса&#39;s cx координираат",
          		"ellipse_cy": "Промена на елипса cy координира",
          		"ellipse_rx": "Промена на елипса x радиус",
          		"ellipse_ry": "Промена на елипса у радиус",
          		"line_x1": "Промена линија почетна x координира",
          		"line_x2": "Промена линија завршува x координира",
          		"line_y1": "Промена линија координираат почетна y",
          		"line_y2": "Промена линија завршува y координира",
          		"rect_height": "Промена правоаголник височина",
          		"rect_width": "Промена правоаголник Ширина",
          		"corner_radius": "Промена правоаголник Corner Radius",
          		"image_width": "Промена Ширина на сликата",
          		"image_height": "Промена на слика височина",
          		"image_url": "Промена URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Промена текст содржина",
          		"font_family": "Смени фонт Фамилија",
          		"font_size": "Изменифонт Големина",
          		"bold": "Задебелен текст",
          		"italic": "Italic текст"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Смени позадина / непроѕирноста",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Способен да Содржина",
          		"fit_to_all": "Способен да сите содржина",
          		"fit_to_canvas": "Побиране да платно",
          		"fit_to_layer_content": "Способен да слој содржина",
          		"fit_to_sel": "Способен да селекција",
          		"align_relative_to": "Порамни во поглед на ...",
          		"relativeTo": "во поглед на:",
          		"страница": "страница",
          		"largest_object": "најголемиот објект",
          		"selected_objects": "избран објекти",
          		"smallest_object": "најмалата објект",
          		"new_doc": "Нови слики",
          		"open_doc": "Отвори слика",
          		"export_img": "Export",
          		"save_doc": "Зачувај слика",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Центрирано",
          		"align_left": "Порамни лево Порамни",
          		"align_middle": "Израмни Среден",
          		"align_right": "Порамни десно",
          		"align_top": "Израмни почетокот",
          		"mode_select": "Изберете ја алатката",
          		"mode_fhpath": "Алатка за молив",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Правоаголник слободна рака",
          		"mode_ellipse": "Елипса",
          		"mode_circle": "Круг",
          		"mode_fhellipse": "Free-Hand Елипса",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Алатка за текст",
          		"mode_image": "Алатка за сликата",
          		"mode_zoom": "Алатка за зумирање",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Врати",
          		"redo": "Повтори",
          		"tool_source": "Уреди Извор",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Група на елементи",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Елементи",
          		"docprops": "Својства на документот",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to bottom",
          		"move_top": "Поместување на почетокот",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Зачувува",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Избриши Слој",
          		"move_down": "Премести слој долу",
          		"new": "Нов слој",
          		"rename": "Преименувај слој",
          		"move_up": "Премести слој горе",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Изберете предефинирани:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ms.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ms",
          	dir : "ltr",
          	common: {
          		"ok": "Simpan",
          		"cancel": "Batal",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klik untuk menukar warna mengisi, shift-klik untuk menukar warna stroke",
          		"zoom_level": "Mengubah peringkat pembesaran",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Tukar Warna mengisi",
          		"stroke_color": "Tukar Warna stroke",
          		"stroke_style": "Tukar gaya dash stroke",
          		"stroke_width": "Tukar stroke width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Namakan sudut putaran",
          		"blur": "Change gaussian blur value",
          		"opacity": "Mengubah item yang dipilih keburaman",
          		"circle_cx": "Mengubah koordinat bulatan cx",
          		"circle_cy": "Mengubah koordinat cy bulatan",
          		"circle_r": "Tukar jari-jari lingkaran",
          		"ellipse_cx": "Tukar elips&#39;s cx koordinat",
          		"ellipse_cy": "Tukar elips&#39;s cy koordinat",
          		"ellipse_rx": "Tukar elips&#39;s x jari-jari",
          		"ellipse_ry": "Tukar elips&#39;s y jari-jari",
          		"line_x1": "Ubah baris mulai x koordinat",
          		"line_x2": "Ubah baris&#39;s Berakhir x koordinat",
          		"line_y1": "Ubah baris mulai y koordinat",
          		"line_y2": "Ubah baris di tiap akhir y koordinat",
          		"rect_height": "Perubahan quality persegi panjang",
          		"rect_width": "Tukar persegi panjang lebar",
          		"corner_radius": "Tukar Corner Rectangle Radius",
          		"image_width": "Tukar Lebar imej",
          		"image_height": "Tinggi gambar Kaca",
          		"image_url": "Tukar URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Tukar isi teks",
          		"font_family": "Tukar Font Keluarga",
          		"font_size": "Ubah Saiz Font",
          		"bold": "Bold Teks",
          		"italic": "Italic Teks"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Mengubah warna latar belakang / keburaman",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Cocok untuk semua kandungan",
          		"fit_to_canvas": "Muat kanvas",
          		"fit_to_layer_content": "Muat kandungan lapisan",
          		"fit_to_sel": "Fit seleksi",
          		"align_relative_to": "Rata relatif ...",
          		"relativeTo": "relatif:",
          		"Laman": "Laman",
          		"largest_object": "objek terbesar",
          		"selected_objects": "objek terpilih",
          		"smallest_object": "objek terkecil",
          		"new_doc": "Imej Baru",
          		"open_doc": "Membuka Image",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Rata Bottom",
          		"align_center": "Rata Tengah",
          		"align_left": "Rata Kiri",
          		"align_middle": "Rata Tengah",
          		"align_right": "Rata Kanan",
          		"align_top": "Rata Popular",
          		"mode_select": "Pilih Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Persegi Panjang",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Lingkaran",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Teks Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Kelompok Elemen",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elemen",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Pindah ke Bawah",
          		"move_top": "Pindah ke Atas",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Simpan",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Padam Layer",
          		"move_down": "Pindah Layer Bawah",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Pindah Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Pilih standard:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.mt.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "mt",
          	dir : "ltr",
          	common: {
          		"ok": "Save",
          		"cancel": "Ikkanċella",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Ikklikkja biex timla l-bidla fil-kulur, ikklikkja-bidla għall-bidla color stroke",
          		"zoom_level": "Bidla zoom livell",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Bidla imla color",
          		"stroke_color": "Color stroke Bidla",
          		"stroke_style": "Bidla stroke dash stil",
          		"stroke_width": "Wisa &#39;puplesija Bidla",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Angolu ta &#39;rotazzjoni Bidla",
          		"blur": "Change gaussian blur value",
          		"opacity": "Bidla magħżula opaċità partita",
          		"circle_cx": "CX ċirku Tibdil jikkoordinaw",
          		"circle_cy": "Ċirku Tibdil cy jikkoordinaw",
          		"circle_r": "Raġġ ta &#39;ċirku tal-Bidla",
          		"ellipse_cx": "Bidla ellissi&#39;s CX jikkoordinaw",
          		"ellipse_cy": "Ellissi Tibdil cy jikkoordinaw",
          		"ellipse_rx": "Raġġ x ellissi Tibdil",
          		"ellipse_ry": "Raġġ y ellissi Tibdil",
          		"line_x1": "Bidla fil-linja tal-bidu tikkoordina x",
          		"line_x2": "Linja tal-Bidla li jispiċċa x jikkoordinaw",
          		"line_y1": "Bidla fil-linja tal-bidu y jikkoordinaw",
          		"line_y2": "Linja Tibdil jispiċċa y jikkoordinaw",
          		"rect_height": "Għoli rettangolu Bidla",
          		"rect_width": "Wisa &#39;rettangolu Bidla",
          		"corner_radius": "Bidla Rectangle Corner Radius",
          		"image_width": "Wisa image Bidla",
          		"image_height": "Għoli image Bidla",
          		"image_url": "Bidla URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Test kontenut Bidla",
          		"font_family": "Bidla Font Familja",
          		"font_size": "Change font size",
          		"bold": "Bold Test",
          		"italic": "Test korsiv"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Bidla fil-kulur fl-isfond / opaċità",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit għall-kontenut",
          		"fit_to_all": "Tajbin għall-kontenut",
          		"fit_to_canvas": "Xieraq li kanvas",
          		"fit_to_layer_content": "Fit-kontenut ta &#39;saff għal",
          		"fit_to_sel": "Fit-għażla",
          		"align_relative_to": "Jallinjaw relattiv għall - ...",
          		"relativeTo": "relattiv għall -:",
          		"paġna": "paġna",
          		"largest_object": "akbar oġġett",
          		"selected_objects": "oġġetti elett",
          		"smallest_object": "iżgħar oġġett",
          		"new_doc": "Image New",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Image Save",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Tallinja Bottom",
          		"align_center": "Tallinja Center",
          		"align_left": "Tallinja Left",
          		"align_middle": "Tallinja Nofsani",
          		"align_right": "Tallinja Dritt",
          		"align_top": "Tallinja Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Lapes Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free Hand-Rectangle",
          		"mode_ellipse": "Ellissi",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free Hand-ellissi",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Jneħħu",
          		"redo": "Jerġa &#39;jagħmel",
          		"tool_source": "Source Edit",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Grupp Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Dokument Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Save",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Ħassar Layer",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Semmi mill-ġdid Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefiniti:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.nl.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "nl",
          	dir : "ltr",
          	common: {
          		"ok": "Ok",
          		"cancel": "Annuleren",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "omlaag", 
          		"key_up": "omhoog", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Mogelijk gemaakt door"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Toon/verberg meer lijn gereedschap",
          		"palette_info": "Klik om de vul kleur te veranderen, shift-klik om de lijn kleur te veranderen",
          		"zoom_level": "In-/uitzoomen",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identificeer het element",
          		"fill_color": "Verander vul kleur",
          		"stroke_color": "Verander lijn kleur",
          		"stroke_style": "Verander lijn stijl",
          		"stroke_width": "Verander lijn breedte",
          		"pos_x": "Verander X coordinaat",
          		"pos_y": "Verander Y coordinaat",
          		"linecap_butt": "Lijneinde: Geen",
          		"linecap_round": "Lijneinde: Rond",
          		"linecap_square": "Lijneinde: Vierkant",
          		"linejoin_bevel": "Lijnverbinding: Afgestompt",
          		"linejoin_miter": "Lijnverbinding: Hoek",
          		"linejoin_round": "Lijnverbinding: Rond",
          		"angle": "Draai",
          		"blur": "Verander Gaussische vervaging waarde",
          		"opacity": "Verander opaciteit geselecteerde item",
          		"circle_cx": "Verander het X coordinaat van het cirkel middelpunt",
          		"circle_cy": "Verander het Y coordinaat van het cirkel middelpunt",
          		"circle_r": "Verander de cirkel radius",
          		"ellipse_cx": "Verander het X coordinaat van het ellips middelpunt",
          		"ellipse_cy": "Verander het Y coordinaat van het ellips middelpunt",
          		"ellipse_rx": "Verander ellips X radius",
          		"ellipse_ry": "Verander ellips Y radius",
          		"line_x1": "Verander start X coordinaat van de lijn",
          		"line_x2": "Verander eind X coordinaat van de lijn",
          		"line_y1": "Verander start Y coordinaat van de lijn",
          		"line_y2": "Verander eind Y coordinaat van de lijn",
          		"rect_height": "Verander hoogte rechthoek",
          		"rect_width": "Verander breedte rechthoek",
          		"corner_radius": "Verander hoekradius rechthoek",
          		"image_width": "Verander breedte afbeelding",
          		"image_height": "Verander hoogte afbeelding",
          		"image_url": "Verander URL",
          		"node_x": "Verander X coordinaat knooppunt",
          		"node_y": "Verander Y coordinaat knooppunt",
          		"seg_type": "Verander segment type",
          		"straight_segments": "Recht",
          		"curve_segments": "Gebogen",
          		"text_contents": "Wijzig tekst",
          		"font_family": "Verander lettertype",
          		"font_size": "Verander lettertype grootte",
          		"bold": "Vet",
          		"italic": "Cursief"
          	},
          	tools: { 
          		"main_menu": "Hoofdmenu",
          		"bkgnd_color_opac": "Verander achtergrond kleur/doorzichtigheid",
          		"connector_no_arrow": "Geen pijl",
          		"fitToContent": "Pas om inhoud",
          		"fit_to_all": "Pas om alle inhoud",
          		"fit_to_canvas": "Pas om canvas",
          		"fit_to_layer_content": "Pas om laag inhoud",
          		"fit_to_sel": "Pas om selectie",
          		"align_relative_to": "Uitlijnen relatief ten opzichte van ...",
          		"relativeTo": "Relatief ten opzichte van:",
          		"Pagina": "Pagina",
          		"largest_object": "Grootste object",
          		"selected_objects": "Geselecteerde objecten",
          		"smallest_object": "Kleinste object",
          		"new_doc": "Nieuwe afbeelding",
          		"open_doc": "Open afbeelding",
          		"export_img": "Export",
          		"save_doc": "Afbeelding opslaan",
          		"import_doc": "Importeer SVG",
          		"align_to_page": "Lijn element uit relatief ten opzichte van de pagina",
          		"align_bottom": "Onder uitlijnen",
          		"align_center": "Centreren",
          		"align_left": "Links uitlijnen",
          		"align_middle": "Midden uitlijnen",
          		"align_right": "Rechts uitlijnen",
          		"align_top": "Boven uitlijnen",
          		"mode_select": "Selecteer",
          		"mode_fhpath": "Potlood",
          		"mode_line": "Lijn",
          		"mode_connect": "Verbind twee objecten",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Vrije stijl rechthoek",
          		"mode_ellipse": "Ellips",
          		"mode_circle": "Cirkel",
          		"mode_fhellipse": "Vrije stijl ellips",
          		"mode_path": "Pad",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Tekst",
          		"mode_image": "Afbeelding",
          		"mode_zoom": "Zoom",
          		"mode_eyedropper": "Kleuren kopieer gereedschap",
          		"no_embed": "Let op: Dit plaatje kan niet worden geintegreerd (embeded). Het hangt af van dit pad om te worden afgebeeld.",
          		"undo": "Ongedaan maken",
          		"redo": "Opnieuw doen",
          		"tool_source": "Bewerk bron",
          		"wireframe_mode": "Draadmodel",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Groepeer elementen",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Zet om naar pad",
          		"reorient_path": "Herorienteer pad",
          		"ungroup": "Groepering opheffen",
          		"docprops": "Documenteigenschappen",
          		"imagelib": "Image Library",
          		"move_bottom": "Naar achtergrond",
          		"move_top": "Naar voorgrond",
          		"node_clone": "Kloon knooppunt",
          		"node_delete": "Delete knooppunt",
          		"node_link": "Koppel controle punten",
          		"add_subpath": "Subpad toevoegen",
          		"openclose_path": "Open/sluit subpad",
          		"source_save": "Veranderingen toepassen",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Laag",
          		"layers": "Layers",
          		"del": "Delete laag",
          		"move_down": "Beweeg laag omlaag",
          		"new": "Nieuwe laag",
          		"rename": "Hernoem laag",
          		"move_up": "Beweeg laag omhoog",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Verplaats elementen naar:",
          		"move_selected": "Verplaats geselecteerde elementen naar andere laag"
          	},
          	config: {
          		"image_props": "Afbeeldingeigenschappen",
          		"doc_title": "Titel",
          		"doc_dims": "Canvas afmetingen",
          		"included_images": "Ingesloten afbeeldingen",
          		"image_opt_embed": "Toevoegen data (lokale bestanden)",
          		"image_opt_ref": "Gebruik bestand referentie",
          		"editor_prefs": "Editor eigenschappen",
          		"icon_size": "Icoon grootte",
          		"language": "Taal",
          		"background": "Editor achtergrond",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Let op: De achtergrond wordt niet opgeslagen met de afbeelding.",
          		"icon_large": "Groot",
          		"icon_medium": "Gemiddeld",
          		"icon_small": "Klein",
          		"icon_xlarge": "Extra groot",
          		"select_predefined": "Kies voorgedefinieerd:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Verkeerde waarde gegeven",
          		"noContentToFitTo":"Geen inhoud om omheen te passen",
          		"dupeLayerName":"Er is al een laag met die naam!",
          		"enterUniqueLayerName":"Geef een unieke laag naam",
          		"enterNewLayerName":"Geef een nieuwe laag naam",
          		"layerHasThatName":"Laag heeft al die naam",
          		"QmoveElemsToLayer":"Verplaats geselecteerde elementen naar laag '%s'?",
          		"QwantToClear":"Wil je de afbeelding leeg maken?\nDit zal ook de ongedaan maak geschiedenis wissen!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Er waren analyse fouten in je SVG bron.\nTeruggaan naar de originele SVG bron?",
          		"QignoreSourceChanges":"Veranderingen in de SVG bron negeren?",
          		"featNotSupported":"Functie wordt niet ondersteund",
          		"enterNewImgURL":"Geef de nieuwe afbeelding URL",
          		"defsFailOnSave": "Let op: Vanwege een fout in je browser, kan dit plaatje verkeerd verschijnen (missende hoeken en/of elementen). Het zal goed verschijnen zodra het plaatje echt wordt opgeslagen.",
          		"loadingImage":"Laden van het plaatje, even geduld aub...",
          		"saveFromBrowser": "Kies \"Save As...\" in je browser om dit plaatje op te slaan als een %s bestand.",
          		"noteTheseIssues": "Let op de volgende problemen: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.no.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "no",
          	dir : "ltr",
          	common: {
          		"ok": "Lagre",
          		"cancel": "Avbryt",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click å endre fyllfarge, shift-klikke for å endre slag farge",
          		"zoom_level": "Endre zoomnivå",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Endre fyllfarge",
          		"stroke_color": "Endre stroke color",
          		"stroke_style": "Endre stroke dash stil",
          		"stroke_width": "Endre stroke width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Endre rotasjonsvinkelen",
          		"blur": "Change gaussian blur value",
          		"opacity": "Endre valgte elementet opasitet",
          		"circle_cx": "Endre sirkelens CX koordinatsystem",
          		"circle_cy": "Endre sirkelens koordinere cy",
          		"circle_r": "Endre sirkelens radius",
          		"ellipse_cx": "Endre ellipse&#39;s CX koordinatsystem",
          		"ellipse_cy": "Endre ellipse&#39;s koordinere cy",
          		"ellipse_rx": "Endre ellipse&#39;s x radius",
          		"ellipse_ry": "Endre ellipse&#39;s y radius",
          		"line_x1": "Endre linje begynner x koordinat",
          		"line_x2": "Endre linje&#39;s ending x koordinat",
          		"line_y1": "Endre linje begynner y koordinat",
          		"line_y2": "Endre linje&#39;s ending y koordinat",
          		"rect_height": "Endre rektangel høyde",
          		"rect_width": "Endre rektangel bredde",
          		"corner_radius": "Endre rektangel Corner Radius",
          		"image_width": "Endre bilde bredde",
          		"image_height": "Endre bilde høyde",
          		"image_url": "Endre URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Endre tekst innholdet",
          		"font_family": "Change Font Family",
          		"font_size": "Endre skriftstørrelse",
          		"bold": "Fet tekst",
          		"italic": "Kursiv tekst"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Endre bakgrunnsfarge / opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Passer til alt innhold",
          		"fit_to_canvas": "Tilpass til lerret",
          		"fit_to_layer_content": "Fit to lag innhold",
          		"fit_to_sel": "Tilpass til valg",
          		"align_relative_to": "Juster i forhold til ...",
          		"relativeTo": "i forhold til:",
          		"side": "side",
          		"largest_object": "største objekt",
          		"selected_objects": "velges objekter",
          		"smallest_object": "minste objekt",
          		"new_doc": "New Image",
          		"open_doc": "Åpne Image",
          		"export_img": "Export",
          		"save_doc": "Lagre bilde",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Midtstill",
          		"align_left": "Venstrejuster",
          		"align_middle": "Rett Middle",
          		"align_right": "Høyrejuster",
          		"align_top": "Align Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Linjeverktøy",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand rektangel",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Angre",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Gruppe Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Dele opp Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Flytt til toppen",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Lagre",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Slett laget",
          		"move_down": "Flytt laget ned",
          		"new": "Nytt lag",
          		"rename": "Rename Layer",
          		"move_up": "Flytt Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Velg forhåndsdefinerte:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.pl.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "pl",
          	dir : "ltr",
          	author: "Aleksander Lurie",
          	common: {
          		"ok": "OK",
          		"cancel": "Anuluj",
          		"key_backspace": "usuń", 
          		"key_del": "usuń", 
          		"key_down": "w dół", 
          		"key_up": "w górę", 
          		"more_opts": "więcej opcji",
          		"url": "adres url",
          		"width": "Szerokość",
          		"height": "Wysokość"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Pokaż/ukryj więcej opcji obramowania",
          		"palette_info": "Kliknij aby zmienić kolor wypełnienia, przytrzymaj shift aby zmienić kolor obramowania",
          		"zoom_level": "Zmiana powiększenia",
          		"panel_drag": "Przeciągnij w lewo/prawo aby zmienić szerokość panelu"
          	},
          	properties: {
          		"id": "Identyfikator elementu",
          		"fill_color": "Zmień kolor wypełnienia",
          		"stroke_color": "Zmień kolor obramowania",
          		"stroke_style": "Zmień styl obramowania",
          		"stroke_width": "Zmień szerokość obramowania o 1, przytrzymaj shift aby zmienić szerokość o 0.1",
          		"pos_x": "Zmień współrzędną X",
          		"pos_y": "Zmień współrzędną Y",
          		"linecap_butt": "Zakończenie linii: grzbiet",
          		"linecap_round": "Zakończenie linii: zaokrąglone",
          		"linecap_square": "Zakończenie linii: kwadrat",
          		"linejoin_bevel": "Łączenie linii: ścięte",
          		"linejoin_miter": "Łączenie linii: ostre",
          		"linejoin_round": "Łączenie linii: zaokrąglone",
          		"angle": "Zmień kąt obrotu",
          		"blur": "Zmień wartość rozmycia gaussa",
          		"opacity": "Zmień przezroczystość zaznaczonego elementu",
          		"circle_cx": "Zmień współrzędną cx okręgu",
          		"circle_cy": "Zmień współrzędną cy okręgu",
          		"circle_r": "zmień promień okręgu",
          		"ellipse_cx": "Zmień współrzędną cx elipsy",
          		"ellipse_cy": "Zmień współrzędną cy elipsy",
          		"ellipse_rx": "Zmień promień x elipsy",
          		"ellipse_ry": "Zmień promień y elipsy",
          		"line_x1": "Zmień współrzędna x początku linii",
          		"line_x2": "Zmień współrzędną x końca linii",
          		"line_y1": "Zmień współrzędną y początku linii",
          		"line_y2": "Zmień współrzędną y końca linii",
          		"rect_height": "Zmień wysokość prostokąta",
          		"rect_width": "Zmień szerokość prostokąta",
          		"corner_radius": "Zmień promień zaokrąglenia narożników prostokąta",
          		"image_width": "Zmień wysokość obrazu",
          		"image_height": "Zmień szerokość obrazu",
          		"image_url": "Zmień adres URL",
          		"node_x": "Zmień współrzędną x węzła",
          		"node_y": "Zmień współrzędną y węzła",
          		"seg_type": "Zmień typ segmentu",
          		"straight_segments": "Prosty",
          		"curve_segments": "Zaokrąglony",
          		"text_contents": "Zmień text",
          		"font_family": "Zmień krój czcionki",
          		"font_size": "Zmień rozmiar czcionki",
          		"bold": "Pogrubienie textu",
          		"italic": "Kursywa"
          	},
          	tools: { 
          		"main_menu": "Menu główne",
          		"bkgnd_color_opac": "Zmiana koloru/przezroczystości tła",
          		"connector_no_arrow": "Brak strzałek",
          		"fitToContent": "Dopasuj do zawartości",
          		"fit_to_all": "Dopasuj do całej zawartości",
          		"fit_to_canvas": "Dopasuj do widoku",
          		"fit_to_layer_content": "Dopasuj do zawartości warstwy",
          		"fit_to_sel": "Dopasuj do zaznaczenia",
          		"align_relative_to": "Wyrównaj relatywnie do ...",
          		"relativeTo": "relatywnie do:",
          		"page": "strona",
          		"largest_object": "największy obiekt",
          		"selected_objects": "zaznaczone obiekty",
          		"smallest_object": "najmniejszy obiekt",
          		"new_doc": "Nowy obraz",
          		"open_doc": "Otwórz obraz",
          		"export_img": "Eksportuj",
          		"save_doc": "Zapisz obraz",
          		"import_doc": "Importuj SVG",
          		"align_to_page": "Wyrównaj element do strony",
          		"align_bottom": "Wyrównaj do dołu",
          		"align_center": "Wyśrodkuj w poziomie",
          		"align_left": "Wyrównaj do lewej",
          		"align_middle": "Wyśrodkuj w pionie",
          		"align_right": "Wyrównaj do prawej",
          		"align_top": "Wyrównaj do góry",
          		"mode_select": "Zaznaczenie",
          		"mode_fhpath": "Ołówek",
          		"mode_line": "Linia",
          		"mode_connect": "Połącz dwa obiekty",
          		"mode_rect": "Prostokąt",
          		"mode_square": "Kwadrat",
          		"mode_fhrect": "Dowolny prostokąt",
          		"mode_ellipse": "Elipsa",
          		"mode_circle": "Okrąg",
          		"mode_fhellipse": "Dowolna elipsa",
          		"mode_path": "Ścieżka",
          		"mode_shapelib": "Biblioteka kształtów",
          		"mode_text": "Tekst",
          		"mode_image": "Obraz",
          		"mode_zoom": "Powiększenie",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "Uwaga: Ten obraz nie może być osadzony. Być może podany adres na to nie pozwala",
          		"undo": "Wstecz",
          		"redo": "Dalej",
          		"tool_source": "Edytuj źródło",
          		"wireframe_mode": "Tryb szkieletowy",
          		"toggle_grid": "Pokaż/ukryj siatkę",
          		"clone": "Klonuj element(y)",
          		"del": "Usuń warstwę",
          		"group_elements": "Grupuj elementy",
          		"make_link": "Utwórz łącze",
          		"set_link_url": "Ustal adres URL (pozostaw puste aby usunąć)",
          		"to_path": "Konwertuj do ścieżki",
          		"reorient_path": "Zresetuj obwiednię",
          		"ungroup": "Rozgrupuj elementy",
          		"docprops": "Właściwości dokumentu",
          		"imagelib": "Biblioteka obrazów",
          		"move_bottom": "Przenieś pod spód",
          		"move_top": "Przenieś na wierzch",
          		"node_clone": "Klonuj węzeł",
          		"node_delete": "Usuń węzeł",
          		"node_link": "Podłącz punkty kontrolne",
          		"add_subpath": "Dodaj ścieżkę podrzędną",
          		"openclose_path": "Otwórz/zamknij ścieżkę podrzędną",
          		"source_save": "Zachowaj zmiany",
          		"cut": "Wytnij",
          		"copy": "Kopiuj",
          		"paste": "Wklej",
          		"paste_in_place": "Wklej w miejscu",
          		"delete": "Usuń",
          		"group": "Grupuj",
          		"move_front": "Przenieś do przodu",
          		"move_up": "Przenieś warstwę w górę",
          		"move_down": "Przenieś warstwę w dół",
          		"move_back": "Przenieś do tyłu"
          	},
          	layers: {
          		"layer":"Warstwa",
          		"layers": "Warstwy",
          		"del": "Usuń warstwę",
          		"move_down": "Przenieś warstwę w dół",
          		"new": "Nowa warstwa",
          		"rename": "Zmień nazwę warstwy",
          		"move_up": "Przenieś warstwę w górę",
          		"dupe": "Duplikuj warstwę",
          		"merge_down": "Scal w dół",
          		"merge_all": "Scal  wszystko",
          		"move_elems_to": "Przenieś elementy do:",
          		"move_selected": "Przenieś zaznaczone elementy do innej warstwy"
          	},
          	config: {
          		"image_props": "Własciwości obrazu",
          		"doc_title": "Tytuł",
          		"doc_dims": "Wymiary pola roboczego",
          		"included_images": "Dołączone obrazy",
          		"image_opt_embed": "Dane osadzone (pliki lokalne)",
          		"image_opt_ref": "Użyj referencji do pliku",
          		"editor_prefs": "Ustawienia edytora",
          		"icon_size": "Rozmiar ikon",
          		"language": "Język",
          		"background": "Tło edytora",
          		"editor_img_url": "Adres URL obrazu",
          		"editor_bg_note": "Uwaga: Tło nie zostało zapisane z obrazem.",
          		"icon_large": "Duże",
          		"icon_medium": "Średnie",
          		"icon_small": "Małe",
          		"icon_xlarge": "Bardzo duże",
          		"select_predefined": "Wybierz predefiniowany:",
          		"units_and_rulers": "Jednostki/Linijki",
          		"show_rulers": "Pokaż linijki",
          		"base_unit": "Podstawowa jednostka:",
          		"grid": "Siatka",
          		"snapping_onoff": "Włącz/wyłącz przyciąganie",
          		"snapping_stepsize": "Przyciągaj co:",
          		"grid_color": "Kolor siatki"
          	},
          	shape_cats: {
          		"basic": "Podstawowe",
          		"object": "Obiekty",
          		"symbol": "Symbole",
          		"arrow": "Strzałki",
          		"flowchart": "Bloki",
          		"animal": "Zwierzęta",
          		"game": "Karty i szachy",
          		"dialog_balloon": "Dymki",
          		"electronics": "Elektronika",
          		"math": "Matematyka",
          		"music": "Muzyka",
          		"misc": "Inne",
          		"raphael_1": "raphaeljs.com zestaw 1",
          		"raphael_2": "raphaeljs.com zestaw 2"
          	},
          	imagelib: {
          		"select_lib": "Wybierz bibliotekę obrazów",
          		"show_list": "Pokaż listę bibliotek",
          		"import_single": "Importuj pojedyńczo",
          		"import_multi": "Importuj wiele",
          		"open": "Otwórz jako nowy dokument"
          	},
          	notification: {
          		"invalidAttrValGiven":"Podano nieprawidłową wartość",
          		"noContentToFitTo":"Brak zawartości do dopasowania",
          		"dupeLayerName":"Istnieje już warstwa o takiej nazwie!",
          		"enterUniqueLayerName":"Podaj unikalną nazwę warstwy",
          		"enterNewLayerName":"Podaj nazwe nowej warstwy",
          		"layerHasThatName":"Warstwa już tak się nazywa",
          		"QmoveElemsToLayer":"Przenies zaznaczone elementy do warstwy \"%s\"?",
          		"QwantToClear":"Jesteś pewien, że chcesz wyczyścić pole robocze?\nHistoria projektu również zostanie skasowana",
          		"QwantToOpen":"Jesteś pewien, że chcesz otworzyć nowy plik?\nHistoria projektu również zostanie skasowana",
          		"QerrorsRevertToSource":"Błąd parsowania źródła Twojego pliku SVG.\nPrzywrócić orginalne źródło pliku SVG?",
          		"QignoreSourceChanges":"Zignorowac zmiany w źródle pliku SVG?",
          		"featNotSupported":"Funkcjonalność niedostępna",
          		"enterNewImgURL":"Podaj adres URL nowego obrazu",
          		"defsFailOnSave": "Uwaga: Ze względu na błąd w przeglądarce, ten obraz może się źle wyswietlać (brak gradientów lub elementów). Będzie jednak wyświetlał się poprawnie skoro został zapisany.",
          		"loadingImage":"Ładowanie obrazu, proszę czekać...",
          		"saveFromBrowser": "Wybierz \"Zapisz jako...\" w przeglądarce aby zapisać obraz jako plik %s.",
          		"noteTheseIssues": "Zwróć uwagę na nastepujące kwestie: ",
          		"unsavedChanges": "Wykryto niezapisane zmiany.",
          		"enterNewLinkURL": "Wpisz nowy adres URL hiperłącza",
          		"errorLoadingSVG": "Błąd: Nie można załadować danych SVG",
          		"URLloadFail": "Nie można załadować z adresu URL",
          		"retrieving": "Pobieranie \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.pt-BR.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "pt-BR",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Cancelar",
          		"key_backspace": "Tecla backspace", 
          		"key_del": "Tecla delete", 
          		"key_down": "Seta para baixo", 
          		"key_up": "Seta para cima", 
          		"more_opts": "Mais opções",
          		"url": "URL",
          		"width": "Largura",
          		"height": "Altura"
          	},
          	misc: {
          		"powered_by": "Tecnologia"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Mais opções de traço",
            	"palette_info": "Click para mudar a cor de preenchimento, shift-click para mudar a cor do traço",
          		"zoom_level": "Mudar zoom",
            	"panel_drag": "Arraste para redimensionar o painel"
          	},
          	properties: {
          	 	"id": "Identifica o elemento",
          		"fill_color": "Mudar a cor de preenchimento",
          		"stroke_color": "Mudar a cor do traço",
          		"stroke_style": "Mudar o estilo do traço",
          		"stroke_width": "Mudar a espessura do traço em 1, shift-click para mudar 0.1",
          		"pos_x": "Mudar a coordenada X",
          		"pos_y": "Mudar a coordenada Y",
          		"linecap_butt": "Estilo do fim do traço: Topo",
          		"linecap_round": "Estilo do fim do traço: Redondo",
          		"linecap_square": "Estilo do fim do traço: Quadrado",
          		"linejoin_bevel": "Estilo da Aresta: Chanfro",
          		"linejoin_miter": "Estilo da Aresta: Reto",
          		"linejoin_round": "Estilo da Aresta: Redondo",
          		"angle": "Mudar ângulo de rotação",
          		"blur": "Mudar valor de desfoque",
          		"opacity": "Mudar opacidade do item selecionado",
          		"circle_cx": "Mudar a coordenada cx do círculo",
          		"circle_cy": "Mudar a coordenada cy do círculo",
          		"circle_r": "Mudar o raio do círculo",
          		"ellipse_cx": "Mudar a coordenada cx da elípse",
          		"ellipse_cy": "Mudar a coordenada cy da elípse",
          		"ellipse_rx": "Mudar o raio x da elípse",
          		"ellipse_ry": "Mudar o raio y da elípse",
          		"line_x1": "Mudar a coordenada x do início da linha",
          		"line_x2": "Mudar a coordenada x do fim da linha",
          		"line_y1": "Mudar a coordenada y do início da linha",
          		"line_y2": "Mudar a coordenada y do fim da linha",
          		"rect_height": "Mudar a altura do retângulo",
          		"rect_width": "Mudar a largura do retângulo",
          		"corner_radius": "Mudar o raio da aresta do retângulo",
          		"image_width": "Mudar a largura da imagem",
          		"image_height": "Mudar a altura da imagem",
          		"image_url": "Mudar URL",
          		"node_x": "Mudar a coordenada x da aresta",
          		"node_y": "Mudar a coordenada y da aresta",
          		"seg_type": "Mudar o tipo de segmento",
          		"straight_segments": "Reto",
          		"curve_segments": "Curvo",
          		"text_contents": "Mudar conteúdo do texto",
          		"font_family": "Mudar o estilo da fonte",
          		"font_size": "Mudar o tamanho da fonte",
          		"bold": "Negrito",
          		"italic": "Italico"
          	},
          	tools: { 
          	 	"main_menu": "Menu Principal",
          		"bkgnd_color_opac": "Mudar cor/opacidade do fundo",
          		"connector_no_arrow": "Sem flecha",
          		"fitToContent": "Ajustar ao conteúdo",
          		"fit_to_all": "Ajustar a todo conteúdo",
          		"fit_to_canvas": "Ajustar à tela",
          		"fit_to_layer_content": "Ajustar ao conteúdo da camada",
          		"fit_to_sel": "Ajustar à seleção",
          		"align_relative_to": "Alinhar em relação à ...",
          		"relativeTo": "Referência:",
          		"page": "página",
          		"largest_object": "maior objeto",
          		"selected_objects": "objetos selecionados",
          		"smallest_object": "menor objeto",
          		"new_doc": "Nova imagem",
          		"open_doc": "Abrir imagem",
          		"export_img": "Export",
          		"save_doc": "Salvar imagem",
          		"import_doc": "Importar SVG",
          		"align_to_page": "Alinhar elemento na página",
          		"align_bottom": "Alinhar no fundo",
          		"align_center": "Alinhar no centro",
          		"align_left": "Alinhar na esquerda",
          		"align_middle": "Alinhar no meio",
          		"align_right": "Alinhar na direita",
          		"align_top": "Alinhar no topo",
          		"mode_select": "Selecão",
          		"mode_fhpath": "Lápis",
          		"mode_line": "Linha",
          		"mode_connect": "Conecção",
          		"mode_rect": "Retângulo",
          		"mode_square": "Quadrado",
          		"mode_fhrect": "Retângulo a mão-livre",
          		"mode_ellipse": "Elípse",
          		"mode_circle": "Círculo",
          		"mode_fhellipse": "Elípse a mão-livre",
          		"mode_path": "Contorno",
          		"mode_shapelib": "Biblioteca de Formas",
          		"mode_text": "Texto",
          		"mode_image": "Imagem",
          		"mode_zoom": "Zoom",
          		"mode_eyedropper": "Conta-gotas",
          		"no_embed": "Atenção: Esta imagem não pode ser incorporada e dependerá de seu caminho para ser exibida",
          		"undo": "Desfazer",
          		"redo": "Refazer",
          		"tool_source": "Editar o código",
          		"wireframe_mode": "Modo linhas",
          		"toggle_grid": "Mostrar/Esconder grade",
          		"clone": "Clonar Elemento(s)",
          		"del": "Deletar Elemento(s)",
          		"group_elements": "Agrupar Elementos",
          		"make_link": "Criar (hyper)link",
          		"set_link_url": "Alterar URL (em branco para remover)",
          		"to_path": "Converter para Contorno",
          		"reorient_path": "Reorientar contorno",
          		"ungroup": "Desagrupar Elementos",
          		"docprops": "Propriedades",
          		"imagelib": "Biblioteca de Imagens",
          		"move_bottom": "Mover para o fundo",
          		"move_top": "Mover para o topo",
          		"node_clone": "Clonar Aresta",
          		"node_delete": "Deletar Aresta",
          		"node_link": "Alinhar pontos de controle",
          		"add_subpath": "Adicionar contorno",
          		"openclose_path": "Abrir/Fechar contorno",
          		"source_save": "Salvar",
          		"cut": "Recortar",
          		"copy": "Copiar",
          		"paste": "Colar",
          		"paste_in_place": "Colar no mesmo local",
          		"delete": "Deletar",
          		"group": "Agrupar",
          		"move_front": "Trazer para Frente",
          		"move_up": "Avançar",
          		"move_down": "Recuar",
          		"move_back": "Enviar para Trás"
          	},
          	layers: {
          	 	"layer":"Camada",
          		"layers": "Camadas",
          		"del": "Deletar Camada",
          		"move_down": "Enviar Camada para Trás",
          		"new": "Nova Camada",
          		"rename": "Renomear Camada",
          		"move_up": "Trazer Camada para Frente",
          		"dupe": "Duplicar Camada",
          		"merge_down": "Achatar para baixo",
          		"merge_all": "Achatar todas",
          		"move_elems_to": "Mover elementos para:",
          		"move_selected": "Mover elementos selecionados para outra camada"
          	},
          	config: {
          	 	"image_props": "Propriedades",
          		"doc_title": "Título",
          		"doc_dims": "Dimensões",
          		"included_images": "Imagens",
          		"image_opt_embed": "Incorporadas (arquivos locais)",
          		"image_opt_ref": "Usar referência",
          		"editor_prefs": "Preferências",
          		"icon_size": "Tamanho dos ícones",
          		"language": "Idioma",
          		"background": "Fundo da página",
          		"editor_img_url": "URL da Imagem",
          		"editor_bg_note": "Atenção: Fundo da página não será salvo.",
          		"icon_large": "Grande",
          		"icon_medium": "Médio",
          		"icon_small": "Pequeno",
          		"icon_xlarge": "Extra Grande",
          		"select_predefined": "Modelos:",
          		"units_and_rulers": "Unidade & Réguas",
          		"show_rulers": "Mostrar réguas",
          		"base_unit": "Unidade base:",
          		"grid": "Grade",
          		"snapping_onoff": "Snap on/off",
          		"snapping_stepsize": "Intensidade do Snap:"
          	},
          	shape_cats: {
          		"basic": "Básico",
          		"object": "Objetos",
          		"symbol": "Símbolos",
          		"arrow": "Flechas",
          		"flowchart": "Fluxograma",
          		"animal": "Animais",
          		"game": "Jogos",
          		"dialog_balloon": "Balões",
          		"electronics": "Eletrônica",
          		"math": "Matemática",
          		"music": "Música",
          		"misc": "Outros",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Selecione uma biblioteca de imagens",
          		"show_list": "Voltar à lista de bibliotecas",
          		"import_single": "Importar um",
          		"import_multi": "Importar múltiplos",
          		"open": "Abrir como novo"
          	},
          	notification: {
          		"invalidAttrValGiven":"Valor inválido",
          		"noContentToFitTo":"Não há conteúdo",
          		"dupeLayerName":"Nome duplicado",
          		"enterUniqueLayerName":"Insira um nome único",
          		"enterNewLayerName":"Insira um novo nome",
          		"layerHasThatName":"A camada já pussui este nome",
          		"QmoveElemsToLayer":"Mover elementos selecionados para a camada: \"%s\"?",
          		"QwantToClear":"Deseja criar um novo arquivo?\nO histórico também será apagado!",
          		"QwantToOpen":"Deseja abrir um novo arquivo?\nO histórico também será apagado!",
          		"QerrorsRevertToSource":"Foram encontrados erros ná análise do código SVG.\nReverter para o código SVG original?",
          		"QignoreSourceChanges":"Ignorar as mudanças no código SVG?",
          		"featNotSupported":"Recurso não suportado",
          		"enterNewImgURL":"Insira nova URL da imagem",
          		"defsFailOnSave": "Atenção: Devido a um bug em seu navegador, esta imagem pode apresentar erros, porém será salva corretamente.",
          		"loadingImage":"Carregando imagem, por favor aguarde...",
          		"saveFromBrowser": "Selecione \"Salvar como...\" no seu navegador para salvar esta imagem como um arquivo %s.",
          		"noteTheseIssues": "Atenção para as seguintes questões: ",
          		"unsavedChanges": "Existem alterações não salvas.",
          		"enterNewLinkURL": "Insira novo URL do hyperlink",
          		"errorLoadingSVG": "Erro: Impossível carregar dados SVG",
          		"URLloadFail": "Impossível carregar deste URL",
          		"retrieving": "Recuperando \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.pt-PT.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "pt-PT",
          	dir : "ltr",
          	common: {
          		"ok": "Salvar",
          		"cancel": "Cancelar",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Clique para mudar a cor de preenchimento, shift-clique para mudar a cor do curso",
          		"zoom_level": "Alterar o nível de zoom",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Alterar a cor de preenchimento",
          		"stroke_color": "Mudar a cor do curso",
          		"stroke_style": "Alterar o estilo do traço do curso",
          		"stroke_width": "Alterar a largura do curso",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Alterar o ângulo de rotação",
          		"blur": "Change gaussian blur value",
          		"opacity": "Mude a opacidade item selecionado",
          		"circle_cx": "Cx Mudar círculo de coordenadas",
          		"circle_cy": "Círculo Mudança cy coordenar",
          		"circle_r": "Alterar círculo de raio",
          		"ellipse_cx": "Alterar elipse cx coordenar",
          		"ellipse_cy": "Elipse Mudança cy coordenar",
          		"ellipse_rx": "Raio X Change elipse",
          		"ellipse_ry": "Raio y Change elipse",
          		"line_x1": "Altere a linha de partida coordenada x",
          		"line_x2": "Altere a linha está terminando coordenada x",
          		"line_y1": "Mudança na linha de partida coordenada y",
          		"line_y2": "Mudança de linha está terminando coordenada y",
          		"rect_height": "Alterar altura do retângulo",
          		"rect_width": "Alterar a largura retângulo",
          		"corner_radius": "Alterar Corner Rectangle Radius",
          		"image_width": "Alterar a largura da imagem",
          		"image_height": "Alterar altura da imagem",
          		"image_url": "Alterar URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Alterar o conteúdo de texto",
          		"font_family": "Alterar fonte Família",
          		"font_size": "Alterar tamanho de letra",
          		"bold": "Bold Text",
          		"italic": "Texto em itálico"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Mudar a cor de fundo / opacidade",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Ajustar ao conteúdo",
          		"fit_to_all": "Ajustar a todo o conteúdo",
          		"fit_to_canvas": "Ajustar à tela",
          		"fit_to_layer_content": "Ajustar o conteúdo da camada de",
          		"fit_to_sel": "Ajustar à selecção",
          		"align_relative_to": "Alinhar em relação a ...",
          		"relativeTo": "em relação ao:",
          		"Página": "Página",
          		"largest_object": "maior objeto",
          		"selected_objects": "objetos eleitos",
          		"smallest_object": "menor objeto",
          		"new_doc": "Nova Imagem",
          		"open_doc": "Abrir Imagem",
          		"export_img": "Export",
          		"save_doc": "Salvar Imagem",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Alinhar ao centro",
          		"align_left": "Alinhar à Esquerda",
          		"align_middle": "Alinhar Médio",
          		"align_right": "Alinhar à Direita",
          		"align_top": "Align Top",
          		"mode_select": "Selecione a ferramenta",
          		"mode_fhpath": "Ferramenta Lápis",
          		"mode_line": "Ferramenta Linha",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Elipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Ferramenta de Texto",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Desfazer",
          		"redo": "Refazer",
          		"tool_source": "Fonte Editar",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Elementos do Grupo",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Elementos Desagrupar",
          		"docprops": "Propriedades do Documento",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Salvar",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move camada para baixo",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Selecione predefinidos:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ro.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ro",
          	dir : "ltr",
          	common: {
          		"ok": "Ok",
          		"cancel": "Anulaţi",
          		"key_backspace": "backspace", 
          		"key_del": "ştergere", 
          		"key_down": "jos", 
          		"key_up": "sus", 
          		"more_opts": "Mai multe opţiuni",
          		"url": "URL",
          		"width": "Lăţime",
          		"height": "Înălţime"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Arătaţi/ascundeţi mai multe unelte de contur",
          		"palette_info": "Faceţi clic pentru a schimba culoarea de umplere, Shift-clic pentru a schimba culoarea de contur",
          		"zoom_level": "Schimbarea nivelului de zoom",
          		"panel_drag": "Trageţi la stanga/dreapta pentru redimensionare panou lateral"
          	},
          	properties: {
          		"id": "Identificare element",
          		"fill_color": "Schimbarea culorii de umplere",
          		"stroke_color": "Schimbarea culorii de contur",
          		"stroke_style": "Schimbarea stilului de contur",
          		"stroke_width": "Schimbarea lăţimii conturului",
          		"pos_x": "Schimbă coordonata X",
          		"pos_y": "Schimbă coordonata Y",
          		"linecap_butt": "Capăt de linie: Butuc",
          		"linecap_round": "Capăt de linie: Rotund",
          		"linecap_square": "Capăt de linie: Pătrat",
          		"linejoin_bevel": "Articulaţia liniei: Teşită",
          		"linejoin_miter": "Articulaţia liniei: Unghi ascuţit",
          		"linejoin_round": "Articulaţia liniei: Rotundă",
          		"angle": "Schimbarea unghiul de rotaţie",
          		"blur": "Schimbarea valorii estomparii gaussiene",
          		"opacity": "Schimbarea gradului de opacitate",
          		"circle_cx": "Schimbarea coordonatei CX a cercului",
          		"circle_cy": "Schimbarea coordonatei CY a cercului",
          		"circle_r": "Schimbarea razei cercului",
          		"ellipse_cx": "Schimbarea coordonatei CX a elipsei",
          		"ellipse_cy": "Schimbarea coordonatei CY a elipsei",
          		"ellipse_rx": "Schimbarea razei elipsei X",
          		"ellipse_ry": "Schimbarea razei elipsei Y",
          		"line_x1": "Schimbarea coordonatei x a punctului de start",
          		"line_x2": "Schimbarea coordonatei x a punctului final",
          		"line_y1": "Schimbarea coordonatei y a punctului de start",
          		"line_y2": "Schimbare coordonatei y a punctului final",
          		"rect_height": "Schimbarea înălţimii dreptunghiului",
          		"rect_width": "Schimbarea lăţimii dreptunghiului",
          		"corner_radius": "Schimbarea razei colţului dreptunghiului",
          		"image_width": "Schimbarea lăţimii imaginii",
          		"image_height": "Schimbarea înălţimii imaginii",
          		"image_url": "Schimbaţi URL-ul",
          		"node_x": "Schimbă coordonata x a punctului",
          		"node_y": "Schimbă coordonata x a punctului",
          		"seg_type": "Schimbă tipul de segment",
          		"straight_segments": "Drept",
          		"curve_segments": "Curb",
          		"text_contents": "Schimbarea conţinutului textului",
          		"font_family": "Modificare familie de fonturi",
          		"font_size": "Schimbă dimensiunea fontului",
          		"bold": "Text Îngroşat",
          		"italic": "Text Înclinat"
          	},
          	tools: { 
          		"main_menu": "Menu Principal",
          		"bkgnd_color_opac": "Schimbare culoare de fundal / opacitate",
          		"connector_no_arrow": "Fără săgeată",
          		"fitToContent": "Dimensionare la conţinut",
          		"fit_to_all": "Potrivire la tot conţinutul",
          		"fit_to_canvas": "Potrivire la Şevalet",
          		"fit_to_layer_content": "Potrivire la conţinutul stratului",
          		"fit_to_sel": "Potrivire la selecţie",
          		"align_relative_to": "Aliniere în raport cu ...",
          		"relativeTo": "în raport cu:",
          		"de start": "de start",
          		"largest_object": "cel mai mare obiect",
          		"selected_objects": "obiectele alese",
          		"smallest_object": "cel mai mic obiect",
          		"new_doc": "Imagine nouă",
          		"open_doc": "Imagine deschisă",
          		"export_img": "Export",
          		"save_doc": "Salvare imagine",
          		"import_doc": "Importare SVG",
          		"align_to_page": "Aliniere la pagină",
          		"align_bottom": "Aliniere jos",
          		"align_center": "Aliniere la centru",
          		"align_left": "Aliniere la stânga",
          		"align_middle": "Aliniere la mijloc",
          		"align_right": "Aliniere la dreapta",
          		"align_top": "Aliniere sus",
          		"mode_select": "Unealtă de Selectare",
          		"mode_fhpath": "Unealtă de Traiectorie",
          		"mode_line": "Unealtă de Linie",
          		"mode_connect": "Conectati doua obiecte",
          		"mode_rect": "Unealtă de Dreptunghi",
          		"mode_square": "Unealtă de Pătrat",
          		"mode_fhrect": "Dreptunghi cu mana liberă",
          		"mode_ellipse": "Elipsă",
          		"mode_circle": "Cerc",
          		"mode_fhellipse": "Elipsă cu mana liberă",
          		"mode_path": "Unealtă de Traiectorie",
          		"mode_shapelib": "Biblioteca de forme",
          		"mode_text": "Unealtă de Text",
          		"mode_image": "Unealtă de Imagine",
          		"mode_zoom": "Unealtă de Zoom",
          		"mode_eyedropper": "Unealtă de captura Culoare",
          		"no_embed": "NOTE: Aceasta imagine nu poate fi inglobată. Va depinde de aceasta traiectorie pentru a fi prezentată.",
          		"undo": "Anulare",
          		"redo": "Refacere",
          		"tool_source": "Editare Cod Sursă",
          		"wireframe_mode": "Mod Schelet",
          		"toggle_grid": "Arată/ascunde Caroiaj",
          		"clone": "Clonează Elementul/ele",
          		"del": "Şterge Elementul/ele",
          		"group_elements": "Grupare Elemente",
          		"make_link": "Crează (hyper)link",
          		"set_link_url": "Setează link URL (lăsaţi liber pentru eliminare)",
          		"to_path": "Converteşte in Traiectorie",
          		"reorient_path": "Reorientează Traiectoria",
          		"ungroup": "Anulare Grupare Elemente",
          		"docprops": "Proprietăţile Documentului",
          		"imagelib": "Bibliotecă de Imagini",
          		"move_bottom": "Mutare în jos",
          		"move_top": "Mutare în sus",
          		"node_clone": "Clonează Punct",
          		"node_delete": "Şterge Punct",
          		"node_link": "Uneşte Punctele de Control",
          		"add_subpath": "Adăugaţi sub-traiectorie",
          		"openclose_path": "Deschide/inchide sub-traiectorie",
          		"source_save": "Folosiţi Schimbările",
          		"cut": "Tăiere",
          		"copy": "Copiere",
          		"paste": "Reproducere",
          		"paste_in_place": "Reproducere pe loc",
          		"delete": "Ştergere",
          		"group": "Group",
          		"move_front": "Pune in faţa",
          		"move_up": "Pune in spate",
          		"move_down": "Trimite in faţa",
          		"move_back": "Trimite in spate"
          	},
          	layers: {
          		"layer":"Strat",
          		"layers": "Straturi",
          		"del": "Ştergeţi Strat",
          		"move_down": "Mutare Strat în Jos",
          		"new": "Strat Nou",
          		"rename": "Redenumiţi Stratul",
          		"move_up": "Mutare Strat în Sus",
          		"dupe": "Duplicaţi Stratul",
          		"merge_down": "Fuzionare in jos",
          		"merge_all": "Fuzionarea tuturor",
          		"move_elems_to": "Mută elemente la:",
          		"move_selected": "Mută elementele selectate pe un alt strat"
          	},
          	config: {
          		"image_props": "Proprietăţile Imaginii",
          		"doc_title": "Titlul",
          		"doc_dims": "Dimensiunile Şevaletului",
          		"included_images": "Imaginile Incluse",
          		"image_opt_embed": "Includeţi Datele (fişiere locale)",
          		"image_opt_ref": "Foloseşte referinţe la fişiere",
          		"editor_prefs": "Preferinţele Editorului",
          		"icon_size": "Dimensiunile Butoanelor",
          		"language": "Limba",
          		"background": "Fondul Editorului",
          		"editor_img_url": "URL-ul Imaginii",
          		"editor_bg_note": "Notă: Fondul nu va fi salvat cu imaginea.",
          		"icon_large": "Mari",
          		"icon_medium": "Medii",
          		"icon_small": "Mici",
          		"icon_xlarge": "Foarte Mari",
          		"select_predefined": "Selecţii predefinite:",
          		"units_and_rulers": "Unitati si Rigle",
          		"show_rulers": "Arată Riglele",
          		"base_unit": "Unitate de baza:",
          		"grid": "Caroiaj",
          		"snapping_onoff": "Fixare on/off",
          		"snapping_stepsize": "Dimensiunea pasului de fixare:"
          	},
          	shape_cats: {
          		"basic": "De bază",
          		"object": "Obiecte",
          		"symbol": "Simboluri",
          		"arrow": "Săgeti",
          		"flowchart": "Schemă Logică",
          		"animal": "Animale",
          		"game": "Cărti & şah",
          		"dialog_balloon": "Baloane de dialog",
          		"electronics": "Electronice",
          		"math": "Matematică",
          		"music": "Muzică",
          		"misc": "Diverse",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Selectati o biblioteca de imagini",
          		"show_list": "Arătaţi lista bibliotecii",
          		"import_single": "Importare unică",
          		"import_multi": "Importare multiplă",
          		"open": "Deschideţi ca si document nou"
          	},
          	notification: {
          		"invalidAttrValGiven":"Valoarea data nu este validă",
          		"noContentToFitTo":"Fara conţinut de referinţă",
          		"dupeLayerName":"Deja exista un strat numit asa!",
          		"enterUniqueLayerName":"Rog introduceţi un nume unic",
          		"enterNewLayerName":"Rog introduceţi un nume pentru strat",
          		"layerHasThatName":"Statul deja are acest nume",
          		"QmoveElemsToLayer":"Mutaţi elementele selectate pe stratul '%s'?",
          		"QwantToClear":"Doriti să ştergeţi desenul?\nAceasta va sterge si posibilitatea de anulare!",
          		"QwantToOpen":"Doriti sa deschideţi un nou fişier?\nAceasta va şterge istoricul!",
          		"QerrorsRevertToSource":"Sunt erori de parsing in sursa SVG.\nRevenire la sursa SVG orginală?",
          		"QignoreSourceChanges":"Ignoraţi schimbarile la sursa SVG?",
          		"featNotSupported":"Funcţie neimplementată",
          		"enterNewImgURL":"Introduceţi noul URL pentru Imagine",
          		"defsFailOnSave": "NOTE: Din cauza unei erori in browserul dv., aceasta imagine poate apare gresit (fara gradiente sau elemente). Însă va apare corect dupa salvare.",
          		"loadingImage":"Imaginea se incarcă, va rugam asteptaţi...",
          		"saveFromBrowser": "Selectează \"Salvează ca si...\" in browserul dv. pt. a salva aceasta imagine ca si fisier %s.",
          		"noteTheseIssues": "De asemenea remarcati urmatoarele probleme: ",
          		"unsavedChanges": "Sunt schimbări nesalvate.",
          		"enterNewLinkURL": "IntroduAliniere în raport cu ...sceţi noul URL",
          		"errorLoadingSVG": "Eroare: Nu se pot încărca datele SVG",
          		"URLloadFail": "Nu se poate încărca de la URL",
          		"retrieving": "În preluare \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.ru.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "ru",
          	dir : "ltr",
          	common: {
          		"ok": "Сохранить",
          		"cancel": "Отменить",
          		"key_backspace": "Backspace", 
          		"key_del": "Delete", 
          		"key_down": "Вниз", 
          		"key_up": "Вверх", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Нажмите для изменения цвета заливки, Shift-Click изменить цвета обводки",
          		"zoom_level": "Изменить масштаб",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Изменить цвет заливки",
          		"stroke_color": "Изменить цвет обводки",
          		"stroke_style": "Изменить стиль обводки",
          		"stroke_width": "Изменить толщину обводки",
          		"pos_x": "Изменить горизонтальный координат",
          		"pos_y": "Изменить вертикальный координат",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Изменить угол поворота",
          		"blur": "Change gaussian blur value",
          		"opacity": "Изменить непрозрачность элемента",
          		"circle_cx": "Изменить горизонтальный координат (CX) окружности",
          		"circle_cy": "Изменить вертикальный координат (CY) окружности",
          		"circle_r": "Изменить радиус окружности",
          		"ellipse_cx": "Изменить горизонтальный координат (CX) эллипса",
          		"ellipse_cy": "Изменить вертикальный координат (CY) эллипса",
          		"ellipse_rx": "Изменить горизонтальный радиус эллипса",
          		"ellipse_ry": "Изменить вертикальный радиус эллипса",
          		"line_x1": "Изменить горизонтальный координат X начальной точки линии",
          		"line_x2": "Изменить горизонтальный координат X конечной точки линии",
          		"line_y1": "Изменить вертикальный координат Y начальной точки линии",
          		"line_y2": "Изменить вертикальный координат Y конечной точки линии",
          		"rect_height": "Изменениe высоту прямоугольника",
          		"rect_width": "Измененить ширину прямоугольника",
          		"corner_radius": "Радиус закругленности угла",
          		"image_width": "Изменить ширину изображения",
          		"image_height": "Изменить высоту изображения",
          		"image_url": "Изменить URL",
          		"node_x": "Изменить горизонтальную координату узла",
          		"node_y": "Изменить вертикальную координату узла",
          		"seg_type": "Изменить вид",
          		"straight_segments": "Отрезок",
          		"curve_segments": "Сплайн",
          		"text_contents": "Изменить содержание текста",
          		"font_family": "Изменить семейство шрифтов",
          		"font_size": "Изменить размер шрифта",
          		"bold": "Жирный",
          		"italic": "Курсив"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Изменить цвет фона или прозрачность",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Под размер содержимого",
          		"fit_to_all": "Под размер всех слоев",
          		"fit_to_canvas": "Под размер холста",
          		"fit_to_layer_content": "Под размер содержания слоя",
          		"fit_to_sel": "Под размер выделенного",
          		"align_relative_to": "Выровнять по отношению к ...",
          		"relativeTo": "По отношению к ",
          		"страница": "страница",
          		"largest_object": "Наибольший объект",
          		"selected_objects": "Выделенные объекты",
          		"smallest_object": "Самый маленький объект",
          		"new_doc": "Создать изображение",
          		"open_doc": "Открыть изображение",
          		"export_img": "Export",
          		"save_doc": "Сохранить изображение",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Выровнять по нижнему краю",
          		"align_center": "Центрировать по вертикальной оси",
          		"align_left": "По левому краю",
          		"align_middle": "Центрировать по горизонтальной оси",
          		"align_right": "По правому краю",
          		"align_top": "Выровнять по верхнему краю",
          		"mode_select": "Выделить",
          		"mode_fhpath": "Карандаш",
          		"mode_line": "Линия",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Прямоугольник от руки",
          		"mode_ellipse": "Эллипс",
          		"mode_circle": "Окружность",
          		"mode_fhellipse": "Эллипс от руки",
          		"mode_path": "Контуры",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Текст",
          		"mode_image": "Изображение",
          		"mode_zoom": "Лупа",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Отменить",
          		"redo": "Вернуть",
          		"tool_source": "Редактировать исходный код",
          		"wireframe_mode": "Каркас",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Создать группу элементов",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "В контур",
          		"reorient_path": "Изменить ориентацию контура",
          		"ungroup": "Разгруппировать элементы",
          		"docprops": "Свойства документа",
          		"imagelib": "Image Library",
          		"move_bottom": "Опустить",
          		"move_top": "Поднять",
          		"node_clone": "Создать копию узла",
          		"node_delete": "Удалить узел",
          		"node_link": "Связать узлы",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Сохранить",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"Delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Слой",
          		"layers": "Layers",
          		"del": "Удалить слой",
          		"move_down": "Опустить слой",
          		"new": "Создать слой",
          		"rename": "Переименовать Слой",
          		"move_up": "Поднять слой",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Переместить выделенные элементы:",
          		"move_selected": "Переместить выделенные элементы на другой слой"
          	},
          	config: {
          		"image_props": "Свойства изображения",
          		"doc_title": "Название",
          		"doc_dims": "Размеры холста",
          		"included_images": "Встроенные изображения",
          		"image_opt_embed": "Локальные файлы",
          		"image_opt_ref": "По ссылкам",
          		"editor_prefs": "Параметры",
          		"icon_size": "Размер значков",
          		"language": "Язык",
          		"background": "Фон",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "(Фон не сохранится вместе с изображением.)",
          		"icon_large": "Большие",
          		"icon_medium": "Средние",
          		"icon_small": "Малые",
          		"icon_xlarge": "Огромные",
          		"select_predefined": "Выбирать предопределенный размер",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Некорректное значение аргумента",
          		"noContentToFitTo":"Нет содержания, по которому выровнять.",
          		"dupeLayerName":"Слой с этим именем уже существует.",
          		"enterUniqueLayerName":"Пожалуйста, введите имя для слоя.",
          		"enterNewLayerName":"Пожалуйста, введите новое имя.",
          		"layerHasThatName":"Слой уже называется этим именем.",
          		"QmoveElemsToLayer":"Переместить выделенные элементы на слой '%s'?",
          		"QwantToClear":"Вы хотите очистить?\nИстория действий будет забыта!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"Была проблема при парсинге вашего SVG исходного кода.\nЗаменить его предыдущим SVG кодом?",
          		"QignoreSourceChanges":"Забыть без сохранения?",
          		"featNotSupported":"Возможность не реализована",
          		"enterNewImgURL":"Введите новый URL изображения",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.sk.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "sk",
          	dir : "ltr",
          	common: {
          		"ok": "Uložiť",
          		"cancel": "Zrušiť",
          		"key_backspace": "Backspace", 
          		"key_del": "Delete", 
          		"key_down": "šípka dole", 
          		"key_up": "šípka hore", 
          		"more_opts": "Viac možností",
          		"url": "URL",
          		"width": "Šírka",
          		"height": "Výška"
          	},
          	misc: {
          		"powered_by": "Beží na"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Skryť/ukázať viac nástrojov pre krivku",
          		"palette_info": "Kliknutím zmeníte farbu výplne, so Shiftom zmeníte farbu obrysu",
          		"zoom_level": "Zmena priblíženia",
          		"panel_drag": "Potiahnutie vľavo/vpravo na zmenu veľkosti bočného panela"
          	},
          	properties: {
          		"id": "Zmeniť ID elementu",
          		"fill_color": "Zmeniť farbu výplne",
          		"stroke_color": "Zmeniť farbu obrysu",
          		"stroke_style": "Zmeniť štýl obrysu",
          		"stroke_width": "Zmeniť hrúbku obrysu",
          		"pos_x": "Zmeniť súradnicu X",
          		"pos_y": "Zmeniť súradnicu Y",
          		"linecap_butt": "Koniec čiary: presný",
          		"linecap_round": "Koniec čiary: zaoblený",
          		"linecap_square": "Koniec čiary: so štvorcovým presahom",
          		"linejoin_bevel": "Napojenie čiar: skosené",
          		"linejoin_miter": "Napojenie čiar: ostré",
          		"linejoin_round": "Napojenie čiar: oblé",
          		"angle": "Zmeniť uhol natočenia",
          		"blur": "Zmeniť intenzitu rozmazania",
          		"opacity": "Zmeniť prehľadnosť vybraných položiek",
          		"circle_cx": "Zmeniť súradnicu X stredu kružnice",
          		"circle_cy": "Zmeniť súradnicu Y stredu kružnice",
          		"circle_r": "Zmeniť polomer kružnice",
          		"ellipse_cx": "Zmeniť súradnicu X stredu elipsy",
          		"ellipse_cy": "Zmeniť súradnicu Y stredu elipsy",
          		"ellipse_rx": "Zmeniť polomer X elipsy",
          		"ellipse_ry": "Zmeniť polomer Y elipsy",
          		"line_x1": "Zmeniť počiatočnú súradnicu X čiary",
          		"line_x2": "Zmeniť koncovú súradnicu X čiary",
          		"line_y1": "Zmeniť počiatočnú súradnicu Y čiary",
          		"line_y2": "Zmeniť koncovú súradnicu Y čiary",
          		"rect_height": "Zmena výšku obdĺžnika",
          		"rect_width": "Zmeniť šírku obdĺžnika",
          		"corner_radius": "Zmeniť zaoblenie rohov obdĺžnika",
          		"image_width": "Zmeniť šírku obrázka",
          		"image_height": "Zmeniť výšku obrázka",
          		"image_url": "Zmeniť URL",
          		"node_x": "Zmeniť uzlu súradnicu X",
          		"node_y": "Zmeniť uzlu súradnicu Y",
          		"seg_type": "Zmeniť typ segmentu",
          		"straight_segments": "Rovný",
          		"curve_segments": "Krivka",
          		"text_contents": "Zmeniť text",
          		"font_family": "Zmeniť font",
          		"font_size": "Zmeniť veľkosť písma",
          		"bold": "Tučné",
          		"italic": "Kurzíva"
          	},
          	tools: { 
          		"main_menu": "Hlavné menu",
          		"bkgnd_color_opac": "Zmeniť farbu a priehľadnosť pozadia",
          		"connector_no_arrow": "Spojnica bez šípok",
          		"fitToContent": "Prispôsobiť obsahu",
          		"fit_to_all": "Prisposobiť celému obsahu",
          		"fit_to_canvas": "Prispôsobiť stránke",
          		"fit_to_layer_content": "Prispôsobiť obsahu vrstvy",
          		"fit_to_sel": "Prispôsobiť výberu",
          		"align_relative_to": "Zarovnať relatívne k ...",
          		"relativeTo": "vzhľadom k:",
          		"page": "stránke",
          		"largest_object": "najväčšiemu objektu",
          		"selected_objects": "zvoleným objektom",
          		"smallest_object": "najmenšiemu objektu",
          		"new_doc": "Nový obrázok",
          		"open_doc": "Otvoriť obrázok",
          		"export_img": "Export",
          		"save_doc": "Uložiť obrázok",
          		"import_doc": "Import Image",
          		"align_to_page": "Zarovnať element na stránku",
          		"align_bottom": "Zarovnať dole",
          		"align_center": "Zarovnať na stred",
          		"align_left": "Zarovnať doľava",
          		"align_middle": "Zarovnať na stred",
          		"align_right": "Zarovnať doprava",
          		"align_top": "Zarovnať hore",
          		"mode_select": "Výber",
          		"mode_fhpath": "Ceruzka",
          		"mode_line": "Čiara",
          		"mode_connect": "Spojiť dva objekty",
          		"mode_rect": "Obdĺžnik",
          		"mode_square": "Štvorec",
          		"mode_fhrect": "Obdĺžnik voľnou rukou",
          		"mode_ellipse": "Elipsa",
          		"mode_circle": "Kružnica",
          		"mode_fhellipse": "Elipsa voľnou rukou",
          		"mode_path": "Krivka",
          		"mode_shapelib": "Knižnica Tvarov",
          		"mode_text": "Text",
          		"mode_image": "Obrázok",
          		"mode_zoom": "Priblíženie",
          		"mode_eyedropper": "Pipeta",
          		"no_embed": "POZNÁMKA: Tento obrázok nemôže byť vložený. Jeho zobrazenie bude závisieť na jeho ceste",
          		"undo": "Späť",
          		"redo": "Opakovať",
          		"tool_source": "Upraviť SVG kód",
          		"wireframe_mode": "Drôtový model",
          		"toggle_grid": "Zobraz/Skry mriežku",
          		"clone": "Klonuj element(y)",
          		"del": "Zmaž element(y)",
          		"group_elements": "Zoskupiť elementy",
          		"make_link": "Naviaž odkaz (hyper)link",
          		"set_link_url": "Nastav odkaz URL (ak prázdny, odstráni sa)",
          		"to_path": "Previesť na krivku",
          		"reorient_path": "Zmeniť orientáciu krivky",
          		"ungroup": "Zrušiť skupinu",
          		"docprops": "Vlastnosti dokumentu",
          		"imagelib": "Knižnica obrázkov",
          		"move_bottom": "Presunúť spodok",
          		"move_top": "Presunúť na vrch",
          		"node_clone": "Klonovať uzol",
          		"node_delete": "Zmazať uzol",
          		"node_link": "Prepojiť kontrolné body",
          		"add_subpath": "Pridať ďalšiu súčasť krivky",
          		"openclose_path": "Otvoriť/uzatvoriť súčasť krivky",
          		"source_save": "Uložiť",
          		"cut": "Vystrihnutie",
          		"copy": "Kópia",
          		"paste": "Vloženie",
          		"paste_in_place": "Vloženie na pôvodnom mieste",
          		"delete": "Zmazanie",
          		"group": "Group",
          		"move_front": "Vysuň navrch",
          		"move_up": "Vysuň vpred",
          		"move_down": "Zasuň na spodok",
          		"move_back": "Zasuň dozadu"
          	},
          	layers: {
          		"layer": "Vrstva",
          		"layers": "Vrstvy",
          		"del": "Odstrániť vrstvu",
          		"move_down": "Presunúť vrstvu dole",
          		"new": "Nová vrstva",
          		"rename": "Premenovať vrstvu",
          		"move_up": "Presunúť vrstvu hore",
          		"dupe": "Zduplikovať vrstvu",
          		"merge_down": "Zlúčiť s vrstvou dole",
          		"merge_all": "Zlúčiť všetko",
          		"move_elems_to": "Presunúť elementy do:",
          		"move_selected": "Presunúť vybrané elementy do inej vrstvy"
          	},
          	config: {
          		"image_props": "Vlastnosti obrázka",
          		"doc_title": "Titulok",
          		"doc_dims": "Rozmery plátna",
          		"included_images": "Vložené obrázky",
          		"image_opt_embed": "Vložiť data (lokálne súbory)",
          		"image_opt_ref": "Použiť referenciu na súbor",
          		"editor_prefs": "Vlastnosti editora",
          		"icon_size": "Veľkosť ikon",
          		"language": "Jazyk",
          		"background": "Zmeniť pozadie",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Poznámka: Pozadie nebude uložené spolu s obrázkom.",
          		"icon_large": "Veľká",
          		"icon_medium": "Stredná",
          		"icon_small": "Malá",
          		"icon_xlarge": "Extra veľká",
          		"select_predefined": "Vybrať preddefinovaný:",
          		"units_and_rulers": "Jednotky & Pravítka",
          		"show_rulers": "Ukáž pravítka",
          		"base_unit": "Základné jednotky:",
          		"grid": "Mriežka",
          		"snapping_onoff": "Priväzovanie (do mriežky) zap/vyp",
          		"snapping_stepsize": "Priväzovanie (do mriežky) veľkosť kroku:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Základné",
          		"object": "Objekty",
          		"symbol": "Symboly",
          		"arrow": "Šípky",
          		"flowchart": "Vývojové diagramy",
          		"animal": "Zvieratá",
          		"game": "Karty & Šach",
          		"dialog_balloon": "Dialogové balóny",
          		"electronics": "Elektronika",
          		"math": "Matematické",
          		"music": "Hudba",
          		"misc": "Rôzne",
          		"raphael_1": "raphaeljs.com sada 1",
          		"raphael_2": "raphaeljs.com sada 2"
          	},
          	imagelib: {
          		"select_lib": "Výber knižnice obrázkov",
          		"show_list": "Prehľad knižnice",
          		"import_single": "Import jeden",
          		"import_multi": "Import viacero",
          		"open": "Otvoriť ako nový dokument"
          	},
          	notification: {
          		"invalidAttrValGiven":"Neplatná hodnota",
          		"noContentToFitTo":"Vyberte oblasť na prispôsobenie",
          		"dupeLayerName":"Vrstva s daným názvom už existuje!",
          		"enterUniqueLayerName":"Zadajte jedinečný názov vrstvy",
          		"enterNewLayerName":"Zadajte názov vrstvy",
          		"layerHasThatName":"Vrstva už má zadaný tento názov",
          		"QmoveElemsToLayer":"Presunúť elementy do vrstvy '%s'?",
          		"QwantToClear":"Naozaj chcete vymazať kresbu?\n(História bude taktiež vymazaná!)!",
          		"QwantToOpen":"Chcete otvoriť nový súbor?\nTo však tiež vymaže Vašu UNDO knižnicu!",
          		"QerrorsRevertToSource":"Chyba pri načítaní SVG dokumentu.\nVrátiť povodný SVG dokument?",
          		"QignoreSourceChanges":"Ignorovať zmeny v SVG dokumente?",
          		"featNotSupported":"Vlastnosť nie je podporovaná",
          		"enterNewImgURL":"Zadajte nové URL obrázka",
          		"defsFailOnSave": "POZNÁMKA: Kvôli chybe v prehliadači sa tento obrázok môže zobraziť nesprávne (napr. chýbajúce prechody či elementy). Po uložení sa zobrazí správne.",
          		"loadingImage":"Nahrávam obrázok, prosím čakajte ...",
          		"saveFromBrowser": "Vyberte \"Uložiť ako ...\" vo vašom prehliadači na uloženie tohoto obrázka do súboru %s.",
          		"noteTheseIssues": "Môžu sa vyskytnúť nasledujúce problémy: ",
          		"unsavedChanges": "Sú tu neuložené zmeny.",
          		"enterNewLinkURL": "Zadajte nové URL odkazu (hyperlink)",
          		"errorLoadingSVG": "Chyba: Nedajú sa načítať SVG data",
          		"URLloadFail": "Nemožno čítať z URL",
          		"retrieving": "Načítavanie \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.sl.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "sl",
          	dir : "ltr",
          	common: {
          		"ok": "V redu",
          		"cancel": "Prekliči",
          		"key_backspace": "backspace",
          		"key_del": "delete",
          		"key_down": "dol",
          		"key_up": "gor",
          		"more_opts": "Več možnosti",
          		"url": "URL",
          		"width": "širina",
          		"height": "višina"
          	},
          	misc: {
          		"powered_by": "Izdelano z"
          	},
          	ui: {
          		"toggle_stroke_tools": "Pokaži/skrij več orodij za oris",
          		"palette_info": "Kliknite, če želite spremeniti barvo polnila, kliknite+Shift, če želite spremeniti barvo orisa",
          		"zoom_level": "Povečava",
          		"panel_drag": "Povlecite levo/desno za ogled stranske vrstice"
          	},
          	properties: {
          		"id": "ID elementa",
          		"fill_color": "Spremeni barvo polnila",
          		"stroke_color": "Spremeni barvo orisa",
          		"stroke_style": "Spremeni slog orisa",
          		"stroke_width": "Spreminjanje širino orisa",
          		"pos_x": "Spremeni X koordinato",
          		"pos_y": "Spremeni Y koordinato",
          		"linecap_butt": "Začetek črte: odsekan",
          		"linecap_round": "Začetek črte: zaobljen",
          		"linecap_square": "Začetek črte: kvadraten",
          		"linejoin_bevel": "Ovinek črte: Odsekan",
          		"linejoin_miter": "Linejoin: V kot",
          		"linejoin_round": "Linejoin: Zaobljen",
          		"angle": "Spremeni kot zasuka",
          		"blur": "Spremeni zameglitev roba",
          		"opacity": "Spremeni prosojnost",
          		"circle_cx": "Spremeni CX koordinato",
          		"circle_cy": "Spremeni CY koordinato",
          		"circle_r": "Spremeni polmer kroga",
          		"ellipse_cx": "Spremeni CX koordinato",
          		"ellipse_cy": "Spremeni CY koordinato",
          		"ellipse_rx": "Spremeni X polmer",
          		"ellipse_ry": "Spremeni Y polmer",
          		"line_x1": "Spremeni začetno X koordinato",
          		"line_x2": "Spremeni končno X koordinato",
          		"line_y1": "Spremeni začetno Y koordinato",
          		"line_y2": "Spremeni končno Y koordinato",
          		"rect_height": "Spremeni višino pravokotnika",
          		"rect_width": "Spremeni širino pravokotnika",
          		"corner_radius": "Spremeni Pravokotnik Corner Radius",
          		"image_width": "Spremeni širino slike",
          		"image_height": "Spremeni višino slike",
          		"image_url": "Spremeni URL",
          		"node_x": "Spremeni X koordinato oglišča",
          		"node_y": "Spremeni Y koordinato oglišča",
          		"seg_type": "Spremeni vrsto odseka",
          		"straight_segments": "Raven odsek",
          		"curve_segments": "Ukrivljen odsek",
          		"text_contents": "Spremeni besedilo",
          		"font_family": "Spremeni tip pisave",
          		"font_size": "Spremeni velikost pisave",
          		"bold": "Krepko",
          		"italic": "Poševno"
          	},
          	tools: {
          		"main_menu": "Glavni meni",
          		"bkgnd_color_opac": "Spremeni barvo / prosojnost",
          		"connector_no_arrow": "Brez puščice",
          		"fitToContent": "Prilagodi vsebini",
          		"fit_to_all": "Prilagodi vsemu",
          		"fit_to_canvas": "Prilagodi sliki",
          		"fit_to_layer_content": "Prilagodi sloju",
          		"fit_to_sel": "Prilagodi izboru",
          		"align_relative_to": "Poravnaj glede na ...",
          		"relativeTo": "glede na:",
          		"page": "page",
          		"largest_object": "največji objekt",
          		"selected_objects": "izbrani objekt",
          		"smallest_object": "najmanjši objekt",
          		"new_doc": "Nova slika",
          		"open_doc": "Odpri sliko",
          		"export_img": "Izvozi v PNG",
          		"save_doc": "Shrani sliko",
          		"import_doc": "Uvozi SVG",
          		"align_to_page": "Poravnaj na stran",
          		"align_bottom": "Poravnaj na dno",
          		"align_center": "Poravnaj na sredino",
          		"align_left": "Poravnaj levo",
          		"align_middle": "Poravnaj na sredino",
          		"align_right": "Poravnaj desno",
          		"align_top": "Poravnaj na vrh",
          		"mode_select": "Izberi",
          		"mode_fhpath": "Svinčnik",
          		"mode_line": "Crta",
          		"mode_connect": "Poveži dva objekta",
          		"mode_rect": "Pravokotnik",
          		"mode_square": "Kvadrat",
          		"mode_fhrect": "Prostoročni pravokotnik",
          		"mode_ellipse": "Elipsa",
          		"mode_circle": "Krog",
          		"mode_fhellipse": "Prostoročna elipsa",
          		"mode_path": "Pot",
          		"mode_shapelib": "Knjižnica oblik",
          		"mode_text": "Besedilo",
          		"mode_image": "Slika",
          		"mode_zoom": "Povečava",
          		"mode_eyedropper": "Ugotovi barvo",
          		"no_embed": "OPOMBA: Ta slika ne more biti vključena. It will depend on this path to be displayed",
          		"undo": "Razveljavi",
          		"redo": "Uveljavi",
          		"tool_source": "Uredi vir",
          		"wireframe_mode": "Wireframe način",
          		"toggle_grid": "Pokaži/skrij mrežo",
          		"clone": "Kloniraj element(e)",
          		"del": "Izbriši element(e)",
          		"group_elements": "Združi element(e)",
          		"make_link": "Vstavi (hiper)povezavo",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Pretvori v pot",
          		"reorient_path": "Reorient pot",
          		"ungroup": "Razdruži elemente",
          		"docprops": "Lastnosti dokumenta",
          		"imagelib": "Knjižnica slik",
          		"move_bottom": "Premakni na dno",
          		"move_top": "Premakni na vrh",
          		"node_clone": "Kloniraj oglišče",
          		"node_delete": "Izbriši oglišče",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Shrani",
          		"cut": "Izreži",
          		"copy": "Kopiraj",
          		"paste": "Prilepi",
          		"paste_in_place": "Prilepi na mesto",
          		"delete": "Izbriši",
          		"group": "Združi",
          		"move_front": "Postavi v ospredje",
          		"move_up": "Pomakni naporej",
          		"move_down": "Pomakni nazaj",
          		"move_back": "Postavi v ozadje"
          	},
          	layers: {
          		"layer":"Sloj",
          		"layers": "Sloji",
          		"del": "Izbriši sloj",
          		"move_down": "Premakni navzdol",
          		"new": "Nov sloj",
          		"rename": "Preimenuj sloj",
          		"move_up": "Premakni navzgor",
          		"dupe": "Podvoji sloj",
          		"merge_down": "Združi s spodnjimi",
          		"merge_all": "Združi vse",
          		"move_elems_to": "Premakni elemente v:",
          		"move_selected": "Premakne elemente v drug sloj"
          	},
          	config: {
          		"image_props": "Lastnosti slike",
          		"doc_title": "Naslov",
          		"doc_dims": "Dimenzije slike",
          		"included_images": "Vključene slike",
          		"image_opt_embed": "Vključene (local files)",
          		"image_opt_ref": "Povezane (Use file reference)",
          		"editor_prefs": "Lastnosti urejevalnika",
          		"icon_size": "Velikost ikon",
          		"language": "Jezik",
          		"background": "Ozadje urejevalnika",
          		"editor_img_url": "URL slike",
          		"editor_bg_note": "OPOMBA: Ozdaje ne bo shranjeno s sliko.",
          		"icon_large": "velike",
          		"icon_medium": "srednje",
          		"icon_small": "majhne",
          		"icon_xlarge": "zelo velike",
          		"select_predefined": "Izberi prednastavljeno:",
          		"units_and_rulers": "Enote & ravnilo",
          		"show_rulers": "Pokaži ravnilo",
          		"base_unit": "Osnovne enote",
          		"grid": "Mreža",
          		"snapping_onoff": "Pripni na mrežo DA/NE",
          		"snapping_stepsize": "Snapping Step-Size:"
          	},
          	shape_cats: {
          		"basic": "Osnovno",
          		"object": "Objekti",
          		"symbol": "Simboli",
          		"arrow": "Puščice",
          		"flowchart": "Tok",
          		"animal": "Živali",
          		"game": "Igralne karte in šah",
          		"dialog_balloon": "Pogovorni balončki",
          		"electronics": "Elektronika",
          		"math": "Matematika",
          		"music": "Glasba",
          		"misc": "Razno",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Izberi knjižnico slik",
          		"show_list": "Pokaži seznam",
          		"import_single": "Uvozi eno",
          		"import_multi": "Uvozi več",
          		"open": "Odpri kot nov dokument"
          	},
          	notification: {
          		"invalidAttrValGiven":"Napačna vrednost!",
          		"noContentToFitTo":"Ni vsebine za prilagajanje",
          		"dupeLayerName":"Sloj s tem imenom že obstajal!",
          		"enterUniqueLayerName":"Vnesite edinstveno ime sloja",
          		"enterNewLayerName":"Vnesite ime novega sloja",
          		"layerHasThatName":"Sloje že ima to ime",
          		"QmoveElemsToLayer":"Premaknem izbrane elemente v sloj '%s'?",
          		"QwantToClear":"Ali želite počistiti risbo?\nTo bo izbrisalo tudi zgodovino korakov (ni mogoče razveljaviti)!",
          		"QwantToOpen":"Ali želite odpreti novo datoteko?\nTo bo izbrisalo tudi zgodovino korakov (ni mogoče razveljaviti)!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignoriram spremembe, narejene v SVG kodi?",
          		"featNotSupported":"Ni podprto",
          		"enterNewImgURL":"Vnesite nov URL slike",
          		"defsFailOnSave": "OPOMBA: Zaradi napake vašega brskalnika obstaja možnost, da ta slika ni prikazan pravilno (manjkajo določeni elementi ali gradient). Vseeno bo prikaz pravilen, ko bo slika enkrat shranjena.",
          		"loadingImage":"Nalagam sliko, prosimo, počakajte ...",
          		"saveFromBrowser": "Izberite \"Shrani kot ...\" v brskalniku, če želite shraniti kot %s.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "Obstajajo neshranjene spremembe.",
          		"enterNewLinkURL": "Vnesite novo URL povezavo",
          		"errorLoadingSVG": "Napaka: Ne morem naložiti SVG podatkov",
          		"URLloadFail": "Ne morem naložiti z URL",
          		"retrieving": "Pridobivanje \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.sq.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "sq",
          	dir : "ltr",
          	common: {
          		"ok": "Ruaj",
          		"cancel": "Anulo",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klikoni për të ndryshuar mbushur me ngjyra, shift-klikoni për të ndryshuar ngjyrën pash",
          		"zoom_level": "Ndryshimi zoom nivel",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Ndryshimi mbush color",
          		"stroke_color": "Change color pash",
          		"stroke_style": "Ndryshimi dash goditje stil",
          		"stroke_width": "Ndryshimi goditje width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Kënd Ndryshimi rrotullim",
          		"blur": "Change gaussian blur value",
          		"opacity": "Ndryshimi zgjedhur errësirë item",
          		"circle_cx": "Cx rrethi Ndryshimi i bashkërenduar",
          		"circle_cy": "Ndryshimi i rrethit cy koordinuar",
          		"circle_r": "Rreze rreth Ndryshimi i",
          		"ellipse_cx": "Ndryshimi elips e cx koordinuar",
          		"ellipse_cy": "Elips cy Ndryshimi i bashkërenduar",
          		"ellipse_rx": "Rreze x elips Ndryshimi i",
          		"ellipse_ry": "Radiusi y elips ndërroj",
          		"line_x1": "Shkarko Ndryshimi që fillon x koordinuar",
          		"line_x2": "Linjë Ndryshimi i fund x koordinuar",
          		"line_y1": "Shkarko Ndryshimi që fillon y koordinuar",
          		"line_y2": "Shkarko Ndryshimi i dhënë fund y koordinuar",
          		"rect_height": "Height Ndryshimi drejtkëndësh",
          		"rect_width": "Width Ndryshimi drejtkëndësh",
          		"corner_radius": "Ndryshimi Rectangle Corner Radius",
          		"image_width": "Ndryshimi image width",
          		"image_height": "Height të ndryshuar imazhin",
          		"image_url": "Ndrysho URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Text contents Ndryshimi",
          		"font_family": "Ndryshimi Font Family",
          		"font_size": "Ndryshimi Font Size",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change color background / patejdukshmëri",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit për të gjithë përmbajtjen",
          		"fit_to_canvas": "Fit në kanavacë",
          		"fit_to_layer_content": "Shtresë Fit to content",
          		"fit_to_sel": "Fit to Selection",
          		"align_relative_to": "Vendose në lidhje me ...",
          		"relativeTo": "lidhje me:",
          		"faqe": "faqe",
          		"largest_object": "madh objekt",
          		"selected_objects": "objektet e zgjedhur",
          		"smallest_object": "objektit më të vogël",
          		"new_doc": "New Image",
          		"open_doc": "Image Hapur",
          		"export_img": "Export",
          		"save_doc": "Image Ruaj",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Align Center",
          		"align_left": "Align Left",
          		"align_middle": "Align Mesme",
          		"align_right": "Align Right",
          		"align_top": "Align Top",
          		"mode_select": "Zgjidhni Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Lëndë Hand Rectangle",
          		"mode_ellipse": "Elips",
          		"mode_circle": "Rrethi",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Burimi Edit",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Elementet e Grupit",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Elemente Ungroup",
          		"docprops": "Dokumenti Prona",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Ruaj",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move Down Layer",
          		"new": "Re Shtresa",
          		"rename": "Rename Layer",
          		"move_up": "Move Up Layer",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Zgjidhni paracaktuara:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.sr.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "sr",
          	dir : "ltr",
          	common: {
          		"ok": "Сачувати",
          		"cancel": "Откажи",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Кликните да бисте променили боју попуне, Схифт-кликните да промените боју удар",
          		"zoom_level": "Промените ниво зумирања",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Промена боје попуне",
          		"stroke_color": "Промена боје удар",
          		"stroke_style": "Промена ход Дасх стил",
          		"stroke_width": "Промена удара ширина",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Промени ротације Угао",
          		"blur": "Change gaussian blur value",
          		"opacity": "Промена изабране ставке непрозирност",
          		"circle_cx": "Промена круг&#39;с ЦКС координатни",
          		"circle_cy": "Промена круг&#39;с ср координатни",
          		"circle_r": "Промена круга је полупречник",
          		"ellipse_cx": "Промена елипса ЦКС&#39;с координатни",
          		"ellipse_cy": "Промена елипса&#39;с ср координатни",
          		"ellipse_rx": "Промена елипса&#39;с Кс радијуса",
          		"ellipse_ry": "Промена елипса је радијус Ы",
          		"line_x1": "Промена линија Стартни кс координата",
          		"line_x2": "Промена линија је завршетак кс координата",
          		"line_y1": "Промена линија у координатни почетак Ы",
          		"line_y2": "Промена линија је Ы координата се завршава",
          		"rect_height": "Промени правоугаоник висина",
          		"rect_width": "Промени правоугаоник ширине",
          		"corner_radius": "Промена правоугаоник Кутак радијуса",
          		"image_width": "Промени слику ширине",
          		"image_height": "Промени слику висине",
          		"image_url": "Промените УРЛ адресу",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Промена садржаја текстуалне",
          		"font_family": "Цханге фонт породицу",
          		"font_size": "Цханге фонт сизе",
          		"bold": "Подебљан текст",
          		"italic": "Италиц текст"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Промена боје позадине / непрозирност",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Стане на садржај",
          		"fit_to_all": "Уклопи у сав садржај",
          		"fit_to_canvas": "Стане на платну",
          		"fit_to_layer_content": "Уклопи у слоју садржај",
          		"fit_to_sel": "Уклопи у избор",
          		"align_relative_to": "Алигн у односу на ...",
          		"relativeTo": "у односу на:",
          		"страна": "страна",
          		"largest_object": "Највећи објекат",
          		"selected_objects": "изабраних објеката",
          		"smallest_object": "Најмањи објекат",
          		"new_doc": "Нова слика",
          		"open_doc": "Отвори слике",
          		"export_img": "Export",
          		"save_doc": "Сачувај слика",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Поравнај доле",
          		"align_center": "Поравнај по центру",
          		"align_left": "Поравнај лево",
          		"align_middle": "Алигн Средњи",
          		"align_right": "Поравнај десно",
          		"align_top": "Поравнајте врх",
          		"mode_select": "Изаберите алатку",
          		"mode_fhpath": "Алатка оловка",
          		"mode_line": "Линија Алат",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Фрее-Ручни правоугаоник",
          		"mode_ellipse": "Елипса",
          		"mode_circle": "Круг",
          		"mode_fhellipse": "Фрее-Ручни Елипса",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Текст Алат",
          		"mode_image": "Алатка за слике",
          		"mode_zoom": "Алатка за зумирање",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Поништи",
          		"redo": "Редо",
          		"tool_source": "Уреди Извор",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Група Елементи",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Разгрупирање Елементи",
          		"docprops": "Особине документа",
          		"imagelib": "Image Library",
          		"move_bottom": "Премести на доле",
          		"move_top": "Премести на врх",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Сачувати",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Избриши слој",
          		"move_down": "Помери слој доле",
          		"new": "Нови слој",
          		"rename": "Преименуј слој",
          		"move_up": "Помери слој Горе",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Изаберите унапред дефинисани:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.sv.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "sv",
          	dir : "ltr",
          	common: {
          		"ok": "Spara",
          		"cancel": "Avbryt",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Klicka för att ändra fyllningsfärg, shift-klicka för att ändra färgar",
          		"zoom_level": "Ändra zoomnivå",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Ändra fyllningsfärg",
          		"stroke_color": "Ändra färgar",
          		"stroke_style": "Ändra stroke Dash stil",
          		"stroke_width": "Ändra stroke bredd",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Ändra rotationsvinkel",
          		"blur": "Change gaussian blur value",
          		"opacity": "Ändra markerat objekt opacitet",
          		"circle_cx": "Ändra cirkeln cx samordna",
          		"circle_cy": "Ändra cirkeln samordna cy",
          		"circle_r": "Ändra cirkelns radie",
          		"ellipse_cx": "Ändra ellips&#39;s cx samordna",
          		"ellipse_cy": "Ändra ellips&#39;s samordna cy",
          		"ellipse_rx": "Ändra ellips&#39;s x radie",
          		"ellipse_ry": "Ändra ellips&#39;s y radie",
          		"line_x1": "Ändra Lines startar x samordna",
          		"line_x2": "Ändra Lines slutar x samordna",
          		"line_y1": "Ändra Lines startar Y-koordinat",
          		"line_y2": "Ändra Lines slutar Y-koordinat",
          		"rect_height": "Ändra rektangel höjd",
          		"rect_width": "Ändra rektangel bredd",
          		"corner_radius": "Ändra rektangel hörnradie",
          		"image_width": "Ändra bild bredd",
          		"image_height": "Ändra bildhöjd",
          		"image_url": "Ändra URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Ändra textinnehållet",
          		"font_family": "Ändra Typsnitt",
          		"font_size": "Ändra textstorlek",
          		"bold": "Fet text",
          		"italic": "Kursiv text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Ändra bakgrundsfärg / opacitet",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Passar till allt innehåll",
          		"fit_to_canvas": "Anpassa till duk",
          		"fit_to_layer_content": "Anpassa till lager innehåll",
          		"fit_to_sel": "Anpassa till val",
          		"align_relative_to": "Justera förhållande till ...",
          		"relativeTo": "jämfört:",
          		"sida": "sida",
          		"largest_object": "största objekt",
          		"selected_objects": "valda objekt",
          		"smallest_object": "minsta objektet",
          		"new_doc": "New Image",
          		"open_doc": "Öppna bild",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Centrera",
          		"align_left": "Vänsterjustera",
          		"align_middle": "Justera Middle",
          		"align_right": "Högerjustera",
          		"align_top": "Justera Top",
          		"mode_select": "Markeringsverktyget",
          		"mode_fhpath": "Pennverktyget",
          		"mode_line": "Linjeverktyg",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Fri hand rektangel",
          		"mode_ellipse": "Ellips",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Fri hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Textverktyg",
          		"mode_image": "Bildverktyg",
          		"mode_zoom": "Zoomverktyget",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Ångra",
          		"redo": "Redo",
          		"tool_source": "Redigera källa",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Dela Elements",
          		"docprops": "Dokumentegenskaper",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Flytta till början",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Spara",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Radera Layer",
          		"move_down": "Flytta Layer Down",
          		"new": "New Layer",
          		"rename": "Byt namn på Layer",
          		"move_up": "Flytta Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Välj fördefinierad:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.sw.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "sw",
          	dir : "ltr",
          	common: {
          		"ok": "Okoa",
          		"cancel": "Cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click kubadili kujaza color, skiftarbete-click kubadili kiharusi color",
          		"zoom_level": "Change zoom ngazi",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change kujaza Michezo",
          		"stroke_color": "Change kiharusi Michezo",
          		"stroke_style": "Change kiharusi dash style",
          		"stroke_width": "Change kiharusi width",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Change mzunguko vinkel",
          		"blur": "Change gaussian blur value",
          		"opacity": "Change selected opacity punkt",
          		"circle_cx": "Change mduara&#39;s CX kuratibu",
          		"circle_cy": "Change mduara&#39;s cy kuratibu",
          		"circle_r": "Change mduara&#39;s Radius",
          		"ellipse_cx": "Change ellipse s CX kuratibu",
          		"ellipse_cy": "Change ellipse s cy kuratibu",
          		"ellipse_rx": "Change ellipse s x Radius",
          		"ellipse_ry": "Change ellipse&#39;s y Radius",
          		"line_x1": "Change Mpya&#39;s mapya x kuratibu",
          		"line_x2": "Change Mpya&#39;s kuishia x kuratibu",
          		"line_y1": "Change Mpya&#39;s mapya y kuratibu",
          		"line_y2": "Change Mpya&#39;s kuishia y kuratibu",
          		"rect_height": "Change Mstatili height",
          		"rect_width": "Change Mstatili width",
          		"corner_radius": "Change Mstatili Corner Radius",
          		"image_width": "Change image width",
          		"image_height": "Change image urefu",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Change Nakala contents",
          		"font_family": "Change font Family",
          		"font_size": "Change font Size",
          		"bold": "Bold Nakala",
          		"italic": "Italiki Nakala"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color / opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Waliopo Content",
          		"fit_to_all": "Waliopo all content",
          		"fit_to_canvas": "Wanaofaa Canvas",
          		"fit_to_layer_content": "Waliopo safu content",
          		"fit_to_sel": "Waliopo uteuzi",
          		"align_relative_to": "Align jamaa na ...",
          		"relativeTo": "relativa att:",
          		"umebadilisha": "umebadilisha",
          		"largest_object": "ukubwa object",
          		"selected_objects": "waliochaguliwa vitu",
          		"smallest_object": "minsta object",
          		"new_doc": "New Image",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Align Center",
          		"align_left": "Align Left",
          		"align_middle": "Kati align",
          		"align_right": "Align Right",
          		"align_top": "Align Juu",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Penseli Tool",
          		"mode_line": "Mpya Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Nakala Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Tengua",
          		"redo": "Redo",
          		"tool_source": "Edit Lugha",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Kikundi Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Kuhama Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Save",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move Layer Down",
          		"new": "Mpya Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefined:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.test.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "test",
          	dir : "ltr",
          	common: {
          		"ok": "OK",
          		"cancel": "Cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Click to change fill color, shift-click to change stroke color",
          		"zoom_level": "Change zoom level",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Change fill color",
          		"stroke_color": "Change stroke color",
          		"stroke_style": "Change stroke dash style",
          		"stroke_width": "Change stroke width by 1, shift-click to change by 0.1",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Change rotation angle",
          		"blur": "Change gaussian blur value",
          		"opacity": "Change selected item opacity",
          		"circle_cx": "Change circle's cx coordinate",
          		"circle_cy": "Change circle's cy coordinate",
          		"circle_r": "Change circle's radius",
          		"ellipse_cx": "Change ellipse's cx coordinate",
          		"ellipse_cy": "Change ellipse's cy coordinate",
          		"ellipse_rx": "Change ellipse's x radius",
          		"ellipse_ry": "Change ellipse's y radius",
          		"line_x1": "Change line's starting x coordinate",
          		"line_x2": "Change line's ending x coordinate",
          		"line_y1": "Change line's starting y coordinate",
          		"line_y2": "Change line's ending y coordinate",
          		"rect_height": "Change rectangle height",
          		"rect_width": "Change rectangle width",
          		"corner_radius": "Change Rectangle Corner Radius",
          		"image_width": "Change image width",
          		"image_height": "Change image height",
          		"image_url": "Change URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Change text contents",
          		"font_family": "Change Font Family",
          		"font_size": "Change Font Size",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Change background color/opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit to all content",
          		"fit_to_canvas": "Fit to canvas",
          		"fit_to_layer_content": "Fit to layer content",
          		"fit_to_sel": "Fit to selection",
          		"align_relative_to": "Align relative to ...",
          		"relativeTo": "relative to:",
          		"page": "page",
          		"largest_object": "largest object",
          		"selected_objects": "selected objects",
          		"smallest_object": "smallest object",
          		"new_doc": "New Image",
          		"open_doc": "Open SVG",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Align Center",
          		"align_left": "Align Left",
          		"align_middle": "Align Middle",
          		"align_right": "Align Right",
          		"align_top": "Align Top",
          		"mode_select": "Select Tool",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-Hand Rectangle",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Free-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Undo",
          		"redo": "Redo",
          		"tool_source": "Edit Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Move to Bottom",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Apply Changes",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Move Layer Up",
          		"move_down": "Move Layer Down",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Rename Layer",
          		"move_up": "Move Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Select predefined:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer \"%s\"?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.th.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "th",
          	dir : "ltr",
          	common: {
          		"ok": "บันทึก",
          		"cancel": "ยกเลิก",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "คลิกเพื่อเปลี่ยนใส่สีกะคลิกเปลี่ยนสีจังหวะ",
          		"zoom_level": "เปลี่ยนระดับการซูม",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "เปลี่ยนใส่สี",
          		"stroke_color": "สีจังหวะเปลี่ยน",
          		"stroke_style": "รีบเปลี่ยนสไตล์จังหวะ",
          		"stroke_width": "ความกว้างจังหวะเปลี่ยน",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "มุมหมุนเปลี่ยน",
          		"blur": "Change gaussian blur value",
          		"opacity": "เปลี่ยนความทึบเลือกรายการ",
          		"circle_cx": "Cx วงกลมเปลี่ยนของพิกัด",
          		"circle_cy": "วงกลมเปลี่ยนเป็น cy ประสานงาน",
          		"circle_r": "รัศมีวงกลมเปลี่ยนเป็น",
          		"ellipse_cx": "เปลี่ยน ellipse ของ cx ประสานงาน",
          		"ellipse_cy": "Ellipse เปลี่ยนของ cy ประสานงาน",
          		"ellipse_rx": "Ellipse เปลี่ยนของรัศมี x",
          		"ellipse_ry": "Ellipse เปลี่ยนของรัศมี y",
          		"line_x1": "สายเปลี่ยนเป็นเริ่มต้น x พิกัด",
          		"line_x2": "สายเปลี่ยนเป็นสิ้นสุด x พิกัด",
          		"line_y1": "สายเปลี่ยนเป็นเริ่มต้น y พิกัด",
          		"line_y2": "สายเปลี่ยนเป็นสิ้นสุด y พิกัด",
          		"rect_height": "ความสูงสี่เหลี่ยมผืนผ้าเปลี่ยน",
          		"rect_width": "ความกว้างสี่เหลี่ยมผืนผ้าเปลี่ยน",
          		"corner_radius": "รัศมีเปลี่ยนสี่เหลี่ยมผืนผ้า Corner",
          		"image_width": "ความกว้างเปลี่ยนรูปภาพ",
          		"image_height": "ความสูงเปลี่ยนรูปภาพ",
          		"image_url": "URL เปลี่ยน",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "เปลี่ยนเนื้อหาข้อความ",
          		"font_family": "ครอบครัว Change Font",
          		"font_size": "เปลี่ยนขนาดตัวอักษร",
          		"bold": "ข้อความตัวหนา",
          		"italic": "ข้อความตัวเอียง"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "สีพื้นหลังเปลี่ยน / ความทึบ",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "พอดีกับเนื้อหาทั้งหมด",
          		"fit_to_canvas": "เหมาะสมในการผ้าใบ",
          		"fit_to_layer_content": "พอดีเนื้อหาชั้นที่",
          		"fit_to_sel": "เหมาะสมในการเลือก",
          		"align_relative_to": "จัดชิดเทียบกับ ...",
          		"relativeTo": "เทียบกับ:",
          		"หน้า": "หน้า",
          		"largest_object": "ที่ใหญ่ที่สุดในวัตถุ",
          		"selected_objects": "วัตถุเลือกตั้ง",
          		"smallest_object": "วัตถุที่เล็กที่สุด",
          		"new_doc": "รูปภาพใหม่",
          		"open_doc": "ภาพเปิด",
          		"export_img": "Export",
          		"save_doc": "บันทึกรูปภาพ",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "ด้านล่างชิด",
          		"align_center": "จัดแนวกึ่งกลาง",
          		"align_left": "จัดชิดซ้าย",
          		"align_middle": "กลางชิด",
          		"align_right": "จัดชิดขวา",
          		"align_top": "ด้านบนชิด",
          		"mode_select": "เครื่องมือเลือก",
          		"mode_fhpath": "เครื่องมือดินสอ",
          		"mode_line": "เครื่องมือ Line",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "สี่เหลี่ยมผืนผ้า Free-Hand",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Ellipse Free-Hand",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "เครื่องมือ Text",
          		"mode_image": "เครื่องมือ Image",
          		"mode_zoom": "เครื่องมือซูม",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "เลิก",
          		"redo": "ทำซ้ำ",
          		"tool_source": "แหล่งที่มาแก้ไข",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "องค์ประกอบของกลุ่ม",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "องค์ประกอบ Ungroup",
          		"docprops": "คุณสมบัติของเอกสาร",
          		"imagelib": "Image Library",
          		"move_bottom": "ย้ายไปด้านล่าง",
          		"move_top": "ย้ายไปด้านบน",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "บันทึก",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "ย้าย Layer ลง",
          		"new": "Layer ใหม่",
          		"rename": "Layer เปลี่ยนชื่อ",
          		"move_up": "ย้าย Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "เลือกที่กำหนดไว้ล่วงหน้า:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.tl.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "tl",
          	dir : "ltr",
          	common: {
          		"ok": "I-save",
          		"cancel": "I-cancel",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "I-click upang baguhin ang punan ang kulay, paglilipat-click upang baguhin ang paghampas ng kulay",
          		"zoom_level": "Baguhin ang antas ng zoom",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Baguhin ang punuin ng kulay",
          		"stroke_color": "Baguhin ang kulay ng paghampas",
          		"stroke_style": "Baguhin ang stroke pagsugod estilo",
          		"stroke_width": "Baguhin ang stroke lapad",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Baguhin ang pag-ikot anggulo",
          		"blur": "Change gaussian blur value",
          		"opacity": "Palitan ang mga napiling bagay kalabuan",
          		"circle_cx": "Cx Baguhin ang bilog&#39;s coordinate",
          		"circle_cy": "Baguhin ang bilog&#39;s cy coordinate",
          		"circle_r": "Baguhin ang radius ng bilog",
          		"ellipse_cx": "Baguhin ang tambilugan&#39;s cx-ugma",
          		"ellipse_cy": "Baguhin ang tambilugan&#39;s cy coordinate",
          		"ellipse_rx": "X radius Baguhin ang tambilugan&#39;s",
          		"ellipse_ry": "Y radius Baguhin ang tambilugan&#39;s",
          		"line_x1": "Baguhin ang linya ng simula x coordinate",
          		"line_x2": "Baguhin ang linya ay nagtatapos x coordinate",
          		"line_y1": "Baguhin ang linya ng simula y coordinate",
          		"line_y2": "Baguhin ang linya ay nagtatapos y coordinate",
          		"rect_height": "Baguhin ang rektanggulo taas",
          		"rect_width": "Baguhin ang rektanggulo lapad",
          		"corner_radius": "Baguhin ang Parihaba Corner Radius",
          		"image_width": "Baguhin ang lapad ng imahe",
          		"image_height": "Baguhin ang taas ng imahe",
          		"image_url": "Baguhin ang URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Baguhin ang mga nilalaman ng teksto",
          		"font_family": "Baguhin ang Pamilya ng Font",
          		"font_size": "Baguhin ang Laki ng Font",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Baguhin ang kulay ng background / kalabuan",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Pagkasyahin sa Nilalaman",
          		"fit_to_all": "Pagkasyahin sa lahat ng mga nilalaman",
          		"fit_to_canvas": "Pagkasyahin sa tolda",
          		"fit_to_layer_content": "Pagkasyahin sa layer nilalaman",
          		"fit_to_sel": "Pagkasyahin sa pagpili",
          		"align_relative_to": "Pantayin sa kamag-anak sa ...",
          		"relativeTo": "kamag-anak sa:",
          		"pahina": "pahina",
          		"largest_object": "pinakamalaking bagay",
          		"selected_objects": "inihalal na mga bagay",
          		"smallest_object": "pinakamaliit na bagay",
          		"new_doc": "Bagong Imahe",
          		"open_doc": "Buksan ang Image",
          		"export_img": "Export",
          		"save_doc": "I-save ang Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Pantayin sa Ibaba",
          		"align_center": "Pantayin sa Gitna",
          		"align_left": "Pantayin ang Kaliwa",
          		"align_middle": "Pantayin sa Gitnang",
          		"align_right": "Pantayin sa Kanan",
          		"align_top": "Pantayin Top",
          		"mode_select": "Piliin ang Tool",
          		"mode_fhpath": "Kasangkapan ng lapis",
          		"mode_line": "Line Kasangkapan",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Libreng-kamay Parihaba",
          		"mode_ellipse": "Tambilugan",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Libreng-kamay tambilugan",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Kasangkapan",
          		"mode_image": "Image Kasangkapan",
          		"mode_zoom": "Mag-zoom Kasangkapan",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Bawiin",
          		"redo": "Gawin muli",
          		"tool_source": "I-edit ang Source",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Group Sangkap",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Sangkap",
          		"docprops": "Document Katangian",
          		"imagelib": "Image Library",
          		"move_bottom": "Ilipat sa Ibaba",
          		"move_top": "Ilipat sa Tuktok",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "I-save",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Tanggalin Layer",
          		"move_down": "Ilipat Layer Down",
          		"new": "Bagong Layer",
          		"rename": "Palitan ang pangalan ng Layer",
          		"move_up": "Ilipat Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Piliin ang paunang-natukoy na:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.tr.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "tr",
          	dir : "ltr",
          	common: {
          		"ok": "Kaydetmek",
          		"cancel": "Iptal",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Tıklatın renk, vardiya dolgu zamanlı rengini değiştirmek için tıklayın değiştirmek için",
          		"zoom_level": "Yakınlaştırma düzeyini değiştirebilirsiniz",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Renk değiştirmek doldurmak",
          		"stroke_color": "Değiştirmek inme renk",
          		"stroke_style": "Değiştirmek inme çizgi stili",
          		"stroke_width": "Değiştirmek vuruş genişliği",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Değiştirmek dönme açısı",
          		"blur": "Change gaussian blur value",
          		"opacity": "Değiştirmek öğe opacity seçilmiş",
          		"circle_cx": "Değiştirmek daire&#39;s cx koordine",
          		"circle_cy": "Değiştirmek daire cy koordine&#39;s",
          		"circle_r": "Değiştirmek daire yarıçapı",
          		"ellipse_cx": "&#39;s Koordine cx elips Girişi",
          		"ellipse_cy": "Değiştirmek elips cy koordine&#39;s",
          		"ellipse_rx": "Değiştirmek elips&#39;s x yarıçapı",
          		"ellipse_ry": "Değiştirmek elips Y yarıçapı",
          		"line_x1": "Değiştirmek hattı&#39;s koordine x başlangıç",
          		"line_x2": "Değiştirmek hattı&#39;s koordine x biten",
          		"line_y1": "Değiştirmek hattı y başlangıç&#39;s koordine",
          		"line_y2": "Değiştirmek hattı y biten&#39;s koordine",
          		"rect_height": "Değiştirmek dikdörtgen yüksekliği",
          		"rect_width": "Değiştirmek dikdörtgen genişliği",
          		"corner_radius": "Değiştirmek Dikdörtgen Köşe Yarıçap",
          		"image_width": "Değiştirmek görüntü genişliği",
          		"image_height": "Değiştirmek görüntü yüksekliği",
          		"image_url": "Değiştirmek URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Değiştirmek metin içeriği",
          		"font_family": "Font değiştir Aile",
          		"font_size": "Change font size",
          		"bold": "Kalın Yazı",
          		"italic": "Italik yazı"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Arka plan rengini değiştirmek / opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Fit to Content",
          		"fit_to_all": "Fit tüm içerik için",
          		"fit_to_canvas": "Fit tuvaline",
          		"fit_to_layer_content": "Sığacak şekilde katman içerik",
          		"fit_to_sel": "Fit seçimine",
          		"align_relative_to": "Align göre ...",
          		"relativeTo": "göreli:",
          		"sayfa": "sayfa",
          		"largest_object": "en büyük nesne",
          		"selected_objects": "seçilen nesneleri",
          		"smallest_object": "küçük nesne",
          		"new_doc": "Yeni Resim",
          		"open_doc": "Aç Resim",
          		"export_img": "Export",
          		"save_doc": "Görüntüyü Kaydet",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Ortala",
          		"align_left": "Sola",
          		"align_middle": "Align Orta",
          		"align_right": "Sağa Hizala",
          		"align_top": "Align Top",
          		"mode_select": "Seçim aracı",
          		"mode_fhpath": "Kalem Aracı",
          		"mode_line": "Line Aracı",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-El Dikdörtgen",
          		"mode_ellipse": "Elips",
          		"mode_circle": "Daire",
          		"mode_fhellipse": "Free-El Elips",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Metin Aracı",
          		"mode_image": "Resim Aracı",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Geri",
          		"redo": "Redo",
          		"tool_source": "Değiştir Kaynak",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Grup Elemanları",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Çöz Elemanları",
          		"docprops": "Belge Özellikleri",
          		"imagelib": "Image Library",
          		"move_bottom": "Altına gider",
          		"move_top": "Üste taşı",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Kaydetmek",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Delete Layer",
          		"move_down": "Katman Aşağı Taşı",
          		"new": "Yeni Katman",
          		"rename": "Rename Katman",
          		"move_up": "Up Katman Taşı",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Seçin önceden tanımlanmış:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.uk.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "uk",
          	dir : "ltr",
          	common: {
          		"ok": "Зберегти",
          		"cancel": "Скасування",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Натисніть для зміни кольору заливки, Shift-Click змінити обвід",
          		"zoom_level": "Зміна масштабу",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Зміна кольору заливки",
          		"stroke_color": "Зміна кольору інсульт",
          		"stroke_style": "Зміна стилю інсульт тире",
          		"stroke_width": "Зміни ширина штриха",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Зміна кута повороту",
          		"blur": "Change gaussian blur value",
          		"opacity": "Зміна вибраного пункту непрозорості",
          		"circle_cx": "CX зміну кола координата",
          		"circle_cy": "Зміни гуртка CY координати",
          		"circle_r": "Зміна кола&#39;s радіус",
          		"ellipse_cx": "Зміни еліпса CX координати",
          		"ellipse_cy": "Зміни еліпса CY координати",
          		"ellipse_rx": "Х Зміни еліпса радіусом",
          		"ellipse_ry": "Зміни у еліпса радіусом",
          		"line_x1": "Зміни починає координати лінія х",
          		"line_x2": "Зміни за період, що закінчився лінія координати х",
          		"line_y1": "Зміни лінія починає Y координата",
          		"line_y2": "Зміна за період, що закінчився лінія Y координата",
          		"rect_height": "Зміни прямокутник висотою",
          		"rect_width": "Зміна ширини прямокутника",
          		"corner_radius": "Зміни прямокутник Corner Radius",
          		"image_width": "Зміни ширина зображення",
          		"image_height": "Зміна висоти зображення",
          		"image_url": "Змінити URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Зміна змісту тексту",
          		"font_family": "Зміни Сімейство шрифтів",
          		"font_size": "Змінити розмір шрифту",
          		"bold": "Товстий текст",
          		"italic": "Похилий текст"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Зміна кольору тла / непрозорість",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "За розміром змісту",
          		"fit_to_all": "За розміром весь вміст",
          		"fit_to_canvas": "Розмір полотна",
          		"fit_to_layer_content": "За розміром шар змісту",
          		"fit_to_sel": "Вибір розміру",
          		"align_relative_to": "Вирівняти по відношенню до ...",
          		"relativeTo": "в порівнянні з:",
          		"сторінка": "сторінка",
          		"largest_object": "найбільший об&#39;єкт",
          		"selected_objects": "обраними об&#39;єктами",
          		"smallest_object": "маленький об&#39;єкт",
          		"new_doc": "Нове зображення",
          		"open_doc": "Відкрити зображення",
          		"export_img": "Export",
          		"save_doc": "Зберегти малюнок",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Вирівняти по нижньому краю",
          		"align_center": "Вирівняти по центру",
          		"align_left": "По лівому краю",
          		"align_middle": "Вирівняти Близького",
          		"align_right": "По правому краю",
          		"align_top": "Вирівняти по верхньому краю",
          		"mode_select": "Виберіть інструмент",
          		"mode_fhpath": "Pencil Tool",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Вільної руки Прямокутник",
          		"mode_ellipse": "Еліпс",
          		"mode_circle": "Коло",
          		"mode_fhellipse": "Вільної руки Еліпс",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Текст Tool",
          		"mode_image": "Image Tool",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Скасувати",
          		"redo": "Повтор",
          		"tool_source": "Змінити вихідний",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Група елементів",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Елементи розгрупувати",
          		"docprops": "Властивості документа",
          		"imagelib": "Image Library",
          		"move_bottom": "Перемістити вниз",
          		"move_top": "Перемістити догори",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Зберегти",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Видалити шар",
          		"move_down": "Перемістити шар на",
          		"new": "Новий шар",
          		"rename": "Перейменувати Шар",
          		"move_up": "Переміщення шару до",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Виберіть зумовлений:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.vi.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "vi",
          	dir : "ltr",
          	common: {
          		"ok": "Lưu",
          		"cancel": "Hủy",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "Nhấn vào đây để thay đổi đầy màu sắc, thay đổi nhấp chuột để thay đổi màu sắc đột quỵ",
          		"zoom_level": "Thay đổi mức độ phóng",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "Thay đổi đầy màu sắc",
          		"stroke_color": "Thay đổi màu sắc đột quỵ",
          		"stroke_style": "Thay đổi phong cách đột quỵ dash",
          		"stroke_width": "Thay đổi chiều rộng đột quỵ",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "Thay đổi góc xoay",
          		"blur": "Change gaussian blur value",
          		"opacity": "Thay đổi lựa chọn opacity mục",
          		"circle_cx": "Thay đổi hình tròn của cx phối hợp",
          		"circle_cy": "Thay đổi hình tròn của vi phối hợp",
          		"circle_r": "Thay đổi bán kính của hình tròn",
          		"ellipse_cx": "Thay đổi hình elip của cx phối hợp",
          		"ellipse_cy": "Thay đổi hình elip của vi phối hợp",
          		"ellipse_rx": "Thay đổi hình elip của x bán kính",
          		"ellipse_ry": "Y Thay đổi bán kính của hình ellipse",
          		"line_x1": "Thay đổi dòng của bắt đầu từ x phối hợp",
          		"line_x2": "Thay đổi dòng của x kết thúc sớm nhất phối hợp",
          		"line_y1": "Thay đổi dòng của bắt đầu từ y phối hợp",
          		"line_y2": "Thay đổi dòng của kết thúc y phối hợp",
          		"rect_height": "Thay đổi hình chữ nhật chiều cao",
          		"rect_width": "Thay đổi hình chữ nhật chiều rộng",
          		"corner_radius": "Thay đổi chữ nhật Corner Radius",
          		"image_width": "Thay đổi hình ảnh rộng",
          		"image_height": "Thay đổi hình ảnh chiều cao",
          		"image_url": "Thay đổi URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "Thay đổi nội dung văn bản",
          		"font_family": "Thay đổi Font Gia đình",
          		"font_size": "Thay đổi cỡ chữ",
          		"bold": "Bold Text",
          		"italic": "Italic Text"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "Thay đổi màu nền / opacity",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "Phù hợp với nội dung",
          		"fit_to_all": "Phù hợp với tất cả nội dung",
          		"fit_to_canvas": "Phù hợp với vải",
          		"fit_to_layer_content": "Vào lớp phù hợp với nội dung",
          		"fit_to_sel": "Phù hợp để lựa chọn",
          		"align_relative_to": "Căn liên quan đến ...",
          		"relativeTo": "liên quan đến:",
          		"Sửa": "Sửa",
          		"largest_object": "lớn nhất đối tượng",
          		"selected_objects": "bầu các đối tượng",
          		"smallest_object": "nhỏ đối tượng",
          		"new_doc": "Hình mới",
          		"open_doc": "Mở Image",
          		"export_img": "Export",
          		"save_doc": "Save Image",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "Align Bottom",
          		"align_center": "Căn giữa",
          		"align_left": "Căn còn lại",
          		"align_middle": "Căn Trung",
          		"align_right": "Căn phải",
          		"align_top": "Căn Top",
          		"mode_select": "Chọn Công cụ",
          		"mode_fhpath": "Bút chì Công cụ",
          		"mode_line": "Line Tool",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Việt-Hand Hình chữ nhật",
          		"mode_ellipse": "Ellipse",
          		"mode_circle": "Circle",
          		"mode_fhellipse": "Việt-Hand Ellipse",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "Text Tool",
          		"mode_image": "Hình Công cụ",
          		"mode_zoom": "Zoom Tool",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "Hoàn tác",
          		"redo": "Làm lại",
          		"tool_source": "Sửa Nguồn",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "Nhóm Elements",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "Document Properties",
          		"imagelib": "Image Library",
          		"move_bottom": "Chuyển đến đáy",
          		"move_top": "Move to Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "Lưu",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "Xoá Layer",
          		"move_down": "Move Layer Down",
          		"new": "New Layer",
          		"rename": "Đổi tên Layer",
          		"move_up": "Di chuyển Layer Up",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "Chọn định sẵn:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.yi.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "yi",
          	dir : "ltr",
          	common: {
          		"ok": "היט",
          		"cancel": "באָטל מאַכן",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "גיט צו ענדערן אָנעסן קאָליר, יבעררוק-גיט צו טוישן מאַך קאָליר",
          		"zoom_level": "ענדערן פארגרעסער הייך",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "ענדערן אָנעסן קאָליר",
          		"stroke_color": "טוישן מאַך קאָליר",
          		"stroke_style": "טוישן מאַך לאָך מאָדע",
          		"stroke_width": "טוישן מאַך ברייט",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "ענדערן ראָוטיישאַן ווינקל",
          		"blur": "Change gaussian blur value",
          		"opacity": "ענדערן סעלעקטעד נומער אָופּאַסאַטי",
          		"circle_cx": "ענדערן קרייז ס קקס קאָואָרדאַנאַט",
          		"circle_cy": "ענדערן קרייז ס סי קאָואָרדאַנאַט",
          		"circle_r": "ענדערן קרייז ס ראַדיוס",
          		"ellipse_cx": "ענדערן יליפּס ס קקס קאָואָרדאַנאַט",
          		"ellipse_cy": "ענדערן יליפּס ס סי קאָואָרדאַנאַט",
          		"ellipse_rx": "ענדערן יליפּס ס &#39;קס ראַדיוס",
          		"ellipse_ry": "ענדערן יליפּס ס &#39;י ראַדיוס",
          		"line_x1": "טוישן ליניע ס &#39;סטאַרטינג קס קאָואָרדאַנאַט",
          		"line_x2": "טוישן ליניע ס &#39;סאָף קס קאָואָרדאַנאַט",
          		"line_y1": "טוישן ליניע ס &#39;סטאַרטינג י קאָואָרדאַנאַט",
          		"line_y2": "טוישן ליניע ס &#39;סאָף י קאָואָרדאַנאַט",
          		"rect_height": "ענדערן גראָדעק הייך",
          		"rect_width": "ענדערן גראָדעק ברייט",
          		"corner_radius": "ענדערן רעקטאַנגלע קאָרנער ראַדיוס",
          		"image_width": "טוישן בילד ברייט",
          		"image_height": "טוישן בילד הייך",
          		"image_url": "ענדערן URL",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "ענדערן טעקסט אינהאַלט",
          		"font_family": "ענדערן פאָנט פאַמילי",
          		"font_size": "בייטן פאָנט גרייס",
          		"bold": "דרייסט טעקסט",
          		"italic": "יטאַליק טעקסט"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "ענדערן הינטערגרונט פאַרב / אָופּאַסאַטי",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "פּאַסיק צו אינהאַלט",
          		"fit_to_all": "פּאַסיק צו אַלע אינהאַלט",
          		"fit_to_canvas": "פּאַסיק צו לייוונט",
          		"fit_to_layer_content": "פּאַסיק צו שיכטע אינהאַלט",
          		"fit_to_sel": "פּאַסיק צו אָפּקלייב",
          		"align_relative_to": "יינרייען קאָרעוו צו ...",
          		"relativeTo": "קאָרעוו צו:",
          		"בלאַט": "בלאַט",
          		"largest_object": "לאַרדזשאַסט קעגן",
          		"selected_objects": "עלעקטעד אַבדזשעקץ",
          		"smallest_object": "סמאָלאַסט קעגן",
          		"new_doc": "ניו בילד",
          		"open_doc": "Open בילד",
          		"export_img": "Export",
          		"save_doc": "היט בילד",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "יינרייען באָטטאָם",
          		"align_center": "יינרייען צענטער",
          		"align_left": "יינרייען לעפט",
          		"align_middle": "יינרייען מיטל",
          		"align_right": "יינרייען רעכט",
          		"align_top": "יינרייען Top",
          		"mode_select": "סעלעקטירן טול",
          		"mode_fhpath": "בלייער טול",
          		"mode_line": "שורה טול",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "Free-הענט רעקטאַנגלע",
          		"mode_ellipse": "עלליפּסע",
          		"mode_circle": "קאַראַהאָד",
          		"mode_fhellipse": "Free-הענט עלליפּסע",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "טעקסט טול",
          		"mode_image": "בילד טול",
          		"mode_zoom": "פארגרעסער טול",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "ופמאַכן",
          		"redo": "רעדאָ",
          		"tool_source": "רעדאַקטירן סאָרס",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "גרופּע עלעמענץ",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "ונגראָופּ עלעמענץ",
          		"docprops": "דאָקומענט פּראָפּערטיעס",
          		"imagelib": "Image Library",
          		"move_bottom": "מאַך צו באָטטאָם",
          		"move_top": "באַוועגן צו Top",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "היט",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "ויסמעקן לייַער",
          		"move_down": "קער לייַער דאָוון",
          		"new": "ניו לייַער",
          		"rename": "רענאַמע לייַער",
          		"move_up": "באַוועגן לייַער אַרויף",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "סעלעקטירן פּרעדעפינעד:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.zh-CN.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "zh-CN",
          	dir : "ltr",
          	common: {
          		"ok": "保存",
          		"cancel": "取消",
          		"key_backspace": "退格", 
          		"key_del": "删除", 
          		"key_down": "下", 
          		"key_up": "上", 
          		"more_opts": "更多选项",
          		"url": "URL",
          		"width": "宽度",
          		"height": "高度"
          	},
          	misc: {
          		"powered_by": "版权所有"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "显示/隐藏更式边线工具",
          		"palette_info": "点击更改填充颜色,按住Shift键单击更改线条颜色",
          		"zoom_level": "更改缩放级别",
          		"panel_drag": "左右拖拽调整面板大小"
          	},
          	properties: {
          		"id": "元素ID",
          		"fill_color": "更改填充颜色",
          		"stroke_color": "线条的颜色变化",
          		"stroke_style": "更改线条样式",
          		"stroke_width": "更改线条宽度",
          		"pos_x": "更改X坐标",
          		"pos_y": "更改Y坐标",
          		"linecap_butt": "顶端样式: 齐平",
          		"linecap_round": "顶端样式: 圆滑",
          		"linecap_square": "顶端样式: 方块",
          		"linejoin_bevel": "连接处: 削平",
          		"linejoin_miter": "连接处: 直角",
          		"linejoin_round": "连接处: 圆角",
          		"angle": "更改旋转角度",
          		"blur": "更改高斯模糊值",
          		"opacity": "更改所选条目的不透明度",
          		"circle_cx": "改变圆的中心X坐标",
          		"circle_cy": "改变圆的中心Y坐标",
          		"circle_r": "改变圆的半径",
          		"ellipse_cx": "改变椭圆的中心X坐标",
          		"ellipse_cy": "改变椭圆的中心Y坐标",
          		"ellipse_rx": "改变椭圆的x半径",
          		"ellipse_ry": "改变椭圆的y半径",
          		"line_x1": "更改直线起点的x坐标",
          		"line_x2": "更改直线终点的x坐标",
          		"line_y1": "更改直线起点的y坐标",
          		"line_y2": "更改直线终点的y坐标",
          		"rect_height": "更改矩形的高度",
          		"rect_width": "更改矩形的宽度",
          		"corner_radius": "角半径:",
          		"image_width": "更改图像的宽度",
          		"image_height": "更改图像的高度",
          		"image_url": "更改网址",
          		"node_x": "更改节点的X坐标",
          		"node_y": "更改节点的Y坐标",
          		"seg_type": "修改线段类型",
          		"straight_segments": "直线",
          		"curve_segments": "曲线",
          		"text_contents": "更改文本内容",
          		"font_family": "更改字体样式",
          		"font_size": "更改字体大小",
          		"bold": "粗体",
          		"italic": "斜体"
          	},
          	tools: { 
          		"main_menu": "主菜单",
          		"bkgnd_color_opac": "更改背景颜色/不透明",
          		"connector_no_arrow": "无箭头",
          		"fitToContent": "适应内容",
          		"fit_to_all": "适应于所有的内容",
          		"fit_to_canvas": "适应画布",
          		"fit_to_layer_content": "适应层内容",
          		"fit_to_sel": "适应选中内容",
          		"align_relative_to": "相对对齐 ...",
          		"relativeTo": "相对于:",
          		"网页": "网页",
          		"largest_object": "最大对象",
          		"selected_objects": "选中的对象",
          		"smallest_object": "最小的对象",
          		"new_doc": "新文档",
          		"open_doc": "打开文档",
          		"export_img": "导出",
          		"save_doc": "保存图像",
          		"import_doc": "导入SVG",
          		"align_to_page": "对齐元素到页面",
          		"align_bottom": "底部对齐",
          		"align_center": "居中对齐",
          		"align_left": "左对齐",
          		"align_middle": "水平居中对齐",
          		"align_right": "右对齐",
          		"align_top": "顶端对齐",
          		"mode_select": "选择工具",
          		"mode_fhpath": "铅笔工具",
          		"mode_line": "线工具",
          		"mode_connect": "连接两个对象",
          		"mode_rect": "矩形",
          		"mode_square": "正方形",
          		"mode_fhrect": "自由矩形",
          		"mode_ellipse": "椭圆",
          		"mode_circle": "圆形",
          		"mode_fhellipse": "自由椭圆",
          		"mode_path": "路径",
          		"mode_shapelib": "图形库",
          		"mode_text": "文字工具",
          		"mode_image": "图像工具",
          		"mode_zoom": "缩放工具",
          		"mode_eyedropper": "吸管",
          		"no_embed": "注意: 根据SVG图像的存储位置,内嵌的位图可能无法显示!",
          		"undo": "撤消",
          		"redo": "重做",
          		"tool_source": "编辑源",
          		"wireframe_mode": "线条模式",
          		"toggle_grid": "显示/隐藏 网格",
          		"clone": "克隆元素",
          		"del": "删除元素",
          		"group_elements": "组合元素",
          		"make_link": "创建超链接",
          		"set_link_url": "设置链接URL (设置为空以删除)",
          		"to_path": "转换为路径",
          		"reorient_path": "调整路径",
          		"ungroup": "取消组合元素",
          		"docprops": "文档属性",
          		"imagelib": "图像库",
          		"move_bottom": "移至底部",
          		"move_top": "移至顶部",
          		"node_clone": "复制节点",
          		"node_delete": "删除节点",
          		"node_link": "连接控制点",
          		"add_subpath": "添加子路径",
          		"openclose_path": "打开/关闭 子路径",
          		"source_save": "保存",
          		"cut": "剪切",
          		"copy": "复制",
          		"paste": "粘贴",
          		"paste_in_place": "粘贴到原位置",
          		"delete": "删除",
          		"group": "组合",
          		"move_front": "移至顶部",
          		"move_up": "向上移动",
          		"move_down": "向下移动",
          		"move_back": "移至底部"
          	},
          	layers: {
          		"layer":"图层",
          		"layers": "图层",
          		"del": "删除图层",
          		"move_down": "向下移动图层",
          		"new": "新建图层",
          		"rename": "重命名图层",
          		"move_up": "向上移动图层",
          		"dupe": "复制图层",
          		"merge_down": "向下合并",
          		"merge_all": "全部合并",
          		"move_elems_to": "移动元素至:",
          		"move_selected": "移动元素至另一个图层"
          	},
          	config: {
          		"image_props": "图像属性",
          		"doc_title": "标题",
          		"doc_dims": "画布大小",
          		"included_images": "包含图像",
          		"image_opt_embed": "嵌入数据 (本地文件)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "编辑器首选项",
          		"icon_size": "图标大小",
          		"language": "语言",
          		"background": "编辑器背景",
          		"editor_img_url": "图像 URL",
          		"editor_bg_note": "注意: 背景不会保存在图像中.",
          		"icon_large": "大",
          		"icon_medium": "中",
          		"icon_small": "小",
          		"icon_xlarge": "特大",
          		"select_predefined": "选择预定义:",
          		"units_and_rulers": "单位 & 标尺",
          		"show_rulers": "显示标尺",
          		"base_unit": "基本单位:",
          		"grid": "网格",
          		"snapping_onoff": "吸附开/关",
          		"snapping_stepsize": "吸附步长:",
          		"grid_color": "网格颜色"
          	},
          	shape_cats: {
          		"basic": "常规",
          		"object": "对象",
          		"symbol": "符号",
          		"arrow": "箭头",
          		"flowchart": "流程图",
          		"animal": "动物",
          		"game": "纸牌 & 棋子",
          		"dialog_balloon": "信息气球",
          		"electronics": "电力元件",
          		"math": "数学符号",
          		"music": "音乐符号",
          		"misc": "杂项",
          		"raphael_1": "常用图标1",
          		"raphael_2": "常用图标2"
          	},
          	imagelib: {
          		"select_lib": "选择一个图像库",
          		"show_list": "显示库列表",
          		"import_single": "单个导入",
          		"import_multi": "批量导入",
          		"open": "打开一个新文档"
          	},
          	notification: {
          		"invalidAttrValGiven":"无效的参数",
          		"noContentToFitTo":"无可适应的内容",
          		"dupeLayerName":"已存在同名的图层!",
          		"enterUniqueLayerName":"请输入一个唯一的图层名称",
          		"enterNewLayerName":"请输入新的图层名称",
          		"layerHasThatName":"图层已经采用了该名称",
          		"QmoveElemsToLayer":"您确定移动所选元素到图层'%s'吗?",
          		"QwantToClear":"您希望清除当前绘制的所有图形吗?\n该操作将无法撤消!",
          		"QwantToOpen":"您希望打开一个新文档吗?\n该操作将无法撤消!",
          		"QerrorsRevertToSource":"SVG文件解析错误.\n是否还原到最初的SVG文件?",
          		"QignoreSourceChanges":"忽略对SVG文件所作的更改么?",
          		"featNotSupported":"不支持该功能",
          		"enterNewImgURL":"请输入新图像的URLL",
          		"defsFailOnSave": "注意: 由于您所使用的浏览器存在缺陷, 该图像无法正确显示 (不支持渐变或相关元素). 修复该缺陷后可正确显示.",
          		"loadingImage":"正在加载图像, 请稍候...",
          		"saveFromBrowser": "选择浏览器中的 \"另存为...\" 将该图像保存为 %s 文件.",
          		"noteTheseIssues": "同时注意以下几点: ",
          		"unsavedChanges": "存在未保存的修改.",
          		"enterNewLinkURL": "输入新建链接的URL地址",
          		"errorLoadingSVG": "错误: 无法加载SVG数据",
          		"URLloadFail": "无法从URL中加载",
          		"retrieving": "检索 \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
          
        • lang.zh-HK.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "zh-HK",
          	dir : "ltr",
          	common: {
          		"ok": "保存",
          		"cancel": "取消",
          		"key_backspace": "backspace", 
          		"key_del": "delete", 
          		"key_down": "down", 
          		"key_up": "up", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "点击更改填充颜色,按住Shift键单击更改颜色中风",
          		"zoom_level": "更改缩放级别",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "更改填充颜色",
          		"stroke_color": "中风的颜色变化",
          		"stroke_style": "更改行程冲刺风格",
          		"stroke_width": "笔划宽度的变化",
          		"pos_x": "Change X coordinate",
          		"pos_y": "Change Y coordinate",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "旋转角度的变化",
          		"blur": "Change gaussian blur value",
          		"opacity": "更改所选项目不透明",
          		"circle_cx": "改变循环的CX坐标",
          		"circle_cy": "改变循环的赛扬坐标",
          		"circle_r": "改变圆的半径",
          		"ellipse_cx": "改变椭圆的CX坐标",
          		"ellipse_cy": "改变椭圆的赛扬坐标",
          		"ellipse_rx": "改变椭圆的x半径",
          		"ellipse_ry": "改变椭圆的y半径",
          		"line_x1": "更改行的起点的x坐标",
          		"line_x2": "更改行的结束x坐标",
          		"line_y1": "更改行的起点的y坐标",
          		"line_y2": "更改行的结束y坐标",
          		"rect_height": "更改矩形的高度",
          		"rect_width": "更改矩形的宽度",
          		"corner_radius": "角半径:",
          		"image_width": "更改图像的宽度",
          		"image_height": "更改图像高度",
          		"image_url": "更改网址",
          		"node_x": "Change node's x coordinate",
          		"node_y": "Change node's y coordinate",
          		"seg_type": "Change Segment type",
          		"straight_segments": "Straight",
          		"curve_segments": "Curve",
          		"text_contents": "更改文字内容",
          		"font_family": "更改字体家族",
          		"font_size": "更改字体大小",
          		"bold": "粗体",
          		"italic": "斜体文本"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "更改背景颜色/不透明",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "适合内容",
          		"fit_to_all": "适合于所有的内容",
          		"fit_to_canvas": "适合画布",
          		"fit_to_layer_content": "适合层内容",
          		"fit_to_sel": "适合选择",
          		"align_relative_to": "相对对齐 ...",
          		"relativeTo": "相对于:",
          		"网页": "网页",
          		"largest_object": "最大对象",
          		"selected_objects": "选对象",
          		"smallest_object": "最小的对象",
          		"new_doc": "新形象",
          		"open_doc": "打开图像",
          		"export_img": "Export",
          		"save_doc": "保存图像",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "底部对齐",
          		"align_center": "居中对齐",
          		"align_left": "左对齐",
          		"align_middle": "中间对齐",
          		"align_right": "右对齐",
          		"align_top": "顶端对齐",
          		"mode_select": "选择工具",
          		"mode_fhpath": "铅笔工具",
          		"mode_line": "线工具",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "免费手矩形",
          		"mode_ellipse": "椭圆",
          		"mode_circle": "圈",
          		"mode_fhellipse": "免费手椭圆",
          		"mode_path": "Path Tool",
          		"mode_shapelib": "Shape library",
          		"mode_text": "文字工具",
          		"mode_image": "图像工具",
          		"mode_zoom": "缩放工具",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "撤消",
          		"redo": "重做",
          		"tool_source": "编辑源",
          		"wireframe_mode": "Wireframe Mode",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "族元素",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "Convert to Path",
          		"reorient_path": "Reorient path",
          		"ungroup": "Ungroup Elements",
          		"docprops": "文档属性",
          		"imagelib": "Image Library",
          		"move_bottom": "移至底部",
          		"move_top": "移动到顶部",
          		"node_clone": "Clone Node",
          		"node_delete": "Delete Node",
          		"node_link": "Link Control Points",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "保存",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"delete": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"Layer",
          		"layers": "Layers",
          		"del": "删除层",
          		"move_down": "层向下移动",
          		"new": "新层",
          		"rename": "重命名层",
          		"move_up": "移动层最多",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "Move elements to:",
          		"move_selected": "Move selected elements to a different layer"
          	},
          	config: {
          		"image_props": "Image Properties",
          		"doc_title": "Title",
          		"doc_dims": "Canvas Dimensions",
          		"included_images": "Included Images",
          		"image_opt_embed": "Embed data (local files)",
          		"image_opt_ref": "Use file reference",
          		"editor_prefs": "Editor Preferences",
          		"icon_size": "Icon size",
          		"language": "Language",
          		"background": "Editor Background",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "Note: Background will not be saved with image.",
          		"icon_large": "Large",
          		"icon_medium": "Medium",
          		"icon_small": "Small",
          		"icon_xlarge": "Extra Large",
          		"select_predefined": "选择预定义:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"Invalid value given",
          		"noContentToFitTo":"No content to fit to",
          		"dupeLayerName":"There is already a layer named that!",
          		"enterUniqueLayerName":"Please enter a unique layer name",
          		"enterNewLayerName":"Please enter the new layer name",
          		"layerHasThatName":"Layer already has that name",
          		"QmoveElemsToLayer":"Move selected elements to layer '%s'?",
          		"QwantToClear":"Do you want to clear the drawing?\nThis will also erase your undo history!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"There were parsing errors in your SVG source.\nRevert back to original SVG source?",
          		"QignoreSourceChanges":"Ignore changes made to SVG source?",
          		"featNotSupported":"Feature not supported",
          		"enterNewImgURL":"Enter the new image URL",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • lang.zh-TW.js
          /*globals svgEditor */
          svgEditor.readLang({
          	lang: "zh-TW",
          	dir : "ltr",
          	common: {
          		"ok": "保存",
          		"cancel": "取消",
          		"key_backspace": "空白", 
          		"key_del": "刪除", 
          		"key_down": "下", 
          		"key_up": "上", 
          		"more_opts": "More Options",
          		"url": "URL",
          		"width": "Width",
          		"height": "Height"
          	},
          	misc: {
          		"powered_by": "Powered by"
          	}, 
          	ui: {
          		"toggle_stroke_tools": "Show/hide more stroke tools",
          		"palette_info": "點擊更改填充顏色,按住Shift鍵單擊更改線條顏色",
          		"zoom_level": "更改縮放級別",
          		"panel_drag": "Drag left/right to resize side panel"
          	},
          	properties: {
          		"id": "Identify the element",
          		"fill_color": "更改填充顏色",
          		"stroke_color": "線條顏色",
          		"stroke_style": "更改線條(虛線)風格",
          		"stroke_width": "線條寬度",
          		"pos_x": "調整 X 軸",
          		"pos_y": "調整 Y 軸",
          		"linecap_butt": "Linecap: Butt",
          		"linecap_round": "Linecap: Round",
          		"linecap_square": "Linecap: Square",
          		"linejoin_bevel": "Linejoin: Bevel",
          		"linejoin_miter": "Linejoin: Miter",
          		"linejoin_round": "Linejoin: Round",
          		"angle": "旋轉角度",
          		"blur": "Change gaussian blur value",
          		"opacity": "更改所選項目不透明度",
          		"circle_cx": "改變圓的CX坐標",
          		"circle_cy": "改變圓的CY坐標",
          		"circle_r": "改變圓的半徑",
          		"ellipse_cx": "改變橢圓的圓心x軸座標",
          		"ellipse_cy": "改變橢圓的圓心y軸座標",
          		"ellipse_rx": "改變橢圓的x軸長",
          		"ellipse_ry": "改變橢圓的y軸長",
          		"line_x1": "更改行的起點的x坐標",
          		"line_x2": "更改行的終點x坐標",
          		"line_y1": "更改行的起點的y坐標",
          		"line_y2": "更改行的終點y坐標",
          		"rect_height": "更改矩形的高度",
          		"rect_width": "更改矩形的寬度",
          		"corner_radius": "角半徑:",
          		"image_width": "更改圖像的寬度",
          		"image_height": "更改圖像高度",
          		"image_url": "更改網址",
          		"node_x": "改變節點的x軸座標",
          		"node_y": "改變節點的y軸座標",
          		"seg_type": "Change Segment type",
          		"straight_segments": "直線",
          		"curve_segments": "曲線",
          		"text_contents": "更改文字內容",
          		"font_family": "更改字體",
          		"font_size": "更改字體大小",
          		"bold": "粗體",
          		"italic": "斜體"
          	},
          	tools: { 
          		"main_menu": "Main Menu",
          		"bkgnd_color_opac": "更改背景顏色/不透明",
          		"connector_no_arrow": "No arrow",
          		"fitToContent": "適合內容",
          		"fit_to_all": "適合所有的內容",
          		"fit_to_canvas": "適合畫布",
          		"fit_to_layer_content": "適合圖層內容",
          		"fit_to_sel": "適合選取的物件",
          		"align_relative_to": "相對對齊 ...",
          		"relativeTo": "相對於:",
          		"網頁": "網頁",
          		"largest_object": "最大的物件",
          		"selected_objects": "選取物件",
          		"smallest_object": "最小的物件",
          		"new_doc": "清空圖像",
          		"open_doc": "打開圖像",
          		"export_img": "Export",
          		"save_doc": "保存圖像",
          		"import_doc": "Import Image",
          		"align_to_page": "Align Element to Page",
          		"align_bottom": "底部對齊",
          		"align_center": "居中對齊",
          		"align_left": "向左對齊",
          		"align_middle": "中間對齊",
          		"align_right": "向右對齊",
          		"align_top": "頂端對齊",
          		"mode_select": "選擇工具",
          		"mode_fhpath": "鉛筆工具",
          		"mode_line": "線工具",
          		"mode_connect": "Connect two objects",
          		"mode_rect": "Rectangle Tool",
          		"mode_square": "Square Tool",
          		"mode_fhrect": "徒手畫矩形",
          		"mode_ellipse": "橢圓",
          		"mode_circle": "圓",
          		"mode_fhellipse": "徒手畫橢圓",
          		"mode_path": "路徑工具",
          		"mode_shapelib": "Shape library",
          		"mode_text": "文字工具",
          		"mode_image": "圖像工具",
          		"mode_zoom": "縮放工具",
          		"mode_eyedropper": "Eye Dropper Tool",
          		"no_embed": "NOTE: This image cannot be embedded. It will depend on this path to be displayed",
          		"undo": "取消復原",
          		"redo": "復原",
          		"tool_source": "編輯SVG原始碼",
          		"wireframe_mode": "框線模式(只瀏覽線條)",
          		"toggle_grid": "Show/Hide Grid",
          		"clone": "Clone Element(s)",
          		"del": "Delete Element(s)",
          		"group_elements": "群組",
          		"make_link": "Make (hyper)link",
          		"set_link_url": "Set link URL (leave empty to remove)",
          		"to_path": "轉換成路徑",
          		"reorient_path": "調整路徑",
          		"ungroup": "取消群組",
          		"docprops": "文件屬性",
          		"imagelib": "Image Library",
          		"move_bottom": "移至底部",
          		"move_top": "移動到頂部",
          		"node_clone": "增加節點",
          		"node_delete": "刪除節點",
          		"node_link": "將控制點連起來",
          		"add_subpath": "Add sub-path",
          		"openclose_path": "Open/close sub-path",
          		"source_save": "保存",
          		"cut": "Cut",
          		"copy": "Copy",
          		"paste": "Paste",
          		"paste_in_place": "Paste in Place",
          		"刪除": "Delete",
          		"group": "Group",
          		"move_front": "Bring to Front",
          		"move_up": "Bring Forward",
          		"move_down": "Send Backward",
          		"move_back": "Send to Back"
          	},
          	layers: {
          		"layer":"圖層",
          		"layers": "Layers",
          		"del": "刪除圖層",
          		"move_down": "向下移動圖層",
          		"new": "新增圖層",
          		"rename": "重新命名圖層",
          		"move_up": "向上移動圖層",
          		"dupe": "Duplicate Layer",
          		"merge_down": "Merge Down",
          		"merge_all": "Merge All",
          		"move_elems_to": "移動物件到:",
          		"move_selected": "移動被點選的物件其他圖層"
          	},
          	config: {
          		"image_props": "圖片屬性",
          		"doc_title": "標題",
          		"doc_dims": "畫布大小",
          		"included_images": "包含圖像",
          		"image_opt_embed": "內嵌資料 (本地端檔案)",
          		"image_opt_ref": "使用檔案參照",
          		"editor_prefs": "編輯器屬性",
          		"icon_size": "圖示大小",
          		"language": "語言",
          		"background": "編輯器背景",
          		"editor_img_url": "Image URL",
          		"editor_bg_note": "注意: 編輯器背景不會和圖像一起儲存",
          		"icon_large": "大",
          		"icon_medium": "中",
          		"icon_small": "小",
          		"icon_xlarge": "特大",
          		"select_predefined": "使用預設值:",
          		"units_and_rulers": "Units & Rulers",
          		"show_rulers": "Show rulers",
          		"base_unit": "Base Unit:",
          		"grid": "Grid",
          		"snapping_onoff": "Snapping on/off",
          		"snapping_stepsize": "Snapping Step-Size:",
          		"grid_color": "Grid color"
          	},
          	shape_cats: {
          		"basic": "Basic",
          		"object": "Objects",
          		"symbol": "Symbols",
          		"arrow": "Arrows",
          		"flowchart": "Flowchart",
          		"animal": "Animals",
          		"game": "Cards & Chess",
          		"dialog_balloon": "Dialog balloons",
          		"electronics": "Electronics",
          		"math": "Mathematical",
          		"music": "Music",
          		"misc": "Miscellaneous",
          		"raphael_1": "raphaeljs.com set 1",
          		"raphael_2": "raphaeljs.com set 2"
          	},
          	imagelib: {
          		"select_lib": "Select an image library",
          		"show_list": "Show library list",
          		"import_single": "Import single",
          		"import_multi": "Import multiple",
          		"open": "Open as new document"
          	},
          	notification: {
          		"invalidAttrValGiven":"數值給定錯誤",
          		"noContentToFitTo":"找不到符合的內容",
          		"dupeLayerName":"喔不!已經有另一個同樣名稱的圖層了!",
          		"enterUniqueLayerName":"請輸入一個名稱不重複的",
          		"enterNewLayerName":"請輸入新圖層的名稱",
          		"layerHasThatName":"圖層本來就是這個名稱(抱怨)",
          		"QmoveElemsToLayer":"要搬移所選取的物件到'%s'層嗎?",
          		"QwantToClear":"要清空圖像嗎?\n這會順便清空你的回復紀錄!",
          		"QwantToOpen":"Do you want to open a new file?\nThis will also erase your undo history!",
          		"QerrorsRevertToSource":"SVG原始碼解析錯誤\n要回復到原本的SVG原始碼嗎?",
          		"QignoreSourceChanges":"要忽略對SVG原始碼的更動嗎?",
          		"featNotSupported":"未提供此功能",
          		"enterNewImgURL":"輸入新的圖片網址",
          		"defsFailOnSave": "NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.",
          		"loadingImage":"Loading image, please wait...",
          		"saveFromBrowser": "Select \"Save As...\" in your browser to save this image as a %s file.",
          		"noteTheseIssues": "Also note the following issues: ",
          		"unsavedChanges": "There are unsaved changes.",
          		"enterNewLinkURL": "Enter the new hyperlink URL",
          		"errorLoadingSVG": "Error: Unable to load SVG data",
          		"URLloadFail": "Unable to load from URL",
          		"retrieving": "Retrieving \"%s\"..."
          	},
          	confirmSetStorage: {
          		message: "By default and where supported, SVG-Edit can store your editor "+
          		"preferences and SVG content locally on your machine so you do not "+
          		"need to add these back each time you load SVG-Edit. If, for privacy "+
          		"reasons, you do not wish to store this information on your machine, "+
          		"you can change away from the default option below.",
          		storagePrefsAndContent: "Store preferences and SVG content locally",
          		storagePrefsOnly: "Only store preferences locally",
          		storagePrefs: "Store preferences locally",
          		storageNoPrefsOrContent: "Do not store my preferences or SVG content locally",
          		storageNoPrefs: "Do not store my preferences locally",
          		rememberLabel: "Remember this choice?",
          		rememberTooltip: "If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again."
          	}
          });
        • locale.js
          /*globals jQuery*/
          /*jslint vars: true, eqeq: true, forin: true*/
          /*
           * Localizing script for SVG-edit UI
           *
           * Licensed under the MIT License
           *
           * Copyright(c) 2010 Narendra Sisodya
           * Copyright(c) 2010 Alexis Deveria
           *
           */
          
          // Dependencies
          // 1) jQuery
          // 2) svgcanvas.js
          // 3) svg-editor.js
          
          var svgEditor = (function($, editor) {'use strict';
          
          	var lang_param;
          	
          	function setStrings(type, obj, ids) {
          		// Root element to look for element from
          		var i, sel, val, $elem, elem, node, parent = $('#svg_editor').parent();
          		for (sel in obj) {
          			val = obj[sel];
          			if (!val) {console.log(sel);}
          			
          			if (ids) {sel = '#' + sel;}
          			$elem = parent.find(sel);
          			if ($elem.length) {
          				elem = parent.find(sel)[0];
          				
          				switch ( type ) {
          					case 'content':
          						for (i = 0; i < elem.childNodes.length; i++) {
          							node = elem.childNodes[i];
          							if (node.nodeType === 3 && node.textContent.replace(/\s/g,'')) {
          								node.textContent = val;
          								break;
          							}
          						}
          						break;
          					
          					case 'title':
          						elem.title = val;
          						break;
          				}
          				
          				
          			} else {
          				console.log('Missing: ' + sel);
          			}
          		}
          	}
          
          	editor.readLang = function(langData) {
          		var more = editor.canvas.runExtensions('addlangData', lang_param, true);
          		$.each(more, function(i, m) {
          			if (m.data) {
          				langData = $.merge(langData, m.data);
          			}
          		});
          		
          		// Old locale file, do nothing for now.
          		if (!langData.tools) {return;}
          
          		var tools = langData.tools,
          			misc = langData.misc,
          			properties = langData.properties,
          			config = langData.config,
          			layers = langData.layers,
          			common = langData.common,
          			ui = langData.ui;
          		
          		setStrings('content', {
          			// copyrightLabel: misc.powered_by, // Currently commented out in svg-editor.html
          			curve_segments: properties.curve_segments,
          			fitToContent: tools.fitToContent,
          			fit_to_all: tools.fit_to_all,
          			fit_to_canvas: tools.fit_to_canvas,
          			fit_to_layer_content: tools.fit_to_layer_content,
          			fit_to_sel: tools.fit_to_sel,
          			
          			icon_large: config.icon_large,
          			icon_medium: config.icon_medium,
          			icon_small: config.icon_small,
          			icon_xlarge: config.icon_xlarge,
          			image_opt_embed: config.image_opt_embed,
          			image_opt_ref: config.image_opt_ref,
          			includedImages: config.included_images,
          			
          			largest_object: tools.largest_object,
          			
          			layersLabel: layers.layers,
          			page: tools.page,
          			relativeToLabel: tools.relativeTo,
          			selLayerLabel: layers.move_elems_to,
          			selectedPredefined: config.select_predefined,
          			
          			selected_objects: tools.selected_objects,
          			smallest_object: tools.smallest_object,
          			straight_segments: properties.straight_segments,
          			
          			svginfo_bg_url: config.editor_img_url + ":",
          			svginfo_bg_note: config.editor_bg_note,
          			svginfo_change_background: config.background,
          			svginfo_dim: config.doc_dims,
          			svginfo_editor_prefs: config.editor_prefs,
          			svginfo_height: common.height,
          			svginfo_icons: config.icon_size,
          			svginfo_image_props: config.image_props,
          			svginfo_lang: config.language,
          			svginfo_title: config.doc_title,
          			svginfo_width: common.width,
          			
          			tool_docprops_cancel: common.cancel,
          			tool_docprops_save: common.ok,
          
          			tool_source_cancel: common.cancel,
          			tool_source_save: common.ok,
          			
          			tool_prefs_cancel: common.cancel,
          			tool_prefs_save: common.ok,
          
          			sidepanel_handle: layers.layers.split('').join(' '),
          
          			tool_clear: tools.new_doc,
          			tool_docprops: tools.docprops,
          			tool_export: tools.export_img,
          			tool_import: tools.import_doc,
          			tool_imagelib: tools.imagelib,
          			tool_open: tools.open_doc,
          			tool_save: tools.save_doc,
          			
          			svginfo_units_rulers: config.units_and_rulers,
          			svginfo_rulers_onoff: config.show_rulers,
          			svginfo_unit: config.base_unit,
          			
          			svginfo_grid_settings: config.grid,
          			svginfo_snap_onoff: config.snapping_onoff,
          			svginfo_snap_step: config.snapping_stepsize,
          			svginfo_grid_color: config.grid_color
          		}, true);
          		
          		// Shape categories
          		var o, cats = {};
          		for (o in langData.shape_cats) {
          			cats['#shape_cats [data-cat="' + o + '"]'] = langData.shape_cats[o];
          		}
          		
          		// TODO: Find way to make this run after shapelib ext has loaded
          		setTimeout(function() {
          			setStrings('content', cats);
          		}, 2000);
          		
          		// Context menus
          		var opts = {};
          		$.each(['cut','copy','paste', 'paste_in_place', 'delete', 'group', 'ungroup', 'move_front', 'move_up', 'move_down', 'move_back'], function() {
          			opts['#cmenu_canvas a[href="#' + this + '"]'] = tools[this];
          		});
          
          		$.each(['dupe','merge_down', 'merge_all'], function() {
          			opts['#cmenu_layers a[href="#' + this + '"]'] = layers[this];
          		});
          
          		opts['#cmenu_layers a[href="#delete"]'] = layers.del;
          		
          		setStrings('content', opts);
          		
          		setStrings('title', {
          			align_relative_to: tools.align_relative_to,
          			circle_cx: properties.circle_cx,
          			circle_cy: properties.circle_cy,
          			circle_r: properties.circle_r,
          			cornerRadiusLabel: properties.corner_radius,
          			ellipse_cx: properties.ellipse_cx,
          			ellipse_cy: properties.ellipse_cy,
          			ellipse_rx: properties.ellipse_rx,
          			ellipse_ry: properties.ellipse_ry,
          			fill_color: properties.fill_color,
          			font_family: properties.font_family,
          			idLabel: properties.id,
          			image_height: properties.image_height,
          			image_url: properties.image_url,
          			image_width: properties.image_width,
          			layer_delete: layers.del,
          			layer_down: layers.move_down,
          			layer_new: layers['new'],
          			layer_rename: layers.rename,
          			layer_moreopts: common.more_opts,
          			layer_up: layers.move_up,
          			line_x1: properties.line_x1,
          			line_x2: properties.line_x2,
          			line_y1: properties.line_y1,
          			line_y2: properties.line_y2,
          			linecap_butt: properties.linecap_butt,
          			linecap_round: properties.linecap_round,
          			linecap_square: properties.linecap_square,
          			linejoin_bevel: properties.linejoin_bevel,
          			linejoin_miter: properties.linejoin_miter,
          			linejoin_round: properties.linejoin_round,
          			main_icon: tools.main_menu,
          			mode_connect: tools.mode_connect,
          			tools_shapelib_show: tools.mode_shapelib,
          			palette: ui.palette_info,
          			zoom_panel: ui.zoom_level,
          			path_node_x: properties.node_x,
          			path_node_y: properties.node_y,
          			rect_height_tool: properties.rect_height,
          			rect_width_tool: properties.rect_width,
          			seg_type: properties.seg_type,
          			selLayerNames: layers.move_selected,
          			selected_x: properties.pos_x,
          			selected_y: properties.pos_y,
          			stroke_color: properties.stroke_color,
          			stroke_style: properties.stroke_style,
          			stroke_width: properties.stroke_width,
          			svginfo_title: config.doc_title,
          			text: properties.text_contents,
          			toggle_stroke_tools: ui.toggle_stroke_tools,
          			tool_add_subpath: tools.add_subpath,
          			tool_alignbottom: tools.align_bottom,
          			tool_aligncenter: tools.align_center,
          			tool_alignleft: tools.align_left,
          			tool_alignmiddle: tools.align_middle,
          			tool_alignright: tools.align_right,
          			tool_aligntop: tools.align_top,
          			tool_angle: properties.angle,
          			tool_blur: properties.blur,
          			tool_bold: properties.bold,
          			tool_circle: tools.mode_circle,
          			tool_clone: tools.clone,
          			tool_clone_multi: tools.clone,
          			tool_delete: tools.del,
          			tool_delete_multi: tools.del,
          			tool_ellipse: tools.mode_ellipse,
          			tool_eyedropper: tools.mode_eyedropper,
          			tool_fhellipse: tools.mode_fhellipse,
          			tool_fhpath: tools.mode_fhpath,
          			tool_fhrect: tools.mode_fhrect,
          			tool_font_size: properties.font_size,
          			tool_group_elements: tools.group_elements,
          			tool_make_link: tools.make_link,
          			tool_link_url: tools.set_link_url,
          			tool_image: tools.mode_image,
          			tool_italic: properties.italic,
          			tool_line: tools.mode_line,
          			tool_move_bottom: tools.move_bottom,
          			tool_move_top: tools.move_top,
          			tool_node_clone: tools.node_clone,
          			tool_node_delete: tools.node_delete,
          			tool_node_link: tools.node_link,
          			tool_opacity: properties.opacity,
          			tool_openclose_path: tools.openclose_path,
          			tool_path: tools.mode_path,
          			tool_position: tools.align_to_page,
          			tool_rect: tools.mode_rect,
          			tool_redo: tools.redo,
          			tool_reorient: tools.reorient_path,
          			tool_select: tools.mode_select,
          			tool_source: tools.source_save,
          			tool_square: tools.mode_square,
          			tool_text: tools.mode_text,
          			tool_topath: tools.to_path,
          			tool_undo: tools.undo,
          			tool_ungroup: tools.ungroup,
          			tool_wireframe: tools.wireframe_mode,
          			view_grid: tools.toggle_grid,
          			tool_zoom: tools.mode_zoom,
          			url_notice: tools.no_embed
          
          		}, true);
          		
          		editor.setLang(lang_param, langData);
          	};
          
          	editor.putLocale = function (given_param, good_langs) {
          	
          		if (given_param) {
          			lang_param = given_param;
          		}
          		else {
          			lang_param = $.pref('lang');
          			if (!lang_param) {
          				if (navigator.userLanguage) { // Explorer
          					lang_param = navigator.userLanguage;
          				}
          				else if (navigator.language) { // FF, Opera, ...
          					lang_param = navigator.language;
          				}
          				if (lang_param == null) { // Todo: Would cause problems if uiStrings removed; remove this?
          					return;
          				}
          			}
          			
          			console.log('Lang: ' + lang_param);
          			
          			// Set to English if language is not in list of good langs
          			if ($.inArray(lang_param, good_langs) === -1 && lang_param !== 'test') {
          				lang_param = "en";
          			}
          	
          			// don't bother on first run if language is English		
          			// The following line prevents setLang from running
          			//    extensions which depend on updated uiStrings,
          			//    so commenting it out.
          			// if (lang_param.indexOf("en") === 0) {return;}
          
          		}
          		
          		var conf = editor.curConfig;
          		
          		var url = conf.langPath + "lang." + lang_param + ".js";
          		
          		$.getScript(url, function(d) {
          			// Fails locally in Chrome 5+
          			if (!d) {
          				var s = document.createElement('script');
          				s.src = url;
          				document.querySelector('head').appendChild(s);
          			}
          		});
          		
          	};
          	
          	return editor;
          }(jQuery, svgEditor));
          
      • spinbtn
        • JQuerySpinBtn.css
          /*
          	Styles to make ordinary <INPUT type="text"/> look like a spinbutton/spinbox control.
          	Use with JQuerySpinBtn.js to provide the spin functionality by reacting to mouse etc.
          	(Requires a reference to the JQuery library found at http://jquery.com/src/latest/)
          	(Hats-off to John Resig for creating the excellent JQuery library. It is fab.)
          
          	This control is achieved with no extra html markup whatsoever and uses unobtrusive javascript.
          
          	Written by George Adamson, Software Unity (george.jquery@softwareunity.com) September 2006.
          	Big improvements added by Mark Gibson, (mgibson@designlinks.net) September 2006.
          
          	Do contact me with comments and suggestions but please don't ask for support.
          	As much as I'd love to help with specific problems I have plenty to get on with already!
          
          	Go ahead and use it in your own projects. This code is provided 'as is'.
          	Sure I've tested in heaps of ways. Its good for me, but you use it at your own risk.
          	SoftwareUnity and I are certainly not responsible if your computer sets fire to the sofa,
          	hacks into the pentagon, hijacks a plane or gives you any kind of hassle whatsoever.
          
          	If you'd like your spin-button image in a different place then you'll need to alter both
          	the CSS below and the javascript isMouseOverUpDn() function to accommodate the new position.
          	You could even have left and right buttons either side of the textbox.
          */
          
          INPUT.spin-button {
          	/* explicitly put padding for top/bottom/left in here so that Opera displays it better */
          	padding: 2px 20px 2px 2px;
          	background-repeat:no-repeat;		/* Warning: Img may disappear in Firefox if you use 'background-attachment:fixed' ! */
          	background-position:100% 0%;
          	background-image:url('spinbtn_updn.png');
          	background-color:white; /* Needed for Opera */
          }
          
          INPUT.spin-button.up {					/* Change button img when mouse is over the UP-arrow */
          	cursor:pointer;
          	background-position:100% -18px;		/* 18px matches height of 2 visible buttons */
          }
          INPUT.spin-button.down {				/* Change button img when mouse is over the DOWN-arrow */
          	cursor:pointer;
          	background-position:100% -36px;		/* 36px matches height of 2x2 visible buttons */
          }
          
        • JQuerySpinBtn.js
          /*globals $, svgEditor*/
          /*jslint vars: true, eqeq: true*/
          /* SpinButton control
           *
           * Adds bells and whistles to any ordinary textbox to
           * make it look and feel like a SpinButton Control.
           *
           * Originally written by George Adamson, Software Unity (george.jquery@softwareunity.com) August 2006.
           * - Added min/max options
           * - Added step size option
           * - Added bigStep (page up/down) option
           *
           * Modifications made by Mark Gibson, (mgibson@designlinks.net) September 2006:
           * - Converted to jQuery plugin
           * - Allow limited or unlimited min/max values
           * - Allow custom class names, and add class to input element
           * - Removed global vars
           * - Reset (to original or through config) when invalid value entered
           * - Repeat whilst holding mouse button down (with initial pause, like keyboard repeat)
           * - Support mouse wheel in Firefox
           * - Fix double click in IE
           * - Refactored some code and renamed some vars
           *
           * Modifications by Jeff Schiller, June 2009:
           * - provide callback function for when the value changes based on the following
           *   http://www.mail-archive.com/jquery-en@googlegroups.com/msg36070.html
           * Modifications by Jeff Schiller, July 2009:
           * - improve styling for widget in Opera
           * - consistent key-repeat handling cross-browser
           * Modifications by Alexis Deveria, October 2009:
           * - provide "stepfunc" callback option to allow custom function to run when changing a value
           * - Made adjustValue(0) only run on certain keyup events, not all.
           *
           * Tested in IE6, Opera9, Firefox 1.5
           * v1.0  11 Aug 2006 - George Adamson	- First release
           * v1.1     Aug 2006 - George Adamson	- Minor enhancements
           * v1.2  27 Sep 2006 - Mark Gibson		- Major enhancements
           * v1.3a 28 Sep 2006 - George Adamson	- Minor enhancements
           * v1.4  18 Jun 2009 - Jeff Schiller    - Added callback function
           * v1.5  06 Jul 2009 - Jeff Schiller    - Fixes for Opera.  
           * v1.6  13 Oct 2009 - Alexis Deveria   - Added stepfunc function  
           * v1.7  21 Oct 2009 - Alexis Deveria   - Minor fixes
           *                                        Fast-repeat for keys and live updating as you type.
           * v1.8  12 Jan 2010 - Benjamin Thomas  - Fixes for mouseout behavior.
           *                                        Added smallStep
           
           Sample usage:
           
          	// Create group of settings to initialise spinbutton(s). (Optional)
          	var myOptions = {
          					min: 0,						// Set lower limit.
          					max: 100,					// Set upper limit.
          					step: 1,					// Set increment size.
          					smallStep: 0.5,				// Set shift-click increment size.
          					spinClass: mySpinBtnClass,	// CSS class to style the spinbutton. (Class also specifies url of the up/down button image.)
          					upClass: mySpinUpClass,		// CSS class for style when mouse over up button.
          					downClass: mySpinDnClass	// CSS class for style when mouse over down button.
          					}
           
          	$(document).ready(function(){
          
          		// Initialise INPUT element(s) as SpinButtons: (passing options if desired)
          		$("#myInputElement").SpinButton(myOptions);
          
          	});
           
           */
          $.fn.SpinButton = function(cfg) { 'use strict';
          	function coord(el,prop) {
          		var c = el[prop], b = document.body;
          		
          		while ((el = el.offsetParent) && (el != b)) {
          			if (!$.browser.msie || (el.currentStyle.position !== 'relative')) {
          				c += el[prop];
          			}
          		}
          		
          		return c;
          	}
          
          	return this.each(function(){
          
          		this.repeating = false;
          		
          		// Apply specified options or defaults:
          		// (Ought to refactor this some day to use $.extend() instead)
          		this.spinCfg = {
          			//min: cfg && cfg.min ? Number(cfg.min) : null,
          			//max: cfg && cfg.max ? Number(cfg.max) : null,
          			min: cfg && !isNaN(parseFloat(cfg.min)) ? Number(cfg.min) : null,	// Fixes bug with min:0
          			max: cfg && !isNaN(parseFloat(cfg.max)) ? Number(cfg.max) : null,
          			step: cfg && cfg.step ? Number(cfg.step) : 1,
          			stepfunc: cfg && cfg.stepfunc ? cfg.stepfunc : false,
          			page: cfg && cfg.page ? Number(cfg.page) : 10,
          			upClass: cfg && cfg.upClass ? cfg.upClass : 'up',
          			downClass: cfg && cfg.downClass ? cfg.downClass : 'down',
          			reset: cfg && cfg.reset ? cfg.reset : this.value,
          			delay: cfg && cfg.delay ? Number(cfg.delay) : 500,
          			interval: cfg && cfg.interval ? Number(cfg.interval) : 100,
          			_btn_width: 20,
          			_direction: null,
          			_delay: null,
          			_repeat: null,
          			callback: cfg && cfg.callback ? cfg.callback : null
          		};
          
          		// if a smallStep isn't supplied, use half the regular step
          		this.spinCfg.smallStep = cfg && cfg.smallStep ? cfg.smallStep : this.spinCfg.step/2;
          		
          		this.adjustValue = function(i){
          			var v;
          			if(isNaN(this.value)) {
          				v = this.spinCfg.reset;
          			} else if($.isFunction(this.spinCfg.stepfunc)) {
          				v = this.spinCfg.stepfunc(this, i);
          			} else {
          				// weirdest javascript bug ever: 5.1 + 0.1 = 5.199999999
          				v = Number((Number(this.value) + Number(i)).toFixed(5));
          			}
          			if (this.spinCfg.min !== null) {v = Math.max(v, this.spinCfg.min);}
          			if (this.spinCfg.max !== null) {v = Math.min(v, this.spinCfg.max);}
          			this.value = v;
          			if ($.isFunction(this.spinCfg.callback)) {this.spinCfg.callback(this);}
          		};
          		
          		$(this)
          		.addClass(cfg && cfg.spinClass ? cfg.spinClass : 'spin-button')
          		
          		.mousemove(function(e){
          			// Determine which button mouse is over, or not (spin direction):
          			var x = e.pageX || e.x;
          			var y = e.pageY || e.y;
          			var el = e.target || e.srcElement;
          			var scale = svgEditor.tool_scale || 1;
          			var height = $(el).height()/2;
          			
          			var direction = 
          				(x > coord(el,'offsetLeft') + el.offsetWidth*scale - this.spinCfg._btn_width)
          				? ((y < coord(el,'offsetTop') + height*scale) ? 1 : -1) : 0;
          			
          			if (direction !== this.spinCfg._direction) {
          				// Style up/down buttons:
          				switch(direction){
          					case 1: // Up arrow:
          						$(this).removeClass(this.spinCfg.downClass).addClass(this.spinCfg.upClass);
          						break;
          					case -1: // Down arrow:
          						$(this).removeClass(this.spinCfg.upClass).addClass(this.spinCfg.downClass);
          						break;
          					default: // Mouse is elsewhere in the textbox
          						$(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);
          				}
          				
          				// Set spin direction:
          				this.spinCfg._direction = direction;
          			}
          		})
          		
          		.mouseout(function(){
          			// Reset up/down buttons to their normal appearance when mouse moves away:
          			$(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);
          			this.spinCfg._direction = null;
          			window.clearInterval(this.spinCfg._repeat);
          			window.clearTimeout(this.spinCfg._delay);
          		})
          		
          		.mousedown(function(e){
          			if (e.button === 0 && this.spinCfg._direction != 0) {
          				// Respond to click on one of the buttons:
          				var self = this;
          				var stepSize = e.shiftKey ? self.spinCfg.smallStep : self.spinCfg.step;
          
          				var adjust = function() {
          					self.adjustValue(self.spinCfg._direction * stepSize);
          				};
          			
          				adjust();
          				
          				// Initial delay before repeating adjustment
          				self.spinCfg._delay = window.setTimeout(function() {
          					adjust();
          					// Repeat adjust at regular intervals
          					self.spinCfg._repeat = window.setInterval(adjust, self.spinCfg.interval);
          				}, self.spinCfg.delay);
          			}
          		})
          		
          		.mouseup(function(e){
          			// Cancel repeating adjustment
          			window.clearInterval(this.spinCfg._repeat);
          			window.clearTimeout(this.spinCfg._delay);
          		})
          		
          		.dblclick(function(e) {
          			if ($.browser.msie) {
          				this.adjustValue(this.spinCfg._direction * this.spinCfg.step);
          			}
          		})
          		
          		.keydown(function(e){
          			// Respond to up/down arrow keys.
          			switch(e.keyCode){
          				case 38: this.adjustValue(this.spinCfg.step);  break; // Up
          				case 40: this.adjustValue(-this.spinCfg.step); break; // Down
          				case 33: this.adjustValue(this.spinCfg.page);  break; // PageUp
          				case 34: this.adjustValue(-this.spinCfg.page); break; // PageDown
          			}
          		})
          		
          		/*
          		http://unixpapa.com/js/key.html describes the current state-of-affairs for
          		key repeat events:
          		- Safari 3.1 changed their model so that keydown is reliably repeated going forward
          		- Firefox and Opera still only repeat the keypress event, not the keydown
          		*/
          		.keypress(function(e){
          			if (this.repeating) {
          				// Respond to up/down arrow keys.
          				switch(e.keyCode){
          					case 38: this.adjustValue(this.spinCfg.step);  break; // Up
          					case 40: this.adjustValue(-this.spinCfg.step); break; // Down
          					case 33: this.adjustValue(this.spinCfg.page);  break; // PageUp
          					case 34: this.adjustValue(-this.spinCfg.page); break; // PageDown
          				}
          			} 
          			// we always ignore the first keypress event (use the keydown instead)
          			else {
          				this.repeating = true;
          			}
          		})
          		
          		// clear the 'repeating' flag
          		.keyup(function(e) {
          			this.repeating = false;
          			switch(e.keyCode){
          				case 38: // Up
          				case 40: // Down
          				case 33: // PageUp
          				case 34: // PageDown
          				case 13: this.adjustValue(0); break; // Enter/Return
          			}
          		})
          		
          		.bind("mousewheel", function(e){
          			// Respond to mouse wheel in IE. (It returns up/dn motion in multiples of 120)
          			if (e.wheelDelta >= 120) {
          				this.adjustValue(this.spinCfg.step);
          			}
          			else if (e.wheelDelta <= -120) {
          				this.adjustValue(-this.spinCfg.step);
          			}
          			
          			e.preventDefault();
          		})
          		
          		.change(function(e){
          			this.adjustValue(0);
          		});
          		
          		if (this.addEventListener) {
          			// Respond to mouse wheel in Firefox
          			this.addEventListener('DOMMouseScroll', function(e) {
          				if (e.detail > 0) {
          					this.adjustValue(-this.spinCfg.step);
          				}
          				else if (e.detail < 0) {
          					this.adjustValue(this.spinCfg.step);
          				}
          				
          				e.preventDefault();
          			}, false);
          		}
          	});
          };
          
        • JQuerySpinBtn.min.js
          $.fn.SpinButton=function(b){function f(a,c){for(var e=a[c],d=document.body;(a=a.offsetParent)&&a!=d;)if(!$.browser.msie||a.currentStyle.position!="relative")e+=a[c];return e}return this.each(function(){this.repeating=false;this.spinCfg={min:b&&!isNaN(parseFloat(b.min))?Number(b.min):null,max:b&&!isNaN(parseFloat(b.max))?Number(b.max):null,step:b&&b.step?Number(b.step):1,stepfunc:b&&b.stepfunc?b.stepfunc:false,page:b&&b.page?Number(b.page):10,upClass:b&&b.upClass?b.upClass:"up",downClass:b&&b.downClass?
          b.downClass:"down",reset:b&&b.reset?b.reset:this.value,delay:b&&b.delay?Number(b.delay):500,interval:b&&b.interval?Number(b.interval):100,_btn_width:20,_direction:null,_delay:null,_repeat:null,callback:b&&b.callback?b.callback:null};this.spinCfg.smallStep=b&&b.smallStep?b.smallStep:this.spinCfg.step/2;this.adjustValue=function(a){a=isNaN(this.value)?this.spinCfg.reset:$.isFunction(this.spinCfg.stepfunc)?this.spinCfg.stepfunc(this,a):Number((Number(this.value)+Number(a)).toFixed(5));if(this.spinCfg.min!==
          null)a=Math.max(a,this.spinCfg.min);if(this.spinCfg.max!==null)a=Math.min(a,this.spinCfg.max);this.value=a;$.isFunction(this.spinCfg.callback)&&this.spinCfg.callback(this)};$(this).addClass(b&&b.spinClass?b.spinClass:"spin-button").mousemove(function(a){var c=a.pageX||a.x,e=a.pageY||a.y;a=a.target||a.srcElement;var d=svgEditor.tool_scale||1,g=$(a).height()/2;c=c>f(a,"offsetLeft")+a.offsetWidth*d-this.spinCfg._btn_width?e<f(a,"offsetTop")+g*d?1:-1:0;if(c!==this.spinCfg._direction){switch(c){case 1:$(this).removeClass(this.spinCfg.downClass).addClass(this.spinCfg.upClass);
          break;case -1:$(this).removeClass(this.spinCfg.upClass).addClass(this.spinCfg.downClass);break;default:$(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass)}this.spinCfg._direction=c}}).mouseout(function(){$(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);this.spinCfg._direction=null;window.clearInterval(this.spinCfg._repeat);window.clearTimeout(this.spinCfg._delay)}).mousedown(function(a){if(a.button===0&&this.spinCfg._direction!=0){var c=this,
          e=a.shiftKey?c.spinCfg.smallStep:c.spinCfg.step,d=function(){c.adjustValue(c.spinCfg._direction*e)};d();c.spinCfg._delay=window.setTimeout(function(){d();c.spinCfg._repeat=window.setInterval(d,c.spinCfg.interval)},c.spinCfg.delay)}}).mouseup(function(){window.clearInterval(this.spinCfg._repeat);window.clearTimeout(this.spinCfg._delay)}).dblclick(function(){$.browser.msie&&this.adjustValue(this.spinCfg._direction*this.spinCfg.step)}).keydown(function(a){switch(a.keyCode){case 38:this.adjustValue(this.spinCfg.step);
          break;case 40:this.adjustValue(-this.spinCfg.step);break;case 33:this.adjustValue(this.spinCfg.page);break;case 34:this.adjustValue(-this.spinCfg.page)}}).keypress(function(a){if(this.repeating)switch(a.keyCode){case 38:this.adjustValue(this.spinCfg.step);break;case 40:this.adjustValue(-this.spinCfg.step);break;case 33:this.adjustValue(this.spinCfg.page);break;case 34:this.adjustValue(-this.spinCfg.page)}else this.repeating=true}).keyup(function(a){this.repeating=false;switch(a.keyCode){case 38:case 40:case 33:case 34:case 13:this.adjustValue(0)}}).bind("mousewheel",
          function(a){if(a.wheelDelta>=120)this.adjustValue(this.spinCfg.step);else a.wheelDelta<=-120&&this.adjustValue(-this.spinCfg.step);a.preventDefault()}).change(function(){this.adjustValue(0)});this.addEventListener&&this.addEventListener("DOMMouseScroll",function(a){if(a.detail>0)this.adjustValue(-this.spinCfg.step);else a.detail<0&&this.adjustValue(this.spinCfg.step);a.preventDefault()},false)})};
      • svgicons
        • jquery.svgicons.js
          /*
           * SVG Icon Loader 2.0
           *
           * jQuery Plugin for loading SVG icons from a single file
           *
           * Copyright (c) 2009 Alexis Deveria
           * http://a.deveria.com
           *
           * MIT License
          
          How to use:
          
          1. Create the SVG master file that includes all icons:
          
          The master SVG icon-containing file is an SVG file that contains 
          <g> elements. Each <g> element should contain the markup of an SVG
          icon. The <g> element has an ID that should 
          correspond with the ID of the HTML element used on the page that should contain 
          or optionally be replaced by the icon. Additionally, one empty element should be
          added at the end with id "svg_eof".
          
          2. Optionally create fallback raster images for each SVG icon.
          
          3. Include the jQuery and the SVG Icon Loader scripts on your page.
          
          4. Run $.svgIcons() when the document is ready:
          
          $.svgIcons( file [string], options [object literal]);
          
          File is the location of a local SVG or SVGz file.
          
          All options are optional and can include:
          
          - 'w (number)': The icon widths
          
          - 'h (number)': The icon heights
          
          - 'fallback (object literal)': List of raster images with each
          	key being the SVG icon ID to replace, and the value the image file name.
          	
          - 'fallback_path (string)': The path to use for all images
          	listed under "fallback"
          	
          - 'replace (boolean)': If set to true, HTML elements will be replaced by,
          	rather than include the SVG icon.
          
          - 'placement (object literal)': List with selectors for keys and SVG icon ids
          	as values. This provides a custom method of adding icons.
          
          - 'resize (object literal)': List with selectors for keys and numbers
          	as values. This allows an easy way to resize specific icons.
          	
          - 'callback (function)': A function to call when all icons have been loaded. 
          	Includes an object literal as its argument with as keys all icon IDs and the 
          	icon as a jQuery object as its value.
          
          - 'id_match (boolean)': Automatically attempt to match SVG icon ids with
          	corresponding HTML id (default: true)
          	
          - 'no_img (boolean)': Prevent attempting to convert the icon into an <img>
          	element (may be faster, help for browser consistency)
          
          - 'svgz (boolean)': Indicate that the file is an SVGZ file, and thus not to
          	parse as XML. SVGZ files add compression benefits, but getting data from
          	them fails in Firefox 2 and older.
          
          5. To access an icon at a later point without using the callback, use this:
          	$.getSvgIcon(id (string));
          
          This will return the icon (as jQuery object) with a given ID.
          	
          6. To resize icons at a later point without using the callback, use this:
          	$.resizeSvgIcons(resizeOptions) (use the same way as the "resize" parameter)
          
          
          Example usage #1:
          
          $(function() {
          	$.svgIcons('my_icon_set.svg'); // The SVG file that contains all icons
          	// No options have been set, so all icons will automatically be inserted 
          	// into HTML elements that match the same IDs. 
          });
          
          Example usage #2:
          
          $(function() {
          	$.svgIcons('my_icon_set.svg', { // The SVG file that contains all icons
          		callback: function(icons) { // Custom callback function that sets click
          									// events for each icon
          			$.each(icons, function(id, icon) {
          				icon.click(function() {
          					alert('You clicked on the icon with id ' + id);
          				});
          			});
          		}
          	}); //The SVG file that contains all icons
          });
          
          Example usage #3:
          
          $(function() {
          	$.svgIcons('my_icon_set.svgz', { // The SVGZ file that contains all icons
          		w: 32,	// All icons will be 32px wide
          		h: 32,  // All icons will be 32px high
          		fallback_path: 'icons/',  // All fallback files can be found here
          		fallback: {
          			'#open_icon': 'open.png',  // The "open.png" will be appended to the
          										// HTML element with ID "open_icon"
          			'#close_icon': 'close.png',
          			'#save_icon': 'save.png'
          		},
          		placement: {'.open_icon','open'}, // The "open" icon will be added
          										// to all elements with class "open_icon"
          		resize: function() {
          			'#save_icon .svg_icon': 64  // The "save" icon will be resized to 64 x 64px
          		},
          		
          		callback: function(icons) { // Sets background color for "close" icon 
          			icons['close'].css('background','red');
          		},
          		
          		svgz: true // Indicates that an SVGZ file is being used
          		
          	})
          });
          
          */
          
          
          (function($) {
          	var svg_icons = {}, fixIDs;
          
          	$.svgIcons = function(file, opts) {
          		var svgns = "http://www.w3.org/2000/svg",
          			xlinkns = "http://www.w3.org/1999/xlink",
          			icon_w = opts.w?opts.w : 24,
          			icon_h = opts.h?opts.h : 24,
          			elems, svgdoc, testImg,
          			icons_made = false, data_loaded = false, load_attempts = 0,
          			ua = navigator.userAgent, isOpera = !!window.opera, isSafari = (ua.indexOf('Safari/') > -1 && ua.indexOf('Chrome/')==-1),
          			data_pre = 'data:image/svg+xml;charset=utf-8;base64,';
          			
          			if(opts.svgz) {
          				var data_el = $('<object data="' + file + '" type=image/svg+xml>').appendTo('body').hide();
          				try {
          					svgdoc = data_el[0].contentDocument;
          					data_el.load(getIcons);
          					getIcons(0, true); // Opera will not run "load" event if file is already cached
          				} catch(err1) {
          					useFallback();
          				}
          			} else {
          				var parser = new DOMParser();
          				$.ajax({
          					url: file,
          					dataType: 'string',
          					success: function(data) {
          						if(!data) {
          							$(useFallback);
          							return;
          						}
          						svgdoc = parser.parseFromString(data, "text/xml");
          						$(function() {
          							getIcons('ajax');
          						});
          					},
          					error: function(err) {
          						// TODO: Fix Opera widget icon bug
          						if(window.opera) {
          							$(function() {
          								useFallback();
          							});
          						} else {
          							if(err.responseText) {
          								svgdoc = parser.parseFromString(err.responseText, "text/xml");
          
          								if(!svgdoc.childNodes.length) {
          									$(useFallback);									
          								}
          								$(function() {
          									getIcons('ajax');
          								});							
          							} else {
          								$(useFallback);
          							}
          						}
          					}
          				});
          			}
          			
          		function getIcons(evt, no_wait) {
          			if(evt !== 'ajax') {
          				if(data_loaded) return;
          				// Webkit sometimes says svgdoc is undefined, other times
          				// it fails to load all nodes. Thus we must make sure the "eof" 
          				// element is loaded.
          				svgdoc = data_el[0].contentDocument; // Needed again for Webkit
          				var isReady = (svgdoc && svgdoc.getElementById('svg_eof'));
          				if(!isReady && !(no_wait && isReady)) {
          					load_attempts++;
          					if(load_attempts < 50) {
          						setTimeout(getIcons, 20);
          					} else {
          						useFallback();
          						data_loaded = true;
          					}
          					return;
          				}
          				data_loaded = true;
          			}
          			
          			elems = $(svgdoc.firstChild).children(); //.getElementsByTagName('foreignContent');
          			
          			if(!opts.no_img) {
          				var testSrc = data_pre + 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNzUiIGhlaWdodD0iMjc1Ij48L3N2Zz4%3D';
          				
          				testImg = $(new Image()).attr({
          					src: testSrc,
          					width: 0,
          					height: 0
          				}).appendTo('body')
          				.load(function () {
          					// Safari 4 crashes, Opera and Chrome don't
          					makeIcons(true);
          				}).error(function () {
          					makeIcons();
          				});
          			} else {
          				setTimeout(function() {
          					if(!icons_made) makeIcons();
          				},500);
          			}
          		}
          		
          		var setIcon = function(target, icon, id, setID) {
          			if(isOpera) icon.css('visibility','hidden');
          			if(opts.replace) {
          				if(setID) icon.attr('id',id);
          				var cl = target.attr('class');
          				if(cl) icon.attr('class','svg_icon '+cl);
          				target.replaceWith(icon);
          			} else {
          				
          				target.append(icon);
          			}
          			if(isOpera) {
          				setTimeout(function() {
          					icon.removeAttr('style');
          				},1);
          			}
          		};
          		
          		var addIcon = function(icon, id) {
          			if(opts.id_match === undefined || opts.id_match !== false) {
          				setIcon(holder, icon, id, true);
          			}
          			svg_icons[id] = icon;
          		};
          		
          		function makeIcons(toImage, fallback) {
          			if(icons_made) return;
          			if(opts.no_img) toImage = false;
          			var holder, temp_holder;
          			
          			if(toImage) {
          				temp_holder = $(document.createElement('div'));
          				temp_holder.hide().appendTo('body');
          			} 
          			if(fallback) {
          				var path = opts.fallback_path?opts.fallback_path:'';
          				$.each(fallback, function(id, imgsrc) {
          					holder = $('#' + id);
          					var icon = $(new Image())
          						.attr({
          							'class':'svg_icon',
          							src: path + imgsrc,
          							'width': icon_w,
          							'height': icon_h,
          							'alt': 'icon'
          						});
          					
          					addIcon(icon, id);
          				});
          			} else {
          				var len = elems.length;
          				for(var i = 0; i < len; i++) {
          					var elem = elems[i];
          					var id = elem.id;
          					if(id === 'svg_eof') break;
          					holder = $('#' + id);
          					var svg = elem.getElementsByTagNameNS(svgns, 'svg')[0];
          					var svgroot = document.createElementNS(svgns, "svg");
          					svgroot.setAttributeNS(svgns, 'viewBox', [0,0,icon_w,icon_h].join(' '));
          					
          					// Make flexible by converting width/height to viewBox
          					var w = svg.getAttribute('width');
          					var h = svg.getAttribute('height');
          					svg.removeAttribute('width');
          					svg.removeAttribute('height');
          					
          					var vb = svg.getAttribute('viewBox');
          					if(!vb) {
          						svg.setAttribute('viewBox', [0,0,w,h].join(' '));
          					}
          					
          					// Not using jQuery to be a bit faster
          					svgroot.setAttribute('xmlns', svgns);
          					svgroot.setAttribute('width', icon_w);
          					svgroot.setAttribute('height', icon_h);
          					svgroot.setAttribute("xmlns:xlink", xlinkns);
          					svgroot.setAttribute("class", 'svg_icon');
          
          					// Without cloning, Firefox will make another GET request.
          					// With cloning, causes issue in Opera/Win/Non-EN
          					if(!isOpera) svg = svg.cloneNode(true);
          					
          					svgroot.appendChild(svg);
          					var icon;
          					if(toImage) {
          						// Without cloning, Safari will crash
          						// With cloning, causes issue in Opera/Win/Non-EN
          						var svgcontent = isOpera?svgroot:svgroot.cloneNode(true);
          						temp_holder.empty().append(svgroot);
          						var str = data_pre + encode64(unescape(encodeURIComponent(new XMLSerializer().serializeToString(svgroot))));
          						icon = $(new Image())
          							.attr({'class':'svg_icon', src:str});
          					} else {
          						icon = fixIDs($(svgroot), i);
          					}
          					addIcon(icon, id);
          				}
          
          			}
          			
          			if(opts.placement) {
          				$.each(opts.placement, function(sel, id) {
          					if(!svg_icons[id]) return;
          					$(sel).each(function(i) {
          						var copy = svg_icons[id].clone();
          						if(i > 0 && !toImage) copy = fixIDs(copy, i, true);
          						setIcon($(this), copy, id);
          					});
          				});
          			}
          			if(!fallback) {
          				if(toImage) temp_holder.remove();
          				if(data_el) data_el.remove();
          				if(testImg) testImg.remove();
          			}
          			if(opts.resize) $.resizeSvgIcons(opts.resize);
          			icons_made = true;
          
          			if(opts.callback) opts.callback(svg_icons);
          		}
          		
          		fixIDs = function(svg_el, svg_num, force) {
          			var defs = svg_el.find('defs');
          			if(!defs.length) return svg_el;
          			var id_elems;
          			if(isOpera) {
          				id_elems = defs.find('*').filter(function() {
          					return !!this.id;
          				});
          			} else {
          				id_elems = defs.find('[id]');
          			}
          			
          			var all_elems = svg_el[0].getElementsByTagName('*'), len = all_elems.length;
          			
          			id_elems.each(function(i) {
          				var id = this.id;
          				var no_dupes = ($(svgdoc).find('#' + id).length <= 1);
          				if(isOpera) no_dupes = false; // Opera didn't clone svg_el, so not reliable
          				// if(!force && no_dupes) return;
          				var new_id = 'x' + id + svg_num + i;
          				this.id = new_id;
          				
          				var old_val = 'url(#' + id + ')';
          				var new_val = 'url(#' + new_id + ')';
          				
          				// Selector method, possibly faster but fails in Opera / jQuery 1.4.3
          //				svg_el.find('[fill="url(#' + id + ')"]').each(function() {
          //					this.setAttribute('fill', 'url(#' + new_id + ')');
          //				}).end().find('[stroke="url(#' + id + ')"]').each(function() {
          //					this.setAttribute('stroke', 'url(#' + new_id + ')');
          //				}).end().find('use').each(function() {
          //					if(this.getAttribute('xlink:href') == '#' + id) {
          //						this.setAttributeNS(xlinkns,'href','#' + new_id);
          //					}
          //				}).end().find('[filter="url(#' + id + ')"]').each(function() {
          //					this.setAttribute('filter', 'url(#' + new_id + ')');
          //				});
          
          				for(i = 0; i < len; i++) {
          					var elem = all_elems[i];
          					if(elem.getAttribute('fill') === old_val) {
          						elem.setAttribute('fill', new_val);
          					}
          					if(elem.getAttribute('stroke') === old_val) {
          						elem.setAttribute('stroke', new_val);
          					}
          					if(elem.getAttribute('filter') === old_val) {
          						elem.setAttribute('filter', new_val);
          					}
          				}
          			});
          			return svg_el;
          		};
          		
          		function useFallback() {
          			if(file.indexOf('.svgz') != -1) {
          				var reg_file = file.replace('.svgz','.svg');
          				if(window.console) {
          					console.log('.svgz failed, trying with .svg');
          				}
          				$.svgIcons(reg_file, opts);
          			} else if(opts.fallback) {
          				makeIcons(false, opts.fallback);
          			}
          		}
          				
          		function encode64(input) {
          			// base64 strings are 4/3 larger than the original string
          			if(window.btoa) return window.btoa(input);
          			var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
          			var output = new Array( Math.floor( (input.length + 2) / 3 ) * 4 );
          			var chr1, chr2, chr3;
          			var enc1, enc2, enc3, enc4;
          			var i = 0, p = 0;
          		
          			do {
          				chr1 = input.charCodeAt(i++);
          				chr2 = input.charCodeAt(i++);
          				chr3 = input.charCodeAt(i++);
          		
          				enc1 = chr1 >> 2;
          				enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
          				enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
          				enc4 = chr3 & 63;
          		
          				if (isNaN(chr2)) {
          					enc3 = enc4 = 64;
          				} else if (isNaN(chr3)) {
          					enc4 = 64;
          				}
          		
          				output[p++] = _keyStr.charAt(enc1);
          				output[p++] = _keyStr.charAt(enc2);
          				output[p++] = _keyStr.charAt(enc3);
          				output[p++] = _keyStr.charAt(enc4);
          			} while (i < input.length);
          		
          			return output.join('');
          		}
          	};
          	
          	$.getSvgIcon = function(id, uniqueClone) { 
          		var icon = svg_icons[id];
          		if(uniqueClone && icon) {
          			icon = fixIDs(icon, 0, true).clone(true);
          		}
          		return icon; 
          	};
          	
          	$.resizeSvgIcons = function(obj) {
          		// FF2 and older don't detect .svg_icon, so we change it detect svg elems instead
          		var change_sel = !$('.svg_icon:first').length;
          		$.each(obj, function(sel, size) {
          			var arr = $.isArray(size);
          			var w = arr?size[0]:size,
          				h = arr?size[1]:size;
          			if(change_sel) {
          				sel = sel.replace(/\.svg_icon/g,'svg');
          			}
          			$(sel).each(function() {
          				this.setAttribute('width', w);
          				this.setAttribute('height', h);
          				if(window.opera && window.widget) {
          					this.parentNode.style.width = w + 'px';
          					this.parentNode.style.height = h + 'px';
          				}
          			});
          		});
          	};
          	
          })(jQuery);
      • browser-not-supported.html
        <!DOCTYPE html>
        <html>
        <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="chrome=1"/>
        <link rel="icon" type="image/png" href="images/logo.png"/>
        <link rel="stylesheet" href="svg-editor.css" type="text/css"/>
        <script src="jquery.js"></script>
        <title>Browser does not support SVG | SVG-edit</title>
        </head>
        <body>
        
        <div id="browser-not-supported">
        <img style="float:left;padding:10px;" src="images/logo.png" width="48" height="48" alt="SVG-edit logo" /><br />
        <p>Sorry, but your browser does not support SVG. Below is a list of alternate browsers and versions that support SVG and SVG-edit (from <a href="http://caniuse.com/#cats=SVG">caniuse.com</a>).</p>
        <p>Try the latest version of <a href="http://www.getfirefox.com">Firefox</a>, <a href="http://www.google.com/chrome/">Google Chrome</a>, <a href="http://www.apple.com/safari/download/">Safari</a>, <a href="http://www.opera.com/download/">Opera</a> or <a href="http://windows.microsoft.com/ie9">Internet Explorer</a>.</p>
        <p>If you are unable to install one of these and must use an old version of Internet Explorer, you can install the <a href="http://code.google.com/chrome/chromeframe/">Google Chrome Frame plugin</a>.</p>
        
        </div>
        
        <script>
        /*globals $*/
        var viewportHeight = window.innerHeight || ($(window).height() - 140);
        var iframe = document.createElement('iframe');
        iframe.style.width = '100%';
        iframe.style.height = viewportHeight + 'px';
        iframe.src = 'http://caniuse.com/#cats=SVG';
        document.body.appendChild(iframe);
        </script>
        </body>
        </html>
        
      • browser.js
        /*globals $, svgedit*/
        /*jslint vars: true, eqeq: true*/
        /**
         * Package: svgedit.browser
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Jeff Schiller
         * Copyright(c) 2010 Alexis Deveria
         */
        
        // Dependencies:
        // 1) jQuery (for $.alert())
        
        (function() {'use strict';
        
        if (!svgedit.browser) {
        	svgedit.browser = {};
        }
        
        // alias
        var NS = svgedit.NS;
        
        var supportsSvg_ = (function() {
        	return !!document.createElementNS && !!document.createElementNS(NS.SVG, 'svg').createSVGRect;
        }());
        
        svgedit.browser.supportsSvg = function() { return supportsSvg_; };
        if(!svgedit.browser.supportsSvg()) {
        	window.location = 'browser-not-supported.html';
        	return;
        }
        
        var userAgent = navigator.userAgent;
        var svg = document.createElementNS(NS.SVG, 'svg');
        
        // Note: Browser sniffing should only be used if no other detection method is possible
        var isOpera_ = !!window.opera;
        var isWebkit_ = userAgent.indexOf('AppleWebKit') >= 0;
        var isGecko_ = userAgent.indexOf('Gecko/') >= 0;
        var isIE_ = userAgent.indexOf('MSIE') >= 0;
        var isChrome_ = userAgent.indexOf('Chrome/') >= 0;
        var isWindows_ = userAgent.indexOf('Windows') >= 0;
        var isMac_ = userAgent.indexOf('Macintosh') >= 0;
        var isTouch_ = 'ontouchstart' in window;
        
        var supportsSelectors_ = (function() {
        	return !!svg.querySelector;
        }());
        
        var supportsXpath_ = (function() {
        	return !!document.evaluate;
        }());
        
        // segList functions (for FF1.5 and 2.0)
        var supportsPathReplaceItem_ = (function() {
        	var path = document.createElementNS(NS.SVG, 'path');
        	path.setAttribute('d', 'M0,0 10,10');
        	var seglist = path.pathSegList;
        	var seg = path.createSVGPathSegLinetoAbs(5,5);
        	try {
        		seglist.replaceItem(seg, 0);
        		return true;
        	} catch(err) {}
        	return false;
        }());
        
        var supportsPathInsertItemBefore_ = (function() {
        	var path = document.createElementNS(NS.SVG, 'path');
        	path.setAttribute('d', 'M0,0 10,10');
        	var seglist = path.pathSegList;
        	var seg = path.createSVGPathSegLinetoAbs(5,5);
        	try {
        		seglist.insertItemBefore(seg, 0);
        		return true;
        	} catch(err) {}
        	return false;
        }());
        
        // text character positioning (for IE9)
        var supportsGoodTextCharPos_ = (function() {
        	var svgroot = document.createElementNS(NS.SVG, 'svg');
        	var svgcontent = document.createElementNS(NS.SVG, 'svg');
        	document.documentElement.appendChild(svgroot);
        	svgcontent.setAttribute('x', 5);
        	svgroot.appendChild(svgcontent);
        	var text = document.createElementNS(NS.SVG, 'text');
        	text.textContent = 'a';
        	svgcontent.appendChild(text);
        	var pos = text.getStartPositionOfChar(0).x;
        	document.documentElement.removeChild(svgroot);
        	return (pos === 0);
        }());
        
        var supportsPathBBox_ = (function() {
        	var svgcontent = document.createElementNS(NS.SVG, 'svg');
        	document.documentElement.appendChild(svgcontent);
        	var path = document.createElementNS(NS.SVG, 'path');
        	path.setAttribute('d', 'M0,0 C0,0 10,10 10,0');
        	svgcontent.appendChild(path);
        	var bbox = path.getBBox();
        	document.documentElement.removeChild(svgcontent);
        	return (bbox.height > 4 && bbox.height < 5);
        }());
        
        // Support for correct bbox sizing on groups with horizontal/vertical lines
        var supportsHVLineContainerBBox_ = (function() {
        	var svgcontent = document.createElementNS(NS.SVG, 'svg');
        	document.documentElement.appendChild(svgcontent);
        	var path = document.createElementNS(NS.SVG, 'path');
        	path.setAttribute('d', 'M0,0 10,0');
        	var path2 = document.createElementNS(NS.SVG, 'path');
        	path2.setAttribute('d', 'M5,0 15,0');
        	var g = document.createElementNS(NS.SVG, 'g');
        	g.appendChild(path);
        	g.appendChild(path2);
        	svgcontent.appendChild(g);
        	var bbox = g.getBBox();
        	document.documentElement.removeChild(svgcontent);
        	// Webkit gives 0, FF gives 10, Opera (correctly) gives 15
        	return (bbox.width == 15);
        }());
        
        var supportsEditableText_ = (function() {
        	// TODO: Find better way to check support for this
        	return isOpera_;
        }());
        
        var supportsGoodDecimals_ = (function() {
        	// Correct decimals on clone attributes (Opera < 10.5/win/non-en)
        	var rect = document.createElementNS(NS.SVG, 'rect');
        	rect.setAttribute('x', 0.1);
        	var crect = rect.cloneNode(false);
        	var retValue = (crect.getAttribute('x').indexOf(',') == -1);
        	if(!retValue) {
        		$.alert('NOTE: This version of Opera is known to contain bugs in SVG-edit.\n'+
        		'Please upgrade to the <a href="http://opera.com">latest version</a> in which the problems have been fixed.');
        	}
        	return retValue;
        }());
        
        var supportsNonScalingStroke_ = (function() {
        	var rect = document.createElementNS(NS.SVG, 'rect');
        	rect.setAttribute('style', 'vector-effect:non-scaling-stroke');
        	return rect.style.vectorEffect === 'non-scaling-stroke';
        }());
        
        var supportsNativeSVGTransformLists_ = (function() {
        	var rect = document.createElementNS(NS.SVG, 'rect');
        	var rxform = rect.transform.baseVal;
        	var t1 = svg.createSVGTransform();
        	rxform.appendItem(t1);
        	return rxform.getItem(0) == t1;
        }());
        
        // Public API
        
        svgedit.browser.isOpera = function() { return isOpera_; };
        svgedit.browser.isWebkit = function() { return isWebkit_; };
        svgedit.browser.isGecko = function() { return isGecko_; };
        svgedit.browser.isIE = function() { return isIE_; };
        svgedit.browser.isChrome = function() { return isChrome_; };
        svgedit.browser.isWindows = function() { return isWindows_; };
        svgedit.browser.isMac = function() { return isMac_; };
        svgedit.browser.isTouch = function() { return isTouch_; };
        
        svgedit.browser.supportsSelectors = function() { return supportsSelectors_; };
        svgedit.browser.supportsXpath = function() { return supportsXpath_; };
        
        svgedit.browser.supportsPathReplaceItem = function() { return supportsPathReplaceItem_; };
        svgedit.browser.supportsPathInsertItemBefore = function() { return supportsPathInsertItemBefore_; };
        svgedit.browser.supportsPathBBox = function() { return supportsPathBBox_; };
        svgedit.browser.supportsHVLineContainerBBox = function() { return supportsHVLineContainerBBox_; };
        svgedit.browser.supportsGoodTextCharPos = function() { return supportsGoodTextCharPos_; };
        svgedit.browser.supportsEditableText = function() { return supportsEditableText_; };
        svgedit.browser.supportsGoodDecimals = function() { return supportsGoodDecimals_; };
        svgedit.browser.supportsNonScalingStroke = function() { return supportsNonScalingStroke_; };
        svgedit.browser.supportsNativeTransformLists = function() { return supportsNativeSVGTransformLists_; };
        
        }());
        
      • config-sample.js
        // DO NOT EDIT THIS FILE!
        // THIS FILE IS JUST A SAMPLE; TO APPLY, YOU MUST
        //   CREATE A NEW FILE config.js AND ADD CONTENTS
        //   SUCH AS SHOWN BELOW INTO THAT FILE.
        
        /*globals svgEditor*/
        /*
        The config.js file is intended for the setting of configuration or
          preferences which must run early on; if this is not needed, it is
          recommended that you create an extension instead (for greater
          reusability and modularity).
        */
        
        // CONFIG AND EXTENSION SETTING
        /*
        See defaultConfig and defaultExtensions in svg-editor.js for a list
          of possible configuration settings.
        
        See svg-editor.js for documentation on using setConfig().
        */
        
        // URL OVERRIDE CONFIG
        svgEditor.setConfig({
        	/**
        	To override the ability for URLs to set URL-based SVG content,
        	    uncomment the following:
        	*/
        	// preventURLContentLoading: true,
        	/**
        	To override the ability for URLs to set other configuration (including
        	    extension config), uncomment the following:
        	*/
        	// preventAllURLConfig: true,
        	/**
        	To override the ability for URLs to set their own extensions,
        	  uncomment the following (note that if setConfig() is used in
        	  extension code, it will still be additive to extensions,
        	  however):
        	*/
        	// lockExtensions: true,
        });
        
        svgEditor.setConfig({
        	/*
        	Provide default values here which differ from that of the editor but
        		which the URL can override
        	*/
        }, {allowInitialUserOverride: true});
        
        // EXTENSION CONFIG
        svgEditor.setConfig({
        	extensions: [
        		// 'ext-overview_window.js', 'ext-markers.js', 'ext-connector.js', 'ext-eyedropper.js', 'ext-shapes.js', 'ext-imagelib.js', 'ext-grid.js', 'ext-polygon.js', 'ext-star.js', 'ext-panning.js', 'ext-storage.js'
        	]
        	// , noDefaultExtensions: false, // noDefaultExtensions can only be meaningfully used in config.js or in the URL
        });
        
        // OTHER CONFIG
        svgEditor.setConfig({	
        	// canvasName: 'default',
        	// canvas_expansion: 3,
        	// initFill: {
        		// color: 'FF0000', // solid red
        		// opacity: 1
        	// },
        	// initStroke: {
        		// width: 5,
        		// color: '000000', // solid black
        		// opacity: 1
        	// },
        	// initOpacity: 1,
        	// colorPickerCSS: null,
        	// initTool: 'select',
        	// exportWindowType: 'new', // 'same'
        	// wireframe: false,
        	// showlayers: false,
        	// no_save_warning: false,
        	// PATH CONFIGURATION
        	// imgPath: 'images/',
        	// langPath: 'locale/',
        	// extPath: 'extensions/',
        	// jGraduatePath: 'jgraduate/images/',
        	/*
        	Uncomment the following to allow at least same domain (embedded) access,
        	including file:// access.
        	Setting as `['*']` would allow any domain to access but would be unsafe to
        	data privacy and integrity.
        	*/
        	// allowedOrigins: [window.location.origin || 'null'], // May be 'null' (as a string) when used as a file:// URL
        	// DOCUMENT PROPERTIES
        	// dimensions: [640, 480],
        	// EDITOR OPTIONS
        	// gridSnapping: false,
        	// gridColor: '#000',
        	// baseUnit: 'px',
        	// snappingStep: 10,
        	// showRulers: true,
        	// EXTENSION-RELATED (GRID)
        	// showGrid: false, // Set by ext-grid.js
        	// EXTENSION-RELATED (STORAGE)
        	// noStorageOnLoad: false, // Some interaction with ext-storage.js; prevent even the loading of previously saved local storage
        	// forceStorage: false, // Some interaction with ext-storage.js; strongly discouraged from modification as it bypasses user privacy by preventing them from choosing whether to keep local storage or not
        	// emptyStorageOnDecline: true, // Used by ext-storage.js; empty any prior storage if the user declines to store
        });
        
        // PREF CHANGES
        /**
        setConfig() can also be used to set preferences in addition to
          configuration (see defaultPrefs in svg-editor.js for a list of
          possible settings), but at least if you are using ext-storage.js
          to store preferences, it will probably be better to let your
          users control these.
        As with configuration, one may use allowInitialUserOverride, but
          in the case of preferences, any previously stored preferences
          will also thereby be enabled to override this setting (and at a
          higher priority than any URL preference setting overrides).
          Failing to use allowInitialUserOverride will ensure preferences
          are hard-coded here regardless of URL or prior user storage setting.
        */
        svgEditor.setConfig(
        	{
        		// lang: '', // Set dynamically within locale.js if not previously set
        		// iconsize: '', // Will default to 's' if the window height is smaller than the minimum height and 'm' otherwise
        		/**
        		* When showing the preferences dialog, svg-editor.js currently relies
        		* on curPrefs instead of $.pref, so allowing an override for bkgd_color
        		* means that this value won't have priority over block auto-detection as
        		* far as determining which color shows initially in the preferences
        		* dialog (though it can be changed and saved).
        		*/
        		// bkgd_color: '#FFF',
        		// bkgd_url: '',
        		// img_save: 'embed',
        		// Only shows in UI as far as alert notices
        		// save_notice_done: false,
        		// export_notice_done: false
        	}
        );
        svgEditor.setConfig(
        	{
        		// Indicate pref settings here if you wish to allow user storage or URL settings
        		//   to be able to override your default preferences (unless other config options
        		//   have already explicitly prevented one or the other)
        	},
        	{allowInitialUserOverride: true}
        );
        
      • contextmenu.js
        /*globals $, svgEditor*/
        /*jslint vars: true, eqeq: true*/
        /**
         * Package: svgedit.contextmenu
         * 
         * Licensed under the Apache License, Version 2
         * 
         * Author: Adam Bender
         */
        // Dependencies:
        // 1) jQuery (for dom injection of context menus)
        var svgedit = svgedit || {};
        (function() {
        	var self = this;
        	if (!svgedit.contextmenu) {
        		svgedit.contextmenu = {};
        	}
        	self.contextMenuExtensions = {};
        	var menuItemIsValid = function(menuItem) {
        		return menuItem && menuItem.id && menuItem.label && menuItem.action && typeof menuItem.action == 'function';
        	};
        	var addContextMenuItem = function(menuItem) {
        		// menuItem: {id, label, shortcut, action}
        		if (!menuItemIsValid(menuItem)) {
        			console.error("Menu items must be defined and have at least properties: id, label, action, where action must be a function");
        			return;
        		}
        		if (menuItem.id in self.contextMenuExtensions) {
        			console.error('Cannot add extension "' + menuItem.id + '", an extension by that name already exists"');
        			return;
        		}
        		// Register menuItem action, see below for deferred menu dom injection
        		console.log("Registed contextmenu item: {id:"+ menuItem.id+", label:"+menuItem.label+"}");
        		self.contextMenuExtensions[menuItem.id] = menuItem;
        		//TODO: Need to consider how to handle custom enable/disable behavior
        	};
        	var hasCustomHandler = function(handlerKey) {
        		return self.contextMenuExtensions[handlerKey] && true;
        	};
        	var getCustomHandler = function(handlerKey) {
        		return self.contextMenuExtensions[handlerKey].action;
        	};
        	var injectExtendedContextMenuItemIntoDom = function(menuItem) {
        		if (Object.keys(self.contextMenuExtensions).length === 0) {
        			// all menuItems appear at the bottom of the menu in their own container.
        			// if this is the first extension menu we need to add the separator.
        			$("#cmenu_canvas").append("<li class='separator'>");
        		}
        		var shortcut = menuItem.shortcut || "";
        		$("#cmenu_canvas").append("<li class='disabled'><a href='#" + menuItem.id + "'>"
        									+ menuItem.label + "<span class='shortcut'>"
        									+ shortcut + "</span></a></li>");
        	};
        	// Defer injection to wait out initial menu processing. This probably goes away once all context
        	// menu behavior is brought here.
        	svgEditor.ready(function() {
        		var menuItem;
        		for (menuItem in contextMenuExtensions) {
        			injectExtendedContextMenuItemIntoDom(contextMenuExtensions[menuItem]);
        		}
        	});
        	svgedit.contextmenu.resetCustomMenus = function(){self.contextMenuExtensions = {};};
        	svgedit.contextmenu.add = addContextMenuItem;
        	svgedit.contextmenu.hasCustomHandler = hasCustomHandler;
        	svgedit.contextmenu.getCustomHandler = getCustomHandler;
        }());
        
      • coords.js
        /*globals $, svgroot */
        /*jslint vars: true, eqeq: true, forin: true*/
        /**
         * Coords.
         *
         * Licensed under the MIT License
         *
         */
        
        // Dependencies:
        // 1) jquery.js
        // 2) math.js
        // 3) browser.js
        // 4) svgutils.js
        // 5) units.js
        // 6) svgtransformlist.js
        
        var svgedit = svgedit || {};
        
        (function() {'use strict';
        
        if (!svgedit.coords) {
          svgedit.coords = {};
        }
        
        // this is how we map paths to our preferred relative segment types
        var pathMap = [0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a', 
            'H', 'h', 'V', 'v', 'S', 's', 'T', 't'];
        
        /**
         * @typedef editorContext
         * @type {?object}
         * @property {function} getGridSnapping
         * @property {function} getDrawing
        */
        var editorContext_ = null;
        
        /**
        * @param {editorContext} editorContext
        */
        svgedit.coords.init = function(editorContext) {
          editorContext_ = editorContext;
        };
        
        /**
         * Applies coordinate changes to an element based on the given matrix
         * @param {Element} selected - DOM element to be changed
         * @param {object} changes - Object with changes to be remapped
         * @param {SVGMatrix} m - Matrix object to use for remapping coordinates
        */
        svgedit.coords.remapElement = function(selected, changes, m) {
          var i, type,
            remap = function(x, y) { return svgedit.math.transformPoint(x, y, m); },
            scalew = function(w) { return m.a * w; },
            scaleh = function(h) { return m.d * h; },
            doSnapping = editorContext_.getGridSnapping() && selected.parentNode.parentNode.localName === 'svg',
            finishUp = function() {
              var o;
              if (doSnapping) {
                for (o in changes) {
                  changes[o] = svgedit.utilities.snapToGrid(changes[o]);
                }
              }
              svgedit.utilities.assignAttributes(selected, changes, 1000, true);
            },
            box = svgedit.utilities.getBBox(selected);
        
          for (i = 0; i < 2; i++) {
            type = i === 0 ? 'fill' : 'stroke';
            var attrVal = selected.getAttribute(type);
            if (attrVal && attrVal.indexOf('url(') === 0) {
              if (m.a < 0 || m.d < 0) {
                var grad = svgedit.utilities.getRefElem(attrVal);
                var newgrad = grad.cloneNode(true);
                if (m.a < 0) {
                  // flip x
                  var x1 = newgrad.getAttribute('x1');
                  var x2 = newgrad.getAttribute('x2');
                  newgrad.setAttribute('x1', -(x1 - 1));
                  newgrad.setAttribute('x2', -(x2 - 1));
                } 
        
                if (m.d < 0) {
                  // flip y
                  var y1 = newgrad.getAttribute('y1');
                  var y2 = newgrad.getAttribute('y2');
                  newgrad.setAttribute('y1', -(y1 - 1));
                  newgrad.setAttribute('y2', -(y2 - 1));
                }
                newgrad.id = editorContext_.getDrawing().getNextId();
                svgedit.utilities.findDefs().appendChild(newgrad);
                selected.setAttribute(type, 'url(#' + newgrad.id + ')');
              }
        
              // Not really working :(
        //      if (selected.tagName === 'path') {
        //        reorientGrads(selected, m);
        //      }
            }
          }
        
          var elName = selected.tagName;
          var chlist, mt;
          if (elName === 'g' || elName === 'text' || elName == 'tspan' || elName === 'use') {
            // if it was a translate, then just update x,y
            if (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 && (m.e != 0 || m.f != 0) ) {
              // [T][M] = [M][T']
              // therefore [T'] = [M_inv][T][M]
              var existing = svgedit.math.transformListToTransform(selected).matrix,
                  t_new = svgedit.math.matrixMultiply(existing.inverse(), m, existing);
              changes.x = parseFloat(changes.x) + t_new.e;
              changes.y = parseFloat(changes.y) + t_new.f;
            } else {
              // we just absorb all matrices into the element and don't do any remapping
              chlist = svgedit.transformlist.getTransformList(selected);
              mt = svgroot.createSVGTransform();
              mt.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(chlist).matrix, m));
              chlist.clear();
              chlist.appendItem(mt);
            }
          }
          var c, pt, pt1, pt2, len;
          // now we have a set of changes and an applied reduced transform list
          // we apply the changes directly to the DOM
          switch (elName) {
            case 'foreignObject':
            case 'rect':
            case 'image':
              // Allow images to be inverted (give them matrix when flipped)
              if (elName === 'image' && (m.a < 0 || m.d < 0)) {
                // Convert to matrix
                chlist = svgedit.transformlist.getTransformList(selected);
                mt = svgroot.createSVGTransform();
                mt.setMatrix(svgedit.math.matrixMultiply(svgedit.math.transformListToTransform(chlist).matrix, m));
                chlist.clear();
                chlist.appendItem(mt);
              } else {
                pt1 = remap(changes.x, changes.y);
                changes.width = scalew(changes.width);
                changes.height = scaleh(changes.height);
                changes.x = pt1.x + Math.min(0, changes.width);
                changes.y = pt1.y + Math.min(0, changes.height);
                changes.width = Math.abs(changes.width);
                changes.height = Math.abs(changes.height);
              }
              finishUp();
              break;
            case 'ellipse':
              c = remap(changes.cx, changes.cy);
              changes.cx = c.x;
              changes.cy = c.y;
              changes.rx = scalew(changes.rx);
              changes.ry = scaleh(changes.ry);
              changes.rx = Math.abs(changes.rx);
              changes.ry = Math.abs(changes.ry);
              finishUp();
              break;
            case 'circle':
              c = remap(changes.cx,changes.cy);
              changes.cx = c.x;
              changes.cy = c.y;
              // take the minimum of the new selected box's dimensions for the new circle radius
              var tbox = svgedit.math.transformBox(box.x, box.y, box.width, box.height, m);
              var w = tbox.tr.x - tbox.tl.x, h = tbox.bl.y - tbox.tl.y;
              changes.r = Math.min(w/2, h/2);
        
              if (changes.r) {changes.r = Math.abs(changes.r);}
              finishUp();
              break;
            case 'line':
              pt1 = remap(changes.x1, changes.y1);
              pt2 = remap(changes.x2, changes.y2);
              changes.x1 = pt1.x;
              changes.y1 = pt1.y;
              changes.x2 = pt2.x;
              changes.y2 = pt2.y;
              // deliberately fall through here
            case 'text':
            case 'tspan':
            case 'use':
              finishUp();
              break;
            case 'g':
              var gsvg = $(selected).data('gsvg');
              if (gsvg) {
                  svgedit.utilities.assignAttributes(gsvg, changes, 1000, true);
              }
              break;
            case 'polyline':
            case 'polygon':
              len = changes.points.length;
              for (i = 0; i < len; ++i) {
                pt = changes.points[i];
                pt = remap(pt.x, pt.y);
                changes.points[i].x = pt.x;
                changes.points[i].y = pt.y;
              }
        
              len = changes.points.length;
              var pstr = '';
              for (i = 0; i < len; ++i) {
                pt = changes.points[i];
                pstr += pt.x + ',' + pt.y + ' ';
              }
              selected.setAttribute('points', pstr);
              break;
            case 'path':
              var seg;
              var segList = selected.pathSegList;
              len = segList.numberOfItems;
              changes.d = [];
              for (i = 0; i < len; ++i) {
                  seg = segList.getItem(i);
                  changes.d[i] = {
                      type: seg.pathSegType,
                      x: seg.x,
                      y: seg.y,
                      x1: seg.x1,
                      y1: seg.y1,
                      x2: seg.x2,
                      y2: seg.y2,
                      r1: seg.r1,
                      r2: seg.r2,
                      angle: seg.angle,
                      largeArcFlag: seg.largeArcFlag,
                      sweepFlag: seg.sweepFlag
                  };
              }
        
              len = changes.d.length;
              var firstseg = changes.d[0],
                  currentpt = remap(firstseg.x, firstseg.y);
              changes.d[0].x = currentpt.x;
              changes.d[0].y = currentpt.y;
              for (i = 1; i < len; ++i) {
                seg = changes.d[i];
                type = seg.type;
                // if absolute or first segment, we want to remap x, y, x1, y1, x2, y2
                // if relative, we want to scalew, scaleh
                if (type % 2 == 0) { // absolute
                  var thisx = (seg.x != undefined) ? seg.x : currentpt.x, // for V commands
                      thisy = (seg.y != undefined) ? seg.y : currentpt.y; // for H commands
                  pt = remap(thisx,thisy);
                  pt1 = remap(seg.x1, seg.y1);
                  pt2 = remap(seg.x2, seg.y2);
                  seg.x = pt.x;
                  seg.y = pt.y;
                  seg.x1 = pt1.x;
                  seg.y1 = pt1.y;
                  seg.x2 = pt2.x;
                  seg.y2 = pt2.y;
                  seg.r1 = scalew(seg.r1);
                  seg.r2 = scaleh(seg.r2);
                }
                else { // relative
                  seg.x = scalew(seg.x);
                  seg.y = scaleh(seg.y);
                  seg.x1 = scalew(seg.x1);
                  seg.y1 = scaleh(seg.y1);
                  seg.x2 = scalew(seg.x2);
                  seg.y2 = scaleh(seg.y2);
                  seg.r1 = scalew(seg.r1);
                  seg.r2 = scaleh(seg.r2);
                }
              } // for each segment
        
              var dstr = '';
              len = changes.d.length;
              for (i = 0; i < len; ++i) {
                seg = changes.d[i];
                type = seg.type;
                dstr += pathMap[type];
                switch (type) {
                    case 13: // relative horizontal line (h)
                    case 12: // absolute horizontal line (H)
                        dstr += seg.x + ' ';
                        break;
                    case 15: // relative vertical line (v)
                    case 14: // absolute vertical line (V)
                        dstr += seg.y + ' ';
                        break;
                    case 3: // relative move (m)
                    case 5: // relative line (l)
                    case 19: // relative smooth quad (t)
                    case 2: // absolute move (M)
                    case 4: // absolute line (L)
                    case 18: // absolute smooth quad (T)
                        dstr += seg.x + ',' + seg.y + ' ';
                        break;
                    case 7: // relative cubic (c)
                    case 6: // absolute cubic (C)
                        dstr += seg.x1 + ',' + seg.y1 + ' ' + seg.x2 + ',' + seg.y2 + ' ' +
                             seg.x + ',' + seg.y + ' ';
                        break;
                    case 9: // relative quad (q) 
                    case 8: // absolute quad (Q)
                        dstr += seg.x1 + ',' + seg.y1 + ' ' + seg.x + ',' + seg.y + ' ';
                        break;
                    case 11: // relative elliptical arc (a)
                    case 10: // absolute elliptical arc (A)
                        dstr += seg.r1 + ',' + seg.r2 + ' ' + seg.angle + ' ' + (+seg.largeArcFlag) +
                            ' ' + (+seg.sweepFlag) + ' ' + seg.x + ',' + seg.y + ' ';
                        break;
                    case 17: // relative smooth cubic (s)
                    case 16: // absolute smooth cubic (S)
                        dstr += seg.x2 + ',' + seg.y2 + ' ' + seg.x + ',' + seg.y + ' ';
                        break;
                  }
              }
        
              selected.setAttribute('d', dstr);
              break;
            }
        };
        
        }());
        
      • draw.js
        /*globals $, svgedit*/
        /*jslint vars: true, eqeq: true, todo: true*/
        /**
         * Package: svgedit.draw
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2011 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) browser.js
        // 3) svgutils.js
        
        (function() {'use strict';
        
        if (!svgedit.draw) {
        	svgedit.draw = {};
        }
        // alias
        var NS = svgedit.NS;
        
        var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use'.split(',');
        
        var RandomizeModes = {
        	LET_DOCUMENT_DECIDE: 0,
        	ALWAYS_RANDOMIZE: 1,
        	NEVER_RANDOMIZE: 2
        };
        var randomize_ids = RandomizeModes.LET_DOCUMENT_DECIDE;
        
        /**
         * This class encapsulates the concept of a layer in the drawing
         * @param {String} name - Layer name
         * @param {SVGGElement} child - Layer SVG group.
         */
        svgedit.draw.Layer = function(name, group) {
        	this.name_ = name;
        	this.group_ = group;
        };
        
        /**
         * @returns {string} The layer name
         */
        svgedit.draw.Layer.prototype.getName = function() {
        	return this.name_;
        };
        
        /**
         * @returns {SVGGElement} The layer SVG group
         */
        svgedit.draw.Layer.prototype.getGroup = function() {
        	return this.group_;
        };
        
        
        /**
         * Called to ensure that drawings will or will not have randomized ids.
         * The currentDrawing will have its nonce set if it doesn't already.
         * @param {boolean} enableRandomization - flag indicating if documents should have randomized ids
         * @param {svgedit.draw.Drawing} currentDrawing
         */
        svgedit.draw.randomizeIds = function(enableRandomization, currentDrawing) {
        	randomize_ids = enableRandomization === false ?
        		RandomizeModes.NEVER_RANDOMIZE :
        		RandomizeModes.ALWAYS_RANDOMIZE;
        
        	if (randomize_ids == RandomizeModes.ALWAYS_RANDOMIZE && !currentDrawing.getNonce()) {
        		currentDrawing.setNonce(Math.floor(Math.random() * 100001));
        	} else if (randomize_ids == RandomizeModes.NEVER_RANDOMIZE && currentDrawing.getNonce()) {
        		currentDrawing.clearNonce();
        	}
        };
        
        /**
         * This class encapsulates the concept of a SVG-edit drawing
         * @param {SVGSVGElement} svgElem - The SVG DOM Element that this JS object
         *     encapsulates.  If the svgElem has a se:nonce attribute on it, then
         *     IDs will use the nonce as they are generated.
         * @param {String=svg_} [opt_idPrefix] - The ID prefix to use.
         */
        svgedit.draw.Drawing = function(svgElem, opt_idPrefix) {
        	if (!svgElem || !svgElem.tagName || !svgElem.namespaceURI ||
        		svgElem.tagName != 'svg' || svgElem.namespaceURI != NS.SVG) {
        		throw "Error: svgedit.draw.Drawing instance initialized without a <svg> element";
        	}
        
        	/**
        	 * The SVG DOM Element that represents this drawing.
        	 * @type {SVGSVGElement}
        	 */
        	this.svgElem_ = svgElem;
        	
        	/**
        	 * The latest object number used in this drawing.
        	 * @type {number}
        	 */
        	this.obj_num = 0;
        	
        	/**
        	 * The prefix to prepend to each element id in the drawing.
        	 * @type {String}
        	 */
        	this.idPrefix = opt_idPrefix || "svg_";
        	
        	/**
        	 * An array of released element ids to immediately reuse.
        	 * @type {Array.<number>}
        	 */
        	this.releasedNums = [];
        
        	/**
        	 * The z-ordered array of tuples containing layer names and <g> elements.
        	 * The first layer is the one at the bottom of the rendering.
        	 * TODO: Turn this into an Array.<Layer>
        	 * @type {Array.<Array.<String, SVGGElement>>}
        	 */
        	this.all_layers = [];
        
        	/**
        	 * The current layer being used.
        	 * TODO: Make this a {Layer}.
        	 * @type {SVGGElement}
        	 */
        	this.current_layer = null;
        
        	/**
        	 * The nonce to use to uniquely identify elements across drawings.
        	 * @type {!String}
        	 */
        	this.nonce_ = '';
        	var n = this.svgElem_.getAttributeNS(NS.SE, 'nonce');
        	// If already set in the DOM, use the nonce throughout the document
        	// else, if randomizeIds(true) has been called, create and set the nonce.
        	if (!!n && randomize_ids != RandomizeModes.NEVER_RANDOMIZE) {
        		this.nonce_ = n;
        	} else if (randomize_ids == RandomizeModes.ALWAYS_RANDOMIZE) {
        		this.setNonce(Math.floor(Math.random() * 100001));
        	}
        };
        
        /**
         * @param {string} id Element ID to retrieve
         * @returns {Element} SVG element within the root SVGSVGElement
        */
        svgedit.draw.Drawing.prototype.getElem_ = function (id) {
        	if (this.svgElem_.querySelector) {
        		// querySelector lookup
        		return this.svgElem_.querySelector('#' + id);
        	}
        	// jQuery lookup: twice as slow as xpath in FF
        	return $(this.svgElem_).find('[id=' + id + ']')[0];
        };
        
        /**
         * @returns {SVGSVGElement}
         */
        svgedit.draw.Drawing.prototype.getSvgElem = function () {
        	return this.svgElem_;
        };
        
        /**
         * @returns {!string|number} The previously set nonce
         */
        svgedit.draw.Drawing.prototype.getNonce = function() {
        	return this.nonce_;
        };
        
        /**
         * @param {!string|number} n The nonce to set
         */
        svgedit.draw.Drawing.prototype.setNonce = function(n) {
        	this.svgElem_.setAttributeNS(NS.XMLNS, 'xmlns:se', NS.SE);
        	this.svgElem_.setAttributeNS(NS.SE, 'se:nonce', n);
        	this.nonce_ = n;
        };
        
        /**
         * Clears any previously set nonce
         */
        svgedit.draw.Drawing.prototype.clearNonce = function () {
        	// We deliberately leave any se:nonce attributes alone,
        	// we just don't use it to randomize ids.
        	this.nonce_ = '';
        };
        
        /**
         * Returns the latest object id as a string.
         * @return {String} The latest object Id.
         */
        svgedit.draw.Drawing.prototype.getId = function () {
        	return this.nonce_ ?
        		this.idPrefix + this.nonce_ + '_' + this.obj_num :
        		this.idPrefix + this.obj_num;
        };
        
        /**
         * Returns the next object Id as a string.
         * @return {String} The next object Id to use.
         */
        svgedit.draw.Drawing.prototype.getNextId = function () {
        	var oldObjNum = this.obj_num;
        	var restoreOldObjNum = false;
        
        	// If there are any released numbers in the release stack, 
        	// use the last one instead of the next obj_num.
        	// We need to temporarily use obj_num as that is what getId() depends on.
        	if (this.releasedNums.length > 0) {
        		this.obj_num = this.releasedNums.pop();
        		restoreOldObjNum = true;
        	} else {
        		// If we are not using a released id, then increment the obj_num.
        		this.obj_num++;
        	}
        
        	// Ensure the ID does not exist.
        	var id = this.getId();
        	while (this.getElem_(id)) {
        		if (restoreOldObjNum) {
        			this.obj_num = oldObjNum;
        			restoreOldObjNum = false;
        		}
        		this.obj_num++;
        		id = this.getId();
        	}
        	// Restore the old object number if required.
        	if (restoreOldObjNum) {
        		this.obj_num = oldObjNum;
        	}
        	return id;
        };
        
        /**
         * Releases the object Id, letting it be used as the next id in getNextId().
         * This method DOES NOT remove any elements from the DOM, it is expected
         * that client code will do this.
         * @param {string} id - The id to release.
         * @returns {boolean} True if the id was valid to be released, false otherwise.
        */
        svgedit.draw.Drawing.prototype.releaseId = function (id) {
        	// confirm if this is a valid id for this Document, else return false
        	var front = this.idPrefix + (this.nonce_ ? this.nonce_ + '_' : '');
        	if (typeof id !== 'string' || id.indexOf(front) !== 0) {
        		return false;
        	}
        	// extract the obj_num of this id
        	var num = parseInt(id.substr(front.length), 10);
        
        	// if we didn't get a positive number or we already released this number
        	// then return false.
        	if (typeof num !== 'number' || num <= 0 || this.releasedNums.indexOf(num) != -1) {
        		return false;
        	}
        	
        	// push the released number into the released queue
        	this.releasedNums.push(num);
        
        	return true;
        };
        
        /**
         * Returns the number of layers in the current drawing.
         * @returns {integer} The number of layers in the current drawing.
        */
        svgedit.draw.Drawing.prototype.getNumLayers = function() {
        	return this.all_layers.length;
        };
        
        /**
         * Check if layer with given name already exists
         * @param {string} name - The layer name to check
        */
        svgedit.draw.Drawing.prototype.hasLayer = function (name) {
        	var i;
        	for (i = 0; i < this.getNumLayers(); i++) {
        		if(this.all_layers[i][0] == name) {return true;}
        	}
        	return false;
        };
        
        
        /**
         * Returns the name of the ith layer. If the index is out of range, an empty string is returned.
         * @param {integer} i - The zero-based index of the layer you are querying.
         * @returns {string} The name of the ith layer (or the empty string if none found)
        */
        svgedit.draw.Drawing.prototype.getLayerName = function (i) {
        	if (i >= 0 && i < this.getNumLayers()) {
        		return this.all_layers[i][0];
        	}
        	return '';
        };
        
        /**
         * @returns {SVGGElement} The SVGGElement representing the current layer.
         */
        svgedit.draw.Drawing.prototype.getCurrentLayer = function() {
        	return this.current_layer;
        };
        
        /**
         * Returns the name of the currently selected layer. If an error occurs, an empty string 
         * is returned.
         * @returns The name of the currently active layer (or the empty string if none found).
        */
        svgedit.draw.Drawing.prototype.getCurrentLayerName = function () {
        	var i;
        	for (i = 0; i < this.getNumLayers(); ++i) {
        		if (this.all_layers[i][1] == this.current_layer) {
        			return this.getLayerName(i);
        		}
        	}
        	return '';
        };
        
        /**
         * Sets the current layer. If the name is not a valid layer name, then this
         * function returns false. Otherwise it returns true. This is not an
         * undo-able action.
         * @param {string} name - The name of the layer you want to switch to.
         * @returns {boolean} true if the current layer was switched, otherwise false
         */
        svgedit.draw.Drawing.prototype.setCurrentLayer = function(name) {
        	var i;
        	for (i = 0; i < this.getNumLayers(); ++i) {
        		if (name == this.getLayerName(i)) {
        			if (this.current_layer != this.all_layers[i][1]) {
        				this.current_layer.setAttribute("style", "pointer-events:none");
        				this.current_layer = this.all_layers[i][1];
        				this.current_layer.setAttribute("style", "pointer-events:all");
        			}
        			return true;
        		}
        	}
        	return false;
        };
        
        
        /**
         * Deletes the current layer from the drawing and then clears the selection.
         * This function then calls the 'changed' handler.  This is an undoable action.
         * @returns {SVGGElement} The SVGGElement of the layer removed or null.
         */
        svgedit.draw.Drawing.prototype.deleteCurrentLayer = function() {
        	if (this.current_layer && this.getNumLayers() > 1) {
        		// actually delete from the DOM and return it
        		var parent = this.current_layer.parentNode;
        		var nextSibling = this.current_layer.nextSibling;
        		var oldLayerGroup = parent.removeChild(this.current_layer);
        		this.identifyLayers();
        		return oldLayerGroup;
        	}
        	return null;
        };
        
        /**
         * Updates layer system and sets the current layer to the
         * top-most layer (last <g> child of this drawing).
        */
        svgedit.draw.Drawing.prototype.identifyLayers = function() {
        	this.all_layers = [];
        	var numchildren = this.svgElem_.childNodes.length;
        	// loop through all children of SVG element
        	var orphans = [], layernames = [];
        	var a_layer = null;
        	var childgroups = false;
        	var i;
        	for (i = 0; i < numchildren; ++i) {
        		var child = this.svgElem_.childNodes.item(i);
        		// for each g, find its layer name
        		if (child && child.nodeType == 1) {
        			if (child.tagName == "g") {
        				childgroups = true;
        				var name = $("title", child).text();
        
        				// Hack for Opera 10.60
        				if(!name && svgedit.browser.isOpera() && child.querySelectorAll) {
        					name = $(child.querySelectorAll('title')).text();
        				}
        
        				// store layer and name in global variable
        				if (name) {
        					layernames.push(name);
        					this.all_layers.push( [name, child] );
        					a_layer = child;
        					svgedit.utilities.walkTree(child, function(e){e.setAttribute("style", "pointer-events:inherit");});
        					a_layer.setAttribute("style", "pointer-events:none");
        				}
        				// if group did not have a name, it is an orphan
        				else {
        					orphans.push(child);
        				}
        			}
        			// if child has is "visible" (i.e. not a <title> or <defs> element), then it is an orphan
        			else if(~visElems.indexOf(child.nodeName)) {
        				var bb = svgedit.utilities.getBBox(child);
        				orphans.push(child);
        			}
        		}
        	}
        	
        	// create a new layer and add all the orphans to it
        	var svgdoc = this.svgElem_.ownerDocument;
        	if (orphans.length > 0 || !childgroups) {
        		i = 1;
        		// TODO(codedread): What about internationalization of "Layer"?
        		while (layernames.indexOf(("Layer " + i)) >= 0) { i++; }
        		var newname = "Layer " + i;
        		a_layer = svgdoc.createElementNS(NS.SVG, "g");
        		var layer_title = svgdoc.createElementNS(NS.SVG, "title");
        		layer_title.textContent = newname;
        		a_layer.appendChild(layer_title);
        		var j;
        		for (j = 0; j < orphans.length; ++j) {
        			a_layer.appendChild(orphans[j]);
        		}
        		this.svgElem_.appendChild(a_layer);
        		this.all_layers.push( [newname, a_layer] );
        	}
        	svgedit.utilities.walkTree(a_layer, function(e){e.setAttribute("style", "pointer-events:inherit");});
        	this.current_layer = a_layer;
        	this.current_layer.setAttribute("style", "pointer-events:all");
        };
        
        /**
         * Creates a new top-level layer in the drawing with the given name and 
         * sets the current layer to it.
         * @param {string} name - The given name
         * @returns {SVGGElement} The SVGGElement of the new layer, which is
         * also the current layer of this drawing.
        */
        svgedit.draw.Drawing.prototype.createLayer = function(name) {
        	var svgdoc = this.svgElem_.ownerDocument;
        	var new_layer = svgdoc.createElementNS(NS.SVG, "g");
        	var layer_title = svgdoc.createElementNS(NS.SVG, "title");
        	layer_title.textContent = name;
        	new_layer.appendChild(layer_title);
        	this.svgElem_.appendChild(new_layer);
        	this.identifyLayers();
        	return new_layer;
        };
        
        /**
         * Returns whether the layer is visible.  If the layer name is not valid,
         * then this function returns false.
         * @param {string} layername - The name of the layer which you want to query.
         * @returns {boolean} The visibility state of the layer, or false if the layer name was invalid.
        */
        svgedit.draw.Drawing.prototype.getLayerVisibility = function(layername) {
        	// find the layer
        	var layer = null;
        	var i;
        	for (i = 0; i < this.getNumLayers(); ++i) {
        		if (this.getLayerName(i) == layername) {
        			layer = this.all_layers[i][1];
        			break;
        		}
        	}
        	if (!layer) {return false;}
        	return (layer.getAttribute('display') !== 'none');
        };
        
        /**
         * Sets the visibility of the layer. If the layer name is not valid, this
         * function returns false, otherwise it returns true. This is an
         * undo-able action.
         * @param {string} layername - The name of the layer to change the visibility
         * @param {boolean} bVisible - Whether the layer should be visible
         * @returns {?SVGGElement} The SVGGElement representing the layer if the
         *   layername was valid, otherwise null.
        */
        svgedit.draw.Drawing.prototype.setLayerVisibility = function(layername, bVisible) {
        	if (typeof bVisible !== 'boolean') {
        		return null;
        	}
        	// find the layer
        	var layer = null;
        	var i;
        	for (i = 0; i < this.getNumLayers(); ++i) {
        		if (this.getLayerName(i) == layername) {
        			layer = this.all_layers[i][1];
        			break;
        		}
        	}
        	if (!layer) {return null;}
        	
        	var oldDisplay = layer.getAttribute("display");
        	if (!oldDisplay) {oldDisplay = "inline";}
        	layer.setAttribute("display", bVisible ? "inline" : "none");
        	return layer;
        };
        
        
        /**
         * Returns the opacity of the given layer.  If the input name is not a layer, null is returned.
         * @param {string} layername - name of the layer on which to get the opacity
         * @returns {?number} The opacity value of the given layer.  This will be a value between 0.0 and 1.0, or null
         * if layername is not a valid layer
        */
        svgedit.draw.Drawing.prototype.getLayerOpacity = function(layername) {
        	var i;
        	for (i = 0; i < this.getNumLayers(); ++i) {
        		if (this.getLayerName(i) == layername) {
        			var g = this.all_layers[i][1];
        			var opacity = g.getAttribute('opacity');
        			if (!opacity) {
        				opacity = '1.0';
        			}
        			return parseFloat(opacity);
        		}
        	}
        	return null;
        };
        
        /**
         * Sets the opacity of the given layer.  If the input name is not a layer,
         * nothing happens. If opacity is not a value between 0.0 and 1.0, then
         * nothing happens.
         * @param {string} layername - Name of the layer on which to set the opacity
         * @param {number} opacity - A float value in the range 0.0-1.0
        */
        svgedit.draw.Drawing.prototype.setLayerOpacity = function(layername, opacity) {
        	if (typeof opacity !== 'number' || opacity < 0.0 || opacity > 1.0) {
        		return;
        	}
        	var i;
        	for (i = 0; i < this.getNumLayers(); ++i) {
        		if (this.getLayerName(i) == layername) {
        			var g = this.all_layers[i][1];
        			g.setAttribute("opacity", opacity);
        			break;
        		}
        	}
        };
        
        }());
        
      • embedapi-dom.js
        /*globals $, EmbeddedSVGEdit*/
        /*jslint vars: true */
        var initEmbed;
        
        // Todo: Get rid of frame.contentWindow dependencies so can be more easily adjusted to work cross-domain
        
        $(function () {'use strict';
            
            var svgCanvas = null;
            var frame;
        
            initEmbed = function () {
                var doc, mainButton;
                svgCanvas = new EmbeddedSVGEdit(frame);
                // Hide main button, as we will be controlling new, load, save, etc. from the host document
                doc = frame.contentDocument || frame.contentWindow.document;
                mainButton = doc.getElementById('main_button');
                mainButton.style.display = 'none';
            };
        
            function handleSvgData(data, error) {
                if (error) {
                    alert('error ' + error);
                } else {
                    alert('Congratulations. Your SVG string is back in the host page, do with it what you will\n\n' + data);
                }
            }
        
            function loadSvg() {
                var svgexample = '<svg width="640" height="480" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><g><title>Layer 1</title><rect stroke-width="5" stroke="#000000" fill="#FF0000" id="svg_1" height="35" width="51" y="35" x="32"/><ellipse ry="15" rx="24" stroke-width="5" stroke="#000000" fill="#0000ff" id="svg_2" cy="60" cx="66"/></g></svg>';
                svgCanvas.setSvgString(svgexample);
            }
        
            function saveSvg() {
                svgCanvas.getSvgString()(handleSvgData);
            }
            
            function exportPNG() {
                var str = frame.contentWindow.svgEditor.uiStrings.notification.loadingImage;
        
                var exportWindow = window.open(
                    'data:text/html;charset=utf-8,' + encodeURIComponent('<title>' + str + '</title><h1>' + str + '</h1>'),
                    'svg-edit-exportWindow'
                );
                svgCanvas.rasterExport('PNG', null, exportWindow.name);
            }
            
            function exportPDF() {
                var str = frame.contentWindow.svgEditor.uiStrings.notification.loadingImage;
                
        		/**
                // If you want to handle the PDF blob yourself, do as follows
        		svgCanvas.bind('exportedPDF', function (win, data) {
        			alert(data.dataurlstring);
        		});
        		svgCanvas.exportPDF(); // Accepts two args: optionalWindowName supplied back to bound exportPDF handler and optionalOutputType (defaults to dataurlstring)
                return;
                */
        		
                var exportWindow = window.open(
                    'data:text/html;charset=utf-8,' + encodeURIComponent('<title>' + str + '</title><h1>' + str + '</h1>'),
                    'svg-edit-exportWindow'
                );
        		svgCanvas.exportPDF(exportWindow.name);
            }
            
            // Add event handlers
            $('#load').click(loadSvg);
            $('#save').click(saveSvg);
            $('#exportPNG').click(exportPNG);
            $('#exportPDF').click(exportPDF);
            $('body').append(
                $('<iframe src="svg-editor.html?extensions=ext-xdomain-messaging.js' +
                    window.location.href.replace(/\?(.*)$/, '&$1') + // Append arguments to this file onto the iframe
                    '" width="900px" height="600px" id="svgedit" onload="initEmbed();"></iframe>'
                )
            );
            frame = document.getElementById('svgedit');
        });
        
      • embedapi.html
        <!DOCTYPE html>
        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <meta charset="utf-8" />
            <title>Embed API</title>
            <script src="jquery.js"></script>
            <script src="embedapi.js"></script>
            <script src="embedapi-dom.js"></script>
        </head>
        <body>
            <button id="load">Load example</button>
            <button id="save">Save data</button>
            <button id="exportPNG">Export data to PNG</button>
            <button id="exportPDF">Export data to PDF</button>
            <br/>
        </body>
        </html>
        
      • embedapi.js
        /*
        Embedded SVG-edit API
        
        General usage:
        - Have an iframe somewhere pointing to a version of svg-edit > r1000
        - Initialize the magic with:
        var svgCanvas = new EmbeddedSVGEdit(window.frames.svgedit);
        - Pass functions in this format:
        svgCanvas.setSvgString('string')
        - Or if a callback is needed:
        svgCanvas.setSvgString('string')(function(data, error){
          if (error){
        	// There was an error
          } else{
        	// Handle data
          }
        })
        
        Everything is done with the same API as the real svg-edit,
        and all documentation is unchanged.
        
        However, this file depends on the postMessage API which
        can only support JSON-serializable arguments and
        return values, so, for example, arguments whose value is
        'undefined', a function, a non-finite number, or a built-in
        object like Date(), RegExp(), etc. will most likely not behave
        as expected. In such a case one may need to host
        the SVG editor on the same domain and reference the
        JavaScript methods on the frame itself.
        
        The only other difference is
        when handling returns: the callback notation is used instead.
        
        var blah = new EmbeddedSVGEdit(window.frames.svgedit);
        blah.clearSelection('woot', 'blah', 1337, [1, 2, 3, 4, 5, 'moo'], -42, {a: 'tree',b:6, c: 9})(function(){console.log('GET DATA',arguments)})
        */
        
        (function () {'use strict';
        
        var cbid = 0;
        
        function getCallbackSetter (d) {
          return function () {
        	var t = this, // New callback
        	  args = [].slice.call(arguments),
        	  cbid = t.send(d, args, function(){});  // The callback (currently it's nothing, but will be set later)
        
        	return function(newcallback){
        	  t.callbacks[cbid] = newcallback; // Set callback
        	};
          };
        }
        
        /*
        * Having this separate from messageListener allows us to
        * avoid using JSON parsing (and its limitations) in the case
        * of same domain control
        */
        function addCallback (t, data) {
          var result = data.result || data.error,
        	cbid = data.id;
          if (t.callbacks[cbid]) {
        	if (data.result) {
        	  t.callbacks[cbid](result);
        	} else {
        	  t.callbacks[cbid](result, 'error');
        	}
          }
        }
        
        function messageListener (e) {
          // We accept and post strings as opposed to objects for the sake of IE9 support; this
          //   will most likely be changed in the future
          if (typeof e.data !== 'string') {
        	return;
          }
          var allowedOrigins = this.allowedOrigins,
        	data = e.data && JSON.parse(e.data);
          if (!data || typeof data !== 'object' || data.namespace !== 'svg-edit' ||
        	  e.source !== this.frame.contentWindow ||
        	  (allowedOrigins.indexOf('*') === -1 && allowedOrigins.indexOf(e.origin) === -1)
          ) {
        	return;
          }
          addCallback(this, data);
        }
        
        function getMessageListener (t) {
        	return function (e) {
        		messageListener.call(t, e);
        	};
        }
        
        /**
        * @param {HTMLIFrameElement} frame
        * @param {array} [allowedOrigins=[]] Array of origins from which incoming
        *	 messages will be allowed when same origin is not used; defaults to none.
        *	 If supplied, it should probably be the same as svgEditor's allowedOrigins
        */
        function EmbeddedSVGEdit (frame, allowedOrigins) {
          if (!(this instanceof EmbeddedSVGEdit)) { // Allow invocation without 'new' keyword
        	return new EmbeddedSVGEdit(frame);
          }
          this.allowedOrigins = allowedOrigins || [];
          // Initialize communication
          this.frame = frame;
          this.callbacks = {};
          // List of functions extracted with this:
          // Run in firebug on http://svg-edit.googlecode.com/svn/trunk/docs/files/svgcanvas-js.html
        
          // for (var i=0,q=[],f = document.querySelectorAll('div.CFunction h3.CTitle a'); i < f.length; i++) { q.push(f[i].name); }; q
          // var functions = ['clearSelection', 'addToSelection', 'removeFromSelection', 'open', 'save', 'getSvgString', 'setSvgString',
          // 'createLayer', 'deleteCurrentLayer', 'setCurrentLayer', 'renameCurrentLayer', 'setCurrentLayerPosition', 'setLayerVisibility',
          // 'moveSelectedToLayer', 'clear'];
        
          // Newer, well, it extracts things that aren't documented as well. All functions accessible through the normal thingy can now be accessed though the API
          // var svgCanvas = frame.contentWindow.svgCanvas;
          // var l = []; for (var i in svgCanvas){ if (typeof svgCanvas[i] == 'function') { l.push(i);} };
          // alert("['" + l.join("', '") + "']");
          // Run in svgedit itself
          var i,
        	functions = [
        		'clearSvgContentElement', 'setIdPrefix', 'getCurrentDrawing', 'addSvgElementFromJson', 'getTransformList', 'matrixMultiply', 'hasMatrixTransform', 'transformListToTransform', 'convertToNum', 'findDefs', 'getUrlFromAttr', 'getHref', 'setHref', 'getBBox', 'getRotationAngle', 'getElem', 'getRefElem', 'assignAttributes', 'cleanupElement', 'remapElement', 'recalculateDimensions', 'sanitizeSvg', 'runExtensions', 'addExtension', 'round', 'getIntersectionList', 'getStrokedBBox', 'getVisibleElements', 'getVisibleElementsAndBBoxes', 'groupSvgElem', 'getId', 'getNextId', 'call', 'bind', 'prepareSvg', 'setRotationAngle', 'recalculateAllSelectedDimensions', 'clearSelection', 'addToSelection', 'selectOnly', 'removeFromSelection', 'selectAllInCurrentLayer', 'getMouseTarget', 'removeUnusedDefElems', 'svgCanvasToString', 'svgToString', 'embedImage', 'setGoodImage', 'open', 'save', 'rasterExport', 'exportPDF', 'getSvgString', 'randomizeIds', 'uniquifyElems', 'setUseData', 'convertGradients', 'convertToGroup', 'setSvgString', 'importSvgString', 'identifyLayers', 'createLayer', 'cloneLayer', 'deleteCurrentLayer', 'setCurrentLayer', 'renameCurrentLayer', 'setCurrentLayerPosition', 'setLayerVisibility', 'moveSelectedToLayer', 'mergeLayer', 'mergeAllLayers', 'leaveContext', 'setContext', 'clear', 'linkControlPoints', 'getContentElem', 'getRootElem', 'getSelectedElems', 'getResolution', 'getZoom', 'getVersion', 'setUiStrings', 'setConfig', 'getTitle', 'setGroupTitle', 'getDocumentTitle', 'setDocumentTitle', 'getEditorNS', 'setResolution', 'getOffset', 'setBBoxZoom', 'setZoom', 'getMode', 'setMode', 'getColor', 'setColor', 'setGradient', 'setPaint', 'setStrokePaint', 'setFillPaint', 'getStrokeWidth', 'setStrokeWidth', 'setStrokeAttr', 'getStyle', 'getOpacity', 'setOpacity', 'getFillOpacity', 'getStrokeOpacity', 'setPaintOpacity', 'getPaintOpacity', 'getBlur', 'setBlurNoUndo', 'setBlurOffsets', 'setBlur', 'getBold', 'setBold', 'getItalic', 'setItalic', 'getFontFamily', 'setFontFamily', 'setFontColor', 'getFontColor', 'getFontSize', 'setFontSize', 'getText', 'setTextContent', 'setImageURL', 'setLinkURL', 'setRectRadius', 'makeHyperlink', 'removeHyperlink', 'setSegType', 'convertToPath', 'changeSelectedAttribute', 'deleteSelectedElements', 'cutSelectedElements', 'copySelectedElements', 'pasteElements', 'groupSelectedElements', 'pushGroupProperties', 'ungroupSelectedElement', 'moveToTopSelectedElement', 'moveToBottomSelectedElement', 'moveUpDownSelected', 'moveSelectedElements', 'cloneSelectedElements', 'alignSelectedElements', 'updateCanvas', 'setBackground', 'cycleElement', 'getPrivateMethods', 'zoomChanged', 'ready'
        	];
        
          // TODO: rewrite the following, it's pretty scary.
          for (i = 0; i < functions.length; i++) {
        	this[functions[i]] = getCallbackSetter(functions[i]);
          }
         
          // Older IE may need a polyfill for addEventListener, but so it would for SVG
          window.addEventListener('message', getMessageListener(this), false);
        }
        
        EmbeddedSVGEdit.prototype.send = function (name, args, callback){
          var t = this;
          cbid++;
        
          this.callbacks[cbid] = callback;
          setTimeout((function (cbid) {
        	return function () { // Delay for the callback to be set in case its synchronous
        		/*
        		* Todo: Handle non-JSON arguments and return values (undefined,
        		*   nonfinite numbers, functions, and built-in objects like Date,
        		*   RegExp), etc.? Allow promises instead of callbacks? Review
        		*   SVG-Edit functions for whether JSON-able parameters can be
        		*   made compatile with all API functionality
        		*/
        		// We accept and post strings for the sake of IE9 support
        		if (window.location.origin === t.frame.contentWindow.location.origin) {
        		  // Although we do not really need this API if we are working same
        		  //  domain, it could allow us to write in a way that would work
        		  //  cross-domain as well, assuming we stick to the argument limitations
        		  //  of the current JSON-based communication API (e.g., not passing
        		  //  callbacks). We might be able to address these shortcomings; see
        		  //  the todo elsewhere in this file.
        		  var message = {id: cbid},
        			svgCanvas = t.frame.contentWindow.svgCanvas;
        		  try {
        			message.result = svgCanvas[name].apply(svgCanvas, args);
        		  }
        		  catch (err) {
        			message.error = err.message;
        		  }
        		  addCallback(t, message);
        		}
        		else { // Requires the ext-xdomain-messaging.js extension
        		  t.frame.contentWindow.postMessage(JSON.stringify({namespace: 'svgCanvas', id: cbid, name: name, args: args}), '*');
        		}
        	  };
          }(cbid)), 0);
        
          return cbid;
        };
        
        window.embedded_svg_edit = EmbeddedSVGEdit; // Export old, deprecated API
        window.EmbeddedSVGEdit = EmbeddedSVGEdit; // Follows common JS convention of CamelCase and, as enforced in JSLint, of initial caps for constructors
        
        }());
        
      • history.js
        /*globals svgedit*/
        /*jslint vars: true, eqeq: true, continue: true, forin: true*/
        /**
         * Package: svedit.history
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) svgtransformlist.js
        // 3) svgutils.js
        
        (function() {'use strict';
        
        if (!svgedit.history) {
        	svgedit.history = {};
        }
        
        // Group: Undo/Redo history management
        svgedit.history.HistoryEventTypes = {
        	BEFORE_APPLY: 'before_apply',
        	AFTER_APPLY: 'after_apply',
        	BEFORE_UNAPPLY: 'before_unapply',
        	AFTER_UNAPPLY: 'after_unapply'
        };
        
        var removedElements = {};
        
        /**
         * An interface that all command objects must implement.
         * @typedef svgedit.history.HistoryCommand
         * @type {object}
         *   void apply(svgedit.history.HistoryEventHandler);
         *   void unapply(svgedit.history.HistoryEventHandler);
         *   Element[] elements();
         *   String getText();
         *
         *   static String type();
         * }
         *
         * Interface: svgedit.history.HistoryEventHandler
         * An interface for objects that will handle history events.
         *
         * interface svgedit.history.HistoryEventHandler {
         *   void handleHistoryEvent(eventType, command);
         * }
         *
         * eventType is a string conforming to one of the HistoryEvent types.
         * command is an object fulfilling the HistoryCommand interface.
         */
        
        /**
         * @class svgedit.history.MoveElementCommand
         * @implements svgedit.history.HistoryCommand
         * History command for an element that had its DOM position changed
         * @param {Element} elem - The DOM element that was moved
         * @param {Element} oldNextSibling - The element's next sibling before it was moved
         * @param {Element} oldParent - The element's parent before it was moved
         * @param {string} [text] - An optional string visible to user related to this change
        */
        svgedit.history.MoveElementCommand = function(elem, oldNextSibling, oldParent, text) {
        	this.elem = elem;
        	this.text = text ? ("Move " + elem.tagName + " to " + text) : ("Move " + elem.tagName);
        	this.oldNextSibling = oldNextSibling;
        	this.oldParent = oldParent;
        	this.newNextSibling = elem.nextSibling;
        	this.newParent = elem.parentNode;
        };
        svgedit.history.MoveElementCommand.type = function() { return 'svgedit.history.MoveElementCommand'; };
        svgedit.history.MoveElementCommand.prototype.type = svgedit.history.MoveElementCommand.type;
        
        svgedit.history.MoveElementCommand.prototype.getText = function() {
        	return this.text;
        };
        
        /**
         * Re-positions the element
         * @param {handleHistoryEvent: function}
        */
        svgedit.history.MoveElementCommand.prototype.apply = function(handler) {
        	// TODO(codedread): Refactor this common event code into a base HistoryCommand class.
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this);
        	}
        
        	this.elem = this.newParent.insertBefore(this.elem, this.newNextSibling);
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this);
        	}
        };
        
        /**
         * Positions the element back to its original location
         * @param {handleHistoryEvent: function}
        */
        svgedit.history.MoveElementCommand.prototype.unapply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this);
        	}
        
        	this.elem = this.oldParent.insertBefore(this.elem, this.oldNextSibling);
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this);
        	}
        };
        
        // Function: svgedit.history.MoveElementCommand.elements
        // Returns array with element associated with this command
        svgedit.history.MoveElementCommand.prototype.elements = function() {
        	return [this.elem];
        };
        
        
        // Class: svgedit.history.InsertElementCommand
        // implements svgedit.history.HistoryCommand
        // History command for an element that was added to the DOM
        //
        // Parameters:
        // elem - The newly added DOM element
        // text - An optional string visible to user related to this change
        svgedit.history.InsertElementCommand = function(elem, text) {
        	this.elem = elem;
        	this.text = text || ("Create " + elem.tagName);
        	this.parent = elem.parentNode;
        	this.nextSibling = this.elem.nextSibling;
        };
        svgedit.history.InsertElementCommand.type = function() { return 'svgedit.history.InsertElementCommand'; };
        svgedit.history.InsertElementCommand.prototype.type = svgedit.history.InsertElementCommand.type;
        
        // Function: svgedit.history.InsertElementCommand.getText
        svgedit.history.InsertElementCommand.prototype.getText = function() {
        	return this.text;
        };
        
        // Function: svgedit.history.InsertElementCommand.apply
        // Re-Inserts the new element
        svgedit.history.InsertElementCommand.prototype.apply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this);
        	}
        
        	this.elem = this.parent.insertBefore(this.elem, this.nextSibling);
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this);
        	}
        };
        
        // Function: svgedit.history.InsertElementCommand.unapply
        // Removes the element
        svgedit.history.InsertElementCommand.prototype.unapply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this);
        	}
        
        	this.parent = this.elem.parentNode;
        	this.elem = this.elem.parentNode.removeChild(this.elem);
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this);
        	}
        };
        
        // Function: svgedit.history.InsertElementCommand.elements
        // Returns array with element associated with this command
        svgedit.history.InsertElementCommand.prototype.elements = function() {
        	return [this.elem];
        };
        
        
        // Class: svgedit.history.RemoveElementCommand
        // implements svgedit.history.HistoryCommand
        // History command for an element removed from the DOM
        //
        // Parameters:
        // elem - The removed DOM element
        // oldNextSibling - the DOM element's nextSibling when it was in the DOM
        // oldParent - The DOM element's parent
        // text - An optional string visible to user related to this change
        svgedit.history.RemoveElementCommand = function(elem, oldNextSibling, oldParent, text) {
        	this.elem = elem;
        	this.text = text || ("Delete " + elem.tagName);
        	this.nextSibling = oldNextSibling;
        	this.parent = oldParent;
        
        	// special hack for webkit: remove this element's entry in the svgTransformLists map
        	svgedit.transformlist.removeElementFromListMap(elem);
        };
        svgedit.history.RemoveElementCommand.type = function() { return 'svgedit.history.RemoveElementCommand'; };
        svgedit.history.RemoveElementCommand.prototype.type = svgedit.history.RemoveElementCommand.type;
        
        // Function: svgedit.history.RemoveElementCommand.getText
        svgedit.history.RemoveElementCommand.prototype.getText = function() {
        	return this.text;
        };
        
        // Function: RemoveElementCommand.apply
        // Re-removes the new element
        svgedit.history.RemoveElementCommand.prototype.apply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this);
        	}
        
        	svgedit.transformlist.removeElementFromListMap(this.elem);
        	this.parent = this.elem.parentNode;
        	this.elem = this.parent.removeChild(this.elem);
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this);
        	}
        };
        
        // Function: RemoveElementCommand.unapply
        // Re-adds the new element
        svgedit.history.RemoveElementCommand.prototype.unapply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this);
        	}
        
        	svgedit.transformlist.removeElementFromListMap(this.elem);
        	if (this.nextSibling == null) {
        		if (window.console) {
                    console.log('Error: reference element was lost');
                }
        	}
        	this.parent.insertBefore(this.elem, this.nextSibling);
        
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this);
        	}
        };
        
        // Function: RemoveElementCommand.elements
        // Returns array with element associated with this command
        svgedit.history.RemoveElementCommand.prototype.elements = function() {
        	return [this.elem];
        };
        
        
        // Class: svgedit.history.ChangeElementCommand
        // implements svgedit.history.HistoryCommand
        // History command to make a change to an element.
        // Usually an attribute change, but can also be textcontent.
        //
        // Parameters:
        // elem - The DOM element that was changed
        // attrs - An object with the attributes to be changed and the values they had *before* the change
        // text - An optional string visible to user related to this change
        svgedit.history.ChangeElementCommand = function(elem, attrs, text) {
        	this.elem = elem;
        	this.text = text ? ("Change " + elem.tagName + " " + text) : ("Change " + elem.tagName);
        	this.newValues = {};
        	this.oldValues = attrs;
        	var attr;
        	for (attr in attrs) {
        		if (attr == "#text") {this.newValues[attr] = elem.textContent;}
        		else if (attr == "#href") {this.newValues[attr] = svgedit.utilities.getHref(elem);}
        		else {this.newValues[attr] = elem.getAttribute(attr);}
        	}
        };
        svgedit.history.ChangeElementCommand.type = function() { return 'svgedit.history.ChangeElementCommand'; };
        svgedit.history.ChangeElementCommand.prototype.type = svgedit.history.ChangeElementCommand.type;
        
        // Function: svgedit.history.ChangeElementCommand.getText
        svgedit.history.ChangeElementCommand.prototype.getText = function() {
        	return this.text;
        };
        
        // Function: svgedit.history.ChangeElementCommand.apply
        // Performs the stored change action
        svgedit.history.ChangeElementCommand.prototype.apply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this);
        	}
        
        	var bChangedTransform = false;
        	var attr;
        	for (attr in this.newValues ) {
        		if (this.newValues[attr]) {
        			if (attr == "#text") {this.elem.textContent = this.newValues[attr];}
        			else if (attr == "#href") {svgedit.utilities.setHref(this.elem, this.newValues[attr]);}
        			else {this.elem.setAttribute(attr, this.newValues[attr]);}
        		}
        		else {
        			if (attr == "#text") {
        				this.elem.textContent = "";
        			}
        			else {
        				this.elem.setAttribute(attr, "");
        				this.elem.removeAttribute(attr);
        			}
        		}
        
        		if (attr == "transform") { bChangedTransform = true; }
        	}
        
        	// relocate rotational transform, if necessary
        	if (!bChangedTransform) {
        		var angle = svgedit.utilities.getRotationAngle(this.elem);
        		if (angle) {
        			// TODO: These instances of elem either need to be declared as global
        			//				(which would not be good for conflicts) or declare/use this.elem
        			var bbox = elem.getBBox();
        			var cx = bbox.x + bbox.width/2,
        				cy = bbox.y + bbox.height/2;
        			var rotate = ["rotate(", angle, " ", cx, ",", cy, ")"].join('');
        			if (rotate != elem.getAttribute("transform")) {
        				elem.setAttribute("transform", rotate);
        			}
        		}
        	}
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this);
        	}
        
        	return true;
        };
        
        // Function: svgedit.history.ChangeElementCommand.unapply
        // Reverses the stored change action
        svgedit.history.ChangeElementCommand.prototype.unapply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this);
        	}
        
        	var bChangedTransform = false;
        	var attr;
        	for (attr in this.oldValues ) {
        		if (this.oldValues[attr]) {
        			if (attr == "#text") {this.elem.textContent = this.oldValues[attr];}
        			else if (attr == "#href") {svgedit.utilities.setHref(this.elem, this.oldValues[attr]);}
        			else {
        				this.elem.setAttribute(attr, this.oldValues[attr]);
        			}
        		}
        		else {
        			if (attr == "#text") {
        				this.elem.textContent = "";
        			}
        			else {this.elem.removeAttribute(attr);}
        		}
        		if (attr == "transform") { bChangedTransform = true; }
        	}
        	// relocate rotational transform, if necessary
        	if (!bChangedTransform) {
        		var angle = svgedit.utilities.getRotationAngle(this.elem);
        		if (angle) {
        			var bbox = elem.getBBox();
        			var cx = bbox.x + bbox.width/2,
        				cy = bbox.y + bbox.height/2;
        			var rotate = ["rotate(", angle, " ", cx, ",", cy, ")"].join('');
        			if (rotate != elem.getAttribute("transform")) {
        				elem.setAttribute("transform", rotate);
        			}
        		}
        	}
        
        	// Remove transformlist to prevent confusion that causes bugs like 575.
        	svgedit.transformlist.removeElementFromListMap(this.elem);
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this);
        	}
        
        	return true;
        };
        
        // Function: ChangeElementCommand.elements
        // Returns array with element associated with this command
        svgedit.history.ChangeElementCommand.prototype.elements = function() {
        	return [this.elem];
        };
        
        
        // TODO: create a 'typing' command object that tracks changes in text
        // if a new Typing command is created and the top command on the stack is also a Typing
        // and they both affect the same element, then collapse the two commands into one
        
        
        // Class: svgedit.history.BatchCommand
        // implements svgedit.history.HistoryCommand
        // History command that can contain/execute multiple other commands
        //
        // Parameters:
        // text - An optional string visible to user related to this change
        svgedit.history.BatchCommand = function(text) {
        	this.text = text || "Batch Command";
        	this.stack = [];
        };
        svgedit.history.BatchCommand.type = function() { return 'svgedit.history.BatchCommand'; };
        svgedit.history.BatchCommand.prototype.type = svgedit.history.BatchCommand.type;
        
        // Function: svgedit.history.BatchCommand.getText
        svgedit.history.BatchCommand.prototype.getText = function() {
        	return this.text;
        };
        
        // Function: svgedit.history.BatchCommand.apply
        // Runs "apply" on all subcommands
        svgedit.history.BatchCommand.prototype.apply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_APPLY, this);
        	}
        
        	var i,
        		len = this.stack.length;
        	for (i = 0; i < len; ++i) {
        		this.stack[i].apply(handler);
        	}
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_APPLY, this);
        	}
        };
        
        // Function: svgedit.history.BatchCommand.unapply
        // Runs "unapply" on all subcommands
        svgedit.history.BatchCommand.prototype.unapply = function(handler) {
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.BEFORE_UNAPPLY, this);
        	}
        
        	var i;
        	for (i = this.stack.length-1; i >= 0; i--) {
        		this.stack[i].unapply(handler);
        	}
        
        	if (handler) {
        		handler.handleHistoryEvent(svgedit.history.HistoryEventTypes.AFTER_UNAPPLY, this);
        	}
        };
        
        // Function: svgedit.history.BatchCommand.elements
        // Iterate through all our subcommands and returns all the elements we are changing
        svgedit.history.BatchCommand.prototype.elements = function() {
        	var elems = [];
        	var cmd = this.stack.length;
        	while (cmd--) {
        		var thisElems = this.stack[cmd].elements();
        		var elem = thisElems.length;
        		while (elem--) {
        			if (elems.indexOf(thisElems[elem]) == -1) {elems.push(thisElems[elem]);}
        		}
        	}
        	return elems;
        };
        
        // Function: svgedit.history.BatchCommand.addSubCommand
        // Adds a given command to the history stack
        //
        // Parameters:
        // cmd - The undo command object to add
        svgedit.history.BatchCommand.prototype.addSubCommand = function(cmd) {
        	this.stack.push(cmd);
        };
        
        // Function: svgedit.history.BatchCommand.isEmpty
        // Returns a boolean indicating whether or not the batch command is empty
        svgedit.history.BatchCommand.prototype.isEmpty = function() {
        	return this.stack.length === 0;
        };
        
        
        // Class: svgedit.history.UndoManager
        // Parameters:
        // historyEventHandler - an object that conforms to the HistoryEventHandler interface
        // (see above)
        svgedit.history.UndoManager = function(historyEventHandler) {
        	this.handler_ = historyEventHandler || null;
        	this.undoStackPointer = 0;
        	this.undoStack = [];
        
        	// this is the stack that stores the original values, the elements and
        	// the attribute name for begin/finish
        	this.undoChangeStackPointer = -1;
        	this.undoableChangeStack = [];
        };
        
        // Function: svgedit.history.UndoManager.resetUndoStack
        // Resets the undo stack, effectively clearing the undo/redo history
        svgedit.history.UndoManager.prototype.resetUndoStack = function() {
        	this.undoStack = [];
        	this.undoStackPointer = 0;
        };
        
        // Function: svgedit.history.UndoManager.getUndoStackSize
        // Returns:
        // Integer with the current size of the undo history stack
        svgedit.history.UndoManager.prototype.getUndoStackSize = function() {
        	return this.undoStackPointer;
        };
        
        // Function: svgedit.history.UndoManager.getRedoStackSize
        // Returns:
        // Integer with the current size of the redo history stack
        svgedit.history.UndoManager.prototype.getRedoStackSize = function() {
        	return this.undoStack.length - this.undoStackPointer;
        };
        
        // Function: svgedit.history.UndoManager.getNextUndoCommandText
        // Returns:
        // String associated with the next undo command
        svgedit.history.UndoManager.prototype.getNextUndoCommandText = function() {
        	return this.undoStackPointer > 0 ? this.undoStack[this.undoStackPointer-1].getText() : "";
        };
        
        // Function: svgedit.history.UndoManager.getNextRedoCommandText
        // Returns:
        // String associated with the next redo command
        svgedit.history.UndoManager.prototype.getNextRedoCommandText = function() {
        	return this.undoStackPointer < this.undoStack.length ? this.undoStack[this.undoStackPointer].getText() : "";
        };
        
        // Function: svgedit.history.UndoManager.undo
        // Performs an undo step
        svgedit.history.UndoManager.prototype.undo = function() {
        	if (this.undoStackPointer > 0) {
        		var cmd = this.undoStack[--this.undoStackPointer];
        		cmd.unapply(this.handler_);
        	}
        };
        
        // Function: svgedit.history.UndoManager.redo
        // Performs a redo step
        svgedit.history.UndoManager.prototype.redo = function() {
        	if (this.undoStackPointer < this.undoStack.length && this.undoStack.length > 0) {
        		var cmd = this.undoStack[this.undoStackPointer++];
        		cmd.apply(this.handler_);
        	}
        };
        
        // Function: svgedit.history.UndoManager.addCommandToHistory
        // Adds a command object to the undo history stack
        //
        // Parameters:
        // cmd - The command object to add
        svgedit.history.UndoManager.prototype.addCommandToHistory = function(cmd) {
        	// FIXME: we MUST compress consecutive text changes to the same element
        	// (right now each keystroke is saved as a separate command that includes the
        	// entire text contents of the text element)
        	// TODO: consider limiting the history that we store here (need to do some slicing)
        
        	// if our stack pointer is not at the end, then we have to remove
        	// all commands after the pointer and insert the new command
        	if (this.undoStackPointer < this.undoStack.length && this.undoStack.length > 0) {
        		this.undoStack = this.undoStack.splice(0, this.undoStackPointer);
        	}
        	this.undoStack.push(cmd);
        	this.undoStackPointer = this.undoStack.length;
        };
        
        
        // Function: svgedit.history.UndoManager.beginUndoableChange
        // This function tells the canvas to remember the old values of the 
        // attrName attribute for each element sent in.  The elements and values 
        // are stored on a stack, so the next call to finishUndoableChange() will 
        // pop the elements and old values off the stack, gets the current values
        // from the DOM and uses all of these to construct the undo-able command.
        //
        // Parameters:
        // attrName - The name of the attribute being changed
        // elems - Array of DOM elements being changed
        svgedit.history.UndoManager.prototype.beginUndoableChange = function(attrName, elems) {
        	var p = ++this.undoChangeStackPointer;
        	var i = elems.length;
        	var oldValues = new Array(i), elements = new Array(i);
        	while (i--) {
        		var elem = elems[i];
        		if (elem == null) {continue;}
        		elements[i] = elem;
        		oldValues[i] = elem.getAttribute(attrName);
        	}
        	this.undoableChangeStack[p] = {
        		'attrName': attrName,
        		'oldValues': oldValues,
        		'elements': elements
        	};
        };
        
        // Function: svgedit.history.UndoManager.finishUndoableChange
        // This function returns a BatchCommand object which summarizes the
        // change since beginUndoableChange was called.  The command can then
        // be added to the command history
        //
        // Returns:
        // Batch command object with resulting changes
        svgedit.history.UndoManager.prototype.finishUndoableChange = function() {
        	var p = this.undoChangeStackPointer--;
        	var changeset = this.undoableChangeStack[p];
        	var i = changeset.elements.length;
        	var attrName = changeset.attrName;
        	var batchCmd = new svgedit.history.BatchCommand("Change " + attrName);
        	while (i--) {
        		var elem = changeset.elements[i];
        		if (elem == null) {continue;}
        		var changes = {};
        		changes[attrName] = changeset.oldValues[i];
        		if (changes[attrName] != elem.getAttribute(attrName)) {
        			batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, changes, attrName));
        		}
        	}
        	this.undoableChangeStack[p] = null;
        	return batchCmd;
        };
        
        }());
        
      • jquery-svg.js
        /*globals $, jQuery */
        /*jslint vars: true */
        /**
         * jQuery module to work with SVG.
         *
         * Licensed under the MIT License
         *
         */
        
        // Dependencies:
        // 1) jquery
        
        (function() {'use strict';
        
          // This fixes $(...).attr() to work as expected with SVG elements.
          // Does not currently use *AttributeNS() since we rarely need that.
        
          // See http://api.jquery.com/attr/ for basic documentation of .attr()
        
          // Additional functionality:
          // - When getting attributes, a string that's a number is return as type number.
          // - If an array is supplied as first parameter, multiple values are returned
          // as an object with values for each given attributes
        
          var proxied = jQuery.fn.attr,
            // TODO use NS.SVG instead
            svgns = "http://www.w3.org/2000/svg";
          jQuery.fn.attr = function(key, value) {
            var i, attr;
        	var len = this.length;
            if (!len) {return proxied.apply(this, arguments);}
            for (i = 0; i < len; ++i) {
              var elem = this[i];
              // set/get SVG attribute
              if (elem.namespaceURI === svgns) {
                // Setting attribute
                if (value !== undefined) {
                  elem.setAttribute(key, value);
                } else if ($.isArray(key)) {
                  // Getting attributes from array
                  var j = key.length, obj = {};
        
                  while (j--) {
                    var aname = key[j];
                    attr = elem.getAttribute(aname);
                    // This returns a number when appropriate
                    if (attr || attr === "0") {
                      attr = isNaN(attr) ? attr : (attr - 0);
                    }
                    obj[aname] = attr;
                  }
                  return obj;
                }
        		if (typeof key === "object") {
                  // Setting attributes form object
        		  var v;
                  for (v in key) {
                    elem.setAttribute(v, key[v]);
                  }
                // Getting attribute
                } else {
                  attr = elem.getAttribute(key);
                  if (attr || attr === "0") {
                    attr = isNaN(attr) ? attr : (attr - 0);
                  }
                  return attr;
                }
              } else {
                return proxied.apply(this, arguments);
              }
            }
            return this;
          };
        }());
        
      • jquery.js
        /*! jQuery v1.7.1 jquery.com | jquery.org/license */
        (function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
        f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
        {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
      • math.js
        /*globals svgedit*/
        /*jslint vars: true, eqeq: true */
        /**
         * Package: svedit.math
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // None.
         
        /**
        * @typedef AngleCoord45
        * @type {object}
        * @property {number} x - The angle-snapped x value
        * @property {number} y - The angle-snapped y value
        * @property {number} a - The angle at which to snap
        */
        
        (function() {'use strict';
        
        if (!svgedit.math) {
        	svgedit.math = {};
        }
        
        // Constants
        var NEAR_ZERO = 1e-14;
        
        // Throw away SVGSVGElement used for creating matrices/transforms.
        var svg = document.createElementNS(svgedit.NS.SVG, 'svg');
        
        /**
         * A (hopefully) quicker function to transform a point by a matrix
         * (this function avoids any DOM calls and just does the math)
         * @param {number} x - Float representing the x coordinate
         * @param {number} y - Float representing the y coordinate
         * @param {SVGMatrix} m - Matrix object to transform the point with
         * @returns {object} An x, y object representing the transformed point
        */
        svgedit.math.transformPoint = function (x, y, m) {
        	return { x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f};
        };
        
        
        /**
         * Helper function to check if the matrix performs no actual transform 
         * (i.e. exists for identity purposes)
         * @param {SVGMatrix} m - The matrix object to check
         * @returns {boolean} Indicates whether or not the matrix is 1,0,0,1,0,0
        */
        svgedit.math.isIdentity = function (m) {
        	return (m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && m.e === 0 && m.f === 0);
        };
        
        
        /**
         * This function tries to return a SVGMatrix that is the multiplication m1*m2.
         * We also round to zero when it's near zero
         * @param {...SVGMatrix} matr - Two or more matrix objects to multiply
         * @returns {SVGMatrix} The matrix object resulting from the calculation
        */
        svgedit.math.matrixMultiply = function (matr) {
        	var args = arguments, i = args.length, m = args[i-1];
        
        	while (i-- > 1) {
        		var m1 = args[i-1];
        		m = m1.multiply(m);
        	}
        	if (Math.abs(m.a) < NEAR_ZERO) {m.a = 0;}
        	if (Math.abs(m.b) < NEAR_ZERO) {m.b = 0;}
        	if (Math.abs(m.c) < NEAR_ZERO) {m.c = 0;}
        	if (Math.abs(m.d) < NEAR_ZERO) {m.d = 0;}
        	if (Math.abs(m.e) < NEAR_ZERO) {m.e = 0;}
        	if (Math.abs(m.f) < NEAR_ZERO) {m.f = 0;}
        
        	return m;
        };
        
        /**
         * See if the given transformlist includes a non-indentity matrix transform
         * @param {object} [tlist] - The transformlist to check
         * @returns {boolean} Whether or not a matrix transform was found
        */
        svgedit.math.hasMatrixTransform = function (tlist) {
        	if (!tlist) {return false;}
        	var num = tlist.numberOfItems;
        	while (num--) {
        		var xform = tlist.getItem(num);
        		if (xform.type == 1 && !svgedit.math.isIdentity(xform.matrix)) {return true;}
        	}
        	return false;
        };
        
        /**
         * Transforms a rectangle based on the given matrix
         * @param {number} l - Float with the box's left coordinate
         * @param {number} t - Float with the box's top coordinate
         * @param {number} w - Float with the box width
         * @param {number} h - Float with the box height
         * @param {SVGMatrix} m - Matrix object to transform the box by
         * @returns {object} An object with the following values:
         * tl - The top left coordinate (x,y object)
         * tr - The top right coordinate (x,y object)
         * bl - The bottom left coordinate (x,y object)
         * br - The bottom right coordinate (x,y object)
         * aabox - Object with the following values:
         * x - Float with the axis-aligned x coordinate
         * y - Float with the axis-aligned y coordinate
         * width - Float with the axis-aligned width coordinate
         * height - Float with the axis-aligned height coordinate
        */
        svgedit.math.transformBox = function (l, t, w, h, m) {
        	var transformPoint = svgedit.math.transformPoint,
        
        		tl = transformPoint(l, t, m),
        		tr = transformPoint((l + w), t, m),
        		bl = transformPoint(l, (t + h), m),
        		br = transformPoint((l + w), (t + h), m),
        
        		minx = Math.min(tl.x, tr.x, bl.x, br.x),
        		maxx = Math.max(tl.x, tr.x, bl.x, br.x),
        		miny = Math.min(tl.y, tr.y, bl.y, br.y),
        		maxy = Math.max(tl.y, tr.y, bl.y, br.y);
        
        	return {
        		tl: tl,
        		tr: tr,
        		bl: bl,
        		br: br,
        		aabox: {
        			x: minx,
        			y: miny,
        			width: (maxx - minx),
        			height: (maxy - miny)
        		}
        	};
        };
        
        /**
         * This returns a single matrix Transform for a given Transform List
         * (this is the equivalent of SVGTransformList.consolidate() but unlike
         * that method, this one does not modify the actual SVGTransformList)
         * This function is very liberal with its min, max arguments
         * @param {object} tlist - The transformlist object
         * @param {integer} [min=0] - Optional integer indicating start transform position
         * @param {integer} [max] - Optional integer indicating end transform position;
         *   defaults to one less than the tlist's numberOfItems
         * @returns {object} A single matrix transform object
        */
        svgedit.math.transformListToTransform = function (tlist, min, max) {
        	if (tlist == null) {
        		// Or should tlist = null have been prevented before this?
        		return svg.createSVGTransformFromMatrix(svg.createSVGMatrix());
        	}
        	min = min || 0;
        	max = max || (tlist.numberOfItems - 1);
        	min = parseInt(min, 10);
        	max = parseInt(max, 10);
        	if (min > max) { var temp = max; max = min; min = temp; }
        	var m = svg.createSVGMatrix();
        	var i;
        	for (i = min; i <= max; ++i) {
        		// if our indices are out of range, just use a harmless identity matrix
        		var mtom = (i >= 0 && i < tlist.numberOfItems ? 
        						tlist.getItem(i).matrix :
        						svg.createSVGMatrix());
        		m = svgedit.math.matrixMultiply(m, mtom);
        	}
        	return svg.createSVGTransformFromMatrix(m);
        };
        
        
        /**
         * Get the matrix object for a given element
         * @param {Element} elem - The DOM element to check
         * @returns {SVGMatrix} The matrix object associated with the element's transformlist
        */
        svgedit.math.getMatrix = function (elem) {
        	var tlist = svgedit.transformlist.getTransformList(elem);
        	return svgedit.math.transformListToTransform(tlist).matrix;
        };
        
        
        /**
         * Returns a 45 degree angle coordinate associated with the two given
         * coordinates
         * @param {number} x1 - First coordinate's x value
         * @param {number} x2 - Second coordinate's x value
         * @param {number} y1 - First coordinate's y value
         * @param {number} y2 - Second coordinate's y value
         * @returns {AngleCoord45}
        */
        svgedit.math.snapToAngle = function (x1, y1, x2, y2) {
        	var snap = Math.PI / 4; // 45 degrees
        	var dx = x2 - x1;
        	var dy = y2 - y1;
        	var angle = Math.atan2(dy, dx);
        	var dist = Math.sqrt(dx * dx + dy * dy);
        	var snapangle = Math.round(angle / snap) * snap;
        
        	return {
        		x: x1 + dist * Math.cos(snapangle),
        		y: y1 + dist * Math.sin(snapangle),
        		a: snapangle
        	};
        };
        
        
        /**
         * Check if two rectangles (BBoxes objects) intersect each other
         * @param {SVGRect} r1 - The first BBox-like object
         * @param {SVGRect} r2 - The second BBox-like object
         * @returns {boolean} True if rectangles intersect
         */
        svgedit.math.rectsIntersect = function (r1, r2) {
        	return r2.x < (r1.x + r1.width) &&
        		(r2.x + r2.width) > r1.x &&
        		r2.y < (r1.y + r1.height) &&
        		(r2.y + r2.height) > r1.y;
        };
        
        }());
        
      • path.js
        /*globals $, svgedit, svgroot*/
        /*jslint vars: true, eqeq: true, continue: true*/
        /**
         * Package: svgedit.path
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2011 Alexis Deveria
         * Copyright(c) 2011 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) browser.js
        // 3) math.js
        // 4) svgutils.js
        
        (function() {'use strict';
        
        if (!svgedit.path) {
        	svgedit.path = {};
        }
        
        var NS = svgedit.NS;
        var uiStrings = {
        	'pathNodeTooltip': 'Drag node to move it. Double-click node to change segment type',
        	'pathCtrlPtTooltip': 'Drag control point to adjust curve properties'
        };
        
        var segData = {
        	2: ['x', 'y'],
        	4: ['x', 'y'],
        	6: ['x', 'y', 'x1', 'y1', 'x2', 'y2'],
        	8: ['x', 'y', 'x1', 'y1'],
        	10: ['x', 'y', 'r1', 'r2', 'angle', 'largeArcFlag', 'sweepFlag'],
        	12: ['x'],
        	14: ['y'],
        	16: ['x', 'y', 'x2', 'y2'],
        	18: ['x', 'y']
        };
        
        var pathFuncs = [];
        
        var link_control_pts = true;
        
        // Stores references to paths via IDs.
        // TODO: Make this cross-document happy.
        var pathData = {};
        
        svgedit.path.setLinkControlPoints = function(lcp) {
        	link_control_pts = lcp;
        };
        
        svgedit.path.path = null;
        
        var editorContext_ = null;
        
        svgedit.path.init = function(editorContext) {
        	editorContext_ = editorContext;
        
        	pathFuncs = [0, 'ClosePath'];
        	var pathFuncsStrs = ['Moveto', 'Lineto', 'CurvetoCubic', 'CurvetoQuadratic', 'Arc',
        		'LinetoHorizontal', 'LinetoVertical', 'CurvetoCubicSmooth', 'CurvetoQuadraticSmooth'];
        	$.each(pathFuncsStrs, function(i, s) {
        		pathFuncs.push(s+'Abs');
        		pathFuncs.push(s+'Rel');
        	});
        };
        
        svgedit.path.insertItemBefore = function(elem, newseg, index) {
        	// Support insertItemBefore on paths for FF2
        	var list = elem.pathSegList;
        
        	if (svgedit.browser.supportsPathInsertItemBefore()) {
        		list.insertItemBefore(newseg, index);
        		return;
        	}
        	var len = list.numberOfItems;
        	var arr = [];
        	var i;
        	for (i=0; i < len; i++) {
        		var cur_seg = list.getItem(i);
        		arr.push(cur_seg);
        	}
        	list.clear();
        	for (i=0; i < len; i++) {
        		if (i == index) { //index+1
        			list.appendItem(newseg);
        		}
        		list.appendItem(arr[i]);
        	}
        };
        
        // TODO: See if this should just live in replacePathSeg
        svgedit.path.ptObjToArr = function(type, seg_item) {
        	var arr = segData[type], len = arr.length;
        	var i, out = [];
        	for (i = 0; i < len; i++) {
        		out[i] = seg_item[arr[i]];
        	}
        	return out;
        };
        
        svgedit.path.getGripPt = function(seg, alt_pt) {
        	var out = {
        		x: alt_pt? alt_pt.x : seg.item.x,
        		y: alt_pt? alt_pt.y : seg.item.y
        	}, path = seg.path;
        
        	if (path.matrix) {
        		var pt = svgedit.math.transformPoint(out.x, out.y, path.matrix);
        		out = pt;
        	}
        
        	out.x *= editorContext_.getCurrentZoom();
        	out.y *= editorContext_.getCurrentZoom();
        
        	return out;
        };
        
        svgedit.path.getPointFromGrip = function(pt, path) {
        	var out = {
        		x: pt.x,
        		y: pt.y
        	};
        
        	if (path.matrix) {
        		pt = svgedit.math.transformPoint(out.x, out.y, path.imatrix);
        		out.x = pt.x;
        		out.y = pt.y;
        	}
        
        	out.x /= editorContext_.getCurrentZoom();
        	out.y /= editorContext_.getCurrentZoom();
        
        	return out;
        };
        
        svgedit.path.addPointGrip = function(index, x, y) {
        	// create the container of all the point grips
        	var pointGripContainer = svgedit.path.getGripContainer();
        
        	var pointGrip = svgedit.utilities.getElem('pathpointgrip_'+index);
        	// create it
        	if (!pointGrip) {
        		pointGrip = document.createElementNS(NS.SVG, 'circle');
        		svgedit.utilities.assignAttributes(pointGrip, {
        			'id': 'pathpointgrip_' + index,
        			'display': 'none',
        			'r': 4,
        			'fill': '#0FF',
        			'stroke': '#00F',
        			'stroke-width': 2,
        			'cursor': 'move',
        			'style': 'pointer-events:all',
        			'xlink:title': uiStrings.pathNodeTooltip
        		});
        		pointGrip = pointGripContainer.appendChild(pointGrip);
        
        		var grip = $('#pathpointgrip_'+index);
        		grip.dblclick(function() {
        			if (svgedit.path.path) {
        				svgedit.path.path.setSegType();
        			}
        		});
        	}
        	if (x && y) {
        		// set up the point grip element and display it
        		svgedit.utilities.assignAttributes(pointGrip, {
        			'cx': x,
        			'cy': y,
        			'display': 'inline'
        		});
        	}
        	return pointGrip;
        };
        
        svgedit.path.getGripContainer = function() {
        	var c = svgedit.utilities.getElem('pathpointgrip_container');
        	if (!c) {
        		var parent = svgedit.utilities.getElem('selectorParentGroup');
        		c = parent.appendChild(document.createElementNS(NS.SVG, 'g'));
        		c.id = 'pathpointgrip_container';
        	}
        	return c;
        };
        
        svgedit.path.addCtrlGrip = function(id) {
        	var pointGrip = svgedit.utilities.getElem('ctrlpointgrip_'+id);
        	if (pointGrip) {return pointGrip;}
        
        	pointGrip = document.createElementNS(NS.SVG, 'circle');
        	svgedit.utilities.assignAttributes(pointGrip, {
        		'id': 'ctrlpointgrip_' + id,
        		'display': 'none',
        		'r': 4,
        		'fill': '#0FF',
        		'stroke': '#55F',
        		'stroke-width': 1,
        		'cursor': 'move',
        		'style': 'pointer-events:all',
        		'xlink:title': uiStrings.pathCtrlPtTooltip
        	});
        	svgedit.path.getGripContainer().appendChild(pointGrip);
        	return pointGrip;
        };
        
        svgedit.path.getCtrlLine = function(id) {
        	var ctrlLine = svgedit.utilities.getElem('ctrlLine_'+id);
        	if (ctrlLine) {return ctrlLine;}
        
        	ctrlLine = document.createElementNS(NS.SVG, 'line');
        	svgedit.utilities.assignAttributes(ctrlLine, {
        		'id': 'ctrlLine_'+id,
        		'stroke': '#555',
        		'stroke-width': 1,
        		'style': 'pointer-events:none'
        	});
        	svgedit.path.getGripContainer().appendChild(ctrlLine);
        	return ctrlLine;
        };
        
        svgedit.path.getPointGrip = function(seg, update) {
        	var index = seg.index;
        	var pointGrip = svgedit.path.addPointGrip(index);
        
        	if (update) {
        		var pt = svgedit.path.getGripPt(seg);
        		svgedit.utilities.assignAttributes(pointGrip, {
        			'cx': pt.x,
        			'cy': pt.y,
        			'display': 'inline'
        		});
        	}
        
        	return pointGrip;
        };
        
        svgedit.path.getControlPoints = function(seg) {
        	var item = seg.item;
        	var index = seg.index;
        	if (!('x1' in item) || !('x2' in item)) {return null;}
        	var cpt = {};
        	var pointGripContainer = svgedit.path.getGripContainer();
        
        	// Note that this is intentionally not seg.prev.item
        	var prev = svgedit.path.path.segs[index-1].item;
        
        	var seg_items = [prev, item];
        
        	var i;
        	for (i = 1; i < 3; i++) {
        		var id = index + 'c' + i;
        
        		var ctrlLine = cpt['c' + i + '_line'] = svgedit.path.getCtrlLine(id);
        
        		var pt = svgedit.path.getGripPt(seg, {x:item['x' + i], y:item['y' + i]});
        		var gpt = svgedit.path.getGripPt(seg, {x:seg_items[i-1].x, y:seg_items[i-1].y});
        
        		svgedit.utilities.assignAttributes(ctrlLine, {
        			'x1': pt.x,
        			'y1': pt.y,
        			'x2': gpt.x,
        			'y2': gpt.y,
        			'display': 'inline'
        		});
        
        		cpt['c' + i + '_line'] = ctrlLine;
        
        		// create it
        		var pointGrip = cpt['c' + i] = svgedit.path.addCtrlGrip(id);
        
        		svgedit.utilities.assignAttributes(pointGrip, {
        			'cx': pt.x,
        			'cy': pt.y,
        			'display': 'inline'
        		});
        		cpt['c' + i] = pointGrip;
        	}
        	return cpt;
        };
        
        // This replaces the segment at the given index. Type is given as number.
        svgedit.path.replacePathSeg = function(type, index, pts, elem) {
        	var path = elem || svgedit.path.path.elem;
        	var func = 'createSVGPathSeg' + pathFuncs[type];
        	var seg = path[func].apply(path, pts);
        
        	if (svgedit.browser.supportsPathReplaceItem()) {
        		path.pathSegList.replaceItem(seg, index);
        	} else {
        		var segList = path.pathSegList;
        		var len = segList.numberOfItems;
        		var arr = [];
        		var i;
        		for (i = 0; i < len; i++) {
        			var cur_seg = segList.getItem(i);
        			arr.push(cur_seg);
        		}
        		segList.clear();
        		for (i = 0; i < len; i++) {
        			if (i == index) {
        				segList.appendItem(seg);
        			} else {
        				segList.appendItem(arr[i]);
        			}
        		}
        	}
        };
        
        svgedit.path.getSegSelector = function(seg, update) {
        	var index = seg.index;
        	var segLine = svgedit.utilities.getElem('segline_' + index);
        	if (!segLine) {
        		var pointGripContainer = svgedit.path.getGripContainer();
        		// create segline
        		segLine = document.createElementNS(NS.SVG, 'path');
        		svgedit.utilities.assignAttributes(segLine, {
        			'id': 'segline_' + index,
        			'display': 'none',
        			'fill': 'none',
        			'stroke': '#0FF',
        			'stroke-width': 2,
        			'style':'pointer-events:none',
        			'd': 'M0,0 0,0'
        		});
        		pointGripContainer.appendChild(segLine);
        	}
        
        	if (update) {
        		var prev = seg.prev;
        		if (!prev) {
        			segLine.setAttribute('display', 'none');
        			return segLine;
        		}
        
        		var pt = svgedit.path.getGripPt(prev);
        		// Set start point
        		svgedit.path.replacePathSeg(2, 0, [pt.x, pt.y], segLine);
        
        		var pts = svgedit.path.ptObjToArr(seg.type, seg.item, true);
        		var i;
        		for (i = 0; i < pts.length; i += 2) {
        			pt = svgedit.path.getGripPt(seg, {x:pts[i], y:pts[i+1]});
        			pts[i] = pt.x;
        			pts[i+1] = pt.y;
        		}
        
        		svgedit.path.replacePathSeg(seg.type, 1, pts, segLine);
        	}
        	return segLine;
        };
        
        // Function: smoothControlPoints
        // Takes three points and creates a smoother line based on them
        // 
        // Parameters: 
        // ct1 - Object with x and y values (first control point)
        // ct2 - Object with x and y values (second control point)
        // pt - Object with x and y values (third point)
        //
        // Returns: 
        // Array of two "smoothed" point objects
        svgedit.path.smoothControlPoints = function(ct1, ct2, pt) {
        	// each point must not be the origin
        	var x1 = ct1.x - pt.x,
        		y1 = ct1.y - pt.y,
        		x2 = ct2.x - pt.x,
        		y2 = ct2.y - pt.y;
        
        	if ( (x1 != 0 || y1 != 0) && (x2 != 0 || y2 != 0) ) {
        		var anglea = Math.atan2(y1, x1),
        			angleb = Math.atan2(y2, x2),
        			r1 = Math.sqrt(x1*x1+y1*y1),
        			r2 = Math.sqrt(x2*x2+y2*y2),
        			nct1 = editorContext_.getSVGRoot().createSVGPoint(),
        			nct2 = editorContext_.getSVGRoot().createSVGPoint();
        		if (anglea < 0) { anglea += 2*Math.PI; }
        		if (angleb < 0) { angleb += 2*Math.PI; }
        
        		var angleBetween = Math.abs(anglea - angleb),
        			angleDiff = Math.abs(Math.PI - angleBetween)/2;
        
        		var new_anglea, new_angleb;
        		if (anglea - angleb > 0) {
        			new_anglea = angleBetween < Math.PI ? (anglea + angleDiff) : (anglea - angleDiff);
        			new_angleb = angleBetween < Math.PI ? (angleb - angleDiff) : (angleb + angleDiff);
        		}
        		else {
        			new_anglea = angleBetween < Math.PI ? (anglea - angleDiff) : (anglea + angleDiff);
        			new_angleb = angleBetween < Math.PI ? (angleb + angleDiff) : (angleb - angleDiff);
        		}
        
        		// rotate the points
        		nct1.x = r1 * Math.cos(new_anglea) + pt.x;
        		nct1.y = r1 * Math.sin(new_anglea) + pt.y;
        		nct2.x = r2 * Math.cos(new_angleb) + pt.x;
        		nct2.y = r2 * Math.sin(new_angleb) + pt.y;
        
        		return [nct1, nct2];
        	}
        	return undefined;
        };
        
        svgedit.path.Segment = function(index, item) {
        	this.selected = false;
        	this.index = index;
        	this.item = item;
        	this.type = item.pathSegType;
        
        	this.ctrlpts = [];
        	this.ptgrip = null;
        	this.segsel = null;
        };
        
        svgedit.path.Segment.prototype.showCtrlPts = function(y) {
        	var i;
        	for (i in this.ctrlpts) {
        		if (this.ctrlpts.hasOwnProperty(i)) {
        			this.ctrlpts[i].setAttribute('display', y ? 'inline' : 'none');
        		}
        	}
        };
        
        svgedit.path.Segment.prototype.selectCtrls = function(y) {
        	$('#ctrlpointgrip_' + this.index + 'c1, #ctrlpointgrip_' + this.index + 'c2').
        		attr('fill', y ? '#0FF' : '#EEE');
        };
        
        svgedit.path.Segment.prototype.show = function(y) {
        	if (this.ptgrip) {
        		this.ptgrip.setAttribute('display', y ? 'inline' : 'none');
        		this.segsel.setAttribute('display', y ? 'inline' : 'none');
        		// Show/hide all control points if available
        		this.showCtrlPts(y);
        	}
        };
        
        svgedit.path.Segment.prototype.select = function(y) {
        	if (this.ptgrip) {
        		this.ptgrip.setAttribute('stroke', y ? '#0FF' : '#00F');
        		this.segsel.setAttribute('display', y ? 'inline' : 'none');
        		if (this.ctrlpts) {
        			this.selectCtrls(y);
        		}
        		this.selected = y;
        	}
        };
        
        svgedit.path.Segment.prototype.addGrip = function() {
        	this.ptgrip = svgedit.path.getPointGrip(this, true);
        	this.ctrlpts = svgedit.path.getControlPoints(this, true);
        	this.segsel = svgedit.path.getSegSelector(this, true);
        };
        
        svgedit.path.Segment.prototype.update = function(full) {
        	if (this.ptgrip) {
        		var pt = svgedit.path.getGripPt(this);
        		svgedit.utilities.assignAttributes(this.ptgrip, {
        			'cx': pt.x,
        			'cy': pt.y
        		});
        
        		svgedit.path.getSegSelector(this, true);
        
        		if (this.ctrlpts) {
        			if (full) {
        				this.item = svgedit.path.path.elem.pathSegList.getItem(this.index);
        				this.type = this.item.pathSegType;
        			}
        			svgedit.path.getControlPoints(this);
        		}
        		// this.segsel.setAttribute('display', y?'inline':'none');
        	}
        };
        
        svgedit.path.Segment.prototype.move = function(dx, dy) {
        	var cur_pts, item = this.item;
        
        	if (this.ctrlpts) {
        		cur_pts = [item.x += dx, item.y += dy, 
        			item.x1, item.y1, item.x2 += dx, item.y2 += dy];
        	} else {
        		cur_pts = [item.x += dx, item.y += dy];
        	}
        	svgedit.path.replacePathSeg(this.type, this.index, cur_pts);
        
        	if (this.next && this.next.ctrlpts) {
        		var next = this.next.item;
        		var next_pts = [next.x, next.y, 
        			next.x1 += dx, next.y1 += dy, next.x2, next.y2];
        		svgedit.path.replacePathSeg(this.next.type, this.next.index, next_pts);
        	}
        
        	if (this.mate) {
        		// The last point of a closed subpath has a 'mate',
        		// which is the 'M' segment of the subpath
        		item = this.mate.item;
        		var pts = [item.x += dx, item.y += dy];
        		svgedit.path.replacePathSeg(this.mate.type, this.mate.index, pts);
        		// Has no grip, so does not need 'updating'?
        	}
        
        	this.update(true);
        	if (this.next) {this.next.update(true);}
        };
        
        svgedit.path.Segment.prototype.setLinked = function(num) {
        	var seg, anum, pt;
        	if (num == 2) {
        		anum = 1;
        		seg = this.next;
        		if (!seg) {return;}
        		pt = this.item;
        	} else {
        		anum = 2;
        		seg = this.prev;
        		if (!seg) {return;}
        		pt = seg.item;
        	}
        
        	var item = seg.item;
        
        	item['x' + anum] = pt.x + (pt.x - this.item['x' + num]);
        	item['y' + anum] = pt.y + (pt.y - this.item['y' + num]);
        
        	var pts = [item.x, item.y,
        		item.x1, item.y1,
        		item.x2, item.y2];
        
        	svgedit.path.replacePathSeg(seg.type, seg.index, pts);
        	seg.update(true);
        };
        
        svgedit.path.Segment.prototype.moveCtrl = function(num, dx, dy) {
        	var item = this.item;
        
        	item['x' + num] += dx;
        	item['y' + num] += dy;
        
        	var pts = [item.x, item.y, item.x1, item.y1, item.x2, item.y2];
        
        	svgedit.path.replacePathSeg(this.type, this.index, pts);
        	this.update(true);
        };
        
        svgedit.path.Segment.prototype.setType = function(new_type, pts) {
        	svgedit.path.replacePathSeg(new_type, this.index, pts);
        	this.type = new_type;
        	this.item = svgedit.path.path.elem.pathSegList.getItem(this.index);
        	this.showCtrlPts(new_type === 6);
        	this.ctrlpts = svgedit.path.getControlPoints(this);
        	this.update(true);
        };
        
        svgedit.path.Path = function(elem) {
        	if (!elem || elem.tagName !== 'path') {
        		throw 'svgedit.path.Path constructed without a <path> element';
        	}
        
        	this.elem = elem;
        	this.segs = [];
        	this.selected_pts = [];
        	svgedit.path.path = this;
        
        	this.init();
        };
        
        // Reset path data
        svgedit.path.Path.prototype.init = function() {
        	// Hide all grips, etc
        	$(svgedit.path.getGripContainer()).find('*').attr('display', 'none');
        	var segList = this.elem.pathSegList;
        	var len = segList.numberOfItems;
        	this.segs = [];
        	this.selected_pts = [];
        	this.first_seg = null;
        
        	// Set up segs array
        	var i;
        	for (i = 0; i < len; i++) {
        		var item = segList.getItem(i);
        		var segment = new svgedit.path.Segment(i, item);
        		segment.path = this;
        		this.segs.push(segment);
        	}
        
        	var segs = this.segs;
        	var start_i = null;
        
        	for (i = 0; i < len; i++) {
        		var seg = segs[i];
        		var next_seg = (i+1) >= len ? null : segs[i+1];
        		var prev_seg = (i-1) < 0 ? null : segs[i-1];
        		var start_seg;
        		if (seg.type === 2) {
        			if (prev_seg && prev_seg.type !== 1) {
        				// New sub-path, last one is open,
        				// so add a grip to last sub-path's first point
        				start_seg = segs[start_i];
        				start_seg.next = segs[start_i+1];
        				start_seg.next.prev = start_seg;
        				start_seg.addGrip();
        			}
        			// Remember that this is a starter seg
        			start_i = i;
        		} else if (next_seg && next_seg.type === 1) {
        			// This is the last real segment of a closed sub-path
        			// Next is first seg after "M"
        			seg.next = segs[start_i+1];
        
        			// First seg after "M"'s prev is this
        			seg.next.prev = seg;
        			seg.mate = segs[start_i];
        			seg.addGrip();
        			if (this.first_seg == null) {
        				this.first_seg = seg;
        			}
        		} else if (!next_seg) {
        			if (seg.type !== 1) {
        				// Last seg, doesn't close so add a grip
        				// to last sub-path's first point
        				start_seg = segs[start_i];
        				start_seg.next = segs[start_i+1];
        				start_seg.next.prev = start_seg;
        				start_seg.addGrip();
        				seg.addGrip();
        
        				if (!this.first_seg) {
        					// Open path, so set first as real first and add grip
        					this.first_seg = segs[start_i];
        				}
        			}
        		} else if (seg.type !== 1){
        			// Regular segment, so add grip and its "next"
        			seg.addGrip();
        
        			// Don't set its "next" if it's an "M"
        			if (next_seg && next_seg.type !== 2) {
        				seg.next = next_seg;
        				seg.next.prev = seg;
        			}
        		}
        	}
        	return this;
        };
        
        svgedit.path.Path.prototype.eachSeg = function(fn) {
        	var i;
        	var len = this.segs.length;
        	for (i = 0; i < len; i++) {
        		var ret = fn.call(this.segs[i], i);
        		if (ret === false) {break;}
        	}
        };
        
        svgedit.path.Path.prototype.addSeg = function(index) {
        	// Adds a new segment
        	var seg = this.segs[index];
        	if (!seg.prev) {return;}
        
        	var prev = seg.prev;
        	var newseg, new_x, new_y;
        	switch(seg.item.pathSegType) {
        	case 4:
        		new_x = (seg.item.x + prev.item.x) / 2;
        		new_y = (seg.item.y + prev.item.y) / 2;
        		newseg = this.elem.createSVGPathSegLinetoAbs(new_x, new_y);
        		break;
        	case 6: //make it a curved segment to preserve the shape (WRS)
        		// http://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm#Geometric_interpretation
        		var p0_x = (prev.item.x + seg.item.x1)/2;
        		var p1_x = (seg.item.x1 + seg.item.x2)/2;
        		var p2_x = (seg.item.x2 + seg.item.x)/2;
        		var p01_x = (p0_x + p1_x)/2;
        		var p12_x = (p1_x + p2_x)/2;
        		new_x = (p01_x + p12_x)/2;
        		var p0_y = (prev.item.y + seg.item.y1)/2;
        		var p1_y = (seg.item.y1 + seg.item.y2)/2;
        		var p2_y = (seg.item.y2 + seg.item.y)/2;
        		var p01_y = (p0_y + p1_y)/2;
        		var p12_y = (p1_y + p2_y)/2;
        		new_y = (p01_y + p12_y)/2;
        		newseg = this.elem.createSVGPathSegCurvetoCubicAbs(new_x, new_y, p0_x, p0_y, p01_x, p01_y);
        		var pts = [seg.item.x, seg.item.y, p12_x, p12_y, p2_x, p2_y];
        		svgedit.path.replacePathSeg(seg.type, index, pts);
        		break;
        	}
        
        	svgedit.path.insertItemBefore(this.elem, newseg, index);
        };
        
        svgedit.path.Path.prototype.deleteSeg = function(index) {
        	var seg = this.segs[index];
        	var list = this.elem.pathSegList;
        
        	seg.show(false);
        	var next = seg.next;
        	var pt;
        	if (seg.mate) {
        		// Make the next point be the "M" point
        		pt = [next.item.x, next.item.y];
        		svgedit.path.replacePathSeg(2, next.index, pt);
        
        		// Reposition last node
        		svgedit.path.replacePathSeg(4, seg.index, pt);
        
        		list.removeItem(seg.mate.index);
        	} else if (!seg.prev) {
        		// First node of open path, make next point the M
        		var item = seg.item;
        		pt = [next.item.x, next.item.y];
        		svgedit.path.replacePathSeg(2, seg.next.index, pt);
        		list.removeItem(index);
        	} else {
        		list.removeItem(index);
        	}
        };
        
        svgedit.path.Path.prototype.subpathIsClosed = function(index) {
        	var closed = false;
        	// Check if subpath is already open
        	svgedit.path.path.eachSeg(function(i) {
        		if (i <= index) {return true;}
        		if (this.type === 2) {
        			// Found M first, so open
        			return false;
        		}
        		if (this.type === 1) {
        			// Found Z first, so closed
        			closed = true;
        			return false;
        		}
        	});
        
        	return closed;
        };
        
        svgedit.path.Path.prototype.removePtFromSelection = function(index) {
        	var pos = this.selected_pts.indexOf(index);
        	if (pos == -1) {
        		return;
        	}
        	this.segs[index].select(false);
        	this.selected_pts.splice(pos, 1);
        };
        
        svgedit.path.Path.prototype.clearSelection = function() {
        	this.eachSeg(function() {
        		// 'this' is the segment here
        		this.select(false);
        	});
        	this.selected_pts = [];
        };
        
        svgedit.path.Path.prototype.storeD = function() {
        	this.last_d = this.elem.getAttribute('d');
        };
        
        svgedit.path.Path.prototype.show = function(y) {
        	// Shows this path's segment grips
        	this.eachSeg(function() {
        		// 'this' is the segment here
        		this.show(y);
        	});
        	if (y) {
        		this.selectPt(this.first_seg.index);
        	}
        	return this;
        };
        
        // Move selected points
        svgedit.path.Path.prototype.movePts = function(d_x, d_y) {
        	var i = this.selected_pts.length;
        	while(i--) {
        		var seg = this.segs[this.selected_pts[i]];
        		seg.move(d_x, d_y);
        	}
        };
        
        svgedit.path.Path.prototype.moveCtrl = function(d_x, d_y) {
        	var seg = this.segs[this.selected_pts[0]];
        	seg.moveCtrl(this.dragctrl, d_x, d_y);
        	if (link_control_pts) {
        		seg.setLinked(this.dragctrl);
        	}
        };
        
        svgedit.path.Path.prototype.setSegType = function(new_type) {
        	this.storeD();
        	var i = this.selected_pts.length;
        	var text;
        	while(i--) {
        		var sel_pt = this.selected_pts[i];
        
        		// Selected seg
        		var cur = this.segs[sel_pt];
        		var prev = cur.prev;
        		if (!prev) {continue;}
        
        		if (!new_type) { // double-click, so just toggle
        			text = 'Toggle Path Segment Type';
        
        			// Toggle segment to curve/straight line
        			var old_type = cur.type;
        
        			new_type = (old_type == 6) ? 4 : 6;
        		}
        
        		new_type = Number(new_type);
        
        		var cur_x = cur.item.x;
        		var cur_y = cur.item.y;
        		var prev_x = prev.item.x;
        		var prev_y = prev.item.y;
        		var points;
        		switch ( new_type ) {
        		case 6:
        			if (cur.olditem) {
        				var old = cur.olditem;
        				points = [cur_x, cur_y, old.x1, old.y1, old.x2, old.y2];
        			} else {
        				var diff_x = cur_x - prev_x;
        				var diff_y = cur_y - prev_y;
        				// get control points from straight line segment
        				/*
        				var ct1_x = (prev_x + (diff_y/2));
        				var ct1_y = (prev_y - (diff_x/2));
        				var ct2_x = (cur_x + (diff_y/2));
        				var ct2_y = (cur_y - (diff_x/2));
        				*/
        				//create control points on the line to preserve the shape (WRS)
        				var ct1_x = (prev_x + (diff_x/3));
        				var ct1_y = (prev_y + (diff_y/3));
        				var ct2_x = (cur_x - (diff_x/3));
        				var ct2_y = (cur_y - (diff_y/3));
        				points = [cur_x, cur_y, ct1_x, ct1_y, ct2_x, ct2_y];
        			}
        			break;
        		case 4:
        			points = [cur_x, cur_y];
        
        			// Store original prevve segment nums
        			cur.olditem = cur.item;
        			break;
        		}
        
        		cur.setType(new_type, points);
        	}
        	svgedit.path.path.endChanges(text);
        };
        
        svgedit.path.Path.prototype.selectPt = function(pt, ctrl_num) {
        	this.clearSelection();
        	if (pt == null) {
        		this.eachSeg(function(i) {
        			// 'this' is the segment here.
        			if (this.prev) {
        				pt = i;
        			}
        		});
        	}
        	this.addPtsToSelection(pt);
        	if (ctrl_num) {
        		this.dragctrl = ctrl_num;
        
        		if (link_control_pts) {
        			this.segs[pt].setLinked(ctrl_num);
        		}
        	}
        };
        
        // Update position of all points
        svgedit.path.Path.prototype.update = function() {
        	var elem = this.elem;
        	if (svgedit.utilities.getRotationAngle(elem)) {
        		this.matrix = svgedit.math.getMatrix(elem);
        		this.imatrix = this.matrix.inverse();
        	} else {
        		this.matrix = null;
        		this.imatrix = null;
        	}
        
        	this.eachSeg(function(i) {
        		this.item = elem.pathSegList.getItem(i);
        		this.update();
        	});
        
        	return this;
        };
        
        svgedit.path.getPath_ = function(elem) {
        	var p = pathData[elem.id];
        	if (!p) {
        		p = pathData[elem.id] = new svgedit.path.Path(elem);
        	}
        	return p;
        };
        
        svgedit.path.removePath_ = function(id) {
        	if (id in pathData) {delete pathData[id];}
        };
        var newcx, newcy, oldcx, oldcy, angle;
        var getRotVals = function(x, y) {
        	var dx = x - oldcx;
        	var dy = y - oldcy;
        
        	// rotate the point around the old center
        	var r = Math.sqrt(dx*dx + dy*dy);
        	var theta = Math.atan2(dy, dx) + angle;
        	dx = r * Math.cos(theta) + oldcx;
        	dy = r * Math.sin(theta) + oldcy;
        
        	// dx,dy should now hold the actual coordinates of each
        	// point after being rotated
        
        	// now we want to rotate them around the new center in the reverse direction
        	dx -= newcx;
        	dy -= newcy;
        
        	r = Math.sqrt(dx*dx + dy*dy);
        	theta = Math.atan2(dy, dx) - angle;
        
        	return {'x': r * Math.cos(theta) + newcx,
        		'y': r * Math.sin(theta) + newcy};
        };
        
        // If the path was rotated, we must now pay the piper:
        // Every path point must be rotated into the rotated coordinate system of 
        // its old center, then determine the new center, then rotate it back
        // This is because we want the path to remember its rotation
        
        // TODO: This is still using ye olde transform methods, can probably
        // be optimized or even taken care of by recalculateDimensions
        svgedit.path.recalcRotatedPath = function() {
        	var current_path = svgedit.path.path.elem;
        	angle = svgedit.utilities.getRotationAngle(current_path, true);
        	if (!angle) {return;}
        //	selectedBBoxes[0] = svgedit.path.path.oldbbox;
        	var box = svgedit.utilities.getBBox(current_path),
        		oldbox = svgedit.path.path.oldbbox; //selectedBBoxes[0],
        	oldcx = oldbox.x + oldbox.width/2;
        	oldcy = oldbox.y + oldbox.height/2;
        	newcx = box.x + box.width/2;
        	newcy = box.y + box.height/2;
        
        	// un-rotate the new center to the proper position
        	var dx = newcx - oldcx,
        		dy = newcy - oldcy,
        		r = Math.sqrt(dx*dx + dy*dy),
        		theta = Math.atan2(dy, dx) + angle;
        
        	newcx = r * Math.cos(theta) + oldcx;
        	newcy = r * Math.sin(theta) + oldcy;
        
        	var list = current_path.pathSegList,
        		i = list.numberOfItems;
        	while (i) {
        		i -= 1;
        		var seg = list.getItem(i),
        			type = seg.pathSegType;
        		if (type == 1) {continue;}
        
        		var rvals = getRotVals(seg.x, seg.y),
        			points = [rvals.x, rvals.y];
        		if (seg.x1 != null && seg.x2 != null) {
        			var c_vals1 = getRotVals(seg.x1, seg.y1);
        			var c_vals2 = getRotVals(seg.x2, seg.y2);
        			points.splice(points.length, 0, c_vals1.x , c_vals1.y, c_vals2.x, c_vals2.y);
        		}
        		svgedit.path.replacePathSeg(type, i, points);
        	} // loop for each point
        
        	box = svgedit.utilities.getBBox(current_path);
        //	selectedBBoxes[0].x = box.x; selectedBBoxes[0].y = box.y;
        //	selectedBBoxes[0].width = box.width; selectedBBoxes[0].height = box.height;
        
        	// now we must set the new transform to be rotated around the new center
        	var R_nc = svgroot.createSVGTransform(),
        		tlist = svgedit.transformlist.getTransformList(current_path);
        	R_nc.setRotate((angle * 180.0 / Math.PI), newcx, newcy);
        	tlist.replaceItem(R_nc,0);
        };
        
        // ====================================
        // Public API starts here
        
        svgedit.path.clearData =  function() {
        	pathData = {};
        };
        
        }());
        
      • recalculate.js
        /*globals $*/
        /*jslint vars: true, eqeq: true, continue: true*/
        /**
         * Recalculate.
         *
         * Licensed under the MIT License
         *
         */
        
        // Dependencies:
        // 1) jquery
        // 2) jquery-svg.js
        // 3) svgedit.js
        // 4) browser.js
        // 5) math.js
        // 6) history.js
        // 7) units.js
        // 8) svgtransformlist.js
        // 9) svgutils.js
        // 10) coords.js
        
        var svgedit = svgedit || {};
        
        (function() {
        
        if (!svgedit.recalculate) {
          svgedit.recalculate = {};
        }
        
        var NS = svgedit.NS;
        var context_;
        
        // Function: svgedit.recalculate.init
        svgedit.recalculate.init = function(editorContext) {
          context_ = editorContext;
        };
        
        
        // Function: svgedit.recalculate.updateClipPath
        // Updates a <clipPath>s values based on the given translation of an element
        //
        // Parameters:
        // attr - The clip-path attribute value with the clipPath's ID
        // tx - The translation's x value
        // ty - The translation's y value
        svgedit.recalculate.updateClipPath = function(attr, tx, ty) {
          var path = getRefElem(attr).firstChild;
          var cp_xform = svgedit.transformlist.getTransformList(path);
          var newxlate = context_.getSVGRoot().createSVGTransform();
          newxlate.setTranslate(tx, ty);
        
          cp_xform.appendItem(newxlate);
        
          // Update clipPath's dimensions
          svgedit.recalculate.recalculateDimensions(path);
        };
        
        
        // Function: svgedit.recalculate.recalculateDimensions
        // Decides the course of action based on the element's transform list
        //
        // Parameters:
        // selected - The DOM element to recalculate
        //
        // Returns: 
        // Undo command object with the resulting change
        svgedit.recalculate.recalculateDimensions = function(selected) {
          if (selected == null) {return null;}
        
          // Firefox Issue - 1081
          if (selected.nodeName == "svg" && navigator.userAgent.indexOf("Firefox/20") >= 0) {
            return null;
          }
        
          var svgroot = context_.getSVGRoot();
          var tlist = svgedit.transformlist.getTransformList(selected);
          var k;
          // remove any unnecessary transforms
          if (tlist && tlist.numberOfItems > 0) {
            k = tlist.numberOfItems;
            while (k--) {
              var xform = tlist.getItem(k);
              if (xform.type === 0) {
                tlist.removeItem(k);
              }
              // remove identity matrices
              else if (xform.type === 1) {
                if (svgedit.math.isIdentity(xform.matrix)) {
                  tlist.removeItem(k);
                }
              }
              // remove zero-degree rotations
              else if (xform.type === 4) {
                if (xform.angle === 0) {
                  tlist.removeItem(k);
                }
              }
            }
            // End here if all it has is a rotation
            if (tlist.numberOfItems === 1 &&
                svgedit.utilities.getRotationAngle(selected)) {return null;}
          }
        
          // if this element had no transforms, we are done
          if (!tlist || tlist.numberOfItems == 0) {
            // Chrome has a bug that requires clearing the attribute first.
            selected.setAttribute('transform', '');
            selected.removeAttribute('transform');
            return null;
          }
        
          // TODO: Make this work for more than 2
          if (tlist) {
            k = tlist.numberOfItems;
            var mxs = [];
            while (k--) {
              var xform = tlist.getItem(k);
              if (xform.type === 1) {
                mxs.push([xform.matrix, k]);
              } else if (mxs.length) {
                mxs = [];
              }
            }
            if (mxs.length === 2) {
              var m_new = svgroot.createSVGTransformFromMatrix(svgedit.math.matrixMultiply(mxs[1][0], mxs[0][0]));
              tlist.removeItem(mxs[0][1]);
              tlist.removeItem(mxs[1][1]);
              tlist.insertItemBefore(m_new, mxs[1][1]);
            }
        
            // combine matrix + translate
            k = tlist.numberOfItems;
            if (k >= 2 && tlist.getItem(k-2).type === 1 && tlist.getItem(k-1).type === 2) {
              var mt = svgroot.createSVGTransform();
        
              var m = svgedit.math.matrixMultiply(
                  tlist.getItem(k-2).matrix, 
                  tlist.getItem(k-1).matrix);   
              mt.setMatrix(m);
              tlist.removeItem(k-2);
              tlist.removeItem(k-2);
              tlist.appendItem(mt);
            }
          }
        
          // If it still has a single [M] or [R][M], return null too (prevents BatchCommand from being returned).
          switch ( selected.tagName ) {
            // Ignore these elements, as they can absorb the [M]
            case 'line':
            case 'polyline':
            case 'polygon':
            case 'path':
              break;
            default:
              if ((tlist.numberOfItems === 1 && tlist.getItem(0).type === 1) ||
                  (tlist.numberOfItems === 2 && tlist.getItem(0).type === 1 && tlist.getItem(0).type === 4)) {
                return null;
              }
          }
        
          // Grouped SVG element 
          var gsvg = $(selected).data('gsvg');
        
          // we know we have some transforms, so set up return variable   
          var batchCmd = new svgedit.history.BatchCommand('Transform');
        
          // store initial values that will be affected by reducing the transform list
          var changes = {}, initial = null, attrs = [];
          switch (selected.tagName) {
            case 'line':
              attrs = ['x1', 'y1', 'x2', 'y2'];
              break;
            case 'circle':
              attrs = ['cx', 'cy', 'r'];
              break;
            case 'ellipse':
              attrs = ['cx', 'cy', 'rx', 'ry'];
              break;
            case 'foreignObject':
            case 'rect':
            case 'image':
              attrs = ['width', 'height', 'x', 'y'];
              break;
            case 'use':
            case 'text':
            case 'tspan':
              attrs = ['x', 'y'];
              break;
            case 'polygon':
            case 'polyline':
              initial = {};
              initial.points = selected.getAttribute('points');
              var list = selected.points;
              var len = list.numberOfItems;
              changes.points = new Array(len);
        	  var i;
              for (i = 0; i < len; ++i) {
                var pt = list.getItem(i);
                changes.points[i] = {x:pt.x, y:pt.y};
              }
              break;
            case 'path':
              initial = {};
              initial.d = selected.getAttribute('d');
              changes.d = selected.getAttribute('d');
              break;
            } // switch on element type to get initial values
        
            if (attrs.length) {
              changes = $(selected).attr(attrs);
              $.each(changes, function(attr, val) {
                changes[attr] = svgedit.units.convertToNum(attr, val);
              });
            } else if (gsvg) {
              // GSVG exception
              changes = {
                x: $(gsvg).attr('x') || 0,
                y: $(gsvg).attr('y') || 0
              };
            }
        
          // if we haven't created an initial array in polygon/polyline/path, then 
          // make a copy of initial values and include the transform
          if (initial == null) {
            initial = $.extend(true, {}, changes);
            $.each(initial, function(attr, val) {
              initial[attr] = svgedit.units.convertToNum(attr, val);
            });
          }
          // save the start transform value too
          initial.transform = context_.getStartTransform() || '';
        
          // if it's a regular group, we have special processing to flatten transforms
          if ((selected.tagName == 'g' && !gsvg) || selected.tagName == 'a') {
            var box = svgedit.utilities.getBBox(selected),
              oldcenter = {x: box.x+box.width/2, y: box.y+box.height/2},
              newcenter = svgedit.math.transformPoint(box.x+box.width/2,
                box.y+box.height/2,
                svgedit.math.transformListToTransform(tlist).matrix),
              m = svgroot.createSVGMatrix();
        
            // temporarily strip off the rotate and save the old center
            var gangle = svgedit.utilities.getRotationAngle(selected);
            if (gangle) {
              var a = gangle * Math.PI / 180;
              if ( Math.abs(a) > (1.0e-10) ) {
                var s = Math.sin(a)/(1 - Math.cos(a));
              } else {
                // FIXME: This blows up if the angle is exactly 0!
                var s = 2/a;
              }
        	  var i;
              for (i = 0; i < tlist.numberOfItems; ++i) {
                var xform = tlist.getItem(i);
                if (xform.type == 4) {
                  // extract old center through mystical arts
                  var rm = xform.matrix;
                  oldcenter.y = (s*rm.e + rm.f)/2;
                  oldcenter.x = (rm.e - s*rm.f)/2;
                  tlist.removeItem(i);
                  break;
                }
              }
            }
            var tx = 0, ty = 0,
              operation = 0,
              N = tlist.numberOfItems;
        
            if (N) {
              var first_m = tlist.getItem(0).matrix;
            }
        
            // first, if it was a scale then the second-last transform will be it
            if (N >= 3 && tlist.getItem(N-2).type == 3 && 
              tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2) 
            {
              operation = 3; // scale
            
              // if the children are unrotated, pass the scale down directly
              // otherwise pass the equivalent matrix() down directly
              var tm = tlist.getItem(N-3).matrix,
                sm = tlist.getItem(N-2).matrix,
                tmn = tlist.getItem(N-1).matrix;
            
              var children = selected.childNodes;
              var c = children.length;
              while (c--) {
                var child = children.item(c);
                tx = 0;
                ty = 0;
                if (child.nodeType == 1) {
                  var childTlist = svgedit.transformlist.getTransformList(child);
        
                  // some children might not have a transform (<metadata>, <defs>, etc)
                  if (!childTlist) {continue;}
        
                  var m = svgedit.math.transformListToTransform(childTlist).matrix;
        
                  // Convert a matrix to a scale if applicable
        //          if (svgedit.math.hasMatrixTransform(childTlist) && childTlist.numberOfItems == 1) {
        //            if (m.b==0 && m.c==0 && m.e==0 && m.f==0) {
        //              childTlist.removeItem(0);
        //              var translateOrigin = svgroot.createSVGTransform(),
        //                scale = svgroot.createSVGTransform(),
        //                translateBack = svgroot.createSVGTransform();
        //              translateOrigin.setTranslate(0, 0);
        //              scale.setScale(m.a, m.d);
        //              translateBack.setTranslate(0, 0);
        //              childTlist.appendItem(translateBack);
        //              childTlist.appendItem(scale);
        //              childTlist.appendItem(translateOrigin);
        //            }
        //          }
                
                  var angle = svgedit.utilities.getRotationAngle(child);
                  var oldStartTransform = context_.getStartTransform();
                  var childxforms = [];
                  context_.setStartTransform(child.getAttribute('transform'));
                  if (angle || svgedit.math.hasMatrixTransform(childTlist)) {
                    var e2t = svgroot.createSVGTransform();
                    e2t.setMatrix(svgedit.math.matrixMultiply(tm, sm, tmn, m));
                    childTlist.clear();
                    childTlist.appendItem(e2t);
                    childxforms.push(e2t);
                  }
                  // if not rotated or skewed, push the [T][S][-T] down to the child
                  else {
                    // update the transform list with translate,scale,translate
                    
                    // slide the [T][S][-T] from the front to the back
                    // [T][S][-T][M] = [M][T2][S2][-T2]
                    
                    // (only bringing [-T] to the right of [M])
                    // [T][S][-T][M] = [T][S][M][-T2]
                    // [-T2] = [M_inv][-T][M]
                    var t2n = svgedit.math.matrixMultiply(m.inverse(), tmn, m);
                    // [T2] is always negative translation of [-T2]
                    var t2 = svgroot.createSVGMatrix();
                    t2.e = -t2n.e;
                    t2.f = -t2n.f;
                    
                    // [T][S][-T][M] = [M][T2][S2][-T2]
                    // [S2] = [T2_inv][M_inv][T][S][-T][M][-T2_inv]
                    var s2 = svgedit.math.matrixMultiply(t2.inverse(), m.inverse(), tm, sm, tmn, m, t2n.inverse());
        
                    var translateOrigin = svgroot.createSVGTransform(),
                      scale = svgroot.createSVGTransform(),
                      translateBack = svgroot.createSVGTransform();
                    translateOrigin.setTranslate(t2n.e, t2n.f);
                    scale.setScale(s2.a, s2.d);
                    translateBack.setTranslate(t2.e, t2.f);
                    childTlist.appendItem(translateBack);
                    childTlist.appendItem(scale);
                    childTlist.appendItem(translateOrigin);
                    childxforms.push(translateBack);
                    childxforms.push(scale);
                    childxforms.push(translateOrigin);
        //            logMatrix(translateBack.matrix);
        //            logMatrix(scale.matrix);
                  } // not rotated
                  batchCmd.addSubCommand( svgedit.recalculate.recalculateDimensions(child) );
                  // TODO: If any <use> have this group as a parent and are 
                  // referencing this child, then we need to impose a reverse 
                  // scale on it so that when it won't get double-translated
        //            var uses = selected.getElementsByTagNameNS(NS.SVG, 'use');
        //            var href = '#' + child.id;
        //            var u = uses.length;
        //            while (u--) {
        //              var useElem = uses.item(u);
        //              if (href == svgedit.utilities.getHref(useElem)) {
        //                var usexlate = svgroot.createSVGTransform();
        //                usexlate.setTranslate(-tx,-ty);
        //                svgedit.transformlist.getTransformList(useElem).insertItemBefore(usexlate,0);
        //                batchCmd.addSubCommand( svgedit.recalculate.recalculateDimensions(useElem) );
        //              }
        //            }
                  context_.setStartTransform(oldStartTransform);
                } // element
              } // for each child
              // Remove these transforms from group
              tlist.removeItem(N-1);
              tlist.removeItem(N-2);
              tlist.removeItem(N-3);
            } else if (N >= 3 && tlist.getItem(N-1).type == 1) {
              operation = 3; // scale
              m = svgedit.math.transformListToTransform(tlist).matrix;
              var e2t = svgroot.createSVGTransform();
              e2t.setMatrix(m);
              tlist.clear();
              tlist.appendItem(e2t);
            }     
            // next, check if the first transform was a translate 
            // if we had [ T1 ] [ M ] we want to transform this into [ M ] [ T2 ]
            // therefore [ T2 ] = [ M_inv ] [ T1 ] [ M ]
            else if ( (N == 1 || (N > 1 && tlist.getItem(1).type != 3)) && 
              tlist.getItem(0).type == 2) 
            {
              operation = 2; // translate
              var T_M = svgedit.math.transformListToTransform(tlist).matrix;
              tlist.removeItem(0);
              var M_inv = svgedit.math.transformListToTransform(tlist).matrix.inverse();
              var M2 = svgedit.math.matrixMultiply( M_inv, T_M );
              
              tx = M2.e;
              ty = M2.f;
        
              if (tx != 0 || ty != 0) {
                // we pass the translates down to the individual children
                var children = selected.childNodes;
                var c = children.length;
                
                var clipPaths_done = [];
                
                while (c--) {
                  var child = children.item(c);
                  if (child.nodeType == 1) {
                  
                    // Check if child has clip-path
                    if (child.getAttribute('clip-path')) {
                      // tx, ty
                      var attr = child.getAttribute('clip-path');
                      if (clipPaths_done.indexOf(attr) === -1) {
                        svgedit.recalculate.updateClipPath(attr, tx, ty);
                        clipPaths_done.push(attr);
                      }             
                    }
        
                    var oldStartTransform = context_.getStartTransform();
                    context_.setStartTransform(child.getAttribute('transform'));
                    
                    var childTlist = svgedit.transformlist.getTransformList(child);
                    // some children might not have a transform (<metadata>, <defs>, etc)
                    if (childTlist) {
                      var newxlate = svgroot.createSVGTransform();
                      newxlate.setTranslate(tx, ty);
                      if (childTlist.numberOfItems) {
                        childTlist.insertItemBefore(newxlate, 0);
                      } else {
                        childTlist.appendItem(newxlate);
                      }
                      batchCmd.addSubCommand(svgedit.recalculate.recalculateDimensions(child));
                      // If any <use> have this group as a parent and are 
                      // referencing this child, then impose a reverse translate on it
                      // so that when it won't get double-translated
                      var uses = selected.getElementsByTagNameNS(NS.SVG, 'use');
                      var href = '#' + child.id;
                      var u = uses.length;
                      while (u--) {
                        var useElem = uses.item(u);
                        if (href == svgedit.utilities.getHref(useElem)) {
                          var usexlate = svgroot.createSVGTransform();
                          usexlate.setTranslate(-tx,-ty);
                          svgedit.transformlist.getTransformList(useElem).insertItemBefore(usexlate, 0);
                          batchCmd.addSubCommand( svgedit.recalculate.recalculateDimensions(useElem) );
                        }
                      }
                      context_.setStartTransform(oldStartTransform);
                    }
                  }
                }
                
                clipPaths_done = [];
                context_.setStartTransform(oldStartTransform);
              }
            }
            // else, a matrix imposition from a parent group
            // keep pushing it down to the children
            else if (N == 1 && tlist.getItem(0).type == 1 && !gangle) {
              operation = 1;
              var m = tlist.getItem(0).matrix,
                children = selected.childNodes,
                c = children.length;
              while (c--) {
                var child = children.item(c);
                if (child.nodeType == 1) {
                  var oldStartTransform = context_.getStartTransform();
                  context_.setStartTransform(child.getAttribute('transform'));
                  var childTlist = svgedit.transformlist.getTransformList(child);
                  
                  if (!childTlist) {continue;}
                  
                  var em = svgedit.math.matrixMultiply(m, svgedit.math.transformListToTransform(childTlist).matrix);
                  var e2m = svgroot.createSVGTransform();
                  e2m.setMatrix(em);
                  childTlist.clear();
                  childTlist.appendItem(e2m, 0);
                  
                  batchCmd.addSubCommand( svgedit.recalculate.recalculateDimensions(child) );
                  context_.setStartTransform(oldStartTransform);
                  
                  // Convert stroke
                  // TODO: Find out if this should actually happen somewhere else
                  var sw = child.getAttribute('stroke-width');
                  if (child.getAttribute('stroke') !== 'none' && !isNaN(sw)) {
                    var avg = (Math.abs(em.a) + Math.abs(em.d)) / 2;
                    child.setAttribute('stroke-width', sw * avg);
                  }
        
                }
              }
              tlist.clear();
            }
            // else it was just a rotate
            else {
              if (gangle) {
                var newRot = svgroot.createSVGTransform();
                newRot.setRotate(gangle, newcenter.x, newcenter.y);
                if (tlist.numberOfItems) {
                  tlist.insertItemBefore(newRot, 0);
                } else {
                  tlist.appendItem(newRot);
                }
              }
              if (tlist.numberOfItems == 0) {
                selected.removeAttribute('transform');
              }
              return null;      
            }
            
            // if it was a translate, put back the rotate at the new center
            if (operation == 2) {
              if (gangle) {
                newcenter = {
                  x: oldcenter.x + first_m.e,
                  y: oldcenter.y + first_m.f
                };
              
                var newRot = svgroot.createSVGTransform();
                newRot.setRotate(gangle, newcenter.x, newcenter.y);
                if (tlist.numberOfItems) {
                  tlist.insertItemBefore(newRot, 0);
                } else {
                  tlist.appendItem(newRot);
                }
              }
            }
            // if it was a resize
            else if (operation == 3) {
              var m = svgedit.math.transformListToTransform(tlist).matrix;
              var roldt = svgroot.createSVGTransform();
              roldt.setRotate(gangle, oldcenter.x, oldcenter.y);
              var rold = roldt.matrix;
              var rnew = svgroot.createSVGTransform();
              rnew.setRotate(gangle, newcenter.x, newcenter.y);
              var rnew_inv = rnew.matrix.inverse(),
                m_inv = m.inverse(),
                extrat = svgedit.math.matrixMultiply(m_inv, rnew_inv, rold, m);
        
              tx = extrat.e;
              ty = extrat.f;
        
              if (tx != 0 || ty != 0) {
                // now push this transform down to the children
                // we pass the translates down to the individual children
                var children = selected.childNodes;
                var c = children.length;
                while (c--) {
                  var child = children.item(c);
                  if (child.nodeType == 1) {
                    var oldStartTransform = context_.getStartTransform();
                    context_.setStartTransform(child.getAttribute('transform'));
                    var childTlist = svgedit.transformlist.getTransformList(child);
                    var newxlate = svgroot.createSVGTransform();
                    newxlate.setTranslate(tx, ty);
                    if (childTlist.numberOfItems) {
                      childTlist.insertItemBefore(newxlate, 0);
                    } else {
                      childTlist.appendItem(newxlate);
                    }
        
                    batchCmd.addSubCommand( svgedit.recalculate.recalculateDimensions(child) );
                    context_.setStartTransform(oldStartTransform);
                  }
                }
              }
              
              if (gangle) {
                if (tlist.numberOfItems) {
                  tlist.insertItemBefore(rnew, 0);
                } else {
                  tlist.appendItem(rnew);
                }
              }
            }
          }
          // else, it's a non-group
          else {
        
            // FIXME: box might be null for some elements (<metadata> etc), need to handle this
            var box = svgedit.utilities.getBBox(selected);
        
            // Paths (and possbly other shapes) will have no BBox while still in <defs>,
            // but we still may need to recalculate them (see issue 595).
            // TODO: Figure out how to get BBox from these elements in case they
            // have a rotation transform
            
            if (!box && selected.tagName != 'path') return null;
            
        
            var m = svgroot.createSVGMatrix(),
              // temporarily strip off the rotate and save the old center
              angle = svgedit.utilities.getRotationAngle(selected);
            if (angle) {
              var oldcenter = {x: box.x+box.width/2, y: box.y+box.height/2},
              newcenter = svgedit.math.transformPoint(box.x+box.width/2, box.y+box.height/2,
                      svgedit.math.transformListToTransform(tlist).matrix);
            
              var a = angle * Math.PI / 180;
              if ( Math.abs(a) > (1.0e-10) ) {
                var s = Math.sin(a)/(1 - Math.cos(a));
              } else {
                // FIXME: This blows up if the angle is exactly 0!
                var s = 2/a;
              }
              for (var i = 0; i < tlist.numberOfItems; ++i) {
                var xform = tlist.getItem(i);
                if (xform.type == 4) {
                  // extract old center through mystical arts
                  var rm = xform.matrix;
                  oldcenter.y = (s*rm.e + rm.f)/2;
                  oldcenter.x = (rm.e - s*rm.f)/2;
                  tlist.removeItem(i);
                  break;
                }
              }
            }
            
            // 2 = translate, 3 = scale, 4 = rotate, 1 = matrix imposition
            var operation = 0;
            var N = tlist.numberOfItems;
            
            // Check if it has a gradient with userSpaceOnUse, in which case
            // adjust it by recalculating the matrix transform.
            // TODO: Make this work in Webkit using svgedit.transformlist.SVGTransformList
            if (!svgedit.browser.isWebkit()) {
              var fill = selected.getAttribute('fill');
              if (fill && fill.indexOf('url(') === 0) {
                var paint = getRefElem(fill);
                var type = 'pattern';
                if (paint.tagName !== type) type = 'gradient';
                var attrVal = paint.getAttribute(type + 'Units');
                if (attrVal === 'userSpaceOnUse') {
                  //Update the userSpaceOnUse element
                  m = svgedit.math.transformListToTransform(tlist).matrix;
                  var gtlist = svgedit.transformlist.getTransformList(paint);
                  var gmatrix = svgedit.math.transformListToTransform(gtlist).matrix;
                  m = svgedit.math.matrixMultiply(m, gmatrix);
                  var m_str = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')';
                  paint.setAttribute(type + 'Transform', m_str);
                }
              }
            }
        
            // first, if it was a scale of a non-skewed element, then the second-last  
            // transform will be the [S]
            // if we had [M][T][S][T] we want to extract the matrix equivalent of
            // [T][S][T] and push it down to the element
            if (N >= 3 && tlist.getItem(N-2).type == 3 && 
              tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2) 
              
              // Removed this so a <use> with a given [T][S][T] would convert to a matrix. 
              // Is that bad?
              //  && selected.nodeName != 'use'
            {
              operation = 3; // scale
              m = svgedit.math.transformListToTransform(tlist, N-3, N-1).matrix;
              tlist.removeItem(N-1);
              tlist.removeItem(N-2);
              tlist.removeItem(N-3);
            } // if we had [T][S][-T][M], then this was a skewed element being resized
            // Thus, we simply combine it all into one matrix
            else if (N == 4 && tlist.getItem(N-1).type == 1) {
              operation = 3; // scale
              m = svgedit.math.transformListToTransform(tlist).matrix;
              var e2t = svgroot.createSVGTransform();
              e2t.setMatrix(m);
              tlist.clear();
              tlist.appendItem(e2t);
              // reset the matrix so that the element is not re-mapped
              m = svgroot.createSVGMatrix();
            } // if we had [R][T][S][-T][M], then this was a rotated matrix-element  
            // if we had [T1][M] we want to transform this into [M][T2]
            // therefore [ T2 ] = [ M_inv ] [ T1 ] [ M ] and we can push [T2] 
            // down to the element
            else if ( (N == 1 || (N > 1 && tlist.getItem(1).type != 3)) && 
              tlist.getItem(0).type == 2) 
            {
              operation = 2; // translate
              var oldxlate = tlist.getItem(0).matrix,
                meq = svgedit.math.transformListToTransform(tlist,1).matrix,
                meq_inv = meq.inverse();
              m = svgedit.math.matrixMultiply( meq_inv, oldxlate, meq );
              tlist.removeItem(0);
            }
            // else if this child now has a matrix imposition (from a parent group)
            // we might be able to simplify
            else if (N == 1 && tlist.getItem(0).type == 1 && !angle) {
              // Remap all point-based elements
              m = svgedit.math.transformListToTransform(tlist).matrix;
              switch (selected.tagName) {
                case 'line':
                  changes = $(selected).attr(['x1', 'y1', 'x2', 'y2']);
                case 'polyline':
                case 'polygon':
                  changes.points = selected.getAttribute('points');
                  if (changes.points) {
                    var list = selected.points;
                    var len = list.numberOfItems;
                    changes.points = new Array(len);
                    for (var i = 0; i < len; ++i) {
                      var pt = list.getItem(i);
                      changes.points[i] = {x:pt.x, y:pt.y};
                    }
                  }
                case 'path':
                  changes.d = selected.getAttribute('d');
                  operation = 1;
                  tlist.clear();
                  break;
                default:
                  break;
              }
            }
            // if it was a rotation, put the rotate back and return without a command
            // (this function has zero work to do for a rotate())
            else {
              operation = 4; // rotation
              if (angle) {
                var newRot = svgroot.createSVGTransform();
                newRot.setRotate(angle, newcenter.x, newcenter.y);
                
                if (tlist.numberOfItems) {
                  tlist.insertItemBefore(newRot, 0);
                } else {
                  tlist.appendItem(newRot);
                }
              }
              if (tlist.numberOfItems == 0) {
                selected.removeAttribute('transform');
              }
              return null;
            }
            
            // if it was a translate or resize, we need to remap the element and absorb the xform
            if (operation == 1 || operation == 2 || operation == 3) {
              svgedit.coords.remapElement(selected, changes, m);
            } // if we are remapping
            
            // if it was a translate, put back the rotate at the new center
            if (operation == 2) {
              if (angle) {
                if (!svgedit.math.hasMatrixTransform(tlist)) {
                  newcenter = {
                    x: oldcenter.x + m.e,
                    y: oldcenter.y + m.f
                  };
                }
                var newRot = svgroot.createSVGTransform();
                newRot.setRotate(angle, newcenter.x, newcenter.y);
                if (tlist.numberOfItems) {
                  tlist.insertItemBefore(newRot, 0);
                } else {
                  tlist.appendItem(newRot);
                }
              }
              // We have special processing for tspans:  Tspans are not transformable
              // but they can have x,y coordinates (sigh).  Thus, if this was a translate,
              // on a text element, also translate any tspan children.
              if (selected.tagName == 'text') {
                var children = selected.childNodes;
                var c = children.length;
                while (c--) {
                  var child = children.item(c);
                  if (child.tagName == 'tspan') {
                    var tspanChanges = {
                      x: $(child).attr('x') || 0,
                      y: $(child).attr('y') || 0
                    };
                    svgedit.coords.remapElement(child, tspanChanges, m);
                  }
                }
              }
            }
            // [Rold][M][T][S][-T] became [Rold][M]
            // we want it to be [Rnew][M][Tr] where Tr is the
            // translation required to re-center it
            // Therefore, [Tr] = [M_inv][Rnew_inv][Rold][M]
            else if (operation == 3 && angle) {
              var m = svgedit.math.transformListToTransform(tlist).matrix;
              var roldt = svgroot.createSVGTransform();
              roldt.setRotate(angle, oldcenter.x, oldcenter.y);
              var rold = roldt.matrix;
              var rnew = svgroot.createSVGTransform();
              rnew.setRotate(angle, newcenter.x, newcenter.y);
              var rnew_inv = rnew.matrix.inverse();
              var m_inv = m.inverse();
              var extrat = svgedit.math.matrixMultiply(m_inv, rnew_inv, rold, m);
            
              svgedit.coords.remapElement(selected, changes, extrat);
              if (angle) {
                if (tlist.numberOfItems) {
                  tlist.insertItemBefore(rnew, 0);
                } else {
                  tlist.appendItem(rnew);
                }
              }
            }
          } // a non-group
        
          // if the transform list has been emptied, remove it
          if (tlist.numberOfItems == 0) {
            selected.removeAttribute('transform');
          }
        
          batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(selected, initial));
        
          return batchCmd;
        };
        })();
        
      • sanitize.js
        /*globals $, svgedit*/
        /*jslint vars: true, eqeq: true*/
        /**
         * Package: svgedit.sanitize
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) browser.js
        // 3) svgutils.js
        
        (function() {'use strict';
        
        if (!svgedit.sanitize) {
          svgedit.sanitize = {};
        }
        
        var NS = svgedit.NS,
          REVERSE_NS = svgedit.getReverseNS();
        
        // this defines which elements and attributes that we support
        var svgWhiteList_ = {
          // SVG Elements
          "a": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "xlink:href", "xlink:title"],
          "circle": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "r", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
          "clipPath": ["class", "clipPathUnits", "id"],
          "defs": [],
          "style" : ["type"],
          "desc": [],
          "ellipse": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
          "feGaussianBlur": ["class", "color-interpolation-filters", "id", "requiredFeatures", "stdDeviation"],
          "filter": ["class", "color-interpolation-filters", "filterRes", "filterUnits", "height", "id", "primitiveUnits", "requiredFeatures", "width", "x", "xlink:href", "y"],
          "foreignObject": ["class", "font-size", "height", "id", "opacity", "requiredFeatures", "style", "transform", "width", "x", "y"],
          "g": ["class", "clip-path", "clip-rule", "id", "display", "fill", "fill-opacity", "fill-rule", "filter", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "font-family", "font-size", "font-style", "font-weight", "text-anchor"],
          "image": ["class", "clip-path", "clip-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "style", "systemLanguage", "transform", "width", "x", "xlink:href", "xlink:title", "y"],
          "line": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "x1", "x2", "y1", "y2"],
          "linearGradient": ["class", "id", "gradientTransform", "gradientUnits", "requiredFeatures", "spreadMethod", "systemLanguage", "x1", "x2", "xlink:href", "y1", "y2"],
          "marker": ["id", "class", "markerHeight", "markerUnits", "markerWidth", "orient", "preserveAspectRatio", "refX", "refY", "systemLanguage", "viewBox"],
          "mask": ["class", "height", "id", "maskContentUnits", "maskUnits", "width", "x", "y"],
          "metadata": ["class", "id"],
          "path": ["class", "clip-path", "clip-rule", "d", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
          "pattern": ["class", "height", "id", "patternContentUnits", "patternTransform", "patternUnits", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xlink:href", "y"],
          "polygon": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "id", "class", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
          "polyline": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
          "radialGradient": ["class", "cx", "cy", "fx", "fy", "gradientTransform", "gradientUnits", "id", "r", "requiredFeatures", "spreadMethod", "systemLanguage", "xlink:href"],
          "rect": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "width", "x", "y"],
          "stop": ["class", "id", "offset", "requiredFeatures", "stop-color", "stop-opacity", "style", "systemLanguage"],
          "svg": ["class", "clip-path", "clip-rule", "filter", "id", "height", "mask", "preserveAspectRatio", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xmlns", "xmlns:se", "xmlns:xlink", "y"],
          "switch": ["class", "id", "requiredFeatures", "systemLanguage"],
          "symbol": ["class", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "opacity", "preserveAspectRatio", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "viewBox"],
          "text": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "transform", "x", "xml:space", "y"],
          "textPath": ["class", "id", "method", "requiredFeatures", "spacing", "startOffset", "style", "systemLanguage", "transform", "xlink:href"],
          "title": [],
          "tspan": ["class", "clip-path", "clip-rule", "dx", "dy", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "rotate", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "textLength", "transform", "x", "xml:space", "y"],
          "use": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "transform", "width", "x", "xlink:href", "y"],
        
          // MathML Elements
          "annotation": ["encoding"],
          "annotation-xml": ["encoding"],
          "maction": ["actiontype", "other", "selection"],
          "math": ["class", "id", "display", "xmlns"],
          "menclose": ["notation"],
          "merror": [],
          "mfrac": ["linethickness"],
          "mi": ["mathvariant"],
          "mmultiscripts": [],
          "mn": [],
          "mo": ["fence", "lspace", "maxsize", "minsize", "rspace", "stretchy"],
          "mover": [],
          "mpadded": ["lspace", "width", "height", "depth", "voffset"],
          "mphantom": [],
          "mprescripts": [],
          "mroot": [],
          "mrow": ["xlink:href", "xlink:type", "xmlns:xlink"],
          "mspace": ["depth", "height", "width"],
          "msqrt": [],
          "mstyle": ["displaystyle", "mathbackground", "mathcolor", "mathvariant", "scriptlevel"],
          "msub": [],
          "msubsup": [],
          "msup": [],
          "mtable": ["align", "columnalign", "columnlines", "columnspacing", "displaystyle", "equalcolumns", "equalrows", "frame", "rowalign", "rowlines", "rowspacing", "width"],
          "mtd": ["columnalign", "columnspan", "rowalign", "rowspan"],
          "mtext": [],
          "mtr": ["columnalign", "rowalign"],
          "munder": [],
          "munderover": [],
          "none": [],
          "semantics": []
        };
        
        // Produce a Namespace-aware version of svgWhitelist
        var svgWhiteListNS_ = {};
        $.each(svgWhiteList_, function(elt, atts){
          var attNS = {};
          $.each(atts, function(i, att){
            if (att.indexOf(':') >= 0) {
              var v = att.split(':');
              attNS[v[1]] = NS[(v[0]).toUpperCase()];
            } else {
              attNS[att] = att == 'xmlns' ? NS.XMLNS : null;
            }
          });
          svgWhiteListNS_[elt] = attNS;
        });
        
        // Function: svgedit.sanitize.sanitizeSvg
        // Sanitizes the input node and its children
        // It only keeps what is allowed from our whitelist defined above
        //
        // Parameters:
        // node - The DOM element to be checked (we'll also check its children)
        svgedit.sanitize.sanitizeSvg = function(node) {
          // Cleanup text nodes
          if (node.nodeType == 3) { // 3 == TEXT_NODE
            // Trim whitespace
            node.nodeValue = node.nodeValue.replace(/^\s+|\s+$/g, '');
            // Remove if empty
            if (node.nodeValue.length === 0) {
              node.parentNode.removeChild(node);
            }
          }
        
          // We only care about element nodes.
          // Automatically return for all non-element nodes, such as comments, etc.
          if (node.nodeType != 1) { // 1 == ELEMENT_NODE
            return;
          }
        
          var doc = node.ownerDocument;
          var parent = node.parentNode;
          // can parent ever be null here?  I think the root node's parent is the document...
          if (!doc || !parent) {
            return;
          }
        
          var allowedAttrs = svgWhiteList_[node.nodeName];
          var allowedAttrsNS = svgWhiteListNS_[node.nodeName];
          var i;
          // if this element is supported, sanitize it
          if (typeof allowedAttrs !== 'undefined') {
        
            var seAttrs = [];
            i = node.attributes.length;
            while (i--) {
              // if the attribute is not in our whitelist, then remove it
              // could use jQuery's inArray(), but I don't know if that's any better
              var attr = node.attributes.item(i);
              var attrName = attr.nodeName;
              var attrLocalName = attr.localName;
              var attrNsURI = attr.namespaceURI;
              // Check that an attribute with the correct localName in the correct namespace is on 
              // our whitelist or is a namespace declaration for one of our allowed namespaces
              if (!(allowedAttrsNS.hasOwnProperty(attrLocalName) && attrNsURI == allowedAttrsNS[attrLocalName] && attrNsURI != NS.XMLNS) &&
                !(attrNsURI == NS.XMLNS && REVERSE_NS[attr.value]) )
              {
                // TODO(codedread): Programmatically add the se: attributes to the NS-aware whitelist.
                // Bypassing the whitelist to allow se: prefixes.
                // Is there a more appropriate way to do this?
                if (attrName.indexOf('se:') === 0) {
                  seAttrs.push([attrName, attr.value]);
                }
                node.removeAttributeNS(attrNsURI, attrLocalName);
              }
        
              // Add spaces before negative signs where necessary
              if (svgedit.browser.isGecko()) {
                switch (attrName) {
                case 'transform':
                case 'gradientTransform':
                case 'patternTransform':
                  var val = attr.value.replace(/(\d)-/g, '$1 -');
                  node.setAttribute(attrName, val);
                  break;
                }
              }
        
              // For the style attribute, rewrite it in terms of XML presentational attributes
              if (attrName == 'style') {
                var props = attr.value.split(';'),
                  p = props.length;
                while (p--) {
                  var nv = props[p].split(':');
                  var styleAttrName = $.trim(nv[0]);
                  var styleAttrVal = $.trim(nv[1]);
                  // Now check that this attribute is supported
                  if (allowedAttrs.indexOf(styleAttrName) >= 0) {
                    node.setAttribute(styleAttrName, styleAttrVal);
                  }
                }
                node.removeAttribute('style');
              }
            }
        
            $.each(seAttrs, function(i, attr) {
              node.setAttributeNS(NS.SE, attr[0], attr[1]);
            });
        
            // for some elements that have a xlink:href, ensure the URI refers to a local element
            // (but not for links)
            var href = svgedit.utilities.getHref(node);
            if (href &&
              ['filter', 'linearGradient', 'pattern',
              'radialGradient', 'textPath', 'use'].indexOf(node.nodeName) >= 0) {
              // TODO: we simply check if the first character is a #, is this bullet-proof?
              if (href[0] != '#') {
                // remove the attribute (but keep the element)
                svgedit.utilities.setHref(node, '');
                node.removeAttributeNS(NS.XLINK, 'href');
              }
            }
        
            // Safari crashes on a <use> without a xlink:href, so we just remove the node here
            if (node.nodeName == 'use' && !svgedit.utilities.getHref(node)) {
              parent.removeChild(node);
              return;
            }
            // if the element has attributes pointing to a non-local reference,
            // need to remove the attribute
            $.each(['clip-path', 'fill', 'filter', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'stroke'], function(i, attr) {
              var val = node.getAttribute(attr);
              if (val) {
                val = svgedit.utilities.getUrlFromAttr(val);
                // simply check for first character being a '#'
                if (val && val[0] !== '#') {
                  node.setAttribute(attr, '');
                  node.removeAttribute(attr);
                }
              }
            });
        
            // recurse to children
            i = node.childNodes.length;
            while (i--) { svgedit.sanitize.sanitizeSvg(node.childNodes.item(i)); }
          }
          // else (element not supported), remove it
          else {
            // remove all children from this node and insert them before this node
            // FIXME: in the case of animation elements this will hardly ever be correct
            var children = [];
            while (node.hasChildNodes()) {
              children.push(parent.insertBefore(node.firstChild, node));
            }
        
            // remove this node from the document altogether
            parent.removeChild(node);
        
            // call sanitizeSvg on each of those children
            i = children.length;
            while (i--) { svgedit.sanitize.sanitizeSvg(children[i]); }
          }
        };
        
        }());
        
      • select.js
        /*globals $, svgedit*/
        /*jslint vars: true, eqeq: true, forin: true*/
        /**
         * Package: svedit.select
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) browser.js
        // 3) math.js
        // 4) svgutils.js
        
        (function() {'use strict';
        
        if (!svgedit.select) {
        	svgedit.select = {};
        }
        
        var svgFactory_;
        var config_;
        var selectorManager_; // A Singleton
        var gripRadius = svgedit.browser.isTouch() ? 10 : 4;
        
        // Class: svgedit.select.Selector
        // Private class for DOM element selection boxes
        //
        // Parameters:
        // id - integer to internally indentify the selector
        // elem - DOM element associated with this selector
        svgedit.select.Selector = function(id, elem) {
        	// this is the selector's unique number
        	this.id = id;
        
        	// this holds a reference to the element for which this selector is being used
        	this.selectedElement = elem;
        
        	// this is a flag used internally to track whether the selector is being used or not
        	this.locked = true;
        
        	// this holds a reference to the <g> element that holds all visual elements of the selector
        	this.selectorGroup = svgFactory_.createSVGElement({
        		'element': 'g',
        		'attr': {'id': ('selectorGroup' + this.id)}
        	});
        
        	// this holds a reference to the path rect
        	this.selectorRect = this.selectorGroup.appendChild(
        		svgFactory_.createSVGElement({
        			'element': 'path',
        			'attr': {
        				'id': ('selectedBox' + this.id),
        				'fill': 'none',
        				'stroke': '#22C',
        				'stroke-width': '1',
        				'stroke-dasharray': '5,5',
        				// need to specify this so that the rect is not selectable
        				'style': 'pointer-events:none'
        			}
        		})
        	);
        
        	// this holds a reference to the grip coordinates for this selector
        	this.gripCoords = {
        		'nw': null,
        		'n' : null,
        		'ne': null,
        		'e' : null,
        		'se': null,
        		's' : null,
        		'sw': null,
        		'w' : null
        	};
        
        	this.reset(this.selectedElement);
        };
        
        
        // Function: svgedit.select.Selector.reset
        // Used to reset the id and element that the selector is attached to
        //
        // Parameters:
        // e - DOM element associated with this selector
        svgedit.select.Selector.prototype.reset = function(e) {
        	this.locked = true;
        	this.selectedElement = e;
        	this.resize();
        	this.selectorGroup.setAttribute('display', 'inline');
        };
        
        // Function: svgedit.select.Selector.updateGripCursors
        // Updates cursors for corner grips on rotation so arrows point the right way
        //
        // Parameters:
        // angle - Float indicating current rotation angle in degrees
        svgedit.select.Selector.prototype.updateGripCursors = function(angle) {
        	var dir,
        		dir_arr = [],
        		steps = Math.round(angle / 45);
        	if (steps < 0) {steps += 8;}
        	for (dir in selectorManager_.selectorGrips) {
        		dir_arr.push(dir);
        	}
        	while (steps > 0) {
        		dir_arr.push(dir_arr.shift());
        		steps--;
        	}
        	var i = 0;
        	for (dir in selectorManager_.selectorGrips) {
        		selectorManager_.selectorGrips[dir].setAttribute('style', ('cursor:' + dir_arr[i] + '-resize'));
        		i++;
        	}
        };
        
        // Function: svgedit.select.Selector.showGrips
        // Show the resize grips of this selector
        //
        // Parameters:
        // show - boolean indicating whether grips should be shown or not
        svgedit.select.Selector.prototype.showGrips = function(show) {
        	// TODO: use suspendRedraw() here
        	var bShow = show ? 'inline' : 'none';
        	selectorManager_.selectorGripsGroup.setAttribute('display', bShow);
        	var elem = this.selectedElement;
        	this.hasGrips = show;
        	if (elem && show) {
        		this.selectorGroup.appendChild(selectorManager_.selectorGripsGroup);
        		this.updateGripCursors(svgedit.utilities.getRotationAngle(elem));
        	}
        };
        
        // Function: svgedit.select.Selector.resize
        // Updates the selector to match the element's size
        svgedit.select.Selector.prototype.resize = function() {
        	var selectedBox = this.selectorRect,
        		mgr = selectorManager_,
        		selectedGrips = mgr.selectorGrips,
        		selected = this.selectedElement,
        		sw = selected.getAttribute('stroke-width'),
        		current_zoom = svgFactory_.currentZoom();
        	var offset = 1/current_zoom;
        	if (selected.getAttribute('stroke') !== 'none' && !isNaN(sw)) {
        		offset += (sw/2);
        	}
        
        	var tagName = selected.tagName;
        	if (tagName === 'text') {
        		offset += 2/current_zoom;
        	}
        
        	// loop and transform our bounding box until we reach our first rotation
        	var tlist = svgedit.transformlist.getTransformList(selected);
        	var m = svgedit.math.transformListToTransform(tlist).matrix;
        
        	// This should probably be handled somewhere else, but for now
        	// it keeps the selection box correctly positioned when zoomed
        	m.e *= current_zoom;
        	m.f *= current_zoom;
        
        	var bbox = svgedit.utilities.getBBox(selected);
        	if (tagName === 'g' && !$.data(selected, 'gsvg')) {
        		// The bbox for a group does not include stroke vals, so we
        		// get the bbox based on its children.
        		var stroked_bbox = svgFactory_.getStrokedBBox(selected.childNodes);
        		if (stroked_bbox) {
        			bbox = stroked_bbox;
        		}
        	}
        
        	// apply the transforms
        	var l = bbox.x, t = bbox.y, w = bbox.width, h = bbox.height;
        	bbox = {x:l, y:t, width:w, height:h};
        
        	// we need to handle temporary transforms too
        	// if skewed, get its transformed box, then find its axis-aligned bbox
        
        	//*
        	offset *= current_zoom;
        
        	var nbox = svgedit.math.transformBox(l*current_zoom, t*current_zoom, w*current_zoom, h*current_zoom, m),
        		aabox = nbox.aabox,
        		nbax = aabox.x - offset,
        		nbay = aabox.y - offset,
        		nbaw = aabox.width + (offset * 2),
        		nbah = aabox.height + (offset * 2);
        
        	// now if the shape is rotated, un-rotate it
        	var cx = nbax + nbaw/2,
        		cy = nbay + nbah/2;
        
        	var angle = svgedit.utilities.getRotationAngle(selected);
        	if (angle) {
        		var rot = svgFactory_.svgRoot().createSVGTransform();
        		rot.setRotate(-angle, cx, cy);
        		var rotm = rot.matrix;
        		nbox.tl = svgedit.math.transformPoint(nbox.tl.x, nbox.tl.y, rotm);
        		nbox.tr = svgedit.math.transformPoint(nbox.tr.x, nbox.tr.y, rotm);
        		nbox.bl = svgedit.math.transformPoint(nbox.bl.x, nbox.bl.y, rotm);
        		nbox.br = svgedit.math.transformPoint(nbox.br.x, nbox.br.y, rotm);
        
        		// calculate the axis-aligned bbox
        		var tl = nbox.tl;
        		var minx = tl.x,
        			miny = tl.y,
        			maxx = tl.x,
        			maxy = tl.y;
        
        		var min = Math.min, max = Math.max;
        
        		minx = min(minx, min(nbox.tr.x, min(nbox.bl.x, nbox.br.x) ) ) - offset;
        		miny = min(miny, min(nbox.tr.y, min(nbox.bl.y, nbox.br.y) ) ) - offset;
        		maxx = max(maxx, max(nbox.tr.x, max(nbox.bl.x, nbox.br.x) ) ) + offset;
        		maxy = max(maxy, max(nbox.tr.y, max(nbox.bl.y, nbox.br.y) ) ) + offset;
        
        		nbax = minx;
        		nbay = miny;
        		nbaw = (maxx-minx);
        		nbah = (maxy-miny);
        	}
        	var sr_handle = svgFactory_.svgRoot().suspendRedraw(100);
        
        	var dstr = 'M' + nbax + ',' + nbay
        				+ ' L' + (nbax+nbaw) + ',' + nbay
        				+ ' ' + (nbax+nbaw) + ',' + (nbay+nbah)
        				+ ' ' + nbax + ',' + (nbay+nbah) + 'z';
        	selectedBox.setAttribute('d', dstr);
        
        	var xform = angle ? 'rotate(' + [angle, cx, cy].join(',') + ')' : '';
        	this.selectorGroup.setAttribute('transform', xform);
        
        	// TODO(codedread): Is this if needed?
        //	if (selected === selectedElements[0]) {
        		this.gripCoords = {
        			'nw': [nbax, nbay],
        			'ne': [nbax+nbaw, nbay],
        			'sw': [nbax, nbay+nbah],
        			'se': [nbax+nbaw, nbay+nbah],
        			'n':  [nbax + (nbaw)/2, nbay],
        			'w':	[nbax, nbay + (nbah)/2],
        			'e':	[nbax + nbaw, nbay + (nbah)/2],
        			's':	[nbax + (nbaw)/2, nbay + nbah]
        		};
        		var dir;
        		for (dir in this.gripCoords) {
        			var coords = this.gripCoords[dir];
        			selectedGrips[dir].setAttribute('cx', coords[0]);
        			selectedGrips[dir].setAttribute('cy', coords[1]);
        		}
        
        		// we want to go 20 pixels in the negative transformed y direction, ignoring scale
        		mgr.rotateGripConnector.setAttribute('x1', nbax + (nbaw)/2);
        		mgr.rotateGripConnector.setAttribute('y1', nbay);
        		mgr.rotateGripConnector.setAttribute('x2', nbax + (nbaw)/2);
        		mgr.rotateGripConnector.setAttribute('y2', nbay - (gripRadius*5));
        
        		mgr.rotateGrip.setAttribute('cx', nbax + (nbaw)/2);
        		mgr.rotateGrip.setAttribute('cy', nbay - (gripRadius*5));
        //	}
        
        	svgFactory_.svgRoot().unsuspendRedraw(sr_handle);
        };
        
        
        // Class: svgedit.select.SelectorManager
        svgedit.select.SelectorManager = function() {
        	// this will hold the <g> element that contains all selector rects/grips
        	this.selectorParentGroup = null;
        
        	// this is a special rect that is used for multi-select
        	this.rubberBandBox = null;
        
        	// this will hold objects of type svgedit.select.Selector (see above)
        	this.selectors = [];
        
        	// this holds a map of SVG elements to their Selector object
        	this.selectorMap = {};
        
        	// this holds a reference to the grip elements
        	this.selectorGrips = {
        		'nw': null,
        		'n' :  null,
        		'ne': null,
        		'e' :  null,
        		'se': null,
        		's' :  null,
        		'sw': null,
        		'w' :  null
        	};
        
        	this.selectorGripsGroup = null;
        	this.rotateGripConnector = null;
        	this.rotateGrip = null;
        
        	this.initGroup();
        };
        
        // Function: svgedit.select.SelectorManager.initGroup
        // Resets the parent selector group element
        svgedit.select.SelectorManager.prototype.initGroup = function() {
        	// remove old selector parent group if it existed
        	if (this.selectorParentGroup && this.selectorParentGroup.parentNode) {
        		this.selectorParentGroup.parentNode.removeChild(this.selectorParentGroup);
        	}
        
        	// create parent selector group and add it to svgroot
        	this.selectorParentGroup = svgFactory_.createSVGElement({
        		'element': 'g',
        		'attr': {'id': 'selectorParentGroup'}
        	});
        	this.selectorGripsGroup = svgFactory_.createSVGElement({
        		'element': 'g',
        		'attr': {'display': 'none'}
        	});
        	this.selectorParentGroup.appendChild(this.selectorGripsGroup);
        	svgFactory_.svgRoot().appendChild(this.selectorParentGroup);
        
        	this.selectorMap = {};
        	this.selectors = [];
        	this.rubberBandBox = null;
        
        	// add the corner grips
        	var dir;
        	for (dir in this.selectorGrips) {
        		var grip = svgFactory_.createSVGElement({
        			'element': 'circle',
        			'attr': {
        				'id': ('selectorGrip_resize_' + dir),
        				'fill': '#22C',
        				'r': gripRadius,
        				'style': ('cursor:' + dir + '-resize'),
        				// This expands the mouse-able area of the grips making them
        				// easier to grab with the mouse.
        				// This works in Opera and WebKit, but does not work in Firefox
        				// see https://bugzilla.mozilla.org/show_bug.cgi?id=500174
        				'stroke-width': 2,
        				'pointer-events': 'all'
        			}
        		});
        
        		$.data(grip, 'dir', dir);
        		$.data(grip, 'type', 'resize');
        		this.selectorGrips[dir] = this.selectorGripsGroup.appendChild(grip);
        	}
        
        	// add rotator elems
        	this.rotateGripConnector = this.selectorGripsGroup.appendChild(
        		svgFactory_.createSVGElement({
        			'element': 'line',
        			'attr': {
        				'id': ('selectorGrip_rotateconnector'),
        				'stroke': '#22C',
        				'stroke-width': '1'
        			}
        		})
        	);
        
        	this.rotateGrip = this.selectorGripsGroup.appendChild(
        		svgFactory_.createSVGElement({
        			'element': 'circle',
        			'attr': {
        				'id': 'selectorGrip_rotate',
        				'fill': 'lime',
        				'r': gripRadius,
        				'stroke': '#22C',
        				'stroke-width': 2,
        				'style': 'cursor:url(' + config_.imgPath + 'rotate.png) 12 12, auto;'
        			}
        		})
        	);
        	$.data(this.rotateGrip, 'type', 'rotate');
        
        	if ($('#canvasBackground').length) {return;}
        
        	var dims = config_.dimensions;
        	var canvasbg = svgFactory_.createSVGElement({
        		'element': 'svg',
        		'attr': {
        			'id': 'canvasBackground',
        			'width': dims[0],
        			'height': dims[1],
        			'x': 0,
        			'y': 0,
        			'overflow': (svgedit.browser.isWebkit() ? 'none' : 'visible'), // Chrome 7 has a problem with this when zooming out
        			'style': 'pointer-events:none'
        		}
        	});
        
        	var rect = svgFactory_.createSVGElement({
        		'element': 'rect',
        		'attr': {
        			'width': '100%',
        			'height': '100%',
        			'x': 0,
        			'y': 0,
        			'stroke-width': 1,
        			'stroke': '#000',
        			'fill': '#FFF',
        			'style': 'pointer-events:none'
        		}
        	});
        
        	// Both Firefox and WebKit are too slow with this filter region (especially at higher
        	// zoom levels) and Opera has at least one bug
        //	if (!svgedit.browser.isOpera()) rect.setAttribute('filter', 'url(#canvashadow)');
        	canvasbg.appendChild(rect);
        	svgFactory_.svgRoot().insertBefore(canvasbg, svgFactory_.svgContent());
        };
        
        // Function: svgedit.select.SelectorManager.requestSelector
        // Returns the selector based on the given element
        //
        // Parameters:
        // elem - DOM element to get the selector for
        svgedit.select.SelectorManager.prototype.requestSelector = function(elem) {
        	if (elem == null) {return null;}
        	var i,
        		N = this.selectors.length;
        	// If we've already acquired one for this element, return it.
        	if (typeof(this.selectorMap[elem.id]) == 'object') {
        		this.selectorMap[elem.id].locked = true;
        		return this.selectorMap[elem.id];
        	}
        	for (i = 0; i < N; ++i) {
        		if (this.selectors[i] && !this.selectors[i].locked) {
        			this.selectors[i].locked = true;
        			this.selectors[i].reset(elem);
        			this.selectorMap[elem.id] = this.selectors[i];
        			return this.selectors[i];
        		}
        	}
        	// if we reached here, no available selectors were found, we create one
        	this.selectors[N] = new svgedit.select.Selector(N, elem);
        	this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup);
        	this.selectorMap[elem.id] = this.selectors[N];
        	return this.selectors[N];
        };
        
        // Function: svgedit.select.SelectorManager.releaseSelector
        // Removes the selector of the given element (hides selection box)
        //
        // Parameters:
        // elem - DOM element to remove the selector for
        svgedit.select.SelectorManager.prototype.releaseSelector = function(elem) {
        	if (elem == null) {return;}
        	var i,
        		N = this.selectors.length,
        		sel = this.selectorMap[elem.id];
        	for (i = 0; i < N; ++i) {
        		if (this.selectors[i] && this.selectors[i] == sel) {
        			if (sel.locked == false) {
        				// TODO(codedread): Ensure this exists in this module.
        				console.log('WARNING! selector was released but was already unlocked');
        			}
        			delete this.selectorMap[elem.id];
        			sel.locked = false;
        			sel.selectedElement = null;
        			sel.showGrips(false);
        
        			// remove from DOM and store reference in JS but only if it exists in the DOM
        			try {
        				sel.selectorGroup.setAttribute('display', 'none');
        			} catch(e) { }
        
        			break;
        		}
        	}
        };
        
        // Function: svgedit.select.SelectorManager.getRubberBandBox
        // Returns the rubberBandBox DOM element. This is the rectangle drawn by the user for selecting/zooming
        svgedit.select.SelectorManager.prototype.getRubberBandBox = function() {
        	if (!this.rubberBandBox) {
        		this.rubberBandBox = this.selectorParentGroup.appendChild(
        			svgFactory_.createSVGElement({
        				'element': 'rect',
        				'attr': {
        					'id': 'selectorRubberBand',
        					'fill': '#22C',
        					'fill-opacity': 0.15,
        					'stroke': '#22C',
        					'stroke-width': 0.5,
        					'display': 'none',
        					'style': 'pointer-events:none'
        				}
        			})
        		);
        	}
        	return this.rubberBandBox;
        };
        
        
        /**
         * Interface: svgedit.select.SVGFactory
         * An object that creates SVG elements for the canvas.
         *
         * interface svgedit.select.SVGFactory {
         *   SVGElement createSVGElement(jsonMap);
         *   SVGSVGElement svgRoot();
         *   SVGSVGElement svgContent();
         *
         *   Number currentZoom();
         *   Object getStrokedBBox(Element[]); // TODO(codedread): Remove when getStrokedBBox() has been put into svgutils.js
         * }
         */
        
        /**
         * Function: svgedit.select.init()
         * Initializes this module.
         *
         * Parameters:
         * config - an object containing configurable parameters (imgPath)
         * svgFactory - an object implementing the SVGFactory interface (see above).
         */
        svgedit.select.init = function(config, svgFactory) {
        	config_ = config;
        	svgFactory_ = svgFactory;
        	selectorManager_ = new svgedit.select.SelectorManager();
        };
        
        /**
         * Function: svgedit.select.getSelectorManager
         *
         * Returns:
         * The SelectorManager instance.
         */
        svgedit.select.getSelectorManager = function() {
        	return selectorManager_;
        };
        
        }());
      • svg-editor.css
        body {
        	background: #D0D0D0;
        }
        
        html, body, div{
        	-webkit-user-select: text;
        	-khtml-user-select: text;
        	-moz-user-select: text;
        	-o-user-select: text;
        	user-select: text;
        	/* this will work for QtWebKit in future */
        	-webkit-user-drag: text;
        }
        
        #browser-not-supported {
        	font-size: 0.8em;
        	font-family: Verdana, Helvetica, Arial;
        	color: #000000;
        }
        
        #svg_editor * {
        	transform-origin: 0 0;
        	-moz-transform-origin: 0 0;
        	-o-transform-origin: 0 0;
        	-webkit-transform-origin: 0 0;
        }
        
        #svg_editor {
        	font-size: 8pt;
        	font-family: Verdana, Helvetica, Arial;
        	color: #000000;
        }
        
        a {
        	color: #19c;
        }
        
        hr {
        	border: none;
        	border-bottom: 1px solid #808080;
        }
        
        select {
        	margin-top: 4px;
        }
        
        #svgroot {
        	-moz-user-select: none;
        	-webkit-user-select: none;
        	position: absolute;
        	top: 0;
        	left: 0;
        }
        
        #svgcanvas {
        	line-height: normal;
        	display: inline-block;
        	background-color: #A0A0A0;
        	text-align: center;
        	vertical-align: middle;
        	width: 640px;
        	height: 480px;
        	-apple-dashboard-region:dashboard-region(control rectangle 0px 0px 0px 0px); /* for widget regions that shouldn't react to dragging */
        	position: relative;
        	/*
        	  A subtle gradient effect in the canvas.
        	  Just experimenting - not sure if this is worth it.
        	*/
        	background: -moz-radial-gradient(45deg,#bbb,#222);
        	background: -webkit-gradient(radial, center center, 3, center center, 1000, from(#bbb), to(#222));
        }
        
        /* Rulers
        ——————————————————————————————————————*/
        
        #rulers > div {
        	position: absolute;
        	background: #DDD;
        	z-index: 1;
        	overflow: hidden;
        }
        
        #ruler_corner {
        	top: 41px;
        	left: 41px;
        	width: 15px;
        	height: 15px;
        }
        
        #ruler_x {
        	height: 15px;
        	top: 41px;
        	left: 56px;
        	right: 30px;
        	border-bottom: 1px solid;
        	border-left: 1px solid #777;
        }
        
        #ruler_y {
        	width: 15px;
        	top: 55px;
        	left: 41px;
        	bottom: 56px;
        	border-right: 1px solid;
        	border-top: 1px solid #777;
        }
        
        #ruler_x canvas:first-child {
        	margin-left: -16px;
        }
        
        #ruler_x canvas {
        	float: left;
        }
        
        #ruler_y canvas {
        	margin-top: -16px;
        }
        
        #ruler_x > div,
        #ruler_y > div {
        	overflow: hidden;
        }
        
        #palette_holder {
        	overflow: hidden;
        	margin-top: 5px;
        	padding: 5px;
        	position: absolute;
        	right: 15px;
        	height: 16px;
        	background: #f0f0f0;
        	border-radius: 3px;
        	z-index: 2;
        }
        
        #stroke_bg,
        #fill_bg {
        	height: 16px;
        	width: 16px;
        	margin: 1px;
        }
        
        #zoomLabel {
        	cursor: pointer;
        	margin-right: 5px;
        	padding-top: 4px
        }
        
        #linkLabel > svg {
        	height: 20px;
        	padding-top: 4px;
        }
        
        #palette {
        	float: left;
        	width: 632px;
        	height: 16px;
        }
        
        #workarea {
        	display: inline-table-cell;
        	position:absolute;
        	top: 40px;
        	left: 40px;
        	bottom: 40px;
        	right: 14px;
        	background-color: #A0A0A0;
        	border: 1px solid #808080;
        	overflow: auto;
        	text-align: center;
        }
        
        #sidepanels {
        	display: inline-block;
        	position:absolute;
        	top: 40px;
        	bottom: 40px;
        	right: 0;
        	width: 2px;
        	padding: 10px;
        	border-color: #808080;
        	border-style: solid;
        	border-width: 1px;
        	border-left: none;
        	overflow-x:hidden;
        	overflow-y:visible;
        }
        
        #layerpanel {
        	display: inline-block;
        	position:relative;
        	top: 0px;
        	bottom: 0;
        	left: 12px;
        	width: 0;
        	overflow: hidden;
        	margin: 0;
        	-moz-user-select: none;
        	-webkit-user-select: none;
        }
        
        /*
        	border-style: solid;
        	border-color: #666;
        	border-width: 0px 0px 0px 1px;
        */
        #sidepanel_handle {
        	display: inline-block;
        	position: absolute;
        	background-color: #D0D0D0;
        	font-weight: bold;
        	left: 0;
        	top: 40%;
        	width: 1em;
        	padding: 5px 1px 5px 5px;
        	margin-left: 3px;
        	cursor: pointer;
        	border-radius: 5px;
        	-moz-border-radius: 5px;
        	-webkit-border-radius: 5px;
        	-moz-user-select: none;
        	-webkit-user-select: none;
        }
        
        #sidepanel_handle:hover {
        	font-weight: bold;
        }
        
        #sidepanel_handle * {
        	cursor: pointer;
        	-moz-user-select: none;
        	-webkit-user-select: none;
        }
        #layerbuttons {
        	margin: 0;
        	padding: 0;
        	padding-left: 2px;
        	padding-right: 2px;
        	width: 125px;
        	height: 20px;
        	border-right: 1px solid #FFFFFF;
        	border-bottom: 1px solid #FFFFFF;
        	border-left: 1px solid #808080;
        	border-top: 1px solid #808080;
        	overflow: hidden;
        }
        
        .layer_button {
        	width: 14px;
        	height: 14px;
        	padding: 1px;
        	border-left: 1px solid #FFFFFF;
        	border-top: 1px solid #FFFFFF;
        	border-right: 1px solid #808080;
        	border-bottom: 1px solid #808080;
        	cursor: pointer;
        	float: left;
        	margin-right: 3px;
        }
        
        .layer_button:last-child {
        	margin-right: 0;
        }
        
        .layer_buttonpressed {
        	width: 14px;
        	height: 14px;
        	padding: 1px;
        	border-right: 1px solid #FFFFFF;
        	border-bottom: 1px solid #FFFFFF;
        	border-left: 1px solid #808080;
        	border-top: 1px solid #808080;
        	cursor: pointer;
        }
        
        #layerlist {
        	margin: 1px;
        	padding: 0;
        	width: 127px;
        	border-collapse: collapse;
        	border: 1px solid #808080;
        	background-color: #FFFFFF;
        }
        
        #layerlist tr.layer {
        	background-color: #FFFFFF;
        	margin: 0;
        	padding: 0;
        }
        
        #layerlist tr.layersel {
        	border: 1px solid #808080;
        	background-color: #CCCCCC;
        }
        
        #layerlist td.layervis {
        	width: 22px;
        	cursor: pointer;
        }
        
        #layerlist td.layerinvis {
        	background-image: none;
        	cursor: pointer;
        }
        
        #layerlist td.layervis * {
        	display: block;
        }
        
        #layerlist td.layerinvis * {
        	display: none;
        }
        
        #layerlist td.layername {
        	cursor: pointer;
        }
        
        #layerlist td.layername:hover {
        	color: blue;
        	font-style: italic;
        }
        
        #layerlist tr.layersel td.layername {
        	font-weight: bold;
        }
        
        #selLayerLabel {
        	white-space: nowrap;
        }
        
        #selLayerNames {
        	display: block;
        }
        
        div.palette_item {
        	height: 15px;
        	width: 15px;
        	float: left;
        }
        
        div.palette_item:first-child {
        	background: white;
        }
        
        /* Main button
        —————————————————————————————*/
        
        #main_button {
        	position: absolute;
        	top: 4px;
        	left: 5px;
        	z-index: 5;
        }
        
        #main_icon {
        	position: relative;
        	top: -2px;
        	left: -2px;
        	width: 95px;
        	line-height: 26px;
        }
        
        #main_icon:hover {
        	background: #eee !important;
        }
        
        #main_icon.buttondown {
        	background: #eee !important;
        	-moz-box-shadow: none !important;
        	-webkit-box-shadow: none !important;
        	box-shadow: none !important;
        	border-radius: 3px 3px 0 0;
        }
        
        #logo {
        	margin-top: -2px;
        }
        
        #logo img {
        	border: 0;
        	width: 28px;
        	height: 28px;
        }
        
        #main_icon > div {
        	float: left;
        }
        
        #main_button .dropdown {
        	position: absolute;
        	right: 7px;
        	top: 4px;
        }
        
        #main_icon span {
        	position: absolute;
        	top: 0;
        	left: 0;
        	bottom: 0;
        	right: 0;
        	display: block;
        	z-index: 2;
        	font-weight: bold;
        	padding-left: 34px;
        	line-height: 32px;
        	font-family: sans-serif;
        }
        
        #main_menu {
        	z-index: 12;
        	background: #eee;
        	position: relative;
        	width: 230px;
        	padding: 5px;
        	-moz-box-shadow: #555 1px 1px 4px;
        	-webkit-box-shadow: #555 1px 1px 4px;
        	box-shadow: #555 1px 1px 4px;
        	font-size: 1.1em;
        	display: none;
        	overflow: hidden;
        	clear: both;
        	top: -9px;
        }
        
        #main_menu ul,
        #main_menu li {
        	list-style: none;
        	margin: 0;
        	padding: 0;
        }
        
        #main_menu li {
        /*	height: 35px;*/
        	line-height: 22px;
        	padding-top: 7px;
        	padding-left: 7px;
        	margin: -5px;
        	overflow: auto;
        	cursor: default;
        }
        
        #main_menu li:hover {
        	background: #FFC;
        }
        
        #main_menu li > div {
        	float: left;
        	padding-right: 5px;
        }
        
        #main_menu p {
        	margin-top: 5px;
        }
        
        /*—————————————————————————————*/
        
        .tool_button:hover,
        .push_button:hover,
        .buttonup:hover,
        .buttondown,
        .tool_button_current,
        .push_button_pressed
        {
        	background-color: #ffc !important;
        }
        
        .tool_button_current,
        .push_button_pressed,
        .buttondown {
        	background-color: #f4e284 !important;
        	-webkit-box-shadow: inset 1px 1px 2px rgba(0,0,0,0.4), 1px 1px  0 white  !important;
        	-moz-box-shadow: inset 1px 1px 2px rgba(0,0,0,0.4), 1px 1px  0 white  !important;
        	box-shadow: inset 1px 1px 2px rgba(0,0,0,0.4), 1px 1px  0 white  !important;
        }
        
        #tools_top {
        	position: absolute;
        	left: 108px;
        	right: 2px;
        	top: 2px;
        	height: 40px;
        	border-bottom: none;
        	overflow: auto;
        }
        
        #tools_top .tool_sep {
        	margin-top: 5px;
        }
        
        #tools_left {
        	position: absolute;
        	border-right: none;
        	width: 32px;
        	top: 40px;
        	left: 1px;
        	margin-top: -2px;
        	padding-left: 2px;
        	background: #D0D0D0; /* Needed so flyout icons don't appear on the left */
        	z-index: 4;
        }
        
        #workarea.wireframe #svgcontent * {
        	fill: none;
        	stroke: #000;
        	stroke-width: 1px;
        	stroke-opacity: 1.0;
        	stroke-dasharray: 0;
        	opacity: 1;
        	pointer-events: stroke;
        	vector-effect: non-scaling-stroke;
        	filter: none;
        }
        
        #workarea.wireframe #svgcontent text {
        	fill: #000;
        	stroke: none;
        }
        
        #workarea.wireframe #canvasBackground > rect {
        	fill: #FFF !important;
        }
        
        #tools_top div[id$="_panel"]:not(#editor_panel):not(#history_panel) {
        	display: none;
        }
        
        #editor_panel, #history_panel {
        	height: 34px;
        	float: left;
        }
        
        #multiselected_panel .selected_tool {
        	vertical-align: 12px;
        }
        
        /*TODO: Adjust position of rulers are not visible*/
        #cur_context_panel {
        	position: absolute;
        	top: 57px;
        	left: 56px;
        	line-height: 22px;
        	overflow: auto;
        	padding-left: 5px;
        	font-size: 12px;
        	background: rgba(0, 0, 0, 0.8);
        	color: #ccc;
        	padding: 0 10px;
        	border-radius: 0 0 3px 0;
        }
        
        #cur_context_panel a {
        	float: none;
        	text-decoration: none;
        }
        
        #cur_context_panel a:hover {
        	text-decoration: underline;
        }
        
        #tools_top > div, #tools_top {
        	line-height: 26px;
        }
        
        div.toolset,
        div.toolset > * {
        	float: left;
        }
        
        div.toolset {
        	height: 34px;
        }
        
        div.toolset label span {
        /*	outline: 1px solid red;*/
        	padding-top: 3px;
        	display: inline-block;
        }
        
        #tools_top > div > * {
        	float: left;
        	margin-right: 2px;
        }
        
        #tools_top label {
        	margin-top: 0;
        	margin-left: 5px;
        }
        
        #tools_top input {
        	margin-top: 5px;
        	height: 15px;
        }
        
        input[type=text] {
        	padding: 2px;
        }
        
        #tools_left .tool_button,
        #tools_left .tool_button_current {
        	position: relative;
        	z-index: 11;
        }
        
        .flyout_arrow_horiz {
        	position: absolute;
        	bottom: -1px;
        	right: 0;
        	z-index: 10;
        }
        
        
        span.zoom_tool {
        	line-height: 26px;
        	padding: 3px;
        }
        
        #zoom_panel {
        	margin-top: 5px;
        }
        
        .dropdown {
        	position: relative;
        }
        
        .dropdown button {
        	width: 15px;
        	height: 21px;
        	margin: 6px 0 0 1px;
        	padding: 0;
        	border-left: 1px solid #FFFFFF;
        	border-top: 1px solid #FFFFFF;
        	border-right: 1px solid #808080;
        	border-bottom: 1px solid #808080;
        	background-color: #E8E8E8;
        }
        
        .dropdown button.down {
        	border-left: 1px solid #808080;
        	border-top: 1px solid #808080;
        	border-right: 1px solid #FFFFFF;
        	border-bottom: 1px solid #FFFFFF;
        	background-color: #B0B0B0;
        }
        
        .dropdown ul {
        	list-style: none;
        	position: absolute;
        	margin: 0;
        	padding: 0;
        	left: -85px;
        	top: 26px;
        	z-index: 4;
        	display: none;
        }
        
        .dropup ul {
        	top: auto;
        	bottom: 24px;
        }
        
        .dropdown li {
        	display: block;
        	width: 120px;
        	padding: 4px;
        	background: #E8E8E8;
        	border: 1px solid #B0B0B0;
        	margin: 0 0 -1px 0;
        	line-height: 16px;
        }
        
        .dropdown li:hover {
        	background-color: #FFC;
        }
        
        .dropdown li.special {
        	padding: 10px 4px;
        }
        
        .dropdown li.special:hover {
        	background: #FFC;
        }
        
        #font_family_dropdown-list li {
        	font-size: 1.4em;
        }
        
        #font_family {
        	margin-left: 5px;
        	margin-right: 0;
        }
        
        .tool_button,
        .push_button,
        .tool_button_current,
        .push_button_pressed
        {
        	height: 24px;
        	width: 24px;
        	margin: 2px 2px 4px 2px;
        	padding: 3px;
        	-webkit-box-shadow: inset 1px 1px 2px white, 1px 1px 1px rgba(0,0,0,0.3);
        	moz-box-shadow: inset 1px 1px 2px white, 1px 1px 1px rgba(0,0,0,0.3);
        	box-shadow: inset 1px 1px 2px white, 1px 1px 1px rgba(0,0,0,0.3);
        	background-color: #E8E8E8;
        	cursor: pointer;
        	border-radius: 3px;
        	-moz-border-radius: 3px;
        	-webkit-border-radius: 3px;
        }
        
         #main_menu li#tool_open,  #main_menu li#tool_import {
        	position: relative;
        	overflow: hidden;
        }
        
        #tool_image {
        	overflow: hidden;
        }
        
        #tool_open input,
        #tool_import input,
        #tool_image input {
        	position: absolute;
        	opacity: 0;
        	font-size: 10em;
        	top: -5px;
        	right: -5px;
        	margin: 0;
        	cursor: pointer; /* Sadly doesn't appear to have an effect */
        }
        
        .disabled {
        	opacity: 0.5;
        	cursor: default;
        }
        
        .tool_sep {
        	width: 1px;
        	background: #888;
        	border-left: 1px outset #EEE;
        	margin: 2px 3px;
        	padding: 0;
        	height: 24px;
        }
        
        .icon_label {
        	float: left;
        	padding-top: 3px;
        	padding-right: 3px;
        	box-sizing: border-box;
        	-moz-box-sizing: border-box;
        	-webkit-box-sizing: border-box;
        	height: 0;
        }
        
        .width_label {
        	padding-right: 5px;
        }
        
        #tool_bold, #tool_italic {
        	font: bold 2.1em/1.1em serif;
        	text-align: center;
        	padding-left: 2px;
        	position: relative;
        }
        
        #text {
        	position: absolute;
        	left: -9999px;
        }
        
        #tool_bold span, #tool_italic span {
        	position: absolute;
        	width: 100%;
        	height: 100%;
        	top: 0; left: 0;
        	background: #000;
        	opacity: 0;
        }
        
        #tool_italic {
        	font-weight: normal;
        	font-style: italic;
        }
        
        #url_notice {
        	padding-top: 4px;
        	display: none;
        }
        
        #color_picker {
        	position: absolute;
        	display: none;
        	background: #E8E8E8;
        	height: 350px;
        	z-index: 5;
        }
        
        .tools_flyout {
        	position: absolute;
        	display: none;
        	cursor: pointer;
        	width: 400px;
        	z-index: 1;
        }
        
        .tools_flyout_v {
        	position: absolute;
        	display: none;
        	cursor: pointer;
        	width: 30px;
        }
        
        .tools_flyout .tool_button {
        	float: left;
        	background-color: #E8E8E8;
        	border-left: 1px solid #FFFFFF;
        	border-top: 1px solid #FFFFFF;
        	border-right: 1px solid #808080;
        	border-bottom: 1px solid #808080;
        	height: 28px;
        	width: 28px;
        }
        
        #tools_bottom {
        	position: absolute;
        	left: 40px;
        	right: 0;
        	bottom: 0;
        	height: 40px;
        	overflow: visible;
        }
        
        #tools_bottom_1 {
        	width: 115px;
        	float: left;
        }
        
        #tools_bottom input[type=text] {
        	width: 2.2em;
        }
        
        /* Color tools: fill, stroke, opacity
        –––––––––––––––––––––––––––––––––––––*/
        
        #tools_bottom_2 {
        	float: left;
        	width: 300px;
        	position: relative;
        	margin-top: 5px;
        	-webkit-transition: width 150ms ease;
        }
        
        .expanded #tools_bottom_2 {
        	width: 450px;
        }
        
        #tools_bottom #tools_bottom_2 .dropdown button {
        	margin-top: 2px;
        }
        
        .dropdown li.tool_button {
        	width: 24px;
        }
        
        #tools_bottom_2 .icon_label {
        	display: block;
        	margin: 3px 5px;
        	padding: 0;
        }
        
        #tool_opacity { right: 0;}
        #tool_fill { left: 0; }
        #tool_stroke { left: 60px;}
        
        #fill_color,  #stroke_color {
        	height: 16px;
        	width: 16px;
        	border: 1px solid #808080;
        	cursor: pointer;
        	overflow: hidden;
        }
        
        #stroke_expand {
        	width: 0;
        	overflow: hidden;
        }
        
        #toggle_stroke_tools {
        	position: absolute;
        	right: 0;
        	top: 0;
        	bottom: 0;
        	width: 25px;
        	text-align: center;
        	border-radius: 0 3px 3px 0;
        	margin: 0;
        }
        
        #toggle_stroke_tools:before {
        	content: '>>';
        	letter-spacing: -3px;
        	font-weight: bold;
        	color: #666;
        }
        
        .expanded #tool_stroke.color_tool {
        	width: 280px;
        }
        
        .expanded #toggle_stroke_tools:before {
        	content: '<<';
        }
        
        #toggle_stroke_tools:hover {
        	background: white;
        }
        
        .color_tool {
        	position: absolute;
        	overflow: hidden;
        	background: #f0f0f0;
        	height: 26px;
        	line-height: 26px;
        	border-radius: 3px;
        	min-width: 52px;
        }
        
        #tool_stroke.color_tool {
        	width: 130px;
        	z-index: 2;
        	-webkit-transition: width 150ms ease;
        	-moz-transition: width 150ms ease;
        	-o-transition: width 150ms ease;
        	-ms-transition: width 150ms ease;
        	transition: width 150ms ease;
        }
        
        .color_block {
        	position: absolute;
        	top: 0;
        	left: 0;
        }
        
        .color_block svg {
        	display: block;
        }
        
        .color_tool > * {
        	float: left;
        	margin-right: 5px;
        }
        
        .color_tool .dropdown > * {
        	float: left;
        }
        
        .color_tool .stroke_label {
        	margin-left: 25px;
        	float: left;
        }
        
        .color_tool > .color_block {
        	top: 3px;
        	left: 29px;
        }
        
        .color_tool input {
        	margin: 0;
        }
        
        #tool_opacity {
        	overflow: visible;
        }
        
        @media screen and (max-width:1250px) {
        	.expanded #palette_holder {
        		left: 560px;
        		overflow-x: scroll;
        		padding: 0 5px;
        		margin-top: 2px;
        		height: 30px;
        	}
        	#tools_top {
        		height: 71px;
        	}
        	#workarea, #sidepanels {
        		top: 70px;
        	}
        	#rulers #ruler_corner,
        	#rulers #ruler_x, #tools_left {
        		top: 71px;
        	}
        
        	#rulers #ruler_y {
        		top: 86px;
        	}
        
        	#cur_context_panel {
        		top: 87px;
        	}
        
        	#selected_panel {
        		clear: right;
        	}
        }
        
        @media screen and (max-width:1100px) {
        	#tools_bottom:not(.expanded) #palette_holder {
        		left: 410px;
        		overflow-x: scroll;
        		padding: 0 5px;
        		margin-top: 2px;
        		height: 30px;
        	}
        }
        
        /*–––––––––––––––––––––––––––––––––––––*/
        
        #option_lists ul {
        	display: none;
        	position: absolute;
        	height: auto;
        	z-index: 3;
        	margin: -10px;
        	list-style: none;
        	padding-left: 0;
        }
        
        #option_lists .optcols2 {
        	width: 70px;
        	margin-left: -15px;
        }
        
        #option_lists .optcols3 {
        	width: 90px;
        	margin-left: -31px;
        }
        
        #option_lists .optcols4 {
        	width: 130px;
        	margin-left: -44px;
        }
        
        #option_lists ul[class^=optcols] li {
        	float: left;
        }
        
        ul li.current {
        	background-color: #F4E284;
        }
        
        #option_lists ul li {
        	margin: 0;
        	border-radius: 0;
        	-moz-border-radius: 0;
        	-webkit-border-radius: 0;
        }
        
        #tools_bottom .dropdown button {
        	margin-top: 2px;
        }
        
        #opacity_dropdown li {
        	width: 140px;
        }
        
         #copyright {
        	text-align: right;
        	padding-right: .3em;
        }
        
        #svg_source_editor {
        	display: none;
        }
        
        .overlay {
        	position: absolute;
        	top: 0;
        	right: 0;
        	left: 0;
        	bottom: 0;
        	background-color: black;
        	opacity: 0.6;
        	z-index: 5;
        }
        
        #svg_source_editor #svg_source_container {
        	position: absolute;
        	top: 30px;
        	left: 30px;
        	right: 30px;
        	bottom: 30px;
        	background-color: #B0B0B0;
        	opacity: 1.0;
        	text-align: center;
        	border: 1px outset #777;
        	z-index: 6;
        }
        
        #save_output_btns {
        	display: none;
        	text-align: left;
        }
        
        #save_output_btns p {
        	margin: .5em 1.5em;
        	display: inline-block;
        }
        
        #bg_blocks {
        	overflow: auto;
        	margin-left: 30px;
        }
        
        #bg_blocks .color_block {
        	position: static;
        }
        
        #svg_docprops #svg_docprops_container,
        #svg_prefs #svg_prefs_container {
        	position: absolute;
        	top: 50px;
        	padding: 10px;
        	background-color: #B0B0B0;
        	border: 1px outset #777;
        	opacity: 1.0;
        /*	width: 450px;*/
        	font-family: Verdana, Helvetica, sans-serif;
        	font-size: .8em;
        	z-index: 20001;
        }
        
        #svg_docprops .error {
        	border: 1px solid red;
        	padding: 3px;
        }
        
        #svg_docprops #resolution {
        	max-width: 14em;
        }
        
        #tool_docprops_back,
        #tool_prefs_back {
        	margin-left: 1em;
        	overflow: auto;
        }
        
        #svg_docprops_container #svg_docprops_docprops,
        #svg_prefs #svg_docprops_prefs {
        	float: left;
        	width: 221px;
        	margin: 5px .7em;
        	overflow: hidden;
        }
        
        #svg_prefs_container fieldset + fieldset {
        	float: right;
        }
        
        #svg_docprops legend,
        #svg_prefs legend {
        	max-width: 195px;
        }
        
        #svg_docprops_docprops > legend,
        #svg_prefs_container > fieldset > legend {
        	font-weight: bold;
        	font-size: 1.1em;
        }
        
        #svg_docprops_container fieldset,
        #svg_prefs fieldset {
        	padding: 5px;
        	margin: 5px;
        	border: 1px solid #DDD;
        }
        
        #svg_docprops_container label,
        #svg_prefs_container label {
        	display: block;
        	margin: .5em;
        }
        
        #svginfo_bg_note {
        	font-size: .9em;
        	font-style: italic;
        	color: #444;
        }
        
        #canvas_title, #canvas_bg_url {
        	display: block;
        	width: 96%;
        }
        
        
        #svg_source_editor form {
        	position: absolute;
        	top: 40px;
        	bottom: 30px;
        	width: 100%;
        }
        
        #svg_source_editor #svg_source_textarea {
        	position: relative;
        	width: 95%;
        	height: 95%;
        	padding: 5px;
        	font-size: 12px;
        }
        
        #svg_source_editor #tool_source_back {
        	text-align: left;
        	padding-left: 20px;
        }
        
        #svg_prefs_container div.color_block {
        	float: left;
        	margin: 2px;
        	padding: 20px;
        }
        
        #change_background div.cur_background {
        	border: 2px solid blue;
        	padding: 18px;
        }
        
        #background_img {
        	position: absolute;
        	top: 0;
        	left: 0;
        	text-align: left;
        }
        
        #svg_docprops button,
        #svg_prefs button {
        	margin-top: 0;
        	margin-bottom: 5px;
        }
        
        #svg_docprops,
        #svg_prefs {
        	display: none;
        }
        
        #image_save_opts label {
        	font-size: .9em;
        }
        
        #image_save_opts input {
        	margin-left: 0;
        }
        
        #tool_prefs_option {
        	float: right;
        }
        
        .toolbar_button button {
        	border:1px solid #dedede;
        	line-height:130%;
        	float: left;
        	background: #E8E8E8 none;
        	padding:5px 10px 5px 7px; /* Firefox */
        	line-height:17px; /* Safari */
        	margin: 5px 20px 0 0;
        	border: 1px #808080 solid;
        	border-top-color: #FFF;
        	border-left-color: #FFF;
        	border-radius: 5px;
        	-moz-border-radius: 5px;
        	-webkit-border-radius: 5px;
        }
        
        .toolbar_button button:hover {
        	border: 1px #e0a874 solid;
        	border-top-color: #fcd9ba;
        	border-left-color: #fcd9ba;
        	background-color: #FFC;
        }
        .toolbar_button button:active {
        	background-color: #F4E284;
        	border-left: 1px solid #663300;
        	border-top: 1px solid #663300;
        }
        
        .toolbar_button button .svg_icon {
        	margin: 0 3px -3px 0 !important;
        	padding: 0;
        	border: none;
        	width: 16px;
        	height: 16px;
        }
        
        #dialog_box {
        	display: none;
        }
        
        #dialog_content {
        	height: 95px;
        	margin: 10px 10px 5px 10px;
        	background: #DDD;
        	overflow: auto;
        	text-align: left;
        	border: 1px solid #B0B0B0;
        }
        
        #dialog_content.prompt {
        	height: 75px;
        }
        
        #dialog_content p {
        	margin: 10px;
        	line-height: 1.3em;
        }
        
        #dialog_container {
        	position: absolute;
        	font-family: Verdana;
        	text-align: center;
        	left: 50%;
        	top: 50%;
        	width: 300px;
        	margin-left: -150px;
        	height: 150px;
        	margin-top: -80px;
        	position: fixed;
        	z-index: 50001;
        	background: #CCC;
        	border: 1px outset #777;
        	font-family:Verdana,Helvetica,sans-serif;
        	font-size:0.8em;
        }
        
        #dialog_container, #dialog_content {
        	border-radius: 5px;
        	-moz-border-radius: 5px;
        	-webkit-border-radius: 5px;
        }
        
        #dialog_buttons input[type=text] {
        	width: 90%;
        	display: block;
        	margin: 0 0 5px 11px;
        }
        
        #dialog_buttons input[type=button] {
        	margin: 0 1em;
        }
        
        /* Slider
        ----------------------------------*/
        .ui-slider { position: relative; text-align: left; }
        .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
        .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; }
        
        .ui-slider-horizontal { height: .8em; }
        .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
        .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
        .ui-slider-horizontal .ui-slider-range-min { left: 0; }
        .ui-slider-horizontal .ui-slider-range-max { right: 0; }
        
        .ui-slider-vertical { width: .8em; height: 100px; }
        .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
        .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
        .ui-slider-vertical .ui-slider-range-min { bottom: 0; }
        .ui-slider-vertical .ui-slider-range-max { top: 0; }
        
        .ui-slider {
        	border: 1px solid #B0B0B0;
        }
        
        .ui-slider-handle {
        	background: #B0B0B0;
        	border: 1px solid #000;
        }
        
        /* Necessary to keep the flyouts sized properly */
        .tools_flyout .tool_button,
        .tools_flyout .tool_flyout {
        	padding: 2px;
        	width: 24px;
        	height: 24px;
        	margin: 0;
        	border-radius: 0px;
        	-moz-border-radius: 0px;
        	-webkit-border-radius: 0px;
        }
        
        /* Generic context menu styles */
        .contextMenu {
        	position: absolute;
        	z-index: 99999;
        	border: solid 1px rgba(0,0,0,.33);
        	background: rgba(255,255,255,.95);
        	padding: 5px 0;
        	margin: 0px;
        	display: none;
        	font: 12px/15px Lucida Sans, Helvetica, Verdana, sans-serif;
        	border-radius: 5px;
        	-moz-border-radius: 5px;
        	-moz-box-shadow: 2px 5px 10px rgba(0,0,0,.3);
        	-webkit-box-shadow: 2px 5px 10px rgba(0,0,0,.3);
        	box-shadow: 2px 5px 10px rgba(0,0,0,.3);
        }
        
        .contextMenu LI {
        	list-style: none;
        	padding: 0px;
        	margin: 0px;
        }
        
        .contextMenu .shortcut {
        	width: 115px;
        	text-align:right;
        	float:right;
        }
        
        .contextMenu A {
        	-moz-user-select: none;
        	-webkit-user-select: none;
        	color: #222;
        	text-decoration: none;
        	display: block;
        	line-height: 20px;
        	height: 20px;
        	background-position: 6px center;
        	background-repeat: no-repeat;
        	outline: none;
        	padding: 0px 15px 1px 20px;
        }
        
        .contextMenu LI.hover A {
        	background-color: #2e5dea;
        	color: white;
        	cursor: default;
        }
        
        .contextMenu LI.disabled A {
        	color: #999;
        }
        
        .contextMenu LI.hover.disabled A {
        	background-color: transparent;
        }
        
        .contextMenu LI.separator {
        	border-top: solid 1px #E3E3E3;
        	padding-top: 5px;
        	margin-top: 5px;
        }
        
        /*
        	Adding Icons
        	You can add icons to the context menu by adding
        	classes to the respective LI element(s)
        */
        /*
        
        .contextMenu LI.edit A { background-image: url(images/page_white_edit.png); }
        .contextMenu LI.cut A { background-image: url(images/cut.png); }
        .contextMenu LI.copy A { background-image: url(images/page_white_copy.png); }
        .contextMenu LI.paste A { background-image: url(images/page_white_paste.png); }
        .contextMenu LI.delete A { background-image: url(images/page_white_delete.png); }
        .contextMenu LI.quit A { background-image: url(images/door.png); }
        */
        
      • svg-editor.html
        <link rel="stylesheet" href="jgraduate/css/jPicker.css" type="text/css"/>
        <link rel="stylesheet" href="jgraduate/css/jgraduate.css" type="text/css"/>
        <link rel="stylesheet" href="svg-editor.css" type="text/css"/>
        <link rel="stylesheet" href="spinbtn/JQuerySpinBtn.css" type="text/css"/>
        <link rel="stylesheet" href="custom.css" type="text/css"/>
          <script src="jquery.js"></script>
        
        <script src="js-hotkeys/jquery.hotkeys.min.js"></script>
        <script src="jquerybbq/jquery.bbq.min.js"></script>
        <script src="svgicons/jquery.svgicons.js"></script>
        <script src="jgraduate/jquery.jgraduate.min.js"></script>
        <script src="spinbtn/JQuerySpinBtn.min.js"></script>
        <script src="touch.js"></script>
        
        <!--{if svg_edit_release}>
          <script src="svgedit.compiled.js"></script>
        <!{else}-->
          <script src="svgedit.js"></script>
          <script src="jquery-svg.js"></script>
          <script src="contextmenu/jquery.contextMenu.js"></script>
          <script src="browser.js"></script>
          <script src="svgtransformlist.js"></script>
          <script src="math.js"></script>
          <script src="units.js"></script>
          <script src="svgutils.js"></script>
          <script src="sanitize.js"></script>
          <script src="history.js"></script>
          <script src="coords.js"></script>
          <script src="recalculate.js"></script>
          <script src="select.js"></script>
          <script src="draw.js"></script>
          <script src="path.js"></script>
          <script src="svgcanvas.js"></script>
          <script src="svg-editor.js"></script>
          <script src="locale/locale.js"></script>
          <script src="contextmenu.js"></script>
        <!--{endif}-->
        
        <!-- always minified scripts -->
        <script src="jquery-ui/jquery-ui-1.8.17.custom.min.js"></script>
        <script src="jgraduate/jpicker.js"></script>
        
        <!-- If you do not wish to add extensions by URL, you can load them
        by creating the following file and adding by calls to svgEditor.setConfig -->
        <script src="config.js"></script>
        
        <!-- feeds -->
        <link rel="alternate" type="application/atom+xml" title="SVG-edit General Discussion" href="http://groups.google.com/group/svg-edit/feed/atom_v1_0_msgs.xml" />
        <link rel="alternate" type="application/atom+xml" title="SVG-edit Updates (Issues/Fixes/Commits)" href="http://code.google.com/feeds/p/svg-edit/updates/basic" />
        
        <!-- Add script with custom handlers here -->
        <title>SVG-edit</title>
        
        <!-- body -->
        
        <div id="svg_editor">
        
        <div id="rulers">
        	<div id="ruler_corner"></div>
        	<div id="ruler_x">
        		<div>
        			<canvas height="15"></canvas>
        		</div>
        	</div>
        	<div id="ruler_y">
        		<div>
        			<canvas width="15"></canvas>
        		</div>
        	</div>
        </div>
        
        <div id="workarea">
        <style id="styleoverrides" type="text/css" media="screen" scoped="scoped"></style>
        <div id="svgcanvas" style="position:relative">
        
        </div>
        </div>
        
        <div id="sidepanels">
        	<div id="layerpanel">
        		<h3 id="layersLabel">Layers</h3>
        		<fieldset id="layerbuttons">
        			<div id="layer_new" class="layer_button"  title="New Layer"></div>
        			<div id="layer_delete" class="layer_button"  title="Delete Layer"></div>
        			<div id="layer_rename" class="layer_button"  title="Rename Layer"></div>
        			<div id="layer_up" class="layer_button"  title="Move Layer Up"></div>
        			<div id="layer_down" class="layer_button"  title="Move Layer Down"></div>
        			<div id="layer_moreopts" class="layer_button"  title="More Options"></div>
        		</fieldset>
        		
        		<table id="layerlist">
        			<tr class="layer">
        				<td class="layervis"></td>
        				<td class="layername">Layer 1</td>
        			</tr>
        		</table>
        		<span id="selLayerLabel">Move elements to:</span>
        		<select id="selLayerNames" title="Move selected elements to a different layer" disabled="disabled">
        			<option selected="selected" value="layer1">Layer 1</option>
        		</select>
        	</div>
        	<div id="sidepanel_handle" title="Drag left/right to resize side panel [X]">L a y e r s</div>
        </div>
        
        <div id="main_button">
        	<div id="main_icon" class="tool_button" title="Main Menu">
        		<span>SVG-Edit</span>
        		<div id="logo"></div>
        		<div class="dropdown"></div>
        	</div>
        		
        	<div id="main_menu"> 
        	
        		<!-- File-like buttons: New, Save, Source -->
        		<ul>
        			<li id="tool_clear">
        				<div></div>
        				New Image (N)
        			</li>
        			
        			<li id="tool_open" style="display:none;">
        				<div id="fileinputs">
        					<div></div>
        				</div>
        				Open SVG
        			</li>
        			
        			<li id="tool_import" style="display:none;">
        				<div id="fileinputs_import">
        					<div></div>
        				</div>
        				Import Image
        			</li>
        			
        			<li id="tool_save">
        				<div></div>
        				Save Image (S)
        			</li>
        			
        			<li id="tool_export">
        				<div></div>
        				Export
        			</li>
        			
        			<li id="tool_docprops">
        				<div></div>
        				Document Properties (D)
        			</li>
        		</ul>
        
        		<p>
        			<a href="http://svg-edit.googlecode.com/" target="_blank">
        				SVG-edit Home Page
        			</a>
        		</p>
        
        		<button id="tool_prefs_option">
        			Editor Options
        		</button>
        
        
        	</div>
        </div>
        
        
        
        <div id="tools_top" class="tools_panel">
        
        	<div id="editor_panel">
        		<div class="tool_sep"></div>
        		<div class="push_button" id="tool_source" title="Edit Source [U]"></div>
        		<div class="tool_button" id="tool_wireframe" title="Wireframe Mode [F]"></div>
        	</div>
        
        	<!-- History buttons -->
        	<div id="history_panel">
        		<div class="tool_sep"></div>
        		<div class="push_button tool_button_disabled" id="tool_undo" title="Undo [Z]"></div>
        		<div class="push_button tool_button_disabled" id="tool_redo" title="Redo [Y]"></div>
        	</div>
        	
        	<!-- Buttons when a single element is selected -->
        	<div id="selected_panel">
        		<div class="toolset">
        			<div class="tool_sep"></div>
        			<div class="push_button" id="tool_clone" title="Duplicate Element [D]"></div>
        			<div class="push_button" id="tool_delete" title="Delete Element [Delete/Backspace]"></div>
        			<div class="tool_sep"></div>
        			<div class="push_button" id="tool_move_top" title="Bring to Front [ Ctrl+Shift+] ]"></div>
        			<div class="push_button" id="tool_move_bottom" title="Send to Back [ Ctrl+Shift+[ ]"></div>
        			<div class="push_button" id="tool_topath" title="Convert to Path"></div>
        			<div class="push_button" id="tool_reorient" title="Reorient path"></div>
        			<div class="push_button" id="tool_make_link" title="Make (hyper)link"></div>
        			<div class="tool_sep"></div>
        			<label id="idLabel" title="Identify the element">
        				<span>id:</span>
        				<input id="elem_id" class="attr_changer" data-attr="id" size="10" type="text"/>
        			</label>
        		</div>
        
        		<label id="tool_angle" title="Change rotation angle" class="toolset">
        			<span id="angleLabel" class="icon_label"></span>
        			<input id="angle" size="2" value="0" type="text"/>
        		</label>
        		
        		<div class="toolset" id="tool_blur" title="Change gaussian blur value">
        			<label>
        				<span id="blurLabel" class="icon_label"></span>
        				<input id="blur" size="2" value="0" type="text"/>
        			</label>
        			<div id="blur_dropdown" class="dropdown">
        				<button></button>
        				<ul>
        					<li class="special"><div id="blur_slider"></div></li>
        				</ul>
        			</div>
        		</div>
        		
        		<div class="dropdown toolset" id="tool_position" title="Align Element to Page">
        				<div id="cur_position" class="icon_label"></div>
        				<button></button>
        		</div>		
        
        		<div id="xy_panel" class="toolset">
        			<label>
        				x: <input id="selected_x" class="attr_changer" title="Change X coordinate" size="3" data-attr="x"/>
        			</label>
        			<label>
        				y: <input id="selected_y" class="attr_changer" title="Change Y coordinate" size="3" data-attr="y"/>
        			</label>
        		</div>
        	</div>
        	
        	<!-- Buttons when multiple elements are selected -->
        	<div id="multiselected_panel">
        		<div class="tool_sep"></div>
        		<div class="push_button" id="tool_clone_multi" title="Clone Elements [C]"></div>
        		<div class="push_button" id="tool_delete_multi" title="Delete Selected Elements [Delete/Backspace]"></div>
        		<div class="tool_sep"></div>
        		<div class="push_button" id="tool_group_elements" title="Group Elements [G]"></div>
        		<div class="push_button" id="tool_make_link_multi" title="Make (hyper)link"></div>
        		<div class="push_button" id="tool_alignleft" title="Align Left"></div>
        		<div class="push_button" id="tool_aligncenter" title="Align Center"></div>
        		<div class="push_button" id="tool_alignright" title="Align Right"></div>
        		<div class="push_button" id="tool_aligntop" title="Align Top"></div>
        		<div class="push_button" id="tool_alignmiddle" title="Align Middle"></div>
        		<div class="push_button" id="tool_alignbottom" title="Align Bottom"></div>
        		<label id="tool_align_relative"> 
        			<span id="relativeToLabel">relative to:</span>
        			<select id="align_relative_to" title="Align relative to ...">
        			<option id="selected_objects" value="selected">selected objects</option>
        			<option id="largest_object" value="largest">largest object</option>
        			<option id="smallest_object" value="smallest">smallest object</option>
        			<option id="page" value="page">page</option>
        			</select>
        		</label>
        		<div class="tool_sep"></div>
        
        	</div>
        
        	<div id="rect_panel">
        		<div class="toolset">
        			<label id="rect_width_tool" title="Change rectangle width">
        				<span id="rwidthLabel" class="icon_label"></span>
        				<input id="rect_width" class="attr_changer" size="3" data-attr="width"/>
        			</label>
        			<label id="rect_height_tool" title="Change rectangle height">
        				<span id="rheightLabel" class="icon_label"></span>
        				<input id="rect_height" class="attr_changer" size="3" data-attr="height"/>
        			</label>
        		</div>
        		<label id="cornerRadiusLabel" title="Change Rectangle Corner Radius" class="toolset">
        			<span class="icon_label"></span>
        			<input id="rect_rx" size="3" value="0" type="text" data-attr="Corner Radius"/>
        		</label>
        	</div>
        
        	<div id="image_panel">
        	<div class="toolset">
        		<label><span id="iwidthLabel" class="icon_label"></span>
        		<input id="image_width" class="attr_changer" title="Change image width" size="3" data-attr="width"/>
        		</label>
        		<label><span id="iheightLabel" class="icon_label"></span>
        		<input id="image_height" class="attr_changer" title="Change image height" size="3" data-attr="height"/>
        		</label>
        	</div>
        	<div class="toolset">
        		<label id="tool_image_url">url:
        			<input id="image_url" type="text" title="Change URL" size="35"/>
        		</label>
        		<label id="tool_change_image">
        			<button id="change_image_url" style="display:none;">Change Image</button>
        			<span id="url_notice" title="NOTE: This image cannot be embedded. It will depend on this path to be displayed"></span>
        		</label>
        	</div>
          </div>
        
        	<div id="circle_panel">
        		<div class="toolset">
        			<label id="tool_circle_cx">cx:
        			<input id="circle_cx" class="attr_changer" title="Change circle's cx coordinate" size="3" data-attr="cx"/>
        			</label>
        			<label id="tool_circle_cy">cy:
        			<input id="circle_cy" class="attr_changer" title="Change circle's cy coordinate" size="3" data-attr="cy"/>
        			</label>
        		</div>
        		<div class="toolset">
        			<label id="tool_circle_r">r:
        			<input id="circle_r" class="attr_changer" title="Change circle's radius" size="3" data-attr="r"/>
        			</label>
        		</div>
        	</div>
        
        	<div id="ellipse_panel">
        		<div class="toolset">
        			<label id="tool_ellipse_cx">cx:
        			<input id="ellipse_cx" class="attr_changer" title="Change ellipse's cx coordinate" size="3" data-attr="cx"/>
        			</label>
        			<label id="tool_ellipse_cy">cy:
        			<input id="ellipse_cy" class="attr_changer" title="Change ellipse's cy coordinate" size="3" data-attr="cy"/>
        			</label>
        		</div>
        		<div class="toolset">
        			<label id="tool_ellipse_rx">rx:
        			<input id="ellipse_rx" class="attr_changer" title="Change ellipse's x radius" size="3" data-attr="rx"/>
        			</label>
        			<label id="tool_ellipse_ry">ry:
        			<input id="ellipse_ry" class="attr_changer" title="Change ellipse's y radius" size="3" data-attr="ry"/>
        			</label>
        		</div>
        	</div>
        
        	<div id="line_panel">
        		<div class="toolset">
        			<label id="tool_line_x1">x1:
        			<input id="line_x1" class="attr_changer" title="Change line's starting x coordinate" size="3" data-attr="x1"/>
        			</label>
        			<label id="tool_line_y1">y1:
        			<input id="line_y1" class="attr_changer" title="Change line's starting y coordinate" size="3" data-attr="y1"/>
        			</label>
        		</div>
        		<div class="toolset">
        			<label id="tool_line_x2">x2:
        			<input id="line_x2" class="attr_changer" title="Change line's ending x coordinate" size="3" data-attr="x2"/>
        			</label>
        			<label id="tool_line_y2">y2:
        			<input id="line_y2" class="attr_changer" title="Change line's ending y coordinate" size="3" data-attr="y2"/>
        			</label>
        		</div>
        	</div>
        
        	<div id="text_panel">
        		<div class="toolset">
        			<div class="tool_button" id="tool_bold" title="Bold Text [B]"><span></span>B</div>
        			<div class="tool_button" id="tool_italic" title="Italic Text [I]"><span></span>i</div>
        		</div>
        		
        		<div class="toolset" id="tool_font_family">
        			<label>
        				<!-- Font family -->
        				<input id="font_family" type="text" title="Change Font Family" size="12"/>
        			</label>
        			<div id="font_family_dropdown" class="dropdown">
        				<button></button>
        				<ul>
        					<li style="font-family:serif">Serif</li>
        					<li style="font-family:sans-serif">Sans-serif</li>
        					<li style="font-family:cursive">Cursive</li>
        					<li style="font-family:fantasy">Fantasy</li>
        					<li style="font-family:monospace">Monospace</li>
        				</ul>
        			</div>
        		</div>
        
        		<label id="tool_font_size" title="Change Font Size">
        			<span id="font_sizeLabel" class="icon_label"></span>
        			<input id="font_size" size="3" value="0" type="text"/>
        		</label>
        		
        		<!-- Not visible, but still used -->
        		<input id="text" type="text" size="35"/>
        	</div>
        
        	<!-- formerly gsvg_panel -->
        	<div id="container_panel">
        		<div class="tool_sep"></div>
        
        		<!-- Add viewBox field here? -->
        
        		<label id="group_title" title="Group identification label">
        			<span>label:</span>
        			<input id="g_title" data-attr="title" size="10" type="text"/>
        		</label>
        	</div>
        	
        	<div id="use_panel">
        		<div class="push_button" id="tool_unlink_use" title="Break link to reference element (make unique)"></div>
        	</div>
        	
        	<div id="g_panel">
        		<div class="push_button" id="tool_ungroup" title="Ungroup Elements [G]"></div>
        	</div>
        
        	<!-- For anchor elements -->
        	<div id="a_panel">
        		<label id="tool_link_url" title="Set link URL (leave empty to remove)">
        			<span id="linkLabel" class="icon_label"></span>
        			<input id="link_url" type="text" size="35"/>
        		</label>	
        	</div>
        	
        	<div id="path_node_panel">
        		<div class="tool_sep"></div>
        		<div class="tool_button push_button_pressed" id="tool_node_link" title="Link Control Points"></div>
        		<div class="tool_sep"></div>
        		<label id="tool_node_x">x:
        			<input id="path_node_x" class="attr_changer" title="Change node's x coordinate" size="3" data-attr="x"/>
        		</label>
        		<label id="tool_node_y">y:
        			<input id="path_node_y" class="attr_changer" title="Change node's y coordinate" size="3" data-attr="y"/>
        		</label>
        		
        		<select id="seg_type" title="Change Segment type">
        			<option id="straight_segments" selected="selected" value="4">Straight</option>
        			<option id="curve_segments" value="6">Curve</option>
        		</select>
        		<div class="tool_button" id="tool_node_clone" title="Clone Node"></div>
        		<div class="tool_button" id="tool_node_delete" title="Delete Node"></div>
        		<div class="tool_button" id="tool_openclose_path" title="Open/close sub-path"></div>
        		<div class="tool_button" id="tool_add_subpath" title="Add sub-path"></div>
        	</div>
        </div> <!-- tools_top -->
        	<div id="cur_context_panel">
        		
        	</div>
        
        
        <div id="tools_left" class="tools_panel">
        	<div class="tool_button" id="tool_select" title="Select Tool"></div>
        	<div class="tool_button" id="tool_fhpath" title="Pencil Tool"></div>
        	<div class="tool_button" id="tool_line" title="Line Tool"></div>
        	<div class="tool_button flyout_current" id="tools_rect_show" title="Square/Rect Tool">
        		<div class="flyout_arrow_horiz"></div>
        	</div>
        	<div class="tool_button flyout_current" id="tools_ellipse_show" title="Ellipse/Circle Tool">
        		<div class="flyout_arrow_horiz"></div>
        	</div>
        	<div class="tool_button" id="tool_path" title="Path Tool"></div>
        	<div class="tool_button" id="tool_text" title="Text Tool"></div>
        	<div class="tool_button" id="tool_image" title="Image Tool"></div>
        	<div class="tool_button" id="tool_zoom" title="Zoom Tool [Ctrl+Up/Down]"></div>
        	
        	<div style="display: none">
        		<div id="tool_rect" title="Rectangle"></div>
        		<div id="tool_square" title="Square"></div>
        		<div id="tool_fhrect" title="Free-Hand Rectangle"></div>
        		<div id="tool_ellipse" title="Ellipse"></div>
        		<div id="tool_circle" title="Circle"></div>
        		<div id="tool_fhellipse" title="Free-Hand Ellipse"></div>
        	</div>
        </div> <!-- tools_left -->
        
        <div id="tools_bottom" class="tools_panel">
        
        	<!-- Zoom buttons -->
        	<div id="zoom_panel" class="toolset" title="Change zoom level">
        		<label>
        		<span id="zoomLabel" class="zoom_tool icon_label"></span>
        		<input id="zoom" size="3" value="100" type="text" />
        		</label>
        		<div id="zoom_dropdown" class="dropdown">
        			<button></button>
        			<ul>
        				<li>1000%</li>
        				<li>400%</li>
        				<li>200%</li>
        				<li>100%</li>
        				<li>50%</li>
        				<li>25%</li>
        				<li id="fit_to_canvas" data-val="canvas">Fit to canvas</li>
        				<li id="fit_to_sel" data-val="selection">Fit to selection</li>
        				<li id="fit_to_layer_content" data-val="layer">Fit to layer content</li>
        				<li id="fit_to_all" data-val="content">Fit to all content</li>
        				<li>100%</li>
        			</ul>
        		</div>
        		<div class="tool_sep"></div>
        	</div>
        
        	<div id="tools_bottom_2">
        		<div id="color_tools">
        			
        			<div class="color_tool" id="tool_fill">
        				<label class="icon_label" for="fill_color" title="Change fill color"></label>
        				<div class="color_block">
        					<div id="fill_bg"></div>
        					<div id="fill_color" class="color_block"></div>
        				</div>
        			</div>
        		
        			<div class="color_tool" id="tool_stroke">
        				<label class="icon_label" title="Change stroke color"></label>
        				<div class="color_block">
        					<div id="stroke_bg"></div>
        					<div id="stroke_color" class="color_block" title="Change stroke color"></div>
        				</div>
        				
        				<label class="stroke_label">
        					<input id="stroke_width" title="Change stroke width by 1, shift-click to change by 0.1" size="2" value="5" type="text" data-attr="Stroke Width"/>
        				</label>
        
        				<div id="toggle_stroke_tools" title="Show/hide more stroke tools"></div>
        				
        				<label class="stroke_tool">
        					<select id="stroke_style" title="Change stroke dash style">
        						<option selected="selected" value="none">&#8212;</option>
        						<option value="2,2">...</option>
        						<option value="5,5">- -</option>
        						<option value="5,2,2,2">- .</option>
        						<option value="5,2,2,2,2,2">- ..</option>
        					</select>
        				</label>
        
         				<div class="stroke_tool dropdown" id="stroke_linejoin">
        					<div id="cur_linejoin" title="Linejoin: Miter"></div>
        					<button></button>
         				</div>
         				
         				<div class="stroke_tool dropdown" id="stroke_linecap">
        					<div id="cur_linecap" title="Linecap: Butt"></div>
        					<button></button>
         				</div>
        
        			</div>
        
        			<div class="color_tool" id="tool_opacity" title="Change selected item opacity">
        				<label>
        					<span id="group_opacityLabel" class="icon_label"></span>
        					<input id="group_opacity" size="3" value="100" type="text"/>
        				</label>
        				<div id="opacity_dropdown" class="dropdown">
        					<button></button>
        					<ul>
        						<li>0%</li>
        						<li>25%</li>
        						<li>50%</li>
        						<li>75%</li>
        						<li>100%</li>
        						<li class="special"><div id="opac_slider"></div></li>
        					</ul>
        				</div>
        			</div>
        		</div>
        
        	</div>
        
        	<div id="tools_bottom_3">
        		<div id="palette_holder"><div id="palette" title="Click to change fill color, shift-click to change stroke color"></div></div>
        	</div>
        	<!-- <div id="copyright"><span id="copyrightLabel">Powered by</span> <a href="http://svg-edit.googlecode.com/" target="_blank">SVG-edit v2.6-beta</a></div> -->
        </div>
        
        <div id="option_lists" class="dropdown">
        	<ul id="linejoin_opts">
        		<li class="tool_button current" id="linejoin_miter" title="Linejoin: Miter"></li>
        		<li class="tool_button" id="linejoin_round" title="Linejoin: Round"></li>
        		<li class="tool_button" id="linejoin_bevel" title="Linejoin: Bevel"></li>
        	</ul>
        	
        	<ul id="linecap_opts">
        		<li class="tool_button current" id="linecap_butt" title="Linecap: Butt"></li>
        		<li class="tool_button" id="linecap_square" title="Linecap: Square"></li>
        		<li class="tool_button" id="linecap_round" title="Linecap: Round"></li>
        	</ul>
        	
        	<ul id="position_opts" class="optcols3">
        		<li class="push_button" id="tool_posleft" title="Align Left"></li>
        		<li class="push_button" id="tool_poscenter" title="Align Center"></li>
        		<li class="push_button" id="tool_posright" title="Align Right"></li>
        		<li class="push_button" id="tool_postop" title="Align Top"></li>
        		<li class="push_button" id="tool_posmiddle" title="Align Middle"></li>
        		<li class="push_button" id="tool_posbottom" title="Align Bottom"></li>
        	</ul>
        </div>
        
        
        <!-- hidden divs -->
        <div id="color_picker"></div>
        
        </div> <!-- svg_editor -->
        
        <div id="svg_source_editor">
        	<div class="overlay"></div>
        	<div id="svg_source_container">
        		<div id="tool_source_back" class="toolbar_button">
        			<button id="tool_source_save">Apply Changes</button>
        			<button id="tool_source_cancel">Cancel</button>
        		</div>
        		<div id="save_output_btns">
        			<p id="copy_save_note">Copy the contents of this box into a text editor, then save the file with a .svg extension.</p>
        			<button id="copy_save_done">Done</button>
        		</div>
        		<form>
        			<textarea id="svg_source_textarea" spellcheck="false"></textarea>
        		</form>
        	</div>
        </div>
        
        
        <div id="svg_docprops">
        	<div class="overlay"></div>
        	<div id="svg_docprops_container">
        		<div id="tool_docprops_back" class="toolbar_button">
        			<button id="tool_docprops_save">OK</button>
        			<button id="tool_docprops_cancel">Cancel</button>
        		</div>
        
        
        		<fieldset id="svg_docprops_docprops">
        			<legend id="svginfo_image_props">Image Properties</legend>
        			<label>
        				<span id="svginfo_title">Title:</span>
        				<input type="text" id="canvas_title"/>
        			</label>
        
        			<fieldset id="change_resolution">
        				<legend id="svginfo_dim">Canvas Dimensions</legend>
        
        				<label><span id="svginfo_width">width:</span> <input type="text" id="canvas_width" size="6"/></label>
        
        				<label><span id="svginfo_height">height:</span> <input type="text" id="canvas_height" size="6"/></label>
        
        				<label>
        					<select id="resolution">
        						<option id="selectedPredefined" selected="selected">Select predefined:</option>
        						<option>640x480</option>
        						<option>800x600</option>
        						<option>1024x768</option>
        						<option>1280x960</option>
        						<option>1600x1200</option>
        						<option id="fitToContent" value="content">Fit to Content</option>
        					</select>
        				</label>
        			</fieldset>
        
        			<fieldset id="image_save_opts">
        				<legend id="includedImages">Included Images</legend>
        				<label><input type="radio" name="image_opt" value="embed" checked="checked"/> <span id="image_opt_embed">Embed data (local files)</span> </label>
        				<label><input type="radio" name="image_opt" value="ref"/> <span id="image_opt_ref">Use file reference</span> </label>
        			</fieldset>
        		</fieldset>
        
        	</div>
        </div>
        
        <div id="svg_prefs">
        	<div class="overlay"></div>
        	<div id="svg_prefs_container">
        		<div id="tool_prefs_back" class="toolbar_button">
        			<button id="tool_prefs_save">OK</button>
        			<button id="tool_prefs_cancel">Cancel</button>
        		</div>
        
        		<fieldset>
        			<legend id="svginfo_editor_prefs">Editor Preferences</legend>
        
        			<label><span id="svginfo_lang">Language:</span>
        				<!-- Source: http://en.wikipedia.org/wiki/Language_names -->
        				<select id="lang_select">
        				  <option id="lang_ar" value="ar">العربية</option>
        					<option id="lang_cs" value="cs">Čeština</option>
        					<option id="lang_de" value="de">Deutsch</option>
        					<option id="lang_en" value="en" selected="selected">English</option>
        					<option id="lang_es" value="es">Español</option>
        					<option id="lang_fa" value="fa">فارسی</option>
        					<option id="lang_fr" value="fr">Français</option>
        					<option id="lang_fy" value="fy">Frysk</option>
        					<option id="lang_hi" value="hi">&#2361;&#2367;&#2344;&#2381;&#2342;&#2368;, &#2361;&#2367;&#2306;&#2342;&#2368;</option>
        					<option id="lang_it" value="it">Italiano</option>
        					<option id="lang_ja" value="ja">日本語</option>
        					<option id="lang_nl" value="nl">Nederlands</option>
        					<option id="lang_pl" value="pl">Polski</option>
        					<option id="lang_pt-BR" value="pt-BR">Português (BR)</option>
        					<option id="lang_ro" value="ro">Română</option>
        					<option id="lang_ru" value="ru">Русский</option>
        					<option id="lang_sk" value="sk">Slovenčina</option>
        					<option id="lang_sl" value="sl">Slovenščina</option>
        					<option id="lang_zh-TW" value="zh-TW">繁體中文</option>
        				</select>
        			</label>
        
        			<label><span id="svginfo_icons">Icon size:</span>
        				<select id="iconsize">
        					<option id="icon_small" value="s">Small</option>
        					<option id="icon_medium" value="m" selected="selected">Medium</option>
        					<option id="icon_large" value="l">Large</option>
        					<option id="icon_xlarge" value="xl">Extra Large</option>
        				</select>
        			</label>
        
        			<fieldset id="change_background">
        				<legend id="svginfo_change_background">Editor Background</legend>
        				<div id="bg_blocks"></div>
        				<label><span id="svginfo_bg_url">URL:</span> <input type="text" id="canvas_bg_url"/></label>
        				<p id="svginfo_bg_note">Note: Background will not be saved with image.</p>
        			</fieldset>
        
        			<fieldset id="change_grid">
        				<legend id="svginfo_grid_settings">Grid</legend>
        				<label><span id="svginfo_snap_onoff">Snapping on/off</span><input type="checkbox" value="snapping_on" id="grid_snapping_on"/></label>
        				<label><span id="svginfo_snap_step">Snapping Step-Size:</span> <input type="text" id="grid_snapping_step" size="3" value="10"/></label>
        				<label><span id="svginfo_grid_color">Grid color:</span> <input type="text" id="grid_color" size="3" value="#000"/></label>
        			</fieldset>
        
        			<fieldset id="units_rulers">
        				<legend id="svginfo_units_rulers">Units &amp; Rulers</legend>
        				<label><span id="svginfo_rulers_onoff">Show rulers</span><input type="checkbox" value="show_rulers" id="show_rulers" checked="checked"/></label>
        				<label>
        					<span id="svginfo_unit">Base Unit:</span>
        					<select id="base_unit">
        						<option value="px">Pixels</option>
        						<option value="cm">Centimeters</option>
        						<option value="mm">Millimeters</option>
        						<option value="in">Inches</option>
        						<option value="pt">Points</option>
        						<option value="pc">Picas</option>
        						<option value="em">Ems</option>
        						<option value="ex">Exs</option>
        					</select>
        				</label>
        				<!-- Should this be an export option instead? -->
        <!-- 
        				<span id="svginfo_unit_system">Unit System:</span>
        				<label>
        					<input type="radio" name="unit_system" value="single" checked="checked"/>
        					<span id="svginfo_single_type_unit">Single type unit</span>
        					<small id="svginfo_single_type_unit_sub">CSS unit type is set on root element. If a different unit type is entered in a text field, it is converted back to user units on export.</small>
        				</label>
        				<label>
        					<input type="radio" name="unit_system" value="multi"/>
        					<span id="svginfo_multi_units">Multiple CSS units</span> 
        					<small id="svginfo_single_type_unit_sub">Attributes can be given different CSS units, which may lead to inconsistant results among viewers.</small>
        				</label>
         -->
        			</fieldset>
        
        		</fieldset>
        
        	</div>
        </div>
        
        <div id="dialog_box">
        	<div class="overlay"></div>
        	<div id="dialog_container">
        		<div id="dialog_content"></div>
        		<div id="dialog_buttons"></div>
        	</div>
        </div>
        
        <ul id="cmenu_canvas" class="contextMenu">
        	<li><a href="#cut">Cut</a></li>
        	<li><a href="#copy">Copy</a></li>
        	<li><a href="#paste">Paste</a></li>
        	<li><a href="#paste_in_place">Paste in Place</a></li>
        	<li class="separator"><a href="#delete">Delete</a></li>
        	<li class="separator"><a href="#group">Group<span class="shortcut">G</span></a></li>
        	<li><a href="#ungroup">Ungroup<span class="shortcut">G</span></a></li>
        	<li class="separator"><a href="#move_front">Bring to Front<span class="shortcut">SHFT+CTRL+]</span></a></li>
        	<li><a href="#move_up">Bring Forward<span class="shortcut">CTRL+]</span></a></li>
        	<li><a href="#move_down">Send Backward<span class="shortcut">CTRL+[</span></a></li>
        	<li><a href="#move_back">Send to Back<span class="shortcut">SHFT+CTRL+[</span></a></li>
        </ul>
        
        
        <ul id="cmenu_layers" class="contextMenu">
        	<li><a href="#dupe">Duplicate Layer...</a></li>
        	<li><a href="#delete">Delete Layer</a></li>
        	<li><a href="#merge_down">Merge Down</a></li>
        	<li><a href="#merge_all">Merge All</a></li>
        </ul>
        
        <!-- /body -->
        
      • svg-editor.js
        /*globals svgEditor:true, globalStorage, widget, svgedit, canvg, jQuery, $, DOMParser, FileReader */
        /*jslint vars: true, eqeq: true, todo: true, forin: true, continue: true, regexp: true */
        /*
         * svg-editor.js
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Pavol Rusnak
         * Copyright(c) 2010 Jeff Schiller
         * Copyright(c) 2010 Narendra Sisodiya
         * Copyright(c) 2014 Brett Zamir
         *
         */
        
        // Dependencies:
        // 1) units.js
        // 2) browser.js
        // 3) svgcanvas.js
        
        /*
        TODOS
        1. JSDoc
        */
        (function() {
        
        	if (window.svgEditor) {
        		return;
        	}
        	window.svgEditor = (function($) {
        		var editor = {};
        		// EDITOR PROPERTIES: (defined below)
        		//		curPrefs, curConfig, canvas, storage, uiStrings
        		//
        		// STATE MAINTENANCE PROPERTIES
        		editor.tool_scale = 1; // Dependent on icon size, so any use to making configurable instead? Used by JQuerySpinBtn.js
        		editor.exportWindowCt = 0;
        		editor.langChanged = false;
        		editor.showSaveWarning = false;
        		editor.storagePromptClosed = false; // For use with ext-storage.js
        
        		var svgCanvas, urldata,
        			Utils = svgedit.utilities,
        			isReady = false,
        			customExportImage = false,
        			customExportPDF = false,
        			callbacks = [],
        			/**
        			* PREFS AND CONFIG
        			*/
        			// The iteration algorithm for defaultPrefs does not currently support array/objects
        			defaultPrefs = {
        				// EDITOR OPTIONS (DIALOG)
        				lang: '', // Default to "en" if locale.js detection does not detect another language
        				iconsize: '', // Will default to 's' if the window height is smaller than the minimum height and 'm' otherwise
        				bkgd_color: '#FFF',
        				bkgd_url: '',
        				// DOCUMENT PROPERTIES (DIALOG)
        				img_save: 'embed',
        				// ALERT NOTICES
        				// Only shows in UI as far as alert notices, but useful to remember, so keeping as pref
        				save_notice_done: false,
        				export_notice_done: false
        			},
        			curPrefs = {},
        			// Note: The difference between Prefs and Config is that Prefs
        			//   can be changed in the UI and are stored in the browser,
        			//   while config cannot
        			curConfig = {
        				// We do not put on defaultConfig to simplify object copying
        				//   procedures (we obtain instead from defaultExtensions)
        				extensions: [],
        				/**
        				* Can use window.location.origin to indicate the current
        				* origin. Can contain a '*' to allow all domains or 'null' (as
        				* a string) to support all file:// URLs. Cannot be set by
        				* URL for security reasons (not safe, at least for
        				* privacy or data integrity of SVG content).
        				* Might have been fairly safe to allow
        				*   `new URL(window.location.href).origin` by default but
        				*   avoiding it ensures some more security that even third
        				*   party apps on the same domain also cannot communicate
        				*   with this app by default.
        				* For use with ext-xdomain-messaging.js
        				* @todo We might instead make as a user-facing preference.
        				*/
        				allowedOrigins: []
        			},
        			defaultExtensions = [
        				'ext-overview_window.js',
        				'ext-markers.js',
        				'ext-connector.js',
        				'ext-eyedropper.js',
        				'ext-shapes.js',
        				'ext-imagelib.js',
        				'ext-grid.js',
        				'ext-polygon.js',
        				'ext-star.js',
        				'ext-panning.js',
        				'ext-storage.js'
        			],
        			defaultConfig = {
        				// Todo: svgcanvas.js also sets and checks: show_outside_canvas, selectNew; add here?
        				// Change the following to preferences and add pref controls to the UI (e.g., initTool, wireframe, showlayers)?
        				canvasName: 'default',
        				canvas_expansion: 3,
        				initFill: {
        					color: 'FF0000', // solid red
        					opacity: 1
        				},
        				initStroke: {
        					width: 5,
        					color: '000000', // solid black
        					opacity: 1
        				},
        				initOpacity: 1,
        				colorPickerCSS: null, // Defaults to 'left' with a position equal to that of the fill_color or stroke_color element minus 140, and a 'bottom' equal to 40
        				initTool: 'select',
        				exportWindowType: 'new', // 'same' (todo: also support 'download')
        				wireframe: false,
        				showlayers: false,
        				no_save_warning: false,
        				// PATH CONFIGURATION
        				// The following path configuration items are disallowed in the URL (as should any future path configurations)
        				imgPath: 'images/',
        				langPath: 'locale/',
        				extPath: 'extensions/',
        				jGraduatePath: 'jgraduate/images/',
        				// DOCUMENT PROPERTIES
        				// Change the following to a preference (already in the Document Properties dialog)?
        				dimensions: [640, 480],
        				// EDITOR OPTIONS
        				// Change the following to preferences (already in the Editor Options dialog)?
        				gridSnapping: false,
        				gridColor: '#000',
        				baseUnit: 'px',
        				snappingStep: 10,
        				showRulers: true,
        				// URL BEHAVIOR CONFIGURATION
        				preventAllURLConfig: false,
        				preventURLContentLoading: false,
        				// EXTENSION CONFIGURATION (see also preventAllURLConfig)
        				lockExtensions: false, // Disallowed in URL setting
        				noDefaultExtensions: false, // noDefaultExtensions can only be meaningfully used in config.js or in the URL
        				// EXTENSION-RELATED (GRID)
        				showGrid: false, // Set by ext-grid.js
        				// EXTENSION-RELATED (STORAGE)
        				noStorageOnLoad: false, // Some interaction with ext-storage.js; prevent even the loading of previously saved local storage
        				forceStorage: false, // Some interaction with ext-storage.js; strongly discouraged from modification as it bypasses user privacy by preventing them from choosing whether to keep local storage or not
        				emptyStorageOnDecline: false // Used by ext-storage.js; empty any prior storage if the user declines to store
        			},
        			/**
        			* LOCALE
        			* @todo Can we remove now that we are always loading even English? (unless locale is set to null)
        			*/
        			uiStrings = editor.uiStrings = {
        				common: {
        					ok: 'OK',
        					cancel: 'Cancel',
        					key_up: 'Up',
        					key_down: 'Down',
        					key_backspace: 'Backspace',
        					key_del: 'Del'
        				},
        				// This is needed if the locale is English, since the locale strings are not read in that instance.
        				layers: {
        					layer: 'Layer'
        				},
        				notification: {
        					invalidAttrValGiven: 'Invalid value given',
        					noContentToFitTo: 'No content to fit to',
        					dupeLayerName: 'There is already a layer named that!',
        					enterUniqueLayerName: 'Please enter a unique layer name',
        					enterNewLayerName: 'Please enter the new layer name',
        					layerHasThatName: 'Layer already has that name',
        					QmoveElemsToLayer: 'Move selected elements to layer \'%s\'?',
        					QwantToClear: 'Do you want to clear the drawing?\nThis will also erase your undo history!',
        					QwantToOpen: 'Do you want to open a new file?\nThis will also erase your undo history!',
        					QerrorsRevertToSource: 'There were parsing errors in your SVG source.\nRevert back to original SVG source?',
        					QignoreSourceChanges: 'Ignore changes made to SVG source?',
        					featNotSupported: 'Feature not supported',
        					enterNewImgURL: 'Enter the new image URL',
        					defsFailOnSave: 'NOTE: Due to a bug in your browser, this image may appear wrong (missing gradients or elements). It will however appear correct once actually saved.',
        					loadingImage: 'Loading image, please wait...',
        					saveFromBrowser: 'Select \'Save As...\' in your browser to save this image as a %s file.',
        					noteTheseIssues: 'Also note the following issues: ',
        					unsavedChanges: 'There are unsaved changes.',
        					enterNewLinkURL: 'Enter the new hyperlink URL',
        					errorLoadingSVG: 'Error: Unable to load SVG data',
        					URLloadFail: 'Unable to load from URL',
        					retrieving: 'Retrieving \'%s\' ...'
        				}
        			};
        
        		function loadSvgString (str, callback) {
        			var success = svgCanvas.setSvgString(str) !== false;
        			callback = callback || $.noop;
        			if (success) {
        				callback(true);
        			} else {
        				$.alert(uiStrings.notification.errorLoadingSVG, function() {
        					callback(false);
        				});
        			}
        		}
        		
        		/**
        		* EXPORTS
        		*/
        		
        		/**
        		* Store and retrieve preferences
        		* @param {string} key The preference name to be retrieved or set
        		* @param {string} [val] The value. If the value supplied is missing or falsey, no change to the preference will be made.
        		* @returns {string} If val is missing or falsey, the value of the previously stored preference will be returned.
        		* @todo Can we change setting on the jQuery namespace (onto editor) to avoid conflicts?
        		* @todo Review whether any remaining existing direct references to
        		*	getting curPrefs can be changed to use $.pref() getting to ensure
        		*	defaultPrefs fallback (also for sake of allowInitialUserOverride); specifically, bkgd_color could be changed so that
        		*	the pref dialog has a button to auto-calculate background, but otherwise uses $.pref() to be able to get default prefs
        		*	or overridable settings
        		*/
        		$.pref = function (key, val) {
        			if (val) {
        				curPrefs[key] = val;
        				editor.curPrefs = curPrefs; // Update exported value
        				return;
        			}
        			return (key in curPrefs) ? curPrefs[key] : defaultPrefs[key];
        		};
        		
        		/**
        		* EDITOR PUBLIC METHODS
        		* locale.js also adds "putLang" and "readLang" as editor methods
        		* @todo Sort these methods per invocation order, ideally with init at the end
        		* @todo Prevent execution until init executes if dependent on it?
        		*/
        
        		/**
        		* Where permitted, sets canvas and/or defaultPrefs based on previous
        		*	storage. This will override URL settings (for security reasons) but
        		*	not config.js configuration (unless initial user overriding is explicitly
        		*	permitted there via allowInitialUserOverride).
        		* @todo Split allowInitialUserOverride into allowOverrideByURL and
        		*	allowOverrideByUserStorage so config.js can disallow some
        		*	individual items for URL setting but allow for user storage AND/OR
        		*	change URL setting so that it always uses a different namespace,
        		*	so it won't affect pre-existing user storage (but then if users saves
        		*	that, it will then be subject to tampering
        		*/
        		editor.loadContentAndPrefs = function () {
        			if (!curConfig.forceStorage && (curConfig.noStorageOnLoad || !document.cookie.match(/(?:^|;\s*)store=(?:prefsAndContent|prefsOnly)/))) {
        				return;
        			}
        
        			// LOAD CONTENT
        			if (editor.storage && // Cookies do not have enough available memory to hold large documents
        				(curConfig.forceStorage || (!curConfig.noStorageOnLoad && document.cookie.match(/(?:^|;\s*)store=prefsAndContent/)))
        			) {
        				var name = 'svgedit-' + curConfig.canvasName;
        				var cached = editor.storage.getItem(name);
        				if (cached) {
        					editor.loadFromString(cached);
        				}
        			}
        			
        			// LOAD PREFS
        			var key;
        			for (key in defaultPrefs) {
        				if (defaultPrefs.hasOwnProperty(key)) { // It's our own config, so we don't need to iterate up the prototype chain
        					var storeKey = 'svg-edit-' + key;
        					if (editor.storage) {
        						var val = editor.storage.getItem(storeKey);
        						if (val) {
        							defaultPrefs[key] = String(val); // Convert to string for FF (.value fails in Webkit)
        						}
        					}
        					else if (window.widget) {
        						defaultPrefs[key] = widget.preferenceForKey(storeKey);
        					}
        					else {
        						var result = document.cookie.match(new RegExp('(?:^|;\\s*)' + Utils.preg_quote(encodeURIComponent(storeKey)) + '=([^;]+)'));
        						defaultPrefs[key] = result ? decodeURIComponent(result[1]) : '';
        					}
        				}
        			}
        		};
        
        		/**
        		* Allows setting of preferences or configuration (including extensions).
        		* @param {object} opts The preferences or configuration (including extensions)
        		* @param {object} [cfgCfg] Describes configuration which applies to the particular batch of supplied options
        		* @param {boolean} [cfgCfg.allowInitialUserOverride=false] Set to true if you wish
        		*	to allow initial overriding of settings by the user via the URL
        		*	(if permitted) or previously stored preferences (if permitted);
        		*	note that it will be too late if you make such calls in extension
        		*	code because the URL or preference storage settings will
        		*   have already taken place.
        		* @param {boolean} [cfgCfg.overwrite=true] Set to false if you wish to
        		*	prevent the overwriting of prior-set preferences or configuration
        		*	(URL settings will always follow this requirement for security
        		*	reasons, so config.js settings cannot be overridden unless it
        		*	explicitly permits via "allowInitialUserOverride" but extension config
        		*	can be overridden as they will run after URL settings). Should
        		*   not be needed in config.js.
        		*/
        		editor.setConfig = function (opts, cfgCfg) {
        			cfgCfg = cfgCfg || {};
        			function extendOrAdd (cfgObj, key, val) {
        				if (cfgObj[key] && typeof cfgObj[key] === 'object') {
        					$.extend(true, cfgObj[key], val);
        				}
        				else {
        					cfgObj[key] = val;
        				}
        				return;
        			}
        			$.each(opts, function(key, val) {
        				if (opts.hasOwnProperty(key)) {
        					// Only allow prefs defined in defaultPrefs
        					if (defaultPrefs.hasOwnProperty(key)) {
        						if (cfgCfg.overwrite === false && (
        							curConfig.preventAllURLConfig ||
        							curPrefs.hasOwnProperty(key)
        						)) {
        							return;
        						}
        						if (cfgCfg.allowInitialUserOverride === true) {
        							defaultPrefs[key] = val;
        						}
        						else {
        							$.pref(key, val);
        						}
        					}
        					else if (['extensions', 'allowedOrigins'].indexOf(key) > -1) {
        						if (cfgCfg.overwrite === false &&
        							(
        								curConfig.preventAllURLConfig ||
        								key === 'allowedOrigins' ||
        								(key === 'extensions' && curConfig.lockExtensions)
        							)
        						) {
        							return;
        						}
        						curConfig[key] = curConfig[key].concat(val); // We will handle any dupes later
        					}
        					// Only allow other curConfig if defined in defaultConfig
        					else if (defaultConfig.hasOwnProperty(key)) {
        						if (cfgCfg.overwrite === false && (
        							curConfig.preventAllURLConfig ||
        							curConfig.hasOwnProperty(key)
        						)) {
        							return;
        						}
        						// Potentially overwriting of previously set config
        						if (curConfig.hasOwnProperty(key)) {
        							if (cfgCfg.overwrite === false) {
        								return;
        							}
        							extendOrAdd(curConfig, key, val);
        						}
        						else {
        							if (cfgCfg.allowInitialUserOverride === true) {
        								extendOrAdd(defaultConfig, key, val);
        							}
        							else {
        								if (defaultConfig[key] && typeof defaultConfig[key] === 'object') {
        									curConfig[key] = {};
        									$.extend(true, curConfig[key], val); // Merge properties recursively, e.g., on initFill, initStroke objects
        								}
        								else {
        									curConfig[key] = val;
        								}
        							}
        						}
        					}
        				}
        			});
        			editor.curConfig = curConfig; // Update exported value
        		};
        
        		/**
        		* @param {object} opts Extension mechanisms may call setCustomHandlers with three functions: opts.open, opts.save, and opts.exportImage
        		* opts.open's responsibilities are:
        		*	- invoke a file chooser dialog in 'open' mode
        		*	- let user pick a SVG file
        		*	- calls svgCanvas.setSvgString() with the string contents of that file
        		*  opts.save's responsibilities are:
        		*	- accept the string contents of the current document
        		*	- invoke a file chooser dialog in 'save' mode
        		*	- save the file to location chosen by the user
        		*  opts.exportImage's responsibilities (with regard to the object it is supplied in its 2nd argument) are:
        		*	- inform user of any issues supplied via the "issues" property
        		*	- convert the "svg" property SVG string into an image for export;
        		*		utilize the properties "type" (currently 'PNG', 'JPEG', 'BMP',
        		*		'WEBP', 'PDF'), "mimeType", and "quality" (for 'JPEG' and 'WEBP'
        		*		types) to determine the proper output.
        		*/
        		editor.setCustomHandlers = function (opts) {
        			editor.ready(function() {
        				if (opts.open) {
        					$('#tool_open > input[type="file"]').remove();
        					$('#tool_open').show();
        					svgCanvas.open = opts.open;
        				}
        				if (opts.save) {
        					editor.showSaveWarning = false;
        					svgCanvas.bind('saved', opts.save);
        				}
        				if (opts.exportImage) {
        					customExportImage = opts.exportImage;
        					svgCanvas.bind('exported', customExportImage); // canvg and our RGBColor will be available to the method
        				}
        				if (opts.exportPDF) {
        					customExportPDF = opts.exportPDF;
        					svgCanvas.bind('exportedPDF', customExportPDF); // jsPDF and our RGBColor will be available to the method
        				}
        			});
        		};
        
        		editor.randomizeIds = function () {
        			svgCanvas.randomizeIds(arguments);
        		};
        
        		editor.init = function () {
        			// var host = location.hostname,
        			//	onWeb = host && host.indexOf('.') >= 0;
        			// Some FF versions throw security errors here when directly accessing
        			try {
        				if ('localStorage' in window) { // && onWeb removed so Webkit works locally
        					editor.storage = localStorage;
        				}
        			} catch(err) {}
        
        			// Todo: Avoid var-defined functions and group functions together, etc. where possible
        			var good_langs = [];
        			$('#lang_select option').each(function() {
        				good_langs.push(this.value);
        			});
        
        			function setupCurPrefs () {
        				curPrefs = $.extend(true, {}, defaultPrefs, curPrefs); // Now safe to merge with priority for curPrefs in the event any are already set
        				// Export updated prefs
        				editor.curPrefs = curPrefs;
        			}
        			function setupCurConfig () {
        				curConfig = $.extend(true, {}, defaultConfig, curConfig); // Now safe to merge with priority for curConfig in the event any are already set
        				
        				// Now deal with extensions and other array config
        				if (!curConfig.noDefaultExtensions) {
        					curConfig.extensions = curConfig.extensions.concat(defaultExtensions);
        				}
        				// ...and remove any dupes
        				$.each(['extensions', 'allowedOrigins'], function (i, cfg) {
        					curConfig[cfg] = $.grep(curConfig[cfg], function (n, i) {
        						return i === curConfig[cfg].indexOf(n);
        					});
        				});
        				// Export updated config
        				editor.curConfig = curConfig;
        			}
        			(function() {
        				// Load config/data from URL if given
        				var src, qstr;
        				urldata = $.deparam.querystring(true);
        				if (!$.isEmptyObject(urldata)) {
        					if (urldata.dimensions) {
        						urldata.dimensions = urldata.dimensions.split(',');
        					}
        
        					if (urldata.bkgd_color) {
        						urldata.bkgd_color = '#' + urldata.bkgd_color;
        					}
        			
        					if (urldata.extensions) {
        						// For security reasons, disallow cross-domain or cross-folder extensions via URL
        						urldata.extensions = urldata.extensions.match(/[:\/\\]/) ? '' : urldata.extensions.split(',');
        					}
        
        					// Disallowing extension paths via URL for
        					// security reasons, even for same-domain
        					// ones given potential to interact in undesirable
        					// ways with other script resources
        					$.each(
        						[
        							'extPath', 'imgPath',
        							'langPath', 'jGraduatePath'
        						],
        						function (pathConfig) {
        							if (urldata[pathConfig]) {
        								delete urldata[pathConfig];
        							}
        						}
        					);
        
        					editor.setConfig(urldata, {overwrite: false}); // Note: source and url (as with storagePrompt later) are not set on config but are used below
        					
        					setupCurConfig();
        
        					if (!curConfig.preventURLContentLoading) {
        						src = urldata.source;
        						qstr = $.param.querystring();
        						if (!src) { // urldata.source may have been null if it ended with '='
        							if (qstr.indexOf('source=data:') >= 0) {
        								src = qstr.match(/source=(data:[^&]*)/)[1];
        							}
        						}
        						if (src) {
        							if (src.indexOf('data:') === 0) {
        								editor.loadFromDataURI(src);
        							} else {
        								editor.loadFromString(src);
        							}
        							return;
        						}
        						if (urldata.url) {
        							editor.loadFromURL(urldata.url);
        							return;
        						}
        					}
        					if (!urldata.noStorageOnLoad || curConfig.forceStorage) {
        						editor.loadContentAndPrefs();
        					}
        					setupCurPrefs();
        				}
        				else {
        					setupCurConfig();
        					editor.loadContentAndPrefs();
        					setupCurPrefs();
        				}
        			}());
        
        			// For external openers
        			(function() {
        				// let the opener know SVG Edit is ready (now that config is set up)
        				var svgEditorReadyEvent,
        					w = window.opener;
        				if (w) {
        					try {
        						svgEditorReadyEvent = w.document.createEvent('Event');
        						svgEditorReadyEvent.initEvent('svgEditorReady', true, true);
        						w.document.documentElement.dispatchEvent(svgEditorReadyEvent);
        					}
        					catch(e) {}
        				}
        			}());
        			
        			var setIcon = editor.setIcon = function(elem, icon_id, forcedSize) {
        				var icon = (typeof icon_id === 'string') ? $.getSvgIcon(icon_id, true) : icon_id.clone();
        				if (!icon) {
        					console.log('NOTE: Icon image missing: ' + icon_id);
        					return;
        				}
        				$(elem).empty().append(icon);
        			};
        
        			var extFunc = function() {
        				$.each(curConfig.extensions, function() {
        					var extname = this;
        					if (!extname.match(/^ext-.*\.js/)) { // Ensure URL cannot specify some other unintended file in the extPath
        						return;
        					}
        					$.getScript(curConfig.extPath + extname, function(d) {
        						// Fails locally in Chrome 5
        						if (!d) {
        							var s = document.createElement('script');
        							s.src = curConfig.extPath + extname;
        							document.querySelector('head').appendChild(s);
        						}
        					});
        				});
        
        				// var lang = ('lang' in curPrefs) ? curPrefs.lang : null;
        				editor.putLocale(null, good_langs);
        			};
        
        			// Load extensions
        			// Bit of a hack to run extensions in local Opera/IE9
        			if (document.location.protocol === 'file:') {
        				setTimeout(extFunc, 100);
        			} else {
        				extFunc();
        			}
        			$.svgIcons(curConfig.imgPath + 'svg_edit_icons.svg', {
        				w:24, h:24,
        				id_match: false,
        				no_img: !svgedit.browser.isWebkit(), // Opera & Firefox 4 gives odd behavior w/images
        				fallback_path: curConfig.imgPath,
        				fallback: {
        					'new_image': 'clear.png',
        					'save': 'save.png',
        					'open': 'open.png',
        					'source': 'source.png',
        					'docprops': 'document-properties.png',
        					'wireframe': 'wireframe.png',
        
        					'undo': 'undo.png',
        					'redo': 'redo.png',
        
        					'select': 'select.png',
        					'select_node': 'select_node.png',
        					'pencil': 'fhpath.png',
        					'pen': 'line.png',
        					'square': 'square.png',
        					'rect': 'rect.png',
        					'fh_rect': 'freehand-square.png',
        					'circle': 'circle.png',
        					'ellipse': 'ellipse.png',
        					'fh_ellipse': 'freehand-circle.png',
        					'path': 'path.png',
        					'text': 'text.png',
        					'image': 'image.png',
        					'zoom': 'zoom.png',
        
        					'clone': 'clone.png',
        					'node_clone': 'node_clone.png',
        					'delete': 'delete.png',
        					'node_delete': 'node_delete.png',
        					'group': 'shape_group_elements.png',
        					'ungroup': 'shape_ungroup.png',
        					'move_top': 'move_top.png',
        					'move_bottom': 'move_bottom.png',
        					'to_path': 'to_path.png',
        					'link_controls': 'link_controls.png',
        					'reorient': 'reorient.png',
        
        					'align_left': 'align-left.png',
        					'align_center': 'align-center.png',
        					'align_right': 'align-right.png',
        					'align_top': 'align-top.png',
        					'align_middle': 'align-middle.png',
        					'align_bottom': 'align-bottom.png',
        
        					'go_up': 'go-up.png',
        					'go_down': 'go-down.png',
        
        					'ok': 'save.png',
        					'cancel': 'cancel.png',
        
        					'arrow_right': 'flyouth.png',
        					'arrow_down': 'dropdown.gif'
        				},
        				placement: {
        					'#logo': 'logo',
        
        					'#tool_clear div,#layer_new': 'new_image',
        					'#tool_save div': 'save',
        					'#tool_export div': 'export',
        					'#tool_open div div': 'open',
        					'#tool_import div div': 'import',
        					'#tool_source': 'source',
        					'#tool_docprops > div': 'docprops',
        					'#tool_wireframe': 'wireframe',
        
        					'#tool_undo': 'undo',
        					'#tool_redo': 'redo',
        
        					'#tool_select': 'select',
        					'#tool_fhpath': 'pencil',
        					'#tool_line': 'pen',
        					'#tool_rect,#tools_rect_show': 'rect',
        					'#tool_square': 'square',
        					'#tool_fhrect': 'fh_rect',
        					'#tool_ellipse,#tools_ellipse_show': 'ellipse',
        					'#tool_circle': 'circle',
        					'#tool_fhellipse': 'fh_ellipse',
        					'#tool_path': 'path',
        					'#tool_text,#layer_rename': 'text',
        					'#tool_image': 'image',
        					'#tool_zoom': 'zoom',
        
        					'#tool_clone,#tool_clone_multi': 'clone',
        					'#tool_node_clone': 'node_clone',
        					'#layer_delete,#tool_delete,#tool_delete_multi': 'delete',
        					'#tool_node_delete': 'node_delete',
        					'#tool_add_subpath': 'add_subpath',
        					'#tool_openclose_path': 'open_path',
        					'#tool_move_top': 'move_top',
        					'#tool_move_bottom': 'move_bottom',
        					'#tool_topath': 'to_path',
        					'#tool_node_link': 'link_controls',
        					'#tool_reorient': 'reorient',
        					'#tool_group_elements': 'group_elements',
        					'#tool_ungroup': 'ungroup',
        					'#tool_unlink_use': 'unlink_use',
        
        					'#tool_alignleft, #tool_posleft': 'align_left',
        					'#tool_aligncenter, #tool_poscenter': 'align_center',
        					'#tool_alignright, #tool_posright': 'align_right',
        					'#tool_aligntop, #tool_postop': 'align_top',
        					'#tool_alignmiddle, #tool_posmiddle': 'align_middle',
        					'#tool_alignbottom, #tool_posbottom': 'align_bottom',
        					'#cur_position': 'align',
        
        					'#linecap_butt,#cur_linecap': 'linecap_butt',
        					'#linecap_round': 'linecap_round',
        					'#linecap_square': 'linecap_square',
        
        					'#linejoin_miter,#cur_linejoin': 'linejoin_miter',
        					'#linejoin_round': 'linejoin_round',
        					'#linejoin_bevel': 'linejoin_bevel',
        
        					'#url_notice': 'warning',
        
        					'#layer_up': 'go_up',
        					'#layer_down': 'go_down',
        					'#layer_moreopts': 'context_menu',
        					'#layerlist td.layervis': 'eye',
        
        					'#tool_source_save,#tool_docprops_save,#tool_prefs_save': 'ok',
        					'#tool_source_cancel,#tool_docprops_cancel,#tool_prefs_cancel': 'cancel',
        
        					'#rwidthLabel, #iwidthLabel': 'width',
        					'#rheightLabel, #iheightLabel': 'height',
        					'#cornerRadiusLabel span': 'c_radius',
        					'#angleLabel': 'angle',
        					'#linkLabel,#tool_make_link,#tool_make_link_multi': 'globe_link',
        					'#zoomLabel': 'zoom',
        					'#tool_fill label': 'fill',
        					'#tool_stroke .icon_label': 'stroke',
        					'#group_opacityLabel': 'opacity',
        					'#blurLabel': 'blur',
        					'#font_sizeLabel': 'fontsize',
        
        					'.flyout_arrow_horiz': 'arrow_right',
        					'.dropdown button, #main_button .dropdown': 'arrow_down',
        					'#palette .palette_item:first, #fill_bg, #stroke_bg': 'no_color'
        				},
        				resize: {
        					'#logo .svg_icon': 28,
        					'.flyout_arrow_horiz .svg_icon': 5,
        					'.layer_button .svg_icon, #layerlist td.layervis .svg_icon': 14,
        					'.dropdown button .svg_icon': 7,
        					'#main_button .dropdown .svg_icon': 9,
        					'.palette_item:first .svg_icon' : 15,
        					'#fill_bg .svg_icon, #stroke_bg .svg_icon': 16,
        					'.toolbar_button button .svg_icon': 16,
        					'.stroke_tool div div .svg_icon': 20,
        					'#tools_bottom label .svg_icon': 18
        				},
        				callback: function(icons) {
        					$('.toolbar_button button > svg, .toolbar_button button > img').each(function() {
        						$(this).parent().prepend(this);
        					});
        
        					var min_height,
        						tleft = $('#tools_left');
        					if (tleft.length !== 0) {
        						min_height = tleft.offset().top + tleft.outerHeight();
        					}
        					
        					var size = $.pref('iconsize');
        					editor.setIconSize(size || ($(window).height() < min_height ? 's': 'm'));
        
        					// Look for any missing flyout icons from plugins
        					$('.tools_flyout').each(function() {
        						var shower = $('#' + this.id + '_show');
        						var sel = shower.attr('data-curopt');
        						// Check if there's an icon here
        						if (!shower.children('svg, img').length) {
        							var clone = $(sel).children().clone();
        							if (clone.length) {
        								clone[0].removeAttribute('style'); //Needed for Opera
        								shower.append(clone);
        							}
        						}
        					});
        
        					editor.runCallbacks();
        
        					setTimeout(function() {
        						$('.flyout_arrow_horiz:empty').each(function() {
        							$(this).append($.getSvgIcon('arrow_right').width(5).height(5));
        						});
        					}, 1);
        				}
        			});
        
        			editor.canvas = svgCanvas = new $.SvgCanvas(document.getElementById('svgcanvas'), curConfig);
        			var supportsNonSS, resize_timer, changeZoom, Actions, curScrollPos,
        				palette = [ // Todo: Make into configuration item?
        					'#000000', '#3f3f3f', '#7f7f7f', '#bfbfbf', '#ffffff',
        					'#ff0000', '#ff7f00', '#ffff00', '#7fff00',
        					'#00ff00', '#00ff7f', '#00ffff', '#007fff',
        					'#0000ff', '#7f00ff', '#ff00ff', '#ff007f',
        					'#7f0000', '#7f3f00', '#7f7f00', '#3f7f00',
        					'#007f00', '#007f3f', '#007f7f', '#003f7f',
        					'#00007f', '#3f007f', '#7f007f', '#7f003f',
        					'#ffaaaa', '#ffd4aa', '#ffffaa', '#d4ffaa',
        					'#aaffaa', '#aaffd4', '#aaffff', '#aad4ff',
        					'#aaaaff', '#d4aaff', '#ffaaff', '#ffaad4'
        				],
        				modKey = (svgedit.browser.isMac() ? 'meta+' : 'ctrl+'), // ⌘
        				path = svgCanvas.pathActions,
        				undoMgr = svgCanvas.undoMgr,
        				defaultImageURL = curConfig.imgPath + 'logo.png',
        				workarea = $('#workarea'),
        				canv_menu = $('#cmenu_canvas'),
        				// layer_menu = $('#cmenu_layers'), // Unused
        				exportWindow = null,
        				zoomInIcon = 'crosshair',
        				zoomOutIcon = 'crosshair',
        				ui_context = 'toolbars',
        				origSource = '',
        				paintBox = {fill: null, stroke:null};
        			
        			// This sets up alternative dialog boxes. They mostly work the same way as
        			// their UI counterparts, expect instead of returning the result, a callback
        			// needs to be included that returns the result as its first parameter.
        			// In the future we may want to add additional types of dialog boxes, since
        			// they should be easy to handle this way.
        			(function() {
        				$('#dialog_container').draggable({cancel: '#dialog_content, #dialog_buttons *', containment: 'window'});
        				var box = $('#dialog_box'),
        					btn_holder = $('#dialog_buttons'),
        					dialog_content = $('#dialog_content'),
        					dbox = function(type, msg, callback, defaultVal, opts, changeCb, checkbox) {
        						var ok, ctrl, chkbx;
        						dialog_content.html('<p>'+msg.replace(/\n/g, '</p><p>')+'</p>')
        							.toggleClass('prompt', (type == 'prompt'));
        						btn_holder.empty();
        
        						ok = $('<input type="button" value="' + uiStrings.common.ok + '">').appendTo(btn_holder);
        
        						if (type !== 'alert') {
        							$('<input type="button" value="' + uiStrings.common.cancel + '">')
        								.appendTo(btn_holder)
        								.click(function() { box.hide(); if (callback) {callback(false);}});
        						}
        
        						if (type === 'prompt') {
        							ctrl = $('<input type="text">').prependTo(btn_holder);
        							ctrl.val(defaultVal || '');
        							ctrl.bind('keydown', 'return', function() {ok.click();});
        						}
        						else if (type === 'select') {
        							var div = $('<div style="text-align:center;">');
        							ctrl = $('<select>').appendTo(div);
        							if (checkbox) {
        								var label = $('<label>').text(checkbox.label);
        								chkbx = $('<input type="checkbox">').appendTo(label);
        								chkbx.val(checkbox.value);
        								if (checkbox.tooltip) {
        									label.attr('title', checkbox.tooltip);
        								}
        								chkbx.prop('checked', !!checkbox.checked);
        								div.append($('<div>').append(label));
        							}
        							$.each(opts || [], function (opt, val) {
        								if (typeof val === 'object') {
        									ctrl.append($('<option>').val(val.value).html(val.text));
        								}
        								else {
        									ctrl.append($('<option>').html(val));
        								}
        							});
        							dialog_content.append(div);
        							if (defaultVal) {
        								ctrl.val(defaultVal);
        							}
        							if (changeCb) {
        								ctrl.bind('change', 'return', changeCb);
        							}
        							ctrl.bind('keydown', 'return', function() {ok.click();});
        						}
        						else if (type === 'process') {
        							ok.hide();
        						}
        
        						box.show();
        
        						ok.click(function() {
        							box.hide();
        							var resp = (type === 'prompt' || type === 'select') ? ctrl.val() : true;
        							if (callback) {
        								if (chkbx) {
        									callback(resp, chkbx.prop('checked'));
        								}
        								else {
        									callback(resp);
        								}
        							}
        						}).focus();
        
        						if (type === 'prompt' || type === 'select') {
        							ctrl.focus();
        						}
        					};
        
        				$.alert = function(msg, cb) { dbox('alert', msg, cb);};
        				$.confirm = function(msg, cb) {	dbox('confirm', msg, cb);};
        				$.process_cancel = function(msg, cb) { dbox('process', msg, cb);};
        				$.prompt = function(msg, txt, cb) { dbox('prompt', msg, cb, txt);};
        				$.select = function(msg, opts, cb, changeCb, txt, checkbox) { dbox('select', msg, cb, txt, opts, changeCb, checkbox);};
        			}());
        
        			var setSelectMode = function() {
        				var curr = $('.tool_button_current');
        				if (curr.length && curr[0].id !== 'tool_select') {
        					curr.removeClass('tool_button_current').addClass('tool_button');
        					$('#tool_select').addClass('tool_button_current').removeClass('tool_button');
        					$('#styleoverrides').text('#svgcanvas svg *{cursor:move;pointer-events:all} #svgcanvas svg{cursor:default}');
        				}
        				svgCanvas.setMode('select');
        				workarea.css('cursor', 'auto');
        			};
        
        			// used to make the flyouts stay on the screen longer the very first time
        			// var flyoutspeed = 1250; // Currently unused
        			var textBeingEntered = false;
        			var selectedElement = null;
        			var multiselected = false;
        			var editingsource = false;
        			var docprops = false;
        			var preferences = false;
        			var cur_context = '';
        			var origTitle = $('title:first').text();
        			// Make [1,2,5] array
        			var r_intervals = [];
        			var i;
        			for (i = 0.1; i < 1E5; i *= 10) {
        				r_intervals.push(i);
        				r_intervals.push(2 * i);
        				r_intervals.push(5 * i);
        			}
        
        			// This function highlights the layer passed in (by fading out the other layers)
        			// if no layer is passed in, this function restores the other layers
        			var toggleHighlightLayer = function(layerNameToHighlight) {
        				var i, curNames = [], numLayers = svgCanvas.getCurrentDrawing().getNumLayers();
        				for (i = 0; i < numLayers; i++) {
        					curNames[i] = svgCanvas.getCurrentDrawing().getLayerName(i);
        				}
        
        				if (layerNameToHighlight) {
        					for (i = 0; i < numLayers; ++i) {
        						if (curNames[i] != layerNameToHighlight) {
        							svgCanvas.getCurrentDrawing().setLayerOpacity(curNames[i], 0.5);
        						}
        					}
        				} else {
        					for (i = 0; i < numLayers; ++i) {
        						svgCanvas.getCurrentDrawing().setLayerOpacity(curNames[i], 1.0);
        					}
        				}
        			};
        
        			var populateLayers = function() {
        				svgCanvas.clearSelection();
        				var layerlist = $('#layerlist tbody').empty();
        				var selLayerNames = $('#selLayerNames').empty();
        				var drawing = svgCanvas.getCurrentDrawing();
        				var currentLayerName = drawing.getCurrentLayerName();
        				var layer = svgCanvas.getCurrentDrawing().getNumLayers();
        				var icon = $.getSvgIcon('eye');
        				// we get the layers in the reverse z-order (the layer rendered on top is listed first)
        				while (layer--) {
        					var name = drawing.getLayerName(layer);
        					var layerTr = $('<tr class="layer">').toggleClass('layersel', name === currentLayerName);
        					var layerVis = $('<td class="layervis">').toggleClass('layerinvis', !drawing.getLayerVisibility(name));
        					var layerName = $('<td class="layername">' + name + '</td>');
        					layerlist.append(layerTr.append(layerVis, layerName));
        					selLayerNames.append('<option value="' + name + '">' + name + '</option>');
        				}
        				if (icon !== undefined) {
        					var copy = icon.clone();
        					$('td.layervis', layerlist).append(copy);
        					$.resizeSvgIcons({'td.layervis .svg_icon': 14});
        				}
        				// handle selection of layer
        				$('#layerlist td.layername')
        					.mouseup(function(evt) {
        						$('#layerlist tr.layer').removeClass('layersel');
        						$(this.parentNode).addClass('layersel');
        						svgCanvas.setCurrentLayer(this.textContent);
        						evt.preventDefault();
        					})
        					.mouseover(function() {
        						toggleHighlightLayer(this.textContent);
        					})
        					.mouseout(function() {
        						toggleHighlightLayer();
        					});
        				$('#layerlist td.layervis').click(function() {
        					var row = $(this.parentNode).prevAll().length;
        					var name = $('#layerlist tr.layer:eq(' + row + ') td.layername').text();
        					var vis = $(this).hasClass('layerinvis');
        					svgCanvas.setLayerVisibility(name, vis);
        					$(this).toggleClass('layerinvis');
        				});
        
        				// if there were too few rows, let's add a few to make it not so lonely
        				var num = 5 - $('#layerlist tr.layer').size();
        				while (num-- > 0) {
        					// FIXME: there must a better way to do this
        					layerlist.append('<tr><td style="color:white">_</td><td/></tr>');
        				}
        			};
        
        			var showSourceEditor = function(e, forSaving) {
        				if (editingsource) {return;}
        
        				editingsource = true;
        				origSource = svgCanvas.getSvgString();
        				$('#save_output_btns').toggle(!!forSaving);
        				$('#tool_source_back').toggle(!forSaving);
        				$('#svg_source_textarea').val(origSource);
        				$('#svg_source_editor').fadeIn();
        				$('#svg_source_textarea').focus();
        			};
        
        			var togglePathEditMode = function(editmode, elems) {
        				$('#path_node_panel').toggle(editmode);
        				$('#tools_bottom_2,#tools_bottom_3').toggle(!editmode);
        				if (editmode) {
        					// Change select icon
        					$('.tool_button_current').removeClass('tool_button_current').addClass('tool_button');
        					$('#tool_select').addClass('tool_button_current').removeClass('tool_button');
        					setIcon('#tool_select', 'select_node');
        					multiselected = false;
        					if (elems.length) {
        						selectedElement = elems[0];
        					}
        				} else {
        					setTimeout(function () {
        						setIcon('#tool_select', 'select');
        					}, 1000);
        				}
        			};
        
        			var saveHandler = function(wind, svg) {
        				editor.showSaveWarning = false;
        
        				// by default, we add the XML prolog back, systems integrating SVG-edit (wikis, CMSs)
        				// can just provide their own custom save handler and might not want the XML prolog
        				svg = '<?xml version="1.0"?>\n' + svg;
        
        				// IE9 doesn't allow standalone Data URLs
        				// https://connect.microsoft.com/IE/feedback/details/542600/data-uri-images-fail-when-loaded-by-themselves
        				if (svgedit.browser.isIE()) {
        					showSourceEditor(0, true);
        					return;
        				}
        
        				// Opens the SVG in new window
        				var win = wind.open('data:image/svg+xml;base64,' + Utils.encode64(svg));
        
        				// Alert will only appear the first time saved OR the first time the bug is encountered
        				var done = $.pref('save_notice_done');
        				if (done !== 'all') {
        					var note = uiStrings.notification.saveFromBrowser.replace('%s', 'SVG');
        
        					// Check if FF and has <defs/>
        					if (svgedit.browser.isGecko()) {
        						if (svg.indexOf('<defs') !== -1) {
        							// warning about Mozilla bug #308590 when applicable (seems to be fixed now in Feb 2013)
        							note += '\n\n' + uiStrings.notification.defsFailOnSave;
        							$.pref('save_notice_done', 'all');
        							done = 'all';
        						} else {
        							$.pref('save_notice_done', 'part');
        						}
        					} else {
        						$.pref('save_notice_done', 'all');
        					}
        					if (done !== 'part') {
        						win.alert(note);
        					}
        				}
        			};
        
        			var exportHandler = function(win, data) {
        				var issues = data.issues,
        					exportWindowName = data.exportWindowName;
        
        				if (exportWindowName) {
        					exportWindow = window.open('', exportWindowName); // A hack to get the window via JSON-able name without opening a new one
        				}
        				
        				exportWindow.location.href = data.datauri;
        				var done = $.pref('export_notice_done');
        				if (done !== 'all') {
        					var note = uiStrings.notification.saveFromBrowser.replace('%s', data.type);
        
        					// Check if there's issues
        					if (issues.length) {
        						var pre = '\n \u2022 ';
        						note += ('\n\n' + uiStrings.notification.noteTheseIssues + pre + issues.join(pre));
        					}
        
        					// Note that this will also prevent the notice even though new issues may appear later.
        					// May want to find a way to deal with that without annoying the user
        					$.pref('export_notice_done', 'all');
        					exportWindow.alert(note);
        				}
        			};
        
        			var operaRepaint = function() {
        				// Repaints canvas in Opera. Needed for stroke-dasharray change as well as fill change
        				if (!window.opera) {
        					return;
        				}
        				$('<p/>').hide().appendTo('body').remove();
        			};
        
        			function setStrokeOpt(opt, changeElem) {
        				var id = opt.id;
        				var bits = id.split('_');
        				var pre = bits[0];
        				var val = bits[1];
        
        				if (changeElem) {
        					svgCanvas.setStrokeAttr('stroke-' + pre, val);
        				}
        				operaRepaint();
        				setIcon('#cur_' + pre, id, 20);
        				$(opt).addClass('current').siblings().removeClass('current');
        			}
        
        			// This is a common function used when a tool has been clicked (chosen)
        			// It does several common things:
        			// - removes the tool_button_current class from whatever tool currently has it
        			// - hides any flyouts
        			// - adds the tool_button_current class to the button passed in
        			var toolButtonClick = editor.toolButtonClick = function(button, noHiding) {
        				if ($(button).hasClass('disabled')) {return false;}
        				if ($(button).parent().hasClass('tools_flyout')) {return true;}
        				var fadeFlyouts = 'normal';
        				if (!noHiding) {
        					$('.tools_flyout').fadeOut(fadeFlyouts);
        				}
        				$('#styleoverrides').text('');
        				workarea.css('cursor', 'auto');
        				$('.tool_button_current').removeClass('tool_button_current').addClass('tool_button');
        				$(button).addClass('tool_button_current').removeClass('tool_button');
        				return true;
        			};
        
        			var clickSelect = editor.clickSelect = function() {
        				if (toolButtonClick('#tool_select')) {
        					svgCanvas.setMode('select');
        					$('#styleoverrides').text('#svgcanvas svg *{cursor:move;pointer-events:all}, #svgcanvas svg{cursor:default}');
        				}
        			};
        
        			var setImageURL = editor.setImageURL = function(url) {
        				if (!url) {
        					url = defaultImageURL;
        				}
        				svgCanvas.setImageURL(url);
        				$('#image_url').val(url);
        
        				if (url.indexOf('data:') === 0) {
        					// data URI found
        					$('#image_url').hide();
        					$('#change_image_url').show();
        				} else {
        					// regular URL
        					svgCanvas.embedImage(url, function(dataURI) {
        						// Couldn't embed, so show warning
        						$('#url_notice').toggle(!dataURI);
        						defaultImageURL = url;
        					});
        					$('#image_url').show();
        					$('#change_image_url').hide();
        				}
        			};
        
        			function setBackground (color, url) {
        				// if (color == $.pref('bkgd_color') && url == $.pref('bkgd_url')) {return;}
        				$.pref('bkgd_color', color);
        				$.pref('bkgd_url', url);
        
        				// This should be done in svgcanvas.js for the borderRect fill
        				svgCanvas.setBackground(color, url);
        			}
        
        			function promptImgURL() {
        				var curhref = svgCanvas.getHref(selectedElement);
        				curhref = curhref.indexOf('data:') === 0 ? '' : curhref;
        				$.prompt(uiStrings.notification.enterNewImgURL, curhref, function(url) {
        					if (url) {setImageURL(url);}
        				});
        			}
        
        			var setInputWidth = function(elem) {
        				var w = Math.min(Math.max(12 + elem.value.length * 6, 50), 300);
        				$(elem).width(w);
        			};
        
        			function updateRulers(scanvas, zoom) {
        				if (!zoom) {zoom = svgCanvas.getZoom();}
        				if (!scanvas) {scanvas = $('#svgcanvas');}
        
        				var d, i;
        				var limit = 30000;
        				var contentElem = svgCanvas.getContentElem();
        				var units = svgedit.units.getTypeMap();
        				var unit = units[curConfig.baseUnit]; // 1 = 1px
        
        				// draw x ruler then y ruler
        				for (d = 0; d < 2; d++) {
        					var isX = (d === 0);
        					var dim = isX ? 'x' : 'y';
        					var lentype = isX ? 'width' : 'height';
        					var contentDim = Number(contentElem.getAttribute(dim));
        
        					var $hcanv_orig = $('#ruler_' + dim + ' canvas:first');
        
        					// Bit of a hack to fully clear the canvas in Safari & IE9
        					var $hcanv = $hcanv_orig.clone();
        					$hcanv_orig.replaceWith($hcanv);
        
        					var hcanv = $hcanv[0];
        
        					// Set the canvas size to the width of the container
        					var ruler_len = scanvas[lentype]();
        					var total_len = ruler_len;
        					hcanv.parentNode.style[lentype] = total_len + 'px';
        					var ctx_num = 0;
        					var ctx = hcanv.getContext('2d');
        					var ctx_arr, num, ctx_arr_num;
        
        					ctx.fillStyle = 'rgb(200,0,0)';
        					ctx.fillRect(0, 0, hcanv.width, hcanv.height);
        
        					// Remove any existing canvasses
        					$hcanv.siblings().remove();
        					
        					// Create multiple canvases when necessary (due to browser limits)
        					if (ruler_len >= limit) {
        						ctx_arr_num = parseInt(ruler_len / limit, 10) + 1;
        						ctx_arr = [];
        						ctx_arr[0] = ctx;
        						var copy;
        						for (i = 1; i < ctx_arr_num; i++) {
        							hcanv[lentype] = limit;
        							copy = hcanv.cloneNode(true);
        							hcanv.parentNode.appendChild(copy);
        							ctx_arr[i] = copy.getContext('2d');
        						}
        
        						copy[lentype] = ruler_len % limit;
        
        						// set copy width to last
        						ruler_len = limit;
        					}
        
        					hcanv[lentype] = ruler_len;
        
        					var u_multi = unit * zoom;
        
        					// Calculate the main number interval
        					var raw_m = 50 / u_multi;
        					var multi = 1;
        					for (i = 0; i < r_intervals.length; i++) {
        						num = r_intervals[i];
        						multi = num;
        						if (raw_m <= num) {
        							break;
        						}
        					}
        
        					var big_int = multi * u_multi;
        
        					ctx.font = '9px sans-serif';
        
        					var ruler_d = ((contentDim / u_multi) % multi) * u_multi;
        					var label_pos = ruler_d - big_int;
        					// draw big intervals
        					while (ruler_d < total_len) {
        						label_pos += big_int;
        						// var real_d = ruler_d - contentDim; // Currently unused
        
        						var cur_d = Math.round(ruler_d) + 0.5;
        						if (isX) {
        							ctx.moveTo(cur_d, 15);
        							ctx.lineTo(cur_d, 0);
        						}
        						else {
        							ctx.moveTo(15, cur_d);
        							ctx.lineTo(0, cur_d);
        						}
        
        						num = (label_pos - contentDim) / u_multi;
        						var label;
        						if (multi >= 1) {
        							label = Math.round(num);
        						}
        						else {
        							var decs = String(multi).split('.')[1].length;
        							label = num.toFixed(decs);
        						}
        
        						// Change 1000s to Ks
        						if (label !== 0 && label !== 1000 && label % 1000 === 0) {
        							label = (label / 1000) + 'K';
        						}
        
        						if (isX) {
        							ctx.fillText(label, ruler_d+2, 8);
        						} else {
        							// draw label vertically
        							var str = String(label).split('');
        							for (i = 0; i < str.length; i++) {
        								ctx.fillText(str[i], 1, (ruler_d+9) + i*9);
        							}
        						}
        
        						var part = big_int / 10;
        						// draw the small intervals
        						for (i = 1; i < 10; i++) {
        							var sub_d = Math.round(ruler_d + part * i) + 0.5;
        							if (ctx_arr && sub_d > ruler_len) {
        								ctx_num++;
        								ctx.stroke();
        								if (ctx_num >= ctx_arr_num) {
        									i = 10;
        									ruler_d = total_len;
        									continue;
        								}
        								ctx = ctx_arr[ctx_num];
        								ruler_d -= limit;
        								sub_d = Math.round(ruler_d + part * i) + 0.5;
        							}
        
        							// odd lines are slighly longer
        							var line_num = (i % 2) ? 12 : 10;
        							if (isX) {
        								ctx.moveTo(sub_d, 15);
        								ctx.lineTo(sub_d, line_num);
        							} else {
        								ctx.moveTo(15, sub_d);
        								ctx.lineTo(line_num, sub_d);
        							}
        						}
        						ruler_d += big_int;
        					}
        					ctx.strokeStyle = '#000';
        					ctx.stroke();
        				}
        			}
        
        			var updateCanvas = editor.updateCanvas = function(center, new_ctr) {
        				var w = workarea.width(), h = workarea.height();
        				var w_orig = w, h_orig = h;
        				var zoom = svgCanvas.getZoom();
        				var w_area = workarea;
        				var cnvs = $('#svgcanvas');
        				var old_ctr = {
        					x: w_area[0].scrollLeft + w_orig/2,
        					y: w_area[0].scrollTop + h_orig/2
        				};
        				var multi = curConfig.canvas_expansion;
        				w = Math.max(w_orig, svgCanvas.contentW * zoom * multi);
        				h = Math.max(h_orig, svgCanvas.contentH * zoom * multi);
        
        				if (w == w_orig && h == h_orig) {
        					workarea.css('overflow', 'hidden');
        				} else {
        					workarea.css('overflow', 'scroll');
        				}
        
        				var old_can_y = cnvs.height()/2;
        				var old_can_x = cnvs.width()/2;
        				cnvs.width(w).height(h);
        				var new_can_y = h/2;
        				var new_can_x = w/2;
        				var offset = svgCanvas.updateCanvas(w, h);
        
        				var ratio = new_can_x / old_can_x;
        
        				var scroll_x = w/2 - w_orig/2;
        				var scroll_y = h/2 - h_orig/2;
        
        				if (!new_ctr) {
        					var old_dist_x = old_ctr.x - old_can_x;
        					var new_x = new_can_x + old_dist_x * ratio;
        
        					var old_dist_y = old_ctr.y - old_can_y;
        					var new_y = new_can_y + old_dist_y * ratio;
        
        					new_ctr = {
        						x: new_x,
        						y: new_y
        					};
        				} else {
        					new_ctr.x += offset.x;
        					new_ctr.y += offset.y;
        				}
        
        				if (center) {
        					// Go to top-left for larger documents
        					if (svgCanvas.contentW > w_area.width()) {
        						// Top-left
        						workarea[0].scrollLeft = offset.x - 10;
        						workarea[0].scrollTop = offset.y - 10;
        					} else {
        						// Center
        						w_area[0].scrollLeft = scroll_x;
        						w_area[0].scrollTop = scroll_y;
        					}
        				} else {
        					w_area[0].scrollLeft = new_ctr.x - w_orig/2;
        					w_area[0].scrollTop = new_ctr.y - h_orig/2;
        				}
        				if (curConfig.showRulers) {
        					updateRulers(cnvs, zoom);
        					workarea.scroll();
        				}
        				if (urldata.storagePrompt !== true && !editor.storagePromptClosed) {
        					$('#dialog_box').hide();
        				}
        			};
        
        			var updateToolButtonState = function() {
        				var index, button;
        				var bNoFill = (svgCanvas.getColor('fill') == 'none');
        				var bNoStroke = (svgCanvas.getColor('stroke') == 'none');
        				var buttonsNeedingStroke = [ '#tool_fhpath', '#tool_line' ];
        				var buttonsNeedingFillAndStroke = [ '#tools_rect .tool_button', '#tools_ellipse .tool_button', '#tool_text', '#tool_path'];
        				if (bNoStroke) {
        					for (index in buttonsNeedingStroke) {
        						button = buttonsNeedingStroke[index];
        						if ($(button).hasClass('tool_button_current')) {
        							clickSelect();
        						}
        						$(button).addClass('disabled');
        					}
        				} else {
        					for (index in buttonsNeedingStroke) {
        						button = buttonsNeedingStroke[index];
        						$(button).removeClass('disabled');
        					}
        				}
        
        				if (bNoStroke && bNoFill) {
        					for (index in buttonsNeedingFillAndStroke) {
        						button = buttonsNeedingFillAndStroke[index];
        						if ($(button).hasClass('tool_button_current')) {
        							clickSelect();
        						}
        						$(button).addClass('disabled');
        					}
        				} else {
        					for (index in buttonsNeedingFillAndStroke) {
        						button = buttonsNeedingFillAndStroke[index];
        						$(button).removeClass('disabled');
        					}
        				}
        
        				svgCanvas.runExtensions('toolButtonStateUpdate', {
        					nofill: bNoFill,
        					nostroke: bNoStroke
        				});
        
        				// Disable flyouts if all inside are disabled
        				$('.tools_flyout').each(function() {
        					var shower = $('#' + this.id + '_show');
        					var has_enabled = false;
        					$(this).children().each(function() {
        						if (!$(this).hasClass('disabled')) {
        							has_enabled = true;
        						}
        					});
        					shower.toggleClass('disabled', !has_enabled);
        				});
        
        				operaRepaint();
        			};
        
        			// Updates the toolbar (colors, opacity, etc) based on the selected element
        			// This function also updates the opacity and id elements that are in the context panel
        			var updateToolbar = function() {
        				var i, len;
        				if (selectedElement != null) {
        					switch (selectedElement.tagName) {
        					case 'use':
        					case 'image':
        					case 'foreignObject':
        						break;
        					case 'g':
        					case 'a':
        						// Look for common styles
        						var gWidth = null;
        						var childs = selectedElement.getElementsByTagName('*');
        						for (i = 0, len = childs.length; i < len; i++) {
        							var swidth = childs[i].getAttribute('stroke-width');
        
        							if (i === 0) {
        								gWidth = swidth;
        							} else if (gWidth !== swidth) {
        								gWidth = null;
        							}
        						}
        
        						$('#stroke_width').val(gWidth === null ? '' : gWidth);
        
        						paintBox.fill.update(true);
        						paintBox.stroke.update(true);
        
        						break;
        					default:
        						paintBox.fill.update(true);
        						paintBox.stroke.update(true);
        
        						$('#stroke_width').val(selectedElement.getAttribute('stroke-width') || 1);
        						$('#stroke_style').val(selectedElement.getAttribute('stroke-dasharray') || 'none');
        
        						var attr = selectedElement.getAttribute('stroke-linejoin') || 'miter';
        
        						if ($('#linejoin_' + attr).length != 0) {
        							setStrokeOpt($('#linejoin_' + attr)[0]);
        						}
        
        						attr = selectedElement.getAttribute('stroke-linecap') || 'butt';
        
        						if ($('#linecap_' + attr).length != 0) {
        							setStrokeOpt($('#linecap_' + attr)[0]);
        						}
        					}
        				}
        
        				// All elements including image and group have opacity
        				if (selectedElement != null) {
        					var opac_perc = ((selectedElement.getAttribute('opacity')||1.0)*100);
        					$('#group_opacity').val(opac_perc);
        					$('#opac_slider').slider('option', 'value', opac_perc);
        					$('#elem_id').val(selectedElement.id);
        				}
        
        				updateToolButtonState();
        			};
        
        			// updates the context panel tools based on the selected element
        			var updateContextPanel = function() {
        				var elem = selectedElement;
        				// If element has just been deleted, consider it null
        				if (elem != null && !elem.parentNode) {elem = null;}
        				var currentLayerName = svgCanvas.getCurrentDrawing().getCurrentLayerName();
        				var currentMode = svgCanvas.getMode();
        				var unit = curConfig.baseUnit !== 'px' ? curConfig.baseUnit : null;
        
        				var is_node = currentMode == 'pathedit'; //elem ? (elem.id && elem.id.indexOf('pathpointgrip') == 0) : false;
        				var menu_items = $('#cmenu_canvas li');
        				$('#selected_panel, #multiselected_panel, #g_panel, #rect_panel, #circle_panel,'+
        					'#ellipse_panel, #line_panel, #text_panel, #image_panel, #container_panel,'+
        					' #use_panel, #a_panel').hide();
        				if (elem != null) {
        					var elname = elem.nodeName;
        					// If this is a link with no transform and one child, pretend
        					// its child is selected
        //					if (elname === 'a') { // && !$(elem).attr('transform')) {
        //						elem = elem.firstChild;
        //					}
        
        					var angle = svgCanvas.getRotationAngle(elem);
        					$('#angle').val(angle);
        
        					var blurval = svgCanvas.getBlur(elem);
        					$('#blur').val(blurval);
        					$('#blur_slider').slider('option', 'value', blurval);
        
        					if (svgCanvas.addedNew) {
        						if (elname === 'image') {
        							// Prompt for URL if not a data URL
        							if (svgCanvas.getHref(elem).indexOf('data:') !== 0) {
        								promptImgURL();
        							}
        						} /*else if (elname == 'text') {
        							// TODO: Do something here for new text
        						}*/
        					}
        
        					if (!is_node && currentMode != 'pathedit') {
        						$('#selected_panel').show();
        						// Elements in this array already have coord fields
        						if (['line', 'circle', 'ellipse'].indexOf(elname) >= 0) {
        							$('#xy_panel').hide();
        						} else {
        							var x, y;
        
        							// Get BBox vals for g, polyline and path
        							if (['g', 'polyline', 'path'].indexOf(elname) >= 0) {
        								var bb = svgCanvas.getStrokedBBox([elem]);
        								if (bb) {
        									x = bb.x;
        									y = bb.y;
        								}
        							} else {
        								x = elem.getAttribute('x');
        								y = elem.getAttribute('y');
        							}
        
        							if (unit) {
        								x = svgedit.units.convertUnit(x);
        								y = svgedit.units.convertUnit(y);
        							}
        
        							$('#selected_x').val(x || 0);
        							$('#selected_y').val(y || 0);
        							$('#xy_panel').show();
        						}
        
        						// Elements in this array cannot be converted to a path
        						var no_path = ['image', 'text', 'path', 'g', 'use'].indexOf(elname) == -1;
        						$('#tool_topath').toggle(no_path);
        						$('#tool_reorient').toggle(elname === 'path');
        						$('#tool_reorient').toggleClass('disabled', angle === 0);
        					} else {
        						var point = path.getNodePoint();
        						$('#tool_add_subpath').removeClass('push_button_pressed').addClass('tool_button');
        						$('#tool_node_delete').toggleClass('disabled', !path.canDeleteNodes);
        
        						// Show open/close button based on selected point
        						setIcon('#tool_openclose_path', path.closed_subpath ? 'open_path' : 'close_path');
        
        						if (point) {
        							var seg_type = $('#seg_type');
        							if (unit) {
        								point.x = svgedit.units.convertUnit(point.x);
        								point.y = svgedit.units.convertUnit(point.y);
        							}
        							$('#path_node_x').val(point.x);
        							$('#path_node_y').val(point.y);
        							if (point.type) {
        								seg_type.val(point.type).removeAttr('disabled');
        							} else {
        								seg_type.val(4).attr('disabled', 'disabled');
        							}
        						}
        						return;
        					}
        
        					// update contextual tools here
        					var panels = {
        						g: [],
        						a: [],
        						rect: ['rx', 'width', 'height'],
        						image: ['width', 'height'],
        						circle: ['cx', 'cy', 'r'],
        						ellipse: ['cx', 'cy', 'rx', 'ry'],
        						line: ['x1', 'y1', 'x2', 'y2'],
        						text: [],
        						use: []
        					};
        
        					var el_name = elem.tagName;
        
        //					if ($(elem).data('gsvg')) {
        //						$('#g_panel').show();
        //					}
        
        					var link_href = null;
        					if (el_name === 'a') {
        						link_href = svgCanvas.getHref(elem);
        						$('#g_panel').show();
        					}
        
        					if (elem.parentNode.tagName === 'a') {
        						if (!$(elem).siblings().length) {
        							$('#a_panel').show();
        							link_href = svgCanvas.getHref(elem.parentNode);
        						}
        					}
        
        					// Hide/show the make_link buttons
        					$('#tool_make_link, #tool_make_link').toggle(!link_href);
        
        					if (link_href) {
        						$('#link_url').val(link_href);
        					}
        
        					if (panels[el_name]) {
        						var cur_panel = panels[el_name];
        
        						$('#' + el_name + '_panel').show();
        
        						$.each(cur_panel, function(i, item) {
        							var attrVal = elem.getAttribute(item);
        							if (curConfig.baseUnit !== 'px' && elem[item]) {
        								var bv = elem[item].baseVal.value;
        								attrVal = svgedit.units.convertUnit(bv);
        							}
        							$('#' + el_name + '_' + item).val(attrVal || 0);
        						});
        
        						if (el_name == 'text') {
        							$('#text_panel').css('display', 'inline');
        							if (svgCanvas.getItalic()) {
        								$('#tool_italic').addClass('push_button_pressed').removeClass('tool_button');
        							} else {
        								$('#tool_italic').removeClass('push_button_pressed').addClass('tool_button');
        							}
        							if (svgCanvas.getBold()) {
        								$('#tool_bold').addClass('push_button_pressed').removeClass('tool_button');
        							} else {
        								$('#tool_bold').removeClass('push_button_pressed').addClass('tool_button');
        							}
        							$('#font_family').val(elem.getAttribute('font-family'));
        							$('#font_size').val(elem.getAttribute('font-size'));
        							$('#text').val(elem.textContent);
        							if (svgCanvas.addedNew) {
        								// Timeout needed for IE9
        								setTimeout(function() {
        									$('#text').focus().select();
        								}, 100);
        							}
        						} // text
        						else if (el_name == 'image') {
        							setImageURL(svgCanvas.getHref(elem));
        						} // image
        						else if (el_name === 'g' || el_name === 'use') {
        							$('#container_panel').show();
        							var title = svgCanvas.getTitle();
        							var label = $('#g_title')[0];
        							label.value = title;
        							setInputWidth(label);
        							$('#g_title').prop('disabled', el_name == 'use');
        						}
        					}
        					menu_items[(el_name === 'g' ? 'en' : 'dis') + 'ableContextMenuItems']('#ungroup');
        					menu_items[((el_name === 'g' || !multiselected) ? 'dis' : 'en') + 'ableContextMenuItems']('#group');
        				} // if (elem != null)
        				else if (multiselected) {
        					$('#multiselected_panel').show();
        					menu_items
        						.enableContextMenuItems('#group')
        						.disableContextMenuItems('#ungroup');
        				} else {
        					menu_items.disableContextMenuItems('#delete,#cut,#copy,#group,#ungroup,#move_front,#move_up,#move_down,#move_back');
        				}
        
        				// update history buttons
        				$('#tool_undo').toggleClass('disabled', undoMgr.getUndoStackSize() === 0);
        				$('#tool_redo').toggleClass('disabled', undoMgr.getRedoStackSize() === 0);
        
        				svgCanvas.addedNew = false;
        
        				if ( (elem && !is_node)	|| multiselected) {
        					// update the selected elements' layer
        					$('#selLayerNames').removeAttr('disabled').val(currentLayerName);
        
        					// Enable regular menu options
        					canv_menu.enableContextMenuItems('#delete,#cut,#copy,#move_front,#move_up,#move_down,#move_back');
        				} else {
        					$('#selLayerNames').attr('disabled', 'disabled');
        				}
        			};
        
        			var updateWireFrame = function() {
        				// Test support
        				if (supportsNonSS) {return;}
        
        				var rule = '#workarea.wireframe #svgcontent * { stroke-width: ' + 1/svgCanvas.getZoom() + 'px; }';
        				$('#wireframe_rules').text(workarea.hasClass('wireframe') ? rule : '');
        			};
        
        			var updateTitle = function(title) {
        				title = title || svgCanvas.getDocumentTitle();
        				var newTitle = origTitle + (title ? ': ' + title : '');
        
        				// Remove title update with current context info, isn't really necessary
        //				if (cur_context) {
        //					new_title = new_title + cur_context;
        //				}
        				$('title:first').text(newTitle);
        			};
        
        			// called when we've selected a different element
        			var selectedChanged = function(win, elems) {
        				var mode = svgCanvas.getMode();
        				if (mode === 'select') {
        					setSelectMode();
        				}
        				var is_node = (mode == "pathedit");
        				// if elems[1] is present, then we have more than one element
        				selectedElement = (elems.length === 1 || elems[1] == null ? elems[0] : null);
        				multiselected = (elems.length >= 2 && elems[1] != null);
        				if (selectedElement != null) {
        					// unless we're already in always set the mode of the editor to select because
        					// upon creation of a text element the editor is switched into
        					// select mode and this event fires - we need our UI to be in sync
        
        					if (!is_node) {
        						updateToolbar();
        					}
        				} // if (elem != null)
        
        				// Deal with pathedit mode
        				togglePathEditMode(is_node, elems);
        				updateContextPanel();
        				svgCanvas.runExtensions('selectedChanged', {
        					elems: elems,
        					selectedElement: selectedElement,
        					multiselected: multiselected
        				});
        			};
        
        			// Call when part of element is in process of changing, generally
        			// on mousemove actions like rotate, move, etc.
        			var elementTransition = function(win, elems) {
        				var mode = svgCanvas.getMode();
        				var elem = elems[0];
        
        				if (!elem) {
        					return;
        				}
        
        				multiselected = (elems.length >= 2 && elems[1] != null);
        				// Only updating fields for single elements for now
        				if (!multiselected) {
        					switch (mode) {
        						case 'rotate':
        							var ang = svgCanvas.getRotationAngle(elem);
        							$('#angle').val(ang);
        							$('#tool_reorient').toggleClass('disabled', ang === 0);
        							break;
        
        						// TODO: Update values that change on move/resize, etc
        //						case "select":
        //						case "resize":
        //							break;
        					}
        				}
        				svgCanvas.runExtensions('elementTransition', {
        					elems: elems
        				});
        			};
        
        			// called when any element has changed
        			var elementChanged = function(win, elems) {
        				var i,
        					mode = svgCanvas.getMode();
        				if (mode === 'select') {
        					setSelectMode();
        				}
        
        				for (i = 0; i < elems.length; ++i) {
        					var elem = elems[i];
        
        					// if the element changed was the svg, then it could be a resolution change
        					if (elem && elem.tagName === 'svg') {
        						populateLayers();
        						updateCanvas();
        					}
        					// Update selectedElement if element is no longer part of the image.
        					// This occurs for the text elements in Firefox
        					else if (elem && selectedElement && selectedElement.parentNode == null) {
        //						|| elem && elem.tagName == "path" && !multiselected) { // This was added in r1430, but not sure why
        						selectedElement = elem;
        					}
        				}
        
        				editor.showSaveWarning = true;
        
        				// we update the contextual panel with potentially new
        				// positional/sizing information (we DON'T want to update the
        				// toolbar here as that creates an infinite loop)
        				// also this updates the history buttons
        
        				// we tell it to skip focusing the text control if the
        				// text element was previously in focus
        				updateContextPanel();
        
        				// In the event a gradient was flipped:
        				if (selectedElement && mode === 'select') {
        					paintBox.fill.update();
        					paintBox.stroke.update();
        				}
        
        				svgCanvas.runExtensions('elementChanged', {
        					elems: elems
        				});
        			};
        
        			var zoomDone = function() {
        				updateWireFrame();
        				// updateCanvas(); // necessary?
        			};
        
        			var zoomChanged = svgCanvas.zoomChanged = function(win, bbox, autoCenter) {
        				var scrbar = 15,
        					// res = svgCanvas.getResolution(), // Currently unused
        					w_area = workarea;
        				// var canvas_pos = $('#svgcanvas').position(); // Currently unused
        				var z_info = svgCanvas.setBBoxZoom(bbox, w_area.width()-scrbar, w_area.height()-scrbar);
        				if (!z_info) {return;}
        				var zoomlevel = z_info.zoom,
        					bb = z_info.bbox;
        
        				if (zoomlevel < 0.001) {
        					changeZoom({value: 0.1});
        					return;
        				}
        
        				$('#zoom').val((zoomlevel*100).toFixed(1));
        
        				if (autoCenter) {
        					updateCanvas();
        				} else {
        					updateCanvas(false, {x: bb.x * zoomlevel + (bb.width * zoomlevel)/2, y: bb.y * zoomlevel + (bb.height * zoomlevel)/2});
        				}
        
        				if (svgCanvas.getMode() == 'zoom' && bb.width) {
        					// Go to select if a zoom box was drawn
        					setSelectMode();
        				}
        
        				zoomDone();
        			};
        
        			changeZoom = function(ctl) {
        				var zoomlevel = ctl.value / 100;
        				if (zoomlevel < 0.001) {
        					ctl.value = 0.1;
        					return;
        				}
        				var zoom = svgCanvas.getZoom();
        				var w_area = workarea;
        
        				zoomChanged(window, {
        					width: 0,
        					height: 0,
        					// center pt of scroll position
        					x: (w_area[0].scrollLeft + w_area.width()/2)/zoom,
        					y: (w_area[0].scrollTop + w_area.height()/2)/zoom,
        					zoom: zoomlevel
        				}, true);
        			};
        
        			$('#cur_context_panel').delegate('a', 'click', function() {
        				var link = $(this);
        				if (link.attr('data-root')) {
        					svgCanvas.leaveContext();
        				} else {
        					svgCanvas.setContext(link.text());
        				}
        				svgCanvas.clearSelection();
        				return false;
        			});
        
        			var contextChanged = function(win, context) {
        				var link_str = '';
        				if (context) {
        					var str = '';
        					link_str = '<a href="#" data-root="y">' + svgCanvas.getCurrentDrawing().getCurrentLayerName() + '</a>';
        
        					$(context).parentsUntil('#svgcontent > g').andSelf().each(function() {
        						if (this.id) {
        							str += ' > ' + this.id;
        							if (this !== context) {
        								link_str += ' > <a href="#">' + this.id + '</a>';
        							} else {
        								link_str += ' > ' + this.id;
        							}
        						}
        					});
        
        					cur_context = str;
        				} else {
        					cur_context = null;
        				}
        				$('#cur_context_panel').toggle(!!context).html(link_str);
        
        				updateTitle();
        			};
        
        			// Makes sure the current selected paint is available to work with
        			var prepPaints = function() {
        				paintBox.fill.prep();
        				paintBox.stroke.prep();
        			};
        
        			var flyout_funcs = {};
        
        			var setFlyoutTitles = function() {
        				$('.tools_flyout').each(function() {
        					var shower = $('#' + this.id + '_show');
        					if (shower.data('isLibrary')) {
        						return;
        					}
        
        					var tooltips = [];
        					$(this).children().each(function() {
        						tooltips.push(this.title);
        					});
        					shower[0].title = tooltips.join(' / ');
        				});
        			};
        
        			var setFlyoutPositions = function() {
        				$('.tools_flyout').each(function() {
        					var shower = $('#' + this.id + '_show');
        					var pos = shower.offset();
        					var w = shower.outerWidth();
        					$(this).css({left: (pos.left + w) * editor.tool_scale, top: pos.top});
        				});
        			};
        
        			var setupFlyouts = function(holders) {
        				$.each(holders, function(hold_sel, btn_opts) {
        					var buttons = $(hold_sel).children();
        					var show_sel = hold_sel + '_show';
        					var shower = $(show_sel);
        					var def = false;
        					buttons.addClass('tool_button')
        						.unbind('click mousedown mouseup') // may not be necessary
        						.each(function(i) {
        							// Get this buttons options
        							var opts = btn_opts[i];
        
        							// Remember the function that goes with this ID
        							flyout_funcs[opts.sel] = opts.fn;
        
        							if (opts.isDefault) {def = i;}
        
        							// Clicking the icon in flyout should set this set's icon
        							var func = function(event) {
        								var options = opts;
        								//find the currently selected tool if comes from keystroke
        								if (event.type === 'keydown') {
        									var flyoutIsSelected = $(options.parent + '_show').hasClass('tool_button_current');
        									var currentOperation = $(options.parent + '_show').attr('data-curopt');
        									$.each(holders[opts.parent], function(i, tool) {
        										if (tool.sel == currentOperation) {
        											if (!event.shiftKey || !flyoutIsSelected) {
        												options = tool;
        											} else {
        												options = holders[opts.parent][i+1] || holders[opts.parent][0];
        											}
        										}
        									});
        								}
        								if ($(this).hasClass('disabled')) {return false;}
        								if (toolButtonClick(show_sel)) {
        									options.fn();
        								}
        								var icon;
        								if (options.icon) {
        									icon = $.getSvgIcon(options.icon, true);
        								} else {
        									icon = $(options.sel).children().eq(0).clone();
        								}
        
        								icon[0].setAttribute('width', shower.width());
        								icon[0].setAttribute('height', shower.height());
        								shower.children(':not(.flyout_arrow_horiz)').remove();
        								shower.append(icon).attr('data-curopt', options.sel); // This sets the current mode
        							};
        
        							$(this).mouseup(func);
        
        							if (opts.key) {
        								$(document).bind('keydown', opts.key[0] + ' shift+' + opts.key[0], func);
        							}
        						});
        
        					if (def) {
        						shower.attr('data-curopt', btn_opts[def].sel);
        					} else if (!shower.attr('data-curopt')) {
        						// Set first as default
        						shower.attr('data-curopt', btn_opts[0].sel);
        					}
        
        					var timer;
        					var pos = $(show_sel).position();
        
        					// Clicking the "show" icon should set the current mode
        					shower.mousedown(function(evt) {
        						if (shower.hasClass('disabled')) {
        							return false;
        						}
        						var holder = $(hold_sel);
        						var l = pos.left + 34;
        						var w = holder.width() * -1;
        						var time = holder.data('shown_popop') ? 200 : 0;
        						timer = setTimeout(function() {
        							// Show corresponding menu
        							if (!shower.data('isLibrary')) {
        								holder.css('left', w).show().animate({
        									left: l
        								}, 150);
        							} else {
        								holder.css('left', l).show();
        							}
        							holder.data('shown_popop', true);
        						},time);
        						evt.preventDefault();
        					}).mouseup(function(evt) {
        						clearTimeout(timer);
        						var opt = $(this).attr('data-curopt');
        						// Is library and popped up, so do nothing
        						if (shower.data('isLibrary') && $(show_sel.replace('_show', '')).is(':visible')) {
        							toolButtonClick(show_sel, true);
        							return;
        						}
        						if (toolButtonClick(show_sel) && flyout_funcs[opt]) {
        							flyout_funcs[opt]();
        						}
        					});
        					// $('#tools_rect').mouseleave(function(){$('#tools_rect').fadeOut();});
        				});
        				setFlyoutTitles();
        				setFlyoutPositions();
        			};
        
        			var makeFlyoutHolder = function(id, child) {
        				var div = $('<div>', {
        					'class': 'tools_flyout',
        					id: id
        				}).appendTo('#svg_editor').append(child);
        
        				return div;
        			};
        
        			var uaPrefix = (function() {
        				var prop;
        				var regex = /^(Moz|Webkit|Khtml|O|ms|Icab)(?=[A-Z])/;
        				var someScript = document.getElementsByTagName('script')[0];
        				for (prop in someScript.style) {
        					if (regex.test(prop)) {
        						// test is faster than match, so it's better to perform
        						// that on the lot and match only when necessary
        						return prop.match(regex)[0];
        					}
        				}
        				// Nothing found so far?
        				if ('WebkitOpacity' in someScript.style) {return 'Webkit';}
        				if ('KhtmlOpacity' in someScript.style) {return 'Khtml';}
        
        				return '';
        			}());
        
        			var scaleElements = function(elems, scale) {
        				// var prefix = '-' + uaPrefix.toLowerCase() + '-'; // Currently unused
        				var sides = ['top', 'left', 'bottom', 'right'];
        
        				elems.each(function() {
        					// Handled in CSS
        					// this.style[uaPrefix + 'Transform'] = 'scale(' + scale + ')';
        					var i;
        					var el = $(this);
        					var w = el.outerWidth() * (scale - 1);
        					var h = el.outerHeight() * (scale - 1);
        					// var margins = {}; // Currently unused
        
        					for (i = 0; i < 4; i++) {
        						var s = sides[i];
        						var cur = el.data('orig_margin-' + s);
        						if (cur == null) {
        							cur = parseInt(el.css('margin-' + s), 10);
        							// Cache the original margin
        							el.data('orig_margin-' + s, cur);
        						}
        						var val = cur * scale;
        						if (s === 'right') {
        							val += w;
        						} else if (s === 'bottom') {
        							val += h;
        						}
        
        						el.css('margin-' + s, val);
        						// el.css('outline', '1px solid red');
        					}
        				});
        			};
        
        			var setIconSize = editor.setIconSize = function (size) {
        
        //				var elems = $('.tool_button, .push_button, .tool_button_current, .disabled, .icon_label, #url_notice, #tool_open');
        				var sel_toscale = '#tools_top .toolset, #editor_panel > *, #history_panel > *,'+
        '				#main_button, #tools_left > *, #path_node_panel > *, #multiselected_panel > *,'+
        '				#g_panel > *, #tool_font_size > *, .tools_flyout';
        
        				var elems = $(sel_toscale);
        				var scale = 1;
        
        				if (typeof size === 'number') {
        					scale = size;
        				} else {
        					var icon_sizes = {s: 0.75, m:1, l: 1.25, xl: 1.5};
        					scale = icon_sizes[size];
        				}
        
        				editor.tool_scale = scale;
        
        				setFlyoutPositions();
        				// $('.tools_flyout').each(function() {
        //					var pos = $(this).position();
        //					console.log($(this), pos.left+(34 * scale));
        //					$(this).css({'left': pos.left+(34 * scale), 'top': pos.top+(77 * scale)});
        //					console.log('l', $(this).css('left'));
        //				});
        
        //				var scale = .75;
        
        				var hidden_ps = elems.parents(':hidden');
        				hidden_ps.css('visibility', 'hidden').show();
        				scaleElements(elems, scale);
        				hidden_ps.css('visibility', 'visible').hide();
        //				return;
        
        				$.pref('iconsize', size);
        				$('#iconsize').val(size);
        
        				// Change icon size
        //				$('.tool_button, .push_button, .tool_button_current, .disabled, .icon_label, #url_notice, #tool_open')
        //				.find('> svg, > img').each(function() {
        //					this.setAttribute('width',size_num);
        //					this.setAttribute('height',size_num);
        //				});
        //
        //				$.resizeSvgIcons({
        //					'.flyout_arrow_horiz > svg, .flyout_arrow_horiz > img': size_num / 5,
        //					'#logo > svg, #logo > img': size_num * 1.3,
        //					'#tools_bottom .icon_label > *': (size_num === 16 ? 18 : size_num * .75)
        //				});
        //				if (size != 's') {
        //					$.resizeSvgIcons({'#layerbuttons svg, #layerbuttons img': size_num * .6});
        //				}
        
        				// Note that all rules will be prefixed with '#svg_editor' when parsed
        				var cssResizeRules = {
        //					'.tool_button,\
        //					.push_button,\
        //					.tool_button_current,\
        //					.push_button_pressed,\
        //					.disabled,\
        //					.icon_label,\
        //					.tools_flyout .tool_button': {
        //						'width': {s: '16px', l: '32px', xl: '48px'},
        //						'height': {s: '16px', l: '32px', xl: '48px'},
        //						'padding': {s: '1px', l: '2px', xl: '3px'}
        //					},
        //					'.tool_sep': {
        //						'height': {s: '16px', l: '32px', xl: '48px'},
        //						'margin': {s: '2px 2px', l: '2px 5px', xl: '2px 8px'}
        //					},
        //					'#main_icon': {
        //						'width': {s: '31px', l: '53px', xl: '75px'},
        //						'height': {s: '22px', l: '42px', xl: '64px'}
        //					},
        					'#tools_top': {
        						'left': 50 + $('#main_button').width(),
        						'height': 72
        					},
        					'#tools_left': {
        						'width': 31,
        						'top': 74
        					},
        					'div#workarea': {
        						'left': 38,
        						'top': 74
        					}
        //					'#tools_bottom': {
        //						'left': {s: '27px', l: '46px', xl: '65px'},
        //						'height': {s: '58px', l: '98px', xl: '145px'}
        //					},
        //					'#color_tools': {
        //						'border-spacing': {s: '0 1px'},
        //						'margin-top': {s: '-1px'}
        //					},
        //					'#color_tools .icon_label': {
        //						'width': {l:'43px', xl: '60px'}
        //					},
        //					'.color_tool': {
        //						'height': {s: '20px'}
        //					},
        //					'#tool_opacity': {
        //						'top': {s: '1px'},
        //						'height': {s: 'auto', l:'auto', xl:'auto'}
        //					},
        //					'#tools_top input, #tools_bottom input': {
        //						'margin-top': {s: '2px', l: '4px', xl: '5px'},
        //						'height': {s: 'auto', l: 'auto', xl: 'auto'},
        //						'border': {s: '1px solid #555', l: 'auto', xl: 'auto'},
        //						'font-size': {s: '.9em', l: '1.2em', xl: '1.4em'}
        //					},
        //					'#zoom_panel': {
        //						'margin-top': {s: '3px', l: '4px', xl: '5px'}
        //					},
        //					'#copyright, #tools_bottom .label': {
        //						'font-size': {l: '1.5em', xl: '2em'},
        //						'line-height': {s: '15px'}
        //					},
        //					'#tools_bottom_2': {
        //						'width': {l: '295px', xl: '355px'},
        //						'top': {s: '4px'}
        //					},
        //					'#tools_top > div, #tools_top': {
        //						'line-height': {s: '17px', l: '34px', xl: '50px'}
        //					},
        //					'.dropdown button': {
        //						'height': {s: '18px', l: '34px', xl: '40px'},
        //						'line-height': {s: '18px', l: '34px', xl: '40px'},
        //						'margin-top': {s: '3px'}
        //					},
        //					'#tools_top label, #tools_bottom label': {
        //						'font-size': {s: '1em', l: '1.5em', xl: '2em'},
        //						'height': {s: '25px', l: '42px', xl: '64px'}
        //					},
        //					'div.toolset': {
        //						'height': {s: '25px', l: '42px', xl: '64px'}
        //					},
        //					'#tool_bold, #tool_italic': {
        //						'font-size': {s: '1.5em', l: '3em', xl: '4.5em'}
        //					},
        //					'#sidepanels': {
        //						'top': {s: '50px', l: '88px', xl: '125px'},
        //						'bottom': {s: '51px', l: '68px', xl: '65px'}
        //					},
        //					'#layerbuttons': {
        //						'width': {l: '130px', xl: '175px'},
        //						'height': {l: '24px', xl: '30px'}
        //					},
        //					'#layerlist': {
        //						'width': {l: '128px', xl: '150px'}
        //					},
        //					'.layer_button': {
        //						'width': {l: '19px', xl: '28px'},
        //						'height': {l: '19px', xl: '28px'}
        //					},
        //					'input.spin-button': {
        //						'background-image': {l: 'url('images/spinbtn_updn_big.png')', xl: 'url('images/spinbtn_updn_big.png')'},
        //						'background-position': {l: '100% -5px', xl: '100% -2px'},
        //						'padding-right': {l: '24px', xl: '24px' }
        //					},
        //					'input.spin-button.up': {
        //						'background-position': {l: '100% -45px', xl: '100% -42px'}
        //					},
        //					'input.spin-button.down': {
        //						'background-position': {l: '100% -85px', xl: '100% -82px'}
        //					},
        //					'#position_opts': {
        //						'width': {all: (size_num*4) +'px'}
        //					}
        				};
        
        				var rule_elem = $('#tool_size_rules');
        				if (!rule_elem.length) {
        					rule_elem = $('<style id="tool_size_rules"></style>').appendTo('head');
        				} else {
        					rule_elem.empty();
        				}
        
        				if (size !== 'm') {
        					var styleStr = '';
        					$.each(cssResizeRules, function(selector, rules) {
        						selector = '#svg_editor ' + selector.replace(/,/g,', #svg_editor');
        						styleStr += selector + '{';
        						$.each(rules, function(prop, values) {
        							var val;
        							if (typeof values === 'number') {
        								val = (values * scale) + 'px';
        							} else if (values[size] || values.all) {
        								val = (values[size] || values.all);
        							}
        							styleStr += (prop + ':' + val + ';');
        						});
        						styleStr += '}';
        					});
        					//this.style[uaPrefix + 'Transform'] = 'scale(' + scale + ')';
        					var prefix = '-' + uaPrefix.toLowerCase() + '-';
        					styleStr += (sel_toscale + '{' + prefix + 'transform: scale(' + scale + ');}'
        					+ ' #svg_editor div.toolset .toolset {' + prefix + 'transform: scale(1); margin: 1px !important;}' // Hack for markers
        					+ ' #svg_editor .ui-slider {' + prefix + 'transform: scale(' + (1/scale) + ');}' // Hack for sliders
        					);
        					rule_elem.text(styleStr);
        				}
        
        				setFlyoutPositions();
        			};
        
        			// TODO: Combine this with addDropDown or find other way to optimize
        			var addAltDropDown = function(elem, list, callback, opts) {
        				var button = $(elem);
        				list = $(list);
        				var on_button = false;
        				var dropUp = opts.dropUp;
        				if (dropUp) {
        					$(elem).addClass('dropup');
        				}
        				list.find('li').bind('mouseup', function() {
        					if (opts.seticon) {
        						setIcon('#cur_' + button[0].id , $(this).children());
        						$(this).addClass('current').siblings().removeClass('current');
        					}
        					callback.apply(this, arguments);
        
        				});
        
        				$(window).mouseup(function(evt) {
        					if (!on_button) {
        						button.removeClass('down');
        						list.hide();
        						list.css({top:0, left:0});
        					}
        					on_button = false;
        				});
        
        				// var height = list.height(); // Currently unused
        				button.bind('mousedown',function() {
        					var off = button.offset();
        					if (dropUp) {
        						off.top -= list.height();
        						off.left += 8;
        					} else {
        						off.top += button.height();
        					}
        					list.offset(off);
        
        					if (!button.hasClass('down')) {
        						list.show();
        						on_button = true;
        					} else {
        						// CSS position must be reset for Webkit
        						list.hide();
        						list.css({top:0, left:0});
        					}
        					button.toggleClass('down');
        				}).hover(function() {
        					on_button = true;
        				}).mouseout(function() {
        					on_button = false;
        				});
        
        				if (opts.multiclick) {
        					list.mousedown(function() {
        						on_button = true;
        					});
        				}
        			};
        
        			var extsPreLang = [];
        			var extAdded = function(win, ext) {
        				if (!ext) {
        					return;
        				}
        				var cb_called = false;
        				var resize_done = false;
        				var cb_ready = true; // Set to false to delay callback (e.g. wait for $.svgIcons)
        				
        				if (ext.langReady) {
        					if (editor.langChanged) { // We check for this since the "lang" pref could have been set by storage
        						var lang = $.pref('lang');
        						ext.langReady({lang:lang, uiStrings:uiStrings});
        					}
        					else {
        						extsPreLang.push(ext);
        					}
        				}
        
        				function prepResize() {
        					if (resize_timer) {
        						clearTimeout(resize_timer);
        						resize_timer = null;
        					}
        					if (!resize_done) {
        						resize_timer = setTimeout(function() {
        							resize_done = true;
        							setIconSize($.pref('iconsize'));
        						}, 50);
        					}
        				}
        
        				var runCallback = function() {
        					if (ext.callback && !cb_called && cb_ready) {
        						cb_called = true;
        						ext.callback();
        					}
        				};
        
        				var btn_selects = [];
        
        				if (ext.context_tools) {
        					$.each(ext.context_tools, function(i, tool) {
        						// Add select tool
        						var html;
        						var cont_id = tool.container_id ? (' id="' + tool.container_id + '"') : '';
        						var panel = $('#' + tool.panel);
        
        						// create the panel if it doesn't exist
        						if (!panel.length) {
        							panel = $('<div>', {id: tool.panel}).appendTo('#tools_top');
        						}
        
        						// TODO: Allow support for other types, or adding to existing tool
        						switch (tool.type) {
        						case 'tool_button':
        							html = '<div class="tool_button">' + tool.id + '</div>';
        							var div = $(html).appendTo(panel);
        							if (tool.events) {
        								$.each(tool.events, function(evt, func) {
        									$(div).bind(evt, func);
        								});
        							}
        							break;
        						case 'select':
        							html = '<label' + cont_id + '>'
        								+ '<select id="' + tool.id + '">';
        							$.each(tool.options, function(val, text) {
        								var sel = (val == tool.defval) ? ' selected' : '';
        								html += '<option value="'+val+'"' + sel + '>' + text + '</option>';
        							});
        							html += '</select></label>';
        							// Creates the tool, hides & adds it, returns the select element
        							var sel = $(html).appendTo(panel).find('select');
        
        							$.each(tool.events, function(evt, func) {
        								$(sel).bind(evt, func);
        							});
        							break;
        						case 'button-select':
        							html = '<div id="' + tool.id + '" class="dropdown toolset" title="' + tool.title + '">'
        								+ '<div id="cur_' + tool.id + '" class="icon_label"></div><button></button></div>';
        
        							var list = $('<ul id="' + tool.id + '_opts"></ul>').appendTo('#option_lists');
        
        							if (tool.colnum) {
        								list.addClass('optcols' + tool.colnum);
        							}
        
        							// Creates the tool, hides & adds it, returns the select element
        							var dropdown = $(html).appendTo(panel).children();
        
        							btn_selects.push({
        								elem: ('#' + tool.id),
        								list: ('#' + tool.id + '_opts'),
        								title: tool.title,
        								callback: tool.events.change,
        								cur: ('#cur_' + tool.id)
        							});
        
        							break;
        						case 'input':
        							html = '<label' + cont_id + '>'
        								+ '<span id="' + tool.id + '_label">'
        								+ tool.label + ':</span>'
        								+ '<input id="' + tool.id + '" title="' + tool.title
        								+ '" size="' + (tool.size || '4') + '" value="' + (tool.defval || '') + '" type="text"/></label>';
        
        							// Creates the tool, hides & adds it, returns the select element
        
        							// Add to given tool.panel
        							var inp = $(html).appendTo(panel).find('input');
        
        							if (tool.spindata) {
        								inp.SpinButton(tool.spindata);
        							}
        
        							if (tool.events) {
        								$.each(tool.events, function(evt, func) {
        									inp.bind(evt, func);
        								});
        							}
        							break;
        
        						default:
        							break;
        						}
        					});
        				}
        
        				if (ext.buttons) {
        					var fallback_obj = {},
        						placement_obj = {},
        						svgicons = ext.svgicons,
        						holders = {};
        
        					// Add buttons given by extension
        					$.each(ext.buttons, function(i, btn) {
        						var icon, svgicon, tls_id;
        						var id = btn.id;
        						var num = i;
        
        						// Give button a unique ID
        						while($('#'+id).length) {
        							id = btn.id + '_' + (++num);
        						}
        
        						if (!svgicons) {
        							icon = $('<img src="' + btn.icon + '">');
        						} else {
        							fallback_obj[id] = btn.icon;
        							svgicon = btn.svgicon || btn.id;
        							if (btn.type == 'app_menu') {
        								placement_obj['#' + id + ' > div'] = svgicon;
        							} else {
        								placement_obj['#' + id] = svgicon;
        							}
        						}
        
        						var cls, parent;
        
        						// Set button up according to its type
        						switch ( btn.type ) {
        						case 'mode_flyout':
        						case 'mode':
        							cls = 'tool_button';
        							parent = '#tools_left';
        							break;
        						case 'context':
        							cls = 'tool_button';
        							parent = '#' + btn.panel;
        							// create the panel if it doesn't exist
        							if (!$(parent).length) {
        								$('<div>', {id: btn.panel}).appendTo('#tools_top');
        							}
        							break;
        						case 'app_menu':
        							cls = '';
        							parent = '#main_menu ul';
        							break;
        						}
        						var flyout_holder, cur_h, show_btn, ref_data, ref_btn;
        						var button = $((btn.list || btn.type == 'app_menu') ? '<li/>' : '<div/>')
        							.attr('id', id)
        							.attr('title', btn.title)
        							.addClass(cls);
        						if (!btn.includeWith && !btn.list) {
        							if ('position' in btn) {
        								if ($(parent).children().eq(btn.position).length) {
        									$(parent).children().eq(btn.position).before(button);
        								}
        								else {
        									$(parent).children().last().before(button);
        								}
        							} else {
        								button.appendTo(parent);
        							}
        
        							if (btn.type =='mode_flyout') {
        							// Add to flyout menu / make flyout menu
        	//							var opts = btn.includeWith;
        	//							// opts.button, default, position
        								ref_btn = $(button);
        
        								flyout_holder = ref_btn.parent();
        								// Create a flyout menu if there isn't one already
        								if (!ref_btn.parent().hasClass('tools_flyout')) {
        									// Create flyout placeholder
        									tls_id = ref_btn[0].id.replace('tool_', 'tools_');
        									show_btn = ref_btn.clone()
        										.attr('id', tls_id + '_show')
        										.append($('<div>', {'class': 'flyout_arrow_horiz'}));
        
        									ref_btn.before(show_btn);
        
        									// Create a flyout div
        									flyout_holder = makeFlyoutHolder(tls_id, ref_btn);
        									flyout_holder.data('isLibrary', true);
        									show_btn.data('isLibrary', true);
        								}
        	//							ref_data = Actions.getButtonData(opts.button);
        
        								placement_obj['#' + tls_id + '_show'] = btn.id;
        								// TODO: Find way to set the current icon using the iconloader if this is not default
        
        								// Include data for extension button as well as ref button
        								cur_h = holders['#'+flyout_holder[0].id] = [{
        									sel: '#'+id,
        									fn: btn.events.click,
        									icon: btn.id,
        //									key: btn.key,
        									isDefault: true
        								}, ref_data];
        	//
        	//							// {sel:'#tool_rect', fn: clickRect, evt: 'mouseup', key: 4, parent: '#tools_rect', icon: 'rect'}
        	//
        	//							var pos = ('position' in opts)?opts.position:'last';
        	//							var len = flyout_holder.children().length;
        	//
        	//							// Add at given position or end
        	//							if (!isNaN(pos) && pos >= 0 && pos < len) {
        	//								flyout_holder.children().eq(pos).before(button);
        	//							} else {
        	//								flyout_holder.append(button);
        	//								cur_h.reverse();
        	//							}
        							} else if (btn.type == 'app_menu') {
        								button.append('<div>').append(btn.title);
        							}
        
        						}
        						else if (btn.list) {
        							// Add button to list
        							button.addClass('push_button');
        							$('#' + btn.list + '_opts').append(button);
        							if (btn.isDefault) {
        								$('#cur_' + btn.list).append(button.children().clone());
        								svgicon = btn.svgicon || btn.id;
        								placement_obj['#cur_' + btn.list] = svgicon;
        							}
        						}
        						else if (btn.includeWith) {
        							// Add to flyout menu / make flyout menu
        							var opts = btn.includeWith;
        							// opts.button, default, position
        							ref_btn = $(opts.button);
        
        							flyout_holder = ref_btn.parent();
        							// Create a flyout menu if there isn't one already
        							if (!ref_btn.parent().hasClass('tools_flyout')) {
        								// Create flyout placeholder
        								tls_id = ref_btn[0].id.replace('tool_', 'tools_');
        								show_btn = ref_btn.clone()
        									.attr('id',tls_id + '_show')
        									.append($('<div>', {'class': 'flyout_arrow_horiz'}));
        
        								ref_btn.before(show_btn);
        
        								// Create a flyout div
        								flyout_holder = makeFlyoutHolder(tls_id, ref_btn);
        							}
        
        							ref_data = Actions.getButtonData(opts.button);
        
        							if (opts.isDefault) {
        								placement_obj['#' + tls_id + '_show'] = btn.id;
        							}
        							// TODO: Find way to set the current icon using the iconloader if this is not default
        
        							// Include data for extension button as well as ref button
        							cur_h = holders['#' + flyout_holder[0].id] = [{
        								sel: '#' + id,
        								fn: btn.events.click,
        								icon: btn.id,
        								key: btn.key,
        								isDefault: btn.includeWith ? btn.includeWith.isDefault : 0
        							}, ref_data];
        
        							// {sel:'#tool_rect', fn: clickRect, evt: 'mouseup', key: 4, parent: '#tools_rect', icon: 'rect'}
        
        							var pos = ('position' in opts) ? opts.position : 'last';
        							var len = flyout_holder.children().length;
        
        							// Add at given position or end
        							if (!isNaN(pos) && pos >= 0 && pos < len) {
        								flyout_holder.children().eq(pos).before(button);
        							} else {
        								flyout_holder.append(button);
        								cur_h.reverse();
        							}
        						}
        
        						if (!svgicons) {
        							button.append(icon);
        						}
        
        						if (!btn.list) {
        							// Add given events to button
        							$.each(btn.events, function(name, func) {
        								if (name == 'click' && btn.type == 'mode') {
        									if (btn.includeWith) {
        										button.bind(name, func);
        									} else {
        										button.bind(name, function() {
        											if (toolButtonClick(button)) {
        												func();
        											}
        										});
        									}
        									if (btn.key) {
        										$(document).bind('keydown', btn.key, func);
        										if (btn.title) {
        											button.attr('title', btn.title + ' ['+btn.key+']');
        										}
        									}
        								} else {
        									button.bind(name, func);
        								}
        							});
        						}
        
        						setupFlyouts(holders);
        					});
        
        					$.each(btn_selects, function() {
        						addAltDropDown(this.elem, this.list, this.callback, {seticon: true});
        					});
        
        					if (svgicons) {
        						cb_ready = false; // Delay callback
        					}
        
        					$.svgIcons(svgicons, {
        						w: 24, h: 24,
        						id_match: false,
        						no_img: (!svgedit.browser.isWebkit()),
        						fallback: fallback_obj,
        						placement: placement_obj,
        						callback: function (icons) {
        							// Non-ideal hack to make the icon match the current size
        							//if (curPrefs.iconsize && curPrefs.iconsize !== 'm') {
        							if ($.pref('iconsize') !== 'm') {
        								prepResize();
        							}
        							cb_ready = true; // Ready for callback
        							runCallback();
        						}
        					});
        				}
        
        				runCallback();
        			};
        
        			var getPaint = function(color, opac, type) {
        				// update the editor's fill paint
        				var opts = { alpha: opac };
        				if (color.indexOf('url(#') === 0) {
        					var refElem = svgCanvas.getRefElem(color);
        					if (refElem) {
        						refElem = refElem.cloneNode(true);
        					} else {
        						refElem = $('#' + type + '_color defs *')[0];
        					}
        					opts[refElem.tagName] = refElem;
        				} else if (color.indexOf('#') === 0) {
        					opts.solidColor = color.substr(1);
        				} else {
        					opts.solidColor = 'none';
        				}
        				return new $.jGraduate.Paint(opts);
        			};
        
        			$('#text').focus( function(){ textBeingEntered = true; } );
        			$('#text').blur( function(){ textBeingEntered = false; } );
        
        			// bind the selected event to our function that handles updates to the UI
        			svgCanvas.bind('selected', selectedChanged);
        			svgCanvas.bind('transition', elementTransition);
        			svgCanvas.bind('changed', elementChanged);
        			svgCanvas.bind('saved', saveHandler);
        			svgCanvas.bind('exported', exportHandler);
        			svgCanvas.bind('exportedPDF', function (win, data) {
        				var exportWindowName = data.exportWindowName;
        				if (exportWindowName) {
        					exportWindow = window.open('', exportWindowName); // A hack to get the window via JSON-able name without opening a new one
        				}
        				exportWindow.location.href = data.dataurlstring;
        			});
        			svgCanvas.bind('zoomed', zoomChanged);
        			svgCanvas.bind('contextset', contextChanged);
        			svgCanvas.bind('extension_added', extAdded);
        			svgCanvas.textActions.setInputElem($('#text')[0]);
        
        			var str = '<div class="palette_item" data-rgb="none"></div>';
        			$.each(palette, function(i, item) {
        				str += '<div class="palette_item" style="background-color: ' + item + ';" data-rgb="' + item + '"></div>';
        			});
        			$('#palette').append(str);
        
        			// Set up editor background functionality
        			// TODO add checkerboard as "pattern"
        			var color_blocks = ['#FFF', '#888', '#000']; // ,'url(data:image/gif;base64,R0lGODlhEAAQAIAAAP%2F%2F%2F9bW1iH5BAAAAAAALAAAAAAQABAAAAIfjG%2Bgq4jM3IFLJgpswNly%2FXkcBpIiVaInlLJr9FZWAQA7)'];
        			str = '';
        			$.each(color_blocks, function() {
        				str += '<div class="color_block" style="background-color:' + this + ';"></div>';
        			});
        			$('#bg_blocks').append(str);
        			var blocks = $('#bg_blocks div');
        			var cur_bg = 'cur_background';
        			blocks.each(function() {
        				var blk = $(this);
        				blk.click(function() {
        					blocks.removeClass(cur_bg);
        					$(this).addClass(cur_bg);
        				});
        			});
        
        			setBackground($.pref('bkgd_color'), $.pref('bkgd_url'));
        
        			$('#image_save_opts input').val([$.pref('img_save')]);
        
        			var changeRectRadius = function(ctl) {
        				svgCanvas.setRectRadius(ctl.value);
        			};
        
        			var changeFontSize = function(ctl) {
        				svgCanvas.setFontSize(ctl.value);
        			};
        
        			var changeStrokeWidth = function(ctl) {
        				var val = ctl.value;
        				if (val == 0 && selectedElement && ['line', 'polyline'].indexOf(selectedElement.nodeName) >= 0) {
        					val = ctl.value = 1;
        				}
        				svgCanvas.setStrokeWidth(val);
        			};
        
        			var changeRotationAngle = function(ctl) {
        				svgCanvas.setRotationAngle(ctl.value);
        				$('#tool_reorient').toggleClass('disabled', parseInt(ctl.value, 10) === 0);
        			};
        			
        			var changeOpacity = function(ctl, val) {
        				if (val == null) {val = ctl.value;}
        				$('#group_opacity').val(val);
        				if (!ctl || !ctl.handle) {
        					$('#opac_slider').slider('option', 'value', val);
        				}
        				svgCanvas.setOpacity(val/100);
        			};
        
        			var changeBlur = function(ctl, val, noUndo) {
        				if (val == null) {val = ctl.value;}
        				$('#blur').val(val);
        				var complete = false;
        				if (!ctl || !ctl.handle) {
        					$('#blur_slider').slider('option', 'value', val);
        					complete = true;
        				}
        				if (noUndo) {
        					svgCanvas.setBlurNoUndo(val);
        				} else {
        					svgCanvas.setBlur(val, complete);
        				}
        			};
        
        			$('#stroke_style').change(function() {
        				svgCanvas.setStrokeAttr('stroke-dasharray', $(this).val());
        				operaRepaint();
        			});
        
        			$('#stroke_linejoin').change(function() {
        				svgCanvas.setStrokeAttr('stroke-linejoin', $(this).val());
        				operaRepaint();
        			});
        
        			// Lose focus for select elements when changed (Allows keyboard shortcuts to work better)
        			$('select').change(function(){$(this).blur();});
        
        			// fired when user wants to move elements to another layer
        			var promptMoveLayerOnce = false;
        			$('#selLayerNames').change(function() {
        				var destLayer = this.options[this.selectedIndex].value;
        				var confirmStr = uiStrings.notification.QmoveElemsToLayer.replace('%s', destLayer);
        				var moveToLayer = function(ok) {
        					if (!ok) {return;}
        					promptMoveLayerOnce = true;
        					svgCanvas.moveSelectedToLayer(destLayer);
        					svgCanvas.clearSelection();
        					populateLayers();
        				};
        				if (destLayer) {
        					if (promptMoveLayerOnce) {
        						moveToLayer(true);
        					} else {
        						$.confirm(confirmStr, moveToLayer);
        					}
        				}
        			});
        
        			$('#font_family').change(function() {
        				svgCanvas.setFontFamily(this.value);
        			});
        
        			$('#seg_type').change(function() {
        				svgCanvas.setSegType($(this).val());
        			});
        
        			$('#text').keyup(function() {
        				svgCanvas.setTextContent(this.value);
        			});
        
        			$('#image_url').change(function() {
        				setImageURL(this.value);
        			});
        
        			$('#link_url').change(function() {
        				if (this.value.length) {
        					svgCanvas.setLinkURL(this.value);
        				} else {
        					svgCanvas.removeHyperlink();
        				}
        			});
        
        			$('#g_title').change(function() {
        				svgCanvas.setGroupTitle(this.value);
        			});
        
        			$('.attr_changer').change(function() {
        				var attr = this.getAttribute('data-attr');
        				var val = this.value;
        				var valid = svgedit.units.isValidUnit(attr, val, selectedElement);
        
        				if (!valid) {
        					$.alert(uiStrings.notification.invalidAttrValGiven);
        					this.value = selectedElement.getAttribute(attr);
        					return false;
        				}
        
        				if (attr !== 'id') {
        					if (isNaN(val)) {
        						val = svgCanvas.convertToNum(attr, val);
        					} else if (curConfig.baseUnit !== 'px') {
        						// Convert unitless value to one with given unit
        
        						var unitData = svgedit.units.getTypeMap();
        
        						if (selectedElement[attr] || svgCanvas.getMode() === 'pathedit' || attr === 'x' || attr === 'y') {
        							val *= unitData[curConfig.baseUnit];
        						}
        					}
        				}
        
        				// if the user is changing the id, then de-select the element first
        				// change the ID, then re-select it with the new ID
        				if (attr === 'id') {
        					var elem = selectedElement;
        					svgCanvas.clearSelection();
        					elem.id = val;
        					svgCanvas.addToSelection([elem],true);
        				} else {
        					svgCanvas.changeSelectedAttribute(attr, val);
        				}
        				this.blur();
        			});
        
        			// Prevent selection of elements when shift-clicking
        			$('#palette').mouseover(function() {
        				var inp = $('<input type="hidden">');
        				$(this).append(inp);
        				inp.focus().remove();
        			});
        
        			$('.palette_item').mousedown(function(evt) {
        				// shift key or right click for stroke
        				var picker = evt.shiftKey || evt.button === 2 ? 'stroke' : 'fill';
        				var color = $(this).data('rgb');
        				var paint;
        
        				// Webkit-based browsers returned 'initial' here for no stroke
        				if (color === 'none' || color === 'transparent' || color === 'initial') {
        					color = 'none';
        					paint = new $.jGraduate.Paint();
        				} else {
        					paint = new $.jGraduate.Paint({alpha: 100, solidColor: color.substr(1)});
        				}
        
        				paintBox[picker].setPaint(paint);
        				svgCanvas.setColor(picker, color);
        
        				if (color !== 'none' && svgCanvas.getPaintOpacity(picker) !== 1) {
        					svgCanvas.setPaintOpacity(picker, 1.0);
        				}
        				updateToolButtonState();
        			}).bind('contextmenu', function(e) {e.preventDefault();});
        
        			$('#toggle_stroke_tools').on('click', function() {
        				$('#tools_bottom').toggleClass('expanded');
        			});
        
        			(function() {
        				var last_x = null, last_y = null, w_area = workarea[0],
        					panning = false, keypan = false;
        
        				$('#svgcanvas').bind('mousemove mouseup', function(evt) {
        					if (panning === false) {return;}
        
        					w_area.scrollLeft -= (evt.clientX - last_x);
        					w_area.scrollTop -= (evt.clientY - last_y);
        
        					last_x = evt.clientX;
        					last_y = evt.clientY;
        
        					if (evt.type === 'mouseup') {panning = false;}
        					return false;
        				}).mousedown(function(evt) {
        					if (evt.button === 1 || keypan === true) {
        						panning = true;
        						last_x = evt.clientX;
        						last_y = evt.clientY;
        						return false;
        					}
        				});
        
        				$(window).mouseup(function() {
        					panning = false;
        				});
        
        				$(document).bind('keydown', 'space', function(evt) {
        					svgCanvas.spaceKey = keypan = true;
        					evt.preventDefault();
        				}).bind('keyup', 'space', function(evt) {
        					evt.preventDefault();
        					svgCanvas.spaceKey = keypan = false;
        				}).bind('keydown', 'shift', function(evt) {
        					if (svgCanvas.getMode() === 'zoom') {
        						workarea.css('cursor', zoomOutIcon);
        					}
        				}).bind('keyup', 'shift', function(evt) {
        					if (svgCanvas.getMode() === 'zoom') {
        						workarea.css('cursor', zoomInIcon);
        					}
        				});
        
        				editor.setPanning = function(active) {
        					svgCanvas.spaceKey = keypan = active;
        				};
        			}());
        
        			(function () {
        				var button = $('#main_icon');
        				var overlay = $('#main_icon span');
        				var list = $('#main_menu');
        				var on_button = false;
        				var height = 0;
        				var js_hover = true;
        				var set_click = false;
        
        				/*
        				// Currently unused
        				var hideMenu = function() {
        					list.fadeOut(200);
        				};
        				*/
        
        				$(window).mouseup(function(evt) {
        					if (!on_button) {
        						button.removeClass('buttondown');
        						// do not hide if it was the file input as that input needs to be visible
        						// for its change event to fire
        						if (evt.target.tagName != 'INPUT') {
        							list.fadeOut(200);
        						} else if (!set_click) {
        							set_click = true;
        							$(evt.target).click(function() {
        								list.css('margin-left', '-9999px').show();
        							});
        						}
        					}
        					on_button = false;
        				}).mousedown(function(evt) {
        //					$('.contextMenu').hide();
        					var islib = $(evt.target).closest('div.tools_flyout, .contextMenu').length;
        					if (!islib) {$('.tools_flyout:visible,.contextMenu').fadeOut(250);}
        				});
        
        				overlay.bind('mousedown',function() {
        					if (!button.hasClass('buttondown')) {
        						// Margin must be reset in case it was changed before;
        						list.css('margin-left', 0).show();
        						if (!height) {
        							height = list.height();
        						}
        						// Using custom animation as slideDown has annoying 'bounce effect'
        						list.css('height',0).animate({
        							'height': height
        						}, 200);
        						on_button = true;
        					} else {
        						list.fadeOut(200);
        					}
        					button.toggleClass('buttondown buttonup');
        				}).hover(function() {
        					on_button = true;
        				}).mouseout(function() {
        					on_button = false;
        				});
        
        				var list_items = $('#main_menu li');
        
        				// Check if JS method of hovering needs to be used (Webkit bug)
        				list_items.mouseover(function() {
        					js_hover = ($(this).css('background-color') == 'rgba(0, 0, 0, 0)');
        
        					list_items.unbind('mouseover');
        					if (js_hover) {
        						list_items.mouseover(function() {
        							this.style.backgroundColor = '#FFC';
        						}).mouseout(function() {
        							this.style.backgroundColor = 'transparent';
        							return true;
        						});
        					}
        				});
        			}());
        			// Made public for UI customization.
        			// TODO: Group UI functions into a public editor.ui interface.
        			editor.addDropDown = function(elem, callback, dropUp) {
        				if ($(elem).length == 0) {return;} // Quit if called on non-existant element
        				var button = $(elem).find('button');
        				var list = $(elem).find('ul').attr('id', $(elem)[0].id + '-list');
        				var on_button = false;
        				if (dropUp) {
        					$(elem).addClass('dropup');
        				} else {
        					// Move list to place where it can overflow container
        					$('#option_lists').append(list);
        				}
        				list.find('li').bind('mouseup', callback);
        
        				$(window).mouseup(function(evt) {
        					if (!on_button) {
        						button.removeClass('down');
        						list.hide();
        					}
        					on_button = false;
        				});
        
        				button.bind('mousedown',function() {
        					if (!button.hasClass('down')) {
        						if (!dropUp) {
        							var pos = $(elem).position();
        							list.css({
        								top: pos.top + 24,
        								left: pos.left - 10
        							});
        						}
        						list.show();
        						on_button = true;
        					} else {
        						list.hide();
        					}
        					button.toggleClass('down');
        				}).hover(function() {
        					on_button = true;
        				}).mouseout(function() {
        					on_button = false;
        				});
        			};
        
        			editor.addDropDown('#font_family_dropdown', function() {
        				$('#font_family').val($(this).text()).change();
        			});
        
        			editor.addDropDown('#opacity_dropdown', function() {
        				if ($(this).find('div').length) {return;}
        				var perc = parseInt($(this).text().split('%')[0], 10);
        				changeOpacity(false, perc);
        			}, true);
        
        			// For slider usage, see: http://jqueryui.com/demos/slider/
        			$('#opac_slider').slider({
        				start: function() {
        					$('#opacity_dropdown li:not(.special)').hide();
        				},
        				stop: function() {
        					$('#opacity_dropdown li').show();
        					$(window).mouseup();
        				},
        				slide: function(evt, ui) {
        					changeOpacity(ui);
        				}
        			});
        
        			editor.addDropDown('#blur_dropdown', $.noop);
        
        			var slideStart = false;
        
        			$('#blur_slider').slider({
        				max: 10,
        				step: 0.1,
        				stop: function(evt, ui) {
        					slideStart = false;
        					changeBlur(ui);
        					$('#blur_dropdown li').show();
        					$(window).mouseup();
        				},
        				start: function() {
        					slideStart = true;
        				},
        				slide: function(evt, ui) {
        					changeBlur(ui, null, slideStart);
        				}
        			});
        
        			editor.addDropDown('#zoom_dropdown', function() {
        				var item = $(this);
        				var val = item.data('val');
        				if (val) {
        					zoomChanged(window, val);
        				} else {
        					changeZoom({value: parseFloat(item.text())});
        				}
        			}, true);
        
        			addAltDropDown('#stroke_linecap', '#linecap_opts', function() {
        				setStrokeOpt(this, true);
        			}, {dropUp: true});
        
        			addAltDropDown('#stroke_linejoin', '#linejoin_opts', function() {
        				setStrokeOpt(this, true);
        			}, {dropUp: true});
        
        			addAltDropDown('#tool_position', '#position_opts', function() {
        				var letter = this.id.replace('tool_pos', '').charAt(0);
        				svgCanvas.alignSelectedElements(letter, 'page');
        			}, {multiclick: true});
        
        			/*
        
        			When a flyout icon is selected
        				(if flyout) {
        				- Change the icon
        				- Make pressing the button run its stuff
        				}
        				- Run its stuff
        
        			When its shortcut key is pressed
        				- If not current in list, do as above
        				, else:
        				- Just run its stuff
        
        			*/
        
        			// Unfocus text input when workarea is mousedowned.
        			(function() {
        				var inp;
        				var unfocus = function() {
        					$(inp).blur();
        				};
        
        				$('#svg_editor').find('button, select, input:not(#text)').focus(function() {
        					inp = this;
        					ui_context = 'toolbars';
        					workarea.mousedown(unfocus);
        				}).blur(function() {
        					ui_context = 'canvas';
        					workarea.unbind('mousedown', unfocus);
        					// Go back to selecting text if in textedit mode
        					if (svgCanvas.getMode() == 'textedit') {
        						$('#text').focus();
        					}
        				});
        			}());
        
        			var clickFHPath = function() {
        				if (toolButtonClick('#tool_fhpath')) {
        					svgCanvas.setMode('fhpath');
        				}
        			};
        
        			var clickLine = function() {
        				if (toolButtonClick('#tool_line')) {
        					svgCanvas.setMode('line');
        				}
        			};
        
        			var clickSquare = function() {
        				if (toolButtonClick('#tool_square')) {
        					svgCanvas.setMode('square');
        				}
        			};
        
        			var clickRect = function() {
        				if (toolButtonClick('#tool_rect')) {
        					svgCanvas.setMode('rect');
        				}
        			};
        
        			var clickFHRect = function() {
        				if (toolButtonClick('#tool_fhrect')) {
        					svgCanvas.setMode('fhrect');
        				}
        			};
        
        			var clickCircle = function() {
        				if (toolButtonClick('#tool_circle')) {
        					svgCanvas.setMode('circle');
        				}
        			};
        
        			var clickEllipse = function() {
        				if (toolButtonClick('#tool_ellipse')) {
        					svgCanvas.setMode('ellipse');
        				}
        			};
        
        			var clickFHEllipse = function() {
        				if (toolButtonClick('#tool_fhellipse')) {
        					svgCanvas.setMode('fhellipse');
        				}
        			};
        
        			var clickImage = function() {
        				if (toolButtonClick('#tool_image')) {
        					svgCanvas.setMode('image');
        				}
        			};
        
        			var clickZoom = function() {
        				if (toolButtonClick('#tool_zoom')) {
        					svgCanvas.setMode('zoom');
        					workarea.css('cursor', zoomInIcon);
        				}
        			};
        
        			var zoomImage = function(multiplier) {
        				var res = svgCanvas.getResolution();
        				multiplier = multiplier ? res.zoom * multiplier : 1;
        				// setResolution(res.w * multiplier, res.h * multiplier, true);
        				$('#zoom').val(multiplier * 100);
        				svgCanvas.setZoom(multiplier);
        				zoomDone();
        				updateCanvas(true);
        			};
        
        			var dblclickZoom = function() {
        				if (toolButtonClick('#tool_zoom')) {
        					zoomImage();
        					setSelectMode();
        				}
        			};
        
        			var clickText = function() {
        				if (toolButtonClick('#tool_text')) {
        					svgCanvas.setMode('text');
        				}
        			};
        
        			var clickPath = function() {
        				if (toolButtonClick('#tool_path')) {
        					svgCanvas.setMode('path');
        				}
        			};
        
        			// Delete is a contextual tool that only appears in the ribbon if
        			// an element has been selected
        			var deleteSelected = function() {
        				if (selectedElement != null || multiselected) {
        					svgCanvas.deleteSelectedElements();
        				}
        			};
        
        			var cutSelected = function() {
        				if (selectedElement != null || multiselected) {
        					svgCanvas.cutSelectedElements();
        				}
        			};
        
        			var copySelected = function() {
        				if (selectedElement != null || multiselected) {
        					svgCanvas.copySelectedElements();
        				}
        			};
        
        			var pasteInCenter = function() {
        				var zoom = svgCanvas.getZoom();
        				var x = (workarea[0].scrollLeft + workarea.width()/2)/zoom - svgCanvas.contentW;
        				var y = (workarea[0].scrollTop + workarea.height()/2)/zoom - svgCanvas.contentH;
        				svgCanvas.pasteElements('point', x, y);
        			};
        
        			var moveToTopSelected = function() {
        				if (selectedElement != null) {
        					svgCanvas.moveToTopSelectedElement();
        				}
        			};
        
        			var moveToBottomSelected = function() {
        				if (selectedElement != null) {
        					svgCanvas.moveToBottomSelectedElement();
        				}
        			};
        
        			var moveUpDownSelected = function(dir) {
        				if (selectedElement != null) {
        					svgCanvas.moveUpDownSelected(dir);
        				}
        			};
        
        			var convertToPath = function() {
        				if (selectedElement != null) {
        					svgCanvas.convertToPath();
        				}
        			};
        
        			var reorientPath = function() {
        				if (selectedElement != null) {
        					path.reorient();
        				}
        			};
        
        			var makeHyperlink = function() {
        				if (selectedElement != null || multiselected) {
        					$.prompt(uiStrings.notification.enterNewLinkURL, 'http://', function(url) {
        						if (url) {svgCanvas.makeHyperlink(url);}
        					});
        				}
        			};
        
        			var moveSelected = function(dx,dy) {
        				if (selectedElement != null || multiselected) {
        					if (curConfig.gridSnapping) {
        						// Use grid snap value regardless of zoom level
        						var multi = svgCanvas.getZoom() * curConfig.snappingStep;
        						dx *= multi;
        						dy *= multi;
        					}
        					svgCanvas.moveSelectedElements(dx,dy);
        				}
        			};
        
        			var linkControlPoints = function() {
        				$('#tool_node_link').toggleClass('push_button_pressed tool_button');
        				var linked = $('#tool_node_link').hasClass('push_button_pressed');
        				path.linkControlPoints(linked);
        			};
        
        			var clonePathNode = function() {
        				if (path.getNodePoint()) {
        					path.clonePathNode();
        				}
        			};
        
        			var deletePathNode = function() {
        				if (path.getNodePoint()) {
        					path.deletePathNode();
        				}
        			};
        
        			var addSubPath = function() {
        				var button = $('#tool_add_subpath');
        				var sp = !button.hasClass('push_button_pressed');
        				button.toggleClass('push_button_pressed tool_button');
        				path.addSubPath(sp);
        			};
        
        			var opencloseSubPath = function() {
        				path.opencloseSubPath();
        			};
        
        			var selectNext = function() {
        				svgCanvas.cycleElement(1);
        			};
        
        			var selectPrev = function() {
        				svgCanvas.cycleElement(0);
        			};
        
        			var rotateSelected = function(cw, step) {
        				if (selectedElement == null || multiselected) {return;}
        				if (!cw) {step *= -1;}
        				var angle = parseFloat($('#angle').val()) + step;
        				svgCanvas.setRotationAngle(angle);
        				updateContextPanel();
        			};
        
        			var clickClear = function() {
        				var dims = curConfig.dimensions;
        				$.confirm(uiStrings.notification.QwantToClear, function(ok) {
        					if (!ok) {return;}
        					setSelectMode();
        					svgCanvas.clear();
        					svgCanvas.setResolution(dims[0], dims[1]);
        					updateCanvas(true);
        					zoomImage();
        					populateLayers();
        					updateContextPanel();
        					prepPaints();
        					svgCanvas.runExtensions('onNewDocument');
        				});
        			};
        
        			var clickBold = function() {
        				svgCanvas.setBold( !svgCanvas.getBold() );
        				updateContextPanel();
        				return false;
        			};
        
        			var clickItalic = function() {
        				svgCanvas.setItalic( !svgCanvas.getItalic() );
        				updateContextPanel();
        				return false;
        			};
        
        			var clickSave = function() {
        				// In the future, more options can be provided here
        				var saveOpts = {
        					'images': $.pref('img_save'),
        					'round_digits': 6
        				};
        				svgCanvas.save(saveOpts);
        			};
        
        			var clickExport = function() {
        				$.select('Select an image type for export: ', [
        					// See http://kangax.github.io/jstests/toDataUrl_mime_type_test/ for a useful list of MIME types and browser support
        					// 'ICO', // Todo: Find a way to preserve transparency in SVG-Edit if not working presently and do full packaging for x-icon; then switch back to position after 'PNG'
        					'PNG',
        					'JPEG', 'BMP', 'WEBP', 'PDF'
        				], function (imgType) { // todo: replace hard-coded msg with uiStrings.notification.
        					if (!imgType) {
        						return;
        					}
        					// Open placeholder window (prevents popup)
        					var exportWindowName;
        					function openExportWindow () {
        						var str = uiStrings.notification.loadingImage;
        						if (curConfig.exportWindowType === 'new') {
        							editor.exportWindowCt++;
        						}
        						exportWindowName = curConfig.canvasName + editor.exportWindowCt;
        						exportWindow = window.open(
        							'data:text/html;charset=utf-8,' + encodeURIComponent('<title>' + str + '</title><h1>' + str + '</h1>'),
        							exportWindowName
        						);
        					}
        					if (imgType === 'PDF') {
        						if (!customExportPDF) {
        							openExportWindow();
        						}
        						svgCanvas.exportPDF(exportWindowName);
        					}
        					else {
        						if (!customExportImage) {
        							openExportWindow();
        						}
        						var quality = parseInt($('#image-slider').val(), 10)/100;
        						svgCanvas.rasterExport(imgType, quality, exportWindowName);
        					}
        				}, function () {
        					var sel = $(this);
        					if (sel.val() === 'JPEG' || sel.val() === 'WEBP') {
        						if (!$('#image-slider').length) {
        							$('<div><label>Quality: <input id="image-slider" type="range" min="1" max="100" value="92" /></label></div>').appendTo(sel.parent()); // Todo: i18n-ize label
        						}
        					}
        					else {
        						$('#image-slider').parent().remove();
        					}
        				});
        			};
        
        			// by default, svgCanvas.open() is a no-op.
        			// it is up to an extension mechanism (opera widget, etc)
        			// to call setCustomHandlers() which will make it do something
        			var clickOpen = function() {
        				svgCanvas.open();
        			};
        
        			var clickImport = function() {
        			};
        
        			var clickUndo = function() {
        				if (undoMgr.getUndoStackSize() > 0) {
        					undoMgr.undo();
        					populateLayers();
        				}
        			};
        
        			var clickRedo = function() {
        				if (undoMgr.getRedoStackSize() > 0) {
        					undoMgr.redo();
        					populateLayers();
        				}
        			};
        
        			var clickGroup = function() {
        				// group
        				if (multiselected) {
        					svgCanvas.groupSelectedElements();
        				}
        				// ungroup
        				else if (selectedElement) {
        					svgCanvas.ungroupSelectedElement();
        				}
        			};
        
        			var clickClone = function() {
        				svgCanvas.cloneSelectedElements(20, 20);
        			};
        
        			var clickAlign = function() {
        				var letter = this.id.replace('tool_align', '').charAt(0);
        				svgCanvas.alignSelectedElements(letter, $('#align_relative_to').val());
        			};
        
        			var clickWireframe = function() {
        				$('#tool_wireframe').toggleClass('push_button_pressed tool_button');
        				workarea.toggleClass('wireframe');
        
        				if (supportsNonSS) {return;}
        				var wf_rules = $('#wireframe_rules');
        				if (!wf_rules.length) {
        					wf_rules = $('<style id="wireframe_rules"></style>').appendTo('head');
        				} else {
        					wf_rules.empty();
        				}
        
        				updateWireFrame();
        			};
        
        			$('#svg_docprops_container, #svg_prefs_container').draggable({cancel: 'button,fieldset', containment: 'window'});
        
        			var showDocProperties = function() {
        				if (docprops) {return;}
        				docprops = true;
        
        				// This selects the correct radio button by using the array notation
        				$('#image_save_opts input').val([$.pref('img_save')]);
        
        				// update resolution option with actual resolution
        				var res = svgCanvas.getResolution();
        				if (curConfig.baseUnit !== 'px') {
        					res.w = svgedit.units.convertUnit(res.w) + curConfig.baseUnit;
        					res.h = svgedit.units.convertUnit(res.h) + curConfig.baseUnit;
        				}
        
        				$('#canvas_width').val(res.w);
        				$('#canvas_height').val(res.h);
        				$('#canvas_title').val(svgCanvas.getDocumentTitle());
        
        				$('#svg_docprops').show();
        			};
        
        			var showPreferences = function() {
        				if (preferences) {return;}
        				preferences = true;
        				$('#main_menu').hide();
        
        				// Update background color with current one
        				var blocks = $('#bg_blocks div');
        				var cur_bg = 'cur_background';
        				var canvas_bg = curPrefs.bkgd_color;
        				var url = $.pref('bkgd_url');
        				blocks.each(function() {
        					var blk = $(this);
        					var is_bg = blk.css('background-color') == canvas_bg;
        					blk.toggleClass(cur_bg, is_bg);
        					if (is_bg) {$('#canvas_bg_url').removeClass(cur_bg);}
        				});
        				if (!canvas_bg) {blocks.eq(0).addClass(cur_bg);}
        				if (url) {
        					$('#canvas_bg_url').val(url);
        				}
        				$('#grid_snapping_on').prop('checked', curConfig.gridSnapping);
        				$('#grid_snapping_step').attr('value', curConfig.snappingStep);
        				$('#grid_color').attr('value', curConfig.gridColor);
        
        				$('#svg_prefs').show();
        			};
        
        			var hideSourceEditor = function() {
        				$('#svg_source_editor').hide();
        				editingsource = false;
        				$('#svg_source_textarea').blur();
        			};
        
        			var saveSourceEditor = function() {
        				if (!editingsource) {return;}
        
        				var saveChanges = function() {
        					svgCanvas.clearSelection();
        					hideSourceEditor();
        					zoomImage();
        					populateLayers();
        					updateTitle();
        					prepPaints();
        				};
        
        				if (!svgCanvas.setSvgString($('#svg_source_textarea').val())) {
        					$.confirm(uiStrings.notification.QerrorsRevertToSource, function(ok) {
        						if (!ok) {return false;}
        						saveChanges();
        					});
        				} else {
        					saveChanges();
        				}
        				setSelectMode();
        			};
        
        			var hideDocProperties = function() {
        				$('#svg_docprops').hide();
        				$('#canvas_width,#canvas_height').removeAttr('disabled');
        				$('#resolution')[0].selectedIndex = 0;
        				$('#image_save_opts input').val([$.pref('img_save')]);
        				docprops = false;
        			};
        
        			var hidePreferences = function() {
        				$('#svg_prefs').hide();
        				preferences = false;
        			};
        
        			var saveDocProperties = function() {
        				// set title
        				var newTitle = $('#canvas_title').val();
        				updateTitle(newTitle);
        				svgCanvas.setDocumentTitle(newTitle);
        
        				// update resolution
        				var width = $('#canvas_width'), w = width.val();
        				var height = $('#canvas_height'), h = height.val();
        
        				if (w != 'fit' && !svgedit.units.isValidUnit('width', w)) {
        					$.alert(uiStrings.notification.invalidAttrValGiven);
        					width.parent().addClass('error');
        					return false;
        				}
        
        				width.parent().removeClass('error');
        
        				if (h != 'fit' && !svgedit.units.isValidUnit('height', h)) {
        					$.alert(uiStrings.notification.invalidAttrValGiven);
        					height.parent().addClass('error');
        					return false;
        				}
        
        				height.parent().removeClass('error');
        
        				if (!svgCanvas.setResolution(w, h)) {
        					$.alert(uiStrings.notification.noContentToFitTo);
        					return false;
        				}
        
        				// Set image save option
        				$.pref('img_save', $('#image_save_opts :checked').val());
        				updateCanvas();
        				hideDocProperties();
        			};
        
        			var savePreferences = editor.savePreferences = function() {
        				// Set background
        				var color = $('#bg_blocks div.cur_background').css('background-color') || '#FFF';
        				setBackground(color, $('#canvas_bg_url').val());
        
        				// set language
        				var lang = $('#lang_select').val();
        				if (lang !== $.pref('lang')) {
        					editor.putLocale(lang, good_langs);
        				}
        
        				// set icon size
        				setIconSize($('#iconsize').val());
        
        				// set grid setting
        				curConfig.gridSnapping = $('#grid_snapping_on')[0].checked;
        				curConfig.snappingStep = $('#grid_snapping_step').val();
        				curConfig.gridColor = $('#grid_color').val();
        				curConfig.showRulers = $('#show_rulers')[0].checked;
        
        				$('#rulers').toggle(curConfig.showRulers);
        				if (curConfig.showRulers) {updateRulers();}
        				curConfig.baseUnit = $('#base_unit').val();
        
        				svgCanvas.setConfig(curConfig);
        
        				updateCanvas();
        				hidePreferences();
        			};
        
        			var resetScrollPos = $.noop;
        
        			var cancelOverlays = function() {
        				$('#dialog_box').hide();
        				if (!editingsource && !docprops && !preferences) {
        					if (cur_context) {
        						svgCanvas.leaveContext();
        					}
        					return;
        				}
        
        				if (editingsource) {
        					if (origSource !== $('#svg_source_textarea').val()) {
        						$.confirm(uiStrings.notification.QignoreSourceChanges, function(ok) {
        							if (ok) {hideSourceEditor();}
        						});
        					} else {
        						hideSourceEditor();
        					}
        				} else if (docprops) {
        					hideDocProperties();
        				} else if (preferences) {
        					hidePreferences();
        				}
        				resetScrollPos();
        			};
        
        			var win_wh = {width:$(window).width(), height:$(window).height()};
        
        			// Fix for Issue 781: Drawing area jumps to top-left corner on window resize (IE9)
        			if (svgedit.browser.isIE()) {
        				(function() {
        					resetScrollPos = function() {
        						if (workarea[0].scrollLeft === 0 && workarea[0].scrollTop === 0) {
        							workarea[0].scrollLeft = curScrollPos.left;
        							workarea[0].scrollTop = curScrollPos.top;
        						}
        					};
        
        					curScrollPos = {
        						left: workarea[0].scrollLeft,
        						top: workarea[0].scrollTop
        					};
        
        					$(window).resize(resetScrollPos);
        					editor.ready(function() {
        						// TODO: Find better way to detect when to do this to minimize
        						// flickering effect
        						setTimeout(function() {
        							resetScrollPos();
        						}, 500);
        					});
        
        					workarea.scroll(function() {
        						curScrollPos = {
        							left: workarea[0].scrollLeft,
        							top: workarea[0].scrollTop
        						};
        					});
        				}());
        			}
        
        			$(window).resize(function(evt) {
        				$.each(win_wh, function(type, val) {
        					var curval = $(window)[type]();
        					workarea[0]['scroll' + (type === 'width' ? 'Left' : 'Top')] -= (curval - val)/2;
        					win_wh[type] = curval;
        				});
        				setFlyoutPositions();
        			});
        
        			(function() {
        				workarea.scroll(function() {
        					// TODO: jQuery's scrollLeft/Top() wouldn't require a null check
        					if ($('#ruler_x').length != 0) {
        						$('#ruler_x')[0].scrollLeft = workarea[0].scrollLeft;
        					}
        					if ($('#ruler_y').length != 0) {
        						$('#ruler_y')[0].scrollTop = workarea[0].scrollTop;
        					}
        				});
        
        			}());
        
        			$('#url_notice').click(function() {
        				$.alert(this.title);
        			});
        
        			$('#change_image_url').click(promptImgURL);
        
        			// added these event handlers for all the push buttons so they
        			// behave more like buttons being pressed-in and not images
        			(function() {
        				var toolnames = ['clear', 'open', 'save', 'source', 'delete', 'delete_multi', 'paste', 'clone', 'clone_multi', 'move_top', 'move_bottom'];
        				var all_tools = '';
        				var cur_class = 'tool_button_current';
        
        				$.each(toolnames, function(i, item) {
        					all_tools += (i ? ',' : '') + '#tool_' + item;
        				});
        
        				$(all_tools).mousedown(function() {
        					$(this).addClass(cur_class);
        				}).bind('mousedown mouseout', function() {
        					$(this).removeClass(cur_class);
        				});
        
        				$('#tool_undo, #tool_redo').mousedown(function() {
        					if (!$(this).hasClass('disabled')) {$(this).addClass(cur_class);}
        				}).bind('mousedown mouseout',function() {
        					$(this).removeClass(cur_class);}
        				);
        			}());
        
        			// switch modifier key in tooltips if mac
        			// NOTE: This code is not used yet until I can figure out how to successfully bind ctrl/meta
        			// in Opera and Chrome
        			if (svgedit.browser.isMac() && !window.opera) {
        				var shortcutButtons = ['tool_clear', 'tool_save', 'tool_source', 'tool_undo', 'tool_redo', 'tool_clone'];
        				i = shortcutButtons.length;
        				while (i--) {
        					var button = document.getElementById(shortcutButtons[i]);
        					if (button) {
        						var title = button.title;
        						var index = title.indexOf('Ctrl+');
        						button.title = [title.substr(0, index), 'Cmd+', title.substr(index + 5)].join('');
        					}
        				}
        			}
        
        			// TODO: go back to the color boxes having white background-color and then setting
        			//	background-image to none.png (otherwise partially transparent gradients look weird)
        			var colorPicker = function(elem) {
        				var picker = elem.attr('id') == 'stroke_color' ? 'stroke' : 'fill';
        //				var opacity = (picker == 'stroke' ? $('#stroke_opacity') : $('#fill_opacity'));
        				var paint = paintBox[picker].paint;
        				var title = (picker == 'stroke' ? 'Pick a Stroke Paint and Opacity' : 'Pick a Fill Paint and Opacity');
        				// var was_none = false; // Currently unused
        				var pos = elem.offset();
        				$('#color_picker')
        					.draggable({cancel: '.jGraduate_tabs, .jGraduate_colPick, .jGraduate_gradPick, .jPicker', containment: 'window'})
        					.css(curConfig.colorPickerCSS || {'left': pos.left - 140, 'bottom': 40})
        					.jGraduate(
        					{
        						paint: paint,
        						window: { pickerTitle: title },
        						images: { clientPath: curConfig.jGraduatePath },
        						newstop: 'inverse'
        					},
        					function(p) {
        						paint = new $.jGraduate.Paint(p);
        						paintBox[picker].setPaint(paint);
        						svgCanvas.setPaint(picker, paint);
        						$('#color_picker').hide();
        					},
        					function() {
        						$('#color_picker').hide();
        					});
        			};
        
        			var PaintBox = function(container, type) {
        				var paintColor, paintOpacity,
        					cur = curConfig[type === 'fill' ? 'initFill' : 'initStroke'];
        				// set up gradients to be used for the buttons
        				var svgdocbox = new DOMParser().parseFromString(
        					'<svg xmlns="http://www.w3.org/2000/svg"><rect width="16.5" height="16.5"'+
        '					fill="#' + cur.color + '" opacity="' + cur.opacity + '"/>'+
        '					<defs><linearGradient id="gradbox_"/></defs></svg>', 'text/xml');
        				var docElem = svgdocbox.documentElement;
        
        				docElem = $(container)[0].appendChild(document.importNode(docElem, true));
        				docElem.setAttribute('width',16.5);
        
        				this.rect = docElem.firstChild;
        				this.defs = docElem.getElementsByTagName('defs')[0];
        				this.grad = this.defs.firstChild;
        				this.paint = new $.jGraduate.Paint({solidColor: cur.color});
        				this.type = type;
        
        				this.setPaint = function(paint, apply) {
        					this.paint = paint;
        
        					var fillAttr = 'none';
        					var ptype = paint.type;
        					var opac = paint.alpha / 100;
        
        					switch ( ptype ) {
        						case 'solidColor':
        							fillAttr = (paint[ptype] != 'none') ? '#' + paint[ptype] : paint[ptype];
        							break;
        						case 'linearGradient':
        						case 'radialGradient':
        							this.defs.removeChild(this.grad);
        							this.grad = this.defs.appendChild(paint[ptype]);
        							var id = this.grad.id = 'gradbox_' + this.type;
        							fillAttr = 'url(#' + id + ')';
        							break;
        					}
        
        					this.rect.setAttribute('fill', fillAttr);
        					this.rect.setAttribute('opacity', opac);
        
        					if (apply) {
        						svgCanvas.setColor(this.type, paintColor, true);
        						svgCanvas.setPaintOpacity(this.type, paintOpacity, true);
        					}
        				};
        
        				this.update = function(apply) {
        					if (!selectedElement) {return;}
        					var i, len;
        					var type = this.type;
        					switch (selectedElement.tagName) {
        					case 'use':
        					case 'image':
        					case 'foreignObject':
        						// These elements don't have fill or stroke, so don't change
        						// the current value
        						return;
        					case 'g':
        					case 'a':
        						var gPaint = null;
        
        						var childs = selectedElement.getElementsByTagName('*');
        						for (i = 0, len = childs.length; i < len; i++) {
        							var elem = childs[i];
        							var p = elem.getAttribute(type);
        							if (i === 0) {
        								gPaint = p;
        							} else if (gPaint !== p) {
        								gPaint = null;
        								break;
        							}
        						}
        
        						if (gPaint === null) {
        							// No common color, don't update anything
        							paintColor = null;
        							return;
        						}
        						paintColor = gPaint;
        						paintOpacity = 1;
        						break;
        					default:
        						paintOpacity = parseFloat(selectedElement.getAttribute(type + '-opacity'));
        						if (isNaN(paintOpacity)) {
        							paintOpacity = 1.0;
        						}
        
        						var defColor = type === 'fill' ? 'black' : 'none';
        						paintColor = selectedElement.getAttribute(type) || defColor;
        					}
        
        					if (apply) {
        						svgCanvas.setColor(type, paintColor, true);
        						svgCanvas.setPaintOpacity(type, paintOpacity, true);
        					}
        
        					paintOpacity *= 100;
        
        					var paint = getPaint(paintColor, paintOpacity, type);
        					// update the rect inside #fill_color/#stroke_color
        					this.setPaint(paint);
        				};
        
        				this.prep = function() {
        					var ptype = this.paint.type;
        
        					switch ( ptype ) {
        						case 'linearGradient':
        						case 'radialGradient':
        							var paint = new $.jGraduate.Paint({copy: this.paint});
        							svgCanvas.setPaint(type, paint);
        							break;
        					}
        				};
        			};
        
        			paintBox.fill = new PaintBox('#fill_color', 'fill');
        			paintBox.stroke = new PaintBox('#stroke_color', 'stroke');
        
        			$('#stroke_width').val(curConfig.initStroke.width);
        			$('#group_opacity').val(curConfig.initOpacity * 100);
        
        			// Use this SVG elem to test vectorEffect support
        			var testEl = paintBox.fill.rect.cloneNode(false);
        			testEl.setAttribute('style', 'vector-effect:non-scaling-stroke');
        			supportsNonSS = (testEl.style.vectorEffect === 'non-scaling-stroke');
        			testEl.removeAttribute('style');
        			var svgdocbox = paintBox.fill.rect.ownerDocument;
        			// Use this to test support for blur element. Seems to work to test support in Webkit
        			var blurTest = svgdocbox.createElementNS(svgedit.NS.SVG, 'feGaussianBlur');
        			if (blurTest.stdDeviationX === undefined) {
        				$('#tool_blur').hide();
        			}
        			$(blurTest).remove();
        
        			// Test for zoom icon support
        			(function() {
        				var pre = '-' + uaPrefix.toLowerCase() + '-zoom-';
        				var zoom = pre + 'in';
        				workarea.css('cursor', zoom);
        				if (workarea.css('cursor') === zoom) {
        					zoomInIcon = zoom;
        					zoomOutIcon = pre + 'out';
        				}
        				workarea.css('cursor', 'auto');
        			}());
        
        			// Test for embedImage support (use timeout to not interfere with page load)
        			setTimeout(function() {
        				svgCanvas.embedImage('images/logo.png', function(datauri) {
        					if (!datauri) {
        						// Disable option
        						$('#image_save_opts [value=embed]').attr('disabled', 'disabled');
        						$('#image_save_opts input').val(['ref']);
        						$.pref('img_save', 'ref');
        						$('#image_opt_embed').css('color', '#666').attr('title', uiStrings.notification.featNotSupported);
        					}
        				});
        			}, 1000);
        
        			$('#fill_color, #tool_fill .icon_label').click(function() {
        				colorPicker($('#fill_color'));
        				updateToolButtonState();
        			});
        
        			$('#stroke_color, #tool_stroke .icon_label').click(function() {
        				colorPicker($('#stroke_color'));
        				updateToolButtonState();
        			});
        
        			$('#group_opacityLabel').click(function() {
        				$('#opacity_dropdown button').mousedown();
        				$(window).mouseup();
        			});
        
        			$('#zoomLabel').click(function() {
        				$('#zoom_dropdown button').mousedown();
        				$(window).mouseup();
        			});
        
        			$('#tool_move_top').mousedown(function(evt) {
        				$('#tools_stacking').show();
        				evt.preventDefault();
        			});
        
        			$('.layer_button').mousedown(function() {
        				$(this).addClass('layer_buttonpressed');
        			}).mouseout(function() {
        				$(this).removeClass('layer_buttonpressed');
        			}).mouseup(function() {
        				$(this).removeClass('layer_buttonpressed');
        			});
        
        			$('.push_button').mousedown(function() {
        				if (!$(this).hasClass('disabled')) {
        					$(this).addClass('push_button_pressed').removeClass('push_button');
        				}
        			}).mouseout(function() {
        				$(this).removeClass('push_button_pressed').addClass('push_button');
        			}).mouseup(function() {
        				$(this).removeClass('push_button_pressed').addClass('push_button');
        			});
        
        			// ask for a layer name
        			$('#layer_new').click(function() {
        				var uniqName,
        					i = svgCanvas.getCurrentDrawing().getNumLayers();
        				do {
        					uniqName = uiStrings.layers.layer + ' ' + (++i);
        				} while(svgCanvas.getCurrentDrawing().hasLayer(uniqName));
        
        				$.prompt(uiStrings.notification.enterUniqueLayerName, uniqName, function(newName) {
        					if (!newName) {return;}
        					if (svgCanvas.getCurrentDrawing().hasLayer(newName)) {
        						$.alert(uiStrings.notification.dupeLayerName);
        						return;
        					}
        					svgCanvas.createLayer(newName);
        					updateContextPanel();
        					populateLayers();
        				});
        			});
        
        			function deleteLayer() {
        				if (svgCanvas.deleteCurrentLayer()) {
        					updateContextPanel();
        					populateLayers();
        					// This matches what SvgCanvas does
        					// TODO: make this behavior less brittle (svg-editor should get which
        					// layer is selected from the canvas and then select that one in the UI)
        					$('#layerlist tr.layer').removeClass('layersel');
        					$('#layerlist tr.layer:first').addClass('layersel');
        				}
        			}
        
        			function cloneLayer() {
        				var name = svgCanvas.getCurrentDrawing().getCurrentLayerName() + ' copy';
        
        				$.prompt(uiStrings.notification.enterUniqueLayerName, name, function(newName) {
        					if (!newName) {return;}
        					if (svgCanvas.getCurrentDrawing().hasLayer(newName)) {
        						$.alert(uiStrings.notification.dupeLayerName);
        						return;
        					}
        					svgCanvas.cloneLayer(newName);
        					updateContextPanel();
        					populateLayers();
        				});
        			}
        
        			function mergeLayer() {
        				if ($('#layerlist tr.layersel').index() == svgCanvas.getCurrentDrawing().getNumLayers()-1) {
        					return;
        				}
        				svgCanvas.mergeLayer();
        				updateContextPanel();
        				populateLayers();
        			}
        
        			function moveLayer(pos) {
        				var curIndex = $('#layerlist tr.layersel').index();
        				var total = svgCanvas.getCurrentDrawing().getNumLayers();
        				if (curIndex > 0 || curIndex < total-1) {
        					curIndex += pos;
        					svgCanvas.setCurrentLayerPosition(total-curIndex-1);
        					populateLayers();
        				}
        			}
        
        			$('#layer_delete').click(deleteLayer);
        
        			$('#layer_up').click(function() {
        				moveLayer(-1);
        			});
        
        			$('#layer_down').click(function() {
        				moveLayer(1);
        			});
        
        			$('#layer_rename').click(function() {
        				// var curIndex = $('#layerlist tr.layersel').prevAll().length; // Currently unused
        				var oldName = $('#layerlist tr.layersel td.layername').text();
        				$.prompt(uiStrings.notification.enterNewLayerName, '', function(newName) {
        					if (!newName) {return;}
        					if (oldName == newName || svgCanvas.getCurrentDrawing().hasLayer(newName)) {
        						$.alert(uiStrings.notification.layerHasThatName);
        						return;
        					}
        
        					svgCanvas.renameCurrentLayer(newName);
        					populateLayers();
        				});
        			});
        
        			var SIDEPANEL_MAXWIDTH = 300;
        			var SIDEPANEL_OPENWIDTH = 150;
        			var sidedrag = -1, sidedragging = false, allowmove = false;
        
        			var changeSidePanelWidth = function(delta) {
        				var rulerX = $('#ruler_x');
        				$('#sidepanels').width('+=' + delta);
        				$('#layerpanel').width('+=' + delta);
        				rulerX.css('right', parseInt(rulerX.css('right'), 10) + delta);
        				workarea.css('right', parseInt(workarea.css('right'), 10) + delta);
        				svgCanvas.runExtensions('workareaResized');
        			};
        
        			var resizeSidePanel = function(evt) {
        				if (!allowmove) {return;}
        				if (sidedrag == -1) {return;}
        				sidedragging = true;
        				var deltaX = sidedrag - evt.pageX;
        				var sideWidth = $('#sidepanels').width();
        				if (sideWidth + deltaX > SIDEPANEL_MAXWIDTH) {
        					deltaX = SIDEPANEL_MAXWIDTH - sideWidth;
        					sideWidth = SIDEPANEL_MAXWIDTH;
        				} else if (sideWidth + deltaX < 2) {
        					deltaX = 2 - sideWidth;
        					sideWidth = 2;
        				}
        				if (deltaX == 0) {return;}
        				sidedrag -= deltaX;
        				changeSidePanelWidth(deltaX);
        			};
        
        			// if width is non-zero, then fully close it, otherwise fully open it
        			// the optional close argument forces the side panel closed
        			var toggleSidePanel = function(close) {
        				var w = $('#sidepanels').width();
        				var deltaX = (w > 2 || close ? 2 : SIDEPANEL_OPENWIDTH) - w;
        				changeSidePanelWidth(deltaX);
        			};
        
        			$('#sidepanel_handle')
        				.mousedown(function(evt) {
        					sidedrag = evt.pageX;
        					$(window).mousemove(resizeSidePanel);
        					allowmove = false;
        					// Silly hack for Chrome, which always runs mousemove right after mousedown
        					setTimeout(function() {
        						allowmove = true;
        					}, 20);
        				})
        				.mouseup(function(evt) {
        					if (!sidedragging) {toggleSidePanel();}
        					sidedrag = -1;
        					sidedragging = false;
        				});
        
        			$(window).mouseup(function() {
        				sidedrag = -1;
        				sidedragging = false;
        				$('#svg_editor').unbind('mousemove', resizeSidePanel);
        			});
        
        			populateLayers();
        
        		//	function changeResolution(x,y) {
        		//		var zoom = svgCanvas.getResolution().zoom;
        		//		setResolution(x * zoom, y * zoom);
        		//	}
        
        			var centerCanvas = function() {
        				// this centers the canvas vertically in the workarea (horizontal handled in CSS)
        				workarea.css('line-height', workarea.height() + 'px');
        			};
        
        			$(window).bind('load resize', centerCanvas);
        
        			function stepFontSize(elem, step) {
        				var orig_val = Number(elem.value);
        				var sug_val = orig_val + step;
        				var increasing = sug_val >= orig_val;
        				if (step === 0) {return orig_val;}
        
        				if (orig_val >= 24) {
        					if (increasing) {
        						return Math.round(orig_val * 1.1);
        					}
        					return Math.round(orig_val / 1.1);
        				}
        				if (orig_val <= 1) {
        					if (increasing) {
        						return orig_val * 2;
        					}
        					return orig_val / 2;
        				}
        				return sug_val;
        			}
        
        			function stepZoom(elem, step) {
        				var orig_val = Number(elem.value);
        				if (orig_val === 0) {return 100;}
        				var sug_val = orig_val + step;
        				if (step === 0) {return orig_val;}
        
        				if (orig_val >= 100) {
        					return sug_val;
        				}
        				if (sug_val >= orig_val) {
        					return orig_val * 2;
        				}
        				return orig_val / 2;
        			}
        
        		//	function setResolution(w, h, center) {
        		//		updateCanvas();
        		// //		w-=0; h-=0;
        		// //		$('#svgcanvas').css( { 'width': w, 'height': h } );
        		// //		$('#canvas_width').val(w);
        		// //		$('#canvas_height').val(h);
        		// //
        		// //		if (center) {
        		// //			var w_area = workarea;
        		// //			var scroll_y = h/2 - w_area.height()/2;
        		// //			var scroll_x = w/2 - w_area.width()/2;
        		// //			w_area[0].scrollTop = scroll_y;
        		// //			w_area[0].scrollLeft = scroll_x;
        		// //		}
        		//	}
        
        			$('#resolution').change(function() {
        				var wh = $('#canvas_width,#canvas_height');
        				if (!this.selectedIndex) {
        					if ($('#canvas_width').val() == 'fit') {
        						wh.removeAttr('disabled').val(100);
        					}
        				} else if (this.value == 'content') {
        					wh.val('fit').attr('disabled', 'disabled');
        				} else {
        					var dims = this.value.split('x');
        					$('#canvas_width').val(dims[0]);
        					$('#canvas_height').val(dims[1]);
        					wh.removeAttr('disabled');
        				}
        			});
        
        			//Prevent browser from erroneously repopulating fields
        			$('input,select').attr('autocomplete', 'off');
        
        			// Associate all button actions as well as non-button keyboard shortcuts
        			Actions = (function() {
        				// sel:'selector', fn:function, evt:'event', key:[key, preventDefault, NoDisableInInput]
        				var tool_buttons = [
        					{sel: '#tool_select', fn: clickSelect, evt: 'click', key: ['V', true]},
        					{sel: '#tool_fhpath', fn: clickFHPath, evt: 'click', key: ['Q', true]},
        					{sel: '#tool_line', fn: clickLine, evt: 'click', key: ['L', true]},
        					{sel: '#tool_rect', fn: clickRect, evt: 'mouseup', key: ['R', true], parent: '#tools_rect', icon: 'rect'},
        					{sel: '#tool_square', fn: clickSquare, evt: 'mouseup', parent: '#tools_rect', icon: 'square'},
        					{sel: '#tool_fhrect', fn: clickFHRect, evt: 'mouseup', parent: '#tools_rect', icon: 'fh_rect'},
        					{sel: '#tool_ellipse', fn: clickEllipse, evt: 'mouseup', key: ['E', true], parent: '#tools_ellipse', icon: 'ellipse'},
        					{sel: '#tool_circle', fn: clickCircle, evt: 'mouseup', parent: '#tools_ellipse', icon: 'circle'},
        					{sel: '#tool_fhellipse', fn: clickFHEllipse, evt: 'mouseup', parent: '#tools_ellipse', icon: 'fh_ellipse'},
        					{sel: '#tool_path', fn: clickPath, evt: 'click', key: ['P', true]},
        					{sel: '#tool_text', fn: clickText, evt: 'click', key: ['T', true]},
        					{sel: '#tool_image', fn: clickImage, evt: 'mouseup'},
        					{sel: '#tool_zoom', fn: clickZoom, evt: 'mouseup', key: ['Z', true]},
        					{sel: '#tool_clear', fn: clickClear, evt: 'mouseup', key: ['N', true]},
        					{sel: '#tool_save', fn: function() {
        						if (editingsource) {
        							saveSourceEditor();
        						}
        						else {
        							clickSave();
        						}
        					}, evt: 'mouseup', key: ['S', true]},
        					{sel: '#tool_export', fn: clickExport, evt: 'mouseup'},
        					{sel: '#tool_open', fn: clickOpen, evt: 'mouseup', key: ['O', true]},
        					{sel: '#tool_import', fn: clickImport, evt: 'mouseup'},
        					{sel: '#tool_source', fn: showSourceEditor, evt: 'click', key: ['U', true]},
        					{sel: '#tool_wireframe', fn: clickWireframe, evt: 'click', key: ['F', true]},
        					{sel: '#tool_source_cancel,.overlay,#tool_docprops_cancel,#tool_prefs_cancel', fn: cancelOverlays, evt: 'click', key: ['esc', false, false], hidekey: true},
        					{sel: '#tool_source_save', fn: saveSourceEditor, evt: 'click'},
        					{sel: '#tool_docprops_save', fn: saveDocProperties, evt: 'click'},
        					{sel: '#tool_docprops', fn: showDocProperties, evt: 'mouseup'},
        					{sel: '#tool_prefs_save', fn: savePreferences, evt: 'click'},
        					{sel: '#tool_prefs_option', fn: function() {showPreferences(); return false;}, evt: 'mouseup'},
        					{sel: '#tool_delete,#tool_delete_multi', fn: deleteSelected, evt: 'click', key: ['del/backspace', true]},
        					{sel: '#tool_reorient', fn: reorientPath, evt: 'click'},
        					{sel: '#tool_node_link', fn: linkControlPoints, evt: 'click'},
        					{sel: '#tool_node_clone', fn: clonePathNode, evt: 'click'},
        					{sel: '#tool_node_delete', fn: deletePathNode, evt: 'click'},
        					{sel: '#tool_openclose_path', fn: opencloseSubPath, evt: 'click'},
        					{sel: '#tool_add_subpath', fn: addSubPath, evt: 'click'},
        					{sel: '#tool_move_top', fn: moveToTopSelected, evt: 'click', key: 'ctrl+shift+]'},
        					{sel: '#tool_move_bottom', fn: moveToBottomSelected, evt: 'click', key: 'ctrl+shift+['},
        					{sel: '#tool_topath', fn: convertToPath, evt: 'click'},
        					{sel: '#tool_make_link,#tool_make_link_multi', fn: makeHyperlink, evt: 'click'},
        					{sel: '#tool_undo', fn: clickUndo, evt: 'click', key: ['Z', true]},
        					{sel: '#tool_redo', fn: clickRedo, evt: 'click', key: ['Y', true]},
        					{sel: '#tool_clone,#tool_clone_multi', fn: clickClone, evt: 'click', key: ['D', true]},
        					{sel: '#tool_group_elements', fn: clickGroup, evt: 'click', key: ['G', true]},
        					{sel: '#tool_ungroup', fn: clickGroup, evt: 'click'},
        					{sel: '#tool_unlink_use', fn: clickGroup, evt: 'click'},
        					{sel: '[id^=tool_align]', fn: clickAlign, evt: 'click'},
        					// these two lines are required to make Opera work properly with the flyout mechanism
        		//			{sel: '#tools_rect_show', fn: clickRect, evt: 'click'},
        		//			{sel: '#tools_ellipse_show', fn: clickEllipse, evt: 'click'},
        					{sel: '#tool_bold', fn: clickBold, evt: 'mousedown'},
        					{sel: '#tool_italic', fn: clickItalic, evt: 'mousedown'},
        					{sel: '#sidepanel_handle', fn: toggleSidePanel, key: ['X']},
        					{sel: '#copy_save_done', fn: cancelOverlays, evt: 'click'},
        
        					// Shortcuts not associated with buttons
        
        					{key: 'ctrl+left', fn: function(){rotateSelected(0,1);}},
        					{key: 'ctrl+right', fn: function(){rotateSelected(1,1);}},
        					{key: 'ctrl+shift+left', fn: function(){rotateSelected(0,5);}},
        					{key: 'ctrl+shift+right', fn: function(){rotateSelected(1,5);}},
        					{key: 'shift+O', fn: selectPrev},
        					{key: 'shift+P', fn: selectNext},
        					{key: [modKey+'up', true], fn: function(){zoomImage(2);}},
        					{key: [modKey+'down', true], fn: function(){zoomImage(0.5);}},
        					{key: [modKey+']', true], fn: function(){moveUpDownSelected('Up');}},
        					{key: [modKey+'[', true], fn: function(){moveUpDownSelected('Down');}},
        					{key: ['up', true], fn: function(){moveSelected(0,-1);}},
        					{key: ['down', true], fn: function(){moveSelected(0,1);}},
        					{key: ['left', true], fn: function(){moveSelected(-1,0);}},
        					{key: ['right', true], fn: function(){moveSelected(1,0);}},
        					{key: 'shift+up', fn: function(){moveSelected(0,-10);}},
        					{key: 'shift+down', fn: function(){moveSelected(0,10);}},
        					{key: 'shift+left', fn: function(){moveSelected(-10,0);}},
        					{key: 'shift+right', fn: function(){moveSelected(10,0);}},
        					{key: ['alt+up', true], fn: function(){svgCanvas.cloneSelectedElements(0,-1);}},
        					{key: ['alt+down', true], fn: function(){svgCanvas.cloneSelectedElements(0,1);}},
        					{key: ['alt+left', true], fn: function(){svgCanvas.cloneSelectedElements(-1,0);}},
        					{key: ['alt+right', true], fn: function(){svgCanvas.cloneSelectedElements(1,0);}},
        					{key: ['alt+shift+up', true], fn: function(){svgCanvas.cloneSelectedElements(0,-10);}},
        					{key: ['alt+shift+down', true], fn: function(){svgCanvas.cloneSelectedElements(0,10);}},
        					{key: ['alt+shift+left', true], fn: function(){svgCanvas.cloneSelectedElements(-10,0);}},
        					{key: ['alt+shift+right', true], fn: function(){svgCanvas.cloneSelectedElements(10,0);}},
        					{key: 'A', fn: function(){svgCanvas.selectAllInCurrentLayer();}},
        
        					// Standard shortcuts
        					{key: modKey+'z', fn: clickUndo},
        					{key: modKey + 'shift+z', fn: clickRedo},
        					{key: modKey + 'y', fn: clickRedo},
        
        					{key: modKey+'x', fn: cutSelected},
        					{key: modKey+'c', fn: copySelected},
        					{key: modKey+'v', fn: pasteInCenter}
        				];
        
        				// Tooltips not directly associated with a single function
        				var key_assocs = {
        					'4/Shift+4': '#tools_rect_show',
        					'5/Shift+5': '#tools_ellipse_show'
        				};
        
        				return {
        					setAll: function() {
        						var flyouts = {};
        
        						$.each(tool_buttons, function(i, opts) {
        							// Bind function to button
        							var btn;
        							if (opts.sel) {
        								btn = $(opts.sel);
        								if (btn.length == 0) {return true;} // Skip if markup does not exist
        								if (opts.evt) {
        									if (svgedit.browser.isTouch() && opts.evt === 'click') {
        										opts.evt = 'mousedown';
        									}
        									btn[opts.evt](opts.fn);
        								}
        
        								// Add to parent flyout menu, if able to be displayed
        								if (opts.parent && $(opts.parent + '_show').length != 0) {
        									var f_h = $(opts.parent);
        									if (!f_h.length) {
        										f_h = makeFlyoutHolder(opts.parent.substr(1));
        									}
        
        									f_h.append(btn);
        
        									if (!$.isArray(flyouts[opts.parent])) {
        										flyouts[opts.parent] = [];
        									}
        									flyouts[opts.parent].push(opts);
        								}
        							}
        
        							// Bind function to shortcut key
        							if (opts.key) {
        								// Set shortcut based on options
        								var keyval, disInInp = true, fn = opts.fn, pd = false;
        								if ($.isArray(opts.key)) {
        									keyval = opts.key[0];
        									if (opts.key.length > 1) {pd = opts.key[1];}
        									if (opts.key.length > 2) {disInInp = opts.key[2];}
        								} else {
        									keyval = opts.key;
        								}
        								keyval += '';
        
        								$.each(keyval.split('/'), function(i, key) {
        									$(document).bind('keydown', key, function(e) {
        										fn();
        										if (pd) {
        											e.preventDefault();
        										}
        										// Prevent default on ALL keys?
        										return false;
        									});
        								});
        
        								// Put shortcut in title
        								if (opts.sel && !opts.hidekey && btn.attr('title')) {
        									var newTitle = btn.attr('title').split('[')[0] + ' (' + keyval + ')';
        									key_assocs[keyval] = opts.sel;
        									// Disregard for menu items
        									if (!btn.parents('#main_menu').length) {
        										btn.attr('title', newTitle);
        									}
        								}
        							}
        						});
        
        						// Setup flyouts
        						setupFlyouts(flyouts);
        
        						// Misc additional actions
        
        						// Make 'return' keypress trigger the change event
        						$('.attr_changer, #image_url').bind('keydown', 'return',
        							function(evt) {$(this).change();evt.preventDefault();}
        						);
        
        						$(window).bind('keydown', 'tab', function(e) {
        							if (ui_context === 'canvas') {
        								e.preventDefault();
        								selectNext();
        							}
        						}).bind('keydown', 'shift+tab', function(e) {
        							if (ui_context === 'canvas') {
        								e.preventDefault();
        								selectPrev();
        							}
        						});
        
        						$('#tool_zoom').dblclick(dblclickZoom);
        					},
        					setTitles: function() {
        						$.each(key_assocs, function(keyval, sel) {
        							var menu = ($(sel).parents('#main_menu').length);
        
        							$(sel).each(function() {
        								var t;
        								if (menu) {
        									t = $(this).text().split(' [')[0];
        								} else {
        									t = this.title.split(' [')[0];
        								}
        								var key_str = '';
        								// Shift+Up
        								$.each(keyval.split('/'), function(i, key) {
        									var mod_bits = key.split('+'), mod = '';
        									if (mod_bits.length > 1) {
        										mod = mod_bits[0] + '+';
        										key = mod_bits[1];
        									}
        									key_str += (i?'/':'') + mod + (uiStrings['key_'+key] || key);
        								});
        								if (menu) {
        									this.lastChild.textContent = t +' ['+key_str+']';
        								} else {
        									this.title = t +' ['+key_str+']';
        								}
        							});
        						});
        					},
        					getButtonData: function(sel) {
        						var b;
        						$.each(tool_buttons, function(i, btn) {
        							if (btn.sel === sel) {b = btn;}
        						});
        						return b;
        					}
        				};
        			}());
        
        			Actions.setAll();
        
        			// Select given tool
        			editor.ready(function() {
        				var tool,
        					itool = curConfig.initTool,
        					container = $('#tools_left, #svg_editor .tools_flyout'),
        					pre_tool = container.find('#tool_' + itool),
        					reg_tool = container.find('#' + itool);
        				if (pre_tool.length) {
        					tool = pre_tool;
        				} else if (reg_tool.length) {
        					tool = reg_tool;
        				} else {
        					tool = $('#tool_select');
        				}
        				tool.click().mouseup();
        
        				if (curConfig.wireframe) {
        					$('#tool_wireframe').click();
        				}
        
        				if (curConfig.showlayers) {
        					toggleSidePanel();
        				}
        
        				$('#rulers').toggle(!!curConfig.showRulers);
        
        				if (curConfig.showRulers) {
        					$('#show_rulers')[0].checked = true;
        				}
        
        				if (curConfig.baseUnit) {
        					$('#base_unit').val(curConfig.baseUnit);
        				}
        
        				if (curConfig.gridSnapping) {
        					$('#grid_snapping_on')[0].checked = true;
        				}
        
        				if (curConfig.snappingStep) {
        					$('#grid_snapping_step').val(curConfig.snappingStep);
        				}
        
        				if (curConfig.gridColor) {
        					$('#grid_color').val(curConfig.gridColor);
        				}
        			});
        
        			// init SpinButtons
        			$('#rect_rx').SpinButton({ min: 0, max: 1000, callback: changeRectRadius });
        			$('#stroke_width').SpinButton({ min: 0, max: 99, smallStep: 0.1, callback: changeStrokeWidth });
        			$('#angle').SpinButton({ min: -180, max: 180, step: 5, callback: changeRotationAngle });
        			$('#font_size').SpinButton({ min: 0.001, stepfunc: stepFontSize, callback: changeFontSize });
        			$('#group_opacity').SpinButton({ min: 0, max: 100, step: 5, callback: changeOpacity });
        			$('#blur').SpinButton({ min: 0, max: 10, step: 0.1, callback: changeBlur });
        			$('#zoom').SpinButton({ min: 0.001, max: 10000, step: 50, stepfunc: stepZoom, callback: changeZoom })
        				// Set default zoom
        				.val(svgCanvas.getZoom() * 100);
        
        			$('#workarea').contextMenu({
        					menu: 'cmenu_canvas',
        					inSpeed: 0
        				},
        				function(action, el, pos) {
        					switch (action) {
        						case 'delete':
        							deleteSelected();
        							break;
        						case 'cut':
        							cutSelected();
        							break;
        						case 'copy':
        							copySelected();
        							break;
        						case 'paste':
        							svgCanvas.pasteElements();
        							break;
        						case 'paste_in_place':
        							svgCanvas.pasteElements('in_place');
        							break;
        						case 'group':
        						case 'group_elements':
        							svgCanvas.groupSelectedElements();
        							break;
        						case 'ungroup':
        							svgCanvas.ungroupSelectedElement();
        							break;
        						case 'move_front':
        							moveToTopSelected();
        							break;
        						case 'move_up':
        							moveUpDownSelected('Up');
        							break;
        						case 'move_down':
        							moveUpDownSelected('Down');
        							break;
        						case 'move_back':
        							moveToBottomSelected();
        							break;
        						default:
        							if (svgedit.contextmenu && svgedit.contextmenu.hasCustomHandler(action)) {
        								svgedit.contextmenu.getCustomHandler(action).call();
        							}
        							break;
        					}
        					if (svgCanvas.clipBoard.length) {
        						canv_menu.enableContextMenuItems('#paste,#paste_in_place');
        					}
        				}
        			);
        
        			var lmenu_func = function(action, el, pos) {
        				switch ( action ) {
        					case 'dupe':
        						cloneLayer();
        						break;
        					case 'delete':
        						deleteLayer();
        						break;
        					case 'merge_down':
        						mergeLayer();
        						break;
        					case 'merge_all':
        						svgCanvas.mergeAllLayers();
        						updateContextPanel();
        						populateLayers();
        						break;
        				}
        			};
        
        			$('#layerlist').contextMenu({
        					menu: 'cmenu_layers',
        					inSpeed: 0
        				},
        				lmenu_func
        			);
        
        			$('#layer_moreopts').contextMenu({
        					menu: 'cmenu_layers',
        					inSpeed: 0,
        					allowLeft: true
        				},
        				lmenu_func
        			);
        
        			$('.contextMenu li').mousedown(function(ev) {
        				ev.preventDefault();
        			});
        
        			$('#cmenu_canvas li').disableContextMenu();
        			canv_menu.enableContextMenuItems('#delete,#cut,#copy');
        
        			window.addEventListener('beforeunload', function(e) {
        				// Suppress warning if page is empty
        				if (undoMgr.getUndoStackSize() === 0) {
        					editor.showSaveWarning = false;
        				}
        
        				// showSaveWarning is set to 'false' when the page is saved.
        				if (!curConfig.no_save_warning && editor.showSaveWarning) {
        					// Browser already asks question about closing the page
        					e.returnValue = uiStrings.notification.unsavedChanges; // Firefox needs this when beforeunload set by addEventListener (even though message is not used)
        					return uiStrings.notification.unsavedChanges;
        				}
        			}, false);
        
        			editor.openPrep = function(func) {
        				$('#main_menu').hide();
        				if (undoMgr.getUndoStackSize() === 0) {
        					func(true);
        				} else {
        					$.confirm(uiStrings.notification.QwantToOpen, func);
        				}
        			};
        
        			function onDragEnter(e) {
        				e.stopPropagation();
        				e.preventDefault();
        				// and indicator should be displayed here, such as "drop files here"
        			}
        
        			function onDragOver(e) {
        				e.stopPropagation();
        				e.preventDefault();
        			}
        
        			function onDragLeave(e) {
        				e.stopPropagation();
        				e.preventDefault();
        				// hypothetical indicator should be removed here
        			}
        			// Use HTML5 File API: http://www.w3.org/TR/FileAPI/
        			// if browser has HTML5 File API support, then we will show the open menu item
        			// and provide a file input to click. When that change event fires, it will
        			// get the text contents of the file and send it to the canvas
        			if (window.FileReader) {
        				var importImage = function(e) {
        					$.process_cancel(uiStrings.notification.loadingImage);
        					e.stopPropagation();
        					e.preventDefault();
        					$('#workarea').removeAttr('style');
        					$('#main_menu').hide();
        					var file = (e.type == 'drop') ? e.dataTransfer.files[0] : this.files[0];
        					if (!file) {
        						$('#dialog_box').hide();
        						return;
        					}
        					/* if (file.type === 'application/pdf') { // Todo: Handle PDF imports
        						
        					}
        					else */
        					if (file.type.indexOf('image') != -1) {
        						// Detected an image
        						// svg handling
        						var reader;
        						if (file.type.indexOf('svg') != -1) {
        							reader = new FileReader();
        							reader.onloadend = function(e) {
        								svgCanvas.importSvgString(e.target.result, true);
        								svgCanvas.ungroupSelectedElement();
        								svgCanvas.ungroupSelectedElement();
        								svgCanvas.groupSelectedElements();
        								svgCanvas.alignSelectedElements('m', 'page');
        								svgCanvas.alignSelectedElements('c', 'page');
        								$('#dialog_box').hide();
        							};
        							reader.readAsText(file);
        						}
        						else {
        						//bitmap handling
        							reader = new FileReader();
        							reader.onloadend = function(e) {
        								// let's insert the new image until we know its dimensions
        								var insertNewImage = function(width, height) {
        									var newImage = svgCanvas.addSvgElementFromJson({
        										element: 'image',
        										attr: {
        											x: 0,
        											y: 0,
        											width: width,
        											height: height,
        											id: svgCanvas.getNextId(),
        											style: 'pointer-events:inherit'
        										}
        									});
        									svgCanvas.setHref(newImage, e.target.result);
        									svgCanvas.selectOnly([newImage]);
        									svgCanvas.alignSelectedElements('m', 'page');
        									svgCanvas.alignSelectedElements('c', 'page');
        									updateContextPanel();
        									$('#dialog_box').hide();
        								};
        								// create dummy img so we know the default dimensions
        								var imgWidth = 100;
        								var imgHeight = 100;
        								var img = new Image();
        								img.src = e.target.result;
        								img.style.opacity = 0;
        								img.onload = function() {
        									imgWidth = img.offsetWidth;
        									imgHeight = img.offsetHeight;
        									insertNewImage(imgWidth, imgHeight);
        								};
        							};
        							reader.readAsDataURL(file);
        						}
        					}
        				};
        
        				workarea[0].addEventListener('dragenter', onDragEnter, false);
        				workarea[0].addEventListener('dragover', onDragOver, false);
        				workarea[0].addEventListener('dragleave', onDragLeave, false);
        				workarea[0].addEventListener('drop', importImage, false);
        
        				var open = $('<input type="file">').change(function() {
        					var f = this;
        					editor.openPrep(function(ok) {
        						if (!ok) {return;}
        						svgCanvas.clear();
        						if (f.files.length === 1) {
        							$.process_cancel(uiStrings.notification.loadingImage);
        							var reader = new FileReader();
        							reader.onloadend = function(e) {
        								loadSvgString(e.target.result);
        								updateCanvas();
        							};
        							reader.readAsText(f.files[0]);
        						}
        					});
        				});
        				$('#tool_open').show().prepend(open);
        
        				var imgImport = $('<input type="file">').change(importImage);
        				$('#tool_import').show().prepend(imgImport);
        			}
        
        //			$(function() {
        				updateCanvas(true);
        //			});
        
        			//	var revnums = "svg-editor.js ($Rev$) ";
        			//	revnums += svgCanvas.getVersion();
        			//	$('#copyright')[0].setAttribute('title', revnums);
        
        			// For Compatibility with older extensions
        			$(function() {
        				window.svgCanvas = svgCanvas;
        				svgCanvas.ready = editor.ready;
        			});
        
        			editor.setLang = function(lang, allStrings) {
        				editor.langChanged = true;
        				$.pref('lang', lang);
        				$('#lang_select').val(lang);
        				if (!allStrings) {
        					return;
        				}
        				// var notif = allStrings.notification; // Currently unused
        				// $.extend will only replace the given strings
        				var oldLayerName = $('#layerlist tr.layersel td.layername').text();
        				var rename_layer = (oldLayerName == uiStrings.common.layer + ' 1');
        
        				$.extend(uiStrings, allStrings);
        				svgCanvas.setUiStrings(allStrings);
        				Actions.setTitles();
        
        				if (rename_layer) {
        					svgCanvas.renameCurrentLayer(uiStrings.common.layer + ' 1');
        					populateLayers();
        				}
        
        				// In case extensions loaded before the locale, now we execute a callback on them
        				if (extsPreLang.length) {
        					while (extsPreLang.length) {
        						var ext = extsPreLang.shift();
        						ext.langReady({lang: lang, uiStrings: uiStrings});
        					}
        				}
        				else {
        					svgCanvas.runExtensions('langReady', {lang: lang, uiStrings: uiStrings});
        				}
        				svgCanvas.runExtensions('langChanged', lang);
        
        				// Update flyout tooltips
        				setFlyoutTitles();
        
        				// Copy title for certain tool elements
        				var elems = {
        					'#stroke_color': '#tool_stroke .icon_label, #tool_stroke .color_block',
        					'#fill_color': '#tool_fill label, #tool_fill .color_block',
        					'#linejoin_miter': '#cur_linejoin',
        					'#linecap_butt': '#cur_linecap'
        				};
        
        				$.each(elems, function(source, dest) {
        					$(dest).attr('title', $(source)[0].title);
        				});
        
        				// Copy alignment titles
        				$('#multiselected_panel div[id^=tool_align]').each(function() {
        					$('#tool_pos' + this.id.substr(10))[0].title = this.title;
        				});
        			};
        		};
        
        		editor.ready = function (cb) {
        			if (!isReady) {
        				callbacks.push(cb);
        			} else {
        				cb();
        			}
        		};
        
        		editor.runCallbacks = function () {
        			$.each(callbacks, function() {
        				this();
        			});
        			isReady = true;
        		};
        
        		editor.loadFromString = function (str) {
        			editor.ready(function() {
        				loadSvgString(str);
        			});
        		};
        
        		editor.disableUI = function (featList) {
        //			$(function() {
        //				$('#tool_wireframe, #tool_image, #main_button, #tool_source, #sidepanels').remove();
        //				$('#tools_top').css('left', 5);
        //			});
        		};
        
        		editor.loadFromURL = function (url, opts) {
        			if (!opts) {opts = {};}
        
        			var cache = opts.cache;
        			var cb = opts.callback;
        
        			editor.ready(function() {
        				$.ajax({
        					'url': url,
        					'dataType': 'text',
        					cache: !!cache,
        					beforeSend:function(){
        						$.process_cancel(uiStrings.notification.loadingImage);
        					},
        					success: function(str) {
        						loadSvgString(str, cb);
        					},
        					error: function(xhr, stat, err) {
        						if (xhr.status != 404 && xhr.responseText) {
        							loadSvgString(xhr.responseText, cb);
        						} else {
        							$.alert(uiStrings.notification.URLloadFail + ': \n' + err, cb);
        						}
        					},
        					complete:function(){
        						$('#dialog_box').hide();
        					}
        				});
        			});
        		};
        
        		editor.loadFromDataURI = function(str) {
        			editor.ready(function() {
        				var base64 = false;
        				var pre = str.match(/^data:image\/svg\+xml;base64,/);
        				if (pre) {
        					base64 = true;
        				}
        				else {
        					pre = str.match(/^data:image\/svg\+xml(?:;(?:utf8)?)?,/);
        				}
        				if (pre) {
        					pre = pre[0];
        				}
        				var src = str.slice(pre.length);
        				loadSvgString(base64 ? Utils.decode64(src) : decodeURIComponent(src));
        			});
        		};
        
        		editor.addExtension = function () {
        			var args = arguments;
        
        			// Note that we don't want this on editor.ready since some extensions
        			// may want to run before then (like server_opensave).
        			$(function() {
        				if (svgCanvas) {svgCanvas.addExtension.apply(this, args);}
        			});
        		};
        
        		return editor;
        	}(jQuery));
        
        	// Run init once DOM is loaded
        	$(svgEditor.init);
        
        }());
        
      • svg-editor.manifest
        CACHE MANIFEST
        svg-editor.html
        images/logo.png
        jgraduate/css/jPicker.css
        jgraduate/css/jgraduate.css
        svg-editor.css
        spinbtn/JQuerySpinBtn.css
        jquery.js
        config.js
        custom.css
        js-hotkeys/jquery.hotkeys.min.js
        jquery-ui/jquery-ui-1.8.17.custom.min.js
        jgraduate/jpicker.min.js
        jgraduate/jquery.jgraduate.min.js
        spinbtn/JQuerySpinBtn.js
        svgcanvas.js
        svg-editor.js
        images/align-bottom.png
        images/align-center.png
        images/align-left.png
        images/align-middle.png
        images/align-right.png
        images/align-top.png
        images/bold.png
        images/cancel.png
        images/circle.png
        images/clear.png
        images/clone.png
        images/copy.png
        images/cut.png
        images/delete.png
        images/document-properties.png
        images/dropdown.gif
        images/ellipse.png
        images/eye.png
        images/flyouth.png
        images/flyup.gif
        images/freehand-circle.png
        images/freehand-square.png
        images/go-down.png
        images/go-up.png
        images/image.png
        images/italic.png
        images/line.png
        images/logo.png
        images/logo.svg
        images/move_bottom.png
        images/move_top.png
        images/none.png
        images/open.png
        images/paste.png
        images/path.png
        images/polygon.png
        images/rect.png
        images/redo.png
        images/save.png
        images/select.png
        images/sep.png
        images/shape_group_elements.png
        images/shape_ungroup.png
        images/source.png
        images/square.png
        images/text.png
        images/undo.png
        images/view-refresh.png
        images/wave.png
        images/zoom.png
        locale/locale.js
        locale/lang.af.js
        locale/lang.ar.js
        locale/lang.az.js
        locale/lang.be.js
        locale/lang.bg.js
        locale/lang.ca.js
        locale/lang.cs.js
        locale/lang.cy.js
        locale/lang.da.js
        locale/lang.de.js
        locale/lang.el.js
        locale/lang.en.js
        locale/lang.es.js
        locale/lang.et.js
        locale/lang.fa.js
        locale/lang.fi.js
        locale/lang.fr.js
        locale/lang.ga.js
        locale/lang.gl.js
        locale/lang.hi.js
        locale/lang.hr.js
        locale/lang.hu.js
        locale/lang.hy.js
        locale/lang.id.js
        locale/lang.is.js
        locale/lang.it.js
        locale/lang.iw.js
        locale/lang.ja.js
        locale/lang.ko.js
        locale/lang.lt.js
        locale/lang.lv.js
        locale/lang.mk.js
        locale/lang.ms.js
        locale/lang.mt.js
        locale/lang.nl.js
        locale/lang.no.js
        locale/lang.pl.js
        locale/lang.pt-PT.js
        locale/lang.ro.js
        locale/lang.ru.js
        locale/lang.sk.js
        locale/lang.sl.js
        locale/lang.sq.js
        locale/lang.sr.js
        locale/lang.sv.js
        locale/lang.sw.js
        locale/lang.th.js
        locale/lang.tl.js
        locale/lang.tr.js
        locale/lang.uk.js
        locale/lang.vi.js
        locale/lang.yi.js
        locale/lang.zh-CN.js
        locale/lang.zh-TW.js
        locale/lang.zh.js
        
        # Dynamic loads
        canvg/canvg.js
        canvg/rgbcolor.js
        jspdf/underscore-min.js
        jspdf/jspdf.js
        jspdf/jspdf.plugin.svgToPdf.js
        
        # Extensions (todo: add other dependency files)
        extensions/ext-arrows.js
        extensions/ext-closepath.js
        extensions/ext-connector.js
        extensions/ext-eyedropper.js
        extensions/ext-foreignobject.js
        extensions/ext-grid.js
        extensions/ext-helloworld.js
        extensions/ext-imagelib.js
        extensions/ext-markers.js
        extensions/ext-mathjax.js
        extensions/ext-overview_window.js
        extensions/ext-panning.js
        extensions/ext-php_savefile.js
        extensions/ext-polygon.js
        extensions/ext-server_moinsave.js
        extensions/ext-server_opensave.js
        extensions/ext-shapes.js
        extensions/ext-star.js
        extensions/ext-storage.js
        extensions/ext-webappfind.js
        extensions/ext-xdomain-messaging.js
        
        
      • svgcanvas.js
        /*globals $, svgedit, svgCanvas, jsPDF*/
        /*jslint vars: true, eqeq: true, todo: true, bitwise: true, continue: true, forin: true */
        /*
         * svgcanvas.js
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Pavol Rusnak
         * Copyright(c) 2010 Jeff Schiller
         *
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) browser.js
        // 3) svgtransformlist.js
        // 4) math.js
        // 5) units.js
        // 6) svgutils.js
        // 7) sanitize.js
        // 8) history.js
        // 9) select.js
        // 10) draw.js
        // 11) path.js
        // 12) coords.js
        // 13) recalculate.js
        
        (function () {
        
        if (!window.console) {
        	window.console = {};
        	window.console.log = function(str) {};
        	window.console.dir = function(str) {};
        }
        
        if (window.opera) {
        	window.console.log = function(str) { opera.postError(str); };
        	window.console.dir = function(str) {};
        }
        
        }());
        
        // Class: SvgCanvas
        // The main SvgCanvas class that manages all SVG-related functions
        //
        // Parameters:
        // container - The container HTML element that should hold the SVG root element
        // config - An object that contains configuration data
        $.SvgCanvas = function(container, config) {
        // Alias Namespace constants
        var NS = svgedit.NS;
        
        // Default configuration options
        var curConfig = {
        	show_outside_canvas: true,
        	selectNew: true,
        	dimensions: [640, 480]
        };
        
        // Update config with new one if given
        if (config) {
        	$.extend(curConfig, config);
        }
        
        // Array with width/height of canvas
        var dimensions = curConfig.dimensions;
        
        var canvas = this;
        
        // "document" element associated with the container (same as window.document using default svg-editor.js)
        // NOTE: This is not actually a SVG document, but a HTML document.
        var svgdoc = container.ownerDocument;
        
        // This is a container for the document being edited, not the document itself.
        var svgroot = svgdoc.importNode(svgedit.utilities.text2xml(
        		'<svg id="svgroot" xmlns="' + NS.SVG + '" xlinkns="' + NS.XLINK + '" ' +
        			'width="' + dimensions[0] + '" height="' + dimensions[1] + '" x="' + dimensions[0] + '" y="' + dimensions[1] + '" overflow="visible">' +
        			'<defs>' +
        				'<filter id="canvashadow" filterUnits="objectBoundingBox">' +
        					'<feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>'+
        					'<feOffset in="blur" dx="5" dy="5" result="offsetBlur"/>'+
        					'<feMerge>'+
        						'<feMergeNode in="offsetBlur"/>'+
        						'<feMergeNode in="SourceGraphic"/>'+
        					'</feMerge>'+
        				'</filter>'+
        			'</defs>'+
        		'</svg>').documentElement, true);
        container.appendChild(svgroot);
        
        // The actual element that represents the final output SVG element
        var svgcontent = svgdoc.createElementNS(NS.SVG, 'svg');
        
        // This function resets the svgcontent element while keeping it in the DOM.
        var clearSvgContentElement = canvas.clearSvgContentElement = function() {
        	while (svgcontent.firstChild) { svgcontent.removeChild(svgcontent.firstChild); }
        
        	// TODO: Clear out all other attributes first?
        	$(svgcontent).attr({
        		id: 'svgcontent',
        		width: dimensions[0],
        		height: dimensions[1],
        		x: dimensions[0],
        		y: dimensions[1],
        		overflow: curConfig.show_outside_canvas ? 'visible' : 'hidden',
        		xmlns: NS.SVG,
        		'xmlns:se': NS.SE,
        		'xmlns:xlink': NS.XLINK
        	}).appendTo(svgroot);
        
        	// TODO: make this string optional and set by the client
        	var comment = svgdoc.createComment(" Created with SVG-edit - http://svg-edit.googlecode.com/ ");
        	svgcontent.appendChild(comment);
        };
        clearSvgContentElement();
        
        // Prefix string for element IDs
        var idprefix = 'svg_';
        
        // Function: setIdPrefix
        // Changes the ID prefix to the given value
        //
        // Parameters: 
        // p - String with the new prefix 
        canvas.setIdPrefix = function(p) {
        	idprefix = p;
        };
        
        // Current svgedit.draw.Drawing object
        // @type {svgedit.draw.Drawing}
        canvas.current_drawing_ = new svgedit.draw.Drawing(svgcontent, idprefix);
        
        // Function: getCurrentDrawing
        // Returns the current Drawing.
        // @return {svgedit.draw.Drawing}
        var getCurrentDrawing = canvas.getCurrentDrawing = function() {
        	return canvas.current_drawing_;
        };
        
        // Float displaying the current zoom level (1 = 100%, .5 = 50%, etc)
        var current_zoom = 1;
        
        // pointer to current group (for in-group editing)
        var current_group = null;
        
        // Object containing data for the currently selected styles
        var all_properties = {
        	shape: {
        		fill: (curConfig.initFill.color == 'none' ? '' : '#') + curConfig.initFill.color,
        		fill_paint: null,
        		fill_opacity: curConfig.initFill.opacity,
        		stroke: '#' + curConfig.initStroke.color,
        		stroke_paint: null,
        		stroke_opacity: curConfig.initStroke.opacity,
        		stroke_width: curConfig.initStroke.width,
        		stroke_dasharray: 'none',
        		stroke_linejoin: 'miter',
        		stroke_linecap: 'butt',
        		opacity: curConfig.initOpacity
        	}
        };
        
        all_properties.text = $.extend(true, {}, all_properties.shape);
        $.extend(all_properties.text, {
        	fill: '#000000',
        	stroke_width: 0,
        	font_size: 24,
        	font_family: 'serif'
        });
        
        // Current shape style properties
        var cur_shape = all_properties.shape;
        
        // Array with all the currently selected elements
        // default size of 1 until it needs to grow bigger
        var selectedElements = new Array(1);
        
        // Function: addSvgElementFromJson
        // Create a new SVG element based on the given object keys/values and add it to the current layer
        // The element will be ran through cleanupElement before being returned 
        //
        // Parameters:
        // data - Object with the following keys/values:
        // * element - tag name of the SVG element to create
        // * attr - Object with attributes key-values to assign to the new element
        // * curStyles - Boolean indicating that current style attributes should be applied first
        //
        // Returns: The new element
        var addSvgElementFromJson = this.addSvgElementFromJson = function(data) {
        	var shape = svgedit.utilities.getElem(data.attr.id);
        	// if shape is a path but we need to create a rect/ellipse, then remove the path
        	var current_layer = getCurrentDrawing().getCurrentLayer();
        	if (shape && data.element != shape.tagName) {
        		current_layer.removeChild(shape);
        		shape = null;
        	}
        	if (!shape) {
        		shape = svgdoc.createElementNS(NS.SVG, data.element);
        		if (current_layer) {
        			(current_group || current_layer).appendChild(shape);
        		}
        	}
        	if (data.curStyles) {
        		svgedit.utilities.assignAttributes(shape, {
        			'fill': cur_shape.fill,
        			'stroke': cur_shape.stroke,
        			'stroke-width': cur_shape.stroke_width,
        			'stroke-dasharray': cur_shape.stroke_dasharray,
        			'stroke-linejoin': cur_shape.stroke_linejoin,
        			'stroke-linecap': cur_shape.stroke_linecap,
        			'stroke-opacity': cur_shape.stroke_opacity,
        			'fill-opacity': cur_shape.fill_opacity,
        			'opacity': cur_shape.opacity / 2,
        			'style': 'pointer-events:inherit'
        		}, 100);
        	}
        	svgedit.utilities.assignAttributes(shape, data.attr, 100);
        	svgedit.utilities.cleanupElement(shape);
        	return shape;
        };
        
        // import svgtransformlist.js
        var getTransformList = canvas.getTransformList = svgedit.transformlist.getTransformList;
        
        // import from math.js.
        var transformPoint = svgedit.math.transformPoint;
        var matrixMultiply = canvas.matrixMultiply = svgedit.math.matrixMultiply;
        var hasMatrixTransform = canvas.hasMatrixTransform = svgedit.math.hasMatrixTransform;
        var transformListToTransform = canvas.transformListToTransform = svgedit.math.transformListToTransform;
        var snapToAngle = svgedit.math.snapToAngle;
        var getMatrix = svgedit.math.getMatrix;
        
        // initialize from units.js
        // send in an object implementing the ElementContainer interface (see units.js)
        svgedit.units.init({
        	getBaseUnit: function() { return curConfig.baseUnit; },
        	getElement: svgedit.utilities.getElem,
        	getHeight: function() { return svgcontent.getAttribute('height')/current_zoom; },
        	getWidth: function() { return svgcontent.getAttribute('width')/current_zoom; },
        	getRoundDigits: function() { return save_options.round_digits; }
        });
        // import from units.js
        var convertToNum = canvas.convertToNum = svgedit.units.convertToNum;
        
        // import from svgutils.js
        svgedit.utilities.init({
        	getDOMDocument: function() { return svgdoc; },
        	getDOMContainer: function() { return container; },
        	getSVGRoot: function() { return svgroot; },
        	// TODO: replace this mostly with a way to get the current drawing.
        	getSelectedElements: function() { return selectedElements; },
        	getSVGContent: function() { return svgcontent; },
        	getBaseUnit: function() { return curConfig.baseUnit; },
        	getSnappingStep: function() { return curConfig.snappingStep; }
        });
        var findDefs = canvas.findDefs = svgedit.utilities.findDefs;
        var getUrlFromAttr = canvas.getUrlFromAttr = svgedit.utilities.getUrlFromAttr;
        var getHref = canvas.getHref = svgedit.utilities.getHref;
        var setHref = canvas.setHref = svgedit.utilities.setHref;
        var getPathBBox = svgedit.utilities.getPathBBox;
        var getBBox = canvas.getBBox = svgedit.utilities.getBBox;
        var getRotationAngle = canvas.getRotationAngle = svgedit.utilities.getRotationAngle;
        var getElem = canvas.getElem = svgedit.utilities.getElem;
        var getRefElem = canvas.getRefElem = svgedit.utilities.getRefElem;
        var assignAttributes = canvas.assignAttributes = svgedit.utilities.assignAttributes;
        var cleanupElement = this.cleanupElement = svgedit.utilities.cleanupElement;
        
        // import from coords.js
        svgedit.coords.init({
        	getDrawing: function() { return getCurrentDrawing(); },
        	getGridSnapping: function() { return curConfig.gridSnapping; }
        });
        var remapElement = this.remapElement = svgedit.coords.remapElement;
        
        // import from recalculate.js
        svgedit.recalculate.init({
        	getSVGRoot: function() { return svgroot; },
        	getStartTransform: function() { return startTransform; },
        	setStartTransform: function(transform) { startTransform = transform; }
        });
        var recalculateDimensions = this.recalculateDimensions = svgedit.recalculate.recalculateDimensions;
        
        // import from sanitize.js
        var nsMap = svgedit.getReverseNS();
        var sanitizeSvg = canvas.sanitizeSvg = svgedit.sanitize.sanitizeSvg;
        
        // import from history.js
        var MoveElementCommand = svgedit.history.MoveElementCommand;
        var InsertElementCommand = svgedit.history.InsertElementCommand;
        var RemoveElementCommand = svgedit.history.RemoveElementCommand;
        var ChangeElementCommand = svgedit.history.ChangeElementCommand;
        var BatchCommand = svgedit.history.BatchCommand;
        var call;
        // Implement the svgedit.history.HistoryEventHandler interface.
        canvas.undoMgr = new svgedit.history.UndoManager({
        	handleHistoryEvent: function(eventType, cmd) {
        		var EventTypes = svgedit.history.HistoryEventTypes;
        		// TODO: handle setBlurOffsets.
        		if (eventType == EventTypes.BEFORE_UNAPPLY || eventType == EventTypes.BEFORE_APPLY) {
        			canvas.clearSelection();
        		} else if (eventType == EventTypes.AFTER_APPLY || eventType == EventTypes.AFTER_UNAPPLY) {
        			var elems = cmd.elements();
        			canvas.pathActions.clear();
        			call('changed', elems);
        			var cmdType = cmd.type();
        			var isApply = (eventType == EventTypes.AFTER_APPLY);
        			if (cmdType == MoveElementCommand.type()) {
        				var parent = isApply ? cmd.newParent : cmd.oldParent;
        				if (parent == svgcontent) {
        					canvas.identifyLayers();
        				}
        			} else if (cmdType == InsertElementCommand.type() ||
        					cmdType == RemoveElementCommand.type()) {
        				if (cmd.parent == svgcontent) {
        					canvas.identifyLayers();
        				}
        				if (cmdType == InsertElementCommand.type()) {
        					if (isApply) {restoreRefElems(cmd.elem);}
        				} else {
        					if (!isApply) {restoreRefElems(cmd.elem);}
        				}
        				if (cmd.elem.tagName === 'use') {
        					setUseData(cmd.elem);
        				}
        			} else if (cmdType == ChangeElementCommand.type()) {
        				// if we are changing layer names, re-identify all layers
        				if (cmd.elem.tagName == 'title' && cmd.elem.parentNode.parentNode == svgcontent) {
        					canvas.identifyLayers();
        				}
        				var values = isApply ? cmd.newValues : cmd.oldValues;
        				// If stdDeviation was changed, update the blur.
        				if (values.stdDeviation) {
        					canvas.setBlurOffsets(cmd.elem.parentNode, values.stdDeviation);
        				}
        				// This is resolved in later versions of webkit, perhaps we should
        				// have a featured detection for correct 'use' behavior?
        				// ——————————
        				// Remove & Re-add hack for Webkit (issue 775) 
        				//if (cmd.elem.tagName === 'use' && svgedit.browser.isWebkit()) {
        				//	var elem = cmd.elem;
        				//	if (!elem.getAttribute('x') && !elem.getAttribute('y')) {
        				//		var parent = elem.parentNode;
        				//		var sib = elem.nextSibling;
        				//		parent.removeChild(elem);
        				//		parent.insertBefore(elem, sib);
        				//	}
        				//}
        			}
        		}
        	}
        });
        var addCommandToHistory = function(cmd) {
        	canvas.undoMgr.addCommandToHistory(cmd);
        };
        
        // import from select.js
        svgedit.select.init(curConfig, {
        	createSVGElement: function(jsonMap) { return canvas.addSvgElementFromJson(jsonMap); },
        	svgRoot: function() { return svgroot; },
        	svgContent: function() { return svgcontent; },
        	currentZoom: function() { return current_zoom; },
        	// TODO(codedread): Remove when getStrokedBBox() has been put into svgutils.js.
        	getStrokedBBox: function(elems) { return canvas.getStrokedBBox([elems]); }
        });
        // this object manages selectors for us
        var selectorManager = this.selectorManager = svgedit.select.getSelectorManager();
        
        // Import from path.js
        svgedit.path.init({
        	getCurrentZoom: function() { return current_zoom; },
        	getSVGRoot: function() { return svgroot; }
        });
        
        // Interface strings, usually for title elements
        var uiStrings = {
        	exportNoBlur: "Blurred elements will appear as un-blurred",
        	exportNoforeignObject: "foreignObject elements will not appear",
        	exportNoDashArray: "Strokes will appear filled",
        	exportNoText: "Text may not appear as expected"
        };
        
        var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use';
        var ref_attrs = ['clip-path', 'fill', 'filter', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'stroke'];
        
        var elData = $.data;
        
        // Animation element to change the opacity of any newly created element
        var opac_ani = document.createElementNS(NS.SVG, 'animate');
        $(opac_ani).attr({
        	attributeName: 'opacity',
        	begin: 'indefinite',
        	dur: 1,
        	fill: 'freeze'
        }).appendTo(svgroot);
        
        var restoreRefElems = function(elem) {
        	// Look for missing reference elements, restore any found
        	var o, i, l,
        		attrs = $(elem).attr(ref_attrs);
        	for (o in attrs) {
        		var val = attrs[o];
        		if (val && val.indexOf('url(') === 0) {
        			var id = svgedit.utilities.getUrlFromAttr(val).substr(1);
        			var ref = getElem(id);
        			if (!ref) {
        				svgedit.utilities.findDefs().appendChild(removedElements[id]);
        				delete removedElements[id];
        			}
        		}
        	}
        	
        	var childs = elem.getElementsByTagName('*');
        	
        	if (childs.length) {
        		for (i = 0, l = childs.length; i < l; i++) {
        			restoreRefElems(childs[i]);
        		}
        	}
        };
        
        (function() {
        	// TODO For Issue 208: this is a start on a thumbnail
        	//	var svgthumb = svgdoc.createElementNS(NS.SVG, 'use');
        	//	svgthumb.setAttribute('width', '100');
        	//	svgthumb.setAttribute('height', '100');
        	//	svgedit.utilities.setHref(svgthumb, '#svgcontent');
        	//	svgroot.appendChild(svgthumb);
        
        }());
        
        // Object to contain image data for raster images that were found encodable
        var encodableImages = {},
        	
        	// String with image URL of last loadable image
        	last_good_img_url = curConfig.imgPath + 'logo.png',
        	
        	// Array with current disabled elements (for in-group editing)
        	disabled_elems = [],
        	
        	// Object with save options
        	save_options = {round_digits: 5},
        	
        	// Boolean indicating whether or not a draw action has been started
        	started = false,
        	
        	// String with an element's initial transform attribute value
        	startTransform = null,
        	
        	// String indicating the current editor mode
        	current_mode = 'select',
        	
        	// String with the current direction in which an element is being resized
        	current_resize_mode = 'none',
        	
        	// Object with IDs for imported files, to see if one was already added
        	import_ids = {},
        
        	// Current text style properties
        	cur_text = all_properties.text,
        	
        	// Current general properties
        	cur_properties = cur_shape,
        	
        	// Array with selected elements' Bounding box object
        //	selectedBBoxes = new Array(1),
        	
        	// The DOM element that was just selected
        	justSelected = null,
        	
        	// DOM element for selection rectangle drawn by the user
        	rubberBox = null,
        	
        	// Array of current BBoxes (still needed?)
        	curBBoxes = [],
        	
        	// Object to contain all included extensions
        	extensions = {},
        	
        	// Canvas point for the most recent right click
        	lastClickPoint = null,
        	
        	// Map of deleted reference elements
        	removedElements = {};
        
        // Clipboard for cut, copy&pasted elements
        canvas.clipBoard = [];
        
        // Should this return an array by default, so extension results aren't overwritten?
        var runExtensions = this.runExtensions = function(action, vars, returnArray) {
        	var result = returnArray ? [] : false;
        	$.each(extensions, function(name, opts) {
        		if (opts && action in opts) {
        			if (returnArray) {
        				result.push(opts[action](vars));
        			} else {
        				result = opts[action](vars);
        			}
        		}
        	});
        	return result;
        };
        
        // Function: addExtension
        // Add an extension to the editor
        // 
        // Parameters:
        // name - String with the ID of the extension
        // ext_func - Function supplied by the extension with its data
        this.addExtension = function(name, ext_func) {
        	var ext;
        	if (!(name in extensions)) {
        		// Provide private vars/funcs here. Is there a better way to do this?
        		if ($.isFunction(ext_func)) {
        			ext = ext_func($.extend(canvas.getPrivateMethods(), {
        				svgroot: svgroot,
        				svgcontent: svgcontent,
        				nonce: getCurrentDrawing().getNonce(),
        				selectorManager: selectorManager
        			}));
        		} else {
        			ext = ext_func;
        		}
        		extensions[name] = ext;
        		call('extension_added', ext);
        	} else {
        		console.log('Cannot add extension "' + name + '", an extension by that name already exists.');
        	}
        };
        	
        // This method rounds the incoming value to the nearest value based on the current_zoom
        var round = this.round = function(val) {
        	return parseInt(val*current_zoom, 10)/current_zoom;
        };
        
        // This method sends back an array or a NodeList full of elements that
        // intersect the multi-select rubber-band-box on the current_layer only.
        // 
        // Since the only browser that supports the SVG DOM getIntersectionList is Opera, 
        // we need to provide an implementation here. We brute-force it for now.
        // 
        // Reference:
        // Firefox does not implement getIntersectionList(), see https://bugzilla.mozilla.org/show_bug.cgi?id=501421
        // Webkit does not implement getIntersectionList(), see https://bugs.webkit.org/show_bug.cgi?id=11274
        var getIntersectionList = this.getIntersectionList = function(rect) {
        	if (rubberBox == null) { return null; }
        
        	var parent = current_group || getCurrentDrawing().getCurrentLayer();
        	
        	if (!curBBoxes.length) {
        		// Cache all bboxes
        		curBBoxes = getVisibleElementsAndBBoxes(parent);
        	}
        	
        	var resultList = null;
        	try {
        		resultList = parent.getIntersectionList(rect, null);
        	} catch(e) { }
        
        	if (resultList == null || typeof(resultList.item) != 'function') {
        		resultList = [];
        		var rubberBBox;
        		if (!rect) {
        			rubberBBox = rubberBox.getBBox();
        			var o,
        				bb = {};
        			
        			for (o in rubberBBox) {
        				bb[o] = rubberBBox[o] / current_zoom;
        			}
        			rubberBBox = bb;
        			
        		} else {
        			rubberBBox = rect;
        		}
        		var i = curBBoxes.length;
        		while (i--) {
        			if (!rubberBBox.width) {continue;}
        			if (svgedit.math.rectsIntersect(rubberBBox, curBBoxes[i].bbox)) {
        				resultList.push(curBBoxes[i].elem);
        			}
        		}
        	}
        	// addToSelection expects an array, but it's ok to pass a NodeList 
        	// because using square-bracket notation is allowed: 
        	// http://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html
        	return resultList;
        };
        
        // TODO(codedread): Migrate this into svgutils.js
        // Function: getStrokedBBox
        // Get the bounding box for one or more stroked and/or transformed elements
        // 
        // Parameters:
        // elems - Array with DOM elements to check
        // 
        // Returns:
        // A single bounding box object
        getStrokedBBox = this.getStrokedBBox = function(elems) {
        	if (!elems) {elems = getVisibleElements();}
        	if (!elems.length) {return false;}
        	// Make sure the expected BBox is returned if the element is a group
        	var getCheckedBBox = function(elem) {
        
        		try {
        			// TODO: Fix issue with rotated groups. Currently they work
        			// fine in FF, but not in other browsers (same problem mentioned
        			// in Issue 339 comment #2).
        
        			var bb = svgedit.utilities.getBBox(elem);
        			var angle = svgedit.utilities.getRotationAngle(elem);
        
        			if ((angle && angle % 90) ||
        				svgedit.math.hasMatrixTransform(svgedit.transformlist.getTransformList(elem))) {
        				// Accurate way to get BBox of rotated element in Firefox:
        				// Put element in group and get its BBox
        				var good_bb = false;
        				// Get the BBox from the raw path for these elements
        				var elemNames = ['ellipse', 'path', 'line', 'polyline', 'polygon'];
        				if (elemNames.indexOf(elem.tagName) >= 0) {
        					bb = good_bb = canvas.convertToPath(elem, true);
        				} else if (elem.tagName == 'rect') {
        					// Look for radius
        					var rx = elem.getAttribute('rx');
        					var ry = elem.getAttribute('ry');
        					if (rx || ry) {
        						bb = good_bb = canvas.convertToPath(elem, true);
        					}
        				}
        
        				if (!good_bb) {
        					// Must use clone else FF freaks out
        					var clone = elem.cloneNode(true);
        					var g = document.createElementNS(NS.SVG, 'g');
        					var parent = elem.parentNode;
        					parent.appendChild(g);
        					g.appendChild(clone);
        					bb = svgedit.utilities.bboxToObj(g.getBBox());
        					parent.removeChild(g);
        				}
        
        				// Old method: Works by giving the rotated BBox,
        				// this is (unfortunately) what Opera and Safari do
        				// natively when getting the BBox of the parent group
        //						var angle = angle * Math.PI / 180.0;
        //						var rminx = Number.MAX_VALUE, rminy = Number.MAX_VALUE, 
        //							rmaxx = Number.MIN_VALUE, rmaxy = Number.MIN_VALUE;
        //						var cx = round(bb.x + bb.width/2),
        //							cy = round(bb.y + bb.height/2);
        //						var pts = [ [bb.x - cx, bb.y - cy], 
        //									[bb.x + bb.width - cx, bb.y - cy],
        //									[bb.x + bb.width - cx, bb.y + bb.height - cy],
        //									[bb.x - cx, bb.y + bb.height - cy] ];
        //						var j = 4;
        //						while (j--) {
        //							var x = pts[j][0],
        //								y = pts[j][1],
        //								r = Math.sqrt( x*x + y*y );
        //							var theta = Math.atan2(y,x) + angle;
        //							x = round(r * Math.cos(theta) + cx);
        //							y = round(r * Math.sin(theta) + cy);
        //		
        //							// now set the bbox for the shape after it's been rotated
        //							if (x < rminx) rminx = x;
        //							if (y < rminy) rminy = y;
        //							if (x > rmaxx) rmaxx = x;
        //							if (y > rmaxy) rmaxy = y;
        //						}
        //						
        //						bb.x = rminx;
        //						bb.y = rminy;
        //						bb.width = rmaxx - rminx;
        //						bb.height = rmaxy - rminy;
        			}
        			return bb;
        		} catch(e) {
        			console.log(elem, e);
        			return null;
        		}
        	};
        
        	var full_bb;
        	$.each(elems, function() {
        		if (full_bb) {return;}
        		if (!this.parentNode) {return;}
        		full_bb = getCheckedBBox(this);
        	});
        
        	// This shouldn't ever happen...
        	if (full_bb == null) {return null;}
        
        	// full_bb doesn't include the stoke, so this does no good!
        //		if (elems.length == 1) return full_bb;
        
        	var max_x = full_bb.x + full_bb.width;
        	var max_y = full_bb.y + full_bb.height;
        	var min_x = full_bb.x;
        	var min_y = full_bb.y;
        
        	// FIXME: same re-creation problem with this function as getCheckedBBox() above
        	var getOffset = function(elem) {
        		var sw = elem.getAttribute('stroke-width');
        		var offset = 0;
        		if (elem.getAttribute('stroke') != 'none' && !isNaN(sw)) {
        			offset += sw/2;
        		}
        		return offset;
        	};
        	var bboxes = [];
        	$.each(elems, function(i, elem) {
        		var cur_bb = getCheckedBBox(elem);
        		if (cur_bb) {
        			var offset = getOffset(elem);
        			min_x = Math.min(min_x, cur_bb.x - offset);
        			min_y = Math.min(min_y, cur_bb.y - offset);
        			bboxes.push(cur_bb);
        		}
        	});
        	
        	full_bb.x = min_x;
        	full_bb.y = min_y;
        	
        	$.each(elems, function(i, elem) {
        		var cur_bb = bboxes[i];
        		// ensure that elem is really an element node
        		if (cur_bb && elem.nodeType == 1) {
        			var offset = getOffset(elem);
        			max_x = Math.max(max_x, cur_bb.x + cur_bb.width + offset);
        			max_y = Math.max(max_y, cur_bb.y + cur_bb.height + offset);
        		}
        	});
        	
        	full_bb.width = max_x - min_x;
        	full_bb.height = max_y - min_y;
        	return full_bb;
        };
        
        // Function: getVisibleElements
        // Get all elements that have a BBox (excludes <defs>, <title>, etc).
        // Note that 0-opacity, off-screen etc elements are still considered "visible"
        // for this function
        //
        // Parameters:
        // parent - The parent DOM element to search within
        //
        // Returns:
        // An array with all "visible" elements.
        var getVisibleElements = this.getVisibleElements = function(parent) {
        	if (!parent) {
        		parent = $(svgcontent).children(); // Prevent layers from being included
        	}
        	
        	var contentElems = [];
        	$(parent).children().each(function(i, elem) {
        		try {
        			if (elem.getBBox()) {
        				contentElems.push(elem);
        			}
        		} catch(e) {}
        	});
        	return contentElems.reverse();
        };
        
        // Function: getVisibleElementsAndBBoxes
        // Get all elements that have a BBox (excludes <defs>, <title>, etc).
        // Note that 0-opacity, off-screen etc elements are still considered "visible"
        // for this function
        //
        // Parameters:
        // parent - The parent DOM element to search within
        //
        // Returns:
        // An array with objects that include:
        // * elem - The element
        // * bbox - The element's BBox as retrieved from getStrokedBBox
        var getVisibleElementsAndBBoxes = this.getVisibleElementsAndBBoxes = function(parent) {
        	if (!parent) {
        		parent = $(svgcontent).children(); // Prevent layers from being included
        	}
        	var contentElems = [];
        	$(parent).children().each(function(i, elem) {
        		try {
        			if (elem.getBBox()) {
        				contentElems.push({'elem':elem, 'bbox':getStrokedBBox([elem])});
        			}
        		} catch(e) {}
        	});
        	return contentElems.reverse();
        };
        
        // Function: groupSvgElem
        // Wrap an SVG element into a group element, mark the group as 'gsvg'
        //
        // Parameters:
        // elem - SVG element to wrap
        var groupSvgElem = this.groupSvgElem = function(elem) {
        	var g = document.createElementNS(NS.SVG, 'g');
        	elem.parentNode.replaceChild(g, elem);
        	$(g).append(elem).data('gsvg', elem)[0].id = getNextId();
        };
        
        // Function: copyElem
        // Create a clone of an element, updating its ID and its children's IDs when needed
        //
        // Parameters:
        // el - DOM element to clone
        //
        // Returns: The cloned element
        var copyElem = function(el) {
        	// manually create a copy of the element
        	var new_el = document.createElementNS(el.namespaceURI, el.nodeName);
        	$.each(el.attributes, function(i, attr) {
        		if (attr.localName != '-moz-math-font-style') {
        			new_el.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value);
        		}
        	});
        	// set the copied element's new id
        	new_el.removeAttribute('id');
        	new_el.id = getNextId();
        	
        	// Opera's "d" value needs to be reset for Opera/Win/non-EN
        	// Also needed for webkit (else does not keep curved segments on clone)
        	if (svgedit.browser.isWebkit() && el.nodeName == 'path') {
        		var fixed_d = pathActions.convertPath(el);
        		new_el.setAttribute('d', fixed_d);
        	}
        
        	// now create copies of all children
        	$.each(el.childNodes, function(i, child) {
        		switch(child.nodeType) {
        			case 1: // element node
        				new_el.appendChild(copyElem(child));
        				break;
        			case 3: // text node
        				new_el.textContent = child.nodeValue;
        				break;
        			default:
        				break;
        		}
        	});
        	
        	if ($(el).data('gsvg')) {
        		$(new_el).data('gsvg', new_el.firstChild);
        	} else if ($(el).data('symbol')) {
        		var ref = $(el).data('symbol');
        		$(new_el).data('ref', ref).data('symbol', ref);
        	} else if (new_el.tagName == 'image') {
        		preventClickDefault(new_el);
        	}
        	return new_el;
        };
        
        // Set scope for these functions
        var getId, getNextId;
        var textActions, pathActions;
        
        (function(c) {
        
        	// Object to contain editor event names and callback functions
        	var events = {};
        
        	getId = c.getId = function() { return getCurrentDrawing().getId(); };
        	getNextId = c.getNextId = function() { return getCurrentDrawing().getNextId(); };
        
        	// Function: call
        	// Run the callback function associated with the given event
        	//
        	// Parameters:
        	// event - String with the event name
        	// arg - Argument to pass through to the callback function
        	call = c.call = function(event, arg) {
        		if (events[event]) {
        			return events[event](this, arg);
        		}
        	};
        
        	// Function: bind
        	// Attaches a callback function to an event
        	//
        	// Parameters:
        	// event - String indicating the name of the event
        	// f - The callback function to bind to the event
        	//
        	// Return:
        	// The previous event
        	c.bind = function(event, f) {
        		var old = events[event];
        		events[event] = f;
        		return old;
        	};
        
        }(canvas));
        
        // Function: canvas.prepareSvg
        // Runs the SVG Document through the sanitizer and then updates its paths.
        //
        // Parameters:
        // newDoc - The SVG DOM document
        this.prepareSvg = function(newDoc) {
        	this.sanitizeSvg(newDoc.documentElement);
        
        	// convert paths into absolute commands
        	var i, path, len,
        		paths = newDoc.getElementsByTagNameNS(NS.SVG, 'path');
        	for (i = 0, len = paths.length; i < len; ++i) {
        		path = paths[i];
        		path.setAttribute('d', pathActions.convertPath(path));
        		pathActions.fixEnd(path);
        	}
        };
        
        // Function: ffClone
        // Hack for Firefox bugs where text element features aren't updated or get 
        // messed up. See issue 136 and issue 137.
        // This function clones the element and re-selects it 
        // TODO: Test for this bug on load and add it to "support" object instead of 
        // browser sniffing
        //
        // Parameters: 
        // elem - The (text) DOM element to clone
        var ffClone = function(elem) {
        	if (!svgedit.browser.isGecko()) {return elem;}
        	var clone = elem.cloneNode(true);
        	elem.parentNode.insertBefore(clone, elem);
        	elem.parentNode.removeChild(elem);
        	selectorManager.releaseSelector(elem);
        	selectedElements[0] = clone;
        	selectorManager.requestSelector(clone).showGrips(true);
        	return clone;
        };
        
        
        // this.each is deprecated, if any extension used this it can be recreated by doing this:
        // $(canvas.getRootElem()).children().each(...)
        
        // this.each = function(cb) {
        //	$(svgroot).children().each(cb);
        // };
        
        
        // Function: setRotationAngle
        // Removes any old rotations if present, prepends a new rotation at the
        // transformed center
        //
        // Parameters:
        // val - The new rotation angle in degrees
        // preventUndo - Boolean indicating whether the action should be undoable or not
        this.setRotationAngle = function(val, preventUndo) {
        	// ensure val is the proper type
        	val = parseFloat(val);
        	var elem = selectedElements[0];
        	var oldTransform = elem.getAttribute('transform');
        	var bbox = svgedit.utilities.getBBox(elem);
        	var cx = bbox.x+bbox.width/2, cy = bbox.y+bbox.height/2;
        	var tlist = svgedit.transformlist.getTransformList(elem);
        	
        	// only remove the real rotational transform if present (i.e. at index=0)
        	if (tlist.numberOfItems > 0) {
        		var xform = tlist.getItem(0);
        		if (xform.type == 4) {
        			tlist.removeItem(0);
        		}
        	}
        	// find R_nc and insert it
        	if (val != 0) {
        		var center = svgedit.math.transformPoint(cx, cy, svgedit.math.transformListToTransform(tlist).matrix);
        		var R_nc = svgroot.createSVGTransform();
        		R_nc.setRotate(val, center.x, center.y);
        		if (tlist.numberOfItems) {
        			tlist.insertItemBefore(R_nc, 0);
        		} else {
        			tlist.appendItem(R_nc);
        		}
        	} else if (tlist.numberOfItems == 0) {
        		elem.removeAttribute('transform');
        	}
        	
        	if (!preventUndo) {
        		// we need to undo it, then redo it so it can be undo-able! :)
        		// TODO: figure out how to make changes to transform list undo-able cross-browser?
        		var newTransform = elem.getAttribute('transform');
        		elem.setAttribute('transform', oldTransform);
        		changeSelectedAttribute('transform', newTransform, selectedElements);
        		call('changed', selectedElements);
        	}
        	var pointGripContainer = svgedit.utilities.getElem('pathpointgrip_container');
        //		if (elem.nodeName == 'path' && pointGripContainer) {
        //			pathActions.setPointContainerTransform(elem.getAttribute('transform'));
        //		}
        	var selector = selectorManager.requestSelector(selectedElements[0]);
        	selector.resize();
        	selector.updateGripCursors(val);
        };
        
        // Function: recalculateAllSelectedDimensions
        // Runs recalculateDimensions on the selected elements, 
        // adding the changes to a single batch command
        var recalculateAllSelectedDimensions = this.recalculateAllSelectedDimensions = function() {
        	var text = (current_resize_mode == 'none' ? 'position' : 'size');
        	var batchCmd = new svgedit.history.BatchCommand(text);
        
        	var i = selectedElements.length;
        	while (i--) {
        		var elem = selectedElements[i];
        //			if (svgedit.utilities.getRotationAngle(elem) && !svgedit.math.hasMatrixTransform(getTransformList(elem))) {continue;}
        		var cmd = svgedit.recalculate.recalculateDimensions(elem);
        		if (cmd) {
        			batchCmd.addSubCommand(cmd);
        		}
        	}
        
        	if (!batchCmd.isEmpty()) {
        		addCommandToHistory(batchCmd);
        		call('changed', selectedElements);
        	}
        };
        
        // this is how we map paths to our preferred relative segment types
        var pathMap = [0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a', 
        					'H', 'h', 'V', 'v', 'S', 's', 'T', 't'];
        					
        // Debug tool to easily see the current matrix in the browser's console
        var logMatrix = function(m) {
        	console.log([m.a, m.b, m.c, m.d, m.e, m.f]);
        };
        
        // Root Current Transformation Matrix in user units
        var root_sctm = null;
        
        // Group: Selection
        
        // Function: clearSelection
        // Clears the selection. The 'selected' handler is then called.
        // Parameters: 
        // noCall - Optional boolean that when true does not call the "selected" handler
        var clearSelection = this.clearSelection = function(noCall) {
        	if (selectedElements[0] != null) {
        		var i, elem,
        			len = selectedElements.length;
        		for (i = 0; i < len; ++i) {
        			elem = selectedElements[i];
        			if (elem == null) {break;}
        			selectorManager.releaseSelector(elem);
        			selectedElements[i] = null;
        		}
        //		selectedBBoxes[0] = null;
        	}
        	if (!noCall) {call('selected', selectedElements);}
        };
        
        // TODO: do we need to worry about selectedBBoxes here?
        
        
        // Function: addToSelection
        // Adds a list of elements to the selection. The 'selected' handler is then called.
        //
        // Parameters:
        // elemsToAdd - an array of DOM elements to add to the selection
        // showGrips - a boolean flag indicating whether the resize grips should be shown
        var addToSelection = this.addToSelection = function(elemsToAdd, showGrips) {
        	if (elemsToAdd.length == 0) { return; }
        	// find the first null in our selectedElements array
        	var j = 0;
        	
        	while (j < selectedElements.length) {
        		if (selectedElements[j] == null) { 
        			break;
        		}
        		++j;
        	}
        
        	// now add each element consecutively
        	var i = elemsToAdd.length;
        	while (i--) {
        		var elem = elemsToAdd[i];
        		if (!elem || !svgedit.utilities.getBBox(elem)) {continue;}
        
        		if (elem.tagName === 'a' && elem.childNodes.length === 1) {
        			// Make "a" element's child be the selected element 
        			elem = elem.firstChild;
        		}
        
        		// if it's not already there, add it
        		if (selectedElements.indexOf(elem) == -1) {
        
        			selectedElements[j] = elem;
        
        			// only the first selectedBBoxes element is ever used in the codebase these days
        //			if (j == 0) selectedBBoxes[0] = svgedit.utilities.getBBox(elem);
        			j++;
        			var sel = selectorManager.requestSelector(elem);
        	
        			if (selectedElements.length > 1) {
        				sel.showGrips(false);
        			}
        		}
        	}
        	call('selected', selectedElements);
        	
        	if (showGrips || selectedElements.length == 1) {
        		selectorManager.requestSelector(selectedElements[0]).showGrips(true);
        	}
        	else {
        		selectorManager.requestSelector(selectedElements[0]).showGrips(false);
        	}
        
        	// make sure the elements are in the correct order
        	// See: http://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition
        
        	selectedElements.sort(function(a, b) {
        		if (a && b && a.compareDocumentPosition) {
        			return 3 - (b.compareDocumentPosition(a) & 6);	
        		}
        		if (a == null) {
        			return 1;
        		}
        	});
        	
        	// Make sure first elements are not null
        	while (selectedElements[0] == null) {
        		selectedElements.shift(0);
        	}
        };
        
        // Function: selectOnly()
        // Selects only the given elements, shortcut for clearSelection(); addToSelection()
        //
        // Parameters:
        // elems - an array of DOM elements to be selected
        var selectOnly = this.selectOnly = function(elems, showGrips) {
        	clearSelection(true);
        	addToSelection(elems, showGrips);
        };
        
        // TODO: could use slice here to make this faster?
        // TODO: should the 'selected' handler
        
        // Function: removeFromSelection
        // Removes elements from the selection.
        //
        // Parameters:
        // elemsToRemove - an array of elements to remove from selection
        var removeFromSelection = this.removeFromSelection = function(elemsToRemove) {
        	if (selectedElements[0] == null) { return; }
        	if (elemsToRemove.length == 0) { return; }
        
        	// find every element and remove it from our array copy
        	var i,
        		j = 0,
        		newSelectedItems = [],
        		len = selectedElements.length;
        	newSelectedItems.length = len;
        	for (i = 0; i < len; ++i) {
        		var elem = selectedElements[i];
        		if (elem) {
        			// keep the item
        			if (elemsToRemove.indexOf(elem) == -1) {
        				newSelectedItems[j] = elem;
        				j++;
        			} else { // remove the item and its selector
        				selectorManager.releaseSelector(elem);
        			}
        		}
        	}
        	// the copy becomes the master now
        	selectedElements = newSelectedItems;
        };
        
        // Function: selectAllInCurrentLayer
        // Clears the selection, then adds all elements in the current layer to the selection.
        this.selectAllInCurrentLayer = function() {
        	var current_layer = getCurrentDrawing().getCurrentLayer();
        	if (current_layer) {
        		current_mode = 'select';
        		selectOnly($(current_group || current_layer).children());
        	}
        };
        
        // Function: getMouseTarget
        // Gets the desired element from a mouse event
        // 
        // Parameters:
        // evt - Event object from the mouse event
        // 
        // Returns:
        // DOM element we want
        var getMouseTarget = this.getMouseTarget = function(evt) {
        	if (evt == null) {
        		return null;
        	}
        	var mouse_target = evt.target;
        	
        	// if it was a <use>, Opera and WebKit return the SVGElementInstance
        	if (mouse_target.correspondingUseElement) {mouse_target = mouse_target.correspondingUseElement;}
        	
        	// for foreign content, go up until we find the foreignObject
        	// WebKit browsers set the mouse target to the svgcanvas div 
        	if ([NS.MATH, NS.HTML].indexOf(mouse_target.namespaceURI) >= 0 && 
        		mouse_target.id != 'svgcanvas') 
        	{
        		while (mouse_target.nodeName != 'foreignObject') {
        			mouse_target = mouse_target.parentNode;
        			if (!mouse_target) {return svgroot;}
        		}
        	}
        	
        	// Get the desired mouse_target with jQuery selector-fu
        	// If it's root-like, select the root
        	var current_layer = getCurrentDrawing().getCurrentLayer();
        	if ([svgroot, container, svgcontent, current_layer].indexOf(mouse_target) >= 0) {
        		return svgroot;
        	}
        	
        	var $target = $(mouse_target);
        
        	// If it's a selection grip, return the grip parent
        	if ($target.closest('#selectorParentGroup').length) {
        		// While we could instead have just returned mouse_target, 
        		// this makes it easier to indentify as being a selector grip
        		return selectorManager.selectorParentGroup;
        	}
        
        	while (mouse_target.parentNode !== (current_group || current_layer)) {
        		mouse_target = mouse_target.parentNode;
        	}
        	
        //	
        //	// go up until we hit a child of a layer
        //	while (mouse_target.parentNode.parentNode.tagName == 'g') {
        //		mouse_target = mouse_target.parentNode;
        //	}
        	// Webkit bubbles the mouse event all the way up to the div, so we
        	// set the mouse_target to the svgroot like the other browsers
        //	if (mouse_target.nodeName.toLowerCase() == 'div') {
        //		mouse_target = svgroot;
        //	}
        	
        	return mouse_target;
        };
        
        // Mouse events
        (function() {
        	var d_attr = null,
        		start_x = null,
        		start_y = null,
        		r_start_x = null,
        		r_start_y = null,
        		init_bbox = {},
        		freehand = {
        			minx: null,
        			miny: null,
        			maxx: null,
        			maxy: null
        		},
        		sumDistance = 0,
        		controllPoint2 = {x:0, y:0},
        		controllPoint1 = {x:0, y:0},
        		start = {x:0, y:0},
        		end = {x:0, y:0},
        		parameter,
        		nextParameter,
        		bSpline = {x:0, y:0},
        		nextPos = {x:0, y:0},
        		THRESHOLD_DIST = 0.8,
        		STEP_COUNT = 10;
        
        	var getBsplinePoint = function(t) {
        		var spline = {x:0, y:0},
        			p0 = controllPoint2,
        			p1 = controllPoint1,
        			p2 = start,
        			p3 = end,
        			S = 1.0 / 6.0,
        			t2 = t * t,
        			t3 = t2 * t;
        
        		var m = [
        				[-1, 3, -3, 1],
        				[3, -6, 3, 0],
        				[-3, 0, 3, 0],
        				[1, 4, 1, 0]
        			];
        
        		spline.x = S * (
        			(p0.x * m[0][0] + p1.x * m[0][1] + p2.x * m[0][2] + p3.x * m[0][3] ) * t3 +
        				(p0.x * m[1][0] + p1.x * m[1][1] + p2.x * m[1][2] + p3.x * m[1][3] ) * t2 +
        				(p0.x * m[2][0] + p1.x * m[2][1] + p2.x * m[2][2] + p3.x * m[2][3] ) * t +
        				(p0.x * m[3][0] + p1.x * m[3][1] + p2.x * m[3][2] + p3.x * m[3][3] )
        		);
        		spline.y = S * (
        			(p0.y * m[0][0] + p1.y * m[0][1] + p2.y * m[0][2] + p3.y * m[0][3] ) * t3 +
        				(p0.y * m[1][0] + p1.y * m[1][1] + p2.y * m[1][2] + p3.y * m[1][3] ) * t2 +
        				(p0.y * m[2][0] + p1.y * m[2][1] + p2.y * m[2][2] + p3.y * m[2][3] ) * t +
        				(p0.y * m[3][0] + p1.y * m[3][1] + p2.y * m[3][2] + p3.y * m[3][3] )
        		);
        
        		return {
        			x:spline.x,
        			y:spline.y
        		};
        	};
        	// - when we are in a create mode, the element is added to the canvas
        	// but the action is not recorded until mousing up
        	// - when we are in select mode, select the element, remember the position
        	// and do nothing else
        	var mouseDown = function(evt) {
        		if (canvas.spaceKey || evt.button === 1) {return;}
        
        		var right_click = evt.button === 2;
        	
        		if (evt.altKey) { // duplicate when dragging
        			svgCanvas.cloneSelectedElements(0, 0);
        		}
        	
        		root_sctm = $('#svgcontent g')[0].getScreenCTM().inverse();
        		
        		var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ),
        			mouse_x = pt.x * current_zoom,
        			mouse_y = pt.y * current_zoom;
        			
        		evt.preventDefault();
        
        		if (right_click) {
        			current_mode = 'select';
        			lastClickPoint = pt;
        		}
        		
        		// This would seem to be unnecessary...
        //		if (['select', 'resize'].indexOf(current_mode) == -1) {
        //			setGradient();
        //		}
        		
        		var x = mouse_x / current_zoom,
        			y = mouse_y / current_zoom,
        			mouse_target = getMouseTarget(evt);
        		
        		if (mouse_target.tagName === 'a' && mouse_target.childNodes.length === 1) {
        			mouse_target = mouse_target.firstChild;
        		}
        		
        		// real_x/y ignores grid-snap value
        		var real_x = x;
        		r_start_x = start_x = x;
        		var real_y = y;
        		r_start_y = start_y = y;
        
        		if (curConfig.gridSnapping){
        			x = svgedit.utilities.snapToGrid(x);
        			y = svgedit.utilities.snapToGrid(y);
        			start_x = svgedit.utilities.snapToGrid(start_x);
        			start_y = svgedit.utilities.snapToGrid(start_y);
        		}
        
        		// if it is a selector grip, then it must be a single element selected, 
        		// set the mouse_target to that and update the mode to rotate/resize
        		
        		if (mouse_target == selectorManager.selectorParentGroup && selectedElements[0] != null) {
        			var grip = evt.target;
        			var griptype = elData(grip, 'type');
        			// rotating
        			if (griptype == 'rotate') {
        				current_mode = 'rotate';
        			}
        			// resizing
        			else if (griptype == 'resize') {
        				current_mode = 'resize';
        				current_resize_mode = elData(grip, 'dir');
        			}
        			mouse_target = selectedElements[0];
        		}
        		
        		startTransform = mouse_target.getAttribute('transform');
        		var i, stroke_w,
        			tlist = svgedit.transformlist.getTransformList(mouse_target);
        		switch (current_mode) {
        			case 'select':
        				started = true;
        				current_resize_mode = 'none';
        				if (right_click) {started = false;}
        				
        				if (mouse_target != svgroot) {
        					// if this element is not yet selected, clear selection and select it
        					if (selectedElements.indexOf(mouse_target) == -1) {
        						// only clear selection if shift is not pressed (otherwise, add 
        						// element to selection)
        						if (!evt.shiftKey) {
        							// No need to do the call here as it will be done on addToSelection
        							clearSelection(true);
        						}
        						addToSelection([mouse_target]);
        						justSelected = mouse_target;
        						pathActions.clear();
        					}
        					// else if it's a path, go into pathedit mode in mouseup
        					
        					if (!right_click) {
        						// insert a dummy transform so if the element(s) are moved it will have
        						// a transform to use for its translate
        						for (i = 0; i < selectedElements.length; ++i) {
        							if (selectedElements[i] == null) {continue;}
        							var slist = svgedit.transformlist.getTransformList(selectedElements[i]);
        							if (slist.numberOfItems) {
        								slist.insertItemBefore(svgroot.createSVGTransform(), 0);
        							} else {
        								slist.appendItem(svgroot.createSVGTransform());
        							}
        						}
        					}
        				} else if (!right_click){
        					clearSelection();
        					current_mode = 'multiselect';
        					if (rubberBox == null) {
        						rubberBox = selectorManager.getRubberBandBox();
        					}
        					r_start_x *= current_zoom;
        					r_start_y *= current_zoom;
        //					console.log('p',[evt.pageX, evt.pageY]);					
        //					console.log('c',[evt.clientX, evt.clientY]);	
        //					console.log('o',[evt.offsetX, evt.offsetY]);	
        //					console.log('s',[start_x, start_y]);
        					
        					svgedit.utilities.assignAttributes(rubberBox, {
        						'x': r_start_x,
        						'y': r_start_y,
        						'width': 0,
        						'height': 0,
        						'display': 'inline'
        					}, 100);
        				}
        				break;
        			case 'zoom': 
        				started = true;
        				if (rubberBox == null) {
        					rubberBox = selectorManager.getRubberBandBox();
        				}
        				svgedit.utilities.assignAttributes(rubberBox, {
        						'x': real_x * current_zoom,
        						'y': real_x * current_zoom,
        						'width': 0,
        						'height': 0,
        						'display': 'inline'
        				}, 100);
        				break;
        			case 'resize':
        				started = true;
        				start_x = x;
        				start_y = y;
        				
        				// Getting the BBox from the selection box, since we know we
        				// want to orient around it
        				init_bbox = svgedit.utilities.getBBox($('#selectedBox0')[0]);
        				var bb = {};
        				$.each(init_bbox, function(key, val) {
        					bb[key] = val/current_zoom;
        				});
        				init_bbox = bb;
        				
        				// append three dummy transforms to the tlist so that
        				// we can translate,scale,translate in mousemove
        				var pos = svgedit.utilities.getRotationAngle(mouse_target) ? 1 : 0;
        				
        				if (svgedit.math.hasMatrixTransform(tlist)) {
        					tlist.insertItemBefore(svgroot.createSVGTransform(), pos);
        					tlist.insertItemBefore(svgroot.createSVGTransform(), pos);
        					tlist.insertItemBefore(svgroot.createSVGTransform(), pos);
        				} else {
        					tlist.appendItem(svgroot.createSVGTransform());
        					tlist.appendItem(svgroot.createSVGTransform());
        					tlist.appendItem(svgroot.createSVGTransform());
        					
        					if (svgedit.browser.supportsNonScalingStroke()) {
        						// Handle crash for newer Chrome and Safari 6 (Mobile and Desktop): 
        						// https://code.google.com/p/svg-edit/issues/detail?id=904
        						// Chromium issue: https://code.google.com/p/chromium/issues/detail?id=114625
        						// TODO: Remove this workaround once vendor fixes the issue
        						var isWebkit = svgedit.browser.isWebkit();
        
        						if (isWebkit) {
        							var delayedStroke = function(ele) {
        								var _stroke = ele.getAttributeNS(null, 'stroke');
        								ele.removeAttributeNS(null, 'stroke');
        								//Re-apply stroke after delay. Anything higher than 1 seems to cause flicker
        								setTimeout(function() { ele.setAttributeNS(null, 'stroke', _stroke); }, 0);
        							};
        						}
        						mouse_target.style.vectorEffect = 'non-scaling-stroke';
        						if (isWebkit) {delayedStroke(mouse_target);}
        
        						var all = mouse_target.getElementsByTagName('*'),
        							len = all.length;
        						for (i = 0; i < len; i++) {
        							all[i].style.vectorEffect = 'non-scaling-stroke';
        							if (isWebkit) {delayedStroke(all[i]);}
        						}
        					}
        				}
        				break;
        			case 'fhellipse':
        			case 'fhrect':
        			case 'fhpath':
        				start.x = real_x;
        				start.y = real_y;
        				started = true;
        				d_attr = real_x + ',' + real_y + ' ';
        				stroke_w = cur_shape.stroke_width == 0 ? 1 : cur_shape.stroke_width;
        				addSvgElementFromJson({
        					element: 'polyline',
        					curStyles: true,
        					attr: {
        						points: d_attr,
        						id: getNextId(),
        						fill: 'none',
        						opacity: cur_shape.opacity / 2,
        						'stroke-linecap': 'round',
        						style: 'pointer-events:none'
        					}
        				});
        				freehand.minx = real_x;
        				freehand.maxx = real_x;
        				freehand.miny = real_y;
        				freehand.maxy = real_y;
        				break;
        			case 'image':
        				started = true;
        				var newImage = addSvgElementFromJson({
        					element: 'image',
        					attr: {
        						x: x,
        						y: y,
        						width: 0,
        						height: 0,
        						id: getNextId(),
        						opacity: cur_shape.opacity / 2,
        						style: 'pointer-events:inherit'
        					}
        				});
        				setHref(newImage, last_good_img_url);
        				preventClickDefault(newImage);
        				break;
        			case 'square':
        				// FIXME: once we create the rect, we lose information that this was a square
        				// (for resizing purposes this could be important)
        			case 'rect':
        				started = true;
        				start_x = x;
        				start_y = y;
        				addSvgElementFromJson({
        					element: 'rect',
        					curStyles: true,
        					attr: {
        						x: x,
        						y: y,
        						width: 0,
        						height: 0,
        						id: getNextId(),
        						opacity: cur_shape.opacity / 2
        					}
        				});
        				break;
        			case 'line':
        				started = true;
        				stroke_w = cur_shape.stroke_width == 0 ? 1 : cur_shape.stroke_width;
        				addSvgElementFromJson({
        					element: 'line',
        					curStyles: true,
        					attr: {
        						x1: x,
        						y1: y,
        						x2: x,
        						y2: y,
        						id: getNextId(),
        						stroke: cur_shape.stroke,
        						'stroke-width': stroke_w,
        						'stroke-dasharray': cur_shape.stroke_dasharray,
        						'stroke-linejoin': cur_shape.stroke_linejoin,
        						'stroke-linecap': cur_shape.stroke_linecap,
        						'stroke-opacity': cur_shape.stroke_opacity,
        						fill: 'none',
        						opacity: cur_shape.opacity / 2,
        						style: 'pointer-events:none'
        					}
        				});
        				break;
        			case 'circle':
        				started = true;
        				addSvgElementFromJson({
        					element: 'circle',
        					curStyles: true,
        					attr: {
        						cx: x,
        						cy: y,
        						r: 0,
        						id: getNextId(),
        						opacity: cur_shape.opacity / 2
        					}
        				});
        				break;
        			case 'ellipse':
        				started = true;
        				addSvgElementFromJson({
        					element: 'ellipse',
        					curStyles: true,
        					attr: {
        						cx: x,
        						cy: y,
        						rx: 0,
        						ry: 0,
        						id: getNextId(),
        						opacity: cur_shape.opacity / 2
        					}
        				});
        				break;
        			case 'text':
        				started = true;
        				var newText = addSvgElementFromJson({
        					element: 'text',
        					curStyles: true,
        					attr: {
        						x: x,
        						y: y,
        						id: getNextId(),
        						fill: cur_text.fill,
        						'stroke-width': cur_text.stroke_width,
        						'font-size': cur_text.font_size,
        						'font-family': cur_text.font_family,
        						'text-anchor': 'middle',
        						'xml:space': 'preserve',
        						opacity: cur_shape.opacity
        					}
        				});
        //					newText.textContent = 'text';
        				break;
        			case 'path':
        				// Fall through
        			case 'pathedit':
        				start_x *= current_zoom;
        				start_y *= current_zoom;
        				pathActions.mouseDown(evt, mouse_target, start_x, start_y);
        				started = true;
        				break;
        			case 'textedit':
        				start_x *= current_zoom;
        				start_y *= current_zoom;
        				textActions.mouseDown(evt, mouse_target, start_x, start_y);
        				started = true;
        				break;
        			case 'rotate':
        				started = true;
        				// we are starting an undoable change (a drag-rotation)
        				canvas.undoMgr.beginUndoableChange('transform', selectedElements);
        				break;
        			default:
        				// This could occur in an extension
        				break;
        		}
        		
        		var ext_result = runExtensions('mouseDown', {
        			event: evt,
        			start_x: start_x,
        			start_y: start_y,
        			selectedElements: selectedElements
        		}, true);
        		
        		$.each(ext_result, function(i, r) {
        			if (r && r.started) {
        				started = true;
        			}
        		});
        	};
        	
        	// in this function we do not record any state changes yet (but we do update
        	// any elements that are still being created, moved or resized on the canvas)
        	var mouseMove = function(evt) {
        		if (!started) {return;}
        		if (evt.button === 1 || canvas.spaceKey) {return;}
        
        		var i, xya, c, cx, cy, dx, dy, len, angle, box,
        			selected = selectedElements[0],
        			pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ),
        			mouse_x = pt.x * current_zoom,
        			mouse_y = pt.y * current_zoom,
        			shape = svgedit.utilities.getElem(getId());
        
        		var real_x = mouse_x / current_zoom;
        		x = real_x;
        		var real_y = mouse_y / current_zoom;
        		y = real_y;
        	
        		if (curConfig.gridSnapping){
        			x = svgedit.utilities.snapToGrid(x);
        			y = svgedit.utilities.snapToGrid(y);
        		}
        
        		evt.preventDefault();
        		var tlist;
        		switch (current_mode) {
        			case 'select':
        				// we temporarily use a translate on the element(s) being dragged
        				// this transform is removed upon mousing up and the element is 
        				// relocated to the new location
        				if (selectedElements[0] !== null) {
        					dx = x - start_x;
        					dy = y - start_y;
        					
        					if (curConfig.gridSnapping){
        						dx = svgedit.utilities.snapToGrid(dx);
        						dy = svgedit.utilities.snapToGrid(dy);
        					}
        
        					if (evt.shiftKey) { 
        						xya = svgedit.math.snapToAngle(start_x, start_y, x, y);
        						x = xya.x;
        						y = xya.y; 
        					}
        
        					if (dx != 0 || dy != 0) {
        						len = selectedElements.length;
        						for (i = 0; i < len; ++i) {
        							selected = selectedElements[i];
        							if (selected == null) {break;}
        //							if (i==0) {
        //								var box = svgedit.utilities.getBBox(selected);
        //									selectedBBoxes[i].x = box.x + dx;
        //									selectedBBoxes[i].y = box.y + dy;
        //							}
        
        							// update the dummy transform in our transform list
        							// to be a translate
        							var xform = svgroot.createSVGTransform();
        							tlist = svgedit.transformlist.getTransformList(selected);
        							// Note that if Webkit and there's no ID for this
        							// element, the dummy transform may have gotten lost.
        							// This results in unexpected behaviour
        							
        							xform.setTranslate(dx, dy);
        							if (tlist.numberOfItems) {
        								tlist.replaceItem(xform, 0);
        							} else {
        								tlist.appendItem(xform);
        							}
        							
        							// update our internal bbox that we're tracking while dragging
        							selectorManager.requestSelector(selected).resize();
        						}
        						
        						call('transition', selectedElements);
        					}
        				}
        				break;
        			case 'multiselect':
        				real_x *= current_zoom;
        				real_y *= current_zoom;
        				svgedit.utilities.assignAttributes(rubberBox, {
        					'x': Math.min(r_start_x, real_x),
        					'y': Math.min(r_start_y, real_y),
        					'width': Math.abs(real_x - r_start_x),
        					'height': Math.abs(real_y - r_start_y)
        				}, 100);
        
        				// for each selected:
        				// - if newList contains selected, do nothing
        				// - if newList doesn't contain selected, remove it from selected
        				// - for any newList that was not in selectedElements, add it to selected
        				var elemsToRemove = [], elemsToAdd = [],
        					newList = getIntersectionList();
        				len = selectedElements.length;
        				
        				for (i = 0; i < len; ++i) {
        					var ind = newList.indexOf(selectedElements[i]);
        					if (ind == -1) {
        						elemsToRemove.push(selectedElements[i]);
        					} else {
        						newList[ind] = null;
        					}
        				}
        				
        				len = newList.length;
        				for (i = 0; i < len; ++i) {
        					if (newList[i]) {elemsToAdd.push(newList[i]);}
        				}
        				
        				if (elemsToRemove.length > 0) {
        					canvas.removeFromSelection(elemsToRemove);
        				}
        				
        				if (elemsToAdd.length > 0) {
        					addToSelection(elemsToAdd);
        				}
        					
        				break;
        			case 'resize':
        				// we track the resize bounding box and translate/scale the selected element
        				// while the mouse is down, when mouse goes up, we use this to recalculate
        				// the shape's coordinates
        				tlist = svgedit.transformlist.getTransformList(selected);
        				var hasMatrix = svgedit.math.hasMatrixTransform(tlist);
        				box = hasMatrix ? init_bbox : svgedit.utilities.getBBox(selected);
        				var left = box.x, top = box.y, width = box.width,
        					height = box.height;
        					dx = (x-start_x);
        					dy = (y-start_y);
        				
        				if (curConfig.gridSnapping) {
        					dx = svgedit.utilities.snapToGrid(dx);
        					dy = svgedit.utilities.snapToGrid(dy);
        					height = svgedit.utilities.snapToGrid(height);
        					width = svgedit.utilities.snapToGrid(width);
        				}
        
        				// if rotated, adjust the dx,dy values
        				angle = svgedit.utilities.getRotationAngle(selected);
        				if (angle) {
        					var r = Math.sqrt( dx*dx + dy*dy ),
        						theta = Math.atan2(dy, dx) - angle * Math.PI / 180.0;
        					dx = r * Math.cos(theta);
        					dy = r * Math.sin(theta);
        				}
        
        				// if not stretching in y direction, set dy to 0
        				// if not stretching in x direction, set dx to 0
        				if (current_resize_mode.indexOf('n')==-1 && current_resize_mode.indexOf('s')==-1) {
        					dy = 0;
        				}
        				if (current_resize_mode.indexOf('e')==-1 && current_resize_mode.indexOf('w')==-1) {
        					dx = 0;
        				}				
        				
        				var ts = null,
        					tx = 0, ty = 0,
        					sy = height ? (height+dy)/height : 1, 
        					sx = width ? (width+dx)/width : 1;
        				// if we are dragging on the north side, then adjust the scale factor and ty
        				if (current_resize_mode.indexOf('n') >= 0) {
        					sy = height ? (height-dy)/height : 1;
        					ty = height;
        				}
        				
        				// if we dragging on the east side, then adjust the scale factor and tx
        				if (current_resize_mode.indexOf('w') >= 0) {
        					sx = width ? (width-dx)/width : 1;
        					tx = width;
        				}
        				
        				// update the transform list with translate,scale,translate
        				var translateOrigin = svgroot.createSVGTransform(),
        					scale = svgroot.createSVGTransform(),
        					translateBack = svgroot.createSVGTransform();
        
        				if (curConfig.gridSnapping) {
        					left = svgedit.utilities.snapToGrid(left);
        					tx = svgedit.utilities.snapToGrid(tx);
        					top = svgedit.utilities.snapToGrid(top);
        					ty = svgedit.utilities.snapToGrid(ty);
        				}
        
        				translateOrigin.setTranslate(-(left+tx), -(top+ty));
        				if (evt.shiftKey) {
        					if (sx == 1) {sx = sy;}
        					else {sy = sx;}
        				}
        				scale.setScale(sx, sy);
        				
        				translateBack.setTranslate(left+tx, top+ty);
        				if (hasMatrix) {
        					var diff = angle ? 1 : 0;
        					tlist.replaceItem(translateOrigin, 2+diff);
        					tlist.replaceItem(scale, 1+diff);
        					tlist.replaceItem(translateBack, Number(diff));
        				} else {
        					var N = tlist.numberOfItems;
        					tlist.replaceItem(translateBack, N-3);
        					tlist.replaceItem(scale, N-2);
        					tlist.replaceItem(translateOrigin, N-1);
        				}
        
        				selectorManager.requestSelector(selected).resize();
        				
        				call('transition', selectedElements);
        				
        				break;
        			case 'zoom':
        				real_x *= current_zoom;
        				real_y *= current_zoom;
        				svgedit.utilities.assignAttributes(rubberBox, {
        					'x': Math.min(r_start_x*current_zoom, real_x),
        					'y': Math.min(r_start_y*current_zoom, real_y),
        					'width': Math.abs(real_x - r_start_x*current_zoom),
        					'height': Math.abs(real_y - r_start_y*current_zoom)
        				}, 100);			
        				break;
        			case 'text':
        				svgedit.utilities.assignAttributes(shape,{
        					'x': x,
        					'y': y
        				}, 1000);
        				break;
        			case 'line':
        				// Opera has a problem with suspendRedraw() apparently
        				var handle = null;
        				if (!window.opera) {svgroot.suspendRedraw(1000);}
        
        				if (curConfig.gridSnapping) {
        					x = svgedit.utilities.snapToGrid(x);
        					y = svgedit.utilities.snapToGrid(y);
        				}
        
        				var x2 = x;
        				var y2 = y;					
        
        				if (evt.shiftKey) {
        					xya = svgedit.math.snapToAngle(start_x, start_y, x2, y2);
        					x2 = xya.x;
        					y2 = xya.y;
        				}
        				
        				shape.setAttributeNS(null, 'x2', x2);
        				shape.setAttributeNS(null, 'y2', y2);
        				if (!window.opera) {svgroot.unsuspendRedraw(handle);}
        				break;
        			case 'foreignObject':
        				// fall through
        			case 'square':
        				// fall through
        			case 'rect':
        				// fall through
        			case 'image':
        				var square = (current_mode == 'square') || evt.shiftKey,
        					w = Math.abs(x - start_x),
        					h = Math.abs(y - start_y),
        					new_x, new_y;
        				if (square) {
        					w = h = Math.max(w, h);
        					new_x = start_x < x ? start_x : start_x - w;
        					new_y = start_y < y ? start_y : start_y - h;
        				} else {
        					new_x = Math.min(start_x, x);
        					new_y = Math.min(start_y, y);
        				}
        	
        				if (curConfig.gridSnapping) {
        					w = svgedit.utilities.snapToGrid(w);
        					h = svgedit.utilities.snapToGrid(h);
        					new_x = svgedit.utilities.snapToGrid(new_x);
        					new_y = svgedit.utilities.snapToGrid(new_y);
        				}
        
        				svgedit.utilities.assignAttributes(shape,{
        					'width': w,
        					'height': h,
        					'x': new_x,
        					'y': new_y
        				},1000);
        				
        				break;
        			case 'circle':
        				c = $(shape).attr(['cx', 'cy']);
        				cx = c.cx;
        				cy = c.cy;
        				var rad = Math.sqrt( (x-cx)*(x-cx) + (y-cy)*(y-cy) );
        				if (curConfig.gridSnapping) {
        					rad = svgedit.utilities.snapToGrid(rad);
        				}
        				shape.setAttributeNS(null, 'r', rad);
        				break;
        			case 'ellipse':
        				c = $(shape).attr(['cx', 'cy']);
        				cx = c.cx;
        				cy = c.cy;
        				// Opera has a problem with suspendRedraw() apparently
        					handle = null;
        				if (!window.opera) {svgroot.suspendRedraw(1000);}
        				if (curConfig.gridSnapping) {
        					x = svgedit.utilities.snapToGrid(x);
        					cx = svgedit.utilities.snapToGrid(cx);
        					y = svgedit.utilities.snapToGrid(y);
        					cy = svgedit.utilities.snapToGrid(cy);
        				}
        				shape.setAttributeNS(null, 'rx', Math.abs(x - cx) );
        				var ry = Math.abs(evt.shiftKey?(x - cx):(y - cy));
        				shape.setAttributeNS(null, 'ry', ry );
        				if (!window.opera) {svgroot.unsuspendRedraw(handle);}
        				break;
        			case 'fhellipse':
        			case 'fhrect':
        				freehand.minx = Math.min(real_x, freehand.minx);
        				freehand.maxx = Math.max(real_x, freehand.maxx);
        				freehand.miny = Math.min(real_y, freehand.miny);
        				freehand.maxy = Math.max(real_y, freehand.maxy);
        			// break; missing on purpose
        			case 'fhpath':
        //				d_attr += + real_x + ',' + real_y + ' ';
        //				shape.setAttributeNS(null, 'points', d_attr);
        				end.x = real_x; end.y = real_y;
        				if (controllPoint2.x && controllPoint2.y) {
        					for (i = 0; i < STEP_COUNT - 1; i++) {
        						parameter = i / STEP_COUNT;
        						nextParameter = (i + 1) / STEP_COUNT;
        						bSpline = getBsplinePoint(nextParameter);
        						nextPos = bSpline;
        						bSpline = getBsplinePoint(parameter);
        						sumDistance += Math.sqrt((nextPos.x - bSpline.x) * (nextPos.x - bSpline.x) + (nextPos.y - bSpline.y) * (nextPos.y - bSpline.y));
        						if (sumDistance > THRESHOLD_DIST) {
        							d_attr += + bSpline.x + ',' + bSpline.y + ' ';
        							shape.setAttributeNS(null, 'points', d_attr);
        							sumDistance -= THRESHOLD_DIST;
        						}
        					}
        				}
        				controllPoint2 = {x:controllPoint1.x, y:controllPoint1.y};
        				controllPoint1 = {x:start.x, y:start.y};
        				start = {x:end.x, y:end.y};
        				break;
        			// update path stretch line coordinates
        			case 'path':
        				// fall through
        			case 'pathedit':
        				x *= current_zoom;
        				y *= current_zoom;
        				
        				if (curConfig.gridSnapping) {
        					x = svgedit.utilities.snapToGrid(x);
        					y = svgedit.utilities.snapToGrid(y);
        					start_x = svgedit.utilities.snapToGrid(start_x);
        					start_y = svgedit.utilities.snapToGrid(start_y);
        				}
        				if (evt.shiftKey) {
        					var path = svgedit.path.path;
        					var x1, y1;
        					if (path) {
        						x1 = path.dragging?path.dragging[0]:start_x;
        						y1 = path.dragging?path.dragging[1]:start_y;
        					} else {
        						x1 = start_x;
        						y1 = start_y;
        					}
        					xya = svgedit.math.snapToAngle(x1, y1, x, y);
        					x = xya.x;
        					y = xya.y;
        				}
        				
        				if (rubberBox && rubberBox.getAttribute('display') !== 'none') {
        					real_x *= current_zoom;
        					real_y *= current_zoom;
        					svgedit.utilities.assignAttributes(rubberBox, {
        						'x': Math.min(r_start_x*current_zoom, real_x),
        						'y': Math.min(r_start_y*current_zoom, real_y),
        						'width': Math.abs(real_x - r_start_x*current_zoom),
        						'height': Math.abs(real_y - r_start_y*current_zoom)
        					},100);	
        				}
        				pathActions.mouseMove(x, y);
        				
        				break;
        			case 'textedit':
        				x *= current_zoom;
        				y *= current_zoom;
        //					if (rubberBox && rubberBox.getAttribute('display') != 'none') {
        //						svgedit.utilities.assignAttributes(rubberBox, {
        //							'x': Math.min(start_x,x),
        //							'y': Math.min(start_y,y),
        //							'width': Math.abs(x-start_x),
        //							'height': Math.abs(y-start_y)
        //						},100);
        //					}
        				
        				textActions.mouseMove(mouse_x, mouse_y);
        				
        				break;
        			case 'rotate':
        				box = svgedit.utilities.getBBox(selected);
        				cx = box.x + box.width/2;
        				cy = box.y + box.height/2;
        				var m = svgedit.math.getMatrix(selected),
        					center = svgedit.math.transformPoint(cx, cy, m);
        				cx = center.x;
        				cy = center.y;
        				angle = ((Math.atan2(cy-y, cx-x) * (180/Math.PI))-90) % 360;
        				if (curConfig.gridSnapping) {
        					angle = svgedit.utilities.snapToGrid(angle);
        				}
        				if (evt.shiftKey) { // restrict rotations to nice angles (WRS)
        					var snap = 45;
        					angle= Math.round(angle/snap)*snap;
        				}
        
        				canvas.setRotationAngle(angle<-180?(360+angle):angle, true);
        				call('transition', selectedElements);
        				break;
        			default:
        				break;
        		}
        		
        		runExtensions('mouseMove', {
        			event: evt,
        			mouse_x: mouse_x,
        			mouse_y: mouse_y,
        			selected: selected
        		});
        
        	}; // mouseMove()
        	
        	// - in create mode, the element's opacity is set properly, we create an InsertElementCommand
        	// and store it on the Undo stack
        	// - in move/resize mode, the element's attributes which were affected by the move/resize are
        	// identified, a ChangeElementCommand is created and stored on the stack for those attrs
        	// this is done in when we recalculate the selected dimensions()
        	var mouseUp = function(evt) {
        		if (evt.button === 2) {return;}
        		var tempJustSelected = justSelected;
        		justSelected = null;
        		if (!started) {return;}
        		var pt = svgedit.math.transformPoint(evt.pageX, evt.pageY, root_sctm),
        			mouse_x = pt.x * current_zoom,
        			mouse_y = pt.y * current_zoom,
        			x = mouse_x / current_zoom,
        			y = mouse_y / current_zoom,
        			element = svgedit.utilities.getElem(getId()),
        			keep = false;
        
        		var real_x = x;
        		var real_y = y;
        
        		// TODO: Make true when in multi-unit mode
        		var useUnit = false; // (curConfig.baseUnit !== 'px');
        		started = false;
        		var attrs, t;
        		switch (current_mode) {
        			// intentionally fall-through to select here
        			case 'resize':
        			case 'multiselect':
        				if (rubberBox != null) {
        					rubberBox.setAttribute('display', 'none');
        					curBBoxes = [];
        				}
        				current_mode = 'select';
        			case 'select':
        				if (selectedElements[0] != null) {
        					// if we only have one selected element
        					if (selectedElements[1] == null) {
        						// set our current stroke/fill properties to the element's
        						var selected = selectedElements[0];
        						switch ( selected.tagName ) {
        							case 'g':
        							case 'use':
        							case 'image':
        							case 'foreignObject':
        								break;
        							default:
        								cur_properties.fill = selected.getAttribute('fill');
        								cur_properties.fill_opacity = selected.getAttribute('fill-opacity');
        								cur_properties.stroke = selected.getAttribute('stroke');
        								cur_properties.stroke_opacity = selected.getAttribute('stroke-opacity');
        								cur_properties.stroke_width = selected.getAttribute('stroke-width');
        								cur_properties.stroke_dasharray = selected.getAttribute('stroke-dasharray');
        								cur_properties.stroke_linejoin = selected.getAttribute('stroke-linejoin');
        								cur_properties.stroke_linecap = selected.getAttribute('stroke-linecap');
        						}
        
        						if (selected.tagName == 'text') {
        							cur_text.font_size = selected.getAttribute('font-size');
        							cur_text.font_family = selected.getAttribute('font-family');
        						}
        						selectorManager.requestSelector(selected).showGrips(true);
        						
        						// This shouldn't be necessary as it was done on mouseDown...
        //							call('selected', [selected]);
        					}
        					// always recalculate dimensions to strip off stray identity transforms
        					recalculateAllSelectedDimensions();
        					// if it was being dragged/resized
        					if (real_x != r_start_x || real_y != r_start_y) {
        						var i, len = selectedElements.length;
        						for (i = 0; i < len; ++i) {
        							if (selectedElements[i] == null) {break;}
        							if (!selectedElements[i].firstChild) {
        								// Not needed for groups (incorrectly resizes elems), possibly not needed at all?
        								selectorManager.requestSelector(selectedElements[i]).resize();
        							}
        						}
        					}
        					// no change in position/size, so maybe we should move to pathedit
        					else {
        						t = evt.target;
        						if (selectedElements[0].nodeName === 'path' && selectedElements[1] == null) {
        							pathActions.select(selectedElements[0]);
        						} // if it was a path
        						// else, if it was selected and this is a shift-click, remove it from selection
        						else if (evt.shiftKey) {
        							if (tempJustSelected != t) {
        								canvas.removeFromSelection([t]);
        							}
        						}
        					} // no change in mouse position
        					
        					// Remove non-scaling stroke
        					if (svgedit.browser.supportsNonScalingStroke()) {
        						var elem = selectedElements[0];
        						if (elem) {
        							elem.removeAttribute('style');
        							svgedit.utilities.walkTree(elem, function(elem) {
        								elem.removeAttribute('style');
        							});
        						}
        					}
        
        				}
        				return;
        			case 'zoom':
        				if (rubberBox != null) {
        					rubberBox.setAttribute('display', 'none');
        				}
        				var factor = evt.shiftKey ? 0.5 : 2;
        				call('zoomed', {
        					'x': Math.min(r_start_x, real_x),
        					'y': Math.min(r_start_y, real_y),
        					'width': Math.abs(real_x - r_start_x),
        					'height': Math.abs(real_y - r_start_y),
        					'factor': factor
        				});
        				return;
        			case 'fhpath':
        				// Check that the path contains at least 2 points; a degenerate one-point path
        				// causes problems.
        				// Webkit ignores how we set the points attribute with commas and uses space
        				// to separate all coordinates, see https://bugs.webkit.org/show_bug.cgi?id=29870
        				sumDistance = 0;
        				controllPoint2 = {x:0, y:0};
        				controllPoint1 = {x:0, y:0};
        				start = {x:0, y:0};
        				end = {x:0, y:0};
        				var coords = element.getAttribute('points');
        				var commaIndex = coords.indexOf(',');
        				if (commaIndex >= 0) {
        					keep = coords.indexOf(',', commaIndex+1) >= 0;
        				} else {
        					keep = coords.indexOf(' ', coords.indexOf(' ')+1) >= 0;
        				}
        				if (keep) {
        					element = pathActions.smoothPolylineIntoPath(element);
        				}
        				break;
        			case 'line':
        				attrs = $(element).attr(['x1', 'x2', 'y1', 'y2']);
        				keep = (attrs.x1 != attrs.x2 || attrs.y1 != attrs.y2);
        				break;
        			case 'foreignObject':
        			case 'square':
        			case 'rect':
        			case 'image':
        				attrs = $(element).attr(['width', 'height']);
        				// Image should be kept regardless of size (use inherit dimensions later)
        				keep = (attrs.width != 0 || attrs.height != 0) || current_mode === 'image';
        				break;
        			case 'circle':
        				keep = (element.getAttribute('r') != 0);
        				break;
        			case 'ellipse':
        				attrs = $(element).attr(['rx', 'ry']);
        				keep = (attrs.rx != null || attrs.ry != null);
        				break;
        			case 'fhellipse':
        				if ((freehand.maxx - freehand.minx) > 0 &&
        					(freehand.maxy - freehand.miny) > 0) {
        					element = addSvgElementFromJson({
        						element: 'ellipse',
        						curStyles: true,
        						attr: {
        							cx: (freehand.minx + freehand.maxx) / 2,
        							cy: (freehand.miny + freehand.maxy) / 2,
        							rx: (freehand.maxx - freehand.minx) / 2,
        							ry: (freehand.maxy - freehand.miny) / 2,
        							id: getId()
        						}
        					});
        					call('changed',[element]);
        					keep = true;
        				}
        				break;
        			case 'fhrect':
        				if ((freehand.maxx - freehand.minx) > 0 &&
        					(freehand.maxy - freehand.miny) > 0) {
        					element = addSvgElementFromJson({
        						element: 'rect',
        						curStyles: true,
        						attr: {
        							x: freehand.minx,
        							y: freehand.miny,
        							width: (freehand.maxx - freehand.minx),
        							height: (freehand.maxy - freehand.miny),
        							id: getId()
        						}
        					});
        					call('changed',[element]);
        					keep = true;
        				}
        				break;
        			case 'text':
        				keep = true;
        				selectOnly([element]);
        				textActions.start(element);
        				break;
        			case 'path':
        				// set element to null here so that it is not removed nor finalized
        				element = null;
        				// continue to be set to true so that mouseMove happens
        				started = true;
        				
        				var res = pathActions.mouseUp(evt, element, mouse_x, mouse_y);
        				element = res.element;
        				keep = res.keep;
        				break;
        			case 'pathedit':
        				keep = true;
        				element = null;
        				pathActions.mouseUp(evt);
        				break;
        			case 'textedit':
        				keep = false;
        				element = null;
        				textActions.mouseUp(evt, mouse_x, mouse_y);
        				break;
        			case 'rotate':
        				keep = true;
        				element = null;
        				current_mode = 'select';
        				var batchCmd = canvas.undoMgr.finishUndoableChange();
        				if (!batchCmd.isEmpty()) { 
        					addCommandToHistory(batchCmd);
        				}
        				// perform recalculation to weed out any stray identity transforms that might get stuck
        				recalculateAllSelectedDimensions();
        				call('changed', selectedElements);
        				break;
        			default:
        				// This could occur in an extension
        				break;
        		}
        		
        		var ext_result = runExtensions('mouseUp', {
        			event: evt,
        			mouse_x: mouse_x,
        			mouse_y: mouse_y
        		}, true);
        		
        		$.each(ext_result, function(i, r) {
        			if (r) {
        				keep = r.keep || keep;
        				element = r.element;
        				started = r.started || started;
        			}
        		});
        		
        		if (!keep && element != null) {
        			getCurrentDrawing().releaseId(getId());
        			element.parentNode.removeChild(element);
        			element = null;
        			
        			t = evt.target;
        			
        			// if this element is in a group, go up until we reach the top-level group 
        			// just below the layer groups
        			// TODO: once we implement links, we also would have to check for <a> elements
        			while (t.parentNode.parentNode.tagName == 'g') {
        				t = t.parentNode;
        			}
        			// if we are not in the middle of creating a path, and we've clicked on some shape, 
        			// then go to Select mode.
        			// WebKit returns <div> when the canvas is clicked, Firefox/Opera return <svg>
        			if ( (current_mode != 'path' || !drawn_path) &&
        				t.parentNode.id != 'selectorParentGroup' &&
        				t.id != 'svgcanvas' && t.id != 'svgroot') 
        			{
        				// switch into "select" mode if we've clicked on an element
        				canvas.setMode('select');
        				selectOnly([t], true);
        			}
        			
        		} else if (element != null) {
        			canvas.addedNew = true;
        			
        			if (useUnit) {svgedit.units.convertAttrs(element);}
        			
        			var ani_dur = 0.2, c_ani;
        			if (opac_ani.beginElement && element.getAttribute('opacity') != cur_shape.opacity) {
        				c_ani = $(opac_ani).clone().attr({
        					to: cur_shape.opacity,
        					dur: ani_dur
        				}).appendTo(element);
        				try {
        					// Fails in FF4 on foreignObject
        					c_ani[0].beginElement();
        				} catch(e){}
        			} else {
        				ani_dur = 0;
        			}
        			
        			// Ideally this would be done on the endEvent of the animation,
        			// but that doesn't seem to be supported in Webkit
        			setTimeout(function() {
        				if (c_ani) {c_ani.remove();}
        				element.setAttribute('opacity', cur_shape.opacity);
        				element.setAttribute('style', 'pointer-events:inherit');
        				cleanupElement(element);
        				if (current_mode === 'path') {
        					pathActions.toEditMode(element);
        				} else if (curConfig.selectNew) {
        					selectOnly([element], true);
        				}
        				// we create the insert command that is stored on the stack
        				// undo means to call cmd.unapply(), redo means to call cmd.apply()
        				addCommandToHistory(new svgedit.history.InsertElementCommand(element));
        				
        				call('changed',[element]);
        			}, ani_dur * 1000);
        		}
        		
        		startTransform = null;
        	};
        	
        	var dblClick = function(evt) {
        		var evt_target = evt.target;
        		var parent = evt_target.parentNode;
        		
        		// Do nothing if already in current group
        		if (parent === current_group) {return;}
        		
        		var mouse_target = getMouseTarget(evt);
        		var tagName = mouse_target.tagName;
        		
        		if (tagName === 'text' && current_mode !== 'textedit') {
        			var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm );
        			textActions.select(mouse_target, pt.x, pt.y);
        		}
        		
        		if ((tagName === 'g' || tagName === 'a') && svgedit.utilities.getRotationAngle(mouse_target)) {
        			// TODO: Allow method of in-group editing without having to do 
        			// this (similar to editing rotated paths)
        		
        			// Ungroup and regroup
        			pushGroupProperties(mouse_target);
        			mouse_target = selectedElements[0];
        			clearSelection(true);
        		}
        		// Reset context
        		if (current_group) {
        			leaveContext();
        		}
        		
        		if ((parent.tagName !== 'g' && parent.tagName !== 'a') ||
        			parent === getCurrentDrawing().getCurrentLayer() ||
        			mouse_target === selectorManager.selectorParentGroup)
        		{
        			// Escape from in-group edit
        			return;
        		}
        		setContext(mouse_target);
        	};
        
        	// prevent links from being followed in the canvas
        	var handleLinkInCanvas = function(e) {
        		e.preventDefault();
        		return false;
        	};
        	
        	// Added mouseup to the container here.
        	// TODO(codedread): Figure out why after the Closure compiler, the window mouseup is ignored.
        	$(container).mousedown(mouseDown).mousemove(mouseMove).click(handleLinkInCanvas).dblclick(dblClick).mouseup(mouseUp);
        //	$(window).mouseup(mouseUp);
        	
        	 //TODO(rafaelcastrocouto): User preference for shift key and zoom factor
        	$(container).bind('mousewheel DOMMouseScroll', function(e){
        		//if (!e.shiftKey) {return;}
        		e.preventDefault();
        		var evt = e.originalEvent;
        
        		root_sctm = $('#svgcontent g')[0].getScreenCTM().inverse();
        		var pt = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm );
        
        		var bbox = {
        			'x': pt.x,
        			'y': pt.y,
        			'width': 0,
        			'height': 0
        		};
        
        		var delta = (evt.wheelDelta) ? evt.wheelDelta : (evt.detail) ? -evt.detail : 0;
        		if (!delta) {return;}
        
        		bbox.factor = Math.max(3/4, Math.min(4/3, (delta)));
        	
        		call('zoomed', bbox);
        	});
        	
        }());
        
        // Function: preventClickDefault
        // Prevents default browser click behaviour on the given element
        //
        // Parameters:
        // img - The DOM element to prevent the cilck on
        var preventClickDefault = function(img) {
        	$(img).click(function(e){e.preventDefault();});
        };
        
        // Group: Text edit functions
        // Functions relating to editing text elements
        textActions = canvas.textActions = (function() {
        	var curtext;
        	var textinput;
        	var cursor;
        	var selblock;
        	var blinker;
        	var chardata = [];
        	var textbb, transbb;
        	var matrix;
        	var last_x, last_y;
        	var allow_dbl;
        	
        	function setCursor(index) {
        		var empty = (textinput.value === '');
        		$(textinput).focus();
        	
        		if (!arguments.length) {
        			if (empty) {
        				index = 0;
        			} else {
        				if (textinput.selectionEnd !== textinput.selectionStart) {return;}
        				index = textinput.selectionEnd;
        			}
        		}
        		
        		var charbb;
        		charbb = chardata[index];
        		if (!empty) {
        			textinput.setSelectionRange(index, index);
        		}
        		cursor = svgedit.utilities.getElem('text_cursor');
        		if (!cursor) {
        			cursor = document.createElementNS(NS.SVG, 'line');
        			svgedit.utilities.assignAttributes(cursor, {
        				id: 'text_cursor',
        				stroke: '#333',
        				'stroke-width': 1
        			});
        			cursor = svgedit.utilities.getElem('selectorParentGroup').appendChild(cursor);
        		}
        		
        		if (!blinker) {
        			blinker = setInterval(function() {
        				var show = (cursor.getAttribute('display') === 'none');
        				cursor.setAttribute('display', show?'inline':'none');
        			}, 600);
        		}
        		
        		var start_pt = ptToScreen(charbb.x, textbb.y);
        		var end_pt = ptToScreen(charbb.x, (textbb.y + textbb.height));
        		
        		svgedit.utilities.assignAttributes(cursor, {
        			x1: start_pt.x,
        			y1: start_pt.y,
        			x2: end_pt.x,
        			y2: end_pt.y,
        			visibility: 'visible',
        			display: 'inline'
        		});
        		
        		if (selblock) {selblock.setAttribute('d', '');}
        	}
        	
        	function setSelection(start, end, skipInput) {
        		if (start === end) {
        			setCursor(end);
        			return;
        		}
        	
        		if (!skipInput) {
        			textinput.setSelectionRange(start, end);
        		}
        		
        		selblock = svgedit.utilities.getElem('text_selectblock');
        		if (!selblock) {
        
        			selblock = document.createElementNS(NS.SVG, 'path');
        			svgedit.utilities.assignAttributes(selblock, {
        				id: 'text_selectblock',
        				fill: 'green',
        				opacity: 0.5,
        				style: 'pointer-events:none'
        			});
        			svgedit.utilities.getElem('selectorParentGroup').appendChild(selblock);
        		}
        
        		var startbb = chardata[start];		
        		var endbb = chardata[end];
        		
        		cursor.setAttribute('visibility', 'hidden');
        		
        		var tl = ptToScreen(startbb.x, textbb.y),
        			tr = ptToScreen(startbb.x + (endbb.x - startbb.x), textbb.y),
        			bl = ptToScreen(startbb.x, textbb.y + textbb.height),
        			br = ptToScreen(startbb.x + (endbb.x - startbb.x), textbb.y + textbb.height);
        		
        		var dstr = 'M' + tl.x + ',' + tl.y
        					+ ' L' + tr.x + ',' + tr.y
        					+ ' ' + br.x + ',' + br.y
        					+ ' ' + bl.x + ',' + bl.y + 'z';
        		
        		svgedit.utilities.assignAttributes(selblock, {
        			d: dstr,
        			'display': 'inline'
        		});
        	}
        	
        	function getIndexFromPoint(mouse_x, mouse_y) {
        		// Position cursor here
        		var pt = svgroot.createSVGPoint();
        		pt.x = mouse_x;
        		pt.y = mouse_y;
        
        		// No content, so return 0
        		if (chardata.length == 1) {return 0;}
        		// Determine if cursor should be on left or right of character
        		var charpos = curtext.getCharNumAtPosition(pt);
        		if (charpos < 0) {
        			// Out of text range, look at mouse coords
        			charpos = chardata.length - 2;
        			if (mouse_x <= chardata[0].x) {
        				charpos = 0;
        			}
        		} else if (charpos >= chardata.length - 2) {
        			charpos = chardata.length - 2;
        		}
        		var charbb = chardata[charpos];
        		var mid = charbb.x + (charbb.width/2);
        		if (mouse_x > mid) {
        			charpos++;
        		}
        		return charpos;
        	}
        	
        	function setCursorFromPoint(mouse_x, mouse_y) {
        		setCursor(getIndexFromPoint(mouse_x, mouse_y));
        	}
        	
        	function setEndSelectionFromPoint(x, y, apply) {
        		var i1 = textinput.selectionStart;
        		var i2 = getIndexFromPoint(x, y);
        		
        		var start = Math.min(i1, i2);
        		var end = Math.max(i1, i2);
        		setSelection(start, end, !apply);
        	}
        		
        	function screenToPt(x_in, y_in) {
        		var out = {
        			x: x_in,
        			y: y_in
        		};
        		
        		out.x /= current_zoom;
        		out.y /= current_zoom;			
        
        		if (matrix) {
        			var pt = svgedit.math.transformPoint(out.x, out.y, matrix.inverse());
        			out.x = pt.x;
        			out.y = pt.y;
        		}
        		
        		return out;
        	}	
        	
        	function ptToScreen(x_in, y_in) {
        		var out = {
        			x: x_in,
        			y: y_in
        		};
        		
        		if (matrix) {
        			var pt = svgedit.math.transformPoint(out.x, out.y, matrix);
        			out.x = pt.x;
        			out.y = pt.y;
        		}
        		
        		out.x *= current_zoom;
        		out.y *= current_zoom;
        		
        		return out;
        	}
        	
        	function hideCursor() {
        		if (cursor) {
        			cursor.setAttribute('visibility', 'hidden');
        		}
        	}
        	
        	function selectAll(evt) {
        		setSelection(0, curtext.textContent.length);
        		$(this).unbind(evt);
        	}
        
        	function selectWord(evt) {
        		if (!allow_dbl || !curtext) {return;}
        	
        		var ept = svgedit.math.transformPoint( evt.pageX, evt.pageY, root_sctm ),
        			mouse_x = ept.x * current_zoom,
        			mouse_y = ept.y * current_zoom;
        		var pt = screenToPt(mouse_x, mouse_y);
        		
        		var index = getIndexFromPoint(pt.x, pt.y);
        		var str = curtext.textContent;
        		var first = str.substr(0, index).replace(/[a-z0-9]+$/i, '').length;
        		var m = str.substr(index).match(/^[a-z0-9]+/i);
        		var last = (m?m[0].length:0) + index;
        		setSelection(first, last);
        		
        		// Set tripleclick
        		$(evt.target).click(selectAll);
        		setTimeout(function() {
        			$(evt.target).unbind('click', selectAll);
        		}, 300);
        		
        	}
        
        	return {
        		select: function(target, x, y) {
        			curtext = target;
        			textActions.toEditMode(x, y);
        		},
        		start: function(elem) {
        			curtext = elem;
        			textActions.toEditMode();
        		},
        		mouseDown: function(evt, mouse_target, start_x, start_y) {
        			var pt = screenToPt(start_x, start_y);
        		
        			textinput.focus();
        			setCursorFromPoint(pt.x, pt.y);
        			last_x = start_x;
        			last_y = start_y;
        			
        			// TODO: Find way to block native selection
        		},
        		mouseMove: function(mouse_x, mouse_y) {
        			var pt = screenToPt(mouse_x, mouse_y);
        			setEndSelectionFromPoint(pt.x, pt.y);
        		},			
        		mouseUp: function(evt, mouse_x, mouse_y) {
        			var pt = screenToPt(mouse_x, mouse_y);
        			
        			setEndSelectionFromPoint(pt.x, pt.y, true);
        			
        			// TODO: Find a way to make this work: Use transformed BBox instead of evt.target 
        //				if (last_x === mouse_x && last_y === mouse_y
        //					&& !svgedit.math.rectsIntersect(transbb, {x: pt.x, y: pt.y, width:0, height:0})) {
        //					textActions.toSelectMode(true);				
        //				}
        
        			if (
        				evt.target !== curtext
        				&&	mouse_x < last_x + 2
        				&& mouse_x > last_x - 2
        				&&	mouse_y < last_y + 2
        				&& mouse_y > last_y - 2) {
        
        				textActions.toSelectMode(true);
        			}
        
        		},
        		setCursor: setCursor,
        		toEditMode: function(x, y) {
        			allow_dbl = false;
        			current_mode = 'textedit';
        			selectorManager.requestSelector(curtext).showGrips(false);
        			// Make selector group accept clicks
        			var sel = selectorManager.requestSelector(curtext).selectorRect;
        			
        			textActions.init();
        
        			$(curtext).css('cursor', 'text');
        			
        //				if (svgedit.browser.supportsEditableText()) {
        //					curtext.setAttribute('editable', 'simple');
        //					return;
        //				}
        			
        			if (!arguments.length) {
        				setCursor();
        			} else {
        				var pt = screenToPt(x, y);
        				setCursorFromPoint(pt.x, pt.y);
        			}
        			
        			setTimeout(function() {
        				allow_dbl = true;
        			}, 300);
        		},
        		toSelectMode: function(selectElem) {
        			current_mode = 'select';
        			clearInterval(blinker);
        			blinker = null;
        			if (selblock) {$(selblock).attr('display', 'none');}
        			if (cursor) {$(cursor).attr('visibility', 'hidden');}
        			$(curtext).css('cursor', 'move');
        			
        			if (selectElem) {
        				clearSelection();
        				$(curtext).css('cursor', 'move');
        				
        				call('selected', [curtext]);
        				addToSelection([curtext], true);
        			}
        			if (curtext && !curtext.textContent.length) {
        				// No content, so delete
        				canvas.deleteSelectedElements();
        			}
        			
        			$(textinput).blur();
        			
        			curtext = false;
        			
        //				if (svgedit.browser.supportsEditableText()) {
        //					curtext.removeAttribute('editable');
        //				}
        		},
        		setInputElem: function(elem) {
        			textinput = elem;
        //			$(textinput).blur(hideCursor);
        		},
        		clear: function() {
        			if (current_mode == 'textedit') {
        				textActions.toSelectMode();
        			}
        		},
        		init: function(inputElem) {
        			if (!curtext) {return;}
        			var i, end;
        //				if (svgedit.browser.supportsEditableText()) {
        //					curtext.select();
        //					return;
        //				}
        		
        			if (!curtext.parentNode) {
        				// Result of the ffClone, need to get correct element
        				curtext = selectedElements[0];
        				selectorManager.requestSelector(curtext).showGrips(false);
        			}
        			
        			var str = curtext.textContent;
        			var len = str.length;
        			
        			var xform = curtext.getAttribute('transform');
        
        			textbb = svgedit.utilities.getBBox(curtext);
        			
        			matrix = xform ? svgedit.math.getMatrix(curtext) : null;
        
        			chardata = [];
        			chardata.length = len;
        			textinput.focus();
        			
        			$(curtext).unbind('dblclick', selectWord).dblclick(selectWord);
        			
        			if (!len) {
        				end = {x: textbb.x + (textbb.width/2), width: 0};
        			}
        			
        			for (i=0; i<len; i++) {
        				var start = curtext.getStartPositionOfChar(i);
        				end = curtext.getEndPositionOfChar(i);
        				
        				if (!svgedit.browser.supportsGoodTextCharPos()) {
        					var offset = canvas.contentW * current_zoom;
        					start.x -= offset;
        					end.x -= offset;
        					
        					start.x /= current_zoom;
        					end.x /= current_zoom;
        				}
        				
        				// Get a "bbox" equivalent for each character. Uses the
        				// bbox data of the actual text for y, height purposes
        				
        				// TODO: Decide if y, width and height are actually necessary
        				chardata[i] = {
        					x: start.x,
        					y: textbb.y, // start.y?
        					width: end.x - start.x,
        					height: textbb.height
        				};
        			}
        			
        			// Add a last bbox for cursor at end of text
        			chardata.push({
        				x: end.x,
        				width: 0
        			});
        			setSelection(textinput.selectionStart, textinput.selectionEnd, true);
        		}
        	};
        }());
        
        // TODO: Migrate all of this code into path.js
        // Group: Path edit functions
        // Functions relating to editing path elements
        pathActions = canvas.pathActions = function() {
        	
        	var subpath = false;
        	var current_path;
        	var newPoint, firstCtrl;
        	
        	function resetD(p) {
        		p.setAttribute('d', pathActions.convertPath(p));
        	}
        
        	// TODO: Move into path.js
        	svgedit.path.Path.prototype.endChanges = function(text) {
        		if (svgedit.browser.isWebkit()) {resetD(this.elem);}
        		var cmd = new svgedit.history.ChangeElementCommand(this.elem, {d: this.last_d}, text);
        		addCommandToHistory(cmd);
        		call('changed', [this.elem]);
        	};
        
        	svgedit.path.Path.prototype.addPtsToSelection = function(indexes) {
        		var i, seg;
        		if (!$.isArray(indexes)) {indexes = [indexes];}
        		for (i = 0; i< indexes.length; i++) {
        			var index = indexes[i];
        			seg = this.segs[index];
        			if (seg.ptgrip) {
        				if (this.selected_pts.indexOf(index) == -1 && index >= 0) {
        					this.selected_pts.push(index);
        				}
        			}
        		}
        		this.selected_pts.sort();
        		i = this.selected_pts.length;
        		var grips = [];
        		grips.length = i;
        		// Loop through points to be selected and highlight each
        		while (i--) {
        			var pt = this.selected_pts[i];
        			seg = this.segs[pt];
        			seg.select(true);
        			grips[i] = seg.ptgrip;
        		}
        		// TODO: Correct this:
        		pathActions.canDeleteNodes = true;
        		
        		pathActions.closed_subpath = this.subpathIsClosed(this.selected_pts[0]);
        		
        		call('selected', grips);
        	};
        
        	current_path = null;
        	var drawn_path = null,
        		hasMoved = false;
        	
        	// This function converts a polyline (created by the fh_path tool) into
        	// a path element and coverts every three line segments into a single bezier
        	// curve in an attempt to smooth out the free-hand
        	var smoothPolylineIntoPath = function(element) {
        		var i, points = element.points;
        		var N = points.numberOfItems;
        		if (N >= 4) {
        			// loop through every 3 points and convert to a cubic bezier curve segment
        			// 
        			// NOTE: this is cheating, it means that every 3 points has the potential to 
        			// be a corner instead of treating each point in an equal manner. In general,
        			// this technique does not look that good.
        			// 
        			// I am open to better ideas!
        			// 
        			// Reading:
        			// - http://www.efg2.com/Lab/Graphics/Jean-YvesQueinecBezierCurves.htm
        			// - http://www.codeproject.com/KB/graphics/BezierSpline.aspx?msg=2956963
        			// - http://www.ian-ko.com/ET_GeoWizards/UserGuide/smooth.htm
        			// - http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html
        			var curpos = points.getItem(0), prevCtlPt = null;
        			var d = [];
        			d.push(['M', curpos.x, ',', curpos.y, ' C'].join(''));
        			for (i = 1; i <= (N-4); i += 3) {
        				var ct1 = points.getItem(i);
        				var ct2 = points.getItem(i+1);
        				var end = points.getItem(i+2);
        				
        				// if the previous segment had a control point, we want to smooth out
        				// the control points on both sides
        				if (prevCtlPt) {
        					var newpts = svgedit.path.smoothControlPoints( prevCtlPt, ct1, curpos );
        					if (newpts && newpts.length == 2) {
        						var prevArr = d[d.length-1].split(',');
        						prevArr[2] = newpts[0].x;
        						prevArr[3] = newpts[0].y;
        						d[d.length-1] = prevArr.join(',');
        						ct1 = newpts[1];
        					}
        				}
        				
        				d.push([ct1.x, ct1.y, ct2.x, ct2.y, end.x, end.y].join(','));
        				
        				curpos = end;
        				prevCtlPt = ct2;
        			}
        			// handle remaining line segments
        			d.push('L');
        			while (i < N) {
        				var pt = points.getItem(i);
        				d.push([pt.x, pt.y].join(','));
        				i++;
        			}
        			d = d.join(' ');
        
        			// create new path element
        			element = addSvgElementFromJson({
        				element: 'path',
        				curStyles: true,
        				attr: {
        					id: getId(),
        					d: d,
        					fill: 'none'
        				}
        			});
        			// No need to call "changed", as this is already done under mouseUp
        		}
        		return element;
        	};
        
        	return {
        		mouseDown: function(evt, mouse_target, start_x, start_y) {
        			var id;
        			if (current_mode === 'path') {
        				mouse_x = start_x;
        				mouse_y = start_y;
        				
        				var x = mouse_x/current_zoom,
        					y = mouse_y/current_zoom,
        					stretchy = svgedit.utilities.getElem('path_stretch_line');
        				newPoint = [x, y];	
        				
        				if (curConfig.gridSnapping){
        					x = svgedit.utilities.snapToGrid(x);
        					y = svgedit.utilities.snapToGrid(y);
        					mouse_x = svgedit.utilities.snapToGrid(mouse_x);
        					mouse_y = svgedit.utilities.snapToGrid(mouse_y);
        				}
        
        				if (!stretchy) {
        					stretchy = document.createElementNS(NS.SVG, 'path');
        					svgedit.utilities.assignAttributes(stretchy, {
        						id: 'path_stretch_line',
        						stroke: '#22C',
        						'stroke-width': '0.5',
        						fill: 'none'
        					});
        					stretchy = svgedit.utilities.getElem('selectorParentGroup').appendChild(stretchy);
        				}
        				stretchy.setAttribute('display', 'inline');
        				
        				var keep = null;
        				var index;
        				// if pts array is empty, create path element with M at current point
        				if (!drawn_path) {
        					d_attr = 'M' + x + ',' + y + ' ';
        					drawn_path = addSvgElementFromJson({
        						element: 'path',
        						curStyles: true,
        						attr: {
        							d: d_attr,
        							id: getNextId(),
        							opacity: cur_shape.opacity / 2
        						}
        					});
        					// set stretchy line to first point
        					stretchy.setAttribute('d', ['M', mouse_x, mouse_y, mouse_x, mouse_y].join(' '));
        					index = subpath ? svgedit.path.path.segs.length : 0;
        					svgedit.path.addPointGrip(index, mouse_x, mouse_y);
        				} else {
        					// determine if we clicked on an existing point
        					var seglist = drawn_path.pathSegList;
        					var i = seglist.numberOfItems;
        					var FUZZ = 6/current_zoom;
        					var clickOnPoint = false;
        					while (i) {
        						i --;
        						var item = seglist.getItem(i);
        						var px = item.x, py = item.y;
        						// found a matching point
        						if ( x >= (px-FUZZ) && x <= (px+FUZZ) && y >= (py-FUZZ) && y <= (py+FUZZ) ) {
        							clickOnPoint = true;
        							break;
        						}
        					}
        					
        					// get path element that we are in the process of creating
        					id = getId();
        				
        					// Remove previous path object if previously created
        					svgedit.path.removePath_(id);
        					
        					var newpath = svgedit.utilities.getElem(id);
        					var newseg;
        					var s_seg;
        					var len = seglist.numberOfItems;
        					// if we clicked on an existing point, then we are done this path, commit it
        					// (i, i+1) are the x,y that were clicked on
        					if (clickOnPoint) {
        						// if clicked on any other point but the first OR
        						// the first point was clicked on and there are less than 3 points
        						// then leave the path open
        						// otherwise, close the path
        						if (i <= 1 && len >= 2) {
        							// Create end segment
        							var abs_x = seglist.getItem(0).x;
        							var abs_y = seglist.getItem(0).y;
        							
        
        							s_seg = stretchy.pathSegList.getItem(1);
        							if (s_seg.pathSegType === 4) {
        								newseg = drawn_path.createSVGPathSegLinetoAbs(abs_x, abs_y);
        							} else {
        								newseg = drawn_path.createSVGPathSegCurvetoCubicAbs(
        									abs_x,
        									abs_y,
        									s_seg.x1 / current_zoom,
        									s_seg.y1 / current_zoom,
        									abs_x,
        									abs_y
        								);
        							}
        							
        							var endseg = drawn_path.createSVGPathSegClosePath();
        							seglist.appendItem(newseg);
        							seglist.appendItem(endseg);
        						} else if (len < 3) {
        							keep = false;
        							return keep;
        						}
        						$(stretchy).remove();
        						
        						// This will signal to commit the path
        						element = newpath;
        						drawn_path = null;
        						started = false;
        						
        						if (subpath) {
        							if (svgedit.path.path.matrix) {
        								svgedit.coords.remapElement(newpath, {}, svgedit.path.path.matrix.inverse());
        							}
        						
        							var new_d = newpath.getAttribute('d');
        							var orig_d = $(svgedit.path.path.elem).attr('d');
        							$(svgedit.path.path.elem).attr('d', orig_d + new_d);
        							$(newpath).remove();
        							if (svgedit.path.path.matrix) {
        								svgedit.path.recalcRotatedPath();
        							}
        							svgedit.path.path.init();
        							pathActions.toEditMode(svgedit.path.path.elem);
        							svgedit.path.path.selectPt();
        							return false;
        						}
        					}
        					// else, create a new point, update path element
        					else {
        						// Checks if current target or parents are #svgcontent
        						if (!$.contains(container, getMouseTarget(evt))) {
        							// Clicked outside canvas, so don't make point
        							console.log('Clicked outside canvas');
        							return false;
        						}
        
        						var num = drawn_path.pathSegList.numberOfItems;
        						var last = drawn_path.pathSegList.getItem(num -1);
        						var lastx = last.x, lasty = last.y;
        
        						if (evt.shiftKey) {
        							var xya = svgedit.math.snapToAngle(lastx, lasty, x, y);
        							x = xya.x;
        							y = xya.y;
        						}
        						
        						// Use the segment defined by stretchy
        						s_seg = stretchy.pathSegList.getItem(1);
        						if (s_seg.pathSegType === 4) {
        							newseg = drawn_path.createSVGPathSegLinetoAbs(round(x), round(y));
        						} else {
        							newseg = drawn_path.createSVGPathSegCurvetoCubicAbs(
        								round(x),
        								round(y),
        								s_seg.x1 / current_zoom,
        								s_seg.y1 / current_zoom,
        								s_seg.x2 / current_zoom,
        								s_seg.y2 / current_zoom
        							);
        						}
        						
        						drawn_path.pathSegList.appendItem(newseg);
        						
        						x *= current_zoom;
        						y *= current_zoom;
        						
        						// set stretchy line to latest point
        						stretchy.setAttribute('d', ['M', x, y, x, y].join(' '));
        						index = num;
        						if (subpath) {index += svgedit.path.path.segs.length;}
        						svgedit.path.addPointGrip(index, x, y);
        					}
        //					keep = true;
        				}
        				
        				return;
        			}
        			
        			// TODO: Make sure current_path isn't null at this point
        			if (!svgedit.path.path) {return;}
        			
        			svgedit.path.path.storeD();
        			
        			id = evt.target.id;
        			var cur_pt;
        			if (id.substr(0,14) == 'pathpointgrip_') {
        				// Select this point
        				cur_pt = svgedit.path.path.cur_pt = parseInt(id.substr(14));
        				svgedit.path.path.dragging = [start_x, start_y];
        				var seg = svgedit.path.path.segs[cur_pt];
        				
        				// only clear selection if shift is not pressed (otherwise, add 
        				// node to selection)
        				if (!evt.shiftKey) {
        					if (svgedit.path.path.selected_pts.length <= 1 || !seg.selected) {
        						svgedit.path.path.clearSelection();
        					}
        					svgedit.path.path.addPtsToSelection(cur_pt);
        				} else if (seg.selected) {
        					svgedit.path.path.removePtFromSelection(cur_pt);
        				} else {
        					svgedit.path.path.addPtsToSelection(cur_pt);
        				}
        			} else if (id.indexOf('ctrlpointgrip_') == 0) {
        				svgedit.path.path.dragging = [start_x, start_y];
        				
        				var parts = id.split('_')[1].split('c');
        				cur_pt = Number(parts[0]);
        				var ctrl_num = Number(parts[1]);
        				svgedit.path.path.selectPt(cur_pt, ctrl_num);
        			}
        
        			// Start selection box
        			if (!svgedit.path.path.dragging) {
        				if (rubberBox == null) {
        					rubberBox = selectorManager.getRubberBandBox();
        				}
        				svgedit.utilities.assignAttributes(rubberBox, {
        						'x': start_x * current_zoom,
        						'y': start_y * current_zoom,
        						'width': 0,
        						'height': 0,
        						'display': 'inline'
        				}, 100);
        			}
        		},
        		mouseMove: function(mouse_x, mouse_y) {
        			hasMoved = true;
        			if (current_mode === 'path') {
        				if (!drawn_path) {return;}
        				var seglist = drawn_path.pathSegList;
        				var index = seglist.numberOfItems - 1;
        
        				if (newPoint) {
        					// First point
        //					if (!index) {return;}
        
        					// Set control points
        					var pointGrip1 = svgedit.path.addCtrlGrip('1c1');
        					var pointGrip2 = svgedit.path.addCtrlGrip('0c2');
        					
        					// dragging pointGrip1
        					pointGrip1.setAttribute('cx', mouse_x);
        					pointGrip1.setAttribute('cy', mouse_y);
        					pointGrip1.setAttribute('display', 'inline');
        
        					var pt_x = newPoint[0];
        					var pt_y = newPoint[1];
        					
        					// set curve
        					var seg = seglist.getItem(index);
        					var cur_x = mouse_x / current_zoom;
        					var cur_y = mouse_y / current_zoom;
        					var alt_x = (pt_x + (pt_x - cur_x));
        					var alt_y = (pt_y + (pt_y - cur_y));
        					
        					pointGrip2.setAttribute('cx', alt_x * current_zoom);
        					pointGrip2.setAttribute('cy', alt_y * current_zoom);
        					pointGrip2.setAttribute('display', 'inline');
        					
        					var ctrlLine = svgedit.path.getCtrlLine(1);
        					svgedit.utilities.assignAttributes(ctrlLine, {
        						x1: mouse_x,
        						y1: mouse_y,
        						x2: alt_x * current_zoom,
        						y2: alt_y * current_zoom,
        						display: 'inline'
        					});
        
        					if (index === 0) {
        						firstCtrl = [mouse_x, mouse_y];
        					} else {
        						var last = seglist.getItem(index - 1);
        						var last_x = last.x;
        						var last_y = last.y;
        	
        						if (last.pathSegType === 6) {
        							last_x += (last_x - last.x2);
        							last_y += (last_y - last.y2);
        						} else if (firstCtrl) {
        							last_x = firstCtrl[0]/current_zoom;
        							last_y = firstCtrl[1]/current_zoom;
        						}
        						svgedit.path.replacePathSeg(6, index, [pt_x, pt_y, last_x, last_y, alt_x, alt_y], drawn_path);
        					}
        				} else {
        					var stretchy = svgedit.utilities.getElem('path_stretch_line');
        					if (stretchy) {
        						var prev = seglist.getItem(index);
        						if (prev.pathSegType === 6) {
        							var prev_x = prev.x + (prev.x - prev.x2);
        							var prev_y = prev.y + (prev.y - prev.y2);
        							svgedit.path.replacePathSeg(6, 1, [mouse_x, mouse_y, prev_x * current_zoom, prev_y * current_zoom, mouse_x, mouse_y], stretchy);							
        						} else if (firstCtrl) {
        							svgedit.path.replacePathSeg(6, 1, [mouse_x, mouse_y, firstCtrl[0], firstCtrl[1], mouse_x, mouse_y], stretchy);
        						} else {
        							svgedit.path.replacePathSeg(4, 1, [mouse_x, mouse_y], stretchy);
        						}
        					}
        				}
        				return;
        			}
        			// if we are dragging a point, let's move it
        			if (svgedit.path.path.dragging) {
        				var pt = svgedit.path.getPointFromGrip({
        					x: svgedit.path.path.dragging[0],
        					y: svgedit.path.path.dragging[1]
        				}, svgedit.path.path);
        				var mpt = svgedit.path.getPointFromGrip({
        					x: mouse_x,
        					y: mouse_y
        				}, svgedit.path.path);
        				var diff_x = mpt.x - pt.x;
        				var diff_y = mpt.y - pt.y;
        				svgedit.path.path.dragging = [mouse_x, mouse_y];
        				
        				if (svgedit.path.path.dragctrl) {
        					svgedit.path.path.moveCtrl(diff_x, diff_y);
        				} else {
        					svgedit.path.path.movePts(diff_x, diff_y);
        				}
        			} else {
        				svgedit.path.path.selected_pts = [];
        				svgedit.path.path.eachSeg(function(i) {
        					var seg = this;
        					if (!seg.next && !seg.prev) {return;}
        						
        					var item = seg.item;
        					var rbb = rubberBox.getBBox();
        					
        					var pt = svgedit.path.getGripPt(seg);
        					var pt_bb = {
        						x: pt.x,
        						y: pt.y,
        						width: 0,
        						height: 0
        					};
        				
        					var sel = svgedit.math.rectsIntersect(rbb, pt_bb);
        
        					this.select(sel);
        					//Note that addPtsToSelection is not being run
        					if (sel) {svgedit.path.path.selected_pts.push(seg.index);}
        				});
        
        			}
        		}, 
        		mouseUp: function(evt, element, mouse_x, mouse_y) {
        			
        			// Create mode
        			if (current_mode === 'path') {
        				newPoint = null;
        				if (!drawn_path) {
        					element = svgedit.utilities.getElem(getId());
        					started = false;
        					firstCtrl = null;
        				}
        
        				return {
        					keep: true,
        					element: element
        				};
        			}
        			
        			// Edit mode
        			
        			if (svgedit.path.path.dragging) {
        				var last_pt = svgedit.path.path.cur_pt;
        
        				svgedit.path.path.dragging = false;
        				svgedit.path.path.dragctrl = false;
        				svgedit.path.path.update();
        				
        				if (hasMoved) {
        					svgedit.path.path.endChanges('Move path point(s)');
        				} 
        				
        				if (!evt.shiftKey && !hasMoved) {
        					svgedit.path.path.selectPt(last_pt);
        				} 
        			} else if (rubberBox && rubberBox.getAttribute('display') != 'none') {
        				// Done with multi-node-select
        				rubberBox.setAttribute('display', 'none');
        				
        				if (rubberBox.getAttribute('width') <= 2 && rubberBox.getAttribute('height') <= 2) {
        					pathActions.toSelectMode(evt.target);
        				}
        				
        			// else, move back to select mode	
        			} else {
        				pathActions.toSelectMode(evt.target);
        			}
        			hasMoved = false;
        		},
        		toEditMode: function(element) {
        			svgedit.path.path = svgedit.path.getPath_(element);
        			current_mode = 'pathedit';
        			clearSelection();
        			svgedit.path.path.show(true).update();
        			svgedit.path.path.oldbbox = svgedit.utilities.getBBox(svgedit.path.path.elem);
        			subpath = false;
        		},
        		toSelectMode: function(elem) {
        			var selPath = (elem == svgedit.path.path.elem);
        			current_mode = 'select';
        			svgedit.path.path.show(false);
        			current_path = false;
        			clearSelection();
        			
        			if (svgedit.path.path.matrix) {
        				// Rotated, so may need to re-calculate the center
        				svgedit.path.recalcRotatedPath();
        			}
        			
        			if (selPath) {
        				call('selected', [elem]);
        				addToSelection([elem], true);
        			}
        		},
        		addSubPath: function(on) {
        			if (on) {
        				// Internally we go into "path" mode, but in the UI it will
        				// still appear as if in "pathedit" mode.
        				current_mode = 'path';
        				subpath = true;
        			} else {
        				pathActions.clear(true);
        				pathActions.toEditMode(svgedit.path.path.elem);
        			}
        		},
        		select: function(target) {
        			if (current_path === target) {
        				pathActions.toEditMode(target);
        				current_mode = 'pathedit';
        			} // going into pathedit mode
        			else {
        				current_path = target;
        			}	
        		},
        		reorient: function() {
        			var elem = selectedElements[0];
        			if (!elem) {return;}
        			var angle = svgedit.utilities.getRotationAngle(elem);
        			if (angle == 0) {return;}
        			
        			var batchCmd = new svgedit.history.BatchCommand('Reorient path');
        			var changes = {
        				d: elem.getAttribute('d'),
        				transform: elem.getAttribute('transform')
        			};
        			batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, changes));
        			clearSelection();
        			this.resetOrientation(elem);
        			
        			addCommandToHistory(batchCmd);
        
        			// Set matrix to null
        			svgedit.path.getPath_(elem).show(false).matrix = null; 
        
        			this.clear();
        	
        			addToSelection([elem], true);
        			call('changed', selectedElements);
        		},
        		
        		clear: function(remove) {
        			current_path = null;
        			if (drawn_path) {
        				var elem = svgedit.utilities.getElem(getId());
        				$(svgedit.utilities.getElem('path_stretch_line')).remove();
        				$(elem).remove();
        				$(svgedit.utilities.getElem('pathpointgrip_container')).find('*').attr('display', 'none');
        				drawn_path = firstCtrl = null;
        				started = false;
        			} else if (current_mode == 'pathedit') {
        				this.toSelectMode();
        			}
        			if (svgedit.path.path) {svgedit.path.path.init().show(false);}
        		},
        		resetOrientation: function(path) {
        			if (path == null || path.nodeName != 'path') {return false;}
        			var tlist = svgedit.transformlist.getTransformList(path);
        			var m = svgedit.math.transformListToTransform(tlist).matrix;
        			tlist.clear();
        			path.removeAttribute('transform');
        			var segList = path.pathSegList;
        			
        			// Opera/win/non-EN throws an error here.
        			// TODO: Find out why!
        			// Presumed fixed in Opera 10.5, so commented out for now
        			
        //			try {
        				var len = segList.numberOfItems;
        //			} catch(err) {
        //				var fixed_d = pathActions.convertPath(path);
        //				path.setAttribute('d', fixed_d);
        //				segList = path.pathSegList;
        //				var len = segList.numberOfItems;
        //			}
        			var i, last_x, last_y;
        
        			for (i = 0; i < len; ++i) {
        				var seg = segList.getItem(i);
        				var type = seg.pathSegType;
        				if (type == 1) {continue;}
        				var pts = [];
        				$.each(['',1,2], function(j, n) {
        					var x = seg['x'+n], y = seg['y'+n];
        					if (x !== undefined && y !== undefined) {
        						var pt = svgedit.math.transformPoint(x, y, m);
        						pts.splice(pts.length, 0, pt.x, pt.y);
        					}
        				});
        				svgedit.path.replacePathSeg(type, i, pts, path);
        			}
        			
        			reorientGrads(path, m);
        		},
        		zoomChange: function() {
        			if (current_mode == 'pathedit') {
        				svgedit.path.path.update();
        			}
        		},
        		getNodePoint: function() {
        			var sel_pt = svgedit.path.path.selected_pts.length ? svgedit.path.path.selected_pts[0] : 1;
        
        			var seg = svgedit.path.path.segs[sel_pt];
        			return {
        				x: seg.item.x,
        				y: seg.item.y,
        				type: seg.type
        			};
        		}, 
        		linkControlPoints: function(linkPoints) {
        			svgedit.path.setLinkControlPoints(linkPoints);
        		},
        		clonePathNode: function() {
        			svgedit.path.path.storeD();
        			
        			var sel_pts = svgedit.path.path.selected_pts;
        			var segs = svgedit.path.path.segs;
        			
        			var i = sel_pts.length;
        			var nums = [];
        
        			while (i--) {
        				var pt = sel_pts[i];
        				svgedit.path.path.addSeg(pt);
        				
        				nums.push(pt + i);
        				nums.push(pt + i + 1);
        			}
        			svgedit.path.path.init().addPtsToSelection(nums);
        
        			svgedit.path.path.endChanges('Clone path node(s)');
        		},
        		opencloseSubPath: function() {
        			var sel_pts = svgedit.path.path.selected_pts;
        			// Only allow one selected node for now
        			if (sel_pts.length !== 1) {return;}
        			
        			var elem = svgedit.path.path.elem;
        			var list = elem.pathSegList;
        
        			var len = list.numberOfItems;
        
        			var index = sel_pts[0];
        			
        			var open_pt = null;
        			var start_item = null;
        
        			// Check if subpath is already open
        			svgedit.path.path.eachSeg(function(i) {
        				if (this.type === 2 && i <= index) {
        					start_item = this.item;
        				}
        				if (i <= index) {return true;}
        				if (this.type === 2) {
        					// Found M first, so open
        					open_pt = i;
        					return false;
        				}
        				if (this.type === 1) {
        					// Found Z first, so closed
        					open_pt = false;
        					return false;
        				}
        			});
        			
        			if (open_pt == null) {
        				// Single path, so close last seg
        				open_pt = svgedit.path.path.segs.length - 1;
        			}
        
        			if (open_pt !== false) {
        				// Close this path
        				
        				// Create a line going to the previous "M"
        				var newseg = elem.createSVGPathSegLinetoAbs(start_item.x, start_item.y);
        			
        				var closer = elem.createSVGPathSegClosePath();
        				if (open_pt == svgedit.path.path.segs.length - 1) {
        					list.appendItem(newseg);
        					list.appendItem(closer);
        				} else {
        					svgedit.path.insertItemBefore(elem, closer, open_pt);
        					svgedit.path.insertItemBefore(elem, newseg, open_pt);
        				}
        				
        				svgedit.path.path.init().selectPt(open_pt+1);
        				return;
        			}
        			
        			// M 1,1 L 2,2 L 3,3 L 1,1 z // open at 2,2
        			// M 2,2 L 3,3 L 1,1
        			
        			// M 1,1 L 2,2 L 1,1 z M 4,4 L 5,5 L6,6 L 5,5 z 
        			// M 1,1 L 2,2 L 1,1 z [M 4,4] L 5,5 L(M)6,6 L 5,5 z 
        			
        			var seg = svgedit.path.path.segs[index];
        			
        			if (seg.mate) {
        				list.removeItem(index); // Removes last "L"
        				list.removeItem(index); // Removes the "Z"
        				svgedit.path.path.init().selectPt(index - 1);
        				return;
        			}
        			
        			var i, last_m, z_seg;
        			
        			// Find this sub-path's closing point and remove
        			for (i = 0; i<list.numberOfItems; i++) {
        				var item = list.getItem(i);
        
        				if (item.pathSegType === 2) {
        					// Find the preceding M
        					last_m = i;
        				} else if (i === index) {
        					// Remove it
        					list.removeItem(last_m);
        //						index--;
        				} else if (item.pathSegType === 1 && index < i) {
        					// Remove the closing seg of this subpath
        					z_seg = i-1;
        					list.removeItem(i);
        					break;
        				}
        			}
        			
        			var num = (index - last_m) - 1;
        			
        			while (num--) {
        				svgedit.path.insertItemBefore(elem, list.getItem(last_m), z_seg);
        			}
        			
        			var pt = list.getItem(last_m);
        			
        			// Make this point the new "M"
        			svgedit.path.replacePathSeg(2, last_m, [pt.x, pt.y]);
        			
        			i = index; // i is local here, so has no effect; what is the reason for this?
        			
        			svgedit.path.path.init().selectPt(0);
        		},
        		deletePathNode: function() {
        			if (!pathActions.canDeleteNodes) {return;}
        			svgedit.path.path.storeD();
        			
        			var sel_pts = svgedit.path.path.selected_pts;
        			var i = sel_pts.length;
        
        			while (i--) {
        				var pt = sel_pts[i];
        				svgedit.path.path.deleteSeg(pt);
        			}
        			
        			// Cleanup
        			var cleanup = function() {
        				var segList = svgedit.path.path.elem.pathSegList;
        				var len = segList.numberOfItems;
        				
        				var remItems = function(pos, count) {
        					while (count--) {
        						segList.removeItem(pos);
        					}
        				};
        
        				if (len <= 1) {return true;}
        				
        				while (len--) {
        					var item = segList.getItem(len);
        					if (item.pathSegType === 1) {
        						var prev = segList.getItem(len-1);
        						var nprev = segList.getItem(len-2);
        						if (prev.pathSegType === 2) {
        							remItems(len-1, 2);
        							cleanup();
        							break;
        						} else if (nprev.pathSegType === 2) {
        							remItems(len-2, 3);
        							cleanup();
        							break;
        						}
        
        					} else if (item.pathSegType === 2) {
        						if (len > 0) {
        							var prev_type = segList.getItem(len-1).pathSegType;
        							// Path has M M
        							if (prev_type === 2) {
        								remItems(len-1, 1);
        								cleanup();
        								break;
        							// Entire path ends with Z M 
        							} else if (prev_type === 1 && segList.numberOfItems-1 === len) {
        								remItems(len, 1);
        								cleanup();
        								break;
        							}
        						}
        					}
        				}	
        				return false;
        			};
        			
        			cleanup();
        			
        			// Completely delete a path with 1 or 0 segments
        			if (svgedit.path.path.elem.pathSegList.numberOfItems <= 1) {
        				pathActions.toSelectMode(svgedit.path.path.elem);
        				canvas.deleteSelectedElements();
        				return;
        			}
        			
        			svgedit.path.path.init();
        			svgedit.path.path.clearSelection();
        			
        			// TODO: Find right way to select point now
        			// path.selectPt(sel_pt);
        			if (window.opera) { // Opera repaints incorrectly
        				var cp = $(svgedit.path.path.elem); 
        				cp.attr('d', cp.attr('d'));
        			}
        			svgedit.path.path.endChanges('Delete path node(s)');
        		},
        		smoothPolylineIntoPath: smoothPolylineIntoPath,
        		setSegType: function(v) {
        			svgedit.path.path.setSegType(v);
        		},
        		moveNode: function(attr, newValue) {
        			var sel_pts = svgedit.path.path.selected_pts;
        			if (!sel_pts.length) {return;}
        			
        			svgedit.path.path.storeD();
        			
        			// Get first selected point
        			var seg = svgedit.path.path.segs[sel_pts[0]];
        			var diff = {x:0, y:0};
        			diff[attr] = newValue - seg.item[attr];
        			
        			seg.move(diff.x, diff.y);
        			svgedit.path.path.endChanges('Move path point');
        		},
        		fixEnd: function(elem) {
        			// Adds an extra segment if the last seg before a Z doesn't end
        			// at its M point
        			// M0,0 L0,100 L100,100 z
        			var segList = elem.pathSegList;
        			var len = segList.numberOfItems;
        			var i, last_m;
        			for (i = 0; i < len; ++i) {
        				var item = segList.getItem(i);
        				if (item.pathSegType === 2) {
        					last_m = item;
        				}
        				
        				if (item.pathSegType === 1) {
        					var prev = segList.getItem(i-1);
        					if (prev.x != last_m.x || prev.y != last_m.y) {
        						// Add an L segment here
        						var newseg = elem.createSVGPathSegLinetoAbs(last_m.x, last_m.y);
        						svgedit.path.insertItemBefore(elem, newseg, i);
        						// Can this be done better?
        						pathActions.fixEnd(elem);
        						break;
        					}
        					
        				}
        			}
        			if (svgedit.browser.isWebkit()) {resetD(elem);}
        		},
        		// Convert a path to one with only absolute or relative values
        		convertPath: function(path, toRel) {
        			var i;
        			var segList = path.pathSegList;
        			var len = segList.numberOfItems;
        			var curx = 0, cury = 0;
        			var d = '';
        			var last_m = null;
        			
        			for (i = 0; i < len; ++i) {
        				var seg = segList.getItem(i);
        				// if these properties are not in the segment, set them to zero
        				var x = seg.x || 0,
        					y = seg.y || 0,
        					x1 = seg.x1 || 0,
        					y1 = seg.y1 || 0,
        					x2 = seg.x2 || 0,
        					y2 = seg.y2 || 0;
        	
        				var type = seg.pathSegType;
        				var letter = pathMap[type]['to'+(toRel?'Lower':'Upper')+'Case']();
        				
        				var addToD = function(pnts, more, last) {
        					var str = '';
        					more = more ? ' ' + more.join(' ') : '';
        					last = last ? ' ' + svgedit.units.shortFloat(last) : '';
        					$.each(pnts, function(i, pnt) {
        						pnts[i] = svgedit.units.shortFloat(pnt);
        					});
        					d += letter + pnts.join(' ') + more + last;
        				};
        				
        				switch (type) {
        					case 1: // z,Z closepath (Z/z)
        						d += 'z';
        						break;
        					case 12: // absolute horizontal line (H)
        						x -= curx;
        					case 13: // relative horizontal line (h)
        						if (toRel) {
        							curx += x;
        							letter = 'l';
        						} else {
        							x += curx;
        							curx = x;
        							letter = 'L';
        						}
        						// Convert to "line" for easier editing
        						addToD([[x, cury]]);
        						break;
        					case 14: // absolute vertical line (V)
        						y -= cury;
        					case 15: // relative vertical line (v)
        						if (toRel) {
        							cury += y;
        							letter = 'l';
        						} else {
        							y += cury;
        							cury = y;
        							letter = 'L';
        						}
        						// Convert to "line" for easier editing
        						addToD([[curx, y]]);
        						break;
        					case 2: // absolute move (M)
        					case 4: // absolute line (L)
        					case 18: // absolute smooth quad (T)
        						x -= curx;
        						y -= cury;
        					case 5: // relative line (l)
        					case 3: // relative move (m)
        						// If the last segment was a "z", this must be relative to 
        						if (last_m && segList.getItem(i-1).pathSegType === 1 && !toRel) {
        							curx = last_m[0];
        							cury = last_m[1];
        						}
        					
        					case 19: // relative smooth quad (t)
        						if (toRel) {
        							curx += x;
        							cury += y;
        						} else {
        							x += curx;
        							y += cury;
        							curx = x;
        							cury = y;
        						}
        						if (type === 3) {last_m = [curx, cury];}
        						
        						addToD([[x, y]]);
        						break;
        					case 6: // absolute cubic (C)
        						x -= curx; x1 -= curx; x2 -= curx;
        						y -= cury; y1 -= cury; y2 -= cury;
        					case 7: // relative cubic (c)
        						if (toRel) {
        							curx += x;
        							cury += y;
        						} else {
        							x += curx; x1 += curx; x2 += curx;
        							y += cury; y1 += cury; y2 += cury;
        							curx = x;
        							cury = y;
        						}
        						addToD([[x1, y1], [x2, y2], [x, y]]);
        						break;
        					case 8: // absolute quad (Q)
        						x -= curx; x1 -= curx;
        						y -= cury; y1 -= cury;
        					case 9: // relative quad (q) 
        						if (toRel) {
        							curx += x;
        							cury += y;
        						} else {
        							x += curx; x1 += curx;
        							y += cury; y1 += cury;
        							curx = x;
        							cury = y;
        						}
        						addToD([[x1, y1],[x, y]]);
        						break;
        					case 10: // absolute elliptical arc (A)
        						x -= curx;
        						y -= cury;
        					case 11: // relative elliptical arc (a)
        						if (toRel) {
        							curx += x;
        							cury += y;
        						} else {
        							x += curx;
        							y += cury;
        							curx = x;
        							cury = y;
        						}
        						addToD([[seg.r1, seg.r2]], [
        								seg.angle,
        								(seg.largeArcFlag ? 1 : 0),
        								(seg.sweepFlag ? 1 : 0)
        							], [x, y]
        						);
        						break;
        					case 16: // absolute smooth cubic (S)
        						x -= curx; x2 -= curx;
        						y -= cury; y2 -= cury;
        					case 17: // relative smooth cubic (s)
        						if (toRel) {
        							curx += x;
        							cury += y;
        						} else {
        							x += curx; x2 += curx;
        							y += cury; y2 += cury;
        							curx = x;
        							cury = y;
        						}
        						addToD([[x2, y2],[x, y]]);
        						break;
        				} // switch on path segment type
        			} // for each segment
        			return d;
        		}
        	};
        }();
        // end pathActions
        
        // Group: Serialization
        
        // Function: removeUnusedDefElems
        // Looks at DOM elements inside the <defs> to see if they are referred to,
        // removes them from the DOM if they are not.
        // 
        // Returns:
        // The amount of elements that were removed
        var removeUnusedDefElems = this.removeUnusedDefElems = function() {
        	var defs = svgcontent.getElementsByTagNameNS(NS.SVG, 'defs');
        	if (!defs || !defs.length) {return 0;}
        	
        //	if (!defs.firstChild) {return;}
        	
        	var defelem_uses = [],
        		numRemoved = 0;
        	var attrs = ['fill', 'stroke', 'filter', 'marker-start', 'marker-mid', 'marker-end'];
        	var alen = attrs.length;
        	
        	var all_els = svgcontent.getElementsByTagNameNS(NS.SVG, '*');
        	var all_len = all_els.length;
        	
        	var i, j;
        	for (i = 0; i < all_len; i++) {
        		var el = all_els[i];
        		for (j = 0; j < alen; j++) {
        			var ref = svgedit.utilities.getUrlFromAttr(el.getAttribute(attrs[j]));
        			if (ref) {
        				defelem_uses.push(ref.substr(1));
        			}
        		}
        		
        		// gradients can refer to other gradients
        		var href = getHref(el);
        		if (href && href.indexOf('#') === 0) {
        			defelem_uses.push(href.substr(1));
        		}
        	}
        	
        	var defelems = $(defs).find('linearGradient, radialGradient, filter, marker, svg, symbol');
        	i = defelems.length;
        	while (i--) {
        		var defelem = defelems[i];
        		var id = defelem.id;
        		if (defelem_uses.indexOf(id) < 0) {
        			// Not found, so remove (but remember)
        			removedElements[id] = defelem;
        			defelem.parentNode.removeChild(defelem);
        			numRemoved++;
        		}
        	}
        
        	return numRemoved;
        };
        
        // Function: svgCanvasToString
        // Main function to set up the SVG content for output 
        //
        // Returns: 
        // String containing the SVG image for output
        this.svgCanvasToString = function() {
        	// keep calling it until there are none to remove
        	while (removeUnusedDefElems() > 0) {}
        	
        	pathActions.clear(true);
        	
        	// Keep SVG-Edit comment on top
        	$.each(svgcontent.childNodes, function(i, node) {
        		if (i && node.nodeType === 8 && node.data.indexOf('Created with') >= 0) {
        			svgcontent.insertBefore(node, svgcontent.firstChild);
        		}
        	});
        	
        	// Move out of in-group editing mode
        	if (current_group) {
        		leaveContext();
        		selectOnly([current_group]);
        	}
        	
        	var naked_svgs = [];
        	
        	// Unwrap gsvg if it has no special attributes (only id and style)
        	$(svgcontent).find('g:data(gsvg)').each(function() {
        		var attrs = this.attributes;
        		var len = attrs.length;
        		var i;
        		for (i = 0; i < len; i++) {
        			if (attrs[i].nodeName == 'id' || attrs[i].nodeName == 'style') {
        				len--;
        			}
        		}
        		// No significant attributes, so ungroup
        		if (len <= 0) {
        			var svg = this.firstChild;
        			naked_svgs.push(svg);
        			$(this).replaceWith(svg);
        		}
        	});
        	var output = this.svgToString(svgcontent, 0);
        	
        	// Rewrap gsvg
        	if (naked_svgs.length) {
        		$(naked_svgs).each(function() {
        			groupSvgElem(this);
        		});
        	}
        	
        	return output;
        };
        
        // Function: svgToString
        // Sub function ran on each SVG element to convert it to a string as desired
        // 
        // Parameters: 
        // elem - The SVG element to convert
        // indent - Integer with the amount of spaces to indent this tag
        //
        // Returns: 
        // String with the given element as an SVG tag
        this.svgToString = function(elem, indent) {
        	var out = [], 
        		toXml = svgedit.utilities.toXml;
        	var unit = curConfig.baseUnit;
        	var unit_re = new RegExp('^-?[\\d\\.]+' + unit + '$');
        
        	if (elem) {
        		cleanupElement(elem);
        		var attrs = elem.attributes,
        			attr,
        			i,
        			childs = elem.childNodes;
        		
        		for (i = 0; i < indent; i++) {out.push(' ');}
        		out.push('<'); out.push(elem.nodeName);
        		if (elem.id === 'svgcontent') {
        			// Process root element separately
        			var res = getResolution();
        			
        			var vb = '';
        			// TODO: Allow this by dividing all values by current baseVal
        			// Note that this also means we should properly deal with this on import
        //			if (curConfig.baseUnit !== 'px') {
        //				var unit = curConfig.baseUnit;
        //				var unit_m = svgedit.units.getTypeMap()[unit];
        //				res.w = svgedit.units.shortFloat(res.w / unit_m)
        //				res.h = svgedit.units.shortFloat(res.h / unit_m)
        //				vb = ' viewBox="' + [0, 0, res.w, res.h].join(' ') + '"';
        //				res.w += unit;
        //				res.h += unit;
        //			}
        			
        			if (unit !== 'px') {
        				res.w = svgedit.units.convertUnit(res.w, unit) + unit;
        				res.h = svgedit.units.convertUnit(res.h, unit) + unit;
        			}
        			
        			out.push(' width="' + res.w + '" height="' + res.h + '"' + vb + ' xmlns="'+NS.SVG+'"');
        			
        			var nsuris = {};
        			
        			// Check elements for namespaces, add if found
        			$(elem).find('*').andSelf().each(function() {
        				var el = this;
        				// for some elements have no attribute
        				var uri = this.namespaceURI;
        				if(uri && !nsuris[uri] && nsMap[uri] && nsMap[uri] !== 'xmlns' && nsMap[uri] !== 'xml' ) {
        					nsuris[uri] = true;
        					out.push(' xmlns:' + nsMap[uri] + '="' + uri +'"');
        				}
        		
        				$.each(this.attributes, function(i, attr) {
        					var uri = attr.namespaceURI;
        					if (uri && !nsuris[uri] && nsMap[uri] !== 'xmlns' && nsMap[uri] !== 'xml' ) {
        						nsuris[uri] = true;
        						out.push(' xmlns:' + nsMap[uri] + '="' + uri +'"');
        					}
        				});
        			});
        			
        			i = attrs.length;
        			var attr_names = ['width', 'height', 'xmlns', 'x', 'y', 'viewBox', 'id', 'overflow'];
        			while (i--) {
        				attr = attrs.item(i);
        				var attrVal = toXml(attr.value);
        				
        				// Namespaces have already been dealt with, so skip
        				if (attr.nodeName.indexOf('xmlns:') === 0) {continue;}
        
        				// only serialize attributes we don't use internally
        				if (attrVal != '' && attr_names.indexOf(attr.localName) == -1) {
        
        					if (!attr.namespaceURI || nsMap[attr.namespaceURI]) {
        						out.push(' '); 
        						out.push(attr.nodeName); out.push('="');
        						out.push(attrVal); out.push('"');
        					}
        				}
        			}
        		} else {
        			// Skip empty defs
        			if (elem.nodeName === 'defs' && !elem.firstChild) {return;}
        		
        			var moz_attrs = ['-moz-math-font-style', '_moz-math-font-style'];
        			for (i = attrs.length - 1; i >= 0; i--) {
        				attr = attrs.item(i);
        				var attrVal = toXml(attr.value);
        				//remove bogus attributes added by Gecko
        				if (moz_attrs.indexOf(attr.localName) >= 0) {continue;}
        				if (attrVal != '') {
        					if (attrVal.indexOf('pointer-events') === 0) {continue;}
        					if (attr.localName === 'class' && attrVal.indexOf('se_') === 0) {continue;}
        					out.push(' '); 
        					if (attr.localName === 'd') {attrVal = pathActions.convertPath(elem, true);}
        					if (!isNaN(attrVal)) {
        						attrVal = svgedit.units.shortFloat(attrVal);
        					} else if (unit_re.test(attrVal)) {
        						attrVal = svgedit.units.shortFloat(attrVal) + unit;
        					}
        					
        					// Embed images when saving 
        					if (save_options.apply
        						&& elem.nodeName === 'image' 
        						&& attr.localName === 'href'
        						&& save_options.images
        						&& save_options.images === 'embed') 
        					{
        						var img = encodableImages[attrVal];
        						if (img) {attrVal = img;}
        					}
        					
        					// map various namespaces to our fixed namespace prefixes
        					// (the default xmlns attribute itself does not get a prefix)
        					if (!attr.namespaceURI || attr.namespaceURI == NS.SVG || nsMap[attr.namespaceURI]) {
        						out.push(attr.nodeName); out.push('="');
        						out.push(attrVal); out.push('"');
        					}
        				}
        			}
        		}
        
        		if (elem.hasChildNodes()) {
        			out.push('>');
        			indent++;
        			var bOneLine = false;
        			
        			for (i = 0; i < childs.length; i++) {
        				var child = childs.item(i);
        				switch(child.nodeType) {
        				case 1: // element node
        					out.push('\n');
        					out.push(this.svgToString(childs.item(i), indent));
        					break;
        				case 3: // text node
        					var str = child.nodeValue.replace(/^\s+|\s+$/g, '');
        					if (str != '') {
        						bOneLine = true;
        						out.push(String(toXml(str)));
        					}
        					break;
        				case 4: // cdata node
        					out.push('\n');
        					out.push(new Array(indent+1).join(' '));
        					out.push('<![CDATA[');
        					out.push(child.nodeValue);
        					out.push(']]>');
        					break;
        				case 8: // comment
        					out.push('\n');
        					out.push(new Array(indent+1).join(' '));
        					out.push('<!--');
        					out.push(child.data);
        					out.push('-->');
        					break;
        				} // switch on node type
        			}
        			indent--;
        			if (!bOneLine) {
        				out.push('\n');
        				for (i = 0; i < indent; i++) {out.push(' ');}
        			}
        			out.push('</'); out.push(elem.nodeName); out.push('>');
        		} else {
        			out.push('/>');
        		}
        	}
        	return out.join('');
        }; // end svgToString()
        
        // Function: embedImage
        // Converts a given image file to a data URL when possible, then runs a given callback
        //
        // Parameters: 
        // val - String with the path/URL of the image
        // callback - Optional function to run when image data is found, supplies the
        // result (data URL or false) as first parameter.
        this.embedImage = function(val, callback) {
        	// load in the image and once it's loaded, get the dimensions
        	$(new Image()).load(function() {
        		// create a canvas the same size as the raster image
        		var canvas = document.createElement('canvas');
        		canvas.width = this.width;
        		canvas.height = this.height;
        		// load the raster image into the canvas
        		canvas.getContext('2d').drawImage(this, 0, 0);
        		// retrieve the data: URL
        		try {
        			var urldata = ';svgedit_url=' + encodeURIComponent(val);
        			urldata = canvas.toDataURL().replace(';base64', urldata+';base64');
        			encodableImages[val] = urldata;
        		} catch(e) {
        			encodableImages[val] = false;
        		}
        		last_good_img_url = val;
        		if (callback) {callback(encodableImages[val]);}
        	}).attr('src', val);
        };
        
        // Function: setGoodImage
        // Sets a given URL to be a "last good image" URL
        this.setGoodImage = function(val) {
        	last_good_img_url = val;
        };
        
        this.open = function() {
        	// Nothing by default, handled by optional widget/extension
        };
        
        // Function: save
        // Serializes the current drawing into SVG XML text and returns it to the 'saved' handler.
        // This function also includes the XML prolog. Clients of the SvgCanvas bind their save
        // function to the 'saved' event.
        //
        // Returns: 
        // Nothing
        this.save = function(opts) {
        	// remove the selected outline before serializing
        	clearSelection();
        	// Update save options if provided
        	if (opts) {$.extend(save_options, opts);}
        	save_options.apply = true;
        	
        	// no need for doctype, see http://jwatt.org/svg/authoring/#doctype-declaration
        	var str = this.svgCanvasToString();
        	call('saved', str);
        };
        
        function getIssues () {
        	// remove the selected outline before serializing
        	clearSelection();
        	
        	// Check for known CanVG issues 
        	var issues = [];
        	
        	// Selector and notice
        	var issue_list = {
        		'feGaussianBlur': uiStrings.exportNoBlur,
        		'foreignObject': uiStrings.exportNoforeignObject,
        		'[stroke-dasharray]': uiStrings.exportNoDashArray
        	};
        	var content = $(svgcontent);
        	
        	// Add font/text check if Canvas Text API is not implemented
        	if (!('font' in $('<canvas>')[0].getContext('2d'))) {
        		issue_list.text = uiStrings.exportNoText;
        	}
        	
        	$.each(issue_list, function(sel, descr) {
        		if (content.find(sel).length) {
        			issues.push(descr);
        		}
        	});
        	return issues;
        }
        
        // Function: rasterExport
        // Generates a Data URL based on the current image, then calls "exported" 
        // with an object including the string, image information, and any issues found
        this.rasterExport = function(imgType, quality, exportWindowName) {
        	var mimeType = 'image/' + imgType.toLowerCase();
        	var issues = getIssues();
        	var str = this.svgCanvasToString();
        	
        	svgedit.utilities.buildCanvgCallback(function () {
        		var type = imgType || 'PNG';
        		if (!$('#export_canvas').length) {
        			$('<canvas>', {id: 'export_canvas'}).hide().appendTo('body');
        		}
        		var c = $('#export_canvas')[0];
        		c.width = svgCanvas.contentW;
        		c.height = svgCanvas.contentH;
        		
        		canvg(c, str, {renderCallback: function() {
        			var dataURLType = (type === 'ICO' ? 'BMP' : type).toLowerCase();
        			var datauri = quality ? c.toDataURL('image/' + dataURLType, quality) : c.toDataURL('image/' + dataURLType);
        			
        			call('exported', {datauri: datauri, svg: str, issues: issues, type: imgType, mimeType: mimeType, quality: quality, exportWindowName: exportWindowName});
        		}});
        	})();
        };
        
        this.exportPDF = function (exportWindowName, outputType) {
        	var that = this;
        	svgedit.utilities.buildJSPDFCallback(function () {
        		var res = getResolution();
        		var orientation = res.w > res.h ? 'landscape' : 'portrait';
        		var units = 'pt'; // curConfig.baseUnit; // We could use baseUnit, but that is presumably not intended for export purposes
        		var doc = jsPDF({
        			orientation: orientation,
        			unit: units,
        			format: [res.w, res.h]
        			// , compressPdf: true
        		}); // Todo: Give options to use predefined jsPDF formats like "a4", etc. from pull-down (with option to keep customizable)
        		var docTitle = getDocumentTitle();
        		doc.setProperties({
        			title: docTitle/*,
        			subject: '',
        			author: '',
        			keywords: '',
        			creator: ''*/
        		});
        		var issues = getIssues();
        		var str = that.svgCanvasToString();
        		doc.addSVG(str, 0, 0);
        
        		// doc.output('save'); // Works to open in a new
        		//  window; todo: configure this and other export
        		//  options to optionally work in this manner as
        		//  opposed to opening a new tab
        		var obj = {svg: str, issues: issues, exportWindowName: exportWindowName};
        		var method = outputType || 'dataurlstring';
        		obj[method] = doc.output(method);
        		call('exportedPDF', obj);
        	})();
        };
        
        // Function: getSvgString
        // Returns the current drawing as raw SVG XML text.
        //
        // Returns:
        // The current drawing as raw SVG XML text.
        this.getSvgString = function() {
        	save_options.apply = false;
        	return this.svgCanvasToString();
        };
        
        // Function: randomizeIds
        // This function determines whether to use a nonce in the prefix, when
        // generating IDs for future documents in SVG-Edit.
        // 
        // Parameters:
        // an optional boolean, which, if true, adds a nonce to the prefix. Thus
        // svgCanvas.randomizeIds() <==> svgCanvas.randomizeIds(true)
        //
        // if you're controlling SVG-Edit externally, and want randomized IDs, call
        // this BEFORE calling svgCanvas.setSvgString
        //
        this.randomizeIds = function(enableRandomization) {
        	if (arguments.length > 0 && enableRandomization == false) {
        		svgedit.draw.randomizeIds(false, getCurrentDrawing());
        	} else {
        		svgedit.draw.randomizeIds(true, getCurrentDrawing());
        	}
        };
        
        // Function: uniquifyElems
        // Ensure each element has a unique ID
        //
        // Parameters:
        // g - The parent element of the tree to give unique IDs
        var uniquifyElems = this.uniquifyElems = function(g) {
        	var ids = {};
        	// TODO: Handle markers and connectors. These are not yet re-identified properly
        	// as their referring elements do not get remapped.
        	//
        	// <marker id='se_marker_end_svg_7'/>
        	// <polyline id='svg_7' se:connector='svg_1 svg_6' marker-end='url(#se_marker_end_svg_7)'/>
        	// 
        	// Problem #1: if svg_1 gets renamed, we do not update the polyline's se:connector attribute
        	// Problem #2: if the polyline svg_7 gets renamed, we do not update the marker id nor the polyline's marker-end attribute
        	var ref_elems = ['filter', 'linearGradient', 'pattern',	'radialGradient', 'symbol', 'textPath', 'use'];
        	
        	svgedit.utilities.walkTree(g, function(n) {
        		// if it's an element node
        		if (n.nodeType == 1) {
        			// and the element has an ID
        			if (n.id) {
        				// and we haven't tracked this ID yet
        				if (!(n.id in ids)) {
        					// add this id to our map
        					ids[n.id] = {elem:null, attrs:[], hrefs:[]};
        				}
        				ids[n.id].elem = n;
        			}
        			
        			// now search for all attributes on this element that might refer
        			// to other elements
        			$.each(ref_attrs, function(i, attr) {
        				var attrnode = n.getAttributeNode(attr);
        				if (attrnode) {
        					// the incoming file has been sanitized, so we should be able to safely just strip off the leading #
        					var url = svgedit.utilities.getUrlFromAttr(attrnode.value),
        						refid = url ? url.substr(1) : null;
        					if (refid) {
        						if (!(refid in ids)) {
        							// add this id to our map
        							ids[refid] = {elem:null, attrs:[], hrefs:[]};
        						}
        						ids[refid].attrs.push(attrnode);
        					}
        				}
        			});
        			
        			// check xlink:href now
        			var href = svgedit.utilities.getHref(n);
        			// TODO: what if an <image> or <a> element refers to an element internally?
        			if (href && ref_elems.indexOf(n.nodeName) >= 0) {
        				var refid = href.substr(1);
        				if (refid) {
        					if (!(refid in ids)) {
        						// add this id to our map
        						ids[refid] = {elem:null, attrs:[], hrefs:[]};
        					}
        					ids[refid].hrefs.push(n);
        				}
        			}						
        		}
        	});
        	
        	// in ids, we now have a map of ids, elements and attributes, let's re-identify
        	var oldid;
        	for (oldid in ids) {
        		if (!oldid) {continue;}
        		var elem = ids[oldid].elem;
        		if (elem) {
        			var newid = getNextId();
        			
        			// assign element its new id
        			elem.id = newid;
        			
        			// remap all url() attributes
        			var attrs = ids[oldid].attrs;
        			var j = attrs.length;
        			while (j--) {
        				var attr = attrs[j];
        				attr.ownerElement.setAttribute(attr.name, 'url(#' + newid + ')');
        			}
        			
        			// remap all href attributes
        			var hreffers = ids[oldid].hrefs;
        			var k = hreffers.length;
        			while (k--) {
        				var hreffer = hreffers[k];
        				svgedit.utilities.setHref(hreffer, '#' + newid);
        			}
        		}
        	}
        };
        
        // Function setUseData
        // Assigns reference data for each use element
        var setUseData = this.setUseData = function(parent) {
        	var elems = $(parent);
        	
        	if (parent.tagName !== 'use') {
        		elems = elems.find('use');
        	}
        	
        	elems.each(function() {
        		var id = getHref(this).substr(1);
        		var ref_elem = svgedit.utilities.getElem(id);
        		if (!ref_elem) {return;}
        		$(this).data('ref', ref_elem);
        		if (ref_elem.tagName == 'symbol' || ref_elem.tagName == 'svg') {
        			$(this).data('symbol', ref_elem).data('ref', ref_elem);
        		}
        	});
        };
        
        // Function convertGradients
        // Converts gradients from userSpaceOnUse to objectBoundingBox
        var convertGradients = this.convertGradients = function(elem) {
        	var elems = $(elem).find('linearGradient, radialGradient');
        	if (!elems.length && svgedit.browser.isWebkit()) {
        		// Bug in webkit prevents regular *Gradient selector search
        		elems = $(elem).find('*').filter(function() {
        			return (this.tagName.indexOf('Gradient') >= 0);
        		});
        	}
        	
        	elems.each(function() {
        		var grad = this;
        		if ($(grad).attr('gradientUnits') === 'userSpaceOnUse') {
        			// TODO: Support more than one element with this ref by duplicating parent grad
        			var elems = $(svgcontent).find('[fill="url(#' + grad.id + ')"],[stroke="url(#' + grad.id + ')"]');
        			if (!elems.length) {return;}
        			
        			// get object's bounding box
        			var bb = svgedit.utilities.getBBox(elems[0]);
        			
        			// This will occur if the element is inside a <defs> or a <symbol>,
        			// in which we shouldn't need to convert anyway.
        			if (!bb) {return;}
        			
        			if (grad.tagName === 'linearGradient') {
        				var g_coords = $(grad).attr(['x1', 'y1', 'x2', 'y2']);
        				
        				// If has transform, convert
        				var tlist = grad.gradientTransform.baseVal;
        				if (tlist && tlist.numberOfItems > 0) {
        					var m = svgedit.math.transformListToTransform(tlist).matrix;
        					var pt1 = svgedit.math.transformPoint(g_coords.x1, g_coords.y1, m);
        					var pt2 = svgedit.math.transformPoint(g_coords.x2, g_coords.y2, m);
        					
        					g_coords.x1 = pt1.x;
        					g_coords.y1 = pt1.y;
        					g_coords.x2 = pt2.x;
        					g_coords.y2 = pt2.y;
        					grad.removeAttribute('gradientTransform');
        				}
        				
        				$(grad).attr({
        					x1: (g_coords.x1 - bb.x) / bb.width,
        					y1: (g_coords.y1 - bb.y) / bb.height,
        					x2: (g_coords.x2 - bb.x) / bb.width,
        					y2: (g_coords.y2 - bb.y) / bb.height
        				});
        				grad.removeAttribute('gradientUnits');
        			}
        			// else {
        				// Note: radialGradient elements cannot be easily converted 
        				// because userSpaceOnUse will keep circular gradients, while
        				// objectBoundingBox will x/y scale the gradient according to
        				// its bbox. 
        				
        				// For now we'll do nothing, though we should probably have
        				// the gradient be updated as the element is moved, as 
        				// inkscape/illustrator do.
        			
        //						var g_coords = $(grad).attr(['cx', 'cy', 'r']);
        //						
        //						$(grad).attr({
        //							cx: (g_coords.cx - bb.x) / bb.width,
        //							cy: (g_coords.cy - bb.y) / bb.height,
        //							r: g_coords.r
        //						});
        //						
        //						grad.removeAttribute('gradientUnits');
        			// }
        		}
        	});
        };
        
        // Function: convertToGroup
        // Converts selected/given <use> or child SVG element to a group
        var convertToGroup = this.convertToGroup = function(elem) {
        	if (!elem) {
        		elem = selectedElements[0];
        	}
        	var $elem = $(elem);
        	var batchCmd = new svgedit.history.BatchCommand();
        	var ts;
        	
        	if ($elem.data('gsvg')) {
        		// Use the gsvg as the new group
        		var svg = elem.firstChild;
        		var pt = $(svg).attr(['x', 'y']);
        		
        		$(elem.firstChild.firstChild).unwrap();
        		$(elem).removeData('gsvg');
        		
        		var tlist = svgedit.transformlist.getTransformList(elem);
        		var xform = svgroot.createSVGTransform();
        		xform.setTranslate(pt.x, pt.y);
        		tlist.appendItem(xform);
        		svgedit.recalculate.recalculateDimensions(elem);
        		call('selected', [elem]);
        	} else if ($elem.data('symbol')) {
        		elem = $elem.data('symbol');
        		
        		ts = $elem.attr('transform');
        		var pos = $elem.attr(['x', 'y']);
        
        		var vb = elem.getAttribute('viewBox');
        		
        		if (vb) {
        			var nums = vb.split(' ');
        			pos.x -= +nums[0];
        			pos.y -= +nums[1];
        		}
        		
        		// Not ideal, but works
        		ts += ' translate(' + (pos.x || 0) + ',' + (pos.y || 0) + ')';
        		
        		var prev = $elem.prev();
        		
        		// Remove <use> element
        		batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand($elem[0], $elem[0].nextSibling, $elem[0].parentNode));
        		$elem.remove();
        		
        		// See if other elements reference this symbol
        		var has_more = $(svgcontent).find('use:data(symbol)').length;
        			
        		var g = svgdoc.createElementNS(NS.SVG, 'g');
        		var childs = elem.childNodes;
        		
        		var i;
        		for (i = 0; i < childs.length; i++) {
        			g.appendChild(childs[i].cloneNode(true));
        		}
        		
        		// Duplicate the gradients for Gecko, since they weren't included in the <symbol>
        		if (svgedit.browser.isGecko()) {
        			var dupeGrads = $(svgedit.utilities.findDefs()).children('linearGradient,radialGradient,pattern').clone();
        			$(g).append(dupeGrads);
        		}
        		
        		if (ts) {
        			g.setAttribute('transform', ts);
        		}
        		
        		var parent = elem.parentNode;
        		
        		uniquifyElems(g);
        		
        		// Put the dupe gradients back into <defs> (after uniquifying them)
        		if (svgedit.browser.isGecko()) {
        			$(findDefs()).append( $(g).find('linearGradient,radialGradient,pattern') );
        		}
        	
        		// now give the g itself a new id
        		g.id = getNextId();
        		
        		prev.after(g);
        		
        		if (parent) {
        			if (!has_more) {
        				// remove symbol/svg element
        				var nextSibling = elem.nextSibling;
        				parent.removeChild(elem);
        				batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(elem, nextSibling, parent));
        			}
        			batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(g));
        		}
        		
        		setUseData(g);
        		
        		if (svgedit.browser.isGecko()) {
        			convertGradients(svgedit.utilities.findDefs());
        		} else {
        			convertGradients(g);
        		}
        		
        		// recalculate dimensions on the top-level children so that unnecessary transforms
        		// are removed
        		svgedit.utilities.walkTreePost(g, function(n){
        			try {
        				svgedit.recalculate.recalculateDimensions(n);
        			} catch(e) {
        				console.log(e);
        			}
        		});
        		
        		// Give ID for any visible element missing one
        		$(g).find(visElems).each(function() {
        			if (!this.id) {this.id = getNextId();}
        		});
        		
        		selectOnly([g]);
        		
        		var cm = pushGroupProperties(g, true);
        		if (cm) {
        			batchCmd.addSubCommand(cm);
        		}
        
        		addCommandToHistory(batchCmd);
        		
        	} else {
        		console.log('Unexpected element to ungroup:', elem);
        	}
        };
        
        //
        // Function: setSvgString
        // This function sets the current drawing as the input SVG XML.
        //
        // Parameters:
        // xmlString - The SVG as XML text.
        //
        // Returns:
        // This function returns false if the set was unsuccessful, true otherwise.
        this.setSvgString = function(xmlString) {
        	try {
        		// convert string into XML document
        		var newDoc = svgedit.utilities.text2xml(xmlString);
        
        		this.prepareSvg(newDoc);
        
        		var batchCmd = new svgedit.history.BatchCommand('Change Source');
        
        		// remove old svg document
        		var nextSibling = svgcontent.nextSibling;
        		var oldzoom = svgroot.removeChild(svgcontent);
        		batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(oldzoom, nextSibling, svgroot));
        	
        		// set new svg document
        		// If DOM3 adoptNode() available, use it. Otherwise fall back to DOM2 importNode()
        		if (svgdoc.adoptNode) {
        			svgcontent = svgdoc.adoptNode(newDoc.documentElement);
        		}
        		else {
        			svgcontent = svgdoc.importNode(newDoc.documentElement, true);
        		}
        		
        		svgroot.appendChild(svgcontent);
        		var content = $(svgcontent);
        		
        		canvas.current_drawing_ = new svgedit.draw.Drawing(svgcontent, idprefix);
        		
        		// retrieve or set the nonce
        		var nonce = getCurrentDrawing().getNonce();
        		if (nonce) {
        			call('setnonce', nonce);
        		} else {
        			call('unsetnonce');
        		}
        		
        		// change image href vals if possible
        		content.find('image').each(function() {
        			var image = this;
        			preventClickDefault(image);
        			var val = getHref(this);
        			if (val) {
        				if (val.indexOf('data:') === 0) {
        					// Check if an SVG-edit data URI
        					var m = val.match(/svgedit_url=(.*?);/);
        					if (m) {
        						var url = decodeURIComponent(m[1]);
        						$(new Image()).load(function () {
        							image.setAttributeNS(NS.XLINK, 'xlink:href', url);
        						}).attr('src', url);
        					}
        				}
        				// Add to encodableImages if it loads
        				canvas.embedImage(val);
        			}
        		});
        	
        		// Wrap child SVGs in group elements
        		content.find('svg').each(function() {
        			// Skip if it's in a <defs>
        			if ($(this).closest('defs').length) {return;}
        		
        			uniquifyElems(this);
        		
        			// Check if it already has a gsvg group
        			var pa = this.parentNode;
        			if (pa.childNodes.length === 1 && pa.nodeName === 'g') {
        				$(pa).data('gsvg', this);
        				pa.id = pa.id || getNextId();
        			} else {
        				groupSvgElem(this);
        			}
        		});
        		
        		// For Firefox: Put all paint elems in defs
        		if (svgedit.browser.isGecko()) {
        			content.find('linearGradient, radialGradient, pattern').appendTo(svgedit.utilities.findDefs());
        		}
        
        		// Set ref element for <use> elements
        		
        		// TODO: This should also be done if the object is re-added through "redo"
        		setUseData(content);
        		
        		convertGradients(content[0]);
        		
        		// recalculate dimensions on the top-level children so that unnecessary transforms
        		// are removed
        		svgedit.utilities.walkTreePost(svgcontent, function(n) {
        			try {
        				svgedit.recalculate.recalculateDimensions(n);
        			} catch(e) {
        				console.log(e);
        			}
        		});
        		
        		var attrs = {
        			id: 'svgcontent',
        			overflow: curConfig.show_outside_canvas ? 'visible' : 'hidden'
        		};
        		
        		var percs = false;
        		
        		// determine proper size
        		if (content.attr('viewBox')) {
        			var vb = content.attr('viewBox').split(' ');
        			attrs.width = vb[2];
        			attrs.height = vb[3];
        		}
        		// handle content that doesn't have a viewBox
        		else {
        			$.each(['width', 'height'], function(i, dim) {
        				// Set to 100 if not given
        				var val = content.attr(dim);
        				
        				if (!val) {val = '100%';}
        				
        				if (String(val).substr(-1) === '%') {
        					// Use user units if percentage given
        					percs = true;
        				} else {
        					attrs[dim] = svgedit.units.convertToNum(dim, val);
        				}
        			});
        		}
        		
        		// identify layers
        		identifyLayers();
        		
        		// Give ID for any visible layer children missing one
        		content.children().find(visElems).each(function() {
        			if (!this.id) {this.id = getNextId();}
        		});
        		
        		// Percentage width/height, so let's base it on visible elements
        		if (percs) {
        			var bb = getStrokedBBox();
        			attrs.width = bb.width + bb.x;
        			attrs.height = bb.height + bb.y;
        		}
        		
        		// Just in case negative numbers are given or 
        		// result from the percs calculation
        		if (attrs.width <= 0) {attrs.width = 100;}
        		if (attrs.height <= 0) {attrs.height = 100;}
        		
        		content.attr(attrs);
        		this.contentW = attrs.width;
        		this.contentH = attrs.height;
        		
        		batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(svgcontent));
        		// update root to the correct size
        		var changes = content.attr(['width', 'height']);
        		batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(svgroot, changes));
        		
        		// reset zoom
        		current_zoom = 1;
        		
        		// reset transform lists
        		svgedit.transformlist.resetListMap();
        		clearSelection();
        		svgedit.path.clearData();
        		svgroot.appendChild(selectorManager.selectorParentGroup);
        		
        		addCommandToHistory(batchCmd);
        		call('changed', [svgcontent]);
        	} catch(e) {
        		console.log(e);
        		return false;
        	}
        
        	return true;
        };
        
        // Function: importSvgString
        // This function imports the input SVG XML as a <symbol> in the <defs>, then adds a
        // <use> to the current layer.
        //
        // Parameters:
        // xmlString - The SVG as XML text.
        //
        // Returns:
        // This function returns false if the import was unsuccessful, true otherwise.
        // TODO: 
        // * properly handle if namespace is introduced by imported content (must add to svgcontent
        // and update all prefixes in the imported node)
        // * properly handle recalculating dimensions, recalculateDimensions() doesn't handle
        // arbitrary transform lists, but makes some assumptions about how the transform list 
        // was obtained
        // * import should happen in top-left of current zoomed viewport	
        this.importSvgString = function(xmlString) {
        	var j, ts;
        	try {
        		// Get unique ID
        		var uid = svgedit.utilities.encode64(xmlString.length + xmlString).substr(0,32);
        		
        		var useExisting = false;
        
        		// Look for symbol and make sure symbol exists in image
        		if (import_ids[uid]) {
        			if ( $(import_ids[uid].symbol).parents('#svgroot').length ) {
        				useExisting = true;
        			}
        		}
        		
        		var batchCmd = new svgedit.history.BatchCommand('Import Image');
        		var symbol;
        		if (useExisting) {
        			symbol = import_ids[uid].symbol;
        			ts = import_ids[uid].xform;
        		} else {
        			// convert string into XML document
        			var newDoc = svgedit.utilities.text2xml(xmlString);
        	
        			this.prepareSvg(newDoc);
        	
        			// import new svg document into our document
        			var svg;
        			// If DOM3 adoptNode() available, use it. Otherwise fall back to DOM2 importNode()
        			if (svgdoc.adoptNode) {
        				svg = svgdoc.adoptNode(newDoc.documentElement);
        			} else {
        				svg = svgdoc.importNode(newDoc.documentElement, true);
        			}
        			
        			uniquifyElems(svg);
        			
        			var innerw = svgedit.units.convertToNum('width', svg.getAttribute('width')),
        				innerh = svgedit.units.convertToNum('height', svg.getAttribute('height')),
        				innervb = svg.getAttribute('viewBox'),
        				// if no explicit viewbox, create one out of the width and height
        				vb = innervb ? innervb.split(' ') : [0, 0, innerw, innerh];
        			for (j = 0; j < 4; ++j) {
        				vb[j] = +(vb[j]);
        			}
        	
        			// TODO: properly handle preserveAspectRatio
        			var canvasw = +svgcontent.getAttribute('width'),
        				canvash = +svgcontent.getAttribute('height');
        			// imported content should be 1/3 of the canvas on its largest dimension
        			
        			if (innerh > innerw) {
        				ts = 'scale(' + (canvash/3)/vb[3] + ')';
        			} else {
        				ts = 'scale(' + (canvash/3)/vb[2] + ')';
        			}
        			
        			// Hack to make recalculateDimensions understand how to scale
        			ts = 'translate(0) ' + ts + ' translate(0)';
        			
        			symbol = svgdoc.createElementNS(NS.SVG, 'symbol');
        			var defs = svgedit.utilities.findDefs();
        			
        			if (svgedit.browser.isGecko()) {
        				// Move all gradients into root for Firefox, workaround for this bug:
        				// https://bugzilla.mozilla.org/show_bug.cgi?id=353575
        				// TODO: Make this properly undo-able.
        				$(svg).find('linearGradient, radialGradient, pattern').appendTo(defs);
        			}
        	
        			while (svg.firstChild) {
        				var first = svg.firstChild;
        				symbol.appendChild(first);
        			}
        			var attrs = svg.attributes;
        			var i;
        			for (i = 0; i < attrs.length; i++) {
        				var attr = attrs[i];
        				symbol.setAttribute(attr.nodeName, attr.value);
        			}
        			symbol.id = getNextId();
        			
        			// Store data
        			import_ids[uid] = {
        				symbol: symbol,
        				xform: ts
        			};
        			
        			svgedit.utilities.findDefs().appendChild(symbol);
        			batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(symbol));
        		}
        		
        		var use_el = svgdoc.createElementNS(NS.SVG, 'use');
        		use_el.id = getNextId();
        		setHref(use_el, '#' + symbol.id);
        		
        		(current_group || getCurrentDrawing().getCurrentLayer()).appendChild(use_el);
        		batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(use_el));
        		clearSelection();
        		
        		use_el.setAttribute('transform', ts);
        		svgedit.recalculate.recalculateDimensions(use_el);
        		$(use_el).data('symbol', symbol).data('ref', symbol);
        		addToSelection([use_el]);
        		
        		// TODO: Find way to add this in a recalculateDimensions-parsable way
        //				if (vb[0] != 0 || vb[1] != 0)
        //					ts = 'translate(' + (-vb[0]) + ',' + (-vb[1]) + ') ' + ts;
        		addCommandToHistory(batchCmd);
        		call('changed', [svgcontent]);
        
        	} catch(e) {
        		console.log(e);
        		return false;
        	}
        
        	return true;
        };
        
        // TODO(codedread): Move all layer/context functions in draw.js
        // Layer API Functions
        
        // Group: Layers
        
        // Function: identifyLayers
        // Updates layer system
        var identifyLayers = canvas.identifyLayers = function() {
        	leaveContext();
        	getCurrentDrawing().identifyLayers();
        };
        
        // Function: createLayer
        // Creates a new top-level layer in the drawing with the given name, sets the current layer 
        // to it, and then clears the selection. This function then calls the 'changed' handler.
        // This is an undoable action.
        //
        // Parameters:
        // name - The given name
        this.createLayer = function(name) {
        	var batchCmd = new svgedit.history.BatchCommand('Create Layer');
        	var new_layer = getCurrentDrawing().createLayer(name);
        	batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(new_layer));
        	addCommandToHistory(batchCmd);
        	clearSelection();
        	call('changed', [new_layer]);
        };
        
        // Function: cloneLayer
        // Creates a new top-level layer in the drawing with the given name, copies all the current layer's contents
        // to it, and then clears the selection. This function then calls the 'changed' handler.
        // This is an undoable action.
        //
        // Parameters:
        // name - The given name
        this.cloneLayer = function(name) {
        	var batchCmd = new svgedit.history.BatchCommand('Duplicate Layer');
        	var new_layer = svgdoc.createElementNS(NS.SVG, 'g');
        	var layer_title = svgdoc.createElementNS(NS.SVG, 'title');
        	layer_title.textContent = name;
        	new_layer.appendChild(layer_title);
        	var current_layer = getCurrentDrawing().getCurrentLayer();
        	$(current_layer).after(new_layer);
        	var childs = current_layer.childNodes;
        	var i;
        	for (i = 0; i < childs.length; i++) {
        		var ch = childs[i];
        		if (ch.localName == 'title') {continue;}
        		new_layer.appendChild(copyElem(ch));
        	}
        	
        	clearSelection();
        	identifyLayers();
        
        	batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(new_layer));
        	addCommandToHistory(batchCmd);
        	canvas.setCurrentLayer(name);
        	call('changed', [new_layer]);
        };
        
        // Function: deleteCurrentLayer
        // Deletes the current layer from the drawing and then clears the selection. This function 
        // then calls the 'changed' handler. This is an undoable action.
        this.deleteCurrentLayer = function() {
        	var current_layer = getCurrentDrawing().getCurrentLayer();
        	var nextSibling = current_layer.nextSibling;
        	var parent = current_layer.parentNode;
        	current_layer = getCurrentDrawing().deleteCurrentLayer();
        	if (current_layer) {
        		var batchCmd = new svgedit.history.BatchCommand('Delete Layer');
        		// store in our Undo History
        		batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(current_layer, nextSibling, parent));
        		addCommandToHistory(batchCmd);
        		clearSelection();
        		call('changed', [parent]);
        		return true;
        	}
        	return false;
        };
        
        // Function: setCurrentLayer
        // Sets the current layer. If the name is not a valid layer name, then this function returns
        // false. Otherwise it returns true. This is not an undo-able action.
        //
        // Parameters:
        // name - the name of the layer you want to switch to.
        //
        // Returns:
        // true if the current layer was switched, otherwise false
        this.setCurrentLayer = function(name) {
        	var result = getCurrentDrawing().setCurrentLayer(svgedit.utilities.toXml(name));
        	if (result) {
        		clearSelection();
        	}
        	return result;
        };
        
        // Function: renameCurrentLayer
        // Renames the current layer. If the layer name is not valid (i.e. unique), then this function 
        // does nothing and returns false, otherwise it returns true. This is an undo-able action.
        // 
        // Parameters:
        // newname - the new name you want to give the current layer. This name must be unique 
        // among all layer names.
        //
        // Returns:
        // true if the rename succeeded, false otherwise.
        this.renameCurrentLayer = function(newname) {
        	var i;
        	var drawing = getCurrentDrawing();
        	if (drawing.current_layer) {
        		var oldLayer = drawing.current_layer;
        		// setCurrentLayer will return false if the name doesn't already exist
        		// this means we are free to rename our oldLayer
        		if (!canvas.setCurrentLayer(newname)) {
        			var batchCmd = new svgedit.history.BatchCommand('Rename Layer');
        			// find the index of the layer
        			for (i = 0; i < drawing.getNumLayers(); ++i) {
        				if (drawing.all_layers[i][1] == oldLayer) {break;}
        			}
        			var oldname = drawing.getLayerName(i);
        			drawing.all_layers[i][0] = svgedit.utilities.toXml(newname);
        		
        			// now change the underlying title element contents
        			var len = oldLayer.childNodes.length;
        			for (i = 0; i < len; ++i) {
        				var child = oldLayer.childNodes.item(i);
        				// found the <title> element, now append all the
        				if (child && child.tagName == 'title') {
        					// wipe out old name 
        					while (child.firstChild) { child.removeChild(child.firstChild); }
        					child.textContent = newname;
        
        					batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(child, {'#text':oldname}));
        					addCommandToHistory(batchCmd);
        					call('changed', [oldLayer]);
        					return true;
        				}
        			}
        		}
        		drawing.current_layer = oldLayer;
        	}
        	return false;
        };
        
        // Function: setCurrentLayerPosition
        // Changes the position of the current layer to the new value. If the new index is not valid, 
        // this function does nothing and returns false, otherwise it returns true. This is an
        // undo-able action.
        //
        // Parameters:
        // newpos - The zero-based index of the new position of the layer. This should be between
        // 0 and (number of layers - 1)
        // 
        // Returns:
        // true if the current layer position was changed, false otherwise.
        this.setCurrentLayerPosition = function(newpos) {
        	var oldpos, drawing = getCurrentDrawing();
        	if (drawing.current_layer && newpos >= 0 && newpos < drawing.getNumLayers()) {
        		for (oldpos = 0; oldpos < drawing.getNumLayers(); ++oldpos) {
        			if (drawing.all_layers[oldpos][1] == drawing.current_layer) {break;}
        		}
        		// some unknown error condition (current_layer not in all_layers)
        		if (oldpos == drawing.getNumLayers()) { return false; }
        		
        		if (oldpos != newpos) {
        			// if our new position is below us, we need to insert before the node after newpos
        			var refLayer = null;
        			var oldNextSibling = drawing.current_layer.nextSibling;
        			if (newpos > oldpos ) {
        				if (newpos < drawing.getNumLayers()-1) {
        					refLayer = drawing.all_layers[newpos+1][1];
        				}
        			}
        			// if our new position is above us, we need to insert before the node at newpos
        			else {
        				refLayer = drawing.all_layers[newpos][1];
        			}
        			svgcontent.insertBefore(drawing.current_layer, refLayer);
        			addCommandToHistory(new svgedit.history.MoveElementCommand(drawing.current_layer, oldNextSibling, svgcontent));
        			
        			identifyLayers();
        			canvas.setCurrentLayer(drawing.getLayerName(newpos));
        			
        			return true;
        		}
        	}
        	
        	return false;
        };
        
        // Function: setLayerVisibility
        // Sets the visibility of the layer. If the layer name is not valid, this function return 
        // false, otherwise it returns true. This is an undo-able action.
        //
        // Parameters:
        // layername - the name of the layer to change the visibility
        // bVisible - true/false, whether the layer should be visible
        //
        // Returns:
        // true if the layer's visibility was set, false otherwise
        this.setLayerVisibility = function(layername, bVisible) {
        	var drawing = getCurrentDrawing();
        	var prevVisibility = drawing.getLayerVisibility(layername);
        	var layer = drawing.setLayerVisibility(layername, bVisible);
        	if (layer) {
        		var oldDisplay = prevVisibility ? 'inline' : 'none';
        		addCommandToHistory(new svgedit.history.ChangeElementCommand(layer, {'display':oldDisplay}, 'Layer Visibility'));
        	} else {
        		return false;
        	}
        	
        	if (layer == drawing.getCurrentLayer()) {
        		clearSelection();
        		pathActions.clear();
        	}
        //		call('changed', [selected]);	
        	return true;
        };
        
        // Function: moveSelectedToLayer
        // Moves the selected elements to layername. If the name is not a valid layer name, then false 
        // is returned. Otherwise it returns true. This is an undo-able action.
        //
        // Parameters:
        // layername - the name of the layer you want to which you want to move the selected elements
        //
        // Returns:
        // true if the selected elements were moved to the layer, false otherwise.
        this.moveSelectedToLayer = function(layername) {
        	// find the layer
        	var i;
        	var layer = null;
        	var drawing = getCurrentDrawing();
        	for (i = 0; i < drawing.getNumLayers(); ++i) {
        		if (drawing.getLayerName(i) == layername) {
        			layer = drawing.all_layers[i][1];
        			break;
        		}
        	}
        	if (!layer) {return false;}
        	
        	var batchCmd = new svgedit.history.BatchCommand('Move Elements to Layer');
        	
        	// loop for each selected element and move it
        	var selElems = selectedElements;
        	i = selElems.length;
        	while (i--) {
        		var elem = selElems[i];
        		if (!elem) {continue;}
        		var oldNextSibling = elem.nextSibling;
        		// TODO: this is pretty brittle!
        		var oldLayer = elem.parentNode;
        		layer.appendChild(elem);
        		batchCmd.addSubCommand(new svgedit.history.MoveElementCommand(elem, oldNextSibling, oldLayer));
        	}
        	
        	addCommandToHistory(batchCmd);
        	
        	return true;
        };
        
        this.mergeLayer = function(skipHistory) {
        	var batchCmd = new svgedit.history.BatchCommand('Merge Layer');
        	var drawing = getCurrentDrawing();
        	var prev = $(drawing.current_layer).prev()[0];
        	if (!prev) {return;}
        	var childs = drawing.current_layer.childNodes;
        	var len = childs.length;
        	var layerNextSibling = drawing.current_layer.nextSibling;
        	batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(drawing.current_layer, layerNextSibling, svgcontent));
        
        	while (drawing.current_layer.firstChild) {
        		var ch = drawing.current_layer.firstChild;
        		if (ch.localName == 'title') {
        			var chNextSibling = ch.nextSibling;
        			batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(ch, chNextSibling, drawing.current_layer));
        			drawing.current_layer.removeChild(ch);
        			continue;
        		}
        		var oldNextSibling = ch.nextSibling;
        		prev.appendChild(ch);
        		batchCmd.addSubCommand(new svgedit.history.MoveElementCommand(ch, oldNextSibling, drawing.current_layer));
        	}
        	
        	// Remove current layer
        	svgcontent.removeChild(drawing.current_layer);
        	
        	if (!skipHistory) {
        		clearSelection();
        		identifyLayers();
        
        		call('changed', [svgcontent]);
        		
        		addCommandToHistory(batchCmd);
        	}
        	
        	drawing.current_layer = prev;
        	return batchCmd;
        };
        
        this.mergeAllLayers = function() {
        	var batchCmd = new svgedit.history.BatchCommand('Merge all Layers');
        	var drawing = getCurrentDrawing();
        	drawing.current_layer = drawing.all_layers[drawing.getNumLayers()-1][1];
        	while ($(svgcontent).children('g').length > 1) {
        		batchCmd.addSubCommand(canvas.mergeLayer(true));
        	}
        	
        	clearSelection();
        	identifyLayers();
        	call('changed', [svgcontent]);
        	addCommandToHistory(batchCmd);
        };
        
        // Function: leaveContext
        // Return from a group context to the regular kind, make any previously
        // disabled elements enabled again
        var leaveContext = this.leaveContext = function() {
        	var i, len = disabled_elems.length;
        	if (len) {
        		for (i = 0; i < len; i++) {
        			var elem = disabled_elems[i];
        			var orig = elData(elem, 'orig_opac');
        			if (orig !== 1) {
        				elem.setAttribute('opacity', orig);
        			} else {
        				elem.removeAttribute('opacity');
        			}
        			elem.setAttribute('style', 'pointer-events: inherit');
        		}
        		disabled_elems = [];
        		clearSelection(true);
        		call('contextset', null);
        	}
        	current_group = null;
        };
        
        // Function: setContext
        // Set the current context (for in-group editing)
        var setContext = this.setContext = function(elem) {
        	leaveContext();
        	if (typeof elem === 'string') {
        		elem = svgedit.utilities.getElem(elem);
        	}
        
        	// Edit inside this group
        	current_group = elem;
        	
        	// Disable other elements
        	$(elem).parentsUntil('#svgcontent').andSelf().siblings().each(function() {
        		var opac = this.getAttribute('opacity') || 1;
        		// Store the original's opacity
        		elData(this, 'orig_opac', opac);
        		this.setAttribute('opacity', opac * 0.33);
        		this.setAttribute('style', 'pointer-events: none');
        		disabled_elems.push(this);
        	});
        
        	clearSelection();
        	call('contextset', current_group);
        };
        
        // Group: Document functions
        
        // Function: clear
        // Clears the current document. This is not an undoable action.
        this.clear = function() {
        	pathActions.clear();
        
        	clearSelection();
        
        	// clear the svgcontent node
        	canvas.clearSvgContentElement();
        
        	// create new document
        	canvas.current_drawing_ = new svgedit.draw.Drawing(svgcontent);
        
        	// create empty first layer
        	canvas.createLayer('Layer 1');
        	
        	// clear the undo stack
        	canvas.undoMgr.resetUndoStack();
        
        	// reset the selector manager
        	selectorManager.initGroup();
        
        	// reset the rubber band box
        	rubberBox = selectorManager.getRubberBandBox();
        
        	call('cleared');
        };
        
        // Function: linkControlPoints
        // Alias function
        this.linkControlPoints = pathActions.linkControlPoints;
        
        // Function: getContentElem
        // Returns the content DOM element
        this.getContentElem = function() { return svgcontent; };
        
        // Function: getRootElem
        // Returns the root DOM element
        this.getRootElem = function() { return svgroot; };
        
        // Function: getSelectedElems
        // Returns the array with selected DOM elements
        this.getSelectedElems = function() { return selectedElements; };
        
        // Function: getResolution
        // Returns the current dimensions and zoom level in an object
        var getResolution = this.getResolution = function() {
        //		var vb = svgcontent.getAttribute('viewBox').split(' ');
        //		return {'w':vb[2], 'h':vb[3], 'zoom': current_zoom};
        	
        	var width = svgcontent.getAttribute('width')/current_zoom;
        	var height = svgcontent.getAttribute('height')/current_zoom;
        	
        	return {
        		'w': width,
        		'h': height,
        		'zoom': current_zoom
        	};
        };
        
        // Function: getZoom
        // Returns the current zoom level
        this.getZoom = function(){return current_zoom;};
        
        // Function: getVersion
        // Returns a string which describes the revision number of SvgCanvas.
        this.getVersion = function() {
        	return 'svgcanvas.js ($Rev$)';
        };
        
        // Function: setUiStrings
        // Update interface strings with given values
        //
        // Parameters:
        // strs - Object with strings (see uiStrings for examples)
        this.setUiStrings = function(strs) {
        	$.extend(uiStrings, strs.notification);
        };
        
        // Function: setConfig
        // Update configuration options with given values
        //
        // Parameters:
        // opts - Object with options (see curConfig for examples)
        this.setConfig = function(opts) {
        	$.extend(curConfig, opts);
        };
        
        // Function: getTitle
        // Returns the current group/SVG's title contents
        this.getTitle = function(elem) {
        	var i;
        	elem = elem || selectedElements[0];
        	if (!elem) {return;}
        	elem = $(elem).data('gsvg') || $(elem).data('symbol') || elem;
        	var childs = elem.childNodes;
        	for (i = 0; i < childs.length; i++) {
        		if (childs[i].nodeName == 'title') {
        			return childs[i].textContent;
        		}
        	}
        	return '';
        };
        
        // Function: setGroupTitle
        // Sets the group/SVG's title content
        // TODO: Combine this with setDocumentTitle
        this.setGroupTitle = function(val) {
        	var elem = selectedElements[0];
        	elem = $(elem).data('gsvg') || elem;
        	
        	var ts = $(elem).children('title');
        	
        	var batchCmd = new svgedit.history.BatchCommand('Set Label');
        	
        	if (!val.length) {
        		// Remove title element
        		var tsNextSibling = ts.nextSibling;
        		batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(ts[0], tsNextSibling, elem));
        		ts.remove();
        	} else if (ts.length) {
        		// Change title contents
        		var title = ts[0];
        		batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(title, {'#text': title.textContent}));
        		title.textContent = val;
        	} else {
        		// Add title element
        		title = svgdoc.createElementNS(NS.SVG, 'title');
        		title.textContent = val;
        		$(elem).prepend(title);
        		batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(title));
        	}
        
        	addCommandToHistory(batchCmd);
        };
        
        // Function: getDocumentTitle
        // Returns the current document title or an empty string if not found
        var getDocumentTitle = this.getDocumentTitle = function() {
        	return canvas.getTitle(svgcontent);
        };
        
        // Function: setDocumentTitle
        // Adds/updates a title element for the document with the given name.
        // This is an undoable action
        //
        // Parameters:
        // newtitle - String with the new title
        this.setDocumentTitle = function(newtitle) {
        	var i;
        	var childs = svgcontent.childNodes, doc_title = false, old_title = '';
        	
        	var batchCmd = new svgedit.history.BatchCommand('Change Image Title');
        	
        	for (i = 0; i < childs.length; i++) {
        		if (childs[i].nodeName == 'title') {
        			doc_title = childs[i];
        			old_title = doc_title.textContent;
        			break;
        		}
        	}
        	if (!doc_title) {
        		doc_title = svgdoc.createElementNS(NS.SVG, 'title');
        		svgcontent.insertBefore(doc_title, svgcontent.firstChild);
        	} 
        	
        	if (newtitle.length) {
        		doc_title.textContent = newtitle;
        	} else {
        		// No title given, so element is not necessary
        		doc_title.parentNode.removeChild(doc_title);
        	}
        	batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(doc_title, {'#text': old_title}));
        	addCommandToHistory(batchCmd);
        };
        
        // Function: getEditorNS
        // Returns the editor's namespace URL, optionally adds it to root element
        //
        // Parameters:
        // add - Boolean to indicate whether or not to add the namespace value
        this.getEditorNS = function(add) {
        	if (add) {
        		svgcontent.setAttribute('xmlns:se', NS.SE);
        	}
        	return NS.SE;
        };
        
        // Function: setResolution
        // Changes the document's dimensions to the given size
        //
        // Parameters: 
        // x - Number with the width of the new dimensions in user units. 
        // Can also be the string "fit" to indicate "fit to content"
        // y - Number with the height of the new dimensions in user units. 
        //
        // Returns:
        // Boolean to indicate if resolution change was succesful. 
        // It will fail on "fit to content" option with no content to fit to.
        this.setResolution = function(x, y) {
        	var res = getResolution();
        	var w = res.w, h = res.h;
        	var batchCmd;
        
        	if (x == 'fit') {
        		// Get bounding box
        		var bbox = getStrokedBBox();
        		
        		if (bbox) {
        			batchCmd = new svgedit.history.BatchCommand('Fit Canvas to Content');
        			var visEls = getVisibleElements();
        			addToSelection(visEls);
        			var dx = [], dy = [];
        			$.each(visEls, function(i, item) {
        				dx.push(bbox.x*-1);
        				dy.push(bbox.y*-1);
        			});
        			
        			var cmd = canvas.moveSelectedElements(dx, dy, true);
        			batchCmd.addSubCommand(cmd);
        			clearSelection();
        			
        			x = Math.round(bbox.width);
        			y = Math.round(bbox.height);
        		} else {
        			return false;
        		}
        	}
        	if (x != w || y != h) {
        		var handle = svgroot.suspendRedraw(1000);
        		if (!batchCmd) {
        			batchCmd = new svgedit.history.BatchCommand('Change Image Dimensions');
        		}
        
        		x = svgedit.units.convertToNum('width', x);
        		y = svgedit.units.convertToNum('height', y);
        		
        		svgcontent.setAttribute('width', x);
        		svgcontent.setAttribute('height', y);
        		
        		this.contentW = x;
        		this.contentH = y;
        		batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(svgcontent, {'width':w, 'height':h}));
        
        		svgcontent.setAttribute('viewBox', [0, 0, x/current_zoom, y/current_zoom].join(' '));
        		batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(svgcontent, {'viewBox': ['0 0', w, h].join(' ')}));
        	
        		addCommandToHistory(batchCmd);
        		svgroot.unsuspendRedraw(handle);
        		call('changed', [svgcontent]);
        	}
        	return true;
        };
        
        // Function: getOffset
        // Returns an object with x, y values indicating the svgcontent element's
        // position in the editor's canvas.
        this.getOffset = function() {
        	return $(svgcontent).attr(['x', 'y']);
        };
        
        // Function: setBBoxZoom
        // Sets the zoom level on the canvas-side based on the given value
        // 
        // Parameters:
        // val - Bounding box object to zoom to or string indicating zoom option 
        // editor_w - Integer with the editor's workarea box's width
        // editor_h - Integer with the editor's workarea box's height
        this.setBBoxZoom = function(val, editor_w, editor_h) {
        	var spacer = 0.85;
        	var bb;
        	var calcZoom = function(bb) {
        		if (!bb) {return false;}
        		var w_zoom = Math.round((editor_w / bb.width)*100 * spacer)/100;
        		var h_zoom = Math.round((editor_h / bb.height)*100 * spacer)/100;	
        		var zoomlevel = Math.min(w_zoom, h_zoom);
        		canvas.setZoom(zoomlevel);
        		return {'zoom': zoomlevel, 'bbox': bb};
        	};
        	
        	if (typeof val == 'object') {
        		bb = val;
        		if (bb.width == 0 || bb.height == 0) {
        			var newzoom = bb.zoom ? bb.zoom : current_zoom * bb.factor;
        			canvas.setZoom(newzoom);
        			return {'zoom': current_zoom, 'bbox': bb};
        		}
        		return calcZoom(bb);
        	}
        
        	switch (val) {
        		case 'selection':
        			if (!selectedElements[0]) {return;}
        			var sel_elems = $.map(selectedElements, function(n){ if (n) {return n;} });
        			bb = getStrokedBBox(sel_elems);
        			break;
        		case 'canvas':
        			var res = getResolution();
        			spacer = 0.95;
        			bb = {width:res.w, height:res.h , x:0, y:0};
        			break;
        		case 'content':
        			bb = getStrokedBBox();
        			break;
        		case 'layer':
        			bb = getStrokedBBox(getVisibleElements(getCurrentDrawing().getCurrentLayer()));
        			break;
        		default:
        			return;
        	}
        	return calcZoom(bb);
        };
        
        // Function: setZoom
        // Sets the zoom to the given level
        //
        // Parameters:
        // zoomlevel - Float indicating the zoom level to change to
        this.setZoom = function(zoomlevel) {
        	var res = getResolution();
        	svgcontent.setAttribute('viewBox', '0 0 ' + res.w/zoomlevel + ' ' + res.h/zoomlevel);
        	current_zoom = zoomlevel;
        	$.each(selectedElements, function(i, elem) {
        		if (!elem) {return;}
        		selectorManager.requestSelector(elem).resize();
        	});
        	pathActions.zoomChange();
        	runExtensions('zoomChanged', zoomlevel);
        };
        
        // Function: getMode
        // Returns the current editor mode string
        this.getMode = function() {
        	return current_mode;
        };
        
        // Function: setMode
        // Sets the editor's mode to the given string
        //
        // Parameters:
        // name - String with the new mode to change to
        this.setMode = function(name) {
        	pathActions.clear(true);
        	textActions.clear();
        	cur_properties = (selectedElements[0] && selectedElements[0].nodeName == 'text') ? cur_text : cur_shape;
        	current_mode = name;
        };
        
        // Group: Element Styling
        
        // Function: getColor
        // Returns the current fill/stroke option
        this.getColor = function(type) {
        	return cur_properties[type];
        };
        
        // Function: setColor
        // Change the current stroke/fill color/gradient value
        // 
        // Parameters:
        // type - String indicating fill or stroke
        // val - The value to set the stroke attribute to
        // preventUndo - Boolean indicating whether or not this should be and undoable option
        this.setColor = function(type, val, preventUndo) {
        	cur_shape[type] = val;
        	cur_properties[type + '_paint'] = {type:'solidColor'};
        	var elems = [];
        	function addNonG (e) {
        		if (e.nodeName != 'g') {
        			elems.push(e);
        		}
        	}
        	var i = selectedElements.length;
        	while (i--) {
        		var elem = selectedElements[i];
        		if (elem) {
        			if (elem.tagName == 'g') {
        				svgedit.utilities.walkTree(elem, addNonG);
        			} else {
        				if (type == 'fill') {
        					if (elem.tagName != 'polyline' && elem.tagName != 'line') {
        						elems.push(elem);
        					}
        				} else {
        					elems.push(elem);
        				}
        			}
        		}
        	}
        	if (elems.length > 0) {
        		if (!preventUndo) {
        			changeSelectedAttribute(type, val, elems);
        			call('changed', elems);
        		} else {
        			changeSelectedAttributeNoUndo(type, val, elems);
        		}
        	}
        };
        
        // Function: setGradient
        // Apply the current gradient to selected element's fill or stroke
        //
        // Parameters
        // type - String indicating "fill" or "stroke" to apply to an element
        var setGradient = this.setGradient = function(type) {
        	if (!cur_properties[type + '_paint'] || cur_properties[type + '_paint'].type == 'solidColor') {return;}
        	var grad = canvas[type + 'Grad'];
        	// find out if there is a duplicate gradient already in the defs
        	var duplicate_grad = findDuplicateGradient(grad);
        	var defs = svgedit.utilities.findDefs();
        	// no duplicate found, so import gradient into defs
        	if (!duplicate_grad) {
        		var orig_grad = grad;
        		grad = defs.appendChild( svgdoc.importNode(grad, true) );
        		// get next id and set it on the grad
        		grad.id = getNextId();
        	} else { // use existing gradient
        		grad = duplicate_grad;
        	}
        	canvas.setColor(type, 'url(#' + grad.id + ')');
        };
        
        // Function: findDuplicateGradient
        // Check if exact gradient already exists
        //
        // Parameters:
        // grad - The gradient DOM element to compare to others
        //
        // Returns:
        // The existing gradient if found, null if not
        var findDuplicateGradient = function(grad) {
        	var defs = svgedit.utilities.findDefs();
        	var existing_grads = $(defs).find('linearGradient, radialGradient');
        	var i = existing_grads.length;
        	var rad_attrs = ['r', 'cx', 'cy', 'fx', 'fy'];
        	while (i--) {
        		var og = existing_grads[i];
        		if (grad.tagName == 'linearGradient') {
        			if (grad.getAttribute('x1') != og.getAttribute('x1') ||
        				grad.getAttribute('y1') != og.getAttribute('y1') ||
        				grad.getAttribute('x2') != og.getAttribute('x2') ||
        				grad.getAttribute('y2') != og.getAttribute('y2')) 
        			{
        				continue;
        			}
        		} else {
        			var grad_attrs = $(grad).attr(rad_attrs);
        			var og_attrs = $(og).attr(rad_attrs);
        			
        			var diff = false;
        			$.each(rad_attrs, function(i, attr) {
        				if (grad_attrs[attr] != og_attrs[attr]) {diff = true;}
        			});
        			
        			if (diff) {continue;}
        		}
        		
        		// else could be a duplicate, iterate through stops
        		var stops = grad.getElementsByTagNameNS(NS.SVG, 'stop');
        		var ostops = og.getElementsByTagNameNS(NS.SVG, 'stop');
        
        		if (stops.length != ostops.length) {
        			continue;
        		}
        
        		var j = stops.length;
        		while (j--) {
        			var stop = stops[j];
        			var ostop = ostops[j];
        
        			if (stop.getAttribute('offset') != ostop.getAttribute('offset') ||
        				stop.getAttribute('stop-opacity') != ostop.getAttribute('stop-opacity') ||
        				stop.getAttribute('stop-color') != ostop.getAttribute('stop-color')) 
        			{
        				break;
        			}
        		}
        
        		if (j == -1) {
        			return og;
        		}
        	} // for each gradient in defs
        
        	return null;
        };
        
        function reorientGrads(elem, m) {
        	var i;
        	var bb = svgedit.utilities.getBBox(elem);
        	for (i = 0; i < 2; i++) {
        		var type = i === 0 ? 'fill' : 'stroke';
        		var attrVal = elem.getAttribute(type);
        		if (attrVal && attrVal.indexOf('url(') === 0) {
        			var grad = svgedit.utilities.getRefElem(attrVal);
        			if (grad.tagName === 'linearGradient') {
        				var x1 = grad.getAttribute('x1') || 0;
        				var y1 = grad.getAttribute('y1') || 0;
        				var x2 = grad.getAttribute('x2') || 1;
        				var y2 = grad.getAttribute('y2') || 0;
        				
        				// Convert to USOU points
        				x1 = (bb.width * x1) + bb.x;
        				y1 = (bb.height * y1) + bb.y;
        				x2 = (bb.width * x2) + bb.x;
        				y2 = (bb.height * y2) + bb.y;
        			
        				// Transform those points
        				var pt1 = svgedit.math.transformPoint(x1, y1, m);
        				var pt2 = svgedit.math.transformPoint(x2, y2, m);
        				
        				// Convert back to BB points
        				var g_coords = {};
        				
        				g_coords.x1 = (pt1.x - bb.x) / bb.width;
        				g_coords.y1 = (pt1.y - bb.y) / bb.height;
        				g_coords.x2 = (pt2.x - bb.x) / bb.width;
        				g_coords.y2 = (pt2.y - bb.y) / bb.height;
        		
        				var newgrad = grad.cloneNode(true);
        				$(newgrad).attr(g_coords);
        	
        				newgrad.id = getNextId();
        				svgedit.utilities.findDefs().appendChild(newgrad);
        				elem.setAttribute(type, 'url(#' + newgrad.id + ')');
        			}
        		}
        	}
        }
        
        // Function: setPaint
        // Set a color/gradient to a fill/stroke
        //
        // Parameters:
        // type - String with "fill" or "stroke"
        // paint - The jGraduate paint object to apply
        this.setPaint = function(type, paint) {
        	// make a copy
        	var p = new $.jGraduate.Paint(paint);
        	this.setPaintOpacity(type, p.alpha / 100, true);
        
        	// now set the current paint object
        	cur_properties[type + '_paint'] = p;
        	switch (p.type) {
        		case 'solidColor':
        			this.setColor(type, p.solidColor != 'none' ? '#' + p.solidColor : 'none');
        			break;
        		case 'linearGradient':
        		case 'radialGradient':
        			canvas[type + 'Grad'] = p[p.type];
        			setGradient(type);
        			break;
        	}
        };
        
        // alias
        this.setStrokePaint = function(paint) {
        	this.setPaint('stroke', paint);
        };
        
        this.setFillPaint = function(paint) {
        	this.setPaint('fill', paint);
        };
        
        // Function: getStrokeWidth
        // Returns the current stroke-width value
        this.getStrokeWidth = function() {
        	return cur_properties.stroke_width;
        };
        
        // Function: setStrokeWidth
        // Sets the stroke width for the current selected elements
        // When attempting to set a line's width to 0, this changes it to 1 instead
        //
        // Parameters:
        // val - A Float indicating the new stroke width value
        this.setStrokeWidth = function(val) {
        	if (val == 0 && ['line', 'path'].indexOf(current_mode) >= 0) {
        		canvas.setStrokeWidth(1);
        		return;
        	}
        	cur_properties.stroke_width = val;
        
        	var elems = [];
        	function addNonG (e) {
        		if (e.nodeName != 'g') {
        			elems.push(e);
        		}
        	}
        	var i = selectedElements.length;
        	while (i--) {
        		var elem = selectedElements[i];
        		if (elem) {
        			if (elem.tagName == 'g') {
        				svgedit.utilities.walkTree(elem, addNonG);
        			}
        			else {
        				elems.push(elem);
        			}
        		}
        	}
        	if (elems.length > 0) {
        		changeSelectedAttribute('stroke-width', val, elems);
        		call('changed', selectedElements);
        	}
        };
        
        // Function: setStrokeAttr
        // Set the given stroke-related attribute the given value for selected elements
        //
        // Parameters:
        // attr - String with the attribute name
        // val - String or number with the attribute value
        this.setStrokeAttr = function(attr, val) {
        	cur_shape[attr.replace('-', '_')] = val;
        	var elems = [];
        	function addNonG (e) {
        		if (e.nodeName != 'g') {
        			elems.push(e);
        		}
        	}
        	var i = selectedElements.length;
        	while (i--) {
        		var elem = selectedElements[i];
        		if (elem) {
        			if (elem.tagName == 'g') {
        				svgedit.utilities.walkTree(elem, function(e){if (e.nodeName!='g') {elems.push(e);}});
        			}
        			else {
        				elems.push(elem);
        			}
        		}
        	}
        	if (elems.length > 0) {
        		changeSelectedAttribute(attr, val, elems);
        		call('changed', selectedElements);
        	}
        };
        
        // Function: getStyle
        // Returns current style options
        this.getStyle = function() {
        	return cur_shape;
        };
        
        // Function: getOpacity
        // Returns the current opacity
        this.getOpacity = function() {
        	return cur_shape.opacity;
        };
        
        // Function: setOpacity
        // Sets the given opacity to the current selected elements
        this.setOpacity = function(val) {
        	cur_shape.opacity = val;
        	changeSelectedAttribute('opacity', val);
        };
        
        // Function: getOpacity
        // Returns the current fill opacity
        this.getFillOpacity = function() {
        	return cur_shape.fill_opacity;
        };
        
        // Function: getStrokeOpacity
        // Returns the current stroke opacity
        this.getStrokeOpacity = function() {
        	return cur_shape.stroke_opacity;
        };
        
        // Function: setPaintOpacity
        // Sets the current fill/stroke opacity
        //
        // Parameters:
        // type - String with "fill" or "stroke"
        // val - Float with the new opacity value
        // preventUndo - Boolean indicating whether or not this should be an undoable action
        this.setPaintOpacity = function(type, val, preventUndo) {
        	cur_shape[type + '_opacity'] = val;
        	if (!preventUndo) {
        		changeSelectedAttribute(type + '-opacity', val);
        	}
        	else {
        		changeSelectedAttributeNoUndo(type + '-opacity', val);
        	}
        };
        
        // Function: getPaintOpacity
        // Gets the current fill/stroke opacity
        //
        // Parameters:
        // type - String with "fill" or "stroke"
        this.getPaintOpacity = function(type) {
        	return type === 'fill' ? this.getFillOpacity() : this.getStrokeOpacity();
        };
        
        // Function: getBlur
        // Gets the stdDeviation blur value of the given element
        //
        // Parameters:
        // elem - The element to check the blur value for
        this.getBlur = function(elem) {
        	var val = 0;
        //	var elem = selectedElements[0];
        
        	if (elem) {
        		var filter_url = elem.getAttribute('filter');
        		if (filter_url) {
        			var blur = svgedit.utilities.getElem(elem.id + '_blur');
        			if (blur) {
        				val = blur.firstChild.getAttribute('stdDeviation');
        			}
        		}
        	}
        	return val;
        };
        
        (function() {
        	var cur_command = null;
        	var filter = null;
        	var filterHidden = false;
        	
        	// Function: setBlurNoUndo
        	// Sets the stdDeviation blur value on the selected element without being undoable
        	//
        	// Parameters:
        	// val - The new stdDeviation value
        	canvas.setBlurNoUndo = function(val) {
        		if (!filter) {
        			canvas.setBlur(val);
        			return;
        		}
        		if (val === 0) {
        			// Don't change the StdDev, as that will hide the element.
        			// Instead, just remove the value for "filter"
        			changeSelectedAttributeNoUndo('filter', '');
        			filterHidden = true;
        		} else {
        			var elem = selectedElements[0];
        			if (filterHidden) {
        				changeSelectedAttributeNoUndo('filter', 'url(#' + elem.id + '_blur)');
        			}
        			if (svgedit.browser.isWebkit()) {
        				console.log('e', elem);
        				elem.removeAttribute('filter');
        				elem.setAttribute('filter', 'url(#' + elem.id + '_blur)');
        			}
        			changeSelectedAttributeNoUndo('stdDeviation', val, [filter.firstChild]);
        			canvas.setBlurOffsets(filter, val);
        		}
        	};
        	
        	function finishChange() {
        		var bCmd = canvas.undoMgr.finishUndoableChange();
        		cur_command.addSubCommand(bCmd);
        		addCommandToHistory(cur_command);
        		cur_command = null;	
        		filter = null;
        	}
        
        	// Function: setBlurOffsets
        	// Sets the x, y, with, height values of the filter element in order to
        	// make the blur not be clipped. Removes them if not neeeded
        	//
        	// Parameters:
        	// filter - The filter DOM element to update
        	// stdDev - The standard deviation value on which to base the offset size
        	canvas.setBlurOffsets = function(filter, stdDev) {
        		if (stdDev > 3) {
        			// TODO: Create algorithm here where size is based on expected blur
        			svgedit.utilities.assignAttributes(filter, {
        				x: '-50%',
        				y: '-50%',
        				width: '200%',
        				height: '200%'
        			}, 100);
        		} else {
        			// Removing these attributes hides text in Chrome (see Issue 579)
        			if (!svgedit.browser.isWebkit()) {
        				filter.removeAttribute('x');
        				filter.removeAttribute('y');
        				filter.removeAttribute('width');
        				filter.removeAttribute('height');
        			}
        		}
        	};
        
        	// Function: setBlur 
        	// Adds/updates the blur filter to the selected element
        	//
        	// Parameters:
        	// val - Float with the new stdDeviation blur value
        	// complete - Boolean indicating whether or not the action should be completed (to add to the undo manager)
        	canvas.setBlur = function(val, complete) {
        		if (cur_command) {
        			finishChange();
        			return;
        		}
        	
        		// Looks for associated blur, creates one if not found
        		var elem = selectedElements[0];
        		var elem_id = elem.id;
        		filter = svgedit.utilities.getElem(elem_id + '_blur');
        		
        		val -= 0;
        		
        		var batchCmd = new svgedit.history.BatchCommand();
        		
        		// Blur found!
        		if (filter) {
        			if (val === 0) {
        				filter = null;
        			}
        		} else {
        			// Not found, so create
        			var newblur = addSvgElementFromJson({ 'element': 'feGaussianBlur',
        				'attr': {
        					'in': 'SourceGraphic',
        					'stdDeviation': val
        				}
        			});
        			
        			filter = addSvgElementFromJson({ 'element': 'filter',
        				'attr': {
        					'id': elem_id + '_blur'
        				}
        			});
        			
        			filter.appendChild(newblur);
        			svgedit.utilities.findDefs().appendChild(filter);
        			
        			batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(filter));
        		}
        
        		var changes = {filter: elem.getAttribute('filter')};
        		
        		if (val === 0) {
        			elem.removeAttribute('filter');
        			batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, changes));
        			return;
        		}
        
        		changeSelectedAttribute('filter', 'url(#' + elem_id + '_blur)');
        		batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, changes));
        		canvas.setBlurOffsets(filter, val);
        		
        		cur_command = batchCmd;
        		canvas.undoMgr.beginUndoableChange('stdDeviation', [filter?filter.firstChild:null]);
        		if (complete) {
        			canvas.setBlurNoUndo(val);
        			finishChange();
        		}
        	};
        }());
        
        // Function: getBold
        // Check whether selected element is bold or not
        //
        // Returns:
        // Boolean indicating whether or not element is bold
        this.getBold = function() {
        	// should only have one element selected
        	var selected = selectedElements[0];
        	if (selected != null && selected.tagName == 'text' &&
        		selectedElements[1] == null) 
        	{
        		return (selected.getAttribute('font-weight') == 'bold');
        	}
        	return false;
        };
        
        // Function: setBold
        // Make the selected element bold or normal
        //
        // Parameters:
        // b - Boolean indicating bold (true) or normal (false)
        this.setBold = function(b) {
        	var selected = selectedElements[0];
        	if (selected != null && selected.tagName == 'text' &&
        		selectedElements[1] == null) 
        	{
        		changeSelectedAttribute('font-weight', b ? 'bold' : 'normal');
        	}
        	if (!selectedElements[0].textContent) {
        		textActions.setCursor();
        	}
        };
        
        // Function: getItalic
        // Check whether selected element is italic or not
        //
        // Returns:
        // Boolean indicating whether or not element is italic
        this.getItalic = function() {
        	var selected = selectedElements[0];
        	if (selected != null && selected.tagName == 'text' &&
        		selectedElements[1] == null) 
        	{
        		return (selected.getAttribute('font-style') == 'italic');
        	}
        	return false;
        };
        
        // Function: setItalic
        // Make the selected element italic or normal
        //
        // Parameters:
        // b - Boolean indicating italic (true) or normal (false)
        this.setItalic = function(i) {
        	var selected = selectedElements[0];
        	if (selected != null && selected.tagName == 'text' &&
        		selectedElements[1] == null) 
        	{
        		changeSelectedAttribute('font-style', i ? 'italic' : 'normal');
        	}
        	if (!selectedElements[0].textContent) {
        		textActions.setCursor();
        	}
        };
        
        // Function: getFontFamily
        // Returns the current font family
        this.getFontFamily = function() {
        	return cur_text.font_family;
        };
        
        // Function: setFontFamily
        // Set the new font family
        //
        // Parameters:
        // val - String with the new font family
        this.setFontFamily = function(val) {
        	cur_text.font_family = val;
        	changeSelectedAttribute('font-family', val);
        	if (selectedElements[0] && !selectedElements[0].textContent) {
        		textActions.setCursor();
        	}
        };
        
        
        // Function: setFontColor
        // Set the new font color
        //
        // Parameters:
        // val - String with the new font color
        this.setFontColor = function(val) {
        	cur_text.fill = val;
        	changeSelectedAttribute('fill', val);
        };
        
        // Function: getFontColor
        // Returns the current font color
        this.getFontColor = function() {
        	return cur_text.fill;
        };
        
        // Function: getFontSize
        // Returns the current font size
        this.getFontSize = function() {
        	return cur_text.font_size;
        };
        
        // Function: setFontSize
        // Applies the given font size to the selected element
        //
        // Parameters:
        // val - Float with the new font size
        this.setFontSize = function(val) {
        	cur_text.font_size = val;
        	changeSelectedAttribute('font-size', val);
        	if (!selectedElements[0].textContent) {
        		textActions.setCursor();
        	}
        };
        
        // Function: getText
        // Returns the current text (textContent) of the selected element
        this.getText = function() {
        	var selected = selectedElements[0];
        	if (selected == null) { return ''; }
        	return selected.textContent;
        };
        
        // Function: setTextContent
        // Updates the text element with the given string
        //
        // Parameters:
        // val - String with the new text
        this.setTextContent = function(val) {
        	changeSelectedAttribute('#text', val);
        	textActions.init(val);
        	textActions.setCursor();
        };
        
        // Function: setImageURL
        // Sets the new image URL for the selected image element. Updates its size if
        // a new URL is given
        // 
        // Parameters:
        // val - String with the image URL/path
        this.setImageURL = function(val) {
        	var elem = selectedElements[0];
        	if (!elem) {return;}
        	
        	var attrs = $(elem).attr(['width', 'height']);
        	var setsize = (!attrs.width || !attrs.height);
        
        	var cur_href = getHref(elem);
        	
        	// Do nothing if no URL change or size change
        	if (cur_href !== val) {
        		setsize = true;
        	} else if (!setsize) {return;}
        
        	var batchCmd = new svgedit.history.BatchCommand('Change Image URL');
        
        	setHref(elem, val);
        	batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, {
        		'#href': cur_href
        	}));
        
        	if (setsize) {
        		$(new Image()).load(function() {
        			var changes = $(elem).attr(['width', 'height']);
        		
        			$(elem).attr({
        				width: this.width,
        				height: this.height
        			});
        			
        			selectorManager.requestSelector(elem).resize();
        			
        			batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, changes));
        			addCommandToHistory(batchCmd);
        			call('changed', [elem]);
        		}).attr('src', val);
        	} else {
        		addCommandToHistory(batchCmd);
        	}
        };
        
        // Function: setLinkURL
        // Sets the new link URL for the selected anchor element.
        // 
        // Parameters:
        // val - String with the link URL/path
        this.setLinkURL = function(val) {
        	var elem = selectedElements[0];
        	if (!elem) {return;}
        	if (elem.tagName !== 'a') {
        		// See if parent is an anchor
        		var parents_a = $(elem).parents('a');
        		if (parents_a.length) {
        			elem = parents_a[0];
        		} else {
        			return;
        		}
        	}
        	
        	var cur_href = getHref(elem);
        	
        	if (cur_href === val) {return;}
        	
        	var batchCmd = new svgedit.history.BatchCommand('Change Link URL');
        
        	setHref(elem, val);
        	batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(elem, {
        		'#href': cur_href
        	}));
        
        	addCommandToHistory(batchCmd);
        };
        
        
        // Function: setRectRadius
        // Sets the rx & ry values to the selected rect element to change its corner radius
        // 
        // Parameters:
        // val - The new radius
        this.setRectRadius = function(val) {
        	var selected = selectedElements[0];
        	if (selected != null && selected.tagName == 'rect') {
        		var r = selected.getAttribute('rx');
        		if (r != val) {
        			selected.setAttribute('rx', val);
        			selected.setAttribute('ry', val);
        			addCommandToHistory(new svgedit.history.ChangeElementCommand(selected, {'rx':r, 'ry':r}, 'Radius'));
        			call('changed', [selected]);
        		}
        	}
        };
        
        // Function: makeHyperlink
        // Wraps the selected element(s) in an anchor element or converts group to one
        this.makeHyperlink = function(url) {
        	canvas.groupSelectedElements('a', url);
        	
        	// TODO: If element is a single "g", convert to "a"
        	//	if (selectedElements.length > 1 && selectedElements[1]) {
        
        };
        
        // Function: removeHyperlink
        this.removeHyperlink = function() {
        	canvas.ungroupSelectedElement();
        };
        
        // Group: Element manipulation
        
        // Function: setSegType
        // Sets the new segment type to the selected segment(s). 
        //
        // Parameters:
        // new_type - Integer with the new segment type
        // See http://www.w3.org/TR/SVG/paths.html#InterfaceSVGPathSeg for list
        this.setSegType = function(new_type) {
        	pathActions.setSegType(new_type);
        };
        
        // TODO(codedread): Remove the getBBox argument and split this function into two.
        // Function: convertToPath
        // Convert selected element to a path, or get the BBox of an element-as-path
        //
        // Parameters: 
        // elem - The DOM element to be converted
        // getBBox - Boolean on whether or not to only return the path's BBox
        //
        // Returns:
        // If the getBBox flag is true, the resulting path's bounding box object.
        // Otherwise the resulting path element is returned.
        this.convertToPath = function(elem, getBBox) {
        	if (elem == null) {
        		var elems = selectedElements;
        		$.each(selectedElements, function(i, elem) {
        			if (elem) {canvas.convertToPath(elem);}
        		});
        		return;
        	}
        	
        	if (!getBBox) {
        		var batchCmd = new svgedit.history.BatchCommand('Convert element to Path');
        	}
        	
        	var attrs = getBBox?{}:{
        		'fill': cur_shape.fill,
        		'fill-opacity': cur_shape.fill_opacity,
        		'stroke': cur_shape.stroke,
        		'stroke-width': cur_shape.stroke_width,
        		'stroke-dasharray': cur_shape.stroke_dasharray,
        		'stroke-linejoin': cur_shape.stroke_linejoin,
        		'stroke-linecap': cur_shape.stroke_linecap,
        		'stroke-opacity': cur_shape.stroke_opacity,
        		'opacity': cur_shape.opacity,
        		'visibility':'hidden'
        	};
        	
        	// any attribute on the element not covered by the above
        	// TODO: make this list global so that we can properly maintain it
        	// TODO: what about @transform, @clip-rule, @fill-rule, etc?
        	$.each(['marker-start', 'marker-end', 'marker-mid', 'filter', 'clip-path'], function() {
        		if (elem.getAttribute(this)) {
        			attrs[this] = elem.getAttribute(this);
        		}
        	});
        	
        	var path = addSvgElementFromJson({
        		'element': 'path',
        		'attr': attrs
        	});
        	
        	var eltrans = elem.getAttribute('transform');
        	if (eltrans) {
        		path.setAttribute('transform', eltrans);
        	}
        	
        	var id = elem.id;
        	var parent = elem.parentNode;
        	if (elem.nextSibling) {
        		parent.insertBefore(path, elem);
        	} else {
        		parent.appendChild(path);
        	}
        	
        	var d = '';
        	
        	var joinSegs = function(segs) {
        		$.each(segs, function(j, seg) {
        			var i;
        			var l = seg[0], pts = seg[1];
        			d += l;
        			for (i = 0; i < pts.length; i+=2) {
        				d += (pts[i] +','+pts[i+1]) + ' ';
        			}
        		});
        	};
        
        	// Possibly the cubed root of 6, but 1.81 works best
        	var num = 1.81;
        	var a, rx;
        	switch (elem.tagName) {
        	case 'ellipse':
        	case 'circle':
        		a = $(elem).attr(['rx', 'ry', 'cx', 'cy']);
        		var cx = a.cx, cy = a.cy;
        		rx = a.rx;
        		ry = a.ry;
        		if (elem.tagName == 'circle') {
        			rx = ry = $(elem).attr('r');
        		}
        	
        		joinSegs([
        			['M',[(cx-rx),(cy)]],
        			['C',[(cx-rx),(cy-ry/num), (cx-rx/num),(cy-ry), (cx),(cy-ry)]],
        			['C',[(cx+rx/num),(cy-ry), (cx+rx),(cy-ry/num), (cx+rx),(cy)]],
        			['C',[(cx+rx),(cy+ry/num), (cx+rx/num),(cy+ry), (cx),(cy+ry)]],
        			['C',[(cx-rx/num),(cy+ry), (cx-rx),(cy+ry/num), (cx-rx),(cy)]],
        			['Z',[]]
        		]);
        		break;
        	case 'path':
        		d = elem.getAttribute('d');
        		break;
        	case 'line':
        		a = $(elem).attr(['x1', 'y1', 'x2', 'y2']);
        		d = 'M'+a.x1+','+a.y1+'L'+a.x2+','+a.y2;
        		break;
        	case 'polyline':
        	case 'polygon':
        		d = 'M' + elem.getAttribute('points');
        		break;
        	case 'rect':
        		var r = $(elem).attr(['rx', 'ry']);
        		rx = r.rx;
        		ry = r.ry;
        		var b = elem.getBBox();
        		var x = b.x, y = b.y, w = b.width, h = b.height;
        		num = 4 - num; // Why? Because!
        		
        		if (!rx && !ry) {
        			// Regular rect
        			joinSegs([
        				['M',[x, y]],
        				['L',[x+w, y]],
        				['L',[x+w, y+h]],
        				['L',[x, y+h]],
        				['L',[x, y]],
        				['Z',[]]
        			]);
        		} else {
        			joinSegs([
        				['M',[x, y+ry]],
        				['C',[x, y+ry/num, x+rx/num, y, x+rx, y]],
        				['L',[x+w-rx, y]],
        				['C',[x+w-rx/num, y, x+w, y+ry/num, x+w, y+ry]],
        				['L',[x+w, y+h-ry]],
        				['C',[x+w, y+h-ry/num, x+w-rx/num, y+h, x+w-rx, y+h]],
        				['L',[x+rx, y+h]],
        				['C',[x+rx/num, y+h, x, y+h-ry/num, x, y+h-ry]],
        				['L',[x, y+ry]],
        				['Z',[]]
        			]);
        		}
        		break;
        	default:
        		path.parentNode.removeChild(path);
        		break;
        	}
        	
        	if (d) {
        		path.setAttribute('d', d);
        	}
        	
        	if (!getBBox) {
        		// Replace the current element with the converted one
        		
        		// Reorient if it has a matrix
        		if (eltrans) {
        			var tlist = svgedit.transformlist.getTransformList(path);
        			if (svgedit.math.hasMatrixTransform(tlist)) {
        				pathActions.resetOrientation(path);
        			}
        		}
        		
        		var nextSibling = elem.nextSibling;
        		batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(elem, nextSibling, parent));
        		batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(path));
        
        		clearSelection();
        		elem.parentNode.removeChild(elem);
        		path.setAttribute('id', id);
        		path.removeAttribute('visibility');
        		addToSelection([path], true);
        		
        		addCommandToHistory(batchCmd);
        		
        	} else {
        		// Get the correct BBox of the new path, then discard it
        		pathActions.resetOrientation(path);
        		var bb = false;
        		try {
        			bb = path.getBBox();
        		} catch(e) {
        			// Firefox fails
        		}
        		path.parentNode.removeChild(path);
        		return bb;
        	}
        };
        
        
        // Function: changeSelectedAttributeNoUndo
        // This function makes the changes to the elements. It does not add the change
        // to the history stack. 
        // 
        // Parameters:
        // attr - String with the attribute name
        // newValue - String or number with the new attribute value
        // elems - The DOM elements to apply the change to
        var changeSelectedAttributeNoUndo = function(attr, newValue, elems) {
        	var handle = svgroot.suspendRedraw(1000);
        	if (current_mode == 'pathedit') {
        		// Editing node
        		pathActions.moveNode(attr, newValue);
        	}
        	elems = elems || selectedElements;
        	var i = elems.length;
        	var no_xy_elems = ['g', 'polyline', 'path'];
        	var good_g_attrs = ['transform', 'opacity', 'filter'];
        	
        	while (i--) {
        		var elem = elems[i];
        		if (elem == null) {continue;}
        		
        		// Set x,y vals on elements that don't have them
        		if ((attr === 'x' || attr === 'y') && no_xy_elems.indexOf(elem.tagName) >= 0) {
        			var bbox = getStrokedBBox([elem]);
        			var diff_x = attr === 'x' ? newValue - bbox.x : 0;
        			var diff_y = attr === 'y' ? newValue - bbox.y : 0;
        			canvas.moveSelectedElements(diff_x*current_zoom, diff_y*current_zoom, true);
        			continue;
        		}
        		
        		// only allow the transform/opacity/filter attribute to change on <g> elements, slightly hacky
        		// TODO: FIXME: This doesn't seem right. Where's the body of this if statement?
        		if (elem.tagName === 'g' && good_g_attrs.indexOf(attr) >= 0) {}
        		var oldval = attr === '#text' ? elem.textContent : elem.getAttribute(attr);
        		if (oldval == null) {oldval = '';}
        		if (oldval !== String(newValue)) {
        			if (attr == '#text') {
        				var old_w = svgedit.utilities.getBBox(elem).width;
        				elem.textContent = newValue;
        				
        				// FF bug occurs on on rotated elements
        				if (/rotate/.test(elem.getAttribute('transform'))) {
        					elem = ffClone(elem);
        				}
        				
        				// Hoped to solve the issue of moving text with text-anchor="start",
        				// but this doesn't actually fix it. Hopefully on the right track, though. -Fyrd
        				
        //					var box=getBBox(elem), left=box.x, top=box.y, width=box.width,
        //						height=box.height, dx = width - old_w, dy=0;
        //					var angle = svgedit.utilities.getRotationAngle(elem, true);
        //					if (angle) {
        //						var r = Math.sqrt( dx*dx + dy*dy );
        //						var theta = Math.atan2(dy,dx) - angle;
        //						dx = r * Math.cos(theta);
        //						dy = r * Math.sin(theta);
        //						
        //						elem.setAttribute('x', elem.getAttribute('x')-dx);
        //						elem.setAttribute('y', elem.getAttribute('y')-dy);
        //					}
        				
        			} else if (attr == '#href') {
        				setHref(elem, newValue);
        			}
        			else {elem.setAttribute(attr, newValue);}
        
        			// Go into "select" mode for text changes
        			// NOTE: Important that this happens AFTER elem.setAttribute() or else attributes like
        			// font-size can get reset to their old value, ultimately by svgEditor.updateContextPanel(),
        			// after calling textActions.toSelectMode() below
        			if (current_mode === 'textedit' && attr !== '#text' && elem.textContent.length) {
        				textActions.toSelectMode(elem);
        			}
        
        //			if (i==0)
        //				selectedBBoxes[0] = svgedit.utilities.getBBox(elem);
        			// Use the Firefox ffClone hack for text elements with gradients or
        			// where other text attributes are changed. 
        			if (svgedit.browser.isGecko() && elem.nodeName === 'text' && /rotate/.test(elem.getAttribute('transform'))) {
        				if (String(newValue).indexOf('url') === 0 || (['font-size', 'font-family', 'x', 'y'].indexOf(attr) >= 0 && elem.textContent)) {
        					elem = ffClone(elem);
        				}
        			}
        			// Timeout needed for Opera & Firefox
        			// codedread: it is now possible for this function to be called with elements
        			// that are not in the selectedElements array, we need to only request a
        			// selector if the element is in that array
        			if (selectedElements.indexOf(elem) >= 0) {
        				setTimeout(function() {
        					// Due to element replacement, this element may no longer
        					// be part of the DOM
        					if (!elem.parentNode) {return;}
        					selectorManager.requestSelector(elem).resize();
        				}, 0);
        			}
        			// if this element was rotated, and we changed the position of this element
        			// we need to update the rotational transform attribute 
        			var angle = svgedit.utilities.getRotationAngle(elem);
        			if (angle != 0 && attr != 'transform') {
        				var tlist = svgedit.transformlist.getTransformList(elem);
        				var n = tlist.numberOfItems;
        				while (n--) {
        					var xform = tlist.getItem(n);
        					if (xform.type == 4) {
        						// remove old rotate
        						tlist.removeItem(n);
        						
        						var box = svgedit.utilities.getBBox(elem);
        						var center = svgedit.math.transformPoint(box.x+box.width/2, box.y+box.height/2, svgedit.math.transformListToTransform(tlist).matrix);
        						var cx = center.x,
        							cy = center.y;
        						var newrot = svgroot.createSVGTransform();
        						newrot.setRotate(angle, cx, cy);
        						tlist.insertItemBefore(newrot, n);
        						break;
        					}
        				}
        			}
        		} // if oldValue != newValue
        	} // for each elem
        	svgroot.unsuspendRedraw(handle);	
        };
        
        // Function: changeSelectedAttribute
        // Change the given/selected element and add the original value to the history stack
        // If you want to change all selectedElements, ignore the elems argument.
        // If you want to change only a subset of selectedElements, then send the
        // subset to this function in the elems argument.
        // 
        // Parameters:
        // attr - String with the attribute name
        // newValue - String or number with the new attribute value
        // elems - The DOM elements to apply the change to
        var changeSelectedAttribute = this.changeSelectedAttribute = function(attr, val, elems) {
        	elems = elems || selectedElements;
        	canvas.undoMgr.beginUndoableChange(attr, elems);
        	var i = elems.length;
        
        	changeSelectedAttributeNoUndo(attr, val, elems);
        
        	var batchCmd = canvas.undoMgr.finishUndoableChange();
        	if (!batchCmd.isEmpty()) { 
        		addCommandToHistory(batchCmd);
        	}
        };
        
        // Function: deleteSelectedElements
        // Removes all selected elements from the DOM and adds the change to the 
        // history stack
        this.deleteSelectedElements = function() {
        	var i;
        	var batchCmd = new svgedit.history.BatchCommand('Delete Elements');
        	var len = selectedElements.length;
        	var selectedCopy = []; //selectedElements is being deleted
        	for (i = 0; i < len; ++i) {
        		var selected = selectedElements[i];
        		if (selected == null) {break;}
        
        		var parent = selected.parentNode;
        		var t = selected;
        		
        		// this will unselect the element and remove the selectedOutline
        		selectorManager.releaseSelector(t);
        		
        		// Remove the path if present.
        		svgedit.path.removePath_(t.id);
        		
        		// Get the parent if it's a single-child anchor
        		if (parent.tagName === 'a' && parent.childNodes.length === 1) {
        			t = parent;
        			parent = parent.parentNode;
        		}
        		
        		var nextSibling = t.nextSibling;
        		var elem = parent.removeChild(t);
        		selectedCopy.push(selected); //for the copy
        		selectedElements[i] = null;
        		batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, parent));
        	}
        	if (!batchCmd.isEmpty()) {addCommandToHistory(batchCmd);}
        	call('changed', selectedCopy);
        	clearSelection();
        };
        
        // Function: cutSelectedElements
        // Removes all selected elements from the DOM and adds the change to the 
        // history stack. Remembers removed elements on the clipboard
        
        // TODO: Combine similar code with deleteSelectedElements
        this.cutSelectedElements = function() {
        	var i;
        	var batchCmd = new svgedit.history.BatchCommand('Cut Elements');
        	var len = selectedElements.length;
        	var selectedCopy = []; //selectedElements is being deleted
        	for (i = 0; i < len; ++i) {
        		var selected = selectedElements[i];
        		if (selected == null) {break;}
        
        		var parent = selected.parentNode;
        		var t = selected;
        
        		// this will unselect the element and remove the selectedOutline
        		selectorManager.releaseSelector(t);
        
        		// Remove the path if present.
        		svgedit.path.removePath_(t.id);
        
        		var nextSibling = t.nextSibling;
        		var elem = parent.removeChild(t);
        		selectedCopy.push(selected); //for the copy
        		selectedElements[i] = null;
        		batchCmd.addSubCommand(new RemoveElementCommand(elem, nextSibling, parent));
        	}
        	if (!batchCmd.isEmpty()) {addCommandToHistory(batchCmd);}
        	call('changed', selectedCopy);
        	clearSelection();
        	
        	canvas.clipBoard = selectedCopy;
        };
        
        // Function: copySelectedElements
        // Remembers the current selected elements on the clipboard
        this.copySelectedElements = function() {
        	canvas.clipBoard = $.merge([], selectedElements);
        };
        
        this.pasteElements = function(type, x, y) {
        	var cb = canvas.clipBoard;
        	var len = cb.length;
        	if (!len) {return;}
        	
        	var pasted = [];
        	var batchCmd = new svgedit.history.BatchCommand('Paste elements');
        	
        	// Move elements to lastClickPoint
        
        	while (len--) {
        		var elem = cb[len];
        		if (!elem) {continue;}
        		var copy = copyElem(elem);
        
        		// See if elem with elem ID is in the DOM already
        		if (!svgedit.utilities.getElem(elem.id)) {copy.id = elem.id;}
        		
        		pasted.push(copy);
        		(current_group || getCurrentDrawing().getCurrentLayer()).appendChild(copy);
        		batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(copy));
        	}
        	
        	selectOnly(pasted);
        	
        	if (type !== 'in_place') {
        		
        		var ctr_x, ctr_y;
        		
        		if (!type) {
        			ctr_x = lastClickPoint.x;
        			ctr_y = lastClickPoint.y;
        		} else if (type === 'point') {
        			ctr_x = x;
        			ctr_y = y;
        		} 
        		
        		var bbox = getStrokedBBox(pasted);
        		var cx = ctr_x - (bbox.x + bbox.width/2),
        			cy = ctr_y - (bbox.y + bbox.height/2),
        			dx = [],
        			dy = [];
        	
        		$.each(pasted, function(i, item) {
        			dx.push(cx);
        			dy.push(cy);
        		});
        		
        		var cmd = canvas.moveSelectedElements(dx, dy, false);
        		batchCmd.addSubCommand(cmd);
        	}
        
        	addCommandToHistory(batchCmd);
        	call('changed', pasted);
        };
        
        // Function: groupSelectedElements
        // Wraps all the selected elements in a group (g) element
        
        // Parameters: 
        // type - type of element to group into, defaults to <g>
        this.groupSelectedElements = function(type, urlArg) {
        	if (!type) {type = 'g';}
        	var cmd_str = '';
        	
        	switch (type) {
        		case 'a':
        			cmd_str = 'Make hyperlink';
        			var url = '';
        			if (arguments.length > 1) {
        				url = urlArg;
        			}
        			break;
        		default:
        			type = 'g';
        			cmd_str = 'Group Elements';
        			break;
        	}
        	
        	var batchCmd = new svgedit.history.BatchCommand(cmd_str);
        	
        	// create and insert the group element
        	var g = addSvgElementFromJson({
        							'element': type,
        							'attr': {
        								'id': getNextId()
        							}
        						});
        	if (type === 'a') {
        		setHref(g, url);
        	}
        	batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(g));
        	
        	// now move all children into the group
        	var i = selectedElements.length;
        	while (i--) {
        		var elem = selectedElements[i];
        		if (elem == null) {continue;}
        		
        		if (elem.parentNode.tagName === 'a' && elem.parentNode.childNodes.length === 1) {
        			elem = elem.parentNode;
        		}
        		
        		var oldNextSibling = elem.nextSibling;
        		var oldParent = elem.parentNode;
        		g.appendChild(elem);
        		batchCmd.addSubCommand(new svgedit.history.MoveElementCommand(elem, oldNextSibling, oldParent));			
        	}
        	if (!batchCmd.isEmpty()) {addCommandToHistory(batchCmd);}
        	
        	// update selection
        	selectOnly([g], true);
        };
        
        
        // Function: pushGroupProperties
        // Pushes all appropriate parent group properties down to its children, then
        // removes them from the group
        var pushGroupProperties = this.pushGroupProperties = function(g, undoable) {
        
        	var children = g.childNodes;
        	var len = children.length;
        	var xform = g.getAttribute('transform');
        
        	var glist = svgedit.transformlist.getTransformList(g);
        	var m = svgedit.math.transformListToTransform(glist).matrix;
        	
        	var batchCmd = new svgedit.history.BatchCommand('Push group properties');
        
        	// TODO: get all fill/stroke properties from the group that we are about to destroy
        	// "fill", "fill-opacity", "fill-rule", "stroke", "stroke-dasharray", "stroke-dashoffset", 
        	// "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", 
        	// "stroke-width"
        	// and then for each child, if they do not have the attribute (or the value is 'inherit')
        	// then set the child's attribute
        	
        	var i = 0;
        	var gangle = svgedit.utilities.getRotationAngle(g);
        	
        	var gattrs = $(g).attr(['filter', 'opacity']);
        	var gfilter, gblur, changes;
        	
        	for (i = 0; i < len; i++) {
        		var elem = children[i];
        		
        		if (elem.nodeType !== 1) {continue;}
        		
        		if (gattrs.opacity !== null && gattrs.opacity !== 1) {
        			var c_opac = elem.getAttribute('opacity') || 1;
        			var new_opac = Math.round((elem.getAttribute('opacity') || 1) * gattrs.opacity * 100)/100;
        			changeSelectedAttribute('opacity', new_opac, [elem]);
        		}
        
        		if (gattrs.filter) {
        			var cblur = this.getBlur(elem);
        			var orig_cblur = cblur;
        			if (!gblur) {gblur = this.getBlur(g);}
        			if (cblur) {
        				// Is this formula correct?
        				cblur = Number(gblur) + Number(cblur);
        			} else if (cblur === 0) {
        				cblur = gblur;
        			}
        			
        			// If child has no current filter, get group's filter or clone it.
        			if (!orig_cblur) {
        				// Set group's filter to use first child's ID
        				if (!gfilter) {
        					gfilter = svgedit.utilities.getRefElem(gattrs.filter);
        				} else {
        					// Clone the group's filter
        					gfilter = copyElem(gfilter);
        					svgedit.utilities.findDefs().appendChild(gfilter);
        				}
        			} else {
        				gfilter = svgedit.utilities.getRefElem(elem.getAttribute('filter'));
        			}
        
        			// Change this in future for different filters
        			var suffix = (gfilter.firstChild.tagName === 'feGaussianBlur')?'blur':'filter'; 
        			gfilter.id = elem.id + '_' + suffix;
        			changeSelectedAttribute('filter', 'url(#' + gfilter.id + ')', [elem]);
        			
        			// Update blur value 
        			if (cblur) {
        				changeSelectedAttribute('stdDeviation', cblur, [gfilter.firstChild]);
        				canvas.setBlurOffsets(gfilter, cblur);
        			}
        		}
        		
        		var chtlist = svgedit.transformlist.getTransformList(elem);
        
        		// Don't process gradient transforms
        		if (~elem.tagName.indexOf('Gradient')) {chtlist = null;}
        		
        		// Hopefully not a problem to add this. Necessary for elements like <desc/>
        		if (!chtlist) {continue;}
        		
        		// Apparently <defs> can get get a transformlist, but we don't want it to have one!
        		if (elem.tagName === 'defs') {continue;}
        		
        		if (glist.numberOfItems) {
        			// TODO: if the group's transform is just a rotate, we can always transfer the
        			// rotate() down to the children (collapsing consecutive rotates and factoring
        			// out any translates)
        			if (gangle && glist.numberOfItems == 1) {
        				// [Rg] [Rc] [Mc]
        				// we want [Tr] [Rc2] [Mc] where:
        				//	- [Rc2] is at the child's current center but has the 
        				// sum of the group and child's rotation angles
        				//	- [Tr] is the equivalent translation that this child 
        				// undergoes if the group wasn't there
        				
        				// [Tr] = [Rg] [Rc] [Rc2_inv]
        				
        				// get group's rotation matrix (Rg)
        				var rgm = glist.getItem(0).matrix;
        				
        				// get child's rotation matrix (Rc)
        				var rcm = svgroot.createSVGMatrix();
        				var cangle = svgedit.utilities.getRotationAngle(elem);
        				if (cangle) {
        					rcm = chtlist.getItem(0).matrix;
        				}
        				
        				// get child's old center of rotation
        				var cbox = svgedit.utilities.getBBox(elem);
        				var ceqm = svgedit.math.transformListToTransform(chtlist).matrix;
        				var coldc = svgedit.math.transformPoint(cbox.x+cbox.width/2, cbox.y+cbox.height/2, ceqm);
        				
        				// sum group and child's angles
        				var sangle = gangle + cangle;
        				
        				// get child's rotation at the old center (Rc2_inv)
        				var r2 = svgroot.createSVGTransform();
        				r2.setRotate(sangle, coldc.x, coldc.y);
        				
        				// calculate equivalent translate
        				var trm = svgedit.math.matrixMultiply(rgm, rcm, r2.matrix.inverse());
        				
        				// set up tlist
        				if (cangle) {
        					chtlist.removeItem(0);
        				}
        				
        				if (sangle) {
        					if (chtlist.numberOfItems) {
        						chtlist.insertItemBefore(r2, 0);
        					} else {
        						chtlist.appendItem(r2);
        					}
        				}
        
        				if (trm.e || trm.f) {
        					var tr = svgroot.createSVGTransform();
        					tr.setTranslate(trm.e, trm.f);
        					if (chtlist.numberOfItems) {
        						chtlist.insertItemBefore(tr, 0);
        					} else {
        						chtlist.appendItem(tr);
        					}
        				}
        			} else { // more complicated than just a rotate
        			
        				// transfer the group's transform down to each child and then
        				// call svgedit.recalculate.recalculateDimensions()				
        				var oldxform = elem.getAttribute('transform');
        				changes = {};
        				changes.transform = oldxform || '';
        
        				var newxform = svgroot.createSVGTransform();
        
        				// [ gm ] [ chm ] = [ chm ] [ gm' ]
        				// [ gm' ] = [ chm_inv ] [ gm ] [ chm ]
        				var chm = svgedit.math.transformListToTransform(chtlist).matrix,
        					chm_inv = chm.inverse();
        				var gm = svgedit.math.matrixMultiply( chm_inv, m, chm );
        				newxform.setMatrix(gm);
        				chtlist.appendItem(newxform);
        			}
        			var cmd = svgedit.recalculate.recalculateDimensions(elem);
        			if (cmd) {batchCmd.addSubCommand(cmd);}
        		}
        	}
        
        	
        	// remove transform and make it undo-able
        	if (xform) {
        		changes = {};
        		changes.transform = xform;
        		g.setAttribute('transform', '');
        		g.removeAttribute('transform');				
        		batchCmd.addSubCommand(new svgedit.history.ChangeElementCommand(g, changes));
        	}
        	
        	if (undoable && !batchCmd.isEmpty()) {
        		return batchCmd;
        	}
        };
        
        
        // Function: ungroupSelectedElement
        // Unwraps all the elements in a selected group (g) element. This requires
        // significant recalculations to apply group's transforms, etc to its children
        this.ungroupSelectedElement = function() {
        	var g = selectedElements[0];
        	if (!g) {
        		return;
        	}
        	if ($(g).data('gsvg') || $(g).data('symbol')) {
        		// Is svg, so actually convert to group
        		convertToGroup(g);
        		return;
        	}
        	if (g.tagName === 'use') {
        		// Somehow doesn't have data set, so retrieve
        		var symbol = svgedit.utilities.getElem(getHref(g).substr(1));
        		$(g).data('symbol', symbol).data('ref', symbol);
        		convertToGroup(g);
        		return;
        	}
        	var parents_a = $(g).parents('a');
        	if (parents_a.length) {
        		g = parents_a[0];
        	}
        	
        	// Look for parent "a"
        	if (g.tagName === 'g' || g.tagName === 'a') {
        		
        		var batchCmd = new svgedit.history.BatchCommand('Ungroup Elements');
        		var cmd = pushGroupProperties(g, true);
        		if (cmd) {batchCmd.addSubCommand(cmd);}
        		
        		var parent = g.parentNode;
        		var anchor = g.nextSibling;
        		var children = new Array(g.childNodes.length);
        		
        		var i = 0;
        		
        		while (g.firstChild) {
        			var elem = g.firstChild;
        			var oldNextSibling = elem.nextSibling;
        			var oldParent = elem.parentNode;
        			
        			// Remove child title elements
        			if (elem.tagName === 'title') {
        				var nextSibling = elem.nextSibling;
        				batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(elem, nextSibling, oldParent));
        				oldParent.removeChild(elem);
        				continue;
        			}
        			
        			children[i++] = elem = parent.insertBefore(elem, anchor);
        			batchCmd.addSubCommand(new svgedit.history.MoveElementCommand(elem, oldNextSibling, oldParent));
        		}
        
        		// remove the group from the selection			
        		clearSelection();
        		
        		// delete the group element (but make undo-able)
        		var gNextSibling = g.nextSibling;
        		g = parent.removeChild(g);
        		batchCmd.addSubCommand(new svgedit.history.RemoveElementCommand(g, gNextSibling, parent));
        
        		if (!batchCmd.isEmpty()) {addCommandToHistory(batchCmd);}
        		
        		// update selection
        		addToSelection(children);
        	}
        };
        
        // Function: moveToTopSelectedElement
        // Repositions the selected element to the bottom in the DOM to appear on top of
        // other elements
        this.moveToTopSelectedElement = function() {
        	var selected = selectedElements[0];
        	if (selected != null) {
        		var t = selected;
        		var oldParent = t.parentNode;
        		var oldNextSibling = t.nextSibling;
        		t = t.parentNode.appendChild(t);
        		// If the element actually moved position, add the command and fire the changed
        		// event handler.
        		if (oldNextSibling != t.nextSibling) {
        			addCommandToHistory(new svgedit.history.MoveElementCommand(t, oldNextSibling, oldParent, 'top'));
        			call('changed', [t]);
        		}
        	}
        };
        
        // Function: moveToBottomSelectedElement
        // Repositions the selected element to the top in the DOM to appear under 
        // other elements
        this.moveToBottomSelectedElement = function() {
        	var selected = selectedElements[0];
        	if (selected != null) {
        		var t = selected;
        		var oldParent = t.parentNode;
        		var oldNextSibling = t.nextSibling;
        		var firstChild = t.parentNode.firstChild;
        		if (firstChild.tagName == 'title') {
        			firstChild = firstChild.nextSibling;
        		}
        		// This can probably be removed, as the defs should not ever apppear
        		// inside a layer group
        		if (firstChild.tagName == 'defs') {
        			firstChild = firstChild.nextSibling;
        		}
        		t = t.parentNode.insertBefore(t, firstChild);
        		// If the element actually moved position, add the command and fire the changed
        		// event handler.
        		if (oldNextSibling != t.nextSibling) {
        			addCommandToHistory(new svgedit.history.MoveElementCommand(t, oldNextSibling, oldParent, 'bottom'));
        			call('changed', [t]);
        		}
        	}
        };
        
        // Function: moveUpDownSelected
        // Moves the select element up or down the stack, based on the visibly
        // intersecting elements
        //
        // Parameters: 
        // dir - String that's either 'Up' or 'Down'
        this.moveUpDownSelected = function(dir) {
        	var selected = selectedElements[0];
        	if (!selected) {return;}
        	
        	curBBoxes = [];
        	var closest, found_cur;
        	// jQuery sorts this list
        	var list = $(getIntersectionList(getStrokedBBox([selected]))).toArray();
        	if (dir == 'Down') {list.reverse();}
        
        	$.each(list, function() {
        		if (!found_cur) {
        			if (this == selected) {
        				found_cur = true;
        			}
        			return;
        		}
        		closest = this;
        		return false;
        	});
        	if (!closest) {return;}
        	
        	var t = selected;
        	var oldParent = t.parentNode;
        	var oldNextSibling = t.nextSibling;
        	$(closest)[dir == 'Down'?'before':'after'](t);
        	// If the element actually moved position, add the command and fire the changed
        	// event handler.
        	if (oldNextSibling != t.nextSibling) {
        		addCommandToHistory(new svgedit.history.MoveElementCommand(t, oldNextSibling, oldParent, 'Move ' + dir));
        		call('changed', [t]);
        	}
        };
        
        // Function: moveSelectedElements
        // Moves selected elements on the X/Y axis 
        //
        // Parameters:
        // dx - Float with the distance to move on the x-axis
        // dy - Float with the distance to move on the y-axis
        // undoable - Boolean indicating whether or not the action should be undoable
        //
        // Returns:
        // Batch command for the move
        this.moveSelectedElements = function(dx, dy, undoable) {
        	// if undoable is not sent, default to true
        	// if single values, scale them to the zoom
        	if (dx.constructor != Array) {
        		dx /= current_zoom;
        		dy /= current_zoom;
        	}
        	undoable = undoable || true;
        	var batchCmd = new svgedit.history.BatchCommand('position');
        	var i = selectedElements.length;
        	while (i--) {
        		var selected = selectedElements[i];
        		if (selected != null) {
        //			if (i==0)
        //				selectedBBoxes[0] = svgedit.utilities.getBBox(selected);
        			
        //			var b = {};
        //			for (var j in selectedBBoxes[i]) b[j] = selectedBBoxes[i][j];
        //			selectedBBoxes[i] = b;
        			
        			var xform = svgroot.createSVGTransform();
        			var tlist = svgedit.transformlist.getTransformList(selected);
        			
        			// dx and dy could be arrays
        			if (dx.constructor == Array) {
        //				if (i==0) {
        //					selectedBBoxes[0].x += dx[0];
        //					selectedBBoxes[0].y += dy[0];
        //				}
        				xform.setTranslate(dx[i], dy[i]);
        			} else {
        //				if (i==0) {
        //					selectedBBoxes[0].x += dx;
        //					selectedBBoxes[0].y += dy;
        //				}
        				xform.setTranslate(dx, dy);
        			}
        
        			if (tlist.numberOfItems) {
        				tlist.insertItemBefore(xform, 0);
        			} else {
        				tlist.appendItem(xform);
        			}
        			
        			var cmd = svgedit.recalculate.recalculateDimensions(selected);
        			if (cmd) {
        				batchCmd.addSubCommand(cmd);
        			}
        			
        			selectorManager.requestSelector(selected).resize();
        		}
        	}
        	if (!batchCmd.isEmpty()) {
        		if (undoable) {
        			addCommandToHistory(batchCmd);
        		}
        		call('changed', selectedElements);
        		return batchCmd;
        	}
        };
        
        // Function: cloneSelectedElements
        // Create deep DOM copies (clones) of all selected elements and move them slightly 
        // from their originals
        this.cloneSelectedElements = function(x, y) {
        	var i, elem;
        	var batchCmd = new svgedit.history.BatchCommand('Clone Elements');
        	// find all the elements selected (stop at first null)
        	var len = selectedElements.length;
        	function sortfunction(a, b){
        		return ($(b).index() - $(a).index()); //causes an array to be sorted numerically and ascending
        	}
        	selectedElements.sort(sortfunction);
        	for (i = 0; i < len; ++i) {
        		elem = selectedElements[i];
        		if (elem == null) {break;}
        	}
        	// use slice to quickly get the subset of elements we need
        	var copiedElements = selectedElements.slice(0, i);
        	this.clearSelection(true);
        	// note that we loop in the reverse way because of the way elements are added
        	// to the selectedElements array (top-first)
        	i = copiedElements.length;
        	while (i--) {
        		// clone each element and replace it within copiedElements
        		elem = copiedElements[i] = copyElem(copiedElements[i]);
        		(current_group || getCurrentDrawing().getCurrentLayer()).appendChild(elem);
        		batchCmd.addSubCommand(new svgedit.history.InsertElementCommand(elem));
        	}
        	
        	if (!batchCmd.isEmpty()) {
        		addToSelection(copiedElements.reverse()); // Need to reverse for correct selection-adding
        		this.moveSelectedElements(x, y, false);
        		addCommandToHistory(batchCmd);
        	}
        };
        
        // Function: alignSelectedElements
        // Aligns selected elements
        //
        // Parameters:
        // type - String with single character indicating the alignment type
        // relative_to - String that must be one of the following: 
        // "selected", "largest", "smallest", "page"
        this.alignSelectedElements = function(type, relative_to) {
        	var i, elem;
        	var bboxes = [], angles = [];
        	var minx = Number.MAX_VALUE, maxx = Number.MIN_VALUE, miny = Number.MAX_VALUE, maxy = Number.MIN_VALUE;
        	var curwidth = Number.MIN_VALUE, curheight = Number.MIN_VALUE;
        	var len = selectedElements.length;
        	if (!len) {return;}
        	for (i = 0; i < len; ++i) {
        		if (selectedElements[i] == null) {break;}
        		elem = selectedElements[i];
        		bboxes[i] = getStrokedBBox([elem]);
        		
        		// now bbox is axis-aligned and handles rotation
        		switch (relative_to) {
        			case 'smallest':
        				if ( (type == 'l' || type == 'c' || type == 'r') && (curwidth == Number.MIN_VALUE || curwidth > bboxes[i].width) ||
        					 (type == 't' || type == 'm' || type == 'b') && (curheight == Number.MIN_VALUE || curheight > bboxes[i].height) ) {
        					minx = bboxes[i].x;
        					miny = bboxes[i].y;
        					maxx = bboxes[i].x + bboxes[i].width;
        					maxy = bboxes[i].y + bboxes[i].height;
        					curwidth = bboxes[i].width;
        					curheight = bboxes[i].height;
        				}
        				break;
        			case 'largest':
        				if ( (type == 'l' || type == 'c' || type == 'r') && (curwidth == Number.MIN_VALUE || curwidth < bboxes[i].width) ||
        					 (type == 't' || type == 'm' || type == 'b') && (curheight == Number.MIN_VALUE || curheight < bboxes[i].height) ) {
        					minx = bboxes[i].x;
        					miny = bboxes[i].y;
        					maxx = bboxes[i].x + bboxes[i].width;
        					maxy = bboxes[i].y + bboxes[i].height;
        					curwidth = bboxes[i].width;
        					curheight = bboxes[i].height;
        				}
        				break;
        			default: // 'selected'
        				if (bboxes[i].x < minx) {minx = bboxes[i].x;}
        				if (bboxes[i].y < miny) {miny = bboxes[i].y;}
        				if (bboxes[i].x + bboxes[i].width > maxx) {maxx = bboxes[i].x + bboxes[i].width;}
        				if (bboxes[i].y + bboxes[i].height > maxy) {maxy = bboxes[i].y + bboxes[i].height;}
        				break;
        		}
        	} // loop for each element to find the bbox and adjust min/max
        
        	if (relative_to == 'page') {
        		minx = 0;
        		miny = 0;
        		maxx = canvas.contentW;
        		maxy = canvas.contentH;
        	}
        
        	var dx = new Array(len);
        	var dy = new Array(len);
        	for (i = 0; i < len; ++i) {
        		if (selectedElements[i] == null) {break;}
        		elem = selectedElements[i];
        		var bbox = bboxes[i];
        		dx[i] = 0;
        		dy[i] = 0;
        		switch (type) {
        			case 'l': // left (horizontal)
        				dx[i] = minx - bbox.x;
        				break;
        			case 'c': // center (horizontal)
        				dx[i] = (minx+maxx)/2 - (bbox.x + bbox.width/2);
        				break;
        			case 'r': // right (horizontal)
        				dx[i] = maxx - (bbox.x + bbox.width);
        				break;
        			case 't': // top (vertical)
        				dy[i] = miny - bbox.y;
        				break;
        			case 'm': // middle (vertical)
        				dy[i] = (miny+maxy)/2 - (bbox.y + bbox.height/2);
        				break;
        			case 'b': // bottom (vertical)
        				dy[i] = maxy - (bbox.y + bbox.height);
        				break;
        		}
        	}
        	this.moveSelectedElements(dx, dy);
        };
        
        // Group: Additional editor tools
        
        this.contentW = getResolution().w;
        this.contentH = getResolution().h;
        
        // Function: updateCanvas
        // Updates the editor canvas width/height/position after a zoom has occurred 
        //
        // Parameters:
        // w - Float with the new width
        // h - Float with the new height
        //
        // Returns: 
        // Object with the following values:
        // * x - The canvas' new x coordinate
        // * y - The canvas' new y coordinate
        // * old_x - The canvas' old x coordinate
        // * old_y - The canvas' old y coordinate
        // * d_x - The x position difference
        // * d_y - The y position difference
        this.updateCanvas = function(w, h) {
        	svgroot.setAttribute('width', w);
        	svgroot.setAttribute('height', h);
        	var bg = $('#canvasBackground')[0];
        	var old_x = svgcontent.getAttribute('x');
        	var old_y = svgcontent.getAttribute('y');
        	var x = (w/2 - this.contentW*current_zoom/2);
        	var y = (h/2 - this.contentH*current_zoom/2);
        
        	svgedit.utilities.assignAttributes(svgcontent, {
        		width: this.contentW*current_zoom,
        		height: this.contentH*current_zoom,
        		'x': x,
        		'y': y,
        		'viewBox' : '0 0 ' + this.contentW + ' ' + this.contentH
        	});
        	
        	svgedit.utilities.assignAttributes(bg, {
        		width: svgcontent.getAttribute('width'),
        		height: svgcontent.getAttribute('height'),
        		x: x,
        		y: y
        	});
        
        	var bg_img = svgedit.utilities.getElem('background_image');
        	if (bg_img) {
        		svgedit.utilities.assignAttributes(bg_img, {
        			'width': '100%',
        			'height': '100%'
        		});
        	}
        	
        	selectorManager.selectorParentGroup.setAttribute('transform', 'translate(' + x + ',' + y + ')');
        	runExtensions('canvasUpdated', {new_x:x, new_y:y, old_x:old_x, old_y:old_y, d_x:x - old_x, d_y:y - old_y});
        	return {x:x, y:y, old_x:old_x, old_y:old_y, d_x:x - old_x, d_y:y - old_y};
        };
        
        // Function: setBackground
        // Set the background of the editor (NOT the actual document)
        //
        // Parameters:
        // color - String with fill color to apply
        // url - URL or path to image to use
        this.setBackground = function(color, url) {
        	var bg = svgedit.utilities.getElem('canvasBackground');
        	var border = $(bg).find('rect')[0];
        	var bg_img = svgedit.utilities.getElem('background_image');
        	border.setAttribute('fill', color);
        	if (url) {
        		if (!bg_img) {
        			bg_img = svgdoc.createElementNS(NS.SVG, 'image');
        			svgedit.utilities.assignAttributes(bg_img, {
        				'id': 'background_image',
        				'width': '100%',
        				'height': '100%',
        				'preserveAspectRatio': 'xMinYMin',
        				'style':'pointer-events:none'
        			});
        		}
        		setHref(bg_img, url);
        		bg.appendChild(bg_img);
        	} else if (bg_img) {
        		bg_img.parentNode.removeChild(bg_img);
        	}
        };
        
        // Function: cycleElement
        // Select the next/previous element within the current layer
        //
        // Parameters:
        // next - Boolean where true = next and false = previous element
        this.cycleElement = function(next) {
        	var num;
        	var cur_elem = selectedElements[0];
        	var elem = false;
        	var all_elems = getVisibleElements(current_group || getCurrentDrawing().getCurrentLayer());
        	if (!all_elems.length) {return;}
        	if (cur_elem == null) {
        		num = next?all_elems.length-1:0;
        		elem = all_elems[num];
        	} else {
        		var i = all_elems.length;
        		while (i--) {
        			if (all_elems[i] == cur_elem) {
        				num = next ? i - 1 : i + 1;
        				if (num >= all_elems.length) {
        					num = 0;
        				} else if (num < 0) {
        					num = all_elems.length-1;
        				} 
        				elem = all_elems[num];
        				break;
        			} 
        		}
        	}		
        	selectOnly([elem], true);
        	call('selected', selectedElements);
        };
        
        this.clear();
        
        
        // DEPRECATED: getPrivateMethods 
        // Since all methods are/should be public somehow, this function should be removed
        
        // Being able to access private methods publicly seems wrong somehow,
        // but currently appears to be the best way to allow testing and provide
        // access to them to plugins.
        this.getPrivateMethods = function() {
        	var obj = {
        		addCommandToHistory: addCommandToHistory,
        		setGradient: setGradient,
        		addSvgElementFromJson: addSvgElementFromJson,
        		assignAttributes: assignAttributes,
        		BatchCommand: BatchCommand,
        		call: call,
        		ChangeElementCommand: ChangeElementCommand,
        		copyElem: copyElem,
        		ffClone: ffClone,
        		findDefs: findDefs,
        		findDuplicateGradient: findDuplicateGradient,
        		getElem: getElem,
        		getId: getId,
        		getIntersectionList: getIntersectionList,
        		getMouseTarget: getMouseTarget,
        		getNextId: getNextId,
        		getPathBBox: getPathBBox,
        		getUrlFromAttr: getUrlFromAttr,
        		hasMatrixTransform: hasMatrixTransform,
        		identifyLayers: identifyLayers,
        		InsertElementCommand: InsertElementCommand,
        		isIdentity: svgedit.math.isIdentity,
        		logMatrix: logMatrix,
        		matrixMultiply: matrixMultiply,
        		MoveElementCommand: MoveElementCommand,
        		preventClickDefault: preventClickDefault,
        		recalculateAllSelectedDimensions: recalculateAllSelectedDimensions,
        		recalculateDimensions: recalculateDimensions,
        		remapElement: remapElement,
        		RemoveElementCommand: RemoveElementCommand,
        		removeUnusedDefElems: removeUnusedDefElems,
        		round: round,
        		runExtensions: runExtensions,
        		sanitizeSvg: sanitizeSvg,
        		SVGEditTransformList: svgedit.transformlist.SVGTransformList,
        		toString: toString,
        		transformBox: svgedit.math.transformBox,
        		transformListToTransform: transformListToTransform,
        		transformPoint: transformPoint,
        		walkTree: svgedit.utilities.walkTree
        	};
        	return obj;
        };
        
        };
        
      • svgedit.js
        /*globals $, svgedit*/
        /**
         *
         * Licensed under the MIT License
         * main object, loaded first so other modules have the guarantee of its existence
         */
        
        svgedit = {
        	// common namepaces constants in alpha order
        	NS: {
        		HTML: 'http://www.w3.org/1999/xhtml',
        		MATH: 'http://www.w3.org/1998/Math/MathML',
        		SE: 'http://svg-edit.googlecode.com',
        		SVG: 'http://www.w3.org/2000/svg',
        		XLINK: 'http://www.w3.org/1999/xlink',
        		XML: 'http://www.w3.org/XML/1998/namespace',
        		XMLNS: 'http://www.w3.org/2000/xmlns/' // see http://www.w3.org/TR/REC-xml-names/#xmlReserved
        	}
        };
        
        // return the svgedit.NS with key values switched and lowercase
        svgedit.getReverseNS = function() {'use strict';
        	var reverseNS = {};
        	$.each(this.NS, function(name, URI) {
        		reverseNS[URI] = name.toLowerCase();
        	});
        	return reverseNS;
        };
      • svgtransformlist.js
        /*globals $, svgedit*/
        /*jslint vars: true, eqeq: true*/
        /**
         * SVGTransformList
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // 1) browser.js
        
        (function() {'use strict';
        
        if (!svgedit.transformlist) {
        	svgedit.transformlist = {};
        }
        
        var svgroot = document.createElementNS(svgedit.NS.SVG, 'svg');
        
        // Helper function.
        function transformToString(xform) {
        	var m = xform.matrix,
        		text = '';
        	switch(xform.type) {
        		case 1: // MATRIX
        			text = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')';
        			break;
        		case 2: // TRANSLATE
        			text = 'translate(' + m.e + ',' + m.f + ')';
        			break;
        		case 3: // SCALE
        			if (m.a == m.d) {text = 'scale(' + m.a + ')';}
        			else {text = 'scale(' + m.a + ',' + m.d + ')';}
        			break;
        		case 4: // ROTATE
        			var cx = 0, cy = 0;
        			// this prevents divide by zero
        			if (xform.angle != 0) {
        				var K = 1 - m.a;
        				cy = ( K * m.f + m.b*m.e ) / ( K*K + m.b*m.b );
        				cx = ( m.e - m.b * cy ) / K;
        			}
        			text = 'rotate(' + xform.angle + ' ' + cx + ',' + cy + ')';
        			break;
        	}
        	return text;
        }
        
        
        /**
         * Map of SVGTransformList objects.
         */
        var listMap_ = {};
        
        
        // **************************************************************************************
        // SVGTransformList implementation for Webkit 
        // These methods do not currently raise any exceptions.
        // These methods also do not check that transforms are being inserted.  This is basically
        // implementing as much of SVGTransformList that we need to get the job done.
        //
        //  interface SVGEditTransformList { 
        //		attribute unsigned long numberOfItems;
        //		void   clear (  )
        //		SVGTransform initialize ( in SVGTransform newItem )
        //		SVGTransform getItem ( in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
        //		SVGTransform insertItemBefore ( in SVGTransform newItem, in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
        //		SVGTransform replaceItem ( in SVGTransform newItem, in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
        //		SVGTransform removeItem ( in unsigned long index ) (DOES NOT THROW DOMException, INDEX_SIZE_ERR)
        //		SVGTransform appendItem ( in SVGTransform newItem )
        //		NOT IMPLEMENTED: SVGTransform createSVGTransformFromMatrix ( in SVGMatrix matrix );
        //		NOT IMPLEMENTED: SVGTransform consolidate (  );
        //	}
        // **************************************************************************************
        svgedit.transformlist.SVGTransformList = function(elem) {
        	this._elem = elem || null;
        	this._xforms = [];
        	// TODO: how do we capture the undo-ability in the changed transform list?
        	this._update = function() {
        		var tstr = '';
        		var concatMatrix = svgroot.createSVGMatrix();
        		var i;
        		for (i = 0; i < this.numberOfItems; ++i) {
        			var xform = this._list.getItem(i);
        			tstr += transformToString(xform) + ' ';
        		}
        		this._elem.setAttribute('transform', tstr);
        	};
        	this._list = this;
        	this._init = function() {
        		// Transform attribute parser
        		var str = this._elem.getAttribute('transform');
        		if (!str) {return;}
        
        		// TODO: Add skew support in future
        		var re = /\s*((scale|matrix|rotate|translate)\s*\(.*?\))\s*,?\s*/;
        		var m = true;
        		while (m) {
        			m = str.match(re);
        			str = str.replace(re, '');
        			if (m && m[1]) {
        				var x = m[1];
        				var bits = x.split(/\s*\(/);
        				var name = bits[0];
        				var val_bits = bits[1].match(/\s*(.*?)\s*\)/);
        				val_bits[1] = val_bits[1].replace(/(\d)-/g, '$1 -');
        				var val_arr = val_bits[1].split(/[, ]+/);
        				var letters = 'abcdef'.split('');
        				var mtx = svgroot.createSVGMatrix();
        				$.each(val_arr, function(i, item) {
        					val_arr[i] = parseFloat(item);
        					if (name == 'matrix') {
        						mtx[letters[i]] = val_arr[i];
        					}
        				});
        				var xform = svgroot.createSVGTransform();
        				var fname = 'set' + name.charAt(0).toUpperCase() + name.slice(1);
        				var values = name == 'matrix' ? [mtx] : val_arr;
        
        				if (name == 'scale' && values.length == 1) {
        					values.push(values[0]);
        				} else if (name == 'translate' && values.length == 1) {
        					values.push(0);
        				} else if (name == 'rotate' && values.length == 1) {
        					values.push(0, 0);
        				}
        				xform[fname].apply(xform, values);
        				this._list.appendItem(xform);
        			}
        		}
        	};
        	this._removeFromOtherLists = function(item) {
        		if (item) {
        			// Check if this transform is already in a transformlist, and
        			// remove it if so.
        			var found = false;
        			var id;
        			for (id in listMap_) {
        				var tl = listMap_[id];
        				var i, len;
        				for (i = 0, len = tl._xforms.length; i < len; ++i) {
        					if (tl._xforms[i] == item) {
        						found = true;
        						tl.removeItem(i);
        						break;
        					}
        				}
        				if (found) {
        					break;
        				}
        			}
        		}
        	};
        
        	this.numberOfItems = 0;
        	this.clear = function() {
        		this.numberOfItems = 0;
        		this._xforms = [];
        	};
        
        	this.initialize = function(newItem) {
        		this.numberOfItems = 1;
        		this._removeFromOtherLists(newItem);
        		this._xforms = [newItem];
        	};
        
        	this.getItem = function(index) {
        		if (index < this.numberOfItems && index >= 0) {
        			return this._xforms[index];
        		}
        		throw {code: 1}; // DOMException with code=INDEX_SIZE_ERR
        	};
        
        	this.insertItemBefore = function(newItem, index) {
        		var retValue = null;
        		if (index >= 0) {
        			if (index < this.numberOfItems) {
        				this._removeFromOtherLists(newItem);
        				var newxforms = new Array(this.numberOfItems + 1);
        				// TODO: use array copying and slicing
        				var i;
        				for (i = 0; i < index; ++i) {
        					newxforms[i] = this._xforms[i];
        				}
        				newxforms[i] = newItem;
        				var j;
        				for (j = i+1; i < this.numberOfItems; ++j, ++i) {
        					newxforms[j] = this._xforms[i];
        				}
        				this.numberOfItems++;
        				this._xforms = newxforms;
        				retValue = newItem;
        				this._list._update();
        			}
        			else {
        				retValue = this._list.appendItem(newItem);
        			}
        		}
        		return retValue;
        	};
        
        	this.replaceItem = function(newItem, index) {
        		var retValue = null;
        		if (index < this.numberOfItems && index >= 0) {
        			this._removeFromOtherLists(newItem);
        			this._xforms[index] = newItem;
        			retValue = newItem;
        			this._list._update();
        		}
        		return retValue;
        	};
        
        	this.removeItem = function(index) {
        		if (index < this.numberOfItems && index >= 0) {
        			var retValue = this._xforms[index];
        			var newxforms = new Array(this.numberOfItems - 1);
        			var i, j;
        			for (i = 0; i < index; ++i) {
        				newxforms[i] = this._xforms[i];
        			}
        			for (j = i; j < this.numberOfItems-1; ++j, ++i) {
        				newxforms[j] = this._xforms[i+1];
        			}
        			this.numberOfItems--;
        			this._xforms = newxforms;
        			this._list._update();
        			return retValue;
        		}
        		throw {code: 1}; // DOMException with code=INDEX_SIZE_ERR
        	};
        
        	this.appendItem = function(newItem) {
        		this._removeFromOtherLists(newItem);
        		this._xforms.push(newItem);
        		this.numberOfItems++;
        		this._list._update();
        		return newItem;
        	};
        };
        
        
        svgedit.transformlist.resetListMap = function() {
        	listMap_ = {};
        };
        
        /**
         * Removes transforms of the given element from the map.
         * Parameters:
         * elem - a DOM Element
         */
        svgedit.transformlist.removeElementFromListMap = function(elem) {
        	if (elem.id && listMap_[elem.id]) {
        		delete listMap_[elem.id];
        	}
        };
        
        // Function: getTransformList
        // Returns an object that behaves like a SVGTransformList for the given DOM element
        //
        // Parameters:
        // elem - DOM element to get a transformlist from
        svgedit.transformlist.getTransformList = function(elem) {
        	if (!svgedit.browser.supportsNativeTransformLists()) {
        		var id = elem.id || 'temp';
        		var t = listMap_[id];
        		if (!t || id === 'temp') {
        			listMap_[id] = new svgedit.transformlist.SVGTransformList(elem);
        			listMap_[id]._init();
        			t = listMap_[id];
        		}
        		return t;
        	}
        	if (elem.transform) {
        		return elem.transform.baseVal;
        	}
        	if (elem.gradientTransform) {
        		return elem.gradientTransform.baseVal;
        	}
        	if (elem.patternTransform) {
        		return elem.patternTransform.baseVal;
        	}
        
        	return null;
        };
        
        }());
      • svgutils.js
        /*globals $, svgedit, unescape, DOMParser, ActiveXObject, getStrokedBBox*/
        /*jslint vars: true, eqeq: true, bitwise: true, continue: true, forin: true*/
        /**
         * Package: svgedit.utilities
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        // 2) browser.js
        // 3) svgtransformlist.js
        // 4) units.js
        
        (function(undef) {'use strict';
        
        if (!svgedit.utilities) {
        	svgedit.utilities = {};
        }
        
        // Constants
        
        // String used to encode base64.
        var KEYSTR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
        var NS = svgedit.NS;
        
        // Much faster than running getBBox() every time
        var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use';
        var visElems_arr = visElems.split(',');
        //var hidElems = 'clipPath,defs,desc,feGaussianBlur,filter,linearGradient,marker,mask,metadata,pattern,radialGradient,stop,switch,symbol,title,textPath';
        
        var editorContext_ = null;
        var domdoc_ = null;
        var domcontainer_ = null;
        var svgroot_ = null;
        
        svgedit.utilities.init = function(editorContext) {
        	editorContext_ = editorContext;
        	domdoc_ = editorContext.getDOMDocument();
        	domcontainer_ = editorContext.getDOMContainer();
        	svgroot_ = editorContext.getSVGRoot();
        };
        
        // Function: svgedit.utilities.toXml
        // Converts characters in a string to XML-friendly entities.
        //
        // Example: '&' becomes '&amp;'
        //
        // Parameters:
        // str - The string to be converted
        //
        // Returns:
        // The converted string
        svgedit.utilities.toXml = function(str) {
        	// &apos; is ok in XML, but not HTML
        	// &gt; does not normally need escaping, though it can if within a CDATA expression (and preceded by "]]")
        	return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/, '&#x27;');
        };
        
        // Function: svgedit.utilities.fromXml
        // Converts XML entities in a string to single characters.
        // Example: '&amp;' becomes '&'
        //
        // Parameters:
        // str - The string to be converted
        //
        // Returns:
        // The converted string
        svgedit.utilities.fromXml = function(str) {
        	return $('<p/>').html(str).text();
        };
        
        // This code was written by Tyler Akins and has been placed in the
        // public domain.  It would be nice if you left this header intact.
        // Base64 code from Tyler Akins -- http://rumkin.com
        
        // schiller: Removed string concatenation in favour of Array.join() optimization,
        //				also precalculate the size of the array needed.
        
        // Function: svgedit.utilities.encode64
        // Converts a string to base64
        svgedit.utilities.encode64 = function(input) {
        	// base64 strings are 4/3 larger than the original string
        	input = svgedit.utilities.encodeUTF8(input); // convert non-ASCII characters
        	// input = svgedit.utilities.convertToXMLReferences(input);
        	if (window.btoa) {
        		return window.btoa(input); // Use native if available
            }
            var output = [];
        	output.length = Math.floor( (input.length + 2) / 3 ) * 4;
        	var chr1, chr2, chr3;
        	var enc1, enc2, enc3, enc4;
        	var i = 0, p = 0;
        
        	do {
        		chr1 = input.charCodeAt(i++);
        		chr2 = input.charCodeAt(i++);
        		chr3 = input.charCodeAt(i++);
        
        		enc1 = chr1 >> 2;
        		enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        		enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        		enc4 = chr3 & 63;
        
        		if (isNaN(chr2)) {
        			enc3 = enc4 = 64;
        		} else if (isNaN(chr3)) {
        			enc4 = 64;
        		}
        
        		output[p++] = KEYSTR.charAt(enc1);
        		output[p++] = KEYSTR.charAt(enc2);
        		output[p++] = KEYSTR.charAt(enc3);
        		output[p++] = KEYSTR.charAt(enc4);
        	} while (i < input.length);
        
        	return output.join('');
        };
        
        // Function: svgedit.utilities.decode64
        // Converts a string from base64
        svgedit.utilities.decode64 = function(input) {
        	if(window.atob) {
                return svgedit.utilities.decodeUTF8(window.atob(input));
            }
        	var output = '';
        	var chr1, chr2, chr3 = '';
        	var enc1, enc2, enc3, enc4 = '';
        	var i = 0;
        
        	// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
        	input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
        
        	do {
        		enc1 = KEYSTR.indexOf(input.charAt(i++));
        		enc2 = KEYSTR.indexOf(input.charAt(i++));
        		enc3 = KEYSTR.indexOf(input.charAt(i++));
        		enc4 = KEYSTR.indexOf(input.charAt(i++));
        
        		chr1 = (enc1 << 2) | (enc2 >> 4);
        		chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        		chr3 = ((enc3 & 3) << 6) | enc4;
        
        		output = output + String.fromCharCode(chr1);
        
        		if (enc3 != 64) {
        			output = output + String.fromCharCode(chr2);
        		}
        		if (enc4 != 64) {
        			output = output + String.fromCharCode(chr3);
        		}
        
        		chr1 = chr2 = chr3 = '';
        		enc1 = enc2 = enc3 = enc4 = '';
        
        	} while (i < input.length);
            return svgedit.utilities.decodeUTF8(output);
        };
        
        svgedit.utilities.decodeUTF8 = function (argString) {
            return decodeURIComponent(escape(argString));
        };
        
        // codedread:does not seem to work with webkit-based browsers on OSX // Brettz9: please test again as function upgraded
        svgedit.utilities.encodeUTF8 = function (argString) {
          return unescape(encodeURIComponent(argString));
        };
        
        // Function: svgedit.utilities.convertToXMLReferences
        // Converts a string to use XML references
        svgedit.utilities.convertToXMLReferences = function(input) {
        	var n,
        		output = '';
        	for (n = 0; n < input.length; n++){
        		var c = input.charCodeAt(n);
        		if (c < 128) {
        			output += input[n];
        		} else if(c > 127) {
        			output += ('&#' + c + ';');
        		}
        	}
        	return output;
        };
        
        // Function: svgedit.utilities.text2xml
        // Cross-browser compatible method of converting a string to an XML tree
        // found this function here: http://groups.google.com/group/jquery-dev/browse_thread/thread/c6d11387c580a77f
        svgedit.utilities.text2xml = function(sXML) {
        	if(sXML.indexOf('<svg:svg') >= 0) {
        		sXML = sXML.replace(/<(\/?)svg:/g, '<$1').replace('xmlns:svg', 'xmlns');
        	}
        
        	var out, dXML;
        	try{
        		dXML = (window.DOMParser)?new DOMParser():new ActiveXObject('Microsoft.XMLDOM');
        		dXML.async = false;
        	} catch(e){
        		throw new Error('XML Parser could not be instantiated');
        	}
        	try{
        		if (dXML.loadXML) {
        			out = (dXML.loadXML(sXML)) ? dXML : false;
        		}
        		else {
        			out = dXML.parseFromString(sXML, 'text/xml');
        		}
        	}
        	catch(e2){ throw new Error('Error parsing XML string'); }
        	return out;
        };
        
        // Function: svgedit.utilities.bboxToObj
        // Converts a SVGRect into an object.
        // 
        // Parameters:
        // bbox - a SVGRect
        // 
        // Returns:
        // An object with properties names x, y, width, height.
        svgedit.utilities.bboxToObj = function(bbox) {
        	return {
        		x: bbox.x,
        		y: bbox.y,
        		width: bbox.width,
        		height: bbox.height
        	};
        };
        
        // Function: svgedit.utilities.walkTree
        // Walks the tree and executes the callback on each element in a top-down fashion
        //
        // Parameters:
        // elem - DOM element to traverse
        // cbFn - Callback function to run on each element
        svgedit.utilities.walkTree = function(elem, cbFn){
        	if (elem && elem.nodeType == 1) {
        		cbFn(elem);
        		var i = elem.childNodes.length;
        		while (i--) {
        			svgedit.utilities.walkTree(elem.childNodes.item(i), cbFn);
        		}
        	}
        };
        
        // Function: svgedit.utilities.walkTreePost
        // Walks the tree and executes the callback on each element in a depth-first fashion
        // TODO: FIXME: Shouldn't this be calling walkTreePost?
        //
        // Parameters:
        // elem - DOM element to traverse
        // cbFn - Callback function to run on each element
        svgedit.utilities.walkTreePost = function(elem, cbFn) {
        	if (elem && elem.nodeType == 1) {
        		var i = elem.childNodes.length;
        		while (i--) {
        			svgedit.utilities.walkTree(elem.childNodes.item(i), cbFn);
        		}
        		cbFn(elem);
        	}
        };
        
        // Function: svgedit.utilities.getUrlFromAttr
        // Extracts the URL from the url(...) syntax of some attributes.
        // Three variants:
        //  * <circle fill="url(someFile.svg#foo)" />
        //  * <circle fill="url('someFile.svg#foo')" />
        //  * <circle fill='url("someFile.svg#foo")' />
        //
        // Parameters:
        // attrVal - The attribute value as a string
        //
        // Returns:
        // String with just the URL, like someFile.svg#foo
        svgedit.utilities.getUrlFromAttr = function(attrVal) {
        	if (attrVal) {
        		// url("#somegrad")
        		if (attrVal.indexOf('url("') === 0) {
        			return attrVal.substring(5, attrVal.indexOf('"',6));
        		}
        		// url('#somegrad')
        		if (attrVal.indexOf("url('") === 0) {
        			return attrVal.substring(5, attrVal.indexOf("'",6));
        		}
        		if (attrVal.indexOf("url(") === 0) {
        			return attrVal.substring(4, attrVal.indexOf(')'));
        		}
        	}
        	return null;
        };
        
        // Function: svgedit.utilities.getHref
        // Returns the given element's xlink:href value
        svgedit.utilities.getHref = function(elem) {
        	return elem.getAttributeNS(NS.XLINK, 'href');
        };
        
        // Function: svgedit.utilities.setHref
        // Sets the given element's xlink:href value
        svgedit.utilities.setHref = function(elem, val) {
        	elem.setAttributeNS(NS.XLINK, 'xlink:href', val);
        };
        
        // Function: findDefs
        //
        // Returns:
        // The document's <defs> element, create it first if necessary
        svgedit.utilities.findDefs = function() {
        	var svgElement = editorContext_.getSVGContent();
        	var defs = svgElement.getElementsByTagNameNS(NS.SVG, 'defs');
        	if (defs.length > 0) {
        		defs = defs[0];
        	} else {
        		defs = svgElement.ownerDocument.createElementNS(NS.SVG, 'defs');
        		if (svgElement.firstChild) {
        			// first child is a comment, so call nextSibling
        			svgElement.insertBefore(defs, svgElement.firstChild.nextSibling);
        		} else {
        			svgElement.appendChild(defs);
        		}
        	}
        	return defs;
        };
        
        // TODO(codedread): Consider moving the next to functions to bbox.js
        
        // Function: svgedit.utilities.getPathBBox
        // Get correct BBox for a path in Webkit
        // Converted from code found here:
        // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html
        //
        // Parameters:
        // path - The path DOM element to get the BBox for
        //
        // Returns:
        // A BBox-like object
        svgedit.utilities.getPathBBox = function(path) {
        	var seglist = path.pathSegList;
        	var tot = seglist.numberOfItems;
        
        	var bounds = [[], []];
        	var start = seglist.getItem(0);
        	var P0 = [start.x, start.y];
        
        	var i;
        	for (i = 0; i < tot; i++) {
        		var seg = seglist.getItem(i);
        
        		if(seg.x === undef) {continue;}
        
        		// Add actual points to limits
        		bounds[0].push(P0[0]);
        		bounds[1].push(P0[1]);
        
        		if (seg.x1) {
        			var P1 = [seg.x1, seg.y1],
        				P2 = [seg.x2, seg.y2],
        				P3 = [seg.x, seg.y];
        
        			var j;
        			for (j = 0; j < 2; j++) {
        
        				var calc = function(t) {
        					return Math.pow(1-t,3) * P0[j]
        						+ 3 * Math.pow(1-t,2) * t * P1[j]
        						+ 3 * (1-t) * Math.pow(t, 2) * P2[j]
        						+ Math.pow(t,3) * P3[j];
        				};
        
        				var b = 6 * P0[j] - 12 * P1[j] + 6 * P2[j];
        				var a = -3 * P0[j] + 9 * P1[j] - 9 * P2[j] + 3 * P3[j];
        				var c = 3 * P1[j] - 3 * P0[j];
        
        				if (a == 0) {
        					if (b == 0) {
        						continue;
        					}
        					var t = -c / b;
        					if (0 < t && t < 1) {
        						bounds[j].push(calc(t));
        					}
        					continue;
        				}
        				var b2ac = Math.pow(b,2) - 4 * c * a;
        				if (b2ac < 0) {continue;}
        				var t1 = (-b + Math.sqrt(b2ac))/(2 * a);
        				if (0 < t1 && t1 < 1) {bounds[j].push(calc(t1));}
        				var t2 = (-b - Math.sqrt(b2ac))/(2 * a);
        				if (0 < t2 && t2 < 1) {bounds[j].push(calc(t2));}
        			}
        			P0 = P3;
        		} else {
        			bounds[0].push(seg.x);
        			bounds[1].push(seg.y);
        		}
        	}
        
        	var x = Math.min.apply(null, bounds[0]);
        	var w = Math.max.apply(null, bounds[0]) - x;
        	var y = Math.min.apply(null, bounds[1]);
        	var h = Math.max.apply(null, bounds[1]) - y;
        	return {
        		'x': x,
        		'y': y,
        		'width': w,
        		'height': h
        	};
        };
        
        // Function: groupBBFix
        // Get the given/selected element's bounding box object, checking for
        // horizontal/vertical lines (see issue 717)
        // Note that performance is currently terrible, so some way to improve would
        // be great.
        //
        // Parameters:
        // selected - Container or <use> DOM element
        function groupBBFix(selected) {
        	if(svgedit.browser.supportsHVLineContainerBBox()) {
        		try { return selected.getBBox();} catch(e){}
        	}
        	var ref = $.data(selected, 'ref');
        	var matched = null;
        	var ret, copy;
        
        	if(ref) {
        		copy = $(ref).children().clone().attr('visibility', 'hidden');
        		$(svgroot_).append(copy);
        		matched = copy.filter('line, path');
        	} else {
        		matched = $(selected).find('line, path');
        	}
        
        	var issue = false;
        	if(matched.length) {
        		matched.each(function() {
        			var bb = this.getBBox();
        			if(!bb.width || !bb.height) {
        				issue = true;
        			}
        		});
        		if(issue) {
        			var elems = ref ? copy : $(selected).children();
        			ret = getStrokedBBox(elems); // getStrokedBBox defined in svgcanvas
        		} else {
        			ret = selected.getBBox();
        		}
        	} else {
        		ret = selected.getBBox();
        	}
        	if(ref) {
        		copy.remove();
        	}
        	return ret;
        }
        
        // Function: svgedit.utilities.getBBox
        // Get the given/selected element's bounding box object, convert it to be more
        // usable when necessary
        //
        // Parameters:
        // elem - Optional DOM element to get the BBox for
        svgedit.utilities.getBBox = function(elem) {
        	var selected = elem || editorContext_.geSelectedElements()[0];
        	if (elem.nodeType != 1) {return null;}
        	var ret = null;
        	var elname = selected.nodeName;
        
        	switch ( elname ) {
        	case 'text':
        		if(selected.textContent === '') {
        			selected.textContent = 'a'; // Some character needed for the selector to use.
        			ret = selected.getBBox();
        			selected.textContent = '';
        		} else {
        			try { ret = selected.getBBox();} catch(e){}
        		}
        		break;
        	case 'path':
        		if(!svgedit.browser.supportsPathBBox()) {
        			ret = svgedit.utilities.getPathBBox(selected);
        		} else {
        			try { ret = selected.getBBox();} catch(e2){}
        		}
        		break;
        	case 'g':
        	case 'a':
        		ret = groupBBFix(selected);
        		break;
        	default:
        
        		if(elname === 'use') {
        			ret = groupBBFix(selected, true);
        		}
        		if(elname === 'use' || ( elname === 'foreignObject' && svgedit.browser.isWebkit() ) ) {
        			if(!ret) {ret = selected.getBBox();}
        			// This is resolved in later versions of webkit, perhaps we should
        			// have a featured detection for correct 'use' behavior?
        			// ——————————
        			//if(!svgedit.browser.isWebkit()) {
        				var bb = {};
        				bb.width = ret.width;
        				bb.height = ret.height;
        				bb.x = ret.x + parseFloat(selected.getAttribute('x')||0);
        				bb.y = ret.y + parseFloat(selected.getAttribute('y')||0);
        				ret = bb;
        			//}
        		} else if(~visElems_arr.indexOf(elname)) {
        			try { ret = selected.getBBox();}
        			catch(e3) {
        				// Check if element is child of a foreignObject
        				var fo = $(selected).closest('foreignObject');
        				if(fo.length) {
        					try {
        						ret = fo[0].getBBox();
        					} catch(e4) {
        						ret = null;
        					}
        				} else {
        					ret = null;
        				}
        			}
        		}
        	}
        	if(ret) {
        		ret = svgedit.utilities.bboxToObj(ret);
        	}
        
        	// get the bounding box from the DOM (which is in that element's coordinate system)
        	return ret;
        };
        
        // Function: svgedit.utilities.getRotationAngle
        // Get the rotation angle of the given/selected DOM element
        //
        // Parameters:
        // elem - Optional DOM element to get the angle for
        // to_rad - Boolean that when true returns the value in radians rather than degrees
        //
        // Returns:
        // Float with the angle in degrees or radians
        svgedit.utilities.getRotationAngle = function(elem, to_rad) {
        	var selected = elem || editorContext_.getSelectedElements()[0];
        	// find the rotation transform (if any) and set it
        	var tlist = svgedit.transformlist.getTransformList(selected);
        	if(!tlist) {return 0;} // <svg> elements have no tlist
        	var N = tlist.numberOfItems;
        	var i;
        	for (i = 0; i < N; ++i) {
        		var xform = tlist.getItem(i);
        		if (xform.type == 4) {
        			return to_rad ? xform.angle * Math.PI / 180.0 : xform.angle;
        		}
        	}
        	return 0.0;
        };
        
        // Function getRefElem
        // Get the reference element associated with the given attribute value
        //
        // Parameters:
        // attrVal - The attribute value as a string
        svgedit.utilities.getRefElem = function(attrVal) {
        	return svgedit.utilities.getElem(svgedit.utilities.getUrlFromAttr(attrVal).substr(1));
        };
        
        // Function: getElem
        // Get a DOM element by ID within the SVG root element.
        //
        // Parameters:
        // id - String with the element's new ID
        if (svgedit.browser.supportsSelectors()) {
        	svgedit.utilities.getElem = function(id) {
        		// querySelector lookup
        		return svgroot_.querySelector('#'+id);
        	};
        } else if (svgedit.browser.supportsXpath()) {
        	svgedit.utilities.getElem = function(id) {
        		// xpath lookup
        		return domdoc_.evaluate(
        			'svg:svg[@id="svgroot"]//svg:*[@id="'+id+'"]',
        			domcontainer_,
        			function() { return svgedit.NS.SVG; },
        			9,
        			null).singleNodeValue;
        	};
        } else {
        	svgedit.utilities.getElem = function(id) {
        		// jQuery lookup: twice as slow as xpath in FF
        		return $(svgroot_).find('[id=' + id + ']')[0];
        	};
        }
        
        // Function: assignAttributes
        // Assigns multiple attributes to an element.
        //
        // Parameters: 
        // node - DOM element to apply new attribute values to
        // attrs - Object with attribute keys/values
        // suspendLength - Optional integer of milliseconds to suspend redraw
        // unitCheck - Boolean to indicate the need to use svgedit.units.setUnitAttr
        svgedit.utilities.assignAttributes = function(node, attrs, suspendLength, unitCheck) {
        	if(!suspendLength) {suspendLength = 0;}
        	// Opera has a problem with suspendRedraw() apparently
        	var handle = null;
        	if (!svgedit.browser.isOpera()) {svgroot_.suspendRedraw(suspendLength);}
        
        	var i;
        	for (i in attrs) {
        		var ns = (i.substr(0,4) === 'xml:' ? NS.XML :
        			i.substr(0,6) === 'xlink:' ? NS.XLINK : null);
        
        		if(ns) {
        			node.setAttributeNS(ns, i, attrs[i]);
        		} else if(!unitCheck) {
        			node.setAttribute(i, attrs[i]);
        		} else {
        			svgedit.units.setUnitAttr(node, i, attrs[i]);
        		}
        	}
        	if (!svgedit.browser.isOpera()) {svgroot_.unsuspendRedraw(handle);}
        };
        
        // Function: cleanupElement
        // Remove unneeded (default) attributes, makes resulting SVG smaller
        //
        // Parameters:
        // element - DOM element to clean up
        svgedit.utilities.cleanupElement = function(element) {
        	var handle = svgroot_.suspendRedraw(60);
        	var defaults = {
        		'fill-opacity':1,
        		'stop-opacity':1,
        		'opacity':1,
        		'stroke':'none',
        		'stroke-dasharray':'none',
        		'stroke-linejoin':'miter',
        		'stroke-linecap':'butt',
        		'stroke-opacity':1,
        		'stroke-width':1,
        		'rx':0,
        		'ry':0
        	};
        
        	var attr;
        	for (attr in defaults) {
        		var val = defaults[attr];
        		if(element.getAttribute(attr) == val) {
        			element.removeAttribute(attr);
        		}
        	}
        
        	svgroot_.unsuspendRedraw(handle);
        };
        
        // Function: snapToGrid
        // round value to for snapping
        // NOTE: This function did not move to svgutils.js since it depends on curConfig.
        svgedit.utilities.snapToGrid = function(value) {
        	var stepSize = editorContext_.getSnappingStep();
        	var unit = editorContext_.getBaseUnit();
        	if (unit !== "px") {
        		stepSize *= svgedit.units.getTypeMap()[unit];
        	}
        	value = Math.round(value/stepSize)*stepSize;
        	return value;
        };
        
        svgedit.utilities.preg_quote = function (str, delimiter) {
          // From: http://phpjs.org/functions
          return String(str).replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
        };
        
        /**
        * @param {string} globalCheck A global which can be used to determine if the script is already loaded
        * @param {array} scripts An array of scripts to preload (in order)
        * @param {function} cb The callback to execute upon load.
        */
        svgedit.utilities.executeAfterLoads = function (globalCheck, scripts, cb) {
        	return function () {
        		var args = arguments;
        		function endCallback () {
        			cb.apply(null, args);
        		}
        		if (window[globalCheck]) {
        			endCallback();
        		}
        		else {
        			scripts.reduceRight(function (oldFunc, script) {
        				return function () {
        					$.getScript(script, oldFunc);
        				};
        			}, endCallback)();
        		}
        	};
        };
        
        svgedit.utilities.buildCanvgCallback = function (callCanvg) {
        	return svgedit.utilities.executeAfterLoads('canvg', ['canvg/rgbcolor.js', 'canvg/canvg.js'], callCanvg);
        };
        
        svgedit.utilities.buildJSPDFCallback = function (callJSPDF) {
        	return svgedit.utilities.executeAfterLoads('RGBColor', ['canvg/rgbcolor.js'], function () {
        		var arr = [];
        		if (!RGBColor || RGBColor.ok === undef) { // It's not our RGBColor, so we'll need to load it
        			arr.push('canvg/rgbcolor.js');
        		}
        		svgedit.utilities.executeAfterLoads('jsPDF', arr.concat('jspdf/underscore-min.js', 'jspdf/jspdf.min.js', 'jspdf/jspdf.plugin.svgToPdf.js'), callJSPDF)();
        	});
        };
        
        }());
        
      • touch.js
        // http://ross.posterous.com/2008/08/19/iphone-touch-events-in-javascript/
        function touchHandler(event) {'use strict';
        
        	var simulatedEvent,
        		touches = event.changedTouches,
        		first = touches[0],
        		type = "";
        	switch (event.type) {
        		case "touchstart": type = "mousedown"; break;
        		case "touchmove":  type = "mousemove"; break;
        		case "touchend":   type = "mouseup"; break;
        		default: return;
        	}
        
        	// initMouseEvent(type, canBubble, cancelable, view, clickCount, 
        	//	screenX, screenY, clientX, clientY, ctrlKey, 
        	//	altKey, shiftKey, metaKey, button, relatedTarget);
        
        	simulatedEvent = document.createEvent("MouseEvent");
        	simulatedEvent.initMouseEvent(type, true, true, window, 1,
        								first.screenX, first.screenY,
        								first.clientX, first.clientY, false,
        								false, false, false, 0/*left*/, null);
        	if (touches.length < 2) {
        		first.target.dispatchEvent(simulatedEvent);
        		event.preventDefault();
        	}
        }
        
        document.addEventListener('touchstart', touchHandler, true);
        document.addEventListener('touchmove', touchHandler, true);
        document.addEventListener('touchend', touchHandler, true);
        document.addEventListener('touchcancel', touchHandler, true);
      • units.js
        /*globals $, svgedit*/
        /*jslint vars: true, eqeq: true*/
        /**
         * Package: svgedit.units
         *
         * Licensed under the MIT License
         *
         * Copyright(c) 2010 Alexis Deveria
         * Copyright(c) 2010 Jeff Schiller
         */
        
        // Dependencies:
        // 1) jQuery
        
        (function() {'use strict';
        
        if (!svgedit.units) {
        	svgedit.units = {};
        }
        
        var NS = svgedit.NS;
        var wAttrs = ['x', 'x1', 'cx', 'rx', 'width'];
        var hAttrs = ['y', 'y1', 'cy', 'ry', 'height'];
        var unitAttrs = ['r', 'radius'].concat(wAttrs, hAttrs);
        // unused
        var unitNumMap = {
        	'%':  2,
        	'em': 3,
        	'ex': 4,
        	'px': 5,
        	'cm': 6,
        	'mm': 7,
        	'in': 8,
        	'pt': 9,
        	'pc': 10
        };
        
        // Container of elements.
        var elementContainer_;
        
        /**
         * Stores mapping of unit type to user coordinates.
         */
        var typeMap_ = {};
        
        /**
         * ElementContainer interface
         *
         * function getBaseUnit() - returns a string of the base unit type of the container ('em')
         * function getElement() - returns an element in the container given an id
         * function getHeight() - returns the container's height
         * function getWidth() - returns the container's width
         * function getRoundDigits() - returns the number of digits number should be rounded to
         */
        
        /**
         * Function: svgedit.units.init()
         * Initializes this module.
         *
         * Parameters:
         * elementContainer - an object implementing the ElementContainer interface.
         */
        svgedit.units.init = function(elementContainer) {
        	elementContainer_ = elementContainer;
        
        	// Get correct em/ex values by creating a temporary SVG.
        	var svg = document.createElementNS(NS.SVG, 'svg');
        	document.body.appendChild(svg);
        	var rect = document.createElementNS(NS.SVG, 'rect');
        	rect.setAttribute('width', '1em');
        	rect.setAttribute('height', '1ex');
        	rect.setAttribute('x', '1in');
        	svg.appendChild(rect);
        	var bb = rect.getBBox();
        	document.body.removeChild(svg);
        
        	var inch = bb.x;
        	typeMap_ = {
        		'em': bb.width,
        		'ex': bb.height,
        		'in': inch,
        		'cm': inch / 2.54,
        		'mm': inch / 25.4,
        		'pt': inch / 72,
        		'pc': inch / 6,
        		'px': 1,
        		'%': 0
        	};
        };
        
        // Group: Unit conversion functions
        
        // Function: svgedit.units.getTypeMap
        // Returns the unit object with values for each unit
        svgedit.units.getTypeMap = function() {
        	return typeMap_;
        };
        
        // Function: svgedit.units.shortFloat
        // Rounds a given value to a float with number of digits defined in save_options
        //
        // Parameters:
        // val - The value as a String, Number or Array of two numbers to be rounded
        //
        // Returns:
        // If a string/number was given, returns a Float. If an array, return a string
        // with comma-seperated floats
        svgedit.units.shortFloat = function(val) {
        	var digits = elementContainer_.getRoundDigits();
        	if (!isNaN(val)) {
        		// Note that + converts to Number
        		return +((+val).toFixed(digits));
        	}
        	if ($.isArray(val)) {
        		return svgedit.units.shortFloat(val[0]) + ',' + svgedit.units.shortFloat(val[1]);
        	}
        	return parseFloat(val).toFixed(digits) - 0;
        };
        
        // Function: svgedit.units.convertUnit
        // Converts the number to given unit or baseUnit
        svgedit.units.convertUnit = function(val, unit) {
        	unit = unit || elementContainer_.getBaseUnit();
        //	baseVal.convertToSpecifiedUnits(unitNumMap[unit]);
        //	var val = baseVal.valueInSpecifiedUnits;
        //	baseVal.convertToSpecifiedUnits(1);
        	return svgedit.units.shortFloat(val / typeMap_[unit]);
        };
        
        // Function: svgedit.units.setUnitAttr
        // Sets an element's attribute based on the unit in its current value.
        //
        // Parameters:
        // elem - DOM element to be changed
        // attr - String with the name of the attribute associated with the value
        // val - String with the attribute value to convert
        svgedit.units.setUnitAttr = function(elem, attr, val) {
        //	if (!isNaN(val)) {
        		// New value is a number, so check currently used unit
        //		var old_val = elem.getAttribute(attr);
        
        		// Enable this for alternate mode
        //		if (old_val !== null && (isNaN(old_val) || elementContainer_.getBaseUnit() !== 'px')) {
        //			// Old value was a number, so get unit, then convert
        //			var unit;
        //			if (old_val.substr(-1) === '%') {
        //				var res = getResolution();
        //				unit = '%';
        //				val *= 100;
        //				if (wAttrs.indexOf(attr) >= 0) {
        //					val = val / res.w;
        //				} else if (hAttrs.indexOf(attr) >= 0) {
        //					val = val / res.h;
        //				} else {
        //					return val / Math.sqrt((res.w*res.w) + (res.h*res.h))/Math.sqrt(2);
        //				}
        //			} else {
        //				if (elementContainer_.getBaseUnit() !== 'px') {
        //					unit = elementContainer_.getBaseUnit();
        //				} else {
        //					unit = old_val.substr(-2);
        //				}
        //				val = val / typeMap_[unit];
        //			}
        //
        //		val += unit;
        //		}
        //	}
        	elem.setAttribute(attr, val);
        };
        
        var attrsToConvert = {
        	'line': ['x1', 'x2', 'y1', 'y2'],
        	'circle': ['cx', 'cy', 'r'],
        	'ellipse': ['cx', 'cy', 'rx', 'ry'],
        	'foreignObject': ['x', 'y', 'width', 'height'],
        	'rect': ['x', 'y', 'width', 'height'],
        	'image': ['x', 'y', 'width', 'height'],
        	'use': ['x', 'y', 'width', 'height'],
        	'text': ['x', 'y']
        };
        
        // Function: svgedit.units.convertAttrs
        // Converts all applicable attributes to the configured baseUnit
        //
        // Parameters:
        // element - a DOM element whose attributes should be converted
        svgedit.units.convertAttrs = function(element) {
        	var elName = element.tagName;
        	var unit = elementContainer_.getBaseUnit();
        	var attrs = attrsToConvert[elName];
        	if (!attrs) {return;}
        
        	var len = attrs.length;
        	var i;
        	for (i = 0; i < len; i++) {
        		var attr = attrs[i];
        		var cur = element.getAttribute(attr);
        		if (cur) {
        			if (!isNaN(cur)) {
        				element.setAttribute(attr, (cur / typeMap_[unit]) + unit);
        			}
        			// else {
        				// Convert existing?
        			// }
        		}
        	}
        };
        
        // Function: svgedit.units.convertToNum
        // Converts given values to numbers. Attributes must be supplied in 
        // case a percentage is given
        //
        // Parameters:
        // attr - String with the name of the attribute associated with the value
        // val - String with the attribute value to convert
        svgedit.units.convertToNum = function(attr, val) {
        	// Return a number if that's what it already is
        	if (!isNaN(val)) {return val-0;}
        	var num;
        	if (val.substr(-1) === '%') {
        		// Deal with percentage, depends on attribute
        		num = val.substr(0, val.length-1)/100;
        		var width = elementContainer_.getWidth();
        		var height = elementContainer_.getHeight();
        
        		if (wAttrs.indexOf(attr) >= 0) {
        			return num * width;
        		}
        		if (hAttrs.indexOf(attr) >= 0) {
        			return num * height;
        		}
        		return num * Math.sqrt((width*width) + (height*height))/Math.sqrt(2);
        	}
        	var unit = val.substr(-2);
        	num = val.substr(0, val.length-2);
        	// Note that this multiplication turns the string into a number
        	return num * typeMap_[unit];
        };
        
        // Function: svgedit.units.isValidUnit
        // Check if an attribute's value is in a valid format
        //
        // Parameters:
        // attr - String with the name of the attribute associated with the value
        // val - String with the attribute value to check
        svgedit.units.isValidUnit = function(attr, val, selectedElement) {
        	var valid = false;
        	if (unitAttrs.indexOf(attr) >= 0) {
        		// True if it's just a number
        		if (!isNaN(val)) {
        			valid = true;
        		} else {
        		// Not a number, check if it has a valid unit
        			val = val.toLowerCase();
        			$.each(typeMap_, function(unit) {
        				if (valid) {return;}
        				var re = new RegExp('^-?[\\d\\.]+' + unit + '$');
        				if (re.test(val)) {valid = true;}
        			});
        		}
        	} else if (attr == 'id') {
        		// if we're trying to change the id, make sure it's not already present in the doc
        		// and the id value is valid.
        
        		var result = false;
        		// because getElem() can throw an exception in the case of an invalid id
        		// (according to http://www.w3.org/TR/xml-id/ IDs must be a NCName)
        		// we wrap it in an exception and only return true if the ID was valid and
        		// not already present
        		try {
        			var elem = elementContainer_.getElement(val);
        			result = (elem == null || elem === selectedElement);
        		} catch(e) {}
        		return result;
        	}
        	valid = true;
        
        	return valid;
        };
        
        }());
    • embed
      • start.ts
        module shell {
        
          function start(complete: () => void) {
            complete();
          }
        
        
          (<any>shell).start = start;
        
        }
    • index.html
      <!doctyle html>
      <title>SVG editor / EMBED</title>
      
      
      <script data-legit=mi>
        // ONERROR
        <%=embedFile('boot/onerror.js')%>
      //# sourceURL=boot/onerror.js
      </script>
      
      
      <script data-legit=mi>
        // EARLYBOOT
        earlyBoot(window);
      
        	<%=typescriptBuild('boot/*')%>
      
        	<%=embedFile('/boot/bootUI.js')%>
      //# sourceURL=/boot/base.js
      </script>
      
      <script data-legit=mi>
      
        // LOADER
      <%=typescriptBuild('load/*', 'persistence/*', 'boot/base.d.ts', 'typings/*')%>
      //# sourceURL=/load/shellLoader.ts.js
      </script>
      
      <!-- total 12Mb, saved <%=(function() {
      
      // TOTAL SUMMARY
      var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
      
      var saveDate = new Date();
      var dtText =
        saveDate.getDate() + ' ' +
        monthsPrettyCase[saveDate.getMonth()] + ' ' +
        saveDate.getFullYear() + ' ' +
        num2(saveDate.getHours()) + ':' +
        num2(saveDate.getMinutes()) + ':' +
        num2(saveDate.getSeconds()) + '.' +
        (+saveDate).toString().slice(-3);
      
      var saveDateLocalStr = saveDate.toString();
      var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
      if (gmtMatch)
      	dtText += ' ' + gmtMatch[1];
      
      return dtText;
      
      function num2(n) { return n <= 9 ? '0' + n : '' + n; }
      
      })()
      %> -->
      
      <!-- /shell/!onerror.js
      <%=embedFile('/boot/onerror.js')%>
      -->
      
      <!-- /shell/svge-embed.js
      <%=typescriptBuild('svge-embed/embed/*', 'persistence/API.d.ts', 'typings/*')%>
      -->
      
      <%=(function() {
      
        // THE ACTUAL BUILD SCRIPT IS IN  [build]  SUBDIRECTORY
      
        var drive = portabled.build.processTemplate.mainDrive;
      	var buildScript = typescriptBuild('svge-embed/build/*', 'persistence/API.d.ts', 'typings/*')();
        console.log({ buildScript: buildScript });
      
        var buildFN =eval(
          '(function() { return function(drive){\n'+
          buildScript+'\n'+
          'return svge.build.buildEmbedFiles(drive);\n'+
          '}; })() //# sourceURL=/build/svge-build.js ');
      
        return buildFN(drive);
      
      })()%>
  • typescript
    • lib.d.ts
      /*! *****************************************************************************
      Copyright (c) Microsoft Corporation. All rights reserved. 
      Licensed under the Apache License, Version 2.0 (the "License"); you may not use
      this file except in compliance with the License. You may obtain a copy of the
      License at http://www.apache.org/licenses/LICENSE-2.0  
       
      THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
      WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
      MERCHANTABLITY OR NON-INFRINGEMENT. 
       
      See the Apache Version 2.0 License for specific language governing permissions
      and limitations under the License.
      ***************************************************************************** */
      
      /// <reference no-default-lib="true"/>
      
      /////////////////////////////
      /// ECMAScript APIs
      /////////////////////////////
      
      declare var NaN: number;
      declare var Infinity: number;
      
      /**
        * Evaluates JavaScript code and executes it. 
        * @param x A String value that contains valid JavaScript code.
        */
      declare function eval(x: string): any;
      
      /**
        * Converts A string to an integer.
        * @param s A string to convert into a number.
        * @param radix A value between 2 and 36 that specifies the base of the number in numString. 
        * If this argument is not supplied, strings with a prefix of '0x' are considered hexadecimal.
        * All other strings are considered decimal.
        */
      declare function parseInt(s: string, radix?: number): number;
      
      /**
        * Converts a string to a floating-point number. 
        * @param string A string that contains a floating-point number. 
        */
      declare function parseFloat(string: string): number;
      
      /**
        * Returns a Boolean value that indicates whether a value is the reserved value NaN (not a number). 
        * @param number A numeric value.
        */
      declare function isNaN(number: number): boolean;
      
      /** 
        * Determines whether a supplied number is finite.
        * @param number Any numeric value.
        */
      declare function isFinite(number: number): boolean;
      
      /**
        * Gets the unencoded version of an encoded Uniform Resource Identifier (URI).
        * @param encodedURI A value representing an encoded URI.
        */
      declare function decodeURI(encodedURI: string): string;
      
      /**
        * Gets the unencoded version of an encoded component of a Uniform Resource Identifier (URI).
        * @param encodedURIComponent A value representing an encoded URI component.
        */
      declare function decodeURIComponent(encodedURIComponent: string): string;
      
      /** 
        * Encodes a text string as a valid Uniform Resource Identifier (URI)
        * @param uri A value representing an encoded URI.
        */
      declare function encodeURI(uri: string): string;
      
      /**
        * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).
        * @param uriComponent A value representing an encoded URI component.
        */
      declare function encodeURIComponent(uriComponent: string): string;
      
      interface PropertyDescriptor {
          configurable?: boolean;
          enumerable?: boolean;
          value?: any;
          writable?: boolean;
          get? (): any;
          set? (v: any): void;
      }
      
      interface PropertyDescriptorMap {
          [s: string]: PropertyDescriptor;
      }
      
      interface Object {
          /** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
          constructor: Function;
      
          /** Returns a string representation of an object. */
          toString(): string;
      
          /** Returns a date converted to a string using the current locale. */
          toLocaleString(): string;
      
          /** Returns the primitive value of the specified object. */
          valueOf(): Object;
      
          /**
            * Determines whether an object has a property with the specified name. 
            * @param v A property name.
            */
          hasOwnProperty(v: string): boolean;
      
          /**
            * Determines whether an object exists in another object's prototype chain. 
            * @param v Another object whose prototype chain is to be checked.
            */
          isPrototypeOf(v: Object): boolean;
      
          /** 
            * Determines whether a specified property is enumerable.
            * @param v A property name.
            */
          propertyIsEnumerable(v: string): boolean;
      }
      
      interface ObjectConstructor {
          new (value?: any): Object;
          (): any;
          (value: any): any;
      
          /** A reference to the prototype for a class of objects. */
          prototype: Object;
      
          /** 
            * Returns the prototype of an object. 
            * @param o The object that references the prototype.
            */
          getPrototypeOf(o: any): any;
      
          /**
            * Gets the own property descriptor of the specified object. 
            * An own property descriptor is one that is defined directly on the object and is not inherited from the object's prototype. 
            * @param o Object that contains the property.
            * @param p Name of the property.
          */
          getOwnPropertyDescriptor(o: any, p: string): PropertyDescriptor;
      
          /** 
            * Returns the names of the own properties of an object. The own properties of an object are those that are defined directly 
            * on that object, and are not inherited from the object's prototype. The properties of an object include both fields (objects) and functions.
            * @param o Object that contains the own properties.
            */
          getOwnPropertyNames(o: any): string[];
      
          /** 
            * Creates an object that has the specified prototype, and that optionally contains specified properties.
            * @param o Object to use as a prototype. May be null
            * @param properties JavaScript object that contains one or more property descriptors. 
            */
          create(o: any, properties?: PropertyDescriptorMap): any;
      
          /**
            * Adds a property to an object, or modifies attributes of an existing property. 
            * @param o Object on which to add or modify the property. This can be a native JavaScript object (that is, a user-defined object or a built in object) or a DOM object.
            * @param p The property name.
            * @param attributes Descriptor for the property. It can be for a data property or an accessor property.
            */
          defineProperty(o: any, p: string, attributes: PropertyDescriptor): any;
      
          /**
            * Adds one or more properties to an object, and/or modifies attributes of existing properties. 
            * @param o Object on which to add or modify the properties. This can be a native JavaScript object or a DOM object.
            * @param properties JavaScript object that contains one or more descriptor objects. Each descriptor object describes a data property or an accessor property.
            */
          defineProperties(o: any, properties: PropertyDescriptorMap): any;
      
          /**
            * Prevents the modification of attributes of existing properties, and prevents the addition of new properties.
            * @param o Object on which to lock the attributes. 
            */
          seal<T>(o: T): T;
      
          /**
            * Prevents the modification of existing property attributes and values, and prevents the addition of new properties.
            * @param o Object on which to lock the attributes.
            */
          freeze<T>(o: T): T;
      
          /**
            * Prevents the addition of new properties to an object.
            * @param o Object to make non-extensible. 
            */
          preventExtensions<T>(o: T): T;
      
          /**
            * Returns true if existing property attributes cannot be modified in an object and new properties cannot be added to the object.
            * @param o Object to test. 
            */
          isSealed(o: any): boolean;
      
          /**
            * Returns true if existing property attributes and values cannot be modified in an object, and new properties cannot be added to the object.
            * @param o Object to test.  
            */
          isFrozen(o: any): boolean;
      
          /**
            * Returns a value that indicates whether new properties can be added to an object.
            * @param o Object to test. 
            */
          isExtensible(o: any): boolean;
      
          /**
            * Returns the names of the enumerable properties and methods of an object.
            * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
            */
          keys(o: any): string[];
      }
      
      /**
        * Provides functionality common to all JavaScript objects.
        */
      declare var Object: ObjectConstructor;
      
      /**
        * Creates a new function.
        */
      interface Function {
          /**
            * Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.
            * @param thisArg The object to be used as the this object.
            * @param argArray A set of arguments to be passed to the function.
            */
          apply(thisArg: any, argArray?: any): any;
      
          /**
            * Calls a method of an object, substituting another object for the current object.
            * @param thisArg The object to be used as the current object.
            * @param argArray A list of arguments to be passed to the method.
            */
          call(thisArg: any, ...argArray: any[]): any;
      
          /**
            * For a given function, creates a bound function that has the same body as the original function. 
            * The this object of the bound function is associated with the specified object, and has the specified initial parameters.
            * @param thisArg An object to which the this keyword can refer inside the new function.
            * @param argArray A list of arguments to be passed to the new function.
            */
          bind(thisArg: any, ...argArray: any[]): any;
      
          prototype: any;
          length: number;
      
          // Non-standard extensions
          arguments: any;
          caller: Function;
      }
      
      interface FunctionConstructor {
          /**
            * Creates a new function.
            * @param args A list of arguments the function accepts.
            */
          new (...args: string[]): Function;
          (...args: string[]): Function;
          prototype: Function;
      }
      
      declare var Function: FunctionConstructor;
      
      interface IArguments {
          [index: number]: any;
          length: number;
          callee: Function;
      }
      
      interface String {
          /** Returns a string representation of a string. */
          toString(): string;
      
          /**
            * Returns the character at the specified index.
            * @param pos The zero-based index of the desired character.
            */
          charAt(pos: number): string;
      
          /** 
            * Returns the Unicode value of the character at the specified location.
            * @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.
            */
          charCodeAt(index: number): number;
      
          /**
            * Returns a string that contains the concatenation of two or more strings.
            * @param strings The strings to append to the end of the string.  
            */
          concat(...strings: string[]): string;
      
          /**
            * Returns the position of the first occurrence of a substring. 
            * @param searchString The substring to search for in the string
            * @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.
            */
          indexOf(searchString: string, position?: number): number;
      
          /**
            * Returns the last occurrence of a substring in the string.
            * @param searchString The substring to search for.
            * @param position The index at which to begin searching. If omitted, the search begins at the end of the string.
            */
          lastIndexOf(searchString: string, position?: number): number;
      
          /**
            * Determines whether two strings are equivalent in the current locale.
            * @param that String to compare to target string
            */
          localeCompare(that: string): number;
      
          /** 
            * Matches a string with a regular expression, and returns an array containing the results of that search.
            * @param regexp A variable name or string literal containing the regular expression pattern and flags.
            */
          match(regexp: string): RegExpMatchArray;
      
          /** 
            * Matches a string with a regular expression, and returns an array containing the results of that search.
            * @param regexp A regular expression object that contains the regular expression pattern and applicable flags. 
            */
          match(regexp: RegExp): RegExpMatchArray;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A String object or string literal that represents the regular expression
            * @param replaceValue A String object or string literal containing the text to replace for every successful match of rgExp in stringObj.
            */
          replace(searchValue: string, replaceValue: string): string;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A String object or string literal that represents the regular expression
            * @param replaceValue A function that returns the replacement text.
            */
          replace(searchValue: string, replaceValue: (substring: string, ...args: any[]) => string): string;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A Regular Expression object containing the regular expression pattern and applicable flags
            * @param replaceValue A String object or string literal containing the text to replace for every successful match of rgExp in stringObj.
            */
          replace(searchValue: RegExp, replaceValue: string): string;
      
          /**
            * Replaces text in a string, using a regular expression or search string.
            * @param searchValue A Regular Expression object containing the regular expression pattern and applicable flags
            * @param replaceValue A function that returns the replacement text.
            */
          replace(searchValue: RegExp, replaceValue: (substring: string, ...args: any[]) => string): string;
      
          /**
            * Finds the first substring match in a regular expression search.
            * @param regexp The regular expression pattern and applicable flags. 
            */
          search(regexp: string): number;
      
          /**
            * Finds the first substring match in a regular expression search.
            * @param regexp The regular expression pattern and applicable flags. 
            */
          search(regexp: RegExp): number;
      
          /**
            * Returns a section of a string.
            * @param start The index to the beginning of the specified portion of stringObj. 
            * @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end. 
            * If this value is not specified, the substring continues to the end of stringObj.
            */
          slice(start?: number, end?: number): string;
      
          /**
            * Split a string into substrings using the specified separator and return them as an array.
            * @param separator A string that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned. 
            * @param limit A value used to limit the number of elements returned in the array.
            */
          split(separator: string, limit?: number): string[];
      
          /**
            * Split a string into substrings using the specified separator and return them as an array.
            * @param separator A Regular Express that identifies character or characters to use in separating the string. If omitted, a single-element array containing the entire string is returned. 
            * @param limit A value used to limit the number of elements returned in the array.
            */
          split(separator: RegExp, limit?: number): string[];
      
          /**
            * Returns the substring at the specified location within a String object. 
            * @param start The zero-based index number indicating the beginning of the substring.
            * @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.
            * If end is omitted, the characters from start through the end of the original string are returned.
            */
          substring(start: number, end?: number): string;
      
          /** Converts all the alphabetic characters in a string to lowercase. */
          toLowerCase(): string;
      
          /** Converts all alphabetic characters to lowercase, taking into account the host environment's current locale. */
          toLocaleLowerCase(): string;
      
          /** Converts all the alphabetic characters in a string to uppercase. */
          toUpperCase(): string;
      
          /** Returns a string where all alphabetic characters have been converted to uppercase, taking into account the host environment's current locale. */
          toLocaleUpperCase(): string;
      
          /** Removes the leading and trailing white space and line terminator characters from a string. */
          trim(): string;
      
          /** Returns the length of a String object. */
          length: number;
      
          // IE extensions
          /**
            * Gets a substring beginning at the specified location and having the specified length.
            * @param from The starting position of the desired substring. The index of the first character in the string is zero.
            * @param length The number of characters to include in the returned substring.
            */
          substr(from: number, length?: number): string;
      
          /** Returns the primitive value of the specified object. */
          valueOf(): string;
      
          [index: number]: string;
      }
      
      interface StringConstructor {
          new (value?: any): String;
          (value?: any): string;
          prototype: String;
          fromCharCode(...codes: number[]): string;
      }
      
      /** 
        * Allows manipulation and formatting of text strings and determination and location of substrings within strings. 
        */
      declare var String: StringConstructor;
      
      interface Boolean {
          /** Returns the primitive value of the specified object. */
          valueOf(): boolean;
      }
      
      interface BooleanConstructor {
          new (value?: any): Boolean;
          (value?: any): boolean;
          prototype: Boolean;
      }
      
      declare var Boolean: BooleanConstructor;
      
      interface Number {
          /**
            * Returns a string representation of an object.
            * @param radix Specifies a radix for converting numeric values to strings. This value is only used for numbers.
            */
          toString(radix?: number): string;
      
          /** 
            * Returns a string representing a number in fixed-point notation.
            * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
            */
          toFixed(fractionDigits?: number): string;
      
          /**
            * Returns a string containing a number represented in exponential notation.
            * @param fractionDigits Number of digits after the decimal point. Must be in the range 0 - 20, inclusive.
            */
          toExponential(fractionDigits?: number): string;
      
          /**
            * Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.
            * @param precision Number of significant digits. Must be in the range 1 - 21, inclusive.
            */
          toPrecision(precision?: number): string;
      
          /** Returns the primitive value of the specified object. */
          valueOf(): number;
      }
      
      interface NumberConstructor {
          new (value?: any): Number;
          (value?: any): number;
          prototype: Number;
      
          /** The largest number that can be represented in JavaScript. Equal to approximately 1.79E+308. */
          MAX_VALUE: number;
      
          /** The closest number to zero that can be represented in JavaScript. Equal to approximately 5.00E-324. */
          MIN_VALUE: number;
      
          /** 
            * A value that is not a number.
            * In equality comparisons, NaN does not equal any value, including itself. To test whether a value is equivalent to NaN, use the isNaN function.
            */
          NaN: number;
      
          /** 
            * A value that is less than the largest negative number that can be represented in JavaScript.
            * JavaScript displays NEGATIVE_INFINITY values as -infinity. 
            */
          NEGATIVE_INFINITY: number;
      
          /**
            * A value greater than the largest number that can be represented in JavaScript. 
            * JavaScript displays POSITIVE_INFINITY values as infinity. 
            */
          POSITIVE_INFINITY: number;
      }
      
      /** An object that represents a number of any kind. All JavaScript numbers are 64-bit floating-point numbers. */
      declare var Number: NumberConstructor;
      
      interface TemplateStringsArray extends Array<string> {
          raw: string[];
      }
      
      interface Math {
          /** The mathematical constant e. This is Euler's number, the base of natural logarithms. */
          E: number;
          /** The natural logarithm of 10. */
          LN10: number;
          /** The natural logarithm of 2. */
          LN2: number;
          /** The base-2 logarithm of e. */
          LOG2E: number;
          /** The base-10 logarithm of e. */
          LOG10E: number;
          /** Pi. This is the ratio of the circumference of a circle to its diameter. */
          PI: number;
          /** The square root of 0.5, or, equivalently, one divided by the square root of 2. */
          SQRT1_2: number;
          /** The square root of 2. */
          SQRT2: number;
          /**
            * Returns the absolute value of a number (the value without regard to whether it is positive or negative). 
            * For example, the absolute value of -5 is the same as the absolute value of 5.
            * @param x A numeric expression for which the absolute value is needed.
            */
          abs(x: number): number;
          /**
            * Returns the arc cosine (or inverse cosine) of a number. 
            * @param x A numeric expression.
            */
          acos(x: number): number;
          /** 
            * Returns the arcsine of a number. 
            * @param x A numeric expression.
            */
          asin(x: number): number;
          /**
            * Returns the arctangent of a number. 
            * @param x A numeric expression for which the arctangent is needed.
            */
          atan(x: number): number;
          /**
            * Returns the angle (in radians) from the X axis to a point.
            * @param y A numeric expression representing the cartesian y-coordinate.
            * @param x A numeric expression representing the cartesian x-coordinate.
            */
          atan2(y: number, x: number): number;
          /**
            * Returns the smallest number greater than or equal to its numeric argument. 
            * @param x A numeric expression.
            */
          ceil(x: number): number;
          /**
            * Returns the cosine of a number. 
            * @param x A numeric expression that contains an angle measured in radians.
            */
          cos(x: number): number;
          /**
            * Returns e (the base of natural logarithms) raised to a power. 
            * @param x A numeric expression representing the power of e.
            */
          exp(x: number): number;
          /**
            * Returns the greatest number less than or equal to its numeric argument. 
            * @param x A numeric expression.
            */
          floor(x: number): number;
          /**
            * Returns the natural logarithm (base e) of a number. 
            * @param x A numeric expression.
            */
          log(x: number): number;
          /**
            * Returns the larger of a set of supplied numeric expressions. 
            * @param values Numeric expressions to be evaluated.
            */
          max(...values: number[]): number;
          /**
            * Returns the smaller of a set of supplied numeric expressions. 
            * @param values Numeric expressions to be evaluated.
            */
          min(...values: number[]): number;
          /**
            * Returns the value of a base expression taken to a specified power. 
            * @param x The base value of the expression.
            * @param y The exponent value of the expression.
            */
          pow(x: number, y: number): number;
          /** Returns a pseudorandom number between 0 and 1. */
          random(): number;
          /** 
            * Returns a supplied numeric expression rounded to the nearest number.
            * @param x The value to be rounded to the nearest number.
            */
          round(x: number): number;
          /**
            * Returns the sine of a number.
            * @param x A numeric expression that contains an angle measured in radians.
            */
          sin(x: number): number;
          /**
            * Returns the square root of a number.
            * @param x A numeric expression.
            */
          sqrt(x: number): number;
          /**
            * Returns the tangent of a number.
            * @param x A numeric expression that contains an angle measured in radians.
            */
          tan(x: number): number;
      }
      /** An intrinsic object that provides basic mathematics functionality and constants. */
      declare var Math: Math;
      
      /** Enables basic storage and retrieval of dates and times. */
      interface Date {
          /** Returns a string representation of a date. The format of the string depends on the locale. */
          toString(): string;
          /** Returns a date as a string value. */
          toDateString(): string;
          /** Returns a time as a string value. */
          toTimeString(): string;
          /** Returns a value as a string value appropriate to the host environment's current locale. */
          toLocaleString(): string;
          /** Returns a date as a string value appropriate to the host environment's current locale. */
          toLocaleDateString(): string;
          /** Returns a time as a string value appropriate to the host environment's current locale. */
          toLocaleTimeString(): string;
          /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */
          valueOf(): number;
          /** Gets the time value in milliseconds. */
          getTime(): number;
          /** Gets the year, using local time. */
          getFullYear(): number;
          /** Gets the year using Universal Coordinated Time (UTC). */
          getUTCFullYear(): number;
          /** Gets the month, using local time. */
          getMonth(): number;
          /** Gets the month of a Date object using Universal Coordinated Time (UTC). */
          getUTCMonth(): number;
          /** Gets the day-of-the-month, using local time. */
          getDate(): number;
          /** Gets the day-of-the-month, using Universal Coordinated Time (UTC). */
          getUTCDate(): number;
          /** Gets the day of the week, using local time. */
          getDay(): number;
          /** Gets the day of the week using Universal Coordinated Time (UTC). */
          getUTCDay(): number;
          /** Gets the hours in a date, using local time. */
          getHours(): number;
          /** Gets the hours value in a Date object using Universal Coordinated Time (UTC). */
          getUTCHours(): number;
          /** Gets the minutes of a Date object, using local time. */
          getMinutes(): number;
          /** Gets the minutes of a Date object using Universal Coordinated Time (UTC). */
          getUTCMinutes(): number;
          /** Gets the seconds of a Date object, using local time. */
          getSeconds(): number;
          /** Gets the seconds of a Date object using Universal Coordinated Time (UTC). */
          getUTCSeconds(): number;
          /** Gets the milliseconds of a Date, using local time. */
          getMilliseconds(): number;
          /** Gets the milliseconds of a Date object using Universal Coordinated Time (UTC). */
          getUTCMilliseconds(): number;
          /** Gets the difference in minutes between the time on the local computer and Universal Coordinated Time (UTC). */
          getTimezoneOffset(): number;
          /** 
            * Sets the date and time value in the Date object.
            * @param time A numeric value representing the number of elapsed milliseconds since midnight, January 1, 1970 GMT. 
            */
          setTime(time: number): number;
          /**
            * Sets the milliseconds value in the Date object using local time. 
            * @param ms A numeric value equal to the millisecond value.
            */
          setMilliseconds(ms: number): number;
          /** 
            * Sets the milliseconds value in the Date object using Universal Coordinated Time (UTC).
            * @param ms A numeric value equal to the millisecond value. 
            */
          setUTCMilliseconds(ms: number): number;
      
          /**
            * Sets the seconds value in the Date object using local time. 
            * @param sec A numeric value equal to the seconds value.
            * @param ms A numeric value equal to the milliseconds value.
            */
          setSeconds(sec: number, ms?: number): number;
          /**
            * Sets the seconds value in the Date object using Universal Coordinated Time (UTC).
            * @param sec A numeric value equal to the seconds value.
            * @param ms A numeric value equal to the milliseconds value.
            */
          setUTCSeconds(sec: number, ms?: number): number;
          /**
            * Sets the minutes value in the Date object using local time. 
            * @param min A numeric value equal to the minutes value. 
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setMinutes(min: number, sec?: number, ms?: number): number;
          /**
            * Sets the minutes value in the Date object using Universal Coordinated Time (UTC).
            * @param min A numeric value equal to the minutes value. 
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setUTCMinutes(min: number, sec?: number, ms?: number): number;
          /**
            * Sets the hour value in the Date object using local time.
            * @param hours A numeric value equal to the hours value.
            * @param min A numeric value equal to the minutes value.
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setHours(hours: number, min?: number, sec?: number, ms?: number): number;
          /**
            * Sets the hours value in the Date object using Universal Coordinated Time (UTC).
            * @param hours A numeric value equal to the hours value.
            * @param min A numeric value equal to the minutes value.
            * @param sec A numeric value equal to the seconds value. 
            * @param ms A numeric value equal to the milliseconds value.
            */
          setUTCHours(hours: number, min?: number, sec?: number, ms?: number): number;
          /**
            * Sets the numeric day-of-the-month value of the Date object using local time. 
            * @param date A numeric value equal to the day of the month.
            */
          setDate(date: number): number;
          /** 
            * Sets the numeric day of the month in the Date object using Universal Coordinated Time (UTC).
            * @param date A numeric value equal to the day of the month. 
            */
          setUTCDate(date: number): number;
          /** 
            * Sets the month value in the Date object using local time. 
            * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. 
            * @param date A numeric value representing the day of the month. If this value is not supplied, the value from a call to the getDate method is used.
            */
          setMonth(month: number, date?: number): number;
          /**
            * Sets the month value in the Date object using Universal Coordinated Time (UTC).
            * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively.
            * @param date A numeric value representing the day of the month. If it is not supplied, the value from a call to the getUTCDate method is used.
            */
          setUTCMonth(month: number, date?: number): number;
          /**
            * Sets the year of the Date object using local time.
            * @param year A numeric value for the year.
            * @param month A zero-based numeric value for the month (0 for January, 11 for December). Must be specified if numDate is specified.
            * @param date A numeric value equal for the day of the month.
            */
          setFullYear(year: number, month?: number, date?: number): number;
          /**
            * Sets the year value in the Date object using Universal Coordinated Time (UTC).
            * @param year A numeric value equal to the year.
            * @param month A numeric value equal to the month. The value for January is 0, and other month values follow consecutively. Must be supplied if numDate is supplied.
            * @param date A numeric value equal to the day of the month.
            */
          setUTCFullYear(year: number, month?: number, date?: number): number;
          /** Returns a date converted to a string using Universal Coordinated Time (UTC). */
          toUTCString(): string;
          /** Returns a date as a string value in ISO format. */
          toISOString(): string;
          /** Used by the JSON.stringify method to enable the transformation of an object's data for JavaScript Object Notation (JSON) serialization. */
          toJSON(key?: any): string;
      }
      
      interface DateConstructor {
          new (): Date;
          new (value: number): Date;
          new (value: string): Date;
          new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date;
          (): string;
          prototype: Date;
          /**
            * Parses a string containing a date, and returns the number of milliseconds between that date and midnight, January 1, 1970.
            * @param s A date string
            */
          parse(s: string): number;
          /**
            * Returns the number of milliseconds between midnight, January 1, 1970 Universal Coordinated Time (UTC) (or GMT) and the specified date. 
            * @param year The full year designation is required for cross-century date accuracy. If year is between 0 and 99 is used, then year is assumed to be 1900 + year.
            * @param month The month as an number between 0 and 11 (January to December).
            * @param date The date as an number between 1 and 31.
            * @param hours Must be supplied if minutes is supplied. An number from 0 to 23 (midnight to 11pm) that specifies the hour.
            * @param minutes Must be supplied if seconds is supplied. An number from 0 to 59 that specifies the minutes.
            * @param seconds Must be supplied if milliseconds is supplied. An number from 0 to 59 that specifies the seconds.
            * @param ms An number from 0 to 999 that specifies the milliseconds.
            */
          UTC(year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): number;
          now(): number;
      }
      
      declare var Date: DateConstructor;
      
      interface RegExpMatchArray extends Array<string> {
          index?: number;
          input?: string;
      }
      
      interface RegExpExecArray extends Array<string> {
          index: number;
          input: string;
      }
      
      interface RegExp {
          /** 
            * Executes a search on a string using a regular expression pattern, and returns an array containing the results of that search.
            * @param string The String object or string literal on which to perform the search.
            */
          exec(string: string): RegExpExecArray;
      
          /** 
            * Returns a Boolean value that indicates whether or not a pattern exists in a searched string.
            * @param string String on which to perform the search.
            */
          test(string: string): boolean;
      
          /** Returns a copy of the text of the regular expression pattern. Read-only. The regExp argument is a Regular expression object. It can be a variable name or a literal. */
          source: string;
      
          /** Returns a Boolean value indicating the state of the global flag (g) used with a regular expression. Default is false. Read-only. */
          global: boolean;
      
          /** Returns a Boolean value indicating the state of the ignoreCase flag (i) used with a regular expression. Default is false. Read-only. */
          ignoreCase: boolean;
      
          /** Returns a Boolean value indicating the state of the multiline flag (m) used with a regular expression. Default is false. Read-only. */
          multiline: boolean;
      
          lastIndex: number;
      
          // Non-standard extensions
          compile(): RegExp;
      }
      
      interface RegExpConstructor {
          new (pattern: string, flags?: string): RegExp;
          (pattern: string, flags?: string): RegExp;
          prototype: RegExp;
      
          // Non-standard extensions
          $1: string;
          $2: string;
          $3: string;
          $4: string;
          $5: string;
          $6: string;
          $7: string;
          $8: string;
          $9: string;
          lastMatch: string;
      }
      
      declare var RegExp: RegExpConstructor;
      
      interface Error {
          name: string;
          message: string;
      }
      
      interface ErrorConstructor {
          new (message?: string): Error;
          (message?: string): Error;
          prototype: Error;
      }
      
      declare var Error: ErrorConstructor;
      
      interface EvalError extends Error {
      }
      
      interface EvalErrorConstructor {
          new (message?: string): EvalError;
          (message?: string): EvalError;
          prototype: EvalError;
      }
      
      declare var EvalError: EvalErrorConstructor;
      
      interface RangeError extends Error {
      }
      
      interface RangeErrorConstructor {
          new (message?: string): RangeError;
          (message?: string): RangeError;
          prototype: RangeError;
      }
      
      declare var RangeError: RangeErrorConstructor;
      
      interface ReferenceError extends Error {
      }
      
      interface ReferenceErrorConstructor {
          new (message?: string): ReferenceError;
          (message?: string): ReferenceError;
          prototype: ReferenceError;
      }
      
      declare var ReferenceError: ReferenceErrorConstructor;
      
      interface SyntaxError extends Error {
      }
      
      interface SyntaxErrorConstructor {
          new (message?: string): SyntaxError;
          (message?: string): SyntaxError;
          prototype: SyntaxError;
      }
      
      declare var SyntaxError: SyntaxErrorConstructor;
      
      interface TypeError extends Error {
      }
      
      interface TypeErrorConstructor {
          new (message?: string): TypeError;
          (message?: string): TypeError;
          prototype: TypeError;
      }
      
      declare var TypeError: TypeErrorConstructor;
      
      interface URIError extends Error {
      }
      
      interface URIErrorConstructor {
          new (message?: string): URIError;
          (message?: string): URIError;
          prototype: URIError;
      }
      
      declare var URIError: URIErrorConstructor;
      
      interface JSON {
          /**
            * Converts a JavaScript Object Notation (JSON) string into an object.
            * @param text A valid JSON string.
            * @param reviver A function that transforms the results. This function is called for each member of the object. 
            * If a member contains nested objects, the nested objects are transformed before the parent object is. 
            */
          parse(text: string, reviver?: (key: any, value: any) => any): any;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            */
          stringify(value: any): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer A function that transforms the results.
            */
          stringify(value: any, replacer: (key: string, value: any) => any): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer Array that transforms the results.
            */
          stringify(value: any, replacer: any[]): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer A function that transforms the results.
            * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
            */
          stringify(value: any, replacer: (key: string, value: any) => any, space: any): string;
          /**
            * Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
            * @param value A JavaScript value, usually an object or array, to be converted.
            * @param replacer Array that transforms the results.
            * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
            */
          stringify(value: any, replacer: any[], space: any): string;
      }
      /**
        * An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.
        */
      declare var JSON: JSON;
      
      
      /////////////////////////////
      /// ECMAScript Array API (specially handled by compiler)
      /////////////////////////////
      
      interface Array<T> {
          /**
            * Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
            */
          length: number;
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
          toLocaleString(): string;
          /**
            * Appends new elements to an array, and returns the new length of the array.
            * @param items New elements of the Array.
            */
          push(...items: T[]): number;
          /**
            * Removes the last element from an array and returns it.
            */
          pop(): T;
          /**
            * Combines two or more arrays.
            * @param items Additional items to add to the end of array1.
            */
          concat<U extends T[]>(...items: U[]): T[];
          /**
            * Combines two or more arrays.
            * @param items Additional items to add to the end of array1.
            */
          concat(...items: T[]): T[];
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): T[];
          /**
            * Removes the first element from an array and returns it.
            */
          shift(): T;
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): T[];
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: T, b: T) => number): T[];
      
          /**
            * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
            * @param start The zero-based location in the array from which to start removing elements.
            */
          splice(start: number): T[];
      
          /**
            * Removes elements from an array and, if necessary, inserts new elements in their place, returning the deleted elements.
            * @param start The zero-based location in the array from which to start removing elements.
            * @param deleteCount The number of elements to remove.
            * @param items Elements to insert into the array in place of the deleted elements.
            */
          splice(start: number, deleteCount: number, ...items: T[]): T[];
      
          /**
            * Inserts new elements at the start of an array.
            * @param items  Elements to insert at the start of the Array.
            */
          unshift(...items: T[]): number;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
            */
          indexOf(searchElement: T, fromIndex?: number): number;
      
          /**
            * Returns the index of the last occurrence of a specified value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at the last index in the array.
            */
          lastIndexOf(searchElement: T, fromIndex?: number): number;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls the callbackfn function for each element in array1 until the callbackfn returns false, or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the callbackfn function for each element in array1 until the callbackfn returns true, or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): boolean;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any): T[];
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
          /**
            * Calls the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
      
          [n: number]: T;
      }
      
      interface ArrayConstructor {
          new (arrayLength?: number): any[];
          new <T>(arrayLength: number): T[];
          new <T>(...items: T[]): T[];
          (arrayLength?: number): any[];
          <T>(arrayLength: number): T[];
          <T>(...items: T[]): T[];
          isArray(arg: any): boolean;
          prototype: Array<any>;
      }
      
      declare var Array: ArrayConstructor;
      
      interface TypedPropertyDescriptor<T> {
          enumerable?: boolean;
          configurable?: boolean;
          writable?: boolean;
          value?: T;
          get?: () => T;
          set?: (value: T) => void;
      }
      
      declare type ClassDecorator = <TFunction extends Function>(target: TFunction) => TFunction | void;
      declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
      declare type MethodDecorator = <T>(target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
      declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
      
      /////////////////////////////
      /// IE10 ECMAScript Extensions
      /////////////////////////////
      
      /**
        * Represents a raw buffer of binary data, which is used to store data for the 
        * different typed arrays. ArrayBuffers cannot be read from or written to directly, 
        * but can be passed to a typed array or DataView Object to interpret the raw 
        * buffer as needed. 
        */
      interface ArrayBuffer {
          /**
            * Read-only. The length of the ArrayBuffer (in bytes).
            */
          byteLength: number;
      
          /**
            * Returns a section of an ArrayBuffer.
            */
          slice(begin:number, end?:number): ArrayBuffer;
      }
      
      interface ArrayBufferConstructor {
          prototype: ArrayBuffer;
          new (byteLength: number): ArrayBuffer;
          isView(arg: any): boolean;
      }
      declare var ArrayBuffer: ArrayBufferConstructor;
      
      interface ArrayBufferView {
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      }
      
      interface DataView {
          buffer: ArrayBuffer;
          byteLength: number;
          byteOffset: number;
          /**
            * Gets the Float32 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getFloat32(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Float64 value at the specified byte offset from the start of the view. There is
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getFloat64(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Int8 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getInt8(byteOffset: number): number;
      
          /**
            * Gets the Int16 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getInt16(byteOffset: number, littleEndian: boolean): number;
          /**
            * Gets the Int32 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getInt32(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Uint8 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getUint8(byteOffset: number): number;
      
          /**
            * Gets the Uint16 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getUint16(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Gets the Uint32 value at the specified byte offset from the start of the view. There is 
            * no alignment constraint; multi-byte values may be fetched from any offset. 
            * @param byteOffset The place in the buffer at which the value should be retrieved.
            */
          getUint32(byteOffset: number, littleEndian: boolean): number;
      
          /**
            * Stores an Float32 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setFloat32(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Float64 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setFloat64(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Int8 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            */
          setInt8(byteOffset: number, value: number): void;
      
          /**
            * Stores an Int16 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setInt16(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Int32 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setInt32(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Uint8 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            */
          setUint8(byteOffset: number, value: number): void;
      
          /**
            * Stores an Uint16 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setUint16(byteOffset: number, value: number, littleEndian: boolean): void;
      
          /**
            * Stores an Uint32 value at the specified byte offset from the start of the view. 
            * @param byteOffset The place in the buffer at which the value should be set.
            * @param value The value to set.
            * @param littleEndian If false or undefined, a big-endian value should be written, 
            * otherwise a little-endian value should be written.
            */
          setUint32(byteOffset: number, value: number, littleEndian: boolean): void;
      }
      
      interface DataViewConstructor {
          new (buffer: ArrayBuffer, byteOffset?: number, byteLength?: number): DataView;
      }
      declare var DataView: DataViewConstructor;
      
      /**
        * A typed array of 8-bit integer values. The contents are initialized to 0. If the requested 
        * number of bytes could not be allocated an exception is raised.
        */
      interface Int8Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Int8Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Int8Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): Int8Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Int8Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Int8Array) => number, thisArg?: any): Int8Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int8Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int8Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Int8Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Int8Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Int8Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Int8Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Int8Array;
      
          /**
            * Gets a new Int8Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Int8Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      interface Int8ArrayConstructor {
          prototype: Int8Array;
          new (length: number): Int8Array;
          new (array: Int8Array): Int8Array;
          new (array: number[]): Int8Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int8Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Int8Array;
      }
      declare var Int8Array: Int8ArrayConstructor;
      
      /**
        * A typed array of 8-bit unsigned integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Uint8Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Uint8Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Uint8Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): Uint8Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Uint8Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Uint8Array) => number, thisArg?: any): Uint8Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint8Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint8Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Uint8Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Uint8Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Uint8Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Uint8Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Uint8Array;
      
          /**
            * Gets a new Uint8Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Uint8Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Uint8ArrayConstructor {
          prototype: Uint8Array;
          new (length: number): Uint8Array;
          new (array: Uint8Array): Uint8Array;
          new (array: number[]): Uint8Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint8Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Uint8Array;
      }
      declare var Uint8Array: Uint8ArrayConstructor;
      
      /**
        * A typed array of 16-bit signed integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Int16Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Int16Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Int16Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): Int16Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Int16Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Int16Array) => number, thisArg?: any): Int16Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int16Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int16Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Int16Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Int16Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Int16Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Int16Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Int16Array;
      
          /**
            * Gets a new Int16Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Int16Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Int16ArrayConstructor {
          prototype: Int16Array;
          new (length: number): Int16Array;
          new (array: Int16Array): Int16Array;
          new (array: number[]): Int16Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int16Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Int16Array;
      }
      declare var Int16Array: Int16ArrayConstructor;
      
      /**
        * A typed array of 16-bit unsigned integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Uint16Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Uint16Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Uint16Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): Uint16Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Uint16Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Uint16Array) => number, thisArg?: any): Uint16Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint16Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint16Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Uint16Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Uint16Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Uint16Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Uint16Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Uint16Array;
      
          /**
            * Gets a new Uint16Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Uint16Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Uint16ArrayConstructor {
          prototype: Uint16Array;
          new (length: number): Uint16Array;
          new (array: Uint16Array): Uint16Array;
          new (array: number[]): Uint16Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint16Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Uint16Array;
      }
      declare var Uint16Array: Uint16ArrayConstructor;
      /**
        * A typed array of 32-bit signed integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Int32Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Int32Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Int32Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): Int32Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Int32Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Int32Array) => number, thisArg?: any): Int32Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Int32Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Int32Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Int32Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Int32Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Int32Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Int32Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Int32Array;
      
          /**
            * Gets a new Int32Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Int32Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Int32ArrayConstructor {
          prototype: Int32Array;
          new (length: number): Int32Array;
          new (array: Int32Array): Int32Array;
          new (array: number[]): Int32Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Int32Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Int32Array;
      }
      declare var Int32Array: Int32ArrayConstructor;
      
      /**
        * A typed array of 32-bit unsigned integer values. The contents are initialized to 0. If the 
        * requested number of bytes could not be allocated an exception is raised.
        */
      interface Uint32Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Uint32Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Uint32Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): Uint32Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Uint32Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Uint32Array) => number, thisArg?: any): Uint32Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Uint32Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Uint32Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Uint32Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Uint32Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Uint32Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Uint32Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Uint32Array;
      
          /**
            * Gets a new Uint32Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Uint32Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Uint32ArrayConstructor {
          prototype: Uint32Array;
          new (length: number): Uint32Array;
          new (array: Uint32Array): Uint32Array;
          new (array: number[]): Uint32Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Uint32Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Uint32Array;
      }
      declare var Uint32Array: Uint32ArrayConstructor;
      
      /**
        * A typed array of 32-bit float values. The contents are initialized to 0. If the requested number
        * of bytes could not be allocated an exception is raised.
        */
      interface Float32Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Float32Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Float32Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): Float32Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Float32Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Float32Array) => number, thisArg?: any): Float32Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float32Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float32Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Float32Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Float32Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Float32Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Float32Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Float32Array;
      
          /**
            * Gets a new Float32Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Float32Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Float32ArrayConstructor {
          prototype: Float32Array;
          new (length: number): Float32Array;
          new (array: Float32Array): Float32Array;
          new (array: number[]): Float32Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float32Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Float32Array;
      }
      declare var Float32Array: Float32ArrayConstructor;
      
      /**
        * A typed array of 64-bit float values. The contents are initialized to 0. If the requested 
        * number of bytes could not be allocated an exception is raised.
        */
      interface Float64Array {
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * The ArrayBuffer instance referenced by the array. 
            */
          buffer: ArrayBuffer;
      
          /**
            * The length in bytes of the array.
            */
          byteLength: number;
      
          /**
            * The offset in bytes of the array.
            */
          byteOffset: number;
      
          /** 
            * Returns the this object after copying a section of the array identified by start and end
            * to the same array starting at position target
            * @param target If target is negative, it is treated as length+target where length is the 
            * length of the array. 
            * @param start If start is negative, it is treated as length+start. If end is negative, it 
            * is treated as length+end.
            * @param end If not specified, length of the this object is used as its default value. 
            */
          copyWithin(target: number, start: number, end?: number): Float64Array;
      
          /**
            * Determines whether all the members of an array satisfy the specified test.
            * @param callbackfn A function that accepts up to three arguments. The every method calls 
            * the callbackfn function for each element in array1 until the callbackfn returns false, 
            * or until the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function.
            * If thisArg is omitted, undefined is used as the this value.
            */
          every(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;
      
          /**
              * Returns the this object after filling the section identified by start and end with value
              * @param value value to fill array section with
              * @param start index to start filling the array at. If start is negative, it is treated as 
              * length+start where length is the length of the array. 
              * @param end index to stop filling the array at. If end is negative, it is treated as 
              * length+end.
              */
          fill(value: number, start?: number, end?: number): Float64Array;
      
          /**
            * Returns the elements of an array that meet the condition specified in a callback function. 
            * @param callbackfn A function that accepts up to three arguments. The filter method calls 
            * the callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          filter(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): Float64Array;
      
          /** 
            * Returns the value of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          find(predicate: (value: number, index: number, obj: Array<number>) => boolean, thisArg?: any): number;
      
          /** 
            * Returns the index of the first element in the array where predicate is true, and undefined 
            * otherwise.
            * @param predicate find calls predicate once for each element of the array, in ascending 
            * order, until it finds one where predicate returns true. If such an element is found, find 
            * immediately returns that element value. Otherwise, find returns undefined.
            * @param thisArg If provided, it will be used as the this value for each invocation of 
            * predicate. If it is not provided, undefined is used instead.
            */
          findIndex(predicate: (value: number) => boolean, thisArg?: any): number;
      
          /**
            * Performs the specified action for each element in an array.
            * @param callbackfn  A function that accepts up to three arguments. forEach calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg  An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          forEach(callbackfn: (value: number, index: number, array: Float64Array) => void, thisArg?: any): void;
      
          /**
            * Returns the index of the first occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the
            *  search starts at index 0.
            */
          indexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * Adds all the elements of an array separated by the specified separator string.
            * @param separator A string used to separate one element of an array from the next in the 
            * resulting String. If omitted, the array elements are separated with a comma.
            */
          join(separator?: string): string;
      
          /**
            * Returns the index of the last occurrence of a value in an array.
            * @param searchElement The value to locate in the array.
            * @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the 
            * search starts at index 0.
            */
          lastIndexOf(searchElement: number, fromIndex?: number): number;
      
          /**
            * The length of the array.
            */
          length: number;
      
          /**
            * Calls a defined callback function on each element of an array, and returns an array that 
            * contains the results.
            * @param callbackfn A function that accepts up to three arguments. The map method calls the 
            * callbackfn function one time for each element in the array. 
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          map(callbackfn: (value: number, index: number, array: Float64Array) => number, thisArg?: any): Float64Array;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduce(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;
      
          /**
            * Calls the specified callback function for all the elements in an array. The return value of 
            * the callback function is the accumulated result, and is provided as an argument in the next 
            * call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduce method calls the 
            * callbackfn function one time for each element in the array.
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument 
            * instead of an array value.
            */
          reduce<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls 
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an 
            * argument instead of an array value.
            */
          reduceRight(callbackfn: (previousValue: number, currentValue: number, currentIndex: number, array: Float64Array) => number, initialValue?: number): number;
      
          /** 
            * Calls the specified callback function for all the elements in an array, in descending order. 
            * The return value of the callback function is the accumulated result, and is provided as an 
            * argument in the next call to the callback function.
            * @param callbackfn A function that accepts up to four arguments. The reduceRight method calls
            * the callbackfn function one time for each element in the array. 
            * @param initialValue If initialValue is specified, it is used as the initial value to start 
            * the accumulation. The first call to the callbackfn function provides this value as an argument
            * instead of an array value.
            */
          reduceRight<U>(callbackfn: (previousValue: U, currentValue: number, currentIndex: number, array: Float64Array) => U, initialValue: U): U;
      
          /**
            * Reverses the elements in an Array. 
            */
          reverse(): Float64Array;
      
          /**
            * Sets a value or an array of values.
            * @param index The index of the location to set.
            * @param value The value to set.
            */
          set(index: number, value: number): void;
      
          /**
            * Sets a value or an array of values.
            * @param array A typed or untyped array of values to set.
            * @param offset The index in the current array at which the values are to be written.
            */
          set(array: Float64Array, offset?: number): void;
      
          /** 
            * Returns a section of an array.
            * @param start The beginning of the specified portion of the array.
            * @param end The end of the specified portion of the array.
            */
          slice(start?: number, end?: number): Float64Array;
      
          /**
            * Determines whether the specified callback function returns true for any element of an array.
            * @param callbackfn A function that accepts up to three arguments. The some method calls the 
            * callbackfn function for each element in array1 until the callbackfn returns true, or until 
            * the end of the array.
            * @param thisArg An object to which the this keyword can refer in the callbackfn function. 
            * If thisArg is omitted, undefined is used as the this value.
            */
          some(callbackfn: (value: number, index: number, array: Float64Array) => boolean, thisArg?: any): boolean;
      
          /**
            * Sorts an array.
            * @param compareFn The name of the function used to determine the order of the elements. If 
            * omitted, the elements are sorted in ascending, ASCII character order.
            */
          sort(compareFn?: (a: number, b: number) => number): Float64Array;
      
          /**
            * Gets a new Float64Array view of the ArrayBuffer store for this array, referencing the elements
            * at begin, inclusive, up to end, exclusive. 
            * @param begin The index of the beginning of the array.
            * @param end The index of the end of the array.
            */
          subarray(begin: number, end?: number): Float64Array;
      
          /**
            * Converts a number to a string by using the current locale. 
            */
          toLocaleString(): string;
      
          /**
            * Returns a string representation of an array.
            */
          toString(): string;
      
          [index: number]: number;
      }
      
      interface Float64ArrayConstructor {
          prototype: Float64Array;
          new (length: number): Float64Array;
          new (array: Float64Array): Float64Array;
          new (array: number[]): Float64Array;
          new (buffer: ArrayBuffer, byteOffset?: number, length?: number): Float64Array;
      
          /**
            * The size in bytes of each element in the array. 
            */
          BYTES_PER_ELEMENT: number;
      
          /**
            * Returns a new array from a set of elements.
            * @param items A set of elements to include in the new array object.
            */
          of(...items: number[]): Float64Array;
      }
      declare var Float64Array: Float64ArrayConstructor;/////////////////////////////
      /// ECMAScript Internationalization API 
      /////////////////////////////
      
      declare module Intl {
          interface CollatorOptions {
              usage?: string;
              localeMatcher?: string;
              numeric?: boolean;
              caseFirst?: string;
              sensitivity?: string;
              ignorePunctuation?: boolean;
          }
      
          interface ResolvedCollatorOptions {
              locale: string;
              usage: string;
              sensitivity: string;
              ignorePunctuation: boolean;
              collation: string;
              caseFirst: string;
              numeric: boolean;
          }
      
          interface Collator {
              compare(x: string, y: string): number;
              resolvedOptions(): ResolvedCollatorOptions;
          }
          var Collator: {
              new (locales?: string[], options?: CollatorOptions): Collator;
              new (locale?: string, options?: CollatorOptions): Collator;
              (locales?: string[], options?: CollatorOptions): Collator;
              (locale?: string, options?: CollatorOptions): Collator;
              supportedLocalesOf(locales: string[], options?: CollatorOptions): string[];
              supportedLocalesOf(locale: string, options?: CollatorOptions): string[];
          }
      
          interface NumberFormatOptions {
              localeMatcher?: string;
              style?: string;
              currency?: string;
              currencyDisplay?: string;
              useGrouping?: boolean;
          }
      
          interface ResolvedNumberFormatOptions {
              locale: string;
              numberingSystem: string;
              style: string;
              currency?: string;
              currencyDisplay?: string;
              minimumintegerDigits: number;
              minimumFractionDigits: number;
              maximumFractionDigits: number;
              minimumSignificantDigits?: number;
              maximumSignificantDigits?: number;
              useGrouping: boolean;
          }
      
          interface NumberFormat {
              format(value: number): string;
              resolvedOptions(): ResolvedNumberFormatOptions;
          }
          var NumberFormat: {
              new (locales?: string[], options?: NumberFormatOptions): Collator;
              new (locale?: string, options?: NumberFormatOptions): Collator;
              (locales?: string[], options?: NumberFormatOptions): Collator;
              (locale?: string, options?: NumberFormatOptions): Collator;
              supportedLocalesOf(locales: string[], options?: NumberFormatOptions): string[];
              supportedLocalesOf(locale: string, options?: NumberFormatOptions): string[];
          }
      
          interface DateTimeFormatOptions {
              localeMatcher?: string;
              weekday?: string;
              era?: string;
              year?: string;
              month?: string;
              day?: string;
              hour?: string;
              minute?: string;
              second?: string;
              timeZoneName?: string;
              formatMatcher?: string;
              hour12?: boolean;
          }
      
          interface ResolvedDateTimeFormatOptions {
              locale: string;
              calendar: string;
              numberingSystem: string;
              timeZone: string;
              hour12?: boolean;
              weekday?: string;
              era?: string;
              year?: string;
              month?: string;
              day?: string;
              hour?: string;
              minute?: string;
              second?: string;
              timeZoneName?: string;
          }
      
          interface DateTimeFormat {
              format(date: number): string;
              resolvedOptions(): ResolvedDateTimeFormatOptions;
          }
          var DateTimeFormat: {
              new (locales?: string[], options?: DateTimeFormatOptions): Collator;
              new (locale?: string, options?: DateTimeFormatOptions): Collator;
              (locales?: string[], options?: DateTimeFormatOptions): Collator;
              (locale?: string, options?: DateTimeFormatOptions): Collator;
              supportedLocalesOf(locales: string[], options?: DateTimeFormatOptions): string[];
              supportedLocalesOf(locale: string, options?: DateTimeFormatOptions): string[];
          }
      }
      
      interface String {
          /**
            * Determines whether two strings are equivalent in the current locale.
            * @param that String to compare to target string
            * @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
            * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
            */
          localeCompare(that: string, locales: string[], options?: Intl.CollatorOptions): number;
      
          /**
            * Determines whether two strings are equivalent in the current locale.
            * @param that String to compare to target string
            * @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used. This parameter must conform to BCP 47 standards; see the Intl.Collator object for details.
            * @param options An object that contains one or more properties that specify comparison options. see the Intl.Collator object for details.
            */
          localeCompare(that: string, locale: string, options?: Intl.CollatorOptions): number;
      }
      
      interface Number {
          /**
            * Converts a number to a string by using the current or specified locale. 
            * @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locales?: string[], options?: Intl.NumberFormatOptions): string;
      
          /**
            * Converts a number to a string by using the current or specified locale. 
            * @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locale?: string, options?: Intl.NumberFormatOptions): string;
      }
      
      interface Date {
          /**
            * Converts a date to a string by using the current or specified locale.  
            * @param locales An array of locale strings that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locales?: string[], options?: Intl.DateTimeFormatOptions): string;
      
          /**
            * Converts a date to a string by using the current or specified locale.  
            * @param locale Locale tag. If you omit this parameter, the default locale of the JavaScript runtime is used.
            * @param options An object that contains one or more properties that specify comparison options.
            */
          toLocaleString(locale?: string, options?: Intl.DateTimeFormatOptions): string;
      }
      
      
      /////////////////////////////
      /// IE DOM APIs
      /////////////////////////////
      
      interface Algorithm {
          name?: string;
      }
      
      interface AriaRequestEventInit extends EventInit {
          attributeName?: string;
          attributeValue?: string;
      }
      
      interface ClipboardEventInit extends EventInit {
          data?: string;
          dataType?: string;
      }
      
      interface CommandEventInit extends EventInit {
          commandName?: string;
          detail?: string;
      }
      
      interface CompositionEventInit extends UIEventInit {
          data?: string;
      }
      
      interface ConfirmSiteSpecificExceptionsInformation extends ExceptionInformation {
          arrayOfDomainStrings?: string[];
      }
      
      interface CustomEventInit extends EventInit {
          detail?: any;
      }
      
      interface DeviceAccelerationDict {
          x?: number;
          y?: number;
          z?: number;
      }
      
      interface DeviceRotationRateDict {
          alpha?: number;
          beta?: number;
          gamma?: number;
      }
      
      interface EventInit {
          bubbles?: boolean;
          cancelable?: boolean;
      }
      
      interface ExceptionInformation {
          domain?: string;
      }
      
      interface FocusEventInit extends UIEventInit {
          relatedTarget?: EventTarget;
      }
      
      interface HashChangeEventInit extends EventInit {
          newURL?: string;
          oldURL?: string;
      }
      
      interface KeyAlgorithm {
          name?: string;
      }
      
      interface KeyboardEventInit extends SharedKeyboardAndMouseEventInit {
          key?: string;
          location?: number;
          repeat?: boolean;
      }
      
      interface MouseEventInit extends SharedKeyboardAndMouseEventInit {
          screenX?: number;
          screenY?: number;
          clientX?: number;
          clientY?: number;
          button?: number;
          buttons?: number;
          relatedTarget?: EventTarget;
      }
      
      interface MsZoomToOptions {
          contentX?: number;
          contentY?: number;
          viewportX?: string;
          viewportY?: string;
          scaleFactor?: number;
          animate?: string;
      }
      
      interface MutationObserverInit {
          childList?: boolean;
          attributes?: boolean;
          characterData?: boolean;
          subtree?: boolean;
          attributeOldValue?: boolean;
          characterDataOldValue?: boolean;
          attributeFilter?: string[];
      }
      
      interface ObjectURLOptions {
          oneTimeOnly?: boolean;
      }
      
      interface PointerEventInit extends MouseEventInit {
          pointerId?: number;
          width?: number;
          height?: number;
          pressure?: number;
          tiltX?: number;
          tiltY?: number;
          pointerType?: string;
          isPrimary?: boolean;
      }
      
      interface PositionOptions {
          enableHighAccuracy?: boolean;
          timeout?: number;
          maximumAge?: number;
      }
      
      interface SharedKeyboardAndMouseEventInit extends UIEventInit {
          ctrlKey?: boolean;
          shiftKey?: boolean;
          altKey?: boolean;
          metaKey?: boolean;
          keyModifierStateAltGraph?: boolean;
          keyModifierStateCapsLock?: boolean;
          keyModifierStateFn?: boolean;
          keyModifierStateFnLock?: boolean;
          keyModifierStateHyper?: boolean;
          keyModifierStateNumLock?: boolean;
          keyModifierStateOS?: boolean;
          keyModifierStateScrollLock?: boolean;
          keyModifierStateSuper?: boolean;
          keyModifierStateSymbol?: boolean;
          keyModifierStateSymbolLock?: boolean;
      }
      
      interface StoreExceptionsInformation extends ExceptionInformation {
          siteName?: string;
          explanationString?: string;
          detailURI?: string;
      }
      
      interface StoreSiteSpecificExceptionsInformation extends StoreExceptionsInformation {
          arrayOfDomainStrings?: string[];
      }
      
      interface UIEventInit extends EventInit {
          view?: Window;
          detail?: number;
      }
      
      interface WebGLContextAttributes {
          alpha?: boolean;
          depth?: boolean;
          stencil?: boolean;
          antialias?: boolean;
          premultipliedAlpha?: boolean;
          preserveDrawingBuffer?: boolean;
      }
      
      interface WebGLContextEventInit extends EventInit {
          statusMessage?: string;
      }
      
      interface WheelEventInit extends MouseEventInit {
          deltaX?: number;
          deltaY?: number;
          deltaZ?: number;
          deltaMode?: number;
      }
      
      interface EventListener {
          (evt: Event): void;
      }
      
      interface ANGLE_instanced_arrays {
          drawArraysInstancedANGLE(mode: number, first: number, count: number, primcount: number): void;
          drawElementsInstancedANGLE(mode: number, count: number, type: number, offset: number, primcount: number): void;
          vertexAttribDivisorANGLE(index: number, divisor: number): void;
          VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;
      }
      
      declare var ANGLE_instanced_arrays: {
          prototype: ANGLE_instanced_arrays;
          new(): ANGLE_instanced_arrays;
          VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: number;
      }
      
      interface AnalyserNode extends AudioNode {
          fftSize: number;
          frequencyBinCount: number;
          maxDecibels: number;
          minDecibels: number;
          smoothingTimeConstant: number;
          getByteFrequencyData(array: Uint8Array): void;
          getByteTimeDomainData(array: Uint8Array): void;
          getFloatFrequencyData(array: any): void;
          getFloatTimeDomainData(array: any): void;
      }
      
      declare var AnalyserNode: {
          prototype: AnalyserNode;
          new(): AnalyserNode;
      }
      
      interface AnimationEvent extends Event {
          animationName: string;
          elapsedTime: number;
          initAnimationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, animationNameArg: string, elapsedTimeArg: number): void;
      }
      
      declare var AnimationEvent: {
          prototype: AnimationEvent;
          new(): AnimationEvent;
      }
      
      interface ApplicationCache extends EventTarget {
          oncached: (ev: Event) => any;
          onchecking: (ev: Event) => any;
          ondownloading: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onnoupdate: (ev: Event) => any;
          onobsolete: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          onupdateready: (ev: Event) => any;
          status: number;
          abort(): void;
          swapCache(): void;
          update(): void;
          CHECKING: number;
          DOWNLOADING: number;
          IDLE: number;
          OBSOLETE: number;
          UNCACHED: number;
          UPDATEREADY: number;
          addEventListener(type: "cached", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "checking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "downloading", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "noupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "obsolete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "updateready", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var ApplicationCache: {
          prototype: ApplicationCache;
          new(): ApplicationCache;
          CHECKING: number;
          DOWNLOADING: number;
          IDLE: number;
          OBSOLETE: number;
          UNCACHED: number;
          UPDATEREADY: number;
      }
      
      interface AriaRequestEvent extends Event {
          attributeName: string;
          attributeValue: string;
      }
      
      declare var AriaRequestEvent: {
          prototype: AriaRequestEvent;
          new(type: string, eventInitDict?: AriaRequestEventInit): AriaRequestEvent;
      }
      
      interface Attr extends Node {
          name: string;
          ownerElement: Element;
          specified: boolean;
          value: string;
      }
      
      declare var Attr: {
          prototype: Attr;
          new(): Attr;
      }
      
      interface AudioBuffer {
          duration: number;
          length: number;
          numberOfChannels: number;
          sampleRate: number;
          getChannelData(channel: number): any;
      }
      
      declare var AudioBuffer: {
          prototype: AudioBuffer;
          new(): AudioBuffer;
      }
      
      interface AudioBufferSourceNode extends AudioNode {
          buffer: AudioBuffer;
          loop: boolean;
          loopEnd: number;
          loopStart: number;
          onended: (ev: Event) => any;
          playbackRate: AudioParam;
          start(when?: number, offset?: number, duration?: number): void;
          stop(when?: number): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var AudioBufferSourceNode: {
          prototype: AudioBufferSourceNode;
          new(): AudioBufferSourceNode;
      }
      
      interface AudioContext extends EventTarget {
          currentTime: number;
          destination: AudioDestinationNode;
          listener: AudioListener;
          sampleRate: number;
          createAnalyser(): AnalyserNode;
          createBiquadFilter(): BiquadFilterNode;
          createBuffer(numberOfChannels: number, length: number, sampleRate: number): AudioBuffer;
          createBufferSource(): AudioBufferSourceNode;
          createChannelMerger(numberOfInputs?: number): ChannelMergerNode;
          createChannelSplitter(numberOfOutputs?: number): ChannelSplitterNode;
          createConvolver(): ConvolverNode;
          createDelay(maxDelayTime?: number): DelayNode;
          createDynamicsCompressor(): DynamicsCompressorNode;
          createGain(): GainNode;
          createMediaElementSource(mediaElement: HTMLMediaElement): MediaElementAudioSourceNode;
          createOscillator(): OscillatorNode;
          createPanner(): PannerNode;
          createPeriodicWave(real: any, imag: any): PeriodicWave;
          createScriptProcessor(bufferSize?: number, numberOfInputChannels?: number, numberOfOutputChannels?: number): ScriptProcessorNode;
          createStereoPanner(): StereoPannerNode;
          createWaveShaper(): WaveShaperNode;
          decodeAudioData(audioData: ArrayBuffer, successCallback: DecodeSuccessCallback, errorCallback?: DecodeErrorCallback): void;
      }
      
      declare var AudioContext: {
          prototype: AudioContext;
          new(): AudioContext;
      }
      
      interface AudioDestinationNode extends AudioNode {
          maxChannelCount: number;
      }
      
      declare var AudioDestinationNode: {
          prototype: AudioDestinationNode;
          new(): AudioDestinationNode;
      }
      
      interface AudioListener {
          dopplerFactor: number;
          speedOfSound: number;
          setOrientation(x: number, y: number, z: number, xUp: number, yUp: number, zUp: number): void;
          setPosition(x: number, y: number, z: number): void;
          setVelocity(x: number, y: number, z: number): void;
      }
      
      declare var AudioListener: {
          prototype: AudioListener;
          new(): AudioListener;
      }
      
      interface AudioNode extends EventTarget {
          channelCount: number;
          channelCountMode: string;
          channelInterpretation: string;
          context: AudioContext;
          numberOfInputs: number;
          numberOfOutputs: number;
          connect(destination: AudioNode, output?: number, input?: number): void;
          disconnect(output?: number): void;
      }
      
      declare var AudioNode: {
          prototype: AudioNode;
          new(): AudioNode;
      }
      
      interface AudioParam {
          defaultValue: number;
          value: number;
          cancelScheduledValues(startTime: number): void;
          exponentialRampToValueAtTime(value: number, endTime: number): void;
          linearRampToValueAtTime(value: number, endTime: number): void;
          setTargetAtTime(target: number, startTime: number, timeConstant: number): void;
          setValueAtTime(value: number, startTime: number): void;
          setValueCurveAtTime(values: any, startTime: number, duration: number): void;
      }
      
      declare var AudioParam: {
          prototype: AudioParam;
          new(): AudioParam;
      }
      
      interface AudioProcessingEvent extends Event {
          inputBuffer: AudioBuffer;
          outputBuffer: AudioBuffer;
          playbackTime: number;
      }
      
      declare var AudioProcessingEvent: {
          prototype: AudioProcessingEvent;
          new(): AudioProcessingEvent;
      }
      
      interface AudioTrack {
          enabled: boolean;
          id: string;
          kind: string;
          label: string;
          language: string;
          sourceBuffer: SourceBuffer;
      }
      
      declare var AudioTrack: {
          prototype: AudioTrack;
          new(): AudioTrack;
      }
      
      interface AudioTrackList extends EventTarget {
          length: number;
          onaddtrack: (ev: TrackEvent) => any;
          onchange: (ev: Event) => any;
          onremovetrack: (ev: TrackEvent) => any;
          getTrackById(id: string): AudioTrack;
          item(index: number): AudioTrack;
          addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "removetrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: AudioTrack;
      }
      
      declare var AudioTrackList: {
          prototype: AudioTrackList;
          new(): AudioTrackList;
      }
      
      interface BarProp {
          visible: boolean;
      }
      
      declare var BarProp: {
          prototype: BarProp;
          new(): BarProp;
      }
      
      interface BeforeUnloadEvent extends Event {
          returnValue: any;
      }
      
      declare var BeforeUnloadEvent: {
          prototype: BeforeUnloadEvent;
          new(): BeforeUnloadEvent;
      }
      
      interface BiquadFilterNode extends AudioNode {
          Q: AudioParam;
          detune: AudioParam;
          frequency: AudioParam;
          gain: AudioParam;
          type: string;
          getFrequencyResponse(frequencyHz: any, magResponse: any, phaseResponse: any): void;
      }
      
      declare var BiquadFilterNode: {
          prototype: BiquadFilterNode;
          new(): BiquadFilterNode;
      }
      
      interface Blob {
          size: number;
          type: string;
          msClose(): void;
          msDetachStream(): any;
          slice(start?: number, end?: number, contentType?: string): Blob;
      }
      
      declare var Blob: {
          prototype: Blob;
          new (blobParts?: any[], options?: BlobPropertyBag): Blob;
      }
      
      interface CDATASection extends Text {
      }
      
      declare var CDATASection: {
          prototype: CDATASection;
          new(): CDATASection;
      }
      
      interface CSS {
          supports(property: string, value?: string): boolean;
      }
      declare var CSS: CSS;
      
      interface CSSConditionRule extends CSSGroupingRule {
          conditionText: string;
      }
      
      declare var CSSConditionRule: {
          prototype: CSSConditionRule;
          new(): CSSConditionRule;
      }
      
      interface CSSFontFaceRule extends CSSRule {
          style: CSSStyleDeclaration;
      }
      
      declare var CSSFontFaceRule: {
          prototype: CSSFontFaceRule;
          new(): CSSFontFaceRule;
      }
      
      interface CSSGroupingRule extends CSSRule {
          cssRules: CSSRuleList;
          deleteRule(index?: number): void;
          insertRule(rule: string, index?: number): number;
      }
      
      declare var CSSGroupingRule: {
          prototype: CSSGroupingRule;
          new(): CSSGroupingRule;
      }
      
      interface CSSImportRule extends CSSRule {
          href: string;
          media: MediaList;
          styleSheet: CSSStyleSheet;
      }
      
      declare var CSSImportRule: {
          prototype: CSSImportRule;
          new(): CSSImportRule;
      }
      
      interface CSSKeyframeRule extends CSSRule {
          keyText: string;
          style: CSSStyleDeclaration;
      }
      
      declare var CSSKeyframeRule: {
          prototype: CSSKeyframeRule;
          new(): CSSKeyframeRule;
      }
      
      interface CSSKeyframesRule extends CSSRule {
          cssRules: CSSRuleList;
          name: string;
          appendRule(rule: string): void;
          deleteRule(rule: string): void;
          findRule(rule: string): CSSKeyframeRule;
      }
      
      declare var CSSKeyframesRule: {
          prototype: CSSKeyframesRule;
          new(): CSSKeyframesRule;
      }
      
      interface CSSMediaRule extends CSSConditionRule {
          media: MediaList;
      }
      
      declare var CSSMediaRule: {
          prototype: CSSMediaRule;
          new(): CSSMediaRule;
      }
      
      interface CSSNamespaceRule extends CSSRule {
          namespaceURI: string;
          prefix: string;
      }
      
      declare var CSSNamespaceRule: {
          prototype: CSSNamespaceRule;
          new(): CSSNamespaceRule;
      }
      
      interface CSSPageRule extends CSSRule {
          pseudoClass: string;
          selector: string;
          selectorText: string;
          style: CSSStyleDeclaration;
      }
      
      declare var CSSPageRule: {
          prototype: CSSPageRule;
          new(): CSSPageRule;
      }
      
      interface CSSRule {
          cssText: string;
          parentRule: CSSRule;
          parentStyleSheet: CSSStyleSheet;
          type: number;
          CHARSET_RULE: number;
          FONT_FACE_RULE: number;
          IMPORT_RULE: number;
          KEYFRAMES_RULE: number;
          KEYFRAME_RULE: number;
          MEDIA_RULE: number;
          NAMESPACE_RULE: number;
          PAGE_RULE: number;
          STYLE_RULE: number;
          SUPPORTS_RULE: number;
          UNKNOWN_RULE: number;
          VIEWPORT_RULE: number;
      }
      
      declare var CSSRule: {
          prototype: CSSRule;
          new(): CSSRule;
          CHARSET_RULE: number;
          FONT_FACE_RULE: number;
          IMPORT_RULE: number;
          KEYFRAMES_RULE: number;
          KEYFRAME_RULE: number;
          MEDIA_RULE: number;
          NAMESPACE_RULE: number;
          PAGE_RULE: number;
          STYLE_RULE: number;
          SUPPORTS_RULE: number;
          UNKNOWN_RULE: number;
          VIEWPORT_RULE: number;
      }
      
      interface CSSRuleList {
          length: number;
          item(index: number): CSSRule;
          [index: number]: CSSRule;
      }
      
      declare var CSSRuleList: {
          prototype: CSSRuleList;
          new(): CSSRuleList;
      }
      
      interface CSSStyleDeclaration {
          alignContent: string;
          alignItems: string;
          alignSelf: string;
          alignmentBaseline: string;
          animation: string;
          animationDelay: string;
          animationDirection: string;
          animationDuration: string;
          animationFillMode: string;
          animationIterationCount: string;
          animationName: string;
          animationPlayState: string;
          animationTimingFunction: string;
          backfaceVisibility: string;
          background: string;
          backgroundAttachment: string;
          backgroundClip: string;
          backgroundColor: string;
          backgroundImage: string;
          backgroundOrigin: string;
          backgroundPosition: string;
          backgroundPositionX: string;
          backgroundPositionY: string;
          backgroundRepeat: string;
          backgroundSize: string;
          baselineShift: string;
          border: string;
          borderBottom: string;
          borderBottomColor: string;
          borderBottomLeftRadius: string;
          borderBottomRightRadius: string;
          borderBottomStyle: string;
          borderBottomWidth: string;
          borderCollapse: string;
          borderColor: string;
          borderImage: string;
          borderImageOutset: string;
          borderImageRepeat: string;
          borderImageSlice: string;
          borderImageSource: string;
          borderImageWidth: string;
          borderLeft: string;
          borderLeftColor: string;
          borderLeftStyle: string;
          borderLeftWidth: string;
          borderRadius: string;
          borderRight: string;
          borderRightColor: string;
          borderRightStyle: string;
          borderRightWidth: string;
          borderSpacing: string;
          borderStyle: string;
          borderTop: string;
          borderTopColor: string;
          borderTopLeftRadius: string;
          borderTopRightRadius: string;
          borderTopStyle: string;
          borderTopWidth: string;
          borderWidth: string;
          bottom: string;
          boxShadow: string;
          boxSizing: string;
          breakAfter: string;
          breakBefore: string;
          breakInside: string;
          captionSide: string;
          clear: string;
          clip: string;
          clipPath: string;
          clipRule: string;
          color: string;
          colorInterpolationFilters: string;
          columnCount: any;
          columnFill: string;
          columnGap: any;
          columnRule: string;
          columnRuleColor: any;
          columnRuleStyle: string;
          columnRuleWidth: any;
          columnSpan: string;
          columnWidth: any;
          columns: string;
          content: string;
          counterIncrement: string;
          counterReset: string;
          cssFloat: string;
          cssText: string;
          cursor: string;
          direction: string;
          display: string;
          dominantBaseline: string;
          emptyCells: string;
          enableBackground: string;
          fill: string;
          fillOpacity: string;
          fillRule: string;
          filter: string;
          flex: string;
          flexBasis: string;
          flexDirection: string;
          flexFlow: string;
          flexGrow: string;
          flexShrink: string;
          flexWrap: string;
          floodColor: string;
          floodOpacity: string;
          font: string;
          fontFamily: string;
          fontFeatureSettings: string;
          fontSize: string;
          fontSizeAdjust: string;
          fontStretch: string;
          fontStyle: string;
          fontVariant: string;
          fontWeight: string;
          glyphOrientationHorizontal: string;
          glyphOrientationVertical: string;
          height: string;
          imeMode: string;
          justifyContent: string;
          kerning: string;
          left: string;
          length: number;
          letterSpacing: string;
          lightingColor: string;
          lineHeight: string;
          listStyle: string;
          listStyleImage: string;
          listStylePosition: string;
          listStyleType: string;
          margin: string;
          marginBottom: string;
          marginLeft: string;
          marginRight: string;
          marginTop: string;
          marker: string;
          markerEnd: string;
          markerMid: string;
          markerStart: string;
          mask: string;
          maxHeight: string;
          maxWidth: string;
          minHeight: string;
          minWidth: string;
          msContentZoomChaining: string;
          msContentZoomLimit: string;
          msContentZoomLimitMax: any;
          msContentZoomLimitMin: any;
          msContentZoomSnap: string;
          msContentZoomSnapPoints: string;
          msContentZoomSnapType: string;
          msContentZooming: string;
          msFlowFrom: string;
          msFlowInto: string;
          msFontFeatureSettings: string;
          msGridColumn: any;
          msGridColumnAlign: string;
          msGridColumnSpan: any;
          msGridColumns: string;
          msGridRow: any;
          msGridRowAlign: string;
          msGridRowSpan: any;
          msGridRows: string;
          msHighContrastAdjust: string;
          msHyphenateLimitChars: string;
          msHyphenateLimitLines: any;
          msHyphenateLimitZone: any;
          msHyphens: string;
          msImeAlign: string;
          msOverflowStyle: string;
          msScrollChaining: string;
          msScrollLimit: string;
          msScrollLimitXMax: any;
          msScrollLimitXMin: any;
          msScrollLimitYMax: any;
          msScrollLimitYMin: any;
          msScrollRails: string;
          msScrollSnapPointsX: string;
          msScrollSnapPointsY: string;
          msScrollSnapType: string;
          msScrollSnapX: string;
          msScrollSnapY: string;
          msScrollTranslation: string;
          msTextCombineHorizontal: string;
          msTextSizeAdjust: any;
          msTouchAction: string;
          msTouchSelect: string;
          msUserSelect: string;
          msWrapFlow: string;
          msWrapMargin: any;
          msWrapThrough: string;
          opacity: string;
          order: string;
          orphans: string;
          outline: string;
          outlineColor: string;
          outlineStyle: string;
          outlineWidth: string;
          overflow: string;
          overflowX: string;
          overflowY: string;
          padding: string;
          paddingBottom: string;
          paddingLeft: string;
          paddingRight: string;
          paddingTop: string;
          pageBreakAfter: string;
          pageBreakBefore: string;
          pageBreakInside: string;
          parentRule: CSSRule;
          perspective: string;
          perspectiveOrigin: string;
          pointerEvents: string;
          position: string;
          quotes: string;
          right: string;
          rubyAlign: string;
          rubyOverhang: string;
          rubyPosition: string;
          stopColor: string;
          stopOpacity: string;
          stroke: string;
          strokeDasharray: string;
          strokeDashoffset: string;
          strokeLinecap: string;
          strokeLinejoin: string;
          strokeMiterlimit: string;
          strokeOpacity: string;
          strokeWidth: string;
          tableLayout: string;
          textAlign: string;
          textAlignLast: string;
          textAnchor: string;
          textDecoration: string;
          textFillColor: string;
          textIndent: string;
          textJustify: string;
          textKashida: string;
          textKashidaSpace: string;
          textOverflow: string;
          textShadow: string;
          textTransform: string;
          textUnderlinePosition: string;
          top: string;
          touchAction: string;
          transform: string;
          transformOrigin: string;
          transformStyle: string;
          transition: string;
          transitionDelay: string;
          transitionDuration: string;
          transitionProperty: string;
          transitionTimingFunction: string;
          unicodeBidi: string;
          verticalAlign: string;
          visibility: string;
          webkitAlignContent: string;
          webkitAlignItems: string;
          webkitAlignSelf: string;
          webkitAnimation: string;
          webkitAnimationDelay: string;
          webkitAnimationDirection: string;
          webkitAnimationDuration: string;
          webkitAnimationFillMode: string;
          webkitAnimationIterationCount: string;
          webkitAnimationName: string;
          webkitAnimationPlayState: string;
          webkitAnimationTimingFunction: string;
          webkitAppearance: string;
          webkitBackfaceVisibility: string;
          webkitBackground: string;
          webkitBackgroundAttachment: string;
          webkitBackgroundClip: string;
          webkitBackgroundColor: string;
          webkitBackgroundImage: string;
          webkitBackgroundOrigin: string;
          webkitBackgroundPosition: string;
          webkitBackgroundPositionX: string;
          webkitBackgroundPositionY: string;
          webkitBackgroundRepeat: string;
          webkitBackgroundSize: string;
          webkitBorderBottomLeftRadius: string;
          webkitBorderBottomRightRadius: string;
          webkitBorderImage: string;
          webkitBorderImageOutset: string;
          webkitBorderImageRepeat: string;
          webkitBorderImageSlice: string;
          webkitBorderImageSource: string;
          webkitBorderImageWidth: string;
          webkitBorderRadius: string;
          webkitBorderTopLeftRadius: string;
          webkitBorderTopRightRadius: string;
          webkitBoxAlign: string;
          webkitBoxDirection: string;
          webkitBoxFlex: string;
          webkitBoxOrdinalGroup: string;
          webkitBoxOrient: string;
          webkitBoxPack: string;
          webkitBoxSizing: string;
          webkitColumnBreakAfter: string;
          webkitColumnBreakBefore: string;
          webkitColumnBreakInside: string;
          webkitColumnCount: any;
          webkitColumnGap: any;
          webkitColumnRule: string;
          webkitColumnRuleColor: any;
          webkitColumnRuleStyle: string;
          webkitColumnRuleWidth: any;
          webkitColumnSpan: string;
          webkitColumnWidth: any;
          webkitColumns: string;
          webkitFilter: string;
          webkitFlex: string;
          webkitFlexBasis: string;
          webkitFlexDirection: string;
          webkitFlexFlow: string;
          webkitFlexGrow: string;
          webkitFlexShrink: string;
          webkitFlexWrap: string;
          webkitJustifyContent: string;
          webkitOrder: string;
          webkitPerspective: string;
          webkitPerspectiveOrigin: string;
          webkitTapHighlightColor: string;
          webkitTextFillColor: string;
          webkitTextSizeAdjust: any;
          webkitTransform: string;
          webkitTransformOrigin: string;
          webkitTransformStyle: string;
          webkitTransition: string;
          webkitTransitionDelay: string;
          webkitTransitionDuration: string;
          webkitTransitionProperty: string;
          webkitTransitionTimingFunction: string;
          webkitUserSelect: string;
          webkitWritingMode: string;
          whiteSpace: string;
          widows: string;
          width: string;
          wordBreak: string;
          wordSpacing: string;
          wordWrap: string;
          writingMode: string;
          zIndex: string;
          zoom: string;
          getPropertyPriority(propertyName: string): string;
          getPropertyValue(propertyName: string): string;
          item(index: number): string;
          removeProperty(propertyName: string): string;
          setProperty(propertyName: string, value: string, priority?: string): void;
          [index: number]: string;
      }
      
      declare var CSSStyleDeclaration: {
          prototype: CSSStyleDeclaration;
          new(): CSSStyleDeclaration;
      }
      
      interface CSSStyleRule extends CSSRule {
          readOnly: boolean;
          selectorText: string;
          style: CSSStyleDeclaration;
      }
      
      declare var CSSStyleRule: {
          prototype: CSSStyleRule;
          new(): CSSStyleRule;
      }
      
      interface CSSStyleSheet extends StyleSheet {
          cssRules: CSSRuleList;
          cssText: string;
          href: string;
          id: string;
          imports: StyleSheetList;
          isAlternate: boolean;
          isPrefAlternate: boolean;
          ownerRule: CSSRule;
          owningElement: Element;
          pages: StyleSheetPageList;
          readOnly: boolean;
          rules: CSSRuleList;
          addImport(bstrURL: string, lIndex?: number): number;
          addPageRule(bstrSelector: string, bstrStyle: string, lIndex?: number): number;
          addRule(bstrSelector: string, bstrStyle?: string, lIndex?: number): number;
          deleteRule(index?: number): void;
          insertRule(rule: string, index?: number): number;
          removeImport(lIndex: number): void;
          removeRule(lIndex: number): void;
      }
      
      declare var CSSStyleSheet: {
          prototype: CSSStyleSheet;
          new(): CSSStyleSheet;
      }
      
      interface CSSSupportsRule extends CSSConditionRule {
      }
      
      declare var CSSSupportsRule: {
          prototype: CSSSupportsRule;
          new(): CSSSupportsRule;
      }
      
      interface CanvasGradient {
          addColorStop(offset: number, color: string): void;
      }
      
      declare var CanvasGradient: {
          prototype: CanvasGradient;
          new(): CanvasGradient;
      }
      
      interface CanvasPattern {
      }
      
      declare var CanvasPattern: {
          prototype: CanvasPattern;
          new(): CanvasPattern;
      }
      
      interface CanvasRenderingContext2D {
          canvas: HTMLCanvasElement;
          fillStyle: any;
          font: string;
          globalAlpha: number;
          globalCompositeOperation: string;
          lineCap: string;
          lineDashOffset: number;
          lineJoin: string;
          lineWidth: number;
          miterLimit: number;
          msFillRule: string;
          msImageSmoothingEnabled: boolean;
          shadowBlur: number;
          shadowColor: string;
          shadowOffsetX: number;
          shadowOffsetY: number;
          strokeStyle: any;
          textAlign: string;
          textBaseline: string;
          arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean): void;
          arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
          beginPath(): void;
          bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
          clearRect(x: number, y: number, w: number, h: number): void;
          clip(fillRule?: string): void;
          closePath(): void;
          createImageData(imageDataOrSw: number, sh?: number): ImageData;
          createImageData(imageDataOrSw: ImageData, sh?: number): ImageData;
          createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
          createPattern(image: HTMLImageElement, repetition: string): CanvasPattern;
          createPattern(image: HTMLCanvasElement, repetition: string): CanvasPattern;
          createPattern(image: HTMLVideoElement, repetition: string): CanvasPattern;
          createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
          drawImage(image: HTMLImageElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
          drawImage(image: HTMLCanvasElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
          drawImage(image: HTMLVideoElement, offsetX: number, offsetY: number, width?: number, height?: number, canvasOffsetX?: number, canvasOffsetY?: number, canvasImageWidth?: number, canvasImageHeight?: number): void;
          fill(fillRule?: string): void;
          fillRect(x: number, y: number, w: number, h: number): void;
          fillText(text: string, x: number, y: number, maxWidth?: number): void;
          getImageData(sx: number, sy: number, sw: number, sh: number): ImageData;
          getLineDash(): number[];
          isPointInPath(x: number, y: number, fillRule?: string): boolean;
          lineTo(x: number, y: number): void;
          measureText(text: string): TextMetrics;
          moveTo(x: number, y: number): void;
          putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number): void;
          quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
          rect(x: number, y: number, w: number, h: number): void;
          restore(): void;
          rotate(angle: number): void;
          save(): void;
          scale(x: number, y: number): void;
          setLineDash(segments: number[]): void;
          setTransform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;
          stroke(): void;
          strokeRect(x: number, y: number, w: number, h: number): void;
          strokeText(text: string, x: number, y: number, maxWidth?: number): void;
          transform(m11: number, m12: number, m21: number, m22: number, dx: number, dy: number): void;
          translate(x: number, y: number): void;
      }
      
      declare var CanvasRenderingContext2D: {
          prototype: CanvasRenderingContext2D;
          new(): CanvasRenderingContext2D;
      }
      
      interface ChannelMergerNode extends AudioNode {
      }
      
      declare var ChannelMergerNode: {
          prototype: ChannelMergerNode;
          new(): ChannelMergerNode;
      }
      
      interface ChannelSplitterNode extends AudioNode {
      }
      
      declare var ChannelSplitterNode: {
          prototype: ChannelSplitterNode;
          new(): ChannelSplitterNode;
      }
      
      interface CharacterData extends Node, ChildNode {
          data: string;
          length: number;
          appendData(arg: string): void;
          deleteData(offset: number, count: number): void;
          insertData(offset: number, arg: string): void;
          replaceData(offset: number, count: number, arg: string): void;
          substringData(offset: number, count: number): string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var CharacterData: {
          prototype: CharacterData;
          new(): CharacterData;
      }
      
      interface ClientRect {
          bottom: number;
          height: number;
          left: number;
          right: number;
          top: number;
          width: number;
      }
      
      declare var ClientRect: {
          prototype: ClientRect;
          new(): ClientRect;
      }
      
      interface ClientRectList {
          length: number;
          item(index: number): ClientRect;
          [index: number]: ClientRect;
      }
      
      declare var ClientRectList: {
          prototype: ClientRectList;
          new(): ClientRectList;
      }
      
      interface ClipboardEvent extends Event {
          clipboardData: DataTransfer;
      }
      
      declare var ClipboardEvent: {
          prototype: ClipboardEvent;
          new(type: string, eventInitDict?: ClipboardEventInit): ClipboardEvent;
      }
      
      interface CloseEvent extends Event {
          code: number;
          reason: string;
          wasClean: boolean;
          initCloseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, wasCleanArg: boolean, codeArg: number, reasonArg: string): void;
      }
      
      declare var CloseEvent: {
          prototype: CloseEvent;
          new(): CloseEvent;
      }
      
      interface CommandEvent extends Event {
          commandName: string;
          detail: string;
      }
      
      declare var CommandEvent: {
          prototype: CommandEvent;
          new(type: string, eventInitDict?: CommandEventInit): CommandEvent;
      }
      
      interface Comment extends CharacterData {
          text: string;
      }
      
      declare var Comment: {
          prototype: Comment;
          new(): Comment;
      }
      
      interface CompositionEvent extends UIEvent {
          data: string;
          locale: string;
          initCompositionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, locale: string): void;
      }
      
      declare var CompositionEvent: {
          prototype: CompositionEvent;
          new(typeArg: string, eventInitDict?: CompositionEventInit): CompositionEvent;
      }
      
      interface Console {
          assert(test?: boolean, message?: string, ...optionalParams: any[]): void;
          clear(): void;
          count(countTitle?: string): void;
          debug(message?: string, ...optionalParams: any[]): void;
          dir(value?: any, ...optionalParams: any[]): void;
          dirxml(value: any): void;
          error(message?: any, ...optionalParams: any[]): void;
          group(groupTitle?: string): void;
          groupCollapsed(groupTitle?: string): void;
          groupEnd(): void;
          info(message?: any, ...optionalParams: any[]): void;
          log(message?: any, ...optionalParams: any[]): void;
          msIsIndependentlyComposed(element: Element): boolean;
          profile(reportName?: string): void;
          profileEnd(): void;
          select(element: Element): void;
          time(timerName?: string): void;
          timeEnd(timerName?: string): void;
          trace(): void;
          warn(message?: any, ...optionalParams: any[]): void;
      }
      
      declare var Console: {
          prototype: Console;
          new(): Console;
      }
      
      interface ConvolverNode extends AudioNode {
          buffer: AudioBuffer;
          normalize: boolean;
      }
      
      declare var ConvolverNode: {
          prototype: ConvolverNode;
          new(): ConvolverNode;
      }
      
      interface Coordinates {
          accuracy: number;
          altitude: number;
          altitudeAccuracy: number;
          heading: number;
          latitude: number;
          longitude: number;
          speed: number;
      }
      
      declare var Coordinates: {
          prototype: Coordinates;
          new(): Coordinates;
      }
      
      interface Crypto extends Object, RandomSource {
          subtle: SubtleCrypto;
      }
      
      declare var Crypto: {
          prototype: Crypto;
          new(): Crypto;
      }
      
      interface CryptoKey {
          algorithm: KeyAlgorithm;
          extractable: boolean;
          type: string;
          usages: string[];
      }
      
      declare var CryptoKey: {
          prototype: CryptoKey;
          new(): CryptoKey;
      }
      
      interface CryptoKeyPair {
          privateKey: CryptoKey;
          publicKey: CryptoKey;
      }
      
      declare var CryptoKeyPair: {
          prototype: CryptoKeyPair;
          new(): CryptoKeyPair;
      }
      
      interface CustomEvent extends Event {
          detail: any;
          initCustomEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, detailArg: any): void;
      }
      
      declare var CustomEvent: {
          prototype: CustomEvent;
          new(typeArg: string, eventInitDict?: CustomEventInit): CustomEvent;
      }
      
      interface DOMError {
          name: string;
          toString(): string;
      }
      
      declare var DOMError: {
          prototype: DOMError;
          new(): DOMError;
      }
      
      interface DOMException {
          code: number;
          message: string;
          name: string;
          toString(): string;
          ABORT_ERR: number;
          DATA_CLONE_ERR: number;
          DOMSTRING_SIZE_ERR: number;
          HIERARCHY_REQUEST_ERR: number;
          INDEX_SIZE_ERR: number;
          INUSE_ATTRIBUTE_ERR: number;
          INVALID_ACCESS_ERR: number;
          INVALID_CHARACTER_ERR: number;
          INVALID_MODIFICATION_ERR: number;
          INVALID_NODE_TYPE_ERR: number;
          INVALID_STATE_ERR: number;
          NAMESPACE_ERR: number;
          NETWORK_ERR: number;
          NOT_FOUND_ERR: number;
          NOT_SUPPORTED_ERR: number;
          NO_DATA_ALLOWED_ERR: number;
          NO_MODIFICATION_ALLOWED_ERR: number;
          PARSE_ERR: number;
          QUOTA_EXCEEDED_ERR: number;
          SECURITY_ERR: number;
          SERIALIZE_ERR: number;
          SYNTAX_ERR: number;
          TIMEOUT_ERR: number;
          TYPE_MISMATCH_ERR: number;
          URL_MISMATCH_ERR: number;
          VALIDATION_ERR: number;
          WRONG_DOCUMENT_ERR: number;
      }
      
      declare var DOMException: {
          prototype: DOMException;
          new(): DOMException;
          ABORT_ERR: number;
          DATA_CLONE_ERR: number;
          DOMSTRING_SIZE_ERR: number;
          HIERARCHY_REQUEST_ERR: number;
          INDEX_SIZE_ERR: number;
          INUSE_ATTRIBUTE_ERR: number;
          INVALID_ACCESS_ERR: number;
          INVALID_CHARACTER_ERR: number;
          INVALID_MODIFICATION_ERR: number;
          INVALID_NODE_TYPE_ERR: number;
          INVALID_STATE_ERR: number;
          NAMESPACE_ERR: number;
          NETWORK_ERR: number;
          NOT_FOUND_ERR: number;
          NOT_SUPPORTED_ERR: number;
          NO_DATA_ALLOWED_ERR: number;
          NO_MODIFICATION_ALLOWED_ERR: number;
          PARSE_ERR: number;
          QUOTA_EXCEEDED_ERR: number;
          SECURITY_ERR: number;
          SERIALIZE_ERR: number;
          SYNTAX_ERR: number;
          TIMEOUT_ERR: number;
          TYPE_MISMATCH_ERR: number;
          URL_MISMATCH_ERR: number;
          VALIDATION_ERR: number;
          WRONG_DOCUMENT_ERR: number;
      }
      
      interface DOMImplementation {
          createDocument(namespaceURI: string, qualifiedName: string, doctype: DocumentType): Document;
          createDocumentType(qualifiedName: string, publicId: string, systemId: string): DocumentType;
          createHTMLDocument(title: string): Document;
          hasFeature(feature: string, version: string): boolean;
      }
      
      declare var DOMImplementation: {
          prototype: DOMImplementation;
          new(): DOMImplementation;
      }
      
      interface DOMParser {
          parseFromString(source: string, mimeType: string): Document;
      }
      
      declare var DOMParser: {
          prototype: DOMParser;
          new(): DOMParser;
      }
      
      interface DOMSettableTokenList extends DOMTokenList {
          value: string;
      }
      
      declare var DOMSettableTokenList: {
          prototype: DOMSettableTokenList;
          new(): DOMSettableTokenList;
      }
      
      interface DOMStringList {
          length: number;
          contains(str: string): boolean;
          item(index: number): string;
          [index: number]: string;
      }
      
      declare var DOMStringList: {
          prototype: DOMStringList;
          new(): DOMStringList;
      }
      
      interface DOMStringMap {
          [name: string]: string;
      }
      
      declare var DOMStringMap: {
          prototype: DOMStringMap;
          new(): DOMStringMap;
      }
      
      interface DOMTokenList {
          length: number;
          add(...token: string[]): void;
          contains(token: string): boolean;
          item(index: number): string;
          remove(...token: string[]): void;
          toString(): string;
          toggle(token: string, force?: boolean): boolean;
          [index: number]: string;
      }
      
      declare var DOMTokenList: {
          prototype: DOMTokenList;
          new(): DOMTokenList;
      }
      
      interface DataCue extends TextTrackCue {
          data: ArrayBuffer;
      }
      
      declare var DataCue: {
          prototype: DataCue;
          new(): DataCue;
      }
      
      interface DataTransfer {
          dropEffect: string;
          effectAllowed: string;
          files: FileList;
          items: DataTransferItemList;
          types: DOMStringList;
          clearData(format?: string): boolean;
          getData(format: string): string;
          setData(format: string, data: string): boolean;
      }
      
      declare var DataTransfer: {
          prototype: DataTransfer;
          new(): DataTransfer;
      }
      
      interface DataTransferItem {
          kind: string;
          type: string;
          getAsFile(): File;
          getAsString(_callback: FunctionStringCallback): void;
      }
      
      declare var DataTransferItem: {
          prototype: DataTransferItem;
          new(): DataTransferItem;
      }
      
      interface DataTransferItemList {
          length: number;
          add(data: File): DataTransferItem;
          clear(): void;
          item(index: number): File;
          remove(index: number): void;
          [index: number]: File;
      }
      
      declare var DataTransferItemList: {
          prototype: DataTransferItemList;
          new(): DataTransferItemList;
      }
      
      interface DeferredPermissionRequest {
          id: number;
          type: string;
          uri: string;
          allow(): void;
          deny(): void;
      }
      
      declare var DeferredPermissionRequest: {
          prototype: DeferredPermissionRequest;
          new(): DeferredPermissionRequest;
      }
      
      interface DelayNode extends AudioNode {
          delayTime: AudioParam;
      }
      
      declare var DelayNode: {
          prototype: DelayNode;
          new(): DelayNode;
      }
      
      interface DeviceAcceleration {
          x: number;
          y: number;
          z: number;
      }
      
      declare var DeviceAcceleration: {
          prototype: DeviceAcceleration;
          new(): DeviceAcceleration;
      }
      
      interface DeviceMotionEvent extends Event {
          acceleration: DeviceAcceleration;
          accelerationIncludingGravity: DeviceAcceleration;
          interval: number;
          rotationRate: DeviceRotationRate;
          initDeviceMotionEvent(type: string, bubbles: boolean, cancelable: boolean, acceleration: DeviceAccelerationDict, accelerationIncludingGravity: DeviceAccelerationDict, rotationRate: DeviceRotationRateDict, interval: number): void;
      }
      
      declare var DeviceMotionEvent: {
          prototype: DeviceMotionEvent;
          new(): DeviceMotionEvent;
      }
      
      interface DeviceOrientationEvent extends Event {
          absolute: boolean;
          alpha: number;
          beta: number;
          gamma: number;
          initDeviceOrientationEvent(type: string, bubbles: boolean, cancelable: boolean, alpha: number, beta: number, gamma: number, absolute: boolean): void;
      }
      
      declare var DeviceOrientationEvent: {
          prototype: DeviceOrientationEvent;
          new(): DeviceOrientationEvent;
      }
      
      interface DeviceRotationRate {
          alpha: number;
          beta: number;
          gamma: number;
      }
      
      declare var DeviceRotationRate: {
          prototype: DeviceRotationRate;
          new(): DeviceRotationRate;
      }
      
      interface Document extends Node, GlobalEventHandlers, NodeSelector, DocumentEvent {
          /**
            * Sets or gets the URL for the current document. 
            */
          URL: string;
          /**
            * Gets the URL for the document, stripped of any character encoding.
            */
          URLUnencoded: string;
          /**
            * Gets the object that has the focus when the parent document has focus.
            */
          activeElement: Element;
          /**
            * Sets or gets the color of all active links in the document.
            */
          alinkColor: string;
          /**
            * Returns a reference to the collection of elements contained by the object.
            */
          all: HTMLCollection;
          /**
            * Retrieves a collection of all a objects that have a name and/or id property. Objects in this collection are in HTML source order.
            */
          anchors: HTMLCollection;
          /**
            * Retrieves a collection of all applet objects in the document.
            */
          applets: HTMLCollection;
          /**
            * Deprecated. Sets or retrieves a value that indicates the background color behind the object. 
            */
          bgColor: string;
          /**
            * Specifies the beginning and end of the document body.
            */
          body: HTMLElement;
          characterSet: string;
          /**
            * Gets or sets the character set used to encode the object.
            */
          charset: string;
          /**
            * Gets a value that indicates whether standards-compliant mode is switched on for the object.
            */
          compatMode: string;
          cookie: string;
          /**
            * Gets the default character set from the current regional language settings.
            */
          defaultCharset: string;
          defaultView: Window;
          /**
            * Sets or gets a value that indicates whether the document can be edited.
            */
          designMode: string;
          /**
            * Sets or retrieves a value that indicates the reading order of the object. 
            */
          dir: string;
          /**
            * Gets an object representing the document type declaration associated with the current document. 
            */
          doctype: DocumentType;
          /**
            * Gets a reference to the root node of the document. 
            */
          documentElement: HTMLElement;
          /**
            * Sets or gets the security domain of the document. 
            */
          domain: string;
          /**
            * Retrieves a collection of all embed objects in the document.
            */
          embeds: HTMLCollection;
          /**
            * Sets or gets the foreground (text) color of the document.
            */
          fgColor: string;
          /**
            * Retrieves a collection, in source order, of all form objects in the document.
            */
          forms: HTMLCollection;
          fullscreenElement: Element;
          fullscreenEnabled: boolean;
          head: HTMLHeadElement;
          hidden: boolean;
          /**
            * Retrieves a collection, in source order, of img objects in the document.
            */
          images: HTMLCollection;
          /**
            * Gets the implementation object of the current document. 
            */
          implementation: DOMImplementation;
          /**
            * Returns the character encoding used to create the webpage that is loaded into the document object.
            */
          inputEncoding: string;
          /**
            * Gets the date that the page was last modified, if the page supplies one. 
            */
          lastModified: string;
          /**
            * Sets or gets the color of the document links. 
            */
          linkColor: string;
          /**
            * Retrieves a collection of all a objects that specify the href property and all area objects in the document.
            */
          links: HTMLCollection;
          /**
            * Contains information about the current URL. 
            */
          location: Location;
          media: string;
          msCSSOMElementFloatMetrics: boolean;
          msCapsLockWarningOff: boolean;
          msHidden: boolean;
          msVisibilityState: string;
          /**
            * Fires when the user aborts the download.
            * @param ev The event.
            */
          onabort: (ev: Event) => any;
          /**
            * Fires when the object is set as the active element.
            * @param ev The event.
            */
          onactivate: (ev: UIEvent) => any;
          /**
            * Fires immediately before the object is set as the active element.
            * @param ev The event.
            */
          onbeforeactivate: (ev: UIEvent) => any;
          /**
            * Fires immediately before the activeElement is changed from the current object to another object in the parent document.
            * @param ev The event.
            */
          onbeforedeactivate: (ev: UIEvent) => any;
          /** 
            * Fires when the object loses the input focus. 
            * @param ev The focus event.
            */
          onblur: (ev: FocusEvent) => any;
          /**
            * Occurs when playback is possible, but would require further buffering. 
            * @param ev The event.
            */
          oncanplay: (ev: Event) => any;
          oncanplaythrough: (ev: Event) => any;
          /**
            * Fires when the contents of the object or selection have changed. 
            * @param ev The event.
            */
          onchange: (ev: Event) => any;
          /**
            * Fires when the user clicks the left mouse button on the object
            * @param ev The mouse event.
            */
          onclick: (ev: MouseEvent) => any;
          /**
            * Fires when the user clicks the right mouse button in the client area, opening the context menu. 
            * @param ev The mouse event.
            */
          oncontextmenu: (ev: PointerEvent) => any;
          /**
            * Fires when the user double-clicks the object.
            * @param ev The mouse event.
            */
          ondblclick: (ev: MouseEvent) => any;
          /**
            * Fires when the activeElement is changed from the current object to another object in the parent document.
            * @param ev The UI Event
            */
          ondeactivate: (ev: UIEvent) => any;
          /**
            * Fires on the source object continuously during a drag operation.
            * @param ev The event.
            */
          ondrag: (ev: DragEvent) => any;
          /**
            * Fires on the source object when the user releases the mouse at the close of a drag operation.
            * @param ev The event.
            */
          ondragend: (ev: DragEvent) => any;
          /** 
            * Fires on the target element when the user drags the object to a valid drop target.
            * @param ev The drag event.
            */
          ondragenter: (ev: DragEvent) => any;
          /** 
            * Fires on the target object when the user moves the mouse out of a valid drop target during a drag operation.
            * @param ev The drag event.
            */
          ondragleave: (ev: DragEvent) => any;
          /**
            * Fires on the target element continuously while the user drags the object over a valid drop target.
            * @param ev The event.
            */
          ondragover: (ev: DragEvent) => any;
          /**
            * Fires on the source object when the user starts to drag a text selection or selected object. 
            * @param ev The event.
            */
          ondragstart: (ev: DragEvent) => any;
          ondrop: (ev: DragEvent) => any;
          /**
            * Occurs when the duration attribute is updated. 
            * @param ev The event.
            */
          ondurationchange: (ev: Event) => any;
          /**
            * Occurs when the media element is reset to its initial state. 
            * @param ev The event.
            */
          onemptied: (ev: Event) => any;
          /**
            * Occurs when the end of playback is reached. 
            * @param ev The event
            */
          onended: (ev: Event) => any;
          /**
            * Fires when an error occurs during object loading.
            * @param ev The event.
            */
          onerror: (ev: Event) => any;
          /**
            * Fires when the object receives focus. 
            * @param ev The event.
            */
          onfocus: (ev: FocusEvent) => any;
          onfullscreenchange: (ev: Event) => any;
          onfullscreenerror: (ev: Event) => any;
          oninput: (ev: Event) => any;
          /**
            * Fires when the user presses a key.
            * @param ev The keyboard event
            */
          onkeydown: (ev: KeyboardEvent) => any;
          /**
            * Fires when the user presses an alphanumeric key.
            * @param ev The event.
            */
          onkeypress: (ev: KeyboardEvent) => any;
          /**
            * Fires when the user releases a key.
            * @param ev The keyboard event
            */
          onkeyup: (ev: KeyboardEvent) => any;
          /**
            * Fires immediately after the browser loads the object. 
            * @param ev The event.
            */
          onload: (ev: Event) => any;
          /**
            * Occurs when media data is loaded at the current playback position. 
            * @param ev The event.
            */
          onloadeddata: (ev: Event) => any;
          /**
            * Occurs when the duration and dimensions of the media have been determined.
            * @param ev The event.
            */
          onloadedmetadata: (ev: Event) => any;
          /**
            * Occurs when Internet Explorer begins looking for media data. 
            * @param ev The event.
            */
          onloadstart: (ev: Event) => any;
          /**
            * Fires when the user clicks the object with either mouse button. 
            * @param ev The mouse event.
            */
          onmousedown: (ev: MouseEvent) => any;
          /**
            * Fires when the user moves the mouse over the object. 
            * @param ev The mouse event.
            */
          onmousemove: (ev: MouseEvent) => any;
          /**
            * Fires when the user moves the mouse pointer outside the boundaries of the object. 
            * @param ev The mouse event.
            */
          onmouseout: (ev: MouseEvent) => any;
          /**
            * Fires when the user moves the mouse pointer into the object.
            * @param ev The mouse event.
            */
          onmouseover: (ev: MouseEvent) => any;
          /**
            * Fires when the user releases a mouse button while the mouse is over the object. 
            * @param ev The mouse event.
            */
          onmouseup: (ev: MouseEvent) => any;
          /**
            * Fires when the wheel button is rotated. 
            * @param ev The mouse event
            */
          onmousewheel: (ev: MouseWheelEvent) => any;
          onmscontentzoom: (ev: UIEvent) => any;
          onmsgesturechange: (ev: MSGestureEvent) => any;
          onmsgesturedoubletap: (ev: MSGestureEvent) => any;
          onmsgestureend: (ev: MSGestureEvent) => any;
          onmsgesturehold: (ev: MSGestureEvent) => any;
          onmsgesturestart: (ev: MSGestureEvent) => any;
          onmsgesturetap: (ev: MSGestureEvent) => any;
          onmsinertiastart: (ev: MSGestureEvent) => any;
          onmsmanipulationstatechanged: (ev: MSManipulationEvent) => any;
          onmspointercancel: (ev: MSPointerEvent) => any;
          onmspointerdown: (ev: MSPointerEvent) => any;
          onmspointerenter: (ev: MSPointerEvent) => any;
          onmspointerleave: (ev: MSPointerEvent) => any;
          onmspointermove: (ev: MSPointerEvent) => any;
          onmspointerout: (ev: MSPointerEvent) => any;
          onmspointerover: (ev: MSPointerEvent) => any;
          onmspointerup: (ev: MSPointerEvent) => any;
          /**
            * Occurs when an item is removed from a Jump List of a webpage running in Site Mode. 
            * @param ev The event.
            */
          onmssitemodejumplistitemremoved: (ev: MSSiteModeEvent) => any;
          /**
            * Occurs when a user clicks a button in a Thumbnail Toolbar of a webpage running in Site Mode.
            * @param ev The event.
            */
          onmsthumbnailclick: (ev: MSSiteModeEvent) => any;
          /**
            * Occurs when playback is paused.
            * @param ev The event.
            */
          onpause: (ev: Event) => any;
          /**
            * Occurs when the play method is requested. 
            * @param ev The event.
            */
          onplay: (ev: Event) => any;
          /**
            * Occurs when the audio or video has started playing. 
            * @param ev The event.
            */
          onplaying: (ev: Event) => any;
          onpointerlockchange: (ev: Event) => any;
          onpointerlockerror: (ev: Event) => any;
          /**
            * Occurs to indicate progress while downloading media data. 
            * @param ev The event.
            */
          onprogress: (ev: ProgressEvent) => any;
          /**
            * Occurs when the playback rate is increased or decreased. 
            * @param ev The event.
            */
          onratechange: (ev: Event) => any;
          /**
            * Fires when the state of the object has changed.
            * @param ev The event
            */
          onreadystatechange: (ev: ProgressEvent) => any;
          /**
            * Fires when the user resets a form. 
            * @param ev The event.
            */
          onreset: (ev: Event) => any;
          /**
            * Fires when the user repositions the scroll box in the scroll bar on the object. 
            * @param ev The event.
            */
          onscroll: (ev: UIEvent) => any;
          /**
            * Occurs when the seek operation ends. 
            * @param ev The event.
            */
          onseeked: (ev: Event) => any;
          /**
            * Occurs when the current playback position is moved. 
            * @param ev The event.
            */
          onseeking: (ev: Event) => any;
          /**
            * Fires when the current selection changes.
            * @param ev The event.
            */
          onselect: (ev: UIEvent) => any;
          onselectstart: (ev: Event) => any;
          /**
            * Occurs when the download has stopped. 
            * @param ev The event.
            */
          onstalled: (ev: Event) => any;
          /**
            * Fires when the user clicks the Stop button or leaves the Web page.
            * @param ev The event.
            */
          onstop: (ev: Event) => any;
          onsubmit: (ev: Event) => any;
          /**
            * Occurs if the load operation has been intentionally halted. 
            * @param ev The event.
            */
          onsuspend: (ev: Event) => any;
          /**
            * Occurs to indicate the current playback position.
            * @param ev The event.
            */
          ontimeupdate: (ev: Event) => any;
          ontouchcancel: (ev: TouchEvent) => any;
          ontouchend: (ev: TouchEvent) => any;
          ontouchmove: (ev: TouchEvent) => any;
          ontouchstart: (ev: TouchEvent) => any;
          /**
            * Occurs when the volume is changed, or playback is muted or unmuted.
            * @param ev The event.
            */
          onvolumechange: (ev: Event) => any;
          /**
            * Occurs when playback stops because the next frame of a video resource is not available. 
            * @param ev The event.
            */
          onwaiting: (ev: Event) => any;
          onwebkitfullscreenchange: (ev: Event) => any;
          onwebkitfullscreenerror: (ev: Event) => any;
          plugins: HTMLCollection;
          pointerLockElement: Element;
          /**
            * Retrieves a value that indicates the current state of the object.
            */
          readyState: string;
          /**
            * Gets the URL of the location that referred the user to the current page.
            */
          referrer: string;
          /**
            * Gets the root svg element in the document hierarchy.
            */
          rootElement: SVGSVGElement;
          /**
            * Retrieves a collection of all script objects in the document.
            */
          scripts: HTMLCollection;
          security: string;
          /**
            * Retrieves a collection of styleSheet objects representing the style sheets that correspond to each instance of a link or style object in the document.
            */
          styleSheets: StyleSheetList;
          /**
            * Contains the title of the document.
            */
          title: string;
          visibilityState: string;
          /** 
            * Sets or gets the color of the links that the user has visited.
            */
          vlinkColor: string;
          webkitCurrentFullScreenElement: Element;
          webkitFullscreenElement: Element;
          webkitFullscreenEnabled: boolean;
          webkitIsFullScreen: boolean;
          xmlEncoding: string;
          xmlStandalone: boolean;
          /**
            * Gets or sets the version attribute specified in the declaration of an XML document.
            */
          xmlVersion: string;
          adoptNode(source: Node): Node;
          captureEvents(): void;
          clear(): void;
          /**
            * Closes an output stream and forces the sent data to display.
            */
          close(): void;
          /**
            * Creates an attribute object with a specified name.
            * @param name String that sets the attribute object's name.
            */
          createAttribute(name: string): Attr;
          createAttributeNS(namespaceURI: string, qualifiedName: string): Attr;
          createCDATASection(data: string): CDATASection;
          /**
            * Creates a comment object with the specified data.
            * @param data Sets the comment object's data.
            */
          createComment(data: string): Comment;
          /**
            * Creates a new document.
            */
          createDocumentFragment(): DocumentFragment;
          /**
            * Creates an instance of the element for the specified tag.
            * @param tagName The name of an element.
            */
          createElement(tagName: "a"): HTMLAnchorElement;
          createElement(tagName: "abbr"): HTMLPhraseElement;
          createElement(tagName: "acronym"): HTMLPhraseElement;
          createElement(tagName: "address"): HTMLBlockElement;
          createElement(tagName: "applet"): HTMLAppletElement;
          createElement(tagName: "area"): HTMLAreaElement;
          createElement(tagName: "audio"): HTMLAudioElement;
          createElement(tagName: "b"): HTMLPhraseElement;
          createElement(tagName: "base"): HTMLBaseElement;
          createElement(tagName: "basefont"): HTMLBaseFontElement;
          createElement(tagName: "bdo"): HTMLPhraseElement;
          createElement(tagName: "big"): HTMLPhraseElement;
          createElement(tagName: "blockquote"): HTMLBlockElement;
          createElement(tagName: "body"): HTMLBodyElement;
          createElement(tagName: "br"): HTMLBRElement;
          createElement(tagName: "button"): HTMLButtonElement;
          createElement(tagName: "canvas"): HTMLCanvasElement;
          createElement(tagName: "caption"): HTMLTableCaptionElement;
          createElement(tagName: "center"): HTMLBlockElement;
          createElement(tagName: "cite"): HTMLPhraseElement;
          createElement(tagName: "code"): HTMLPhraseElement;
          createElement(tagName: "col"): HTMLTableColElement;
          createElement(tagName: "colgroup"): HTMLTableColElement;
          createElement(tagName: "datalist"): HTMLDataListElement;
          createElement(tagName: "dd"): HTMLDDElement;
          createElement(tagName: "del"): HTMLModElement;
          createElement(tagName: "dfn"): HTMLPhraseElement;
          createElement(tagName: "dir"): HTMLDirectoryElement;
          createElement(tagName: "div"): HTMLDivElement;
          createElement(tagName: "dl"): HTMLDListElement;
          createElement(tagName: "dt"): HTMLDTElement;
          createElement(tagName: "em"): HTMLPhraseElement;
          createElement(tagName: "embed"): HTMLEmbedElement;
          createElement(tagName: "fieldset"): HTMLFieldSetElement;
          createElement(tagName: "font"): HTMLFontElement;
          createElement(tagName: "form"): HTMLFormElement;
          createElement(tagName: "frame"): HTMLFrameElement;
          createElement(tagName: "frameset"): HTMLFrameSetElement;
          createElement(tagName: "h1"): HTMLHeadingElement;
          createElement(tagName: "h2"): HTMLHeadingElement;
          createElement(tagName: "h3"): HTMLHeadingElement;
          createElement(tagName: "h4"): HTMLHeadingElement;
          createElement(tagName: "h5"): HTMLHeadingElement;
          createElement(tagName: "h6"): HTMLHeadingElement;
          createElement(tagName: "head"): HTMLHeadElement;
          createElement(tagName: "hr"): HTMLHRElement;
          createElement(tagName: "html"): HTMLHtmlElement;
          createElement(tagName: "i"): HTMLPhraseElement;
          createElement(tagName: "iframe"): HTMLIFrameElement;
          createElement(tagName: "img"): HTMLImageElement;
          createElement(tagName: "input"): HTMLInputElement;
          createElement(tagName: "ins"): HTMLModElement;
          createElement(tagName: "isindex"): HTMLIsIndexElement;
          createElement(tagName: "kbd"): HTMLPhraseElement;
          createElement(tagName: "keygen"): HTMLBlockElement;
          createElement(tagName: "label"): HTMLLabelElement;
          createElement(tagName: "legend"): HTMLLegendElement;
          createElement(tagName: "li"): HTMLLIElement;
          createElement(tagName: "link"): HTMLLinkElement;
          createElement(tagName: "listing"): HTMLBlockElement;
          createElement(tagName: "map"): HTMLMapElement;
          createElement(tagName: "marquee"): HTMLMarqueeElement;
          createElement(tagName: "menu"): HTMLMenuElement;
          createElement(tagName: "meta"): HTMLMetaElement;
          createElement(tagName: "nextid"): HTMLNextIdElement;
          createElement(tagName: "nobr"): HTMLPhraseElement;
          createElement(tagName: "object"): HTMLObjectElement;
          createElement(tagName: "ol"): HTMLOListElement;
          createElement(tagName: "optgroup"): HTMLOptGroupElement;
          createElement(tagName: "option"): HTMLOptionElement;
          createElement(tagName: "p"): HTMLParagraphElement;
          createElement(tagName: "param"): HTMLParamElement;
          createElement(tagName: "plaintext"): HTMLBlockElement;
          createElement(tagName: "pre"): HTMLPreElement;
          createElement(tagName: "progress"): HTMLProgressElement;
          createElement(tagName: "q"): HTMLQuoteElement;
          createElement(tagName: "rt"): HTMLPhraseElement;
          createElement(tagName: "ruby"): HTMLPhraseElement;
          createElement(tagName: "s"): HTMLPhraseElement;
          createElement(tagName: "samp"): HTMLPhraseElement;
          createElement(tagName: "script"): HTMLScriptElement;
          createElement(tagName: "select"): HTMLSelectElement;
          createElement(tagName: "small"): HTMLPhraseElement;
          createElement(tagName: "source"): HTMLSourceElement;
          createElement(tagName: "span"): HTMLSpanElement;
          createElement(tagName: "strike"): HTMLPhraseElement;
          createElement(tagName: "strong"): HTMLPhraseElement;
          createElement(tagName: "style"): HTMLStyleElement;
          createElement(tagName: "sub"): HTMLPhraseElement;
          createElement(tagName: "sup"): HTMLPhraseElement;
          createElement(tagName: "table"): HTMLTableElement;
          createElement(tagName: "tbody"): HTMLTableSectionElement;
          createElement(tagName: "td"): HTMLTableDataCellElement;
          createElement(tagName: "textarea"): HTMLTextAreaElement;
          createElement(tagName: "tfoot"): HTMLTableSectionElement;
          createElement(tagName: "th"): HTMLTableHeaderCellElement;
          createElement(tagName: "thead"): HTMLTableSectionElement;
          createElement(tagName: "title"): HTMLTitleElement;
          createElement(tagName: "tr"): HTMLTableRowElement;
          createElement(tagName: "track"): HTMLTrackElement;
          createElement(tagName: "tt"): HTMLPhraseElement;
          createElement(tagName: "u"): HTMLPhraseElement;
          createElement(tagName: "ul"): HTMLUListElement;
          createElement(tagName: "var"): HTMLPhraseElement;
          createElement(tagName: "video"): HTMLVideoElement;
          createElement(tagName: "x-ms-webview"): MSHTMLWebViewElement;
          createElement(tagName: "xmp"): HTMLBlockElement;
          createElement(tagName: string): HTMLElement;
          createElementNS(namespaceURI: string, qualifiedName: string): Element;
          createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;
          createNSResolver(nodeResolver: Node): XPathNSResolver;
          /**
            * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document. 
            * @param root The root element or node to start traversing on.
            * @param whatToShow The type of nodes or elements to appear in the node list
            * @param filter A custom NodeFilter function to use. For more information, see filter. Use null for no filter.
            * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.
            */
          createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): NodeIterator;
          createProcessingInstruction(target: string, data: string): ProcessingInstruction;
          /**
            *  Returns an empty range object that has both of its boundary points positioned at the beginning of the document. 
            */
          createRange(): Range;
          /**
            * Creates a text string from the specified value. 
            * @param data String that specifies the nodeValue property of the text node.
            */
          createTextNode(data: string): Text;
          createTouch(view: any, target: EventTarget, identifier: number, pageX: number, pageY: number, screenX: number, screenY: number): Touch;
          createTouchList(...touches: Touch[]): TouchList;
          /**
            * Creates a TreeWalker object that you can use to traverse filtered lists of nodes or elements in a document.
            * @param root The root element or node to start traversing on.
            * @param whatToShow The type of nodes or elements to appear in the node list. For more information, see whatToShow.
            * @param filter A custom NodeFilter function to use.
            * @param entityReferenceExpansion A flag that specifies whether entity reference nodes are expanded.
            */
          createTreeWalker(root: Node, whatToShow?: number, filter?: NodeFilter, entityReferenceExpansion?: boolean): TreeWalker;
          /**
            * Returns the element for the specified x coordinate and the specified y coordinate. 
            * @param x The x-offset
            * @param y The y-offset
            */
          elementFromPoint(x: number, y: number): Element;
          evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
          /**
            * Executes a command on the current document, current selection, or the given range.
            * @param commandId String that specifies the command to execute. This command can be any of the command identifiers that can be executed in script.
            * @param showUI Display the user interface, defaults to false.
            * @param value Value to assign.
            */
          execCommand(commandId: string, showUI?: boolean, value?: any): boolean;
          /**
            * Displays help information for the given command identifier.
            * @param commandId Displays help information for the given command identifier.
            */
          execCommandShowHelp(commandId: string): boolean;
          exitFullscreen(): void;
          exitPointerLock(): void;
          /**
            * Causes the element to receive the focus and executes the code specified by the onfocus event.
            */
          focus(): void;
          /**
            * Returns a reference to the first object with the specified value of the ID or NAME attribute.
            * @param elementId String that specifies the ID value. Case-insensitive.
            */
          getElementById(elementId: string): HTMLElement;
          getElementsByClassName(classNames: string): NodeList;
          /**
            * Gets a collection of objects based on the value of the NAME or ID attribute.
            * @param elementName Gets a collection of objects based on the value of the NAME or ID attribute.
            */
          getElementsByName(elementName: string): NodeList;
          /**
            * Retrieves a collection of objects based on the specified element name.
            * @param name Specifies the name of an element.
            */
          getElementsByTagName(tagname: "a"): NodeListOf<HTMLAnchorElement>;
          getElementsByTagName(tagname: "abbr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "acronym"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "address"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "applet"): NodeListOf<HTMLAppletElement>;
          getElementsByTagName(tagname: "area"): NodeListOf<HTMLAreaElement>;
          getElementsByTagName(tagname: "article"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "aside"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "audio"): NodeListOf<HTMLAudioElement>;
          getElementsByTagName(tagname: "b"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "base"): NodeListOf<HTMLBaseElement>;
          getElementsByTagName(tagname: "basefont"): NodeListOf<HTMLBaseFontElement>;
          getElementsByTagName(tagname: "bdo"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "big"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "blockquote"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "body"): NodeListOf<HTMLBodyElement>;
          getElementsByTagName(tagname: "br"): NodeListOf<HTMLBRElement>;
          getElementsByTagName(tagname: "button"): NodeListOf<HTMLButtonElement>;
          getElementsByTagName(tagname: "canvas"): NodeListOf<HTMLCanvasElement>;
          getElementsByTagName(tagname: "caption"): NodeListOf<HTMLTableCaptionElement>;
          getElementsByTagName(tagname: "center"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "circle"): NodeListOf<SVGCircleElement>;
          getElementsByTagName(tagname: "cite"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "clippath"): NodeListOf<SVGClipPathElement>;
          getElementsByTagName(tagname: "code"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "col"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(tagname: "colgroup"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(tagname: "datalist"): NodeListOf<HTMLDataListElement>;
          getElementsByTagName(tagname: "dd"): NodeListOf<HTMLDDElement>;
          getElementsByTagName(tagname: "defs"): NodeListOf<SVGDefsElement>;
          getElementsByTagName(tagname: "del"): NodeListOf<HTMLModElement>;
          getElementsByTagName(tagname: "desc"): NodeListOf<SVGDescElement>;
          getElementsByTagName(tagname: "dfn"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "dir"): NodeListOf<HTMLDirectoryElement>;
          getElementsByTagName(tagname: "div"): NodeListOf<HTMLDivElement>;
          getElementsByTagName(tagname: "dl"): NodeListOf<HTMLDListElement>;
          getElementsByTagName(tagname: "dt"): NodeListOf<HTMLDTElement>;
          getElementsByTagName(tagname: "ellipse"): NodeListOf<SVGEllipseElement>;
          getElementsByTagName(tagname: "em"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "embed"): NodeListOf<HTMLEmbedElement>;
          getElementsByTagName(tagname: "feblend"): NodeListOf<SVGFEBlendElement>;
          getElementsByTagName(tagname: "fecolormatrix"): NodeListOf<SVGFEColorMatrixElement>;
          getElementsByTagName(tagname: "fecomponenttransfer"): NodeListOf<SVGFEComponentTransferElement>;
          getElementsByTagName(tagname: "fecomposite"): NodeListOf<SVGFECompositeElement>;
          getElementsByTagName(tagname: "feconvolvematrix"): NodeListOf<SVGFEConvolveMatrixElement>;
          getElementsByTagName(tagname: "fediffuselighting"): NodeListOf<SVGFEDiffuseLightingElement>;
          getElementsByTagName(tagname: "fedisplacementmap"): NodeListOf<SVGFEDisplacementMapElement>;
          getElementsByTagName(tagname: "fedistantlight"): NodeListOf<SVGFEDistantLightElement>;
          getElementsByTagName(tagname: "feflood"): NodeListOf<SVGFEFloodElement>;
          getElementsByTagName(tagname: "fefunca"): NodeListOf<SVGFEFuncAElement>;
          getElementsByTagName(tagname: "fefuncb"): NodeListOf<SVGFEFuncBElement>;
          getElementsByTagName(tagname: "fefuncg"): NodeListOf<SVGFEFuncGElement>;
          getElementsByTagName(tagname: "fefuncr"): NodeListOf<SVGFEFuncRElement>;
          getElementsByTagName(tagname: "fegaussianblur"): NodeListOf<SVGFEGaussianBlurElement>;
          getElementsByTagName(tagname: "feimage"): NodeListOf<SVGFEImageElement>;
          getElementsByTagName(tagname: "femerge"): NodeListOf<SVGFEMergeElement>;
          getElementsByTagName(tagname: "femergenode"): NodeListOf<SVGFEMergeNodeElement>;
          getElementsByTagName(tagname: "femorphology"): NodeListOf<SVGFEMorphologyElement>;
          getElementsByTagName(tagname: "feoffset"): NodeListOf<SVGFEOffsetElement>;
          getElementsByTagName(tagname: "fepointlight"): NodeListOf<SVGFEPointLightElement>;
          getElementsByTagName(tagname: "fespecularlighting"): NodeListOf<SVGFESpecularLightingElement>;
          getElementsByTagName(tagname: "fespotlight"): NodeListOf<SVGFESpotLightElement>;
          getElementsByTagName(tagname: "fetile"): NodeListOf<SVGFETileElement>;
          getElementsByTagName(tagname: "feturbulence"): NodeListOf<SVGFETurbulenceElement>;
          getElementsByTagName(tagname: "fieldset"): NodeListOf<HTMLFieldSetElement>;
          getElementsByTagName(tagname: "figcaption"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "figure"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "filter"): NodeListOf<SVGFilterElement>;
          getElementsByTagName(tagname: "font"): NodeListOf<HTMLFontElement>;
          getElementsByTagName(tagname: "footer"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "foreignobject"): NodeListOf<SVGForeignObjectElement>;
          getElementsByTagName(tagname: "form"): NodeListOf<HTMLFormElement>;
          getElementsByTagName(tagname: "frame"): NodeListOf<HTMLFrameElement>;
          getElementsByTagName(tagname: "frameset"): NodeListOf<HTMLFrameSetElement>;
          getElementsByTagName(tagname: "g"): NodeListOf<SVGGElement>;
          getElementsByTagName(tagname: "h1"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h2"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h3"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h4"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h5"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "h6"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(tagname: "head"): NodeListOf<HTMLHeadElement>;
          getElementsByTagName(tagname: "header"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "hgroup"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "hr"): NodeListOf<HTMLHRElement>;
          getElementsByTagName(tagname: "html"): NodeListOf<HTMLHtmlElement>;
          getElementsByTagName(tagname: "i"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "iframe"): NodeListOf<HTMLIFrameElement>;
          getElementsByTagName(tagname: "image"): NodeListOf<SVGImageElement>;
          getElementsByTagName(tagname: "img"): NodeListOf<HTMLImageElement>;
          getElementsByTagName(tagname: "input"): NodeListOf<HTMLInputElement>;
          getElementsByTagName(tagname: "ins"): NodeListOf<HTMLModElement>;
          getElementsByTagName(tagname: "isindex"): NodeListOf<HTMLIsIndexElement>;
          getElementsByTagName(tagname: "kbd"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "keygen"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "label"): NodeListOf<HTMLLabelElement>;
          getElementsByTagName(tagname: "legend"): NodeListOf<HTMLLegendElement>;
          getElementsByTagName(tagname: "li"): NodeListOf<HTMLLIElement>;
          getElementsByTagName(tagname: "line"): NodeListOf<SVGLineElement>;
          getElementsByTagName(tagname: "lineargradient"): NodeListOf<SVGLinearGradientElement>;
          getElementsByTagName(tagname: "link"): NodeListOf<HTMLLinkElement>;
          getElementsByTagName(tagname: "listing"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "map"): NodeListOf<HTMLMapElement>;
          getElementsByTagName(tagname: "mark"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "marker"): NodeListOf<SVGMarkerElement>;
          getElementsByTagName(tagname: "marquee"): NodeListOf<HTMLMarqueeElement>;
          getElementsByTagName(tagname: "mask"): NodeListOf<SVGMaskElement>;
          getElementsByTagName(tagname: "menu"): NodeListOf<HTMLMenuElement>;
          getElementsByTagName(tagname: "meta"): NodeListOf<HTMLMetaElement>;
          getElementsByTagName(tagname: "metadata"): NodeListOf<SVGMetadataElement>;
          getElementsByTagName(tagname: "nav"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "nextid"): NodeListOf<HTMLNextIdElement>;
          getElementsByTagName(tagname: "nobr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "noframes"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "noscript"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "object"): NodeListOf<HTMLObjectElement>;
          getElementsByTagName(tagname: "ol"): NodeListOf<HTMLOListElement>;
          getElementsByTagName(tagname: "optgroup"): NodeListOf<HTMLOptGroupElement>;
          getElementsByTagName(tagname: "option"): NodeListOf<HTMLOptionElement>;
          getElementsByTagName(tagname: "p"): NodeListOf<HTMLParagraphElement>;
          getElementsByTagName(tagname: "param"): NodeListOf<HTMLParamElement>;
          getElementsByTagName(tagname: "path"): NodeListOf<SVGPathElement>;
          getElementsByTagName(tagname: "pattern"): NodeListOf<SVGPatternElement>;
          getElementsByTagName(tagname: "plaintext"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: "polygon"): NodeListOf<SVGPolygonElement>;
          getElementsByTagName(tagname: "polyline"): NodeListOf<SVGPolylineElement>;
          getElementsByTagName(tagname: "pre"): NodeListOf<HTMLPreElement>;
          getElementsByTagName(tagname: "progress"): NodeListOf<HTMLProgressElement>;
          getElementsByTagName(tagname: "q"): NodeListOf<HTMLQuoteElement>;
          getElementsByTagName(tagname: "radialgradient"): NodeListOf<SVGRadialGradientElement>;
          getElementsByTagName(tagname: "rect"): NodeListOf<SVGRectElement>;
          getElementsByTagName(tagname: "rt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "ruby"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "s"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "samp"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "script"): NodeListOf<HTMLScriptElement>;
          getElementsByTagName(tagname: "section"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "select"): NodeListOf<HTMLSelectElement>;
          getElementsByTagName(tagname: "small"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "source"): NodeListOf<HTMLSourceElement>;
          getElementsByTagName(tagname: "span"): NodeListOf<HTMLSpanElement>;
          getElementsByTagName(tagname: "stop"): NodeListOf<SVGStopElement>;
          getElementsByTagName(tagname: "strike"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "strong"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "style"): NodeListOf<HTMLStyleElement>;
          getElementsByTagName(tagname: "sub"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "sup"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "svg"): NodeListOf<SVGSVGElement>;
          getElementsByTagName(tagname: "switch"): NodeListOf<SVGSwitchElement>;
          getElementsByTagName(tagname: "symbol"): NodeListOf<SVGSymbolElement>;
          getElementsByTagName(tagname: "table"): NodeListOf<HTMLTableElement>;
          getElementsByTagName(tagname: "tbody"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(tagname: "td"): NodeListOf<HTMLTableDataCellElement>;
          getElementsByTagName(tagname: "text"): NodeListOf<SVGTextElement>;
          getElementsByTagName(tagname: "textpath"): NodeListOf<SVGTextPathElement>;
          getElementsByTagName(tagname: "textarea"): NodeListOf<HTMLTextAreaElement>;
          getElementsByTagName(tagname: "tfoot"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(tagname: "th"): NodeListOf<HTMLTableHeaderCellElement>;
          getElementsByTagName(tagname: "thead"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(tagname: "title"): NodeListOf<HTMLTitleElement>;
          getElementsByTagName(tagname: "tr"): NodeListOf<HTMLTableRowElement>;
          getElementsByTagName(tagname: "track"): NodeListOf<HTMLTrackElement>;
          getElementsByTagName(tagname: "tspan"): NodeListOf<SVGTSpanElement>;
          getElementsByTagName(tagname: "tt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "u"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "ul"): NodeListOf<HTMLUListElement>;
          getElementsByTagName(tagname: "use"): NodeListOf<SVGUseElement>;
          getElementsByTagName(tagname: "var"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(tagname: "video"): NodeListOf<HTMLVideoElement>;
          getElementsByTagName(tagname: "view"): NodeListOf<SVGViewElement>;
          getElementsByTagName(tagname: "wbr"): NodeListOf<HTMLElement>;
          getElementsByTagName(tagname: "x-ms-webview"): NodeListOf<MSHTMLWebViewElement>;
          getElementsByTagName(tagname: "xmp"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(tagname: string): NodeList;
          getElementsByTagNameNS(namespaceURI: string, localName: string): NodeList;
          /**
            * Returns an object representing the current selection of the document that is loaded into the object displaying a webpage.
            */
          getSelection(): Selection;
          /**
            * Gets a value indicating whether the object currently has focus.
            */
          hasFocus(): boolean;
          importNode(importedNode: Node, deep: boolean): Node;
          msElementsFromPoint(x: number, y: number): NodeList;
          msElementsFromRect(left: number, top: number, width: number, height: number): NodeList;
          msGetPrintDocumentForNamedFlow(flowName: string): Document;
          msSetPrintDocumentUriForNamedFlow(flowName: string, uri: string): void;
          /**
            * Opens a new window and loads a document specified by a given URL. Also, opens a new window that uses the url parameter and the name parameter to collect the output of the write method and the writeln method.
            * @param url Specifies a MIME type for the document.
            * @param name Specifies the name of the window. This name is used as the value for the TARGET attribute on a form or an anchor element.
            * @param features Contains a list of items separated by commas. Each item consists of an option and a value, separated by an equals sign (for example, "fullscreen=yes, toolbar=yes"). The following values are supported.
            * @param replace Specifies whether the existing entry for the document is replaced in the history list.
            */
          open(url?: string, name?: string, features?: string, replace?: boolean): Document | Window;
          /** 
            * Returns a Boolean value that indicates whether a specified command can be successfully executed using execCommand, given the current state of the document.
            * @param commandId Specifies a command identifier.
            */
          queryCommandEnabled(commandId: string): boolean;
          /**
            * Returns a Boolean value that indicates whether the specified command is in the indeterminate state.
            * @param commandId String that specifies a command identifier.
            */
          queryCommandIndeterm(commandId: string): boolean;
          /**
            * Returns a Boolean value that indicates the current state of the command.
            * @param commandId String that specifies a command identifier.
            */
          queryCommandState(commandId: string): boolean;
          /**
            * Returns a Boolean value that indicates whether the current command is supported on the current range.
            * @param commandId Specifies a command identifier.
            */
          queryCommandSupported(commandId: string): boolean;
          /**
            * Retrieves the string associated with a command.
            * @param commandId String that contains the identifier of a command. This can be any command identifier given in the list of Command Identifiers. 
            */
          queryCommandText(commandId: string): string;
          /**
            * Returns the current value of the document, range, or current selection for the given command.
            * @param commandId String that specifies a command identifier.
            */
          queryCommandValue(commandId: string): string;
          releaseEvents(): void;
          /**
            * Allows updating the print settings for the page.
            */
          updateSettings(): void;
          webkitCancelFullScreen(): void;
          webkitExitFullscreen(): void;
          /**
            * Writes one or more HTML expressions to a document in the specified window. 
            * @param content Specifies the text and HTML tags to write.
            */
          write(...content: string[]): void;
          /**
            * Writes one or more HTML expressions, followed by a carriage return, to a document in the specified window. 
            * @param content The text and HTML tags to write.
            */
          writeln(...content: string[]): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "fullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "fullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mssitemodejumplistitemremoved", listener: (ev: MSSiteModeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "msthumbnailclick", listener: (ev: MSSiteModeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerlockchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerlockerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stop", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Document: {
          prototype: Document;
          new(): Document;
      }
      
      interface DocumentFragment extends Node, NodeSelector {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var DocumentFragment: {
          prototype: DocumentFragment;
          new(): DocumentFragment;
      }
      
      interface DocumentType extends Node, ChildNode {
          entities: NamedNodeMap;
          internalSubset: string;
          name: string;
          notations: NamedNodeMap;
          publicId: string;
          systemId: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var DocumentType: {
          prototype: DocumentType;
          new(): DocumentType;
      }
      
      interface DragEvent extends MouseEvent {
          dataTransfer: DataTransfer;
          initDragEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, dataTransferArg: DataTransfer): void;
          msConvertURL(file: File, targetType: string, targetURL?: string): void;
      }
      
      declare var DragEvent: {
          prototype: DragEvent;
          new(): DragEvent;
      }
      
      interface DynamicsCompressorNode extends AudioNode {
          attack: AudioParam;
          knee: AudioParam;
          ratio: AudioParam;
          reduction: AudioParam;
          release: AudioParam;
          threshold: AudioParam;
      }
      
      declare var DynamicsCompressorNode: {
          prototype: DynamicsCompressorNode;
          new(): DynamicsCompressorNode;
      }
      
      interface EXT_texture_filter_anisotropic {
          MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;
          TEXTURE_MAX_ANISOTROPY_EXT: number;
      }
      
      declare var EXT_texture_filter_anisotropic: {
          prototype: EXT_texture_filter_anisotropic;
          new(): EXT_texture_filter_anisotropic;
          MAX_TEXTURE_MAX_ANISOTROPY_EXT: number;
          TEXTURE_MAX_ANISOTROPY_EXT: number;
      }
      
      interface Element extends Node, GlobalEventHandlers, ElementTraversal, NodeSelector, ChildNode {
          classList: DOMTokenList;
          clientHeight: number;
          clientLeft: number;
          clientTop: number;
          clientWidth: number;
          msContentZoomFactor: number;
          msRegionOverflow: string;
          onariarequest: (ev: AriaRequestEvent) => any;
          oncommand: (ev: CommandEvent) => any;
          ongotpointercapture: (ev: PointerEvent) => any;
          onlostpointercapture: (ev: PointerEvent) => any;
          onmsgesturechange: (ev: MSGestureEvent) => any;
          onmsgesturedoubletap: (ev: MSGestureEvent) => any;
          onmsgestureend: (ev: MSGestureEvent) => any;
          onmsgesturehold: (ev: MSGestureEvent) => any;
          onmsgesturestart: (ev: MSGestureEvent) => any;
          onmsgesturetap: (ev: MSGestureEvent) => any;
          onmsgotpointercapture: (ev: MSPointerEvent) => any;
          onmsinertiastart: (ev: MSGestureEvent) => any;
          onmslostpointercapture: (ev: MSPointerEvent) => any;
          onmspointercancel: (ev: MSPointerEvent) => any;
          onmspointerdown: (ev: MSPointerEvent) => any;
          onmspointerenter: (ev: MSPointerEvent) => any;
          onmspointerleave: (ev: MSPointerEvent) => any;
          onmspointermove: (ev: MSPointerEvent) => any;
          onmspointerout: (ev: MSPointerEvent) => any;
          onmspointerover: (ev: MSPointerEvent) => any;
          onmspointerup: (ev: MSPointerEvent) => any;
          ontouchcancel: (ev: TouchEvent) => any;
          ontouchend: (ev: TouchEvent) => any;
          ontouchmove: (ev: TouchEvent) => any;
          ontouchstart: (ev: TouchEvent) => any;
          onwebkitfullscreenchange: (ev: Event) => any;
          onwebkitfullscreenerror: (ev: Event) => any;
          scrollHeight: number;
          scrollLeft: number;
          scrollTop: number;
          scrollWidth: number;
          tagName: string;
          getAttribute(name?: string): string;
          getAttributeNS(namespaceURI: string, localName: string): string;
          getAttributeNode(name: string): Attr;
          getAttributeNodeNS(namespaceURI: string, localName: string): Attr;
          getBoundingClientRect(): ClientRect;
          getClientRects(): ClientRectList;
          getElementsByTagName(name: "a"): NodeListOf<HTMLAnchorElement>;
          getElementsByTagName(name: "abbr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "acronym"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "address"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "applet"): NodeListOf<HTMLAppletElement>;
          getElementsByTagName(name: "area"): NodeListOf<HTMLAreaElement>;
          getElementsByTagName(name: "article"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "aside"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "audio"): NodeListOf<HTMLAudioElement>;
          getElementsByTagName(name: "b"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "base"): NodeListOf<HTMLBaseElement>;
          getElementsByTagName(name: "basefont"): NodeListOf<HTMLBaseFontElement>;
          getElementsByTagName(name: "bdo"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "big"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "blockquote"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "body"): NodeListOf<HTMLBodyElement>;
          getElementsByTagName(name: "br"): NodeListOf<HTMLBRElement>;
          getElementsByTagName(name: "button"): NodeListOf<HTMLButtonElement>;
          getElementsByTagName(name: "canvas"): NodeListOf<HTMLCanvasElement>;
          getElementsByTagName(name: "caption"): NodeListOf<HTMLTableCaptionElement>;
          getElementsByTagName(name: "center"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "circle"): NodeListOf<SVGCircleElement>;
          getElementsByTagName(name: "cite"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "clippath"): NodeListOf<SVGClipPathElement>;
          getElementsByTagName(name: "code"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "col"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(name: "colgroup"): NodeListOf<HTMLTableColElement>;
          getElementsByTagName(name: "datalist"): NodeListOf<HTMLDataListElement>;
          getElementsByTagName(name: "dd"): NodeListOf<HTMLDDElement>;
          getElementsByTagName(name: "defs"): NodeListOf<SVGDefsElement>;
          getElementsByTagName(name: "del"): NodeListOf<HTMLModElement>;
          getElementsByTagName(name: "desc"): NodeListOf<SVGDescElement>;
          getElementsByTagName(name: "dfn"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "dir"): NodeListOf<HTMLDirectoryElement>;
          getElementsByTagName(name: "div"): NodeListOf<HTMLDivElement>;
          getElementsByTagName(name: "dl"): NodeListOf<HTMLDListElement>;
          getElementsByTagName(name: "dt"): NodeListOf<HTMLDTElement>;
          getElementsByTagName(name: "ellipse"): NodeListOf<SVGEllipseElement>;
          getElementsByTagName(name: "em"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "embed"): NodeListOf<HTMLEmbedElement>;
          getElementsByTagName(name: "feblend"): NodeListOf<SVGFEBlendElement>;
          getElementsByTagName(name: "fecolormatrix"): NodeListOf<SVGFEColorMatrixElement>;
          getElementsByTagName(name: "fecomponenttransfer"): NodeListOf<SVGFEComponentTransferElement>;
          getElementsByTagName(name: "fecomposite"): NodeListOf<SVGFECompositeElement>;
          getElementsByTagName(name: "feconvolvematrix"): NodeListOf<SVGFEConvolveMatrixElement>;
          getElementsByTagName(name: "fediffuselighting"): NodeListOf<SVGFEDiffuseLightingElement>;
          getElementsByTagName(name: "fedisplacementmap"): NodeListOf<SVGFEDisplacementMapElement>;
          getElementsByTagName(name: "fedistantlight"): NodeListOf<SVGFEDistantLightElement>;
          getElementsByTagName(name: "feflood"): NodeListOf<SVGFEFloodElement>;
          getElementsByTagName(name: "fefunca"): NodeListOf<SVGFEFuncAElement>;
          getElementsByTagName(name: "fefuncb"): NodeListOf<SVGFEFuncBElement>;
          getElementsByTagName(name: "fefuncg"): NodeListOf<SVGFEFuncGElement>;
          getElementsByTagName(name: "fefuncr"): NodeListOf<SVGFEFuncRElement>;
          getElementsByTagName(name: "fegaussianblur"): NodeListOf<SVGFEGaussianBlurElement>;
          getElementsByTagName(name: "feimage"): NodeListOf<SVGFEImageElement>;
          getElementsByTagName(name: "femerge"): NodeListOf<SVGFEMergeElement>;
          getElementsByTagName(name: "femergenode"): NodeListOf<SVGFEMergeNodeElement>;
          getElementsByTagName(name: "femorphology"): NodeListOf<SVGFEMorphologyElement>;
          getElementsByTagName(name: "feoffset"): NodeListOf<SVGFEOffsetElement>;
          getElementsByTagName(name: "fepointlight"): NodeListOf<SVGFEPointLightElement>;
          getElementsByTagName(name: "fespecularlighting"): NodeListOf<SVGFESpecularLightingElement>;
          getElementsByTagName(name: "fespotlight"): NodeListOf<SVGFESpotLightElement>;
          getElementsByTagName(name: "fetile"): NodeListOf<SVGFETileElement>;
          getElementsByTagName(name: "feturbulence"): NodeListOf<SVGFETurbulenceElement>;
          getElementsByTagName(name: "fieldset"): NodeListOf<HTMLFieldSetElement>;
          getElementsByTagName(name: "figcaption"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "figure"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "filter"): NodeListOf<SVGFilterElement>;
          getElementsByTagName(name: "font"): NodeListOf<HTMLFontElement>;
          getElementsByTagName(name: "footer"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "foreignobject"): NodeListOf<SVGForeignObjectElement>;
          getElementsByTagName(name: "form"): NodeListOf<HTMLFormElement>;
          getElementsByTagName(name: "frame"): NodeListOf<HTMLFrameElement>;
          getElementsByTagName(name: "frameset"): NodeListOf<HTMLFrameSetElement>;
          getElementsByTagName(name: "g"): NodeListOf<SVGGElement>;
          getElementsByTagName(name: "h1"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h2"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h3"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h4"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h5"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "h6"): NodeListOf<HTMLHeadingElement>;
          getElementsByTagName(name: "head"): NodeListOf<HTMLHeadElement>;
          getElementsByTagName(name: "header"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "hgroup"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "hr"): NodeListOf<HTMLHRElement>;
          getElementsByTagName(name: "html"): NodeListOf<HTMLHtmlElement>;
          getElementsByTagName(name: "i"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "iframe"): NodeListOf<HTMLIFrameElement>;
          getElementsByTagName(name: "image"): NodeListOf<SVGImageElement>;
          getElementsByTagName(name: "img"): NodeListOf<HTMLImageElement>;
          getElementsByTagName(name: "input"): NodeListOf<HTMLInputElement>;
          getElementsByTagName(name: "ins"): NodeListOf<HTMLModElement>;
          getElementsByTagName(name: "isindex"): NodeListOf<HTMLIsIndexElement>;
          getElementsByTagName(name: "kbd"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "keygen"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "label"): NodeListOf<HTMLLabelElement>;
          getElementsByTagName(name: "legend"): NodeListOf<HTMLLegendElement>;
          getElementsByTagName(name: "li"): NodeListOf<HTMLLIElement>;
          getElementsByTagName(name: "line"): NodeListOf<SVGLineElement>;
          getElementsByTagName(name: "lineargradient"): NodeListOf<SVGLinearGradientElement>;
          getElementsByTagName(name: "link"): NodeListOf<HTMLLinkElement>;
          getElementsByTagName(name: "listing"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "map"): NodeListOf<HTMLMapElement>;
          getElementsByTagName(name: "mark"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "marker"): NodeListOf<SVGMarkerElement>;
          getElementsByTagName(name: "marquee"): NodeListOf<HTMLMarqueeElement>;
          getElementsByTagName(name: "mask"): NodeListOf<SVGMaskElement>;
          getElementsByTagName(name: "menu"): NodeListOf<HTMLMenuElement>;
          getElementsByTagName(name: "meta"): NodeListOf<HTMLMetaElement>;
          getElementsByTagName(name: "metadata"): NodeListOf<SVGMetadataElement>;
          getElementsByTagName(name: "nav"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "nextid"): NodeListOf<HTMLNextIdElement>;
          getElementsByTagName(name: "nobr"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "noframes"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "noscript"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "object"): NodeListOf<HTMLObjectElement>;
          getElementsByTagName(name: "ol"): NodeListOf<HTMLOListElement>;
          getElementsByTagName(name: "optgroup"): NodeListOf<HTMLOptGroupElement>;
          getElementsByTagName(name: "option"): NodeListOf<HTMLOptionElement>;
          getElementsByTagName(name: "p"): NodeListOf<HTMLParagraphElement>;
          getElementsByTagName(name: "param"): NodeListOf<HTMLParamElement>;
          getElementsByTagName(name: "path"): NodeListOf<SVGPathElement>;
          getElementsByTagName(name: "pattern"): NodeListOf<SVGPatternElement>;
          getElementsByTagName(name: "plaintext"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: "polygon"): NodeListOf<SVGPolygonElement>;
          getElementsByTagName(name: "polyline"): NodeListOf<SVGPolylineElement>;
          getElementsByTagName(name: "pre"): NodeListOf<HTMLPreElement>;
          getElementsByTagName(name: "progress"): NodeListOf<HTMLProgressElement>;
          getElementsByTagName(name: "q"): NodeListOf<HTMLQuoteElement>;
          getElementsByTagName(name: "radialgradient"): NodeListOf<SVGRadialGradientElement>;
          getElementsByTagName(name: "rect"): NodeListOf<SVGRectElement>;
          getElementsByTagName(name: "rt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "ruby"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "s"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "samp"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "script"): NodeListOf<HTMLScriptElement>;
          getElementsByTagName(name: "section"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "select"): NodeListOf<HTMLSelectElement>;
          getElementsByTagName(name: "small"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "source"): NodeListOf<HTMLSourceElement>;
          getElementsByTagName(name: "span"): NodeListOf<HTMLSpanElement>;
          getElementsByTagName(name: "stop"): NodeListOf<SVGStopElement>;
          getElementsByTagName(name: "strike"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "strong"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "style"): NodeListOf<HTMLStyleElement>;
          getElementsByTagName(name: "sub"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "sup"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "svg"): NodeListOf<SVGSVGElement>;
          getElementsByTagName(name: "switch"): NodeListOf<SVGSwitchElement>;
          getElementsByTagName(name: "symbol"): NodeListOf<SVGSymbolElement>;
          getElementsByTagName(name: "table"): NodeListOf<HTMLTableElement>;
          getElementsByTagName(name: "tbody"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(name: "td"): NodeListOf<HTMLTableDataCellElement>;
          getElementsByTagName(name: "text"): NodeListOf<SVGTextElement>;
          getElementsByTagName(name: "textpath"): NodeListOf<SVGTextPathElement>;
          getElementsByTagName(name: "textarea"): NodeListOf<HTMLTextAreaElement>;
          getElementsByTagName(name: "tfoot"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(name: "th"): NodeListOf<HTMLTableHeaderCellElement>;
          getElementsByTagName(name: "thead"): NodeListOf<HTMLTableSectionElement>;
          getElementsByTagName(name: "title"): NodeListOf<HTMLTitleElement>;
          getElementsByTagName(name: "tr"): NodeListOf<HTMLTableRowElement>;
          getElementsByTagName(name: "track"): NodeListOf<HTMLTrackElement>;
          getElementsByTagName(name: "tspan"): NodeListOf<SVGTSpanElement>;
          getElementsByTagName(name: "tt"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "u"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "ul"): NodeListOf<HTMLUListElement>;
          getElementsByTagName(name: "use"): NodeListOf<SVGUseElement>;
          getElementsByTagName(name: "var"): NodeListOf<HTMLPhraseElement>;
          getElementsByTagName(name: "video"): NodeListOf<HTMLVideoElement>;
          getElementsByTagName(name: "view"): NodeListOf<SVGViewElement>;
          getElementsByTagName(name: "wbr"): NodeListOf<HTMLElement>;
          getElementsByTagName(name: "x-ms-webview"): NodeListOf<MSHTMLWebViewElement>;
          getElementsByTagName(name: "xmp"): NodeListOf<HTMLBlockElement>;
          getElementsByTagName(name: string): NodeList;
          getElementsByTagNameNS(namespaceURI: string, localName: string): NodeList;
          hasAttribute(name: string): boolean;
          hasAttributeNS(namespaceURI: string, localName: string): boolean;
          msGetRegionContent(): MSRangeCollection;
          msGetUntransformedBounds(): ClientRect;
          msMatchesSelector(selectors: string): boolean;
          msReleasePointerCapture(pointerId: number): void;
          msSetPointerCapture(pointerId: number): void;
          msZoomTo(args: MsZoomToOptions): void;
          releasePointerCapture(pointerId: number): void;
          removeAttribute(name?: string): void;
          removeAttributeNS(namespaceURI: string, localName: string): void;
          removeAttributeNode(oldAttr: Attr): Attr;
          requestFullscreen(): void;
          requestPointerLock(): void;
          setAttribute(name?: string, value?: string): void;
          setAttributeNS(namespaceURI: string, qualifiedName: string, value: string): void;
          setAttributeNode(newAttr: Attr): Attr;
          setAttributeNodeNS(newAttr: Attr): Attr;
          setPointerCapture(pointerId: number): void;
          webkitMatchesSelector(selectors: string): boolean;
          webkitRequestFullScreen(): void;
          webkitRequestFullscreen(): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Element: {
          prototype: Element;
          new(): Element;
      }
      
      interface ErrorEvent extends Event {
          colno: number;
          error: any;
          filename: string;
          lineno: number;
          message: string;
          initErrorEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, messageArg: string, filenameArg: string, linenoArg: number): void;
      }
      
      declare var ErrorEvent: {
          prototype: ErrorEvent;
          new(): ErrorEvent;
      }
      
      interface Event {
          bubbles: boolean;
          cancelBubble: boolean;
          cancelable: boolean;
          currentTarget: EventTarget;
          defaultPrevented: boolean;
          eventPhase: number;
          isTrusted: boolean;
          returnValue: boolean;
          srcElement: Element;
          target: EventTarget;
          timeStamp: number;
          type: string;
          initEvent(eventTypeArg: string, canBubbleArg: boolean, cancelableArg: boolean): void;
          preventDefault(): void;
          stopImmediatePropagation(): void;
          stopPropagation(): void;
          AT_TARGET: number;
          BUBBLING_PHASE: number;
          CAPTURING_PHASE: number;
      }
      
      declare var Event: {
          prototype: Event;
          new(type: string, eventInitDict?: EventInit): Event;
          AT_TARGET: number;
          BUBBLING_PHASE: number;
          CAPTURING_PHASE: number;
      }
      
      interface EventTarget {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          dispatchEvent(evt: Event): boolean;
          removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var EventTarget: {
          prototype: EventTarget;
          new(): EventTarget;
      }
      
      interface External {
      }
      
      declare var External: {
          prototype: External;
          new(): External;
      }
      
      interface File extends Blob {
          lastModifiedDate: any;
          name: string;
      }
      
      declare var File: {
          prototype: File;
          new(): File;
      }
      
      interface FileList {
          length: number;
          item(index: number): File;
          [index: number]: File;
      }
      
      declare var FileList: {
          prototype: FileList;
          new(): FileList;
      }
      
      interface FileReader extends EventTarget, MSBaseReader {
          error: DOMError;
          readAsArrayBuffer(blob: Blob): void;
          readAsBinaryString(blob: Blob): void;
          readAsDataURL(blob: Blob): void;
          readAsText(blob: Blob, encoding?: string): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var FileReader: {
          prototype: FileReader;
          new(): FileReader;
      }
      
      interface FocusEvent extends UIEvent {
          relatedTarget: EventTarget;
          initFocusEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, relatedTargetArg: EventTarget): void;
      }
      
      declare var FocusEvent: {
          prototype: FocusEvent;
          new(typeArg: string, eventInitDict?: FocusEventInit): FocusEvent;
      }
      
      interface FormData {
          append(name: any, value: any, blobName?: string): void;
      }
      
      declare var FormData: {
          prototype: FormData;
          new(): FormData;
      }
      
      interface GainNode extends AudioNode {
          gain: AudioParam;
      }
      
      declare var GainNode: {
          prototype: GainNode;
          new(): GainNode;
      }
      
      interface Gamepad {
          axes: number[];
          buttons: GamepadButton[];
          connected: boolean;
          id: string;
          index: number;
          mapping: string;
          timestamp: number;
      }
      
      declare var Gamepad: {
          prototype: Gamepad;
          new(): Gamepad;
      }
      
      interface GamepadButton {
          pressed: boolean;
          value: number;
      }
      
      declare var GamepadButton: {
          prototype: GamepadButton;
          new(): GamepadButton;
      }
      
      interface GamepadEvent extends Event {
          gamepad: Gamepad;
      }
      
      declare var GamepadEvent: {
          prototype: GamepadEvent;
          new(): GamepadEvent;
      }
      
      interface Geolocation {
          clearWatch(watchId: number): void;
          getCurrentPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): void;
          watchPosition(successCallback: PositionCallback, errorCallback?: PositionErrorCallback, options?: PositionOptions): number;
      }
      
      declare var Geolocation: {
          prototype: Geolocation;
          new(): Geolocation;
      }
      
      interface HTMLAllCollection extends HTMLCollection {
          namedItem(name: string): Element;
      }
      
      declare var HTMLAllCollection: {
          prototype: HTMLAllCollection;
          new(): HTMLAllCollection;
      }
      
      interface HTMLAnchorElement extends HTMLElement {
          Methods: string;
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          /**
            * Sets or retrieves the coordinates of the object.
            */
          coords: string;
          /**
            * Contains the anchor portion of the URL including the hash sign (#).
            */
          hash: string;
          /**
            * Contains the hostname and port values of the URL.
            */
          host: string;
          /**
            * Contains the hostname of a URL.
            */
          hostname: string;
          /**
            * Sets or retrieves a destination URL or an anchor point.
            */
          href: string;
          /**
            * Sets or retrieves the language code of the object.
            */
          hreflang: string;
          mimeType: string;
          /**
            * Sets or retrieves the shape of the object.
            */
          name: string;
          nameProp: string;
          /**
            * Contains the pathname of the URL.
            */
          pathname: string;
          /**
            * Sets or retrieves the port number associated with a URL.
            */
          port: string;
          /**
            * Contains the protocol of the URL.
            */
          protocol: string;
          protocolLong: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rel: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rev: string;
          /**
            * Sets or retrieves the substring of the href property that follows the question mark.
            */
          search: string;
          /**
            * Sets or retrieves the shape of the object.
            */
          shape: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /**
            * Retrieves or sets the text of the object as a string. 
            */
          text: string;
          type: string;
          urn: string;
          /** 
            * Returns a string representation of an object.
            */
          toString(): string;
      }
      
      declare var HTMLAnchorElement: {
          prototype: HTMLAnchorElement;
          new(): HTMLAnchorElement;
      }
      
      interface HTMLAppletElement extends HTMLElement {
          /**
            * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.
            */
          BaseHref: string;
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Gets or sets the optional alternative HTML script to execute if the object fails to load.
            */
          altHtml: string;
          /**
            * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
            */
          archive: string;
          border: string;
          code: string;
          /**
            * Sets or retrieves the URL of the component.
            */
          codeBase: string;
          /**
            * Sets or retrieves the Internet media type for the code associated with the object.
            */
          codeType: string;
          /**
            * Address of a pointer to the document this page or frame contains. If there is no document, then null will be returned.
            */
          contentDocument: Document;
          /**
            * Sets or retrieves the URL that references the data of the object.
            */
          data: string;
          /**
            * Sets or retrieves a character string that can be used to implement your own declare functionality for the object.
            */
          declare: boolean;
          form: HTMLFormElement;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          hspace: number;
          /**
            * Sets or retrieves the shape of the object.
            */
          name: string;
          object: string;
          /**
            * Sets or retrieves a message to be displayed while an object is loading.
            */
          standby: string;
          /**
            * Returns the content type of the object.
            */
          type: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          vspace: number;
          width: number;
      }
      
      declare var HTMLAppletElement: {
          prototype: HTMLAppletElement;
          new(): HTMLAppletElement;
      }
      
      interface HTMLAreaElement extends HTMLElement {
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Sets or retrieves the coordinates of the object.
            */
          coords: string;
          /**
            * Sets or retrieves the subsection of the href property that follows the number sign (#).
            */
          hash: string;
          /**
            * Sets or retrieves the hostname and port number of the location or URL.
            */
          host: string;
          /**
            * Sets or retrieves the host name part of the location or URL. 
            */
          hostname: string;
          /**
            * Sets or retrieves a destination URL or an anchor point.
            */
          href: string;
          /**
            * Sets or gets whether clicks in this region cause action.
            */
          noHref: boolean;
          /**
            * Sets or retrieves the file name or path specified by the object.
            */
          pathname: string;
          /**
            * Sets or retrieves the port number associated with a URL.
            */
          port: string;
          /**
            * Sets or retrieves the protocol portion of a URL.
            */
          protocol: string;
          rel: string;
          /**
            * Sets or retrieves the substring of the href property that follows the question mark.
            */
          search: string;
          /**
            * Sets or retrieves the shape of the object.
            */
          shape: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /** 
            * Returns a string representation of an object.
            */
          toString(): string;
      }
      
      declare var HTMLAreaElement: {
          prototype: HTMLAreaElement;
          new(): HTMLAreaElement;
      }
      
      interface HTMLAreasCollection extends HTMLCollection {
          /**
            * Adds an element to the areas, controlRange, or options collection.
            */
          add(element: HTMLElement, before?: HTMLElement): void;
          add(element: HTMLElement, before?: number): void;
          /**
            * Removes an element from the collection.
            */
          remove(index?: number): void;
      }
      
      declare var HTMLAreasCollection: {
          prototype: HTMLAreasCollection;
          new(): HTMLAreasCollection;
      }
      
      interface HTMLAudioElement extends HTMLMediaElement {
      }
      
      declare var HTMLAudioElement: {
          prototype: HTMLAudioElement;
          new(): HTMLAudioElement;
      }
      
      interface HTMLBRElement extends HTMLElement {
          /**
            * Sets or retrieves the side on which floating objects are not to be positioned when any IHTMLBlockElement is inserted into the document.
            */
          clear: string;
      }
      
      declare var HTMLBRElement: {
          prototype: HTMLBRElement;
          new(): HTMLBRElement;
      }
      
      interface HTMLBaseElement extends HTMLElement {
          /**
            * Gets or sets the baseline URL on which relative links are based.
            */
          href: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
      }
      
      declare var HTMLBaseElement: {
          prototype: HTMLBaseElement;
          new(): HTMLBaseElement;
      }
      
      interface HTMLBaseFontElement extends HTMLElement, DOML2DeprecatedColorProperty {
          /**
            * Sets or retrieves the current typeface family.
            */
          face: string;
          /**
            * Sets or retrieves the font size of the object.
            */
          size: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLBaseFontElement: {
          prototype: HTMLBaseFontElement;
          new(): HTMLBaseFontElement;
      }
      
      interface HTMLBlockElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          clear: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: number;
      }
      
      declare var HTMLBlockElement: {
          prototype: HTMLBlockElement;
          new(): HTMLBlockElement;
      }
      
      interface HTMLBodyElement extends HTMLElement {
          aLink: any;
          background: string;
          bgColor: any;
          bgProperties: string;
          link: any;
          noWrap: boolean;
          onafterprint: (ev: Event) => any;
          onbeforeprint: (ev: Event) => any;
          onbeforeunload: (ev: BeforeUnloadEvent) => any;
          onblur: (ev: FocusEvent) => any;
          onerror: (ev: Event) => any;
          onfocus: (ev: FocusEvent) => any;
          onhashchange: (ev: HashChangeEvent) => any;
          onload: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onoffline: (ev: Event) => any;
          ononline: (ev: Event) => any;
          onorientationchange: (ev: Event) => any;
          onpagehide: (ev: PageTransitionEvent) => any;
          onpageshow: (ev: PageTransitionEvent) => any;
          onpopstate: (ev: PopStateEvent) => any;
          onresize: (ev: UIEvent) => any;
          onstorage: (ev: StorageEvent) => any;
          onunload: (ev: Event) => any;
          text: any;
          vLink: any;
          createTextRange(): TextRange;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLBodyElement: {
          prototype: HTMLBodyElement;
          new(): HTMLBodyElement;
      }
      
      interface HTMLButtonElement extends HTMLElement {
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Overrides the action attribute (where the data on a form is sent) on the parent form element.
            */
          formAction: string;
          /**
            * Used to override the encoding (formEnctype attribute) specified on the form element.
            */
          formEnctype: string;
          /**
            * Overrides the submit method attribute previously specified on a form element.
            */
          formMethod: string;
          /**
            * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.
            */
          formNoValidate: string;
          /**
            * Overrides the target attribute on a form element.
            */
          formTarget: string;
          /** 
            * Sets or retrieves the name of the object.
            */
          name: string;
          status: any;
          /**
            * Gets the classification and default behavior of the button.
            */
          type: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /** 
            * Sets or retrieves the default or selected value of the control.
            */
          value: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Creates a TextRange object for the element.
            */
          createTextRange(): TextRange;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
      }
      
      declare var HTMLButtonElement: {
          prototype: HTMLButtonElement;
          new(): HTMLButtonElement;
      }
      
      interface HTMLCanvasElement extends HTMLElement {
          /**
            * Gets or sets the height of a canvas element on a document.
            */
          height: number;
          /**
            * Gets or sets the width of a canvas element on a document.
            */
          width: number;
          /**
            * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.
            * @param contextId The identifier (ID) of the type of canvas to create. Internet Explorer 9 and Internet Explorer 10 support only a 2-D context using canvas.getContext("2d"); IE11 Preview also supports 3-D or WebGL context using canvas.getContext("experimental-webgl");
            */
          getContext(contextId: "2d"): CanvasRenderingContext2D;
          getContext(contextId: "experimental-webgl"): WebGLRenderingContext;
          getContext(contextId: string, ...args: any[]): CanvasRenderingContext2D | WebGLRenderingContext;
          /**
            * Returns a blob object encoded as a Portable Network Graphics (PNG) format from a canvas image or drawing.
            */
          msToBlob(): Blob;
          /**
            * Returns the content of the current canvas as an image that you can use as a source for another canvas or an HTML element.
            * @param type The standard MIME type for the image format to return. If you do not specify this parameter, the default value is a PNG format image.
            */
          toDataURL(type?: string, ...args: any[]): string;
      }
      
      declare var HTMLCanvasElement: {
          prototype: HTMLCanvasElement;
          new(): HTMLCanvasElement;
      }
      
      interface HTMLCollection {
          /**
            * Sets or retrieves the number of objects in a collection.
            */
          length: number;
          /**
            * Retrieves an object from various collections.
            */
          item(nameOrIndex?: any, optionalIndex?: any): Element;
          /**
            * Retrieves a select object or an object from an options collection.
            */
          namedItem(name: string): Element;
          [index: number]: Element;
      }
      
      declare var HTMLCollection: {
          prototype: HTMLCollection;
          new(): HTMLCollection;
      }
      
      interface HTMLDDElement extends HTMLElement {
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
      }
      
      declare var HTMLDDElement: {
          prototype: HTMLDDElement;
          new(): HTMLDDElement;
      }
      
      interface HTMLDListElement extends HTMLElement {
          compact: boolean;
      }
      
      declare var HTMLDListElement: {
          prototype: HTMLDListElement;
          new(): HTMLDListElement;
      }
      
      interface HTMLDTElement extends HTMLElement {
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
      }
      
      declare var HTMLDTElement: {
          prototype: HTMLDTElement;
          new(): HTMLDTElement;
      }
      
      interface HTMLDataListElement extends HTMLElement {
          options: HTMLCollection;
      }
      
      declare var HTMLDataListElement: {
          prototype: HTMLDataListElement;
          new(): HTMLDataListElement;
      }
      
      interface HTMLDirectoryElement extends HTMLElement {
          compact: boolean;
      }
      
      declare var HTMLDirectoryElement: {
          prototype: HTMLDirectoryElement;
          new(): HTMLDirectoryElement;
      }
      
      interface HTMLDivElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text. 
            */
          align: string;
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
      }
      
      declare var HTMLDivElement: {
          prototype: HTMLDivElement;
          new(): HTMLDivElement;
      }
      
      interface HTMLDocument extends Document {
      }
      
      declare var HTMLDocument: {
          prototype: HTMLDocument;
          new(): HTMLDocument;
      }
      
      interface HTMLElement extends Element {
          accessKey: string;
          children: HTMLCollection;
          className: string;
          contentEditable: string;
          dataset: DOMStringMap;
          dir: string;
          draggable: boolean;
          hidden: boolean;
          hideFocus: boolean;
          id: string;
          innerHTML: string;
          innerText: string;
          isContentEditable: boolean;
          lang: string;
          offsetHeight: number;
          offsetLeft: number;
          offsetParent: Element;
          offsetTop: number;
          offsetWidth: number;
          onabort: (ev: Event) => any;
          onactivate: (ev: UIEvent) => any;
          onbeforeactivate: (ev: UIEvent) => any;
          onbeforecopy: (ev: DragEvent) => any;
          onbeforecut: (ev: DragEvent) => any;
          onbeforedeactivate: (ev: UIEvent) => any;
          onbeforepaste: (ev: DragEvent) => any;
          onblur: (ev: FocusEvent) => any;
          oncanplay: (ev: Event) => any;
          oncanplaythrough: (ev: Event) => any;
          onchange: (ev: Event) => any;
          onclick: (ev: MouseEvent) => any;
          oncontextmenu: (ev: PointerEvent) => any;
          oncopy: (ev: DragEvent) => any;
          oncuechange: (ev: Event) => any;
          oncut: (ev: DragEvent) => any;
          ondblclick: (ev: MouseEvent) => any;
          ondeactivate: (ev: UIEvent) => any;
          ondrag: (ev: DragEvent) => any;
          ondragend: (ev: DragEvent) => any;
          ondragenter: (ev: DragEvent) => any;
          ondragleave: (ev: DragEvent) => any;
          ondragover: (ev: DragEvent) => any;
          ondragstart: (ev: DragEvent) => any;
          ondrop: (ev: DragEvent) => any;
          ondurationchange: (ev: Event) => any;
          onemptied: (ev: Event) => any;
          onended: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onfocus: (ev: FocusEvent) => any;
          oninput: (ev: Event) => any;
          onkeydown: (ev: KeyboardEvent) => any;
          onkeypress: (ev: KeyboardEvent) => any;
          onkeyup: (ev: KeyboardEvent) => any;
          onload: (ev: Event) => any;
          onloadeddata: (ev: Event) => any;
          onloadedmetadata: (ev: Event) => any;
          onloadstart: (ev: Event) => any;
          onmousedown: (ev: MouseEvent) => any;
          onmouseenter: (ev: MouseEvent) => any;
          onmouseleave: (ev: MouseEvent) => any;
          onmousemove: (ev: MouseEvent) => any;
          onmouseout: (ev: MouseEvent) => any;
          onmouseover: (ev: MouseEvent) => any;
          onmouseup: (ev: MouseEvent) => any;
          onmousewheel: (ev: MouseWheelEvent) => any;
          onmscontentzoom: (ev: UIEvent) => any;
          onmsmanipulationstatechanged: (ev: MSManipulationEvent) => any;
          onpaste: (ev: DragEvent) => any;
          onpause: (ev: Event) => any;
          onplay: (ev: Event) => any;
          onplaying: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          onratechange: (ev: Event) => any;
          onreset: (ev: Event) => any;
          onscroll: (ev: UIEvent) => any;
          onseeked: (ev: Event) => any;
          onseeking: (ev: Event) => any;
          onselect: (ev: UIEvent) => any;
          onselectstart: (ev: Event) => any;
          onstalled: (ev: Event) => any;
          onsubmit: (ev: Event) => any;
          onsuspend: (ev: Event) => any;
          ontimeupdate: (ev: Event) => any;
          onvolumechange: (ev: Event) => any;
          onwaiting: (ev: Event) => any;
          outerHTML: string;
          outerText: string;
          spellcheck: boolean;
          style: CSSStyleDeclaration;
          tabIndex: number;
          title: string;
          blur(): void;
          click(): void;
          contains(child: HTMLElement): boolean;
          dragDrop(): boolean;
          focus(): void;
          getElementsByClassName(classNames: string): NodeList;
          insertAdjacentElement(position: string, insertedElement: Element): Element;
          insertAdjacentHTML(where: string, html: string): void;
          insertAdjacentText(where: string, text: string): void;
          msGetInputContext(): MSInputMethodContext;
          scrollIntoView(top?: boolean): void;
          setActive(): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLElement: {
          prototype: HTMLElement;
          new(): HTMLElement;
      }
      
      interface HTMLEmbedElement extends HTMLElement, GetSVGDocument {
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          hidden: any;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          /**
            * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
            */
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Retrieves the palette used for the embedded document.
            */
          palette: string;
          /**
            * Retrieves the URL of the plug-in used to view an embedded document.
            */
          pluginspage: string;
          readyState: string;
          /**
            * Sets or retrieves a URL to be loaded by the object.
            */
          src: string;
          /**
            * Sets or retrieves the height and width units of the embed object.
            */
          units: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLEmbedElement: {
          prototype: HTMLEmbedElement;
          new(): HTMLEmbedElement;
      }
      
      interface HTMLFieldSetElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
      }
      
      declare var HTMLFieldSetElement: {
          prototype: HTMLFieldSetElement;
          new(): HTMLFieldSetElement;
      }
      
      interface HTMLFontElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {
          /**
            * Sets or retrieves the current typeface family.
            */
          face: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLFontElement: {
          prototype: HTMLFontElement;
          new(): HTMLFontElement;
      }
      
      interface HTMLFormElement extends HTMLElement {
          /**
            * Sets or retrieves a list of character encodings for input data that must be accepted by the server processing the form.
            */
          acceptCharset: string;
          /**
            * Sets or retrieves the URL to which the form content is sent for processing.
            */
          action: string;
          /**
            * Specifies whether autocomplete is applied to an editable text field.
            */
          autocomplete: string;
          /**
            * Retrieves a collection, in source order, of all controls in a given form.
            */
          elements: HTMLCollection;
          /**
            * Sets or retrieves the MIME encoding for the form.
            */
          encoding: string;
          /**
            * Sets or retrieves the encoding type for the form.
            */
          enctype: string;
          /**
            * Sets or retrieves the number of objects in a collection.
            */
          length: number;
          /**
            * Sets or retrieves how to send the form data to the server.
            */
          method: string;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Designates a form that is not validated when submitted.
            */
          noValidate: boolean;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Retrieves a form object or an object from an elements collection.
            * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is a Number, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
            * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
            */
          item(name?: any, index?: any): any;
          /**
            * Retrieves a form object or an object from an elements collection.
            */
          namedItem(name: string): any;
          /**
            * Fires when the user resets a form.
            */
          reset(): void;
          /**
            * Fires when a FORM is about to be submitted.
            */
          submit(): void;
          [name: string]: any;
      }
      
      declare var HTMLFormElement: {
          prototype: HTMLFormElement;
          new(): HTMLFormElement;
      }
      
      interface HTMLFrameElement extends HTMLElement, GetSVGDocument {
          /**
            * Specifies the properties of a border drawn around an object.
            */
          border: string;
          /**
            * Sets or retrieves the border color of the object.
            */
          borderColor: any;
          /**
            * Retrieves the document object of the page or frame.
            */
          contentDocument: Document;
          /**
            * Retrieves the object of the specified.
            */
          contentWindow: Window;
          /**
            * Sets or retrieves whether to display a border for the frame.
            */
          frameBorder: string;
          /**
            * Sets or retrieves the amount of additional space between the frames.
            */
          frameSpacing: any;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string | number;
          /**
            * Sets or retrieves a URI to a long description of the object.
            */
          longDesc: string;
          /**
            * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
            */
          marginHeight: string;
          /**
            * Sets or retrieves the left and right margin widths before displaying the text in a frame.
            */
          marginWidth: string;
          /**
            * Sets or retrieves the frame name.
            */
          name: string;
          /**
            * Sets or retrieves whether the user can resize the frame.
            */
          noResize: boolean;
          /**
            * Raised when the object has been completely received from the server.
            */
          onload: (ev: Event) => any;
          /**
            * Sets or retrieves whether the frame can be scrolled.
            */
          scrolling: string;
          /**
            * Sets the value indicating whether the source file of a frame or iframe has specific security restrictions applied.
            */
          security: any;
          /**
            * Sets or retrieves a URL to be loaded by the object.
            */
          src: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string | number;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLFrameElement: {
          prototype: HTMLFrameElement;
          new(): HTMLFrameElement;
      }
      
      interface HTMLFrameSetElement extends HTMLElement {
          border: string;
          /**
            * Sets or retrieves the border color of the object.
            */
          borderColor: any;
          /**
            * Sets or retrieves the frame widths of the object.
            */
          cols: string;
          /**
            * Sets or retrieves whether to display a border for the frame.
            */
          frameBorder: string;
          /**
            * Sets or retrieves the amount of additional space between the frames.
            */
          frameSpacing: any;
          name: string;
          onafterprint: (ev: Event) => any;
          onbeforeprint: (ev: Event) => any;
          onbeforeunload: (ev: BeforeUnloadEvent) => any;
          /**
            * Fires when the object loses the input focus.
            */
          onblur: (ev: FocusEvent) => any;
          onerror: (ev: Event) => any;
          /**
            * Fires when the object receives focus.
            */
          onfocus: (ev: FocusEvent) => any;
          onhashchange: (ev: HashChangeEvent) => any;
          onload: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onoffline: (ev: Event) => any;
          ononline: (ev: Event) => any;
          onorientationchange: (ev: Event) => any;
          onpagehide: (ev: PageTransitionEvent) => any;
          onpageshow: (ev: PageTransitionEvent) => any;
          onresize: (ev: UIEvent) => any;
          onstorage: (ev: StorageEvent) => any;
          onunload: (ev: Event) => any;
          /**
            * Sets or retrieves the frame heights of the object.
            */
          rows: string;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLFrameSetElement: {
          prototype: HTMLFrameSetElement;
          new(): HTMLFrameSetElement;
      }
      
      interface HTMLHRElement extends HTMLElement, DOML2DeprecatedColorProperty, DOML2DeprecatedSizeProperty {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves whether the horizontal rule is drawn with 3-D shading.
            */
          noShade: boolean;
          /**
            * Sets or retrieves the width of the object.
            */
          width: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLHRElement: {
          prototype: HTMLHRElement;
          new(): HTMLHRElement;
      }
      
      interface HTMLHeadElement extends HTMLElement {
          profile: string;
      }
      
      declare var HTMLHeadElement: {
          prototype: HTMLHeadElement;
          new(): HTMLHeadElement;
      }
      
      interface HTMLHeadingElement extends HTMLElement {
          /**
            * Sets or retrieves a value that indicates the table alignment.
            */
          align: string;
          clear: string;
      }
      
      declare var HTMLHeadingElement: {
          prototype: HTMLHeadingElement;
          new(): HTMLHeadingElement;
      }
      
      interface HTMLHtmlElement extends HTMLElement {
          /**
            * Sets or retrieves the DTD version that governs the current document.
            */
          version: string;
      }
      
      declare var HTMLHtmlElement: {
          prototype: HTMLHtmlElement;
          new(): HTMLHtmlElement;
      }
      
      interface HTMLIFrameElement extends HTMLElement, GetSVGDocument {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          allowFullscreen: boolean;
          /**
            * Specifies the properties of a border drawn around an object.
            */
          border: string;
          /**
            * Retrieves the document object of the page or frame.
            */
          contentDocument: Document;
          /**
            * Retrieves the object of the specified.
            */
          contentWindow: Window;
          /**
            * Sets or retrieves whether to display a border for the frame.
            */
          frameBorder: string;
          /**
            * Sets or retrieves the amount of additional space between the frames.
            */
          frameSpacing: any;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          /**
            * Sets or retrieves the horizontal margin for the object.
            */
          hspace: number;
          /**
            * Sets or retrieves a URI to a long description of the object.
            */
          longDesc: string;
          /**
            * Sets or retrieves the top and bottom margin heights before displaying the text in a frame.
            */
          marginHeight: string;
          /**
            * Sets or retrieves the left and right margin widths before displaying the text in a frame.
            */
          marginWidth: string;
          /**
            * Sets or retrieves the frame name.
            */
          name: string;
          /**
            * Sets or retrieves whether the user can resize the frame.
            */
          noResize: boolean;
          /**
            * Raised when the object has been completely received from the server.
            */
          onload: (ev: Event) => any;
          sandbox: DOMSettableTokenList;
          /**
            * Sets or retrieves whether the frame can be scrolled.
            */
          scrolling: string;
          /**
            * Sets the value indicating whether the source file of a frame or iframe has specific security restrictions applied.
            */
          security: any;
          /**
            * Sets or retrieves a URL to be loaded by the object.
            */
          src: string;
          /**
            * Sets or retrieves the vertical margin for the object.
            */
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLIFrameElement: {
          prototype: HTMLIFrameElement;
          new(): HTMLIFrameElement;
      }
      
      interface HTMLImageElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Specifies the properties of a border drawn around an object.
            */
          border: string;
          /**
            * Retrieves whether the object is fully loaded.
            */
          complete: boolean;
          crossOrigin: string;
          currentSrc: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: number;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          hspace: number;
          /**
            * Sets or retrieves whether the image is a server-side image map.
            */
          isMap: boolean;
          /**
            * Sets or retrieves a Uniform Resource Identifier (URI) to a long description of the object.
            */
          longDesc: string;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * The original height of the image resource before sizing.
            */
          naturalHeight: number;
          /**
            * The original width of the image resource before sizing.
            */
          naturalWidth: number;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          srcset: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          /**
            * Sets or retrieves the vertical margin for the object.
            */
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: number;
          x: number;
          y: number;
          msGetAsCastingSource(): any;
      }
      
      declare var HTMLImageElement: {
          prototype: HTMLImageElement;
          new(): HTMLImageElement;
          create(): HTMLImageElement;
      }
      
      interface HTMLInputElement extends HTMLElement {
          /**
            * Sets or retrieves a comma-separated list of content types.
            */
          accept: string;
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Specifies whether autocomplete is applied to an editable text field.
            */
          autocomplete: string;
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          border: string;
          /**
            * Sets or retrieves the state of the check box or radio button.
            */
          checked: boolean;
          /**
            * Retrieves whether the object is fully loaded.
            */
          complete: boolean;
          /**
            * Sets or retrieves the state of the check box or radio button.
            */
          defaultChecked: boolean;
          /**
            * Sets or retrieves the initial contents of the object.
            */
          defaultValue: string;
          disabled: boolean;
          /**
            * Returns a FileList object on a file type input object.
            */
          files: FileList;
          /**
            * Retrieves a reference to the form that the object is embedded in. 
            */
          form: HTMLFormElement;
          /**
            * Overrides the action attribute (where the data on a form is sent) on the parent form element.
            */
          formAction: string;
          /**
            * Used to override the encoding (formEnctype attribute) specified on the form element.
            */
          formEnctype: string;
          /**
            * Overrides the submit method attribute previously specified on a form element.
            */
          formMethod: string;
          /**
            * Overrides any validation or required attributes on a form or form elements to allow it to be submitted without validation. This can be used to create a "save draft"-type submit option.
            */
          formNoValidate: string;
          /**
            * Overrides the target attribute on a form element.
            */
          formTarget: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          hspace: number;
          indeterminate: boolean;
          /**
            * Specifies the ID of a pre-defined datalist of options for an input element.
            */
          list: HTMLElement;
          /**
            * Defines the maximum acceptable value for an input element with type="number".When used with the min and step attributes, lets you control the range and increment (such as only even numbers) that the user can enter into an input field.
            */
          max: string;
          /**
            * Sets or retrieves the maximum number of characters that the user can enter in a text control.
            */
          maxLength: number;
          /**
            * Defines the minimum acceptable value for an input element with type="number". When used with the max and step attributes, lets you control the range and increment (such as even numbers only) that the user can enter into an input field.
            */
          min: string;
          /**
            * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.
            */
          multiple: boolean;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Gets or sets a string containing a regular expression that the user's input must match.
            */
          pattern: string;
          /**
            * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.
            */
          placeholder: string;
          readOnly: boolean;
          /**
            * When present, marks an element that can't be submitted without a value.
            */
          required: boolean;
          /**
            * Gets or sets the end position or offset of a text selection.
            */
          selectionEnd: number;
          /**
            * Gets or sets the starting position or offset of a text selection.
            */
          selectionStart: number;
          size: number;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          status: boolean;
          /**
            * Defines an increment or jump between values that you want to allow the user to enter. When used with the max and min attributes, lets you control the range and increment (for example, allow only even numbers) that the user can enter into an input field.
            */
          step: string;
          /**
            * Returns the content type of the object.
            */
          type: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Returns the value of the data at the cursor's current position.
            */
          value: string;
          valueAsDate: Date;
          /**
            * Returns the input field value as a number.
            */
          valueAsNumber: number;
          /**
            * Sets or retrieves the vertical margin for the object.
            */
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Creates a TextRange object for the element.
            */
          createTextRange(): TextRange;
          /**
            * Makes the selection equal to the current object.
            */
          select(): void;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          /**
            * Sets the start and end positions of a selection in a text field.
            * @param start The offset into the text field for the start of the selection.
            * @param end The offset into the text field for the end of the selection.
            */
          setSelectionRange(start: number, end: number): void;
          /**
            * Decrements a range input control's value by the value given by the Step attribute. If the optional parameter is used, it will decrement the input control's step value multiplied by the parameter's value.
            * @param n Value to decrement the value by.
            */
          stepDown(n?: number): void;
          /**
            * Increments a range input control's value by the value given by the Step attribute. If the optional parameter is used, will increment the input control's value by that value.
            * @param n Value to increment the value by.
            */
          stepUp(n?: number): void;
      }
      
      declare var HTMLInputElement: {
          prototype: HTMLInputElement;
          new(): HTMLInputElement;
      }
      
      interface HTMLIsIndexElement extends HTMLElement {
          /**
            * Sets or retrieves the URL to which the form content is sent for processing.
            */
          action: string;
          /**
            * Retrieves a reference to the form that the object is embedded in. 
            */
          form: HTMLFormElement;
          prompt: string;
      }
      
      declare var HTMLIsIndexElement: {
          prototype: HTMLIsIndexElement;
          new(): HTMLIsIndexElement;
      }
      
      interface HTMLLIElement extends HTMLElement {
          type: string;
          /**
            * Sets or retrieves the value of a list item.
            */
          value: number;
      }
      
      declare var HTMLLIElement: {
          prototype: HTMLLIElement;
          new(): HTMLLIElement;
      }
      
      interface HTMLLabelElement extends HTMLElement {
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the object to which the given label object is assigned.
            */
          htmlFor: string;
      }
      
      declare var HTMLLabelElement: {
          prototype: HTMLLabelElement;
          new(): HTMLLabelElement;
      }
      
      interface HTMLLegendElement extends HTMLElement {
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          align: string;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
      }
      
      declare var HTMLLegendElement: {
          prototype: HTMLLegendElement;
          new(): HTMLLegendElement;
      }
      
      interface HTMLLinkElement extends HTMLElement, LinkStyle {
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          disabled: boolean;
          /**
            * Sets or retrieves a destination URL or an anchor point.
            */
          href: string;
          /**
            * Sets or retrieves the language code of the object.
            */
          hreflang: string;
          /**
            * Sets or retrieves the media type.
            */
          media: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rel: string;
          /**
            * Sets or retrieves the relationship between the object and the destination of the link.
            */
          rev: string;
          /**
            * Sets or retrieves the window or frame at which to target content.
            */
          target: string;
          /**
            * Sets or retrieves the MIME type of the object.
            */
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLLinkElement: {
          prototype: HTMLLinkElement;
          new(): HTMLLinkElement;
      }
      
      interface HTMLMapElement extends HTMLElement {
          /**
            * Retrieves a collection of the area objects defined for the given map object.
            */
          areas: HTMLAreasCollection;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
      }
      
      declare var HTMLMapElement: {
          prototype: HTMLMapElement;
          new(): HTMLMapElement;
      }
      
      interface HTMLMarqueeElement extends HTMLElement {
          behavior: string;
          bgColor: any;
          direction: string;
          height: string;
          hspace: number;
          loop: number;
          onbounce: (ev: Event) => any;
          onfinish: (ev: Event) => any;
          onstart: (ev: Event) => any;
          scrollAmount: number;
          scrollDelay: number;
          trueSpeed: boolean;
          vspace: number;
          width: string;
          start(): void;
          stop(): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "bounce", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "finish", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "start", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLMarqueeElement: {
          prototype: HTMLMarqueeElement;
          new(): HTMLMarqueeElement;
      }
      
      interface HTMLMediaElement extends HTMLElement {
          /**
            * Returns an AudioTrackList object with the audio tracks for a given video element.
            */
          audioTracks: AudioTrackList;
          /**
            * Gets or sets a value that indicates whether to start playing the media automatically.
            */
          autoplay: boolean;
          /**
            * Gets a collection of buffered time ranges.
            */
          buffered: TimeRanges;
          /**
            * Gets or sets a flag that indicates whether the client provides a set of controls for the media (in case the developer does not include controls for the player).
            */
          controls: boolean;
          /**
            * Gets the address or URL of the current media resource that is selected by IHTMLMediaElement.
            */
          currentSrc: string;
          /**
            * Gets or sets the current playback position, in seconds.
            */
          currentTime: number;
          defaultMuted: boolean;
          /**
            * Gets or sets the default playback rate when the user is not using fast forward or reverse for a video or audio resource.
            */
          defaultPlaybackRate: number;
          /**
            * Returns the duration in seconds of the current media resource. A NaN value is returned if duration is not available, or Infinity if the media resource is streaming.
            */
          duration: number;
          /**
            * Gets information about whether the playback has ended or not.
            */
          ended: boolean;
          /**
            * Returns an object representing the current error state of the audio or video element.
            */
          error: MediaError;
          /**
            * Gets or sets a flag to specify whether playback should restart after it completes.
            */
          loop: boolean;
          /**
            * Specifies the purpose of the audio or video media, such as background audio or alerts.
            */
          msAudioCategory: string;
          /**
            * Specifies the output device id that the audio will be sent to.
            */
          msAudioDeviceType: string;
          msGraphicsTrustStatus: MSGraphicsTrust;
          /**
            * Gets the MSMediaKeys object, which is used for decrypting media data, that is associated with this media element.
            */
          msKeys: MSMediaKeys;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          /**
            * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
            */
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Specifies whether or not to enable low-latency playback on the media element.
            */
          msRealTime: boolean;
          /**
            * Gets or sets a flag that indicates whether the audio (either audio or the audio track on video media) is muted.
            */
          muted: boolean;
          /**
            * Gets the current network activity for the element.
            */
          networkState: number;
          onmsneedkey: (ev: MSMediaKeyNeededEvent) => any;
          /**
            * Gets a flag that specifies whether playback is paused.
            */
          paused: boolean;
          /**
            * Gets or sets the current rate of speed for the media resource to play. This speed is expressed as a multiple of the normal speed of the media resource.
            */
          playbackRate: number;
          /**
            * Gets TimeRanges for the current media resource that has been played.
            */
          played: TimeRanges;
          /**
            * Gets or sets the current playback position, in seconds.
            */
          preload: string;
          readyState: any;
          /**
            * Returns a TimeRanges object that represents the ranges of the current media resource that can be seeked.
            */
          seekable: TimeRanges;
          /**
            * Gets a flag that indicates whether the the client is currently moving to a new playback position in the media resource.
            */
          seeking: boolean;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          textTracks: TextTrackList;
          videoTracks: VideoTrackList;
          /**
            * Gets or sets the volume level for audio portions of the media element.
            */
          volume: number;
          addTextTrack(kind: string, label?: string, language?: string): TextTrack;
          /**
            * Returns a string that specifies whether the client can play a given media resource type.
            */
          canPlayType(type: string): string;
          /**
            * Fires immediately after the client loads the object.
            */
          load(): void;
          /**
            * Clears all effects from the media pipeline.
            */
          msClearEffects(): void;
          msGetAsCastingSource(): any;
          /**
            * Inserts the specified audio effect into media pipeline.
            */
          msInsertAudioEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;
          msSetMediaKeys(mediaKeys: MSMediaKeys): void;
          /**
            * Specifies the media protection manager for a given media pipeline.
            */
          msSetMediaProtectionManager(mediaProtectionManager?: any): void;
          /**
            * Pauses the current playback and sets paused to TRUE. This can be used to test whether the media is playing or paused. You can also use the pause or play events to tell whether the media is playing or not.
            */
          pause(): void;
          /**
            * Loads and starts playback of a media resource.
            */
          play(): void;
          HAVE_CURRENT_DATA: number;
          HAVE_ENOUGH_DATA: number;
          HAVE_FUTURE_DATA: number;
          HAVE_METADATA: number;
          HAVE_NOTHING: number;
          NETWORK_EMPTY: number;
          NETWORK_IDLE: number;
          NETWORK_LOADING: number;
          NETWORK_NO_SOURCE: number;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "msneedkey", listener: (ev: MSMediaKeyNeededEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLMediaElement: {
          prototype: HTMLMediaElement;
          new(): HTMLMediaElement;
          HAVE_CURRENT_DATA: number;
          HAVE_ENOUGH_DATA: number;
          HAVE_FUTURE_DATA: number;
          HAVE_METADATA: number;
          HAVE_NOTHING: number;
          NETWORK_EMPTY: number;
          NETWORK_IDLE: number;
          NETWORK_LOADING: number;
          NETWORK_NO_SOURCE: number;
      }
      
      interface HTMLMenuElement extends HTMLElement {
          compact: boolean;
          type: string;
      }
      
      declare var HTMLMenuElement: {
          prototype: HTMLMenuElement;
          new(): HTMLMenuElement;
      }
      
      interface HTMLMetaElement extends HTMLElement {
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          /**
            * Gets or sets meta-information to associate with httpEquiv or name.
            */
          content: string;
          /**
            * Gets or sets information used to bind the value of a content attribute of a meta element to an HTTP response header.
            */
          httpEquiv: string;
          /**
            * Sets or retrieves the value specified in the content attribute of the meta object.
            */
          name: string;
          /**
            * Sets or retrieves a scheme to be used in interpreting the value of a property specified for the object.
            */
          scheme: string;
          /**
            * Sets or retrieves the URL property that will be loaded after the specified time has elapsed. 
            */
          url: string;
      }
      
      declare var HTMLMetaElement: {
          prototype: HTMLMetaElement;
          new(): HTMLMetaElement;
      }
      
      interface HTMLModElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          /**
            * Sets or retrieves the date and time of a modification to the object.
            */
          dateTime: string;
      }
      
      declare var HTMLModElement: {
          prototype: HTMLModElement;
          new(): HTMLModElement;
      }
      
      interface HTMLNextIdElement extends HTMLElement {
          n: string;
      }
      
      declare var HTMLNextIdElement: {
          prototype: HTMLNextIdElement;
          new(): HTMLNextIdElement;
      }
      
      interface HTMLOListElement extends HTMLElement {
          compact: boolean;
          /**
            * The starting number.
            */
          start: number;
          type: string;
      }
      
      declare var HTMLOListElement: {
          prototype: HTMLOListElement;
          new(): HTMLOListElement;
      }
      
      interface HTMLObjectElement extends HTMLElement, GetSVGDocument {
          /**
            * Retrieves a string of the URL where the object tag can be found. This is often the href of the document that the object is in, or the value set by a base element.
            */
          BaseHref: string;
          align: string;
          /**
            * Sets or retrieves a text alternative to the graphic.
            */
          alt: string;
          /**
            * Gets or sets the optional alternative HTML script to execute if the object fails to load.
            */
          altHtml: string;
          /**
            * Sets or retrieves a character string that can be used to implement your own archive functionality for the object.
            */
          archive: string;
          border: string;
          /**
            * Sets or retrieves the URL of the file containing the compiled Java class.
            */
          code: string;
          /**
            * Sets or retrieves the URL of the component.
            */
          codeBase: string;
          /**
            * Sets or retrieves the Internet media type for the code associated with the object.
            */
          codeType: string;
          /**
            * Retrieves the document object of the page or frame.
            */
          contentDocument: Document;
          /**
            * Sets or retrieves the URL that references the data of the object.
            */
          data: string;
          declare: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the height of the object.
            */
          height: string;
          hspace: number;
          /**
            * Gets or sets whether the DLNA PlayTo device is available.
            */
          msPlayToDisabled: boolean;
          /**
            * Gets or sets the path to the preferred media source. This enables the Play To target device to stream the media content, which can be DRM protected, from a different location, such as a cloud media server.
            */
          msPlayToPreferredSourceUri: string;
          /**
            * Gets or sets the primary DLNA PlayTo device.
            */
          msPlayToPrimary: boolean;
          /**
            * Gets the source associated with the media element for use by the PlayToManager.
            */
          msPlayToSource: any;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Retrieves the contained object.
            */
          object: any;
          readyState: number;
          /**
            * Sets or retrieves a message to be displayed while an object is loading.
            */
          standby: string;
          /**
            * Sets or retrieves the MIME type of the object.
            */
          type: string;
          /**
            * Sets or retrieves the URL, often with a bookmark extension (#name), to use as a client-side image map.
            */
          useMap: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          vspace: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLObjectElement: {
          prototype: HTMLObjectElement;
          new(): HTMLObjectElement;
      }
      
      interface HTMLOptGroupElement extends HTMLElement {
          /**
            * Sets or retrieves the status of an option.
            */
          defaultSelected: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the ordinal position of an option in a list box.
            */
          index: number;
          /**
            * Sets or retrieves a value that you can use to implement your own label functionality for the object.
            */
          label: string;
          /**
            * Sets or retrieves whether the option in the list box is the default item.
            */
          selected: boolean;
          /**
            * Sets or retrieves the text string specified by the option tag.
            */
          text: string;
          /**
            * Sets or retrieves the value which is returned to the server when the form control is submitted.
            */
          value: string;
      }
      
      declare var HTMLOptGroupElement: {
          prototype: HTMLOptGroupElement;
          new(): HTMLOptGroupElement;
      }
      
      interface HTMLOptionElement extends HTMLElement {
          /**
            * Sets or retrieves the status of an option.
            */
          defaultSelected: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the ordinal position of an option in a list box.
            */
          index: number;
          /**
            * Sets or retrieves a value that you can use to implement your own label functionality for the object.
            */
          label: string;
          /**
            * Sets or retrieves whether the option in the list box is the default item.
            */
          selected: boolean;
          /**
            * Sets or retrieves the text string specified by the option tag.
            */
          text: string;
          /**
            * Sets or retrieves the value which is returned to the server when the form control is submitted.
            */
          value: string;
      }
      
      declare var HTMLOptionElement: {
          prototype: HTMLOptionElement;
          new(): HTMLOptionElement;
          create(): HTMLOptionElement;
      }
      
      interface HTMLParagraphElement extends HTMLElement {
          /**
            * Sets or retrieves how the object is aligned with adjacent text. 
            */
          align: string;
          clear: string;
      }
      
      declare var HTMLParagraphElement: {
          prototype: HTMLParagraphElement;
          new(): HTMLParagraphElement;
      }
      
      interface HTMLParamElement extends HTMLElement {
          /**
            * Sets or retrieves the name of an input parameter for an element.
            */
          name: string;
          /**
            * Sets or retrieves the content type of the resource designated by the value attribute.
            */
          type: string;
          /**
            * Sets or retrieves the value of an input parameter for an element.
            */
          value: string;
          /**
            * Sets or retrieves the data type of the value attribute.
            */
          valueType: string;
      }
      
      declare var HTMLParamElement: {
          prototype: HTMLParamElement;
          new(): HTMLParamElement;
      }
      
      interface HTMLPhraseElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          /**
            * Sets or retrieves the date and time of a modification to the object.
            */
          dateTime: string;
      }
      
      declare var HTMLPhraseElement: {
          prototype: HTMLPhraseElement;
          new(): HTMLPhraseElement;
      }
      
      interface HTMLPreElement extends HTMLElement {
          /**
            * Indicates a citation by rendering text in italic type.
            */
          cite: string;
          clear: string;
          /**
            * Sets or gets a value that you can use to implement your own width functionality for the object.
            */
          width: number;
      }
      
      declare var HTMLPreElement: {
          prototype: HTMLPreElement;
          new(): HTMLPreElement;
      }
      
      interface HTMLProgressElement extends HTMLElement {
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Defines the maximum, or "done" value for a progress element.
            */
          max: number;
          /**
            * Returns the quotient of value/max when the value attribute is set (determinate progress bar), or -1 when the value attribute is missing (indeterminate progress bar).
            */
          position: number;
          /**
            * Sets or gets the current value of a progress element. The value must be a non-negative number between 0 and the max value.
            */
          value: number;
      }
      
      declare var HTMLProgressElement: {
          prototype: HTMLProgressElement;
          new(): HTMLProgressElement;
      }
      
      interface HTMLQuoteElement extends HTMLElement {
          /**
            * Sets or retrieves reference information about the object.
            */
          cite: string;
          /**
            * Sets or retrieves the date and time of a modification to the object.
            */
          dateTime: string;
      }
      
      declare var HTMLQuoteElement: {
          prototype: HTMLQuoteElement;
          new(): HTMLQuoteElement;
      }
      
      interface HTMLScriptElement extends HTMLElement {
          async: boolean;
          /**
            * Sets or retrieves the character set used to encode the object.
            */
          charset: string;
          /**
            * Sets or retrieves the status of the script.
            */
          defer: boolean;
          /**
            * Sets or retrieves the event for which the script is written. 
            */
          event: string;
          /** 
            * Sets or retrieves the object that is bound to the event script.
            */
          htmlFor: string;
          /**
            * Retrieves the URL to an external file that contains the source code or data.
            */
          src: string;
          /**
            * Retrieves or sets the text of the object as a string. 
            */
          text: string;
          /**
            * Sets or retrieves the MIME type for the associated scripting engine.
            */
          type: string;
      }
      
      declare var HTMLScriptElement: {
          prototype: HTMLScriptElement;
          new(): HTMLScriptElement;
      }
      
      interface HTMLSelectElement extends HTMLElement {
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in. 
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the number of objects in a collection.
            */
          length: number;
          /**
            * Sets or retrieves the Boolean value indicating whether multiple items can be selected from a list.
            */
          multiple: boolean;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          options: HTMLSelectElement;
          /**
            * When present, marks an element that can't be submitted without a value.
            */
          required: boolean;
          /**
            * Sets or retrieves the index of the selected option in a select object.
            */
          selectedIndex: number;
          /**
            * Sets or retrieves the number of rows in the list box. 
            */
          size: number;
          /**
            * Retrieves the type of select control based on the value of the MULTIPLE attribute.
            */
          type: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Sets or retrieves the value which is returned to the server when the form control is submitted.
            */
          value: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Adds an element to the areas, controlRange, or options collection.
            * @param element Variant of type Number that specifies the index position in the collection where the element is placed. If no value is given, the method places the element at the end of the collection.
            * @param before Variant of type Object that specifies an element to insert before, or null to append the object to the collection. 
            */
          add(element: HTMLElement, before?: HTMLElement): void;
          add(element: HTMLElement, before?: number): void;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Retrieves a select object or an object from an options collection.
            * @param name Variant of type Number or String that specifies the object or collection to retrieve. If this parameter is an integer, it is the zero-based index of the object. If this parameter is a string, all objects with matching name or id properties are retrieved, and a collection is returned if more than one match is made.
            * @param index Variant of type Number that specifies the zero-based index of the object to retrieve when a collection is returned.
            */
          item(name?: any, index?: any): any;
          /**
            * Retrieves a select object or an object from an options collection.
            * @param namedItem A String that specifies the name or id property of the object to retrieve. A collection is returned if more than one match is made.
            */
          namedItem(name: string): any;
          /**
            * Removes an element from the collection.
            * @param index Number that specifies the zero-based index of the element to remove from the collection.
            */
          remove(index?: number): void;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          [name: string]: any;
      }
      
      declare var HTMLSelectElement: {
          prototype: HTMLSelectElement;
          new(): HTMLSelectElement;
      }
      
      interface HTMLSourceElement extends HTMLElement {
          /**
            * Gets or sets the intended media type of the media source.
           */
          media: string;
          msKeySystem: string;
          /**
            * The address or URL of the a media resource that is to be considered.
            */
          src: string;
          /**
           * Gets or sets the MIME type of a media resource.
           */
          type: string;
      }
      
      declare var HTMLSourceElement: {
          prototype: HTMLSourceElement;
          new(): HTMLSourceElement;
      }
      
      interface HTMLSpanElement extends HTMLElement {
      }
      
      declare var HTMLSpanElement: {
          prototype: HTMLSpanElement;
          new(): HTMLSpanElement;
      }
      
      interface HTMLStyleElement extends HTMLElement, LinkStyle {
          /**
            * Sets or retrieves the media type.
            */
          media: string;
          /**
            * Retrieves the CSS language in which the style sheet is written.
            */
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLStyleElement: {
          prototype: HTMLStyleElement;
          new(): HTMLStyleElement;
      }
      
      interface HTMLTableCaptionElement extends HTMLElement {
          /**
            * Sets or retrieves the alignment of the caption or legend.
            */
          align: string;
          /**
            * Sets or retrieves whether the caption appears at the top or bottom of the table.
            */
          vAlign: string;
      }
      
      declare var HTMLTableCaptionElement: {
          prototype: HTMLTableCaptionElement;
          new(): HTMLTableCaptionElement;
      }
      
      interface HTMLTableCellElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves abbreviated text for the object.
            */
          abbr: string;
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          /**
            * Sets or retrieves a comma-delimited list of conceptual categories associated with the object.
            */
          axis: string;
          bgColor: any;
          /**
            * Retrieves the position of the object in the cells collection of a row.
            */
          cellIndex: number;
          /**
            * Sets or retrieves the number columns in the table that the object should span.
            */
          colSpan: number;
          /**
            * Sets or retrieves a list of header cells that provide information for the object.
            */
          headers: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: any;
          /**
            * Sets or retrieves whether the browser automatically performs wordwrap.
            */
          noWrap: boolean;
          /**
            * Sets or retrieves how many rows in a table the cell should span.
            */
          rowSpan: number;
          /**
            * Sets or retrieves the group of cells in a table to which the object's information applies.
            */
          scope: string;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableCellElement: {
          prototype: HTMLTableCellElement;
          new(): HTMLTableCellElement;
      }
      
      interface HTMLTableColElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves the alignment of the object relative to the display or table.
            */
          align: string;
          /**
            * Sets or retrieves the number of columns in the group.
            */
          span: number;
          /**
            * Sets or retrieves the width of the object.
            */
          width: any;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableColElement: {
          prototype: HTMLTableColElement;
          new(): HTMLTableColElement;
      }
      
      interface HTMLTableDataCellElement extends HTMLTableCellElement {
      }
      
      declare var HTMLTableDataCellElement: {
          prototype: HTMLTableDataCellElement;
          new(): HTMLTableDataCellElement;
      }
      
      interface HTMLTableElement extends HTMLElement {
          /**
            * Sets or retrieves a value that indicates the table alignment.
            */
          align: string;
          bgColor: any;
          /**
            * Sets or retrieves the width of the border to draw around the object.
            */
          border: string;
          /**
            * Sets or retrieves the border color of the object. 
            */
          borderColor: any;
          /**
            * Retrieves the caption object of a table.
            */
          caption: HTMLTableCaptionElement;
          /**
            * Sets or retrieves the amount of space between the border of the cell and the content of the cell.
            */
          cellPadding: string;
          /**
            * Sets or retrieves the amount of space between cells in a table.
            */
          cellSpacing: string;
          /**
            * Sets or retrieves the number of columns in the table.
            */
          cols: number;
          /**
            * Sets or retrieves the way the border frame around the table is displayed.
            */
          frame: string;
          /**
            * Sets or retrieves the height of the object.
            */
          height: any;
          /**
            * Sets or retrieves the number of horizontal rows contained in the object.
            */
          rows: HTMLCollection;
          /**
            * Sets or retrieves which dividing lines (inner borders) are displayed.
            */
          rules: string;
          /**
            * Sets or retrieves a description and/or structure of the object.
            */
          summary: string;
          /**
            * Retrieves a collection of all tBody objects in the table. Objects in this collection are in source order.
            */
          tBodies: HTMLCollection;
          /**
            * Retrieves the tFoot object of the table.
            */
          tFoot: HTMLTableSectionElement;
          /**
            * Retrieves the tHead object of the table.
            */
          tHead: HTMLTableSectionElement;
          /**
            * Sets or retrieves the width of the object.
            */
          width: string;
          /**
            * Creates an empty caption element in the table.
            */
          createCaption(): HTMLElement;
          /**
            * Creates an empty tBody element in the table.
            */
          createTBody(): HTMLElement;
          /**
            * Creates an empty tFoot element in the table.
            */
          createTFoot(): HTMLElement;
          /**
            * Returns the tHead element object if successful, or null otherwise.
            */
          createTHead(): HTMLElement;
          /**
            * Deletes the caption element and its contents from the table.
            */
          deleteCaption(): void;
          /**
            * Removes the specified row (tr) from the element and from the rows collection.
            * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
            */
          deleteRow(index?: number): void;
          /**
            * Deletes the tFoot element and its contents from the table.
            */
          deleteTFoot(): void;
          /**
            * Deletes the tHead element and its contents from the table.
            */
          deleteTHead(): void;
          /**
            * Creates a new row (tr) in the table, and adds the row to the rows collection.
            * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
            */
          insertRow(index?: number): HTMLElement;
      }
      
      declare var HTMLTableElement: {
          prototype: HTMLTableElement;
          new(): HTMLTableElement;
      }
      
      interface HTMLTableHeaderCellElement extends HTMLTableCellElement {
          /**
            * Sets or retrieves the group of cells in a table to which the object's information applies.
            */
          scope: string;
      }
      
      declare var HTMLTableHeaderCellElement: {
          prototype: HTMLTableHeaderCellElement;
          new(): HTMLTableHeaderCellElement;
      }
      
      interface HTMLTableRowElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves how the object is aligned with adjacent text.
            */
          align: string;
          bgColor: any;
          /**
            * Retrieves a collection of all cells in the table row.
            */
          cells: HTMLCollection;
          /**
            * Sets or retrieves the height of the object.
            */
          height: any;
          /**
            * Retrieves the position of the object in the rows collection for the table.
            */
          rowIndex: number;
          /**
            * Retrieves the position of the object in the collection.
            */
          sectionRowIndex: number;
          /**
            * Removes the specified cell from the table row, as well as from the cells collection.
            * @param index Number that specifies the zero-based position of the cell to remove from the table row. If no value is provided, the last cell in the cells collection is deleted.
            */
          deleteCell(index?: number): void;
          /**
            * Creates a new cell in the table row, and adds the cell to the cells collection.
            * @param index Number that specifies where to insert the cell in the tr. The default value is -1, which appends the new cell to the end of the cells collection.
            */
          insertCell(index?: number): HTMLElement;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableRowElement: {
          prototype: HTMLTableRowElement;
          new(): HTMLTableRowElement;
      }
      
      interface HTMLTableSectionElement extends HTMLElement, HTMLTableAlignment {
          /**
            * Sets or retrieves a value that indicates the table alignment.
            */
          align: string;
          /**
            * Sets or retrieves the number of horizontal rows contained in the object.
            */
          rows: HTMLCollection;
          /**
            * Removes the specified row (tr) from the element and from the rows collection.
            * @param index Number that specifies the zero-based position in the rows collection of the row to remove.
            */
          deleteRow(index?: number): void;
          /**
            * Creates a new row (tr) in the table, and adds the row to the rows collection.
            * @param index Number that specifies where to insert the row in the rows collection. The default value is -1, which appends the new row to the end of the rows collection.
            */
          insertRow(index?: number): HTMLElement;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLTableSectionElement: {
          prototype: HTMLTableSectionElement;
          new(): HTMLTableSectionElement;
      }
      
      interface HTMLTextAreaElement extends HTMLElement {
          /**
            * Provides a way to direct a user to a specific field when a document loads. This can provide both direction and convenience for a user, reducing the need to click or tab to a field when a page opens. This attribute is true when present on an element, and false when missing.
            */
          autofocus: boolean;
          /**
            * Sets or retrieves the width of the object.
            */
          cols: number;
          /**
            * Sets or retrieves the initial contents of the object.
            */
          defaultValue: string;
          disabled: boolean;
          /**
            * Retrieves a reference to the form that the object is embedded in.
            */
          form: HTMLFormElement;
          /**
            * Sets or retrieves the maximum number of characters that the user can enter in a text control.
            */
          maxLength: number;
          /**
            * Sets or retrieves the name of the object.
            */
          name: string;
          /**
            * Gets or sets a text string that is displayed in an input field as a hint or prompt to users as the format or type of information they need to enter.The text appears in an input field until the user puts focus on the field.
            */
          placeholder: string;
          /**
            * Sets or retrieves the value indicated whether the content of the object is read-only.
            */
          readOnly: boolean;
          /**
            * When present, marks an element that can't be submitted without a value.
            */
          required: boolean;
          /**
            * Sets or retrieves the number of horizontal rows contained in the object.
            */
          rows: number;
          /**
            * Gets or sets the end position or offset of a text selection.
            */
          selectionEnd: number;
          /**
            * Gets or sets the starting position or offset of a text selection.
            */
          selectionStart: number;
          /**
            * Sets or retrieves the value indicating whether the control is selected.
            */
          status: any;
          /**
            * Retrieves the type of control.
            */
          type: string;
          /**
            * Returns the error message that would be displayed if the user submits the form, or an empty string if no error message. It also triggers the standard error message, such as "this is a required field". The result is that the user sees validation messages without actually submitting.
            */
          validationMessage: string;
          /**
            * Returns a  ValidityState object that represents the validity states of an element.
            */
          validity: ValidityState;
          /**
            * Retrieves or sets the text in the entry field of the textArea element.
            */
          value: string;
          /**
            * Returns whether an element will successfully validate based on forms validation rules and constraints.
            */
          willValidate: boolean;
          /**
            * Sets or retrieves how to handle wordwrapping in the object.
            */
          wrap: string;
          /**
            * Returns whether a form will validate when it is submitted, without having to submit it.
            */
          checkValidity(): boolean;
          /**
            * Creates a TextRange object for the element.
            */
          createTextRange(): TextRange;
          /**
            * Highlights the input area of a form element.
            */
          select(): void;
          /**
            * Sets a custom error message that is displayed when a form is submitted.
            * @param error Sets a custom error message that is displayed when a form is submitted.
            */
          setCustomValidity(error: string): void;
          /**
            * Sets the start and end positions of a selection in a text field.
            * @param start The offset into the text field for the start of the selection.
            * @param end The offset into the text field for the end of the selection.
            */
          setSelectionRange(start: number, end: number): void;
      }
      
      declare var HTMLTextAreaElement: {
          prototype: HTMLTextAreaElement;
          new(): HTMLTextAreaElement;
      }
      
      interface HTMLTitleElement extends HTMLElement {
          /**
            * Retrieves or sets the text of the object as a string. 
            */
          text: string;
      }
      
      declare var HTMLTitleElement: {
          prototype: HTMLTitleElement;
          new(): HTMLTitleElement;
      }
      
      interface HTMLTrackElement extends HTMLElement {
          default: boolean;
          kind: string;
          label: string;
          readyState: number;
          src: string;
          srclang: string;
          track: TextTrack;
          ERROR: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
      }
      
      declare var HTMLTrackElement: {
          prototype: HTMLTrackElement;
          new(): HTMLTrackElement;
          ERROR: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
      }
      
      interface HTMLUListElement extends HTMLElement {
          compact: boolean;
          type: string;
      }
      
      declare var HTMLUListElement: {
          prototype: HTMLUListElement;
          new(): HTMLUListElement;
      }
      
      interface HTMLUnknownElement extends HTMLElement {
      }
      
      declare var HTMLUnknownElement: {
          prototype: HTMLUnknownElement;
          new(): HTMLUnknownElement;
      }
      
      interface HTMLVideoElement extends HTMLMediaElement {
          /**
            * Gets or sets the height of the video element.
            */
          height: number;
          msHorizontalMirror: boolean;
          msIsLayoutOptimalForPlayback: boolean;
          msIsStereo3D: boolean;
          msStereo3DPackingMode: string;
          msStereo3DRenderMode: string;
          msZoom: boolean;
          onMSVideoFormatChanged: (ev: Event) => any;
          onMSVideoFrameStepCompleted: (ev: Event) => any;
          onMSVideoOptimalLayoutChanged: (ev: Event) => any;
          /**
            * Gets or sets a URL of an image to display, for example, like a movie poster. This can be a still frame from the video, or another image if no video data is available.
            */
          poster: string;
          /**
            * Gets the intrinsic height of a video in CSS pixels, or zero if the dimensions are not known.
            */
          videoHeight: number;
          /**
            * Gets the intrinsic width of a video in CSS pixels, or zero if the dimensions are not known.
            */
          videoWidth: number;
          webkitDisplayingFullscreen: boolean;
          webkitSupportsFullscreen: boolean;
          /**
            * Gets or sets the width of the video element.
            */
          width: number;
          getVideoPlaybackQuality(): VideoPlaybackQuality;
          msFrameStep(forward: boolean): void;
          msInsertVideoEffect(activatableClassId: string, effectRequired: boolean, config?: any): void;
          msSetVideoRectangle(left: number, top: number, right: number, bottom: number): void;
          webkitEnterFullScreen(): void;
          webkitEnterFullscreen(): void;
          webkitExitFullScreen(): void;
          webkitExitFullscreen(): void;
          addEventListener(type: "MSContentZoom", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSManipulationStateChanged", listener: (ev: MSManipulationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSVideoFormatChanged", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSVideoFrameStepCompleted", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSVideoOptimalLayoutChanged", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "activate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecopy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforecut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforedeactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "beforepaste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "copy", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "cut", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deactivate", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "msneedkey", listener: (ev: MSMediaKeyNeededEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "paste", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "selectstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var HTMLVideoElement: {
          prototype: HTMLVideoElement;
          new(): HTMLVideoElement;
      }
      
      interface HashChangeEvent extends Event {
          newURL: string;
          oldURL: string;
      }
      
      declare var HashChangeEvent: {
          prototype: HashChangeEvent;
          new(type: string, eventInitDict?: HashChangeEventInit): HashChangeEvent;
      }
      
      interface History {
          length: number;
          state: any;
          back(distance?: any): void;
          forward(distance?: any): void;
          go(delta?: any): void;
          pushState(statedata: any, title?: string, url?: string): void;
          replaceState(statedata: any, title?: string, url?: string): void;
      }
      
      declare var History: {
          prototype: History;
          new(): History;
      }
      
      interface IDBCursor {
          direction: string;
          key: any;
          primaryKey: any;
          source: any;
          advance(count: number): void;
          continue(key?: any): void;
          delete(): IDBRequest;
          update(value: any): IDBRequest;
          NEXT: string;
          NEXT_NO_DUPLICATE: string;
          PREV: string;
          PREV_NO_DUPLICATE: string;
      }
      
      declare var IDBCursor: {
          prototype: IDBCursor;
          new(): IDBCursor;
          NEXT: string;
          NEXT_NO_DUPLICATE: string;
          PREV: string;
          PREV_NO_DUPLICATE: string;
      }
      
      interface IDBCursorWithValue extends IDBCursor {
          value: any;
      }
      
      declare var IDBCursorWithValue: {
          prototype: IDBCursorWithValue;
          new(): IDBCursorWithValue;
      }
      
      interface IDBDatabase extends EventTarget {
          name: string;
          objectStoreNames: DOMStringList;
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          version: string;
          close(): void;
          createObjectStore(name: string, optionalParameters?: any): IDBObjectStore;
          deleteObjectStore(name: string): void;
          transaction(storeNames: any, mode?: string): IDBTransaction;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBDatabase: {
          prototype: IDBDatabase;
          new(): IDBDatabase;
      }
      
      interface IDBFactory {
          cmp(first: any, second: any): number;
          deleteDatabase(name: string): IDBOpenDBRequest;
          open(name: string, version?: number): IDBOpenDBRequest;
      }
      
      declare var IDBFactory: {
          prototype: IDBFactory;
          new(): IDBFactory;
      }
      
      interface IDBIndex {
          keyPath: string;
          name: string;
          objectStore: IDBObjectStore;
          unique: boolean;
          count(key?: any): IDBRequest;
          get(key: any): IDBRequest;
          getKey(key: any): IDBRequest;
          openCursor(range?: IDBKeyRange, direction?: string): IDBRequest;
          openKeyCursor(range?: IDBKeyRange, direction?: string): IDBRequest;
      }
      
      declare var IDBIndex: {
          prototype: IDBIndex;
          new(): IDBIndex;
      }
      
      interface IDBKeyRange {
          lower: any;
          lowerOpen: boolean;
          upper: any;
          upperOpen: boolean;
      }
      
      declare var IDBKeyRange: {
          prototype: IDBKeyRange;
          new(): IDBKeyRange;
          bound(lower: any, upper: any, lowerOpen?: boolean, upperOpen?: boolean): IDBKeyRange;
          lowerBound(bound: any, open?: boolean): IDBKeyRange;
          only(value: any): IDBKeyRange;
          upperBound(bound: any, open?: boolean): IDBKeyRange;
      }
      
      interface IDBObjectStore {
          indexNames: DOMStringList;
          keyPath: string;
          name: string;
          transaction: IDBTransaction;
          add(value: any, key?: any): IDBRequest;
          clear(): IDBRequest;
          count(key?: any): IDBRequest;
          createIndex(name: string, keyPath: string, optionalParameters?: any): IDBIndex;
          delete(key: any): IDBRequest;
          deleteIndex(indexName: string): void;
          get(key: any): IDBRequest;
          index(name: string): IDBIndex;
          openCursor(range?: any, direction?: string): IDBRequest;
          put(value: any, key?: any): IDBRequest;
      }
      
      declare var IDBObjectStore: {
          prototype: IDBObjectStore;
          new(): IDBObjectStore;
      }
      
      interface IDBOpenDBRequest extends IDBRequest {
          onblocked: (ev: Event) => any;
          onupgradeneeded: (ev: IDBVersionChangeEvent) => any;
          addEventListener(type: "blocked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "success", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "upgradeneeded", listener: (ev: IDBVersionChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBOpenDBRequest: {
          prototype: IDBOpenDBRequest;
          new(): IDBOpenDBRequest;
      }
      
      interface IDBRequest extends EventTarget {
          error: DOMError;
          onerror: (ev: Event) => any;
          onsuccess: (ev: Event) => any;
          readyState: string;
          result: any;
          source: any;
          transaction: IDBTransaction;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "success", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBRequest: {
          prototype: IDBRequest;
          new(): IDBRequest;
      }
      
      interface IDBTransaction extends EventTarget {
          db: IDBDatabase;
          error: DOMError;
          mode: string;
          onabort: (ev: Event) => any;
          oncomplete: (ev: Event) => any;
          onerror: (ev: Event) => any;
          abort(): void;
          objectStore(name: string): IDBObjectStore;
          READ_ONLY: string;
          READ_WRITE: string;
          VERSION_CHANGE: string;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var IDBTransaction: {
          prototype: IDBTransaction;
          new(): IDBTransaction;
          READ_ONLY: string;
          READ_WRITE: string;
          VERSION_CHANGE: string;
      }
      
      interface IDBVersionChangeEvent extends Event {
          newVersion: number;
          oldVersion: number;
      }
      
      declare var IDBVersionChangeEvent: {
          prototype: IDBVersionChangeEvent;
          new(): IDBVersionChangeEvent;
      }
      
      interface ImageData {
          data: number[];
          height: number;
          width: number;
      }
      
      declare var ImageData: {
          prototype: ImageData;
          new(): ImageData;
      }
      
      interface KeyboardEvent extends UIEvent {
          altKey: boolean;
          char: string;
          charCode: number;
          ctrlKey: boolean;
          key: string;
          keyCode: number;
          locale: string;
          location: number;
          metaKey: boolean;
          repeat: boolean;
          shiftKey: boolean;
          which: number;
          getModifierState(keyArg: string): boolean;
          initKeyboardEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, keyArg: string, locationArg: number, modifiersListArg: string, repeat: boolean, locale: string): void;
          DOM_KEY_LOCATION_JOYSTICK: number;
          DOM_KEY_LOCATION_LEFT: number;
          DOM_KEY_LOCATION_MOBILE: number;
          DOM_KEY_LOCATION_NUMPAD: number;
          DOM_KEY_LOCATION_RIGHT: number;
          DOM_KEY_LOCATION_STANDARD: number;
      }
      
      declare var KeyboardEvent: {
          prototype: KeyboardEvent;
          new(typeArg: string, eventInitDict?: KeyboardEventInit): KeyboardEvent;
          DOM_KEY_LOCATION_JOYSTICK: number;
          DOM_KEY_LOCATION_LEFT: number;
          DOM_KEY_LOCATION_MOBILE: number;
          DOM_KEY_LOCATION_NUMPAD: number;
          DOM_KEY_LOCATION_RIGHT: number;
          DOM_KEY_LOCATION_STANDARD: number;
      }
      
      interface Location {
          hash: string;
          host: string;
          hostname: string;
          href: string;
          origin: string;
          pathname: string;
          port: string;
          protocol: string;
          search: string;
          assign(url: string): void;
          reload(forcedReload?: boolean): void;
          replace(url: string): void;
          toString(): string;
      }
      
      declare var Location: {
          prototype: Location;
          new(): Location;
      }
      
      interface LongRunningScriptDetectedEvent extends Event {
          executionTime: number;
          stopPageScriptExecution: boolean;
      }
      
      declare var LongRunningScriptDetectedEvent: {
          prototype: LongRunningScriptDetectedEvent;
          new(): LongRunningScriptDetectedEvent;
      }
      
      interface MSApp {
          clearTemporaryWebDataAsync(): MSAppAsyncOperation;
          createBlobFromRandomAccessStream(type: string, seeker: any): Blob;
          createDataPackage(object: any): any;
          createDataPackageFromSelection(): any;
          createFileFromStorageFile(storageFile: any): File;
          createStreamFromInputStream(type: string, inputStream: any): MSStream;
          execAsyncAtPriority(asynchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): void;
          execAtPriority(synchronousCallback: MSExecAtPriorityFunctionCallback, priority: string, ...args: any[]): any;
          getCurrentPriority(): string;
          getHtmlPrintDocumentSourceAsync(htmlDoc: any): any;
          getViewId(view: any): any;
          isTaskScheduledAtPriorityOrHigher(priority: string): boolean;
          pageHandlesAllApplicationActivations(enabled: boolean): void;
          suppressSubdownloadCredentialPrompts(suppress: boolean): void;
          terminateApp(exceptionObject: any): void;
          CURRENT: string;
          HIGH: string;
          IDLE: string;
          NORMAL: string;
      }
      declare var MSApp: MSApp;
      
      interface MSAppAsyncOperation extends EventTarget {
          error: DOMError;
          oncomplete: (ev: Event) => any;
          onerror: (ev: Event) => any;
          readyState: number;
          result: any;
          start(): void;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSAppAsyncOperation: {
          prototype: MSAppAsyncOperation;
          new(): MSAppAsyncOperation;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
      }
      
      interface MSBlobBuilder {
          append(data: any, endings?: string): void;
          getBlob(contentType?: string): Blob;
      }
      
      declare var MSBlobBuilder: {
          prototype: MSBlobBuilder;
          new(): MSBlobBuilder;
      }
      
      interface MSCSSMatrix {
          a: number;
          b: number;
          c: number;
          d: number;
          e: number;
          f: number;
          m11: number;
          m12: number;
          m13: number;
          m14: number;
          m21: number;
          m22: number;
          m23: number;
          m24: number;
          m31: number;
          m32: number;
          m33: number;
          m34: number;
          m41: number;
          m42: number;
          m43: number;
          m44: number;
          inverse(): MSCSSMatrix;
          multiply(secondMatrix: MSCSSMatrix): MSCSSMatrix;
          rotate(angleX: number, angleY?: number, angleZ?: number): MSCSSMatrix;
          rotateAxisAngle(x: number, y: number, z: number, angle: number): MSCSSMatrix;
          scale(scaleX: number, scaleY?: number, scaleZ?: number): MSCSSMatrix;
          setMatrixValue(value: string): void;
          skewX(angle: number): MSCSSMatrix;
          skewY(angle: number): MSCSSMatrix;
          toString(): string;
          translate(x: number, y: number, z?: number): MSCSSMatrix;
      }
      
      declare var MSCSSMatrix: {
          prototype: MSCSSMatrix;
          new(text?: string): MSCSSMatrix;
      }
      
      interface MSGesture {
          target: Element;
          addPointer(pointerId: number): void;
          stop(): void;
      }
      
      declare var MSGesture: {
          prototype: MSGesture;
          new(): MSGesture;
      }
      
      interface MSGestureEvent extends UIEvent {
          clientX: number;
          clientY: number;
          expansion: number;
          gestureObject: any;
          hwTimestamp: number;
          offsetX: number;
          offsetY: number;
          rotation: number;
          scale: number;
          screenX: number;
          screenY: number;
          translationX: number;
          translationY: number;
          velocityAngular: number;
          velocityExpansion: number;
          velocityX: number;
          velocityY: number;
          initGestureEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, offsetXArg: number, offsetYArg: number, translationXArg: number, translationYArg: number, scaleArg: number, expansionArg: number, rotationArg: number, velocityXArg: number, velocityYArg: number, velocityExpansionArg: number, velocityAngularArg: number, hwTimestampArg: number): void;
          MSGESTURE_FLAG_BEGIN: number;
          MSGESTURE_FLAG_CANCEL: number;
          MSGESTURE_FLAG_END: number;
          MSGESTURE_FLAG_INERTIA: number;
          MSGESTURE_FLAG_NONE: number;
      }
      
      declare var MSGestureEvent: {
          prototype: MSGestureEvent;
          new(): MSGestureEvent;
          MSGESTURE_FLAG_BEGIN: number;
          MSGESTURE_FLAG_CANCEL: number;
          MSGESTURE_FLAG_END: number;
          MSGESTURE_FLAG_INERTIA: number;
          MSGESTURE_FLAG_NONE: number;
      }
      
      interface MSGraphicsTrust {
          constrictionActive: boolean;
          status: string;
      }
      
      declare var MSGraphicsTrust: {
          prototype: MSGraphicsTrust;
          new(): MSGraphicsTrust;
      }
      
      interface MSHTMLWebViewElement extends HTMLElement {
          canGoBack: boolean;
          canGoForward: boolean;
          containsFullScreenElement: boolean;
          documentTitle: string;
          height: number;
          settings: MSWebViewSettings;
          src: string;
          width: number;
          addWebAllowedObject(name: string, applicationObject: any): void;
          buildLocalStreamUri(contentIdentifier: string, relativePath: string): string;
          capturePreviewToBlobAsync(): MSWebViewAsyncOperation;
          captureSelectedContentToDataPackageAsync(): MSWebViewAsyncOperation;
          getDeferredPermissionRequestById(id: number): DeferredPermissionRequest;
          getDeferredPermissionRequests(): DeferredPermissionRequest[];
          goBack(): void;
          goForward(): void;
          invokeScriptAsync(scriptName: string, ...args: any[]): MSWebViewAsyncOperation;
          navigate(uri: string): void;
          navigateToLocalStreamUri(source: string, streamResolver: any): void;
          navigateToString(contents: string): void;
          navigateWithHttpRequestMessage(requestMessage: any): void;
          refresh(): void;
          stop(): void;
      }
      
      declare var MSHTMLWebViewElement: {
          prototype: MSHTMLWebViewElement;
          new(): MSHTMLWebViewElement;
      }
      
      interface MSHeaderFooter {
          URL: string;
          dateLong: string;
          dateShort: string;
          font: string;
          htmlFoot: string;
          htmlHead: string;
          page: number;
          pageTotal: number;
          textFoot: string;
          textHead: string;
          timeLong: string;
          timeShort: string;
          title: string;
      }
      
      declare var MSHeaderFooter: {
          prototype: MSHeaderFooter;
          new(): MSHeaderFooter;
      }
      
      interface MSInputMethodContext extends EventTarget {
          compositionEndOffset: number;
          compositionStartOffset: number;
          oncandidatewindowhide: (ev: Event) => any;
          oncandidatewindowshow: (ev: Event) => any;
          oncandidatewindowupdate: (ev: Event) => any;
          target: HTMLElement;
          getCandidateWindowClientRect(): ClientRect;
          getCompositionAlternatives(): string[];
          hasComposition(): boolean;
          isCandidateWindowVisible(): boolean;
          addEventListener(type: "MSCandidateWindowHide", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSCandidateWindowShow", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "MSCandidateWindowUpdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSInputMethodContext: {
          prototype: MSInputMethodContext;
          new(): MSInputMethodContext;
      }
      
      interface MSManipulationEvent extends UIEvent {
          currentState: number;
          inertiaDestinationX: number;
          inertiaDestinationY: number;
          lastState: number;
          initMSManipulationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, lastState: number, currentState: number): void;
          MS_MANIPULATION_STATE_ACTIVE: number;
          MS_MANIPULATION_STATE_CANCELLED: number;
          MS_MANIPULATION_STATE_COMMITTED: number;
          MS_MANIPULATION_STATE_DRAGGING: number;
          MS_MANIPULATION_STATE_INERTIA: number;
          MS_MANIPULATION_STATE_PRESELECT: number;
          MS_MANIPULATION_STATE_SELECTING: number;
          MS_MANIPULATION_STATE_STOPPED: number;
      }
      
      declare var MSManipulationEvent: {
          prototype: MSManipulationEvent;
          new(): MSManipulationEvent;
          MS_MANIPULATION_STATE_ACTIVE: number;
          MS_MANIPULATION_STATE_CANCELLED: number;
          MS_MANIPULATION_STATE_COMMITTED: number;
          MS_MANIPULATION_STATE_DRAGGING: number;
          MS_MANIPULATION_STATE_INERTIA: number;
          MS_MANIPULATION_STATE_PRESELECT: number;
          MS_MANIPULATION_STATE_SELECTING: number;
          MS_MANIPULATION_STATE_STOPPED: number;
      }
      
      interface MSMediaKeyError {
          code: number;
          systemCode: number;
          MS_MEDIA_KEYERR_CLIENT: number;
          MS_MEDIA_KEYERR_DOMAIN: number;
          MS_MEDIA_KEYERR_HARDWARECHANGE: number;
          MS_MEDIA_KEYERR_OUTPUT: number;
          MS_MEDIA_KEYERR_SERVICE: number;
          MS_MEDIA_KEYERR_UNKNOWN: number;
      }
      
      declare var MSMediaKeyError: {
          prototype: MSMediaKeyError;
          new(): MSMediaKeyError;
          MS_MEDIA_KEYERR_CLIENT: number;
          MS_MEDIA_KEYERR_DOMAIN: number;
          MS_MEDIA_KEYERR_HARDWARECHANGE: number;
          MS_MEDIA_KEYERR_OUTPUT: number;
          MS_MEDIA_KEYERR_SERVICE: number;
          MS_MEDIA_KEYERR_UNKNOWN: number;
      }
      
      interface MSMediaKeyMessageEvent extends Event {
          destinationURL: string;
          message: Uint8Array;
      }
      
      declare var MSMediaKeyMessageEvent: {
          prototype: MSMediaKeyMessageEvent;
          new(): MSMediaKeyMessageEvent;
      }
      
      interface MSMediaKeyNeededEvent extends Event {
          initData: Uint8Array;
      }
      
      declare var MSMediaKeyNeededEvent: {
          prototype: MSMediaKeyNeededEvent;
          new(): MSMediaKeyNeededEvent;
      }
      
      interface MSMediaKeySession extends EventTarget {
          error: MSMediaKeyError;
          keySystem: string;
          sessionId: string;
          close(): void;
          update(key: Uint8Array): void;
      }
      
      declare var MSMediaKeySession: {
          prototype: MSMediaKeySession;
          new(): MSMediaKeySession;
      }
      
      interface MSMediaKeys {
          keySystem: string;
          createSession(type: string, initData: Uint8Array, cdmData?: Uint8Array): MSMediaKeySession;
      }
      
      declare var MSMediaKeys: {
          prototype: MSMediaKeys;
          new(keySystem: string): MSMediaKeys;
          isTypeSupported(keySystem: string, type?: string): boolean;
      }
      
      interface MSMimeTypesCollection {
          length: number;
      }
      
      declare var MSMimeTypesCollection: {
          prototype: MSMimeTypesCollection;
          new(): MSMimeTypesCollection;
      }
      
      interface MSPluginsCollection {
          length: number;
          refresh(reload?: boolean): void;
      }
      
      declare var MSPluginsCollection: {
          prototype: MSPluginsCollection;
          new(): MSPluginsCollection;
      }
      
      interface MSPointerEvent extends MouseEvent {
          currentPoint: any;
          height: number;
          hwTimestamp: number;
          intermediatePoints: any;
          isPrimary: boolean;
          pointerId: number;
          pointerType: any;
          pressure: number;
          rotation: number;
          tiltX: number;
          tiltY: number;
          width: number;
          getCurrentPoint(element: Element): void;
          getIntermediatePoints(element: Element): void;
          initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;
      }
      
      declare var MSPointerEvent: {
          prototype: MSPointerEvent;
          new(typeArg: string, eventInitDict?: PointerEventInit): MSPointerEvent;
      }
      
      interface MSPrintManagerTemplatePrinter extends MSTemplatePrinter, EventTarget {
          percentScale: number;
          showHeaderFooter: boolean;
          shrinkToFit: boolean;
          drawPreviewPage(element: HTMLElement, pageNumber: number): void;
          endPrint(): void;
          getPrintTaskOptionValue(key: string): any;
          invalidatePreview(): void;
          setPageCount(pageCount: number): void;
          startPrint(): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSPrintManagerTemplatePrinter: {
          prototype: MSPrintManagerTemplatePrinter;
          new(): MSPrintManagerTemplatePrinter;
      }
      
      interface MSRangeCollection {
          length: number;
          item(index: number): Range;
          [index: number]: Range;
      }
      
      declare var MSRangeCollection: {
          prototype: MSRangeCollection;
          new(): MSRangeCollection;
      }
      
      interface MSSiteModeEvent extends Event {
          actionURL: string;
          buttonID: number;
      }
      
      declare var MSSiteModeEvent: {
          prototype: MSSiteModeEvent;
          new(): MSSiteModeEvent;
      }
      
      interface MSStream {
          type: string;
          msClose(): void;
          msDetachStream(): any;
      }
      
      declare var MSStream: {
          prototype: MSStream;
          new(): MSStream;
      }
      
      interface MSStreamReader extends EventTarget, MSBaseReader {
          error: DOMError;
          readAsArrayBuffer(stream: MSStream, size?: number): void;
          readAsBinaryString(stream: MSStream, size?: number): void;
          readAsBlob(stream: MSStream, size?: number): void;
          readAsDataURL(stream: MSStream, size?: number): void;
          readAsText(stream: MSStream, encoding?: string, size?: number): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSStreamReader: {
          prototype: MSStreamReader;
          new(): MSStreamReader;
      }
      
      interface MSTemplatePrinter {
          collate: boolean;
          copies: number;
          currentPage: boolean;
          currentPageAvail: boolean;
          duplex: boolean;
          footer: string;
          frameActive: boolean;
          frameActiveEnabled: boolean;
          frameAsShown: boolean;
          framesetDocument: boolean;
          header: string;
          headerFooterFont: string;
          marginBottom: number;
          marginLeft: number;
          marginRight: number;
          marginTop: number;
          orientation: string;
          pageFrom: number;
          pageHeight: number;
          pageTo: number;
          pageWidth: number;
          selectedPages: boolean;
          selection: boolean;
          selectionEnabled: boolean;
          unprintableBottom: number;
          unprintableLeft: number;
          unprintableRight: number;
          unprintableTop: number;
          usePrinterCopyCollate: boolean;
          createHeaderFooter(): MSHeaderFooter;
          deviceSupports(property: string): any;
          ensurePrintDialogDefaults(): boolean;
          getPageMarginBottom(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginBottomImportant(pageRule: CSSPageRule): boolean;
          getPageMarginLeft(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginLeftImportant(pageRule: CSSPageRule): boolean;
          getPageMarginRight(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginRightImportant(pageRule: CSSPageRule): boolean;
          getPageMarginTop(pageRule: CSSPageRule, pageWidth: number, pageHeight: number): any;
          getPageMarginTopImportant(pageRule: CSSPageRule): boolean;
          printBlankPage(): void;
          printNonNative(document: any): boolean;
          printNonNativeFrames(document: any, activeFrame: boolean): void;
          printPage(element: HTMLElement): void;
          showPageSetupDialog(): boolean;
          showPrintDialog(): boolean;
          startDoc(title: string): boolean;
          stopDoc(): void;
          updatePageStatus(status: number): void;
      }
      
      declare var MSTemplatePrinter: {
          prototype: MSTemplatePrinter;
          new(): MSTemplatePrinter;
      }
      
      interface MSWebViewAsyncOperation extends EventTarget {
          error: DOMError;
          oncomplete: (ev: Event) => any;
          onerror: (ev: Event) => any;
          readyState: number;
          result: any;
          target: MSHTMLWebViewElement;
          type: number;
          start(): void;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
          TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;
          TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;
          TYPE_INVOKE_SCRIPT: number;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MSWebViewAsyncOperation: {
          prototype: MSWebViewAsyncOperation;
          new(): MSWebViewAsyncOperation;
          COMPLETED: number;
          ERROR: number;
          STARTED: number;
          TYPE_CAPTURE_PREVIEW_TO_RANDOM_ACCESS_STREAM: number;
          TYPE_CREATE_DATA_PACKAGE_FROM_SELECTION: number;
          TYPE_INVOKE_SCRIPT: number;
      }
      
      interface MSWebViewSettings {
          isIndexedDBEnabled: boolean;
          isJavaScriptEnabled: boolean;
      }
      
      declare var MSWebViewSettings: {
          prototype: MSWebViewSettings;
          new(): MSWebViewSettings;
      }
      
      interface MediaElementAudioSourceNode extends AudioNode {
      }
      
      declare var MediaElementAudioSourceNode: {
          prototype: MediaElementAudioSourceNode;
          new(): MediaElementAudioSourceNode;
      }
      
      interface MediaError {
          code: number;
          msExtendedCode: number;
          MEDIA_ERR_ABORTED: number;
          MEDIA_ERR_DECODE: number;
          MEDIA_ERR_NETWORK: number;
          MEDIA_ERR_SRC_NOT_SUPPORTED: number;
          MS_MEDIA_ERR_ENCRYPTED: number;
      }
      
      declare var MediaError: {
          prototype: MediaError;
          new(): MediaError;
          MEDIA_ERR_ABORTED: number;
          MEDIA_ERR_DECODE: number;
          MEDIA_ERR_NETWORK: number;
          MEDIA_ERR_SRC_NOT_SUPPORTED: number;
          MS_MEDIA_ERR_ENCRYPTED: number;
      }
      
      interface MediaList {
          length: number;
          mediaText: string;
          appendMedium(newMedium: string): void;
          deleteMedium(oldMedium: string): void;
          item(index: number): string;
          toString(): string;
          [index: number]: string;
      }
      
      declare var MediaList: {
          prototype: MediaList;
          new(): MediaList;
      }
      
      interface MediaQueryList {
          matches: boolean;
          media: string;
          addListener(listener: MediaQueryListListener): void;
          removeListener(listener: MediaQueryListListener): void;
      }
      
      declare var MediaQueryList: {
          prototype: MediaQueryList;
          new(): MediaQueryList;
      }
      
      interface MediaSource extends EventTarget {
          activeSourceBuffers: SourceBufferList;
          duration: number;
          readyState: string;
          sourceBuffers: SourceBufferList;
          addSourceBuffer(type: string): SourceBuffer;
          endOfStream(error?: string): void;
          removeSourceBuffer(sourceBuffer: SourceBuffer): void;
      }
      
      declare var MediaSource: {
          prototype: MediaSource;
          new(): MediaSource;
          isTypeSupported(type: string): boolean;
      }
      
      interface MessageChannel {
          port1: MessagePort;
          port2: MessagePort;
      }
      
      declare var MessageChannel: {
          prototype: MessageChannel;
          new(): MessageChannel;
      }
      
      interface MessageEvent extends Event {
          data: any;
          origin: string;
          ports: any;
          source: Window;
          initMessageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, dataArg: any, originArg: string, lastEventIdArg: string, sourceArg: Window): void;
      }
      
      declare var MessageEvent: {
          prototype: MessageEvent;
          new(): MessageEvent;
      }
      
      interface MessagePort extends EventTarget {
          onmessage: (ev: MessageEvent) => any;
          close(): void;
          postMessage(message?: any, ports?: any): void;
          start(): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var MessagePort: {
          prototype: MessagePort;
          new(): MessagePort;
      }
      
      interface MimeType {
          description: string;
          enabledPlugin: Plugin;
          suffixes: string;
          type: string;
      }
      
      declare var MimeType: {
          prototype: MimeType;
          new(): MimeType;
      }
      
      interface MimeTypeArray {
          length: number;
          item(index: number): Plugin;
          namedItem(type: string): Plugin;
          [index: number]: Plugin;
      }
      
      declare var MimeTypeArray: {
          prototype: MimeTypeArray;
          new(): MimeTypeArray;
      }
      
      interface MouseEvent extends UIEvent {
          altKey: boolean;
          button: number;
          buttons: number;
          clientX: number;
          clientY: number;
          ctrlKey: boolean;
          fromElement: Element;
          layerX: number;
          layerY: number;
          metaKey: boolean;
          movementX: number;
          movementY: number;
          offsetX: number;
          offsetY: number;
          pageX: number;
          pageY: number;
          relatedTarget: EventTarget;
          screenX: number;
          screenY: number;
          shiftKey: boolean;
          toElement: Element;
          which: number;
          x: number;
          y: number;
          getModifierState(keyArg: string): boolean;
          initMouseEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget): void;
      }
      
      declare var MouseEvent: {
          prototype: MouseEvent;
          new(typeArg: string, eventInitDict?: MouseEventInit): MouseEvent;
      }
      
      interface MouseWheelEvent extends MouseEvent {
          wheelDelta: number;
          wheelDeltaX: number;
          wheelDeltaY: number;
          initMouseWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, wheelDeltaArg: number): void;
      }
      
      declare var MouseWheelEvent: {
          prototype: MouseWheelEvent;
          new(): MouseWheelEvent;
      }
      
      interface MutationEvent extends Event {
          attrChange: number;
          attrName: string;
          newValue: string;
          prevValue: string;
          relatedNode: Node;
          initMutationEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, relatedNodeArg: Node, prevValueArg: string, newValueArg: string, attrNameArg: string, attrChangeArg: number): void;
          ADDITION: number;
          MODIFICATION: number;
          REMOVAL: number;
      }
      
      declare var MutationEvent: {
          prototype: MutationEvent;
          new(): MutationEvent;
          ADDITION: number;
          MODIFICATION: number;
          REMOVAL: number;
      }
      
      interface MutationObserver {
          disconnect(): void;
          observe(target: Node, options: MutationObserverInit): void;
          takeRecords(): MutationRecord[];
      }
      
      declare var MutationObserver: {
          prototype: MutationObserver;
          new(callback: MutationCallback): MutationObserver;
      }
      
      interface MutationRecord {
          addedNodes: NodeList;
          attributeName: string;
          attributeNamespace: string;
          nextSibling: Node;
          oldValue: string;
          previousSibling: Node;
          removedNodes: NodeList;
          target: Node;
          type: string;
      }
      
      declare var MutationRecord: {
          prototype: MutationRecord;
          new(): MutationRecord;
      }
      
      interface NamedNodeMap {
          length: number;
          getNamedItem(name: string): Attr;
          getNamedItemNS(namespaceURI: string, localName: string): Attr;
          item(index: number): Attr;
          removeNamedItem(name: string): Attr;
          removeNamedItemNS(namespaceURI: string, localName: string): Attr;
          setNamedItem(arg: Attr): Attr;
          setNamedItemNS(arg: Attr): Attr;
          [index: number]: Attr;
      }
      
      declare var NamedNodeMap: {
          prototype: NamedNodeMap;
          new(): NamedNodeMap;
      }
      
      interface NavigationCompletedEvent extends NavigationEvent {
          isSuccess: boolean;
          webErrorStatus: number;
      }
      
      declare var NavigationCompletedEvent: {
          prototype: NavigationCompletedEvent;
          new(): NavigationCompletedEvent;
      }
      
      interface NavigationEvent extends Event {
          uri: string;
      }
      
      declare var NavigationEvent: {
          prototype: NavigationEvent;
          new(): NavigationEvent;
      }
      
      interface NavigationEventWithReferrer extends NavigationEvent {
          referer: string;
      }
      
      declare var NavigationEventWithReferrer: {
          prototype: NavigationEventWithReferrer;
          new(): NavigationEventWithReferrer;
      }
      
      interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorContentUtils, NavigatorStorageUtils, NavigatorGeolocation, MSNavigatorDoNotTrack, MSFileSaver {
          appCodeName: string;
          appMinorVersion: string;
          browserLanguage: string;
          connectionSpeed: number;
          cookieEnabled: boolean;
          cpuClass: string;
          language: string;
          maxTouchPoints: number;
          mimeTypes: MSMimeTypesCollection;
          msManipulationViewsEnabled: boolean;
          msMaxTouchPoints: number;
          msPointerEnabled: boolean;
          plugins: MSPluginsCollection;
          pointerEnabled: boolean;
          systemLanguage: string;
          userLanguage: string;
          webdriver: boolean;
          getGamepads(): Gamepad[];
          javaEnabled(): boolean;
          msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Navigator: {
          prototype: Navigator;
          new(): Navigator;
      }
      
      interface Node extends EventTarget {
          attributes: NamedNodeMap;
          baseURI: string;
          childNodes: NodeList;
          firstChild: Node;
          lastChild: Node;
          localName: string;
          namespaceURI: string;
          nextSibling: Node;
          nodeName: string;
          nodeType: number;
          nodeValue: string;
          ownerDocument: Document;
          parentElement: HTMLElement;
          parentNode: Node;
          prefix: string;
          previousSibling: Node;
          textContent: string;
          appendChild(newChild: Node): Node;
          cloneNode(deep?: boolean): Node;
          compareDocumentPosition(other: Node): number;
          hasAttributes(): boolean;
          hasChildNodes(): boolean;
          insertBefore(newChild: Node, refChild?: Node): Node;
          isDefaultNamespace(namespaceURI: string): boolean;
          isEqualNode(arg: Node): boolean;
          isSameNode(other: Node): boolean;
          lookupNamespaceURI(prefix: string): string;
          lookupPrefix(namespaceURI: string): string;
          normalize(): void;
          removeChild(oldChild: Node): Node;
          replaceChild(newChild: Node, oldChild: Node): Node;
          ATTRIBUTE_NODE: number;
          CDATA_SECTION_NODE: number;
          COMMENT_NODE: number;
          DOCUMENT_FRAGMENT_NODE: number;
          DOCUMENT_NODE: number;
          DOCUMENT_POSITION_CONTAINED_BY: number;
          DOCUMENT_POSITION_CONTAINS: number;
          DOCUMENT_POSITION_DISCONNECTED: number;
          DOCUMENT_POSITION_FOLLOWING: number;
          DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
          DOCUMENT_POSITION_PRECEDING: number;
          DOCUMENT_TYPE_NODE: number;
          ELEMENT_NODE: number;
          ENTITY_NODE: number;
          ENTITY_REFERENCE_NODE: number;
          NOTATION_NODE: number;
          PROCESSING_INSTRUCTION_NODE: number;
          TEXT_NODE: number;
      }
      
      declare var Node: {
          prototype: Node;
          new(): Node;
          ATTRIBUTE_NODE: number;
          CDATA_SECTION_NODE: number;
          COMMENT_NODE: number;
          DOCUMENT_FRAGMENT_NODE: number;
          DOCUMENT_NODE: number;
          DOCUMENT_POSITION_CONTAINED_BY: number;
          DOCUMENT_POSITION_CONTAINS: number;
          DOCUMENT_POSITION_DISCONNECTED: number;
          DOCUMENT_POSITION_FOLLOWING: number;
          DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: number;
          DOCUMENT_POSITION_PRECEDING: number;
          DOCUMENT_TYPE_NODE: number;
          ELEMENT_NODE: number;
          ENTITY_NODE: number;
          ENTITY_REFERENCE_NODE: number;
          NOTATION_NODE: number;
          PROCESSING_INSTRUCTION_NODE: number;
          TEXT_NODE: number;
      }
      
      interface NodeFilter {
          FILTER_ACCEPT: number;
          FILTER_REJECT: number;
          FILTER_SKIP: number;
          SHOW_ALL: number;
          SHOW_ATTRIBUTE: number;
          SHOW_CDATA_SECTION: number;
          SHOW_COMMENT: number;
          SHOW_DOCUMENT: number;
          SHOW_DOCUMENT_FRAGMENT: number;
          SHOW_DOCUMENT_TYPE: number;
          SHOW_ELEMENT: number;
          SHOW_ENTITY: number;
          SHOW_ENTITY_REFERENCE: number;
          SHOW_NOTATION: number;
          SHOW_PROCESSING_INSTRUCTION: number;
          SHOW_TEXT: number;
      }
      declare var NodeFilter: NodeFilter;
      
      interface NodeIterator {
          expandEntityReferences: boolean;
          filter: NodeFilter;
          root: Node;
          whatToShow: number;
          detach(): void;
          nextNode(): Node;
          previousNode(): Node;
      }
      
      declare var NodeIterator: {
          prototype: NodeIterator;
          new(): NodeIterator;
      }
      
      interface NodeList {
          length: number;
          item(index: number): Node;
          [index: number]: Node;
      }
      
      declare var NodeList: {
          prototype: NodeList;
          new(): NodeList;
      }
      
      interface OES_element_index_uint {
      }
      
      declare var OES_element_index_uint: {
          prototype: OES_element_index_uint;
          new(): OES_element_index_uint;
      }
      
      interface OES_standard_derivatives {
          FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;
      }
      
      declare var OES_standard_derivatives: {
          prototype: OES_standard_derivatives;
          new(): OES_standard_derivatives;
          FRAGMENT_SHADER_DERIVATIVE_HINT_OES: number;
      }
      
      interface OES_texture_float {
      }
      
      declare var OES_texture_float: {
          prototype: OES_texture_float;
          new(): OES_texture_float;
      }
      
      interface OES_texture_float_linear {
      }
      
      declare var OES_texture_float_linear: {
          prototype: OES_texture_float_linear;
          new(): OES_texture_float_linear;
      }
      
      interface OfflineAudioCompletionEvent extends Event {
          renderedBuffer: AudioBuffer;
      }
      
      declare var OfflineAudioCompletionEvent: {
          prototype: OfflineAudioCompletionEvent;
          new(): OfflineAudioCompletionEvent;
      }
      
      interface OfflineAudioContext extends AudioContext {
          oncomplete: (ev: Event) => any;
          startRendering(): void;
          addEventListener(type: "complete", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var OfflineAudioContext: {
          prototype: OfflineAudioContext;
          new(numberOfChannels: number, length: number, sampleRate: number): OfflineAudioContext;
      }
      
      interface OscillatorNode extends AudioNode {
          detune: AudioParam;
          frequency: AudioParam;
          onended: (ev: Event) => any;
          type: string;
          setPeriodicWave(periodicWave: PeriodicWave): void;
          start(when?: number): void;
          stop(when?: number): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var OscillatorNode: {
          prototype: OscillatorNode;
          new(): OscillatorNode;
      }
      
      interface PageTransitionEvent extends Event {
          persisted: boolean;
      }
      
      declare var PageTransitionEvent: {
          prototype: PageTransitionEvent;
          new(): PageTransitionEvent;
      }
      
      interface PannerNode extends AudioNode {
          coneInnerAngle: number;
          coneOuterAngle: number;
          coneOuterGain: number;
          distanceModel: string;
          maxDistance: number;
          panningModel: string;
          refDistance: number;
          rolloffFactor: number;
          setOrientation(x: number, y: number, z: number): void;
          setPosition(x: number, y: number, z: number): void;
          setVelocity(x: number, y: number, z: number): void;
      }
      
      declare var PannerNode: {
          prototype: PannerNode;
          new(): PannerNode;
      }
      
      interface PerfWidgetExternal {
          activeNetworkRequestCount: number;
          averageFrameTime: number;
          averagePaintTime: number;
          extraInformationEnabled: boolean;
          independentRenderingEnabled: boolean;
          irDisablingContentString: string;
          irStatusAvailable: boolean;
          maxCpuSpeed: number;
          paintRequestsPerSecond: number;
          performanceCounter: number;
          performanceCounterFrequency: number;
          addEventListener(eventType: string, callback: Function): void;
          getMemoryUsage(): number;
          getProcessCpuUsage(): number;
          getRecentCpuUsage(last: number): any;
          getRecentFrames(last: number): any;
          getRecentMemoryUsage(last: number): any;
          getRecentPaintRequests(last: number): any;
          removeEventListener(eventType: string, callback: Function): void;
          repositionWindow(x: number, y: number): void;
          resizeWindow(width: number, height: number): void;
      }
      
      declare var PerfWidgetExternal: {
          prototype: PerfWidgetExternal;
          new(): PerfWidgetExternal;
      }
      
      interface Performance {
          navigation: PerformanceNavigation;
          timing: PerformanceTiming;
          clearMarks(markName?: string): void;
          clearMeasures(measureName?: string): void;
          clearResourceTimings(): void;
          getEntries(): any;
          getEntriesByName(name: string, entryType?: string): any;
          getEntriesByType(entryType: string): any;
          getMarks(markName?: string): any;
          getMeasures(measureName?: string): any;
          mark(markName: string): void;
          measure(measureName: string, startMarkName?: string, endMarkName?: string): void;
          now(): number;
          setResourceTimingBufferSize(maxSize: number): void;
          toJSON(): any;
      }
      
      declare var Performance: {
          prototype: Performance;
          new(): Performance;
      }
      
      interface PerformanceEntry {
          duration: number;
          entryType: string;
          name: string;
          startTime: number;
      }
      
      declare var PerformanceEntry: {
          prototype: PerformanceEntry;
          new(): PerformanceEntry;
      }
      
      interface PerformanceMark extends PerformanceEntry {
      }
      
      declare var PerformanceMark: {
          prototype: PerformanceMark;
          new(): PerformanceMark;
      }
      
      interface PerformanceMeasure extends PerformanceEntry {
      }
      
      declare var PerformanceMeasure: {
          prototype: PerformanceMeasure;
          new(): PerformanceMeasure;
      }
      
      interface PerformanceNavigation {
          redirectCount: number;
          type: number;
          toJSON(): any;
          TYPE_BACK_FORWARD: number;
          TYPE_NAVIGATE: number;
          TYPE_RELOAD: number;
          TYPE_RESERVED: number;
      }
      
      declare var PerformanceNavigation: {
          prototype: PerformanceNavigation;
          new(): PerformanceNavigation;
          TYPE_BACK_FORWARD: number;
          TYPE_NAVIGATE: number;
          TYPE_RELOAD: number;
          TYPE_RESERVED: number;
      }
      
      interface PerformanceNavigationTiming extends PerformanceEntry {
          connectEnd: number;
          connectStart: number;
          domComplete: number;
          domContentLoadedEventEnd: number;
          domContentLoadedEventStart: number;
          domInteractive: number;
          domLoading: number;
          domainLookupEnd: number;
          domainLookupStart: number;
          fetchStart: number;
          loadEventEnd: number;
          loadEventStart: number;
          navigationStart: number;
          redirectCount: number;
          redirectEnd: number;
          redirectStart: number;
          requestStart: number;
          responseEnd: number;
          responseStart: number;
          type: string;
          unloadEventEnd: number;
          unloadEventStart: number;
      }
      
      declare var PerformanceNavigationTiming: {
          prototype: PerformanceNavigationTiming;
          new(): PerformanceNavigationTiming;
      }
      
      interface PerformanceResourceTiming extends PerformanceEntry {
          connectEnd: number;
          connectStart: number;
          domainLookupEnd: number;
          domainLookupStart: number;
          fetchStart: number;
          initiatorType: string;
          redirectEnd: number;
          redirectStart: number;
          requestStart: number;
          responseEnd: number;
          responseStart: number;
      }
      
      declare var PerformanceResourceTiming: {
          prototype: PerformanceResourceTiming;
          new(): PerformanceResourceTiming;
      }
      
      interface PerformanceTiming {
          connectEnd: number;
          connectStart: number;
          domComplete: number;
          domContentLoadedEventEnd: number;
          domContentLoadedEventStart: number;
          domInteractive: number;
          domLoading: number;
          domainLookupEnd: number;
          domainLookupStart: number;
          fetchStart: number;
          loadEventEnd: number;
          loadEventStart: number;
          msFirstPaint: number;
          navigationStart: number;
          redirectEnd: number;
          redirectStart: number;
          requestStart: number;
          responseEnd: number;
          responseStart: number;
          unloadEventEnd: number;
          unloadEventStart: number;
          toJSON(): any;
      }
      
      declare var PerformanceTiming: {
          prototype: PerformanceTiming;
          new(): PerformanceTiming;
      }
      
      interface PeriodicWave {
      }
      
      declare var PeriodicWave: {
          prototype: PeriodicWave;
          new(): PeriodicWave;
      }
      
      interface PermissionRequest extends DeferredPermissionRequest {
          state: string;
          defer(): void;
      }
      
      declare var PermissionRequest: {
          prototype: PermissionRequest;
          new(): PermissionRequest;
      }
      
      interface PermissionRequestedEvent extends Event {
          permissionRequest: PermissionRequest;
      }
      
      declare var PermissionRequestedEvent: {
          prototype: PermissionRequestedEvent;
          new(): PermissionRequestedEvent;
      }
      
      interface Plugin {
          description: string;
          filename: string;
          length: number;
          name: string;
          version: string;
          item(index: number): MimeType;
          namedItem(type: string): MimeType;
          [index: number]: MimeType;
      }
      
      declare var Plugin: {
          prototype: Plugin;
          new(): Plugin;
      }
      
      interface PluginArray {
          length: number;
          item(index: number): Plugin;
          namedItem(name: string): Plugin;
          refresh(reload?: boolean): void;
          [index: number]: Plugin;
      }
      
      declare var PluginArray: {
          prototype: PluginArray;
          new(): PluginArray;
      }
      
      interface PointerEvent extends MouseEvent {
          currentPoint: any;
          height: number;
          hwTimestamp: number;
          intermediatePoints: any;
          isPrimary: boolean;
          pointerId: number;
          pointerType: any;
          pressure: number;
          rotation: number;
          tiltX: number;
          tiltY: number;
          width: number;
          getCurrentPoint(element: Element): void;
          getIntermediatePoints(element: Element): void;
          initPointerEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, ctrlKeyArg: boolean, altKeyArg: boolean, shiftKeyArg: boolean, metaKeyArg: boolean, buttonArg: number, relatedTargetArg: EventTarget, offsetXArg: number, offsetYArg: number, widthArg: number, heightArg: number, pressure: number, rotation: number, tiltX: number, tiltY: number, pointerIdArg: number, pointerType: any, hwTimestampArg: number, isPrimary: boolean): void;
      }
      
      declare var PointerEvent: {
          prototype: PointerEvent;
          new(typeArg: string, eventInitDict?: PointerEventInit): PointerEvent;
      }
      
      interface PopStateEvent extends Event {
          state: any;
          initPopStateEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, stateArg: any): void;
      }
      
      declare var PopStateEvent: {
          prototype: PopStateEvent;
          new(): PopStateEvent;
      }
      
      interface Position {
          coords: Coordinates;
          timestamp: Date;
      }
      
      declare var Position: {
          prototype: Position;
          new(): Position;
      }
      
      interface PositionError {
          code: number;
          message: string;
          toString(): string;
          PERMISSION_DENIED: number;
          POSITION_UNAVAILABLE: number;
          TIMEOUT: number;
      }
      
      declare var PositionError: {
          prototype: PositionError;
          new(): PositionError;
          PERMISSION_DENIED: number;
          POSITION_UNAVAILABLE: number;
          TIMEOUT: number;
      }
      
      interface ProcessingInstruction extends CharacterData {
          target: string;
      }
      
      declare var ProcessingInstruction: {
          prototype: ProcessingInstruction;
          new(): ProcessingInstruction;
      }
      
      interface ProgressEvent extends Event {
          lengthComputable: boolean;
          loaded: number;
          total: number;
          initProgressEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, lengthComputableArg: boolean, loadedArg: number, totalArg: number): void;
      }
      
      declare var ProgressEvent: {
          prototype: ProgressEvent;
          new(): ProgressEvent;
      }
      
      interface Range {
          collapsed: boolean;
          commonAncestorContainer: Node;
          endContainer: Node;
          endOffset: number;
          startContainer: Node;
          startOffset: number;
          cloneContents(): DocumentFragment;
          cloneRange(): Range;
          collapse(toStart: boolean): void;
          compareBoundaryPoints(how: number, sourceRange: Range): number;
          createContextualFragment(fragment: string): DocumentFragment;
          deleteContents(): void;
          detach(): void;
          expand(Unit: string): boolean;
          extractContents(): DocumentFragment;
          getBoundingClientRect(): ClientRect;
          getClientRects(): ClientRectList;
          insertNode(newNode: Node): void;
          selectNode(refNode: Node): void;
          selectNodeContents(refNode: Node): void;
          setEnd(refNode: Node, offset: number): void;
          setEndAfter(refNode: Node): void;
          setEndBefore(refNode: Node): void;
          setStart(refNode: Node, offset: number): void;
          setStartAfter(refNode: Node): void;
          setStartBefore(refNode: Node): void;
          surroundContents(newParent: Node): void;
          toString(): string;
          END_TO_END: number;
          END_TO_START: number;
          START_TO_END: number;
          START_TO_START: number;
      }
      
      declare var Range: {
          prototype: Range;
          new(): Range;
          END_TO_END: number;
          END_TO_START: number;
          START_TO_END: number;
          START_TO_START: number;
      }
      
      interface SVGAElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
          target: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGAElement: {
          prototype: SVGAElement;
          new(): SVGAElement;
      }
      
      interface SVGAngle {
          unitType: number;
          value: number;
          valueAsString: string;
          valueInSpecifiedUnits: number;
          convertToSpecifiedUnits(unitType: number): void;
          newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
          SVG_ANGLETYPE_DEG: number;
          SVG_ANGLETYPE_GRAD: number;
          SVG_ANGLETYPE_RAD: number;
          SVG_ANGLETYPE_UNKNOWN: number;
          SVG_ANGLETYPE_UNSPECIFIED: number;
      }
      
      declare var SVGAngle: {
          prototype: SVGAngle;
          new(): SVGAngle;
          SVG_ANGLETYPE_DEG: number;
          SVG_ANGLETYPE_GRAD: number;
          SVG_ANGLETYPE_RAD: number;
          SVG_ANGLETYPE_UNKNOWN: number;
          SVG_ANGLETYPE_UNSPECIFIED: number;
      }
      
      interface SVGAnimatedAngle {
          animVal: SVGAngle;
          baseVal: SVGAngle;
      }
      
      declare var SVGAnimatedAngle: {
          prototype: SVGAnimatedAngle;
          new(): SVGAnimatedAngle;
      }
      
      interface SVGAnimatedBoolean {
          animVal: boolean;
          baseVal: boolean;
      }
      
      declare var SVGAnimatedBoolean: {
          prototype: SVGAnimatedBoolean;
          new(): SVGAnimatedBoolean;
      }
      
      interface SVGAnimatedEnumeration {
          animVal: number;
          baseVal: number;
      }
      
      declare var SVGAnimatedEnumeration: {
          prototype: SVGAnimatedEnumeration;
          new(): SVGAnimatedEnumeration;
      }
      
      interface SVGAnimatedInteger {
          animVal: number;
          baseVal: number;
      }
      
      declare var SVGAnimatedInteger: {
          prototype: SVGAnimatedInteger;
          new(): SVGAnimatedInteger;
      }
      
      interface SVGAnimatedLength {
          animVal: SVGLength;
          baseVal: SVGLength;
      }
      
      declare var SVGAnimatedLength: {
          prototype: SVGAnimatedLength;
          new(): SVGAnimatedLength;
      }
      
      interface SVGAnimatedLengthList {
          animVal: SVGLengthList;
          baseVal: SVGLengthList;
      }
      
      declare var SVGAnimatedLengthList: {
          prototype: SVGAnimatedLengthList;
          new(): SVGAnimatedLengthList;
      }
      
      interface SVGAnimatedNumber {
          animVal: number;
          baseVal: number;
      }
      
      declare var SVGAnimatedNumber: {
          prototype: SVGAnimatedNumber;
          new(): SVGAnimatedNumber;
      }
      
      interface SVGAnimatedNumberList {
          animVal: SVGNumberList;
          baseVal: SVGNumberList;
      }
      
      declare var SVGAnimatedNumberList: {
          prototype: SVGAnimatedNumberList;
          new(): SVGAnimatedNumberList;
      }
      
      interface SVGAnimatedPreserveAspectRatio {
          animVal: SVGPreserveAspectRatio;
          baseVal: SVGPreserveAspectRatio;
      }
      
      declare var SVGAnimatedPreserveAspectRatio: {
          prototype: SVGAnimatedPreserveAspectRatio;
          new(): SVGAnimatedPreserveAspectRatio;
      }
      
      interface SVGAnimatedRect {
          animVal: SVGRect;
          baseVal: SVGRect;
      }
      
      declare var SVGAnimatedRect: {
          prototype: SVGAnimatedRect;
          new(): SVGAnimatedRect;
      }
      
      interface SVGAnimatedString {
          animVal: string;
          baseVal: string;
      }
      
      declare var SVGAnimatedString: {
          prototype: SVGAnimatedString;
          new(): SVGAnimatedString;
      }
      
      interface SVGAnimatedTransformList {
          animVal: SVGTransformList;
          baseVal: SVGTransformList;
      }
      
      declare var SVGAnimatedTransformList: {
          prototype: SVGAnimatedTransformList;
          new(): SVGAnimatedTransformList;
      }
      
      interface SVGCircleElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          cx: SVGAnimatedLength;
          cy: SVGAnimatedLength;
          r: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGCircleElement: {
          prototype: SVGCircleElement;
          new(): SVGCircleElement;
      }
      
      interface SVGClipPathElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGUnitTypes {
          clipPathUnits: SVGAnimatedEnumeration;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGClipPathElement: {
          prototype: SVGClipPathElement;
          new(): SVGClipPathElement;
      }
      
      interface SVGComponentTransferFunctionElement extends SVGElement {
          amplitude: SVGAnimatedNumber;
          exponent: SVGAnimatedNumber;
          intercept: SVGAnimatedNumber;
          offset: SVGAnimatedNumber;
          slope: SVGAnimatedNumber;
          tableValues: SVGAnimatedNumberList;
          type: SVGAnimatedEnumeration;
          SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
          SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
          SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
          SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
      }
      
      declare var SVGComponentTransferFunctionElement: {
          prototype: SVGComponentTransferFunctionElement;
          new(): SVGComponentTransferFunctionElement;
          SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_GAMMA: number;
          SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY: number;
          SVG_FECOMPONENTTRANSFER_TYPE_LINEAR: number;
          SVG_FECOMPONENTTRANSFER_TYPE_TABLE: number;
          SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN: number;
      }
      
      interface SVGDefsElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGDefsElement: {
          prototype: SVGDefsElement;
          new(): SVGDefsElement;
      }
      
      interface SVGDescElement extends SVGElement, SVGStylable, SVGLangSpace {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGDescElement: {
          prototype: SVGDescElement;
          new(): SVGDescElement;
      }
      
      interface SVGElement extends Element {
          id: string;
          onclick: (ev: MouseEvent) => any;
          ondblclick: (ev: MouseEvent) => any;
          onfocusin: (ev: FocusEvent) => any;
          onfocusout: (ev: FocusEvent) => any;
          onload: (ev: Event) => any;
          onmousedown: (ev: MouseEvent) => any;
          onmousemove: (ev: MouseEvent) => any;
          onmouseout: (ev: MouseEvent) => any;
          onmouseover: (ev: MouseEvent) => any;
          onmouseup: (ev: MouseEvent) => any;
          ownerSVGElement: SVGSVGElement;
          viewportElement: SVGElement;
          xmlbase: string;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusin", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusout", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGElement: {
          prototype: SVGElement;
          new(): SVGElement;
      }
      
      interface SVGElementInstance extends EventTarget {
          childNodes: SVGElementInstanceList;
          correspondingElement: SVGElement;
          correspondingUseElement: SVGUseElement;
          firstChild: SVGElementInstance;
          lastChild: SVGElementInstance;
          nextSibling: SVGElementInstance;
          parentNode: SVGElementInstance;
          previousSibling: SVGElementInstance;
      }
      
      declare var SVGElementInstance: {
          prototype: SVGElementInstance;
          new(): SVGElementInstance;
      }
      
      interface SVGElementInstanceList {
          length: number;
          item(index: number): SVGElementInstance;
      }
      
      declare var SVGElementInstanceList: {
          prototype: SVGElementInstanceList;
          new(): SVGElementInstanceList;
      }
      
      interface SVGEllipseElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          cx: SVGAnimatedLength;
          cy: SVGAnimatedLength;
          rx: SVGAnimatedLength;
          ry: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGEllipseElement: {
          prototype: SVGEllipseElement;
          new(): SVGEllipseElement;
      }
      
      interface SVGFEBlendElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          in2: SVGAnimatedString;
          mode: SVGAnimatedEnumeration;
          SVG_FEBLEND_MODE_COLOR: number;
          SVG_FEBLEND_MODE_COLOR_BURN: number;
          SVG_FEBLEND_MODE_COLOR_DODGE: number;
          SVG_FEBLEND_MODE_DARKEN: number;
          SVG_FEBLEND_MODE_DIFFERENCE: number;
          SVG_FEBLEND_MODE_EXCLUSION: number;
          SVG_FEBLEND_MODE_HARD_LIGHT: number;
          SVG_FEBLEND_MODE_HUE: number;
          SVG_FEBLEND_MODE_LIGHTEN: number;
          SVG_FEBLEND_MODE_LUMINOSITY: number;
          SVG_FEBLEND_MODE_MULTIPLY: number;
          SVG_FEBLEND_MODE_NORMAL: number;
          SVG_FEBLEND_MODE_OVERLAY: number;
          SVG_FEBLEND_MODE_SATURATION: number;
          SVG_FEBLEND_MODE_SCREEN: number;
          SVG_FEBLEND_MODE_SOFT_LIGHT: number;
          SVG_FEBLEND_MODE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEBlendElement: {
          prototype: SVGFEBlendElement;
          new(): SVGFEBlendElement;
          SVG_FEBLEND_MODE_COLOR: number;
          SVG_FEBLEND_MODE_COLOR_BURN: number;
          SVG_FEBLEND_MODE_COLOR_DODGE: number;
          SVG_FEBLEND_MODE_DARKEN: number;
          SVG_FEBLEND_MODE_DIFFERENCE: number;
          SVG_FEBLEND_MODE_EXCLUSION: number;
          SVG_FEBLEND_MODE_HARD_LIGHT: number;
          SVG_FEBLEND_MODE_HUE: number;
          SVG_FEBLEND_MODE_LIGHTEN: number;
          SVG_FEBLEND_MODE_LUMINOSITY: number;
          SVG_FEBLEND_MODE_MULTIPLY: number;
          SVG_FEBLEND_MODE_NORMAL: number;
          SVG_FEBLEND_MODE_OVERLAY: number;
          SVG_FEBLEND_MODE_SATURATION: number;
          SVG_FEBLEND_MODE_SCREEN: number;
          SVG_FEBLEND_MODE_SOFT_LIGHT: number;
          SVG_FEBLEND_MODE_UNKNOWN: number;
      }
      
      interface SVGFEColorMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          type: SVGAnimatedEnumeration;
          values: SVGAnimatedNumberList;
          SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
          SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
          SVG_FECOLORMATRIX_TYPE_MATRIX: number;
          SVG_FECOLORMATRIX_TYPE_SATURATE: number;
          SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEColorMatrixElement: {
          prototype: SVGFEColorMatrixElement;
          new(): SVGFEColorMatrixElement;
          SVG_FECOLORMATRIX_TYPE_HUEROTATE: number;
          SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: number;
          SVG_FECOLORMATRIX_TYPE_MATRIX: number;
          SVG_FECOLORMATRIX_TYPE_SATURATE: number;
          SVG_FECOLORMATRIX_TYPE_UNKNOWN: number;
      }
      
      interface SVGFEComponentTransferElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEComponentTransferElement: {
          prototype: SVGFEComponentTransferElement;
          new(): SVGFEComponentTransferElement;
      }
      
      interface SVGFECompositeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          in2: SVGAnimatedString;
          k1: SVGAnimatedNumber;
          k2: SVGAnimatedNumber;
          k3: SVGAnimatedNumber;
          k4: SVGAnimatedNumber;
          operator: SVGAnimatedEnumeration;
          SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
          SVG_FECOMPOSITE_OPERATOR_ATOP: number;
          SVG_FECOMPOSITE_OPERATOR_IN: number;
          SVG_FECOMPOSITE_OPERATOR_OUT: number;
          SVG_FECOMPOSITE_OPERATOR_OVER: number;
          SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
          SVG_FECOMPOSITE_OPERATOR_XOR: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFECompositeElement: {
          prototype: SVGFECompositeElement;
          new(): SVGFECompositeElement;
          SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: number;
          SVG_FECOMPOSITE_OPERATOR_ATOP: number;
          SVG_FECOMPOSITE_OPERATOR_IN: number;
          SVG_FECOMPOSITE_OPERATOR_OUT: number;
          SVG_FECOMPOSITE_OPERATOR_OVER: number;
          SVG_FECOMPOSITE_OPERATOR_UNKNOWN: number;
          SVG_FECOMPOSITE_OPERATOR_XOR: number;
      }
      
      interface SVGFEConvolveMatrixElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          bias: SVGAnimatedNumber;
          divisor: SVGAnimatedNumber;
          edgeMode: SVGAnimatedEnumeration;
          in1: SVGAnimatedString;
          kernelMatrix: SVGAnimatedNumberList;
          kernelUnitLengthX: SVGAnimatedNumber;
          kernelUnitLengthY: SVGAnimatedNumber;
          orderX: SVGAnimatedInteger;
          orderY: SVGAnimatedInteger;
          preserveAlpha: SVGAnimatedBoolean;
          targetX: SVGAnimatedInteger;
          targetY: SVGAnimatedInteger;
          SVG_EDGEMODE_DUPLICATE: number;
          SVG_EDGEMODE_NONE: number;
          SVG_EDGEMODE_UNKNOWN: number;
          SVG_EDGEMODE_WRAP: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEConvolveMatrixElement: {
          prototype: SVGFEConvolveMatrixElement;
          new(): SVGFEConvolveMatrixElement;
          SVG_EDGEMODE_DUPLICATE: number;
          SVG_EDGEMODE_NONE: number;
          SVG_EDGEMODE_UNKNOWN: number;
          SVG_EDGEMODE_WRAP: number;
      }
      
      interface SVGFEDiffuseLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          diffuseConstant: SVGAnimatedNumber;
          in1: SVGAnimatedString;
          kernelUnitLengthX: SVGAnimatedNumber;
          kernelUnitLengthY: SVGAnimatedNumber;
          surfaceScale: SVGAnimatedNumber;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEDiffuseLightingElement: {
          prototype: SVGFEDiffuseLightingElement;
          new(): SVGFEDiffuseLightingElement;
      }
      
      interface SVGFEDisplacementMapElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          in2: SVGAnimatedString;
          scale: SVGAnimatedNumber;
          xChannelSelector: SVGAnimatedEnumeration;
          yChannelSelector: SVGAnimatedEnumeration;
          SVG_CHANNEL_A: number;
          SVG_CHANNEL_B: number;
          SVG_CHANNEL_G: number;
          SVG_CHANNEL_R: number;
          SVG_CHANNEL_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEDisplacementMapElement: {
          prototype: SVGFEDisplacementMapElement;
          new(): SVGFEDisplacementMapElement;
          SVG_CHANNEL_A: number;
          SVG_CHANNEL_B: number;
          SVG_CHANNEL_G: number;
          SVG_CHANNEL_R: number;
          SVG_CHANNEL_UNKNOWN: number;
      }
      
      interface SVGFEDistantLightElement extends SVGElement {
          azimuth: SVGAnimatedNumber;
          elevation: SVGAnimatedNumber;
      }
      
      declare var SVGFEDistantLightElement: {
          prototype: SVGFEDistantLightElement;
          new(): SVGFEDistantLightElement;
      }
      
      interface SVGFEFloodElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEFloodElement: {
          prototype: SVGFEFloodElement;
          new(): SVGFEFloodElement;
      }
      
      interface SVGFEFuncAElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncAElement: {
          prototype: SVGFEFuncAElement;
          new(): SVGFEFuncAElement;
      }
      
      interface SVGFEFuncBElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncBElement: {
          prototype: SVGFEFuncBElement;
          new(): SVGFEFuncBElement;
      }
      
      interface SVGFEFuncGElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncGElement: {
          prototype: SVGFEFuncGElement;
          new(): SVGFEFuncGElement;
      }
      
      interface SVGFEFuncRElement extends SVGComponentTransferFunctionElement {
      }
      
      declare var SVGFEFuncRElement: {
          prototype: SVGFEFuncRElement;
          new(): SVGFEFuncRElement;
      }
      
      interface SVGFEGaussianBlurElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          stdDeviationX: SVGAnimatedNumber;
          stdDeviationY: SVGAnimatedNumber;
          setStdDeviation(stdDeviationX: number, stdDeviationY: number): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEGaussianBlurElement: {
          prototype: SVGFEGaussianBlurElement;
          new(): SVGFEGaussianBlurElement;
      }
      
      interface SVGFEImageElement extends SVGElement, SVGFilterPrimitiveStandardAttributes, SVGLangSpace, SVGURIReference, SVGExternalResourcesRequired {
          preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEImageElement: {
          prototype: SVGFEImageElement;
          new(): SVGFEImageElement;
      }
      
      interface SVGFEMergeElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEMergeElement: {
          prototype: SVGFEMergeElement;
          new(): SVGFEMergeElement;
      }
      
      interface SVGFEMergeNodeElement extends SVGElement {
          in1: SVGAnimatedString;
      }
      
      declare var SVGFEMergeNodeElement: {
          prototype: SVGFEMergeNodeElement;
          new(): SVGFEMergeNodeElement;
      }
      
      interface SVGFEMorphologyElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          operator: SVGAnimatedEnumeration;
          radiusX: SVGAnimatedNumber;
          radiusY: SVGAnimatedNumber;
          SVG_MORPHOLOGY_OPERATOR_DILATE: number;
          SVG_MORPHOLOGY_OPERATOR_ERODE: number;
          SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEMorphologyElement: {
          prototype: SVGFEMorphologyElement;
          new(): SVGFEMorphologyElement;
          SVG_MORPHOLOGY_OPERATOR_DILATE: number;
          SVG_MORPHOLOGY_OPERATOR_ERODE: number;
          SVG_MORPHOLOGY_OPERATOR_UNKNOWN: number;
      }
      
      interface SVGFEOffsetElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          dx: SVGAnimatedNumber;
          dy: SVGAnimatedNumber;
          in1: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFEOffsetElement: {
          prototype: SVGFEOffsetElement;
          new(): SVGFEOffsetElement;
      }
      
      interface SVGFEPointLightElement extends SVGElement {
          x: SVGAnimatedNumber;
          y: SVGAnimatedNumber;
          z: SVGAnimatedNumber;
      }
      
      declare var SVGFEPointLightElement: {
          prototype: SVGFEPointLightElement;
          new(): SVGFEPointLightElement;
      }
      
      interface SVGFESpecularLightingElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          kernelUnitLengthX: SVGAnimatedNumber;
          kernelUnitLengthY: SVGAnimatedNumber;
          specularConstant: SVGAnimatedNumber;
          specularExponent: SVGAnimatedNumber;
          surfaceScale: SVGAnimatedNumber;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFESpecularLightingElement: {
          prototype: SVGFESpecularLightingElement;
          new(): SVGFESpecularLightingElement;
      }
      
      interface SVGFESpotLightElement extends SVGElement {
          limitingConeAngle: SVGAnimatedNumber;
          pointsAtX: SVGAnimatedNumber;
          pointsAtY: SVGAnimatedNumber;
          pointsAtZ: SVGAnimatedNumber;
          specularExponent: SVGAnimatedNumber;
          x: SVGAnimatedNumber;
          y: SVGAnimatedNumber;
          z: SVGAnimatedNumber;
      }
      
      declare var SVGFESpotLightElement: {
          prototype: SVGFESpotLightElement;
          new(): SVGFESpotLightElement;
      }
      
      interface SVGFETileElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          in1: SVGAnimatedString;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFETileElement: {
          prototype: SVGFETileElement;
          new(): SVGFETileElement;
      }
      
      interface SVGFETurbulenceElement extends SVGElement, SVGFilterPrimitiveStandardAttributes {
          baseFrequencyX: SVGAnimatedNumber;
          baseFrequencyY: SVGAnimatedNumber;
          numOctaves: SVGAnimatedInteger;
          seed: SVGAnimatedNumber;
          stitchTiles: SVGAnimatedEnumeration;
          type: SVGAnimatedEnumeration;
          SVG_STITCHTYPE_NOSTITCH: number;
          SVG_STITCHTYPE_STITCH: number;
          SVG_STITCHTYPE_UNKNOWN: number;
          SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
          SVG_TURBULENCE_TYPE_TURBULENCE: number;
          SVG_TURBULENCE_TYPE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFETurbulenceElement: {
          prototype: SVGFETurbulenceElement;
          new(): SVGFETurbulenceElement;
          SVG_STITCHTYPE_NOSTITCH: number;
          SVG_STITCHTYPE_STITCH: number;
          SVG_STITCHTYPE_UNKNOWN: number;
          SVG_TURBULENCE_TYPE_FRACTALNOISE: number;
          SVG_TURBULENCE_TYPE_TURBULENCE: number;
          SVG_TURBULENCE_TYPE_UNKNOWN: number;
      }
      
      interface SVGFilterElement extends SVGElement, SVGUnitTypes, SVGStylable, SVGLangSpace, SVGURIReference, SVGExternalResourcesRequired {
          filterResX: SVGAnimatedInteger;
          filterResY: SVGAnimatedInteger;
          filterUnits: SVGAnimatedEnumeration;
          height: SVGAnimatedLength;
          primitiveUnits: SVGAnimatedEnumeration;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          setFilterRes(filterResX: number, filterResY: number): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGFilterElement: {
          prototype: SVGFilterElement;
          new(): SVGFilterElement;
      }
      
      interface SVGForeignObjectElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          height: SVGAnimatedLength;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGForeignObjectElement: {
          prototype: SVGForeignObjectElement;
          new(): SVGForeignObjectElement;
      }
      
      interface SVGGElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGGElement: {
          prototype: SVGGElement;
          new(): SVGGElement;
      }
      
      interface SVGGradientElement extends SVGElement, SVGStylable, SVGExternalResourcesRequired, SVGURIReference, SVGUnitTypes {
          gradientTransform: SVGAnimatedTransformList;
          gradientUnits: SVGAnimatedEnumeration;
          spreadMethod: SVGAnimatedEnumeration;
          SVG_SPREADMETHOD_PAD: number;
          SVG_SPREADMETHOD_REFLECT: number;
          SVG_SPREADMETHOD_REPEAT: number;
          SVG_SPREADMETHOD_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGGradientElement: {
          prototype: SVGGradientElement;
          new(): SVGGradientElement;
          SVG_SPREADMETHOD_PAD: number;
          SVG_SPREADMETHOD_REFLECT: number;
          SVG_SPREADMETHOD_REPEAT: number;
          SVG_SPREADMETHOD_UNKNOWN: number;
      }
      
      interface SVGImageElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
          height: SVGAnimatedLength;
          preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGImageElement: {
          prototype: SVGImageElement;
          new(): SVGImageElement;
      }
      
      interface SVGLength {
          unitType: number;
          value: number;
          valueAsString: string;
          valueInSpecifiedUnits: number;
          convertToSpecifiedUnits(unitType: number): void;
          newValueSpecifiedUnits(unitType: number, valueInSpecifiedUnits: number): void;
          SVG_LENGTHTYPE_CM: number;
          SVG_LENGTHTYPE_EMS: number;
          SVG_LENGTHTYPE_EXS: number;
          SVG_LENGTHTYPE_IN: number;
          SVG_LENGTHTYPE_MM: number;
          SVG_LENGTHTYPE_NUMBER: number;
          SVG_LENGTHTYPE_PC: number;
          SVG_LENGTHTYPE_PERCENTAGE: number;
          SVG_LENGTHTYPE_PT: number;
          SVG_LENGTHTYPE_PX: number;
          SVG_LENGTHTYPE_UNKNOWN: number;
      }
      
      declare var SVGLength: {
          prototype: SVGLength;
          new(): SVGLength;
          SVG_LENGTHTYPE_CM: number;
          SVG_LENGTHTYPE_EMS: number;
          SVG_LENGTHTYPE_EXS: number;
          SVG_LENGTHTYPE_IN: number;
          SVG_LENGTHTYPE_MM: number;
          SVG_LENGTHTYPE_NUMBER: number;
          SVG_LENGTHTYPE_PC: number;
          SVG_LENGTHTYPE_PERCENTAGE: number;
          SVG_LENGTHTYPE_PT: number;
          SVG_LENGTHTYPE_PX: number;
          SVG_LENGTHTYPE_UNKNOWN: number;
      }
      
      interface SVGLengthList {
          numberOfItems: number;
          appendItem(newItem: SVGLength): SVGLength;
          clear(): void;
          getItem(index: number): SVGLength;
          initialize(newItem: SVGLength): SVGLength;
          insertItemBefore(newItem: SVGLength, index: number): SVGLength;
          removeItem(index: number): SVGLength;
          replaceItem(newItem: SVGLength, index: number): SVGLength;
      }
      
      declare var SVGLengthList: {
          prototype: SVGLengthList;
          new(): SVGLengthList;
      }
      
      interface SVGLineElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          x1: SVGAnimatedLength;
          x2: SVGAnimatedLength;
          y1: SVGAnimatedLength;
          y2: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGLineElement: {
          prototype: SVGLineElement;
          new(): SVGLineElement;
      }
      
      interface SVGLinearGradientElement extends SVGGradientElement {
          x1: SVGAnimatedLength;
          x2: SVGAnimatedLength;
          y1: SVGAnimatedLength;
          y2: SVGAnimatedLength;
      }
      
      declare var SVGLinearGradientElement: {
          prototype: SVGLinearGradientElement;
          new(): SVGLinearGradientElement;
      }
      
      interface SVGMarkerElement extends SVGElement, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox {
          markerHeight: SVGAnimatedLength;
          markerUnits: SVGAnimatedEnumeration;
          markerWidth: SVGAnimatedLength;
          orientAngle: SVGAnimatedAngle;
          orientType: SVGAnimatedEnumeration;
          refX: SVGAnimatedLength;
          refY: SVGAnimatedLength;
          setOrientToAngle(angle: SVGAngle): void;
          setOrientToAuto(): void;
          SVG_MARKERUNITS_STROKEWIDTH: number;
          SVG_MARKERUNITS_UNKNOWN: number;
          SVG_MARKERUNITS_USERSPACEONUSE: number;
          SVG_MARKER_ORIENT_ANGLE: number;
          SVG_MARKER_ORIENT_AUTO: number;
          SVG_MARKER_ORIENT_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGMarkerElement: {
          prototype: SVGMarkerElement;
          new(): SVGMarkerElement;
          SVG_MARKERUNITS_STROKEWIDTH: number;
          SVG_MARKERUNITS_UNKNOWN: number;
          SVG_MARKERUNITS_USERSPACEONUSE: number;
          SVG_MARKER_ORIENT_ANGLE: number;
          SVG_MARKER_ORIENT_AUTO: number;
          SVG_MARKER_ORIENT_UNKNOWN: number;
      }
      
      interface SVGMaskElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGUnitTypes {
          height: SVGAnimatedLength;
          maskContentUnits: SVGAnimatedEnumeration;
          maskUnits: SVGAnimatedEnumeration;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGMaskElement: {
          prototype: SVGMaskElement;
          new(): SVGMaskElement;
      }
      
      interface SVGMatrix {
          a: number;
          b: number;
          c: number;
          d: number;
          e: number;
          f: number;
          flipX(): SVGMatrix;
          flipY(): SVGMatrix;
          inverse(): SVGMatrix;
          multiply(secondMatrix: SVGMatrix): SVGMatrix;
          rotate(angle: number): SVGMatrix;
          rotateFromVector(x: number, y: number): SVGMatrix;
          scale(scaleFactor: number): SVGMatrix;
          scaleNonUniform(scaleFactorX: number, scaleFactorY: number): SVGMatrix;
          skewX(angle: number): SVGMatrix;
          skewY(angle: number): SVGMatrix;
          translate(x: number, y: number): SVGMatrix;
      }
      
      declare var SVGMatrix: {
          prototype: SVGMatrix;
          new(): SVGMatrix;
      }
      
      interface SVGMetadataElement extends SVGElement {
      }
      
      declare var SVGMetadataElement: {
          prototype: SVGMetadataElement;
          new(): SVGMetadataElement;
      }
      
      interface SVGNumber {
          value: number;
      }
      
      declare var SVGNumber: {
          prototype: SVGNumber;
          new(): SVGNumber;
      }
      
      interface SVGNumberList {
          numberOfItems: number;
          appendItem(newItem: SVGNumber): SVGNumber;
          clear(): void;
          getItem(index: number): SVGNumber;
          initialize(newItem: SVGNumber): SVGNumber;
          insertItemBefore(newItem: SVGNumber, index: number): SVGNumber;
          removeItem(index: number): SVGNumber;
          replaceItem(newItem: SVGNumber, index: number): SVGNumber;
      }
      
      declare var SVGNumberList: {
          prototype: SVGNumberList;
          new(): SVGNumberList;
      }
      
      interface SVGPathElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPathData {
          createSVGPathSegArcAbs(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcAbs;
          createSVGPathSegArcRel(x: number, y: number, r1: number, r2: number, angle: number, largeArcFlag: boolean, sweepFlag: boolean): SVGPathSegArcRel;
          createSVGPathSegClosePath(): SVGPathSegClosePath;
          createSVGPathSegCurvetoCubicAbs(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicAbs;
          createSVGPathSegCurvetoCubicRel(x: number, y: number, x1: number, y1: number, x2: number, y2: number): SVGPathSegCurvetoCubicRel;
          createSVGPathSegCurvetoCubicSmoothAbs(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothAbs;
          createSVGPathSegCurvetoCubicSmoothRel(x: number, y: number, x2: number, y2: number): SVGPathSegCurvetoCubicSmoothRel;
          createSVGPathSegCurvetoQuadraticAbs(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticAbs;
          createSVGPathSegCurvetoQuadraticRel(x: number, y: number, x1: number, y1: number): SVGPathSegCurvetoQuadraticRel;
          createSVGPathSegCurvetoQuadraticSmoothAbs(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothAbs;
          createSVGPathSegCurvetoQuadraticSmoothRel(x: number, y: number): SVGPathSegCurvetoQuadraticSmoothRel;
          createSVGPathSegLinetoAbs(x: number, y: number): SVGPathSegLinetoAbs;
          createSVGPathSegLinetoHorizontalAbs(x: number): SVGPathSegLinetoHorizontalAbs;
          createSVGPathSegLinetoHorizontalRel(x: number): SVGPathSegLinetoHorizontalRel;
          createSVGPathSegLinetoRel(x: number, y: number): SVGPathSegLinetoRel;
          createSVGPathSegLinetoVerticalAbs(y: number): SVGPathSegLinetoVerticalAbs;
          createSVGPathSegLinetoVerticalRel(y: number): SVGPathSegLinetoVerticalRel;
          createSVGPathSegMovetoAbs(x: number, y: number): SVGPathSegMovetoAbs;
          createSVGPathSegMovetoRel(x: number, y: number): SVGPathSegMovetoRel;
          getPathSegAtLength(distance: number): number;
          getPointAtLength(distance: number): SVGPoint;
          getTotalLength(): number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPathElement: {
          prototype: SVGPathElement;
          new(): SVGPathElement;
      }
      
      interface SVGPathSeg {
          pathSegType: number;
          pathSegTypeAsLetter: string;
          PATHSEG_ARC_ABS: number;
          PATHSEG_ARC_REL: number;
          PATHSEG_CLOSEPATH: number;
          PATHSEG_CURVETO_CUBIC_ABS: number;
          PATHSEG_CURVETO_CUBIC_REL: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;
          PATHSEG_CURVETO_QUADRATIC_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_REL: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;
          PATHSEG_LINETO_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_REL: number;
          PATHSEG_LINETO_REL: number;
          PATHSEG_LINETO_VERTICAL_ABS: number;
          PATHSEG_LINETO_VERTICAL_REL: number;
          PATHSEG_MOVETO_ABS: number;
          PATHSEG_MOVETO_REL: number;
          PATHSEG_UNKNOWN: number;
      }
      
      declare var SVGPathSeg: {
          prototype: SVGPathSeg;
          new(): SVGPathSeg;
          PATHSEG_ARC_ABS: number;
          PATHSEG_ARC_REL: number;
          PATHSEG_CLOSEPATH: number;
          PATHSEG_CURVETO_CUBIC_ABS: number;
          PATHSEG_CURVETO_CUBIC_REL: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_CUBIC_SMOOTH_REL: number;
          PATHSEG_CURVETO_QUADRATIC_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_REL: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: number;
          PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: number;
          PATHSEG_LINETO_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_ABS: number;
          PATHSEG_LINETO_HORIZONTAL_REL: number;
          PATHSEG_LINETO_REL: number;
          PATHSEG_LINETO_VERTICAL_ABS: number;
          PATHSEG_LINETO_VERTICAL_REL: number;
          PATHSEG_MOVETO_ABS: number;
          PATHSEG_MOVETO_REL: number;
          PATHSEG_UNKNOWN: number;
      }
      
      interface SVGPathSegArcAbs extends SVGPathSeg {
          angle: number;
          largeArcFlag: boolean;
          r1: number;
          r2: number;
          sweepFlag: boolean;
          x: number;
          y: number;
      }
      
      declare var SVGPathSegArcAbs: {
          prototype: SVGPathSegArcAbs;
          new(): SVGPathSegArcAbs;
      }
      
      interface SVGPathSegArcRel extends SVGPathSeg {
          angle: number;
          largeArcFlag: boolean;
          r1: number;
          r2: number;
          sweepFlag: boolean;
          x: number;
          y: number;
      }
      
      declare var SVGPathSegArcRel: {
          prototype: SVGPathSegArcRel;
          new(): SVGPathSegArcRel;
      }
      
      interface SVGPathSegClosePath extends SVGPathSeg {
      }
      
      declare var SVGPathSegClosePath: {
          prototype: SVGPathSegClosePath;
          new(): SVGPathSegClosePath;
      }
      
      interface SVGPathSegCurvetoCubicAbs extends SVGPathSeg {
          x: number;
          x1: number;
          x2: number;
          y: number;
          y1: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicAbs: {
          prototype: SVGPathSegCurvetoCubicAbs;
          new(): SVGPathSegCurvetoCubicAbs;
      }
      
      interface SVGPathSegCurvetoCubicRel extends SVGPathSeg {
          x: number;
          x1: number;
          x2: number;
          y: number;
          y1: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicRel: {
          prototype: SVGPathSegCurvetoCubicRel;
          new(): SVGPathSegCurvetoCubicRel;
      }
      
      interface SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {
          x: number;
          x2: number;
          y: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicSmoothAbs: {
          prototype: SVGPathSegCurvetoCubicSmoothAbs;
          new(): SVGPathSegCurvetoCubicSmoothAbs;
      }
      
      interface SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {
          x: number;
          x2: number;
          y: number;
          y2: number;
      }
      
      declare var SVGPathSegCurvetoCubicSmoothRel: {
          prototype: SVGPathSegCurvetoCubicSmoothRel;
          new(): SVGPathSegCurvetoCubicSmoothRel;
      }
      
      interface SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {
          x: number;
          x1: number;
          y: number;
          y1: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticAbs: {
          prototype: SVGPathSegCurvetoQuadraticAbs;
          new(): SVGPathSegCurvetoQuadraticAbs;
      }
      
      interface SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {
          x: number;
          x1: number;
          y: number;
          y1: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticRel: {
          prototype: SVGPathSegCurvetoQuadraticRel;
          new(): SVGPathSegCurvetoQuadraticRel;
      }
      
      interface SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticSmoothAbs: {
          prototype: SVGPathSegCurvetoQuadraticSmoothAbs;
          new(): SVGPathSegCurvetoQuadraticSmoothAbs;
      }
      
      interface SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegCurvetoQuadraticSmoothRel: {
          prototype: SVGPathSegCurvetoQuadraticSmoothRel;
          new(): SVGPathSegCurvetoQuadraticSmoothRel;
      }
      
      interface SVGPathSegLinetoAbs extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegLinetoAbs: {
          prototype: SVGPathSegLinetoAbs;
          new(): SVGPathSegLinetoAbs;
      }
      
      interface SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {
          x: number;
      }
      
      declare var SVGPathSegLinetoHorizontalAbs: {
          prototype: SVGPathSegLinetoHorizontalAbs;
          new(): SVGPathSegLinetoHorizontalAbs;
      }
      
      interface SVGPathSegLinetoHorizontalRel extends SVGPathSeg {
          x: number;
      }
      
      declare var SVGPathSegLinetoHorizontalRel: {
          prototype: SVGPathSegLinetoHorizontalRel;
          new(): SVGPathSegLinetoHorizontalRel;
      }
      
      interface SVGPathSegLinetoRel extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegLinetoRel: {
          prototype: SVGPathSegLinetoRel;
          new(): SVGPathSegLinetoRel;
      }
      
      interface SVGPathSegLinetoVerticalAbs extends SVGPathSeg {
          y: number;
      }
      
      declare var SVGPathSegLinetoVerticalAbs: {
          prototype: SVGPathSegLinetoVerticalAbs;
          new(): SVGPathSegLinetoVerticalAbs;
      }
      
      interface SVGPathSegLinetoVerticalRel extends SVGPathSeg {
          y: number;
      }
      
      declare var SVGPathSegLinetoVerticalRel: {
          prototype: SVGPathSegLinetoVerticalRel;
          new(): SVGPathSegLinetoVerticalRel;
      }
      
      interface SVGPathSegList {
          numberOfItems: number;
          appendItem(newItem: SVGPathSeg): SVGPathSeg;
          clear(): void;
          getItem(index: number): SVGPathSeg;
          initialize(newItem: SVGPathSeg): SVGPathSeg;
          insertItemBefore(newItem: SVGPathSeg, index: number): SVGPathSeg;
          removeItem(index: number): SVGPathSeg;
          replaceItem(newItem: SVGPathSeg, index: number): SVGPathSeg;
      }
      
      declare var SVGPathSegList: {
          prototype: SVGPathSegList;
          new(): SVGPathSegList;
      }
      
      interface SVGPathSegMovetoAbs extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegMovetoAbs: {
          prototype: SVGPathSegMovetoAbs;
          new(): SVGPathSegMovetoAbs;
      }
      
      interface SVGPathSegMovetoRel extends SVGPathSeg {
          x: number;
          y: number;
      }
      
      declare var SVGPathSegMovetoRel: {
          prototype: SVGPathSegMovetoRel;
          new(): SVGPathSegMovetoRel;
      }
      
      interface SVGPatternElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox, SVGURIReference, SVGUnitTypes {
          height: SVGAnimatedLength;
          patternContentUnits: SVGAnimatedEnumeration;
          patternTransform: SVGAnimatedTransformList;
          patternUnits: SVGAnimatedEnumeration;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPatternElement: {
          prototype: SVGPatternElement;
          new(): SVGPatternElement;
      }
      
      interface SVGPoint {
          x: number;
          y: number;
          matrixTransform(matrix: SVGMatrix): SVGPoint;
      }
      
      declare var SVGPoint: {
          prototype: SVGPoint;
          new(): SVGPoint;
      }
      
      interface SVGPointList {
          numberOfItems: number;
          appendItem(newItem: SVGPoint): SVGPoint;
          clear(): void;
          getItem(index: number): SVGPoint;
          initialize(newItem: SVGPoint): SVGPoint;
          insertItemBefore(newItem: SVGPoint, index: number): SVGPoint;
          removeItem(index: number): SVGPoint;
          replaceItem(newItem: SVGPoint, index: number): SVGPoint;
      }
      
      declare var SVGPointList: {
          prototype: SVGPointList;
          new(): SVGPointList;
      }
      
      interface SVGPolygonElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPoints {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPolygonElement: {
          prototype: SVGPolygonElement;
          new(): SVGPolygonElement;
      }
      
      interface SVGPolylineElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGAnimatedPoints {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGPolylineElement: {
          prototype: SVGPolylineElement;
          new(): SVGPolylineElement;
      }
      
      interface SVGPreserveAspectRatio {
          align: number;
          meetOrSlice: number;
          SVG_MEETORSLICE_MEET: number;
          SVG_MEETORSLICE_SLICE: number;
          SVG_MEETORSLICE_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_NONE: number;
          SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMINYMID: number;
          SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
      }
      
      declare var SVGPreserveAspectRatio: {
          prototype: SVGPreserveAspectRatio;
          new(): SVGPreserveAspectRatio;
          SVG_MEETORSLICE_MEET: number;
          SVG_MEETORSLICE_SLICE: number;
          SVG_MEETORSLICE_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_NONE: number;
          SVG_PRESERVEASPECTRATIO_UNKNOWN: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMID: number;
          SVG_PRESERVEASPECTRATIO_XMAXYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMID: number;
          SVG_PRESERVEASPECTRATIO_XMIDYMIN: number;
          SVG_PRESERVEASPECTRATIO_XMINYMAX: number;
          SVG_PRESERVEASPECTRATIO_XMINYMID: number;
          SVG_PRESERVEASPECTRATIO_XMINYMIN: number;
      }
      
      interface SVGRadialGradientElement extends SVGGradientElement {
          cx: SVGAnimatedLength;
          cy: SVGAnimatedLength;
          fx: SVGAnimatedLength;
          fy: SVGAnimatedLength;
          r: SVGAnimatedLength;
      }
      
      declare var SVGRadialGradientElement: {
          prototype: SVGRadialGradientElement;
          new(): SVGRadialGradientElement;
      }
      
      interface SVGRect {
          height: number;
          width: number;
          x: number;
          y: number;
      }
      
      declare var SVGRect: {
          prototype: SVGRect;
          new(): SVGRect;
      }
      
      interface SVGRectElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          height: SVGAnimatedLength;
          rx: SVGAnimatedLength;
          ry: SVGAnimatedLength;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGRectElement: {
          prototype: SVGRectElement;
          new(): SVGRectElement;
      }
      
      interface SVGSVGElement extends SVGElement, DocumentEvent, SVGLocatable, SVGTests, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
          contentScriptType: string;
          contentStyleType: string;
          currentScale: number;
          currentTranslate: SVGPoint;
          height: SVGAnimatedLength;
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onresize: (ev: UIEvent) => any;
          onscroll: (ev: UIEvent) => any;
          onunload: (ev: Event) => any;
          onzoom: (ev: SVGZoomEvent) => any;
          pixelUnitToMillimeterX: number;
          pixelUnitToMillimeterY: number;
          screenPixelToMillimeterX: number;
          screenPixelToMillimeterY: number;
          viewport: SVGRect;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          checkEnclosure(element: SVGElement, rect: SVGRect): boolean;
          checkIntersection(element: SVGElement, rect: SVGRect): boolean;
          createSVGAngle(): SVGAngle;
          createSVGLength(): SVGLength;
          createSVGMatrix(): SVGMatrix;
          createSVGNumber(): SVGNumber;
          createSVGPoint(): SVGPoint;
          createSVGRect(): SVGRect;
          createSVGTransform(): SVGTransform;
          createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;
          deselectAll(): void;
          forceRedraw(): void;
          getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
          getCurrentTime(): number;
          getElementById(elementId: string): Element;
          getEnclosureList(rect: SVGRect, referenceElement: SVGElement): NodeList;
          getIntersectionList(rect: SVGRect, referenceElement: SVGElement): NodeList;
          pauseAnimations(): void;
          setCurrentTime(seconds: number): void;
          suspendRedraw(maxWaitMilliseconds: number): number;
          unpauseAnimations(): void;
          unsuspendRedraw(suspendHandleID: number): void;
          unsuspendRedrawAll(): void;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGotPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSLostPointerCapture", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGAbort", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGError", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGUnload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "SVGZoom", listener: (ev: SVGZoomEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ariarequest", listener: (ev: AriaRequestEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "command", listener: (ev: CommandEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusin", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "focusout", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "gotpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "lostpointercapture", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchcancel", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchend", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchmove", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "touchstart", listener: (ev: TouchEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "webkitfullscreenerror", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGSVGElement: {
          prototype: SVGSVGElement;
          new(): SVGSVGElement;
      }
      
      interface SVGScriptElement extends SVGElement, SVGExternalResourcesRequired, SVGURIReference {
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGScriptElement: {
          prototype: SVGScriptElement;
          new(): SVGScriptElement;
      }
      
      interface SVGStopElement extends SVGElement, SVGStylable {
          offset: SVGAnimatedNumber;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGStopElement: {
          prototype: SVGStopElement;
          new(): SVGStopElement;
      }
      
      interface SVGStringList {
          numberOfItems: number;
          appendItem(newItem: string): string;
          clear(): void;
          getItem(index: number): string;
          initialize(newItem: string): string;
          insertItemBefore(newItem: string, index: number): string;
          removeItem(index: number): string;
          replaceItem(newItem: string, index: number): string;
      }
      
      declare var SVGStringList: {
          prototype: SVGStringList;
          new(): SVGStringList;
      }
      
      interface SVGStyleElement extends SVGElement, SVGLangSpace {
          media: string;
          title: string;
          type: string;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGStyleElement: {
          prototype: SVGStyleElement;
          new(): SVGStyleElement;
      }
      
      interface SVGSwitchElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGSwitchElement: {
          prototype: SVGSwitchElement;
          new(): SVGSwitchElement;
      }
      
      interface SVGSymbolElement extends SVGElement, SVGStylable, SVGLangSpace, SVGExternalResourcesRequired, SVGFitToViewBox {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGSymbolElement: {
          prototype: SVGSymbolElement;
          new(): SVGSymbolElement;
      }
      
      interface SVGTSpanElement extends SVGTextPositioningElement {
      }
      
      declare var SVGTSpanElement: {
          prototype: SVGTSpanElement;
          new(): SVGTSpanElement;
      }
      
      interface SVGTextContentElement extends SVGElement, SVGStylable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired {
          lengthAdjust: SVGAnimatedEnumeration;
          textLength: SVGAnimatedLength;
          getCharNumAtPosition(point: SVGPoint): number;
          getComputedTextLength(): number;
          getEndPositionOfChar(charnum: number): SVGPoint;
          getExtentOfChar(charnum: number): SVGRect;
          getNumberOfChars(): number;
          getRotationOfChar(charnum: number): number;
          getStartPositionOfChar(charnum: number): SVGPoint;
          getSubStringLength(charnum: number, nchars: number): number;
          selectSubString(charnum: number, nchars: number): void;
          LENGTHADJUST_SPACING: number;
          LENGTHADJUST_SPACINGANDGLYPHS: number;
          LENGTHADJUST_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTextContentElement: {
          prototype: SVGTextContentElement;
          new(): SVGTextContentElement;
          LENGTHADJUST_SPACING: number;
          LENGTHADJUST_SPACINGANDGLYPHS: number;
          LENGTHADJUST_UNKNOWN: number;
      }
      
      interface SVGTextElement extends SVGTextPositioningElement, SVGTransformable {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTextElement: {
          prototype: SVGTextElement;
          new(): SVGTextElement;
      }
      
      interface SVGTextPathElement extends SVGTextContentElement, SVGURIReference {
          method: SVGAnimatedEnumeration;
          spacing: SVGAnimatedEnumeration;
          startOffset: SVGAnimatedLength;
          TEXTPATH_METHODTYPE_ALIGN: number;
          TEXTPATH_METHODTYPE_STRETCH: number;
          TEXTPATH_METHODTYPE_UNKNOWN: number;
          TEXTPATH_SPACINGTYPE_AUTO: number;
          TEXTPATH_SPACINGTYPE_EXACT: number;
          TEXTPATH_SPACINGTYPE_UNKNOWN: number;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTextPathElement: {
          prototype: SVGTextPathElement;
          new(): SVGTextPathElement;
          TEXTPATH_METHODTYPE_ALIGN: number;
          TEXTPATH_METHODTYPE_STRETCH: number;
          TEXTPATH_METHODTYPE_UNKNOWN: number;
          TEXTPATH_SPACINGTYPE_AUTO: number;
          TEXTPATH_SPACINGTYPE_EXACT: number;
          TEXTPATH_SPACINGTYPE_UNKNOWN: number;
      }
      
      interface SVGTextPositioningElement extends SVGTextContentElement {
          dx: SVGAnimatedLengthList;
          dy: SVGAnimatedLengthList;
          rotate: SVGAnimatedNumberList;
          x: SVGAnimatedLengthList;
          y: SVGAnimatedLengthList;
      }
      
      declare var SVGTextPositioningElement: {
          prototype: SVGTextPositioningElement;
          new(): SVGTextPositioningElement;
      }
      
      interface SVGTitleElement extends SVGElement, SVGStylable, SVGLangSpace {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGTitleElement: {
          prototype: SVGTitleElement;
          new(): SVGTitleElement;
      }
      
      interface SVGTransform {
          angle: number;
          matrix: SVGMatrix;
          type: number;
          setMatrix(matrix: SVGMatrix): void;
          setRotate(angle: number, cx: number, cy: number): void;
          setScale(sx: number, sy: number): void;
          setSkewX(angle: number): void;
          setSkewY(angle: number): void;
          setTranslate(tx: number, ty: number): void;
          SVG_TRANSFORM_MATRIX: number;
          SVG_TRANSFORM_ROTATE: number;
          SVG_TRANSFORM_SCALE: number;
          SVG_TRANSFORM_SKEWX: number;
          SVG_TRANSFORM_SKEWY: number;
          SVG_TRANSFORM_TRANSLATE: number;
          SVG_TRANSFORM_UNKNOWN: number;
      }
      
      declare var SVGTransform: {
          prototype: SVGTransform;
          new(): SVGTransform;
          SVG_TRANSFORM_MATRIX: number;
          SVG_TRANSFORM_ROTATE: number;
          SVG_TRANSFORM_SCALE: number;
          SVG_TRANSFORM_SKEWX: number;
          SVG_TRANSFORM_SKEWY: number;
          SVG_TRANSFORM_TRANSLATE: number;
          SVG_TRANSFORM_UNKNOWN: number;
      }
      
      interface SVGTransformList {
          numberOfItems: number;
          appendItem(newItem: SVGTransform): SVGTransform;
          clear(): void;
          consolidate(): SVGTransform;
          createSVGTransformFromMatrix(matrix: SVGMatrix): SVGTransform;
          getItem(index: number): SVGTransform;
          initialize(newItem: SVGTransform): SVGTransform;
          insertItemBefore(newItem: SVGTransform, index: number): SVGTransform;
          removeItem(index: number): SVGTransform;
          replaceItem(newItem: SVGTransform, index: number): SVGTransform;
      }
      
      declare var SVGTransformList: {
          prototype: SVGTransformList;
          new(): SVGTransformList;
      }
      
      interface SVGUnitTypes {
          SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: number;
          SVG_UNIT_TYPE_UNKNOWN: number;
          SVG_UNIT_TYPE_USERSPACEONUSE: number;
      }
      declare var SVGUnitTypes: SVGUnitTypes;
      
      interface SVGUseElement extends SVGElement, SVGStylable, SVGTransformable, SVGTests, SVGLangSpace, SVGExternalResourcesRequired, SVGURIReference {
          animatedInstanceRoot: SVGElementInstance;
          height: SVGAnimatedLength;
          instanceRoot: SVGElementInstance;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGUseElement: {
          prototype: SVGUseElement;
          new(): SVGUseElement;
      }
      
      interface SVGViewElement extends SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGZoomAndPan {
          viewTarget: SVGStringList;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var SVGViewElement: {
          prototype: SVGViewElement;
          new(): SVGViewElement;
      }
      
      interface SVGZoomAndPan {
          SVG_ZOOMANDPAN_DISABLE: number;
          SVG_ZOOMANDPAN_MAGNIFY: number;
          SVG_ZOOMANDPAN_UNKNOWN: number;
      }
      declare var SVGZoomAndPan: SVGZoomAndPan;
      
      interface SVGZoomEvent extends UIEvent {
          newScale: number;
          newTranslate: SVGPoint;
          previousScale: number;
          previousTranslate: SVGPoint;
          zoomRectScreen: SVGRect;
      }
      
      declare var SVGZoomEvent: {
          prototype: SVGZoomEvent;
          new(): SVGZoomEvent;
      }
      
      interface Screen extends EventTarget {
          availHeight: number;
          availWidth: number;
          bufferDepth: number;
          colorDepth: number;
          deviceXDPI: number;
          deviceYDPI: number;
          fontSmoothingEnabled: boolean;
          height: number;
          logicalXDPI: number;
          logicalYDPI: number;
          msOrientation: string;
          onmsorientationchange: (ev: Event) => any;
          pixelDepth: number;
          systemXDPI: number;
          systemYDPI: number;
          width: number;
          msLockOrientation(orientations: string): boolean;
          msLockOrientation(orientations: string[]): boolean;
          msUnlockOrientation(): void;
          addEventListener(type: "MSOrientationChange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Screen: {
          prototype: Screen;
          new(): Screen;
      }
      
      interface ScriptNotifyEvent extends Event {
          callingUri: string;
          value: string;
      }
      
      declare var ScriptNotifyEvent: {
          prototype: ScriptNotifyEvent;
          new(): ScriptNotifyEvent;
      }
      
      interface ScriptProcessorNode extends AudioNode {
          bufferSize: number;
          onaudioprocess: (ev: AudioProcessingEvent) => any;
          addEventListener(type: "audioprocess", listener: (ev: AudioProcessingEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var ScriptProcessorNode: {
          prototype: ScriptProcessorNode;
          new(): ScriptProcessorNode;
      }
      
      interface Selection {
          anchorNode: Node;
          anchorOffset: number;
          focusNode: Node;
          focusOffset: number;
          isCollapsed: boolean;
          rangeCount: number;
          type: string;
          addRange(range: Range): void;
          collapse(parentNode: Node, offset: number): void;
          collapseToEnd(): void;
          collapseToStart(): void;
          containsNode(node: Node, partlyContained: boolean): boolean;
          deleteFromDocument(): void;
          empty(): void;
          extend(newNode: Node, offset: number): void;
          getRangeAt(index: number): Range;
          removeAllRanges(): void;
          removeRange(range: Range): void;
          selectAllChildren(parentNode: Node): void;
          setBaseAndExtent(baseNode: Node, baseOffset: number, extentNode: Node, extentOffset: number): void;
          toString(): string;
      }
      
      declare var Selection: {
          prototype: Selection;
          new(): Selection;
      }
      
      interface SourceBuffer extends EventTarget {
          appendWindowEnd: number;
          appendWindowStart: number;
          audioTracks: AudioTrackList;
          buffered: TimeRanges;
          mode: string;
          timestampOffset: number;
          updating: boolean;
          videoTracks: VideoTrackList;
          abort(): void;
          appendBuffer(data: ArrayBuffer): void;
          appendBuffer(data: ArrayBufferView): void;
          appendStream(stream: MSStream, maxSize?: number): void;
          remove(start: number, end: number): void;
      }
      
      declare var SourceBuffer: {
          prototype: SourceBuffer;
          new(): SourceBuffer;
      }
      
      interface SourceBufferList extends EventTarget {
          length: number;
          item(index: number): SourceBuffer;
          [index: number]: SourceBuffer;
      }
      
      declare var SourceBufferList: {
          prototype: SourceBufferList;
          new(): SourceBufferList;
      }
      
      interface StereoPannerNode extends AudioNode {
          pan: AudioParam;
      }
      
      declare var StereoPannerNode: {
          prototype: StereoPannerNode;
          new(): StereoPannerNode;
      }
      
      interface Storage {
          length: number;
          clear(): void;
          getItem(key: string): any;
          key(index: number): string;
          removeItem(key: string): void;
          setItem(key: string, data: string): void;
          [key: string]: any;
          [index: number]: string;
      }
      
      declare var Storage: {
          prototype: Storage;
          new(): Storage;
      }
      
      interface StorageEvent extends Event {
          key: string;
          newValue: any;
          oldValue: any;
          storageArea: Storage;
          url: string;
          initStorageEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, keyArg: string, oldValueArg: any, newValueArg: any, urlArg: string, storageAreaArg: Storage): void;
      }
      
      declare var StorageEvent: {
          prototype: StorageEvent;
          new(): StorageEvent;
      }
      
      interface StyleMedia {
          type: string;
          matchMedium(mediaquery: string): boolean;
      }
      
      declare var StyleMedia: {
          prototype: StyleMedia;
          new(): StyleMedia;
      }
      
      interface StyleSheet {
          disabled: boolean;
          href: string;
          media: MediaList;
          ownerNode: Node;
          parentStyleSheet: StyleSheet;
          title: string;
          type: string;
      }
      
      declare var StyleSheet: {
          prototype: StyleSheet;
          new(): StyleSheet;
      }
      
      interface StyleSheetList {
          length: number;
          item(index?: number): StyleSheet;
          [index: number]: StyleSheet;
      }
      
      declare var StyleSheetList: {
          prototype: StyleSheetList;
          new(): StyleSheetList;
      }
      
      interface StyleSheetPageList {
          length: number;
          item(index: number): CSSPageRule;
          [index: number]: CSSPageRule;
      }
      
      declare var StyleSheetPageList: {
          prototype: StyleSheetPageList;
          new(): StyleSheetPageList;
      }
      
      interface SubtleCrypto {
          decrypt(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
          decrypt(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
          deriveBits(algorithm: string, baseKey: CryptoKey, length: number): any;
          deriveBits(algorithm: Algorithm, baseKey: CryptoKey, length: number): any;
          deriveKey(algorithm: string, baseKey: CryptoKey, derivedKeyType: string, extractable: boolean, keyUsages: string[]): any;
          deriveKey(algorithm: string, baseKey: CryptoKey, derivedKeyType: Algorithm, extractable: boolean, keyUsages: string[]): any;
          deriveKey(algorithm: Algorithm, baseKey: CryptoKey, derivedKeyType: string, extractable: boolean, keyUsages: string[]): any;
          deriveKey(algorithm: Algorithm, baseKey: CryptoKey, derivedKeyType: Algorithm, extractable: boolean, keyUsages: string[]): any;
          digest(algorithm: string, data: ArrayBufferView): any;
          digest(algorithm: Algorithm, data: ArrayBufferView): any;
          encrypt(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
          encrypt(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
          exportKey(format: string, key: CryptoKey): any;
          generateKey(algorithm: string, extractable: boolean, keyUsages: string[]): any;
          generateKey(algorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          importKey(format: string, keyData: ArrayBufferView, algorithm: string, extractable: boolean, keyUsages: string[]): any;
          importKey(format: string, keyData: ArrayBufferView, algorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          sign(algorithm: string, key: CryptoKey, data: ArrayBufferView): any;
          sign(algorithm: Algorithm, key: CryptoKey, data: ArrayBufferView): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string, unwrappedKeyAlgorithm: string, extractable: boolean, keyUsages: string[]): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: string, unwrappedKeyAlgorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: Algorithm, unwrappedKeyAlgorithm: string, extractable: boolean, keyUsages: string[]): any;
          unwrapKey(format: string, wrappedKey: ArrayBufferView, unwrappingKey: CryptoKey, unwrapAlgorithm: Algorithm, unwrappedKeyAlgorithm: Algorithm, extractable: boolean, keyUsages: string[]): any;
          verify(algorithm: string, key: CryptoKey, signature: ArrayBufferView, data: ArrayBufferView): any;
          verify(algorithm: Algorithm, key: CryptoKey, signature: ArrayBufferView, data: ArrayBufferView): any;
          wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: string): any;
          wrapKey(format: string, key: CryptoKey, wrappingKey: CryptoKey, wrapAlgorithm: Algorithm): any;
      }
      
      declare var SubtleCrypto: {
          prototype: SubtleCrypto;
          new(): SubtleCrypto;
      }
      
      interface Text extends CharacterData {
          wholeText: string;
          replaceWholeText(content: string): Text;
          splitText(offset: number): Text;
      }
      
      declare var Text: {
          prototype: Text;
          new(): Text;
      }
      
      interface TextEvent extends UIEvent {
          data: string;
          inputMethod: number;
          locale: string;
          initTextEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, dataArg: string, inputMethod: number, locale: string): void;
          DOM_INPUT_METHOD_DROP: number;
          DOM_INPUT_METHOD_HANDWRITING: number;
          DOM_INPUT_METHOD_IME: number;
          DOM_INPUT_METHOD_KEYBOARD: number;
          DOM_INPUT_METHOD_MULTIMODAL: number;
          DOM_INPUT_METHOD_OPTION: number;
          DOM_INPUT_METHOD_PASTE: number;
          DOM_INPUT_METHOD_SCRIPT: number;
          DOM_INPUT_METHOD_UNKNOWN: number;
          DOM_INPUT_METHOD_VOICE: number;
      }
      
      declare var TextEvent: {
          prototype: TextEvent;
          new(): TextEvent;
          DOM_INPUT_METHOD_DROP: number;
          DOM_INPUT_METHOD_HANDWRITING: number;
          DOM_INPUT_METHOD_IME: number;
          DOM_INPUT_METHOD_KEYBOARD: number;
          DOM_INPUT_METHOD_MULTIMODAL: number;
          DOM_INPUT_METHOD_OPTION: number;
          DOM_INPUT_METHOD_PASTE: number;
          DOM_INPUT_METHOD_SCRIPT: number;
          DOM_INPUT_METHOD_UNKNOWN: number;
          DOM_INPUT_METHOD_VOICE: number;
      }
      
      interface TextMetrics {
          width: number;
      }
      
      declare var TextMetrics: {
          prototype: TextMetrics;
          new(): TextMetrics;
      }
      
      interface TextRange {
          boundingHeight: number;
          boundingLeft: number;
          boundingTop: number;
          boundingWidth: number;
          htmlText: string;
          offsetLeft: number;
          offsetTop: number;
          text: string;
          collapse(start?: boolean): void;
          compareEndPoints(how: string, sourceRange: TextRange): number;
          duplicate(): TextRange;
          execCommand(cmdID: string, showUI?: boolean, value?: any): boolean;
          execCommandShowHelp(cmdID: string): boolean;
          expand(Unit: string): boolean;
          findText(string: string, count?: number, flags?: number): boolean;
          getBookmark(): string;
          getBoundingClientRect(): ClientRect;
          getClientRects(): ClientRectList;
          inRange(range: TextRange): boolean;
          isEqual(range: TextRange): boolean;
          move(unit: string, count?: number): number;
          moveEnd(unit: string, count?: number): number;
          moveStart(unit: string, count?: number): number;
          moveToBookmark(bookmark: string): boolean;
          moveToElementText(element: Element): void;
          moveToPoint(x: number, y: number): void;
          parentElement(): Element;
          pasteHTML(html: string): void;
          queryCommandEnabled(cmdID: string): boolean;
          queryCommandIndeterm(cmdID: string): boolean;
          queryCommandState(cmdID: string): boolean;
          queryCommandSupported(cmdID: string): boolean;
          queryCommandText(cmdID: string): string;
          queryCommandValue(cmdID: string): any;
          scrollIntoView(fStart?: boolean): void;
          select(): void;
          setEndPoint(how: string, SourceRange: TextRange): void;
      }
      
      declare var TextRange: {
          prototype: TextRange;
          new(): TextRange;
      }
      
      interface TextRangeCollection {
          length: number;
          item(index: number): TextRange;
          [index: number]: TextRange;
      }
      
      declare var TextRangeCollection: {
          prototype: TextRangeCollection;
          new(): TextRangeCollection;
      }
      
      interface TextTrack extends EventTarget {
          activeCues: TextTrackCueList;
          cues: TextTrackCueList;
          inBandMetadataTrackDispatchType: string;
          kind: string;
          label: string;
          language: string;
          mode: any;
          oncuechange: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onload: (ev: Event) => any;
          readyState: number;
          addCue(cue: TextTrackCue): void;
          removeCue(cue: TextTrackCue): void;
          DISABLED: number;
          ERROR: number;
          HIDDEN: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
          SHOWING: number;
          addEventListener(type: "cuechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var TextTrack: {
          prototype: TextTrack;
          new(): TextTrack;
          DISABLED: number;
          ERROR: number;
          HIDDEN: number;
          LOADED: number;
          LOADING: number;
          NONE: number;
          SHOWING: number;
      }
      
      interface TextTrackCue extends EventTarget {
          endTime: number;
          id: string;
          onenter: (ev: Event) => any;
          onexit: (ev: Event) => any;
          pauseOnExit: boolean;
          startTime: number;
          text: string;
          track: TextTrack;
          getCueAsHTML(): DocumentFragment;
          addEventListener(type: "enter", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "exit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var TextTrackCue: {
          prototype: TextTrackCue;
          new(startTime: number, endTime: number, text: string): TextTrackCue;
      }
      
      interface TextTrackCueList {
          length: number;
          getCueById(id: string): TextTrackCue;
          item(index: number): TextTrackCue;
          [index: number]: TextTrackCue;
      }
      
      declare var TextTrackCueList: {
          prototype: TextTrackCueList;
          new(): TextTrackCueList;
      }
      
      interface TextTrackList extends EventTarget {
          length: number;
          onaddtrack: (ev: TrackEvent) => any;
          item(index: number): TextTrack;
          addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: TextTrack;
      }
      
      declare var TextTrackList: {
          prototype: TextTrackList;
          new(): TextTrackList;
      }
      
      interface TimeRanges {
          length: number;
          end(index: number): number;
          start(index: number): number;
      }
      
      declare var TimeRanges: {
          prototype: TimeRanges;
          new(): TimeRanges;
      }
      
      interface Touch {
          clientX: number;
          clientY: number;
          identifier: number;
          pageX: number;
          pageY: number;
          screenX: number;
          screenY: number;
          target: EventTarget;
      }
      
      declare var Touch: {
          prototype: Touch;
          new(): Touch;
      }
      
      interface TouchEvent extends UIEvent {
          altKey: boolean;
          changedTouches: TouchList;
          ctrlKey: boolean;
          metaKey: boolean;
          shiftKey: boolean;
          targetTouches: TouchList;
          touches: TouchList;
      }
      
      declare var TouchEvent: {
          prototype: TouchEvent;
          new(): TouchEvent;
      }
      
      interface TouchList {
          length: number;
          item(index: number): Touch;
          [index: number]: Touch;
      }
      
      declare var TouchList: {
          prototype: TouchList;
          new(): TouchList;
      }
      
      interface TrackEvent extends Event {
          track: any;
      }
      
      declare var TrackEvent: {
          prototype: TrackEvent;
          new(): TrackEvent;
      }
      
      interface TransitionEvent extends Event {
          elapsedTime: number;
          propertyName: string;
          initTransitionEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, propertyNameArg: string, elapsedTimeArg: number): void;
      }
      
      declare var TransitionEvent: {
          prototype: TransitionEvent;
          new(): TransitionEvent;
      }
      
      interface TreeWalker {
          currentNode: Node;
          expandEntityReferences: boolean;
          filter: NodeFilter;
          root: Node;
          whatToShow: number;
          firstChild(): Node;
          lastChild(): Node;
          nextNode(): Node;
          nextSibling(): Node;
          parentNode(): Node;
          previousNode(): Node;
          previousSibling(): Node;
      }
      
      declare var TreeWalker: {
          prototype: TreeWalker;
          new(): TreeWalker;
      }
      
      interface UIEvent extends Event {
          detail: number;
          view: Window;
          initUIEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number): void;
      }
      
      declare var UIEvent: {
          prototype: UIEvent;
          new(type: string, eventInitDict?: UIEventInit): UIEvent;
      }
      
      interface URL {
          createObjectURL(object: any, options?: ObjectURLOptions): string;
          revokeObjectURL(url: string): void;
      }
      declare var URL: URL;
      
      interface UnviewableContentIdentifiedEvent extends NavigationEventWithReferrer {
          mediaType: string;
      }
      
      declare var UnviewableContentIdentifiedEvent: {
          prototype: UnviewableContentIdentifiedEvent;
          new(): UnviewableContentIdentifiedEvent;
      }
      
      interface ValidityState {
          badInput: boolean;
          customError: boolean;
          patternMismatch: boolean;
          rangeOverflow: boolean;
          rangeUnderflow: boolean;
          stepMismatch: boolean;
          tooLong: boolean;
          typeMismatch: boolean;
          valid: boolean;
          valueMissing: boolean;
      }
      
      declare var ValidityState: {
          prototype: ValidityState;
          new(): ValidityState;
      }
      
      interface VideoPlaybackQuality {
          corruptedVideoFrames: number;
          creationTime: number;
          droppedVideoFrames: number;
          totalFrameDelay: number;
          totalVideoFrames: number;
      }
      
      declare var VideoPlaybackQuality: {
          prototype: VideoPlaybackQuality;
          new(): VideoPlaybackQuality;
      }
      
      interface VideoTrack {
          id: string;
          kind: string;
          label: string;
          language: string;
          selected: boolean;
          sourceBuffer: SourceBuffer;
      }
      
      declare var VideoTrack: {
          prototype: VideoTrack;
          new(): VideoTrack;
      }
      
      interface VideoTrackList extends EventTarget {
          length: number;
          onaddtrack: (ev: TrackEvent) => any;
          onchange: (ev: Event) => any;
          onremovetrack: (ev: TrackEvent) => any;
          selectedIndex: number;
          getTrackById(id: string): VideoTrack;
          item(index: number): VideoTrack;
          addEventListener(type: "addtrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "removetrack", listener: (ev: TrackEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: VideoTrack;
      }
      
      declare var VideoTrackList: {
          prototype: VideoTrackList;
          new(): VideoTrackList;
      }
      
      interface WEBGL_compressed_texture_s3tc {
          COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
          COMPRESSED_RGB_S3TC_DXT1_EXT: number;
      }
      
      declare var WEBGL_compressed_texture_s3tc: {
          prototype: WEBGL_compressed_texture_s3tc;
          new(): WEBGL_compressed_texture_s3tc;
          COMPRESSED_RGBA_S3TC_DXT1_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT3_EXT: number;
          COMPRESSED_RGBA_S3TC_DXT5_EXT: number;
          COMPRESSED_RGB_S3TC_DXT1_EXT: number;
      }
      
      interface WEBGL_debug_renderer_info {
          UNMASKED_RENDERER_WEBGL: number;
          UNMASKED_VENDOR_WEBGL: number;
      }
      
      declare var WEBGL_debug_renderer_info: {
          prototype: WEBGL_debug_renderer_info;
          new(): WEBGL_debug_renderer_info;
          UNMASKED_RENDERER_WEBGL: number;
          UNMASKED_VENDOR_WEBGL: number;
      }
      
      interface WEBGL_depth_texture {
          UNSIGNED_INT_24_8_WEBGL: number;
      }
      
      declare var WEBGL_depth_texture: {
          prototype: WEBGL_depth_texture;
          new(): WEBGL_depth_texture;
          UNSIGNED_INT_24_8_WEBGL: number;
      }
      
      interface WaveShaperNode extends AudioNode {
          curve: any;
          oversample: string;
      }
      
      declare var WaveShaperNode: {
          prototype: WaveShaperNode;
          new(): WaveShaperNode;
      }
      
      interface WebGLActiveInfo {
          name: string;
          size: number;
          type: number;
      }
      
      declare var WebGLActiveInfo: {
          prototype: WebGLActiveInfo;
          new(): WebGLActiveInfo;
      }
      
      interface WebGLBuffer extends WebGLObject {
      }
      
      declare var WebGLBuffer: {
          prototype: WebGLBuffer;
          new(): WebGLBuffer;
      }
      
      interface WebGLContextEvent extends Event {
          statusMessage: string;
      }
      
      declare var WebGLContextEvent: {
          prototype: WebGLContextEvent;
          new(): WebGLContextEvent;
      }
      
      interface WebGLFramebuffer extends WebGLObject {
      }
      
      declare var WebGLFramebuffer: {
          prototype: WebGLFramebuffer;
          new(): WebGLFramebuffer;
      }
      
      interface WebGLObject {
      }
      
      declare var WebGLObject: {
          prototype: WebGLObject;
          new(): WebGLObject;
      }
      
      interface WebGLProgram extends WebGLObject {
      }
      
      declare var WebGLProgram: {
          prototype: WebGLProgram;
          new(): WebGLProgram;
      }
      
      interface WebGLRenderbuffer extends WebGLObject {
      }
      
      declare var WebGLRenderbuffer: {
          prototype: WebGLRenderbuffer;
          new(): WebGLRenderbuffer;
      }
      
      interface WebGLRenderingContext {
          canvas: HTMLCanvasElement;
          drawingBufferHeight: number;
          drawingBufferWidth: number;
          activeTexture(texture: number): void;
          attachShader(program: WebGLProgram, shader: WebGLShader): void;
          bindAttribLocation(program: WebGLProgram, index: number, name: string): void;
          bindBuffer(target: number, buffer: WebGLBuffer): void;
          bindFramebuffer(target: number, framebuffer: WebGLFramebuffer): void;
          bindRenderbuffer(target: number, renderbuffer: WebGLRenderbuffer): void;
          bindTexture(target: number, texture: WebGLTexture): void;
          blendColor(red: number, green: number, blue: number, alpha: number): void;
          blendEquation(mode: number): void;
          blendEquationSeparate(modeRGB: number, modeAlpha: number): void;
          blendFunc(sfactor: number, dfactor: number): void;
          blendFuncSeparate(srcRGB: number, dstRGB: number, srcAlpha: number, dstAlpha: number): void;
          bufferData(target: number, size: number, usage: number): void;
          bufferData(target: number, size: ArrayBufferView, usage: number): void;
          bufferData(target: number, size: any, usage: number): void;
          bufferSubData(target: number, offset: number, data: ArrayBufferView): void;
          bufferSubData(target: number, offset: number, data: any): void;
          checkFramebufferStatus(target: number): number;
          clear(mask: number): void;
          clearColor(red: number, green: number, blue: number, alpha: number): void;
          clearDepth(depth: number): void;
          clearStencil(s: number): void;
          colorMask(red: boolean, green: boolean, blue: boolean, alpha: boolean): void;
          compileShader(shader: WebGLShader): void;
          compressedTexImage2D(target: number, level: number, internalformat: number, width: number, height: number, border: number, data: ArrayBufferView): void;
          compressedTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, width: number, height: number, format: number, data: ArrayBufferView): void;
          copyTexImage2D(target: number, level: number, internalformat: number, x: number, y: number, width: number, height: number, border: number): void;
          copyTexSubImage2D(target: number, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void;
          createBuffer(): WebGLBuffer;
          createFramebuffer(): WebGLFramebuffer;
          createProgram(): WebGLProgram;
          createRenderbuffer(): WebGLRenderbuffer;
          createShader(type: number): WebGLShader;
          createTexture(): WebGLTexture;
          cullFace(mode: number): void;
          deleteBuffer(buffer: WebGLBuffer): void;
          deleteFramebuffer(framebuffer: WebGLFramebuffer): void;
          deleteProgram(program: WebGLProgram): void;
          deleteRenderbuffer(renderbuffer: WebGLRenderbuffer): void;
          deleteShader(shader: WebGLShader): void;
          deleteTexture(texture: WebGLTexture): void;
          depthFunc(func: number): void;
          depthMask(flag: boolean): void;
          depthRange(zNear: number, zFar: number): void;
          detachShader(program: WebGLProgram, shader: WebGLShader): void;
          disable(cap: number): void;
          disableVertexAttribArray(index: number): void;
          drawArrays(mode: number, first: number, count: number): void;
          drawElements(mode: number, count: number, type: number, offset: number): void;
          enable(cap: number): void;
          enableVertexAttribArray(index: number): void;
          finish(): void;
          flush(): void;
          framebufferRenderbuffer(target: number, attachment: number, renderbuffertarget: number, renderbuffer: WebGLRenderbuffer): void;
          framebufferTexture2D(target: number, attachment: number, textarget: number, texture: WebGLTexture, level: number): void;
          frontFace(mode: number): void;
          generateMipmap(target: number): void;
          getActiveAttrib(program: WebGLProgram, index: number): WebGLActiveInfo;
          getActiveUniform(program: WebGLProgram, index: number): WebGLActiveInfo;
          getAttachedShaders(program: WebGLProgram): WebGLShader[];
          getAttribLocation(program: WebGLProgram, name: string): number;
          getBufferParameter(target: number, pname: number): any;
          getContextAttributes(): WebGLContextAttributes;
          getError(): number;
          getExtension(name: string): any;
          getFramebufferAttachmentParameter(target: number, attachment: number, pname: number): any;
          getParameter(pname: number): any;
          getProgramInfoLog(program: WebGLProgram): string;
          getProgramParameter(program: WebGLProgram, pname: number): any;
          getRenderbufferParameter(target: number, pname: number): any;
          getShaderInfoLog(shader: WebGLShader): string;
          getShaderParameter(shader: WebGLShader, pname: number): any;
          getShaderPrecisionFormat(shadertype: number, precisiontype: number): WebGLShaderPrecisionFormat;
          getShaderSource(shader: WebGLShader): string;
          getSupportedExtensions(): string[];
          getTexParameter(target: number, pname: number): any;
          getUniform(program: WebGLProgram, location: WebGLUniformLocation): any;
          getUniformLocation(program: WebGLProgram, name: string): WebGLUniformLocation;
          getVertexAttrib(index: number, pname: number): any;
          getVertexAttribOffset(index: number, pname: number): number;
          hint(target: number, mode: number): void;
          isBuffer(buffer: WebGLBuffer): boolean;
          isContextLost(): boolean;
          isEnabled(cap: number): boolean;
          isFramebuffer(framebuffer: WebGLFramebuffer): boolean;
          isProgram(program: WebGLProgram): boolean;
          isRenderbuffer(renderbuffer: WebGLRenderbuffer): boolean;
          isShader(shader: WebGLShader): boolean;
          isTexture(texture: WebGLTexture): boolean;
          lineWidth(width: number): void;
          linkProgram(program: WebGLProgram): void;
          pixelStorei(pname: number, param: number): void;
          polygonOffset(factor: number, units: number): void;
          readPixels(x: number, y: number, width: number, height: number, format: number, type: number, pixels: ArrayBufferView): void;
          renderbufferStorage(target: number, internalformat: number, width: number, height: number): void;
          sampleCoverage(value: number, invert: boolean): void;
          scissor(x: number, y: number, width: number, height: number): void;
          shaderSource(shader: WebGLShader, source: string): void;
          stencilFunc(func: number, ref: number, mask: number): void;
          stencilFuncSeparate(face: number, func: number, ref: number, mask: number): void;
          stencilMask(mask: number): void;
          stencilMaskSeparate(face: number, mask: number): void;
          stencilOp(fail: number, zfail: number, zpass: number): void;
          stencilOpSeparate(face: number, fail: number, zfail: number, zpass: number): void;
          texImage2D(target: number, level: number, internalformat: number, format: number, type: number, pixels: ImageData): void;
          texParameterf(target: number, pname: number, param: number): void;
          texParameteri(target: number, pname: number, param: number): void;
          texSubImage2D(target: number, level: number, xoffset: number, yoffset: number, format: number, type: number, pixels: ImageData): void;
          uniform1f(location: WebGLUniformLocation, x: number): void;
          uniform1fv(location: WebGLUniformLocation, v: any): void;
          uniform1i(location: WebGLUniformLocation, x: number): void;
          uniform1iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniform2f(location: WebGLUniformLocation, x: number, y: number): void;
          uniform2fv(location: WebGLUniformLocation, v: any): void;
          uniform2i(location: WebGLUniformLocation, x: number, y: number): void;
          uniform2iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniform3f(location: WebGLUniformLocation, x: number, y: number, z: number): void;
          uniform3fv(location: WebGLUniformLocation, v: any): void;
          uniform3i(location: WebGLUniformLocation, x: number, y: number, z: number): void;
          uniform3iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniform4f(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
          uniform4fv(location: WebGLUniformLocation, v: any): void;
          uniform4i(location: WebGLUniformLocation, x: number, y: number, z: number, w: number): void;
          uniform4iv(location: WebGLUniformLocation, v: Int32Array): void;
          uniformMatrix2fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
          uniformMatrix3fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
          uniformMatrix4fv(location: WebGLUniformLocation, transpose: boolean, value: any): void;
          useProgram(program: WebGLProgram): void;
          validateProgram(program: WebGLProgram): void;
          vertexAttrib1f(indx: number, x: number): void;
          vertexAttrib1fv(indx: number, values: any): void;
          vertexAttrib2f(indx: number, x: number, y: number): void;
          vertexAttrib2fv(indx: number, values: any): void;
          vertexAttrib3f(indx: number, x: number, y: number, z: number): void;
          vertexAttrib3fv(indx: number, values: any): void;
          vertexAttrib4f(indx: number, x: number, y: number, z: number, w: number): void;
          vertexAttrib4fv(indx: number, values: any): void;
          vertexAttribPointer(indx: number, size: number, type: number, normalized: boolean, stride: number, offset: number): void;
          viewport(x: number, y: number, width: number, height: number): void;
          ACTIVE_ATTRIBUTES: number;
          ACTIVE_TEXTURE: number;
          ACTIVE_UNIFORMS: number;
          ALIASED_LINE_WIDTH_RANGE: number;
          ALIASED_POINT_SIZE_RANGE: number;
          ALPHA: number;
          ALPHA_BITS: number;
          ALWAYS: number;
          ARRAY_BUFFER: number;
          ARRAY_BUFFER_BINDING: number;
          ATTACHED_SHADERS: number;
          BACK: number;
          BLEND: number;
          BLEND_COLOR: number;
          BLEND_DST_ALPHA: number;
          BLEND_DST_RGB: number;
          BLEND_EQUATION: number;
          BLEND_EQUATION_ALPHA: number;
          BLEND_EQUATION_RGB: number;
          BLEND_SRC_ALPHA: number;
          BLEND_SRC_RGB: number;
          BLUE_BITS: number;
          BOOL: number;
          BOOL_VEC2: number;
          BOOL_VEC3: number;
          BOOL_VEC4: number;
          BROWSER_DEFAULT_WEBGL: number;
          BUFFER_SIZE: number;
          BUFFER_USAGE: number;
          BYTE: number;
          CCW: number;
          CLAMP_TO_EDGE: number;
          COLOR_ATTACHMENT0: number;
          COLOR_BUFFER_BIT: number;
          COLOR_CLEAR_VALUE: number;
          COLOR_WRITEMASK: number;
          COMPILE_STATUS: number;
          COMPRESSED_TEXTURE_FORMATS: number;
          CONSTANT_ALPHA: number;
          CONSTANT_COLOR: number;
          CONTEXT_LOST_WEBGL: number;
          CULL_FACE: number;
          CULL_FACE_MODE: number;
          CURRENT_PROGRAM: number;
          CURRENT_VERTEX_ATTRIB: number;
          CW: number;
          DECR: number;
          DECR_WRAP: number;
          DELETE_STATUS: number;
          DEPTH_ATTACHMENT: number;
          DEPTH_BITS: number;
          DEPTH_BUFFER_BIT: number;
          DEPTH_CLEAR_VALUE: number;
          DEPTH_COMPONENT: number;
          DEPTH_COMPONENT16: number;
          DEPTH_FUNC: number;
          DEPTH_RANGE: number;
          DEPTH_STENCIL: number;
          DEPTH_STENCIL_ATTACHMENT: number;
          DEPTH_TEST: number;
          DEPTH_WRITEMASK: number;
          DITHER: number;
          DONT_CARE: number;
          DST_ALPHA: number;
          DST_COLOR: number;
          DYNAMIC_DRAW: number;
          ELEMENT_ARRAY_BUFFER: number;
          ELEMENT_ARRAY_BUFFER_BINDING: number;
          EQUAL: number;
          FASTEST: number;
          FLOAT: number;
          FLOAT_MAT2: number;
          FLOAT_MAT3: number;
          FLOAT_MAT4: number;
          FLOAT_VEC2: number;
          FLOAT_VEC3: number;
          FLOAT_VEC4: number;
          FRAGMENT_SHADER: number;
          FRAMEBUFFER: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
          FRAMEBUFFER_BINDING: number;
          FRAMEBUFFER_COMPLETE: number;
          FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
          FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
          FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
          FRAMEBUFFER_UNSUPPORTED: number;
          FRONT: number;
          FRONT_AND_BACK: number;
          FRONT_FACE: number;
          FUNC_ADD: number;
          FUNC_REVERSE_SUBTRACT: number;
          FUNC_SUBTRACT: number;
          GENERATE_MIPMAP_HINT: number;
          GEQUAL: number;
          GREATER: number;
          GREEN_BITS: number;
          HIGH_FLOAT: number;
          HIGH_INT: number;
          IMPLEMENTATION_COLOR_READ_FORMAT: number;
          IMPLEMENTATION_COLOR_READ_TYPE: number;
          INCR: number;
          INCR_WRAP: number;
          INT: number;
          INT_VEC2: number;
          INT_VEC3: number;
          INT_VEC4: number;
          INVALID_ENUM: number;
          INVALID_FRAMEBUFFER_OPERATION: number;
          INVALID_OPERATION: number;
          INVALID_VALUE: number;
          INVERT: number;
          KEEP: number;
          LEQUAL: number;
          LESS: number;
          LINEAR: number;
          LINEAR_MIPMAP_LINEAR: number;
          LINEAR_MIPMAP_NEAREST: number;
          LINES: number;
          LINE_LOOP: number;
          LINE_STRIP: number;
          LINE_WIDTH: number;
          LINK_STATUS: number;
          LOW_FLOAT: number;
          LOW_INT: number;
          LUMINANCE: number;
          LUMINANCE_ALPHA: number;
          MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
          MAX_CUBE_MAP_TEXTURE_SIZE: number;
          MAX_FRAGMENT_UNIFORM_VECTORS: number;
          MAX_RENDERBUFFER_SIZE: number;
          MAX_TEXTURE_IMAGE_UNITS: number;
          MAX_TEXTURE_SIZE: number;
          MAX_VARYING_VECTORS: number;
          MAX_VERTEX_ATTRIBS: number;
          MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
          MAX_VERTEX_UNIFORM_VECTORS: number;
          MAX_VIEWPORT_DIMS: number;
          MEDIUM_FLOAT: number;
          MEDIUM_INT: number;
          MIRRORED_REPEAT: number;
          NEAREST: number;
          NEAREST_MIPMAP_LINEAR: number;
          NEAREST_MIPMAP_NEAREST: number;
          NEVER: number;
          NICEST: number;
          NONE: number;
          NOTEQUAL: number;
          NO_ERROR: number;
          ONE: number;
          ONE_MINUS_CONSTANT_ALPHA: number;
          ONE_MINUS_CONSTANT_COLOR: number;
          ONE_MINUS_DST_ALPHA: number;
          ONE_MINUS_DST_COLOR: number;
          ONE_MINUS_SRC_ALPHA: number;
          ONE_MINUS_SRC_COLOR: number;
          OUT_OF_MEMORY: number;
          PACK_ALIGNMENT: number;
          POINTS: number;
          POLYGON_OFFSET_FACTOR: number;
          POLYGON_OFFSET_FILL: number;
          POLYGON_OFFSET_UNITS: number;
          RED_BITS: number;
          RENDERBUFFER: number;
          RENDERBUFFER_ALPHA_SIZE: number;
          RENDERBUFFER_BINDING: number;
          RENDERBUFFER_BLUE_SIZE: number;
          RENDERBUFFER_DEPTH_SIZE: number;
          RENDERBUFFER_GREEN_SIZE: number;
          RENDERBUFFER_HEIGHT: number;
          RENDERBUFFER_INTERNAL_FORMAT: number;
          RENDERBUFFER_RED_SIZE: number;
          RENDERBUFFER_STENCIL_SIZE: number;
          RENDERBUFFER_WIDTH: number;
          RENDERER: number;
          REPEAT: number;
          REPLACE: number;
          RGB: number;
          RGB565: number;
          RGB5_A1: number;
          RGBA: number;
          RGBA4: number;
          SAMPLER_2D: number;
          SAMPLER_CUBE: number;
          SAMPLES: number;
          SAMPLE_ALPHA_TO_COVERAGE: number;
          SAMPLE_BUFFERS: number;
          SAMPLE_COVERAGE: number;
          SAMPLE_COVERAGE_INVERT: number;
          SAMPLE_COVERAGE_VALUE: number;
          SCISSOR_BOX: number;
          SCISSOR_TEST: number;
          SHADER_TYPE: number;
          SHADING_LANGUAGE_VERSION: number;
          SHORT: number;
          SRC_ALPHA: number;
          SRC_ALPHA_SATURATE: number;
          SRC_COLOR: number;
          STATIC_DRAW: number;
          STENCIL_ATTACHMENT: number;
          STENCIL_BACK_FAIL: number;
          STENCIL_BACK_FUNC: number;
          STENCIL_BACK_PASS_DEPTH_FAIL: number;
          STENCIL_BACK_PASS_DEPTH_PASS: number;
          STENCIL_BACK_REF: number;
          STENCIL_BACK_VALUE_MASK: number;
          STENCIL_BACK_WRITEMASK: number;
          STENCIL_BITS: number;
          STENCIL_BUFFER_BIT: number;
          STENCIL_CLEAR_VALUE: number;
          STENCIL_FAIL: number;
          STENCIL_FUNC: number;
          STENCIL_INDEX: number;
          STENCIL_INDEX8: number;
          STENCIL_PASS_DEPTH_FAIL: number;
          STENCIL_PASS_DEPTH_PASS: number;
          STENCIL_REF: number;
          STENCIL_TEST: number;
          STENCIL_VALUE_MASK: number;
          STENCIL_WRITEMASK: number;
          STREAM_DRAW: number;
          SUBPIXEL_BITS: number;
          TEXTURE: number;
          TEXTURE0: number;
          TEXTURE1: number;
          TEXTURE10: number;
          TEXTURE11: number;
          TEXTURE12: number;
          TEXTURE13: number;
          TEXTURE14: number;
          TEXTURE15: number;
          TEXTURE16: number;
          TEXTURE17: number;
          TEXTURE18: number;
          TEXTURE19: number;
          TEXTURE2: number;
          TEXTURE20: number;
          TEXTURE21: number;
          TEXTURE22: number;
          TEXTURE23: number;
          TEXTURE24: number;
          TEXTURE25: number;
          TEXTURE26: number;
          TEXTURE27: number;
          TEXTURE28: number;
          TEXTURE29: number;
          TEXTURE3: number;
          TEXTURE30: number;
          TEXTURE31: number;
          TEXTURE4: number;
          TEXTURE5: number;
          TEXTURE6: number;
          TEXTURE7: number;
          TEXTURE8: number;
          TEXTURE9: number;
          TEXTURE_2D: number;
          TEXTURE_BINDING_2D: number;
          TEXTURE_BINDING_CUBE_MAP: number;
          TEXTURE_CUBE_MAP: number;
          TEXTURE_CUBE_MAP_NEGATIVE_X: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
          TEXTURE_CUBE_MAP_POSITIVE_X: number;
          TEXTURE_CUBE_MAP_POSITIVE_Y: number;
          TEXTURE_CUBE_MAP_POSITIVE_Z: number;
          TEXTURE_MAG_FILTER: number;
          TEXTURE_MIN_FILTER: number;
          TEXTURE_WRAP_S: number;
          TEXTURE_WRAP_T: number;
          TRIANGLES: number;
          TRIANGLE_FAN: number;
          TRIANGLE_STRIP: number;
          UNPACK_ALIGNMENT: number;
          UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
          UNPACK_FLIP_Y_WEBGL: number;
          UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
          UNSIGNED_BYTE: number;
          UNSIGNED_INT: number;
          UNSIGNED_SHORT: number;
          UNSIGNED_SHORT_4_4_4_4: number;
          UNSIGNED_SHORT_5_5_5_1: number;
          UNSIGNED_SHORT_5_6_5: number;
          VALIDATE_STATUS: number;
          VENDOR: number;
          VERSION: number;
          VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
          VERTEX_ATTRIB_ARRAY_ENABLED: number;
          VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
          VERTEX_ATTRIB_ARRAY_POINTER: number;
          VERTEX_ATTRIB_ARRAY_SIZE: number;
          VERTEX_ATTRIB_ARRAY_STRIDE: number;
          VERTEX_ATTRIB_ARRAY_TYPE: number;
          VERTEX_SHADER: number;
          VIEWPORT: number;
          ZERO: number;
      }
      
      declare var WebGLRenderingContext: {
          prototype: WebGLRenderingContext;
          new(): WebGLRenderingContext;
          ACTIVE_ATTRIBUTES: number;
          ACTIVE_TEXTURE: number;
          ACTIVE_UNIFORMS: number;
          ALIASED_LINE_WIDTH_RANGE: number;
          ALIASED_POINT_SIZE_RANGE: number;
          ALPHA: number;
          ALPHA_BITS: number;
          ALWAYS: number;
          ARRAY_BUFFER: number;
          ARRAY_BUFFER_BINDING: number;
          ATTACHED_SHADERS: number;
          BACK: number;
          BLEND: number;
          BLEND_COLOR: number;
          BLEND_DST_ALPHA: number;
          BLEND_DST_RGB: number;
          BLEND_EQUATION: number;
          BLEND_EQUATION_ALPHA: number;
          BLEND_EQUATION_RGB: number;
          BLEND_SRC_ALPHA: number;
          BLEND_SRC_RGB: number;
          BLUE_BITS: number;
          BOOL: number;
          BOOL_VEC2: number;
          BOOL_VEC3: number;
          BOOL_VEC4: number;
          BROWSER_DEFAULT_WEBGL: number;
          BUFFER_SIZE: number;
          BUFFER_USAGE: number;
          BYTE: number;
          CCW: number;
          CLAMP_TO_EDGE: number;
          COLOR_ATTACHMENT0: number;
          COLOR_BUFFER_BIT: number;
          COLOR_CLEAR_VALUE: number;
          COLOR_WRITEMASK: number;
          COMPILE_STATUS: number;
          COMPRESSED_TEXTURE_FORMATS: number;
          CONSTANT_ALPHA: number;
          CONSTANT_COLOR: number;
          CONTEXT_LOST_WEBGL: number;
          CULL_FACE: number;
          CULL_FACE_MODE: number;
          CURRENT_PROGRAM: number;
          CURRENT_VERTEX_ATTRIB: number;
          CW: number;
          DECR: number;
          DECR_WRAP: number;
          DELETE_STATUS: number;
          DEPTH_ATTACHMENT: number;
          DEPTH_BITS: number;
          DEPTH_BUFFER_BIT: number;
          DEPTH_CLEAR_VALUE: number;
          DEPTH_COMPONENT: number;
          DEPTH_COMPONENT16: number;
          DEPTH_FUNC: number;
          DEPTH_RANGE: number;
          DEPTH_STENCIL: number;
          DEPTH_STENCIL_ATTACHMENT: number;
          DEPTH_TEST: number;
          DEPTH_WRITEMASK: number;
          DITHER: number;
          DONT_CARE: number;
          DST_ALPHA: number;
          DST_COLOR: number;
          DYNAMIC_DRAW: number;
          ELEMENT_ARRAY_BUFFER: number;
          ELEMENT_ARRAY_BUFFER_BINDING: number;
          EQUAL: number;
          FASTEST: number;
          FLOAT: number;
          FLOAT_MAT2: number;
          FLOAT_MAT3: number;
          FLOAT_MAT4: number;
          FLOAT_VEC2: number;
          FLOAT_VEC3: number;
          FLOAT_VEC4: number;
          FRAGMENT_SHADER: number;
          FRAMEBUFFER: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: number;
          FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: number;
          FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: number;
          FRAMEBUFFER_BINDING: number;
          FRAMEBUFFER_COMPLETE: number;
          FRAMEBUFFER_INCOMPLETE_ATTACHMENT: number;
          FRAMEBUFFER_INCOMPLETE_DIMENSIONS: number;
          FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: number;
          FRAMEBUFFER_UNSUPPORTED: number;
          FRONT: number;
          FRONT_AND_BACK: number;
          FRONT_FACE: number;
          FUNC_ADD: number;
          FUNC_REVERSE_SUBTRACT: number;
          FUNC_SUBTRACT: number;
          GENERATE_MIPMAP_HINT: number;
          GEQUAL: number;
          GREATER: number;
          GREEN_BITS: number;
          HIGH_FLOAT: number;
          HIGH_INT: number;
          IMPLEMENTATION_COLOR_READ_FORMAT: number;
          IMPLEMENTATION_COLOR_READ_TYPE: number;
          INCR: number;
          INCR_WRAP: number;
          INT: number;
          INT_VEC2: number;
          INT_VEC3: number;
          INT_VEC4: number;
          INVALID_ENUM: number;
          INVALID_FRAMEBUFFER_OPERATION: number;
          INVALID_OPERATION: number;
          INVALID_VALUE: number;
          INVERT: number;
          KEEP: number;
          LEQUAL: number;
          LESS: number;
          LINEAR: number;
          LINEAR_MIPMAP_LINEAR: number;
          LINEAR_MIPMAP_NEAREST: number;
          LINES: number;
          LINE_LOOP: number;
          LINE_STRIP: number;
          LINE_WIDTH: number;
          LINK_STATUS: number;
          LOW_FLOAT: number;
          LOW_INT: number;
          LUMINANCE: number;
          LUMINANCE_ALPHA: number;
          MAX_COMBINED_TEXTURE_IMAGE_UNITS: number;
          MAX_CUBE_MAP_TEXTURE_SIZE: number;
          MAX_FRAGMENT_UNIFORM_VECTORS: number;
          MAX_RENDERBUFFER_SIZE: number;
          MAX_TEXTURE_IMAGE_UNITS: number;
          MAX_TEXTURE_SIZE: number;
          MAX_VARYING_VECTORS: number;
          MAX_VERTEX_ATTRIBS: number;
          MAX_VERTEX_TEXTURE_IMAGE_UNITS: number;
          MAX_VERTEX_UNIFORM_VECTORS: number;
          MAX_VIEWPORT_DIMS: number;
          MEDIUM_FLOAT: number;
          MEDIUM_INT: number;
          MIRRORED_REPEAT: number;
          NEAREST: number;
          NEAREST_MIPMAP_LINEAR: number;
          NEAREST_MIPMAP_NEAREST: number;
          NEVER: number;
          NICEST: number;
          NONE: number;
          NOTEQUAL: number;
          NO_ERROR: number;
          ONE: number;
          ONE_MINUS_CONSTANT_ALPHA: number;
          ONE_MINUS_CONSTANT_COLOR: number;
          ONE_MINUS_DST_ALPHA: number;
          ONE_MINUS_DST_COLOR: number;
          ONE_MINUS_SRC_ALPHA: number;
          ONE_MINUS_SRC_COLOR: number;
          OUT_OF_MEMORY: number;
          PACK_ALIGNMENT: number;
          POINTS: number;
          POLYGON_OFFSET_FACTOR: number;
          POLYGON_OFFSET_FILL: number;
          POLYGON_OFFSET_UNITS: number;
          RED_BITS: number;
          RENDERBUFFER: number;
          RENDERBUFFER_ALPHA_SIZE: number;
          RENDERBUFFER_BINDING: number;
          RENDERBUFFER_BLUE_SIZE: number;
          RENDERBUFFER_DEPTH_SIZE: number;
          RENDERBUFFER_GREEN_SIZE: number;
          RENDERBUFFER_HEIGHT: number;
          RENDERBUFFER_INTERNAL_FORMAT: number;
          RENDERBUFFER_RED_SIZE: number;
          RENDERBUFFER_STENCIL_SIZE: number;
          RENDERBUFFER_WIDTH: number;
          RENDERER: number;
          REPEAT: number;
          REPLACE: number;
          RGB: number;
          RGB565: number;
          RGB5_A1: number;
          RGBA: number;
          RGBA4: number;
          SAMPLER_2D: number;
          SAMPLER_CUBE: number;
          SAMPLES: number;
          SAMPLE_ALPHA_TO_COVERAGE: number;
          SAMPLE_BUFFERS: number;
          SAMPLE_COVERAGE: number;
          SAMPLE_COVERAGE_INVERT: number;
          SAMPLE_COVERAGE_VALUE: number;
          SCISSOR_BOX: number;
          SCISSOR_TEST: number;
          SHADER_TYPE: number;
          SHADING_LANGUAGE_VERSION: number;
          SHORT: number;
          SRC_ALPHA: number;
          SRC_ALPHA_SATURATE: number;
          SRC_COLOR: number;
          STATIC_DRAW: number;
          STENCIL_ATTACHMENT: number;
          STENCIL_BACK_FAIL: number;
          STENCIL_BACK_FUNC: number;
          STENCIL_BACK_PASS_DEPTH_FAIL: number;
          STENCIL_BACK_PASS_DEPTH_PASS: number;
          STENCIL_BACK_REF: number;
          STENCIL_BACK_VALUE_MASK: number;
          STENCIL_BACK_WRITEMASK: number;
          STENCIL_BITS: number;
          STENCIL_BUFFER_BIT: number;
          STENCIL_CLEAR_VALUE: number;
          STENCIL_FAIL: number;
          STENCIL_FUNC: number;
          STENCIL_INDEX: number;
          STENCIL_INDEX8: number;
          STENCIL_PASS_DEPTH_FAIL: number;
          STENCIL_PASS_DEPTH_PASS: number;
          STENCIL_REF: number;
          STENCIL_TEST: number;
          STENCIL_VALUE_MASK: number;
          STENCIL_WRITEMASK: number;
          STREAM_DRAW: number;
          SUBPIXEL_BITS: number;
          TEXTURE: number;
          TEXTURE0: number;
          TEXTURE1: number;
          TEXTURE10: number;
          TEXTURE11: number;
          TEXTURE12: number;
          TEXTURE13: number;
          TEXTURE14: number;
          TEXTURE15: number;
          TEXTURE16: number;
          TEXTURE17: number;
          TEXTURE18: number;
          TEXTURE19: number;
          TEXTURE2: number;
          TEXTURE20: number;
          TEXTURE21: number;
          TEXTURE22: number;
          TEXTURE23: number;
          TEXTURE24: number;
          TEXTURE25: number;
          TEXTURE26: number;
          TEXTURE27: number;
          TEXTURE28: number;
          TEXTURE29: number;
          TEXTURE3: number;
          TEXTURE30: number;
          TEXTURE31: number;
          TEXTURE4: number;
          TEXTURE5: number;
          TEXTURE6: number;
          TEXTURE7: number;
          TEXTURE8: number;
          TEXTURE9: number;
          TEXTURE_2D: number;
          TEXTURE_BINDING_2D: number;
          TEXTURE_BINDING_CUBE_MAP: number;
          TEXTURE_CUBE_MAP: number;
          TEXTURE_CUBE_MAP_NEGATIVE_X: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Y: number;
          TEXTURE_CUBE_MAP_NEGATIVE_Z: number;
          TEXTURE_CUBE_MAP_POSITIVE_X: number;
          TEXTURE_CUBE_MAP_POSITIVE_Y: number;
          TEXTURE_CUBE_MAP_POSITIVE_Z: number;
          TEXTURE_MAG_FILTER: number;
          TEXTURE_MIN_FILTER: number;
          TEXTURE_WRAP_S: number;
          TEXTURE_WRAP_T: number;
          TRIANGLES: number;
          TRIANGLE_FAN: number;
          TRIANGLE_STRIP: number;
          UNPACK_ALIGNMENT: number;
          UNPACK_COLORSPACE_CONVERSION_WEBGL: number;
          UNPACK_FLIP_Y_WEBGL: number;
          UNPACK_PREMULTIPLY_ALPHA_WEBGL: number;
          UNSIGNED_BYTE: number;
          UNSIGNED_INT: number;
          UNSIGNED_SHORT: number;
          UNSIGNED_SHORT_4_4_4_4: number;
          UNSIGNED_SHORT_5_5_5_1: number;
          UNSIGNED_SHORT_5_6_5: number;
          VALIDATE_STATUS: number;
          VENDOR: number;
          VERSION: number;
          VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: number;
          VERTEX_ATTRIB_ARRAY_ENABLED: number;
          VERTEX_ATTRIB_ARRAY_NORMALIZED: number;
          VERTEX_ATTRIB_ARRAY_POINTER: number;
          VERTEX_ATTRIB_ARRAY_SIZE: number;
          VERTEX_ATTRIB_ARRAY_STRIDE: number;
          VERTEX_ATTRIB_ARRAY_TYPE: number;
          VERTEX_SHADER: number;
          VIEWPORT: number;
          ZERO: number;
      }
      
      interface WebGLShader extends WebGLObject {
      }
      
      declare var WebGLShader: {
          prototype: WebGLShader;
          new(): WebGLShader;
      }
      
      interface WebGLShaderPrecisionFormat {
          precision: number;
          rangeMax: number;
          rangeMin: number;
      }
      
      declare var WebGLShaderPrecisionFormat: {
          prototype: WebGLShaderPrecisionFormat;
          new(): WebGLShaderPrecisionFormat;
      }
      
      interface WebGLTexture extends WebGLObject {
      }
      
      declare var WebGLTexture: {
          prototype: WebGLTexture;
          new(): WebGLTexture;
      }
      
      interface WebGLUniformLocation {
      }
      
      declare var WebGLUniformLocation: {
          prototype: WebGLUniformLocation;
          new(): WebGLUniformLocation;
      }
      
      interface WebKitCSSMatrix {
          a: number;
          b: number;
          c: number;
          d: number;
          e: number;
          f: number;
          m11: number;
          m12: number;
          m13: number;
          m14: number;
          m21: number;
          m22: number;
          m23: number;
          m24: number;
          m31: number;
          m32: number;
          m33: number;
          m34: number;
          m41: number;
          m42: number;
          m43: number;
          m44: number;
          inverse(): WebKitCSSMatrix;
          multiply(secondMatrix: WebKitCSSMatrix): WebKitCSSMatrix;
          rotate(angleX: number, angleY?: number, angleZ?: number): WebKitCSSMatrix;
          rotateAxisAngle(x: number, y: number, z: number, angle: number): WebKitCSSMatrix;
          scale(scaleX: number, scaleY?: number, scaleZ?: number): WebKitCSSMatrix;
          setMatrixValue(value: string): void;
          skewX(angle: number): WebKitCSSMatrix;
          skewY(angle: number): WebKitCSSMatrix;
          toString(): string;
          translate(x: number, y: number, z?: number): WebKitCSSMatrix;
      }
      
      declare var WebKitCSSMatrix: {
          prototype: WebKitCSSMatrix;
          new(text?: string): WebKitCSSMatrix;
      }
      
      interface WebKitPoint {
          x: number;
          y: number;
      }
      
      declare var WebKitPoint: {
          prototype: WebKitPoint;
          new(x?: number, y?: number): WebKitPoint;
      }
      
      interface WebSocket extends EventTarget {
          binaryType: string;
          bufferedAmount: number;
          extensions: string;
          onclose: (ev: CloseEvent) => any;
          onerror: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onopen: (ev: Event) => any;
          protocol: string;
          readyState: number;
          url: string;
          close(code?: number, reason?: string): void;
          send(data: any): void;
          CLOSED: number;
          CLOSING: number;
          CONNECTING: number;
          OPEN: number;
          addEventListener(type: "close", listener: (ev: CloseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "open", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var WebSocket: {
          prototype: WebSocket;
          new(url: string, protocols?: string): WebSocket;
          new(url: string, protocols?: any): WebSocket;
          CLOSED: number;
          CLOSING: number;
          CONNECTING: number;
          OPEN: number;
      }
      
      interface WheelEvent extends MouseEvent {
          deltaMode: number;
          deltaX: number;
          deltaY: number;
          deltaZ: number;
          getCurrentPoint(element: Element): void;
          initWheelEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, detailArg: number, screenXArg: number, screenYArg: number, clientXArg: number, clientYArg: number, buttonArg: number, relatedTargetArg: EventTarget, modifiersListArg: string, deltaXArg: number, deltaYArg: number, deltaZArg: number, deltaMode: number): void;
          DOM_DELTA_LINE: number;
          DOM_DELTA_PAGE: number;
          DOM_DELTA_PIXEL: number;
      }
      
      declare var WheelEvent: {
          prototype: WheelEvent;
          new(typeArg: string, eventInitDict?: WheelEventInit): WheelEvent;
          DOM_DELTA_LINE: number;
          DOM_DELTA_PAGE: number;
          DOM_DELTA_PIXEL: number;
      }
      
      interface Window extends EventTarget, WindowTimers, WindowSessionStorage, WindowLocalStorage, WindowConsole, GlobalEventHandlers, IDBEnvironment, WindowBase64 {
          animationStartTime: number;
          applicationCache: ApplicationCache;
          clientInformation: Navigator;
          closed: boolean;
          crypto: Crypto;
          defaultStatus: string;
          devicePixelRatio: number;
          doNotTrack: string;
          document: Document;
          event: Event;
          external: External;
          frameElement: Element;
          frames: Window;
          history: History;
          innerHeight: number;
          innerWidth: number;
          length: number;
          location: Location;
          locationbar: BarProp;
          menubar: BarProp;
          msAnimationStartTime: number;
          msTemplatePrinter: MSTemplatePrinter;
          name: string;
          navigator: Navigator;
          offscreenBuffering: string | boolean;
          onabort: (ev: Event) => any;
          onafterprint: (ev: Event) => any;
          onbeforeprint: (ev: Event) => any;
          onbeforeunload: (ev: BeforeUnloadEvent) => any;
          onblur: (ev: FocusEvent) => any;
          oncanplay: (ev: Event) => any;
          oncanplaythrough: (ev: Event) => any;
          onchange: (ev: Event) => any;
          onclick: (ev: MouseEvent) => any;
          oncompassneedscalibration: (ev: Event) => any;
          oncontextmenu: (ev: PointerEvent) => any;
          ondblclick: (ev: MouseEvent) => any;
          ondevicemotion: (ev: DeviceMotionEvent) => any;
          ondeviceorientation: (ev: DeviceOrientationEvent) => any;
          ondrag: (ev: DragEvent) => any;
          ondragend: (ev: DragEvent) => any;
          ondragenter: (ev: DragEvent) => any;
          ondragleave: (ev: DragEvent) => any;
          ondragover: (ev: DragEvent) => any;
          ondragstart: (ev: DragEvent) => any;
          ondrop: (ev: DragEvent) => any;
          ondurationchange: (ev: Event) => any;
          onemptied: (ev: Event) => any;
          onended: (ev: Event) => any;
          onerror: ErrorEventHandler;
          onfocus: (ev: FocusEvent) => any;
          onhashchange: (ev: HashChangeEvent) => any;
          oninput: (ev: Event) => any;
          onkeydown: (ev: KeyboardEvent) => any;
          onkeypress: (ev: KeyboardEvent) => any;
          onkeyup: (ev: KeyboardEvent) => any;
          onload: (ev: Event) => any;
          onloadeddata: (ev: Event) => any;
          onloadedmetadata: (ev: Event) => any;
          onloadstart: (ev: Event) => any;
          onmessage: (ev: MessageEvent) => any;
          onmousedown: (ev: MouseEvent) => any;
          onmouseenter: (ev: MouseEvent) => any;
          onmouseleave: (ev: MouseEvent) => any;
          onmousemove: (ev: MouseEvent) => any;
          onmouseout: (ev: MouseEvent) => any;
          onmouseover: (ev: MouseEvent) => any;
          onmouseup: (ev: MouseEvent) => any;
          onmousewheel: (ev: MouseWheelEvent) => any;
          onmsgesturechange: (ev: MSGestureEvent) => any;
          onmsgesturedoubletap: (ev: MSGestureEvent) => any;
          onmsgestureend: (ev: MSGestureEvent) => any;
          onmsgesturehold: (ev: MSGestureEvent) => any;
          onmsgesturestart: (ev: MSGestureEvent) => any;
          onmsgesturetap: (ev: MSGestureEvent) => any;
          onmsinertiastart: (ev: MSGestureEvent) => any;
          onmspointercancel: (ev: MSPointerEvent) => any;
          onmspointerdown: (ev: MSPointerEvent) => any;
          onmspointerenter: (ev: MSPointerEvent) => any;
          onmspointerleave: (ev: MSPointerEvent) => any;
          onmspointermove: (ev: MSPointerEvent) => any;
          onmspointerout: (ev: MSPointerEvent) => any;
          onmspointerover: (ev: MSPointerEvent) => any;
          onmspointerup: (ev: MSPointerEvent) => any;
          onoffline: (ev: Event) => any;
          ononline: (ev: Event) => any;
          onorientationchange: (ev: Event) => any;
          onpagehide: (ev: PageTransitionEvent) => any;
          onpageshow: (ev: PageTransitionEvent) => any;
          onpause: (ev: Event) => any;
          onplay: (ev: Event) => any;
          onplaying: (ev: Event) => any;
          onpopstate: (ev: PopStateEvent) => any;
          onprogress: (ev: ProgressEvent) => any;
          onratechange: (ev: Event) => any;
          onreadystatechange: (ev: ProgressEvent) => any;
          onreset: (ev: Event) => any;
          onresize: (ev: UIEvent) => any;
          onscroll: (ev: UIEvent) => any;
          onseeked: (ev: Event) => any;
          onseeking: (ev: Event) => any;
          onselect: (ev: UIEvent) => any;
          onstalled: (ev: Event) => any;
          onstorage: (ev: StorageEvent) => any;
          onsubmit: (ev: Event) => any;
          onsuspend: (ev: Event) => any;
          ontimeupdate: (ev: Event) => any;
          ontouchcancel: any;
          ontouchend: any;
          ontouchmove: any;
          ontouchstart: any;
          onunload: (ev: Event) => any;
          onvolumechange: (ev: Event) => any;
          onwaiting: (ev: Event) => any;
          opener: Window;
          orientation: string;
          outerHeight: number;
          outerWidth: number;
          pageXOffset: number;
          pageYOffset: number;
          parent: Window;
          performance: Performance;
          personalbar: BarProp;
          screen: Screen;
          screenLeft: number;
          screenTop: number;
          screenX: number;
          screenY: number;
          scrollX: number;
          scrollY: number;
          scrollbars: BarProp;
          self: Window;
          status: string;
          statusbar: BarProp;
          styleMedia: StyleMedia;
          toolbar: BarProp;
          top: Window;
          window: Window;
          alert(message?: any): void;
          blur(): void;
          cancelAnimationFrame(handle: number): void;
          captureEvents(): void;
          close(): void;
          confirm(message?: string): boolean;
          focus(): void;
          getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
          getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;
          getSelection(): Selection;
          matchMedia(mediaQuery: string): MediaQueryList;
          moveBy(x?: number, y?: number): void;
          moveTo(x?: number, y?: number): void;
          msCancelRequestAnimationFrame(handle: number): void;
          msMatchMedia(mediaQuery: string): MediaQueryList;
          msRequestAnimationFrame(callback: FrameRequestCallback): number;
          msWriteProfilerMark(profilerMarkName: string): void;
          open(url?: string, target?: string, features?: string, replace?: boolean): any;
          postMessage(message: any, targetOrigin: string, ports?: any): void;
          print(): void;
          prompt(message?: string, _default?: string): string;
          releaseEvents(): void;
          requestAnimationFrame(callback: FrameRequestCallback): number;
          resizeBy(x?: number, y?: number): void;
          resizeTo(x?: number, y?: number): void;
          scroll(x?: number, y?: number): void;
          scrollBy(x?: number, y?: number): void;
          scrollTo(x?: number, y?: number): void;
          webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;
          webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;
          addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "compassneedscalibration", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "devicemotion", listener: (ev: DeviceMotionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "deviceorientation", listener: (ev: DeviceOrientationEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
          [index: number]: Window;
      }
      
      declare var Window: {
          prototype: Window;
          new(): Window;
      }
      
      interface Worker extends EventTarget, AbstractWorker {
          onmessage: (ev: MessageEvent) => any;
          postMessage(message: any, ports?: any): void;
          terminate(): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var Worker: {
          prototype: Worker;
          new(stringUrl: string): Worker;
      }
      
      interface XMLDocument extends Document {
      }
      
      declare var XMLDocument: {
          prototype: XMLDocument;
          new(): XMLDocument;
      }
      
      interface XMLHttpRequest extends EventTarget, XMLHttpRequestEventTarget {
          msCaching: string;
          onreadystatechange: (ev: ProgressEvent) => any;
          readyState: number;
          response: any;
          responseBody: any;
          responseText: string;
          responseType: string;
          responseXML: any;
          status: number;
          statusText: string;
          timeout: number;
          upload: XMLHttpRequestUpload;
          withCredentials: boolean;
          abort(): void;
          getAllResponseHeaders(): string;
          getResponseHeader(header: string): string;
          msCachingEnabled(): boolean;
          open(method: string, url: string, async?: boolean, user?: string, password?: string): void;
          overrideMimeType(mime: string): void;
          send(data?: Document): void;
          send(data?: string): void;
          send(data?: any): void;
          setRequestHeader(header: string, value: string): void;
          DONE: number;
          HEADERS_RECEIVED: number;
          LOADING: number;
          OPENED: number;
          UNSENT: number;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "timeout", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var XMLHttpRequest: {
          prototype: XMLHttpRequest;
          new(): XMLHttpRequest;
          DONE: number;
          HEADERS_RECEIVED: number;
          LOADING: number;
          OPENED: number;
          UNSENT: number;
          create(): XMLHttpRequest;
      }
      
      interface XMLHttpRequestUpload extends EventTarget, XMLHttpRequestEventTarget {
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      declare var XMLHttpRequestUpload: {
          prototype: XMLHttpRequestUpload;
          new(): XMLHttpRequestUpload;
      }
      
      interface XMLSerializer {
          serializeToString(target: Node): string;
      }
      
      declare var XMLSerializer: {
          prototype: XMLSerializer;
          new(): XMLSerializer;
      }
      
      interface XPathEvaluator {
          createExpression(expression: string, resolver: XPathNSResolver): XPathExpression;
          createNSResolver(nodeResolver?: Node): XPathNSResolver;
          evaluate(expression: string, contextNode: Node, resolver: XPathNSResolver, type: number, result: XPathResult): XPathResult;
      }
      
      declare var XPathEvaluator: {
          prototype: XPathEvaluator;
          new(): XPathEvaluator;
      }
      
      interface XPathExpression {
          evaluate(contextNode: Node, type: number, result: XPathResult): XPathExpression;
      }
      
      declare var XPathExpression: {
          prototype: XPathExpression;
          new(): XPathExpression;
      }
      
      interface XPathNSResolver {
          lookupNamespaceURI(prefix: string): string;
      }
      
      declare var XPathNSResolver: {
          prototype: XPathNSResolver;
          new(): XPathNSResolver;
      }
      
      interface XPathResult {
          booleanValue: boolean;
          invalidIteratorState: boolean;
          numberValue: number;
          resultType: number;
          singleNodeValue: Node;
          snapshotLength: number;
          stringValue: string;
          iterateNext(): Node;
          snapshotItem(index: number): Node;
          ANY_TYPE: number;
          ANY_UNORDERED_NODE_TYPE: number;
          BOOLEAN_TYPE: number;
          FIRST_ORDERED_NODE_TYPE: number;
          NUMBER_TYPE: number;
          ORDERED_NODE_ITERATOR_TYPE: number;
          ORDERED_NODE_SNAPSHOT_TYPE: number;
          STRING_TYPE: number;
          UNORDERED_NODE_ITERATOR_TYPE: number;
          UNORDERED_NODE_SNAPSHOT_TYPE: number;
      }
      
      declare var XPathResult: {
          prototype: XPathResult;
          new(): XPathResult;
          ANY_TYPE: number;
          ANY_UNORDERED_NODE_TYPE: number;
          BOOLEAN_TYPE: number;
          FIRST_ORDERED_NODE_TYPE: number;
          NUMBER_TYPE: number;
          ORDERED_NODE_ITERATOR_TYPE: number;
          ORDERED_NODE_SNAPSHOT_TYPE: number;
          STRING_TYPE: number;
          UNORDERED_NODE_ITERATOR_TYPE: number;
          UNORDERED_NODE_SNAPSHOT_TYPE: number;
      }
      
      interface XSLTProcessor {
          clearParameters(): void;
          getParameter(namespaceURI: string, localName: string): any;
          importStylesheet(style: Node): void;
          removeParameter(namespaceURI: string, localName: string): void;
          reset(): void;
          setParameter(namespaceURI: string, localName: string, value: any): void;
          transformToDocument(source: Node): Document;
          transformToFragment(source: Node, document: Document): DocumentFragment;
      }
      
      declare var XSLTProcessor: {
          prototype: XSLTProcessor;
          new(): XSLTProcessor;
      }
      
      interface AbstractWorker {
          onerror: (ev: Event) => any;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      interface ChildNode {
          remove(): void;
      }
      
      interface DOML2DeprecatedColorProperty {
          color: string;
      }
      
      interface DOML2DeprecatedSizeProperty {
          size: number;
      }
      
      interface DocumentEvent {
          createEvent(eventInterface:"AnimationEvent"): AnimationEvent;
          createEvent(eventInterface:"AriaRequestEvent"): AriaRequestEvent;
          createEvent(eventInterface:"AudioProcessingEvent"): AudioProcessingEvent;
          createEvent(eventInterface:"BeforeUnloadEvent"): BeforeUnloadEvent;
          createEvent(eventInterface:"CloseEvent"): CloseEvent;
          createEvent(eventInterface:"CommandEvent"): CommandEvent;
          createEvent(eventInterface:"CompositionEvent"): CompositionEvent;
          createEvent(eventInterface: "CustomEvent"): CustomEvent;
          createEvent(eventInterface:"DeviceMotionEvent"): DeviceMotionEvent;
          createEvent(eventInterface:"DeviceOrientationEvent"): DeviceOrientationEvent;
          createEvent(eventInterface:"DragEvent"): DragEvent;
          createEvent(eventInterface:"ErrorEvent"): ErrorEvent;
          createEvent(eventInterface:"Event"): Event;
          createEvent(eventInterface:"Events"): Event;
          createEvent(eventInterface:"FocusEvent"): FocusEvent;
          createEvent(eventInterface:"GamepadEvent"): GamepadEvent;
          createEvent(eventInterface:"HashChangeEvent"): HashChangeEvent;
          createEvent(eventInterface:"IDBVersionChangeEvent"): IDBVersionChangeEvent;
          createEvent(eventInterface:"KeyboardEvent"): KeyboardEvent;
          createEvent(eventInterface:"LongRunningScriptDetectedEvent"): LongRunningScriptDetectedEvent;
          createEvent(eventInterface:"MSGestureEvent"): MSGestureEvent;
          createEvent(eventInterface:"MSManipulationEvent"): MSManipulationEvent;
          createEvent(eventInterface:"MSMediaKeyMessageEvent"): MSMediaKeyMessageEvent;
          createEvent(eventInterface:"MSMediaKeyNeededEvent"): MSMediaKeyNeededEvent;
          createEvent(eventInterface:"MSPointerEvent"): MSPointerEvent;
          createEvent(eventInterface:"MSSiteModeEvent"): MSSiteModeEvent;
          createEvent(eventInterface:"MessageEvent"): MessageEvent;
          createEvent(eventInterface:"MouseEvent"): MouseEvent;
          createEvent(eventInterface:"MouseEvents"): MouseEvent;
          createEvent(eventInterface:"MouseWheelEvent"): MouseWheelEvent;
          createEvent(eventInterface:"MSGestureEvent"): MSGestureEvent;
          createEvent(eventInterface:"MSPointerEvent"): MSPointerEvent;
          createEvent(eventInterface:"MutationEvent"): MutationEvent;
          createEvent(eventInterface:"MutationEvents"): MutationEvent;
          createEvent(eventInterface:"NavigationCompletedEvent"): NavigationCompletedEvent;
          createEvent(eventInterface:"NavigationEvent"): NavigationEvent;
          createEvent(eventInterface:"NavigationEventWithReferrer"): NavigationEventWithReferrer;
          createEvent(eventInterface:"OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent;
          createEvent(eventInterface:"PageTransitionEvent"): PageTransitionEvent;
          createEvent(eventInterface:"PermissionRequestedEvent"): PermissionRequestedEvent;
          createEvent(eventInterface:"PointerEvent"): PointerEvent;
          createEvent(eventInterface:"PopStateEvent"): PopStateEvent;
          createEvent(eventInterface:"ProgressEvent"): ProgressEvent;
          createEvent(eventInterface:"SVGZoomEvent"): SVGZoomEvent;
          createEvent(eventInterface:"SVGZoomEvents"): SVGZoomEvent;
          createEvent(eventInterface:"ScriptNotifyEvent"): ScriptNotifyEvent;
          createEvent(eventInterface:"StorageEvent"): StorageEvent;
          createEvent(eventInterface:"TextEvent"): TextEvent;
          createEvent(eventInterface:"TouchEvent"): TouchEvent;
          createEvent(eventInterface:"TrackEvent"): TrackEvent;
          createEvent(eventInterface:"TransitionEvent"): TransitionEvent;
          createEvent(eventInterface:"UIEvent"): UIEvent;
          createEvent(eventInterface:"UIEvents"): UIEvent;
          createEvent(eventInterface:"UnviewableContentIdentifiedEvent"): UnviewableContentIdentifiedEvent;
          createEvent(eventInterface:"WebGLContextEvent"): WebGLContextEvent;
          createEvent(eventInterface:"WheelEvent"): WheelEvent;
          createEvent(eventInterface: string): Event;
      }
      
      interface ElementTraversal {
          childElementCount: number;
          firstElementChild: Element;
          lastElementChild: Element;
          nextElementSibling: Element;
          previousElementSibling: Element;
      }
      
      interface GetSVGDocument {
          getSVGDocument(): Document;
      }
      
      interface GlobalEventHandlers {
          onpointercancel: (ev: PointerEvent) => any;
          onpointerdown: (ev: PointerEvent) => any;
          onpointerenter: (ev: PointerEvent) => any;
          onpointerleave: (ev: PointerEvent) => any;
          onpointermove: (ev: PointerEvent) => any;
          onpointerout: (ev: PointerEvent) => any;
          onpointerover: (ev: PointerEvent) => any;
          onpointerup: (ev: PointerEvent) => any;
          onwheel: (ev: WheelEvent) => any;
          addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      interface HTMLTableAlignment {
          /**
            * Sets or retrieves a value that you can use to implement your own ch functionality for the object.
            */
          ch: string;
          /**
            * Sets or retrieves a value that you can use to implement your own chOff functionality for the object.
            */
          chOff: string;
          /**
            * Sets or retrieves how text and other content are vertically aligned within the object that contains them.
            */
          vAlign: string;
      }
      
      interface IDBEnvironment {
          indexedDB: IDBFactory;
          msIndexedDB: IDBFactory;
      }
      
      interface LinkStyle {
          sheet: StyleSheet;
      }
      
      interface MSBaseReader {
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onload: (ev: Event) => any;
          onloadend: (ev: ProgressEvent) => any;
          onloadstart: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          readyState: number;
          result: any;
          abort(): void;
          DONE: number;
          EMPTY: number;
          LOADING: number;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      interface MSFileSaver {
          msSaveBlob(blob: any, defaultName?: string): boolean;
          msSaveOrOpenBlob(blob: any, defaultName?: string): boolean;
      }
      
      interface MSNavigatorDoNotTrack {
          confirmSiteSpecificTrackingException(args: ConfirmSiteSpecificExceptionsInformation): boolean;
          confirmWebWideTrackingException(args: ExceptionInformation): boolean;
          removeSiteSpecificTrackingException(args: ExceptionInformation): void;
          removeWebWideTrackingException(args: ExceptionInformation): void;
          storeSiteSpecificTrackingException(args: StoreSiteSpecificExceptionsInformation): void;
          storeWebWideTrackingException(args: StoreExceptionsInformation): void;
      }
      
      interface NavigatorContentUtils {
      }
      
      interface NavigatorGeolocation {
          geolocation: Geolocation;
      }
      
      interface NavigatorID {
          appName: string;
          appVersion: string;
          platform: string;
          product: string;
          productSub: string;
          userAgent: string;
          vendor: string;
          vendorSub: string;
      }
      
      interface NavigatorOnLine {
          onLine: boolean;
      }
      
      interface NavigatorStorageUtils {
      }
      
      interface NodeSelector {
          querySelector(selectors: string): Element;
          querySelectorAll(selectors: string): NodeList;
      }
      
      interface RandomSource {
          getRandomValues(array: ArrayBufferView): ArrayBufferView;
      }
      
      interface SVGAnimatedPathData {
          pathSegList: SVGPathSegList;
      }
      
      interface SVGAnimatedPoints {
          animatedPoints: SVGPointList;
          points: SVGPointList;
      }
      
      interface SVGExternalResourcesRequired {
          externalResourcesRequired: SVGAnimatedBoolean;
      }
      
      interface SVGFilterPrimitiveStandardAttributes extends SVGStylable {
          height: SVGAnimatedLength;
          result: SVGAnimatedString;
          width: SVGAnimatedLength;
          x: SVGAnimatedLength;
          y: SVGAnimatedLength;
      }
      
      interface SVGFitToViewBox {
          preserveAspectRatio: SVGAnimatedPreserveAspectRatio;
          viewBox: SVGAnimatedRect;
      }
      
      interface SVGLangSpace {
          xmllang: string;
          xmlspace: string;
      }
      
      interface SVGLocatable {
          farthestViewportElement: SVGElement;
          nearestViewportElement: SVGElement;
          getBBox(): SVGRect;
          getCTM(): SVGMatrix;
          getScreenCTM(): SVGMatrix;
          getTransformToElement(element: SVGElement): SVGMatrix;
      }
      
      interface SVGStylable {
          className: SVGAnimatedString;
          style: CSSStyleDeclaration;
      }
      
      interface SVGTests {
          requiredExtensions: SVGStringList;
          requiredFeatures: SVGStringList;
          systemLanguage: SVGStringList;
          hasExtension(extension: string): boolean;
      }
      
      interface SVGTransformable extends SVGLocatable {
          transform: SVGAnimatedTransformList;
      }
      
      interface SVGURIReference {
          href: SVGAnimatedString;
      }
      
      interface WindowBase64 {
          atob(encodedString: string): string;
          btoa(rawString: string): string;
      }
      
      interface WindowConsole {
          console: Console;
      }
      
      interface WindowLocalStorage {
          localStorage: Storage;
      }
      
      interface WindowSessionStorage {
          sessionStorage: Storage;
      }
      
      interface WindowTimers extends Object, WindowTimersExtension {
          clearInterval(handle: number): void;
          clearTimeout(handle: number): void;
          setInterval(handler: any, timeout?: any, ...args: any[]): number;
          setTimeout(handler: any, timeout?: any, ...args: any[]): number;
      }
      
      interface WindowTimersExtension {
          clearImmediate(handle: number): void;
          msClearImmediate(handle: number): void;
          msSetImmediate(expression: any, ...args: any[]): number;
          setImmediate(expression: any, ...args: any[]): number;
      }
      
      interface XMLHttpRequestEventTarget {
          onabort: (ev: Event) => any;
          onerror: (ev: Event) => any;
          onload: (ev: Event) => any;
          onloadend: (ev: ProgressEvent) => any;
          onloadstart: (ev: Event) => any;
          onprogress: (ev: ProgressEvent) => any;
          ontimeout: (ev: ProgressEvent) => any;
          addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "error", listener: (ev: ErrorEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "loadend", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
          addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: "timeout", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
          addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      }
      
      
      interface NodeListOf<TNode extends Node> extends NodeList {
          length: number;
          item(index: number): TNode;
          [index: number]: TNode;
      }
      
      interface BlobPropertyBag {
          type?: string;
          endings?: string;
      }
      
      interface EventListenerObject {
          handleEvent(evt: Event): void;
      }
      
      declare type EventListenerOrEventListenerObject = EventListener | EventListenerObject;
      
      interface ErrorEventHandler {
          (event: Event, source?: string, fileno?: number, columnNumber?: number): void;
          (event: string, source?: string, fileno?: number, columnNumber?: number): void;
      }
      interface PositionCallback {
          (position: Position): void;
      }
      interface PositionErrorCallback {
          (error: PositionError): void;
      }
      interface MediaQueryListListener {
          (mql: MediaQueryList): void;
      }
      interface MSLaunchUriCallback {
          (): void;
      }
      interface FrameRequestCallback {
          (time: number): void;
      }
      interface MSUnsafeFunctionCallback {
          (): any;
      }
      interface MSExecAtPriorityFunctionCallback {
          (...args: any[]): any;
      }
      interface MutationCallback {
          (mutations: MutationRecord[], observer: MutationObserver): void;
      }
      interface DecodeSuccessCallback {
          (decodedData: AudioBuffer): void;
      }
      interface DecodeErrorCallback {
          (): void;
      }
      interface FunctionStringCallback {
          (data: string): void;
      }
      declare var Audio: {new(src?: string): HTMLAudioElement; };
      declare var Image: {new(width?: number, height?: number): HTMLImageElement; };
      declare var Option: {new(text?: string, value?: string, defaultSelected?: boolean, selected?: boolean): HTMLOptionElement; };
      declare var animationStartTime: number;
      declare var applicationCache: ApplicationCache;
      declare var clientInformation: Navigator;
      declare var closed: boolean;
      declare var crypto: Crypto;
      declare var defaultStatus: string;
      declare var devicePixelRatio: number;
      declare var doNotTrack: string;
      declare var document: Document;
      declare var event: Event;
      declare var external: External;
      declare var frameElement: Element;
      declare var frames: Window;
      declare var history: History;
      declare var innerHeight: number;
      declare var innerWidth: number;
      declare var length: number;
      declare var location: Location;
      declare var locationbar: BarProp;
      declare var menubar: BarProp;
      declare var msAnimationStartTime: number;
      declare var msTemplatePrinter: MSTemplatePrinter;
      declare var name: string;
      declare var navigator: Navigator;
      declare var offscreenBuffering: string | boolean;
      declare var onabort: (ev: Event) => any;
      declare var onafterprint: (ev: Event) => any;
      declare var onbeforeprint: (ev: Event) => any;
      declare var onbeforeunload: (ev: BeforeUnloadEvent) => any;
      declare var onblur: (ev: FocusEvent) => any;
      declare var oncanplay: (ev: Event) => any;
      declare var oncanplaythrough: (ev: Event) => any;
      declare var onchange: (ev: Event) => any;
      declare var onclick: (ev: MouseEvent) => any;
      declare var oncompassneedscalibration: (ev: Event) => any;
      declare var oncontextmenu: (ev: PointerEvent) => any;
      declare var ondblclick: (ev: MouseEvent) => any;
      declare var ondevicemotion: (ev: DeviceMotionEvent) => any;
      declare var ondeviceorientation: (ev: DeviceOrientationEvent) => any;
      declare var ondrag: (ev: DragEvent) => any;
      declare var ondragend: (ev: DragEvent) => any;
      declare var ondragenter: (ev: DragEvent) => any;
      declare var ondragleave: (ev: DragEvent) => any;
      declare var ondragover: (ev: DragEvent) => any;
      declare var ondragstart: (ev: DragEvent) => any;
      declare var ondrop: (ev: DragEvent) => any;
      declare var ondurationchange: (ev: Event) => any;
      declare var onemptied: (ev: Event) => any;
      declare var onended: (ev: Event) => any;
      declare var onerror: ErrorEventHandler;
      declare var onfocus: (ev: FocusEvent) => any;
      declare var onhashchange: (ev: HashChangeEvent) => any;
      declare var oninput: (ev: Event) => any;
      declare var onkeydown: (ev: KeyboardEvent) => any;
      declare var onkeypress: (ev: KeyboardEvent) => any;
      declare var onkeyup: (ev: KeyboardEvent) => any;
      declare var onload: (ev: Event) => any;
      declare var onloadeddata: (ev: Event) => any;
      declare var onloadedmetadata: (ev: Event) => any;
      declare var onloadstart: (ev: Event) => any;
      declare var onmessage: (ev: MessageEvent) => any;
      declare var onmousedown: (ev: MouseEvent) => any;
      declare var onmouseenter: (ev: MouseEvent) => any;
      declare var onmouseleave: (ev: MouseEvent) => any;
      declare var onmousemove: (ev: MouseEvent) => any;
      declare var onmouseout: (ev: MouseEvent) => any;
      declare var onmouseover: (ev: MouseEvent) => any;
      declare var onmouseup: (ev: MouseEvent) => any;
      declare var onmousewheel: (ev: MouseWheelEvent) => any;
      declare var onmsgesturechange: (ev: MSGestureEvent) => any;
      declare var onmsgesturedoubletap: (ev: MSGestureEvent) => any;
      declare var onmsgestureend: (ev: MSGestureEvent) => any;
      declare var onmsgesturehold: (ev: MSGestureEvent) => any;
      declare var onmsgesturestart: (ev: MSGestureEvent) => any;
      declare var onmsgesturetap: (ev: MSGestureEvent) => any;
      declare var onmsinertiastart: (ev: MSGestureEvent) => any;
      declare var onmspointercancel: (ev: MSPointerEvent) => any;
      declare var onmspointerdown: (ev: MSPointerEvent) => any;
      declare var onmspointerenter: (ev: MSPointerEvent) => any;
      declare var onmspointerleave: (ev: MSPointerEvent) => any;
      declare var onmspointermove: (ev: MSPointerEvent) => any;
      declare var onmspointerout: (ev: MSPointerEvent) => any;
      declare var onmspointerover: (ev: MSPointerEvent) => any;
      declare var onmspointerup: (ev: MSPointerEvent) => any;
      declare var onoffline: (ev: Event) => any;
      declare var ononline: (ev: Event) => any;
      declare var onorientationchange: (ev: Event) => any;
      declare var onpagehide: (ev: PageTransitionEvent) => any;
      declare var onpageshow: (ev: PageTransitionEvent) => any;
      declare var onpause: (ev: Event) => any;
      declare var onplay: (ev: Event) => any;
      declare var onplaying: (ev: Event) => any;
      declare var onpopstate: (ev: PopStateEvent) => any;
      declare var onprogress: (ev: ProgressEvent) => any;
      declare var onratechange: (ev: Event) => any;
      declare var onreadystatechange: (ev: ProgressEvent) => any;
      declare var onreset: (ev: Event) => any;
      declare var onresize: (ev: UIEvent) => any;
      declare var onscroll: (ev: UIEvent) => any;
      declare var onseeked: (ev: Event) => any;
      declare var onseeking: (ev: Event) => any;
      declare var onselect: (ev: UIEvent) => any;
      declare var onstalled: (ev: Event) => any;
      declare var onstorage: (ev: StorageEvent) => any;
      declare var onsubmit: (ev: Event) => any;
      declare var onsuspend: (ev: Event) => any;
      declare var ontimeupdate: (ev: Event) => any;
      declare var ontouchcancel: any;
      declare var ontouchend: any;
      declare var ontouchmove: any;
      declare var ontouchstart: any;
      declare var onunload: (ev: Event) => any;
      declare var onvolumechange: (ev: Event) => any;
      declare var onwaiting: (ev: Event) => any;
      declare var opener: Window;
      declare var orientation: string;
      declare var outerHeight: number;
      declare var outerWidth: number;
      declare var pageXOffset: number;
      declare var pageYOffset: number;
      declare var parent: Window;
      declare var performance: Performance;
      declare var personalbar: BarProp;
      declare var screen: Screen;
      declare var screenLeft: number;
      declare var screenTop: number;
      declare var screenX: number;
      declare var screenY: number;
      declare var scrollX: number;
      declare var scrollY: number;
      declare var scrollbars: BarProp;
      declare var self: Window;
      declare var status: string;
      declare var statusbar: BarProp;
      declare var styleMedia: StyleMedia;
      declare var toolbar: BarProp;
      declare var top: Window;
      declare var window: Window;
      declare function alert(message?: any): void;
      declare function blur(): void;
      declare function cancelAnimationFrame(handle: number): void;
      declare function captureEvents(): void;
      declare function close(): void;
      declare function confirm(message?: string): boolean;
      declare function focus(): void;
      declare function getComputedStyle(elt: Element, pseudoElt?: string): CSSStyleDeclaration;
      declare function getMatchedCSSRules(elt: Element, pseudoElt?: string): CSSRuleList;
      declare function getSelection(): Selection;
      declare function matchMedia(mediaQuery: string): MediaQueryList;
      declare function moveBy(x?: number, y?: number): void;
      declare function moveTo(x?: number, y?: number): void;
      declare function msCancelRequestAnimationFrame(handle: number): void;
      declare function msMatchMedia(mediaQuery: string): MediaQueryList;
      declare function msRequestAnimationFrame(callback: FrameRequestCallback): number;
      declare function msWriteProfilerMark(profilerMarkName: string): void;
      declare function open(url?: string, target?: string, features?: string, replace?: boolean): any;
      declare function postMessage(message: any, targetOrigin: string, ports?: any): void;
      declare function print(): void;
      declare function prompt(message?: string, _default?: string): string;
      declare function releaseEvents(): void;
      declare function requestAnimationFrame(callback: FrameRequestCallback): number;
      declare function resizeBy(x?: number, y?: number): void;
      declare function resizeTo(x?: number, y?: number): void;
      declare function scroll(x?: number, y?: number): void;
      declare function scrollBy(x?: number, y?: number): void;
      declare function scrollTo(x?: number, y?: number): void;
      declare function webkitConvertPointFromNodeToPage(node: Node, pt: WebKitPoint): WebKitPoint;
      declare function webkitConvertPointFromPageToNode(node: Node, pt: WebKitPoint): WebKitPoint;
      declare function toString(): string;
      declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      declare function dispatchEvent(evt: Event): boolean;
      declare function removeEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      declare function clearInterval(handle: number): void;
      declare function clearTimeout(handle: number): void;
      declare function setInterval(handler: any, timeout?: any, ...args: any[]): number;
      declare function setTimeout(handler: any, timeout?: any, ...args: any[]): number;
      declare function clearImmediate(handle: number): void;
      declare function msClearImmediate(handle: number): void;
      declare function msSetImmediate(expression: any, ...args: any[]): number;
      declare function setImmediate(expression: any, ...args: any[]): number;
      declare var sessionStorage: Storage;
      declare var localStorage: Storage;
      declare var console: Console;
      declare var onpointercancel: (ev: PointerEvent) => any;
      declare var onpointerdown: (ev: PointerEvent) => any;
      declare var onpointerenter: (ev: PointerEvent) => any;
      declare var onpointerleave: (ev: PointerEvent) => any;
      declare var onpointermove: (ev: PointerEvent) => any;
      declare var onpointerout: (ev: PointerEvent) => any;
      declare var onpointerover: (ev: PointerEvent) => any;
      declare var onpointerup: (ev: PointerEvent) => any;
      declare var onwheel: (ev: WheelEvent) => any;
      declare var indexedDB: IDBFactory;
      declare var msIndexedDB: IDBFactory;
      declare function atob(encodedString: string): string;
      declare function btoa(rawString: string): string;
      declare function addEventListener(type: "MSGestureChange", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureDoubleTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureEnd", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureHold", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSGestureTap", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSInertiaStart", listener: (ev: MSGestureEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerCancel", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerDown", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerEnter", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerLeave", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerMove", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerOut", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerOver", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "MSPointerUp", listener: (ev: MSPointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "abort", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "afterprint", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "beforeprint", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "beforeunload", listener: (ev: BeforeUnloadEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "blur", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "canplay", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "canplaythrough", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "change", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "click", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "compassneedscalibration", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "contextmenu", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dblclick", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "devicemotion", listener: (ev: DeviceMotionEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "deviceorientation", listener: (ev: DeviceOrientationEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "drag", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragend", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragenter", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragleave", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragover", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "dragstart", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "drop", listener: (ev: DragEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "durationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "emptied", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "ended", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "focus", listener: (ev: FocusEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "hashchange", listener: (ev: HashChangeEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "input", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "keydown", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "keypress", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "keyup", listener: (ev: KeyboardEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "load", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "loadeddata", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "loadedmetadata", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "loadstart", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "message", listener: (ev: MessageEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mousedown", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseenter", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseleave", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mousemove", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseout", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseover", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mouseup", listener: (ev: MouseEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "mousewheel", listener: (ev: MouseWheelEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "offline", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "online", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "orientationchange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pagehide", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pageshow", listener: (ev: PageTransitionEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pause", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "play", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "playing", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointercancel", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerdown", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerenter", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerleave", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointermove", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerout", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerover", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "pointerup", listener: (ev: PointerEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "popstate", listener: (ev: PopStateEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "progress", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "ratechange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "readystatechange", listener: (ev: ProgressEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "reset", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "resize", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "scroll", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "seeked", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "seeking", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "select", listener: (ev: UIEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "stalled", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "storage", listener: (ev: StorageEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "submit", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "suspend", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "timeupdate", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "unload", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "volumechange", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "waiting", listener: (ev: Event) => any, useCapture?: boolean): void;
      declare function addEventListener(type: "wheel", listener: (ev: WheelEvent) => any, useCapture?: boolean): void;
      declare function addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
      /////////////////////////////
      /// WorkerGlobalScope APIs 
      /////////////////////////////
      // These are only available in a Web Worker 
      declare function importScripts(...urls: string[]): void;
      
      
      /////////////////////////////
      /// Windows Script Host APIS
      /////////////////////////////
      
      
      interface ActiveXObject {
          new (s: string): any;
      }
      declare var ActiveXObject: ActiveXObject;
      
      interface ITextWriter {
          Write(s: string): void;
          WriteLine(s: string): void;
          Close(): void;
      }
      
      interface TextStreamBase {
          /**
           * The column number of the current character position in an input stream.
           */
          Column: number;
      
          /**
           * The current line number in an input stream.
           */
          Line: number;
      
          /**
           * Closes a text stream.
           * It is not necessary to close standard streams; they close automatically when the process ends. If 
           * you close a standard stream, be aware that any other pointers to that standard stream become invalid.
           */
          Close(): void;
      }
      
      interface TextStreamWriter extends TextStreamBase {
          /**
           * Sends a string to an output stream.
           */
          Write(s: string): void;
      
          /**
           * Sends a specified number of blank lines (newline characters) to an output stream.
           */
          WriteBlankLines(intLines: number): void;
      
          /**
           * Sends a string followed by a newline character to an output stream.
           */
          WriteLine(s: string): void;
      }
      
      interface TextStreamReader extends TextStreamBase {
          /**
           * Returns a specified number of characters from an input stream, starting at the current pointer position.
           * Does not return until the ENTER key is pressed.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           */
          Read(characters: number): string;
      
          /**
           * Returns all characters from an input stream.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           */
          ReadAll(): string;
      
          /**
           * Returns an entire line from an input stream.
           * Although this method extracts the newline character, it does not add it to the returned string.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           */
          ReadLine(): string;
      
          /**
           * Skips a specified number of characters when reading from an input text stream.
           * Can only be used on a stream in reading mode; causes an error in writing or appending mode.
           * @param characters Positive number of characters to skip forward. (Backward skipping is not supported.)
           */
          Skip(characters: number): void;
      
          /**
           * Skips the next line when reading from an input text stream.
           * Can only be used on a stream in reading mode, not writing or appending mode.
           */
          SkipLine(): void;
      
          /**
           * Indicates whether the stream pointer position is at the end of a line.
           */
          AtEndOfLine: boolean;
      
          /**
           * Indicates whether the stream pointer position is at the end of a stream.
           */
          AtEndOfStream: boolean;
      }
      
      declare var WScript: {
          /**
          * Outputs text to either a message box (under WScript.exe) or the command console window followed by
          * a newline (under CScript.exe).
          */
          Echo(s: any): void;
      
          /**
           * Exposes the write-only error output stream for the current script.
           * Can be accessed only while using CScript.exe.
           */
          StdErr: TextStreamWriter;
      
          /**
           * Exposes the write-only output stream for the current script.
           * Can be accessed only while using CScript.exe.
           */
          StdOut: TextStreamWriter;
          Arguments: { length: number; Item(n: number): string; };
      
          /**
           *  The full path of the currently running script.
           */
          ScriptFullName: string;
      
          /**
           * Forces the script to stop immediately, with an optional exit code.
           */
          Quit(exitCode?: number): number;
      
          /**
           * The Windows Script Host build version number.
           */
          BuildVersion: number;
      
          /**
           * Fully qualified path of the host executable.
           */
          FullName: string;
      
          /**
           * Gets/sets the script mode - interactive(true) or batch(false).
           */
          Interactive: boolean;
      
          /**
           * The name of the host executable (WScript.exe or CScript.exe).
           */
          Name: string;
      
          /**
           * Path of the directory containing the host executable.
           */
          Path: string;
      
          /**
           * The filename of the currently running script.
           */
          ScriptName: string;
      
          /**
           * Exposes the read-only input stream for the current script.
           * Can be accessed only while using CScript.exe.
           */
          StdIn: TextStreamReader;
      
          /**
           * Windows Script Host version
           */
          Version: string;
      
          /**
           * Connects a COM object's event sources to functions named with a given prefix, in the form prefix_event.
           */
          ConnectObject(objEventSource: any, strPrefix: string): void;
      
          /**
           * Creates a COM object.
           * @param strProgiID
           * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
           */
          CreateObject(strProgID: string, strPrefix?: string): any;
      
          /**
           * Disconnects a COM object from its event sources.
           */
          DisconnectObject(obj: any): void;
      
          /**
           * Retrieves an existing object with the specified ProgID from memory, or creates a new one from a file.
           * @param strPathname Fully qualified path to the file containing the object persisted to disk.
           *                       For objects in memory, pass a zero-length string.
           * @param strProgID
           * @param strPrefix Function names in the form prefix_event will be bound to this object's COM events.
           */
          GetObject(strPathname: string, strProgID?: string, strPrefix?: string): any;
      
          /**
           * Suspends script execution for a specified length of time, then continues execution.
           * @param intTime Interval (in milliseconds) to suspend script execution.
           */
          Sleep(intTime: number): void;
      };
      
      /**
       * Allows enumerating over a COM collection, which may not have indexed item access.
       */
      interface Enumerator<T> {
          /**
           * Returns true if the current item is the last one in the collection, or the collection is empty,
           * or the current item is undefined.
           */
          atEnd(): boolean;
      
          /**
           * Returns the current item in the collection
           */
          item(): T;
      
          /**
           * Resets the current item in the collection to the first item. If there are no items in the collection,
           * the current item is set to undefined.
           */
          moveFirst(): void;
      
          /**
           * Moves the current item to the next item in the collection. If the enumerator is at the end of
           * the collection or the collection is empty, the current item is set to undefined.
           */
          moveNext(): void;
      }
      
      interface EnumeratorConstructor {
          new <T>(collection: any): Enumerator<T>;
          new (collection: any): Enumerator<any>;
      }
      
      declare var Enumerator: EnumeratorConstructor;
      
      /**
       * Enables reading from a COM safe array, which might have an alternate lower bound, or multiple dimensions.
       */
      interface VBArray<T> {
          /**
           * Returns the number of dimensions (1-based).
           */
          dimensions(): number;
      
          /**
           * Takes an index for each dimension in the array, and returns the item at the corresponding location.
           */
          getItem(dimension1Index: number, ...dimensionNIndexes: number[]): T;
      
          /**
           * Returns the smallest available index for a given dimension.
           * @param dimension 1-based dimension (defaults to 1)
           */
          lbound(dimension?: number): number;
      
          /**
           * Returns the largest available index for a given dimension.
           * @param dimension 1-based dimension (defaults to 1)
           */
          ubound(dimension?: number): number;
      
          /**
           * Returns a Javascript array with all the elements in the VBArray. If there are multiple dimensions,
           * each successive dimension is appended to the end of the array.
           * Example: [[1,2,3],[4,5,6]] becomes [1,2,3,4,5,6]
           */
          toArray(): T[];
      }
      
      interface VBArrayConstructor {
          new <T>(safeArray: any): VBArray<T>;
          new (safeArray: any): VBArray<any>;
      }
      
      declare var VBArray: VBArrayConstructor;
      
    • tsc.js
      /*! *****************************************************************************
      Copyright (c) Microsoft Corporation. All rights reserved. 
      Licensed under the Apache License, Version 2.0 (the "License"); you may not use
      this file except in compliance with the License. You may obtain a copy of the
      License at http://www.apache.org/licenses/LICENSE-2.0  
       
      THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
      KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
      WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, 
      MERCHANTABLITY OR NON-INFRINGEMENT. 
       
      See the Apache Version 2.0 License for specific language governing permissions
      and limitations under the License.
      ***************************************************************************** */
      
      var ts;
      (function (ts) {
          (function (ExitStatus) {
              ExitStatus[ExitStatus["Success"] = 0] = "Success";
              ExitStatus[ExitStatus["DiagnosticsPresent_OutputsSkipped"] = 1] = "DiagnosticsPresent_OutputsSkipped";
              ExitStatus[ExitStatus["DiagnosticsPresent_OutputsGenerated"] = 2] = "DiagnosticsPresent_OutputsGenerated";
          })(ts.ExitStatus || (ts.ExitStatus = {}));
          var ExitStatus = ts.ExitStatus;
          (function (DiagnosticCategory) {
              DiagnosticCategory[DiagnosticCategory["Warning"] = 0] = "Warning";
              DiagnosticCategory[DiagnosticCategory["Error"] = 1] = "Error";
              DiagnosticCategory[DiagnosticCategory["Message"] = 2] = "Message";
          })(ts.DiagnosticCategory || (ts.DiagnosticCategory = {}));
          var DiagnosticCategory = ts.DiagnosticCategory;
      })(ts || (ts = {}));
      /// <reference path="types.ts"/>
      var ts;
      (function (ts) {
          function forEach(array, callback) {
              if (array) {
                  for (var i = 0, len = array.length; i < len; i++) {
                      var result = callback(array[i], i);
                      if (result) {
                          return result;
                      }
                  }
              }
              return undefined;
          }
          ts.forEach = forEach;
          function contains(array, value) {
              if (array) {
                  for (var _i = 0; _i < array.length; _i++) {
                      var v = array[_i];
                      if (v === value) {
                          return true;
                      }
                  }
              }
              return false;
          }
          ts.contains = contains;
          function indexOf(array, value) {
              if (array) {
                  for (var i = 0, len = array.length; i < len; i++) {
                      if (array[i] === value) {
                          return i;
                      }
                  }
              }
              return -1;
          }
          ts.indexOf = indexOf;
          function countWhere(array, predicate) {
              var count = 0;
              if (array) {
                  for (var _i = 0; _i < array.length; _i++) {
                      var v = array[_i];
                      if (predicate(v)) {
                          count++;
                      }
                  }
              }
              return count;
          }
          ts.countWhere = countWhere;
          function filter(array, f) {
              var result;
              if (array) {
                  result = [];
                  for (var _i = 0; _i < array.length; _i++) {
                      var item = array[_i];
                      if (f(item)) {
                          result.push(item);
                      }
                  }
              }
              return result;
          }
          ts.filter = filter;
          function map(array, f) {
              var result;
              if (array) {
                  result = [];
                  for (var _i = 0; _i < array.length; _i++) {
                      var v = array[_i];
                      result.push(f(v));
                  }
              }
              return result;
          }
          ts.map = map;
          function concatenate(array1, array2) {
              if (!array2 || !array2.length)
                  return array1;
              if (!array1 || !array1.length)
                  return array2;
              return array1.concat(array2);
          }
          ts.concatenate = concatenate;
          function deduplicate(array) {
              var result;
              if (array) {
                  result = [];
                  for (var _i = 0; _i < array.length; _i++) {
                      var item = array[_i];
                      if (!contains(result, item)) {
                          result.push(item);
                      }
                  }
              }
              return result;
          }
          ts.deduplicate = deduplicate;
          function sum(array, prop) {
              var result = 0;
              for (var _i = 0; _i < array.length; _i++) {
                  var v = array[_i];
                  result += v[prop];
              }
              return result;
          }
          ts.sum = sum;
          function addRange(to, from) {
              if (to && from) {
                  for (var _i = 0; _i < from.length; _i++) {
                      var v = from[_i];
                      to.push(v);
                  }
              }
          }
          ts.addRange = addRange;
          function lastOrUndefined(array) {
              if (array.length === 0) {
                  return undefined;
              }
              return array[array.length - 1];
          }
          ts.lastOrUndefined = lastOrUndefined;
          function binarySearch(array, value) {
              var low = 0;
              var high = array.length - 1;
              while (low <= high) {
                  var middle = low + ((high - low) >> 1);
                  var midValue = array[middle];
                  if (midValue === value) {
                      return middle;
                  }
                  else if (midValue > value) {
                      high = middle - 1;
                  }
                  else {
                      low = middle + 1;
                  }
              }
              return ~low;
          }
          ts.binarySearch = binarySearch;
          function reduceLeft(array, f, initial) {
              if (array) {
                  var count = array.length;
                  if (count > 0) {
                      var pos = 0;
                      var result = arguments.length <= 2 ? array[pos++] : initial;
                      while (pos < count) {
                          result = f(result, array[pos++]);
                      }
                      return result;
                  }
              }
              return initial;
          }
          ts.reduceLeft = reduceLeft;
          function reduceRight(array, f, initial) {
              if (array) {
                  var pos = array.length - 1;
                  if (pos >= 0) {
                      var result = arguments.length <= 2 ? array[pos--] : initial;
                      while (pos >= 0) {
                          result = f(result, array[pos--]);
                      }
                      return result;
                  }
              }
              return initial;
          }
          ts.reduceRight = reduceRight;
          var hasOwnProperty = Object.prototype.hasOwnProperty;
          function hasProperty(map, key) {
              return hasOwnProperty.call(map, key);
          }
          ts.hasProperty = hasProperty;
          function getProperty(map, key) {
              return hasOwnProperty.call(map, key) ? map[key] : undefined;
          }
          ts.getProperty = getProperty;
          function isEmpty(map) {
              for (var id in map) {
                  if (hasProperty(map, id)) {
                      return false;
                  }
              }
              return true;
          }
          ts.isEmpty = isEmpty;
          function clone(object) {
              var result = {};
              for (var id in object) {
                  result[id] = object[id];
              }
              return result;
          }
          ts.clone = clone;
          function extend(first, second) {
              var result = {};
              for (var id in first) {
                  result[id] = first[id];
              }
              for (var id in second) {
                  if (!hasProperty(result, id)) {
                      result[id] = second[id];
                  }
              }
              return result;
          }
          ts.extend = extend;
          function forEachValue(map, callback) {
              var result;
              for (var id in map) {
                  if (result = callback(map[id]))
                      break;
              }
              return result;
          }
          ts.forEachValue = forEachValue;
          function forEachKey(map, callback) {
              var result;
              for (var id in map) {
                  if (result = callback(id))
                      break;
              }
              return result;
          }
          ts.forEachKey = forEachKey;
          function lookUp(map, key) {
              return hasProperty(map, key) ? map[key] : undefined;
          }
          ts.lookUp = lookUp;
          function copyMap(source, target) {
              for (var p in source) {
                  target[p] = source[p];
              }
          }
          ts.copyMap = copyMap;
          function arrayToMap(array, makeKey) {
              var result = {};
              forEach(array, function (value) {
                  result[makeKey(value)] = value;
              });
              return result;
          }
          ts.arrayToMap = arrayToMap;
          function memoize(callback) {
              var value;
              return function () {
                  if (callback) {
                      value = callback();
                      callback = undefined;
                  }
                  return value;
              };
          }
          ts.memoize = memoize;
          function formatStringFromArgs(text, args, baseIndex) {
              baseIndex = baseIndex || 0;
              return text.replace(/{(\d+)}/g, function (match, index) { return args[+index + baseIndex]; });
          }
          ts.localizedDiagnosticMessages = undefined;
          function getLocaleSpecificMessage(message) {
              return ts.localizedDiagnosticMessages && ts.localizedDiagnosticMessages[message]
                  ? ts.localizedDiagnosticMessages[message]
                  : message;
          }
          ts.getLocaleSpecificMessage = getLocaleSpecificMessage;
          function createFileDiagnostic(file, start, length, message) {
              var end = start + length;
              Debug.assert(start >= 0, "start must be non-negative, is " + start);
              Debug.assert(length >= 0, "length must be non-negative, is " + length);
              Debug.assert(start <= file.text.length, "start must be within the bounds of the file. " + start + " > " + file.text.length);
              Debug.assert(end <= file.text.length, "end must be the bounds of the file. " + end + " > " + file.text.length);
              var text = getLocaleSpecificMessage(message.key);
              if (arguments.length > 4) {
                  text = formatStringFromArgs(text, arguments, 4);
              }
              return {
                  file: file,
                  start: start,
                  length: length,
                  messageText: text,
                  category: message.category,
                  code: message.code
              };
          }
          ts.createFileDiagnostic = createFileDiagnostic;
          function createCompilerDiagnostic(message) {
              var text = getLocaleSpecificMessage(message.key);
              if (arguments.length > 1) {
                  text = formatStringFromArgs(text, arguments, 1);
              }
              return {
                  file: undefined,
                  start: undefined,
                  length: undefined,
                  messageText: text,
                  category: message.category,
                  code: message.code
              };
          }
          ts.createCompilerDiagnostic = createCompilerDiagnostic;
          function chainDiagnosticMessages(details, message) {
              var text = getLocaleSpecificMessage(message.key);
              if (arguments.length > 2) {
                  text = formatStringFromArgs(text, arguments, 2);
              }
              return {
                  messageText: text,
                  category: message.category,
                  code: message.code,
                  next: details
              };
          }
          ts.chainDiagnosticMessages = chainDiagnosticMessages;
          function concatenateDiagnosticMessageChains(headChain, tailChain) {
              Debug.assert(!headChain.next);
              headChain.next = tailChain;
              return headChain;
          }
          ts.concatenateDiagnosticMessageChains = concatenateDiagnosticMessageChains;
          function compareValues(a, b) {
              if (a === b)
                  return 0;
              if (a === undefined)
                  return -1;
              if (b === undefined)
                  return 1;
              return a < b ? -1 : 1;
          }
          ts.compareValues = compareValues;
          function getDiagnosticFileName(diagnostic) {
              return diagnostic.file ? diagnostic.file.fileName : undefined;
          }
          function compareDiagnostics(d1, d2) {
              return compareValues(getDiagnosticFileName(d1), getDiagnosticFileName(d2)) ||
                  compareValues(d1.start, d2.start) ||
                  compareValues(d1.length, d2.length) ||
                  compareValues(d1.code, d2.code) ||
                  compareMessageText(d1.messageText, d2.messageText) ||
                  0;
          }
          ts.compareDiagnostics = compareDiagnostics;
          function compareMessageText(text1, text2) {
              while (text1 && text2) {
                  var string1 = typeof text1 === "string" ? text1 : text1.messageText;
                  var string2 = typeof text2 === "string" ? text2 : text2.messageText;
                  var res = compareValues(string1, string2);
                  if (res) {
                      return res;
                  }
                  text1 = typeof text1 === "string" ? undefined : text1.next;
                  text2 = typeof text2 === "string" ? undefined : text2.next;
              }
              if (!text1 && !text2) {
                  return 0;
              }
              return text1 ? 1 : -1;
          }
          function sortAndDeduplicateDiagnostics(diagnostics) {
              return deduplicateSortedDiagnostics(diagnostics.sort(compareDiagnostics));
          }
          ts.sortAndDeduplicateDiagnostics = sortAndDeduplicateDiagnostics;
          function deduplicateSortedDiagnostics(diagnostics) {
              if (diagnostics.length < 2) {
                  return diagnostics;
              }
              var newDiagnostics = [diagnostics[0]];
              var previousDiagnostic = diagnostics[0];
              for (var i = 1; i < diagnostics.length; i++) {
                  var currentDiagnostic = diagnostics[i];
                  var isDupe = compareDiagnostics(currentDiagnostic, previousDiagnostic) === 0;
                  if (!isDupe) {
                      newDiagnostics.push(currentDiagnostic);
                      previousDiagnostic = currentDiagnostic;
                  }
              }
              return newDiagnostics;
          }
          ts.deduplicateSortedDiagnostics = deduplicateSortedDiagnostics;
          function normalizeSlashes(path) {
              return path.replace(/\\/g, "/");
          }
          ts.normalizeSlashes = normalizeSlashes;
          function getRootLength(path) {
              if (path.charCodeAt(0) === 47) {
                  if (path.charCodeAt(1) !== 47)
                      return 1;
                  var p1 = path.indexOf("/", 2);
                  if (p1 < 0)
                      return 2;
                  var p2 = path.indexOf("/", p1 + 1);
                  if (p2 < 0)
                      return p1 + 1;
                  return p2 + 1;
              }
              if (path.charCodeAt(1) === 58) {
                  if (path.charCodeAt(2) === 47)
                      return 3;
                  return 2;
              }
              if (path.lastIndexOf("file:///", 0) === 0) {
                  return "file:///".length;
              }
              var idx = path.indexOf('://');
              if (idx !== -1) {
                  return idx + "://".length;
              }
              return 0;
          }
          ts.getRootLength = getRootLength;
          ts.directorySeparator = "/";
          function getNormalizedParts(normalizedSlashedPath, rootLength) {
              var parts = normalizedSlashedPath.substr(rootLength).split(ts.directorySeparator);
              var normalized = [];
              for (var _i = 0; _i < parts.length; _i++) {
                  var part = parts[_i];
                  if (part !== ".") {
                      if (part === ".." && normalized.length > 0 && lastOrUndefined(normalized) !== "..") {
                          normalized.pop();
                      }
                      else {
                          if (part) {
                              normalized.push(part);
                          }
                      }
                  }
              }
              return normalized;
          }
          function normalizePath(path) {
              path = normalizeSlashes(path);
              var rootLength = getRootLength(path);
              var normalized = getNormalizedParts(path, rootLength);
              return path.substr(0, rootLength) + normalized.join(ts.directorySeparator);
          }
          ts.normalizePath = normalizePath;
          function getDirectoryPath(path) {
              return path.substr(0, Math.max(getRootLength(path), path.lastIndexOf(ts.directorySeparator)));
          }
          ts.getDirectoryPath = getDirectoryPath;
          function isUrl(path) {
              return path && !isRootedDiskPath(path) && path.indexOf("://") !== -1;
          }
          ts.isUrl = isUrl;
          function isRootedDiskPath(path) {
              return getRootLength(path) !== 0;
          }
          ts.isRootedDiskPath = isRootedDiskPath;
          function normalizedPathComponents(path, rootLength) {
              var normalizedParts = getNormalizedParts(path, rootLength);
              return [path.substr(0, rootLength)].concat(normalizedParts);
          }
          function getNormalizedPathComponents(path, currentDirectory) {
              path = normalizeSlashes(path);
              var rootLength = getRootLength(path);
              if (rootLength == 0) {
                  path = combinePaths(normalizeSlashes(currentDirectory), path);
                  rootLength = getRootLength(path);
              }
              return normalizedPathComponents(path, rootLength);
          }
          ts.getNormalizedPathComponents = getNormalizedPathComponents;
          function getNormalizedAbsolutePath(fileName, currentDirectory) {
              return getNormalizedPathFromPathComponents(getNormalizedPathComponents(fileName, currentDirectory));
          }
          ts.getNormalizedAbsolutePath = getNormalizedAbsolutePath;
          function getNormalizedPathFromPathComponents(pathComponents) {
              if (pathComponents && pathComponents.length) {
                  return pathComponents[0] + pathComponents.slice(1).join(ts.directorySeparator);
              }
          }
          ts.getNormalizedPathFromPathComponents = getNormalizedPathFromPathComponents;
          function getNormalizedPathComponentsOfUrl(url) {
              // Get root length of http://www.website.com/folder1/foler2/
              // In this example the root is:  http://www.website.com/ 
              // normalized path components should be ["http://www.website.com/", "folder1", "folder2"]
              var urlLength = url.length;
              var rootLength = url.indexOf("://") + "://".length;
              while (rootLength < urlLength) {
                  if (url.charCodeAt(rootLength) === 47) {
                      rootLength++;
                  }
                  else {
                      break;
                  }
              }
              if (rootLength === urlLength) {
                  return [url];
              }
              var indexOfNextSlash = url.indexOf(ts.directorySeparator, rootLength);
              if (indexOfNextSlash !== -1) {
                  rootLength = indexOfNextSlash + 1;
                  return normalizedPathComponents(url, rootLength);
              }
              else {
                  return [url + ts.directorySeparator];
              }
          }
          function getNormalizedPathOrUrlComponents(pathOrUrl, currentDirectory) {
              if (isUrl(pathOrUrl)) {
                  return getNormalizedPathComponentsOfUrl(pathOrUrl);
              }
              else {
                  return getNormalizedPathComponents(pathOrUrl, currentDirectory);
              }
          }
          function getRelativePathToDirectoryOrUrl(directoryPathOrUrl, relativeOrAbsolutePath, currentDirectory, getCanonicalFileName, isAbsolutePathAnUrl) {
              var pathComponents = getNormalizedPathOrUrlComponents(relativeOrAbsolutePath, currentDirectory);
              var directoryComponents = getNormalizedPathOrUrlComponents(directoryPathOrUrl, currentDirectory);
              if (directoryComponents.length > 1 && lastOrUndefined(directoryComponents) === "") {
                  directoryComponents.length--;
              }
              for (var joinStartIndex = 0; joinStartIndex < pathComponents.length && joinStartIndex < directoryComponents.length; joinStartIndex++) {
                  if (getCanonicalFileName(directoryComponents[joinStartIndex]) !== getCanonicalFileName(pathComponents[joinStartIndex])) {
                      break;
                  }
              }
              if (joinStartIndex) {
                  var relativePath = "";
                  var relativePathComponents = pathComponents.slice(joinStartIndex, pathComponents.length);
                  for (; joinStartIndex < directoryComponents.length; joinStartIndex++) {
                      if (directoryComponents[joinStartIndex] !== "") {
                          relativePath = relativePath + ".." + ts.directorySeparator;
                      }
                  }
                  return relativePath + relativePathComponents.join(ts.directorySeparator);
              }
              var absolutePath = getNormalizedPathFromPathComponents(pathComponents);
              if (isAbsolutePathAnUrl && isRootedDiskPath(absolutePath)) {
                  absolutePath = "file:///" + absolutePath;
              }
              return absolutePath;
          }
          ts.getRelativePathToDirectoryOrUrl = getRelativePathToDirectoryOrUrl;
          function getBaseFileName(path) {
              var i = path.lastIndexOf(ts.directorySeparator);
              return i < 0 ? path : path.substring(i + 1);
          }
          ts.getBaseFileName = getBaseFileName;
          function combinePaths(path1, path2) {
              if (!(path1 && path1.length))
                  return path2;
              if (!(path2 && path2.length))
                  return path1;
              if (getRootLength(path2) !== 0)
                  return path2;
              if (path1.charAt(path1.length - 1) === ts.directorySeparator)
                  return path1 + path2;
              return path1 + ts.directorySeparator + path2;
          }
          ts.combinePaths = combinePaths;
          function fileExtensionIs(path, extension) {
              var pathLen = path.length;
              var extLen = extension.length;
              return pathLen > extLen && path.substr(pathLen - extLen, extLen) === extension;
          }
          ts.fileExtensionIs = fileExtensionIs;
          ts.supportedExtensions = [".ts", ".d.ts"];
          var extensionsToRemove = [".d.ts", ".ts", ".js"];
          function removeFileExtension(path) {
              for (var _i = 0; _i < extensionsToRemove.length; _i++) {
                  var ext = extensionsToRemove[_i];
                  if (fileExtensionIs(path, ext)) {
                      return path.substr(0, path.length - ext.length);
                  }
              }
              return path;
          }
          ts.removeFileExtension = removeFileExtension;
          var backslashOrDoubleQuote = /[\"\\]/g;
          var escapedCharsRegExp = /[\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
          var escapedCharsMap = {
              "\0": "\\0",
              "\t": "\\t",
              "\v": "\\v",
              "\f": "\\f",
              "\b": "\\b",
              "\r": "\\r",
              "\n": "\\n",
              "\\": "\\\\",
              "\"": "\\\"",
              "\u2028": "\\u2028",
              "\u2029": "\\u2029",
              "\u0085": "\\u0085"
          };
          function Symbol(flags, name) {
              this.flags = flags;
              this.name = name;
              this.declarations = undefined;
          }
          function Type(checker, flags) {
              this.flags = flags;
          }
          function Signature(checker) {
          }
          ts.objectAllocator = {
              getNodeConstructor: function (kind) {
                  function Node() {
                  }
                  Node.prototype = {
                      kind: kind,
                      pos: 0,
                      end: 0,
                      flags: 0,
                      parent: undefined
                  };
                  return Node;
              },
              getSymbolConstructor: function () { return Symbol; },
              getTypeConstructor: function () { return Type; },
              getSignatureConstructor: function () { return Signature; }
          };
          var Debug;
          (function (Debug) {
              var currentAssertionLevel = 0;
              function shouldAssert(level) {
                  return currentAssertionLevel >= level;
              }
              Debug.shouldAssert = shouldAssert;
              function assert(expression, message, verboseDebugInfo) {
                  if (!expression) {
                      var verboseDebugString = "";
                      if (verboseDebugInfo) {
                          verboseDebugString = "\r\nVerbose Debug Information: " + verboseDebugInfo();
                      }
                      throw new Error("Debug Failure. False expression: " + (message || "") + verboseDebugString);
                  }
              }
              Debug.assert = assert;
              function fail(message) {
                  Debug.assert(false, message);
              }
              Debug.fail = fail;
          })(Debug = ts.Debug || (ts.Debug = {}));
      })(ts || (ts = {}));
      /// <reference path="core.ts"/>
      var ts;
      (function (ts) {
          ts.sys = (function () {
              function getWScriptSystem() {
                  var fso = new ActiveXObject("Scripting.FileSystemObject");
                  var fileStream = new ActiveXObject("ADODB.Stream");
                  fileStream.Type = 2;
                  var binaryStream = new ActiveXObject("ADODB.Stream");
                  binaryStream.Type = 1;
                  var args = [];
                  for (var i = 0; i < WScript.Arguments.length; i++) {
                      args[i] = WScript.Arguments.Item(i);
                  }
                  function readFile(fileName, encoding) {
                      if (!fso.FileExists(fileName)) {
                          return undefined;
                      }
                      fileStream.Open();
                      try {
                          if (encoding) {
                              fileStream.Charset = encoding;
                              fileStream.LoadFromFile(fileName);
                          }
                          else {
                              fileStream.Charset = "x-ansi";
                              fileStream.LoadFromFile(fileName);
                              var bom = fileStream.ReadText(2) || "";
                              fileStream.Position = 0;
                              fileStream.Charset = bom.length >= 2 && (bom.charCodeAt(0) === 0xFF && bom.charCodeAt(1) === 0xFE || bom.charCodeAt(0) === 0xFE && bom.charCodeAt(1) === 0xFF) ? "unicode" : "utf-8";
                          }
                          return fileStream.ReadText();
                      }
                      catch (e) {
                          throw e;
                      }
                      finally {
                          fileStream.Close();
                      }
                  }
                  function writeFile(fileName, data, writeByteOrderMark) {
                      fileStream.Open();
                      binaryStream.Open();
                      try {
                          fileStream.Charset = "utf-8";
                          fileStream.WriteText(data);
                          if (writeByteOrderMark) {
                              fileStream.Position = 0;
                          }
                          else {
                              fileStream.Position = 3;
                          }
                          fileStream.CopyTo(binaryStream);
                          binaryStream.SaveToFile(fileName, 2);
                      }
                      finally {
                          binaryStream.Close();
                          fileStream.Close();
                      }
                  }
                  function getNames(collection) {
                      var result = [];
                      for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
                          result.push(e.item().Name);
                      }
                      return result.sort();
                  }
                  function readDirectory(path, extension) {
                      var result = [];
                      visitDirectory(path);
                      return result;
                      function visitDirectory(path) {
                          var folder = fso.GetFolder(path || ".");
                          var files = getNames(folder.files);
                          for (var _i = 0; _i < files.length; _i++) {
                              var name_1 = files[_i];
                              if (!extension || ts.fileExtensionIs(name_1, extension)) {
                                  result.push(ts.combinePaths(path, name_1));
                              }
                          }
                          var subfolders = getNames(folder.subfolders);
                          for (var _a = 0; _a < subfolders.length; _a++) {
                              var current = subfolders[_a];
                              visitDirectory(ts.combinePaths(path, current));
                          }
                      }
                  }
                  return {
                      args: args,
                      newLine: "\r\n",
                      useCaseSensitiveFileNames: false,
                      write: function (s) {
                          WScript.StdOut.Write(s);
                      },
                      readFile: readFile,
                      writeFile: writeFile,
                      resolvePath: function (path) {
                          return fso.GetAbsolutePathName(path);
                      },
                      fileExists: function (path) {
                          return fso.FileExists(path);
                      },
                      directoryExists: function (path) {
                          return fso.FolderExists(path);
                      },
                      createDirectory: function (directoryName) {
                          if (!this.directoryExists(directoryName)) {
                              fso.CreateFolder(directoryName);
                          }
                      },
                      getExecutingFilePath: function () {
                          return WScript.ScriptFullName;
                      },
                      getCurrentDirectory: function () {
                          return new ActiveXObject("WScript.Shell").CurrentDirectory;
                      },
                      readDirectory: readDirectory,
                      exit: function (exitCode) {
                          try {
                              WScript.Quit(exitCode);
                          }
                          catch (e) {
                          }
                      }
                  };
              }
              function getNodeSystem() {
                  var _fs = require("fs");
                  var _path = require("path");
                  var _os = require('os');
                  var platform = _os.platform();
                  var useCaseSensitiveFileNames = platform !== "win32" && platform !== "win64" && platform !== "darwin";
                  function readFile(fileName, encoding) {
                      if (!_fs.existsSync(fileName)) {
                          return undefined;
                      }
                      var buffer = _fs.readFileSync(fileName);
                      var len = buffer.length;
                      if (len >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) {
                          len &= ~1;
                          for (var i = 0; i < len; i += 2) {
                              var temp = buffer[i];
                              buffer[i] = buffer[i + 1];
                              buffer[i + 1] = temp;
                          }
                          return buffer.toString("utf16le", 2);
                      }
                      if (len >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {
                          return buffer.toString("utf16le", 2);
                      }
                      if (len >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
                          return buffer.toString("utf8", 3);
                      }
                      return buffer.toString("utf8");
                  }
                  function writeFile(fileName, data, writeByteOrderMark) {
                      if (writeByteOrderMark) {
                          data = '\uFEFF' + data;
                      }
                      _fs.writeFileSync(fileName, data, "utf8");
                  }
                  function readDirectory(path, extension) {
                      var result = [];
                      visitDirectory(path);
                      return result;
                      function visitDirectory(path) {
                          var files = _fs.readdirSync(path || ".").sort();
                          var directories = [];
                          for (var _i = 0; _i < files.length; _i++) {
                              var current = files[_i];
                              var name = ts.combinePaths(path, current);
                              var stat = _fs.lstatSync(name);
                              if (stat.isFile()) {
                                  if (!extension || ts.fileExtensionIs(name, extension)) {
                                      result.push(name);
                                  }
                              }
                              else if (stat.isDirectory()) {
                                  directories.push(name);
                              }
                          }
                          for (var _a = 0; _a < directories.length; _a++) {
                              var current = directories[_a];
                              visitDirectory(current);
                          }
                      }
                  }
                  return {
                      args: process.argv.slice(2),
                      newLine: _os.EOL,
                      useCaseSensitiveFileNames: useCaseSensitiveFileNames,
                      write: function (s) {
                          _fs.writeSync(1, s);
                      },
                      readFile: readFile,
                      writeFile: writeFile,
                      watchFile: function (fileName, callback) {
                          _fs.watchFile(fileName, { persistent: true, interval: 250 }, fileChanged);
                          return {
                              close: function () { _fs.unwatchFile(fileName, fileChanged); }
                          };
                          function fileChanged(curr, prev) {
                              if (+curr.mtime <= +prev.mtime) {
                                  return;
                              }
                              callback(fileName);
                          }
                          ;
                      },
                      resolvePath: function (path) {
                          return _path.resolve(path);
                      },
                      fileExists: function (path) {
                          return _fs.existsSync(path);
                      },
                      directoryExists: function (path) {
                          return _fs.existsSync(path) && _fs.statSync(path).isDirectory();
                      },
                      createDirectory: function (directoryName) {
                          if (!this.directoryExists(directoryName)) {
                              _fs.mkdirSync(directoryName);
                          }
                      },
                      getExecutingFilePath: function () {
                          return __filename;
                      },
                      getCurrentDirectory: function () {
                          return process.cwd();
                      },
                      readDirectory: readDirectory,
                      getMemoryUsage: function () {
                          if (global.gc) {
                              global.gc();
                          }
                          return process.memoryUsage().heapUsed;
                      },
                      exit: function (exitCode) {
                          process.exit(exitCode);
                      }
                  };
              }
              if (typeof WScript !== "undefined" && typeof ActiveXObject === "function") {
                  return getWScriptSystem();
              }
              else if (typeof module !== "undefined" && module.exports) {
                  return getNodeSystem();
              }
              else {
                  return undefined;
              }
          })();
      })(ts || (ts = {}));
      /// <reference path="types.ts" />
      var ts;
      (function (ts) {
          ts.Diagnostics = {
              Unterminated_string_literal: { code: 1002, category: ts.DiagnosticCategory.Error, key: "Unterminated string literal." },
              Identifier_expected: { code: 1003, category: ts.DiagnosticCategory.Error, key: "Identifier expected." },
              _0_expected: { code: 1005, category: ts.DiagnosticCategory.Error, key: "'{0}' expected." },
              A_file_cannot_have_a_reference_to_itself: { code: 1006, category: ts.DiagnosticCategory.Error, key: "A file cannot have a reference to itself." },
              Trailing_comma_not_allowed: { code: 1009, category: ts.DiagnosticCategory.Error, key: "Trailing comma not allowed." },
              Asterisk_Slash_expected: { code: 1010, category: ts.DiagnosticCategory.Error, key: "'*/' expected." },
              Unexpected_token: { code: 1012, category: ts.DiagnosticCategory.Error, key: "Unexpected token." },
              A_rest_parameter_must_be_last_in_a_parameter_list: { code: 1014, category: ts.DiagnosticCategory.Error, key: "A rest parameter must be last in a parameter list." },
              Parameter_cannot_have_question_mark_and_initializer: { code: 1015, category: ts.DiagnosticCategory.Error, key: "Parameter cannot have question mark and initializer." },
              A_required_parameter_cannot_follow_an_optional_parameter: { code: 1016, category: ts.DiagnosticCategory.Error, key: "A required parameter cannot follow an optional parameter." },
              An_index_signature_cannot_have_a_rest_parameter: { code: 1017, category: ts.DiagnosticCategory.Error, key: "An index signature cannot have a rest parameter." },
              An_index_signature_parameter_cannot_have_an_accessibility_modifier: { code: 1018, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have an accessibility modifier." },
              An_index_signature_parameter_cannot_have_a_question_mark: { code: 1019, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have a question mark." },
              An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: ts.DiagnosticCategory.Error, key: "An index signature parameter cannot have an initializer." },
              An_index_signature_must_have_a_type_annotation: { code: 1021, category: ts.DiagnosticCategory.Error, key: "An index signature must have a type annotation." },
              An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: ts.DiagnosticCategory.Error, key: "An index signature parameter must have a type annotation." },
              An_index_signature_parameter_type_must_be_string_or_number: { code: 1023, category: ts.DiagnosticCategory.Error, key: "An index signature parameter type must be 'string' or 'number'." },
              A_class_or_interface_declaration_can_only_have_one_extends_clause: { code: 1024, category: ts.DiagnosticCategory.Error, key: "A class or interface declaration can only have one 'extends' clause." },
              An_extends_clause_must_precede_an_implements_clause: { code: 1025, category: ts.DiagnosticCategory.Error, key: "An 'extends' clause must precede an 'implements' clause." },
              A_class_can_only_extend_a_single_class: { code: 1026, category: ts.DiagnosticCategory.Error, key: "A class can only extend a single class." },
              A_class_declaration_can_only_have_one_implements_clause: { code: 1027, category: ts.DiagnosticCategory.Error, key: "A class declaration can only have one 'implements' clause." },
              Accessibility_modifier_already_seen: { code: 1028, category: ts.DiagnosticCategory.Error, key: "Accessibility modifier already seen." },
              _0_modifier_must_precede_1_modifier: { code: 1029, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier must precede '{1}' modifier." },
              _0_modifier_already_seen: { code: 1030, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier already seen." },
              _0_modifier_cannot_appear_on_a_class_element: { code: 1031, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a class element." },
              An_interface_declaration_cannot_have_an_implements_clause: { code: 1032, category: ts.DiagnosticCategory.Error, key: "An interface declaration cannot have an 'implements' clause." },
              super_must_be_followed_by_an_argument_list_or_member_access: { code: 1034, category: ts.DiagnosticCategory.Error, key: "'super' must be followed by an argument list or member access." },
              Only_ambient_modules_can_use_quoted_names: { code: 1035, category: ts.DiagnosticCategory.Error, key: "Only ambient modules can use quoted names." },
              Statements_are_not_allowed_in_ambient_contexts: { code: 1036, category: ts.DiagnosticCategory.Error, key: "Statements are not allowed in ambient contexts." },
              A_declare_modifier_cannot_be_used_in_an_already_ambient_context: { code: 1038, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used in an already ambient context." },
              Initializers_are_not_allowed_in_ambient_contexts: { code: 1039, category: ts.DiagnosticCategory.Error, key: "Initializers are not allowed in ambient contexts." },
              _0_modifier_cannot_appear_on_a_module_element: { code: 1044, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a module element." },
              A_declare_modifier_cannot_be_used_with_an_interface_declaration: { code: 1045, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used with an interface declaration." },
              A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file: { code: 1046, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier is required for a top level declaration in a .d.ts file." },
              A_rest_parameter_cannot_be_optional: { code: 1047, category: ts.DiagnosticCategory.Error, key: "A rest parameter cannot be optional." },
              A_rest_parameter_cannot_have_an_initializer: { code: 1048, category: ts.DiagnosticCategory.Error, key: "A rest parameter cannot have an initializer." },
              A_set_accessor_must_have_exactly_one_parameter: { code: 1049, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor must have exactly one parameter." },
              A_set_accessor_cannot_have_an_optional_parameter: { code: 1051, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have an optional parameter." },
              A_set_accessor_parameter_cannot_have_an_initializer: { code: 1052, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor parameter cannot have an initializer." },
              A_set_accessor_cannot_have_rest_parameter: { code: 1053, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have rest parameter." },
              A_get_accessor_cannot_have_parameters: { code: 1054, category: ts.DiagnosticCategory.Error, key: "A 'get' accessor cannot have parameters." },
              Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1056, category: ts.DiagnosticCategory.Error, key: "Accessors are only available when targeting ECMAScript 5 and higher." },
              Enum_member_must_have_initializer: { code: 1061, category: ts.DiagnosticCategory.Error, key: "Enum member must have initializer." },
              An_export_assignment_cannot_be_used_in_a_namespace: { code: 1063, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot be used in a namespace." },
              Ambient_enum_elements_can_only_have_integer_literal_initializers: { code: 1066, category: ts.DiagnosticCategory.Error, key: "Ambient enum elements can only have integer literal initializers." },
              Unexpected_token_A_constructor_method_accessor_or_property_was_expected: { code: 1068, category: ts.DiagnosticCategory.Error, key: "Unexpected token. A constructor, method, accessor, or property was expected." },
              A_declare_modifier_cannot_be_used_with_an_import_declaration: { code: 1079, category: ts.DiagnosticCategory.Error, key: "A 'declare' modifier cannot be used with an import declaration." },
              Invalid_reference_directive_syntax: { code: 1084, category: ts.DiagnosticCategory.Error, key: "Invalid 'reference' directive syntax." },
              Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher: { code: 1085, category: ts.DiagnosticCategory.Error, key: "Octal literals are not available when targeting ECMAScript 5 and higher." },
              An_accessor_cannot_be_declared_in_an_ambient_context: { code: 1086, category: ts.DiagnosticCategory.Error, key: "An accessor cannot be declared in an ambient context." },
              _0_modifier_cannot_appear_on_a_constructor_declaration: { code: 1089, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a constructor declaration." },
              _0_modifier_cannot_appear_on_a_parameter: { code: 1090, category: ts.DiagnosticCategory.Error, key: "'{0}' modifier cannot appear on a parameter." },
              Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: { code: 1091, category: ts.DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...in' statement." },
              Type_parameters_cannot_appear_on_a_constructor_declaration: { code: 1092, category: ts.DiagnosticCategory.Error, key: "Type parameters cannot appear on a constructor declaration." },
              Type_annotation_cannot_appear_on_a_constructor_declaration: { code: 1093, category: ts.DiagnosticCategory.Error, key: "Type annotation cannot appear on a constructor declaration." },
              An_accessor_cannot_have_type_parameters: { code: 1094, category: ts.DiagnosticCategory.Error, key: "An accessor cannot have type parameters." },
              A_set_accessor_cannot_have_a_return_type_annotation: { code: 1095, category: ts.DiagnosticCategory.Error, key: "A 'set' accessor cannot have a return type annotation." },
              An_index_signature_must_have_exactly_one_parameter: { code: 1096, category: ts.DiagnosticCategory.Error, key: "An index signature must have exactly one parameter." },
              _0_list_cannot_be_empty: { code: 1097, category: ts.DiagnosticCategory.Error, key: "'{0}' list cannot be empty." },
              Type_parameter_list_cannot_be_empty: { code: 1098, category: ts.DiagnosticCategory.Error, key: "Type parameter list cannot be empty." },
              Type_argument_list_cannot_be_empty: { code: 1099, category: ts.DiagnosticCategory.Error, key: "Type argument list cannot be empty." },
              Invalid_use_of_0_in_strict_mode: { code: 1100, category: ts.DiagnosticCategory.Error, key: "Invalid use of '{0}' in strict mode." },
              with_statements_are_not_allowed_in_strict_mode: { code: 1101, category: ts.DiagnosticCategory.Error, key: "'with' statements are not allowed in strict mode." },
              delete_cannot_be_called_on_an_identifier_in_strict_mode: { code: 1102, category: ts.DiagnosticCategory.Error, key: "'delete' cannot be called on an identifier in strict mode." },
              A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement: { code: 1104, category: ts.DiagnosticCategory.Error, key: "A 'continue' statement can only be used within an enclosing iteration statement." },
              A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement: { code: 1105, category: ts.DiagnosticCategory.Error, key: "A 'break' statement can only be used within an enclosing iteration or switch statement." },
              Jump_target_cannot_cross_function_boundary: { code: 1107, category: ts.DiagnosticCategory.Error, key: "Jump target cannot cross function boundary." },
              A_return_statement_can_only_be_used_within_a_function_body: { code: 1108, category: ts.DiagnosticCategory.Error, key: "A 'return' statement can only be used within a function body." },
              Expression_expected: { code: 1109, category: ts.DiagnosticCategory.Error, key: "Expression expected." },
              Type_expected: { code: 1110, category: ts.DiagnosticCategory.Error, key: "Type expected." },
              A_class_member_cannot_be_declared_optional: { code: 1112, category: ts.DiagnosticCategory.Error, key: "A class member cannot be declared optional." },
              A_default_clause_cannot_appear_more_than_once_in_a_switch_statement: { code: 1113, category: ts.DiagnosticCategory.Error, key: "A 'default' clause cannot appear more than once in a 'switch' statement." },
              Duplicate_label_0: { code: 1114, category: ts.DiagnosticCategory.Error, key: "Duplicate label '{0}'" },
              A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement: { code: 1115, category: ts.DiagnosticCategory.Error, key: "A 'continue' statement can only jump to a label of an enclosing iteration statement." },
              A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement: { code: 1116, category: ts.DiagnosticCategory.Error, key: "A 'break' statement can only jump to a label of an enclosing statement." },
              An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode: { code: 1117, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have multiple properties with the same name in strict mode." },
              An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name: { code: 1118, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have multiple get/set accessors with the same name." },
              An_object_literal_cannot_have_property_and_accessor_with_the_same_name: { code: 1119, category: ts.DiagnosticCategory.Error, key: "An object literal cannot have property and accessor with the same name." },
              An_export_assignment_cannot_have_modifiers: { code: 1120, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot have modifiers." },
              Octal_literals_are_not_allowed_in_strict_mode: { code: 1121, category: ts.DiagnosticCategory.Error, key: "Octal literals are not allowed in strict mode." },
              A_tuple_type_element_list_cannot_be_empty: { code: 1122, category: ts.DiagnosticCategory.Error, key: "A tuple type element list cannot be empty." },
              Variable_declaration_list_cannot_be_empty: { code: 1123, category: ts.DiagnosticCategory.Error, key: "Variable declaration list cannot be empty." },
              Digit_expected: { code: 1124, category: ts.DiagnosticCategory.Error, key: "Digit expected." },
              Hexadecimal_digit_expected: { code: 1125, category: ts.DiagnosticCategory.Error, key: "Hexadecimal digit expected." },
              Unexpected_end_of_text: { code: 1126, category: ts.DiagnosticCategory.Error, key: "Unexpected end of text." },
              Invalid_character: { code: 1127, category: ts.DiagnosticCategory.Error, key: "Invalid character." },
              Declaration_or_statement_expected: { code: 1128, category: ts.DiagnosticCategory.Error, key: "Declaration or statement expected." },
              Statement_expected: { code: 1129, category: ts.DiagnosticCategory.Error, key: "Statement expected." },
              case_or_default_expected: { code: 1130, category: ts.DiagnosticCategory.Error, key: "'case' or 'default' expected." },
              Property_or_signature_expected: { code: 1131, category: ts.DiagnosticCategory.Error, key: "Property or signature expected." },
              Enum_member_expected: { code: 1132, category: ts.DiagnosticCategory.Error, key: "Enum member expected." },
              Type_reference_expected: { code: 1133, category: ts.DiagnosticCategory.Error, key: "Type reference expected." },
              Variable_declaration_expected: { code: 1134, category: ts.DiagnosticCategory.Error, key: "Variable declaration expected." },
              Argument_expression_expected: { code: 1135, category: ts.DiagnosticCategory.Error, key: "Argument expression expected." },
              Property_assignment_expected: { code: 1136, category: ts.DiagnosticCategory.Error, key: "Property assignment expected." },
              Expression_or_comma_expected: { code: 1137, category: ts.DiagnosticCategory.Error, key: "Expression or comma expected." },
              Parameter_declaration_expected: { code: 1138, category: ts.DiagnosticCategory.Error, key: "Parameter declaration expected." },
              Type_parameter_declaration_expected: { code: 1139, category: ts.DiagnosticCategory.Error, key: "Type parameter declaration expected." },
              Type_argument_expected: { code: 1140, category: ts.DiagnosticCategory.Error, key: "Type argument expected." },
              String_literal_expected: { code: 1141, category: ts.DiagnosticCategory.Error, key: "String literal expected." },
              Line_break_not_permitted_here: { code: 1142, category: ts.DiagnosticCategory.Error, key: "Line break not permitted here." },
              or_expected: { code: 1144, category: ts.DiagnosticCategory.Error, key: "'{' or ';' expected." },
              Modifiers_not_permitted_on_index_signature_members: { code: 1145, category: ts.DiagnosticCategory.Error, key: "Modifiers not permitted on index signature members." },
              Declaration_expected: { code: 1146, category: ts.DiagnosticCategory.Error, key: "Declaration expected." },
              Import_declarations_in_a_namespace_cannot_reference_a_module: { code: 1147, category: ts.DiagnosticCategory.Error, key: "Import declarations in a namespace cannot reference a module." },
              Cannot_compile_modules_unless_the_module_flag_is_provided: { code: 1148, category: ts.DiagnosticCategory.Error, key: "Cannot compile modules unless the '--module' flag is provided." },
              File_name_0_differs_from_already_included_file_name_1_only_in_casing: { code: 1149, category: ts.DiagnosticCategory.Error, key: "File name '{0}' differs from already included file name '{1}' only in casing" },
              new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead: { code: 1150, category: ts.DiagnosticCategory.Error, key: "'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead." },
              var_let_or_const_expected: { code: 1152, category: ts.DiagnosticCategory.Error, key: "'var', 'let' or 'const' expected." },
              let_declarations_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1153, category: ts.DiagnosticCategory.Error, key: "'let' declarations are only available when targeting ECMAScript 6 and higher." },
              const_declarations_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1154, category: ts.DiagnosticCategory.Error, key: "'const' declarations are only available when targeting ECMAScript 6 and higher." },
              const_declarations_must_be_initialized: { code: 1155, category: ts.DiagnosticCategory.Error, key: "'const' declarations must be initialized" },
              const_declarations_can_only_be_declared_inside_a_block: { code: 1156, category: ts.DiagnosticCategory.Error, key: "'const' declarations can only be declared inside a block." },
              let_declarations_can_only_be_declared_inside_a_block: { code: 1157, category: ts.DiagnosticCategory.Error, key: "'let' declarations can only be declared inside a block." },
              Unterminated_template_literal: { code: 1160, category: ts.DiagnosticCategory.Error, key: "Unterminated template literal." },
              Unterminated_regular_expression_literal: { code: 1161, category: ts.DiagnosticCategory.Error, key: "Unterminated regular expression literal." },
              An_object_member_cannot_be_declared_optional: { code: 1162, category: ts.DiagnosticCategory.Error, key: "An object member cannot be declared optional." },
              yield_expression_must_be_contained_within_a_generator_declaration: { code: 1163, category: ts.DiagnosticCategory.Error, key: "'yield' expression must be contained_within a generator declaration." },
              Computed_property_names_are_not_allowed_in_enums: { code: 1164, category: ts.DiagnosticCategory.Error, key: "Computed property names are not allowed in enums." },
              A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol: { code: 1165, category: ts.DiagnosticCategory.Error, key: "A computed property name in an ambient context must directly refer to a built-in symbol." },
              A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol: { code: 1166, category: ts.DiagnosticCategory.Error, key: "A computed property name in a class property declaration must directly refer to a built-in symbol." },
              Computed_property_names_are_only_available_when_targeting_ECMAScript_6_and_higher: { code: 1167, category: ts.DiagnosticCategory.Error, key: "Computed property names are only available when targeting ECMAScript 6 and higher." },
              A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol: { code: 1168, category: ts.DiagnosticCategory.Error, key: "A computed property name in a method overload must directly refer to a built-in symbol." },
              A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol: { code: 1169, category: ts.DiagnosticCategory.Error, key: "A computed property name in an interface must directly refer to a built-in symbol." },
              A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol: { code: 1170, category: ts.DiagnosticCategory.Error, key: "A computed property name in a type literal must directly refer to a built-in symbol." },
              A_comma_expression_is_not_allowed_in_a_computed_property_name: { code: 1171, category: ts.DiagnosticCategory.Error, key: "A comma expression is not allowed in a computed property name." },
              extends_clause_already_seen: { code: 1172, category: ts.DiagnosticCategory.Error, key: "'extends' clause already seen." },
              extends_clause_must_precede_implements_clause: { code: 1173, category: ts.DiagnosticCategory.Error, key: "'extends' clause must precede 'implements' clause." },
              Classes_can_only_extend_a_single_class: { code: 1174, category: ts.DiagnosticCategory.Error, key: "Classes can only extend a single class." },
              implements_clause_already_seen: { code: 1175, category: ts.DiagnosticCategory.Error, key: "'implements' clause already seen." },
              Interface_declaration_cannot_have_implements_clause: { code: 1176, category: ts.DiagnosticCategory.Error, key: "Interface declaration cannot have 'implements' clause." },
              Binary_digit_expected: { code: 1177, category: ts.DiagnosticCategory.Error, key: "Binary digit expected." },
              Octal_digit_expected: { code: 1178, category: ts.DiagnosticCategory.Error, key: "Octal digit expected." },
              Unexpected_token_expected: { code: 1179, category: ts.DiagnosticCategory.Error, key: "Unexpected token. '{' expected." },
              Property_destructuring_pattern_expected: { code: 1180, category: ts.DiagnosticCategory.Error, key: "Property destructuring pattern expected." },
              Array_element_destructuring_pattern_expected: { code: 1181, category: ts.DiagnosticCategory.Error, key: "Array element destructuring pattern expected." },
              A_destructuring_declaration_must_have_an_initializer: { code: 1182, category: ts.DiagnosticCategory.Error, key: "A destructuring declaration must have an initializer." },
              Destructuring_declarations_are_not_allowed_in_ambient_contexts: { code: 1183, category: ts.DiagnosticCategory.Error, key: "Destructuring declarations are not allowed in ambient contexts." },
              An_implementation_cannot_be_declared_in_ambient_contexts: { code: 1184, category: ts.DiagnosticCategory.Error, key: "An implementation cannot be declared in ambient contexts." },
              Modifiers_cannot_appear_here: { code: 1184, category: ts.DiagnosticCategory.Error, key: "Modifiers cannot appear here." },
              Merge_conflict_marker_encountered: { code: 1185, category: ts.DiagnosticCategory.Error, key: "Merge conflict marker encountered." },
              A_rest_element_cannot_have_an_initializer: { code: 1186, category: ts.DiagnosticCategory.Error, key: "A rest element cannot have an initializer." },
              A_parameter_property_may_not_be_a_binding_pattern: { code: 1187, category: ts.DiagnosticCategory.Error, key: "A parameter property may not be a binding pattern." },
              Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: { code: 1188, category: ts.DiagnosticCategory.Error, key: "Only a single variable declaration is allowed in a 'for...of' statement." },
              The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: { code: 1189, category: ts.DiagnosticCategory.Error, key: "The variable declaration of a 'for...in' statement cannot have an initializer." },
              The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: { code: 1190, category: ts.DiagnosticCategory.Error, key: "The variable declaration of a 'for...of' statement cannot have an initializer." },
              An_import_declaration_cannot_have_modifiers: { code: 1191, category: ts.DiagnosticCategory.Error, key: "An import declaration cannot have modifiers." },
              Module_0_has_no_default_export: { code: 1192, category: ts.DiagnosticCategory.Error, key: "Module '{0}' has no default export." },
              An_export_declaration_cannot_have_modifiers: { code: 1193, category: ts.DiagnosticCategory.Error, key: "An export declaration cannot have modifiers." },
              Export_declarations_are_not_permitted_in_a_namespace: { code: 1194, category: ts.DiagnosticCategory.Error, key: "Export declarations are not permitted in a namespace." },
              Catch_clause_variable_name_must_be_an_identifier: { code: 1195, category: ts.DiagnosticCategory.Error, key: "Catch clause variable name must be an identifier." },
              Catch_clause_variable_cannot_have_a_type_annotation: { code: 1196, category: ts.DiagnosticCategory.Error, key: "Catch clause variable cannot have a type annotation." },
              Catch_clause_variable_cannot_have_an_initializer: { code: 1197, category: ts.DiagnosticCategory.Error, key: "Catch clause variable cannot have an initializer." },
              An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive: { code: 1198, category: ts.DiagnosticCategory.Error, key: "An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive." },
              Unterminated_Unicode_escape_sequence: { code: 1199, category: ts.DiagnosticCategory.Error, key: "Unterminated Unicode escape sequence." },
              Line_terminator_not_permitted_before_arrow: { code: 1200, category: ts.DiagnosticCategory.Error, key: "Line terminator not permitted before arrow." },
              Import_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_or_import_d_from_mod_instead: { code: 1202, category: ts.DiagnosticCategory.Error, key: "Import assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'import * as ns from \"mod\"', 'import {a} from \"mod\"' or 'import d from \"mod\"' instead." },
              Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead: { code: 1203, category: ts.DiagnosticCategory.Error, key: "Export assignment cannot be used when targeting ECMAScript 6 or higher. Consider using 'export default' instead." },
              Cannot_compile_modules_into_commonjs_amd_system_or_umd_when_targeting_ES6_or_higher: { code: 1204, category: ts.DiagnosticCategory.Error, key: "Cannot compile modules into 'commonjs', 'amd', 'system' or 'umd' when targeting 'ES6' or higher." },
              Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1205, category: ts.DiagnosticCategory.Error, key: "Decorators are only available when targeting ECMAScript 5 and higher." },
              Decorators_are_not_valid_here: { code: 1206, category: ts.DiagnosticCategory.Error, key: "Decorators are not valid here." },
              Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: { code: 1207, category: ts.DiagnosticCategory.Error, key: "Decorators cannot be applied to multiple get/set accessors of the same name." },
              Cannot_compile_namespaces_when_the_separateCompilation_flag_is_provided: { code: 1208, category: ts.DiagnosticCategory.Error, key: "Cannot compile namespaces when the '--separateCompilation' flag is provided." },
              Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided: { code: 1209, category: ts.DiagnosticCategory.Error, key: "Ambient const enums are not allowed when the '--separateCompilation' flag is provided." },
              Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode: { code: 1210, category: ts.DiagnosticCategory.Error, key: "Invalid use of '{0}'. Class definitions are automatically in strict mode." },
              A_class_declaration_without_the_default_modifier_must_have_a_name: { code: 1211, category: ts.DiagnosticCategory.Error, key: "A class declaration without the 'default' modifier must have a name" },
              Identifier_expected_0_is_a_reserved_word_in_strict_mode: { code: 1212, category: ts.DiagnosticCategory.Error, key: "Identifier expected. '{0}' is a reserved word in strict mode" },
              Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1213, category: ts.DiagnosticCategory.Error, key: "Identifier expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
              Type_expected_0_is_a_reserved_word_in_strict_mode: { code: 1215, category: ts.DiagnosticCategory.Error, key: "Type expected. '{0}' is a reserved word in strict mode" },
              Type_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1216, category: ts.DiagnosticCategory.Error, key: "Type expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
              Export_assignment_is_not_supported_when_module_flag_is_system: { code: 1218, category: ts.DiagnosticCategory.Error, key: "Export assignment is not supported when '--module' flag is 'system'." },
              Duplicate_identifier_0: { code: 2300, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'." },
              Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: ts.DiagnosticCategory.Error, key: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
              Static_members_cannot_reference_class_type_parameters: { code: 2302, category: ts.DiagnosticCategory.Error, key: "Static members cannot reference class type parameters." },
              Circular_definition_of_import_alias_0: { code: 2303, category: ts.DiagnosticCategory.Error, key: "Circular definition of import alias '{0}'." },
              Cannot_find_name_0: { code: 2304, category: ts.DiagnosticCategory.Error, key: "Cannot find name '{0}'." },
              Module_0_has_no_exported_member_1: { code: 2305, category: ts.DiagnosticCategory.Error, key: "Module '{0}' has no exported member '{1}'." },
              File_0_is_not_a_module: { code: 2306, category: ts.DiagnosticCategory.Error, key: "File '{0}' is not a module." },
              Cannot_find_module_0: { code: 2307, category: ts.DiagnosticCategory.Error, key: "Cannot find module '{0}'." },
              A_module_cannot_have_more_than_one_export_assignment: { code: 2308, category: ts.DiagnosticCategory.Error, key: "A module cannot have more than one export assignment." },
              An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements: { code: 2309, category: ts.DiagnosticCategory.Error, key: "An export assignment cannot be used in a module with other exported elements." },
              Type_0_recursively_references_itself_as_a_base_type: { code: 2310, category: ts.DiagnosticCategory.Error, key: "Type '{0}' recursively references itself as a base type." },
              A_class_may_only_extend_another_class: { code: 2311, category: ts.DiagnosticCategory.Error, key: "A class may only extend another class." },
              An_interface_may_only_extend_a_class_or_another_interface: { code: 2312, category: ts.DiagnosticCategory.Error, key: "An interface may only extend a class or another interface." },
              Constraint_of_a_type_parameter_cannot_reference_any_type_parameter_from_the_same_type_parameter_list: { code: 2313, category: ts.DiagnosticCategory.Error, key: "Constraint of a type parameter cannot reference any type parameter from the same type parameter list." },
              Generic_type_0_requires_1_type_argument_s: { code: 2314, category: ts.DiagnosticCategory.Error, key: "Generic type '{0}' requires {1} type argument(s)." },
              Type_0_is_not_generic: { code: 2315, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not generic." },
              Global_type_0_must_be_a_class_or_interface_type: { code: 2316, category: ts.DiagnosticCategory.Error, key: "Global type '{0}' must be a class or interface type." },
              Global_type_0_must_have_1_type_parameter_s: { code: 2317, category: ts.DiagnosticCategory.Error, key: "Global type '{0}' must have {1} type parameter(s)." },
              Cannot_find_global_type_0: { code: 2318, category: ts.DiagnosticCategory.Error, key: "Cannot find global type '{0}'." },
              Named_property_0_of_types_1_and_2_are_not_identical: { code: 2319, category: ts.DiagnosticCategory.Error, key: "Named property '{0}' of types '{1}' and '{2}' are not identical." },
              Interface_0_cannot_simultaneously_extend_types_1_and_2: { code: 2320, category: ts.DiagnosticCategory.Error, key: "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'." },
              Excessive_stack_depth_comparing_types_0_and_1: { code: 2321, category: ts.DiagnosticCategory.Error, key: "Excessive stack depth comparing types '{0}' and '{1}'." },
              Type_0_is_not_assignable_to_type_1: { code: 2322, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not assignable to type '{1}'." },
              Property_0_is_missing_in_type_1: { code: 2324, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is missing in type '{1}'." },
              Property_0_is_private_in_type_1_but_not_in_type_2: { code: 2325, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is private in type '{1}' but not in type '{2}'." },
              Types_of_property_0_are_incompatible: { code: 2326, category: ts.DiagnosticCategory.Error, key: "Types of property '{0}' are incompatible." },
              Property_0_is_optional_in_type_1_but_required_in_type_2: { code: 2327, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is optional in type '{1}' but required in type '{2}'." },
              Types_of_parameters_0_and_1_are_incompatible: { code: 2328, category: ts.DiagnosticCategory.Error, key: "Types of parameters '{0}' and '{1}' are incompatible." },
              Index_signature_is_missing_in_type_0: { code: 2329, category: ts.DiagnosticCategory.Error, key: "Index signature is missing in type '{0}'." },
              Index_signatures_are_incompatible: { code: 2330, category: ts.DiagnosticCategory.Error, key: "Index signatures are incompatible." },
              this_cannot_be_referenced_in_a_module_or_namespace_body: { code: 2331, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a module or namespace body." },
              this_cannot_be_referenced_in_current_location: { code: 2332, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in current location." },
              this_cannot_be_referenced_in_constructor_arguments: { code: 2333, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in constructor arguments." },
              this_cannot_be_referenced_in_a_static_property_initializer: { code: 2334, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a static property initializer." },
              super_can_only_be_referenced_in_a_derived_class: { code: 2335, category: ts.DiagnosticCategory.Error, key: "'super' can only be referenced in a derived class." },
              super_cannot_be_referenced_in_constructor_arguments: { code: 2336, category: ts.DiagnosticCategory.Error, key: "'super' cannot be referenced in constructor arguments." },
              Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors: { code: 2337, category: ts.DiagnosticCategory.Error, key: "Super calls are not permitted outside constructors or in nested functions inside constructors" },
              super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class: { code: 2338, category: ts.DiagnosticCategory.Error, key: "'super' property access is permitted only in a constructor, member function, or member accessor of a derived class" },
              Property_0_does_not_exist_on_type_1: { code: 2339, category: ts.DiagnosticCategory.Error, key: "Property '{0}' does not exist on type '{1}'." },
              Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: { code: 2340, category: ts.DiagnosticCategory.Error, key: "Only public and protected methods of the base class are accessible via the 'super' keyword" },
              Property_0_is_private_and_only_accessible_within_class_1: { code: 2341, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is private and only accessible within class '{1}'." },
              An_index_expression_argument_must_be_of_type_string_number_symbol_or_any: { code: 2342, category: ts.DiagnosticCategory.Error, key: "An index expression argument must be of type 'string', 'number', 'symbol, or 'any'." },
              Type_0_does_not_satisfy_the_constraint_1: { code: 2344, category: ts.DiagnosticCategory.Error, key: "Type '{0}' does not satisfy the constraint '{1}'." },
              Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: { code: 2345, category: ts.DiagnosticCategory.Error, key: "Argument of type '{0}' is not assignable to parameter of type '{1}'." },
              Supplied_parameters_do_not_match_any_signature_of_call_target: { code: 2346, category: ts.DiagnosticCategory.Error, key: "Supplied parameters do not match any signature of call target." },
              Untyped_function_calls_may_not_accept_type_arguments: { code: 2347, category: ts.DiagnosticCategory.Error, key: "Untyped function calls may not accept type arguments." },
              Value_of_type_0_is_not_callable_Did_you_mean_to_include_new: { code: 2348, category: ts.DiagnosticCategory.Error, key: "Value of type '{0}' is not callable. Did you mean to include 'new'?" },
              Cannot_invoke_an_expression_whose_type_lacks_a_call_signature: { code: 2349, category: ts.DiagnosticCategory.Error, key: "Cannot invoke an expression whose type lacks a call signature." },
              Only_a_void_function_can_be_called_with_the_new_keyword: { code: 2350, category: ts.DiagnosticCategory.Error, key: "Only a void function can be called with the 'new' keyword." },
              Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature: { code: 2351, category: ts.DiagnosticCategory.Error, key: "Cannot use 'new' with an expression whose type lacks a call or construct signature." },
              Neither_type_0_nor_type_1_is_assignable_to_the_other: { code: 2352, category: ts.DiagnosticCategory.Error, key: "Neither type '{0}' nor type '{1}' is assignable to the other." },
              No_best_common_type_exists_among_return_expressions: { code: 2354, category: ts.DiagnosticCategory.Error, key: "No best common type exists among return expressions." },
              A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2355, category: ts.DiagnosticCategory.Error, key: "A function whose declared type is neither 'void' nor 'any' must return a value or consist of a single 'throw' statement." },
              An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type: { code: 2356, category: ts.DiagnosticCategory.Error, key: "An arithmetic operand must be of type 'any', 'number' or an enum type." },
              The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer: { code: 2357, category: ts.DiagnosticCategory.Error, key: "The operand of an increment or decrement operator must be a variable, property or indexer." },
              The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2358, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter." },
              The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: { code: 2359, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type." },
              The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol: { code: 2360, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'." },
              The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2361, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter" },
              The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2362, category: ts.DiagnosticCategory.Error, key: "The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
              The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2363, category: ts.DiagnosticCategory.Error, key: "The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
              Invalid_left_hand_side_of_assignment_expression: { code: 2364, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side of assignment expression." },
              Operator_0_cannot_be_applied_to_types_1_and_2: { code: 2365, category: ts.DiagnosticCategory.Error, key: "Operator '{0}' cannot be applied to types '{1}' and '{2}'." },
              Type_parameter_name_cannot_be_0: { code: 2368, category: ts.DiagnosticCategory.Error, key: "Type parameter name cannot be '{0}'" },
              A_parameter_property_is_only_allowed_in_a_constructor_implementation: { code: 2369, category: ts.DiagnosticCategory.Error, key: "A parameter property is only allowed in a constructor implementation." },
              A_rest_parameter_must_be_of_an_array_type: { code: 2370, category: ts.DiagnosticCategory.Error, key: "A rest parameter must be of an array type." },
              A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation: { code: 2371, category: ts.DiagnosticCategory.Error, key: "A parameter initializer is only allowed in a function or constructor implementation." },
              Parameter_0_cannot_be_referenced_in_its_initializer: { code: 2372, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' cannot be referenced in its initializer." },
              Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it: { code: 2373, category: ts.DiagnosticCategory.Error, key: "Initializer of parameter '{0}' cannot reference identifier '{1}' declared after it." },
              Duplicate_string_index_signature: { code: 2374, category: ts.DiagnosticCategory.Error, key: "Duplicate string index signature." },
              Duplicate_number_index_signature: { code: 2375, category: ts.DiagnosticCategory.Error, key: "Duplicate number index signature." },
              A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties: { code: 2376, category: ts.DiagnosticCategory.Error, key: "A 'super' call must be the first statement in the constructor when a class contains initialized properties or has parameter properties." },
              Constructors_for_derived_classes_must_contain_a_super_call: { code: 2377, category: ts.DiagnosticCategory.Error, key: "Constructors for derived classes must contain a 'super' call." },
              A_get_accessor_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2378, category: ts.DiagnosticCategory.Error, key: "A 'get' accessor must return a value or consist of a single 'throw' statement." },
              Getter_and_setter_accessors_do_not_agree_in_visibility: { code: 2379, category: ts.DiagnosticCategory.Error, key: "Getter and setter accessors do not agree in visibility." },
              get_and_set_accessor_must_have_the_same_type: { code: 2380, category: ts.DiagnosticCategory.Error, key: "'get' and 'set' accessor must have the same type." },
              A_signature_with_an_implementation_cannot_use_a_string_literal_type: { code: 2381, category: ts.DiagnosticCategory.Error, key: "A signature with an implementation cannot use a string literal type." },
              Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature: { code: 2382, category: ts.DiagnosticCategory.Error, key: "Specialized overload signature is not assignable to any non-specialized signature." },
              Overload_signatures_must_all_be_exported_or_not_exported: { code: 2383, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be exported or not exported." },
              Overload_signatures_must_all_be_ambient_or_non_ambient: { code: 2384, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be ambient or non-ambient." },
              Overload_signatures_must_all_be_public_private_or_protected: { code: 2385, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be public, private or protected." },
              Overload_signatures_must_all_be_optional_or_required: { code: 2386, category: ts.DiagnosticCategory.Error, key: "Overload signatures must all be optional or required." },
              Function_overload_must_be_static: { code: 2387, category: ts.DiagnosticCategory.Error, key: "Function overload must be static." },
              Function_overload_must_not_be_static: { code: 2388, category: ts.DiagnosticCategory.Error, key: "Function overload must not be static." },
              Function_implementation_name_must_be_0: { code: 2389, category: ts.DiagnosticCategory.Error, key: "Function implementation name must be '{0}'." },
              Constructor_implementation_is_missing: { code: 2390, category: ts.DiagnosticCategory.Error, key: "Constructor implementation is missing." },
              Function_implementation_is_missing_or_not_immediately_following_the_declaration: { code: 2391, category: ts.DiagnosticCategory.Error, key: "Function implementation is missing or not immediately following the declaration." },
              Multiple_constructor_implementations_are_not_allowed: { code: 2392, category: ts.DiagnosticCategory.Error, key: "Multiple constructor implementations are not allowed." },
              Duplicate_function_implementation: { code: 2393, category: ts.DiagnosticCategory.Error, key: "Duplicate function implementation." },
              Overload_signature_is_not_compatible_with_function_implementation: { code: 2394, category: ts.DiagnosticCategory.Error, key: "Overload signature is not compatible with function implementation." },
              Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local: { code: 2395, category: ts.DiagnosticCategory.Error, key: "Individual declarations in merged declaration {0} must be all exported or all local." },
              Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters: { code: 2396, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters." },
              Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference: { code: 2399, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '_this'. Compiler uses variable declaration '_this' to capture 'this' reference." },
              Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference: { code: 2400, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '_this' that compiler uses to capture 'this' reference." },
              Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference: { code: 2401, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '_super'. Compiler uses '_super' to capture base class reference." },
              Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference: { code: 2402, category: ts.DiagnosticCategory.Error, key: "Expression resolves to '_super' that compiler uses to capture base class reference." },
              Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2: { code: 2403, category: ts.DiagnosticCategory.Error, key: "Subsequent variable declarations must have the same type.  Variable '{0}' must be of type '{1}', but here has type '{2}'." },
              The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation: { code: 2404, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot use a type annotation." },
              The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any: { code: 2405, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement must be of type 'string' or 'any'." },
              Invalid_left_hand_side_in_for_in_statement: { code: 2406, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...in' statement." },
              The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2407, category: ts.DiagnosticCategory.Error, key: "The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter." },
              Setters_cannot_return_a_value: { code: 2408, category: ts.DiagnosticCategory.Error, key: "Setters cannot return a value." },
              Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class: { code: 2409, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature must be assignable to the instance type of the class" },
              All_symbols_within_a_with_block_will_be_resolved_to_any: { code: 2410, category: ts.DiagnosticCategory.Error, key: "All symbols within a 'with' block will be resolved to 'any'." },
              Property_0_of_type_1_is_not_assignable_to_string_index_type_2: { code: 2411, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of type '{1}' is not assignable to string index type '{2}'." },
              Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2: { code: 2412, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of type '{1}' is not assignable to numeric index type '{2}'." },
              Numeric_index_type_0_is_not_assignable_to_string_index_type_1: { code: 2413, category: ts.DiagnosticCategory.Error, key: "Numeric index type '{0}' is not assignable to string index type '{1}'." },
              Class_name_cannot_be_0: { code: 2414, category: ts.DiagnosticCategory.Error, key: "Class name cannot be '{0}'" },
              Class_0_incorrectly_extends_base_class_1: { code: 2415, category: ts.DiagnosticCategory.Error, key: "Class '{0}' incorrectly extends base class '{1}'." },
              Class_static_side_0_incorrectly_extends_base_class_static_side_1: { code: 2417, category: ts.DiagnosticCategory.Error, key: "Class static side '{0}' incorrectly extends base class static side '{1}'." },
              Type_name_0_in_extends_clause_does_not_reference_constructor_function_for_0: { code: 2419, category: ts.DiagnosticCategory.Error, key: "Type name '{0}' in extends clause does not reference constructor function for '{0}'." },
              Class_0_incorrectly_implements_interface_1: { code: 2420, category: ts.DiagnosticCategory.Error, key: "Class '{0}' incorrectly implements interface '{1}'." },
              A_class_may_only_implement_another_class_or_interface: { code: 2422, category: ts.DiagnosticCategory.Error, key: "A class may only implement another class or interface." },
              Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor: { code: 2423, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member accessor." },
              Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property: { code: 2424, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member property." },
              Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2425, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member property '{1}', but extended class '{2}' defines it as instance member function." },
              Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2426, category: ts.DiagnosticCategory.Error, key: "Class '{0}' defines instance member accessor '{1}', but extended class '{2}' defines it as instance member function." },
              Interface_name_cannot_be_0: { code: 2427, category: ts.DiagnosticCategory.Error, key: "Interface name cannot be '{0}'" },
              All_declarations_of_an_interface_must_have_identical_type_parameters: { code: 2428, category: ts.DiagnosticCategory.Error, key: "All declarations of an interface must have identical type parameters." },
              Interface_0_incorrectly_extends_interface_1: { code: 2430, category: ts.DiagnosticCategory.Error, key: "Interface '{0}' incorrectly extends interface '{1}'." },
              Enum_name_cannot_be_0: { code: 2431, category: ts.DiagnosticCategory.Error, key: "Enum name cannot be '{0}'" },
              In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element: { code: 2432, category: ts.DiagnosticCategory.Error, key: "In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element." },
              A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged: { code: 2433, category: ts.DiagnosticCategory.Error, key: "A namespace declaration cannot be in a different file from a class or function with which it is merged" },
              A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged: { code: 2434, category: ts.DiagnosticCategory.Error, key: "A namespace declaration cannot be located prior to a class or function with which it is merged" },
              Ambient_modules_cannot_be_nested_in_other_modules: { code: 2435, category: ts.DiagnosticCategory.Error, key: "Ambient modules cannot be nested in other modules." },
              Ambient_module_declaration_cannot_specify_relative_module_name: { code: 2436, category: ts.DiagnosticCategory.Error, key: "Ambient module declaration cannot specify relative module name." },
              Module_0_is_hidden_by_a_local_declaration_with_the_same_name: { code: 2437, category: ts.DiagnosticCategory.Error, key: "Module '{0}' is hidden by a local declaration with the same name" },
              Import_name_cannot_be_0: { code: 2438, category: ts.DiagnosticCategory.Error, key: "Import name cannot be '{0}'" },
              Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name: { code: 2439, category: ts.DiagnosticCategory.Error, key: "Import or export declaration in an ambient module declaration cannot reference module through relative module name." },
              Import_declaration_conflicts_with_local_declaration_of_0: { code: 2440, category: ts.DiagnosticCategory.Error, key: "Import declaration conflicts with local declaration of '{0}'" },
              Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module: { code: 2441, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module." },
              Types_have_separate_declarations_of_a_private_property_0: { code: 2442, category: ts.DiagnosticCategory.Error, key: "Types have separate declarations of a private property '{0}'." },
              Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2: { code: 2443, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected but type '{1}' is not a class derived from '{2}'." },
              Property_0_is_protected_in_type_1_but_public_in_type_2: { code: 2444, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected in type '{1}' but public in type '{2}'." },
              Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses: { code: 2445, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected and only accessible within class '{1}' and its subclasses." },
              Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1: { code: 2446, category: ts.DiagnosticCategory.Error, key: "Property '{0}' is protected and only accessible through an instance of class '{1}'." },
              The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead: { code: 2447, category: ts.DiagnosticCategory.Error, key: "The '{0}' operator is not allowed for boolean types. Consider using '{1}' instead." },
              Block_scoped_variable_0_used_before_its_declaration: { code: 2448, category: ts.DiagnosticCategory.Error, key: "Block-scoped variable '{0}' used before its declaration." },
              The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant: { code: 2449, category: ts.DiagnosticCategory.Error, key: "The operand of an increment or decrement operator cannot be a constant." },
              Left_hand_side_of_assignment_expression_cannot_be_a_constant: { code: 2450, category: ts.DiagnosticCategory.Error, key: "Left-hand side of assignment expression cannot be a constant." },
              Cannot_redeclare_block_scoped_variable_0: { code: 2451, category: ts.DiagnosticCategory.Error, key: "Cannot redeclare block-scoped variable '{0}'." },
              An_enum_member_cannot_have_a_numeric_name: { code: 2452, category: ts.DiagnosticCategory.Error, key: "An enum member cannot have a numeric name." },
              The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly: { code: 2453, category: ts.DiagnosticCategory.Error, key: "The type argument for type parameter '{0}' cannot be inferred from the usage. Consider specifying the type arguments explicitly." },
              Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0: { code: 2455, category: ts.DiagnosticCategory.Error, key: "Type argument candidate '{1}' is not a valid type argument because it is not a supertype of candidate '{0}'." },
              Type_alias_0_circularly_references_itself: { code: 2456, category: ts.DiagnosticCategory.Error, key: "Type alias '{0}' circularly references itself." },
              Type_alias_name_cannot_be_0: { code: 2457, category: ts.DiagnosticCategory.Error, key: "Type alias name cannot be '{0}'" },
              An_AMD_module_cannot_have_multiple_name_assignments: { code: 2458, category: ts.DiagnosticCategory.Error, key: "An AMD module cannot have multiple name assignments." },
              Type_0_has_no_property_1_and_no_string_index_signature: { code: 2459, category: ts.DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}' and no string index signature." },
              Type_0_has_no_property_1: { code: 2460, category: ts.DiagnosticCategory.Error, key: "Type '{0}' has no property '{1}'." },
              Type_0_is_not_an_array_type: { code: 2461, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not an array type." },
              A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: ts.DiagnosticCategory.Error, key: "A rest element must be last in an array destructuring pattern" },
              A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: ts.DiagnosticCategory.Error, key: "A binding pattern parameter cannot be optional in an implementation signature." },
              A_computed_property_name_must_be_of_type_string_number_symbol_or_any: { code: 2464, category: ts.DiagnosticCategory.Error, key: "A computed property name must be of type 'string', 'number', 'symbol', or 'any'." },
              this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: ts.DiagnosticCategory.Error, key: "'this' cannot be referenced in a computed property name." },
              super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: ts.DiagnosticCategory.Error, key: "'super' cannot be referenced in a computed property name." },
              A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: ts.DiagnosticCategory.Error, key: "A computed property name cannot reference a type parameter from its containing type." },
              Cannot_find_global_value_0: { code: 2468, category: ts.DiagnosticCategory.Error, key: "Cannot find global value '{0}'." },
              The_0_operator_cannot_be_applied_to_type_symbol: { code: 2469, category: ts.DiagnosticCategory.Error, key: "The '{0}' operator cannot be applied to type 'symbol'." },
              Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object: { code: 2470, category: ts.DiagnosticCategory.Error, key: "'Symbol' reference does not refer to the global Symbol constructor object." },
              A_computed_property_name_of_the_form_0_must_be_of_type_symbol: { code: 2471, category: ts.DiagnosticCategory.Error, key: "A computed property name of the form '{0}' must be of type 'symbol'." },
              Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_6_and_higher: { code: 2472, category: ts.DiagnosticCategory.Error, key: "Spread operator in 'new' expressions is only available when targeting ECMAScript 6 and higher." },
              Enum_declarations_must_all_be_const_or_non_const: { code: 2473, category: ts.DiagnosticCategory.Error, key: "Enum declarations must all be const or non-const." },
              In_const_enum_declarations_member_initializer_must_be_constant_expression: { code: 2474, category: ts.DiagnosticCategory.Error, key: "In 'const' enum declarations member initializer must be constant expression." },
              const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment: { code: 2475, category: ts.DiagnosticCategory.Error, key: "'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment." },
              A_const_enum_member_can_only_be_accessed_using_a_string_literal: { code: 2476, category: ts.DiagnosticCategory.Error, key: "A const enum member can only be accessed using a string literal." },
              const_enum_member_initializer_was_evaluated_to_a_non_finite_value: { code: 2477, category: ts.DiagnosticCategory.Error, key: "'const' enum member initializer was evaluated to a non-finite value." },
              const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN: { code: 2478, category: ts.DiagnosticCategory.Error, key: "'const' enum member initializer was evaluated to disallowed value 'NaN'." },
              Property_0_does_not_exist_on_const_enum_1: { code: 2479, category: ts.DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." },
              let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2480, category: ts.DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." },
              Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2481, category: ts.DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." },
              The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." },
              Export_declaration_conflicts_with_exported_declaration_of_0: { code: 2484, category: ts.DiagnosticCategory.Error, key: "Export declaration conflicts with exported declaration of '{0}'" },
              The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant: { code: 2485, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot be a previously defined constant." },
              The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant: { code: 2486, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a previously defined constant." },
              Invalid_left_hand_side_in_for_of_statement: { code: 2487, category: ts.DiagnosticCategory.Error, key: "Invalid left-hand side in 'for...of' statement." },
              Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator: { code: 2488, category: ts.DiagnosticCategory.Error, key: "Type must have a '[Symbol.iterator]()' method that returns an iterator." },
              An_iterator_must_have_a_next_method: { code: 2489, category: ts.DiagnosticCategory.Error, key: "An iterator must have a 'next()' method." },
              The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property: { code: 2490, category: ts.DiagnosticCategory.Error, key: "The type returned by the 'next()' method of an iterator must have a 'value' property." },
              The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: { code: 2491, category: ts.DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a destructuring pattern." },
              Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: ts.DiagnosticCategory.Error, key: "Cannot redeclare identifier '{0}' in catch clause" },
              Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2: { code: 2493, category: ts.DiagnosticCategory.Error, key: "Tuple type '{0}' with length '{1}' cannot be assigned to tuple with length '{2}'." },
              Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: { code: 2494, category: ts.DiagnosticCategory.Error, key: "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher." },
              Type_0_is_not_an_array_type_or_a_string_type: { code: 2495, category: ts.DiagnosticCategory.Error, key: "Type '{0}' is not an array type or a string type." },
              The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression: { code: 2496, category: ts.DiagnosticCategory.Error, key: "The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression." },
              Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct: { code: 2497, category: ts.DiagnosticCategory.Error, key: "Module '{0}' resolves to a non-module entity and cannot be imported using this construct." },
              Module_0_uses_export_and_cannot_be_used_with_export_Asterisk: { code: 2498, category: ts.DiagnosticCategory.Error, key: "Module '{0}' uses 'export =' and cannot be used with 'export *'." },
              An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2499, category: ts.DiagnosticCategory.Error, key: "An interface can only extend an identifier/qualified-name with optional type arguments." },
              A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2500, category: ts.DiagnosticCategory.Error, key: "A class can only implement an identifier/qualified-name with optional type arguments." },
              A_rest_element_cannot_contain_a_binding_pattern: { code: 2501, category: ts.DiagnosticCategory.Error, key: "A rest element cannot contain a binding pattern." },
              _0_is_referenced_directly_or_indirectly_in_its_own_type_annotation: { code: 2502, category: ts.DiagnosticCategory.Error, key: "'{0}' is referenced directly or indirectly in its own type annotation." },
              Cannot_find_namespace_0: { code: 2503, category: ts.DiagnosticCategory.Error, key: "Cannot find namespace '{0}'." },
              Import_declaration_0_is_using_private_name_1: { code: 4000, category: ts.DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." },
              Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." },
              Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4006, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4008, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4010, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
              Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4012, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of public method from exported class has or is using private name '{1}'." },
              Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4014, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of method from exported interface has or is using private name '{1}'." },
              Type_parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4016, category: ts.DiagnosticCategory.Error, key: "Type parameter '{0}' of exported function has or is using private name '{1}'." },
              Implements_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4019, category: ts.DiagnosticCategory.Error, key: "Implements clause of exported class '{0}' has or is using private name '{1}'." },
              Extends_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4020, category: ts.DiagnosticCategory.Error, key: "Extends clause of exported class '{0}' has or is using private name '{1}'." },
              Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1: { code: 4022, category: ts.DiagnosticCategory.Error, key: "Extends clause of exported interface '{0}' has or is using private name '{1}'." },
              Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4023, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using name '{1}' from external module {2} but cannot be named." },
              Exported_variable_0_has_or_is_using_name_1_from_private_module_2: { code: 4024, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using name '{1}' from private module '{2}'." },
              Exported_variable_0_has_or_is_using_private_name_1: { code: 4025, category: ts.DiagnosticCategory.Error, key: "Exported variable '{0}' has or is using private name '{1}'." },
              Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4026, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4027, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
              Public_static_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4028, category: ts.DiagnosticCategory.Error, key: "Public static property '{0}' of exported class has or is using private name '{1}'." },
              Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4029, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4030, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
              Public_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4031, category: ts.DiagnosticCategory.Error, key: "Public property '{0}' of exported class has or is using private name '{1}'." },
              Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4032, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of exported interface has or is using name '{1}' from private module '{2}'." },
              Property_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4033, category: ts.DiagnosticCategory.Error, key: "Property '{0}' of exported interface has or is using private name '{1}'." },
              Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4034, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static property setter from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4035, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static property setter from exported class has or is using private name '{1}'." },
              Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4036, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public property setter from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4037, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public property setter from exported class has or is using private name '{1}'." },
              Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4038, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4039, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4040, category: ts.DiagnosticCategory.Error, key: "Return type of public static property getter from exported class has or is using private name '{0}'." },
              Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4041, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4042, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4043, category: ts.DiagnosticCategory.Error, key: "Return type of public property getter from exported class has or is using private name '{0}'." },
              Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4044, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4045, category: ts.DiagnosticCategory.Error, key: "Return type of constructor signature from exported interface has or is using private name '{0}'." },
              Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4046, category: ts.DiagnosticCategory.Error, key: "Return type of call signature from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4047, category: ts.DiagnosticCategory.Error, key: "Return type of call signature from exported interface has or is using private name '{0}'." },
              Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4048, category: ts.DiagnosticCategory.Error, key: "Return type of index signature from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4049, category: ts.DiagnosticCategory.Error, key: "Return type of index signature from exported interface has or is using private name '{0}'." },
              Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4050, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4051, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0: { code: 4052, category: ts.DiagnosticCategory.Error, key: "Return type of public static method from exported class has or is using private name '{0}'." },
              Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4053, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4054, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using name '{0}' from private module '{1}'." },
              Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0: { code: 4055, category: ts.DiagnosticCategory.Error, key: "Return type of public method from exported class has or is using private name '{0}'." },
              Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4056, category: ts.DiagnosticCategory.Error, key: "Return type of method from exported interface has or is using name '{0}' from private module '{1}'." },
              Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0: { code: 4057, category: ts.DiagnosticCategory.Error, key: "Return type of method from exported interface has or is using private name '{0}'." },
              Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4058, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using name '{0}' from external module {1} but cannot be named." },
              Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1: { code: 4059, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using name '{0}' from private module '{1}'." },
              Return_type_of_exported_function_has_or_is_using_private_name_0: { code: 4060, category: ts.DiagnosticCategory.Error, key: "Return type of exported function has or is using private name '{0}'." },
              Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4061, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4062, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1: { code: 4063, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor from exported class has or is using private name '{1}'." },
              Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4064, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor signature from exported interface has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4065, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
              Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4066, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of call signature from exported interface has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4067, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
              Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4068, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4069, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4070, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
              Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4071, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4072, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4073, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of public method from exported class has or is using private name '{1}'." },
              Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4074, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of method from exported interface has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4075, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of method from exported interface has or is using private name '{1}'." },
              Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4076, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using name '{1}' from external module {2} but cannot be named." },
              Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2: { code: 4077, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using name '{1}' from private module '{2}'." },
              Parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4078, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' of exported function has or is using private name '{1}'." },
              Exported_type_alias_0_has_or_is_using_private_name_1: { code: 4081, category: ts.DiagnosticCategory.Error, key: "Exported type alias '{0}' has or is using private name '{1}'." },
              Default_export_of_the_module_has_or_is_using_private_name_0: { code: 4082, category: ts.DiagnosticCategory.Error, key: "Default export of the module has or is using private name '{0}'." },
              Loop_contains_block_scoped_variable_0_referenced_by_a_function_in_the_loop_This_is_only_supported_in_ECMAScript_6_or_higher: { code: 4091, category: ts.DiagnosticCategory.Error, key: "Loop contains block-scoped variable '{0}' referenced by a function in the loop. This is only supported in ECMAScript 6 or higher." },
              The_current_host_does_not_support_the_0_option: { code: 5001, category: ts.DiagnosticCategory.Error, key: "The current host does not support the '{0}' option." },
              Cannot_find_the_common_subdirectory_path_for_the_input_files: { code: 5009, category: ts.DiagnosticCategory.Error, key: "Cannot find the common subdirectory path for the input files." },
              Cannot_read_file_0_Colon_1: { code: 5012, category: ts.DiagnosticCategory.Error, key: "Cannot read file '{0}': {1}" },
              Unsupported_file_encoding: { code: 5013, category: ts.DiagnosticCategory.Error, key: "Unsupported file encoding." },
              Failed_to_parse_file_0_Colon_1: { code: 5014, category: ts.DiagnosticCategory.Error, key: "Failed to parse file '{0}': {1}." },
              Unknown_compiler_option_0: { code: 5023, category: ts.DiagnosticCategory.Error, key: "Unknown compiler option '{0}'." },
              Compiler_option_0_requires_a_value_of_type_1: { code: 5024, category: ts.DiagnosticCategory.Error, key: "Compiler option '{0}' requires a value of type {1}." },
              Could_not_write_file_0_Colon_1: { code: 5033, category: ts.DiagnosticCategory.Error, key: "Could not write file '{0}': {1}" },
              Option_mapRoot_cannot_be_specified_without_specifying_sourceMap_option: { code: 5038, category: ts.DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified without specifying 'sourceMap' option." },
              Option_sourceRoot_cannot_be_specified_without_specifying_sourceMap_option: { code: 5039, category: ts.DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified without specifying 'sourceMap' option." },
              Option_noEmit_cannot_be_specified_with_option_out_or_outDir: { code: 5040, category: ts.DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'out' or 'outDir'." },
              Option_noEmit_cannot_be_specified_with_option_declaration: { code: 5041, category: ts.DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'declaration'." },
              Option_project_cannot_be_mixed_with_source_files_on_a_command_line: { code: 5042, category: ts.DiagnosticCategory.Error, key: "Option 'project' cannot be mixed with source files on a command line." },
              Option_sourceMap_cannot_be_specified_with_option_separateCompilation: { code: 5043, category: ts.DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'separateCompilation'." },
              Option_declaration_cannot_be_specified_with_option_separateCompilation: { code: 5044, category: ts.DiagnosticCategory.Error, key: "Option 'declaration' cannot be specified with option 'separateCompilation'." },
              Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation: { code: 5045, category: ts.DiagnosticCategory.Error, key: "Option 'noEmitOnError' cannot be specified with option 'separateCompilation'." },
              Option_out_cannot_be_specified_with_option_separateCompilation: { code: 5046, category: ts.DiagnosticCategory.Error, key: "Option 'out' cannot be specified with option 'separateCompilation'." },
              Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher: { code: 5047, category: ts.DiagnosticCategory.Error, key: "Option 'separateCompilation' can only be used when either option'--module' is provided or option 'target' is 'ES6' or higher." },
              Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap: { code: 5048, category: ts.DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'inlineSourceMap'." },
              Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5049, category: ts.DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'." },
              Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5050, category: ts.DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified with option 'inlineSourceMap'." },
              Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: { code: 5051, category: ts.DiagnosticCategory.Error, key: "Option 'inlineSources' can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided." },
              Concatenate_and_emit_output_to_single_file: { code: 6001, category: ts.DiagnosticCategory.Message, key: "Concatenate and emit output to single file." },
              Generates_corresponding_d_ts_file: { code: 6002, category: ts.DiagnosticCategory.Message, key: "Generates corresponding '.d.ts' file." },
              Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: { code: 6003, category: ts.DiagnosticCategory.Message, key: "Specifies the location where debugger should locate map files instead of generated locations." },
              Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: { code: 6004, category: ts.DiagnosticCategory.Message, key: "Specifies the location where debugger should locate TypeScript files instead of source locations." },
              Watch_input_files: { code: 6005, category: ts.DiagnosticCategory.Message, key: "Watch input files." },
              Redirect_output_structure_to_the_directory: { code: 6006, category: ts.DiagnosticCategory.Message, key: "Redirect output structure to the directory." },
              Do_not_erase_const_enum_declarations_in_generated_code: { code: 6007, category: ts.DiagnosticCategory.Message, key: "Do not erase const enum declarations in generated code." },
              Do_not_emit_outputs_if_any_errors_were_reported: { code: 6008, category: ts.DiagnosticCategory.Message, key: "Do not emit outputs if any errors were reported." },
              Do_not_emit_comments_to_output: { code: 6009, category: ts.DiagnosticCategory.Message, key: "Do not emit comments to output." },
              Do_not_emit_outputs: { code: 6010, category: ts.DiagnosticCategory.Message, key: "Do not emit outputs." },
              Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental: { code: 6015, category: ts.DiagnosticCategory.Message, key: "Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES6' (experimental)" },
              Specify_module_code_generation_Colon_commonjs_amd_system_or_umd: { code: 6016, category: ts.DiagnosticCategory.Message, key: "Specify module code generation: 'commonjs', 'amd', 'system' or 'umd'" },
              Print_this_message: { code: 6017, category: ts.DiagnosticCategory.Message, key: "Print this message." },
              Print_the_compiler_s_version: { code: 6019, category: ts.DiagnosticCategory.Message, key: "Print the compiler's version." },
              Compile_the_project_in_the_given_directory: { code: 6020, category: ts.DiagnosticCategory.Message, key: "Compile the project in the given directory." },
              Syntax_Colon_0: { code: 6023, category: ts.DiagnosticCategory.Message, key: "Syntax: {0}" },
              options: { code: 6024, category: ts.DiagnosticCategory.Message, key: "options" },
              file: { code: 6025, category: ts.DiagnosticCategory.Message, key: "file" },
              Examples_Colon_0: { code: 6026, category: ts.DiagnosticCategory.Message, key: "Examples: {0}" },
              Options_Colon: { code: 6027, category: ts.DiagnosticCategory.Message, key: "Options:" },
              Version_0: { code: 6029, category: ts.DiagnosticCategory.Message, key: "Version {0}" },
              Insert_command_line_options_and_files_from_a_file: { code: 6030, category: ts.DiagnosticCategory.Message, key: "Insert command line options and files from a file." },
              File_change_detected_Starting_incremental_compilation: { code: 6032, category: ts.DiagnosticCategory.Message, key: "File change detected. Starting incremental compilation..." },
              KIND: { code: 6034, category: ts.DiagnosticCategory.Message, key: "KIND" },
              FILE: { code: 6035, category: ts.DiagnosticCategory.Message, key: "FILE" },
              VERSION: { code: 6036, category: ts.DiagnosticCategory.Message, key: "VERSION" },
              LOCATION: { code: 6037, category: ts.DiagnosticCategory.Message, key: "LOCATION" },
              DIRECTORY: { code: 6038, category: ts.DiagnosticCategory.Message, key: "DIRECTORY" },
              Compilation_complete_Watching_for_file_changes: { code: 6042, category: ts.DiagnosticCategory.Message, key: "Compilation complete. Watching for file changes." },
              Generates_corresponding_map_file: { code: 6043, category: ts.DiagnosticCategory.Message, key: "Generates corresponding '.map' file." },
              Compiler_option_0_expects_an_argument: { code: 6044, category: ts.DiagnosticCategory.Error, key: "Compiler option '{0}' expects an argument." },
              Unterminated_quoted_string_in_response_file_0: { code: 6045, category: ts.DiagnosticCategory.Error, key: "Unterminated quoted string in response file '{0}'." },
              Argument_for_module_option_must_be_commonjs_amd_system_or_umd: { code: 6046, category: ts.DiagnosticCategory.Error, key: "Argument for '--module' option must be 'commonjs', 'amd', 'system' or 'umd'." },
              Argument_for_target_option_must_be_ES3_ES5_or_ES6: { code: 6047, category: ts.DiagnosticCategory.Error, key: "Argument for '--target' option must be 'ES3', 'ES5', or 'ES6'." },
              Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1: { code: 6048, category: ts.DiagnosticCategory.Error, key: "Locale must be of the form <language> or <language>-<territory>. For example '{0}' or '{1}'." },
              Unsupported_locale_0: { code: 6049, category: ts.DiagnosticCategory.Error, key: "Unsupported locale '{0}'." },
              Unable_to_open_file_0: { code: 6050, category: ts.DiagnosticCategory.Error, key: "Unable to open file '{0}'." },
              Corrupted_locale_file_0: { code: 6051, category: ts.DiagnosticCategory.Error, key: "Corrupted locale file {0}." },
              Raise_error_on_expressions_and_declarations_with_an_implied_any_type: { code: 6052, category: ts.DiagnosticCategory.Message, key: "Raise error on expressions and declarations with an implied 'any' type." },
              File_0_not_found: { code: 6053, category: ts.DiagnosticCategory.Error, key: "File '{0}' not found." },
              File_0_has_unsupported_extension_The_only_supported_extensions_are_1: { code: 6054, category: ts.DiagnosticCategory.Error, key: "File '{0}' has unsupported extension. The only supported extensions are {1}." },
              Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: ts.DiagnosticCategory.Message, key: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
              Do_not_emit_declarations_for_code_that_has_an_internal_annotation: { code: 6056, category: ts.DiagnosticCategory.Message, key: "Do not emit declarations for code that has an '@internal' annotation." },
              Preserve_new_lines_when_emitting_code: { code: 6057, category: ts.DiagnosticCategory.Message, key: "Preserve new-lines when emitting code." },
              Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: { code: 6058, category: ts.DiagnosticCategory.Message, key: "Specifies the root directory of input files. Use to control the output directory structure with --outDir." },
              File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: { code: 6059, category: ts.DiagnosticCategory.Error, key: "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files." },
              Specifies_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix: { code: 6060, category: ts.DiagnosticCategory.Message, key: "Specifies the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix)." },
              NEWLINE: { code: 6061, category: ts.DiagnosticCategory.Message, key: "NEWLINE" },
              Argument_for_newLine_option_must_be_CRLF_or_LF: { code: 6062, category: ts.DiagnosticCategory.Error, key: "Argument for '--newLine' option must be 'CRLF' or 'LF'." },
              Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable '{0}' implicitly has an '{1}' type." },
              Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter '{0}' implicitly has an '{1}' type." },
              Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member '{0}' implicitly has an '{1}' type." },
              new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type: { code: 7009, category: ts.DiagnosticCategory.Error, key: "'new' expression, whose target lacks a construct signature, implicitly has an 'any' type." },
              _0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type: { code: 7010, category: ts.DiagnosticCategory.Error, key: "'{0}', which lacks return-type annotation, implicitly has an '{1}' return type." },
              Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: { code: 7011, category: ts.DiagnosticCategory.Error, key: "Function expression, which lacks return-type annotation, implicitly has an '{0}' return type." },
              Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7013, category: ts.DiagnosticCategory.Error, key: "Construct signature, which lacks return-type annotation, implicitly has an 'any' return type." },
              Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation: { code: 7016, category: ts.DiagnosticCategory.Error, key: "Property '{0}' implicitly has type 'any', because its 'set' accessor lacks a type annotation." },
              Index_signature_of_object_type_implicitly_has_an_any_type: { code: 7017, category: ts.DiagnosticCategory.Error, key: "Index signature of object type implicitly has an 'any' type." },
              Object_literal_s_property_0_implicitly_has_an_1_type: { code: 7018, category: ts.DiagnosticCategory.Error, key: "Object literal's property '{0}' implicitly has an '{1}' type." },
              Rest_parameter_0_implicitly_has_an_any_type: { code: 7019, category: ts.DiagnosticCategory.Error, key: "Rest parameter '{0}' implicitly has an 'any[]' type." },
              Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7020, category: ts.DiagnosticCategory.Error, key: "Call signature, which lacks return-type annotation, implicitly has an 'any' return type." },
              _0_implicitly_has_type_any_because_it_is_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer: { code: 7022, category: ts.DiagnosticCategory.Error, key: "'{0}' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer." },
              _0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7023, category: ts.DiagnosticCategory.Error, key: "'{0}' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
              Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7024, category: ts.DiagnosticCategory.Error, key: "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
              You_cannot_rename_this_element: { code: 8000, category: ts.DiagnosticCategory.Error, key: "You cannot rename this element." },
              You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: { code: 8001, category: ts.DiagnosticCategory.Error, key: "You cannot rename elements that are defined in the standard TypeScript library." },
              import_can_only_be_used_in_a_ts_file: { code: 8002, category: ts.DiagnosticCategory.Error, key: "'import ... =' can only be used in a .ts file." },
              export_can_only_be_used_in_a_ts_file: { code: 8003, category: ts.DiagnosticCategory.Error, key: "'export=' can only be used in a .ts file." },
              type_parameter_declarations_can_only_be_used_in_a_ts_file: { code: 8004, category: ts.DiagnosticCategory.Error, key: "'type parameter declarations' can only be used in a .ts file." },
              implements_clauses_can_only_be_used_in_a_ts_file: { code: 8005, category: ts.DiagnosticCategory.Error, key: "'implements clauses' can only be used in a .ts file." },
              interface_declarations_can_only_be_used_in_a_ts_file: { code: 8006, category: ts.DiagnosticCategory.Error, key: "'interface declarations' can only be used in a .ts file." },
              module_declarations_can_only_be_used_in_a_ts_file: { code: 8007, category: ts.DiagnosticCategory.Error, key: "'module declarations' can only be used in a .ts file." },
              type_aliases_can_only_be_used_in_a_ts_file: { code: 8008, category: ts.DiagnosticCategory.Error, key: "'type aliases' can only be used in a .ts file." },
              _0_can_only_be_used_in_a_ts_file: { code: 8009, category: ts.DiagnosticCategory.Error, key: "'{0}' can only be used in a .ts file." },
              types_can_only_be_used_in_a_ts_file: { code: 8010, category: ts.DiagnosticCategory.Error, key: "'types' can only be used in a .ts file." },
              type_arguments_can_only_be_used_in_a_ts_file: { code: 8011, category: ts.DiagnosticCategory.Error, key: "'type arguments' can only be used in a .ts file." },
              parameter_modifiers_can_only_be_used_in_a_ts_file: { code: 8012, category: ts.DiagnosticCategory.Error, key: "'parameter modifiers' can only be used in a .ts file." },
              can_only_be_used_in_a_ts_file: { code: 8013, category: ts.DiagnosticCategory.Error, key: "'?' can only be used in a .ts file." },
              property_declarations_can_only_be_used_in_a_ts_file: { code: 8014, category: ts.DiagnosticCategory.Error, key: "'property declarations' can only be used in a .ts file." },
              enum_declarations_can_only_be_used_in_a_ts_file: { code: 8015, category: ts.DiagnosticCategory.Error, key: "'enum declarations' can only be used in a .ts file." },
              type_assertion_expressions_can_only_be_used_in_a_ts_file: { code: 8016, category: ts.DiagnosticCategory.Error, key: "'type assertion expressions' can only be used in a .ts file." },
              decorators_can_only_be_used_in_a_ts_file: { code: 8017, category: ts.DiagnosticCategory.Error, key: "'decorators' can only be used in a .ts file." },
              yield_expressions_are_not_currently_supported: { code: 9000, category: ts.DiagnosticCategory.Error, key: "'yield' expressions are not currently supported." },
              Generators_are_not_currently_supported: { code: 9001, category: ts.DiagnosticCategory.Error, key: "Generators are not currently supported." },
              Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses: { code: 9002, category: ts.DiagnosticCategory.Error, key: "Only identifiers/qualified-names with optional type arguments are currently supported in a class 'extends' clauses." },
              class_expressions_are_not_currently_supported: { code: 9003, category: ts.DiagnosticCategory.Error, key: "'class' expressions are not currently supported." },
              class_declarations_are_only_supported_directly_inside_a_module_or_as_a_top_level_declaration: { code: 9004, category: ts.DiagnosticCategory.Error, key: "'class' declarations are only supported directly inside a module or as a top level declaration." }
          };
      })(ts || (ts = {}));
      /// <reference path="core.ts"/>
      /// <reference path="diagnosticInformationMap.generated.ts"/>
      var ts;
      (function (ts) {
          var textToToken = {
              "any": 112,
              "as": 111,
              "boolean": 113,
              "break": 66,
              "case": 67,
              "catch": 68,
              "class": 69,
              "continue": 71,
              "const": 70,
              "constructor": 114,
              "debugger": 72,
              "declare": 115,
              "default": 73,
              "delete": 74,
              "do": 75,
              "else": 76,
              "enum": 77,
              "export": 78,
              "extends": 79,
              "false": 80,
              "finally": 81,
              "for": 82,
              "from": 125,
              "function": 83,
              "get": 116,
              "if": 84,
              "implements": 102,
              "import": 85,
              "in": 86,
              "instanceof": 87,
              "interface": 103,
              "let": 104,
              "module": 117,
              "namespace": 118,
              "new": 88,
              "null": 89,
              "number": 120,
              "package": 105,
              "private": 106,
              "protected": 107,
              "public": 108,
              "require": 119,
              "return": 90,
              "set": 121,
              "static": 109,
              "string": 122,
              "super": 91,
              "switch": 92,
              "symbol": 123,
              "this": 93,
              "throw": 94,
              "true": 95,
              "try": 96,
              "type": 124,
              "typeof": 97,
              "var": 98,
              "void": 99,
              "while": 100,
              "with": 101,
              "yield": 110,
              "of": 126,
              "{": 14,
              "}": 15,
              "(": 16,
              ")": 17,
              "[": 18,
              "]": 19,
              ".": 20,
              "...": 21,
              ";": 22,
              ",": 23,
              "<": 24,
              ">": 25,
              "<=": 26,
              ">=": 27,
              "==": 28,
              "!=": 29,
              "===": 30,
              "!==": 31,
              "=>": 32,
              "+": 33,
              "-": 34,
              "*": 35,
              "/": 36,
              "%": 37,
              "++": 38,
              "--": 39,
              "<<": 40,
              ">>": 41,
              ">>>": 42,
              "&": 43,
              "|": 44,
              "^": 45,
              "!": 46,
              "~": 47,
              "&&": 48,
              "||": 49,
              "?": 50,
              ":": 51,
              "=": 53,
              "+=": 54,
              "-=": 55,
              "*=": 56,
              "/=": 57,
              "%=": 58,
              "<<=": 59,
              ">>=": 60,
              ">>>=": 61,
              "&=": 62,
              "|=": 63,
              "^=": 64,
              "@": 52
          };
          var unicodeES3IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          var unicodeES3IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          var unicodeES5IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          var unicodeES5IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
          function lookupInUnicodeMap(code, map) {
              if (code < map[0]) {
                  return false;
              }
              var lo = 0;
              var hi = map.length;
              var mid;
              while (lo + 1 < hi) {
                  mid = lo + (hi - lo) / 2;
                  mid -= mid % 2;
                  if (map[mid] <= code && code <= map[mid + 1]) {
                      return true;
                  }
                  if (code < map[mid]) {
                      hi = mid;
                  }
                  else {
                      lo = mid + 2;
                  }
              }
              return false;
          }
          function isUnicodeIdentifierStart(code, languageVersion) {
              return languageVersion >= 1 ?
                  lookupInUnicodeMap(code, unicodeES5IdentifierStart) :
                  lookupInUnicodeMap(code, unicodeES3IdentifierStart);
          }
          ts.isUnicodeIdentifierStart = isUnicodeIdentifierStart;
          function isUnicodeIdentifierPart(code, languageVersion) {
              return languageVersion >= 1 ?
                  lookupInUnicodeMap(code, unicodeES5IdentifierPart) :
                  lookupInUnicodeMap(code, unicodeES3IdentifierPart);
          }
          function makeReverseMap(source) {
              var result = [];
              for (var name_2 in source) {
                  if (source.hasOwnProperty(name_2)) {
                      result[source[name_2]] = name_2;
                  }
              }
              return result;
          }
          var tokenStrings = makeReverseMap(textToToken);
          function tokenToString(t) {
              return tokenStrings[t];
          }
          ts.tokenToString = tokenToString;
          function stringToToken(s) {
              return textToToken[s];
          }
          ts.stringToToken = stringToToken;
          function computeLineStarts(text) {
              var result = new Array();
              var pos = 0;
              var lineStart = 0;
              while (pos < text.length) {
                  var ch = text.charCodeAt(pos++);
                  switch (ch) {
                      case 13:
                          if (text.charCodeAt(pos) === 10) {
                              pos++;
                          }
                      case 10:
                          result.push(lineStart);
                          lineStart = pos;
                          break;
                      default:
                          if (ch > 127 && isLineBreak(ch)) {
                              result.push(lineStart);
                              lineStart = pos;
                          }
                          break;
                  }
              }
              result.push(lineStart);
              return result;
          }
          ts.computeLineStarts = computeLineStarts;
          function getPositionOfLineAndCharacter(sourceFile, line, character) {
              return computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character);
          }
          ts.getPositionOfLineAndCharacter = getPositionOfLineAndCharacter;
          function computePositionOfLineAndCharacter(lineStarts, line, character) {
              ts.Debug.assert(line >= 0 && line < lineStarts.length);
              return lineStarts[line] + character;
          }
          ts.computePositionOfLineAndCharacter = computePositionOfLineAndCharacter;
          function getLineStarts(sourceFile) {
              return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text));
          }
          ts.getLineStarts = getLineStarts;
          function computeLineAndCharacterOfPosition(lineStarts, position) {
              var lineNumber = ts.binarySearch(lineStarts, position);
              if (lineNumber < 0) {
                  lineNumber = ~lineNumber - 1;
              }
              return {
                  line: lineNumber,
                  character: position - lineStarts[lineNumber]
              };
          }
          ts.computeLineAndCharacterOfPosition = computeLineAndCharacterOfPosition;
          function getLineAndCharacterOfPosition(sourceFile, position) {
              return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
          }
          ts.getLineAndCharacterOfPosition = getLineAndCharacterOfPosition;
          var hasOwnProperty = Object.prototype.hasOwnProperty;
          function isWhiteSpace(ch) {
              return ch === 32 ||
                  ch === 9 ||
                  ch === 11 ||
                  ch === 12 ||
                  ch === 160 ||
                  ch === 133 ||
                  ch === 5760 ||
                  ch >= 8192 && ch <= 8203 ||
                  ch === 8239 ||
                  ch === 8287 ||
                  ch === 12288 ||
                  ch === 65279;
          }
          ts.isWhiteSpace = isWhiteSpace;
          function isLineBreak(ch) {
              // ES5 7.3:
              // The ECMAScript line terminator characters are listed in Table 3.
              //     Table 3: Line Terminator Characters
              //     Code Unit Value     Name                    Formal Name
              //     \u000A              Line Feed               <LF>
              //     \u000D              Carriage Return         <CR>
              //     \u2028              Line separator          <LS>
              //     \u2029              Paragraph separator     <PS>
              // Only the characters in Table 3 are treated as line terminators. Other new line or line 
              // breaking characters are treated as white space but not as line terminators. 
              return ch === 10 ||
                  ch === 13 ||
                  ch === 8232 ||
                  ch === 8233;
          }
          ts.isLineBreak = isLineBreak;
          function isDigit(ch) {
              return ch >= 48 && ch <= 57;
          }
          function isOctalDigit(ch) {
              return ch >= 48 && ch <= 55;
          }
          ts.isOctalDigit = isOctalDigit;
          function skipTrivia(text, pos, stopAfterLineBreak) {
              while (true) {
                  var ch = text.charCodeAt(pos);
                  switch (ch) {
                      case 13:
                          if (text.charCodeAt(pos + 1) === 10) {
                              pos++;
                          }
                      case 10:
                          pos++;
                          if (stopAfterLineBreak) {
                              return pos;
                          }
                          continue;
                      case 9:
                      case 11:
                      case 12:
                      case 32:
                          pos++;
                          continue;
                      case 47:
                          if (text.charCodeAt(pos + 1) === 47) {
                              pos += 2;
                              while (pos < text.length) {
                                  if (isLineBreak(text.charCodeAt(pos))) {
                                      break;
                                  }
                                  pos++;
                              }
                              continue;
                          }
                          if (text.charCodeAt(pos + 1) === 42) {
                              pos += 2;
                              while (pos < text.length) {
                                  if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
                                      pos += 2;
                                      break;
                                  }
                                  pos++;
                              }
                              continue;
                          }
                          break;
                      case 60:
                      case 61:
                      case 62:
                          if (isConflictMarkerTrivia(text, pos)) {
                              pos = scanConflictMarkerTrivia(text, pos);
                              continue;
                          }
                          break;
                      default:
                          if (ch > 127 && (isWhiteSpace(ch) || isLineBreak(ch))) {
                              pos++;
                              continue;
                          }
                          break;
                  }
                  return pos;
              }
          }
          ts.skipTrivia = skipTrivia;
          var mergeConflictMarkerLength = "<<<<<<<".length;
          function isConflictMarkerTrivia(text, pos) {
              ts.Debug.assert(pos >= 0);
              if (pos === 0 || isLineBreak(text.charCodeAt(pos - 1))) {
                  var ch = text.charCodeAt(pos);
                  if ((pos + mergeConflictMarkerLength) < text.length) {
                      for (var i = 0, n = mergeConflictMarkerLength; i < n; i++) {
                          if (text.charCodeAt(pos + i) !== ch) {
                              return false;
                          }
                      }
                      return ch === 61 ||
                          text.charCodeAt(pos + mergeConflictMarkerLength) === 32;
                  }
              }
              return false;
          }
          function scanConflictMarkerTrivia(text, pos, error) {
              if (error) {
                  error(ts.Diagnostics.Merge_conflict_marker_encountered, mergeConflictMarkerLength);
              }
              var ch = text.charCodeAt(pos);
              var len = text.length;
              if (ch === 60 || ch === 62) {
                  while (pos < len && !isLineBreak(text.charCodeAt(pos))) {
                      pos++;
                  }
              }
              else {
                  ts.Debug.assert(ch === 61);
                  while (pos < len) {
                      var ch_1 = text.charCodeAt(pos);
                      if (ch_1 === 62 && isConflictMarkerTrivia(text, pos)) {
                          break;
                      }
                      pos++;
                  }
              }
              return pos;
          }
          function getCommentRanges(text, pos, trailing) {
              var result;
              var collecting = trailing || pos === 0;
              while (true) {
                  var ch = text.charCodeAt(pos);
                  switch (ch) {
                      case 13:
                          if (text.charCodeAt(pos + 1) === 10) {
                              pos++;
                          }
                      case 10:
                          pos++;
                          if (trailing) {
                              return result;
                          }
                          collecting = true;
                          if (result && result.length) {
                              ts.lastOrUndefined(result).hasTrailingNewLine = true;
                          }
                          continue;
                      case 9:
                      case 11:
                      case 12:
                      case 32:
                          pos++;
                          continue;
                      case 47:
                          var nextChar = text.charCodeAt(pos + 1);
                          var hasTrailingNewLine = false;
                          if (nextChar === 47 || nextChar === 42) {
                              var kind = nextChar === 47 ? 2 : 3;
                              var startPos = pos;
                              pos += 2;
                              if (nextChar === 47) {
                                  while (pos < text.length) {
                                      if (isLineBreak(text.charCodeAt(pos))) {
                                          hasTrailingNewLine = true;
                                          break;
                                      }
                                      pos++;
                                  }
                              }
                              else {
                                  while (pos < text.length) {
                                      if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
                                          pos += 2;
                                          break;
                                      }
                                      pos++;
                                  }
                              }
                              if (collecting) {
                                  if (!result) {
                                      result = [];
                                  }
                                  result.push({ pos: startPos, end: pos, hasTrailingNewLine: hasTrailingNewLine, kind: kind });
                              }
                              continue;
                          }
                          break;
                      default:
                          if (ch > 127 && (isWhiteSpace(ch) || isLineBreak(ch))) {
                              if (result && result.length && isLineBreak(ch)) {
                                  ts.lastOrUndefined(result).hasTrailingNewLine = true;
                              }
                              pos++;
                              continue;
                          }
                          break;
                  }
                  return result;
              }
          }
          function getLeadingCommentRanges(text, pos) {
              return getCommentRanges(text, pos, false);
          }
          ts.getLeadingCommentRanges = getLeadingCommentRanges;
          function getTrailingCommentRanges(text, pos) {
              return getCommentRanges(text, pos, true);
          }
          ts.getTrailingCommentRanges = getTrailingCommentRanges;
          function isIdentifierStart(ch, languageVersion) {
              return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                  ch === 36 || ch === 95 ||
                  ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
          }
          ts.isIdentifierStart = isIdentifierStart;
          function isIdentifierPart(ch, languageVersion) {
              return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                  ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
                  ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
          }
          ts.isIdentifierPart = isIdentifierPart;
          function createScanner(languageVersion, skipTrivia, text, onError, start, length) {
              var pos;
              var end;
              var startPos;
              var tokenPos;
              var token;
              var tokenValue;
              var precedingLineBreak;
              var hasExtendedUnicodeEscape;
              var tokenIsUnterminated;
              setText(text, start, length);
              return {
                  getStartPos: function () { return startPos; },
                  getTextPos: function () { return pos; },
                  getToken: function () { return token; },
                  getTokenPos: function () { return tokenPos; },
                  getTokenText: function () { return text.substring(tokenPos, pos); },
                  getTokenValue: function () { return tokenValue; },
                  hasExtendedUnicodeEscape: function () { return hasExtendedUnicodeEscape; },
                  hasPrecedingLineBreak: function () { return precedingLineBreak; },
                  isIdentifier: function () { return token === 65 || token > 101; },
                  isReservedWord: function () { return token >= 66 && token <= 101; },
                  isUnterminated: function () { return tokenIsUnterminated; },
                  reScanGreaterToken: reScanGreaterToken,
                  reScanSlashToken: reScanSlashToken,
                  reScanTemplateToken: reScanTemplateToken,
                  scan: scan,
                  setText: setText,
                  setScriptTarget: setScriptTarget,
                  setOnError: setOnError,
                  setTextPos: setTextPos,
                  tryScan: tryScan,
                  lookAhead: lookAhead
              };
              function error(message, length) {
                  if (onError) {
                      onError(message, length || 0);
                  }
              }
              function isIdentifierStart(ch) {
                  return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                      ch === 36 || ch === 95 ||
                      ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
              }
              function isIdentifierPart(ch) {
                  return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
                      ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
                      ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
              }
              function scanNumber() {
                  var start = pos;
                  while (isDigit(text.charCodeAt(pos)))
                      pos++;
                  if (text.charCodeAt(pos) === 46) {
                      pos++;
                      while (isDigit(text.charCodeAt(pos)))
                          pos++;
                  }
                  var end = pos;
                  if (text.charCodeAt(pos) === 69 || text.charCodeAt(pos) === 101) {
                      pos++;
                      if (text.charCodeAt(pos) === 43 || text.charCodeAt(pos) === 45)
                          pos++;
                      if (isDigit(text.charCodeAt(pos))) {
                          pos++;
                          while (isDigit(text.charCodeAt(pos)))
                              pos++;
                          end = pos;
                      }
                      else {
                          error(ts.Diagnostics.Digit_expected);
                      }
                  }
                  return +(text.substring(start, end));
              }
              function scanOctalDigits() {
                  var start = pos;
                  while (isOctalDigit(text.charCodeAt(pos))) {
                      pos++;
                  }
                  return +(text.substring(start, pos));
              }
              function scanExactNumberOfHexDigits(count) {
                  return scanHexDigits(count, false);
              }
              function scanMinimumNumberOfHexDigits(count) {
                  return scanHexDigits(count, true);
              }
              function scanHexDigits(minCount, scanAsManyAsPossible) {
                  var digits = 0;
                  var value = 0;
                  while (digits < minCount || scanAsManyAsPossible) {
                      var ch = text.charCodeAt(pos);
                      if (ch >= 48 && ch <= 57) {
                          value = value * 16 + ch - 48;
                      }
                      else if (ch >= 65 && ch <= 70) {
                          value = value * 16 + ch - 65 + 10;
                      }
                      else if (ch >= 97 && ch <= 102) {
                          value = value * 16 + ch - 97 + 10;
                      }
                      else {
                          break;
                      }
                      pos++;
                      digits++;
                  }
                  if (digits < minCount) {
                      value = -1;
                  }
                  return value;
              }
              function scanString() {
                  var quote = text.charCodeAt(pos++);
                  var result = "";
                  var start = pos;
                  while (true) {
                      if (pos >= end) {
                          result += text.substring(start, pos);
                          tokenIsUnterminated = true;
                          error(ts.Diagnostics.Unterminated_string_literal);
                          break;
                      }
                      var ch = text.charCodeAt(pos);
                      if (ch === quote) {
                          result += text.substring(start, pos);
                          pos++;
                          break;
                      }
                      if (ch === 92) {
                          result += text.substring(start, pos);
                          result += scanEscapeSequence();
                          start = pos;
                          continue;
                      }
                      if (isLineBreak(ch)) {
                          result += text.substring(start, pos);
                          tokenIsUnterminated = true;
                          error(ts.Diagnostics.Unterminated_string_literal);
                          break;
                      }
                      pos++;
                  }
                  return result;
              }
              function scanTemplateAndSetTokenValue() {
                  var startedWithBacktick = text.charCodeAt(pos) === 96;
                  pos++;
                  var start = pos;
                  var contents = "";
                  var resultingToken;
                  while (true) {
                      if (pos >= end) {
                          contents += text.substring(start, pos);
                          tokenIsUnterminated = true;
                          error(ts.Diagnostics.Unterminated_template_literal);
                          resultingToken = startedWithBacktick ? 10 : 13;
                          break;
                      }
                      var currChar = text.charCodeAt(pos);
                      if (currChar === 96) {
                          contents += text.substring(start, pos);
                          pos++;
                          resultingToken = startedWithBacktick ? 10 : 13;
                          break;
                      }
                      if (currChar === 36 && pos + 1 < end && text.charCodeAt(pos + 1) === 123) {
                          contents += text.substring(start, pos);
                          pos += 2;
                          resultingToken = startedWithBacktick ? 11 : 12;
                          break;
                      }
                      if (currChar === 92) {
                          contents += text.substring(start, pos);
                          contents += scanEscapeSequence();
                          start = pos;
                          continue;
                      }
                      if (currChar === 13) {
                          contents += text.substring(start, pos);
                          pos++;
                          if (pos < end && text.charCodeAt(pos) === 10) {
                              pos++;
                          }
                          contents += "\n";
                          start = pos;
                          continue;
                      }
                      pos++;
                  }
                  ts.Debug.assert(resultingToken !== undefined);
                  tokenValue = contents;
                  return resultingToken;
              }
              function scanEscapeSequence() {
                  pos++;
                  if (pos >= end) {
                      error(ts.Diagnostics.Unexpected_end_of_text);
                      return "";
                  }
                  var ch = text.charCodeAt(pos++);
                  switch (ch) {
                      case 48:
                          return "\0";
                      case 98:
                          return "\b";
                      case 116:
                          return "\t";
                      case 110:
                          return "\n";
                      case 118:
                          return "\v";
                      case 102:
                          return "\f";
                      case 114:
                          return "\r";
                      case 39:
                          return "\'";
                      case 34:
                          return "\"";
                      case 117:
                          if (pos < end && text.charCodeAt(pos) === 123) {
                              hasExtendedUnicodeEscape = true;
                              pos++;
                              return scanExtendedUnicodeEscape();
                          }
                          return scanHexadecimalEscape(4);
                      case 120:
                          return scanHexadecimalEscape(2);
                      case 13:
                          if (pos < end && text.charCodeAt(pos) === 10) {
                              pos++;
                          }
                      case 10:
                      case 8232:
                      case 8233:
                          return "";
                      default:
                          return String.fromCharCode(ch);
                  }
              }
              function scanHexadecimalEscape(numDigits) {
                  var escapedValue = scanExactNumberOfHexDigits(numDigits);
                  if (escapedValue >= 0) {
                      return String.fromCharCode(escapedValue);
                  }
                  else {
                      error(ts.Diagnostics.Hexadecimal_digit_expected);
                      return "";
                  }
              }
              function scanExtendedUnicodeEscape() {
                  var escapedValue = scanMinimumNumberOfHexDigits(1);
                  var isInvalidExtendedEscape = false;
                  if (escapedValue < 0) {
                      error(ts.Diagnostics.Hexadecimal_digit_expected);
                      isInvalidExtendedEscape = true;
                  }
                  else if (escapedValue > 0x10FFFF) {
                      error(ts.Diagnostics.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive);
                      isInvalidExtendedEscape = true;
                  }
                  if (pos >= end) {
                      error(ts.Diagnostics.Unexpected_end_of_text);
                      isInvalidExtendedEscape = true;
                  }
                  else if (text.charCodeAt(pos) == 125) {
                      pos++;
                  }
                  else {
                      error(ts.Diagnostics.Unterminated_Unicode_escape_sequence);
                      isInvalidExtendedEscape = true;
                  }
                  if (isInvalidExtendedEscape) {
                      return "";
                  }
                  return utf16EncodeAsString(escapedValue);
              }
              function utf16EncodeAsString(codePoint) {
                  ts.Debug.assert(0x0 <= codePoint && codePoint <= 0x10FFFF);
                  if (codePoint <= 65535) {
                      return String.fromCharCode(codePoint);
                  }
                  var codeUnit1 = Math.floor((codePoint - 65536) / 1024) + 0xD800;
                  var codeUnit2 = ((codePoint - 65536) % 1024) + 0xDC00;
                  return String.fromCharCode(codeUnit1, codeUnit2);
              }
              function peekUnicodeEscape() {
                  if (pos + 5 < end && text.charCodeAt(pos + 1) === 117) {
                      var start_1 = pos;
                      pos += 2;
                      var value = scanExactNumberOfHexDigits(4);
                      pos = start_1;
                      return value;
                  }
                  return -1;
              }
              function scanIdentifierParts() {
                  var result = "";
                  var start = pos;
                  while (pos < end) {
                      var ch = text.charCodeAt(pos);
                      if (isIdentifierPart(ch)) {
                          pos++;
                      }
                      else if (ch === 92) {
                          ch = peekUnicodeEscape();
                          if (!(ch >= 0 && isIdentifierPart(ch))) {
                              break;
                          }
                          result += text.substring(start, pos);
                          result += String.fromCharCode(ch);
                          pos += 6;
                          start = pos;
                      }
                      else {
                          break;
                      }
                  }
                  result += text.substring(start, pos);
                  return result;
              }
              function getIdentifierToken() {
                  var len = tokenValue.length;
                  if (len >= 2 && len <= 11) {
                      var ch = tokenValue.charCodeAt(0);
                      if (ch >= 97 && ch <= 122 && hasOwnProperty.call(textToToken, tokenValue)) {
                          return token = textToToken[tokenValue];
                      }
                  }
                  return token = 65;
              }
              function scanBinaryOrOctalDigits(base) {
                  ts.Debug.assert(base !== 2 || base !== 8, "Expected either base 2 or base 8");
                  var value = 0;
                  var numberOfDigits = 0;
                  while (true) {
                      var ch = text.charCodeAt(pos);
                      var valueOfCh = ch - 48;
                      if (!isDigit(ch) || valueOfCh >= base) {
                          break;
                      }
                      value = value * base + valueOfCh;
                      pos++;
                      numberOfDigits++;
                  }
                  if (numberOfDigits === 0) {
                      return -1;
                  }
                  return value;
              }
              function scan() {
                  startPos = pos;
                  hasExtendedUnicodeEscape = false;
                  precedingLineBreak = false;
                  tokenIsUnterminated = false;
                  while (true) {
                      tokenPos = pos;
                      if (pos >= end) {
                          return token = 1;
                      }
                      var ch = text.charCodeAt(pos);
                      switch (ch) {
                          case 10:
                          case 13:
                              precedingLineBreak = true;
                              if (skipTrivia) {
                                  pos++;
                                  continue;
                              }
                              else {
                                  if (ch === 13 && pos + 1 < end && text.charCodeAt(pos + 1) === 10) {
                                      pos += 2;
                                  }
                                  else {
                                      pos++;
                                  }
                                  return token = 4;
                              }
                          case 9:
                          case 11:
                          case 12:
                          case 32:
                              if (skipTrivia) {
                                  pos++;
                                  continue;
                              }
                              else {
                                  while (pos < end && isWhiteSpace(text.charCodeAt(pos))) {
                                      pos++;
                                  }
                                  return token = 5;
                              }
                          case 33:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  if (text.charCodeAt(pos + 2) === 61) {
                                      return pos += 3, token = 31;
                                  }
                                  return pos += 2, token = 29;
                              }
                              return pos++, token = 46;
                          case 34:
                          case 39:
                              tokenValue = scanString();
                              return token = 8;
                          case 96:
                              return token = scanTemplateAndSetTokenValue();
                          case 37:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 58;
                              }
                              return pos++, token = 37;
                          case 38:
                              if (text.charCodeAt(pos + 1) === 38) {
                                  return pos += 2, token = 48;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 62;
                              }
                              return pos++, token = 43;
                          case 40:
                              return pos++, token = 16;
                          case 41:
                              return pos++, token = 17;
                          case 42:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 56;
                              }
                              return pos++, token = 35;
                          case 43:
                              if (text.charCodeAt(pos + 1) === 43) {
                                  return pos += 2, token = 38;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 54;
                              }
                              return pos++, token = 33;
                          case 44:
                              return pos++, token = 23;
                          case 45:
                              if (text.charCodeAt(pos + 1) === 45) {
                                  return pos += 2, token = 39;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 55;
                              }
                              return pos++, token = 34;
                          case 46:
                              if (isDigit(text.charCodeAt(pos + 1))) {
                                  tokenValue = "" + scanNumber();
                                  return token = 7;
                              }
                              if (text.charCodeAt(pos + 1) === 46 && text.charCodeAt(pos + 2) === 46) {
                                  return pos += 3, token = 21;
                              }
                              return pos++, token = 20;
                          case 47:
                              if (text.charCodeAt(pos + 1) === 47) {
                                  pos += 2;
                                  while (pos < end) {
                                      if (isLineBreak(text.charCodeAt(pos))) {
                                          break;
                                      }
                                      pos++;
                                  }
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 2;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 42) {
                                  pos += 2;
                                  var commentClosed = false;
                                  while (pos < end) {
                                      var ch_2 = text.charCodeAt(pos);
                                      if (ch_2 === 42 && text.charCodeAt(pos + 1) === 47) {
                                          pos += 2;
                                          commentClosed = true;
                                          break;
                                      }
                                      if (isLineBreak(ch_2)) {
                                          precedingLineBreak = true;
                                      }
                                      pos++;
                                  }
                                  if (!commentClosed) {
                                      error(ts.Diagnostics.Asterisk_Slash_expected);
                                  }
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      tokenIsUnterminated = !commentClosed;
                                      return token = 3;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 57;
                              }
                              return pos++, token = 36;
                          case 48:
                              if (pos + 2 < end && (text.charCodeAt(pos + 1) === 88 || text.charCodeAt(pos + 1) === 120)) {
                                  pos += 2;
                                  var value = scanMinimumNumberOfHexDigits(1);
                                  if (value < 0) {
                                      error(ts.Diagnostics.Hexadecimal_digit_expected);
                                      value = 0;
                                  }
                                  tokenValue = "" + value;
                                  return token = 7;
                              }
                              else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 66 || text.charCodeAt(pos + 1) === 98)) {
                                  pos += 2;
                                  var value = scanBinaryOrOctalDigits(2);
                                  if (value < 0) {
                                      error(ts.Diagnostics.Binary_digit_expected);
                                      value = 0;
                                  }
                                  tokenValue = "" + value;
                                  return token = 7;
                              }
                              else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 79 || text.charCodeAt(pos + 1) === 111)) {
                                  pos += 2;
                                  var value = scanBinaryOrOctalDigits(8);
                                  if (value < 0) {
                                      error(ts.Diagnostics.Octal_digit_expected);
                                      value = 0;
                                  }
                                  tokenValue = "" + value;
                                  return token = 7;
                              }
                              if (pos + 1 < end && isOctalDigit(text.charCodeAt(pos + 1))) {
                                  tokenValue = "" + scanOctalDigits();
                                  return token = 7;
                              }
                          case 49:
                          case 50:
                          case 51:
                          case 52:
                          case 53:
                          case 54:
                          case 55:
                          case 56:
                          case 57:
                              tokenValue = "" + scanNumber();
                              return token = 7;
                          case 58:
                              return pos++, token = 51;
                          case 59:
                              return pos++, token = 22;
                          case 60:
                              if (isConflictMarkerTrivia(text, pos)) {
                                  pos = scanConflictMarkerTrivia(text, pos, error);
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 6;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 60) {
                                  if (text.charCodeAt(pos + 2) === 61) {
                                      return pos += 3, token = 59;
                                  }
                                  return pos += 2, token = 40;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 26;
                              }
                              return pos++, token = 24;
                          case 61:
                              if (isConflictMarkerTrivia(text, pos)) {
                                  pos = scanConflictMarkerTrivia(text, pos, error);
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 6;
                                  }
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  if (text.charCodeAt(pos + 2) === 61) {
                                      return pos += 3, token = 30;
                                  }
                                  return pos += 2, token = 28;
                              }
                              if (text.charCodeAt(pos + 1) === 62) {
                                  return pos += 2, token = 32;
                              }
                              return pos++, token = 53;
                          case 62:
                              if (isConflictMarkerTrivia(text, pos)) {
                                  pos = scanConflictMarkerTrivia(text, pos, error);
                                  if (skipTrivia) {
                                      continue;
                                  }
                                  else {
                                      return token = 6;
                                  }
                              }
                              return pos++, token = 25;
                          case 63:
                              return pos++, token = 50;
                          case 91:
                              return pos++, token = 18;
                          case 93:
                              return pos++, token = 19;
                          case 94:
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 64;
                              }
                              return pos++, token = 45;
                          case 123:
                              return pos++, token = 14;
                          case 124:
                              if (text.charCodeAt(pos + 1) === 124) {
                                  return pos += 2, token = 49;
                              }
                              if (text.charCodeAt(pos + 1) === 61) {
                                  return pos += 2, token = 63;
                              }
                              return pos++, token = 44;
                          case 125:
                              return pos++, token = 15;
                          case 126:
                              return pos++, token = 47;
                          case 64:
                              return pos++, token = 52;
                          case 92:
                              var cookedChar = peekUnicodeEscape();
                              if (cookedChar >= 0 && isIdentifierStart(cookedChar)) {
                                  pos += 6;
                                  tokenValue = String.fromCharCode(cookedChar) + scanIdentifierParts();
                                  return token = getIdentifierToken();
                              }
                              error(ts.Diagnostics.Invalid_character);
                              return pos++, token = 0;
                          default:
                              if (isIdentifierStart(ch)) {
                                  pos++;
                                  while (pos < end && isIdentifierPart(ch = text.charCodeAt(pos)))
                                      pos++;
                                  tokenValue = text.substring(tokenPos, pos);
                                  if (ch === 92) {
                                      tokenValue += scanIdentifierParts();
                                  }
                                  return token = getIdentifierToken();
                              }
                              else if (isWhiteSpace(ch)) {
                                  pos++;
                                  continue;
                              }
                              else if (isLineBreak(ch)) {
                                  precedingLineBreak = true;
                                  pos++;
                                  continue;
                              }
                              error(ts.Diagnostics.Invalid_character);
                              return pos++, token = 0;
                      }
                  }
              }
              function reScanGreaterToken() {
                  if (token === 25) {
                      if (text.charCodeAt(pos) === 62) {
                          if (text.charCodeAt(pos + 1) === 62) {
                              if (text.charCodeAt(pos + 2) === 61) {
                                  return pos += 3, token = 61;
                              }
                              return pos += 2, token = 42;
                          }
                          if (text.charCodeAt(pos + 1) === 61) {
                              return pos += 2, token = 60;
                          }
                          return pos++, token = 41;
                      }
                      if (text.charCodeAt(pos) === 61) {
                          return pos++, token = 27;
                      }
                  }
                  return token;
              }
              function reScanSlashToken() {
                  if (token === 36 || token === 57) {
                      var p = tokenPos + 1;
                      var inEscape = false;
                      var inCharacterClass = false;
                      while (true) {
                          if (p >= end) {
                              tokenIsUnterminated = true;
                              error(ts.Diagnostics.Unterminated_regular_expression_literal);
                              break;
                          }
                          var ch = text.charCodeAt(p);
                          if (isLineBreak(ch)) {
                              tokenIsUnterminated = true;
                              error(ts.Diagnostics.Unterminated_regular_expression_literal);
                              break;
                          }
                          if (inEscape) {
                              inEscape = false;
                          }
                          else if (ch === 47 && !inCharacterClass) {
                              p++;
                              break;
                          }
                          else if (ch === 91) {
                              inCharacterClass = true;
                          }
                          else if (ch === 92) {
                              inEscape = true;
                          }
                          else if (ch === 93) {
                              inCharacterClass = false;
                          }
                          p++;
                      }
                      while (p < end && isIdentifierPart(text.charCodeAt(p))) {
                          p++;
                      }
                      pos = p;
                      tokenValue = text.substring(tokenPos, pos);
                      token = 9;
                  }
                  return token;
              }
              function reScanTemplateToken() {
                  ts.Debug.assert(token === 15, "'reScanTemplateToken' should only be called on a '}'");
                  pos = tokenPos;
                  return token = scanTemplateAndSetTokenValue();
              }
              function speculationHelper(callback, isLookahead) {
                  var savePos = pos;
                  var saveStartPos = startPos;
                  var saveTokenPos = tokenPos;
                  var saveToken = token;
                  var saveTokenValue = tokenValue;
                  var savePrecedingLineBreak = precedingLineBreak;
                  var result = callback();
                  if (!result || isLookahead) {
                      pos = savePos;
                      startPos = saveStartPos;
                      tokenPos = saveTokenPos;
                      token = saveToken;
                      tokenValue = saveTokenValue;
                      precedingLineBreak = savePrecedingLineBreak;
                  }
                  return result;
              }
              function lookAhead(callback) {
                  return speculationHelper(callback, true);
              }
              function tryScan(callback) {
                  return speculationHelper(callback, false);
              }
              function setText(newText, start, length) {
                  text = newText || "";
                  end = length === undefined ? text.length : start + length;
                  setTextPos(start || 0);
              }
              function setOnError(errorCallback) {
                  onError = errorCallback;
              }
              function setScriptTarget(scriptTarget) {
                  languageVersion = scriptTarget;
              }
              function setTextPos(textPos) {
                  ts.Debug.assert(textPos >= 0);
                  pos = textPos;
                  startPos = textPos;
                  tokenPos = textPos;
                  token = 0;
                  precedingLineBreak = false;
                  tokenValue = undefined;
                  hasExtendedUnicodeEscape = false;
                  tokenIsUnterminated = false;
              }
          }
          ts.createScanner = createScanner;
      })(ts || (ts = {}));
      /// <reference path="parser.ts"/>
      var ts;
      (function (ts) {
          ts.bindTime = 0;
          function getModuleInstanceState(node) {
              if (node.kind === 203 || node.kind === 204) {
                  return 0;
              }
              else if (ts.isConstEnumDeclaration(node)) {
                  return 2;
              }
              else if ((node.kind === 210 || node.kind === 209) && !(node.flags & 1)) {
                  return 0;
              }
              else if (node.kind === 207) {
                  var state = 0;
                  ts.forEachChild(node, function (n) {
                      switch (getModuleInstanceState(n)) {
                          case 0:
                              return false;
                          case 2:
                              state = 2;
                              return false;
                          case 1:
                              state = 1;
                              return true;
                      }
                  });
                  return state;
              }
              else if (node.kind === 206) {
                  return getModuleInstanceState(node.body);
              }
              else {
                  return 1;
              }
          }
          ts.getModuleInstanceState = getModuleInstanceState;
          function bindSourceFile(file) {
              var start = new Date().getTime();
              bindSourceFileWorker(file);
              ts.bindTime += new Date().getTime() - start;
          }
          ts.bindSourceFile = bindSourceFile;
          function bindSourceFileWorker(file) {
              var parent;
              var container;
              var blockScopeContainer;
              var lastContainer;
              var symbolCount = 0;
              var Symbol = ts.objectAllocator.getSymbolConstructor();
              if (!file.locals) {
                  file.locals = {};
                  container = file;
                  setBlockScopeContainer(file, false);
                  bind(file);
                  file.symbolCount = symbolCount;
              }
              function createSymbol(flags, name) {
                  symbolCount++;
                  return new Symbol(flags, name);
              }
              function setBlockScopeContainer(node, cleanLocals) {
                  blockScopeContainer = node;
                  if (cleanLocals) {
                      blockScopeContainer.locals = undefined;
                  }
              }
              function addDeclarationToSymbol(symbol, node, symbolKind) {
                  symbol.flags |= symbolKind;
                  if (!symbol.declarations)
                      symbol.declarations = [];
                  symbol.declarations.push(node);
                  if (symbolKind & 1952 && !symbol.exports)
                      symbol.exports = {};
                  if (symbolKind & 6240 && !symbol.members)
                      symbol.members = {};
                  node.symbol = symbol;
                  if (symbolKind & 107455 && !symbol.valueDeclaration)
                      symbol.valueDeclaration = node;
              }
              function getDeclarationName(node) {
                  if (node.name) {
                      if (node.kind === 206 && node.name.kind === 8) {
                          return '"' + node.name.text + '"';
                      }
                      if (node.name.kind === 128) {
                          var nameExpression = node.name.expression;
                          ts.Debug.assert(ts.isWellKnownSymbolSyntactically(nameExpression));
                          return ts.getPropertyNameForKnownSymbolName(nameExpression.name.text);
                      }
                      return node.name.text;
                  }
                  switch (node.kind) {
                      case 144:
                      case 136:
                          return "__constructor";
                      case 143:
                      case 139:
                          return "__call";
                      case 140:
                          return "__new";
                      case 141:
                          return "__index";
                      case 216:
                          return "__export";
                      case 215:
                          return node.isExportEquals ? "export=" : "default";
                      case 201:
                      case 202:
                          return node.flags & 256 ? "default" : undefined;
                  }
              }
              function getDisplayName(node) {
                  return node.name ? ts.declarationNameToString(node.name) : getDeclarationName(node);
              }
              function declareSymbol(symbols, parent, node, includes, excludes) {
                  ts.Debug.assert(!ts.hasDynamicName(node));
                  var name = node.flags & 256 && parent ? "default" : getDeclarationName(node);
                  var symbol;
                  if (name !== undefined) {
                      symbol = ts.hasProperty(symbols, name) ? symbols[name] : (symbols[name] = createSymbol(0, name));
                      if (symbol.flags & excludes) {
                          if (node.name) {
                              node.name.parent = node;
                          }
                          var message = symbol.flags & 2
                              ? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0
                              : ts.Diagnostics.Duplicate_identifier_0;
                          ts.forEach(symbol.declarations, function (declaration) {
                              file.bindDiagnostics.push(ts.createDiagnosticForNode(declaration.name || declaration, message, getDisplayName(declaration)));
                          });
                          file.bindDiagnostics.push(ts.createDiagnosticForNode(node.name || node, message, getDisplayName(node)));
                          symbol = createSymbol(0, name);
                      }
                  }
                  else {
                      symbol = createSymbol(0, "__missing");
                  }
                  addDeclarationToSymbol(symbol, node, includes);
                  symbol.parent = parent;
                  if ((node.kind === 202 || node.kind === 175) && symbol.exports) {
                      var prototypeSymbol = createSymbol(4 | 134217728, "prototype");
                      if (ts.hasProperty(symbol.exports, prototypeSymbol.name)) {
                          if (node.name) {
                              node.name.parent = node;
                          }
                          file.bindDiagnostics.push(ts.createDiagnosticForNode(symbol.exports[prototypeSymbol.name].declarations[0], ts.Diagnostics.Duplicate_identifier_0, prototypeSymbol.name));
                      }
                      symbol.exports[prototypeSymbol.name] = prototypeSymbol;
                      prototypeSymbol.parent = symbol;
                  }
                  return symbol;
              }
              function declareModuleMember(node, symbolKind, symbolExcludes) {
                  var hasExportModifier = ts.getCombinedNodeFlags(node) & 1;
                  if (symbolKind & 8388608) {
                      if (node.kind === 218 || (node.kind === 209 && hasExportModifier)) {
                          declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                      }
                      else {
                          declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
                      }
                  }
                  else {
                      if (hasExportModifier || container.flags & 65536) {
                          var exportKind = (symbolKind & 107455 ? 1048576 : 0) |
                              (symbolKind & 793056 ? 2097152 : 0) |
                              (symbolKind & 1536 ? 4194304 : 0);
                          var local = declareSymbol(container.locals, undefined, node, exportKind, symbolExcludes);
                          local.exportSymbol = declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                          node.localSymbol = local;
                      }
                      else {
                          declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
                      }
                  }
              }
              function bindChildren(node, symbolKind, isBlockScopeContainer) {
                  if (symbolKind & 255504) {
                      node.locals = {};
                  }
                  var saveParent = parent;
                  var saveContainer = container;
                  var savedBlockScopeContainer = blockScopeContainer;
                  parent = node;
                  if (symbolKind & 262128) {
                      container = node;
                      addToContainerChain(container);
                  }
                  if (isBlockScopeContainer) {
                      setBlockScopeContainer(node, (symbolKind & 255504) === 0 && node.kind !== 228);
                  }
                  ts.forEachChild(node, bind);
                  container = saveContainer;
                  parent = saveParent;
                  blockScopeContainer = savedBlockScopeContainer;
              }
              function addToContainerChain(node) {
                  if (lastContainer) {
                      lastContainer.nextContainer = node;
                  }
                  lastContainer = node;
              }
              function bindDeclaration(node, symbolKind, symbolExcludes, isBlockScopeContainer) {
                  switch (container.kind) {
                      case 206:
                          declareModuleMember(node, symbolKind, symbolExcludes);
                          break;
                      case 228:
                          if (ts.isExternalModule(container)) {
                              declareModuleMember(node, symbolKind, symbolExcludes);
                              break;
                          }
                      case 143:
                      case 144:
                      case 139:
                      case 140:
                      case 141:
                      case 135:
                      case 134:
                      case 136:
                      case 137:
                      case 138:
                      case 201:
                      case 163:
                      case 164:
                          declareSymbol(container.locals, undefined, node, symbolKind, symbolExcludes);
                          break;
                      case 175:
                      case 202:
                          if (node.flags & 128) {
                              declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                              break;
                          }
                      case 146:
                      case 155:
                      case 203:
                          declareSymbol(container.symbol.members, container.symbol, node, symbolKind, symbolExcludes);
                          break;
                      case 205:
                          declareSymbol(container.symbol.exports, container.symbol, node, symbolKind, symbolExcludes);
                          break;
                  }
                  bindChildren(node, symbolKind, isBlockScopeContainer);
              }
              function isAmbientContext(node) {
                  while (node) {
                      if (node.flags & 2)
                          return true;
                      node = node.parent;
                  }
                  return false;
              }
              function hasExportDeclarations(node) {
                  var body = node.kind === 228 ? node : node.body;
                  if (body.kind === 228 || body.kind === 207) {
                      for (var _i = 0, _a = body.statements; _i < _a.length; _i++) {
                          var stat = _a[_i];
                          if (stat.kind === 216 || stat.kind === 215) {
                              return true;
                          }
                      }
                  }
                  return false;
              }
              function setExportContextFlag(node) {
                  if (isAmbientContext(node) && !hasExportDeclarations(node)) {
                      node.flags |= 65536;
                  }
                  else {
                      node.flags &= ~65536;
                  }
              }
              function bindModuleDeclaration(node) {
                  setExportContextFlag(node);
                  if (node.name.kind === 8) {
                      bindDeclaration(node, 512, 106639, true);
                  }
                  else {
                      var state = getModuleInstanceState(node);
                      if (state === 0) {
                          bindDeclaration(node, 1024, 0, true);
                      }
                      else {
                          bindDeclaration(node, 512, 106639, true);
                          var currentModuleIsConstEnumOnly = state === 2;
                          if (node.symbol.constEnumOnlyModule === undefined) {
                              node.symbol.constEnumOnlyModule = currentModuleIsConstEnumOnly;
                          }
                          else {
                              node.symbol.constEnumOnlyModule = node.symbol.constEnumOnlyModule && currentModuleIsConstEnumOnly;
                          }
                      }
                  }
              }
              function bindFunctionOrConstructorType(node) {
                  // For a given function symbol "<...>(...) => T" we want to generate a symbol identical
                  // to the one we would get for: { <...>(...): T }
                  //
                  // We do that by making an anonymous type literal symbol, and then setting the function 
                  // symbol as its sole member. To the rest of the system, this symbol will be  indistinguishable 
                  // from an actual type literal symbol you would have gotten had you used the long form.
                  var symbol = createSymbol(131072, getDeclarationName(node));
                  addDeclarationToSymbol(symbol, node, 131072);
                  bindChildren(node, 131072, false);
                  var typeLiteralSymbol = createSymbol(2048, "__type");
                  addDeclarationToSymbol(typeLiteralSymbol, node, 2048);
                  typeLiteralSymbol.members = {};
                  typeLiteralSymbol.members[node.kind === 143 ? "__call" : "__new"] = symbol;
              }
              function bindAnonymousDeclaration(node, symbolKind, name, isBlockScopeContainer) {
                  var symbol = createSymbol(symbolKind, name);
                  addDeclarationToSymbol(symbol, node, symbolKind);
                  bindChildren(node, symbolKind, isBlockScopeContainer);
              }
              function bindCatchVariableDeclaration(node) {
                  bindChildren(node, 0, true);
              }
              function bindBlockScopedDeclaration(node, symbolKind, symbolExcludes) {
                  switch (blockScopeContainer.kind) {
                      case 206:
                          declareModuleMember(node, symbolKind, symbolExcludes);
                          break;
                      case 228:
                          if (ts.isExternalModule(container)) {
                              declareModuleMember(node, symbolKind, symbolExcludes);
                              break;
                          }
                      default:
                          if (!blockScopeContainer.locals) {
                              blockScopeContainer.locals = {};
                              addToContainerChain(blockScopeContainer);
                          }
                          declareSymbol(blockScopeContainer.locals, undefined, node, symbolKind, symbolExcludes);
                  }
                  bindChildren(node, symbolKind, false);
              }
              function bindBlockScopedVariableDeclaration(node) {
                  bindBlockScopedDeclaration(node, 2, 107455);
              }
              function getDestructuringParameterName(node) {
                  return "__" + ts.indexOf(node.parent.parameters, node);
              }
              function bind(node) {
                  node.parent = parent;
                  switch (node.kind) {
                      case 129:
                          bindDeclaration(node, 262144, 530912, false);
                          break;
                      case 130:
                          bindParameter(node);
                          break;
                      case 199:
                      case 153:
                          if (ts.isBindingPattern(node.name)) {
                              bindChildren(node, 0, false);
                          }
                          else if (ts.isBlockOrCatchScoped(node)) {
                              bindBlockScopedVariableDeclaration(node);
                          }
                          else if (ts.isParameterDeclaration(node)) {
                              bindDeclaration(node, 1, 107455, false);
                          }
                          else {
                              bindDeclaration(node, 1, 107454, false);
                          }
                          break;
                      case 133:
                      case 132:
                          bindPropertyOrMethodOrAccessor(node, 4 | (node.questionToken ? 536870912 : 0), 107455, false);
                          break;
                      case 225:
                      case 226:
                          bindPropertyOrMethodOrAccessor(node, 4, 107455, false);
                          break;
                      case 227:
                          bindPropertyOrMethodOrAccessor(node, 8, 107455, false);
                          break;
                      case 139:
                      case 140:
                      case 141:
                          bindDeclaration(node, 131072, 0, false);
                          break;
                      case 135:
                      case 134:
                          bindPropertyOrMethodOrAccessor(node, 8192 | (node.questionToken ? 536870912 : 0), ts.isObjectLiteralMethod(node) ? 107455 : 99263, true);
                          break;
                      case 201:
                          bindDeclaration(node, 16, 106927, true);
                          break;
                      case 136:
                          bindDeclaration(node, 16384, 0, true);
                          break;
                      case 137:
                          bindPropertyOrMethodOrAccessor(node, 32768, 41919, true);
                          break;
                      case 138:
                          bindPropertyOrMethodOrAccessor(node, 65536, 74687, true);
                          break;
                      case 143:
                      case 144:
                          bindFunctionOrConstructorType(node);
                          break;
                      case 146:
                          bindAnonymousDeclaration(node, 2048, "__type", false);
                          break;
                      case 155:
                          bindAnonymousDeclaration(node, 4096, "__object", false);
                          break;
                      case 163:
                      case 164:
                          bindAnonymousDeclaration(node, 16, "__function", true);
                          break;
                      case 175:
                          bindAnonymousDeclaration(node, 32, "__class", false);
                          break;
                      case 224:
                          bindCatchVariableDeclaration(node);
                          break;
                      case 202:
                          bindBlockScopedDeclaration(node, 32, 899583);
                          break;
                      case 203:
                          bindDeclaration(node, 64, 792992, false);
                          break;
                      case 204:
                          bindDeclaration(node, 524288, 793056, false);
                          break;
                      case 205:
                          if (ts.isConst(node)) {
                              bindDeclaration(node, 128, 899967, false);
                          }
                          else {
                              bindDeclaration(node, 256, 899327, false);
                          }
                          break;
                      case 206:
                          bindModuleDeclaration(node);
                          break;
                      case 209:
                      case 212:
                      case 214:
                      case 218:
                          bindDeclaration(node, 8388608, 8388608, false);
                          break;
                      case 211:
                          if (node.name) {
                              bindDeclaration(node, 8388608, 8388608, false);
                          }
                          else {
                              bindChildren(node, 0, false);
                          }
                          break;
                      case 216:
                          if (!node.exportClause) {
                              declareSymbol(container.symbol.exports, container.symbol, node, 1073741824, 0);
                          }
                          bindChildren(node, 0, false);
                          break;
                      case 215:
                          if (node.expression.kind === 65) {
                              declareSymbol(container.symbol.exports, container.symbol, node, 8388608, 107455 | 8388608);
                          }
                          else {
                              declareSymbol(container.symbol.exports, container.symbol, node, 4, 107455 | 8388608);
                          }
                          bindChildren(node, 0, false);
                          break;
                      case 228:
                          setExportContextFlag(node);
                          if (ts.isExternalModule(node)) {
                              bindAnonymousDeclaration(node, 512, '"' + ts.removeFileExtension(node.fileName) + '"', true);
                              break;
                          }
                      case 180:
                          bindChildren(node, 0, !ts.isFunctionLike(node.parent));
                          break;
                      case 224:
                      case 187:
                      case 188:
                      case 189:
                      case 208:
                          bindChildren(node, 0, true);
                          break;
                      default:
                          var saveParent = parent;
                          parent = node;
                          ts.forEachChild(node, bind);
                          parent = saveParent;
                  }
              }
              function bindParameter(node) {
                  if (ts.isBindingPattern(node.name)) {
                      bindAnonymousDeclaration(node, 1, getDestructuringParameterName(node), false);
                  }
                  else {
                      bindDeclaration(node, 1, 107455, false);
                  }
                  if (node.flags & 112 &&
                      node.parent.kind === 136 &&
                      (node.parent.parent.kind === 202 || node.parent.parent.kind === 175)) {
                      var classDeclaration = node.parent.parent;
                      declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, 4, 107455);
                  }
              }
              function bindPropertyOrMethodOrAccessor(node, symbolKind, symbolExcludes, isBlockScopeContainer) {
                  if (ts.hasDynamicName(node)) {
                      bindAnonymousDeclaration(node, symbolKind, "__computed", isBlockScopeContainer);
                  }
                  else {
                      bindDeclaration(node, symbolKind, symbolExcludes, isBlockScopeContainer);
                  }
              }
          }
      })(ts || (ts = {}));
      /// <reference path="binder.ts" />
      var ts;
      (function (ts) {
          function getDeclarationOfKind(symbol, kind) {
              var declarations = symbol.declarations;
              for (var _i = 0; _i < declarations.length; _i++) {
                  var declaration = declarations[_i];
                  if (declaration.kind === kind) {
                      return declaration;
                  }
              }
              return undefined;
          }
          ts.getDeclarationOfKind = getDeclarationOfKind;
          var stringWriters = [];
          function getSingleLineStringWriter() {
              if (stringWriters.length == 0) {
                  var str = "";
                  var writeText = function (text) { return str += text; };
                  return {
                      string: function () { return str; },
                      writeKeyword: writeText,
                      writeOperator: writeText,
                      writePunctuation: writeText,
                      writeSpace: writeText,
                      writeStringLiteral: writeText,
                      writeParameter: writeText,
                      writeSymbol: writeText,
                      writeLine: function () { return str += " "; },
                      increaseIndent: function () { },
                      decreaseIndent: function () { },
                      clear: function () { return str = ""; },
                      trackSymbol: function () { }
                  };
              }
              return stringWriters.pop();
          }
          ts.getSingleLineStringWriter = getSingleLineStringWriter;
          function releaseStringWriter(writer) {
              writer.clear();
              stringWriters.push(writer);
          }
          ts.releaseStringWriter = releaseStringWriter;
          function getFullWidth(node) {
              return node.end - node.pos;
          }
          ts.getFullWidth = getFullWidth;
          function containsParseError(node) {
              aggregateChildData(node);
              return (node.parserContextFlags & 64) !== 0;
          }
          ts.containsParseError = containsParseError;
          function aggregateChildData(node) {
              if (!(node.parserContextFlags & 128)) {
                  var thisNodeOrAnySubNodesHasError = ((node.parserContextFlags & 32) !== 0) ||
                      ts.forEachChild(node, containsParseError);
                  if (thisNodeOrAnySubNodesHasError) {
                      node.parserContextFlags |= 64;
                  }
                  node.parserContextFlags |= 128;
              }
          }
          function getSourceFileOfNode(node) {
              while (node && node.kind !== 228) {
                  node = node.parent;
              }
              return node;
          }
          ts.getSourceFileOfNode = getSourceFileOfNode;
          function getStartPositionOfLine(line, sourceFile) {
              ts.Debug.assert(line >= 0);
              return ts.getLineStarts(sourceFile)[line];
          }
          ts.getStartPositionOfLine = getStartPositionOfLine;
          function nodePosToString(node) {
              var file = getSourceFileOfNode(node);
              var loc = ts.getLineAndCharacterOfPosition(file, node.pos);
              return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")";
          }
          ts.nodePosToString = nodePosToString;
          function getStartPosOfNode(node) {
              return node.pos;
          }
          ts.getStartPosOfNode = getStartPosOfNode;
          function nodeIsMissing(node) {
              if (!node) {
                  return true;
              }
              return node.pos === node.end && node.kind !== 1;
          }
          ts.nodeIsMissing = nodeIsMissing;
          function nodeIsPresent(node) {
              return !nodeIsMissing(node);
          }
          ts.nodeIsPresent = nodeIsPresent;
          function getTokenPosOfNode(node, sourceFile) {
              if (nodeIsMissing(node)) {
                  return node.pos;
              }
              return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos);
          }
          ts.getTokenPosOfNode = getTokenPosOfNode;
          function getNonDecoratorTokenPosOfNode(node, sourceFile) {
              if (nodeIsMissing(node) || !node.decorators) {
                  return getTokenPosOfNode(node, sourceFile);
              }
              return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.decorators.end);
          }
          ts.getNonDecoratorTokenPosOfNode = getNonDecoratorTokenPosOfNode;
          function getSourceTextOfNodeFromSourceFile(sourceFile, node) {
              if (nodeIsMissing(node)) {
                  return "";
              }
              var text = sourceFile.text;
              return text.substring(ts.skipTrivia(text, node.pos), node.end);
          }
          ts.getSourceTextOfNodeFromSourceFile = getSourceTextOfNodeFromSourceFile;
          function getTextOfNodeFromSourceText(sourceText, node) {
              if (nodeIsMissing(node)) {
                  return "";
              }
              return sourceText.substring(ts.skipTrivia(sourceText, node.pos), node.end);
          }
          ts.getTextOfNodeFromSourceText = getTextOfNodeFromSourceText;
          function getTextOfNode(node) {
              return getSourceTextOfNodeFromSourceFile(getSourceFileOfNode(node), node);
          }
          ts.getTextOfNode = getTextOfNode;
          function escapeIdentifier(identifier) {
              return identifier.length >= 2 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 ? "_" + identifier : identifier;
          }
          ts.escapeIdentifier = escapeIdentifier;
          function unescapeIdentifier(identifier) {
              return identifier.length >= 3 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 && identifier.charCodeAt(2) === 95 ? identifier.substr(1) : identifier;
          }
          ts.unescapeIdentifier = unescapeIdentifier;
          function makeIdentifierFromModuleName(moduleName) {
              return ts.getBaseFileName(moduleName).replace(/\W/g, "_");
          }
          ts.makeIdentifierFromModuleName = makeIdentifierFromModuleName;
          function isBlockOrCatchScoped(declaration) {
              return (getCombinedNodeFlags(declaration) & 12288) !== 0 ||
                  isCatchClauseVariableDeclaration(declaration);
          }
          ts.isBlockOrCatchScoped = isBlockOrCatchScoped;
          function getEnclosingBlockScopeContainer(node) {
              var current = node.parent;
              while (current) {
                  if (isFunctionLike(current)) {
                      return current;
                  }
                  switch (current.kind) {
                      case 228:
                      case 208:
                      case 224:
                      case 206:
                      case 187:
                      case 188:
                      case 189:
                          return current;
                      case 180:
                          if (!isFunctionLike(current.parent)) {
                              return current;
                          }
                  }
                  current = current.parent;
              }
          }
          ts.getEnclosingBlockScopeContainer = getEnclosingBlockScopeContainer;
          function isCatchClauseVariableDeclaration(declaration) {
              return declaration &&
                  declaration.kind === 199 &&
                  declaration.parent &&
                  declaration.parent.kind === 224;
          }
          ts.isCatchClauseVariableDeclaration = isCatchClauseVariableDeclaration;
          function declarationNameToString(name) {
              return getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
          }
          ts.declarationNameToString = declarationNameToString;
          function createDiagnosticForNode(node, message, arg0, arg1, arg2) {
              var sourceFile = getSourceFileOfNode(node);
              var span = getErrorSpanForNode(sourceFile, node);
              return ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2);
          }
          ts.createDiagnosticForNode = createDiagnosticForNode;
          function createDiagnosticForNodeFromMessageChain(node, messageChain) {
              var sourceFile = getSourceFileOfNode(node);
              var span = getErrorSpanForNode(sourceFile, node);
              return {
                  file: sourceFile,
                  start: span.start,
                  length: span.length,
                  code: messageChain.code,
                  category: messageChain.category,
                  messageText: messageChain.next ? messageChain : messageChain.messageText
              };
          }
          ts.createDiagnosticForNodeFromMessageChain = createDiagnosticForNodeFromMessageChain;
          function getSpanOfTokenAtPosition(sourceFile, pos) {
              var scanner = ts.createScanner(sourceFile.languageVersion, true, sourceFile.text, undefined, pos);
              scanner.scan();
              var start = scanner.getTokenPos();
              return ts.createTextSpanFromBounds(start, scanner.getTextPos());
          }
          ts.getSpanOfTokenAtPosition = getSpanOfTokenAtPosition;
          function getErrorSpanForNode(sourceFile, node) {
              var errorNode = node;
              switch (node.kind) {
                  case 228:
                      var pos_1 = ts.skipTrivia(sourceFile.text, 0, false);
                      if (pos_1 === sourceFile.text.length) {
                          return ts.createTextSpan(0, 0);
                      }
                      return getSpanOfTokenAtPosition(sourceFile, pos_1);
                  case 199:
                  case 153:
                  case 202:
                  case 175:
                  case 203:
                  case 206:
                  case 205:
                  case 227:
                  case 201:
                  case 163:
                      errorNode = node.name;
                      break;
              }
              if (errorNode === undefined) {
                  return getSpanOfTokenAtPosition(sourceFile, node.pos);
              }
              var pos = nodeIsMissing(errorNode)
                  ? errorNode.pos
                  : ts.skipTrivia(sourceFile.text, errorNode.pos);
              return ts.createTextSpanFromBounds(pos, errorNode.end);
          }
          ts.getErrorSpanForNode = getErrorSpanForNode;
          function isExternalModule(file) {
              return file.externalModuleIndicator !== undefined;
          }
          ts.isExternalModule = isExternalModule;
          function isDeclarationFile(file) {
              return (file.flags & 2048) !== 0;
          }
          ts.isDeclarationFile = isDeclarationFile;
          function isConstEnumDeclaration(node) {
              return node.kind === 205 && isConst(node);
          }
          ts.isConstEnumDeclaration = isConstEnumDeclaration;
          function walkUpBindingElementsAndPatterns(node) {
              while (node && (node.kind === 153 || isBindingPattern(node))) {
                  node = node.parent;
              }
              return node;
          }
          function getCombinedNodeFlags(node) {
              node = walkUpBindingElementsAndPatterns(node);
              var flags = node.flags;
              if (node.kind === 199) {
                  node = node.parent;
              }
              if (node && node.kind === 200) {
                  flags |= node.flags;
                  node = node.parent;
              }
              if (node && node.kind === 181) {
                  flags |= node.flags;
              }
              return flags;
          }
          ts.getCombinedNodeFlags = getCombinedNodeFlags;
          function isConst(node) {
              return !!(getCombinedNodeFlags(node) & 8192);
          }
          ts.isConst = isConst;
          function isLet(node) {
              return !!(getCombinedNodeFlags(node) & 4096);
          }
          ts.isLet = isLet;
          function isPrologueDirective(node) {
              return node.kind === 183 && node.expression.kind === 8;
          }
          ts.isPrologueDirective = isPrologueDirective;
          function getLeadingCommentRangesOfNode(node, sourceFileOfNode) {
              if (node.kind === 130 || node.kind === 129) {
                  return ts.concatenate(ts.getTrailingCommentRanges(sourceFileOfNode.text, node.pos), ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos));
              }
              else {
                  return ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos);
              }
          }
          ts.getLeadingCommentRangesOfNode = getLeadingCommentRangesOfNode;
          function getJsDocComments(node, sourceFileOfNode) {
              return ts.filter(getLeadingCommentRangesOfNode(node, sourceFileOfNode), isJsDocComment);
              function isJsDocComment(comment) {
                  return sourceFileOfNode.text.charCodeAt(comment.pos + 1) === 42 &&
                      sourceFileOfNode.text.charCodeAt(comment.pos + 2) === 42 &&
                      sourceFileOfNode.text.charCodeAt(comment.pos + 3) !== 47;
              }
          }
          ts.getJsDocComments = getJsDocComments;
          ts.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*<reference\s+path\s*=\s*)('|")(.+?)\2.*?\/>/;
          function forEachReturnStatement(body, visitor) {
              return traverse(body);
              function traverse(node) {
                  switch (node.kind) {
                      case 192:
                          return visitor(node);
                      case 208:
                      case 180:
                      case 184:
                      case 185:
                      case 186:
                      case 187:
                      case 188:
                      case 189:
                      case 193:
                      case 194:
                      case 221:
                      case 222:
                      case 195:
                      case 197:
                      case 224:
                          return ts.forEachChild(node, traverse);
                  }
              }
          }
          ts.forEachReturnStatement = forEachReturnStatement;
          function isVariableLike(node) {
              if (node) {
                  switch (node.kind) {
                      case 153:
                      case 227:
                      case 130:
                      case 225:
                      case 133:
                      case 132:
                      case 226:
                      case 199:
                          return true;
                  }
              }
              return false;
          }
          ts.isVariableLike = isVariableLike;
          function isAccessor(node) {
              if (node) {
                  switch (node.kind) {
                      case 137:
                      case 138:
                          return true;
                  }
              }
              return false;
          }
          ts.isAccessor = isAccessor;
          function isFunctionLike(node) {
              if (node) {
                  switch (node.kind) {
                      case 136:
                      case 163:
                      case 201:
                      case 164:
                      case 135:
                      case 134:
                      case 137:
                      case 138:
                      case 139:
                      case 140:
                      case 141:
                      case 143:
                      case 144:
                          return true;
                  }
              }
              return false;
          }
          ts.isFunctionLike = isFunctionLike;
          function isFunctionBlock(node) {
              return node && node.kind === 180 && isFunctionLike(node.parent);
          }
          ts.isFunctionBlock = isFunctionBlock;
          function isObjectLiteralMethod(node) {
              return node && node.kind === 135 && node.parent.kind === 155;
          }
          ts.isObjectLiteralMethod = isObjectLiteralMethod;
          function getContainingFunction(node) {
              while (true) {
                  node = node.parent;
                  if (!node || isFunctionLike(node)) {
                      return node;
                  }
              }
          }
          ts.getContainingFunction = getContainingFunction;
          function getThisContainer(node, includeArrowFunctions) {
              while (true) {
                  node = node.parent;
                  if (!node) {
                      return undefined;
                  }
                  switch (node.kind) {
                      case 128:
                          if (node.parent.parent.kind === 202) {
                              return node;
                          }
                          node = node.parent;
                          break;
                      case 131:
                          if (node.parent.kind === 130 && isClassElement(node.parent.parent)) {
                              node = node.parent.parent;
                          }
                          else if (isClassElement(node.parent)) {
                              node = node.parent;
                          }
                          break;
                      case 164:
                          if (!includeArrowFunctions) {
                              continue;
                          }
                      case 201:
                      case 163:
                      case 206:
                      case 133:
                      case 132:
                      case 135:
                      case 134:
                      case 136:
                      case 137:
                      case 138:
                      case 205:
                      case 228:
                          return node;
                  }
              }
          }
          ts.getThisContainer = getThisContainer;
          function getSuperContainer(node, includeFunctions) {
              while (true) {
                  node = node.parent;
                  if (!node)
                      return node;
                  switch (node.kind) {
                      case 128:
                          if (node.parent.parent.kind === 202) {
                              return node;
                          }
                          node = node.parent;
                          break;
                      case 131:
                          if (node.parent.kind === 130 && isClassElement(node.parent.parent)) {
                              node = node.parent.parent;
                          }
                          else if (isClassElement(node.parent)) {
                              node = node.parent;
                          }
                          break;
                      case 201:
                      case 163:
                      case 164:
                          if (!includeFunctions) {
                              continue;
                          }
                      case 133:
                      case 132:
                      case 135:
                      case 134:
                      case 136:
                      case 137:
                      case 138:
                          return node;
                  }
              }
          }
          ts.getSuperContainer = getSuperContainer;
          function getInvokedExpression(node) {
              if (node.kind === 160) {
                  return node.tag;
              }
              return node.expression;
          }
          ts.getInvokedExpression = getInvokedExpression;
          function nodeCanBeDecorated(node) {
              switch (node.kind) {
                  case 202:
                      return true;
                  case 133:
                      return node.parent.kind === 202;
                  case 130:
                      return node.parent.body && node.parent.parent.kind === 202;
                  case 137:
                  case 138:
                  case 135:
                      return node.body && node.parent.kind === 202;
              }
              return false;
          }
          ts.nodeCanBeDecorated = nodeCanBeDecorated;
          function nodeIsDecorated(node) {
              switch (node.kind) {
                  case 202:
                      if (node.decorators) {
                          return true;
                      }
                      return false;
                  case 133:
                  case 130:
                      if (node.decorators) {
                          return true;
                      }
                      return false;
                  case 137:
                      if (node.body && node.decorators) {
                          return true;
                      }
                      return false;
                  case 135:
                  case 138:
                      if (node.body && node.decorators) {
                          return true;
                      }
                      return false;
              }
              return false;
          }
          ts.nodeIsDecorated = nodeIsDecorated;
          function childIsDecorated(node) {
              switch (node.kind) {
                  case 202:
                      return ts.forEach(node.members, nodeOrChildIsDecorated);
                  case 135:
                  case 138:
                      return ts.forEach(node.parameters, nodeIsDecorated);
              }
              return false;
          }
          ts.childIsDecorated = childIsDecorated;
          function nodeOrChildIsDecorated(node) {
              return nodeIsDecorated(node) || childIsDecorated(node);
          }
          ts.nodeOrChildIsDecorated = nodeOrChildIsDecorated;
          function isExpression(node) {
              switch (node.kind) {
                  case 93:
                  case 91:
                  case 89:
                  case 95:
                  case 80:
                  case 9:
                  case 154:
                  case 155:
                  case 156:
                  case 157:
                  case 158:
                  case 159:
                  case 160:
                  case 161:
                  case 162:
                  case 163:
                  case 175:
                  case 164:
                  case 167:
                  case 165:
                  case 166:
                  case 168:
                  case 169:
                  case 170:
                  case 171:
                  case 174:
                  case 172:
                  case 10:
                  case 176:
                      return true;
                  case 127:
                      while (node.parent.kind === 127) {
                          node = node.parent;
                      }
                      return node.parent.kind === 145;
                  case 65:
                      if (node.parent.kind === 145) {
                          return true;
                      }
                  case 7:
                  case 8:
                      var parent_1 = node.parent;
                      switch (parent_1.kind) {
                          case 199:
                          case 130:
                          case 133:
                          case 132:
                          case 227:
                          case 225:
                          case 153:
                              return parent_1.initializer === node;
                          case 183:
                          case 184:
                          case 185:
                          case 186:
                          case 192:
                          case 193:
                          case 194:
                          case 221:
                          case 196:
                          case 194:
                              return parent_1.expression === node;
                          case 187:
                              var forStatement = parent_1;
                              return (forStatement.initializer === node && forStatement.initializer.kind !== 200) ||
                                  forStatement.condition === node ||
                                  forStatement.incrementor === node;
                          case 188:
                          case 189:
                              var forInStatement = parent_1;
                              return (forInStatement.initializer === node && forInStatement.initializer.kind !== 200) ||
                                  forInStatement.expression === node;
                          case 161:
                              return node === parent_1.expression;
                          case 178:
                              return node === parent_1.expression;
                          case 128:
                              return node === parent_1.expression;
                          case 131:
                              return true;
                          default:
                              if (isExpression(parent_1)) {
                                  return true;
                              }
                      }
              }
              return false;
          }
          ts.isExpression = isExpression;
          function isInstantiatedModule(node, preserveConstEnums) {
              var moduleState = ts.getModuleInstanceState(node);
              return moduleState === 1 ||
                  (preserveConstEnums && moduleState === 2);
          }
          ts.isInstantiatedModule = isInstantiatedModule;
          function isExternalModuleImportEqualsDeclaration(node) {
              return node.kind === 209 && node.moduleReference.kind === 220;
          }
          ts.isExternalModuleImportEqualsDeclaration = isExternalModuleImportEqualsDeclaration;
          function getExternalModuleImportEqualsDeclarationExpression(node) {
              ts.Debug.assert(isExternalModuleImportEqualsDeclaration(node));
              return node.moduleReference.expression;
          }
          ts.getExternalModuleImportEqualsDeclarationExpression = getExternalModuleImportEqualsDeclarationExpression;
          function isInternalModuleImportEqualsDeclaration(node) {
              return node.kind === 209 && node.moduleReference.kind !== 220;
          }
          ts.isInternalModuleImportEqualsDeclaration = isInternalModuleImportEqualsDeclaration;
          function getExternalModuleName(node) {
              if (node.kind === 210) {
                  return node.moduleSpecifier;
              }
              if (node.kind === 209) {
                  var reference = node.moduleReference;
                  if (reference.kind === 220) {
                      return reference.expression;
                  }
              }
              if (node.kind === 216) {
                  return node.moduleSpecifier;
              }
          }
          ts.getExternalModuleName = getExternalModuleName;
          function hasDotDotDotToken(node) {
              return node && node.kind === 130 && node.dotDotDotToken !== undefined;
          }
          ts.hasDotDotDotToken = hasDotDotDotToken;
          function hasQuestionToken(node) {
              if (node) {
                  switch (node.kind) {
                      case 130:
                          return node.questionToken !== undefined;
                      case 135:
                      case 134:
                          return node.questionToken !== undefined;
                      case 226:
                      case 225:
                      case 133:
                      case 132:
                          return node.questionToken !== undefined;
                  }
              }
              return false;
          }
          ts.hasQuestionToken = hasQuestionToken;
          function hasRestParameters(s) {
              return s.parameters.length > 0 && ts.lastOrUndefined(s.parameters).dotDotDotToken !== undefined;
          }
          ts.hasRestParameters = hasRestParameters;
          function isLiteralKind(kind) {
              return 7 <= kind && kind <= 10;
          }
          ts.isLiteralKind = isLiteralKind;
          function isTextualLiteralKind(kind) {
              return kind === 8 || kind === 10;
          }
          ts.isTextualLiteralKind = isTextualLiteralKind;
          function isTemplateLiteralKind(kind) {
              return 10 <= kind && kind <= 13;
          }
          ts.isTemplateLiteralKind = isTemplateLiteralKind;
          function isBindingPattern(node) {
              return !!node && (node.kind === 152 || node.kind === 151);
          }
          ts.isBindingPattern = isBindingPattern;
          function isInAmbientContext(node) {
              while (node) {
                  if (node.flags & (2 | 2048)) {
                      return true;
                  }
                  node = node.parent;
              }
              return false;
          }
          ts.isInAmbientContext = isInAmbientContext;
          function isDeclaration(node) {
              switch (node.kind) {
                  case 164:
                  case 153:
                  case 202:
                  case 136:
                  case 205:
                  case 227:
                  case 218:
                  case 201:
                  case 163:
                  case 137:
                  case 211:
                  case 209:
                  case 214:
                  case 203:
                  case 135:
                  case 134:
                  case 206:
                  case 212:
                  case 130:
                  case 225:
                  case 133:
                  case 132:
                  case 138:
                  case 226:
                  case 204:
                  case 129:
                  case 199:
                      return true;
              }
              return false;
          }
          ts.isDeclaration = isDeclaration;
          function isStatement(n) {
              switch (n.kind) {
                  case 191:
                  case 190:
                  case 198:
                  case 185:
                  case 183:
                  case 182:
                  case 188:
                  case 189:
                  case 187:
                  case 184:
                  case 195:
                  case 192:
                  case 194:
                  case 94:
                  case 197:
                  case 181:
                  case 186:
                  case 193:
                  case 215:
                      return true;
                  default:
                      return false;
              }
          }
          ts.isStatement = isStatement;
          function isClassElement(n) {
              switch (n.kind) {
                  case 136:
                  case 133:
                  case 135:
                  case 137:
                  case 138:
                  case 134:
                  case 141:
                      return true;
                  default:
                      return false;
              }
          }
          ts.isClassElement = isClassElement;
          function isDeclarationName(name) {
              if (name.kind !== 65 && name.kind !== 8 && name.kind !== 7) {
                  return false;
              }
              var parent = name.parent;
              if (parent.kind === 214 || parent.kind === 218) {
                  if (parent.propertyName) {
                      return true;
                  }
              }
              if (isDeclaration(parent)) {
                  return parent.name === name;
              }
              return false;
          }
          ts.isDeclarationName = isDeclarationName;
          function isAliasSymbolDeclaration(node) {
              return node.kind === 209 ||
                  node.kind === 211 && !!node.name ||
                  node.kind === 212 ||
                  node.kind === 214 ||
                  node.kind === 218 ||
                  node.kind === 215 && node.expression.kind === 65;
          }
          ts.isAliasSymbolDeclaration = isAliasSymbolDeclaration;
          function getClassExtendsHeritageClauseElement(node) {
              var heritageClause = getHeritageClause(node.heritageClauses, 79);
              return heritageClause && heritageClause.types.length > 0 ? heritageClause.types[0] : undefined;
          }
          ts.getClassExtendsHeritageClauseElement = getClassExtendsHeritageClauseElement;
          function getClassImplementsHeritageClauseElements(node) {
              var heritageClause = getHeritageClause(node.heritageClauses, 102);
              return heritageClause ? heritageClause.types : undefined;
          }
          ts.getClassImplementsHeritageClauseElements = getClassImplementsHeritageClauseElements;
          function getInterfaceBaseTypeNodes(node) {
              var heritageClause = getHeritageClause(node.heritageClauses, 79);
              return heritageClause ? heritageClause.types : undefined;
          }
          ts.getInterfaceBaseTypeNodes = getInterfaceBaseTypeNodes;
          function getHeritageClause(clauses, kind) {
              if (clauses) {
                  for (var _i = 0; _i < clauses.length; _i++) {
                      var clause = clauses[_i];
                      if (clause.token === kind) {
                          return clause;
                      }
                  }
              }
              return undefined;
          }
          ts.getHeritageClause = getHeritageClause;
          function tryResolveScriptReference(host, sourceFile, reference) {
              if (!host.getCompilerOptions().noResolve) {
                  var referenceFileName = ts.isRootedDiskPath(reference.fileName) ? reference.fileName : ts.combinePaths(ts.getDirectoryPath(sourceFile.fileName), reference.fileName);
                  referenceFileName = ts.getNormalizedAbsolutePath(referenceFileName, host.getCurrentDirectory());
                  return host.getSourceFile(referenceFileName);
              }
          }
          ts.tryResolveScriptReference = tryResolveScriptReference;
          function getAncestor(node, kind) {
              while (node) {
                  if (node.kind === kind) {
                      return node;
                  }
                  node = node.parent;
              }
              return undefined;
          }
          ts.getAncestor = getAncestor;
          function getFileReferenceFromReferencePath(comment, commentRange) {
              var simpleReferenceRegEx = /^\/\/\/\s*<reference\s+/gim;
              var isNoDefaultLibRegEx = /^(\/\/\/\s*<reference\s+no-default-lib\s*=\s*)('|")(.+?)\2\s*\/>/gim;
              if (simpleReferenceRegEx.exec(comment)) {
                  if (isNoDefaultLibRegEx.exec(comment)) {
                      return {
                          isNoDefaultLib: true
                      };
                  }
                  else {
                      var matchResult = ts.fullTripleSlashReferencePathRegEx.exec(comment);
                      if (matchResult) {
                          var start = commentRange.pos;
                          var end = commentRange.end;
                          return {
                              fileReference: {
                                  pos: start,
                                  end: end,
                                  fileName: matchResult[3]
                              },
                              isNoDefaultLib: false
                          };
                      }
                      else {
                          return {
                              diagnosticMessage: ts.Diagnostics.Invalid_reference_directive_syntax,
                              isNoDefaultLib: false
                          };
                      }
                  }
              }
              return undefined;
          }
          ts.getFileReferenceFromReferencePath = getFileReferenceFromReferencePath;
          function isKeyword(token) {
              return 66 <= token && token <= 126;
          }
          ts.isKeyword = isKeyword;
          function isTrivia(token) {
              return 2 <= token && token <= 6;
          }
          ts.isTrivia = isTrivia;
          function hasDynamicName(declaration) {
              return declaration.name &&
                  declaration.name.kind === 128 &&
                  !isWellKnownSymbolSyntactically(declaration.name.expression);
          }
          ts.hasDynamicName = hasDynamicName;
          function isWellKnownSymbolSyntactically(node) {
              return node.kind === 156 && isESSymbolIdentifier(node.expression);
          }
          ts.isWellKnownSymbolSyntactically = isWellKnownSymbolSyntactically;
          function getPropertyNameForPropertyNameNode(name) {
              if (name.kind === 65 || name.kind === 8 || name.kind === 7) {
                  return name.text;
              }
              if (name.kind === 128) {
                  var nameExpression = name.expression;
                  if (isWellKnownSymbolSyntactically(nameExpression)) {
                      var rightHandSideName = nameExpression.name.text;
                      return getPropertyNameForKnownSymbolName(rightHandSideName);
                  }
              }
              return undefined;
          }
          ts.getPropertyNameForPropertyNameNode = getPropertyNameForPropertyNameNode;
          function getPropertyNameForKnownSymbolName(symbolName) {
              return "__@" + symbolName;
          }
          ts.getPropertyNameForKnownSymbolName = getPropertyNameForKnownSymbolName;
          function isESSymbolIdentifier(node) {
              return node.kind === 65 && node.text === "Symbol";
          }
          ts.isESSymbolIdentifier = isESSymbolIdentifier;
          function isModifier(token) {
              switch (token) {
                  case 108:
                  case 106:
                  case 107:
                  case 109:
                  case 78:
                  case 115:
                  case 70:
                  case 73:
                      return true;
              }
              return false;
          }
          ts.isModifier = isModifier;
          function isParameterDeclaration(node) {
              var root = getRootDeclaration(node);
              return root.kind === 130;
          }
          ts.isParameterDeclaration = isParameterDeclaration;
          function getRootDeclaration(node) {
              while (node.kind === 153) {
                  node = node.parent.parent;
              }
              return node;
          }
          ts.getRootDeclaration = getRootDeclaration;
          function nodeStartsNewLexicalEnvironment(n) {
              return isFunctionLike(n) || n.kind === 206 || n.kind === 228;
          }
          ts.nodeStartsNewLexicalEnvironment = nodeStartsNewLexicalEnvironment;
          function nodeIsSynthesized(node) {
              return node.pos === -1;
          }
          ts.nodeIsSynthesized = nodeIsSynthesized;
          function createSynthesizedNode(kind, startsOnNewLine) {
              var node = ts.createNode(kind);
              node.pos = -1;
              node.end = -1;
              node.startsOnNewLine = startsOnNewLine;
              return node;
          }
          ts.createSynthesizedNode = createSynthesizedNode;
          function createSynthesizedNodeArray() {
              var array = [];
              array.pos = -1;
              array.end = -1;
              return array;
          }
          ts.createSynthesizedNodeArray = createSynthesizedNodeArray;
          function createDiagnosticCollection() {
              var nonFileDiagnostics = [];
              var fileDiagnostics = {};
              var diagnosticsModified = false;
              var modificationCount = 0;
              return {
                  add: add,
                  getGlobalDiagnostics: getGlobalDiagnostics,
                  getDiagnostics: getDiagnostics,
                  getModificationCount: getModificationCount
              };
              function getModificationCount() {
                  return modificationCount;
              }
              function add(diagnostic) {
                  var diagnostics;
                  if (diagnostic.file) {
                      diagnostics = fileDiagnostics[diagnostic.file.fileName];
                      if (!diagnostics) {
                          diagnostics = [];
                          fileDiagnostics[diagnostic.file.fileName] = diagnostics;
                      }
                  }
                  else {
                      diagnostics = nonFileDiagnostics;
                  }
                  diagnostics.push(diagnostic);
                  diagnosticsModified = true;
                  modificationCount++;
              }
              function getGlobalDiagnostics() {
                  sortAndDeduplicate();
                  return nonFileDiagnostics;
              }
              function getDiagnostics(fileName) {
                  sortAndDeduplicate();
                  if (fileName) {
                      return fileDiagnostics[fileName] || [];
                  }
                  var allDiagnostics = [];
                  function pushDiagnostic(d) {
                      allDiagnostics.push(d);
                  }
                  ts.forEach(nonFileDiagnostics, pushDiagnostic);
                  for (var key in fileDiagnostics) {
                      if (ts.hasProperty(fileDiagnostics, key)) {
                          ts.forEach(fileDiagnostics[key], pushDiagnostic);
                      }
                  }
                  return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
              }
              function sortAndDeduplicate() {
                  if (!diagnosticsModified) {
                      return;
                  }
                  diagnosticsModified = false;
                  nonFileDiagnostics = ts.sortAndDeduplicateDiagnostics(nonFileDiagnostics);
                  for (var key in fileDiagnostics) {
                      if (ts.hasProperty(fileDiagnostics, key)) {
                          fileDiagnostics[key] = ts.sortAndDeduplicateDiagnostics(fileDiagnostics[key]);
                      }
                  }
              }
          }
          ts.createDiagnosticCollection = createDiagnosticCollection;
          var escapedCharsRegExp = /[\\\"\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
          var escapedCharsMap = {
              "\0": "\\0",
              "\t": "\\t",
              "\v": "\\v",
              "\f": "\\f",
              "\b": "\\b",
              "\r": "\\r",
              "\n": "\\n",
              "\\": "\\\\",
              "\"": "\\\"",
              "\u2028": "\\u2028",
              "\u2029": "\\u2029",
              "\u0085": "\\u0085"
          };
          function escapeString(s) {
              s = escapedCharsRegExp.test(s) ? s.replace(escapedCharsRegExp, getReplacement) : s;
              return s;
              function getReplacement(c) {
                  return escapedCharsMap[c] || get16BitUnicodeEscapeSequence(c.charCodeAt(0));
              }
          }
          ts.escapeString = escapeString;
          function get16BitUnicodeEscapeSequence(charCode) {
              var hexCharCode = charCode.toString(16).toUpperCase();
              var paddedHexCode = ("0000" + hexCharCode).slice(-4);
              return "\\u" + paddedHexCode;
          }
          var nonAsciiCharacters = /[^\u0000-\u007F]/g;
          function escapeNonAsciiCharacters(s) {
              return nonAsciiCharacters.test(s) ?
                  s.replace(nonAsciiCharacters, function (c) { return get16BitUnicodeEscapeSequence(c.charCodeAt(0)); }) :
                  s;
          }
          ts.escapeNonAsciiCharacters = escapeNonAsciiCharacters;
          var indentStrings = ["", "    "];
          function getIndentString(level) {
              if (indentStrings[level] === undefined) {
                  indentStrings[level] = getIndentString(level - 1) + indentStrings[1];
              }
              return indentStrings[level];
          }
          ts.getIndentString = getIndentString;
          function getIndentSize() {
              return indentStrings[1].length;
          }
          ts.getIndentSize = getIndentSize;
          function createTextWriter(newLine) {
              var output = "";
              var indent = 0;
              var lineStart = true;
              var lineCount = 0;
              var linePos = 0;
              function write(s) {
                  if (s && s.length) {
                      if (lineStart) {
                          output += getIndentString(indent);
                          lineStart = false;
                      }
                      output += s;
                  }
              }
              function rawWrite(s) {
                  if (s !== undefined) {
                      if (lineStart) {
                          lineStart = false;
                      }
                      output += s;
                  }
              }
              function writeLiteral(s) {
                  if (s && s.length) {
                      write(s);
                      var lineStartsOfS = ts.computeLineStarts(s);
                      if (lineStartsOfS.length > 1) {
                          lineCount = lineCount + lineStartsOfS.length - 1;
                          linePos = output.length - s.length + ts.lastOrUndefined(lineStartsOfS);
                      }
                  }
              }
              function writeLine() {
                  if (!lineStart) {
                      output += newLine;
                      lineCount++;
                      linePos = output.length;
                      lineStart = true;
                  }
              }
              function writeTextOfNode(sourceFile, node) {
                  write(getSourceTextOfNodeFromSourceFile(sourceFile, node));
              }
              return {
                  write: write,
                  rawWrite: rawWrite,
                  writeTextOfNode: writeTextOfNode,
                  writeLiteral: writeLiteral,
                  writeLine: writeLine,
                  increaseIndent: function () { return indent++; },
                  decreaseIndent: function () { return indent--; },
                  getIndent: function () { return indent; },
                  getTextPos: function () { return output.length; },
                  getLine: function () { return lineCount + 1; },
                  getColumn: function () { return lineStart ? indent * getIndentSize() + 1 : output.length - linePos + 1; },
                  getText: function () { return output; }
              };
          }
          ts.createTextWriter = createTextWriter;
          function getOwnEmitOutputFilePath(sourceFile, host, extension) {
              var compilerOptions = host.getCompilerOptions();
              var emitOutputFilePathWithoutExtension;
              if (compilerOptions.outDir) {
                  emitOutputFilePathWithoutExtension = ts.removeFileExtension(getSourceFilePathInNewDir(sourceFile, host, compilerOptions.outDir));
              }
              else {
                  emitOutputFilePathWithoutExtension = ts.removeFileExtension(sourceFile.fileName);
              }
              return emitOutputFilePathWithoutExtension + extension;
          }
          ts.getOwnEmitOutputFilePath = getOwnEmitOutputFilePath;
          function getSourceFilePathInNewDir(sourceFile, host, newDirPath) {
              var sourceFilePath = ts.getNormalizedAbsolutePath(sourceFile.fileName, host.getCurrentDirectory());
              sourceFilePath = sourceFilePath.replace(host.getCommonSourceDirectory(), "");
              return ts.combinePaths(newDirPath, sourceFilePath);
          }
          ts.getSourceFilePathInNewDir = getSourceFilePathInNewDir;
          function writeFile(host, diagnostics, fileName, data, writeByteOrderMark) {
              host.writeFile(fileName, data, writeByteOrderMark, function (hostErrorMessage) {
                  diagnostics.push(ts.createCompilerDiagnostic(ts.Diagnostics.Could_not_write_file_0_Colon_1, fileName, hostErrorMessage));
              });
          }
          ts.writeFile = writeFile;
          function getLineOfLocalPosition(currentSourceFile, pos) {
              return ts.getLineAndCharacterOfPosition(currentSourceFile, pos).line;
          }
          ts.getLineOfLocalPosition = getLineOfLocalPosition;
          function getFirstConstructorWithBody(node) {
              return ts.forEach(node.members, function (member) {
                  if (member.kind === 136 && nodeIsPresent(member.body)) {
                      return member;
                  }
              });
          }
          ts.getFirstConstructorWithBody = getFirstConstructorWithBody;
          function shouldEmitToOwnFile(sourceFile, compilerOptions) {
              if (!isDeclarationFile(sourceFile)) {
                  if ((isExternalModule(sourceFile) || !compilerOptions.out)) {
                      return compilerOptions.separateCompilation || !ts.fileExtensionIs(sourceFile.fileName, ".js");
                  }
                  return false;
              }
              return false;
          }
          ts.shouldEmitToOwnFile = shouldEmitToOwnFile;
          function getAllAccessorDeclarations(declarations, accessor) {
              var firstAccessor;
              var secondAccessor;
              var getAccessor;
              var setAccessor;
              if (hasDynamicName(accessor)) {
                  firstAccessor = accessor;
                  if (accessor.kind === 137) {
                      getAccessor = accessor;
                  }
                  else if (accessor.kind === 138) {
                      setAccessor = accessor;
                  }
                  else {
                      ts.Debug.fail("Accessor has wrong kind");
                  }
              }
              else {
                  ts.forEach(declarations, function (member) {
                      if ((member.kind === 137 || member.kind === 138)
                          && (member.flags & 128) === (accessor.flags & 128)) {
                          var memberName = getPropertyNameForPropertyNameNode(member.name);
                          var accessorName = getPropertyNameForPropertyNameNode(accessor.name);
                          if (memberName === accessorName) {
                              if (!firstAccessor) {
                                  firstAccessor = member;
                              }
                              else if (!secondAccessor) {
                                  secondAccessor = member;
                              }
                              if (member.kind === 137 && !getAccessor) {
                                  getAccessor = member;
                              }
                              if (member.kind === 138 && !setAccessor) {
                                  setAccessor = member;
                              }
                          }
                      }
                  });
              }
              return {
                  firstAccessor: firstAccessor,
                  secondAccessor: secondAccessor,
                  getAccessor: getAccessor,
                  setAccessor: setAccessor
              };
          }
          ts.getAllAccessorDeclarations = getAllAccessorDeclarations;
          function emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments) {
              if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos &&
                  getLineOfLocalPosition(currentSourceFile, node.pos) !== getLineOfLocalPosition(currentSourceFile, leadingComments[0].pos)) {
                  writer.writeLine();
              }
          }
          ts.emitNewLineBeforeLeadingComments = emitNewLineBeforeLeadingComments;
          function emitComments(currentSourceFile, writer, comments, trailingSeparator, newLine, writeComment) {
              var emitLeadingSpace = !trailingSeparator;
              ts.forEach(comments, function (comment) {
                  if (emitLeadingSpace) {
                      writer.write(" ");
                      emitLeadingSpace = false;
                  }
                  writeComment(currentSourceFile, writer, comment, newLine);
                  if (comment.hasTrailingNewLine) {
                      writer.writeLine();
                  }
                  else if (trailingSeparator) {
                      writer.write(" ");
                  }
                  else {
                      emitLeadingSpace = true;
                  }
              });
          }
          ts.emitComments = emitComments;
          function writeCommentRange(currentSourceFile, writer, comment, newLine) {
              if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42) {
                  var firstCommentLineAndCharacter = ts.getLineAndCharacterOfPosition(currentSourceFile, comment.pos);
                  var lineCount = ts.getLineStarts(currentSourceFile).length;
                  var firstCommentLineIndent;
                  for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) {
                      var nextLineStart = (currentLine + 1) === lineCount
                          ? currentSourceFile.text.length + 1
                          : getStartPositionOfLine(currentLine + 1, currentSourceFile);
                      if (pos !== comment.pos) {
                          if (firstCommentLineIndent === undefined) {
                              firstCommentLineIndent = calculateIndent(getStartPositionOfLine(firstCommentLineAndCharacter.line, currentSourceFile), comment.pos);
                          }
                          var currentWriterIndentSpacing = writer.getIndent() * getIndentSize();
                          var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(pos, nextLineStart);
                          if (spacesToEmit > 0) {
                              var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize();
                              var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize());
                              writer.rawWrite(indentSizeSpaceString);
                              while (numberOfSingleSpacesToEmit) {
                                  writer.rawWrite(" ");
                                  numberOfSingleSpacesToEmit--;
                              }
                          }
                          else {
                              writer.rawWrite("");
                          }
                      }
                      writeTrimmedCurrentLine(pos, nextLineStart);
                      pos = nextLineStart;
                  }
              }
              else {
                  writer.write(currentSourceFile.text.substring(comment.pos, comment.end));
              }
              function writeTrimmedCurrentLine(pos, nextLineStart) {
                  var end = Math.min(comment.end, nextLineStart - 1);
                  var currentLineText = currentSourceFile.text.substring(pos, end).replace(/^\s+|\s+$/g, '');
                  if (currentLineText) {
                      writer.write(currentLineText);
                      if (end !== comment.end) {
                          writer.writeLine();
                      }
                  }
                  else {
                      writer.writeLiteral(newLine);
                  }
              }
              function calculateIndent(pos, end) {
                  var currentLineIndent = 0;
                  for (; pos < end && ts.isWhiteSpace(currentSourceFile.text.charCodeAt(pos)); pos++) {
                      if (currentSourceFile.text.charCodeAt(pos) === 9) {
                          currentLineIndent += getIndentSize() - (currentLineIndent % getIndentSize());
                      }
                      else {
                          currentLineIndent++;
                      }
                  }
                  return currentLineIndent;
              }
          }
          ts.writeCommentRange = writeCommentRange;
          function modifierToFlag(token) {
              switch (token) {
                  case 109: return 128;
                  case 108: return 16;
                  case 107: return 64;
                  case 106: return 32;
                  case 78: return 1;
                  case 115: return 2;
                  case 70: return 8192;
                  case 73: return 256;
              }
              return 0;
          }
          ts.modifierToFlag = modifierToFlag;
          function isLeftHandSideExpression(expr) {
              if (expr) {
                  switch (expr.kind) {
                      case 156:
                      case 157:
                      case 159:
                      case 158:
                      case 160:
                      case 154:
                      case 162:
                      case 155:
                      case 175:
                      case 163:
                      case 65:
                      case 9:
                      case 7:
                      case 8:
                      case 10:
                      case 172:
                      case 80:
                      case 89:
                      case 93:
                      case 95:
                      case 91:
                          return true;
                  }
              }
              return false;
          }
          ts.isLeftHandSideExpression = isLeftHandSideExpression;
          function isAssignmentOperator(token) {
              return token >= 53 && token <= 64;
          }
          ts.isAssignmentOperator = isAssignmentOperator;
          function isSupportedExpressionWithTypeArguments(node) {
              return isSupportedExpressionWithTypeArgumentsRest(node.expression);
          }
          ts.isSupportedExpressionWithTypeArguments = isSupportedExpressionWithTypeArguments;
          function isSupportedExpressionWithTypeArgumentsRest(node) {
              if (node.kind === 65) {
                  return true;
              }
              else if (node.kind === 156) {
                  return isSupportedExpressionWithTypeArgumentsRest(node.expression);
              }
              else {
                  return false;
              }
          }
          function isRightSideOfQualifiedNameOrPropertyAccess(node) {
              return (node.parent.kind === 127 && node.parent.right === node) ||
                  (node.parent.kind === 156 && node.parent.name === node);
          }
          ts.isRightSideOfQualifiedNameOrPropertyAccess = isRightSideOfQualifiedNameOrPropertyAccess;
          function getLocalSymbolForExportDefault(symbol) {
              return symbol && symbol.valueDeclaration && (symbol.valueDeclaration.flags & 256) ? symbol.valueDeclaration.localSymbol : undefined;
          }
          ts.getLocalSymbolForExportDefault = getLocalSymbolForExportDefault;
          function getExpandedCharCodes(input) {
              var output = [];
              var length = input.length;
              var leadSurrogate = undefined;
              for (var i = 0; i < length; i++) {
                  var charCode = input.charCodeAt(i);
                  if (charCode < 0x80) {
                      output.push(charCode);
                  }
                  else if (charCode < 0x800) {
                      output.push((charCode >> 6) | 192);
                      output.push((charCode & 63) | 128);
                  }
                  else if (charCode < 0x10000) {
                      output.push((charCode >> 12) | 224);
                      output.push(((charCode >> 6) & 63) | 128);
                      output.push((charCode & 63) | 128);
                  }
                  else if (charCode < 0x20000) {
                      output.push((charCode >> 18) | 240);
                      output.push(((charCode >> 12) & 63) | 128);
                      output.push(((charCode >> 6) & 63) | 128);
                      output.push((charCode & 63) | 128);
                  }
                  else {
                      ts.Debug.assert(false, "Unexpected code point");
                  }
              }
              return output;
          }
          var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
          function convertToBase64(input) {
              var result = "";
              var charCodes = getExpandedCharCodes(input);
              var i = 0;
              var length = charCodes.length;
              var byte1, byte2, byte3, byte4;
              while (i < length) {
                  byte1 = charCodes[i] >> 2;
                  byte2 = (charCodes[i] & 3) << 4 | charCodes[i + 1] >> 4;
                  byte3 = (charCodes[i + 1] & 15) << 2 | charCodes[i + 2] >> 6;
                  byte4 = charCodes[i + 2] & 63;
                  if (i + 1 >= length) {
                      byte3 = byte4 = 64;
                  }
                  else if (i + 2 >= length) {
                      byte4 = 64;
                  }
                  result += base64Digits.charAt(byte1) + base64Digits.charAt(byte2) + base64Digits.charAt(byte3) + base64Digits.charAt(byte4);
                  i += 3;
              }
              return result;
          }
          ts.convertToBase64 = convertToBase64;
      })(ts || (ts = {}));
      var ts;
      (function (ts) {
          function getDefaultLibFileName(options) {
              return options.target === 2 ? "lib.es6.d.ts" : "lib.d.ts";
          }
          ts.getDefaultLibFileName = getDefaultLibFileName;
          function textSpanEnd(span) {
              return span.start + span.length;
          }
          ts.textSpanEnd = textSpanEnd;
          function textSpanIsEmpty(span) {
              return span.length === 0;
          }
          ts.textSpanIsEmpty = textSpanIsEmpty;
          function textSpanContainsPosition(span, position) {
              return position >= span.start && position < textSpanEnd(span);
          }
          ts.textSpanContainsPosition = textSpanContainsPosition;
          function textSpanContainsTextSpan(span, other) {
              return other.start >= span.start && textSpanEnd(other) <= textSpanEnd(span);
          }
          ts.textSpanContainsTextSpan = textSpanContainsTextSpan;
          function textSpanOverlapsWith(span, other) {
              var overlapStart = Math.max(span.start, other.start);
              var overlapEnd = Math.min(textSpanEnd(span), textSpanEnd(other));
              return overlapStart < overlapEnd;
          }
          ts.textSpanOverlapsWith = textSpanOverlapsWith;
          function textSpanOverlap(span1, span2) {
              var overlapStart = Math.max(span1.start, span2.start);
              var overlapEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
              if (overlapStart < overlapEnd) {
                  return createTextSpanFromBounds(overlapStart, overlapEnd);
              }
              return undefined;
          }
          ts.textSpanOverlap = textSpanOverlap;
          function textSpanIntersectsWithTextSpan(span, other) {
              return other.start <= textSpanEnd(span) && textSpanEnd(other) >= span.start;
          }
          ts.textSpanIntersectsWithTextSpan = textSpanIntersectsWithTextSpan;
          function textSpanIntersectsWith(span, start, length) {
              var end = start + length;
              return start <= textSpanEnd(span) && end >= span.start;
          }
          ts.textSpanIntersectsWith = textSpanIntersectsWith;
          function textSpanIntersectsWithPosition(span, position) {
              return position <= textSpanEnd(span) && position >= span.start;
          }
          ts.textSpanIntersectsWithPosition = textSpanIntersectsWithPosition;
          function textSpanIntersection(span1, span2) {
              var intersectStart = Math.max(span1.start, span2.start);
              var intersectEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
              if (intersectStart <= intersectEnd) {
                  return createTextSpanFromBounds(intersectStart, intersectEnd);
              }
              return undefined;
          }
          ts.textSpanIntersection = textSpanIntersection;
          function createTextSpan(start, length) {
              if (start < 0) {
                  throw new Error("start < 0");
              }
              if (length < 0) {
                  throw new Error("length < 0");
              }
              return { start: start, length: length };
          }
          ts.createTextSpan = createTextSpan;
          function createTextSpanFromBounds(start, end) {
              return createTextSpan(start, end - start);
          }
          ts.createTextSpanFromBounds = createTextSpanFromBounds;
          function textChangeRangeNewSpan(range) {
              return createTextSpan(range.span.start, range.newLength);
          }
          ts.textChangeRangeNewSpan = textChangeRangeNewSpan;
          function textChangeRangeIsUnchanged(range) {
              return textSpanIsEmpty(range.span) && range.newLength === 0;
          }
          ts.textChangeRangeIsUnchanged = textChangeRangeIsUnchanged;
          function createTextChangeRange(span, newLength) {
              if (newLength < 0) {
                  throw new Error("newLength < 0");
              }
              return { span: span, newLength: newLength };
          }
          ts.createTextChangeRange = createTextChangeRange;
          ts.unchangedTextChangeRange = createTextChangeRange(createTextSpan(0, 0), 0);
          function collapseTextChangeRangesAcrossMultipleVersions(changes) {
              if (changes.length === 0) {
                  return ts.unchangedTextChangeRange;
              }
              if (changes.length === 1) {
                  return changes[0];
              }
              var change0 = changes[0];
              var oldStartN = change0.span.start;
              var oldEndN = textSpanEnd(change0.span);
              var newEndN = oldStartN + change0.newLength;
              for (var i = 1; i < changes.length; i++) {
                  var nextChange = changes[i];
                  var oldStart1 = oldStartN;
                  var oldEnd1 = oldEndN;
                  var newEnd1 = newEndN;
                  var oldStart2 = nextChange.span.start;
                  var oldEnd2 = textSpanEnd(nextChange.span);
                  var newEnd2 = oldStart2 + nextChange.newLength;
                  oldStartN = Math.min(oldStart1, oldStart2);
                  oldEndN = Math.max(oldEnd1, oldEnd1 + (oldEnd2 - newEnd1));
                  newEndN = Math.max(newEnd2, newEnd2 + (newEnd1 - oldEnd2));
              }
              return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), newEndN - oldStartN);
          }
          ts.collapseTextChangeRangesAcrossMultipleVersions = collapseTextChangeRangesAcrossMultipleVersions;
      })(ts || (ts = {}));
      /// <reference path="scanner.ts"/>
      /// <reference path="utilities.ts"/>
      var ts;
      (function (ts) {
          var nodeConstructors = new Array(230);
          ts.parseTime = 0;
          function getNodeConstructor(kind) {
              return nodeConstructors[kind] || (nodeConstructors[kind] = ts.objectAllocator.getNodeConstructor(kind));
          }
          ts.getNodeConstructor = getNodeConstructor;
          function createNode(kind) {
              return new (getNodeConstructor(kind))();
          }
          ts.createNode = createNode;
          function visitNode(cbNode, node) {
              if (node) {
                  return cbNode(node);
              }
          }
          function visitNodeArray(cbNodes, nodes) {
              if (nodes) {
                  return cbNodes(nodes);
              }
          }
          function visitEachNode(cbNode, nodes) {
              if (nodes) {
                  for (var _i = 0; _i < nodes.length; _i++) {
                      var node = nodes[_i];
                      var result = cbNode(node);
                      if (result) {
                          return result;
                      }
                  }
              }
          }
          function forEachChild(node, cbNode, cbNodeArray) {
              if (!node) {
                  return;
              }
              var visitNodes = cbNodeArray ? visitNodeArray : visitEachNode;
              var cbNodes = cbNodeArray || cbNode;
              switch (node.kind) {
                  case 127:
                      return visitNode(cbNode, node.left) ||
                          visitNode(cbNode, node.right);
                  case 129:
                      return visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.constraint) ||
                          visitNode(cbNode, node.expression);
                  case 130:
                  case 133:
                  case 132:
                  case 225:
                  case 226:
                  case 199:
                  case 153:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.propertyName) ||
                          visitNode(cbNode, node.dotDotDotToken) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.questionToken) ||
                          visitNode(cbNode, node.type) ||
                          visitNode(cbNode, node.initializer);
                  case 143:
                  case 144:
                  case 139:
                  case 140:
                  case 141:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.parameters) ||
                          visitNode(cbNode, node.type);
                  case 135:
                  case 134:
                  case 136:
                  case 137:
                  case 138:
                  case 163:
                  case 201:
                  case 164:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.asteriskToken) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.questionToken) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.parameters) ||
                          visitNode(cbNode, node.type) ||
                          visitNode(cbNode, node.equalsGreaterThanToken) ||
                          visitNode(cbNode, node.body);
                  case 142:
                      return visitNode(cbNode, node.typeName) ||
                          visitNodes(cbNodes, node.typeArguments);
                  case 145:
                      return visitNode(cbNode, node.exprName);
                  case 146:
                      return visitNodes(cbNodes, node.members);
                  case 147:
                      return visitNode(cbNode, node.elementType);
                  case 148:
                      return visitNodes(cbNodes, node.elementTypes);
                  case 149:
                      return visitNodes(cbNodes, node.types);
                  case 150:
                      return visitNode(cbNode, node.type);
                  case 151:
                  case 152:
                      return visitNodes(cbNodes, node.elements);
                  case 154:
                      return visitNodes(cbNodes, node.elements);
                  case 155:
                      return visitNodes(cbNodes, node.properties);
                  case 156:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.dotToken) ||
                          visitNode(cbNode, node.name);
                  case 157:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.argumentExpression);
                  case 158:
                  case 159:
                      return visitNode(cbNode, node.expression) ||
                          visitNodes(cbNodes, node.typeArguments) ||
                          visitNodes(cbNodes, node.arguments);
                  case 160:
                      return visitNode(cbNode, node.tag) ||
                          visitNode(cbNode, node.template);
                  case 161:
                      return visitNode(cbNode, node.type) ||
                          visitNode(cbNode, node.expression);
                  case 162:
                      return visitNode(cbNode, node.expression);
                  case 165:
                      return visitNode(cbNode, node.expression);
                  case 166:
                      return visitNode(cbNode, node.expression);
                  case 167:
                      return visitNode(cbNode, node.expression);
                  case 168:
                      return visitNode(cbNode, node.operand);
                  case 173:
                      return visitNode(cbNode, node.asteriskToken) ||
                          visitNode(cbNode, node.expression);
                  case 169:
                      return visitNode(cbNode, node.operand);
                  case 170:
                      return visitNode(cbNode, node.left) ||
                          visitNode(cbNode, node.operatorToken) ||
                          visitNode(cbNode, node.right);
                  case 171:
                      return visitNode(cbNode, node.condition) ||
                          visitNode(cbNode, node.questionToken) ||
                          visitNode(cbNode, node.whenTrue) ||
                          visitNode(cbNode, node.colonToken) ||
                          visitNode(cbNode, node.whenFalse);
                  case 174:
                      return visitNode(cbNode, node.expression);
                  case 180:
                  case 207:
                      return visitNodes(cbNodes, node.statements);
                  case 228:
                      return visitNodes(cbNodes, node.statements) ||
                          visitNode(cbNode, node.endOfFileToken);
                  case 181:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.declarationList);
                  case 200:
                      return visitNodes(cbNodes, node.declarations);
                  case 183:
                      return visitNode(cbNode, node.expression);
                  case 184:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.thenStatement) ||
                          visitNode(cbNode, node.elseStatement);
                  case 185:
                      return visitNode(cbNode, node.statement) ||
                          visitNode(cbNode, node.expression);
                  case 186:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 187:
                      return visitNode(cbNode, node.initializer) ||
                          visitNode(cbNode, node.condition) ||
                          visitNode(cbNode, node.incrementor) ||
                          visitNode(cbNode, node.statement);
                  case 188:
                      return visitNode(cbNode, node.initializer) ||
                          visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 189:
                      return visitNode(cbNode, node.initializer) ||
                          visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 190:
                  case 191:
                      return visitNode(cbNode, node.label);
                  case 192:
                      return visitNode(cbNode, node.expression);
                  case 193:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.statement);
                  case 194:
                      return visitNode(cbNode, node.expression) ||
                          visitNode(cbNode, node.caseBlock);
                  case 208:
                      return visitNodes(cbNodes, node.clauses);
                  case 221:
                      return visitNode(cbNode, node.expression) ||
                          visitNodes(cbNodes, node.statements);
                  case 222:
                      return visitNodes(cbNodes, node.statements);
                  case 195:
                      return visitNode(cbNode, node.label) ||
                          visitNode(cbNode, node.statement);
                  case 196:
                      return visitNode(cbNode, node.expression);
                  case 197:
                      return visitNode(cbNode, node.tryBlock) ||
                          visitNode(cbNode, node.catchClause) ||
                          visitNode(cbNode, node.finallyBlock);
                  case 224:
                      return visitNode(cbNode, node.variableDeclaration) ||
                          visitNode(cbNode, node.block);
                  case 131:
                      return visitNode(cbNode, node.expression);
                  case 202:
                  case 175:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.heritageClauses) ||
                          visitNodes(cbNodes, node.members);
                  case 203:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNodes(cbNodes, node.typeParameters) ||
                          visitNodes(cbNodes, node.heritageClauses) ||
                          visitNodes(cbNodes, node.members);
                  case 204:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.type);
                  case 205:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNodes(cbNodes, node.members);
                  case 227:
                      return visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.initializer);
                  case 206:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.body);
                  case 209:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.moduleReference);
                  case 210:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.importClause) ||
                          visitNode(cbNode, node.moduleSpecifier);
                  case 211:
                      return visitNode(cbNode, node.name) ||
                          visitNode(cbNode, node.namedBindings);
                  case 212:
                      return visitNode(cbNode, node.name);
                  case 213:
                  case 217:
                      return visitNodes(cbNodes, node.elements);
                  case 216:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.exportClause) ||
                          visitNode(cbNode, node.moduleSpecifier);
                  case 214:
                  case 218:
                      return visitNode(cbNode, node.propertyName) ||
                          visitNode(cbNode, node.name);
                  case 215:
                      return visitNodes(cbNodes, node.decorators) ||
                          visitNodes(cbNodes, node.modifiers) ||
                          visitNode(cbNode, node.expression);
                  case 172:
                      return visitNode(cbNode, node.head) || visitNodes(cbNodes, node.templateSpans);
                  case 178:
                      return visitNode(cbNode, node.expression) || visitNode(cbNode, node.literal);
                  case 128:
                      return visitNode(cbNode, node.expression);
                  case 223:
                      return visitNodes(cbNodes, node.types);
                  case 177:
                      return visitNode(cbNode, node.expression) ||
                          visitNodes(cbNodes, node.typeArguments);
                  case 220:
                      return visitNode(cbNode, node.expression);
                  case 219:
                      return visitNodes(cbNodes, node.decorators);
              }
          }
          ts.forEachChild = forEachChild;
          function createSourceFile(fileName, sourceText, languageVersion, setParentNodes) {
              if (setParentNodes === void 0) { setParentNodes = false; }
              var start = new Date().getTime();
              var result = Parser.parseSourceFile(fileName, sourceText, languageVersion, undefined, setParentNodes);
              ts.parseTime += new Date().getTime() - start;
              return result;
          }
          ts.createSourceFile = createSourceFile;
          function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
              return IncrementalParser.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
          }
          ts.updateSourceFile = updateSourceFile;
          var Parser;
          (function (Parser) {
              var scanner = ts.createScanner(2, true);
              var disallowInAndDecoratorContext = 2 | 16;
              var sourceFile;
              var syntaxCursor;
              var token;
              var sourceText;
              var nodeCount;
              var identifiers;
              var identifierCount;
              var parsingContext;
              var contextFlags = 0;
              var parseErrorBeforeNextFinishedNode = false;
              function parseSourceFile(fileName, _sourceText, languageVersion, _syntaxCursor, setParentNodes) {
                  sourceText = _sourceText;
                  syntaxCursor = _syntaxCursor;
                  parsingContext = 0;
                  identifiers = {};
                  identifierCount = 0;
                  nodeCount = 0;
                  contextFlags = 0;
                  parseErrorBeforeNextFinishedNode = false;
                  createSourceFile(fileName, languageVersion);
                  scanner.setText(sourceText);
                  scanner.setOnError(scanError);
                  scanner.setScriptTarget(languageVersion);
                  token = nextToken();
                  processReferenceComments(sourceFile);
                  sourceFile.statements = parseList(0, true, parseSourceElement);
                  ts.Debug.assert(token === 1);
                  sourceFile.endOfFileToken = parseTokenNode();
                  setExternalModuleIndicator(sourceFile);
                  sourceFile.nodeCount = nodeCount;
                  sourceFile.identifierCount = identifierCount;
                  sourceFile.identifiers = identifiers;
                  if (setParentNodes) {
                      fixupParentReferences(sourceFile);
                  }
                  syntaxCursor = undefined;
                  scanner.setText("");
                  scanner.setOnError(undefined);
                  var result = sourceFile;
                  sourceFile = undefined;
                  identifiers = undefined;
                  syntaxCursor = undefined;
                  sourceText = undefined;
                  return result;
              }
              Parser.parseSourceFile = parseSourceFile;
              function fixupParentReferences(sourceFile) {
                  // normally parent references are set during binding. However, for clients that only need
                  // a syntax tree, and no semantic features, then the binding process is an unnecessary
                  // overhead.  This functions allows us to set all the parents, without all the expense of
                  // binding.
                  var parent = sourceFile;
                  forEachChild(sourceFile, visitNode);
                  return;
                  function visitNode(n) {
                      if (n.parent !== parent) {
                          n.parent = parent;
                          var saveParent = parent;
                          parent = n;
                          forEachChild(n, visitNode);
                          parent = saveParent;
                      }
                  }
              }
              function createSourceFile(fileName, languageVersion) {
                  sourceFile = createNode(228, 0);
                  sourceFile.pos = 0;
                  sourceFile.end = sourceText.length;
                  sourceFile.text = sourceText;
                  sourceFile.parseDiagnostics = [];
                  sourceFile.bindDiagnostics = [];
                  sourceFile.languageVersion = languageVersion;
                  sourceFile.fileName = ts.normalizePath(fileName);
                  sourceFile.flags = ts.fileExtensionIs(sourceFile.fileName, ".d.ts") ? 2048 : 0;
              }
              function setContextFlag(val, flag) {
                  if (val) {
                      contextFlags |= flag;
                  }
                  else {
                      contextFlags &= ~flag;
                  }
              }
              function setStrictModeContext(val) {
                  setContextFlag(val, 1);
              }
              function setDisallowInContext(val) {
                  setContextFlag(val, 2);
              }
              function setYieldContext(val) {
                  setContextFlag(val, 4);
              }
              function setGeneratorParameterContext(val) {
                  setContextFlag(val, 8);
              }
              function setDecoratorContext(val) {
                  setContextFlag(val, 16);
              }
              function doOutsideOfContext(flags, func) {
                  var currentContextFlags = contextFlags & flags;
                  if (currentContextFlags) {
                      setContextFlag(false, currentContextFlags);
                      var result = func();
                      setContextFlag(true, currentContextFlags);
                      return result;
                  }
                  return func();
              }
              function allowInAnd(func) {
                  if (contextFlags & 2) {
                      setDisallowInContext(false);
                      var result = func();
                      setDisallowInContext(true);
                      return result;
                  }
                  return func();
              }
              function disallowInAnd(func) {
                  if (contextFlags & 2) {
                      return func();
                  }
                  setDisallowInContext(true);
                  var result = func();
                  setDisallowInContext(false);
                  return result;
              }
              function doInYieldContext(func) {
                  if (contextFlags & 4) {
                      return func();
                  }
                  setYieldContext(true);
                  var result = func();
                  setYieldContext(false);
                  return result;
              }
              function doOutsideOfYieldContext(func) {
                  if (contextFlags & 4) {
                      setYieldContext(false);
                      var result = func();
                      setYieldContext(true);
                      return result;
                  }
                  return func();
              }
              function doInDecoratorContext(func) {
                  if (contextFlags & 16) {
                      return func();
                  }
                  setDecoratorContext(true);
                  var result = func();
                  setDecoratorContext(false);
                  return result;
              }
              function inYieldContext() {
                  return (contextFlags & 4) !== 0;
              }
              function inStrictModeContext() {
                  return (contextFlags & 1) !== 0;
              }
              function inGeneratorParameterContext() {
                  return (contextFlags & 8) !== 0;
              }
              function inDisallowInContext() {
                  return (contextFlags & 2) !== 0;
              }
              function inDecoratorContext() {
                  return (contextFlags & 16) !== 0;
              }
              function parseErrorAtCurrentToken(message, arg0) {
                  var start = scanner.getTokenPos();
                  var length = scanner.getTextPos() - start;
                  parseErrorAtPosition(start, length, message, arg0);
              }
              function parseErrorAtPosition(start, length, message, arg0) {
                  var lastError = ts.lastOrUndefined(sourceFile.parseDiagnostics);
                  if (!lastError || start !== lastError.start) {
                      sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, start, length, message, arg0));
                  }
                  parseErrorBeforeNextFinishedNode = true;
              }
              function scanError(message, length) {
                  var pos = scanner.getTextPos();
                  parseErrorAtPosition(pos, length || 0, message);
              }
              function getNodePos() {
                  return scanner.getStartPos();
              }
              function getNodeEnd() {
                  return scanner.getStartPos();
              }
              function nextToken() {
                  return token = scanner.scan();
              }
              function getTokenPos(pos) {
                  return ts.skipTrivia(sourceText, pos);
              }
              function reScanGreaterToken() {
                  return token = scanner.reScanGreaterToken();
              }
              function reScanSlashToken() {
                  return token = scanner.reScanSlashToken();
              }
              function reScanTemplateToken() {
                  return token = scanner.reScanTemplateToken();
              }
              function speculationHelper(callback, isLookAhead) {
                  var saveToken = token;
                  var saveParseDiagnosticsLength = sourceFile.parseDiagnostics.length;
                  var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
                  var saveContextFlags = contextFlags;
                  var result = isLookAhead
                      ? scanner.lookAhead(callback)
                      : scanner.tryScan(callback);
                  ts.Debug.assert(saveContextFlags === contextFlags);
                  if (!result || isLookAhead) {
                      token = saveToken;
                      sourceFile.parseDiagnostics.length = saveParseDiagnosticsLength;
                      parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
                  }
                  return result;
              }
              function lookAhead(callback) {
                  return speculationHelper(callback, true);
              }
              function tryParse(callback) {
                  return speculationHelper(callback, false);
              }
              function isIdentifier() {
                  if (token === 65) {
                      return true;
                  }
                  if (token === 110 && inYieldContext()) {
                      return false;
                  }
                  return token > 101;
              }
              function parseExpected(kind, diagnosticMessage) {
                  if (token === kind) {
                      nextToken();
                      return true;
                  }
                  if (diagnosticMessage) {
                      parseErrorAtCurrentToken(diagnosticMessage);
                  }
                  else {
                      parseErrorAtCurrentToken(ts.Diagnostics._0_expected, ts.tokenToString(kind));
                  }
                  return false;
              }
              function parseOptional(t) {
                  if (token === t) {
                      nextToken();
                      return true;
                  }
                  return false;
              }
              function parseOptionalToken(t) {
                  if (token === t) {
                      return parseTokenNode();
                  }
                  return undefined;
              }
              function parseExpectedToken(t, reportAtCurrentPosition, diagnosticMessage, arg0) {
                  return parseOptionalToken(t) ||
                      createMissingNode(t, reportAtCurrentPosition, diagnosticMessage, arg0);
              }
              function parseTokenNode() {
                  var node = createNode(token);
                  nextToken();
                  return finishNode(node);
              }
              function canParseSemicolon() {
                  if (token === 22) {
                      return true;
                  }
                  return token === 15 || token === 1 || scanner.hasPrecedingLineBreak();
              }
              function parseSemicolon() {
                  if (canParseSemicolon()) {
                      if (token === 22) {
                          nextToken();
                      }
                      return true;
                  }
                  else {
                      return parseExpected(22);
                  }
              }
              function createNode(kind, pos) {
                  nodeCount++;
                  var node = new (nodeConstructors[kind] || (nodeConstructors[kind] = ts.objectAllocator.getNodeConstructor(kind)))();
                  if (!(pos >= 0)) {
                      pos = scanner.getStartPos();
                  }
                  node.pos = pos;
                  node.end = pos;
                  return node;
              }
              function finishNode(node) {
                  node.end = scanner.getStartPos();
                  if (contextFlags) {
                      node.parserContextFlags = contextFlags;
                  }
                  if (parseErrorBeforeNextFinishedNode) {
                      parseErrorBeforeNextFinishedNode = false;
                      node.parserContextFlags |= 32;
                  }
                  return node;
              }
              function createMissingNode(kind, reportAtCurrentPosition, diagnosticMessage, arg0) {
                  if (reportAtCurrentPosition) {
                      parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
                  }
                  else {
                      parseErrorAtCurrentToken(diagnosticMessage, arg0);
                  }
                  var result = createNode(kind, scanner.getStartPos());
                  result.text = "";
                  return finishNode(result);
              }
              function internIdentifier(text) {
                  text = ts.escapeIdentifier(text);
                  return ts.hasProperty(identifiers, text) ? identifiers[text] : (identifiers[text] = text);
              }
              function createIdentifier(isIdentifier, diagnosticMessage) {
                  identifierCount++;
                  if (isIdentifier) {
                      var node = createNode(65);
                      if (token !== 65) {
                          node.originalKeywordKind = token;
                      }
                      node.text = internIdentifier(scanner.getTokenValue());
                      nextToken();
                      return finishNode(node);
                  }
                  return createMissingNode(65, false, diagnosticMessage || ts.Diagnostics.Identifier_expected);
              }
              function parseIdentifier(diagnosticMessage) {
                  return createIdentifier(isIdentifier(), diagnosticMessage);
              }
              function parseIdentifierName() {
                  return createIdentifier(isIdentifierOrKeyword());
              }
              function isLiteralPropertyName() {
                  return isIdentifierOrKeyword() ||
                      token === 8 ||
                      token === 7;
              }
              function parsePropertyName() {
                  if (token === 8 || token === 7) {
                      return parseLiteralNode(true);
                  }
                  if (token === 18) {
                      return parseComputedPropertyName();
                  }
                  return parseIdentifierName();
              }
              function parseComputedPropertyName() {
                  var node = createNode(128);
                  parseExpected(18);
                  var yieldContext = inYieldContext();
                  if (inGeneratorParameterContext()) {
                      setYieldContext(false);
                  }
                  node.expression = allowInAnd(parseExpression);
                  if (inGeneratorParameterContext()) {
                      setYieldContext(yieldContext);
                  }
                  parseExpected(19);
                  return finishNode(node);
              }
              function parseContextualModifier(t) {
                  return token === t && tryParse(nextTokenCanFollowModifier);
              }
              function nextTokenCanFollowModifier() {
                  if (token === 70) {
                      return nextToken() === 77;
                  }
                  if (token === 78) {
                      nextToken();
                      if (token === 73) {
                          return lookAhead(nextTokenIsClassOrFunction);
                      }
                      return token !== 35 && token !== 14 && canFollowModifier();
                  }
                  if (token === 73) {
                      return nextTokenIsClassOrFunction();
                  }
                  nextToken();
                  return canFollowModifier();
              }
              function parseAnyContextualModifier() {
                  return ts.isModifier(token) && tryParse(nextTokenCanFollowModifier);
              }
              function canFollowModifier() {
                  return token === 18
                      || token === 14
                      || token === 35
                      || isLiteralPropertyName();
              }
              function nextTokenIsClassOrFunction() {
                  nextToken();
                  return token === 69 || token === 83;
              }
              function isListElement(parsingContext, inErrorRecovery) {
                  var node = currentNode(parsingContext);
                  if (node) {
                      return true;
                  }
                  switch (parsingContext) {
                      case 0:
                      case 1:
                          return isSourceElement(inErrorRecovery);
                      case 2:
                      case 4:
                          return isStartOfStatement(inErrorRecovery);
                      case 3:
                          return token === 67 || token === 73;
                      case 5:
                          return isStartOfTypeMember();
                      case 6:
                          return lookAhead(isClassMemberStart) || (token === 22 && !inErrorRecovery);
                      case 7:
                          return token === 18 || isLiteralPropertyName();
                      case 13:
                          return token === 18 || token === 35 || isLiteralPropertyName();
                      case 10:
                          return isLiteralPropertyName();
                      case 8:
                          if (token === 14) {
                              return lookAhead(isValidHeritageClauseObjectLiteral);
                          }
                          if (!inErrorRecovery) {
                              return isStartOfLeftHandSideExpression() && !isHeritageClauseExtendsOrImplementsKeyword();
                          }
                          else {
                              return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword();
                          }
                      case 9:
                          return isIdentifierOrPattern();
                      case 11:
                          return token === 23 || token === 21 || isIdentifierOrPattern();
                      case 16:
                          return isIdentifier();
                      case 12:
                      case 14:
                          return token === 23 || token === 21 || isStartOfExpression();
                      case 15:
                          return isStartOfParameter();
                      case 17:
                      case 18:
                          return token === 23 || isStartOfType();
                      case 19:
                          return isHeritageClause();
                      case 20:
                          return isIdentifierOrKeyword();
                  }
                  ts.Debug.fail("Non-exhaustive case in 'isListElement'.");
              }
              function isValidHeritageClauseObjectLiteral() {
                  ts.Debug.assert(token === 14);
                  if (nextToken() === 15) {
                      var next = nextToken();
                      return next === 23 || next === 14 || next === 79 || next === 102;
                  }
                  return true;
              }
              function nextTokenIsIdentifier() {
                  nextToken();
                  return isIdentifier();
              }
              function isHeritageClauseExtendsOrImplementsKeyword() {
                  if (token === 102 ||
                      token === 79) {
                      return lookAhead(nextTokenIsStartOfExpression);
                  }
                  return false;
              }
              function nextTokenIsStartOfExpression() {
                  nextToken();
                  return isStartOfExpression();
              }
              function isListTerminator(kind) {
                  if (token === 1) {
                      return true;
                  }
                  switch (kind) {
                      case 1:
                      case 2:
                      case 3:
                      case 5:
                      case 6:
                      case 7:
                      case 13:
                      case 10:
                      case 20:
                          return token === 15;
                      case 4:
                          return token === 15 || token === 67 || token === 73;
                      case 8:
                          return token === 14 || token === 79 || token === 102;
                      case 9:
                          return isVariableDeclaratorListTerminator();
                      case 16:
                          return token === 25 || token === 16 || token === 14 || token === 79 || token === 102;
                      case 12:
                          return token === 17 || token === 22;
                      case 14:
                      case 18:
                      case 11:
                          return token === 19;
                      case 15:
                          return token === 17 || token === 19;
                      case 17:
                          return token === 25 || token === 16;
                      case 19:
                          return token === 14 || token === 15;
                  }
              }
              function isVariableDeclaratorListTerminator() {
                  if (canParseSemicolon()) {
                      return true;
                  }
                  if (isInOrOfKeyword(token)) {
                      return true;
                  }
                  if (token === 32) {
                      return true;
                  }
                  return false;
              }
              function isInSomeParsingContext() {
                  for (var kind = 0; kind < 21; kind++) {
                      if (parsingContext & (1 << kind)) {
                          if (isListElement(kind, true) || isListTerminator(kind)) {
                              return true;
                          }
                      }
                  }
                  return false;
              }
              function parseList(kind, checkForStrictMode, parseElement) {
                  var saveParsingContext = parsingContext;
                  parsingContext |= 1 << kind;
                  var result = [];
                  result.pos = getNodePos();
                  var savedStrictModeContext = inStrictModeContext();
                  while (!isListTerminator(kind)) {
                      if (isListElement(kind, false)) {
                          var element = parseListElement(kind, parseElement);
                          result.push(element);
                          if (checkForStrictMode && !inStrictModeContext()) {
                              if (ts.isPrologueDirective(element)) {
                                  if (isUseStrictPrologueDirective(sourceFile, element)) {
                                      setStrictModeContext(true);
                                      checkForStrictMode = false;
                                  }
                              }
                              else {
                                  checkForStrictMode = false;
                              }
                          }
                          continue;
                      }
                      if (abortParsingListOrMoveToNextToken(kind)) {
                          break;
                      }
                  }
                  setStrictModeContext(savedStrictModeContext);
                  result.end = getNodeEnd();
                  parsingContext = saveParsingContext;
                  return result;
              }
              function isUseStrictPrologueDirective(sourceFile, node) {
                  ts.Debug.assert(ts.isPrologueDirective(node));
                  var nodeText = ts.getSourceTextOfNodeFromSourceFile(sourceFile, node.expression);
                  return nodeText === '"use strict"' || nodeText === "'use strict'";
              }
              function parseListElement(parsingContext, parseElement) {
                  var node = currentNode(parsingContext);
                  if (node) {
                      return consumeNode(node);
                  }
                  return parseElement();
              }
              function currentNode(parsingContext) {
                  if (parseErrorBeforeNextFinishedNode) {
                      return undefined;
                  }
                  if (!syntaxCursor) {
                      return undefined;
                  }
                  var node = syntaxCursor.currentNode(scanner.getStartPos());
                  if (ts.nodeIsMissing(node)) {
                      return undefined;
                  }
                  if (node.intersectsChange) {
                      return undefined;
                  }
                  if (ts.containsParseError(node)) {
                      return undefined;
                  }
                  var nodeContextFlags = node.parserContextFlags & 63;
                  if (nodeContextFlags !== contextFlags) {
                      return undefined;
                  }
                  if (!canReuseNode(node, parsingContext)) {
                      return undefined;
                  }
                  return node;
              }
              function consumeNode(node) {
                  scanner.setTextPos(node.end);
                  nextToken();
                  return node;
              }
              function canReuseNode(node, parsingContext) {
                  switch (parsingContext) {
                      case 1:
                          return isReusableModuleElement(node);
                      case 6:
                          return isReusableClassMember(node);
                      case 3:
                          return isReusableSwitchClause(node);
                      case 2:
                      case 4:
                          return isReusableStatement(node);
                      case 7:
                          return isReusableEnumMember(node);
                      case 5:
                          return isReusableTypeMember(node);
                      case 9:
                          return isReusableVariableDeclaration(node);
                      case 15:
                          return isReusableParameter(node);
                      case 19:
                      case 16:
                      case 18:
                      case 17:
                      case 12:
                      case 13:
                      case 8:
                  }
                  return false;
              }
              function isReusableModuleElement(node) {
                  if (node) {
                      switch (node.kind) {
                          case 210:
                          case 209:
                          case 216:
                          case 215:
                          case 202:
                          case 203:
                          case 206:
                          case 205:
                              return true;
                      }
                      return isReusableStatement(node);
                  }
                  return false;
              }
              function isReusableClassMember(node) {
                  if (node) {
                      switch (node.kind) {
                          case 136:
                          case 141:
                          case 135:
                          case 137:
                          case 138:
                          case 133:
                          case 179:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableSwitchClause(node) {
                  if (node) {
                      switch (node.kind) {
                          case 221:
                          case 222:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableStatement(node) {
                  if (node) {
                      switch (node.kind) {
                          case 201:
                          case 181:
                          case 180:
                          case 184:
                          case 183:
                          case 196:
                          case 192:
                          case 194:
                          case 191:
                          case 190:
                          case 188:
                          case 189:
                          case 187:
                          case 186:
                          case 193:
                          case 182:
                          case 197:
                          case 195:
                          case 185:
                          case 198:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableEnumMember(node) {
                  return node.kind === 227;
              }
              function isReusableTypeMember(node) {
                  if (node) {
                      switch (node.kind) {
                          case 140:
                          case 134:
                          case 141:
                          case 132:
                          case 139:
                              return true;
                      }
                  }
                  return false;
              }
              function isReusableVariableDeclaration(node) {
                  if (node.kind !== 199) {
                      return false;
                  }
                  var variableDeclarator = node;
                  return variableDeclarator.initializer === undefined;
              }
              function isReusableParameter(node) {
                  if (node.kind !== 130) {
                      return false;
                  }
                  var parameter = node;
                  return parameter.initializer === undefined;
              }
              function abortParsingListOrMoveToNextToken(kind) {
                  parseErrorAtCurrentToken(parsingContextErrors(kind));
                  if (isInSomeParsingContext()) {
                      return true;
                  }
                  nextToken();
                  return false;
              }
              function parsingContextErrors(context) {
                  switch (context) {
                      case 0: return ts.Diagnostics.Declaration_or_statement_expected;
                      case 1: return ts.Diagnostics.Declaration_or_statement_expected;
                      case 2: return ts.Diagnostics.Statement_expected;
                      case 3: return ts.Diagnostics.case_or_default_expected;
                      case 4: return ts.Diagnostics.Statement_expected;
                      case 5: return ts.Diagnostics.Property_or_signature_expected;
                      case 6: return ts.Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected;
                      case 7: return ts.Diagnostics.Enum_member_expected;
                      case 8: return ts.Diagnostics.Expression_expected;
                      case 9: return ts.Diagnostics.Variable_declaration_expected;
                      case 10: return ts.Diagnostics.Property_destructuring_pattern_expected;
                      case 11: return ts.Diagnostics.Array_element_destructuring_pattern_expected;
                      case 12: return ts.Diagnostics.Argument_expression_expected;
                      case 13: return ts.Diagnostics.Property_assignment_expected;
                      case 14: return ts.Diagnostics.Expression_or_comma_expected;
                      case 15: return ts.Diagnostics.Parameter_declaration_expected;
                      case 16: return ts.Diagnostics.Type_parameter_declaration_expected;
                      case 17: return ts.Diagnostics.Type_argument_expected;
                      case 18: return ts.Diagnostics.Type_expected;
                      case 19: return ts.Diagnostics.Unexpected_token_expected;
                      case 20: return ts.Diagnostics.Identifier_expected;
                  }
              }
              ;
              function parseDelimitedList(kind, parseElement, considerSemicolonAsDelimeter) {
                  var saveParsingContext = parsingContext;
                  parsingContext |= 1 << kind;
                  var result = [];
                  result.pos = getNodePos();
                  var commaStart = -1;
                  while (true) {
                      if (isListElement(kind, false)) {
                          result.push(parseListElement(kind, parseElement));
                          commaStart = scanner.getTokenPos();
                          if (parseOptional(23)) {
                              continue;
                          }
                          commaStart = -1;
                          if (isListTerminator(kind)) {
                              break;
                          }
                          parseExpected(23);
                          if (considerSemicolonAsDelimeter && token === 22 && !scanner.hasPrecedingLineBreak()) {
                              nextToken();
                          }
                          continue;
                      }
                      if (isListTerminator(kind)) {
                          break;
                      }
                      if (abortParsingListOrMoveToNextToken(kind)) {
                          break;
                      }
                  }
                  if (commaStart >= 0) {
                      result.hasTrailingComma = true;
                  }
                  result.end = getNodeEnd();
                  parsingContext = saveParsingContext;
                  return result;
              }
              function createMissingList() {
                  var pos = getNodePos();
                  var result = [];
                  result.pos = pos;
                  result.end = pos;
                  return result;
              }
              function parseBracketedList(kind, parseElement, open, close) {
                  if (parseExpected(open)) {
                      var result = parseDelimitedList(kind, parseElement);
                      parseExpected(close);
                      return result;
                  }
                  return createMissingList();
              }
              function parseEntityName(allowReservedWords, diagnosticMessage) {
                  var entity = parseIdentifier(diagnosticMessage);
                  while (parseOptional(20)) {
                      var node = createNode(127, entity.pos);
                      node.left = entity;
                      node.right = parseRightSideOfDot(allowReservedWords);
                      entity = finishNode(node);
                  }
                  return entity;
              }
              function parseRightSideOfDot(allowIdentifierNames) {
                  if (scanner.hasPrecedingLineBreak() && scanner.isReservedWord()) {
                      var matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
                      if (matchesPattern) {
                          return createMissingNode(65, true, ts.Diagnostics.Identifier_expected);
                      }
                  }
                  return allowIdentifierNames ? parseIdentifierName() : parseIdentifier();
              }
              function parseTemplateExpression() {
                  var template = createNode(172);
                  template.head = parseLiteralNode();
                  ts.Debug.assert(template.head.kind === 11, "Template head has wrong token kind");
                  var templateSpans = [];
                  templateSpans.pos = getNodePos();
                  do {
                      templateSpans.push(parseTemplateSpan());
                  } while (ts.lastOrUndefined(templateSpans).literal.kind === 12);
                  templateSpans.end = getNodeEnd();
                  template.templateSpans = templateSpans;
                  return finishNode(template);
              }
              function parseTemplateSpan() {
                  var span = createNode(178);
                  span.expression = allowInAnd(parseExpression);
                  var literal;
                  if (token === 15) {
                      reScanTemplateToken();
                      literal = parseLiteralNode();
                  }
                  else {
                      literal = parseExpectedToken(13, false, ts.Diagnostics._0_expected, ts.tokenToString(15));
                  }
                  span.literal = literal;
                  return finishNode(span);
              }
              function parseLiteralNode(internName) {
                  var node = createNode(token);
                  var text = scanner.getTokenValue();
                  node.text = internName ? internIdentifier(text) : text;
                  if (scanner.hasExtendedUnicodeEscape()) {
                      node.hasExtendedUnicodeEscape = true;
                  }
                  if (scanner.isUnterminated()) {
                      node.isUnterminated = true;
                  }
                  var tokenPos = scanner.getTokenPos();
                  nextToken();
                  finishNode(node);
                  if (node.kind === 7
                      && sourceText.charCodeAt(tokenPos) === 48
                      && ts.isOctalDigit(sourceText.charCodeAt(tokenPos + 1))) {
                      node.flags |= 16384;
                  }
                  return node;
              }
              function parseTypeReference() {
                  var node = createNode(142);
                  node.typeName = parseEntityName(false, ts.Diagnostics.Type_expected);
                  if (!scanner.hasPrecedingLineBreak() && token === 24) {
                      node.typeArguments = parseBracketedList(17, parseType, 24, 25);
                  }
                  return finishNode(node);
              }
              function parseTypeQuery() {
                  var node = createNode(145);
                  parseExpected(97);
                  node.exprName = parseEntityName(true);
                  return finishNode(node);
              }
              function parseTypeParameter() {
                  var node = createNode(129);
                  node.name = parseIdentifier();
                  if (parseOptional(79)) {
                      if (isStartOfType() || !isStartOfExpression()) {
                          node.constraint = parseType();
                      }
                      else {
                          node.expression = parseUnaryExpressionOrHigher();
                      }
                  }
                  return finishNode(node);
              }
              function parseTypeParameters() {
                  if (token === 24) {
                      return parseBracketedList(16, parseTypeParameter, 24, 25);
                  }
              }
              function parseParameterType() {
                  if (parseOptional(51)) {
                      return token === 8
                          ? parseLiteralNode(true)
                          : parseType();
                  }
                  return undefined;
              }
              function isStartOfParameter() {
                  return token === 21 || isIdentifierOrPattern() || ts.isModifier(token) || token === 52;
              }
              function setModifiers(node, modifiers) {
                  if (modifiers) {
                      node.flags |= modifiers.flags;
                      node.modifiers = modifiers;
                  }
              }
              function parseParameter() {
                  var node = createNode(130);
                  node.decorators = parseDecorators();
                  setModifiers(node, parseModifiers());
                  node.dotDotDotToken = parseOptionalToken(21);
                  node.name = inGeneratorParameterContext() ? doInYieldContext(parseIdentifierOrPattern) : parseIdentifierOrPattern();
                  if (ts.getFullWidth(node.name) === 0 && node.flags === 0 && ts.isModifier(token)) {
                      nextToken();
                  }
                  node.questionToken = parseOptionalToken(50);
                  node.type = parseParameterType();
                  node.initializer = inGeneratorParameterContext() ? doOutsideOfYieldContext(parseParameterInitializer) : parseParameterInitializer();
                  return finishNode(node);
              }
              function parseParameterInitializer() {
                  return parseInitializer(true);
              }
              function fillSignature(returnToken, yieldAndGeneratorParameterContext, requireCompleteParameterList, signature) {
                  var returnTokenRequired = returnToken === 32;
                  signature.typeParameters = parseTypeParameters();
                  signature.parameters = parseParameterList(yieldAndGeneratorParameterContext, requireCompleteParameterList);
                  if (returnTokenRequired) {
                      parseExpected(returnToken);
                      signature.type = parseType();
                  }
                  else if (parseOptional(returnToken)) {
                      signature.type = parseType();
                  }
              }
              function parseParameterList(yieldAndGeneratorParameterContext, requireCompleteParameterList) {
                  if (parseExpected(16)) {
                      var savedYieldContext = inYieldContext();
                      var savedGeneratorParameterContext = inGeneratorParameterContext();
                      setYieldContext(yieldAndGeneratorParameterContext);
                      setGeneratorParameterContext(yieldAndGeneratorParameterContext);
                      var result = parseDelimitedList(15, parseParameter);
                      setYieldContext(savedYieldContext);
                      setGeneratorParameterContext(savedGeneratorParameterContext);
                      if (!parseExpected(17) && requireCompleteParameterList) {
                          return undefined;
                      }
                      return result;
                  }
                  return requireCompleteParameterList ? undefined : createMissingList();
              }
              function parseTypeMemberSemicolon() {
                  if (parseOptional(23)) {
                      return;
                  }
                  parseSemicolon();
              }
              function parseSignatureMember(kind) {
                  var node = createNode(kind);
                  if (kind === 140) {
                      parseExpected(88);
                  }
                  fillSignature(51, false, false, node);
                  parseTypeMemberSemicolon();
                  return finishNode(node);
              }
              function isIndexSignature() {
                  if (token !== 18) {
                      return false;
                  }
                  return lookAhead(isUnambiguouslyIndexSignature);
              }
              function isUnambiguouslyIndexSignature() {
                  nextToken();
                  if (token === 21 || token === 19) {
                      return true;
                  }
                  if (ts.isModifier(token)) {
                      nextToken();
                      if (isIdentifier()) {
                          return true;
                      }
                  }
                  else if (!isIdentifier()) {
                      return false;
                  }
                  else {
                      nextToken();
                  }
                  if (token === 51 || token === 23) {
                      return true;
                  }
                  if (token !== 50) {
                      return false;
                  }
                  nextToken();
                  return token === 51 || token === 23 || token === 19;
              }
              function parseIndexSignatureDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(141, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.parameters = parseBracketedList(15, parseParameter, 18, 19);
                  node.type = parseTypeAnnotation();
                  parseTypeMemberSemicolon();
                  return finishNode(node);
              }
              function parsePropertyOrMethodSignature() {
                  var fullStart = scanner.getStartPos();
                  var name = parsePropertyName();
                  var questionToken = parseOptionalToken(50);
                  if (token === 16 || token === 24) {
                      var method = createNode(134, fullStart);
                      method.name = name;
                      method.questionToken = questionToken;
                      fillSignature(51, false, false, method);
                      parseTypeMemberSemicolon();
                      return finishNode(method);
                  }
                  else {
                      var property = createNode(132, fullStart);
                      property.name = name;
                      property.questionToken = questionToken;
                      property.type = parseTypeAnnotation();
                      parseTypeMemberSemicolon();
                      return finishNode(property);
                  }
              }
              function isStartOfTypeMember() {
                  switch (token) {
                      case 16:
                      case 24:
                      case 18:
                          return true;
                      default:
                          if (ts.isModifier(token)) {
                              var result = lookAhead(isStartOfIndexSignatureDeclaration);
                              if (result) {
                                  return result;
                              }
                          }
                          return isLiteralPropertyName() && lookAhead(isTypeMemberWithLiteralPropertyName);
                  }
              }
              function isStartOfIndexSignatureDeclaration() {
                  while (ts.isModifier(token)) {
                      nextToken();
                  }
                  return isIndexSignature();
              }
              function isTypeMemberWithLiteralPropertyName() {
                  nextToken();
                  return token === 16 ||
                      token === 24 ||
                      token === 50 ||
                      token === 51 ||
                      canParseSemicolon();
              }
              function parseTypeMember() {
                  switch (token) {
                      case 16:
                      case 24:
                          return parseSignatureMember(139);
                      case 18:
                          return isIndexSignature()
                              ? parseIndexSignatureDeclaration(scanner.getStartPos(), undefined, undefined)
                              : parsePropertyOrMethodSignature();
                      case 88:
                          if (lookAhead(isStartOfConstructSignature)) {
                              return parseSignatureMember(140);
                          }
                      case 8:
                      case 7:
                          return parsePropertyOrMethodSignature();
                      default:
                          if (ts.isModifier(token)) {
                              var result = tryParse(parseIndexSignatureWithModifiers);
                              if (result) {
                                  return result;
                              }
                          }
                          if (isIdentifierOrKeyword()) {
                              return parsePropertyOrMethodSignature();
                          }
                  }
              }
              function parseIndexSignatureWithModifiers() {
                  var fullStart = scanner.getStartPos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  return isIndexSignature()
                      ? parseIndexSignatureDeclaration(fullStart, decorators, modifiers)
                      : undefined;
              }
              function isStartOfConstructSignature() {
                  nextToken();
                  return token === 16 || token === 24;
              }
              function parseTypeLiteral() {
                  var node = createNode(146);
                  node.members = parseObjectTypeMembers();
                  return finishNode(node);
              }
              function parseObjectTypeMembers() {
                  var members;
                  if (parseExpected(14)) {
                      members = parseList(5, false, parseTypeMember);
                      parseExpected(15);
                  }
                  else {
                      members = createMissingList();
                  }
                  return members;
              }
              function parseTupleType() {
                  var node = createNode(148);
                  node.elementTypes = parseBracketedList(18, parseType, 18, 19);
                  return finishNode(node);
              }
              function parseParenthesizedType() {
                  var node = createNode(150);
                  parseExpected(16);
                  node.type = parseType();
                  parseExpected(17);
                  return finishNode(node);
              }
              function parseFunctionOrConstructorType(kind) {
                  var node = createNode(kind);
                  if (kind === 144) {
                      parseExpected(88);
                  }
                  fillSignature(32, false, false, node);
                  return finishNode(node);
              }
              function parseKeywordAndNoDot() {
                  var node = parseTokenNode();
                  return token === 20 ? undefined : node;
              }
              function parseNonArrayType() {
                  switch (token) {
                      case 112:
                      case 122:
                      case 120:
                      case 113:
                      case 123:
                          var node = tryParse(parseKeywordAndNoDot);
                          return node || parseTypeReference();
                      case 99:
                          return parseTokenNode();
                      case 97:
                          return parseTypeQuery();
                      case 14:
                          return parseTypeLiteral();
                      case 18:
                          return parseTupleType();
                      case 16:
                          return parseParenthesizedType();
                      default:
                          return parseTypeReference();
                  }
              }
              function isStartOfType() {
                  switch (token) {
                      case 112:
                      case 122:
                      case 120:
                      case 113:
                      case 123:
                      case 99:
                      case 97:
                      case 14:
                      case 18:
                      case 24:
                      case 88:
                          return true;
                      case 16:
                          return lookAhead(isStartOfParenthesizedOrFunctionType);
                      default:
                          return isIdentifier();
                  }
              }
              function isStartOfParenthesizedOrFunctionType() {
                  nextToken();
                  return token === 17 || isStartOfParameter() || isStartOfType();
              }
              function parseArrayTypeOrHigher() {
                  var type = parseNonArrayType();
                  while (!scanner.hasPrecedingLineBreak() && parseOptional(18)) {
                      parseExpected(19);
                      var node = createNode(147, type.pos);
                      node.elementType = type;
                      type = finishNode(node);
                  }
                  return type;
              }
              function parseUnionTypeOrHigher() {
                  var type = parseArrayTypeOrHigher();
                  if (token === 44) {
                      var types = [type];
                      types.pos = type.pos;
                      while (parseOptional(44)) {
                          types.push(parseArrayTypeOrHigher());
                      }
                      types.end = getNodeEnd();
                      var node = createNode(149, type.pos);
                      node.types = types;
                      type = finishNode(node);
                  }
                  return type;
              }
              function isStartOfFunctionType() {
                  if (token === 24) {
                      return true;
                  }
                  return token === 16 && lookAhead(isUnambiguouslyStartOfFunctionType);
              }
              function isUnambiguouslyStartOfFunctionType() {
                  nextToken();
                  if (token === 17 || token === 21) {
                      return true;
                  }
                  if (isIdentifier() || ts.isModifier(token)) {
                      nextToken();
                      if (token === 51 || token === 23 ||
                          token === 50 || token === 53 ||
                          isIdentifier() || ts.isModifier(token)) {
                          return true;
                      }
                      if (token === 17) {
                          nextToken();
                          if (token === 32) {
                              return true;
                          }
                      }
                  }
                  return false;
              }
              function parseType() {
                  var savedYieldContext = inYieldContext();
                  var savedGeneratorParameterContext = inGeneratorParameterContext();
                  setYieldContext(false);
                  setGeneratorParameterContext(false);
                  var result = parseTypeWorker();
                  setYieldContext(savedYieldContext);
                  setGeneratorParameterContext(savedGeneratorParameterContext);
                  return result;
              }
              function parseTypeWorker() {
                  if (isStartOfFunctionType()) {
                      return parseFunctionOrConstructorType(143);
                  }
                  if (token === 88) {
                      return parseFunctionOrConstructorType(144);
                  }
                  return parseUnionTypeOrHigher();
              }
              function parseTypeAnnotation() {
                  return parseOptional(51) ? parseType() : undefined;
              }
              function isStartOfLeftHandSideExpression() {
                  switch (token) {
                      case 93:
                      case 91:
                      case 89:
                      case 95:
                      case 80:
                      case 7:
                      case 8:
                      case 10:
                      case 11:
                      case 16:
                      case 18:
                      case 14:
                      case 83:
                      case 69:
                      case 88:
                      case 36:
                      case 57:
                      case 65:
                          return true;
                      default:
                          return isIdentifier();
                  }
              }
              function isStartOfExpression() {
                  if (isStartOfLeftHandSideExpression()) {
                      return true;
                  }
                  switch (token) {
                      case 33:
                      case 34:
                      case 47:
                      case 46:
                      case 74:
                      case 97:
                      case 99:
                      case 38:
                      case 39:
                      case 24:
                      case 110:
                          return true;
                      default:
                          if (isBinaryOperator()) {
                              return true;
                          }
                          return isIdentifier();
                  }
              }
              function isStartOfExpressionStatement() {
                  return token !== 14 &&
                      token !== 83 &&
                      token !== 69 &&
                      token !== 52 &&
                      isStartOfExpression();
              }
              function parseExpression() {
                  // Expression[in]:
                  //      AssignmentExpression[in]
                  //      Expression[in] , AssignmentExpression[in]
                  var saveDecoratorContext = inDecoratorContext();
                  if (saveDecoratorContext) {
                      setDecoratorContext(false);
                  }
                  var expr = parseAssignmentExpressionOrHigher();
                  var operatorToken;
                  while ((operatorToken = parseOptionalToken(23))) {
                      expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher());
                  }
                  if (saveDecoratorContext) {
                      setDecoratorContext(true);
                  }
                  return expr;
              }
              function parseInitializer(inParameter) {
                  if (token !== 53) {
                      if (scanner.hasPrecedingLineBreak() || (inParameter && token === 14) || !isStartOfExpression()) {
                          return undefined;
                      }
                  }
                  parseExpected(53);
                  return parseAssignmentExpressionOrHigher();
              }
              function parseAssignmentExpressionOrHigher() {
                  //  AssignmentExpression[in,yield]:
                  //      1) ConditionalExpression[?in,?yield]
                  //      2) LeftHandSideExpression = AssignmentExpression[?in,?yield]
                  //      3) LeftHandSideExpression AssignmentOperator AssignmentExpression[?in,?yield]
                  //      4) ArrowFunctionExpression[?in,?yield]
                  //      5) [+Yield] YieldExpression[?In]
                  //
                  // Note: for ease of implementation we treat productions '2' and '3' as the same thing.
                  // (i.e. they're both BinaryExpressions with an assignment operator in it).
                  if (isYieldExpression()) {
                      return parseYieldExpression();
                  }
                  var arrowExpression = tryParseParenthesizedArrowFunctionExpression();
                  if (arrowExpression) {
                      return arrowExpression;
                  }
                  var expr = parseBinaryExpressionOrHigher(0);
                  if (expr.kind === 65 && token === 32) {
                      return parseSimpleArrowFunctionExpression(expr);
                  }
                  if (ts.isLeftHandSideExpression(expr) && ts.isAssignmentOperator(reScanGreaterToken())) {
                      return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher());
                  }
                  return parseConditionalExpressionRest(expr);
              }
              function isYieldExpression() {
                  if (token === 110) {
                      if (inYieldContext()) {
                          return true;
                      }
                      if (inStrictModeContext()) {
                          return true;
                      }
                      return lookAhead(nextTokenIsIdentifierOnSameLine);
                  }
                  return false;
              }
              function nextTokenIsIdentifierOnSameLine() {
                  nextToken();
                  return !scanner.hasPrecedingLineBreak() && isIdentifier();
              }
              function nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine() {
                  nextToken();
                  return !scanner.hasPrecedingLineBreak() &&
                      (isIdentifier() || token === 14 || token === 18);
              }
              function parseYieldExpression() {
                  var node = createNode(173);
                  nextToken();
                  if (!scanner.hasPrecedingLineBreak() &&
                      (token === 35 || isStartOfExpression())) {
                      node.asteriskToken = parseOptionalToken(35);
                      node.expression = parseAssignmentExpressionOrHigher();
                      return finishNode(node);
                  }
                  else {
                      return finishNode(node);
                  }
              }
              function parseSimpleArrowFunctionExpression(identifier) {
                  ts.Debug.assert(token === 32, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
                  var node = createNode(164, identifier.pos);
                  var parameter = createNode(130, identifier.pos);
                  parameter.name = identifier;
                  finishNode(parameter);
                  node.parameters = [parameter];
                  node.parameters.pos = parameter.pos;
                  node.parameters.end = parameter.end;
                  node.equalsGreaterThanToken = parseExpectedToken(32, false, ts.Diagnostics._0_expected, "=>");
                  node.body = parseArrowFunctionExpressionBody();
                  return finishNode(node);
              }
              function tryParseParenthesizedArrowFunctionExpression() {
                  var triState = isParenthesizedArrowFunctionExpression();
                  if (triState === 0) {
                      return undefined;
                  }
                  var arrowFunction = triState === 1
                      ? parseParenthesizedArrowFunctionExpressionHead(true)
                      : tryParse(parsePossibleParenthesizedArrowFunctionExpressionHead);
                  if (!arrowFunction) {
                      return undefined;
                  }
                  var lastToken = token;
                  arrowFunction.equalsGreaterThanToken = parseExpectedToken(32, false, ts.Diagnostics._0_expected, "=>");
                  arrowFunction.body = (lastToken === 32 || lastToken === 14)
                      ? parseArrowFunctionExpressionBody()
                      : parseIdentifier();
                  return finishNode(arrowFunction);
              }
              function isParenthesizedArrowFunctionExpression() {
                  if (token === 16 || token === 24) {
                      return lookAhead(isParenthesizedArrowFunctionExpressionWorker);
                  }
                  if (token === 32) {
                      return 1;
                  }
                  return 0;
              }
              function isParenthesizedArrowFunctionExpressionWorker() {
                  var first = token;
                  var second = nextToken();
                  if (first === 16) {
                      if (second === 17) {
                          var third = nextToken();
                          switch (third) {
                              case 32:
                              case 51:
                              case 14:
                                  return 1;
                              default:
                                  return 0;
                          }
                      }
                      if (second === 18 || second === 14) {
                          return 2;
                      }
                      if (second === 21) {
                          return 1;
                      }
                      if (!isIdentifier()) {
                          return 0;
                      }
                      if (nextToken() === 51) {
                          return 1;
                      }
                      return 2;
                  }
                  else {
                      ts.Debug.assert(first === 24);
                      if (!isIdentifier()) {
                          return 0;
                      }
                      return 2;
                  }
              }
              function parsePossibleParenthesizedArrowFunctionExpressionHead() {
                  return parseParenthesizedArrowFunctionExpressionHead(false);
              }
              function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity) {
                  var node = createNode(164);
                  fillSignature(51, false, !allowAmbiguity, node);
                  if (!node.parameters) {
                      return undefined;
                  }
                  if (!allowAmbiguity && token !== 32 && token !== 14) {
                      return undefined;
                  }
                  return node;
              }
              function parseArrowFunctionExpressionBody() {
                  if (token === 14) {
                      return parseFunctionBlock(false, false);
                  }
                  if (isStartOfStatement(true) &&
                      !isStartOfExpressionStatement() &&
                      token !== 83 &&
                      token !== 69) {
                      return parseFunctionBlock(false, true);
                  }
                  return parseAssignmentExpressionOrHigher();
              }
              function parseConditionalExpressionRest(leftOperand) {
                  var questionToken = parseOptionalToken(50);
                  if (!questionToken) {
                      return leftOperand;
                  }
                  var node = createNode(171, leftOperand.pos);
                  node.condition = leftOperand;
                  node.questionToken = questionToken;
                  node.whenTrue = doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher);
                  node.colonToken = parseExpectedToken(51, false, ts.Diagnostics._0_expected, ts.tokenToString(51));
                  node.whenFalse = parseAssignmentExpressionOrHigher();
                  return finishNode(node);
              }
              function parseBinaryExpressionOrHigher(precedence) {
                  var leftOperand = parseUnaryExpressionOrHigher();
                  return parseBinaryExpressionRest(precedence, leftOperand);
              }
              function isInOrOfKeyword(t) {
                  return t === 86 || t === 126;
              }
              function parseBinaryExpressionRest(precedence, leftOperand) {
                  while (true) {
                      reScanGreaterToken();
                      var newPrecedence = getBinaryOperatorPrecedence();
                      if (newPrecedence <= precedence) {
                          break;
                      }
                      if (token === 86 && inDisallowInContext()) {
                          break;
                      }
                      leftOperand = makeBinaryExpression(leftOperand, parseTokenNode(), parseBinaryExpressionOrHigher(newPrecedence));
                  }
                  return leftOperand;
              }
              function isBinaryOperator() {
                  if (inDisallowInContext() && token === 86) {
                      return false;
                  }
                  return getBinaryOperatorPrecedence() > 0;
              }
              function getBinaryOperatorPrecedence() {
                  switch (token) {
                      case 49:
                          return 1;
                      case 48:
                          return 2;
                      case 44:
                          return 3;
                      case 45:
                          return 4;
                      case 43:
                          return 5;
                      case 28:
                      case 29:
                      case 30:
                      case 31:
                          return 6;
                      case 24:
                      case 25:
                      case 26:
                      case 27:
                      case 87:
                      case 86:
                          return 7;
                      case 40:
                      case 41:
                      case 42:
                          return 8;
                      case 33:
                      case 34:
                          return 9;
                      case 35:
                      case 36:
                      case 37:
                          return 10;
                  }
                  return -1;
              }
              function makeBinaryExpression(left, operatorToken, right) {
                  var node = createNode(170, left.pos);
                  node.left = left;
                  node.operatorToken = operatorToken;
                  node.right = right;
                  return finishNode(node);
              }
              function parsePrefixUnaryExpression() {
                  var node = createNode(168);
                  node.operator = token;
                  nextToken();
                  node.operand = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseDeleteExpression() {
                  var node = createNode(165);
                  nextToken();
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseTypeOfExpression() {
                  var node = createNode(166);
                  nextToken();
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseVoidExpression() {
                  var node = createNode(167);
                  nextToken();
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseUnaryExpressionOrHigher() {
                  switch (token) {
                      case 33:
                      case 34:
                      case 47:
                      case 46:
                      case 38:
                      case 39:
                          return parsePrefixUnaryExpression();
                      case 74:
                          return parseDeleteExpression();
                      case 97:
                          return parseTypeOfExpression();
                      case 99:
                          return parseVoidExpression();
                      case 24:
                          return parseTypeAssertion();
                      default:
                          return parsePostfixExpressionOrHigher();
                  }
              }
              function parsePostfixExpressionOrHigher() {
                  var expression = parseLeftHandSideExpressionOrHigher();
                  ts.Debug.assert(ts.isLeftHandSideExpression(expression));
                  if ((token === 38 || token === 39) && !scanner.hasPrecedingLineBreak()) {
                      var node = createNode(169, expression.pos);
                      node.operand = expression;
                      node.operator = token;
                      nextToken();
                      return finishNode(node);
                  }
                  return expression;
              }
              function parseLeftHandSideExpressionOrHigher() {
                  var expression = token === 91
                      ? parseSuperExpression()
                      : parseMemberExpressionOrHigher();
                  return parseCallExpressionRest(expression);
              }
              function parseMemberExpressionOrHigher() {
                  var expression = parsePrimaryExpression();
                  return parseMemberExpressionRest(expression);
              }
              function parseSuperExpression() {
                  var expression = parseTokenNode();
                  if (token === 16 || token === 20) {
                      return expression;
                  }
                  var node = createNode(156, expression.pos);
                  node.expression = expression;
                  node.dotToken = parseExpectedToken(20, false, ts.Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
                  node.name = parseRightSideOfDot(true);
                  return finishNode(node);
              }
              function parseTypeAssertion() {
                  var node = createNode(161);
                  parseExpected(24);
                  node.type = parseType();
                  parseExpected(25);
                  node.expression = parseUnaryExpressionOrHigher();
                  return finishNode(node);
              }
              function parseMemberExpressionRest(expression) {
                  while (true) {
                      var dotToken = parseOptionalToken(20);
                      if (dotToken) {
                          var propertyAccess = createNode(156, expression.pos);
                          propertyAccess.expression = expression;
                          propertyAccess.dotToken = dotToken;
                          propertyAccess.name = parseRightSideOfDot(true);
                          expression = finishNode(propertyAccess);
                          continue;
                      }
                      if (!inDecoratorContext() && parseOptional(18)) {
                          var indexedAccess = createNode(157, expression.pos);
                          indexedAccess.expression = expression;
                          if (token !== 19) {
                              indexedAccess.argumentExpression = allowInAnd(parseExpression);
                              if (indexedAccess.argumentExpression.kind === 8 || indexedAccess.argumentExpression.kind === 7) {
                                  var literal = indexedAccess.argumentExpression;
                                  literal.text = internIdentifier(literal.text);
                              }
                          }
                          parseExpected(19);
                          expression = finishNode(indexedAccess);
                          continue;
                      }
                      if (token === 10 || token === 11) {
                          var tagExpression = createNode(160, expression.pos);
                          tagExpression.tag = expression;
                          tagExpression.template = token === 10
                              ? parseLiteralNode()
                              : parseTemplateExpression();
                          expression = finishNode(tagExpression);
                          continue;
                      }
                      return expression;
                  }
              }
              function parseCallExpressionRest(expression) {
                  while (true) {
                      expression = parseMemberExpressionRest(expression);
                      if (token === 24) {
                          var typeArguments = tryParse(parseTypeArgumentsInExpression);
                          if (!typeArguments) {
                              return expression;
                          }
                          var callExpr = createNode(158, expression.pos);
                          callExpr.expression = expression;
                          callExpr.typeArguments = typeArguments;
                          callExpr.arguments = parseArgumentList();
                          expression = finishNode(callExpr);
                          continue;
                      }
                      else if (token === 16) {
                          var callExpr = createNode(158, expression.pos);
                          callExpr.expression = expression;
                          callExpr.arguments = parseArgumentList();
                          expression = finishNode(callExpr);
                          continue;
                      }
                      return expression;
                  }
              }
              function parseArgumentList() {
                  parseExpected(16);
                  var result = parseDelimitedList(12, parseArgumentExpression);
                  parseExpected(17);
                  return result;
              }
              function parseTypeArgumentsInExpression() {
                  if (!parseOptional(24)) {
                      return undefined;
                  }
                  var typeArguments = parseDelimitedList(17, parseType);
                  if (!parseExpected(25)) {
                      return undefined;
                  }
                  return typeArguments && canFollowTypeArgumentsInExpression()
                      ? typeArguments
                      : undefined;
              }
              function canFollowTypeArgumentsInExpression() {
                  switch (token) {
                      case 16:
                      case 20:
                      case 17:
                      case 19:
                      case 51:
                      case 22:
                      case 50:
                      case 28:
                      case 30:
                      case 29:
                      case 31:
                      case 48:
                      case 49:
                      case 45:
                      case 43:
                      case 44:
                      case 15:
                      case 1:
                          return true;
                      case 23:
                      case 14:
                      default:
                          return false;
                  }
              }
              function parsePrimaryExpression() {
                  switch (token) {
                      case 7:
                      case 8:
                      case 10:
                          return parseLiteralNode();
                      case 93:
                      case 91:
                      case 89:
                      case 95:
                      case 80:
                          return parseTokenNode();
                      case 16:
                          return parseParenthesizedExpression();
                      case 18:
                          return parseArrayLiteralExpression();
                      case 14:
                          return parseObjectLiteralExpression();
                      case 69:
                          return parseClassExpression();
                      case 83:
                          return parseFunctionExpression();
                      case 88:
                          return parseNewExpression();
                      case 36:
                      case 57:
                          if (reScanSlashToken() === 9) {
                              return parseLiteralNode();
                          }
                          break;
                      case 11:
                          return parseTemplateExpression();
                  }
                  return parseIdentifier(ts.Diagnostics.Expression_expected);
              }
              function parseParenthesizedExpression() {
                  var node = createNode(162);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  return finishNode(node);
              }
              function parseSpreadElement() {
                  var node = createNode(174);
                  parseExpected(21);
                  node.expression = parseAssignmentExpressionOrHigher();
                  return finishNode(node);
              }
              function parseArgumentOrArrayLiteralElement() {
                  return token === 21 ? parseSpreadElement() :
                      token === 23 ? createNode(176) :
                          parseAssignmentExpressionOrHigher();
              }
              function parseArgumentExpression() {
                  return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
              }
              function parseArrayLiteralExpression() {
                  var node = createNode(154);
                  parseExpected(18);
                  if (scanner.hasPrecedingLineBreak())
                      node.flags |= 512;
                  node.elements = parseDelimitedList(14, parseArgumentOrArrayLiteralElement);
                  parseExpected(19);
                  return finishNode(node);
              }
              function tryParseAccessorDeclaration(fullStart, decorators, modifiers) {
                  if (parseContextualModifier(116)) {
                      return parseAccessorDeclaration(137, fullStart, decorators, modifiers);
                  }
                  else if (parseContextualModifier(121)) {
                      return parseAccessorDeclaration(138, fullStart, decorators, modifiers);
                  }
                  return undefined;
              }
              function parseObjectLiteralElement() {
                  var fullStart = scanner.getStartPos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
                  if (accessor) {
                      return accessor;
                  }
                  var asteriskToken = parseOptionalToken(35);
                  var tokenIsIdentifier = isIdentifier();
                  var nameToken = token;
                  var propertyName = parsePropertyName();
                  var questionToken = parseOptionalToken(50);
                  if (asteriskToken || token === 16 || token === 24) {
                      return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, propertyName, questionToken);
                  }
                  if ((token === 23 || token === 15) && tokenIsIdentifier) {
                      var shorthandDeclaration = createNode(226, fullStart);
                      shorthandDeclaration.name = propertyName;
                      shorthandDeclaration.questionToken = questionToken;
                      return finishNode(shorthandDeclaration);
                  }
                  else {
                      var propertyAssignment = createNode(225, fullStart);
                      propertyAssignment.name = propertyName;
                      propertyAssignment.questionToken = questionToken;
                      parseExpected(51);
                      propertyAssignment.initializer = allowInAnd(parseAssignmentExpressionOrHigher);
                      return finishNode(propertyAssignment);
                  }
              }
              function parseObjectLiteralExpression() {
                  var node = createNode(155);
                  parseExpected(14);
                  if (scanner.hasPrecedingLineBreak()) {
                      node.flags |= 512;
                  }
                  node.properties = parseDelimitedList(13, parseObjectLiteralElement, true);
                  parseExpected(15);
                  return finishNode(node);
              }
              function parseFunctionExpression() {
                  var saveDecoratorContext = inDecoratorContext();
                  if (saveDecoratorContext) {
                      setDecoratorContext(false);
                  }
                  var node = createNode(163);
                  parseExpected(83);
                  node.asteriskToken = parseOptionalToken(35);
                  node.name = node.asteriskToken ? doInYieldContext(parseOptionalIdentifier) : parseOptionalIdentifier();
                  fillSignature(51, !!node.asteriskToken, false, node);
                  node.body = parseFunctionBlock(!!node.asteriskToken, false);
                  if (saveDecoratorContext) {
                      setDecoratorContext(true);
                  }
                  return finishNode(node);
              }
              function parseOptionalIdentifier() {
                  return isIdentifier() ? parseIdentifier() : undefined;
              }
              function parseNewExpression() {
                  var node = createNode(159);
                  parseExpected(88);
                  node.expression = parseMemberExpressionOrHigher();
                  node.typeArguments = tryParse(parseTypeArgumentsInExpression);
                  if (node.typeArguments || token === 16) {
                      node.arguments = parseArgumentList();
                  }
                  return finishNode(node);
              }
              function parseBlock(ignoreMissingOpenBrace, checkForStrictMode, diagnosticMessage) {
                  var node = createNode(180);
                  if (parseExpected(14, diagnosticMessage) || ignoreMissingOpenBrace) {
                      node.statements = parseList(2, checkForStrictMode, parseStatement);
                      parseExpected(15);
                  }
                  else {
                      node.statements = createMissingList();
                  }
                  return finishNode(node);
              }
              function parseFunctionBlock(allowYield, ignoreMissingOpenBrace, diagnosticMessage) {
                  var savedYieldContext = inYieldContext();
                  setYieldContext(allowYield);
                  var saveDecoratorContext = inDecoratorContext();
                  if (saveDecoratorContext) {
                      setDecoratorContext(false);
                  }
                  var block = parseBlock(ignoreMissingOpenBrace, true, diagnosticMessage);
                  if (saveDecoratorContext) {
                      setDecoratorContext(true);
                  }
                  setYieldContext(savedYieldContext);
                  return block;
              }
              function parseEmptyStatement() {
                  var node = createNode(182);
                  parseExpected(22);
                  return finishNode(node);
              }
              function parseIfStatement() {
                  var node = createNode(184);
                  parseExpected(84);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  node.thenStatement = parseStatement();
                  node.elseStatement = parseOptional(76) ? parseStatement() : undefined;
                  return finishNode(node);
              }
              function parseDoStatement() {
                  var node = createNode(185);
                  parseExpected(75);
                  node.statement = parseStatement();
                  parseExpected(100);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  parseOptional(22);
                  return finishNode(node);
              }
              function parseWhileStatement() {
                  var node = createNode(186);
                  parseExpected(100);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  node.statement = parseStatement();
                  return finishNode(node);
              }
              function parseForOrForInOrForOfStatement() {
                  var pos = getNodePos();
                  parseExpected(82);
                  parseExpected(16);
                  var initializer = undefined;
                  if (token !== 22) {
                      if (token === 98 || token === 104 || token === 70) {
                          initializer = parseVariableDeclarationList(true);
                      }
                      else {
                          initializer = disallowInAnd(parseExpression);
                      }
                  }
                  var forOrForInOrForOfStatement;
                  if (parseOptional(86)) {
                      var forInStatement = createNode(188, pos);
                      forInStatement.initializer = initializer;
                      forInStatement.expression = allowInAnd(parseExpression);
                      parseExpected(17);
                      forOrForInOrForOfStatement = forInStatement;
                  }
                  else if (parseOptional(126)) {
                      var forOfStatement = createNode(189, pos);
                      forOfStatement.initializer = initializer;
                      forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher);
                      parseExpected(17);
                      forOrForInOrForOfStatement = forOfStatement;
                  }
                  else {
                      var forStatement = createNode(187, pos);
                      forStatement.initializer = initializer;
                      parseExpected(22);
                      if (token !== 22 && token !== 17) {
                          forStatement.condition = allowInAnd(parseExpression);
                      }
                      parseExpected(22);
                      if (token !== 17) {
                          forStatement.incrementor = allowInAnd(parseExpression);
                      }
                      parseExpected(17);
                      forOrForInOrForOfStatement = forStatement;
                  }
                  forOrForInOrForOfStatement.statement = parseStatement();
                  return finishNode(forOrForInOrForOfStatement);
              }
              function parseBreakOrContinueStatement(kind) {
                  var node = createNode(kind);
                  parseExpected(kind === 191 ? 66 : 71);
                  if (!canParseSemicolon()) {
                      node.label = parseIdentifier();
                  }
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseReturnStatement() {
                  var node = createNode(192);
                  parseExpected(90);
                  if (!canParseSemicolon()) {
                      node.expression = allowInAnd(parseExpression);
                  }
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseWithStatement() {
                  var node = createNode(193);
                  parseExpected(101);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  node.statement = parseStatement();
                  return finishNode(node);
              }
              function parseCaseClause() {
                  var node = createNode(221);
                  parseExpected(67);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(51);
                  node.statements = parseList(4, false, parseStatement);
                  return finishNode(node);
              }
              function parseDefaultClause() {
                  var node = createNode(222);
                  parseExpected(73);
                  parseExpected(51);
                  node.statements = parseList(4, false, parseStatement);
                  return finishNode(node);
              }
              function parseCaseOrDefaultClause() {
                  return token === 67 ? parseCaseClause() : parseDefaultClause();
              }
              function parseSwitchStatement() {
                  var node = createNode(194);
                  parseExpected(92);
                  parseExpected(16);
                  node.expression = allowInAnd(parseExpression);
                  parseExpected(17);
                  var caseBlock = createNode(208, scanner.getStartPos());
                  parseExpected(14);
                  caseBlock.clauses = parseList(3, false, parseCaseOrDefaultClause);
                  parseExpected(15);
                  node.caseBlock = finishNode(caseBlock);
                  return finishNode(node);
              }
              function parseThrowStatement() {
                  // ThrowStatement[Yield] :
                  //      throw [no LineTerminator here]Expression[In, ?Yield];
                  var node = createNode(196);
                  parseExpected(94);
                  node.expression = scanner.hasPrecedingLineBreak() ? undefined : allowInAnd(parseExpression);
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseTryStatement() {
                  var node = createNode(197);
                  parseExpected(96);
                  node.tryBlock = parseBlock(false, false);
                  node.catchClause = token === 68 ? parseCatchClause() : undefined;
                  if (!node.catchClause || token === 81) {
                      parseExpected(81);
                      node.finallyBlock = parseBlock(false, false);
                  }
                  return finishNode(node);
              }
              function parseCatchClause() {
                  var result = createNode(224);
                  parseExpected(68);
                  if (parseExpected(16)) {
                      result.variableDeclaration = parseVariableDeclaration();
                  }
                  parseExpected(17);
                  result.block = parseBlock(false, false);
                  return finishNode(result);
              }
              function parseDebuggerStatement() {
                  var node = createNode(198);
                  parseExpected(72);
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseExpressionOrLabeledStatement() {
                  var fullStart = scanner.getStartPos();
                  var expression = allowInAnd(parseExpression);
                  if (expression.kind === 65 && parseOptional(51)) {
                      var labeledStatement = createNode(195, fullStart);
                      labeledStatement.label = expression;
                      labeledStatement.statement = parseStatement();
                      return finishNode(labeledStatement);
                  }
                  else {
                      var expressionStatement = createNode(183, fullStart);
                      expressionStatement.expression = expression;
                      parseSemicolon();
                      return finishNode(expressionStatement);
                  }
              }
              function isStartOfStatement(inErrorRecovery) {
                  if (ts.isModifier(token)) {
                      var result = lookAhead(parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers);
                      if (result) {
                          return true;
                      }
                  }
                  switch (token) {
                      case 22:
                          return !inErrorRecovery;
                      case 14:
                      case 98:
                      case 104:
                      case 83:
                      case 69:
                      case 84:
                      case 75:
                      case 100:
                      case 82:
                      case 71:
                      case 66:
                      case 90:
                      case 101:
                      case 92:
                      case 94:
                      case 96:
                      case 72:
                      case 68:
                      case 81:
                          return true;
                      case 70:
                          var isConstEnum = lookAhead(nextTokenIsEnumKeyword);
                          return !isConstEnum;
                      case 103:
                      case 117:
                      case 118:
                      case 77:
                      case 124:
                          if (isDeclarationStart()) {
                              return false;
                          }
                      case 108:
                      case 106:
                      case 107:
                      case 109:
                          if (lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine)) {
                              return false;
                          }
                      default:
                          return isStartOfExpression();
                  }
              }
              function nextTokenIsEnumKeyword() {
                  nextToken();
                  return token === 77;
              }
              function nextTokenIsIdentifierOrKeywordOnSameLine() {
                  nextToken();
                  return isIdentifierOrKeyword() && !scanner.hasPrecedingLineBreak();
              }
              function parseStatement() {
                  switch (token) {
                      case 14:
                          return parseBlock(false, false);
                      case 98:
                      case 70:
                          return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
                      case 83:
                          return parseFunctionDeclaration(scanner.getStartPos(), undefined, undefined);
                      case 69:
                          return parseClassDeclaration(scanner.getStartPos(), undefined, undefined);
                      case 22:
                          return parseEmptyStatement();
                      case 84:
                          return parseIfStatement();
                      case 75:
                          return parseDoStatement();
                      case 100:
                          return parseWhileStatement();
                      case 82:
                          return parseForOrForInOrForOfStatement();
                      case 71:
                          return parseBreakOrContinueStatement(190);
                      case 66:
                          return parseBreakOrContinueStatement(191);
                      case 90:
                          return parseReturnStatement();
                      case 101:
                          return parseWithStatement();
                      case 92:
                          return parseSwitchStatement();
                      case 94:
                          return parseThrowStatement();
                      case 96:
                      case 68:
                      case 81:
                          return parseTryStatement();
                      case 72:
                          return parseDebuggerStatement();
                      case 104:
                          if (isLetDeclaration()) {
                              return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
                          }
                      default:
                          if (ts.isModifier(token) || token === 52) {
                              var result = tryParse(parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers);
                              if (result) {
                                  return result;
                              }
                          }
                          return parseExpressionOrLabeledStatement();
                  }
              }
              function parseVariableStatementOrFunctionDeclarationOrClassDeclarationWithDecoratorsOrModifiers() {
                  var start = scanner.getStartPos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  switch (token) {
                      case 70:
                          var nextTokenIsEnum = lookAhead(nextTokenIsEnumKeyword);
                          if (nextTokenIsEnum) {
                              return undefined;
                          }
                          return parseVariableStatement(start, decorators, modifiers);
                      case 104:
                          if (!isLetDeclaration()) {
                              return undefined;
                          }
                          return parseVariableStatement(start, decorators, modifiers);
                      case 98:
                          return parseVariableStatement(start, decorators, modifiers);
                      case 83:
                          return parseFunctionDeclaration(start, decorators, modifiers);
                      case 69:
                          return parseClassDeclaration(start, decorators, modifiers);
                  }
                  return undefined;
              }
              function parseFunctionBlockOrSemicolon(isGenerator, diagnosticMessage) {
                  if (token !== 14 && canParseSemicolon()) {
                      parseSemicolon();
                      return;
                  }
                  return parseFunctionBlock(isGenerator, false, diagnosticMessage);
              }
              function parseArrayBindingElement() {
                  if (token === 23) {
                      return createNode(176);
                  }
                  var node = createNode(153);
                  node.dotDotDotToken = parseOptionalToken(21);
                  node.name = parseIdentifierOrPattern();
                  node.initializer = parseInitializer(false);
                  return finishNode(node);
              }
              function parseObjectBindingElement() {
                  var node = createNode(153);
                  var tokenIsIdentifier = isIdentifier();
                  var propertyName = parsePropertyName();
                  if (tokenIsIdentifier && token !== 51) {
                      node.name = propertyName;
                  }
                  else {
                      parseExpected(51);
                      node.propertyName = propertyName;
                      node.name = parseIdentifierOrPattern();
                  }
                  node.initializer = parseInitializer(false);
                  return finishNode(node);
              }
              function parseObjectBindingPattern() {
                  var node = createNode(151);
                  parseExpected(14);
                  node.elements = parseDelimitedList(10, parseObjectBindingElement);
                  parseExpected(15);
                  return finishNode(node);
              }
              function parseArrayBindingPattern() {
                  var node = createNode(152);
                  parseExpected(18);
                  node.elements = parseDelimitedList(11, parseArrayBindingElement);
                  parseExpected(19);
                  return finishNode(node);
              }
              function isIdentifierOrPattern() {
                  return token === 14 || token === 18 || isIdentifier();
              }
              function parseIdentifierOrPattern() {
                  if (token === 18) {
                      return parseArrayBindingPattern();
                  }
                  if (token === 14) {
                      return parseObjectBindingPattern();
                  }
                  return parseIdentifier();
              }
              function parseVariableDeclaration() {
                  var node = createNode(199);
                  node.name = parseIdentifierOrPattern();
                  node.type = parseTypeAnnotation();
                  if (!isInOrOfKeyword(token)) {
                      node.initializer = parseInitializer(false);
                  }
                  return finishNode(node);
              }
              function parseVariableDeclarationList(inForStatementInitializer) {
                  var node = createNode(200);
                  switch (token) {
                      case 98:
                          break;
                      case 104:
                          node.flags |= 4096;
                          break;
                      case 70:
                          node.flags |= 8192;
                          break;
                      default:
                          ts.Debug.fail();
                  }
                  nextToken();
                  if (token === 126 && lookAhead(canFollowContextualOfKeyword)) {
                      node.declarations = createMissingList();
                  }
                  else {
                      var savedDisallowIn = inDisallowInContext();
                      setDisallowInContext(inForStatementInitializer);
                      node.declarations = parseDelimitedList(9, parseVariableDeclaration);
                      setDisallowInContext(savedDisallowIn);
                  }
                  return finishNode(node);
              }
              function canFollowContextualOfKeyword() {
                  return nextTokenIsIdentifier() && nextToken() === 17;
              }
              function parseVariableStatement(fullStart, decorators, modifiers) {
                  var node = createNode(181, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.declarationList = parseVariableDeclarationList(false);
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseFunctionDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(201, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(83);
                  node.asteriskToken = parseOptionalToken(35);
                  node.name = node.flags & 256 ? parseOptionalIdentifier() : parseIdentifier();
                  fillSignature(51, !!node.asteriskToken, false, node);
                  node.body = parseFunctionBlockOrSemicolon(!!node.asteriskToken, ts.Diagnostics.or_expected);
                  return finishNode(node);
              }
              function parseConstructorDeclaration(pos, decorators, modifiers) {
                  var node = createNode(136, pos);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(114);
                  fillSignature(51, false, false, node);
                  node.body = parseFunctionBlockOrSemicolon(false, ts.Diagnostics.or_expected);
                  return finishNode(node);
              }
              function parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, diagnosticMessage) {
                  var method = createNode(135, fullStart);
                  method.decorators = decorators;
                  setModifiers(method, modifiers);
                  method.asteriskToken = asteriskToken;
                  method.name = name;
                  method.questionToken = questionToken;
                  fillSignature(51, !!asteriskToken, false, method);
                  method.body = parseFunctionBlockOrSemicolon(!!asteriskToken, diagnosticMessage);
                  return finishNode(method);
              }
              function parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken) {
                  var property = createNode(133, fullStart);
                  property.decorators = decorators;
                  setModifiers(property, modifiers);
                  property.name = name;
                  property.questionToken = questionToken;
                  property.type = parseTypeAnnotation();
                  property.initializer = allowInAnd(parseNonParameterInitializer);
                  parseSemicolon();
                  return finishNode(property);
              }
              function parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers) {
                  var asteriskToken = parseOptionalToken(35);
                  var name = parsePropertyName();
                  var questionToken = parseOptionalToken(50);
                  if (asteriskToken || token === 16 || token === 24) {
                      return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, ts.Diagnostics.or_expected);
                  }
                  else {
                      return parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken);
                  }
              }
              function parseNonParameterInitializer() {
                  return parseInitializer(false);
              }
              function parseAccessorDeclaration(kind, fullStart, decorators, modifiers) {
                  var node = createNode(kind, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.name = parsePropertyName();
                  fillSignature(51, false, false, node);
                  node.body = parseFunctionBlockOrSemicolon(false);
                  return finishNode(node);
              }
              function isClassMemberModifier(idToken) {
                  switch (idToken) {
                      case 108:
                      case 106:
                      case 107:
                      case 109:
                          return true;
                      default:
                          return false;
                  }
              }
              function isClassMemberStart() {
                  var idToken;
                  if (token === 52) {
                      return true;
                  }
                  while (ts.isModifier(token)) {
                      idToken = token;
                      if (isClassMemberModifier(idToken)) {
                          return true;
                      }
                      nextToken();
                  }
                  if (token === 35) {
                      return true;
                  }
                  if (isLiteralPropertyName()) {
                      idToken = token;
                      nextToken();
                  }
                  if (token === 18) {
                      return true;
                  }
                  if (idToken !== undefined) {
                      if (!ts.isKeyword(idToken) || idToken === 121 || idToken === 116) {
                          return true;
                      }
                      switch (token) {
                          case 16:
                          case 24:
                          case 51:
                          case 53:
                          case 50:
                              return true;
                          default:
                              return canParseSemicolon();
                      }
                  }
                  return false;
              }
              function parseDecorators() {
                  var decorators;
                  while (true) {
                      var decoratorStart = getNodePos();
                      if (!parseOptional(52)) {
                          break;
                      }
                      if (!decorators) {
                          decorators = [];
                          decorators.pos = scanner.getStartPos();
                      }
                      var decorator = createNode(131, decoratorStart);
                      decorator.expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher);
                      decorators.push(finishNode(decorator));
                  }
                  if (decorators) {
                      decorators.end = getNodeEnd();
                  }
                  return decorators;
              }
              function parseModifiers() {
                  var flags = 0;
                  var modifiers;
                  while (true) {
                      var modifierStart = scanner.getStartPos();
                      var modifierKind = token;
                      if (!parseAnyContextualModifier()) {
                          break;
                      }
                      if (!modifiers) {
                          modifiers = [];
                          modifiers.pos = modifierStart;
                      }
                      flags |= ts.modifierToFlag(modifierKind);
                      modifiers.push(finishNode(createNode(modifierKind, modifierStart)));
                  }
                  if (modifiers) {
                      modifiers.flags = flags;
                      modifiers.end = scanner.getStartPos();
                  }
                  return modifiers;
              }
              function parseClassElement() {
                  if (token === 22) {
                      var result = createNode(179);
                      nextToken();
                      return finishNode(result);
                  }
                  var fullStart = getNodePos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
                  if (accessor) {
                      return accessor;
                  }
                  if (token === 114) {
                      return parseConstructorDeclaration(fullStart, decorators, modifiers);
                  }
                  if (isIndexSignature()) {
                      return parseIndexSignatureDeclaration(fullStart, decorators, modifiers);
                  }
                  if (isIdentifierOrKeyword() ||
                      token === 8 ||
                      token === 7 ||
                      token === 35 ||
                      token === 18) {
                      return parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers);
                  }
                  if (decorators) {
                      var name_3 = createMissingNode(65, true, ts.Diagnostics.Declaration_expected);
                      return parsePropertyDeclaration(fullStart, decorators, modifiers, name_3, undefined);
                  }
                  ts.Debug.fail("Should not have attempted to parse class member declaration.");
              }
              function parseClassExpression() {
                  return parseClassDeclarationOrExpression(scanner.getStartPos(), undefined, undefined, 175);
              }
              function parseClassDeclaration(fullStart, decorators, modifiers) {
                  return parseClassDeclarationOrExpression(fullStart, decorators, modifiers, 202);
              }
              function parseClassDeclarationOrExpression(fullStart, decorators, modifiers, kind) {
                  var savedStrictModeContext = inStrictModeContext();
                  setStrictModeContext(true);
                  var node = createNode(kind, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(69);
                  node.name = parseOptionalIdentifier();
                  node.typeParameters = parseTypeParameters();
                  node.heritageClauses = parseHeritageClauses(true);
                  if (parseExpected(14)) {
                      node.members = inGeneratorParameterContext()
                          ? doOutsideOfYieldContext(parseClassMembers)
                          : parseClassMembers();
                      parseExpected(15);
                  }
                  else {
                      node.members = createMissingList();
                  }
                  var finishedNode = finishNode(node);
                  setStrictModeContext(savedStrictModeContext);
                  return finishedNode;
              }
              function parseHeritageClauses(isClassHeritageClause) {
                  // ClassTail[Yield,GeneratorParameter] : See 14.5
                  //      [~GeneratorParameter]ClassHeritage[?Yield]opt { ClassBody[?Yield]opt }
                  //      [+GeneratorParameter] ClassHeritageopt { ClassBodyopt }
                  if (isHeritageClause()) {
                      return isClassHeritageClause && inGeneratorParameterContext()
                          ? doOutsideOfYieldContext(parseHeritageClausesWorker)
                          : parseHeritageClausesWorker();
                  }
                  return undefined;
              }
              function parseHeritageClausesWorker() {
                  return parseList(19, false, parseHeritageClause);
              }
              function parseHeritageClause() {
                  if (token === 79 || token === 102) {
                      var node = createNode(223);
                      node.token = token;
                      nextToken();
                      node.types = parseDelimitedList(8, parseExpressionWithTypeArguments);
                      return finishNode(node);
                  }
                  return undefined;
              }
              function parseExpressionWithTypeArguments() {
                  var node = createNode(177);
                  node.expression = parseLeftHandSideExpressionOrHigher();
                  if (token === 24) {
                      node.typeArguments = parseBracketedList(17, parseType, 24, 25);
                  }
                  return finishNode(node);
              }
              function isHeritageClause() {
                  return token === 79 || token === 102;
              }
              function parseClassMembers() {
                  return parseList(6, false, parseClassElement);
              }
              function parseInterfaceDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(203, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(103);
                  node.name = parseIdentifier();
                  node.typeParameters = parseTypeParameters();
                  node.heritageClauses = parseHeritageClauses(false);
                  node.members = parseObjectTypeMembers();
                  return finishNode(node);
              }
              function parseTypeAliasDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(204, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(124);
                  node.name = parseIdentifier();
                  parseExpected(53);
                  node.type = parseType();
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseEnumMember() {
                  var node = createNode(227, scanner.getStartPos());
                  node.name = parsePropertyName();
                  node.initializer = allowInAnd(parseNonParameterInitializer);
                  return finishNode(node);
              }
              function parseEnumDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(205, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  parseExpected(77);
                  node.name = parseIdentifier();
                  if (parseExpected(14)) {
                      node.members = parseDelimitedList(7, parseEnumMember);
                      parseExpected(15);
                  }
                  else {
                      node.members = createMissingList();
                  }
                  return finishNode(node);
              }
              function parseModuleBlock() {
                  var node = createNode(207, scanner.getStartPos());
                  if (parseExpected(14)) {
                      node.statements = parseList(1, false, parseModuleElement);
                      parseExpected(15);
                  }
                  else {
                      node.statements = createMissingList();
                  }
                  return finishNode(node);
              }
              function parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags) {
                  var node = createNode(206, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.flags |= flags;
                  node.name = parseIdentifier();
                  node.body = parseOptional(20)
                      ? parseModuleOrNamespaceDeclaration(getNodePos(), undefined, undefined, 1)
                      : parseModuleBlock();
                  return finishNode(node);
              }
              function parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(206, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  node.name = parseLiteralNode(true);
                  node.body = parseModuleBlock();
                  return finishNode(node);
              }
              function parseModuleDeclaration(fullStart, decorators, modifiers) {
                  var flags = modifiers ? modifiers.flags : 0;
                  if (parseOptional(118)) {
                      flags |= 32768;
                  }
                  else {
                      parseExpected(117);
                      if (token === 8) {
                          return parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers);
                      }
                  }
                  return parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags);
              }
              function isExternalModuleReference() {
                  return token === 119 &&
                      lookAhead(nextTokenIsOpenParen);
              }
              function nextTokenIsOpenParen() {
                  return nextToken() === 16;
              }
              function nextTokenIsCommaOrFromKeyword() {
                  nextToken();
                  return token === 23 ||
                      token === 125;
              }
              function parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers) {
                  parseExpected(85);
                  var afterImportPos = scanner.getStartPos();
                  var identifier;
                  if (isIdentifier()) {
                      identifier = parseIdentifier();
                      if (token !== 23 && token !== 125) {
                          var importEqualsDeclaration = createNode(209, fullStart);
                          importEqualsDeclaration.decorators = decorators;
                          setModifiers(importEqualsDeclaration, modifiers);
                          importEqualsDeclaration.name = identifier;
                          parseExpected(53);
                          importEqualsDeclaration.moduleReference = parseModuleReference();
                          parseSemicolon();
                          return finishNode(importEqualsDeclaration);
                      }
                  }
                  var importDeclaration = createNode(210, fullStart);
                  importDeclaration.decorators = decorators;
                  setModifiers(importDeclaration, modifiers);
                  if (identifier ||
                      token === 35 ||
                      token === 14) {
                      importDeclaration.importClause = parseImportClause(identifier, afterImportPos);
                      parseExpected(125);
                  }
                  importDeclaration.moduleSpecifier = parseModuleSpecifier();
                  parseSemicolon();
                  return finishNode(importDeclaration);
              }
              function parseImportClause(identifier, fullStart) {
                  //ImportClause:
                  //  ImportedDefaultBinding
                  //  NameSpaceImport
                  //  NamedImports
                  //  ImportedDefaultBinding, NameSpaceImport
                  //  ImportedDefaultBinding, NamedImports
                  var importClause = createNode(211, fullStart);
                  if (identifier) {
                      importClause.name = identifier;
                  }
                  if (!importClause.name ||
                      parseOptional(23)) {
                      importClause.namedBindings = token === 35 ? parseNamespaceImport() : parseNamedImportsOrExports(213);
                  }
                  return finishNode(importClause);
              }
              function parseModuleReference() {
                  return isExternalModuleReference()
                      ? parseExternalModuleReference()
                      : parseEntityName(false);
              }
              function parseExternalModuleReference() {
                  var node = createNode(220);
                  parseExpected(119);
                  parseExpected(16);
                  node.expression = parseModuleSpecifier();
                  parseExpected(17);
                  return finishNode(node);
              }
              function parseModuleSpecifier() {
                  var result = parseExpression();
                  if (result.kind === 8) {
                      internIdentifier(result.text);
                  }
                  return result;
              }
              function parseNamespaceImport() {
                  var namespaceImport = createNode(212);
                  parseExpected(35);
                  parseExpected(111);
                  namespaceImport.name = parseIdentifier();
                  return finishNode(namespaceImport);
              }
              function parseNamedImportsOrExports(kind) {
                  var node = createNode(kind);
                  node.elements = parseBracketedList(20, kind === 213 ? parseImportSpecifier : parseExportSpecifier, 14, 15);
                  return finishNode(node);
              }
              function parseExportSpecifier() {
                  return parseImportOrExportSpecifier(218);
              }
              function parseImportSpecifier() {
                  return parseImportOrExportSpecifier(214);
              }
              function parseImportOrExportSpecifier(kind) {
                  var node = createNode(kind);
                  var checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
                  var checkIdentifierStart = scanner.getTokenPos();
                  var checkIdentifierEnd = scanner.getTextPos();
                  var identifierName = parseIdentifierName();
                  if (token === 111) {
                      node.propertyName = identifierName;
                      parseExpected(111);
                      checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
                      checkIdentifierStart = scanner.getTokenPos();
                      checkIdentifierEnd = scanner.getTextPos();
                      node.name = parseIdentifierName();
                  }
                  else {
                      node.name = identifierName;
                  }
                  if (kind === 214 && checkIdentifierIsKeyword) {
                      parseErrorAtPosition(checkIdentifierStart, checkIdentifierEnd - checkIdentifierStart, ts.Diagnostics.Identifier_expected);
                  }
                  return finishNode(node);
              }
              function parseExportDeclaration(fullStart, decorators, modifiers) {
                  var node = createNode(216, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  if (parseOptional(35)) {
                      parseExpected(125);
                      node.moduleSpecifier = parseModuleSpecifier();
                  }
                  else {
                      node.exportClause = parseNamedImportsOrExports(217);
                      if (parseOptional(125)) {
                          node.moduleSpecifier = parseModuleSpecifier();
                      }
                  }
                  parseSemicolon();
                  return finishNode(node);
              }
              function parseExportAssignment(fullStart, decorators, modifiers) {
                  var node = createNode(215, fullStart);
                  node.decorators = decorators;
                  setModifiers(node, modifiers);
                  if (parseOptional(53)) {
                      node.isExportEquals = true;
                  }
                  else {
                      parseExpected(73);
                  }
                  node.expression = parseAssignmentExpressionOrHigher();
                  parseSemicolon();
                  return finishNode(node);
              }
              function isLetDeclaration() {
                  return inStrictModeContext() || lookAhead(nextTokenIsIdentifierOrStartOfDestructuringOnTheSameLine);
              }
              function isDeclarationStart(followsModifier) {
                  switch (token) {
                      case 98:
                      case 70:
                      case 83:
                          return true;
                      case 104:
                          return isLetDeclaration();
                      case 69:
                      case 103:
                      case 77:
                      case 124:
                          return lookAhead(nextTokenIsIdentifierOrKeyword);
                      case 85:
                          return lookAhead(nextTokenCanFollowImportKeyword);
                      case 117:
                      case 118:
                          return lookAhead(nextTokenIsIdentifierOrKeywordOrStringLiteral);
                      case 78:
                          return lookAhead(nextTokenCanFollowExportKeyword);
                      case 115:
                      case 108:
                      case 106:
                      case 107:
                      case 109:
                          return lookAhead(nextTokenIsDeclarationStart);
                      case 52:
                          return !followsModifier;
                  }
              }
              function isIdentifierOrKeyword() {
                  return token >= 65;
              }
              function nextTokenIsIdentifierOrKeyword() {
                  nextToken();
                  return isIdentifierOrKeyword();
              }
              function nextTokenIsIdentifierOrKeywordOrStringLiteral() {
                  nextToken();
                  return isIdentifierOrKeyword() || token === 8;
              }
              function nextTokenCanFollowImportKeyword() {
                  nextToken();
                  return isIdentifierOrKeyword() || token === 8 ||
                      token === 35 || token === 14;
              }
              function nextTokenCanFollowExportKeyword() {
                  nextToken();
                  return token === 53 || token === 35 ||
                      token === 14 || token === 73 || isDeclarationStart(true);
              }
              function nextTokenIsDeclarationStart() {
                  nextToken();
                  return isDeclarationStart(true);
              }
              function nextTokenIsAsKeyword() {
                  return nextToken() === 111;
              }
              function parseDeclaration() {
                  var fullStart = getNodePos();
                  var decorators = parseDecorators();
                  var modifiers = parseModifiers();
                  if (token === 78) {
                      nextToken();
                      if (token === 73 || token === 53) {
                          return parseExportAssignment(fullStart, decorators, modifiers);
                      }
                      if (token === 35 || token === 14) {
                          return parseExportDeclaration(fullStart, decorators, modifiers);
                      }
                  }
                  switch (token) {
                      case 98:
                      case 104:
                      case 70:
                          return parseVariableStatement(fullStart, decorators, modifiers);
                      case 83:
                          return parseFunctionDeclaration(fullStart, decorators, modifiers);
                      case 69:
                          return parseClassDeclaration(fullStart, decorators, modifiers);
                      case 103:
                          return parseInterfaceDeclaration(fullStart, decorators, modifiers);
                      case 124:
                          return parseTypeAliasDeclaration(fullStart, decorators, modifiers);
                      case 77:
                          return parseEnumDeclaration(fullStart, decorators, modifiers);
                      case 117:
                      case 118:
                          return parseModuleDeclaration(fullStart, decorators, modifiers);
                      case 85:
                          return parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers);
                      default:
                          if (decorators) {
                              var node = createMissingNode(219, true, ts.Diagnostics.Declaration_expected);
                              node.pos = fullStart;
                              node.decorators = decorators;
                              setModifiers(node, modifiers);
                              return finishNode(node);
                          }
                          ts.Debug.fail("Mismatch between isDeclarationStart and parseDeclaration");
                  }
              }
              function isSourceElement(inErrorRecovery) {
                  return isDeclarationStart() || isStartOfStatement(inErrorRecovery);
              }
              function parseSourceElement() {
                  return parseSourceElementOrModuleElement();
              }
              function parseModuleElement() {
                  return parseSourceElementOrModuleElement();
              }
              function parseSourceElementOrModuleElement() {
                  return isDeclarationStart()
                      ? parseDeclaration()
                      : parseStatement();
              }
              function processReferenceComments(sourceFile) {
                  var triviaScanner = ts.createScanner(sourceFile.languageVersion, false, sourceText);
                  var referencedFiles = [];
                  var amdDependencies = [];
                  var amdModuleName;
                  while (true) {
                      var kind = triviaScanner.scan();
                      if (kind === 5 || kind === 4 || kind === 3) {
                          continue;
                      }
                      if (kind !== 2) {
                          break;
                      }
                      var range = { pos: triviaScanner.getTokenPos(), end: triviaScanner.getTextPos(), kind: triviaScanner.getToken() };
                      var comment = sourceText.substring(range.pos, range.end);
                      var referencePathMatchResult = ts.getFileReferenceFromReferencePath(comment, range);
                      if (referencePathMatchResult) {
                          var fileReference = referencePathMatchResult.fileReference;
                          sourceFile.hasNoDefaultLib = referencePathMatchResult.isNoDefaultLib;
                          var diagnosticMessage = referencePathMatchResult.diagnosticMessage;
                          if (fileReference) {
                              referencedFiles.push(fileReference);
                          }
                          if (diagnosticMessage) {
                              sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, diagnosticMessage));
                          }
                      }
                      else {
                          var amdModuleNameRegEx = /^\/\/\/\s*<amd-module\s+name\s*=\s*('|")(.+?)\1/gim;
                          var amdModuleNameMatchResult = amdModuleNameRegEx.exec(comment);
                          if (amdModuleNameMatchResult) {
                              if (amdModuleName) {
                                  sourceFile.parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, ts.Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments));
                              }
                              amdModuleName = amdModuleNameMatchResult[2];
                          }
                          var amdDependencyRegEx = /^\/\/\/\s*<amd-dependency\s/gim;
                          var pathRegex = /\spath\s*=\s*('|")(.+?)\1/gim;
                          var nameRegex = /\sname\s*=\s*('|")(.+?)\1/gim;
                          var amdDependencyMatchResult = amdDependencyRegEx.exec(comment);
                          if (amdDependencyMatchResult) {
                              var pathMatchResult = pathRegex.exec(comment);
                              var nameMatchResult = nameRegex.exec(comment);
                              if (pathMatchResult) {
                                  var amdDependency = { path: pathMatchResult[2], name: nameMatchResult ? nameMatchResult[2] : undefined };
                                  amdDependencies.push(amdDependency);
                              }
                          }
                      }
                  }
                  sourceFile.referencedFiles = referencedFiles;
                  sourceFile.amdDependencies = amdDependencies;
                  sourceFile.amdModuleName = amdModuleName;
              }
              function setExternalModuleIndicator(sourceFile) {
                  sourceFile.externalModuleIndicator = ts.forEach(sourceFile.statements, function (node) {
                      return node.flags & 1
                          || node.kind === 209 && node.moduleReference.kind === 220
                          || node.kind === 210
                          || node.kind === 215
                          || node.kind === 216
                          ? node
                          : undefined;
                  });
              }
          })(Parser || (Parser = {}));
          var IncrementalParser;
          (function (IncrementalParser) {
              function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
                  aggressiveChecks = aggressiveChecks || ts.Debug.shouldAssert(2);
                  checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks);
                  if (ts.textChangeRangeIsUnchanged(textChangeRange)) {
                      return sourceFile;
                  }
                  if (sourceFile.statements.length === 0) {
                      return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, undefined, true);
                  }
                  var incrementalSourceFile = sourceFile;
                  ts.Debug.assert(!incrementalSourceFile.hasBeenIncrementallyParsed);
                  incrementalSourceFile.hasBeenIncrementallyParsed = true;
                  var oldText = sourceFile.text;
                  var syntaxCursor = createSyntaxCursor(sourceFile);
                  var changeRange = extendToAffectedRange(sourceFile, textChangeRange);
                  checkChangeRange(sourceFile, newText, changeRange, aggressiveChecks);
                  ts.Debug.assert(changeRange.span.start <= textChangeRange.span.start);
                  ts.Debug.assert(ts.textSpanEnd(changeRange.span) === ts.textSpanEnd(textChangeRange.span));
                  ts.Debug.assert(ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)) === ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)));
                  var delta = ts.textChangeRangeNewSpan(changeRange).length - changeRange.span.length;
                  updateTokenPositionsAndMarkElements(incrementalSourceFile, changeRange.span.start, ts.textSpanEnd(changeRange.span), ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)), delta, oldText, newText, aggressiveChecks);
                  var result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, true);
                  return result;
              }
              IncrementalParser.updateSourceFile = updateSourceFile;
              function moveElementEntirelyPastChangeRange(element, isArray, delta, oldText, newText, aggressiveChecks) {
                  if (isArray) {
                      visitArray(element);
                  }
                  else {
                      visitNode(element);
                  }
                  return;
                  function visitNode(node) {
                      if (aggressiveChecks && shouldCheckNode(node)) {
                          var text = oldText.substring(node.pos, node.end);
                      }
                      node._children = undefined;
                      node.pos += delta;
                      node.end += delta;
                      if (aggressiveChecks && shouldCheckNode(node)) {
                          ts.Debug.assert(text === newText.substring(node.pos, node.end));
                      }
                      forEachChild(node, visitNode, visitArray);
                      checkNodePositions(node, aggressiveChecks);
                  }
                  function visitArray(array) {
                      array._children = undefined;
                      array.pos += delta;
                      array.end += delta;
                      for (var _i = 0; _i < array.length; _i++) {
                          var node = array[_i];
                          visitNode(node);
                      }
                  }
              }
              function shouldCheckNode(node) {
                  switch (node.kind) {
                      case 8:
                      case 7:
                      case 65:
                          return true;
                  }
                  return false;
              }
              function adjustIntersectingElement(element, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta) {
                  ts.Debug.assert(element.end >= changeStart, "Adjusting an element that was entirely before the change range");
                  ts.Debug.assert(element.pos <= changeRangeOldEnd, "Adjusting an element that was entirely after the change range");
                  ts.Debug.assert(element.pos <= element.end);
                  element.pos = Math.min(element.pos, changeRangeNewEnd);
                  if (element.end >= changeRangeOldEnd) {
                      element.end += delta;
                  }
                  else {
                      element.end = Math.min(element.end, changeRangeNewEnd);
                  }
                  ts.Debug.assert(element.pos <= element.end);
                  if (element.parent) {
                      ts.Debug.assert(element.pos >= element.parent.pos);
                      ts.Debug.assert(element.end <= element.parent.end);
                  }
              }
              function checkNodePositions(node, aggressiveChecks) {
                  if (aggressiveChecks) {
                      var pos = node.pos;
                      forEachChild(node, function (child) {
                          ts.Debug.assert(child.pos >= pos);
                          pos = child.end;
                      });
                      ts.Debug.assert(pos <= node.end);
                  }
              }
              function updateTokenPositionsAndMarkElements(sourceFile, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta, oldText, newText, aggressiveChecks) {
                  visitNode(sourceFile);
                  return;
                  function visitNode(child) {
                      ts.Debug.assert(child.pos <= child.end);
                      if (child.pos > changeRangeOldEnd) {
                          moveElementEntirelyPastChangeRange(child, false, delta, oldText, newText, aggressiveChecks);
                          return;
                      }
                      var fullEnd = child.end;
                      if (fullEnd >= changeStart) {
                          child.intersectsChange = true;
                          child._children = undefined;
                          adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
                          forEachChild(child, visitNode, visitArray);
                          checkNodePositions(child, aggressiveChecks);
                          return;
                      }
                      ts.Debug.assert(fullEnd < changeStart);
                  }
                  function visitArray(array) {
                      ts.Debug.assert(array.pos <= array.end);
                      if (array.pos > changeRangeOldEnd) {
                          moveElementEntirelyPastChangeRange(array, true, delta, oldText, newText, aggressiveChecks);
                          return;
                      }
                      var fullEnd = array.end;
                      if (fullEnd >= changeStart) {
                          array.intersectsChange = true;
                          array._children = undefined;
                          adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
                          for (var _i = 0; _i < array.length; _i++) {
                              var node = array[_i];
                              visitNode(node);
                          }
                          return;
                      }
                      ts.Debug.assert(fullEnd < changeStart);
                  }
              }
              function extendToAffectedRange(sourceFile, changeRange) {
                  var maxLookahead = 1;
                  var start = changeRange.span.start;
                  for (var i = 0; start > 0 && i <= maxLookahead; i++) {
                      var nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start);
                      ts.Debug.assert(nearestNode.pos <= start);
                      var position = nearestNode.pos;
                      start = Math.max(0, position - 1);
                  }
                  var finalSpan = ts.createTextSpanFromBounds(start, ts.textSpanEnd(changeRange.span));
                  var finalLength = changeRange.newLength + (changeRange.span.start - start);
                  return ts.createTextChangeRange(finalSpan, finalLength);
              }
              function findNearestNodeStartingBeforeOrAtPosition(sourceFile, position) {
                  var bestResult = sourceFile;
                  var lastNodeEntirelyBeforePosition;
                  forEachChild(sourceFile, visit);
                  if (lastNodeEntirelyBeforePosition) {
                      var lastChildOfLastEntireNodeBeforePosition = getLastChild(lastNodeEntirelyBeforePosition);
                      if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) {
                          bestResult = lastChildOfLastEntireNodeBeforePosition;
                      }
                  }
                  return bestResult;
                  function getLastChild(node) {
                      while (true) {
                          var lastChild = getLastChildWorker(node);
                          if (lastChild) {
                              node = lastChild;
                          }
                          else {
                              return node;
                          }
                      }
                  }
                  function getLastChildWorker(node) {
                      var last = undefined;
                      forEachChild(node, function (child) {
                          if (ts.nodeIsPresent(child)) {
                              last = child;
                          }
                      });
                      return last;
                  }
                  function visit(child) {
                      if (ts.nodeIsMissing(child)) {
                          return;
                      }
                      if (child.pos <= position) {
                          if (child.pos >= bestResult.pos) {
                              bestResult = child;
                          }
                          if (position < child.end) {
                              forEachChild(child, visit);
                              return true;
                          }
                          else {
                              ts.Debug.assert(child.end <= position);
                              lastNodeEntirelyBeforePosition = child;
                          }
                      }
                      else {
                          ts.Debug.assert(child.pos > position);
                          return true;
                      }
                  }
              }
              function checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks) {
                  var oldText = sourceFile.text;
                  if (textChangeRange) {
                      ts.Debug.assert((oldText.length - textChangeRange.span.length + textChangeRange.newLength) === newText.length);
                      if (aggressiveChecks || ts.Debug.shouldAssert(3)) {
                          var oldTextPrefix = oldText.substr(0, textChangeRange.span.start);
                          var newTextPrefix = newText.substr(0, textChangeRange.span.start);
                          ts.Debug.assert(oldTextPrefix === newTextPrefix);
                          var oldTextSuffix = oldText.substring(ts.textSpanEnd(textChangeRange.span), oldText.length);
                          var newTextSuffix = newText.substring(ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)), newText.length);
                          ts.Debug.assert(oldTextSuffix === newTextSuffix);
                      }
                  }
              }
              function createSyntaxCursor(sourceFile) {
                  var currentArray = sourceFile.statements;
                  var currentArrayIndex = 0;
                  ts.Debug.assert(currentArrayIndex < currentArray.length);
                  var current = currentArray[currentArrayIndex];
                  var lastQueriedPosition = -1;
                  return {
                      currentNode: function (position) {
                          if (position !== lastQueriedPosition) {
                              if (current && current.end === position && currentArrayIndex < (currentArray.length - 1)) {
                                  currentArrayIndex++;
                                  current = currentArray[currentArrayIndex];
                              }
                              if (!current || current.pos !== position) {
                                  findHighestListElementThatStartsAtPosition(position);
                              }
                          }
                          lastQueriedPosition = position;
                          ts.Debug.assert(!current || current.pos === position);
                          return current;
                      }
                  };
                  function findHighestListElementThatStartsAtPosition(position) {
                      currentArray = undefined;
                      currentArrayIndex = -1;
                      current = undefined;
                      forEachChild(sourceFile, visitNode, visitArray);
                      return;
                      function visitNode(node) {
                          if (position >= node.pos && position < node.end) {
                              forEachChild(node, visitNode, visitArray);
                              return true;
                          }
                          return false;
                      }
                      function visitArray(array) {
                          if (position >= array.pos && position < array.end) {
                              for (var i = 0, n = array.length; i < n; i++) {
                                  var child = array[i];
                                  if (child) {
                                      if (child.pos === position) {
                                          currentArray = array;
                                          currentArrayIndex = i;
                                          current = child;
                                          return true;
                                      }
                                      else {
                                          if (child.pos < position && position < child.end) {
                                              forEachChild(child, visitNode, visitArray);
                                              return true;
                                          }
                                      }
                                  }
                              }
                          }
                          return false;
                      }
                  }
              }
          })(IncrementalParser || (IncrementalParser = {}));
      })(ts || (ts = {}));
      /// <reference path="binder.ts"/>
      var ts;
      (function (ts) {
          var nextSymbolId = 1;
          var nextNodeId = 1;
          var nextMergeId = 1;
          function getNodeId(node) {
              if (!node.id)
                  node.id = nextNodeId++;
              return node.id;
          }
          ts.getNodeId = getNodeId;
          ts.checkTime = 0;
          function getSymbolId(symbol) {
              if (!symbol.id) {
                  symbol.id = nextSymbolId++;
              }
              return symbol.id;
          }
          ts.getSymbolId = getSymbolId;
          function createTypeChecker(host, produceDiagnostics) {
              var Symbol = ts.objectAllocator.getSymbolConstructor();
              var Type = ts.objectAllocator.getTypeConstructor();
              var Signature = ts.objectAllocator.getSignatureConstructor();
              var typeCount = 0;
              var emptyArray = [];
              var emptySymbols = {};
              var compilerOptions = host.getCompilerOptions();
              var languageVersion = compilerOptions.target || 0;
              var emitResolver = createResolver();
              var undefinedSymbol = createSymbol(4 | 67108864, "undefined");
              var argumentsSymbol = createSymbol(4 | 67108864, "arguments");
              var checker = {
                  getNodeCount: function () { return ts.sum(host.getSourceFiles(), "nodeCount"); },
                  getIdentifierCount: function () { return ts.sum(host.getSourceFiles(), "identifierCount"); },
                  getSymbolCount: function () { return ts.sum(host.getSourceFiles(), "symbolCount"); },
                  getTypeCount: function () { return typeCount; },
                  isUndefinedSymbol: function (symbol) { return symbol === undefinedSymbol; },
                  isArgumentsSymbol: function (symbol) { return symbol === argumentsSymbol; },
                  getDiagnostics: getDiagnostics,
                  getGlobalDiagnostics: getGlobalDiagnostics,
                  getTypeOfSymbolAtLocation: getTypeOfSymbolAtLocation,
                  getDeclaredTypeOfSymbol: getDeclaredTypeOfSymbol,
                  getPropertiesOfType: getPropertiesOfType,
                  getPropertyOfType: getPropertyOfType,
                  getSignaturesOfType: getSignaturesOfType,
                  getIndexTypeOfType: getIndexTypeOfType,
                  getReturnTypeOfSignature: getReturnTypeOfSignature,
                  getSymbolsInScope: getSymbolsInScope,
                  getSymbolAtLocation: getSymbolAtLocation,
                  getShorthandAssignmentValueSymbol: getShorthandAssignmentValueSymbol,
                  getTypeAtLocation: getTypeAtLocation,
                  typeToString: typeToString,
                  getSymbolDisplayBuilder: getSymbolDisplayBuilder,
                  symbolToString: symbolToString,
                  getAugmentedPropertiesOfType: getAugmentedPropertiesOfType,
                  getRootSymbols: getRootSymbols,
                  getContextualType: getContextualType,
                  getFullyQualifiedName: getFullyQualifiedName,
                  getResolvedSignature: getResolvedSignature,
                  getConstantValue: getConstantValue,
                  isValidPropertyAccess: isValidPropertyAccess,
                  getSignatureFromDeclaration: getSignatureFromDeclaration,
                  isImplementationOfOverload: isImplementationOfOverload,
                  getAliasedSymbol: resolveAlias,
                  getEmitResolver: getEmitResolver,
                  getExportsOfModule: getExportsOfModuleAsArray
              };
              var unknownSymbol = createSymbol(4 | 67108864, "unknown");
              var resolvingSymbol = createSymbol(67108864, "__resolving__");
              var anyType = createIntrinsicType(1, "any");
              var stringType = createIntrinsicType(2, "string");
              var numberType = createIntrinsicType(4, "number");
              var booleanType = createIntrinsicType(8, "boolean");
              var esSymbolType = createIntrinsicType(1048576, "symbol");
              var voidType = createIntrinsicType(16, "void");
              var undefinedType = createIntrinsicType(32 | 262144, "undefined");
              var nullType = createIntrinsicType(64 | 262144, "null");
              var unknownType = createIntrinsicType(1, "unknown");
              var emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
              var anyFunctionType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
              var noConstraintType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
              var anySignature = createSignature(undefined, undefined, emptyArray, anyType, 0, false, false);
              var unknownSignature = createSignature(undefined, undefined, emptyArray, unknownType, 0, false, false);
              var globals = {};
              var globalArraySymbol;
              var globalESSymbolConstructorSymbol;
              var globalObjectType;
              var globalFunctionType;
              var globalArrayType;
              var globalStringType;
              var globalNumberType;
              var globalBooleanType;
              var globalRegExpType;
              var globalTemplateStringsArrayType;
              var globalESSymbolType;
              var globalIterableType;
              var anyArrayType;
              var getGlobalClassDecoratorType;
              var getGlobalParameterDecoratorType;
              var getGlobalPropertyDecoratorType;
              var getGlobalMethodDecoratorType;
              var tupleTypes = {};
              var unionTypes = {};
              var stringLiteralTypes = {};
              var emitExtends = false;
              var emitDecorate = false;
              var emitParam = false;
              var resolutionTargets = [];
              var resolutionResults = [];
              var mergedSymbols = [];
              var symbolLinks = [];
              var nodeLinks = [];
              var potentialThisCollisions = [];
              var diagnostics = ts.createDiagnosticCollection();
              var primitiveTypeInfo = {
                  "string": {
                      type: stringType,
                      flags: 258
                  },
                  "number": {
                      type: numberType,
                      flags: 132
                  },
                  "boolean": {
                      type: booleanType,
                      flags: 8
                  },
                  "symbol": {
                      type: esSymbolType,
                      flags: 1048576
                  }
              };
              function getEmitResolver(sourceFile) {
                  getDiagnostics(sourceFile);
                  return emitResolver;
              }
              function error(location, message, arg0, arg1, arg2) {
                  var diagnostic = location
                      ? ts.createDiagnosticForNode(location, message, arg0, arg1, arg2)
                      : ts.createCompilerDiagnostic(message, arg0, arg1, arg2);
                  diagnostics.add(diagnostic);
              }
              function createSymbol(flags, name) {
                  return new Symbol(flags, name);
              }
              function getExcludedSymbolFlags(flags) {
                  var result = 0;
                  if (flags & 2)
                      result |= 107455;
                  if (flags & 1)
                      result |= 107454;
                  if (flags & 4)
                      result |= 107455;
                  if (flags & 8)
                      result |= 107455;
                  if (flags & 16)
                      result |= 106927;
                  if (flags & 32)
                      result |= 899583;
                  if (flags & 64)
                      result |= 792992;
                  if (flags & 256)
                      result |= 899327;
                  if (flags & 128)
                      result |= 899967;
                  if (flags & 512)
                      result |= 106639;
                  if (flags & 8192)
                      result |= 99263;
                  if (flags & 32768)
                      result |= 41919;
                  if (flags & 65536)
                      result |= 74687;
                  if (flags & 262144)
                      result |= 530912;
                  if (flags & 524288)
                      result |= 793056;
                  if (flags & 8388608)
                      result |= 8388608;
                  return result;
              }
              function recordMergedSymbol(target, source) {
                  if (!source.mergeId)
                      source.mergeId = nextMergeId++;
                  mergedSymbols[source.mergeId] = target;
              }
              function cloneSymbol(symbol) {
                  var result = createSymbol(symbol.flags | 33554432, symbol.name);
                  result.declarations = symbol.declarations.slice(0);
                  result.parent = symbol.parent;
                  if (symbol.valueDeclaration)
                      result.valueDeclaration = symbol.valueDeclaration;
                  if (symbol.constEnumOnlyModule)
                      result.constEnumOnlyModule = true;
                  if (symbol.members)
                      result.members = cloneSymbolTable(symbol.members);
                  if (symbol.exports)
                      result.exports = cloneSymbolTable(symbol.exports);
                  recordMergedSymbol(result, symbol);
                  return result;
              }
              function mergeSymbol(target, source) {
                  if (!(target.flags & getExcludedSymbolFlags(source.flags))) {
                      if (source.flags & 512 && target.flags & 512 && target.constEnumOnlyModule && !source.constEnumOnlyModule) {
                          target.constEnumOnlyModule = false;
                      }
                      target.flags |= source.flags;
                      if (!target.valueDeclaration && source.valueDeclaration)
                          target.valueDeclaration = source.valueDeclaration;
                      ts.forEach(source.declarations, function (node) {
                          target.declarations.push(node);
                      });
                      if (source.members) {
                          if (!target.members)
                              target.members = {};
                          mergeSymbolTable(target.members, source.members);
                      }
                      if (source.exports) {
                          if (!target.exports)
                              target.exports = {};
                          mergeSymbolTable(target.exports, source.exports);
                      }
                      recordMergedSymbol(target, source);
                  }
                  else {
                      var message = target.flags & 2 || source.flags & 2
                          ? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts.Diagnostics.Duplicate_identifier_0;
                      ts.forEach(source.declarations, function (node) {
                          error(node.name ? node.name : node, message, symbolToString(source));
                      });
                      ts.forEach(target.declarations, function (node) {
                          error(node.name ? node.name : node, message, symbolToString(source));
                      });
                  }
              }
              function cloneSymbolTable(symbolTable) {
                  var result = {};
                  for (var id in symbolTable) {
                      if (ts.hasProperty(symbolTable, id)) {
                          result[id] = symbolTable[id];
                      }
                  }
                  return result;
              }
              function mergeSymbolTable(target, source) {
                  for (var id in source) {
                      if (ts.hasProperty(source, id)) {
                          if (!ts.hasProperty(target, id)) {
                              target[id] = source[id];
                          }
                          else {
                              var symbol = target[id];
                              if (!(symbol.flags & 33554432)) {
                                  target[id] = symbol = cloneSymbol(symbol);
                              }
                              mergeSymbol(symbol, source[id]);
                          }
                      }
                  }
              }
              function getSymbolLinks(symbol) {
                  if (symbol.flags & 67108864)
                      return symbol;
                  var id = getSymbolId(symbol);
                  return symbolLinks[id] || (symbolLinks[id] = {});
              }
              function getNodeLinks(node) {
                  var nodeId = getNodeId(node);
                  return nodeLinks[nodeId] || (nodeLinks[nodeId] = {});
              }
              function getSourceFile(node) {
                  return ts.getAncestor(node, 228);
              }
              function isGlobalSourceFile(node) {
                  return node.kind === 228 && !ts.isExternalModule(node);
              }
              function getSymbol(symbols, name, meaning) {
                  if (meaning && ts.hasProperty(symbols, name)) {
                      var symbol = symbols[name];
                      ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
                      if (symbol.flags & meaning) {
                          return symbol;
                      }
                      if (symbol.flags & 8388608) {
                          var target = resolveAlias(symbol);
                          if (target === unknownSymbol || target.flags & meaning) {
                              return symbol;
                          }
                      }
                  }
              }
              function isDefinedBefore(node1, node2) {
                  var file1 = ts.getSourceFileOfNode(node1);
                  var file2 = ts.getSourceFileOfNode(node2);
                  if (file1 === file2) {
                      return node1.pos <= node2.pos;
                  }
                  if (!compilerOptions.out) {
                      return true;
                  }
                  var sourceFiles = host.getSourceFiles();
                  return sourceFiles.indexOf(file1) <= sourceFiles.indexOf(file2);
              }
              function resolveName(location, name, meaning, nameNotFoundMessage, nameArg) {
                  var result;
                  var lastLocation;
                  var propertyWithInvalidInitializer;
                  var errorLocation = location;
                  var grandparent;
                  loop: while (location) {
                      if (location.locals && !isGlobalSourceFile(location)) {
                          if (result = getSymbol(location.locals, name, meaning)) {
                              break loop;
                          }
                      }
                      switch (location.kind) {
                          case 228:
                              if (!ts.isExternalModule(location))
                                  break;
                          case 206:
                              if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8914931)) {
                                  if (result.flags & meaning || !(result.flags & 8388608 && getDeclarationOfAliasSymbol(result).kind === 218)) {
                                      break loop;
                                  }
                                  result = undefined;
                              }
                              else if (location.kind === 228 ||
                                  (location.kind === 206 && location.name.kind === 8)) {
                                  result = getSymbolOfNode(location).exports["default"];
                                  var localSymbol = ts.getLocalSymbolForExportDefault(result);
                                  if (result && localSymbol && (result.flags & meaning) && localSymbol.name === name) {
                                      break loop;
                                  }
                                  result = undefined;
                              }
                              break;
                          case 205:
                              if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8)) {
                                  break loop;
                              }
                              break;
                          case 133:
                          case 132:
                              if (location.parent.kind === 202 && !(location.flags & 128)) {
                                  var ctor = findConstructorDeclaration(location.parent);
                                  if (ctor && ctor.locals) {
                                      if (getSymbol(ctor.locals, name, meaning & 107455)) {
                                          propertyWithInvalidInitializer = location;
                                      }
                                  }
                              }
                              break;
                          case 202:
                          case 203:
                              if (result = getSymbol(getSymbolOfNode(location).members, name, meaning & 793056)) {
                                  if (lastLocation && lastLocation.flags & 128) {
                                      error(errorLocation, ts.Diagnostics.Static_members_cannot_reference_class_type_parameters);
                                      return undefined;
                                  }
                                  break loop;
                              }
                              break;
                          case 128:
                              grandparent = location.parent.parent;
                              if (grandparent.kind === 202 || grandparent.kind === 203) {
                                  if (result = getSymbol(getSymbolOfNode(grandparent).members, name, meaning & 793056)) {
                                      error(errorLocation, ts.Diagnostics.A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type);
                                      return undefined;
                                  }
                              }
                              break;
                          case 135:
                          case 134:
                          case 136:
                          case 137:
                          case 138:
                          case 201:
                          case 164:
                              if (name === "arguments") {
                                  result = argumentsSymbol;
                                  break loop;
                              }
                              break;
                          case 163:
                              if (name === "arguments") {
                                  result = argumentsSymbol;
                                  break loop;
                              }
                              var functionName = location.name;
                              if (functionName && name === functionName.text) {
                                  result = location.symbol;
                                  break loop;
                              }
                              break;
                          case 175:
                              var className = location.name;
                              if (className && name === className.text) {
                                  result = location.symbol;
                                  break loop;
                              }
                              break;
                          case 131:
                              if (location.parent && location.parent.kind === 130) {
                                  location = location.parent;
                              }
                              if (location.parent && ts.isClassElement(location.parent)) {
                                  location = location.parent;
                              }
                              break;
                      }
                      lastLocation = location;
                      location = location.parent;
                  }
                  if (!result) {
                      result = getSymbol(globals, name, meaning);
                  }
                  if (!result) {
                      if (nameNotFoundMessage) {
                          error(errorLocation, nameNotFoundMessage, typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
                      }
                      return undefined;
                  }
                  if (nameNotFoundMessage) {
                      if (propertyWithInvalidInitializer) {
                          var propertyName = propertyWithInvalidInitializer.name;
                          error(errorLocation, ts.Diagnostics.Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor, ts.declarationNameToString(propertyName), typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
                          return undefined;
                      }
                      if (result.flags & 2) {
                          checkResolvedBlockScopedVariable(result, errorLocation);
                      }
                  }
                  return result;
              }
              function checkResolvedBlockScopedVariable(result, errorLocation) {
                  ts.Debug.assert((result.flags & 2) !== 0);
                  var declaration = ts.forEach(result.declarations, function (d) { return ts.isBlockOrCatchScoped(d) ? d : undefined; });
                  ts.Debug.assert(declaration !== undefined, "Block-scoped variable declaration is undefined");
                  var isUsedBeforeDeclaration = !isDefinedBefore(declaration, errorLocation);
                  if (!isUsedBeforeDeclaration) {
                      var variableDeclaration = ts.getAncestor(declaration, 199);
                      var container = ts.getEnclosingBlockScopeContainer(variableDeclaration);
                      if (variableDeclaration.parent.parent.kind === 181 ||
                          variableDeclaration.parent.parent.kind === 187) {
                          isUsedBeforeDeclaration = isSameScopeDescendentOf(errorLocation, variableDeclaration, container);
                      }
                      else if (variableDeclaration.parent.parent.kind === 189 ||
                          variableDeclaration.parent.parent.kind === 188) {
                          var expression = variableDeclaration.parent.parent.expression;
                          isUsedBeforeDeclaration = isSameScopeDescendentOf(errorLocation, expression, container);
                      }
                  }
                  if (isUsedBeforeDeclaration) {
                      error(errorLocation, ts.Diagnostics.Block_scoped_variable_0_used_before_its_declaration, ts.declarationNameToString(declaration.name));
                  }
              }
              function isSameScopeDescendentOf(initial, parent, stopAt) {
                  if (!parent) {
                      return false;
                  }
                  for (var current = initial; current && current !== stopAt && !ts.isFunctionLike(current); current = current.parent) {
                      if (current === parent) {
                          return true;
                      }
                  }
                  return false;
              }
              function getAnyImportSyntax(node) {
                  if (ts.isAliasSymbolDeclaration(node)) {
                      if (node.kind === 209) {
                          return node;
                      }
                      while (node && node.kind !== 210) {
                          node = node.parent;
                      }
                      return node;
                  }
              }
              function getDeclarationOfAliasSymbol(symbol) {
                  return ts.forEach(symbol.declarations, function (d) { return ts.isAliasSymbolDeclaration(d) ? d : undefined; });
              }
              function getTargetOfImportEqualsDeclaration(node) {
                  if (node.moduleReference.kind === 220) {
                      return resolveExternalModuleSymbol(resolveExternalModuleName(node, ts.getExternalModuleImportEqualsDeclarationExpression(node)));
                  }
                  return getSymbolOfPartOfRightHandSideOfImportEquals(node.moduleReference, node);
              }
              function getTargetOfImportClause(node) {
                  var moduleSymbol = resolveExternalModuleName(node, node.parent.moduleSpecifier);
                  if (moduleSymbol) {
                      var exportDefaultSymbol = resolveSymbol(moduleSymbol.exports["default"]);
                      if (!exportDefaultSymbol) {
                          error(node.name, ts.Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
                      }
                      return exportDefaultSymbol;
                  }
              }
              function getTargetOfNamespaceImport(node) {
                  var moduleSpecifier = node.parent.parent.moduleSpecifier;
                  return resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier);
              }
              function getMemberOfModuleVariable(moduleSymbol, name) {
                  if (moduleSymbol.flags & 3) {
                      var typeAnnotation = moduleSymbol.valueDeclaration.type;
                      if (typeAnnotation) {
                          return getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name);
                      }
                  }
              }
              function combineValueAndTypeSymbols(valueSymbol, typeSymbol) {
                  if (valueSymbol.flags & (793056 | 1536)) {
                      return valueSymbol;
                  }
                  var result = createSymbol(valueSymbol.flags | typeSymbol.flags, valueSymbol.name);
                  result.declarations = ts.concatenate(valueSymbol.declarations, typeSymbol.declarations);
                  result.parent = valueSymbol.parent || typeSymbol.parent;
                  if (valueSymbol.valueDeclaration)
                      result.valueDeclaration = valueSymbol.valueDeclaration;
                  if (typeSymbol.members)
                      result.members = typeSymbol.members;
                  if (valueSymbol.exports)
                      result.exports = valueSymbol.exports;
                  return result;
              }
              function getExportOfModule(symbol, name) {
                  if (symbol.flags & 1536) {
                      var exports = getExportsOfSymbol(symbol);
                      if (ts.hasProperty(exports, name)) {
                          return resolveSymbol(exports[name]);
                      }
                  }
              }
              function getPropertyOfVariable(symbol, name) {
                  if (symbol.flags & 3) {
                      var typeAnnotation = symbol.valueDeclaration.type;
                      if (typeAnnotation) {
                          return resolveSymbol(getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name));
                      }
                  }
              }
              function getExternalModuleMember(node, specifier) {
                  var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
                  var targetSymbol = resolveESModuleSymbol(moduleSymbol, node.moduleSpecifier);
                  if (targetSymbol) {
                      var name_4 = specifier.propertyName || specifier.name;
                      if (name_4.text) {
                          var symbolFromModule = getExportOfModule(targetSymbol, name_4.text);
                          var symbolFromVariable = getPropertyOfVariable(targetSymbol, name_4.text);
                          var symbol = symbolFromModule && symbolFromVariable ?
                              combineValueAndTypeSymbols(symbolFromVariable, symbolFromModule) :
                              symbolFromModule || symbolFromVariable;
                          if (!symbol) {
                              error(name_4, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(moduleSymbol), ts.declarationNameToString(name_4));
                          }
                          return symbol;
                      }
                  }
              }
              function getTargetOfImportSpecifier(node) {
                  return getExternalModuleMember(node.parent.parent.parent, node);
              }
              function getTargetOfExportSpecifier(node) {
                  return node.parent.parent.moduleSpecifier ?
                      getExternalModuleMember(node.parent.parent, node) :
                      resolveEntityName(node.propertyName || node.name, 107455 | 793056 | 1536);
              }
              function getTargetOfExportAssignment(node) {
                  return resolveEntityName(node.expression, 107455 | 793056 | 1536);
              }
              function getTargetOfAliasDeclaration(node) {
                  switch (node.kind) {
                      case 209:
                          return getTargetOfImportEqualsDeclaration(node);
                      case 211:
                          return getTargetOfImportClause(node);
                      case 212:
                          return getTargetOfNamespaceImport(node);
                      case 214:
                          return getTargetOfImportSpecifier(node);
                      case 218:
                          return getTargetOfExportSpecifier(node);
                      case 215:
                          return getTargetOfExportAssignment(node);
                  }
              }
              function resolveSymbol(symbol) {
                  return symbol && symbol.flags & 8388608 && !(symbol.flags & (107455 | 793056 | 1536)) ? resolveAlias(symbol) : symbol;
              }
              function resolveAlias(symbol) {
                  ts.Debug.assert((symbol.flags & 8388608) !== 0, "Should only get Alias here.");
                  var links = getSymbolLinks(symbol);
                  if (!links.target) {
                      links.target = resolvingSymbol;
                      var node = getDeclarationOfAliasSymbol(symbol);
                      var target = getTargetOfAliasDeclaration(node);
                      if (links.target === resolvingSymbol) {
                          links.target = target || unknownSymbol;
                      }
                      else {
                          error(node, ts.Diagnostics.Circular_definition_of_import_alias_0, symbolToString(symbol));
                      }
                  }
                  else if (links.target === resolvingSymbol) {
                      links.target = unknownSymbol;
                  }
                  return links.target;
              }
              function markExportAsReferenced(node) {
                  var symbol = getSymbolOfNode(node);
                  var target = resolveAlias(symbol);
                  if (target) {
                      var markAlias = (target === unknownSymbol && compilerOptions.separateCompilation) ||
                          (target !== unknownSymbol && (target.flags & 107455) && !isConstEnumOrConstEnumOnlyModule(target));
                      if (markAlias) {
                          markAliasSymbolAsReferenced(symbol);
                      }
                  }
              }
              function markAliasSymbolAsReferenced(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.referenced) {
                      links.referenced = true;
                      var node = getDeclarationOfAliasSymbol(symbol);
                      if (node.kind === 215) {
                          checkExpressionCached(node.expression);
                      }
                      else if (node.kind === 218) {
                          checkExpressionCached(node.propertyName || node.name);
                      }
                      else if (ts.isInternalModuleImportEqualsDeclaration(node)) {
                          checkExpressionCached(node.moduleReference);
                      }
                  }
              }
              function getSymbolOfPartOfRightHandSideOfImportEquals(entityName, importDeclaration) {
                  if (!importDeclaration) {
                      importDeclaration = ts.getAncestor(entityName, 209);
                      ts.Debug.assert(importDeclaration !== undefined);
                  }
                  if (entityName.kind === 65 && ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
                      entityName = entityName.parent;
                  }
                  if (entityName.kind === 65 || entityName.parent.kind === 127) {
                      return resolveEntityName(entityName, 1536);
                  }
                  else {
                      ts.Debug.assert(entityName.parent.kind === 209);
                      return resolveEntityName(entityName, 107455 | 793056 | 1536);
                  }
              }
              function getFullyQualifiedName(symbol) {
                  return symbol.parent ? getFullyQualifiedName(symbol.parent) + "." + symbolToString(symbol) : symbolToString(symbol);
              }
              function resolveEntityName(name, meaning) {
                  if (ts.nodeIsMissing(name)) {
                      return undefined;
                  }
                  var symbol;
                  if (name.kind === 65) {
                      var message = meaning === 1536 ? ts.Diagnostics.Cannot_find_namespace_0 : ts.Diagnostics.Cannot_find_name_0;
                      symbol = resolveName(name, name.text, meaning, message, name);
                      if (!symbol) {
                          return undefined;
                      }
                  }
                  else if (name.kind === 127 || name.kind === 156) {
                      var left = name.kind === 127 ? name.left : name.expression;
                      var right = name.kind === 127 ? name.right : name.name;
                      var namespace = resolveEntityName(left, 1536);
                      if (!namespace || namespace === unknownSymbol || ts.nodeIsMissing(right)) {
                          return undefined;
                      }
                      symbol = getSymbol(getExportsOfSymbol(namespace), right.text, meaning);
                      if (!symbol) {
                          error(right, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(namespace), ts.declarationNameToString(right));
                          return undefined;
                      }
                  }
                  else {
                      ts.Debug.fail("Unknown entity name kind.");
                  }
                  ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
                  return symbol.flags & meaning ? symbol : resolveAlias(symbol);
              }
              function isExternalModuleNameRelative(moduleName) {
                  return moduleName.substr(0, 2) === "./" || moduleName.substr(0, 3) === "../" || moduleName.substr(0, 2) === ".\\" || moduleName.substr(0, 3) === "..\\";
              }
              function resolveExternalModuleName(location, moduleReferenceExpression) {
                  if (moduleReferenceExpression.kind !== 8) {
                      return;
                  }
                  var moduleReferenceLiteral = moduleReferenceExpression;
                  var searchPath = ts.getDirectoryPath(getSourceFile(location).fileName);
                  var moduleName = ts.escapeIdentifier(moduleReferenceLiteral.text);
                  if (!moduleName)
                      return;
                  var isRelative = isExternalModuleNameRelative(moduleName);
                  if (!isRelative) {
                      var symbol = getSymbol(globals, '"' + moduleName + '"', 512);
                      if (symbol) {
                          return symbol;
                      }
                  }
                  var fileName;
                  var sourceFile;
                  while (true) {
                      fileName = ts.normalizePath(ts.combinePaths(searchPath, moduleName));
                      sourceFile = ts.forEach(ts.supportedExtensions, function (extension) { return host.getSourceFile(fileName + extension); });
                      if (sourceFile || isRelative) {
                          break;
                      }
                      var parentPath = ts.getDirectoryPath(searchPath);
                      if (parentPath === searchPath) {
                          break;
                      }
                      searchPath = parentPath;
                  }
                  if (sourceFile) {
                      if (sourceFile.symbol) {
                          return sourceFile.symbol;
                      }
                      error(moduleReferenceLiteral, ts.Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
                      return;
                  }
                  error(moduleReferenceLiteral, ts.Diagnostics.Cannot_find_module_0, moduleName);
              }
              function resolveExternalModuleSymbol(moduleSymbol) {
                  return moduleSymbol && resolveSymbol(moduleSymbol.exports["export="]) || moduleSymbol;
              }
              function resolveESModuleSymbol(moduleSymbol, moduleReferenceExpression) {
                  var symbol = resolveExternalModuleSymbol(moduleSymbol);
                  if (symbol && !(symbol.flags & (1536 | 3))) {
                      error(moduleReferenceExpression, ts.Diagnostics.Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct, symbolToString(moduleSymbol));
                      symbol = undefined;
                  }
                  return symbol;
              }
              function getExportAssignmentSymbol(moduleSymbol) {
                  return moduleSymbol.exports["export="];
              }
              function getExportsOfModuleAsArray(moduleSymbol) {
                  return symbolsToArray(getExportsOfModule(moduleSymbol));
              }
              function getExportsOfSymbol(symbol) {
                  return symbol.flags & 1536 ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
              }
              function getExportsOfModule(moduleSymbol) {
                  var links = getSymbolLinks(moduleSymbol);
                  return links.resolvedExports || (links.resolvedExports = getExportsForModule(moduleSymbol));
              }
              function extendExportSymbols(target, source) {
                  for (var id in source) {
                      if (id !== "default" && !ts.hasProperty(target, id)) {
                          target[id] = source[id];
                      }
                  }
              }
              function getExportsForModule(moduleSymbol) {
                  var result;
                  var visitedSymbols = [];
                  visit(moduleSymbol);
                  return result || moduleSymbol.exports;
                  function visit(symbol) {
                      if (symbol && symbol.flags & 1952 && !ts.contains(visitedSymbols, symbol)) {
                          visitedSymbols.push(symbol);
                          if (symbol !== moduleSymbol) {
                              if (!result) {
                                  result = cloneSymbolTable(moduleSymbol.exports);
                              }
                              extendExportSymbols(result, symbol.exports);
                          }
                          var exportStars = symbol.exports["__export"];
                          if (exportStars) {
                              for (var _i = 0, _a = exportStars.declarations; _i < _a.length; _i++) {
                                  var node = _a[_i];
                                  visit(resolveExternalModuleName(node, node.moduleSpecifier));
                              }
                          }
                      }
                  }
              }
              function getMergedSymbol(symbol) {
                  var merged;
                  return symbol && symbol.mergeId && (merged = mergedSymbols[symbol.mergeId]) ? merged : symbol;
              }
              function getSymbolOfNode(node) {
                  return getMergedSymbol(node.symbol);
              }
              function getParentOfSymbol(symbol) {
                  return getMergedSymbol(symbol.parent);
              }
              function getExportSymbolOfValueSymbolIfExported(symbol) {
                  return symbol && (symbol.flags & 1048576) !== 0
                      ? getMergedSymbol(symbol.exportSymbol)
                      : symbol;
              }
              function symbolIsValue(symbol) {
                  if (symbol.flags & 16777216) {
                      return symbolIsValue(getSymbolLinks(symbol).target);
                  }
                  if (symbol.flags & 107455) {
                      return true;
                  }
                  if (symbol.flags & 8388608) {
                      return (resolveAlias(symbol).flags & 107455) !== 0;
                  }
                  return false;
              }
              function findConstructorDeclaration(node) {
                  var members = node.members;
                  for (var _i = 0; _i < members.length; _i++) {
                      var member = members[_i];
                      if (member.kind === 136 && ts.nodeIsPresent(member.body)) {
                          return member;
                      }
                  }
              }
              function createType(flags) {
                  var result = new Type(checker, flags);
                  result.id = typeCount++;
                  return result;
              }
              function createIntrinsicType(kind, intrinsicName) {
                  var type = createType(kind);
                  type.intrinsicName = intrinsicName;
                  return type;
              }
              function createObjectType(kind, symbol) {
                  var type = createType(kind);
                  type.symbol = symbol;
                  return type;
              }
              function isReservedMemberName(name) {
                  return name.charCodeAt(0) === 95 &&
                      name.charCodeAt(1) === 95 &&
                      name.charCodeAt(2) !== 95 &&
                      name.charCodeAt(2) !== 64;
              }
              function getNamedMembers(members) {
                  var result;
                  for (var id in members) {
                      if (ts.hasProperty(members, id)) {
                          if (!isReservedMemberName(id)) {
                              if (!result)
                                  result = [];
                              var symbol = members[id];
                              if (symbolIsValue(symbol)) {
                                  result.push(symbol);
                              }
                          }
                      }
                  }
                  return result || emptyArray;
              }
              function setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType) {
                  type.members = members;
                  type.properties = getNamedMembers(members);
                  type.callSignatures = callSignatures;
                  type.constructSignatures = constructSignatures;
                  if (stringIndexType)
                      type.stringIndexType = stringIndexType;
                  if (numberIndexType)
                      type.numberIndexType = numberIndexType;
                  return type;
              }
              function createAnonymousType(symbol, members, callSignatures, constructSignatures, stringIndexType, numberIndexType) {
                  return setObjectTypeMembers(createObjectType(32768, symbol), members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function forEachSymbolTableInScope(enclosingDeclaration, callback) {
                  var result;
                  for (var location_1 = enclosingDeclaration; location_1; location_1 = location_1.parent) {
                      if (location_1.locals && !isGlobalSourceFile(location_1)) {
                          if (result = callback(location_1.locals)) {
                              return result;
                          }
                      }
                      switch (location_1.kind) {
                          case 228:
                              if (!ts.isExternalModule(location_1)) {
                                  break;
                              }
                          case 206:
                              if (result = callback(getSymbolOfNode(location_1).exports)) {
                                  return result;
                              }
                              break;
                          case 202:
                          case 203:
                              if (result = callback(getSymbolOfNode(location_1).members)) {
                                  return result;
                              }
                              break;
                      }
                  }
                  return callback(globals);
              }
              function getQualifiedLeftMeaning(rightMeaning) {
                  return rightMeaning === 107455 ? 107455 : 1536;
              }
              function getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, useOnlyExternalAliasing) {
                  function getAccessibleSymbolChainFromSymbolTable(symbols) {
                      function canQualifySymbol(symbolFromSymbolTable, meaning) {
                          if (!needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning)) {
                              return true;
                          }
                          var accessibleParent = getAccessibleSymbolChain(symbolFromSymbolTable.parent, enclosingDeclaration, getQualifiedLeftMeaning(meaning), useOnlyExternalAliasing);
                          return !!accessibleParent;
                      }
                      function isAccessible(symbolFromSymbolTable, resolvedAliasSymbol) {
                          if (symbol === (resolvedAliasSymbol || symbolFromSymbolTable)) {
                              return !ts.forEach(symbolFromSymbolTable.declarations, hasExternalModuleSymbol) &&
                                  canQualifySymbol(symbolFromSymbolTable, meaning);
                          }
                      }
                      if (isAccessible(ts.lookUp(symbols, symbol.name))) {
                          return [symbol];
                      }
                      return ts.forEachValue(symbols, function (symbolFromSymbolTable) {
                          if (symbolFromSymbolTable.flags & 8388608 && symbolFromSymbolTable.name !== "export=") {
                              if (!useOnlyExternalAliasing ||
                                  ts.forEach(symbolFromSymbolTable.declarations, ts.isExternalModuleImportEqualsDeclaration)) {
                                  var resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
                                  if (isAccessible(symbolFromSymbolTable, resolveAlias(symbolFromSymbolTable))) {
                                      return [symbolFromSymbolTable];
                                  }
                                  var accessibleSymbolsFromExports = resolvedImportedSymbol.exports ? getAccessibleSymbolChainFromSymbolTable(resolvedImportedSymbol.exports) : undefined;
                                  if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
                                      return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
                                  }
                              }
                          }
                      });
                  }
                  if (symbol) {
                      return forEachSymbolTableInScope(enclosingDeclaration, getAccessibleSymbolChainFromSymbolTable);
                  }
              }
              function needsQualification(symbol, enclosingDeclaration, meaning) {
                  var qualify = false;
                  forEachSymbolTableInScope(enclosingDeclaration, function (symbolTable) {
                      if (!ts.hasProperty(symbolTable, symbol.name)) {
                          return false;
                      }
                      var symbolFromSymbolTable = symbolTable[symbol.name];
                      if (symbolFromSymbolTable === symbol) {
                          return true;
                      }
                      symbolFromSymbolTable = (symbolFromSymbolTable.flags & 8388608) ? resolveAlias(symbolFromSymbolTable) : symbolFromSymbolTable;
                      if (symbolFromSymbolTable.flags & meaning) {
                          qualify = true;
                          return true;
                      }
                      return false;
                  });
                  return qualify;
              }
              function isSymbolAccessible(symbol, enclosingDeclaration, meaning) {
                  if (symbol && enclosingDeclaration && !(symbol.flags & 262144)) {
                      var initialSymbol = symbol;
                      var meaningToLook = meaning;
                      while (symbol) {
                          var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaningToLook, false);
                          if (accessibleSymbolChain) {
                              var hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0]);
                              if (!hasAccessibleDeclarations) {
                                  return {
                                      accessibility: 1,
                                      errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
                                      errorModuleName: symbol !== initialSymbol ? symbolToString(symbol, enclosingDeclaration, 1536) : undefined
                                  };
                              }
                              return hasAccessibleDeclarations;
                          }
                          meaningToLook = getQualifiedLeftMeaning(meaning);
                          symbol = getParentOfSymbol(symbol);
                      }
                      var symbolExternalModule = ts.forEach(initialSymbol.declarations, getExternalModuleContainer);
                      if (symbolExternalModule) {
                          var enclosingExternalModule = getExternalModuleContainer(enclosingDeclaration);
                          if (symbolExternalModule !== enclosingExternalModule) {
                              return {
                                  accessibility: 2,
                                  errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
                                  errorModuleName: symbolToString(symbolExternalModule)
                              };
                          }
                      }
                      return {
                          accessibility: 1,
                          errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning)
                      };
                  }
                  return { accessibility: 0 };
                  function getExternalModuleContainer(declaration) {
                      for (; declaration; declaration = declaration.parent) {
                          if (hasExternalModuleSymbol(declaration)) {
                              return getSymbolOfNode(declaration);
                          }
                      }
                  }
              }
              function hasExternalModuleSymbol(declaration) {
                  return (declaration.kind === 206 && declaration.name.kind === 8) ||
                      (declaration.kind === 228 && ts.isExternalModule(declaration));
              }
              function hasVisibleDeclarations(symbol) {
                  var aliasesToMakeVisible;
                  if (ts.forEach(symbol.declarations, function (declaration) { return !getIsDeclarationVisible(declaration); })) {
                      return undefined;
                  }
                  return { accessibility: 0, aliasesToMakeVisible: aliasesToMakeVisible };
                  function getIsDeclarationVisible(declaration) {
                      if (!isDeclarationVisible(declaration)) {
                          var anyImportSyntax = getAnyImportSyntax(declaration);
                          if (anyImportSyntax &&
                              !(anyImportSyntax.flags & 1) &&
                              isDeclarationVisible(anyImportSyntax.parent)) {
                              getNodeLinks(declaration).isVisible = true;
                              if (aliasesToMakeVisible) {
                                  if (!ts.contains(aliasesToMakeVisible, anyImportSyntax)) {
                                      aliasesToMakeVisible.push(anyImportSyntax);
                                  }
                              }
                              else {
                                  aliasesToMakeVisible = [anyImportSyntax];
                              }
                              return true;
                          }
                          return false;
                      }
                      return true;
                  }
              }
              function isEntityNameVisible(entityName, enclosingDeclaration) {
                  var meaning;
                  if (entityName.parent.kind === 145) {
                      meaning = 107455 | 1048576;
                  }
                  else if (entityName.kind === 127 || entityName.kind === 156 ||
                      entityName.parent.kind === 209) {
                      meaning = 1536;
                  }
                  else {
                      meaning = 793056;
                  }
                  var firstIdentifier = getFirstIdentifier(entityName);
                  var symbol = resolveName(enclosingDeclaration, firstIdentifier.text, meaning, undefined, undefined);
                  return (symbol && hasVisibleDeclarations(symbol)) || {
                      accessibility: 1,
                      errorSymbolName: ts.getTextOfNode(firstIdentifier),
                      errorNode: firstIdentifier
                  };
              }
              function writeKeyword(writer, kind) {
                  writer.writeKeyword(ts.tokenToString(kind));
              }
              function writePunctuation(writer, kind) {
                  writer.writePunctuation(ts.tokenToString(kind));
              }
              function writeSpace(writer) {
                  writer.writeSpace(" ");
              }
              function symbolToString(symbol, enclosingDeclaration, meaning) {
                  var writer = ts.getSingleLineStringWriter();
                  getSymbolDisplayBuilder().buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning);
                  var result = writer.string();
                  ts.releaseStringWriter(writer);
                  return result;
              }
              function typeToString(type, enclosingDeclaration, flags) {
                  var writer = ts.getSingleLineStringWriter();
                  getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
                  var result = writer.string();
                  ts.releaseStringWriter(writer);
                  var maxLength = compilerOptions.noErrorTruncation || flags & 4 ? undefined : 100;
                  if (maxLength && result.length >= maxLength) {
                      result = result.substr(0, maxLength - "...".length) + "...";
                  }
                  return result;
              }
              function getTypeAliasForTypeLiteral(type) {
                  if (type.symbol && type.symbol.flags & 2048) {
                      var node = type.symbol.declarations[0].parent;
                      while (node.kind === 150) {
                          node = node.parent;
                      }
                      if (node.kind === 204) {
                          return getSymbolOfNode(node);
                      }
                  }
                  return undefined;
              }
              var _displayBuilder;
              function getSymbolDisplayBuilder() {
                  function appendSymbolNameOnly(symbol, writer) {
                      if (symbol.declarations && symbol.declarations.length > 0) {
                          var declaration = symbol.declarations[0];
                          if (declaration.name) {
                              writer.writeSymbol(ts.declarationNameToString(declaration.name), symbol);
                              return;
                          }
                      }
                      writer.writeSymbol(symbol.name, symbol);
                  }
                  function buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning, flags, typeFlags) {
                      var parentSymbol;
                      function appendParentTypeArgumentsAndSymbolName(symbol) {
                          if (parentSymbol) {
                              if (flags & 1) {
                                  if (symbol.flags & 16777216) {
                                      buildDisplayForTypeArgumentsAndDelimiters(getTypeParametersOfClassOrInterface(parentSymbol), symbol.mapper, writer, enclosingDeclaration);
                                  }
                                  else {
                                      buildTypeParameterDisplayFromSymbol(parentSymbol, writer, enclosingDeclaration);
                                  }
                              }
                              writePunctuation(writer, 20);
                          }
                          parentSymbol = symbol;
                          appendSymbolNameOnly(symbol, writer);
                      }
                      writer.trackSymbol(symbol, enclosingDeclaration, meaning);
                      function walkSymbol(symbol, meaning) {
                          if (symbol) {
                              var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, !!(flags & 2));
                              if (!accessibleSymbolChain ||
                                  needsQualification(accessibleSymbolChain[0], enclosingDeclaration, accessibleSymbolChain.length === 1 ? meaning : getQualifiedLeftMeaning(meaning))) {
                                  walkSymbol(getParentOfSymbol(accessibleSymbolChain ? accessibleSymbolChain[0] : symbol), getQualifiedLeftMeaning(meaning));
                              }
                              if (accessibleSymbolChain) {
                                  for (var _i = 0; _i < accessibleSymbolChain.length; _i++) {
                                      var accessibleSymbol = accessibleSymbolChain[_i];
                                      appendParentTypeArgumentsAndSymbolName(accessibleSymbol);
                                  }
                              }
                              else {
                                  if (!parentSymbol && ts.forEach(symbol.declarations, hasExternalModuleSymbol)) {
                                      return;
                                  }
                                  if (symbol.flags & 2048 || symbol.flags & 4096) {
                                      return;
                                  }
                                  appendParentTypeArgumentsAndSymbolName(symbol);
                              }
                          }
                      }
                      var isTypeParameter = symbol.flags & 262144;
                      var typeFormatFlag = 128 & typeFlags;
                      if (!isTypeParameter && (enclosingDeclaration || typeFormatFlag)) {
                          walkSymbol(symbol, meaning);
                          return;
                      }
                      return appendParentTypeArgumentsAndSymbolName(symbol);
                  }
                  function buildTypeDisplay(type, writer, enclosingDeclaration, globalFlags, typeStack) {
                      var globalFlagsToPass = globalFlags & 16;
                      return writeType(type, globalFlags);
                      function writeType(type, flags) {
                          if (type.flags & 1048703) {
                              writer.writeKeyword(!(globalFlags & 16) &&
                                  (type.flags & 1) ? "any" : type.intrinsicName);
                          }
                          else if (type.flags & 4096) {
                              writeTypeReference(type, flags);
                          }
                          else if (type.flags & (1024 | 2048 | 128 | 512)) {
                              buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 793056, 0, flags);
                          }
                          else if (type.flags & 8192) {
                              writeTupleType(type);
                          }
                          else if (type.flags & 16384) {
                              writeUnionType(type, flags);
                          }
                          else if (type.flags & 32768) {
                              writeAnonymousType(type, flags);
                          }
                          else if (type.flags & 256) {
                              writer.writeStringLiteral(type.text);
                          }
                          else {
                              writePunctuation(writer, 14);
                              writeSpace(writer);
                              writePunctuation(writer, 21);
                              writeSpace(writer);
                              writePunctuation(writer, 15);
                          }
                      }
                      function writeTypeList(types, union) {
                          for (var i = 0; i < types.length; i++) {
                              if (i > 0) {
                                  if (union) {
                                      writeSpace(writer);
                                  }
                                  writePunctuation(writer, union ? 44 : 23);
                                  writeSpace(writer);
                              }
                              writeType(types[i], union ? 64 : 0);
                          }
                      }
                      function writeTypeReference(type, flags) {
                          if (type.target === globalArrayType && !(flags & 1)) {
                              writeType(type.typeArguments[0], 64);
                              writePunctuation(writer, 18);
                              writePunctuation(writer, 19);
                          }
                          else {
                              buildSymbolDisplay(type.target.symbol, writer, enclosingDeclaration, 793056);
                              writePunctuation(writer, 24);
                              writeTypeList(type.typeArguments, false);
                              writePunctuation(writer, 25);
                          }
                      }
                      function writeTupleType(type) {
                          writePunctuation(writer, 18);
                          writeTypeList(type.elementTypes, false);
                          writePunctuation(writer, 19);
                      }
                      function writeUnionType(type, flags) {
                          if (flags & 64) {
                              writePunctuation(writer, 16);
                          }
                          writeTypeList(type.types, true);
                          if (flags & 64) {
                              writePunctuation(writer, 17);
                          }
                      }
                      function writeAnonymousType(type, flags) {
                          if (type.symbol && type.symbol.flags & (32 | 384 | 512)) {
                              writeTypeofSymbol(type, flags);
                          }
                          else if (shouldWriteTypeOfFunctionSymbol()) {
                              writeTypeofSymbol(type, flags);
                          }
                          else if (typeStack && ts.contains(typeStack, type)) {
                              var typeAlias = getTypeAliasForTypeLiteral(type);
                              if (typeAlias) {
                                  buildSymbolDisplay(typeAlias, writer, enclosingDeclaration, 793056, 0, flags);
                              }
                              else {
                                  writeKeyword(writer, 112);
                              }
                          }
                          else {
                              if (!typeStack) {
                                  typeStack = [];
                              }
                              typeStack.push(type);
                              writeLiteralType(type, flags);
                              typeStack.pop();
                          }
                          function shouldWriteTypeOfFunctionSymbol() {
                              if (type.symbol) {
                                  var isStaticMethodSymbol = !!(type.symbol.flags & 8192 &&
                                      ts.forEach(type.symbol.declarations, function (declaration) { return declaration.flags & 128; }));
                                  var isNonLocalFunctionSymbol = !!(type.symbol.flags & 16) &&
                                      (type.symbol.parent ||
                                          ts.forEach(type.symbol.declarations, function (declaration) {
                                              return declaration.parent.kind === 228 || declaration.parent.kind === 207;
                                          }));
                                  if (isStaticMethodSymbol || isNonLocalFunctionSymbol) {
                                      return !!(flags & 2) ||
                                          (typeStack && ts.contains(typeStack, type));
                                  }
                              }
                          }
                      }
                      function writeTypeofSymbol(type, typeFormatFlags) {
                          writeKeyword(writer, 97);
                          writeSpace(writer);
                          buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 107455, 0, typeFormatFlags);
                      }
                      function getIndexerParameterName(type, indexKind, fallbackName) {
                          var declaration = getIndexDeclarationOfSymbol(type.symbol, indexKind);
                          if (!declaration) {
                              return fallbackName;
                          }
                          ts.Debug.assert(declaration.parameters.length !== 0);
                          return ts.declarationNameToString(declaration.parameters[0].name);
                      }
                      function writeLiteralType(type, flags) {
                          var resolved = resolveObjectOrUnionTypeMembers(type);
                          if (!resolved.properties.length && !resolved.stringIndexType && !resolved.numberIndexType) {
                              if (!resolved.callSignatures.length && !resolved.constructSignatures.length) {
                                  writePunctuation(writer, 14);
                                  writePunctuation(writer, 15);
                                  return;
                              }
                              if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
                                  if (flags & 64) {
                                      writePunctuation(writer, 16);
                                  }
                                  buildSignatureDisplay(resolved.callSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, typeStack);
                                  if (flags & 64) {
                                      writePunctuation(writer, 17);
                                  }
                                  return;
                              }
                              if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
                                  if (flags & 64) {
                                      writePunctuation(writer, 16);
                                  }
                                  writeKeyword(writer, 88);
                                  writeSpace(writer);
                                  buildSignatureDisplay(resolved.constructSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, typeStack);
                                  if (flags & 64) {
                                      writePunctuation(writer, 17);
                                  }
                                  return;
                              }
                          }
                          writePunctuation(writer, 14);
                          writer.writeLine();
                          writer.increaseIndent();
                          for (var _i = 0, _a = resolved.callSignatures; _i < _a.length; _i++) {
                              var signature = _a[_i];
                              buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          for (var _b = 0, _c = resolved.constructSignatures; _b < _c.length; _b++) {
                              var signature = _c[_b];
                              writeKeyword(writer, 88);
                              writeSpace(writer);
                              buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          if (resolved.stringIndexType) {
                              writePunctuation(writer, 18);
                              writer.writeParameter(getIndexerParameterName(resolved, 0, "x"));
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeKeyword(writer, 122);
                              writePunctuation(writer, 19);
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeType(resolved.stringIndexType, 0);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          if (resolved.numberIndexType) {
                              writePunctuation(writer, 18);
                              writer.writeParameter(getIndexerParameterName(resolved, 1, "x"));
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeKeyword(writer, 120);
                              writePunctuation(writer, 19);
                              writePunctuation(writer, 51);
                              writeSpace(writer);
                              writeType(resolved.numberIndexType, 0);
                              writePunctuation(writer, 22);
                              writer.writeLine();
                          }
                          for (var _d = 0, _e = resolved.properties; _d < _e.length; _d++) {
                              var p = _e[_d];
                              var t = getTypeOfSymbol(p);
                              if (p.flags & (16 | 8192) && !getPropertiesOfObjectType(t).length) {
                                  var signatures = getSignaturesOfType(t, 0);
                                  for (var _f = 0; _f < signatures.length; _f++) {
                                      var signature = signatures[_f];
                                      buildSymbolDisplay(p, writer);
                                      if (p.flags & 536870912) {
                                          writePunctuation(writer, 50);
                                      }
                                      buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, typeStack);
                                      writePunctuation(writer, 22);
                                      writer.writeLine();
                                  }
                              }
                              else {
                                  buildSymbolDisplay(p, writer);
                                  if (p.flags & 536870912) {
                                      writePunctuation(writer, 50);
                                  }
                                  writePunctuation(writer, 51);
                                  writeSpace(writer);
                                  writeType(t, 0);
                                  writePunctuation(writer, 22);
                                  writer.writeLine();
                              }
                          }
                          writer.decreaseIndent();
                          writePunctuation(writer, 15);
                      }
                  }
                  function buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaraiton, flags) {
                      var targetSymbol = getTargetSymbol(symbol);
                      if (targetSymbol.flags & 32 || targetSymbol.flags & 64) {
                          buildDisplayForTypeParametersAndDelimiters(getTypeParametersOfClassOrInterface(symbol), writer, enclosingDeclaraiton, flags);
                      }
                  }
                  function buildTypeParameterDisplay(tp, writer, enclosingDeclaration, flags, typeStack) {
                      appendSymbolNameOnly(tp.symbol, writer);
                      var constraint = getConstraintOfTypeParameter(tp);
                      if (constraint) {
                          writeSpace(writer);
                          writeKeyword(writer, 79);
                          writeSpace(writer);
                          buildTypeDisplay(constraint, writer, enclosingDeclaration, flags, typeStack);
                      }
                  }
                  function buildParameterDisplay(p, writer, enclosingDeclaration, flags, typeStack) {
                      if (ts.hasDotDotDotToken(p.valueDeclaration)) {
                          writePunctuation(writer, 21);
                      }
                      appendSymbolNameOnly(p, writer);
                      if (ts.hasQuestionToken(p.valueDeclaration) || p.valueDeclaration.initializer) {
                          writePunctuation(writer, 50);
                      }
                      writePunctuation(writer, 51);
                      writeSpace(writer);
                      buildTypeDisplay(getTypeOfSymbol(p), writer, enclosingDeclaration, flags, typeStack);
                  }
                  function buildDisplayForTypeParametersAndDelimiters(typeParameters, writer, enclosingDeclaration, flags, typeStack) {
                      if (typeParameters && typeParameters.length) {
                          writePunctuation(writer, 24);
                          for (var i = 0; i < typeParameters.length; i++) {
                              if (i > 0) {
                                  writePunctuation(writer, 23);
                                  writeSpace(writer);
                              }
                              buildTypeParameterDisplay(typeParameters[i], writer, enclosingDeclaration, flags, typeStack);
                          }
                          writePunctuation(writer, 25);
                      }
                  }
                  function buildDisplayForTypeArgumentsAndDelimiters(typeParameters, mapper, writer, enclosingDeclaration, flags, typeStack) {
                      if (typeParameters && typeParameters.length) {
                          writePunctuation(writer, 24);
                          for (var i = 0; i < typeParameters.length; i++) {
                              if (i > 0) {
                                  writePunctuation(writer, 23);
                                  writeSpace(writer);
                              }
                              buildTypeDisplay(mapper(typeParameters[i]), writer, enclosingDeclaration, 0);
                          }
                          writePunctuation(writer, 25);
                      }
                  }
                  function buildDisplayForParametersAndDelimiters(parameters, writer, enclosingDeclaration, flags, typeStack) {
                      writePunctuation(writer, 16);
                      for (var i = 0; i < parameters.length; i++) {
                          if (i > 0) {
                              writePunctuation(writer, 23);
                              writeSpace(writer);
                          }
                          buildParameterDisplay(parameters[i], writer, enclosingDeclaration, flags, typeStack);
                      }
                      writePunctuation(writer, 17);
                  }
                  function buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, typeStack) {
                      if (flags & 8) {
                          writeSpace(writer);
                          writePunctuation(writer, 32);
                      }
                      else {
                          writePunctuation(writer, 51);
                      }
                      writeSpace(writer);
                      buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags, typeStack);
                  }
                  function buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, typeStack) {
                      if (signature.target && (flags & 32)) {
                          buildDisplayForTypeArgumentsAndDelimiters(signature.target.typeParameters, signature.mapper, writer, enclosingDeclaration);
                      }
                      else {
                          buildDisplayForTypeParametersAndDelimiters(signature.typeParameters, writer, enclosingDeclaration, flags, typeStack);
                      }
                      buildDisplayForParametersAndDelimiters(signature.parameters, writer, enclosingDeclaration, flags, typeStack);
                      buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, typeStack);
                  }
                  return _displayBuilder || (_displayBuilder = {
                      symbolToString: symbolToString,
                      typeToString: typeToString,
                      buildSymbolDisplay: buildSymbolDisplay,
                      buildTypeDisplay: buildTypeDisplay,
                      buildTypeParameterDisplay: buildTypeParameterDisplay,
                      buildParameterDisplay: buildParameterDisplay,
                      buildDisplayForParametersAndDelimiters: buildDisplayForParametersAndDelimiters,
                      buildDisplayForTypeParametersAndDelimiters: buildDisplayForTypeParametersAndDelimiters,
                      buildDisplayForTypeArgumentsAndDelimiters: buildDisplayForTypeArgumentsAndDelimiters,
                      buildTypeParameterDisplayFromSymbol: buildTypeParameterDisplayFromSymbol,
                      buildSignatureDisplay: buildSignatureDisplay,
                      buildReturnTypeDisplay: buildReturnTypeDisplay
                  });
              }
              function isDeclarationVisible(node) {
                  function getContainingExternalModule(node) {
                      for (; node; node = node.parent) {
                          if (node.kind === 206) {
                              if (node.name.kind === 8) {
                                  return node;
                              }
                          }
                          else if (node.kind === 228) {
                              return ts.isExternalModule(node) ? node : undefined;
                          }
                      }
                      ts.Debug.fail("getContainingModule cant reach here");
                  }
                  function isUsedInExportAssignment(node) {
                      var externalModule = getContainingExternalModule(node);
                      var exportAssignmentSymbol;
                      var resolvedExportSymbol;
                      if (externalModule) {
                          var externalModuleSymbol = getSymbolOfNode(externalModule);
                          exportAssignmentSymbol = getExportAssignmentSymbol(externalModuleSymbol);
                          var symbolOfNode = getSymbolOfNode(node);
                          if (isSymbolUsedInExportAssignment(symbolOfNode)) {
                              return true;
                          }
                          if (symbolOfNode.flags & 8388608) {
                              return isSymbolUsedInExportAssignment(resolveAlias(symbolOfNode));
                          }
                      }
                      function isSymbolUsedInExportAssignment(symbol) {
                          if (exportAssignmentSymbol === symbol) {
                              return true;
                          }
                          if (exportAssignmentSymbol && !!(exportAssignmentSymbol.flags & 8388608)) {
                              resolvedExportSymbol = resolvedExportSymbol || resolveAlias(exportAssignmentSymbol);
                              if (resolvedExportSymbol === symbol) {
                                  return true;
                              }
                              return ts.forEach(resolvedExportSymbol.declarations, function (current) {
                                  while (current) {
                                      if (current === node) {
                                          return true;
                                      }
                                      current = current.parent;
                                  }
                              });
                          }
                      }
                  }
                  function determineIfDeclarationIsVisible() {
                      switch (node.kind) {
                          case 153:
                              return isDeclarationVisible(node.parent.parent);
                          case 199:
                              if (ts.isBindingPattern(node.name) &&
                                  !node.name.elements.length) {
                                  return false;
                              }
                          case 206:
                          case 202:
                          case 203:
                          case 204:
                          case 201:
                          case 205:
                          case 209:
                              var parent_2 = getDeclarationContainer(node);
                              if (!(ts.getCombinedNodeFlags(node) & 1) &&
                                  !(node.kind !== 209 && parent_2.kind !== 228 && ts.isInAmbientContext(parent_2))) {
                                  return isGlobalSourceFile(parent_2);
                              }
                              return isDeclarationVisible(parent_2);
                          case 133:
                          case 132:
                          case 137:
                          case 138:
                          case 135:
                          case 134:
                              if (node.flags & (32 | 64)) {
                                  return false;
                              }
                          case 136:
                          case 140:
                          case 139:
                          case 141:
                          case 130:
                          case 207:
                          case 143:
                          case 144:
                          case 146:
                          case 142:
                          case 147:
                          case 148:
                          case 149:
                          case 150:
                              return isDeclarationVisible(node.parent);
                          case 211:
                          case 212:
                          case 214:
                              return false;
                          case 129:
                          case 228:
                              return true;
                          case 215:
                              return false;
                          default:
                              ts.Debug.fail("isDeclarationVisible unknown: SyntaxKind: " + node.kind);
                      }
                  }
                  if (node) {
                      var links = getNodeLinks(node);
                      if (links.isVisible === undefined) {
                          links.isVisible = !!determineIfDeclarationIsVisible();
                      }
                      return links.isVisible;
                  }
              }
              function collectLinkedAliases(node) {
                  var exportSymbol;
                  if (node.parent && node.parent.kind === 215) {
                      exportSymbol = resolveName(node.parent, node.text, 107455 | 793056 | 1536, ts.Diagnostics.Cannot_find_name_0, node);
                  }
                  else if (node.parent.kind === 218) {
                      exportSymbol = getTargetOfExportSpecifier(node.parent);
                  }
                  var result = [];
                  if (exportSymbol) {
                      buildVisibleNodeList(exportSymbol.declarations);
                  }
                  return result;
                  function buildVisibleNodeList(declarations) {
                      ts.forEach(declarations, function (declaration) {
                          getNodeLinks(declaration).isVisible = true;
                          var resultNode = getAnyImportSyntax(declaration) || declaration;
                          if (!ts.contains(result, resultNode)) {
                              result.push(resultNode);
                          }
                          if (ts.isInternalModuleImportEqualsDeclaration(declaration)) {
                              var internalModuleReference = declaration.moduleReference;
                              var firstIdentifier = getFirstIdentifier(internalModuleReference);
                              var importSymbol = resolveName(declaration, firstIdentifier.text, 107455 | 793056 | 1536, ts.Diagnostics.Cannot_find_name_0, firstIdentifier);
                              buildVisibleNodeList(importSymbol.declarations);
                          }
                      });
                  }
              }
              function pushTypeResolution(target) {
                  var i = 0;
                  var count = resolutionTargets.length;
                  while (i < count && resolutionTargets[i] !== target) {
                      i++;
                  }
                  if (i < count) {
                      do {
                          resolutionResults[i++] = false;
                      } while (i < count);
                      return false;
                  }
                  resolutionTargets.push(target);
                  resolutionResults.push(true);
                  return true;
              }
              function popTypeResolution() {
                  resolutionTargets.pop();
                  return resolutionResults.pop();
              }
              function getDeclarationContainer(node) {
                  node = ts.getRootDeclaration(node);
                  return node.kind === 199 ? node.parent.parent.parent : node.parent;
              }
              function getTypeOfPrototypeProperty(prototype) {
                  var classType = getDeclaredTypeOfSymbol(prototype.parent);
                  return classType.typeParameters ? createTypeReference(classType, ts.map(classType.typeParameters, function (_) { return anyType; })) : classType;
              }
              function getTypeOfPropertyOfType(type, name) {
                  var prop = getPropertyOfType(type, name);
                  return prop ? getTypeOfSymbol(prop) : undefined;
              }
              function getTypeForBindingElement(declaration) {
                  var pattern = declaration.parent;
                  var parentType = getTypeForVariableLikeDeclaration(pattern.parent);
                  if (parentType === unknownType) {
                      return unknownType;
                  }
                  if (!parentType || parentType === anyType) {
                      if (declaration.initializer) {
                          return checkExpressionCached(declaration.initializer);
                      }
                      return parentType;
                  }
                  var type;
                  if (pattern.kind === 151) {
                      var name_5 = declaration.propertyName || declaration.name;
                      type = getTypeOfPropertyOfType(parentType, name_5.text) ||
                          isNumericLiteralName(name_5.text) && getIndexTypeOfType(parentType, 1) ||
                          getIndexTypeOfType(parentType, 0);
                      if (!type) {
                          error(name_5, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(parentType), ts.declarationNameToString(name_5));
                          return unknownType;
                      }
                  }
                  else {
                      var elementType = checkIteratedTypeOrElementType(parentType, pattern, false);
                      if (!declaration.dotDotDotToken) {
                          if (elementType.flags & 1) {
                              return elementType;
                          }
                          var propName = "" + ts.indexOf(pattern.elements, declaration);
                          type = isTupleLikeType(parentType)
                              ? getTypeOfPropertyOfType(parentType, propName)
                              : elementType;
                          if (!type) {
                              if (isTupleType(parentType)) {
                                  error(declaration, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(parentType), parentType.elementTypes.length, pattern.elements.length);
                              }
                              else {
                                  error(declaration, ts.Diagnostics.Type_0_has_no_property_1, typeToString(parentType), propName);
                              }
                              return unknownType;
                          }
                      }
                      else {
                          type = createArrayType(elementType);
                      }
                  }
                  return type;
              }
              function getTypeForVariableLikeDeclaration(declaration) {
                  if (declaration.parent.parent.kind === 188) {
                      return anyType;
                  }
                  if (declaration.parent.parent.kind === 189) {
                      return checkRightHandSideOfForOf(declaration.parent.parent.expression) || anyType;
                  }
                  if (ts.isBindingPattern(declaration.parent)) {
                      return getTypeForBindingElement(declaration);
                  }
                  if (declaration.type) {
                      return getTypeFromTypeNode(declaration.type);
                  }
                  if (declaration.kind === 130) {
                      var func = declaration.parent;
                      if (func.kind === 138 && !ts.hasDynamicName(func)) {
                          var getter = ts.getDeclarationOfKind(declaration.parent.symbol, 137);
                          if (getter) {
                              return getReturnTypeOfSignature(getSignatureFromDeclaration(getter));
                          }
                      }
                      var type = getContextuallyTypedParameterType(declaration);
                      if (type) {
                          return type;
                      }
                  }
                  if (declaration.initializer) {
                      return checkExpressionCached(declaration.initializer);
                  }
                  if (declaration.kind === 226) {
                      return checkIdentifier(declaration.name);
                  }
                  return undefined;
              }
              function getTypeFromBindingElement(element) {
                  if (element.initializer) {
                      return getWidenedType(checkExpressionCached(element.initializer));
                  }
                  if (ts.isBindingPattern(element.name)) {
                      return getTypeFromBindingPattern(element.name);
                  }
                  return anyType;
              }
              function getTypeFromObjectBindingPattern(pattern) {
                  var members = {};
                  ts.forEach(pattern.elements, function (e) {
                      var flags = 4 | 67108864 | (e.initializer ? 536870912 : 0);
                      var name = e.propertyName || e.name;
                      var symbol = createSymbol(flags, name.text);
                      symbol.type = getTypeFromBindingElement(e);
                      members[symbol.name] = symbol;
                  });
                  return createAnonymousType(undefined, members, emptyArray, emptyArray, undefined, undefined);
              }
              function getTypeFromArrayBindingPattern(pattern) {
                  var hasSpreadElement = false;
                  var elementTypes = [];
                  ts.forEach(pattern.elements, function (e) {
                      elementTypes.push(e.kind === 176 || e.dotDotDotToken ? anyType : getTypeFromBindingElement(e));
                      if (e.dotDotDotToken) {
                          hasSpreadElement = true;
                      }
                  });
                  if (!elementTypes.length) {
                      return languageVersion >= 2 ? createIterableType(anyType) : anyArrayType;
                  }
                  else if (hasSpreadElement) {
                      var unionOfElements = getUnionType(elementTypes);
                      return languageVersion >= 2 ? createIterableType(unionOfElements) : createArrayType(unionOfElements);
                  }
                  return createTupleType(elementTypes);
              }
              function getTypeFromBindingPattern(pattern) {
                  return pattern.kind === 151
                      ? getTypeFromObjectBindingPattern(pattern)
                      : getTypeFromArrayBindingPattern(pattern);
              }
              function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
                  var type = getTypeForVariableLikeDeclaration(declaration);
                  if (type) {
                      if (reportErrors) {
                          reportErrorsFromWidening(declaration, type);
                      }
                      return declaration.kind !== 225 ? getWidenedType(type) : type;
                  }
                  if (ts.isBindingPattern(declaration.name)) {
                      return getTypeFromBindingPattern(declaration.name);
                  }
                  type = declaration.dotDotDotToken ? anyArrayType : anyType;
                  if (reportErrors && compilerOptions.noImplicitAny) {
                      var root = ts.getRootDeclaration(declaration);
                      if (!isPrivateWithinAmbient(root) && !(root.kind === 130 && isPrivateWithinAmbient(root.parent))) {
                          reportImplicitAnyError(declaration, type);
                      }
                  }
                  return type;
              }
              function getTypeOfVariableOrParameterOrProperty(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      if (symbol.flags & 134217728) {
                          return links.type = getTypeOfPrototypeProperty(symbol);
                      }
                      var declaration = symbol.valueDeclaration;
                      if (declaration.parent.kind === 224) {
                          return links.type = anyType;
                      }
                      if (declaration.kind === 215) {
                          return links.type = checkExpression(declaration.expression);
                      }
                      if (!pushTypeResolution(symbol)) {
                          return unknownType;
                      }
                      var type = getWidenedTypeForVariableLikeDeclaration(declaration, true);
                      if (!popTypeResolution()) {
                          if (symbol.valueDeclaration.type) {
                              type = unknownType;
                              error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
                          }
                          else {
                              type = anyType;
                              if (compilerOptions.noImplicitAny) {
                                  error(symbol.valueDeclaration, ts.Diagnostics._0_implicitly_has_type_any_because_it_is_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer, symbolToString(symbol));
                              }
                          }
                      }
                      links.type = type;
                  }
                  return links.type;
              }
              function getSetAccessorTypeAnnotationNode(accessor) {
                  return accessor && accessor.parameters.length > 0 && accessor.parameters[0].type;
              }
              function getAnnotatedAccessorType(accessor) {
                  if (accessor) {
                      if (accessor.kind === 137) {
                          return accessor.type && getTypeFromTypeNode(accessor.type);
                      }
                      else {
                          var setterTypeAnnotation = getSetAccessorTypeAnnotationNode(accessor);
                          return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation);
                      }
                  }
                  return undefined;
              }
              function getTypeOfAccessors(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      if (!pushTypeResolution(symbol)) {
                          return unknownType;
                      }
                      var getter = ts.getDeclarationOfKind(symbol, 137);
                      var setter = ts.getDeclarationOfKind(symbol, 138);
                      var type;
                      var getterReturnType = getAnnotatedAccessorType(getter);
                      if (getterReturnType) {
                          type = getterReturnType;
                      }
                      else {
                          var setterParameterType = getAnnotatedAccessorType(setter);
                          if (setterParameterType) {
                              type = setterParameterType;
                          }
                          else {
                              if (getter && getter.body) {
                                  type = getReturnTypeFromBody(getter);
                              }
                              else {
                                  if (compilerOptions.noImplicitAny) {
                                      error(setter, ts.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation, symbolToString(symbol));
                                  }
                                  type = anyType;
                              }
                          }
                      }
                      if (!popTypeResolution()) {
                          type = anyType;
                          if (compilerOptions.noImplicitAny) {
                              var getter_1 = ts.getDeclarationOfKind(symbol, 137);
                              error(getter_1, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
                          }
                      }
                      links.type = type;
                  }
                  return links.type;
              }
              function getTypeOfFuncClassEnumModule(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      links.type = createObjectType(32768, symbol);
                  }
                  return links.type;
              }
              function getTypeOfEnumMember(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      links.type = getDeclaredTypeOfEnum(getParentOfSymbol(symbol));
                  }
                  return links.type;
              }
              function getTypeOfAlias(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      var targetSymbol = resolveAlias(symbol);
                      links.type = targetSymbol.flags & 107455
                          ? getTypeOfSymbol(targetSymbol)
                          : unknownType;
                  }
                  return links.type;
              }
              function getTypeOfInstantiatedSymbol(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.type) {
                      links.type = instantiateType(getTypeOfSymbol(links.target), links.mapper);
                  }
                  return links.type;
              }
              function getTypeOfSymbol(symbol) {
                  if (symbol.flags & 16777216) {
                      return getTypeOfInstantiatedSymbol(symbol);
                  }
                  if (symbol.flags & (3 | 4)) {
                      return getTypeOfVariableOrParameterOrProperty(symbol);
                  }
                  if (symbol.flags & (16 | 8192 | 32 | 384 | 512)) {
                      return getTypeOfFuncClassEnumModule(symbol);
                  }
                  if (symbol.flags & 8) {
                      return getTypeOfEnumMember(symbol);
                  }
                  if (symbol.flags & 98304) {
                      return getTypeOfAccessors(symbol);
                  }
                  if (symbol.flags & 8388608) {
                      return getTypeOfAlias(symbol);
                  }
                  return unknownType;
              }
              function getTargetType(type) {
                  return type.flags & 4096 ? type.target : type;
              }
              function hasBaseType(type, checkBase) {
                  return check(type);
                  function check(type) {
                      var target = getTargetType(type);
                      return target === checkBase || ts.forEach(getBaseTypes(target), check);
                  }
              }
              function getTypeParametersOfClassOrInterface(symbol) {
                  var result;
                  ts.forEach(symbol.declarations, function (node) {
                      if (node.kind === 203 || node.kind === 202) {
                          var declaration = node;
                          if (declaration.typeParameters && declaration.typeParameters.length) {
                              ts.forEach(declaration.typeParameters, function (node) {
                                  var tp = getDeclaredTypeOfTypeParameter(getSymbolOfNode(node));
                                  if (!result) {
                                      result = [tp];
                                  }
                                  else if (!ts.contains(result, tp)) {
                                      result.push(tp);
                                  }
                              });
                          }
                      }
                  });
                  return result;
              }
              function getBaseTypes(type) {
                  var typeWithBaseTypes = type;
                  if (!typeWithBaseTypes.baseTypes) {
                      if (type.symbol.flags & 32) {
                          resolveBaseTypesOfClass(typeWithBaseTypes);
                      }
                      else if (type.symbol.flags & 64) {
                          resolveBaseTypesOfInterface(typeWithBaseTypes);
                      }
                      else {
                          ts.Debug.fail("type must be class or interface");
                      }
                  }
                  return typeWithBaseTypes.baseTypes;
              }
              function resolveBaseTypesOfClass(type) {
                  type.baseTypes = [];
                  var declaration = ts.getDeclarationOfKind(type.symbol, 202);
                  var baseTypeNode = ts.getClassExtendsHeritageClauseElement(declaration);
                  if (baseTypeNode) {
                      var baseType = getTypeFromTypeNode(baseTypeNode);
                      if (baseType !== unknownType) {
                          if (getTargetType(baseType).flags & 1024) {
                              if (type !== baseType && !hasBaseType(baseType, type)) {
                                  type.baseTypes.push(baseType);
                              }
                              else {
                                  error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
                              }
                          }
                          else {
                              error(baseTypeNode, ts.Diagnostics.A_class_may_only_extend_another_class);
                          }
                      }
                  }
              }
              function resolveBaseTypesOfInterface(type) {
                  type.baseTypes = [];
                  for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
                      var declaration = _a[_i];
                      if (declaration.kind === 203 && ts.getInterfaceBaseTypeNodes(declaration)) {
                          for (var _b = 0, _c = ts.getInterfaceBaseTypeNodes(declaration); _b < _c.length; _b++) {
                              var node = _c[_b];
                              var baseType = getTypeFromTypeNode(node);
                              if (baseType !== unknownType) {
                                  if (getTargetType(baseType).flags & (1024 | 2048)) {
                                      if (type !== baseType && !hasBaseType(baseType, type)) {
                                          type.baseTypes.push(baseType);
                                      }
                                      else {
                                          error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
                                      }
                                  }
                                  else {
                                      error(node, ts.Diagnostics.An_interface_may_only_extend_a_class_or_another_interface);
                                  }
                              }
                          }
                      }
                  }
              }
              function getDeclaredTypeOfClassOrInterface(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      var kind = symbol.flags & 32 ? 1024 : 2048;
                      var type = links.declaredType = createObjectType(kind, symbol);
                      var typeParameters = getTypeParametersOfClassOrInterface(symbol);
                      if (typeParameters) {
                          type.flags |= 4096;
                          type.typeParameters = typeParameters;
                          type.instantiations = {};
                          type.instantiations[getTypeListId(type.typeParameters)] = type;
                          type.target = type;
                          type.typeArguments = type.typeParameters;
                      }
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfTypeAlias(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      if (!pushTypeResolution(links)) {
                          return unknownType;
                      }
                      var declaration = ts.getDeclarationOfKind(symbol, 204);
                      var type = getTypeFromTypeNode(declaration.type);
                      if (!popTypeResolution()) {
                          type = unknownType;
                          error(declaration.name, ts.Diagnostics.Type_alias_0_circularly_references_itself, symbolToString(symbol));
                      }
                      links.declaredType = type;
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfEnum(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      var type = createType(128);
                      type.symbol = symbol;
                      links.declaredType = type;
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfTypeParameter(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      var type = createType(512);
                      type.symbol = symbol;
                      if (!ts.getDeclarationOfKind(symbol, 129).constraint) {
                          type.constraint = noConstraintType;
                      }
                      links.declaredType = type;
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfAlias(symbol) {
                  var links = getSymbolLinks(symbol);
                  if (!links.declaredType) {
                      links.declaredType = getDeclaredTypeOfSymbol(resolveAlias(symbol));
                  }
                  return links.declaredType;
              }
              function getDeclaredTypeOfSymbol(symbol) {
                  ts.Debug.assert((symbol.flags & 16777216) === 0);
                  if (symbol.flags & (32 | 64)) {
                      return getDeclaredTypeOfClassOrInterface(symbol);
                  }
                  if (symbol.flags & 524288) {
                      return getDeclaredTypeOfTypeAlias(symbol);
                  }
                  if (symbol.flags & 384) {
                      return getDeclaredTypeOfEnum(symbol);
                  }
                  if (symbol.flags & 262144) {
                      return getDeclaredTypeOfTypeParameter(symbol);
                  }
                  if (symbol.flags & 8388608) {
                      return getDeclaredTypeOfAlias(symbol);
                  }
                  return unknownType;
              }
              function createSymbolTable(symbols) {
                  var result = {};
                  for (var _i = 0; _i < symbols.length; _i++) {
                      var symbol = symbols[_i];
                      result[symbol.name] = symbol;
                  }
                  return result;
              }
              function createInstantiatedSymbolTable(symbols, mapper) {
                  var result = {};
                  for (var _i = 0; _i < symbols.length; _i++) {
                      var symbol = symbols[_i];
                      result[symbol.name] = instantiateSymbol(symbol, mapper);
                  }
                  return result;
              }
              function addInheritedMembers(symbols, baseSymbols) {
                  for (var _i = 0; _i < baseSymbols.length; _i++) {
                      var s = baseSymbols[_i];
                      if (!ts.hasProperty(symbols, s.name)) {
                          symbols[s.name] = s;
                      }
                  }
              }
              function addInheritedSignatures(signatures, baseSignatures) {
                  if (baseSignatures) {
                      for (var _i = 0; _i < baseSignatures.length; _i++) {
                          var signature = baseSignatures[_i];
                          signatures.push(signature);
                      }
                  }
              }
              function resolveDeclaredMembers(type) {
                  if (!type.declaredProperties) {
                      var symbol = type.symbol;
                      type.declaredProperties = getNamedMembers(symbol.members);
                      type.declaredCallSignatures = getSignaturesOfSymbol(symbol.members["__call"]);
                      type.declaredConstructSignatures = getSignaturesOfSymbol(symbol.members["__new"]);
                      type.declaredStringIndexType = getIndexTypeOfSymbol(symbol, 0);
                      type.declaredNumberIndexType = getIndexTypeOfSymbol(symbol, 1);
                  }
                  return type;
              }
              function resolveClassOrInterfaceMembers(type) {
                  var target = resolveDeclaredMembers(type);
                  var members = target.symbol.members;
                  var callSignatures = target.declaredCallSignatures;
                  var constructSignatures = target.declaredConstructSignatures;
                  var stringIndexType = target.declaredStringIndexType;
                  var numberIndexType = target.declaredNumberIndexType;
                  var baseTypes = getBaseTypes(target);
                  if (baseTypes.length) {
                      members = createSymbolTable(target.declaredProperties);
                      for (var _i = 0; _i < baseTypes.length; _i++) {
                          var baseType = baseTypes[_i];
                          addInheritedMembers(members, getPropertiesOfObjectType(baseType));
                          callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(baseType, 0));
                          constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(baseType, 1));
                          stringIndexType = stringIndexType || getIndexTypeOfType(baseType, 0);
                          numberIndexType = numberIndexType || getIndexTypeOfType(baseType, 1);
                      }
                  }
                  setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function resolveTypeReferenceMembers(type) {
                  var target = resolveDeclaredMembers(type.target);
                  var mapper = createTypeMapper(target.typeParameters, type.typeArguments);
                  var members = createInstantiatedSymbolTable(target.declaredProperties, mapper);
                  var callSignatures = instantiateList(target.declaredCallSignatures, mapper, instantiateSignature);
                  var constructSignatures = instantiateList(target.declaredConstructSignatures, mapper, instantiateSignature);
                  var stringIndexType = target.declaredStringIndexType ? instantiateType(target.declaredStringIndexType, mapper) : undefined;
                  var numberIndexType = target.declaredNumberIndexType ? instantiateType(target.declaredNumberIndexType, mapper) : undefined;
                  ts.forEach(getBaseTypes(target), function (baseType) {
                      var instantiatedBaseType = instantiateType(baseType, mapper);
                      addInheritedMembers(members, getPropertiesOfObjectType(instantiatedBaseType));
                      callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(instantiatedBaseType, 0));
                      constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(instantiatedBaseType, 1));
                      stringIndexType = stringIndexType || getIndexTypeOfType(instantiatedBaseType, 0);
                      numberIndexType = numberIndexType || getIndexTypeOfType(instantiatedBaseType, 1);
                  });
                  setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function createSignature(declaration, typeParameters, parameters, resolvedReturnType, minArgumentCount, hasRestParameter, hasStringLiterals) {
                  var sig = new Signature(checker);
                  sig.declaration = declaration;
                  sig.typeParameters = typeParameters;
                  sig.parameters = parameters;
                  sig.resolvedReturnType = resolvedReturnType;
                  sig.minArgumentCount = minArgumentCount;
                  sig.hasRestParameter = hasRestParameter;
                  sig.hasStringLiterals = hasStringLiterals;
                  return sig;
              }
              function cloneSignature(sig) {
                  return createSignature(sig.declaration, sig.typeParameters, sig.parameters, sig.resolvedReturnType, sig.minArgumentCount, sig.hasRestParameter, sig.hasStringLiterals);
              }
              function getDefaultConstructSignatures(classType) {
                  var baseTypes = getBaseTypes(classType);
                  if (baseTypes.length) {
                      var baseType = baseTypes[0];
                      var baseSignatures = getSignaturesOfType(getTypeOfSymbol(baseType.symbol), 1);
                      return ts.map(baseSignatures, function (baseSignature) {
                          var signature = baseType.flags & 4096 ?
                              getSignatureInstantiation(baseSignature, baseType.typeArguments) : cloneSignature(baseSignature);
                          signature.typeParameters = classType.typeParameters;
                          signature.resolvedReturnType = classType;
                          return signature;
                      });
                  }
                  return [createSignature(undefined, classType.typeParameters, emptyArray, classType, 0, false, false)];
              }
              function createTupleTypeMemberSymbols(memberTypes) {
                  var members = {};
                  for (var i = 0; i < memberTypes.length; i++) {
                      var symbol = createSymbol(4 | 67108864, "" + i);
                      symbol.type = memberTypes[i];
                      members[i] = symbol;
                  }
                  return members;
              }
              function resolveTupleTypeMembers(type) {
                  var arrayType = resolveObjectOrUnionTypeMembers(createArrayType(getUnionType(type.elementTypes)));
                  var members = createTupleTypeMemberSymbols(type.elementTypes);
                  addInheritedMembers(members, arrayType.properties);
                  setObjectTypeMembers(type, members, arrayType.callSignatures, arrayType.constructSignatures, arrayType.stringIndexType, arrayType.numberIndexType);
              }
              function signatureListsIdentical(s, t) {
                  if (s.length !== t.length) {
                      return false;
                  }
                  for (var i = 0; i < s.length; i++) {
                      if (!compareSignatures(s[i], t[i], false, compareTypes)) {
                          return false;
                      }
                  }
                  return true;
              }
              function getUnionSignatures(types, kind) {
                  var signatureLists = ts.map(types, function (t) { return getSignaturesOfType(t, kind); });
                  var signatures = signatureLists[0];
                  for (var _i = 0; _i < signatures.length; _i++) {
                      var signature = signatures[_i];
                      if (signature.typeParameters) {
                          return emptyArray;
                      }
                  }
                  for (var i_1 = 1; i_1 < signatureLists.length; i_1++) {
                      if (!signatureListsIdentical(signatures, signatureLists[i_1])) {
                          return emptyArray;
                      }
                  }
                  var result = ts.map(signatures, cloneSignature);
                  for (var i = 0; i < result.length; i++) {
                      var s = result[i];
                      s.resolvedReturnType = undefined;
                      s.unionSignatures = ts.map(signatureLists, function (signatures) { return signatures[i]; });
                  }
                  return result;
              }
              function getUnionIndexType(types, kind) {
                  var indexTypes = [];
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      var indexType = getIndexTypeOfType(type, kind);
                      if (!indexType) {
                          return undefined;
                      }
                      indexTypes.push(indexType);
                  }
                  return getUnionType(indexTypes);
              }
              function resolveUnionTypeMembers(type) {
                  var callSignatures = getUnionSignatures(type.types, 0);
                  var constructSignatures = getUnionSignatures(type.types, 1);
                  var stringIndexType = getUnionIndexType(type.types, 0);
                  var numberIndexType = getUnionIndexType(type.types, 1);
                  setObjectTypeMembers(type, emptySymbols, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function resolveAnonymousTypeMembers(type) {
                  var symbol = type.symbol;
                  var members;
                  var callSignatures;
                  var constructSignatures;
                  var stringIndexType;
                  var numberIndexType;
                  if (symbol.flags & 2048) {
                      members = symbol.members;
                      callSignatures = getSignaturesOfSymbol(members["__call"]);
                      constructSignatures = getSignaturesOfSymbol(members["__new"]);
                      stringIndexType = getIndexTypeOfSymbol(symbol, 0);
                      numberIndexType = getIndexTypeOfSymbol(symbol, 1);
                  }
                  else {
                      members = emptySymbols;
                      callSignatures = emptyArray;
                      constructSignatures = emptyArray;
                      if (symbol.flags & 1952) {
                          members = getExportsOfSymbol(symbol);
                      }
                      if (symbol.flags & (16 | 8192)) {
                          callSignatures = getSignaturesOfSymbol(symbol);
                      }
                      if (symbol.flags & 32) {
                          var classType = getDeclaredTypeOfClassOrInterface(symbol);
                          constructSignatures = getSignaturesOfSymbol(symbol.members["__constructor"]);
                          if (!constructSignatures.length) {
                              constructSignatures = getDefaultConstructSignatures(classType);
                          }
                          var baseTypes = getBaseTypes(classType);
                          if (baseTypes.length) {
                              members = createSymbolTable(getNamedMembers(members));
                              addInheritedMembers(members, getPropertiesOfObjectType(getTypeOfSymbol(baseTypes[0].symbol)));
                          }
                      }
                      stringIndexType = undefined;
                      numberIndexType = (symbol.flags & 384) ? stringType : undefined;
                  }
                  setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
              }
              function resolveObjectOrUnionTypeMembers(type) {
                  if (!type.members) {
                      if (type.flags & (1024 | 2048)) {
                          resolveClassOrInterfaceMembers(type);
                      }
                      else if (type.flags & 32768) {
                          resolveAnonymousTypeMembers(type);
                      }
                      else if (type.flags & 8192) {
                          resolveTupleTypeMembers(type);
                      }
                      else if (type.flags & 16384) {
                          resolveUnionTypeMembers(type);
                      }
                      else {
                          resolveTypeReferenceMembers(type);
                      }
                  }
                  return type;
              }
              function getPropertiesOfObjectType(type) {
                  if (type.flags & 48128) {
                      return resolveObjectOrUnionTypeMembers(type).properties;
                  }
                  return emptyArray;
              }
              function getPropertyOfObjectType(type, name) {
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (ts.hasProperty(resolved.members, name)) {
                          var symbol = resolved.members[name];
                          if (symbolIsValue(symbol)) {
                              return symbol;
                          }
                      }
                  }
              }
              function getPropertiesOfUnionType(type) {
                  var result = [];
                  ts.forEach(getPropertiesOfType(type.types[0]), function (prop) {
                      var unionProp = getPropertyOfUnionType(type, prop.name);
                      if (unionProp) {
                          result.push(unionProp);
                      }
                  });
                  return result;
              }
              function getPropertiesOfType(type) {
                  type = getApparentType(type);
                  return type.flags & 16384 ? getPropertiesOfUnionType(type) : getPropertiesOfObjectType(type);
              }
              function getApparentType(type) {
                  if (type.flags & 16384) {
                      type = getReducedTypeOfUnionType(type);
                  }
                  if (type.flags & 512) {
                      do {
                          type = getConstraintOfTypeParameter(type);
                      } while (type && type.flags & 512);
                      if (!type) {
                          type = emptyObjectType;
                      }
                  }
                  if (type.flags & 258) {
                      type = globalStringType;
                  }
                  else if (type.flags & 132) {
                      type = globalNumberType;
                  }
                  else if (type.flags & 8) {
                      type = globalBooleanType;
                  }
                  else if (type.flags & 1048576) {
                      type = globalESSymbolType;
                  }
                  return type;
              }
              function createUnionProperty(unionType, name) {
                  var types = unionType.types;
                  var props;
                  for (var _i = 0; _i < types.length; _i++) {
                      var current = types[_i];
                      var type = getApparentType(current);
                      if (type !== unknownType) {
                          var prop = getPropertyOfType(type, name);
                          if (!prop || getDeclarationFlagsFromSymbol(prop) & (32 | 64)) {
                              return undefined;
                          }
                          if (!props) {
                              props = [prop];
                          }
                          else {
                              props.push(prop);
                          }
                      }
                  }
                  var propTypes = [];
                  var declarations = [];
                  for (var _a = 0; _a < props.length; _a++) {
                      var prop = props[_a];
                      if (prop.declarations) {
                          declarations.push.apply(declarations, prop.declarations);
                      }
                      propTypes.push(getTypeOfSymbol(prop));
                  }
                  var result = createSymbol(4 | 67108864 | 268435456, name);
                  result.unionType = unionType;
                  result.declarations = declarations;
                  result.type = getUnionType(propTypes);
                  return result;
              }
              function getPropertyOfUnionType(type, name) {
                  var properties = type.resolvedProperties || (type.resolvedProperties = {});
                  if (ts.hasProperty(properties, name)) {
                      return properties[name];
                  }
                  var property = createUnionProperty(type, name);
                  if (property) {
                      properties[name] = property;
                  }
                  return property;
              }
              function getPropertyOfType(type, name) {
                  type = getApparentType(type);
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (ts.hasProperty(resolved.members, name)) {
                          var symbol = resolved.members[name];
                          if (symbolIsValue(symbol)) {
                              return symbol;
                          }
                      }
                      if (resolved === anyFunctionType || resolved.callSignatures.length || resolved.constructSignatures.length) {
                          var symbol = getPropertyOfObjectType(globalFunctionType, name);
                          if (symbol) {
                              return symbol;
                          }
                      }
                      return getPropertyOfObjectType(globalObjectType, name);
                  }
                  if (type.flags & 16384) {
                      return getPropertyOfUnionType(type, name);
                  }
                  return undefined;
              }
              function getSignaturesOfObjectOrUnionType(type, kind) {
                  if (type.flags & (48128 | 16384)) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      return kind === 0 ? resolved.callSignatures : resolved.constructSignatures;
                  }
                  return emptyArray;
              }
              function getSignaturesOfType(type, kind) {
                  return getSignaturesOfObjectOrUnionType(getApparentType(type), kind);
              }
              function typeHasCallOrConstructSignatures(type) {
                  var apparentType = getApparentType(type);
                  if (apparentType.flags & (48128 | 16384)) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      return resolved.callSignatures.length > 0
                          || resolved.constructSignatures.length > 0;
                  }
                  return false;
              }
              function getIndexTypeOfObjectOrUnionType(type, kind) {
                  if (type.flags & (48128 | 16384)) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      return kind === 0 ? resolved.stringIndexType : resolved.numberIndexType;
                  }
              }
              function getIndexTypeOfType(type, kind) {
                  return getIndexTypeOfObjectOrUnionType(getApparentType(type), kind);
              }
              function getTypeParametersFromDeclaration(typeParameterDeclarations) {
                  var result = [];
                  ts.forEach(typeParameterDeclarations, function (node) {
                      var tp = getDeclaredTypeOfTypeParameter(node.symbol);
                      if (!ts.contains(result, tp)) {
                          result.push(tp);
                      }
                  });
                  return result;
              }
              function symbolsToArray(symbols) {
                  var result = [];
                  for (var id in symbols) {
                      if (!isReservedMemberName(id)) {
                          result.push(symbols[id]);
                      }
                  }
                  return result;
              }
              function getSignatureFromDeclaration(declaration) {
                  var links = getNodeLinks(declaration);
                  if (!links.resolvedSignature) {
                      var classType = declaration.kind === 136 ? getDeclaredTypeOfClassOrInterface(declaration.parent.symbol) : undefined;
                      var typeParameters = classType ? classType.typeParameters :
                          declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : undefined;
                      var parameters = [];
                      var hasStringLiterals = false;
                      var minArgumentCount = -1;
                      for (var i = 0, n = declaration.parameters.length; i < n; i++) {
                          var param = declaration.parameters[i];
                          parameters.push(param.symbol);
                          if (param.type && param.type.kind === 8) {
                              hasStringLiterals = true;
                          }
                          if (minArgumentCount < 0) {
                              if (param.initializer || param.questionToken || param.dotDotDotToken) {
                                  minArgumentCount = i;
                              }
                          }
                      }
                      if (minArgumentCount < 0) {
                          minArgumentCount = declaration.parameters.length;
                      }
                      var returnType;
                      if (classType) {
                          returnType = classType;
                      }
                      else if (declaration.type) {
                          returnType = getTypeFromTypeNode(declaration.type);
                      }
                      else {
                          if (declaration.kind === 137 && !ts.hasDynamicName(declaration)) {
                              var setter = ts.getDeclarationOfKind(declaration.symbol, 138);
                              returnType = getAnnotatedAccessorType(setter);
                          }
                          if (!returnType && ts.nodeIsMissing(declaration.body)) {
                              returnType = anyType;
                          }
                      }
                      links.resolvedSignature = createSignature(declaration, typeParameters, parameters, returnType, minArgumentCount, ts.hasRestParameters(declaration), hasStringLiterals);
                  }
                  return links.resolvedSignature;
              }
              function getSignaturesOfSymbol(symbol) {
                  if (!symbol)
                      return emptyArray;
                  var result = [];
                  for (var i = 0, len = symbol.declarations.length; i < len; i++) {
                      var node = symbol.declarations[i];
                      switch (node.kind) {
                          case 143:
                          case 144:
                          case 201:
                          case 135:
                          case 134:
                          case 136:
                          case 139:
                          case 140:
                          case 141:
                          case 137:
                          case 138:
                          case 163:
                          case 164:
                              if (i > 0 && node.body) {
                                  var previous = symbol.declarations[i - 1];
                                  if (node.parent === previous.parent && node.kind === previous.kind && node.pos === previous.end) {
                                      break;
                                  }
                              }
                              result.push(getSignatureFromDeclaration(node));
                      }
                  }
                  return result;
              }
              function getReturnTypeOfSignature(signature) {
                  if (!signature.resolvedReturnType) {
                      if (!pushTypeResolution(signature)) {
                          return unknownType;
                      }
                      var type;
                      if (signature.target) {
                          type = instantiateType(getReturnTypeOfSignature(signature.target), signature.mapper);
                      }
                      else if (signature.unionSignatures) {
                          type = getUnionType(ts.map(signature.unionSignatures, getReturnTypeOfSignature));
                      }
                      else {
                          type = getReturnTypeFromBody(signature.declaration);
                      }
                      if (!popTypeResolution()) {
                          type = anyType;
                          if (compilerOptions.noImplicitAny) {
                              var declaration = signature.declaration;
                              if (declaration.name) {
                                  error(declaration.name, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, ts.declarationNameToString(declaration.name));
                              }
                              else {
                                  error(declaration, ts.Diagnostics.Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions);
                              }
                          }
                      }
                      signature.resolvedReturnType = type;
                  }
                  return signature.resolvedReturnType;
              }
              function getRestTypeOfSignature(signature) {
                  if (signature.hasRestParameter) {
                      var type = getTypeOfSymbol(ts.lastOrUndefined(signature.parameters));
                      if (type.flags & 4096 && type.target === globalArrayType) {
                          return type.typeArguments[0];
                      }
                  }
                  return anyType;
              }
              function getSignatureInstantiation(signature, typeArguments) {
                  return instantiateSignature(signature, createTypeMapper(signature.typeParameters, typeArguments), true);
              }
              function getErasedSignature(signature) {
                  if (!signature.typeParameters)
                      return signature;
                  if (!signature.erasedSignatureCache) {
                      if (signature.target) {
                          signature.erasedSignatureCache = instantiateSignature(getErasedSignature(signature.target), signature.mapper);
                      }
                      else {
                          signature.erasedSignatureCache = instantiateSignature(signature, createTypeEraser(signature.typeParameters), true);
                      }
                  }
                  return signature.erasedSignatureCache;
              }
              function getOrCreateTypeFromSignature(signature) {
                  if (!signature.isolatedSignatureType) {
                      var isConstructor = signature.declaration.kind === 136 || signature.declaration.kind === 140;
                      var type = createObjectType(32768 | 65536);
                      type.members = emptySymbols;
                      type.properties = emptyArray;
                      type.callSignatures = !isConstructor ? [signature] : emptyArray;
                      type.constructSignatures = isConstructor ? [signature] : emptyArray;
                      signature.isolatedSignatureType = type;
                  }
                  return signature.isolatedSignatureType;
              }
              function getIndexSymbol(symbol) {
                  return symbol.members["__index"];
              }
              function getIndexDeclarationOfSymbol(symbol, kind) {
                  var syntaxKind = kind === 1 ? 120 : 122;
                  var indexSymbol = getIndexSymbol(symbol);
                  if (indexSymbol) {
                      var len = indexSymbol.declarations.length;
                      for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
                          var decl = _a[_i];
                          var node = decl;
                          if (node.parameters.length === 1) {
                              var parameter = node.parameters[0];
                              if (parameter && parameter.type && parameter.type.kind === syntaxKind) {
                                  return node;
                              }
                          }
                      }
                  }
                  return undefined;
              }
              function getIndexTypeOfSymbol(symbol, kind) {
                  var declaration = getIndexDeclarationOfSymbol(symbol, kind);
                  return declaration
                      ? declaration.type ? getTypeFromTypeNode(declaration.type) : anyType
                      : undefined;
              }
              function getConstraintOfTypeParameter(type) {
                  if (!type.constraint) {
                      if (type.target) {
                          var targetConstraint = getConstraintOfTypeParameter(type.target);
                          type.constraint = targetConstraint ? instantiateType(targetConstraint, type.mapper) : noConstraintType;
                      }
                      else {
                          type.constraint = getTypeFromTypeNode(ts.getDeclarationOfKind(type.symbol, 129).constraint);
                      }
                  }
                  return type.constraint === noConstraintType ? undefined : type.constraint;
              }
              function getTypeListId(types) {
                  switch (types.length) {
                      case 1:
                          return "" + types[0].id;
                      case 2:
                          return types[0].id + "," + types[1].id;
                      default:
                          var result = "";
                          for (var i = 0; i < types.length; i++) {
                              if (i > 0) {
                                  result += ",";
                              }
                              result += types[i].id;
                          }
                          return result;
                  }
              }
              function getWideningFlagsOfTypes(types) {
                  var result = 0;
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      result |= type.flags;
                  }
                  return result & 786432;
              }
              function createTypeReference(target, typeArguments) {
                  var id = getTypeListId(typeArguments);
                  var type = target.instantiations[id];
                  if (!type) {
                      var flags = 4096 | getWideningFlagsOfTypes(typeArguments);
                      type = target.instantiations[id] = createObjectType(flags, target.symbol);
                      type.target = target;
                      type.typeArguments = typeArguments;
                  }
                  return type;
              }
              function isTypeParameterReferenceIllegalInConstraint(typeReferenceNode, typeParameterSymbol) {
                  var links = getNodeLinks(typeReferenceNode);
                  if (links.isIllegalTypeReferenceInConstraint !== undefined) {
                      return links.isIllegalTypeReferenceInConstraint;
                  }
                  var currentNode = typeReferenceNode;
                  while (!ts.forEach(typeParameterSymbol.declarations, function (d) { return d.parent === currentNode.parent; })) {
                      currentNode = currentNode.parent;
                  }
                  links.isIllegalTypeReferenceInConstraint = currentNode.kind === 129;
                  return links.isIllegalTypeReferenceInConstraint;
              }
              function checkTypeParameterHasIllegalReferencesInConstraint(typeParameter) {
                  var typeParameterSymbol;
                  function check(n) {
                      if (n.kind === 142 && n.typeName.kind === 65) {
                          var links = getNodeLinks(n);
                          if (links.isIllegalTypeReferenceInConstraint === undefined) {
                              var symbol = resolveName(typeParameter, n.typeName.text, 793056, undefined, undefined);
                              if (symbol && (symbol.flags & 262144)) {
                                  links.isIllegalTypeReferenceInConstraint = ts.forEach(symbol.declarations, function (d) { return d.parent == typeParameter.parent; });
                              }
                          }
                          if (links.isIllegalTypeReferenceInConstraint) {
                              error(typeParameter, ts.Diagnostics.Constraint_of_a_type_parameter_cannot_reference_any_type_parameter_from_the_same_type_parameter_list);
                          }
                      }
                      ts.forEachChild(n, check);
                  }
                  if (typeParameter.constraint) {
                      typeParameterSymbol = getSymbolOfNode(typeParameter);
                      check(typeParameter.constraint);
                  }
              }
              function getTypeFromTypeReferenceOrExpressionWithTypeArguments(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      var type;
                      if (node.kind !== 177 || ts.isSupportedExpressionWithTypeArguments(node)) {
                          var typeNameOrExpression = node.kind === 142
                              ? node.typeName
                              : node.expression;
                          var symbol = resolveEntityName(typeNameOrExpression, 793056);
                          if (symbol) {
                              if ((symbol.flags & 262144) && isTypeParameterReferenceIllegalInConstraint(node, symbol)) {
                                  type = unknownType;
                              }
                              else {
                                  type = getDeclaredTypeOfSymbol(symbol);
                                  if (type.flags & (1024 | 2048) && type.flags & 4096) {
                                      var typeParameters = type.typeParameters;
                                      if (node.typeArguments && node.typeArguments.length === typeParameters.length) {
                                          type = createTypeReference(type, ts.map(node.typeArguments, getTypeFromTypeNode));
                                      }
                                      else {
                                          error(node, ts.Diagnostics.Generic_type_0_requires_1_type_argument_s, typeToString(type, undefined, 1), typeParameters.length);
                                          type = undefined;
                                      }
                                  }
                                  else {
                                      if (node.typeArguments) {
                                          error(node, ts.Diagnostics.Type_0_is_not_generic, typeToString(type));
                                          type = undefined;
                                      }
                                  }
                              }
                          }
                      }
                      links.resolvedType = type || unknownType;
                  }
                  return links.resolvedType;
              }
              function getTypeFromTypeQueryNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = getWidenedType(checkExpressionOrQualifiedName(node.exprName));
                  }
                  return links.resolvedType;
              }
              function getTypeOfGlobalSymbol(symbol, arity) {
                  function getTypeDeclaration(symbol) {
                      var declarations = symbol.declarations;
                      for (var _i = 0; _i < declarations.length; _i++) {
                          var declaration = declarations[_i];
                          switch (declaration.kind) {
                              case 202:
                              case 203:
                              case 205:
                                  return declaration;
                          }
                      }
                  }
                  if (!symbol) {
                      return emptyObjectType;
                  }
                  var type = getDeclaredTypeOfSymbol(symbol);
                  if (!(type.flags & 48128)) {
                      error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbol.name);
                      return emptyObjectType;
                  }
                  if ((type.typeParameters ? type.typeParameters.length : 0) !== arity) {
                      error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, symbol.name, arity);
                      return emptyObjectType;
                  }
                  return type;
              }
              function getGlobalValueSymbol(name) {
                  return getGlobalSymbol(name, 107455, ts.Diagnostics.Cannot_find_global_value_0);
              }
              function getGlobalTypeSymbol(name) {
                  return getGlobalSymbol(name, 793056, ts.Diagnostics.Cannot_find_global_type_0);
              }
              function getGlobalSymbol(name, meaning, diagnostic) {
                  return resolveName(undefined, name, meaning, diagnostic, name);
              }
              function getGlobalType(name, arity) {
                  if (arity === void 0) { arity = 0; }
                  return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), arity);
              }
              function getGlobalESSymbolConstructorSymbol() {
                  return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"));
              }
              function createIterableType(elementType) {
                  return globalIterableType !== emptyObjectType ? createTypeReference(globalIterableType, [elementType]) : emptyObjectType;
              }
              function createArrayType(elementType) {
                  var arrayType = globalArrayType || getDeclaredTypeOfSymbol(globalArraySymbol);
                  return arrayType !== emptyObjectType ? createTypeReference(arrayType, [elementType]) : emptyObjectType;
              }
              function getTypeFromArrayTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
                  }
                  return links.resolvedType;
              }
              function createTupleType(elementTypes) {
                  var id = getTypeListId(elementTypes);
                  var type = tupleTypes[id];
                  if (!type) {
                      type = tupleTypes[id] = createObjectType(8192);
                      type.elementTypes = elementTypes;
                  }
                  return type;
              }
              function getTypeFromTupleTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = createTupleType(ts.map(node.elementTypes, getTypeFromTypeNode));
                  }
                  return links.resolvedType;
              }
              function addTypeToSortedSet(sortedSet, type) {
                  if (type.flags & 16384) {
                      addTypesToSortedSet(sortedSet, type.types);
                  }
                  else {
                      var i = 0;
                      var id = type.id;
                      while (i < sortedSet.length && sortedSet[i].id < id) {
                          i++;
                      }
                      if (i === sortedSet.length || sortedSet[i].id !== id) {
                          sortedSet.splice(i, 0, type);
                      }
                  }
              }
              function addTypesToSortedSet(sortedTypes, types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      addTypeToSortedSet(sortedTypes, type);
                  }
              }
              function isSubtypeOfAny(candidate, types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      if (candidate !== type && isTypeSubtypeOf(candidate, type)) {
                          return true;
                      }
                  }
                  return false;
              }
              var removeSubtypesStack = [];
              function removeSubtypes(types) {
                  var typeListId = getTypeListId(types);
                  if (removeSubtypesStack.lastIndexOf(typeListId) >= 0) {
                      return;
                  }
                  removeSubtypesStack.push(typeListId);
                  var i = types.length;
                  while (i > 0) {
                      i--;
                      if (isSubtypeOfAny(types[i], types)) {
                          types.splice(i, 1);
                      }
                  }
                  removeSubtypesStack.pop();
              }
              function containsAnyType(types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      if (type.flags & 1) {
                          return true;
                      }
                  }
                  return false;
              }
              function removeAllButLast(types, typeToRemove) {
                  var i = types.length;
                  while (i > 0 && types.length > 1) {
                      i--;
                      if (types[i] === typeToRemove) {
                          types.splice(i, 1);
                      }
                  }
              }
              function getUnionType(types, noSubtypeReduction) {
                  if (types.length === 0) {
                      return emptyObjectType;
                  }
                  var sortedTypes = [];
                  addTypesToSortedSet(sortedTypes, types);
                  if (noSubtypeReduction) {
                      if (containsAnyType(sortedTypes)) {
                          return anyType;
                      }
                      removeAllButLast(sortedTypes, undefinedType);
                      removeAllButLast(sortedTypes, nullType);
                  }
                  else {
                      removeSubtypes(sortedTypes);
                  }
                  if (sortedTypes.length === 1) {
                      return sortedTypes[0];
                  }
                  var id = getTypeListId(sortedTypes);
                  var type = unionTypes[id];
                  if (!type) {
                      type = unionTypes[id] = createObjectType(16384 | getWideningFlagsOfTypes(sortedTypes));
                      type.types = sortedTypes;
                      type.reducedType = noSubtypeReduction ? undefined : type;
                  }
                  return type;
              }
              function getReducedTypeOfUnionType(type) {
                  if (!type.reducedType) {
                      type.reducedType = getUnionType(type.types, false);
                  }
                  return type.reducedType;
              }
              function getTypeFromUnionTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = getUnionType(ts.map(node.types, getTypeFromTypeNode), true);
                  }
                  return links.resolvedType;
              }
              function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = createObjectType(32768, node.symbol);
                  }
                  return links.resolvedType;
              }
              function getStringLiteralType(node) {
                  if (ts.hasProperty(stringLiteralTypes, node.text)) {
                      return stringLiteralTypes[node.text];
                  }
                  var type = stringLiteralTypes[node.text] = createType(256);
                  type.text = ts.getTextOfNode(node);
                  return type;
              }
              function getTypeFromStringLiteral(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = getStringLiteralType(node);
                  }
                  return links.resolvedType;
              }
              function getTypeFromTypeNode(node) {
                  switch (node.kind) {
                      case 112:
                          return anyType;
                      case 122:
                          return stringType;
                      case 120:
                          return numberType;
                      case 113:
                          return booleanType;
                      case 123:
                          return esSymbolType;
                      case 99:
                          return voidType;
                      case 8:
                          return getTypeFromStringLiteral(node);
                      case 142:
                          return getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
                      case 177:
                          return getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
                      case 145:
                          return getTypeFromTypeQueryNode(node);
                      case 147:
                          return getTypeFromArrayTypeNode(node);
                      case 148:
                          return getTypeFromTupleTypeNode(node);
                      case 149:
                          return getTypeFromUnionTypeNode(node);
                      case 150:
                          return getTypeFromTypeNode(node.type);
                      case 143:
                      case 144:
                      case 146:
                          return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
                      case 65:
                      case 127:
                          var symbol = getSymbolInfo(node);
                          return symbol && getDeclaredTypeOfSymbol(symbol);
                      default:
                          return unknownType;
                  }
              }
              function instantiateList(items, mapper, instantiator) {
                  if (items && items.length) {
                      var result = [];
                      for (var _i = 0; _i < items.length; _i++) {
                          var v = items[_i];
                          result.push(instantiator(v, mapper));
                      }
                      return result;
                  }
                  return items;
              }
              function createUnaryTypeMapper(source, target) {
                  return function (t) { return t === source ? target : t; };
              }
              function createBinaryTypeMapper(source1, target1, source2, target2) {
                  return function (t) { return t === source1 ? target1 : t === source2 ? target2 : t; };
              }
              function createTypeMapper(sources, targets) {
                  switch (sources.length) {
                      case 1: return createUnaryTypeMapper(sources[0], targets[0]);
                      case 2: return createBinaryTypeMapper(sources[0], targets[0], sources[1], targets[1]);
                  }
                  return function (t) {
                      for (var i = 0; i < sources.length; i++) {
                          if (t === sources[i]) {
                              return targets[i];
                          }
                      }
                      return t;
                  };
              }
              function createUnaryTypeEraser(source) {
                  return function (t) { return t === source ? anyType : t; };
              }
              function createBinaryTypeEraser(source1, source2) {
                  return function (t) { return t === source1 || t === source2 ? anyType : t; };
              }
              function createTypeEraser(sources) {
                  switch (sources.length) {
                      case 1: return createUnaryTypeEraser(sources[0]);
                      case 2: return createBinaryTypeEraser(sources[0], sources[1]);
                  }
                  return function (t) {
                      for (var _i = 0; _i < sources.length; _i++) {
                          var source = sources[_i];
                          if (t === source) {
                              return anyType;
                          }
                      }
                      return t;
                  };
              }
              function createInferenceMapper(context) {
                  return function (t) {
                      for (var i = 0; i < context.typeParameters.length; i++) {
                          if (t === context.typeParameters[i]) {
                              context.inferences[i].isFixed = true;
                              return getInferredType(context, i);
                          }
                      }
                      return t;
                  };
              }
              function identityMapper(type) {
                  return type;
              }
              function combineTypeMappers(mapper1, mapper2) {
                  return function (t) { return instantiateType(mapper1(t), mapper2); };
              }
              function instantiateTypeParameter(typeParameter, mapper) {
                  var result = createType(512);
                  result.symbol = typeParameter.symbol;
                  if (typeParameter.constraint) {
                      result.constraint = instantiateType(typeParameter.constraint, mapper);
                  }
                  else {
                      result.target = typeParameter;
                      result.mapper = mapper;
                  }
                  return result;
              }
              function instantiateSignature(signature, mapper, eraseTypeParameters) {
                  var freshTypeParameters;
                  if (signature.typeParameters && !eraseTypeParameters) {
                      freshTypeParameters = instantiateList(signature.typeParameters, mapper, instantiateTypeParameter);
                      mapper = combineTypeMappers(createTypeMapper(signature.typeParameters, freshTypeParameters), mapper);
                  }
                  var result = createSignature(signature.declaration, freshTypeParameters, instantiateList(signature.parameters, mapper, instantiateSymbol), signature.resolvedReturnType ? instantiateType(signature.resolvedReturnType, mapper) : undefined, signature.minArgumentCount, signature.hasRestParameter, signature.hasStringLiterals);
                  result.target = signature;
                  result.mapper = mapper;
                  return result;
              }
              function instantiateSymbol(symbol, mapper) {
                  if (symbol.flags & 16777216) {
                      var links = getSymbolLinks(symbol);
                      symbol = links.target;
                      mapper = combineTypeMappers(links.mapper, mapper);
                  }
                  var result = createSymbol(16777216 | 67108864 | symbol.flags, symbol.name);
                  result.declarations = symbol.declarations;
                  result.parent = symbol.parent;
                  result.target = symbol;
                  result.mapper = mapper;
                  if (symbol.valueDeclaration) {
                      result.valueDeclaration = symbol.valueDeclaration;
                  }
                  return result;
              }
              function instantiateAnonymousType(type, mapper) {
                  var result = createObjectType(32768, type.symbol);
                  result.properties = instantiateList(getPropertiesOfObjectType(type), mapper, instantiateSymbol);
                  result.members = createSymbolTable(result.properties);
                  result.callSignatures = instantiateList(getSignaturesOfType(type, 0), mapper, instantiateSignature);
                  result.constructSignatures = instantiateList(getSignaturesOfType(type, 1), mapper, instantiateSignature);
                  var stringIndexType = getIndexTypeOfType(type, 0);
                  var numberIndexType = getIndexTypeOfType(type, 1);
                  if (stringIndexType)
                      result.stringIndexType = instantiateType(stringIndexType, mapper);
                  if (numberIndexType)
                      result.numberIndexType = instantiateType(numberIndexType, mapper);
                  return result;
              }
              function instantiateType(type, mapper) {
                  if (mapper !== identityMapper) {
                      if (type.flags & 512) {
                          return mapper(type);
                      }
                      if (type.flags & 32768) {
                          return type.symbol && type.symbol.flags & (16 | 8192 | 2048 | 4096) ?
                              instantiateAnonymousType(type, mapper) : type;
                      }
                      if (type.flags & 4096) {
                          return createTypeReference(type.target, instantiateList(type.typeArguments, mapper, instantiateType));
                      }
                      if (type.flags & 8192) {
                          return createTupleType(instantiateList(type.elementTypes, mapper, instantiateType));
                      }
                      if (type.flags & 16384) {
                          return getUnionType(instantiateList(type.types, mapper, instantiateType), true);
                      }
                  }
                  return type;
              }
              function isContextSensitive(node) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  switch (node.kind) {
                      case 163:
                      case 164:
                          return isContextSensitiveFunctionLikeDeclaration(node);
                      case 155:
                          return ts.forEach(node.properties, isContextSensitive);
                      case 154:
                          return ts.forEach(node.elements, isContextSensitive);
                      case 171:
                          return isContextSensitive(node.whenTrue) ||
                              isContextSensitive(node.whenFalse);
                      case 170:
                          return node.operatorToken.kind === 49 &&
                              (isContextSensitive(node.left) || isContextSensitive(node.right));
                      case 225:
                          return isContextSensitive(node.initializer);
                      case 135:
                      case 134:
                          return isContextSensitiveFunctionLikeDeclaration(node);
                      case 162:
                          return isContextSensitive(node.expression);
                  }
                  return false;
              }
              function isContextSensitiveFunctionLikeDeclaration(node) {
                  return !node.typeParameters && node.parameters.length && !ts.forEach(node.parameters, function (p) { return p.type; });
              }
              function getTypeWithoutConstructors(type) {
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (resolved.constructSignatures.length) {
                          var result = createObjectType(32768, type.symbol);
                          result.members = resolved.members;
                          result.properties = resolved.properties;
                          result.callSignatures = resolved.callSignatures;
                          result.constructSignatures = emptyArray;
                          type = result;
                      }
                  }
                  return type;
              }
              var subtypeRelation = {};
              var assignableRelation = {};
              var identityRelation = {};
              function isTypeIdenticalTo(source, target) {
                  return checkTypeRelatedTo(source, target, identityRelation, undefined);
              }
              function compareTypes(source, target) {
                  return checkTypeRelatedTo(source, target, identityRelation, undefined) ? -1 : 0;
              }
              function isTypeSubtypeOf(source, target) {
                  return checkTypeSubtypeOf(source, target, undefined);
              }
              function isTypeAssignableTo(source, target) {
                  return checkTypeAssignableTo(source, target, undefined);
              }
              function checkTypeSubtypeOf(source, target, errorNode, headMessage, containingMessageChain) {
                  return checkTypeRelatedTo(source, target, subtypeRelation, errorNode, headMessage, containingMessageChain);
              }
              function checkTypeAssignableTo(source, target, errorNode, headMessage) {
                  return checkTypeRelatedTo(source, target, assignableRelation, errorNode, headMessage);
              }
              function isSignatureAssignableTo(source, target) {
                  var sourceType = getOrCreateTypeFromSignature(source);
                  var targetType = getOrCreateTypeFromSignature(target);
                  return checkTypeRelatedTo(sourceType, targetType, assignableRelation, undefined);
              }
              function checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain) {
                  var errorInfo;
                  var sourceStack;
                  var targetStack;
                  var maybeStack;
                  var expandingFlags;
                  var depth = 0;
                  var overflow = false;
                  var elaborateErrors = false;
                  ts.Debug.assert(relation !== identityRelation || !errorNode, "no error reporting in identity checking");
                  var result = isRelatedTo(source, target, errorNode !== undefined, headMessage);
                  if (overflow) {
                      error(errorNode, ts.Diagnostics.Excessive_stack_depth_comparing_types_0_and_1, typeToString(source), typeToString(target));
                  }
                  else if (errorInfo) {
                      if (errorInfo.next === undefined) {
                          errorInfo = undefined;
                          elaborateErrors = true;
                          isRelatedTo(source, target, errorNode !== undefined, headMessage);
                      }
                      if (containingMessageChain) {
                          errorInfo = ts.concatenateDiagnosticMessageChains(containingMessageChain, errorInfo);
                      }
                      diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(errorNode, errorInfo));
                  }
                  return result !== 0;
                  function reportError(message, arg0, arg1, arg2) {
                      errorInfo = ts.chainDiagnosticMessages(errorInfo, message, arg0, arg1, arg2);
                  }
                  function isRelatedTo(source, target, reportErrors, headMessage) {
                      var result;
                      if (source === target)
                          return -1;
                      if (relation !== identityRelation) {
                          if (target.flags & 1)
                              return -1;
                          if (source === undefinedType)
                              return -1;
                          if (source === nullType && target !== undefinedType)
                              return -1;
                          if (source.flags & 128 && target === numberType)
                              return -1;
                          if (source.flags & 256 && target === stringType)
                              return -1;
                          if (relation === assignableRelation) {
                              if (source.flags & 1)
                                  return -1;
                              if (source === numberType && target.flags & 128)
                                  return -1;
                          }
                      }
                      var saveErrorInfo = errorInfo;
                      if (source.flags & 16384 || target.flags & 16384) {
                          if (relation === identityRelation) {
                              if (source.flags & 16384 && target.flags & 16384) {
                                  if (result = unionTypeRelatedToUnionType(source, target)) {
                                      if (result &= unionTypeRelatedToUnionType(target, source)) {
                                          return result;
                                      }
                                  }
                              }
                              else if (source.flags & 16384) {
                                  if (result = unionTypeRelatedToType(source, target, reportErrors)) {
                                      return result;
                                  }
                              }
                              else {
                                  if (result = unionTypeRelatedToType(target, source, reportErrors)) {
                                      return result;
                                  }
                              }
                          }
                          else {
                              if (source.flags & 16384) {
                                  if (result = unionTypeRelatedToType(source, target, reportErrors)) {
                                      return result;
                                  }
                              }
                              else {
                                  if (result = typeRelatedToUnionType(source, target, reportErrors)) {
                                      return result;
                                  }
                              }
                          }
                      }
                      else if (source.flags & 512 && target.flags & 512) {
                          if (result = typeParameterRelatedTo(source, target, reportErrors)) {
                              return result;
                          }
                      }
                      else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
                          if (result = typesRelatedTo(source.typeArguments, target.typeArguments, reportErrors)) {
                              return result;
                          }
                      }
                      var reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo;
                      var sourceOrApparentType = relation === identityRelation ? source : getApparentType(source);
                      if (sourceOrApparentType.flags & 48128 && target.flags & 48128) {
                          if (result = objectTypeRelatedTo(sourceOrApparentType, target, reportStructuralErrors)) {
                              errorInfo = saveErrorInfo;
                              return result;
                          }
                      }
                      else if (source.flags & 512 && sourceOrApparentType.flags & 16384) {
                          errorInfo = saveErrorInfo;
                          if (result = isRelatedTo(sourceOrApparentType, target, reportErrors)) {
                              return result;
                          }
                      }
                      if (reportErrors) {
                          headMessage = headMessage || ts.Diagnostics.Type_0_is_not_assignable_to_type_1;
                          var sourceType = typeToString(source);
                          var targetType = typeToString(target);
                          if (sourceType === targetType) {
                              sourceType = typeToString(source, undefined, 128);
                              targetType = typeToString(target, undefined, 128);
                          }
                          reportError(headMessage, sourceType, targetType);
                      }
                      return 0;
                  }
                  function unionTypeRelatedToUnionType(source, target) {
                      var result = -1;
                      var sourceTypes = source.types;
                      for (var _i = 0; _i < sourceTypes.length; _i++) {
                          var sourceType = sourceTypes[_i];
                          var related = typeRelatedToUnionType(sourceType, target, false);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function typeRelatedToUnionType(source, target, reportErrors) {
                      var targetTypes = target.types;
                      for (var i = 0, len = targetTypes.length; i < len; i++) {
                          var related = isRelatedTo(source, targetTypes[i], reportErrors && i === len - 1);
                          if (related) {
                              return related;
                          }
                      }
                      return 0;
                  }
                  function unionTypeRelatedToType(source, target, reportErrors) {
                      var result = -1;
                      var sourceTypes = source.types;
                      for (var _i = 0; _i < sourceTypes.length; _i++) {
                          var sourceType = sourceTypes[_i];
                          var related = isRelatedTo(sourceType, target, reportErrors);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function typesRelatedTo(sources, targets, reportErrors) {
                      var result = -1;
                      for (var i = 0, len = sources.length; i < len; i++) {
                          var related = isRelatedTo(sources[i], targets[i], reportErrors);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function typeParameterRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          if (source.symbol.name !== target.symbol.name) {
                              return 0;
                          }
                          if (source.constraint === target.constraint) {
                              return -1;
                          }
                          if (source.constraint === noConstraintType || target.constraint === noConstraintType) {
                              return 0;
                          }
                          return isRelatedTo(source.constraint, target.constraint, reportErrors);
                      }
                      else {
                          while (true) {
                              var constraint = getConstraintOfTypeParameter(source);
                              if (constraint === target)
                                  return -1;
                              if (!(constraint && constraint.flags & 512))
                                  break;
                              source = constraint;
                          }
                          return 0;
                      }
                  }
                  function objectTypeRelatedTo(source, target, reportErrors) {
                      if (overflow) {
                          return 0;
                      }
                      var id = relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id;
                      var related = relation[id];
                      if (related !== undefined) {
                          if (!elaborateErrors || (related === 3)) {
                              return related === 1 ? -1 : 0;
                          }
                      }
                      if (depth > 0) {
                          for (var i = 0; i < depth; i++) {
                              if (maybeStack[i][id]) {
                                  return 1;
                              }
                          }
                          if (depth === 100) {
                              overflow = true;
                              return 0;
                          }
                      }
                      else {
                          sourceStack = [];
                          targetStack = [];
                          maybeStack = [];
                          expandingFlags = 0;
                      }
                      sourceStack[depth] = source;
                      targetStack[depth] = target;
                      maybeStack[depth] = {};
                      maybeStack[depth][id] = 1;
                      depth++;
                      var saveExpandingFlags = expandingFlags;
                      if (!(expandingFlags & 1) && isDeeplyNestedGeneric(source, sourceStack))
                          expandingFlags |= 1;
                      if (!(expandingFlags & 2) && isDeeplyNestedGeneric(target, targetStack))
                          expandingFlags |= 2;
                      var result;
                      if (expandingFlags === 3) {
                          result = 1;
                      }
                      else {
                          result = propertiesRelatedTo(source, target, reportErrors);
                          if (result) {
                              result &= signaturesRelatedTo(source, target, 0, reportErrors);
                              if (result) {
                                  result &= signaturesRelatedTo(source, target, 1, reportErrors);
                                  if (result) {
                                      result &= stringIndexTypesRelatedTo(source, target, reportErrors);
                                      if (result) {
                                          result &= numberIndexTypesRelatedTo(source, target, reportErrors);
                                      }
                                  }
                              }
                          }
                      }
                      expandingFlags = saveExpandingFlags;
                      depth--;
                      if (result) {
                          var maybeCache = maybeStack[depth];
                          var destinationCache = (result === -1 || depth === 0) ? relation : maybeStack[depth - 1];
                          ts.copyMap(maybeCache, destinationCache);
                      }
                      else {
                          relation[id] = reportErrors ? 3 : 2;
                      }
                      return result;
                  }
                  function isDeeplyNestedGeneric(type, stack) {
                      if (type.flags & 4096 && depth >= 10) {
                          var target_1 = type.target;
                          var count = 0;
                          for (var i = 0; i < depth; i++) {
                              var t = stack[i];
                              if (t.flags & 4096 && t.target === target_1) {
                                  count++;
                                  if (count >= 10)
                                      return true;
                              }
                          }
                      }
                      return false;
                  }
                  function propertiesRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          return propertiesIdenticalTo(source, target);
                      }
                      var result = -1;
                      var properties = getPropertiesOfObjectType(target);
                      var requireOptionalProperties = relation === subtypeRelation && !(source.flags & 131072);
                      for (var _i = 0; _i < properties.length; _i++) {
                          var targetProp = properties[_i];
                          var sourceProp = getPropertyOfType(source, targetProp.name);
                          if (sourceProp !== targetProp) {
                              if (!sourceProp) {
                                  if (!(targetProp.flags & 536870912) || requireOptionalProperties) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Property_0_is_missing_in_type_1, symbolToString(targetProp), typeToString(source));
                                      }
                                      return 0;
                                  }
                              }
                              else if (!(targetProp.flags & 134217728)) {
                                  var sourceFlags = getDeclarationFlagsFromSymbol(sourceProp);
                                  var targetFlags = getDeclarationFlagsFromSymbol(targetProp);
                                  if (sourceFlags & 32 || targetFlags & 32) {
                                      if (sourceProp.valueDeclaration !== targetProp.valueDeclaration) {
                                          if (reportErrors) {
                                              if (sourceFlags & 32 && targetFlags & 32) {
                                                  reportError(ts.Diagnostics.Types_have_separate_declarations_of_a_private_property_0, symbolToString(targetProp));
                                              }
                                              else {
                                                  reportError(ts.Diagnostics.Property_0_is_private_in_type_1_but_not_in_type_2, symbolToString(targetProp), typeToString(sourceFlags & 32 ? source : target), typeToString(sourceFlags & 32 ? target : source));
                                              }
                                          }
                                          return 0;
                                      }
                                  }
                                  else if (targetFlags & 64) {
                                      var sourceDeclaredInClass = sourceProp.parent && sourceProp.parent.flags & 32;
                                      var sourceClass = sourceDeclaredInClass ? getDeclaredTypeOfSymbol(sourceProp.parent) : undefined;
                                      var targetClass = getDeclaredTypeOfSymbol(targetProp.parent);
                                      if (!sourceClass || !hasBaseType(sourceClass, targetClass)) {
                                          if (reportErrors) {
                                              reportError(ts.Diagnostics.Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2, symbolToString(targetProp), typeToString(sourceClass || source), typeToString(targetClass));
                                          }
                                          return 0;
                                      }
                                  }
                                  else if (sourceFlags & 64) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Property_0_is_protected_in_type_1_but_public_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
                                      }
                                      return 0;
                                  }
                                  var related = isRelatedTo(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp), reportErrors);
                                  if (!related) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Types_of_property_0_are_incompatible, symbolToString(targetProp));
                                      }
                                      return 0;
                                  }
                                  result &= related;
                                  if (sourceProp.flags & 536870912 && !(targetProp.flags & 536870912)) {
                                      if (reportErrors) {
                                          reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
                                      }
                                      return 0;
                                  }
                              }
                          }
                      }
                      return result;
                  }
                  function propertiesIdenticalTo(source, target) {
                      var sourceProperties = getPropertiesOfObjectType(source);
                      var targetProperties = getPropertiesOfObjectType(target);
                      if (sourceProperties.length !== targetProperties.length) {
                          return 0;
                      }
                      var result = -1;
                      for (var _i = 0; _i < sourceProperties.length; _i++) {
                          var sourceProp = sourceProperties[_i];
                          var targetProp = getPropertyOfObjectType(target, sourceProp.name);
                          if (!targetProp) {
                              return 0;
                          }
                          var related = compareProperties(sourceProp, targetProp, isRelatedTo);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function signaturesRelatedTo(source, target, kind, reportErrors) {
                      if (relation === identityRelation) {
                          return signaturesIdenticalTo(source, target, kind);
                      }
                      if (target === anyFunctionType || source === anyFunctionType) {
                          return -1;
                      }
                      var sourceSignatures = getSignaturesOfType(source, kind);
                      var targetSignatures = getSignaturesOfType(target, kind);
                      var result = -1;
                      var saveErrorInfo = errorInfo;
                      outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
                          var t = targetSignatures[_i];
                          if (!t.hasStringLiterals || target.flags & 65536) {
                              var localErrors = reportErrors;
                              for (var _a = 0; _a < sourceSignatures.length; _a++) {
                                  var s = sourceSignatures[_a];
                                  if (!s.hasStringLiterals || source.flags & 65536) {
                                      var related = signatureRelatedTo(s, t, localErrors);
                                      if (related) {
                                          result &= related;
                                          errorInfo = saveErrorInfo;
                                          continue outer;
                                      }
                                      localErrors = false;
                                  }
                              }
                              return 0;
                          }
                      }
                      return result;
                  }
                  function signatureRelatedTo(source, target, reportErrors) {
                      if (source === target) {
                          return -1;
                      }
                      if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) {
                          return 0;
                      }
                      var sourceMax = source.parameters.length;
                      var targetMax = target.parameters.length;
                      var checkCount;
                      if (source.hasRestParameter && target.hasRestParameter) {
                          checkCount = sourceMax > targetMax ? sourceMax : targetMax;
                          sourceMax--;
                          targetMax--;
                      }
                      else if (source.hasRestParameter) {
                          sourceMax--;
                          checkCount = targetMax;
                      }
                      else if (target.hasRestParameter) {
                          targetMax--;
                          checkCount = sourceMax;
                      }
                      else {
                          checkCount = sourceMax < targetMax ? sourceMax : targetMax;
                      }
                      source = getErasedSignature(source);
                      target = getErasedSignature(target);
                      var result = -1;
                      for (var i = 0; i < checkCount; i++) {
                          var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
                          var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
                          var saveErrorInfo = errorInfo;
                          var related = isRelatedTo(s_1, t_1, reportErrors);
                          if (!related) {
                              related = isRelatedTo(t_1, s_1, false);
                              if (!related) {
                                  if (reportErrors) {
                                      reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
                                  }
                                  return 0;
                              }
                              errorInfo = saveErrorInfo;
                          }
                          result &= related;
                      }
                      var t = getReturnTypeOfSignature(target);
                      if (t === voidType)
                          return result;
                      var s = getReturnTypeOfSignature(source);
                      return result & isRelatedTo(s, t, reportErrors);
                  }
                  function signaturesIdenticalTo(source, target, kind) {
                      var sourceSignatures = getSignaturesOfType(source, kind);
                      var targetSignatures = getSignaturesOfType(target, kind);
                      if (sourceSignatures.length !== targetSignatures.length) {
                          return 0;
                      }
                      var result = -1;
                      for (var i = 0, len = sourceSignatures.length; i < len; ++i) {
                          var related = compareSignatures(sourceSignatures[i], targetSignatures[i], true, isRelatedTo);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                      return result;
                  }
                  function stringIndexTypesRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          return indexTypesIdenticalTo(0, source, target);
                      }
                      var targetType = getIndexTypeOfType(target, 0);
                      if (targetType) {
                          var sourceType = getIndexTypeOfType(source, 0);
                          if (!sourceType) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
                              }
                              return 0;
                          }
                          var related = isRelatedTo(sourceType, targetType, reportErrors);
                          if (!related) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signatures_are_incompatible);
                              }
                              return 0;
                          }
                          return related;
                      }
                      return -1;
                  }
                  function numberIndexTypesRelatedTo(source, target, reportErrors) {
                      if (relation === identityRelation) {
                          return indexTypesIdenticalTo(1, source, target);
                      }
                      var targetType = getIndexTypeOfType(target, 1);
                      if (targetType) {
                          var sourceStringType = getIndexTypeOfType(source, 0);
                          var sourceNumberType = getIndexTypeOfType(source, 1);
                          if (!(sourceStringType || sourceNumberType)) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
                              }
                              return 0;
                          }
                          var related;
                          if (sourceStringType && sourceNumberType) {
                              related = isRelatedTo(sourceStringType, targetType, false) || isRelatedTo(sourceNumberType, targetType, reportErrors);
                          }
                          else {
                              related = isRelatedTo(sourceStringType || sourceNumberType, targetType, reportErrors);
                          }
                          if (!related) {
                              if (reportErrors) {
                                  reportError(ts.Diagnostics.Index_signatures_are_incompatible);
                              }
                              return 0;
                          }
                          return related;
                      }
                      return -1;
                  }
                  function indexTypesIdenticalTo(indexKind, source, target) {
                      var targetType = getIndexTypeOfType(target, indexKind);
                      var sourceType = getIndexTypeOfType(source, indexKind);
                      if (!sourceType && !targetType) {
                          return -1;
                      }
                      if (sourceType && targetType) {
                          return isRelatedTo(sourceType, targetType);
                      }
                      return 0;
                  }
              }
              function isPropertyIdenticalTo(sourceProp, targetProp) {
                  return compareProperties(sourceProp, targetProp, compareTypes) !== 0;
              }
              function compareProperties(sourceProp, targetProp, compareTypes) {
                  if (sourceProp === targetProp) {
                      return -1;
                  }
                  var sourcePropAccessibility = getDeclarationFlagsFromSymbol(sourceProp) & (32 | 64);
                  var targetPropAccessibility = getDeclarationFlagsFromSymbol(targetProp) & (32 | 64);
                  if (sourcePropAccessibility !== targetPropAccessibility) {
                      return 0;
                  }
                  if (sourcePropAccessibility) {
                      if (getTargetSymbol(sourceProp) !== getTargetSymbol(targetProp)) {
                          return 0;
                      }
                  }
                  else {
                      if ((sourceProp.flags & 536870912) !== (targetProp.flags & 536870912)) {
                          return 0;
                      }
                  }
                  return compareTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
              }
              function compareSignatures(source, target, compareReturnTypes, compareTypes) {
                  if (source === target) {
                      return -1;
                  }
                  if (source.parameters.length !== target.parameters.length ||
                      source.minArgumentCount !== target.minArgumentCount ||
                      source.hasRestParameter !== target.hasRestParameter) {
                      return 0;
                  }
                  var result = -1;
                  if (source.typeParameters && target.typeParameters) {
                      if (source.typeParameters.length !== target.typeParameters.length) {
                          return 0;
                      }
                      for (var i = 0, len = source.typeParameters.length; i < len; ++i) {
                          var related = compareTypes(source.typeParameters[i], target.typeParameters[i]);
                          if (!related) {
                              return 0;
                          }
                          result &= related;
                      }
                  }
                  else if (source.typeParameters || target.typeParameters) {
                      return 0;
                  }
                  source = getErasedSignature(source);
                  target = getErasedSignature(target);
                  for (var i = 0, len = source.parameters.length; i < len; i++) {
                      var s = source.hasRestParameter && i === len - 1 ? getRestTypeOfSignature(source) : getTypeOfSymbol(source.parameters[i]);
                      var t = target.hasRestParameter && i === len - 1 ? getRestTypeOfSignature(target) : getTypeOfSymbol(target.parameters[i]);
                      var related = compareTypes(s, t);
                      if (!related) {
                          return 0;
                      }
                      result &= related;
                  }
                  if (compareReturnTypes) {
                      result &= compareTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
                  }
                  return result;
              }
              function isSupertypeOfEach(candidate, types) {
                  for (var _i = 0; _i < types.length; _i++) {
                      var type = types[_i];
                      if (candidate !== type && !isTypeSubtypeOf(type, candidate))
                          return false;
                  }
                  return true;
              }
              function getCommonSupertype(types) {
                  return ts.forEach(types, function (t) { return isSupertypeOfEach(t, types) ? t : undefined; });
              }
              function reportNoCommonSupertypeError(types, errorLocation, errorMessageChainHead) {
                  var bestSupertype;
                  var bestSupertypeDownfallType;
                  var bestSupertypeScore = 0;
                  for (var i = 0; i < types.length; i++) {
                      var score = 0;
                      var downfallType = undefined;
                      for (var j = 0; j < types.length; j++) {
                          if (isTypeSubtypeOf(types[j], types[i])) {
                              score++;
                          }
                          else if (!downfallType) {
                              downfallType = types[j];
                          }
                      }
                      ts.Debug.assert(!!downfallType, "If there is no common supertype, each type should have a downfallType");
                      if (score > bestSupertypeScore) {
                          bestSupertype = types[i];
                          bestSupertypeDownfallType = downfallType;
                          bestSupertypeScore = score;
                      }
                      if (bestSupertypeScore === types.length - 1) {
                          break;
                      }
                  }
                  checkTypeSubtypeOf(bestSupertypeDownfallType, bestSupertype, errorLocation, ts.Diagnostics.Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0, errorMessageChainHead);
              }
              function isArrayType(type) {
                  return type.flags & 4096 && type.target === globalArrayType;
              }
              function isArrayLikeType(type) {
                  return !(type.flags & (32 | 64)) && isTypeAssignableTo(type, anyArrayType);
              }
              function isTupleLikeType(type) {
                  return !!getPropertyOfType(type, "0");
              }
              function isTupleType(type) {
                  return (type.flags & 8192) && !!type.elementTypes;
              }
              function getWidenedTypeOfObjectLiteral(type) {
                  var properties = getPropertiesOfObjectType(type);
                  var members = {};
                  ts.forEach(properties, function (p) {
                      var propType = getTypeOfSymbol(p);
                      var widenedType = getWidenedType(propType);
                      if (propType !== widenedType) {
                          var symbol = createSymbol(p.flags | 67108864, p.name);
                          symbol.declarations = p.declarations;
                          symbol.parent = p.parent;
                          symbol.type = widenedType;
                          symbol.target = p;
                          if (p.valueDeclaration)
                              symbol.valueDeclaration = p.valueDeclaration;
                          p = symbol;
                      }
                      members[p.name] = p;
                  });
                  var stringIndexType = getIndexTypeOfType(type, 0);
                  var numberIndexType = getIndexTypeOfType(type, 1);
                  if (stringIndexType)
                      stringIndexType = getWidenedType(stringIndexType);
                  if (numberIndexType)
                      numberIndexType = getWidenedType(numberIndexType);
                  return createAnonymousType(type.symbol, members, emptyArray, emptyArray, stringIndexType, numberIndexType);
              }
              function getWidenedType(type) {
                  if (type.flags & 786432) {
                      if (type.flags & (32 | 64)) {
                          return anyType;
                      }
                      if (type.flags & 131072) {
                          return getWidenedTypeOfObjectLiteral(type);
                      }
                      if (type.flags & 16384) {
                          return getUnionType(ts.map(type.types, getWidenedType));
                      }
                      if (isArrayType(type)) {
                          return createArrayType(getWidenedType(type.typeArguments[0]));
                      }
                  }
                  return type;
              }
              function reportWideningErrorsInType(type) {
                  if (type.flags & 16384) {
                      var errorReported = false;
                      ts.forEach(type.types, function (t) {
                          if (reportWideningErrorsInType(t)) {
                              errorReported = true;
                          }
                      });
                      return errorReported;
                  }
                  if (isArrayType(type)) {
                      return reportWideningErrorsInType(type.typeArguments[0]);
                  }
                  if (type.flags & 131072) {
                      var errorReported = false;
                      ts.forEach(getPropertiesOfObjectType(type), function (p) {
                          var t = getTypeOfSymbol(p);
                          if (t.flags & 262144) {
                              if (!reportWideningErrorsInType(t)) {
                                  error(p.valueDeclaration, ts.Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, p.name, typeToString(getWidenedType(t)));
                              }
                              errorReported = true;
                          }
                      });
                      return errorReported;
                  }
                  return false;
              }
              function reportImplicitAnyError(declaration, type) {
                  var typeAsString = typeToString(getWidenedType(type));
                  var diagnostic;
                  switch (declaration.kind) {
                      case 133:
                      case 132:
                          diagnostic = ts.Diagnostics.Member_0_implicitly_has_an_1_type;
                          break;
                      case 130:
                          diagnostic = declaration.dotDotDotToken ?
                              ts.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type :
                              ts.Diagnostics.Parameter_0_implicitly_has_an_1_type;
                          break;
                      case 201:
                      case 135:
                      case 134:
                      case 137:
                      case 138:
                      case 163:
                      case 164:
                          if (!declaration.name) {
                              error(declaration, ts.Diagnostics.Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, typeAsString);
                              return;
                          }
                          diagnostic = ts.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type;
                          break;
                      default:
                          diagnostic = ts.Diagnostics.Variable_0_implicitly_has_an_1_type;
                  }
                  error(declaration, diagnostic, ts.declarationNameToString(declaration.name), typeAsString);
              }
              function reportErrorsFromWidening(declaration, type) {
                  if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & 262144) {
                      if (!reportWideningErrorsInType(type)) {
                          reportImplicitAnyError(declaration, type);
                      }
                  }
              }
              function forEachMatchingParameterType(source, target, callback) {
                  var sourceMax = source.parameters.length;
                  var targetMax = target.parameters.length;
                  var count;
                  if (source.hasRestParameter && target.hasRestParameter) {
                      count = sourceMax > targetMax ? sourceMax : targetMax;
                      sourceMax--;
                      targetMax--;
                  }
                  else if (source.hasRestParameter) {
                      sourceMax--;
                      count = targetMax;
                  }
                  else if (target.hasRestParameter) {
                      targetMax--;
                      count = sourceMax;
                  }
                  else {
                      count = sourceMax < targetMax ? sourceMax : targetMax;
                  }
                  for (var i = 0; i < count; i++) {
                      var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
                      var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
                      callback(s, t);
                  }
              }
              function createInferenceContext(typeParameters, inferUnionTypes) {
                  var inferences = [];
                  for (var _i = 0; _i < typeParameters.length; _i++) {
                      var unused = typeParameters[_i];
                      inferences.push({ primary: undefined, secondary: undefined, isFixed: false });
                  }
                  return {
                      typeParameters: typeParameters,
                      inferUnionTypes: inferUnionTypes,
                      inferences: inferences,
                      inferredTypes: new Array(typeParameters.length)
                  };
              }
              function inferTypes(context, source, target) {
                  var sourceStack;
                  var targetStack;
                  var depth = 0;
                  var inferiority = 0;
                  inferFromTypes(source, target);
                  function isInProcess(source, target) {
                      for (var i = 0; i < depth; i++) {
                          if (source === sourceStack[i] && target === targetStack[i]) {
                              return true;
                          }
                      }
                      return false;
                  }
                  function isWithinDepthLimit(type, stack) {
                      if (depth >= 5) {
                          var target_2 = type.target;
                          var count = 0;
                          for (var i = 0; i < depth; i++) {
                              var t = stack[i];
                              if (t.flags & 4096 && t.target === target_2) {
                                  count++;
                              }
                          }
                          return count < 5;
                      }
                      return true;
                  }
                  function inferFromTypes(source, target) {
                      if (source === anyFunctionType) {
                          return;
                      }
                      if (target.flags & 512) {
                          var typeParameters = context.typeParameters;
                          for (var i = 0; i < typeParameters.length; i++) {
                              if (target === typeParameters[i]) {
                                  var inferences = context.inferences[i];
                                  if (!inferences.isFixed) {
                                      var candidates = inferiority ?
                                          inferences.secondary || (inferences.secondary = []) :
                                          inferences.primary || (inferences.primary = []);
                                      if (!ts.contains(candidates, source)) {
                                          candidates.push(source);
                                      }
                                  }
                                  return;
                              }
                          }
                      }
                      else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
                          var sourceTypes = source.typeArguments;
                          var targetTypes = target.typeArguments;
                          for (var i = 0; i < sourceTypes.length; i++) {
                              inferFromTypes(sourceTypes[i], targetTypes[i]);
                          }
                      }
                      else if (target.flags & 16384) {
                          var targetTypes = target.types;
                          var typeParameterCount = 0;
                          var typeParameter;
                          for (var _i = 0; _i < targetTypes.length; _i++) {
                              var t = targetTypes[_i];
                              if (t.flags & 512 && ts.contains(context.typeParameters, t)) {
                                  typeParameter = t;
                                  typeParameterCount++;
                              }
                              else {
                                  inferFromTypes(source, t);
                              }
                          }
                          if (typeParameterCount === 1) {
                              inferiority++;
                              inferFromTypes(source, typeParameter);
                              inferiority--;
                          }
                      }
                      else if (source.flags & 16384) {
                          var sourceTypes = source.types;
                          for (var _a = 0; _a < sourceTypes.length; _a++) {
                              var sourceType = sourceTypes[_a];
                              inferFromTypes(sourceType, target);
                          }
                      }
                      else if (source.flags & 48128 && (target.flags & (4096 | 8192) ||
                          (target.flags & 32768) && target.symbol && target.symbol.flags & (8192 | 2048))) {
                          if (!isInProcess(source, target) && isWithinDepthLimit(source, sourceStack) && isWithinDepthLimit(target, targetStack)) {
                              if (depth === 0) {
                                  sourceStack = [];
                                  targetStack = [];
                              }
                              sourceStack[depth] = source;
                              targetStack[depth] = target;
                              depth++;
                              inferFromProperties(source, target);
                              inferFromSignatures(source, target, 0);
                              inferFromSignatures(source, target, 1);
                              inferFromIndexTypes(source, target, 0, 0);
                              inferFromIndexTypes(source, target, 1, 1);
                              inferFromIndexTypes(source, target, 0, 1);
                              depth--;
                          }
                      }
                  }
                  function inferFromProperties(source, target) {
                      var properties = getPropertiesOfObjectType(target);
                      for (var _i = 0; _i < properties.length; _i++) {
                          var targetProp = properties[_i];
                          var sourceProp = getPropertyOfObjectType(source, targetProp.name);
                          if (sourceProp) {
                              inferFromTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
                          }
                      }
                  }
                  function inferFromSignatures(source, target, kind) {
                      var sourceSignatures = getSignaturesOfType(source, kind);
                      var targetSignatures = getSignaturesOfType(target, kind);
                      var sourceLen = sourceSignatures.length;
                      var targetLen = targetSignatures.length;
                      var len = sourceLen < targetLen ? sourceLen : targetLen;
                      for (var i = 0; i < len; i++) {
                          inferFromSignature(getErasedSignature(sourceSignatures[sourceLen - len + i]), getErasedSignature(targetSignatures[targetLen - len + i]));
                      }
                  }
                  function inferFromSignature(source, target) {
                      forEachMatchingParameterType(source, target, inferFromTypes);
                      inferFromTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
                  }
                  function inferFromIndexTypes(source, target, sourceKind, targetKind) {
                      var targetIndexType = getIndexTypeOfType(target, targetKind);
                      if (targetIndexType) {
                          var sourceIndexType = getIndexTypeOfType(source, sourceKind);
                          if (sourceIndexType) {
                              inferFromTypes(sourceIndexType, targetIndexType);
                          }
                      }
                  }
              }
              function getInferenceCandidates(context, index) {
                  var inferences = context.inferences[index];
                  return inferences.primary || inferences.secondary || emptyArray;
              }
              function getInferredType(context, index) {
                  var inferredType = context.inferredTypes[index];
                  var inferenceSucceeded;
                  if (!inferredType) {
                      var inferences = getInferenceCandidates(context, index);
                      if (inferences.length) {
                          var unionOrSuperType = context.inferUnionTypes ? getUnionType(inferences) : getCommonSupertype(inferences);
                          inferredType = unionOrSuperType ? getWidenedType(unionOrSuperType) : unknownType;
                          inferenceSucceeded = !!unionOrSuperType;
                      }
                      else {
                          inferredType = emptyObjectType;
                          inferenceSucceeded = true;
                      }
                      if (inferenceSucceeded) {
                          var constraint = getConstraintOfTypeParameter(context.typeParameters[index]);
                          inferredType = constraint && !isTypeAssignableTo(inferredType, constraint) ? constraint : inferredType;
                      }
                      else if (context.failedTypeParameterIndex === undefined || context.failedTypeParameterIndex > index) {
                          context.failedTypeParameterIndex = index;
                      }
                      context.inferredTypes[index] = inferredType;
                  }
                  return inferredType;
              }
              function getInferredTypes(context) {
                  for (var i = 0; i < context.inferredTypes.length; i++) {
                      getInferredType(context, i);
                  }
                  return context.inferredTypes;
              }
              function hasAncestor(node, kind) {
                  return ts.getAncestor(node, kind) !== undefined;
              }
              function getResolvedSymbol(node) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedSymbol) {
                      links.resolvedSymbol = (!ts.nodeIsMissing(node) && resolveName(node, node.text, 107455 | 1048576, ts.Diagnostics.Cannot_find_name_0, node)) || unknownSymbol;
                  }
                  return links.resolvedSymbol;
              }
              function isInTypeQuery(node) {
                  while (node) {
                      switch (node.kind) {
                          case 145:
                              return true;
                          case 65:
                          case 127:
                              node = node.parent;
                              continue;
                          default:
                              return false;
                      }
                  }
                  ts.Debug.fail("should not get here");
              }
              function removeTypesFromUnionType(type, typeKind, isOfTypeKind, allowEmptyUnionResult) {
                  if (type.flags & 16384) {
                      var types = type.types;
                      if (ts.forEach(types, function (t) { return !!(t.flags & typeKind) === isOfTypeKind; })) {
                          var narrowedType = getUnionType(ts.filter(types, function (t) { return !(t.flags & typeKind) === isOfTypeKind; }));
                          if (allowEmptyUnionResult || narrowedType !== emptyObjectType) {
                              return narrowedType;
                          }
                      }
                  }
                  else if (allowEmptyUnionResult && !!(type.flags & typeKind) === isOfTypeKind) {
                      return getUnionType(emptyArray);
                  }
                  return type;
              }
              function hasInitializer(node) {
                  return !!(node.initializer || ts.isBindingPattern(node.parent) && hasInitializer(node.parent.parent));
              }
              function isVariableAssignedWithin(symbol, node) {
                  var links = getNodeLinks(node);
                  if (links.assignmentChecks) {
                      var cachedResult = links.assignmentChecks[symbol.id];
                      if (cachedResult !== undefined) {
                          return cachedResult;
                      }
                  }
                  else {
                      links.assignmentChecks = {};
                  }
                  return links.assignmentChecks[symbol.id] = isAssignedIn(node);
                  function isAssignedInBinaryExpression(node) {
                      if (node.operatorToken.kind >= 53 && node.operatorToken.kind <= 64) {
                          var n = node.left;
                          while (n.kind === 162) {
                              n = n.expression;
                          }
                          if (n.kind === 65 && getResolvedSymbol(n) === symbol) {
                              return true;
                          }
                      }
                      return ts.forEachChild(node, isAssignedIn);
                  }
                  function isAssignedInVariableDeclaration(node) {
                      if (!ts.isBindingPattern(node.name) && getSymbolOfNode(node) === symbol && hasInitializer(node)) {
                          return true;
                      }
                      return ts.forEachChild(node, isAssignedIn);
                  }
                  function isAssignedIn(node) {
                      switch (node.kind) {
                          case 170:
                              return isAssignedInBinaryExpression(node);
                          case 199:
                          case 153:
                              return isAssignedInVariableDeclaration(node);
                          case 151:
                          case 152:
                          case 154:
                          case 155:
                          case 156:
                          case 157:
                          case 158:
                          case 159:
                          case 161:
                          case 162:
                          case 168:
                          case 165:
                          case 166:
                          case 167:
                          case 169:
                          case 171:
                          case 174:
                          case 180:
                          case 181:
                          case 183:
                          case 184:
                          case 185:
                          case 186:
                          case 187:
                          case 188:
                          case 189:
                          case 192:
                          case 193:
                          case 194:
                          case 221:
                          case 222:
                          case 195:
                          case 196:
                          case 197:
                          case 224:
                              return ts.forEachChild(node, isAssignedIn);
                      }
                      return false;
                  }
              }
              function resolveLocation(node) {
                  var containerNodes = [];
                  for (var parent_3 = node.parent; parent_3; parent_3 = parent_3.parent) {
                      if ((ts.isExpression(parent_3) || ts.isObjectLiteralMethod(node)) &&
                          isContextSensitive(parent_3)) {
                          containerNodes.unshift(parent_3);
                      }
                  }
                  ts.forEach(containerNodes, function (node) { getTypeOfNode(node); });
              }
              function getSymbolAtLocation(node) {
                  resolveLocation(node);
                  return getSymbolInfo(node);
              }
              function getTypeAtLocation(node) {
                  resolveLocation(node);
                  return getTypeOfNode(node);
              }
              function getTypeOfSymbolAtLocation(symbol, node) {
                  resolveLocation(node);
                  return getNarrowedTypeOfSymbol(symbol, node);
              }
              function getNarrowedTypeOfSymbol(symbol, node) {
                  var type = getTypeOfSymbol(symbol);
                  if (node && symbol.flags & 3 && type.flags & (1 | 48128 | 16384 | 512)) {
                      loop: while (node.parent) {
                          var child = node;
                          node = node.parent;
                          var narrowedType = type;
                          switch (node.kind) {
                              case 184:
                                  if (child !== node.expression) {
                                      narrowedType = narrowType(type, node.expression, child === node.thenStatement);
                                  }
                                  break;
                              case 171:
                                  if (child !== node.condition) {
                                      narrowedType = narrowType(type, node.condition, child === node.whenTrue);
                                  }
                                  break;
                              case 170:
                                  if (child === node.right) {
                                      if (node.operatorToken.kind === 48) {
                                          narrowedType = narrowType(type, node.left, true);
                                      }
                                      else if (node.operatorToken.kind === 49) {
                                          narrowedType = narrowType(type, node.left, false);
                                      }
                                  }
                                  break;
                              case 228:
                              case 206:
                              case 201:
                              case 135:
                              case 134:
                              case 137:
                              case 138:
                              case 136:
                                  break loop;
                          }
                          if (narrowedType !== type) {
                              if (isVariableAssignedWithin(symbol, node)) {
                                  break;
                              }
                              type = narrowedType;
                          }
                      }
                  }
                  return type;
                  function narrowTypeByEquality(type, expr, assumeTrue) {
                      if (expr.left.kind !== 166 || expr.right.kind !== 8) {
                          return type;
                      }
                      var left = expr.left;
                      var right = expr.right;
                      if (left.expression.kind !== 65 || getResolvedSymbol(left.expression) !== symbol) {
                          return type;
                      }
                      var typeInfo = primitiveTypeInfo[right.text];
                      if (expr.operatorToken.kind === 31) {
                          assumeTrue = !assumeTrue;
                      }
                      if (assumeTrue) {
                          if (!typeInfo) {
                              return removeTypesFromUnionType(type, 258 | 132 | 8 | 1048576, true, false);
                          }
                          if (isTypeSubtypeOf(typeInfo.type, type)) {
                              return typeInfo.type;
                          }
                          return removeTypesFromUnionType(type, typeInfo.flags, false, false);
                      }
                      else {
                          if (typeInfo) {
                              return removeTypesFromUnionType(type, typeInfo.flags, true, false);
                          }
                          return type;
                      }
                  }
                  function narrowTypeByAnd(type, expr, assumeTrue) {
                      if (assumeTrue) {
                          return narrowType(narrowType(type, expr.left, true), expr.right, true);
                      }
                      else {
                          return getUnionType([
                              narrowType(type, expr.left, false),
                              narrowType(narrowType(type, expr.left, true), expr.right, false)
                          ]);
                      }
                  }
                  function narrowTypeByOr(type, expr, assumeTrue) {
                      if (assumeTrue) {
                          return getUnionType([
                              narrowType(type, expr.left, true),
                              narrowType(narrowType(type, expr.left, false), expr.right, true)
                          ]);
                      }
                      else {
                          return narrowType(narrowType(type, expr.left, false), expr.right, false);
                      }
                  }
                  function narrowTypeByInstanceof(type, expr, assumeTrue) {
                      if (type.flags & 1 || !assumeTrue || expr.left.kind !== 65 || getResolvedSymbol(expr.left) !== symbol) {
                          return type;
                      }
                      var rightType = checkExpression(expr.right);
                      if (!isTypeSubtypeOf(rightType, globalFunctionType)) {
                          return type;
                      }
                      var targetType;
                      var prototypeProperty = getPropertyOfType(rightType, "prototype");
                      if (prototypeProperty) {
                          var prototypePropertyType = getTypeOfSymbol(prototypeProperty);
                          if (prototypePropertyType !== anyType) {
                              targetType = prototypePropertyType;
                          }
                      }
                      if (!targetType) {
                          var constructSignatures;
                          if (rightType.flags & 2048) {
                              constructSignatures = resolveDeclaredMembers(rightType).declaredConstructSignatures;
                          }
                          else if (rightType.flags & 32768) {
                              constructSignatures = getSignaturesOfType(rightType, 1);
                          }
                          if (constructSignatures && constructSignatures.length) {
                              targetType = getUnionType(ts.map(constructSignatures, function (signature) { return getReturnTypeOfSignature(getErasedSignature(signature)); }));
                          }
                      }
                      if (targetType) {
                          if (isTypeSubtypeOf(targetType, type)) {
                              return targetType;
                          }
                          if (type.flags & 16384) {
                              return getUnionType(ts.filter(type.types, function (t) { return isTypeSubtypeOf(t, targetType); }));
                          }
                      }
                      return type;
                  }
                  function narrowType(type, expr, assumeTrue) {
                      switch (expr.kind) {
                          case 162:
                              return narrowType(type, expr.expression, assumeTrue);
                          case 170:
                              var operator = expr.operatorToken.kind;
                              if (operator === 30 || operator === 31) {
                                  return narrowTypeByEquality(type, expr, assumeTrue);
                              }
                              else if (operator === 48) {
                                  return narrowTypeByAnd(type, expr, assumeTrue);
                              }
                              else if (operator === 49) {
                                  return narrowTypeByOr(type, expr, assumeTrue);
                              }
                              else if (operator === 87) {
                                  return narrowTypeByInstanceof(type, expr, assumeTrue);
                              }
                              break;
                          case 168:
                              if (expr.operator === 46) {
                                  return narrowType(type, expr.operand, !assumeTrue);
                              }
                              break;
                      }
                      return type;
                  }
              }
              function checkIdentifier(node) {
                  var symbol = getResolvedSymbol(node);
                  if (symbol === argumentsSymbol && ts.getContainingFunction(node).kind === 164 && languageVersion < 2) {
                      error(node, ts.Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
                  }
                  if (symbol.flags & 8388608 && !isInTypeQuery(node) && !isConstEnumOrConstEnumOnlyModule(resolveAlias(symbol))) {
                      markAliasSymbolAsReferenced(symbol);
                  }
                  checkCollisionWithCapturedSuperVariable(node, node);
                  checkCollisionWithCapturedThisVariable(node, node);
                  checkBlockScopedBindingCapturedInLoop(node, symbol);
                  return getNarrowedTypeOfSymbol(getExportSymbolOfValueSymbolIfExported(symbol), node);
              }
              function isInsideFunction(node, threshold) {
                  var current = node;
                  while (current && current !== threshold) {
                      if (ts.isFunctionLike(current)) {
                          return true;
                      }
                      current = current.parent;
                  }
                  return false;
              }
              function checkBlockScopedBindingCapturedInLoop(node, symbol) {
                  if (languageVersion >= 2 ||
                      (symbol.flags & 2) === 0 ||
                      symbol.valueDeclaration.parent.kind === 224) {
                      return;
                  }
                  var container = symbol.valueDeclaration;
                  while (container.kind !== 200) {
                      container = container.parent;
                  }
                  container = container.parent;
                  if (container.kind === 181) {
                      container = container.parent;
                  }
                  var inFunction = isInsideFunction(node.parent, container);
                  var current = container;
                  while (current && !ts.nodeStartsNewLexicalEnvironment(current)) {
                      if (isIterationStatement(current, false)) {
                          if (inFunction) {
                              grammarErrorOnFirstToken(current, ts.Diagnostics.Loop_contains_block_scoped_variable_0_referenced_by_a_function_in_the_loop_This_is_only_supported_in_ECMAScript_6_or_higher, ts.declarationNameToString(node));
                          }
                          getNodeLinks(symbol.valueDeclaration).flags |= 256;
                          break;
                      }
                      current = current.parent;
                  }
              }
              function captureLexicalThis(node, container) {
                  var classNode = container.parent && container.parent.kind === 202 ? container.parent : undefined;
                  getNodeLinks(node).flags |= 2;
                  if (container.kind === 133 || container.kind === 136) {
                      getNodeLinks(classNode).flags |= 4;
                  }
                  else {
                      getNodeLinks(container).flags |= 4;
                  }
              }
              function checkThisExpression(node) {
                  var container = ts.getThisContainer(node, true);
                  var needToCaptureLexicalThis = false;
                  if (container.kind === 164) {
                      container = ts.getThisContainer(container, false);
                      needToCaptureLexicalThis = (languageVersion < 2);
                  }
                  switch (container.kind) {
                      case 206:
                          error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_module_or_namespace_body);
                          break;
                      case 205:
                          error(node, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
                          break;
                      case 136:
                          if (isInConstructorArgumentInitializer(node, container)) {
                              error(node, ts.Diagnostics.this_cannot_be_referenced_in_constructor_arguments);
                          }
                          break;
                      case 133:
                      case 132:
                          if (container.flags & 128) {
                              error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_static_property_initializer);
                          }
                          break;
                      case 128:
                          error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_computed_property_name);
                          break;
                  }
                  if (needToCaptureLexicalThis) {
                      captureLexicalThis(node, container);
                  }
                  var classNode = container.parent && container.parent.kind === 202 ? container.parent : undefined;
                  if (classNode) {
                      var symbol = getSymbolOfNode(classNode);
                      return container.flags & 128 ? getTypeOfSymbol(symbol) : getDeclaredTypeOfSymbol(symbol);
                  }
                  return anyType;
              }
              function isInConstructorArgumentInitializer(node, constructorDecl) {
                  for (var n = node; n && n !== constructorDecl; n = n.parent) {
                      if (n.kind === 130) {
                          return true;
                      }
                  }
                  return false;
              }
              function checkSuperExpression(node) {
                  var isCallExpression = node.parent.kind === 158 && node.parent.expression === node;
                  var enclosingClass = ts.getAncestor(node, 202);
                  var baseClass;
                  if (enclosingClass && ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
                      var classType = getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingClass));
                      var baseTypes = getBaseTypes(classType);
                      baseClass = baseTypes.length && baseTypes[0];
                  }
                  if (!baseClass) {
                      error(node, ts.Diagnostics.super_can_only_be_referenced_in_a_derived_class);
                      return unknownType;
                  }
                  var container = ts.getSuperContainer(node, true);
                  if (container) {
                      var canUseSuperExpression = false;
                      var needToCaptureLexicalThis;
                      if (isCallExpression) {
                          canUseSuperExpression = container.kind === 136;
                      }
                      else {
                          needToCaptureLexicalThis = false;
                          while (container && container.kind === 164) {
                              container = ts.getSuperContainer(container, true);
                              needToCaptureLexicalThis = languageVersion < 2;
                          }
                          if (container && container.parent && container.parent.kind === 202) {
                              if (container.flags & 128) {
                                  canUseSuperExpression =
                                      container.kind === 135 ||
                                          container.kind === 134 ||
                                          container.kind === 137 ||
                                          container.kind === 138;
                              }
                              else {
                                  canUseSuperExpression =
                                      container.kind === 135 ||
                                          container.kind === 134 ||
                                          container.kind === 137 ||
                                          container.kind === 138 ||
                                          container.kind === 133 ||
                                          container.kind === 132 ||
                                          container.kind === 136;
                              }
                          }
                      }
                      if (canUseSuperExpression) {
                          var returnType;
                          if ((container.flags & 128) || isCallExpression) {
                              getNodeLinks(node).flags |= 32;
                              returnType = getTypeOfSymbol(baseClass.symbol);
                          }
                          else {
                              getNodeLinks(node).flags |= 16;
                              returnType = baseClass;
                          }
                          if (container.kind === 136 && isInConstructorArgumentInitializer(node, container)) {
                              error(node, ts.Diagnostics.super_cannot_be_referenced_in_constructor_arguments);
                              returnType = unknownType;
                          }
                          if (!isCallExpression && needToCaptureLexicalThis) {
                              captureLexicalThis(node.parent, container);
                          }
                          return returnType;
                      }
                  }
                  if (container && container.kind === 128) {
                      error(node, ts.Diagnostics.super_cannot_be_referenced_in_a_computed_property_name);
                  }
                  else if (isCallExpression) {
                      error(node, ts.Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors);
                  }
                  else {
                      error(node, ts.Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class);
                  }
                  return unknownType;
              }
              function getContextuallyTypedParameterType(parameter) {
                  if (isFunctionExpressionOrArrowFunction(parameter.parent)) {
                      var func = parameter.parent;
                      if (isContextSensitive(func)) {
                          var contextualSignature = getContextualSignature(func);
                          if (contextualSignature) {
                              var funcHasRestParameters = ts.hasRestParameters(func);
                              var len = func.parameters.length - (funcHasRestParameters ? 1 : 0);
                              var indexOfParameter = ts.indexOf(func.parameters, parameter);
                              if (indexOfParameter < len) {
                                  return getTypeAtPosition(contextualSignature, indexOfParameter);
                              }
                              if (indexOfParameter === (func.parameters.length - 1) &&
                                  funcHasRestParameters && contextualSignature.hasRestParameter && func.parameters.length >= contextualSignature.parameters.length) {
                                  return getTypeOfSymbol(ts.lastOrUndefined(contextualSignature.parameters));
                              }
                          }
                      }
                  }
                  return undefined;
              }
              function getContextualTypeForInitializerExpression(node) {
                  var declaration = node.parent;
                  if (node === declaration.initializer) {
                      if (declaration.type) {
                          return getTypeFromTypeNode(declaration.type);
                      }
                      if (declaration.kind === 130) {
                          var type = getContextuallyTypedParameterType(declaration);
                          if (type) {
                              return type;
                          }
                      }
                      if (ts.isBindingPattern(declaration.name)) {
                          return getTypeFromBindingPattern(declaration.name);
                      }
                  }
                  return undefined;
              }
              function getContextualTypeForReturnExpression(node) {
                  var func = ts.getContainingFunction(node);
                  if (func) {
                      if (func.type || func.kind === 136 || func.kind === 137 && getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(func.symbol, 138))) {
                          return getReturnTypeOfSignature(getSignatureFromDeclaration(func));
                      }
                      var signature = getContextualSignatureForFunctionLikeDeclaration(func);
                      if (signature) {
                          return getReturnTypeOfSignature(signature);
                      }
                  }
                  return undefined;
              }
              function getContextualTypeForArgument(callTarget, arg) {
                  var args = getEffectiveCallArguments(callTarget);
                  var argIndex = ts.indexOf(args, arg);
                  if (argIndex >= 0) {
                      var signature = getResolvedSignature(callTarget);
                      return getTypeAtPosition(signature, argIndex);
                  }
                  return undefined;
              }
              function getContextualTypeForSubstitutionExpression(template, substitutionExpression) {
                  if (template.parent.kind === 160) {
                      return getContextualTypeForArgument(template.parent, substitutionExpression);
                  }
                  return undefined;
              }
              function getContextualTypeForBinaryOperand(node) {
                  var binaryExpression = node.parent;
                  var operator = binaryExpression.operatorToken.kind;
                  if (operator >= 53 && operator <= 64) {
                      if (node === binaryExpression.right) {
                          return checkExpression(binaryExpression.left);
                      }
                  }
                  else if (operator === 49) {
                      var type = getContextualType(binaryExpression);
                      if (!type && node === binaryExpression.right) {
                          type = checkExpression(binaryExpression.left);
                      }
                      return type;
                  }
                  return undefined;
              }
              function applyToContextualType(type, mapper) {
                  if (!(type.flags & 16384)) {
                      return mapper(type);
                  }
                  var types = type.types;
                  var mappedType;
                  var mappedTypes;
                  for (var _i = 0; _i < types.length; _i++) {
                      var current = types[_i];
                      var t = mapper(current);
                      if (t) {
                          if (!mappedType) {
                              mappedType = t;
                          }
                          else if (!mappedTypes) {
                              mappedTypes = [mappedType, t];
                          }
                          else {
                              mappedTypes.push(t);
                          }
                      }
                  }
                  return mappedTypes ? getUnionType(mappedTypes) : mappedType;
              }
              function getTypeOfPropertyOfContextualType(type, name) {
                  return applyToContextualType(type, function (t) {
                      var prop = getPropertyOfObjectType(t, name);
                      return prop ? getTypeOfSymbol(prop) : undefined;
                  });
              }
              function getIndexTypeOfContextualType(type, kind) {
                  return applyToContextualType(type, function (t) { return getIndexTypeOfObjectOrUnionType(t, kind); });
              }
              function contextualTypeIsTupleLikeType(type) {
                  return !!(type.flags & 16384 ? ts.forEach(type.types, isTupleLikeType) : isTupleLikeType(type));
              }
              function contextualTypeHasIndexSignature(type, kind) {
                  return !!(type.flags & 16384 ? ts.forEach(type.types, function (t) { return getIndexTypeOfObjectOrUnionType(t, kind); }) : getIndexTypeOfObjectOrUnionType(type, kind));
              }
              function getContextualTypeForObjectLiteralMethod(node) {
                  ts.Debug.assert(ts.isObjectLiteralMethod(node));
                  if (isInsideWithStatementBody(node)) {
                      return undefined;
                  }
                  return getContextualTypeForObjectLiteralElement(node);
              }
              function getContextualTypeForObjectLiteralElement(element) {
                  var objectLiteral = element.parent;
                  var type = getContextualType(objectLiteral);
                  if (type) {
                      if (!ts.hasDynamicName(element)) {
                          var symbolName = getSymbolOfNode(element).name;
                          var propertyType = getTypeOfPropertyOfContextualType(type, symbolName);
                          if (propertyType) {
                              return propertyType;
                          }
                      }
                      return isNumericName(element.name) && getIndexTypeOfContextualType(type, 1) ||
                          getIndexTypeOfContextualType(type, 0);
                  }
                  return undefined;
              }
              function getContextualTypeForElementExpression(node) {
                  var arrayLiteral = node.parent;
                  var type = getContextualType(arrayLiteral);
                  if (type) {
                      var index = ts.indexOf(arrayLiteral.elements, node);
                      return getTypeOfPropertyOfContextualType(type, "" + index)
                          || getIndexTypeOfContextualType(type, 1)
                          || (languageVersion >= 2 ? checkIteratedType(type, undefined) : undefined);
                  }
                  return undefined;
              }
              function getContextualTypeForConditionalOperand(node) {
                  var conditional = node.parent;
                  return node === conditional.whenTrue || node === conditional.whenFalse ? getContextualType(conditional) : undefined;
              }
              function getContextualType(node) {
                  if (isInsideWithStatementBody(node)) {
                      return undefined;
                  }
                  if (node.contextualType) {
                      return node.contextualType;
                  }
                  var parent = node.parent;
                  switch (parent.kind) {
                      case 199:
                      case 130:
                      case 133:
                      case 132:
                      case 153:
                          return getContextualTypeForInitializerExpression(node);
                      case 164:
                      case 192:
                          return getContextualTypeForReturnExpression(node);
                      case 158:
                      case 159:
                          return getContextualTypeForArgument(parent, node);
                      case 161:
                          return getTypeFromTypeNode(parent.type);
                      case 170:
                          return getContextualTypeForBinaryOperand(node);
                      case 225:
                          return getContextualTypeForObjectLiteralElement(parent);
                      case 154:
                          return getContextualTypeForElementExpression(node);
                      case 171:
                          return getContextualTypeForConditionalOperand(node);
                      case 178:
                          ts.Debug.assert(parent.parent.kind === 172);
                          return getContextualTypeForSubstitutionExpression(parent.parent, node);
                      case 162:
                          return getContextualType(parent);
                  }
                  return undefined;
              }
              function getNonGenericSignature(type) {
                  var signatures = getSignaturesOfObjectOrUnionType(type, 0);
                  if (signatures.length === 1) {
                      var signature = signatures[0];
                      if (!signature.typeParameters) {
                          return signature;
                      }
                  }
              }
              function isFunctionExpressionOrArrowFunction(node) {
                  return node.kind === 163 || node.kind === 164;
              }
              function getContextualSignatureForFunctionLikeDeclaration(node) {
                  return isFunctionExpressionOrArrowFunction(node) ? getContextualSignature(node) : undefined;
              }
              function getContextualSignature(node) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  var type = ts.isObjectLiteralMethod(node)
                      ? getContextualTypeForObjectLiteralMethod(node)
                      : getContextualType(node);
                  if (!type) {
                      return undefined;
                  }
                  if (!(type.flags & 16384)) {
                      return getNonGenericSignature(type);
                  }
                  var signatureList;
                  var types = type.types;
                  for (var _i = 0; _i < types.length; _i++) {
                      var current = types[_i];
                      if (signatureList &&
                          getSignaturesOfObjectOrUnionType(current, 0).length > 1) {
                          return undefined;
                      }
                      var signature = getNonGenericSignature(current);
                      if (signature) {
                          if (!signatureList) {
                              signatureList = [signature];
                          }
                          else if (!compareSignatures(signatureList[0], signature, false, compareTypes)) {
                              return undefined;
                          }
                          else {
                              signatureList.push(signature);
                          }
                      }
                  }
                  var result;
                  if (signatureList) {
                      result = cloneSignature(signatureList[0]);
                      result.resolvedReturnType = undefined;
                      result.unionSignatures = signatureList;
                  }
                  return result;
              }
              function isInferentialContext(mapper) {
                  return mapper && mapper !== identityMapper;
              }
              function isAssignmentTarget(node) {
                  var parent = node.parent;
                  if (parent.kind === 170 && parent.operatorToken.kind === 53 && parent.left === node) {
                      return true;
                  }
                  if (parent.kind === 225) {
                      return isAssignmentTarget(parent.parent);
                  }
                  if (parent.kind === 154) {
                      return isAssignmentTarget(parent);
                  }
                  return false;
              }
              function checkSpreadElementExpression(node, contextualMapper) {
                  var arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper);
                  return checkIteratedTypeOrElementType(arrayOrIterableType, node.expression, false);
              }
              function checkArrayLiteral(node, contextualMapper) {
                  var elements = node.elements;
                  if (!elements.length) {
                      return createArrayType(undefinedType);
                  }
                  var hasSpreadElement = false;
                  var elementTypes = [];
                  var inDestructuringPattern = isAssignmentTarget(node);
                  for (var _i = 0; _i < elements.length; _i++) {
                      var e = elements[_i];
                      if (inDestructuringPattern && e.kind === 174) {
                          var restArrayType = checkExpression(e.expression, contextualMapper);
                          var restElementType = getIndexTypeOfType(restArrayType, 1) ||
                              (languageVersion >= 2 ? checkIteratedType(restArrayType, undefined) : undefined);
                          if (restElementType) {
                              elementTypes.push(restElementType);
                          }
                      }
                      else {
                          var type = checkExpression(e, contextualMapper);
                          elementTypes.push(type);
                      }
                      hasSpreadElement = hasSpreadElement || e.kind === 174;
                  }
                  if (!hasSpreadElement) {
                      var contextualType = getContextualType(node);
                      if (contextualType && contextualTypeIsTupleLikeType(contextualType) || inDestructuringPattern) {
                          return createTupleType(elementTypes);
                      }
                  }
                  return createArrayType(getUnionType(elementTypes));
              }
              function isNumericName(name) {
                  return name.kind === 128 ? isNumericComputedName(name) : isNumericLiteralName(name.text);
              }
              function isNumericComputedName(name) {
                  return allConstituentTypesHaveKind(checkComputedPropertyName(name), 1 | 132);
              }
              function isNumericLiteralName(name) {
                  return (+name).toString() === name;
              }
              function checkComputedPropertyName(node) {
                  var links = getNodeLinks(node.expression);
                  if (!links.resolvedType) {
                      links.resolvedType = checkExpression(node.expression);
                      if (!allConstituentTypesHaveKind(links.resolvedType, 1 | 132 | 258 | 1048576)) {
                          error(node, ts.Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any);
                      }
                      else {
                          checkThatExpressionIsProperSymbolReference(node.expression, links.resolvedType, true);
                      }
                  }
                  return links.resolvedType;
              }
              function checkObjectLiteral(node, contextualMapper) {
                  checkGrammarObjectLiteralExpression(node);
                  var propertiesTable = {};
                  var propertiesArray = [];
                  var contextualType = getContextualType(node);
                  var typeFlags;
                  for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
                      var memberDecl = _a[_i];
                      var member = memberDecl.symbol;
                      if (memberDecl.kind === 225 ||
                          memberDecl.kind === 226 ||
                          ts.isObjectLiteralMethod(memberDecl)) {
                          var type = void 0;
                          if (memberDecl.kind === 225) {
                              type = checkPropertyAssignment(memberDecl, contextualMapper);
                          }
                          else if (memberDecl.kind === 135) {
                              type = checkObjectLiteralMethod(memberDecl, contextualMapper);
                          }
                          else {
                              ts.Debug.assert(memberDecl.kind === 226);
                              type = checkExpression(memberDecl.name, contextualMapper);
                          }
                          typeFlags |= type.flags;
                          var prop = createSymbol(4 | 67108864 | member.flags, member.name);
                          prop.declarations = member.declarations;
                          prop.parent = member.parent;
                          if (member.valueDeclaration) {
                              prop.valueDeclaration = member.valueDeclaration;
                          }
                          prop.type = type;
                          prop.target = member;
                          member = prop;
                      }
                      else {
                          ts.Debug.assert(memberDecl.kind === 137 || memberDecl.kind === 138);
                          checkAccessorDeclaration(memberDecl);
                      }
                      if (!ts.hasDynamicName(memberDecl)) {
                          propertiesTable[member.name] = member;
                      }
                      propertiesArray.push(member);
                  }
                  var stringIndexType = getIndexType(0);
                  var numberIndexType = getIndexType(1);
                  var result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexType, numberIndexType);
                  result.flags |= 131072 | 524288 | (typeFlags & 262144);
                  return result;
                  function getIndexType(kind) {
                      if (contextualType && contextualTypeHasIndexSignature(contextualType, kind)) {
                          var propTypes = [];
                          for (var i = 0; i < propertiesArray.length; i++) {
                              var propertyDecl = node.properties[i];
                              if (kind === 0 || isNumericName(propertyDecl.name)) {
                                  var type = getTypeOfSymbol(propertiesArray[i]);
                                  if (!ts.contains(propTypes, type)) {
                                      propTypes.push(type);
                                  }
                              }
                          }
                          var result_1 = propTypes.length ? getUnionType(propTypes) : undefinedType;
                          typeFlags |= result_1.flags;
                          return result_1;
                      }
                      return undefined;
                  }
              }
              function getDeclarationKindFromSymbol(s) {
                  return s.valueDeclaration ? s.valueDeclaration.kind : 133;
              }
              function getDeclarationFlagsFromSymbol(s) {
                  return s.valueDeclaration ? ts.getCombinedNodeFlags(s.valueDeclaration) : s.flags & 134217728 ? 16 | 128 : 0;
              }
              function checkClassPropertyAccess(node, left, type, prop) {
                  var flags = getDeclarationFlagsFromSymbol(prop);
                  if (!(flags & (32 | 64))) {
                      return;
                  }
                  var enclosingClassDeclaration = ts.getAncestor(node, 202);
                  var enclosingClass = enclosingClassDeclaration ? getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingClassDeclaration)) : undefined;
                  var declaringClass = getDeclaredTypeOfSymbol(prop.parent);
                  if (flags & 32) {
                      if (declaringClass !== enclosingClass) {
                          error(node, ts.Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(declaringClass));
                      }
                      return;
                  }
                  if (left.kind === 91) {
                      return;
                  }
                  if (!enclosingClass || !hasBaseType(enclosingClass, declaringClass)) {
                      error(node, ts.Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(declaringClass));
                      return;
                  }
                  if (flags & 128) {
                      return;
                  }
                  if (!(getTargetType(type).flags & (1024 | 2048) && hasBaseType(type, enclosingClass))) {
                      error(node, ts.Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass));
                  }
              }
              function checkPropertyAccessExpression(node) {
                  return checkPropertyAccessExpressionOrQualifiedName(node, node.expression, node.name);
              }
              function checkQualifiedName(node) {
                  return checkPropertyAccessExpressionOrQualifiedName(node, node.left, node.right);
              }
              function checkPropertyAccessExpressionOrQualifiedName(node, left, right) {
                  var type = checkExpressionOrQualifiedName(left);
                  if (type === unknownType)
                      return type;
                  if (type !== anyType) {
                      var apparentType = getApparentType(getWidenedType(type));
                      if (apparentType === unknownType) {
                          return unknownType;
                      }
                      var prop = getPropertyOfType(apparentType, right.text);
                      if (!prop) {
                          if (right.text) {
                              error(right, ts.Diagnostics.Property_0_does_not_exist_on_type_1, ts.declarationNameToString(right), typeToString(type));
                          }
                          return unknownType;
                      }
                      getNodeLinks(node).resolvedSymbol = prop;
                      if (prop.parent && prop.parent.flags & 32) {
                          if (left.kind === 91 && getDeclarationKindFromSymbol(prop) !== 135) {
                              error(right, ts.Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword);
                          }
                          else {
                              checkClassPropertyAccess(node, left, type, prop);
                          }
                      }
                      return getTypeOfSymbol(prop);
                  }
                  return anyType;
              }
              function isValidPropertyAccess(node, propertyName) {
                  var left = node.kind === 156
                      ? node.expression
                      : node.left;
                  var type = checkExpressionOrQualifiedName(left);
                  if (type !== unknownType && type !== anyType) {
                      var prop = getPropertyOfType(getWidenedType(type), propertyName);
                      if (prop && prop.parent && prop.parent.flags & 32) {
                          if (left.kind === 91 && getDeclarationKindFromSymbol(prop) !== 135) {
                              return false;
                          }
                          else {
                              var modificationCount = diagnostics.getModificationCount();
                              checkClassPropertyAccess(node, left, type, prop);
                              return diagnostics.getModificationCount() === modificationCount;
                          }
                      }
                  }
                  return true;
              }
              function checkIndexedAccess(node) {
                  if (!node.argumentExpression) {
                      var sourceFile = getSourceFile(node);
                      if (node.parent.kind === 159 && node.parent.expression === node) {
                          var start = ts.skipTrivia(sourceFile.text, node.expression.end);
                          var end = node.end;
                          grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead);
                      }
                      else {
                          var start = node.end - "]".length;
                          var end = node.end;
                          grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Expression_expected);
                      }
                  }
                  var objectType = getApparentType(checkExpression(node.expression));
                  var indexType = node.argumentExpression ? checkExpression(node.argumentExpression) : unknownType;
                  if (objectType === unknownType) {
                      return unknownType;
                  }
                  var isConstEnum = isConstEnumObjectType(objectType);
                  if (isConstEnum &&
                      (!node.argumentExpression || node.argumentExpression.kind !== 8)) {
                      error(node.argumentExpression, ts.Diagnostics.A_const_enum_member_can_only_be_accessed_using_a_string_literal);
                      return unknownType;
                  }
                  if (node.argumentExpression) {
                      var name_6 = getPropertyNameForIndexedAccess(node.argumentExpression, indexType);
                      if (name_6 !== undefined) {
                          var prop = getPropertyOfType(objectType, name_6);
                          if (prop) {
                              getNodeLinks(node).resolvedSymbol = prop;
                              return getTypeOfSymbol(prop);
                          }
                          else if (isConstEnum) {
                              error(node.argumentExpression, ts.Diagnostics.Property_0_does_not_exist_on_const_enum_1, name_6, symbolToString(objectType.symbol));
                              return unknownType;
                          }
                      }
                  }
                  if (allConstituentTypesHaveKind(indexType, 1 | 258 | 132 | 1048576)) {
                      if (allConstituentTypesHaveKind(indexType, 1 | 132)) {
                          var numberIndexType = getIndexTypeOfType(objectType, 1);
                          if (numberIndexType) {
                              return numberIndexType;
                          }
                      }
                      var stringIndexType = getIndexTypeOfType(objectType, 0);
                      if (stringIndexType) {
                          return stringIndexType;
                      }
                      if (compilerOptions.noImplicitAny && !compilerOptions.suppressImplicitAnyIndexErrors && objectType !== anyType) {
                          error(node, ts.Diagnostics.Index_signature_of_object_type_implicitly_has_an_any_type);
                      }
                      return anyType;
                  }
                  error(node, ts.Diagnostics.An_index_expression_argument_must_be_of_type_string_number_symbol_or_any);
                  return unknownType;
              }
              function getPropertyNameForIndexedAccess(indexArgumentExpression, indexArgumentType) {
                  if (indexArgumentExpression.kind === 8 || indexArgumentExpression.kind === 7) {
                      return indexArgumentExpression.text;
                  }
                  if (checkThatExpressionIsProperSymbolReference(indexArgumentExpression, indexArgumentType, false)) {
                      var rightHandSideName = indexArgumentExpression.name.text;
                      return ts.getPropertyNameForKnownSymbolName(rightHandSideName);
                  }
                  return undefined;
              }
              function checkThatExpressionIsProperSymbolReference(expression, expressionType, reportError) {
                  if (expressionType === unknownType) {
                      return false;
                  }
                  if (!ts.isWellKnownSymbolSyntactically(expression)) {
                      return false;
                  }
                  if ((expressionType.flags & 1048576) === 0) {
                      if (reportError) {
                          error(expression, ts.Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, ts.getTextOfNode(expression));
                      }
                      return false;
                  }
                  var leftHandSide = expression.expression;
                  var leftHandSideSymbol = getResolvedSymbol(leftHandSide);
                  if (!leftHandSideSymbol) {
                      return false;
                  }
                  var globalESSymbol = getGlobalESSymbolConstructorSymbol();
                  if (!globalESSymbol) {
                      return false;
                  }
                  if (leftHandSideSymbol !== globalESSymbol) {
                      if (reportError) {
                          error(leftHandSide, ts.Diagnostics.Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object);
                      }
                      return false;
                  }
                  return true;
              }
              function resolveUntypedCall(node) {
                  if (node.kind === 160) {
                      checkExpression(node.template);
                  }
                  else {
                      ts.forEach(node.arguments, function (argument) {
                          checkExpression(argument);
                      });
                  }
                  return anySignature;
              }
              function resolveErrorCall(node) {
                  resolveUntypedCall(node);
                  return unknownSignature;
              }
              function reorderCandidates(signatures, result) {
                  var lastParent;
                  var lastSymbol;
                  var cutoffIndex = 0;
                  var index;
                  var specializedIndex = -1;
                  var spliceIndex;
                  ts.Debug.assert(!result.length);
                  for (var _i = 0; _i < signatures.length; _i++) {
                      var signature = signatures[_i];
                      var symbol = signature.declaration && getSymbolOfNode(signature.declaration);
                      var parent_4 = signature.declaration && signature.declaration.parent;
                      if (!lastSymbol || symbol === lastSymbol) {
                          if (lastParent && parent_4 === lastParent) {
                              index++;
                          }
                          else {
                              lastParent = parent_4;
                              index = cutoffIndex;
                          }
                      }
                      else {
                          index = cutoffIndex = result.length;
                          lastParent = parent_4;
                      }
                      lastSymbol = symbol;
                      if (signature.hasStringLiterals) {
                          specializedIndex++;
                          spliceIndex = specializedIndex;
                          cutoffIndex++;
                      }
                      else {
                          spliceIndex = index;
                      }
                      result.splice(spliceIndex, 0, signature);
                  }
              }
              function getSpreadArgumentIndex(args) {
                  for (var i = 0; i < args.length; i++) {
                      if (args[i].kind === 174) {
                          return i;
                      }
                  }
                  return -1;
              }
              function hasCorrectArity(node, args, signature) {
                  var adjustedArgCount;
                  var typeArguments;
                  var callIsIncomplete;
                  if (node.kind === 160) {
                      var tagExpression = node;
                      adjustedArgCount = args.length;
                      typeArguments = undefined;
                      if (tagExpression.template.kind === 172) {
                          var templateExpression = tagExpression.template;
                          var lastSpan = ts.lastOrUndefined(templateExpression.templateSpans);
                          ts.Debug.assert(lastSpan !== undefined);
                          callIsIncomplete = ts.nodeIsMissing(lastSpan.literal) || !!lastSpan.literal.isUnterminated;
                      }
                      else {
                          var templateLiteral = tagExpression.template;
                          ts.Debug.assert(templateLiteral.kind === 10);
                          callIsIncomplete = !!templateLiteral.isUnterminated;
                      }
                  }
                  else {
                      var callExpression = node;
                      if (!callExpression.arguments) {
                          ts.Debug.assert(callExpression.kind === 159);
                          return signature.minArgumentCount === 0;
                      }
                      adjustedArgCount = callExpression.arguments.hasTrailingComma ? args.length + 1 : args.length;
                      callIsIncomplete = callExpression.arguments.end === callExpression.end;
                      typeArguments = callExpression.typeArguments;
                  }
                  var hasRightNumberOfTypeArgs = !typeArguments ||
                      (signature.typeParameters && typeArguments.length === signature.typeParameters.length);
                  if (!hasRightNumberOfTypeArgs) {
                      return false;
                  }
                  var spreadArgIndex = getSpreadArgumentIndex(args);
                  if (spreadArgIndex >= 0) {
                      return signature.hasRestParameter && spreadArgIndex >= signature.parameters.length - 1;
                  }
                  if (!signature.hasRestParameter && adjustedArgCount > signature.parameters.length) {
                      return false;
                  }
                  var hasEnoughArguments = adjustedArgCount >= signature.minArgumentCount;
                  return callIsIncomplete || hasEnoughArguments;
              }
              function getSingleCallSignature(type) {
                  if (type.flags & 48128) {
                      var resolved = resolveObjectOrUnionTypeMembers(type);
                      if (resolved.callSignatures.length === 1 && resolved.constructSignatures.length === 0 &&
                          resolved.properties.length === 0 && !resolved.stringIndexType && !resolved.numberIndexType) {
                          return resolved.callSignatures[0];
                      }
                  }
                  return undefined;
              }
              function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) {
                  var context = createInferenceContext(signature.typeParameters, true);
                  forEachMatchingParameterType(contextualSignature, signature, function (source, target) {
                      inferTypes(context, instantiateType(source, contextualMapper), target);
                  });
                  return getSignatureInstantiation(signature, getInferredTypes(context));
              }
              function inferTypeArguments(signature, args, excludeArgument, context) {
                  var typeParameters = signature.typeParameters;
                  var inferenceMapper = createInferenceMapper(context);
                  for (var i = 0; i < typeParameters.length; i++) {
                      if (!context.inferences[i].isFixed) {
                          context.inferredTypes[i] = undefined;
                      }
                  }
                  if (context.failedTypeParameterIndex !== undefined && !context.inferences[context.failedTypeParameterIndex].isFixed) {
                      context.failedTypeParameterIndex = undefined;
                  }
                  for (var i = 0; i < args.length; i++) {
                      var arg = args[i];
                      if (arg.kind !== 176) {
                          var paramType = getTypeAtPosition(signature, i);
                          var argType = void 0;
                          if (i === 0 && args[i].parent.kind === 160) {
                              argType = globalTemplateStringsArrayType;
                          }
                          else {
                              var mapper = excludeArgument && excludeArgument[i] !== undefined ? identityMapper : inferenceMapper;
                              argType = checkExpressionWithContextualType(arg, paramType, mapper);
                          }
                          inferTypes(context, argType, paramType);
                      }
                  }
                  if (excludeArgument) {
                      for (var i = 0; i < args.length; i++) {
                          if (excludeArgument[i] === false) {
                              var arg = args[i];
                              var paramType = getTypeAtPosition(signature, i);
                              inferTypes(context, checkExpressionWithContextualType(arg, paramType, inferenceMapper), paramType);
                          }
                      }
                  }
                  getInferredTypes(context);
              }
              function checkTypeArguments(signature, typeArguments, typeArgumentResultTypes, reportErrors) {
                  var typeParameters = signature.typeParameters;
                  var typeArgumentsAreAssignable = true;
                  for (var i = 0; i < typeParameters.length; i++) {
                      var typeArgNode = typeArguments[i];
                      var typeArgument = getTypeFromTypeNode(typeArgNode);
                      typeArgumentResultTypes[i] = typeArgument;
                      if (typeArgumentsAreAssignable) {
                          var constraint = getConstraintOfTypeParameter(typeParameters[i]);
                          if (constraint) {
                              typeArgumentsAreAssignable = checkTypeAssignableTo(typeArgument, constraint, reportErrors ? typeArgNode : undefined, ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
                          }
                      }
                  }
                  return typeArgumentsAreAssignable;
              }
              function checkApplicableSignature(node, args, signature, relation, excludeArgument, reportErrors) {
                  for (var i = 0; i < args.length; i++) {
                      var arg = args[i];
                      if (arg.kind !== 176) {
                          var paramType = getTypeAtPosition(signature, i);
                          var argType = i === 0 && node.kind === 160
                              ? globalTemplateStringsArrayType
                              : arg.kind === 8 && !reportErrors
                                  ? getStringLiteralType(arg)
                                  : checkExpressionWithContextualType(arg, paramType, excludeArgument && excludeArgument[i] ? identityMapper : undefined);
                          if (!checkTypeRelatedTo(argType, paramType, relation, reportErrors ? arg : undefined, ts.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1)) {
                              return false;
                          }
                      }
                  }
                  return true;
              }
              function getEffectiveCallArguments(node) {
                  var args;
                  if (node.kind === 160) {
                      var template = node.template;
                      args = [template];
                      if (template.kind === 172) {
                          ts.forEach(template.templateSpans, function (span) {
                              args.push(span.expression);
                          });
                      }
                  }
                  else {
                      args = node.arguments || emptyArray;
                  }
                  return args;
              }
              function getEffectiveTypeArguments(callExpression) {
                  if (callExpression.expression.kind === 91) {
                      var containingClass = ts.getAncestor(callExpression, 202);
                      var baseClassTypeNode = containingClass && ts.getClassExtendsHeritageClauseElement(containingClass);
                      return baseClassTypeNode && baseClassTypeNode.typeArguments;
                  }
                  else {
                      return callExpression.typeArguments;
                  }
              }
              function resolveCall(node, signatures, candidatesOutArray) {
                  var isTaggedTemplate = node.kind === 160;
                  var typeArguments;
                  if (!isTaggedTemplate) {
                      typeArguments = getEffectiveTypeArguments(node);
                      if (node.expression.kind !== 91) {
                          ts.forEach(typeArguments, checkSourceElement);
                      }
                  }
                  var candidates = candidatesOutArray || [];
                  reorderCandidates(signatures, candidates);
                  if (!candidates.length) {
                      error(node, ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
                      return resolveErrorCall(node);
                  }
                  var args = getEffectiveCallArguments(node);
                  var excludeArgument;
                  for (var i = isTaggedTemplate ? 1 : 0; i < args.length; i++) {
                      if (isContextSensitive(args[i])) {
                          if (!excludeArgument) {
                              excludeArgument = new Array(args.length);
                          }
                          excludeArgument[i] = true;
                      }
                  }
                  var candidateForArgumentError;
                  var candidateForTypeArgumentError;
                  var resultOfFailedInference;
                  var result;
                  if (candidates.length > 1) {
                      result = chooseOverload(candidates, subtypeRelation);
                  }
                  if (!result) {
                      candidateForArgumentError = undefined;
                      candidateForTypeArgumentError = undefined;
                      resultOfFailedInference = undefined;
                      result = chooseOverload(candidates, assignableRelation);
                  }
                  if (result) {
                      return result;
                  }
                  if (candidateForArgumentError) {
                      checkApplicableSignature(node, args, candidateForArgumentError, assignableRelation, undefined, true);
                  }
                  else if (candidateForTypeArgumentError) {
                      if (!isTaggedTemplate && node.typeArguments) {
                          checkTypeArguments(candidateForTypeArgumentError, node.typeArguments, [], true);
                      }
                      else {
                          ts.Debug.assert(resultOfFailedInference.failedTypeParameterIndex >= 0);
                          var failedTypeParameter = candidateForTypeArgumentError.typeParameters[resultOfFailedInference.failedTypeParameterIndex];
                          var inferenceCandidates = getInferenceCandidates(resultOfFailedInference, resultOfFailedInference.failedTypeParameterIndex);
                          var diagnosticChainHead = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly, typeToString(failedTypeParameter));
                          reportNoCommonSupertypeError(inferenceCandidates, node.expression || node.tag, diagnosticChainHead);
                      }
                  }
                  else {
                      error(node, ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
                  }
                  if (!produceDiagnostics) {
                      for (var _i = 0; _i < candidates.length; _i++) {
                          var candidate = candidates[_i];
                          if (hasCorrectArity(node, args, candidate)) {
                              return candidate;
                          }
                      }
                  }
                  return resolveErrorCall(node);
                  function chooseOverload(candidates, relation) {
                      for (var _i = 0; _i < candidates.length; _i++) {
                          var originalCandidate = candidates[_i];
                          if (!hasCorrectArity(node, args, originalCandidate)) {
                              continue;
                          }
                          var candidate = void 0;
                          var typeArgumentsAreValid = void 0;
                          var inferenceContext = originalCandidate.typeParameters
                              ? createInferenceContext(originalCandidate.typeParameters, false)
                              : undefined;
                          while (true) {
                              candidate = originalCandidate;
                              if (candidate.typeParameters) {
                                  var typeArgumentTypes = void 0;
                                  if (typeArguments) {
                                      typeArgumentTypes = new Array(candidate.typeParameters.length);
                                      typeArgumentsAreValid = checkTypeArguments(candidate, typeArguments, typeArgumentTypes, false);
                                  }
                                  else {
                                      inferTypeArguments(candidate, args, excludeArgument, inferenceContext);
                                      typeArgumentsAreValid = inferenceContext.failedTypeParameterIndex === undefined;
                                      typeArgumentTypes = inferenceContext.inferredTypes;
                                  }
                                  if (!typeArgumentsAreValid) {
                                      break;
                                  }
                                  candidate = getSignatureInstantiation(candidate, typeArgumentTypes);
                              }
                              if (!checkApplicableSignature(node, args, candidate, relation, excludeArgument, false)) {
                                  break;
                              }
                              var index = excludeArgument ? ts.indexOf(excludeArgument, true) : -1;
                              if (index < 0) {
                                  return candidate;
                              }
                              excludeArgument[index] = false;
                          }
                          if (originalCandidate.typeParameters) {
                              var instantiatedCandidate = candidate;
                              if (typeArgumentsAreValid) {
                                  candidateForArgumentError = instantiatedCandidate;
                              }
                              else {
                                  candidateForTypeArgumentError = originalCandidate;
                                  if (!typeArguments) {
                                      resultOfFailedInference = inferenceContext;
                                  }
                              }
                          }
                          else {
                              ts.Debug.assert(originalCandidate === candidate);
                              candidateForArgumentError = originalCandidate;
                          }
                      }
                      return undefined;
                  }
              }
              function resolveCallExpression(node, candidatesOutArray) {
                  if (node.expression.kind === 91) {
                      var superType = checkSuperExpression(node.expression);
                      if (superType !== unknownType) {
                          return resolveCall(node, getSignaturesOfType(superType, 1), candidatesOutArray);
                      }
                      return resolveUntypedCall(node);
                  }
                  var funcType = checkExpression(node.expression);
                  var apparentType = getApparentType(funcType);
                  if (apparentType === unknownType) {
                      return resolveErrorCall(node);
                  }
                  var callSignatures = getSignaturesOfType(apparentType, 0);
                  var constructSignatures = getSignaturesOfType(apparentType, 1);
                  if (funcType === anyType || (!callSignatures.length && !constructSignatures.length && !(funcType.flags & 16384) && isTypeAssignableTo(funcType, globalFunctionType))) {
                      if (node.typeArguments) {
                          error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
                      }
                      return resolveUntypedCall(node);
                  }
                  if (!callSignatures.length) {
                      if (constructSignatures.length) {
                          error(node, ts.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
                      }
                      else {
                          error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
                      }
                      return resolveErrorCall(node);
                  }
                  return resolveCall(node, callSignatures, candidatesOutArray);
              }
              function resolveNewExpression(node, candidatesOutArray) {
                  if (node.arguments && languageVersion < 2) {
                      var spreadIndex = getSpreadArgumentIndex(node.arguments);
                      if (spreadIndex >= 0) {
                          error(node.arguments[spreadIndex], ts.Diagnostics.Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_6_and_higher);
                      }
                  }
                  var expressionType = checkExpression(node.expression);
                  if (expressionType === anyType) {
                      if (node.typeArguments) {
                          error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
                      }
                      return resolveUntypedCall(node);
                  }
                  expressionType = getApparentType(expressionType);
                  if (expressionType === unknownType) {
                      return resolveErrorCall(node);
                  }
                  var constructSignatures = getSignaturesOfType(expressionType, 1);
                  if (constructSignatures.length) {
                      return resolveCall(node, constructSignatures, candidatesOutArray);
                  }
                  var callSignatures = getSignaturesOfType(expressionType, 0);
                  if (callSignatures.length) {
                      var signature = resolveCall(node, callSignatures, candidatesOutArray);
                      if (getReturnTypeOfSignature(signature) !== voidType) {
                          error(node, ts.Diagnostics.Only_a_void_function_can_be_called_with_the_new_keyword);
                      }
                      return signature;
                  }
                  error(node, ts.Diagnostics.Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature);
                  return resolveErrorCall(node);
              }
              function resolveTaggedTemplateExpression(node, candidatesOutArray) {
                  var tagType = checkExpression(node.tag);
                  var apparentType = getApparentType(tagType);
                  if (apparentType === unknownType) {
                      return resolveErrorCall(node);
                  }
                  var callSignatures = getSignaturesOfType(apparentType, 0);
                  if (tagType === anyType || (!callSignatures.length && !(tagType.flags & 16384) && isTypeAssignableTo(tagType, globalFunctionType))) {
                      return resolveUntypedCall(node);
                  }
                  if (!callSignatures.length) {
                      error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
                      return resolveErrorCall(node);
                  }
                  return resolveCall(node, callSignatures, candidatesOutArray);
              }
              function getResolvedSignature(node, candidatesOutArray) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedSignature || candidatesOutArray) {
                      links.resolvedSignature = anySignature;
                      if (node.kind === 158) {
                          links.resolvedSignature = resolveCallExpression(node, candidatesOutArray);
                      }
                      else if (node.kind === 159) {
                          links.resolvedSignature = resolveNewExpression(node, candidatesOutArray);
                      }
                      else if (node.kind === 160) {
                          links.resolvedSignature = resolveTaggedTemplateExpression(node, candidatesOutArray);
                      }
                      else {
                          ts.Debug.fail("Branch in 'getResolvedSignature' should be unreachable.");
                      }
                  }
                  return links.resolvedSignature;
              }
              function checkCallExpression(node) {
                  checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments);
                  var signature = getResolvedSignature(node);
                  if (node.expression.kind === 91) {
                      return voidType;
                  }
                  if (node.kind === 159) {
                      var declaration = signature.declaration;
                      if (declaration &&
                          declaration.kind !== 136 &&
                          declaration.kind !== 140 &&
                          declaration.kind !== 144) {
                          if (compilerOptions.noImplicitAny) {
                              error(node, ts.Diagnostics.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type);
                          }
                          return anyType;
                      }
                  }
                  return getReturnTypeOfSignature(signature);
              }
              function checkTaggedTemplateExpression(node) {
                  return getReturnTypeOfSignature(getResolvedSignature(node));
              }
              function checkTypeAssertion(node) {
                  var exprType = checkExpression(node.expression);
                  var targetType = getTypeFromTypeNode(node.type);
                  if (produceDiagnostics && targetType !== unknownType) {
                      var widenedType = getWidenedType(exprType);
                      if (!(isTypeAssignableTo(targetType, widenedType))) {
                          checkTypeAssignableTo(exprType, targetType, node, ts.Diagnostics.Neither_type_0_nor_type_1_is_assignable_to_the_other);
                      }
                  }
                  return targetType;
              }
              function getTypeAtPosition(signature, pos) {
                  return signature.hasRestParameter ?
                      pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) :
                      pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType;
              }
              function assignContextualParameterTypes(signature, context, mapper) {
                  var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0);
                  for (var i = 0; i < len; i++) {
                      var parameter = signature.parameters[i];
                      var links = getSymbolLinks(parameter);
                      links.type = instantiateType(getTypeAtPosition(context, i), mapper);
                  }
                  if (signature.hasRestParameter && context.hasRestParameter && signature.parameters.length >= context.parameters.length) {
                      var parameter = ts.lastOrUndefined(signature.parameters);
                      var links = getSymbolLinks(parameter);
                      links.type = instantiateType(getTypeOfSymbol(ts.lastOrUndefined(context.parameters)), mapper);
                  }
              }
              function getReturnTypeFromBody(func, contextualMapper) {
                  var contextualSignature = getContextualSignatureForFunctionLikeDeclaration(func);
                  if (!func.body) {
                      return unknownType;
                  }
                  var type;
                  if (func.body.kind !== 180) {
                      type = checkExpressionCached(func.body, contextualMapper);
                  }
                  else {
                      var types = checkAndAggregateReturnExpressionTypes(func.body, contextualMapper);
                      if (types.length === 0) {
                          return voidType;
                      }
                      type = contextualSignature ? getUnionType(types) : getCommonSupertype(types);
                      if (!type) {
                          error(func, ts.Diagnostics.No_best_common_type_exists_among_return_expressions);
                          return unknownType;
                      }
                  }
                  if (!contextualSignature) {
                      reportErrorsFromWidening(func, type);
                  }
                  return getWidenedType(type);
              }
              function checkAndAggregateReturnExpressionTypes(body, contextualMapper) {
                  var aggregatedTypes = [];
                  ts.forEachReturnStatement(body, function (returnStatement) {
                      var expr = returnStatement.expression;
                      if (expr) {
                          var type = checkExpressionCached(expr, contextualMapper);
                          if (!ts.contains(aggregatedTypes, type)) {
                              aggregatedTypes.push(type);
                          }
                      }
                  });
                  return aggregatedTypes;
              }
              function bodyContainsAReturnStatement(funcBody) {
                  return ts.forEachReturnStatement(funcBody, function (returnStatement) {
                      return true;
                  });
              }
              function bodyContainsSingleThrowStatement(body) {
                  return (body.statements.length === 1) && (body.statements[0].kind === 196);
              }
              function checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(func, returnType) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  if (returnType === voidType || returnType === anyType) {
                      return;
                  }
                  if (ts.nodeIsMissing(func.body) || func.body.kind !== 180) {
                      return;
                  }
                  var bodyBlock = func.body;
                  if (bodyContainsAReturnStatement(bodyBlock)) {
                      return;
                  }
                  if (bodyContainsSingleThrowStatement(bodyBlock)) {
                      return;
                  }
                  error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement);
              }
              function checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  var hasGrammarError = checkGrammarDeclarationNameInStrictMode(node) || checkGrammarFunctionLikeDeclaration(node);
                  if (!hasGrammarError && node.kind === 163) {
                      checkGrammarFunctionName(node.name) || checkGrammarForGenerator(node);
                  }
                  if (contextualMapper === identityMapper && isContextSensitive(node)) {
                      return anyFunctionType;
                  }
                  var links = getNodeLinks(node);
                  var type = getTypeOfSymbol(node.symbol);
                  if (!(links.flags & 64)) {
                      var contextualSignature = getContextualSignature(node);
                      if (!(links.flags & 64)) {
                          links.flags |= 64;
                          if (contextualSignature) {
                              var signature = getSignaturesOfType(type, 0)[0];
                              if (isContextSensitive(node)) {
                                  assignContextualParameterTypes(signature, contextualSignature, contextualMapper || identityMapper);
                              }
                              if (!node.type && !signature.resolvedReturnType) {
                                  var returnType = getReturnTypeFromBody(node, contextualMapper);
                                  if (!signature.resolvedReturnType) {
                                      signature.resolvedReturnType = returnType;
                                  }
                              }
                          }
                          checkSignatureDeclaration(node);
                      }
                  }
                  if (produceDiagnostics && node.kind !== 135 && node.kind !== 134) {
                      checkCollisionWithCapturedSuperVariable(node, node.name);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                  }
                  return type;
              }
              function checkFunctionExpressionOrObjectLiteralMethodBody(node) {
                  ts.Debug.assert(node.kind !== 135 || ts.isObjectLiteralMethod(node));
                  if (node.type && !node.asteriskToken) {
                      checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
                  }
                  if (node.body) {
                      if (node.body.kind === 180) {
                          checkSourceElement(node.body);
                      }
                      else {
                          var exprType = checkExpression(node.body);
                          if (node.type) {
                              checkTypeAssignableTo(exprType, getTypeFromTypeNode(node.type), node.body, undefined);
                          }
                          checkFunctionExpressionBodies(node.body);
                      }
                  }
              }
              function checkArithmeticOperandType(operand, type, diagnostic) {
                  if (!allConstituentTypesHaveKind(type, 1 | 132)) {
                      error(operand, diagnostic);
                      return false;
                  }
                  return true;
              }
              function checkReferenceExpression(n, invalidReferenceMessage, constantVariableMessage) {
                  function findSymbol(n) {
                      var symbol = getNodeLinks(n).resolvedSymbol;
                      return symbol && getExportSymbolOfValueSymbolIfExported(symbol);
                  }
                  function isReferenceOrErrorExpression(n) {
                      switch (n.kind) {
                          case 65: {
                              var symbol = findSymbol(n);
                              return !symbol || symbol === unknownSymbol || symbol === argumentsSymbol || (symbol.flags & 3) !== 0;
                          }
                          case 156: {
                              var symbol = findSymbol(n);
                              return !symbol || symbol === unknownSymbol || (symbol.flags & ~8) !== 0;
                          }
                          case 157:
                              return true;
                          case 162:
                              return isReferenceOrErrorExpression(n.expression);
                          default:
                              return false;
                      }
                  }
                  function isConstVariableReference(n) {
                      switch (n.kind) {
                          case 65:
                          case 156: {
                              var symbol = findSymbol(n);
                              return symbol && (symbol.flags & 3) !== 0 && (getDeclarationFlagsFromSymbol(symbol) & 8192) !== 0;
                          }
                          case 157: {
                              var index = n.argumentExpression;
                              var symbol = findSymbol(n.expression);
                              if (symbol && index && index.kind === 8) {
                                  var name_7 = index.text;
                                  var prop = getPropertyOfType(getTypeOfSymbol(symbol), name_7);
                                  return prop && (prop.flags & 3) !== 0 && (getDeclarationFlagsFromSymbol(prop) & 8192) !== 0;
                              }
                              return false;
                          }
                          case 162:
                              return isConstVariableReference(n.expression);
                          default:
                              return false;
                      }
                  }
                  if (!isReferenceOrErrorExpression(n)) {
                      error(n, invalidReferenceMessage);
                      return false;
                  }
                  if (isConstVariableReference(n)) {
                      error(n, constantVariableMessage);
                      return false;
                  }
                  return true;
              }
              function checkDeleteExpression(node) {
                  if (node.parserContextFlags & 1 && node.expression.kind === 65) {
                      grammarErrorOnNode(node.expression, ts.Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode);
                  }
                  var operandType = checkExpression(node.expression);
                  return booleanType;
              }
              function checkTypeOfExpression(node) {
                  var operandType = checkExpression(node.expression);
                  return stringType;
              }
              function checkVoidExpression(node) {
                  var operandType = checkExpression(node.expression);
                  return undefinedType;
              }
              function checkPrefixUnaryExpression(node) {
                  if ((node.operator === 38 || node.operator === 39)) {
                      checkGrammarEvalOrArgumentsInStrictMode(node, node.operand);
                  }
                  var operandType = checkExpression(node.operand);
                  switch (node.operator) {
                      case 33:
                      case 34:
                      case 47:
                          if (someConstituentTypeHasKind(operandType, 1048576)) {
                              error(node.operand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(node.operator));
                          }
                          return numberType;
                      case 46:
                          return booleanType;
                      case 38:
                      case 39:
                          var ok = checkArithmeticOperandType(node.operand, operandType, ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
                          if (ok) {
                              checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant);
                          }
                          return numberType;
                  }
                  return unknownType;
              }
              function checkPostfixUnaryExpression(node) {
                  checkGrammarEvalOrArgumentsInStrictMode(node, node.operand);
                  var operandType = checkExpression(node.operand);
                  var ok = checkArithmeticOperandType(node.operand, operandType, ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
                  if (ok) {
                      checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant);
                  }
                  return numberType;
              }
              function someConstituentTypeHasKind(type, kind) {
                  if (type.flags & kind) {
                      return true;
                  }
                  if (type.flags & 16384) {
                      var types = type.types;
                      for (var _i = 0; _i < types.length; _i++) {
                          var current = types[_i];
                          if (current.flags & kind) {
                              return true;
                          }
                      }
                      return false;
                  }
                  return false;
              }
              function allConstituentTypesHaveKind(type, kind) {
                  if (type.flags & kind) {
                      return true;
                  }
                  if (type.flags & 16384) {
                      var types = type.types;
                      for (var _i = 0; _i < types.length; _i++) {
                          var current = types[_i];
                          if (!(current.flags & kind)) {
                              return false;
                          }
                      }
                      return true;
                  }
                  return false;
              }
              function isConstEnumObjectType(type) {
                  return type.flags & (48128 | 32768) && type.symbol && isConstEnumSymbol(type.symbol);
              }
              function isConstEnumSymbol(symbol) {
                  return (symbol.flags & 128) !== 0;
              }
              function checkInstanceOfExpression(node, leftType, rightType) {
                  if (allConstituentTypesHaveKind(leftType, 1049086)) {
                      error(node.left, ts.Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
                  }
                  if (!(rightType.flags & 1 || isTypeSubtypeOf(rightType, globalFunctionType))) {
                      error(node.right, ts.Diagnostics.The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type);
                  }
                  return booleanType;
              }
              function checkInExpression(node, leftType, rightType) {
                  if (!allConstituentTypesHaveKind(leftType, 1 | 258 | 132 | 1048576)) {
                      error(node.left, ts.Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol);
                  }
                  if (!allConstituentTypesHaveKind(rightType, 1 | 48128 | 512)) {
                      error(node.right, ts.Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
                  }
                  return booleanType;
              }
              function checkObjectLiteralAssignment(node, sourceType, contextualMapper) {
                  var properties = node.properties;
                  for (var _i = 0; _i < properties.length; _i++) {
                      var p = properties[_i];
                      if (p.kind === 225 || p.kind === 226) {
                          var name_8 = p.name;
                          var type = sourceType.flags & 1 ? sourceType :
                              getTypeOfPropertyOfType(sourceType, name_8.text) ||
                                  isNumericLiteralName(name_8.text) && getIndexTypeOfType(sourceType, 1) ||
                                  getIndexTypeOfType(sourceType, 0);
                          if (type) {
                              checkDestructuringAssignment(p.initializer || name_8, type);
                          }
                          else {
                              error(name_8, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(sourceType), ts.declarationNameToString(name_8));
                          }
                      }
                      else {
                          error(p, ts.Diagnostics.Property_assignment_expected);
                      }
                  }
                  return sourceType;
              }
              function checkArrayLiteralAssignment(node, sourceType, contextualMapper) {
                  var elementType = checkIteratedTypeOrElementType(sourceType, node, false) || unknownType;
                  var elements = node.elements;
                  for (var i = 0; i < elements.length; i++) {
                      var e = elements[i];
                      if (e.kind !== 176) {
                          if (e.kind !== 174) {
                              var propName = "" + i;
                              var type = sourceType.flags & 1 ? sourceType :
                                  isTupleLikeType(sourceType)
                                      ? getTypeOfPropertyOfType(sourceType, propName)
                                      : elementType;
                              if (type) {
                                  checkDestructuringAssignment(e, type, contextualMapper);
                              }
                              else {
                                  if (isTupleType(sourceType)) {
                                      error(e, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(sourceType), sourceType.elementTypes.length, elements.length);
                                  }
                                  else {
                                      error(e, ts.Diagnostics.Type_0_has_no_property_1, typeToString(sourceType), propName);
                                  }
                              }
                          }
                          else {
                              if (i < elements.length - 1) {
                                  error(e, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
                              }
                              else {
                                  var restExpression = e.expression;
                                  if (restExpression.kind === 170 && restExpression.operatorToken.kind === 53) {
                                      error(restExpression.operatorToken, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
                                  }
                                  else {
                                      checkDestructuringAssignment(restExpression, createArrayType(elementType), contextualMapper);
                                  }
                              }
                          }
                      }
                  }
                  return sourceType;
              }
              function checkDestructuringAssignment(target, sourceType, contextualMapper) {
                  if (target.kind === 170 && target.operatorToken.kind === 53) {
                      checkBinaryExpression(target, contextualMapper);
                      target = target.left;
                  }
                  if (target.kind === 155) {
                      return checkObjectLiteralAssignment(target, sourceType, contextualMapper);
                  }
                  if (target.kind === 154) {
                      return checkArrayLiteralAssignment(target, sourceType, contextualMapper);
                  }
                  return checkReferenceAssignment(target, sourceType, contextualMapper);
              }
              function checkReferenceAssignment(target, sourceType, contextualMapper) {
                  var targetType = checkExpression(target, contextualMapper);
                  if (checkReferenceExpression(target, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant)) {
                      checkTypeAssignableTo(sourceType, targetType, target, undefined);
                  }
                  return sourceType;
              }
              function checkBinaryExpression(node, contextualMapper) {
                  if (ts.isLeftHandSideExpression(node.left) && ts.isAssignmentOperator(node.operatorToken.kind)) {
                      checkGrammarEvalOrArgumentsInStrictMode(node, node.left);
                  }
                  var operator = node.operatorToken.kind;
                  if (operator === 53 && (node.left.kind === 155 || node.left.kind === 154)) {
                      return checkDestructuringAssignment(node.left, checkExpression(node.right, contextualMapper), contextualMapper);
                  }
                  var leftType = checkExpression(node.left, contextualMapper);
                  var rightType = checkExpression(node.right, contextualMapper);
                  switch (operator) {
                      case 35:
                      case 56:
                      case 36:
                      case 57:
                      case 37:
                      case 58:
                      case 34:
                      case 55:
                      case 40:
                      case 59:
                      case 41:
                      case 60:
                      case 42:
                      case 61:
                      case 44:
                      case 63:
                      case 45:
                      case 64:
                      case 43:
                      case 62:
                          if (leftType.flags & (32 | 64))
                              leftType = rightType;
                          if (rightType.flags & (32 | 64))
                              rightType = leftType;
                          var suggestedOperator;
                          if ((leftType.flags & 8) &&
                              (rightType.flags & 8) &&
                              (suggestedOperator = getSuggestedBooleanOperator(node.operatorToken.kind)) !== undefined) {
                              error(node, ts.Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, ts.tokenToString(node.operatorToken.kind), ts.tokenToString(suggestedOperator));
                          }
                          else {
                              var leftOk = checkArithmeticOperandType(node.left, leftType, ts.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
                              var rightOk = checkArithmeticOperandType(node.right, rightType, ts.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
                              if (leftOk && rightOk) {
                                  checkAssignmentOperator(numberType);
                              }
                          }
                          return numberType;
                      case 33:
                      case 54:
                          if (leftType.flags & (32 | 64))
                              leftType = rightType;
                          if (rightType.flags & (32 | 64))
                              rightType = leftType;
                          var resultType;
                          if (allConstituentTypesHaveKind(leftType, 132) && allConstituentTypesHaveKind(rightType, 132)) {
                              resultType = numberType;
                          }
                          else {
                              if (allConstituentTypesHaveKind(leftType, 258) || allConstituentTypesHaveKind(rightType, 258)) {
                                  resultType = stringType;
                              }
                              else if (leftType.flags & 1 || rightType.flags & 1) {
                                  resultType = anyType;
                              }
                              if (resultType && !checkForDisallowedESSymbolOperand(operator)) {
                                  return resultType;
                              }
                          }
                          if (!resultType) {
                              reportOperatorError();
                              return anyType;
                          }
                          if (operator === 54) {
                              checkAssignmentOperator(resultType);
                          }
                          return resultType;
                      case 24:
                      case 25:
                      case 26:
                      case 27:
                          if (!checkForDisallowedESSymbolOperand(operator)) {
                              return booleanType;
                          }
                      case 28:
                      case 29:
                      case 30:
                      case 31:
                          if (!isTypeAssignableTo(leftType, rightType) && !isTypeAssignableTo(rightType, leftType)) {
                              reportOperatorError();
                          }
                          return booleanType;
                      case 87:
                          return checkInstanceOfExpression(node, leftType, rightType);
                      case 86:
                          return checkInExpression(node, leftType, rightType);
                      case 48:
                          return rightType;
                      case 49:
                          return getUnionType([leftType, rightType]);
                      case 53:
                          checkAssignmentOperator(rightType);
                          return rightType;
                      case 23:
                          return rightType;
                  }
                  function checkForDisallowedESSymbolOperand(operator) {
                      var offendingSymbolOperand = someConstituentTypeHasKind(leftType, 1048576) ? node.left :
                          someConstituentTypeHasKind(rightType, 1048576) ? node.right :
                              undefined;
                      if (offendingSymbolOperand) {
                          error(offendingSymbolOperand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(operator));
                          return false;
                      }
                      return true;
                  }
                  function getSuggestedBooleanOperator(operator) {
                      switch (operator) {
                          case 44:
                          case 63:
                              return 49;
                          case 45:
                          case 64:
                              return 31;
                          case 43:
                          case 62:
                              return 48;
                          default:
                              return undefined;
                      }
                  }
                  function checkAssignmentOperator(valueType) {
                      if (produceDiagnostics && operator >= 53 && operator <= 64) {
                          var ok = checkReferenceExpression(node.left, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant);
                          if (ok) {
                              checkTypeAssignableTo(valueType, leftType, node.left, undefined);
                          }
                      }
                  }
                  function reportOperatorError() {
                      error(node, ts.Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2, ts.tokenToString(node.operatorToken.kind), typeToString(leftType), typeToString(rightType));
                  }
              }
              function checkYieldExpression(node) {
                  if (!(node.parserContextFlags & 4)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.yield_expression_must_be_contained_within_a_generator_declaration);
                  }
                  else {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.yield_expressions_are_not_currently_supported);
                  }
              }
              function checkConditionalExpression(node, contextualMapper) {
                  checkExpression(node.condition);
                  var type1 = checkExpression(node.whenTrue, contextualMapper);
                  var type2 = checkExpression(node.whenFalse, contextualMapper);
                  return getUnionType([type1, type2]);
              }
              function checkTemplateExpression(node) {
                  ts.forEach(node.templateSpans, function (templateSpan) {
                      checkExpression(templateSpan.expression);
                  });
                  return stringType;
              }
              function checkExpressionWithContextualType(node, contextualType, contextualMapper) {
                  var saveContextualType = node.contextualType;
                  node.contextualType = contextualType;
                  var result = checkExpression(node, contextualMapper);
                  node.contextualType = saveContextualType;
                  return result;
              }
              function checkExpressionCached(node, contextualMapper) {
                  var links = getNodeLinks(node);
                  if (!links.resolvedType) {
                      links.resolvedType = checkExpression(node, contextualMapper);
                  }
                  return links.resolvedType;
              }
              function checkPropertyAssignment(node, contextualMapper) {
                  if (node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                  }
                  return checkExpression(node.initializer, contextualMapper);
              }
              function checkObjectLiteralMethod(node, contextualMapper) {
                  checkGrammarMethod(node);
                  if (node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                  }
                  var uninstantiatedType = checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
                  return instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
              }
              function instantiateTypeWithSingleGenericCallSignature(node, type, contextualMapper) {
                  if (contextualMapper && contextualMapper !== identityMapper) {
                      var signature = getSingleCallSignature(type);
                      if (signature && signature.typeParameters) {
                          var contextualType = getContextualType(node);
                          if (contextualType) {
                              var contextualSignature = getSingleCallSignature(contextualType);
                              if (contextualSignature && !contextualSignature.typeParameters) {
                                  return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper));
                              }
                          }
                      }
                  }
                  return type;
              }
              function checkExpression(node, contextualMapper) {
                  checkGrammarIdentifierInStrictMode(node);
                  return checkExpressionOrQualifiedName(node, contextualMapper);
              }
              function checkExpressionOrQualifiedName(node, contextualMapper) {
                  var type;
                  if (node.kind == 127) {
                      type = checkQualifiedName(node);
                  }
                  else {
                      var uninstantiatedType = checkExpressionWorker(node, contextualMapper);
                      type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
                  }
                  if (isConstEnumObjectType(type)) {
                      var ok = (node.parent.kind === 156 && node.parent.expression === node) ||
                          (node.parent.kind === 157 && node.parent.expression === node) ||
                          ((node.kind === 65 || node.kind === 127) && isInRightSideOfImportOrExportAssignment(node));
                      if (!ok) {
                          error(node, ts.Diagnostics.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment);
                      }
                  }
                  return type;
              }
              function checkNumericLiteral(node) {
                  checkGrammarNumericLiteral(node);
                  return numberType;
              }
              function checkExpressionWorker(node, contextualMapper) {
                  switch (node.kind) {
                      case 65:
                          return checkIdentifier(node);
                      case 93:
                          return checkThisExpression(node);
                      case 91:
                          return checkSuperExpression(node);
                      case 89:
                          return nullType;
                      case 95:
                      case 80:
                          return booleanType;
                      case 7:
                          return checkNumericLiteral(node);
                      case 172:
                          return checkTemplateExpression(node);
                      case 8:
                      case 10:
                          return stringType;
                      case 9:
                          return globalRegExpType;
                      case 154:
                          return checkArrayLiteral(node, contextualMapper);
                      case 155:
                          return checkObjectLiteral(node, contextualMapper);
                      case 156:
                          return checkPropertyAccessExpression(node);
                      case 157:
                          return checkIndexedAccess(node);
                      case 158:
                      case 159:
                          return checkCallExpression(node);
                      case 160:
                          return checkTaggedTemplateExpression(node);
                      case 161:
                          return checkTypeAssertion(node);
                      case 162:
                          return checkExpression(node.expression, contextualMapper);
                      case 175:
                          return checkClassExpression(node);
                      case 163:
                      case 164:
                          return checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
                      case 166:
                          return checkTypeOfExpression(node);
                      case 165:
                          return checkDeleteExpression(node);
                      case 167:
                          return checkVoidExpression(node);
                      case 168:
                          return checkPrefixUnaryExpression(node);
                      case 169:
                          return checkPostfixUnaryExpression(node);
                      case 170:
                          return checkBinaryExpression(node, contextualMapper);
                      case 171:
                          return checkConditionalExpression(node, contextualMapper);
                      case 174:
                          return checkSpreadElementExpression(node, contextualMapper);
                      case 176:
                          return undefinedType;
                      case 173:
                          checkYieldExpression(node);
                          return unknownType;
                  }
                  return unknownType;
              }
              function checkTypeParameter(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  if (node.expression) {
                      grammarErrorOnFirstToken(node.expression, ts.Diagnostics.Type_expected);
                  }
                  checkSourceElement(node.constraint);
                  if (produceDiagnostics) {
                      checkTypeParameterHasIllegalReferencesInConstraint(node);
                      checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_parameter_name_cannot_be_0);
                  }
              }
              function checkParameter(node) {
                  // Grammar checking
                  // It is a SyntaxError if the Identifier "eval" or the Identifier "arguments" occurs as the
                  // Identifier in a PropertySetParameterList of a PropertyAssignment that is contained in strict code
                  // or if its FunctionBody is strict code(11.1.5).
                  // It is a SyntaxError if the identifier eval or arguments appears within a FormalParameterList of a
                  // strict mode FunctionLikeDeclaration or FunctionExpression(13.1)
                  checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
                  checkVariableLikeDeclaration(node);
                  var func = ts.getContainingFunction(node);
                  if (node.flags & 112) {
                      func = ts.getContainingFunction(node);
                      if (!(func.kind === 136 && ts.nodeIsPresent(func.body))) {
                          error(node, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
                      }
                  }
                  if (node.questionToken && ts.isBindingPattern(node.name) && func.body) {
                      error(node, ts.Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
                  }
                  if (node.dotDotDotToken && !ts.isBindingPattern(node.name) && !isArrayType(getTypeOfSymbol(node.symbol))) {
                      error(node, ts.Diagnostics.A_rest_parameter_must_be_of_an_array_type);
                  }
              }
              function checkSignatureDeclaration(node) {
                  if (node.kind === 141) {
                      checkGrammarIndexSignature(node);
                  }
                  else if (node.kind === 143 || node.kind === 201 || node.kind === 144 ||
                      node.kind === 139 || node.kind === 136 ||
                      node.kind === 140) {
                      checkGrammarFunctionLikeDeclaration(node);
                  }
                  checkTypeParameters(node.typeParameters);
                  ts.forEach(node.parameters, checkParameter);
                  if (node.type) {
                      checkSourceElement(node.type);
                  }
                  if (produceDiagnostics) {
                      checkCollisionWithArgumentsInGeneratedCode(node);
                      if (compilerOptions.noImplicitAny && !node.type) {
                          switch (node.kind) {
                              case 140:
                                  error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
                                  break;
                              case 139:
                                  error(node, ts.Diagnostics.Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
                                  break;
                          }
                      }
                  }
                  checkSpecializedSignatureDeclaration(node);
              }
              function checkTypeForDuplicateIndexSignatures(node) {
                  if (node.kind === 203) {
                      var nodeSymbol = getSymbolOfNode(node);
                      if (nodeSymbol.declarations.length > 0 && nodeSymbol.declarations[0] !== node) {
                          return;
                      }
                  }
                  var indexSymbol = getIndexSymbol(getSymbolOfNode(node));
                  if (indexSymbol) {
                      var seenNumericIndexer = false;
                      var seenStringIndexer = false;
                      for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
                          var decl = _a[_i];
                          var declaration = decl;
                          if (declaration.parameters.length === 1 && declaration.parameters[0].type) {
                              switch (declaration.parameters[0].type.kind) {
                                  case 122:
                                      if (!seenStringIndexer) {
                                          seenStringIndexer = true;
                                      }
                                      else {
                                          error(declaration, ts.Diagnostics.Duplicate_string_index_signature);
                                      }
                                      break;
                                  case 120:
                                      if (!seenNumericIndexer) {
                                          seenNumericIndexer = true;
                                      }
                                      else {
                                          error(declaration, ts.Diagnostics.Duplicate_number_index_signature);
                                      }
                                      break;
                              }
                          }
                      }
                  }
              }
              function checkPropertyDeclaration(node) {
                  checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarProperty(node) || checkGrammarComputedPropertyName(node.name);
                  checkVariableLikeDeclaration(node);
              }
              function checkMethodDeclaration(node) {
                  checkGrammarMethod(node) || checkGrammarComputedPropertyName(node.name);
                  checkFunctionLikeDeclaration(node);
              }
              function checkConstructorDeclaration(node) {
                  checkSignatureDeclaration(node);
                  checkGrammarConstructorTypeParameters(node) || checkGrammarConstructorTypeAnnotation(node);
                  checkSourceElement(node.body);
                  var symbol = getSymbolOfNode(node);
                  var firstDeclaration = ts.getDeclarationOfKind(symbol, node.kind);
                  if (node === firstDeclaration) {
                      checkFunctionOrConstructorSymbol(symbol);
                  }
                  if (ts.nodeIsMissing(node.body)) {
                      return;
                  }
                  if (!produceDiagnostics) {
                      return;
                  }
                  function isSuperCallExpression(n) {
                      return n.kind === 158 && n.expression.kind === 91;
                  }
                  function containsSuperCall(n) {
                      if (isSuperCallExpression(n)) {
                          return true;
                      }
                      switch (n.kind) {
                          case 163:
                          case 201:
                          case 164:
                          case 155: return false;
                          default: return ts.forEachChild(n, containsSuperCall);
                      }
                  }
                  function markThisReferencesAsErrors(n) {
                      if (n.kind === 93) {
                          error(n, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
                      }
                      else if (n.kind !== 163 && n.kind !== 201) {
                          ts.forEachChild(n, markThisReferencesAsErrors);
                      }
                  }
                  function isInstancePropertyWithInitializer(n) {
                      return n.kind === 133 &&
                          !(n.flags & 128) &&
                          !!n.initializer;
                  }
                  if (ts.getClassExtendsHeritageClauseElement(node.parent)) {
                      if (containsSuperCall(node.body)) {
                          var superCallShouldBeFirst = ts.forEach(node.parent.members, isInstancePropertyWithInitializer) ||
                              ts.forEach(node.parameters, function (p) { return p.flags & (16 | 32 | 64); });
                          if (superCallShouldBeFirst) {
                              var statements = node.body.statements;
                              if (!statements.length || statements[0].kind !== 183 || !isSuperCallExpression(statements[0].expression)) {
                                  error(node, ts.Diagnostics.A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties);
                              }
                              else {
                                  markThisReferencesAsErrors(statements[0].expression);
                              }
                          }
                      }
                      else {
                          error(node, ts.Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call);
                      }
                  }
              }
              function checkAccessorDeclaration(node) {
                  if (produceDiagnostics) {
                      checkGrammarFunctionLikeDeclaration(node) || checkGrammarAccessor(node) || checkGrammarComputedPropertyName(node.name);
                      if (node.kind === 137) {
                          if (!ts.isInAmbientContext(node) && ts.nodeIsPresent(node.body) && !(bodyContainsAReturnStatement(node.body) || bodyContainsSingleThrowStatement(node.body))) {
                              error(node.name, ts.Diagnostics.A_get_accessor_must_return_a_value_or_consist_of_a_single_throw_statement);
                          }
                      }
                      if (!ts.hasDynamicName(node)) {
                          var otherKind = node.kind === 137 ? 138 : 137;
                          var otherAccessor = ts.getDeclarationOfKind(node.symbol, otherKind);
                          if (otherAccessor) {
                              if (((node.flags & 112) !== (otherAccessor.flags & 112))) {
                                  error(node.name, ts.Diagnostics.Getter_and_setter_accessors_do_not_agree_in_visibility);
                              }
                              var currentAccessorType = getAnnotatedAccessorType(node);
                              var otherAccessorType = getAnnotatedAccessorType(otherAccessor);
                              if (currentAccessorType && otherAccessorType) {
                                  if (!isTypeIdenticalTo(currentAccessorType, otherAccessorType)) {
                                      error(node, ts.Diagnostics.get_and_set_accessor_must_have_the_same_type);
                                  }
                              }
                          }
                      }
                      getTypeOfAccessors(getSymbolOfNode(node));
                  }
                  checkFunctionLikeDeclaration(node);
              }
              function checkMissingDeclaration(node) {
                  checkDecorators(node);
              }
              function checkTypeReferenceNode(node) {
                  checkGrammarTypeReferenceInStrictMode(node.typeName);
                  return checkTypeReferenceOrExpressionWithTypeArguments(node);
              }
              function checkExpressionWithTypeArguments(node) {
                  checkGrammarExpressionWithTypeArgumentsInStrictMode(node.expression);
                  return checkTypeReferenceOrExpressionWithTypeArguments(node);
              }
              function checkTypeReferenceOrExpressionWithTypeArguments(node) {
                  checkGrammarTypeArguments(node, node.typeArguments);
                  var type = getTypeFromTypeReferenceOrExpressionWithTypeArguments(node);
                  if (type !== unknownType && node.typeArguments) {
                      var len = node.typeArguments.length;
                      for (var i = 0; i < len; i++) {
                          checkSourceElement(node.typeArguments[i]);
                          var constraint = getConstraintOfTypeParameter(type.target.typeParameters[i]);
                          if (produceDiagnostics && constraint) {
                              var typeArgument = type.typeArguments[i];
                              checkTypeAssignableTo(typeArgument, constraint, node, ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
                          }
                      }
                  }
              }
              function checkTypeQuery(node) {
                  getTypeFromTypeQueryNode(node);
              }
              function checkTypeLiteral(node) {
                  ts.forEach(node.members, checkSourceElement);
                  if (produceDiagnostics) {
                      var type = getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
                      checkIndexConstraints(type);
                      checkTypeForDuplicateIndexSignatures(node);
                  }
              }
              function checkArrayType(node) {
                  checkSourceElement(node.elementType);
              }
              function checkTupleType(node) {
                  var hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes);
                  if (!hasErrorFromDisallowedTrailingComma && node.elementTypes.length === 0) {
                      grammarErrorOnNode(node, ts.Diagnostics.A_tuple_type_element_list_cannot_be_empty);
                  }
                  ts.forEach(node.elementTypes, checkSourceElement);
              }
              function checkUnionType(node) {
                  ts.forEach(node.types, checkSourceElement);
              }
              function isPrivateWithinAmbient(node) {
                  return (node.flags & 32) && ts.isInAmbientContext(node);
              }
              function checkSpecializedSignatureDeclaration(signatureDeclarationNode) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  var signature = getSignatureFromDeclaration(signatureDeclarationNode);
                  if (!signature.hasStringLiterals) {
                      return;
                  }
                  if (ts.nodeIsPresent(signatureDeclarationNode.body)) {
                      error(signatureDeclarationNode, ts.Diagnostics.A_signature_with_an_implementation_cannot_use_a_string_literal_type);
                      return;
                  }
                  var signaturesToCheck;
                  if (!signatureDeclarationNode.name && signatureDeclarationNode.parent && signatureDeclarationNode.parent.kind === 203) {
                      ts.Debug.assert(signatureDeclarationNode.kind === 139 || signatureDeclarationNode.kind === 140);
                      var signatureKind = signatureDeclarationNode.kind === 139 ? 0 : 1;
                      var containingSymbol = getSymbolOfNode(signatureDeclarationNode.parent);
                      var containingType = getDeclaredTypeOfSymbol(containingSymbol);
                      signaturesToCheck = getSignaturesOfType(containingType, signatureKind);
                  }
                  else {
                      signaturesToCheck = getSignaturesOfSymbol(getSymbolOfNode(signatureDeclarationNode));
                  }
                  for (var _i = 0; _i < signaturesToCheck.length; _i++) {
                      var otherSignature = signaturesToCheck[_i];
                      if (!otherSignature.hasStringLiterals && isSignatureAssignableTo(signature, otherSignature)) {
                          return;
                      }
                  }
                  error(signatureDeclarationNode, ts.Diagnostics.Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature);
              }
              function getEffectiveDeclarationFlags(n, flagsToCheck) {
                  var flags = ts.getCombinedNodeFlags(n);
                  if (n.parent.kind !== 203 && ts.isInAmbientContext(n)) {
                      if (!(flags & 2)) {
                          flags |= 1;
                      }
                      flags |= 2;
                  }
                  return flags & flagsToCheck;
              }
              function checkFunctionOrConstructorSymbol(symbol) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  function getCanonicalOverload(overloads, implementation) {
                      var implementationSharesContainerWithFirstOverload = implementation !== undefined && implementation.parent === overloads[0].parent;
                      return implementationSharesContainerWithFirstOverload ? implementation : overloads[0];
                  }
                  function checkFlagAgreementBetweenOverloads(overloads, implementation, flagsToCheck, someOverloadFlags, allOverloadFlags) {
                      var someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
                      if (someButNotAllOverloadFlags !== 0) {
                          var canonicalFlags = getEffectiveDeclarationFlags(getCanonicalOverload(overloads, implementation), flagsToCheck);
                          ts.forEach(overloads, function (o) {
                              var deviation = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlags;
                              if (deviation & 1) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_exported_or_not_exported);
                              }
                              else if (deviation & 2) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
                              }
                              else if (deviation & (32 | 64)) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
                              }
                          });
                      }
                  }
                  function checkQuestionTokenAgreementBetweenOverloads(overloads, implementation, someHaveQuestionToken, allHaveQuestionToken) {
                      if (someHaveQuestionToken !== allHaveQuestionToken) {
                          var canonicalHasQuestionToken = ts.hasQuestionToken(getCanonicalOverload(overloads, implementation));
                          ts.forEach(overloads, function (o) {
                              var deviation = ts.hasQuestionToken(o) !== canonicalHasQuestionToken;
                              if (deviation) {
                                  error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_optional_or_required);
                              }
                          });
                      }
                  }
                  var flagsToCheck = 1 | 2 | 32 | 64;
                  var someNodeFlags = 0;
                  var allNodeFlags = flagsToCheck;
                  var someHaveQuestionToken = false;
                  var allHaveQuestionToken = true;
                  var hasOverloads = false;
                  var bodyDeclaration;
                  var lastSeenNonAmbientDeclaration;
                  var previousDeclaration;
                  var declarations = symbol.declarations;
                  var isConstructor = (symbol.flags & 16384) !== 0;
                  function reportImplementationExpectedError(node) {
                      if (node.name && ts.nodeIsMissing(node.name)) {
                          return;
                      }
                      var seen = false;
                      var subsequentNode = ts.forEachChild(node.parent, function (c) {
                          if (seen) {
                              return c;
                          }
                          else {
                              seen = c === node;
                          }
                      });
                      if (subsequentNode) {
                          if (subsequentNode.kind === node.kind) {
                              var errorNode_1 = subsequentNode.name || subsequentNode;
                              if (node.name && subsequentNode.name && node.name.text === subsequentNode.name.text) {
                                  ts.Debug.assert(node.kind === 135 || node.kind === 134);
                                  ts.Debug.assert((node.flags & 128) !== (subsequentNode.flags & 128));
                                  var diagnostic = node.flags & 128 ? ts.Diagnostics.Function_overload_must_be_static : ts.Diagnostics.Function_overload_must_not_be_static;
                                  error(errorNode_1, diagnostic);
                                  return;
                              }
                              else if (ts.nodeIsPresent(subsequentNode.body)) {
                                  error(errorNode_1, ts.Diagnostics.Function_implementation_name_must_be_0, ts.declarationNameToString(node.name));
                                  return;
                              }
                          }
                      }
                      var errorNode = node.name || node;
                      if (isConstructor) {
                          error(errorNode, ts.Diagnostics.Constructor_implementation_is_missing);
                      }
                      else {
                          error(errorNode, ts.Diagnostics.Function_implementation_is_missing_or_not_immediately_following_the_declaration);
                      }
                  }
                  var isExportSymbolInsideModule = symbol.parent && symbol.parent.flags & 1536;
                  var duplicateFunctionDeclaration = false;
                  var multipleConstructorImplementation = false;
                  for (var _i = 0; _i < declarations.length; _i++) {
                      var current = declarations[_i];
                      var node = current;
                      var inAmbientContext = ts.isInAmbientContext(node);
                      var inAmbientContextOrInterface = node.parent.kind === 203 || node.parent.kind === 146 || inAmbientContext;
                      if (inAmbientContextOrInterface) {
                          previousDeclaration = undefined;
                      }
                      if (node.kind === 201 || node.kind === 135 || node.kind === 134 || node.kind === 136) {
                          var currentNodeFlags = getEffectiveDeclarationFlags(node, flagsToCheck);
                          someNodeFlags |= currentNodeFlags;
                          allNodeFlags &= currentNodeFlags;
                          someHaveQuestionToken = someHaveQuestionToken || ts.hasQuestionToken(node);
                          allHaveQuestionToken = allHaveQuestionToken && ts.hasQuestionToken(node);
                          if (ts.nodeIsPresent(node.body) && bodyDeclaration) {
                              if (isConstructor) {
                                  multipleConstructorImplementation = true;
                              }
                              else {
                                  duplicateFunctionDeclaration = true;
                              }
                          }
                          else if (!isExportSymbolInsideModule && previousDeclaration && previousDeclaration.parent === node.parent && previousDeclaration.end !== node.pos) {
                              reportImplementationExpectedError(previousDeclaration);
                          }
                          if (ts.nodeIsPresent(node.body)) {
                              if (!bodyDeclaration) {
                                  bodyDeclaration = node;
                              }
                          }
                          else {
                              hasOverloads = true;
                          }
                          previousDeclaration = node;
                          if (!inAmbientContextOrInterface) {
                              lastSeenNonAmbientDeclaration = node;
                          }
                      }
                  }
                  if (multipleConstructorImplementation) {
                      ts.forEach(declarations, function (declaration) {
                          error(declaration, ts.Diagnostics.Multiple_constructor_implementations_are_not_allowed);
                      });
                  }
                  if (duplicateFunctionDeclaration) {
                      ts.forEach(declarations, function (declaration) {
                          error(declaration.name, ts.Diagnostics.Duplicate_function_implementation);
                      });
                  }
                  if (!isExportSymbolInsideModule && lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body) {
                      reportImplementationExpectedError(lastSeenNonAmbientDeclaration);
                  }
                  if (hasOverloads) {
                      checkFlagAgreementBetweenOverloads(declarations, bodyDeclaration, flagsToCheck, someNodeFlags, allNodeFlags);
                      checkQuestionTokenAgreementBetweenOverloads(declarations, bodyDeclaration, someHaveQuestionToken, allHaveQuestionToken);
                      if (bodyDeclaration) {
                          var signatures = getSignaturesOfSymbol(symbol);
                          var bodySignature = getSignatureFromDeclaration(bodyDeclaration);
                          if (!bodySignature.hasStringLiterals) {
                              for (var _a = 0; _a < signatures.length; _a++) {
                                  var signature = signatures[_a];
                                  if (!signature.hasStringLiterals && !isSignatureAssignableTo(bodySignature, signature)) {
                                      error(signature.declaration, ts.Diagnostics.Overload_signature_is_not_compatible_with_function_implementation);
                                      break;
                                  }
                              }
                          }
                      }
                  }
              }
              function checkExportsOnMergedDeclarations(node) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  var symbol = node.localSymbol;
                  if (!symbol) {
                      symbol = getSymbolOfNode(node);
                      if (!(symbol.flags & 7340032)) {
                          return;
                      }
                  }
                  if (ts.getDeclarationOfKind(symbol, node.kind) !== node) {
                      return;
                  }
                  var exportedDeclarationSpaces = 0;
                  var nonExportedDeclarationSpaces = 0;
                  ts.forEach(symbol.declarations, function (d) {
                      var declarationSpaces = getDeclarationSpaces(d);
                      if (getEffectiveDeclarationFlags(d, 1)) {
                          exportedDeclarationSpaces |= declarationSpaces;
                      }
                      else {
                          nonExportedDeclarationSpaces |= declarationSpaces;
                      }
                  });
                  var commonDeclarationSpace = exportedDeclarationSpaces & nonExportedDeclarationSpaces;
                  if (commonDeclarationSpace) {
                      ts.forEach(symbol.declarations, function (d) {
                          if (getDeclarationSpaces(d) & commonDeclarationSpace) {
                              error(d.name, ts.Diagnostics.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, ts.declarationNameToString(d.name));
                          }
                      });
                  }
                  function getDeclarationSpaces(d) {
                      switch (d.kind) {
                          case 203:
                              return 2097152;
                          case 206:
                              return d.name.kind === 8 || ts.getModuleInstanceState(d) !== 0
                                  ? 4194304 | 1048576
                                  : 4194304;
                          case 202:
                          case 205:
                              return 2097152 | 1048576;
                          case 209:
                              var result = 0;
                              var target = resolveAlias(getSymbolOfNode(d));
                              ts.forEach(target.declarations, function (d) { result |= getDeclarationSpaces(d); });
                              return result;
                          default:
                              return 1048576;
                      }
                  }
              }
              function checkDecorator(node) {
                  var expression = node.expression;
                  var exprType = checkExpression(expression);
                  switch (node.parent.kind) {
                      case 202:
                          var classSymbol = getSymbolOfNode(node.parent);
                          var classConstructorType = getTypeOfSymbol(classSymbol);
                          var classDecoratorType = instantiateSingleCallFunctionType(getGlobalClassDecoratorType(), [classConstructorType]);
                          checkTypeAssignableTo(exprType, classDecoratorType, node);
                          break;
                      case 133:
                          checkTypeAssignableTo(exprType, getGlobalPropertyDecoratorType(), node);
                          break;
                      case 135:
                      case 137:
                      case 138:
                          var methodType = getTypeOfNode(node.parent);
                          var methodDecoratorType = instantiateSingleCallFunctionType(getGlobalMethodDecoratorType(), [methodType]);
                          checkTypeAssignableTo(exprType, methodDecoratorType, node);
                          break;
                      case 130:
                          checkTypeAssignableTo(exprType, getGlobalParameterDecoratorType(), node);
                          break;
                  }
              }
              function checkTypeNodeAsExpression(node) {
                  if (node && node.kind === 142) {
                      var type = getTypeFromTypeNode(node);
                      var shouldCheckIfUnknownType = type === unknownType && compilerOptions.separateCompilation;
                      if (!type || (!shouldCheckIfUnknownType && type.flags & (1048703 | 132 | 258))) {
                          return;
                      }
                      if (shouldCheckIfUnknownType || type.symbol.valueDeclaration) {
                          checkExpressionOrQualifiedName(node.typeName);
                      }
                  }
              }
              function checkTypeAnnotationAsExpression(node) {
                  switch (node.kind) {
                      case 133:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 130:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 135:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 137:
                          checkTypeNodeAsExpression(node.type);
                          break;
                      case 138:
                          checkTypeNodeAsExpression(getSetAccessorTypeAnnotationNode(node));
                          break;
                  }
              }
              function checkParameterTypeAnnotationsAsExpressions(node) {
                  for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
                      var parameter = _a[_i];
                      checkTypeAnnotationAsExpression(parameter);
                  }
              }
              function checkDecorators(node) {
                  if (!node.decorators) {
                      return;
                  }
                  if (!ts.nodeCanBeDecorated(node)) {
                      return;
                  }
                  if (compilerOptions.emitDecoratorMetadata) {
                      switch (node.kind) {
                          case 202:
                              var constructor = ts.getFirstConstructorWithBody(node);
                              if (constructor) {
                                  checkParameterTypeAnnotationsAsExpressions(constructor);
                              }
                              break;
                          case 135:
                              checkParameterTypeAnnotationsAsExpressions(node);
                          case 138:
                          case 137:
                          case 133:
                          case 130:
                              checkTypeAnnotationAsExpression(node);
                              break;
                      }
                  }
                  emitDecorate = true;
                  if (node.kind === 130) {
                      emitParam = true;
                  }
                  ts.forEach(node.decorators, checkDecorator);
              }
              function checkFunctionDeclaration(node) {
                  if (produceDiagnostics) {
                      checkFunctionLikeDeclaration(node) ||
                          checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) ||
                          checkGrammarFunctionName(node.name) ||
                          checkGrammarForGenerator(node);
                      checkCollisionWithCapturedSuperVariable(node, node.name);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  }
              }
              function checkFunctionLikeDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  checkDecorators(node);
                  checkSignatureDeclaration(node);
                  if (node.name && node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                  }
                  if (!ts.hasDynamicName(node)) {
                      var symbol = getSymbolOfNode(node);
                      var localSymbol = node.localSymbol || symbol;
                      var firstDeclaration = ts.getDeclarationOfKind(localSymbol, node.kind);
                      if (node === firstDeclaration) {
                          checkFunctionOrConstructorSymbol(localSymbol);
                      }
                      if (symbol.parent) {
                          if (ts.getDeclarationOfKind(symbol, node.kind) === node) {
                              checkFunctionOrConstructorSymbol(symbol);
                          }
                      }
                  }
                  checkSourceElement(node.body);
                  if (node.type && !isAccessor(node.kind) && !node.asteriskToken) {
                      checkIfNonVoidFunctionHasReturnExpressionsOrSingleThrowStatment(node, getTypeFromTypeNode(node.type));
                  }
                  if (compilerOptions.noImplicitAny && ts.nodeIsMissing(node.body) && !node.type && !isPrivateWithinAmbient(node)) {
                      reportImplicitAnyError(node, anyType);
                  }
              }
              function checkBlock(node) {
                  if (node.kind === 180) {
                      checkGrammarStatementInAmbientContext(node);
                  }
                  ts.forEach(node.statements, checkSourceElement);
                  if (ts.isFunctionBlock(node) || node.kind === 207) {
                      checkFunctionExpressionBodies(node);
                  }
              }
              function checkCollisionWithArgumentsInGeneratedCode(node) {
                  if (!ts.hasRestParameters(node) || ts.isInAmbientContext(node) || ts.nodeIsMissing(node.body)) {
                      return;
                  }
                  ts.forEach(node.parameters, function (p) {
                      if (p.name && !ts.isBindingPattern(p.name) && p.name.text === argumentsSymbol.name) {
                          error(p, ts.Diagnostics.Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters);
                      }
                  });
              }
              function needCollisionCheckForIdentifier(node, identifier, name) {
                  if (!(identifier && identifier.text === name)) {
                      return false;
                  }
                  if (node.kind === 133 ||
                      node.kind === 132 ||
                      node.kind === 135 ||
                      node.kind === 134 ||
                      node.kind === 137 ||
                      node.kind === 138) {
                      return false;
                  }
                  if (ts.isInAmbientContext(node)) {
                      return false;
                  }
                  var root = ts.getRootDeclaration(node);
                  if (root.kind === 130 && ts.nodeIsMissing(root.parent.body)) {
                      return false;
                  }
                  return true;
              }
              function checkCollisionWithCapturedThisVariable(node, name) {
                  if (needCollisionCheckForIdentifier(node, name, "_this")) {
                      potentialThisCollisions.push(node);
                  }
              }
              function checkIfThisIsCapturedInEnclosingScope(node) {
                  var current = node;
                  while (current) {
                      if (getNodeCheckFlags(current) & 4) {
                          var isDeclaration_1 = node.kind !== 65;
                          if (isDeclaration_1) {
                              error(node.name, ts.Diagnostics.Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference);
                          }
                          else {
                              error(node, ts.Diagnostics.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference);
                          }
                          return;
                      }
                      current = current.parent;
                  }
              }
              function checkCollisionWithCapturedSuperVariable(node, name) {
                  if (!needCollisionCheckForIdentifier(node, name, "_super")) {
                      return;
                  }
                  var enclosingClass = ts.getAncestor(node, 202);
                  if (!enclosingClass || ts.isInAmbientContext(enclosingClass)) {
                      return;
                  }
                  if (ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
                      var isDeclaration_2 = node.kind !== 65;
                      if (isDeclaration_2) {
                          error(node, ts.Diagnostics.Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference);
                      }
                      else {
                          error(node, ts.Diagnostics.Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference);
                      }
                  }
              }
              function checkCollisionWithRequireExportsInGeneratedCode(node, name) {
                  if (!needCollisionCheckForIdentifier(node, name, "require") && !needCollisionCheckForIdentifier(node, name, "exports")) {
                      return;
                  }
                  if (node.kind === 206 && ts.getModuleInstanceState(node) !== 1) {
                      return;
                  }
                  var parent = getDeclarationContainer(node);
                  if (parent.kind === 228 && ts.isExternalModule(parent)) {
                      error(name, ts.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module, ts.declarationNameToString(name), ts.declarationNameToString(name));
                  }
              }
              function checkVarDeclaredNamesNotShadowed(node) {
                  // - ScriptBody : StatementList
                  // It is a Syntax Error if any element of the LexicallyDeclaredNames of StatementList
                  // also occurs in the VarDeclaredNames of StatementList.
                  if ((ts.getCombinedNodeFlags(node) & 12288) !== 0 || ts.isParameterDeclaration(node)) {
                      return;
                  }
                  if (node.kind === 199 && !node.initializer) {
                      return;
                  }
                  var symbol = getSymbolOfNode(node);
                  if (symbol.flags & 1) {
                      var localDeclarationSymbol = resolveName(node, node.name.text, 3, undefined, undefined);
                      if (localDeclarationSymbol &&
                          localDeclarationSymbol !== symbol &&
                          localDeclarationSymbol.flags & 2) {
                          if (getDeclarationFlagsFromSymbol(localDeclarationSymbol) & 12288) {
                              var varDeclList = ts.getAncestor(localDeclarationSymbol.valueDeclaration, 200);
                              var container = varDeclList.parent.kind === 181 && varDeclList.parent.parent
                                  ? varDeclList.parent.parent
                                  : undefined;
                              var namesShareScope = container &&
                                  (container.kind === 180 && ts.isFunctionLike(container.parent) ||
                                      container.kind === 207 ||
                                      container.kind === 206 ||
                                      container.kind === 228);
                              if (!namesShareScope) {
                                  var name_9 = symbolToString(localDeclarationSymbol);
                                  error(node, ts.Diagnostics.Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1, name_9, name_9);
                              }
                          }
                      }
                  }
              }
              function checkParameterInitializer(node) {
                  if (ts.getRootDeclaration(node).kind !== 130) {
                      return;
                  }
                  var func = ts.getContainingFunction(node);
                  visit(node.initializer);
                  function visit(n) {
                      if (n.kind === 65) {
                          var referencedSymbol = getNodeLinks(n).resolvedSymbol;
                          if (referencedSymbol && referencedSymbol !== unknownSymbol && getSymbol(func.locals, referencedSymbol.name, 107455) === referencedSymbol) {
                              if (referencedSymbol.valueDeclaration.kind === 130) {
                                  if (referencedSymbol.valueDeclaration === node) {
                                      error(n, ts.Diagnostics.Parameter_0_cannot_be_referenced_in_its_initializer, ts.declarationNameToString(node.name));
                                      return;
                                  }
                                  if (referencedSymbol.valueDeclaration.pos < node.pos) {
                                      return;
                                  }
                              }
                              error(n, ts.Diagnostics.Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it, ts.declarationNameToString(node.name), ts.declarationNameToString(n));
                          }
                      }
                      else {
                          ts.forEachChild(n, visit);
                      }
                  }
              }
              function checkVariableLikeDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  checkDecorators(node);
                  checkSourceElement(node.type);
                  if (node.name.kind === 128) {
                      checkComputedPropertyName(node.name);
                      if (node.initializer) {
                          checkExpressionCached(node.initializer);
                      }
                  }
                  if (ts.isBindingPattern(node.name)) {
                      ts.forEach(node.name.elements, checkSourceElement);
                  }
                  if (node.initializer && ts.getRootDeclaration(node).kind === 130 && ts.nodeIsMissing(ts.getContainingFunction(node).body)) {
                      error(node, ts.Diagnostics.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation);
                      return;
                  }
                  if (ts.isBindingPattern(node.name)) {
                      if (node.initializer) {
                          checkTypeAssignableTo(checkExpressionCached(node.initializer), getWidenedTypeForVariableLikeDeclaration(node), node, undefined);
                          checkParameterInitializer(node);
                      }
                      return;
                  }
                  var symbol = getSymbolOfNode(node);
                  var type = getTypeOfVariableOrParameterOrProperty(symbol);
                  if (node === symbol.valueDeclaration) {
                      if (node.initializer) {
                          checkTypeAssignableTo(checkExpressionCached(node.initializer), type, node, undefined);
                          checkParameterInitializer(node);
                      }
                  }
                  else {
                      var declarationType = getWidenedTypeForVariableLikeDeclaration(node);
                      if (type !== unknownType && declarationType !== unknownType && !isTypeIdenticalTo(type, declarationType)) {
                          error(node.name, ts.Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2, ts.declarationNameToString(node.name), typeToString(type), typeToString(declarationType));
                      }
                      if (node.initializer) {
                          checkTypeAssignableTo(checkExpressionCached(node.initializer), declarationType, node, undefined);
                      }
                  }
                  if (node.kind !== 133 && node.kind !== 132) {
                      checkExportsOnMergedDeclarations(node);
                      if (node.kind === 199 || node.kind === 153) {
                          checkVarDeclaredNamesNotShadowed(node);
                      }
                      checkCollisionWithCapturedSuperVariable(node, node.name);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  }
              }
              function checkVariableDeclaration(node) {
                  checkGrammarVariableDeclaration(node);
                  return checkVariableLikeDeclaration(node);
              }
              function checkBindingElement(node) {
                  checkGrammarBindingElement(node);
                  return checkVariableLikeDeclaration(node);
              }
              function checkVariableStatement(node) {
                  checkGrammarDecorators(node) || checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) || checkGrammarModifiers(node) || checkGrammarVariableDeclarationList(node.declarationList) || checkGrammarForDisallowedLetOrConstStatement(node);
                  ts.forEach(node.declarationList.declarations, checkSourceElement);
              }
              function checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) {
                  if (node.modifiers) {
                      if (inBlockOrObjectLiteralExpression(node)) {
                          return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
                      }
                  }
              }
              function inBlockOrObjectLiteralExpression(node) {
                  while (node) {
                      if (node.kind === 180 || node.kind === 155) {
                          return true;
                      }
                      node = node.parent;
                  }
              }
              function checkExpressionStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkExpression(node.expression);
              }
              function checkIfStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkExpression(node.expression);
                  checkSourceElement(node.thenStatement);
                  checkSourceElement(node.elseStatement);
              }
              function checkDoStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkSourceElement(node.statement);
                  checkExpression(node.expression);
              }
              function checkWhileStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkExpression(node.expression);
                  checkSourceElement(node.statement);
              }
              function checkForStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      if (node.initializer && node.initializer.kind == 200) {
                          checkGrammarVariableDeclarationList(node.initializer);
                      }
                  }
                  if (node.initializer) {
                      if (node.initializer.kind === 200) {
                          ts.forEach(node.initializer.declarations, checkVariableDeclaration);
                      }
                      else {
                          checkExpression(node.initializer);
                      }
                  }
                  if (node.condition)
                      checkExpression(node.condition);
                  if (node.incrementor)
                      checkExpression(node.incrementor);
                  checkSourceElement(node.statement);
              }
              function checkForOfStatement(node) {
                  checkGrammarForInOrForOfStatement(node);
                  if (node.initializer.kind === 200) {
                      checkForInOrForOfVariableDeclaration(node);
                  }
                  else {
                      var varExpr = node.initializer;
                      var iteratedType = checkRightHandSideOfForOf(node.expression);
                      if (varExpr.kind === 154 || varExpr.kind === 155) {
                          checkDestructuringAssignment(varExpr, iteratedType || unknownType);
                      }
                      else {
                          var leftType = checkExpression(varExpr);
                          checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_of_statement, ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant);
                          if (iteratedType) {
                              checkTypeAssignableTo(iteratedType, leftType, varExpr, undefined);
                          }
                      }
                  }
                  checkSourceElement(node.statement);
              }
              function checkForInStatement(node) {
                  checkGrammarForInOrForOfStatement(node);
                  if (node.initializer.kind === 200) {
                      var variable = node.initializer.declarations[0];
                      if (variable && ts.isBindingPattern(variable.name)) {
                          error(variable.name, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
                      }
                      checkForInOrForOfVariableDeclaration(node);
                  }
                  else {
                      var varExpr = node.initializer;
                      var leftType = checkExpression(varExpr);
                      if (varExpr.kind === 154 || varExpr.kind === 155) {
                          error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
                      }
                      else if (!allConstituentTypesHaveKind(leftType, 1 | 258)) {
                          error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any);
                      }
                      else {
                          checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_in_statement, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_previously_defined_constant);
                      }
                  }
                  var rightType = checkExpression(node.expression);
                  if (!allConstituentTypesHaveKind(rightType, 1 | 48128 | 512)) {
                      error(node.expression, ts.Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter);
                  }
                  checkSourceElement(node.statement);
              }
              function checkForInOrForOfVariableDeclaration(iterationStatement) {
                  var variableDeclarationList = iterationStatement.initializer;
                  if (variableDeclarationList.declarations.length >= 1) {
                      var decl = variableDeclarationList.declarations[0];
                      checkVariableDeclaration(decl);
                  }
              }
              function checkRightHandSideOfForOf(rhsExpression) {
                  var expressionType = getTypeOfExpression(rhsExpression);
                  return checkIteratedTypeOrElementType(expressionType, rhsExpression, true);
              }
              function checkIteratedTypeOrElementType(inputType, errorNode, allowStringInput) {
                  if (inputType.flags & 1) {
                      return inputType;
                  }
                  if (languageVersion >= 2) {
                      return checkIteratedType(inputType, errorNode) || anyType;
                  }
                  if (allowStringInput) {
                      return checkElementTypeOfArrayOrString(inputType, errorNode);
                  }
                  if (isArrayLikeType(inputType)) {
                      var indexType = getIndexTypeOfType(inputType, 1);
                      if (indexType) {
                          return indexType;
                      }
                  }
                  error(errorNode, ts.Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType));
                  return unknownType;
              }
              function checkIteratedType(iterable, errorNode) {
                  ts.Debug.assert(languageVersion >= 2);
                  var iteratedType = getIteratedType(iterable, errorNode);
                  if (errorNode && iteratedType) {
                      checkTypeAssignableTo(iterable, createIterableType(iteratedType), errorNode);
                  }
                  return iteratedType;
                  function getIteratedType(iterable, errorNode) {
                      // We want to treat type as an iterable, and get the type it is an iterable of. The iterable
                      // must have the following structure (annotated with the names of the variables below):
                      //
                      // { // iterable
                      //     [Symbol.iterator]: { // iteratorFunction
                      //         (): { // iterator
                      //             next: { // iteratorNextFunction
                      //                 (): { // iteratorNextResult
                      //                     value: T // iteratorNextValue
                      //                 }
                      //             }
                      //         }
                      //     }
                      // }
                      //
                      // T is the type we are after. At every level that involves analyzing return types
                      // of signatures, we union the return types of all the signatures.
                      //
                      // Another thing to note is that at any step of this process, we could run into a dead end,
                      // meaning either the property is missing, or we run into the anyType. If either of these things
                      // happens, we return undefined to signal that we could not find the iterated type. If a property
                      // is missing, and the previous step did not result in 'any', then we also give an error if the
                      // caller requested it. Then the caller can decide what to do in the case where there is no iterated
                      // type. This is different from returning anyType, because that would signify that we have matched the
                      // whole pattern and that T (above) is 'any'.
                      if (allConstituentTypesHaveKind(iterable, 1)) {
                          return undefined;
                      }
                      if ((iterable.flags & 4096) && iterable.target === globalIterableType) {
                          return iterable.typeArguments[0];
                      }
                      var iteratorFunction = getTypeOfPropertyOfType(iterable, ts.getPropertyNameForKnownSymbolName("iterator"));
                      if (iteratorFunction && allConstituentTypesHaveKind(iteratorFunction, 1)) {
                          return undefined;
                      }
                      var iteratorFunctionSignatures = iteratorFunction ? getSignaturesOfType(iteratorFunction, 0) : emptyArray;
                      if (iteratorFunctionSignatures.length === 0) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator);
                          }
                          return undefined;
                      }
                      var iterator = getUnionType(ts.map(iteratorFunctionSignatures, getReturnTypeOfSignature));
                      if (allConstituentTypesHaveKind(iterator, 1)) {
                          return undefined;
                      }
                      var iteratorNextFunction = getTypeOfPropertyOfType(iterator, "next");
                      if (iteratorNextFunction && allConstituentTypesHaveKind(iteratorNextFunction, 1)) {
                          return undefined;
                      }
                      var iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, 0) : emptyArray;
                      if (iteratorNextFunctionSignatures.length === 0) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.An_iterator_must_have_a_next_method);
                          }
                          return undefined;
                      }
                      var iteratorNextResult = getUnionType(ts.map(iteratorNextFunctionSignatures, getReturnTypeOfSignature));
                      if (allConstituentTypesHaveKind(iteratorNextResult, 1)) {
                          return undefined;
                      }
                      var iteratorNextValue = getTypeOfPropertyOfType(iteratorNextResult, "value");
                      if (!iteratorNextValue) {
                          if (errorNode) {
                              error(errorNode, ts.Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property);
                          }
                          return undefined;
                      }
                      return iteratorNextValue;
                  }
              }
              function checkElementTypeOfArrayOrString(arrayOrStringType, errorNode) {
                  ts.Debug.assert(languageVersion < 2);
                  var arrayType = removeTypesFromUnionType(arrayOrStringType, 258, true, true);
                  var hasStringConstituent = arrayOrStringType !== arrayType;
                  var reportedError = false;
                  if (hasStringConstituent) {
                      if (languageVersion < 1) {
                          error(errorNode, ts.Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher);
                          reportedError = true;
                      }
                      if (arrayType === emptyObjectType) {
                          return stringType;
                      }
                  }
                  if (!isArrayLikeType(arrayType)) {
                      if (!reportedError) {
                          var diagnostic = hasStringConstituent
                              ? ts.Diagnostics.Type_0_is_not_an_array_type
                              : ts.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type;
                          error(errorNode, diagnostic, typeToString(arrayType));
                      }
                      return hasStringConstituent ? stringType : unknownType;
                  }
                  var arrayElementType = getIndexTypeOfType(arrayType, 1) || unknownType;
                  if (hasStringConstituent) {
                      if (arrayElementType.flags & 258) {
                          return stringType;
                      }
                      return getUnionType([arrayElementType, stringType]);
                  }
                  return arrayElementType;
              }
              function checkBreakOrContinueStatement(node) {
                  checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node);
              }
              function isGetAccessorWithAnnotatatedSetAccessor(node) {
                  return !!(node.kind === 137 && getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 138)));
              }
              function checkReturnStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      var functionBlock = ts.getContainingFunction(node);
                      if (!functionBlock) {
                          grammarErrorOnFirstToken(node, ts.Diagnostics.A_return_statement_can_only_be_used_within_a_function_body);
                      }
                  }
                  if (node.expression) {
                      var func = ts.getContainingFunction(node);
                      if (func) {
                          var returnType = getReturnTypeOfSignature(getSignatureFromDeclaration(func));
                          var exprType = checkExpressionCached(node.expression);
                          if (func.kind === 138) {
                              error(node.expression, ts.Diagnostics.Setters_cannot_return_a_value);
                          }
                          else {
                              if (func.kind === 136) {
                                  if (!isTypeAssignableTo(exprType, returnType)) {
                                      error(node.expression, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class);
                                  }
                              }
                              else if (func.type || isGetAccessorWithAnnotatatedSetAccessor(func)) {
                                  checkTypeAssignableTo(exprType, returnType, node.expression, undefined);
                              }
                          }
                      }
                  }
              }
              function checkWithStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      if (node.parserContextFlags & 1) {
                          grammarErrorOnFirstToken(node, ts.Diagnostics.with_statements_are_not_allowed_in_strict_mode);
                      }
                  }
                  checkExpression(node.expression);
                  error(node.expression, ts.Diagnostics.All_symbols_within_a_with_block_will_be_resolved_to_any);
              }
              function checkSwitchStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  var firstDefaultClause;
                  var hasDuplicateDefaultClause = false;
                  var expressionType = checkExpression(node.expression);
                  ts.forEach(node.caseBlock.clauses, function (clause) {
                      if (clause.kind === 222 && !hasDuplicateDefaultClause) {
                          if (firstDefaultClause === undefined) {
                              firstDefaultClause = clause;
                          }
                          else {
                              var sourceFile = ts.getSourceFileOfNode(node);
                              var start = ts.skipTrivia(sourceFile.text, clause.pos);
                              var end = clause.statements.length > 0 ? clause.statements[0].pos : clause.end;
                              grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement);
                              hasDuplicateDefaultClause = true;
                          }
                      }
                      if (produceDiagnostics && clause.kind === 221) {
                          var caseClause = clause;
                          var caseType = checkExpression(caseClause.expression);
                          if (!isTypeAssignableTo(expressionType, caseType)) {
                              checkTypeAssignableTo(caseType, expressionType, caseClause.expression, undefined);
                          }
                      }
                      ts.forEach(clause.statements, checkSourceElement);
                  });
              }
              function checkLabeledStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      var current = node.parent;
                      while (current) {
                          if (ts.isFunctionLike(current)) {
                              break;
                          }
                          if (current.kind === 195 && current.label.text === node.label.text) {
                              var sourceFile = ts.getSourceFileOfNode(node);
                              grammarErrorOnNode(node.label, ts.Diagnostics.Duplicate_label_0, ts.getTextOfNodeFromSourceText(sourceFile.text, node.label));
                              break;
                          }
                          current = current.parent;
                      }
                  }
                  checkSourceElement(node.statement);
              }
              function checkThrowStatement(node) {
                  if (!checkGrammarStatementInAmbientContext(node)) {
                      if (node.expression === undefined) {
                          grammarErrorAfterFirstToken(node, ts.Diagnostics.Line_break_not_permitted_here);
                      }
                  }
                  if (node.expression) {
                      checkExpression(node.expression);
                  }
              }
              function checkTryStatement(node) {
                  checkGrammarStatementInAmbientContext(node);
                  checkBlock(node.tryBlock);
                  var catchClause = node.catchClause;
                  if (catchClause) {
                      if (catchClause.variableDeclaration) {
                          if (catchClause.variableDeclaration.name.kind !== 65) {
                              grammarErrorOnFirstToken(catchClause.variableDeclaration.name, ts.Diagnostics.Catch_clause_variable_name_must_be_an_identifier);
                          }
                          else if (catchClause.variableDeclaration.type) {
                              grammarErrorOnFirstToken(catchClause.variableDeclaration.type, ts.Diagnostics.Catch_clause_variable_cannot_have_a_type_annotation);
                          }
                          else if (catchClause.variableDeclaration.initializer) {
                              grammarErrorOnFirstToken(catchClause.variableDeclaration.initializer, ts.Diagnostics.Catch_clause_variable_cannot_have_an_initializer);
                          }
                          else {
                              var identifierName = catchClause.variableDeclaration.name.text;
                              var locals = catchClause.block.locals;
                              if (locals && ts.hasProperty(locals, identifierName)) {
                                  var localSymbol = locals[identifierName];
                                  if (localSymbol && (localSymbol.flags & 2) !== 0) {
                                      grammarErrorOnNode(localSymbol.valueDeclaration, ts.Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause, identifierName);
                                  }
                              }
                              checkGrammarEvalOrArgumentsInStrictMode(node, catchClause.variableDeclaration.name);
                          }
                      }
                      checkBlock(catchClause.block);
                  }
                  if (node.finallyBlock) {
                      checkBlock(node.finallyBlock);
                  }
              }
              function checkIndexConstraints(type) {
                  var declaredNumberIndexer = getIndexDeclarationOfSymbol(type.symbol, 1);
                  var declaredStringIndexer = getIndexDeclarationOfSymbol(type.symbol, 0);
                  var stringIndexType = getIndexTypeOfType(type, 0);
                  var numberIndexType = getIndexTypeOfType(type, 1);
                  if (stringIndexType || numberIndexType) {
                      ts.forEach(getPropertiesOfObjectType(type), function (prop) {
                          var propType = getTypeOfSymbol(prop);
                          checkIndexConstraintForProperty(prop, propType, type, declaredStringIndexer, stringIndexType, 0);
                          checkIndexConstraintForProperty(prop, propType, type, declaredNumberIndexer, numberIndexType, 1);
                      });
                      if (type.flags & 1024 && type.symbol.valueDeclaration.kind === 202) {
                          var classDeclaration = type.symbol.valueDeclaration;
                          for (var _i = 0, _a = classDeclaration.members; _i < _a.length; _i++) {
                              var member = _a[_i];
                              if (!(member.flags & 128) && ts.hasDynamicName(member)) {
                                  var propType = getTypeOfSymbol(member.symbol);
                                  checkIndexConstraintForProperty(member.symbol, propType, type, declaredStringIndexer, stringIndexType, 0);
                                  checkIndexConstraintForProperty(member.symbol, propType, type, declaredNumberIndexer, numberIndexType, 1);
                              }
                          }
                      }
                  }
                  var errorNode;
                  if (stringIndexType && numberIndexType) {
                      errorNode = declaredNumberIndexer || declaredStringIndexer;
                      if (!errorNode && (type.flags & 2048)) {
                          var someBaseTypeHasBothIndexers = ts.forEach(getBaseTypes(type), function (base) { return getIndexTypeOfType(base, 0) && getIndexTypeOfType(base, 1); });
                          errorNode = someBaseTypeHasBothIndexers ? undefined : type.symbol.declarations[0];
                      }
                  }
                  if (errorNode && !isTypeAssignableTo(numberIndexType, stringIndexType)) {
                      error(errorNode, ts.Diagnostics.Numeric_index_type_0_is_not_assignable_to_string_index_type_1, typeToString(numberIndexType), typeToString(stringIndexType));
                  }
                  function checkIndexConstraintForProperty(prop, propertyType, containingType, indexDeclaration, indexType, indexKind) {
                      if (!indexType) {
                          return;
                      }
                      if (indexKind === 1 && !isNumericName(prop.valueDeclaration.name)) {
                          return;
                      }
                      var errorNode;
                      if (prop.valueDeclaration.name.kind === 128 || prop.parent === containingType.symbol) {
                          errorNode = prop.valueDeclaration;
                      }
                      else if (indexDeclaration) {
                          errorNode = indexDeclaration;
                      }
                      else if (containingType.flags & 2048) {
                          var someBaseClassHasBothPropertyAndIndexer = ts.forEach(getBaseTypes(containingType), function (base) { return getPropertyOfObjectType(base, prop.name) && getIndexTypeOfType(base, indexKind); });
                          errorNode = someBaseClassHasBothPropertyAndIndexer ? undefined : containingType.symbol.declarations[0];
                      }
                      if (errorNode && !isTypeAssignableTo(propertyType, indexType)) {
                          var errorMessage = indexKind === 0
                              ? ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_string_index_type_2
                              : ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2;
                          error(errorNode, errorMessage, symbolToString(prop), typeToString(propertyType), typeToString(indexType));
                      }
                  }
              }
              function checkTypeNameIsReserved(name, message) {
                  switch (name.text) {
                      case "any":
                      case "number":
                      case "boolean":
                      case "string":
                      case "symbol":
                      case "void":
                          error(name, message, name.text);
                  }
              }
              function checkTypeParameters(typeParameterDeclarations) {
                  if (typeParameterDeclarations) {
                      for (var i = 0, n = typeParameterDeclarations.length; i < n; i++) {
                          var node = typeParameterDeclarations[i];
                          checkTypeParameter(node);
                          if (produceDiagnostics) {
                              for (var j = 0; j < i; j++) {
                                  if (typeParameterDeclarations[j].symbol === node.symbol) {
                                      error(node.name, ts.Diagnostics.Duplicate_identifier_0, ts.declarationNameToString(node.name));
                                  }
                              }
                          }
                      }
                  }
              }
              function checkClassExpression(node) {
                  grammarErrorOnNode(node, ts.Diagnostics.class_expressions_are_not_currently_supported);
                  ts.forEach(node.members, checkSourceElement);
                  return unknownType;
              }
              function checkClassDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node);
                  if (node.parent.kind !== 207 && node.parent.kind !== 228) {
                      grammarErrorOnNode(node, ts.Diagnostics.class_declarations_are_only_supported_directly_inside_a_module_or_as_a_top_level_declaration);
                  }
                  if (!node.name && !(node.flags & 256)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name);
                  }
                  checkGrammarClassDeclarationHeritageClauses(node);
                  checkDecorators(node);
                  if (node.name) {
                      checkTypeNameIsReserved(node.name, ts.Diagnostics.Class_name_cannot_be_0);
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  }
                  checkTypeParameters(node.typeParameters);
                  checkExportsOnMergedDeclarations(node);
                  var symbol = getSymbolOfNode(node);
                  var type = getDeclaredTypeOfSymbol(symbol);
                  var staticType = getTypeOfSymbol(symbol);
                  var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                  if (baseTypeNode) {
                      if (!ts.isSupportedExpressionWithTypeArguments(baseTypeNode)) {
                          error(baseTypeNode.expression, ts.Diagnostics.Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses);
                      }
                      emitExtends = emitExtends || !ts.isInAmbientContext(node);
                      checkExpressionWithTypeArguments(baseTypeNode);
                  }
                  var baseTypes = getBaseTypes(type);
                  if (baseTypes.length) {
                      if (produceDiagnostics) {
                          var baseType = baseTypes[0];
                          checkTypeAssignableTo(type, baseType, node.name || node, ts.Diagnostics.Class_0_incorrectly_extends_base_class_1);
                          var staticBaseType = getTypeOfSymbol(baseType.symbol);
                          checkTypeAssignableTo(staticType, getTypeWithoutConstructors(staticBaseType), node.name || node, ts.Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1);
                          if (baseType.symbol !== resolveEntityName(baseTypeNode.expression, 107455)) {
                              error(baseTypeNode, ts.Diagnostics.Type_name_0_in_extends_clause_does_not_reference_constructor_function_for_0, typeToString(baseType));
                          }
                          checkKindsOfPropertyMemberOverrides(type, baseType);
                      }
                  }
                  if (baseTypes.length || (baseTypeNode && compilerOptions.separateCompilation)) {
                      checkExpressionOrQualifiedName(baseTypeNode.expression);
                  }
                  var implementedTypeNodes = ts.getClassImplementsHeritageClauseElements(node);
                  if (implementedTypeNodes) {
                      ts.forEach(implementedTypeNodes, function (typeRefNode) {
                          if (!ts.isSupportedExpressionWithTypeArguments(typeRefNode)) {
                              error(typeRefNode.expression, ts.Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments);
                          }
                          checkExpressionWithTypeArguments(typeRefNode);
                          if (produceDiagnostics) {
                              var t = getTypeFromTypeNode(typeRefNode);
                              if (t !== unknownType) {
                                  var declaredType = (t.flags & 4096) ? t.target : t;
                                  if (declaredType.flags & (1024 | 2048)) {
                                      checkTypeAssignableTo(type, t, node.name || node, ts.Diagnostics.Class_0_incorrectly_implements_interface_1);
                                  }
                                  else {
                                      error(typeRefNode, ts.Diagnostics.A_class_may_only_implement_another_class_or_interface);
                                  }
                              }
                          }
                      });
                  }
                  ts.forEach(node.members, checkSourceElement);
                  if (produceDiagnostics) {
                      checkIndexConstraints(type);
                      checkTypeForDuplicateIndexSignatures(node);
                  }
              }
              function getTargetSymbol(s) {
                  return s.flags & 16777216 ? getSymbolLinks(s).target : s;
              }
              function checkKindsOfPropertyMemberOverrides(type, baseType) {
                  // TypeScript 1.0 spec (April 2014): 8.2.3
                  // A derived class inherits all members from its base class it doesn't override.
                  // Inheritance means that a derived class implicitly contains all non - overridden members of the base class.
                  // Both public and private property members are inherited, but only public property members can be overridden.
                  // A property member in a derived class is said to override a property member in a base class
                  // when the derived class property member has the same name and kind(instance or static)
                  // as the base class property member.
                  // The type of an overriding property member must be assignable(section 3.8.4)
                  // to the type of the overridden property member, or otherwise a compile - time error occurs.
                  // Base class instance member functions can be overridden by derived class instance member functions,
                  // but not by other kinds of members.
                  // Base class instance member variables and accessors can be overridden by
                  // derived class instance member variables and accessors, but not by other kinds of members.
                  var baseProperties = getPropertiesOfObjectType(baseType);
                  for (var _i = 0; _i < baseProperties.length; _i++) {
                      var baseProperty = baseProperties[_i];
                      var base = getTargetSymbol(baseProperty);
                      if (base.flags & 134217728) {
                          continue;
                      }
                      var derived = getTargetSymbol(getPropertyOfObjectType(type, base.name));
                      if (derived) {
                          var baseDeclarationFlags = getDeclarationFlagsFromSymbol(base);
                          var derivedDeclarationFlags = getDeclarationFlagsFromSymbol(derived);
                          if ((baseDeclarationFlags & 32) || (derivedDeclarationFlags & 32)) {
                              continue;
                          }
                          if ((baseDeclarationFlags & 128) !== (derivedDeclarationFlags & 128)) {
                              continue;
                          }
                          if ((base.flags & derived.flags & 8192) || ((base.flags & 98308) && (derived.flags & 98308))) {
                              continue;
                          }
                          var errorMessage = void 0;
                          if (base.flags & 8192) {
                              if (derived.flags & 98304) {
                                  errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor;
                              }
                              else {
                                  ts.Debug.assert((derived.flags & 4) !== 0);
                                  errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property;
                              }
                          }
                          else if (base.flags & 4) {
                              ts.Debug.assert((derived.flags & 8192) !== 0);
                              errorMessage = ts.Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function;
                          }
                          else {
                              ts.Debug.assert((base.flags & 98304) !== 0);
                              ts.Debug.assert((derived.flags & 8192) !== 0);
                              errorMessage = ts.Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
                          }
                          error(derived.valueDeclaration.name, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
                      }
                  }
              }
              function isAccessor(kind) {
                  return kind === 137 || kind === 138;
              }
              function areTypeParametersIdentical(list1, list2) {
                  if (!list1 && !list2) {
                      return true;
                  }
                  if (!list1 || !list2 || list1.length !== list2.length) {
                      return false;
                  }
                  for (var i = 0, len = list1.length; i < len; i++) {
                      var tp1 = list1[i];
                      var tp2 = list2[i];
                      if (tp1.name.text !== tp2.name.text) {
                          return false;
                      }
                      if (!tp1.constraint && !tp2.constraint) {
                          continue;
                      }
                      if (!tp1.constraint || !tp2.constraint) {
                          return false;
                      }
                      if (!isTypeIdenticalTo(getTypeFromTypeNode(tp1.constraint), getTypeFromTypeNode(tp2.constraint))) {
                          return false;
                      }
                  }
                  return true;
              }
              function checkInheritedPropertiesAreIdentical(type, typeNode) {
                  var baseTypes = getBaseTypes(type);
                  if (baseTypes.length < 2) {
                      return true;
                  }
                  var seen = {};
                  ts.forEach(resolveDeclaredMembers(type).declaredProperties, function (p) { seen[p.name] = { prop: p, containingType: type }; });
                  var ok = true;
                  for (var _i = 0; _i < baseTypes.length; _i++) {
                      var base = baseTypes[_i];
                      var properties = getPropertiesOfObjectType(base);
                      for (var _a = 0; _a < properties.length; _a++) {
                          var prop = properties[_a];
                          if (!ts.hasProperty(seen, prop.name)) {
                              seen[prop.name] = { prop: prop, containingType: base };
                          }
                          else {
                              var existing = seen[prop.name];
                              var isInheritedProperty = existing.containingType !== type;
                              if (isInheritedProperty && !isPropertyIdenticalTo(existing.prop, prop)) {
                                  ok = false;
                                  var typeName1 = typeToString(existing.containingType);
                                  var typeName2 = typeToString(base);
                                  var errorInfo = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, symbolToString(prop), typeName1, typeName2);
                                  errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2);
                                  diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(typeNode, errorInfo));
                              }
                          }
                      }
                  }
                  return ok;
              }
              function checkInterfaceDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarInterfaceDeclaration(node);
                  checkTypeParameters(node.typeParameters);
                  if (produceDiagnostics) {
                      checkTypeNameIsReserved(node.name, ts.Diagnostics.Interface_name_cannot_be_0);
                      checkExportsOnMergedDeclarations(node);
                      var symbol = getSymbolOfNode(node);
                      var firstInterfaceDecl = ts.getDeclarationOfKind(symbol, 203);
                      if (symbol.declarations.length > 1) {
                          if (node !== firstInterfaceDecl && !areTypeParametersIdentical(firstInterfaceDecl.typeParameters, node.typeParameters)) {
                              error(node.name, ts.Diagnostics.All_declarations_of_an_interface_must_have_identical_type_parameters);
                          }
                      }
                      if (node === firstInterfaceDecl) {
                          var type = getDeclaredTypeOfSymbol(symbol);
                          if (checkInheritedPropertiesAreIdentical(type, node.name)) {
                              ts.forEach(getBaseTypes(type), function (baseType) {
                                  checkTypeAssignableTo(type, baseType, node.name, ts.Diagnostics.Interface_0_incorrectly_extends_interface_1);
                              });
                              checkIndexConstraints(type);
                          }
                      }
                  }
                  ts.forEach(ts.getInterfaceBaseTypeNodes(node), function (heritageElement) {
                      if (!ts.isSupportedExpressionWithTypeArguments(heritageElement)) {
                          error(heritageElement.expression, ts.Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments);
                      }
                      checkExpressionWithTypeArguments(heritageElement);
                  });
                  ts.forEach(node.members, checkSourceElement);
                  if (produceDiagnostics) {
                      checkTypeForDuplicateIndexSignatures(node);
                  }
              }
              function checkTypeAliasDeclaration(node) {
                  checkGrammarDecorators(node) || checkGrammarModifiers(node);
                  checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_alias_name_cannot_be_0);
                  checkSourceElement(node.type);
              }
              function computeEnumMemberValues(node) {
                  var nodeLinks = getNodeLinks(node);
                  if (!(nodeLinks.flags & 128)) {
                      var enumSymbol = getSymbolOfNode(node);
                      var enumType = getDeclaredTypeOfSymbol(enumSymbol);
                      var autoValue = 0;
                      var ambient = ts.isInAmbientContext(node);
                      var enumIsConst = ts.isConst(node);
                      ts.forEach(node.members, function (member) {
                          if (member.name.kind !== 128 && isNumericLiteralName(member.name.text)) {
                              error(member.name, ts.Diagnostics.An_enum_member_cannot_have_a_numeric_name);
                          }
                          var initializer = member.initializer;
                          if (initializer) {
                              autoValue = getConstantValueForEnumMemberInitializer(initializer);
                              if (autoValue === undefined) {
                                  if (enumIsConst) {
                                      error(initializer, ts.Diagnostics.In_const_enum_declarations_member_initializer_must_be_constant_expression);
                                  }
                                  else if (!ambient) {
                                      checkTypeAssignableTo(checkExpression(initializer), enumType, initializer, undefined);
                                  }
                              }
                              else if (enumIsConst) {
                                  if (isNaN(autoValue)) {
                                      error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN);
                                  }
                                  else if (!isFinite(autoValue)) {
                                      error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value);
                                  }
                              }
                          }
                          else if (ambient && !enumIsConst) {
                              autoValue = undefined;
                          }
                          if (autoValue !== undefined) {
                              getNodeLinks(member).enumMemberValue = autoValue++;
                          }
                      });
                      nodeLinks.flags |= 128;
                  }
                  function getConstantValueForEnumMemberInitializer(initializer) {
                      return evalConstant(initializer);
                      function evalConstant(e) {
                          switch (e.kind) {
                              case 168:
                                  var value = evalConstant(e.operand);
                                  if (value === undefined) {
                                      return undefined;
                                  }
                                  switch (e.operator) {
                                      case 33: return value;
                                      case 34: return -value;
                                      case 47: return ~value;
                                  }
                                  return undefined;
                              case 170:
                                  var left = evalConstant(e.left);
                                  if (left === undefined) {
                                      return undefined;
                                  }
                                  var right = evalConstant(e.right);
                                  if (right === undefined) {
                                      return undefined;
                                  }
                                  switch (e.operatorToken.kind) {
                                      case 44: return left | right;
                                      case 43: return left & right;
                                      case 41: return left >> right;
                                      case 42: return left >>> right;
                                      case 40: return left << right;
                                      case 45: return left ^ right;
                                      case 35: return left * right;
                                      case 36: return left / right;
                                      case 33: return left + right;
                                      case 34: return left - right;
                                      case 37: return left % right;
                                  }
                                  return undefined;
                              case 7:
                                  return +e.text;
                              case 162:
                                  return evalConstant(e.expression);
                              case 65:
                              case 157:
                              case 156:
                                  var member = initializer.parent;
                                  var currentType = getTypeOfSymbol(getSymbolOfNode(member.parent));
                                  var enumType;
                                  var propertyName;
                                  if (e.kind === 65) {
                                      enumType = currentType;
                                      propertyName = e.text;
                                  }
                                  else {
                                      var expression;
                                      if (e.kind === 157) {
                                          if (e.argumentExpression === undefined ||
                                              e.argumentExpression.kind !== 8) {
                                              return undefined;
                                          }
                                          expression = e.expression;
                                          propertyName = e.argumentExpression.text;
                                      }
                                      else {
                                          expression = e.expression;
                                          propertyName = e.name.text;
                                      }
                                      var current = expression;
                                      while (current) {
                                          if (current.kind === 65) {
                                              break;
                                          }
                                          else if (current.kind === 156) {
                                              current = current.expression;
                                          }
                                          else {
                                              return undefined;
                                          }
                                      }
                                      enumType = checkExpression(expression);
                                      if (!(enumType.symbol && (enumType.symbol.flags & 384))) {
                                          return undefined;
                                      }
                                  }
                                  if (propertyName === undefined) {
                                      return undefined;
                                  }
                                  var property = getPropertyOfObjectType(enumType, propertyName);
                                  if (!property || !(property.flags & 8)) {
                                      return undefined;
                                  }
                                  var propertyDecl = property.valueDeclaration;
                                  if (member === propertyDecl) {
                                      return undefined;
                                  }
                                  if (!isDefinedBefore(propertyDecl, member)) {
                                      return undefined;
                                  }
                                  return getNodeLinks(propertyDecl).enumMemberValue;
                          }
                      }
                  }
              }
              function checkEnumDeclaration(node) {
                  if (!produceDiagnostics) {
                      return;
                  }
                  checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarEnumDeclaration(node);
                  checkTypeNameIsReserved(node.name, ts.Diagnostics.Enum_name_cannot_be_0);
                  checkCollisionWithCapturedThisVariable(node, node.name);
                  checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  checkExportsOnMergedDeclarations(node);
                  computeEnumMemberValues(node);
                  var enumIsConst = ts.isConst(node);
                  if (compilerOptions.separateCompilation && enumIsConst && ts.isInAmbientContext(node)) {
                      error(node.name, ts.Diagnostics.Ambient_const_enums_are_not_allowed_when_the_separateCompilation_flag_is_provided);
                  }
                  var enumSymbol = getSymbolOfNode(node);
                  var firstDeclaration = ts.getDeclarationOfKind(enumSymbol, node.kind);
                  if (node === firstDeclaration) {
                      if (enumSymbol.declarations.length > 1) {
                          ts.forEach(enumSymbol.declarations, function (decl) {
                              if (ts.isConstEnumDeclaration(decl) !== enumIsConst) {
                                  error(decl.name, ts.Diagnostics.Enum_declarations_must_all_be_const_or_non_const);
                              }
                          });
                      }
                      var seenEnumMissingInitialInitializer = false;
                      ts.forEach(enumSymbol.declarations, function (declaration) {
                          if (declaration.kind !== 205) {
                              return false;
                          }
                          var enumDeclaration = declaration;
                          if (!enumDeclaration.members.length) {
                              return false;
                          }
                          var firstEnumMember = enumDeclaration.members[0];
                          if (!firstEnumMember.initializer) {
                              if (seenEnumMissingInitialInitializer) {
                                  error(firstEnumMember.name, ts.Diagnostics.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element);
                              }
                              else {
                                  seenEnumMissingInitialInitializer = true;
                              }
                          }
                      });
                  }
              }
              function getFirstNonAmbientClassOrFunctionDeclaration(symbol) {
                  var declarations = symbol.declarations;
                  for (var _i = 0; _i < declarations.length; _i++) {
                      var declaration = declarations[_i];
                      if ((declaration.kind === 202 ||
                          (declaration.kind === 201 && ts.nodeIsPresent(declaration.body))) &&
                          !ts.isInAmbientContext(declaration)) {
                          return declaration;
                      }
                  }
                  return undefined;
              }
              function inSameLexicalScope(node1, node2) {
                  var container1 = ts.getEnclosingBlockScopeContainer(node1);
                  var container2 = ts.getEnclosingBlockScopeContainer(node2);
                  if (isGlobalSourceFile(container1)) {
                      return isGlobalSourceFile(container2);
                  }
                  else if (isGlobalSourceFile(container2)) {
                      return false;
                  }
                  else {
                      return container1 === container2;
                  }
              }
              function checkModuleDeclaration(node) {
                  if (produceDiagnostics) {
                      if (!checkGrammarDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node)) {
                          if (!ts.isInAmbientContext(node) && node.name.kind === 8) {
                              grammarErrorOnNode(node.name, ts.Diagnostics.Only_ambient_modules_can_use_quoted_names);
                          }
                      }
                      checkCollisionWithCapturedThisVariable(node, node.name);
                      checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                      checkExportsOnMergedDeclarations(node);
                      var symbol = getSymbolOfNode(node);
                      if (symbol.flags & 512
                          && symbol.declarations.length > 1
                          && !ts.isInAmbientContext(node)
                          && ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.separateCompilation)) {
                          var firstNonAmbientClassOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol);
                          if (firstNonAmbientClassOrFunc) {
                              if (ts.getSourceFileOfNode(node) !== ts.getSourceFileOfNode(firstNonAmbientClassOrFunc)) {
                                  error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged);
                              }
                              else if (node.pos < firstNonAmbientClassOrFunc.pos) {
                                  error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged);
                              }
                          }
                          var mergedClass = ts.getDeclarationOfKind(symbol, 202);
                          if (mergedClass &&
                              inSameLexicalScope(node, mergedClass)) {
                              getNodeLinks(node).flags |= 2048;
                          }
                      }
                      if (node.name.kind === 8) {
                          if (!isGlobalSourceFile(node.parent)) {
                              error(node.name, ts.Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules);
                          }
                          if (isExternalModuleNameRelative(node.name.text)) {
                              error(node.name, ts.Diagnostics.Ambient_module_declaration_cannot_specify_relative_module_name);
                          }
                      }
                  }
                  checkSourceElement(node.body);
              }
              function getFirstIdentifier(node) {
                  while (true) {
                      if (node.kind === 127) {
                          node = node.left;
                      }
                      else if (node.kind === 156) {
                          node = node.expression;
                      }
                      else {
                          break;
                      }
                  }
                  ts.Debug.assert(node.kind === 65);
                  return node;
              }
              function checkExternalImportOrExportDeclaration(node) {
                  var moduleName = ts.getExternalModuleName(node);
                  if (!ts.nodeIsMissing(moduleName) && moduleName.kind !== 8) {
                      error(moduleName, ts.Diagnostics.String_literal_expected);
                      return false;
                  }
                  var inAmbientExternalModule = node.parent.kind === 207 && node.parent.parent.name.kind === 8;
                  if (node.parent.kind !== 228 && !inAmbientExternalModule) {
                      error(moduleName, node.kind === 216 ?
                          ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace :
                          ts.Diagnostics.Import_declarations_in_a_namespace_cannot_reference_a_module);
                      return false;
                  }
                  if (inAmbientExternalModule && isExternalModuleNameRelative(moduleName.text)) {
                      error(node, ts.Diagnostics.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name);
                      return false;
                  }
                  return true;
              }
              function checkAliasSymbol(node) {
                  var symbol = getSymbolOfNode(node);
                  var target = resolveAlias(symbol);
                  if (target !== unknownSymbol) {
                      var excludedMeanings = (symbol.flags & 107455 ? 107455 : 0) |
                          (symbol.flags & 793056 ? 793056 : 0) |
                          (symbol.flags & 1536 ? 1536 : 0);
                      if (target.flags & excludedMeanings) {
                          var message = node.kind === 218 ?
                              ts.Diagnostics.Export_declaration_conflicts_with_exported_declaration_of_0 :
                              ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0;
                          error(node, message, symbolToString(symbol));
                      }
                  }
              }
              function checkImportBinding(node) {
                  checkCollisionWithCapturedThisVariable(node, node.name);
                  checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
                  checkAliasSymbol(node);
              }
              function checkImportDeclaration(node) {
                  if (!checkGrammarImportDeclarationNameInStrictMode(node) && !checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.An_import_declaration_cannot_have_modifiers);
                  }
                  if (checkExternalImportOrExportDeclaration(node)) {
                      var importClause = node.importClause;
                      if (importClause) {
                          if (importClause.name) {
                              checkImportBinding(importClause);
                          }
                          if (importClause.namedBindings) {
                              if (importClause.namedBindings.kind === 212) {
                                  checkImportBinding(importClause.namedBindings);
                              }
                              else {
                                  ts.forEach(importClause.namedBindings.elements, checkImportBinding);
                              }
                          }
                      }
                  }
              }
              function checkImportEqualsDeclaration(node) {
                  checkGrammarDeclarationNameInStrictMode(node) || checkGrammarDecorators(node) || checkGrammarModifiers(node);
                  if (ts.isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
                      checkImportBinding(node);
                      if (node.flags & 1) {
                          markExportAsReferenced(node);
                      }
                      if (ts.isInternalModuleImportEqualsDeclaration(node)) {
                          var target = resolveAlias(getSymbolOfNode(node));
                          if (target !== unknownSymbol) {
                              if (target.flags & 107455) {
                                  var moduleName = getFirstIdentifier(node.moduleReference);
                                  if (!(resolveEntityName(moduleName, 107455 | 1536).flags & 1536)) {
                                      error(moduleName, ts.Diagnostics.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, ts.declarationNameToString(moduleName));
                                  }
                              }
                              if (target.flags & 793056) {
                                  checkTypeNameIsReserved(node.name, ts.Diagnostics.Import_name_cannot_be_0);
                              }
                          }
                      }
                      else {
                          if (languageVersion >= 2) {
                              grammarErrorOnNode(node, ts.Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_or_import_d_from_mod_instead);
                          }
                      }
                  }
              }
              function checkExportDeclaration(node) {
                  if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_declaration_cannot_have_modifiers);
                  }
                  if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
                      if (node.exportClause) {
                          ts.forEach(node.exportClause.elements, checkExportSpecifier);
                          var inAmbientExternalModule = node.parent.kind === 207 && node.parent.parent.name.kind === 8;
                          if (node.parent.kind !== 228 && !inAmbientExternalModule) {
                              error(node, ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace);
                          }
                      }
                      else {
                          var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
                          if (moduleSymbol && moduleSymbol.exports["export="]) {
                              error(node.moduleSpecifier, ts.Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
                          }
                      }
                  }
              }
              function checkExportSpecifier(node) {
                  checkAliasSymbol(node);
                  if (!node.parent.parent.moduleSpecifier) {
                      markExportAsReferenced(node);
                  }
              }
              function checkExportAssignment(node) {
                  var container = node.parent.kind === 228 ? node.parent : node.parent.parent;
                  if (container.kind === 206 && container.name.kind === 65) {
                      error(node, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_namespace);
                      return;
                  }
                  if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 499)) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_assignment_cannot_have_modifiers);
                  }
                  if (node.expression.kind === 65) {
                      markExportAsReferenced(node);
                  }
                  else {
                      checkExpressionCached(node.expression);
                  }
                  checkExternalModuleExports(container);
                  if (node.isExportEquals && !ts.isInAmbientContext(node)) {
                      if (languageVersion >= 2) {
                          grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_6_or_higher_Consider_using_export_default_instead);
                      }
                      else if (compilerOptions.module === 4) {
                          grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
                      }
                  }
              }
              function getModuleStatements(node) {
                  if (node.kind === 228) {
                      return node.statements;
                  }
                  if (node.kind === 206 && node.body.kind === 207) {
                      return node.body.statements;
                  }
                  return emptyArray;
              }
              function hasExportedMembers(moduleSymbol) {
                  for (var id in moduleSymbol.exports) {
                      if (id !== "export=") {
                          return true;
                      }
                  }
                  return false;
              }
              function checkExternalModuleExports(node) {
                  var moduleSymbol = getSymbolOfNode(node);
                  var links = getSymbolLinks(moduleSymbol);
                  if (!links.exportsChecked) {
                      var exportEqualsSymbol = moduleSymbol.exports["export="];
                      if (exportEqualsSymbol && hasExportedMembers(moduleSymbol)) {
                          var declaration = getDeclarationOfAliasSymbol(exportEqualsSymbol) || exportEqualsSymbol.valueDeclaration;
                          error(declaration, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements);
                      }
                      links.exportsChecked = true;
                  }
              }
              function checkSourceElement(node) {
                  if (!node)
                      return;
                  switch (node.kind) {
                      case 129:
                          return checkTypeParameter(node);
                      case 130:
                          return checkParameter(node);
                      case 133:
                      case 132:
                          return checkPropertyDeclaration(node);
                      case 143:
                      case 144:
                      case 139:
                      case 140:
                          return checkSignatureDeclaration(node);
                      case 141:
                          return checkSignatureDeclaration(node);
                      case 135:
                      case 134:
                          return checkMethodDeclaration(node);
                      case 136:
                          return checkConstructorDeclaration(node);
                      case 137:
                      case 138:
                          return checkAccessorDeclaration(node);
                      case 142:
                          return checkTypeReferenceNode(node);
                      case 145:
                          return checkTypeQuery(node);
                      case 146:
                          return checkTypeLiteral(node);
                      case 147:
                          return checkArrayType(node);
                      case 148:
                          return checkTupleType(node);
                      case 149:
                          return checkUnionType(node);
                      case 150:
                          return checkSourceElement(node.type);
                      case 201:
                          return checkFunctionDeclaration(node);
                      case 180:
                      case 207:
                          return checkBlock(node);
                      case 181:
                          return checkVariableStatement(node);
                      case 183:
                          return checkExpressionStatement(node);
                      case 184:
                          return checkIfStatement(node);
                      case 185:
                          return checkDoStatement(node);
                      case 186:
                          return checkWhileStatement(node);
                      case 187:
                          return checkForStatement(node);
                      case 188:
                          return checkForInStatement(node);
                      case 189:
                          return checkForOfStatement(node);
                      case 190:
                      case 191:
                          return checkBreakOrContinueStatement(node);
                      case 192:
                          return checkReturnStatement(node);
                      case 193:
                          return checkWithStatement(node);
                      case 194:
                          return checkSwitchStatement(node);
                      case 195:
                          return checkLabeledStatement(node);
                      case 196:
                          return checkThrowStatement(node);
                      case 197:
                          return checkTryStatement(node);
                      case 199:
                          return checkVariableDeclaration(node);
                      case 153:
                          return checkBindingElement(node);
                      case 202:
                          return checkClassDeclaration(node);
                      case 203:
                          return checkInterfaceDeclaration(node);
                      case 204:
                          return checkTypeAliasDeclaration(node);
                      case 205:
                          return checkEnumDeclaration(node);
                      case 206:
                          return checkModuleDeclaration(node);
                      case 210:
                          return checkImportDeclaration(node);
                      case 209:
                          return checkImportEqualsDeclaration(node);
                      case 216:
                          return checkExportDeclaration(node);
                      case 215:
                          return checkExportAssignment(node);
                      case 182:
                          checkGrammarStatementInAmbientContext(node);
                          return;
                      case 198:
                          checkGrammarStatementInAmbientContext(node);
                          return;
                      case 219:
                          return checkMissingDeclaration(node);
                  }
              }
              function checkFunctionExpressionBodies(node) {
                  switch (node.kind) {
                      case 163:
                      case 164:
                          ts.forEach(node.parameters, checkFunctionExpressionBodies);
                          checkFunctionExpressionOrObjectLiteralMethodBody(node);
                          break;
                      case 135:
                      case 134:
                          ts.forEach(node.parameters, checkFunctionExpressionBodies);
                          if (ts.isObjectLiteralMethod(node)) {
                              checkFunctionExpressionOrObjectLiteralMethodBody(node);
                          }
                          break;
                      case 136:
                      case 137:
                      case 138:
                      case 201:
                          ts.forEach(node.parameters, checkFunctionExpressionBodies);
                          break;
                      case 193:
                          checkFunctionExpressionBodies(node.expression);
                          break;
                      case 130:
                      case 133:
                      case 132:
                      case 151:
                      case 152:
                      case 153:
                      case 154:
                      case 155:
                      case 225:
                      case 156:
                      case 157:
                      case 158:
                      case 159:
                      case 160:
                      case 172:
                      case 178:
                      case 161:
                      case 162:
                      case 166:
                      case 167:
                      case 165:
                      case 168:
                      case 169:
                      case 170:
                      case 171:
                      case 174:
                      case 180:
                      case 207:
                      case 181:
                      case 183:
                      case 184:
                      case 185:
                      case 186:
                      case 187:
                      case 188:
                      case 189:
                      case 190:
                      case 191:
                      case 192:
                      case 194:
                      case 208:
                      case 221:
                      case 222:
                      case 195:
                      case 196:
                      case 197:
                      case 224:
                      case 199:
                      case 200:
                      case 202:
                      case 205:
                      case 227:
                      case 215:
                      case 228:
                          ts.forEachChild(node, checkFunctionExpressionBodies);
                          break;
                  }
              }
              function checkSourceFile(node) {
                  var start = new Date().getTime();
                  checkSourceFileWorker(node);
                  ts.checkTime += new Date().getTime() - start;
              }
              function checkSourceFileWorker(node) {
                  var links = getNodeLinks(node);
                  if (!(links.flags & 1)) {
                      checkGrammarSourceFile(node);
                      emitExtends = false;
                      emitDecorate = false;
                      emitParam = false;
                      potentialThisCollisions.length = 0;
                      ts.forEach(node.statements, checkSourceElement);
                      checkFunctionExpressionBodies(node);
                      if (ts.isExternalModule(node)) {
                          checkExternalModuleExports(node);
                      }
                      if (potentialThisCollisions.length) {
                          ts.forEach(potentialThisCollisions, checkIfThisIsCapturedInEnclosingScope);
                          potentialThisCollisions.length = 0;
                      }
                      if (emitExtends) {
                          links.flags |= 8;
                      }
                      if (emitDecorate) {
                          links.flags |= 512;
                      }
                      if (emitParam) {
                          links.flags |= 1024;
                      }
                      links.flags |= 1;
                  }
              }
              function getDiagnostics(sourceFile) {
                  throwIfNonDiagnosticsProducing();
                  if (sourceFile) {
                      checkSourceFile(sourceFile);
                      return diagnostics.getDiagnostics(sourceFile.fileName);
                  }
                  ts.forEach(host.getSourceFiles(), checkSourceFile);
                  return diagnostics.getDiagnostics();
              }
              function getGlobalDiagnostics() {
                  throwIfNonDiagnosticsProducing();
                  return diagnostics.getGlobalDiagnostics();
              }
              function throwIfNonDiagnosticsProducing() {
                  if (!produceDiagnostics) {
                      throw new Error("Trying to get diagnostics from a type checker that does not produce them.");
                  }
              }
              function isInsideWithStatementBody(node) {
                  if (node) {
                      while (node.parent) {
                          if (node.parent.kind === 193 && node.parent.statement === node) {
                              return true;
                          }
                          node = node.parent;
                      }
                  }
                  return false;
              }
              function getSymbolsInScope(location, meaning) {
                  var symbols = {};
                  var memberFlags = 0;
                  if (isInsideWithStatementBody(location)) {
                      return [];
                  }
                  populateSymbols();
                  return symbolsToArray(symbols);
                  function populateSymbols() {
                      while (location) {
                          if (location.locals && !isGlobalSourceFile(location)) {
                              copySymbols(location.locals, meaning);
                          }
                          switch (location.kind) {
                              case 228:
                                  if (!ts.isExternalModule(location)) {
                                      break;
                                  }
                              case 206:
                                  copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
                                  break;
                              case 205:
                                  copySymbols(getSymbolOfNode(location).exports, meaning & 8);
                                  break;
                              case 202:
                              case 203:
                                  if (!(memberFlags & 128)) {
                                      copySymbols(getSymbolOfNode(location).members, meaning & 793056);
                                  }
                                  break;
                              case 163:
                                  if (location.name) {
                                      copySymbol(location.symbol, meaning);
                                  }
                                  break;
                          }
                          memberFlags = location.flags;
                          location = location.parent;
                      }
                      copySymbols(globals, meaning);
                  }
                  function copySymbol(symbol, meaning) {
                      if (symbol.flags & meaning) {
                          var id = symbol.name;
                          if (!isReservedMemberName(id) && !ts.hasProperty(symbols, id)) {
                              symbols[id] = symbol;
                          }
                      }
                  }
                  function copySymbols(source, meaning) {
                      if (meaning) {
                          for (var id in source) {
                              if (ts.hasProperty(source, id)) {
                                  copySymbol(source[id], meaning);
                              }
                          }
                      }
                  }
                  if (isInsideWithStatementBody(location)) {
                      return [];
                  }
                  while (location) {
                      if (location.locals && !isGlobalSourceFile(location)) {
                          copySymbols(location.locals, meaning);
                      }
                      switch (location.kind) {
                          case 228:
                              if (!ts.isExternalModule(location))
                                  break;
                          case 206:
                              copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
                              break;
                          case 205:
                              copySymbols(getSymbolOfNode(location).exports, meaning & 8);
                              break;
                          case 202:
                          case 203:
                              if (!(memberFlags & 128)) {
                                  copySymbols(getSymbolOfNode(location).members, meaning & 793056);
                              }
                              break;
                          case 163:
                              if (location.name) {
                                  copySymbol(location.symbol, meaning);
                              }
                              break;
                      }
                      memberFlags = location.flags;
                      location = location.parent;
                  }
                  copySymbols(globals, meaning);
                  return symbolsToArray(symbols);
              }
              function isTypeDeclarationName(name) {
                  return name.kind == 65 &&
                      isTypeDeclaration(name.parent) &&
                      name.parent.name === name;
              }
              function isTypeDeclaration(node) {
                  switch (node.kind) {
                      case 129:
                      case 202:
                      case 203:
                      case 204:
                      case 205:
                          return true;
                  }
              }
              function isTypeReferenceIdentifier(entityName) {
                  var node = entityName;
                  while (node.parent && node.parent.kind === 127) {
                      node = node.parent;
                  }
                  return node.parent && node.parent.kind === 142;
              }
              function isHeritageClauseElementIdentifier(entityName) {
                  var node = entityName;
                  while (node.parent && node.parent.kind === 156) {
                      node = node.parent;
                  }
                  return node.parent && node.parent.kind === 177;
              }
              function isTypeNode(node) {
                  if (142 <= node.kind && node.kind <= 150) {
                      return true;
                  }
                  switch (node.kind) {
                      case 112:
                      case 120:
                      case 122:
                      case 113:
                      case 123:
                          return true;
                      case 99:
                          return node.parent.kind !== 167;
                      case 8:
                          return node.parent.kind === 130;
                      case 177:
                          return true;
                      case 65:
                          if (node.parent.kind === 127 && node.parent.right === node) {
                              node = node.parent;
                          }
                          else if (node.parent.kind === 156 && node.parent.name === node) {
                              node = node.parent;
                          }
                      case 127:
                      case 156:
                          ts.Debug.assert(node.kind === 65 || node.kind === 127 || node.kind === 156, "'node' was expected to be a qualified name, identifier or property access in 'isTypeNode'.");
                          var parent_5 = node.parent;
                          if (parent_5.kind === 145) {
                              return false;
                          }
                          if (142 <= parent_5.kind && parent_5.kind <= 150) {
                              return true;
                          }
                          switch (parent_5.kind) {
                              case 177:
                                  return true;
                              case 129:
                                  return node === parent_5.constraint;
                              case 133:
                              case 132:
                              case 130:
                              case 199:
                                  return node === parent_5.type;
                              case 201:
                              case 163:
                              case 164:
                              case 136:
                              case 135:
                              case 134:
                              case 137:
                              case 138:
                                  return node === parent_5.type;
                              case 139:
                              case 140:
                              case 141:
                                  return node === parent_5.type;
                              case 161:
                                  return node === parent_5.type;
                              case 158:
                              case 159:
                                  return parent_5.typeArguments && ts.indexOf(parent_5.typeArguments, node) >= 0;
                              case 160:
                                  return false;
                          }
                  }
                  return false;
              }
              function getLeftSideOfImportEqualsOrExportAssignment(nodeOnRightSide) {
                  while (nodeOnRightSide.parent.kind === 127) {
                      nodeOnRightSide = nodeOnRightSide.parent;
                  }
                  if (nodeOnRightSide.parent.kind === 209) {
                      return nodeOnRightSide.parent.moduleReference === nodeOnRightSide && nodeOnRightSide.parent;
                  }
                  if (nodeOnRightSide.parent.kind === 215) {
                      return nodeOnRightSide.parent.expression === nodeOnRightSide && nodeOnRightSide.parent;
                  }
                  return undefined;
              }
              function isInRightSideOfImportOrExportAssignment(node) {
                  return getLeftSideOfImportEqualsOrExportAssignment(node) !== undefined;
              }
              function getSymbolOfEntityNameOrPropertyAccessExpression(entityName) {
                  if (ts.isDeclarationName(entityName)) {
                      return getSymbolOfNode(entityName.parent);
                  }
                  if (entityName.parent.kind === 215) {
                      return resolveEntityName(entityName, 107455 | 793056 | 1536 | 8388608);
                  }
                  if (entityName.kind !== 156) {
                      if (isInRightSideOfImportOrExportAssignment(entityName)) {
                          return getSymbolOfPartOfRightHandSideOfImportEquals(entityName);
                      }
                  }
                  if (ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
                      entityName = entityName.parent;
                  }
                  if (isHeritageClauseElementIdentifier(entityName)) {
                      var meaning = entityName.parent.kind === 177 ? 793056 : 1536;
                      meaning |= 8388608;
                      return resolveEntityName(entityName, meaning);
                  }
                  else if (ts.isExpression(entityName)) {
                      if (ts.nodeIsMissing(entityName)) {
                          return undefined;
                      }
                      if (entityName.kind === 65) {
                          var meaning = 107455 | 8388608;
                          return resolveEntityName(entityName, meaning);
                      }
                      else if (entityName.kind === 156) {
                          var symbol = getNodeLinks(entityName).resolvedSymbol;
                          if (!symbol) {
                              checkPropertyAccessExpression(entityName);
                          }
                          return getNodeLinks(entityName).resolvedSymbol;
                      }
                      else if (entityName.kind === 127) {
                          var symbol = getNodeLinks(entityName).resolvedSymbol;
                          if (!symbol) {
                              checkQualifiedName(entityName);
                          }
                          return getNodeLinks(entityName).resolvedSymbol;
                      }
                  }
                  else if (isTypeReferenceIdentifier(entityName)) {
                      var meaning = entityName.parent.kind === 142 ? 793056 : 1536;
                      meaning |= 8388608;
                      return resolveEntityName(entityName, meaning);
                  }
                  return undefined;
              }
              function getSymbolInfo(node) {
                  if (isInsideWithStatementBody(node)) {
                      return undefined;
                  }
                  if (ts.isDeclarationName(node)) {
                      return getSymbolOfNode(node.parent);
                  }
                  if (node.kind === 65 && isInRightSideOfImportOrExportAssignment(node)) {
                      return node.parent.kind === 215
                          ? getSymbolOfEntityNameOrPropertyAccessExpression(node)
                          : getSymbolOfPartOfRightHandSideOfImportEquals(node);
                  }
                  switch (node.kind) {
                      case 65:
                      case 156:
                      case 127:
                          return getSymbolOfEntityNameOrPropertyAccessExpression(node);
                      case 93:
                      case 91:
                          var type = checkExpression(node);
                          return type.symbol;
                      case 114:
                          var constructorDeclaration = node.parent;
                          if (constructorDeclaration && constructorDeclaration.kind === 136) {
                              return constructorDeclaration.parent.symbol;
                          }
                          return undefined;
                      case 8:
                          var moduleName;
                          if ((ts.isExternalModuleImportEqualsDeclaration(node.parent.parent) &&
                              ts.getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) ||
                              ((node.parent.kind === 210 || node.parent.kind === 216) &&
                                  node.parent.moduleSpecifier === node)) {
                              return resolveExternalModuleName(node, node);
                          }
                      case 7:
                          if (node.parent.kind == 157 && node.parent.argumentExpression === node) {
                              var objectType = checkExpression(node.parent.expression);
                              if (objectType === unknownType)
                                  return undefined;
                              var apparentType = getApparentType(objectType);
                              if (apparentType === unknownType)
                                  return undefined;
                              return getPropertyOfType(apparentType, node.text);
                          }
                          break;
                  }
                  return undefined;
              }
              function getShorthandAssignmentValueSymbol(location) {
                  if (location && location.kind === 226) {
                      return resolveEntityName(location.name, 107455);
                  }
                  return undefined;
              }
              function getTypeOfNode(node) {
                  if (isInsideWithStatementBody(node)) {
                      return unknownType;
                  }
                  if (isTypeNode(node)) {
                      return getTypeFromTypeNode(node);
                  }
                  if (ts.isExpression(node)) {
                      return getTypeOfExpression(node);
                  }
                  if (isTypeDeclaration(node)) {
                      var symbol = getSymbolOfNode(node);
                      return getDeclaredTypeOfSymbol(symbol);
                  }
                  if (isTypeDeclarationName(node)) {
                      var symbol = getSymbolInfo(node);
                      return symbol && getDeclaredTypeOfSymbol(symbol);
                  }
                  if (ts.isDeclaration(node)) {
                      var symbol = getSymbolOfNode(node);
                      return getTypeOfSymbol(symbol);
                  }
                  if (ts.isDeclarationName(node)) {
                      var symbol = getSymbolInfo(node);
                      return symbol && getTypeOfSymbol(symbol);
                  }
                  if (isInRightSideOfImportOrExportAssignment(node)) {
                      var symbol = getSymbolInfo(node);
                      var declaredType = symbol && getDeclaredTypeOfSymbol(symbol);
                      return declaredType !== unknownType ? declaredType : getTypeOfSymbol(symbol);
                  }
                  return unknownType;
              }
              function getTypeOfExpression(expr) {
                  if (ts.isRightSideOfQualifiedNameOrPropertyAccess(expr)) {
                      expr = expr.parent;
                  }
                  return checkExpression(expr);
              }
              function getAugmentedPropertiesOfType(type) {
                  type = getApparentType(type);
                  var propsByName = createSymbolTable(getPropertiesOfType(type));
                  if (getSignaturesOfType(type, 0).length || getSignaturesOfType(type, 1).length) {
                      ts.forEach(getPropertiesOfType(globalFunctionType), function (p) {
                          if (!ts.hasProperty(propsByName, p.name)) {
                              propsByName[p.name] = p;
                          }
                      });
                  }
                  return getNamedMembers(propsByName);
              }
              function getRootSymbols(symbol) {
                  if (symbol.flags & 268435456) {
                      var symbols = [];
                      var name_10 = symbol.name;
                      ts.forEach(getSymbolLinks(symbol).unionType.types, function (t) {
                          symbols.push(getPropertyOfType(t, name_10));
                      });
                      return symbols;
                  }
                  else if (symbol.flags & 67108864) {
                      var target = getSymbolLinks(symbol).target;
                      if (target) {
                          return [target];
                      }
                  }
                  return [symbol];
              }
              function isExternalModuleSymbol(symbol) {
                  return symbol.flags & 512 && symbol.declarations.length === 1 && symbol.declarations[0].kind === 228;
              }
              function getAliasNameSubstitution(symbol, getGeneratedNameForNode) {
                  if (languageVersion >= 2) {
                      return undefined;
                  }
                  var node = getDeclarationOfAliasSymbol(symbol);
                  if (node) {
                      if (node.kind === 211) {
                          var defaultKeyword;
                          if (languageVersion === 0) {
                              defaultKeyword = "[\"default\"]";
                          }
                          else {
                              defaultKeyword = ".default";
                          }
                          return getGeneratedNameForNode(node.parent) + defaultKeyword;
                      }
                      if (node.kind === 214) {
                          var moduleName = getGeneratedNameForNode(node.parent.parent.parent);
                          var propertyName = node.propertyName || node.name;
                          return moduleName + "." + ts.unescapeIdentifier(propertyName.text);
                      }
                  }
              }
              function getExportNameSubstitution(symbol, location, getGeneratedNameForNode) {
                  if (isExternalModuleSymbol(symbol.parent)) {
                      if (languageVersion >= 2 || compilerOptions.module === 4) {
                          return undefined;
                      }
                      return "exports." + ts.unescapeIdentifier(symbol.name);
                  }
                  var node = location;
                  var containerSymbol = getParentOfSymbol(symbol);
                  while (node) {
                      if ((node.kind === 206 || node.kind === 205) && getSymbolOfNode(node) === containerSymbol) {
                          return getGeneratedNameForNode(node) + "." + ts.unescapeIdentifier(symbol.name);
                      }
                      node = node.parent;
                  }
              }
              function getExpressionNameSubstitution(node, getGeneratedNameForNode) {
                  var symbol = getNodeLinks(node).resolvedSymbol || (ts.isDeclarationName(node) ? getSymbolOfNode(node.parent) : undefined);
                  if (symbol) {
                      if (symbol.parent) {
                          return getExportNameSubstitution(symbol, node.parent, getGeneratedNameForNode);
                      }
                      var exportSymbol = getExportSymbolOfValueSymbolIfExported(symbol);
                      if (symbol !== exportSymbol && !(exportSymbol.flags & 944)) {
                          return getExportNameSubstitution(exportSymbol, node.parent, getGeneratedNameForNode);
                      }
                      if (symbol.flags & 8388608) {
                          return getAliasNameSubstitution(symbol, getGeneratedNameForNode);
                      }
                  }
              }
              function isValueAliasDeclaration(node) {
                  switch (node.kind) {
                      case 209:
                      case 211:
                      case 212:
                      case 214:
                      case 218:
                          return isAliasResolvedToValue(getSymbolOfNode(node));
                      case 216:
                          var exportClause = node.exportClause;
                          return exportClause && ts.forEach(exportClause.elements, isValueAliasDeclaration);
                      case 215:
                          return node.expression && node.expression.kind === 65 ? isAliasResolvedToValue(getSymbolOfNode(node)) : true;
                  }
                  return false;
              }
              function isTopLevelValueImportEqualsWithEntityName(node) {
                  if (node.parent.kind !== 228 || !ts.isInternalModuleImportEqualsDeclaration(node)) {
                      return false;
                  }
                  var isValue = isAliasResolvedToValue(getSymbolOfNode(node));
                  return isValue && node.moduleReference && !ts.nodeIsMissing(node.moduleReference);
              }
              function isAliasResolvedToValue(symbol) {
                  var target = resolveAlias(symbol);
                  if (target === unknownSymbol && compilerOptions.separateCompilation) {
                      return true;
                  }
                  return target !== unknownSymbol && target && target.flags & 107455 && !isConstEnumOrConstEnumOnlyModule(target);
              }
              function isConstEnumOrConstEnumOnlyModule(s) {
                  return isConstEnumSymbol(s) || s.constEnumOnlyModule;
              }
              function isReferencedAliasDeclaration(node, checkChildren) {
                  if (ts.isAliasSymbolDeclaration(node)) {
                      var symbol = getSymbolOfNode(node);
                      if (getSymbolLinks(symbol).referenced) {
                          return true;
                      }
                  }
                  if (checkChildren) {
                      return ts.forEachChild(node, function (node) { return isReferencedAliasDeclaration(node, checkChildren); });
                  }
                  return false;
              }
              function isImplementationOfOverload(node) {
                  if (ts.nodeIsPresent(node.body)) {
                      var symbol = getSymbolOfNode(node);
                      var signaturesOfSymbol = getSignaturesOfSymbol(symbol);
                      return signaturesOfSymbol.length > 1 ||
                          (signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node);
                  }
                  return false;
              }
              function getNodeCheckFlags(node) {
                  return getNodeLinks(node).flags;
              }
              function getEnumMemberValue(node) {
                  computeEnumMemberValues(node.parent);
                  return getNodeLinks(node).enumMemberValue;
              }
              function getConstantValue(node) {
                  if (node.kind === 227) {
                      return getEnumMemberValue(node);
                  }
                  var symbol = getNodeLinks(node).resolvedSymbol;
                  if (symbol && (symbol.flags & 8)) {
                      if (ts.isConstEnumDeclaration(symbol.valueDeclaration.parent)) {
                          return getEnumMemberValue(symbol.valueDeclaration);
                      }
                  }
                  return undefined;
              }
              function serializeEntityName(node, getGeneratedNameForNode, fallbackPath) {
                  if (node.kind === 65) {
                      var substitution = getExpressionNameSubstitution(node, getGeneratedNameForNode);
                      var text = substitution || node.text;
                      if (fallbackPath) {
                          fallbackPath.push(text);
                      }
                      else {
                          return text;
                      }
                  }
                  else {
                      var left = serializeEntityName(node.left, getGeneratedNameForNode, fallbackPath);
                      var right = serializeEntityName(node.right, getGeneratedNameForNode, fallbackPath);
                      if (!fallbackPath) {
                          return left + "." + right;
                      }
                  }
              }
              function serializeTypeReferenceNode(node, getGeneratedNameForNode) {
                  var type = getTypeFromTypeNode(node);
                  if (type.flags & 16) {
                      return "void 0";
                  }
                  else if (type.flags & 8) {
                      return "Boolean";
                  }
                  else if (type.flags & 132) {
                      return "Number";
                  }
                  else if (type.flags & 258) {
                      return "String";
                  }
                  else if (type.flags & 8192) {
                      return "Array";
                  }
                  else if (type.flags & 1048576) {
                      return "Symbol";
                  }
                  else if (type === unknownType) {
                      var fallbackPath = [];
                      serializeEntityName(node.typeName, getGeneratedNameForNode, fallbackPath);
                      return fallbackPath;
                  }
                  else if (type.symbol && type.symbol.valueDeclaration) {
                      return serializeEntityName(node.typeName, getGeneratedNameForNode);
                  }
                  else if (typeHasCallOrConstructSignatures(type)) {
                      return "Function";
                  }
                  return "Object";
              }
              function serializeTypeNode(node, getGeneratedNameForNode) {
                  if (node) {
                      switch (node.kind) {
                          case 99:
                              return "void 0";
                          case 150:
                              return serializeTypeNode(node.type, getGeneratedNameForNode);
                          case 143:
                          case 144:
                              return "Function";
                          case 147:
                          case 148:
                              return "Array";
                          case 113:
                              return "Boolean";
                          case 122:
                          case 8:
                              return "String";
                          case 120:
                              return "Number";
                          case 142:
                              return serializeTypeReferenceNode(node, getGeneratedNameForNode);
                          case 145:
                          case 146:
                          case 149:
                          case 112:
                              break;
                          default:
                              ts.Debug.fail("Cannot serialize unexpected type node.");
                              break;
                      }
                  }
                  return "Object";
              }
              function serializeTypeOfNode(node, getGeneratedNameForNode) {
                  switch (node.kind) {
                      case 202: return "Function";
                      case 133: return serializeTypeNode(node.type, getGeneratedNameForNode);
                      case 130: return serializeTypeNode(node.type, getGeneratedNameForNode);
                      case 137: return serializeTypeNode(node.type, getGeneratedNameForNode);
                      case 138: return serializeTypeNode(getSetAccessorTypeAnnotationNode(node), getGeneratedNameForNode);
                  }
                  if (ts.isFunctionLike(node)) {
                      return "Function";
                  }
                  return "void 0";
              }
              function serializeParameterTypesOfNode(node, getGeneratedNameForNode) {
                  if (node) {
                      var valueDeclaration;
                      if (node.kind === 202) {
                          valueDeclaration = ts.getFirstConstructorWithBody(node);
                      }
                      else if (ts.isFunctionLike(node) && ts.nodeIsPresent(node.body)) {
                          valueDeclaration = node;
                      }
                      if (valueDeclaration) {
                          var result;
                          var parameters = valueDeclaration.parameters;
                          var parameterCount = parameters.length;
                          if (parameterCount > 0) {
                              result = new Array(parameterCount);
                              for (var i = 0; i < parameterCount; i++) {
                                  if (parameters[i].dotDotDotToken) {
                                      var parameterType = parameters[i].type;
                                      if (parameterType.kind === 147) {
                                          parameterType = parameterType.elementType;
                                      }
                                      else if (parameterType.kind === 142 && parameterType.typeArguments && parameterType.typeArguments.length === 1) {
                                          parameterType = parameterType.typeArguments[0];
                                      }
                                      else {
                                          parameterType = undefined;
                                      }
                                      result[i] = serializeTypeNode(parameterType, getGeneratedNameForNode);
                                  }
                                  else {
                                      result[i] = serializeTypeOfNode(parameters[i], getGeneratedNameForNode);
                                  }
                              }
                              return result;
                          }
                      }
                  }
                  return emptyArray;
              }
              function serializeReturnTypeOfNode(node, getGeneratedNameForNode) {
                  if (node && ts.isFunctionLike(node)) {
                      return serializeTypeNode(node.type, getGeneratedNameForNode);
                  }
                  return "void 0";
              }
              function writeTypeOfDeclaration(declaration, enclosingDeclaration, flags, writer) {
                  var symbol = getSymbolOfNode(declaration);
                  var type = symbol && !(symbol.flags & (2048 | 131072))
                      ? getTypeOfSymbol(symbol)
                      : unknownType;
                  getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
              }
              function writeReturnTypeOfSignatureDeclaration(signatureDeclaration, enclosingDeclaration, flags, writer) {
                  var signature = getSignatureFromDeclaration(signatureDeclaration);
                  getSymbolDisplayBuilder().buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags);
              }
              function writeTypeOfExpression(expr, enclosingDeclaration, flags, writer) {
                  var type = getTypeOfExpression(expr);
                  getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
              }
              function hasGlobalName(name) {
                  return ts.hasProperty(globals, name);
              }
              function resolvesToSomeValue(location, name) {
                  ts.Debug.assert(!ts.nodeIsSynthesized(location), "resolvesToSomeValue called with a synthesized location");
                  return !!resolveName(location, name, 107455, undefined, undefined);
              }
              function getReferencedValueDeclaration(reference) {
                  ts.Debug.assert(!ts.nodeIsSynthesized(reference));
                  var symbol = getNodeLinks(reference).resolvedSymbol ||
                      resolveName(reference, reference.text, 107455 | 8388608, undefined, undefined);
                  return symbol && getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration;
              }
              function getBlockScopedVariableId(n) {
                  ts.Debug.assert(!ts.nodeIsSynthesized(n));
                  var isVariableDeclarationOrBindingElement = n.parent.kind === 153 || (n.parent.kind === 199 && n.parent.name === n);
                  var symbol = (isVariableDeclarationOrBindingElement ? getSymbolOfNode(n.parent) : undefined) ||
                      getNodeLinks(n).resolvedSymbol ||
                      resolveName(n, n.text, 107455 | 8388608, undefined, undefined);
                  var isLetOrConst = symbol &&
                      (symbol.flags & 2) &&
                      symbol.valueDeclaration.parent.kind !== 224;
                  if (isLetOrConst) {
                      getSymbolLinks(symbol);
                      return symbol.id;
                  }
                  return undefined;
              }
              function instantiateSingleCallFunctionType(functionType, typeArguments) {
                  if (functionType === unknownType) {
                      return unknownType;
                  }
                  var signature = getSingleCallSignature(functionType);
                  if (!signature) {
                      return unknownType;
                  }
                  var instantiatedSignature = getSignatureInstantiation(signature, typeArguments);
                  return getOrCreateTypeFromSignature(instantiatedSignature);
              }
              function createResolver() {
                  return {
                      getExpressionNameSubstitution: getExpressionNameSubstitution,
                      isValueAliasDeclaration: isValueAliasDeclaration,
                      hasGlobalName: hasGlobalName,
                      isReferencedAliasDeclaration: isReferencedAliasDeclaration,
                      getNodeCheckFlags: getNodeCheckFlags,
                      isTopLevelValueImportEqualsWithEntityName: isTopLevelValueImportEqualsWithEntityName,
                      isDeclarationVisible: isDeclarationVisible,
                      isImplementationOfOverload: isImplementationOfOverload,
                      writeTypeOfDeclaration: writeTypeOfDeclaration,
                      writeReturnTypeOfSignatureDeclaration: writeReturnTypeOfSignatureDeclaration,
                      writeTypeOfExpression: writeTypeOfExpression,
                      isSymbolAccessible: isSymbolAccessible,
                      isEntityNameVisible: isEntityNameVisible,
                      getConstantValue: getConstantValue,
                      resolvesToSomeValue: resolvesToSomeValue,
                      collectLinkedAliases: collectLinkedAliases,
                      getBlockScopedVariableId: getBlockScopedVariableId,
                      getReferencedValueDeclaration: getReferencedValueDeclaration,
                      serializeTypeOfNode: serializeTypeOfNode,
                      serializeParameterTypesOfNode: serializeParameterTypesOfNode,
                      serializeReturnTypeOfNode: serializeReturnTypeOfNode
                  };
              }
              function initializeTypeChecker() {
                  ts.forEach(host.getSourceFiles(), function (file) {
                      ts.bindSourceFile(file);
                  });
                  ts.forEach(host.getSourceFiles(), function (file) {
                      if (!ts.isExternalModule(file)) {
                          mergeSymbolTable(globals, file.locals);
                      }
                  });
                  getSymbolLinks(undefinedSymbol).type = undefinedType;
                  getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments");
                  getSymbolLinks(unknownSymbol).type = unknownType;
                  globals[undefinedSymbol.name] = undefinedSymbol;
                  globalArraySymbol = getGlobalTypeSymbol("Array");
                  globalArrayType = getTypeOfGlobalSymbol(globalArraySymbol, 1);
                  globalObjectType = getGlobalType("Object");
                  globalFunctionType = getGlobalType("Function");
                  globalStringType = getGlobalType("String");
                  globalNumberType = getGlobalType("Number");
                  globalBooleanType = getGlobalType("Boolean");
                  globalRegExpType = getGlobalType("RegExp");
                  getGlobalClassDecoratorType = ts.memoize(function () { return getGlobalType("ClassDecorator"); });
                  getGlobalPropertyDecoratorType = ts.memoize(function () { return getGlobalType("PropertyDecorator"); });
                  getGlobalMethodDecoratorType = ts.memoize(function () { return getGlobalType("MethodDecorator"); });
                  getGlobalParameterDecoratorType = ts.memoize(function () { return getGlobalType("ParameterDecorator"); });
                  if (languageVersion >= 2) {
                      globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray");
                      globalESSymbolType = getGlobalType("Symbol");
                      globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol");
                      globalIterableType = getGlobalType("Iterable", 1);
                  }
                  else {
                      globalTemplateStringsArrayType = unknownType;
                      globalESSymbolType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
                      globalESSymbolConstructorSymbol = undefined;
                  }
                  anyArrayType = createArrayType(anyType);
              }
              function isReservedWordInStrictMode(node) {
                  return (node.parserContextFlags & 1) &&
                      (102 <= node.originalKeywordKind && node.originalKeywordKind <= 110);
              }
              function reportStrictModeGrammarErrorInClassDeclaration(identifier, message, arg0, arg1, arg2) {
                  if (ts.getAncestor(identifier, 202) || ts.getAncestor(identifier, 175)) {
                      return grammarErrorOnNode(identifier, message, arg0);
                  }
                  return false;
              }
              function checkGrammarImportDeclarationNameInStrictMode(node) {
                  if (node.importClause) {
                      var impotClause = node.importClause;
                      if (impotClause.namedBindings) {
                          var nameBindings = impotClause.namedBindings;
                          if (nameBindings.kind === 212) {
                              var name_11 = nameBindings.name;
                              if (isReservedWordInStrictMode(name_11)) {
                                  var nameText = ts.declarationNameToString(name_11);
                                  return grammarErrorOnNode(name_11, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                              }
                          }
                          else if (nameBindings.kind === 213) {
                              var reportError = false;
                              for (var _i = 0, _a = nameBindings.elements; _i < _a.length; _i++) {
                                  var element = _a[_i];
                                  var name_12 = element.name;
                                  if (isReservedWordInStrictMode(name_12)) {
                                      var nameText = ts.declarationNameToString(name_12);
                                      reportError = reportError || grammarErrorOnNode(name_12, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                                  }
                              }
                              return reportError;
                          }
                      }
                  }
                  return false;
              }
              function checkGrammarDeclarationNameInStrictMode(node) {
                  var name = node.name;
                  if (name && name.kind === 65 && isReservedWordInStrictMode(name)) {
                      var nameText = ts.declarationNameToString(name);
                      switch (node.kind) {
                          case 130:
                          case 199:
                          case 201:
                          case 129:
                          case 153:
                          case 203:
                          case 204:
                          case 205:
                              return checkGrammarIdentifierInStrictMode(name);
                          case 202:
                              return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText);
                          case 206:
                              return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                          case 209:
                              return grammarErrorOnNode(name, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                      }
                  }
                  return false;
              }
              function checkGrammarTypeReferenceInStrictMode(typeName) {
                  if (typeName.kind === 65) {
                      checkGrammarTypeNameInStrictMode(typeName);
                  }
                  else if (typeName.kind === 127) {
                      checkGrammarTypeNameInStrictMode(typeName.right);
                      checkGrammarTypeReferenceInStrictMode(typeName.left);
                  }
              }
              function checkGrammarExpressionWithTypeArgumentsInStrictMode(expression) {
                  if (expression && expression.kind === 65) {
                      return checkGrammarIdentifierInStrictMode(expression);
                  }
                  else if (expression && expression.kind === 156) {
                      checkGrammarExpressionWithTypeArgumentsInStrictMode(expression.expression);
                  }
              }
              function checkGrammarIdentifierInStrictMode(node, nameText) {
                  if (node && node.kind === 65 && isReservedWordInStrictMode(node)) {
                      if (!nameText) {
                          nameText = ts.declarationNameToString(node);
                      }
                      var errorReport = reportStrictModeGrammarErrorInClassDeclaration(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText) ||
                          grammarErrorOnNode(node, ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                      return errorReport;
                  }
                  return false;
              }
              function checkGrammarTypeNameInStrictMode(node) {
                  if (node && node.kind === 65 && isReservedWordInStrictMode(node)) {
                      var nameText = ts.declarationNameToString(node);
                      var errorReport = reportStrictModeGrammarErrorInClassDeclaration(node, ts.Diagnostics.Type_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode, nameText) ||
                          grammarErrorOnNode(node, ts.Diagnostics.Type_expected_0_is_a_reserved_word_in_strict_mode, nameText);
                      return errorReport;
                  }
                  return false;
              }
              function checkGrammarDecorators(node) {
                  if (!node.decorators) {
                      return false;
                  }
                  if (!ts.nodeCanBeDecorated(node)) {
                      return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_not_valid_here);
                  }
                  else if (languageVersion < 1) {
                      return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_only_available_when_targeting_ECMAScript_5_and_higher);
                  }
                  else if (node.kind === 137 || node.kind === 138) {
                      var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
                      if (accessors.firstAccessor.decorators && node === accessors.secondAccessor) {
                          return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name);
                      }
                  }
                  return false;
              }
              function checkGrammarModifiers(node) {
                  switch (node.kind) {
                      case 137:
                      case 138:
                      case 136:
                      case 133:
                      case 132:
                      case 135:
                      case 134:
                      case 141:
                      case 202:
                      case 203:
                      case 206:
                      case 205:
                      case 181:
                      case 201:
                      case 204:
                      case 210:
                      case 209:
                      case 216:
                      case 215:
                      case 130:
                          break;
                      default:
                          return false;
                  }
                  if (!node.modifiers) {
                      return;
                  }
                  var lastStatic, lastPrivate, lastProtected, lastDeclare;
                  var flags = 0;
                  for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
                      var modifier = _a[_i];
                      switch (modifier.kind) {
                          case 108:
                          case 107:
                          case 106:
                              var text = void 0;
                              if (modifier.kind === 108) {
                                  text = "public";
                              }
                              else if (modifier.kind === 107) {
                                  text = "protected";
                                  lastProtected = modifier;
                              }
                              else {
                                  text = "private";
                                  lastPrivate = modifier;
                              }
                              if (flags & 112) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics.Accessibility_modifier_already_seen);
                              }
                              else if (flags & 128) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
                              }
                              else if (node.parent.kind === 207 || node.parent.kind === 228) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_element, text);
                              }
                              flags |= ts.modifierToFlag(modifier.kind);
                              break;
                          case 109:
                              if (flags & 128) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "static");
                              }
                              else if (node.parent.kind === 207 || node.parent.kind === 228) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_element, "static");
                              }
                              else if (node.kind === 130) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static");
                              }
                              flags |= 128;
                              lastStatic = modifier;
                              break;
                          case 78:
                              if (flags & 1) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "export");
                              }
                              else if (flags & 2) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare");
                              }
                              else if (node.parent.kind === 202) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "export");
                              }
                              else if (node.kind === 130) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export");
                              }
                              flags |= 1;
                              break;
                          case 115:
                              if (flags & 2) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "declare");
                              }
                              else if (node.parent.kind === 202) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "declare");
                              }
                              else if (node.kind === 130) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare");
                              }
                              else if (ts.isInAmbientContext(node.parent) && node.parent.kind === 207) {
                                  return grammarErrorOnNode(modifier, ts.Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context);
                              }
                              flags |= 2;
                              lastDeclare = modifier;
                              break;
                      }
                  }
                  if (node.kind === 136) {
                      if (flags & 128) {
                          return grammarErrorOnNode(lastStatic, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
                      }
                      else if (flags & 64) {
                          return grammarErrorOnNode(lastProtected, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "protected");
                      }
                      else if (flags & 32) {
                          return grammarErrorOnNode(lastPrivate, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "private");
                      }
                  }
                  else if ((node.kind === 210 || node.kind === 209) && flags & 2) {
                      return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_declare_modifier_cannot_be_used_with_an_import_declaration, "declare");
                  }
                  else if (node.kind === 203 && flags & 2) {
                      return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_declare_modifier_cannot_be_used_with_an_interface_declaration, "declare");
                  }
                  else if (node.kind === 130 && (flags & 112) && ts.isBindingPattern(node.name)) {
                      return grammarErrorOnNode(node, ts.Diagnostics.A_parameter_property_may_not_be_a_binding_pattern);
                  }
              }
              function checkGrammarForDisallowedTrailingComma(list) {
                  if (list && list.hasTrailingComma) {
                      var start = list.end - ",".length;
                      var end = list.end;
                      var sourceFile = ts.getSourceFileOfNode(list[0]);
                      return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Trailing_comma_not_allowed);
                  }
              }
              function checkGrammarTypeParameterList(node, typeParameters, file) {
                  if (checkGrammarForDisallowedTrailingComma(typeParameters)) {
                      return true;
                  }
                  if (typeParameters && typeParameters.length === 0) {
                      var start = typeParameters.pos - "<".length;
                      var end = ts.skipTrivia(file.text, typeParameters.end) + ">".length;
                      return grammarErrorAtPos(file, start, end - start, ts.Diagnostics.Type_parameter_list_cannot_be_empty);
                  }
              }
              function checkGrammarParameterList(parameters) {
                  if (checkGrammarForDisallowedTrailingComma(parameters)) {
                      return true;
                  }
                  var seenOptionalParameter = false;
                  var parameterCount = parameters.length;
                  for (var i = 0; i < parameterCount; i++) {
                      var parameter = parameters[i];
                      if (parameter.dotDotDotToken) {
                          if (i !== (parameterCount - 1)) {
                              return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
                          }
                          if (ts.isBindingPattern(parameter.name)) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
                          }
                          if (parameter.questionToken) {
                              return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_rest_parameter_cannot_be_optional);
                          }
                          if (parameter.initializer) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_parameter_cannot_have_an_initializer);
                          }
                      }
                      else if (parameter.questionToken || parameter.initializer) {
                          seenOptionalParameter = true;
                          if (parameter.questionToken && parameter.initializer) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
                          }
                      }
                      else {
                          if (seenOptionalParameter) {
                              return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_required_parameter_cannot_follow_an_optional_parameter);
                          }
                      }
                  }
              }
              function checkGrammarFunctionLikeDeclaration(node) {
                  var file = ts.getSourceFileOfNode(node);
                  return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarTypeParameterList(node, node.typeParameters, file) ||
                      checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file);
              }
              function checkGrammarArrowFunction(node, file) {
                  if (node.kind === 164) {
                      var arrowFunction = node;
                      var startLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.pos).line;
                      var endLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.end).line;
                      if (startLine !== endLine) {
                          return grammarErrorOnNode(arrowFunction.equalsGreaterThanToken, ts.Diagnostics.Line_terminator_not_permitted_before_arrow);
                      }
                  }
                  return false;
              }
              function checkGrammarIndexSignatureParameters(node) {
                  var parameter = node.parameters[0];
                  if (node.parameters.length !== 1) {
                      if (parameter) {
                          return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
                      }
                      else {
                          return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
                      }
                  }
                  if (parameter.dotDotDotToken) {
                      return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.An_index_signature_cannot_have_a_rest_parameter);
                  }
                  if (parameter.flags & 499) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier);
                  }
                  if (parameter.questionToken) {
                      return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark);
                  }
                  if (parameter.initializer) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_initializer);
                  }
                  if (!parameter.type) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_must_have_a_type_annotation);
                  }
                  if (parameter.type.kind !== 122 && parameter.type.kind !== 120) {
                      return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_type_must_be_string_or_number);
                  }
                  if (!node.type) {
                      return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_a_type_annotation);
                  }
              }
              function checkGrammarForIndexSignatureModifier(node) {
                  if (node.flags & 499) {
                      grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_not_permitted_on_index_signature_members);
                  }
              }
              function checkGrammarIndexSignature(node) {
                  return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarIndexSignatureParameters(node) || checkGrammarForIndexSignatureModifier(node);
              }
              function checkGrammarForAtLeastOneTypeArgument(node, typeArguments) {
                  if (typeArguments && typeArguments.length === 0) {
                      var sourceFile = ts.getSourceFileOfNode(node);
                      var start = typeArguments.pos - "<".length;
                      var end = ts.skipTrivia(sourceFile.text, typeArguments.end) + ">".length;
                      return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Type_argument_list_cannot_be_empty);
                  }
              }
              function checkGrammarTypeArguments(node, typeArguments) {
                  return checkGrammarForDisallowedTrailingComma(typeArguments) ||
                      checkGrammarForAtLeastOneTypeArgument(node, typeArguments);
              }
              function checkGrammarForOmittedArgument(node, arguments) {
                  if (arguments) {
                      var sourceFile = ts.getSourceFileOfNode(node);
                      for (var _i = 0; _i < arguments.length; _i++) {
                          var arg = arguments[_i];
                          if (arg.kind === 176) {
                              return grammarErrorAtPos(sourceFile, arg.pos, 0, ts.Diagnostics.Argument_expression_expected);
                          }
                      }
                  }
              }
              function checkGrammarArguments(node, arguments) {
                  return checkGrammarForDisallowedTrailingComma(arguments) ||
                      checkGrammarForOmittedArgument(node, arguments);
              }
              function checkGrammarHeritageClause(node) {
                  var types = node.types;
                  if (checkGrammarForDisallowedTrailingComma(types)) {
                      return true;
                  }
                  if (types && types.length === 0) {
                      var listType = ts.tokenToString(node.token);
                      var sourceFile = ts.getSourceFileOfNode(node);
                      return grammarErrorAtPos(sourceFile, types.pos, 0, ts.Diagnostics._0_list_cannot_be_empty, listType);
                  }
              }
              function checkGrammarClassDeclarationHeritageClauses(node) {
                  var seenExtendsClause = false;
                  var seenImplementsClause = false;
                  if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && node.heritageClauses) {
                      for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
                          var heritageClause = _a[_i];
                          if (heritageClause.token === 79) {
                              if (seenExtendsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
                              }
                              if (seenImplementsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_must_precede_implements_clause);
                              }
                              if (heritageClause.types.length > 1) {
                                  return grammarErrorOnFirstToken(heritageClause.types[1], ts.Diagnostics.Classes_can_only_extend_a_single_class);
                              }
                              seenExtendsClause = true;
                          }
                          else {
                              ts.Debug.assert(heritageClause.token === 102);
                              if (seenImplementsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.implements_clause_already_seen);
                              }
                              seenImplementsClause = true;
                          }
                          checkGrammarHeritageClause(heritageClause);
                      }
                  }
              }
              function checkGrammarInterfaceDeclaration(node) {
                  var seenExtendsClause = false;
                  if (node.heritageClauses) {
                      for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
                          var heritageClause = _a[_i];
                          if (heritageClause.token === 79) {
                              if (seenExtendsClause) {
                                  return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
                              }
                              seenExtendsClause = true;
                          }
                          else {
                              ts.Debug.assert(heritageClause.token === 102);
                              return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.Interface_declaration_cannot_have_implements_clause);
                          }
                          checkGrammarHeritageClause(heritageClause);
                      }
                  }
                  return false;
              }
              function checkGrammarComputedPropertyName(node) {
                  if (node.kind !== 128) {
                      return false;
                  }
                  var computedPropertyName = node;
                  if (computedPropertyName.expression.kind === 170 && computedPropertyName.expression.operatorToken.kind === 23) {
                      return grammarErrorOnNode(computedPropertyName.expression, ts.Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name);
                  }
              }
              function checkGrammarForGenerator(node) {
                  if (node.asteriskToken) {
                      return grammarErrorOnNode(node.asteriskToken, ts.Diagnostics.Generators_are_not_currently_supported);
                  }
              }
              function checkGrammarFunctionName(name) {
                  return checkGrammarEvalOrArgumentsInStrictMode(name, name);
              }
              function checkGrammarForInvalidQuestionMark(node, questionToken, message) {
                  if (questionToken) {
                      return grammarErrorOnNode(questionToken, message);
                  }
              }
              function checkGrammarObjectLiteralExpression(node) {
                  var seen = {};
                  var Property = 1;
                  var GetAccessor = 2;
                  var SetAccesor = 4;
                  var GetOrSetAccessor = GetAccessor | SetAccesor;
                  var inStrictMode = (node.parserContextFlags & 1) !== 0;
                  for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
                      var prop = _a[_i];
                      var name_13 = prop.name;
                      if (prop.kind === 176 ||
                          name_13.kind === 128) {
                          checkGrammarComputedPropertyName(name_13);
                          continue;
                      }
                      var currentKind = void 0;
                      if (prop.kind === 225 || prop.kind === 226) {
                          checkGrammarForInvalidQuestionMark(prop, prop.questionToken, ts.Diagnostics.An_object_member_cannot_be_declared_optional);
                          if (name_13.kind === 7) {
                              checkGrammarNumericLiteral(name_13);
                          }
                          currentKind = Property;
                      }
                      else if (prop.kind === 135) {
                          currentKind = Property;
                      }
                      else if (prop.kind === 137) {
                          currentKind = GetAccessor;
                      }
                      else if (prop.kind === 138) {
                          currentKind = SetAccesor;
                      }
                      else {
                          ts.Debug.fail("Unexpected syntax kind:" + prop.kind);
                      }
                      if (!ts.hasProperty(seen, name_13.text)) {
                          seen[name_13.text] = currentKind;
                      }
                      else {
                          var existingKind = seen[name_13.text];
                          if (currentKind === Property && existingKind === Property) {
                              if (inStrictMode) {
                                  grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode);
                              }
                          }
                          else if ((currentKind & GetOrSetAccessor) && (existingKind & GetOrSetAccessor)) {
                              if (existingKind !== GetOrSetAccessor && currentKind !== existingKind) {
                                  seen[name_13.text] = currentKind | existingKind;
                              }
                              else {
                                  return grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name);
                              }
                          }
                          else {
                              return grammarErrorOnNode(name_13, ts.Diagnostics.An_object_literal_cannot_have_property_and_accessor_with_the_same_name);
                          }
                      }
                  }
              }
              function checkGrammarForInOrForOfStatement(forInOrOfStatement) {
                  if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) {
                      return true;
                  }
                  if (forInOrOfStatement.initializer.kind === 200) {
                      var variableList = forInOrOfStatement.initializer;
                      if (!checkGrammarVariableDeclarationList(variableList)) {
                          if (variableList.declarations.length > 1) {
                              var diagnostic = forInOrOfStatement.kind === 188
                                  ? ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement
                                  : ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
                              return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
                          }
                          var firstDeclaration = variableList.declarations[0];
                          if (firstDeclaration.initializer) {
                              var diagnostic = forInOrOfStatement.kind === 188
                                  ? ts.Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer
                                  : ts.Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
                              return grammarErrorOnNode(firstDeclaration.name, diagnostic);
                          }
                          if (firstDeclaration.type) {
                              var diagnostic = forInOrOfStatement.kind === 188
                                  ? ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation
                                  : ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
                              return grammarErrorOnNode(firstDeclaration, diagnostic);
                          }
                      }
                  }
                  return false;
              }
              function checkGrammarAccessor(accessor) {
                  var kind = accessor.kind;
                  if (languageVersion < 1) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher);
                  }
                  else if (ts.isInAmbientContext(accessor)) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_be_declared_in_an_ambient_context);
                  }
                  else if (accessor.body === undefined) {
                      return grammarErrorAtPos(ts.getSourceFileOfNode(accessor), accessor.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
                  }
                  else if (accessor.typeParameters) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_have_type_parameters);
                  }
                  else if (kind === 137 && accessor.parameters.length) {
                      return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_get_accessor_cannot_have_parameters);
                  }
                  else if (kind === 138) {
                      if (accessor.type) {
                          return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_cannot_have_a_return_type_annotation);
                      }
                      else if (accessor.parameters.length !== 1) {
                          return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_must_have_exactly_one_parameter);
                      }
                      else {
                          var parameter = accessor.parameters[0];
                          if (parameter.dotDotDotToken) {
                              return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_set_accessor_cannot_have_rest_parameter);
                          }
                          else if (parameter.flags & 499) {
                              return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
                          }
                          else if (parameter.questionToken) {
                              return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_set_accessor_cannot_have_an_optional_parameter);
                          }
                          else if (parameter.initializer) {
                              return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_parameter_cannot_have_an_initializer);
                          }
                      }
                  }
              }
              function checkGrammarForNonSymbolComputedProperty(node, message) {
                  if (node.kind === 128 && !ts.isWellKnownSymbolSyntactically(node.expression)) {
                      return grammarErrorOnNode(node, message);
                  }
              }
              function checkGrammarMethod(node) {
                  if (checkGrammarDisallowedModifiersInBlockOrObjectLiteralExpression(node) ||
                      checkGrammarFunctionLikeDeclaration(node) ||
                      checkGrammarForGenerator(node)) {
                      return true;
                  }
                  if (node.parent.kind === 155) {
                      if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional)) {
                          return true;
                      }
                      else if (node.body === undefined) {
                          return grammarErrorAtPos(getSourceFile(node), node.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
                      }
                  }
                  if (node.parent.kind === 202) {
                      if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional)) {
                          return true;
                      }
                      if (ts.isInAmbientContext(node)) {
                          return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol);
                      }
                      else if (!node.body) {
                          return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol);
                      }
                  }
                  else if (node.parent.kind === 203) {
                      return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol);
                  }
                  else if (node.parent.kind === 146) {
                      return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol);
                  }
              }
              function isIterationStatement(node, lookInLabeledStatements) {
                  switch (node.kind) {
                      case 187:
                      case 188:
                      case 189:
                      case 185:
                      case 186:
                          return true;
                      case 195:
                          return lookInLabeledStatements && isIterationStatement(node.statement, lookInLabeledStatements);
                  }
                  return false;
              }
              function checkGrammarBreakOrContinueStatement(node) {
                  var current = node;
                  while (current) {
                      if (ts.isFunctionLike(current)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.Jump_target_cannot_cross_function_boundary);
                      }
                      switch (current.kind) {
                          case 195:
                              if (node.label && current.label.text === node.label.text) {
                                  var isMisplacedContinueLabel = node.kind === 190
                                      && !isIterationStatement(current.statement, true);
                                  if (isMisplacedContinueLabel) {
                                      return grammarErrorOnNode(node, ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement);
                                  }
                                  return false;
                              }
                              break;
                          case 194:
                              if (node.kind === 191 && !node.label) {
                                  return false;
                              }
                              break;
                          default:
                              if (isIterationStatement(current, false) && !node.label) {
                                  return false;
                              }
                              break;
                      }
                      current = current.parent;
                  }
                  if (node.label) {
                      var message = node.kind === 191
                          ? ts.Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement
                          : ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement;
                      return grammarErrorOnNode(node, message);
                  }
                  else {
                      var message = node.kind === 191
                          ? ts.Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement
                          : ts.Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement;
                      return grammarErrorOnNode(node, message);
                  }
              }
              function checkGrammarBindingElement(node) {
                  if (node.dotDotDotToken) {
                      var elements = node.parent.elements;
                      if (node !== ts.lastOrUndefined(elements)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
                      }
                      if (node.name.kind === 152 || node.name.kind === 151) {
                          return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
                      }
                      if (node.initializer) {
                          return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
                      }
                  }
                  return checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
              }
              function checkGrammarVariableDeclaration(node) {
                  if (node.parent.parent.kind !== 188 && node.parent.parent.kind !== 189) {
                      if (ts.isInAmbientContext(node)) {
                          if (node.initializer) {
                              var equalsTokenLength = "=".length;
                              return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - equalsTokenLength, equalsTokenLength, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
                          }
                      }
                      else if (!node.initializer) {
                          if (ts.isBindingPattern(node.name) && !ts.isBindingPattern(node.parent)) {
                              return grammarErrorOnNode(node, ts.Diagnostics.A_destructuring_declaration_must_have_an_initializer);
                          }
                          if (ts.isConst(node)) {
                              return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_must_be_initialized);
                          }
                      }
                  }
                  var checkLetConstNames = languageVersion >= 2 && (ts.isLet(node) || ts.isConst(node));
                  return (checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name)) ||
                      checkGrammarEvalOrArgumentsInStrictMode(node, node.name);
              }
              function checkGrammarNameInLetOrConstDeclarations(name) {
                  if (name.kind === 65) {
                      if (name.text === "let") {
                          return grammarErrorOnNode(name, ts.Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations);
                      }
                  }
                  else {
                      var elements = name.elements;
                      for (var _i = 0; _i < elements.length; _i++) {
                          var element = elements[_i];
                          if (element.kind !== 176) {
                              checkGrammarNameInLetOrConstDeclarations(element.name);
                          }
                      }
                  }
              }
              function checkGrammarVariableDeclarationList(declarationList) {
                  var declarations = declarationList.declarations;
                  if (checkGrammarForDisallowedTrailingComma(declarationList.declarations)) {
                      return true;
                  }
                  if (!declarationList.declarations.length) {
                      return grammarErrorAtPos(ts.getSourceFileOfNode(declarationList), declarations.pos, declarations.end - declarations.pos, ts.Diagnostics.Variable_declaration_list_cannot_be_empty);
                  }
              }
              function allowLetAndConstDeclarations(parent) {
                  switch (parent.kind) {
                      case 184:
                      case 185:
                      case 186:
                      case 193:
                      case 187:
                      case 188:
                      case 189:
                          return false;
                      case 195:
                          return allowLetAndConstDeclarations(parent.parent);
                  }
                  return true;
              }
              function checkGrammarForDisallowedLetOrConstStatement(node) {
                  if (!allowLetAndConstDeclarations(node.parent)) {
                      if (ts.isLet(node.declarationList)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.let_declarations_can_only_be_declared_inside_a_block);
                      }
                      else if (ts.isConst(node.declarationList)) {
                          return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_can_only_be_declared_inside_a_block);
                      }
                  }
              }
              function isIntegerLiteral(expression) {
                  if (expression.kind === 168) {
                      var unaryExpression = expression;
                      if (unaryExpression.operator === 33 || unaryExpression.operator === 34) {
                          expression = unaryExpression.operand;
                      }
                  }
                  if (expression.kind === 7) {
                      return /^[0-9]+([eE]\+?[0-9]+)?$/.test(expression.text);
                  }
                  return false;
              }
              function checkGrammarEnumDeclaration(enumDecl) {
                  var enumIsConst = (enumDecl.flags & 8192) !== 0;
                  var hasError = false;
                  if (!enumIsConst) {
                      var inConstantEnumMemberSection = true;
                      var inAmbientContext = ts.isInAmbientContext(enumDecl);
                      for (var _i = 0, _a = enumDecl.members; _i < _a.length; _i++) {
                          var node = _a[_i];
                          if (node.name.kind === 128) {
                              hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Computed_property_names_are_not_allowed_in_enums);
                          }
                          else if (inAmbientContext) {
                              if (node.initializer && !isIntegerLiteral(node.initializer)) {
                                  hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Ambient_enum_elements_can_only_have_integer_literal_initializers) || hasError;
                              }
                          }
                          else if (node.initializer) {
                              inConstantEnumMemberSection = isIntegerLiteral(node.initializer);
                          }
                          else if (!inConstantEnumMemberSection) {
                              hasError = grammarErrorOnNode(node.name, ts.Diagnostics.Enum_member_must_have_initializer) || hasError;
                          }
                      }
                  }
                  return hasError;
              }
              function hasParseDiagnostics(sourceFile) {
                  return sourceFile.parseDiagnostics.length > 0;
              }
              function grammarErrorOnFirstToken(node, message, arg0, arg1, arg2) {
                  var sourceFile = ts.getSourceFileOfNode(node);
                  if (!hasParseDiagnostics(sourceFile)) {
                      var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
                      diagnostics.add(ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              function grammarErrorAtPos(sourceFile, start, length, message, arg0, arg1, arg2) {
                  if (!hasParseDiagnostics(sourceFile)) {
                      diagnostics.add(ts.createFileDiagnostic(sourceFile, start, length, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              function grammarErrorOnNode(node, message, arg0, arg1, arg2) {
                  var sourceFile = ts.getSourceFileOfNode(node);
                  if (!hasParseDiagnostics(sourceFile)) {
                      diagnostics.add(ts.createDiagnosticForNode(node, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              function checkGrammarEvalOrArgumentsInStrictMode(contextNode, name) {
                  if (name && name.kind === 65) {
                      var identifier = name;
                      if (contextNode && (contextNode.parserContextFlags & 1) && isEvalOrArgumentsIdentifier(identifier)) {
                          var nameText = ts.declarationNameToString(identifier);
                          var reportErrorInClassDeclaration = reportStrictModeGrammarErrorInClassDeclaration(identifier, ts.Diagnostics.Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode, nameText);
                          if (!reportErrorInClassDeclaration) {
                              return grammarErrorOnNode(identifier, ts.Diagnostics.Invalid_use_of_0_in_strict_mode, nameText);
                          }
                          return reportErrorInClassDeclaration;
                      }
                  }
              }
              function isEvalOrArgumentsIdentifier(node) {
                  return node.kind === 65 &&
                      (node.text === "eval" || node.text === "arguments");
              }
              function checkGrammarConstructorTypeParameters(node) {
                  if (node.typeParameters) {
                      return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.typeParameters.pos, node.typeParameters.end - node.typeParameters.pos, ts.Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration);
                  }
              }
              function checkGrammarConstructorTypeAnnotation(node) {
                  if (node.type) {
                      return grammarErrorOnNode(node.type, ts.Diagnostics.Type_annotation_cannot_appear_on_a_constructor_declaration);
                  }
              }
              function checkGrammarProperty(node) {
                  if (node.parent.kind === 202) {
                      if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.A_class_member_cannot_be_declared_optional) ||
                          checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol)) {
                          return true;
                      }
                  }
                  else if (node.parent.kind === 203) {
                      if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol)) {
                          return true;
                      }
                  }
                  else if (node.parent.kind === 146) {
                      if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol)) {
                          return true;
                      }
                  }
                  if (ts.isInAmbientContext(node) && node.initializer) {
                      return grammarErrorOnFirstToken(node.initializer, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
                  }
              }
              function checkGrammarTopLevelElementForRequiredDeclareModifier(node) {
                  if (node.kind === 203 ||
                      node.kind === 210 ||
                      node.kind === 209 ||
                      node.kind === 216 ||
                      node.kind === 215 ||
                      (node.flags & 2) ||
                      (node.flags & (1 | 256))) {
                      return false;
                  }
                  return grammarErrorOnFirstToken(node, ts.Diagnostics.A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file);
              }
              function checkGrammarTopLevelElementsForRequiredDeclareModifier(file) {
                  for (var _i = 0, _a = file.statements; _i < _a.length; _i++) {
                      var decl = _a[_i];
                      if (ts.isDeclaration(decl) || decl.kind === 181) {
                          if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) {
                              return true;
                          }
                      }
                  }
              }
              function checkGrammarSourceFile(node) {
                  return ts.isInAmbientContext(node) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node);
              }
              function checkGrammarStatementInAmbientContext(node) {
                  if (ts.isInAmbientContext(node)) {
                      if (isAccessor(node.parent.kind)) {
                          return getNodeLinks(node).hasReportedStatementInAmbientContext = true;
                      }
                      var links = getNodeLinks(node);
                      if (!links.hasReportedStatementInAmbientContext && ts.isFunctionLike(node.parent)) {
                          return getNodeLinks(node).hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts);
                      }
                      if (node.parent.kind === 180 || node.parent.kind === 207 || node.parent.kind === 228) {
                          var links_1 = getNodeLinks(node.parent);
                          if (!links_1.hasReportedStatementInAmbientContext) {
                              return links_1.hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.Statements_are_not_allowed_in_ambient_contexts);
                          }
                      }
                      else {
                      }
                  }
              }
              function checkGrammarNumericLiteral(node) {
                  if (node.flags & 16384) {
                      if (node.parserContextFlags & 1) {
                          return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_allowed_in_strict_mode);
                      }
                      else if (languageVersion >= 1) {
                          return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);
                      }
                  }
              }
              function grammarErrorAfterFirstToken(node, message, arg0, arg1, arg2) {
                  var sourceFile = ts.getSourceFileOfNode(node);
                  if (!hasParseDiagnostics(sourceFile)) {
                      var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
                      diagnostics.add(ts.createFileDiagnostic(sourceFile, ts.textSpanEnd(span), 0, message, arg0, arg1, arg2));
                      return true;
                  }
              }
              initializeTypeChecker();
              return checker;
          }
          ts.createTypeChecker = createTypeChecker;
      })(ts || (ts = {}));
      /// <reference path="checker.ts"/>
      var ts;
      (function (ts) {
          function getDeclarationDiagnostics(host, resolver, targetSourceFile) {
              var diagnostics = [];
              var jsFilePath = ts.getOwnEmitOutputFilePath(targetSourceFile, host, ".js");
              emitDeclarations(host, resolver, diagnostics, jsFilePath, targetSourceFile);
              return diagnostics;
          }
          ts.getDeclarationDiagnostics = getDeclarationDiagnostics;
          function emitDeclarations(host, resolver, diagnostics, jsFilePath, root) {
              var newLine = host.getNewLine();
              var compilerOptions = host.getCompilerOptions();
              var languageVersion = compilerOptions.target || 0;
              var write;
              var writeLine;
              var increaseIndent;
              var decreaseIndent;
              var writeTextOfNode;
              var writer = createAndSetNewTextWriterWithSymbolWriter();
              var enclosingDeclaration;
              var currentSourceFile;
              var reportedDeclarationError = false;
              var emitJsDocComments = compilerOptions.removeComments ? function (declaration) { } : writeJsDocComments;
              var emit = compilerOptions.stripInternal ? stripInternal : emitNode;
              var moduleElementDeclarationEmitInfo = [];
              var asynchronousSubModuleDeclarationEmitInfo;
              var referencePathsOutput = "";
              if (root) {
                  if (!compilerOptions.noResolve) {
                      var addedGlobalFileReference = false;
                      ts.forEach(root.referencedFiles, function (fileReference) {
                          var referencedFile = ts.tryResolveScriptReference(host, root, fileReference);
                          if (referencedFile && ((referencedFile.flags & 2048) ||
                              ts.shouldEmitToOwnFile(referencedFile, compilerOptions) ||
                              !addedGlobalFileReference)) {
                              writeReferencePath(referencedFile);
                              if (!ts.isExternalModuleOrDeclarationFile(referencedFile)) {
                                  addedGlobalFileReference = true;
                              }
                          }
                      });
                  }
                  emitSourceFile(root);
                  if (moduleElementDeclarationEmitInfo.length) {
                      var oldWriter = writer;
                      ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
                          if (aliasEmitInfo.isVisible) {
                              ts.Debug.assert(aliasEmitInfo.node.kind === 210);
                              createAndSetNewTextWriterWithSymbolWriter();
                              ts.Debug.assert(aliasEmitInfo.indent === 0);
                              writeImportDeclaration(aliasEmitInfo.node);
                              aliasEmitInfo.asynchronousOutput = writer.getText();
                          }
                      });
                      setWriter(oldWriter);
                  }
              }
              else {
                  var emittedReferencedFiles = [];
                  ts.forEach(host.getSourceFiles(), function (sourceFile) {
                      if (!ts.isExternalModuleOrDeclarationFile(sourceFile)) {
                          if (!compilerOptions.noResolve) {
                              ts.forEach(sourceFile.referencedFiles, function (fileReference) {
                                  var referencedFile = ts.tryResolveScriptReference(host, sourceFile, fileReference);
                                  if (referencedFile && (ts.isExternalModuleOrDeclarationFile(referencedFile) &&
                                      !ts.contains(emittedReferencedFiles, referencedFile))) {
                                      writeReferencePath(referencedFile);
                                      emittedReferencedFiles.push(referencedFile);
                                  }
                              });
                          }
                          emitSourceFile(sourceFile);
                      }
                  });
              }
              return {
                  reportedDeclarationError: reportedDeclarationError,
                  moduleElementDeclarationEmitInfo: moduleElementDeclarationEmitInfo,
                  synchronousDeclarationOutput: writer.getText(),
                  referencePathsOutput: referencePathsOutput
              };
              function hasInternalAnnotation(range) {
                  var text = currentSourceFile.text;
                  var comment = text.substring(range.pos, range.end);
                  return comment.indexOf("@internal") >= 0;
              }
              function stripInternal(node) {
                  if (node) {
                      var leadingCommentRanges = ts.getLeadingCommentRanges(currentSourceFile.text, node.pos);
                      if (ts.forEach(leadingCommentRanges, hasInternalAnnotation)) {
                          return;
                      }
                      emitNode(node);
                  }
              }
              function createAndSetNewTextWriterWithSymbolWriter() {
                  var writer = ts.createTextWriter(newLine);
                  writer.trackSymbol = trackSymbol;
                  writer.writeKeyword = writer.write;
                  writer.writeOperator = writer.write;
                  writer.writePunctuation = writer.write;
                  writer.writeSpace = writer.write;
                  writer.writeStringLiteral = writer.writeLiteral;
                  writer.writeParameter = writer.write;
                  writer.writeSymbol = writer.write;
                  setWriter(writer);
                  return writer;
              }
              function setWriter(newWriter) {
                  writer = newWriter;
                  write = newWriter.write;
                  writeTextOfNode = newWriter.writeTextOfNode;
                  writeLine = newWriter.writeLine;
                  increaseIndent = newWriter.increaseIndent;
                  decreaseIndent = newWriter.decreaseIndent;
              }
              function writeAsynchronousModuleElements(nodes) {
                  var oldWriter = writer;
                  ts.forEach(nodes, function (declaration) {
                      var nodeToCheck;
                      if (declaration.kind === 199) {
                          nodeToCheck = declaration.parent.parent;
                      }
                      else if (declaration.kind === 213 || declaration.kind === 214 || declaration.kind === 211) {
                          ts.Debug.fail("We should be getting ImportDeclaration instead to write");
                      }
                      else {
                          nodeToCheck = declaration;
                      }
                      var moduleElementEmitInfo = ts.forEach(moduleElementDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
                      if (!moduleElementEmitInfo && asynchronousSubModuleDeclarationEmitInfo) {
                          moduleElementEmitInfo = ts.forEach(asynchronousSubModuleDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
                      }
                      if (moduleElementEmitInfo) {
                          if (moduleElementEmitInfo.node.kind === 210) {
                              moduleElementEmitInfo.isVisible = true;
                          }
                          else {
                              createAndSetNewTextWriterWithSymbolWriter();
                              for (var declarationIndent = moduleElementEmitInfo.indent; declarationIndent; declarationIndent--) {
                                  increaseIndent();
                              }
                              if (nodeToCheck.kind === 206) {
                                  ts.Debug.assert(asynchronousSubModuleDeclarationEmitInfo === undefined);
                                  asynchronousSubModuleDeclarationEmitInfo = [];
                              }
                              writeModuleElement(nodeToCheck);
                              if (nodeToCheck.kind === 206) {
                                  moduleElementEmitInfo.subModuleElementDeclarationEmitInfo = asynchronousSubModuleDeclarationEmitInfo;
                                  asynchronousSubModuleDeclarationEmitInfo = undefined;
                              }
                              moduleElementEmitInfo.asynchronousOutput = writer.getText();
                          }
                      }
                  });
                  setWriter(oldWriter);
              }
              function handleSymbolAccessibilityError(symbolAccesibilityResult) {
                  if (symbolAccesibilityResult.accessibility === 0) {
                      if (symbolAccesibilityResult && symbolAccesibilityResult.aliasesToMakeVisible) {
                          writeAsynchronousModuleElements(symbolAccesibilityResult.aliasesToMakeVisible);
                      }
                  }
                  else {
                      reportedDeclarationError = true;
                      var errorInfo = writer.getSymbolAccessibilityDiagnostic(symbolAccesibilityResult);
                      if (errorInfo) {
                          if (errorInfo.typeName) {
                              diagnostics.push(ts.createDiagnosticForNode(symbolAccesibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, errorInfo.typeName), symbolAccesibilityResult.errorSymbolName, symbolAccesibilityResult.errorModuleName));
                          }
                          else {
                              diagnostics.push(ts.createDiagnosticForNode(symbolAccesibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, symbolAccesibilityResult.errorSymbolName, symbolAccesibilityResult.errorModuleName));
                          }
                      }
                  }
              }
              function trackSymbol(symbol, enclosingDeclaration, meaning) {
                  handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning));
              }
              function writeTypeOfDeclaration(declaration, type, getSymbolAccessibilityDiagnostic) {
                  writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
                  write(": ");
                  if (type) {
                      emitType(type);
                  }
                  else {
                      resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, 2, writer);
                  }
              }
              function writeReturnTypeAtSignature(signature, getSymbolAccessibilityDiagnostic) {
                  writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
                  write(": ");
                  if (signature.type) {
                      emitType(signature.type);
                  }
                  else {
                      resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, 2, writer);
                  }
              }
              function emitLines(nodes) {
                  for (var _i = 0; _i < nodes.length; _i++) {
                      var node = nodes[_i];
                      emit(node);
                  }
              }
              function emitSeparatedList(nodes, separator, eachNodeEmitFn, canEmitFn) {
                  var currentWriterPos = writer.getTextPos();
                  for (var _i = 0; _i < nodes.length; _i++) {
                      var node = nodes[_i];
                      if (!canEmitFn || canEmitFn(node)) {
                          if (currentWriterPos !== writer.getTextPos()) {
                              write(separator);
                          }
                          currentWriterPos = writer.getTextPos();
                          eachNodeEmitFn(node);
                      }
                  }
              }
              function emitCommaList(nodes, eachNodeEmitFn, canEmitFn) {
                  emitSeparatedList(nodes, ", ", eachNodeEmitFn, canEmitFn);
              }
              function writeJsDocComments(declaration) {
                  if (declaration) {
                      var jsDocComments = ts.getJsDocComments(declaration, currentSourceFile);
                      ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, declaration, jsDocComments);
                      ts.emitComments(currentSourceFile, writer, jsDocComments, true, newLine, ts.writeCommentRange);
                  }
              }
              function emitTypeWithNewGetSymbolAccessibilityDiagnostic(type, getSymbolAccessibilityDiagnostic) {
                  writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
                  emitType(type);
              }
              function emitType(type) {
                  switch (type.kind) {
                      case 112:
                      case 122:
                      case 120:
                      case 113:
                      case 123:
                      case 99:
                      case 8:
                          return writeTextOfNode(currentSourceFile, type);
                      case 177:
                          return emitExpressionWithTypeArguments(type);
                      case 142:
                          return emitTypeReference(type);
                      case 145:
                          return emitTypeQuery(type);
                      case 147:
                          return emitArrayType(type);
                      case 148:
                          return emitTupleType(type);
                      case 149:
                          return emitUnionType(type);
                      case 150:
                          return emitParenType(type);
                      case 143:
                      case 144:
                          return emitSignatureDeclarationWithJsDocComments(type);
                      case 146:
                          return emitTypeLiteral(type);
                      case 65:
                          return emitEntityName(type);
                      case 127:
                          return emitEntityName(type);
                  }
                  function emitEntityName(entityName) {
                      var visibilityResult = resolver.isEntityNameVisible(entityName, entityName.parent.kind === 209 ? entityName.parent : enclosingDeclaration);
                      handleSymbolAccessibilityError(visibilityResult);
                      writeEntityName(entityName);
                      function writeEntityName(entityName) {
                          if (entityName.kind === 65) {
                              writeTextOfNode(currentSourceFile, entityName);
                          }
                          else {
                              var left = entityName.kind === 127 ? entityName.left : entityName.expression;
                              var right = entityName.kind === 127 ? entityName.right : entityName.name;
                              writeEntityName(left);
                              write(".");
                              writeTextOfNode(currentSourceFile, right);
                          }
                      }
                  }
                  function emitExpressionWithTypeArguments(node) {
                      if (ts.isSupportedExpressionWithTypeArguments(node)) {
                          ts.Debug.assert(node.expression.kind === 65 || node.expression.kind === 156);
                          emitEntityName(node.expression);
                          if (node.typeArguments) {
                              write("<");
                              emitCommaList(node.typeArguments, emitType);
                              write(">");
                          }
                      }
                  }
                  function emitTypeReference(type) {
                      emitEntityName(type.typeName);
                      if (type.typeArguments) {
                          write("<");
                          emitCommaList(type.typeArguments, emitType);
                          write(">");
                      }
                  }
                  function emitTypeQuery(type) {
                      write("typeof ");
                      emitEntityName(type.exprName);
                  }
                  function emitArrayType(type) {
                      emitType(type.elementType);
                      write("[]");
                  }
                  function emitTupleType(type) {
                      write("[");
                      emitCommaList(type.elementTypes, emitType);
                      write("]");
                  }
                  function emitUnionType(type) {
                      emitSeparatedList(type.types, " | ", emitType);
                  }
                  function emitParenType(type) {
                      write("(");
                      emitType(type.type);
                      write(")");
                  }
                  function emitTypeLiteral(type) {
                      write("{");
                      if (type.members.length) {
                          writeLine();
                          increaseIndent();
                          emitLines(type.members);
                          decreaseIndent();
                      }
                      write("}");
                  }
              }
              function emitSourceFile(node) {
                  currentSourceFile = node;
                  enclosingDeclaration = node;
                  emitLines(node.statements);
              }
              function getExportDefaultTempVariableName() {
                  var baseName = "_default";
                  if (!ts.hasProperty(currentSourceFile.identifiers, baseName)) {
                      return baseName;
                  }
                  var count = 0;
                  while (true) {
                      var name_14 = baseName + "_" + (++count);
                      if (!ts.hasProperty(currentSourceFile.identifiers, name_14)) {
                          return name_14;
                      }
                  }
              }
              function emitExportAssignment(node) {
                  if (node.expression.kind === 65) {
                      write(node.isExportEquals ? "export = " : "export default ");
                      writeTextOfNode(currentSourceFile, node.expression);
                  }
                  else {
                      var tempVarName = getExportDefaultTempVariableName();
                      write("declare var ");
                      write(tempVarName);
                      write(": ");
                      writer.getSymbolAccessibilityDiagnostic = getDefaultExportAccessibilityDiagnostic;
                      resolver.writeTypeOfExpression(node.expression, enclosingDeclaration, 2, writer);
                      write(";");
                      writeLine();
                      write(node.isExportEquals ? "export = " : "export default ");
                      write(tempVarName);
                  }
                  write(";");
                  writeLine();
                  if (node.expression.kind === 65) {
                      var nodes = resolver.collectLinkedAliases(node.expression);
                      writeAsynchronousModuleElements(nodes);
                  }
                  function getDefaultExportAccessibilityDiagnostic(diagnostic) {
                      return {
                          diagnosticMessage: ts.Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
                          errorNode: node
                      };
                  }
              }
              function isModuleElementVisible(node) {
                  return resolver.isDeclarationVisible(node);
              }
              function emitModuleElement(node, isModuleElementVisible) {
                  if (isModuleElementVisible) {
                      writeModuleElement(node);
                  }
                  else if (node.kind === 209 ||
                      (node.parent.kind === 228 && ts.isExternalModule(currentSourceFile))) {
                      var isVisible;
                      if (asynchronousSubModuleDeclarationEmitInfo && node.parent.kind !== 228) {
                          asynchronousSubModuleDeclarationEmitInfo.push({
                              node: node,
                              outputPos: writer.getTextPos(),
                              indent: writer.getIndent(),
                              isVisible: isVisible
                          });
                      }
                      else {
                          if (node.kind === 210) {
                              var importDeclaration = node;
                              if (importDeclaration.importClause) {
                                  isVisible = (importDeclaration.importClause.name && resolver.isDeclarationVisible(importDeclaration.importClause)) ||
                                      isVisibleNamedBinding(importDeclaration.importClause.namedBindings);
                              }
                          }
                          moduleElementDeclarationEmitInfo.push({
                              node: node,
                              outputPos: writer.getTextPos(),
                              indent: writer.getIndent(),
                              isVisible: isVisible
                          });
                      }
                  }
              }
              function writeModuleElement(node) {
                  switch (node.kind) {
                      case 201:
                          return writeFunctionDeclaration(node);
                      case 181:
                          return writeVariableStatement(node);
                      case 203:
                          return writeInterfaceDeclaration(node);
                      case 202:
                          return writeClassDeclaration(node);
                      case 204:
                          return writeTypeAliasDeclaration(node);
                      case 205:
                          return writeEnumDeclaration(node);
                      case 206:
                          return writeModuleDeclaration(node);
                      case 209:
                          return writeImportEqualsDeclaration(node);
                      case 210:
                          return writeImportDeclaration(node);
                      default:
                          ts.Debug.fail("Unknown symbol kind");
                  }
              }
              function emitModuleElementDeclarationFlags(node) {
                  if (node.parent === currentSourceFile) {
                      if (node.flags & 1) {
                          write("export ");
                      }
                      if (node.flags & 256) {
                          write("default ");
                      }
                      else if (node.kind !== 203) {
                          write("declare ");
                      }
                  }
              }
              function emitClassMemberDeclarationFlags(node) {
                  if (node.flags & 32) {
                      write("private ");
                  }
                  else if (node.flags & 64) {
                      write("protected ");
                  }
                  if (node.flags & 128) {
                      write("static ");
                  }
              }
              function writeImportEqualsDeclaration(node) {
                  emitJsDocComments(node);
                  if (node.flags & 1) {
                      write("export ");
                  }
                  write("import ");
                  writeTextOfNode(currentSourceFile, node.name);
                  write(" = ");
                  if (ts.isInternalModuleImportEqualsDeclaration(node)) {
                      emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.moduleReference, getImportEntityNameVisibilityError);
                      write(";");
                  }
                  else {
                      write("require(");
                      writeTextOfNode(currentSourceFile, ts.getExternalModuleImportEqualsDeclarationExpression(node));
                      write(");");
                  }
                  writer.writeLine();
                  function getImportEntityNameVisibilityError(symbolAccesibilityResult) {
                      return {
                          diagnosticMessage: ts.Diagnostics.Import_declaration_0_is_using_private_name_1,
                          errorNode: node,
                          typeName: node.name
                      };
                  }
              }
              function isVisibleNamedBinding(namedBindings) {
                  if (namedBindings) {
                      if (namedBindings.kind === 212) {
                          return resolver.isDeclarationVisible(namedBindings);
                      }
                      else {
                          return ts.forEach(namedBindings.elements, function (namedImport) { return resolver.isDeclarationVisible(namedImport); });
                      }
                  }
              }
              function writeImportDeclaration(node) {
                  if (!node.importClause && !(node.flags & 1)) {
                      return;
                  }
                  emitJsDocComments(node);
                  if (node.flags & 1) {
                      write("export ");
                  }
                  write("import ");
                  if (node.importClause) {
                      var currentWriterPos = writer.getTextPos();
                      if (node.importClause.name && resolver.isDeclarationVisible(node.importClause)) {
                          writeTextOfNode(currentSourceFile, node.importClause.name);
                      }
                      if (node.importClause.namedBindings && isVisibleNamedBinding(node.importClause.namedBindings)) {
                          if (currentWriterPos !== writer.getTextPos()) {
                              write(", ");
                          }
                          if (node.importClause.namedBindings.kind === 212) {
                              write("* as ");
                              writeTextOfNode(currentSourceFile, node.importClause.namedBindings.name);
                          }
                          else {
                              write("{ ");
                              emitCommaList(node.importClause.namedBindings.elements, emitImportOrExportSpecifier, resolver.isDeclarationVisible);
                              write(" }");
                          }
                      }
                      write(" from ");
                  }
                  writeTextOfNode(currentSourceFile, node.moduleSpecifier);
                  write(";");
                  writer.writeLine();
              }
              function emitImportOrExportSpecifier(node) {
                  if (node.propertyName) {
                      writeTextOfNode(currentSourceFile, node.propertyName);
                      write(" as ");
                  }
                  writeTextOfNode(currentSourceFile, node.name);
              }
              function emitExportSpecifier(node) {
                  emitImportOrExportSpecifier(node);
                  var nodes = resolver.collectLinkedAliases(node.propertyName || node.name);
                  writeAsynchronousModuleElements(nodes);
              }
              function emitExportDeclaration(node) {
                  emitJsDocComments(node);
                  write("export ");
                  if (node.exportClause) {
                      write("{ ");
                      emitCommaList(node.exportClause.elements, emitExportSpecifier);
                      write(" }");
                  }
                  else {
                      write("*");
                  }
                  if (node.moduleSpecifier) {
                      write(" from ");
                      writeTextOfNode(currentSourceFile, node.moduleSpecifier);
                  }
                  write(";");
                  writer.writeLine();
              }
              function writeModuleDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("module ");
                  writeTextOfNode(currentSourceFile, node.name);
                  while (node.body.kind !== 207) {
                      node = node.body;
                      write(".");
                      writeTextOfNode(currentSourceFile, node.name);
                  }
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitLines(node.body.statements);
                  decreaseIndent();
                  write("}");
                  writeLine();
                  enclosingDeclaration = prevEnclosingDeclaration;
              }
              function writeTypeAliasDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("type ");
                  writeTextOfNode(currentSourceFile, node.name);
                  write(" = ");
                  emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.type, getTypeAliasDeclarationVisibilityError);
                  write(";");
                  writeLine();
                  function getTypeAliasDeclarationVisibilityError(symbolAccesibilityResult) {
                      return {
                          diagnosticMessage: ts.Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
                          errorNode: node.type,
                          typeName: node.name
                      };
                  }
              }
              function writeEnumDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  if (ts.isConst(node)) {
                      write("const ");
                  }
                  write("enum ");
                  writeTextOfNode(currentSourceFile, node.name);
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitLines(node.members);
                  decreaseIndent();
                  write("}");
                  writeLine();
              }
              function emitEnumMemberDeclaration(node) {
                  emitJsDocComments(node);
                  writeTextOfNode(currentSourceFile, node.name);
                  var enumMemberValue = resolver.getConstantValue(node);
                  if (enumMemberValue !== undefined) {
                      write(" = ");
                      write(enumMemberValue.toString());
                  }
                  write(",");
                  writeLine();
              }
              function isPrivateMethodTypeParameter(node) {
                  return node.parent.kind === 135 && (node.parent.flags & 32);
              }
              function emitTypeParameters(typeParameters) {
                  function emitTypeParameter(node) {
                      increaseIndent();
                      emitJsDocComments(node);
                      decreaseIndent();
                      writeTextOfNode(currentSourceFile, node.name);
                      if (node.constraint && !isPrivateMethodTypeParameter(node)) {
                          write(" extends ");
                          if (node.parent.kind === 143 ||
                              node.parent.kind === 144 ||
                              (node.parent.parent && node.parent.parent.kind === 146)) {
                              ts.Debug.assert(node.parent.kind === 135 ||
                                  node.parent.kind === 134 ||
                                  node.parent.kind === 143 ||
                                  node.parent.kind === 144 ||
                                  node.parent.kind === 139 ||
                                  node.parent.kind === 140);
                              emitType(node.constraint);
                          }
                          else {
                              emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.constraint, getTypeParameterConstraintVisibilityError);
                          }
                      }
                      function getTypeParameterConstraintVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage;
                          switch (node.parent.kind) {
                              case 202:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
                                  break;
                              case 203:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
                                  break;
                              case 140:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
                                  break;
                              case 139:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
                                  break;
                              case 135:
                              case 134:
                                  if (node.parent.flags & 128) {
                                      diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
                                  }
                                  else if (node.parent.parent.kind === 202) {
                                      diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
                                  }
                                  else {
                                      diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
                                  }
                                  break;
                              case 201:
                                  diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
                                  break;
                              default:
                                  ts.Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: node,
                              typeName: node.name
                          };
                      }
                  }
                  if (typeParameters) {
                      write("<");
                      emitCommaList(typeParameters, emitTypeParameter);
                      write(">");
                  }
              }
              function emitHeritageClause(typeReferences, isImplementsList) {
                  if (typeReferences) {
                      write(isImplementsList ? " implements " : " extends ");
                      emitCommaList(typeReferences, emitTypeOfTypeReference);
                  }
                  function emitTypeOfTypeReference(node) {
                      if (ts.isSupportedExpressionWithTypeArguments(node)) {
                          emitTypeWithNewGetSymbolAccessibilityDiagnostic(node, getHeritageClauseVisibilityError);
                      }
                      function getHeritageClauseVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage;
                          if (node.parent.parent.kind === 202) {
                              diagnosticMessage = isImplementsList ?
                                  ts.Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 :
                                  ts.Diagnostics.Extends_clause_of_exported_class_0_has_or_is_using_private_name_1;
                          }
                          else {
                              diagnosticMessage = ts.Diagnostics.Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: node,
                              typeName: node.parent.parent.name
                          };
                      }
                  }
              }
              function writeClassDeclaration(node) {
                  function emitParameterProperties(constructorDeclaration) {
                      if (constructorDeclaration) {
                          ts.forEach(constructorDeclaration.parameters, function (param) {
                              if (param.flags & 112) {
                                  emitPropertyDeclaration(param);
                              }
                          });
                      }
                  }
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("class ");
                  writeTextOfNode(currentSourceFile, node.name);
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  emitTypeParameters(node.typeParameters);
                  var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                  if (baseTypeNode) {
                      emitHeritageClause([baseTypeNode], false);
                  }
                  emitHeritageClause(ts.getClassImplementsHeritageClauseElements(node), true);
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitParameterProperties(ts.getFirstConstructorWithBody(node));
                  emitLines(node.members);
                  decreaseIndent();
                  write("}");
                  writeLine();
                  enclosingDeclaration = prevEnclosingDeclaration;
              }
              function writeInterfaceDeclaration(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  write("interface ");
                  writeTextOfNode(currentSourceFile, node.name);
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  emitTypeParameters(node.typeParameters);
                  emitHeritageClause(ts.getInterfaceBaseTypeNodes(node), false);
                  write(" {");
                  writeLine();
                  increaseIndent();
                  emitLines(node.members);
                  decreaseIndent();
                  write("}");
                  writeLine();
                  enclosingDeclaration = prevEnclosingDeclaration;
              }
              function emitPropertyDeclaration(node) {
                  if (ts.hasDynamicName(node)) {
                      return;
                  }
                  emitJsDocComments(node);
                  emitClassMemberDeclarationFlags(node);
                  emitVariableDeclaration(node);
                  write(";");
                  writeLine();
              }
              function emitVariableDeclaration(node) {
                  if (node.kind !== 199 || resolver.isDeclarationVisible(node)) {
                      if (ts.isBindingPattern(node.name)) {
                          emitBindingPattern(node.name);
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node.name);
                          if ((node.kind === 133 || node.kind === 132) && ts.hasQuestionToken(node)) {
                              write("?");
                          }
                          if ((node.kind === 133 || node.kind === 132) && node.parent.kind === 146) {
                              emitTypeOfVariableDeclarationFromTypeLiteral(node);
                          }
                          else if (!(node.flags & 32)) {
                              writeTypeOfDeclaration(node, node.type, getVariableDeclarationTypeVisibilityError);
                          }
                      }
                  }
                  function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult) {
                      if (node.kind === 199) {
                          return symbolAccesibilityResult.errorModuleName ?
                              symbolAccesibilityResult.accessibility === 2 ?
                                  ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                  ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 :
                              ts.Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
                      }
                      else if (node.kind === 133 || node.kind === 132) {
                          if (node.flags & 128) {
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
                          }
                          else if (node.parent.kind === 202) {
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
                          }
                          else {
                              return symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
                          }
                      }
                  }
                  function getVariableDeclarationTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                      return diagnosticMessage !== undefined ? {
                          diagnosticMessage: diagnosticMessage,
                          errorNode: node,
                          typeName: node.name
                      } : undefined;
                  }
                  function emitBindingPattern(bindingPattern) {
                      var elements = [];
                      for (var _i = 0, _a = bindingPattern.elements; _i < _a.length; _i++) {
                          var element = _a[_i];
                          if (element.kind !== 176) {
                              elements.push(element);
                          }
                      }
                      emitCommaList(elements, emitBindingElement);
                  }
                  function emitBindingElement(bindingElement) {
                      function getBindingElementTypeVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                          return diagnosticMessage !== undefined ? {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: bindingElement,
                              typeName: bindingElement.name
                          } : undefined;
                      }
                      if (bindingElement.name) {
                          if (ts.isBindingPattern(bindingElement.name)) {
                              emitBindingPattern(bindingElement.name);
                          }
                          else {
                              writeTextOfNode(currentSourceFile, bindingElement.name);
                              writeTypeOfDeclaration(bindingElement, undefined, getBindingElementTypeVisibilityError);
                          }
                      }
                  }
              }
              function emitTypeOfVariableDeclarationFromTypeLiteral(node) {
                  if (node.type) {
                      write(": ");
                      emitType(node.type);
                  }
              }
              function isVariableStatementVisible(node) {
                  return ts.forEach(node.declarationList.declarations, function (varDeclaration) { return resolver.isDeclarationVisible(varDeclaration); });
              }
              function writeVariableStatement(node) {
                  emitJsDocComments(node);
                  emitModuleElementDeclarationFlags(node);
                  if (ts.isLet(node.declarationList)) {
                      write("let ");
                  }
                  else if (ts.isConst(node.declarationList)) {
                      write("const ");
                  }
                  else {
                      write("var ");
                  }
                  emitCommaList(node.declarationList.declarations, emitVariableDeclaration, resolver.isDeclarationVisible);
                  write(";");
                  writeLine();
              }
              function emitAccessorDeclaration(node) {
                  if (ts.hasDynamicName(node)) {
                      return;
                  }
                  var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
                  var accessorWithTypeAnnotation;
                  if (node === accessors.firstAccessor) {
                      emitJsDocComments(accessors.getAccessor);
                      emitJsDocComments(accessors.setAccessor);
                      emitClassMemberDeclarationFlags(node);
                      writeTextOfNode(currentSourceFile, node.name);
                      if (!(node.flags & 32)) {
                          accessorWithTypeAnnotation = node;
                          var type = getTypeAnnotationFromAccessor(node);
                          if (!type) {
                              var anotherAccessor = node.kind === 137 ? accessors.setAccessor : accessors.getAccessor;
                              type = getTypeAnnotationFromAccessor(anotherAccessor);
                              if (type) {
                                  accessorWithTypeAnnotation = anotherAccessor;
                              }
                          }
                          writeTypeOfDeclaration(node, type, getAccessorDeclarationTypeVisibilityError);
                      }
                      write(";");
                      writeLine();
                  }
                  function getTypeAnnotationFromAccessor(accessor) {
                      if (accessor) {
                          return accessor.kind === 137
                              ? accessor.type
                              : accessor.parameters.length > 0
                                  ? accessor.parameters[0].type
                                  : undefined;
                      }
                  }
                  function getAccessorDeclarationTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage;
                      if (accessorWithTypeAnnotation.kind === 138) {
                          if (accessorWithTypeAnnotation.parent.flags & 128) {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1;
                          }
                          else {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1;
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: accessorWithTypeAnnotation.parameters[0],
                              typeName: accessorWithTypeAnnotation.name
                          };
                      }
                      else {
                          if (accessorWithTypeAnnotation.flags & 128) {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                      ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0;
                          }
                          else {
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                      ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0;
                          }
                          return {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: accessorWithTypeAnnotation.name,
                              typeName: undefined
                          };
                      }
                  }
              }
              function writeFunctionDeclaration(node) {
                  if (ts.hasDynamicName(node)) {
                      return;
                  }
                  if (!resolver.isImplementationOfOverload(node)) {
                      emitJsDocComments(node);
                      if (node.kind === 201) {
                          emitModuleElementDeclarationFlags(node);
                      }
                      else if (node.kind === 135) {
                          emitClassMemberDeclarationFlags(node);
                      }
                      if (node.kind === 201) {
                          write("function ");
                          writeTextOfNode(currentSourceFile, node.name);
                      }
                      else if (node.kind === 136) {
                          write("constructor");
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node.name);
                          if (ts.hasQuestionToken(node)) {
                              write("?");
                          }
                      }
                      emitSignatureDeclaration(node);
                  }
              }
              function emitSignatureDeclarationWithJsDocComments(node) {
                  emitJsDocComments(node);
                  emitSignatureDeclaration(node);
              }
              function emitSignatureDeclaration(node) {
                  if (node.kind === 140 || node.kind === 144) {
                      write("new ");
                  }
                  emitTypeParameters(node.typeParameters);
                  if (node.kind === 141) {
                      write("[");
                  }
                  else {
                      write("(");
                  }
                  var prevEnclosingDeclaration = enclosingDeclaration;
                  enclosingDeclaration = node;
                  emitCommaList(node.parameters, emitParameterDeclaration);
                  if (node.kind === 141) {
                      write("]");
                  }
                  else {
                      write(")");
                  }
                  var isFunctionTypeOrConstructorType = node.kind === 143 || node.kind === 144;
                  if (isFunctionTypeOrConstructorType || node.parent.kind === 146) {
                      if (node.type) {
                          write(isFunctionTypeOrConstructorType ? " => " : ": ");
                          emitType(node.type);
                      }
                  }
                  else if (node.kind !== 136 && !(node.flags & 32)) {
                      writeReturnTypeAtSignature(node, getReturnTypeVisibilityError);
                  }
                  enclosingDeclaration = prevEnclosingDeclaration;
                  if (!isFunctionTypeOrConstructorType) {
                      write(";");
                      writeLine();
                  }
                  function getReturnTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage;
                      switch (node.kind) {
                          case 140:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
                              break;
                          case 139:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
                              break;
                          case 141:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
                              break;
                          case 135:
                          case 134:
                              if (node.flags & 128) {
                                  diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                          ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                      ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
                              }
                              else if (node.parent.kind === 202) {
                                  diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                          ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
                                      ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
                              }
                              else {
                                  diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                      ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
                                      ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
                              }
                              break;
                          case 201:
                              diagnosticMessage = symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
                                      ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 :
                                  ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
                              break;
                          default:
                              ts.Debug.fail("This is unknown kind for signature: " + node.kind);
                      }
                      return {
                          diagnosticMessage: diagnosticMessage,
                          errorNode: node.name || node
                      };
                  }
              }
              function emitParameterDeclaration(node) {
                  increaseIndent();
                  emitJsDocComments(node);
                  if (node.dotDotDotToken) {
                      write("...");
                  }
                  if (ts.isBindingPattern(node.name)) {
                      emitBindingPattern(node.name);
                  }
                  else {
                      writeTextOfNode(currentSourceFile, node.name);
                  }
                  if (node.initializer || ts.hasQuestionToken(node)) {
                      write("?");
                  }
                  decreaseIndent();
                  if (node.parent.kind === 143 ||
                      node.parent.kind === 144 ||
                      node.parent.parent.kind === 146) {
                      emitTypeOfVariableDeclarationFromTypeLiteral(node);
                  }
                  else if (!(node.parent.flags & 32)) {
                      writeTypeOfDeclaration(node, node.type, getParameterDeclarationTypeVisibilityError);
                  }
                  function getParameterDeclarationTypeVisibilityError(symbolAccesibilityResult) {
                      var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                      return diagnosticMessage !== undefined ? {
                          diagnosticMessage: diagnosticMessage,
                          errorNode: node,
                          typeName: node.name
                      } : undefined;
                  }
                  function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult) {
                      switch (node.parent.kind) {
                          case 136:
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
                          case 140:
                              return symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
                          case 139:
                              return symbolAccesibilityResult.errorModuleName ?
                                  ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
                          case 135:
                          case 134:
                              if (node.parent.flags & 128) {
                                  return symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                          ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                      ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
                              }
                              else if (node.parent.parent.kind === 202) {
                                  return symbolAccesibilityResult.errorModuleName ?
                                      symbolAccesibilityResult.accessibility === 2 ?
                                          ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                          ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
                                      ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
                              }
                              else {
                                  return symbolAccesibilityResult.errorModuleName ?
                                      ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
                                      ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
                              }
                          case 201:
                              return symbolAccesibilityResult.errorModuleName ?
                                  symbolAccesibilityResult.accessibility === 2 ?
                                      ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
                                      ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 :
                                  ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
                          default:
                              ts.Debug.fail("This is unknown parent for parameter: " + node.parent.kind);
                      }
                  }
                  function emitBindingPattern(bindingPattern) {
                      if (bindingPattern.kind === 151) {
                          write("{");
                          emitCommaList(bindingPattern.elements, emitBindingElement);
                          write("}");
                      }
                      else if (bindingPattern.kind === 152) {
                          write("[");
                          var elements = bindingPattern.elements;
                          emitCommaList(elements, emitBindingElement);
                          if (elements && elements.hasTrailingComma) {
                              write(", ");
                          }
                          write("]");
                      }
                  }
                  function emitBindingElement(bindingElement) {
                      function getBindingElementTypeVisibilityError(symbolAccesibilityResult) {
                          var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult);
                          return diagnosticMessage !== undefined ? {
                              diagnosticMessage: diagnosticMessage,
                              errorNode: bindingElement,
                              typeName: bindingElement.name
                          } : undefined;
                      }
                      if (bindingElement.kind === 176) {
                          write(" ");
                      }
                      else if (bindingElement.kind === 153) {
                          if (bindingElement.propertyName) {
                              writeTextOfNode(currentSourceFile, bindingElement.propertyName);
                              write(": ");
                              emitBindingPattern(bindingElement.name);
                          }
                          else if (bindingElement.name) {
                              if (ts.isBindingPattern(bindingElement.name)) {
                                  emitBindingPattern(bindingElement.name);
                              }
                              else {
                                  ts.Debug.assert(bindingElement.name.kind === 65);
                                  if (bindingElement.dotDotDotToken) {
                                      write("...");
                                  }
                                  writeTextOfNode(currentSourceFile, bindingElement.name);
                              }
                          }
                      }
                  }
              }
              function emitNode(node) {
                  switch (node.kind) {
                      case 201:
                      case 206:
                      case 209:
                      case 203:
                      case 202:
                      case 204:
                      case 205:
                          return emitModuleElement(node, isModuleElementVisible(node));
                      case 181:
                          return emitModuleElement(node, isVariableStatementVisible(node));
                      case 210:
                          return emitModuleElement(node, !node.importClause);
                      case 216:
                          return emitExportDeclaration(node);
                      case 136:
                      case 135:
                      case 134:
                          return writeFunctionDeclaration(node);
                      case 140:
                      case 139:
                      case 141:
                          return emitSignatureDeclarationWithJsDocComments(node);
                      case 137:
                      case 138:
                          return emitAccessorDeclaration(node);
                      case 133:
                      case 132:
                          return emitPropertyDeclaration(node);
                      case 227:
                          return emitEnumMemberDeclaration(node);
                      case 215:
                          return emitExportAssignment(node);
                      case 228:
                          return emitSourceFile(node);
                  }
              }
              function writeReferencePath(referencedFile) {
                  var declFileName = referencedFile.flags & 2048
                      ? referencedFile.fileName
                      : ts.shouldEmitToOwnFile(referencedFile, compilerOptions)
                          ? ts.getOwnEmitOutputFilePath(referencedFile, host, ".d.ts")
                          : ts.removeFileExtension(compilerOptions.out) + ".d.ts";
                  declFileName = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizeSlashes(jsFilePath)), declFileName, host.getCurrentDirectory(), host.getCanonicalFileName, false);
                  referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
              }
          }
          function writeDeclarationFile(jsFilePath, sourceFile, host, resolver, diagnostics) {
              var emitDeclarationResult = emitDeclarations(host, resolver, diagnostics, jsFilePath, sourceFile);
              if (!emitDeclarationResult.reportedDeclarationError) {
                  var declarationOutput = emitDeclarationResult.referencePathsOutput
                      + getDeclarationOutput(emitDeclarationResult.synchronousDeclarationOutput, emitDeclarationResult.moduleElementDeclarationEmitInfo);
                  ts.writeFile(host, diagnostics, ts.removeFileExtension(jsFilePath) + ".d.ts", declarationOutput, host.getCompilerOptions().emitBOM);
              }
              function getDeclarationOutput(synchronousDeclarationOutput, moduleElementDeclarationEmitInfo) {
                  var appliedSyncOutputPos = 0;
                  var declarationOutput = "";
                  ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
                      if (aliasEmitInfo.asynchronousOutput) {
                          declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos, aliasEmitInfo.outputPos);
                          declarationOutput += getDeclarationOutput(aliasEmitInfo.asynchronousOutput, aliasEmitInfo.subModuleElementDeclarationEmitInfo);
                          appliedSyncOutputPos = aliasEmitInfo.outputPos;
                      }
                  });
                  declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos);
                  return declarationOutput;
              }
          }
          ts.writeDeclarationFile = writeDeclarationFile;
      })(ts || (ts = {}));
      /// <reference path="checker.ts"/>
      /// <reference path="declarationEmitter.ts"/>
      var ts;
      (function (ts) {
          function isExternalModuleOrDeclarationFile(sourceFile) {
              return ts.isExternalModule(sourceFile) || ts.isDeclarationFile(sourceFile);
          }
          ts.isExternalModuleOrDeclarationFile = isExternalModuleOrDeclarationFile;
          function emitFiles(resolver, host, targetSourceFile) {
              var extendsHelper = "\nvar __extends = (this && this.__extends) || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    __.prototype = b.prototype;\n    d.prototype = new __();\n};";
              var decorateHelper = "\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") return Reflect.decorate(decorators, target, key, desc);\n    switch (arguments.length) {\n        case 2: return decorators.reduceRight(function(o, d) { return (d && d(o)) || o; }, target);\n        case 3: return decorators.reduceRight(function(o, d) { return (d && d(target, key)), void 0; }, void 0);\n        case 4: return decorators.reduceRight(function(o, d) { return (d && d(target, key, o)) || o; }, desc);\n    }\n};";
              var metadataHelper = "\nvar __metadata = (this && this.__metadata) || function (k, v) {\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};";
              var paramHelper = "\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n    return function (target, key) { decorator(target, key, paramIndex); }\n};";
              var compilerOptions = host.getCompilerOptions();
              var languageVersion = compilerOptions.target || 0;
              var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? [] : undefined;
              var diagnostics = [];
              var newLine = host.getNewLine();
              if (targetSourceFile === undefined) {
                  ts.forEach(host.getSourceFiles(), function (sourceFile) {
                      if (ts.shouldEmitToOwnFile(sourceFile, compilerOptions)) {
                          var jsFilePath = ts.getOwnEmitOutputFilePath(sourceFile, host, ".js");
                          emitFile(jsFilePath, sourceFile);
                      }
                  });
                  if (compilerOptions.out) {
                      emitFile(compilerOptions.out);
                  }
              }
              else {
                  if (ts.shouldEmitToOwnFile(targetSourceFile, compilerOptions)) {
                      var jsFilePath = ts.getOwnEmitOutputFilePath(targetSourceFile, host, ".js");
                      emitFile(jsFilePath, targetSourceFile);
                  }
                  else if (!ts.isDeclarationFile(targetSourceFile) && compilerOptions.out) {
                      emitFile(compilerOptions.out);
                  }
              }
              diagnostics = ts.sortAndDeduplicateDiagnostics(diagnostics);
              return {
                  emitSkipped: false,
                  diagnostics: diagnostics,
                  sourceMaps: sourceMapDataList
              };
              function isNodeDescendentOf(node, ancestor) {
                  while (node) {
                      if (node === ancestor)
                          return true;
                      node = node.parent;
                  }
                  return false;
              }
              function isUniqueLocalName(name, container) {
                  for (var node = container; isNodeDescendentOf(node, container); node = node.nextContainer) {
                      if (node.locals && ts.hasProperty(node.locals, name)) {
                          if (node.locals[name].flags & (107455 | 1048576 | 8388608)) {
                              return false;
                          }
                      }
                  }
                  return true;
              }
              function emitJavaScript(jsFilePath, root) {
                  var writer = ts.createTextWriter(newLine);
                  var write = writer.write;
                  var writeTextOfNode = writer.writeTextOfNode;
                  var writeLine = writer.writeLine;
                  var increaseIndent = writer.increaseIndent;
                  var decreaseIndent = writer.decreaseIndent;
                  var currentSourceFile;
                  var exportFunctionForFile;
                  var generatedNameSet = {};
                  var nodeToGeneratedName = [];
                  var blockScopedVariableToGeneratedName;
                  var computedPropertyNamesToGeneratedNames;
                  var extendsEmitted = false;
                  var decorateEmitted = false;
                  var paramEmitted = false;
                  var tempFlags = 0;
                  var tempVariables;
                  var tempParameters;
                  var externalImports;
                  var exportSpecifiers;
                  var exportEquals;
                  var hasExportStars;
                  var writeEmittedFiles = writeJavaScriptFile;
                  var detachedCommentsInfo;
                  var writeComment = ts.writeCommentRange;
                  var emit = emitNodeWithoutSourceMap;
                  var emitStart = function (node) { };
                  var emitEnd = function (node) { };
                  var emitToken = emitTokenText;
                  var scopeEmitStart = function (scopeDeclaration, scopeName) { };
                  var scopeEmitEnd = function () { };
                  var sourceMapData;
                  if (compilerOptions.sourceMap || compilerOptions.inlineSourceMap) {
                      initializeEmitterWithSourceMaps();
                  }
                  if (root) {
                      emitSourceFile(root);
                  }
                  else {
                      ts.forEach(host.getSourceFiles(), function (sourceFile) {
                          if (!isExternalModuleOrDeclarationFile(sourceFile)) {
                              emitSourceFile(sourceFile);
                          }
                      });
                  }
                  writeLine();
                  writeEmittedFiles(writer.getText(), compilerOptions.emitBOM);
                  return;
                  function emitSourceFile(sourceFile) {
                      currentSourceFile = sourceFile;
                      exportFunctionForFile = undefined;
                      emit(sourceFile);
                  }
                  function isUniqueName(name) {
                      return !resolver.hasGlobalName(name) &&
                          !ts.hasProperty(currentSourceFile.identifiers, name) &&
                          !ts.hasProperty(generatedNameSet, name);
                  }
                  function makeTempVariableName(flags) {
                      if (flags && !(tempFlags & flags)) {
                          var name = flags === 268435456 ? "_i" : "_n";
                          if (isUniqueName(name)) {
                              tempFlags |= flags;
                              return name;
                          }
                      }
                      while (true) {
                          var count = tempFlags & 268435455;
                          tempFlags++;
                          if (count !== 8 && count !== 13) {
                              var name_15 = count < 26 ? "_" + String.fromCharCode(97 + count) : "_" + (count - 26);
                              if (isUniqueName(name_15)) {
                                  return name_15;
                              }
                          }
                      }
                  }
                  function makeUniqueName(baseName) {
                      if (baseName.charCodeAt(baseName.length - 1) !== 95) {
                          baseName += "_";
                      }
                      var i = 1;
                      while (true) {
                          var generatedName = baseName + i;
                          if (isUniqueName(generatedName)) {
                              return generatedNameSet[generatedName] = generatedName;
                          }
                          i++;
                      }
                  }
                  function assignGeneratedName(node, name) {
                      nodeToGeneratedName[ts.getNodeId(node)] = ts.unescapeIdentifier(name);
                  }
                  function generateNameForFunctionOrClassDeclaration(node) {
                      if (!node.name) {
                          assignGeneratedName(node, makeUniqueName("default"));
                      }
                  }
                  function generateNameForModuleOrEnum(node) {
                      if (node.name.kind === 65) {
                          var name_16 = node.name.text;
                          assignGeneratedName(node, isUniqueLocalName(name_16, node) ? name_16 : makeUniqueName(name_16));
                      }
                  }
                  function generateNameForImportOrExportDeclaration(node) {
                      var expr = ts.getExternalModuleName(node);
                      var baseName = expr.kind === 8 ?
                          ts.escapeIdentifier(ts.makeIdentifierFromModuleName(expr.text)) : "module";
                      assignGeneratedName(node, makeUniqueName(baseName));
                  }
                  function generateNameForImportDeclaration(node) {
                      if (node.importClause) {
                          generateNameForImportOrExportDeclaration(node);
                      }
                  }
                  function generateNameForExportDeclaration(node) {
                      if (node.moduleSpecifier) {
                          generateNameForImportOrExportDeclaration(node);
                      }
                  }
                  function generateNameForExportAssignment(node) {
                      if (node.expression && node.expression.kind !== 65) {
                          assignGeneratedName(node, makeUniqueName("default"));
                      }
                  }
                  function generateNameForNode(node) {
                      switch (node.kind) {
                          case 201:
                          case 202:
                          case 175:
                              generateNameForFunctionOrClassDeclaration(node);
                              break;
                          case 206:
                              generateNameForModuleOrEnum(node);
                              generateNameForNode(node.body);
                              break;
                          case 205:
                              generateNameForModuleOrEnum(node);
                              break;
                          case 210:
                              generateNameForImportDeclaration(node);
                              break;
                          case 216:
                              generateNameForExportDeclaration(node);
                              break;
                          case 215:
                              generateNameForExportAssignment(node);
                              break;
                      }
                  }
                  function getGeneratedNameForNode(node) {
                      var nodeId = ts.getNodeId(node);
                      if (!nodeToGeneratedName[nodeId]) {
                          generateNameForNode(node);
                      }
                      return nodeToGeneratedName[nodeId];
                  }
                  function initializeEmitterWithSourceMaps() {
                      var sourceMapDir;
                      var sourceMapSourceIndex = -1;
                      var sourceMapNameIndexMap = {};
                      var sourceMapNameIndices = [];
                      function getSourceMapNameIndex() {
                          return sourceMapNameIndices.length ? ts.lastOrUndefined(sourceMapNameIndices) : -1;
                      }
                      var lastRecordedSourceMapSpan;
                      var lastEncodedSourceMapSpan = {
                          emittedLine: 1,
                          emittedColumn: 1,
                          sourceLine: 1,
                          sourceColumn: 1,
                          sourceIndex: 0
                      };
                      var lastEncodedNameIndex = 0;
                      function encodeLastRecordedSourceMapSpan() {
                          if (!lastRecordedSourceMapSpan || lastRecordedSourceMapSpan === lastEncodedSourceMapSpan) {
                              return;
                          }
                          var prevEncodedEmittedColumn = lastEncodedSourceMapSpan.emittedColumn;
                          if (lastEncodedSourceMapSpan.emittedLine == lastRecordedSourceMapSpan.emittedLine) {
                              if (sourceMapData.sourceMapMappings) {
                                  sourceMapData.sourceMapMappings += ",";
                              }
                          }
                          else {
                              for (var encodedLine = lastEncodedSourceMapSpan.emittedLine; encodedLine < lastRecordedSourceMapSpan.emittedLine; encodedLine++) {
                                  sourceMapData.sourceMapMappings += ";";
                              }
                              prevEncodedEmittedColumn = 1;
                          }
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.emittedColumn - prevEncodedEmittedColumn);
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceIndex - lastEncodedSourceMapSpan.sourceIndex);
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceLine - lastEncodedSourceMapSpan.sourceLine);
                          sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceColumn - lastEncodedSourceMapSpan.sourceColumn);
                          if (lastRecordedSourceMapSpan.nameIndex >= 0) {
                              sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.nameIndex - lastEncodedNameIndex);
                              lastEncodedNameIndex = lastRecordedSourceMapSpan.nameIndex;
                          }
                          lastEncodedSourceMapSpan = lastRecordedSourceMapSpan;
                          sourceMapData.sourceMapDecodedMappings.push(lastEncodedSourceMapSpan);
                          function base64VLQFormatEncode(inValue) {
                              function base64FormatEncode(inValue) {
                                  if (inValue < 64) {
                                      return 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.charAt(inValue);
                                  }
                                  throw TypeError(inValue + ": not a 64 based value");
                              }
                              if (inValue < 0) {
                                  inValue = ((-inValue) << 1) + 1;
                              }
                              else {
                                  inValue = inValue << 1;
                              }
                              var encodedStr = "";
                              do {
                                  var currentDigit = inValue & 31;
                                  inValue = inValue >> 5;
                                  if (inValue > 0) {
                                      currentDigit = currentDigit | 32;
                                  }
                                  encodedStr = encodedStr + base64FormatEncode(currentDigit);
                              } while (inValue > 0);
                              return encodedStr;
                          }
                      }
                      function recordSourceMapSpan(pos) {
                          var sourceLinePos = ts.getLineAndCharacterOfPosition(currentSourceFile, pos);
                          sourceLinePos.line++;
                          sourceLinePos.character++;
                          var emittedLine = writer.getLine();
                          var emittedColumn = writer.getColumn();
                          if (!lastRecordedSourceMapSpan ||
                              lastRecordedSourceMapSpan.emittedLine != emittedLine ||
                              lastRecordedSourceMapSpan.emittedColumn != emittedColumn ||
                              (lastRecordedSourceMapSpan.sourceIndex === sourceMapSourceIndex &&
                                  (lastRecordedSourceMapSpan.sourceLine > sourceLinePos.line ||
                                      (lastRecordedSourceMapSpan.sourceLine === sourceLinePos.line && lastRecordedSourceMapSpan.sourceColumn > sourceLinePos.character)))) {
                              encodeLastRecordedSourceMapSpan();
                              lastRecordedSourceMapSpan = {
                                  emittedLine: emittedLine,
                                  emittedColumn: emittedColumn,
                                  sourceLine: sourceLinePos.line,
                                  sourceColumn: sourceLinePos.character,
                                  nameIndex: getSourceMapNameIndex(),
                                  sourceIndex: sourceMapSourceIndex
                              };
                          }
                          else {
                              lastRecordedSourceMapSpan.sourceLine = sourceLinePos.line;
                              lastRecordedSourceMapSpan.sourceColumn = sourceLinePos.character;
                              lastRecordedSourceMapSpan.sourceIndex = sourceMapSourceIndex;
                          }
                      }
                      function recordEmitNodeStartSpan(node) {
                          recordSourceMapSpan(ts.skipTrivia(currentSourceFile.text, node.pos));
                      }
                      function recordEmitNodeEndSpan(node) {
                          recordSourceMapSpan(node.end);
                      }
                      function writeTextWithSpanRecord(tokenKind, startPos, emitFn) {
                          var tokenStartPos = ts.skipTrivia(currentSourceFile.text, startPos);
                          recordSourceMapSpan(tokenStartPos);
                          var tokenEndPos = emitTokenText(tokenKind, tokenStartPos, emitFn);
                          recordSourceMapSpan(tokenEndPos);
                          return tokenEndPos;
                      }
                      function recordNewSourceFileStart(node) {
                          var sourcesDirectoryPath = compilerOptions.sourceRoot ? host.getCommonSourceDirectory() : sourceMapDir;
                          sourceMapData.sourceMapSources.push(ts.getRelativePathToDirectoryOrUrl(sourcesDirectoryPath, node.fileName, host.getCurrentDirectory(), host.getCanonicalFileName, true));
                          sourceMapSourceIndex = sourceMapData.sourceMapSources.length - 1;
                          sourceMapData.inputSourceFileNames.push(node.fileName);
                          if (compilerOptions.inlineSources) {
                              if (!sourceMapData.sourceMapSourcesContent) {
                                  sourceMapData.sourceMapSourcesContent = [];
                              }
                              sourceMapData.sourceMapSourcesContent.push(node.text);
                          }
                      }
                      function recordScopeNameOfNode(node, scopeName) {
                          function recordScopeNameIndex(scopeNameIndex) {
                              sourceMapNameIndices.push(scopeNameIndex);
                          }
                          function recordScopeNameStart(scopeName) {
                              var scopeNameIndex = -1;
                              if (scopeName) {
                                  var parentIndex = getSourceMapNameIndex();
                                  if (parentIndex !== -1) {
                                      var name_17 = node.name;
                                      if (!name_17 || name_17.kind !== 128) {
                                          scopeName = "." + scopeName;
                                      }
                                      scopeName = sourceMapData.sourceMapNames[parentIndex] + scopeName;
                                  }
                                  scopeNameIndex = ts.getProperty(sourceMapNameIndexMap, scopeName);
                                  if (scopeNameIndex === undefined) {
                                      scopeNameIndex = sourceMapData.sourceMapNames.length;
                                      sourceMapData.sourceMapNames.push(scopeName);
                                      sourceMapNameIndexMap[scopeName] = scopeNameIndex;
                                  }
                              }
                              recordScopeNameIndex(scopeNameIndex);
                          }
                          if (scopeName) {
                              recordScopeNameStart(scopeName);
                          }
                          else if (node.kind === 201 ||
                              node.kind === 163 ||
                              node.kind === 135 ||
                              node.kind === 134 ||
                              node.kind === 137 ||
                              node.kind === 138 ||
                              node.kind === 206 ||
                              node.kind === 202 ||
                              node.kind === 205) {
                              if (node.name) {
                                  var name_18 = node.name;
                                  scopeName = name_18.kind === 128
                                      ? ts.getTextOfNode(name_18)
                                      : node.name.text;
                              }
                              recordScopeNameStart(scopeName);
                          }
                          else {
                              recordScopeNameIndex(getSourceMapNameIndex());
                          }
                      }
                      function recordScopeNameEnd() {
                          sourceMapNameIndices.pop();
                      }
                      ;
                      function writeCommentRangeWithMap(curentSourceFile, writer, comment, newLine) {
                          recordSourceMapSpan(comment.pos);
                          ts.writeCommentRange(currentSourceFile, writer, comment, newLine);
                          recordSourceMapSpan(comment.end);
                      }
                      function serializeSourceMapContents(version, file, sourceRoot, sources, names, mappings, sourcesContent) {
                          if (typeof JSON !== "undefined") {
                              var map_1 = {
                                  version: version,
                                  file: file,
                                  sourceRoot: sourceRoot,
                                  sources: sources,
                                  names: names,
                                  mappings: mappings
                              };
                              if (sourcesContent !== undefined) {
                                  map_1.sourcesContent = sourcesContent;
                              }
                              return JSON.stringify(map_1);
                          }
                          return "{\"version\":" + version + ",\"file\":\"" + ts.escapeString(file) + "\",\"sourceRoot\":\"" + ts.escapeString(sourceRoot) + "\",\"sources\":[" + serializeStringArray(sources) + "],\"names\":[" + serializeStringArray(names) + "],\"mappings\":\"" + ts.escapeString(mappings) + "\" " + (sourcesContent !== undefined ? ",\"sourcesContent\":[" + serializeStringArray(sourcesContent) + "]" : "") + "}";
                          function serializeStringArray(list) {
                              var output = "";
                              for (var i = 0, n = list.length; i < n; i++) {
                                  if (i) {
                                      output += ",";
                                  }
                                  output += "\"" + ts.escapeString(list[i]) + "\"";
                              }
                              return output;
                          }
                      }
                      function writeJavaScriptAndSourceMapFile(emitOutput, writeByteOrderMark) {
                          encodeLastRecordedSourceMapSpan();
                          var sourceMapText = serializeSourceMapContents(3, sourceMapData.sourceMapFile, sourceMapData.sourceMapSourceRoot, sourceMapData.sourceMapSources, sourceMapData.sourceMapNames, sourceMapData.sourceMapMappings, sourceMapData.sourceMapSourcesContent);
                          sourceMapDataList.push(sourceMapData);
                          var sourceMapUrl;
                          if (compilerOptions.inlineSourceMap) {
                              var base64SourceMapText = ts.convertToBase64(sourceMapText);
                              sourceMapUrl = "//# sourceMappingURL=data:application/json;base64," + base64SourceMapText;
                          }
                          else {
                              ts.writeFile(host, diagnostics, sourceMapData.sourceMapFilePath, sourceMapText, false);
                              sourceMapUrl = "//# sourceMappingURL=" + sourceMapData.jsSourceMappingURL;
                          }
                          writeJavaScriptFile(emitOutput + sourceMapUrl, writeByteOrderMark);
                      }
                      var sourceMapJsFile = ts.getBaseFileName(ts.normalizeSlashes(jsFilePath));
                      sourceMapData = {
                          sourceMapFilePath: jsFilePath + ".map",
                          jsSourceMappingURL: sourceMapJsFile + ".map",
                          sourceMapFile: sourceMapJsFile,
                          sourceMapSourceRoot: compilerOptions.sourceRoot || "",
                          sourceMapSources: [],
                          inputSourceFileNames: [],
                          sourceMapNames: [],
                          sourceMapMappings: "",
                          sourceMapSourcesContent: undefined,
                          sourceMapDecodedMappings: []
                      };
                      sourceMapData.sourceMapSourceRoot = ts.normalizeSlashes(sourceMapData.sourceMapSourceRoot);
                      if (sourceMapData.sourceMapSourceRoot.length && sourceMapData.sourceMapSourceRoot.charCodeAt(sourceMapData.sourceMapSourceRoot.length - 1) !== 47) {
                          sourceMapData.sourceMapSourceRoot += ts.directorySeparator;
                      }
                      if (compilerOptions.mapRoot) {
                          sourceMapDir = ts.normalizeSlashes(compilerOptions.mapRoot);
                          if (root) {
                              sourceMapDir = ts.getDirectoryPath(ts.getSourceFilePathInNewDir(root, host, sourceMapDir));
                          }
                          if (!ts.isRootedDiskPath(sourceMapDir) && !ts.isUrl(sourceMapDir)) {
                              sourceMapDir = ts.combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
                              sourceMapData.jsSourceMappingURL = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizePath(jsFilePath)), ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL), host.getCurrentDirectory(), host.getCanonicalFileName, true);
                          }
                          else {
                              sourceMapData.jsSourceMappingURL = ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL);
                          }
                      }
                      else {
                          sourceMapDir = ts.getDirectoryPath(ts.normalizePath(jsFilePath));
                      }
                      function emitNodeWithSourceMap(node, allowGeneratedIdentifiers) {
                          if (node) {
                              if (ts.nodeIsSynthesized(node)) {
                                  return emitNodeWithoutSourceMap(node, false);
                              }
                              if (node.kind != 228) {
                                  recordEmitNodeStartSpan(node);
                                  emitNodeWithoutSourceMap(node, allowGeneratedIdentifiers);
                                  recordEmitNodeEndSpan(node);
                              }
                              else {
                                  recordNewSourceFileStart(node);
                                  emitNodeWithoutSourceMap(node, false);
                              }
                          }
                      }
                      writeEmittedFiles = writeJavaScriptAndSourceMapFile;
                      emit = emitNodeWithSourceMap;
                      emitStart = recordEmitNodeStartSpan;
                      emitEnd = recordEmitNodeEndSpan;
                      emitToken = writeTextWithSpanRecord;
                      scopeEmitStart = recordScopeNameOfNode;
                      scopeEmitEnd = recordScopeNameEnd;
                      writeComment = writeCommentRangeWithMap;
                  }
                  function writeJavaScriptFile(emitOutput, writeByteOrderMark) {
                      ts.writeFile(host, diagnostics, jsFilePath, emitOutput, writeByteOrderMark);
                  }
                  function createTempVariable(flags) {
                      var result = ts.createSynthesizedNode(65);
                      result.text = makeTempVariableName(flags);
                      return result;
                  }
                  function recordTempDeclaration(name) {
                      if (!tempVariables) {
                          tempVariables = [];
                      }
                      tempVariables.push(name);
                  }
                  function createAndRecordTempVariable(flags) {
                      var temp = createTempVariable(flags);
                      recordTempDeclaration(temp);
                      return temp;
                  }
                  function emitTempDeclarations(newLine) {
                      if (tempVariables) {
                          if (newLine) {
                              writeLine();
                          }
                          else {
                              write(" ");
                          }
                          write("var ");
                          emitCommaList(tempVariables);
                          write(";");
                      }
                  }
                  function emitTokenText(tokenKind, startPos, emitFn) {
                      var tokenString = ts.tokenToString(tokenKind);
                      if (emitFn) {
                          emitFn();
                      }
                      else {
                          write(tokenString);
                      }
                      return startPos + tokenString.length;
                  }
                  function emitOptional(prefix, node) {
                      if (node) {
                          write(prefix);
                          emit(node);
                      }
                  }
                  function emitParenthesizedIf(node, parenthesized) {
                      if (parenthesized) {
                          write("(");
                      }
                      emit(node);
                      if (parenthesized) {
                          write(")");
                      }
                  }
                  function emitTrailingCommaIfPresent(nodeList) {
                      if (nodeList.hasTrailingComma) {
                          write(",");
                      }
                  }
                  function emitLinePreservingList(parent, nodes, allowTrailingComma, spacesBetweenBraces) {
                      ts.Debug.assert(nodes.length > 0);
                      increaseIndent();
                      if (nodeStartPositionsAreOnSameLine(parent, nodes[0])) {
                          if (spacesBetweenBraces) {
                              write(" ");
                          }
                      }
                      else {
                          writeLine();
                      }
                      for (var i = 0, n = nodes.length; i < n; i++) {
                          if (i) {
                              if (nodeEndIsOnSameLineAsNodeStart(nodes[i - 1], nodes[i])) {
                                  write(", ");
                              }
                              else {
                                  write(",");
                                  writeLine();
                              }
                          }
                          emit(nodes[i]);
                      }
                      if (nodes.hasTrailingComma && allowTrailingComma) {
                          write(",");
                      }
                      decreaseIndent();
                      if (nodeEndPositionsAreOnSameLine(parent, ts.lastOrUndefined(nodes))) {
                          if (spacesBetweenBraces) {
                              write(" ");
                          }
                      }
                      else {
                          writeLine();
                      }
                  }
                  function emitList(nodes, start, count, multiLine, trailingComma, leadingComma, noTrailingNewLine, emitNode) {
                      if (!emitNode) {
                          emitNode = emit;
                      }
                      for (var i = 0; i < count; i++) {
                          if (multiLine) {
                              if (i || leadingComma) {
                                  write(",");
                              }
                              writeLine();
                          }
                          else {
                              if (i || leadingComma) {
                                  write(", ");
                              }
                          }
                          emitNode(nodes[start + i]);
                          leadingComma = true;
                      }
                      if (trailingComma) {
                          write(",");
                      }
                      if (multiLine && !noTrailingNewLine) {
                          writeLine();
                      }
                      return count;
                  }
                  function emitCommaList(nodes) {
                      if (nodes) {
                          emitList(nodes, 0, nodes.length, false, false);
                      }
                  }
                  function emitLines(nodes) {
                      emitLinesStartingAt(nodes, 0);
                  }
                  function emitLinesStartingAt(nodes, startIndex) {
                      for (var i = startIndex; i < nodes.length; i++) {
                          writeLine();
                          emit(nodes[i]);
                      }
                  }
                  function isBinaryOrOctalIntegerLiteral(node, text) {
                      if (node.kind === 7 && text.length > 1) {
                          switch (text.charCodeAt(1)) {
                              case 98:
                              case 66:
                              case 111:
                              case 79:
                                  return true;
                          }
                      }
                      return false;
                  }
                  function emitLiteral(node) {
                      var text = getLiteralText(node);
                      if ((compilerOptions.sourceMap || compilerOptions.inlineSourceMap) && (node.kind === 8 || ts.isTemplateLiteralKind(node.kind))) {
                          writer.writeLiteral(text);
                      }
                      else if (languageVersion < 2 && isBinaryOrOctalIntegerLiteral(node, text)) {
                          write(node.text);
                      }
                      else {
                          write(text);
                      }
                  }
                  function getLiteralText(node) {
                      if (languageVersion < 2 && (ts.isTemplateLiteralKind(node.kind) || node.hasExtendedUnicodeEscape)) {
                          return getQuotedEscapedLiteralText('"', node.text, '"');
                      }
                      if (node.parent) {
                          return ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
                      }
                      switch (node.kind) {
                          case 8:
                              return getQuotedEscapedLiteralText('"', node.text, '"');
                          case 10:
                              return getQuotedEscapedLiteralText('`', node.text, '`');
                          case 11:
                              return getQuotedEscapedLiteralText('`', node.text, '${');
                          case 12:
                              return getQuotedEscapedLiteralText('}', node.text, '${');
                          case 13:
                              return getQuotedEscapedLiteralText('}', node.text, '`');
                          case 7:
                              return node.text;
                      }
                      ts.Debug.fail("Literal kind '" + node.kind + "' not accounted for.");
                  }
                  function getQuotedEscapedLiteralText(leftQuote, text, rightQuote) {
                      return leftQuote + ts.escapeNonAsciiCharacters(ts.escapeString(text)) + rightQuote;
                  }
                  function emitDownlevelRawTemplateLiteral(node) {
                      var text = ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, node);
                      var isLast = node.kind === 10 || node.kind === 13;
                      text = text.substring(1, text.length - (isLast ? 1 : 2));
                      text = text.replace(/\r\n?/g, "\n");
                      text = ts.escapeString(text);
                      write('"' + text + '"');
                  }
                  function emitDownlevelTaggedTemplateArray(node, literalEmitter) {
                      write("[");
                      if (node.template.kind === 10) {
                          literalEmitter(node.template);
                      }
                      else {
                          literalEmitter(node.template.head);
                          ts.forEach(node.template.templateSpans, function (child) {
                              write(", ");
                              literalEmitter(child.literal);
                          });
                      }
                      write("]");
                  }
                  function emitDownlevelTaggedTemplate(node) {
                      var tempVariable = createAndRecordTempVariable(0);
                      write("(");
                      emit(tempVariable);
                      write(" = ");
                      emitDownlevelTaggedTemplateArray(node, emit);
                      write(", ");
                      emit(tempVariable);
                      write(".raw = ");
                      emitDownlevelTaggedTemplateArray(node, emitDownlevelRawTemplateLiteral);
                      write(", ");
                      emitParenthesizedIf(node.tag, needsParenthesisForPropertyAccessOrInvocation(node.tag));
                      write("(");
                      emit(tempVariable);
                      if (node.template.kind === 172) {
                          ts.forEach(node.template.templateSpans, function (templateSpan) {
                              write(", ");
                              var needsParens = templateSpan.expression.kind === 170
                                  && templateSpan.expression.operatorToken.kind === 23;
                              emitParenthesizedIf(templateSpan.expression, needsParens);
                          });
                      }
                      write("))");
                  }
                  function emitTemplateExpression(node) {
                      if (languageVersion >= 2) {
                          ts.forEachChild(node, emit);
                          return;
                      }
                      var emitOuterParens = ts.isExpression(node.parent)
                          && templateNeedsParens(node, node.parent);
                      if (emitOuterParens) {
                          write("(");
                      }
                      var headEmitted = false;
                      if (shouldEmitTemplateHead()) {
                          emitLiteral(node.head);
                          headEmitted = true;
                      }
                      for (var i = 0, n = node.templateSpans.length; i < n; i++) {
                          var templateSpan = node.templateSpans[i];
                          var needsParens = templateSpan.expression.kind !== 162
                              && comparePrecedenceToBinaryPlus(templateSpan.expression) !== 1;
                          if (i > 0 || headEmitted) {
                              write(" + ");
                          }
                          emitParenthesizedIf(templateSpan.expression, needsParens);
                          if (templateSpan.literal.text.length !== 0) {
                              write(" + ");
                              emitLiteral(templateSpan.literal);
                          }
                      }
                      if (emitOuterParens) {
                          write(")");
                      }
                      function shouldEmitTemplateHead() {
                          // If this expression has an empty head literal and the first template span has a non-empty
                          // literal, then emitting the empty head literal is not necessary.
                          //     `${ foo } and ${ bar }`
                          // can be emitted as
                          //     foo + " and " + bar
                          // This is because it is only required that one of the first two operands in the emit
                          // output must be a string literal, so that the other operand and all following operands
                          // are forced into strings.
                          //
                          // If the first template span has an empty literal, then the head must still be emitted.
                          //     `${ foo }${ bar }`
                          // must still be emitted as
                          //     "" + foo + bar
                          ts.Debug.assert(node.templateSpans.length !== 0);
                          return node.head.text.length !== 0 || node.templateSpans[0].literal.text.length === 0;
                      }
                      function templateNeedsParens(template, parent) {
                          switch (parent.kind) {
                              case 158:
                              case 159:
                                  return parent.expression === template;
                              case 160:
                              case 162:
                                  return false;
                              default:
                                  return comparePrecedenceToBinaryPlus(parent) !== -1;
                          }
                      }
                      function comparePrecedenceToBinaryPlus(expression) {
                          switch (expression.kind) {
                              case 170:
                                  switch (expression.operatorToken.kind) {
                                      case 35:
                                      case 36:
                                      case 37:
                                          return 1;
                                      case 33:
                                      case 34:
                                          return 0;
                                      default:
                                          return -1;
                                  }
                              case 173:
                              case 171:
                                  return -1;
                              default:
                                  return 1;
                          }
                      }
                  }
                  function emitTemplateSpan(span) {
                      emit(span.expression);
                      emit(span.literal);
                  }
                  function emitExpressionForPropertyName(node) {
                      ts.Debug.assert(node.kind !== 153);
                      if (node.kind === 8) {
                          emitLiteral(node);
                      }
                      else if (node.kind === 128) {
                          if (ts.nodeIsDecorated(node.parent)) {
                              if (!computedPropertyNamesToGeneratedNames) {
                                  computedPropertyNamesToGeneratedNames = [];
                              }
                              var generatedName = computedPropertyNamesToGeneratedNames[ts.getNodeId(node)];
                              if (generatedName) {
                                  write(generatedName);
                                  return;
                              }
                              generatedName = createAndRecordTempVariable(0).text;
                              computedPropertyNamesToGeneratedNames[ts.getNodeId(node)] = generatedName;
                              write(generatedName);
                              write(" = ");
                          }
                          emit(node.expression);
                      }
                      else {
                          write("\"");
                          if (node.kind === 7) {
                              write(node.text);
                          }
                          else {
                              writeTextOfNode(currentSourceFile, node);
                          }
                          write("\"");
                      }
                  }
                  function isNotExpressionIdentifier(node) {
                      var parent = node.parent;
                      switch (parent.kind) {
                          case 130:
                          case 199:
                          case 153:
                          case 133:
                          case 132:
                          case 225:
                          case 226:
                          case 227:
                          case 135:
                          case 134:
                          case 201:
                          case 137:
                          case 138:
                          case 163:
                          case 202:
                          case 203:
                          case 205:
                          case 206:
                          case 209:
                          case 211:
                          case 212:
                              return parent.name === node;
                          case 214:
                          case 218:
                              return parent.name === node || parent.propertyName === node;
                          case 191:
                          case 190:
                          case 215:
                              return false;
                          case 195:
                              return node.parent.label === node;
                      }
                  }
                  function emitExpressionIdentifier(node) {
                      var substitution = resolver.getExpressionNameSubstitution(node, getGeneratedNameForNode);
                      if (substitution) {
                          write(substitution);
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node);
                      }
                  }
                  function getGeneratedNameForIdentifier(node) {
                      if (ts.nodeIsSynthesized(node) || !blockScopedVariableToGeneratedName) {
                          return undefined;
                      }
                      var variableId = resolver.getBlockScopedVariableId(node);
                      if (variableId === undefined) {
                          return undefined;
                      }
                      return blockScopedVariableToGeneratedName[variableId];
                  }
                  function emitIdentifier(node, allowGeneratedIdentifiers) {
                      if (allowGeneratedIdentifiers) {
                          var generatedName = getGeneratedNameForIdentifier(node);
                          if (generatedName) {
                              write(generatedName);
                              return;
                          }
                      }
                      if (!node.parent) {
                          write(node.text);
                      }
                      else if (!isNotExpressionIdentifier(node)) {
                          emitExpressionIdentifier(node);
                      }
                      else {
                          writeTextOfNode(currentSourceFile, node);
                      }
                  }
                  function emitThis(node) {
                      if (resolver.getNodeCheckFlags(node) & 2) {
                          write("_this");
                      }
                      else {
                          write("this");
                      }
                  }
                  function emitSuper(node) {
                      if (languageVersion >= 2) {
                          write("super");
                      }
                      else {
                          var flags = resolver.getNodeCheckFlags(node);
                          if (flags & 16) {
                              write("_super.prototype");
                          }
                          else {
                              write("_super");
                          }
                      }
                  }
                  function emitObjectBindingPattern(node) {
                      write("{ ");
                      var elements = node.elements;
                      emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
                      write(" }");
                  }
                  function emitArrayBindingPattern(node) {
                      write("[");
                      var elements = node.elements;
                      emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
                      write("]");
                  }
                  function emitBindingElement(node) {
                      if (node.propertyName) {
                          emit(node.propertyName, false);
                          write(": ");
                      }
                      if (node.dotDotDotToken) {
                          write("...");
                      }
                      if (ts.isBindingPattern(node.name)) {
                          emit(node.name);
                      }
                      else {
                          emitModuleMemberName(node);
                      }
                      emitOptional(" = ", node.initializer);
                  }
                  function emitSpreadElementExpression(node) {
                      write("...");
                      emit(node.expression);
                  }
                  function emitYieldExpression(node) {
                      write(ts.tokenToString(110));
                      if (node.asteriskToken) {
                          write("*");
                      }
                      if (node.expression) {
                          write(" ");
                          emit(node.expression);
                      }
                  }
                  function needsParenthesisForPropertyAccessOrInvocation(node) {
                      switch (node.kind) {
                          case 65:
                          case 154:
                          case 156:
                          case 157:
                          case 158:
                          case 162:
                              return false;
                      }
                      return true;
                  }
                  function emitListWithSpread(elements, alwaysCopy, multiLine, trailingComma) {
                      var pos = 0;
                      var group = 0;
                      var length = elements.length;
                      while (pos < length) {
                          if (group === 1) {
                              write(".concat(");
                          }
                          else if (group > 1) {
                              write(", ");
                          }
                          var e = elements[pos];
                          if (e.kind === 174) {
                              e = e.expression;
                              emitParenthesizedIf(e, group === 0 && needsParenthesisForPropertyAccessOrInvocation(e));
                              pos++;
                              if (pos === length && group === 0 && alwaysCopy && e.kind !== 154) {
                                  write(".slice()");
                              }
                          }
                          else {
                              var i = pos;
                              while (i < length && elements[i].kind !== 174) {
                                  i++;
                              }
                              write("[");
                              if (multiLine) {
                                  increaseIndent();
                              }
                              emitList(elements, pos, i - pos, multiLine, trailingComma && i === length);
                              if (multiLine) {
                                  decreaseIndent();
                              }
                              write("]");
                              pos = i;
                          }
                          group++;
                      }
                      if (group > 1) {
                          write(")");
                      }
                  }
                  function isSpreadElementExpression(node) {
                      return node.kind === 174;
                  }
                  function emitArrayLiteral(node) {
                      var elements = node.elements;
                      if (elements.length === 0) {
                          write("[]");
                      }
                      else if (languageVersion >= 2 || !ts.forEach(elements, isSpreadElementExpression)) {
                          write("[");
                          emitLinePreservingList(node, node.elements, elements.hasTrailingComma, false);
                          write("]");
                      }
                      else {
                          emitListWithSpread(elements, true, (node.flags & 512) !== 0, elements.hasTrailingComma);
                      }
                  }
                  function emitObjectLiteralBody(node, numElements) {
                      if (numElements === 0) {
                          write("{}");
                          return;
                      }
                      write("{");
                      if (numElements > 0) {
                          var properties = node.properties;
                          if (numElements === properties.length) {
                              emitLinePreservingList(node, properties, languageVersion >= 1, true);
                          }
                          else {
                              var multiLine = (node.flags & 512) !== 0;
                              if (!multiLine) {
                                  write(" ");
                              }
                              else {
                                  increaseIndent();
                              }
                              emitList(properties, 0, numElements, multiLine, false);
                              if (!multiLine) {
                                  write(" ");
                              }
                              else {
                                  decreaseIndent();
                              }
                          }
                      }
                      write("}");
                  }
                  function emitDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex) {
                      var multiLine = (node.flags & 512) !== 0;
                      var properties = node.properties;
                      write("(");
                      if (multiLine) {
                          increaseIndent();
                      }
                      var tempVar = createAndRecordTempVariable(0);
                      emit(tempVar);
                      write(" = ");
                      emitObjectLiteralBody(node, firstComputedPropertyIndex);
                      for (var i = firstComputedPropertyIndex, n = properties.length; i < n; i++) {
                          writeComma();
                          var property = properties[i];
                          emitStart(property);
                          if (property.kind === 137 || property.kind === 138) {
                              var accessors = ts.getAllAccessorDeclarations(node.properties, property);
                              if (property !== accessors.firstAccessor) {
                                  continue;
                              }
                              write("Object.defineProperty(");
                              emit(tempVar);
                              write(", ");
                              emitStart(node.name);
                              emitExpressionForPropertyName(property.name);
                              emitEnd(property.name);
                              write(", {");
                              increaseIndent();
                              if (accessors.getAccessor) {
                                  writeLine();
                                  emitLeadingComments(accessors.getAccessor);
                                  write("get: ");
                                  emitStart(accessors.getAccessor);
                                  write("function ");
                                  emitSignatureAndBody(accessors.getAccessor);
                                  emitEnd(accessors.getAccessor);
                                  emitTrailingComments(accessors.getAccessor);
                                  write(",");
                              }
                              if (accessors.setAccessor) {
                                  writeLine();
                                  emitLeadingComments(accessors.setAccessor);
                                  write("set: ");
                                  emitStart(accessors.setAccessor);
                                  write("function ");
                                  emitSignatureAndBody(accessors.setAccessor);
                                  emitEnd(accessors.setAccessor);
                                  emitTrailingComments(accessors.setAccessor);
                                  write(",");
                              }
                              writeLine();
                              write("enumerable: true,");
                              writeLine();
                              write("configurable: true");
                              decreaseIndent();
                              writeLine();
                              write("})");
                              emitEnd(property);
                          }
                          else {
                              emitLeadingComments(property);
                              emitStart(property.name);
                              emit(tempVar);
                              emitMemberAccessForPropertyName(property.name);
                              emitEnd(property.name);
                              write(" = ");
                              if (property.kind === 225) {
                                  emit(property.initializer);
                              }
                              else if (property.kind === 226) {
                                  emitExpressionIdentifier(property.name);
                              }
                              else if (property.kind === 135) {
                                  emitFunctionDeclaration(property);
                              }
                              else {
                                  ts.Debug.fail("ObjectLiteralElement type not accounted for: " + property.kind);
                              }
                          }
                          emitEnd(property);
                      }
                      writeComma();
                      emit(tempVar);
                      if (multiLine) {
                          decreaseIndent();
                          writeLine();
                      }
                      write(")");
                      function writeComma() {
                          if (multiLine) {
                              write(",");
                              writeLine();
                          }
                          else {
                              write(", ");
                          }
                      }
                  }
                  function emitObjectLiteral(node) {
                      var properties = node.properties;
                      if (languageVersion < 2) {
                          var numProperties = properties.length;
                          var numInitialNonComputedProperties = numProperties;
                          for (var i = 0, n = properties.length; i < n; i++) {
                              if (properties[i].name.kind === 128) {
                                  numInitialNonComputedProperties = i;
                                  break;
                              }
                          }
                          var hasComputedProperty = numInitialNonComputedProperties !== properties.length;
                          if (hasComputedProperty) {
                              emitDownlevelObjectLiteralWithComputedProperties(node, numInitialNonComputedProperties);
                              return;
                          }
                      }
                      emitObjectLiteralBody(node, properties.length);
                  }
                  function createBinaryExpression(left, operator, right, startsOnNewLine) {
                      var result = ts.createSynthesizedNode(170, startsOnNewLine);
                      result.operatorToken = ts.createSynthesizedNode(operator);
                      result.left = left;
                      result.right = right;
                      return result;
                  }
                  function createPropertyAccessExpression(expression, name) {
                      var result = ts.createSynthesizedNode(156);
                      result.expression = parenthesizeForAccess(expression);
                      result.dotToken = ts.createSynthesizedNode(20);
                      result.name = name;
                      return result;
                  }
                  function createElementAccessExpression(expression, argumentExpression) {
                      var result = ts.createSynthesizedNode(157);
                      result.expression = parenthesizeForAccess(expression);
                      result.argumentExpression = argumentExpression;
                      return result;
                  }
                  function parenthesizeForAccess(expr) {
                      if (ts.isLeftHandSideExpression(expr) && expr.kind !== 159 && expr.kind !== 7) {
                          return expr;
                      }
                      var node = ts.createSynthesizedNode(162);
                      node.expression = expr;
                      return node;
                  }
                  function emitComputedPropertyName(node) {
                      write("[");
                      emitExpressionForPropertyName(node);
                      write("]");
                  }
                  function emitMethod(node) {
                      if (languageVersion >= 2 && node.asteriskToken) {
                          write("*");
                      }
                      emit(node.name, false);
                      if (languageVersion < 2) {
                          write(": function ");
                      }
                      emitSignatureAndBody(node);
                  }
                  function emitPropertyAssignment(node) {
                      emit(node.name, false);
                      write(": ");
                      emit(node.initializer);
                  }
                  function emitShorthandPropertyAssignment(node) {
                      emit(node.name, false);
                      if (languageVersion < 2) {
                          write(": ");
                          var generatedName = getGeneratedNameForIdentifier(node.name);
                          if (generatedName) {
                              write(generatedName);
                          }
                          else {
                              emitExpressionIdentifier(node.name);
                          }
                      }
                      else if (resolver.getExpressionNameSubstitution(node.name, getGeneratedNameForNode)) {
                          write(": ");
                          emitExpressionIdentifier(node.name);
                      }
                  }
                  function tryEmitConstantValue(node) {
                      if (compilerOptions.separateCompilation) {
                          return false;
                      }
                      var constantValue = resolver.getConstantValue(node);
                      if (constantValue !== undefined) {
                          write(constantValue.toString());
                          if (!compilerOptions.removeComments) {
                              var propertyName = node.kind === 156 ? ts.declarationNameToString(node.name) : ts.getTextOfNode(node.argumentExpression);
                              write(" /* " + propertyName + " */");
                          }
                          return true;
                      }
                      return false;
                  }
                  function indentIfOnDifferentLines(parent, node1, node2, valueToWriteWhenNotIndenting) {
                      var realNodesAreOnDifferentLines = !ts.nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2);
                      var synthesizedNodeIsOnDifferentLine = synthesizedNodeStartsOnNewLine(node2);
                      if (realNodesAreOnDifferentLines || synthesizedNodeIsOnDifferentLine) {
                          increaseIndent();
                          writeLine();
                          return true;
                      }
                      else {
                          if (valueToWriteWhenNotIndenting) {
                              write(valueToWriteWhenNotIndenting);
                          }
                          return false;
                      }
                  }
                  function emitPropertyAccess(node) {
                      if (tryEmitConstantValue(node)) {
                          return;
                      }
                      emit(node.expression);
                      var indentedBeforeDot = indentIfOnDifferentLines(node, node.expression, node.dotToken);
                      write(".");
                      var indentedAfterDot = indentIfOnDifferentLines(node, node.dotToken, node.name);
                      emit(node.name, false);
                      decreaseIndentIf(indentedBeforeDot, indentedAfterDot);
                  }
                  function emitQualifiedName(node) {
                      emit(node.left);
                      write(".");
                      emit(node.right);
                  }
                  function emitIndexedAccess(node) {
                      if (tryEmitConstantValue(node)) {
                          return;
                      }
                      emit(node.expression);
                      write("[");
                      emit(node.argumentExpression);
                      write("]");
                  }
                  function hasSpreadElement(elements) {
                      return ts.forEach(elements, function (e) { return e.kind === 174; });
                  }
                  function skipParentheses(node) {
                      while (node.kind === 162 || node.kind === 161) {
                          node = node.expression;
                      }
                      return node;
                  }
                  function emitCallTarget(node) {
                      if (node.kind === 65 || node.kind === 93 || node.kind === 91) {
                          emit(node);
                          return node;
                      }
                      var temp = createAndRecordTempVariable(0);
                      write("(");
                      emit(temp);
                      write(" = ");
                      emit(node);
                      write(")");
                      return temp;
                  }
                  function emitCallWithSpread(node) {
                      var target;
                      var expr = skipParentheses(node.expression);
                      if (expr.kind === 156) {
                          target = emitCallTarget(expr.expression);
                          write(".");
                          emit(expr.name);
                      }
                      else if (expr.kind === 157) {
                          target = emitCallTarget(expr.expression);
                          write("[");
                          emit(expr.argumentExpression);
                          write("]");
                      }
                      else if (expr.kind === 91) {
                          target = expr;
                          write("_super");
                      }
                      else {
                          emit(node.expression);
                      }
                      write(".apply(");
                      if (target) {
                          if (target.kind === 91) {
                              emitThis(target);
                          }
                          else {
                              emit(target);
                          }
                      }
                      else {
                          write("void 0");
                      }
                      write(", ");
                      emitListWithSpread(node.arguments, false, false, false);
                      write(")");
                  }
                  function emitCallExpression(node) {
                      if (languageVersion < 2 && hasSpreadElement(node.arguments)) {
                          emitCallWithSpread(node);
                          return;
                      }
                      var superCall = false;
                      if (node.expression.kind === 91) {
                          emitSuper(node.expression);
                          superCall = true;
                      }
                      else {
                          emit(node.expression);
                          superCall = node.expression.kind === 156 && node.expression.expression.kind === 91;
                      }
                      if (superCall && languageVersion < 2) {
                          write(".call(");
                          emitThis(node.expression);
                          if (node.arguments.length) {
                              write(", ");
                              emitCommaList(node.arguments);
                          }
                          write(")");
                      }
                      else {
                          write("(");
                          emitCommaList(node.arguments);
                          write(")");
                      }
                  }
                  function emitNewExpression(node) {
                      write("new ");
                      emit(node.expression);
                      if (node.arguments) {
                          write("(");
                          emitCommaList(node.arguments);
                          write(")");
                      }
                  }
                  function emitTaggedTemplateExpression(node) {
                      if (languageVersion >= 2) {
                          emit(node.tag);
                          write(" ");
                          emit(node.template);
                      }
                      else {
                          emitDownlevelTaggedTemplate(node);
                      }
                  }
                  function emitParenExpression(node) {
                      if (!node.parent || node.parent.kind !== 164) {
                          if (node.expression.kind === 161) {
                              var operand = node.expression.expression;
                              while (operand.kind == 161) {
                                  operand = operand.expression;
                              }
                              if (operand.kind !== 168 &&
                                  operand.kind !== 167 &&
                                  operand.kind !== 166 &&
                                  operand.kind !== 165 &&
                                  operand.kind !== 169 &&
                                  operand.kind !== 159 &&
                                  !(operand.kind === 158 && node.parent.kind === 159) &&
                                  !(operand.kind === 163 && node.parent.kind === 158)) {
                                  emit(operand);
                                  return;
                              }
                          }
                      }
                      write("(");
                      emit(node.expression);
                      write(")");
                  }
                  function emitDeleteExpression(node) {
                      write(ts.tokenToString(74));
                      write(" ");
                      emit(node.expression);
                  }
                  function emitVoidExpression(node) {
                      write(ts.tokenToString(99));
                      write(" ");
                      emit(node.expression);
                  }
                  function emitTypeOfExpression(node) {
                      write(ts.tokenToString(97));
                      write(" ");
                      emit(node.expression);
                  }
                  function isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node) {
                      if (!isCurrentFileSystemExternalModule() || node.kind !== 65 || ts.nodeIsSynthesized(node)) {
                          return false;
                      }
                      var isVariableDeclarationOrBindingElement = node.parent && (node.parent.kind === 199 || node.parent.kind === 153);
                      var targetDeclaration = isVariableDeclarationOrBindingElement
                          ? node.parent
                          : resolver.getReferencedValueDeclaration(node);
                      return isSourceFileLevelDeclarationInSystemJsModule(targetDeclaration, true);
                  }
                  function emitPrefixUnaryExpression(node) {
                      var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
                      if (exportChanged) {
                          write(exportFunctionForFile + "(\"");
                          emitNodeWithoutSourceMap(node.operand);
                          write("\", ");
                      }
                      write(ts.tokenToString(node.operator));
                      if (node.operand.kind === 168) {
                          var operand = node.operand;
                          if (node.operator === 33 && (operand.operator === 33 || operand.operator === 38)) {
                              write(" ");
                          }
                          else if (node.operator === 34 && (operand.operator === 34 || operand.operator === 39)) {
                              write(" ");
                          }
                      }
                      emit(node.operand);
                      if (exportChanged) {
                          write(")");
                      }
                  }
                  function emitPostfixUnaryExpression(node) {
                      var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
                      if (exportChanged) {
                          write("(" + exportFunctionForFile + "(\"");
                          emitNodeWithoutSourceMap(node.operand);
                          write("\", ");
                          write(ts.tokenToString(node.operator));
                          emit(node.operand);
                          if (node.operator === 38) {
                              write(") - 1)");
                          }
                          else {
                              write(") + 1)");
                          }
                      }
                      else {
                          emit(node.operand);
                          write(ts.tokenToString(node.operator));
                      }
                  }
                  function shouldHoistDeclarationInSystemJsModule(node) {
                      return isSourceFileLevelDeclarationInSystemJsModule(node, false);
                  }
                  function isSourceFileLevelDeclarationInSystemJsModule(node, isExported) {
                      if (!node || languageVersion >= 2 || !isCurrentFileSystemExternalModule()) {
                          return false;
                      }
                      var current = node;
                      while (current) {
                          if (current.kind === 228) {
                              return !isExported || ((ts.getCombinedNodeFlags(node) & 1) !== 0);
                          }
                          else if (ts.isFunctionLike(current) || current.kind === 207) {
                              return false;
                          }
                          else {
                              current = current.parent;
                          }
                      }
                  }
                  function emitBinaryExpression(node) {
                      if (languageVersion < 2 && node.operatorToken.kind === 53 &&
                          (node.left.kind === 155 || node.left.kind === 154)) {
                          emitDestructuring(node, node.parent.kind === 183);
                      }
                      else {
                          var exportChanged = node.operatorToken.kind >= 53 &&
                              node.operatorToken.kind <= 64 &&
                              isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.left);
                          if (exportChanged) {
                              write(exportFunctionForFile + "(\"");
                              emitNodeWithoutSourceMap(node.left);
                              write("\", ");
                          }
                          emit(node.left);
                          var indentedBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== 23 ? " " : undefined);
                          write(ts.tokenToString(node.operatorToken.kind));
                          var indentedAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " ");
                          emit(node.right);
                          decreaseIndentIf(indentedBeforeOperator, indentedAfterOperator);
                          if (exportChanged) {
                              write(")");
                          }
                      }
                  }
                  function synthesizedNodeStartsOnNewLine(node) {
                      return ts.nodeIsSynthesized(node) && node.startsOnNewLine;
                  }
                  function emitConditionalExpression(node) {
                      emit(node.condition);
                      var indentedBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " ");
                      write("?");
                      var indentedAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " ");
                      emit(node.whenTrue);
                      decreaseIndentIf(indentedBeforeQuestion, indentedAfterQuestion);
                      var indentedBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " ");
                      write(":");
                      var indentedAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " ");
                      emit(node.whenFalse);
                      decreaseIndentIf(indentedBeforeColon, indentedAfterColon);
                  }
                  function decreaseIndentIf(value1, value2) {
                      if (value1) {
                          decreaseIndent();
                      }
                      if (value2) {
                          decreaseIndent();
                      }
                  }
                  function isSingleLineEmptyBlock(node) {
                      if (node && node.kind === 180) {
                          var block = node;
                          return block.statements.length === 0 && nodeEndIsOnSameLineAsNodeStart(block, block);
                      }
                  }
                  function emitBlock(node) {
                      if (isSingleLineEmptyBlock(node)) {
                          emitToken(14, node.pos);
                          write(" ");
                          emitToken(15, node.statements.end);
                          return;
                      }
                      emitToken(14, node.pos);
                      increaseIndent();
                      scopeEmitStart(node.parent);
                      if (node.kind === 207) {
                          ts.Debug.assert(node.parent.kind === 206);
                          emitCaptureThisForNodeIfNecessary(node.parent);
                      }
                      emitLines(node.statements);
                      if (node.kind === 207) {
                          emitTempDeclarations(true);
                      }
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.statements.end);
                      scopeEmitEnd();
                  }
                  function emitEmbeddedStatement(node) {
                      if (node.kind === 180) {
                          write(" ");
                          emit(node);
                      }
                      else {
                          increaseIndent();
                          writeLine();
                          emit(node);
                          decreaseIndent();
                      }
                  }
                  function emitExpressionStatement(node) {
                      emitParenthesizedIf(node.expression, node.expression.kind === 164);
                      write(";");
                  }
                  function emitIfStatement(node) {
                      var endPos = emitToken(84, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      emit(node.expression);
                      emitToken(17, node.expression.end);
                      emitEmbeddedStatement(node.thenStatement);
                      if (node.elseStatement) {
                          writeLine();
                          emitToken(76, node.thenStatement.end);
                          if (node.elseStatement.kind === 184) {
                              write(" ");
                              emit(node.elseStatement);
                          }
                          else {
                              emitEmbeddedStatement(node.elseStatement);
                          }
                      }
                  }
                  function emitDoStatement(node) {
                      write("do");
                      emitEmbeddedStatement(node.statement);
                      if (node.statement.kind === 180) {
                          write(" ");
                      }
                      else {
                          writeLine();
                      }
                      write("while (");
                      emit(node.expression);
                      write(");");
                  }
                  function emitWhileStatement(node) {
                      write("while (");
                      emit(node.expression);
                      write(")");
                      emitEmbeddedStatement(node.statement);
                  }
                  function tryEmitStartOfVariableDeclarationList(decl, startPos) {
                      if (shouldHoistVariable(decl, true)) {
                          return false;
                      }
                      var tokenKind = 98;
                      if (decl && languageVersion >= 2) {
                          if (ts.isLet(decl)) {
                              tokenKind = 104;
                          }
                          else if (ts.isConst(decl)) {
                              tokenKind = 70;
                          }
                      }
                      if (startPos !== undefined) {
                          emitToken(tokenKind, startPos);
                          write(" ");
                      }
                      else {
                          switch (tokenKind) {
                              case 98:
                                  write("var ");
                                  break;
                              case 104:
                                  write("let ");
                                  break;
                              case 70:
                                  write("const ");
                                  break;
                          }
                      }
                      return true;
                  }
                  function emitVariableDeclarationListSkippingUninitializedEntries(list) {
                      var started = false;
                      for (var _a = 0, _b = list.declarations; _a < _b.length; _a++) {
                          var decl = _b[_a];
                          if (!decl.initializer) {
                              continue;
                          }
                          if (!started) {
                              started = true;
                          }
                          else {
                              write(", ");
                          }
                          emit(decl);
                      }
                      return started;
                  }
                  function emitForStatement(node) {
                      var endPos = emitToken(82, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      if (node.initializer && node.initializer.kind === 200) {
                          var variableDeclarationList = node.initializer;
                          var startIsEmitted = tryEmitStartOfVariableDeclarationList(variableDeclarationList, endPos);
                          if (startIsEmitted) {
                              emitCommaList(variableDeclarationList.declarations);
                          }
                          else {
                              emitVariableDeclarationListSkippingUninitializedEntries(variableDeclarationList);
                          }
                      }
                      else if (node.initializer) {
                          emit(node.initializer);
                      }
                      write(";");
                      emitOptional(" ", node.condition);
                      write(";");
                      emitOptional(" ", node.incrementor);
                      write(")");
                      emitEmbeddedStatement(node.statement);
                  }
                  function emitForInOrForOfStatement(node) {
                      if (languageVersion < 2 && node.kind === 189) {
                          return emitDownLevelForOfStatement(node);
                      }
                      var endPos = emitToken(82, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      if (node.initializer.kind === 200) {
                          var variableDeclarationList = node.initializer;
                          if (variableDeclarationList.declarations.length >= 1) {
                              tryEmitStartOfVariableDeclarationList(variableDeclarationList, endPos);
                              emit(variableDeclarationList.declarations[0]);
                          }
                      }
                      else {
                          emit(node.initializer);
                      }
                      if (node.kind === 188) {
                          write(" in ");
                      }
                      else {
                          write(" of ");
                      }
                      emit(node.expression);
                      emitToken(17, node.expression.end);
                      emitEmbeddedStatement(node.statement);
                  }
                  function emitDownLevelForOfStatement(node) {
                      // The following ES6 code:
                      //
                      //    for (let v of expr) { }
                      //
                      // should be emitted as
                      //
                      //    for (let _i = 0, _a = expr; _i < _a.length; _i++) {
                      //        let v = _a[_i];
                      //    }
                      //
                      // where _a and _i are temps emitted to capture the RHS and the counter,
                      // respectively.
                      // When the left hand side is an expression instead of a let declaration,
                      // the "let v" is not emitted.
                      // When the left hand side is a let/const, the v is renamed if there is
                      // another v in scope.
                      // Note that all assignments to the LHS are emitted in the body, including
                      // all destructuring.
                      // Note also that because an extra statement is needed to assign to the LHS,
                      // for-of bodies are always emitted as blocks.
                      var endPos = emitToken(82, node.pos);
                      write(" ");
                      endPos = emitToken(16, endPos);
                      var rhsIsIdentifier = node.expression.kind === 65;
                      var counter = createTempVariable(268435456);
                      var rhsReference = rhsIsIdentifier ? node.expression : createTempVariable(0);
                      emitStart(node.expression);
                      write("var ");
                      emitNodeWithoutSourceMap(counter);
                      write(" = 0");
                      emitEnd(node.expression);
                      if (!rhsIsIdentifier) {
                          write(", ");
                          emitStart(node.expression);
                          emitNodeWithoutSourceMap(rhsReference);
                          write(" = ");
                          emitNodeWithoutSourceMap(node.expression);
                          emitEnd(node.expression);
                      }
                      write("; ");
                      emitStart(node.initializer);
                      emitNodeWithoutSourceMap(counter);
                      write(" < ");
                      emitNodeWithoutSourceMap(rhsReference);
                      write(".length");
                      emitEnd(node.initializer);
                      write("; ");
                      emitStart(node.initializer);
                      emitNodeWithoutSourceMap(counter);
                      write("++");
                      emitEnd(node.initializer);
                      emitToken(17, node.expression.end);
                      write(" {");
                      writeLine();
                      increaseIndent();
                      var rhsIterationValue = createElementAccessExpression(rhsReference, counter);
                      emitStart(node.initializer);
                      if (node.initializer.kind === 200) {
                          write("var ");
                          var variableDeclarationList = node.initializer;
                          if (variableDeclarationList.declarations.length > 0) {
                              var declaration = variableDeclarationList.declarations[0];
                              if (ts.isBindingPattern(declaration.name)) {
                                  emitDestructuring(declaration, false, rhsIterationValue);
                              }
                              else {
                                  emitNodeWithoutSourceMap(declaration);
                                  write(" = ");
                                  emitNodeWithoutSourceMap(rhsIterationValue);
                              }
                          }
                          else {
                              emitNodeWithoutSourceMap(createTempVariable(0));
                              write(" = ");
                              emitNodeWithoutSourceMap(rhsIterationValue);
                          }
                      }
                      else {
                          var assignmentExpression = createBinaryExpression(node.initializer, 53, rhsIterationValue, false);
                          if (node.initializer.kind === 154 || node.initializer.kind === 155) {
                              emitDestructuring(assignmentExpression, true, undefined);
                          }
                          else {
                              emitNodeWithoutSourceMap(assignmentExpression);
                          }
                      }
                      emitEnd(node.initializer);
                      write(";");
                      if (node.statement.kind === 180) {
                          emitLines(node.statement.statements);
                      }
                      else {
                          writeLine();
                          emit(node.statement);
                      }
                      writeLine();
                      decreaseIndent();
                      write("}");
                  }
                  function emitBreakOrContinueStatement(node) {
                      emitToken(node.kind === 191 ? 66 : 71, node.pos);
                      emitOptional(" ", node.label);
                      write(";");
                  }
                  function emitReturnStatement(node) {
                      emitToken(90, node.pos);
                      emitOptional(" ", node.expression);
                      write(";");
                  }
                  function emitWithStatement(node) {
                      write("with (");
                      emit(node.expression);
                      write(")");
                      emitEmbeddedStatement(node.statement);
                  }
                  function emitSwitchStatement(node) {
                      var endPos = emitToken(92, node.pos);
                      write(" ");
                      emitToken(16, endPos);
                      emit(node.expression);
                      endPos = emitToken(17, node.expression.end);
                      write(" ");
                      emitCaseBlock(node.caseBlock, endPos);
                  }
                  function emitCaseBlock(node, startPos) {
                      emitToken(14, startPos);
                      increaseIndent();
                      emitLines(node.clauses);
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.clauses.end);
                  }
                  function nodeStartPositionsAreOnSameLine(node1, node2) {
                      return ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node1.pos)) ===
                          ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node2.pos));
                  }
                  function nodeEndPositionsAreOnSameLine(node1, node2) {
                      return ts.getLineOfLocalPosition(currentSourceFile, node1.end) ===
                          ts.getLineOfLocalPosition(currentSourceFile, node2.end);
                  }
                  function nodeEndIsOnSameLineAsNodeStart(node1, node2) {
                      return ts.getLineOfLocalPosition(currentSourceFile, node1.end) ===
                          ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node2.pos));
                  }
                  function emitCaseOrDefaultClause(node) {
                      if (node.kind === 221) {
                          write("case ");
                          emit(node.expression);
                          write(":");
                      }
                      else {
                          write("default:");
                      }
                      if (node.statements.length === 1 && nodeStartPositionsAreOnSameLine(node, node.statements[0])) {
                          write(" ");
                          emit(node.statements[0]);
                      }
                      else {
                          increaseIndent();
                          emitLines(node.statements);
                          decreaseIndent();
                      }
                  }
                  function emitThrowStatement(node) {
                      write("throw ");
                      emit(node.expression);
                      write(";");
                  }
                  function emitTryStatement(node) {
                      write("try ");
                      emit(node.tryBlock);
                      emit(node.catchClause);
                      if (node.finallyBlock) {
                          writeLine();
                          write("finally ");
                          emit(node.finallyBlock);
                      }
                  }
                  function emitCatchClause(node) {
                      writeLine();
                      var endPos = emitToken(68, node.pos);
                      write(" ");
                      emitToken(16, endPos);
                      emit(node.variableDeclaration);
                      emitToken(17, node.variableDeclaration ? node.variableDeclaration.end : endPos);
                      write(" ");
                      emitBlock(node.block);
                  }
                  function emitDebuggerStatement(node) {
                      emitToken(72, node.pos);
                      write(";");
                  }
                  function emitLabelledStatement(node) {
                      emit(node.label);
                      write(": ");
                      emit(node.statement);
                  }
                  function getContainingModule(node) {
                      do {
                          node = node.parent;
                      } while (node && node.kind !== 206);
                      return node;
                  }
                  function emitContainingModuleName(node) {
                      var container = getContainingModule(node);
                      write(container ? getGeneratedNameForNode(container) : "exports");
                  }
                  function emitModuleMemberName(node) {
                      emitStart(node.name);
                      if (ts.getCombinedNodeFlags(node) & 1) {
                          var container = getContainingModule(node);
                          if (container) {
                              write(getGeneratedNameForNode(container));
                              write(".");
                          }
                          else if (languageVersion < 2 && compilerOptions.module !== 4) {
                              write("exports.");
                          }
                      }
                      emitNodeWithoutSourceMap(node.name);
                      emitEnd(node.name);
                  }
                  function createVoidZero() {
                      var zero = ts.createSynthesizedNode(7);
                      zero.text = "0";
                      var result = ts.createSynthesizedNode(167);
                      result.expression = zero;
                      return result;
                  }
                  function emitExportMemberAssignment(node) {
                      if (node.flags & 1) {
                          writeLine();
                          emitStart(node);
                          if (compilerOptions.module === 4 && node.parent === currentSourceFile) {
                              write(exportFunctionForFile + "(\"");
                              if (node.flags & 256) {
                                  write("default");
                              }
                              else {
                                  emitNodeWithoutSourceMap(node.name);
                              }
                              write("\", ");
                              emitDeclarationName(node);
                              write(")");
                          }
                          else {
                              if (node.flags & 256) {
                                  if (languageVersion === 0) {
                                      write("exports[\"default\"]");
                                  }
                                  else {
                                      write("exports.default");
                                  }
                              }
                              else {
                                  emitModuleMemberName(node);
                              }
                              write(" = ");
                              emitDeclarationName(node);
                          }
                          emitEnd(node);
                          write(";");
                      }
                  }
                  function emitExportMemberAssignments(name) {
                      if (!exportEquals && exportSpecifiers && ts.hasProperty(exportSpecifiers, name.text)) {
                          for (var _a = 0, _b = exportSpecifiers[name.text]; _a < _b.length; _a++) {
                              var specifier = _b[_a];
                              writeLine();
                              if (compilerOptions.module === 4) {
                                  emitStart(specifier.name);
                                  write(exportFunctionForFile + "(\"");
                                  emitNodeWithoutSourceMap(specifier.name);
                                  write("\", ");
                                  emitExpressionIdentifier(name);
                                  write(")");
                                  emitEnd(specifier.name);
                              }
                              else {
                                  emitStart(specifier.name);
                                  emitContainingModuleName(specifier);
                                  write(".");
                                  emitNodeWithoutSourceMap(specifier.name);
                                  emitEnd(specifier.name);
                                  write(" = ");
                                  emitExpressionIdentifier(name);
                              }
                              write(";");
                          }
                      }
                  }
                  function emitDestructuring(root, isAssignmentExpressionStatement, value) {
                      var emitCount = 0;
                      var canDefineTempVariablesInPlace = false;
                      if (root.kind === 199) {
                          var isExported = ts.getCombinedNodeFlags(root) & 1;
                          var isSourceLevelForSystemModuleKind = shouldHoistDeclarationInSystemJsModule(root);
                          canDefineTempVariablesInPlace = !isExported && !isSourceLevelForSystemModuleKind;
                      }
                      else if (root.kind === 130) {
                          canDefineTempVariablesInPlace = true;
                      }
                      if (root.kind === 170) {
                          emitAssignmentExpression(root);
                      }
                      else {
                          ts.Debug.assert(!isAssignmentExpressionStatement);
                          emitBindingElement(root, value);
                      }
                      function emitAssignment(name, value) {
                          if (emitCount++) {
                              write(", ");
                          }
                          renameNonTopLevelLetAndConst(name);
                          var isVariableDeclarationOrBindingElement = name.parent && (name.parent.kind === 199 || name.parent.kind === 153);
                          var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(name);
                          if (exportChanged) {
                              write(exportFunctionForFile + "(\"");
                              emitNodeWithoutSourceMap(name);
                              write("\", ");
                          }
                          if (isVariableDeclarationOrBindingElement) {
                              emitModuleMemberName(name.parent);
                          }
                          else {
                              emit(name);
                          }
                          write(" = ");
                          emit(value);
                          if (exportChanged) {
                              write(")");
                          }
                      }
                      function ensureIdentifier(expr) {
                          if (expr.kind !== 65) {
                              var identifier = createTempVariable(0);
                              if (!canDefineTempVariablesInPlace) {
                                  recordTempDeclaration(identifier);
                              }
                              emitAssignment(identifier, expr);
                              expr = identifier;
                          }
                          return expr;
                      }
                      function createDefaultValueCheck(value, defaultValue) {
                          value = ensureIdentifier(value);
                          var equals = ts.createSynthesizedNode(170);
                          equals.left = value;
                          equals.operatorToken = ts.createSynthesizedNode(30);
                          equals.right = createVoidZero();
                          return createConditionalExpression(equals, defaultValue, value);
                      }
                      function createConditionalExpression(condition, whenTrue, whenFalse) {
                          var cond = ts.createSynthesizedNode(171);
                          cond.condition = condition;
                          cond.questionToken = ts.createSynthesizedNode(50);
                          cond.whenTrue = whenTrue;
                          cond.colonToken = ts.createSynthesizedNode(51);
                          cond.whenFalse = whenFalse;
                          return cond;
                      }
                      function createNumericLiteral(value) {
                          var node = ts.createSynthesizedNode(7);
                          node.text = "" + value;
                          return node;
                      }
                      function createPropertyAccessForDestructuringProperty(object, propName) {
                          if (propName.kind !== 65) {
                              return createElementAccessExpression(object, propName);
                          }
                          return createPropertyAccessExpression(object, propName);
                      }
                      function createSliceCall(value, sliceIndex) {
                          var call = ts.createSynthesizedNode(158);
                          var sliceIdentifier = ts.createSynthesizedNode(65);
                          sliceIdentifier.text = "slice";
                          call.expression = createPropertyAccessExpression(value, sliceIdentifier);
                          call.arguments = ts.createSynthesizedNodeArray();
                          call.arguments[0] = createNumericLiteral(sliceIndex);
                          return call;
                      }
                      function emitObjectLiteralAssignment(target, value) {
                          var properties = target.properties;
                          if (properties.length !== 1) {
                              value = ensureIdentifier(value);
                          }
                          for (var _a = 0; _a < properties.length; _a++) {
                              var p = properties[_a];
                              if (p.kind === 225 || p.kind === 226) {
                                  var propName = (p.name);
                                  emitDestructuringAssignment(p.initializer || propName, createPropertyAccessForDestructuringProperty(value, propName));
                              }
                          }
                      }
                      function emitArrayLiteralAssignment(target, value) {
                          var elements = target.elements;
                          if (elements.length !== 1) {
                              value = ensureIdentifier(value);
                          }
                          for (var i = 0; i < elements.length; i++) {
                              var e = elements[i];
                              if (e.kind !== 176) {
                                  if (e.kind !== 174) {
                                      emitDestructuringAssignment(e, createElementAccessExpression(value, createNumericLiteral(i)));
                                  }
                                  else if (i === elements.length - 1) {
                                      emitDestructuringAssignment(e.expression, createSliceCall(value, i));
                                  }
                              }
                          }
                      }
                      function emitDestructuringAssignment(target, value) {
                          if (target.kind === 170 && target.operatorToken.kind === 53) {
                              value = createDefaultValueCheck(value, target.right);
                              target = target.left;
                          }
                          if (target.kind === 155) {
                              emitObjectLiteralAssignment(target, value);
                          }
                          else if (target.kind === 154) {
                              emitArrayLiteralAssignment(target, value);
                          }
                          else {
                              emitAssignment(target, value);
                          }
                      }
                      function emitAssignmentExpression(root) {
                          var target = root.left;
                          var value = root.right;
                          if (isAssignmentExpressionStatement) {
                              emitDestructuringAssignment(target, value);
                          }
                          else {
                              if (root.parent.kind !== 162) {
                                  write("(");
                              }
                              value = ensureIdentifier(value);
                              emitDestructuringAssignment(target, value);
                              write(", ");
                              emit(value);
                              if (root.parent.kind !== 162) {
                                  write(")");
                              }
                          }
                      }
                      function emitBindingElement(target, value) {
                          if (target.initializer) {
                              value = value ? createDefaultValueCheck(value, target.initializer) : target.initializer;
                          }
                          else if (!value) {
                              value = createVoidZero();
                          }
                          if (ts.isBindingPattern(target.name)) {
                              var pattern = target.name;
                              var elements = pattern.elements;
                              if (elements.length !== 1) {
                                  value = ensureIdentifier(value);
                              }
                              for (var i = 0; i < elements.length; i++) {
                                  var element = elements[i];
                                  if (pattern.kind === 151) {
                                      var propName = element.propertyName || element.name;
                                      emitBindingElement(element, createPropertyAccessForDestructuringProperty(value, propName));
                                  }
                                  else if (element.kind !== 176) {
                                      if (!element.dotDotDotToken) {
                                          emitBindingElement(element, createElementAccessExpression(value, createNumericLiteral(i)));
                                      }
                                      else if (i === elements.length - 1) {
                                          emitBindingElement(element, createSliceCall(value, i));
                                      }
                                  }
                              }
                          }
                          else {
                              emitAssignment(target.name, value);
                          }
                      }
                  }
                  function emitVariableDeclaration(node) {
                      if (ts.isBindingPattern(node.name)) {
                          if (languageVersion < 2) {
                              emitDestructuring(node, false);
                          }
                          else {
                              emit(node.name);
                              emitOptional(" = ", node.initializer);
                          }
                      }
                      else {
                          renameNonTopLevelLetAndConst(node.name);
                          var initializer = node.initializer;
                          if (!initializer && languageVersion < 2) {
                              var isUninitializedLet = (resolver.getNodeCheckFlags(node) & 256) &&
                                  (getCombinedFlagsForIdentifier(node.name) & 4096);
                              if (isUninitializedLet &&
                                  node.parent.parent.kind !== 188 &&
                                  node.parent.parent.kind !== 189) {
                                  initializer = createVoidZero();
                              }
                          }
                          var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.name);
                          if (exportChanged) {
                              write(exportFunctionForFile + "(\"");
                              emitNodeWithoutSourceMap(node.name);
                              write("\", ");
                          }
                          emitModuleMemberName(node);
                          emitOptional(" = ", initializer);
                          if (exportChanged) {
                              write(")");
                          }
                      }
                  }
                  function emitExportVariableAssignments(node) {
                      if (node.kind === 176) {
                          return;
                      }
                      var name = node.name;
                      if (name.kind === 65) {
                          emitExportMemberAssignments(name);
                      }
                      else if (ts.isBindingPattern(name)) {
                          ts.forEach(name.elements, emitExportVariableAssignments);
                      }
                  }
                  function getCombinedFlagsForIdentifier(node) {
                      if (!node.parent || (node.parent.kind !== 199 && node.parent.kind !== 153)) {
                          return 0;
                      }
                      return ts.getCombinedNodeFlags(node.parent);
                  }
                  function renameNonTopLevelLetAndConst(node) {
                      if (languageVersion >= 2 ||
                          ts.nodeIsSynthesized(node) ||
                          node.kind !== 65 ||
                          (node.parent.kind !== 199 && node.parent.kind !== 153)) {
                          return;
                      }
                      var combinedFlags = getCombinedFlagsForIdentifier(node);
                      if (((combinedFlags & 12288) === 0) || combinedFlags & 1) {
                          return;
                      }
                      var list = ts.getAncestor(node, 200);
                      if (list.parent.kind === 181) {
                          var isSourceFileLevelBinding = list.parent.parent.kind === 228;
                          var isModuleLevelBinding = list.parent.parent.kind === 207;
                          var isFunctionLevelBinding = list.parent.parent.kind === 180 && ts.isFunctionLike(list.parent.parent.parent);
                          if (isSourceFileLevelBinding || isModuleLevelBinding || isFunctionLevelBinding) {
                              return;
                          }
                      }
                      var blockScopeContainer = ts.getEnclosingBlockScopeContainer(node);
                      var parent = blockScopeContainer.kind === 228
                          ? blockScopeContainer
                          : blockScopeContainer.parent;
                      if (resolver.resolvesToSomeValue(parent, node.text)) {
                          var variableId = resolver.getBlockScopedVariableId(node);
                          if (!blockScopedVariableToGeneratedName) {
                              blockScopedVariableToGeneratedName = [];
                          }
                          var generatedName = makeUniqueName(node.text);
                          blockScopedVariableToGeneratedName[variableId] = generatedName;
                      }
                  }
                  function isES6ExportedDeclaration(node) {
                      return !!(node.flags & 1) &&
                          languageVersion >= 2 &&
                          node.parent.kind === 228;
                  }
                  function emitVariableStatement(node) {
                      var startIsEmitted = false;
                      if (node.flags & 1) {
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
                          }
                      }
                      else {
                          startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
                      }
                      if (startIsEmitted) {
                          emitCommaList(node.declarationList.declarations);
                          write(";");
                      }
                      else {
                          var atLeastOneItem = emitVariableDeclarationListSkippingUninitializedEntries(node.declarationList);
                          if (atLeastOneItem) {
                              write(";");
                          }
                      }
                      if (languageVersion < 2 && node.parent === currentSourceFile) {
                          ts.forEach(node.declarationList.declarations, emitExportVariableAssignments);
                      }
                  }
                  function emitParameter(node) {
                      if (languageVersion < 2) {
                          if (ts.isBindingPattern(node.name)) {
                              var name_19 = createTempVariable(0);
                              if (!tempParameters) {
                                  tempParameters = [];
                              }
                              tempParameters.push(name_19);
                              emit(name_19);
                          }
                          else {
                              emit(node.name);
                          }
                      }
                      else {
                          if (node.dotDotDotToken) {
                              write("...");
                          }
                          emit(node.name);
                          emitOptional(" = ", node.initializer);
                      }
                  }
                  function emitDefaultValueAssignments(node) {
                      if (languageVersion < 2) {
                          var tempIndex = 0;
                          ts.forEach(node.parameters, function (p) {
                              if (p.dotDotDotToken) {
                                  return;
                              }
                              if (ts.isBindingPattern(p.name)) {
                                  writeLine();
                                  write("var ");
                                  emitDestructuring(p, false, tempParameters[tempIndex]);
                                  write(";");
                                  tempIndex++;
                              }
                              else if (p.initializer) {
                                  writeLine();
                                  emitStart(p);
                                  write("if (");
                                  emitNodeWithoutSourceMap(p.name);
                                  write(" === void 0)");
                                  emitEnd(p);
                                  write(" { ");
                                  emitStart(p);
                                  emitNodeWithoutSourceMap(p.name);
                                  write(" = ");
                                  emitNodeWithoutSourceMap(p.initializer);
                                  emitEnd(p);
                                  write("; }");
                              }
                          });
                      }
                  }
                  function emitRestParameter(node) {
                      if (languageVersion < 2 && ts.hasRestParameters(node)) {
                          var restIndex = node.parameters.length - 1;
                          var restParam = node.parameters[restIndex];
                          if (ts.isBindingPattern(restParam.name)) {
                              return;
                          }
                          var tempName = createTempVariable(268435456).text;
                          writeLine();
                          emitLeadingComments(restParam);
                          emitStart(restParam);
                          write("var ");
                          emitNodeWithoutSourceMap(restParam.name);
                          write(" = [];");
                          emitEnd(restParam);
                          emitTrailingComments(restParam);
                          writeLine();
                          write("for (");
                          emitStart(restParam);
                          write("var " + tempName + " = " + restIndex + ";");
                          emitEnd(restParam);
                          write(" ");
                          emitStart(restParam);
                          write(tempName + " < arguments.length;");
                          emitEnd(restParam);
                          write(" ");
                          emitStart(restParam);
                          write(tempName + "++");
                          emitEnd(restParam);
                          write(") {");
                          increaseIndent();
                          writeLine();
                          emitStart(restParam);
                          emitNodeWithoutSourceMap(restParam.name);
                          write("[" + tempName + " - " + restIndex + "] = arguments[" + tempName + "];");
                          emitEnd(restParam);
                          decreaseIndent();
                          writeLine();
                          write("}");
                      }
                  }
                  function emitAccessor(node) {
                      write(node.kind === 137 ? "get " : "set ");
                      emit(node.name, false);
                      emitSignatureAndBody(node);
                  }
                  function shouldEmitAsArrowFunction(node) {
                      return node.kind === 164 && languageVersion >= 2;
                  }
                  function emitDeclarationName(node) {
                      if (node.name) {
                          emitNodeWithoutSourceMap(node.name);
                      }
                      else {
                          write(getGeneratedNameForNode(node));
                      }
                  }
                  function shouldEmitFunctionName(node) {
                      if (node.kind === 163) {
                          return !!node.name;
                      }
                      if (node.kind === 201) {
                          return !!node.name || languageVersion < 2;
                      }
                  }
                  function emitFunctionDeclaration(node) {
                      if (ts.nodeIsMissing(node.body)) {
                          return emitOnlyPinnedOrTripleSlashComments(node);
                      }
                      if (node.kind !== 135 && node.kind !== 134) {
                          emitLeadingComments(node);
                      }
                      if (!shouldEmitAsArrowFunction(node)) {
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              if (node.flags & 256) {
                                  write("default ");
                              }
                          }
                          write("function");
                          if (languageVersion >= 2 && node.asteriskToken) {
                              write("*");
                          }
                          write(" ");
                      }
                      if (shouldEmitFunctionName(node)) {
                          emitDeclarationName(node);
                      }
                      emitSignatureAndBody(node);
                      if (languageVersion < 2 && node.kind === 201 && node.parent === currentSourceFile && node.name) {
                          emitExportMemberAssignments(node.name);
                      }
                      if (node.kind !== 135 && node.kind !== 134) {
                          emitTrailingComments(node);
                      }
                  }
                  function emitCaptureThisForNodeIfNecessary(node) {
                      if (resolver.getNodeCheckFlags(node) & 4) {
                          writeLine();
                          emitStart(node);
                          write("var _this = this;");
                          emitEnd(node);
                      }
                  }
                  function emitSignatureParameters(node) {
                      increaseIndent();
                      write("(");
                      if (node) {
                          var parameters = node.parameters;
                          var omitCount = languageVersion < 2 && ts.hasRestParameters(node) ? 1 : 0;
                          emitList(parameters, 0, parameters.length - omitCount, false, false);
                      }
                      write(")");
                      decreaseIndent();
                  }
                  function emitSignatureParametersForArrow(node) {
                      if (node.parameters.length === 1 && node.pos === node.parameters[0].pos) {
                          emit(node.parameters[0]);
                          return;
                      }
                      emitSignatureParameters(node);
                  }
                  function emitSignatureAndBody(node) {
                      var saveTempFlags = tempFlags;
                      var saveTempVariables = tempVariables;
                      var saveTempParameters = tempParameters;
                      tempFlags = 0;
                      tempVariables = undefined;
                      tempParameters = undefined;
                      if (shouldEmitAsArrowFunction(node)) {
                          emitSignatureParametersForArrow(node);
                          write(" =>");
                      }
                      else {
                          emitSignatureParameters(node);
                      }
                      if (!node.body) {
                          write(" { }");
                      }
                      else if (node.body.kind === 180) {
                          emitBlockFunctionBody(node, node.body);
                      }
                      else {
                          emitExpressionFunctionBody(node, node.body);
                      }
                      if (!isES6ExportedDeclaration(node)) {
                          emitExportMemberAssignment(node);
                      }
                      tempFlags = saveTempFlags;
                      tempVariables = saveTempVariables;
                      tempParameters = saveTempParameters;
                  }
                  function emitFunctionBodyPreamble(node) {
                      emitCaptureThisForNodeIfNecessary(node);
                      emitDefaultValueAssignments(node);
                      emitRestParameter(node);
                  }
                  function emitExpressionFunctionBody(node, body) {
                      if (languageVersion < 2) {
                          emitDownLevelExpressionFunctionBody(node, body);
                          return;
                      }
                      write(" ");
                      var current = body;
                      while (current.kind === 161) {
                          current = current.expression;
                      }
                      emitParenthesizedIf(body, current.kind === 155);
                  }
                  function emitDownLevelExpressionFunctionBody(node, body) {
                      write(" {");
                      scopeEmitStart(node);
                      increaseIndent();
                      var outPos = writer.getTextPos();
                      emitDetachedComments(node.body);
                      emitFunctionBodyPreamble(node);
                      var preambleEmitted = writer.getTextPos() !== outPos;
                      decreaseIndent();
                      if (!preambleEmitted && nodeStartPositionsAreOnSameLine(node, body)) {
                          write(" ");
                          emitStart(body);
                          write("return ");
                          emit(body);
                          emitEnd(body);
                          write(";");
                          emitTempDeclarations(false);
                          write(" ");
                      }
                      else {
                          increaseIndent();
                          writeLine();
                          emitLeadingComments(node.body);
                          write("return ");
                          emit(body);
                          write(";");
                          emitTrailingComments(node.body);
                          emitTempDeclarations(true);
                          decreaseIndent();
                          writeLine();
                      }
                      emitStart(node.body);
                      write("}");
                      emitEnd(node.body);
                      scopeEmitEnd();
                  }
                  function emitBlockFunctionBody(node, body) {
                      write(" {");
                      scopeEmitStart(node);
                      var initialTextPos = writer.getTextPos();
                      increaseIndent();
                      emitDetachedComments(body.statements);
                      var startIndex = emitDirectivePrologues(body.statements, true);
                      emitFunctionBodyPreamble(node);
                      decreaseIndent();
                      var preambleEmitted = writer.getTextPos() !== initialTextPos;
                      if (!preambleEmitted && nodeEndIsOnSameLineAsNodeStart(body, body)) {
                          for (var _a = 0, _b = body.statements; _a < _b.length; _a++) {
                              var statement = _b[_a];
                              write(" ");
                              emit(statement);
                          }
                          emitTempDeclarations(false);
                          write(" ");
                          emitLeadingCommentsOfPosition(body.statements.end);
                      }
                      else {
                          increaseIndent();
                          emitLinesStartingAt(body.statements, startIndex);
                          emitTempDeclarations(true);
                          writeLine();
                          emitLeadingCommentsOfPosition(body.statements.end);
                          decreaseIndent();
                      }
                      emitToken(15, body.statements.end);
                      scopeEmitEnd();
                  }
                  function findInitialSuperCall(ctor) {
                      if (ctor.body) {
                          var statement = ctor.body.statements[0];
                          if (statement && statement.kind === 183) {
                              var expr = statement.expression;
                              if (expr && expr.kind === 158) {
                                  var func = expr.expression;
                                  if (func && func.kind === 91) {
                                      return statement;
                                  }
                              }
                          }
                      }
                  }
                  function emitParameterPropertyAssignments(node) {
                      ts.forEach(node.parameters, function (param) {
                          if (param.flags & 112) {
                              writeLine();
                              emitStart(param);
                              emitStart(param.name);
                              write("this.");
                              emitNodeWithoutSourceMap(param.name);
                              emitEnd(param.name);
                              write(" = ");
                              emit(param.name);
                              write(";");
                              emitEnd(param);
                          }
                      });
                  }
                  function emitMemberAccessForPropertyName(memberName) {
                      if (memberName.kind === 8 || memberName.kind === 7) {
                          write("[");
                          emitNodeWithoutSourceMap(memberName);
                          write("]");
                      }
                      else if (memberName.kind === 128) {
                          emitComputedPropertyName(memberName);
                      }
                      else {
                          write(".");
                          emitNodeWithoutSourceMap(memberName);
                      }
                  }
                  function getInitializedProperties(node, isStatic) {
                      var properties = [];
                      for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
                          var member = _b[_a];
                          if (member.kind === 133 && isStatic === ((member.flags & 128) !== 0) && member.initializer) {
                              properties.push(member);
                          }
                      }
                      return properties;
                  }
                  function emitPropertyDeclarations(node, properties) {
                      for (var _a = 0; _a < properties.length; _a++) {
                          var property = properties[_a];
                          emitPropertyDeclaration(node, property);
                      }
                  }
                  function emitPropertyDeclaration(node, property, receiver, isExpression) {
                      writeLine();
                      emitLeadingComments(property);
                      emitStart(property);
                      emitStart(property.name);
                      if (receiver) {
                          emit(receiver);
                      }
                      else {
                          if (property.flags & 128) {
                              emitDeclarationName(node);
                          }
                          else {
                              write("this");
                          }
                      }
                      emitMemberAccessForPropertyName(property.name);
                      emitEnd(property.name);
                      write(" = ");
                      emit(property.initializer);
                      if (!isExpression) {
                          write(";");
                      }
                      emitEnd(property);
                      emitTrailingComments(property);
                  }
                  function emitMemberFunctionsForES5AndLower(node) {
                      ts.forEach(node.members, function (member) {
                          if (member.kind === 179) {
                              writeLine();
                              write(";");
                          }
                          else if (member.kind === 135 || node.kind === 134) {
                              if (!member.body) {
                                  return emitOnlyPinnedOrTripleSlashComments(member);
                              }
                              writeLine();
                              emitLeadingComments(member);
                              emitStart(member);
                              emitStart(member.name);
                              emitClassMemberPrefix(node, member);
                              emitMemberAccessForPropertyName(member.name);
                              emitEnd(member.name);
                              write(" = ");
                              emitStart(member);
                              emitFunctionDeclaration(member);
                              emitEnd(member);
                              emitEnd(member);
                              write(";");
                              emitTrailingComments(member);
                          }
                          else if (member.kind === 137 || member.kind === 138) {
                              var accessors = ts.getAllAccessorDeclarations(node.members, member);
                              if (member === accessors.firstAccessor) {
                                  writeLine();
                                  emitStart(member);
                                  write("Object.defineProperty(");
                                  emitStart(member.name);
                                  emitClassMemberPrefix(node, member);
                                  write(", ");
                                  emitExpressionForPropertyName(member.name);
                                  emitEnd(member.name);
                                  write(", {");
                                  increaseIndent();
                                  if (accessors.getAccessor) {
                                      writeLine();
                                      emitLeadingComments(accessors.getAccessor);
                                      write("get: ");
                                      emitStart(accessors.getAccessor);
                                      write("function ");
                                      emitSignatureAndBody(accessors.getAccessor);
                                      emitEnd(accessors.getAccessor);
                                      emitTrailingComments(accessors.getAccessor);
                                      write(",");
                                  }
                                  if (accessors.setAccessor) {
                                      writeLine();
                                      emitLeadingComments(accessors.setAccessor);
                                      write("set: ");
                                      emitStart(accessors.setAccessor);
                                      write("function ");
                                      emitSignatureAndBody(accessors.setAccessor);
                                      emitEnd(accessors.setAccessor);
                                      emitTrailingComments(accessors.setAccessor);
                                      write(",");
                                  }
                                  writeLine();
                                  write("enumerable: true,");
                                  writeLine();
                                  write("configurable: true");
                                  decreaseIndent();
                                  writeLine();
                                  write("});");
                                  emitEnd(member);
                              }
                          }
                      });
                  }
                  function emitMemberFunctionsForES6AndHigher(node) {
                      for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
                          var member = _b[_a];
                          if ((member.kind === 135 || node.kind === 134) && !member.body) {
                              emitOnlyPinnedOrTripleSlashComments(member);
                          }
                          else if (member.kind === 135 ||
                              member.kind === 137 ||
                              member.kind === 138) {
                              writeLine();
                              emitLeadingComments(member);
                              emitStart(member);
                              if (member.flags & 128) {
                                  write("static ");
                              }
                              if (member.kind === 137) {
                                  write("get ");
                              }
                              else if (member.kind === 138) {
                                  write("set ");
                              }
                              if (member.asteriskToken) {
                                  write("*");
                              }
                              emit(member.name);
                              emitSignatureAndBody(member);
                              emitEnd(member);
                              emitTrailingComments(member);
                          }
                          else if (member.kind === 179) {
                              writeLine();
                              write(";");
                          }
                      }
                  }
                  function emitConstructor(node, baseTypeElement) {
                      var saveTempFlags = tempFlags;
                      var saveTempVariables = tempVariables;
                      var saveTempParameters = tempParameters;
                      tempFlags = 0;
                      tempVariables = undefined;
                      tempParameters = undefined;
                      emitConstructorWorker(node, baseTypeElement);
                      tempFlags = saveTempFlags;
                      tempVariables = saveTempVariables;
                      tempParameters = saveTempParameters;
                  }
                  function emitConstructorWorker(node, baseTypeElement) {
                      var hasInstancePropertyWithInitializer = false;
                      ts.forEach(node.members, function (member) {
                          if (member.kind === 136 && !member.body) {
                              emitOnlyPinnedOrTripleSlashComments(member);
                          }
                          if (member.kind === 133 && member.initializer && (member.flags & 128) === 0) {
                              hasInstancePropertyWithInitializer = true;
                          }
                      });
                      var ctor = ts.getFirstConstructorWithBody(node);
                      if (languageVersion >= 2 && !ctor && !hasInstancePropertyWithInitializer) {
                          return;
                      }
                      if (ctor) {
                          emitLeadingComments(ctor);
                      }
                      emitStart(ctor || node);
                      if (languageVersion < 2) {
                          write("function ");
                          emitDeclarationName(node);
                          emitSignatureParameters(ctor);
                      }
                      else {
                          write("constructor");
                          if (ctor) {
                              emitSignatureParameters(ctor);
                          }
                          else {
                              if (baseTypeElement) {
                                  write("(...args)");
                              }
                              else {
                                  write("()");
                              }
                          }
                      }
                      write(" {");
                      scopeEmitStart(node, "constructor");
                      increaseIndent();
                      if (ctor) {
                          emitDetachedComments(ctor.body.statements);
                      }
                      emitCaptureThisForNodeIfNecessary(node);
                      if (ctor) {
                          emitDefaultValueAssignments(ctor);
                          emitRestParameter(ctor);
                          if (baseTypeElement) {
                              var superCall = findInitialSuperCall(ctor);
                              if (superCall) {
                                  writeLine();
                                  emit(superCall);
                              }
                          }
                          emitParameterPropertyAssignments(ctor);
                      }
                      else {
                          if (baseTypeElement) {
                              writeLine();
                              emitStart(baseTypeElement);
                              if (languageVersion < 2) {
                                  write("_super.apply(this, arguments);");
                              }
                              else {
                                  write("super(...args);");
                              }
                              emitEnd(baseTypeElement);
                          }
                      }
                      emitPropertyDeclarations(node, getInitializedProperties(node, false));
                      if (ctor) {
                          var statements = ctor.body.statements;
                          if (superCall) {
                              statements = statements.slice(1);
                          }
                          emitLines(statements);
                      }
                      emitTempDeclarations(true);
                      writeLine();
                      if (ctor) {
                          emitLeadingCommentsOfPosition(ctor.body.statements.end);
                      }
                      decreaseIndent();
                      emitToken(15, ctor ? ctor.body.statements.end : node.members.end);
                      scopeEmitEnd();
                      emitEnd(ctor || node);
                      if (ctor) {
                          emitTrailingComments(ctor);
                      }
                  }
                  function emitClassExpression(node) {
                      return emitClassLikeDeclaration(node);
                  }
                  function emitClassDeclaration(node) {
                      return emitClassLikeDeclaration(node);
                  }
                  function emitClassLikeDeclaration(node) {
                      if (languageVersion < 2) {
                          emitClassLikeDeclarationBelowES6(node);
                      }
                      else {
                          emitClassLikeDeclarationForES6AndHigher(node);
                      }
                  }
                  function emitClassLikeDeclarationForES6AndHigher(node) {
                      var thisNodeIsDecorated = ts.nodeIsDecorated(node);
                      if (node.kind === 202) {
                          if (thisNodeIsDecorated) {
                              if (isES6ExportedDeclaration(node) && !(node.flags & 256)) {
                                  write("export ");
                              }
                              write("let ");
                              emitDeclarationName(node);
                              write(" = ");
                          }
                          else if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              if (node.flags & 256) {
                                  write("default ");
                              }
                          }
                      }
                      var staticProperties = getInitializedProperties(node, true);
                      var isClassExpressionWithStaticProperties = staticProperties.length > 0 && node.kind === 175;
                      var tempVariable;
                      if (isClassExpressionWithStaticProperties) {
                          tempVariable = createAndRecordTempVariable(0);
                          write("(");
                          increaseIndent();
                          emit(tempVariable);
                          write(" = ");
                      }
                      write("class");
                      if ((node.name || !(node.flags & 256)) && !thisNodeIsDecorated) {
                          write(" ");
                          emitDeclarationName(node);
                      }
                      var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                      if (baseTypeNode) {
                          write(" extends ");
                          emit(baseTypeNode.expression);
                      }
                      write(" {");
                      increaseIndent();
                      scopeEmitStart(node);
                      writeLine();
                      emitConstructor(node, baseTypeNode);
                      emitMemberFunctionsForES6AndHigher(node);
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.members.end);
                      scopeEmitEnd();
                      if (thisNodeIsDecorated) {
                          write(";");
                      }
                      if (isClassExpressionWithStaticProperties) {
                          for (var _a = 0; _a < staticProperties.length; _a++) {
                              var property = staticProperties[_a];
                              write(",");
                              writeLine();
                              emitPropertyDeclaration(node, property, tempVariable, true);
                          }
                          write(",");
                          writeLine();
                          emit(tempVariable);
                          decreaseIndent();
                          write(")");
                      }
                      else {
                          writeLine();
                          emitPropertyDeclarations(node, staticProperties);
                          emitDecoratorsOfClass(node);
                      }
                      if (!isES6ExportedDeclaration(node) && (node.flags & 1)) {
                          writeLine();
                          emitStart(node);
                          emitModuleMemberName(node);
                          write(" = ");
                          emitDeclarationName(node);
                          emitEnd(node);
                          write(";");
                      }
                      else if (isES6ExportedDeclaration(node) && (node.flags & 256) && thisNodeIsDecorated) {
                          writeLine();
                          write("export default ");
                          emitDeclarationName(node);
                          write(";");
                      }
                  }
                  function emitClassLikeDeclarationBelowES6(node) {
                      if (node.kind === 202) {
                          if (!shouldHoistDeclarationInSystemJsModule(node)) {
                              write("var ");
                          }
                          emitDeclarationName(node);
                          write(" = ");
                      }
                      write("(function (");
                      var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
                      if (baseTypeNode) {
                          write("_super");
                      }
                      write(") {");
                      var saveTempFlags = tempFlags;
                      var saveTempVariables = tempVariables;
                      var saveTempParameters = tempParameters;
                      var saveComputedPropertyNamesToGeneratedNames = computedPropertyNamesToGeneratedNames;
                      tempFlags = 0;
                      tempVariables = undefined;
                      tempParameters = undefined;
                      computedPropertyNamesToGeneratedNames = undefined;
                      increaseIndent();
                      scopeEmitStart(node);
                      if (baseTypeNode) {
                          writeLine();
                          emitStart(baseTypeNode);
                          write("__extends(");
                          emitDeclarationName(node);
                          write(", _super);");
                          emitEnd(baseTypeNode);
                      }
                      writeLine();
                      emitConstructor(node, baseTypeNode);
                      emitMemberFunctionsForES5AndLower(node);
                      emitPropertyDeclarations(node, getInitializedProperties(node, true));
                      writeLine();
                      emitDecoratorsOfClass(node);
                      writeLine();
                      emitToken(15, node.members.end, function () {
                          write("return ");
                          emitDeclarationName(node);
                      });
                      write(";");
                      emitTempDeclarations(true);
                      tempFlags = saveTempFlags;
                      tempVariables = saveTempVariables;
                      tempParameters = saveTempParameters;
                      computedPropertyNamesToGeneratedNames = saveComputedPropertyNamesToGeneratedNames;
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.members.end);
                      scopeEmitEnd();
                      emitStart(node);
                      write(")(");
                      if (baseTypeNode) {
                          emit(baseTypeNode.expression);
                      }
                      write(")");
                      if (node.kind === 202) {
                          write(";");
                      }
                      emitEnd(node);
                      if (node.kind === 202) {
                          emitExportMemberAssignment(node);
                      }
                      if (languageVersion < 2 && node.parent === currentSourceFile && node.name) {
                          emitExportMemberAssignments(node.name);
                      }
                  }
                  function emitClassMemberPrefix(node, member) {
                      emitDeclarationName(node);
                      if (!(member.flags & 128)) {
                          write(".prototype");
                      }
                  }
                  function emitDecoratorsOfClass(node) {
                      emitDecoratorsOfMembers(node, 0);
                      emitDecoratorsOfMembers(node, 128);
                      emitDecoratorsOfConstructor(node);
                  }
                  function emitDecoratorsOfConstructor(node) {
                      var decorators = node.decorators;
                      var constructor = ts.getFirstConstructorWithBody(node);
                      var hasDecoratedParameters = constructor && ts.forEach(constructor.parameters, ts.nodeIsDecorated);
                      if (!decorators && !hasDecoratedParameters) {
                          return;
                      }
                      writeLine();
                      emitStart(node);
                      emitDeclarationName(node);
                      write(" = __decorate([");
                      increaseIndent();
                      writeLine();
                      var decoratorCount = decorators ? decorators.length : 0;
                      var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) {
                          emitStart(decorator);
                          emit(decorator.expression);
                          emitEnd(decorator);
                      });
                      argumentsWritten += emitDecoratorsOfParameters(constructor, argumentsWritten > 0);
                      emitSerializedTypeMetadata(node, argumentsWritten >= 0);
                      decreaseIndent();
                      writeLine();
                      write("], ");
                      emitDeclarationName(node);
                      write(");");
                      emitEnd(node);
                      writeLine();
                  }
                  function emitDecoratorsOfMembers(node, staticFlag) {
                      for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
                          var member = _b[_a];
                          if ((member.flags & 128) !== staticFlag) {
                              continue;
                          }
                          if (!ts.nodeCanBeDecorated(member)) {
                              continue;
                          }
                          if (!ts.nodeOrChildIsDecorated(member)) {
                              continue;
                          }
                          var decorators = void 0;
                          var functionLikeMember = void 0;
                          if (ts.isAccessor(member)) {
                              var accessors = ts.getAllAccessorDeclarations(node.members, member);
                              if (member !== accessors.firstAccessor) {
                                  continue;
                              }
                              decorators = accessors.firstAccessor.decorators;
                              if (!decorators && accessors.secondAccessor) {
                                  decorators = accessors.secondAccessor.decorators;
                              }
                              functionLikeMember = accessors.setAccessor;
                          }
                          else {
                              decorators = member.decorators;
                              if (member.kind === 135) {
                                  functionLikeMember = member;
                              }
                          }
                          writeLine();
                          emitStart(member);
                          if (member.kind !== 133) {
                              write("Object.defineProperty(");
                              emitStart(member.name);
                              emitClassMemberPrefix(node, member);
                              write(", ");
                              emitExpressionForPropertyName(member.name);
                              emitEnd(member.name);
                              write(",");
                              increaseIndent();
                              writeLine();
                          }
                          write("__decorate([");
                          increaseIndent();
                          writeLine();
                          var decoratorCount = decorators ? decorators.length : 0;
                          var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) {
                              emitStart(decorator);
                              emit(decorator.expression);
                              emitEnd(decorator);
                          });
                          argumentsWritten += emitDecoratorsOfParameters(functionLikeMember, argumentsWritten > 0);
                          emitSerializedTypeMetadata(member, argumentsWritten > 0);
                          decreaseIndent();
                          writeLine();
                          write("], ");
                          emitStart(member.name);
                          emitClassMemberPrefix(node, member);
                          write(", ");
                          emitExpressionForPropertyName(member.name);
                          emitEnd(member.name);
                          if (member.kind !== 133) {
                              write(", Object.getOwnPropertyDescriptor(");
                              emitStart(member.name);
                              emitClassMemberPrefix(node, member);
                              write(", ");
                              emitExpressionForPropertyName(member.name);
                              emitEnd(member.name);
                              write("))");
                              decreaseIndent();
                          }
                          write(");");
                          emitEnd(member);
                          writeLine();
                      }
                  }
                  function emitDecoratorsOfParameters(node, leadingComma) {
                      var argumentsWritten = 0;
                      if (node) {
                          var parameterIndex = 0;
                          for (var _a = 0, _b = node.parameters; _a < _b.length; _a++) {
                              var parameter = _b[_a];
                              if (ts.nodeIsDecorated(parameter)) {
                                  var decorators = parameter.decorators;
                                  argumentsWritten += emitList(decorators, 0, decorators.length, true, false, leadingComma, true, function (decorator) {
                                      emitStart(decorator);
                                      write("__param(" + parameterIndex + ", ");
                                      emit(decorator.expression);
                                      write(")");
                                      emitEnd(decorator);
                                  });
                                  leadingComma = true;
                              }
                              ++parameterIndex;
                          }
                      }
                      return argumentsWritten;
                  }
                  function shouldEmitTypeMetadata(node) {
                      switch (node.kind) {
                          case 135:
                          case 137:
                          case 138:
                          case 133:
                              return true;
                      }
                      return false;
                  }
                  function shouldEmitReturnTypeMetadata(node) {
                      switch (node.kind) {
                          case 135:
                              return true;
                      }
                      return false;
                  }
                  function shouldEmitParamTypesMetadata(node) {
                      switch (node.kind) {
                          case 202:
                          case 135:
                          case 138:
                              return true;
                      }
                      return false;
                  }
                  function emitSerializedTypeMetadata(node, writeComma) {
                      var argumentsWritten = 0;
                      if (compilerOptions.emitDecoratorMetadata) {
                          if (shouldEmitTypeMetadata(node)) {
                              var serializedType = resolver.serializeTypeOfNode(node, getGeneratedNameForNode);
                              if (serializedType) {
                                  if (writeComma) {
                                      write(", ");
                                  }
                                  writeLine();
                                  write("__metadata('design:type', ");
                                  emitSerializedType(node, serializedType);
                                  write(")");
                                  argumentsWritten++;
                              }
                          }
                          if (shouldEmitParamTypesMetadata(node)) {
                              var serializedTypes = resolver.serializeParameterTypesOfNode(node, getGeneratedNameForNode);
                              if (serializedTypes) {
                                  if (writeComma || argumentsWritten) {
                                      write(", ");
                                  }
                                  writeLine();
                                  write("__metadata('design:paramtypes', [");
                                  for (var i = 0; i < serializedTypes.length; ++i) {
                                      if (i > 0) {
                                          write(", ");
                                      }
                                      emitSerializedType(node, serializedTypes[i]);
                                  }
                                  write("])");
                                  argumentsWritten++;
                              }
                          }
                          if (shouldEmitReturnTypeMetadata(node)) {
                              var serializedType = resolver.serializeReturnTypeOfNode(node, getGeneratedNameForNode);
                              if (serializedType) {
                                  if (writeComma || argumentsWritten) {
                                      write(", ");
                                  }
                                  writeLine();
                                  write("__metadata('design:returntype', ");
                                  emitSerializedType(node, serializedType);
                                  write(")");
                                  argumentsWritten++;
                              }
                          }
                      }
                      return argumentsWritten;
                  }
                  function serializeTypeNameSegment(location, path, index) {
                      switch (index) {
                          case 0:
                              return "typeof " + path[index] + " !== 'undefined' && " + path[index];
                          case 1:
                              return serializeTypeNameSegment(location, path, index - 1) + "." + path[index];
                          default:
                              var temp = createAndRecordTempVariable(0).text;
                              return "(" + temp + " = " + serializeTypeNameSegment(location, path, index - 1) + ") && " + temp + "." + path[index];
                      }
                  }
                  function emitSerializedType(location, name) {
                      if (typeof name === "string") {
                          write(name);
                          return;
                      }
                      else {
                          ts.Debug.assert(name.length > 0, "Invalid serialized type name");
                          write("(" + serializeTypeNameSegment(location, name, name.length - 1) + ") || Object");
                      }
                  }
                  function emitInterfaceDeclaration(node) {
                      emitOnlyPinnedOrTripleSlashComments(node);
                  }
                  function shouldEmitEnumDeclaration(node) {
                      var isConstEnum = ts.isConst(node);
                      return !isConstEnum || compilerOptions.preserveConstEnums || compilerOptions.separateCompilation;
                  }
                  function emitEnumDeclaration(node) {
                      if (!shouldEmitEnumDeclaration(node)) {
                          return;
                      }
                      if (!shouldHoistDeclarationInSystemJsModule(node)) {
                          if (!(node.flags & 1) || isES6ExportedDeclaration(node)) {
                              emitStart(node);
                              if (isES6ExportedDeclaration(node)) {
                                  write("export ");
                              }
                              write("var ");
                              emit(node.name);
                              emitEnd(node);
                              write(";");
                          }
                      }
                      writeLine();
                      emitStart(node);
                      write("(function (");
                      emitStart(node.name);
                      write(getGeneratedNameForNode(node));
                      emitEnd(node.name);
                      write(") {");
                      increaseIndent();
                      scopeEmitStart(node);
                      emitLines(node.members);
                      decreaseIndent();
                      writeLine();
                      emitToken(15, node.members.end);
                      scopeEmitEnd();
                      write(")(");
                      emitModuleMemberName(node);
                      write(" || (");
                      emitModuleMemberName(node);
                      write(" = {}));");
                      emitEnd(node);
                      if (!isES6ExportedDeclaration(node) && node.flags & 1 && !shouldHoistDeclarationInSystemJsModule(node)) {
                          writeLine();
                          emitStart(node);
                          write("var ");
                          emit(node.name);
                          write(" = ");
                          emitModuleMemberName(node);
                          emitEnd(node);
                          write(";");
                      }
                      if (languageVersion < 2 && node.parent === currentSourceFile) {
                          if (compilerOptions.module === 4 && (node.flags & 1)) {
                              writeLine();
                              write(exportFunctionForFile + "(\"");
                              emitDeclarationName(node);
                              write("\", ");
                              emitDeclarationName(node);
                              write(")");
                          }
                          emitExportMemberAssignments(node.name);
                      }
                  }
                  function emitEnumMember(node) {
                      var enumParent = node.parent;
                      emitStart(node);
                      write(getGeneratedNameForNode(enumParent));
                      write("[");
                      write(getGeneratedNameForNode(enumParent));
                      write("[");
                      emitExpressionForPropertyName(node.name);
                      write("] = ");
                      writeEnumMemberDeclarationValue(node);
                      write("] = ");
                      emitExpressionForPropertyName(node.name);
                      emitEnd(node);
                      write(";");
                  }
                  function writeEnumMemberDeclarationValue(member) {
                      var value = resolver.getConstantValue(member);
                      if (value !== undefined) {
                          write(value.toString());
                          return;
                      }
                      else if (member.initializer) {
                          emit(member.initializer);
                      }
                      else {
                          write("undefined");
                      }
                  }
                  function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
                      if (moduleDeclaration.body.kind === 206) {
                          var recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
                          return recursiveInnerModule || moduleDeclaration.body;
                      }
                  }
                  function shouldEmitModuleDeclaration(node) {
                      return ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.separateCompilation);
                  }
                  function isModuleMergedWithES6Class(node) {
                      return languageVersion === 2 && !!(resolver.getNodeCheckFlags(node) & 2048);
                  }
                  function emitModuleDeclaration(node) {
                      var shouldEmit = shouldEmitModuleDeclaration(node);
                      if (!shouldEmit) {
                          return emitOnlyPinnedOrTripleSlashComments(node);
                      }
                      var hoistedInDeclarationScope = shouldHoistDeclarationInSystemJsModule(node);
                      var emitVarForModule = !hoistedInDeclarationScope && !isModuleMergedWithES6Class(node);
                      if (emitVarForModule) {
                          emitStart(node);
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                          }
                          write("var ");
                          emit(node.name);
                          write(";");
                          emitEnd(node);
                          writeLine();
                      }
                      emitStart(node);
                      write("(function (");
                      emitStart(node.name);
                      write(getGeneratedNameForNode(node));
                      emitEnd(node.name);
                      write(") ");
                      if (node.body.kind === 207) {
                          var saveTempFlags = tempFlags;
                          var saveTempVariables = tempVariables;
                          tempFlags = 0;
                          tempVariables = undefined;
                          emit(node.body);
                          tempFlags = saveTempFlags;
                          tempVariables = saveTempVariables;
                      }
                      else {
                          write("{");
                          increaseIndent();
                          scopeEmitStart(node);
                          emitCaptureThisForNodeIfNecessary(node);
                          writeLine();
                          emit(node.body);
                          decreaseIndent();
                          writeLine();
                          var moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
                          emitToken(15, moduleBlock.statements.end);
                          scopeEmitEnd();
                      }
                      write(")(");
                      if ((node.flags & 1) && !isES6ExportedDeclaration(node)) {
                          emit(node.name);
                          write(" = ");
                      }
                      emitModuleMemberName(node);
                      write(" || (");
                      emitModuleMemberName(node);
                      write(" = {}));");
                      emitEnd(node);
                      if (!isES6ExportedDeclaration(node) && node.name.kind === 65 && node.parent === currentSourceFile) {
                          if (compilerOptions.module === 4 && (node.flags & 1)) {
                              writeLine();
                              write(exportFunctionForFile + "(\"");
                              emitDeclarationName(node);
                              write("\", ");
                              emitDeclarationName(node);
                              write(")");
                          }
                          emitExportMemberAssignments(node.name);
                      }
                  }
                  function emitRequire(moduleName) {
                      if (moduleName.kind === 8) {
                          write("require(");
                          emitStart(moduleName);
                          emitLiteral(moduleName);
                          emitEnd(moduleName);
                          emitToken(17, moduleName.end);
                      }
                      else {
                          write("require()");
                      }
                  }
                  function getNamespaceDeclarationNode(node) {
                      if (node.kind === 209) {
                          return node;
                      }
                      var importClause = node.importClause;
                      if (importClause && importClause.namedBindings && importClause.namedBindings.kind === 212) {
                          return importClause.namedBindings;
                      }
                  }
                  function isDefaultImport(node) {
                      return node.kind === 210 && node.importClause && !!node.importClause.name;
                  }
                  function emitExportImportAssignments(node) {
                      if (ts.isAliasSymbolDeclaration(node) && resolver.isValueAliasDeclaration(node)) {
                          emitExportMemberAssignments(node.name);
                      }
                      ts.forEachChild(node, emitExportImportAssignments);
                  }
                  function emitImportDeclaration(node) {
                      if (languageVersion < 2) {
                          return emitExternalImportDeclaration(node);
                      }
                      if (node.importClause) {
                          var shouldEmitDefaultBindings = resolver.isReferencedAliasDeclaration(node.importClause);
                          var shouldEmitNamedBindings = node.importClause.namedBindings && resolver.isReferencedAliasDeclaration(node.importClause.namedBindings, true);
                          if (shouldEmitDefaultBindings || shouldEmitNamedBindings) {
                              write("import ");
                              emitStart(node.importClause);
                              if (shouldEmitDefaultBindings) {
                                  emit(node.importClause.name);
                                  if (shouldEmitNamedBindings) {
                                      write(", ");
                                  }
                              }
                              if (shouldEmitNamedBindings) {
                                  emitLeadingComments(node.importClause.namedBindings);
                                  emitStart(node.importClause.namedBindings);
                                  if (node.importClause.namedBindings.kind === 212) {
                                      write("* as ");
                                      emit(node.importClause.namedBindings.name);
                                  }
                                  else {
                                      write("{ ");
                                      emitExportOrImportSpecifierList(node.importClause.namedBindings.elements, resolver.isReferencedAliasDeclaration);
                                      write(" }");
                                  }
                                  emitEnd(node.importClause.namedBindings);
                                  emitTrailingComments(node.importClause.namedBindings);
                              }
                              emitEnd(node.importClause);
                              write(" from ");
                              emit(node.moduleSpecifier);
                              write(";");
                          }
                      }
                      else {
                          write("import ");
                          emit(node.moduleSpecifier);
                          write(";");
                      }
                  }
                  function emitExternalImportDeclaration(node) {
                      if (ts.contains(externalImports, node)) {
                          var isExportedImport = node.kind === 209 && (node.flags & 1) !== 0;
                          var namespaceDeclaration = getNamespaceDeclarationNode(node);
                          if (compilerOptions.module !== 2) {
                              emitLeadingComments(node);
                              emitStart(node);
                              if (namespaceDeclaration && !isDefaultImport(node)) {
                                  if (!isExportedImport)
                                      write("var ");
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                              }
                              else {
                                  var isNakedImport = 210 && !node.importClause;
                                  if (!isNakedImport) {
                                      write("var ");
                                      write(getGeneratedNameForNode(node));
                                      write(" = ");
                                  }
                              }
                              emitRequire(ts.getExternalModuleName(node));
                              if (namespaceDeclaration && isDefaultImport(node)) {
                                  write(", ");
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                                  write(getGeneratedNameForNode(node));
                              }
                              write(";");
                              emitEnd(node);
                              emitExportImportAssignments(node);
                              emitTrailingComments(node);
                          }
                          else {
                              if (isExportedImport) {
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                                  emit(namespaceDeclaration.name);
                                  write(";");
                              }
                              else if (namespaceDeclaration && isDefaultImport(node)) {
                                  write("var ");
                                  emitModuleMemberName(namespaceDeclaration);
                                  write(" = ");
                                  write(getGeneratedNameForNode(node));
                                  write(";");
                              }
                              emitExportImportAssignments(node);
                          }
                      }
                  }
                  function emitImportEqualsDeclaration(node) {
                      if (ts.isExternalModuleImportEqualsDeclaration(node)) {
                          emitExternalImportDeclaration(node);
                          return;
                      }
                      if (resolver.isReferencedAliasDeclaration(node) ||
                          (!ts.isExternalModule(currentSourceFile) && resolver.isTopLevelValueImportEqualsWithEntityName(node))) {
                          emitLeadingComments(node);
                          emitStart(node);
                          if (isES6ExportedDeclaration(node)) {
                              write("export ");
                              write("var ");
                          }
                          else if (!(node.flags & 1)) {
                              write("var ");
                          }
                          emitModuleMemberName(node);
                          write(" = ");
                          emit(node.moduleReference);
                          write(";");
                          emitEnd(node);
                          emitExportImportAssignments(node);
                          emitTrailingComments(node);
                      }
                  }
                  function emitExportDeclaration(node) {
                      ts.Debug.assert(compilerOptions.module !== 4);
                      if (languageVersion < 2) {
                          if (node.moduleSpecifier && (!node.exportClause || resolver.isValueAliasDeclaration(node))) {
                              emitStart(node);
                              var generatedName = getGeneratedNameForNode(node);
                              if (node.exportClause) {
                                  if (compilerOptions.module !== 2) {
                                      write("var ");
                                      write(generatedName);
                                      write(" = ");
                                      emitRequire(ts.getExternalModuleName(node));
                                      write(";");
                                  }
                                  for (var _a = 0, _b = node.exportClause.elements; _a < _b.length; _a++) {
                                      var specifier = _b[_a];
                                      if (resolver.isValueAliasDeclaration(specifier)) {
                                          writeLine();
                                          emitStart(specifier);
                                          emitContainingModuleName(specifier);
                                          write(".");
                                          emitNodeWithoutSourceMap(specifier.name);
                                          write(" = ");
                                          write(generatedName);
                                          write(".");
                                          emitNodeWithoutSourceMap(specifier.propertyName || specifier.name);
                                          write(";");
                                          emitEnd(specifier);
                                      }
                                  }
                              }
                              else {
                                  writeLine();
                                  write("__export(");
                                  if (compilerOptions.module !== 2) {
                                      emitRequire(ts.getExternalModuleName(node));
                                  }
                                  else {
                                      write(generatedName);
                                  }
                                  write(");");
                              }
                              emitEnd(node);
                          }
                      }
                      else {
                          if (!node.exportClause || resolver.isValueAliasDeclaration(node)) {
                              emitStart(node);
                              write("export ");
                              if (node.exportClause) {
                                  write("{ ");
                                  emitExportOrImportSpecifierList(node.exportClause.elements, resolver.isValueAliasDeclaration);
                                  write(" }");
                              }
                              else {
                                  write("*");
                              }
                              if (node.moduleSpecifier) {
                                  write(" from ");
                                  emitNodeWithoutSourceMap(node.moduleSpecifier);
                              }
                              write(";");
                              emitEnd(node);
                          }
                      }
                  }
                  function emitExportOrImportSpecifierList(specifiers, shouldEmit) {
                      ts.Debug.assert(languageVersion >= 2);
                      var needsComma = false;
                      for (var _a = 0; _a < specifiers.length; _a++) {
                          var specifier = specifiers[_a];
                          if (shouldEmit(specifier)) {
                              if (needsComma) {
                                  write(", ");
                              }
                              emitStart(specifier);
                              if (specifier.propertyName) {
                                  emitNodeWithoutSourceMap(specifier.propertyName);
                                  write(" as ");
                              }
                              emitNodeWithoutSourceMap(specifier.name);
                              emitEnd(specifier);
                              needsComma = true;
                          }
                      }
                  }
                  function emitExportAssignment(node) {
                      if (!node.isExportEquals && resolver.isValueAliasDeclaration(node)) {
                          if (languageVersion >= 2) {
                              writeLine();
                              emitStart(node);
                              write("export default ");
                              var expression = node.expression;
                              emit(expression);
                              if (expression.kind !== 201 &&
                                  expression.kind !== 202) {
                                  write(";");
                              }
                              emitEnd(node);
                          }
                          else {
                              writeLine();
                              emitStart(node);
                              if (compilerOptions.module === 4) {
                                  write(exportFunctionForFile + "(\"default\",");
                                  emit(node.expression);
                                  write(")");
                              }
                              else {
                                  emitContainingModuleName(node);
                                  if (languageVersion === 0) {
                                      write("[\"default\"] = ");
                                  }
                                  else {
                                      write(".default = ");
                                  }
                                  emit(node.expression);
                              }
                              write(";");
                              emitEnd(node);
                          }
                      }
                  }
                  function collectExternalModuleInfo(sourceFile) {
                      externalImports = [];
                      exportSpecifiers = {};
                      exportEquals = undefined;
                      hasExportStars = false;
                      for (var _a = 0, _b = sourceFile.statements; _a < _b.length; _a++) {
                          var node = _b[_a];
                          switch (node.kind) {
                              case 210:
                                  if (!node.importClause ||
                                      resolver.isReferencedAliasDeclaration(node.importClause, true)) {
                                      externalImports.push(node);
                                  }
                                  break;
                              case 209:
                                  if (node.moduleReference.kind === 220 && resolver.isReferencedAliasDeclaration(node)) {
                                      externalImports.push(node);
                                  }
                                  break;
                              case 216:
                                  if (node.moduleSpecifier) {
                                      if (!node.exportClause) {
                                          externalImports.push(node);
                                          hasExportStars = true;
                                      }
                                      else if (resolver.isValueAliasDeclaration(node)) {
                                          externalImports.push(node);
                                      }
                                  }
                                  else {
                                      for (var _c = 0, _d = node.exportClause.elements; _c < _d.length; _c++) {
                                          var specifier = _d[_c];
                                          var name_20 = (specifier.propertyName || specifier.name).text;
                                          (exportSpecifiers[name_20] || (exportSpecifiers[name_20] = [])).push(specifier);
                                      }
                                  }
                                  break;
                              case 215:
                                  if (node.isExportEquals && !exportEquals) {
                                      exportEquals = node;
                                  }
                                  break;
                          }
                      }
                  }
                  function emitExportStarHelper() {
                      if (hasExportStars) {
                          writeLine();
                          write("function __export(m) {");
                          increaseIndent();
                          writeLine();
                          write("for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];");
                          decreaseIndent();
                          writeLine();
                          write("}");
                      }
                  }
                  function getLocalNameForExternalImport(importNode) {
                      var namespaceDeclaration = getNamespaceDeclarationNode(importNode);
                      if (namespaceDeclaration && !isDefaultImport(importNode)) {
                          return ts.getSourceTextOfNodeFromSourceFile(currentSourceFile, namespaceDeclaration.name);
                      }
                      else {
                          return getGeneratedNameForNode(importNode);
                      }
                  }
                  function getExternalModuleNameText(importNode) {
                      var moduleName = ts.getExternalModuleName(importNode);
                      if (moduleName.kind === 8) {
                          return getLiteralText(moduleName);
                      }
                      return undefined;
                  }
                  function emitVariableDeclarationsForImports() {
                      if (externalImports.length === 0) {
                          return;
                      }
                      writeLine();
                      var started = false;
                      for (var _a = 0; _a < externalImports.length; _a++) {
                          var importNode = externalImports[_a];
                          var skipNode = importNode.kind === 216 ||
                              (importNode.kind === 210 && !importNode.importClause);
                          if (skipNode) {
                              continue;
                          }
                          if (!started) {
                              write("var ");
                              started = true;
                          }
                          else {
                              write(", ");
                          }
                          write(getLocalNameForExternalImport(importNode));
                      }
                      if (started) {
                          write(";");
                      }
                  }
                  function emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations) {
                      if (!hasExportStars) {
                          return undefined;
                      }
                      if (!exportedDeclarations && ts.isEmpty(exportSpecifiers)) {
                          var hasExportDeclarationWithExportClause = false;
                          for (var _a = 0; _a < externalImports.length; _a++) {
                              var externalImport = externalImports[_a];
                              if (externalImport.kind === 216 && externalImport.exportClause) {
                                  hasExportDeclarationWithExportClause = true;
                                  break;
                              }
                          }
                          if (!hasExportDeclarationWithExportClause) {
                              return emitExportStarFunction(undefined);
                          }
                      }
                      var exportedNamesStorageRef = makeUniqueName("exportedNames");
                      writeLine();
                      write("var " + exportedNamesStorageRef + " = {");
                      increaseIndent();
                      var started = false;
                      if (exportedDeclarations) {
                          for (var i = 0; i < exportedDeclarations.length; ++i) {
                              writeExportedName(exportedDeclarations[i]);
                          }
                      }
                      if (exportSpecifiers) {
                          for (var n in exportSpecifiers) {
                              for (var _b = 0, _c = exportSpecifiers[n]; _b < _c.length; _b++) {
                                  var specifier = _c[_b];
                                  writeExportedName(specifier.name);
                              }
                          }
                      }
                      for (var _d = 0; _d < externalImports.length; _d++) {
                          var externalImport = externalImports[_d];
                          if (externalImport.kind !== 216) {
                              continue;
                          }
                          var exportDecl = externalImport;
                          if (!exportDecl.exportClause) {
                              continue;
                          }
                          for (var _e = 0, _f = exportDecl.exportClause.elements; _e < _f.length; _e++) {
                              var element = _f[_e];
                              writeExportedName(element.name || element.propertyName);
                          }
                      }
                      decreaseIndent();
                      writeLine();
                      write("};");
                      return emitExportStarFunction(exportedNamesStorageRef);
                      function emitExportStarFunction(localNames) {
                          var exportStarFunction = makeUniqueName("exportStar");
                          writeLine();
                          write("function " + exportStarFunction + "(m) {");
                          increaseIndent();
                          writeLine();
                          write("for(var n in m) {");
                          increaseIndent();
                          writeLine();
                          write("if (n !== \"default\"");
                          if (localNames) {
                              write("&& !" + localNames + ".hasOwnProperty(n)");
                          }
                          write(") " + exportFunctionForFile + "(n, m[n]);");
                          decreaseIndent();
                          writeLine();
                          write("}");
                          decreaseIndent();
                          writeLine();
                          write("}");
                          return exportStarFunction;
                      }
                      function writeExportedName(node) {
                          if (node.kind !== 65 && node.flags & 256) {
                              return;
                          }
                          if (started) {
                              write(",");
                          }
                          else {
                              started = true;
                          }
                          writeLine();
                          write("'");
                          if (node.kind === 65) {
                              emitNodeWithoutSourceMap(node);
                          }
                          else {
                              emitDeclarationName(node);
                          }
                          write("': true");
                      }
                  }
                  function processTopLevelVariableAndFunctionDeclarations(node) {
                      var hoistedVars;
                      var hoistedFunctionDeclarations;
                      var exportedDeclarations;
                      visit(node);
                      if (hoistedVars) {
                          writeLine();
                          write("var ");
                          var seen = {};
                          for (var i = 0; i < hoistedVars.length; ++i) {
                              var local = hoistedVars[i];
                              var name_21 = local.kind === 65
                                  ? local
                                  : local.name;
                              if (name_21) {
                                  var text = ts.unescapeIdentifier(name_21.text);
                                  if (ts.hasProperty(seen, text)) {
                                      continue;
                                  }
                                  else {
                                      seen[text] = text;
                                  }
                              }
                              if (i !== 0) {
                                  write(", ");
                              }
                              if (local.kind === 202 || local.kind === 206 || local.kind === 205) {
                                  emitDeclarationName(local);
                              }
                              else {
                                  emit(local);
                              }
                              var flags = ts.getCombinedNodeFlags(local.kind === 65 ? local.parent : local);
                              if (flags & 1) {
                                  if (!exportedDeclarations) {
                                      exportedDeclarations = [];
                                  }
                                  exportedDeclarations.push(local);
                              }
                          }
                          write(";");
                      }
                      if (hoistedFunctionDeclarations) {
                          for (var _a = 0; _a < hoistedFunctionDeclarations.length; _a++) {
                              var f = hoistedFunctionDeclarations[_a];
                              writeLine();
                              emit(f);
                              if (f.flags & 1) {
                                  if (!exportedDeclarations) {
                                      exportedDeclarations = [];
                                  }
                                  exportedDeclarations.push(f);
                              }
                          }
                      }
                      return exportedDeclarations;
                      function visit(node) {
                          if (node.flags & 2) {
                              return;
                          }
                          if (node.kind === 201) {
                              if (!hoistedFunctionDeclarations) {
                                  hoistedFunctionDeclarations = [];
                              }
                              hoistedFunctionDeclarations.push(node);
                              return;
                          }
                          if (node.kind === 202) {
                              if (!hoistedVars) {
                                  hoistedVars = [];
                              }
                              hoistedVars.push(node);
                              return;
                          }
                          if (node.kind === 205) {
                              if (shouldEmitEnumDeclaration(node)) {
                                  if (!hoistedVars) {
                                      hoistedVars = [];
                                  }
                                  hoistedVars.push(node);
                              }
                              return;
                          }
                          if (node.kind === 206) {
                              if (shouldEmitModuleDeclaration(node)) {
                                  if (!hoistedVars) {
                                      hoistedVars = [];
                                  }
                                  hoistedVars.push(node);
                              }
                              return;
                          }
                          if (node.kind === 199 || node.kind === 153) {
                              if (shouldHoistVariable(node, false)) {
                                  var name_22 = node.name;
                                  if (name_22.kind === 65) {
                                      if (!hoistedVars) {
                                          hoistedVars = [];
                                      }
                                      hoistedVars.push(name_22);
                                  }
                                  else {
                                      ts.forEachChild(name_22, visit);
                                  }
                              }
                              return;
                          }
                          if (ts.isBindingPattern(node)) {
                              ts.forEach(node.elements, visit);
                              return;
                          }
                          if (!ts.isDeclaration(node)) {
                              ts.forEachChild(node, visit);
                          }
                      }
                  }
                  function shouldHoistVariable(node, checkIfSourceFileLevelDecl) {
                      if (checkIfSourceFileLevelDecl && !shouldHoistDeclarationInSystemJsModule(node)) {
                          return false;
                      }
                      return (ts.getCombinedNodeFlags(node) & 12288) === 0 ||
                          ts.getEnclosingBlockScopeContainer(node).kind === 228;
                  }
                  function isCurrentFileSystemExternalModule() {
                      return compilerOptions.module === 4 && ts.isExternalModule(currentSourceFile);
                  }
                  function emitSystemModuleBody(node, startIndex) {
                      emitVariableDeclarationsForImports();
                      writeLine();
                      var exportedDeclarations = processTopLevelVariableAndFunctionDeclarations(node);
                      var exportStarFunction = emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations);
                      writeLine();
                      write("return {");
                      increaseIndent();
                      writeLine();
                      emitSetters(exportStarFunction);
                      writeLine();
                      emitExecute(node, startIndex);
                      emitTempDeclarations(true);
                      decreaseIndent();
                      writeLine();
                      write("}");
                  }
                  function emitSetters(exportStarFunction) {
                      write("setters:[");
                      for (var i = 0; i < externalImports.length; ++i) {
                          if (i !== 0) {
                              write(",");
                          }
                          writeLine();
                          increaseIndent();
                          var importNode = externalImports[i];
                          var importVariableName = getLocalNameForExternalImport(importNode) || "";
                          var parameterName = "_" + importVariableName;
                          write("function (" + parameterName + ") {");
                          switch (importNode.kind) {
                              case 210:
                                  if (!importNode.importClause) {
                                      break;
                                  }
                              case 209:
                                  ts.Debug.assert(importVariableName !== "");
                                  increaseIndent();
                                  writeLine();
                                  write(importVariableName + " = " + parameterName + ";");
                                  writeLine();
                                  var defaultName = importNode.kind === 210
                                      ? importNode.importClause.name
                                      : importNode.name;
                                  if (defaultName) {
                                      emitExportMemberAssignments(defaultName);
                                      writeLine();
                                  }
                                  if (importNode.kind === 210 &&
                                      importNode.importClause.namedBindings) {
                                      var namedBindings = importNode.importClause.namedBindings;
                                      if (namedBindings.kind === 212) {
                                          emitExportMemberAssignments(namedBindings.name);
                                          writeLine();
                                      }
                                      else {
                                          for (var _a = 0, _b = namedBindings.elements; _a < _b.length; _a++) {
                                              var element = _b[_a];
                                              emitExportMemberAssignments(element.name || element.propertyName);
                                              writeLine();
                                          }
                                      }
                                  }
                                  decreaseIndent();
                                  break;
                              case 216:
                                  ts.Debug.assert(importVariableName !== "");
                                  increaseIndent();
                                  if (importNode.exportClause) {
                                      for (var _c = 0, _d = importNode.exportClause.elements; _c < _d.length; _c++) {
                                          var e = _d[_c];
                                          writeLine();
                                          write(exportFunctionForFile + "(\"");
                                          emitNodeWithoutSourceMap(e.name);
                                          write("\", " + parameterName + "[\"");
                                          emitNodeWithoutSourceMap(e.propertyName || e.name);
                                          write("\"]);");
                                      }
                                  }
                                  else {
                                      writeLine();
                                      write(exportStarFunction + "(" + parameterName + ");");
                                  }
                                  writeLine();
                                  decreaseIndent();
                                  break;
                          }
                          write("}");
                          decreaseIndent();
                      }
                      write("],");
                  }
                  function emitExecute(node, startIndex) {
                      write("execute: function() {");
                      increaseIndent();
                      writeLine();
                      for (var i = startIndex; i < node.statements.length; ++i) {
                          var statement = node.statements[i];
                          switch (statement.kind) {
                              case 216:
                              case 210:
                              case 209:
                              case 201:
                                  continue;
                          }
                          writeLine();
                          emit(statement);
                      }
                      decreaseIndent();
                      writeLine();
                      write("}");
                  }
                  function emitSystemModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      ts.Debug.assert(!exportFunctionForFile);
                      exportFunctionForFile = makeUniqueName("exports");
                      write("System.register([");
                      for (var i = 0; i < externalImports.length; ++i) {
                          var text = getExternalModuleNameText(externalImports[i]);
                          if (i !== 0) {
                              write(", ");
                          }
                          write(text);
                      }
                      write("], function(" + exportFunctionForFile + ") {");
                      writeLine();
                      increaseIndent();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitSystemModuleBody(node, startIndex);
                      decreaseIndent();
                      writeLine();
                      write("});");
                  }
                  function emitAMDDependencies(node, includeNonAmdDependencies) {
                      // An AMD define function has the following shape:
                      //     define(id?, dependencies?, factory);
                      //
                      // This has the shape of
                      //     define(name, ["module1", "module2"], function (module1Alias) {
                      // The location of the alias in the parameter list in the factory function needs to
                      // match the position of the module name in the dependency list.
                      //
                      // To ensure this is true in cases of modules with no aliases, e.g.:
                      // `import "module"` or `<amd-dependency path= "a.css" />`
                      // we need to add modules without alias names to the end of the dependencies list
                      var aliasedModuleNames = [];
                      var unaliasedModuleNames = [];
                      var importAliasNames = [];
                      for (var _a = 0, _b = node.amdDependencies; _a < _b.length; _a++) {
                          var amdDependency = _b[_a];
                          if (amdDependency.name) {
                              aliasedModuleNames.push("\"" + amdDependency.path + "\"");
                              importAliasNames.push(amdDependency.name);
                          }
                          else {
                              unaliasedModuleNames.push("\"" + amdDependency.path + "\"");
                          }
                      }
                      for (var _c = 0; _c < externalImports.length; _c++) {
                          var importNode = externalImports[_c];
                          var externalModuleName = getExternalModuleNameText(importNode);
                          var importAliasName = getLocalNameForExternalImport(importNode);
                          if (includeNonAmdDependencies && importAliasName) {
                              aliasedModuleNames.push(externalModuleName);
                              importAliasNames.push(importAliasName);
                          }
                          else {
                              unaliasedModuleNames.push(externalModuleName);
                          }
                      }
                      write("[\"require\", \"exports\"");
                      if (aliasedModuleNames.length) {
                          write(", ");
                          write(aliasedModuleNames.join(", "));
                      }
                      if (unaliasedModuleNames.length) {
                          write(", ");
                          write(unaliasedModuleNames.join(", "));
                      }
                      write("], function (require, exports");
                      if (importAliasNames.length) {
                          write(", ");
                          write(importAliasNames.join(", "));
                      }
                  }
                  function emitAMDModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      writeLine();
                      write("define(");
                      if (node.amdModuleName) {
                          write("\"" + node.amdModuleName + "\", ");
                      }
                      emitAMDDependencies(node, true);
                      write(") {");
                      increaseIndent();
                      emitExportStarHelper();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                      emitExportEquals(true);
                      decreaseIndent();
                      writeLine();
                      write("});");
                  }
                  function emitCommonJSModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      emitExportStarHelper();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                      emitExportEquals(false);
                  }
                  function emitUMDModule(node, startIndex) {
                      collectExternalModuleInfo(node);
                      writeLines("(function (deps, factory) {\n    if (typeof module === 'object' && typeof module.exports === 'object') {\n        var v = factory(require, exports); if (v !== undefined) module.exports = v;\n    }\n    else if (typeof define === 'function' && define.amd) {\n        define(deps, factory);\n    }\n})(");
                      emitAMDDependencies(node, false);
                      write(") {");
                      increaseIndent();
                      emitExportStarHelper();
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                      emitExportEquals(true);
                      decreaseIndent();
                      writeLine();
                      write("});");
                  }
                  function emitES6Module(node, startIndex) {
                      externalImports = undefined;
                      exportSpecifiers = undefined;
                      exportEquals = undefined;
                      hasExportStars = false;
                      emitCaptureThisForNodeIfNecessary(node);
                      emitLinesStartingAt(node.statements, startIndex);
                      emitTempDeclarations(true);
                  }
                  function emitExportEquals(emitAsReturn) {
                      if (exportEquals && resolver.isValueAliasDeclaration(exportEquals)) {
                          writeLine();
                          emitStart(exportEquals);
                          write(emitAsReturn ? "return " : "module.exports = ");
                          emit(exportEquals.expression);
                          write(";");
                          emitEnd(exportEquals);
                      }
                  }
                  function emitDirectivePrologues(statements, startWithNewLine) {
                      for (var i = 0; i < statements.length; ++i) {
                          if (ts.isPrologueDirective(statements[i])) {
                              if (startWithNewLine || i > 0) {
                                  writeLine();
                              }
                              emit(statements[i]);
                          }
                          else {
                              return i;
                          }
                      }
                      return statements.length;
                  }
                  function writeLines(text) {
                      var lines = text.split(/\r\n|\r|\n/g);
                      for (var i = 0; i < lines.length; ++i) {
                          var line = lines[i];
                          if (line.length) {
                              writeLine();
                              write(line);
                          }
                      }
                  }
                  function emitSourceFileNode(node) {
                      writeLine();
                      emitDetachedComments(node);
                      var startIndex = emitDirectivePrologues(node.statements, false);
                      if (!compilerOptions.noEmitHelpers) {
                          if ((languageVersion < 2) && (!extendsEmitted && resolver.getNodeCheckFlags(node) & 8)) {
                              writeLines(extendsHelper);
                              extendsEmitted = true;
                          }
                          if (!decorateEmitted && resolver.getNodeCheckFlags(node) & 512) {
                              writeLines(decorateHelper);
                              if (compilerOptions.emitDecoratorMetadata) {
                                  writeLines(metadataHelper);
                              }
                              decorateEmitted = true;
                          }
                          if (!paramEmitted && resolver.getNodeCheckFlags(node) & 1024) {
                              writeLines(paramHelper);
                              paramEmitted = true;
                          }
                      }
                      if (ts.isExternalModule(node) || compilerOptions.separateCompilation) {
                          if (languageVersion >= 2) {
                              emitES6Module(node, startIndex);
                          }
                          else if (compilerOptions.module === 2) {
                              emitAMDModule(node, startIndex);
                          }
                          else if (compilerOptions.module === 4) {
                              emitSystemModule(node, startIndex);
                          }
                          else if (compilerOptions.module === 3) {
                              emitUMDModule(node, startIndex);
                          }
                          else {
                              emitCommonJSModule(node, startIndex);
                          }
                      }
                      else {
                          externalImports = undefined;
                          exportSpecifiers = undefined;
                          exportEquals = undefined;
                          hasExportStars = false;
                          emitCaptureThisForNodeIfNecessary(node);
                          emitLinesStartingAt(node.statements, startIndex);
                          emitTempDeclarations(true);
                      }
                      emitLeadingComments(node.endOfFileToken);
                  }
                  function emitNodeWithoutSourceMap(node, allowGeneratedIdentifiers) {
                      if (!node) {
                          return;
                      }
                      if (node.flags & 2) {
                          return emitOnlyPinnedOrTripleSlashComments(node);
                      }
                      var emitComments = shouldEmitLeadingAndTrailingComments(node);
                      if (emitComments) {
                          emitLeadingComments(node);
                      }
                      emitJavaScriptWorker(node, allowGeneratedIdentifiers);
                      if (emitComments) {
                          emitTrailingComments(node);
                      }
                  }
                  function shouldEmitLeadingAndTrailingComments(node) {
                      switch (node.kind) {
                          case 203:
                          case 201:
                          case 210:
                          case 209:
                          case 204:
                          case 215:
                              return false;
                          case 206:
                              return shouldEmitModuleDeclaration(node);
                          case 205:
                              return shouldEmitEnumDeclaration(node);
                      }
                      if (node.kind !== 180 &&
                          node.parent &&
                          node.parent.kind === 164 &&
                          node.parent.body === node &&
                          compilerOptions.target <= 1) {
                          return false;
                      }
                      return true;
                  }
                  function emitJavaScriptWorker(node, allowGeneratedIdentifiers) {
                      if (allowGeneratedIdentifiers === void 0) { allowGeneratedIdentifiers = true; }
                      switch (node.kind) {
                          case 65:
                              return emitIdentifier(node, allowGeneratedIdentifiers);
                          case 130:
                              return emitParameter(node);
                          case 135:
                          case 134:
                              return emitMethod(node);
                          case 137:
                          case 138:
                              return emitAccessor(node);
                          case 93:
                              return emitThis(node);
                          case 91:
                              return emitSuper(node);
                          case 89:
                              return write("null");
                          case 95:
                              return write("true");
                          case 80:
                              return write("false");
                          case 7:
                          case 8:
                          case 9:
                          case 10:
                          case 11:
                          case 12:
                          case 13:
                              return emitLiteral(node);
                          case 172:
                              return emitTemplateExpression(node);
                          case 178:
                              return emitTemplateSpan(node);
                          case 127:
                              return emitQualifiedName(node);
                          case 151:
                              return emitObjectBindingPattern(node);
                          case 152:
                              return emitArrayBindingPattern(node);
                          case 153:
                              return emitBindingElement(node);
                          case 154:
                              return emitArrayLiteral(node);
                          case 155:
                              return emitObjectLiteral(node);
                          case 225:
                              return emitPropertyAssignment(node);
                          case 226:
                              return emitShorthandPropertyAssignment(node);
                          case 128:
                              return emitComputedPropertyName(node);
                          case 156:
                              return emitPropertyAccess(node);
                          case 157:
                              return emitIndexedAccess(node);
                          case 158:
                              return emitCallExpression(node);
                          case 159:
                              return emitNewExpression(node);
                          case 160:
                              return emitTaggedTemplateExpression(node);
                          case 161:
                              return emit(node.expression);
                          case 162:
                              return emitParenExpression(node);
                          case 201:
                          case 163:
                          case 164:
                              return emitFunctionDeclaration(node);
                          case 165:
                              return emitDeleteExpression(node);
                          case 166:
                              return emitTypeOfExpression(node);
                          case 167:
                              return emitVoidExpression(node);
                          case 168:
                              return emitPrefixUnaryExpression(node);
                          case 169:
                              return emitPostfixUnaryExpression(node);
                          case 170:
                              return emitBinaryExpression(node);
                          case 171:
                              return emitConditionalExpression(node);
                          case 174:
                              return emitSpreadElementExpression(node);
                          case 173:
                              return emitYieldExpression(node);
                          case 176:
                              return;
                          case 180:
                          case 207:
                              return emitBlock(node);
                          case 181:
                              return emitVariableStatement(node);
                          case 182:
                              return write(";");
                          case 183:
                              return emitExpressionStatement(node);
                          case 184:
                              return emitIfStatement(node);
                          case 185:
                              return emitDoStatement(node);
                          case 186:
                              return emitWhileStatement(node);
                          case 187:
                              return emitForStatement(node);
                          case 189:
                          case 188:
                              return emitForInOrForOfStatement(node);
                          case 190:
                          case 191:
                              return emitBreakOrContinueStatement(node);
                          case 192:
                              return emitReturnStatement(node);
                          case 193:
                              return emitWithStatement(node);
                          case 194:
                              return emitSwitchStatement(node);
                          case 221:
                          case 222:
                              return emitCaseOrDefaultClause(node);
                          case 195:
                              return emitLabelledStatement(node);
                          case 196:
                              return emitThrowStatement(node);
                          case 197:
                              return emitTryStatement(node);
                          case 224:
                              return emitCatchClause(node);
                          case 198:
                              return emitDebuggerStatement(node);
                          case 199:
                              return emitVariableDeclaration(node);
                          case 175:
                              return emitClassExpression(node);
                          case 202:
                              return emitClassDeclaration(node);
                          case 203:
                              return emitInterfaceDeclaration(node);
                          case 205:
                              return emitEnumDeclaration(node);
                          case 227:
                              return emitEnumMember(node);
                          case 206:
                              return emitModuleDeclaration(node);
                          case 210:
                              return emitImportDeclaration(node);
                          case 209:
                              return emitImportEqualsDeclaration(node);
                          case 216:
                              return emitExportDeclaration(node);
                          case 215:
                              return emitExportAssignment(node);
                          case 228:
                              return emitSourceFileNode(node);
                      }
                  }
                  function hasDetachedComments(pos) {
                      return detachedCommentsInfo !== undefined && ts.lastOrUndefined(detachedCommentsInfo).nodePos === pos;
                  }
                  function getLeadingCommentsWithoutDetachedComments() {
                      var leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, ts.lastOrUndefined(detachedCommentsInfo).detachedCommentEndPos);
                      if (detachedCommentsInfo.length - 1) {
                          detachedCommentsInfo.pop();
                      }
                      else {
                          detachedCommentsInfo = undefined;
                      }
                      return leadingComments;
                  }
                  function filterComments(ranges, onlyPinnedOrTripleSlashComments) {
                      if (ranges && onlyPinnedOrTripleSlashComments) {
                          ranges = ts.filter(ranges, isPinnedOrTripleSlashComment);
                          if (ranges.length === 0) {
                              return undefined;
                          }
                      }
                      return ranges;
                  }
                  function getLeadingCommentsToEmit(node) {
                      if (node.parent) {
                          if (node.parent.kind === 228 || node.pos !== node.parent.pos) {
                              if (hasDetachedComments(node.pos)) {
                                  return getLeadingCommentsWithoutDetachedComments();
                              }
                              else {
                                  return ts.getLeadingCommentRangesOfNode(node, currentSourceFile);
                              }
                          }
                      }
                  }
                  function getTrailingCommentsToEmit(node) {
                      if (node.parent) {
                          if (node.parent.kind === 228 || node.end !== node.parent.end) {
                              return ts.getTrailingCommentRanges(currentSourceFile.text, node.end);
                          }
                      }
                  }
                  function emitOnlyPinnedOrTripleSlashComments(node) {
                      emitLeadingCommentsWorker(node, true);
                  }
                  function emitLeadingComments(node) {
                      return emitLeadingCommentsWorker(node, compilerOptions.removeComments);
                  }
                  function emitLeadingCommentsWorker(node, onlyPinnedOrTripleSlashComments) {
                      var leadingComments = filterComments(getLeadingCommentsToEmit(node), onlyPinnedOrTripleSlashComments);
                      ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments);
                      ts.emitComments(currentSourceFile, writer, leadingComments, true, newLine, writeComment);
                  }
                  function emitTrailingComments(node) {
                      var trailingComments = filterComments(getTrailingCommentsToEmit(node), compilerOptions.removeComments);
                      ts.emitComments(currentSourceFile, writer, trailingComments, false, newLine, writeComment);
                  }
                  function emitLeadingCommentsOfPosition(pos) {
                      var leadingComments;
                      if (hasDetachedComments(pos)) {
                          leadingComments = getLeadingCommentsWithoutDetachedComments();
                      }
                      else {
                          leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, pos);
                      }
                      leadingComments = filterComments(leadingComments, compilerOptions.removeComments);
                      ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, { pos: pos, end: pos }, leadingComments);
                      ts.emitComments(currentSourceFile, writer, leadingComments, true, newLine, writeComment);
                  }
                  function emitDetachedComments(node) {
                      var leadingComments = ts.getLeadingCommentRanges(currentSourceFile.text, node.pos);
                      if (leadingComments) {
                          var detachedComments = [];
                          var lastComment;
                          ts.forEach(leadingComments, function (comment) {
                              if (lastComment) {
                                  var lastCommentLine = ts.getLineOfLocalPosition(currentSourceFile, lastComment.end);
                                  var commentLine = ts.getLineOfLocalPosition(currentSourceFile, comment.pos);
                                  if (commentLine >= lastCommentLine + 2) {
                                      return detachedComments;
                                  }
                              }
                              detachedComments.push(comment);
                              lastComment = comment;
                          });
                          if (detachedComments.length) {
                              var lastCommentLine = ts.getLineOfLocalPosition(currentSourceFile, ts.lastOrUndefined(detachedComments).end);
                              var nodeLine = ts.getLineOfLocalPosition(currentSourceFile, ts.skipTrivia(currentSourceFile.text, node.pos));
                              if (nodeLine >= lastCommentLine + 2) {
                                  ts.emitNewLineBeforeLeadingComments(currentSourceFile, writer, node, leadingComments);
                                  ts.emitComments(currentSourceFile, writer, detachedComments, true, newLine, writeComment);
                                  var currentDetachedCommentInfo = { nodePos: node.pos, detachedCommentEndPos: ts.lastOrUndefined(detachedComments).end };
                                  if (detachedCommentsInfo) {
                                      detachedCommentsInfo.push(currentDetachedCommentInfo);
                                  }
                                  else {
                                      detachedCommentsInfo = [currentDetachedCommentInfo];
                                  }
                              }
                          }
                      }
                  }
                  function isPinnedOrTripleSlashComment(comment) {
                      if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 42) {
                          return currentSourceFile.text.charCodeAt(comment.pos + 2) === 33;
                      }
                      else if (currentSourceFile.text.charCodeAt(comment.pos + 1) === 47 &&
                          comment.pos + 2 < comment.end &&
                          currentSourceFile.text.charCodeAt(comment.pos + 2) === 47 &&
                          currentSourceFile.text.substring(comment.pos, comment.end).match(ts.fullTripleSlashReferencePathRegEx)) {
                          return true;
                      }
                  }
              }
              function emitFile(jsFilePath, sourceFile) {
                  emitJavaScript(jsFilePath, sourceFile);
                  if (compilerOptions.declaration) {
                      ts.writeDeclarationFile(jsFilePath, sourceFile, host, resolver, diagnostics);
                  }
              }
          }
          ts.emitFiles = emitFiles;
      })(ts || (ts = {}));
      /// <reference path="sys.ts" />
      /// <reference path="emitter.ts" />
      var ts;
      (function (ts) {
          ts.programTime = 0;
          ts.emitTime = 0;
          ts.ioReadTime = 0;
          ts.ioWriteTime = 0;
          ts.version = "1.5.2";
          var carriageReturnLineFeed = "\r\n";
          var lineFeed = "\n";
          function findConfigFile(searchPath) {
              var fileName = "tsconfig.json";
              while (true) {
                  if (ts.sys.fileExists(fileName)) {
                      return fileName;
                  }
                  var parentPath = ts.getDirectoryPath(searchPath);
                  if (parentPath === searchPath) {
                      break;
                  }
                  searchPath = parentPath;
                  fileName = "../" + fileName;
              }
              return undefined;
          }
          ts.findConfigFile = findConfigFile;
          function createCompilerHost(options, setParentNodes) {
              var currentDirectory;
              var existingDirectories = {};
              function getCanonicalFileName(fileName) {
                  return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
              }
              var unsupportedFileEncodingErrorCode = -2147024809;
              function getSourceFile(fileName, languageVersion, onError) {
                  var text;
                  try {
                      var start = new Date().getTime();
                      text = ts.sys.readFile(fileName, options.charset);
                      ts.ioReadTime += new Date().getTime() - start;
                  }
                  catch (e) {
                      if (onError) {
                          onError(e.number === unsupportedFileEncodingErrorCode
                              ? ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_file_encoding).messageText
                              : e.message);
                      }
                      text = "";
                  }
                  return text !== undefined ? ts.createSourceFile(fileName, text, languageVersion, setParentNodes) : undefined;
              }
              function directoryExists(directoryPath) {
                  if (ts.hasProperty(existingDirectories, directoryPath)) {
                      return true;
                  }
                  if (ts.sys.directoryExists(directoryPath)) {
                      existingDirectories[directoryPath] = true;
                      return true;
                  }
                  return false;
              }
              function ensureDirectoriesExist(directoryPath) {
                  if (directoryPath.length > ts.getRootLength(directoryPath) && !directoryExists(directoryPath)) {
                      var parentDirectory = ts.getDirectoryPath(directoryPath);
                      ensureDirectoriesExist(parentDirectory);
                      ts.sys.createDirectory(directoryPath);
                  }
              }
              function writeFile(fileName, data, writeByteOrderMark, onError) {
                  try {
                      var start = new Date().getTime();
                      ensureDirectoriesExist(ts.getDirectoryPath(ts.normalizePath(fileName)));
                      ts.sys.writeFile(fileName, data, writeByteOrderMark);
                      ts.ioWriteTime += new Date().getTime() - start;
                  }
                  catch (e) {
                      if (onError) {
                          onError(e.message);
                      }
                  }
              }
              var newLine = options.newLine === 0 ? carriageReturnLineFeed :
                  options.newLine === 1 ? lineFeed :
                      ts.sys.newLine;
              return {
                  getSourceFile: getSourceFile,
                  getDefaultLibFileName: function (options) { return ts.combinePaths(ts.getDirectoryPath(ts.normalizePath(ts.sys.getExecutingFilePath())), ts.getDefaultLibFileName(options)); },
                  writeFile: writeFile,
                  getCurrentDirectory: function () { return currentDirectory || (currentDirectory = ts.sys.getCurrentDirectory()); },
                  useCaseSensitiveFileNames: function () { return ts.sys.useCaseSensitiveFileNames; },
                  getCanonicalFileName: getCanonicalFileName,
                  getNewLine: function () { return newLine; }
              };
          }
          ts.createCompilerHost = createCompilerHost;
          function getPreEmitDiagnostics(program, sourceFile) {
              var diagnostics = program.getSyntacticDiagnostics(sourceFile).concat(program.getGlobalDiagnostics()).concat(program.getSemanticDiagnostics(sourceFile));
              if (program.getCompilerOptions().declaration) {
                  diagnostics.concat(program.getDeclarationDiagnostics(sourceFile));
              }
              return ts.sortAndDeduplicateDiagnostics(diagnostics);
          }
          ts.getPreEmitDiagnostics = getPreEmitDiagnostics;
          function flattenDiagnosticMessageText(messageText, newLine) {
              if (typeof messageText === "string") {
                  return messageText;
              }
              else {
                  var diagnosticChain = messageText;
                  var result = "";
                  var indent = 0;
                  while (diagnosticChain) {
                      if (indent) {
                          result += newLine;
                          for (var i = 0; i < indent; i++) {
                              result += "  ";
                          }
                      }
                      result += diagnosticChain.messageText;
                      indent++;
                      diagnosticChain = diagnosticChain.next;
                  }
                  return result;
              }
          }
          ts.flattenDiagnosticMessageText = flattenDiagnosticMessageText;
          function createProgram(rootNames, options, host) {
              var program;
              var files = [];
              var filesByName = {};
              var diagnostics = ts.createDiagnosticCollection();
              var seenNoDefaultLib = options.noLib;
              var commonSourceDirectory;
              var diagnosticsProducingTypeChecker;
              var noDiagnosticsTypeChecker;
              var start = new Date().getTime();
              host = host || createCompilerHost(options);
              ts.forEach(rootNames, function (name) { return processRootFile(name, false); });
              if (!seenNoDefaultLib) {
                  processRootFile(host.getDefaultLibFileName(options), true);
              }
              verifyCompilerOptions();
              ts.programTime += new Date().getTime() - start;
              program = {
                  getSourceFile: getSourceFile,
                  getSourceFiles: function () { return files; },
                  getCompilerOptions: function () { return options; },
                  getSyntacticDiagnostics: getSyntacticDiagnostics,
                  getGlobalDiagnostics: getGlobalDiagnostics,
                  getSemanticDiagnostics: getSemanticDiagnostics,
                  getDeclarationDiagnostics: getDeclarationDiagnostics,
                  getTypeChecker: getTypeChecker,
                  getDiagnosticsProducingTypeChecker: getDiagnosticsProducingTypeChecker,
                  getCommonSourceDirectory: function () { return commonSourceDirectory; },
                  emit: emit,
                  getCurrentDirectory: function () { return host.getCurrentDirectory(); },
                  getNodeCount: function () { return getDiagnosticsProducingTypeChecker().getNodeCount(); },
                  getIdentifierCount: function () { return getDiagnosticsProducingTypeChecker().getIdentifierCount(); },
                  getSymbolCount: function () { return getDiagnosticsProducingTypeChecker().getSymbolCount(); },
                  getTypeCount: function () { return getDiagnosticsProducingTypeChecker().getTypeCount(); }
              };
              return program;
              function getEmitHost(writeFileCallback) {
                  return {
                      getCanonicalFileName: function (fileName) { return host.getCanonicalFileName(fileName); },
                      getCommonSourceDirectory: program.getCommonSourceDirectory,
                      getCompilerOptions: program.getCompilerOptions,
                      getCurrentDirectory: function () { return host.getCurrentDirectory(); },
                      getNewLine: function () { return host.getNewLine(); },
                      getSourceFile: program.getSourceFile,
                      getSourceFiles: program.getSourceFiles,
                      writeFile: writeFileCallback || (function (fileName, data, writeByteOrderMark, onError) { return host.writeFile(fileName, data, writeByteOrderMark, onError); })
                  };
              }
              function getDiagnosticsProducingTypeChecker() {
                  return diagnosticsProducingTypeChecker || (diagnosticsProducingTypeChecker = ts.createTypeChecker(program, true));
              }
              function getTypeChecker() {
                  return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false));
              }
              function emit(sourceFile, writeFileCallback) {
                  if (options.noEmitOnError && getPreEmitDiagnostics(this).length > 0) {
                      return { diagnostics: [], sourceMaps: undefined, emitSkipped: true };
                  }
                  var emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver(options.out ? undefined : sourceFile);
                  var start = new Date().getTime();
                  var emitResult = ts.emitFiles(emitResolver, getEmitHost(writeFileCallback), sourceFile);
                  ts.emitTime += new Date().getTime() - start;
                  return emitResult;
              }
              function getSourceFile(fileName) {
                  fileName = host.getCanonicalFileName(ts.normalizeSlashes(fileName));
                  return ts.hasProperty(filesByName, fileName) ? filesByName[fileName] : undefined;
              }
              function getDiagnosticsHelper(sourceFile, getDiagnostics) {
                  if (sourceFile) {
                      return getDiagnostics(sourceFile);
                  }
                  var allDiagnostics = [];
                  ts.forEach(program.getSourceFiles(), function (sourceFile) {
                      ts.addRange(allDiagnostics, getDiagnostics(sourceFile));
                  });
                  return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
              }
              function getSyntacticDiagnostics(sourceFile) {
                  return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile);
              }
              function getSemanticDiagnostics(sourceFile) {
                  return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile);
              }
              function getDeclarationDiagnostics(sourceFile) {
                  return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile);
              }
              function getSyntacticDiagnosticsForFile(sourceFile) {
                  return sourceFile.parseDiagnostics;
              }
              function getSemanticDiagnosticsForFile(sourceFile) {
                  var typeChecker = getDiagnosticsProducingTypeChecker();
                  ts.Debug.assert(!!sourceFile.bindDiagnostics);
                  var bindDiagnostics = sourceFile.bindDiagnostics;
                  var checkDiagnostics = typeChecker.getDiagnostics(sourceFile);
                  var programDiagnostics = diagnostics.getDiagnostics(sourceFile.fileName);
                  return bindDiagnostics.concat(checkDiagnostics).concat(programDiagnostics);
              }
              function getDeclarationDiagnosticsForFile(sourceFile) {
                  if (!ts.isDeclarationFile(sourceFile)) {
                      var resolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile);
                      var writeFile = function () { };
                      return ts.getDeclarationDiagnostics(getEmitHost(writeFile), resolver, sourceFile);
                  }
              }
              function getGlobalDiagnostics() {
                  var typeChecker = getDiagnosticsProducingTypeChecker();
                  var allDiagnostics = [];
                  ts.addRange(allDiagnostics, typeChecker.getGlobalDiagnostics());
                  ts.addRange(allDiagnostics, diagnostics.getGlobalDiagnostics());
                  return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
              }
              function hasExtension(fileName) {
                  return ts.getBaseFileName(fileName).indexOf(".") >= 0;
              }
              function processRootFile(fileName, isDefaultLib) {
                  processSourceFile(ts.normalizePath(fileName), isDefaultLib);
              }
              function processSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd) {
                  var start;
                  var length;
                  var extensions;
                  var diagnosticArgument;
                  if (refEnd !== undefined && refPos !== undefined) {
                      start = refPos;
                      length = refEnd - refPos;
                  }
                  var diagnostic;
                  if (hasExtension(fileName)) {
                      if (!options.allowNonTsExtensions && !ts.forEach(ts.supportedExtensions, function (extension) { return ts.fileExtensionIs(host.getCanonicalFileName(fileName), extension); })) {
                          diagnostic = ts.Diagnostics.File_0_has_unsupported_extension_The_only_supported_extensions_are_1;
                          diagnosticArgument = [fileName, "'" + ts.supportedExtensions.join("', '") + "'"];
                      }
                      else if (!findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
                          diagnostic = ts.Diagnostics.File_0_not_found;
                          diagnosticArgument = [fileName];
                      }
                      else if (refFile && host.getCanonicalFileName(fileName) === host.getCanonicalFileName(refFile.fileName)) {
                          diagnostic = ts.Diagnostics.A_file_cannot_have_a_reference_to_itself;
                          diagnosticArgument = [fileName];
                      }
                  }
                  else {
                      if (options.allowNonTsExtensions && !findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) {
                          diagnostic = ts.Diagnostics.File_0_not_found;
                          diagnosticArgument = [fileName];
                      }
                      else if (!ts.forEach(ts.supportedExtensions, function (extension) { return findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd); })) {
                          diagnostic = ts.Diagnostics.File_0_not_found;
                          fileName += ".ts";
                          diagnosticArgument = [fileName];
                      }
                  }
                  if (diagnostic) {
                      if (refFile) {
                          diagnostics.add(ts.createFileDiagnostic.apply(void 0, [refFile, start, length, diagnostic].concat(diagnosticArgument)));
                      }
                      else {
                          diagnostics.add(ts.createCompilerDiagnostic.apply(void 0, [diagnostic].concat(diagnosticArgument)));
                      }
                  }
              }
              function findSourceFile(fileName, isDefaultLib, refFile, refStart, refLength) {
                  var canonicalName = host.getCanonicalFileName(ts.normalizeSlashes(fileName));
                  if (ts.hasProperty(filesByName, canonicalName)) {
                      return getSourceFileFromCache(fileName, canonicalName, false);
                  }
                  else {
                      var normalizedAbsolutePath = ts.getNormalizedAbsolutePath(fileName, host.getCurrentDirectory());
                      var canonicalAbsolutePath = host.getCanonicalFileName(normalizedAbsolutePath);
                      if (ts.hasProperty(filesByName, canonicalAbsolutePath)) {
                          return getSourceFileFromCache(normalizedAbsolutePath, canonicalAbsolutePath, true);
                      }
                      var file = filesByName[canonicalName] = host.getSourceFile(fileName, options.target, function (hostErrorMessage) {
                          if (refFile) {
                              diagnostics.add(ts.createFileDiagnostic(refFile, refStart, refLength, ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
                          }
                          else {
                              diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
                          }
                      });
                      if (file) {
                          seenNoDefaultLib = seenNoDefaultLib || file.hasNoDefaultLib;
                          filesByName[canonicalAbsolutePath] = file;
                          if (!options.noResolve) {
                              var basePath = ts.getDirectoryPath(fileName);
                              processReferencedFiles(file, basePath);
                              processImportedModules(file, basePath);
                          }
                          if (isDefaultLib) {
                              files.unshift(file);
                          }
                          else {
                              files.push(file);
                          }
                      }
                      return file;
                  }
                  function getSourceFileFromCache(fileName, canonicalName, useAbsolutePath) {
                      var file = filesByName[canonicalName];
                      if (file && host.useCaseSensitiveFileNames()) {
                          var sourceFileName = useAbsolutePath ? ts.getNormalizedAbsolutePath(file.fileName, host.getCurrentDirectory()) : file.fileName;
                          if (canonicalName !== sourceFileName) {
                              diagnostics.add(ts.createFileDiagnostic(refFile, refStart, refLength, ts.Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, fileName, sourceFileName));
                          }
                      }
                      return file;
                  }
              }
              function processReferencedFiles(file, basePath) {
                  ts.forEach(file.referencedFiles, function (ref) {
                      var referencedFileName = ts.isRootedDiskPath(ref.fileName) ? ref.fileName : ts.combinePaths(basePath, ref.fileName);
                      processSourceFile(ts.normalizePath(referencedFileName), false, file, ref.pos, ref.end);
                  });
              }
              function processImportedModules(file, basePath) {
                  ts.forEach(file.statements, function (node) {
                      if (node.kind === 210 || node.kind === 209 || node.kind === 216) {
                          var moduleNameExpr = ts.getExternalModuleName(node);
                          if (moduleNameExpr && moduleNameExpr.kind === 8) {
                              var moduleNameText = moduleNameExpr.text;
                              if (moduleNameText) {
                                  var searchPath = basePath;
                                  var searchName;
                                  while (true) {
                                      searchName = ts.normalizePath(ts.combinePaths(searchPath, moduleNameText));
                                      if (ts.forEach(ts.supportedExtensions, function (extension) { return findModuleSourceFile(searchName + extension, moduleNameExpr); })) {
                                          break;
                                      }
                                      var parentPath = ts.getDirectoryPath(searchPath);
                                      if (parentPath === searchPath) {
                                          break;
                                      }
                                      searchPath = parentPath;
                                  }
                              }
                          }
                      }
                      else if (node.kind === 206 && node.name.kind === 8 && (node.flags & 2 || ts.isDeclarationFile(file))) {
                          ts.forEachChild(node.body, function (node) {
                              if (ts.isExternalModuleImportEqualsDeclaration(node) &&
                                  ts.getExternalModuleImportEqualsDeclarationExpression(node).kind === 8) {
                                  var nameLiteral = ts.getExternalModuleImportEqualsDeclarationExpression(node);
                                  var moduleName = nameLiteral.text;
                                  if (moduleName) {
                                      var searchName = ts.normalizePath(ts.combinePaths(basePath, moduleName));
                                      ts.forEach(ts.supportedExtensions, function (extension) { return findModuleSourceFile(searchName + extension, nameLiteral); });
                                  }
                              }
                          });
                      }
                  });
                  function findModuleSourceFile(fileName, nameLiteral) {
                      return findSourceFile(fileName, false, file, nameLiteral.pos, nameLiteral.end - nameLiteral.pos);
                  }
              }
              function computeCommonSourceDirectory(sourceFiles) {
                  var commonPathComponents;
                  var currentDirectory = host.getCurrentDirectory();
                  ts.forEach(files, function (sourceFile) {
                      if (ts.isDeclarationFile(sourceFile)) {
                          return;
                      }
                      var sourcePathComponents = ts.getNormalizedPathComponents(sourceFile.fileName, currentDirectory);
                      sourcePathComponents.pop();
                      if (!commonPathComponents) {
                          commonPathComponents = sourcePathComponents;
                          return;
                      }
                      for (var i = 0, n = Math.min(commonPathComponents.length, sourcePathComponents.length); i < n; i++) {
                          if (commonPathComponents[i] !== sourcePathComponents[i]) {
                              if (i === 0) {
                                  diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files));
                                  return;
                              }
                              commonPathComponents.length = i;
                              break;
                          }
                      }
                      if (sourcePathComponents.length < commonPathComponents.length) {
                          commonPathComponents.length = sourcePathComponents.length;
                      }
                  });
                  return ts.getNormalizedPathFromPathComponents(commonPathComponents);
              }
              function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) {
                  var allFilesBelongToPath = true;
                  if (sourceFiles) {
                      var currentDirectory = host.getCurrentDirectory();
                      var absoluteRootDirectoryPath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(rootDirectory, currentDirectory));
                      for (var _i = 0; _i < sourceFiles.length; _i++) {
                          var sourceFile = sourceFiles[_i];
                          if (!ts.isDeclarationFile(sourceFile)) {
                              var absoluteSourceFilePath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory));
                              if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) {
                                  diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, sourceFile.fileName, options.rootDir));
                                  allFilesBelongToPath = false;
                              }
                          }
                      }
                  }
                  return allFilesBelongToPath;
              }
              function verifyCompilerOptions() {
                  if (options.separateCompilation) {
                      if (options.sourceMap) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceMap_cannot_be_specified_with_option_separateCompilation));
                      }
                      if (options.declaration) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_declaration_cannot_be_specified_with_option_separateCompilation));
                      }
                      if (options.noEmitOnError) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation));
                      }
                      if (options.out) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_out_cannot_be_specified_with_option_separateCompilation));
                      }
                  }
                  if (options.inlineSourceMap) {
                      if (options.sourceMap) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap));
                      }
                      if (options.mapRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap));
                      }
                      if (options.sourceRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap));
                      }
                  }
                  if (options.inlineSources) {
                      if (!options.sourceMap && !options.inlineSourceMap) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided));
                      }
                  }
                  if (!options.sourceMap && (options.mapRoot || options.sourceRoot)) {
                      if (options.mapRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_mapRoot_cannot_be_specified_without_specifying_sourceMap_option));
                      }
                      if (options.sourceRoot) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_sourceRoot_cannot_be_specified_without_specifying_sourceMap_option));
                      }
                      return;
                  }
                  var languageVersion = options.target || 0;
                  var firstExternalModuleSourceFile = ts.forEach(files, function (f) { return ts.isExternalModule(f) ? f : undefined; });
                  if (options.separateCompilation) {
                      if (!options.module && languageVersion < 2) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher));
                      }
                      var firstNonExternalModuleSourceFile = ts.forEach(files, function (f) { return !ts.isExternalModule(f) && !ts.isDeclarationFile(f) ? f : undefined; });
                      if (firstNonExternalModuleSourceFile) {
                          var span = ts.getErrorSpanForNode(firstNonExternalModuleSourceFile, firstNonExternalModuleSourceFile);
                          diagnostics.add(ts.createFileDiagnostic(firstNonExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_namespaces_when_the_separateCompilation_flag_is_provided));
                      }
                  }
                  else if (firstExternalModuleSourceFile && languageVersion < 2 && !options.module) {
                      var span = ts.getErrorSpanForNode(firstExternalModuleSourceFile, firstExternalModuleSourceFile.externalModuleIndicator);
                      diagnostics.add(ts.createFileDiagnostic(firstExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_modules_unless_the_module_flag_is_provided));
                  }
                  if (options.module && languageVersion >= 2) {
                      diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_compile_modules_into_commonjs_amd_system_or_umd_when_targeting_ES6_or_higher));
                  }
                  if (options.outDir ||
                      options.sourceRoot ||
                      (options.mapRoot &&
                          (!options.out || firstExternalModuleSourceFile !== undefined))) {
                      if (options.rootDir && checkSourceFilesBelongToPath(files, options.rootDir)) {
                          commonSourceDirectory = ts.getNormalizedAbsolutePath(options.rootDir, host.getCurrentDirectory());
                      }
                      else {
                          commonSourceDirectory = computeCommonSourceDirectory(files);
                      }
                      if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== ts.directorySeparator) {
                          commonSourceDirectory += ts.directorySeparator;
                      }
                  }
                  if (options.noEmit) {
                      if (options.out || options.outDir) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmit_cannot_be_specified_with_option_out_or_outDir));
                      }
                      if (options.declaration) {
                          diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_noEmit_cannot_be_specified_with_option_declaration));
                      }
                  }
              }
          }
          ts.createProgram = createProgram;
      })(ts || (ts = {}));
      /// <reference path="sys.ts"/>
      /// <reference path="types.ts"/>
      /// <reference path="core.ts"/>
      /// <reference path="scanner.ts"/>
      var ts;
      (function (ts) {
          ts.optionDeclarations = [
              {
                  name: "charset",
                  type: "string"
              },
              {
                  name: "declaration",
                  shortName: "d",
                  type: "boolean",
                  description: ts.Diagnostics.Generates_corresponding_d_ts_file
              },
              {
                  name: "diagnostics",
                  type: "boolean"
              },
              {
                  name: "emitBOM",
                  type: "boolean"
              },
              {
                  name: "help",
                  shortName: "h",
                  type: "boolean",
                  description: ts.Diagnostics.Print_this_message
              },
              {
                  name: "inlineSourceMap",
                  type: "boolean"
              },
              {
                  name: "inlineSources",
                  type: "boolean"
              },
              {
                  name: "listFiles",
                  type: "boolean"
              },
              {
                  name: "locale",
                  type: "string"
              },
              {
                  name: "mapRoot",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations,
                  paramType: ts.Diagnostics.LOCATION
              },
              {
                  name: "module",
                  shortName: "m",
                  type: {
                      "commonjs": 1,
                      "amd": 2,
                      "system": 4,
                      "umd": 3
                  },
                  description: ts.Diagnostics.Specify_module_code_generation_Colon_commonjs_amd_system_or_umd,
                  paramType: ts.Diagnostics.KIND,
                  error: ts.Diagnostics.Argument_for_module_option_must_be_commonjs_amd_system_or_umd
              },
              {
                  name: "newLine",
                  type: {
                      "crlf": 0,
                      "lf": 1
                  },
                  description: ts.Diagnostics.Specifies_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix,
                  paramType: ts.Diagnostics.NEWLINE,
                  error: ts.Diagnostics.Argument_for_newLine_option_must_be_CRLF_or_LF
              },
              {
                  name: "noEmit",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_outputs
              },
              {
                  name: "noEmitHelpers",
                  type: "boolean"
              },
              {
                  name: "noEmitOnError",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_outputs_if_any_errors_were_reported
              },
              {
                  name: "noImplicitAny",
                  type: "boolean",
                  description: ts.Diagnostics.Raise_error_on_expressions_and_declarations_with_an_implied_any_type
              },
              {
                  name: "noLib",
                  type: "boolean"
              },
              {
                  name: "noResolve",
                  type: "boolean"
              },
              {
                  name: "out",
                  type: "string",
                  description: ts.Diagnostics.Concatenate_and_emit_output_to_single_file,
                  paramType: ts.Diagnostics.FILE
              },
              {
                  name: "outDir",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Redirect_output_structure_to_the_directory,
                  paramType: ts.Diagnostics.DIRECTORY
              },
              {
                  name: "preserveConstEnums",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_erase_const_enum_declarations_in_generated_code
              },
              {
                  name: "project",
                  shortName: "p",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Compile_the_project_in_the_given_directory,
                  paramType: ts.Diagnostics.DIRECTORY
              },
              {
                  name: "removeComments",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_comments_to_output
              },
              {
                  name: "rootDir",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Specifies_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir,
                  paramType: ts.Diagnostics.LOCATION
              },
              {
                  name: "separateCompilation",
                  type: "boolean"
              },
              {
                  name: "sourceMap",
                  type: "boolean",
                  description: ts.Diagnostics.Generates_corresponding_map_file
              },
              {
                  name: "sourceRoot",
                  type: "string",
                  isFilePath: true,
                  description: ts.Diagnostics.Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations,
                  paramType: ts.Diagnostics.LOCATION
              },
              {
                  name: "suppressImplicitAnyIndexErrors",
                  type: "boolean",
                  description: ts.Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures
              },
              {
                  name: "stripInternal",
                  type: "boolean",
                  description: ts.Diagnostics.Do_not_emit_declarations_for_code_that_has_an_internal_annotation,
                  experimental: true
              },
              {
                  name: "target",
                  shortName: "t",
                  type: { "es3": 0, "es5": 1, "es6": 2 },
                  description: ts.Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES6_experimental,
                  paramType: ts.Diagnostics.VERSION,
                  error: ts.Diagnostics.Argument_for_target_option_must_be_ES3_ES5_or_ES6
              },
              {
                  name: "version",
                  shortName: "v",
                  type: "boolean",
                  description: ts.Diagnostics.Print_the_compiler_s_version
              },
              {
                  name: "watch",
                  shortName: "w",
                  type: "boolean",
                  description: ts.Diagnostics.Watch_input_files
              },
              {
                  name: "emitDecoratorMetadata",
                  type: "boolean",
                  experimental: true
              }
          ];
          function parseCommandLine(commandLine) {
              var options = {};
              var fileNames = [];
              var errors = [];
              var shortOptionNames = {};
              var optionNameMap = {};
              ts.forEach(ts.optionDeclarations, function (option) {
                  optionNameMap[option.name.toLowerCase()] = option;
                  if (option.shortName) {
                      shortOptionNames[option.shortName] = option.name;
                  }
              });
              parseStrings(commandLine);
              return {
                  options: options,
                  fileNames: fileNames,
                  errors: errors
              };
              function parseStrings(args) {
                  var i = 0;
                  while (i < args.length) {
                      var s = args[i++];
                      if (s.charCodeAt(0) === 64) {
                          parseResponseFile(s.slice(1));
                      }
                      else if (s.charCodeAt(0) === 45) {
                          s = s.slice(s.charCodeAt(1) === 45 ? 2 : 1).toLowerCase();
                          if (ts.hasProperty(shortOptionNames, s)) {
                              s = shortOptionNames[s];
                          }
                          if (ts.hasProperty(optionNameMap, s)) {
                              var opt = optionNameMap[s];
                              if (!args[i] && opt.type !== "boolean") {
                                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_expects_an_argument, opt.name));
                              }
                              switch (opt.type) {
                                  case "number":
                                      options[opt.name] = parseInt(args[i++]);
                                      break;
                                  case "boolean":
                                      options[opt.name] = true;
                                      break;
                                  case "string":
                                      options[opt.name] = args[i++] || "";
                                      break;
                                  default:
                                      var map = opt.type;
                                      var key = (args[i++] || "").toLowerCase();
                                      if (ts.hasProperty(map, key)) {
                                          options[opt.name] = map[key];
                                      }
                                      else {
                                          errors.push(ts.createCompilerDiagnostic(opt.error));
                                      }
                              }
                          }
                          else {
                              errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, s));
                          }
                      }
                      else {
                          fileNames.push(s);
                      }
                  }
              }
              function parseResponseFile(fileName) {
                  var text = ts.sys.readFile(fileName);
                  if (!text) {
                      errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_not_found, fileName));
                      return;
                  }
                  var args = [];
                  var pos = 0;
                  while (true) {
                      while (pos < text.length && text.charCodeAt(pos) <= 32)
                          pos++;
                      if (pos >= text.length)
                          break;
                      var start = pos;
                      if (text.charCodeAt(start) === 34) {
                          pos++;
                          while (pos < text.length && text.charCodeAt(pos) !== 34)
                              pos++;
                          if (pos < text.length) {
                              args.push(text.substring(start + 1, pos));
                              pos++;
                          }
                          else {
                              errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unterminated_quoted_string_in_response_file_0, fileName));
                          }
                      }
                      else {
                          while (text.charCodeAt(pos) > 32)
                              pos++;
                          args.push(text.substring(start, pos));
                      }
                  }
                  parseStrings(args);
              }
          }
          ts.parseCommandLine = parseCommandLine;
          function readConfigFile(fileName) {
              try {
                  var text = ts.sys.readFile(fileName);
              }
              catch (e) {
                  return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, e.message) };
              }
              return parseConfigFileText(fileName, text);
          }
          ts.readConfigFile = readConfigFile;
          function parseConfigFileText(fileName, jsonText) {
              try {
                  return { config: /\S/.test(jsonText) ? JSON.parse(jsonText) : {} };
              }
              catch (e) {
                  return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Failed_to_parse_file_0_Colon_1, fileName, e.message) };
              }
          }
          ts.parseConfigFileText = parseConfigFileText;
          function parseConfigFile(json, host, basePath) {
              var errors = [];
              return {
                  options: getCompilerOptions(),
                  fileNames: getFiles(),
                  errors: errors
              };
              function getCompilerOptions() {
                  var options = {};
                  var optionNameMap = {};
                  ts.forEach(ts.optionDeclarations, function (option) {
                      optionNameMap[option.name] = option;
                  });
                  var jsonOptions = json["compilerOptions"];
                  if (jsonOptions) {
                      for (var id in jsonOptions) {
                          if (ts.hasProperty(optionNameMap, id)) {
                              var opt = optionNameMap[id];
                              var optType = opt.type;
                              var value = jsonOptions[id];
                              var expectedType = typeof optType === "string" ? optType : "string";
                              if (typeof value === expectedType) {
                                  if (typeof optType !== "string") {
                                      var key = value.toLowerCase();
                                      if (ts.hasProperty(optType, key)) {
                                          value = optType[key];
                                      }
                                      else {
                                          errors.push(ts.createCompilerDiagnostic(opt.error));
                                          value = 0;
                                      }
                                  }
                                  if (opt.isFilePath) {
                                      value = ts.normalizePath(ts.combinePaths(basePath, value));
                                  }
                                  options[opt.name] = value;
                              }
                              else {
                                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, id, expectedType));
                              }
                          }
                          else {
                              errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, id));
                          }
                      }
                  }
                  return options;
              }
              function getFiles() {
                  var files = [];
                  if (ts.hasProperty(json, "files")) {
                      if (json["files"] instanceof Array) {
                          var files = ts.map(json["files"], function (s) { return ts.combinePaths(basePath, s); });
                      }
                  }
                  else {
                      var sysFiles = host.readDirectory(basePath, ".ts");
                      for (var i = 0; i < sysFiles.length; i++) {
                          var name = sysFiles[i];
                          if (!ts.fileExtensionIs(name, ".d.ts") || !ts.contains(sysFiles, name.substr(0, name.length - 5) + ".ts")) {
                              files.push(name);
                          }
                      }
                  }
                  return files;
              }
          }
          ts.parseConfigFile = parseConfigFile;
      })(ts || (ts = {}));
      /// <reference path="program.ts"/>
      /// <reference path="commandLineParser.ts"/>
      var ts;
      (function (ts) {
          function validateLocaleAndSetLanguage(locale, errors) {
              var matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(locale.toLowerCase());
              if (!matchResult) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, 'en', 'ja-jp'));
                  return false;
              }
              var language = matchResult[1];
              var territory = matchResult[3];
              if (!trySetLanguageAndTerritory(language, territory, errors) &&
                  !trySetLanguageAndTerritory(language, undefined, errors)) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_locale_0, locale));
                  return false;
              }
              return true;
          }
          function trySetLanguageAndTerritory(language, territory, errors) {
              var compilerFilePath = ts.normalizePath(ts.sys.getExecutingFilePath());
              var containingDirectoryPath = ts.getDirectoryPath(compilerFilePath);
              var filePath = ts.combinePaths(containingDirectoryPath, language);
              if (territory) {
                  filePath = filePath + "-" + territory;
              }
              filePath = ts.sys.resolvePath(ts.combinePaths(filePath, "diagnosticMessages.generated.json"));
              if (!ts.sys.fileExists(filePath)) {
                  return false;
              }
              try {
                  var fileContents = ts.sys.readFile(filePath);
              }
              catch (e) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unable_to_open_file_0, filePath));
                  return false;
              }
              try {
                  ts.localizedDiagnosticMessages = JSON.parse(fileContents);
              }
              catch (e) {
                  errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Corrupted_locale_file_0, filePath));
                  return false;
              }
              return true;
          }
          function countLines(program) {
              var count = 0;
              ts.forEach(program.getSourceFiles(), function (file) {
                  count += ts.getLineStarts(file).length;
              });
              return count;
          }
          function getDiagnosticText(message) {
              var args = [];
              for (var _i = 1; _i < arguments.length; _i++) {
                  args[_i - 1] = arguments[_i];
              }
              var diagnostic = ts.createCompilerDiagnostic.apply(undefined, arguments);
              return diagnostic.messageText;
          }
          function reportDiagnostic(diagnostic) {
              var output = "";
              if (diagnostic.file) {
                  var loc = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
                  output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): ";
              }
              var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase();
              output += category + " TS" + diagnostic.code + ": " + ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) + ts.sys.newLine;
              ts.sys.write(output);
          }
          function reportDiagnostics(diagnostics) {
              for (var i = 0; i < diagnostics.length; i++) {
                  reportDiagnostic(diagnostics[i]);
              }
          }
          function padLeft(s, length) {
              while (s.length < length) {
                  s = " " + s;
              }
              return s;
          }
          function padRight(s, length) {
              while (s.length < length) {
                  s = s + " ";
              }
              return s;
          }
          function reportStatisticalValue(name, value) {
              ts.sys.write(padRight(name + ":", 12) + padLeft(value.toString(), 10) + ts.sys.newLine);
          }
          function reportCountStatistic(name, count) {
              reportStatisticalValue(name, "" + count);
          }
          function reportTimeStatistic(name, time) {
              reportStatisticalValue(name, (time / 1000).toFixed(2) + "s");
          }
          function isJSONSupported() {
              return typeof JSON === "object" && typeof JSON.parse === "function";
          }
          function executeCommandLine(args) {
              var commandLine = ts.parseCommandLine(args);
              var configFileName;
              var configFileWatcher;
              var cachedProgram;
              var rootFileNames;
              var compilerOptions;
              var compilerHost;
              var hostGetSourceFile;
              var timerHandle;
              if (commandLine.options.locale) {
                  if (!isJSONSupported()) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
                  validateLocaleAndSetLanguage(commandLine.options.locale, commandLine.errors);
              }
              if (commandLine.errors.length > 0) {
                  reportDiagnostics(commandLine.errors);
                  return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
              }
              if (commandLine.options.version) {
                  reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Version_0, ts.version));
                  return ts.sys.exit(ts.ExitStatus.Success);
              }
              if (commandLine.options.help) {
                  printVersion();
                  printHelp();
                  return ts.sys.exit(ts.ExitStatus.Success);
              }
              if (commandLine.options.project) {
                  if (!isJSONSupported()) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--project"));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
                  configFileName = ts.normalizePath(ts.combinePaths(commandLine.options.project, "tsconfig.json"));
                  if (commandLine.fileNames.length !== 0) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
              }
              else if (commandLine.fileNames.length === 0 && isJSONSupported()) {
                  var searchPath = ts.normalizePath(ts.sys.getCurrentDirectory());
                  configFileName = ts.findConfigFile(searchPath);
              }
              if (commandLine.fileNames.length === 0 && !configFileName) {
                  printVersion();
                  printHelp();
                  return ts.sys.exit(ts.ExitStatus.Success);
              }
              if (commandLine.options.watch) {
                  if (!ts.sys.watchFile) {
                      reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"));
                      return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                  }
                  if (configFileName) {
                      configFileWatcher = ts.sys.watchFile(configFileName, configFileChanged);
                  }
              }
              performCompilation();
              function performCompilation() {
                  if (!cachedProgram) {
                      if (configFileName) {
                          var result = ts.readConfigFile(configFileName);
                          if (result.error) {
                              reportDiagnostic(result.error);
                              return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                          }
                          var configObject = result.config;
                          var configParseResult = ts.parseConfigFile(configObject, ts.sys, ts.getDirectoryPath(configFileName));
                          if (configParseResult.errors.length > 0) {
                              reportDiagnostics(configParseResult.errors);
                              return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
                          }
                          rootFileNames = configParseResult.fileNames;
                          compilerOptions = ts.extend(commandLine.options, configParseResult.options);
                      }
                      else {
                          rootFileNames = commandLine.fileNames;
                          compilerOptions = commandLine.options;
                      }
                      compilerHost = ts.createCompilerHost(compilerOptions);
                      hostGetSourceFile = compilerHost.getSourceFile;
                      compilerHost.getSourceFile = getSourceFile;
                  }
                  var compileResult = compile(rootFileNames, compilerOptions, compilerHost);
                  if (!compilerOptions.watch) {
                      return ts.sys.exit(compileResult.exitStatus);
                  }
                  setCachedProgram(compileResult.program);
                  reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Compilation_complete_Watching_for_file_changes));
              }
              function getSourceFile(fileName, languageVersion, onError) {
                  if (cachedProgram) {
                      var sourceFile = cachedProgram.getSourceFile(fileName);
                      if (sourceFile && sourceFile.fileWatcher) {
                          return sourceFile;
                      }
                  }
                  var sourceFile = hostGetSourceFile(fileName, languageVersion, onError);
                  if (sourceFile && compilerOptions.watch) {
                      sourceFile.fileWatcher = ts.sys.watchFile(sourceFile.fileName, function () { return sourceFileChanged(sourceFile); });
                  }
                  return sourceFile;
              }
              function setCachedProgram(program) {
                  if (cachedProgram) {
                      var newSourceFiles = program ? program.getSourceFiles() : undefined;
                      ts.forEach(cachedProgram.getSourceFiles(), function (sourceFile) {
                          if (!(newSourceFiles && ts.contains(newSourceFiles, sourceFile))) {
                              if (sourceFile.fileWatcher) {
                                  sourceFile.fileWatcher.close();
                                  sourceFile.fileWatcher = undefined;
                              }
                          }
                      });
                  }
                  cachedProgram = program;
              }
              function sourceFileChanged(sourceFile) {
                  sourceFile.fileWatcher.close();
                  sourceFile.fileWatcher = undefined;
                  startTimer();
              }
              function configFileChanged() {
                  setCachedProgram(undefined);
                  startTimer();
              }
              function startTimer() {
                  if (timerHandle) {
                      clearTimeout(timerHandle);
                  }
                  timerHandle = setTimeout(recompile, 250);
              }
              function recompile() {
                  timerHandle = undefined;
                  reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.File_change_detected_Starting_incremental_compilation));
                  performCompilation();
              }
          }
          ts.executeCommandLine = executeCommandLine;
          function compile(fileNames, compilerOptions, compilerHost) {
              ts.ioReadTime = 0;
              ts.ioWriteTime = 0;
              ts.programTime = 0;
              ts.bindTime = 0;
              ts.checkTime = 0;
              ts.emitTime = 0;
              var program = ts.createProgram(fileNames, compilerOptions, compilerHost);
              var exitStatus = compileProgram();
              if (compilerOptions.listFiles) {
                  ts.forEach(program.getSourceFiles(), function (file) {
                      ts.sys.write(file.fileName + ts.sys.newLine);
                  });
              }
              if (compilerOptions.diagnostics) {
                  var memoryUsed = ts.sys.getMemoryUsage ? ts.sys.getMemoryUsage() : -1;
                  reportCountStatistic("Files", program.getSourceFiles().length);
                  reportCountStatistic("Lines", countLines(program));
                  reportCountStatistic("Nodes", program.getNodeCount());
                  reportCountStatistic("Identifiers", program.getIdentifierCount());
                  reportCountStatistic("Symbols", program.getSymbolCount());
                  reportCountStatistic("Types", program.getTypeCount());
                  if (memoryUsed >= 0) {
                      reportStatisticalValue("Memory used", Math.round(memoryUsed / 1000) + "K");
                  }
                  reportTimeStatistic("I/O read", ts.ioReadTime);
                  reportTimeStatistic("I/O write", ts.ioWriteTime);
                  reportTimeStatistic("Parse time", ts.programTime);
                  reportTimeStatistic("Bind time", ts.bindTime);
                  reportTimeStatistic("Check time", ts.checkTime);
                  reportTimeStatistic("Emit time", ts.emitTime);
                  reportTimeStatistic("Total time", ts.programTime + ts.bindTime + ts.checkTime + ts.emitTime);
              }
              return { program: program, exitStatus: exitStatus };
              function compileProgram() {
                  var diagnostics = program.getSyntacticDiagnostics();
                  reportDiagnostics(diagnostics);
                  if (diagnostics.length === 0) {
                      var diagnostics = program.getGlobalDiagnostics();
                      reportDiagnostics(diagnostics);
                      if (diagnostics.length === 0) {
                          var diagnostics = program.getSemanticDiagnostics();
                          reportDiagnostics(diagnostics);
                      }
                  }
                  if (compilerOptions.noEmit) {
                      return diagnostics.length
                          ? ts.ExitStatus.DiagnosticsPresent_OutputsSkipped
                          : ts.ExitStatus.Success;
                  }
                  var emitOutput = program.emit();
                  reportDiagnostics(emitOutput.diagnostics);
                  if (emitOutput.emitSkipped) {
                      return ts.ExitStatus.DiagnosticsPresent_OutputsSkipped;
                  }
                  if (diagnostics.length > 0 || emitOutput.diagnostics.length > 0) {
                      return ts.ExitStatus.DiagnosticsPresent_OutputsGenerated;
                  }
                  return ts.ExitStatus.Success;
              }
          }
          function printVersion() {
              ts.sys.write(getDiagnosticText(ts.Diagnostics.Version_0, ts.version) + ts.sys.newLine);
          }
          function printHelp() {
              var output = "";
              var syntaxLength = getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, "").length;
              var examplesLength = getDiagnosticText(ts.Diagnostics.Examples_Colon_0, "").length;
              var marginLength = Math.max(syntaxLength, examplesLength);
              var syntax = makePadding(marginLength - syntaxLength);
              syntax += "tsc [" + getDiagnosticText(ts.Diagnostics.options) + "] [" + getDiagnosticText(ts.Diagnostics.file) + " ...]";
              output += getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, syntax);
              output += ts.sys.newLine + ts.sys.newLine;
              var padding = makePadding(marginLength);
              output += getDiagnosticText(ts.Diagnostics.Examples_Colon_0, makePadding(marginLength - examplesLength) + "tsc hello.ts") + ts.sys.newLine;
              output += padding + "tsc --out file.js file.ts" + ts.sys.newLine;
              output += padding + "tsc @args.txt" + ts.sys.newLine;
              output += ts.sys.newLine;
              output += getDiagnosticText(ts.Diagnostics.Options_Colon) + ts.sys.newLine;
              var optsList = ts.filter(ts.optionDeclarations.slice(), function (v) { return !v.experimental; });
              optsList.sort(function (a, b) { return ts.compareValues(a.name.toLowerCase(), b.name.toLowerCase()); });
              var marginLength = 0;
              var usageColumn = [];
              var descriptionColumn = [];
              for (var i = 0; i < optsList.length; i++) {
                  var option = optsList[i];
                  if (!option.description) {
                      continue;
                  }
                  var usageText = " ";
                  if (option.shortName) {
                      usageText += "-" + option.shortName;
                      usageText += getParamType(option);
                      usageText += ", ";
                  }
                  usageText += "--" + option.name;
                  usageText += getParamType(option);
                  usageColumn.push(usageText);
                  descriptionColumn.push(getDiagnosticText(option.description));
                  marginLength = Math.max(usageText.length, marginLength);
              }
              var usageText = " @<" + getDiagnosticText(ts.Diagnostics.file) + ">";
              usageColumn.push(usageText);
              descriptionColumn.push(getDiagnosticText(ts.Diagnostics.Insert_command_line_options_and_files_from_a_file));
              marginLength = Math.max(usageText.length, marginLength);
              for (var i = 0; i < usageColumn.length; i++) {
                  var usage = usageColumn[i];
                  var description = descriptionColumn[i];
                  output += usage + makePadding(marginLength - usage.length + 2) + description + ts.sys.newLine;
              }
              ts.sys.write(output);
              return;
              function getParamType(option) {
                  if (option.paramType !== undefined) {
                      return " " + getDiagnosticText(option.paramType);
                  }
                  return "";
              }
              function makePadding(paddingLength) {
                  return Array(paddingLength + 1).join(" ");
              }
          }
      })(ts || (ts = {}));
      ts.executeCommandLine(ts.sys.args);
      
  • typings
    • webSQL.d.ts
      declare function openDatabase(
        name: string,
        version: any,
        displayName: string,
        size: number,
        upgrade?: DatabaseCallback): Database;
      
      interface DatabaseCallback {
        (database: Database): void;
      }
      
      interface Database {
        transaction(
          callback: (transaction: SQLTransaction) => void,
          errorCallback?: (error: SQLError) => void,
          successCallback?: () => void);
      
        readTransaction(
          callback: (transaction: SQLTransaction) => void,
          errorCallback?: (error: SQLError) => void,
          successCallback?: () => void);
      
        version: string;
      
        changeVersion(
          oldVersion: string,
          newVersion: string,
          callback: (transaction: SQLTransaction) => void,
          errorCallback?: (error: SQLError) => void,
          successCallback?: () => void);
      }
      
      interface SQLTransaction {
        executeSql(
          sqlStatement: string,
          arguments?: any[],
          callback?: (transaction: SQLTransaction, result: SQLResultSet) => void,
          errorCallback?: (transaction: SQLTransaction, error: SQLError) => void): void;
      }
      
      interface SQLError {
        /**
         * UNKNOWN_ERR = 0;
         * DATABASE_ERR = 1;
         * VERSION_ERR = 2;
         * TOO_LARGE_ERR = 3;
         * QUOTA_ERR = 4;
         * SYNTAX_ERR = 5;
         * CONSTRAINT_ERR = 6;
        * TIMEOUT_ERR = 7;
         */
        code: number;
        message: string
      }
      
      interface SQLResultSet {
        insertId: number;
        rowsAffected: number;
        rows: SQLResultSetRowList;
      }
      
      interface SQLResultSetRowList {
        length: number;
        item(index: number): any;
      }
  • dummy.ts
    class Apple {
      constructor(public color = 'red') {
      }
    }
    
    console.log('Look, I am a happy TypeScript file running away.');
    console.log('I\'ve got class ' + Apple);
    var apple = new Apple();
    console.log('I\'ve created an instance of it: ', apple);
    apple.color = 'green';
    console.log('I\'ve changed its colour: ', apple);
  • index.html
    <!doctype html>
    <title>mini shell </title>
    
    <script data-legit=mi>
      // ONERROR
      <%=embedFile('boot/onerror.js')%>
    //# sourceURL=boot/onerror.js
    </script>
    
    
    <script data-legit=mi>
      // EARLYBOOT
      earlyBoot(window);
    
      	<%=typescriptBuild('boot/*')%>
    
        <%=embedFile('boot/bootUI.js')%>
    //# sourceURL=/boot/base.js
    </script>
    
    
    <script data-legit=mi>
    
      // LOADER
    <%=typescriptBuild('load/*', 'persistence/*', 'boot/base.d.ts', 'typings/*')%>
    //# sourceURL=/load/shellLoader.ts.js
    </script>
    
    <!-- total 12Mb, saved <%=(function() {
    
    // TOTAL SUMMARY
    var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
    
    var saveDate = new Date();
    var dtText =
      saveDate.getDate() + ' ' +
      monthsPrettyCase[saveDate.getMonth()] + ' ' +
      saveDate.getFullYear() + ' ' +
      num2(saveDate.getHours()) + ':' +
      num2(saveDate.getMinutes()) + ':' +
      num2(saveDate.getSeconds()) + '.' +
      (+saveDate).toString().slice(-3);
    
    var saveDateLocalStr = saveDate.toString();
    var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
    if (gmtMatch)
    	dtText += ' ' + gmtMatch[1];
    
    return dtText;
    
    function num2(n) { return n <= 9 ? '0' + n : '' + n; }
    
    })()
    %> -->
    
    <!-- /shell/showCommander.js
    <%=typescriptBuild('shell/*', 'noapi/*', 'isolation/*',   'boot/base.d.ts', 'persistence/API.d.ts', 'typings/*')%>
    -->
    
    <!-- /shell/buildMessage.js
    
    var shell;
    if (!shell) shell = {};
    shell.buildMessage = 'Built at <%=(function() {
    
    var monthsPrettyCase = ('Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec').split('|');
    
    var saveDate = new Date();
    var dtText =
      saveDate.getDate() + ' ' +
      monthsPrettyCase[saveDate.getMonth()] + ' ' +
      saveDate.getFullYear() + ' ' +
      num2(saveDate.getHours()) + ':' +
      num2(saveDate.getMinutes()) + ':' +
      num2(saveDate.getSeconds()) + '.' +
      (+saveDate).toString().slice(-3);
    
    var saveDateLocalStr = saveDate.toString();
    var gmtMatch = (/(GMT\s*[\-\+]\d+(\:\d+)?)/i).exec(saveDateLocalStr);
    if (gmtMatch)
    	dtText += ' ' + gmtMatch[1];
    
    return dtText;
    
    function num2(n) { return n <= 9 ? '0' + n : '' + n; }
    
    })()
    %>';
    
    shell.buildTime = <%=+new Date()%>;
    -->
    
    <!-- /shell/!onerror.js
    <%=embedFile('/boot/onerror.js')%>
    -->
    
    <!-- /empty/
    -->
    
    
    <!-- /LF-file.txt
    123
    456-->
    
    <!-- /CRLF-file [CRLF]
    123
    456-->
    
    <!-- /CR-file [CR]
    123
    456-->
    
    <!-- /exportsome.js [CR]
    module.exports = 55-->
    
    <!-- /exports_fs.js [CR]
    module.exports = require('fs')-->
    
    <!-- /exports_process.js [CR]
    module.exports = process-->
    
    <!-- /eval-file.txt [eval]
     "random char: " + String.fromCharCode(Math.random()*16000)+"\n"+
     "date: "+new Date()+"\n"+
     "location: "+location -->
    
    <!-- /json-file.txt [json]
    "new ok \u2222 and what\r\n or \u0001?\n\n\n"-->
    
    <%=(function() {
    return ''; // SWITCHED OFF LARGE DIRECTORY GENERATION (it makes it easier to debug DOM stuff)
    
    var dump = [];
    for (var i = 0; i < 2000; i++) {
    	dump.push('<'+'!'+'-- /large-directory/'+(500+i)+'.txt');
      dump.push('OK --'+'>');
    }
    return dump.join('\n');
       })()%>
    
    
    
    
    
    
    
    
    <!-- /shell/style.css
    <%=(function() {
    	var drive = portabled.build.processTemplate.mainDrive;
    	var files = drive.files();
    	var styleText = [];
      for (var i = 0; i < files.length; i++) {
        if (/^\/shell\/[\s\S]*\.css$/.test(files[i]))
          styleText.push(drive.read(files[i]));
      }
    	return styleText.join('\n');
    
    })()%>
    -->
    
    <%=(function() {
    
    	var drive = portabled.build.processTemplate.mainDrive;
    	var files = drive.files();
    	var fileDump = [];
      for (var i = 0; i < files.length; i++) {
        var content = drive.read(files[i]);
        var decoratedContent = content.
    			replace(/\-\-(\**)\>/g, '--*$1>').
    			replace(/\<(\**)\!/g, '<*$1!');
    	  fileDump.push('<'+'!'+'-- '+'/src'+files[i]);
        fileDump.push(decoratedContent);
        fileDump.push('--'+'!'+'>');
      }
    	return fileDump.join('\n');
    
    })()%>
    
    
  • readme.md
    #New mini portable shell development
    
    Used these open-source libraries:
    
     * [feross/buffer] (https://github.com/feross/buffer) - MIT
     * [beatgammit/base64-js] (https://github.com/beatgammit/base64-js) - MIT
     * [feross/ieee754] (https://github.com/feross/ieee754) - MIT
     * [retrofox/is-array] (https://github.com/retrofox/is-array) - MIT
    
    ## Boot process
    
    The boot process begins with first bytes of the page received, during the loading of the content,
    then would continue for a little after the page is loaded.
    
    The main post-content-load is completing the data fetch from the local storage. It may well finish earlier,
    but may take some time.
    
    During the boot process, and at the end of it the code is supposed to show sensible UI
    and implement neat handover animations (unless the whole boot finishes very fast).
    
    ### Early boot
    
    The mission of this stage is to create the temporary boot UI (very quickly!) and hand over to the shell loader.
    The boot UI is something like a splash screen, boot animation, washed-out live-like image or whatever.
    
     * Error handler is installed at the first opportunity
     * Base.js library with primitives for basic DOM manipulation is loaded
     * BootUI iframe is created
     * BootUI function is invoked to draw the boot animation
    
    ### Shell loader
    
    Shell loader's task is to initialise the persistence (virtual filesystem backed by DOM and local storage).
    
    During that persistence loading the shell loader passes progress events to the boot UI. Upon completion
    it starts the actual shell and finally animates from boot UI to the shell.
    
     * Persistence loading is started
     * Persistence keeps polling the DOM state, fishing for pieces of 'virtual filesystem'
     * Progress is supposed to be reported to the BootUI
     * Persistence also need to load the locally-stored state, reconciling it with the DOM (by timestamps)
     * Eventualy persistence report completion
     * Shell iframe is created with opacity=0
     * Shell start code is loaded (normally from the filesystem) and kicked off
     * Animating BootUI.opacity -> 0; Shell.opacity->1
    
     ### Shell
    
    When shell begins to load, the persistence is fully functional, so it's up to the shell what to do with it.
    
    The interactive node-like shell emulates node.js to a great extent: by laying node.js API on top of the persistence and various browser features.
    
    At the moment the shell also has file-manager-like panels, so virtual filesystem can be navigated
    and necessary tasks (copying/editing/moving of files or directories) performed interactively.
    
    Other shells may host more specialised apps. These are planned examples:
    
     * PC.js virtual machine hosting early PC images (DOS, early Windows, OS/2 and such)
     * Markdown viewer/editor
     * SVG editor
     * Slide editor
     * Spreadsheet editor
    
    ## Involved libaries and sub-modules
    
    First of all, the sequence above explicitly mentiones three mini-libraries:
    
     * Base.js
     * BootUI
     * Persistence
    
    Those indeed can be considered separately, with a degree of isolation from the rest of the boot process.
    
    ### Base.js
    
    A very tight set of functions for DOM manipulation. It is used by both booting stage, as well as actually employed by the current shell.
    
    These are broad features of the mini-library:
    
     * Setting/getting text of a DOM element (older IE handling, special workarounds for some elements)
     * Creating elements and setting properties/CSS attributes in JSON-like syntax
     * Subscribing to events
     * Creating IFRAME and retrieving its key objects (inner window, inner document)
    
    ### BootUI
    
    The boot-time UI is largely free in what it renders. It is hosted in a separate IFRAME
    with limited communication to the rest of the code.
    
    It is expected that various shells provide each their fine-tuned boot UI 'library'.
    
    A good option would be to render the state of the application as the user left,
    with a tasteful overlay reflecting the boot progress.
    
    ### Persistence
    
    The task of emulating an embedded virtual filesystem of files/directories is implemented in the persistence mini-library.
    
    The persistence API is described in terms of a Drive object (with read/write methods) and its construction stages.
    
    Several sources of storage are implemented towards the same API:
    
     * DOM
     * IndexedDB
     * WebSQL
     * LocalStorage
    
    DOM storage is expected to exist at a very minimum (we are running in the context of a page already!),
    then one of the local storage options is added upon a brief detection process.
    
    From the external caller the persistence mini-library expects a single call to *mountDrive* function,
    passing in a few inputs and a callback.

New mini portable shell development

Used these open-source libraries:

Boot process

The boot process begins with first bytes of the page received, during the loading of the content, then would continue for a little after the page is loaded.

The main post-content-load is completing the data fetch from the local storage. It may well finish earlier, but may take some time.

During the boot process, and at the end of it the code is supposed to show sensible UI and implement neat handover animations (unless the whole boot finishes very fast).

Early boot

The mission of this stage is to create the temporary boot UI (very quickly!) and hand over to the shell loader. The boot UI is something like a splash screen, boot animation, washed-out live-like image or whatever.

  • Error handler is installed at the first opportunity
  • Base.js library with primitives for basic DOM manipulation is loaded
  • BootUI iframe is created
  • BootUI function is invoked to draw the boot animation

Shell loader

Shell loader's task is to initialise the persistence (virtual filesystem backed by DOM and local storage).

During that persistence loading the shell loader passes progress events to the boot UI. Upon completion it starts the actual shell and finally animates from boot UI to the shell.

  • Persistence loading is started
  • Persistence keeps polling the DOM state, fishing for pieces of 'virtual filesystem'
  • Progress is supposed to be reported to the BootUI
  • Persistence also need to load the locally-stored state, reconciling it with the DOM (by timestamps)
  • Eventualy persistence report completion
  • Shell iframe is created with opacity=0
  • Shell start code is loaded (normally from the filesystem) and kicked off
  • Animating BootUI.opacity -> 0; Shell.opacity->1

    Shell

When shell begins to load, the persistence is fully functional, so it's up to the shell what to do with it.

The interactive node-like shell emulates node.js to a great extent: by laying node.js API on top of the persistence and various browser features.

At the moment the shell also has file-manager-like panels, so virtual filesystem can be navigated and necessary tasks (copying/editing/moving of files or directories) performed interactively.

Other shells may host more specialised apps. These are planned examples:

  • PC.js virtual machine hosting early PC images (DOS, early Windows, OS/2 and such)
  • Markdown viewer/editor
  • SVG editor
  • Slide editor
  • Spreadsheet editor

Involved libaries and sub-modules

First of all, the sequence above explicitly mentiones three mini-libraries:

  • Base.js
  • BootUI
  • Persistence

Those indeed can be considered separately, with a degree of isolation from the rest of the boot process.

Base.js

A very tight set of functions for DOM manipulation. It is used by both booting stage, as well as actually employed by the current shell.

These are broad features of the mini-library:

  • Setting/getting text of a DOM element (older IE handling, special workarounds for some elements)
  • Creating elements and setting properties/CSS attributes in JSON-like syntax
  • Subscribing to events
  • Creating IFRAME and retrieving its key objects (inner window, inner document)

BootUI

The boot-time UI is largely free in what it renders. It is hosted in a separate IFRAME with limited communication to the rest of the code.

It is expected that various shells provide each their fine-tuned boot UI 'library'.

A good option would be to render the state of the application as the user left, with a tasteful overlay reflecting the boot progress.

Persistence

The task of emulating an embedded virtual filesystem of files/directories is implemented in the persistence mini-library.

The persistence API is described in terms of a Drive object (with read/write methods) and its construction stages.

Several sources of storage are implemented towards the same API:

  • DOM
  • IndexedDB
  • WebSQL
  • LocalStorage

DOM storage is expected to exist at a very minimum (we are running in the context of a page already!), then one of the local storage options is added upon a brief detection process.

From the external caller the persistence mini-library expects a single call to mountDrive function, passing in a few inputs and a callback.

portabled v0.6.1a by Oleg Mihailik
built Sat Jun 13 2015 11:52:49 GMT+0100 (GMT Summer Time)

Used Open Source libraries:
TypeScript (Microsoft, with Apache 2.0 license)
CodeMirror (Marijn Haverbeke, with MIT license)
Knockout.js (Ryan Niemeyer, with MIT license)
Zip.js (Gildas Lormeau, with BSD license)
Marked (Christopher Jeffrey, with MIT license)
ES5-shims (with MIT license)
GitHub API wrapper (Michael Aufreiter with BSD2 license)
JS Murmur hasher (Gary Court with MIT license)
google-diff-match-patch (Google with Apache 2.0 license)
UglifyJS2 (Mihai Bazon with BSD license)
UglifyCSS (Franck Marcia with MIT license)
JSON3 (Kit Cambridge with MIT license)
- main contributors mentioned where applicable.
read(file: string): string
/svge-embed/build/buildEmbedFiles.ts